From 0dc0c5f26c8323a64f94d527edcc01e0c18c5077 Mon Sep 17 00:00:00 2001 From: FreeMiNT Project Date: Fri, 22 Nov 2024 19:51:26 +0000 Subject: [PATCH] Publish f5a5c6dae6756678f7f7b52007c44ff943a0cff0 --- archives/tos_hyp_de.zip | Bin 0 -> 2190697 bytes archives/tos_hyp_en.zip | Bin 0 -> 2126389 bytes de/AESVARS.html | 61 + de/ARHEADER.html | 53 + de/About_the_BIOS.html | 1351 +++ de/About_the_VDI.html | 75 + de/BCB.html | 41 + de/BSIM-BIOS-Extension.html | 635 ++ de/CENTScreen_XBIOS_extension.html | 1585 +++ de/CPXINFO.html | 48 + de/FlpDrvInfo.html | 47 + de/GEM_MUPB.html | 44 + de/GRECT.html | 42 + de/HDFUNCS.html | 52 + de/MD.html | 76 + de/MRETS.html | 42 + de/MacVersion.html | 49 + de/OHEADER.html | 47 + de/OSHEADER.html | 130 + de/PCI_BIOS.html | 4184 ++++++++ de/PrintDesc.html | 45 + de/RGB_LIST.html | 41 + de/Screen_functions.html | 3216 ++++++ de/THREADINFO.html | 59 + de/VDI_fundamentals.html | 4432 ++++++++ de/VT_52_terminal.html | 1233 +++ de/XCPB.html | 94 + de/aes_about.html | 148 + de/aes_functions.html | 1740 ++++ de/aes_fundamentals.html | 1704 ++++ de/aes_main.html | 63 + de/aes_structures.html | 2329 +++++ de/appendix.html | 164 + de/appl.html | 5253 ++++++++++ de/ascii.html | 514 + de/bilder/gif/alert_bomb.gif | Bin 0 -> 309 bytes de/bilder/gif/alert_system.gif | Bin 0 -> 268 bytes de/bilder/gif/aligment.gif | Bin 0 -> 3043 bytes de/bilder/gif/atos.gif | Bin 0 -> 5140 bytes de/bilder/gif/bubblegem.gif | Bin 0 -> 381 bytes de/bilder/gif/cl_width.gif | Bin 0 -> 3771 bytes de/bilder/gif/cl_width_en.gif | Bin 0 -> 3847 bytes de/bilder/gif/disk.gif | Bin 0 -> 1015 bytes de/bilder/gif/drv_u.gif | Bin 0 -> 3552 bytes de/bilder/gif/drv_udev.gif | Bin 0 -> 2903 bytes de/bilder/gif/drvuproc.gif | Bin 0 -> 4395 bytes de/bilder/gif/email_gs.gif | Bin 0 -> 1294 bytes de/bilder/gif/email_mb.gif | Bin 0 -> 2291 bytes de/bilder/gif/extent.gif | Bin 0 -> 2988 bytes de/bilder/gif/extent_en.gif | Bin 0 -> 3014 bytes de/bilder/gif/f_select.gif | Bin 0 -> 5552 bytes de/bilder/gif/f_select_en.gif | Bin 0 -> 6007 bytes de/bilder/gif/fenster.gif | Bin 0 -> 14749 bytes de/bilder/gif/fenster_en.gif | Bin 0 -> 12551 bytes de/bilder/gif/filesys.gif | Bin 0 -> 6578 bytes de/bilder/gif/fontinfo.gif | Bin 0 -> 3090 bytes de/bilder/gif/fontinfo_en.gif | Bin 0 -> 3155 bytes de/bilder/gif/frage.gif | Bin 0 -> 1001 bytes de/bilder/gif/gdos_ahn.gif | Bin 0 -> 2930 bytes de/bilder/gif/img2034.gif | Bin 0 -> 10196 bytes de/bilder/gif/img2034_en.gif | Bin 0 -> 10806 bytes de/bilder/gif/img2035.gif | Bin 0 -> 7298 bytes de/bilder/gif/img2035_en.gif | Bin 0 -> 8152 bytes de/bilder/gif/img2036.gif | Bin 0 -> 6948 bytes de/bilder/gif/img2037.gif | Bin 0 -> 4464 bytes de/bilder/gif/img2037_en.gif | Bin 0 -> 4623 bytes de/bilder/gif/img2038.gif | Bin 0 -> 8382 bytes de/bilder/gif/img2039.gif | Bin 0 -> 3928 bytes de/bilder/gif/img2040.gif | Bin 0 -> 2940 bytes de/bilder/gif/img2040_en.gif | Bin 0 -> 2940 bytes de/bilder/gif/img2041.gif | Bin 0 -> 5497 bytes de/bilder/gif/img2041_en.gif | Bin 0 -> 5385 bytes de/bilder/gif/img2042.gif | Bin 0 -> 8437 bytes de/bilder/gif/img2042_en.gif | Bin 0 -> 8726 bytes de/bilder/gif/img2043.gif | Bin 0 -> 3381 bytes de/bilder/gif/img2043_en.gif | Bin 0 -> 3560 bytes de/bilder/gif/img2044.gif | Bin 0 -> 3051 bytes de/bilder/gif/img2044_en.gif | Bin 0 -> 3260 bytes de/bilder/gif/img2045.gif | Bin 0 -> 2833 bytes de/bilder/gif/img2045_en.gif | Bin 0 -> 2891 bytes de/bilder/gif/info.gif | Bin 0 -> 991 bytes de/bilder/gif/koords.gif | Bin 0 -> 3837 bytes de/bilder/gif/koords_en.gif | Bin 0 -> 3847 bytes de/bilder/gif/linien.gif | Bin 0 -> 959 bytes de/bilder/gif/marker.gif | Bin 0 -> 989 bytes de/bilder/gif/meta_3.gif | Bin 0 -> 6635 bytes de/bilder/gif/metafile.gif | Bin 0 -> 4780 bytes de/bilder/gif/muster.gif | Bin 0 -> 12239 bytes de/bilder/gif/olga_1.gif | Bin 0 -> 1883 bytes de/bilder/gif/olga_2.gif | Bin 0 -> 4114 bytes de/bilder/gif/olga_3.gif | Bin 0 -> 4124 bytes de/bilder/gif/olga_4.gif | Bin 0 -> 2714 bytes de/bilder/gif/pipeline.gif | Bin 0 -> 28644 bytes de/bilder/gif/raster.gif | Bin 0 -> 7270 bytes de/bilder/gif/raster_en.gif | Bin 0 -> 7378 bytes de/bilder/gif/rufen.gif | Bin 0 -> 988 bytes de/bilder/gif/sspicon_.gif | Bin 0 -> 2723 bytes de/bilder/gif/stop.gif | Bin 0 -> 1025 bytes de/bilder/gif/taskman.gif | Bin 0 -> 13646 bytes de/bilder/gif/taskman_en.gif | Bin 0 -> 13004 bytes de/bilder/gif/tpa.gif | Bin 0 -> 3072 bytes de/bilder/gif/tpa_en.gif | Bin 0 -> 3131 bytes de/bilder/gif/wr_modi.gif | Bin 0 -> 5558 bytes de/bilder/gif/wr_modi_en.gif | Bin 0 -> 5687 bytes de/bilder/gif/xcontrol.gif | Bin 0 -> 3557 bytes de/bilder/gif/xcontrol_en.gif | Bin 0 -> 3947 bytes de/bios_channels.html | 103 + de/bios_cookiejar.html | 10621 +++++++++++++++++++ de/bios_errors.html | 197 + de/bios_functions.html | 300 + de/bios_main.html | 48 + de/bios_resvector.html | 80 + de/bios_structures.html | 226 + de/bios_sysvars.html | 1225 +++ de/c_task_royal.html | 66 + de/contact.html | 40 + de/crazydots.html | 871 ++ de/ct60.html | 598 ++ de/develop.html | 239 + de/edit.html | 4484 ++++++++ de/emulators.html | 41 + de/emulators_magicmac.html | 1346 +++ de/emulators_magicpc.html | 1579 +++ de/emulators_others.html | 251 + de/emulators_stem.html | 60 + de/emulators_tos2win.html | 189 + de/evnt.html | 7422 ++++++++++++++ de/fnts.html | 2738 +++++ de/form.html | 3681 +++++++ de/fsel.html | 924 ++ de/fslx.html | 1600 +++ de/gem_about.html | 222 + de/gemdos_about.html | 96 + de/gemdos_argv.html | 170 + de/gemdos_chrinout.html | 1452 +++ de/gemdos_datetime.html | 1018 ++ de/gemdos_directory.html | 2941 ++++++ de/gemdos_errors.html | 948 ++ de/gemdos_file.html | 5685 +++++++++++ de/gemdos_filesys.html | 78 + de/gemdos_functions.html | 1949 ++++ de/gemdos_main.html | 60 + de/gemdos_memory.html | 909 ++ de/gemdos_mintnet.html | 868 ++ de/gemdos_network.html | 570 ++ de/gemdos_pipes.html | 48 + de/gemdos_process.html | 5457 ++++++++++ de/gemdos_programs.html | 265 + de/gemdos_signals.html | 534 + de/gemdos_structures.html | 1022 ++ de/gemdos_system.html | 2785 +++++ de/gemdos_tpa.html | 93 + de/gemdos_trap.html | 62 + de/geneva_function.html | 1542 +++ de/gpl.html | 384 + de/graf.html | 3680 +++++++ de/guidelines.html | 38 + de/guidelines_rules.html | 91 + de/guidelines_styles.html | 819 ++ de/history.html | 4604 +++++++++ de/index.html | 79 + de/index.ulh | 38 + de/index.uth | 6118 +++++++++++ de/indexudo.html | 5568 ++++++++++ de/introduction.html | 40 + de/lbox.html | 4268 ++++++++ de/linea_about.html | 55 + de/linea_bitblt.html | 194 + de/linea_copyraster.html | 170 + de/linea_drawsprite.html | 207 + de/linea_escape.html | 130 + de/linea_fillpoly.html | 246 + de/linea_fillrect.html | 240 + de/linea_getpixel.html | 95 + de/linea_hidemouse.html | 88 + de/linea_hline.html | 206 + de/linea_init.html | 105 + de/linea_line.html | 206 + de/linea_main.html | 56 + de/linea_putpixel.html | 95 + de/linea_seedfill.html | 217 + de/linea_showmouse.html | 96 + de/linea_structures.html | 62 + de/linea_textblt.html | 367 + de/linea_transform.html | 164 + de/linea_undrawsprite.html | 94 + de/linea_vars.html | 88 + de/literature.html | 169 + de/magic.html | 99 + de/magic_3dlook.html | 77 + de/magic_MCB.html | 75 + de/magic_aesvars.html | 66 + de/magic_autoexec.html | 52 + de/magic_bios.html | 369 + de/magic_cookie.html | 61 + de/magic_dfs.html | 1647 +++ de/magic_dma.html | 138 + de/magic_driveu.html | 358 + de/magic_editable.html | 64 + de/magic_errors.html | 130 + de/magic_function.html | 950 ++ de/magic_iconify.html | 57 + de/magic_magxinf.html | 585 ++ de/magic_programs.html | 363 + de/magic_scroll.html | 216 + de/magic_semaphore.html | 70 + de/magic_sharelib.html | 702 ++ de/magic_shutdown.html | 374 + de/magic_smartredraw.html | 114 + de/magic_taskmanager.html | 96 + de/magic_test.html | 65 + de/magic_threads.html | 323 + de/magic_vfat.html | 133 + de/magic_xfs.html | 4227 ++++++++ de/matrix_XBIOS_extension.html | 91 + de/menu.html | 2168 ++++ de/n_aes.html | 39 + de/naes_cnf.html | 85 + de/naes_cookie.html | 140 + de/naes_formerror.html | 167 + de/nap_bionet100.html | 127 + de/objc.html | 3133 ++++++ de/old_preface.html | 195 + de/pdlg.html | 3014 ++++++ de/pmmu.html | 75 + de/pmmu_ClearPageMode.html | 100 + de/pmmu_GetHdv_inuse.html | 80 + de/pmmu_GetPageSize.html | 75 + de/pmmu_PMMUversion.html | 74 + de/pmmu_SetPageMode.html | 144 + de/pmmu_pmem_size.html | 76 + de/pmmu_vmem_size.html | 73 + de/powerdos.html | 301 + de/proc.html | 1392 +++ de/prop.html | 971 ++ de/proto_av.html | 2795 +++++ de/proto_bubblegem.html | 425 + de/proto_dd.html | 305 + de/proto_dhst.html | 100 + de/proto_font.html | 193 + de/proto_gdps.html | 692 ++ de/proto_ltl.html | 477 + de/proto_olga.html | 2127 ++++ de/proto_seproto.html | 1630 +++ de/proto_ssp.html | 2284 +++++ de/proto_view.html | 594 ++ de/proto_vscreen.html | 101 + de/proto_xacc.html | 1439 +++ de/proto_xfsl.html | 2758 +++++ de/protocols.html | 51 + de/references.html | 72 + de/rsrc.html | 1127 ++ de/scancode.html | 851 ++ de/scrp.html | 660 ++ de/shel.html | 2600 +++++ de/tc_vdi.html | 2492 +++++ de/tekbios.html | 53 + de/the_system_vectors.html | 679 ++ de/tos_about.html | 63 + de/tos_main.html | 38 + de/tos_vers.html | 470 + de/typedefs.html | 208 + de/udo_hm.gif | Bin 0 -> 928 bytes de/udo_lf.gif | Bin 0 -> 930 bytes de/udo_nohm.gif | Bin 0 -> 937 bytes de/udo_nolf.gif | Bin 0 -> 931 bytes de/udo_norg.gif | Bin 0 -> 930 bytes de/udo_noup.gif | Bin 0 -> 928 bytes de/udo_rg.gif | Bin 0 -> 932 bytes de/udo_up.gif | Bin 0 -> 927 bytes de/vdi_attribute.html | 10144 ++++++++++++++++++ de/vdi_bindings.html | 235 + de/vdi_colortable.html | 3212 ++++++ de/vdi_control.html | 5953 +++++++++++ de/vdi_escape.html | 14629 ++++++++++++++++++++++++++ de/vdi_functions.html | 1726 ++++ de/vdi_input.html | 3542 +++++++ de/vdi_inquire.html | 10344 +++++++++++++++++++ de/vdi_main.html | 50 + de/vdi_output.html | 4561 +++++++++ de/vdi_raster.html | 3884 +++++++ de/vdi_structures.html | 497 + de/vidix_xbios_extension.html | 1389 +++ de/wdlg.html | 2566 +++++ de/wind.html | 6658 ++++++++++++ de/xaaes.html | 38 + de/xaaes_functions.html | 665 ++ de/xaaes_toolbar.html | 43 + de/xbios_about.html | 90 + de/xbios_datetime.html | 659 ++ de/xbios_dhs.html | 568 ++ de/xbios_drive.html | 2530 +++++ de/xbios_dsp56001.html | 2632 +++++ de/xbios_errors.html | 36 + de/xbios_functions.html | 1966 ++++ de/xbios_interface.html | 1674 +++ de/xbios_interrupt.html | 329 + de/xbios_keyboard.html | 318 + de/xbios_main.html | 60 + de/xbios_metados.html | 41 + de/xbios_overscan.html | 723 ++ de/xbios_printer.html | 314 + de/xbios_sound.html | 9717 ++++++++++++++++++ de/xbios_special.html | 1192 +++ de/xbios_structures.html | 1039 ++ de/xbios_trap.html | 63 + de/xbra_main.html | 74 + de/xcontrol.html | 2404 +++++ de/xcontrol_main.html | 37 + de/xgrf.html | 694 ++ de/xhdi.html | 93 + de/xhdi_arbitration.html | 74 + de/xhdi_cookie.html | 76 + de/xhdi_functions.html | 1663 +++ de/xhdi_partition_types.html | 143 + de/xhdi_terminology.html | 105 + de/xshl.html | 285 + en/AESVARS.html | 61 + en/ARHEADER.html | 52 + en/About_the_BIOS.html | 1335 +++ en/About_the_VDI.html | 77 + en/BCB.html | 41 + en/BSIM-BIOS-Extension.html | 626 ++ en/CENTScreen_XBIOS_extension.html | 1598 +++ en/CPXINFO.html | 48 + en/FlpDrvInfo.html | 47 + en/GEM_MUPB.html | 44 + en/GRECT.html | 42 + en/HDFUNCS.html | 52 + en/MD.html | 77 + en/MRETS.html | 42 + en/MacVersion.html | 49 + en/OHEADER.html | 47 + en/OSHEADER.html | 127 + en/PCI_BIOS.html | 4160 ++++++++ en/PrintDesc.html | 45 + en/RGB_LIST.html | 41 + en/Screen_functions.html | 3235 ++++++ en/THREADINFO.html | 59 + en/VDI_fundamentals.html | 4363 ++++++++ en/VT_52_terminal.html | 1226 +++ en/XCPB.html | 92 + en/aes_about.html | 146 + en/aes_functions.html | 1740 ++++ en/aes_fundamentals.html | 1739 ++++ en/aes_main.html | 63 + en/aes_structures.html | 2321 +++++ en/appendix.html | 160 + en/appl.html | 5269 ++++++++++ en/ascii.html | 515 + en/bilder/gif/alert_bomb.gif | Bin 0 -> 309 bytes en/bilder/gif/alert_system.gif | Bin 0 -> 268 bytes en/bilder/gif/aligment.gif | Bin 0 -> 3043 bytes en/bilder/gif/atos.gif | Bin 0 -> 5140 bytes en/bilder/gif/bubblegem.gif | Bin 0 -> 381 bytes en/bilder/gif/cl_width.gif | Bin 0 -> 3771 bytes en/bilder/gif/cl_width_en.gif | Bin 0 -> 3847 bytes en/bilder/gif/disk.gif | Bin 0 -> 1015 bytes en/bilder/gif/drv_u.gif | Bin 0 -> 3552 bytes en/bilder/gif/drv_udev.gif | Bin 0 -> 2903 bytes en/bilder/gif/drvuproc.gif | Bin 0 -> 4395 bytes en/bilder/gif/email_gs.gif | Bin 0 -> 1294 bytes en/bilder/gif/email_mb.gif | Bin 0 -> 2291 bytes en/bilder/gif/extent.gif | Bin 0 -> 2988 bytes en/bilder/gif/extent_en.gif | Bin 0 -> 3014 bytes en/bilder/gif/f_select.gif | Bin 0 -> 5552 bytes en/bilder/gif/f_select_en.gif | Bin 0 -> 6007 bytes en/bilder/gif/fenster.gif | Bin 0 -> 14749 bytes en/bilder/gif/fenster_en.gif | Bin 0 -> 12551 bytes en/bilder/gif/filesys.gif | Bin 0 -> 6578 bytes en/bilder/gif/fontinfo.gif | Bin 0 -> 3090 bytes en/bilder/gif/fontinfo_en.gif | Bin 0 -> 3155 bytes en/bilder/gif/frage.gif | Bin 0 -> 1001 bytes en/bilder/gif/gdos_ahn.gif | Bin 0 -> 2930 bytes en/bilder/gif/img2034.gif | Bin 0 -> 10196 bytes en/bilder/gif/img2034_en.gif | Bin 0 -> 10806 bytes en/bilder/gif/img2035.gif | Bin 0 -> 7298 bytes en/bilder/gif/img2035_en.gif | Bin 0 -> 8152 bytes en/bilder/gif/img2036.gif | Bin 0 -> 6948 bytes en/bilder/gif/img2037.gif | Bin 0 -> 4464 bytes en/bilder/gif/img2037_en.gif | Bin 0 -> 4623 bytes en/bilder/gif/img2038.gif | Bin 0 -> 8382 bytes en/bilder/gif/img2039.gif | Bin 0 -> 3928 bytes en/bilder/gif/img2040.gif | Bin 0 -> 2940 bytes en/bilder/gif/img2040_en.gif | Bin 0 -> 2940 bytes en/bilder/gif/img2041.gif | Bin 0 -> 5497 bytes en/bilder/gif/img2041_en.gif | Bin 0 -> 5385 bytes en/bilder/gif/img2042.gif | Bin 0 -> 8437 bytes en/bilder/gif/img2042_en.gif | Bin 0 -> 8726 bytes en/bilder/gif/img2043.gif | Bin 0 -> 3381 bytes en/bilder/gif/img2043_en.gif | Bin 0 -> 3560 bytes en/bilder/gif/img2044.gif | Bin 0 -> 3051 bytes en/bilder/gif/img2044_en.gif | Bin 0 -> 3260 bytes en/bilder/gif/img2045.gif | Bin 0 -> 2833 bytes en/bilder/gif/img2045_en.gif | Bin 0 -> 2891 bytes en/bilder/gif/info.gif | Bin 0 -> 991 bytes en/bilder/gif/koords.gif | Bin 0 -> 3837 bytes en/bilder/gif/koords_en.gif | Bin 0 -> 3847 bytes en/bilder/gif/linien.gif | Bin 0 -> 959 bytes en/bilder/gif/marker.gif | Bin 0 -> 989 bytes en/bilder/gif/meta_3.gif | Bin 0 -> 6635 bytes en/bilder/gif/metafile.gif | Bin 0 -> 4780 bytes en/bilder/gif/muster.gif | Bin 0 -> 12239 bytes en/bilder/gif/olga_1.gif | Bin 0 -> 1883 bytes en/bilder/gif/olga_2.gif | Bin 0 -> 4114 bytes en/bilder/gif/olga_3.gif | Bin 0 -> 4124 bytes en/bilder/gif/olga_4.gif | Bin 0 -> 2714 bytes en/bilder/gif/pipeline.gif | Bin 0 -> 28644 bytes en/bilder/gif/raster.gif | Bin 0 -> 7270 bytes en/bilder/gif/raster_en.gif | Bin 0 -> 7378 bytes en/bilder/gif/rufen.gif | Bin 0 -> 988 bytes en/bilder/gif/sspicon_.gif | Bin 0 -> 2723 bytes en/bilder/gif/stop.gif | Bin 0 -> 1025 bytes en/bilder/gif/taskman.gif | Bin 0 -> 13646 bytes en/bilder/gif/taskman_en.gif | Bin 0 -> 13004 bytes en/bilder/gif/tpa.gif | Bin 0 -> 3072 bytes en/bilder/gif/tpa_en.gif | Bin 0 -> 3131 bytes en/bilder/gif/wr_modi.gif | Bin 0 -> 5558 bytes en/bilder/gif/wr_modi_en.gif | Bin 0 -> 5687 bytes en/bilder/gif/xcontrol.gif | Bin 0 -> 3557 bytes en/bilder/gif/xcontrol_en.gif | Bin 0 -> 3947 bytes en/bios_channels.html | 103 + en/bios_cookiejar.html | 10619 +++++++++++++++++++ en/bios_errors.html | 159 + en/bios_functions.html | 300 + en/bios_main.html | 48 + en/bios_resvector.html | 78 + en/bios_structures.html | 222 + en/bios_sysvars.html | 1220 +++ en/c_task_royal.html | 66 + en/contact.html | 39 + en/crazydots.html | 857 ++ en/ct60.html | 595 ++ en/develop.html | 239 + en/edit.html | 4479 ++++++++ en/emulators.html | 41 + en/emulators_magicmac.html | 1310 +++ en/emulators_magicpc.html | 1565 +++ en/emulators_others.html | 251 + en/emulators_stem.html | 60 + en/emulators_tos2win.html | 187 + en/evnt.html | 7448 ++++++++++++++ en/fnts.html | 2740 +++++ en/form.html | 3723 +++++++ en/fsel.html | 940 ++ en/fslx.html | 1591 +++ en/gem_about.html | 218 + en/gemdos_about.html | 96 + en/gemdos_argv.html | 158 + en/gemdos_chrinout.html | 1455 +++ en/gemdos_datetime.html | 1009 ++ en/gemdos_directory.html | 2884 ++++++ en/gemdos_errors.html | 947 ++ en/gemdos_file.html | 5641 +++++++++++ en/gemdos_filesys.html | 73 + en/gemdos_functions.html | 1949 ++++ en/gemdos_main.html | 60 + en/gemdos_memory.html | 895 ++ en/gemdos_mintnet.html | 868 ++ en/gemdos_network.html | 570 ++ en/gemdos_pipes.html | 47 + en/gemdos_process.html | 5422 ++++++++++ en/gemdos_programs.html | 254 + en/gemdos_signals.html | 508 + en/gemdos_structures.html | 1007 ++ en/gemdos_system.html | 2775 +++++ en/gemdos_tpa.html | 92 + en/gemdos_trap.html | 62 + en/geneva_function.html | 1536 +++ en/gpl.html | 384 + en/graf.html | 3695 +++++++ en/guidelines.html | 38 + en/guidelines_rules.html | 88 + en/guidelines_styles.html | 829 ++ en/history.html | 4604 +++++++++ en/index.html | 79 + en/index.ulh | 38 + en/index.uth | 6150 +++++++++++ en/indexudo.html | 5593 ++++++++++ en/introduction.html | 40 + en/lbox.html | 4264 ++++++++ en/linea_about.html | 57 + en/linea_bitblt.html | 193 + en/linea_copyraster.html | 169 + en/linea_drawsprite.html | 207 + en/linea_escape.html | 130 + en/linea_fillpoly.html | 244 + en/linea_fillrect.html | 238 + en/linea_getpixel.html | 95 + en/linea_hidemouse.html | 88 + en/linea_hline.html | 205 + en/linea_init.html | 105 + en/linea_line.html | 204 + en/linea_main.html | 56 + en/linea_putpixel.html | 95 + en/linea_seedfill.html | 217 + en/linea_showmouse.html | 96 + en/linea_structures.html | 62 + en/linea_textblt.html | 361 + en/linea_transform.html | 165 + en/linea_undrawsprite.html | 94 + en/linea_vars.html | 89 + en/literature.html | 228 + en/magic.html | 100 + en/magic_3dlook.html | 76 + en/magic_MCB.html | 76 + en/magic_aesvars.html | 65 + en/magic_autoexec.html | 52 + en/magic_bios.html | 368 + en/magic_cookie.html | 61 + en/magic_dfs.html | 1634 +++ en/magic_dma.html | 139 + en/magic_driveu.html | 347 + en/magic_editable.html | 64 + en/magic_errors.html | 133 + en/magic_function.html | 949 ++ en/magic_iconify.html | 55 + en/magic_magxinf.html | 574 ++ en/magic_programs.html | 367 + en/magic_scroll.html | 214 + en/magic_semaphore.html | 70 + en/magic_sharelib.html | 697 ++ en/magic_shutdown.html | 366 + en/magic_smartredraw.html | 108 + en/magic_taskmanager.html | 97 + en/magic_test.html | 63 + en/magic_threads.html | 316 + en/magic_vfat.html | 150 + en/magic_xfs.html | 4199 ++++++++ en/matrix_XBIOS_extension.html | 91 + en/menu.html | 2176 ++++ en/n_aes.html | 39 + en/naes_cnf.html | 80 + en/naes_cookie.html | 139 + en/naes_formerror.html | 165 + en/nap_bionet100.html | 127 + en/objc.html | 3131 ++++++ en/old_preface.html | 194 + en/pdlg.html | 3020 ++++++ en/pmmu.html | 80 + en/pmmu_ClearPageMode.html | 99 + en/pmmu_GetHdv_inuse.html | 79 + en/pmmu_GetPageSize.html | 74 + en/pmmu_PMMUversion.html | 74 + en/pmmu_SetPageMode.html | 142 + en/pmmu_pmem_size.html | 76 + en/pmmu_vmem_size.html | 72 + en/powerdos.html | 334 + en/proc.html | 1392 +++ en/prop.html | 971 ++ en/proto_av.html | 2780 +++++ en/proto_bubblegem.html | 422 + en/proto_dd.html | 294 + en/proto_dhst.html | 97 + en/proto_font.html | 181 + en/proto_gdps.html | 709 ++ en/proto_ltl.html | 465 + en/proto_olga.html | 4392 ++++++++ en/proto_seproto.html | 1617 +++ en/proto_ssp.html | 2284 +++++ en/proto_view.html | 594 ++ en/proto_vscreen.html | 105 + en/proto_xacc.html | 1422 +++ en/proto_xfsl.html | 2647 +++++ en/protocols.html | 51 + en/references.html | 72 + en/rsrc.html | 1131 +++ en/scancode.html | 859 ++ en/scrp.html | 655 ++ en/shel.html | 2578 +++++ en/tc_vdi.html | 2491 +++++ en/tekbios.html | 53 + en/the_system_vectors.html | 670 ++ en/tos_about.html | 63 + en/tos_main.html | 38 + en/tos_vers.html | 470 + en/typedefs.html | 208 + en/udo_hm.gif | Bin 0 -> 928 bytes en/udo_lf.gif | Bin 0 -> 930 bytes en/udo_nohm.gif | Bin 0 -> 937 bytes en/udo_nolf.gif | Bin 0 -> 931 bytes en/udo_norg.gif | Bin 0 -> 930 bytes en/udo_noup.gif | Bin 0 -> 928 bytes en/udo_rg.gif | Bin 0 -> 932 bytes en/udo_up.gif | Bin 0 -> 927 bytes en/vdi_attribute.html | 10164 +++++++++++++++++++ en/vdi_bindings.html | 231 + en/vdi_colortable.html | 3194 ++++++ en/vdi_control.html | 5940 +++++++++++ en/vdi_escape.html | 14660 +++++++++++++++++++++++++++ en/vdi_functions.html | 1726 ++++ en/vdi_input.html | 3551 +++++++ en/vdi_inquire.html | 10470 +++++++++++++++++++ en/vdi_main.html | 50 + en/vdi_output.html | 4604 +++++++++ en/vdi_raster.html | 3896 +++++++ en/vdi_structures.html | 493 + en/vidix_xbios_extension.html | 1389 +++ en/wdlg.html | 2547 +++++ en/wind.html | 6682 ++++++++++++ en/xaaes.html | 38 + en/xaaes_functions.html | 665 ++ en/xaaes_toolbar.html | 43 + en/xbios_about.html | 89 + en/xbios_datetime.html | 659 ++ en/xbios_dhs.html | 568 ++ en/xbios_drive.html | 2501 +++++ en/xbios_dsp56001.html | 2629 +++++ en/xbios_errors.html | 40 + en/xbios_functions.html | 1966 ++++ en/xbios_interface.html | 1663 +++ en/xbios_interrupt.html | 329 + en/xbios_keyboard.html | 314 + en/xbios_main.html | 60 + en/xbios_metados.html | 40 + en/xbios_overscan.html | 723 ++ en/xbios_printer.html | 311 + en/xbios_sound.html | 9729 ++++++++++++++++++ en/xbios_special.html | 1196 +++ en/xbios_structures.html | 974 ++ en/xbios_trap.html | 62 + en/xbra_main.html | 71 + en/xcontrol.html | 2398 +++++ en/xcontrol_main.html | 37 + en/xgrf.html | 693 ++ en/xhdi.html | 90 + en/xhdi_arbitration.html | 74 + en/xhdi_cookie.html | 74 + en/xhdi_functions.html | 1634 +++ en/xhdi_partition_types.html | 141 + en/xhdi_terminology.html | 105 + en/xshl.html | 291 + index.html | 44 + index.ulh | 29 + tos_hyp.gif | Bin 0 -> 2826 bytes 635 files changed, 552592 insertions(+) create mode 100644 archives/tos_hyp_de.zip create mode 100644 archives/tos_hyp_en.zip create mode 100644 de/AESVARS.html create mode 100644 de/ARHEADER.html create mode 100644 de/About_the_BIOS.html create mode 100644 de/About_the_VDI.html create mode 100644 de/BCB.html create mode 100644 de/BSIM-BIOS-Extension.html create mode 100644 de/CENTScreen_XBIOS_extension.html create mode 100644 de/CPXINFO.html create mode 100644 de/FlpDrvInfo.html create mode 100644 de/GEM_MUPB.html create mode 100644 de/GRECT.html create mode 100644 de/HDFUNCS.html create mode 100644 de/MD.html create mode 100644 de/MRETS.html create mode 100644 de/MacVersion.html create mode 100644 de/OHEADER.html create mode 100644 de/OSHEADER.html create mode 100644 de/PCI_BIOS.html create mode 100644 de/PrintDesc.html create mode 100644 de/RGB_LIST.html create mode 100644 de/Screen_functions.html create mode 100644 de/THREADINFO.html create mode 100644 de/VDI_fundamentals.html create mode 100644 de/VT_52_terminal.html create mode 100644 de/XCPB.html create mode 100644 de/aes_about.html create mode 100644 de/aes_functions.html create mode 100644 de/aes_fundamentals.html create mode 100644 de/aes_main.html create mode 100644 de/aes_structures.html create mode 100644 de/appendix.html create mode 100644 de/appl.html create mode 100644 de/ascii.html create mode 100644 de/bilder/gif/alert_bomb.gif create mode 100644 de/bilder/gif/alert_system.gif create mode 100644 de/bilder/gif/aligment.gif create mode 100644 de/bilder/gif/atos.gif create mode 100644 de/bilder/gif/bubblegem.gif create mode 100644 de/bilder/gif/cl_width.gif create mode 100644 de/bilder/gif/cl_width_en.gif create mode 100644 de/bilder/gif/disk.gif create mode 100644 de/bilder/gif/drv_u.gif create mode 100644 de/bilder/gif/drv_udev.gif create mode 100644 de/bilder/gif/drvuproc.gif create mode 100644 de/bilder/gif/email_gs.gif create mode 100644 de/bilder/gif/email_mb.gif create mode 100644 de/bilder/gif/extent.gif create mode 100644 de/bilder/gif/extent_en.gif create mode 100644 de/bilder/gif/f_select.gif create mode 100644 de/bilder/gif/f_select_en.gif create mode 100644 de/bilder/gif/fenster.gif create mode 100644 de/bilder/gif/fenster_en.gif create mode 100644 de/bilder/gif/filesys.gif create mode 100644 de/bilder/gif/fontinfo.gif create mode 100644 de/bilder/gif/fontinfo_en.gif create mode 100644 de/bilder/gif/frage.gif create mode 100644 de/bilder/gif/gdos_ahn.gif create mode 100644 de/bilder/gif/img2034.gif create mode 100644 de/bilder/gif/img2034_en.gif create mode 100644 de/bilder/gif/img2035.gif create mode 100644 de/bilder/gif/img2035_en.gif create mode 100644 de/bilder/gif/img2036.gif create mode 100644 de/bilder/gif/img2037.gif create mode 100644 de/bilder/gif/img2037_en.gif create mode 100644 de/bilder/gif/img2038.gif create mode 100644 de/bilder/gif/img2039.gif create mode 100644 de/bilder/gif/img2040.gif create mode 100644 de/bilder/gif/img2040_en.gif create mode 100644 de/bilder/gif/img2041.gif create mode 100644 de/bilder/gif/img2041_en.gif create mode 100644 de/bilder/gif/img2042.gif create mode 100644 de/bilder/gif/img2042_en.gif create mode 100644 de/bilder/gif/img2043.gif create mode 100644 de/bilder/gif/img2043_en.gif create mode 100644 de/bilder/gif/img2044.gif create mode 100644 de/bilder/gif/img2044_en.gif create mode 100644 de/bilder/gif/img2045.gif create mode 100644 de/bilder/gif/img2045_en.gif create mode 100644 de/bilder/gif/info.gif create mode 100644 de/bilder/gif/koords.gif create mode 100644 de/bilder/gif/koords_en.gif create mode 100644 de/bilder/gif/linien.gif create mode 100644 de/bilder/gif/marker.gif create mode 100644 de/bilder/gif/meta_3.gif create mode 100644 de/bilder/gif/metafile.gif create mode 100644 de/bilder/gif/muster.gif create mode 100644 de/bilder/gif/olga_1.gif create mode 100644 de/bilder/gif/olga_2.gif create mode 100644 de/bilder/gif/olga_3.gif create mode 100644 de/bilder/gif/olga_4.gif create mode 100644 de/bilder/gif/pipeline.gif create mode 100644 de/bilder/gif/raster.gif create mode 100644 de/bilder/gif/raster_en.gif create mode 100644 de/bilder/gif/rufen.gif create mode 100644 de/bilder/gif/sspicon_.gif create mode 100644 de/bilder/gif/stop.gif create mode 100644 de/bilder/gif/taskman.gif create mode 100644 de/bilder/gif/taskman_en.gif create mode 100644 de/bilder/gif/tpa.gif create mode 100644 de/bilder/gif/tpa_en.gif create mode 100644 de/bilder/gif/wr_modi.gif create mode 100644 de/bilder/gif/wr_modi_en.gif create mode 100644 de/bilder/gif/xcontrol.gif create mode 100644 de/bilder/gif/xcontrol_en.gif create mode 100644 de/bios_channels.html create mode 100644 de/bios_cookiejar.html create mode 100644 de/bios_errors.html create mode 100644 de/bios_functions.html create mode 100644 de/bios_main.html create mode 100644 de/bios_resvector.html create mode 100644 de/bios_structures.html create mode 100644 de/bios_sysvars.html create mode 100644 de/c_task_royal.html create mode 100644 de/contact.html create mode 100644 de/crazydots.html create mode 100644 de/ct60.html create mode 100644 de/develop.html create mode 100644 de/edit.html create mode 100644 de/emulators.html create mode 100644 de/emulators_magicmac.html create mode 100644 de/emulators_magicpc.html create mode 100644 de/emulators_others.html create mode 100644 de/emulators_stem.html create mode 100644 de/emulators_tos2win.html create mode 100644 de/evnt.html create mode 100644 de/fnts.html create mode 100644 de/form.html create mode 100644 de/fsel.html create mode 100644 de/fslx.html create mode 100644 de/gem_about.html create mode 100644 de/gemdos_about.html create mode 100644 de/gemdos_argv.html create mode 100644 de/gemdos_chrinout.html create mode 100644 de/gemdos_datetime.html create mode 100644 de/gemdos_directory.html create mode 100644 de/gemdos_errors.html create mode 100644 de/gemdos_file.html create mode 100644 de/gemdos_filesys.html create mode 100644 de/gemdos_functions.html create mode 100644 de/gemdos_main.html create mode 100644 de/gemdos_memory.html create mode 100644 de/gemdos_mintnet.html create mode 100644 de/gemdos_network.html create mode 100644 de/gemdos_pipes.html create mode 100644 de/gemdos_process.html create mode 100644 de/gemdos_programs.html create mode 100644 de/gemdos_signals.html create mode 100644 de/gemdos_structures.html create mode 100644 de/gemdos_system.html create mode 100644 de/gemdos_tpa.html create mode 100644 de/gemdos_trap.html create mode 100644 de/geneva_function.html create mode 100644 de/gpl.html create mode 100644 de/graf.html create mode 100644 de/guidelines.html create mode 100644 de/guidelines_rules.html create mode 100644 de/guidelines_styles.html create mode 100644 de/history.html create mode 100644 de/index.html create mode 100644 de/index.ulh create mode 100644 de/index.uth create mode 100644 de/indexudo.html create mode 100644 de/introduction.html create mode 100644 de/lbox.html create mode 100644 de/linea_about.html create mode 100644 de/linea_bitblt.html create mode 100644 de/linea_copyraster.html create mode 100644 de/linea_drawsprite.html create mode 100644 de/linea_escape.html create mode 100644 de/linea_fillpoly.html create mode 100644 de/linea_fillrect.html create mode 100644 de/linea_getpixel.html create mode 100644 de/linea_hidemouse.html create mode 100644 de/linea_hline.html create mode 100644 de/linea_init.html create mode 100644 de/linea_line.html create mode 100644 de/linea_main.html create mode 100644 de/linea_putpixel.html create mode 100644 de/linea_seedfill.html create mode 100644 de/linea_showmouse.html create mode 100644 de/linea_structures.html create mode 100644 de/linea_textblt.html create mode 100644 de/linea_transform.html create mode 100644 de/linea_undrawsprite.html create mode 100644 de/linea_vars.html create mode 100644 de/literature.html create mode 100644 de/magic.html create mode 100644 de/magic_3dlook.html create mode 100644 de/magic_MCB.html create mode 100644 de/magic_aesvars.html create mode 100644 de/magic_autoexec.html create mode 100644 de/magic_bios.html create mode 100644 de/magic_cookie.html create mode 100644 de/magic_dfs.html create mode 100644 de/magic_dma.html create mode 100644 de/magic_driveu.html create mode 100644 de/magic_editable.html create mode 100644 de/magic_errors.html create mode 100644 de/magic_function.html create mode 100644 de/magic_iconify.html create mode 100644 de/magic_magxinf.html create mode 100644 de/magic_programs.html create mode 100644 de/magic_scroll.html create mode 100644 de/magic_semaphore.html create mode 100644 de/magic_sharelib.html create mode 100644 de/magic_shutdown.html create mode 100644 de/magic_smartredraw.html create mode 100644 de/magic_taskmanager.html create mode 100644 de/magic_test.html create mode 100644 de/magic_threads.html create mode 100644 de/magic_vfat.html create mode 100644 de/magic_xfs.html create mode 100644 de/matrix_XBIOS_extension.html create mode 100644 de/menu.html create mode 100644 de/n_aes.html create mode 100644 de/naes_cnf.html create mode 100644 de/naes_cookie.html create mode 100644 de/naes_formerror.html create mode 100644 de/nap_bionet100.html create mode 100644 de/objc.html create mode 100644 de/old_preface.html create mode 100644 de/pdlg.html create mode 100644 de/pmmu.html create mode 100644 de/pmmu_ClearPageMode.html create mode 100644 de/pmmu_GetHdv_inuse.html create mode 100644 de/pmmu_GetPageSize.html create mode 100644 de/pmmu_PMMUversion.html create mode 100644 de/pmmu_SetPageMode.html create mode 100644 de/pmmu_pmem_size.html create mode 100644 de/pmmu_vmem_size.html create mode 100644 de/powerdos.html create mode 100644 de/proc.html create mode 100644 de/prop.html create mode 100644 de/proto_av.html create mode 100644 de/proto_bubblegem.html create mode 100644 de/proto_dd.html create mode 100644 de/proto_dhst.html create mode 100644 de/proto_font.html create mode 100644 de/proto_gdps.html create mode 100644 de/proto_ltl.html create mode 100644 de/proto_olga.html create mode 100644 de/proto_seproto.html create mode 100644 de/proto_ssp.html create mode 100644 de/proto_view.html create mode 100644 de/proto_vscreen.html create mode 100644 de/proto_xacc.html create mode 100644 de/proto_xfsl.html create mode 100644 de/protocols.html create mode 100644 de/references.html create mode 100644 de/rsrc.html create mode 100644 de/scancode.html create mode 100644 de/scrp.html create mode 100644 de/shel.html create mode 100644 de/tc_vdi.html create mode 100644 de/tekbios.html create mode 100644 de/the_system_vectors.html create mode 100644 de/tos_about.html create mode 100644 de/tos_main.html create mode 100644 de/tos_vers.html create mode 100644 de/typedefs.html create mode 100644 de/udo_hm.gif create mode 100644 de/udo_lf.gif create mode 100644 de/udo_nohm.gif create mode 100644 de/udo_nolf.gif create mode 100644 de/udo_norg.gif create mode 100644 de/udo_noup.gif create mode 100644 de/udo_rg.gif create mode 100644 de/udo_up.gif create mode 100644 de/vdi_attribute.html create mode 100644 de/vdi_bindings.html create mode 100644 de/vdi_colortable.html create mode 100644 de/vdi_control.html create mode 100644 de/vdi_escape.html create mode 100644 de/vdi_functions.html create mode 100644 de/vdi_input.html create mode 100644 de/vdi_inquire.html create mode 100644 de/vdi_main.html create mode 100644 de/vdi_output.html create mode 100644 de/vdi_raster.html create mode 100644 de/vdi_structures.html create mode 100644 de/vidix_xbios_extension.html create mode 100644 de/wdlg.html create mode 100644 de/wind.html create mode 100644 de/xaaes.html create mode 100644 de/xaaes_functions.html create mode 100644 de/xaaes_toolbar.html create mode 100644 de/xbios_about.html create mode 100644 de/xbios_datetime.html create mode 100644 de/xbios_dhs.html create mode 100644 de/xbios_drive.html create mode 100644 de/xbios_dsp56001.html create mode 100644 de/xbios_errors.html create mode 100644 de/xbios_functions.html create mode 100644 de/xbios_interface.html create mode 100644 de/xbios_interrupt.html create mode 100644 de/xbios_keyboard.html create mode 100644 de/xbios_main.html create mode 100644 de/xbios_metados.html create mode 100644 de/xbios_overscan.html create mode 100644 de/xbios_printer.html create mode 100644 de/xbios_sound.html create mode 100644 de/xbios_special.html create mode 100644 de/xbios_structures.html create mode 100644 de/xbios_trap.html create mode 100644 de/xbra_main.html create mode 100644 de/xcontrol.html create mode 100644 de/xcontrol_main.html create mode 100644 de/xgrf.html create mode 100644 de/xhdi.html create mode 100644 de/xhdi_arbitration.html create mode 100644 de/xhdi_cookie.html create mode 100644 de/xhdi_functions.html create mode 100644 de/xhdi_partition_types.html create mode 100644 de/xhdi_terminology.html create mode 100644 de/xshl.html create mode 100644 en/AESVARS.html create mode 100644 en/ARHEADER.html create mode 100644 en/About_the_BIOS.html create mode 100644 en/About_the_VDI.html create mode 100644 en/BCB.html create mode 100644 en/BSIM-BIOS-Extension.html create mode 100644 en/CENTScreen_XBIOS_extension.html create mode 100644 en/CPXINFO.html create mode 100644 en/FlpDrvInfo.html create mode 100644 en/GEM_MUPB.html create mode 100644 en/GRECT.html create mode 100644 en/HDFUNCS.html create mode 100644 en/MD.html create mode 100644 en/MRETS.html create mode 100644 en/MacVersion.html create mode 100644 en/OHEADER.html create mode 100644 en/OSHEADER.html create mode 100644 en/PCI_BIOS.html create mode 100644 en/PrintDesc.html create mode 100644 en/RGB_LIST.html create mode 100644 en/Screen_functions.html create mode 100644 en/THREADINFO.html create mode 100644 en/VDI_fundamentals.html create mode 100644 en/VT_52_terminal.html create mode 100644 en/XCPB.html create mode 100644 en/aes_about.html create mode 100644 en/aes_functions.html create mode 100644 en/aes_fundamentals.html create mode 100644 en/aes_main.html create mode 100644 en/aes_structures.html create mode 100644 en/appendix.html create mode 100644 en/appl.html create mode 100644 en/ascii.html create mode 100644 en/bilder/gif/alert_bomb.gif create mode 100644 en/bilder/gif/alert_system.gif create mode 100644 en/bilder/gif/aligment.gif create mode 100644 en/bilder/gif/atos.gif create mode 100644 en/bilder/gif/bubblegem.gif create mode 100644 en/bilder/gif/cl_width.gif create mode 100644 en/bilder/gif/cl_width_en.gif create mode 100644 en/bilder/gif/disk.gif create mode 100644 en/bilder/gif/drv_u.gif create mode 100644 en/bilder/gif/drv_udev.gif create mode 100644 en/bilder/gif/drvuproc.gif create mode 100644 en/bilder/gif/email_gs.gif create mode 100644 en/bilder/gif/email_mb.gif create mode 100644 en/bilder/gif/extent.gif create mode 100644 en/bilder/gif/extent_en.gif create mode 100644 en/bilder/gif/f_select.gif create mode 100644 en/bilder/gif/f_select_en.gif create mode 100644 en/bilder/gif/fenster.gif create mode 100644 en/bilder/gif/fenster_en.gif create mode 100644 en/bilder/gif/filesys.gif create mode 100644 en/bilder/gif/fontinfo.gif create mode 100644 en/bilder/gif/fontinfo_en.gif create mode 100644 en/bilder/gif/frage.gif create mode 100644 en/bilder/gif/gdos_ahn.gif create mode 100644 en/bilder/gif/img2034.gif create mode 100644 en/bilder/gif/img2034_en.gif create mode 100644 en/bilder/gif/img2035.gif create mode 100644 en/bilder/gif/img2035_en.gif create mode 100644 en/bilder/gif/img2036.gif create mode 100644 en/bilder/gif/img2037.gif create mode 100644 en/bilder/gif/img2037_en.gif create mode 100644 en/bilder/gif/img2038.gif create mode 100644 en/bilder/gif/img2039.gif create mode 100644 en/bilder/gif/img2040.gif create mode 100644 en/bilder/gif/img2040_en.gif create mode 100644 en/bilder/gif/img2041.gif create mode 100644 en/bilder/gif/img2041_en.gif create mode 100644 en/bilder/gif/img2042.gif create mode 100644 en/bilder/gif/img2042_en.gif create mode 100644 en/bilder/gif/img2043.gif create mode 100644 en/bilder/gif/img2043_en.gif create mode 100644 en/bilder/gif/img2044.gif create mode 100644 en/bilder/gif/img2044_en.gif create mode 100644 en/bilder/gif/img2045.gif create mode 100644 en/bilder/gif/img2045_en.gif create mode 100644 en/bilder/gif/info.gif create mode 100644 en/bilder/gif/koords.gif create mode 100644 en/bilder/gif/koords_en.gif create mode 100644 en/bilder/gif/linien.gif create mode 100644 en/bilder/gif/marker.gif create mode 100644 en/bilder/gif/meta_3.gif create mode 100644 en/bilder/gif/metafile.gif create mode 100644 en/bilder/gif/muster.gif create mode 100644 en/bilder/gif/olga_1.gif create mode 100644 en/bilder/gif/olga_2.gif create mode 100644 en/bilder/gif/olga_3.gif create mode 100644 en/bilder/gif/olga_4.gif create mode 100644 en/bilder/gif/pipeline.gif create mode 100644 en/bilder/gif/raster.gif create mode 100644 en/bilder/gif/raster_en.gif create mode 100644 en/bilder/gif/rufen.gif create mode 100644 en/bilder/gif/sspicon_.gif create mode 100644 en/bilder/gif/stop.gif create mode 100644 en/bilder/gif/taskman.gif create mode 100644 en/bilder/gif/taskman_en.gif create mode 100644 en/bilder/gif/tpa.gif create mode 100644 en/bilder/gif/tpa_en.gif create mode 100644 en/bilder/gif/wr_modi.gif create mode 100644 en/bilder/gif/wr_modi_en.gif create mode 100644 en/bilder/gif/xcontrol.gif create mode 100644 en/bilder/gif/xcontrol_en.gif create mode 100644 en/bios_channels.html create mode 100644 en/bios_cookiejar.html create mode 100644 en/bios_errors.html create mode 100644 en/bios_functions.html create mode 100644 en/bios_main.html create mode 100644 en/bios_resvector.html create mode 100644 en/bios_structures.html create mode 100644 en/bios_sysvars.html create mode 100644 en/c_task_royal.html create mode 100644 en/contact.html create mode 100644 en/crazydots.html create mode 100644 en/ct60.html create mode 100644 en/develop.html create mode 100644 en/edit.html create mode 100644 en/emulators.html create mode 100644 en/emulators_magicmac.html create mode 100644 en/emulators_magicpc.html create mode 100644 en/emulators_others.html create mode 100644 en/emulators_stem.html create mode 100644 en/emulators_tos2win.html create mode 100644 en/evnt.html create mode 100644 en/fnts.html create mode 100644 en/form.html create mode 100644 en/fsel.html create mode 100644 en/fslx.html create mode 100644 en/gem_about.html create mode 100644 en/gemdos_about.html create mode 100644 en/gemdos_argv.html create mode 100644 en/gemdos_chrinout.html create mode 100644 en/gemdos_datetime.html create mode 100644 en/gemdos_directory.html create mode 100644 en/gemdos_errors.html create mode 100644 en/gemdos_file.html create mode 100644 en/gemdos_filesys.html create mode 100644 en/gemdos_functions.html create mode 100644 en/gemdos_main.html create mode 100644 en/gemdos_memory.html create mode 100644 en/gemdos_mintnet.html create mode 100644 en/gemdos_network.html create mode 100644 en/gemdos_pipes.html create mode 100644 en/gemdos_process.html create mode 100644 en/gemdos_programs.html create mode 100644 en/gemdos_signals.html create mode 100644 en/gemdos_structures.html create mode 100644 en/gemdos_system.html create mode 100644 en/gemdos_tpa.html create mode 100644 en/gemdos_trap.html create mode 100644 en/geneva_function.html create mode 100644 en/gpl.html create mode 100644 en/graf.html create mode 100644 en/guidelines.html create mode 100644 en/guidelines_rules.html create mode 100644 en/guidelines_styles.html create mode 100644 en/history.html create mode 100644 en/index.html create mode 100644 en/index.ulh create mode 100644 en/index.uth create mode 100644 en/indexudo.html create mode 100644 en/introduction.html create mode 100644 en/lbox.html create mode 100644 en/linea_about.html create mode 100644 en/linea_bitblt.html create mode 100644 en/linea_copyraster.html create mode 100644 en/linea_drawsprite.html create mode 100644 en/linea_escape.html create mode 100644 en/linea_fillpoly.html create mode 100644 en/linea_fillrect.html create mode 100644 en/linea_getpixel.html create mode 100644 en/linea_hidemouse.html create mode 100644 en/linea_hline.html create mode 100644 en/linea_init.html create mode 100644 en/linea_line.html create mode 100644 en/linea_main.html create mode 100644 en/linea_putpixel.html create mode 100644 en/linea_seedfill.html create mode 100644 en/linea_showmouse.html create mode 100644 en/linea_structures.html create mode 100644 en/linea_textblt.html create mode 100644 en/linea_transform.html create mode 100644 en/linea_undrawsprite.html create mode 100644 en/linea_vars.html create mode 100644 en/literature.html create mode 100644 en/magic.html create mode 100644 en/magic_3dlook.html create mode 100644 en/magic_MCB.html create mode 100644 en/magic_aesvars.html create mode 100644 en/magic_autoexec.html create mode 100644 en/magic_bios.html create mode 100644 en/magic_cookie.html create mode 100644 en/magic_dfs.html create mode 100644 en/magic_dma.html create mode 100644 en/magic_driveu.html create mode 100644 en/magic_editable.html create mode 100644 en/magic_errors.html create mode 100644 en/magic_function.html create mode 100644 en/magic_iconify.html create mode 100644 en/magic_magxinf.html create mode 100644 en/magic_programs.html create mode 100644 en/magic_scroll.html create mode 100644 en/magic_semaphore.html create mode 100644 en/magic_sharelib.html create mode 100644 en/magic_shutdown.html create mode 100644 en/magic_smartredraw.html create mode 100644 en/magic_taskmanager.html create mode 100644 en/magic_test.html create mode 100644 en/magic_threads.html create mode 100644 en/magic_vfat.html create mode 100644 en/magic_xfs.html create mode 100644 en/matrix_XBIOS_extension.html create mode 100644 en/menu.html create mode 100644 en/n_aes.html create mode 100644 en/naes_cnf.html create mode 100644 en/naes_cookie.html create mode 100644 en/naes_formerror.html create mode 100644 en/nap_bionet100.html create mode 100644 en/objc.html create mode 100644 en/old_preface.html create mode 100644 en/pdlg.html create mode 100644 en/pmmu.html create mode 100644 en/pmmu_ClearPageMode.html create mode 100644 en/pmmu_GetHdv_inuse.html create mode 100644 en/pmmu_GetPageSize.html create mode 100644 en/pmmu_PMMUversion.html create mode 100644 en/pmmu_SetPageMode.html create mode 100644 en/pmmu_pmem_size.html create mode 100644 en/pmmu_vmem_size.html create mode 100644 en/powerdos.html create mode 100644 en/proc.html create mode 100644 en/prop.html create mode 100644 en/proto_av.html create mode 100644 en/proto_bubblegem.html create mode 100644 en/proto_dd.html create mode 100644 en/proto_dhst.html create mode 100644 en/proto_font.html create mode 100644 en/proto_gdps.html create mode 100644 en/proto_ltl.html create mode 100644 en/proto_olga.html create mode 100644 en/proto_seproto.html create mode 100644 en/proto_ssp.html create mode 100644 en/proto_view.html create mode 100644 en/proto_vscreen.html create mode 100644 en/proto_xacc.html create mode 100644 en/proto_xfsl.html create mode 100644 en/protocols.html create mode 100644 en/references.html create mode 100644 en/rsrc.html create mode 100644 en/scancode.html create mode 100644 en/scrp.html create mode 100644 en/shel.html create mode 100644 en/tc_vdi.html create mode 100644 en/tekbios.html create mode 100644 en/the_system_vectors.html create mode 100644 en/tos_about.html create mode 100644 en/tos_main.html create mode 100644 en/tos_vers.html create mode 100644 en/typedefs.html create mode 100644 en/udo_hm.gif create mode 100644 en/udo_lf.gif create mode 100644 en/udo_nohm.gif create mode 100644 en/udo_nolf.gif create mode 100644 en/udo_norg.gif create mode 100644 en/udo_noup.gif create mode 100644 en/udo_rg.gif create mode 100644 en/udo_up.gif create mode 100644 en/vdi_attribute.html create mode 100644 en/vdi_bindings.html create mode 100644 en/vdi_colortable.html create mode 100644 en/vdi_control.html create mode 100644 en/vdi_escape.html create mode 100644 en/vdi_functions.html create mode 100644 en/vdi_input.html create mode 100644 en/vdi_inquire.html create mode 100644 en/vdi_main.html create mode 100644 en/vdi_output.html create mode 100644 en/vdi_raster.html create mode 100644 en/vdi_structures.html create mode 100644 en/vidix_xbios_extension.html create mode 100644 en/wdlg.html create mode 100644 en/wind.html create mode 100644 en/xaaes.html create mode 100644 en/xaaes_functions.html create mode 100644 en/xaaes_toolbar.html create mode 100644 en/xbios_about.html create mode 100644 en/xbios_datetime.html create mode 100644 en/xbios_dhs.html create mode 100644 en/xbios_drive.html create mode 100644 en/xbios_dsp56001.html create mode 100644 en/xbios_errors.html create mode 100644 en/xbios_functions.html create mode 100644 en/xbios_interface.html create mode 100644 en/xbios_interrupt.html create mode 100644 en/xbios_keyboard.html create mode 100644 en/xbios_main.html create mode 100644 en/xbios_metados.html create mode 100644 en/xbios_overscan.html create mode 100644 en/xbios_printer.html create mode 100644 en/xbios_sound.html create mode 100644 en/xbios_special.html create mode 100644 en/xbios_structures.html create mode 100644 en/xbios_trap.html create mode 100644 en/xbra_main.html create mode 100644 en/xcontrol.html create mode 100644 en/xcontrol_main.html create mode 100644 en/xgrf.html create mode 100644 en/xhdi.html create mode 100644 en/xhdi_arbitration.html create mode 100644 en/xhdi_cookie.html create mode 100644 en/xhdi_functions.html create mode 100644 en/xhdi_partition_types.html create mode 100644 en/xhdi_terminology.html create mode 100644 en/xshl.html create mode 100644 index.html create mode 100644 index.ulh create mode 100644 tos_hyp.gif diff --git a/archives/tos_hyp_de.zip b/archives/tos_hyp_de.zip new file mode 100644 index 0000000000000000000000000000000000000000..02d591d2519006151ae1e41f4c3f64a745f86f16 GIT binary patch literal 2190697 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

;BNjkfq&gc%dDmw1j$rU?q(Kivt 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

sJA&Q)+R#)u?I=kB_JsF?GL~$xm4ZF$ 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%0Dt&MTh{4Pjo;`H;rBraA>eqS;I%bK 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%0Dwr z))q>A-nv);XZ@KVuXp9$R?{d|=+Kg*?0Iqxh@BCJEl7M*6-=61PjVzDdJEzrdH z0CbjX%NpX7=d~xWGh%*CiB`suJrp6qOD^z*@WAIonPeF+ytUWCHP$L)A_GI}&}AE; zqgplbo_dbFr}KJcbwj6I?v*wI;PT%kS&gE?;<`Y2QCPAC245k?@|)T&EirGwFoeK# zZ(~pV(XThP@b#&R+(WCvymLpMG?`Pmb*R$0Hl?iZ6#gryrKJQ zG2`;7A%_%^P#C|lD>9|diXIUJAgKK~G2GGv)%+$WspuFt!*C!=5MczMf^(l+du365 z^~6j`$(fVe0)JbhrV9A8bNH`#z^GEDJLVr0AR+@5O1HoMW&^5!`~Rpqr|`_SZC(Gd zZQHghwko!5Rh)`#+p5^MZ9A#hHqWeDYo9&$O>Q&(@$}Jp)AxQ0w|q=JaB1!Nx}1^C z1mS1aU=xIrq|Uz*s;f467rjdW4F3`sNA--syR1&7()S`Gp#QZjl>j7@JM%@y$Ko9E z-Pb}{<-ULS_HA_vvpa$-L}Ey)iU25`4EL4<(Hik#$A;H;l39gS3{8XLv@Xrj*-;lI7Nq(cY&voLG$ED4jpnDZ` z9fkkM5D%cu!Ni2!Ba(Vj4aw0XP`$&HFEpv4HvsGG;QEBqi`@D-n7X}S&| z`qzHvY4VZ5;1Y(ENDAG3`W8ZwK`0Cr{rA~B^hYQFtw5ul-KfzXp|RuqnDEm(=3tt^ z&os0cxs?r9k@J3o&6Md?tW&IxLj=(EALCESbNYa1TAAy0N20ty3iF1n=F{cGTmt_9w{bdDCELzjmKaCMRX;`WIJdpAb| zD_UG*>#TjvNkV&cq8NU<=yiGf@D`Y>`ZU(G=DM?p1#MUT-1BY2A73!ty`85>6}+J^1-nb;@#7&mQlI{|W~F zYuzhY>My!xW28C>Xy`c>GIEu`G9sXe1+Jo>-NH-p>RD9tzz4?e9{JR1y9Xm@jImSO zKi^E&J!QbbDrng|kzf^gc{l$?4JkIRIZM8rd0gtk2w?wTHYROYuQI&zG7p9Su9aVh zn;qDp0AhGsCW7!fClI-956R<((lD?&8WJS?o$c7+M7-b1geUbEh<42aMV>9|=EdTGvRfIgWrq_VsRU<;x zhH|@pX5a<@M@&o}#kFGsq3OPgg$+3p3DHz_Y80)41nXI$>r=VGk-X{Yh>vz{pcvz0S|okeui+l)(8ej za(B_!w~bq0G!tSB@#uSkIBuuv`~24F5W>Sq->d-ON^g&(c5$bezZ#2LvTZOdU$HqCX_d_sJy)HlIM*r92~BnD>z?k{scdh)iClvzJVR0=lnEk7qFeJ`C(UBz=4V<&l^(Z{ zZ)htBtey_SGkrC*oSjjuQ5J1h1>u#PI*^_r-@m7iuiM#`{?N0d*?5GXna5u@(gE!x zb;0BVpzS?WD=kYkEh{3dGMC86OpjT+ulEK8p?sm$&+@GUM8*aA2;*9busmU$3S2v| zJTTxgjsk%O@teqQh(>RtludiyZ}pt#DLyF1IehYORt^wWg|qD+gw1&DzXJgNS}u)6 zCR^`aa|@n=CF#EL%&7AR=>8Q>Xl0o9A$d`0O(Z72vvv#&0bp`#o#RE$O5X{tgC#sc z=x#>5X>_Z1Dj*ZBt!1{Y`8w61!H!~vWz?hlWCuwyJFz)XLS_1S6qbFE>5meBqx>|Q z%;c&ymdTo*Q;AO3-8XN-+K73x2YmatKA{9lJrYL4H?r?0 zjfk|JUfGv632~!kwxcZs+NP4ss;cwuJzPB_F|E_J1K|4CN1+{@pE{%}4!SsEShX|! zX9M>R5kR(ORy%MXohzA9R!p3*?e|>MwWHk!nxJQ8s)wXUP12@y<_n1bU!yrjH2T~F z+`&qj9{Y110Rt-kPbnVFoN}Phn^F-D&{Tb36uvekVk5bdeSp^XX1;H+$`6F+7p7g1 znjy|{e(bi341e>3j&s;Tjz<4uDBzCXD{@XL;B_ZLe%W+qTdCv*aG2XQIRC0>A5SOM z-fQ`Dl}-Dg>=DdaxU_q#@bvs&i`O_6o_QWJ`T+NTr6xea1S~Fn!@?j?z3Q-?7m@rV%QxPdRuc6>%RoAsr?2c}Qa8x77x235Uq(HmC} zZx|fXjuVBf1h)*O-{WiuJ6uI>yulBFT2% z(7k^=otmJD7`xoRnn0q`%I`qDGfjO>?Oy)iCZv)wH=Y>yjYg?D%io!A8Ivs!Kd{ud zX1v;#_r@h7`sIo~9t1+d2oZ?(KV*;RUEip^ZFX(o;xFjP#1J)s>@~z*qEaPZNCQFLZNH47)DnS<%XZcWIfPYG&6qbj zRIWo1K?FtN*OlVGEynI^Cf;X+yD0sjv!qfT<2h)*9Hw_|9J&-&f$n4N>8(*tiaH#Z|xj(M#lP`UWjKD;%NZXE%vu_gE>VfXasWvNjf<1kAwas z^j;E~d1um&@lT?|`CD~41`4ScdnP>ByFA;#FzuXi`#J=7ih2spI`l%E9Cy2a)gsh@gcwoy{EXsqmTagX|%9E+GHCqvK9U z$0BgM62S@*jgvod7c0z+b#G*j8PA4u>wf<#f#JYYel?QiyGFPP|26g+3Gn*sQu_yK zhVMJD*5d-sog)g0iG~z0)mc@bTe>z2j>C7O$G8oOsSi-nwl+;RH)+xYs!}`yF2U)- z2s!Wgrx>wSOqNZ8TeUxwye7Ej2MbUg zHdMINb`F@8K2{^MQ-kL8lQ9a2urDvi=HH)e{w^CTBrSe_ShDPg{dRBprnp#JK9{x{ z^DCJQ%u0U^5T&UtGhH*oS>EkAQZwL3zqgd3Gs)~e9KKi|K= zzr2$x3}>Z98ovKH+-EX8-o1?naF1aNW17(RtY);){pN@iKXPsYNkb}gSo+1}dvJ0z z_M6YNtQ8TU{I}(JKK-ZR$jAr1-OI(dFEQaKd0xX^!^bwU|rD4;H5p`2`gtX%YZwUk}TR$HzH_A8~ zgJF)PxrVMoq8nX7@)hHnzr!7Alz31&c?)9|W;=ssCvHsuToJL<>cs3F9b z(1H@uyzU==Q>KF;cv+B%xtc5=rX71p(bKtuqBXpXtbS{w2WKEAHT8ybmj1I|vdjm` zTTeD!p=iv22T&Q#aWZ!>P89XtXzhg}OG6=myoU%&y?1_--HRg?%GUR>;pPakb#^%F z_!jn#BDH92E)tmf)SfQ}14(zI=d0WTCf4+Dovmy(X{+q%R?#X+H`x^PpjA;{RvA%n zhl#zs2<3W3(OLBpWeJ3@<+Aoq@LMp_h)Ym-^%F*h_%0^K1_XctNE}33TC`tp|FS)F z*_oihfSwNPtZB#r(aZ(HQYG7x_wZEO^z1=EZ?;J4C69O+{>pD${>w*~6e(Bl4i|7@ z3(!)3wK^FXo*uM=5HN@jTSUqBgbG-#a#M&MA9IAJ*5}dt-ky&0Xa{)~Zq@`Bpzwjb z5_%f!&S~dQS?Th_ud9w$fmhj9r6H1ej>3;%5qCaiAFG>zr^Jd(@2+BnRcBaBByypv z{|hmBhK;Koj}8?cCy4YDblg8*d%j;0pb)pw_2OTrF+t{_%NQ;=;DzGH_O3^eoFff$ zAQ5kI%=Qg=BXHCenK8NEpyT%@j9E?DUq`h7&Ula|t0tqCuC1&sRD-leyGr_f3cp;QRM-t6-Og z?!D#|ML31tH)1PE)uyUqN`1R#tjg1Z5OECywYLLRTLu!M#RNrlb_lOOj{IYA<2AWO+3pF#1)qc+4Cmjv`E|gw@ zZTTz2A=@C=c0s7|frwwUwhIUUPloXSfh#SPEjs>7H0k9?_J%w5DcG!^V(33iq^_&3 zC+)yW^hpEw(&rngrIvCzh0r>RP}rsjZtf0a@e42ySe&WM%`$0=pT#MUC?DP3I&6(c z5*>})?niN6c7KP~RLC4goa(q)x7df9S55 ztmrFnc?AmoeIm^2Pg;j7BOl*ZcoL2QA5M;TE}fUe*I`3PEAbk_IVhRrOXI>%1XlJ0QNHC?mDW>dKymn1 zrNCMYE#{E~C;L42~iyMN49^`5r>g|GSYGah50&kgS<8NkhNIb4d|$T?Gc!OYH#@6-P`= z*&KsGul7=NW;}i2^<&{3EgzC79Bk~TS?rzcE0D03V~7Ot>j^?Dc;vPpSTHMa#Ju|3 z0r!aZKzv6uPy{V}16$x>6;HZa*#()-i(@gLU0O@spT3)L%;n8{qx<}JXnGTd!)@z zl62K@0dzkdbS10FuwffJv=tp^eD#a-BZhrSmx!kP1bvPsnt}GlE5=gEB+f(h zg=FD|_r3@27e8rA_kBvHUjAKdz|g&3h;=1|_L|^hGzTGnrdvQ2)V*SGziHXcP0%f)NF5jW;q&viI!HJjh2M%)8Vse_mC8H2S72Ay_ow!3Z{s?jJ zJrX0ePNHb|b#f}i4NLBU`OT!*f6s-;|Gb6W{+DxihzcnHAo*uW%$4kc?vH;*Ar@Ou zqDcZX>&QOOaEkvRA@G##ADGA*IAlVi6~fps!bDj*2s`m0+1zkX2}Wqtk4GYo*RA&f zWRy!OV*wylBbV8xhPKa~$Z~>ISRh(efH8YsumBA49#KWxLvwPnw&YBys-aeo(!f@6 zPuz~rg8({dX60!{oo!m%-4RIJ+hdw3s=`sO&j$ko#j~_>yp*OS{zO;9)9HOCPHv=? zOtx>-z$G0>26?o@og}Yv$0E}dw%Nl?rag;8K2jr#WB^etg~!ghL?_UD$eQe#1jfpCi%rF{yl|_ zI;^S#Us1M|CJh3`I#WnVljV4I!ja4~<-}90X z$i+~T!3_IV{d$85Ryqv{0ZK|vVO*~9Z_>vfU<;0kX#M&vwPl0yp|VY+#MQ{oaJ_^( zT`m9kok>>94==g5vWWDQYW=M4a1FV0jYr#>#F> zX>K*eEz_(`URE#-iJ#JSymnD)ZuI>CcI^$;>QN7j-+SND`Y<`?XxGcneMZ~cxdSH^ zi`gaa45f?GGjB}Jo|Cc8YreI_ME;pyV2u(SYKjOA@t#>W} zNa4s9claHZYdYCiTEN#-PiO4#>^cz;=o^q)zw7EWbysj6`bJf`M+X~ohwA{CT&~BtX z2A`Z*E#;z2#7E=!@|#FhFykjJ7ok z;`*mDQhz2Y|C;1B9otHER>d#ylr?~pl49e3mhX3v(0waL*2tQCBP?GgqqZwP+eFl& zGhDN`JtYLC4a6md2R&^ph*Mz125P7 z$4aLE^YJrdF8~0gRJ!#Op>f$SP^_XUhSw(clZNXSG(MTOVBq8w*R^`lW~t+we#(PM zl}v#wJ4lbeK3(2BgZX+U+lF)hX=hG*c z23{>paO~hdraH9Lu#jsa3HKK@!VUR=xnXAYqV~v+P^*?-V<854e%13p)oBNuSN8W* zcX^QcsO4N))ZEYRb|Tyu!hs0EjEHD3lO4b+Xzj1lQpB)4gDQ zO|3so9e7Hc*RMizSR-~4lmX{-=fm3+KeA80;cd-8t!8sPE%bCNg1@qs@)q~B48ZKzz$VM6$c`GP7d9W8;9Vzl!dxshAwL9+1 z>*bm{a@)N(Sg`rdz3!Va>bnlvAEr$ttEEHnTw}j36299U{8fBBo9=vQsH{fTHO>YO zJaT~jz=PYFO=^KX*0nY;7n%ommL@!1ImXxkWlh?^pPdUE`xtXS!fgyE-n)!m7iW4Tv~+!bWZC)3Ra<%s zCo+PGIputrKQ${|q6h#C_Fobp`48quZwb&UDTyfiWNDUWEnjJ46JurYEcnmy!IMoj zS6Ky(g%D!!)!7}3ovRPB2{AL@gBjYWA~HQuJXWKE)%i&Hre?!%1NrH8%CA>F`J7m( zG}6Qdl!bU>Fn%j5%ONwGo-ArHdJm?1Ck4{1!V*+qW#RRlc8e7OR^>C9F!wy+}>Op1P7D-cQjf3~gNHnC+iK2&oyec^d%6G7< z)T4aImzoyY@pUUzB_=_Q_>4GV!wdqw&_p{+4l4V-YL=24Dv>%Kvlg`JQ~HlBODO24 zJ0~$uQNPDp^0X2al0z|VK;d@plzqS` zLhtka+yQ-`Ge!a+tfV?iM}Kv5t&PwlqycObPb%&Wi%KE|VVYtKym~WsZ72lvEq$1U z-Tct6vQi{l*ygLpi`V`gUPPQ@tM-BmQEGm*Z_w5eLHX8F1W=&mR7peM?{nWs@LiQQ zAioq@u&@Z6HvIb_dU5KQIYL9~YM4syO$ur@NoJ;JtM%EmNa13+O!t62c@cqZYq zyZ0FiqX4Obf8*GhoI3*{Yoq5%)kG<}x661O{Hh-O$u%LQ7?Bym*UT_}A)MTsN|pP& zWX%*Fx8&OnT5+>Ck>k(7CfcpJ-u`2JHUS?(-WGTiHmbsGIFqss+|{2`n$|(;e{@B4 z!t@JWMTtIw-`9Y+yNTyS9nChGdFqWfr$S5WZk+L9aD4$((I=aH_1mrh&be&NGu#iY z*iTu_AD|kN2-`dRD)~vGI1s{md=3F1917c8h~K!=51%n$A2CwP@t2w}{mc@50eSz% zdFM5P8LBFxVxg(R((G(se*vwet_JMI&t8GHAp(38f*YqgrB}brPb00#Qc+6 zdjHX~sch=m*Gdb8XrfKzGx%g`pwt87rn;%W51)sF{LlaqqM=kb`5~Sktop3}i$@wW zW20>BxeN3p_!E!%(}02%seNb8HWJI;LJ;k0w`z_GdBztIsp+`dX!0L73{*ZpYuK(8 zO!EM^ASDneYP(1!)1Bt`{C+pi>myza0|2n3>zRp6UIuju+_QnxRP2_`K0nNKx_&!q zQSwVXf2~fy_sz)a9|@RR6vDGV3%>#PBMtO#N$9ETAF75 z^3HK8_@;;*Eo0JPANCCoxd;HL_)i~br=4%G#b>954|ty(8lOtTk197e)XhNcrRHF< zzN|W$ZqN(qz6KbSId9&CoyB-O6&SU+K0>fdR}tcqo?yF&j+97Tyxg?rtRT09G%X_2 zE*&g6J5Q}Am%zI8XDX#Y2M$SyvgX~$XX-Xy(*5Q@3=B z^{WO{j|#UXj&Sdybg!YEUCRu?hJK9gwJX{CbS6;f0O9}Putp2z4m2AZ6T?kNTneLN zGUE)}>~stOpnlf&Jn;SQfzo^vbJHUsdTy8|{HLsnXTHiU=?Gg(u`=ud%>HvUN{V{_ zY&n%Mu;M!kr_x$fL*Hi!k_;Hh26J3*_rOkAcY(SFR5k_dB=cez0>Ri|TFV=n$?IA7 z*jU*yFVSRMLVS^=#D5POC5EngeY|{14_rJuD#W{Rir%B(bw^>O02xqp-zu;*FiEYR z_swEaSgiX7XW9JPX1;nu}5=s6~j?coKLY}`SV)NAit5xuUQ$1Hg+r;s!adH9|j z=DyNh9pqK6t@p}MF7CP&^@e^tTT7OeT*r|~VDvl3z6?5gL~+BKw*VJF|8G-?-XH!) z5)Nek7b*JT@Hdawx{3g@%V8zqqDJ7$PnUV<)RA|^Xy3L#sFY|WoTGDK!hi1lrea)* zJ?i0eaG>uMO~1iJg`q5xSGDPq8Vs4ni*o92<9|f7-<~VLf`){If1Q}N(n%*PgBS;= z#r_infC^;QG-b!}%hAt0=(Padtg|IvzoR~Jfqp;OQN#?O@Yh?dqO5)?^sd_7br8xg<6-^8W0^ug(>1=Qt{?ANoknrhyqHd)$;i8PJ~z$f^{1~ zWPb&k`$86;Y%Z5nW>9RLh8;99sN-TmvE>mt3{!VEHSHu zwD_z;{w4w7K3x74>&p^>U7F&O6m|ML%D)6G$qBe6B35yTIjIc$VuuEm%W}{UH0o%eg$PG;Suy}?#G4X_Lby( znu4jyH@OGU_R`*dsF7(waI6vv&zlBvgcaG#>vRhi-}d*yDF}VlHFukGW z{*0k7kf&>~t1yIZKFvP4@e`=0DmX3(PsnULmJ)TnN^C31Ne5ZPT2elmh&nx}1Ly~x z2v`gMEGR3emplM~@xPyFSIkV}GLbpEngS7-pc5y(5GC8*!A?gZKs;8W7%DPX&bj(0 z%h>c!gx}6hNaLAU7H4|N?G8_Xf7NAvkQ-nwb2J60zqG-MH|x%ZUH>itRvq=8TY!Qj z+wrJ{4Ji^t$lQX>XG-%|iY;-py-8Kp3IL4%3gr&*gL>XU#b(e<`|5^?h}cQa>||-J z-Lo7)_Fn-myYB?O@3n`ZXg^grLi-s&UM|;b@F1f|9tx`h>MG+;jI+yz1+%KS}ffXmSN*Vwlap} zeT$6{{yJMQS-wanbH*2P4dZ?Q#b)yuK ztO9u(jL9L^^ac%j;#DBUe((JrsH$Dw$4P%Vy|*tsatag7H2K|ayj|#s)JE3$*s!zn zocO4!cxSw7%8d_aE-vshohpn5W8p-O>D=`U`pOvK{Vz{ydRfC#r~~y8A{6*OTV;-Y z5*~18XI+-FKWIDPn6q>big@$lSnfWoeF@mQrI?#1n-%yytj2BCcWCYdh!FJL{qbbZ zf*_E`;n4mGhk4-^uT(Z^%>4vx^AFE(X1J>LWWTko(;83Dpi|9MM%n|&ghO>egO*Ee z!@-RF9p!K;EM@X+aG%(uGp0h+DsgU!8Ss03QoM58SUGLaO&LDSvHm|-z$aE~_WAnV zy{H`Lj?qFzS-bQXgI;mI&Y0q0l6}?UhO&db=OdHUF+zQyXU0Ba`?Jti+G7ui)7aw! zl7XGA=xgd$R3MD7bOh&1n!TUu3S?OdyC$wwWF)6-$YbS?MKivjT&^*soRdVa;^A1i zVur-4fv#t7hsS-!WGa3E!03OrW5fzHiWYtfTC^7c#YM;bo?BiPZ-{}31CH*Ytzi=31@WW!DZ1R z^5F;4x(3mzX>!AL231U^4GTQVr<~T!Id{wtS=9MraS}>3e^?f<9*o7b&tOeaz0=9S z4QA=e9H1O|Um~t|VC;UX6h`PND;mez33bW{g_x(Lc++Pscpv_vLnE46jAEE7)WGe6 z5%e4CheiaH|F3}i8CGUS1ytQ4AjsF>Mu))WXKVh&xyPb6w5}YJ0)KI7e`#{Z{C@eSc~!9HW1&5QOi}nLZD4eCQuzqcDu0%2Bv}$P5*SUn zb|9z~8MTHw+Z%j_T|RndLYJ0bo#svJhq7cLU|eX}O1w&*Lu5g6E(uUc`9#R9>8YSA z6AQnn4&`1&0DAuc)@W7e_J2a4a_GD7(k>$D`=Q~Uc0o~h;@<1wal!259|NHI=}aGG zMxR;Xsk@jYMSps7THt1|f%JsV@xR;_4>N~*;DgwgZA;LNaXy}|eO=9-%*s|pu1)qbv+gs!d#ST8cpJ@sqw&3dD$Gcbr1%5=|!bcNV zXxfS(F;GgqeJ)!`8-K^0zhM-rO4in7u2sQv;Y-irh^A>{-JkrGQJ96#n+>*_lr!?M zET5BWN2P?y68P@PbP87aysd?t5xrDP@G|)(+$QgY1nH6?X0?jU7Z9PDd}(3f z@)mva7GeLj(@KF^h}^P7L}&;mvr%a`@mn^pe%4Lg%_IlxNFO}xW+M!#5$P&6A|fjQ zyss((Rj>Bp>kDbg2vcBQmre$Cs{&7ICSbp`540j=*{SQSQ)xM;OA3e3fbSl!~s z0dH*)Rk+If$#q=Qb0;`+u+HYbKoKndd4L;+Me9QunlC^`N%2nuDJ0K}01$c#Tu045 zLWOm9_O995SQB0#LF)tQC_>4eb|AM{1WPTpm)JS*3N_*ekpy3*vfQbP=D z;HDN-{2;W(3jt|Oc5jdb&E>D7A`EY6AT5ctncXP3qG3S2ae)icu)G*-ong2CCf1v|&o-jM_U;&XYqIiYoEBg5Z zQd+z72BimB^1x5X_%Mfr0P%}o`{z9Aa}0_pBflK`K5iL)7Y8Hu0Fxs(mcv8>bDXztxzL9i+eN}Bivxqtr9=DfujlEi(9UX(PV_LZ@vK~K8@PCL?5CHPZRKR{g zt=eu$ldKq2#7^~7EW~93eY*_}hV#s+JwTy((u2*Y#hx@{Zrg=sTz+C1^fn9cpoeR@B>2AEy_HQpD%`OuMILIRJg#{k_JU z%ey58lXh2QxW#_*8}aWEf|*m-nxJnF@bB7vH&3XKg)}z_0kFt-~ocG`a^7S zszR{?GgVMGtdjLiK@~UUH!*+Qg_UIAFj^fMY+C_4PtO(>uqVpm@0l-kef9BQJXWLK zflx4gjWp{$Rc!eb1myo*gFJt)K`^ilk^!!=UW4zyap83_dY%hnkE){={hlef|H%s1 zGmNb4G&3QhobO9#^uIU|Zsv!5c}Joc6A7RW@(wZCm1n;-jZwWj(kr|W*5Vu(4p~qZ z2J>B=kE>byVkZ1c_bH-3)T44Hn4t!b6bLe9)xeyUg?_c^u}GZQx9MWThprF+0GTe)6|qc7j?yolqRKdL+-U$<5Y zo6>7Sfe`=KmMB)AQb$Ay(%g2fG)OjtoK<(d+h$MeEXGv{E;u-?fFH%P43ZyYHGgQ% zQDu|EYqQ?qyiYWKoP$+L_qY@6>xA3=C0vY35i&>XaURP|>P11xW$qT9LI~I*)?$O2 zQT={rq^->P-sV@>47{Rq;NZuA-#VKm`N#6 z1UqPFt6tREs&hM{>W&lYB|Q)punk8b^K#63KSZkMZ)trVy&rhq-{Rqkzpelkt2$WP zh@C`{z_}{GI?$@QnT7|@9(i%=YLDzn^D7EAKbU{6GAn+Uc(DJ?J;}c5&15|8mK2$8kthQHE?5W=-R)^f zpnY&+R#nBaTCN_i&$?;_p4_A5P3aIhl|EN+E1YWjPks}h5euQ0SycyDQiGLedCCE_rZS#nlr*}Vei}crT8PVz$003ex|N0AC7{Gv~5I^ zph|5(;Dx+ZMm-2IlCfYGyMC9c>ySK}hcr@CHZ2RvqxZd=a2^~Q#g408HvZ_d^{R9I z{_&%=wzDl>h4!9s=&4Hc-05N~AjLJL>8#ZkAn?~1LrFt%!ADS`L5N6)+doFZx!Dp@ zEI$U%vo|0YK>0T4q>Vvy52EJXY8BWVD1NhUB5){TBY%P^aflo&)${U>e%w+uDs`-3K?2XDGum+>7a;McRp%=9hGFmtLq<4@ z?y^!9nhizHNz&ogf$_)6#0Iav-lf_Nr|e02K*~P!-A&J)8wva8%ZxGE9Mo$05v)IS z1#z;R#!q5^{{OFNc;Ufe%sDWP4B)Wv#D<)^S;T^1JYe=;0Y3&i(+>|8N3zcJ>hX}S z=aoO*9Ckv8Nf2Hx+&5zz7FZ-_SQG@&Dx+nlm@qnRo+D^=Xf z=|RO&+q#m}FU`QY-}bVtk_&ab$EO0IpwCOQE+o6f1050KeSPpJyc}j7E&km6e`cF) zS`b3-1OkSJ!77Ne4yl^ZioF0(K(D_B1wVnK=%6>7_A*)+vH-wTFlzqiIv=(m9Yyui z0vj6pKJi^%{#;VRdl#_U+Bg_*EZY*WCfMMZcotNj7z|=wuGig8>me*9{}h3O|Ay~B zE0X089Eyvm)sW7?rr=fmAz2l!wb5IiXM#8UV&)9(f+I+PxrFM+4CWi3*JDrp86yO4 z=Bb!h{?zkdCf3C0=ud(?K_Xo2@Gwm%EQ?6I*m4LWUEaS`tgx*#ve7^$3RT;eq+e0@ ze(%&p`!t!PG?O0+rn7ge4Qi(VfT)zq8kVa|GCRZdhp!Aw$qBgvP2rHa(l7YxV_sJ` zdPe{tVW})hs5Cp5j^)T@f~9XTW)PJMtPD|>@=P94+B@s{ZeD?KFon_hGG;UDULTOA zm40cx>U@9Ypi3}^Y`|VZjN8IY%(ss%+w;5NlXh8)Ogkppx$l|m*smdz`=)@JiG&=t z$K1+NL5$*~Ti|PNqwyJGWr#~|(9_V0A!u#MgM#mSs>d5;ya{a=XYWiRato@}V!Qkk z7HE^=8I?cuYnH4DowLdQywIpyTiMWI|IgpaoTC1O0}t24M`-()tD`2Hdnr(^5pG6I zzCb9NE^Gha+YbYL0SyT=LkT#|x9teB|IBV_%TD*)XH%OShcEECU{my3HWd)YM*Mns zkx^zlmAy-~w!XlUQiO8O@R?AMlUi5_87seC^)nl%;O;io3*mG)0Yzo-k_Hnau4!Hl z6I>NqxpIHPOlT!od!2Let^01#3YF0FVs_Of0!Gv|uY{Ofuql zEe1TdJ0C+!DUeqfb#{+ORoyFM2FtB~G|}y1v^jYc?j|9IdZ^C-BDn`n{8xD3_Z_f- zAU1!A$t^b8>9&tr3enO(wu_Qr@Q)+}KvuYSJ#BoZID%9hosI4?7jwtlUT?S1BB34# zO%3x&cg3kgz%MdIiNFSft5yvb-62k~zVFzW;*GmK6&2+Z0%2&n{_}s%nJ{V5(E^^a zz`(E56#RR~9na0NlUz`QFRCxL={gs_yc1dZ_-^!Sq6t8;d;w!|YFpi8yL!>I0{B(V zB7AwjcC~+h%^IBa{9!$C-oGEG;I1yyZoS)&*%q#v_=$r+4dx9%-s4`Nz&&AFSVDDj zlD}oh0J(YhilZYR0m#dhfhgGFUqbxfQbq_HLli+9Ymsq8(upLt-g8OdA56mfa-8=QbLfq{w^zSou7~0Wf9)SK0+jw`7BJxKr-HeV7nN%Y zGLD7X5yVc7YXcPeyxf5?CIH&Gw4Q#rb_NK3dyQ9SX7T-`Ha~`@H6Z(_=OpkCJ>?e| zRMgCmYE{^lPp1u89pHzUj-l263rpm3{ty3EoXC&`Io?4=Y$H&WaQ9}mFQQ02uBe=FU~hz9|{(f>L{eu4DHR#>^Xz>Vyb2K9ua zibtRPv<^yl=QCDzyXMDw(DSe8>6ewv$?`~%db5}V@8`u;3V-XcB>3PE=Vwe`q&6J) zu`7G;csp#+83a@13xQ^tDRRRmsdgY0&4ehv9Q)yXe1I)l1e@*A)JGb|;5I!%O5h0h zo;1~=L2E~mW`uOR->6Z>v86fO5KLec0wMbR6~Hps;8PPq)*G*X^ClBKB_qtv4Z@8t|%`VCSncS4d~xAg`C}HMDW41JA#bpX+cT z_INEB-=wnmGRvl%@ft;NKq5MXCY}z-2Ur^yQJ3cr zoEs1r#a4FNklmxPJ%I%;N6#P6eT>o~h(O>ue}tC0PY9^~U+1|U_2{a_Bl`gr#$(9e z4$%>=dXuH~<~oUDEPFh$dVdG@F}6Rvi702Y3E8=p80*4GQ|^6+MUv3d z^wY<7P0q`%8?`ZKJYM9%AC#-kEtZHUi;*OCKD1Vp6C`Yv)GP#9Hf4(@SW@pYxm)wS zaifrl#(fcpp014^nF@bceh@3b2VndA1Xtv^JL%=<(@ptkwP&~_x7H1ZDXUJ3T zwwR{F)QtXq1sx^Czy*OJ(nb%aZ($rUxIG7nObt1dL&vB6dBHjsr)@uca`PjGy^yA85;pnbmiV(xRiG{+oV8BoayOrk zA%OM2`ZPW9V<~YWBNUXEtX5ccek8EH%AJmV01#%vm+XhJH-vU4YClhyP6(R z&P%nnrgHByiLL^S7F9Keqn_?t=hKq-1tQ{@hZ8ecRdHQ8hVL)a>WTmsOn zoJB3QW|x=qiB&-Wkf>q$;!t6mL-uc5gacf7p>yc@5bPvndp0Wb4tQMa$9236Ha^k@ zdOV0d{^AlBnro6W0Eq>6PS($eGrc>0eQf)_BXormGv|P>#UJm89=6T_`+MCJ)_i)VE0J7SGAqw$A!QVN4ZGfV8IIrJ0) zLCNm^U3R%$-=~eCtcdI_-L5j}6KVnt{p1qMl}&^doQQxt2}wez1~X#k{9>_?$xyJs zccof$^F`m)X#5D!`N$6j$`jYrg5}mIF9$WmO!h7!>E1+V_MqY52EF)8N?7dl_q;A=}{4(>RHvw>&#jt*}ur z+k<(8*-c)bPZfOuBmdk{4F~g1wl;&DK45VD8a??o;|)X0V924>)b90@^_CI|bE&Q@ zH(7SQrkFs5Dc->zEIh2o4?wjsXH$M{O>;a42e;QSj*0b~H&1#^Lvv#fA1>h8u}ua9 zCcW1~)fv_3XT@!AVcK^dOL&WGUzKc~Grw+Afavby-x31CHC_Gyj#<8-d(R=R5hsyUM8iV|hlGZ!Ix(=; zLMk1Z5Z%m%b~J(kaA?m9lM{23>GwcGh;{XxHoPSSb+=zK=nqsT#ifD}{Pg0Ldz^&> zqp())ZDPcMA;!*4Q~1Zx*?S~5hZEE|AyY+s+*P-V=}H&VRK$KQUpp9I-Q=tF`t0vY zOj7?$$&)>d7@Yb2FcRtQr?X_5G_YndL|D#J!?tQ0$ z2sEVgOX5d@U{tSy0}65JZ2H}{bG8J70J6t767r5@3P6^lds}@U!x|0(pdO_7_z9|zXETQ{y#sW*pc{eYIxbP`)VgyTp{%%;Gg9k=vVpy-MBKCe5t}&nNep@wbX^4+?x*1>SA7=` z#iYbCqPiD>D9DkKQtX1}(qg=@ zOUy+#)9cU>uv7s6v}~J7qb6FlY7bN%1ZyF5+oXg~LJqrtG-6=V_ZPMrt@s|q2Z#7` zikg6;V7$*%`96gMm~Fo#q(=+4Xaw&ukjXBIq5L2Ej)uJD5kF&Rp5wBfL>Sd6fBo2t zLAC|< zu$#lbg2>Lei5FHm!0FS?Sxf%!kll41AXY*ZwSIBp7~4-@Ku90xTIR#lWz!E$_Z4KNRK3Mqqm(5{D<z+qKQL>!(V|GyWn#eNKfZyW82L{P=hQqK|1{obzh={yFBW?9t;6I(lrO2YUA?Wv^U*XMYO|cCn;XlE9 zuwOf7plGB|`*T#>F`&vhapT*7g-rt268nIWF(H95I2a8T-x&S(Dc-PUec`IuL3qXy zEQK*7uL{rQlVZVrCm|dt$Gl$Az{}o+cGL=&j-R8o?O^hPhRN|&8t(|Y)Pm3wVh3-( z1!FLUNkZl)jMb?h7c*{7XJ5_8k`pq8hnV{&5{a$CwAd1pB~B(F;zsl5LQr|;ISW3B zDod29%um~PGxzAel9nG3hsxQ#LF;}?>9wNf9iOERF-nR~F{iw!X<=PaDsa+*ZKxNj zH5YolzOj1M*+^wWvff4Om3At3YL90FRQ}$57i1xS%u{OE!D_ITz(WGXVDN{mJit)R z9bDi#9KA4R1OULEtz9^tx=%nsR1I^pu#WfqQCS`!aj4{V1XMlol&ps)t5Y=jA6)Q5 z)9iqx<(6=V%kHu{LLfmyk2Us&_6BrxOlum56=)Nf7EwokXw-GR-&|Ar=3$H7RxO>I zqf3i$a5){6jBkyjsjwpYEMH|{jfMGYT(2<`UYOi~zNNYNNVC~Ekgt&zH+sllO!>68 z`w8t>w})TC+sIP6a*w1-a+S}|u06H-@qK6>=!Nl#LRwg|7FO^~{ahZ$ieC3ih@+ze zy-AZ@mbgI`X_#4GSdvKslDnrU$ni?#{;ty-#5VAv2qTO7zqBxAxS|-^bJ1#u7%*Km zA|I}LZfyOXzzY3Uj_Bbp<{G$)4_Fcu+vsqUp=_>-6mOY zDn@8HJDv)hR4={q5IX_9MT-n28)%Iu@R?&R_apKyEG<2eAZ`#+sI-y%eVGHXbE zedQmP%|QiGqgqjWMG(CzD}v;1HnxZ7R+&3o)Nk=t7;A4K?;Z`u5XdA_U#kuSjC!<& zt#zyVkrfuZ5zO?X-)`kuacModrwG8+2ON&(?=(eTh0=a*5uBpPoLXT5QE9o>7SZnp zs1(ng^5-%ea?S<|8VSbQLw`s1?J1cW_L586oVff1wa5l#)4U4d2PFVa&tEZe{x&zd zOjb&_-U7suB@E6u8EkFvHL!eG0i}r;HyJW!?G|5ChY|EUElR5~( zldDw#jnkx&LN<`3(_cuS2?30}Tkxe<$()=kf98qrDI(l&6|z_5C(IIS(EF?OzPcuV zBjhH251k*(-kvYicQQ2jOgWL&1>s3c zgTH;y&fRInkRL$R>@NGwKZB6nzi6~8^`+JFnB%I2loZ+2v_BSQ^8<;JWhBY1o0YK22u77Yj<`p^+>ioh2-<$Gk5;02{f8at> zGQK{1RAXeH`*csz1wSvoLAa3>1J)d5uF5Qb9cHy#0=6M_XEV9kz6`$Ry*xcYm#CEB zJ@+D=>cb*34R8&Owt*}{9kpf6hy{$vC^pccAb>mof~C=c3J_cP$ZVA;CvAk}jNtX*I~AWt$^ z0gTjZ%vve{p!}~1f-Zt@=oq+3I5#pph9Ncxx_C@A*j+9Vq@^V51)906Ysc^WpUpW0 zzaj2LH+D9@dI5(2!xwx0=G!wuCu|rxpo$EWYXbrv()cwux0t)>MtQ@v(+&y%kl|nq zI#)*SLug1L$o9i8?ea&Mb_zsEkzUDj%T`5pU4PL0+<3=10%lTGPG!C4R;U6!Tif@x zxI_}47I_wLlmaAZIj$C&to-30EMP1oh|!AmtHcpYBw>O-!vX!sY55Ul=35Pw4TXz& zhX|kc}8+%Wl%dIPk4QNJ&!X?1j73} zGhWQPLjNb(vB{83sTTbUV%bJ1&8%Xj#q1L+M}ks*DBS0u!5Y7f?yK;tz@ zAM>s~7U#{1e-a50{1@0KGB`YW05$R#QBrv;tU9A3M&fs%WlAf^em-LGrRD}}k%KXW zX_!m!Lb17O>*L^ps6*b91)BLoM?!$8l44vbeK&&8&JR$r?>K09Vh`ZHanA9Bx+dNB z=Pek||0KS0xEnZDww*o35(!J=x`{#hoaUbz#u)nzqB~TBZr^wEXaOjawwroUKNp|v zu0W;`d&cs{Mt1mbUtddLERzfkgXwqhZX8pvh>$nTgIPw3x&w z2!}bdncg~wr}Ox^rUx)FdM3uJ(1K z1O=ttQI^JZTqJ4s)dxK6e1yUhzL4TxnCOuvWI?Mxa$`g>3-+H{yB!X&Ywjw(@tALm ze!Gyl;1V~n{0>C(H?AMDYSGb&-=q5r8xnyTm2wV62*#xvV9uIB_!#9iJMgrJkYL*k z)$iI_o0vCf!t9`Y|0j0wi9vGdcZ1{05Mst>QQ+illGZ|e@%47MAYcZ%IV|)F22PKt z)V_FdZ->>(P*x_v5qz`9NNQzdk0%jD&zn1sS4DuwJ%cE{D5jt$hFDpf` zgwYyhst>ImC@VOPRbID+nMrnTs5~>!EIE&H0>+v49J*N5&^>M|@z{)jA^=3a)J%%V znPwS;epNMiUb<(9?#W|&uZ$pdj#}S zArZD~{KNISxi-YCCU^OgG7*k$(@<526KklnDGe@J3gmQ7b3UxZAP9Bu4^r;>^2ONrUo zffvON@+NBPI>%HncLV^4{h5oniuCr{^8+J~pp}J)1?TCsr*J2&(%+OV`!5gzzzEz~ zR1GKYSHS18MD1~VjrpVBD!>E9I>gLh+oT^Qb2sOIpyz$6&90kcBLM*8fA^B+iKYyh zBi)0sF4PtD1tvs=7IVvlCQa)fw-mD+;{~MZc`cK3uVqpJVdNd2$2a-uoX_q^9tR1L zcJy9l72PkM?Jme`MYIg<^+rvXOE`Y;4v;f*`@>BI0pSgyKPMW@+j76w{U`8l$fb6z zKVR8)5kcX|Bi1C2vn9I~KQ)*Y@dVd>eFU@B0---85bG1hcYk!Jj51J)7)6@X!0J;7 z+u}P-Fs(_cbp(6{eD?MkoMp}zJM~Q!u(WJUk}Br{{FFTw>*?=)<#`}nBVh+b#i}Klni84a&c;ExtTcKSh6ybrwCmPsMx*}WgC4V)C}>CN z3sCzH;~a9$K>GftU~zFS3>0>Bp`s9~GqbN(f@pAp83SlG`7SP+i7yCUPFa#>shZ|1 zpqXb}Db=LB#wTRxXU{D$tC=USE=zRkn^lAF5oa3!=HO^vpb1q%?Cyc;ma z4CW#M94~EJe8ZA!hImhDvIJcUB(2L#UPjzr-uEmp^f z3!JP-rW6HrX74iq19M6@o-){S_XJkBWpOa91{y6A z@2_0V<_?6E-Xwc?EO~n6LzQ9P@KyC|!)%J-Y2qT>*WW=7>b()9-(^|r3C>F~B1p&j zS{;lNy3sY-9%(@Xo)NOk{YiQ4Egwn3ElBVuP!KXbAAcZ_*jd@mH9gy{sl1J4>!3d@ zg4V0ERS^bt^7^r_`->iAM7!<>;Ir|3V>#iWA9)Nh)~qK^&3af>Fya5<)}b(f*1h>5 zN;SJ~5J|V!vFhSl_#>sU7paU>Cw}HIAy~12p0d?LWj{_j9>c7k*;&g#_3=~`0=3b? z_}5lSO)G@TT0FZ#va zS#ZH6%4=owVKodW{G}=ydYD^`wL$8V)L%$d?{VJQW9IO*%PC1_w^==*Zy6xJ4iKgc z@K$vuLOsVdnAgQ$t7O3t6=fQ2<%p0WcU>^auO{^~6@P{PG{hDHOApQS=|<|hd7)t` zTGB!kLT1(uN#v50UV1c&71^Ngw(J#Fni}JA7dn*v>LHbMS-`LX;*i8I%I&yB>#+bo z_rTrML;mgf?lcLKOl+JIe|rE+n@Locn#ObZsgu+94LSj1NiuNh+@^{)A6KQIi^!PI zerJjRDLnc*R;xvh`ndzKA7sC2f(W$>Ys^6eN!4!_k*Jk{rxYi6qWs$JD9Ono*ie~x z9af|idM7NbU<^<2d-vdNL2$CIWXl}tq|MTO9&!nVt8m^mhGt?wl5Sm1FP(pq?{=ff7MLb<^lf9QG17kF5-2k|g{+#_(rJ`+nbE>2bVf9J5?D8rE%qwREZyA8oi$ zyTU*oYD(@&J3F>e;afzi3A?d;Zfdc?kh)}G*b`VRa4|7i8D0eBDfj6mJ<{2%2=Z}` z?l+l46~+@73*1u;Nz7m1UJ4!U=$@Gvj}KD=2uXCvVZT}AJC19V5vhAjjS+CtxmnBh zW2UGbaS80R(zxvN9EDjC=6h$Su%QPSwC3ONL#|%=T`n%Z%$&SZ3CL-y6OM=Qdie;u zyaAhfs4?H&_o6SL)+XwTU(~n}FAY%@5s}`u!o%WjKnWR{L?YbjYEKVq{mmRq#Lv9i zn1+ve*y5p)KRSby)`LR&c>Qi_vk!Qzx3#XN4*V|zU!Mj(8_4_1awnd}{c*l}h&?&uKJF zuE5g~-Gye&!a4Dm(Xx5=FAGZ8(6T{m<$f$uRqw{Im)674@X}D`Q$rFGs{@Ht!&Zc} zOKrJs!aHZ?anet~TR(+Aqo858K&|{Wv(c z8F;Hj%;y4{)dhh}$bRN<%nmba6g?`C-o}V9HWzk8laI9gYkCk7cHsqdAszPn0E?uh<&O&QjR4YmD2 zH5bhm0dw4+y%S4T66s)W$XBE{mEVD*tb^~dD3AuldA$mdUUR31VYILfsJuj~@p6Fe z1*97agCs(xMR0WD=(jm&kO;N0z;X2ja&+ZELjav6`{^ngM2kmH$4 zRTM!b149g`^6#UGut1@q**&HjqN(BeZD5?P6BydtTe`v7_r}JQ7Af!;3hNHmpU0;< zPe5BKJEQ`tWAI{_5Lk)9S~_5$O@rIhBHQSFSalDH*|!cFV$DKTWSa9UK0kCWvptt( zg!tVlRyHj4iR-&?n*n9nj5rl@V=XeHfHG1#&cwuTe~Cf(>Pk+hK>Z{Nl$H)(TvOyv z{b1aOc!M-8Um{xOHegFZKb3MR2XK!`>GU!X)6_V^Kn3I~wd45F%ZjiwDeIMrH*%ba z3@t6s^9LRPad6r5()1+m_sUhDV9xj*(*tMdEk6Z7|JCDF!_+w>wlFlY5X>!6RqF6Q zqphS&Z6T~<6hE!8(}MsSuBr%&xXMk(nE9a9*hOnm5o3g9IFC=hmKz{eix9>@bpL#F0L?;CpwvRt_rZuV}4|#S|t%kbgr-%=HBG-x>9vP zUP{AHUv>tnQaaxbThbWC3_^3DOe#07_WkZBJ0D~}b}e257=7f>*)4_HiGC2Xay)1t zcb%UlR8?>tEHlo}_@vjyk#p+C`KCogoL9aaW;losWu62$58c%4sL6%Y!sMoI-ETtI zP_903Z|X!vEg>++w_`5FoUyVciaPyjKj_82 zHR&3lTtle%+hS;23|g z8A;S8o7MmOarbXv4(WPgF~!r_(k3@aD>j=`AVUq4@KE&^tURHJi97q?L(GnJgqhY5 zTKXf*RN`a2IT9)?CRsTNd8q%8>+K4LwGyA-&X=0o+wq#=IcF5^#w? zLJ;NZb@So0$>KT5DO*&A+A>?jofL&h3~)a=U3{k&DZ&i&!jFGBUET7`lMVwPZeTBx zElkQ&IM$}j3Uj@~t}m_J?CAISFquv&eg^_rv|0k{G`$Ch4= ze8)U#<>6EQsuwbQe7&`^c5Z9Cajx&AHTV843>_Xt*TD)xOT0H7n@uTmdi1D~qYZ3Uu~}b`s5NQ!trjvEVql`qzS*Vs%a$)Y|z* zw-id_k&wp-!A&$(dxhm&TiL_n_}W8ozpY+`g>G5rJwl`7$0dQe$8$);k-*QuvB>j~ zR=ym0<*w{LtLcN+wh43muhj@?9Xr!h2PhIV=YB~v50m4DfHDgR)opx#7iXAZ13K!P zGVBm?)Hd;3IAMK7IfNrDr{T7Asq0NO6?@bCm{)TVajtGBpV}Yg0G6I9M%+&yCG?G4Q=l@TS1784NFC(GGEAc`du(H+!PyCHK`VMbjJ?MDruv zEBBAH6WOjx-CGY7F*gRU&wfUohq6Z|ST{wluEFsmq1TTPV;Z4gapoJ@>mozx@KClQ zZ*7EgBXx!>ftS=-yRy9Suiv+=`7E!a`oxjva_f(b5an^;pYG(_nrOGP=J>oZNQ#g= zTqIa$#Hl?;K`Xi@+|shzheUmGux>|FC$^Q%I(`YKQ<~|BMyS7-sN1lw z=c_|Ae#@k&(!MrQ;KO4-p7Zl+5ZM$j{v{}wCM?oaI;%azOzHl-Greo1rvP5#)WRN- zf;uy^*Sdj?sJhlr5A0mAQnh4b4f2f$c)w@8i;fdz**Z^T^M~2;zyufW_owI&cP}Jd zdTxyqY(d70n|}VF6f0xfRq8bsNtWWlJ8W$xd?WzCvzOPLX;59W8(iH( zeM+gPW2YXlA_XPlp9A`L4?sw%dLmJMF{G>9eGbF1YU-miV{J?UO#bVrqa}l)U--zF z(h%%pTWF8j)b@;;WfpVHK0FM=F*~N1H(%0BX5~{80gwY3pI?h$=DCgK(}R2&a4=aDdiB zVPQElme>CIaB$h1#gUQyReXTPd0=4ud{L4sh>wF~f(OR|M^)YcqNuetD`t94Ih3T4 z1`;5{>%bL^d4oQ*=~LOFz<4+B{FPL1(fedd*2OV)!=Pzh zQuKHS9jTUr#gTpvGj+D{@p1sv0#q|urK?G^5MNaRy(Fq3fEe5 zLy*X}&m#8F_k128NWYKoL4&v;-}JXzM z9=q;9_xX1Cak4tV>q)8ha#PS|Mix0w!tclR6$uFbmNFWfbXpFrag@&-uhU}$>6wh< z5kd6Tp48YDk|t;A?aP3^O|9N~qW zB}|S)3KTIStZ`kegzywOocO`&#F04-nF~msUltEz(m9xi11h*5`7>Mb%45lrbUaN1 zFTywn0iv-CuViG{)A5RF_aBZaDs(=FiYpl(%&ALAU$^O#xQ%BvM@ihwtJ!4y!Rlw@ zZHk+(WL=7#H!(sE<`U7Ya+{9ijO0cAsVUsgJHrsTki=p}d^UTO6PM|9-nUy z^b`>(hDA6?(1BVMe#ueLj{Q4KK2FwRhr?;tfpnR&bmC)(-I+wJ<|q1u{3V1Ju9c8x zONgpxs1-y>fp{b^N06d8-e=nZWxjNK-U5NOXmdyiuaH_wc4+n*_g|g%DnG~xKMxGs zSR0Zr6X-TIFum6N9tbDUrdcnZ8+Yc@x!ar6#IZ54iFN51D!puadnJ9sA%{s|*mzj# z(W(=T3An^@{0L+lhfc%aEhjc}>H3y6Vghgyr!|L#{bMQWPRZh7YmK9R3ynPQQ=-lT zjezcPny3CUXR9R1)@<+MLU)C6#&fUQd^%g<>c9zKO%zr6M>VD#=q3S{C=-7}~FmLvtIEr6JaMrxK$&1>2l4+AaVV5dcW?5PQCh(dGh*U{90|UOfo?q{n#z z<`hV1S`uYtN}oUFZ&fxPx8<8F-JSSqU`UtW8(T0T!OtqbT|)ftu*Tq68T*gBV5Gvm zh?wFxzk=di8jNT=a7;n~5Vw9Sts3rb7=<_aa`Bs7>GNgN0HcV_uTC~$$e+0UnW@25 zJo#||0KcN@6dnC`%&4)qkRsFIpmv3+37O$JsOMc=m;3k)(}w?V_RFC9eXp4~bsm6|(RASI3c_5z@H4~>Uoy*p@L zH=94B!p5B1eM|9(J9Mc)>_%Mt)huv$obwvV5~J>Q$vyZ|?d1@O5=Bnt>TMqJhGP>YKu+nU_#T4&C3-H7KZ zo`=2n@sA9JTsivs_ADi!D#ONva-y)gkJF*9edJ%Us+#7*-@0+nDH`-x!W3y# zNd=i@*u!>&a;Gn_gk?%x)76XDbc;NMJw4d7>d2fTm$^3NUVL;j5oBQvJsdk*c-VV=8Hm~9qCvbU){PdGu+ehX8FbW!?p0=@z8>K%#Q zY~+d5AdVLmLEW`Rg$Yo|ru_UeNO=o|gHdS-@HU=)}1ux$ASgJfHeMV_Pd#W2Y zhSW=`uz%tYG+}&JuQn1ml%Fgh9G-1jRZR{{G86U{Ou4X?LH8Bnr{MSHkE@~)7~fb} zp%h_K-WpW7=P90h^YaUIS zv80@^#iRj4n-Kezx}Y|5*pse|lMjWeGs7e0N{20q`K~yTMdZpZQGj~@6MjoMPBS4@ zsCkaD$$7%ANI4vQ$Urr=2Af0A~so#1`*OE&O+MP4@W%bM8x*3tWo@KWfR=^BnFl6_h3 z@Fake@YR|QH5Q9E=ECe57D)uaBBdDB>fHZA8Iz}6C~SmY4NMm|u52xo4hlD1-s?30 zfa0f6+IemCm56a%zz}VDSK8KBPYjDEfXPXv@V5LzxKaJH=8GVd`wl9uG1=JKqhGQn z1U(wqpQy~4U{Q-mTx#p+}obk z%LnoRQb4W0+d*JH!w+GB|p;le}V(Y=w|&$ zi%v}d5r(1#t{<=tvhNKBBP|}z1aKTJ)1&zvS3;V~WuxJgpMVc57V4OBf;B566ycIv4i(~-o@ZWi%{DLH zG;gAl(fcYTGlOIvZzUApzYxmOdFcwNH&AgWoVKCCuH@JRGjVtvlef|oC}-+QKYjt= zXVkc6dAfM~sh#C0b=q|mw|FcYs#=|$N;pQ*dw!fdpUlR-wtOQ_xxxdRiF#f~;tnfv zPu-2qA0<9|xZA%q^O}K;TgLN6qTu^Kf+~ud27KRvrJj+{A?+I6NKkZQlaBc)*Y8b7 zAP8=Yj>imsU!jC>SQ&YmNkR>0xgbVa2C%=^owY%}il;N4$u*G}FUi9#T_Ye@qw(_J zqx^&jdwqvD%wPs4Fth>DNR^dDULqXx!*=urA?_;gWUQT(9a6+^QT_(UdPm@*f?=O^ zO)!|o`2?s{G9EBHa-4We>y&3HCtd+$1R_+BK(YS;^+P?6)xP-lAlE0>%_WY)f`CbA z0hih&OBm88`xqaXTt>8iE?Q1KBf4e0$Db$Dp!E1(DhG+Q7h&`!vPvT9>-tW3{5 zdNNLEJoHu@6;TVS{GHTee=$xf3&&o(Gyf{_snnT!x!q3)-sdUK!<~_UkRxfx1kR=H z*!%{;lSuy<9K(K&|iBhQnIeilfE4%T+V?@dP`4 zA|p*13!F6fmR(?Qrft(>N8iu1WxOWs42=r&jSZ+Yc&_GO)igm zGGCY0yGaTR3uA%w3{&dJ57yG|U}}8)5F7CANv#XXkxTjzgHw%=}RL5l(4~U;?}#lK#nkG8Z4W-?z`ZpRam=q7h5`-T2*|b`h#Fs>^m{2B{6k zS~6d*4|C8e%@gyDkq>!s!PX`)tOT@g++6h$_;@CSHH0_$UmY7D)UhdJDVe@q1o;In z$z>^jhuakl!H=Q3HSOmEZ5~qP7JbYCf$NhI@JN0NS&az&A)YHE$WTP4+#)4#r}$)9 zcxd+eb@fx~2KkYR8N)*GMYR?aH~NRAv=e9QvU&h#!uL_~;pbi*2M`=~fzDqFq&_-R z(Pg4HE0iV^;`y(H`+(1K<0y=0N1xaAip-_pBNVhDiB;kscEWG$#pt?;LX)n$N6zDw zRoG?FdB8^5(Mn?S$9j`|cX=;-3AAW5UbUY2t^w9H`4%Vehnh4>3V@C$*w{Kw70Jpj zr(;%fK|#ds?_DLB{vh3K2@NRe%+74N#7_sh=^)n4zMLcfMgTjw9+qB z;97i_dIGXCe)P0`m{N%(F01|sy+ySFUqI5o8Twv7Q%l;|unKJQDIqe)j8X@E#_Br9rb4gKPl(9}_Z0oxS zb!a;F7pK4hjlTfHU>PBDQt>G-5qSPajw^O1`<`|?JznX2#f{aU*1UX;^zdMLHkp8bman}MNjVC9}x zIE|4jEn^xlA8jMsAf8D7r>AOb2nsTDG_`X8K|N+e>UtIVcTbEn@F#g$;yS*c16AhV zG|%m=u_y^RGKpKf5F-orCK!i*$vmihn@sI__$Swc3T{|ueEsEFN1TI1jya@HF3=j? zBWH)i!!A!|9u{MFu8=$u9Ye&ddX2JE9|t)b*h*KIIX^##`Ya}!q|gp3Tgmx*=F=LS zUm1R$a{ZDA%!*S?GuqDXsT2*nU%pQfFNz1A&Y{c)<9dH`Mx~I)?f3p4J69o-Gw@nqHgQ3&Y082e}{7t{hbc zM+h%LPov7#G?A^-+$oD13ZS;!qY7%egrQ?FA$6{I;D09Ekq&b4MDjIsi4$am4{->* zP+vqdsRFCrAQX&K{lZqpUY_14jzr;=FdcC}U%bd50bKuyCAtf}zhX(g%RljAQ&*PO zW;92M>+I&`>V@720NPf2#XY?u2w8F4&THz688@WL3cNT?n%H=MV^hWb^pnK>u@_MH z*UFI}ZbrPJKzyKsiBSK>vCd;`q{Tr80Uj*1dS!?japk&$K>>f6SpyO7?E${%1u-4N zZu=~)@zb&d*}Xn6J>vLSZ*)Ip^LT-xSE@eJfxo8(b|fMaO#d_5@Zm+|iqSQSJIK)% z!#eYcEf%=fmEJ@-^e1@36ckOo(_3Yo{ioNI!tx_pHk(q+P#`*^pTPb=7@n`ZO+lSe zJC22Kg}s zrQDzAck3Iu*DHJoKfKjH*JyT(X#s2U(Y#jom8N=HP5xfu9Py_JnHLs*<2)T+z)>3G z;2nHVbAP(ov6?2*R+U%S{R@ ze_~W#gPq(-g&SR|lgSzYKUk;LmE!g-)Y$ej`W75iC2+nN3>3o>GjexWdME_25kXT6JS@LkU#(Ld`j;NhZLkb}6-BSEj?^Sav8$UwUCzEoL_P<7L_$p$mP$ zZzH^)<@_!@f=*x@5^}R7?lyrGXQXz4R?Em1HeN$2sm`|18P zbu93g@+kJ7bAJ-+FNB z4LL^{k_(+<30PYvdiNlO{7^r?_m^Q+9_1k$rOM`K{MHfX67sW%g>BAFE+j#u713z}ms6_JN!!N7J^d z2wES>pB%g`;xJz4o z${K?qG!G3IKQgfkt-%M9Jft%lKjeB|74+M=9>d;0pO`j@3URb6lES87LZojX-SZyN=fLXRgDHoFsa#QC0!lxzhz zGupISJh+2q}FX2xHE&;pNwf?#cfX4AUoPHZWehV zdpx!?-yfphWpUZ}lrql(k!H>Kwz52Vc4tD`E-4=ZZoDdr*zTR3Nf(^2uSBJu-yN%+ zeQwX}0(JxF`)sryo0IRmSI^|tCo}GCIX#7ZR|nJf2xnzc?`PW_Yt!p~^E@w(E+||! z7C>*tY1PfebB-A#;gWlu0y~`a(!(;Qt)ntfMk_QP#9&3}G7b^r-*ncJhw_|CSA;iZ zH@`1e9n0wA6LzQ^ps;Nx{y2H&zQ1mFVH8|$ANbw9KbMDZ4H$8-G676$x))*rZ&GQT zes|B6b1!-#GkRDEX4#es(=>?Z)izLrX|&2bKv0Nhc-#v#d5`3&JqjYe zR>l&@hm4dTw3Nu^ReDZ=yi{Tp3)Cz#5JT0KzwHdAcidclVGjMrJb4!1R<&()^aItdmoVQT^CeB-L(w=GT6A-RX;!gkkA3A) z3Gp zx;WJJ3NO1RI(6z7+g+n{Jl7n%Tl5#zvYN%h9&54x>f(F~3|gBwr|=gF>7Gyu(p*q5 z26V9*xtzmTfuUanYUW+mREHUvQ&t9H_T|eZTwwcG!jbwqD&Xe=9Ne_aEeitR&)w$} z4NBa-c>#(4GX-gYE5zUvL{MP}g|cp$iLqBPG7V#&)%g>~YIkpWENFvdvurOp8lL{b zqa|bLXjSH*#5;XQpM^lmDNSOd*TS~2JUSN?jk%iWl&blC%b2(HU+XrO|8r|`P@yIa z6{Vf91DH=%%;Qq;zXnz^5xqAYTRS9La~6M!>L>lsmR4ZQ7!#FsJ)Svyy)U_641mgv zGMB^`I&?V5`qKsCMYS}SQbUB&bu_g-aLDjegb+g?uHEI#rdI6Ui^wE^Aoc~?rDL?< zLHxsax#(sAci9=@%XdKK(H^3uz|=P4qto>gNjTT0A$pUF*K%G{U>wbih{fL%s)eb~ z3tHjRsJ-86gtEg_h=>=r*%nV1Cgo=TSX)=uInYr3jaoxhv~?46D~)lnc4;TfCLrO+ zRF}nTi|6KGmuuJrYqUa-dk5+rtG9a*z@~W>?EDz#qnXgSLy+#}= z>Wva;exelI?$VT@=2l}sVB>SFmfr? z=>V)fKO087mE@3oi{*0ML>>^6sF$AXE?NFnY3h3jDm2~SuG5D1ZAws!1sAWu`6|zH!`{)b(U>a^AJJfm<>3qe8EC$j2`|(pHi+=k#bo%E4 z`-!PoXxZFCt_$*l6!#-Ro|wv6N1|1d~6Iy0Lq8 zDcN$;$EfiWRtPd(ufavC3?p3uVlM}M5J&@VF~fv!xCXa~ z=fo+!rXLrxzkJgj(I5fkx}e`@(8$0ICUqn&aLA^u8tK_Z5=ICUTX~U6sl18^LYJBw z`C90oM#6#IrzQ*-E-1D>CE8uX2&GjK8Q^+lAER(QWXxVZe>Us8FN#bXxoeZ0{!`Ca z!k^gWG>I{pq=A6AhH6V>P`fz<5Vs4C+6i!!_dg|Gz4!j8XeJ9~vWTi{DK2c!=uBov zvvJF>TNc!-PMNx>0>bVwIUrC^zL~a&+w46qQt!G`6jw|aWaJw{&QcGN>wK0g!FUsoWKB{st`_hLhI=Zog_) z3EFz@f02wl#^O(8Xy`%$R{wYV_8ZKM-DPDJp`c8n;NB4bAPAhC$KM#a4(>mbmvC+? z*3&6J;LQ9<*knJWik*Mkb@_V=V{kUXv%T9Bd}THKE|XoPHmdadZR^3s&o8aHTRuqG zAAy+@&^AiCZ!zS1Qs-Hlqjoqlb4ApK=2;T*e4<+O6Nd0za!qy&f7kyEJ$#zrCg!Bo(MD%#L z(Q^TSQOs&Gz~JqHF-5I(dTz52j2>MeR~g~?o|A9=IspKyS!bPP`p`pu?|3*1j1~6f zv*xzK!`7uh(^WJ$p#M>_PFY}EcSMvq%Sp~RkAs~wOYjA;gS%;w>jv=}f(C1zVBOHJ zbhO#wF534bYyKF0xg<^;y(D=O-TwZbi;MfP|ITIj0;|-l)@ur}@z;)|6+yq@^4%x; z`bhM$2-H9nBJz>|sSU^rdt&evGC)U+E=t(T-w8;GMXogL54lBV8bY87+}_Mx;xrkF z7DZ6XWm8dLd__d7D#!}x=wWH9%ve`)<6~erEYl7qaEJ(n@G_p|+#fyF^A>dn2Zm|e25q0e5c zEf@CtylC2J2$ne|CHUizis~Ynl8&g$s0w%ZC0l0i7{By3o9VMPAh_`Qd36J0j(1Sw z;~Jk!8)FZ=?LmI?Qo>n8A#t$qwhlenW<@OnviX7B;dX(D;|qfok5m$UgH89M2uP-m zyA%Dg{quzh%AaaXdInT?)|d2smm6mXRfl5{e%B||V5EJ_Bn zPOL;0hH0446|-w~ktO-s=ZwOXLD9-rDUfEB~kkyYdv{M#k@z7ldBZBE<2_i!$6&c(iaKQPJu*T zZ^Q>`^)4_fofEwud#|A|gJz$|;YA{CEOGSB8s21yZQ(bUT_ONN) z)ji~RaodR}B(_t0HST5=;m5M^Y3E50JeSNJi=Y62!2hAC6Z#Ys%>qX++ ztp6M3cTF;T%X_l`m(d=%MFepr@J~~Rai*MVycMQMzp~{eugQsCU-^UmcFtN7pU<$? zO6hM!0qw1<^%IWJxbPk`NhU^Br1ySZIoVI`avfw1U~s#B@7izix#GLFcg_x-V*7Y=3l=-=A4wd>bnt zF?@8{`u0MAf94J?Hgr>`pRneCe`}n)Y6Tck|HBOQ9^@hYK^ysNT&F1A{9A0`7(P@ zaSffo6^Dr3E}_12JOY{g`6jTgt`7FO1<)8~*a9~gws3GGB8({!g(`0=$OyrBN5_1J zErZZSYLY)Cn%E&1k=NMTd7aQi;-JHV*iM4A#Xv@nL;W@&X0Q=#;Y|afu5XhgR1m-` zq!yn2aICWx#^aeGmZ4k=xWHvE2ieHhNjhjs<25L_EXXCvWGS&^v++$4v#Md~VaJ^} ztW6mkSDA*#KfOQ@r~A=7*y-(@__yc27l9Dn$B;6ml;LidiNaa>IBLFX`trLw!Nbxo z69&dz^flR_0yoYyY3pCmw?+Eaw~r{UGcRdb(jE`WUgkovmCVsVcyY2cN4xjmI>Lll zi7>m9)fB~1%i_7NI^`k02|dJQ`My*jtgVF*iW^hpzTyD^bw4tITDpF@Z~IL)n^GRd zi+E^qCuD8Ph>Y;|St4a1qxw{YsAR*KEG?S!+mNwat!4q@I)exj&X8D;`jJ-X;K4GBH`QQlN4qBEG+glj+2ti*Yf7&LWd>!k(9hbN*$)cw^8Nw z(KEkFgH-EVcfib~L{0D@(lE3JKjYW<=iBtF5x6%r^ge)w$Hr^)mf6#y`4Utne>JQr z0rV;N3=ITajI4$pbwU^Ic_bnsLtPY|c0>^vdldivQ+zS)SHL=#40Ms=&&Gtk>dhn&)8*--F6przlur-1V9%99k}aM7%Dp)Hg!jj|_usGU{q^PFbHZan z1pwBw>S`HHgy)_YN)?x`D-HVtr6f(97qfWo^kLytCytm{gQ~)t9&-&m7~W2g6ne5+Ek zsADE1d}yxm@YMBG(!X(-{(#d>-C5N;{ieX6khw8(s?D+ZPEGj^P;zF=V4DF7QVq%tS~2>2g@qz=DakOfjkO z;XMRT(vY5mDz6`((J3Qss#l*B;ZtfNxGrME4TIsYdAqRR9PTs05cFWKK?pxZqUq#r zz<6QHIF&hy8Xq;se23WTLal9DgBz*90Sd_c5`VT~pQ?*qzzY8raEu8RnB zc+X8RVaF2XT-kXhXErR*Q^2-y76lZKxsR#Qxq`0Qsz-A%{qA@|q-+bXL=hgMtoO4w zISu^;=KeyIAVrF@Ilc5Jg(6lb)T14k_}S3+L_k1k>}jd3P90a0HE;b`YgUFS>@*vX zQw2x3W(i3%hONIMr1q%HIWjQn$c{}$KFrv$*8*muNGbzS$8;j=ioQF@QWG!yn6+Zv zpEm*+9!(EQ?cTF~8=JA--`=Ala|Hb7h9_j0+SpV=%DJ7Cg`Dr<{jOvv7^P5A8rIdB zn^Rru@endz9a}-Fs}EKSeKwHXnC^bHByYw{b(B@}tc zlLiT>Lu?5Wtl!e|*b9}^d3YZ1${0z3ANOWEuyipIg*^W0-JP8%hp^HS8;ovSSJ-cf za#Jk=rf?P+s^$ACw;hLh4p%Le0eAxkJ4z~5ojN4_D^yW*bdjR#eIGguF8ux4r@L(} zDZhy`jT%+Qjd zPB&=?&?0XX-rMqC*n2e@ z0;4H<;m_+&Bwq*@0N{zqn+4sGuf2dNfYv7s9pQAozsow+ab6*p8B=>@^x^BrvfO_Of`6)Mym;8qTfc^iX-T42Bw#D~v zwBHb)i~nb|H5!sH#Q#OR{x{kOpo)1JUi_f%^27Z-)V656sSPbZR`9EPPaMR;e*T(-u7^oU{Nn+^k; zgJY6Fr}9yNIwU&FHM8~@u448~_nr$QwRXVDj6YZ%1SYM#!ccW53;h7W+qltsuZQLzKF-Ij5IZu*s#J zJ@5OB`;99E-WVdv{nv(xk8UQ~AgV)bADxx7cXT1o&Z+go&uh2^R*m||aIa}3Y4eCH zp1eg{`$&gTSI&!{1pS?!6fLL6m^ZJB>b|&14b$e{#cx$|4UIQG#uzv7L~UgOL!O}W zFaqkoaUY{|ds%HcP}JzC&nI}RXfD*|Ud=iNzHapQzA-^C0e%02)Jzz%5QC3HI2$;F zKcKVAjDJMLhGE^jE^`?8#y-!sfe8Q_@JXEvmo{)vLN{Dxph#rot}0LSE8y;EB@GY= zA6dT((`AP!J%6tp9scQl%*O>{^sf;O}CXupf((B7vsE5S6H!m&sVV1dJ zYqMx=M%XJ}7-*L8lrb;(fycY&{j;KS1P_^P%fuDNP3v=x;$S5@ca}D=scSbTY59UI z1nt$ZpXV9|XBd|Q=in9t)eLzPJ^6*o(Kh4vEj?!K?e8ifX~4F&+ZyZt?*uaMhdPG7?fj9~3)JTS;DBQNZTY-`dgW^{TmF z;FUpNf-$9Dk{8Qx{`KW;$U-=U?3>uI9Ct;z4ZZi;;{{^|xofzENz+N|1KySOjbsM1 z+Xu<`^cd^zRZ)Dho%n}h#35Dl^CEKgsl(J*3uAShhoz!o5N+$7ciG;jL)T@}Q+5Ea zm9ll0p;d4sH6~;af?vX83`r#!GMNYJkQPpn=zB0U0}7hN|&1lZN9=zaEXQSJ|Hg;N;LP z6H*BT0ScX`h%E1}Ea8fmXX!}A)>b0&J^%RN47JQUFr+=fk4L~!4Mpb--&fGm`)d#1 zWaZPnsly%V5As`N3l-|qiWA>LeTBjW374~2TIny-kyAPPkxbI}afv=-n_EZXgU@&QMP#$;j*7ZTl5l!*gbRQ6(F^~21sZlSWLDHK$$8M` zK@2u@P7#k;SIQN1sc|$*fuKWw?>wn9DM$8==R<}n9jE1PBGz8Ol(ti|Xi0m2lxgvT z_kXKzK~h<pZIj@SfM>})gNE2LWQ>WITD^!NS@8RQ4cm1FMICv+i}Uu-wg-n}%P`b$e#G~#C+;NIZd2DLp9Yl=weP5U>xtEC&z3Tsv%geC2NjOK157q<# zX4j=_o`K;NoSxINNWJ}Dcz$w))+k00yQ1ycCTLj-)+0hI5_t@_5~lEl4Pt7FU%awx zwd91oljH;OEj^O2cbOqxTP)bKcU|N^LT_+%qOWM%;`uqG(N*1)UimB5=+_?7X;QPi z%;X-^1Mo0=^)xK$5z0NOIy)_ddpCrG!-{&+paZEHSa&_?3+avoY|Ab`t6}KZ3A6%W z<-gneO|0lL(0!ldI0mk$waTIsXhMOaJ zKTiv5Vr$}g=zeglI>vpM9v|$XbX$gbHK)eSNK9a9BT63kPIG)mf{P61Yl66H4V5Bu z<9IbTs~xx)8jdosOw4KOJASlfs54+r#EoaV>`$(7OIa<2z^Ua{TDl99P@KyK8AlI{ zF(#TeiVo??1By8+H z?#I44`Q7{jA``~+rl%D$2EA}cSpf(~YRVMl=|>hLUQ12a@5Z>V|HyQS(No!SW?W)Y z+~5%z_XSIWV034J=p8!2h`XNWtZD`keqT4anuBDM(6=O))$v_ne++p#$1x7Rg7Rh{ zk)0csdaamU?^<%zqj&&gx0y(nKEhKE+NQ~maP@5|QJw=48+mvz0euBQy^l0oxCL%V zOP8!WYy2H;Lka77m!Jxlai;qpCO7{p5dV|G*MAuV`

sG$G6~kavsaV=Gg9Do-4PK)KP@*($k{@lp4#h$d-R89LMsBMdG?) zi53_fAUd|n0tT;W0k1vxf$Ax$wE9)XJP>Xdk~(_$Im&z_=KWDfFCc9>AIEI*jB>WI zXVwvCW$D2TLUFDW*n}05^gHpm;#+t9rO)iEQkt5s?jo8m_yivGFkv=EiN4<73)u&y zm1Ri^Cg>%~^oFlOz!HO`Z&{(~hj%PCOmHjC_?~+?PXN;!*~GWT?;}5NVN3u274rYq zGt3rL1=Qq$dE@f#e$KCUUtymcv)(v=LE9&evIF7j#!BjqWEDvxrDZp-FXw|Tcpmw( zZ5s5Qe1CTbtuqY&bVaA*;%&`=xQga;enp)n+9_i6d~t6(OIjnw1HGPE9k7+eF}YVe z+bZUCl=!^~FvVtx0bvb)M2#yaNLIFqFxjH{PrF@4YO~%+cVzw5ZgzjQ+x|8to9t)t zCEaZqER>EUofVm}X5!nRfz{4FmFQO)nuEFd^I$3S16gmv5Y%cXu}mz8Z+8;je6?2g8&HaQs}; zklc}~psXgdY{}`)ymtXwMw@*g_$W<_3s*W~^x!Zw-z_|z(7whtYT@$*Q?^J8Cy{A9 zx2^pz$_cINfG%?TgrO4)?Sj@jDX%+!rs!1(#xY_%F_LkKW7I`r&gO_g_!BuBw;|e0 zOETTdI{jpuzftaPLz2mU7M;=k35OZek)-__W$Tzv!9Tf{T%hj)-O|wTzK4?jmbmp- zn_lEFkqrQC<^lv%Y*DTS|0?mV{|G4M|05t<&;qCeuE@M-6{fXq_Lt?K^P7vkA2|Op zkoKaYf8h;R1)v^{q{i~6>G27O>O{4C<}ZOy0tO5~Yr9Wzw6;4)+UUhVcaw;B{>G!RV9$Pdd=Vu8w^blpwhWni->I zL#YqKE!=yr%e}p0=N`zU2j+9_k0CKa?^7*^xN2rQ#aV7)5&U}o zp=;syY1=Dj@U$^RkUM&AcU%Z_s-UiY>n!6JQfFuZ_b6YJ4Z6~gY`6C)TiYNbH-5pk zUwTes-CSwR#fSS?j^_ojot|j|wTad7Bqhgh^kJTZCU5%jw$@v?3f(*fRow1=0_KO( z>xhR?%)#P!L8;0cLpskKNnm(D56=RyD-GiU~aC&G23A zP^;dDo(B+3O1Ym}N1ysuL8dg(jq#A+~&E0IzqlVciBz&axzZ(tVc}*03rRWFvaUaG0j121ZAw? zfkGjmT6Ux2q0x~@q{b4l0w5(L4&NOC()NK-j*TzyFK}x%%vSaRa0b+1r)Vc0L~o&( zrCm;+(_T9U`IJj47=;mD5ysyqZJhZ?W`RHy?9{b+CL|X4qD7~rWC;>1X$3$>af?@P zn6hJ;mep_?C$ z$&pKhldo}Beb9!O4}eU%5eJd@>J*`8oZphiwSY(=c zpek}Y|F8jk+fEy}2AO+#a&A*fb?a~#FKd}~_(U@b#ieP<^;m>VA#K?&fA~s|3FDg$oh>$X)P%y+FGS^wWQohL#54J5C7aQw^4z_b&7@yc|y_pC* zUJg*W(h{es@|sMBASI=$+a(nvQvyLjCj{Cv@J$x9zHr;_|@&y%uQ z#1W8Ok)8968Ej$MkWNhf2qCz@A%BavkE%4&?}R}fspR_KB1NZAq2LKyY4osgodZK_i-#PoEs!8CKjtRi{B8dqh;MI)$C%nCDeIuPPA zTXoQqBm4sLOLDVcv4q7n3&}=P_(5u|0-&3s){RZ3dOMj{(6hgkgKb6Y8QE7TKQgY) z1-gQ_aRgWO1b%?MZf))gZ0_9m0?z&csZ{kJv4ndcg*M^|*`UrY41)s)!ipnkZ*OgA zeT#gZ9n8*}@dN&oK2E(FTsN9!fCMtK?h4P-qeGCgD}q^4m&HI7 z6j(Wc6Zv4YT{;9D3VCd1M5OGXUdrMg(!-;S|2^Su?wm7~VQ?i%S&=*%876ee zR@g!5xXsY&bsZ$)(EJjA^XD~k?BH+cQ^`Z3%_{ZG4ufQRmFlwB*};PGAcIr*w8a}!|+iU=H*akl&ovrYWkLNzD9(RPJ746JBGQA-nA7H-}czg3fzVx z6s8i+2Rxx>ovvBr!06F5U@I1d&3=8AO6^ryGwzs=ZwUJ)%h4}C8{D3SJn(THT&4X> z7NYL$DdJH})I$BRE|Yj&e11$x^f!3#6;&MF4?aq_(>61`-_0MnLgkyOQ*#c5$~9*D*(GQ@YvU+G4bD2X?) zrzOD6?-F@wr5{j>;j>)YYYsnx3x%C%S^H%K8P;H;?&ubc| zY`G_=uuV7WTxY{QwI1hJjpv@V6rURrcNJV6$JzdqWZu zTsTFl1uyZ5fP|qOlax31d|}4(Awb`ZKRnvz#Y=AvoB5|q!@}CpzQuKKBBeIe%%A6Y z{(8GH{8!+=%dql43;8i6RzEkJ^olOO7EneTZ7Aog5l@X+IMB^9yZ=e?-b%U!mkd0% z>qqX;s1Jta4>_mQF&-z)>pj{K)(6}3rVoGBpIS^=-(WHJT9`sBYE466qa%Z*4B9+M zli%3&LmR%njK~7cp@5Qq-#9(m%SNCm_ARtI2jVD)&Z9%x^i*sHsk?tWE*WkSq=qET z!!#xTnV$wC$Qhw@dl}uv8{`+9{=!vl=PXn!`OUhMOM`RbyE_z=G@#?Zr{DPZ^b3As z@qZtlJFveHyPP;h3TkZI;0xC+?sH`effad7<0h>c7%9OU#R>>iN=jP}U&X^C!7HZi zyrSTH%e0^3w>_Q2JJJICR3OfT^Bq4EP#HbN4&ThXhHNjZ)ve$ z$F==H?+7|(;FquE-u(KKvcZ&`04GHR0u#z8!rq8w1c7pZ;fHg-*3vNwEV6Hx+%$$q z#Nww);{dQO(HxiLj#{uemU>eFvG1(?h+lwxQe23S({^z1Ul3ku|6C$3*=IwakSsi= zO{X*pRGe2a%loq?rWGB1*>SU#&S@UY_a5=NN{>+8U)Y*f0>o;|WFipn8iyTJ-~hS2V}*^M}C$Ubei$G+BAZA%$~Zfv#3U5eTtRrh5#qNS`=y7m1 zt+P|#+q_1|4j%yvidIOl7p+puh|{=Z;GaVa@rsK^%qof-_RK6(_q@|Ku8N}KWCyu5 z!+a=lkMQOXtaSr1&PF`XuLg!;ntS^if{#5)Lcr~RxorDyAN6yB5EV{nL8Yu%HL^() zYkJ$@bKPzJ>k5V;kPfVV&YS8A2w9w`54{$9SUa|@_&6;qFRD*VB4w$z=PNEP%D=FH zGOA7uwkMkaky*J7%L-){M}F}=RrqXmh%A5_CQ*IL3{9;_h0p*ZF+i%yuH@GEryW1? z5JmL-PpOzYKBA-(L0>yP_c7Nj8TcnmcP8rOrW9}}Rkr^2;WdyeV1{$iC82AzZ}8x- zFzfOnB6HYQ+&5s>CTvA2Gf&%(f?L0eW<{Hh#l!KDCEeYaCWgVHfD8uoMJ@#G+GMZ+ zoM%q*_{@L?`Yw$7AhV>W_3uajf^Z;2t+aYF))NPtEU3PZS!(2XH(1UXgFXeZFhudL z9?zHauOC+rAz>a=25NGSHYbN%6N5mrr@H=YDtH4A4Bwy zZ%yXD?`u#cfQ$ch_pkr8V2@8rx5A}r2X<2 zBhn3D832xqq5+ThVgC@Mb6|iiR(j<7$H+i0g*7IR)tr<4pKG*)I#a8FCsg>Xl&9*K z`||tNl3Ja(fcpOAA%wDJQ$^f!B`F;_u8lD7B)C)KMEY%IpkQaC^-v0Km=Evd4z{rZ z3J0H*UfdU{BGWdS#9e6~>T26T)^?y`5gl>eI&t4sZ2ebW%2)Cej%fonG)o~}$>i7; zv}K2dLz@(=&m#gBXbxfaIX>t!%6TXc3fCd~-s6MLu)%fMpOcuqfLvwwx{M_`F;f}Q z-1wyCyant?tH65E$Vk2x?@g?Y+^an~&7H^q(_KFUT3#esfMj%JTk#m}N-rC}|9666 zmjkgVB6!d>*4KlZXPTN@ReLDm=e2BXp0LEa{uBT~K)%0gt4w$r zkqpJ{!~4MT=5EVF1akjjqqMkJab95SH&xP}~6mM+j zUdX0}0OAEqi^qek1PDZmzi{lHXd0;6;$zd6HSAj;cYT&1Zy1iU*7UwG2Zr!4M+nmf zwM?p6ws}T@s704gQW>n)h8`PcJN#Gr4;$P!gX zao1oYSpbCF32-A47;w+Bh7+)&!FQ*l|FHd;7g&HtO?07FCe02_r?N}yIyYa+e4PDT zCpaVE`ai5K{_hRRAPuPe@|Es$qrNcg?JHI zBQar_HXB)H8p2t%VR)Y4KVlMZEx?PcZS=YD>NC;u9pJnsR}+6Hw>~aHfj>P}wIfM@ zIi;>tRyopg;2W)98lbz4ZcB)Y3pO3urR{J$62=n^%aqMH7DhTZ4wc1WhE6s^m-}+g zt95ng%xvZNRc5WNK|#B)l|O<}FYslwvSR-sC8W1owi`)tZ4B*IJ@b}kq@vjC$=^5k zbHT+fis0A7M%pj9B4uNx*i6W?RtG=pu@0%0B>F!c>HJJS&Js0PAA3lmAV$`ii=%59 zT#1J1+Ch7iWMsN?!S&FI7{Hnq8Wj;rqSY1QihRdco9?-M2kTp@H_?#ElT6XddlX;x zUIoZR{@&0m1DlnWT*{qU-<}vfGxHO1YYyWb2KEf!Z`CuU78OP*Cpz9#?;YmX30_~P3~ z8TcLVsg*m6vM&B zX>*eX1k*A#LOy>eFfj-RP$W=*UTQZtk=KPbp<_hq*(Odv@p%`?SRhLpf);+fIImUS zFHzAW;ZDSsGT{m5a=)`=hAEmIE!-|SPMH|#v>8G4L&`WkDVirGCOGfTE+^tw_2q0g z4vN!(w>t!mxIt};3EQ;v?wK@rn&RdTU^2|xHQ?{8C5I__gB%jX4$IBP^ zMru&0_i~cITtwxsDT<^dow)&1;Afx+;sy~NhxV`g{u;sYApM$)H+pD6kBSzJw-Thj ziS9OKXrnX>te=MITQ|*esyUq2l5J>QN40Xz%$c!}P(ClYhE1c(7cL~>hFKv>#9%KF z6A))2u-rJrk8G=QR7e>xuq)B$0|RMIj2PV|@}h2Hxi57CJDTDwXFb@V>?PWJG?h{o z2aRS51DdeY67nveOR)JRagd`-zw3#7Q0>;Hn2^pYo#QN8YX6AVy0QKN7mpEeAvWUz zqftFTqb&tgU8l7HU)IqqPqo0rDj6*zKH*?K;c?1uXMkuZ3e9ef;XOjZ9Y%0Q?a%*6&lo^n-cpZn_hq>PH#= z!?u+J7n*V`Qv7Ex5|qtY{!J;dvA;s~9SNA)F~_X(sLI|;n~R0BGre3Zh}JJT>%FKx zM6|21OeO`~Ovv`$uKS6b`JerRD^2XWnl@`51Z-0;##A{$0mBEwXs}Po7Ys6h_|zuFnSdLH%kN)61hS8z zQgHB@bCQ0P_Y5Fxqc71XgBtiL`2$y2rLKvuC%cfl_7?Pg0|VP&P^JVWvLgVI{|W@p z3X+UPK~Q)9=n&g%kJ(&YtYXDrevy+_N-n-3H~j1vtD+Q6!``3V-87ctZ&R=M!Ufg1 zKb)fH?OHuNHw{h0!LJrCc>icS`QROL@+2KiV(`exX30oCnj0OwZUM8bek7Y!cEHB=UVy%s%o1r5=!gk60oeax2qt-%Z zMbjyY!^YmbnG}{3>4-LnhERAebmhe{Rr6{l8Oe^Jr7Her5F$L1c;$suuQQQ-*)D08 zPP#_~#}I^39$r&R!A7Q$Ggt|yJS5tMV%ByMk!J8ALl!z^8jg8}It4tODEtP7@^pWr z{I&x0%a!|wB7}ND&Gc?$JG}mYuyenh9&u>Q4GL{bBj}M%g+h5Hd?y8}0=Ql(@5dB=*=>lj zI332_(|cf!q=HL&9I`H0*qWBNj%~L>V!o?N2QniP4!i39EOyQrrG*>}Q@%)naG&oN zzM=ICqd|sBTT@scyq8Q85cD?!CAc9rID(i)rwWtnV0x{~9tAzWljFh%@1_703_{Je z-cW&K`0RwbplPh{G>I_Istqf1;Gd`OKR`G)B1D>CY2|1Ty|~;7ej5+I{6-`n8&);YhaSYL@pi3-tEq^#hM8ia1b-P^6mnQlU(98B&>& zfETR{tdWgcHY&=XPdRA&C$l5BoLo)g`9-dlt+7g%YDd`+*gK4|Fr=@v+EZJ&gUqOx zA_xc^kog1N{@HZ))`oO7gdLN0@Yc&}19md%ARr+|TG1~1wU4e%kfwg4rs0Y3aMyA4vYal_|Q=&JVKg4F>8PXkRem68i_c%m@ zF3CHTul65=U3~`ndR57hgDzY2(L1$Oby=hQj1Ctx6<@GiRI_1MV6R9j9&#r42026Y zB(l{DCCyqj=@Wu<-I~xtx!s`|;Gi5>{~6mS1Jy~-DND77!v<1z7CmA-Wgru&wcS9!sGh`?x! zi@Dx3UJy{O?OshqG1xtOqWBRs2O3Z^CQG3JE><>c!veo@2>@y7v*u?rwa7*Q$}j+( zw_m4{H~LiyC{8O*TO#a%gAPe^F%miOvl|I`hz}5qtf^RJH%Ix>4Ku~)iSKKCZy6ya ziI%6`9kWI=0blf$6XzcQI-KjgTJqrqL@#YDRX$n;m%cQ=S+_Hdh&Q9C)<=+KW% zzxLao-$BpqNAx#_-tgX7T^7Vt`L(%#H3LAVo!aRi?nXC%we+8MwQ?o|cX~Oo2B~eN za6yiWcLH6MlaMT0Pf!8-FwYt{qh1fjhUKxHyRL%?&2u$7=js)ub2XE)Mb#F0U9sH6 z6Svby^|T7J87gotV6=qGAkD15(gyTVp=_%3n3rIT^~E{96BON74qCNG%lFh%rA57? zGs!PKx-mjx?O2f^e$rO3>*oT!58I+JZXH#{)+6BaRBJ5gK;a86q2GysV=DdL2zw`a z8#6&*mitgwI9y=aWwFY#rVkRkl6?LFiEJR%TR&d7_}0XDZdfA)0JQ$gA?ak#0ynB3 zVLfd?9*Ly6f;5DR1uJ&+hHaRrgZp<_rF)Eq7KLz-T*Ev78gZxIc!KCLM*$jhp{^;O z;X#OGJw<1BZGqqu+|Q;DSk_=ew5CUm(%eU&qq-~EZ;}LB;Xn*Ou|xU1k)ztA6ud{` zIMtFjmt3M%(LH>CcIExjm+Lwm2&2kgD=V=~+IPm>)lF30=r;s$O~BkAbhROv6-Mv* zc5X!33I}M_sdxIgNGwasOt}QdTsVF4LQEhWBezQ&UDlrAzeem62*O|~HQ8Wi7TYv9 zoE%)h*0;r5`{(}orW50H5X?@{PLJzYylfC#_Se4?vCy%?RLLXY-~lI{{uO~w1oa;; zBBF>0Xj+=DUhk(Oym*C_%)QJ<1U-qJq>;|8&Zb#2;Gb$*fU-+sG?nTl!wYLZ6lqW`#f2bfaMOO6<@7uoOQw5 z^ZWtrT5hXNq)ikL@T>$ul$7Q;ZajG=C-4F3l#E#FO-*N9OV3Z0Shp1wK?#9LZw5#M zxN3iB?`7Zszq+LEx>FwTj3y%+xV+za$v)>6*lsd6ImY^8oC z!T#vl`DBZuA=(usB@_gQc08fD(Ln{=_|<V3?QJ@2JIRhzx#(t2A%1+nW4EB=y^L_yjbe_yIx%Ds6rn zDsub%5_Rs;!MCeVXjEk=bRt`g?z>Sa0-OzG3(YJ9wGXdYy!U5Q@Say`>+|okv!0Nb zsQXlm^ERSRQ@~E6GOT!z(i23OcoJ2Wj@&_3z)T>Es{H{%p+7g6wZuTm{z3{IJ;!zL z*SUx`?q10`HN4eIb$exbri6vqs5Yz;(x6pR76-L6MbgmJ%gz0xccW{Sv4lSUtCL;Y zW2J*%1wZghaH*}9W(T&6n}SS^7X12!QH`;y&vNhu)EWoliA^61mwfhP|Ds@{9*A| zTc)cyFqoMG`-KLCfQRl!+lM^sUpD#ETZ2sQ;d%zmZ+NL4SVP^y-Wb*Z`%a*^$0&E^ zWF+S&+eD>QxBT%`!VQ@~qj65O&(n6S=Mg}4k|v#gOqI@0s-dETjAQRNBuyOSu_cNp ztMn5h{(8ltR!pZQU_*f8qMgs$wzMRoS>{?EdpH8o|KAkPtB7h=R+Be&Eir-z7PLGI z+d|PY5i4#Q45>$5PJ|KroBdFC@F`uN8#Hf78-A!~Y_lMYKJ+r+W}OhtJJUD{OEj}$ zo1%41zn{21n3329{vCe|lFkIWOED?ZpC}{rstaw0Sb9R1VPk8OFRiZYdq>vHgLJO%3;MutPXw(7^}2}O};%HhT$y!K}EzH|$$JlNbU5*hj< zHSbC8NBJ&`r9rGIl*+-;ACR6n{&+FfLE&cHMa~Fo6{FRfo>+*g9uT{*r%zXAfjRasFU%U&v_GZO@;75H~j{oF5 zUInw~7ewl_-)Yhwtw7HGQOw>3{YB=@DE<_>@m$|bb;D@5-eH#+ub>6grsv>gc3z%_ z{*ydM{>;(*Xx112L~G<#*Hn@Q>C3F4g^*{W1~$||0z6o<2Cohi;NLf*y|vk?*Ij;Y zH>rcrr}~08?hEuqnzfp3y$vVVR! zb?ViqJ3Y7>0yGM zQlc)%+pAk&_opRgohSz_s#--!17%io)9KSkw1breEL_;UD705_xmc=40P)M?nJNB?@j+Rw)ebS!I+z_3;eo5?k_!spaq z`73Dv{Y)mvShVm4f-jGms%At)(v>QNri`yY)2&{NeE&pi=w*9ad1+BqthJ%OPR=L` zd_&(X=pZ`A#Kv>y-_6Z6)}l_COK>XzsX)ObY&+(|^binXqbL%g+G+W#8M)@w>l?H< z?AGx?L$S0~1MvADs<;%9SVWvC%!BpgkPJy;YWe)-hDrkaEALDYf8k&v{d=vLU0w5? zrX?`HGMiy36005dRr;dW65m>r`nCWlG{P}g)MxX~!{gh5bGO$4FW3B=6UmjpOVNFb zA%{QXp-p=|9Mt}=s!?;L4ldn4l_Ldn7w%3gbS2KxT2dHd8-`_{`OP~@K?lgzyYezw zWTB(28}#5U?#oSLiUy)Ka$9O{oZCehmVptvfQ{^J?Jz;C-O$b3b$l0!iqrOOap~^* z2L|2V{u{(e4}`}yW=!4QAO!%i)V7{1XU@Qem{K#G5}tC}vwq(nkKd#FA$t`dAAFy? zR()D^7xF2J=LVdWlsG#yRfd+ZrE*fHsNh=KB&#sh*Xnh~X>~pEP)jA$4aEdaX~*f+ zr2L6CQn^+Jv`?f@!S6=#L?S2fe1^f5WHyM7?vrD|lCJitj-uI;A#^n9r2d^P61?N# zwy;&mlhT;M77D!YirY8Q3kY{a9_yTGn_hzKl*jT5F>Rm- zvTk#c6o$yePp^lHbbnGVH3vC#4v=lKN_Wux^}hidHT^CcP3kgqz2EO3?BKQ-29?ej zYRXb@qW_CIIZ2frH|nB$v@U3hT-1 z6@)Wkz(3Gl%ZoL><3$$J1q(6dMLT?GwM%?*>(^guc=#=6tgP%_noeoifNJfGp*$jt zuq-mMPOfj_?+V`ouG4@~CVs4bPlIMd>>ccm|2mf7eaEjpp9J<`+Q95+N0Uyud?>jH zuRT(qK)tR~_xiP#*}~fw7Q=F$Px_dL`g`%(7H@(5ZY}}|eYM{FWWg8!tZbaMSW+Ak z#DOz5EC9;)`8~8w z5;OAa5O4Mf&$DDbDNV^L=Mgn&yFHTcl49GH|7ree&Zm4s@|!m2?zfbwKW2wdJHPkM z0nclG9L?>ozVA1eue$)Q(IU#YI)h> zNtd0Y1g)i&zX{7tI{iQts{$vdJSlWd^wN4Kc=X7eP~~%roxKA1s@+9vJ*jkS^rzMG zJ{fk0ZRA9ywSvSi(LnbdIl#6lYR7IPD$s-cEiq!YKzE*VtDnA35I6OWqX4EMt74u5 zjdXXZm)#qeiF_Mot%+rjU9(Mz%R6K$dR1$J8AOMU%LL-zqKK;XQ6m5Fh(xQRRjzT2 zf9aTVixazEZ|MFKVQVo@?AQd7J4e<^BAd8BCsP(-m;U#y+Wj_xVC4k#L&sCH1u>4P z2zsau0b3fmdsB|-)!mi9@8pwo5a6x2aW2c7zS_i>43}bAu8)pffG@3i}S_C=!l3MfOLhgoQ+hm3r9SwQbr?m1J(*~ExJ^76!eP61;$So`L4LWR)Ma^94cfSWe$=` z5*NQ^gm9P8rzuNkYGT=5G_>j!$qUKP$Pj^iPF3@US!t>QX0z$Z1Cgt(-tmsiD5CuU zL>+=OKd%5KQmRWsG-`5|@LJ2Lo^*;l^{1x70dTLI5=J;V-+^eB=GOp$ZW1f~{gQ^f zzy}B*8v#ihfE&;%)K-vp;ToHSieC_ubmGFr6ZKiXYZV>XT%A`$C=seZ)MqeQdZCLBs8oD9Vf>ihDhX|(N zr%>_lLi0VEhY7K@`AzT1C-CeOa@3BO?bQsP!YB?2{iaHZE7x-#N<@FMEkjNI02Xkl zS(T-D!~TF_*vE3|u|}C48HYJvg@G%hc>|XRW19`A(R#6HI8}8|gAYd_F-vr_)g=3!l~l!G|9{M$8*z#@w!8 z(b8bI8-|j*y*Idnw%fa9y#xs=M6rwkH}G^aG%kW|pYjq?*R0rWh93)Kt;&q;rzz(h z6h(=4x${y!>s+Di2AX>2y=$&LJ_-?%O(%)W5o+gU)Zl&59j^(%Q^`4|+`W)1B<}+b z3I(hU6F#!fh*6`ly1RsZt+*#e)PwpKIU?^5CIZl^KR`K2TMkkVThy~^GS_P?bTM<} zTaMo*h((alzAx+FMyowFcP93j|Sc*889u`N&wA6M-fDrU-cFbCgz|Rvm z(B@E|cL&q~>?iD}RD->L*mM#WB3~$o zZ9RFxUknMxyW^enGI*mU@(8 zzp%N~*Z>5j#UWteT?u}FS9pBI_?N@X=yH~c0MGMUXA`>8viuUJDjKZ~HsXe-(k;!= zZ(&T^K-E)Y>w4!M<=~*$bzzYY(OxFFSA%=7VAq5OkKaXosB(Q#?VJkG`RMY74e<5i z=_&4Vp!_jSMg8+3boBS#Pyv`GHgZ+De^Z zh=2a2j3w8;D@Fm6il@rAyy{T6WTUaxh)OFBaYU!444;4D_V(_UeMjv~1U@m#+>%Qb zxk`wr0?p5x&zm<`vGRh2;5WUPq=O%gt9oNR9#n0mF)Hq=ij1L~w@qJq36hf_?X^qm z{l=0(7!esDq%Z+h5dH?Qh!|>dY?Nj=a|k&Z2dywkb3ZArvZ_FIk--^86}deqWb}ZJ zGDK?f4C-eb$TOUTI|@(JiPufP->IjA!Q<7UyE(~uS7wqdd2_|=yXGBC6s{^N*pM-J zwgT-bHH%^9T!P+Skt0xQK=Zs^L#IQ?WGZ;b*pAM{`|AKKvcE=TY)5hrrIHDuf-GI^ zk$R^soEMy_&%{VtO(KAJk|mNmB@%c-U4G(1m)lAG)+su}w>XEfk{eyaR=+bq$WQBq z`bTUkcuhMB2(gtNhN>8BVr@8FB$4sVOM~DMXG6E%kn+ld)QP_HbnzkhSE;MKo$l3J zO#I9FJ#uF=gss)Z*6AG#%XDQ)d_+4h|KxOwQF%6rxTWSVb=nxN0vjAXvqp_Jqv)xY z@x}BK1162TI=Bu(n@J=EFmA#KkLX0VJGod6Gs`sVWDsY=&oYzd=r&jDJT+I#|G{< z-+)e4g8O?AX>iY43^=PMSHW|B&FGEQ&F*)vlY4D?=$Uy4pE~71Gy|U&5nt7hwZi11(;8PZFnmxAH&NDvu4f;^VVU1|K zx%7j6{L6ciU)`_+dAIm1bR$zg$n2BcjnCgP>_4v zJODGEMRk?&V^n$nh7L)F5dc3@;B9M~i;gYaPygC@NSXjV0re2`5BiLwtjaSSW#J6i z?EswqGXFf^b;A&CRPA>i3*WI2HTzUNk+^^K7#0kX1F{2RHS~@H@cZ@GP7EzTP@czR zst{jxb^R-*5{1>ZACATa{9Z9&4q-lf)_3CoVLyAvPv<(Qfr}S#*R~5$K7+_N?VVc@7He9Z?n$Lv1Ga=~ zFGX)K=>4levG{QxxxIY%*6!hI_c75HF6Ihy0hJ6IVIF)sOk-GlYX#NDQ>-ECTZM1n z-C8(bTa=qNXxYuej}-MuiPY)UF^4dw3P(WBVS}%-uMEd9{WPbKntKtv4EMH#b@XKV zr{4Y0ul>thD}Tka|k+<;>d4Aoq~|&lffJsgO&(Lrhz*T zfqfO$p}J~sJx{SjMRrARGK^tG??a3wMW15yQm2=uVvL`Ps+3)8&qFzSdWCld+Wi|Z zR~qb|Jb9qR%ZXZ_fJNf&8&vg~29aV=jnJr*u{)qmTk!8P||7l=;Lw z%gF0Clm=c(?|Hdq3zy->zP?GL2+YoB;<}1fCpBXM|IDaHd2d7Hke zL8DHM8Xx=cQY5@fen;z-^y1`lMFeFD>|D?uL-Me<>N*`Z7*=ofnc_9>p8d03}mq(NkUF!d0!+pX@gt z*I!A${i;6kj75eRJWi^%133MgPeya`&EYl<;RY{6=Vt?SApF z&<$5Qz!39r*Y1Y*?tH!V#HYM_uePs1!|&L7(ZB_X6`Gl&KkxQsTmE8P)I4_fG2Iwr zP9tGwTbS6{&eGyoV+~{@w^Qd}7TKy~-vD7?L3-S!8dMO7^1mb7#@>m)Uk+iS!T{V3 zY=#n<*Qav~JRslxt^KUMl)Y(H$H)&|&X+mm4gRei1?7!m6<}=1NiiI4fM1tF8zwxj z;P(d0^E()s_r{GpV9eVuOZ*EM@pi(K*xIZ*iB`pbl7_lOAP8&7A~7AdOzkuj3-LUg zMn*aXGlQzLGe@pXzZYFe2^i6T_n5n?V2YevajD!1RFo(ub4?njGGLevgb)op`V%Y2 zD-Kgi>tQm=+D)7$*%(vr)0TUHDW4KOvftiS+JUxMi0J8_K!|E=w$thH>A4?IwNg7} zCw-&u)S)0E&5#0BUx*7npEc9m^kH2EA3n~M6;#TiynE4)jD4pR@mYQy{~{yOX)ti1zc{$u7=RJNRM&hzuwAE?;KtDU_>(;hOsS5!s3;3o+B ziVV>Tdx*hBO3b<6v%9bT_2)>}H)}ICwpmO!E-^7NITC?u*XFw0T1CH5=#U{-uQjsm zclXVtwPhOrVdwrmhdF z_!Vmrf~xep3JT(Erc^zRjNS^X&VnUgM7BqjjA0@X2o%t~l+4@?T`Ox+l6v^Ov5so~ zUWP^qr$w#-|Db-T<>741E{5S(gPYM&T`-Idn^AG1x)lwNIRYn z|3UvnK(hzTR(oV*tfoxM>?cXwy&^AL@UQG#ZX&*V^nbepzHkB6>d<5MjMiU z5+^ zA1rbcKp0v|es8{+d{_+JE{kWr_6YuRwyVIjN;u_Lng#y#`ia}_@NVUm9M*;Rn#Db* zY=ApFH~G|f!b(xp3Dz_s{FEHR!@ZDs9Fp2ZT9K>4`32_@02Oi$%KZZYS~*NbMbI6! zxQ10Yvv}G7UZ)q;gfli$j(Mw%1vwaIE^7nE-9610pB)IA3*gJvI(K5@6F*$^HE{bR zG6s@W6L_NwDp{@KyT?VeFY(Gty)Y)tG0BBIDE)j-Sr)X1$|S?#5-qz6l8Dbo%~jB`4l zo0j!h=@8WJm_VwY6YJ0j{pe;7oz@zljWg@ns`{^Q&PeOmIdPt$6hIOg2KS? zI!BN{8271$nfnp=PAZTmYKZbH%jGzv_y@Qzx;*MvIXrrvXZ4OFP*3M7hsvG!1O!%I z<9nOSKt`S$Q{b&<`d4g}UnG+LyCdS^6Yr`KlHoMXw=eyXhrt0$G@w`8y;_U{Q_m9B zk8pNR=+7oZ83-0e6)X3M-0*rfCp*DqYQvtF)C~xzVX06IfBPhW-8l0sVoNwa58q02 zp_>l$Biz=bd5Mnbd*03U5p*O`a9zi0x_I4r+W*EG`-eWJ-toA0RD)OE@kV|nSK{Nk zyi>$4|AJArgQbEm3_|PA+iUZ7sM~1Hj30I-yP~AEe8{Q!ed;3hZ+@}Mv!{<~EJp5b zVVrVdM{in%TB9~SO8!`<7{xGuL~y?bJIL6THi%1(vA2ZA0;%_kU@_u>%8mZ|@DfLI z=a3bFUjMb|0L8L|{@VHt)L? z4fkI56X52|B!R`CG>9S)95Lp)y>O!Mhvm+0!OW;M5E2?(p8d~uF`y?+1qn$K3Xgy& zT~L&;1%|M;0Z{1SBoxHqJ&~0^;NlnpMXXR^BJi%D7@ZDO>f`R3z%i~7<#7!uhR!iR z4D0X=Y3VERB;f4BQG=3}9|UKNFL)Dv|Jej5&HC<`@qTmjKNNu%uu3+mej>xZH5T2!56dDpP)g$8N)A0flPH$mUjf$1rVzHQ(58Vr1N(Sfp{|d_hrP~&fDkfQker7qi>J5c0h+{bV%Yv=GY7iqUAYnXCeQ71 zePXiQgCS(}zDKb@vBbWAulKQeZ{(=3XWN)tt^@$A{Oi3Goh(*8ez#60^XYxu?7^PpmolW?` zS<|!#gG_Fr(f2!;WR5Ju)uT8tpYsZL@*srlxNct~#jq{A^i#bV0J0RO7NCQny8K0_eXy#xo_0er z)5u;oEk}i+u^{-raN9K~fu$e;QtKB0l#IVO%tnPvGt^wh9%PF)Aa}Z*#hSG~`*k&_ zLmsq46T0_1fWhAmCU~b6GThIrIFjV&ZZ~L)U_JS-Bn<1{1PztA>Ft~0pSL5#@AI~D z;UJ#GSF+>dJKt|IpXvS5M&X@7WL)12PekOLv=?C~f(X=(*Dv-JOw@~IbanFT_#;e1MN_Y_bX0PX!0hZM&p(Fl7 z@^oYAAu4+i{f(RnI>s#rKN@4!^; z>1@ihV}+>o^pxv|%5G=FHKu`mW3XQf$-eVzjSxr%8zX*-PsoscS6^+MnNl0sKt1~l z0_wEg)<_SALoOu?A7b{H^Xlkj|S`d^AVoR%OdsR`zCWANsC6 zX{#E#v<@bkMGf{}3cY$=-(K-+G5JfOFEsj)Iv7afUl*lR;@wajf=G?o*_{i{eJ8FHML$>NaBLCzSi)s7zC3yR{SvJ6GN7!a8z3Wn`PS&t3_l~O zvGfPDXuB1V9vuAx&?}sf35Td*<1Fi(VT@|t%6wW!_AETyX8)4+4;%Iu!x+f3_N%`L z8UbTQ8BIiHq>zqIu{V$)i=pK)r!FJ7LxBI<1VDDi8c zPbbQ%htss_k%*PGk-Zqn+Cg8SU%=B%rHXlw{#i{b+kn>0+EIq8)>QgazJ>V)NX6Le zPqA5P{ux|qn&MYz0u)|piZdo^0?5J`DskiL%666u`^ArEhoO?u4>bK?I`jtP&lR8q zk{hvhKupmY`C%X?5ui`9p(LV=@beCT`wN()&VY&Bv8`U9naRM^VYE7A{|q6Nw?4jt z98hjl+gli)0VD&tKomlTf`T~t88he%3ofvUTvlwG<48h&e88zb!aGJ5jqS z#ol;n6MP^}J~QwPO1H_VJs@WpS|bzS{YTPkYgAxaM8hhsO5B?_9Vzpw*x*dRK-YLA z;F-SKFE1z-)3$AttZ9rfP&=c~r$BZIGW=>WOvsq1sfSTM3E0)~=0V5RF-}d2Rd_K~ zO*OI>H3)f8?k9IiEc$OgjdXH_BiFjYc_C@ia_~H84NH+;HvK0kv-?ESl$nY9k`({u zch4&EOmSIy6utD zuG2m3^~(@er$yQJST02>7;%JW`@#B$dV4Ha4^;|_kBB;r03?$Ky(TaD#oL+T46yVs(;*z+wJ3WJ{eo89gKcg3D{md1@4#DdE)=g5&Zb8}JPb&Z150EnB;bFUHa*ta1y!ndthD zP-icHXb=RRJ}oo-6&YPQ9B-YYK_;U)OioYXhmu_HLat4Wsw;krhqEoP(v%%TH)(?) z=&Qx4A!b%IRhU+V)VbB&q7`f*4aE*|aE+KvZQLh8ti90cn}{x}tFiYS^gZ{4r3~?; z;CTRAwA>0<51!H8LJU6W{qyy3qRK-Hpu-0Zn3>j|oo<$^z1qtLy?>Z7y=t)z6r8qe z0M+B7O8y9xmh2r(!J=O1jg`SlcRSYfha=)%FZ2ehiIq0#g@tTX%wY2SzUh8;GL})P4=E?IHH$jFC z-F)Bj$FIfIN?yu?7S`#rwr(J6;d7zIL*exG2nkcth!m}o)Ks4!QyMK-(sQS40FbPa zdm@{e`(gHrHUy!IjcqK0MXlinqR+ars!6)h_Pn0h}tG^`uBy{o4c z^$YGMKyA)Z*>+>2trIAu-xGr|Bi#2@t*56~#f=u6ZJNV6Zg-d*>mfRRbObZ0qkn}o zb^vNv2^q0}IKy3%a5&gVjbEaUwt#JrMV13GF6S?ybbAiQSNho!8Q{*-rrP9}!-&Dg zDJyG&%~-qV4g6(LTKin{EtoaeZy($XOFa{2IA2i8Zu(QPEMhN{c1%pl_uG2(?+4zM zKQCkQ#lz*6#40XzVT*IE-I2SBO0Lvreb~8#Er*b^1L;x_Se$yq`uaNz^<#!SVsT~}9EuPk*8EeKfpzs=Ux1okb1oKQj=5`r0W;t);egyqfxjQC72w ziGaeP(k_*sm@d)CHDI17*7i+igW`R&u$A%U(dh=U^dKEPTbW z(N<~0*I#gWQ1lLc@Fb34oordAD7-F7|IZBYUV08G>T>A6G}r}vu`y&CX+u?UExKA*_R+b#$)VZnF)mGR)y+*&Gr@!% z%1JAH&>T=$aS=pe{j2s3Mz$?T48ee+O?LigD*-<<7UL_o{nrt!s#}>3dO>(_81rh@ zMu9K3uL}bcF+|6lKNIx=OO6)IFzg!vU@=n0Vt#`0(CR!w5C&F1_dMYB{E-vY*`V4Y zU7I7vB*>9Ny16d6rx!K~f>Ss!;+D2D-@!*^Yf}3}oJYk<(7k9hO2VkC^1Bn@EjvGw z#wMIIQxKlMPvGYy&r6D;KE13e`ha_<(%Th&hS-9rSHFy=l|&Nxlm2GbmRyM~noyc8 zIj2S=Og=(|$$aak&qojp)9SMY3e|K>({UIvc(_8TiSfLXimiH=I!M*g5PDY5*ntk+ zjvH-mxx2ANi5h_K+`0r!8*-`v^p#YS5p8GnwJiy_;r+14-XHTb_+B3w#DyudP|~d2 z4?F$Bpy7F@)JQ0Pm3wuTo2XLDY&vp3cGiD)1NugP6La~X&O4uIg8ePM2JO_x9%?7G zW9(U~WkP2=t@wyboBWVVy;&$eQwQgFr2$X)z^PuOeu=3v-1FA8ok1`qqxVp97Mb2`RwD=(r%%TAb91H6+E1-v193-RYS2|VW&^XgBg z7qO~>?k$zX=XsV6J$rve!&Sq{-!QXE*TlAZ8lm0i(`)Q@a1+KzP2k3v9zetYL9>}Q zbl8ZL4D&NYay2*v9RLj}IiZE+Z-SmaIW*^fk;@^U;n&e5U5@|)0kq5bV)&JYiWre{ z!`lu%)mYSt*FBlbKbUx9cQy8yD5bfb+b0kYLK5;?g@)<(Nsqq}Kz(C?U{r(PlWjHTk@5^+kQtb?P5@DwhUFJ8?On0Gp_I3=WY z)IR|_ufKmwN>6lb6!U{dD?Z})wTCamXBtPduv?-JTj+NR9j6%E5t*>fZ5T2zSF6V> zi`-Q+0(smm4vJB}c%6Cohz^g8pho+x=@QD%OC3C{zFgjoI)T}sk$kfGFudF~T~cc> zcI#UzondH0SUyR9l(L=06VWOWFS>1wmMbXlFv%ob?7TkT((Q1q*!&LcPiu`3kuvGb zHHK{1K1HUN8-4pX86--LzIV;!=PXoT3ko%IRTz;S@*7obIH}Kd!>DR}`vY5wd<4>Eiu>n1(pFn=0Rb9V zuPiz{Kk*Bx8ji(W-hOk}@h62zh);XUgx$76VXOmj-ZR=E$%NgvZS0a)CGhnE+O*wP z%ZdhIrikO_;NVXoL=7r}u+Xx#%UnZEwy!Q>4cz+GynlEDo$;ion6qg|*MgXEVFlCbzrbac3ZLP8bk&h4x(Px%dsc25M%UW|i_Y3=14I^YcY+@pE6 z21Y{_I+Wda<`5V*^gwJ66*|xF0jvR0Ej>r!Lu-USkeN5l+Vti-*jGooiybCk)f)Pi zV~Auy9V0W*NDTCHtR%`2nfEvM*lkz8s<-#e3ol@QzYbhS1R>UlV720cD@1e6j!U-Ytv{3qMPZ5NKp8iPfHpE4S_Sh_EN~FdvL*e3 zbIA{yg26aykWjBVOn;&s!L)X%lH}4zjcWQ<>~Q_L-jvFLj--FbK5enCG90;{$Wl+g ztfF_VMPPyh4DahZrtL~bdo@zG-||ef%5T5%JBnqxpz%S^H?a$OebOLMz8SHFPTgrO zFAWQvQh#_=uPyju^$$e^o(-q-xFH?KaO(PnC6VAO`h2$QASL}DPG{bU8)birup)R_ z(z55|vh*b0^RjeOUJrKkMDwU8A&fX_Osj#>W%I#@euZwA)`8Z`^V<`3Wdr%g7@=8Ozg_KipccHFXd_i{v=ne8{!w=^^i#y z%ezG^bI(022#7inIwzDRM7p;%iQHGb>mAAW4mLHrkN5_ ztHZj(aL~1eCX)+P>6C}ijnYsH&7YY@*;%2-84cEu2c5mZY{qHzdJ*~AlfB?s@mO6t9e2Zz%LyCG3A|#aHEINNFh(Izc zmI()Z_lje`tORHao*?#{Gyjoym5f*^m1C^(zf40wJd#Q^D{#etkC^p6t7!vmKJGZ1 zwbyg3SD`o`1?u`W(I6}5b4K(4&x3X$w5_S}9RGN0##@Ohc_`!c5||$YBpl5BduM2d zfc47yyZu+~VXmxq5qbKJyT(F}K{zO9; ziBRXZtYV)W?rB1&)ZbQf;x20BS-@ z#9rDHE(eu?+VsHwe#3{zX=*T(PG=e`syy`~6-V2|2&IY%LecH@VAwV=Fhw9I@>xUi zb$QzMJK30fB;(6?h1Obq;K&s1hGzbR$<^_^63hlBQ=Vz7jMn%YxDnB+t-1{w75!Rr=VhNA62Y z14K>=8xVwt@)wIN_0pPG3^L=IhuOrP*@>g3v)cW_0e_;hKPE|lyk>4lgZT6?3##95 zft)^}1oBG?$|4*21#}-MPv}CRyST@B@-!ZIfO!A&hRcVAP?7y7T)=^4TF_P4{hg|!1Z8UxM%TI%(->at86At!FO1zN z{D5P3y1WRJZr~jp)N!gQ<~Vw~R1<@W6ZMHN6ZD=k=M$VL~LZ>cbIB3laI~)=&Nj zm=^<%d>`-R3=>I@j^JGmQy$A7x;NWtcn`}Lk)}QiR914{ft7)pU@-TUS=pAA9MQx2 zOs(rMeJ5+=58$lri~Yz3&;KFB9&Iz=rAUTaCg(<<{L73vB*U%zhbl!u#S3Q`XOXqR z8=OwAj+Y7B%-V!0ZNHMU`axn`XUhRq?xF*=+I`40;_daAIxE_ZoRDiVx6Ap~o$gCB z%*3u_u^aYLqHc?`uM&I0jE3AqD(q%!AplUJl{Q63;n&k)M>lZu19-s5vQ>?+G8HE9 zY_ZvfYqeSJsPjiB_<&%79`IZ*Qu<&9M3Lh$t^tlhLB4V$!e&61^BsvSL0<0A2QbYH z_^Ewm4D?YJw85g*8h_@d*G7{Cr3uOlV=(?t5thJ}rOX^D7P2=Vn#O@k_qqbwTJ|!# zYDNdHHLC%Rfl5Q_$Dk3i#}YTq{SQDYUMlYROFpz-q1?E6M3Y`A_Sm$4zKs!uQ2OB( zFosb}(_bqWE3`)s0Xg`?fszA;io|VrahF5aF(4{+jwdW`g3s>N-m@havmFK}po z#;{RCN|aco$hx|wyO31aH58`} zn(8|3sUb#-a1Z^3#06wLXd1gJJbnPVaLLXC$fnW8+=Ss|U?QTwDzr37c2zd`o*Gkd z65Id7)jtIWwl3kKXl&cIZQHhO+qP}nwr#uPq+{E-v)A6|>V3TZRUZnYSie)SMFC=o zBUHb0y~*rzE@s2YDjqHfQNmcpx@|4h@X=W32ANbjh#M6rxx#^K4u8O5uPL`QO_I{z z*IsM8;Ja;iOz|p8kEn2g&s$Payfx*eIfCQY{{9xRqBMqM zK1lXXGGHSV73%1~&la^-yFW1uzlk63?-0`{!Zxp~PeL7JLm8G{+w#2%y`Ko>v)SJJ zCpg3i|K&ka1Z3?TtG^_(`HxuZrjc_uYraUwJ!g{pxxlt_$2=wv&dbvLJTja1r6O#+ z4S=%Y)_;x>N=fN~$WD1vo#~lRUmhw{+FEfG%mzIIP}0~rv6ZZOsDu&glVV&$BmgOu zK*d;0jS86H4p4>l+}ozBUN+I*r3ecHgCB%%WB^_+r4{fMNK^sTHWQmc|D=C10JxpM z*!(}p=f%nIUl8jkf*V!ha2@|y`x-P=2JBQ28AO%Pu6ThIP)c$RjRQ>xBc3TPtkQzk zV)TE4Mhg?tSfvj&(sYhu`+V+GPL<`REK&TFQy(1T!YEOWD)zx;MH-Gja1Xovp>toJ zp`FeJDQ`F%!q^4G$-iDm@2kcUi>}iQrL71S7gAu(WV_L7=`I^yw5A(MLpVWkVZ}#%by^#^?(#2rgp7># zpCqMyKd}kQ?6t_1gnc1n5FUR&urccaJ#7S6($w|(JmKVh6} zE<(vpudCVX`4|AG)JkupB=hKKx}qI?a}H?Ka)u3R1l2@AQ(OBr7gcS)7>)GE_kb-X zNOTX#r2$y7Sr+mo4?-RQY;_@ZaUoC-1Bc{JCqW4RV(#P%m~X09R=Hd08{OJk@^-fXX@@m?afX+W2Zm<12(v zVqpO_A>7vl@h@B^oFYMv#zw-rO?7RksVZbCcr3wVT$TwZR@Wp!O*S6i$!5)<4f=~P z-z^4Vcp^onXyy|}oiHIeepTuE>QU*kIhK&^!PmrA>InDft zMA=W-Zq(pyB%2*Rv$rQFkv(ng91g-5PJ#4%Vc{EP$TSrB2V7uE+H5!O#(3G#(lr!H zjk#mE5vSTLkae*e-GcLl#klmg@fdBQ1SjjM2uxW|@HH#8<5QCV2S+cFM0u6)QKY8J} z!@Fav?U7#twlTv(uxin|6%;X@`XV9EBzE?}hD*xjUI063D9~0)C=Gw(-`?DSk3ILd z*fqM~vJxFdc(cloPnF9}!=;VWcj}z`I|#i~jyZIL?*NHvXcLSwfCDrI zbWjlp7>CzxznklH`yI2J>n0s;!hOn&K71N@TQofFVlcu# z9I>-1mVwxB5T|M3$XU{G@W;mOCMBeSbYV1ita5s(9MdY&x@6ZdOeJG?UW6T;!0?O% z?u&LuZJ}w!rU~#}cfIGTWNR5#ggjU6id(sd+1(rdnn0JG3M@NWboyugO>V78XqCl$ zEBlE8c8|9Q=vN8a)sme?!5Vyo>b1*=r^n;rC4-b;C5BZP{nRy!*Y|K6;|)8enGUpL z?>RaC8M??669rk>wMKYFQKqRI5>vH-d{x6GEr5taZUT-d)IN}_Q_zqE!%2U^zHv>s zvVlm|b;kLSMBWkP*^)lk#hV$)Rn?|g=mLS5N?96PB~y~FYI{{-sXTfivglB&@0-1M zR`5F^OE!KTbcfi8wK-OV?J{Hv6gB(0K`$(+=-a>^Ytf)Qo4mzwcI#@|aN|r}V`J|+ z@*SoVA)xOw1vl#J3F0k?n1Hs zVT&;ODzZb_-f9|s@c*%~5pARy{MUGQjx8tYw3%kdRO3sVp+yj_6T?6e65zmqD?p6^n_ zPRf7;?}RBrTk;7z!PVx|E6rg0(nj;+Pcx8r z!fx2D2XKhij5MNx|4-1m(S$%W8gLM$*tgEF7_?B<{0to+MV2B-hEQ7&+)hAJn9+oE z8gkClm@=bWnxf{yEk4}cv5a(NDN}qn%Sil0y;;8Bl93R)y?n{j2U50s_oW4m3)s5P zIR?npG*awT(wjX(#{6{+I?p3#N#ROBL8ur`v~X?MWn=mNa1uBr3N)R@cU~o4lOv5L zs3W1#7%sYSFhl)z3Dhctp@D>??I+G-;W5)y(V_-MB+yB2Q->4`%e&pO0n2?rW=XhG z@C>l2^W!i1>ExC9N5C_-{7%CiI6Uec5DHBfs8(OMjC@SiqWlZ7T}JGCqe(5nkQBV| zT|3JZbh;21lJKZfVWq(oUO5x-FsVtTk~Z7l!=E@W&Muo=Bh$YoRf5KgdARaKF<+b6 zZedPZgf*l9w@J;BOkWV*O_ND!5e!2$FwK=T+Hjy<+02a7BMgdDVD0 z{awwd^=U0UIqLMbV3;}?*-U@h9t%0;xAuu<8WX4!SJ3$Gdu-fjIkm-^2aHFXce^z z?T^Kv7~r(*8)dGEmW>zH4t6z>-fW~`PXOg`PG4eM>lo80Li!Tz01O}xeu&b_j_m8% zPD7d~NN(&zrgdE6ly=~kqV?UHy~z2@?C!-)5E7L-!3ZOa!B_`6$b-lO_A549Q{SahX?NPVVH6et8eA(&a_Z%v zCS2yh-(Py-!xW_Li3!+X9lq4R{)OTiBAVYr9)u^fV6IStOAR)6=az73WwnXy7>IMH zDSY7toeq~s_yS%m^BI>(riJg}#a&<61F197`DmBPLT>Q4m_z2Wu&}K`^7Zz?#F0#v z-{~OFhU`2tyTwru$wf2pQcF-4Tyc1Cvs!QDJAGdZj|2C(>Ox_)Np=Zqfwx1Vpq}qV z0x;L*JpYW5ExeY3j?lo7PzUx6^{?J%kqGK(7gg(Ujidt<)F#LPY_=cdpcFXAq}+ED ziWNc)%%r-UNK0l*t`t(<7hspm+b&Azq2-sp0VmY{pM8y#jzP$>@zIAIJZ81q+T=hP zfpLOZ{4)`qo*W7C4VX9Q^V1h0Q>$**O6%3t>@iZ}I{a=&NB*$}YrgB^s5jjE(7!GS>80`0e6?2IUe9dR>g5V#%q+ssbB+ElffYzeF6#I;KZzMC z>FK%Rb_BS53OI<)JVwJcg21%*b;`jrK4GMsid#s;Es(fK5j@_5mSo+wu>KS`#e7&W zi*s;&78Xr&cEMbnEiAz7^`B%pkvSGA+vJg+`6z`+fR0L!e0wfH54bKg`Jg~^TYwE8 zgKl#Ka{l|q*qPOhwK`;qu`}bMg`^#Cl$L>|1IfYh<=BwvnMYHAfirY58oAL&p~OB1 zHdCN|l8MSp@{LTZgh41P^nY(;Le|-Hmen%&j;IGo2Pm5v%JV#I#w=|PIcKai z(}7Bu`(5r;*+cNLvX)$PSxc>$%OlHT`43~BiB~a8t{53WIGJY*;2NYao=QELnr*DE z66$vRwzp&0?7D$gnd$oN=@CtCDt-p5BBjr#&(gGX=Z<~#u4x_9d=A69YYq82pE&cjWtD44V3_{;;+Ur)Q zcGS?UbjE?qU_c2RL1IK=9N|5wz!JUW7U> zW@xC3Vwy0hyNpbUB_{52VM*+?cpiX%Zz^;(m zXKoxO22Q##yxcoFS40?(o@MdXDVIhX`W!p#*sSca0JC1d8y9GRyV{%L1(R<8N} zRZ_mhMJ}u|p>6Od4dJ-o1(!P-(WQq~m8fR1=;DCuKolB%Z~^rol=h&cW09}|7irmV zs(P5nA3v{ZJLUHK40saOF~jUpOdWb98snX+WQ=E;Quz;L7L%Dewin_l;sMp@sL5BH zrHkvQ1RC$Cx1RNuq<T@I7t0@D$(>0Z&h0TE-xTf2vg7{?nh!(rplCB{JY%AM*a zZJ!Zkiy^6D5jl{-I5Y-rIWYm>-HkUuh9q~F4a;WyAQeMgQq|pU5EVhW`|W1aFd8V@ z-SK>tE_y@K7M3U~V-?xrRZpm;I01gVgpc@`8*q9kOb>vg!qzF5&OJ;t8G_^8m%-gt zfg=rT;vI%g^cZ=o-hg?-T%?Ca5i${2mqEANZ}ga+`SB9q#n%EZ5v<2u0is95^zWVc z@A**#1%#?|_L|t{ub5g^C92RqiUc?KWF_g1bH47)Ic{ppNVa`;jBTImW71SYGJCsk z@2cUe)B;~FSQl~m%5>1Mrx$SZ)1VG-C$TsD72S8zflE3rE{scU@G?D=6Kof$h`- zZn8w=qTH>Eg~ta$>7OG*-4JW{>co{2Nxyt^?PcQK#X)M{2C2=_R_5f6Q3w1@>xb}! zi-pjSQ4kn;1I&UF!Qi}tR*%o7Ku*+si@VPU?}{=-Qy0Gzbbk2q-0J++Vrg@=JP+hr z8MwAcB^W}DI1%Tl=0@n!n*bDBfh-ob^uej_!Hz!~k0(#z@vIhP_Ab866xpmZLA)q% zP+C1qf-rD3$sAipG6aczFPH!vWk+vuoH9r%hT}YP45X8Qwn&Xz%{p_w)Kd;f{eZL86Ssy9+Q&k;W`xThkSwwq^&H0KgDck0Ah9EKc>f=)P=7O zfiHq_rY`*Ac|uyuw@HnGoDxsucjT11@ZJako9fXD@~I>s1Y4t|ZVMCw(1|g|{PmS4SPsuj7ou&EMSPu~kY0F3$wIwgx(V zK{;Xel3*PRI#yF3K+H?8BO>QW>f&=luZ@gV<~H!^R(UyduICw=kre6C^73eJCiMmV z_*RMYkoOLJJ$L3bj^;G8vQnO#?^y(&ETXy0_C`)*s6~-6O+@P4=amN(8d9w63MQRb?QB1L412`bV(( z(m$iag<(DxS^F2R!&0Ahku#%&d)%!Ul9gMmmR3o6;xM3pwH0d1-_+Y6#odM!SM|60 zP63}@NlLfwCMD&%#D;4jX!ql5!Lo=CG#}^(&x8+tH`~*2a_Zb!Jb{xP6`Tm>zVI+e zA;og}4-r%jCGw;d{2)Z3ow{IWaYoUihLG=PcN9umc3P;f&8g0gJg~#KjG$!IW}AbW zhpSKPpy!s2MSNVEAb2MF3Ppm9`TJ}e!m25DpbWLLC?1yjSx;oOAB5vwP$7qwT}6E* z8%WyfoD7@9ryhjsJb-9{P%{v$rNY`H1mq_3HJHdYh>_1G@PN*x_f z^S2+=R4sXwe?G{+akUEMO&>Vzs$VqgZSoP4GsJlH9*_tA5R;ZQw>pZsBZfgK7nq`` zw02_^o1_X!Kc@}z#}O4$U}z)uj?H|!>gyU-WU+H|dVY~F=B&IALWA|FRl`bt$BP&3 zYbv}M1Vs(>C|#zKF=$w`=7a}TK+hzI zgo*?X((rW-KMZ=HT?k#>z>BnRmMUfdrUuuWV9OB4KO2B0{hbB<-RdhoWO|qBlcmbc z7F@Y}y}YroGP78?{LkXd`Kj{CCF}C+dZk!6Ynu%SV}b_^4~(;n^|0=Xu;1H0d#7K> zs){*Dol^1FDOBmL^dD6=PUyQFlmyv=>Y^(5`Jgd?0To}Sah&iuAHi9 zuDt%HuFCRiSTz?m+pktddI*D6_JJr3sJJz-KkWah1~ubN&hDBltSCZ4vQz z87?fXtf>6$XT!1u^zw%_>f5G9{h~&B|FlLiSq6&VX)?RAtR(#Cl(IxP3q!4Zp-?PN zDKEs9p~eH8341#D;8F1Ed+Hx3`ph`>^O_2WZPVi_jou!)gmix~MC^)LDZ)-FOK=Z6 zW=OrDG8WfQ5L*%?Xlpk+knC1Flhwai;9t5*7vJi+?nM}Hp>f($Ro{E#GBwt~=m-6< z0{4OYAG`H0Ah`~nIyM_%x)t!^+C^`Lm;PvB_iAdiboKMD{?$JG)l$SN);pjOLnJgY zX0YV$lV)US3;BC6$J|2b;#pT}kQ(s|YnRHK`M8?x614;2XUC1-c}};@01dtCNkr4$ zQcNQ1Q!jb9vDduYLNZf7cD|U(C(h4=eCYgtok?)Vm^9wCGY~zxpwwAcNOKk+es3y| zT!pl71FBH=ms5#M6RhonPuib*`ey0Y=8X;AOXt<3Z5;;3l5Q%&K|j^=lFo4tyyL^i zUh&~mZ|E@fuWuf>x}1pH<6(o$fp?>s`q*IESd!}_y5w#T^uT1v%*Ntu0!m#g7FJF5 z)`S6(5C6CUo?eN3$a;-*6IvF@8ZfL(SFxsq0VSN!O_>S?K9Uj+i!kD7-Wy%64MjU( zHA5h}IP^jiM-X7unJ;Puii3@WRS`9tA>XyS)Pok1shV~$biWlbJ;72 zGVjk`{~?jtk(sq+kdRt}&%&8)@(PK9s=ALiQjZope3$WLm>W%+`@QoRm`hE@AOox# z{QbLCfZI1w&QQ^aChhOF^K*=FhuDla|civ2}wh>OBKDZ&L2P3F{(0nam6J*H}O+mp0oWb!o!}k^*ph zhKv9B^3+o9a_L&e^qa?wIdZ}Romtka<63^aa7AUgMGg%nolIo%)8`O;`f@}$KyFdR zpjsFi1*zZXi{UT;sMI=piL7RU$e8+8Qe!;x{0B7ACPDy!=k4hQK--cgwyl8>ht1yI zf82(>U9z`}>VVGs4%NgDu^+&H_oft#)YcByION2e0jp)(_EKB7%kR3%UhC$S^6Pxr z6YWx`)~o|enBeZ73K9PIwC$xbcwwmo$1K6#QvP9S<1JKkyUbt;3=-!mpr0C1Uieg{ z(k2ONV(;A{(H_nO)68%sNyMdTbWfV|&>t^FnTef$i8R18h&6K0%4rwIF~W<%;lT(Z zD+6bIm8nK!wRC|moJClmP90E1U}7wNQ#YMsz$1>~ajZ`u#5u~4%PA0@D5RF$C{54I z08a@fs~eLN1A}2L3&-awEj+-SvP#gP1}}Dwy%1uyz)T$}A=E2!u`!b%lO*ezHVPPU zLq8azHTE+d>e(hhU%q9rpu{vBFzv065@oma?fT;27c^kcfePVIPLbF62H}f2UgpBq z6~0OM)*9dF?%+#=f4agaJ3sMt7k~GR(Dig$OML0d4h%6x^XBy2QHjvIQZaM~T!xq$ zq+;)u>u}0XqqufIMDe~Vn)owbt9eE)T}8O^JQ?=0RAn~(d3QX?!SI;bAcnqSnpa1= zB*`iYcdlG@){aj5*Iv6i9%t4K^3rm5ZTZBdY``S2ncpRUQ9lA21e0E_%`7aOXF$I4)jT6!E)$2SKUJxgV%y&@iPCd3N}RbUe&DH23G z?4OAGIx!}w!`EY<>5Q@a5e}@J6^R;2oN&Wigqq_hKjMNNG@7MM zcgLN&D<8Ri=XR*Ae7>CB-u9ZwPq}sSUqju9$FZH+t8Yi zybjoqL@?H_eHZ{TTUSOTCgG9<09#QqQDz$WUBHP-!S)qH_&;_w`2v?Y4(yP=D@qfr zzKvavzrcI7qP>S7TV|s*7C#eJV$1uA>WbvnMTYZ*r)$5gDeODfXdwLJr|Y=qdVcuf zjiPlIr$IE#Q~TAA5ddwtYB-i3mNIrB@~K91T@LEe&~pxXrIg47Dr-0ZS{NlKww+8R z9xn-{3gHF}X-g%r;{@UitEoc=TN;Do;qa19@?+^_PX9>TVK0n!k#zyyzHAOTo=NEf zi7lmJHHt6e;Q(M(qPf3H;Pr+5;x`cHK>*)WjpHu7i=pg1 zC}#CL*sFheBRC1R*@980mdY_)YlM07?Zq^jSXw&9Zc}$k4CGQG!N?g$DAo+&!ZV2P zK9ILhpi;=O_FJz)8hjn(v1ejzZe}zxN|a!O@r)ck!Mm&`>GKxCoH0wRur#rl`pPAy zq}$DTI`qy+rLl15x|DP4%HfaYb+&X}GUQ^Nr;5jiE?pZS%b;umpPPDR4Kj%ccRf_r zP&7rB`X>)~&>%<-e~;~G)xAk!|Nan2^ruCZ_Gk2(!~WXdcp`_csq`g1U#I4McRt$A zC*27SpVsL%^G-4W04)FO8IV`>O7N(MAGCu_YOu8qTtwL1@kCJYRATc}!?L7&rBhG5 z<-Nhubvk7Z+}*5Ipbj0yI%nrBOIZpqRYoXNIgoD$4;A{mn<@N0xxcjsv4|qL{#}pu zlqq#15H7uT?D;6neZPiPBAABw4g>sGbpvK`ku%RicL?sUU> z;PvXb(R}`^2uJp|7q-wyY9yMCqLHt{{-AA;xVl~LJuhc4vqY*=NI{PPbZqT)liF71 zM6D4coe?9?_%lRmi;^g9=nR==XlY@_4WLs&GfwyP`hM$_dvn&^T>>#tX*Nu=#fAwa zK6ns$2mb24CJBtZMVe{$XLp9X#jf!{ivM`@6~JX*={@P!~RkK_?YO*vA-T$ zW=$Wzr1MdmlC0IDC!*xu`t(OwCs*0{jd~=t^js+EC|ge%++IkPx$!?&>_g|LR2rv4 zS+a@YGaO#>Pzfu%G#ZC4{;nq-Ag`{8YgN1iwwjC3}z$I-^X&$S;g^>H2Q(iR8@6H&JcBom%p?^qSRsj?-G=kr@~7#fA_|SqH!LxMjKs zj*=om3xwY(SMaxa8ppRI5VnYL_;insn}r2|UK8f~q(N$Q>a0Bsc*w z=}hRf3y{Bx7dzuQ+Bm`%o>z5Kmy7;7Ze3w*1$I{p=}-M1NC`iZdco3-k}N{X8KqDl zhfp0&jrJA?6%QA{E9)+qlz5H+1A~wob2oSH5CG5)Pt!;gVmmP^w-G?G$~jMNi?yZb zOgFUCtO0(O6%8%@c4xI>`6iQ?3M_h4VyJ<<@vaH^Y47ZmuF9Z<7xwjNe^Z2W*za;~ zOOX{IVsTJS9ioJdIZbZ!5L>rktt(zZ^9y697-5G==hxlN)2s7O535OE0c!BmU@#cs zS3o98=l10b{0qeEuu-_Oo_Q6GFH0qK?o?mF?WxD$1l&u=91icWj|vVb5CYdk1Gy zf3v660s#K}Z-KC)H+s~=4|D$yHJH-%VAa0?y1-+pKkpfqCgn$+;Ia3-cUVe0b+R1@ zGEc1lkYz{K8GmGH$~eG-GD4Z91Nlkt?9k6jLNxHd@#Vz{#3G8|ao$8n%9Oeh2sd9k zc6SzXUpF^P1n2n~j5~a#3n3`!N!<};JRiMyApA&ne@(Koq0uA{bZ?!*>Qy7n53DM? zMs{C8fywpQ)ssMSc#<+~4Lm*S+pZhkj=%Gx*DdU3?TuSK%np0~tA885G#!T9=?}tt zD(ZfNc{arI@OGZ307WCIk!W@ojYSW5)(#%Hy0a{NQ7&L*iPTad1$zVl`L(h;OIa7~ zDu|**yaS;+n4ngW9nUj5EJ6_f#^zq73Y`jGVjd{SKorqltS9BLaUsJj4-rnUgy^9d zFj8PtT!#)J47|FBp4v4kDaF1zEj=}a0$n6=tsfVwtfatu)q;+uEMz5I-lIf91Uz$Wa=guIcsPa=S&P)w-Y06%GX%h7Jc3E}_y)0Zdk zp69_T?WO~vwz6ReGg}$5le^VVgtG1U)jFsD2*b96Caxyx(0Y#;?$OUS9cmVMEe~TZ*$e^Ppn&=tx`$*J;JJ{NGfDTh^!$6xAgB@=6 z*pIQfTV3)mXClMQdw}Xg<^%XQch3$8ccMLDwPhu#PO{VN_yk~DqdOLL3BTW@x9kxl zveSVZp>fd0KmEb@2`PLfVd|wIG#i*NiJv`Q*vb-c$p#I#-sQ^H#%qnlAcx1VIXuF$ z5+t0mhQlkXWZT`FP{w^YzBgb=^Sj@DXGXSxqqDo0`B#HoAywkryxS+jA=a}6p~}4} z1~5_xH^cGmB)#;e3~YDeg()0_M>KtqT$!WsA-qOPwxdTw4@DI; z%~$IzE)W1&9@@^zjCaI`Dlk{7Zq7hB5UmxJ!g&y~v&=hvN2Nk03-Jbe{~B zk;)XYq+4xjUhe)Mum0~hp>w!{4>y??oaq1nOaIW4tfIGq@E=-kP{UHY?XM!}&c+S| zPe+`S8JZ^LCmng>BfkbLWnEWU|0lJ^3IJPjVx5r*Ni#wLo|WOsY#hk%gm)(Vg1G{I z&ptoBf|y4U%x9)${PYyX!D%EwPruoT*x{Hl%4|n7FE?K6y6JpsJH;3yYIgXv5|04HcIcJyuy_frx%h{w- zs1{09fNp|%CH4^h{n{ZZDiADtkI7dm$ z6PL${Orr=D32bc8&=&RqQ%rMT(h!%rSUc6zXjZ3#k%?>VA0jp}>4gfplggkDTO8q} z+1WdCvR&CXVpmxXR2(Q4MI4m|k0oILv6TC`?dLYG!@p33mH|x$OJj<>%NGe>8sp`-zjB8!5xz3R7i$mrG~qX{@uBK3 ze8I$DyCl@A)$$N;-RVLbOqm`v=>4{GsT^wO&XD0#|qc(q^dKk{mPsFq;{7x zb%VTBuFaJ9#;C@6Oah}8J-fxeoMD%aojx@(b*n27+KTzKe^cI=kvo!_Qm`IQ@)KLk zsqb&)J`-212;Gg-_Rjvx_CX6)o#GmdTvUOnPe2u32s*GSR*&OclJr9q6ka3saS^DM zUqBpE!D=dPs@dcMdmEh)fEz#M+l z{X%f`qhrg63#ubpqmVviNA}eTwK&ek+ff4Nu^RRI#2)8U2<@2ZQO^aj$$|0vbI?Q4u{`6EkY(?@rR1a#~{ZHJ=}2o=@Ia z@}JZ9$>&FTSZveEV;Zr4SGUt^$;nvUt%q{>6Fq_zL=g%ii@%Jg zRcju9)AQ?hQ9J%u*>*?g86 zL;oMU{V_we-j8;H#FkP&{~Ml!gAu?(gZk<+g0JWIbGm__dKz4d3dddisl|AK04)9` zk_MCt2`&W12%MXv;`UA~>qeQXLgK#NA&1VfCor=Nz7&L&C!&aREHT$1Ywtrj z#!5EJGj|^p#{*Kf$YVj{MVD+eC_^Aj27l^eW;Bvw{rbYn zq*lQ_5>q`pz~D_jBU$`IGP7BCFMjWJ6F7QvkhuK`oo27U*E@*VgH*ZeKfBJFAML!? z&bu}6GM~wIo%zZc4*;nn8N#j8mb~5hv7filg89$c3G_fH7iTZd?+JcHUs`;ud8 zasDdNjDD-lUWs4huBX88(WLEGB>K zXEY(_#uO;JoiTk;%J5EJF5U_l&*ZQ027K)Q^O{UF(7e?(pe%rJN{4*7zi zz<8t{W4hiFU|0UDU!;$f{+D#=r$PJtH<$KUYJ(dK*SG`uw{c8MXZ<%q0;gQyNcLNI z3(vYeQ$v_bD=6itTR1EOucl>BSRy=M6%)qLt=BJJX-k+1?mg z@TWh5y^VIM6zkvSFz?q7nCkwz0TTTfkcGa$MziWZ>^vHg%}CBD?mC?-%!BoOFFl`K zk2@Vm{yuNFC6)jHUH@mX3hsJa1$qAlEYx77+prZuy>MUH>Cl>_3&ynO|87>5jf8Sm9>2Ls`!WfVwf zW`EphKK-Be-1NpdL+g)QleDkp{))>0pp7t%;QFRe#*RdNDrs!%UfDTX?6HrGk)`Cu z%K^Z4qqI$ql|!Q7lmi+3g@RY$oq#IJIn;1gJ7}?yQXJkSUy`qEHpic<9=+lH&iH`p z{pEx=;IDJNBJ}#8*acAAQeyjN{&xQAUD1V~b~*iD@zIle6cElkr>nL5m~!ycTfQn`%Kz23;nnN9pXm%Y8fC3ivlJ+;6y!61Ii* zle9N5&ru3|O_Q^0RLTC@&eV$r6$DSc@gXGs1;1jzw*bm}@PPRfDaA<^m>n6}~R*I=~-6YMW zla?JdC9f|5hmje)yHLS`=1$7bU<(CYQD@vN&QuH(H2Kx<)Y!S!3AjGc*Ul}UtEryMLzbI40$WG1LME`cUqEna02(tQ0_W*@F%S8etHNJn*48xIb{Ay<0BVZCU)-e{Bm?GMo{k z#+QzPTTCZc3YxW6&3O&*LCMH4X;8vltYIoRswLC>hG_);BIvPTPQmc&m7YF$1SM`- zpD6bl{ik`@e3{_KS}imSLxDP$ixjitXF*OLm}s5uij4Qnt1?$Xt2xl2xlni2tm8qYUG3RrVs*lw9Lj9 z2%Q}ez-j#j<{qa2Ht&I(QV+m9t6l(|J#a}r0P`rj0M@_#-zTjhUDxDxY;Mu^_h+n_ zlOCa?l0CsZe8 z-P-Txv<4TkiOO&kDyim6twK!khfq1qS_6RH|EaEyQbZ^?E&+3)q((c6%R{Vr{=$p9a8ZZA7pa{qzR0T6+*dqE3!5A$`ljQ$HBwfhJrr;h zfHJ;EsS3HQMGADR@E|(gi8eznSF`_ae6Qo6t%w?Gg1FT3$8iomgIukA zgqkHSGxNoGZk(Fqpv*C*&TU-YW2{^uiU8tir8kkX-GB|%K!Xl#W^7l5$p?V;ju7~HVcmpEUgHRPfB{`y5-S*%1e9+w8@jrZ?>C2!M zGyo!}3l-%C{vN4Sy%CA$!9Zr%F7fY9<`>l0rS{E?CX_>zC&;?zSmoBZEJI@J)dfSH z9cxLlP`P19nWE8pDawgXOR$qAaCXgx5G^O6ik(Q?&{YUe8G}+648UTp_y-N#_Cs(c zfnk3a7EViR8R0<*Y!8Xh1RTD4%i{fc?RW2U*wU9VKa885ax=)Es?L`pr-ehUd64B% zgN(-{)Agi1OffdfuFs;&3&qM#kW`8*%~Cu-8o#Hpq?M%88~l3^5u#zLPi{6VuT<2I zD!}NSLwZ4)<0@U$jw>gjGKu0{JOEIt?N(Syaw=Z;OcZ}41xRofLdZo*N{v{sVeqn% z1sJ#mt@)pY!lp)yAy>W3rGYqr-6A0=iAV%&grq`N8vLM842=;*C-EQG`*?#(9S8Zy z9`6WgqI7R8P2>epzy5hLeYIkikU^K~Bp8Md5jW)T0f-}aMv zvdf7zs_Y--JWR&d%uaHh0p-Bez?q!nlF}n-?s5|9zL$5V{HjrRN{LD^WiUKdh+aSYmd{ z4oIZDBrTb(gfQy=1NI$tF%Q6v7I3#xg7)VMKqGgLl?p zqZacKxJU{#GaJgDdSqe=Go2tARQqS&qegKpE>|v)0l717VgRua2vx~&<*NF!RxY~F z=U}EYOca&PgFSscW0(B{)VII0B-VAn_q~fKTxzTz`czj%(LOP!d(Z*4Uh2mV*25ltpvVecu)_>lMbPbyZPZhV^RF4!rZGt!JK00O zJ1lhF#6KtAnFbIuj;oxF*@$Jpi_${rrGwmBl;kIk#y{d)>kGspiZGpg7cZ1vRIMO9 z`o^*M$IyF;(mosC`QY4LVQ{>K-~8*w5RxJYkIqs3UXh*rx^?qKY~6i!5YyqnnFIyq zQabV&{fT#353h3+uaBbF-1JLj`KeiiSvThZFQsiI>9fv-_+(Ybr>QeXz4Uys!m6=W zEfv{dMS#}-TlJm|feBVYg%w%&qJcKBnuU~5Qm7zFsbH*QbYv5kv+sNV%6T9Do?EDB zgK8?9W>fE>{q&YFMxbRA_JLRzKrG8mMtd#e&oAO+w7U_1i{r!|r{i=4a7A}GsjC(I zeM)~VhD1jZT&fBuoA~v0&2Ml73xmPS9o|Sl1}%zryva-N6Q&eEH3ba8pvQ0*fV_DH zx5T<_`>!bSEm9CEEq~m|bm9ztQ-3AkY-#p)vCi}p>1YVz(1BWp2CbFj+gc;2tYBr( zr83oXHkdi`KlU|8hKziOG9+v>EqH;PeK48g4l+AGeQ}jDqLb7GH>=g=V^8|~-I3_~ z2KlCwUsq51gWkZD94A>x1OT-D=WEK2ZrHB3<>7~JK*5E&iVPit)r;=*qPQmMf=P5q zY@x?}7kPgfs|H6;pL4 z^j7wi;mx&{e7ySJPK0)8zHr`%?h}o-N>Rk6r{Aq*>QgdPd>g9WGIAK+^-S^{+Aao4 ztT?yK;pLBgoL!iSonBdI>dWr2G#jg>ALV=w)IBymX8I=AlztL9$XQ~$QC_-w+n{NU z5j(+**8%`S{JZwUUSXIv)ZhmTs=A5Bgc)*biUBu8DMqim=lO2?J^tBk7!kZ*HS0tD zUELmRs{kTPO{?KxG#CQpCIq1Z{#%+I>_KXi1m>p3@e2R?)%=7$Ty?`35G;DY$zoGC z?dg*(3hVYwL5=5F*C;A9x=?6}Wo5(!YFMFlMRuL$SY3Yd22StzMhENj>3tSM2f)dt z3QW*1-vrfz-5BmEfF*PM3 z#jqrBtvXU1*^W2F7ppZXCN@%YW4x+eNhp zVGr1`wG$nJA+x4|`jh%BiP9*EV&FyULh7A?I1pZ$wIsLri+_7_0l)A#ET7!tD{UnU zx0l^u>R!iNV7Ah0Myw3SK5uM4K#)1-*%)4K6{nvg%c|v(>dMI|hV!ne17ygBFx(>j z6~~(g;ZuC@5#M_@{Wmgw&f@GWT4MD;PU7funYrITT?4EU)CjIGy5i)mj2GQyp{dXM z%CfgT_8F1fNlwmkA7Dz$J++nN0|QfresJG{8fe)-E7b6K8XkHs}~8o-S{ON zT~2-+tAMgc8SvKgP_w`Zj<5M zY@2r0J>MNR>p((!zzPF#XkVl#LmQL;9JnN0mIl~E!?_U3Q25(V%sb!%&z%2ozcu&l!KI)`Y=Q_58>!CE-Y?jEXXj76Ea z#B(KTT2^fSDBV)puPvg3sa$KI-CgN7!M6t5KURPd>a1|!G)TTjV+NfESv2q@Y_2E6 z4vXdkEw!|g+U$Ec3StOuhLHQ{x67tcK|oE{iI@^(S%D#xNRAvTMCA@r2GQ@s)KjQI z=^LF*W)CfA6Ebm{BV2xtJ1#cO#D=)`9jZ@!e4i90XN9Vda9%$Bo!4dQ8?ZT;P9;rT z3*Hdk?O5BMTsiad(k=Vj-|3NB?*iNs?iDRp+&}K^j#vy!9z_7q^8b^OY|@ogMiCp* zg%;{yVEkOa8-KO`%Shc~d#Lsx>;b#BwxR0NRUct$RhqD`_Ap~DL(#+yH<>^dZz6`oE=2VqUyp?H2=O#+|RF% z0Z~h?CF!%CqxcA;S<@^q)u4~f*zB+inblSiJIj4QGNY_Dwvt^3o!y}fKCqyI4Hl$g z9InkeR1lBiuxz@Y>5@O^`m(9uaKV{=K)rX5ONj-+eo(9cfF&jNXUQnJB$}Ie1kkU= z{og+*woybgQzG4uzc-riG$7xtXUjlvOminum6e4Oo-!BJ+>|9m>7y$hO;C6vCb)`q zA>#9tWMo1TfQ3*@sKWt%)39YI(IWiDFZSQS|DN4)=9+edvPrhH z4vPOSc(oN(Ok$Wjc5V!odx`pOmDL5w^&STe7mWf_hpy+K=G35t@mtKMFBV!cev?+y zx`~4%?Iv^Qs(TlJp1D4ARBxR!b|Uhjr;({UePijafTGe`90h87c>v)0ADeRgKWwVl zvY||=;ps5sKqkeoTzk9Kr|sSNb2BmGgP~a;>Q5aFnec|P0wl7WxUgr5bG#{mFh7c@v9%rPe@@Ms*MMY22eoR3esqMtx-~6O0v#`zDt&z>#0C@-*$|Z zCu;;E<7e|zzo+t09KHtu&L5R)FUE^V!`ZE5FVIyRMk<48@;lE=qLs-nAJOwJjTv;S@hjgI?JI&GBCI~SO+6UqEH~$A5E#aU%XSUp4S!QKs|8KZpX)q zlj8{p`Vf$Jz;8Gd5+|3FlLZ+~rimf|(DZLugR)~|#~$_IjXP+ihNhHm*dz5sJP>v| zvh}Nkrfo@5J@c;ePVf#(RNX|zcD&nV0K0U3nUajW5DG98O(B|61K%omkt|uBpvo~X*T_t_u8~Mr4jmhf z1KowL%VEj6Mg!TO;9CC>$*-_E2+#2=_bJ3T!6?=p%OOp#FLLYS^K$^!bJcTfZkj}P zDrxMRM7ld`Gs8YAs9L2&DNtF{17PRhD{@v?)=-1*FQ|bX40U1+Ia_5Q6LA#7a_#C|*kHdiHIJ67*N+0m^V)Y0-{44iK@MOkdshIVZ4f%fRVPkj=2K zYC$SJ+Vn3Y7mFoR|8nRVq_9R}xW~FdQPJ;S;z+93f`RXeb_@@$Y*h%Qi8@3ho1 z#N6bIAj%UP%*#3vEx&Js+`TxzKvcxF= zmqTm+|2g#O|HGlMr~h#%#(x}o5(*Re!=Ft@;1kb-!`2<&aBh?AVjYxDAcR(N1X1pg zoiVh!3aWo(rCN#}T^X!b@i;Vf*flvE88g(vV&JUC^`i`uw0F(j#@84CH%vE-%0a<| z+>v-K%h=Stajvg%h9Wc1i1s^z21CEW!lo_rY2GoHl z^Iux^t$XzPI<9v!s_zfY`k{X6V1XeTF>1v0UjUkzweGk7sF#+~gZ(`8p_I0#-C(!h z0+`tlZK!in5SkGRuu_IAQ#p_q z3)|fuYxp1d{q+GMcLG>X@bH>4o))|JQ1J=z(2flUq(pk@oM;YO*w@jtCqXW^7$K9+ zW0xgZO4vy0ga_|m?pGVwk;^8|o7O#JMDy`li4T5%0${zgy%c6r80ROV?@AuJu2eQ3 z;b*8@YgMI$MLhrjF8{v(5)M?c!-7n#;o%@;L6l-xuD!q8r|tJYfSei;yi+ynL%mmN z$gmH*RsfZyq}~40e3It?72}JC|C3JlvM<$10;TG)81c(N;{!4%-i&{urEA&_IOU<@LEr&vK~+MG9(!vBuyZ$7!z|Aj%NQ`0 zx|DihA+`ojnl=vqC*R&&ATFZ_lY1XdC$+!wC#RtYD|CI@T?4%-*H!w_)FmM)yfLzt zmQRYzx6oz1qD+Od6WFw$wM`Pb0y7~jIpjY=Sp6g1{R-=YaF0H@PhoHtoZ-!}?6BeK zMd3evKMC+wm{yQJYl`@r$p&FbYJYCp-0{~6Rc(x1NHSiG05Of-lSs{W-l6+TSDZu= zwIB(`pn)=i77fv8(6ZTM=l+u0nt}P4%Ip48Mz!Zy zRVXTUexT3@OJ~G1+X@kfZtXh!VLF6mO%{#^Ix<8R7o;q5(T5QsTtzNd&W6YqQGi#V zY7_3U77LLryeje&Ids^HG!|2o{65Q!tSm3blZX47AhJ@|5*Lf@rKRnI7ASfZQI;q# zxQLUs2d%>)u_Z2&1OUkXhpXKGZ(P+xEcB>4>mcYfR{O(HH`|u|KU`IU5Yhuu8i>Qh zuTzvEoFELa6Osy98sJY2C&js97XI=V^9gv@^I)I5;u|3?&d%0Bc@IM9l%Nn54%r;T znoG^}Pi$1j(BoYO>rFflO&hs5gF}Cp)yP^++By$#I;a-z`qdPG+`hbVCP$f2dO`I^ zPGZvz^3jrO1(niTl!9rexdYhvKkg9A8v4!y3u<7+qE4t7tWLw@AEv(SuHE~4E!X}u z=7XUR&rxL|qu#Nm0YH+iKZ{p!atW~Qcx3pWjE;}Mmd3!wwV3YnuQ}rrmXMJzhoUBF z!G&FgMT4xmw;a2HL))UL_2yck2W-3&H&Vw65s%60y?sCN4E7zCaDJ+?3^h*tGl~A? zt);@8Y4|zu0#ay@7#^|qD6#o{Y?-Ja@Z@UI7*%*G>R7|qC_DEmH!_FZ&sWb+h2UKD zB%!Z&U)ktn0g68Rls(FXbJvaT7RMQJNn9BN0D1q`U?{nGT}u?df(1x$aVKIT7S)CY z6RVf$HnITQ+y>VE{rqTXff#ZZ*yTTt8`c@h5ndt;u>bcK3;bc=tTdDG?{GH#f{+FQ z95(*=L`VnoAE%-1SH#dMK_MwTva^;o=bD*cu~8jEx4w+lt8^Zlo%Brsht4f?uoyWf zh<@i0&W6{*FMLh_NXt#jnH&{D=?&FScO1IASLSxwSiy|6jLGS$d`iaCM0hmI$?M&&<&PONIOKKbLr zm1O`b{`bRob~twJQ4c@R{Z?vON9}<#3Z@JWJk{QGSWU*K}b!Fq0wuN+Iot$y(e&t8`oV6qja z(KYUnt-p>E4j$2(KcR6bH{q%@+&`!9dG@yYB?w|Vf-cfKZ8b>%3E z+j(kVdL00)k<>_0JXOZ|;r`S(FjcSaYWD3RD~Z%z39^QLfGutJR8|g5*0n_O5=qp; zek7R_!O|vZEN(F_#IpIo`MC@Zasbxs+konWQ$aI}R(#;h0*x&B)xs=IcnOepc0~AJ zesFvQe&Knru{A~q{8Q5SfH`z6QeL9;kly>r*2IhL&OT+-bUf5GimqHO6pC?QS+QL; ztPpV@E}z?v1ZOZdRKWSQj?J<2b3w`mcG0hHA`UaA?i>6CM6i2exW%$UG2Ty+c?ds} z46NTC>Q`6k!Khq{^77^~E0g>`WV5@>1(B7ylc8;Q-TmNX28uomC?m=%PJ#SjHQQYi zXT;9)0RJVJTVW|Fxp-Ym6n~-xNN^E@m`G8zVZp?znQkKsFmM}K^P%@X8(JX7+#Pmd zAP((^2}w!3Br&j)ib<6lh=<0}(6-|*{&f5upLrhkb9a0qm5tM*bW-sZUrts@Gz&}<_CE~!Aq>};KRK&u^DakmGQ4GO<8uViR_Io6^;IZi zS5m%|MP!;mIa+!xP}Ew>TypJncYq+;?scSW*91#iuxM!(e&QuUK_X%x!7@NBL1Hw- zve|LJ?iM#&Wm~i=ce?uUj5~=GEK14y!U~XBa%jKwkh~ob+Fw2*uY^!>-5qqh1AwJj zX(a^wca0AS&@_r*!Acx$Y+J~YKA z!8Eg6NpIrP_6863tFrbs&?t{r3Y{Ad8>3kj8hPSmKKgU~nVlF&bO`f?9Q}5E8Fox_ zgr)>8b7&7SV@}v$m)WzsVb8Rxl-{(<#MkhibQShYt(@7RBbezN6Uj~UcD6uJB8A|u z^Gnp(IuDqx0h8I{!8eX|zt`GT)%MG2eAWVQy>qA^P~T#$Oyf!Ge9UE9TLJ)O|7H-$ zS={XoIs6GbfJ7Tv2qfcZcxF5x@ziv*B@Lxz|L+W9Q8fm3x|@~J8m#M+1f?i;2SC9& z;j%Wswi>pk(n<*Um;c_@0zUCPSbe(7BV5`z-AM-(uMpm=a(Lld5eiZ6q%UJ=`!%Tk z`LEqmzSe#HSP{&5GT`mxtsSi1HdiQEu(TY zF(E%__%uN>H{E2G7FP{4N^4$os-5FLAfZuuVyijwfjI3@1{W--poN08Qip4!gCdGj z9hOUPn=ZM#l)byE4*Ou}9pYWQNi{l9$8Df~6=)nYsX6Kudi?>w)IFB)@44OeZ;Wtl(8zFAc?wk30}m_W5YZS(kI861TM%0>CGKOYyo=T%OZmZH z2~DsxidDT^RCoT^`sCbwa-ko12=H{!j-FxvM7E4kDl<|ZT`__QA)G~5HvLQF09ryn zNDPKtDR5PeEWd14VojNBoEX)HMS42qg);fCW>1hZE--iG=X-uZI7eQCi*mi`E5VYe z0ND??n~F6=r$vwK4{~&&9a6WLBF}G&TyfL#G`qarnK7cH)H%oHvfawGo8tkAUPt5= z@&0qMUnu3LM^AlR#Wc3_h~~5KG47hv;2xUaUs>X0m0}e+E&W8Znm9j z#KYu)@PJi?1qb`gC=i+T^D&ta8WRdEq+(JX48%=iYdDYaeg2@g1MhhrmNPfBtGl;( zu6_|fDoaPd7U!r*7letE=Em@1=X3q>i}J+D`5AlhG#Un`3SCaH7Q%3g-re)t zv7m*XXrxHVpm0r__LZV2)zQ7&AIl?q&*AN^Lo*z3#xZB~!}HDwiHM%I(i`E?B({cekjQ(dlw=cbku@ggY3yD7 zo793I18#KsbpO;IH%o3;-I5`%)mjRN&D{^q2@)q?f1MZ$6;BbNdr&{75V7?Dixs=U z#J7d*1Xtd3jlK5!<5RPHfR0yn>2z&C1_qCvLk9-Z-UQ&bv z-N&VY_=DJ~&jRL!%mY}dT&O%IkT(r`R9A%m*TX>%Y++fjo}1&HMH4e#5@B{oQGbD~ zI3r7&(%BRO-N}f`F+{MHlCXl=kG(wD&~It@Pp2JQXn6@qKF*KqV_-c@aZ%|8n1fWPb~ zeAAd3-7X!01wt8{)KzWa4KF#Dt#nld_4dnicim!D8a0k<@eqqkCa8?hzm z^x7N8XlHK<&f6(cdit9+(*n70TYtZn(gq@Aq4em5gpaNrLtPyF*6$}Nt^9<&{Hr6& zXi@cn{j3bS+!ndf-Rzs${Pks_fOzVTyQUcqIE)TQ&KA|S(d2+Iv-f5Kw+Vw$~$X)icKt2U03wELm?BRmEG zt%a!t*R4hwyAbu%(%5F5ws-XVjB{y>JV|c6832&@|Au)V(jtyJl)?8`Y)f)j(F{Zt zjBPcD6{$oA1lh}e+%4JLE5CPoG{c2XbVQudS?>~uf38ln5gYaHc&7mBT5{X^LDEZZ zUjrCbq#VM3(_Xx_25s4D!J#OyKZw7Z*Z2xuc;+Yi!g`ZIh2z|!HvH^|RF&5FqCnzT zdOZ&8;ZzF}j+KT(%DCNLCs!lbTHFtea-+RrhkL$10kAVP^;PRP%$+x0!S*69F+e*` z302B~`>?M;SqH^MrqwuafE1Psd_D;vJ&kifWzYmH5%S|m8|W*VTMHy(M0E}RnD zDkL;Xs9PzLkZI()GvrJLN5|oYiyQPHOoo$^y4R&8l1p0G(P6<2yMjoZ!c-U&AVP*% zof)RWwsR%C(&#Kj$}q(hstQS>=`R}a`2o2wQX@RR+THC(5uQ#18Ri${0<$1$0VxK+ zZjaq~MoMB?loDa9Vx+TVkVJHsa8pzT9GzN+g>{15w$qf@Q#JJyMNXsE%feC6Lb)2! zdzP&!!jDITp}QM(4x`qBbvVe{n~Bi6wt!JI#l*A*`1dte^se^Swxp_$AgcOHh{C^F zK?%dt0E+ORm(trG9XerXqX0`WbO;cz0n`*Pg%7S}ixDu8Ds<>rdLGs}1iTWXDakFM zeP?~`5~ z3-ZUui%&&+^L7Vt^sPraL8>q^udhDZxI0irDwDNZ00#fv2&CxPSbCxc-#>$uT3V3{ ztf5VVHCSO_bll=UI%v=G?^k0!P~H#TXV=O)SQ#uh-_$@Ix_mN?L^O$`1mH!RwKf|I z>PWEKmu7^2`;8Ab;IBOmW>4;MjW(Q!H+InC4u)Nq8O^JC6uR-#-Nz_1U6t3|3kp&< z`Py78-wmXn1?6s!QQ?Y#GnSHM8IFgx3Lu4CDT@r^Psq%b{}3j>z@ZU@c&Gd0gt!}+ zWYrdfWcqoQx;H-G0?1lXth*h+;C4Z}%!7srOV21j#6ht1Np9-zC5%}Km#rgM%T@=A0sd03OzkFdn zLtn~&rqp;2bd6$l!`mAR-w-?EeAIneT_H$mu)o7w^ltZ957?Xh*J!O%$uVW}I{}6= zhdb-}JcE8XsVX2Zz_ctBh`m~nP!!HfBt{rZvRU^gjr!;x-IpfQ{vdd4J{uVQ?w9N? zPZQZPObFe>W8hM$VPx=%g*`b4Z0y|BnuTj2`VnO9%Bcg2G^9KM%K-2^Q=zK^W7}HbWx~ zm{R>GhkCkyPqoqBM13$C=mT`^0wQJ_0V=be8;cJRi3s3Z=}PIEK^_TqX|j?K^$xfs zHJBdYd0yM=3cSj3;3t`6cyc~P>KJ?C zZqy9xLeKKnKM$s$rW5W1loHoNNyk3xeD6hV1XDtBv`?|c;CtfSJKjVRc)q?sQf~W@ z3$rB?%Sj=jwxRDx_a<;!CN_ctl3|v-z3CfAGrnPeXnLE&s2qzU%NvU0EOc#uCDwF2 zq#eTI`E!{Keksn>GMmwff?kNbK3cD$nqwp_u+q*;2OCJD!G-p}8N@zRH3UPo>L`!Y z#W9aI(XvI*dCba1MTcbjQeiYHU75Bh6)&ff&(Ck}$Li?)0U7!!Lq0*anFm+y#Rs?9Vic9g?+PEc^64u3H{+ICQ=S84MjK~3BbyPa;4Z$a;%v^|jG1KczK zn=tDNeomix_VJ~S)TVKuehGHzaI6o7Xy6fc{j>olg8)9uWjb3efyLqG9LB!~ZCwKS z#~Y-T$KRd9e$XM6KDnp2GV)(b8F?mqN!*b7rh=VPel*xF+(=@$l~JB7v&tWI3IW8V zXi{iaMM(L>yQ@-Uu2__M6vq}?OQai(hb<50NpjD^)e1k>CZXcrJ5AXklJ0Ie|eanl~0W2PH#FJ~R;;Q;E4YymJ2$ zip-}^z?wBO$Ou=#*4{WNWcFCe%Lam#+#RfN4q<`Tu8kgJT}a9IWMgVVsxWn}$Rk{m zS}l7a=NU?5AHyCNfiz|?W~h|a*tlaetG=hw%1YFy8bS-&(V<1_4Mx=m7rcs9#N7+g zlfj&MDz&v7+nrFD&v%ASl%JYFc-M~#kkOe?Mjmb0BHPIY{kRSyU>b1;!GgH zMNXm-N@~H9ddf8}aQh((u;Dh;s*k(|AE4Y9*p?0I z%$2`m)d}hO76Zq`lhAaQD>)oEH)vt{*$O{($^$hdQ_oBx)j!Kfw@*4kE~)5>R6tZMmtv zlwQg1o&<-vKh%eNs{lj(1KBFtT9)HwH|Zr^fHBJSwl)aAD{i0shS)?AOwtPb!}!yo z<|lMG^OD(`ov$h+1^>P7X}E8lu`cf)O1!kL_9lkKmX5Lw3VB)(+RO+1w{WrP&7>&@ z1{ng3;p7}{ZfDu%tvzeOxpG^SW9B69Qci30Na>+p09uFeB;-T!sD$sgkSO69X|c_- zlp5l|A|u>;M~bZ-I$*&UgS|2N+3IiA-}VCwG&=K0??`KGMiCZwx^G+*0f5GT9ZB-Z;L?9yWP=T6xgKM~ zEu;nviNYn0Y0FWzwX^Nms1KG8fdL<&PPr2?cG=4Sv6*;vj8YUM3^3!2a8YVtI|U1B z)=Nn!{D=289Dqk02jas9Zl$T#wAs{DWj1+E zBli>?`cOpUK)2zomcxoMO$~hh-$wnVAL0-9@#2gs+FLln@xzwummOSyqQ6vsQSnj= zLbjkwi&l!yXQhp8`}GU9=2JQlioiaeH-lqmz00zts%VMY4-2~ zQj;XO$Qv53<3FBje#B5ScZ6-lg{C1^@R!2_4Uhf{3d`|JiR<3}b4XA=^Hz35kt`}E zTZD)ov*KaM!317Z=!e?z_>jBKAjCl$scN3xzvnt(V0>qf~ZK)-;Be*f7otEcGSZ_xig+p;jC<&o;KHc zrRSmSdSKh$&3^1a@i)cg^RmdfBTOv`;WW6~+cqi}kCnbTCEn?KgVmwzVNH&QptZlm zkrO|;)6{0rbxs~|!uiwVaN2solElZb$2zc~5oUraw});$#LlXJ1J(G$% zmSWZGHu$azamW+$abY44tF4hZnK_5mYJ14i?5r2PTm|9>;x%<6{|@A*mjjt3{GW*u z@=9UX8|vY^PH3TqWw>r@kJJ+pwzCnJF9~gvnxyKfH@-KvJ3c_^WE1ghxAOq8nMC!N zypTsi0j5%Msa6)m-oP6&KGz)KU!uF)0Yp3qU{+kKyBog_!@(&W?v_&91nBEa22wei zUpi2bmR_D%i$7(Jrtryi8ofcX?L(D~5?iLHS_umwEIN4lxAh9s++<%pOgAq$urxYln=%}DyXzEawXAtJpcgh{~cx{RbHz1O);*a z(i>?cBm@F;p`}I&0`(ErOK$s9CE2U?>RPpC1_T}$JbU>#rmx`{Ky-&qma@DxD=vz& zj~ln%&7H-C8&`ogm_Ebzl@EV#xDm70jV3O5iQ_|p18k$lD`4uOHf*s4;Hj#QQhCXWhTMXlkabDykON^-eRMWZ zN@3CKB?loaz1L~B&Zn+3iR<;_4<{eq4M5Syh_XT1;^E-ZJ^$?QIm-Z0_fLRe{~rP3 z3JNY%kPUUuc`~-&UZ%}Y398AG=(e3b@;T@O6uS*6UN-|kCPKQLzR_2j0ldS3%i(N6 z{2pkO{&`m%52`*nIpLh)ap?JO1B3?wH03g#l;l9R;pQ4{e~MDs7_y>(q;h|0E%w6> zP3g=1d@&*Ynq%ad^dYu7@u7lGAuKxBt(-GV|HCNDms#bXbPfU7D9k8uP!-1c6YXwF zo?5*qd&5pGw8|KHlK5}Enf2f558WBg7IcGuKxi-zi9iq<$TSB_C_=4@Nyaf72YwE~u(#YsvP@%VJOr0PY9DtntZnoJCtA!SB(lmlu%hEQ6V{I6TF# z&YGXl1ITM>JiBNulAv$;Z3&Nz)5b-^4~37;&0mONxrd*MBMEs?6Phv#UH%7DVd)GX zgawuiKqG@{Ld3R32Xmv*Yp+8KVUD!iXQiS~;@BV~JVw_99)n;Q*UR8Vi^()XHgW1F%`tN2$Da z5)HYAXhHiXT6Do+QhoI?m{djTXoP_bmdtCZKjlK&f26otofeyS9y%b=mx#1R+TeF7 z(kw3iW|3w5pO?n}e@ji#AsgtC>sj0VUX<8>TGJ)b^|+6G7kVG1+kq7ClPMq*C4G^8 zx|aid3CV8XQGX)RiT`fsL5+{mp>tft)$<*N;C@CgKic2Rl1G$2@8 z8&p9R5ivO1xw|{;=4AO#rp1PPU}(sl?Uk(!sU8r&hNZUTwE2e}XD37x_@k*eb6j;A zBe*I3@6yeUKa}bup=;G*u#La{V7^jcN*{C6DI3}*EHy_5hY}tdtBoxOpNP+`(^be} zvEol9v01K)Ve%jy@*d_AxixML@&r?YNri&6fgrvAx&DpkQ2W57;Yi6nng*68tO`@N zoeoaG55U=~%msfyj0_y;BG}rC&Pt8*sN}K&x|ILARs`+C0@ey9(`}RrPQFGFQ){YP zu?L;ATE6sKop)5i=@|C32&|FO*x`Sov+?M}wEF7*h|Vdrq?9A>kv%F>u$Ngtk^q3}e=Zj9|8cQ}_NYVH z(2$##QikO=OsLTdU%0AdfO8~x9M^qOP$g_bB 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⁣ ziVS9XsOPn-y58ubSFO1Xv75W?3ztc8dCcq~FfouEwI9nHaNyK zzyj$`Yfn#Y?>ab8MV7x#w;3riMk~<3zt26bszqqW&1O8|pLbX0mpzP`S`k{+dNz?W z!DUnY2KOc_20S#e;~>G61O)H&ZIYlyUmojb#mfjtdTq3crx*-Vs|NCM9SuLy)`pyU zosuMQ=LTpC`jiAV)lKqK@W|upxwNGST~cFIdg~bGNnN`YkZ++4d+2gkjVhY6--f4o zJJBGlk%0Zd?A_W-ztEj07-Rb6Qo#n2i&@F12E_ga3${uXZDwCo*Z!%45&CMR_6_#B^1JF{ zD00rY5t+4!wQSl|%iKaV>K*ZI=_G+knH49h=SGRVtz>J(TJ%nOpyfYmb{mkExo|1m95s<$gImr6ina8(iEcJo zrOAmZ#J^&VFRRLFwUSdZwy$Q<55g(}{_E8Eof=6d(b=JqY??5`bvX;X=jWf+C-w&W zS(Ji-*7+C1`VMCX*V&p(Cou#%@GUYn<6{~T{q=FP2e!b23JrQ8T;|!^H?9h~k{8LV zNW8wtT%|BxL@k!lM7^v@s?=H92AJ2Ma>CpSDD@_o@vq_}MU_&U>!@VZqgZf$dAeXx zGRyI>I$}aY=biUeQ)I%@fI@M#hk+yi^xUQ4Od76B*L+`GRAX6|8?y zu@RA`qZp)$BiT#wbT&~byYb8DvI%kuSzZ2W2EY^58w8d7BZP0M5wz~ZzI4+Lb_yvX zeV|<>oQ1@K+6Y>0X1(!_H{2iY_f|!I(j>ieq}Iga!*3 zkD~=eJd2mPlcpFe8JoLIrvNT19Om>SASL{)Jo;4_qxM;CvSp_Trg*R^6lQa++1M|DX=dLj#BOHE$)xAsnV*M8c54}>uPcz(^^%O|ktefMxk z+bdT+rBabzm6EG(sGr|MAVOv>Q^tf6Sf?jrW)WB{97?8ALxT&0#)QARVO3M$0rSxm zg=1@442{hJHF z9_zR5TwOvL09n#33|n;gBn~6$J;UL8xx!~g8$=-|6e2^XXCCa5;8X` zMyTe$<~O*WzHuqTne#R5_hSsItWq}V!JJBMwA~yPl6u%mfpFH$I7e-~2{4)p`6;T5 zXNJ%w8IbNj+bmS(g4bG{A^o%QNyk9)M~-zFe_{cjl2!%{mm9RWob7ZQS-*5KdqwB9 zSZ-bry1cy5@5S*KZk~Ulz?&TvZAFGjo{L>MzV7{*MYTnV_Y@*qrF>B9`X;O>PS#6T zn9D6iijcOn_khwZUH-v)N$dZ?``D7oZ1pAzDyEjD%M^W}lAj4}if_Wb@wuw2q(aq$ zdf%BF9t4meprH~0(I1N;{Z_vbJ(lRA#|67y*Wm95S{^T~l$3PeE>G9~CRss) zeh|e=y(p59VhXjn&KInPiSxfvnelRPBn@rD?oWyX#0* zD6QV74JHTs*xF{9!ZfhbmDmzWw!3evg>g^q?rdYw@c1p8mEgop6s^(H6(Qa7GH5rO zMAxw)&y|Wzr)Y6R#s3(KdbKU+eZOx~c_U42h$&HI!afXGQlGG=IB!-8OoHd)Gj|Zz zcOH*fURWLn2V)sof1=KD6N1iIBlZbHPR-$82jzq29$6ZCtWly;9+HWbz3Zto8ON1^ zDUjDNk=tXPM~6d2hXtFAV3M&L&Y6#=8b<`{_>$3O1LO>{x^QZF{}RRK!+djkFC~YT$qj5+F2sxbw%pu56br;n-U?_<5W*593@;OP zC-f&(IlpTd;}G$vEisvPXe-vFM;M#9w86Z4;W|%gNI~*b$VSJhQI6PWfn6UKzx!c^ z4s@uv_b_IG=5?QdAhDfJ1P_)&GsLX}p)stPg}kstfR(E@g6jOXy!2rE{t*9d`Ji{) zJjnfX)%)r3jMe978&OWBBwCY|Z)$FaKy;5osL)=d^o5gOXQE`n;J4A#Hgenu)!)vq zo#VY5kWB1A-1jfsm6-9fQ)&JO_aS$qwWc#cj8pz;*t|*rxlLtR-c_2+2Wl`YtV^K^``3)Vj;^98kAqOCreLG0d&FdB~I?9tb|EvKPj z#sBb?X&4v zSw!UrS;X=KTd-e0@PWt;egnASAmw1L!rm4foRm4n4dQ*@^7`^$&$4qp>!~3sP(M!# zHAHIt?$q=Q#f1svt;BLXOf#ynnrksms*=d*cq%W3aZ^g1;$T)VM9TRQOREqNQQMd; zwxsDOB{BPS+Q9h&I_VWM6l=>zQhxpTe{X=%csP9Zf(_GyPTwke~LTk8p~^Ky<3^K_gN zivIgt(>nQpTF%lEIgSb*GUYpsjOh-gp)Mrz6>;rD$-)*bIpoTMy~W-?uS z%o#2{W@Ent`P;*+u)Hh`)>qQ+rEkEMIMkO^YzQgo0(&dj)S)uTOc~eXc9Ck$@ahVt zRgvRpvYpWm&v3qZs%buLqiV6t9&dkyHLYF|_ull`Vs1IKrR{Qx3b(@iqMbMp)`W9xQG-gE!W0U4}`Qz4FL5l8O%uworTjQOZ zB(wp;a)e0%R|>{kDE22Lm#%M_e#KnA%33gTG#XDH?Ti9AIf4u(-Q9!qmUX;Tq_2eK zSO|(seL8?XMb=`#;#CkHG8Ig0NgiIgPjve;IvPOE^BXka`Fo(;KI6j0pYcK~Y|YA$ zE+rzoFQFL(3S$JJV@7JumgaHIxDW_rDVf5%`0CX*|xH9v=2~u z5ZhWSiUW0_JASnJWOXhPyTOWv=kXZP){5=4C?1SEG}{NQyU!6!+dex}(=@MQI7au% z*tI;Nz1BeC_c9^xH#K^KZ}(-mBwun_az*5;l4wl93!!RT550j->}{16tcYd9js_Gp z;WMj@mKBul?szoMKvb@`I#(|@mT9wMy-zvpBZTqk*GOr}2LhJAk@7nyxlAk~)~ zz2sS-wy-u;*L52BFRxu(J8`|YryxawBN$H=iAe&JZ|hImX|xNG_XRU3EfbE~XY3Z6 z$(}(6OTDn}E1n6Y&LL%8<`Mu(3Q>Im(G3%QSG)tSwA|{}LQ7byg!~N{`4%1;a4YHMsJOYytC z2gOxxL)K+_osLGAvdcq#=CLtX7&W!++m%{Y6@#8ZSyD|Aht{*az$z7H-C~DxHxI}F z2*}^$<$-_|00vdRJg;=@1CoBsJ?1X}cKcQaZ&w)xBWde9V(&fJX@-J|?GN~%OWZMT z-ke2`W06aE6s9a(qet-Y;|~KbWr1*p@$`|pCGEfP2Ijs^yIZ8ljpCWgx^d-O5oC=u zHHIAU`+P_-`)TUZ5sr2gAIWHh^Sdjm1^CKjz;1uH-uV!EAPlCpuL^upOIr@pL!d{V z7j!cfY}@^n6%zP;ogm+_C@rq$y%QiwDE2_cQRv*20>8h}NgYl5AnIcqnVe*@|9cDf zVb}fm?ImoAB{ctrDOXL4O*{VKEN1YXj19u*E-9tETKQ-P$&znv^zxl31}JHmT2DrN zD!JYY(f^f9tO*iRj;Xh4q)D{KO{V7p?t&YTSy(>@*#SDzL%0>W$NB_HwUx3-jWg*4 z{l|Pn?lQ=EDh2_V|IqJ#AdfXdP=YvVUJ75w!f#*2d?ZXzxOrREMP&^%7`SHCj#3Pd{H<;I_?Z7$IL zEZ=1E!VPq(9kP9%PB1yA0k=UgeLYi!NVI&3?%_<7B-B~Z{W3>4+X^iJ%)lo@@Se90p^&^%0>DwWF0hcu;csMg% zsI){tjPmplf^DcQ+LK5bQPZJ9ee)=dx=dVtbQ$lVC^!U2L6dVqaBI~*Oxwh9!% zmTmn+^q8wzDpz?To_l#S8ds?of46Q{zAaVU(RD*EU-@{3q|-(8LVq8Ze?0o0JTv{@ zu;jZ{bzkj9Y{l4YU!eH{Bi4{bC_y9H(-5;HgN$-OK+aKboMGoc0$K6=l_I^ux#sbV ziyI~=|8&-+N`@Knhao%?cZf<7?mjV8>I`dRjB=RlRHhRZIA(HzfP1M%QU={Kv(tei zD$1(9xCE>~W(<@#8z|J*N2DP-n)zzSnPbcgfExz})qqR(;E{v~=BKu@@cWQxPf%0S zDp4D(pn|p_dECU%_2z=h`@0M~c>{niSBR{__t4^{b?z;n`I=p`t?pS`_|7dKAD!M>~B#fFyfVEbZxdJF!Ne`d?SLh%{}4!+`YfLwMx=?@|j z)z-G0r^6%#nW&@%tIH%Z>!-Cci_;F5xpp#q$2pR_xyzC#1Q2?8D07$>S0dAmN%JLU z0yKLW+ma#ucgYU{P>SI1&-n@$2;N+%BkJ zyT_0#Pi#1JT_Qs1wqFT9QZ<~j@Qfyx>eVw*osl)V8^Wh zXpz>Dnz=#6fOm20xWG$yc(~Y;ZI+(Ss8yR){bA+n=wXQ{m111FRsCu8T%Ac9 z_m+jc+%91JD*gQ~{e5@Z1L*(vp#$)wsnBxar@A=Wh^sk|g#XU#YAct`D8=ottqQbRoI)HL zr48)mF7bLpQ(sCNHa^?aAF`gHsc}J*UfdZ9HLR5L7zAzF3Hk2Z)E%=SvfYCxI=>r& zdVmTup#(+n4S(2b&!puWDtL#NDc$wuH5)mvOBbNvdAUrx`Mv@~t#~ERno%awn)Niq6iF=ULnXHP5?9YH9~2# zo>P(F_VrO}lFE=uzMOAYx9|84^m>%_IB-OB(>oG1A}#L~!5{-3yD3nY+FHvt{RYPc_j&+Q!} z)EI53cH9Ps_+;ylcx_p$UsQ~}vK**@#BBQETKff~(L8(J4k+0huFX1PQgBEbX2d#= z)&TF^=-B+LXbTOSzyVI7uX%>rs9*9uq~poz7v+fkT(_!THnr9z7b*^6P$|jaWo#9% z?>X#HoAj=>?NIE1FaexS)Kf`G{X??_k^E(YPlu%>SQ5@HB52ZeF5tTD5PBd?i_`^{ zrrolwRVcl0f52qogW-xQQ6PoQANYex^02*c)wkn zR~ZYKBvHUSiYd_OmYl903j2G>J%AH!<$A)OkLRDAI~}P6@NASA$;2;xjM^d$a@oGW zKua`sP?2g?L5#3)8pW(GJF zVRL2Kv4gkHEh)g!6olL9AN2jIzFihg6qacE?d3#s%KDoeYt4n(BONz428{FXe9Och zpVxt>aCvYpwgG>rSjzX!FGeO9O--yYnhh+i$YD2EywQ-7RP@{IulgSb|mhm-KO z74B@H3{2H|9WYKtf?z-uDFg;}iuoi7MjV?$6CJ-xpV%EolN_k(e?tH-K+wPFerU%) z)3nV1N+HOqN`pg@C-K1_5f5J!R-&mQM_PkK0>ghm-hq=7qlQY>>*YprOp_57$PI4% z4gI05r{)Ld_6M+n!pM2@r#MvC>!0(hmGG5T^+Av=NONX4lT+AFIf1Yhuh7gca*P<5 zNEMj|bLTT4Go09xFn&*XI&Qw`yM2#)z*3j)P5Bz-M*6yaFMGER<%#cAsB^hLv3XKH zKQ(W(54`|s{@q+7|KI5sSRCd^3{G5{3ZD@cbu?JOq6y0lTnMZA_L?ORG1D$!Z_CUW zKvfiU^&FLXD`xo0mUB`9;Z%qb>Jw7!hqa` z2Fi|2zjx(mw2jV_TGs0kG=DL85PO4!fz)ZiS^M9EuyPUsecH4+*)z&Wpy6Z5YP$Yh zMNmAX3mp(itQUdnJ*-HmByCJEo0pAV0jA_$_4urLS`DR?VJ*NtL-I;+x?4i2n*`># z?yk^jPkyX1&H+K;?^nXku3${Mhr!ctLX@$^LRK+B>rg`7V#IY_=}W?agnFL}UUk@} zxczpDL*SUpxJJ{%D8P5AbSbqL)QAe5$(U)9KSg=95u?l@P9$U#4n6V|+Fz@telhnL2k$?Y2 zSzHrhOXK$T8`7RfcVuo0PA1b6P9_X)rC{}*zhjD zDszFZ49)16=Zlb6esb+=Ln=hKwJ^_kTbfYgF>6}c`CE1j{LmzSjHb-07p7=r)iiW|N#z)Q@UXs>%8kV=W7>I_PYP&cQ_uf{q>Uzt~x zaRgWM#fcZtzPK4~c|!!_hHOkE%D1t`@@w4$uLRc;I^WH;hcg; z(!TI#+B|&2GKKVWCKEJFr_K&(aOxOKs(%LIYD9BbuuQpbeEL|a6QzSy;}_yy2IsYN zEExPm=!YB!^w8T2c+ox7zGxhvb7|0kBs>J1F!z7#Xu%mIQI)N)i-_3|)6~V_&S8RD zdezMOV(AG^F7GYI@{ZTC_SXu3fX!Rd(U#`dI@OKa(L~on(RhagQF1V8CZ-mA+;%yP zPHxgspwryG8~wiA`e_JT=fM(T%HY=^2KOhWqhPlA9%$1w)@o2H<$ztbMY!E$&%Vjt zN_@i79u2bXCrb1G49r4dF(*U9$5J6QNN0+uVENU<-lMQysWI_$=oKT8mXLu;*@2H} zLpokFxVPP(NltE!1k9$EsbO1rCG2tLK-X{?4p}Lb#iA#moaj0z zYgy#0ZT(UdmyY(8j-`Ky&kF9ck2H}GZ+(AM9Vxj8a!yhjcWqe!zjfOc_+OA7R0<7- z$PBf3&lL~4qVK#7TUm;x+tRD%)*0PvK!PAhR?&vDi+Bb7jl%>Fj^A?wk51c|t1Ir%baBr`%0ch5 ztd}nFE4u?Xbb{Kj9+?E5?Rx>w1sD+&6Eqcr-v^8&U!zA_Gcd_a571=nLDlc*oq1!kGmEyLOJ2=os$zQRM=jk z5R2eup%*7cjT~{0s;;YSQE8QW}qo&ZD{6dFWqNug0%Zrv-8x-iza6{cekNz4bC;U_fFfX7Lz zH4G)p6#j5!X;8WwuoD4HOTs zuWPBukcSdJa8{n#run7CVQ*l}F9Ddcyi9TE@5+rEXTOc4O5jrXDBRL7>j=datfZvq z5xRf+Qsd>%jcBP1W zD}jL#-p&jE%N13mx@GaytR-u5pENQGEip8~| zod!_`ltkyB2yhak0R!B-Q$2}fR@mx8!qCP@83|{YfRk+Q?zkbWch6ylOv5Afa+IuX z`)n33Ag3-Ff|ZLad75Wi+niNxQ$uE9CU&+MxRc8rTE33T)S|O*f%bq~bY`zxgD`rZ zj>G->pF#(mMrLSBLgC{Wwl4PsT`&+6A)AKwEqCAy3f%N8# zDz1YtW=I4nw8{kU4@Y$2vRvI?)vpq=YMzw;-~8p)%<-56D$(bnLSzk`^ts+=3AuA>7pMjUHw2$y-t3xzs>1k;9xY#9|<)EZ#PP-Ppi+*?m0kO zjn4UE@_C)j;V#~QJ+)IbE2fh?4U7QrevlouneEij?6sS#9?JtG^gf$SQ$tAwgr1Ev z)TYhIa!J~3Tlb~yykEc&E*3pU?(kFPGi&P!_C8HJU4Lbv)J`b+V+8JlIE z%AsHytrv+HF9%S+r{TjLoOL2U1@^O+QhJ19%wfLN(Gq0n4=DexWUhRt?A6Aleh@Eb z+WW#_PC^%3%7UICcoAXgtxeT4miWdBA!8;g6-3l@v@VQ1e_%1@<*um5X`^x?M|WK3 zucPumyO20*{~*-X9kapb54%tE><9$waE7wvkLT60m0f!+0I8A>FTKBRLF4T~!B2qM6#j$W+!| zMbrNS8mFg;QY10hkP7k#LBHhr_EmT0W~cG9(~ABo7E~4lvux1R*CR_v7epBVu;HMz z+u`~$ivVZf_%J6W%=e+%$`YusUXOj1Z?}fG*o13fO+uaxBwgW(8&~BX@|}$_ZiEyG zBY6mT8&P3}Cjw+n%kI5=u_teN)5%#>;IvHuCp~l{a=-zOR{joj6sXs{k)()qlr2F~YtGhb+2%xqK zAf%Z~2nMXjle!ZXtJQI0-E_!PWLXxg%9a~5GeAa0;}%74!2|%6nl2l}Mt{Hq&v6nYW6XDtxjy>}mT@a6J1GPd zUqbYX>RYCi)_zlLu`d~Qj^n%C0Dv(6yLV(MB#a~e`=1{PfQC}N!#IkOw#x{=q=3=C zdn_-ym5W8XH7Jd3X@;qlL0h{ZjIhd*)7nhT?5C!yB#lTdk-&r#8C_+ij`+ zj=lk>QNR%GipUPg3=8tFtdZQQiXd$az`&n*Qor_ZmaQ4p}dw zQ*mShSxR;4_CVeX$ux#%dD0+kHl=8QGtIbm=0j4>yXf7U=-F=$w|Aw~BO2iD$h5|Eyu;dioG~Yy}(GX?9#@wsUHG692< z2+0$Lw`q643xF&^^Znt@%H)hPE`f`YAlZseqEULf)HHvPLOAZT4ylkrRq-1kR0NVC z8IG-2VRgXix$92nr2%K>Rc}eIIM3ZL#&bY?`nftvlSMtBM0Off+T{NXRne;;V;$4j zl^F`VF9xE-LHQB8AQDssajh*5C6(18J3;UR z==w+1k^N!Xu=I!*eV_rD^UxQQ4oK0MGPA^T@%)nUv$K7rQorNAtM&rjUyl%IsW0(E zX5m!|i4pX~qKElMuytTS?(i3BI8kIQHLd--29j#W6Pg42&o@)t%A%XnX-fwXa4AYv z6`(R7zV7Dc=e~h3bNs#5Uwe^HkuCXcmRn>y&1NB?MgvLD(a93ts*OK8odBi@Z`kmQ z8=t!OmdQ|-4B-wD_7Y8Xpj2pJZ>fyJ zv1z6aC^N(JOamfhtxj*XG0X&UOEZlJ5}S>#8{5#=ruJK#JZ%5)XT!n`=0DPrsMSB* zesEVzBIb6hcbH&zjVMJFA;IGSx?&+%=+VQ!$FIpKq9Y{H84~Yi)NA!U7#K(-(g7oB z0FRjl`sM}F&0{ztGj!;}f=(RU@uhrM8M6-hC zV#`OCdD{id1?oY67EOeu4pADw3pfq<%!k8gXbERX$CpZSE8=!EJerZES~~34$

HlAi2O{-l;`Q)n(`kav{G9psa;a&Db@2olN?9&pWcoz4$XB&p(D#QEy6N`V7c zRaR7A-mFT25)8N+R1aUwf#5RD!b-cUd2G+7xCch=Ch|=BGJ%ZE!XHi(lasTLt>>jw z7B!BtGA6VzLn%|Q$6E1hTL|EQ>L913FN7l4CSx)J}&_uKgqfOkjO}Nrrwrs z?MNI*9F-v7mn)eb&-($4{|hLhYnF_iBKfaKekLTsFgXdC<+M2~#-v}TvoNP$JB!VJ z*nO4wJNO_1>4@oUIk|m@ZlSoLTV_E7@Q(6qrDDI>0@#AZB8`o9@E`8n#Xh{O5%_4g zi;9#_(f*q4%OfnB3<_P+)E~>QbN}>!=?YWZ(Dd!T` zL0>LDcnzo~Sau2#+(Dj6D}=wU6y2rAQ|wDZMP=fXX@DL7THBXoq(rs+Yj***)GZL~ zmo-?b5*9677Ns@WyS5sVG9FdP9@pq z`iA}r0A3~^WaR(*k)=Zips0)jPDO{4@&2O``~*h-glijoCEy+&Dk%ae4}mz0af;9n z!hHx)>t^acza{#-0f3<+7I3($FdHa-&#vp%FZJeCIhuW!RB@p0`blODaS%q9?$Plqs?Ffb^b8Y;2Q)Q`EwVu5X z{YXq)DF!;*%NUG+yHdB8`|3GM)M1BiB`~fEsk)negHcK3hPTaHS}azIPfaG>eiv+B z2757#lvO)P#+fJ4AB;bXqiV5JtZSoGkANc2f1{mY*ZJ`A-pe?1by&luM#B(;Co6NY zGN>hdCk&)Vnd`R|`Nv`|=ja$N6Kl-qYAg28T~j3wYg8KPTZi?<-FmLu0yNf;Mrd_3 zJkCKtz0vaNB1@OMPDj@$1RCB;RAM7b*SZ%U5m(4Xo)4hKV^gf~DJBmF$xy(o zuc-PT&ZBknn?45z-Wgo=M*k)>?*({_331pbO|7<$`e7U+>Q3wcSWL;G-0hFE!kj3T zOj7v6`xv{%x&qE@(s1D*PV-*sI`2FLSS@hPPX!9&co&lkvW_h03o8T={>A`nDOGTf(WSyNexjv|&%+1T{Q+QNW=8D5Z8 zZ&&ALxVc%T94j{s+%v%k0t>7fWx)UJ&~yONfQ9$#J%vMUNt(MB+z8xPfpF=}ZsU>T zhuOi#1O8bD=%5xbi%tap{lMk90)$DX1U-^raTNVHnfwN7qva7A_4n_!xvs%i_Q6v- zi&KFhKuPQq#b6!Qx~g-lbrR1vT0cd_6ScM4*T6w06f-a*3Q90pneEONoOTtsbBjTV zkfmRl7UUq2a&DL||HPZS6V^M)X8`vh-R+@-jU~K%6&kTX8Cpmg(+~?DNddR@Q)a+M z22fRFNHF5`3Z9|F8j6e4h)QSij#8^zgN{i|`h?4s{X)sMb)P7A66Z4N3=Pq8rV z2hW=e9}aE!%M`GJ5i3kI=iyb1!!|ZP^;Z-K+ZUn|EaJ5olPjY+v`MLNrM>%dZv`UQ z+)h!rnBw!RBUDDy#CT|rHlsu3nuZ-43ixr1_jPhyQu z>$O_-V7~*;gDe}A1R6NuSV_>nbtb{Qw`_wn?WO<+;*WkaCXPfu;aLGnFJoKbJr92F zH;3@qAnL1u7`>O+&a1=0MlnX%@NM3=-HK84E2VfAEj*zguG_sludYvcv4e}OjuV+$ zMwR{Ej~xT9%n-gsN6Xi0+l>x)W4#!KP~U+W4N2ZWvKUC>9s<*hgy!Ey&uqx=&v{xMj?xvUQfgC*h7X9b_0Q`BRNT8YkV6l$Hw#p`_ZP^UFo`d8JDLfR%p@ zxrwWER>StcGVQGTiG-$1*pg$3Sb^szBR?eR(I(BfX2Wl>Id9DClML~2mzGgPwBnVS zf_)dpd1zF%!a~1A5f+ zG;1+<+_gBJSUm2zx%}ck4&1FGaQZ*m*A9CA@6Pmm z<$*QBGy|JZD))vnyj|CgEceT@VnzGcOBtAp)nCQ|cK+87O2+zM&O?w=w@6DE*S@BQ zM8FDVL7REE=lAx5t&iYmCjpxiKA={!7lI>#JB@_y;liHX72NV6dO>Go|cm+Ae|Sju;(Q$;oxJxWblz+`3g$@+^LrZY@%$n@^7UL!SDIlU05IsrVGiqHaP{s&Jz7e`hS8xhkBbSN9dn`VHo_}XQBvWde<`%qhW`KVS14U?;{Hg>3 z^|QEt$OLiQe_e(R`yB@u%02f(^fMZ*)99tPVUb1&zs7O=FjI!AGq#|1`15okG^pW! zLT4x22&E9f+^Z*Acu9Fvb9Qt9eY1<6If+x%hTQ*=2>QzkNyHdrtPJggt;#@(xV-KK zG4&VD*=*(tS#*##oYu@yp6w&Esu7==f%R*@G2L{%``Iy1ZKny?Mz-QK?WMeD_qPDT z5|l~Q?Ls8H_Ve?yW?7p`Zyr1?U=w1g)dnJ606?h!N#vyeSpt#xsVr&N$JH3?+lPRy zLC5{`N8x(ZC6k-%>Z)ZiQ=FqR*muY0!-5^fyDcf#mmbHCmm2D9%}lHd`-SiYaDq-4 z5ES}*&g!|{7tcxy&OwF4Y52_o{WWk$Bd`j_#3shL#z#q5L&o;OpmU7o!tw6+S)v?G zwyIV)z~u&q_P5;30H+dSpFF$2_ts@=wikkpEe1-h>dp#9bNq_9YA_8cL~EzummF=t*OEppStma?1#} zDSqDhU4dIe?5-7Ba4vLyiMp~?EM~UKQ#U2F?k`V(h{h0-9Z{+;0)*z{ur)_Xh@jFo zrgY1o20wm1T9C1p$P*VD4U%{PQmxW6yiGpA`;xXm$$tD_MPt8j>g5N7G_9ElE#GJG zRNPx#QAR=E;lU$Fk6EWfkc?e3Z?Qk{ekJ1%=^Ob03DLw%odUr&Akt!ULm2fX;8D5( zxRQ9{O_Z>Yu#v?98n973U?D_&$z5|v+i+=iC~EvF1w?C>qQlDh`osNZGTm2*jRESo zB_6Se5$uiNOqTIUQA1{0*478>t)sa#o#q8t{MSKVFDkg)?!8^}tZP$wqE~40CFyZf zya_Bn;Tro)WwAkaT1(OnXr|QmCkZy+o%IlYsFz|eQVZk=4)yPi*0)@lz1n?jJ*AP1 zk$;{B=yn}Fl#!Gynz(xriU8LC4Lu>jXw?wLA8&?DpNTb6n^I6=#`uTZ`~8~FU2n<$ z+ZE!j**b(UCBm3r*%$B8UGioSYm&oJZl`t#qYK z`^n~s4YeI5FljM-9viZt+lC)LXi)j)i#`nBO>s8&4sr zpjKMj1Q)HYyJp&Y&sK4hBzGsFMfd;Ujnnz`9@q18F$flje1L7g{`!nd3?XrO{R{`o zfiSw@0k;)=6mj3H+n_!B&JYg*exyK9 zKJ=TU9ujoa|9F2}Q(Aoe?C?l-#(*{+lnWaA_v!sh2Pmh!gtl0N$r%5#OSi2p@*k?4 zgd;&!x%RwJf>cp9xI2={%YpWGW|It$sRzm2(03w_cQv(T;e}?bGW|=75*s7QOI#Loqg_w6F3on*8F2ByXFhP8RL%u08Kf>z270c?2a<|vn`R| zb*eq807H>TpgEd55ehRN8W|byFE$V{=tQjxho8ld^!(Q&4G23#u))+`eSPvEl#sMjNZ`Lkx@x z=B=ASAt|UXGQ_oy9wY!SlC!A}`b5XU>dn)L+8`QgSckWGiVxA5x;unWAk71JoPes%dX|we!H*K^;Kd*Z$7l#>xlIuxMsSSF=I| zR6-;U|B-3A104F#TDeX5f9`Dz$rcz>lwfF^E*O@6Ya*DD#kcD`RoRrkt{M?DZ}k86 zG5Pw8f6krt>lu(RPJjpQ28J>n6h~bie2xGnXcdL0s}tKQ5PrYO;1h?C=mPyXP~~=a zXP>_-zk%c|lWfod5<%#>jkUUssF1T2VV4Bnrj(mwEApAdkGitd#3M;%ed}BA9Tz*p z^K;EN@%h49nZZaH_cSpf9J(`blpDVRz(j(MC2I@FTz8hSBx8_4wAH%Dns*RQG+GtU zM|D<+q4v!j%io{F&zkIG;uQ;z7x8J~p(cj_F92$SqN}3FYts09Kx&1Og>DX55~7hB zzVwGQ*L2#{^~go<|;db_nsD$y1IYu(tcXkpSH4u{rv)Y zyv{Mk{hqSE9?Q?4k32yVYN~rGoG^M8&+7HXQ6LDWse&j;R)N78`Q~uF%*x`m^vmiw z4ZlE+)@zjV>TDVzBot&p|-Jw>WSbQUOiyb-keE;@cWeh z{thG|=Xbq|QDy#Y@xVI$b^?pQQ0iVzYJ+lMfIV!IGl2(Z|K)TP|i;1kHLjfe%xKl%SQR*^qo2OQ zKlx517j%H6VKyQ(I|^7JE9D~(0AHrmHdd5n(m-4~M#1N#bJ9Bb4whfIKc+9#FGP61 z(L{5`NiLNy1H*J?1piPp(~T=F*V37L`HaS^_X9cF)1sl$AW3f{!fvnwcSGBE8|)g; zMEro|Af9C`eX{TXxH)N!f%^mXHF}gS~wv`V-_~VNn%eL}QjnI@@QR z`^k`VtvzIie_mu9QQ?U9qT0-oiv+LEr9K=+2g<0bG|k=Iag^Ipua8%@R(M@(0eE39 zir5d3n-i@w9;}efDc# zyJ^gA*7@;*^|+0=@;%VT$vtVTiDBMwJF1V-r|a&!UyiKZePt5US1ofyyRNoohWAfC zj!#|n957a$*a{QA%(X{)y$OH~W`>j5CWdksB&%r)pMiv?I0f}k)1!f9=0ChI52CK)@U_R3fzlIHDpT6rUB}(>JKd{IW<@ody8l;HDV9>jvs70$8H0s zOG>sdIeZLsIP!VG8F9#An+H{^r=eV&>d6HN>_wzoupG|grf2;MWi*Wa(<{dtU7YK}-1;aPhZ zt&H8_l7s}bJ7F^GBQ>YoE2x+Y-Ux;dv%ZeEG)8Xxj#_(wm|>Q2Qplcf1+j&U(3*&a zBg6VEx(?@D>O3};xU^FU2oD&EwEDBHBjBTLLq?H+&RpxEK^kRaOLfh7XGn`QifnVz zAG;!aHky0FWIj%t<-Tjp&S3f@%U}7tL^yd>L@?cq>rMhzd#E_*MxMm<{A=5|4*<}w z>9N98UP%P+wkn4u_~nshm#S}@Qco9C8H2&d`xCUb1~@k1%x)F89TB)wjG2Np?; z=+`WcpP437i;bBoGFJGQW!%LE?*~5IPd}8NpLxbtrD4~jXZxr7D~vY{S>;utb}&Li za*^A0wFD6+nWxXRx!orJzav;Bu?|*TTN&nZX);JV&R`Z4Uu`1Wipl6^qYD??!+H>KF==UZ&e$R@ynle?v&<zj)|?-$in;PdoUzy_1)*@F(LK;`&x24ySqR`+wjth(i z@2EZs{4x|M-fDGa+xj?yCoId$Wz`k%e}x@wzYuAc^DdQvL;Am&E8m0XqJ$&=Wi9M_ zG+RMb$jS22M|`(Y<(BxuKxVOl-asRaGKGo}DFi~Jc6V-^FUFmKwR`+2##w@%@yz$o z4kv%fcgF2P7!Xc9NduVUj8mUbh!^ylnK+c*nINYvja!+m;%Sk743iA?S(O(xiH{f{ z+fX^JMr!W*#sMD}`CQ(XU**@Pj~*9O%>KSYj+dw{x%s4RzD=ycnF8aPD-latCUbCQ zh6J7aT30L(1iKmnQIx{;2j=Z6t2lS5a$5&LuibMUcz|_Wsq$Fg7?4t@)41iLJ)3wA z(gW1}n*&VnzZ_sR;6OHqeQ-005fNZQI_GZ*_LkmO6UGD2Jz%J-@FYVgn>2E%NLWU3 zs;_zCJgkJmVl6C)3;sGSlXfd+QHjCd{6XI{LM{Zb_M3@hP8RJOpPgU*h)K!p7k1Km zh%)yMjrrquv83D5o}-QtnG}&l!_n}nFd)B;ASNwL-(&(yo=^55rgo6g+JF&!7KfsRvx(rVLbr}YV0IJKD`UavR zr1bq;fFTC|Iwij7D9BFq?q15PFNKEsZc#(FRaiaFBSbv%A+D z+y*#CF$uJQ@cky)8C4@LIPN7J8g3+z7(xQ$C4iP7b9j8xJwkph z0R?`M+SHP5=x2ty-B(kHR<2u%Zc0HG=UnqHf7N)&hYszlD`Ppu?$247!yV5}B*?z0 z_{?ptTHfRqw!Usn+<4%-ep4F6xKimVA3|yp9DAq$|2?6%Z=rgDlwylXGk$auJk0O4f}R0`|B7)u5nhzD5BXLJEra^$}BRPk716f zdBwaxZDd@WZm9_jOLx(KphOEhsypBj>dC|Z(9{I29U*~wwPuJ|$K|m5^!N~>LfdB6 zd7lm$UUq5qE>Nay1AlJ5)V6~|bI2iLAfGn&ZIQ7-`N3ywvnh?70GB2@YwdsWYVvdE zD>tmZ;1~e{V(fRgo2#43MMG(1Il+qEbp4v6pbWSc?z_sJq2i;E9nH^0nUb zbRgNw1EAIu8h(l#!y2U93T}!m5t973=wl!bVE6yOr8|)*kH&~2F&ZBWJU0P;lY*`x zX=Yb0B(;>Wau(7Ao{4bajwSX8b+ERb8Ub!gu1eO2zmvPC=ZWMn zT)X?{fS(M7!Fk+&3*l>SXK~eu9hPp{J^yvqM-F%`WX)fPvJ#evE@mgHruJA@G$$gU zgt>ev-U@>NSjN)hroN>tN%P-`n>C}zU=9kBOk}A^Nm3Spl6+u!7>8G#-|Zd6|8A#O zHfBgNq8=^ocpzXz!TS_nyBFIiht3;eP$7Z!`>wXY=35q5NryebsMhQd?Q25jp(TGF zP968(ppG;*haU?Z$4z!qAuU zrPC1tV`Gt+^4>%cdZ?WuYiXgKJkCZ)CsFrraddr1!L8nax(Al0dID`s{`RPpea3`S zc+x2yWwFrAJ7W!!o-2sVUwJZ?n-E$_ZAJtfaVH`q4)cyTh$gs3WfieR&P|wgX2C@% zZ1t)o^W&ryQW?IQ6My$P?7JzSQKiV|XRr)XecjXEfX}a%`TABN988>XEoA{+>%Rr& z=?mc|2sj~^$Zl;37m3@9S+cdno4^vl<=JMTZKY&2RgJU&v~k!da9f)AwPdQ%n#nsYQZKhSOU=;+;= zrdcrn5yi$5e&dGDtwn%8reJ=gZ)Sy()4tmqHy&K>ZMq)ru+~2sh?nZ_jQr1QGw9Mw zw1O6MfY3ppw-&D+?by6*Vu4oaAvavUU+F(%@4w@CTjI}qTF4s@NW^4^Zbqa=xk`OT zNhXJ=LUbHF%Ax|-ypFw0B^7tFCPMuOm@IJ|WMy@tHOfuWlJ@?Km&#Rn!(HlY3S?Ub z)YGy0VO4|ZI@G<5WWH~Th>eAUTctOSSJJ`IE$DXdijA{zDq3SMHdjLks;I^5KL_)f z(*>}&Fy_&SiS=XCv%M>M6eC#PR)&?=>dtl$_&VU{fGK7wWx<*CEw(TsjF`Fo&g%(1 zAVY%tk?eB&KpYI6g@I@@v7oPDRMy-6Gi9Cw?|iIlhC0?By9BwTdveG4euin>lzA!* z*#v(H`Hv!M2Zc4@umEA_*f2mluMx@@vnqY}%Tz<*wl3rL<*GGVfs7A}HMA%oVC@@A zQsN2LVvc#)Yq%Z2fS0-Wr*u^_1>4i^+m3jXoub@~8t=c~Ud9~0Q8Hd^;fdOPWp;;? zL=A{M$c~Qq0MQLnr<;pb?|=V|Gz42>kt~}!gmlPnVBhEG-_v1A*)5q{6c;C%c;F%H z0V1xf9=IqR=(gq~GH>~y7m`BMB^Cl0bDDBG(Ze3sUutGnVB&56^z7a9G0lNfdtq*J znus7pIIu`Z^AY8Fy_VpbVLbnZ&KbWI=g$W&?n3{}fI-bFljv4Ugif1sF|&<2gj?g5 z4ec{#fKH=5a4N;d;4tE=;UwKqE;G0-#tIYkI3();4C9b8f#ys7g;eGDM%w)(j*zbz zeJ93nNyw6{M%VKV<%INEL<=8O3K&pPgjF|PEe#JCr+WE%1%T#HP;te1T9u!6+A6UblWb9fIWiu&8Fy`GjF^07YZ3XgccrGe;DYj^qdT07;wx&YH6 zb+}z{IHADT)`QKXb&MSn!FG6eS7hzy4As;ggzc~oknYFBom3w-vyITH^l;*VY*%`(7q{KP zWHd3xybioA9u%H9reL=tL)=-JqF|IqR7h|24>l)=Wc?JcDX0()yuK>gcF7E(KoA?A zI`Q^AwY0(Mzevcr*4^_wt=)PNOWr5`X-AD~ zwq^0lrb1vEpo@WPa?6peTnUAgB0*UO9>1jAY@fe`LSe$VBy2qeZd0+yq1WL%_V4-6 zP24)3ZoDz);8tw5jZ`Qmn7S=&p>#E_*6W=UfXNDdg1Oc#wYsC&RNNZP-vCarHtw$2 z#MmvwSrqP(2}i{|J(`T{enbVew7kUW=|H}Wfv zXt0VT)%nMKAYa%X=egr~ArhsC11*&`ui*}>v?OZYRRnC915AG78j zlp2*1ED?zFzSR5Qvdvt%e&5pN>4A`U7G@n5YhMAG=ixrU&Hrfn5+Xl@079QJ#&@uA zGtHl-W#b6O;x<8mG6qc(gLBiPUd2+W&JN8K)7+?_FD|a%wY7KNF5|Rl53)+G9$c(d`axzVeZ<^R*MaSDJeK72oW2&8f0Z? zyqlDiXi|={p#VXUI$1YS7&XNGk59^Y>YHVYiX@OUCSU{|Op2Ten5?KHHJpIbrTHCr ztgH+;0B0)AA&v_(lNwX?0sN$vRYlZ7F)yA*!7d6DYqrEop)nIVtxwk*)064P&`oK^ zWW($XvNRKONs2S(NLiWasp&LB4pUQ5-X@w8g{7R$D)CXid{~ES*PZ?v*mG`!nH>UE z7<^!yXBx8?Ap4%AQEc}=;-E9U%3YqBpLxV;co90|g^HGHkNFJ3W)Dwm*B!Byr5>yj zX%UOmQ0WBhe`KHcLui@)yt35fWN(uOoCfUHT9V>L<$QhBU55>a*1RjxEH~heWZc4b zwnHW$u9g4XYpy{bHtr_O`e^D~b~gQ3GIE`!n*kJQI;Q5 z*8~L{WUx*zV8i`UX&id>Th{>5?=v9)EF@|P#FvjT^skSW#2yOxVpCBetRnm@{GI+H zl9GpQ+NZ*Lyx4iuOeK$VX%9zQ24s$>%7s?C&@bINbv4HBt#X_%aX*V+4;FPdo=5o=A zE29dB*$5Xr>i(}^8koQkK^^Rfp4wfr3O~{4rR^~{P49xo=SZS`FCf#cI({hc27qvQ zEA$;n7ia@&WrC*5EMtowUJeMF5iLyq<6|;gkKYju6Rud2t>x(Bn&B8VxHc|)L@;R~ z*AToZsw-X)s6w$NCgdV`^wTsugSxN?<#vsXTva%_8?APY`x+QKLJIJTcji3FM zyxLR=LhU=Z@_i0WN&5?mY9Nph`Tr5H*S(I$PQqe6E5maIKuPZNpc}diUvL_ne zMk%$55-LO@M}IJc423qwA|!|JQzz|KKDt19CQI*4R{68dO*<*)H=V26vI-Knt0Aap z_9vDtoYIa>^-~fBdHGJuj$f}e*UyLhZ40b#7w6t$`ha^h06>YRLw>PQ=pj!_hA_Su z3Sj7y05l&3m0sS)F3V&d2Cly)7mgd(9X1tzkQ>+_0E=exgxGU}fC$)9*|;hgh_hOL zQnD)Ahg)p@>f;Z%)M230+VOP~EL?Bq6Ce9VB7~`#C&u9Vulg#Z)rh(+V`6E9PKq=~ z!H<8c0LVcQVQ826oAV{jPPqrW_epkd%sT)rgboBp54j?CJk>){Jj1PpZCBG0WwWI$ zNVc_hAK=q}HLPw@P7EQ4{@Z!Q`Bzk3kP_uJGy$D7bjRna_wmE0Q6gigGOOUwm@zLQCG&x~#Qg3j!1WS~V zFw&PC6-sn^UyKDSo%u7|f@nQvMj>*Bg6W$T^kBphUYj+v{QxQC*3^J{fWa!8uwXN* zJB3?yu2~M%#1f&ow~5jQ7okC79TA#CTWX^FHxBUUbO2rej14fB0|=wy2`YQ?*v!hx zltOCFO20Kd-!&+drD(bYv9PIVRp3ui*^6ja9$;CiL8`L=t4R<9DBvv(Nk?!QR{&1t zm)hj&3(;qYM-{MEyL$jv7OrMX_~Z1MqZnn5mXy(E;8nvZj+h;cgQmaaV>UCtTOxuC z{&K=F(H7*HgS$``(AJY@-Ev`!^;Jl`IGnmdk%*1#_h*oTKe6}tkTKVw5J_S&O!!9A z^tzqY*e%$*^wKAJCkO=ew_E$n?s_iXAmv~za}J3Yec^M!^|pDI_qwfjB&dHMoA zao^kJQI|^@Wku_>T^-|(u5KGZm^);t545EMb?nIb*z5@B)JKNV*fYp?CWn%7ffkTG zY?dS)=f)4;WMr?Ttcxi-o@9pmh~)r)c3*WLW-n93&Zi!n9~w3)1xwA=*Phg%!4bk~=mpm#;-J^JF9=W3<{pRABqj#(mK2@HXVP(CV`doH9<#!9xF) zB&NIj$t8bfr3Q7GEo8Us$PRK#OfmYZKz|54_q+jSSy~)J_si4Z;#LmNu{;Zkf#{^+9W35#3>G*=Y(Dr)D3-i)_Jc&WX88nuJEI|N4K)$~k z!Icn|BY|aO(<~XLb4$ry5vvVB%!Oj?w}8TT$zfqwWTD2Q3+8>&mNv`=$NQVy=FcgMbKJ?lic-oA{!6;i19OfedHPN6K zbzQDL8#}Vr%ElaUGqh5?G;!1NM#4tb7-Vcr(jGzP^H{Dv3#jL=`v$Lx@9)pPaE6_= zj*F#8M<@Mv!=t3}{byYK_iicH7~ejKo9HZdB#A{Mb1&_V!sy+myFRnMpnc7;o%@ZA zL*DTK0Hyy2EalE7|9}PeAFv?)U$7YMPR+sKeg{{*<-EZb{XvX2Ii!bJkN+fLO2pg% zuu+&Re$*qY2c<5%G#0}D`@7A{_krieI-9Lb(;z)u)A{~_aLn9FAV7)p4_~)F)=Roc zoY8dUXVuc@8?8XoMJ~#tkWiz6&6x?%&iL)ZkKg#lS>S#f1W7p62=$2h0DupW1c~@2 zcOv>)F`OTnd{hjSRo2%Yk~sPI@&)khKd8td$^{Wa=>6MoF0_iLY*H&*62#Kb({BbU zmYUKg{!TnfEY`ibR+xJA3-H0i^Q~&B_G@l)1JMCiS#ZE|yV2=&TmXzups-qyPO$s^ zhV7-ZBTRt+&Q^wlt^ef?#P3AfjAr zRhG+uu>YXlg+r<6!%1~Za3L&6#>!BxCPUiv_+9R>Jb|%wH}_oJL}Z=ATtxs<5b6YuAN?KfEOq%TZ#EG?dsg)RPjc2z1sRMq`GS zUkED~o)+Ty5Up$-y8fW*!|Q{oR+JkwVfeJF45ZSqAqmJP{tQ^kLiVW zi+P?^9BY@}V6wjOV)7kzf3<8j{^XxQgn=_z!+i1`iIDlH39L@46JRazU*$^yej^BZUV#0>NBWW;=URF zc4{gdx?osIL#7<#?O2m>FyCynIxP3Wzz$R4QuqHpIe&HMMav7}FwC$zi+-JBe1XQj zg&QG5>PDdmr1<(G03;&em%pt(TdpV2=KHgc&!9Fez&=PRF~{cEGyU1#+HApQs9qKH z^)x5b#hFYxwwIf%6Zh%t#BgIPN(|!KklQ4Xa_-C}1B?{3oJ(m9Zfi(O8uN6bD==Jn zG4Ugy4#mhUmv7YgKmdl0e$RS@FYvX6%}CX)*Hb{#At@(BoLN(QJeW2kHZvmD6IR}B z$9Rm4YX?)JbE02X3LCf#tzEJ9^WY;9Ca5+*LdHs`@SU1oyza106DSmoeU*Ot%&Wnw zH}Jibp0H+^Pt^`qVSTo%mYdzctXi3YGhhZ8;D40Tf+#yYD56R-h^~JSB504-=6#P}Go`c?*f8Cvb-K#=${(X zaM@rwTE*C)4H~HP0sU*i8Jds+TGt|pnxBqw+&w<1)9U(l!uY?OafKKmL-PzZz(!)` zF~bRSDLWptiInLe)Zv1Jl@NBU(63N5ctBV=KE~-yIyzo$_8+rCzELDhC8n{u%n)@NUpVmv)?rJ6PB)=cbHRP zGsHVSG0=8*o6i9HT4vPq;J>3UUEO^?qB-yx6xb=E-{u%!L4XNo2K-|Engqj&Y6%GD zV)%-Fb<%`^hc0(|q)rLi9Qjhx6g8knVV)a`ojpJm2y1CT zy?kO04BCN);?7Pu=^)K@IH$~8`LUG7rlq2_xIn=cKKzFFGdw9jTiyPuE6BuKvX=2< zHW@?Dz3gyTyjlVs%s`K*>9aq1frSQ5^H#aqD zHaeJc8Nak|qXB>Xgaw3uXFxWqOLw}Ev&QTiYkWN+VM8&ej4W#-6 zx5P`jaOg{oY$rjluxivnzJ*-GSF4wBJOwt>iTJ2jSNiXdrQD^d?B9V&B)C9|uIS_U z^uJbcA}S0UpQlGFsOq{bR|9l^^ZdZ_{9yCF%ue#6rROlF-2s$o zxK^{1xs8gQVIhO>J%NHNDi!wCwJcy@iBN7TL@ZxgoNW$$?=gc+7>X=9^#PfzUK50p z_Xg3!QOGA$tU+AW@2rWR_qK3)+ntm+sBDYnhP=--qq z)|e{JYWs+yYaJMlcA)7am$S(Q(O*MyX9E)N$bz4_{E9Lg53=f1;Cv6Q+9 zySO?YAZpdgU1vAG33Zi}i1n`xn;l(v?$9JoIcwB*?f1U}odTF^$E^lysZE{xyHRU8 z+HC6T<@;M{;rtO;br}QyGP|p$?pG7I15(2-cRiF}4cui^^M{XtrJeS8Jbkp$ z*n}Pp>96l6F0Y`(wfx9C^m&p4ug7>#{%8PQwyp{rQ<2amV9`8oAB5MCFMRPsg7 z9R!jrG%uK{5TYj}@1(ExZp@3^0f3i+OZJ-{u2e1Re*0da5zFMY=8ZJ&-nZIK+0ZX2 zFq@F=77ehxZOY&IAz<-RR1G%l(2@^vwfV}#DZszCVXXI#hX|L^%oYy1fvxt|N7Ee% zyF9#ki*v+LPdK|SuD6prd%oAWc0xDR$%cNl mF;JvSaqb{S_p$DLRq6VB8Jg1Ug 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

?{zG&{&beV0Z&%W0f*>l?0(F1IS3Z(av0uj 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ÐPALLzy~CyTq?tKuyD|FT9 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 z%0D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ΞS@xR3Su7mS&)?oLgL0(D5@1 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

LOz02UI0 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π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%0A)6t)=rYl`gkTlU4%!iuf4IV{kly#o1;3_nj~WNk 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

_6wX+1Km*pV#2pwV2 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%0A95|}=PtZYxJ5#&CnG1Ahs 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%0Ac{02d23-9 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%0D#0 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

IGK0-FS9B-Jz{`uczJ3P+@Wsp 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

8O96k+#A)`LU{nZ&nZX=^PSKs~q$R82I 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/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

Hj91|Nsn%=DU-ALf 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 z

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%0D7(J7R2#N{QOpQ!p?Z+u>|g)ZvY#E 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 E0uigIc^LC&B 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≈x^`WtP^%CUVXU}C5ZT z(prkkuTGgjIOfWhpkV^5BX=q@<|2mp=2;46-G=5a~uXcMZ*lz~` z=cJ{amIdNx8Z{lAgkN5cTl<4sct9<+JOEap8i2w6lGZgM5k@rwr$(CZQHhO+qP}nwy~yq zpZi|-H)IB?MvROW2==sdx0BnQJ^CD^rUIt zHC|VZGL5gR*5D@!K&`ly&HU7#UYCA}h;odlXnVlAn3E}v7nu*6$ ztL&6*S&_?DO|)$hP@g5hqw0BGRc)GBGta!KZL`Rnw@Ci7ZL+G;_OhKg#$lhzb4W0& zyjBjSC~=!sqYQUlO|u`n)b! z!h}beX=~>U5?```2YcU)UX2ml%;9U6C9}-Cryp10+!cf+=`Kkn+02Z^k-V$a2${FD zcqsN8?JhMEw5Ca3Kl#()v%|f3JOhp4R_bMjf~b3=qv65m=+)ui;^H29jW*YWDPeS> zzSHLbLqk+1Om`PR1H@4)HB=MRs1pT16`m=v*Ju(>$-JK$z>^_>M8yB?*mTsgaeNI`YXAVR2kHcU8d?-ws^t`$ zqQW;)492w|>kF3s@s3hw+5tIoex4-(MN*QQu#5oQ*F~varOO=sK|Jp2bY2=g1&{)^ zODvX=na z6x@RVdR>Y)%%0PxW= zCtiapUp0x|FR$A)^ zknJJ{23e`z&qyv(<%0w?wC5pmzMw2XriPQUt4)_zdV+E#0&rBTSvXDZ=Rfuz_gvFa zhe$G3>cFu9fg)CANKHu+X%dnW?jj?mxJrCgvKw>lM_s(TvGLcypv$BlJeHT@oNEXddJZPC^P(n-x`{o0yAQ zLAu`wF}@aC1shmcI`8+JcSoadUp-H@I$eHC$-KX<;KT#C?D+Wj}f=<)ujJN_zS!iEKo4-_lUPHp7yz-jdfkGXjy5>~hTPCso@7 zoE)J6L42f~MCQx3EYsb0gctZW)6=U}3y6Km%0Q7_f{tdbdiX$v=ZH8d(y9xX^;Yu3 z!4>aX){`@p+;LV{>z=F+LUbV%iZLJ#ArFH=oEfAO(@?=~z+X;FWEdgKiqqr+KjOIr z4OtS-`%33Epu{PY?CXbl_VUd4(rBZt*WEk!H@7$ME~CZNii3W7qw9hY`PT&%0m;N3C#!Xa z!q}H4hypuN?MtkUa`gPlPQ{f@&Na+a$!rW)15+_(IH>0!BA$~M?VHfjOT@{REHe}IfJedmW`U8Y!5xhjH;o+lsMX=ah&WxvsU9;mTiCTAiY~%k ztFZW)a7%^^paG$VBf?Cnk!P3>#-TT~_`S}>fOTxntP}ZesGZf^VxC4bi#-TB4cUixL7)OYBnAA9 zcsz0<>ThH!jqO~6q76n!LCtO!x8
keNoWg_3vrpY&B*>>9MOV+Ct2%zIj>BCTd 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

aG$~dH|q57ov2c3Tuf%9Co_f$Jq#+%jy$|I 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ξ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

icoa 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

rg$3Mg3PSJwinDo2(|xN${zv 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 z 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

    kn?Szc`}HT5 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 fK#ZOgTCdN2AmQri$> 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%0ARko-0ia5k*mGzRsL+-o{*TtL(PB!Uq^7 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

    ^oQF8b9AV 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�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

    Gm9CFW|B;7`;xr+wiyRT%r~ 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 z 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�`bG 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 z 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 z zuw&_C)AO5KUH`f@mY-NKwo=Ug7#cjr>M|ah zy~-YC7gBM%NNO5AjPc~@*u&QXbU5e74Jh_)If73gk*+4O{k8ttmgI)B+HLH&r7EvR z>C9jyfX;|rPYN*uoGsyYZBkP~p=I*JNFOQFJh9|Cd^XXB8IC+fAnu&65=wY%y76W0 zR^T0+lns5Frh#98Ip};hBlnOGWDxM^q-|toXsBAKel`GO$8BRy6+FfoBcD^lb*G!4 zhXhJ}EHMt5g}fl9&=4Y%0X>Uz44mGWH_jyRvnUIKFC<;ur4QbFE?CNz(_jQqFlSKq z#&dL)0PLh<~yc6<_Xt=&#+6Ztb7O2;Vi*>{yQq9 zLSC5IK=!`p@T;qU$1yGk2#!1yqtM<(two;7tHC^C_XeTzj(kt*JE$TkfsN{_5 zj7BLVg(cF7)EzjB0hcR5>;a*@se$jsR4|zyotfgR8;T&g^Fx`XQ<*D&h6^LoEBmnl zLonGR4_#~j1G9y?uAem31Fo2A*G7WK}NWq0P*|`wve)qMWG}g$ZR5)SWPx9 zS(k~n0Chj-GRqH}XTv%|S{mt61m1)D(3}dwIqciY+*yKji~x!ovsvi8+Las9V4xrQ zX>B!ZPH-&HGasTAH_kv>CH7;fY9u|ZC4nALG*qrR<>=1Zf}T|j=D5v}xX6dW!8FGCN_h$xhGm(!-@zMPEh>ufS|Q}dE=Z}A{W=Hfx*$+ziGlO^ zOxKoI)UZtLNH>|9#xcwTnu`G!gc;a6iG8B7He^J!5TR6qGTi2OgNHbJ_Y8 zN4&)A7Eo3a=lCY;1qZ>utwtzbsjDZaRt?1v>992;eeBvfYNQ$Rm}Cb$JXyuYwy)9p^VpUw2y2) zB)$eMz`j6+X3!eaT~yX(?T6MgQPWkcm0$R9DUtkmHGoUh+esjHlA)ZCbn67?;YwQ? z=!9dS8=CAbh7925_m=<$Fb-X)Ac5qQqR`jM?=>I0e8yJ#-VaXVUaAssZ!T#vVQ{0YZ6+Ghk4@NE+iY$>^vXxG6X` zIaS`jPB%W_le7ukBRUUvGHsH*BX3}vVY+mkQAYnU15JXqcq0pN-CV& zt}qk&T)s&xBO^xe9t`E@4F9F#kSimEeJK%)JzCspT*;I=-y4dZZ}`M0yOe1bN4+)Y zX_2jR80)V)ukvcZjK8-ckj>M=TmC41)Pm3i9b^qgUboU6bc^@<=!hiENKj2;Q#2!w{Q zj=>37*NMwO%{Rn`)MP)#dvVB2S%-ZHD0%KunjYzUsHj5$@Z?a_T-{Zw;x5Fmjy&}V z@&&+hElOl{dwQVg#WN5sepi6s9OX;&oU%wJyK)#}>8Fjd6uDcAzd^hC+dB_6pi$*3 z&S$?^^g+kwz}A%HgUc3VpbuKK6XZw5M5|F1!a^M= zRJ`p|^fXmzE~&$#u;C}R(1$)S2oN!kMsB6GfqA_DZ# z+I0NT1)dudk9VpJ5cyo2*Yx7aGdjbXnI z{wOUj;XUcAzK^yw$bSHK%EK2P@YrPn40tSO+xYwJ;d61*h+ojF_`<7i42=cv6S}sV z0MLRmQUC6Ouy5AmdRQ`U2Y-KXg>I3Z>p}$v>+^VmA?5 z4u^iN9xbW4#d@do0%Z;@a_~^Ap94i+QfbF4AZ$9qNC1oRs4+ybBT5 z#tg&cTa;0%52(&Aughmn0E^9j8V<|X#1f?!Dw2$muzq)yC-IvI9K|693KsOl>%Dw{uqt;W$ob zc{MO1zcN_6sNtW4Kd@hMd(J~;_B|o;eWLN*3!M-iP)Ogcrl8RHUhH#r-h(#=5=~?p z!CpjX5E&r`b8puv$iey2;o`im6R080LOUq)3?Lqe8#pZ+Vnu4Wo$+2gP^%iMZc02> zv6{PsjO_Cbk#xU%G=iVy=+ilI1s;s$#zw&Fh^?=?6g~h5VwZ_Y1*8WY#V*-6%$WEB zwi~T2iyf1|_j!CmA3w^nj*^7T4fTp5`sjEHAO}XQpY8!Ck-_~!UME*~^*I&HfyV8; z0n_laB-gO|l+3jgBI14$9jJjX%;ZKNl6=va@K6YDboB^<_WRrdgq0PRZA)TB3d3hF%FkuDvGiiFs{?XwJb zp}Dvz^rwz)Y%=5n!hbb_Nd9xa3fhUX^gqX|7B6wy)*;b+l)cfuW~6_MAygvUm?9JW zGhihjsOur7lwBh>L4}-Q^LIpgE&E)8mlQ28c;uSL>$zm^pMAYf7lW_y=yZUuOl|XR z6{j8EYL`rl$=tG-R~3ZtNbljqb{7sx-d&HPpsK z%rod%*+xmARRntjhMrbDQ7t{Tk~KjnR>Ck;W{3 z?|`2SRcZkqtWjbC4+6k3ScK4wMGNy;KHdS`7CaM4Nobwan)^RP(VkuP&;Hf*Vcf%j z0F=^qs%RipPCa-Vt$78csRJrV228*J>IL-i4`&@U=MF=lev|WD(*_gHvr-`CEC0MYWZ5BpPUfN$Er^2X0Dy zR_2Nd1UBo=n=$+cfpep;)Si^i!14?H3{3O(cfoQdH!o5ZF{zhRc#5F7EYSdRJtcyu zLXbM>BfC^HQl74KoFl%a_6C`}&B16=O*mbSg@fSCxPbE-Vae{-TafyVL&{&j2?D8- zdGqfD_GZ1N#Mp)hoe^$#exOU0qWsK}$w``9Ey%tYa7P+Xg~l;LMoOlyW?oZ5JBpav z;B##8(L>W$8l!j_d8YXZ&D1Fn<){OUHxHFQ9*{D&#Z!0L zQ3g5{0=tA_ne}>g*a;BXihckd|El+<)3;biB5~K&H2%k9BLAJ`Z~O1fQpzf*|7}>- zAKABNv<(w$feCqRp=_hAQu8tQMt&pq7k>O|SlSgK_dds03hKopm&q-Ih$tiqqa0QR{ZMLnLU{;q`?@_~&P0vXyJVtq6On6ZN`XZJ)dJ+7OvVndRG*-q4iB&fQSL&0jqzJ>3F&Py>zHM=N8Iy zCaugIz~|jsx;rl;tp?2CER$u_V}xXJH@~#LFaIX5H^*-ke@b{($ei46y?!{^YK;w{ zU0k5!;i#S>J(k!z(2J$?3HSl`LgN}6)~3DD<#;R04UkH7SNAOx3=^4vkJ{Q{I*!<7 zk}xVSLJ90qrBh4dYOkAtutwZMj)g0xs%GkYQWSOJBz#GwI<}aK{sCc80LI@pq;ck+ zO4#Gx(@JcnAl-;JJU=ADAfqfhDD1bZ>5@^06%t;MY%5SY`EZFKT69$t5C<78=TI`m zs`(*{m3Yn_jA-FPEBJTIM`Y_sL<8c%oEyp=KoRF|`UJ!JML^@ z6T>m|$!a5FJZWzpNK9fQH9HMO{(oSF(;TfLOavw}n9<24`gN*?V^w5z^M_OyEw^y~ zg7t3{5dz*CfJmI}sJlG$kz5Nlow6%hb}`_ze+uMR67d z4Op8pV;dDrl=p4ZPtelo>Pu+V9J^5#(PH&nTC4B)I5{^7dqn9OgEDz$qVxvZ3+&KB zOhIa^rF+I#?5c@VS17A`PaKQV&E|#zP@QYH{Dlhr{S^4+vgAW=qWcAv^}x@uR&cPq zSK0BWh;i2pCQ|b+sq)7b(q|?F(hB7(IqI6bi#d)p053!iyxL+Ok|B?&5b}@x@Z4o% zJ#ekQJ3YZ~>v9h>?={tO3r7+gegpu3ih6EU%%mK-NAJ*2T;4%HaQt}2hR&!{ka!eu zX67b39rGOP8#iw|f$GqUyWoDBx7qs9b#Jr+MC6}`9}K(>OoZX`K)22O;B{5R|9qLG zo7$q5JndO#4_%-6V5~WTXDDt3l)bd+#j$Gk6~o7C>DjKvp6%%NfkKBOmgzU}sN#=n zPQtgn8vwe2)d2r4G&t=3Sx0L(*U>ZxZBcXcIE+jq4nc39k*ODo-!x)ny5{wb-bWu; zwj{6f@!a5G5x0qdlo6X-Tnz%OVMMWDDw$e&q#-0P8va09)`z|BL|Et(rcpC8M(vmC zo4IuTxh<0hgnadiV{}h=W5^A#CJ9Zer=J3y3kwtJ1%=c%=zuuR6yd7ymC*9pU3YW{ z{)2F7f1}YNyEQ7ECz`OtF@AxKM?Qg6^H6>M5n>@=&^4J7ZUr3H)sLsL*(Z7V1V#-_ ztL4t7PfchuNkgrT`Fuc>|L3sFA9lU@_c+Mxkz;Gx7rR2JI{g&^dIXf^ zyYbEYXwwCD?DbSKWxP)S>{5O>=%_fyGWs1bp|V%HI$pbRB*@qd5U6Eu|LjP)^T7H{ z4{fz~_j!Ot;%Ddx897w4*B#isKub*%^{48DG=`n_jX}u_2-}|KOrua+LA~;IwA0XS zHDIEC+txABsEzP7`@^kC;X~lY?gcIohopAMWWVLA_P+2+%9#5HuWPo>0)d8K+&bL} zdmnd!`CAsKsEM=sBnH0vn1>9Rf=N4sbKY^$+l^7OW_y?m88O3G&We=!XeCQp%mXLn zy#j>dI3`U2f64j2Si^#cD|j7VX*Nq*&tuUS`TZLB((LAn_aeL5dM7NaQtJ4#k@A83nXm7*cAtx~-JOFJ$O!bI{~`J@8`0@(QJI z8v$N}SR0PJjZA&{TX82StM?*PT7s(4K^paMMsM}sf)Oqj&R!o$NqxhJxuU@3j>xYq zpQ_~^zc^tm$4#K%XYGT;fkrSdBQ@9NfBs#obf^qmo5|JBH^Db>9 z_awAx%y1ZT>y-HsS}+b_e!^y(lb((8s%wT+9rpIx|IrA*y&id ztRt}j1&-WAfnBp zN6{bGMDlKfWxT66!j44t8A4H_wpwUNGHKlSm5@otm{j`mn66j@ZM^5d4x5zX@A7{J zkCj8{wn1zwTub&h%AM+uy2xO%uF5PX%{!h=9oIMrbo!{6;wP304yxF}v2&v4J3~6$ zIocmg0aclD4W^@)_6;|$SZ(dmr$g)aH1UQ!u@7(|Zj=d9;!wzGH`+`YI#ypxF+rgZ zdE(@h)Td#eADdHGdb|=`cf(K01xB^RZH_(k?A{lcv`&kUJ@q)TZhU?we16KO@3w1; zzj8TwJ+)(JG&8Im8C$;A5PJiv>p9gl?zNv#8=&AY!t!6$%C_FRv=GN6q<~JhNDcBs z$tkZ}Y}u#b*{8{4^-woKKl*DQ5);4(8!mvhY64|90W=b?(RAE2yqM;Wc|2uxzA*r} z!^aW)G=nWEhUq|*=bL&^an-f3VFG1|mI<9o51-fC*+hsUC zCtfZPxVW{HjKv)AF>V>$iCxIUS}}CRyw>a-L~B8OeGRD$X{Dsd_f=u1Lh8_8cCx#-sFghMTe?#jK|_YDoL>6J zWx`K7mlaf$s(2J5E7?VRiRab4K=4iR@pjd=ro14 zjrQJ=7$$K119s)Ax_PV4g2qRVElO#f+&9kqvkM(IJfHJv5KA&6Ew*RlAud`SsMq7L z-06?I)y>ZC+R)ua$V%F}x}utZ6> zD(QP>Uu0%rsmZ7;H@}rTt1LZSN!S_x6!VtV`k@O7-GG8;U&oOVE zlg;0Ji6>Qu?RARV3enP9d#aHsUE%!AXV!>5o>6W?&s_XG&`2=ip88tTeMtTd+%Qct z`;&~)C0B!7s?J!QNG$zHMBW=+rbOcU4Z7r;N$srEjK4;A1$4+B1xNir{D?OskwY>B zhao1M-%hjGDv62Q%vM1u=Fv9U39M z_WB9K%heMxwyNT&)-ky6mlz}LNWu$Z1>A4$29RsiY}h^7gPN=JwRTrpK`TGe7=e1( zsGy?}=b5Am{yiVo)2dCO#m82PEeQ2%KM9uELq5AvUmP)hLRmkomza(uYlF%O^vbC? z%Vx1P7^S1-Fi2oH;A<0?FHZ0&Zup^e8rJY{BzLc`e6g5p%-0%ESI*CK)4!XzDQ?L4 z3(oiCS_Xf9G^_9`U;90;XJ1hU;2LxLTVCtDGTX7VS}AQ5AInQxb4L=LU&6>p-#(V5 zu-Y6eyd$z2kw(`8F&|lr5vZRaqC}0gtmt9vC9`KgR8 zrw4E{*99s*O5(ZQ}r=HNLN_I{jKdLS5N&Q z$ET%8e(U_&gutYM0&>w)try}USAmkrx(afq-oCkvl*t^zDBk&H6}F$W`9M~mwJEh> zpZ^bl$^RR`cBTJTN)0BC|M*a7m8QQ+Y0KXf*~S!=u%{A$ShRVc3nSo;LL;<;3b}07 z7Xa3Qcv#x5uR%7D6P!I4?(IKJsM#MAI_3S>gj&GBzELmCZF@L9ZOf@*D`$3M_b4q+SJhLk`p$hoE9PjweN)Y;9aRd+{~uw0^;g*U%j8-8 zxZ2a6;D9z_GX5i!&V;{&{j@d8s_&PuFE-Z{{44Bp1$w`Py-e}YtLUDeqA7U6ANaC? z_vZeAuXO)F4hPbSiL{@ZmpU($YrfF{)Jhd;0rW&L_zZ_0G$zuCxpe0=Usfx=$2pfa z_(lS+&33=1Rtg9CAN+339f^8?{c-hrf2RPOn7{7WoPpG+AmF18;txa11Tu+ZG`CK^ zkr7pS(mn1aK0!HyL2z|T5EyNlozstLx8qnflR#5!kw3QAj6%0 zjD>uYb-Y7{k{t*hS``$Y!ry8>cgbO$z|kCPl=Nal7C&aPPb4%TC>iG{ExnOftcide zPnbKMv7S^#>1?Oge%x{;s1VG>B5^vlpp-!-A))zog`@B7zq#Nm7188ku;*yU>qHm^ z_d3vU+prW!TA?}&7`-1Yspm_^U+Ih(zUd21Lf4^@!f-&Ig$Th6dyS^va0}-aP(F}& zZB@SIFuS24jd5Mg=A}oQq}b_Nlb3;TN?#ga(Gq_{Fvd?VXEOgttW{0BqcClzmA4GE z2yRenO@XEkxPkZ?Zx#f;G9S^TIjXOi6QO6G&1qTN%M`;SOl>(t#iBt*=($T}k>?e* z(cH^{t(WHjMnJj0BHKvU$laum-N-Si*|96~Pp$9&#_mn&KejZV=-2tb;t&M427HPrGPJ293&;MJqGLc+)T<4O;RQvU^By)Tvj2fSJwPQQ?zGN?z4 zA4AuB-0{9t{*o-3i9^rWYHPSlF1K6P-7s*lx zKhS)D+;avN@Muau*Kn9q+(hIQ-}{eCO?_!h@g=wsQ+d3fX1Uo4@|W4Ik) zNygAs#yZ8SWE~^|+A0LWIJ-)W_gVA$(=&VUOvUeFbchS#?bU=F#@$Ru$qEnu=o=O! zmJI&6c#cmubGol(bU46%*b9eB9&_9fW7Ok7nV}1uh{1W9Dgs=jVoII^LYj4oX3y_|Lx^h387N5I%SEudnp zlOw?bqvv?l2|dMp{HiOohdVgKINEiEsmSdMu=v-D-YY4jEIt!xUFj$dAK+UT?b}tT zBFeyK>%8^k&VV`sb1s#RkA|mhcy`c6=zmm-UGyXwxXd?Om?j-@bu>BDH$X4APoP9G zKyy63Yt*zR&1lQzj6qi8fZiq98h0}N*~Cq86=|bf7t*us+~NMc&~C-|AF4g=$0&Ie zvwi18wQNs!UXSC*`v7xr)YVK4105?{FG;wHV1JDPuufNB#f!ZF%NM|5ri5+&R>W&DD7)Bb)`svFxV!hq z`C4s#Ip2prZvv=ki1X?sg?==67GVU&i2FwR`$`!PTLS6P)h-?sq*M=ukf_q1M^X0o zQIvyFTu;yrKrnwjiWGRbT$X-RCbEUaERVl?#iyz6?Qn0!wAhSzS(R2NUJuMm^)Ez_E)8=GhA8;uXV@lO!_ zSGTY2j-XILx)H^JvaDE zfzVH)QDTGcumRJ=c2a$bO26*{6-MW0!i)E-fxK5yp6esaHNt+cdQXpw>+Cy+!HyQg zCg}5j{jRp0r}&-*Ux)GXCF>tSLX=oRf={!?Prx~dN?g|TnZ#9I|m#$lCR)Vp;@Dzjat z#WZwv9+8+&Z&WlCtMd*T2C!2Pm4`{o~wmm0@K%7&y&1yI)A2l zH|=+%pXUT-BAEpZ2&rjVDBXVQxC+0Enam}@Z$vpqVM$BXre|KyV+kq{1zBm-SF_gi z^;a}n5=%pcbppI4Bbv(Uw@4Ek>_`MhfIY^u%;GSas7UqF$9s^V#W#y z?*@yIr#9P0c1P1S@{*oc$dhqdspSOhF(}o%D9w--MO}EbGEb9MxVB&B`bg}L#Jbx9 z>c2ogsO6&Kh;8n>5oT{_{#-p^Flb#LakLw83=+RS!l!?RA5;UBgjU_S^U-mmq%>f8 z1I-f&@|ePd%&+-PU>x%|f0}b=6aOT+JpZRJv2X1Q*G7(DG95)1xiM4YH#8)gM1<5^ z$%;xHT`9Ks>_B8gI)sK0&VU(Pnt+`~8kTt`wZ~QnGh7aVO}kz&J3!xqlZ+q(9P^X+ zb2te-m-0iO+>_7t(J(@botN|5o zsC__f+RnzwSWE>re~)61>iao#%C+~~E3iQ!Uku@LmcA6}It)gFQe-J_`wfE7F=ua4 zIR#vK&41PV1)*`@Zu?3FxatZ3lCwm!-$W0}D(n5?h&OSu^L%r^!YM+&juJ1;W-04= znFB((8fYzmH*83np<}?q3S0!!m`YdulP~q;v&5|Tv~xEK<%KO{e?PJ={V>?3ti&f7 zZGaC*tL9Y6%sj4%6EN)s2yOxgM&H8bUnrncY%w&j`0g69IJ0H3%_Gxny=-Zu^< z(ee+V)mK*ic%}^Kj$>}t88&`24Y{CTgR$^~AuZ-O*jm2qV7{`m1oSebX&(+@9QqRIzk+~8eaLwSG!3K z#05zLLFm|{Yb}NZMj>gV8+%)AW9!S6_V&G@*70@0UM;Nr!JkEHKJ`C9k%a;yfPllY73UENpRyx0rT8}<;N^+&g!%Q4D1SHrWEa|qyGatk^ zJ%8{wN4)V5{>sH<2M02+;%ln0n9Ff6EkPcWdq0}=zvNJ7Iy zRZdSPnr`NnlN(66g#Y@uK&vmUAGDfRoq%c){5OEr)PMClv7C9UrF>`8nY+s8Q>J9e zHKgbMsHv$cMkNl#fAqp5C^}wK0w>VxmdW^>fEbnbKema%E+lJObYvhiANThD?fb$2 zrIW=BxuVholW+_?m5xjWQQ?;ytuji5BFyIj7NDP;YV1M!S{58n$vg1Vw8v`O4sl&g zDIE&)Nv>FyV@WW>LXKNG$jHXa8g>O~1GO4EU&qs`#eyV7$LSQ8eQ$liY{lW61-_(g zQ1mes7s>qqoaRp5Jk}YDSEhy{{3-2)`c)zNhQ%)*Lu#*{MKvM%%h}cb{imX9nnQ8+p9P2iEXC zo<0Aa8`-}?gJiSkjjLmfg4ZS@(-_Q5e?+gn

    %hx0pG!R+B?t_KOb zDv%oKh=Lg+%6-EfKIPy$Ygj)E;bpuNOao4C?Y$Tuxcuz1T@Vymus~JA{!P~xNZsK~ z)1Om zrpg=8OQ~=yAuvKC&Bm|U>LA<`x_`* zs`qp@_nT5x4Ub|kJniK#7fp5=G$8QR*L&ZQi`wBw2PP+6=5WuW)oT8L!U>%?Dmx2r zcOpRjszwzpk$9>#G*SKc9mAhTpM};VFfMVaT%-2a>}m~F6mR!R=oNDtx{ha?-#(TH z4?_?uI}aFHA$i7fzi+G_3czXU5{3@6W%BO&pf94%^3|17+gv*a7!nvX;mlI@(iW28 zfR@c%j%hshd)!q-5PA}eiX2e^#vp@Z|4`GQsABLbSU8B}CVZ;UHuGuf0r}?0|2~4h zW!vMMBdrWQc+4;p1>T6Pb~KT<BYFmIdGl9y!1dT5VQ#>?!{zT#TR9ML_Tm0+ymjt@_6Qw%}gU88@NqV^{GiA zMY$~b7&bQ^nQ1n|Jb*f1^Npm;eT2I|l>az0c*7k96nzbRj+}r|9`qrosl+3!Z%!8L zD?(4a>we47-cOoM4!I&kKFc0kXqo^*agMi+D`yQhzzTNw!;&3*ro(uj+}cszcnODo z&F&+p!=LRTNX5Oipw!>n7$j9@z;IZEiI6lp5+z{bqM=6kKm;kOH zC<#;5KlnTVNq8ta4+MAPY~!}*r#X1slAK7}($rKBTGTYyOJVd=6-iop1Z1DfD?75` z{_dL3p+sL&0yH7Tq9s(|lBDqkpz|bR-2$rDAVz`_f~^=rU7b!)t>g0H-VQUk88Cou zx9`{I4yOv8>c=!zo!)omB=V6Wc3HOllAf*pwemAjB>Roc(Br`-M@R`aF}=!Q-;)vv z&#nd?*fg0w5o{Q_RJtI%LkRgBKnNg1LK<5SXBTVannITdB;gWt9POqU`mic*(dm_Y_(ccF)-|4b${6#+#+iuG??B?L>6 zhUn16e6`Q3#^^BDpU*!^p){eZxS-^-+V>;*lZ_~oNgEjC>wT^_VPbNgiz58qA=n)} zLqIieGbWeYP5fCmocBYC&9=Qe0+>AJf>cSUp=~&2k@zbP@nif5z$XB9q9+I6NFl5^ zpaoA%G;!(rO0lhr0U2c7JI4oq=eTSg@6tYZV7+c~RJ)&fbH917Q*0 z)%A6-N^VM>PW9aP*eIhs$)3mlG!>`JC5-AuqX!yHb$xlWbs<~@n8L0^K_8+h<@xmR zYFqpCeOsymFHj9at@H{M8|YP{N%#TpsDCM5~p#ZHuqisGXb@|Z6sHc@LkwFh0!nn`H>xCmd!HQcMD(&WM@3! zMiDc?3SN;TSiB#ig^kfA2d%L-hf&E=jf;$_t%~Hljb{zjF0Ca}`7|hz2A9oPqv0pg zF1fJ8QNMhh{ZG_~6cw}MAc^4(g;pY|mH>7$!4il=)_(IUiKZw~I4%FyI$Q86to8`_ zF~7HH0z!o`7I87Fkm%25Q6oo7O!6o(W-L1ft2@H+GKD2k!9VNB9!!%gx+sYl0+#3h?3NU+; zoMo?`sQ`m2(>$mJM9$OdFopO05^PrN^fcs2q1x=B^1`=UbEt7XWBnAcC|pOx1p?|Q zDg41JgQG3?HXbZn-989haK^%&BPTBQ9=OSvz+WB775mSpPLHE0We(l{+{8J|{MWB~ z4e!sd+M+s9W$+-)XWmI@+1XS?NSX>rTg25>o|Lus+fW;8FWtLk>3U_NAlM=e2%fhU z4|N2~Nn>M2sAs&aN>lO^{TBEr5-((nA*{$Gx~BWS3#jAW&p}+33NJbDau9sY&51EL z1K_m^ug!c^2#GLScJBk{X#vgp%lhd{&mValwZpgjt7Lad7R7QN>!`-S!=M+CxI%62 z{*%2fNv5MJQ8$}AHU$=1^3O-rRP?F0)C@*X?)JDEm$IgTG$g{=gWKdXt(3S+yNqxs z2Xg6iv>I2!{r%r7&=7WAXPo51tktMO1cwM-))WJ18_@|slk(d41%~J+P-=$_2c%wv zhurN6=tiHHxrhDAv=_6jY_Kow$3Anbw|s#URprY93AZR>W<=VcXdKjicH&brtVTf6 zF(A0i!6)^(g7xWziLSe~wx-+^Mjdv4v@gOU>>Xkbpm^1qqzZ^bmLgi&lC}vn$5s;Z zBb6fArIJgrW=j{=nISg)h;t!i@u4j_mB~mnDUIK6_w`b3e&jT$NGvX|KVY9AP3t~? zg23nmG6NW(D|sTt;RZR>I`Mn?VONbO@hd0bsE`5z@c3_961@>63x*Q6ZnPSeUN*H( z9#uHdI6#?(k9Tj?2sh21!$nwIKJ+#K19}K90)+KPhT)*Pn13KY!?yD`eMyevov0B! zcu-eEUFa||Y)0_U(>I*XZtYZZzeOfg&9zTyX5Xyh#}HaMYP1Aet|D`y;0 zRT{i0E(xBH5iS&`e2|+pTsLU@sU5w-ry15TPS-6$N)w##C*AS6hL=^@h+n{Icfu#TBLDM)MFi?Hit zM$%Ssb>PX;eW(@8YLlJEC&SBKZTc{QJ=;UQ?`j8ictACh!qwJOmdkNg;_Y5Vq+Wxl z2pwt@Dmg@ih(Q*k7^yFvpWv&tfPJ_UQ9gGyj`B%4aW5O-myt_Yv>VzT7nhhQ%;7SC zmVaM5BB#nQr}G*-!;`u#>6j=;>f-`!d+2O0m$GJZ;O-CA5~sZ zsjRU|Sz%ehi|y0`utI`WCb#@V^{l9vvzm98rvU6w=v}xQ{v-E?w&QKg9>Q$SY0l?B z(Q5)|wk%Ig%S_orgSO-PD@R|)%Y*NhJV6l-j~%B80qO9m`Vzo17xgQpm;7`8IwcVp z6;vm#U~?e>Zn@@j$SDGMClg7ry7J>$HVKru#Z2x(_lvK(xpSx`!R$csPvRhB88K%* z3DoX@r!ItOXUp2?i8`gm>~kag6KFb&l0DR-T=fuWU)5g@iv1d=SIB63mbWp8*nQk+ z(K;Ta>-<1cJIX_!$idPs`tRMJK#}#It~m`Fhi<7{ttwDgJa)pEUP`)T6fjZyj;E9z zK8L^sm?tpi3M)otB`22}h?*<6u@$V$ zhDG#BW|?T_X+2NkTc2zxhMnAyvpeqOM~nyBFz6hez6*9wb{8~r_;x0@4>WIRh8{-- zgrNXmhPak^zb{Z2r}qqRi-iFGNH(}Hoj?_ROWi^-l7O|%tEYO-DPw*1dKLj= z+xpcRltlI`WV9lGPxK%P#+ipnKV>ip6HfB~ko8YNwsuXlE?Ty2+qP}nwr$(?EZert zS+;H4`PE27F<2NH+dkJL1U;gOF*d zy#^wc2!Z$`bmkVFI|2$(tgNFk4t*^$#n&(WS`S)#I_1_rFlAHT)m$-Jri(mR=A=J* zJ?$-^cDj7$kN*%j3@2w#ud%&dLc z6hLqapwPv;$$F0ARc;4Ph!fswZwsSQSX%B`7Erd6d^Oyo855GFTne{TV0a_%-r<)f zz-i3uS%ud|`z(1j9lz(UDhi0eq{Yc9`e*mxj6?>P08sefJImwVI<$D;(HWL*{&8SR zHk#HzRmpZ3VHavVB!raS%5~}sX7RkF!=SQ__`d^jDc09YWWt;E&OU9=+cg0|4IqyIU-I8mf29p&R%CH9`VS zTS1Lw2tptXr~**qP_w=HrW>=nmA`#SdlP7}T-f0U}uEGbx>4!RyJ+0=wp=WRYdsiALH6M7&bM-_@z!PaSG_?b zWobBom#DO+r^`c?q2&11(MQiJY8+jlc{SBY&4o%v`X^v>i1Yste@9&Z%A1@te;)*Y6;4C zn*deLK^Z9Z9HlwR1eBQKAWAThkcu@;12NJ3kIHs(cyp?p=`3olE9vr$<_XLVB^dk5 zO+9wcM+TX-4d{I_rD2XSDH7q7sy+TxS^QVpH6C zIm5--aXnr>u36`{rMp+io@}KZrP+%Ho2TKtl&U)9bkS$i{SaiWA8ptsnPMxnQB?hE zfj(I%2~V`qtQx_Q7@5lLw{3uBD7Mob+Tt)t&(ubxVE(wqVy z%l{z7f3oyq!LoTV%YO-Ah841HI2Cg9NwA?tBOwI1Q_q>#vfT*e<$Z9UN1N`Ve;84W z+QAjn1rn_}1(5zbA3Ivw+rCZHy~FZw*|GtSxS(8I2XW>5G3@kZH&@|wWcMkDZl`89 zHP9&`(5T)n{y7olv@UBD~^GixiTqoCFpdZ3`r80so$?3uTT7>NE= znKX)veS^u!7Z@=;(^kqKa6gdhvc(sVzsu3{zcwh*gP=PMUr`2iN&^;#YS8r9E)_B^ zm|xTt93SGKiHl>*EmSU0K@DX1 zgG|1Z$lIa(p`xHXN+^?mlZ6P@RPM2?Gx4QFzLd((a+oPt>Y`%6nJS!1z0_OG)Jr>| z>SqWLc;|N`Oa)b; zFCO4ksp+f%8V*L#qb@ztAqG!3eBrB=V%#4W3B~(^NpB4I>Ue=lmvq?N2m76^Z{2&o zJSw8dy)OL7p^P{eAlxpA3f@8i9&#`5!NbEc z=%_i?j*6xKq$&Y1W4jVcktDxrl#YB1If(KoWXQxNO*4@So@42k4sQ&Wg~*)dDYAuI z{u#`ri7@KU&1Sld-*npIW<2ESPKBo%qVdgWOB{o>S*v^$f9zNLjf(9X1WTsnqy zmN7R2Gk*@yYf2)*1rHnS6!BR7k;# zQJh)16Tj8ZZGfY`U=Ru~jW*@@*Ei0WZ3wruD6UgnM}O{KKKH}5#}q&|Bk$!FvY%=? z3>cQfXz;s@(lI*P8mn3^pnaqKh=EZ`*IwuSx>{b}T;;fcFHCbr{1E+5Q#Vn&j(XJE zIs5?Fe;n-9<+*R#mBy)&I&HHiIRHD1yNp*7IF31-TY>cJo>|Cj7GA*T=s_XS z*lM0qE-lxiczZJsmAjuKpSxjQ9^Ppc?Y4Uf?Hvq^9zeDBVs{~J;pfBK7Jd@@d(woA zMiLDaV7w`|;CCuqCmE&wpoJjj5<~;4O}gWMwW?2{s|sq(plb^1%%HA<4odW#$bI5a zp=S4l%AVj@6Ww4b6)aKIohsYnv%`Pj=;faptZWP6Un(!{f$cCDG(ptcW<<{@mxJM* z(;^Lw3jY=InnYe}RV%#M<8enapTmALfJ6Ew{@s=|3CzBF4$wb-jw6MXLp8u%kuX-k zJE6S!hd)vjl*bAb3ht=?&KfHWr@4UNNadAWe#FBF8x`{l$lL z{av9!(&Np(;LcTW%JI|mCl!(q0FYGMIf<0vB^#_sqNo`Y!RYHg0mECuU^Ezoh=~OY zWU))+>~Tx(`(6ft7A;zLfbWf{vQM#1BrF-2#dE>uK?R!hlLI4;;;7z^qbHZ}Jdd7DdK!rNQS{ zipnxJLZ>wy3i$N~z`;zkYBEFHlqrAOY^;M(w>^PEYxm@tB@7whf(%q3WWw-dXasHa zH%bsk>rfYi_&x=ID?(??!=~`Ba`t7%-F?PrV7<}A=rj$5b^X^lcAePMU+ia;()ju~ z4-O`1b2-%{h0_rHCR8nj=J<3jrO_2ZV{u@tp~=Kj@cjaH8=!6{NugB{d_GRUE#Grc zTpAIe^*s6|{VeUTX{Y%racEHlKz^e?FP56>8wdA-j&BiL`~&)!6{G96o=STrc2Uvc z5LufS_10I}z6tT@d*9oR`XTy1Q_`sBEUFp`(ebMQt)$p;wY8nPmL%DqQLCzM0_?fW zb=X-1$3X}Ko(sLoX^-Ld3H*#){LO*v5&~_;cvYiZS34XxFP1@nez&eOSErh}W~=~g zB&OuXvquJO;8(-^=euQoBk3uM7j*k7g~IN$G*#6*vGaq~BpJGl=--aOc<7rOLF$`0 zha~b_a`vspGxO;-fL7;FQ$UA+dAW#!=)%DDKq+VXAmwq$FslDhm#bhfgP4okmL1(M zks}vXC#bZ*&_0cvQU)#74r&yNFON;lDdTsBvm`04Jq*l8|=* zGYI;QBbl?r6t|x$ zjjR2)=sQ)cIg0vNaf16)N!PN{z^Rv%4&$B5cLH=Rt5%$0d7h6hZ|BCOD^kYfV%^12 zDI5&zxqtIMB?OS?f2jc2A2!y_QG5ko5sWVDiJ~(E0Sz&V0TN4#u{#so8i6oJLX)90x7Wt$rHhWk=nU$;B6PHf0o>rify{XE+$>VY`-jQj zf@NRDhJr|qyKp^hwc|ebVh$==jWZt60hi(GI%N%yEsklr&^jXs@l@f^{>QuoCzd8q zIFyiU0%3x+fFBIQ;G6Uw5R1>@0B%tjWgfSA3mnzwy@dzo`5ZYYiH3_mLfYNeYP^P;sSueMqSG#CflpfBmM1;2khW?YRpR6rkPK< zdrS;EYSKZGF+JD1u@h*PI0@m{H(=;c=26KUF5PbYjP7mKK&OO2WA`qVGig;EiJNE3VBEf~+Wb0f z3l7@V9jE0#cWbeQzJ|QvEb4z~R(24h@w%wo}M!=F&B8c5L% zL@#%JAp zc9sYR%MYizo&U(=0y%p2wFHHF5V+^!bE=_EYQVx!eKg*8#Du&kk|j-R;AwC%Bp;S| zjTsKa9iAB24@aMKpMl@$`;@**uiMjP;h3>$2Aa6MkEVdMv?%0)47!*rmJvmJrg)@i zsECo8D^;Y0sctb*x~q=5Vl`4MP8aQRKUT0zw=i(5u+m}FDSRfuveW9s8C4Z}Z;Q8V zi@P&n++M7+I4*=%t6qk#7BWHrIvabfuq_S7jAX}D;jckrlQydxqG-j`7ix-uffxcy z^^kjM9!YP*-CVl83BZUEH|^sWZ)|~WLcAgA0%#N}v@e+rR$?;%FTNiFP^c-hv1+Nf2vR~vP-Q4in3{nN)ow<9Z(mP%0~JozehwVf09c?10hVjkk1U5EbIaq?WG8O#I7pq0H`LcDPh z9dsBT?C=9MI?S<2Tls$)e<(8M&eIy}RqoC>i9Q5<0HP1k??TFm=7fln1>wK&rGw>{ zbLySSD$)K~WI7hW3CKvu`f*&v9LAoIaxW16z%vP~d#miIpkYOU4)aAdWTLKk0(T#_ zK$l;(vtQRfE~x8psa+cncFBo%6G zPW?&pP`79k!fBGoFRnzdC=*XT+)(xQMh{Df@{;Oi0_0$W@L7h^lm-6H$)g~~^_ON& zSvE`#_4F)5=a7sh6M^_Z z{S^R+BuDKuIg8Wwz+^BX%wU@G$0htfxISHhxQHUSCeD~GUSE2XaK(s*Dd`j$cr(xf zoTZU~T+7(2q+gV|DCW$xeFTjj8SaGF=rk>;*W(&Z|3Z}M!?dG+a@F5j=fu8@3eOof z!_46h*ornf9ySB^K=SoG23^JM{pwpK;23F_ z9q>X5Q)cryy;uMB7OfdmBKvOLvh7Y#ZulVppt4b0OY^CIJTw$MJa!-m589Swwjud- z!+KGF4fVK+Af=R=L^Z^ZlKdoO>^#^R}$Yk%-71+q;Dw06fT&*N3v;<$S@2@3f$O#C}< zGuv`X5sh|ZJ2ROn9?d?fEsJ4DWFM&AJ3~Gx-hh!QB;3E z2;pTL0Ow`OnOzP(+}555XI;Jh3B zvwfiw%~hEp-|x-=*HFBZ>4&37qwy-h;^IttHjRI~X!F{)mleGl{BOa&);}GZi=Z@u z4A!DyFG*7{-_#mEa?EipsYoS^^L6l-gxUT21o93Com?3&F1MYO@iY5t_EKYac|ZwM zXbi^p)iJNz+cS;k???U4O6~DYfbGO_@TiFo&{2yTugDO^vx+qctyg)Y)ChFovs)uW zcy9?=`RkVQ<=#Hj+^{+48B?H5AdPSi3&^rob5u zg2SSfeghtq15IYGXt`P2wQhfmL=8l8m?d)ZVL@ zoIvscOkaqSLVtO>0Kpl*R8^>f$`)e0w+~z;8*9=BZ4F`>U1%Dz-fj0$ku7mM-hgrO zUz<1#d6+@eWN{GnJu8yP*Q_qCX3I`4F+1qicu-oZW0+$fF!F}Saz*S^qrG!tx8n_! z-LFIO=KCTr>QxsngvEvM48orS6h@iZTBI%9#q%q&$Bwf&MWAvntx6THGkDW=fJg0L z))FHZ`w$8({ym?#0^G_h=lEH8oan=nj%U_Y|m zZ{Ty|A>&;bIx>RuZ%wvp9l?v!v#$&=|M_w|ycuOexdBt*uJ4y%UC%l#5pueV$3+k4 z>c)x5=*pf>xqYio0u&QtcPfZmW%)rFi=Pr?F5EJXgnVjZM^$Jq3M~Cvr$Rn5LCl3qA{#{N1X0sq0Vz^!>}soBre5d5surO=)1p$ zpB#Mch_+%o9O25vHa4p7=<2J>n2F_*?;^Q>Nhezzk+9a5 z$ib|l5+5hY*KImOdYK~mLnJXpx@>X6h->hJC zSdrynkj|<>(SWPM?*0*@=l|!2ux4n*FF+y~TmS>cSVB$wEvSY~j3x4HyU4|JuiV{; zJOrAx=mX$```o~((f^Z*+dwNDs!w(UJ)oQYm`+BqMQFsNRnz!ee!XLF_=%^%8QwFn zj9(qdNzT;+SP2y?phbc~vGkE@&NEoWrJdJZ`^GT$wx==ZG^uDf6BcjYinz2}U6Fl4 zpK!5G?_#5riC``A9gBqBw7kWd>$QN*dr5rmtbnOQVCNDN!i#7ASi%%WPK-Ob(wxTyES#lQFf2r> zAe0aeq{szEoN+q~VPIUAU4B>t=ml-JDcsj6&%k%JoND0SS45@>qrye>wzPUcJPVZr zY8s_Cw2*V-(4pY)aRWj4&~{5yL6Wxe&ftI+9#Ih_ln|3u72u{9C*|b0hrkEO0q?!O zNKi{_8qKNA=f?-o39v?rJ-9wSBV9_8?5=CSG|>XsW!z$X-Gj3rg#I3{8at<*%j570 zK1MEo7DILmf%epXE8}rpZO6EKy9kPSGt7OuaJc8u^|`nAq<_}RNa17&VAb}&-Gkaf z4Sz*jWQh1Oezr4qnB6_ciEhilr~-;lOpmK&`BD> zV4C)`0{aSgV-|1-daUQssmPjsmo+hZ_*#NJw=Ew-`jRNVoF6tmQECuM=8Mv?praB- zexz(UmO2|{tax3mHKkvMQX^Bc#!3%)nJyiCS{a3t9U`Y28%{OMvOdRT^+R6yVA5au zO+55(#v0IKv1sj_A_{&Zt?%zWd_bpydAy0%&)tO(0Mz^+k;gYP!j9>L-+;8d|5!Q= zL@^arpbB8!m^4fEll=O&P?I)E4tNllaoRmVd!X;{Wo&2*^8LPtA-3d(=7c(}1}6Z` zYN{g6x~$>#Gxz7tUWtnWu5oewyZGmkT?h6!DtUJ{f^x<=4?;}{CgWR4{FG8oA2kp9 z+u*B7lfyO!g99nLd9V@hZzr*h9|qIdM{^H{kB%i=gVmgQa3-x|3d-X$va{0Vr52%R z%%f{}5qT>h)=3Pwd0YIuy7>39(o0a^jB{CayGg&@&Rf7IVZB$T8jV6Sgf`Yj&0m9 zr2`W?D{ogs=H95rda>4scLLD%5H0a%LNRLo5YH=5t#A9OQ$T25^Voutwz zIZ{bxp+JLKoW6rRP?ZL9P;O=E-r+L0GXHe638uDD5V^QO6%XP>9tb zDPz8oev0(sV8kw8DAgh*>r=^e(m^pRzfiX4oAN`MDUlupBXumGncVv2Q6Fd3c4=4a-5z;7&$@W0Rj-Uae5kpAU>F1_Yf-xsx9({8Vtc?=ra1~a09olOf0YR4PeyAK2kE?@{@<} zoO2A)^W0EnR4NSQge3?l#HA{#0w`O%==To*a%jIsbJWPJK0X0gr6pOMt)L-OvK6}~>sCK6UX)#t>`I!KQPIQxOf4MWT@6FZxp(9IGIrt93#|;P%B}5R~ zkzg+U+T}c~jEsbQK*#^d#g}d^Gx2!Y0T2HKFqKKX)>t;lb{KJo8`%DaeL@Jde{ykY z<)e{X_Ab~5Xe)bf^``*Up}EDVTqH5^4dw`FEhUcOq@Vsv*9~5;Y_cc>-~$sr6T=7w zK?o-=x^9olt~+~mXd$EMMhC;!G-&0Ow<00!PiJD!ueV^X{gryc`&4V)D>nW!^ERhq zC`aqcg<4xJpqvb1i-Ee+f$wn>__M{$WDop$gkK5Y2(|UEZ%SzOc&k(@Ry#glIySV7 z)Lzm$l7d*mSIU|adeH!(=IDmPYQB&mZzH8=Be(H5PX+*3K&QV(R!|3#U4B<3w7!D6 z3OZSjn>m|^E}Zx@%(bka4RAYV3boGV>N*utDTl&13j-_Lj%q2IoWtjL&>u~?lza3M ziKwvM@7XIyX%yefu;UEFo+)%4fzb5bkOq;un#c5*a(NaaYr2_&31U;E9WKYs?x=zt z!$$$WhJvFk5D<)=z=t!LH+CM7%1H7oz+SeTB4Q!^P({aBMocV~DyiaKuXLp7sD#nc zRCe=-3g%o_K2QCHlKWJtR#6gjrL**JDqAE=XjS#evH{%hS>9C3j^Y;8Bh04R>;v^lMfzu z&sG3Y(c(AQ?>SJ*GODsDJPzA+fU&5jb$Y2*L&5OhWw%!U0W}E% zxMo9)X7Q(UHL_$7GMb=-83UnWh?UfqK%Vg!pDq1Hi&e5zckE8G|<6{@P>3 zA~FY&qBg7hui7d;+FW$e{!1)z7wjCileBL?ab?ahk2PgXTDkJqJ%m_D`4tG=M?oqF zcG(>H=ZJFz-@WwkrOhx{18;>fBW5%JS11&z`!7(bm-sr+rb%bvr9CC6m=Z#>MtrQt z0?XugQ|g~P7$|^(M%n8nCEhyv>7ZlyiS53i z##TADty$mVfr*_|bT~wo8`YSfY`Z2&^dRT~)LD0ow=2^PY)*=(p%AtFH-OfbtwA4~ z;IDXI@b=_CvaSIfxWsnJg$Sp900YZTzq$kO-Sfh)2}QLY1nXm7?odC%~5R>-dJZf8n2iuDCQ#QjBmHax*=Aea=Ar1w)9$+A)-VI%nBN-`@ zc7b$C-4O{Z79*EtqxlYOvdFMS3(0m~eTG{E~9b3?F8-G8b2yKmN+-1I?uT%6q*DPHZKkgmjaMBb_)iMlt zQZ!oGs6MZY*v4niFXIO3;nq_rTN>)izApBIqZU(dP556>(4OkZ&d89F@$8#~Ya$k+9Uv1#aNh+)O`P1cb^pq}&X*OoWL@GrA>|Q1F3Lu;&i+#XtKuvDaxhZk=gH&nIh?-Y&Kt))!}{Gq?MRBTYehU2P_QOhmudfx?3 z^1&b#zVxoHgMVD`aPp*L+u+L=~K z+b%O~poMOERK@*5l18sh;MpF@TPc*$H|}1bo7g+;Ux}!~)=7F$i~M-x+CXE=)|uG4 zWc*PKlU=P{uN9gAdl3&KK9VpLF-+wtpuB#(9kcj>05c>6Iy;w=hzqA(s!;pS9atB) z(f55uw-MIw1gNCcMGw9AJ>7xh)!R3A3pU++gf{U2d%_I1JuI;k!%q?wh zKbuyx$#$%|qY*w*W2n8$e$)$aknQ;pP{*hiK&8F}-#TS&YtyXIZpn??XkEfmM;s;s z|6-I#BVF29Xj7Q_VOZrHCZzig0MI?(|ltVoouXn8i$pNOLtUm8$d4WmCMuet== zVHlGsb*YQ!8D%PKvGqghVCs11WEHEu$F;{$S%7_ndnytf#3T?Qy@dSYE<1B}N?3p{ z3MV*D=yIe>F;Oz&EBNLd-aY$Y)-DM5 z52uBW`^ljC(lCcjCu4lp$!eBwgxxw}en4R`i{|vO z8NfOO`#ivO0o0ZiKs<8~!ecSO$|RYkX@b(~)%-s}x8WWHxySu4Scy?`_%7!N8ROzkG6U8Co37Vl z!Xe=UEi1ivhhzDq34;uwAgYqKG;mFA5?uLK!Du|$bX6F^W7*!9eQx~fU8TdD4*r@` z$SKj%-gC@@cv%25P!CxtqqxT{v|4CZ8ZZlGL=IBf?RZnay$=1V@INFdqI}fZ)t=Kr zLi4)*xeZKme{i4Dn7H|QFZ7kMtd zMnV*zq*%kyYxz&?A1?tWcKbms@%(%mK1j|^X8b<`{Fxqvxj<{RZ1%e44{+gRW(CmR zW&Ci`l_@EX+STrJ+6lz&Qh#*CxL_&g+%6-SdXj@~7kz+nI2=}mr(3wnyS%|4_noc%jCG5Ym*k zKoj!b^7^_+jBk8jz+QPlc^_K`0d3j<0SXHM_n874#haBa6=%v1g;8Un_D(ZwfOiq~ zBD&|mE@LoBTpxH_Zbx|uR32HlkGr%kDGV~m@okl-~kEsvtl~Wu-wX-c%usAFgGCN zHXqB;pZ~hIoBSF_SPua1CyD&D5{C!4+`juirF2CY4V;b3RZwSj!Gm?h&*Z;Ns?Q@v zfsMZBhu6@r%(z*2bWgVi8`*9|6l$O4ppHfo(MEAKmp9E7JxdxYVx<}-yY7uY!nxAX zbT)`@O2t)A(wHk2zOEGyKAVg{>2tc%ziNVER?&$kAJ22SRb}^g|B!_D&njltBlUse z_(6Wmw$1KsI6q|;mY<#-$MPv(hKU!YAt3-V|BC}>#Imt&?uj)nmX-c^<1sbo>Ye`W2% zJ;+q61lM8?#m0ZuK?a1C2!=p9;sQZzWbhTbk5)BfO#R7& z%1}x+zWOBt5t;{6{~W`bXUX_(Zw1BSGE(|nqOjUNd_&f#S9R;?*|SJ$K&x0!RTwFf z?~nsoSO^p1$db`2SlPg-NiFr+FfU>|S3+cyMjve?8UG8aDY4N!&u8ovC~dp%1q}0k zJpwQP19kSfh4%$Wb3p`Qye-z=$AhB_ZB=ao07&w0$U*YbUbxr3zqiF7)R2U-Ni|*4 zKfaBM4n<_{J!7!i=>6|{7~DRf&Gb(Cmr51YoOnp00QDacu+{Q*+IS=kGdwPxl*+ZA zGoRCd-$)on0>-jehoSQG!W+Q2FPmlawo)Ru#|MCjrGu+f_c>VbR-<&}l}Q;*jQj-5^nxMPXSctHGR zh~uh5J&&rG@fzlAe=3j{v#|<$Zqx_?D8S0QQLK5@qW`C7um~`8&KIb^oINxoHmt=T z1X1V_Kjv!J-VL3dS!Q~>bvIO|Y!B#PNCORsNFn6a^v?B7Yib=uH8yIn6hzz}xLUGv zEqR@L%`(7>R?bK6JZz0pJgQ6Q5oVB?TOqnqjN_{ z#32w^#e`%7iHivWyHv1;jTzB8n}S(bAkHWO4kX0X2d!C3mfZ@ix<531pf=?uWZst` z6nV)jm!mnr92ADird*^yw#O9KQ7GXA6Jq<=eB-R^%DujC+vc0*8}8+-SdvT~ZwTiz zBF5iny$u6O7#C7y>coSx=by-+7_A$@DPth9>c^OU&47=T=rHD-WM+eOG=QOTN42?C zYHT6X_KUcxZX_n6KV5j!CSIeGy9KkuR?8(hC%^~HFz#rSmW5szoncDC4fU0tKYpb; z3-=b`awK|P7+WTe2`?KHF~hIEi#gIxt$WOI#t`M2>A<`z2Id~^kOw7+;jbq{@_-Ia zFB1Waf1ILGGzSuQwfXn^;&u}_#(ZoY#Zp6r@>EHUs77D6XOYM9`)JOtJ|Nwg_<54J zjz^q}O3fUJtB~f}67|<5J+t9hv{dNO`tB}HH0eE-O}kq)#2@phup6|fe`>{BX~j?l z(RD9_HiB`S9yzmPb>(~c)_Y=qEJ`fxY=mv1TF>zFSV3D6=%%4>i@Q znse>Q+OsqkJn=M45^5PY@2hlk`OmdwTNa?>i;LlflGEo(4~j)vJxlK%&d1+5ubqY@ z0RYzhPh_PWFv|TWvVMb#ZBpy&3qcA-oC?&0R*Ge3m1}-9<}MxCj!Jgm!x;xX5D4xN zjz5!7ILui?76iI7#3`PJ3?!7kQy{69YMI87anGw~(SgtK z5Bh=vGIi2DA1yPW&5*J)c7yY5B>Bpll&cs-Ma$b0K)=W>wxrCBj_^)!NkRo|ajWg# z6zM)OxG?Thf*vZKm}*ko;X4z#%&C6BU?Z#5w^D`-3&B4uoo}F>mE&l@*zd- zc^<9?vQLEKp!!|K!!OAre^pEHAd_t2p#%pFDK|(d4vl7VBVSv{+e`Ut3qpA{G8=_p z)uW{X+XjFmwYA_pAzxd|S1btSR}nC8Ir=zynS#}*XU=N&>u}}|$4@%Gga9B(Yxnuq z=2gG()qhV8rl~|LbfKY$NyXHuV;a%ciB5 zA*i)uW&?H9fbNkLnd6Vn*@E8DuG(vGAFy^5w%s%%4#Bh%TPmGX;u4&|j0A`t2s+I% zz1ZcKBXzEtQ6;A}EYT*J0&`LwghnI3g(J? z2kv|h<6e*d>-hx!n(=2)!C;s`v*v#C0_9kH5^vY`4$SxWi#~rA2dkF&p?d|tF3*BB zXG(MA9Z7=AH|gWIy}mb;^fGoE&cSi=QvUrodoSaxc(dEtfxXuKcF< zUbB%=;kRGDgIL!E>!dfbU=fO;Vtxd!T0@`l7s=z?s&OAlpm+lhCpb7rxmiknxExn( z_#=sY0p;bXY*SNE9xJp#sJ0qusld?@V4b%CoF(#^wd|zZ8wJNsCl)6rR=5!d1^>JL zuTnbI!?8*jvoM#3QGagxL*@2s0Vf0yy|s6vNb_c2rTS00;xm{432Y=rb&e8(F&0EU zCRE6)ows)ba}%4HH+!rfeBFRs@*Qf?)%0R$LAOw$514Z}G?wgD_4D$`Y1IOtyRMC2 zZ~w2~)XDGf-eh$qaE>dQZO*Ts8bUW~$9DoFYe%2KK3tHtnl&2zh4Q7g3sBVYiYfv6 z=*Ct}KyJwXc~2>C&lWqU)mp<2X!Bc-t{IkSr6JfamV`43wbylGkkr>xf*Ot4gal$g zET`?F585C75eRF|^E~^$Y%)4u7ShRlc7SH+W@|RR=uNZ*1%ow6&{Sp4hH2xLqG*JH z))oD1GM;VyW(9AX`YHz3WC_X0R{qkqM0R*d451vXm3W+UN@@_PJyECP_oNfS1Uj6& z&C+2Gu{g)NCgE+AoSJDD{g|?eIA-$21@}IvHaXulFpnbiLEUpZAJg;MM!o1j6CAYU zE9Yn72|GdxK5U58822Y{D!-IThXMY-aQ~7fKJY`RC zh6-&)9sfPTo6e|Prtw8t#$VY}rZwSt;&0dTuw<}D)uKw5BV_5ze%qbH$ZjE{k`Vi7 z&F3UdbXqfBXa`NSbsl>+C(vojaXZI?m$664q*e+_KEpq(<}u9AO0`8~p_e~tzlZcx zyVi;Xn)gWv7gj8dlz09@X4t!j`Va#{FYyGow#n-Oar742H&Na%^_JawRF1MZ;?Kb- z3n3axX(JtMg>!8%_cJ(;ZS8nmkUoi5UUlR{ihLyl-OTPg^1p9KdK)LoH8~kdf9&YG z(pIHXq_;g60s#2ba&Ks%yfGvO3@HK{c(YBK$I-T<%8G$GWJ(N`n zR(+p>#R!3J^Zob_Im5H}EdU$1&`vniP#+R3O~8>5Q@FKp6`whMep42RXHo{y$ik=H z{b&lU(ylvz3kaeO)FV(=GY$TLp@Gi4j>rOS1G<(o4z}|-^_)1Xeni2Pqtr;6eJ2Gv zjHx8c^s<*GkBQKu`k%oz7kzM_;jge3#l7Ie+G4l>%6`mlEi!2=HlbA~-MQYb*KwexbZp0?%(g zj-t^c0zh7E_l6QSC=-h2EUox67@@$@B_){!6k{xEB8E!2?d?DB-0qfLt;mC*)#ClF zMV@s(3}#I9LADAsmSsRq!Z->i08N@p>lX08g3)Pj0@16%-AiQBMW3z}u@X{r`AZ*R z3T+)}Fj+P=ypmFHvLSIEN^V4l^CK9>i#i>)F^ES5T5dI?PX|z=P;`36fZ9c8D|$tLvq&l+~Jgd>{;|)W$&7 zf*A;`BzL!4syw$|FjOo>g{~XH+|+SN z#*>z;tV#CKPvQ9$YJmE9zuOF2+56ys~8eMEE~YBhldhArIJbjyzH7#1|IiRu}+RKyo4P)!(WFCVes1!4dq9QOHqn zI3dukzaEbl<9PM72jGH`hWUL0j{(W!2ucBB7Ho`Pyv+uENGmN6k0%SF*rur}ou=%O71%{|yu$^!rBAA7#5si%3jL`d8A$b4 zxueB-5NT;s9X}XB(#)Ov{~*Q0Y(?=h_gAS5jZhNQI8;3PkUT3dYXDvhl?V6kj`5)( z<>o2HvC%@Vfq5BTpCLahD$ zfnptOpiYYanq}(i8}x-z2R%Py9)18;7~%K-R$4$ z3&An#T@S!LAq@-rdL9OnhjG+G#LPc7aWwzSBi#ToAw>|?HhtMXjFmK5*!H_~3Cv^B z2F@(l-9YQR)6hbv(MDv6_7LsjoP$^Uka|M=t8zf$w2@_lvHB_+G(XD{t?j6jCQpep z-E!+tr;R@Fx6w~ns{+{K?Wz;kBN_Xjw;3&(_(+}rWre_hGjySYi(~8sQm&U$9ULj( zTD(%o11tVn2|{@`GHZdbY-|4anev#dBe*E!87ujo1fhI40Ol_a#cZ(?0stQW4<6la zMzi(br#VCdB&a9`kPZ`DZo(@T@-6rjJ> z1)&|1)x!PMN7(;i&}gtfERGVC13@8Tj z<1vJ3q{%-^3Try6rPN$>tx6#c`IlDKzaMN0)R`0bUeT*C@%!$NYw=ycWG|A>l9u0- zF)UCMhLKD=o4JmNemru0x&`VXLZ;C{nb0y=GO>G?H;!^q5`ah+i_FwUwDYcNZmgzKK_T!QZ#>E|j zTbV*Oh!S;o1OH;x4gSM)2)iGqndA&DUv~qn;X=E9NyB|vuq1|NfSBC0iL2!-=qp-t zg_!?WJQ32DU1LZJ9VY!J2xs8=Yp5%r&KBDK1NsKKh&mvjXlv0mjB&8*?^2J5GwT1< z&Q6++XX>*k(0we8l`^Y-5&4W#>0$Uh@vEmz66qM(6)Q&Rm`w9dZv&&Q>IzW^oizFMvQo7WX z$oFR(B2R`|kV{hTArnlr;TNjMPNxK%w7-EoQL)Hd*BR(P$o_E!ryUB4e&U9Ja!-4L_gulE36&!$sgt5AAZbND-l zHze%r;s<&AXqZ}J9_x5Iw$Qc{=m3EWEI*=dE)*1X=a()d#9?^eWphdm( zxA0~0-KgCD43q5XUi!cKoErdu=>IQpT2B6if>}eUV5G;R{CejKXl+leSUd@7CTrS*E)%PQn?^rPtOsW&i-{cE#!@s< zA|V-saTmYhNB$}f;I%b#(1PFycZrl+q!b25M{*-y$>iOYyuF2>Tux}CP+jdhrO?(T z;Nq7hTxIellt&Bsnf4b7%x`{X)AuxE%v2V^u?Fr&pQ$j2V?hX@SL^gfwxxj#lQ7mn z5B`2jB#}d6(xjyu)Mly5Py+%4gGkk%n_s?7_co91ZQHIr%N&eR$UVUfh`+zDp6#mQ z({~hqfvasx8tO)}`PFQ`1F(9$q+nyvN)h~j8;=k0qQlCrs#gXY<5ovkLQ~#I)+*m@R*~|@_V+wm~xxlbirRgpOn^`pyc@z z9{BU~q*Gl`R`3*GH3TJU{9$tG$-^^xCK)<2x)eVK3Zx@}$~APTu}k(1`YA|TvP_8x zOSB^M_6j`wse5d-HUoxgWEOy3r#6ew;rgmiuSpnzmxP8Q2ce9HyZgYpHr}9Y2`VEK zRL#pB5=v)&^nB0abz}X#P*j>HNl<3cmj|Og#i^*ZE>eb}%41#c+i&ROr*6pwRnleH zwmVrkdlFl(DxhZv&CFT4dxRU*M(0dy3(!i;n55Fa*gyo8A8rmY2iY;**+7eMl_+u) zqBF!ALLFJ4B^m&{LvQ({QV!YBTL2e@%F*}CbumC4O_>O-Ss=aCe8*{dI2(?h9>A2{ z^W+JfPln*1R$!T+H5!o!Wo4ySN^zOivr{`-^9WNmuZiyPP^y;b(qUJqa`GPul5n0* zh3t(d@57~b|+w6eOaYru|*ExBjR@fFu*cix-cY^F7X`7IQR$XY6_4>|#DeaJq2_cpI= z)Ro*@CV4zTJd4Sp_eU~vBbG<>^2l=OYoIcDB(UetG)nGi56H1Qs_xj`P@G{l97UxpwG3FMsdf;YtCG z{w=v4{nVjl2OgU3HClcJFu-O*OD#p>fg^5f@z5Ak+bS<8?~wLFWXs<9`vC6(v-jhF z+uAzSfC2$3?0aAbXd^jRncJU~-HW372bx~dbP3=aWiDjbB3$qQh8NWw;RE4Q=EB>k z0u4IE5pOqx}fgB{a5MAq`DyOiYsA7;S9aJjdST-6Ruy1@XHKXCm<9=m@jfT*0Fl z9PMuqrL}=t5E|R|OZZkqmxeBZYH75ekoFNG{zDba1DhC=cyRrREVcMffxTt9m*GOwm?J1>!21e!xsmh}41ejC6M%-m>;gXUJD~h3A-Uw(53^2yJE9=nRm2h*ksXXu< zZN%LlV{gFdBmcdXlx(x;ASE=%m?d=rthQ-oC?8Fx$CK$JfYo%4ZmugQg+loF2@mgm z217m&zzde|tdsZj5FMmBJtVbnpo#xAgyD?Iw3N(YD*>GWyR;f?6OKet61_wYD>PbQ zbug~9JDREHUGf9pbP1#LY%zv1kRFlIaj6{JxI#j??!&p=dOPCeIbBq20#zdrisL5f zi|ursxymww?%KZUM6K}pqGrah{4&sOZ!pKpXxQ;L*k)Eb3rA0={%8MRI4AX5bzI~y zDU)*RaB7eyXa4y|V|E#Hut15`f)pB9Z{R|#P;K>PLQ#Z;e%5a3-Q6z^U^W=+=YM}m zYyBo>zoai%vkEe;pDFLBjDI1RyX7)TQ}mU`G27twYE)hv-i}kP6&K34=GI4A4Qrog zC0q_hJLXGrWBmecfhi@TMx3A#0Fz>&5>)PY^HdvgL5=<6&^x`j5fP@hxkAgJ{|9DDe5!K?m@{ad@11*96eSxc5$`B!Zy^WTX^fhM_QB(z}vPk&NE^GA- zeg=W)X}M3&5MO92BB!H17t}TABBLz+k*v@sWzzea%vzFgZV>3a=ANmAK1@suS*60T zZP(Z-Uefl?mY%5wM#IBrdoCd=Z+{!YF>zD;4PX3YhYdgO+~7j!!bV2INJ|dqDdLYq z>R~U$`zcB~B2!Hqly<&!e>)m&6$v!&kV5Q$Z4Gw;l{VB1sn-bQIKHn86>kcXCXw!S zK}3>xfVH6AoAUepApzVdqMlYY4860{`6cka@}nY{2e9Q#C$b^j@bWk~mZ->WF}ibz z`UJFGY72b7al0z33tVFp7@81UZ%By;n(!(YG8)2DO>I15`e0sCC#J%ay2Oh?6@4;E z2d?cKuv=FXc;wSiL+n%4Kv^YF7Ev+_=*YkVF&GQHA#6mE4}7v>Lb8RB!o?#vvGJ_> z}d75}f@k^dxPyPLz0 zzNCl%V8(y#l&#F*o^j7(?GA^3!qv2@0UpJUtYL2^^GuD0%R*Rr)n39L4Lq8n;ostz zA2@U0F96n<$*5byk~C2r_0kd0TDBc+@Q|Z^Qf2ke#gU;C8{j$P4&yr!OuZ21))5s> z5DTAi3cp9|YNUeZF$#?L)<-E9Wau#5?P5QmSKg1h+~e^k#MvC`zKd&aGfzEfY@lfX?G-fjgKVIw&q-BYSG0%d z*5CV}=a1KYD&mks18dy_DFuVIJAw4hU#Y_baflN7tgCp4G|1F;b=N-^1kuYXfO( zVWD7kGG0rxDvst#;yX%1i5RXz((pPnaqKNl=hazDv@4F*%93U79ZtlkEd___YUQ8BA6bjh-Ai?-ruS+VWiVWd2S*BoTl z$C8}nSgJo%y&ug2Um%qYVCy9RS**W{N;$ zOOqxhgtoi|iId8Ue+sLXe|Xa^d4RZ_YZeHusUN?Mrcki>j;0%|rub;;WwwatgSQ{M z>)6#vHvC4a5&z-?#Pfv=Y)xr9pLUM9<&7>P@Z$qrD(MNGe+ zb#XkakOB6>tY5UX_JY~i|3O%uo<|FCi^6c}Sk!w(PhZGxmG2RhWOK4YXe-IXFdweD zr0`UfE6lifrm9E2`c?h*FDAAO@6mms$^sSz!k#0}SXanKs=va)2~f0r6(?%?oY#p2aQ2Jm6Wm)b4vU4+Yxw|CNx=mv4-Z;$x4 zKUIX9AkB)N7`OJTj|X-haj1NafCM$i+_excD>V=05^BvKDsy z0fGV9Ifc6d{^>c3-bw0t_0wqr%m89bawKWemN-lE;$OFLeY-K74CR#O%Fa_1GrOG$?DLV+SEVP?Ck*JA|iqyZ|te?d*{xv(hc`F-Mmh+?EJ3yeS49e z1C;!iz-iX=e-b!_|0Qq^LbCNo0(k``*f7Q-A!OMdvt+xGZ6YBr?t*{c!M+h~|Hc3e z%U}|tPBv@T^wUO)O{sfS`Y$QeI;rSd#n1sxZ@_GD6Tr3Q!KiO}CbLXwz~OsneqI2| z2!VESv1*G@ul7OQyxIj&=ludxFo&1seFA?Et!#!1)8%IJpfba`9^z1JpiXzEO|V6L znQvz4yCnXM2WX+ITz@N|rOmrq4}6X5t+u;fs0fLg9lS)=`!?YBFOG-45^EU8TI&O@ zO8DouD4}{uyu<4f9!C1J1WB<)su;h-_vWo5~JEvPW{?q{($hU1HH8NqON!upAg_Tv3audtt;s`w(_ z;XSVrx+I*y`+mIMZV;j7@F&I3_;e0yPk!)#$s1)SowQyW$uzHB8w=5ag5jtI&%zFM($%*)UA~U8?D{SI zzs4@#wq-+&h6I3G|9tC7@Bj6!b>I&G{gdmqU?DbJaKxRc@sJQwyB^Y{y~S-yiCOl+ zpL=+3bMM7_aRAa(&c#|8C?hqo{sTGjvX`0(^Blb^B!ueldbk&kpX} za~-zB;A7PAmH;Xx1lotQRgDS5>IvNZ{^X;2{oZjn_1Yf&Zs6bcyyh`(1#Avqt4wl1 zNEuYG)tVf2ljMs}@nUX$Zi&A#0kzOk{(PvQrN=vZ7rc$?_9Vk;5%LbUd5_)6QOjTD+uw^K|4}^6??0e4VsR|HjC~X^E}~VuqWoVq#^m}^Mci>P z9{DW5FNM3p3ps>C7jgO`y=pF!gQJg5NpOtGms^EMJClVu6tc%xhz(EDyp=x||I031 zDqhLL#=*k*Tas1RLa~u4HeAWYNp5nxR6O{&)PI~4rPJtQ|2YAMnOiGPT2<(&>xw>? z6D*x;jBy4p`}Mp#JjP9s8;cXSm9(Blj-N100BYx)zQDH9(iN@>5<`EN3l}LB4%o_W z5lHSYq$HFo5^bX<6gq&lx?S^9vE4Q0?%B3Fa5q{m9!Q3ngYoOz)w6X}(?JzV3r+|X zYBG%U+mC-I-0$2Dx7@nv)a{Sj)kgcm2ZW6KG-;wgK*;}k@v-|@E_Jt3Eq8Cidg1eH z?gLfa?e9Op9^j|y1&}jz5h3UH6H8Twx;o||-tQ%Gl#;gtsfA$6;?>yrB8+;9nur?0mrCeJ zX0cB|R1r`OW(OftqV)(v0$S6;;~#Q4Cz?=BN8l?i93Kc)STPPxR5O+@w0U7wWRgk5 zgXoCZHWG$vbV8bQHY@{XCK&37Z6=bWQe!@VS+g?7sjR}afpZo_##DYRtN`_~o30Uv zhLB98+S_OXW}hD`<@a1Kto1^nLRfJg)e)<{R#@O=91NN217YpVHJD(-393lbIL3QT z`LeG9t_D1czrBbGfLV;r;>c$Cl{>*n;Fi=VL@rPckJ?DII^eWzzv2IKm)z0P)Yh}T zwuP4IG~S@j!7kO5YgS0SpmlF1a~bT(Apr)AWSWI-a$OL`!OvWz$e1d8u406ZX`DgS ziReIQE!|TdM3%Yz@NOmoblU=fhN1GC*6$O8MD{l1i?XpGX*~2`yYjqj08yIJ zK_m==7?f5UL>YS49;RMI$UnNeBw$O8`|yGNU<+={p$J2^33A1-*iMo}NCoQeYvCXW z!EyKy0Tar9+~}qivJfkmFBQn2N)c)sMNu;4yD&Q)poD-pmStY<)QxO9S3Hkw10@`4 zFcNhZ{q10)3vyqlt9%cnR4y0bD{W&$vrRG1*cBU;=objb!;m~D>ca8Tj!&!HDo@ ze1_ujLm?0SBjh-t!$L?p{maPjo-V2Xds{eB)XQ@I!r~|7b>w$(^$`ENY>uIwqQgP! z7YV7zX%zFffP9vP9WY4-BO0W6>*Y6*y01LVrf2A~o0A*lM>&?_vlIpv3ZwZ^*VuMY zP)-=K`DUb)W)xj9g>q{Pv6Frd1EIFsxE+zeGquyA#RmSqtoR~ok2%9surQ?bb z(J^!~Xsu#A=FCCOz$aYbe056W2Qlq*55pKP03deF&S=S;f-~H?aiu!g^v-T}1qo;X zfw`V?j|TfKB{OlxbG?2a2W5zI1S}#T_OCFiIZT`=mX=`uWbpw^`3jcJM;Zhm#xMmH zv-#ag(pIuUuC_lK{W*(>~clB zSt|(8BQXuzgwFO+{c5{m(`#s8aC$?6PzQ1AEbrSEPJJ-u2&^?Hs9{wpb6Pq1X{DXH zy1~ngy&M6WScR-X2VCC)`I*?pkKhNCz*fE0S}##0o(>)p92pz+^NUxWySldZ$@^=| z(|Nes%j`0!GsR44`G-a6Vj~9bSP%DkQcNm-AH-4FIL;?sH|MT;_!$B$q8t}D2&23? z7aAiPcNb@5n87lkAr$CA_60zWV=c;*mTs3Yc9RvR3|KV>PJivzM!t#jCREtH!)WGJ zpxt(Erdt`|399#x&A7GInC7NGtFb%C`<^{GswOVG6{OhDhnm7%%6MpN1{$^Ue)kUL zF8!stJ+gbiFfA3Pd?^~8WAL~K3PnkD@0+907DpcceF2U?XGNW z-L4YOydIQAh*m7!Py z$Pff!u=T(DbK0mZ06vR~f_!_}V5*WU{K=S0XvL=W#mEAn`^PT_6Qh#GkcTMR&>qEl zVy&`cd-WR{uo3$H=}uPnn~!0Xb1!IL`aHdpoVY$0cMkx;1tEuug{ZYF>ui9t^Px}i zGjKwK=HOn4Py`SR>QGu8Xo@*cJHKG?t&A!6>41ma8%|DA!^cqnaG3Sn^v7rfB0Pq6OR%l4G+y`p_ViSb3?2gnbqm-l`B$D+cm zmM9yWVV`it1lS_Emf75RdTcoiGu&;+R>Ro=c*VHicsGF)5yPoFBFepXA8yOse7v6- z5CWb3WSMbcyDW*j&mRF)C-1XvT)m#pgOJv7>&>H|7hNWYenclP)qVhaJQT5K0{Zo+ zE?G%AlNZYo`$$9YEemAtTxu8`P}UzvsHGvsaaQ~2uW&C<8Mi6iQLg7$smV8)&zZKl zb!2>7xP=_Xm#kxWRW4rJ3TF#k7RM6n2y8Cn64&%lgQVL;M(65jkO73OcDZkFAHDisYv0;CF7AD|k5rcM z0n2bS9Vp7+?|$Ffy|VG1Y#Hp4h>{Gov%|dtZX4UOuaaGl;GVU*P22cD7pR}I|GqoR zzdge`>CzJ0=epRfpZ@YuAr$FLoAcuDZJfAYxng=SST{;3nl}<|+$$0tH+A4%jxIf@ z`s@A}i&t{!$y8c?v)(n-Fs*G}U{cw5`@pibiY^ZIr|QDAf$NN}ctu_Nz|x65Y9lVw zjCYL(=*qIyxzO^dfK{-tQY+}ZI}$A5Syt;Xq8tjt2D)UHT$X^-DR?|~uT<|$FcEvC zNE~BA;!es;A`&^6I*~?x%tr>uxbeDRw0Y&6ZL`TpCZkhfhvXZsElPAUm1xNN!j3B!ciE0N zDYP=OpNNQz?P=IH!m*YI&x@?PyVN{-%u1MP5vuTcD7d0~?FgTgVH7?4n6*U%sGjy9 z5b_1?JrDvXzdgq`ILqH%x;!4n&;5cgWok!k+-EBy8b-`ty}Yt|d1W(P_`8t9k)2%J z*m`&V$z_!e@P<G)iT>0+RJuoL$_$_FB>Z>}e+G-4pbMa5zc3Hf$9QMnX_;7LPp* z(*6^_zx3?t@>|_UcXvV`N`WL9HX5ZN;;Jg|BO`GT6Y7+hh_YQ>p_OPIlzE&=q6W_x zFNakolr`u`XLMw3hcFC0{vgqrvc0LeeJ?@Qf;>(g7|%>4=M6{#o>bF*9+nlDOG@y7s3F^?qjFm%yN@dVh5T9E|X zWiLKr5g2pE*dsD9j~|z1LMj8uN1~ewRiQq+Onubh*@WaTZmpNmA)5~k1)5B7Fx^D) zmptCXDK{CLSX-7`udr*c(|-3|e>UC;LATgrr~IVLZM;urJyzQjv^Q|%gPVz zCT(VNtyTs%g4^TX_@P`ML?NB$PM8Yn9#~u#J%ZK17L0Syi+GmQD;?q!L3ylz3@tOYFM51BWr!b;YL?-?OT( zc6lxJ4Q%2X8xVEm8xRqx|LXAv>LIMxJOaKlM(#v7e7IQLqk6q7oR0<$dwwPKpfN}$HmTY7f~V#PGxy*`(n@y zdZ{g2LU*xMs@Rxk6=aM)MTy3xqhsNY5-x=;@{8;o7=yBS3{Z9Vxf z<(YM%#iD~AH{fMDA>4JW-MR9gs>^@){K}`RZ*N7>7IxGPXhZIgK&M?Sr&PHpo-)o} zT>kPP-NA5GP!2s8rfxSz#ud_fK4iI18GyKe=nPDU7d1c`yQ;ew0PufVT28lyvkFbA^QTg9}C#oO5y?#X4Z6YHjgV^3`Nx| zk(+vOc!LJg8dkJ8u#{Mzml$u{DnG=uz!Ti;pN9JadnCjI_RFX>P~)XKQg||*RG=D3 zwGFXtm{8)P0j|``oyeYvb~X>iL|7QlanLBQQQL|*Mo(Wk^1xI^p-bD$<&<_nAo=lT zYpw$2@#Z0azKtr5^=2k*b=4wzP^qM@QQW@7t#1uETD_ly)iREFJ&CqR|?u zP+?NjtPpjLqTk($)V0F-8s?>k1>al?0Gob?;j!4AY=2%~qVi6bnP*0Cho|3O`s4zJ zVwwe9pMBIl`nUW399#eZdKq`kmzLn_BcsV48t*kSzXKRRR^OB~|0Uj=U_RG)lMn)2 z*300oZVhHJz6*T=`a<{ledadMLCf5MAn3CnG_tezTN|`YO;rD1WajU;{V%4FT#! zkxm9t;{rgwYtY{hBp-u~6;Dl5sIk$`oOzpA(!P28@i@08+nMJFt65?{<{Z7ywZ7af zr-_hVXy5OC4W5J9x0!2|4XuT=rz0iPxZkFl$S7(1f-?=jfi^YNy@C1qn?2ZH-?9Jq zUM0uHkYQC;{Xtw?E(e>oQ zTg`~l#4s3JGd|;C<@{{}4o~86V3w>i5l%Rl!z9taR>$Eel^pJN>( zFQc+kF|KPc8<*xXi?-b{ALY`HQTFWLveMW#DvT~#c%D3S-{<3@q3>idche@>%q#F0 z$D1h+Fzo?u9|gC!Mp!+XGLc1yv-$IOS#@eIx-6t3(X>a=d4vE!cVqX4=96S*g!(yC zjqfmt)~dn;4GO^o>Vz8 z;^SlEI8EZi6M$82tk$HV-_>3mzP%n5MKBdB%-Z<3Yl~_uN$ugFLb(R|j)j-jG*wrg zGH|w$9=z=QKR(?}y+qALD{qfF}ihqp|IF0OBN z2gcN}7OLh|KONk_Za#(}fj$x$8gNBrT1dqTsidD|n^9Qd94l<3-dzu~*{6B@W_sQI z>A)IJ~*#L+WY2tA@f$wWIrR{xA(4Eswe_L%+}c#8@e1V2fvu;@n0VF z@aF)etDv+a%Rp5G5f9a>9+GD1)_cCVJvPrTlQez^eE|BwH1X({uAADiHB>?Z!w}u{ z!k9P#+E}(DY~I!6PqM6ZudAk^SGEBjljf6l6v1J@VbBUf7IFsP2U-3f21Vy2*qfQG zQYK8>#c;Qqtx$(QtxqB?*B-OmWcAnIp8?P!B1FvJCXLYtO4_@C-z)jO0o8j+QY$y4 z)7d}tWtPm(P(**NvfRSF(Ub^dqSPl2TzpLrg>mY8H`h4Xx%A zY=MRtSsioMX7C^b+8`Cfa}GKg@-V?gmNhkPiztF<9&3JHT@m*8Qa=T4>0Qth#>@8WCJ#RckV8@>r5oMG$rb zpIpq=6IFR3W2CTsFMf!ZAZomfGlU_fY=LYQ$c+@)CXq9LDp2IA`GUUQ3Cg5w7RXx( zvXLTN#R54avjK`}%u$lF;J@g%(|01vY@GILGEo;4fLZeqiwB0T`=`zP3dMz{OMv8M zSuDmXRve1aosljSplQ<-iwT#RgIY~pZ_2JX0c_Sedx7nuODYB*6$1>uJ{N9}A0#xf zbklJHR}7?K6D*P>id){RK&i%eV{@6i%hT?b6Y~yYh6xy8kPj@QtRF#0|F^4qGjWWh zxsk(jOgDYPYYzhmA!ZR_fDi1?{>^e5ww(#qV!8YuDNjiEm576`v0?e=ZzlWMJ(95} z7RYW5S+(E1m)lW`NSAY+(10jUGWa$u*)zfw(9u0ziD*;L+TO<^c5q3g7^Gg|hshGLE`A3MSs8U_5cEsm!NQOxhjfwe!`pnP16J@7)7x=YL z3F|=4G5%^ZGQ3`vbc18_yu$LHCCcYph>_ZhIP+oR&d1u zoP+g5AQA~j>#~!p)zTT0kjf&w?VD%h*9dnkmrpR70}i2{JBO&8!DzOk-!h&XF#f`? zj3IHjd!>89ji~Dv8wS41ZsHQPE9w1RHTJP3g!H*bwY^r-3TXYzto2~*eYP#MxFuvr z1O7>Hq?&Q+23ZCnJ_vdVcgY&*7fzMQ2*ZSNOJxJec5S<|G{q}~5QiZ6B2^gZgM1`5 zV{9_R4rm=Y4CL2UNLTN%C**~~;APK9F|9U&zx5hNHt-3`vOLOH$2<0h6 z=>%bQiclUUJi0+BP!Mqkw1d-EaF=&*s}J`R8nEtW)-CBW7BX|#4uq|aqzMi?g)98q z{6IqdR29bbU8ugM6kmnOKC*^3uJSMyk?p5DXVog6kq9y+S=0<~m0$!*n3MDUcTk%! za?li$UFIhf)e#9~{OVcmHYhh=hdtHlzhb@wS(_7Xf!Z7nRLdAw5~TK3KRq*kP>A(U#E5uMrikzp-Cg zOPf64vU@H5wSQzD(W9aM3`ZDC;VYiWzu*y$U$JR8P{11trvO94BFnX7`Xp_RvJ}LP zMJ&xjloLJ@`jyBtA^SYN0hyxhi8De#5MthyboG6tw$o2o;N}cUYoB`p%;XBWEI@X< zMkGEiN32u>{_1%_8Oj=>|5DAZ}`rXoeZuYOw@vGbdv0}0ly0L>v?i8bZ5 zE+RQBbvk@I-Xia3zf}=2U`0I_yn>?zV39kK*yQ03dQ>r$-riH8Xd2(4%InZl?;5#e znk+xa1e!(+bPI>@QOvo4AG_FQ$%R|;llWXgpx0_o&6L7PpALq9foxYgN zUX#=`ato4&Tw_ao8z5B@$3lWk6ZYVcJ6!2Ft_Y5_Q@MW)OEhdvACr~Blmk?Om`GjM z!y>PbsGiZsQXsqSRr0?0z&@QpxPl?eW&p0Z(C)_|RvpBP8AQcFG-d$nFT{s4h;=)0 zG=tbs5aBeUU`m!u)~ke=X9^qEhliUlKA^3ggd5k61gy$}VF}W|q@dD&(}xyM;b7tn4M+mr&LW7)C$^;ON>Wj|mm_cz@b5+K zR2Y;%q0FT?((3yKyBeA7HqpIT$bTMYCiG)n{h{c!B=U^+9JZb$_P0@Os^kdk77m>u z#VUE$d%sp1z~Es?2xCCc-qe3>b)raFr(oCoV)gnm8S5h&AbVr<$WJ}^ z1UlP=MmH0N(LB1Q{q8ur>@-cyAndEK28WDEY7_cJ?6wBYlk2f!Y@yVx+g9G-roGs? z-%pBZoB9nt>1%es=Cd)BTQKO770j84jSgDDIkHtuVEM|uz)+F_^$C1(O0F=J#kEm) z6v~r`w(TA#tqNuSgh}NR(J?t&&ageA(cR092m-B2a9Rj02R0D6)NIF6HxeXdVDJ%F zA&xad8sw0EMGlh>pRl0#Ybb9%W!Tapll}Q~&l?fGpb{s*C|uRLBhO*7g7ZK#HYViq z{$c!HIy)oywNyB6GXICah)G}ufJM99?%Zq)+?vhZdXVauZ#w?Ez2i?7$Z9|iCNIah zYxyM13>?*T2Q^@j4;o$WmeLa+i&>AsJO^dVkjNuuaCR-jx-_IcJo%ujIH2Bn3VY3ujuWapTe>6^YjSpxVH3)G24aUWd57*LzNl%W%nMs&Bxjhs-vlTH7Xh_<0vy;$uixR~C<@;61#_L{0D0D$j;)Ho9# za2&!vr!`NOe#Gn$ri#)~l(2}H!i2FeSL%7eMB!8=cYmx*STMutLPY6?6f9d5Up}O| zX4I`S;-#yQF#>$SpfqXx#>?u(pBfxDHLHK;r$Y}-#{8G>i@(aQW9xt*p6Mm6%)(1z z$S14fwPz%H$O-%;z{OY$0xku}(Lge1C3{F+^fG#S&+qGkN1_R1@}TO+JaGsCa2sc@n?`cnwWx+am};zP4UfQ`p#csS03fP?K*FH{ zAjm0am1*>txr;tA(=R$NhNZg!s@tj~)zs8}U~13b(v|vszb|GtVKZ~#0`qPmYjV;> zP=l4Jb=Fd&U$8y>ZZ++jF8Q%)5)QYrK*keTQM%y!yRfF=pQK|1<#JO$As_b!xe~%N$}Xl%2Q*5&lwlA@&%6K zEPdQ$DgI^H2uj(e0oUZ z;&YRe_%O!%6IM0FOd>G`nk&njJ7NS+bZT3~RZr8sB>m+jBO=UfD)tqKWNSV zCaH61cdDvQHG`_abF__lLK$hfFE72VD`Kxj9xg{v<6=D`NZ%SUtf?UA5KEO^=@ooY zQ-JUct^{OogvP>9jv9h3&yESGI!UZNX%#RPu6jvg61wm9F9#;DpcE#9-;Kq??d^0y zv%4se_3jRcIQ1FPy{Y}O7%c*lA}tCWB@*gbdYyx4zt}oUxJ$Z&b6L(#^O)?*J~1+M zWlud7Wv3HQ>8n;2?gL!TxHSBmyJM{u(h7yD)vlqBWpzzHVru2%1g3`L6f%wjdTzm2 zB;m+Pg$uoqDe;rBlEn!b)htB>8SQ`H@-UD~;~}*9+xEoB=;h&$@!>Bj3(bNQRvamj zR%3Mum#)I)upS9a29^$db$p3Bd`cyh$syf#HM5!52)8U}jxow{ra4|E%-ktVDi725 zjAvVo$#d9|G;Us|^x#U=g)ZnK*`Lv2a^AFBQ-T9jyk6$O`V+qS*-vTfV8ZQHhO z+qP}ne&?KfyZiNDjZwczDw#EA(xX#r^H4r2{&^@}d!wuzz=IpTmWZ)urKW(9C7pf1?&XRSeQ&RT896%5sYAjv-8>oX%-`^Fqo4g z`IiY>B?&Si63o#vxXG_QL9y*NyZ9LgrDW1c?Zf!Y?k0Pwbcq+PZG6_Zhc0mU<_^li8WEAg&#%A4N}nMCE~MKG5~w-8QE0<1D^KvfN)2j2oJD_^6V%3AhwU%O=o z@%J2K4iP;GGY1@Dj2J)TDDOhq@o}>nk-(fc1x`Mhh7mPkAl`fN5|l9jXOkEmgs4pD z(71P5t_89_!wZom$xmog5Cjp6&bf1pqhn2Nw4D4lu*Skp95bn0j%hsmr{xZXU93s2 zXhlQ^9{GYJcz$S8^awg4i6xE3cQQlb>oaC!b!L@Pq&wd1DLfC-sYq?k6K#U6Lc7~% z;T-vIo6T8RgSF%=Xt_GmzapnQA^Y()zqL$~r$t#kPCLwJ)Q1EeBC zzzq)Jvq)>i7P-RK=9SPXd1+=AB|6!F1+llo%saOiclw0irNs@L?~004oXoC@NOt&U z0v&SeaCaP})%?gffT`P#9CICAdI496qb!0tV4fv%rM{QM=tPeLDqm8#(ju~4msdD) zAnHI846kiGE`%JzS9U()f?-I_T=+TJ;N~^hbQbaXHP}oRv1b!8k3%f4nOM+17H>WV zbCB=`VvKD&xUDn>*091w^w?KPI}p;^Na_ZMO+t|l6&#P zPtWVw7spY3ftY+$?=4aKx_@2(dukHEpWKUm5|EEzYDEt$HlL?px30hp3z?=HkWks%QZ zWsYUa?+@%^WV~Bf=Vm_tMHNr*E2{2W!MjQLq2~;$ss-*ZvnD{HmGyvz&XJ@yq4Wh% zBe#NW|FbNm)($mS|o1x8?!x*p{SE7u2@BXH1ki@5UwVR@aC^+4v%&Q8O z9E9DvZqt$oEp9@V8ag8eLaecfEP(tji$tzYpkf&JR0egjdsoC)!Sx6gk5fyIiJ zMog(tX$wxg7M;yQQ3BquhN{pYWRUUzZEv}}tmFY7xJxyh4o{95`g9E`Z39znoGg>g z{39I+ly@+4McGNeVQ_#pT0~U}ym+U2r6di_sGozg8-GkkA?dfkhGI{gX3qIV;$+Xo z-~KOcJk}qq0#B12&LA~WH94Es4N;43v5dN7(?LSR-9V;{ zML*}IkATs(M)H+YVSV(}iEeV)jbN&Eqz22mX~fr`tb(Ed3Jgw2Z8d0j!As~oZ)to| z))%|KO6@`r5O4^zNglgT_U&|x0_6&Il4Ztghil28u%yyS?rFu?gpu5oIZfj7-=++g8iXAr5ykKt&J#;YW`G2-= zYx@(~>5-A*0SJd!6^E>9nRqL5U65=$9OPWknW8T&f|l+qSxvnS+2(KC(NV*+rI%}P zPqbA3>Zx4KNNE-lV}x|#wd~wOUW$zuE;PdIp6&@e+>+%9tXRq(e|+J`j%b{K_)A`Y za=w}H`SPCcIiNq|`++R2vd%PhC|=#0-SOD`_MZkm`7uMbWR7f74gK~JL5)H8A*vt* zb!tZIU)!YYS|P^vo$%Hou6^OU`D)g%;oz-B8DNokV&&N)M2}g%b|LdLk_h7_M5&Z5 zmH?h`LAf|o(Gv4}`m@UWhVk!&iuTeGQXznKdug;LIK`+Rb^x-$g@|hU`yccq+uPwH z-s^1=K%=+Y5qwqa;iaQtc@^}0%j>}SyJz%P)45(%g$nP=;_XJ2;xFu^zh)MZ!9`!F zSPZLr@!xqL-m&UUX=_Ql*%U*mcrRth(dzDLWT2&*Y1v6vZ(ubpGJ<3gHqj&PbIP)K zA24K}DNG!P5VZg=mG{6=_ACTK-Wxurm8(Q!)GXVbdukY6qCCP2&lw+awcz4@7$~eL zg^%?_kV6|Ji)d|rtVOLtg&0-w9gS}sHi$#pxemrIb-Nb0&-mGlMN)AoKz14vvl`gP zDwa5PF6Cs_5x#?zfQ($47a0J~XUh~-c*QDKC(B}~%#>@EWH8uUEL0fPQ(gFIDqZl( z6ss%U&$qaWH8ZLzb_diDTy*|a&ck@mCnMryPX2w(w3H5y?hK<>ii;u-gvnUf_YO%=`*CCrhVmS}IwFR-=AV%=x zpe@Jr7+hWk9deJ;0MwI&h@2g{HfR!Holmx(`eUw$IF@{M0dURSIc)&8Mw_1-^67nm zaztJBp0lFr_l92Wva$gpHS{j|5lXnF=3HNh-^(zB_nz`2!PwRlR|*nn(_qI|4N$xz zva+-cFwqFl$`Xt_MS~Ike=5=dQnzL?U!<72u_;jPd z4#G@Eo7dcEXm5S`{5U)R#ql*c?DZAT2Lb?_TctI$p>(7hUOPeQ{{h#NqQqsT3ODr1TilmiM2?x3YiW)vk4}-gZuSQ}Mv^Kr{Hgz6$oY3dp1OGY!Y=bB%6U>8gP^ zPT>7Az)2$X0PRZ-(Uak~ZO!7pUG3%-okA~-pm$W4!r-gEGrAHswd3=LMB7b0ki9xb zmVud(@~zDS8sY$d@ThUj`Qr>q2^|^^lbIODpOr{LO?A|XjZ1(fKyKzPm~-ep*9ir{ zgRQoeCPZ^ZtmQ;1(a@DAc3<02c&gVIq(WAa4tRz%yp@sTvZ9-sK=1|(KeG}z9bx&t z_3-7*;@;peVoM{cNG=Vb2;9goQhQV2a}=09Mk%j6r0Ncyz141f7XbOZ7N~@qE6TRbBb|MD}84&6fKjBV3+@h&#O)F z4t*`sKf0dM!1JK7d>vfHkpw&kH;$2nWIidh;!ZfWZHJiME06o#k#gF)JRAo`_qIP^ z#nObHX67tIoxuNM?{#QJ;o!X2NRsod;e#jT;g$Uh?AnF1_H~9j(N$IT1c#J_t8nL8 zsV&pCF(h{Zq9@h1S9wZ42mcnC@O{C0-juMHBBPsHx^uhKC0=ef zJ2>RL!E>B-DNLMgKZ?bl+lV4Jol{!xE{j+tbDK9_vfL=wH+C&N0ejPWk??JWq0m-t$ z8NOlWH(J;<%odzq<%Qp&Lh=nQtc1WodV^}(X7s`J(eV5XEUoXd;OGT40o>mlBVu>0 zP@ zs`%Sq6vEq1)W5TR=*k(Q;crE^#yh>vL-2_S`gab*meh_tCBk7oG79Kw1yKja@MhG+r5#9}~Dezfjh=GG9R)SFu9u7OHl&pj=ttV<-!Pp_xCDMR!MGn?XB) zaQ}+Xp-XH9tsD8D&RtlvD`QM#X;LC~HQD~!6v+oQB3hI5LQw-o@n4~o8q79riwjGm zs+W%PnEH!O$9b*ALUhjMauPV{pbb8-MQOD`T3KBbQV2^Z2}XH|x#Pg=M%>8;a% z?xofi7~;LlJ?eeHzZ?4l)Y%#T8eGueZ2<8khq5=mlRHYyxY(gubzcNHW0G-M%Ag9x zP-!ILZlnqanuD(xm7V`JifSxOC5SV;xZecn2iL6I({LS16!F2Qz9&U8hj5U?cz7C=EDh$_CHHP_ZE0^cHaDSh7a7+MDA+NDxx7)yz`HT)G5UkPIpcU!Iu$uMhrFgce;#Fr<`QPB06nT8bTGZ}ppBC=2N;jt0{)-kwafuS6 zp%Uw+qw#hSUj;;6k^x(qA)-nG0gHn9>9J(7(!VuYRh_II@UsY(Wo}K*68(ITN`7cv z5C`wjq>36yDS%zM4>@_N`ucr|v!8=X zL6=OI4JwgYFxJ~pLyC)f2aq-QL1Z?=o*_PKMxbyC@}BoB`*dhYh<3sFAX0-BN9F}Y z*OHOE3yk)P?{L%HF%0*?jUZ>kBnNb?A5jk}&4N3UVd_0s%F38Sn&GfujN3KzkmY)e z0(Gj|TD5l~piVcWy-FBW)kBU*n9%ApR9^Oa$SlV#FQHYf@B~+Zgk1){_VpPcb-PT@ z*kwRLXhd!+@}1*JEq-lwaQkI9xK0n{T)5fKgOW*0C zWDTP^QcHW#+bBa6G|i&Ky+ z%pD72u99F9HP(tcc}+;OqLiMeIj=2_qFH&$tM#rmb&O7fZ<3tqE*FZd$Pz#X!XziG zIQL9%)g=ZIEMyF8Jj;*G5UT*FGLOwpB@3;}oQ=_*##<(vUUf0T+?DSec$OcC_k_5Qy zAHVV8r=A+s$J5qnEd2g-4yFN}4YO8CPkhs&z@W!u1~}OFSEE|%6D3R}vjUI1imYw1 zh^Tqh2JnTG7KR#n;qUyt4$yy}ElWE`I_y_fT0@RH_%}(8qB^>+w4NKM21bXZ>reRM z17bho92w3-2?h*_M(sMRHM{Y2_53{absiC@9gRmA=a*IyIIBDbQ~6%D$bEsn8vcGq zeb62LBEHo-m9#rUOgYx0T0%e@!h>@t@TTbd5R@wE*Nc4xU5GsfNba*9@-4%<6+DmO z3iTr5)rw}@?iPf#V0>Mz!g|#Q>+C}liPVeqQ`ZfKqbG>239euqNCJ&6i)ZQTqxRb% z7f_H!VVP!h0#?x9LX_oS=PSdsHc?M3pvvigh!zo@8UE>)$o=yc5l+CdQ1N74Eazf{ z376iH`+WF7j=K9yg~L-XYzqC?Spui9>^O$yr#+AMARC*dyRDgG5Csm#)9bk5?NJf*%^a_ zPd?eJyF`^Q(JnVJJ=-LEaS%ig{W+(+H00QBld(rPVmdIw_FdAMjiw)8Oz?jT7+J*i zF|3)Qef!1Rs0*8!fTpKR5;AOp6$nf9minM4Uv8s*78T$Bzt_v}zDnw)h>nB$6YsIu zlA4&;{%I$DIss^{KQvchIV1S}X3d=3gG>(ibA>4=c>A?Fqk?OI(H5h_3-p)t$t`mP zD(S~xIO)p-4XlXu!tXzl=^w#x3o?RA=-E4;o2}{4shsx4@=U=08}0Y?DyXTSy1Wi^ z%7T4xhE^UN!}}e+8B$!A5#=yE=FfHXA?w_4V+HO-RE@&iM#ZE5ZDgl2tlM4g0}B@( z^ng`9W!zldi-&b-GQnWq{0d%R24a9qL@SZ=L7l#Ed~bj51x8(`6;IcZBHlCb>L#sg zqdUUxb~Lanc@$5`io-z0)4PKxF-auJZjD^$tuj1l^nX3OI6u3Zi>6|?l%x9h zO903DXbjG-o|%V@7vz$%@b$#}(2w{45e^#Xf^GQjo$G7TqOg>3^ReH_er5N!G@9xU zDF5G`#Zx5iFd%q5Hpu_&EN)Jb)JLV;f-CNCw~K{_CnT-(Li#1Y_1Gd~@BhAo_age8 z(%Q0_G>bTaJ@8`fqYW3?=xo0-f0(3}?l_!j2h77Kj4H)33BjDhY)8Z~7RO49!t+@6 zRm5AWVnA>Gc$T5^!V^WgEwlpc`h6=zH(~Gg{T%+b1V3RIjp{cc51# z-Hz}qj)M8=W`XD*1+3xVF}#NBx=FQ`4Cd{<)@#FoGBrH|0Zl~LAw>r1bt`0R-3g1dhyjf1Orf z7%c?%1l?dU#n;m(xv`W#$^beAM-JxYme&M-KkP+whma{z2rlprO2Pjllh%L96g%)A zGPPae5K`8QyKvT%4eVbY?V;a$9#+CJOza{iQ%imgl?m~=q;RTZJv^MkWZW!a7-Uh& z&DGT7=T2N%Q_K|N!PBIRUZYin4B&lFY%OX2hgA6{XZ&><|B7_twK4<#Fls}h@1f(! z|1`HS9&~RU3_^#AjCew?oG@;r?9^dXnRPf?H@}7#Sb-SeEua<4Tu`q+96va|^Z+C8 z(Tb(%S`u#R2lkORvd|r3+W$wYj1o>RzVQTtDmh#Q$YX>l+F! zOYp#?qRtrD$}-XYgz7tr@?c0<@DhE3NYwTp02xo;E{5b(BuNfB)H;{y$dC@9Mpp+< z&DRG%CwV^3j-aKt#ZTy!b=li#*b#=fXS|4$()G@qJW4UK62Cx{(<57<}(5 z_(}xJ)(mKEpRBS}p3sxDd!p;W9)0(MjN^8me{WHrB~Rl9VUU42i2@UYZBtioxfXdt zf3D0=l4_Vgo)(BfF=N{Hwqe6exlPfymI2QQo>1Lk@;)WP7Emeaiz()bJq?mn!fCjg zLU#jZ{oGSU!uHXy`bMO;v@hg6DFW1D&33^Cr>(6t64PRmv1jG?RL^ zWy=rmq@(4Z8&KU4!aNgK836-0=1huxRgTz@AsQCM7O6MrG_)uUJBwY!4F+P4PyGL! zU?h18kq#r(XLi$W{gg9l+;UR=wP^ntmLky(cQOqZXSVZSf$mn9Cy0nK*!jZ!rz0GL&;oF5UtQ55SNDxK>1f53cu;S ziiXu(+Fa+rgLqMGTLpPTwCDlS(QkRx7nV*#@3T&WrLtsq=P9SxPYm?~7Ez0A$jES- zRC)}3yxh$3J)_4t?i;fL$LZyrtkR;HBOK#BLjy~0Y;Vdid7+J^uOZj_U2 z0W*}Vn-OZ%dWc^Iuq77=Za}H6NKgIiu!Rvhyk0KD{%sm5Fy}3)nHS87ilPqUOm>d> z@pyZicB;(%8env!oe4r#u zx?(-DG4^b~8coYTvV2ZppFZ1M;wixZluoY7ojUk4%#yDyU-(rlT~?KPK@_T%wEvp1 zkV;?Yp&^c)<3e)pZ~$6Q1*eV*3>ZY-SCmhwp-2e}Be*tcuLbRiA#siH&FGqYPGq_6 zI@~NpOX4V8;q}sB$dL%sQDDv>kbxb*>wHEwVwUSi*kPo&W0*%*F3>F?5B%i#;_AEN zkxt*k!copFSzU)jlU}(a2CweMd+ttLt)qm31(O;1P@s_t2-gsfnXr&?9GQ4_)BcPJ z$x<$fTZQ4}+34Dh>CM}d!`N@G%*Xz*^mC6ALu6?BPBP+6Zg@^d{Vz>$VGSnTK0qBe zlRjr2Uc!+}4ka&t%F_5`6xv91$eP$SNs(rk2xLWG)dgkZZRr4|SG>YLvtDu~Jz+37 zal@K4NFe^J+7ANFeg^IzXM{u#~& z!kZ#KYC#?8IruhQ>HqV2U!}9KX{?N?u@QKOwgqgFXsz(F1mcT^QS?`fN6gOhCZc{SN;3D zT=6bR1K*9ZCu0k-A=KJLk08|EL>&&v?KMw8 zLv(IHL(mHAp?+u1Z2q+b`fi;3Q~0K5aGX<2`fNeLWx&K_g7y%pj=F!Bm9am~jOFQ~ z{3yn+i19!e)sK~0NQD>fYtp#Ve*)yvDR_8+BZ0Ja-i<(TmuV0kfuglkI2RXCh&8rW zbmG0jvm2436TMdWnlCa^mT({h6|)wf!fYt_n6}hj($RB?H>uu0+yqwl6GjxB6k z9eD7e0jK_^u$vA2;HWmnea37KH7q&#IuoAmaJZG>X{j)*JJymo<1zwTsUxEq!yCKZ`d0+U* z0=hQdaZ+LpiUME%6||PvfGC$e9+|1Ers=XKQAEdwkDsxqd9mo#TflW8C#qqIh{ zlAT#pRWV4TfOWpc&HkDa07QK$f6^9v+LrjreGQW=FK5^|o!zXi0f@2wQ%-vSTBrT6 zx7g-DKp+gZ#B@67;1g`|EL&coi4(WSt2%+J3@+OXh?aj^GKxaPw=lf ztB)M;$fE$woF6RbiGb`3ycu3R|}+Y!%mGYEm! z;W-Zroy_f$juA59>Pc)5HbL_HKfttx#|`z7K#L*ZHGN4N zcm=gesj=M^RY5-HTQNdF*1$Gravor;D>&W@uMpEC-lwoJ$cf|>5!1ozZ zSBp2con*e`=JS5_@?74IvT%T>v_aJC9c5Hr`d-vUaH#Je0B*CVuCp6vj-Tt(FGosL z2bt)Gagqs?w74H;m?ap;(hx`(23)hf*Y{s8J7Y~AFv1Zz{AK#0VhBtqsRn_3zV#rf zDjG(FWZdi{3jELsns01GPKIM&j3FTj5n@4|usE<~{|R6(X!-s5Qt$ow$oRRwk-9(p zvI33)0Et?;C9+ko`lQ!jMHk^1C;}))PC}FiVgOY@=*x>B0V-3qbva4|^mJ6Qdv(r% zh#Bm6?2FH_7w3qg2{R#4`7-_LgT<8AqB|Il4MYtM0~&i=IPmlR)!(`H?GJ8a04Jot zNqzi&7ZKzbf_(P}NvD6$;x`U^9!RvlS9||sJvy2HU@p?b4VCF;+y?S)c<(sITz_qM zyZf8#%A?N6{H4Ja*nP#lWasDZ6=`sYwh#;s-);4Cb%0Vo(=&BYRt%SmVq(Ia@Z!Hp zrj8dM2uQC+zpf`Z)%2yV*pQj!HnlY-xWQzwj(%lCM;ur5o0D(2LT^QuNK$*+wRn!s zU`$6Ad88?(Y?SF_*scpkpt&`IWO|HqFH_d{mB=ta^g2c2wN zj$g@zi-i$BgR{OWcJ!GbPjtdP->zu>GK9do!8b_`|9P|jvs2tzQ#?KTvXcpL030Eu z4qXRx0dF&CH13F#u8Cs`&k15fsg&!H`wH5N0!vd%%#u_>AF%MG^gC%&wUP}*uxwJ7 z85nt2V-y8NDtP#!VMq@~P)|$FZGv)*(n6+MZpos=1lIL~It+@igtn+wCX>1%`$iM7 zmW)yjkSA3o&+}Emm4BjvwPE1BEJ9l)5@Z1Ufl^eR1wHTKFqndyX5#x4P}bk0(W)eBjz86(K){A|UAcup&w z+eEYwEIQvB5pPJ$;ZKCCP}!7|_if1cBGj?ih~t&1jh&m1iJM$oLn1gSqQOo-4BIc<6@!j%nitw$*ZLC|F4gsQfK5yV&MBked5erpG4U+DZ ze%c6*wVb}ew#+HIKWUMcD4(i+nS|StBn7o(tED~>EBj=1{ zwOAwSsp__}PxTbWE16ncj*RSi<^~};GE^9oj7fZC9=}>-0jfZ$h-F*`K5Sr_XU=!r z5^y_v^}Nh&w7|fz2|t7{AUc`Dbc~Galw&5x$G$6YRt|zDUwq$YC=(iZA*kNU-nXDJ zStzMpjmW@nE`}sy&Z_V*@bIze_^VDgMPnR9hh@~e=3dd~M}{K@rU|H`GH-J~aw8js zybO`{WYaT+8+ic*k>wl3g0cn`4l~6OC2VE$Q-!=IB(?v%*g<01jTFX-O^~RachSsj zf~`!_sqoPv<2E7$0E+(K)@rTqoDm6xK8zK9x^hfnrxn|1X%P)=WH7n`intI}=kBM* z_{9#on?%jMI7STcfYShcrxe}#@D{Lu|Iv591(A)GL=TLb!QKHtLG38#Ly74>j@2?2 zzP}o+2fqRHdw!hKWV_3?uP+FGN`x=4bw@M%@MoBoTB-i^KUcY+g@urNaHu+Y2=_)$LG)MRry*^J2%&lhBvDf7oM` zP1{!sF@c0FXB6PkS}EZfj|%*|A0SK_l(+uz^GyDFf>rspbmnJ5Iy*d?ZTss`g16vY zxCGoeKFSMFnQnj?nI0lXvpW9FjLrln;0aG?@fvEIRobJ|qJ$Kat>&TSi>?d-{YP#3 zJf=DHam&aRp#DV>(L<&NrSTmHpOF(KeN!n`JDQKaMm43a6W>10!7mvHn#n@!X*uTdcNC?#NlraDu( zHXpu0izGwd0vl^za2Vq)i!J8WXK|6{$}2w}Q^?hrKIg;lqtb6P6zI*9M3f_x*z?PO zl^F&GkvTrNKc6kE`UM;;9Tz+wMHUAK7i`jp!bx*yjqDK|R)5V8YvX_(3tIi)LGt15 z`^6iENT=5R=IH*8CCx|113$UDQmsB*t^B>L!R^8B$=J-&sQ0LI8jL&)BNk@iTkg$i zZf)Qo001ig_ud9smo{BORM=8Ijq$g?GeiV!v&eCdKM77K;{YK|{SMlMOz~E86qj32 z&py4o$WJq1cr!@9V8K2x_J8M?Yxm%h_D)iDel4RLlv4cR(qh%(b|7>E07FsQ?ZEK^ z7CStFOA&TX&VE)wCj~)sqr2;HX;vMGw+4Cv#mN7>%BWAvl75l@SyhzEvC{ZN`s4K8 zh45^%#~XoC9Uet;os$*)(P#0}Fg{yKfHTe=S6I!rw*B4kOLu!&Ys2qS4EFV>DwE>~ zHEU^rRwC8P09%Le%`AX~9S2~Vz37>{?~}2E+6ZWEqcsLj*!mQF64ALLb)#6A-w7lk z!Eu1~Ku0QLZbBqh5TzB3J1RO*>EIZA~fscjR?Y z#!<8~yE2oPIjE9&M`|92V89h9%TNwm)5@O_qhi3^-CGQMxXiFl7G&_@RIZB3OEc+9 zSzc+hK)OIn<_heo++@5W>ElGMveG4oZ}MR}e@c@v3ymphPwK_G-EhOll(<##hQWB# zCbaTmOMa@gG3zluv%z%t`9MsA8`M_$D<`n%Uc zD#}3y7V(5BI%d8Wlh3zhZW2-ZssC4n-ek-f79n`R=mD!NII(;br4r?Y^U+#1k(%&D zsFgDD|B4O|b|L0a1ZFKqZ5ICU7Lg$!e92qsl0r@#D5qH5`0 zALe)D7}Zr-YqFqL{M825TP>|>+pmQxgQY(NxoVY0eZ>a5{~e2nHuDERhm*qEXNTtl zPVsy^IZg0Q+Lu6L67~M=nxdIH&kVkv09%M3yF{Idsj%@tQuHQ!BCxv;nq2u=P;+kpkCkJS>7=&Xz zkt>@CfqyfdQLhMT2gEw_CL8Z00_G%W+2%0Mck?t&|YHw&w@77Y5n?LXD0nv}#mH1tfG5(V+;BzGV*7 z8SlRS#|dzIgZ3i&wGKA0scxfM3U&fCkZrcOzAZm1i0Gako5aeh`g7%Q>hO621K)#@ zkbTXyYQ5ug$>aa3=3e?&i1W7@(NmX6vECJXxv}}9P5kX|Og^+X`sL4I4hOypf7goy ze7?Rq*Da^~%zPl3cb2U1x>`c2$+<)gEKx?0EK;pU?%SJ7!;90VdeZ!Xn-W}GL94Rt z7+4LXNfe#ptBWiSs|lDqzx5jr0gm=kD?UpGarQwOCZf+ioRXuKb>};527)~l9S(pN zrUDc3z_&kiOFK{awxVdRj|lw+`b;1%pI4ecFT%CU9_o1S|Dxkl_93}zu4n^>k0?S1 z4Mp3FOS+DD)R(~J27fM*w{ZD6i-7W2qC%m*=+>JFhH8fu@Z}nRE|r~jJ5w;NW}BvA zO1zXLUEE8REn&=nogYNc8E5cDv=uNy0G1f0HL{gt9~9Xm2n=51@5?Kb21ioi98d}# zXep}Ti2J(!yDwx;vULU&GYJk4nHSb1=)&bt>Hd52R1l$GuEd&5>jUA zmlOun7jzqmz27-QgXKK95>_Fg3Ve4D@Z9pt`)dGE8i<22a&0Y)0Z^2)wQLRHG{LOf zI$T@*?z3xOTNcH{P3u=7p#X4=>$dQew-z{^ymI&w1rg7)20z=xP&m|Yr%G)?k-|V` z0I}uV>RS@bObJQ2VxcNGXsQ=jWi){fWV4eKRb%Y9X zxlIXEhWo1g{qg#K1nG4kwb((fa@J#KFFIapls4}2_4a=3%VYH@&j-ZR>{=+nzwMS6 z0Nt+|=;jM-NG#ssTBdZz#9l!UK}2?A9jHCtnS?|i*xIMPkNR#;pfYI-tdVjCG?Zzr zyuC-CF0rKZjO|d$xQ8ny8JBY${49czGTEk#P>XT>OdJWFV-@qxUkK-K(qgA0B^X-i zX$M#*q;Z9=hWnae5j%eQ(>UazfpQr>uBSEloVz~%8(;p3c25#kklgTLyMRc}YO*AL$EBHaXpP)S@Wy{hdc?|%mk=8(^>;atrV&hp8i0!STh3)~ zQ6_LAs01{3cZfMg%1P9UhS5ak^7=&H&ERY07tF1u$q|HAea8KepNV2Fdp4KzH4i-Y z58>11zuL4v)Mh8&^^++Cqzgyz2jaKPsugXS@*65xugr@ha+hSUbUA1dfI3v5L)vEx zin+XERSQWPDG6x${relId8ahy#)OmFM`1-*7rT29Tsts}TryjAcS z{io!!jo+!w=-%3joCfinO_N?B`b!WBzoN2qCL!k+Q?<>u<|biMe6|7>btEpW&N=M1 zPZ!Bq6Ne5+Vjg?08D&UMN>8=I-cp!K&^cS_>KKq;fLP!bl-*^&+g!?Mr8;~k+S>gg zSdPf$6I|wf;om<6Y^NuZ&7Xi`uh@u=<@gUUeD~j!Q91-QOq@)u3)rg3UoauhNB}fN%#(b`Ef^*DRx^^byEHA{~=v zS@E}%QL^1Z#}bQ}Xw|N;iRhW>>Blw7NgTG@iJ*g{CFwuv<^m28qG^{ojRUkyp=nxH zQm&VOynF1~_`oxO)(+dLWWC71P&6qj-Qup}xtj#JHJzO?Eh8cQiUPG zL*ftyKmQ<7lAv+TG7ic4ntm(M1vRKF?mn9TsPU557tI|6I^})WR~PA}LSkT0>?x=J zB3p9X#`%N@CI!IK(lYtt$t4>2-_@@izCZn%=e=VU|I$X?`w=pvO7B7RKO%cCYv5Tz z1%~|l#ZrF$CZICd1PVQHWtCS2iYI%rJl+~s%Z;+)G(Gz{0NOG!c!^LKwpKX0>Cf5` zTk5@n)|s3)Xu7aHEh}7su;nyg!p5?i(MC%>E+P&k%pEV9(vmBxIZ+c~5Z6qvJB5aA zcbMUO_jT!Dn^X`SFoCoEgEjto22a-ooDml5p+te`;ZbzWtz{^u3>)^=(I?9DS&VMr zT`EiA+rUgO8a*bz%^_t0|IU%p?kU`18#TjEqwf z(V5Y^-SvXG=4=%m<~p%!Q&EXBsz;)H{g6Lm5GEQM!SrV$J4nh6ejaTdT63g?qzaM) z&^U@!$&bPU^Y1Xjdi9A;-CRrIj#oPUz<26R zbyYlvEk!xS>qSZrtUS+i6`NbjU@-xRQ)gi1ubD6$Q=ZQi)~YHEW;TR#;2e2GJq=9O z`c|ILWoSl(qmMxqT@!6l?!-sVhLP&Z*N+)JC$EG|yi>7ub0LHPfTI5kO5FbmN(qCW zuAl?o{!D=+T>@w%_ILy*|H(-ZLN2(8UDmC^t9hioa}Y|+w2h)aAoE5uM>o56tpY61 zIKPsqJ#-^|f045NpU5s*{kVj%b^ayMG)f_@gzok2>3B90IRvU6Zs0TqZ=kjL)wj?l z0*=d5!ppP)=t6|?FiI=CmHtqvYb73%L5kU9029dE5+2WybP0M30cu5`>YQA;ULbN8 z{r#7Wx!iYElSgLvT>4X~T2qYHCX8?1nP>Q#x0Tlv%fNM5_WfZXYW&(wbX$&b&Oz4nU3cV0wBc`y=;9?%}@*Bex`b zbIoZr1NXtS(@6#87YDEwTfzV0)^`7ZA9?QG;u=Is`PM8OP_*-r$N(a)ahvk{=q7S)moqze^a`OSlz77DcnMDSZ=PE_K3(n@fCei!n=O z&2u*-_GwsAOO)WZ1&gY;q!h%&>M}R3xJ3r3W!6-OU(nXZ^!!d?(BgRAq-sLjnIV`e7#jVtpVGP`6+W8 z%%b|Vf=Zwglf(f<47*lJjC0nY`$L9$?AgKZRhgAy8asQ4`;Bcygb~7HTFVM*Pq#Wi z9=r*90repIE=!nZ9TiYZL9F_%kZj6?Ojx>+B-q_ibzIE-9g=5~cjCdd=0a|-)Sxb8 zPfBy0eO|n?XNm*Z#`$YT&L)-cg3w}l`!@IsdDD!2YPFbcJ9>F`nEW#k-yC^lOQ|pl zYKcscUt9U%*VpxNW;0~|4kcx6jJy4^Vt9;tZ$hd=_zmn{cnR0|UHX9LSJ6`ItMlow z@TC)?^QXy;ZJT^lav@_h(!W<&+}R7#)YoOUDqE6&*0Qy;B_v| zbUbHtk4BZpr4D@2P{)xzj2F<)GLUSQ`Ijb0MoUV2Q#up0SHLPH$mC#D-If_3GHmKF zvcpI!+gC8>Na4OG$hZ{E*okLl;#GWBS6++dVK9S(`3T$L@a2V}seserjQ7~A8w-rs z6D@Ri`U(O7vi=w8rM&+|x;oy%6kvi4KPDWLvawf(_ZUuGC^{bDWM!f!`BA09Tp6LlmY_!K02;e#|93f!PScKV>)h<*1;oddm7Mz=pIKv96N4OLBxECty9A}2&qmtb6Ys4h0|G{_&M9;{}JdF+8LRnRPSR@3|>tz&85daQdN}JRQgmWK& z{&kl}?pDpe`{zFoEUa-L+V}vopc(2CR@U2e)vH;MxD8YAHZ4+{Gj>pRo_*MA6XRzj z+4|7Kkax%wy>ETw$)8;b;!igD$6xE_4;kRqm3Gtt7q=^OGxh7s3zM?XDK*I4R8_bs zoEi1RmSS3`d$x0u?5gkc5C^Mv2Zu7bVJoZh60M9l0{aDig=$VM6$OFZq!+t;3;`_s zWuTOB0<%thD|0k#TX4eQ?;4(yGbn3!ukt`uQ3DkDq)WfI7PI@!g)bhCLTXW$$Dp@O zpSFKPY-@AQ@F(^^xo9Ee_J`+PkI|5#9|g`$kjn8AehG9&UE%R7n8E9Fk$ga|bI7nI z3&?ijq>7AW%#g-?$dJ|59VMYNhRDZJg=r@#8Xivbzj3_9UK8-ALQzyfu{`7bQw!3- zk^2%w8Z6hrfSmtp{bXiFssUk&_8lzNB#4|OC=a3*AT-4WqD2T*@Rj(~D=KsD*;z3f zgw3*p>8gf;*o<}a$GQh*Np2`YNt_}hfYmgsUgD(^OvV2z>gsuhxQrzDiZNlE{;R8W zZeQhpS*lqH#?bDY8g|)`tX!vtgVXOxS$5D$C+)r0@LpW__6%fci-Wm&PuUIC@X$-+ zFD*ugKKO?Yz`+I>^+nk?`x2XILd}h3DYfQgPEaf#cLr1$8d2iEgKbt&E`JDf2f?kD zeu>pkQdS;dIGVIbLmG`0_-gU^X52@jCHV@qH#(1jZ}=am`wD33t$p4pey49K#}-P- zai+}_?KRyTu$uiTzKr4BZOS+<*+v8v&QI4{5E!r_PkRQ>vtYsYI)SkXSaSFE^utLo z==hnf8s=UGcMZtRa(mTR_vLjP}=qy7ixy=)buw`y|9{}<d1vaz$9Iuj&W+t4Ug$^Zw>Go7~OLM89O z@SittGA?Di_;a(eu8aIx#snHwhbc>VQRuSNZe&2=ztqG(Ywk1Mr|+d_>406y)wzO_ zs|efiJ&I;(e;A-neXd9xzdp%be|n>NjQgIOZ$Rw~eXp&hjs-bB*3G^f76r+j8yZ4% zoS6+IR`Qys2R8Ex8tCr}P={*{Ku5B9;jil&mToL~{0E2rL+VbgwT(l()Teu!41rF4 z7NF1w0$wQpQs-&dw&8@J{{08%Z!q5NUiFEo|HJvA-%E@6K}*r8xr4B2?A0mwJj>={a%Q{Sylr7%JB?|gCpdl$b!)2WJ(0{0&W~{k=G3Txlj^SP#m7ILHDzw|8YCw z`Kk@~e_SPY*}_~T>qpkrT$9hSMa!b>!fC;r=NFXok;z142oeWN-$OJ+?TOZkN}gF z&bc(p(69zqJm$2=R#B(LGC)TRLf}X;9sL<2&V0f|9(>5lJl0KIPd%Jk%~oMpjYO{5 z9|vaV4#18t5g6CvZ+O>NHU=c(;u)a0VcSYcvF{r6z2L#vfmOggHD<-=7F~sy|M+%f zI3Xgo4IQi(+wL@p4uTG#4x-P=h)@}o0?MR$7Q<`T}u(%?Q*{O?_~YIHJg+&tzBH( z2!3hvuk@WWB~*y^86r{g8|#3dbayy0@tHUA-`F|PA(BdLfy-WVd*IV!VIRd!GS3;P%!K-L8Tx^bgy&DDIMZ`u} zg%)u>IhTCh?wQPd=OCYTeRd$2(FsqczsoDPZ@ zMFld^&lR_2`rqj$bh$DEL@6+m(k6<}c~~fO?-!(&dFT;xsdyQGjVdZlY8_9g-s5&l zaVHCrl|f0U#(J&STnL8gNb1Y3-v4nddxl*Lt;Guu72e_RWdVN!0c}`|Qz8TSXj?!; z+{E(U5b;+#OS%|uLS3CZdO=sGdZB#JiBq*26jcETqk6!}^4KyRFkA0L;l2Q~9nehV z31-w9aVQzi2n-DS}fa7u=M>Tv?;Ud6`5BvvVun@NT1oF{Ch=Q_rHA(TLF1VanCQ`S=BS0RSh#QLw_B2 z&v&)0TIHy@S+)MIc)s-3z{6A8&7qFc2ZvHH2IDoJnHAy+a*OH~#MS1|w|>Jk7C~=CfS!6((F4o5gwjG|{-aVgvUywGw(+N7#|a z{$p&Qhj>6>;FH|5u5p9|a5lizkCZd7MngBjbD|GTPt6w$E0`~~$cOHi%veF6F)`re8YM^z^*Yi(-ApLpQmjvWJV5r;`J>aPIuhbK%-OzPh_@dTDF_1(_yjZ14G4Urv3he7LDi;K*e` z(=fUrcmS2>`8}6;ghCz(7T>HMKe7$MYGiZm^={j*nE(@C%C4Ne1q0%`Sq7OI%U52I9mHs3L-KEu-~4CSbhHp`_pu$3Zr zqed(dv_`U57B8JzqYQ@ToBTU1d@=NH>Pv-O`u7@%n8QYs$I4JvD4Q#HoGI*IJF9eI z{UA3B2b|9yOK5A8sd_LW}S>LJ>aF-qfx1=9=`4lNqc8cZsx@{^`NMt^w@ zo5Q?KkEb2)attJnA|D9&zej_`+Xod6h=b{Tf>A^gkc-el+0>R0;hWI{{lZ6HZjUp# zZtgp~iE|L>nBI)PZxZtnUgbr?2qoI!6hN(6j)(0GV|W;k0Or3*HpY z2*zW9#@%qEtdJVHs{gK@N>)Kk3(SH!_~~*HOvqNO!~ zlcRLJV42}eDW#XdkL0*oBv501n^@{E4mamNgQv)$H7z@};=j`OqH-;bSn^e$PsLlu z{CciS;BlMF3tew((qso=TeUA9&rRTVRO_y4*7^`w?P32-Ex58~KK~yndid=_6X*qM z(Y4zc`}F*kSvBA7yrgJjzTy4Nd0Cxu1!`J$nTH#io4E<+4gAEapEr@$wlIw6#B4Kx zmabTy{6MPD1FYXv+Sio(NoHd~NC#L5AN&7lpd zvR&n}@UPk_jE3YI!~s8|gHx^oI;90hPop?+`j@!!p&|71!RSp#1hG%SbBCH=srq44D1DE%#hJG8y90 zG5>>KnJPM`aCa&#);KWhIl+d5#zAd&<#@sVhvJ5~LG*p-`=~$ne2f}s6(<{;BqyG( zfPKe+CW|&yvjGda!bqy0l}ME+d*JzJFi&`IgWFJo%ZN67FJcF-gCmpBPscVKS+G9p zkpp>DMhFbfa>-|KYME@+FaXewzdsmz%s21C>}>$aK%PJafm2gT#p!@y0v59?gD)Tg zVB%7{nhk;{ii~%TyJ)ja?^7~+n}rA9uS?@h(!YCrr&mw6Z7-ewh>(I|(?lQD!HSI+ z%IDjSF^`=p=4sw;aF$%D^zMe@e(HHmS@}d!PSt13v&Pq!J>`~nW`EX2gMcFB%W4A6Ta9S=!!%3XzF*s)oa>Hocn$YdH zj{mc1o`;k>SUeQRL~Wigy{0#NyRW;@5(ymcxjuv=CuGh#_V{QuVlpdKFnhk@2_DYn z1Z|-kHL?*y&VIFQ7HG3VjRsjBy?!Z*2(ZPQ2znKA2g`?k4*Q*Xf!b2x#1m%-ucPzh z>qfCU)bq)|G&#tx{jsJiy|)<$fNkCm;b9cRQMmIrH!hK+ zNC~6PqS-8A*2cdLvm4m{ujQGPi#TrKn~OH|e=k6tO=>1v2IJNaK^)htReD6PwS;QY z{J@7Xh+<_nu3<14rO{}i96oP|fO7Um>U!oGvAjN3Nc34iLN_P4#JPpmnd{sDcBrO5 z0N&^wX9)TSDlkI_k4Di5fbktDe#|X7EdL2XvS;cPAf9|p5@6vZFgWy4h91aLu+bl& zyaILBkq;Ia03*pdq}i#iwB1X6Ko2F`T;iz*PKrXV9IrcZNeuSRaoqx6d@SFtzoZlL zRq$Gq2iDo>3FE?voPXW3S30*G7FXTIwXr1DfC)PR{zMx&fD5SFig`zFdoDJRXv~d! z=c;2Be|lN=BK>)YKTm#ZWQ)GFokjnPY`fHEQ29NvrVVG!F!jgX{$YH*6E?fG*7(?u z*VLIx!Gg#V7pGwir?OKPm0LsAHT8A8FpeYCy1g3^{9sOmBoUv?EnjN2XR!6@#?O8@ z)q{pbcvj0{O3Z)pc$R%#XR7SO3J~b2tafT24a(&&D$vb6n7jv_?#6SA&m)NQDW+1Q zL-*$X_;tX%&`aSPhAWDdAd+SH0D|Ea_i_h3qH9W*Nz%dY?frVO5JGym?wjJ=)f5d-x8N87=l)3Yn z!O;1xJDGbaVX=U)Y3k0l8ag=`dV3?W-?;Ut0=1X6ADa2^vp&7P?-=FI7LYmEK0?)K zx>{f`sHXrZqg>z#L>`QM@`i5dzmh^1ZI=2UN%6O7cmRI8B(`3>y9e`-`tjk&fqB8ZJDA;~*;dM4=v}>46%#%sPU&rf9z5uM z7L_>YUCh#I-`S~tgzDIyBI#Xoq9?yd8DW}A*^@vUZ&@Ez2bu%5dfo$s)``;$3r!xu zGHGb@!aeKu)H!ZsO~-v6b%JZI9R+2FYZsRZ(2~h1+hw%;+C>eD%03%Pz;Zq3oK)%! zrhZv~{;|toJ~i{OVh@djB0+A=^|2G|W-s@(2G3>YNhe|ui8zn^t)IiKQOBy|B%kp= zN67#WrTM_Dm)s#zEkSCNPeFat&&q7%)U_<&zKjT6u!-ofKx#`ZQYIC7Str|4Irp0+ zdmdXF`Dm=!tdmx`aGuWdh3w+Ug2j<}4UiCZaZpBnP^o!o`?sw4S7n7ze}H`=9)D{ogw?mG?)W9v}|7`1b&sw3ST|D-;e! zkPw1wh{CaeP~_O(3k5O5Td7wE08Zece2!X_j-*vII9mSOW~|?_}pMZ_H~ZHnOs{z^1|EyXxNzv=G+^Vp9E@3smFd&1cF~y zVHOZT?!rJ&tx#QI9%Mb#XRiY`oyZI(t5g?yZ!n^*!i`dD7L-v@qDc~Y=4X+q4)kDC z?h|N|6s#3)VERh<&e+G!voZq7UvrT|w3YKoTVwA2Cfn4|McE5Nx@Ahc?V9WeZiJ<* zK8J1x;?4a;`tGSOC3kh*rip=hi}2f@*M#kWv`ZuI4Qk!_H)K1pRcqPB-n{xCdY$~2 zbCt)6TU6_P-Q&ZaO7I4KX*tB0qTqoa%YSUzqe2T)Cv)@k@6h}hj%d4APXpw^lu6kl zvA9ow%q27B?Z)53!DxS^P3T7zj<8~yVa;Qt)rM(|*B-SiQXzm`9mN<2bYC*XUV9{u z=RaN;fE(w3~lOPr-X!b!9s#vMYnh-&xZO3oSo)FbjYOvFIHLFuMD6P?u zz=Si=LTbO~@TqhTC2$V5F#P|mE-dck@CVjXDf79VjY|UiGtBel_lxnJ;?)qJN=yHL z;$opiQkk*Z8hY%Z3kptw&6ee$tNS?Vy{w>4U#nQF4S?r1eRcXKjJGa}8M_tFm(tXI zNMu*W?SR|Ab7J$h45~v249}KamjP9;t8z2H%Zhp3ZhRH`Ug{8lB!+%CEf;FyK1Hfo$X4$<_$ut(i4G)r37Q1I@+>& z$9uGTN19OIe@Dce?oy)CP}1%)C}?f5X{qTegjQwOpZ}l0^uat*XB(8WCi|>F{;~kP z2Ob^q#N1voO)M6IB79wz=QW=Pdx@VVa2`EN_%4lb;)t%hiFwr31gvyw{LzdHl*DmA zA}eZ()FYp=AzY_QD&n(EHai_FmtHN0WN6T=b!d$Wsk@+1g;e-?i%gAX?kAsD`7c*? zi%P52BGQL0Bk5^?T@TryDx$Zal45q2D$tjzwKpYi44wJGL1702S`)MA$Lp#YU1Yn; z^=cn3Uz1+N+;lZhx*NiD0>lo%AEwzW$7_@ATD4ps(q7pBV$hurx{}zn{Ri7tic2tp zo2J=nQ354ttqzEb*3NhJMaQdpuVsQ9;v1G}2s>Jcb^j4++ycn%_ms$tf@h(dZQ0V_uoW!eSyE?6k1>O#^{RYjOq?&{(*)l}fHD z-SY3MN6GD0RdyX?(SCyzN_|yd?;M4OlJ{6p<-V0)0#~mPV4g% zo6Hz(`3r`Iw0@+A9QV8<|C5CT+Aw@3>~A0-cl0o5gL8=;IcMb(FOHqFVu$*B)n$Vj zIT5RZR00G3$>OA-(M^y3$PMzYVF?NajRRQM9TK$Er|PGm`DOwOr)O!T6f6+ZbUm`o zeh4DiD|^j0zxkR*7SNu}dkb;98K{sAnZk-aY zP>R+A6F#bf!Cq24N}^>HCCDj!&2Dt^Q<;1Ar)}gVWaXXW|cI)7N&cFFnjUXefxpF zhGnCWfBw;q73JS&%iGYi>4}`B|Diz+lz-)j9je=ID_Um0AV4a%Lp%I)AUf!Cr=%8i z-S=LhMW!P)d{n)STU9brUHOyiKN_BTckEVWwM&DypBBm?JG-kJw@b^r%Nv`Y^Br>L zNjSFE10P-kg^9T5U;nzW&%j;m0#95(OE2ENWE$=AK81&nk}NYT55kGu`ubDRv~LNr*Be84H$4M}>_4>g?bWTdvZ@-l4KZvyh^Z-w zl+T|gDxm!3*9i7D%In*krR~*?-Eax9ZIX^J%%yK!c7vl!sx=Es2Ky+^&d4SRyo4bo zrG;hgK$|p?g*RB{c}hiy<>ySlq4#-V%c$2&tL5G9{?Q_->GCeWgn&2JZmg}Wwsfx8 zP|U^a9>C|}sWm1td{pPC{^1Tz;t_UOZ6@g*ra8*)6kO_d5Lv1gulBPKlUTCrtwwRGrP#(WrqfBiV3`Ebh{X{5wz zBjL7FwhZqTtVSk~Tdwc9t^lIuL~s3=`^0ZGctX6G=_wQ3B1L9}QekoAJq5_i3$fkWT@Kbt>tqDZh@u@6r>?1Sr0 zLI9c8tS2m2q?PK;<2~eUj;~zR)+i#-b+y0GyOhW*J;*>(x4t^JvZicmX%K53VzH_Z50*N zsjCVw(L5kM6 zF5#b>@~$)NZ$C9=bmV@`c=wVzpgE7K#|)nx3zNhYIVsIY<4m{3lKu_RKo>Cmo_#YO z?@<@|n(};CaoYNAj(PQtT-5(aama`KU2&C8e*4sFeR-|!(X_YfddpXKUvrRyU{zBc zs1nPd8LK;>NGN8hS<0~LvZ}g|Ps?`47DMQwo5(fVr6K%OMlF6ls+s_A|F$#*TYq`5XaneR@=b8ol8zZuLth2eo&4sMj%Uo(X} zW<-l$R1PfRzU}&Prf!;BCDY6hGuBGM@^}zc!*n^bAm@G*-RHbpX!VOqSzhkO2@HT6 z%x5zL)p0b?pFi_EUMGO@SF~{2%0D({P~*1Gj~}A;bNQ3T+fJb_m0?NO4VuUD1aD$m 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%0Ae=w96L9t@oI#^Rynjin#A`Z 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%0A|ahnYF~>aStLugMQQ*rB7KAKk~FRSSGlW} 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�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

    he8f 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

    R_6HN;$Zryx_lq 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�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

    a4R$5&-P<#}8OH9n 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 pDYVAqCz*rf7U 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 + + + + +Die Anleitung zum TOS: AESVARS + + + + + + + + + +Home +TypdefinitionenTypdefinitionen +TypdefinitionenTypdefinitionen +Archivheader (ARHEADER)Archivheader (ARHEADER) + +


    + +

    I.1 AESVARS

    +
    typedef struct
    +{
    +     int32_t magic;                 /* muß $87654321 sein         */
    +     void *membot;                  /* Ende der AES- Variablen    */
    +     void *aes_start;               /* Startadresse               */
    +     int32_t magic2;                /* ist 'MAGX' oder 'KAOS'     */
    +     int32_t date;                  /* Erstelldatum               */
    +     void (*chgres)(int16_t res, int16_t txt);  /* Auflösung ändern    */
    +     int32_t (**shel_vector)(void); /* residentes Desktop         */
    +     int8_t *aes_bootdrv;           /* von hieraus wurde gebootet */
    +     int16_t *vdi_device;           /* vom AES benutzter Treiber  */
    +     void *reservd1;                /* reserviert                 */
    +     void *reservd2;                /* reserviert                 */
    +     void *reservd3;                /* reserviert                 */
    +     int16_t version;               /* Version ($0201 ist V2.1)   */
    +     int16_t release;               /* 0=alpha..3=release         */
    +} AESVARS;
    +
    +

    Hinweis: Diese Variablen sind READ-ONLY! +

    +

    Die ersten drei Variablen sind auch unter TOS vorhanden, und +können dort über den Betriebssystem-Header ermittelt werden. Die +Komponente vdi_device ist ab MagiC 2.0 überflüssig, weil man +die Gerätenummer Multi-TOS kompatibel über appl_getinfo (Opcode 2) +erhält. Die Routine zum Ändern der Auflösung (chgres) +erwartet im Register d2 einen optionalen Falcon-Modus (als int16_t). +

    +

    Querverweis: Cookie von MagiC   DOMagixAESVars +

    +
    + +Home +TypdefinitionenTypdefinitionen +TypdefinitionenTypdefinitionen +Archivheader (ARHEADER)Archivheader (ARHEADER) + + diff --git a/de/ARHEADER.html b/de/ARHEADER.html new file mode 100644 index 000000000..f1b9a19c7 --- /dev/null +++ b/de/ARHEADER.html @@ -0,0 +1,53 @@ + + + + + +Die Anleitung zum TOS: Archivheader (ARHEADER) + + + + + + + + + +Home +TypdefinitionenTypdefinitionen +AESVARSAESVARS +Buffer-Control-Block (BCB)Buffer-Control-Block (BCB) + +
    + +

    I.2 Archivheader (ARHEADER)

    + +
    typedef struct
    +{
    +  int8_t  a_fname[14];  /* Dateiname                 */
    +  int32_t a_modti;      /* Zeitpunkt letzter Zugriff */
    +  int8_t  a_userid;     /* unbenutzt                 */
    +  int8_t  a_gid;        /* unbenutzt                 */
    +  int16_t a_fimode;     /* Filemodus                 */
    +  int32_t a_fsize;      /* Dateilänge                */
    +  int16_t reserved;     /* reserviert                */
    +} ARHEADER;
    +
    +

    Hinweis: Eine Archivdatei im +Digital-Research-Format besteht aus einem Dateikopf, beliebig +vielen Dateien (jeweils durch eine ARHEADER-Struktur eingeleitet) +sowie einer Ende-Kennung. Der Dateikopf besteht dabei lediglich aus +dem Wort 0xff65, das Ende der Archivdatei wird durch den Wert 0x0000 +gekennzeichnet. +

    +

    Querverweis: OHEADER +

    +
    + +Home +TypdefinitionenTypdefinitionen +AESVARSAESVARS +Buffer-Control-Block (BCB)Buffer-Control-Block (BCB) + + diff --git a/de/About_the_BIOS.html b/de/About_the_BIOS.html new file mode 100644 index 000000000..591c94c47 --- /dev/null +++ b/de/About_the_BIOS.html @@ -0,0 +1,1351 @@ + + + + + +Die Anleitung zum TOS: Das BIOS + + + + + + + + + +Home +BIOSBIOS +BIOSBIOS +Die Ein-/Ausgabekanäle des BIOSDie Ein-/Ausgabekanäle des BIOS + +
    + +

    3.1 Das BIOS

    + +

    Die BIOS-Funktionen stellen die unterste Schnittstelle des +Betriebssystems zur Hardware des Atari dar, und werden über den +680X0-Trap#13 aufgerufen. Diese Funktionen sollten möglichst nicht +von Applikationsprogrammen verwendet werden, da wesentlich +leistungsfähigere Funktionen auf höherer Ebene als bessere +Alternative verfügbar sind. Insgesamt sind die folgenden Funktionen +verfügbar: +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Bconin Zeichen von Eingabegerät einlesen. +
    Bconout Zeichen auf Ausgabegerät ausgeben. +
    Bconstat Status eines Eingabegeräts ermitteln. +
    Bcostat Status eines Ausgabegeräts ermitteln. +
    Drvmap Angeschlossene Laufwerke ermitteln. +
    Getbpb BIOS-Parameterblock eines Geräts ermitteln. +
    Getmpb Speicherparameterblock ermitteln. +
    Kbshift Tastaturstatus ermitteln. +
    Mediach Ermitteln, ob die Diskette gewechselt wurde. +
    Rwabs Sektoren auf Laufwerken lesen und schreiben. +
    Setexc Exceptionvektoren ermitteln und festlegen. +
    Tickcal Timer-Konstante ermitteln. + +
    + +

    Das BIOS ist in MagiC reentrant. Das heißt, diese Funktionen +können (solange der jeweilge Supervisorstack nicht überläuft...) +auch aus Interrupts mehrfach aufgerufen werden. +

    +

    Hinweis: +

    +
      +
    • Die <saveptr_area> des BIOS ist (aus +Kompatiblitätsgründen) noch vorhanden, wird jedoch vom System nicht +benutzt. +
        +

    • +
    • Die Stacküberprüfung von Turbo C/Pure-C wird bei Routinen +versagen, die im Supervisor-Modus ausgeführt werden (unter TOS konnte +das bisher nur bei USERDEF-Routinen im AES, die ebenfalls im +Supervisor-Modus ausgeführt werden, passieren). +
        +

    • +
    + +

    Falls Sie eigene Routinen ins BIOS hängen, dann achten Sie +darauf, diese voll reentrant zu gestalten. Machen Sie keine Annahmen +über den Inhalt der <saveptr_area> ! +

    + + +

    Das BIOS nimmt seine Parameter auf dem Stack entgegen; dabei +wird das letzte Argument aus der Parameterliste als erstes auf dem +Stack abgelegt. Funktionsergebnisse werden im Prozessorregister d0 +zurückgeliefert. Nur die Register d3-d7 und a3-a7 werden gerettet, +alle anderen können durch den Aufruf verändert werden. +

    +

    Querverweis: GEMDOS   XBIOS   Reset-Vektor   VT-52-Terminal +

    +

    3.1.1 bios-Trap

    + + + + + + + + + + + + + + + + +
    Name: »bios« - Bios-Trap ausführen. +
      +
    Deklaration: LONG bios ( VOID, ... ); +
      +
    Beschreibung: Die Routine bios führt einen TRAP #13 durch. Die übergebenen +Parameter hängen von der jeweiligen BIOS- Funktion ab. +
      +
    Ergebnis: Die Funktion liefert als Ergebnis einen Wert vom Datentyp LONG. +
      +
    Querverweis: gemdos   xbios   BIOS   Dispatcher +
      + +
    + +

    3.1.2 Bconin

    + + + + + + + + + + + + + + + + + + + + + +
    Name: »Bios console input« - Zeichen einlesen. +
      +
    Biosnummer: 2 +
      +
    Deklaration: int32_t Bconin ( int16_t dev ); +
      +
    Beschreibung: Die BIOS-Routine Bconin liest ein Zeichen von einem +Peripheriegerät ein. Für dev können folgende Geräte +angegeben werden: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    devBedeutung
    0prn: (Drucker)
    1aux: (serielle Schnittstelle)
    2con: (Console)
    3MIDI-Schnittstelle
    4intelligente Tastatur
    5Bildschirm
    6ST kompatible RS232-Port (Modem 1)
    7SCC Kanal B (Modem 2)
    8TTMFP serial Port (Modem 3)
    9SCC Kanal A (Modem 4)
    +
    + +
    Dabei sind Gerätenummern ab 6 erst ab dem TOS030 des Atari-TT +verfügbar. Eine falsche Angabe für dev kann zum Absturz des +Systems führen. +
      +
    Ergebnis: Die Funktion liefert als Ergebnis das eingelesene Zeichen in +den Bits 0..7 zurück. Beim Lesen von der Console enthalten die Bits +16 bis 23 den Scancode der betreffenden Taste. Ist zusätzlich das +entsprechende Bit der Systemvariablen conterm gesetzt, so befindet +sich in den Bits 24 bis 31 der aktuelle Wert von Kbshift. +
      +
    Verfügbar: In allen TOS Versionen. +
      +
    Querverweis: Binding   Bconout   Keytbl   Bconmap +
      + +
    + +

    3.1.2.1 Bindings für Bconin

    + + + + + + +
    C: int32_t Bconin ( int16_t dev ); +
      +
    Assembler: +
      +
    move.w    dev,-(sp)    ; Offset 2
    +move.w    #2,-(sp)     ; Offset 0
    +trap      #13          ; BIOS aufrufen
    +addq.l    #4,sp        ; Stack korrigieren
    +
    + +
    + +

    3.1.3 Bconout

    + + + + + + + + + + + + + + + + + + + + + +
    Name: »Bios console output« - Zeichen ausgeben. +
      +
    Biosnummer: 3 +
      +
    Deklaration: VOID Bconout ( int16_t dev, int16_t c ); +
      +
    Beschreibung: Die BIOS-Routine Bconout schreibt das Zeichen c auf das +Peripheriegerät dev. Als dev können folgende Geräte +angegeben werden: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    devBedeutung
    0prn: (Drucker)
    1aux: (serielle Schnittstelle)
    2con: (Console, VT-52-Terminal)
    3MIDI-Schnittstelle
    4intelligente Tastatur
    5Bildschirm
    6ST kompatible RS232-Port (Modem 1)
    7SCC Kanal B (Modem 2)
    8TTMFP serial Port (Modem 3)
    9SCC Kanal A (Modem 4)
    +
    + +
    Dabei sind Gerätenummern ab 6 erst ab dem TOS030 des Atari-TT +verfügbar. +
      +
    Hinweis: Die Funktion kehrt erst dann zurück, wenn das +Zeichen tatsächlich auf dem jeweiligen Gerät ausgegeben wurde. Eine +falsche Angabe für dev kann zum Absturz des Systems führen. +Sämtliche Codes von 0x00 bis 0xFF werden beim Zeichen c als +druckbare Zeichen interpretiert. Die Ausgabe über (5) ist übrigens +schneller als die über (2), da die VT-52 Sequenzen nicht ausgewertet +werden müssen. +
      +
    Ergebnis: Die Funktion liefert kein Ergebnis. +
      +
    Verfügbar: In allen TOS Versionen. +
      +
    Querverweis: Binding   Bconin   Bconstat   Bconmap +
      + +
    + +

    3.1.3.1 Bindings für Bconout

    + + + + + + +
    C: VOID Bconout ( int16_t dev, int16_t c ); +
      +
    Assembler: +
      +
    move.w    c,-(sp)      ; Offset 4
    +move.w    dev,-(sp)    ; Offset 2
    +move.w    #3,-(sp)     ; Offset 0
    +trap      #13          ; BIOS aufrufen
    +addq.l    #6,sp        ; Stack korrigieren
    +
    + +
    + +

    3.1.4 Bconstat

    + + + + + + + + + + + + + + + + + + + + + +
    Name: »Bios console status« - Eingabestatus eines +Peripheriegerätes ermitteln. +
      +
    Biosnummer: 1 +
      +
    Deklaration: int16_t Bconstat ( int16_t dev ); +
      +
    Beschreibung: Die BIOS-Routine Bconstat ermittelt den Eingabestatus eines +Standardperipheriegerätes dev. Als dev können folgende +Geräte angegeben werden: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    devBedeutung
    0prn: (Drucker)
    1aux: (serielle Schnittstelle)
    2con: (Console)
    3MIDI-Schnittstelle
    4intelligente Tastatur
    5Bildschirm
    6ST kompatible RS232-Port (Modem 1)
    7SCC Kanal B (Modem 2)
    8TTMFP serial Port (Modem 3)
    9SCC Kanal A (Modem 4)
    +
    + +
    Dabei sind Gerätenummern ab 6 erst ab dem TOS030 des Atari-TT +verfügbar. Eine falsche Angabe für dev kann zum Absturz des +Systems führen. +
      +
    Ergebnis: Die Funktion liefert als Ergebnis -1, wenn Zeichen im Puffer +liegen und 0, wenn dies nicht der Fall ist. +
      +
    Verfügbar: In allen TOS Versionen. +
      +
    Querverweis: Binding   Bconin   Bconout   Bconmap +
      + +
    + +

    3.1.4.1 Bindings für Bconstat

    + + + + + + +
    C: int16_t Bconstat ( int16_t dev ); +
      +
    Assembler: +
      +
    move.w    dev,-(sp)    ; Offset 2
    +move.w    #1,-(sp)     ; Offset 0
    +trap      #13          ; BIOS aufrufen
    +addq.l    #4,sp        ; Stack korrigieren
    +
    + +
    + +

    3.1.5 Bcostat

    + + + + + + + + + + + + + + + + + + + + + +
    Name: »Bios output status« - Status eines Standardausgabegerätes +ermitteln. +
      +
    Biosnummer: 8 +
      +
    Deklaration: int32_t Bcostat ( int16_t dev ); +
      +
    Beschreibung: Die BIOS-Routine Bcostat ermittelt den Status eines +Standardausgabegerätes dev. Als dev können am Atari folgende +Geräte angegeben werden. +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    devBedeutung
    0prn: (Drucker)
    1aux: (serielle Schnittstelle)
    2con: (Console)
    3intelligente Tastatur
    4MIDI-Schnittstelle
    5Bildschirm
    6ST kompatible RS232-Port (Modem 1)
    7SCC Kanal B (Modem 2)
    8TTMFP serial Port (Modem 3)
    9SCC Kanal A (Modem 4)
    +
    + +
    Dabei sind Gerätenummern ab 6 erst ab dem TOS030 des Atari-TT +verfügbar. +
      +
    Hinweis: Die Vertauschung der MIDI-Schnittstelle und der +intelligenten Tastatur gegenüber den anderen BIOS-Funktionen wird +lt. Atari aus Kompatibilitätsgründen beibehalten. +
      +
    Ergebnis: Die Funktion liefert als Ergebnis den Status des +Ausgabegeräts, nämlich -1, wenn Zeichen geschrieben werden können, +und 0, wenn der Puffer voll ist. +
      +
    Verfügbar: In allen TOS Versionen. +
      +
    Querverweis: Binding   Bconout   Bconmap +
      + +
    + +

    3.1.5.1 Bindings für Bcostat

    + + + + + + +
    C: int32_t Bcostat ( int16_t dev ); +
      +
    Assembler: +
      +
    move.w    dev,-(sp)    ; Offset 2
    +move.w    #8,-(sp)     ; Offset 0
    +trap      #13          ; BIOS aufrufen
    +addq.l    #4,sp        ; Stack korrigieren
    +
    + +
    + +

    3.1.6 Drvmap

    + + + + + + + + + + + + + + + + + + + + + +
    Name: »drive map« - ermittelt die angeschlossenen Laufwerke. +
      +
    Biosnummer: 10 +
      +
    Deklaration: int32_t Drvmap ( VOID ); +
      +
    Beschreibung: Die BIOS-Routine Drvmap ermittelt die angeschlossenen +Laufwerke. Für jedes angeschlossene Laufwerk wird ein Bit gesetzt. Es +gilt: +
      + + + + + + +
    Bit 0: Laufwerk A +
    Bit 1: Laufwerk B usw. (maximal 32 Geräte möglich) + +
    + +
    Hinweis: Die Funktion liefert den Inhalt der +Systemvariablen _drvbits zurück. Um festzustellen, welche Laufwerke +dem GEMDOS bekannt sind, muß die Funktion Dsetdrv benutzt werden. +
      +
    Ergebnis: Die Funktion liefert als Ergebnis einen Bitvektor für die +angeschlossenen Laufwerke. +
      +
    Verfügbar: In allen TOS Versionen. +
      +
    Querverweis: Binding   Dsetdrv +
      + +
    + +

    3.1.6.1 Bindings für Drvmap

    + + + + + + + + + +
    C: int32_t Drvmap ( VOID ); +
      +
    Assembler: +
      +
    move.w    #$A,-(sp)     ; Offset 0
    +trap      #13           ; BIOS aufrufen
    +addq.l    #2,sp         ; Stack korrigieren
    +
    +
    GFA-Basic: Fehler%=Bios(10) +
      + +
    + +

    3.1.7 Getbpb

    + + + + + + + + + + + + + + + + + + + + + +
    Name: »Get Bios parameter block« - Bios-Parameterblock eines +Gerätes ermitteln. +
      +
    Biosnummer: 7 +
      +
    Deklaration: BPB *Getbpb ( int16_t dev ); +
      +
    Beschreibung: Die BIOS-Routine Getbpb ermittelt den BIOS-Parameterblock des +Geräts dev, das wie folgt codiert wird: +
      +

    +
    + + + + + + + + + + + + + + + + +
    devBedeutung
    0Laufwerk A
    1Laufwerk B
    2Laufwerk C
    +
    + +
    Die weiteren Laufwerke ergeben sich analog. Durch den Aufruf +dieser Funktion wird der Mediachange-Status im BIOS zurückgesetzt. +
      +
    Ergebnis: Die Funktion liefert als Ergebnis die Adresse des +BIOS-Parameterblocks. +
      +
    Verfügbar: In allen TOS Versionen. +
      +
    Querverweis: Binding   Getmpb +
      + +
    + +

    3.1.7.1 Bindings für Getbpb

    + + + + + + + + + +
    C: BPB *Getbpb ( int16_t dev ); +
      +
    Assembler: +
      +
    move.w    dev,-(sp)    ; Offset 2
    +move.w    #7,-(sp)     ; Offset 0
    +trap      #13          ; BIOS aufrufen
    +addq.l    #4,sp        ; Stack korrigieren
    +
    +
    GFA-Basic: Fehler%=Bios(7,W:dev%) +
      + +
    + +

    3.1.8 Getmpb

    + + + + + + + + + + + + + + + + + + + + + +
    Name: »Get memory parameter block« - Speicherparameter-Block +kopieren. +
      +
    Biosnummer: 0 +
      +
    Binding: VOID Getmpb ( MPB *ptr ); +
      +
    Beschreibung: Die BIOS-Routine Getmpb dient zur Initialisierung der +Speicherverwaltung und wird beim Systemstart vom GEMDOS aufgerufen, um +die Ursprungs-TPA zu erzeugen. Danach darf Getmbp nicht mehr +benutzt werden. +
      +
    Ergebnis: Die Funktion liefert kein Ergebnis. +
      +
    Verfügbar: In allen TOS Versionen. +
      +
    Querverweis: Binding   Getbpb   Programmstart und TPA +
      + +
    + +

    3.1.8.1 Bindings für Getmpb

    + + + + + + +
    C: VOID Getmpb ( MPB *ptr ); +
      +
    Assembler: +
      +
    pea       ptr          ; Offset 2
    +move.w    #0,-(sp)     ; Offset 0
    +trap      #13          ; BIOS aufrufen
    +addq.l    #6,sp        ; Stack korrigieren
    +
    + +
    + +

    3.1.9 Kbshift

    + + + + + + + + + + + + + + + + + + + + + +
    Name: »keyboard shift status« - ermittelt oder ändert den Status +der Spezial-Tasten. +
      +
    Biosnummer: 11 +
      +
    Deklaration: int32_t Kbshift ( int16_t mode ); +
      +
    Description: Die BIOS-Routine Kbshift ermittelt oder ändert den aktuellen +Tastatur-Status. Wenn mode negativ ist, wird der Status +lediglich ermittelt. Wenn mode 0 oder größer 0 ist, dann +wird der entsprechende Status neu gesetzt. Die einzelnen Bits sind wie +folgt definiert: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    BitBedeutung
    0Shift-Taste rechts
    1Shift-Taste links
    2Control-Taste
    3Alternate-Taste
    4Caps Lock
    5Maustaste rechts
    6Maustaste links
    7Alt Gr ab TOS 4.06 im Milan
    +
    + +
    Hinweis: Die Funktion fragt lediglich eine interne +Systemvariable des BIOS ab, deren Adresse ggfs. per _sysbase +berechnet werden kann. +
    Bei TOS 1.0 befindet sich diese Systemvaribale an der Adresse +0xE1B. +
      +
    Ergebnis: Die Funktion liefert als Ergebnis den gesetzten +Tastatur-Status. +
      +
    Verfügbar: In allen TOS Versionen. +
      +
    Querverweis: Binding +
      + +
    + +

    3.1.10 Bindings für Kbshift

    + + + + + + +
    C: int32_t Kbshift ( int16_t mode ); +
      +
    Assembler: +
      +
    move.w    mode,-(sp)   ; Offset 2
    +move.w    #$B,-(sp)    ; Offset 0
    +trap      #13          ; BIOS aufrufen
    +addq.l    #4,sp        ; Stack korrigieren
    +
    + +
    + +

    3.1.11 Mediach

    + + + + + + + + + + + + + + + + + + + + + +
    Name: »media change« - stellt fest ob der Datenträger gewechselt +wurde. +
      +
    Biosnummer: 9 +
      +
    Deklaration: int32_t Mediach ( int16_t dev ); +
      +
    Beschreibung: Die BIOS-Routine Mediach stellt fest, ob der Datenträger auf +dem Gerät dev gewechselt wurde. Es gilt: +
      +

    +
    + + + + + + + + + + + + + + + +
    dev= 0(Laufwerk-A)
     = 1(Laufwerk-B)
     = 2(Laufwerk-C, weitere Laufwerke analog)
    +
    + +
    Hinweis: Man sollte niemals davon ausgehen, daß ein +Gerät nicht gewechselt werden kann (Wechselplatte, CD-ROM, +Diskettenlaufwerk, ...). Die Erkennung eines Diskettenwechsels +funktioniert i.a. nur dann zuverlässig, wenn die Diskette nicht +schreibgeschützt ist. Außerdem sollte darauf geachtet werden, daß +beim Formatieren einer Diskette unterschiedliche Seriennummern +vergeben werden. +
      +
    Ergebnis: Die Funktion liefert als Ergebnis einen Integer-Wert mit +folgender Bedeutung: +
      +

    +
    + + + + + + + + + + + + + + + + +
    WertBedeutung
    0Diskette wurde nicht gewechselt.
    1Diskette wurde vielleicht gewechselt.
    2Diskette wurde gewechselt.
    +
    + +
    Verfügbar: In allen TOS Versionen. +
      +
    Querverweis: Binding   Flopfmt   Protobt +
      + +
    + +

    3.1.11.1 Bindings für Mediach

    + + + + + + + + + +
    C: int32_t Mediach ( int16_t dev ); +
      +
    Assembler: +
      +
    move.w    dev,-(sp)    ; Offset 2
    +move.w    #9,-(sp)     ; Offset 0
    +trap      #13          ; BIOS aufrufen
    +addq.l    #4,sp        ; Stack korrigieren
    +
    +
    GFA-Basic: Fehler%=Bios(9,W:dev%) +
      + +
    + +

    3.1.12 Rwabs

    + + + + + + + + + + + + + + + + + + + + + +
    Name: »read write absolute« - direkter Lese-/Schreibzugriff auf ein +Laufwerk. +
      +
    Biosnummer: 4 +
      +
    Deklaration: int32_t Rwabs ( int16_t rwflag, VOID *buff, int16_t cnt, +int16_t recnr, int16_t dev, int32_t lrecno ); +
      +
    Beschreibung: Die BIOS-Routine Rwabs liest oder schreibt Daten direkt vom +bzw. auf das Laufwerk, das mit dev angegeben wurde. Der +Parameter rwflag ist ein Bitvektor, der die Art der Operation +festlegt. Es gilt: +
      + + + + + + + + + + + + + + + +
    rwflag-Bit Bedeutung +
      +
    0 0 = Lesen +
    1 = Schreiben +
      +
    1 0 = Medienwechsel beachten +
    1 = Medienwechsel ignorieren +
      +
    2 0 = Im Fehlerfall eine Wiederholung starten +
    1 = keine Wiederholung starten. +
    Hierzu ist ein Festplattentreiber notwendig, der zu AHDI 3.0 +kompatibel ist. +
      +
    3 0 = Normalmodus +
    1 = physikalischer Modus (1) +
    Hierzu ist ein Festplattentreiber notwendig, der zu AHDI 3.0 +kompatibel ist. +
      + +
    + +
    Es werden cnt Sektoren vom Puffer buff +übertragen. In recnr wird der Startsektor auf dem Laufwerk angegeben. +lrecno wird nur benutzt, wenn recnr den Wert -1 +besitzt, und ein AHDI3.0 kompatibler Festplattentreiber zur Verfügung steht. +
      +
    Ergebnis: Die Funktion liefert als Ergebnis eine 0, wenn der Zugriff +erfolgreich war, ansonsten eine negative Zahl. +
      +
    Verfügbar: In allen TOS Versionen. +
      +
    Querverweis: Binding +
      + +
    + +

    3.1.12.1 Bindings für Rwabs

    + + + + + + + + + +
    C: int32_t Rwabs ( int16_t rwflag, VOID *buff, int16_t cnt, +int16_t recnr, int16_t dev, int32_t lrecno ); +
      +
    Assembler: +
      +
    move.l    lrecno,-(sp)  ; Offset 14
    +move.w    dev,-(sp)     ; Offset 12
    +move.w    recnr,-(sp)   ; Offset 10
    +move.w    cnt,-(sp)     ; Offset  8
    +pea       buff          ; Offset  4
    +move.w    rwflag,-(sp)  ; Offset  2
    +move.w    #4,-(sp)      ; Offset  0
    +trap      #13           ; BIOS aufrufen
    +lea       $12(sp),sp    ; Stack korrigieren
    +
    +
    GFA-Basic: +Fehler%=Bios(4,W:rwflag%,L:buff%,W:cnt%,W:recnr%,W:dev%,L:lrecno%) +
      + +
    + +

    3.1.13 Setexc

    + + + + + + + + + + + + + + + + + + + + + +
    Name: »set exception vector« - Interrupt-Vektoren setzen. +
      +
    Biosnummer: 5 +
      +
    Deklaration: int32_t Setexc ( int16_t number, VOID (*vec)() ); +
      +
    Beschreibung: Die BIOS-Routine Setexc setzt oder liest die Inhalte von +Exception-Vektoren. Es gilt: +
      +

    +
    + + + + + + + + + + + + +
    ParameterBedeutung
    numberNummer des Exception-Vektors
    vecneue Adresse (oder -1)
    +
    + +
    Hinweis: Besitzt der Parameter vec den Wert -1 +so wird kein neuer Vektor gesetzt, sondern lediglich die alte +Vektoradresse ausgelesen. +
      +
    Die Nummer des zu setzenden Exception-Vektors ist übrigens +identisch mit der zu setzenden Adresse, dividiert durch den Wert 4. +
      +
    Ergebnis: Die Funktion liefert den bisherigen (bzw. aktuellen) Wert des +Vektors zurück. +
      +
    Verfügbar: In allen TOS Versionen. +
      +
    Querverweis: Binding   Systemvariablen   Systemvektoren +
      + +
    + +

    3.1.13.1 Bindings für Setexc

    + + + + + + +
    C: int32_t Setexc ( int16_t number, VOID (*vec)() ); +
      +
    Assembler: +
      +
    pea       exchdlr      ; Offset 4
    +move.w    number,-(sp) ; Offset 2
    +move.w    #5,-(sp)     ; Offset 0
    +trap      #13          ; BIOS aufrufen
    +addq.l    #8,sp        ; Stack korrigieren
    +
    + +
    + +

    3.1.14 Tickcal

    + + + + + + + + + + + + + + + + + + + + + +
    Name: »tick calculation« - Zeitdifferenz zwischen zwei +Timeraufrufen ermitteln. +
      +
    Biosnummer: 6 +
      +
    Deklaration: int32_t Tickcal ( void ); +
      +
    Beschreibung: Die BIOS-Routine Tickcal liefert die Anzahl an Millisekunden, +die zwischen zwei Aufrufen des Systemtimers verstreichen. +
      +
    Hinweis: Die Funktion greift dazu auf die _timr_ms +Systemvariable zurück. +
      +
    Ergebnis: Anzahl der entsprechenden Millisekunden. +
      +
    Verfügbar: In allen TOS Versionen. +
      +
    Querverweis: Binding   Systemvariablen +
      + +
    + +

    3.1.14.1 Bindings für Tickcal

    + + + + + + +
    C: LONG Tickcal ( VOID ); +
      +
    Assembler: +
      +
    move.w    #6,-(sp)     ; Offset 0
    +trap      #13          ; BIOS aufrufen
    +addq.l    #2,sp        ; Stack korrigieren
    +
    + +
    + +
    + +Home +BIOSBIOS +BIOSBIOS +Die Ein-/Ausgabekanäle des BIOSDie Ein-/Ausgabekanäle des BIOS + + diff --git a/de/About_the_VDI.html b/de/About_the_VDI.html new file mode 100644 index 000000000..c60e0d07e --- /dev/null +++ b/de/About_the_VDI.html @@ -0,0 +1,75 @@ + + + + + +Die Anleitung zum TOS: Das VDI + + + + + + + + + +Home +VDIVDI +VDIVDI +Grundlagen des VDIGrundlagen des VDI + +
    + +

    7.1 Das VDI

    +

    Das VDI (Virtual Device Interface) ist ein Teil von GEM, und +in erster Linie als standardisiertes Grafiksystem zu verstehen. Aus +Sicht des Programmierers stellt sich das VDI als eine sehr +umfangreiche Grafikbibliothek dar, deren Ausgabeformat über mehrere +Plattformen hinweg portabel ist. Das VDI kann in die folgenden +Funktionsgruppen unterteilt werden: +

    + + +

    Da das Original-VDI im TOS des Atari mit einigen Schwächen +behaftet, und vor allem nicht besonders schnell ist, hat sich NVDI bei +vielen Benutzern als der Ersatz für das normale VDI +erwiesen. +

    +

    Einige der Funktionen des VDI benötigen die Erweiterung +GDOS, das ursprünglich als Teil des Betriebssystems mitgeliefert +werden sollte, aufgrund von Speicherplatzproblemen in den ROM's der +ersten ST's von Atari jedoch ausgelagert wurde. Durch konsequente +Nutzung der VDI Routinen kann jeder Programmierer dafür sorgen, +daß seine Programme sauber auf unterschiedlichen Rechnern und in +nahezu beliebigen Auflösungen arbeiten. +

    +

    Querverweis: Grundlagen des VDI   Bindings des VDI   AES +

    +
    + +Home +VDIVDI +VDIVDI +Grundlagen des VDIGrundlagen des VDI + + diff --git a/de/BCB.html b/de/BCB.html new file mode 100644 index 000000000..669f71964 --- /dev/null +++ b/de/BCB.html @@ -0,0 +1,41 @@ + + + + + +Die Anleitung zum TOS: Buffer-Control-Block (BCB) + + + + + + + + + +Home +TypdefinitionenTypdefinitionen +Archivheader (ARHEADER)Archivheader (ARHEADER) +CPXINFOCPXINFO + +
    + +

    I.3 Buffer-Control-Block (BCB)

    + +
    typedef struct _bcb
    +{
    +  struct _bcb   *b_link;          /* nächster BCB          */
    +  int16_t       b_negl;           /* auf -1 initialisieren */
    +  int16_t       b_private[5];     /* unbekannt             */
    +  void          *b_buf;           /* eigentlicher Puffer   */
    +} BCB;
    +
    +
    + +Home +TypdefinitionenTypdefinitionen +Archivheader (ARHEADER)Archivheader (ARHEADER) +CPXINFOCPXINFO + + diff --git a/de/BSIM-BIOS-Extension.html b/de/BSIM-BIOS-Extension.html new file mode 100644 index 000000000..f12de2092 --- /dev/null +++ b/de/BSIM-BIOS-Extension.html @@ -0,0 +1,635 @@ + + + + + +Die Anleitung zum TOS: BSIM-BIOS-Erweiterungen + + + + + + + + + +Home +BIOSBIOS +XBRA-VerfahrenXBRA-Verfahren +BIOS-FunktionslisteBIOS-Funktionsliste + +
    + +

    3.10 BSIM-BIOS-Erweiterungen

    + +

    Die Grundidee des Drive-B-Simulator war, eine Diskette in den +Speicher einzulesen und als RAM-Disk zu betreiben. Die Funktion +'Diskette schreiben' schreibt die RAM-Disk auf eine Diskette zurück. +Mit der Einführung des 'Swap-Modus' arbeitet das Programm auch mit +Anwendungen, die stur auf Laufwerk A zugreifen. +

    + + + + + + + + + + + + + + + + + + + + + +
    bsim_id Ermittelt, ob BSIM verfügbar ist +
    drv_change Tauscht Laufwerke +
    drvprotec Schützt Laufwerke +
    dstate Get details about the drive +
    kill_disk Löscht Diskette +
    load_disk Lädt eine Diskette in den Speicher +
    save_disk Schreibt Diskette. + +
    + +

    Note: Drive-B-Simulator uses the same XBRA ID as BlitSim +('BSIM'). +

    +

    Configuration file: +

    +

    The config file BSTAT.INF is an array of 18 bytes. The following +apply: +

    + + + + + + + + + + + + +
    Offset Meaning +
    0..15 Write lock status (0 or 1) for each drive, from byte 0=A to +byte 15=P +
    16 Load disk at startup (0 or 1) +
    17 Swap drives at startup (0 or 1) + +
    + +

    Warning Calls to this BIOS extension must be avoided +because Drive-B-Simulator uses undocumented TOS features and +hard-coded addresses which prevent it from working under EmuTOS. +

    +

    Vorgestellt in der deutsche Zeitschrift TOS 3/1992. +

    +

    3.10.1 bsim_id

    + + + + + + + + + + + + + + + + + + + + + +
    Name: »BSIM id« - ermittelt, ob BSIM verfügbar ist. +
      +
    Biosnummer: 300 (0x012c) +
      +
    Deklaration: Bindings für bsim_id +
      +
    Beschreibung: Die Funktion ermittelt die BSIM id. +
      +
    Ergebnis: Wenn BSIM installiert ist, gibt die Funktion 0x4253494D +('BSIM') zurück. +
      +
    Verfügbar: Drive-B-Simulator. +
      +
    Querverweis: Binding +
      + +
    + +

    3.10.1.1 Bindings für bsim_id

    + + + + + + +
    Assembler: +
      +
    move.w    #$12C,-(sp)   ; Offset 0
    +trap      #13           ; BIOS aufrufen
    +addq.l    #2,sp         ; Stack korrigieren
    +
    +
    GFA-Basic: Fehler%=Bios(300) +
      + +
    + +

    3.10.2 drv_change

    + + + + + + + + + + + + + + + + + + + + + +
    Name: »Drive change« - tauscht Drives. +
      +
    Biosnummer: 304 (0x0130) +
      +
    Deklaration: Bindings für drv_change +
      +
    Beschreibung: Die Funktion tauscht Drives. Für data gilt: +
      + + + + + + + + + +
    0: Normal +
    1: Tauschen +
    -1: Status holen + +
    + +
    Ergebnis: Die Funktion kann folgende Rückgabewerte liefern in D0: +
      + + + + + + +
    0: Normal +
    1: Tauschen + +
    + +
    Verfügbar: Drive-B-Simulator. +
      +
    Querverweis: Binding +
      + +
    + +

    3.10.2.1 Bindings für drv_change

    + + + + + + +
    Assembler: +
      +
    move.w    #data,-(sp)   ; Offset 2
    +move.w    #$130,-(sp)   ; Offset 0
    +trap      #13           ; BIOS aufrufen
    +addq.l    #4,sp         ; Stack korrigieren
    +
    +
    GFA-Basic: Fehler%=Bios(304,W:data%) +
      + +
    + +

    3.10.3 drvprotec

    + + + + + + + + + + + + + + + + + + + + + +
    Name: »Drive protection« - schützt Laufwerke. +
      +
    Biosnummer: 305 (0x0131) +
      +
    Deklaration: Bindings für drvprotec +
      +
    Beschreibung: Die Funktion schützt Laufwerke. ptrdrv ist ein +Bitvektor für geschützte Laufwerke (Bit 0=A, Bit 1=B...), oder -1 +(Status holen). +
      +
    Ergebnis: Die Funktion liefert als Ergebnis einen Bitvektor für die +geschützte Laufwerke. +
      +
    Verfügbar: Drive-B-Simulator. +
      +
    Querverweis: Binding +
      + +
    + +

    3.10.3.1 Bindings für drvprotec

    + + + + + + +
    Assembler: +
      +
    move.l    #ptrdrv,-(sp) ; Offset 2
    +move.w    #$131,-(sp)   ; Offset 0
    +trap      #13           ; BIOS aufrufen
    +addq.l    #6,sp         ; Stack korrigieren
    +
    +
    GFA-Basic: Fehler%=Bios(305,L:prtdrv%) +
      + +
    + +

    3.10.4 dstate

    + + + + + + + + + + + + + + + + + + + + + +
    Name: »Drive status« - Get RAM-disk details. +
      +
    Biosnummer: 306 (0x0132) +
      +
    Deklaration: Bindings für dstate +
      +
    Beschreibung: Die Funktion ermittelt den Deskriptorfeld für die RAM-Disk. +Der pointer zeigt auf Deskriptorfeld. +
      + + + + + + + + + + + + + + + + + + + + + +
    Offset Beschreibung +
        +
    0 (long) Startadresse der Disk im Speicher +
    4 (long) Länge der Disk +
    8 (short) Seiten (der eingelesenen Disk) +
    10 (short) Tracks +
    12 (short) Sektoren + +
    + +
    Ergebnis: Die Funktion kann folgende Rückgabewerte liefern in D0: +
      + + + + + + +
    E_OK: OK +
    -1: Keine Disk im Speicher + +
    + +
    Verfügbar: Drive-B-Simulator. +
      +
    Querverweis: Binding +
      + +
    + +

    3.10.4.1 Bindings für dstate

    + + + + + + +
    Assembler: +
      +
    pea       pointer       ; Offset 2
    +move.w    #$132,-(sp)   ; Offset 0
    +trap      #13           ; BIOS aufrufen
    +addq.l    #6,sp         ; Stack korrigieren
    +
    +
    GFA-Basic: Fehler%=Bios(306,L:pointer%) +
      + +
    + +

    3.10.5 kill_disk

    + + + + + + + + + + + + + + + + + + + + + +
    Name: »Kill disk« - löscht Diskette. +
      +
    Biosnummer: 302 (0x012e) +
      +
    Deklaration: Bindings für kill_disk +
      +
    Beschreibung: Die Funktion löscht die Diskette aus dem Speicher. +
      +
    Ergebnis: Die Funktion kann folgende Rückgabewerte liefern in D0: +
      + + + + + + +
    E_OK: Disk ist gelöscht +
    -1: Falsches Magic + +
    + +
    Verfügbar: Drive-B-Simulator. +
      +
    Querverweis: Binding +
      + +
    + +

    3.10.5.1 Bindings für kill_disk

    + + + + + + +
    Assembler: +
      +
    move.l    #magic,-(sp)  ; Offset 2, magic:$87654321
    +move.w    #$12E,-(sp)   ; Offset 0
    +trap      #13           ; BIOS aufrufen
    +addq.l    #6,sp         ; Stack korrigieren
    +
    +
    GFA-Basic: Fehler%=Bios(302,L:magic%) +
      + +
    + +

    3.10.6 load_disk

    + + + + + + + + + + + + + + + + + + + + + +
    Name: »Load disk« - lädt eine Diskette in den Speicher. +
      +
    Biosnummer: 301 (0x012d) +
      +
    Deklaration: Bindings für load_disk +
      +
    Beschreibung: Die Funktion lädt eine Diskette in den Speicher. +
      +
    Ergebnis: Die Funktion kann folgende Rückgabewerte liefern in D0: +
      + + + + + + + + + + + + + + + +
    E_OK: OK +
    -1: Zuwenig Speicher +
    -2: Bereits eine Disk im Speicher +
    -3: Disk Error +
    -4: Falsches Magic + +
    + +
    Verfügbar: Drive-B-Simulator. +
      +
    Querverweis: Binding +
      + +
    + +

    3.10.6.1 Bindings für load_disk

    + + + + + + +
    Assembler: +
      +
    move.l    #magic,-(sp)  ; Offset 2, magic:$12345678
    +move.w    #$12D,-(sp)   ; Offset 0
    +trap      #13           ; BIOS aufrufen
    +addq.l    #6,sp         ; Stack korrigieren
    +
    +
    GFA-Basic: Fehler%=Bios(301,L:magic%) +
      + +
    + +

    3.10.7 save_disk

    + + + + + + + + + + + + + + + + + + + + + +
    Name: »Save disk« - schreibt Diskette. +
      +
    Biosnummer: 303 (0x012f) +
      +
    Deklaration: Bindings für save_disk +
      +
    Beschreibung: Die Funktion schreibt den Speicher auf die Diskette. +
      +
    Ergebnis: Die Funktion kann folgende Rückgabewerte liefern in D0: +
      + + + + + + + + + + + + +
    E_OK: Alles OK +
    -1: Falsches Magic +
    -2: Keine Disk im Speicher +
    -4: Schreibfehler + +
    + +
    Verfügbar: Drive-B-Simulator. +
      +
    Querverweis: Binding +
      + +
    + +

    3.10.7.1 Bindings für save_disk

    + + + + + + +
    Assembler: +
      +
    move.l    #magic,-(sp)  ; Offset 2, magic:$ABCD0123
    +move.w    #$12F,-(sp)   ; Offset 0
    +trap      #13           ; BIOS aufrufen
    +addq.l    #6,sp         ; Stack korrigieren
    +
    +
    GFA-Basic: Fehler%=Bios(303,L:magic%) +
      + +
    + +
    + +Home +BIOSBIOS +XBRA-VerfahrenXBRA-Verfahren +BIOS-FunktionslisteBIOS-Funktionsliste + + diff --git a/de/CENTScreen_XBIOS_extension.html b/de/CENTScreen_XBIOS_extension.html new file mode 100644 index 000000000..45c9f130c --- /dev/null +++ b/de/CENTScreen_XBIOS_extension.html @@ -0,0 +1,1585 @@ + + + + + +Die Anleitung zum TOS: CENTScreen-XBIOS-Erweiterung + + + + + + + + + +Home +XBIOSXBIOS +BildschirmfunktionenBildschirmfunktionen +Crazy-Dots-XBIOS-ErweiterungCrazy-Dots-XBIOS-Erweiterung + +
    + +

    4.6 CENTScreen-XBIOS-Erweiterung

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MultiMon Multisynchro Mode +
    SetMon Monitortyp setzen +
    SizeComp Vgetsize Kompatibilität +
    Vattrib Attribute des Videomodes ändern +
    Vclose Shutdown +
    Vcreate ein Videomode hinzufügen +
    Vdelete löscht ein Videomode +
    Vfirst Sucht den ersten Videomode +
    Vload Lädt VIDEO.DAT +
    Vlock Lockt den virtuellen Bildschirm +
    Vnext Nächster Videomode +
    Voffset Position des virtuellen Bildschirms +
    Vopen Bildschirm aufwecken +
    Vread Informationen über aktuellen Videomode abfragen +
    Vsave speichert VIDEO.DAT +
    Vscroll Scrollmethode festlegen +
    Vseek setzen der Position des virtuellen Bildschirms +
    Vsize ermittelt die Größe des Bildschirms +
    Vvalid prüft einen Videomode +
    Vwrite Auflösung wechseln + +
    + +

    Hinweis: +
    Es handelt sich hierbei nicht um dokumentierte Routinen +des Betriebssystems. +

    +

    4.6.1 MultiMon

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »MultiMon« - Multisynchro Mode +
      +
    Xbiosnummer: 82 +
      +
    Deklaration: int16_t MultiMon( int16_t Cmd ); +
      +
    Beschreibung: Die Umschaltung zwischen RGB und VGA zulassen oder sperren. +
      +

    +
    + + + + + + + + + + + + + + + + +
    CmdBeschreibung
    0Umschaltung sperren.
    >0Umschaltung zulassen.
    -1aktuellen Mode abfragen.
    +
    + +
    Ergebnis: Der bisherige Mode. +
      +
    Verfügbar: CENTScreen +
      +
    Gruppe: CENTScreen-XBIOS-Erweiterung +
      +
    Querverweis: Binding +
      + +
    + +

    4.6.1.1 Bindings für MultiMon

    + + + + + + +
    C: +
      +
    int16_t MultiMon( int16_t Cmd ); +
      +
    Assembler: +
      +
    move.w    #Cmd,-(sp)  ; Offset 2
    +move.w    #82,-(sp)   ; Offset 0
    +trap      #14         ; XBIOS aufrufen
    +addq.l    #4,sp       ; Stack korrigieren
    +
    + +
    + +

    4.6.2 SetMon

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »SetMon« - Monitortyp setzen +
      +
    Xbiosnummer: 81 +
      +
    Deklaration: int16_t SetMon( int16_t MontType ); +
      +
    Beschreibung: Setzt dem Monitortyp +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    MontTypeneuer Monitortyp
    0SM124 (prähistorischer Bildschirm des ST)
    1RGB (TV ähnlicher Bildschirm, ideal um blind zu
           machen... )
    2VGA (ein richtiger Monitor zum Arbeiten!)
    3TV (schlechtes RGB, alle user sind blind...)
    +
    + +
    Ergebnis: Der Monitortyp. +
      +
    Verfügbar: CENTScreen +
      +
    Gruppe: CENTScreen-XBIOS-Erweiterung +
      +
    Querverweis: Binding +
      + +
    + +

    4.6.2.1 Bindings für SetMon

    + + + + + + +
    C: #include <tos.h> +
      +
    int16_t SetMon( int16_t MontType ); +
      +
    Assembler: +
      +
    move.w    #MontType,-(sp) ; Offset 2
    +move.w    #81,-(sp)       ; Offset 0
    +trap      #14             ; XBIOS aufrufen
    +addq.l    #4,sp           ; Stack korrigieren
    +
    + +
    + +

    4.6.3 SizeComp

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »SizeComp« - Vgetsize Kompatibilität +
      +
    Xbiosnummer: 83 +
      +
    Deklaration: int16_t SizeComp( int16_t Cmd ); +
      +
    Beschreibung: Vgetsize Kompatibilität +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    CmdBeschreibung
    0liefert die tatsächliche Größe des Originalbildschirms.
     Wenn das höchste Bit auf 1 gesetzt ist, wird die
     erweiterte Bildschirmgröße geliefert.
    >0liefert die erweiterte Größe.
    -1den aktuellen Mode abfragen.
    +
    + +
    Ergebnis: Der bisherige Mode. +
      +
    Verfügbar: CENTScreen +
      +
    Gruppe: CENTScreen-XBIOS-Erweiterung +
      +
    Querverweis: Binding +
      + +
    + +

    4.6.3.1 Bindings für SizeComp

    + + + + + + +
    C: #include <tos.h> +
      +
    int16_t SizeComp( int16_t Cmd ); +
      +
    Assembler: +
      +
    move.w    #Cmd,-(sp)  ; Offset 2
    +move.w    #83,-(sp)   ; Offset 0
    +trap      #14         ; XBIOS aufrufen
    +addq.l    #4,sp       ; Stack korrigieren
    +
    + +
    + +

    4.6.4 Vattrib

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Vattrib« - Attribute des Videomodes ändern +
      +
    Xbiosnummer: 67 +
      +
    Deklaration: void Vattrib( VDO_PARAM *InParam, VDO_PARAM *OutParam ); +
      +
    Beschreibung: Mit dieser Funktion kann der Originalmode geändert werden. +
      +
    Ergebnis: Das out-array ist voll. +
      +
    Verfügbar: CENTScreen +
      +
    Gruppe: CENTScreen-XBIOS-Erweiterung +
      +
    Querverweis: Binding +
      + +
    + +

    4.6.4.1 Bindings für Vattrib

    + + + + + + +
    C: +
      +
    void Vattrib( VDO_PARAM *InParam, VDO_PARAM *OutParam ); +
      +
    Assembler: +
      +
    move.l    #OutParam,-(sp) ; Offset 6
    +move.l    #InParam,-(sp)  ; Offset 2
    +move.w    #67,-(sp)       ; Offset 0
    +trap      #14             ; XBIOS aufrufen
    +lea       10(sp),sp       ; Stack korrigieren
    +
    + +
    + +

    4.6.5 Vclose

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Vclose« - Shutdown +
      +
    Xbiosnummer: 76 +
      +
    Deklaration: int16_t Vclose( void ); +
      +
    Beschreibung: Shutdown +
      +
    Ergebnis:  0 : kein Fehler. +
    -1 : unwahrscheinlich. +
      +
    Verfügbar: CENTScreen +
      +
    Gruppe: CENTScreen-XBIOS-Erweiterung +
      +
    Querverweis: Binding +
      + +
    + +

    4.6.5.1 Bindings für Vclose

    + + + + + + +
    C: +
      +
    int16_t Vclose( void ); +
      +
    Assembler: +
      +
    move.w    #76,-(sp)    ; Offset 0
    +trap      #14          ; XBIOS aufrufen
    +addq.l    #2,sp        ; Stack korrigieren
    +
    + +
    + +

    4.6.6 Vcreate

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Vcreate« - ein Videomode hinzufügen +
      +
    Xbiosnummer: 68 +
      +
    Deklaration: void Vcreate( VDO_PARAM *InParam, VDO_PARAM *OutParam ); +
      +
    Beschreibung: Die Funktion nimmt direkt die videl Parameter und erzeugt ein +neues Handle mit den angegebenen Parametern. +
      +
    It use by CENTvidel. +
      +
    Ergebnis: OutParam ist mit den tatsächlichen Werten gefüllt. +
      +
    Verfügbar: CENTScreen +
      +
    Gruppe: CENTScreen-XBIOS-Erweiterung +
      +
    Querverweis: Binding +
      + +
    + +

    4.6.6.1 Bindings für Vcreate

    + + + + + + +
    C: +
      +
    void Vcreate( VDO_PARAM *InParam, VDO_PARAM *OutParam ); +
      +
    Assembler: +
      +
    move.l    #OutParam,-(sp) ; Offset 6
    +move.l    #InParam,-(sp)  ; Offset 2
    +move.w    #68,-(sp)       ; Offset 0
    +trap      #14             ; XBIOS aufrufen
    +lea       10(sp),sp       ; Stack korrigieren
    +
    + +
    + +

    4.6.7 Vdelete

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Vdelete« - löscht ein Videomode +
      +
    Xbiosnummer: 69 +
      +
    Deklaration: int16_t Vdelete( int16_t Handle); +
      +
    Beschreibung: Verändert nicht die Handles, aber komprimiert die internen +Daten. Nach einer save-load Sequenz können sich die Handles ändern. +
      +
    Ergebnis:  0: kein Fehler +
    -1: ungültiges Handle +
      +
    Verfügbar: CENTScreen +
      +
    Gruppe: CENTScreen-XBIOS-Erweiterung +
      +
    Querverweis: Binding +
      + +
    + +

    4.6.7.1 Bindings für Vdelete

    + + + + + + +
    C: +
      +
    int16_t Vdelete( int16_t Handle); +
      +
    Assembler: +
      +
    move.w    #Handle,-(sp)   ; Offset 2
    +move.w    #69,-(sp)       ; Offset 0
    +trap      #14             ; XBIOS aufrufen
    +addq.l    #4,sp           ; Stack korrigieren
    +
    + +
    + +

    4.6.8 Vfirst

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Vfirst« - Sucht den ersten Videomode +
      +
    Xbiosnummer: 70 +
      +
    Deklaration: int16_t Vfirst( VDO_PARAM *Mask, VDO_PARAM *Mode ); +
      +
    Beschreibung: Sucht den ersten Videomode. +
      +
    Ergebnis:  0: das out-array ist voll +
    -1: kein Mode gefunden +
      +
    Verfügbar: CENTScreen +
      +
    Gruppe: CENTScreen-XBIOS-Erweiterung +
      +
    Querverweis: Binding +
      + +
    + +

    4.6.8.1 Bindings für Vfirst

    + + + + + + +
    C: +
      +
    int16_t Vfirst( VDO_PARAM *Mask, VDO_PARAM *Mode ); +
      +
    Assembler: +
      +
    move.l    #Mode,-(sp)    ; Offset 6
    +move.l    #Mask,-(sp)    ; Offset 2
    +move.w    #70,-(sp)      ; Offset 0
    +trap      #14            ; XBIOS aufrufen
    +lea       10(sp),sp      ; Stack korrigieren
    +
    + +
    + +

    4.6.9 Vload

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Vload« - Lädt VIDEO.DAT +
      +
    Xbiosnummer: 73 +
      +
    Deklaration: int16_t Vload( void ); +
      +
    Beschreibung: Lädt VIDEO.DAT +
      +
    Ergebnis:  0 : kein Fehler. +
    -1 : Datei nicht gefunden. +
      +
    Verfügbar: CENTScreen +
      +
    Gruppe: CENTScreen-XBIOS-Erweiterung +
      +
    Querverweis: Binding +
      + +
    + +

    4.6.9.1 Bindings für Vload

    + + + + + + +
    C: +
      +
    int16_t Vload( void ); +
      +
    Assembler: +
      +
    move.w    #73,-(sp)    ; Offset 0
    +trap      #14          ; XBIOS aufrufen
    +addq.l    #2,sp        ; Stack korrigieren
    +
    + +
    + +

    4.6.10 Vlock

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Vlock« - Lockt den virtuellen Bildschirm +
      +
    Xbiosnummer: 80 +
      +
    Deklaration: int16_t Vlock( int16_t cmd ); +
      +
    Beschreibung: Lockt den virtuellen Bildschirm +
      +

    +
    + + + + + + + + + + + + +
    cmdBeschreibung
    0Die Maus kann den virtuellen Bildschirm verschieben
    1Die Maus kann den virtuellen Bildschirm nicht verschieben
    +
    + +
    Ergebnis: Die alte Konfiguration. +
      +
    Verfügbar: CENTScreen +
      +
    Gruppe: CENTScreen-XBIOS-Erweiterung +
      +
    Querverweis: Binding +
      + +
    + +

    4.6.10.1 Bindings für Vlock

    + + + + + + +
    C: +
      +
    int16_t Vlock( int16_t cmd ); +
      +
    Assembler: +
      +
    move.w    #cmd,-(sp)   ; Offset 2
    +move.w    #80,-(sp)    ; Offset 0
    +trap      #14          ; XBIOS aufrufen
    +addq.l    #4,sp        ; Stack korrigieren
    +
    + +
    + +

    4.6.11 Vnext

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Vnext« - Nächster Videomode +
      +
    Xbiosnummer: 71 +
      +
    Deklaration: int16_t Vnext( VDO_PARAM *Mask, VDO_PARAM *Mode ); +
      +
    Beschreibung: Nächster Videomode +
      +
    Ergebnis:  0: das out-array ist voll +
    -1: kein Mode gefunden +
      +
    Verfügbar: CENTScreen +
      +
    Gruppe: CENTScreen-XBIOS-Erweiterung +
      +
    Querverweis: Binding +
      + +
    + +

    4.6.11.1 Bindings für Vnext

    + + + + + + +
    C: +
      +
    int16_t Vnext( VDO_PARAM *Mask, VDO_PARAM *Mode ); +
      +
    Assembler: +
      +
    move.l    #Mode,-(sp)    ; Offset 6
    +move.l    #Mask,-(sp)    ; Offset 2
    +move.w    #71,-(sp)      ; Offset 0
    +trap      #14            ; XBIOS aufrufen
    +lea       10(sp),sp      ; Stack korrigieren
    +
    + +
    + +

    4.6.12 Voffset

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Voffset« - Position des virtuellen Bildschirms +
      +
    Xbiosnummer: 78 +
      +
    Deklaration: int16_t Voffset( void ); +
      +
    Beschreibung: Die Funktion liefert die Position der linken oberen Ecke des +realen Bildschirms innerhalb des virtuellen Bildschirms. +
      +
    Ergebnis: Liefert die aktuelle Position mit x im oberen Word und y im +unteren Word. +
      +
    Verfügbar: CENTScreen +
      +
    Gruppe: CENTScreen-XBIOS-Erweiterung +
      +
    Querverweis: Binding +
      + +
    + +

    4.6.12.1 Bindings für Voffset

    + + + + + + +
    C: +
      +
    int16_t Voffset( void ); +
      +
    Assembler: +
      +
    move.w    #78,-(sp)   ; Offset 0
    +trap      #14         ; XBIOS aufrufen
    +addq.l    #2,sp       ; Stack korrigieren
    +
    + +
    + +

    4.6.13 Vopen

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Vopen« - Bildschirm aufwecken +
      +
    Xbiosnummer: 75 +
      +
    Deklaration: int16_t Vopen( void ); +
      +
    Beschreibung: Bildschirm aufwecken +
      +
    Ergebnis:  0 : kein Fehler. +
    -1 : unwahrscheinlich. +
      +
    Verfügbar: CENTScreen +
      +
    Gruppe: CENTScreen-XBIOS-Erweiterung +
      +
    Querverweis: Binding +
      + +
    + +

    4.6.13.1 Bindings für Vopen

    + + + + + + +
    C: +
      +
    int16_t Vopen( void ); +
      +
    Assembler: +
      +
    move.w    #75,-(sp)    ; Offset 0
    +trap      #14          ; XBIOS aufrufen
    +addq.l    #2,sp        ; Stack korrigieren
    +
    + +
    + +

    4.6.14 Vread

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Vread« - Informationen über aktuellen Videomode abfragen +
      +
    Xbiosnummer: 65 +
      +
    Deklaration: void Vread( VDO_PARAM *Result ); +
      +
    Beschreibung: Mit einem Aufruf können sämtliche Informationen über den +installierten Videomode ermittelt werden. +
      +
    Ergebnis: +
      +
    Verfügbar: CENTScreen +
      +
    Gruppe: CENTScreen-XBIOS-Erweiterung +
      +
    Querverweis: Binding +
      + +
    + +

    4.6.14.1 Bindings für Vread

    + + + + + + +
    C: +
      +
    void Vread( VDO_PARAM *Result ); +
      +
    Assembler: +
      +
    move.l    #Result,-(sp) ; Offset 2
    +move.w    #65,-(sp)     ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +addq.l    #4,sp         ; Stack korrigieren
    +
    + +
    + +

    4.6.15 Vsave

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Vsave« - speichert VIDEO.DAT +
      +
    Xbiosnummer: 74 +
      +
    Deklaration: int16_t Vsave( void ); +
      +
    Beschreibung: speichert VIDEO.DAT +
      +
    Ergebnis:  0 : kein Fehler. +
    -1 : speichern nicht möglich. +
      +
    Verfügbar: CENTScreen +
      +
    Gruppe: CENTScreen-XBIOS-Erweiterung +
      +
    Querverweis: Binding +
      + +
    + +

    4.6.15.1 Bindings für Vsave

    + + + + + + +
    C: +
      +
    int16_t Vsave( void ); +
      +
    Assembler: +
      +
    move.w    #74,-(sp)    ; Offset 0
    +trap      #14          ; XBIOS aufrufen
    +addq.l    #2,sp        ; Stack korrigieren
    +
    + +
    + +

    4.6.16 Vscroll

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Vscroll« - Scrollmethode festlegen +
      +
    Xbiosnummer: 77 +
      +
    Deklaration: int16_t Vscroll( int16_t ScrollMode ); +
      +
    Beschreibung: Scrollmethode festlegen +
      +

    +
    + + + + + + + + + + + + + + + + +
    ScrollModeneue Methode
    0edge scrolling (Defaultmethode)
    1proportional scrolling
    2focus scrolling
    +
    + +
    Ergebnis: the old methode +
      +
    Verfügbar: CENTScreen +
      +
    Gruppe: CENTScreen-XBIOS-Erweiterung +
      +
    Querverweis: Binding +
      + +
    + +

    4.6.16.1 Bindings für Vscroll

    + + + + + + +
    C: +
      +
    int16_t Vscroll( int16_t ScrollMode ); +
      +
    Assembler: +
      +
    move.w    #ScrollMode,-(sp) ; Offset 2
    +move.w    #77,-(sp)         ; Offset 0
    +trap      #14               ; XBIOS aufrufen
    +addq.l    #4,sp             ; Stack korrigieren
    +
    + +
    + +

    4.6.17 Vseek

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Vseek« - setzen der Position des virtuellen Bildschirms +
      +
    Xbiosnummer: 78 +
      +
    Deklaration: VPOS Vseek( int16_t x, int16_t y ); +
      +
    Beschreibung: Die Funktion setzt die Position der linken oberen Ecke des +realen Bildschirms innerhalb des virtuellen Bildschirms. +
      +
    Ergebnis: Liefert die aktuelle Position mit x im oberen Word und y im +unteren Word. +
      +
    Verfügbar: CENTScreen +
      +
    Gruppe: CENTScreen-XBIOS-Erweiterung +
      +
    Querverweis: Binding +
      + +
    + +

    4.6.17.1 Bindings für Vseek

    + + + + + + +
    C: +
      +
    VPOS Vseek( int16_t x, int16_t y ); +
      +
    Assembler: +
      +
    move.w    #78,-(sp)   ; Offset 0
    +trap      #14         ; XBIOS aufrufen
    +addq.l    #2,sp       ; Stack korrigieren
    +
    + +
    + +

    4.6.18 Vsize

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Vsize« - ermittelt die Größe des Bildschirms +
      +
    Xbiosnummer: 84 +
      +
    Deklaration: Bindings für Vsize +
      +
    Beschreibung: Diese Funktion ermittelt die Größe des Bildschirms mit input +Parametern. +
      +
    Wird -1 als Handle angegeben, wird das aktuelle Handle benutzt. +
      +
    Die Funktion liest nur die logischen Parameter (nicht für -1) +und das virtual flag (nicht für -1). +
      +
    Parameter: Long: in-array +
      +
    Ergebnis: D0 enthält die Größe in Bytes. +
    0 steht für einen Fehler (ungültige Parameter?!) +
      +
    Verfügbar: CENTScreen +
      +
    Gruppe: CENTScreen-XBIOS-Erweiterung +
      +
    Querverweis: Binding +
      + +
    + +

    4.6.18.1 Bindings für Vsize

    + + + + + + +
    C: +
      +
    ????? +
      +
    Assembler: +
      +
    move.l    #Mode,-(sp) ; Offset 2
    +move.w    #84,-(sp)   ; Offset 0
    +trap      #14         ; XBIOS aufrufen
    +addq.l    #6,sp       ; Stack korrigieren
    +
    + +
    + +

    4.6.19 Vvalid

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Vvalid« - prüft einen Videomode +
      +
    Xbiosnummer: 72 +
      +
    Deklaration: int16_t Vvalid( int16_t Handle ); +
      +
    Beschreibung: Prüft einen Videomode +
      +
    Ergebnis:  0: wenn der Mode existiert. +
    -1: kein Mode zu diesem Handle +
      +
    Verfügbar: CENTScreen +
      +
    Gruppe: CENTScreen-XBIOS-Erweiterung +
      +
    Querverweis: Binding +
      + +
    + +

    4.6.19.1 Bindings für Vvalid

    + + + + + + +
    C: +
      +
    int16_t Vvalid( int16_t Handle ); +
      +
    Assembler: +
      +
    move.w    #Handle,-(sp)  ; Offset 2
    +move.w    #72,-(sp)      ; Offset 0
    +trap      #14            ; XBIOS aufrufen
    +addq.l    #4,sp          ; Stack korrigieren
    +
    + +
    + +

    4.6.20 Vwrite

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Vwrite« - Auflösung wechseln +
      +
    Xbiosnummer: 66 +
      +
    Deklaration: int16_t Vwrite( int16_t InitVDI, VDO_PARAM *In, VDO_PARAM *Out +); +
      +
    Beschreibung: Es ist möglich, das VDI durch einen Aufruf dieser Funktion zu +initialsieren. Es wird gleichzeitig Speicher neu angefordert. +
      +
    Im in-array kann die geewünschte neue Auflösung übergeben +werden: +
      +
      +
    • handle <>-1: das Handle gehört zu einem bekannten +Videomode (wie z.B. die Auflösung beim Systemstart). Die neue +virtuelle Auflösung kann mit einem Wert ungleich -1 angegeben werden, +andernfalls wird die aktuelle virtuelle Auflösung benutzt. +
        +

    • +
    • handle = -1: die Auflösung muß angegeben werden. Es wird +Modus benutzt, der eine Auflösung kleiner oder gleich der +gewünschten bietet und gegebenenfalls wird ein virtueller Bildschirm +benutzt. +
        +

    • +
    + +
    Ergebnis: Nach dem Funktionsaufruf enthält das out-array die +tatsächliche Auflösung. +
      +
    Im Fehlerfall wird als aktuelle Auflösung -1 geliefert. +
      +
    Verfügbar: CENTScreen +
      +
    Gruppe: CENTScreen-XBIOS-Erweiterung +
      +
    Querverweis: Binding +
      + +
    + +

    4.6.20.1 Bindings für Vwrite

    + + + + + + +
    C: +
      +
    int16_t Vwrite( int16_t InitVDI, VDO_PARAM *In, VDO_PARAM *Out +); +
      +
    Assembler: +
      +
    move.l   #OutParam,-(sp) ; Offset 6
    +move.l   #InParam,-(sp)  ; Offset 2
    +move.w   #66,-(sp)       ; Offset 0
    +trap     #14             ; XBIOS aufrufen
    +lea      10(sp),sp       ; Stack korrigieren
    +
    + +
    + +
    + +Home +XBIOSXBIOS +BildschirmfunktionenBildschirmfunktionen +Crazy-Dots-XBIOS-ErweiterungCrazy-Dots-XBIOS-Erweiterung + + diff --git a/de/CPXINFO.html b/de/CPXINFO.html new file mode 100644 index 000000000..568a10add --- /dev/null +++ b/de/CPXINFO.html @@ -0,0 +1,48 @@ + + + + + +Die Anleitung zum TOS: CPXINFO + + + + + + + + + +Home +TypdefinitionenTypdefinitionen +Buffer-Control-Block (BCB)Buffer-Control-Block (BCB) +FlpDrvInfoFlpDrvInfo + +
    + +

    I.4 CPXINFO

    +
    typedef struct
    +{
    +    int16_t cdecl (*cpx_call)();
    +    void cdecl    (*cpx_draw)();
    +    void cdecl    (*cpx_wmove)();
    +    void cdecl    (*cpx_timer)();
    +    void cdecl    (*cpx_key)();
    +    void cdecl    (*cpx_button)();
    +    void cdecl    (*cpx_m1)();
    +    void cdecl    (*cpx_m2)();
    +    int16_t cdecl (*cpx_hook)();
    +    void cdecl    (*cpx_close)();
    +} CPXINFO;
    +
    +

    Querverweis: XCONTROL   cpx_init +

    +
    + +Home +TypdefinitionenTypdefinitionen +Buffer-Control-Block (BCB)Buffer-Control-Block (BCB) +FlpDrvInfoFlpDrvInfo + + diff --git a/de/FlpDrvInfo.html b/de/FlpDrvInfo.html new file mode 100644 index 000000000..a8e132b87 --- /dev/null +++ b/de/FlpDrvInfo.html @@ -0,0 +1,47 @@ + + + + + +Die Anleitung zum TOS: FlpDrvInfo + + + + + + + + + +Home +TypdefinitionenTypdefinitionen +CPXINFOCPXINFO +GEM_MUPBGEM_MUPB + +
    + +

    I.5 FlpDrvInfo

    +

    Diese Struktur spielt im Zusammenhang mit MagiC Mac eine Rolle, und +ist wie folgt definiert: +

    +
    typedef struct
    +{
    +   BOOLEAN  inserted;    /* true: disk is inserted and available */
    +                         /* to GEMDOS/BIOS functions             */
    +   BOOLEAN  highDensity; /* true: HD disk inserted, false: none  */
    +                         /* or DD disk inserted                  */
    +   int16_t    res1;        /* reserved */
    +   int32_t  res2;        /* reserved */
    +} FlpDrvInfo;
    +
    +

    Querverweis: Cookie von MagiC Mac +

    +
    + +Home +TypdefinitionenTypdefinitionen +CPXINFOCPXINFO +GEM_MUPBGEM_MUPB + + diff --git a/de/GEM_MUPB.html b/de/GEM_MUPB.html new file mode 100644 index 000000000..46b49ef30 --- /dev/null +++ b/de/GEM_MUPB.html @@ -0,0 +1,44 @@ + + + + + +Die Anleitung zum TOS: GEM_MUPB + + + + + + + + + +Home +TypdefinitionenTypdefinitionen +FlpDrvInfoFlpDrvInfo +GRECTGRECT + +
    + +

    I.6 GEM_MUPB

    +

    Diese Struktur beschreibt den 'GEM memory usage parameter +block', der wie folgt definiert ist: +

    +
    typdef struct
    +{
    +   int32_t gm_magic;  /* muss 0x87654321 sein                  */
    +   void *gm_end;      /* Ende des vom GEM benötigten Speichers */
    +   void *gm_init;     /* Startadresse von GEM                  */
    +} GEM_MUPB;
    +
    +

    Querverweis: _sysbase   OSHEADER   Systemvariablen   Systemvektoren +

    +
    + +Home +TypdefinitionenTypdefinitionen +FlpDrvInfoFlpDrvInfo +GRECTGRECT + + diff --git a/de/GRECT.html b/de/GRECT.html new file mode 100644 index 000000000..55bd97fb4 --- /dev/null +++ b/de/GRECT.html @@ -0,0 +1,42 @@ + + + + + +Die Anleitung zum TOS: GRECT + + + + + + + + + +Home +TypdefinitionenTypdefinitionen +GEM_MUPBGEM_MUPB +HDFUNCSHDFUNCS + +
    + +

    I.7 GRECT

    +
    typedef struct
    +{
    +   int16_t x;   /* x-Koordinate */
    +   int16_t y;   /* y-Koordinate */
    +   int16_t w;   /* Breite       */
    +   int16_t h;   /* Höhe         */
    +} GRECT;
    +
    +

    Querverweis: AES   GEM   VDI +

    +
    + +Home +TypdefinitionenTypdefinitionen +GEM_MUPBGEM_MUPB +HDFUNCSHDFUNCS + + diff --git a/de/HDFUNCS.html b/de/HDFUNCS.html new file mode 100644 index 000000000..4b9e4f9dc --- /dev/null +++ b/de/HDFUNCS.html @@ -0,0 +1,52 @@ + + + + + +Die Anleitung zum TOS: HDFUNCS + + + + + + + + + +Home +TypdefinitionenTypdefinitionen +GRECTGRECT +MacVersionMacVersion + +
    + +

    I.8 HDFUNCS

    +
    typedef struct
    +{
    +    int32_t dma_begin ( void);
    +    int32_t dma_end   ( void );
    +    int32_t dma_wait  ( d0 = int32_t ticks_200hz );
    +    int32_t ncr_begin ( void );
    +    int32_t ncr_end   ( void );
    +    int32_t ncr_wait  ( d0 = int32_t ticks_200hz );
    +} HDFUNCS;
    +
    +

    Hinweis: Direkt vor der Struktur (2 Bytes vorher) liegt +ein int16_t, das die Tabellenlänge in int32_ts angibt (in diesem Fall +6). Alle 6 Zeiger liegen im Systemvariablenbereich und dürfen +notfalls verändert werden. Die internen Funktionen für die Floppy +springen ebenfalls über die 6 Zeiger. Wichtig: Der Zeiger +hddrv_functions im MagX-Cookie darf nicht verändert +werden. +

    +

    Querverweis: Hintergrund-DMA in MagiC +

    +
    + +Home +TypdefinitionenTypdefinitionen +GRECTGRECT +MacVersionMacVersion + + diff --git a/de/MD.html b/de/MD.html new file mode 100644 index 000000000..e67382e8c --- /dev/null +++ b/de/MD.html @@ -0,0 +1,76 @@ + + + + + +Die Anleitung zum TOS: Memory-Deskriptor (MD) in TOS + + + + + + + + + +Home +TypdefinitionenTypdefinitionen +Memory-Control-Block (MCB) in MagiCMemory-Control-Block (MCB) in MagiC +MRETSMRETS + +
    + +

    I.11 Memory-Deskriptor (MD) in TOS

    + + +
    typedef struct md
    +{
    +    struct md *m_link;      /* Zeiger auf nächsten MD    */
    +    int32_t      m_start;   /* Anfangsadresse des Blocks */
    +    int32_t      m_length;  /* Länge des Blocks          */
    +    BASEPAGE  *m_own;       /* Zeiger auf die Basepage   */
    +} MD;
    +
    +

    Hinweis: Die Komponente m_own zeigt dabei auf +die Basepage des Prozesses, dem der Speicherblock gehört. +

    +

    Diese Strukturen werden in der internen Speicherverwaltung von +TOS (aber nicht von MagiC!) verwaltet. Diese Deskriptoren, +soweit benutzt, hängen in drei Speicherlisten, und zwar für freie +Blöcke, belegte Blöcke und für den nächsten zu belegenden Block +(mem_rover). Mit dem mem_rover-Konzept sollte erreicht werden, daß +aufeinanderfolgende Malloc-Aufrufe möglichst aufeinanderfolgenden +Speicher anfordern (wurde an anderer Stelle schon als Fehler +bezeichnet). Damit sollte die Segmentierung verringert werden. +

    +

    Diese Idee ist jedoch unbrauchbar, wenn mehrere Programme +gleichzeitig laufen und abwechselnd Mallocs machen. Das von Atari +implementierte Konzept hat den Vorteil, daß es unempfindlich gegen +amoklaufende Programme ist, da die MDs im Systemspeicher liegen, weit +weg vom Benutzerspeicher. Ein bekannter Nachteil des beschriebenen +Konzepts ist, daß nur eine sehr begrenzte Anzahl von Malloc-Aufrufen +möglich sind, da jeder Aufruf einen MD des begrenzten Systemspeichers +aufzehrt; dieser wird außerdem noch massiv von geöffneten Ordnern +und Dateien belastet. Ein weiterer Nachteil der Speicherverwaltung des +TOS: Wenn ein Programm einen Speicherblock überlaufen läßt, d.h. +über dessen Ende hinausschreibt, bleibt dies i.a. völlig unbemerkt. +

    +

    Besonders im Multitaskingsystem ist die Gefahr eines +überschriebenen Speicherblocks ungleich höher als im TOS. Ferner ist +die Anzahl der benötigten Speicherblöcke sowie auch die der Ordner +(jedes Programm hat eigene Dateien und Standardverzeichnisse) +wesentlich höher. Aus diesem Grund hat MagiC ein völlig anderes +Konzept; dort gibt es nur noch eine Speicherliste deren Zeiger auf den +ersten MCB zeigt. +

    +

    Querverweis: GEMDOS   MCB   MPB   Speicherverwaltung   themd +

    +
    + +Home +TypdefinitionenTypdefinitionen +Memory-Control-Block (MCB) in MagiCMemory-Control-Block (MCB) in MagiC +MRETSMRETS + + diff --git a/de/MRETS.html b/de/MRETS.html new file mode 100644 index 000000000..74336caa0 --- /dev/null +++ b/de/MRETS.html @@ -0,0 +1,42 @@ + + + + + +Die Anleitung zum TOS: MRETS + + + + + + + + + +Home +TypdefinitionenTypdefinitionen +Memory-Deskriptor (MD) in TOSMemory-Deskriptor (MD) in TOS +OHEADEROHEADER + +
    + +

    I.12 MRETS

    +
    typedef struct
    +{
    +    int16_t x;
    +    int16_t y;
    +    int16_t buttons;
    +    int16_t kstate;
    +} MRETS;
    +
    +

    Querverweis: cpx_button   cpx_m1   cpx_m2   XCONTROL +

    +
    + +Home +TypdefinitionenTypdefinitionen +Memory-Deskriptor (MD) in TOSMemory-Deskriptor (MD) in TOS +OHEADEROHEADER + + diff --git a/de/MacVersion.html b/de/MacVersion.html new file mode 100644 index 000000000..291da4031 --- /dev/null +++ b/de/MacVersion.html @@ -0,0 +1,49 @@ + + + + + +Die Anleitung zum TOS: MacVersion + + + + + + + + + +Home +TypdefinitionenTypdefinitionen +HDFUNCSHDFUNCS +Memory-Control-Block (MCB) in MagiCMemory-Control-Block (MCB) in MagiC + +
    + +

    I.9 MacVersion

    +

    Diese Struktur spielt im Zusammenhang mit MagiC Mac eine Rolle, +und ist wie folgt definiert: +

    +
    typedef struct /* 'vers' resource definition, see Inside Mac docs */
    +{
    +   int8_t vm;       /* first part of version number in BCD */
    +   int8_t vn;       /* second and third part of version    */
    +                    /* number in BCD                       */
    +   int8_t  vt;      /* development: 0x20, alpha: 0x40,     */
    +                    /* beta: 0x60, release: 0x80           */
    +   int8_t  vd;      /* stage of prerelease version         */
    +   int16_t region;    /* region code                         */
    +   int8_t  str[];   /* two version strings                 */
    +} MacVersion;
    +
    +

    Querverweis: Cookie von MagiC Mac +

    +
    + +Home +TypdefinitionenTypdefinitionen +HDFUNCSHDFUNCS +Memory-Control-Block (MCB) in MagiCMemory-Control-Block (MCB) in MagiC + + diff --git a/de/OHEADER.html b/de/OHEADER.html new file mode 100644 index 000000000..af066e082 --- /dev/null +++ b/de/OHEADER.html @@ -0,0 +1,47 @@ + + + + + +Die Anleitung zum TOS: OHEADER + + + + + + + + + +Home +TypdefinitionenTypdefinitionen +MRETSMRETS +OSHEADEROSHEADER + +
    + +

    I.13 OHEADER

    +

    Diese Struktur beschreibt den Header einer Objektdatei im +Digital-Research Format: +

    +
    typedef struct
    +{
    +   int16_t magic;         /* magischer Wert: 0x601a      */
    +   int32_t tsize;         /* Größe des Text-Segments     */
    +   int32_t dsize;         /* Größe des Data-Segments     */
    +   int32_t bsize;         /* Größe der BSS               */
    +   int32_t ssize;         /* Größe der Symboltabelle     */
    +   int8_t reserved[10];   /* reserviert, auf Null setzen */
    +} OHEADER;
    +
    +

    Querverweis: ARHEADER   BASEPAGE +

    +
    + +Home +TypdefinitionenTypdefinitionen +MRETSMRETS +OSHEADEROSHEADER + + diff --git a/de/OSHEADER.html b/de/OSHEADER.html new file mode 100644 index 000000000..18ab3a921 --- /dev/null +++ b/de/OSHEADER.html @@ -0,0 +1,130 @@ + + + + + +Die Anleitung zum TOS: OSHEADER + + + + + + + + + +Home +TypdefinitionenTypdefinitionen +OHEADEROHEADER +PrintDescPrintDesc + +
    + +

    I.14 OSHEADER

    + + + +
    typedef struct _osheader
    +{
    +    uint16_t    os_entry;       /* BRAnch-Instruktion zum Reset-Handler */
    +    uint16_t    os_version;     /* TOS-Versionsnummer                   */
    +    void       *reseth;         /* Zeiger auf Reset-Handler             */
    +    struct _osheader *os_beg;   /* Basisadresse des Betriebssystems     */
    +    void       *os_end;         /* erstes nicht vom BS benutztes Byte   */
    +    int32_t     os_rsvl;        /* reserviert                           */
    +    GEM_MUPB   *os_magic;       /* GEM-Memory-Usage-Parameter-Block     */
    +    int32_t     os_date;        /* TOS-Datum (englisch !) im BCD-Format */
    +    uint16_t    os_conf;        /* verschiedene Konfigurationsbits      */
    +    uint16_t    os_dosdate;     /* TOS-Datum im GEMDOS-Format           */
    +
    +    /* Die folgenden Komponenten stehen erst ab TOS-Version 1.02
    +       (Blitter-TOS) zur Verfügung */
    +    int8_t    **p_root;         /* Basisadresse des GEMDOS-Pools        */
    +    int8_t    **pkbshift;       /* Zeiger auf BIOS-Kbshift-Variable
    +                                   Für TOS 1.00 siehe Kbshift           */
    +    BASEPAGE  **p_run;          /* Adresse der Variablen, die einen
    +                                   Zeiger auf den aktuellen GEMDOS-
    +                                   Prozess enthält.                     */
    +    int8_t     *p_rsv2;         /* reserviert                           */
    +                                /* Falls EmuTOS vorhanden, dann 'ETOS'  */
    +} OSHEADER;
    +
    +

    Die Struktur taucht auch unter dem Namen SYSHDR auf. +

    +

    Hinweis: +

    + + + + + + + + + +
    os_conf Die Komponente os_conf enthält im untersten Bit das +sogenannte NTSC/PAL-Flag; ist dieses Bit gesetzt, so handelt es sich +um ein PAL-Videosystem. Die restlichen Bits beinhalten eine +Länderkennung, die z.B. dazu dienen kann, die zu benutzende Sprache +zu erkennen. Es gilt die folgende Belegung: +
      +

    +
    + + + + + + + + + + + + +
    WertLand
    0 bis 126siehe bei der Beschreibung des _AKP-Cookie
    127Alle Länder werden unterstützt.
    +
    + +
    Achtung: Um die zu benutzende Sprache zu ermitteln, +sollte nach Möglichkeit nicht auf den OSHEADER, sondern auf +den _AKP-Cookie bzw. auf die Funktion appl_getinfo (Opcode 3) +zurückgegriffen werden. +
      +
    p_root Bei TOS 1.00 befindet sich der Zeiger bei der Adresse 0x56FA +(0x7E0A im spanischem TOS). +
      +
    p_run +
      +
    BASEPAGE **GetRun (void)
    +{
    +  int32_t savessp = Super (0L);
    +  OSHEADER *O = *((OSHEADER **)(0x4f2L);
    +  Super ((void *) savessp );
    +
    +  O = O->os_beg;  /* wegen eines Fehlers in alter AHDI-Version */
    +
    +  if (O->os_version < 0x102)
    +  {
    +    if ((O->os_conf >> 1) == 4)      /* PAL-Modus wegshiften */
    +      return ((BASEPAGE **)0x873c);  /* Spanisches TOS 1.0   */
    +    else
    +      return ((BASEPAGE **)0x602c);
    +  }
    +  else
    +    return O->p_run;
    +}
    +
    + +
    + +

    Querverweis: Kbshift   _sysbase   Systemvariablen   Systemvektoren +

    +
    + +Home +TypdefinitionenTypdefinitionen +OHEADEROHEADER +PrintDescPrintDesc + + diff --git a/de/PCI_BIOS.html b/de/PCI_BIOS.html new file mode 100644 index 000000000..54f5be15c --- /dev/null +++ b/de/PCI_BIOS.html @@ -0,0 +1,4184 @@ + + + + + +Die Anleitung zum TOS: PCI-BIOS + + + + + + + + + +Home +XBIOSXBIOS +OverScan-XBIOS-ErweiterungenOverScan-XBIOS-Erweiterungen +SchnittstellenprogrammierungSchnittstellenprogrammierung + +
    + +

    4.17 PCI-BIOS

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    bus_to_virt Convert PCI bus to virtual address +
    fast_read_config_byte Read configuration byte fast +
    fast_read_config_longword Read configuration longword fast +
    fast_read_config_word Read configuration word fast +
    fast_read_io_byte Read IO byte fast +
    fast_read_io_longword Read IO longword fast +
    fast_read_io_word Read IO word fast +
    fast_read_mem_byte Read memory byte fast +
    fast_read_mem_longword Read memory longword fast +
    fast_read_mem_word Read memory word fast +
    find_pci_classcode Find PCI class code +
    find_pci_device Find PCI device +
    get_card_used Get card used flag +
    get_machine_id Get machine ID +
    get_pagesize Get pagesize +
    get_resource Get resource Data +
    get_routing Get interrupt routing options +
    hook_interrupt Hook interrupt vector +
    phys_to_virt Convert physical CPU to virtual address +
    read_config_byte Read configuration byte +
    read_config_longword Read configuration longword +
    read_config_word Read configuration word +
    read_io_byte Read IO byte +
    read_io_longword Read IO longword +
    read_io_word Read IO word +
    read_mem_byte Read memory byte +
    read_mem_longword Read memory longword +
    read_mem_word Read memory word +
    set_card_used Set card used flag +
    set_interrupt Set hardware interrupt +
    special_cycle Generates special cycle +
    unhook_interrupt Unhook interrupt vector +
    virt_to_bus Convert virtual to PCI bus address +
    virt_to_phys Convert virtual to physical CPU address +
    write_config_byte Write configuration byte +
    write_config_longword Write configuration longword +
    write_config_word Write configuration word +
    write_io_byte Write IO byte +
    write_io_longword Write IO longword +
    write_io_word Write IO word +
    write_mem_byte Write memory byte +
    write_mem_longword Write memory longword +
    write_mem_word Write memory word + +
    + +

    Querverweis: PCI-BIOS Fehlercodes   Cookie _PCI   Cookie XPCI +

    +

    4.17.1 bus_to_virt

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Bus To Virtual« - Convert PCI bus to virtual address +
      +
    Xbiosnummer: 340 +
      +
    Deklaration: int32_t bus_to_virt (int32_t handle, uint32_t address, uint32_t +*pointer); +
      +
    Beschreibung: This function converts from PCI bus addresses to virtual +addresses (as the CPU uses them). This is necessary since the memory +may be mapped non-linear by the PMMU even when not using virtual +memory (it is on the MILAN). +
      +
    It is required that a resource (ie. a region of memory or IO +space on a PCI card) is mapped contiguously, so that a simple offset +can be used when copying to/from memory on a PCI card. +
      +
    This function might be limited to TOS or TOS-like +operating systems. If an operating system uses a different memory +layout, it may need to provide its own functions which drivers can +use. +
      +
    When using this function, the driver does not need to care about +DMA offsets at all. +
      + + + + + + + + + +
    handle Device handle +
      +
    address PCI bus address +
      +
    pointer Pointer to mem-struct for results +
      + +
    + +
    Note: This function is the reverse of virt_to_bus. It +might be slow, so the driver should avoid using it if it can determine +the address by other means. +
      +
    Ergebnis: PCI-BIOS Fehlercodes. If successful, mem-struct is filled as +follows: +
      + + + + + + +
    uint32_t CPU (virtual) address +
    uint32_t length of contiguous mapped area + +
    + +
    Verfügbar: PCI-BIOS +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding   get_pagesize   phys_to_virt   virt_to_bus   +virt_to_phys +
      + +
    + +

    4.17.1.1 Bindings für bus_to_virt

    + + + + + + +
    C: #include <tos.h> +
      +
    int32_t bus_to_virt (int32_t handle, uint32_t address, uint32_t +*pointer); +
      +
    Assembler: +
      +
    pea       pointer       ; Offset 10
    +move.l    address,-(sp) ; Offset 6
    +move.l    handle,-(sp)  ; Offset 2
    +move.w    #340,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +lea       14(sp),sp     ; Stack korrigieren
    +
    + +
    + +

    4.17.2 fast_read_config_byte

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Read configuration byte fast« +
      +
    Xbiosnummer: 305 +
      +
    Deklaration: int8_t fast_read_config_byte (int32_t handle, uint8_t reg); +
      +
    Beschreibung: Diese Funktion erlaubt das Lesen von Registern im +Konfigurationsbereich ohne aufwendige Fehler- und +Plausibilitätschecks und ist daher auch etwas schneller als ihre +Schwester (daher besonders geeignet für Interrupt-Routinen und wenn +man ganz genau weiß, was man tut ;-). +
      + + + + + + +
    handle Geräte-Handle des gewählten PCI-Gerätes +
      +
    reg Adresse des Konfigurationsregisters +
      + +
    + +
    Ergebnis: PCI-BIOS Fehlercode +
      +
    Verfügbar: PCI-BIOS V2.00 +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding   read_config_byte   read_config_word   +fast_read_config_word   read_config_longword   +fast_read_config_longword +
      + +
    + +

    4.17.2.1 Bindings für fast_read_config_byte

    + + + + + + +
    C: #include <tos.h> +
      +
    int8_t fast_read_config_byte (int32_t handle, uint8_t reg); +
      +
    Assembler: +
      +
    move.w    reg,-(sp)     ; Offset 6
    +move.l    handle,-(sp)  ; Offset 2
    +move.w    #305,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +addq.l    #8,sp         ; Stack korrigieren
    +
    + +
    + +

    4.17.3 fast_read_config_longword

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Read configuration longword fast« +
      +
    Xbiosnummer: 307 +
      +
    Deklaration: int32_t fast_read_config_longword (int32_t handle, uint8_t +reg); +
      +
    Beschreibung: Diese Funktion erlaubt das Lesen von Registern im +Konfigurationsbereich ohne aufwendige Fehler- und +Plausibilitätschecks und ist daher auch etwas schneller als ihre +Schwester (daher besonders geeignet für Interrupt-Routinen und wenn +man ganz genau weiß, was man tut ;-). +
      + + + + + + +
    handle Geräte-Handle des gewählten PCI-Gerätes +
      +
    reg Adresse des Konfigurationsregisters (0,4,8,... für +Langwort-Zugriffe) +
      + +
    + +
    Ergebnis: PCI-BIOS Fehlercode +
      +
    Verfügbar: PCI-BIOS V2.00 +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding   read_config_byte   fast_read_config_byte   +read_config_word   fast_read_config_word   read_config_longword +
      + +
    + +

    4.17.3.1 Bindings für fast_read_config_longword

    + + + + + + +
    C: #include <tos.h> +
      +
    int32_t fast_read_config_longword (int32_t handle, uint8_t reg); +
      +
    Assembler: +
      +
    move.w    reg,-(sp)     ; Offset 6
    +move.l    handle,-(sp)  ; Offset 2
    +move.w    #307,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +addq.l    #8,sp         ; Stack korrigieren
    +
    + +
    + +

    4.17.4 fast_read_config_word

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Read configuration word fast« +
      +
    Xbiosnummer: 306 +
      +
    Deklaration: int16_t fast_read_config_word (int32_t handle, uint8_t reg); +
      +
    Beschreibung: Diese Funktion erlaubt das Lesen von Registern im +Konfigurationsbereich ohne aufwendige Fehler- und +Plausibilitätschecks und ist daher auch etwas schneller als ihre +Schwester (daher besonders geeignet für Interrupt-Routinen und wenn +man ganz genau weiß, was man tut ;-). +
      + + + + + + +
    handle Geräte-Handle des gewählten PCI-Gerätes +
      +
    reg Adresse des Konfigurationsregisters (0,2,4,... für +Wort-Zugriffe) +
      + +
    + +
    Ergebnis: PCI-BIOS Fehlercode +
      +
    Verfügbar: PCI-BIOS V2.00 +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding   read_config_byte   fast_read_config_byte   +read_config_word   read_config_longword   fast_read_config_longword +
      + +
    + +

    4.17.4.1 Bindings für fast_read_config_word

    + + + + + + +
    C: #include <tos.h> +
      +
    int16_t fast_read_config_word (int32_t handle, uint8_t reg); +
      +
    Assembler: +
      +
    move.w    reg,-(sp)     ; Offset 6
    +move.l    handle,-(sp)  ; Offset 2
    +move.w    #306,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +addq.l    #8,sp         ; Stack korrigieren
    +
    + +
    + +

    4.17.5 fast_read_io_byte

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Read IO Byte Fast« +
      +
    Xbiosnummer: 331 +
      +
    Deklaration: uint8_t fast_read_io_byte (int32_t handle, uint32_t offset); +
      +
    Beschreibung: This function is alternative for the normal IO read function. +It returns the read value in D0 and returns no error code, which makes +it easier to use in C. +
      + + + + + + +
    handle Device handle +
      +
    offset Address to access (in PCI IO address space) +
      + +
    + +
    Ergebnis: Read data. +
      +
    Verfügbar: PCI-BIOS +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding   read_io_byte   read_io_word   fast_read_io_word   +read_io_longword   fast_read_io_longword +
      + +
    + +

    4.17.5.1 Bindings für fast_read_io_byte

    + + + + + + +
    C: #include <tos.h> +
      +
    uint8_t fast_read_io_byte (int32_t handle, uint32_t offset); +
      +
    Assembler: +
      +
    move.l    offset,-(sp)  ; Offset 6
    +move.l    handle,-(sp)  ; Offset 2
    +move.w    #331,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +lea       10(sp),sp     ; Stack korrigieren
    +
    + +
    + +

    4.17.6 fast_read_io_longword

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Read IO Longword Fast« +
      +
    Xbiosnummer: 333 +
      +
    Deklaration: uint32_t read_io_longword (int32_t handle, uint32_t offset); +
      +
    Beschreibung: This function is alternative for the normal IO read function. +It returns the read value in D0 and returns no error code, which makes +it easier to use in C. +
      + + + + + + +
    handle Device handle +
      +
    offset Address to access (in PCI IO address space) +
      + +
    + +
    Ergebnis: Read value. +
      +
    Verfügbar: PCI-BIOS +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding   read_io_byte   fast_read_io_byte   read_io_word   +fast_read_io_word   read_io_longword +
      + +
    + +

    4.17.6.1 Bindings für fast_read_io_longword

    + + + + + + +
    C: #include <tos.h> +
      +
    uint32_t fast_read_io_longword (int32_t handle, uint32_t +offset); +
      +
    Assembler: +
      +
    move.l    offset,-(sp)  ; Offset 6
    +move.l    handle,-(sp)  ; Offset 2
    +move.w    #333,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +lea       10(sp),sp     ; Stack korrigieren
    +
    + +
    + +

    4.17.7 fast_read_io_word

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Read IO Word Fast« +
      +
    Xbiosnummer: 332 +
      +
    Deklaration: uint16_t read_io_word (int32_t handle, uint32_t offset); +
      +
    Beschreibung: This function is alternative for the normal IO read function. +It returns the read value in D0 and returns no error code, which makes +it easier to use in C. +
      + + + + + + +
    handle Device handle +
      +
    offset Address to access (in PCI IO address space) +
      + +
    + +
    Ergebnis: Read value. +
      +
    Verfügbar: PCI-BIOS +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding   read_io_byte   fast_read_io_byte   read_io_word   +read_io_longword   fast_read_io_longword +
      + +
    + +

    4.17.7.1 Bindings für fast_read_io_word

    + + + + + + +
    C: #include <tos.h> +
      +
    uint16_t fast_read_io_word (int32_t handle, uint32_t offset); +
      +
    Assembler: +
      +
    move.l    offset,-(sp)  ; Offset 6
    +move.l    handle,-(sp)  ; Offset 2
    +move.w    #332,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +lea       10(sp),sp     ; Stack korrigieren
    +
    + +
    + +

    4.17.8 fast_read_mem_byte

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Read memory byte fast« +
      +
    Xbiosnummer: 322 +
      +
    Deklaration: uint8_t fast_read_mem_byte (int32_t handle, uint32_t offset); +
      +
    Beschreibung: This function is alternative for the normal memory read +function. It returns the read value in D0 and returns no error code, +which makes it easier to use in C. +
      + + + + + + +
    handle Device handle +
      +
    offset Address to access (in PCI memory address space) +
      + +
    + +
    Ergebnis: Read data. +
      +
    Verfügbar: PCI-BIOS +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding   read_mem_byte   read_mem_word   fast_read_mem_word   +read_mem_longword   fast_read_mem_longword +
      + +
    + +

    4.17.8.1 Bindings für fast_read_mem_byte

    + + + + + + +
    C: #include <tos.h> +
      +
    uint8_t fast_read_mem_byte (int32_t handle, uint32_t offset); +
      +
    Assembler: +
      +
    move.l    offset,-(sp)  ; Offset 6
    +move.l    handle,-(sp)  ; Offset 2
    +move.w    #322,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +lea       10(sp),sp     ; Stack korrigieren
    +
    + +
    + +

    4.17.9 fast_read_mem_longword

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Read memory longword fast« +
      +
    Xbiosnummer: 324 +
      +
    Deklaration: uint32_t read_mem_longword (int32_t handle, uint32_t offset); +
      +
    Beschreibung: This function is alternative for the normal memory read +function. It returns the read value in D0 and returns no error code, +which makes it easier to use in C. +
      + + + + + + +
    handle Device handle +
      +
    offset Address to access (in PCI memory address space) +
      + +
    + +
    Ergebnis: Read value. +
      +
    Verfügbar: PCI-BIOS +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding   read_mem_byte   fast_read_mem_byte   read_mem_word   +fast_read_mem_word   read_mem_longword +
      + +
    + +

    4.17.9.1 Bindings für fast_read_mem_longword

    + + + + + + +
    C: #include <tos.h> +
      +
    uint32_t fast_read_mem_longword (int32_t handle, uint32_t +offset); +
      +
    Assembler: +
      +
    move.l    offset,-(sp)  ; Offset 6
    +move.l    handle,-(sp)  ; Offset 2
    +move.w    #324,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +lea       10(sp),sp     ; Stack korrigieren
    +
    + +
    + +

    4.17.10 fast_read_mem_word

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Read memory word fast« +
      +
    Xbiosnummer: 323 +
      +
    Deklaration: uint16_t read_mem_word (int32_t handle, uint32_t offset); +
      +
    Beschreibung: This function is alternative for the normal memory read +function. It returns the read value in D0 and returns no error code, +which makes it easier to use in C. +
      + + + + + + +
    handle Device handle +
      +
    offset Address to access (in PCI memory address space) +
      + +
    + +
    Ergebnis: Read value. +
      +
    Verfügbar: PCI-BIOS +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding   read_mem_byte   fast_read_mem_byte   read_mem_word   +read_mem_longword   fast_read_mem_longword +
      + +
    + +

    4.17.10.1 Bindings für fast_read_mem_word

    + + + + + + +
    C: #include <tos.h> +
      +
    uint16_t fast_read_mem_word (int32_t handle, uint32_t offset); +
      +
    Assembler: +
      +
    move.l    offset,-(sp)  ; Offset 6
    +move.l    handle,-(sp)  ; Offset 2
    +move.w    #323,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +lea       10(sp),sp     ; Stack korrigieren
    +
    + +
    + +

    4.17.11 find_pci_classcode

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »find_pci_classcode« - Liefert ein Devicehandle für ein +Gerät einer bestimmten Geräteklasse. +
      +
    Xbiosnummer: 301 +
      +
    Deklaration: int32_t find_pci_classcode( int32_t classcode, int16_t index ); +
      +
    Beschreibung: Die Funktion liefert ein Devicehandle für ein Gerät, das dem +angegebenen Gerät entspricht. +
      +
    Der Treiber kann diese Funktion mehrmals für eine Geräte ID +aufrufen und den index = 0,1,2,... für jeden Aufruf hochzählen, bis +die Funktion PCI_DEVICE_NOT_FOUND liefert. +
      + + + + + + + + + +
        +
      +
    classcode Class code in Bits 23..0 +
    +
      +
    Bit 23 ..16 Base class (0 - $FF) +
    Bit 15 .. 8 Sub class (0 - $FF) +
    Bit 7 .. 0 Programming Interface (0 - $FF) +
      +
    Maske in Bits 26..24 +
    Bit 26: (0: base class testen, 1: ignorieren) +
    Bit 25: (0: sub class testen, 1: ignorieren) +
    Bit 24: (0: Progr. Interface testen, 1: ignorieren) +
      +
    index Kartenindex (0 - Anzahl Karten mit diesen IDs) +
      + +
    + +
    Ergebnis: Devicehandle für das Gerät oder PCI_DEVICE_NOT_FOUND. +
      +
    Verfügbar: PCI-BIOS V2.00 +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding   find_pci_device +
      + +
    + +

    4.17.11.1 Bindings für find_pci_classcode

    + + + + + + +
    C: #include <tos.h> +
      +
    int32_t find_pci_classcode( int32_t classcode, int16_t index ); +
      +
    Assembler: +
      +
    move.w    index,-(sp)       ; Offset 6
    +move.l    classcode,-(sp)   ; Offset 2
    +move.w    #301,-(sp)        ; Offset 0
    +trap      #14               ; XBIOS aufrufen
    +addq.l    #8,sp             ; Stack korrigieren
    +
    + +
    + +

    4.17.12 find_pci_device

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »find_pci_device« - Liefert ein Devicehandle für ein Gerät, +das dem angegebenen Gerät und der Hersteller ID entspricht. +
      +
    Xbiosnummer: 300 +
      +
    Deklaration: int32_t find_pci_device( int32_t id, int16_t index); +
      +
    Beschreibung: Die Funktion liefert ein Devicehandle für ein Gerät, das dem +angegebenen Gerät und der Hersteller ID entspricht. Der Treiber kann +diese Funktion mehrmals für eine Geräte und Hersteller ID aufrufen +und den index = 0,1,2,... für jeden Aufruf hochzählen, bis die +Funktion PCI_DEVICE_NOT_FOUND liefert. +
      +
    Als Spezialfall kann die Hersteller ID $FFFF benutzt weren, um +alle Geräte abzufragen. Die Geräte ID wird in diesem Fall ignoriert. +
      + + + + + + + + + +
        +
      +
    id Geräte ID in Bits 31..16 (0 - $FFFF) +
    Hersteller ID in Bits 15..0 (0 - $FFFE) +
      +
    index Kartenindex (0 - Anzahl Karten mit diesen IDs) +
      + +
    + +
    Ergebnis: Devicehandle für das Gerät oder PCI_DEVICE_NOT_FOUND. +
      +
    Verfügbar: PCI-BIOS V2.00 +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding   find_pci_classcode +
      + +
    + +

    4.17.12.1 Bindings für find_pci_device

    + + + + + + +
    C: #include <tos.h> +
      +
    int32_t find_pci_device( int32_t id, int16_t index); +
      +
    Assembler: +
      +
    move.w    index,-(sp)  ; Offset 6
    +move.l    id,-(sp)     ; Offset 2
    +move.w    #300,-(sp)   ; Offset 0
    +trap      #14          ; XBIOS aufrufen
    +addq.l    #8,sp        ; Stack korrigieren
    +
    + +
    + +

    4.17.13 get_card_used

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Get card used flag« +
      +
    Xbiosnummer: 317 +
      +
    Deklaration: int32_t get_card_used (int32_t handle, uint32_t *address); +
      +
    Beschreibung: This function is used to manage which card is in use by which +driver. A driver can provide a means by which a call-back function can +be called from another driver to deactivate this driver. This is +necessary for the first driver to unhook from interrupt chains etc., +before the new driver can take over. +
      +
    The returned status is either 0 (the card is free), 1 (the card +is in use), 2 (the card is in use, but the driver can be uninstalled) +or 3 (the card is in use, but can be taken over without further +actions). +
      +
    Case 3 means that the driver which brought the card to this +state may not hook into interrupt chains or other system resources +which need to be unhooked when another driver takes over the card. +
      +
    If the return code is 2, the call-back function entry of the +driver is returned in the memory pointer to by address. +
      + + + + + + +
    handle Device handle +
      +
    address Pointer to longword where call-back address is stored +
      + +
    + +
    Call-back handlers: Call-back functions are invoked by +calling the call-back entry point, they return with RTS. Call-back +functions may only modify those registers which are used to pass +arguments or results. Call-back functions must be called in supervisor +mode with at least 1024 bytes stack available. The call-back function +number is passed in D0.L. If the driver supports call-back functions, +the following functions are mandatory: +
      + + + + + + + + + +
    Call-back Description +
    Get Driver ID (0) call_back0: +
    Input: D0.L = call-back function number, ie. 0 +
    Output: D0.L = driver ID (same as the driver's XBRA ID) +
    Try to remove driver (1) call_back1: +
    Input: D0.L = call-back function number, ie. 1 +
    Output: D0.L = result code: 0=success (card is free), 1=can't +uninstall + +
    + +
    Ergebnis: PCI-BIOS Fehlercodes +
      +
    Verfügbar: PCI-BIOS +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding   set_card_used +
      + +
    + +

    4.17.13.1 Bindings für get_card_used

    + + + + + + +
    C: #include <tos.h> +
      +
    int32_t get_card_used (int32_t handle, uint32_t *address); +
      +
    Assembler: +
      +
    pea       address       ; Offset 6
    +move.l    handle,-(sp)  ; Offset 2
    +move.w    #317,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +lea       10(sp),sp     ; Stack korrigieren
    +
    + +
    + +

    4.17.14 get_machine_id

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Get Machine ID« +
      +
    Xbiosnummer: 337 +
      +
    Deklaration: int32_t get_machine_id ( void ); +
      +
    Beschreibung: This function can be used to get a unique machine ID for the +computer the driver is running on. +
      +
    Ergebnis: Machine ID oder 0 (keine ID verfügbar) oder PCI-BIOS +Fehlercodes +
      +
    Positive, non-zero values are machine IDs. They contain a +manufacturer code in bit 24..31 and a unique serial number which is +set by the manufacturer during production in bit 0..23. +
      +
    The following manufacturer codes are defined: +
      +

    +
    + + + + + + + + + + + + + + + + +
    0Medusa/Hades
    1Milan
    2PAK/Panther 2
    3ARAnyM
    +
    + +
    Verfügbar: PCI-BIOS V2.00 +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding +
      + +
    + +

    4.17.14.1 Bindings für get_machine_id

    + + + + + + +
    C: #include <tos.h> +
      +
    int32_t get_machine_id ( void ); +
      +
    Assembler: +
      +
    move.w    #337,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +addq.l    #2,sp         ; Stack korrigieren
    +
    + +
    + +

    4.17.15 get_pagesize

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Get Pagesize« +
      +
    Xbiosnummer: 338 +
      +
    Deklaration: int32_t get_pagesize ( void ); +
      +
    Beschreibung: This function can be used to get the active pagesize. +
      +
    Ergebnis: Active pagesize, or 0 (paging is not active), PCI-BIOS +error-codes +
      +
    Verfügbar: PCI-BIOS V2.00 +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding +
      + +
    + +

    4.17.15.1 Bindings für get_pagesize

    + + + + + + +
    C: #include <tos.h> +
      +
    int32_t get_pagesize ( void ); +
      +
    Assembler: +
      +
    move.w    #338,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +addq.l    #2,sp         ; Stack korrigieren
    +
    + +
    + +

    4.17.16 get_resource

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Get Resource Data« +
      +
    Xbiosnummer: 316 +
      +
    Deklaration: int32_t get_resource ( int32_t handle ); +
      +
    Beschreibung: Liefert sämtliche Infos zu den Resourcen einer PCI-Karte (bzw. +eines PCI-Gerätes im Fall von Multifunktionskarten). Die +zurückgelieferten Infos dürfen von den Geräte-Treibern keinesfalls +verändert werden. Der Geräte-Treiber kann an Hand der angebotenen +Informationen (Byte ordering usw.) die Karte dann direkt ansprechen. +Eine weitere Möglichkeit ist die Verwendung der BIOS-Routinen +read_mem_..., write_mem_..., read_io_... und write_io_..., wobei man +sich dann um keinerlei Nebenbedingungen selbst kümmern muß. +
    Die Routine liefert einen Zeiger auf den ersten Resource +Deskriptor des gewünschten PCI-Gerätes. Der Geräte-Treiber kann +dann die weiteren Deskriptoren über einen Offset (Länge eines +Deskriptors) erreichen. Der letzte Deskriptor des Geräts ist +wiederrum speziell markiert. Die Reihenfolge der Despriptoren +entspricht derer der Basisadreßregister im PCI-Konfigurationsbereich. +Ein PCI-Gerät kann auch mehrere Resourcen des gleichen Typs +anfordern/verwenden. +
      + + + +
    handle Geräte-Handle des gewählten PCI-Gerätes +
      + +
    + +
    Ergebnis: positiv - Zeiger auf Resourcen-Informationen (erster +Deskriptor) +
    negativ - PCI-BIOS Fehlercodes +
      +
    Verfügbar: PCI-BIOS V2.00 +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding +
      + +
    + +

    4.17.16.1 Bindings für get_resource

    + + + + + + +
    C: #include <tos.h> +
      +
    int32_t get_resource ( int32_t handle ); +
      +
    Assembler: +
      +
    move.l    handle,-(sp)  ; Offset 2
    +move.w    #316,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +addq.l    #6,sp         ; Stack korrigieren
    +
    + +
    + +

    4.17.17 get_routing

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Get Interrupt Routing Options« +
      +
    Xbiosnummer: 314 +
      +
    Deklaration: int32_t get_routing ( int32_t handle ); +
      +
    Beschreibung: To be defined. Not for use by device drivers. +
      +
    Ergebnis: PCI-BIOS Fehlercodes +
      +
    Verfügbar: PCI-BIOS V2.00 +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding +
      + +
    + +

    4.17.17.1 Bindings für get_routing

    + + + + + + +
    C: #include <tos.h> +
      +
    int32_t get_routing ( int32_t handle ); +
      +
    Assembler: +
      +
    move.l    handle,-(sp)  ; Offset 2
    +move.w    #314,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +addq.l    #6,sp         ; Stack korrigieren
    +
    + +
    + +

    4.17.18 hook_interrupt

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Hook Interrupt Vector« +
      +
    Xbiosnummer: 311 +
      +
    Deklaration: int32_t hook_interrupt (int32_t handle, uint32_t *routine, +uint32_t *parameter); +
      +
    Beschreibung: This function hooks the driver into the interrupt chain to +which a specific interrupt on the given card is routed. The interrupt +is enabled on the system level, however, it is the drivers +responsibility to enable the interrupt on the card as needed. +
      +
    The driver should first hook into the interrupt chain, and then +enable the interrupt on the card, in order not to cause spurious +interrupts. +
      + + + + + + + + + +
    handle Geräte-Handle des gewählten PCI-Gerätes +
      +
    routine Zeiger auf den Interrupt-Handler des Treibers +
      +
    parameter Zeiger auf Parameter für Interrupt-Handler, dies ist ein vom +Treiber frei zu wählender Wert, der bei jedem Aufruf des Handlers vom +BIOS mitübergeben wird. +
      +
    Dadurch könnteein einziger Interrupt-Handler auch mehrere +baugleiche PCI-Geräte bedienen. +
      + +
    + +
    Ergebnis: PCI-BIOS Fehlercodes +
      +
    Verfügbar: PCI-BIOS V2.00 +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding   unhook_interrupt +
      + +
    + +

    4.17.18.1 Bindings für hook_interrupt

    + + + + + + +
    C: #include <tos.h> +
      +
    int32_t hook_interrupt (int32_t handle, uint32_t *routine, +uint32_t *parameter); +
      +
    Assembler: +
      +
    move.l    parameter,-(sp) ; Offset 10
    +move.l    routine,-(sp)   ; Offset 6
    +move.l    handle,-(sp)    ; Offset 2
    +move.w    #311,-(sp)      ; Offset 0
    +trap      #14             ; XBIOS aufrufen
    +lea       14(sp),sp       ; Stack korrigieren
    +
    + +
    + +

    4.17.19 phys_to_virt

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Physical To Virtual« - Convert physical CPU to virtual +address +
      +
    Xbiosnummer: 342 +
      +
    Deklaration: int32_t phys_to_virt (uint32_t address, uint32_t *pointer); +
      +
    Beschreibung: This function converts from physical CPU addresses to virtual +addresses. This is necessary since the memory may be mapped non-linear +by the PMMU even when not using virtual memory (it is on the MILAN). +
      +
    It does not depend on a special device, thus it does not get a +device handle. +
      +
    This function might be limited to TOS or TOS-like +operating systems. If an operating system uses a different memory +layout, it may need to provide its own functions which drivers can +use. +
      +
    When using this function, the driver does not need to care about +DMA offsets at all. +
      + + + + + + +
    address Physical CPU address +
      +
    pointer Pointer to mem-struct for results +
      + +
    + +
    Note: This function is the reverse of virt_to_phys. It +might be slow, so the driver should avoid using it if it can determine +the address by other means. +
      +
    Ergebnis: PCI-BIOS Fehlercodes. If successful, mem-struct is filled as +follows: +
      + + + + + + +
    uint32_t CPU (virtual) address +
    uint32_t length of contiguous mapped area + +
    + +
    Verfügbar: PCI-BIOS +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding   bus_to_virt   get_pagesize   virt_to_bus   +virt_to_phys +
      + +
    + +

    4.17.19.1 Bindings für phys_to_virt

    + + + + + + +
    C: #include <tos.h> +
      +
    int32_t phys_to_virt (uint32_t address, uint32_t *pointer); +
      +
    Assembler: +
      +
    pea       pointer       ; Offset 6
    +move.l    address,-(sp) ; Offset 2
    +move.w    #342,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +lea       10(sp),sp     ; Stack korrigieren
    +
    + +
    + +

    4.17.20 read_config_byte

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Read configuration byte« +
      +
    Xbiosnummer: 302 +
      +
    Deklaration: int32_t read_config_byte (int32_t handle, uint8_t reg, uint8_t +*address); +
      +
    Beschreibung: Dies Funktion erlaubt den Lesezugriffe auf die +Konfigurationsregister eines PCI-Gerätes, dessen Geräte-Handle zuvor +mittels find_pci_device oder find_pci_classcode ermittelt wurde. +
      + + + + + + + + + +
    handle Geräte-Handle des gewählten PCI-Gerätes +
      +
    reg Adresse des Konfigurationsregisters +
      +
    address Zeiger auf Ergebnisvariable +
      + +
    + +
    Ergebnis: PCI-BIOS Fehlercodes +
      +
    Verfügbar: PCI-BIOS V2.00 +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding   fast_read_config_byte   read_config_word   +fast_read_config_word   read_config_longword   +fast_read_config_longword +
      + +
    + +

    4.17.20.1 Bindings für read_config_byte

    + + + + + + +
    C: #include <tos.h> +
      +
    int32_t read_config_byte (int32_t handle, uint8_t reg, uint8_t +*address); +
      +
    Assembler: +
      +
    pea       address       ; Offset 8
    +move.w    reg,-(sp)     ; Offset 6
    +move.l    handle,-(sp)  ; Offset 2
    +move.w    #302,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +lea       12(sp),sp     ; Stack korrigieren
    +
    + +
    + +

    4.17.21 read_config_longword

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Read configuration longword« +
      +
    Xbiosnummer: 304 +
      +
    Deklaration: int32_t read_config_longword (int32_t handle, uint8_t reg, +uint32_t *address); +
      +
    Beschreibung: Dies Funktion erlaubt den Lesezugriffe auf die +Konfigurationsregister eines PCI-Gerätes, dessen Geräte-Handle zuvor +mittels find_pci_device oder find_pci_classcode ermittelt wurde. +
      + + + + + + + + + +
    handle Geräte-Handle des gewählten PCI-Gerätes +
      +
    reg Adresse des Konfigurationsregisters (0,4,8,... für +Langwort-Zugriffe) +
      +
    address Zeiger auf Ergebnisvariable +
      + +
    + +
    Ergebnis: PCI-BIOS Fehlercodes +
      +
    Verfügbar: PCI-BIOS V2.00 +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding   read_config_byte   fast_read_config_byte   +read_config_word   fast_read_config_word   fast_read_config_longword +
      + +
    + +

    4.17.21.1 Bindings für read_config_longword

    + + + + + + +
    C: #include <tos.h> +
      +
    int32_t read_config_longword (int32_t handle, uint8_t reg, +uint32_t *address); +
      +
    Assembler: +
      +
    pea       address       ; Offset 8
    +move.w    reg,-(sp)     ; Offset 6
    +move.l    handle,-(sp)  ; Offset 2
    +move.w    #304,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +lea       12(sp),sp     ; Stack korrigieren
    +
    + +
    + +

    4.17.22 read_config_word

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Read configuration word« +
      +
    Xbiosnummer: 303 +
      +
    Deklaration: int32_t read_config_word (int32_t handle, uint8_t reg, uint16_t +*address); +
      +
    Beschreibung: Dies Funktion erlaubt den Lesezugriffe auf die +Konfigurationsregister eines PCI-Gerätes, dessen Geräte-Handle zuvor +mittels find_pci_device oder find_pci_classcode ermittelt wurde. +
      + + + + + + + + + +
    handle Geräte-Handle des gewählten PCI-Gerätes +
      +
    reg Adresse des Konfigurationsregisters +
      +
    address Zeiger auf Ergebnisvariable +
      + +
    + +
    Ergebnis: PCI-BIOS Fehlercodes +
      +
    Verfügbar: PCI-BIOS V2.00 +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding   read_config_byte   fast_read_config_byte   +fast_read_config_word   read_config_longword   +fast_read_config_longword +
      + +
    + +

    4.17.22.1 Bindings für read_config_word

    + + + + + + +
    C: #include <tos.h> +
      +
    int32_t read_config_word (int32_t handle, uint8_t reg, uint16_t +*address); +
      +
    Assembler: +
      +
    pea       address       ; Offset 8
    +move.w    reg,-(sp)     ; Offset 6
    +move.l    handle,-(sp)  ; Offset 2
    +move.w    #303,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +lea       12(sp),sp     ; Stack korrigieren
    +
    + +
    + +

    4.17.23 read_io_byte

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Read IO Byte« +
      +
    Xbiosnummer: 328 +
      +
    Deklaration: int32_t read_io_byte (int32_t handle, uint32_t offset, uint8_t +*address); +
      +
    Beschreibung: This function reads 8-bit values from a IO region. +
      + + + + + + + + + +
    handle Device handle +
      +
    offset Address to access (in PCI IO address space) +
      +
    address Pointer to data in memory +
      + +
    + +
    Ergebnis: PCI-BIOS Fehlercodes +
      +
    Verfügbar: PCI-BIOS +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding   fast_read_io_byte   read_io_word   fast_read_io_word   +read_io_longword   fast_read_io_longword +
      + +
    + +

    4.17.23.1 Bindings für read_io_byte

    + + + + + + +
    C: #include <tos.h> +
      +
    int32_t read_io_byte (int32_t handle, uint32_t offset, uint8_t +*address); +
      +
    Assembler: +
      +
    pea       address       ; Offset 10
    +move.l    offset,-(sp)  ; Offset 6
    +move.l    handle,-(sp)  ; Offset 2
    +move.w    #328,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +lea       14(sp),sp     ; Stack korrigieren
    +
    + +
    + +

    4.17.24 read_io_longword

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Read IO Longword« +
      +
    Xbiosnummer: 330 +
      +
    Deklaration: int32_t read_io_longword (int32_t handle, uint32_t offset, +uint32_t *address); +
      +
    Beschreibung: This function reads 32-bit values from a IO region and take +care of the byte ordering - ie. the data and address are converted as +if Motorola byte ordering was in use. +
      + + + + + + + + + +
    handle Device handle +
      +
    offset Address to access (in PCI IO address space) +
      +
    address Pointer to data in memory +
      + +
    + +
    Ergebnis: PCI-BIOS Fehlercodes. +
      +
    Verfügbar: PCI-BIOS +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding   read_io_byte   fast_read_io_byte   read_io_word   +fast_read_io_word   fast_read_io_longword +
      + +
    + +

    4.17.24.1 Bindings für read_io_longword

    + + + + + + +
    C: #include <tos.h> +
      +
    int32_t read_io_longword (int32_t handle, uint32_t offset, +uint32_t *address); +
      +
    Assembler: +
      +
    pea       address       ; Offset 10
    +move.l    offset,-(sp)  ; Offset 6
    +move.l    handle,-(sp)  ; Offset 2
    +move.w    #330,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +lea       14(sp),sp     ; Stack korrigieren
    +
    + +
    + +

    4.17.25 read_io_word

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Read IO Word« +
      +
    Xbiosnummer: 329 +
      +
    Deklaration: int32_t read_io_word (int32_t handle, uint32_t offset, uint16_t +*address); +
      +
    Beschreibung: This function reads 16-bit values from a IO region and take +care of the byte ordering - ie. the data and address are converted as +if Motorola byte ordering was in use. +
      + + + + + + + + + +
    handle Device handle +
      +
    offset Address to access (in PCI IO address space) +
      +
    address Pointer to data in memory +
      + +
    + +
    Ergebnis: PCI-BIOS Fehlercodes. +
      +
    Verfügbar: PCI-BIOS +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding   read_io_byte   fast_read_io_byte   fast_read_io_word   +read_io_longword   fast_read_io_longword +
      + +
    + +

    4.17.25.1 Bindings für read_io_word

    + + + + + + +
    C: #include <tos.h> +
      +
    int32_t read_io_word (int32_t handle, uint32_t offset, uint16_t +*address); +
      +
    Assembler: +
      +
    pea       address       ; Offset 10
    +move.l    offset,-(sp)  ; Offset 6
    +move.l    handle,-(sp)  ; Offset 2
    +move.w    #329,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +lea       14(sp),sp     ; Stack korrigieren
    +
    + +
    + +

    4.17.26 read_mem_byte

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Read memory byte« +
      +
    Xbiosnummer: 319 +
      +
    Deklaration: int32_t read_mem_byte (int32_t handle, uint32_t offset, uint8_t +*address); +
      +
    Beschreibung: This function reads 8-bit values from a memory region. A driver +can use this function for access to registers and small buffers. For +larger amounts of data, the driver can choose to use his own copy +routines. +
      + + + + + + + + + +
    handle Device handle +
      +
    offset Address to access (in PCI memory address space) +
      +
    address Pointer to data in memory +
      + +
    + +
    Ergebnis: PCI-BIOS Fehlercodes. If successful, read data at buffer +pointed to by address. +
      +
    Verfügbar: PCI-BIOS +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding   fast_read_mem_byte   read_mem_word   +fast_read_mem_word   read_mem_longword   fast_read_mem_longword +
      + +
    + +

    4.17.26.1 Bindings für read_mem_byte

    + + + + + + +
    C: #include <tos.h> +
      +
    int32_t read_mem_byte (int32_t handle, uint32_t offset, uint8_t +*address); +
      +
    Assembler: +
      +
    pea       address       ; Offset 10
    +move.l    offset,-(sp)  ; Offset 6
    +move.l    handle,-(sp)  ; Offset 2
    +move.w    #319,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +lea       14(sp),sp     ; Stack korrigieren
    +
    + +
    + +

    4.17.27 read_mem_longword

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Read memory longword« +
      +
    Xbiosnummer: 321 +
      +
    Deklaration: int32_t read_mem_longword (int32_t handle, uint32_t offset, +uint32_t *address); +
      +
    Beschreibung: This function reads 32-bit values from a memory region and take +care of the byte ordering - ie. the data and address are converted as +if Motorola byte ordering was in use. A driver can use this function +for access to registers and small buffers. For larger amounts of data, +the driver can choose to use his own copy routines, provided it knows +the byte order in use. +
      + + + + + + + + + +
    handle Device handle +
      +
    offset Address to access (in PCI memory address space) +
      +
    address Pointer to data in memory +
      + +
    + +
    Ergebnis: PCI-BIOS Fehlercodes. If successful, read data at buffer +pointed to by address. +
      +
    Verfügbar: PCI-BIOS +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding   read_mem_byte   fast_read_mem_byte   read_mem_word   +fast_read_mem_word   fast_read_mem_longword +
      + +
    + +

    4.17.27.1 Bindings für read_mem_longword

    + + + + + + +
    C: #include <tos.h> +
      +
    int32_t read_mem_longword (int32_t handle, uint32_t offset, +uint32_t *address); +
      +
    Assembler: +
      +
    pea       address       ; Offset 10
    +move.l    offset,-(sp)  ; Offset 6
    +move.l    handle,-(sp)  ; Offset 2
    +move.w    #321,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +lea       14(sp),sp     ; Stack korrigieren
    +
    + +
    + +

    4.17.28 read_mem_word

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Read memory word« +
      +
    Xbiosnummer: 320 +
      +
    Deklaration: int32_t read_mem_word (int32_t handle, uint32_t offset, +uint16_t *address); +
      +
    Beschreibung: This function reads 16-bit values from a memory region and take +care of the byte ordering - ie. the data and address are converted as +if Motorola byte ordering was in use. A driver can use this function +for access to registers and small buffers. For larger amounts of data, +the driver can choose to use his own copy routines, provided it knows +the byte order in use. +
      + + + + + + + + + +
    handle Device handle +
      +
    offset Address to access (in PCI memory address space) +
      +
    address Pointer to data in memory +
      + +
    + +
    Ergebnis: PCI-BIOS Fehlercodes. If successful, read data at buffer +pointed to by address. +
      +
    Verfügbar: PCI-BIOS +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding   read_mem_byte   fast_read_mem_byte   +fast_read_mem_word   read_mem_longword   fast_read_mem_longword +
      + +
    + +

    4.17.28.1 Bindings für read_mem_word

    + + + + + + +
    C: #include <tos.h> +
      +
    int32_t read_mem_word (int32_t handle, uint32_t offset, uint16_t +*address); +
      +
    Assembler: +
      +
    pea       address       ; Offset 10
    +move.l    offset,-(sp)  ; Offset 6
    +move.l    handle,-(sp)  ; Offset 2
    +move.w    #320,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +lea       14(sp),sp     ; Stack korrigieren
    +
    + +
    + +

    4.17.29 set_card_used

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Set card used flag« +
      +
    Xbiosnummer: 318 +
      +
    Deklaration: int32_t set_card_used (int32_t handle, uint32_t *callback); +
      +
    Beschreibung: This function is used to manage which card is in use by which +driver. A driver can provide a means by which a call-back function can +be called from another driver to deactivate this driver. This is +necessary for the first driver to unhook from interrupt chains etc., +before the new driver can take over. +
      +
    If the call-back entry is 0L, 1L or 3L, the card status is set +to that value. Only a driver which 'owns' the card may use this. If +any other value is passed, it is assumed to be a pointer to the +drivers call back entry point, and the card status is set to 2 (in +use, can be uninstalled). +
      + + + + + + +
    handle Device handle +
      +
    callback Address of call-back entry (not pointer to address!) or 0L, 1L +or 3L +
      + +
    + +
    Call-back handlers: Call-back functions are invoked by +calling the call-back entry point, they return with RTS. Call-back +functions may only modify those registers which are used to pass +arguments or results. Call-back functions must be called in supervisor +mode with at least 1024 bytes stack available. The call-back function +number is passed in D0.L. If the driver supports call-back functions, +the following functions are mandatory: +
      + + + + + + + + + +
    Call-back Description +
    Get Driver ID (0) call_back0: +
    Input: D0.L = call-back function number, ie. 0 +
    Output: D0.L = driver ID (same as the driver's XBRA ID) +
    Try to remove driver (1) call_back1: +
    Input: D0.L = call-back function number, ie. 1 +
    Output: D0.L = result code: 0=success (card is free), 1=can't +uninstall + +
    + +
    Ergebnis: PCI-BIOS Fehlercodes +
      +
    Verfügbar: PCI-BIOS +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding   get_card_used +
      + +
    + +

    4.17.29.1 Bindings für set_card_used

    + + + + + + +
    C: #include <tos.h> +
      +
    int32_t set_card_used (int32_t handle, uint32_t *callback); +
      +
    Assembler: +
      +
    pea       callback      ; Offset 6
    +move.l    handle,-(sp)  ; Offset 2
    +move.w    #318,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +lea       10(sp),sp     ; Stack korrigieren
    +
    + +
    + +

    4.17.30 set_interrupt

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Set Hardware Interrupt« +
      +
    Xbiosnummer: 315 +
      +
    Deklaration: int32_t set_interrupt ( int32_t handle ); +
      +
    Beschreibung: To be defined. Not for use by device drivers. +
      +
    Ergebnis: PCI-BIOS Fehlercodes +
      +
    Verfügbar: PCI-BIOS V2.00 +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding +
      + +
    + +

    4.17.30.1 Bindings für set_interrupt

    + + + + + + +
    C: #include <tos.h> +
      +
    int32_t set_interrupt ( int32_t handle ); +
      +
    Assembler: +
      +
    move.l    handle,-(sp)  ; Offset 2
    +move.w    #315,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +addq.l    #6,sp         ; Stack korrigieren
    +
    + +
    + +

    4.17.31 special_cycle

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Generates special cycle« +
      +
    Xbiosnummer: 313 +
      +
    Deklaration: int32_t special_cycle ( unit8_t bus, uint32_t data ); +
      +
    Beschreibung: This function generates a special cycle on the PCI bus. +
      + + + + + + +
    handle Bus number +
      +
    data Cspecial cycle data +
      + +
    + +
    Ergebnis: PCI-BIOS Fehlercodes +
      +
    Verfügbar: PCI-BIOS V2.00 +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding +
      + +
    + +

    4.17.31.1 Bindings für special_cycle

    + + + + + + +
    C: #include <tos.h> +
      +
    int32_t special_cycle ( unit8_t bus, uint32_t data ); +
      +
    Assembler: +
      +
    move.l    data,-(sp)    ; Offset 4
    +move.w    bus,-(sp)     ; Offset 2
    +move.w    #313,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +addq.l    #8,sp         ; Stack korrigieren
    +
    + +
    + +

    4.17.32 unhook_interrupt

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: » « +
      +
    Xbiosnummer: 312 +
      +
    Deklaration: int32_t unhook_interrupt (int32_t handle); +
      +
    Beschreibung: Mit dieser Routine kann man einen mittels hook_interrupt +angemeldeten Interrupt-Handler wieder entfernen. Der Treiber muß +allerdings beachten, daß die Interrupts auf dem PCI-Gerät schon vor +dem Aufruf dieser BIOS-Funktion deaktiviert werden müssen, da es +sonst zu spurious interrupts kommen kann. +
      + + + +
    handle Geräte-Handle des gewählten PCI-Gerätes +
      + +
    + +
    Ergebnis: PCI-BIOS Fehlercodes +
      +
    Verfügbar: PCI-BIOS V2.00 +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding   hook_interrupt +
      + +
    + +

    4.17.32.1 Bindings für unhook_interrupt

    + + + + + + +
    C: #include <tos.h> +
      +
    int32_t unhook_interrupt (int32_t handle); +
      +
    Assembler: +
      +
    move.l    handle,-(sp)  ; Offset 2
    +move.w    #305,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +addq.l    #6,sp         ; Stack korrigieren
    +
    + +
    + +

    4.17.33 virt_to_bus

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Virtual To Bus« - Convert virtual to PCI bus address +
      +
    Xbiosnummer: 339 +
      +
    Deklaration: int32_t virt_to_bus (int32_t handle, uint32_t address, uint32_t +*pointer); +
      +
    Beschreibung: This function converts from virtual addresses (as the CPU uses +them) to PCI bus addresses. This is necessary since the memory may be +mapped non-linear by the PMMU even when not using virtual memory (it +is on the MILAN). +
      +
    It is required that a resource (ie. a region of memory or IO +space on a PCI card) is mapped contiguously, so that a simple offset +can be used when copying to/from memory on a PCI card. +
      +
    This function might be limited to TOS or TOS-like +operating systems. If an operating system uses a different memory +layout, it may need to provide its own functions which drivers can +use. +
      +
    When using this function, the driver does not need to care about +DMA offsets at all. +
      + + + + + + + + + +
    handle Device handle +
      +
    address Address in virtual CPU space +
      +
    pointer Pointer to mem-struct for results +
      + +
    + +
    Ergebnis: PCI-BIOS Fehlercodes. If successful, mem-struct is filled as +follows: +
      + + + + + + +
    uint32_t PCI bus address +
    uint32_t length of contiguous mapped area, 0 if no DMA is possible at +this address + +
    + +
    Verfügbar: PCI-BIOS +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding   bus_to_virt   get_pagesize   phys_to_virt   +virt_to_phys +
      + +
    + +

    4.17.33.1 Bindings für virt_to_bus

    + + + + + + +
    C: #include <tos.h> +
      +
    int32_t virt_to_bus (int32_t handle, uint32_t address, uint32_t +*pointer); +
      +
    Assembler: +
      +
    pea       pointer       ; Offset 10
    +move.l    address,-(sp) ; Offset 6
    +move.l    handle,-(sp)  ; Offset 2
    +move.w    #339,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +lea       14(sp),sp     ; Stack korrigieren
    +
    + +
    + +

    4.17.34 virt_to_phys

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Virtual To Physical« - Convert virtual to physical CPU +address +
      +
    Xbiosnummer: 341 +
      +
    Deklaration: int32_t virt_to_phys (uint32_t address, uint32_t *pointer); +
      +
    Beschreibung: This function converts from virtual addresses to physical CPU +addresses. This is necessary since the memory may be mapped non-linear +by the PMMU even when not using virtual memory (it is on the MILAN). +
      +
    It does not depend on a special device, thus it does not get a +device handle. +
      +
    This function might be limited to TOS or TOS-like +operating systems. If an operating system uses a different memory +layout, it may need to provide its own functions which drivers can +use. +
      +
    When using this function, the driver does not need to care about +DMA offsets at all. +
      + + + + + + +
    address Address in virtual CPU space +
      +
    pointer Pointer to mem-struct for results +
      + +
    + +
    Ergebnis: PCI-BIOS Fehlercodes. If successful, mem-struct is filled as +follows: +
      + + + + + + +
    uint32_t physical CPU address +
    uint32_t length of contiguous mapped area, 0 if not mapped + +
    + +
    Verfügbar: PCI-BIOS +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding   bus_to_virt   get_pagesize   phys_to_virt   +virt_to_bus +
      + +
    + +

    4.17.34.1 Bindings für virt_to_phys

    + + + + + + +
    C: #include <tos.h> +
      +
    int32_t virt_to_phys (uint32_t address, uint32_t *pointer); +
      +
    Assembler: +
      +
    pea       pointer       ; Offset 6
    +move.l    address,-(sp) ; Offset 2
    +move.w    #341,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +lea       10(sp),sp     ; Stack korrigieren
    +
    + +
    + +

    4.17.35 write_config_byte

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: <Write Configuration Byte> +
      +
    Xbiosnummer: 308 +
      +
    Deklaration: int32_t write_config_byte (int32_t handle, uint8_t reg, uint8_t +val); +
      +
    Beschreibung: Dies Routine dient zum Schreiben von Konfigurationsregistern +eines PCI-Gerätes. +
      + + + + + + + + + +
    handle Geräte-Handle des gewählten PCI-Gerätes +
      +
    reg Adresse des Konfigurationsregisters (0,1,2,... für +Byte-Zugriffe) +
      +
    val zu schreibender Registerwert +
      + +
    + +
    Ergebnis: PCI-BIOS Fehlercodes +
      +
    Verfügbar: PCI-BIOS V2.00 +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding   write_config_word   write_config_longword   +read_config_byte   read_config_word   read_config_longword +
      + +
    + +

    4.17.35.1 Bindings für write_config_byte

    + + + + + + +
    C: #include <tos.h> +
      +
    int32_t write_config_byte (int32_t handle, uint8_t reg, uint8_t +val); +
      +
    Assembler: +
      +
    move.w    val,-(sp)     ; Offset 7
    +move.w    reg,-(sp)     ; Offset 6
    +move.l    handle,-(sp)  ; Offset 2
    +move.w    #308,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +lea       10(sp),sp     ; Stack korrigieren
    +
    + +
    + +

    4.17.36 write_config_longword

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Write configuration longword« +
      +
    Xbiosnummer: 310 +
      +
    Deklaration: int32_t write_config_longword (int32_t handle, uint8_t reg, +uint32_t val); +
      +
    Beschreibung: Dies Routine dient zum Schreiben von Konfigurationsregistern +eines PCI-Gerätes. +
      + + + + + + + + + +
    handle Geräte-Handle des gewählten PCI-Gerätes +
      +
    reg Adresse des Konfigurationsregisters (0,4,8,... für +Langwort-Zugriffe) +
      +
    val zu schreibender Registerwert +
      + +
    + +
    Ergebnis: PCI-BIOS Fehlercodes +
      +
    Verfügbar: PCI-BIOS V2.00 +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding   write_config_byte   write_config_word   +read_config_byte   read_config_word   read_config_longword +
      + +
    + +

    4.17.36.1 Bindings für write_config_longword

    + + + + + + +
    C: #include <tos.h> +
      +
    int32_t write_config_longword (int32_t handle, uint8_t reg, +uint32_t val); +
      +
    Assembler: +
      +
    move.l    val,-(sp)     ; Offset 8
    +move.w    reg,-(sp)     ; Offset 6
    +move.l    handle,-(sp)  ; Offset 2
    +move.w    #310,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +lea       12(sp),sp     ; Stack korrigieren
    +
    + +
    + +

    4.17.37 write_config_word

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Write configuration word« +
      +
    Xbiosnummer: 309 +
      +
    Deklaration: int32_t write_config_word (int32_t handle, uint8_t reg, +uint16_t val); +
      +
    Beschreibung: Dies Routine dient zum Schreiben von Konfigurationsregistern +eines PCI-Gerätes. +
      + + + + + + + + + +
    handle Geräte-Handle des gewählten PCI-Gerätes +
      +
    reg Adresse des Konfigurationsregisters (0,2,4,... für +Wort-Zugriffe) +
      +
    val zu schreibender Registerwert +
      + +
    + +
    Ergebnis: PCI-BIOS Fehlercodes +
      +
    Verfügbar: PCI-BIOS V2.00 +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding   write_config_byte   write_config_longword   +read_config_byte   read_config_word   read_config_longword +
      + +
    + +

    4.17.37.1 Bindings für write_config_word

    + + + + + + +
    C: #include <tos.h> +
      +
    int32_t write_config_word (int32_t handle, uint8_t reg, uint16_t +val); +
      +
    Assembler: +
      +
    move.w    val,-(sp)     ; Offset 8
    +move.w    reg,-(sp)     ; Offset 6
    +move.l    handle,-(sp)  ; Offset 2
    +move.w    #309,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +lea       10(sp),sp     ; Correct stack
    +
    + +
    + +

    4.17.38 write_io_byte

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Write IO Byte« +
      +
    Xbiosnummer: 334 +
      +
    Deklaration: int32_t write_io_byte (int32_t handle, uint32_t offset, uint8_t +val); +
      +
    Beschreibung: This function writes 8-bit values to a IO region. +
      + + + + + + + + + +
    handle Device handle +
      +
    offset Address to access (in PCI IO address space) +
      +
    val Data to write (8 bits) +
      + +
    + +
    Ergebnis: PCI-BIOS Fehlercodes +
      +
    Verfügbar: PCI-BIOS +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding   write_io_word   write_io_longword   read_io_byte   +read_io_word   read_io_longword +
      + +
    + +

    4.17.38.1 Bindings für write_io_byte

    + + + + + + +
    C: #include <tos.h> +
      +
    int32_t write_io_byte (int32_t handle, uint32_t offset, uint8_t +val); +
      +
    Assembler: +
      +
    move.w    val,-(sp)     ; Offset 10
    +move.l    offset,-(sp)  ; Offset 6
    +move.l    handle,-(sp)  ; Offset 2
    +move.w    #334,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +lea       12(sp),sp     ; Stack korrigieren
    +
    + +
    + +

    4.17.39 write_io_longword

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Write IO Longword« +
      +
    Xbiosnummer: 336 +
      +
    Deklaration: int32_t write_io_longword (int32_t handle, uint32_t offset, +uint32_t val); +
      +
    Beschreibung: This function writes 32-bit values to a IO region and take care +of the byte ordering - ie. the data and address are converted as if +Motorola byte ordering was in use. +
      + + + + + + + + + +
    handle Device handle +
      +
    offset Address to access (in PCI IO address space) +
      +
    val Data to write (32 bits) +
      + +
    + +
    Ergebnis: PCI-BIOS Fehlercodes +
      +
    Verfügbar: PCI-BIOS +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding   write_io_byte   write_io_word   read_io_byte   +read_io_word   read_io_longword +
      + +
    + +

    4.17.39.1 Bindings für write_io_longword

    + + + + + + +
    C: #include <tos.h> +
      +
    int32_t write_io_longword (int32_t handle, uint32_t offset, +uint32_t val); +
      +
    Assembler: +
      +
    move.l    val,-(sp)     ; Offset 10
    +move.l    offset,-(sp)  ; Offset 6
    +move.l    handle,-(sp)  ; Offset 2
    +move.w    #336,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +lea       14(sp),sp     ; Stack korrigieren
    +
    + +
    + +

    4.17.40 write_io_word

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Write IO Word« +
      +
    Xbiosnummer: 335 +
      +
    Deklaration: int32_t write_io_word (int32_t handle, uint32_t offset, +uint16_t val); +
      +
    Beschreibung: This function writes 16-bit values to a IO region and take care +of the byte ordering - ie. the data and address are converted as if +Motorola byte ordering was in use. +
      + + + + + + + + + +
    handle Device handle +
      +
    offset Address to access (in PCI IO address space) +
      +
    val Data to write (16 bits) +
      + +
    + +
    Ergebnis: PCI-BIOS Fehlercodes +
      +
    Verfügbar: PCI-BIOS +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding   write_io_byte   write_io_longword   read_io_byte   +read_io_word   read_io_longword +
      + +
    + +

    4.17.40.1 Bindings für write_io_word

    + + + + + + +
    C: #include <tos.h> +
      +
    int32_t write_io_word (int32_t handle, uint32_t offset, uint16_t +val); +
      +
    Assembler: +
      +
    move.w    val,-(sp)     ; Offset 10
    +move.l    offset,-(sp)  ; Offset 6
    +move.l    handle,-(sp)  ; Offset 2
    +move.w    #335,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +lea       12(sp),sp     ; Stack korrigieren
    +
    + +
    + +

    4.17.41 write_mem_byte

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Write Memory Byte« +
      +
    Xbiosnummer: 325 +
      +
    Deklaration: int32_t write_mem_byte (int32_t handle, uint32_t offset, +uint8_t val); +
      +
    Beschreibung: This function writes 8-bit values to a memory region. A driver +can use this function for access to registers and small buffers. For +larger amounts of data, the driver can choose to use his own copy +routines. +
      + + + + + + + + + +
    handle Device handle +
      +
    offset Address to access (in PCI memory address space) +
      +
    val Data to write (8 bits) +
      + +
    + +
    Ergebnis: PCI-BIOS Fehlercodes +
      +
    Verfügbar: PCI-BIOS +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding   write_mem_word   write_mem_longword   read_mem_byte   +read_mem_word   read_mem_longword +
      + +
    + +

    4.17.41.1 Bindings für write_mem_byte

    + + + + + + +
    C: #include <tos.h> +
      +
    int32_t write_mem_byte (int32_t handle, uint32_t offset, uint8_t +val); +
      +
    Assembler: +
      +
    move.w    val,-(sp)     ; Offset 10
    +move.l    offset,-(sp)  ; Offset 6
    +move.l    handle,-(sp)  ; Offset 2
    +move.w    #325,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +lea       12(sp),sp     ; Stack korrigieren
    +
    + +
    + +

    4.17.42 write_mem_longword

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Write Memory Longword« +
      +
    Xbiosnummer: 327 +
      +
    Deklaration: int32_t write_mem_longword (int32_t handle, uint32_t offset, +uint32_t val); +
      +
    Beschreibung: This function writes 32-bit values to a memory region and take +care of the byte ordering - ie. the data and address are converted as +if Motorola byte ordering was in use. A driver can use this function +for access to registers and small buffers. For larger amounts of data, +the driver can choose to use his own copy routines, provided it knows +the byte order in use. +
      + + + + + + + + + +
    handle Device handle +
      +
    offset Address to access (in PCI memory address space) +
      +
    val Data to write (32 bits) +
      + +
    + +
    Ergebnis: PCI-BIOS Fehlercodes +
      +
    Verfügbar: PCI-BIOS +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding   write_mem_byte   write_mem_word   read_mem_byte   +read_mem_word   read_mem_longword +
      + +
    + +

    4.17.42.1 Bindings für write_mem_longword

    + + + + + + +
    C: #include <tos.h> +
      +
    int32_t write_mem_longword (int32_t handle, uint32_t offset, +uint32_t val); +
      +
    Assembler: +
      +
    move.l    val,-(sp)     ; Offset 10
    +move.l    offset,-(sp)  ; Offset 6
    +move.l    handle,-(sp)  ; Offset 2
    +move.w    #327,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +lea       14(sp),sp     ; Stack korrigieren
    +
    + +
    + +

    4.17.43 write_mem_word

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Write Memory Word« +
      +
    Xbiosnummer: 326 +
      +
    Deklaration: int32_t write_mem_word (int32_t handle, uint32_t offset, +uint16_t val); +
      +
    Beschreibung: This function writes 16-bit values to a memory region and take +care of the byte ordering - ie. the data and address are converted as +if Motorola byte ordering was in use. A driver can use this function +for access to registers and small buffers. For larger amounts of data, +the driver can choose to use his own copy routines, provided it knows +the byte order in use. +
      + + + + + + + + + +
    handle Device handle +
      +
    offset Address to access (in PCI memory address space) +
      +
    val Data to write (16 bits) +
      + +
    + +
    Ergebnis: PCI-BIOS Fehlercodes +
      +
    Verfügbar: PCI-BIOS +
      +
    Gruppe: PCI-BIOS +
      +
    Querverweis: Binding   write_mem_byte   write_mem_longword   read_mem_byte   +read_mem_word   read_mem_longword +
      + +
    + +

    4.17.43.1 Bindings für write_mem_word

    + + + + + + +
    C: #include <tos.h> +
      +
    int32_t write_mem_word (int32_t handle, uint32_t offset, +uint16_t val); +
      +
    Assembler: +
      +
    move.w    val,-(sp)     ; Offset 10
    +move.l    offset,-(sp)  ; Offset 6
    +move.l    handle,-(sp)  ; Offset 2
    +move.w    #326,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +lea       12(sp),sp     ; Stack korrigieren
    +
    + +
    + +

    4.17.44 PCI-BIOS Fehlercodes

    +

    Die folgende Fehlercodes können im Fehlerfall von den +BIOS-Routinen zurückgeliefert werden. +

    + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    0x00000000PCI_SUCCESSFUL
    0xFFFFFFFEPCI_FUNC_NOT_SUPPORTED
    0xFFFFFFFDPCI_BAD_VENDOR_ID
    0xFFFFFFFCPCI_DEVICE_NOT_FOUND
    0xFFFFFFFBPCI_BAD_REGISTER_NUMBER
    0xFFFFFFFAPCI_SET_FAILED
    0xFFFFFFF9PCI_BUFFER_TOO_SMALL
    0xFFFFFFF8PCI_GENERAL_ERROR
    0xFFFFFFF7PCI_BAD_HANDLE
    +
    + +

    Die folgenden beiden Fehlercodes werden zwar nicht von den +BIOS-Routinen selbst verwendet, sind aber für eine PCI-Library +reserviert. +

    + + +
    + + + + + + + + +
    0xFFFFF001PCI_BIOS_NOT_INSTALLED
    0xFFFFF000PCI_BIOS_WRONG_VERSION
    +
    + +
    + +Home +XBIOSXBIOS +OverScan-XBIOS-ErweiterungenOverScan-XBIOS-Erweiterungen +SchnittstellenprogrammierungSchnittstellenprogrammierung + + diff --git a/de/PrintDesc.html b/de/PrintDesc.html new file mode 100644 index 000000000..2c82c3177 --- /dev/null +++ b/de/PrintDesc.html @@ -0,0 +1,45 @@ + + + + + +Die Anleitung zum TOS: PrintDesc + + + + + + + + + +Home +TypdefinitionenTypdefinitionen +OSHEADEROSHEADER +RGB_LISTRGB_LIST + +
    + +

    I.15 PrintDesc

    +

    Diese Struktur spielt im Zusammenhang mit MagiC Mac eine Rolle, +und ist wie folgt definiert: +

    +
    typedef struct
    +{
    +    THPrint     printHdl;       /* Printer-Konfiguration für NVDI */
    +    PrSetupProc doPrintSetup;   /* dto.                           */
    +    VoidProcPtr saveSetup;      /* dto.                           */
    +    int32_t     reserved[7];    /* reserviert                     */
    +} PrintDesc;
    +
    +

    Querverweis: Cookie von MagiC Mac +

    +
    + +Home +TypdefinitionenTypdefinitionen +OSHEADEROSHEADER +RGB_LISTRGB_LIST + + diff --git a/de/RGB_LIST.html b/de/RGB_LIST.html new file mode 100644 index 000000000..833d0752d --- /dev/null +++ b/de/RGB_LIST.html @@ -0,0 +1,41 @@ + + + + + +Die Anleitung zum TOS: RGB_LIST + + + + + + + + + +Home +TypdefinitionenTypdefinitionen +PrintDescPrintDesc +THREADINFOTHREADINFO + +
    + +

    I.16 RGB_LIST

    +
    typedef struct
    +{
    +    uint16_t red;     /* Rot-Anteil  in Promille */
    +    uint16_t green;   /* Grün-Anteil in Promille */
    +    uint16_t blue;    /* Blau-Anteil in Promille */
    +} RGB_LIST;
    +
    +

    Querverweis: XIMG-Format +

    +
    + +Home +TypdefinitionenTypdefinitionen +PrintDescPrintDesc +THREADINFOTHREADINFO + + diff --git a/de/Screen_functions.html b/de/Screen_functions.html new file mode 100644 index 000000000..fda0b4fef --- /dev/null +++ b/de/Screen_functions.html @@ -0,0 +1,3216 @@ + + + + + +Die Anleitung zum TOS: Bildschirmfunktionen + + + + + + + + + +Home +XBIOSXBIOS +xbios-Trapxbios-Trap +CENTScreen-XBIOS-ErweiterungCENTScreen-XBIOS-Erweiterung + +
    + +

    4.5 Bildschirmfunktionen

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Cursconf Cursordarstellung ändern oder ermitteln. +
    EgetPalette Farbtabelle lesen. +
    EgetShift Shift Mode Register lesen. +
    EsetBank Farbtabelle setzen. +
    EsetColor Farbtabelleneintrag setzen. +
    EsetGray Farbinterpretation setzen. +
    EsetPalette Farbtabelle laden. +
    EsetShift Shift Mode Register setzen. +
    EsetSmear Farbverwischung setzen. +
    Getrez Auflösung ermitteln. +
    Initmouse Mauszeiger initialisieren. +
    Logbase Adresse des logischen Bildschirmspeichers ermitteln. +
    mon_type Monitortyp ermitteln. +
    Physbase Adresse des physikal. Bildschirmspeichers ermitteln. +
    Setcolor Farbe einstellen. +
    Setpalette Farbpalette auswählen. +
    Setscreen Festlegen der Bildschirmauflösung und -adressen. +
    ValidMode Validates a mode code. +
    VgetRGB RGB-Wert einer Farbe ermitteln. +
    VsetScreen Festlegen der Bildschirmauflösung und -adressen +
    VgetSize Größe des Bildschirmpuffers ermitteln. +
    VsetMask Transparenz für True-Color setzen. +
    VsetMode Videohardwareregister setzen. +
    VsetRGB RGB-Wert einer Farbe setzen. +
    VsetSync Synchronisationsart setzen. +
    Vsync Vertikales Synchronisationssignal abfragen. + +
    + +

    4.5.1 Cursconf

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »cursor configuration« - legt die Arbeitsweise des Cursors +fest. +
      +
    Xbiosnummer: 21 +
      +
    Deklaration: int16_t Cursconf( int16_t func, int16_t rate ); +
      +
    Beschreibung: Die XBIOS-Routine Cursconf verändert das Aussehen und +wahlweise die Blinkgeschwindigkeit des Cursors. Der Parameter +func kann folgende Werte annehmen: +
      + + + + + + + + + + + + + + + + + + + + + + + + +
    func Bedeutung +
        +
     0 Cursor abschalten +
     1 Cursor einschalten +
     2 Cursor blinkt +
     3 Cursor blinkt nicht +
     4 Die Blinkgeschwindigkeit des Cursors wird auf den Wert +rate gesetzt. +
     5 Liefert die aktuelle Blinkfrequenz + +
    + +
    Hinweis: Der Parameter rate soll in Schritten +der Wiederholfrequenz des Bildschirms verwendet werden. +
      +
    Ergebnis: Die Funktion liefert nur dann ein definiertes Ergebnis, +nämlich die Blinkfrequenz, wenn im Parameter func die Zahl 5 +übergeben wurde. +
      +
    Verfügbar: Alle TOS Versionen +
      +
    Gruppe: Bildschirmfunktionen +
      +
    Querverweis: Binding +
      + +
    + +

    4.5.1.1 Bindings für Cursconf

    + + + + + + +
    C: #include <tos.h> +
      +
    int16_t Cursconf( int16_t func, int16_t rate ); +
      +
    Assembler: +
      +
    move.w    rate,-(sp)   ; Offset 4
    +move.w    func,-(sp)   ; Offset 2
    +move.w    #21,-(sp)    ; Offset 0
    +trap      #14          ; XBIOS aufrufen
    +addq.l    #6,sp        ; Stack korrigieren
    +
    + +
    + +

    4.5.2 EgetPalette

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Get look up table registers« - Liest mehrere Einträge aus +der Farbtabelle. +
      +
    Xbiosnummer: 85 +
      +
    Deklaration: void EgetPalette( int16_t colorNum, int16_t count, int16_t +*palettePtr ); +
      +
    Beschreibung: Die XBIOS-Routine EgetPalette liest einen zusammenhängenden +Bereich aus den TT-Farbregistern aus. +
      + + + + + + + + + + + + + + + +
    Parameter Bedeutung +
        +
    colorNum erstes auszulesendes Farbregister +
    count Anzahl der auszulesenden Farbregister +
    palettePtr Zeiger auf zu übertragende Farbpalette (dieser muß gerade +sein). + +
    + +
    Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
      +
    Verfügbar: Die Funktion steht nur im TOS des Atari-TT zur Verfügung. +
      +
    Gruppe: Bildschirmfunktionen +
      +
    Querverweis: Binding   EsetPalette +
      + +
    + +

    4.5.2.1 Bindings für EgetPalette

    + + + + + + +
    C: #include <tos.h> +
      +
    void EgetPalette( int16_t colorNum, int16_t count, int16_t +*palettePtr ); +
      +
    Assembler: +
      +
    pea       palettePtr      ; Offset 6
    +move.w    count,-(sp)     ; Offset 4
    +move.w    colorNum,-(sp)  ; Offset 2
    +move.w    #85,-(sp)       ; Offset 0
    +trap      #14             ; XBIOS aufrufen
    +lea       $A(sp),sp       ; Stack korrigieren
    +
    + +
    + +

    4.5.3 EgetShift

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Get current shift mode value« - Liest das Shift Mode +Register. +
      +
    Xbiosnummer: 81 +
      +
    Deklaration: int16_t EgetShift( void ); +
      +
    Beschreibung: Die XBIOS-Routine EgetShift liest das Shift Mode Register aus +und liefert den Inhalt des Registers als Ergebnis zurück. +
      +
    Ergebnis: Die Funktion liefert den Wert des Registers gemäß folgender +Belegung: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + +
    BitBedeutung
    0..3Nummer der Farbregister-Bank
    8..10Modus, gemäß Getrez
    12Hyper-Mono (vgl. EsetGray)
    15Smear-Modus (vgl. EsetSmear)
    +
    + +
    Verfügbar: Die Funktion steht nur im TOS des Atari-TT zur Verfügung. +
      +
    Gruppe: Bildschirmfunktionen +
      +
    Querverweis: Binding   EsetShift +
      + +
    + +

    4.5.3.1 Bindings für EgetShift

    + + + + + + +
    C: #include <tos.h> +
      +
    int16_t EgetShift( void ); +
      +
    Assembler: +
      +
    move.w    #81,-(sp)    ; Offset 0
    +trap      #14          ; XBIOS aufrufen
    +addq.l    #2,sp        ; Stack korrigieren
    +
    + +
    + +

    4.5.4 EsetBank

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Set color look up bank« - Setzt Bank für Farbtabelle. +
      +
    Xbiosnummer: 82 +
      +
    Deklaration: int16_t EsetBank( int16_t bankNum ); +
      +
    Beschreibung: Die XBIOS-Routine EsetBank setzt die Banknummer für die +Farbtabelle des TT auf den Wert bankNum. Der erlaubte Wert von +bankNum liegt zwischen 0 und 15. Ist bankNum negativ, wird die +aktuelle Einstellung nicht verändert. +
      +
    Ergebnis: Die Funktion liefert die vorherige Einstellung. +
      +
    Verfügbar: Die Funktion steht nur im TOS des Atari-TT zur Verfügung. +
      +
    Gruppe: Bildschirmfunktionen +
      +
    Querverweis: Binding +
      + +
    + +

    4.5.4.1 Bindings für EsetBank

    + + + + + + +
    C: #include <tos.h> +
      +
    int16_t EsetBank( int16_t bankNum ); +
      +
    Assembler: +
      +
    move.w    bankNum,-(sp)  ; Offset 2
    +move.w    #82,-(sp)      ; Offset 0
    +trap      #14            ; XBIOS aufrufen
    +addq.l    #4,sp          ; Stack korrigieren
    +
    + +
    + +

    4.5.5 EsetColor

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Set color entry« - Schreibt einen Eintrag in die +Farbtabelle. +
      +
    Xbiosnummer: 83 +
      +
    Deklaration: int16_t EsetColor( int16_t colorNum, int16_t color ); +
      +
    Beschreibung: Die XBIOS-Routine EsetColor setzt den Farbeintrag +colorNum (0..255) in der Farbtabelle auf den Wert +color; ein negativer Wert verändert den Eintag nicht. +
      +
    Ergebnis: Die Funktion liefert die vorherige Einstellung. +
      +
    Verfügbar: Die Funktion steht nur im TOS des Atari-TT zur Verfügung. +
      +
    Gruppe: Bildschirmfunktionen +
      +
    Querverweis: Binding   Setcolor +
      + +
    + +

    4.5.5.1 Bindings für EsetColor

    + + + + + + +
    C: #include <tos.h> +
      +
    int16_t EsetColor( int16_t colorNum, int16_t color ); +
      +
    Assembler: +
      +
    move.w    color,-(sp)     ; Offset 4
    +move.w    colorNum,-(sp)  ; Offset 2
    +move.w    #83,-(sp)       ; Offset 0
    +trap      #14             ; XBIOS aufrufen
    +addq.l    #6,sp           ; Stack korrigieren
    +
    + +
    + +

    4.5.6 EsetGray

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Set/clear gray mode« - Schaltet die Farbinterpretation ein +bzw. aus. +
      +
    Xbiosnummer: 86 +
      +
    Deklaration: int16_t EsetGray( int16_t switch ); +
      +
    Beschreibung: Die XBIOS-Routine EsetGray schaltet die Farbinterpretation in +der Farbtabelle als Graustufe ein (1) bzw. aus (0). Ein negativer Wert +verändert die Einstellung nicht. +
      +
    Im Graustufen-Modus kann anstelle von 4096 Farbtönen aus einer +Palette von 256 Graustufen gewählt werden. +
      +
    Ergebnis: Die Funktion liefert die bisherige Einstellung. +
      +
    Verfügbar: Die Funktion steht nur im TOS des Atari-TT zur Verfügung (when +the high word of the '_VDO' cookie has the value of 2). +
      +
    Gruppe: Bildschirmfunktionen +
      +
    Querverweis: Binding +
      + +
    + +

    4.5.6.1 Bindings für EsetGray

    + + + + + + +
    C: #include <tos.h> +
      +
    int16_t EsetGray( int16_t switch ); +
      +
    Assembler: +
      +
    move.w    switch,-(sp) ; Offset 2
    +move.w    #86,-(sp)    ; Offset 0
    +trap      #14          ; XBIOS aufrufen
    +addq.l    #4,sp        ; Stack korrigieren
    +
    + +
    + +

    4.5.7 EsetPalette

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Set palette registers« - Setzt mehrere Einträge in der +Farbtabelle. +
      +
    Xbiosnummer: 84 +
      +
    Deklaration: void EsetPalette( int16_t colorNum, int16_t count, int16_t +*palettePtr ); +
      +
    Beschreibung: Die XBIOS-Routine EsetPalette setzt count Farbeinträge +ab colorNum in der Farbtabelle auf die Werte im Array +palettePtr. +
      +
    Ergebnis: Die Funktion hat kein Ergebnis. +
      +
    Verfügbar: Die Funktion steht nur im TOS des Atari-TT zur Verfügung. +
      +
    Gruppe: Bildschirmfunktionen +
      +
    Querverweis: Binding   EgetPalette +
      + +
    + +

    4.5.7.1 Bindings für EsetPalette

    + + + + + + +
    C: #include <tos.h> +
      +
    void EsetPalette( int16_t colorNum, int16_t count, int16_t +*palettePtr ); +
      +
    Assembler: +
      +
    pea       palettePtr      ; Offset 6
    +move.w    count,-(sp)     ; Offset 4
    +move.w    colorNum,-(sp)  ; Offset 2
    +move.w    #84,-(sp)       ; Offset 0
    +trap      #14             ; XBIOS aufrufen
    +lea       $A(sp),sp       ; Stack korrigieren
    +
    + +
    + +

    4.5.8 EsetShift

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Set shift mode register« - Setzt das Shift Mode Register. +
      +
    Xbiosnummer: 80 +
      +
    Deklaration: int16_t EsetShift( int16_t shftMode ); +
      +
    Beschreibung: Die XBIOS-Routine EsetShift schreibt in das Shift Mode +Register des TT den Wert shftMode. shftMode ist ein Bitfeld +mit folgender Bedeutung: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + +
    BitBedeutung
    0..3Nummer der Farbregister-Bank
    8..10Modus, gemäß Getrez
    12Hyper-Mono (vgl. EsetGray)
    15Smear-Modus (vgl. EsetSmear)
    +
    + +
    Ergebnis: Die Funktion liefert den vorherigen Wert des Registers. +
      +
    Verfügbar: Die Funktion steht nur im TOS des Atari-TT zur Verfügung. +
      +
    Gruppe: Bildschirmfunktionen +
      +
    Querverweis: Binding   EgetShift +
      + +
    + +

    4.5.8.1 Bindings für EsetShift

    + + + + + + +
    C: #include <tos.h> +
      +
    int16_t EsetShift( int16_t shftMode ); +
      +
    Assembler: +
      +
    move.w    shftMode,-(sp)  ; Offset 2
    +move.w    #80,-(sp)       ; Offset 0
    +trap      #14             ; XBIOS aufrufen
    +addq.l    #4,sp           ; Stack korrigieren
    +
    + +
    + +

    4.5.9 EsetSmear

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Set/clear video smear mode« - Schaltet die Farbverwischung +ein bzw. aus. +
      +
    Xbiosnummer: 87 +
      +
    Deklaration: int16_t EsetSmear( int16_t switch ); +
      +
    Beschreibung: Die XBIOS-Routine EsetSmear erlaubt die Umschaltung des +Smear-Modus des TT-Videobausteins. Im Smear-Modus wird anstelle der +Hintergrundfarbe (Farbe 0) die jeweils zuletzt dargestellte Farbe +gezeichnet. Es gilt: +
      +

    +
    + + + + + + + + + + + + + + + + +
    switchBedeutung
    <0bisherigen Wert abfragen
    0Smear-Modus aus
    >0Smear-Modus ein
    +
    + +
    Ergebnis: Die Funktion liefert die bisherige Einstellung. +
      +
    Verfügbar: Die Funktion steht nur im TOS des Atari-TT zur Verfügung. +
      +
    Gruppe: Bildschirmfunktionen +
      +
    Querverweis: Binding +
      + +
    + +

    4.5.9.1 Bindings für EsetSmear

    + + + + + + +
    C: #include <tos.h> +
      +
    int16_t EsetSmear( int16_t switch ); +
      +
    Assembler: +
      +
    move.w    switch,-(sp)  ; Offset 2
    +move.w    #87,-(sp)     ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +addq.l    #4,sp         ; Stack korrigieren
    +
    + +
    + +

    4.5.10 Getrez

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »get resolution« - ermittelt die Auflösung des Bildschirms. +
      +
    Xbiosnummer: 4 +
      +
    Deklaration: int16_t Getrez( void ); +
      +
    Beschreibung: Die XBIOS-Routine Getrez ermittelt die Auflösung des +Bildschirms. +
      +
    Ergebnis: Die Funktion liefert als Ergebnis folgende Werte: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    WerteBedeutung
    0 320*200 (vier Planes)
    1 640*200 (zwei Planes)
    2 640*400 (ein Plane)
    4 640*480 (vier Planes, nur TT)
    61280*960 (ein Plane, nur TT)
    7 320*480 (acht Planes, nur TT)
    +
    + +
    Alle anderen Werte sind für zukünftige Erweiterungen +reserviert. +
      +
    Hinweis: Vom Standpunkt der sauberen Programmierung +betrachtet, sollte diese Funktion auf keinen Fall benutzt +werden. Insbesondere beim Einsatz von Grafikkarten hat sie +praktisch keinen Aussagewert. Stattdessen sollte die Auflösung des +Bildschirms über das VDI (v_opnvwk) ermittelt werden. +
      +
    Verfügbar: Alle TOS Versionen +
      +
    Gruppe: Bildschirmfunktionen +
      +
    Querverweis: Binding   v_opnvwk +
      + +
    + +

    4.5.10.1 Bindings für Getrez

    + + + + + + +
    C: #include <portab.h> +
    #include <tos.h> +
      +
    int16_t Getrez( void ); +
      +
    Assembler: +
      +
    move.w    #4,-(sp)     ; Offset 0
    +trap      #14          ; XBIOS aufrufen
    +addq.l    #2,sp        ; Stack korrigieren
    +
    + +
    + +

    4.5.11 Initmouse

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »initialize mouse« - initialisiert die Maus. +
      +
    Xbiosnummer: 0 +
      +
    Deklaration: void Initmouse( int16_t type, MOUSE *par, void (*mousevec)() ); +
      +
    Beschreibung: Initmouse ist eine XBIOS-Routine zur Low-Level-Initialisierung +der Maus. Der Parameter type legt die Betriebsart der Maus +fest. Es gilt: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    typeBedeutung
    0Maus abschalten
    1Maus einschalten, Relativ-Modus
    2Maus einschalten, Absolut-Modus
    3reserviert
    4Maus einschalten, Tastaturemulation
    +
    + +
    Die Bytes von 4 bis 11 des Parameters par werden nur +dann verwendet, wenn die Maus im Absolut-Modus arbeiten soll. Mit +mousevec kann ein neuer Interrupt-Vektors der Maus gesetzt +werden. Der Vektor wird zurückgesetzt wenn die Maus abgeschaltet wird +(type=0). +
      +
    Ergebnis: Die Funktion liefert -1 alles OK ist oder 0 falls ein Fehler +aufgetreten ist. +
      +
    Verfügbar: Alle TOS Versionen +
      +
    Gruppe: Bildschirmfunktionen +
      +
    Querverweis: Binding   MOUSE +
      + +
    + +

    4.5.11.1 Bindings für Initmouse

    + + + + + + +
    C: #include <tos.h> +
      +
    void Initmouse( int16_t type, MOUSE *par, void (*mousevec)() ); +
      +
    Assembler: +
      +
    pea       mousevec     ; Offset 8
    +pea       par          ; Offset 4
    +move.w    type,-(sp)   ; Offset 2
    +move.w    #0,-(sp)     ; Offset 0
    +trap      #14          ; XBIOS aufrufen
    +lea       12(sp),sp    ; Stack korrigieren
    +
    + +
    + +

    4.5.12 Logbase

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »logical screen RAM base« - ermittelt die logische +Anfangsadresse des Videospeichers. +
      +
    Xbiosnummer: 3 +
      +
    Deklaration: void *Logbase( void ); +
      +
    Beschreibung: Die XBIOS-Routine Logbase ermittelt die logische +Anfangsadresse des momentan als Videospeicher verwendeten +RAM-Bereichs. +
      +
    Ergebnis: Die Funktion liefert als Ergebnis die Anfangsadresse des +logischen Bildschirmspeichers. +
      +
    Verfügbar: Alle TOS Versionen +
      +
    Gruppe: Bildschirmfunktionen +
      +
    Querverweis: Binding   Physbase   Setscreen +
      + +
    + +

    4.5.12.1 Bindings für Logbase

    + + + + + + +
    C: #include <tos.h> +
      +
    void *Logbase( void ); +
      +
    Assembler: +
      +
    move.w    #3,-(sp)     ; Offset 0
    +trap      #14          ; XBIOS aufrufen
    +addq.l    #2,sp        ; Stack korrigieren
    +
    + +
    + +

    4.5.13 mon_type

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »mon_type« - Typ des Monitors ermitteln +
      +
    Xbiosnummer: 89 +
      +
    Deklaration: int16_t mon_type( void ); +
      +
    Beschreibung: Die XBIOS-Funktion mon_type ermittelt den angeschlossenen +Monitortyp anhand von Pin 18(M1) und 19(M0) des Video-Ports. Ein 0-Bit +bedeutet Masse am entsprechenden Pin, 1-Bit bedeutet keine Verbindung. +
      +
    Ergebnis: Die Funktion liefert den angeschlossenen Monitortyp zurück. +Dabei gilt: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    WertBedeutungPin
    0ST-MonochrommonitorM1:0 M0:0
    1ST-FarbmonitorM1:0 M0:1
    2VGA-MonitorM1:1 M0:0
    3TV-GerätM1:1 M0:1
    4LCD 
    5DVI 
    +
    + +
    Die Werte vier und fünf sind nur verfügbar mit dem ct60 und +Radeon Treiber. +
      +
    Verfügbar: Die Funktion ist nur auf Computern der Falcon-Serie verfügbar. +
      +
    Gruppe: Bildschirmfunktionen +
      +
    Querverweis: Binding   VsetSync   VsetMode   VgetSize   VgetRGB   VsetRGB   +VsetMask +
      + +
    + +

    4.5.13.1 Bindings für mon_type

    + + + + + + +
    C: #include <tos.h> +
      +
    int16_t mon_type( void ); +
      +
    Assembler: +
      +
    move.w    #89,-(sp)    ; Offset 0
    +trap      #14          ; XBIOS aufrufen
    +addq.l    #2,sp        ; Stack korrigieren
    +
    + +
    + +

    4.5.14 Physbase

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »physical screen ram base« - ermittelt die Anfangsadresse des +Video-Speichers. +
      +
    Xbiosnummer: 2 +
      +
    Deklaration: void *Physbase( void ); +
      +
    Beschreibung: Die XBIOS-Routine Physbase ermittelt die physikalische +Anfangsadresse des momentan als Videospeicher verwendeten +RAM-Bereichs. +
      +
    Ergebnis: Die Funktion Physbase liefert als Ergebnis die Adresse des +physikalischen Bildschirmspeichers. +
      +
    Verfügbar: Alle TOS Versionen +
      +
    Gruppe: Bildschirmfunktionen +
      +
    Querverweis: Binding   Logbase   Setscreen +
      + +
    + +

    4.5.14.1 Bindings für Physbase

    + + + + + + +
    C: #include <tos.h> +
      +
    void *Physbase( void ); +
      +
    Assembler: +
      +
    move.w    #2,-(sp)     ; Offset 0
    +trap      #14          ; XBIOS aufrufen
    +addq.l    #2,sp        ; Stack korrigieren
    +
    + +
    + +

    4.5.15 Setcolor

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Setcolor« - legt eine von 16 Farben fest. +
      +
    Xbiosnummer: 7 +
      +
    Deklaration: int16_t Setcolor( int16_t colornum, int16_t color ); +
      +
    Beschreibung: Die XBIOS-Routine Setcolor erfragt den Wert eines Farbregisters +bzw. setzt dieses auf einen neuen Wert. Es gilt: +
      +

    +
    + + + + + + + + + + + + +
    ParameterBedeutung
    colornumNummer des Farbregisters (0..15)
    colorneuer Farbwert (-1 = nicht ändern)
    +
    + +
    Ergebnis: Die Funktion liefert den bisherigen Wert des Farbregisters. +
      +
    Verfügbar: Alle TOS Versionen +
      +
    Gruppe: Bildschirmfunktionen +
      +
    Querverweis: Binding   Setpalette +
      + +
    + +

    4.5.15.1 Bindings für Setcolor

    + + + + + + +
    C: #include <tos.h> +
      +
    int16_t Setcolor( int16_t colornum, int16_t color ); +
      +
    Assembler: +
      +
    move.w    color,-(sp)    ; Offset 4
    +move.w    colornum,-(sp) ; Offset 2
    +move.w    #7,-(sp)       ; Offset 0
    +trap      #14            ; XBIOS aufrufen
    +addq.l    #6,sp          ; Stack korrigieren
    +
    + +
    + +

    4.5.16 Setpalette

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »set palette« - wählt 16 Farben aus. +
      +
    Xbiosnummer: 6 +
      +
    Deklaration: void Setpalette( void *pallptr ); +
      +
    Beschreibung: Die XBIOS-Routine Setpalette erlaubt es, eine neue Farbpalette +an die Videohardware zu übergeben. +
      +
    Der Parameter pallptr zeigt auf eine Tabelle von +sechzehn 16-Bit Worten, die die neue Palette enthalten. Die untersten +12-Bits werden dabei für die RGB-Werte benutzt. pallptr muß +auf eine gerade Adresse zeigen. +
      +
    Da die Daten von der Funktion nicht sofort verarbeitet werden, +muß dafür gesorgt werden, daß der Zeiger pallptr selbst im +nächsten Vertical Blank noch auf etwas sinnvolles zeigt. +
      +
    Hinweis: Es sollte besser auf die entsprechenden +Funktionen des VDI zurückgegriffen werden. +
      +
    Ergebnis: Die Funktion liefert keinen Wert. +
      +
    Verfügbar: Alle TOS Versionen +
      +
    Gruppe: Bildschirmfunktionen +
      +
    Querverweis: Binding +
      + +
    + +

    4.5.16.1 Bindings für Setpalette

    + + + + + + +
    C: #include <tos.h> +
      +
    void Setpalette( void *pallptr ); +
      +
    Assembler: +
      +
    pea       pallptr      ; Offset 2
    +move.w    #6,-(sp)     ; Offset 0
    +trap      #14          ; XBIOS aufrufen
    +addq.l    #6,sp        ; Stack korrigieren
    +
    + +
    + +

    4.5.17 Setscreen

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »set screen« - initialisiert den Bildschirm. +
      +
    Xbiosnummer: 5 +
      +
    Deklaration: void Setscreen( void *laddr, void *paddr, int16_t rez ); +
      +
    Beschreibung: Die XBIOS-Routine Setscreen dient dazu, Auflösung und +Bildschirmspeicheradressen zu verändern. Es gilt: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    ParameterBedeutung
    laddrAdresse des log. Bildschirmspeichers
    paddrAdresse des phys. Bildschirmspeichers
    rez0 = ST-Niedrig
       1 = ST-Mittel
       2 = ST-Hoch
    +
    + +
    Ein Wert von -1 bedeutet in diesem Zusammenhang, daß die +entsprechende Adresse bzw. Auflösung nicht verändert wird. +
      +
    Hinweis: Es sollte stets kontrolliert werden, ob +eventuelle Veränderungen wirklich erfolgreich ausgeführt werden +konnten. Bei einer Änderung der Auflösung wird automatisch der +VT-52 Emulator initialisiert. +
      +
    Unter bestimmten Umständen gibt es eine erweiterte Version +dieser Funktion (VsetScreen). +
      +
    Ergebnis: Die Funktion liefert kein Ergebnis. +
      +
    Verfügbar: Alle TOS Versionen +
      +
    Gruppe: Bildschirmfunktionen +
      +
    Querverweis: Binding   Physbase   Logbase   Getrez +
      + +
    + +

    4.5.17.1 Bindings für Setscreen

    + + + + + + +
    C: #include <tos.h> +
      +
    void Setscreen( void *laddr, void *paddr, int16_t rez ); +
      +
    Assembler: +
      +
    move.w    rez,-(sp)    ; Offset 10
    +move.l    paddr,-(sp)  ; Offset  6
    +move.l    laddr,-(sp)  ; Offset  2
    +move.w    #5,-(sp)     ; Offset  0
    +trap      #14          ; XBIOS aufrufen
    +lea       $C(sp),sp    ; Stack korrigieren
    +
    + +
    + +

    4.5.18 Setscreen, Milan

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »set screen« - initialisiert den Bildschirm. +
      +
    Xbiosnummer: 5 +
      +
    Deklaration: void Setscreen( void *par1, void *par2, int16_t rez, int16_t +command ); +
      +
    Beschreibung: Diese XBIOS-Routine entspricht der Funktion Setscreen +allerdings mit einem zusätzlichen Parameter und dient dazu, +Auflösung und Bildschirmspeicheradressen zu verändern. +
      + +

    +
    + + + + + + + + + + + + + + + + + + + + +
    ParameterBedeutung
    par1Je nach Funktion, s.u.
    par2Je nach Funktion, s.u.
    rezimmer 0x4D49 (MI_MAGIC)
    commandKommando
    +
    + +
    Folgende Werte sind für command definiert: +
      +
    +
    +
    CMD_GETMODE (0)
    +
    +

    Getting current mode +
      +
    int32_t mode; +
    Setscreen(-1, &mode, MI_MAGIC, CMD_GETMODE); +
      +

    +

    + + +
    CMD_SETMODE (1)
    +
    +

    Set new graphic mode +
      +
    int32_t mode=0x1023 /* 800*608*16 */ +
    Setscreen(-1, mode, MI_MAGIC, CMD_SETMODE) +
      +
    BIOS and VDI will be initialised. Not the AES. +
      +

    +

    + + +
    CMD_GETINFO (2)
    +
    +

    Get screen info structure for mode +
      +

    SCREENINFO si;
    +/* Structure size has to be set         */
    +si.size=sizeof(SCREENINFO);
    +/* ID of the mode or 0 for current mode */
    +si.devID=0x1023;
    +/* status of the operation              */
    +si.scrFlags=0;
    +Setscreen(-1, &si, MI_MAGIC, CMD_GETINFO);
    +if(si.scrFlags & SCRINFO_OK)
    +  puts("OK");
    +else
    +  puts("Error");
    +
    +
    +

    + + +
    CMD_ALLOCPAGE (3)
    +
    +

    Allocate 2nd screenpage +
      +

    int32_t adr=0;      /* Frame address or -1 */
    +Setscreen(&adr, mode, MI_MAGIC, CMD_ALLOCPAGE);
    +if(adr)
    +  puts("OK");
    +else
    +  puts("Error");
    +
    +
    This only allocates one page. A further call will only return +the frame address. +
      +
    +

    + + +
    CMD_FREEPAGE (4)
    +
    +

    Release 2nd screenpage +
      +
    Setscreen(-1, -1, MI_MAGIC, CMD_FREEPAGE) +
      +
    The graphics card memory will be released again. If the second +page had still been active the call will switch back to the first page +with Logbase and Physbase set. +
      +

    +

    + + +
    CMD_FLIPPAGE (5)
    +
    +

    Switch to 2nd screenpage +
      +
    Setscreen(-1, -1, MI_MAGIC, CMD_FLIPPAGE) +
      +
    Will switch to the second screenpage. Logbase and Physbase will +be set. +
      +

    +

    + + +
    CMD_ALLOCMEM (6)
    +
    +

    Allocate memory on the graphics card +
      +

    SCRMEMBLK blk;
    +
    +blk.size=sizeof(SCRMEMBLK);
    +/* alloc a block of 200 lines*/
    +blk.blk_y=200;
    +
    +Setscreen(-1, &blk, MI_MAGIC, CMD_ALLOCMEM);
    +if(blk.blk_start)
    +  puts("OK");
    +else
    +  puts("Out of memory");
    +
    +
    The width of the block is currently always the width of the +virtual screen. For the hardware functions this block will be like a +screen (0,0,blk_w,blk_h), the coordinates start in the top left corner +(0,0). It will be internally recalculated. +
      +
    +

    + + +
    CMD_FREEMEM (7)
    +
    +

    Release graphics card memory +
      +
    Setscreen(-1, &blk, MI_MAGIC, CMD_FREEMEM) +
    blk of the block to be released. +
      +

    +

    + + +
    CMD_SETADR (8)
    +
    +

    Set screen to fixed address +
      +

    /* logical address or -1  */
    +int32_t logbase=blk.blk_start;
    +/* physical address or -1 */
    +int32_t physbase=blk.blk_start;
    +
    +Setscreen(logbase, physbase, MI_MAGIC, CMD_SETADR);
    +
    +
    +
    +
    +

    + + +
    CMD_ENUMMODES (9)
    +
    +

    Requests all available modes, since 13.01.2000 +
      +

    int32_t cdecl enumfunc(SCREENINFO *inf,int32_t flag)
    +{
    +  printf("%s\n",inf->name);
    +  return ENUMMODE_CONT;
    +}
    +
    +Setscreen(-1, &enumfunc, MI_MAGIC, CMD_ENUMMODES);
    +
    +
    The function "enumfunc" will be called once for every +available mode. ENUMMODE_EXIT (0) will cancel CMD_ENUMMODES. +ENUMMODE_CONT (1) will continue. The parameters are handed over to the +stack using the C standard. +
      +

    + +
    +
    +
    Ergebnis: Return value undefined. +
      +
    Verfügbar: Die Funktion ist ab dem MilanTOS 4.08 verfügbar. +
      +
    Gruppe: Bildschirmfunktionen +
      +
    Querverweis: Setscreen   VsetScreen   Setscreen, ct60 +
      + +
    + +

    4.5.19 Setscreen, ct60

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »set screen« - initialisiert den Bildschirm. +
      +
    Xbiosnummer: 5 +
      +
    Deklaration: void Setscreen( void *par1, void *par2, int16_t rez, int16_t +command ); +
      +
    Beschreibung: Diese XBIOS-Routine entspricht der Funktion Setscreen +allerdings mit einem zusätzlichen Parameter und dient dazu, +Auflösung und Bildschirmspeicheradressen zu verändern. +
      +

    +
    + + + + + + + + + + + + + + + + + + + + +
    ParameterBedeutung
    par1Je nach Funktion, s.u.
    par2Je nach Funktion, s.u.
    rezimmer 0x564E ('VN' für VsetScreen New)
    commandKommando
    +
    + +
    Folgende Werte sind für command definiert: +
      +
    +
    CMD_GETMODE (0)
    +
    +

    Getting current mode +
      +
    int32_t mode; +
    Setscreen(-1,&mode,0x564E,CMD_GETMODE); This function is +identical to VsetMode(-1); +
      +

    + +
    +
    CMD_SETMODE (1)
    +
    +

    Set new graphic mode +
      +
    int32_t mode=0x1023 /* 800*608*16 */ +
    Setscreen(-1,mode,0x564E,CMD_SETMODE) +
      +
    This function is identical to VsetScreen(0, 0, 3, modecode); +
    BIOS and VDI will be initialised. Not the AES. +
      +

    + +
    +
    CMD_GETINFO (2)
    +
    +

    Get screen info structure for mode +
      +

    SCREENINFO si;
    +/* Structure size has to be set         */
    +si.size=sizeof(SCREENINFO);
    +/* ID of the mode or 0 for current mode */
    +si.devID=0x1023;
    +/* status of the operation              */
    +si.scrFlags=0;
    +Setscreen(-1,&si,0x564E,CMD_GETINFO);
    +if(si.scrFlags & SCRINFO_OK)
    +  puts("OK");
    +else
    +  puts("Error");
    +
    +

    + +
    +
    CMD_ALLOCPAGE (3)
    +
    +

    Allocate screenpage +
      +

    /* Frame address or -1 */
    +int32_t adr=0;
    +Setscreen(&adr,mode,0x564E,CMD_ALLOCPAGE);
    +if(adr)
    +  puts("OK");
    +else
    +  puts("Error");
    +
    +
    This only allocates one page. A further call will only return +the frame address. +
      +

    + +
    +
    CMD_FREEPAGE (4)
    +
    +

    Release screenpage +
      +
    Setscreen(-1,-1,0x564E,CMD_FREEPAGE) +
      +
    The graphics card memory will be released again. If the second +page had still been active the call will switch back to the first page +with Logbase and Physbase set. +
      +

    + +
    +
    CMD_FLIPPAGE (5)
    +
    +

    Switch to screenpage +
      +
    Setscreen(-1,-1,0x564E,CMD_FLIPPAGE) +
      +
    Will switch to the second screenpage. Logbase and Physbase will +be set. +
      +

    + +
    +
    CMD_ALLOCMEM (6)
    +
    +

    Allocate memory on the graphics card +
      +

    SCRMEMBLK blk;
    +
    +blk.size=sizeof(SCRMEMBLK);
    +/* alloc a block of 200 lines*/
    +blk.blk_y=200;
    +
    +Setscreen(-1,&blk,0x564E,CMD_ALLOCMEM);
    +if(blk.blk_start)
    +  puts("OK");
    +else
    +  puts("Out of memory");
    +
    +
    The width of the block is currently always the width of the +virtual screen. For the hardware functions this block will be like a +screen (0,0,blk_w,blk_h), the coordinates start in the top left corner +(0,0). It will be internally recalculated. +
      +

    + +
    +
    CMD_FREEMEM (7)
    +
    +

    Release graphics card memory +
      +
    Setscreen(-1,&blk,0x564E,CMD_FREEMEM) +
    blk of the block to be released. +
      +

    + +
    +
    CMD_SETADR (8)
    +
    +

    Set screen to fixed address +
      +

    /* logical address or -1  */
    +int32_t logbase=blk.blk_start;
    +/* physical address or -1 */
    +int32_t physbase=blk.blk_start;
    +
    +Setscreen(logbase,physbase,0x564E,CMD_SETADR);
    +
    +

    + +
    +
    CMD_ENUMMODES (9)
    +
    +

    Requests all available modes, since 13.01.2000 +
      +

    int32_t cdecl enumfunc(SCREENINFO *inf,int32_t flag)
    +{
    +  printf("%s\n",inf->name);
    +  return ENUMMODE_CONT;
    +}
    +
    +Setscreen(-1,&enumfunc,0x564E,CMD_ENUMMODES);
    +
    +
    The function "enumfunc" will be called once for every +available mode. ENUMMODE_EXIT (0) will cancel CMD_ENUMMODES. +ENUMMODE_CONT (1) will continue. The parameters are handed over to the +stack using the C standard. +
      +
    +

    + + +
    CMD_TESTMODE (10)
    +
    +

    Test a graphic mode +
      +

    /* 800*600*16M */
    +int32_t modecode=VESA_600+HORFLAG2+VGA+COL80+BPS32;
    +Setscreen(-1,modecode,0x564E,CMD_TESTMODE);
    +
    +
    Only the BIOS is initialised, and a screen test arrives with +colored wide lines. +
      +
    This function not exist inside the MilanTOS. +
      +
    +

    + + +
    CMD_COPYPAGE (11)
    +
    +

    Copy screenpage +
      +

    VsetScreen(-1,0,0x564E,CMD_COPYPAGE);
    +Copy first screenpage to second screenpage
    +VsetScreen(-1,1,0x564E,CMD_COPYPAGE);
    +Copy second screenpage to first screenpage
    +
    +
    This function not exist inside the MilanTOS. +
      +
    +

    + + +
    CMD_FILLMEM (12)
    +
    +

    Fill memory on the graphics card +
      +

    SCRFILLMEMBLK blk;
    +blk.size=sizeof(SCRFILLMEMBLK);
    +blk.blk_op = BLK_COPY;
    +blk.blk_color = 0x112233;  /* background fill color */
    +
    +VsetScreen(-1,&blk,0x564E,CMD_SETMEM);
    +if(blk.blk_status == BLK_OK)
    +  puts("OK");
    +
    +
    Fill a block with a color with the GPU at (blk_x, blk_y), size +is blk_w, blk_h. +
    Note that this structure has the same size and same entry the the +structure SCRMEMBLK for the entry for size, blk_status, blk_x, blk_y, +blk_y, blk_w and blk_h for use the allocated structure with a cast. +
      +
    This function exists since the version 0x0101 of the video XBIOS +and is not inside the MilanTOS. +
      +
    +

    + + +
    CMD_COPYMEM (13)
    +
    +

    Copy memory on the graphics card +
      +

    SCRCOPYMEMBLK blk;
    +blk.size=sizeof(SCRCOPYMEMBLK);
    +
    +VsetScreen(-1,&blk,0x564E,CMD_COPYMEM);
    +if(blk.blk_status == BLK_OK)
    +  puts("OK");
    +
    +
    Copy a block with the GPU at (blk_src_x, blk_src_y) to +(blk_dst_x, blk_dst_y), size is blk_w, blk_h. +
    Note that this structure has the same size and same entry the the +structure SCRMEMBLK for the entry for size, blk_status, blk_x, blk_y, +blk_y, blk_w and blk_h for use the allocated structure with a cast +when blk_x is blk_dst_x and blk_y is blk_dst_y. +
      +
    This function exists since the version 0x0101 of the video XBIOS +and is not inside the MilanTOS. +
      +
    +

    + + +
    CMD_TEXTUREMEM (14)
    +
    +

    Put texture in memory on the graphics card +
      +

    SCRTEXTUREMEMBLK blk;
    +blk.size=sizeof(SCRTEXTUREMEMBLK);
    +
    +VsetScreen(-1,&blk,0x564E,CMD_TEXTUREMEM);
    +if(blk.blk_status == BLK_OK)
    +  puts("OK");
    +
    +
    Copy a 65K texture from CPU local area to a 65K screen or an +ARGB texture to a 32M screen pixel format multiple times (best results +are with little source texture and big screen for destination). +
      +
    This function need a texture support inside the TOS. +
    This function exists since the version 0x0101 of the video XBIOS +and is not inside the MilanTOS. +
      +
    +

    + + +
    CMD_GETVERSION (15)
    +
    +

    +
      +

    /* if the function is not implemented, 0x0100 is the first release */
    +long version = 0x0100;
    +VsetScreen(-1,&version,0x564E,CMD_GETVERSION);
    +
    +
    Return the version of the video XBIOS. +
      +
    This function exists since the version 0x0101 of the video XBIOS +and is not inside the MilanTOS. +
      +
    +

    + + +
    CMD_LINEMEM (16)
    +
    +

    Draw line on the graphics card +
      +

    SCRLINEMEMBLK blk;
    +blk.size=sizeof(SCRLINEMEMBLK);
    +blk.blk_fbcolor = 0x112233;  /* foreground fill color */
    +blk.blk_bgcolor = 0;  /* background fill color */
    +blk.blk_pattern = 0xffffffff;  /* solid line */
    +
    +VsetScreen(-1,&blk,0x564E,CMD_LINEMEM);
    +if(blk.blk_status == BLK_OK)
    +  puts("OK");
    +
    +
    Draw a line with colors with the GPU at (blk_x1, blk_y1) to +(blk_x2, blk_y2). +
      +
    This function exists since the version 0x0101 of the video XBIOS +and is not inside the MilanTOS. +
      +
    +

    + + +
    CMD_CLIPMEM (17)
    +
    +

    Set clipping rectangle on the graphic card +
      +

    SCRCLIPMEMBLK blk;
    +blk.size=sizeof(SCRCLIPMEMBLK);
    +blk.blk_clip_on = 1; /* clipping flag 1:on,
    +                                      0:off */
    +
    +VsetScreen(-1,&blk,0x564E,CMD_CLIPMEM);
    +if(blk.blk_status == BLK_OK)
    +  puts("OK");
    +
    +
    Enable or diable clipping rectange at (blk_x, blk_y), size is +blk_w, blk_h. +
      +
    This function exists since the version 0x0101 of the video XBIOS +and is not inside the MilanTOS. +
      +
    +

    + + +
    CMD_SYNCMEM (18)
    +
    +

    Wait an empty GPU fifo for sync the drawing engine with the +memory. +
      +

    VsetScreen(-1,-1,0x564E,CMD_SYNCMEM);
    +
    +
    This function exists since the version 0x0101 of the video XBIOS +and is not inside the MilanTOS. +
      +
    +

    + + +
    CMD_BLANK (19)
    +
    +

    Blank / unblank screen. +
      +

    int32_t blank = 1; /* (0): unblank
    +                      (1): blank normal
    +                      (2): VSYNC suspend
    +                      (3): HSYNC suspend
    +                      (4): powerdown */
    +VsetScreen(-1,blank,0x564E,CMD_BLANK);
    +
    +
    This function exists since the version 0x0101 of the video XBIOS +and is not inside the MilanTOS. +
      +

    + +
    +
    +
    Ergebnis: Nothing (or current modecode in TOS mode) +
      +
    Verfügbar: Only valid with internal TOS Radeon driver (PCI.HEX) for the +ct60 (2007-01-24). +
      +
    Gruppe: Bildschirmfunktionen +
      +
    Querverweis: Setscreen   VsetScreen   Setscreen, Milan +
      + +
    + +

    4.5.20 ValidMode

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »ValidMode« - Validates a mode code. +
      +
    Xbiosnummer: 95 +
      +
    Deklaration: int16_t ValidMode( int16_t mode ); +
      +
    Beschreibung: The XBIOS function ValidMode returns a valid version of the +specified mode code, depending on the monitor that is connected. The +bits of the parameter mode have the following meaning: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    BitBedeutung
    0-2Anzahl der Farbebenen:
     0 = 1 Ebene 2 Farben
     1 = 2 Ebenen 4 Farben
     2 = 4 Ebenen 16 Farben
     3 = 8 Ebenen 256 Farben
     4 = 16 Ebenen 65536 Farben
      
    3Gesetzt: Bildbreite mindestens 640 Pixel
     Gelöscht: Bildbreite 320 Pixel
      
    4Gesetzt: VGA-Modus
     Gelöscht: TV-Modus (auch Atari-SC-Monitore)
      
    5Gesetzt: PAL-Modus
     Gelöscht: NTSC-Modus
      
    6Gesetzt: Overscan aktiv
    7Gesetzt: ST-kompatible Grafik
    8Gesetzt: Interlace-Modus aktiv
    +
    + +
    Note: This function is not officially documented and +some development tools may also call it Validmode or VcheckMode. +
      +
    Ergebnis: The function returns a valid mode code. +
      +
    Verfügbar: Die Funktion ist nur auf Computern der Falcon-Serie, Milan und +CT60 verfügbar. +
      +
    Gruppe: Bildschirmfunktionen +
      +
    Querverweis: Binding   mon_type   VsetSync   VgetSize VgetRGB   VsetRGB   +VsetMask   VsetMode +
      + +
    + +

    4.5.20.1 Bindings für ValidMode

    + + + + + + +
    C: int16_t ValidMode( int16_t mode ); +
      +
    Assembler: +
      +
    move.w    mode,-(sp)    ; Offset 2
    +move.w    #95,-(sp)     ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +addq.l    #4,sp         ; Stack korrigieren
    +
    + +
    + +

    4.5.21 VgetRGB

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »VgetRGB« - RGB Wert einer Farbe ermitteln +
      +
    Xbiosnummer: 94 +
      +
    Deklaration: void VgetRGB( int16_t index, int16_t count, int32_t *array ); +
      +
    Beschreibung: Die XBIOS-Funktion VgetRGB ermittelt die RGB-Werte für +count Farben ab dem Farbindex index. Die +resultierenden Werte werden in array abgelegt. +
      +
    Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
      +
    Verfügbar: Die Funktion ist nur auf Computern der Falcon-Serie verfügbar. +
      +
    Gruppe: Bildschirmfunktionen +
      +
    Querverweis: Binding   mon_type   VsetMode   VsetSync   VgetSize   VsetRGB   +VsetMask +
      + +
    + +

    4.5.21.1 Bindings für VgetRGB

    + + + + + + +
    C: #include <tos.h> +
      +
    void VgetRGB( int16_t index, int16_t count, int32_t *array ); +
      +
    Assembler: +
      +
    move.l    array,-(sp)  ; Offset 6
    +move.w    count,-(sp)  ; Offset 4
    +move.w    index,-(sp)  ; Offset 2
    +move.w    #94,-(sp)    ; Offset 0
    +trap      #14          ; XBIOS aufrufen
    +lea       $A(sp),sp    ; Stack korrigieren
    +
    + +
    + +

    4.5.22 VsetScreen

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »set screen« - initialisiert den Bildschirm. +
      +
    Xbiosnummer: 5 +
      +
    Deklaration: void VsetScreen( void *laddr, void *paddr, int16_t rez, int16_t +mode ); +
      +
    Beschreibung: Die XBIOS-Routine VsetScreen entspricht der Funktion Setscreen +allerdings mit einem zusätzlichen Parameter und dient dazu, +Auflösung und Bildschirmspeicheradressen zu verändern. Es gilt: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ParameterBedeutung
    laddrAdresse des log. Bildschirmspeichers
    paddrAdresse des phys. Bildschirmspeichers
    rez0 = ST-Niedrig
       1 = ST-Mittel
       2 = ST-Hoch
       3 = benutzte Auflösung aus mode
    modemodecode (siehe VsetMode)
    +
    + +
    Ein Wert von -1 bedeutet in diesem Zusammenhang, daß die +entsprechende Adresse bzw. Auflösung nicht verändert wird. +
      +
    Hinweis: Es sollte stets kontrolliert werden, ob +eventuelle Veränderungen wirklich erfolgreich ausgeführt werden +konnten. Bei einer Änderung der Auflösung wird automatisch der VT-52 +Emulator initialisiert. +
      +
    Der zusätzliche Parameter mode steht nur zur +Verfügung, wenn der Cookie '_VDO' den Wert 0x00030000 oder größer +hat. +
      +
    Beim TOS des Milans gibt es zusätzliche Funktionen bei Setscreen, +entsprechendes gilt auch für den ct60. +
      +
    Ergebnis: Die Funktion liefert kein Ergebnis. +
      +
    Verfügbar: Die Funktion ist nur auf Computern der Falcon-Serie verfügbar. +
      +
    Gruppe: Bildschirmfunktionen +
      +
    Querverweis: Binding +
      + +
    + +

    4.5.22.1 Bindings für VsetScreen

    + + + + + + +
    C: #include <tos.h> +
      +
    void VsetScreen( void *laddr, void *paddr, int16_t rez, int16_t +mode ); +
      +
    Assembler: +
      +
    move.w    mode,-(sp)   ; Offset 12
    +move.w    rez,-(sp)    ; Offset 10
    +move.l    paddr,-(sp)  ; Offset  6
    +move.l    laddr,-(sp)  ; Offset  2
    +move.w    #5,-(sp)     ; Offset  0
    +trap      #14          ; XBIOS aufrufen
    +lea       14(sp),sp    ; Stack korrigieren
    +
    + +
    + +

    4.5.23 VgetSize

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »VgetSize« - Größe des Bildschirmpuffers ermitteln +
      +
    Xbiosnummer: 91 +
      +
    Deklaration: int32_t VgetSize( int16_t mode ); +
      +
    Beschreibung: Die XBIOS-Funktion VgetSize ermittelt die Größe des +Bildschirmpuffers in Bytes für den Grafikmodus mode. +
      +
    Ergebnis: Die Funktion liefert die Größe des Bildschirmpuffers in Bytes +zurück. +
      +
    Verfügbar: Die Funktion ist nur auf Computern der Falcon-Serie verfügbar. +
      +
    Gruppe: Bildschirmfunktionen +
      +
    Querverweis: Binding   mon_type   VsetMode   VsetSync   VgetRGB   VsetRGB   +VsetMask +
      + +
    + +

    4.5.23.1 Bindings für VgetSize

    + + + + + + +
    C: #include <tos.h> +
      +
    int32_t VgetSize( int16_t mode ); +
      +
    Assembler: +
      +
    move.w    mode,-(sp)    ; Offset 2
    +move.w    #91,-(sp)     ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +addq.l    #4,sp         ; Stack korrigieren
    +
    + +
    + +

    4.5.24 VsetMask

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »VsetMask« - Transparenz für TrueColor setzen +
      +
    Xbiosnummer: 150 +
      +
    Deklaration: void VsetMask( int32_t ormask, int32_t andmask, int16_t overlay +); +
      +
    Beschreibung: Die XBIOS-Funktion VsetMask setzt Masken, die benutzt werden, +um die durch die VDI-Funktion vs_color gesetzten Farben zu +modifizieren. vs_color ermittelt zu seinem Parameter einen RGB-Wert. +Dieser wird bitweise mit ormask verodert und mit +andmask verundet. Somit können Farben im True-Color-Modus +transparent erscheinen. Ist overlay ungleich Null, wird in den +Overlaymodus geschalten bzw. mit Null zurück. +
      +
    Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
      +
    Verfügbar: Die Funktion ist nur auf Computern der Falcon-Serie verfügbar. +
      +
    Gruppe: Bildschirmfunktionen +
      +
    Querverweis: Binding   mon_type   VsetMode   VsetSync   VgetSize   VgetRGB   +VsetRGB +
      + +
    + +

    4.5.24.1 Bindings für VsetMask

    + + + + + + +
    C: #include <tos.h> +
      +
    void VsetMask( int32_t ormask, int32_t andmask, int16_t overlay +); +
      +
    Assembler: +
      +
    move.w    overlay,-(sp) ; Offset 10
    +move.l    andmask,-(sp) ; Offset 6
    +move.l    ormask,-(sp)  ; Offset 2
    +move.w    #150,-(sp)    ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +lea       12(sp),sp     ; Stack korrigieren
    +
    + +
    + +

    4.5.25 VsetMode

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »VsetMode« - Videohardwareregister setzen +
      +
    Xbiosnummer: 88 +
      +
    Deklaration: int16_t VsetMode( int16_t mode ); +
      +
    Beschreibung: Die XBIOS-Funktion VsetMode programmiert das +Videohardwareregister der Falcon-Computer. Die Bits des Parameters +mode haben folgende Bedeutung: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    BitBedeutung
    0-2Anzahl der Farbebenen:
     0 = 1 Ebene 2 Farben
     1 = 2 Ebenen 4 Farben
     2 = 4 Ebenen 16 Farben
     3 = 8 Ebenen 256 Farben
     4 = 16 Ebenen 65536 Farben
      
    3Gesetzt: Bildbreite mindestens 640 Pixel
     Gelöscht: Bildbreite 320 Pixel
      
    4Gesetzt: VGA-Modus
     Gelöscht: TV-Modus (auch Atari-SC-Monitore)
      
    5Gesetzt: PAL-Modus
     Gelöscht: NTSC-Modus
      
    6Gesetzt: Overscan aktiv
    7Gesetzt: ST-kompatible Grafik
    8Gesetzt: Interlace-Modus aktiv
    +
    + + +
    Wird als mode VM_INQUIRE (-1) übergeben erhält man die +aktuelle Auflösung, ohne das etwas verändert wird. +
      +
    Hinweis: Es findet keine Überprüfung auf die +Richtigkeit der Kodierung für den angeschlossenen Monitor statt. +
      +
    Ergebnis: Die Funktion liefert den alten Inhalt des +Videohardwareregisters zurück. +
      +
    Verfügbar: Die Funktion ist nur auf Computern der Falcon-Serie verfügbar. +
      +
    Gruppe: Bildschirmfunktionen +
      +
    Querverweis: Binding   mon_type   VsetSync   VgetSize VgetRGB   VsetRGB   +VsetMask +
      + +
    + +

    4.5.25.1 Bindings für VsetMode

    + + + + + + +
    C: #include <tos.h> +
      +
    int16_t VsetMode( int16_t mode ); +
      +
    Assembler: +
      +
    move.w    mode,-(sp)    ; Offset 2
    +move.w    #88,-(sp)     ; Offset 0
    +trap      #14           ; XBIOS aufrufen
    +addq.l    #4,sp         ; Stack korrigieren
    +
    + +
    + +

    4.5.26 VsetRGB

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »VsetRGB« - RGB Wert einer Farbe setzen +
      +
    Xbiosnummer: 93 +
      +
    Deklaration: void VsetRGB( int16_t index, int16_t count, int32_t *array ); +
      +
    Beschreibung: Die XBIOS-Funktion VsetRGB setzt die RGB-Werte für +count Farben ab dem Farbindex index. Die Farbwerte +sind in array abgelegt. +
      +
    Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
      +
    Verfügbar: Die Funktion ist nur auf Computern der Falcon-Serie verfügbar. +
      +
    Gruppe: Bildschirmfunktionen +
      +
    Querverweis: Binding   mon_type   VsetMode   VsetSync   VgetSize   VgetRGB   +VsetMask +
      + +
    + +

    4.5.26.1 Bindings für VsetRGB

    + + + + + + +
    C: #include <tos.h> +
      +
    void VsetRGB( int16_t index, int16_t count, int32_t *array ); +
      +
    Assembler: +
      +
    move.l    array,-(sp)  ; Offset 6
    +move.w    count,-(sp)  ; Offset 4
    +move.w    index,-(sp)  ; Offset 2
    +move.w    #93,-(sp)    ; Offset 0
    +trap      #14          ; XBIOS aufrufen
    +lea       $A(sp),sp    ; Stack korrigieren
    +
    + +
    + +

    4.5.27 VsetSync

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »VsetSync« - Art der Synchronisation setzen +
      +
    Xbiosnummer: 90 +
      +
    Deklaration: void VsetSync( int16_t flag ); +
      +
    Beschreibung: Die XBIOS-Funktion VsetSync legt fest, auf welche Art eine +Synchronisation erfolgen soll. Der Parameter flag wird wie +folgt kodiert: +
      +

    +
    + + + + + + + + + + + + + + + + +
    BitBedeutung für gesetzte Bits
    0Externer Takt
    1Vertikale Synchronisation
    2Horizontale Synchronisation
    +
    + +
    Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
      +
    Verfügbar: Die Funktion ist nur auf Computern der Falcon-Serie verfügbar. +
      +
    Gruppe: Bildschirmfunktionen +
      +
    Querverweis: Binding   mon_type   VsetMode   VgetSize   VgetRGB   VsetRGB   +VsetMask +
      + +
    + +

    4.5.27.1 Bindings für VsetSync

    + + + + + + +
    C: #include <tos.h> +
      +
    void VsetSync( int16_t flag ); +
      +
    Assembler: +
      +
    move.w    flag,-(sp)   ; Offset 2
    +move.w    #90,-(sp)    ; Offset 0
    +trap      #14          ; XBIOS aufrufen
    +addq.l    #4,sp        ; Stack korrigieren
    +
    + +
    + +

    4.5.28 Vsync

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »vertical sync« - wartet auf das nächste vertikale +Sync-Signal. +
      +
    Xbiosnummer: 37 +
      +
    Deklaration: void Vsync( void ); +
      +
    Beschreibung: Die XBIOS-Routine Vsync wartet auf den nächsten +Bildschirm-Refresh (Vertical-Blank Interrupt). Damit ist es möglich, +Bildschirmoperationen mit dem Betriebssystem synchronisieren. +
      +
    Hinweis: Für zeitkritische Abfragen (Scrolling) sollte +besser direkt auf den Zeilenzähler im Shifter zurückgegriffen +werden. +
      +
    Ergebnis: Die Funktion liefert kein Ergebnis. +
      +
    Verfügbar: Alle TOS Versionen +
      +
    Gruppe: Bildschirmfunktionen +
      +
    Querverweis: Binding +
      + +
    + +

    4.5.28.1 Bindings für Vsync

    + + + + + + +
    C: #include <tos.h> +
      +
    void Vsync( void ); +
      +
    Assembler: +
      +
    move.w    #37,-(sp)    ; Offset 0
    +trap      #14          ; XBIOS aufrufen
    +addq.l    #2,sp        ; Stack korrigieren
    +
    + +
    + +

    4.5.29 Konstanten zur Videohardware des Falcons

    +

    Zur vereinfachten Programmierung des Videohardwareregisters des +Falcons mittels der Funktion VsetMode sind in der Headerdatei tos.h +die folgenden Konstanten definiert, die mit | kombiniert werden: +

    +
        #define VERTFLAG  0x0100  /* Interlace aktivieren          */
    +    #define STMODES   0x0080  /* ST-kompatible Grafik          */
    +    #define OVERSCAN  0x0040  /* Overscan aktivieren           */
    +    #define PAL       0x0020  /* PAL-Modus                     */
    +    #define FALC_VGA  0x0010  /* VGA-Modus                     */
    +    #define TV        0x0000  /* TV-Modus                      */
    +
    +    #define COL80     0x0008  /* Bildbreite mind. 640 Pixel    */
    +    #define COL40     0x0000  /* Bildbreite 320 Pixel          */
    +
    +    #define BPS16     4       /* 16 Farbebenen: 65536 Farben   */
    +    #define BPS8      3       /*  8 Farbebenen:   256 Farben   */
    +    #define BPS4      2       /*  4 Farbebenen:    16 Farben   */
    +    #define BPS2      1       /*  2 Farbebenen:     4 Farben   */
    +    #define BPS1      0       /*  1 Farbebenen:     2 Farben   */
    +
    +

    Mit der folgenden Konstante kann die Anzahl der Farbebenen +ausmaskiert werden: +

    +
        #define NUMCOLS   7       /* if (( mode & NUMCOLS ) == 0 ) */
    +                              /*   puts( "monochrome mode" );  */
    +
    +
    + +Home +XBIOSXBIOS +xbios-Trapxbios-Trap +CENTScreen-XBIOS-ErweiterungCENTScreen-XBIOS-Erweiterung + + diff --git a/de/THREADINFO.html b/de/THREADINFO.html new file mode 100644 index 000000000..85b8fe232 --- /dev/null +++ b/de/THREADINFO.html @@ -0,0 +1,59 @@ + + + + + +Die Anleitung zum TOS: THREADINFO + + + + + + + + + +Home +TypdefinitionenTypdefinitionen +RGB_LISTRGB_LIST +XCPBXCPB + +
    + +

    I.17 THREADINFO

    +
    typedef struct
    +{
    +   int32_t cdecl (*proc)(void *par);
    +   void          *user_stack;
    +   uint32_t      stacksize;
    +   int16_t       mode;
    +   int32_t       res1;
    +} THREADINFO;
    +
    +

    Hinweis: Ist die Komponente user_stack NULL, so +legt das System selbst den Stack an. Wenn der Thread terminiert, wird +der Stack automatisch vom System wieder freigegeben. Die Komponente +stacksize ist in jedem Fall anzugeben, damit das System den +Stackpointer des Threads auf das Ende des Stacks setzen kann. Der +Systemstapel (Supervisior-Stack) wird vom Betriebssystem selbst +festgelegt, so daß dessen Größe nicht beeinflußt werden kann. +

    +

    Die Komponenten mode und res1 sind für +zukünftige Zwecke reserviert, und sollten deshalb auf den Wert 0 bzw. +0L gesetzt werden. In Solaris 2.x kann man damit z.B. einen Thread bis +zum endgültigen Start anhalten. Der gestartete Thread führt die +Funktion proc aus, der als Parameter die Komponente +par (auf dem Stack) übergeben wird. Die CPU-Register d0-d2 +und a0-a2 dürfen von der Funktion verändert werden. +

    +

    Querverweis: Threads in MagiC   shel_write   Beispiel-Code +

    +
    + +Home +TypdefinitionenTypdefinitionen +RGB_LISTRGB_LIST +XCPBXCPB + + diff --git a/de/VDI_fundamentals.html b/de/VDI_fundamentals.html new file mode 100644 index 000000000..c6d81bbc9 --- /dev/null +++ b/de/VDI_fundamentals.html @@ -0,0 +1,4432 @@ + + + + + +Die Anleitung zum TOS: Grundlagen des VDI + + + + + + + + + +Home +VDIVDI +Das VDIDas VDI +VDI-BindingsVDI-Bindings + +
    + +

    7.2 Grundlagen des VDI

    + +

    Das VDI (Virtual Device Interface) bildet die untere Hälfte +des GEM; es ist sozusagen die Grundlage aller AES-Funktionen. +

    +

    Auch wenn man mit dem VDI normalerweise primär Funktionen +zur Grafikausgabe verbindet, erstreckt sich der Aufgabenbereich auch +auf Eingaben (wie z.B. per Maus oder Grafiktablett). Das VDI +ist also eine Betriebssystemschicht zur Ansteuerung von (im weitesten +Sinn) grafikorientierten Aus- und Eingabegeräten. Dieser +Abschnitt beschreibt die Punkte: +

    + + +

    Wie das Wörtchen 'Virtual' bereits andeutet, können dabei fast +alle Funktionsaufrufe auf jedes verfügbare Ausgabegerät (Bildschirm, +Drucker, Plotter, Diabelichter etc.) angewendet werden. Es spielt also +keine Rolle, ob man Kreise malen oder Texte ausgeben möchte: dies +kann immer mit den gleichen Betriebssystemfunktionen realisiert +werden. +

    + +

    Die Wurzeln des VDI liegen im CP/M-GSX-System, das Anfang der +80er Jahre aus dem Bedarf für eine portable Grafikschnittstelle für +die damals dominierenden CP/M-Systeme entstand. Ähnlichkeiten in +Funktionen und Bezeichnungen zum GKS (Grafisches Kern-System) sind +daher keineswegs zufällig, sondern von den Entwicklern bei +Digital Research voll beabsichtigt gewesen. +

    +

    Das VDI erfüllt den ANSI-Standard X3H3.6CG-VDI. +

    +

    Querverweis: Style-Guidelines +

    +

    7.2.1 Clipping

    +

    Clipping ist ein Verfahren, das die Benutzung eines +Fenstersystems eigentlich erst möglich macht. Dabei gibt man mittels +des Clipping-Rechtecks an, auf welchen Bildschirmbereich sich alle +Grafikausgaben der betreffenden Workstation beziehen sollen; alles, +was aus dem so spezifizierten Bildausschnitt herausragt, wird bei der +Bildschirmausgabe übergangen. +

    +

    Eine zwar wenig effiziente, aber leicht zu programmierende +Fensterausgaberoutine würde einfach für jedes zu zeichnende +Teilrechteck des Fensters jeweils ein Clipping-Rechteck setzen und +dann alle zum Aufbau des Fensterinhaltes notwendigen +Bildschirmausgaben wiederholen. Wer sich die Mühe macht, zunächst +anhand einer Plausibilitätsabfrage festzustellen, ob das zu +zeichnende Objekt überhaupt sichtbar ist, kann natürlich +deutlich Zeit sparen. +

    +

    Hinweis: Wie so vieles im Leben ist auch das Clipping +nicht gratis zu haben. Wer eine optimale Geschwindigkeit beim +Bildschirmaufbau erreichen will sollte das Clipping-Rechteck so oft +wie nur möglich ausschalten. +

    +

    Querverweis: Grundlagen des VDI   Style-Guidelines   vs_clip +

    +

    7.2.2 Das GDOS

    + + + + + + +

    Einige Funktionen des VDI können erst nach der Installation des +GDOS aus dem AUTO-Ordner heraus richtig benutzt werden. Grundsätzlich +ermöglicht das GDOS (Graphics Device Operating System) beliebige +Gerätetreiber und Zeichensätze zu laden, und dann zu benutzen. +

    +

    Es ist dabei völlig unabhängig vom verwendeten Gerät. +Gerätespezifisch sind nur die nachzuladenden Treiber, die die VDI +Funktionen auf dem entsprechenden Gerät realisieren. Bei genauer +Kenntnis des Treiberformats ist es so möglich beliebige, und auch +exotische Ausgabegeräte als VDI Ausgabegerät zu betreiben. +

    +

    Mit residentem GDOS erhöht sich die Zahl der Verfügung +stehenden VDI-Funktionen, während alle anderen Funktionen voll +funktionsfähig bleiben bzw. einen erweiterten Ausgabeumfang erhalten. +Umgekehrt ist das aber nicht so, Funktionen, die GDOS benötigen, +führen ohne residentes GDOS zum Absturz des Rechners. +

    + +

    +
    +Abb: Der Stammbaum der GDOS-Familie +
    + +

    Daher ist es in einigen Fällen wichtig zu wissen, ob +überhaupt ein vollständiges GDOS installiert ist. Atari hat zu +diesem Zweck das folgende Verfahren dokumentiert: Der Trap-Dispatcher +verändert den Eingabewert -2 für Register D0 genau dann, wenn ein +GDOS installiert ist. Viele Compiler stellen die Funktion +vq_gdos zur Verfügung die genau dann einen Wert von 0 +zurückliefert wenn kein GDOS installiert ist. Diese Funktion +basiert im wesentlichen auf dem folgenden Code: +

    +
    vq_gdos:
    +              move.w   #-2,d0
    +              trap     #2
    +              cmp.w    #-2,d0
    +              sne      d0
    +              ext.w    d0
    +              rts
    +
    +

    Wichtiger Hinweis: vq_gdos liefert nur die Information, +ob ein GDOS vorhanden ist, oder nicht. Es wird nichts darüber +ausgesagt, um welches GDOS es sich handelt bzw. welche Fähigkeiten +das installierte GDOS besitzt. So läßt sich mit Hilfe dieser +Funktion beispielsweise das AMC-GDOS nicht von SpeedoGDOS oder +NVDI unterscheiden. +

    + +

    Vorsicht: Die GEM-Versionen des niederländischen +Softwarehauses "ABC" (ABC-GEM 2.x) stürzen bei diesem +Aufruf ab. +

    + + +

    Alternativ gibt es noch vq_vgdos (_vq_gdos): +

    +
    vq_vgdos:
    +              move.w   #-2,d0
    +              trap     #2
    +              rts
    +
    + + + + + + +

    Als Rückgabe erhält man: +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameWertGDOS Type
    GDOS_NONE-2GDOS not installed.
    -Any other value.GDOS 1.0 or 1.2
    GDOS_ATARI0x0007E88AGDOS 1.1 von Atari Corp.
    GDOS_AMC0x0007E864AMC-GDOS von Arnd Beissner
    GDOS_AMCLIGHT0x0007E8BAGEMINI-Spezial-GDOS von Arnd Beissner
    -0x3e5d0957ttf-gdos von Trevor Blight
    GDOS_FNT0x5F464E54 ('_FNT')FONTGDOS
    GDOS_FSM0x5F46534D ('_FSM')FSMGDOS
    -0x66564449 ('fVDI')fVDI
    +
    + +

    Die aktuellen (und leistungsfähigsten) Versionen sind das +SpeedoGDOS und NVDI (ab Version 3.0), die es u.a. erlauben +Vektorzeichensätze im TrueType, Type-1 bzw. Speedo Format zu +verarbeiten. NVDI liegt auch in einer speziellen +Macintosh-Version vor (NVDIMac), und ermöglicht es jedem +Programm das über GDOS ausgeben kann (in Verbindung mit MagiC Mac), +seine Ausgaben auch auf Apple-Druckern und im Netzwerk tätigen zu +können. +

    +

    Querverweis: ASSIGN.SYS-Datei   Grundlagen des VDI   Style-Guidelines +

    +

    7.2.3 Der Aufbau der ASSIGN.SYS-Datei

    +

    Die Anmeldung der Zeichensätze und Treiber in der +ASSIGN.SYS-Datei geschieht nach folgendem Schema: +

    +
    <Gerätenummer> <Option> <Name des Treibers> <Kommentar>
    +
    +

    Beispiel: +

    +
    ; ASSIGN.SYS-Datei
    +path = C:\gemsys
    +
    +01p screen.sys    ; Bildschirmtreiber (ROM)
    +monaco10.fnt      ; Zeichensatz (10 Punkt)
    +monaco12.fnt      ; Zeichensatz (12 Punkt)
    +monaco18.fnt      ; Zeichensatz (18 Punkt)
    +monaco24.fnt      ; Zeichensatz (24 Punkt)
    +
    +21r laserjet.sys  ; HP-Laserjet   (resident)
    +22r necp.sys      ; NEC-Pinwriter (resident)
    +
    +31 meta.sys       ; Metafile-Treiber
    +81 t_office.sys   ; Tele-Office
    +
    +

    Die Variable path bestimmt das Verzeichnis, in welchem +Treiber und Zeichensätze von GDOS gesucht werden. Kommentare werden +stets durch ein Semikolon eingeleitet. +

    +

    Unter Option kann für jeden Treiber ein Flag angegeben +werden, das weitere Einzelheiten spezifiziert; es gilt: +

    + + + + + + + + + + + + + + + + + + +
    Option Bedeutung +
        +
    'p' Falls NVDI aktiv ist, wird automatisch der passende +NVDI-Bildschirmtreiber geladen; anderenfalls wird der Treiber des +Atari-VDI benutzt, der sich im ROM befindet. +
    'r' Der Treiber wird beim Booten des Systems geladen, und bleibt +permanent im Speicher. +
    'r ' Der angegebene Zeichensatz wird beim Booten des Systems +geladen, und verbleibt resident im Speicher. +
    's ' Bindet den angegebenen Zeichensatz als Systemfont ein. +
    Hinweis: Auf diese Art und Weise können also die echten +Systemfonts ersetzt werden; der neue Font muss von den Ausmaßen und +der Anzahl der Zeichen mit dem alten Zeichensatz übereinstimmen. + +
    + +

    Achtung: Befindet sich kein Buchstabe hinter +einer Gerätekennung, so wird der Treiber auf Anforderung geladen, und +später wieder aus dem System entfernt. In der ASSIGN.SYS-Datei +können nur Bitmap- (Pixel) zeichensätze, aber keine +Vektorzeichensätze angemeldet werden. +

    + +

    Ab PC-GEM/3 existiert die Datei ASSIGN.SYS übrigens nicht mehr. +Dort werden die Treiber der Geräte sowie die Zeichensätze, die +installiert werden sollen, einfach in den Ordner \GEMAPPS\GEMSYS bzw. +in den Ordner \GEMAPPS\FONTS kopiert. +

    +

    Querverweis: GDOS-Treiber   Grundlagen des VDI +

    +

    7.2.4 GDOS-Treiber

    + + + +

    Ein GDOS-Treiber ist im wesentlichen eine normale Programmdatei +ohne Startup-Code, die als erste Routine einen Dispatcher für die +eingehenden VDI-Aufrufe enthält. Alle Treiber müssen in der +ASSIGN.SYS-Datei angemeldet sein, die vom GDOS beim Start ausgewertet +wird. +

    +

    Die folgende Liste nennt die wichtigsten Treiber mit ihren +jeweiligen Gerätenummern: +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Bildschirm-Treiber (01-10) +
    Plotter-Treiber (11-20) +
    Drucker-Treiber (21-30) +
    Metafile-Treiber (31-40) +
    Kamera-Treiber (41-50) +
    Grafiktablett-Treiber (51-60) +
    Memory-Treiber (61-70) +
    Fax-Treiber (81-90) +
    Bit-Image Treiber (91-100) +
    Multimedia Treiber (101-110) +
    Sound Treiber (111-120) +
    Lade und Zeichnen Bit-Image Treiber (121-130) + +
    + +

    Bei der Implementierung des Dispatchers sollte folgendes +beachtet werden: +

    +
      +
    • die Adresse des VDI-Parameterblocks wird im Register D1 +übergeben +
    • +
    • die Funktion selbst wird mit einer RTS-Anweisung abgeschlossen +
    • +
    + +

    Ein GDOS-Treiber arbeitet immer im Rasterkoordinaten-System; die +Konvertierung der Werte im ptsin- und ptsout-Feld wird vom GDOS +übernommen. Darüber hinaus muß beachtet werden, daß nicht alle +Funktionen den eigentlichen Treiber exakt so erreichen, wie sie +abgeschickt wurden, da sie vom GDOS teilweise vorverarbeitet werden. +

    +

    Querverweis: GDOS   Grundlagen des VDI   Bindings des VDI +

    +

    7.2.4.1 Bildschirm-Treiber

    + + +

    Der Bildschirmtreiber des TOS kann durch einen eigenen Treiber +ersetzt werden, welcher vom GDOS nachgeladen werden muss. +

    +

    Derartige Treiber gibt es bereits für die unterschiedlichsten +Grafikkarten (z.B. NVDI-ET4000 für Grafikkarten mit dem Tseng +ET-4000 Chip). +

    +

    Bei der Anschaffung eines alternativen Bildschirmtreibers sollte +darauf geachtet werden, daß der Treiber alle relevanten Funktionen +des VDI unterstützt, und auch mit GEM-Zeichensätzen keine Probleme +hat. +

    +

    Querverweis: GDOS-Treiber   Mindestfunktionsumfang +

    +

    7.2.4.2 Mindestfunktionsumfang für Bildschirmtreiber

    +

    Die folgende Liste beschreibt den Funktionsumfang, den ein +Bildschirmtreiber mindestens bieten sollte; es handelt sich um eine +Spezifikation aus dem Atari "GEM Programmer's +Guide". +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Opcode Funktion
    1v_opnwk
    2v_clswk
    3v_clrwk
    4v_updwk
    5Escapefunktionen
    1vq_chcells
    2v_exit_cur
    3v_enter_cur
    4v_curup
    5v_curdown
    6v_curright
    7v_curleft
    8v_curhome
    9v_eeos
    10v_eeol
    11v_curaddress
    12v_curtext
    15vq_curaddress
    18v_dspcur
    19v_rmcur
    6v_pline
    7v_pmarker
    8v_gtext
    9v_fillarea
    11Ausgabefunktionen
    1v_bar
    2v_arc
    3v_pieslice
    4v_circle
    5v_ellipse
    6v_ellarc
    7v_ellpie
    8v_rbox
    9v_rfbox
    10v_justified
    12vst_height
    14vs_color
    15vsl_type
    17vsl_color
    18vsm_type
    20vsm_color
    21vst_font
    22vst_color
    23vsf_interior
    24vsf_style
    25vsf_color
    26vq_color
    28vrq_locator
    31vrq_string
    32vswr_mode
    33vsin_mode
    35vql_attributes
    36vqm_attributes
    37vqf_attributes
    38vqt_attributes
    39vst_alignment
    100v_opnvwk
    101v_clsvwk
    102vq_extnd
    104vsf_perimeter
    106vst_effects
    107vst_point
    108vsl_ends
    109vro_cpyfm
    110vr_trnfm
    111vsc_form
    112vsf_udpat
    113vsl_udsty
    114vr_recfl
    115vqin_mode
    116vqt_extent
    117vqt_width
    118vex_timv
    121vrt_cpyfm
    122v_show_c
    123v_hide_c
    124vq_mouse
    125vex_butv
    126vex_motv
    127vex_curv
    128vq_key_s
    129vs_clip
    130vqt_name
    131vqt_fontinfo
    +
    + +

    7.2.4.3 Bit-Image Treiber

    + + +

    Mit Hilfe eines Bit-Image Treibers können alle Applikationen, +die über das GDOS Ausgaben tätigen können, direkt in eine Datei +drucken. +

    +

    Bei NVDI-Treibern kann bei v_opnwk das Seitenformat und der Name +der Bit-Image-Datei gesetzt werden. Der Dateiname kann übrigens auch +mit Hilfe von vq_extnd übergeben werden: +

    +
    contrl[1]   = 4;
    +ptsin[2]    = 1157;
    +ptsin[3..4] = Zeiger auf den Dateinamen (BYTE *);
    +ptsin[5..6] = Zeiger auf Fehlervariable (int16_t *);
    +ptsin[7]    = 0;
    +
    +

    Hinweis: Über den Sinn und Unsinn dieses Features kann +man sich sicherlich streiten, da es sich bei vq_extnd eigentlich um +eine reine Auskunftsfunktion handelt! +

    +

    Querverweis: GDOS-Treiber   ASSIGN.SYS-Datei +

    +

    7.2.4.4 Drucker-Treiber

    + + +

    Die Auswahl an Drucker-Treibern für das GDOS ist inzwischen +fast unerschöpflich; lediglich bei Farbdruckern scheint es noch +einige Engpässe zu geben. +

    +

    Bei der Arbeit mit Drucker-Treibern sollte beachtet werden, daß +nicht alle Treiber funktional völlig identisch sind. So gibt es etwa +bei Einsatz eines Laserdruckers nicht nur zusätzliche Funktionen, +sondern einige bestehende wurden auch teilweise erweitert. +

    +

    Bei NVDI-Druckertreibern kann bei v_opnwk das Seitenformat und +das GEMDOS Ausgabegerät gesetzt werden. Zur Ausgabe von (Farb-) +Bildern sollten die Funktionen vrt_cpyfm bzw. vro_cpyfm benutzt +werden. Sie lassen sich in NVDI für Druckertreiber (und IMG, usw.) +genauso wie die Funktionen des Bildschirmtreibers ansprechen. Der +einzige Unterschied besteht darin, daß Raster nicht innerhalb der +Druckerbitmap verschoben werden können (Quell- und Ziel-MFDB mit +fd_addr == 0L), da die Druckerbitmap i.a. aus mehreren Scheiben +besteht, die nacheinander aufbereitet werden. Da Kopieren innerhalb +der Gerätebitmap bei der Druckausgabe keinen Sinn macht, stellt +dieser Unterschied aber keine Einschränkung dar. +

    +

    Der Druckertreiber puffert die Bitmap ggf. in der Display-List +falls nicht genügend Speicher vorhanden ist; es ist also nicht +erforderlich, die Bitmap bis zur Ausgabe mit v_updwk im Speicher zu +halten. +

    +

    Wenn die Bitmap skaliert werden muß, sollte ein Programm wenn +möglich nicht selber die Bitmap vergrößern, sondern vrt/vro_cpyfm +die Arbeit überlassen. Dadurch steigt die Ausgabequalität, es +müssen weniger Daten auf der Festplatte gepuffert werden, und der +Ausdruck wird beschleunigt. Ob der Treiber skalieren kann, erfährt +man bei Aufruf von vq_extnd. +

    +

    Bei Ausgabe von Farbbildern im 8-Farbmodus sollten Raster vor +dem Dithern mit einer Korrekturfunktion behandelt werden. Hier +empfiehlt sich eine Gamma-Korrektur mit Exponent von 0,3 bis 0,4, +damit das Bild nicht vollkommen matt und übersättigt aussieht. Im +Truecolor-Modus übernimmt der Treiber Farbkorrektur, +Schwarz-Separation und andere qualitätsverbessernde Maßnahmen selber +- Bitmaps sollten hier ohne vorhergehende Korrektur und ohne Rasterung +an den Treiber geschickt werden. +

    +

    Querverweis: GDOS-Treiber   Bitmapformat bei Druckertreibern   +Mindestfunktionsumfang +

    +

    7.2.4.5 Mindestfunktionsumfang für Drucker-Treiber

    +

    Die folgende Liste beschreibt den Funktionsumfang, den ein +Druckertreiber mindestens bieten sollte; es handelt sich um eine +Spezifikation aus dem Atari "GEM Programmer's +Guide". +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Opcode Funktion
    1v_opnwk
    2v_clswk
    3v_clrwk
    4v_updwk
    5Escapefunktionen
    1vq_chcells
    20v_form_adv
    21v_output_window
    22v_clear_disp_list
    23v_bit_image
    6v_pline
    7v_pmarker
    8v_gtext
    9v_fillarea
    11Ausgabefunktionen
    1v_bar
    2v_arc
    3v_pieslice
    4v_circle
    5v_ellipse
    6v_ellarc
    7v_ellpie
    8v_rbox
    9v_rfbox
    10v_justified
    12vst_height
    15vsl_type
    17vsl_color
    18vsm_type
    20vsm_color
    21vst_font
    22vst_color
    23vsf_interior
    24vsf_style
    25vsf_color
    26vq_color
    32vswr_mode
    35vql_attributes
    36vqm_attributes
    37vqf_attributes
    38vqt_attributes
    39vst_alignment
    102vq_extnd
    104vsf_perimeter
    106vst_effects
    107vst_point
    108vsl_ends
    112vsf_udpat
    116vqt_extent
    117vqt_width
    129vs_clip
    130vqt_name
    131vqt_fontinfo
    +
    + +

    7.2.4.6 Bitmapformat bei Druckertreibern

    + +

    Genauso wie für den Bildschirm liefert vq_scrninfo auch für +Drucker das Format der Bitmap zurück. In der Regel gibt es hier nur 3 +verschiedene Formate: +

    +
      +
    • monochrome Bitmap, wenn der Treiber 2 Farben hat. +
    • +
    • drei hintereinanderliegende Ebenen, wenn der Treiber 8 Farben +hat. +
    • +
    • Packed Pixels mit 32 Bit, wenn der Treiber im Truecolor-Modus +läuft. +
    • +
    + +

    Da die Formate (1) und (3) wohl selbsterklärend sind, sei hier +nur noch auf Format (2) eingegangen: Bei 8 Farben besteht eine farbige +Bitmap aus 3 vollständigen, hintereinander im Speicher liegenden +Ebenen (Planes). Das gerätespezifische Rasterformat entspricht also +dem Standardformat. Die Zuordnung von VDI-Farbindex zum Pixelwert +folgt der Standardeinteilung, die für alle VDI-Treiber gilt. +

    +

    Querverweis: Drucker-Treiber   Rasterformate   vro_cpyfm   +vrt_cpyfm +

    +

    7.2.4.7 Fax-Treiber

    + + +

    Ein Fax-Treiber ist im Prinzip nichts anderes als ein einfacher +Drucker-Treiber. Mit Hilfe eines solchen Treibers können alle +Applikationen, die über das GDOS ausgeben, direkt Telefaxe +verschicken. +

    +

    Bei einem Fax-Treiber kann weder Seitenformat noch GEMDOS-Gerät +angegeben werden. Man sollte auch nicht versuchen, die Größe der +Bitmap zu verändern. +

    +

    Querverweis: GDOS-Treiber   ASSIGN.SYS-Datei +

    +

    7.2.4.8 Grafiktablett-Treiber

    + + +

    Da z.Zt. noch keine Treiber für Grafiktabletts existieren, +können an dieser Stelle keine weitergehenden Informationen erteilt +werden. +

    +

    Querverweis: GDOS-Treiber   ASSIGN.SYS-Datei +

    +

    7.2.4.9 Kamera-Treiber

    + + +

    Da z.Zt. noch keine Treiber für die Polaroid-Palette +existieren, können an dieser Stelle keine weitergehenden +Informationen erteilt werden. +

    +

    Querverweis: GDOS-Treiber   Mindestfunktionsumfang +

    +

    7.2.4.10 Mindestfunktionsumfang für Kamera-Treiber

    +

    Die folgende Liste beschreibt den Funktionsumfang, den ein +Kameratreiber mindestens bieten sollte; es handelt sich um eine +Spezifikation von Digital Research zu PC-GEM 2.0. +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Opcode Funktion
    1v_opnwk
    2v_clswk
    3v_clrwk
    4v_updwk
    5Escapefunktionen
    1vq_chcells
    23v_bit_image
    91vsp_film
    92vqp_filmname
    6v_pline
    11Ausgabefunktionen
    1v_bar
    2v_arc
    3v_pieslice
    4v_circle
    5v_ellipse
    6v_ellarc
    7v_ellpie
    8v_rbox
    9v_rfbox
    10v_justified
    12vst_height
    13vst_rotation
    14vs_color
    15vsl_type
    16vsl_width
    17vsl_color
    18vsm_type
    19vsm_height
    20vsm_color
    21vst_font
    22vst_color
    23vsf_interior
    24vsf_style
    25vsf_color
    26vq_color
    32vswr_mode
    35vql_attributes
    36vqm_attributes
    37vqf_attributes
    38vqt_attributes
    39vst_alignment
    102vq_extnd
    104vsf_perimeter
    106vst_effects
    107vst_point
    108vsl_ends
    112vsf_udpat
    113vsl_udsty
    116vqt_extent
    117vqt_width
    119vst_load_fonts
    120vst_unload_fonts
    129vs_clip
    130vqt_name
    131vqt_fontinfo
    +
    + +

    7.2.4.11 Memory-Treiber

    + + +

    Ein Memory-Treiber ist im Prinzip ein Bildschirmtreiber, bei dem +die Ausgaben nicht im Bildschirmspeicher, sondern in einem anderen +Speicherbereich landen, und dort dann weiterverarbeitet werden +können. +

    +

    Die z.Zt. verfügbaren Treiber unterstützen nur eine monochrome +Bitmap, und besitzen eine logische Auflösung von 300dpi. Leider +stimmt das Aspect-Ratio Verhältnis i.a. nicht mit der aktuellen +Auflösung des Bildschirms überein, was zur Folge hat, daß Kreise +beispielsweise als Ellipsen dargestellt werden. +

    +

    Die Auflösung der Bitmap kann per v_opnwk gesetzt werden, indem +in ptsin[0..1] die Breite-1 bzw. Höhe-1 sowie in contrl[1] der Wert 1 +geschrieben werden. Nach dem Aufruf der Funktion wird die Adresse der +Bitmap in contrl[0..1] zurückgeliefert. Darüber hinaus ist es auch +möglich, die Bitmap-Größe per vq_extnd zu setzen. In diesem Fall +ist es zusätzlich möglich, einen eigenen Buffer zu übergeben. Dazu +setzt man contrl[3] auf den Wert 3 und übergibt in intin[1..2] einen +Zeiger auf den Buffer. +

    +

    Aufgrund der größeren Flexibilität sollte Off-Screen-Bitmaps +der Vorzug gegenüber Memory-Treibern gegeben werden. +

    +

    Querverweis: GDOS-Treiber   ASSIGN.SYS-Datei +

    +

    7.2.4.12 Metafile-Treiber

    + + +

    Ein Metafile-Treiber speichert alle an ihn gerichteten Aufrufe +in einem GEM-Metafile, welches sich im aktuellen Verzeichnis der +Applikation befindet und als Voreinstellung den Namen +GEMFILE.GEM trägt. +

    +

    Möchte man den Namen ändern, so sollte direkt nach v_opnwk die +Funktion vm_filename aufgerufen werden, der man einen kompletten +Dateinamen mit dem gewünschten Pfad und Namen übergeben kann. +

    +

    Damit andere Programme ein Metafile vernünftig darstellen +können, sollten die Funktionen v_meta_extents, vm_pagesize und +vm_coords aufgerufen werden. +

    +

    Querverweis: +
    v_meta_extents   vm_pagesize   vm_coords   GDOS-Treiber   Mindestfunktionsumfang +

    +

    7.2.4.13 Mindestfunktionsumfang für Metafile-Treiber

    +

    Die folgende Liste beschreibt den Funktionsumfang, den ein +Metafiletreiber mindestens bieten sollte; es handelt sich um eine +Spezifikation aus dem Atari "GEM Programmer's +Guide". +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Opcode Funktion
    1v_opnwk
    2v_clswk
    3v_clrwk
    4v_updwk
    5Escapefunktionen
    1vq_chcells
    2v_exit_cur
    3v_enter_cur
    20v_form_adv
    21v_output_window
    22v_clear_disp_list
    23v_bit_image
    98v_meta_extents
    99v_write_meta
    100vm_filename
    6v_pline
    7v_pmarker
    8v_gtext
    9v_fillarea
    11Ausgabefunktionen
    1v_bar
    2v_arc
    3v_pieslice
    4v_circle
    5v_ellipse
    6v_ellarc
    7v_ellpie
    8v_rbox
    9v_rfbox
    10v_justified
    12vst_height
    13vst_rotation
    14vs_color
    15vsl_type
    16vsl_width
    17vsl_color
    18vsm_type
    19vsm_height
    20vsm_color
    21vst_font
    22vst_color
    23vsf_interior
    24vsf_style
    25vsf_color
    26vq_color
    32vswr_mode
    35vql_attributes
    36vqm_attributes
    37vqf_attributes
    38vqt_attributes
    39vst_alignment
    102vq_extnd
    103v_contourfill
    104vsf_perimeter
    106vst_effects
    107vst_point
    108vsl_ends
    112vsf_udpat
    113vsl_udsty
    114vr_recfl
    117vqt_width
    129vs_clip
    131vqt_fontinfo
    +
    + +

    7.2.4.14 Plotter-Treiber

    + + +

    Nach langer Durststrecke sind mittlerweile auch +GDOS-Plottertreiber verfügbar. So wird z.B. bei dem Programm +DATA ein HPGL-Treiber mitgeliefert, und auch auf der +PD-Diskette Nummer 458 der Zeitschrift ST-Computer +befindet sich ein solcher Treiber. +

    +

    Genauere Informationen zu Plottertreibern sind z.Zt. jedoch noch +nicht bekannt. +

    +

    Querverweis: GDOS-Treiber   Mindestfunktionsumfang +

    +

    7.2.4.15 Mindestfunktionsumfang für Plotter-Treiber

    +

    Die folgende Liste beschreibt den Funktionsumfang, den ein +Plottertreiber mindestens bieten sollte; es handelt sich um eine +Spezifikation aus dem Atari "GEM Programmer's +Guide". +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Opcode Funktion
    1v_opnwk
    2v_clswk
    3v_clrwk
    4v_updwk
    5Escapefunktionen
    1vq_chcells
    6v_pline
    7v_pmarker
    8v_gtext
    9v_fillarea
    11Ausgabefunktionen
    1v_bar
    2v_arc
    3v_pieslice
    4v_circle
    5v_ellipse
    6v_ellarc
    7v_ellpie
    8v_rbox
    9v_rfbox
    10v_justified
    12vst_height
    15vsl_type
    17vsl_color
    18vsm_type
    20vsm_color
    21vst_font
    22vst_color
    23vsf_interior
    24vsf_style
    25vsf_color
    35vql_attributes
    36vqm_attributes
    37vqf_attributes
    38vqt_attributes
    39vst_alignment
    102vq_extnd
    104vsf_perimeter
    107vst_point
    108vsl_ends
    116vqt_extent
    117vqt_width
    130vqt_name
    131vqt_fontinfo
    +
    + +

    7.2.5 Koordinatensysteme des VDI

    +

    Das VDI unterscheidet zwei verschiedene Typen von +Koordinatensystemen: +

    +
      + + + + +
    • Rasterkoordinaten (RC): Bei Verwendung dieses Systems +kann man exakt das dem Ausgabegerät eigene Koordinatensystem +benutzen. Bei einem Bildschirm entspricht das den horizontal und +vertikal verfügbaren Pixeln. Der Nullpunkt liegt in der linken +oberen Ecke. +
      Hauptvorteil der Rasterkoordinaten ist die absolut exakte +Positionierung die die genaue Arbeit mit Bildschirmrastern (Fenster +etc). erst möglicht macht. +
        + + + + +

    • +
    • normalisierte Koordinaten (NDC): Dieses System besitzt +immer eine maximale Auflösung von 32768*32768 Punkten. Das VDI rechnet +beim Aufruf eines Gerätetreibers automatisch auf dessen +physikalisches Koordinatensystem um. Der Nullpunkt liegt in der linken +unteren Ecke. Zur Arbeit mit dem NDC-System muß ein GDOS +installiert sein - der Bildschirmtreiber im ROM kann keine +NDC-Koordinaten verarbeiten. +
        +

    • +
    + +

    Die folgende Abbildung macht den Unterschied zwischen RC- und +NDC-Koordinaten noch einmal besonders deutlich: +

    +

    +

    Hinweis: In der Praxis wird das NDC-System nur selten +benutzt. Programme, die exakte Bemaßungen anbieten müssen +(Desktop-Publishing, wissenschaftliche Grafik) müssen intern sowieso +eine eigene, feinere Koordinatendarstellung benutzen. +

    +

    Die Verwendung des NDC-Systems würde dazu führen, daß +Koordinaten gleich zweimal konvertiert werden (einmal von der internen +Darstellung in NDC-Koordinaten, anschließend in Rasterkoordinaten), +was zu überflüssigen Geschwindigkeitsverlusten und Rundungsfehlern +führt. +

    +

    Querverweis: Grundlagen des VDI   Style-Guidelines +

    +

    7.2.6 Metafile-Format

    +

    Metadateien sind nichts anderes als abgespeicherte VDI-Befehle, +die in objektorientierten Programmen wie GEMDRAW oder +Kandinsky benutzt werden. Der Hauptzweck ist dabei der +standardisierte Datenaustausch zwischen verschiedenen +GEM-Applikationen. Eine Metadatei beginnt mit einem Kopf, der die +Charakteristika der in ihr enthaltenen Grafik beschreibt, und wie +folgt aufgebaut ist: +

    + +
    typedef struct
    +{
    +   int16_t id;           /* besitzt stets den Wert 0xffff          */
    +   int16_t headlen;      /* Länge des Kopfes                       */
    +   int16_t version;      /* Versionsnummer                         */
    +   int16_t transform;    /* NDC- oder RC-Koordinatensystem         */
    +   int16_t extents[4];   /* max. Ausmaße der Grafik (optional)     */
    +   int16_t pagesize[2];  /* Seitengröße in 1/10mm   (optional)     */
    +   int16_t coords[4];    /* Koordinatensystem       (optional)     */
    +   int16_t bit_image;    /* Bit-Image vorhanden (1) oder nicht (0) */
    +   int16_t reserved[9];  /* reserviert                             */
    +} META_HEADER;
    +
    +

    Hinweis: Die Komponente bit_image des Headers +gibt an, ob sich eine Bit-Image-Datei in der Metafile-Datei befindet. +Tatsächlich befindet sich jedoch in keiner Metadatei eine +Pixelgrafik; zeichnet man beispielsweise in GEMPAINT ein Bild +namens 'test', so erstellt das Programm außer der Datei 'test.img' +noch die Datei 'test.gem'. In letzterer befindet sich genau ein +VDI-Befehl (v_bit_image), und die Komponente bit_image +besitzt dann den Wert 1. +

    +

    Beim Lesen von Metafiles wird keine feste Länge benutzt; +vielmehr liest eine Applikation zunächst die ersten beiden Wörter +(und damit die Länge) des Headers. Anschließend wird der Rest des +Kopfes gelesen. Es folgen dann beliebig viele Einträge der Form: +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    WortInhaltBelegung
    0contrl[0]VDI-Befehlsnummer
    1contrl[1]Anzahl der Werte in ptsin
    2contrl[3]Anzahl der Werte in intin
    3contrl[5]Unterfunktionsnummer
    ab 4ptsin[]Belegung des ptsin-Feldes
    danachintin[]Belegung des intin-Feldes
    +
    + +

    Das Ende eines Metafiles wird durch den Wert -1 (für contrl[0]) +angezeigt. Wichtig: Metadateien liegen immer im +Intel-Format (low-high) vor. Um auf einem 680X0er-System +Metadateien zu bearbeiten, muss daher beim Einlesen in jedem Wort das +nieder- und höherwertige Byte vertauscht werden. +

    +

    Über die Komponente pagesize lassen sich Angaben zur +Seitenbreite und -höhe ermitteln. Möchte man Metadateien erstellen, +so wird man diesen beiden Werten Standardgrößen geben. Folgende +Standardgrößen werden von den meisten GEM-Programmen unterstützt: +

    + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    BezeichnungZollZentimeter
    Letter8,50 * 11,0021,59 * 27,94
    Legal8,50 * 14,0021,59 * 35,56
    Half8,50 * 5,5021,59 * 13,97
    Ledger11,00 * 17,0027,94 * 43,18
    DIN A311,69 * 16,5429,70 * 42,00
    DIN A48,07 * 11,6921,00 * 29,70
    DIN A55,85 * 8,2714,80 * 21,00
    DIN B57,17 * 9,8418,20 * 25,00
    Wide14,00 * 11,0035,56 * 27,94
    +
    + +

    Die Werte für pagesize[0] (Breite) und +pagesize[1] (Höhe) ergeben sich dabei aus den +Zentimeter-Werten multipliziert mit 100. +

    +

    Querverweis: +
    Metafile-Treiber   Metafile-Funktionen   Sub-Opcodes   XIMG-Format   OUT-Dateiformat +

    +

    7.2.6.1 Metafile Sub-Opcodes

    +

    Das GEM-Metafile-Format kann durch benutzerdefinierte +Sub-Opcodes nahezu beliebig erweitert werden, ohne daß +Inkompatibilitäten entstehen. Es sollten lediglich die folgenden zwei +Punkte beachtet werden: +

    +
      +
    • da die Nummern von 0 bis 100 für das Betriebssystem reserviert +sind, kommen für Sub-Opcodes nur Nummern ab 101 in Frage. +
        +

    • +
    • jeder Entwickler sollte darauf achten, daß der von ihm +vorgesehene Opcode nicht bereits anderweitig belegt ist, um einen +reibungslosen Datenaustausch zu gewährleisten. +
        +

    • +
    + +

    Die folgende Liste enthält eine Beschreibung der z.Zt. +definierten und bekannten Opcodes: +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Code Name Beschreibung +
        + + +
      10 GEM_START_GROUP Definiert den Beginn einer Gruppe, d.h. einer Menge +zusammengehörender Objekte. + + +
      11 GEM_END_GROUP Markiert das Ende einer Gruppe, d.h. einer Menge +zusammengehörender Objekte. + +
      32 GEM_BEZ_QUAL siehe v_bez_qual +
      34 ??? z.Zt. keine Informationen bekannt. + + +
      49 GEM_NO_LINE_STYLE Jeglicher Linienstil soll ausgeschaltet werden. + + +
      50 GEM_START_SHADOW Informiert darüber, daß die bis GEM_END_SHADOW folgenden +VDI-Befehle dazu benutzt werden, um für das erste Objekt nach +GEM_END_SHADOW einen Schatten zu zeichnen. + + +
      51 GEM_END_SHADOW Markiert das Ende einer Folge von Befehlen die zum Zeichnen +eines Objektschattens benutzt werden, und per GEM_START_SHADOW +eingeleitet werden. + + + + +
      80 GEM_START_FILL   +
      81 GEM_END_FILL Alle zwischen diesen beiden Codes liegenden Befehle werden dazu +benutzt, um eine ausgefüllte Fläche mit oder ohne Umrandung zu +zeichnen. +
    Beispiel: Schrittweises Zeichnen einer Polygonfläche +mit Schatten und Umrandung. +
      +
    • GEM_START_FILL +
    • +
    • GEM_START_SHADOW +
    • +
    • Füllattribute für Schatten setzen +
    • +
    • v_fillarea versetzt um dx und dy +
    • +
    • GEM_END_SHADOW +
    • +
    • Füllattribute der Fläche setzen +
    • +
    • v_fillarea +
    • +
    • Linienattribute für Umrandung setzen +
    • +
    • v_pline +
    • +
    • GEM_END_FILL +
    • +
    + + + +
     101 VM_VER_APP Gibt Auskunft über den Namen und die Versionsnummer der +Applikation, die eine Metadatei erstellt hat. Es gilt: + + + + + + + + + + + + + + + + + + +
    intin[0] = VM_VER_APP +
    intin[1] = Versionsnummer +
    intin[2] = Name der Applikation, welche +
    : die Metadatei erstellt hat. +
    :   +
    intin[n]   + +
    + +
    Hinweis: Der Name der Applikation sollte immer +ohne Suffix angegeben werden, da dieses auf verschiedenen +GEM-Systemen unterschiedlich sein kann. + + +
     102 GEM_COLOR z.Zt. keine Informationen bekannt. +
     103 ??? z.Zt. keine Informationen bekannt. +
     107 ??? z.Zt. keine Informationen bekannt. +
     111 ??? z.Zt. keine Informationen bekannt. + + +
     170 GEM_START_BGIF Leitet eine Textausgabe per BGI-Vektorzeichensatz ein. Es gilt: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    intin[0] = GEM_START_BGIF +
    intin[1] = nicht-proportional (Wert 0) +
    intin[2] = Name, z.B. EURO +
    : ==> intin[2] = 69 +
    :   +
    intin[10]   +
    intin[11] = Text mit abschliessender Null +
    :   +
    :   +
    ptsin[0] = x-Koordinate +
    ptsin[1] = y-Koordinate des Textes in 1/10mm +
    ptsin[2] = Buchstabenbreite +
    ptsin[3] = Buchstabenhöhe in 1/10mm +
    ptsin[4] = Rotation in 1/10 Grad + +
    + +
    Bis GEM_END_BGIF folgen die v_pline Befehle, die zur Darstellung +des Textes notwendig sind, falls ein Programm diese Sub-Opcodes nicht +interpretieren kann. + + +
     171 GEM_END_BGIF kennzeichnet das Ende einer Textausgabe per BGI-Vektorschrift. + + +
     190 GEM_WIND Legt Position, Zoomstufe und Format eines Fensters fest; es +gilt: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    intin[0] = GEM_WIND +
    intin[1] = x-Position +
    intin[2] = y-Position +
    intin[3] = Breite +
    intin[4] = Höhe des Fensters in Pixeln +
    intin[5] = x-Position +
    intin[6] = y-Position des Sliders (Pixel) +
    intin[7] = Zoomstufe in Prozent +
    intin[8] = Format (0 = Hoch, 1 = Quer) + +
    + + + +
     191 GEM_GRID Ermöglicht das dauerhafte Sichern der Rastereinstellungen +eines Fensters; es gilt: + + + + + + + + + + + + + + + + + + + + + + + + +
    intin[0] = GEM_GRID +
    intin[1] = Raster inaktiv (bei Wert 0) +
    intin[2] = Raster nicht zeichnen (bei 0) +
    intin[3] = Rasterbreite in 1/10mm +
    intin[4] = Rasterhöhe in 1/10mm +
    intin[5] = Hilfslinien-Abstand (horiz.) +
    intin[6] = Hilfslinien-Abstand (vertikal) in 1/10mm +
    intin[7] = Hilfslinien (0) bzw. Punkte + +
    + + + +
     192 GEM_ALIGN Beschreibt das Bezugs-Objekt; es gilt: + + + + + + + + + + + + + + + + + + +
    intin[0] = GEM_ALIGN +
    intin[1] = Bezugsobjekt nicht zeichnen (0) +
    intin[2] = x-Koordinate +
    intin[3] = y-Koordinate des Bezugsobjektes in 1/10mm +
    intin[4] = Breite +
    intin[5] = Höhe des Objektes in 1/10mm + +
    + + + +
     193 GEM_START_GREY Legt einen Grauton als Füllfläche fest; dabei sind +Abstufungen im Bereich von 0..255 (weiß..schwarz) möglich. Es gilt: + + + + + + +
    intin[0] = GEM_START_GREY +
    intin[1] = Graustufe (0..255) + +
    + +
    Die bis GEM_END_GREY folgenden Befehle setzen ein +benutzerdefiniertes Muster mit dem entsprechenden Grauton; sie dienen +nur für Programme, die mit diesen Opcodes nichts anfangen können. + + +
     194 GEM_END_GREY Kennzeichnet das Ende eines benutzerdefinierten +Grauton-Musters. + + +
     195 GEM_START_BEZIER Definiert einen Bezier-Zug. Es gilt: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    intin[0] = GEM_START_BEZIER +
    intin[1] = Rekursionstiefe (< 5) +
    intin[2] = Attribute der Ankerpunkte als Bitvektor; gesetzte Bits +bedeuten dabei: +
    : Bit-0 = Ecke +
    : Bit-1 = verschiebt +
    : Bit-2 = sichtbar +
    : Bit-3 = Linie statt Bezier +
    :   +
    intin[2n+1]   +
    ptsin[0] = Koordinaten der n Beziersegmente (jedes besteht aus vier +Punkten) +
    ptsin[4n-1]   + +
    + +
    Bis GEM_END_BEZIER folgen dann v_pline Aufrufe, die für +Programme, die den Sub-Opcode nicht verstehen, einen äquivalenten +Polygonzug zeichnen. + + +
     196 GEM_END_BEZIER Kennzeichnet das Ende eines Bezier-Zugs. + + +
     197 GEM_START_JOIN Erlaubt es, mehr Koordinaten abzuspeichern, als der +Metafile-Treiber erlaubt. Findet eine Applikation diesen Sub-Opcode so +werden die ptsin-Felder der bis GEM_END_JOIN folgenden VDI-Blöcke zu +einem grossen Feld zusammengefasst. Es gilt: + + + + + + +
    intin[0] = GEM_START_JOIN +
    intin[1] = Anzahl der Koordinatenpaare + +
    + + + +
     198 GEM_END_JOIN Kennzeichnet das Ende eines per GEM_START_JOIN definierten +Abschnitts. +
     199 ??? z.Zt. keine Informationen bekannt. +
     201 ??? z.Zt. keine Informationen bekannt. +
     203 ??? z.Zt. keine Informationen bekannt. +
     230 ??? z.Zt. keine Informationen bekannt. + +
    + +

    Hinweis: Beim Lesen eines Metafiles sollte ein Programm +unbekannte Anweisungen unbedingt ignorieren. +

    +

    Querverweis: v_write_meta   Beispiel-Binding   Analysieren eines Metafiles +

    +

    7.2.6.2 Analysieren eines Metafiles

    +

    Zum Verständnis des Metafile-Formats kann es nützlich sein, +sich den Inhalt einer Metadatei im Klartext anzeigen zu lassen. Die +hierzu notwendigen Tools befinden sich in vielen Mailboxen des +Mausnetzes. +

    +

    +

    Beispiel: Die Abbildung oben zeigt ein Fenster der +Graphiksoftware GEM-Look, mit einer darin befindlichen +Vektorgrafik im Metafile-Format. +

    +

    Die Software erlaubt es u.a. sich den Inhalt einer GEM-Metadatei +im Klartext anzeigen, und diesen sogar in beliebigen Schritten +abarbeiten zu lassen. +

    +

    Darüber hinaus kann über eine Dialogbox genau spezifiziert +werden welche Informationen bei der Analyse berücksichtigt bzw. +ausgegeben werden sollen, und in welchem Format die Ausgabe erscheinen +soll. +

    +

    +

    Die Klartext-Information wird dabei in einem Fenster +dargestellt, und kann (ganz oder teilweise) über das Klemmbrett in +andere Programme übertragen werden. +

    +

    Dadurch, daß sich alle Befehle des Ausgabefensters auch einzeln +und in beliebiger Reihenfolge ausführen lassen, lassen sich die in +einer Metadatei gespeicherten Befehle sehr leicht nachvollziehen. +

    +

    Querverweis: +
    Beispiel-Analyse   Metafile-Format   Metafile Sub-Opcodes +

    +

    7.2.6.3 Binding eines Metafile-Subopcodes

    +
    /* Das folgende Code-Fragment erlaubt es, den Namen und die
    +   Versionsnummer der Applikation, die eine Metadatei er-
    +   stellt, im Metafile abzulegen... */
    +
    +GLOBAL void vm_ver_app( int16_t vdi_handle, int16_t version,
    +       uint8_t *app_name)
    +{
    +    int16_t i;
    +
    +    contrl[0] = 5;
    +    contrl[1] = 0;
    +    contrl[3] = 2 + strlen (app_name);
    +    contrl[5] = 99;                      /* v_write_meta */
    +    contrl[6] = vdi_handle;
    +
    +    intin[0] = VM_VER_APP;
    +    intin[1] = version;
    +
    +    i = 2;
    +    while ((intin [i++] = (int16_t) (uint8_t)*app_name++) != 0)
    +                ;
    +
    +    vdi ();
    +} /* vm_ver_app */
    +
    +

    Querverweis: VDI-Bindings   Metafile-Format +

    +

    7.2.6.4 Beispiel-Analyse eines Metafile

    +
    // Diese Analyse wurde erstellt von GEM-Look, dem Programm zum
    +// Anzeigen und Analysieren von Grafiken im XIMG und Metafile-
    +// Format; (c) 1994-1995 by Rolf Kotzian.
    +//
    +// Es ist nicht erlaubt, Teile der Analyse ohne diesen Header
    +// zu verbreiten
    +
    +
    +Analyse von: E:\C\GEISS\EXAMPLES\GEM_IMG\BEZIER.GEM
    +
    +Metafile-ID            :     -1
    +Länge des Kopfes       :     24
    +GEM-Version            :    3.10
    +NDC/RC Flag            :     RC
    +Ausmaß minimales x     :  -2720
    +Ausmaß minimales y     :  -2136
    +Ausmaß maximales x     :   2112
    +Ausmaß maximales y     :   1592
    +Seiten-Breite          :  14.80 cm
    +Seiten-Höhe            :  21.00 cm
    +Koord.System linkes x  :  -3495
    +Koord.System linkes y  :   4960
    +Koord.System rechtes x :   3495
    +Koord.System rechtes y :  -4960
    +Bit-Image vorhanden?   :   nein
    +
    +
    +***** Befehl #1 *****
    +
    +vswr_mode (vdi_handle, mode)
    +contrl[0] = 32
    +contrl[1] = 0
    +contrl[3] = 1
    +contrl[5] = 100
    +
    +intin[0] = 1
    +
    +***** Befehl #2 *****
    +
    +vsl_type (vdi_handle, style)
    +contrl[0] = 15
    +contrl[1] = 0
    +contrl[3] = 1
    +contrl[5] = 100
    +
    +intin[0] = 1
    +
    +***** Befehl #3 *****
    +
    +vsl_width (vdi_handle, width)
    +contrl[0] = 16
    +contrl[1] = 1
    +contrl[3] = 0
    +contrl[5] = 100
    +
    +ptsin[0] = x = 1
    +ptsin[1] = y = 1
    +
    +***** Befehl #4 *****
    +
    +vsl_color (vdi_handle, index)
    +contrl[0] = 17
    +contrl[1] = 0
    +contrl[3] = 1
    +contrl[5] = 100
    +
    +intin[0] = 1
    +
    +***** Befehl #5 *****
    +
    +vsl_ends (vdi_handle, beg_style, end_style)
    +contrl[0] = 108
    +contrl[1] = 0
    +contrl[3] = 2
    +contrl[5] = 100
    +
    +intin[0] = 0
    +intin[1] = 0
    +
    +***** Befehl #6 *****
    +
    +vsm_type (vdi_handle, symbol)
    +contrl[0] = 18
    +contrl[1] = 0
    +contrl[3] = 1
    +contrl[5] = 100
    +
    +intin[0] = 1
    +
    +***** Befehl #7 *****
    +
    +vsm_height (vdi_handle, height)
    +contrl[0] = 19
    +contrl[1] = 1
    +contrl[3] = 0
    +contrl[5] = 100
    +
    +ptsin[0] = x = 1
    +ptsin[1] = y = 1
    +
    +***** Befehl #8 *****
    +
    +vsm_color (vdi_handle, index)
    +contrl[0] = 20
    +contrl[1] = 0
    +contrl[3] = 1
    +contrl[5] = 100
    +
    +intin[0] = 1
    +
    +***** Befehl #9 *****
    +
    +vst_rotation (vdi_handle, angle)
    +contrl[0] = 13
    +contrl[1] = 0
    +contrl[3] = 1
    +contrl[5] = 100
    +
    +intin[0] = 0
    +
    +***** Befehl #10 *****
    +
    +vst_font (vdi_handle, font)
    +contrl[0] = 21
    +contrl[1] = 0
    +contrl[3] = 1
    +contrl[5] = 100
    +
    +intin[0] = 1
    +
    +***** Befehl #11 *****
    +
    +vst_color (vdi_handle, index)
    +contrl[0] = 22
    +contrl[1] = 0
    +contrl[3] = 1
    +contrl[5] = 100
    +
    +intin[0] = 1
    +
    +***** Befehl #12 *****
    +
    +vst_alignment (vdi_handle, hor_in, vert_in, hor_out, vert_out)
    +contrl[0] = 39
    +contrl[1] = 0
    +contrl[3] = 2
    +contrl[5] = 100
    +
    +intin[0] = 0
    +intin[1] = 0
    +
    +***** Befehl #13 *****
    +
    +vst_effects (vdi_handle, effect)
    +contrl[0] = 106
    +contrl[1] = 0
    +contrl[3] = 1
    +contrl[5] = 100
    +
    +intin[0] = 0
    +
    +***** Befehl #14 *****
    +
    +vst_point (vdi_handle, point, char_width, char_height, cell_width,
    +           cell_height)
    +
    +contrl[0] = 107
    +contrl[1] = 0
    +contrl[3] = 1
    +contrl[5] = 100
    +
    +intin[0] = 12
    +
    +***** Befehl #15 *****
    +
    +vsf_interior (vdi_handle, style)
    +contrl[0] = 23
    +contrl[1] = 0
    +contrl[3] = 1
    +contrl[5] = 100
    +
    +intin[0] = 1
    +
    +***** Befehl #16 *****
    +
    +vsf_style (vdi_handle, index)
    +contrl[0] = 24
    +contrl[1] = 0
    +contrl[3] = 1
    +contrl[5] = 100
    +
    +intin[0] = 1
    +
    +***** Befehl #17 *****
    +
    +vsf_color (vdi_handle, index)
    +contrl[0] = 25
    +contrl[1] = 0
    +contrl[3] = 1
    +contrl[5] = 100
    +
    +intin[0] = 1
    +
    +***** Befehl #18 *****
    +
    +vsf_perimeter (vdi_handle, per_vis)
    +contrl[0] = 104
    +contrl[1] = 0
    +contrl[3] = 1
    +contrl[5] = 100
    +
    +intin[0] = 1
    +
    +***** Befehl #19 *****
    +
    +v_write_meta (vdi_handle, num_ints, ints, num_pts, pts)
    +contrl[0] = 5
    +contrl[1] = 0
    +contrl[3] = 7
    +contrl[5] = 99
    +
    +intin[0] = 34
    +intin[1] = 3
    +intin[2] = 1
    +intin[3] = 42
    +intin[4] = 42
    +intin[5] = 42
    +intin[6] = 42
    +
    +***** Befehl #20 *****
    +
    +v_bez_on (vdi_handle)
    +contrl[0] = 11
    +contrl[1] = 1
    +contrl[3] = 0
    +contrl[5] = 13
    +
    +***** Befehl #21 *****
    +
    +vsf_perimeter (vdi_handle, per_vis)
    +contrl[0] = 104
    +contrl[1] = 0
    +contrl[3] = 2
    +contrl[5] = 13
    +
    +intin[0] = 1
    +intin[1] = 1
    +
    +***** Befehl #22 *****
    +
    +vsf_color (vdi_handle, index)
    +contrl[0] = 25
    +contrl[1] = 0
    +contrl[3] = 1
    +contrl[5] = 13
    +
    +intin[0] = 2
    +
    +***** Befehl #23 *****
    +
    +vsf_interior (vdi_handle, style)
    +contrl[0] = 23
    +contrl[1] = 0
    +contrl[3] = 1
    +contrl[5] = 13
    +
    +intin[0] = 0
    +
    +***** Befehl #24 *****
    +
    +vsf_style (vdi_handle, index)
    +contrl[0] = 24
    +contrl[1] = 0
    +contrl[3] = 1
    +contrl[5] = 13
    +
    +intin[0] = 0
    +
    +***** Befehl #25 *****
    +
    +vsl_color (vdi_handle, index)
    +contrl[0] = 17
    +contrl[1] = 0
    +contrl[3] = 1
    +contrl[5] = 13
    +
    +intin[0] = 3
    +
    +***** Befehl #26 *****
    +
    +vsl_width (vdi_handle, width)
    +contrl[0] = 16
    +contrl[1] = 1
    +contrl[3] = 0
    +contrl[5] = 13
    +
    +ptsin[0] = x = 1
    +ptsin[1] = y = 0
    +
    +***** Befehl #27 *****
    +
    +vsf_perimeter (vdi_handle, per_vis)
    +contrl[0] = 104
    +contrl[1] = 0
    +contrl[3] = 2
    +contrl[5] = 13
    +
    +intin[0] = 1
    +intin[1] = 1
    +
    +***** Befehl #28 *****
    +
    +vsl_ends (vdi_handle, beg_style, end_style)
    +contrl[0] = 108
    +contrl[1] = 0
    +contrl[3] = 2
    +contrl[5] = 13
    +
    +intin[0] = 0
    +intin[1] = 0
    +
    +***** Befehl #29 *****
    +
    +v_bez (vdi_handle, count, xyarr, bezarr, minmax, npts, nmove)
    +contrl[0] = 6
    +contrl[1] = 17
    +contrl[3] = 9
    +contrl[5] = 13
    +
    +ptsin[0] = x = -2125
    +ptsin[1] = y = 100
    +ptsin[2] = x = -708
    +ptsin[3] = y = -441
    +ptsin[4] = x = 237
    +ptsin[5] = y = 640
    +ptsin[6] = x = 1654
    +ptsin[7] = y = -981
    +ptsin[8] = x = 237
    +ptsin[9] = y = 640
    +ptsin[10] = x = -1180
    +ptsin[11] = y = 2261
    +ptsin[12] = x = 2127
    +ptsin[13] = y = 1723
    +ptsin[14] = x = 2127
    +ptsin[15] = y = 100
    +ptsin[16] = x = 2127
    +ptsin[17] = y = -1522
    +ptsin[18] = x = -708
    +ptsin[19] = y = 100
    +ptsin[20] = x = 237
    +ptsin[21] = y = -981
    +ptsin[22] = x = 1182
    +ptsin[23] = y = -2062
    +ptsin[24] = x = -2124
    +ptsin[25] = y = -2601
    +ptsin[26] = x = -2597
    +ptsin[27] = y = -1522
    +ptsin[28] = x = -3070
    +ptsin[29] = y = -441
    +ptsin[30] = x = -1653
    +ptsin[31] = y = -440
    +ptsin[32] = x = -2125
    +ptsin[33] = y = 100
    +
    +intin[0] = 2344
    +intin[1] = 4112
    +intin[2] = 4105
    +intin[3] = 2320
    +intin[4] = 4112
    +intin[5] = 4105
    +intin[6] = 2320
    +intin[7] = 4112
    +intin[8] = 12
    +
    +***** Befehl #30 *****
    +
    +v_bez_off (vdi_handle)
    +contrl[0] = 11
    +contrl[1] = 0
    +contrl[3] = 0
    +contrl[5] = 13
    +
    +***** Befehl #31 *****
    +
    +vsf_perimeter (vdi_handle, per_vis)
    +contrl[0] = 104
    +contrl[1] = 0
    +contrl[3] = 2
    +contrl[5] = 13
    +
    +intin[0] = 0
    +intin[1] = 0
    +
    +
    +// Ende der Analyse
    +// GEM-Look, (c) 1994/95 by Rolf Kotzian
    +
    +

    Querverweis: Analyse eines Metafiles   VDI-Bindings +

    +

    7.2.6.5 Metafile-Version

    +

    Die Versionsnummer hängt davon ab, mit welchem GEM-System die +Metadatei erstellt worden ist; sie wird durch die Formel 100 * +Hauptversionsnummer + Nebenversionsnummer beschrieben. +

    +

    Beispiel: Der Wert 301 steht für Version 3.1 +

    +

    7.2.7 NVDI

    + +

    NVDI (NewVDI) ist ein von den Behne-Brüdern +entwickeltes VDI, welches das Original des Atari vollständig ersetzt. +Dabei besticht neben der sehr hohen Geschwindigkeit vor allem die +Möglichkeit, Vektorzeichensätze der Formate Speedo und TrueType (mit +einem speziellen Modul auch Type-1) verwenden zu können. NVDI liegt +auch in einer speziellen Macintosh-Version vor (NVDIMac), und +ermöglicht es jedem Programm das über GDOS ausgeben kann (in +Verbindung mit MagiC Mac), seine Ausgaben auch auf Apple-Druckern und +im Netzwerk tätigen zu können. +

    +

    Um herauszufinden, welche NVDI-Version man vor sich hat und +welchen Funktionsumfang sie hat, muß der Cookie NVDI gesucht werden, +der die Versionsnummer im BCD-Format enthält (z.B. 0x0410 für +Version 4.10). +

    + +

    Wer die Offscreen-Bitmaps nutzen möchte, sollte nach dem 'EdDI'-Cookie +suchen (z.B. per is_EdDI()). Das auf die Kennung folgende Langwort ist +die Adresse eines Dispatchers, der mit der Funktionsnummer in Register +d0.w aufgerufen wird. Für den Aufruf gelten die Pure C-Konventionen, +d.h. Register d0-d2/a0-a1 und der Stack werden zur Parameterübergabe +benutzt, d0-d2/a0-a1 können verändert werden. Die Funktion 0 liefert +die EdDI-Versionsnummer im BCD-Format (z.B. 0x0110 für Version 1.10). +

    +

    Querverweis: +
    Off-Screen-Bitmaps   v_opnbm   v_clsbm   Grundlagen des VDI   +vq_scrninfo   GEM +

    +

    7.2.7.1 is_EdDI

    +

    Beispiel-Code für Pure-C: +

    +
    GLOBAL BOOLEAN is_EdDI ()
    +{
    +    int16_t (*func)(int16_t);
    +
    +    if (get_cookie ("EdDI", (LONG *) &func))
    +        return ((*func)(0));
    +
    +    else return (FALSE);
    +
    +} /* is_EdDI */
    +
    +

    7.2.8 Off-Screen-Bitmaps

    +

    Für viele Anwendungen ist es sehr nützlich, wenn +Zeichenfunktionen nicht direkt auf den Bildschirm, sondern auf einen +nicht sichtbaren Bildschirm angewendet werden können. Einen +derartigen "versteckten" Bildschirm nennt man +Off-Screen-Bitmap. +

    +

    Zur Erzeugung von Off-Screen-Bitmaps dient die Funktion +v_opnbm(). Man kann ihr entweder die Größe eines Bitmap angeben, die +Sie allozieren soll, oder ihr eine Bitmap übergeben. Die Bitmap wird +im gleichen Format wie die des Bildschirms verwaltet, wodurch +schnelles Kopieren zwischen beiden möglich ist. Die Funktion +v_clsbm() schließt eine mit v_opnbm() erzeugte Bitmap und gibt +gegebenenfalls deren Speicher zurück. +

    +

    Rasteroperationen zwischen Bildschirm und Off-Screen-Bitmap +sollten grundsätzlich im gerätespezifischen Format erfolgen. Wenn +als Ziel einer Rasteroperation eine Off-Screen-Bitmap mit ihrem MFDB +angegeben wird und wenn das zu dieser Bitmap gehörende Handle benutzt +wird, so wird beim Blitten anhand der über vs_clip() auf dieser +Workstation eingestellten Koordinaten geclippt. Für das Kopieren +eines Rasters vom Bildschirm in eine Off-Screen-Bitmap sollte man also +das vdi_handle dieser Bitmap benutzen. +

    +

    Ist die Bitmap dagegen Quelle und der Bildschirm Ziel, so sollte +man das Handle der Bildschirm-Workstation benutzen, da dann das Raster +anhand der Bildschirm-Koordinaten abgeclippt wird. Wenn man das von +v_opnbm() zurückgelieferte Handle einer Bitmap benutzt und in +fd_addr in einem MFDB 0 enthält, so werden die Daten der +Bitmap statt dessen benutzt. +

    +

    Querverweis: NVDI   GDOS   Style-Guidelines +

    +

    7.2.9 Das OUT-Dateiformat

    + +

    Das OUT-Format wurde von Digital Research entwickelt und +ermöglicht wie das XIMG oder Metafile-Format den Datenaustausch +zwischen beliebigen GEM-Applikationen. Genauer gesagt können hiermit +Steuerzeichen für Textattribute in eine Datei mit dem Suffix +".out" geschrieben werden, die dann vom Ausgabetreiber +erkannt, und berücksichtigt werden. +

    +

    Das OUT-Format ist somit besonders geeignet, um Textdateien mit +Attributen zwischen verschiedenen Applikationen auszutauschen. +OUT-Dateien sind nicht anderes als ASCII-Dateien, die zum Umschalten +zwischen Textattributen den Steuercode DC2 (ASCII-Wert 18) benutzen; +anschließend folgt ein Buchstabe, der das Ein- oder Ausschalten des +Attriutes beschreibt: +

    +

    Folgende Steuerzeichen sind definiert: +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CodeBedeutung
    DC2 0Fettschrift ein
    DC2 1Fettschrift aus
    DC2 2Kursiv ein
    DC2 3Kursiv aus
    DC2 4Unterstrichen ein
    DC2 5Unterstrichen aus
    DC2 6Superscript ein
    DC2 7Superscript aus
    DC2 8Subscript ein
    DC2 9Subscript aus
    DC2 ABriefqualität-Modus ein
    DC2 BBriefqualität-Modus aus
    DC2 CBreitschrift ein
    DC2 DBreitschrift aus
    DC2 Ehelle Schrift ein
    DC2 Fhelle Schrift aus
    DC2 G 
    : 
    : 
    DC2 Vreserviert, wird ignoriert
    DC2 WPica-Schrift (10 cpi)
    DC2 XElite-Schrift (12 cpi)
    DC2 Ykomprimierter Druck
    DC2 ZProportionalschrift
    +
    + +

    Hinweis: Selbstverständlich können auch Grafiken in +die Ausgabedatei mit eingebunden werden, die Syntax lautet in diesem +Fall: +

    +
    (ESC)(ESC)GEM,x,y,w,h,C:\pathname\filename.img
    +
    +

    Die Parameter x,y,w und h sind dabei in Zeicheneinheiten relativ +zur aktuellen Cursorposition anzugeben. +

    +

    Querverweis: GDOS-Treiber   v_alpha_text   XIMG-Format +Metafile-Format +

    +

    7.2.10 Rasterformate

    +

    Bei der Arbeit mit Bildschirmen spielen die Rasterfunktionen +eine besondere Rolle; sie sind für all das zuständig, was mit der +Bewegung oder Veränderung von Bildschirmausschnitten zu tun hat. +Beispiel: Scrolling innerhalb eines Dokumentes oder das Darstellen von +Icons. +

    +

    Die Rasterfunktionen können ihre Aufgabe natürlich nur dann +effizient ausführen, wenn als interne Darstellung das gleiche Format +verwendet wird, wie es auch im Bildspeicher benutzt wird; anderenfalls +müßten die Daten bei jedem einzelnen Aufruf einer Rasterfunktion +konvertiert werden. Naturgemäß ist jedoch der interne Aufbau des +Bildspeichers von der Hardware des benutzten Grafiksystems abhängig - +mal davon abgesehen, daß der Bildspeicher gar nicht unbedingt direkt +für den Prozessor zugänglich sein muß. +

    +

    Die Anzahl der pro Pixel benötigten Bits hängt natürlich von +der Anzahl der gleichzeitig darstellbaren Farben ab; für monochrome +Pixel reicht 1 Bit, bei 16 Farben sind schon vier Bits notwendig. +Abhängig von der verwendeten Videohardware können diese Bits +natürlich völlig verschieden angeordnet sein; daher verwundert es +nicht, daß für diesen Zweck verschiedene Formate zur Verfügung +stehen: +

    + + +

    pixelorientiertes Format: In diesem Fall werden alle zu +einem Pixel gehörenden Bits zusammen in ein oder mehrere Bytes +kodiert. In einem System mit 16 Farben würden also jeweils zwei Pixel +gemeinsam in einem Byte abgespeichert; bei 256 Farben nimmt jeder +Pixel ein Byte ein. +

    + + +

    planeorientiertes Format: In diesem Fall betrachtet man +den Bildspeicher als eine Sammlung monochromer (d.h. einfarbiger) +Bildebenen (Planes). Um zu einem Pixel die Farbe zu ermitteln, +kombiniert man die zuständigen Bits aus den einzelnen Ebenen zu einem +Farbwert. Damit ist natürlich noch nichts darüber ausgesagt, wie die +einzelnen Ebenen im Bildspeicher angeordnet sind. Eine einfache (und +im PC-Bereich durchaus übliche) Lösung ist es, eine Plane nach der +anderen hintereinander im Bildspeicher abzulegen. +

    +

    Um nicht auf ein bestimmtes, Hardware-abhängiges Format +angewiesen zu sein, unterscheidet das VDI zwischen dem +geräteabhängigen Format (welches eben von der Hardware +abhängt), und dem sogenannten Standardformat. Das Standardformat ist +für alle VDI-Systeme gleich, und kann daher immer dann benutzt +werden, wenn Rastergrafiken von außen in das System eingebracht +werden sollen (Beispiel: Darstellung von Icons in einer +Resource-Datei). Zur Umwandlung zwischen beiden Formaten steht die +Funktion vr_trnfm zur Verfügung. +

    + + + + +

    Das VDI-Standardformat ist wie folgt definiert: +

    +
      +
    • das Format ist planeorientiert. Jede Bildebene belegt ein +zusammenhängendes Stück Speicher, und besitzt die gleiche Anzahl von +Bildpunkten. +
        +

    • +
    • das höchste Bit eines 16-Bit Wortes steht für den am +weitesten links stehenden Pixel. +
        +

    • +
    • aufeinanderfolgende Worte im Bildspeicher bilden die einzelnen +Zeilen. Das erste Wort einer solchen Zeile liegt am linken Bildrand; +die erste Zeile der Plane kodiert die oberste Pixelzeile. +
        +

    • +
    + +

    Die folgende Abbildung zeigt ein Beispiel für das +geräteunabhängige Standardformat mit 3 Farbebenen (Planes): +

    +

    +

    Achtung: In den monochromen Grafikmodi von ST und TT +entspricht das geräteabhängige Format zufällig (!) dem +geräteunabhängigen d.h. dem Standardformat. Das heißt natürlich +nicht, daß man deshalb auf den Einsatz der Funktion vr_trnfm +verzichten darf. Da man über das geräteabhängige Format im +Normalfall keine Informationen besitzt, verbietet sich schon aus +diesem Grund jede direkte Manipulation am Bildspeicher. +

    + + +

    Das VDI arbeitet prinzipiell Farbregister-orientiert +(Color-Lookup-Table). Es geht also davon aus, daß es eine Maximalzahl +von gleichzeitig darstellbaren Farben gibt, und daß man diesen +Farbregistern bestimmte (relativ frei wählbare) Farbtöne zuordnen +kann. Da diese Eigenschaft jedoch keinesfalls selbstverständlich ist, +kann sie per vq_extnd erfragt werden. Im folgenden zwei Beispiele für +Grafikmodi ohne Color-Lookup-Table: +

    +
      +
    • Der TT-Grafikmodus 'TT-Hoch': es gibt nur zwei Farbregister und +zwei Farbtöne (Schwarz und Weiß), die auch nicht vertauscht werden +können. +
        +

    • +
    • Bei True-Color Grafikkarten wie der Crazy-Dots-II können +'beliebig' viele Farben gleichzeitig dargestellt werden. Normalerweise +werden 24 Bits pro Pixel benutzt, so daß etwa 16 Millionen Farben zur +Verfügung stehen. Bei einer derartigen Anzahl von Farbnummern hat +sich die Idee von Farbregistern erledigt: die Anzahl der prinzipiell +gleichzeitig darstellbaren Farbtöne übersteigt die typische Zahl von +Bildpunkten bei weitem. +
        +

    • +
    + + + + +

    Bleibt die Frage auf welche Weise die Pixelwerte im +Bildspeicher mit den VDI-Farbnummern zusammenhängen. Antwort: +

    + + + + + + +
    (a) aus historischen Gründen darf davon ausgegangen werden, daß +bei einem Pixel in VDI-Farbe 0 (normal Weiß) alle Bits gelöscht, +und bei schwarzen Bildpunkten (VDI-Farbe 1) alle Bits gesetzt sind. +Dies ist schon deshalb logisch, da durch ein vollständiges +Invertieren aller Bits der Pixeldarstellung Weiß und Schwarz +vertauscht werden müssen. +
      +
    (b) Mit Hilfe der Funktion v_get_pixel kann für eine gegebene +Bildkoordinate sowohl die VDI-Farbnummer, als auch der Pixelwert +erfragt werden. +
      + +
    + +

    Darüber hinaus haben Atari und Digital +Research für 4, 8 und 16-Farbgrafikstufen die Standardzuordnungen +dokumentiert: +

    +
      +
    • bei vier Farben gilt +
        +

      +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      PixelwertFarbindexFarbeName
      000weißWHITE
      012rotRED
      103grünGREEN
      111schwarzBLACK
      +
      + +

    • +
    • bei acht Farben gilt +
        +

      +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      PixelwertFarbindexFarbeName
      0000weißWHITE
      0012rotRED
      0103grünGREEN
      0116gelbYELLOW
      1004blauBLUE
      1017magentaMAGENTA
      1105cyanCYAN
      1111schwarzBLACK
      +
      + +

    • +
    • bei 16 Farben gilt +
        +

      +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      PixelwertFarbindexFarbeName
      00000weißWHITE
      00012rotRED
      00103grünGREEN
      00116gelbYELLOW
      01004blauBLUE
      01017magentaMAGENTA
      01105cyanCYAN
      01118hellgrauLWHITE
      10009dunkelgrauLBLACK
      100110dunkelrotLRED
      101011dunkelgrünLGREEN
      101114dunkelgelbLYELLOW
      110012dunkelblauLBLUE
      110115dunkelmagentaLMAGENTA
      111013dunkelcyanLCYAN
      11111schwarzBLACK
      +
      + +

    • +
    + +

    Hinweis: Für andere Farbtiefen existiert keine +eindeutige Zuordnung. Da es auch keine allgemeine Formel zur +Umrechnung gibt, muss im Bedarfsfall auf die Funktion v_get_pixel +zurückgegriffen werden. +

    +

    Querverweis: Objektfarben des AES   Rasterfunktionen   +vq_scrninfo +

    +

    7.2.11 SpeedoGDOS

    + +

    SpeedoGDOS gehört zur jüngsten Generation der GDOS-Familie, +und liegt aktuell in der Version 5.0c vor. Neben den Eigenschaften +eines 'normalen' GDOS bestechen vor allem die folgenden +Möglichkeiten: +

    +
      +
    • Unterstützung von Vektorzeichensätzen der Formate: +
        +
      • Speedo +
      • +
      • TrueType +
      • +
      • Type1 +
      • +
      + +
    • +
    • Möglichkeiten für Track/Pair-Kerning. +
    • +
    + +

    Ob SpeedoGDOS installiert ist, läßt sich am besten über den +Cookie-Jar abfragen. Das Programm legt in der Bootphase einen Cookie +mit der Kennung FSMC an. +

    +

    Querverweis: GDOS   NVDI   Style-Guidelines +

    +

    7.2.12 Details zu Vektorschriften

    +

    Bei Verwendung der Programme NVDI oder SpeedoGDOS stehen auch +unter GEM hochqualitative Vektorschriften (in den Formaten Speedo, +TrueType, und Type-1) zur Verfügung. Da bei der Unterstützung dieser +Schrifttechnologien einige Feinheiten zu beachten sind, werden in +diesem Abschnitt die folgenden Punkte behandelt: +

    + + +

    Querverweis: vst_load_fonts   vst_unload_fonts +

    +

    7.2.12.1 Äquidistante Fonts

    +

    Für manche Applikationen ist es sinnvoll, bei der Ausgabe nur +äquidistante (d.h. monospaced) Fonts zu benutzen. In diesem Fall +sollte man wie folgt vorgehen: +

    +
      +
    • wenn vqt_name in erweiterter Form (35 Einträge in intout) +vorhanden ist, sollte einfach das entsprechende Bit in intout[34] +abgetestet werden. +
        +

    • +
    • wenn vqt_name nur die Information bietet, daß es sich um einen +Vektorfont handelt (34 Einträge in intout, intout[33] != 0), sollte für +Vektorfonts vqt_fontheader aufgerufen, und Bit 1 von FH_CLFGS geprüft +werden. +
        +

    • +
    • wenn es sich nicht um einen Vektorfont handelt und die ersten +beiden Punkte nicht zutreffen, müssen die Zeichenbreiten einzeln mit +vqt_width erfragt und miteinander verglichen werden. +
        +

    • +
    + +

    Hinweis: Wer äquidistante Vektorfonts mit v_ftext +ausgibt, darf als Breite nicht mit den Ausgaben von vst_height +oder vqt_width rechnen, sondern muß sie bei vqt_advance erfragen, da +bei v_ftext immer mit Breiten in 1/65536 Pixeln positioniert wird. Bei +Ausgabe über v_gtext sind die Rückgaben von vqt_width zutreffend. +

    +

    Querverweis: Vektorfonts   VDI   GDOS   Style-Guidelines   fix31 +

    +

    7.2.12.2 Font-ID und Index

    + +

    Der Index eines Fonts ist eine Zahl zwischen 1 und der +verfügbaren Fontanzahl. Je nach Anzahl der auf dem jeweiligen Rechner +installierten Fonts hat ein Font wie z.B. Swiss 721 einen +unterschiedlichen Index. +

    + +

    Die Font-ID ist dagegen eine Kennung, die grundsätzlich +für einen Font unabhängig vom System immer gleich ist - für +Swiss 721 z.B. 5003. Ausnahmen von dieser Regel sind aber bei +Fonts möglich, die keine verwendbare Font-ID haben. In diesem Fall +wird versucht, eine eindeutige ID zu erzeugen. Da es aber möglich +ist, daß eine derart erzeugte ID für einen Font nicht auf allen +Systemen identisch ist, sollten Programme für eine eindeutige +Zuordnung des Fonts außer der ID auch den Namen abspeichern. +

    +

    Querverweis: Vektorfonts   VDI   GDOS   Style-Guidelines +

    +

    7.2.12.3 Größe von Vektorfonts

    +

    Die meisten Bildschirmtreiber liefern eine Auflösung von +≈ 91 dpi zurück, nach der sich auch die Größe der +Vektorfonts richtet. Da nicht bei jedem Schirm 91 dpi vorhanden sind, +sollten Programme bei Textdarstellung auf dem Bildschirm nicht +fest mit diesem Wert rechnen, sondern die Ausgaben von +v_opnwk, v_opnvwk, vq_extnd und +v_opnbm beachten. +

    +

    Andernfalls können bei abweichenden Pixelgrößen +Darstellungsfehler auftreten. Beim Ausdruck sollten die genaueren +Pixelgrößen bei vq_extnd beachtet werden, damit die +Textpositionierung möglichst genau ist. +

    +

    7.2.12.4 Höhe und Breite von Vektorfonts

    +

    Die Höhe und Breite eines Vektorfonts kann mit den Funktionen +vst_arbpt32 und vst_setsize32 in 1/65536 pt +eingestellt werden (1pt ≈ 1/72 Zoll ≈ 353 µm). +

    +

    Bei negativer Höhe oder Breite wird der Text an der jeweiligen +Achse gespiegelt. +

    +

    7.2.12.5 Kerning

    +

    Kerning ist ein Verfahren um Abstände zwischen Zeichen zu +manipulieren, und damit ein einheitlicheres (besseres) Schriftbild zu +erlangen. Man kann zwei Varianten des Kernings unterscheiden: +

    + + +
      +
    • Track-Kerning: Diese Methode benutzt einen +konstanten Offset für alle Zeichen eines Zeichensatzes. +Zeichensätze die Track-Kerning unterstützen enthalten i.d.R. +verschiedene Offsets um beispielsweise zwischen normalem, engen und +sehr engen Kerning auswählen zu können. +
        + + +

    • +
    • Pair-Kerning: Beruht auf der Erkenntnis, daß +ein Offset nicht für alle Zeichen eines Zeichensatzes +sinnvoll ist; in vielen Fällen läßt sich nämlich ein wesentlich +besseres Schriftbild erreichen, wenn der Abstand für ein Paar von +Zeichen individuell festgelegt werden kann. Zeichensätze die +Pair-Kerning unterstützen enthalten daher eine Tabelle, in der für +jede Kombination (genauer: für die wichtigsten) von zwei Zeichen der +für sie optimale Offset vermerkt ist. +
        +

    • +
    + +

    Hinweis: Sowohl Track-, als auch Pair-Kerning sind nach +dem Öffnen einer Workstation ausgeschaltet. Um eine bessere +Textdarstellung zu erhalten, sollte daher das Pair-Kerning per +vst_kern eingeschaltet werden. +

    +

    Querverweis: vst_kern   vqt_pairkern   vqt_trackkern   +vst_track_offset +

    +

    7.2.12.6 Positionierung von Vektortext

    +

    Bei der Ausgabe von Vektorfonts wird innerhalb des VDI mit +Schrittweiten von 1/65536 Pixel Auflösung gerechnet, um unabhängig +vom verwendeten Ausgabegerät und dessen tatsächlicher Auflösung +eine gleichbleibende Zeichenpositionierung zu gewährleisten. +

    +

    Um die Bitmaps für die einzelnen Zeichen auszugeben, werden +diese Festkommawerte in Pixel umgerechnet, indem 32768 hinzuaddiert +und anschließend durch 65536 geteilt wird. +

    +
      +
    • wenn das Track-Kerning eingeschaltet ist, wird zu jeder +Zeichenposition der bei vqt_trackkern zu erfragende Offset addiert. +
        +

    • +
    • bei eingeschaltetem Pair-Kerning wird zu jeder Zeichenposition +der von vqt_pairkern zurückgelieferte Offset addiert. +
        +

    • +
    + +

    Achtung: Pair- und Track-Kerning und die Positionierung +in 1/65536 Pixeln werden nur eingesetzt, wenn v_ftext aufgerufen wird! +Bei v_gtext verhalten sich Vektorfonts weitgehend wie Bitmap-Fonts und +weder Kerning noch genaue Positionierung werden benutzt. +

    +

    Querverweis: Pair-Kerning   Track-Kerning   fix31-Format +

    +

    7.2.12.7 Vektor- oder Bitmap-Font?

    +

    Wenn es sich bei einem eingestellten Font um einen Vektorfont +handelt, liefert vqt_name 34 Einträge in intout zurück und +intout[33] enthält einen Wert ungleich Null. +

    +

    Ist hingegen intout[33] gleich Null (oder werden nur 33 +Einträge zurückgeliefert), so handelt es sich um Bitmap-Font. +

    +

    7.2.13 Workstations des VDI

    +

    Eine Workstation ist ein allgemeiner Begriff für ein +Ein- oder Ausgabegerät; dies können Bildschirme, Drucker, Plotter, +Kameras, Grafiktabletts und viele andere Geräte sein. +

    +

    Um auf ein bestimmtes VDI-Gerät zugreifen zu können, muß +daher zunächst die Workstation geöffnet werden. Je nach +Sachlage erhält man als Resultat entweder eine Fehlermeldung oder die +Workstation-Kennung (Handle) des betreffenden Gerätes. +

    +

    Zu jeder Workstation gehört eine Menge von Merkmalen, +die unveränderlich sind und über die Fähigkeiten des Gerätes +Auskunft geben. Dazu gehören u.a. Gerätetyp, Koordinatensystem und +Farbfähigkeit. Neben den beim Öffnen der Workstation +zurückgelieferten Daten ist es über eine erweiterte +Auskunftsfunktion möglich, noch mehr Daten über ein Gerät zu +ermitteln. Dies erlaubt es einem Anwendungsprogramm, die Fähigkeiten +des Gerätes optimal auszunutzen (z.B. dadurch, daß sie ihren +Bildschirmaufbau an die Anzahl der darstellbaren Bildschirmpunkte +anpassen). +

    +

    Neben den unveränderlichen besitzt eine Workstation auch noch +veränderliche Merkmale; man spricht in diesem Zusammenhang von +Attributen. Sie beschreiben den aktuellen Zustand des +Gerätes. Ein gutes Beispiel ist die Linienfarbe, die man nur ein +einziges mal (und nicht etwa bei jedem einzelnen Aufruf von +Zeichenfunktionen) setzen muß. Die aktuellen Attribute werden vom +VDI in internen Strukturen für jede einzelne Workstation getrennt +gespeichert; so kann eine Applikation beispielsweise für den +Bildschirm und den Drucker unbesorgt verschiedene Linienfarben +einstellen. Das VDI erkennt am Workstation-Handle, welches +Ausgabegerät gemeint ist. +

    +

    Die folgende Tabelle nennt einige Attribute mit ihren +Standardwerten: +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AttributStandardwerteinzustellen per
    Basislinienwinkel0 Gradvst_rotation
    Clippingausgeschaltetvs_clip
    Cursorverstecktv_show_c, v_hide_c
    EingabemodusRequestvsin_mode
    Füllmuster, freiLogo des Herstellersvsf_udpat
    Kerningausgeschaltetvst_kern
    Linienendenrechteckigvsl_ends
    Linienmuster, freidurchgehendvsl_udsty
    Linienstärkenominelle Linienstärkevst_width
    Markergrößenominelle Markergrößevsm_height
    SchreibmodusReplacevswr_mode
    Textausrichtunglinks, Basislinievst_alignment
    Texteffektnormalvst_effects
    Umrahmungsichtbarvsf_perimeter
    Zeichenhöhenominelle Zeichenhöhevst_height
    +
    + + + +

    Eine Sonderstellung nimmt dabei der Bildschirm ein, da dieser +für mehrere Prozesse gleichzeitig zur Verfügung stehen muß. Aus +diesem Grund bietet das VDI sogenannte virtuelle Workstations an, die +immer nur im Zusammenhang mit einer bereits geöffneten +physikalischen Bildschirm-Workstation benutzt werden können. +Jede virtuelle Workstation verfügt natürlich über einen eigenen +Satz von Attributen, damit sich die Progamme bei der Bildschirmausgabe +nicht gegenseitig in die Quere kommen. +

    +

    Achtung: Nicht alle Eigenschaften der physikalischen +Bildschirm-Workstation sind auf die virtuellen Workstations +übertragbar. Tastatur und Maus können auch weiterhin immer nur von +einem Programm gleichzeitig benutzt werden. Die Eingabefunktionen +dürfen daher nur von dem Programm benutzt werden, welches die +physikalische Bildschirm-Workstation geöffnet hat (dies sind im +Normalfall die AES). +

    +

    Ein letzter Hinweis: Da die Verwaltung der Workstation-Attribute +Speicherplatz erfordert, der i.d.R. dynamisch angefordert wird, sollte +man nie davon ausgehen, daß das Öffnen einer Workstation immer +klappen muß! +

    +

    Querverweis: GDOS-Treiber   v_opnwk   v_opnvwk   vq_extnd +

    + +

    7.2.14 Das XIMG-Format für Pixelbilder

    +

    Pixelbilder werden unter GEM in einem Standardformat, dem +sogenannten Bit-Image (bzw. XIMG) Format abgelegt. Grafiken dieses +Typs werden dabei komprimiert gespeichert, und besitzen immer das +Suffix '.IMG'. +

    +

    Der Hauptvorteil dieses Formats liegt in der Tatsache +begründet, daß es sich um ein GEM-Standardformat handelt, +welches daher von nahezu allen Applikationen unterstützt wird. Eine +Bit-Image-Datei besteht aus einem Header, sowie den reinen Pixeldaten. +Der Header ist dabei in C-Notation wie folgt definiert: +

    + +
    typedef struct
    +{
    +  int16_t version;           /* Versionsnummer (meist 1)                 */
    +  int16_t headlen;           /* Länge des Kopfes in 16-Bit Worten        */
    +  int16_t planes;            /* Anzahl der Farbebenen der Grafik         */
    +  int16_t pat_run;           /* Musterlänge in Bytes                     */
    +  int16_t pix_width;         /* Pixelbreite des Quellgerätes in 1/1000mm */
    +  int16_t pix_height;        /* Pixelhöhe des Quellgerätes in 1/1000mm   */
    +  int16_t sl_width;          /* Breite einer Scan-Zeile in Pixeln        */
    +  int16_t sl_height;         /* Höhe einer Scan-Zeile in Pixeln          */
    +  int8_t  x_id[4];           /* muss 'XIMG' sein                         */
    +  int16_t color_model;       /* Farbmodell: 0=RGB, 1=CYM, 2=Pantone      */
    +  RGB_LIST color_table[]; /* Farbtabelle */
    +} XIMG;
    +
    +

    Der gesamte Header liegt dabei im Motorola-68000-Format +vor, so daß er auf einem Rechnern mit Intel-CPU wort- bzw. +langwortweise gedreht werden muss. Die reinen Pixeldaten beginnen +immer bei headlen * 2 und sind (wie bereits erwähnt) +komprimiert abgelegt. +

    +

    Die Länge der Muster liegt zwischen 1 und 8, und beträgt bei +den meisten Bildschirmen 2 Bytes. Jede Scan-Zeilen-Information setzt +sich aus zwei Komponenten zusammen: +

    +
      +
    • einem Wiederholungsteil folgender Struktur (in C-Notation): +
        +

      typedef struct
      +{
      +  int16_t sc_zero;    /* immer Null */
      +  int8_t  sc_ff;      /* immer 255  */
      +  int8_t  sc_cnt;     /* Anzahl der codierten Bildzeilen */
      +} SCANLINE;
      +
      +

    • +
    • der eigentlichen Bildinformation. Diese wird in drei +verschiedenen Kategorien zeilenweise abgespeichert. +
        + + + + + + + + + + +
      (a) einfarbige Pixelfolgen (Solid-Runs) werden als +einfaches Byte gespeichert, wobei das oberste Bit den Status des +Punktes bestimmt (also 'an' oder 'aus'). Die restlichen sieben Bits +teilen mit, wie viele Bytes ausgegeben werden müssen. +
        + +
      (b) Musterfolgen (Pattern-Runs) haben als erstes Byte die +0, und als zweites die Anzahl der Musterwiederholungen. Die +Musterlänge steht im Header unter pat_run. Es folgen den +ersten beiden Bytes also genau so viele Bytes, wie benötigt werden, +um das Muster darzustellen. +
        +
      typedef struct
      +{
      +  int8_t pr_zero;        /* immer Null       */
      +  int8_t pr_cnt;         /* Anzahl der Bytes */
      +  int8_t pr_data[...];   /* Musterdaten      */
      +} PATTERNRUN;
      +
      + +
      c) Schlecht, oder nicht verkürzbare Bildinformation +(Bit-Strings) wird unverändert abgespeichert. Hier steht als +erstes Byte eine 0x80 und als zweites die Anzahl der Bytes. Danach +folgen dann die entsprechenden Bytes mit der unkomprimierten +Bildinformation. +
        +
      typedef struct
      +{
      +  int8_t bs_first;       /* immer 0x80       */
      +  int8_t bs_cnt;         /* Anzahl der Bytes */
      +  int8_t bs_data[...];   /* Bilddaten        */
      +} BITSTRING;
      +
      + +
      + +

    • +
    + +

    Es folgen jeweils die Bildinformationen für jede codierte +Farbebene direkt hintereinander. Man sollte auch darauf achten, daß +immer eine Zeile mit voller Bytezahl codiert wird, auch wenn das Bild +effektiv schmaler ist. Es können also bis zu sieben Bits +überflüssiger Information vorliegen. Die Pixelbreite des Bildes +steht im Header unter sl_width. +

    +

    Querverweis: Metafile-Format   v_bit_image   OUT-Dateiformat +

    +
    + +Home +VDIVDI +Das VDIDas VDI +VDI-BindingsVDI-Bindings + + diff --git a/de/VT_52_terminal.html b/de/VT_52_terminal.html new file mode 100644 index 000000000..efc4c216d --- /dev/null +++ b/de/VT_52_terminal.html @@ -0,0 +1,1233 @@ + + + + + +Die Anleitung zum TOS: VT-52-Terminal + + + + + + + + + +Home +BIOSBIOS +Cookie-JarCookie-Jar +XBRA-VerfahrenXBRA-Verfahren + +
    + +

    3.8 VT-52-Terminal

    +

    Die Ausgabefunktionen des GEMDOS bzw. BIOS können ein VT-52 Videoterminal +emulieren. Alle Steuersequenzen werden durch das ESC Zeichen des +ASCII-Codes eingeleitet, dem weitere Zeichen für die gewünschte Funktion +folgen. Deshalb spricht man auch von Escape-Sequenzen. +Zusätzlich stehen auch die Steuerzeichen des ASCII-Codes zur +Verfügung. +

    +

    Der VT-52 Emulator stellt die folgenden Steuercodes zur +Verfügung: +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CodeNameBedeutung
    BELBellSystemglocke.
    BSBackspaceZeichen links vom Cursor löschen
    HTTabulatorhorizontaler Tabulator
    LFLine feedZeilenvorschub
    VTTabulatorvertikaler Tabulator
    FFFormfeedSeitenvorschub
    CRCarriage ReturnCursor zum Anfang der Zeile.
    ESC ACursor upCursor eine Zeile nach oben.
    ESC BCursor downCursor eine Zeile nach unten.
    ESC CCursor rightCursor eine Spalte nach rechts.
    ESC DCursor leftCursor eine Spalte nach links.
    ESC EClear screenBildschirm löschen.
    ESC HCursor homeCursor in die obere linke Ecke.
    ESC ICursor up and insertCursor eine Zeile nach oben und scrollen.
    ESC JClear to end of screenBildschirm ab Cursor löschen.
    ESC KClear to end of lineAktuelle Zeile ab Cursor löschen.
    ESC LInsert lineZeile einfügen.
    ESC MDelete lineZeile entfernen.
    ESC Y <x> <y>Set cursor positionCursor positionieren.
    ESC b <c>Foreground colorTextfarbe setzen.
    ESC c <c>Background colorHintergrundfarbe setzen.
    ESC dClear to start of screenBildschirm bis Cursor löschen.
    ESC jSave cursor positionCursor "merken".
    ESC kRestore cursor positionCursor restaurieren.
    ESC lClear lineAktuelle Zeile löschen.
    ESC oClear to start of lineAktuelle Zeile bis Cursor löschen.
    ESC pReverse videoReverse Schrift einschalten.
    ESC qNormal videoReverse Schrift ausschalten.
    ESC vWrap onZeilenumbruch einschalten.
    ESC wWrap offZeilenumbruch ausschalten.
       
    ESC eCur_onCursor zeigen
    ESC fCur_offCursor verstecken
     Blink_onCursor-Blinken einschalten
     Blink_offCursor-Blinken ausschalten
     Set_blinkBlinkrate setzen
     Get_blinkBlinkrate abfragen
    +
    + +

    Die VT52 Emulation von TosWin2 unterstützt ausserdem folgende +Steuercodes: +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CodeNameBedeutung
    ESC 3 <c>ANSI foreground colorANSI Vordergrundfarbe setzen.
    ESC 4 <c>ANSI background colorANSI Hintergrundfarbe setzen.
    ESC FEnter graphics modeAlternativen Zeichensatz benutzen.
    ESC GExit graphics modeNormalen Zeichensatz benutzen.
    ESC R <cols,rows> CRSet window sizeFenstergröße setzen.
    ESC S <s> CRSet title barFenstertitel setzen.
    ESC ZIdentifyAntwortet mit ESC / Z
    ESC aDelete characterZeichen unter Cursor löschen.
    ESC hEnter insert modeEinfügemodus starten.
    ESC iExit insert modeEinfügemodus beenden.
    ESC uOriginal colorsOriginalfarben wieder herstellen.
    ESC y <c>Set text effectsText-Effekte setzen.
    ESC z <c>Clear text effectsText-Effekte löschen.
    +
    + +

    Hinweis: Programme die VT-52-Sequenzen für den +Bildschirmaufbau verwenden, sollten natürlich die gesamte verfügbare +Fläche nutzen. Da diese Fläche jedoch nicht mit GEMDOS, BIOS +oder XBIOS-Funktionen ermittelt werden kann gilt die folgende +Konvention: +

    +

    Wenn die Environmentvariablen LINES (ROWS) und COLUMNS +existieren, enthalten sie die maximal mögliche Zeilen- bzw. +Spaltenzahl. +

    +

    Als Beispiel für die im folgenden vorgestellten +Escape-Sequenzen wird ein C Makro gezeigt. Da der Aufruf der +Escape-Sequenzen in einer Ausgabe der entsprechenden Zeichen besteht, +sollte sich das C Beispiel leicht auf andere Sprachen portieren +lassen. +

    +

    Querverweis: ASCII-Tabelle   Scan-Code Tabelle +

    +

    3.8.1 Bell

    + + + + + + + + + + + + +
    Name: »Bell« - Systemglocke. +
      +
    Deklaration: #define Bell() Cconout('\a') +
      +
    Beschreibung: 'Bell' läßt die Systemglocke ertönen. +
      +
    Querverweis: Escapesequenzen   VT-52-Terminal +
      + +
    + +

    3.8.2 Blink_off

    + + + + + + + + + + + + +
    Name: »Blink off« - Cursorblinken ausschalten. +
      +
    Deklaration: #define Blink_off() Cursconf ( 3, 0 ) +
      +
    Beschreibung: 'Blink_off' ist ein Funktionen-Makro, mit der das Blinken des +Cursors ausgeschaltet werden kann. Hierzu wird die XBIOS-Funktion +Cursconf verwendet. +
      +
    Querverweis: Escapesequenzen   VT-52-Terminal +
      + +
    + +

    3.8.3 Blink_on

    + + + + + + + + + + + + +
    Name: »Blink on« - Cursorblinken einschalten. +
      +
    Deklaration: #define Blink_on() Cursconf ( 2, 0 ) +
      +
    Beschreibung: 'Blink_on' ist ein Funktionen-Makro, mit der das Blinken des +Cursors eingeschaltet werden kann. Hierzu wird die XBIOS-Funktion +Cursconf verwendet. +
      +
    Querverweis: Escapesequenzen   VT-52-Terminal +
      + +
    + +

    3.8.4 Clear_down

    + + + + + + + + + + + + +
    Name: »Clear to end of screen« - Bildschirm ab Cursor löschen. +
      +
    Deklaration: #define Clear_down() Cconws("\33J") +
      +
    Beschreibung: Mit 'Clear to end of screen' kann der Bildschirm ab der +Cursorposition gelöscht werden. +
      +
    Querverweis: Escapesequenzen   VT-52-Terminal +
      + +
    + +

    3.8.5 Clear_eol

    + + + + + + + + + + + + +
    Name: »Clear to end of line« - Aktuelle Zeile ab Cursor löschen. +
      +
    Deklaration: #define Clear_eol() Cconws("\33K") +
      +
    Beschreibung: Mit 'Clear to end of line' kann die aktuelle Zeile ab der +Cursorposition gelöscht werden. +
      +
    Querverweis: Escapesequenzen   VT-52-Terminal +
      + +
    + +

    3.8.6 Clear_home

    + + + + + + + + + + + + +
    Name: »Clear screen« - Bildschirm löschen. +
      +
    Deklaration: #define Clear_home() Cconws("\33E") +
      +
    Beschreibung: Mit 'Clear screen' kann der gesamte Bildschirm gelöscht und +der TOS-Cursor in die obere linke Ecke des Bildschirms positioniert +werden. +
      +
    Querverweis: Escapesequenzen   VT-52-Terminal +
      + +
    + +

    3.8.7 Clear_line

    + + + + + + + + + + + + +
    Name: »Clear line« - Aktuelle Zeile löschen. +
      +
    Deklaration: #define Clear_line() Cconws("\33l") +
      +
    Beschreibung: Mit 'Clear line' kann die aktuelle Zeile gelöscht werden. Die +nachfolgenden Zeilen werden nicht nachgeschoben. Der Cursor wird zum +Anfang der Zeile gesetzt. +
      +
    Querverweis: Escapesequenzen   VT-52-Terminal +
      + +
    + +

    3.8.8 Clear_sol

    + + + + + + + + + + + + +
    Name: »Clear to start of line« - Aktuelle Zeile ab Cursor löschen. +
      +
    Deklaration: #define Clear_sol() Cconws("\33o") +
      +
    Beschreibung: Mit 'Clear to start of line' kann die aktuelle Zeile bis zur +Cursorposition gelöscht werden kann. +
      +
    Querverweis: Escapesequenzen   VT-52-Terminal +
      + +
    + +

    3.8.9 Clear_up

    + + + + + + + + + + + + +
    Name: »Clear to start of screen« - Bildschirm bis Cursor löschen. +
      +
    Deklaration: #define Clear_up() Cconws("\33d") +
      +
    Beschreibung: Mit 'Clear to start of screen' kann der Bildschirm bis zur +Cursorposition gelöscht werden. +
      +
    Querverweis: Escapesequenzen   VT-52-Terminal +
      + +
    + +

    3.8.10 Cur_down

    + + + + + + + + + + + + +
    Name: »Cursor down« - Cursor eine Zeile nach unten. +
      +
    Deklaration: #define Cur_down() Cconws("\33B") +
      +
    Beschreibung: Mit 'Cursor down' kann der TOS-cursor um eine Zeile nach unten +positioniert werden. Befindet sich der Cursor bereits in der untersten +Zeile, passiert nichts. +
      +
    Querverweis: Escapesequenzen   VT-52-Terminal +
      + +
    + +

    3.8.11 Cur_home

    + + + + + + + + + + + + +
    Name: »Cursor home« - Cursor in die obere linke Ecke. +
      +
    Deklaration: #define Cur_home() Cconws("\33H") +
      +
    Beschreibung: Mit 'Cursor home' kann der TOS-cursor in die obere linke Ecke +des Bildschirms positioniert werden. +
      +
    Querverweis: Escapesequenzen   VT-52-Terminal +
      + +
    + +

    3.8.12 Cur_left

    + + + + + + + + + + + + +
    Name: »Cursor left« - Cursor eine Spalte nach links. +
      +
    Deklaration: #define Cur_left() Cconws("\33D") +
      +
    Beschreibung: Mit 'Cursor left' kann der TOS-cursor um eine Spalte nach links +positioniert werden. Befindet sich der Cursor bereits in der ganz +linken Spalte, passiert nichts. +
      +
    Querverweis: Escapesequenzen   VT-52-Terminal +
      + +
    + +

    3.8.13 Cur_off

    + + + + + + + + + + + + +
    Name: »Hide cursor« - Cursor ausschalten. +
      +
    Deklaration: #define Cur_off() Cursconf ( 0, 0 ) +
      +
    Beschreibung: 'Cur_off' ist ein Funktionen-Makro, mit der der Cursor +ausgeschaltet werden kann. Hierzu wird die XBIOS-Funktion Cursconf +verwendet. +
      +
    Querverweis: Escapesequenzen   VT-52-Terminal +
      + +
    + +

    3.8.14 Cur_on

    + + + + + + + + + + + + +
    Name: »Show cursor« - Cursor einschalten. +
      +
    Deklaration: #define Cur_on() Cursconf ( 1, 0 ) +
      +
    Beschreibung: 'Cur_on' ist ein Funktionen-Makro, mit der der Cursor +eingeschaltet werden kann. Hierzu wird die XBIOS-Funktion Cursconf +verwendet. +
      +
    Querverweis: Escapesequenzen   VT-52-Terminal +
      + +
    + +

    3.8.15 Cur_right

    + + + + + + + + + + + + +
    Name: »Cursor right« - Cursor eine Spalte nach rechts. +
      +
    Deklaration: #define Cur_right() Cconws("\33C") +
      +
    Beschreibung: Mit 'Cursor right' kann der TOS-cursor um eine Spalte nach +rechts positioniert werden. Befindet sich der Cursor bereits in der +ganz rechten Spalte, passiert nichts. +
      +
    Querverweis: Escapesequenzen   VT-52-Terminal +
      + +
    + +

    3.8.16 Cur_up

    + + + + + + + + + + + + +
    Name: »Cursor up« - Cursor eine Zeile nach oben. +
      +
    Deklaration: #define Cur_up() Cconws("\33A") +
      +
    Beschreibung: Mit 'Cursor up' kann der TOS-cursor um eine Zeile nach oben +positioniert werden. Befindet sich der Cursor bereits in der obersten +Zeile, passiert nichts. +
      +
    Querverweis: Escapesequenzen   VT-52-Terminal +
      + +
    + +

    3.8.17 Del_line

    + + + + + + + + + + + + +
    Name: »Delete line« - Zeile entfernen. +
      +
    Deklaration: #define Del_line() Cconws("\33M") +
      +
    Beschreibung: Mit 'Delete line' kann die aktuelle Zeile gelöscht werden. Die +nachfolgenen Zeilen werden nachgeschoben, der Cursor wird an den +Anfang der Zeile gesetzt. +
      +
    Querverweis: Escapesequenzen   VT-52-Terminal +
      + +
    + +

    3.8.18 Escapesequenzen

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    C-SequenzWertZeichenWirkung
    \a0x07BELBell (Systemglocke)
    \b0x08BSBackspace
    \f0x0CFFFormfeed (Seitenvorschub)
    \n0x0ALFLinefeed (Newline)
    \r0x0DCRCarriage return (Wagenrücklauf)
    \t0x09HTTabulator (horizontal)
    \v0x0BVTTabulator (vertikal)
    +
    + +

    Querverweis: VT-52-Terminal   GEMDOS   BIOS   XBIOS +

    +

    3.8.19 Get_blink

    + + + + + + + + + + + + +
    Name: »Get blink rate« - Cursorblinkfrequenz abfragen. +
      +
    Deklaration: #define Get_blink() Cursconf ( 5, 0 ) +
      +
    Beschreibung: 'Get_blink' ist ein Funktionen-Makro, mit der die Frequenz des +Cursorblinkens abgefragt werden kann. Hierzu wird die XBIOS-Funktion +Cursconf verwendet. +
      +
    Querverweis: Escapesequenzen   VT-52-Terminal +
      + +
    + +

    3.8.20 Goto_pos

    + + + + + + + + + + + + +
    Name: »Set cursor position« - Cursor positionieren. +
      +
    Deklaration: #define Goto_pos(x,y) (Cconws("\33Y"),Cconout(' +'+x),Cconout(' '+y)) +
      +
    Beschreibung: Mit 'Set cursor position' kann der Cursor an x-te Zeile und +y-te Spalte positioniert werden. Beachten Sie bitte, daß die Zählung +bei 32 beginnt. Deshalb wurde in obigem Makro 32 (Leerzeichen) +addiert, um bei der Verwendung des Makros mit 0 zählen zu können. +
      +
    Querverweis: Escapesequenzen   VT-52-Terminal +
      + +
    + +

    3.8.21 Ink

    + + + + + + + + + + + + +
    Name: »Foreground color« - Textfarbe setzen. +
      +
    Deklaration: #define Ink(c) (Cconws("\33b"),Cconout(c)) +
      +
    Beschreibung: Mit 'Foreground color' kann die Textfarbe gesetzt werden kann. +Die Anzahl der verfügbaren Farben ist auflösungsabhängig. +
      +
    Querverweis: Escapesequenzen   VT-52-Terminal +
      + +
    + +

    3.8.22 Ins_line

    + + + + + + + + + + + + +
    Name: »Insert line« - Zeile einfügen. +
      +
    Deklaration: #define Ins_line() Cconws("\33L") +
      +
    Beschreibung: Mit 'Insert line' kann eine neue Zeile an der Cursorposition +eingefügt werden. Der Cursor wird an den Anfang der neuen Zeile +gesetzt. +
      +
    Querverweis: Escapesequenzen   VT-52-Terminal +
      + +
    + +

    3.8.23 Line_feed

    + + + + + + + + + + + + +
    Name: »Line feed« - Zeilenvorschub +
      +
    Deklaration: #define Line_feed() Cconout('\n') +
      +
    Beschreibung: 'Line feed' setzt den Cursor in die nächste Zeile +(Zeilenvorschub). +
      +
    Querverweis: Escapesequenzen   VT-52-Terminal +
      + +
    + +

    3.8.24 Load_pos

    + + + + + + + + + + + + +
    Name: »Restore cursor position« - Cursor restaurieren. +
      +
    Deklaration: #define Load_pos() Cconws("\33k") +
      +
    Beschreibung: Mit 'Restore cursor position' kann der Cursor wieder an die +Stelle positioniert werden, die vorher mit 'Save cursor position' +"gemerkt" wurde. +
      +
    Querverweis: Escapesequenzen   VT-52-Terminal   Save_pos +
      + +
    + +

    3.8.25 Paper

    + + + + + + + + + + + + +
    Name: »Background color« - Hintergrundfarbe setzen. +
      +
    Deklaration: #define Paper(c) (Cconws("\33c"),Cconout(c)) +
      +
    Beschreibung: Mit 'Background color' kann die Hintergrundfarbe gesetzt +werden. Die Anzahl der verfügbaren Farben ist auflösungsabhängig. +
      +
    Querverweis: Escapesequenzen   VT-52-Terminal +
      + +
    + +

    3.8.26 Return

    + + + + + + + + + + + + +
    Name: »Carriage Return« - Cursor zum Anfang der Zeile. +
      +
    Deklaration: #define Return() Cconout('\r') +
      +
    Beschreibung: 'Return' setzt den Cursor an den Anfang der aktuellen Zeile. +
      +
    Querverweis: Escapesequenzen   VT-52-Terminal +
      + +
    + +

    3.8.27 Rev_off

    + + + + + + + + + + + + +
    Name: »Normal video« - Reverse Schrift ausschalten. +
      +
    Deklaration: #define Rev_off() Cconws("\33q") +
      +
    Beschreibung: Mit 'Normal video' kann die reverse Schrift (Reverse video) +wieder ausgeschaltet werden. +
      +
    Querverweis: Escapesequenzen   VT-52-Terminal   Rev_on +
      + +
    + +

    3.8.28 Rev_on

    + + + + + + + + + + + + +
    Name: »Reverse video« - Reverse Schrift einschalten. +
      +
    Deklaration: #define Rev_on() Cconws("\33p") +
      +
    Beschreibung: Mit 'Reverse video' kann die reverse Schrift (Hintergrund- und +Textfarbe vertauscht) eingeschaltet werden. Dieser Modus kann mit +'Normal video' wieder ausgeschaltet weden. +
      +
    Querverweis: Escapesequenzen   VT-52-Terminal   Rev_off +
      + +
    + +

    3.8.29 Save_pos

    + + + + + + + + + + + + +
    Name: »Save cursor position« - Cursor "merken". +
      +
    Deklaration: #define Save_pos() Cconws("\33j") +
      +
    Beschreibung: Mit 'Save cursor' position kann die aktuelle Cursorposition in +einen internen Puffer gespeichert wird. Die gespeicherte +Cursorposition kann später mit Restore cursor position restauriert +werden. +
      +
    Querverweis: Escapesequenzen   VT-52-Terminal   Load_pos +
      + +
    + +

    3.8.30 Scroll_up

    + + + + + + + + + + + + +
    Name: »Cursor up and insert« - Cursor eine Zeile nach oben und +scrollen. +
      +
    Deklaration: #define Scroll_up() Cconws("\33I") +
      +
    Beschreibung: Mit 'Cursor up' and insert kann der TOS-cursor um eine Zeile +nach oben positioniert werden. Befindet sich der Cursor bereits in der +obersten Zeile, wird der Bildschirminhalt um eine Zeile nach unten +gescrollt und eine Leerzeile eingefügt. +
      +
    Querverweis: Escapesequenzen   VT-52-Terminal +
      + +
    + +

    3.8.31 Set_blink

    + + + + + + + + + + + + +
    Name: »Set blink rate« - Cursorblinkfrequenz einstellen. +
      +
    Deklaration: #define Set_blink( rate ) Cursconf ( 4, rate ) +
      +
    Beschreibung: 'Set_blink' ist ein Funktionen-Makro, mit der die Frequenz des +Cursorblinkens eingestellt werden kann. Hierzu wird die XBIOS-Funktion +Cursconf verwendet. +
      +
    Querverweis: Escapesequenzen   VT-52-Terminal +
      + +
    + +

    3.8.32 Tab

    + + + + + + + + + + + + +
    Name: »Tabulator« - Cursor zur nächsten Tabulatorposition. +
      +
    Deklaration: #define Tab() Cconout('\t') +
      +
    Beschreibung: 'Tab' setzt den Cursor an die nächste Tabulatorposition. +
      +
    Querverweis: Escapesequenzen   VT-52-Terminal +
      + +
    + +

    3.8.33 Wrap_off

    + + + + + + + + + + + + +
    Name: »Wrap off« - Zeilenumbruch ausschalten. +
      +
    Deklaration: #define Wrap_off() Cconws("\33w") +
      +
    Beschreibung: Mit 'Wrap off' kann der Zeilenumbruch (Wrap on) ausgeschaltet +werden. +
      +
    Querverweis: Escapesequenzen   VT-52-Terminal   Wrap_on +
      + +
    + +

    3.8.34 Wrap_on

    + + + + + + + + + + + + +
    Name: »Wrap on« - Zeilenumbruch einschalten. +
      +
    Deklaration: #define Wrap_on() Cconws("\33v") +
      +
    Beschreibung: Mit 'Wrap on' kann der Zeilenumbruch eingeschaltet werden. Dies +bewirkt, daß bei Erreichen des Endes einer Zeile automatisch zum +Anfang der nächsten Zeile gesprungen wird. +
      +
    Querverweis: Escapesequenzen   VT-52-Terminal   Wrap_off +
      + +
    + +
    + +Home +BIOSBIOS +Cookie-JarCookie-Jar +XBRA-VerfahrenXBRA-Verfahren + + diff --git a/de/XCPB.html b/de/XCPB.html new file mode 100644 index 000000000..530d8bb13 --- /dev/null +++ b/de/XCPB.html @@ -0,0 +1,94 @@ + + + + + +Die Anleitung zum TOS: XCPB + + + + + + + + + +Home +TypdefinitionenTypdefinitionen +THREADINFOTHREADINFO +IndexIndex + +
    + +

    I.18 XCPB

    +
    typedef struct
    +{
    +    int16_t       handle;
    +    int16_t       booting;
    +    int16_t       reserved;
    +    int16_t       SkipRshFix;
    +    void          *reserve1;
    +    void          *reserve2;
    +    void cdecl    (*rsh_fix)      ( int num_objs, int num_frstr,
    +                                    int num_frimg,
    +                                    int num_tree, OBJECT *rs_object,
    +                                    TEDINFO *rs_tedinfo,
    +                                    char *rs_strings[],
    +                                    ICONBLK *rs_iconblk,
    +                                    BITBLK *rs_bitblk,
    +                                    long *rs_frstr, long *rs_frimg,
    +                                    long *rs_trindex,
    +                                    struct foobar *rs_imdope );
    +    void cdecl    (*rsh_obfix)    ( OBJECT *tree, int curob );
    +    int16_t cdecl (*Popup)        ( char *items[], int num_items,
    +                                    int default_item,
    +                                    int font_size, GRECT *button,
    +                                    GRECT *world );
    +    void cdecl    (*Sl_size)      ( OBJECT *tree, int base, int slider,
    +                                    int num_items,
    +                                    int visible, int direction,
    +                                    int min_size );
    +    void cdecl    (*Sl_x)         ( OBJECT *tree, int base, int slider,
    +                                    int value,
    +                                    int num_min, int num_max,
    +                                    void (*foo)() );
    +    void cdecl    (*Sl_y)         ( OBJECT *tree, int base, int slider,
    +                                    int value,
    +                                    int num_min, int num_max,
    +                                    void (*foo)() );
    +    void cdecl    (*Sl_arrow)     ( OBJECT *tree, int base, int slider,
    +                                    int obj, int inc, int min, int max,
    +                                    int *numvar,
    +                                    int direction, void (*foo)() );
    +    void cdecl    (*Sl_dragx)     ( OBJECT *tree, int base, int slider,
    +                                    int min, int max, int *numvar,
    +                                    void (*foo)() );
    +    void cdecl    (*Sl_dragy)     ( OBJECT *tree, int base, int slider,
    +                                    int min, int max, int *numvar,
    +                                    void (*foo)() );
    +    int16_t cdecl (*Xform_do)     ( OBJECT *tree, int start_field,
    +                                    int puntmsg[] );
    +    GRECT * cdecl (*GetFirstRect) ( GRECT *prect );
    +    GRECT * cdecl (*GetNextRect)  ( void );
    +    void cdecl    (*Set_Evnt_Mask)( int mask, MOBLK *m1, MOBLK *m2,
    +                                    long time );
    +    int16_t cdecl (*XGen_Alert)   ( int id );
    +    int16_t cdecl (*CPX_Save)     ( void *ptr, long num );
    +    void * cdecl  (*Get_Buffer)   ( void );
    +    int16_t cdecl (*getcookie)    ( long cookie, long *p_value );
    +    int16_t       Country_Code;
    +    void cdecl    (*MFsave)       ( int saveit, MFORM *mf );
    +} XCPB;
    +
    +

    Querverweis: cpx_init   XCONTROL +

    + +
    + +Home +TypdefinitionenTypdefinitionen +THREADINFOTHREADINFO +IndexIndex + + diff --git a/de/aes_about.html b/de/aes_about.html new file mode 100644 index 000000000..285e02126 --- /dev/null +++ b/de/aes_about.html @@ -0,0 +1,148 @@ + + + + + +Die Anleitung zum TOS: Das AES + + + + + + + + + +Home +AESAES +AESAES +Grundlagen des AESGrundlagen des AES + +
    + +

    8.1 Das AES

    +

    Das AES (Application Environment Services) ist der Teil des GEM, +der die direkte (grafische) Schnittstelle zum Benutzer realisiert. Mit +Hilfe des AES lassen sich verschiedene Konzepte wie +Bildschirmfenster, Menüzeilen, Drop-Down oder Pop-Up Menüs, +Dialogboxen usw. komfortabel handhaben. Dazu dienen die folgenden +Bibliotheken: +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Applikationsverwaltung (appl_...) +
    Dateiauswahl (fsel_...) +
    Druckdialoge (pdlg_...) +
    Editobjekt-Funktionen (edit_...) +
    Eigenschaft-Funktionen (prop_...) +
    Ereignisverwaltung (evnt_...) +
    Fensterdialoge (wdlg_...) +
    Fensterverwaltung (wind_...) +
    Fileselektoren (fslx_...) +
    Formulare (form_...) +
    Geneva Funktionen +
    Grafikfunktionen (graf_...) +
    Listboxen (lbox_...) +
    MagiC Funktionen (sys_....) +
    Menus (menu_...) +
    Objekte (objc_...) +
    Prozessverwaltung (proc_...) +
    Resourceorganisation (rsrc_...) +
    Shell-Kommunikation (shel_...) +
    X-Grafikfunktionen (xgrf_...) +
    X-Shellfunktionen (xshl_...) +
    Zeichensatzauswahl (fnts_...) +
    Zwischenspeicher (scrp_...) + +
    + + +

    Die Entwicklung des AES reicht bis in das Jahr 1984 zurück, +als es von Digital Research zunächst für MS-DOS-Rechner +entwickelt, und später auf die Apple Lisa (unter CP/M 68K) portiert +wurde. Diese Version wurde dann anschließend auf den Atari-ST (unter +GEMDOS) portiert. +

    +

    In der Version 4.0 wurde das AES stark überarbeitet, und +stellt nun viele neue und erweiterte Routinen zur Verfügung. Über +die Funktion appl_getinfo kann leicht festgestellt werden, ob (bzw. +welche) neue(n) Möglichkeiten zur Verfügung stehen. +

    +

    Querverweis: Grundlagen des AES   Bindings des AES   VDI +

    +
    + +Home +AESAES +AESAES +Grundlagen des AESGrundlagen des AES + + diff --git a/de/aes_functions.html b/de/aes_functions.html new file mode 100644 index 000000000..7581a21ca --- /dev/null +++ b/de/aes_functions.html @@ -0,0 +1,1740 @@ + + + + + +Die Anleitung zum TOS: AES-Funktionsliste + + + + + + + + + +Home +AESAES +ZeichensatzauswahlZeichensatzauswahl +AES-StrukturenAES-Strukturen + +
    + +

    8.26 AES-Funktionsliste

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    dezhexFunktionsnamevorhanden
    0,00x00sys_set_getdispMagiC
    0,10x00sys_set_getfnMagiC
    0,20x00sys_set_setfnMagiC
    0,30x00sys_set_appl_getinfoMagiC
    0,40x00sys_set_editobMagiC
    0,50x00sys_recalc_cicon_coloursMagiC
    0,60x00sys_set_winframe_managerMagiC 6
    100x0Aappl_initTOS
    110x0Bappl_readTOS
    120x0Cappl_writeTOS
    130x0Dappl_findTOS
    140x0Eappl_tplayTOS
    150x0Fappl_trecordTOS
    160x10appl_bvset???
    170x11appl_yieldMagiC, N.AES
    180x12appl_searchTOS
    180x12appl_xbvgetGEM/4
    180x12appl_xbvsetGEM/4
    190x13appl_exitTOS
    200x14evnt_keybdTOS
    210x15evnt_buttonTOS
    220x16evnt_mouseTOS
    230x17evnt_mesagTOS
    240x18evnt_timerTOS
    250x19evnt_multiTOS
    260x1Aevnt_dclickTOS
    300x1Emenu_barTOS
    310x1Fmenu_icheckTOS
    320x20menu_ienableTOS
    330x21menu_tnormalTOS
    340x22menu_textTOS
    350x23menu_registerTOS
    360x24menu_unregisterMagiC
    360x24menu_popupTOS
    370x25menu_clickMagiC
    370x25menu_attachTOS
    380x26menu_istartTOS
    380x26GEM/4: Manages events for menus
    390x27menu_settingsTOS
    400x28objc_addTOS
    410x29objc_deleteTOS
    420x2Aobjc_drawTOS
    430x2Bobjc_findTOS
    440x2Cobjc_offsetTOS
    450x2Dobjc_orderTOS
    460x2Eobjc_editTOS
    460x2Eobjc_xeditMagiC
    470x2Fobjc_changeTOS
    480x30objc_sysvarTOS
    490x31objc_xfindN.AES
    500x32form_doTOS
    500x32form_xdoMagiC
    510x33form_dialTOS
    510x33form_xdialMagiC
    520x34form_alertTOS
    530x35form_errorTOS
    540x36form_centerTOS
    550x37form_keybdTOS
    560x38form_buttonTOS
    570x39GEM/4: Based on form_do but takes extra parameter
    580x3AGEM/4: Based on form_alert but takes extra parameter
    600x3Cobjc_wdrawMagiC, ab 11.12.96, V5.10
    600x3Cproc_createGEM/XM
    610x3Dobjc_wchangeMagiC, ab 11.12.96, V5.10
    610x3Dproc_runGEM/XM
    620x3Egraf_wwatchboxMagiC, ab 11.12.96, V5.10
    620x3Eproc_deleteGEM/XM
    630x3Fform_wbuttonMagiC, ab 11.12.96, V5.10
    630x3Fproc_infoGEM/XM
    640x40form_wkeybdMagiC, ab 11.12.96, V5.10
    640x40proc_mallocGEM/XM
    650x41objc_weditMagiC, ab 11.12.96, V5.10
    650x41proc_mfreeGEM/XM
    660x42proc_switchGEM/XM
    670x43proc_setblockGEM/XM
    680x44proc_shrinkGEM/XM
    680x44graf_vmemMyAES 0.97 (10.12.2017)
    690x45graf_multirubberN.AES
    700x46graf_rubberboxTOS
    710x47graf_dragboxTOS
    720x48graf_moveboxTOS
    730x49graf_growboxTOS
    740x4Agraf_shrinkboxTOS
    750x4Bgraf_watchboxTOS
    760x4Cgraf_slideboxTOS
    770x4Dgraf_handleTOS
    770x4Dgraf_xhandleKAOS 1.4
    780x4Egraf_mouseTOS
    790x4Fgraf_mkstateTOS
    800x50scrp_readTOS
    810x51scrp_writeTOS
    820x52scrp_clearMagiC
    900x5Afsel_inputTOS
    910x5Bfsel_exinputTOS
    910x5Bfsel_boxinputsince BoxKite 1.71
    910x5BGEM/4, GEM/5: Based on fsel_input but takes extra parameter
    990x63wind_drawN.AES
    1000x64wind_createTOS
    1010x65wind_openTOS
    1020x66wind_closeTOS
    1030x67wind_deleteTOS
    1040x68wind_getTOS
    1050x69wind_setTOS
    1060x6Awind_findTOS
    1070x6Bwind_updateTOS
    1080x6Cwind_calcTOS
    1090x6Dwind_newTOS
    1100x6Ersrc_loadTOS
    1110x6Frsrc_freeTOS
    1120x70rsrc_gaddrTOS
    1130x71rsrc_saddrTOS
    1140x72rsrc_obfixTOS
    1150x73rsrc_rcfixMTOS
    1150x73GEM/4, GEM/5: Based on rsrc_load, supports EMS
    1160x74GEM/4, GEM/5: Manipulates resources in EMS
    1190x77wind_apfindMultiGEM2
    1200x78shel_readTOS
    1210x79shel_writeTOS
    1220x7Ashel_getTOS
    1230x7Bshel_putTOS
    1240x7Cshel_findTOS
    1250x7Dshel_envrnTOS
    1260x7Eshel_rdefPC-GEM, N.AES
    1270x7Fshel_wdefPC-GEM, N.AES
    1280x80shel_helpN.AES
    1290x81appl_controlN.AES
    1300x82appl_getinfoTOS
    1300x82xgrf_stepcalcGEM/3
    1310x83appl_getciconMyAES
    1310x83xgrf_2boxGEM/3
    1320x84xgrf_colorViewMAX
    1330x85xgrf_dtimageViewMAX Panther
    1350x87form_popupMagiC
    1350x87xfrm_popupMagiC 5.03
    1360x88form_xerrMagiC
    1370x89appl_optionsXaAES
    1400x8cobjc_dataXaAES
    1600xA0wdlg_createWDialog
    1610xA1wdlg_openWDialog
    1620xA2wdlg_closeWDialog
    1630xA3wdlg_deleteWDialog
    164,00xA4wdlg_get_treeWDialog
    164,10xA4wdlg_get_editWDialog
    164,20xA4wdlg_get_udataWDialog
    164,30xA4wdlg_get_handleWDialog
    165,00xA5wdlg_set_editWDialog
    165,10xA5wdlg_set_treeWDialog
    165,20xA5wdlg_set_sizeWDialog
    165,30xA5wdlg_set_iconifyWDialog
    165,40xA5wdlg_set_uniconifyWDialog
    1660xA6wdlg_evntWDialog
    1670xA7wdlg_redrawWDialog
    1700xAAlbox_createWDialog
    1710xABlbox_updateWDialog
    1720xAClbox_doWDialog
    1730xADlbox_deleteWDialog
    174,00xAElbox_cnt_itemsWDialog
    174,10xAElbox_get_treeWDialog
    174,20xAElbox_get_avisWDialog
    174,30xAElbox_get_udataWDialog
    174,40xAElbox_get_afirstWDialog
    174,50xAElbox_get_slct_idxWDialog
    174,60xAElbox_get_itemsWDialog
    174,70xAElbox_get_itemWDialog
    174,80xAElbox_get_slct_itemWDialog
    174,90xAElbox_get_idxWDialog
    174,100xAElbox_get_bvisWDialog
    174,110xAElbox_get_bentriesWDialog
    174,120xAElbox_get_bfirstWDialog
    175,00xAFlbox_set_asldrWDialog
    175,10xAFlbox_set_itemsWDialog
    175,20xAFlbox_free_itemsWDialog
    175,30xAFlbox_free_listWDialog
    175,40xAFlbox_ascroll_toWDialog
    175,50xAFlbox_set_bsldrWDialog
    175,60xAFlbox_set_bentriesWDialog
    175,70xAFlbox_bscroll_toWDialog
    1800xB4fnts_createWDialog
    1810xB5fnts_deleteWDialog
    1820xB6fnts_openWDialog
    1830xB7fnts_closeWDialog
    184,00xB8fnts_get_no_stylesWDialog
    184,10xB8fnts_get_styleWDialog
    184,20xB8fnts_get_nameWDialog
    184,30xB8fnts_get_infoWDialog
    185,00xB9fnts_addWDialog
    185,10xB9fnts_removeWDialog
    185,20xB9fnts_updateWDialog
    1860xBAfnts_evntWDialog
    1870xBBfnts_doWDialog
    1900xBEfslx_openMagiC
    1910xBFfslx_closeMagiC
    1920xC0fslx_getnxtfileMagiC
    1930xC1fslx_evntMagiC
    1940xC2fslx_doMagiC
    1950xC3fslx_set_flagsMagiC
    2000xC8pdlg_createWDialog
    2010xC9pdlg_deleteWDialog
    2020xCApdlg_openWDialog
    2030xCBpdlg_closeWDialog
    204,00xCCpdlg_get_setsizeWDialog
    205,00xCDpdlg_add_printersWDialog
    205,10xCDpdlg_remove_printersWDialog
    205,20xCDpdlg_updateWDialog
    205,30xCDpdlg_add_sub_dialogsWDialog
    205,40xCDpdlg_remove_sub_dialogsWDialog
    205,50xCDpdlg_new_settingsWDialog
    205,60xCDpdlg_free_settingsWDialog
    205,70xCDpdlg_dflt_settingsWDialog
    205,80xCDpdlg_validate_settingsWDialog
    205,90xCDpdlg_use_settingsWDialog
    205,100xCDpdlg_save_default_settingsWDialog
    2060xCEpdlg_evntWDialog
    2070xCFpdlg_doWDialog
    2100xD2edit_createMagiC 5.20
    2110xD3edit_openMagiC 5.20
    2120xD4edit_closeMagiC 5.20
    2130xD5edit_deleteMagiC 5.20
    2140xD6edit_cursorMagiC 5.20
    2150xD7edit_evntMagiC 5.20
    216,00xD8edit_get_bufMagiC 5.20
    216,10xD8edit_get_formatMagiC 5.20
    216,20xD8edit_get_colourMagiC 5.20
    216,30xD8edit_get_fontMagiC 5.20
    216,40xD8edit_get_cursorMagiC 5.20
    216,50xD8edit_get_posMagiC 5.20
    216,70xD8edit_get_dirtyMagiC 5.20
    216,80xD8edit_get_selMagiC 5.20
    216,90xD8edit_get_scrollinfoMagiC 5.20
    217,00xD9edit_set_bufMagiC 5.20
    217,10xD9edit_set_formatMagiC 5.20
    217,20xD9edit_set_colourMagiC 5.20
    217,30xD9edit_set_fontMagiC 5.20
    217,40xD9edit_set_cursorMagiC 5.20
    217,50xD9edit_set_posMagiC 5.20
    217,60xD9edit_resizedMagiC 5.20
    217,70xD9edit_set_dirtyMagiC 5.20
    217,90xD9edit_scrollMagiC 5.20
    2500xFAbutton_clickbis XaAES v0.963
    2510xFBnew_clientbis XaAES v0.963
    2520xFCclient_exitbis XaAES v0.963
    2530xFDshutdownbis XaAES v0.963
    2540xFEobjc_setscrollbis XaAES v0.963
    2550xFFrregenbis XaAES v0.920
    2560x100wredrawbis XaAES v0.920
    2600x104appl_pipebis XaAES v0.963
    10100x3F2prop_getFreeGEM, 25.7.1999
    10110x3F3prop_putFreeGEM, 25.7.1999
    10120x3F4prop_delFreeGEM, 25.7.1999
    10130x3F5prop_gui_getFreeGEM, 22.3.2000
    10140x3F6prop_gui_setFreeGEM, 22.3.2000
    10200x3FCxapp_getinfoFreeGEM, 8.8.1999
    10300x406xshl_getshellFreeGEM, 3.12.1999
    10310x407xshl_setshellFreeGEM, 3.12.1999
    289280x7100x_appl_flagsGeneva
    289290x7101x_appl_fontGeneva
    289300x7102x_appl_sleepGeneva
    289310x7103x_appl_termGeneva
    289440x7110x_form_centerGeneva
    289450x7111x_form_errorGeneva
    289460x7112x_form_filenameGeneva
    289470x7113x_form_mouseGeneva
    289600x7120x_fsel_inputGeneva
    289760x7130x_graf_blitGeneva
    289770x7131x_graf_rubberboxGeneva
    289780x7132x_graf_rast2rezGeneva 004
    289920x7140x_objc_editGeneva
    290080x7150x_wdial_drawGeneva
    290090x7151x_wdial_changeGeneva
    290100x7152x_wind_treeGeneva
    290110x7153x_wind_createGeneva
    290120x7154x_wind_calcGeneva
    290240x7160x_scrp_getGeneva 004
    290560x7180x_settingsGeneva
    290570x7181x_shel_getGeneva
    290580x7182x_shel_putGeneva
    290590x7183x_sprintfGeneva
    290600x7184x_sscanfGeneva
    290610x7185x_helpGeneva
    290620x7186x_mallocGeneva 004
    290630x7187x_mfreeGeneva 004
    290640x7188x_mshrinkGeneva 004
    290650x7189x_reallocGeneva 004
    +
    + +
    + +Home +AESAES +ZeichensatzauswahlZeichensatzauswahl +AES-StrukturenAES-Strukturen + + diff --git a/de/aes_fundamentals.html b/de/aes_fundamentals.html new file mode 100644 index 000000000..884059709 --- /dev/null +++ b/de/aes_fundamentals.html @@ -0,0 +1,1704 @@ + + + + + +Die Anleitung zum TOS: Grundlagen des AES + + + + + + + + + +Home +AESAES +Das AESDas AES +ApplikationsfunktionenApplikationsfunktionen + +
    + +

    8.2 Grundlagen des AES

    + +

    Das AES (Application Environment Services) bildet die obere Schicht +des GEM. Es befasst sich mit all jenen GEM-Bestandteilen, die über +elementare Grafikausgaben und -eingaben hinausgehen. Da das AES +ausschließlich VDI- und GEMDOS-Aufrufe tätigt, ist es sowohl von der +Grafikhardware, vom Eingabegerät als auch vom Dateisystem +unabhängig. In diesem Abschnitt werden die folgenden Punkte +behandelt: +

    + + + + + + + +

    Auch beim AES gibt es eine interessante Entwicklung, denn +verschiedene Programmierer haben mittlerweile eigene +AES-Clones angekündigt; zur Zeit sind hier die Projekte +N.AES und XaAES zu nennen. Neben einer stetigen +Weiterentwicklung darf man wohl auch auf eine Quelltext-Version dieser +GEM Komponente hoffen. +

    +

    Querverweis: Style-Guidelines +

    +

    8.2.1 Accessories

    + + +

    8.2.1.1 Startupcode für Accessories

    + +

    Um zu testen, ob eine Applikation als Programm oder als +Accessorie gestartet worden ist, kann man wie folgt vorgehen: +

    +
      +
    • wenn beim Programmstart das Register a0 den Wert Null hat, dann +handelt es sich um einen normalen Programmstart +
        +

    • +
    • anderenfalls handelt es sich um ein Accessorie, und Register a0 +enthält einen Zeiger auf die (unvollständig) ausgefüllte BASEPAGE. +Die TPA ist bereits passend geschrumpft (auf die Summe von +Basepagegröße und der Länge der drei Programmsegmente), ein Stack +muß erst noch angelegt werden. +
        +

    • +
    + +

    Hinweis: Mit diesen Informationen ist es kein Problem, +den Startupcode für ein Programm so zu gestalten, daß es +selbständig erkennt, wie das Programm gestartet worden ist, und +entsprechend die Initialisierung fortzusetzen. Bei den meisten +C-Compilern wird im Startupcode automatisch die externe Variable +_app initialisiert, die genau dann gleich Null ist, wenn das +Programm als Accessorie gestartet worden ist. Damit kann man Programme +so entwickeln, daß sie sowohl als Accessorie als auch als normales +Programm eingesetzt werden können. +

    +

    Querverweis: AES   Accessories in MagiC   Programmstart und TPA +

    +

    8.2.1.2 Accessories in MagiC

    + +

    Unter MagiC sind Accessories den Programmen fast gleichgestellt. +Ihre Fenster bleiben beim Programmwechsel erhalten. Sie dürfen Menü +und Desktophintergrund besitzen, Programme nachladen, Speicher +anfordern, Dateien öffnen, schließen, löschen, kopieren usw. +

    +

    Da kein Grund mehr besteht, beim Programmwechsel Fenster zu +schließen, gibt es keine AC_CLOSE Meldung mehr. Accessories werden +vom System nicht von Programmen unterschieden, abgesehen davon, daß +sie sich keinesfalls beenden dürfen. ACCs dürfen sich wie unter +GEM/2 auch wieder im Menü abmelden, und zwar mit dem AES-Aufruf +menu_unregister(). Anstelle von ACCs sind unter MagiC Applikationen +sinnvoll, die einfach nur eine Menüleiste mit einem Menü anmelden +und im APP- Autostart- Ordner liegen. Diese Applikationen kann man +dann bei Bedarf nachladen und auch wieder entfernen. +

    +

    Hinweis: Ab MagiC-4 können Accessories zur Laufzeit +nachgestartet werden. Ferner ist es möglich, bei einem Klick auf +einen Accessory-Eintrag (und gedrückter Control-Taste) das +entsprechende Accessory zu entfernen. Ein Nachteil ist, daß +Accessories z.Zt. noch kein Pexec mit Modus 104 ausführen dürfen. +

    +

    Querverweis: AES   GEM   Startupcode für Accessories   +shel_write +

    +

    8.2.2 Das Desktop-Fenster

    + +

    Unter den verfügbaren Fenstern nimmt das Desktop- oder +Hintergrundfenster eine besondere Rolle ein. Es besitzt die Kennung 0, +nimmt die gesamte Bildschirmfläche in Anspruch, ist immer geöffnet +und kann auch nicht geschlossen werden. Der Arbeitsbereich ist +die Fläche unter der Menüleiste. Nur in diesem Arbeitsbereich +dürfen andere Programme Bildschirmausgaben machen oder eigene Fenster +öffnen. +

    +

    Normalerweise erscheint der Arbeitsbereich des Desktop als +solide grüne Fläche (im Farbbetrieb) bzw. als graues Raster (im +Monochrombetrieb). Der Screen-Manager kümmert sich völlig +selbsttätig um den Redraw; über einen Aufruf von wind_set +können Anwendungsprogramme einen beliebigen anderen Objektbaum als +Hintergrund verankern. Auch dann kümmert sich der Screen-Manager um +das fällige Neuzeichnen von Bildausschnitten. Obwohl diese +Möglichkeit sehr verlockend ist, gibt es etliche Gründe, die +gegen eine Benutzung des Desktop-Fensters sprechen; der +wichtigste: +

    +
      +
    • auch unter einem multitaskingfähigen GEM (MagiC oder +MultiTOS), kann es nur einen Bildschirmhintergrund geben. +Dieser sollte dem Programm vorbehalten bleiben, das daraus den meisten +Nutzen ziehen kann - in der Regel ist dies das Desktop bzw. ein +Desktop-Ersatz wie z.B. die Shell Gemini. +
        +

    • +
    + +

    Fazit: Der Desktop-Hintergrund sollte nach Möglichkeit in +eigenen Programmen nicht benutzt werden. +

    +

    Querverweis: AES   wind_set   WF_NEWDESK +

    +

    8.2.3 Der Datenaustausch über das GEM-Klemmbrett

    + + +

    Um Dateien im Klemmbrett abzulegen, sollte man folgendermaßen +vorgehen: +

    +
      +
    • alle Klemmbrett-Dateien, die auf die Maske 'scrap.*' und +'SCRAP.*' passen, löschen. Anmerkung: Die Maske 'SCRAP.*' muss +berücksichtigt werden, da alte Programme noch nichts von alternativen +und case-sensitiven Dateisystemen wussten. +
    • +
    • die abzulegenden Daten in einem oder mehreren Formaten sichern. +
    • +
    • die Nachricht SC_CHANGED an alle Applikationen im +System, SH_WDRAW an die System-Shell schicken. +
    • +
    + +

    Der Dateiname ist immer 'scrap.', die Namenserweiterung +(Suffix) hängt dabei vom gewählten Format ab; nach Möglichkeit +sollte immer eines der folgenden Standardformate unterstützt +werden: +

    +
    + + + + + + + + + + + + + + + + +
    SuffixBedeutung
    gemVektorgrafiken im Metafile-Format
    imgPixelbilder im XIMG-Format
    txtASCII-Textdatei, jede Zeile mit CR/LF abgeschlossen
    +
    + +

    Zusätzlich kann man eines oder mehrere der folgenden Formate +unterstützen (der Empfänger hat dann die Möglichkeit, das Format +mit den meisten Informationen zu benutzen): +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    SuffixBedeutung
    ascASCII-Textdatei, jeder Absatz mit CR/LF abgeschlossen
    csvASCII-Datei mit durch Kommata getrennten Zahlen
    cvgCalamus Vektorgrafik-Format
    difExport-Datei von Tabellenkalkulationen
    epsEncapsulated PostScript
    1wpWordplus-Format
    rtfMicrosoft Rich Text Format
    texTeX
    +
    + +

    Das empfangende Programm sollte zunächst überprüfen, welche +der vorhandenen Dateien die meisten Informationen enthält, und dann +diese Datei nehmen. +

    +

    Wichtig: Jede der Dateien im Klemmbrett enthält +prinzipiell die gleichen Informationen, nur eben in einem anderen +Format. Die Textverarbeitung Papyrus z.B. importiert +'scrap.rtf' nur dann, wenn das eigene Format 'scrap.pap' nicht +gefunden werden konnte. +

    +

    Aus den obigen Erklärungen wird ersichtlich, daß sich immer +nur ein Datenobjekt (allerdings in verschiedenen Formaten) auf +einmal im Klemmbrett befinden kann. +

    +

    Querverweis: Klemmbrett-Funktionen   scrp_clear   +Style-Guidelines +

    +

    8.2.4 Die Objekt-Struktur

    +

    Die Datenstruktur des Objektbaums ist zwar kein Baum im Sinne eines +Binärbaums, besitzt jedoch innerhalb eines Zeigers die logischen +Verkettungen eines Baums, mit Vorgängern und Nachfolgern. Die +Spezifikation von Vorgängern und Nachfolgern wird durch Indizes auf +ein Array vorgenommen. +

    +

    Die Baumstruktur der einzelnen Objekte kann man sich am +leichtesten an Hand eines einfachen Beispiels veranschaulichen: Ein +Menü setzt sich zunächst aus der Menüleiste zusammen. Diese +enthält wiederum mehrere Titeltexte. Die Titeltexte sind also direkt +in der Menüleiste enthalten, sie sind beide Nachfolger des Objekts +'Menüleiste', bewegen sich also auf der selben hierarchischen Ebene. +Das Objekt Menüleiste verweist mit ob_head auf den ersten +Menütitel und mit ob_tail auf den letzten Menütitel. Im +ersten Menütitel dient der Zeiger ob_next zur Adressierung +des nächsten Menütitels. Die Verkettung weist also folgende Struktur +auf: +

    +
          Menüleiste:
    +   +---------+---------+--------+
    +   | ob_head | ob_tail | ...    |
    +   |    o    |    o    |        |
    +   +----|----+----|----+--------+
    +        |         +-------------------------+
    +        V                                   V
    +   +---------+---------+--------+       +---------+---------+--------+
    +   | ...     | ob_next | ...    |  ...  | ...     | ...     | ...    |
    +   |         |    o    |        |       |         |         |        |
    +   +---------+----|----+--------+       +---------+---------+--------+
    +      1.Menütitel |                         n-ter Menütitel
    +                  +-----> 2.Menütitel
    +
    +

    Welche Aktionen mit einem Objekt durchgeführt werden dürfen, +wird in ob_flags festgelegt. Der Zustand eines Objekts wird im +Eintrag ob_state festgehalten. Der Eintrag ob_type +legt den Objekttyp fest. Manche Objekte benötigen zur exakten +Festlegung eine zusätzliche Datenstruktur, wie TEDINFO oder BITBLK. In +ob_spec wird dann ein Zeiger auf diese zusätzliche Struktur abgelegt. +Zusammenfassend nochmals der Gesamtaufbau der Datenstruktur für +Objekte OBJECT: +

    +
             +-------------+
    +         |  ob_next    |   Index für das nächste Objekt
    +         +-------------+
    +         |  ob_head    |   Index des ersten Kindes
    +         +-------------+
    +         |  ob_tail    |   Index des letzten Kindes
    +         +-------------+
    +         |  ob_type    |   Objektart
    +         +-------------+
    +         |  ob_flags   |   Manipulationsflags
    +         +-------------+
    +         |  ob_state   |   Objektstatus
    +         +-------------+
    +         |  ob_spec    |   siehe unter Objektart
    +         +-------------+
    +         |  ob_x       |   relative x-Koordiante zum Eltern-Objekt
    +         +-------------+
    +         |  ob_y       |   relative y-Koordinate zum Eltern-Objekt
    +         +-------------+
    +         |  ob_width   |   Breite des Objekts
    +         +-------------+
    +         |  ob_height  |   Höhe des Objekts
    +         +-------------+
    +
    +

    Querverweis: Objektfarben des AES   Objektart   Manipulationsflags   Objektstatus +

    +

    8.2.4.1 Objektarten des AES

    + +

    Folgende Objektarten stehen zur Auswahl: +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Art Bedeutung +
      + +
    G_BOX (20) Rechteckiger Kasten. ob_spec enthält verschiedene +Informationen über Rahmenstärke, Farbe und ähnliches. +
      + +
    G_TEXT (21) Grafiktext, ob_spec zeigt auf TEDINFO-Struktur. +
      + +
    G_BOXTEXT (22) rechteckiger Kasten mit Grafiktext, ob_spec zeigt auf +TEDINFO-Struktur. +
      + +
    G_IMAGE (23) Bild, ob_spec zeigt auf BITBLK-Struktur. +
      + + +
    G_USERDEF (24) Benutzerdefinierte Funktion zum Zeichnen eines eigenen Objekts. +ob_spec verweist auf eine USERBLK Struktur. +
      + +
    G_IBOX (25) Transparentes Rechteck, das nur gesehen werden kann, wenn die +Umrandung nicht die Dicke Null hat. ob_spec enthält weitere +Informationen über das Aussehen. +
      + +
    G_BUTTON (26) Text mit Rahmen für Optionsauswahl. ob_spec zeigt auf eine +Zeichenkette mit dem Text, der in dem Knopf erscheinen soll. +
      +
    Neu ab MagiC-Version 3.0: +
    Ist das Objektflag WHITEBAK gesetzt, und Bit-15 im Objektstatus = +0, so wird der Button unterstrichen; dabei gilt: (Highbyte&0xf) +von ob_state ist die gewünschte Unterstreichposition. Falls hingegen +Bit-15 = 1 ist, so handelt es sich um einen Sonderbutton (Radio-Button +oder Checkbox). +
      +
    Weitere Besonderheiten: WHITEBAK=1, Bit-15 = 1 und in ob_state +
      + + + + + + + + + +
    Highbyte = -2 Gruppenrahmen +
    Highbyte = -1 Sonderbutton, nicht unterstr. +
    Highbyte != -1,-2 Sonderbutton, unterstr. + +
    + +
    (dabei ist wieder (Highbyte&0xf) von ob_state die +Unterstreichposition). Das Vorhandensein dieser Features sollte am +besten über die Funktion appl_getinfo (Opcode 13) ermittelt werden. +
      + +
    G_BOXCHAR (27) Rechteck, mit einem Zeichen. In ob_spec wird nicht nur das +Aussehen der Umrandung, sondern auch das Zeichen definiert. +
      + +
    G_STRING (28) Zeichenkette, ob_spec zeigt auf den String. +
      +
    Neu ab MagiC-Version 3.0: +
    Ist das Objektflag WHITEBAK gesetzt, und das Highbyte von ob_state +!= -1, so wird der String unterstrichen; die Unterstreich-Position +wird dabei durch (Highbyte & 0xf) von ob_state geregelt. +
      +
    Bei gesetztem WHITEBAK-Flag und Highbyte von ob_state = -1, wird +der komplette String unterstrichen. Das Vorhandensein dieser Features +sollte am besten per appl_getinfo (Opcode 13) ermittelt werden. +
      + +
    G_FTEXT (29) Formatierter Grafiktext, ob_spec zeigt auf TEDINFO-Struktur +
      + +
    G_FBOXTEXT (30) Rechteck mit formatiertem Grafiktext, ob_spec zeigt auf +TEDINFO-Struktur. +
      + +
    G_ICON (31) Icon-Symbol, ob_spec zeigt auf die ICONBLK-Struktur. +
      + +
    G_TITLE (32) Titel eines Drop-Down-Menüs, ob_spec zeigt auf den String. +
      +
    Ab MagiC-2 kann dabei auch ein Buchstabe unterstrichen werden. +Dies geht wie folgt: +
      +
    WHITEBAK in ob_state setzen +
      + + + + + + +
    (ob_state >> 8) & 0xf = Position des Unterstrichs +
    (ob_state >> 8) & 0xf0 ist 0 + +
    + + +
    G_CICON (33) Farb-Icon, ob_spec zeigt auf die CICONBLK-Struktur. +
      + +
    G_CLRICN (33) Colour icon, ob_spec zeigt auf die ICONBLK-Struktur. Supported +in the ViewMAX/3 beta and in FreeGEM +
      + +
    G_SWBUTTON (34) Cycle-Button (d.h. ein Button, der beim Anklicken seinen Text +zyklisch ändert), ob_spec zeigt auf eine SWINFO-Struktur. Das +Vorhandensein dieses Objekttyps sollte per appl_getinfo (Opcode 13) erfragt +werden. +
      + +
    G_DTMFDB (34) For internal AES use only: desktop image. The ob_spec is a +pointer to a MFDB structure. Supported in the ViewMAX/3 beta and in +FreeGEM. +
      + +
    G_POPUP (35) PopUp-Menü, ob_spec zeigt auf eine POPINFO-Struktur. Falls das +Menü mehr als 16 Einträge umfaßt, so ist dieses scrollbar. Das +Vorhandensein dieses Objekttyps sollte per appl_getinfo (Opcode 13) erfragt +werden. Hinweis: G_POPUP sieht wie G_BUTTON aus, die Zeichenkette wird +jedoch nicht zentriert, um möglichst mit den Zeichenketten im Menü +auf einer Linie zu liegen. +
      + +
    G_WINTITLE (36) Diese Objektnummer wird von MagiC intern dazu verwendet, +Fenstertitel darzustellen. Der Aufbau dieses Objekttyps kann sich +jederzeit ändern und wird daher nicht dokumentiert. +
      + +
    G_EDIT (37) Ab MagiC 5.20 steht ein in einer Shared-Library implementiertes +Editobjekt zur Verfügung. ob_spec verweist auf das Objekt. Achtung: +Dieser Typ wird von den Funktionen form_do, form_xdo, form_button, form_keybd, +objc_edit, wdlg_evnt und wdlg_do z.Zt. noch nicht unterstützt, d.h. +die entsprechenden Ereignisse müssen selbst (per edit_evnt) an das +Objekt weitergeleitet werden. +
      + +
    G_SHORTCUT (38) Dieser Typ wird ähnlich wie G_STRING behandelt, ein +vorhandenes Tastaturkürzel wird jedoch abgespalten und rechtsbündig +ausgegeben. Das Vorhandensein dieses Objekttyps sollte per appl_getinfo +(Opcode 13) erfragt werden. +
      +
    Die Einführung proportionaler AES-Zeichensätze machte eine +neue Strategie für die Ausrichtung der Menüeinträge erforderlich. +Um Tastaturkürzel rechtsbündig ausrichten zu können, werden Objekte +vom Typ G_STRING innerhalb eines Menüs entsprechend in Kommando und +Kürzel aufgespalten. Diese Strategie versagt jedoch bei Menüs, die +vom Programm selbst, z.B. innerhalb eines Fensters oder eines +Popup-Menüs, verwaltet werden. Um auch hier eine brauchbare +Ausrichtung zu erreichen, mußte dieser neue Objekttyp eingeführt +werden. +
      + +
    G_SLIST (39) XaAES extended object - scrolling list +
      + +
    + +

    Hinweis: Für G_BOX, G_IBOX und G_BOXCHAR zeigt die +Komponente ob_spec der OBJECT-Struktur nicht auf eine +andere Datenstruktur, sondern enthält weitere Informationen zum +Aussehen des Objektes. Dabei gilt: +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Bits Bedeutung +
        +
    24..31 darzustellendes Zeichen (nur bei G_BOXCHAR) +
    16..23 + + + + + + + + + +
     0 = Rahmendicke +
     1..128 = Rahmen liegt 1..128 Pixel im inneren des Objekts +
    -1..-127 = Rahmen liegt 1..127 Pixel außerhalb des Objekts + +
    + +
    12..15 Rahmenfarbe (0..15) +
    08..11 Textfarbe (0..15) +
    7 Text transparent (0) oder deckend (1) +
    04..06 + + + + + + + + + + + + + + + + + + +
    0 = hohl +
    1 = ansteigende Intensität +
    2   +
    .   +
    .   +
    7 = solide Fläche + +
    + +
    00..03 Innenfarbe (0..15) + +
    + +

    Das Hibyte wird vom AES nur für Submenüs verwendet. Ist das +höchste Bit von ob_type 0x8000, sowie das Bit SUBMENU in ob_flags +gesetzt, so geben die Bits 8..14 an, welches Submenü mit dem +Menüeintrag gekoppelt ist. Jede Applikation kann daher maximal 128 +Submenüs haben. MagiC liest aus ob_type stets nur das Lowbyte aus, +außer für die Submenü-Behandlung. TOS reagiert auf unbekannte +Objekttypen (z.B. die reinen MagiC-Typen G_SWBUTTON usw.) sauber, +d.h. die Objekte werden nicht gezeichnet. +

    +

    Querverweis: Objektstruktur im AES   Objektfarben des AES +

    +

    8.2.4.2 Objektfarben des AES

    +

    Die folgende Tabelle enthält die vordefinierten Objektfarben. +Einzelheiten hängen natürlich von der gewählten Bildauflösung, +sowie den Einstellungen des Benutzers ab. +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NummerFarbeStandard RGB-Werte
    WHITE (00)Weiß1000, 1000, 1000
    BLACK (01)Schwarz0, 0, 0
    RED (02)Rot1000, 0, 0
    GREEN (03)Grün0, 1000, 0
    BLUE (04)Blau0, 0, 1000
    CYAN (05)Cyan0, 1000, 1000
    YELLOW (06)Gelb1000, 1000, 0
    MAGENTA (07)Magenta1000, 0, 1000
    DWHITE (08)Hellgrau752, 752, 752
    DBLACK (09)Dunkelgrau501, 501, 501
    DRED (10)Dunkelrot713, 0, 0
    DGREEN (11)Dunkelgrün0, 713, 0
    DBLUE (12)Dunkelblau0, 0, 713
    DCYAN (13)Dunkelcyan0, 713, 713
    DYELLOW (14)Dunkelgelb713, 713, 0
    DMAGENTA (15)Dunkelmagenta713, 0, 713
    +
    + +

    Hinweis: Diese Farben entsprechen auch weitestgehend den +unter Windows und OS/2 verwendeten Iconfarben. Über ein geeignetes +CPX-Modul können die richtigen RGB-Werte für die ersten 16 Farben +eingestellt werden. +

    +

    Querverweis: Objektstruktur im AES   Objektarten des AES +

    +

    8.2.4.3 Objektflags des AES

    +

    Die Manipulationsflags eines Objektes bestimmen seine +Eigenschaften. Folgende Möglichkeiten stehen zu Auswahl: +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Flag Bedeutung +
      +
    NONE (0x0000) Keine Eigenschaften. +
      + +
    SELECTABLE (0x0001) Das Objekt ist selektierbar. +
      + +
    DEFAULT (0x0002) Wenn der Benutzer die 'Return' oder 'Enter' Taste drückt, wird +dieses Objekt automatisch selektiert. Diese Flag ist pro Baum nur +einmal zugelassen. +
      + +
    EXIT (0x0004) Beim Anklicken eines solchen Objektes wird der Dialog beendet +(siehe auch form_do). +
      + +
    EDITABLE (0x0008) Dieses Objekt kann vom Benutzer mittels der Tastatur editiert +werden. +
      + +
    RBUTTON (0x0010) Haben im selben Objektbaum mehrere Objekte die eigenschaft +RBUTTON, so kann immer nur eines dieser Objekte selektiert sein. Diese +Objekte sollten alle Kinder eines Elternobjekts mit der Objektart +G_IBOX sein. Wird ein anderes Objekt dieser Gruppe ausgewählt, wird +das zuvor selektierte automatisch deselektiert. +
      + +
    LASTOB (0x0020) Hierbei handelt es sich um das letzte Objekt innerhalb eines +Objektbaumes. +
      + +
    TOUCHEXIT (0x0040) Der Dialog (siehe auch form_do) wird beendet, sobald sich der +Mauszeiger über diesem Objekt befindet, und der linke Mausknopf +gedrückt wird. +
      + + +
    HIDETREE (0x0080) Das Objekt und seine Kinder werden von objc_draw und objc_find +nicht mehr bemerkt, sobald dieses Flag gesetzt ist. Weiterhin wird das +Flag ab MagiC 5.20 auch von form_keybd ausgewertet, wenn Objekte zu +Tastenkürzeln gesucht werden. Eine Eingabe in versteckte Objekte ist +jedoch immer noch möglich. Um dies zu verhindern, muß das Flag +EDITABLE gelöscht werden. +
      + +
    INDIRECT (0x0100) ob_spec zeigt nun auf einen weiteren Zeiger, der dann auf den +eigentlichen Wert von ob_spec zeigt (siehe auch OBJECT). Auf diese +Weise lassen sich die Standarddatenstrukturen wie TEDINFO etc. auf +einfache Art erweitern. +
      + +
    FL3DIND (0x0200) Dieses Objekt erzeugt unter MultiTOS ein dreidimensionales +Objekt (unter MagiC (ab Version 3.0) erst ab 16 Farben, und wenn der +3D-Effekt nicht abgeschaltet wurde). Im 3D-Betrieb wird dies als +Indikator aufgefaßt. Bei diesen Objekten handelt es sich i.d.R. um +Buttons, die einen Status anzeigen, beispielsweise Radio-Buttons. +
      + +
    ESCCANCEL (0x0200) Das Drücken der ESC Taste entspricht einem Anwählen des +Objekts mit diesem Flag. Deshalb darf es nur ein Default Objekt in +einem Dialog geben. Only effective in ViewMAX/2 and later. +
      + +
    FL3DBAK (0x0400) Dieses Objekt wird im 3D-Betrieb als Hintergrund aufgefaßt, +und entsprechend gezeichnet. Es empfiehlt sich in Dialogen mit +3D-Buttons das ROOT Objekt mit diesem Flag zu belegen. Gleiches gilt +für Eingabefelder und Textobjekte, denn nur so wird eine einheitliche +Hintergrundfarbe erhalten. +
      +
    Siehe auch (0x4000). +
      + +
    BITBUTTON (0x0400) Dieses Flag wurde mit ViewMAX beta eingeführt, wird dort aber +nicht benutzt. Vermutlich enthält ein Button mit diesem Flag eine +Bitmap anstelle eines Textes. Only effective in ViewMAX/2 and later. +
      + +
    FL3DACT (0x0600) Dieses Objekt wird im 3D-Betrieb als Aktivator aufgefaßt. Bei +diesen Objekten handelt es sich i.d.R. um Buttons, mit denen man +Dialoge verlassen, oder sonstwie eine Aktion hervorrufen kann. +
      + +
    SUBMENU (0x0800) Wird in MultiTOS und ab MagiC 5.10 verwendet, um Submenüs zu +kennzeichnen. menu_attach setzt dieses Bit in einem Menüeintrag, um +zu kennzeichnen, daß hier ein Submenü angehängt ist. Das Hibyte von +ob_type enthält dann die Submenü-Nummer (128..255) d.h. Bit 15 von +ob_type ist immer gleichzeitig mit SUBMENU gesetzt. +
      + +
    SCROLLER (0x0800) Das Drücken der PAGEUP Taste entspricht einem Anwählen des +ersten Objekts mit diesem Flag in dem Dialog. Das Drücken der +PAGEDOWN Taste entspricht einem Anwählen des letzten Objekts mit +diesem Flag. Only effective in ViewMAX/2 and later. +
      + +
    FLAG3D (0x1000) Ein Objekt mit dieserm Flag wird mit einem 3D Rahmen +gezeichnet. Ab ViewMAX/2 wird jeder Button automatisch mit einem 3D +Rahmen gezeichnet. Dazu wird die Color Categorie (siehe USECOLOURCAT) +benutzt. Only effective in ViewMAX/2 and later. +
      + +
    USECOLOURCAT (0x2000) Die Farbe des Objekts ist kein Farbindex des VDI sondern ein +Eintrag in einer Tabelle mit Farben für bestimmte Kategorien. Diese +Tabellle hat 16 Einträge. ViewMAX benutzt die folgenden Kategorien: +
      + + + + + + + + + + + + + + + + + + + + + +
    CC_NAME (8) Inaktive Titlezeile eine Fensters +
      +
    CC_SLIDER (8) Hintergrund einer Scrollbar +
      +
    CC_DESKTOP (10) Der Desktop +
      +
    CC_BUTTON (11) Buttons und andere 3D Gadgets +
      +
    CC_INFO (12) Infozeile eines Fensters +
      +
    CC_ALERT (13) Alertboxen (wird in ViewMAX und FreeGEM nicht benutzt) +
      +
    CC_SLCTDNAME (14) Aktive Titelzeile eines Fensters +
      + +
    + +
    Wahrscheinlich ist beabsichtigt, die Kategorien 0 bis 7 durch +die Applikation definieren zu lassen, während 8 bis 15 für das +System reserviert sind. Die Einstellung wird in ViewMAX.INI +(GEM.CFG in FreeGEM) gespeichert und besteht aus jeweils einen +Vordergrund, Hintergrund, Füllstil und Füllindex. Only effective in +ViewMAX/2 and later. +
      +
    FL3DBAK (0x4000) 3D background (sunken rather than raised). +
    To check for this feature, use appl_init and check that bit 3 of +xbuf.abilities is set. +
      +
    SUBMENU (0x8000) Not implemented in any known PC AES +
      + +
    + +

    Querverweis: Objektstruktur im AES   Objektarten des AES +

    +

    8.2.4.4 Objektstati des AES

    +

    Vom Objektstatus hängt es ab, wie ein Objekt später auf dem +Bildschirm dargestellt wird. Ein Objektstatus kann von folgendem Typ +sein: +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Status Bedeutung +
      +
        +
      +
    NORMAL (0x0000) Normale Darstellung. +
      + +
    SELECTED (0x0001) Inverse Darstellung, dh. das Objekt ist selektiert. +
      + +
    CROSSED (0x0002) Falls die Objektart BOX ist, wird das Objekt mit +durchgestrichen gezeichnet. +
      + +
    CHECKED (0x0004) Am linken Objektrand befindet sich ein Häkchen. +
      + +
    DISABLED (0x0008) Das Objekt wird grau dargestellt und ist nicht mehr +selektierbar. +
      + +
    OUTLINED (0x0010) Das Objekt bekommt einen Rahmen. +
      + +
    SHADOWED (0x0020) Ein Schatten wird unter das Objekt gezeichnet. +
      + +
    WHITEBAK (0x0040) Auf PC-GEM bewirkt dies, daß die Icon-Maske nicht +mitgezeichnet wird, was u.U. die Ausgabe beschleunigen kann. +
    Ab MagiC-3 wird hiermit das Unterstreichen von Zeichenketten +gesteuert. Dieses Feature kann über appl_getinfo (Opcode 13) ermittelt +werden. +
      + +
    DRAW3D (0x0080) Ein Objekt soll mit 3D-Effekt gezeichnet werden. Dieses Flag +ist nur für PC-GEM interessant, und wird vom Atari-AES (so z.B. auch +in MagiC) ignoriert. +
      + +
    HIGHLIGHTED (0x0100) Ein Objekt mit diesem State wird mit einer gestrichelten Line, +die mit MD_XOR gezeichnet wird, umrandet. Dieser State wurde mit +ViewMAX beta eingeführt. +
      + +
    UNHIGHLIGHTED (0x0200) Bei einem Objekt mit diesem State wird beim Zeichnen explizit +eine durch den State HIGHLIGHTED gezeichnete Umrandung entfernt. Dazu +muß wie folgt vorgegangen werden: Zuerst muß der State HIGHLIGHTED +gelöscht werden, dann der State UNHIGHLIGHTED gesetzt werden und +anschließend das Objekt mit der Funktion objc_draw neu gezeichnet +werden. Ein Neuzeichnen des Objekts ohne den State UNHIGHLIGHTED +würde die Umrandung nicht löschen, da sie außerhalb des Bereichs +liegt, den das Objekt belegt. Nach dem Neuzeichnen sollte der State +UNHIGHLIGHTED wieder gelöscht werden. Dieser State wurde mit ViewMAX +beta eingeführt. +
      + +
    UNDERLINE (0x0f00) Dieser Opcode steht unter MagiC ab Version 2.0 zur Verfügung, +und legt die Position und Größe des Unterstriches bei Objekten vom +Typ G_STRING, G_TITLE und G_BUTTON fest. +
      + +
    XSTATE (0xf000) Dieser Opcode steht unter MagiC ab Version 2.0 zur Verfügung, +und sorgt für das Umschalten bei den verschiedenen Button-Typen +(G_STRING, G_TITLE und G_BUTTON). +
      + +
    + +

    In GEM/5, CROSSED makes the object draw in 3D: +

    +
      +
    • If an object is both CROSSED and SELECTABLE, then it is drawn +as a checkbox. +
    • +
    • If it is CROSSED, SELECTABLE and an RBUTTON, it is drawn as a +radio button. +
    • +
    • If it is a button or a box and it is CROSSED, then it is drawn +as a raised 3D shape, similar to Motif. +
    • +
    • If a button is CROSSED and DEFAULT, a "Return key" +symbol appears on it (rather like NEXTSTEP). +
    • +
    • Boxes and text fields that are CROSSED and CHECKED appear +sunken. +
    • +
    + +

    GEM/5 can be detected by calling vqt_name for font 1. If +nothing is returned, GEM/5 is running. +

    +

    Recent FreeGEM builds contain a system based on the GEM/5 +one, but extended and backwards-compatible. The DRAW3D state is used +instead of CROSSED: +

    +
      +
    • If an object is both DRAW3D and SELECTABLE, then it is drawn as +a checkbox. +
    • +
    • If it is DRAW3D, SELECTABLE and an RBUTTON, it is drawn as a +radio button. +
    • +
    • If a button is DRAW3D and DEFAULT, a "Return key" +symbol will be on it. +
    • +
    • If an object with a 3D border has the WHITEBAK state, then the +3D border will not have a black edge. +
    • +
    • If a radio button or checkbox has the WHITEBAK state, then it +will be drawn with a white background rather than in the colour used +by 3D objects. +
    • +
    + +

    To check for these abilities, use appl_init and check that bit 3 +of xbuf.abilities is set. +

    +

    Querverweis: Objektstruktur im AES   Objektarten des AES +

    +

    8.2.5 Der Quarter-Screen-Buffer

    +

    Der Quarter-Screen-Buffer wird vom Screen-Manager benötigt, um +beim Herunterklappen von Drop-Down-Menüs den Inhalt des +Menühintergrundes zu retten. Auch bei der Anzeige von Alarmboxen +kommt der 'QSB' (so die gebräuchliche Abkürzung) zum Einsatz. +Normalerweise sollte seine Größe von der Anzahl der Farbebenen und +der Größe des Systemzeichensatzes, nicht aber von der +Gesamtgröße des Bildschirms abhängen. +

    +

    Eine gute Formel wäre: +
       500(Zeichen) * Platzbedarf eines Zeichens * Farbebenen +

    +

    Damit käme man in der Auflösung 'ST-Hoch' genau auf den Wert +8000 (also ein Viertel des Bildspeichers). Leider ist das AES in +vielen Fällen jedoch nicht so clever; die folgende Tabelle enthält +eine Übersicht über die benutzten Algorithmen einiger +GEM-Versionen: +

    +
    + + + + + + + + + + + + + + + + +
    GEM-VersionMethode zum Setzen des QSB
    1.0 und 1.2statisch, 8000 Bytes
    1.4dynamisch, ein Viertel des Bildspeichers
    3.0dynamisch, die Hälfte des Bildspeichers
    +
    + +

    Hinweis: Die GEM-Versionen 1.0 und 1.2 (also bis +einschließlich TOS-Version 1.02) sind mithin nicht für +Farbgrafikkarten vorbereitet - einer unter mehreren Gründen, warum +man selbst bei Benutzung eines speziellen VDI-Treibers unter diesen +GEM-Versionen Farbgrafikkarten nicht einsetzen kann. +

    +

    Querverweis: GEM +

    +

    8.2.6 Die Rechteckliste eines Fensters

    + +

    Um dem Problem sich überlappender Fenster zu begegnen, +unterhält das AES für jedes Fenster die sogenannte +Rechteckliste; alle Elemente dieser Liste ergeben gerade den +komplett sichtbaren Arbeitsbereich des entsprechenden Fensters. +

    +

    Um ein Fenster (bzw. dessen Inhalt) neu zu zeichnen erfragt man +zunächst per wind_get( WF_FIRSTXYWH) das erste Rechteck der o.g. Liste. +Dann stellt man fest, ob sich dieses Rechteck mit dem neu zu +zeichnenden Bildschirmbereich überschneidet; dann und nur dann +zeichnet man diesen Bereich unter Ausnutzung von vs_clip neu. +

    +

    Diese Methode wird mit allen übrigen Elementen der +Rechteckliste fortgesetzt, bis die Höhe und Breite eines +Rechtecks den Wert Null besitzen. +

    +

    Querverweis: Clipping   WM_REDRAW   wind_get   wind_update +

    +

    8.2.7 Der Screen-Manager

    + +

    Der Screen-Manager ist immer aktiv und überwacht die Position +des Mauszeigers, wenn dieser den Arbeitsbereich der Fenster anderer +Applikationen verläßt. Die hier in Frage kommenden Flächen sind die +Rahmen der Fenster, die Drop-Down-Menüs und die Menüleiste. +

    +

    Beim Berühren des Menübereichs sorgt der Screen-Manager +selbsttätig dafür daß der vom Menü belegte Bildschirmausschnitt +gesichert und anschließend wiederhergestellt wird (dazu wird der +Quarter-Screen-Buffer benutzt). +

    +

    Auch Manipulationen an den Fensterkontrollen führen nicht zu +dauerhaften Veränderungen des Bildspeichers; Resultat der +Interaktionen mit dem Screen-Manager sind die sogenannten +Mitteilungsereignisse, die die zuständige Applikation über die +Aktion des Benutzers informieren. +

    + + +

    Hinweis: Die ID des Screen-Managers kann übrigens +leicht durch einen Aufruf von appl_find("SCRENMGR") +ermittelt werden. +

    +

    Querverweis: AES   GEM   Nachrichten +

    +

    8.2.8 Toolbar-Support

    + +

    Ab AES-Version 4.1 unterstützt das Betriebssystem sogenannte +Toolbars. Es handelt sich dabei um einen OBJECT-Baum, der unterhalb +der Info-Zeile eines Fensters (und über dem Arbeitsbereich) plaziert +wird, und die Darstellung von Buttons, Icons etc. im Fenster +ermöglicht. +

    +

    Wie bereits von den Fensterroutinen bekannt, wird die Verwaltung +einer Toolbar zwischen dem AES und der Applikation aufgeteilt. +Dabei ist das AES für die folgenden Aktionen +verantwortlich: +

    +
      +
    • Anpassung der x- und y-Koordinaten der Toolbar, wenn das +Fenster bewegt oder in der Größe verändert wird. +
    • +
    • Sicherstellung, daß das Fenster auf die für die +Fenster-Komponenten und die Toolbar notwendige Größe konfiguriert +wird. +
    • +
    • Anpassung der Breite der Toolbar an die Breite des Fensters. +
    • +
    • Neuzeichnung der Toolbar beim Eintreffen einer +WM_REDRAW-Nachricht. +
    • +
    • Verschicken von AES-Nachrichten, wenn der Benutzer ein +Objekt der Toolbar aktiviert. +
    • +
    + +

    Die Applikation hingegen muss sich um die folgenden Dinge +kümmern: +

    +
      +
    • Aufbau eines OBJECT-Baumes für die Toolbar (insbesondere muss +darauf geachtet werden, daß alle anwählbaren Elemente der Toolbox +den Status TOUCHEXIT besitzen). +
    • +
    • Anpassung der Breite eines Objektes der Toolbar, falls dieses +von der Breite des Fensters abhängig ist (wird evtl. beim Verändern +der Größe des Fensters notwendig sein). +
    • +
    • Behandlung von USERDEF-Objekten. +
    • +
    • Neuzeichnung alle Objekte, deren optische Erscheinung geändert +werden soll. In diesem Fall muss unbedingt die Rechteckliste der +Toolbar abgefragt bzw. berücksichtigt werden. +
    • +
    • Probleme die im Zusammenhang mit der Bildschirmauflösung +stehen, müssen gelöst werden. So kann z.B. die Höhe eines Icons in +der mittleren ST-Auflösung von der Höhe des Icons in der mittleren +TT-Auflösung abweichen. +
    • +
    + +

    Bei der Unterstützung von Toolbars in eigenen Programmen +sollten die folgenden Punkte beachtet werden: +

    + + +

    Querverweis: +
    WF_TOOLBAR   WF_FTOOLBAR   WF_NTOOLBAR   WM_TOOLBAR   wind_get   wind_set +

    +

    8.2.8.1 Redraw und Updating von Toolbars

    +

    Bei der Neuzeichnung (von Teilen) der Toolbar ist, wie üblich, +die Rechteckliste zu beachten. Da die bisherigen wind_get Opcodes +WF_FIRSTXYWH und WF_NEXTXYWH jedoch nur den Arbeitsbereich eines Fensters +berücksichtigen, wurden zwei neue Parameter (WF_FTOOLBAR und WF_NTOOLBAR) +eingeführt, mit deren Hilfe die Rechteckliste für eine Toolbar +abgefragt werden kann. +

    +

    Ein Redraw (von Teilen) der Toolbar kann in den folgenden +Situationen notwendig sein: +

    +
      +
    • die Toolbar enthält benutzerdefinierte Objekte (USERDEF's). +
    • +
    • der Status eines Objektes der Toolbar wurde verändert. Der neu +zu zeichnende Bereich besteht dabei aus der Größe des Objektes zzgl. +des Platzes, welcher für Spezialeffekte (3D, Shadowing, Outline etc.) +beansprucht wird. +
    • +
    + +

    Nicht notwendig ist ein Neuzeichnen z.B. in folgenden +Fällen: +

    +
      +
    • das entsprechende Fenster ist ikonifiziert. Die Applikation +braucht sich um keinerlei Verwaltung der Toolbar zu kümmern; dies ist +erst wieder nach der Aufhebung des Iconify, dem sogenannten Uniconify, +notwendig. +
    • +
    • die im Fenster vorhandene Toolbar soll durch eine andere +ersetzt werden. In diesem Fall reicht ein Aufruf von wind_set mit dem +Opcode WF_TOOLBAR und der Adresse des neuen OBJECT-Baumes aus. +
    • +
    • die im Fenster vorhandene Toolbar soll entfernt werden. In +diesem Fall reicht ein Aufruf von wind_set mit dem Opcode WF_TOOLBAR +und NULL-Parametern aus. +
    • +
    + +

    Querverweis: Rechteckliste eines Fensters   Toolbar-Support +

    +

    8.2.8.2 Toolbars und der Window-Manager

    +

    Zur Handhabung von Toolbars kann eine Applikation auf den +Window-Manager des AES zurückgreifen. Im einzelnen: +

    + +

    Um eine Toolbar an ein Fenster anzuheften, genügt ein +Aufruf von wind_set(handle, WF_TOOLBAR, ...) mit der Adresse des +Toolbar-Objektbaumes. Falls dieser Aufruf durchgeführt wird während +das Fenster geöffnet ist, so ist dieses selbst für die korrekte +Berechnung der Höhe der Toolbar verantwortlich. +

    + +

    Um eine Toolbar gegen eine andere auszutauschen, kann +auf einen Aufruf von wind_set(handle, WF_TOOLBAR, ...) mit der Adresse +der neuen Toolbar zurückgegriffen werden. Falls dieser Aufruf +durchgeführt wird während das Fenster geöffnet ist, so ist dieses +selbst für die korrekte Berechnung der Höhe der (neuen) Toolbar +verantwortlich. +

    + +

    Um eine Toolbar aus einem Fenster zu lösen, ist ein +Aufruf von wind_set(handle, WF_TOOLBAR, ...) mit NULL Parametern +erforderlich. Falls dieser Aufruf durchgeführt wird während das +Fenster geöffnet ist, so ist dieses selbst für die korrekte weitere +Bearbeitung verantwortlich. +

    +

    Darüber hinaus sind die folgenden Punkte zu beachten: +

    +
      +
    • Wird ein Fenster per wind_close geschlossen, so wird eine evtl. +vorhandene Toolbar nicht entfernt. Bei einem späteren Öffnen +ist die Toolbar also weiterhin vorhanden. +
    • +
    • Wird ein Fenster per wind_delete entfernt, so wird auch die +Verbindung zur Toolbar aufgelöst. +
    • +
    • Um Mausklicks auf Toolbar-Objekte erkennen zu können, müssen +diese den Status TOUCHEXIT besitzen. Bei einem Klick auf ein solches +Objekt wird vom AES eine WM_TOOLBAR-Nachricht erzeugt, und an die +betreffende Applikation geschickt. +
    • +
    + +

    Querverweis: AES   GEM   Toolbar-Support +

    +

    8.2.8.3 Probleme bei wind_calc in Toolbar-Fenstern

    + +

    Beim Einsatz der Funktion wind_calc auf Fenster, die eine +Toolbar beinhalten, sind einige Probleme zu berücksichtigen: +

    +

    Da dieser Funktion keine Fenster-Kennung (Window-Handle) +übergeben wird, können die gewünschten Größen nicht korrekt +berechnet werden, wenn sich eine Toolbar im Fenster befindet. Der +Grund liegt ganz einfach darin, daß das AES in diesem Fall +keine Informationen über die Toolbar, und speziell über +deren Größe besitzt. +

    +

    Daher müssen in diesem Fall die von wind_calc gelieferten Werte +von der Applikation weiter aufbereitet werden. Da das Programm auf den +entsprechenden OBJECT-Baum (und damit auch auf die Höhe der Toolbar) +zugreifen kann, ist dies problemlos möglich. Konkret: +

    +
      +
    • Bei der Ermittlung des Randbereiches des Fensters, muß +die Höhe der Toolbar auf die von der Funktion gelieferte Höhe +addiert werden. +
    • +
    • Bei der Ermittlung des Arbeitsbereiches des Fensters, +muß die Höhe der Toolbar auf den von der Funktion gelieferten y-Wert +(couty) addiert werden. +
    • +
    + +

    Hinweis: Die Höhe der Toolbar sollte neben der Höhe +des eigentlichen Objektes den Platzbedarf für Spezialeffekte (3D, +Shadowing, etc.) beinhalten. +

    +

    Querverweis: WF_FTOOLBAR   WF_NTOOLBAR   WM_TOOLBAR   objc_sysvar +

    +

    8.2.9 AES-Bindings

    + +

    Das AES wird über ein einziges Unterprogramm aufgerufen, dem 6 +Parameter übergeben werden; es handelt sich dabei um Adressen +verschiedener Arrays, die zur Ein-/Ausgabe-Kommunikation benutzt +werden. Um eine AES-Funktion aufzurufen, muß der folgende +Parameterblock mit den Adressen der unten beschriebenen Arrays bestückt +werden: +

    + + +
    typedef struct
    +{
    +    int16_t *cb_pcontrol;  /* Zeiger auf control-Array */
    +    int16_t *cb_pglobal;   /* Zeiger auf global-Array  */
    +    int16_t *cb_pintin;    /* Zeiger auf int_in-Array  */
    +    int16_t *cb_pintout;   /* Zeiger auf int_out-Array */
    +    int16_t *cb_padrin;    /* Zeiger auf adr_in-Array  */
    +    int16_t *cb_padrout;   /* Zeiger auf adr_out-Array */
    +} AESPB;
    +
    +

    Die Adresse dieses Parameterblocks (der sich auf dem Stack +befindet), muß dann im Register d1 vermerkt, und zusätzlich Register +d0.w mit dem Wert 0xc8 (200) gefüllt werden. Durch einen TRAP #2 +Systemaufruf kann dann das AES direkt aufgerufen werden. Für den +Pure-Assembler könnte das z.B. so aussehen: +

    + +
                    .EXPORT aes         ; Funktion exportieren
    +                .CODE               ; Beginn des Code-Segments
    +
    +        aes:     MOVE.L 4(sp),D1    ; Adresse des Parameterblocks
    +                 MOVE.W #200,D0     ; Opcode des AES
    +                 TRAP   #2          ; GEM aufrufen
    +                 RTS                ; raus hier
    +
    +                .END                ; Ende des Moduls
    +
    +

    Darüber, welche Register verändert werden dürfen, gibt es +keine klaren Informationen. Tatsache ist jedoch, daß die +entsprechenden Routinen im ROM alle Register retten. +

    +

    Nun zu den einzelnen Arrays. Über jedes Feld können bestimmte +Ein- bzw. Ausgaben getätigt werden; es gilt: +

    + + + + + + + + + + + + + + + + + + + +
    int16_t control[5] Über dieses Feld werden Informationen über die aufgerufene +Funktion und ihre Parameter festgelegt. Es gilt: + + + + + + + + + + + + + + + +
    control[0] = Funktionsnummer +
    control[1] = Anzahl der Werte im int_in-Array +
    control[2] = Anzahl der Werte im int_out-Array +
    control[3] = Anzahl der Werte im addr_in-Array +
    control[4] = Anzahl der Werte im addr_out-Array + +
    + +
    Darüber, welche Informationen vor einem AES-Aufruf gesetzt +werden müssen, gibt es keine klaren Informationen. Nötig ist es auf +jeden Fall für die Elemente [0],[1] und [3]. Wenig sinnvoll erscheint +es für die Elemente [2] und [4] zu sein - schließlich wissen die +AES-Funktionen ja selbst, wie viele Werte sie in den Ausgabefeldern +zurückliefern. + + +
    int16_t global[15] Dieses Feld enthält globale Daten für die Applikation und +wird teils von appl_init, teils von anderen AES-Funktionen benutzt, +und automatisch gefüllt. Es gilt: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    global[0] Versionsnummer der AES + +
    global[1] Anzahl der Applikationen, die gleichzeitig laufen können. Bei +einem Wert von -1 gibt es keine Beschränkung. +
    global[2] Kennung (ID) der Applikation +
    global[3,4] Beliebige Information, die nur für die Applikation von +Bedeutung ist und von dieser gesetzt und gelesen werden kann. +
    global[5,6] Zeiger auf eine Liste von Zeigern auf die Objektbäume der +Applikation (wird von rsrc_load gesetzt). +
    global[7,8] Adresse des für die Resource-Datei reservierten Speichers. Nur +von Digital Research und nicht von Atari dokumentiert. +
    global[9] Länge des reservierten Speichers. Nur von Digital Research und +nicht von Atari dokumentiert. +
    global[10] Anzahl der Farbebenen. Nur von Digital Research und +nicht von Atari dokumentiert. +
    global[11,12] reserviert +
    global[13] Maximale Höhe eines Zeichens, die vom AES für den +vst_height-Aufruf benutzt wird. Dieser Eintrag ist erst ab +AES-Version 4.0, und auch nur von Atari dokumentiert. +
    Ab PC-GEM Version 2.0 wird dieser Wert als Bitvektor mit den auf +dem Desktop angemeldeten Laufwerken interpretiert (Bit-15 = +Laufwerk-A). +
    global[14] Minimale Höhe eines Zeichens, die vom AES für den +vst_height-Aufruf benutzt wird. Dieser Eintrag ist erst ab +AES-Version 4.0, und auch nur von Atari dokumentiert. +
    Ab PC-GEM Version 2.0 wird dieser Wert als Bitvektor +interpretiert, der angibt, welche der in global[13] angegebenen +Laufwerke als Festplatten betrachtet werden können. + +
    + + +
    int16_t int_in[16] Über dieses Feld werden alle 16-Bit großen Eingabeparameter +übergeben. + +
    int16_t int_out[10] Über dieses Feld liefert das AES alle 16-Bit großen +Rückgabewerte. + +
    int32_t addr_in[8] Dieses Feld dient zur Übermittlung von Zeigern (z.B. Zeiger +auf Zeichenketten) an AES Funktionen. + +
    int32_t addr_out[2] Über dieses Feld werden 32-Bit große Werte vom AES +zurückgeliefert. + +
    + +

    Achtung: Wenn das Betriebssystem Threads unterstützt, +muss unbedingt darauf geachtet werden, eine Multithread-sichere +Bibliothek zu verwenden. Insbesondere muss sichergestellt werden, daß +jeder Thread sein eigenes global-Feld (s.o) erhält. +

    +

    Querverweis: Beispiel-Binding   VDI-Bindings   TOS Liste +

    + +

    8.2.9.1 Beispiel-Binding für AES-Funktionen

    +

    Die Funktion 'crys_if' (Crystal Interface) sorgt für die +Besetzung des control-Arrays, und macht den eigentlichen AES-Aufruf. +Dazu bedient sie sich einer Tabelle, in der für jede einzelne +AES-Funktion die Werte für control[1], control[2] und control[3] +vermerkt sind. +

    + +
    AESPB c;
    +
    +int16_t crys_if (int16_t opcode)
    +{
    +  int16_t i, *paesb;
    +
    +  control[0] = opcode;
    +  paespb = &ctrl_cnts[ (opcode-10)*3 ];
    +
    +  for (i = 1; i < 4; i++)
    +    control[i] = *paespb++;
    +
    +  aes (c);
    +  return (int_out[0]);
    +
    +} /* crys_if */
    +
    +

    Die dabei verwendete Tabelle könnte beispielsweise +folgendermaßen aufgebaut sein: +

    +
    .GLOBAL ctrl_cnts
    +.DATA
    +
    +ctrl_cnts: .dc.b     0,  1,  0       ; appl_init
    +           .dc.b     2,  1,  1       ; appl_read
    +           .dc.b     2,  1,  1       ; appl_write
    +            ...
    +            ...
    +            ...
    +
    +.END
    +
    +

    Querverweis: AES-Bindings   GEM +

    +
    + +Home +AESAES +Das AESDas AES +ApplikationsfunktionenApplikationsfunktionen + + diff --git a/de/aes_main.html b/de/aes_main.html new file mode 100644 index 000000000..188c53e6f --- /dev/null +++ b/de/aes_main.html @@ -0,0 +1,63 @@ + + + + + +Die Anleitung zum TOS: AES + + + + + + + + + +Home +Inhaltsverzeichnis +VDI-StrukturenVDI-Strukturen +Das AESDas AES + +
    + +

    8 AES

    + +
    +
    + +Home +Inhaltsverzeichnis +VDI-StrukturenVDI-Strukturen +Das AESDas AES + + diff --git a/de/aes_structures.html b/de/aes_structures.html new file mode 100644 index 000000000..047abfeb3 --- /dev/null +++ b/de/aes_structures.html @@ -0,0 +1,2329 @@ + + + + + +Die Anleitung zum TOS: AES-Strukturen + + + + + + + + + +Home +AESAES +AES-FunktionslisteAES-Funktionsliste +XCONTROLXCONTROL + +
    + +

    8.27 AES-Strukturen

    + +
    +

    8.27.1 AESPB

    +
    typedef struct
    +{
    +    int16_t *cb_pcontrol;  /* Zeiger auf control-Array */
    +    int16_t *cb_pglobal;   /* Zeiger auf global-Array  */
    +    int16_t *cb_pintin;    /* Zeiger auf int_in-Array  */
    +    int16_t *cb_pintout;   /* Zeiger auf int_out-Array */
    +    int16_t *cb_padrin;    /* Zeiger auf adr_in-Array  */
    +    int16_t *cb_padrout;   /* Zeiger auf adr_out-Array */
    +} AESPB;
    +
    +

    8.27.2 ANI_MOUSE

    +

    Describes (animated) mouse shape +

    +
    typedef struct
    +{
    +   int16_t frames;      /* Number of frames in shape          */
    +   int16_t delay;       /* 50Hz tics to pause between frames  */
    +   MFORM form[32];      /* List of mouse forms                */
    +} ANI_MOUSE;
    +
    +

    Querverweis: graf_mouse +

    +

    8.27.3 APPFLAGS

    +

    Describes application flags +

    +
    typedef struct
    +{
    +  unit8_t name[13];       /* Filename pattern to use these flags       */
    +  unit8_t desc[17];       /* User-defined description of flags         */
    +  APFLG flags;            /* Execution flags                           */
    +  KEYCODE open_key;       /* Open application when this key is pressed */
    +  KEYCODE reserve_key[3]; /* Application uses these keys, so don't let */
    +                          /* Geneva process them                       */
    +} APPFLAGS;
    +
    +

    Querverweis: x_appl_flags   APFLG   KEYCODE +

    +

    8.27.4 APFLG

    +

    Application bit flags +

    +
    typedef union
    +{
    +   struct
    +   {
    +     unsigned multitask    :1;  /* 1: Multitasking                       */
    +     unsigned special_types:1;  /* 1: Use extended object types          */
    +     unsigned round_buttons:1;  /* 1: Use rounded EXIT buttons           */
    +     unsigned kbd_equivs   :1;  /* 1: Use auto keyboard equivs           */
    +     unsigned undo_equivs  :1;  /* 1: Undraw when form_do exits          */
    +     unsigned off_left     :1;  /* 1: Allow windows off left edge        */
    +     unsigned exit_redraw  :1;  /* 1: Redraw everything at quit          */
    +     unsigned AES40_msgs   :1;  /* 1: New messages for AES 4.0 OK        */
    +     unsigned limit_handles:1;  /* 1: Limit window handles to 1-7        */
    +     unsigned limit_memory :1;  /* 1: Limit Malloc's                     */
    +     unsigned keep_deskmenu:1;  /* 1: Keep desktop/menu bar              */
    +     unsigned clear_memory :1;  /* 1: Clear Malloc'd memory              */
    +     unsigned maximize_wind:1;  /* 1: Omit unnecessary gadgets           */
    +     unsigned optim_redraws:1;  /* 1: Optimize window redraws (rel 004)  */
    +     unsigned unused       :2;  /* Reserved for future use               */
    +     unsigned mem_limit    :16; /* Kb to limit memory allocation         */
    +   } s;
    +   unit32_t l;                  /* longword to access all bits           */
    +} APFLG;
    +
    +

    The multitask and limit_handles flags must not +be changed for a process which is already in memory. +

    +

    optim_redraws is present since release 004. +

    +

    Querverweis: x_appl_flags   APPFLAGS +

    +

    8.27.5 APPLRECORD

    +

    Diese Struktur ist wie folgt definiert: +

    +
    typedef struct
    +{
    +    int32_t type;      /* Art des Ereignisses */
    +    int32_t what;      /* genaue Beschreibung des Ereignisses */
    +} APPLRECORD
    +
    +

    Für die Komponenten gilt dabei: +

    + + + + + + + + + + + + + + + + + + +
    type Bedeutung what +
        +
    0   Timer-Event Anzahl von 20-Millisekunden Ticks +
    1   Button-Event Status der Maustaste (High-Word), und zwar: 0 = nicht +gedrückt, 1 = gedrückt: + + + + + + +
    Linke Maustaste: 0x0001 +
    Rechte Maustaste: 0x0002 + +
    + +
    Das (low-WORD) enthält die Anzahl der Clicks. +
    2   Maus-Event X-Koordinate (High-Word), Y-Koordinate (Low-Word). +
    3   Tastatur-Event + + + + + + + + + +
    Bits 24-31 Scan-Code +
    Bits 16-23 ASCII Code +
    Low-Word Zustand der Umschaltasten (0 = nicht gedrückt, 1 = gedrückt): + + + + + + + + + + + + +
    Shift-Rechts: 0x0001 +
    Shift-Links: 0x0002 +
    Control: 0x0004 +
    Alternate: 0x0008 + +
    + + +
    + + +
    + +

    Hinweis: Unter PC-GEM belegt jedes Ereignis nur 6 Bytes, +da die Komponente type von APPLRECORD dort als int16_t +definiert ist. +

    +

    Querverweis: appl_tplay   appl_trecord +

    +

    8.27.6 Die Bit-Block-Struktur

    + +

    Ein Bit-Image kann immer dort eingesetzt werden, wo ein nicht +anwählbares Icon stehen könnte; der entscheidende Unterschied ist +nämlich, daß es zu einem Bit-Image keine Maske gibt. +

    +
    typedef struct
    +{
    +  int16_t  *bi_pdata;     /* Zeiger auf die Grafikdaten    */
    +  int16_t  bi_wb;         /* Breite des Bildes in Bytes    */
    +  int16_t  bi_hl;         /* Höhe in Zeilen                */
    +  int16_t  bi_x;          /* x-Position                    */
    +  int16_t  bi_y;          /* y-Position                    */
    +  int16_t  bi_color;      /* Farbe                         */
    +} BITBLK;
    +
    +

    Hinweis: Die Breite eines Bit-Images (Komponente +bi_wb) muß stets durch 2 teilbar sein. +

    +

    Querverweis: OBJECT   Objektarten des AES +

    +

    8.27.7 CICON

    +

    Diese Struktur ist wie folgt definiert: +

    +
    typedef struct cicon_data
    +{
    +  int16_t num_planes;   /* Anzahl der Planes für die folgenden Daten */
    +  int16_t *col_data;    /* Zeiger auf Farb-Bitmap in Standardform    */
    +  int16_t *col_mask;    /* Zeiger auf einzelne Farb-Plane Maske      */
    +  int16_t *sel_data;    /* Zeiger auf Farb-Bitmap des selekt. Icons  */
    +  int16_t *sel_mask;    /* Zeiger auf einzelne Plane-Maske des Icons */
    +  struct cicon_data *next_res; /* Zeiger auf Icon anderer Auflösung */
    +} CICON;
    +
    +

    Querverweis: CICONBLK   ICONBLK   OBJECT +

    +

    8.27.8 CICONBLK

    +

    Diese Struktur ist wie folgt definiert: +

    +
    typedef struct cicon_blk
    +{
    +   ICONBLK monoblk;    /* Default: monochrome Icons */
    +   CICON   *mainlist;  /* Farb-Icons für verschiedene Auflösungen */
    +} CICONBLK;
    +
    +

    Querverweis: OBJECT   Objektstruktur im AES +

    +

    8.27.9 CLRCAT

    +
    typedef struct clrcat
    +{
    +  int16_t cc_foreground     /* Foreground colour    */
    +  int16_t cc_background     /* Background colour    */
    +  int16_t cc_style          /* Fill style           */
    +  int16_t cc_pattern        /* Fill pattern         */
    +} CLRCAT;
    +
    +

    The CLRCAT is used internally by ViewMAX/2 and later to store +the colour categories. +

    +

    Querverweise: X_BUF_V2 +

    +

    8.27.10 DIALOG

    +
    typedef void *DIALOG;
    +
    +

    8.27.11 DITHER_MODE

    +
    typedef struct _dither_mode
    +{
    +   struct _dither_mode  *next;    /* Zeiger auf Nachfolger     */
    +   int32_t       length;          /* Strukturlänge             */
    +   int32_t       format;          /* Datenformat               */
    +   int32_t       reserved;        /* reserviert                */
    +   int32_t       dither_id;       /* Kennung                   */
    +   int32_t       color_modes;     /* unterstützte Farbtiefen   */
    +   int32_t       reserved1;       /* reserviert                */
    +   int32_t       reserved2;       /* reserviert                */
    +   int8_t        name[32];        /* Name des Rasterverfahrens */
    +} DITHER_MODE;
    +
    +

    Querverweis: Druckdialoge   pdlg_add_printers +

    +

    8.27.12 DRV_ENTRY

    +
    typedef struct _drv_entry
    +{
    +   struct _drv_entry *next; /* Zeiger auf Nachfolger */
    +} DRV_ENTRY;
    +
    +

    8.27.13 DRV_INFO

    +
    typedef struct
    +{
    +   int32_t     magic;           /* 'pdnf'                           */
    +   int32_t     length;          /* Strukturlänge                    */
    +   int32_t     format;          /* Datenformat                      */
    +   int32_t     reserved;        /* reserviert                       */
    +   int16_t     driver_id;       /* Treibernummer fürs VDI           */
    +   int16_t     driver_type;     /* Treibertyp                       */
    +   int32_t     reserved1;       /* reserviert                       */
    +   int32_t     reserved2;       /* reserviert                       */
    +   int32_t     reserved3;       /* reserviert                       */
    +   PRN_ENTRY   *printers;       /* zum Treiber gehörenden Drucker   */
    +   DITHER_MODE *dither_modes;   /* unterstützte Rasterverfahren     */
    +   int32_t     reserved4;       /* reserviert                       */
    +   int32_t     reserved5;       /* reserviert                       */
    +   int32_t     reserved6;       /* reserviert                       */
    +   int32_t     reserved7;       /* reserviert                       */
    +   int32_t     reserved8;       /* reserviert                       */
    +   int32_t     reserved9;       /* reserviert                       */
    +   int8_t      device[128];     /* Ausgabedatei des Druckertreibers */
    +} DRV_INFO;
    +
    +

    Querverweis: Druckdialoge   pdlg_add_printers +

    +

    8.27.14 EVNT

    +
    typedef struct
    +{
    +    int16_t mwhich;         /* Art der Ereignisse                */
    +    int16_t mx;             /* x-Koordinate des Mauszeigers      */
    +    int16_t my;             /* y-Koordinate des Mauszeigers      */
    +    int16_t mbutton;        /* gedrückte Maustaste               */
    +    int16_t kstate;         /* Status der Sondertasten (kbshift) */
    +    int16_t key;            /* Scancode der gedrückten Taste     */
    +    int16_t mclicks;        /* Anzahl der Mausklicks             */
    +    int16_t reserved[9];    /* reserviert                        */
    +    int16_t msg[16];        /* Message-Buffer                    */
    +} EVNT;
    +
    +

    Querverweis: fnts_evnt   fslx_evnt   wdlg_evnt +

    +

    8.27.15 FNTS_ITEM

    +
    typedef struct _fnts_item
    +{
    +  /* Zeiger auf den nächsten Font oder 0L */
    +  struct   _fnts_item  *next;
    +  /* Anzeige-Funktion für eigene Fonts */
    +  UTXT_FN  display;
    +  /* ID des Fonts */
    +  int32_t  id;
    +  /* muß 0 sein, da kein VDI-Font */
    +  int16_t  index;
    +  /* Flag für äquidistante Fonts */
    +  int8_t   mono;
    +  /* Flag für Vektorfont */
    +  int8_t   outline;
    +  /* Anzahl der vordefinierten Punkthöhen */
    +  int16_t  npts;
    +  /* Zeiger auf den vollständigen Namen */
    +  int8_t   *full_name;
    +  /* Zeiger auf den Familiennamen */
    +  int8_t   *family_name;
    +  /* Zeiger auf den Stilnamen */
    +  int8_t   *style_name;
    +  /* Zeiger auf Feld mit Punkthöhen */
    +  int8_t   *pts;
    +  /* reserviert, müssen 0 sein */
    +  int32_t  reserved[4];
    +} FNTS_ITEM;
    +
    +

    Querverweis: fnts_add   Zeichensatzauswahl +

    +

    8.27.16 FNT_DIALOG

    +
    typedef void *FNT_DIALOG;
    +
    +

    8.27.17 G_VECTORS

    + +
    typedef struct G_vectors        /* Release 004 */
    +{
    +  int16_t used;
    +  int16_t (*keypress)( int32_t *key );
    +  int16_t (*app_switch)( int8_t *process_name, int16_t apid );
    +  int16_t (*gen_event)(void);
    +} G_VECTORS;
    +
    + + + + + + + + + + + + + + + +
    used: A bitmap of which vectors in the rest of the structure are used +by this version of Geneva. Currently this is 7, to indicate that the +first 3 vectors are used. +
      +
    keypress: This function is called whenever Geneva receives a key from the +keyboard. The A0 register points to a longword containing the keycode +of the key which was pressed: +
      +
    bits 31-24 23-16 15-8 7-0 +
    shift scan code unused ASCII +
      +
    This is just like the result of Bconin(2) with the result of +Kbshift(-1) stored in the high byte. +
      +
    If the keypress function changes this longword to 0L, +then the keypress will be ignored. If the longword is changed to some +other value, then the new value will be processed. +
      +
    If the keypress function returns a value >= 0, then +the application with that ID will receive a X_WM_VECKEY message during +its next event loop. +
      +
    app_switch: This function is called whenever the user performs some action +that causes the topmost application to change, like selecting a name +from the Desk menu or topping another application's window. +
      +
    When called, the A0 register points to a string in appl_find +format which is the name of the process that was switched to. The D0 +register contains the application ID of the process. +
      +
    Under some circumstances, this function may be called even +though the "new" application is already the topmost one. It +is also possible for the "apid" in D0 to be -1, if Geneva is +in the process of shutting down. +
      +
    If the app_switch function returns a value >= 0, then +the application with that ID will receive a X_WM_VECSW message during +its next event loop. +
      +
    gen_event: This function is called continually by Geneva. It provides a +way for an application to have Geneva poll a certain condition and +generate an event if something occurs. +
      +
    This can take the place of using evnt_multi with small timer +values in order to poll a condition, and is much more efficient. It +can be used in things like a corner clock to see when the time has +changed to a new minute. +
      +
    If the gen_event function returns a value >= 0, then +the application with that ID will receive a X_WM_VECEVNT message +during its next event loop. +
      + +
    + +

    Notes about using vectors: +

    +
      +
    • A vector routine can change registers D0-D2/A0-A1. All others +must be preserved. +
        +

    • +
    • No vector routine can call the AES. The keypress and app_switch +vectors must not call GEMDOS functions. All other TOS services can be +used. +
        +

    • +
    • If a vector does not wish to generate an event, then it must +return a negative number, like -1. +
        +

    • +
    • A vector MUST follow the XBRA protocol. The only exception to +this is Geneva itself, which installs default vectors that do nothing +but return -1. +
        +

    • +
    • An application is responsible for removing itself from the +vector chain when it terminates. Failure to do so will most likely +cause a crash in the future. An application should use shel_write mode +9 to tell Geneva that it knows about the AP_TERM message and respond +to that message by removing itself from the list before quitting. +
        +

    • +
    • If your vector routine does not wish to generate an event, then +it should pass control through to the previous routine in the XBRA +chain. +
        +

    • +
    • If Geneva is running without MiNT, then the vector routines are +always called in supervisor mode. If running with MiNT, then the CPU +is in user mode. When MiNT is in memory protection mode, an +application which uses vectors must at least be in Readable mode, and +should most likely in Global mode. +
        +

    • +
    + +

    See the files VECTEST.C and VECTESTS.S for an example. +

    +

    Querverweis: Cookie, Gnva +

    +

    8.27.18 HNDL_OBJ

    +
    typedef int16_t (cdecl *HNDL_OBJ) ( void *dialog, EVNT *events,
    +                                 int16_t obj,
    +                                 int16_t clicks, void *data );
    +
    +

    Dabei gilt: +

    + + + + + + + + + + + + + + + + + + +
    Parameter Bedeutung +
    dialog Zeiger auf eine Dialogstruktur. Auf diese sollte nicht direkt, +sondern nur mit Hilfe der wdlg_xxx Funktionen zugegriffen werden. +
    events Zeiger auf die EVNT-Strukur, die bei wdlg_evnt übergeben wurde +(falls der Parameter obj >= 0 ist), oder NULL. +
    obj + + + + + + +
    >=0: Objektnummer +
    <0: Funktionsnummer: +
     -1 = HNDL_INIT    // Dialog initialisieren
    + -2 = HNDL_MESG    //
    + -3 = HNDL_CLSD    // Dialogfenster wurde geschlossen
    + -5 = HNDL_OPEN    // Dialog-Initialisierung abschließen
    + -6 = HNDL_EDIT    // Zeichen für ein Editfeld prüfen
    + -7 = HNDL_EDDN    // Zeichen wurde ins Editfeld gesetzt
    + -8 = HNDL_EDCH    // Editfeld wurde gewechselt
    + -9 = HNDL_MOVE    // Dialog wurde verschoben
    +-10 = HNDL_TOPW    // Dialogfenster kam nach oben
    +-11 = HNDL_UNTP    // Dialogfenster ist nicht aktiv
    +
    + +
    + +
    Von diesen Funktionsnummern muß nur auf HNDL_CLSD reagiert +werden; alle anderen Ereignisse können je nach Bedarf beachtet +werden. +
    clicks Anzahl der Mausklicks, falls es sich bei obj um eine +Objektnummer handelt. +
    data Falls der Parameter obj eine positive Objektnummer ist, +wird hier die Variable user_data aus der Funktion wdlg_create +übergeben. Anderenfalls ist der Wert von der entsprechenden +Funktionsnummer abhängig. + +
    + +

    Hinweis: Die Funktion wird aufgerufen, wenn auf ein +EXIT- oder TOUCHEXIT Objekt geklickt wurde (in diesem Fall ist +obj eine positive Objektnummer) oder wenn ein den Dialog +betreffendes Ereignis eingetreten ist (dann ist obj negativ +und enthält eine entsprechende Funktionsnummer (s.o.)). +

    +

    Die Parameter werden über den Stack übergeben und die Routine +darf die Register d0-d2/a0-a2 verändern. Falls die Funktion mit einer +unbekannten Funktionsnummer in obj aufgerufen wird oder eine +der obigen Funktionsnummern ignoriert werden soll, muß der Wert 1 +zurückgeliefert werden. +

    +

    Querverweis: Beispiel-Implementation   wdlg_create +

    +

    8.27.18.1 Beispiel zu HNDL_OBJ

    +
    /* Der folgende Code ist ein Beispiel für eine Implementation
    +   der handle_exit Funktion, wie sie z.B. als Parameter bei
    +   wdlg_create vorkommt. */
    +
    +int16_t cdecl handle_exit ( void *dialog, EVNT *events, int16_t obj,
    +                         int16_t clicks, void *data )
    +{
    +    /*
    +     * Ereignis oder Objektnummer?
    +     * Alle Ereignisse außer HNDL_CLSD werden bei diesem Beispiel
    +     * ignoriert
    +     */
    +
    +    if ( obj < 0 )
    +    {
    +        if ( obj == HNDL_CLSD )     /* Closer betätigt? */
    +            return( 0 );            /* beenden */
    +        if ( obj == HNDL_EDIT )
    +        {
    +            /*  In Fensterdialogen kann es nützlich sein, Tasten-
    +                kombinationen mit Control in Eingabefeldern zu igno-
    +                rieren, damit Shortcuts wie z.B. Ctrl-U, Ctrl-W oder
    +                Ctrl-Q in der Eventschleife des Programms abgearbei-
    +                tet werden können. In diesem Fall sollte nach HNDL_EDIT
    +                eine 0 zurückgeliefert werden, damit die Taste nicht
    +                von objc_edit bearbeitet wird.
    +            */
    +        }
    +    }
    +    else
    +    {                         /* ein Objekt ist angewählt worden  */
    +        switch ( obj )        /* Aktionen einleiten (falls nötig) */
    +        {
    +            case ...
    +              .
    +              .
    +              .
    +            case MY_EXIT_OBJECT:    ..... return( 0 );  /* beenden */
    +        }
    +    }
    +    return( 1 ); /* weitermachen */
    +}
    +
    +

    8.27.18.2 HNDL_INIT

    +

    data ist die bei wdlg_init übergebene Variable. +Falls handle_exit den Wert 0 zurückliefert, legt wdlg_create +keine Dialog-Struktur an (Fehler). Die Variable code wird in +clicks übergeben. +

    +

    Querweise: HNDL_OBJ   wdlg_create +

    +

    8.27.18.3 HNDL_MESG

    +

    data ist user_data. Falls handle_exit den Wert 0 +zurückliefert, wird der Dialog geschlossen - wdlg_evnt +liefert den Wert 0 zurück. events zeigt auf die bei wdlg_evnt +übergebene EVNT-Struktur. +

    +

    Hinweis: Dieser Code wird nur dann übergeben, wenn ein +Nachrichtencode zwischen 20 und 39 empfangen wurde, der nicht mit den +anderen Opcodes bearbeitet wird. Er wird z.B. für die Ikonifizierung +benötigt. +

    +

    Achtung: Dieser Opcode wird erst seit der MagiC Version +4.50 vom 18.04.96 unterstützt. +

    +

    Querweise: HNDL_OBJ   wdlg_create +

    +

    8.27.18.4 HNDL_OPEN

    +

    data ist die bei wdlg_open übergebene Variable. +Die Variable code wird in clicks übergeben. +

    +

    Querweise: HNDL_OBJ   wdlg_create +

    +

    8.27.18.5 HNDL_CLSD

    +

    data ist user_data. Falls handle_exit den Wert 0 +zurückliefert, wird der Dialog geschlossen - wdlg_evnt +liefert den Wert 0 zurück. +

    +

    events zeigt auf die bei wdlg_evnt überg. +EVNT-Struktur. +

    +

    Querweise: HNDL_OBJ   wdlg_create +

    +

    8.27.18.6 HNDL_MOVE

    +

    data ist user_data. Falls handle_exit den Wert 0 +zurückliefert, wird der Dialog geschlossen - wdlg_evnt +liefert den Wert 0 zurück. +

    +

    events zeigt auf die bei wdlg_evnt überg. +EVNT-Struktur. +

    +

    Querweise: HNDL_OBJ   wdlg_create +

    +

    8.27.18.7 HNDL_TOPW

    +

    data ist user_data. Falls handle_exit den Wert 0 +zurückliefert, wird der Dialog geschlossen - wdlg_evnt +liefert den Wert 0 zurück. +

    +

    events zeigt auf die bei wdlg_evnt überg. +EVNT-Struktur. +

    +

    Querweise: HNDL_OBJ   wdlg_create +

    +

    8.27.18.8 HNDL_UNTP

    +

    data ist user_data. Falls handle_exit den Wert 0 +zurückliefert, wird der Dialog geschlossen - wdlg_evnt +liefert den Wert 0 zurück. +

    +

    events zeigt auf die bei wdlg_evnt überg. +EVNT-Struktur. +

    +

    Querweise: HNDL_OBJ   wdlg_create +

    +

    8.27.18.9 HNDL_EDIT

    +

    data zeigt auf ein Wort mit dem Tastencode. Falls +handle_exit den Wert 1 zurückliefert, wird der Tastendruck +verarbeitet, bei 0 ignoriert. +

    +

    events zeigt auf die bei wdlg_evnt überg. +EVNT-Struktur. +

    +

    Querweise: HNDL_OBJ   wdlg_create +

    +

    8.27.18.10 HNDL_EDDN

    +

    data zeigt auf ein Wort mit dem Tastencode. +events zeigt auf die bei wdlg_evnt überg. +EVNT-Struktur. +

    +

    Querweise: HNDL_OBJ   wdlg_create +

    +

    8.27.18.11 HNDL_EDCH

    +

    data zeigt auf ein Wort mit der Objektnummer des neuen +Edit-Felds. +

    +

    Querweise: HNDL_OBJ   wdlg_create +

    +

    8.27.19 ICONBLK

    +
    typedef struct
    +{
    +  uint16_t  *ib_pmask;    /* Zeiger auf die Icon-Maske     */
    +  uint16_t  *ib_pdata;    /* Zeiger auf das Icon-Bild      */
    +  int8_t    *ib_ptext;    /* Zeiger auf den Icon-Text      */
    +  uint16_t  ib_char;      /* Zeichen das im Icon erschei-
    +                             nen soll, sowie Vorder- und
    +                             Hintergrundfarbe des Icons    */
    +  uint16_t  ib_xchar;     /* x-Koordinate des Buchstabens  */
    +  uint16_t  ib_ychar;     /* y-Koordinate des Buchstabens  */
    +  uint16_t  ib_xicon;     /* x-Koordinate des Icons        */
    +  uint16_t  ib_yicon;     /* y-Koordinate des Icons        */
    +  uint16_t  ib_wicon;     /* Breite des Icons              */
    +  uint16_t  ib_hicon;     /* Höhe des Icons                */
    +  int16_t   ib_xtext;     /* x-Koordinate des Textes       */
    +  int16_t   ib_ytext;     /* y-Koordinate des Textes       */
    +  uint16_t  ib_wtext;     /* Breite des Textes             */
    +  uint16_t  ib_htext;     /* Höhe des Textes               */
    +  uint16_t  ib_resvd;     /* reserviert                    */
    +} ICONBLK;
    +
    +

    Hinweise zu einzelnen Komponenten: +

    +
      +
    • ib_pmask: Zeiger auf ein Feld von 16-Bit-Werten, in +denen das Bit-Image der Icon-Maske abgelegt ist. Die Icon-Maske legt +fest, an welchen Stellen das Icon überhaupt gezeichnet werden soll +und welche Pixel transparent bleiben sollen. Erzielt wird dieser +Effekt dadurch, daß der Iconhintergrund zunächst mit den Bits der +Maske 'undiert' und dann mit den Icondaten 'geodert' wird. +
        +

    • +
    • ib_char: +
        +

      +

      + + + + + + + + + + + + + + + + +
      BitsBedeutung
      15..12Vordergrundfarbe des Icons
      11..08Hintergrundfarbe des Icons
       7.. 0Zeichen das im Icon erscheinen soll
      +
      + +

    • +
    • ib_resvd: unbenutzt, wird allerdings von den meisten +RCS-Programmen beim Schreiben in die Resourcedatei aufgenommen. +
        +

    • +
    + +

    Für Farbicon unter PC GEM gilt: +
    In a colour icon, ib_pdata and ib_pmask point to MFDB objects. +Otherwise, they point to the lines of the bitmap. +

    +

    Querverweis: CICONBLK   OBJECT +

    +

    8.27.20 KEYCODE

    +

    Keypress description +

    +
    typedef struct
    +{
    +  uint8_t shift;        /* bit 0: Right Shift key held */
    +                        /* bit 1: Left Shift key held  */
    +                        /* bit 2: Control key held     */
    +                        /* bit 3: Alternate key held   */
    +  uint8_t scan;         /* Scan code or zero           */
    +  uint8_t ascii;        /* ASCII value or zero         */
    +} KEYCODE;
    +
    +

    ascii is compared first with the ASCII value of the key +which was pressed. If this fails, the scan code is compared. +Currently, the key will match if either bit 0 or bit 1 of +"shift" is set, and either [Shift] key is held by the user. +

    +

    Querverweis: x_appl_flags   APPFLAGS   x_settings   SETTINGS +

    +

    8.27.21 LBOX_ITEM

    +
    typedef struct _lbox_item
    +{
    +   struct _lbox_item *next;  /* Zeiger auf den nächsten Eintrag */
    +                             /* in der Scroll-Liste             */
    +   int16_t  selected;        /* Objekt selektiert?              */
    +   int16_t  data1;           /* Daten für das Programm          */
    +   void     *data2;
    +   void     *data3;
    +} LBOX_ITEM;
    +
    +

    Hinweis: Die Struktur kann aber, wenn bei den Aufrufen +entsprechend gecastet wird, durchaus wie das folgende Beispiel +aussehen: +

    +
    typedef struct
    +{
    +   void     *next;
    +   int16_t   selected;
    +
    +   ... ab hier nach Belieben der Applikation...
    +} LB_EXAMPLE;
    +
    +

    Es ist lediglich darauf zu achten, daß als erstes Element ein +Zeiger auf den Nachfolger, und als zweites Element ein Wort das +angibt, ob der entsprechende Eintrag selektiert ist, vorhanden ist. +

    +

    Querverweis: +
    lbox_create   lbox_free_list   lbox_get_idx   lbox_get_item   +lbox_get_items +

    +

    8.27.22 LIST_BOX

    +
    typedef void *LIST_BOX;
    +
    +

    8.27.23 MEDIA_SIZE

    +

    Diese Struktur dient der Beschreibung eines Papierformates, und +ist wie folgt definiert: +

    +
    typedef struct _media_size
    +{
    +   struct _media_size *next;   /* Zeiger auf Nachfolger     */
    +   int32_t       size_id;      /* Kennung des Papierformats */
    +   int8_t        name[32];     /* Name des Papierformats    */
    +} MEDIA_SIZE;
    +
    +

    Querverweis: Druckdialoge   pdlg_add_printers +

    +

    8.27.24 MEDIA_TYPE

    +

    Diese Struktur dient der Beschreibung eines Papiertyps bzw. +Druckmediums, und ist wie folgt definiert: +

    +
    typedef struct _media_type
    +{
    +   struct _media_type   *next;    /* Zeiger auf Nachfolger     */
    +   int32_t              type_id;  /* Kennung des Papierformats */
    +   int8_t               name[32]; /* Name des Papierformats    */
    +} MEDIA_TYPE;
    +
    +

    Querverweis: Druckdialoge   pdlg_add_printers +

    +

    8.27.25 MENU

    +
    typedef struct
    +{
    +    OBJECT  *mn_tree;    /* Adresse des Menü-Objektbaumes  */
    +    int16_t mn_menu;     /* Index des Parent-Objektes      */
    +    int16_t mn_item;     /* Anfangs-Menüeintrag (bestimmt  */
    +                         /* die Position des Menüs         */
    +    int16_t mn_scroll;   /* 0 = nicht scrollen             */
    +                         /* >0 = scrollen (ohne scrollbar) */
    +                         /* -1 = scrollen (mit scrollbar)  */
    +                         /*     (AES >= 4.1)               */
    +    int16_t mn_keystate; /* Tastaturstatus (Shift, Control */
    +                         /* bzw. Alternate)                */
    +} MENU;
    +
    +

    Querverweis: AES   menu_attach   menu_popup +

    +

    8.27.26 MFORM

    +

    Die Struktur MFORM legt das Aussehen des Mauszeigers fest, und +ist wie folgt definiert: +

    +
    typedef struct mfstr
    +{
    +    int16_t  mf_xhot;       /* X-Pos. Aktionspunkt */
    +    int16_t  mf_yhot;       /* Y-Pos. Aktionspunkt */
    +    int16_t  mf_nplanes;    /* Anzahl der Planes   */
    +    int16_t  mf_fg;         /* Maskenfarbe         */
    +    int16_t  mf_bg;         /* Zeigerfarbe         */
    +    int16_t  mf_mask[16];   /* Maskenform          */
    +    int16_t  mf_data[16];   /* Zeigerform          */
    +} MFORM;
    +
    +

    Querverweis: AES   graf_mouse +

    +

    8.27.27 MN_SET

    +
    typedef struct
    +{
    +    int32_t display;    /* Anzeigeverzögerung              */
    +    int32_t drag;       /* Auswahlverzögerung              */
    +    int32_t delay;      /* Einfachklick Scroll-Verzögerung */
    +    int32_t speed;      /* Scroll-Verzögerung              */
    +    int16_t height;     /* Scroll-Höhe (Anzahl der darzu-  */
    +                        /* stellenden Einträge)            */
    +} MN_SET;
    +
    +

    Alle Verzögerungszeiten werden in Millisekunden gemessen. +

    +

    Querverweis: AES   menu_settings +

    +

    8.27.28 OBJECT

    +
    typedef struct
    +{
    +   int16_t    ob_next;   /* das nächste Objekt            */
    +   int16_t    ob_head;   /* erstes Kind                   */
    +   int16_t    ob_tail;   /* letztes Kind                  */
    +   uint16_t   ob_type;   /* Objektart                     */
    +   uint16_t   ob_flags;  /* Manipulationsflags            */
    +   uint16_t   ob_state;  /* Objektstatus                  */
    +   void       *ob_spec;  /* mehr unter Objektart          */
    +   int16_t    ob_x;      /* x-Koordinate des Objekts      */
    +   int16_t    ob_y;      /* y-Koordinate des Objekts      */
    +   int16_t    ob_width;  /* Breite des Objekts            */
    +   int16_t    ob_height; /* Höhe des Objekts              */
    +} OBJECT;
    +
    + + + + + + + + + + + + + + + + + + +
    ob_next: Nummer des folgenden Objekts gleicher Ebene oder -falls es das +letzte Element in der Ebene ist - des Parent-Objekts. +
    ob_head: Nummer des erstes Kind des Objekts, falls keines -1 +
    ob_next: Nummer des letzen Kind des Objekts, falls keines -1 +
    ob_type: Objektarten des AES +
    ob_flags: Objektflags des AES +
    ob_state: Objektstati des AES + +
    + +

    Querverweis: Objektstruktur im AES +

    +

    8.27.29 OB_PREFER

    +

    Extended object description +

    +
    typedef union
    +{
    +  struct                       /* Bitmapped flags                   */
    +  {
    +    unsigned outlined   :1;    /* Object is OUTLINED                */
    +    unsigned shadowed   :1;    /* Object is SHADOWED                */
    +    unsigned draw_3D    :1;    /* Object is draw in 3D              */
    +    unsigned rounded    :1;    /* Object has round corners          */
    +    unsigned atari_3D   :1;    /* Display the object using Atari                */
    +                                                                                                                 /* AES 4 style 3D                    */
    +    unsigned shadow_text:1;    /* Draw the text with a shadow                           */
    +                                                                                                                         /* underneath it                     */
    +    unsigned bold_shadow:1;    /* Text is bold (can be combined                 */
    +                                                                                                                         /* with shadow_text)                 */
    +    unsigned reserved   :9;    /* Reserved for future use           */
    +    unsigned framecol   :4;    /* Color of frame                    */
    +    unsigned textcol    :4;    /* Color of text                     */
    +    unsigned textmode   :1;    /* 0: transparent, 1: replace        */
    +    unsigned fillpattern:3;    /* Fill pattern index                */
    +    unsigned interiorcol:4;    /* Color of interior                 */
    +  } s;
    +  uint32_t l;                  /* Longword for accessing all flags  */
    +} OB_PREFER;
    +
    +

    atari_3D, shadow_text and bold_shadow +present since Release 004. +

    +

    Querverweis: x_appl_flags   APPFLAGS   x_settings   SETTINGS +

    +

    8.27.30 PARMBLK

    +
    typedef struct
    +{
    +   OBJECT   *pb_tree;        /* Zeiger auf den Objektbaum        */
    +   int16_t  pb_obj;          /* Nummer des Objekts               */
    +   int16_t  pb_prevstate;    /* vorheriger Objektstatus          */
    +   int16_t  pb_currstate;    /* neuer Objektstatus               */
    +   int16_t  pb_x;            /* x-Position des Objektes          */
    +   int16_t  pb_y;            /* y-Position des Objektes          */
    +   int16_t  pb_w;            /* Breite des Objektes              */
    +   int16_t  pb_h;            /* Höhe des Objektes                */
    +   int16_t  pb_xc;           /* x-Position des Clipping-Bereichs */
    +   int16_t  pb_yc;           /* y-Position des Clipping-Bereichs */
    +   int16_t  pb_wc;           /* Breite des Clipping-Bereichs     */
    +   int16_t  pb_hc;           /* Höhe des Clipping-Bereichs       */
    +   int32_t  pb_parm;         /* Parameter der USERBLK-Struktur   */
    +} PARMBLK;
    +
    +

    Hinweis: Das Objekt muß nur neu gezeichnet werden, wenn +alter und neuer Status identisch sind; anderenfalls reicht ein +'Update' des Objektbaums aus. Ferner sollten folgende Punkte beachtet +werden: +

    +
      +
    • die eigene Funktion muß im Datenregister d0 dem AES +zurückliefern, welche Aspekte des Objektstatus noch aktualisiert +werden müssen. Damit ist es nicht unbedingt nötig, in der eigenen +Ausgabefunktion den Code zum invertieren des Objektes +auszuprogrammieren. Im allgemeinen wird man einige Bits des +Objektstatus selbst bearbeiten wollen, und andere dem AES +überlassen. +
        +

    • +
    • die Funktion erhält den PARMBLK-Zeiger auf dem Stack, und muß +daher in Pure-C als 'cdecl' deklariert werden. +
        +

    • +
    • ein vollständiges Neuzeichnen des Objektes ist nur dann +nötig, wenn die Komponenten pb_prevstate und +pb_currstate gleich sind; anderenfalls hat sich nur der +Objektstatus geändert (zum Beispiel durch Anklicken). +
        +

    • +
    • die eigene Funktion wird de facto als Unterprogramm der AES +ausgeführt. Daher sollte man im Hinblick auf die Stackbenutzung +vorsichtig sein. Außerdem darf man natürlich keine weiteren +AES-Aufrufe machen, da das AES nicht re-entrant ist. +Aufrufe der VDI-Eingabefunktionen sind hingegen an dieser Stelle +erlaubt. +
        +

    • +
    • die Komponente pb_parm dient dazu, der eigenen Funktion +weitere Informationen (wie etwa einen Zeiger auf einen String) mit auf +den Weg zu geben. +
        +

    • +
    • man sollte sich nie zu weit von der ursprünglichen Optik von +GEM entfernen. Abgerundete Rechtecke oder kursive Texte passen +sicherlich nicht in das normale Erscheinungsbild einer +GEM-Applikation. +
        +

    • +
    + +

    Querverweis: AES   GEM   USERBLK +

    +

    8.27.31 PDLG_HNDL

    +
    typedef int32_t (cdecl *PDLG_HNDL)( struct _prn_settings *settings,
    +                                 struct _pdlg_sub *sub,
    +                                 int16_t exit_obj );
    +
    +

    Querverweis: Druckdialoge   pdlg_add_sub_dialogs   PDLG_SUB +

    +

    8.27.32 PDLG_INIT

    +
    typedef int32_t (cdecl *PDLG_INIT) (struct _prn_settings *settings,
    +                                 struct _pdlg_sub *sub );
    +
    +

    Querverweis: Druckdialoge   pdlg_add_sub_dialogs   PDLG_SUB +

    +

    8.27.33 PDLG_RESET

    +
    typedef int32_t (cdecl *PDLG_RESET) ( struct _prn_settings *settings,
    +                                   struct _pdlg_sub *sub );
    +
    +

    Querverweis: Druckdialoge   pdlg_add_sub_dialogs   PDLG_SUB +

    +

    8.27.34 PDLG_SUB

    +

    Diese Struktur dient der Beschreibung einer Geräteeinstellung, +und ist wie folgt definiert: +

    +
    typedef struct _pdlg_sub
    +{
    +   struct _pdlg_sub *next;      /* Zeiger auf Nachfolger           */
    +   int32_t     length;          /* Strukturlänge                   */
    +   int32_t     format;          /* Datenformat                     */
    +   int32_t     reserved;        /* reserviert                      */
    +   void        *drivers;        /* nur für interne Dialoge         */
    +   int16_t     option_flags;    /* verschiedene Flags              */
    +   int16_t     sub_id;          /* Kennung des Unterdialogs        */
    +   DIALOG      *dialog;         /* Zeiger auf die Struktur des
    +                                   Fensterdialogs oder 0L          */
    +   OBJECT      *tree;           /* Zeiger auf den Objektbaum       */
    +   int16_t     index_offset;    /* Offset des Unterdialogs         */
    +   int16_t     reserved1;       /* reserviert                      */
    +   int32_t     reserved2;       /* reserviert                      */
    +   int32_t     reserved3;       /* reserviert                      */
    +   int32_t     reserved4;       /* reserviert                      */
    +   PDLG_INIT   init_dlg;        /* Initialisierungsfunktion        */
    +   PDLG_HNDL   do_dlg;          /* Behandlungsfunktion             */
    +   PDLG_RESET  reset_dlg;       /* Zurücksetzfunktion              */
    +   int32_t     reserved5;       /* reserviert                      */
    +   OBJECT      *sub_icon;       /* Zeiger auf das Icon der Listbox */
    +   OBJECT      *sub_tree;       /* Objektbaum des Unterdialogs     */
    +   int32_t     reserved6;       /* reserviert                      */
    +   int32_t     reserved7;       /* reserviert                      */
    +   int32_t     private1;        /* dialogeigene Informationen-1    */
    +   int32_t     private2;        /* dialogeigene Informationen-2    */
    +   int32_t     private3;        /* dialogeigene Informationen-3    */
    +   int32_t     private4;        /* dialogeigene Informationen-4    */
    +} PDLG_SUB;
    +
    +

    Querverweis: Druckdialoge   pdlg_add_sub_dialogs +

    +

    8.27.35 POPINFO

    +
    typedef struct
    +{
    +    OBJECT  *tree;     /* Popup-Menü                  */
    +    int16_t  obnum;    /* aktuelles Objekt von <tree> */
    +} POPINFO;
    +
    +

    Hinweis: Die Komponente tree zeigt auf einen Objektbaum, +der etwa für form_popup als Eingabe dienen könnte. D.h. die Box +sollte als Objekt 0 eine G_BOX oder G_IBOX enthalten, die von den +anderen Objekten vollständig bedeckt wird. Objekte die nicht +auswählbar sind, sollten wie im Dropdownmenü den Status DISABLED +erhalten. +

    +

    Alle wählbaren Objekte müssen den Status SELECTABLE haben. +Zusätzlich müssen bei der Verwendung durch G_POPUP alle +selektierbaren Objekte vom Typ G_STRING (bzw. G_SHORTCUT) oder +G_BUTTON sein und mit zwei Leerstellen beginnen, letzteres wegen des +Häkchens, das von form_button bzw. form_do automatisch gesetzt wird! +

    +

    Wichtig ist, daß ob_x und ob_y von Objekt 0 des Menüs relativ +zum G_POPUP-Objekt angegeben werden, d.h. sie werden meistens beide 0 +sein. Es wird empfohlen, einen Schatten und einen Rand der Stärke -1 +anzugeben. +

    +

    Querverweis: MagiC   G_POPUP +

    +

    8.27.36 PRN_DIALOG

    +
    typedef void *PRN_DIALOG;
    +
    +

    8.27.37 PRN_ENTRY

    +
    typedef struct _prn_entry
    +{
    +   /* Zeiger auf Nachfolger */
    +   struct _prn_entry *next;
    +   /* Strukturlänge */
    +   int32_t     length;
    +   /* Datenformat */
    +   int32_t     format;
    +   /* reserviert */
    +   int32_t     reserved;
    +   /* Treiberkennung */
    +   int16_t     driver_id;
    +   /* Treibertyp */
    +   int16_t     driver_type;
    +   /* Druckerkennung */
    +   int32_t     printer_id;
    +   /* Druckereigenschaften */
    +   int32_t     printer_capabilities;
    +   /* reserviert */
    +   int32_t     reserved1;
    +   /* verschiedene Flags */
    +   int32_t     flags;
    +   /* Zeiger auf Unterdialoge */
    +   struct _pdlg_sub  *sub_dialogs;
    +   /* Unterdialog bei Druckerwechsel initialisieren */
    +   PRN_SWITCH  setup_panel;
    +   /* Unterdialog bei Druckerwechsel  schließen */
    +   PRN_SWITCH  close_panel;
    +   /* Liste vorhand. Auflösungen */
    +   PRN_MODE    *modes;
    +   /* Liste vorhand. Papierformate */
    +   MEDIA_SIZE  *papers;
    +   /* Liste der Einzüge */
    +   PRN_TRAY    *input_trays;
    +   /* Liste der Auswürfe */
    +   PRN_TRAY    *output_trays;
    +   /* Name des Druckers */
    +   int8_t      name[32];
    +} PRN_ENTRY;
    +
    +

    Querverweis: Druckdialoge   pdlg_add_printers +

    +

    8.27.38 PRN_MODE

    +

    Diese Struktur dient der Beschreibung eines Druckermodus, und +ist wie folgt definiert: +

    +
    typedef struct _prn_mode
    +{
    +   struct _prn_mode *next;         /* Zeiger auf Nachfolger             */
    +   int32_t     mode_id;            /* Modus (Index innerhalb der Datei) */
    +   int16_t     hdpi;               /* horizontale Auflösung in dpi      */
    +   int16_t     vdpi;               /* vertikale Auflösung in dpi        */
    +   int32_t     mode_capabilities;  /* Moduseigenschaften                */
    +   int32_t     color_capabilities; /* einstellbare Farbmodi             */
    +   int32_t     dither_flags;       /* Flags, die angeben, ob der
    +                                      korrespondierende Farbmodus mit
    +                                      oder ohne Dithern ansprechbar ist */
    +   MEDIA_TYPE  *paper_types;       /* geeignete Papiertypen             */
    +   int32_t     reserved;           /* reserviert                        */
    +   int8_t      name[32];           /* Modusname                         */
    +} PRN_MODE;
    +
    +

    Querverweis: Druckdialoge   pdlg_add_printers +

    +

    8.27.39 PRN_SETTINGS

    +
    typedef struct _prn_settings
    +{
    +   int32_t  magic;            /* 'pset'                                 */
    +   int32_t  length;           /* (+) Strukturlänge                      */
    +   int32_t  format;           /* Strukturtyp                            */
    +   int32_t  reserved;         /* reserviert                             */
    +   int32_t  page_flags;       /* (+) Flags, u.a. gerade/ungerade Seiten
    +                                 0x0001 = nur Seiten mit gerader Nummer
    +                                 0x0002 = dto. mit ungeraden Nummern    */
    +   int16_t  first_page;       /* (+) erste zu druckende Seite (min.1)   */
    +   int16_t  last_page;        /* (+) dto. letzte Seite (max. 9999)      */
    +   int16_t  no_copies;        /* (+) Anzahl der Kopien                  */
    +   int16_t  orientation;      /* (+) Drehung
    +                                  0x0000 = Ausrichtung unbekannt und
    +                                           nicht verstellbar
    +                                  0x0001 = Seite im Hochformat ausgeben
    +                                  0x0002 = Seite im Querformat ausgeben */
    +   int32_t  scale;            /* (+) Skalierung: 0x10000L = 100%        */
    +   int16_t  driver_id;        /* (+) VDI-Gerätenummer                   */
    +   int16_t  driver_type;      /* Typ des eingestellten Treibers         */
    +   int32_t  driver_mode;      /* Flags, u.a. für Hintergrunddruck       */
    +   int32_t  reserved1;        /* reserviert                             */
    +   int32_t  reserved2;        /* reserviert                             */
    +   int32_t  printer_id;       /* Druckernummer                          */
    +   int32_t  mode_id;          /* Modusnummer                            */
    +   int16_t  mode_hdpi;        /* horizontale Auflösung in dpi           */
    +   int16_t  mode_vdpi;        /* vertikale Auflösung in dpi             */
    +   int32_t  quality_id;       /* Druckmodus (hardwäremäßige Qualität,
    +                                 z.B. Microweave oder Econofast)        */
    +   int32_t  color_mode;       /* Farbmodus                              */
    +   int32_t  plane_flags;      /* Flags für auszugebende Farbebenen
    +                                 (z.B. nur cyan)                        */
    +   int32_t  dither_mode;      /* Rasterverfahren                        */
    +   int32_t  dither_value;     /* Parameter für das Rasterverfahren      */
    +   int32_t  size_id;          /* Papierformat                           */
    +   int32_t  type_id;          /* Papiertyp (normal, glossy)             */
    +   int32_t  input_id;         /* Papiereinzug                           */
    +   int32_t  output_id;        /* Papierauswurf                          */
    +   int32_t  contrast;         /* Kontrast:   0x10000L = normal          */
    +   int32_t  brightness;       /* Helligkeit: 0x1000L  = normal          */
    +   int32_t  reserved3;        /* reserviert                             */
    +   int32_t  reserved4;        /* reserviert                             */
    +   int32_t  reserved5;        /* reserviert                             */
    +   int32_t  reserved6;        /* reserviert                             */
    +   int32_t  reserved7;        /* reserviert                             */
    +   int32_t  reserved8;        /* reserviert                             */
    +   int8_t   device[128];      /* Dateiname für den Ausdruck             */
    +   #ifdef __PRINTING__
    +   TPrint   mac_settings;     /* Einstellung des Mac-Druckertreibers    */
    +   #else
    +   struct
    +   {
    +      uint8_t inside[120];
    +   } mac_settings;
    +   #endif
    +} PRN_SETTINGS;
    +
    +

    Hinweis: Die mit (+) gekennzeichneten Strukturelemente +können von der Applikation ausgelesen werden. Auf alle anderen +Einträge sollte nicht zugegriffen werden. Daten wie z.B. die +Druckerauflösung oder die Farbanzahl sollten nicht der +Einstellstruktur entnommen werden, sondern beim Start des Ausdrucks +vom Drucker erfragt werden (es wäre z.B. möglich, daß der +Druckertreiber durch Speichermangel gezwungen wird, die +Druckauflösung gegenüber der in PRN_SETTINGS eingetragenen +Einstellung zu verringern). +

    +

    Querverweis: Druckdialoge   pdlg_open +

    +

    8.27.40 PRN_SWITCH

    +
    typedef int32_t (cdecl *PRN_SWITCH) ( struct _drv_entr *drivers,
    +                                   struct _prn_settings *settings,
    +                                   struct _prn_entry *old_printer,
    +                                   struct _prn_entry *new_printer );
    +
    +

    Hinweis: Die Komponente old_printer kann auch 0L +sein! +

    +

    Querverweis: Druckdialoge   pdlg_add_printers +

    +

    8.27.41 PRN_TRAY

    +

    Diese Struktur dient der Beschreibung eines Einzugs bzw. +Auswurfs, und ist wie folgt definiert: +

    +
    typedef struct _prn_tray
    +{
    +   struct _prn_tray  *next;    /* Zeiger auf Nachfolger       */
    +   int32_t           tray_id;  /* Nummer des Einzugs/Auswurfs */
    +   int8_t            name[32]; /* Name des Schachts           */
    +} PRN_TRAY;
    +
    +

    Querverweis: Druckdialoge   pdlg_add_printers +

    +

    8.27.42 RSHDR

    + + + + +
    typedef struct
    +{
    +   uint16_t rsh_vrsn;      /* Null                              */
    +   uint16_t rsh_object;    /* Position des Objekt-Feldes        */
    +   uint16_t rsh_tedinfo;   /* Position der TEDINFO-Strukturen   */
    +   uint16_t rsh_iconblk;   /* Position der ICONBLK-Strukturen   */
    +   uint16_t rsh_bitblk;    /* Position der BITBLK-Strukturen    */
    +   uint16_t rsh_frstr;     /* Position der freien Strings       */
    +   uint16_t rsh_string;    /* unbenutzt                         */
    +   uint16_t rsh_imdata;    /* Position der Image-Daten          */
    +   uint16_t rsh_frimg;     /* Position der freien Images        */
    +   uint16_t rsh_trindex;   /* Position der Objektbaumtabelle    */
    +   uint16_t rsh_nobs;      /* Gesamtzahl der Objekte            */
    +   uint16_t rsh_ntree;     /* Gesamtzahl der Objektbäume        */
    +   uint16_t rsh_nted;      /* Gesamtzahl der TEDINFO-Strukturen */
    +   uint16_t rsh_nib;       /* Gesamtzahl der ICONBLK-Strukturen */
    +   uint16_t rsh_nbb;       /* Gesamtzahl der BITBLK-Strukturen  */
    +   uint16_t rsh_nstring;   /* Gesamtzahl der Strings            */
    +   uint16_t rsh_nimages;   /* Gesamtzahl der Images             */
    +   uint16_t rsh_rssize;    /* Gesamtlänge der RSC-Datei         */
    +} RSHDR;
    +
    +

    Hinweis: Alle Positionsangaben sind relativ zum +Dateianfang zu verstehen. Noch ein Wort zu den 'freien Strings': zu +diesen gehören nicht nur die Zeichenketten, in denen sich die Daten +für die Alarmboxen befinden, sondern auch alle anderen Strings, die +ein Programm zu seiner Arbeit benutzt. Ein Beispiel dafür wäre der +Dateiname einer einzulesenden Datei oder ein Eintrag, der mit +menu_text in einem Menü vorgenommen wird. +

    + +

    Diesem Kopf folgen die eigentlichen Resource-Daten. Man beachte +dabei, daß eine Resource-Datei aufgrund der Verwendung von +16-Bit-Werten als Zeiger nur eine Gesamtgröße von maximal 64 +Kbyte erreichen kann. Dateien dieses Formats werden von allen +RCS-Programmen abgespeichert. +

    +

    Anwender des Programms Interface und RSM (Resource Master) +können auch mit Resource-Dateien > 64 Kbyte arbeiten. Auch das +Betriebssystem MagiC unterstützt ab Version 3 Resourcedateien von +mehr als 64 Kbyte; das Laden der Resource erfolgt wie üblich per +rsrc_load, der Rest wird völlig transparent vom System übernommen. +

    +

    Querverweis: rsrc_rcfix   RSXHDR +

    +

    8.27.43 RSXHDR

    +
    typedef struct
    +{
    +  uint16_t rsh_vrsn;     /* should be 3                                 */
    +  uint16_t rsh_extvrsn;  /* not used                                    */
    +                         /* initialized to 'IN' für Interface,          */
    +                         /* 'RM' für ResourceMaster,                    */
    +                         /* 'OR' für ORCS                               */
    +  uint32_t rsh_object;
    +  uint32_t rsh_tedinfo;
    +  uint32_t rsh_iconblk;  /* list of ICONBLKS                            */
    +  uint32_t rsh_bitblk;
    +  uint32_t rsh_frstr;
    +  uint32_t rsh_string;
    +  uint32_t rsh_imdata;   /* image data                                  */
    +  uint32_t rsh_frimg;
    +  uint32_t rsh_trindex;
    +  uint32_t rsh_nobs;     /* counts of various structs                   */
    +  uint32_t rsh_ntree;
    +  uint32_t rsh_nted;
    +  uint32_t rsh_nib;
    +  uint32_t rsh_nbb;
    +  uint32_t rsh_nstring;
    +  uint32_t rsh_nimages;
    +  uint32_t rsh_rssize;   /* Gesamtlänge der RSC-Datei                   */
    +} RSXHDR;
    +
    +

    Querverweis: rsrc_load   RSHDR +

    +

    8.27.44 SCANX

    +
    typedef struct
    +{
    +    int8_t   scancode;
    +    int8_t   nclicks;
    +    int16_t  objnr;
    +} SCANX;
    +
    +

    Hinweis: Die Struktur enthält die Zuordnung für die +Taste mit dem Scancode scancode, bei deren Betätigung ein +nclicks-facher Mausklick auf das Objekt mit der Nummer +objnr ausgeführt wird. Das Ende der Tabelle wird durch einen +Scancode von Null markiert. +

    +

    Querverweis: AES   MagiC   XDO_INF   Scan-Code Tabelle +

    +

    8.27.45 SETTINGS

    +

    Describes Geneva's global settings +

    +
    typedef struct Settings
    +{
    +  int16_t version;                    /* Version SETTINGS is for, in BCD    */
    +  int16_t struct_len;                 /* Total # of bytes in SETTINGS       */
    +  int16_t boot_rez;                   /* ST/TT resolution at startup        */
    +  int16_t falcon_rez;                 /* Falcon video mode at startup       */
    +  union                               /* Preferences                        */
    +  {
    +    struct                            /* Bitmapped flags                    */
    +    {
    +      unsigned pulldown          :1;  /* use pulldown menus                 */
    +      unsigned insert_mode       :1;  /* insert in dialog edits             */
    +      unsigned long_titles       :1;  /* long underlines X_UNDERLINE        */
    +      unsigned alerts_under_mouse:1;  /* alerts appear under mouse          */
    +      unsigned fsel_1col         :1;  /* column in Item Selector            */
    +      unsigned grow_shrink       :1;  /* 1: FMD_GROW/SHRINK on              */
    +      unsigned tear_aways_topped :1;  /* 1: tear aways always usable        */
    +      unsigned auto_update_shell :1;  /*                                    */
    +      unsigned alert_mode_change :1;  /*                                    */
    +      unsigned ignore_video_mode :1;  /*                                    */
    +      unsigned no_alt_modal_equiv:1;  /* rel 004                            */
    +      unsigned no_alt_modeless_eq:1;  /* rel 004                            */
    +      unsigned preserve_palette  :1;  /* rel 004                            */
    +      unsigned mouse_on_off      :1;  /* rel 004                            */
    +      unsigned top_all_at_once   :1;  /* rel 005                            */
    +      unsigned child_pexec_single:1;  /* rel 006                            */
    +    } s;
    +    uint16_t i;                       /* Word for accessing all flags       */
    +  } flags;                            /* Preferences                        */
    +  int16_t gadget_pause;               /* # of 50 Hz timer tics to wait      */
    +  KEYCODE menu_start;                 /* Key to start menus                 */
    +  KEYCODE app_switch;                 /* Key to toggle between apps         */
    +  KEYCODE app_sleep;                  /*                                    */
    +  KEYCODE ascii_table;                /* Key to open ASCII table            */
    +  KEYCODE redraw_all;                 /* Key to redraw whole screen         */
    +  KEYCODE wind_keys[13];              /* Keys for window events             */
    +
    +  OB_PREFER color_3D[4];              /* Colors for 3D objects              */
    +  OB_PREFER color_root[4];            /* Colors for root objects            */
    +  OB_PREFER color_exit[4];            /* Colors for EXIT objects            */
    +  OB_PREFER color_other[4];           /* Colors for other objects           */
    +
    +  int8_t sort_type                    /* fsel sort type, 0(Name) - 4(None)  */
    +  int8_t find_file[26]                /* fsel Search string                 */
    +  int8_t fsel_path[10][35]            /* Item Selector paths                */
    +  int8_t fsel_ext[10][6];             /* Item Selector extension strings    */
    +
    +  KEYCODE cycle_in_app;               /* rel 004                            */
    +  KEYCODE iconify;                    /* rel 004                            */
    +  KEYCODE alliconify;                 /* rel 004                            */
    +  KEYCODE procman;                    /* rel 006                            */
    +  KEYCODE unused[4];
    +
    +  int8_t  graymenu;                   /* rel 004                            */
    +  int8_t  reserved;                   /* rel 004                            */
    +
    +  union                               /* rel 006                            */
    +  {
    +    struct
    +    {
    +      unsigned procman_details  :1;
    +      unsigned reserved         :31;
    +    } s;
    +    unsigned int32_t l;
    +  } flags2;
    +
    +} SETTINGS;
    +
    +

    The color_xx arrays are indexed depending upon the +number of bitplanes in the current resolution: 1-plane=0, 2-planes=1, +4-planes=2, >4-planes=3. +

    +

    The wind_keys array is indexed using the following +constants: +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    XS_UPPAGE0Index for up page key
    XS_DNPAGE1Index for down page key
    XS_UPLINE2Index for up line key
    XS_DNLINE3Index for down line key
    XS_LFPAGE4Index for page left key
    XS_RTPAGE5Index for page right key
    XS_LFLINE6Index for line left key
    XS_RTLINE7Index for line right key
    XS_CLOSE8Index for close box key
    XS_CYCLE9Index for cycle window key
    XS_FULL10Index for full window key
    XS_LFINFO11Index for info left key
    XS_RTINFO12Index for info right key
    +
    + +

    Querverweis: x_settings   KEYCODE   OB_PREFER +

    +

    8.27.46 SET_ITEM

    +
    typedef int16_t (cdecl *SET_ITEM)( LIST_BOX *box, OBJECT *tree,
    +                                struct _lbox_item *item,
    +                                int16_t obj_index, void *user_data,
    +                                GRECT *rect, int16_t first );
    +
    +

    Dabei gilt: +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ParameterBedeutung
    boxZeiger auf die Listbox-Struktur
    treeZeiger auf den Objektbaum des Dialogs
    itemZeiger auf LBOX_ITEM-Struktur des zu setzenden Eintrags
    obj_indexNummer des zu setzenden Objektes
    user_dataZeiger der bei lbox_create übergeben wurde
    rectRechteck für das Objekt-Redraw (oder NULL)
    firstNummer des ersten sichtbaren Elements für Slider-B
    +
    + +

    Hinweis: Bei einer Listbox, die nur Text-Strings +enthält, ist dies typischerweise eine Funktion, die einen String, auf +den die LBOX_ITEM Struktur verweist, in das Objekt obj_index +kopiert. Der Parameter rect ist 0L, wenn ein Redraw der +Dialogbox durchgeführt wird oder wenn lbox_update aufgerufen wurde. +Er ist hingegen nicht 0L, wenn der Anwender ein Objekt +selektiert oder deselektiert hat, und zeigt auf das GRECT für den +Redraw. +

    +

    Der Rückgabewert der Funktion ist die Nummer des Startobjekts +für die Funktion objc_draw bzw. wdlg_redraw. +

    +

    Bei Einträgen in der Listbox, die aus mehreren Objekten +bestehen, ist es manchmal sinnvoll bei Selektion/Deselektion eines +Objekts das Redrawrechteck zu verkleinern oder das Startobjekt zu +ändern, um unnötige Zeichenoperationen und unnötiges Geflacker zu +vermeiden. In den meisten Fällen rufen die Listbox-Routinen nach der +oben beschriebenen Funktion die Routinen objc_draw bzw. wdlg_redraw +auf, um den geänderten Inhalt anzuzeigen. +

    +

    Der Parameter first enthält die Nummer des ersten +sichtbaren Elements für Slider B, wenn die Listbox 2 Slider hat. Bei +einer (vertikalen) Listbox mit Text-Strings und zwei Slidern gibt man +z.B. beim Aufruf von lbox_create die Anzahl der sichtbaren Zeichen in +visible_b, die gesamte Stringlänge in entries_b und +den Index des ersten sichtbaren Zeichens in first_b an. Wird +der Text horizontal gescrollt, wird die Funktion für alle sichtbaren +Strings aufgerufen und der Bereich neugezeichnet bzw. verschoben. Wenn +die Listbox nur einen Slider hat, ist first immer 0. +

    +

    Querverweis: Listboxen   lbox_create +

    +

    8.27.47 SHELTAIL

    +
    typedef struct
    +{
    +    int16_t dummy;       /* ein Nullwort               */
    +    int32_t magic;       /* 'SHEL', wenn Shell...      */
    +    int16_t isfirst;     /* erster Aufruf der Shell    */
    +    int32_t lasterr;     /* letzter Fehler             */
    +    int16_t wasgr;       /* Programm war Grafikapp.    */
    +} SHELTAIL;
    +
    +

    Hinweis: Diese Informationen bekommt ein alternatives +Desktop von MagiC beim Programmstart übermittelt (per shel_read zu +ermitteln). Gibt die Shell einen negativen Fehlercode zurück, so wird +MAGXDESK wieder aktiviert. +

    +

    Wenn die Komponente isfirst gesetzt ist, ist der Status +etwa aus der DESKTOP.INF-Datei zu lesen, anderenfalls aus einer +temporären Datei bzw. dem Shell-Puffer. +

    +

    Die Komponente lasterr entspricht dem Rückgabewert des +vorher gelaufenen Programms. Wenn dies ein GEM-Programm war, ist der +Fehler bereits per Alertbox angezeigt worden. Das Langwort ist +negativ, wenn der Fehler beim Pexec selbst auftrat; ein +Programm-Rückgabewert besitzt immer ein High-Word von 0. +

    +

    Querverweis: AES   GEM   shel_wdef +

    +

    8.27.48 SHELW

    + +
    typedef struct xshelw
    +{
    +    const char *newcmd;   /* command line */
    +    int32_t psetlimit;    /* value for Psetlmit() */
    +    int32_t prenice;      /* value for Prenice() */
    +    const char *defdir;   /* default diretory */
    +    char *env;            /* environment */
    +    int16_t uid;          /* New child's UID */
    +    int16_t gid;          /* New child's GID */
    +} SHELW;
    +
    +

    8.27.49 SLCT_ITEM

    +
    typedef void (cdecl *SLCT_ITEM)( LIST_BOX *box, OBJECT *tree,
    +                                 struct _lbox_item *item,
    +                                 void *user_data, int16_t obj_index,
    +                                 int16_t last_state );
    +
    +

    Dabei gilt: +

    + + + + + + + + + + + + + + + + + + + + + +
    Parameter Bedeutung +
    box Zeiger auf Listbox-Struktur +
    tree Zeiger auf den Objektbaum des Dialogs +
    item Zeiger auf die LBOX_ITEM-Struktur des ausgewählten Eintrags +
    user_data Zeiger der bei lbox_create übergeben wurde +
    obj_index ist die Nummer des angewählten Objekts. Bei einem Doppelklick ist +ähnlich wie nach form_do das oberste Bit gesetzt. Wenn +obj_index 0 ist, heißt das, daß dem Eintrag kein Objekt +zugeordnet ist; er ist nicht sichtbar. Normalerweise ist das nur der +Fall, wenn gescrollt wird und durch Auswahl eines neuen Objekts die +(mittlerweile nicht mehr sichtbare) Selektion gelöscht werden muß. +
    last_state ist der vorhergehende Status des Objekts. last_state +kann auch den gleichen Wert wie item->selected haben. In diesem +Fall kann die Funktion slct normalerweise sofort verlassen werden. + +
    + +

    Querverweis: lbox_create +

    +

    8.27.50 SWINFO

    +
    typedef struct
    +{
    +    int8_t  *string;     /* etwa "TOS|KAOS|MAG!X"          */
    +    int16_t  num;        /* Nr. der aktuellen Zeichenkette */
    +    int16_t  maxnum;     /* maximal erlaubtes <num>        */
    +} SWINFO;
    +
    +

    Querverweis: AES   GEM   G_SWBUTTON +

    +

    8.27.51 TEDINFO

    +

    Die TEDINFO-Struktur wird benutzt um ein Textobjekt näher zu +beschreiben, und ist wie folgt definiert: +

    +
    typedef struct
    +{
    +    int8_t    *te_ptext;          /* Zeiger auf einen String          */
    +    int8_t    *te_ptmplt;         /* Zeiger auf die Stringmaske       */
    +    int8_t    *te_pvalid;         /* Zeiger auf den Gültigkeitsstring */
    +    int16_t    te_font;           /* Zeichensatz                      */
    +    int16_t    te_fontid;         /* GDOS Font-ID                     */
    +    int16_t    te_just;           /* Justierung des Textes:
    +                                     0 = linksbündig
    +                                     1 = rechtsbündig
    +                                     2 = zentriert                    */
    +    int16_t    te_color;          /* Farbe                            */
    +    int16_t    te_fontsize;       /* GDOS Font-Größe in Punkten       */
    +    int16_t    te_thickness;      /* Rahmenbreite                     */
    +    int16_t    te_txtlen;         /* Maximale Länge des Textes        */
    +    int16_t    te_tmplen;         /* Länge der Stringmaske            */
    +} TEDINFO;
    +
    +

    Dabei gilt es, die folgenden Einzelheiten zu beachten: +

    +
      +
    • te_ptext: Wenn das erste Zeichen ein Klammeraffe (@) +ist, werden alle folgenden Zeichen als Platzhalter angesehen, und der +zunächst ausgegebene String besteht aus Leerzeichen. Folge: Der +Klammeraffe kann niemals am Anfang eines Edit-Feldes stehen! +
        +

    • +
    • te_ptmplt: Schablone (template). Sie wird nur bei +G_FTEXT und G_FBOXTEXT verwendet, d.h. bei G_TEXT und G_BOXTEXT kann +hier ein Null-Zeiger stehen. Bei der Ausgabe werden alle '_' Zeichen +in der Schablone sukzessive durch die Zeichen in te_ptext +ersetzt, d.h. es wird eine Misch-Zeichenkette gebildet. I.A. wird die +Schablone also soviele '_' Zeichen enthalten, wie der Puffer für +te_ptext lang ist (ohne abschließendes Nullbyte). +
        +

    • +
    • te_pvalid: String, der für jedes Zeichen in +te_ptext eine Zeichenkette enthält, die über die Gültigkeit +verschiedener Zeichen an dieser Stringposition Auskunft gibt. Es gilt: +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Zeichen Bedeutung +
          +
      1 - 9 Accept any digit from 0 to that number. This is handy for doing +octal ('7') or binary ('1') validation. (Geneva) +
      9 nur Ziffern +
      A nur Großbuchstaben/Leerzeichen +
      a nur Buchstaben/Leerzeichen +
      N Großbuchstaben, Ziffern, Leerzeichen +
      n Buchstaben, Ziffern, Leerzeichen +
      F alle Zeichen, die zu einem Dateinamen gehören und '*', '?' und +':'. +
      f alle Zeichen, die zu einem Dateinamen, ohne '*', '?' und ':'. +
      h Hexadezimale Zeichen. (Geneva) +
      H Hexadezimal Zeichen. Kleinbuchstaben a - f werden in +Großbuchstaben A - F umgewandelt. (Geneva) +
      P alle Zeichen, die zu einem Pfadnamen gehören +
      p analog 'P', aber ohne die Zeichen '?' und '*' +
      m alle Zeichen, die für einen langen Dateinamen gültig sind; +d.h. alle Zeichen außer Steuerzeichen (ASCII < 32), sowie außer +':' und '\'. Dieser Code wird z.Zt. nur von MagiC unterstützt. +
      X alle Zeichen +
      x alle Zeichen, Kleinbuchstaben werden automatisch in +Großbuchstaben umgewandelt. (Geneva) + +
      + +

    • +
    • te_font: +
      3 = normal +
      5 = kleiner Zeichensatz +
        +
      Für weiters siehe unten. +
        +

    • +
    • te_fontid: +
      Für weiters siehe unten. +
        +

    • +
    • te_color: Für die Farbe des begrenzenden Rechteckes +gilt die folgende Belegung: +
        + + + + + + + + + + + + + + + + + + + + + +
      Bit Bedeutung +
          +
      12..15 Rahmenfarbe (0..15) +
      08..11 Textfarbe (0..15) +
       7 Text (0 = transparent, 1 = deckend) +
       4.. 6 Intensität + + + + + + + + + +
      0    = hohl +
      1..6 = ansteigende Intensität +
      7    = solide Fläche + +
      + +
       0.. 3 Innenfarbe (0..15) + +
      + +

    • +
    • te_thickness: Für den Rahmen sind folgende Werte +gültig: +
        +

      +

      + + + + + + + + + + + + + + + + +
      WertBedeutung
       0kein Rahmen
       1.. 128Rand liegt 1 bis 128 Pixel im Inneren
      -1..-127Rand liegt 1 bis 127 Pixel außerhalb des Objektes
      +
      + +

    • +
    + + + + +

    Hinweis: Die Komponenten te_fontid und +te_fontsize waren bisher reserviert. Ab AES-Version 4.1 ist es +möglich, beliebige GDOS-Fonts für TEDINFO-Objekte zu benutzen. +

    +

    Dazu ist über die Komponente te_font die Art des +Zeichensatzes zu spezifizieren: +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    te_fontBedeutung
    0SpeedoGDOS Font
    1SpeedoGDOS Font (monospaced)
    2GDOS Bitmap-Font
    3System-Zeichensatz
    5kleiner System-Zeichensatz
    +
    + +

    Für Werte im Bereich 0..2 von te_font kann dann über +die Komponenten te_fontid bzw. te_fontsize der +gewünschte Zeichensatz und die gewünschte Punktgröße eingestellt +werden. +

    +

    Das Vorhandensein der neuen Möglichkeiten kann am einfachsten +per appl_getinfo (Opcode 13) ermittelt werden. +

    +

    Querverweis: AES   GEM   OBJECT   XTED   Scrollende Eingabefelder +

    +

    8.27.52 USERBLK

    +
    typedef struct
    +{
    +   int16_t cdecl (*ub_code)(PARMBLK *parmblock);
    +   int32_t ub_parm;
    +} USERBLK;
    +
    +

    Hinweis: Die Funktion ub_code wird bei jedem +Aufruf von objc_draw und objc_change für das entsprechende Objekt +aufgerufen. Die Komponente ub_parm kann als optionaler +Parameter angesehen werden. +

    +

    8.27.53 UTXT_FN

    +

    Diese Funktion ist wie folgt deklariert: +

    +
    typedef void (cdecl *UTXT_FN) (int16_t x, int16_t y, int16_t *clip_rect,
    +                               int32_t id, int32_t pt, int32_t ratio,
    +                               int8_t *string);
    +
    +

    Querverweis: AES   fnts_add   FNTS_ITEM   Zeichensatzauswahl +

    +

    8.27.54 WIND_TREE

    +
    typedef struct WindTree
    +{
    +  int16_t handle;   /* Handle of window being modified  */
    +  int16_t count;    /* Number of objects in window      */
    +  int16_t flag;     /* Location to copy to/from         */
    +  OBJECT *tree;
    +} WIND_TREE;
    +
    + + + + + + + + + +
    Parameter Meaning +
    flag + + + + + + + + + +
    Bit 0: Auto resize (X_WTFL_RESIZE=1) +
    Bit 1: Process clicks (X_WTFL_CLICKS=2) +
    Bit 2: Resize sliders, info (X_WTFL_SLIDERS=4) + +
    + + +
    + +

    Querverweis: x_wind_tree +

    +

    8.27.55 WINFRAME_HANDLER

    +

    Übergabe-Struktur zum Einklinken +

    +
    typedef struct {
    +  int16_t   version;                  /* Versionsnummer der Struktur       */
    +  int32_t   wsizeof;                  /* Größe der WINDOW-Struktur         */
    +  int16_t   whshade;                  /* Höhe eines ge-shade-ten Fensters  */
    +  void      (*wbm_create)( WININFO *w );
    +  void      (*wbm_skind) ( WININFO *w );
    +  void      (*wbm_ssize) ( WININFO *w );
    +  void      (*wbm_sslid) ( WININFO *w, int16_t vertical );
    +  void      (*wbm_sstr)  ( WININFO *w );
    +  void      (*wbm_sattr) ( WININFO *w, int16_t chbits );
    +  void      (*wbm_calc)  ( int16_t kind, int16_t *fg );
    +  int16_t   (*wbm_obfind)( WININFO *w, int16_t x, int16_t y );
    +} WINFRAME_HANDLER;
    +
    +

    Querverweis: +
    sys_set_winframe_manager   WININFO   WINFRAME_SETTINGS +

    +

    8.27.56 WINFRAME_SETTINGS

    +
    typedef struct {
    +  int16_t   flags;
    +  int16_t   h_inw;
    +  void      *finfo_inw;
    +} WINFRAME_SETTINGS;
    +
    +

    Bits von flags: +
    #define NO_BDROP 1 +

    +

    Querverweis: +
    sys_set_winframe_manager   WINFRAME_HANDLER   WININFO +

    +

    8.27.57 WININFO

    +

    WINDOW-Struktur für MagiC-Kernel +

    +
    typedef struct {
    +  int16_t   state;
    +  int16_t   attr;
    +  void      *own;         /* (APPL *)                     */
    +  int16_t   kind;         /* von wind_create()            */
    +  char      *name;        /* Zeiger auf Titelzeile        */
    +  char      *info;        /* Zeiger auf Infozeile         */
    +  GRECT     curr;
    +  GRECT     prev;
    +  GRECT     full;
    +  GRECT     work;
    +  GRECT     overall;      /* Umriß                        */
    +  GRECT     unic;
    +  GRECT     min;          /* Minimale Größe               */
    +  int16_t   oldheight;    /* alte Höhe vor Shading        */
    +  int16_t   hslide;       /* horizontale Schieberposition */
    +  int16_t   vslide;       /* vertikale Schieberposition   */
    +  int16_t   hslsize;      /* horizontale Schiebergröße    */
    +  int16_t   vslsize;      /* vertikale Schiebergröße      */
    +  void      *wg;          /* Rechteckliste                */
    +  void      *nextwg;      /* nächstes Rechteck der Liste  */
    +  int16_t   whdl;
    +  OBJECT    tree[N_OBJS];
    +  int16_t   is_sizer;
    +  int16_t   is_info;
    +  int16_t   is_rgtobjects;
    +  int16_t   is_botobjects;
    +  TEDINFO   ted_name;
    +  TEDINFO   ted_info;
    +} WININFO;
    +
    +

    Bits von state: +
    #define OPENED 1 +
    #define COVERED 2 +
    #define ACTIVE 4 +
    #define LOCKED 8 +
    #define ICONIFIED 32 +
    #define SHADED 64 +

    +

    Querverweis: +
    sys_set_winframe_manager   WINFRAME_HANDLER   WINFRAME_SETTINGS +

    +

    8.27.58 XAESMSG

    +

    Diese Struktur ist wie folgt definiert: +

    +
    typedef struct
    +{
    +   int16_t  dst_apid;       /* ID der Ziel-Applikation    */
    +   int16_t  unique_flg;     /* Nachrichten überschreiben? */
    +   void     *attached_mem;  /* Zeiger auf Speicherblock   */
    +   int16_t  *msgbuf;        /* Nachrichenpuffer           */
    +} XAESMSG;
    +
    +

    Hinweis: Die Komponente unique_flg gibt an, ob +gleichartige Nachrichten (d.h. solche mit gleichem Nachrichtentyp +msgbuf[0]) von der neuen Nachricht überschrieben werden sollen. +

    +

    Wenn attached_mem nicht NULL ist, wird damit ein per +Malloc allozierter Speicherblock angegeben, der die erweiterten +Nachrichten-Informationen enthält. Die Länge dieses Blocks ist beliebig +und für das System uninteressant, sie könnte z.B. als erstes +Langwort des Blocks oder in msgbuf [4,5] übergeben werden. +Das System weist den Speicherblock der Zielapplikation zu und +übermittelt dessen Adresse in msgbuf[6,7]. +

    +

    Wichtig: Die aufrufende Applikation muß davon ausgehen, +daß msgbuf[6,7] nach dem Aufruf von appl_write zerstört +sind. Das System behält sich vor, den Inhalt des Speicherblocks +umzukopieren und den übergebenen Block freizugeben. Der Aufrufer darf +nach dem appl_write nicht mehr auf den Block zugreifen und ihn auf +gar keinen Fall freigeben! +

    +

    Gibt appl_write einen Fehlercode zurück, so ist der Block +nicht übergeben worden und gehört nach wie vor der +aufrufenden Applikation. Ein Fehler tritt dann auf, wenn: +

    +
      +
    • die Zielapplikation ungültig (nicht existent oder eingefroren) +ist +
        +

    • +
    • der Nachrichtenpuffer der Zielapplikation voll ist +
        +

    • +
    • die Zielapplikation kein Prozeß ist (z.B. der SCRENMGR) und ein +attached memory block angegeben worden ist. +
        +

    • +
    + +

    Querverweis: AES   appl_write   GEM +

    +

    8.27.59 XDO_INF

    +
    typedef struct
    +{
    +    SCANX *unsh;    /* Tabellen für UnShift-Kombinationen   */
    +    SCANX *shift;   /* Tabellen für Shift-Kombinationen     */
    +    SCANX *ctrl;    /* Tabellen für Control-Kombinationen   */
    +    SCANX *alt;     /* Tabellen für Alternate-Kombinationen */
    +    void  *resvd;   /* reserviert */
    +} XDO_INF;
    +
    +

    Hinweis: In dieser Struktur liegen Zeiger auf Tabellen, +die einem Scancode eine Objektnummer der Dialogbox zuordnen. Hiermit +ist es auf einfache Weise möglich, Dialoge vollständig über die +Tastatur zu bedienen. Der Parameter resvd ist für spätere +Zwecke reserviert, und muss immer NULL sein. +

    +

    Querverweis: AES   form_keybd   form_xdo   MagiC   Scan-Code Tabelle +

    +

    8.27.60 XFONTINFO

    +

    Describes font being used and window gadget borders +

    +
    typedef struct
    +{
    +   int16_t font_id;     /* VDI font ID#                                       */
    +   int16_t point_size;  /* Point size of the font                             */
    +   int16_t gadget_wid;  /* Width of border around a char in a window gadget   */
    +   int16_t gadget_ht;   /* Height of border around a char in a window gadget  */
    +} XFONTINFO;
    +
    +

    gadget_wid and gadget_ht are added to the width +and height of the characters. These values should always be >= 0. +

    +

    Querverweis: x_appl_font +

    +

    8.27.61 XFSL_FILTER

    +
    typedef int16_t (cdecl XFSL_FILTER) (int8_t *path, int8_t *name,
    +       XATTR *xa);
    +
    +

    Querverweis: fslx_do   fslx_open +

    +

    8.27.62 XSHW_COMMAND

    +
    typedef struct
    +{
    +   int8_t  *command;
    +   int32_t limit;
    +   int32_t nice;
    +   int8_t  *defdir;
    +   int8_t  *env;
    +} XSHW_COMMAND;
    +
    +

    Querverweis: shel_write +

    +

    8.27.63 XTED

    +

    Diese Struktur wird im Zusammenhang mit scrollbaren +Texteditfeldern benötigt. +

    +
    typedef struct _xted
    +{
    +   int8_t  *xte_ptmplt;
    +   int8_t  *xte_pvalid;
    +   int16_t xte_vislen;
    +   int16_t xte_scroll;
    +} XTED;
    +
    +

    Querverweis: Scrollende Eingabefelder   TEDINFO +

    +

    8.27.64 X_BUF_V2

    + + + + + + + + +
    typedef struct x_buf_v2
    +{
    +int16_t  buf_len   /* Length of the structure, including this word.      */
    +                   /* Future versions of this structure (X_BUF_V3 etc.)  */
    +                   /* may be bigger.                                     */
    +int16_t  arch      /* 16 for 16-bit AES, 32 for hypothetical 32-bit AES. */
    +CLRCAT   *cc       /* Address of an array of 16 CLRCAT structures.       */
    +                   /* This is so that they can be read by a program; in  */
    +                   /* ViewMAX, the colors could be set but not reread.   */
    +OBJECT   *w_active /* Address of an object tree (19 elements) used to    */
    +                   /* draw window elements. Included so a program can    */
    +                   /* change symbols on window buttons.                  */
    +int8_t   *info     /* Address of a 0-terminated ASCII string (at most    */
    +                   /* 40 characters, no newlines) describing the AES     */
    +int32_t  abilities /* A bitmapped field describing what optional         */
    +                   /* functions this AES provides:                       */
    +/* ABLE_GETINFO  1    bit 0 : xapp_getinfo supported                     */
    +/* ABLE_PROP     2    bit 1 : prop_get, prop_put and prop_del supported  */
    +/* ABLE_WTREE    4    bit 2 : wind_get and wind_set can change glyphs    */
    +/* ABLE_X3D      8    bit 3 : GEM/5 3D using DRAW3D                      */
    +/* ABLE_XSHL    16    bit 4 : xshl_getshell & xshl_putshell              */
    +/* ABLE_PROP2   32    bit 5 : prop_gui_get, prop_gui_set                 */
    +/* ABLE_EMSDESK 64    bit 6 : xgrf_dtimage supports EMS                  */
    +/* ABLE_XBVSET 128    bit 7 : supports 32 disc drives                    */
    +} X_BUF_V2;
    +
    +

    An initialised X_BUF_V2 is one in which all members are 0 except +buf_len. This initialised buffer is then passed to appl_init. On +return, if arch is 0 then the structure was not filled in by the AES; +otherwise it was. The buf_len field may be reduced, if the AES was +expecting an earlier version of the structure (ie, X_BUF_V1); this +should not be a problem because the structures are forward and +backward compatible. +

    +

    Querverweis: appl_init +

    +
    + +Home +AESAES +AES-FunktionslisteAES-Funktionsliste +XCONTROLXCONTROL + + diff --git a/de/appendix.html b/de/appendix.html new file mode 100644 index 000000000..df6ede54e --- /dev/null +++ b/de/appendix.html @@ -0,0 +1,164 @@ + + + + + +Die Anleitung zum TOS: XSSI-Protokoll + + + + + + + + + +Home +ProtokolleProtokolle +xFSL-SchnittstellexFSL-Schnittstelle +ASCII-TabelleASCII-Tabelle + +
    + +

    15.15 XSSI-Protokoll

    + +

    Ein großes Problem für den Programmierer eines +Bildschirmschoners ist es, daß viele Applikationen nichts davon +wissen, was gerade vor Ihren Augen auf dem Bildschirm vorgeht. +Dementsprechend geben sie Ihre Informationen weiterhin auf den +Bildschirm aus, obwohl dort eigentlich jetzt der Bildschirmschoner das +Sagen hätte. Damit eine Applikation sicher den Status des +Bildschirmschoners feststellen und u.U. sogar beeinflussen kann, gibt +es den sogenannten XSSI-Standard (XSSI steht für "eXtended +ScreenSaver Interface"), der von Julian Reschke vorgeschlagen +wurde. +

    +

    Der Wert des XSSI-Cookies ist ein Zeiger auf die folgende +Struktur: +

    +
    typedef struct
    +{
    +     LONG id;
    +     WORD version;
    +     WORD save_stat;
    +     WORD prg_stat;
    +     LONG vec_stat;
    +} INFOXSSI;
    +
    + + + + + + + + + + + + + + + +
    id Als id trägt jeder Bildschirmschoner seine +XBRA-Kennung ein. +
      +

    +
    + + + + + + + + + + + + +
    idBildschirmschoner
    DAWNBefore Dawn
    BBLSBUBBLES
    +
    + +
    version In version ist die Versionsnummer des XSSI-Protokolls +eingetragen. 'Before Dawn' verwendet im Moment die Versionsnummer +$101. +
      +
    save_stat Über save_stat kann eine Applikation feststellen, ob +gerade geschont wird. Ein Wert von 0 bedeutet, daß nicht geschont +wird. Ein negativer Wert zeigt an, daß gerade geschont wird. +
      +
    prg_stat Mit prg_stat kann eine Applikation 'Before Dawn' +mitteilen, wie es sich verhalten soll. Dabei kann prg_stat die +folgenden Werte annehmen: +
      +
    prg_stat = 0 normal schonen +
    prg_stat = 1 niemals schonen. +
    prg_stat = -1 sofort schonen +
      +
    vec_stat vec_stat zeigt an, welche Systemvektoren überwacht +werden. Es handelt sich bei diesem Wert um ein Bitfeld. Die Belegung +ist folgendermaßen: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    BitSystemvektor
    0Tastatur
    1Maus
    2Joystick
    3Midi
    4Modem 1
    5Modem 2
    6Serial 1
    7LAN-Port bzw. Serial 2
    8-14sonstige Vektoren
    15Fenster-Events
    +
    + + +
    + + +
    + +Home +ProtokolleProtokolle +xFSL-SchnittstellexFSL-Schnittstelle +ASCII-TabelleASCII-Tabelle + + diff --git a/de/appl.html b/de/appl.html new file mode 100644 index 000000000..3cf62f84d --- /dev/null +++ b/de/appl.html @@ -0,0 +1,5253 @@ + + + + + +Die Anleitung zum TOS: Applikationsfunktionen + + + + + + + + + +Home +AESAES +Grundlagen des AESGrundlagen des AES +DateiauswahlDateiauswahl + +
    + +

    8.3 Applikationsfunktionen

    +

    In dieser Bibliothek sind Funktionen enthalten, um eine +GEM-Applikation zu initialisieren und zu terminieren; darüber hinaus +erlauben diese Routinen die Kommunikation mit anderen Prozessen. +Insgesamt stehen die folgenden Funktionen zur Verfügung: +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    appl_bvset Angeschlossene Laufwerke setzen. +
    appl_control Gezieltes Steuern von Anwendungen. +
    appl_exit AES-Anwenderprogramm abmelden und Kennung freigeben. +
    appl_find AES-Kennung einer anderen AES-Applikation ermitteln. +
    appl_getinfo System-Informationen ermitteln. +
    appl_getinfo_str erweiterte System-Informationen ermitteln. +
    appl_getcicon Ermitteln eines CICON (Icon Server) +
    appl_init AES-Anwendung anmelden. +
    appl_options Sets or gets application options +
    appl_read AES-Mitteilungen lesen. +
    appl_search Applikationen im System suchen. +
    appl_tplay Ereignisse abspielen. +
    appl_trecord Ereignisse aufzeichnen. +
    appl_write AES-Mitteilungen schreiben. +
    appl_xbvget Angeschlossene Laufwerke ermitteln. +
    appl_xbvset Extended available drive bitmaps. +
    appl_yield AES-Prozeß-Switch erzwingen. +
    _appl_yield AES-Prozeß-Switch erzwingen. +
    x_appl_flags Controls execution flags +
    x_appl_font Changes font and window borders +
    x_appl_sleep Puts application to sleep, or wakes it up +
    x_appl_term Terminate an application and remove it from memory. + +
    + +

    Hinweis: Besondere Beachtung verdient dabei +appl_getinfo, mit dessen Hilfe sich leicht Eigenschaften des +Betriebssystems zur Laufzeit erfragen lassen. +

    +

    Querverweis: Style-Guidelines +

    +

    8.3.1 appl_bvset

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Application Bitvektor-Set« - setzt die angeschlossenen +logischen Laufwerke für die Dateiauswahlbox +
      +
    AES-Nummer: 16 +
      +
    Deklaration: int16_t appl_bvset ( uint16_t bvdisk, uint16_t bvhard ); +
      +
    Beschreibung: Die Funktion informiert das GEM über die vorhandenen logischen +Laufwerke, die u.a. für die Dateiauswahl-box (Fileselector) benötigt +werden. Es gilt: +
      +

    +
    + + + + + + + + + + + + +
    ParameterBedeutung
    bvdiskBitvektor der vorhandenen Diskettenlaufwerke (Bit-15 = Laufwerk-A etc).
    bvhardBitvektor der vorhandenen Festplattenlaufwerke (Bit-15 = Laufwerk-A etc).
    +
    + +
    Die Werte stehen der Applikation in global[13] und global[14] +zur Verfügung. +
      +
    In GEM/4 and GEM/5, use appl_xbvset to access drives beyond P. +
      +
    Ergebnis: Der Rückgabewert der Funktion ist z.Zt. nicht bekannt. +
      +
    Verfügbar: Die Funktion steht erst ab PC-GEM Version 2.0, KAOS 1.4.2 und +MagiC zur Verfügung. +
      +
    Gruppe: Applikationen +
      +
    Querverweis: Binding   appl_xbvset   Dsetdrv +
      + +
    + +

    8.3.1.1 Bindings für appl_bvset

    + + + + + + + + + +
    C: int16_t appl_bvset ( uint16_t bvdisk, uint16_t bvhard ); +
      +
    Umsetzung: +
      +
    int16_t appl_bvset (uint16_t bvdisk, uint16_t bvhard)
    +{
    +   int_in[0]  = bvdisk;
    +   int_in[1]  = bvhard;
    +   return ( crys_if(16) );
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]16 # Opcode der Funktion
    control+2control[1]2 # Einträge in int_in
    control+4control[2]1 # Einträge in int_out
    control+6control[3]0 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_inint_in[0]bvdisk
    int_in+2int_in[1]bvhard
    int_outint_out[0]Return-Wert
    +
    + + +
    + +

    8.3.2 appl_control

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Application control« - Gezieltes Steuern von Anwendungen. +
      +
    AES-Nummer: 129 +
      +
    Deklaration: int16_t appl_control ( int16_t ap_cid, int16_t ap_cwhat, void +*ap_cout); +
      +
    Beschreibung: Die Funktion erlaubt ein gezieltes Steuern von Anwendungen. +
      + + + + + + + + + + + + +
    Parameter Bedeutung +
      +
    ap_cid Die Applikationsidentifikation (apid) der Anwendung, die +gesteuert werden soll. +
      +
    ap_cwhat Die Art der Steuerung: +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    0 bis 9 Reserviert für N.AES. +
      + +
    APC_TOPNEXT (0) OAESis interner Mode +
      + +
    APC_KILL (1) OAESis interner Mode +
      + +
    APC_SYSTEM (2) XaAES interner Mode +
      + +
    APC_HIDE (10) Applikation ausblenden +
    Wird für ap_cid -1 übergeben, so wird die aktuelle +Anwendung ausgeblendet. +
      + +
    APC_SHOW (11) Applikation einblenden +
    Wird für ap_cid -1 übergeben, so werden alle +ausgeblendeten Anwendungen eingeblendet. +
      + +
    APC_TOP (12) Applikation in den Vordergrund bringen (zur aktuellen Anwendung +machen). +
      + +
    APC_HIDENOT (13) Ausblenden aller Anwendungen bis auf die in ap_cid +angegebene, welche zur neuen aktuellen Anwendung wird. Wird für +ap_cid -1 übergeben, so werden alle Anwendungen bis auf die +aktuelle ausgeblendet. +
      + +
    APC_INFO (14) Abfragen von Applikationsparametern der Anwendung +ap_cid. Wird für ap_cid -1 übergeben, so werden die +Parameter der aktuellen Anwendung geliefert. +
      +
    Für ap_cout ist ein Zeiger auf einen Integer zu +übergeben. N.AES hinterlegt hier die Applikationsparameter in Form +einer Bitmaske: +
      + + + + + + + + + + +
    APCI_HIDDEN (1) Bit 0 ist gesetzt, wenn die Applikation ausgeblendet ist. +
      + +
    APCI_HASMBAR (2) Bit 1 ist gesetzt, wenn die Applikation eine Menüleiste +besitzt. +
      + +
    APCI_HASDESK (4) Bit 2 ist gesetzt, wenn die Applikation einen eigenen Desktop +besitzt. +
      + +
    + + +
    APC_MENU (15) Liefert die Adresse des Menübaums, den die Anwendung +ap_cid zuletzt angemeldet hat. Hierzu ist für ap_cout +ein Zeiger auf einen OBJECT-Zeiger zu übergeben; letzterer wird vom +N.AES mit der gesuchten Menübaumadresse gefüllt. +
      +
    Wird für ap_cid -1 übergeben, so wird die +Menübaumadresse der aktuellen Anwendung geliefert. Übergibt man für +ap_cid den Wert 0, so wird die Adresse des vom N.AES intern +verwalteten Systemmenüs geliefert. Dies ist die Menübox, die +aufklappt, wenn man den am weitesten links stehenden Menütitel +anwählt und welche die Liste aller beim N.AES angemeldeten +Anwendungen und Accessories enthält. +
      +
    Hat die abgefragte Anwendung keine Menüleiste angemeldet oder +existiert keine Anwendung mit der Identifikation ap_cid, so +wird ein Nullzeiger nach ap_cout geschrieben. +
      +
    Der Rückgabewert von appl_control, Modus APC_MENU ist immer der +Wert 1. +
      +
    Hinweis: Wenn man diesen Modus verwendet, sollte man +sich ganz sicher sein, was man tut! Das Verändern des gelieferten +Menübaums kann zu undefinierten Systemzuständen führen. Bei aktivem +MiNT-Speicherschutz kann bereits ein Lesezugriff auf den Menübaum den +Abbruch der Anwendung bewirken. +
      + + +
    APC_WIDGETS (16) Erfragt oder setzt die 'default' Positionen der Fensterobjekte. +ap_cout ist ein Zeiger auf einen MINWINOBJ(12) großen +(int16_t) Buffer, der zum abfragen der Objektreihenfolge komplett mit +-1 gefüllt sein muß. Das letzte Word muß eine 0 sein. Wird eine +Fehlermeldung zurückgeliefert reicht der Buffer nicht für alle +Objekte und sollte vergrößert werden. Im Buffer liegen als erstes +die Objekte der Titelleiste von links nach rechts, danach die Objekte +des Vertikalsliders von oben nach unten und dann die Objekte des +Horizontalsliders von links nach rechts. Abgeschlossen wird die Liste +mit einem 0 Word. Zum setzen der Positionen müßen die ersten Objekte +vom Typ topwidgets sein (von links nach rechts), danach die Objekte +des Typs rightwidgets (von oben nach unten) und dann die Objekte des +Typs bottomwidgets (von links nach rechts). Sollten Objekte doppelt +oder falsch gesetzt sein wird ein Fehler gemeldet. +
      + +
    APC_APP_CONFIG (17) With this option you are able to inform to AES how you want +your application should be considered. +
    ap_cout is a pointer to a string. At this time value +supported are: +
      +
      +
    • "app_debug=true" or "app_debug" : put the +application in debug mode +
    • +
    • "app_debug=false" : stop debug mode +
    • +
    • "app_topmost=true" or "app_topmost" : +Application windows will be always on top (compare to other classical +application) but without focus (can be usefull for tesk bar for +exemple) +
    • +
    • "app_topmost=false" : remove previous option +
    • +
    • "app_system" : application is a system application +(used in appl_search for type APP_SYSTEM) +
    • +
    • "app_texticon=opaque" : background icon text is +opaque +
    • +
    • "app_texticon=transparent" : background icon text is +transparent +
    • +
    • "app_signal_mesag=true": Request receive Unix Signal +when even message is waiting see APC_INFORM_MESAG as it do exactly the +same +
    • +
    • "app_signal_mesag=false": Request stop receive Unix +Signal when even message is waiting +
    • +
    + + +
    APC_INFORM_MESAG (18) Request to AES to inform the application when there is a AES +message waiting with a Unix Signal. +
    ap_cout : not used. +
    When the application receive a message the AES send the Signal +SIGUSR2 (30) to the application, to manage the message should use +classical event_mesag or event_multi functions. Calling one time this +call request to AES to send Signal, calling a second time remove this +order. +
      + +
    + +
    ap_cout Wird abhängig von ap_cwhat gefüllt oder gelesen und +hat nur für APC_INFO, APC_MENU, APC_WIDGETS und APC_APP_CONFIG eine +Bedeutung. In den anderen Fällen wird dieser Parameter ignoriert, die +Übergabe eines Nullzeigers ist dann möglich. +
      + +
    + +
    Hinweis: Ausgeblendeten Anwendungen wird in der +Menüleiste ein '*' vorangestellt, es sei denn, sie hatten im Moment +der Ausblendung kein Fenster offen. In diesem Fall wird nur die +Anwendung gewechselt. +
      +
    Der '*' vor dem Namen bedeutet genau: Einige oder alle +geöffneten Fenster dieser Anwendung sind ausgeblendet. +
      +
    Ergebnis:  0 = ein Fehler ist aufgetreten +
    >0 = kein Fehler aufgetreten +
      +
    Verfügbar: Das Vorhandensein der Funktion ist über appl_getinfo (Opcode 65) +nachprüfbar. +
      +
    Gruppe: Applikationen +
      +
    Querverweis: Binding   SM_M_SPECIAL +
      + +
    + +

    8.3.2.1 Bindings für appl_control

    + + + + + + + + + +
    C: int16_t appl_control ( int16_t ap_cid, int16_t ap_cwhat, void +*ap_cout); +
      +
    Umsetzung: +
      +
    int16_t appl_control ( int16_t ap_cid, int16_t ap_cwhat,
    +                       void *ap_cout);
    +{
    +   int_in[0]  = ap_cid;
    +   int_in[1]  = ap_cwhat;
    +   addr_in[0] = ap_cout;
    +
    +   return ( crys_if(129) );
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]129 # Opcode der Funktion
    control+2control[1]2 # Einträge in int_in
    control+4control[2]1 # Einträge in int_out
    control+6control[3]1 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_inint_in[0]ap_cid
    int_in+2int_in[1]ap_cwhat
    addr_inaddr_in[0]ap_cout
    int_outint_out[0]ap_creturn
    +
    + + +
    + +

    8.3.3 appl_exit

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Application exit« - meldet eine Applikation vom AES ab. +
      +
    AES-Nummer: 19 +
      +
    Deklaration: int16_t appl_exit ( void ); +
      +
    Beschreibung: Meldet eine Applikation beim AES wieder ab und gibt deren +Applikations-ID frei. +
      +
    Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgegeben wird. +
      +
    Verfügbar: Alle AES Versionen +
      +
    Gruppe: Applikationen +
      +
    Querverweis: Binding   appl_init +
      + +
    + +

    8.3.3.1 Bindings für appl_exit

    + + + + + + + + + +
    C: int16_t appl_exit ( void ); +
      +
    Umsetzung: +
      +
    int16_t appl_exit (void)
    +{
    +   return ( crys_if(19) );
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]19 # Opcode der Funktion
    control+2control[1]0 # Einträge in int_in
    control+4control[2]1 # Einträge in int_out
    control+6control[3]0 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_outint_out[0]Return-Wert
    +
    + + +
    + +

    8.3.4 appl_find

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Application find« - ermittelt die Applikationsnummer einer +AES-Anwendung. +
      +
    AES-Nummer: 13 +
      +
    Deklaration: int16_t appl_find ( CONST int8_t *ap_fpname ); +
      +
    Beschreibung: Diese Funktion ermittelt die Applikationsidentifikation einer +anderen, parallel laufenden Applikation. Dabei zeigt ap_fpname +auf den Namen der Applikation deren Identifikator gefunden werden +soll. +
      +
    Wichtig: Der Name muß unbedingt acht Zeichen lang sein, +ist er kürzer, so muß er mit Leerzeichen aufgefüllt werden. +
      +
    In MagiC und AES 4.0 kann man zusätzlich durch Übergabe eines +Nullpointers die ID der aktuellen Applikation ermitteln. Darüber +hinaus ist es möglich, die AES-ID einer Applikation in die MiNT-ID +umzurechnen und umgekehrt, und zwar wie folgt: +
      + + + + + + + + + + + + + + + + + + +
    High-Word Bedeutung +
    von ap_fpname   +
        +
    -1 Die Funktion erwartet im Low-Word die MiNT-ID einer Applikation +und liefert nach dem Aufruf die AES-ID dieser Applikation zurück. +
    -2 Die Funktion erwartet im Low-Word die AES-ID einer +Applikation und liefert nach dem Aufruf die MiNT-ID dieser Applikation +zurück. +
    -3 Es wird die AES-ID der obersten Applikation geliefert. Das +Low-Word spielt dabei keine rolle und kann 0 sein. Steht nur unter +MyAES (ab 0.94a), N.AES und XaAES zur Verfügung. + +
    + +
    Hinweis: Die Funktion arbeitet nur dann korrekt, wenn +das betreffende Programm per shel_write gestartet worden ist. +Es sei ferner darauf hingewiesen, daß Threads über diese Funktion +nicht gefunden werden können. +
      +
    Bei KAOS 1.4.2 und MagiC kann man den Applikationsname auch +ermitteln in dem man den String "?\0\n" übergibt, wobei n +die ap_id darstellt. Ist der Funktionswert 0 ist die ap_id ungültig. +Ansonsten erhält man eine 1, und der String wurde mit dem +Applikationsnamen überschrieben. Besitzen zwei Applikationen den +selben Namen wird nur der erste gefunden. +
      +
    Einige AES-Namen sind vordefiniert: +
    "SCRENMGR": Bildschirmmanager. +
    "        ": Integriertes Desktop. +
    "?AGI": appl_getinfo() bei AES-Versionen < 4.00 +vorhanden +
      +
    Ergebnis: Ein Rückgabewert kleiner Null kennzeichnet einen aufgetretenen +Fehler. +
      +
    Verfügbar: Das Vorhandensein der zusätzlichen Features ist über appl_getinfo +(Opcode 4) nachprüfbar. +
      +
    Gruppe: Applikationen +
      +
    Querverweis: Binding   appl_search   Screen-Manager +
      + +
    + +

    8.3.4.1 Bindings für appl_find

    + + + + + + + + + +
    C: int16_t appl_find ( CONST int8_t *ap_fpname ); +
      +
    Umsetzung: +
      +
    int16_t appl_find (CONST int8_t *ap_fpname)
    +{
    +   addr_in[0] = ap_fpname;
    +   return ( crys_if(13) );
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]13 # Opcode der Funktion
    control+2control[1]0 # Einträge in int_in
    control+4control[2]1 # Einträge in int_out
    control+6control[3]1 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    addr_inaddr_in[0]ap_fpname
    int_outint_out[0]Return-Wert
    +
    + + +
    + + +

    8.3.5 appl_getinfo

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Application get information« - Informationen über +vorhandene Funktionsaufrufe und Eigenschaften erfragen. +
      +
    AES-Nummer: 130 +
      +
    Deklaration: int16_t appl_getinfo ( int16_t ap_gtype, int16_t *ap_gout1, +int16_t *ap_gout2, int16_t *ap_gout3, int16_t *ap_gout4 ); +
      +
    Beschreibung: Mit dieser Funktion lassen sich gezielt Eigenschaften des +Betriebssystems zur Laufzeit erfragen. +
      +
    ap_gtype bestimmt die Art der Informationen, die erfragt +werden sollen. Es bedeutet: +
      + +
    AES_LARGEFONT (0): Informationen über den normalen +AES-Zeichensatz +
      + + + + + + + + + +
    ap_gout1: Fonthöhe +
    ap_gout2: Font-ID +
    ap_gout3: Font-Typ (0=system, 1=FSM) + +
    + + +
    AES_SMALLFONT (1): Informationen über den kleinen +Zeichensatz +
      + + + + + + + + + +
    ap_gout1: Fonthöhe +
    ap_gout2: Font-ID +
    ap_gout3: Font-Typ (0=system, 1=FSM) + +
    + + + + + + + +
    AES_SYSTEM (2): Farben +
      + + + + + + + + + + + + +
    ap_gout1: VDI-Gerätenummer (device id) +
    ap_gout2: Farben für OBJECTs +
    ap_gout3: Farbicons vorhanden (1) bzw. nicht (0) +
    ap_gout4: + + + + + + +
    Bit 0: neues RSC-Format (AES4) vorhanden +
    Bit 1: Interface Resource File Format (RSHDR:rsh_vrsn = 3) wird +unterstützt. + +
    + + +
    + + + +
    AES_LANGUAGE (3): Sprache +
      + + + +
    ap_gout1: +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    0-Englisch
    1-Deutsch
    2-Französisch
    3-reserviert
    4-Spanisch
    5-Italienisch
    6-Schwedisch
    +
    + + +
    + + + + +
    AES_PROCESS (4): allgemeine Informationen-1 +
      + + + + + + + + + + + + +
    ap_gout1: Multitasking präemptiv (1) oder nicht (0) +
    ap_gout2: appl_find konvertiert MiNT/AES-ID's (1) oder nicht (0) +
    ap_gout3: appl_search vorhanden (1) oder nicht (0) +
    ap_gout4: rsrc_rcfix vorhanden (1) oder nicht (0) + +
    + + +
    AES_PCGEM (5): allgemeine Informationen-2 +
      + + + + + + + + + + + + +
    ap_gout1: objc_xfind vorhanden (1) oder nicht (0) +
    ap_gout2: reserviert, immer 0 +
    ap_gout3: menu_click vorhanden (1) oder nicht (0) +
    ap_gout4: shel_rdef/shel_wdef vorhanden (1) oder nicht (0) + +
    + + +
    AES_INQUIRE (6): allgemeine Informationen-3 +
      + + + + + + + + + + + + +
    ap_gout1: appl_read (-1) vorhanden (1) oder nicht (0) +
    ap_gout2: shel_get (-1) vorhanden (1) oder nicht (0) +
    ap_gout3: menu_bar (-1) vorhanden (1) oder nicht (0) +
    ap_gout4: menu_bar (100) (MagiC) vorhanden (1) oder nicht (0) + +
    + + +
    7: reserviert für MagiC und andere Erweiterungen, MultiTOS +setzt alle Rückgabewerte immer auf 0. In MagiC gilt: +
      + + + + + + + + + + + + +
    ap_gout1: + + + + + + + + + + + + + + + +
    Bit 0: wdlg_xx()-Funktionen vorhanden (1) +
    Bit 1: lbox_xx()-Funktionen vorhanden (1) +
    Bit 2: fnts_xx()-Funktionen vorhanden (1) +
    Bit 3: fslx_xx()-Funktionen vorhanden (1) +
    Bit 4: pdlg_xx()-Funktionen vorhanden (1) + +
    + +
    ap_gout2: reserviert +
    ap_gout3: reserviert +
    ag_gout4: reserviert + +
    + + + + +
    AES_MOUSE (8): Maus +
      + + + + + + + + + +
    ap_gout1: graf_mouse Modi (258-260) vorhanden (1) oder nicht (0) +
    ap_gout2: Mausform vom AES für jede Applikation verwaltet (1) oder +nicht (0) +
    ap_gout3: Achtung doppelt Belegung +
    - Mausrad Unterstützung (XaAES) +
    - Falls ein Treiber installiert ist der TORG 105 unterstützt +steht hier ein Bitvektor der verfügbaren Mausräder. + +
    + + +
    AES_MENU (9): Menüs +
      + + + + + + + + + + + + +
    ap_gout1: MultiTOS-Submenüs vorhanden (1) oder nicht (0) +
    ap_gout2: MultiTOS-Popups vorhanden (1) oder nicht (0) +
    ap_gout3: MultiTOS-Scrollmenüs vorhanden (1) oder nicht (0) +
    ap_gout4: erweiterte MN_SELECTED-Nachricht vorhanden (1) oder nicht (0) + +
    + + +
    AES_SHELL (10): shel_write +
      + + + + + + + + + + + + +
    ap_gout1: vorhandene Modi + + + + + + +
    Bit 0..7: höchster zulässiger Wert für sh_wdoex & 0x00ff +
    Bit 8..15: Bits von sh_wdoex & 0xff00, die wie in MultiTOS behandelt +werden. + +
    + +
    ap_gout2: + + + + + + +
    1: shel_write (0) macht vorherige shel_write Aufrufe ungültig (d.h. das +Desktop wird Nachfolgeprogramm) (TOS 1.04 und MagiC) +
    0: startet Programm (MultiTOS) + +
    + +
    ap_gout3: + + + + + + +
    1: shel_write (1) startet Programm nach Beendigung des laufenden (TOS +1.04 und MagiC) +
    0: startet Programm sofort (MultiTOS) + +
    + +
    ap_gout4: ARGV via sh_wiscr unterstützt (1) oder nicht (0) + +
    + + +
    AES_WINDOW (11): Fenster +
      + + + + + + + + + + + + +
    ap_gout1: gesetzte Bits sind unterstützte Funktionen: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Bit 0: WF_TOP liefert zweitoberstes Fenster +
    Bit 1: wind_get (WF_NEWDESK) +
    Bit 2: wind_g/set (WF_COLOR) +
    Bit 3: wind_g/set (WF_DCOLOR) +
    Bit 4: wind_get (WF_OWNER) +
    Bit 5: wind_g/set (WF_BEVENT) +
    Bit 6: WF_BOTTOM +
    Bit 7: WF_ICONIFY +
    Bit 8: WF_UNICONIFY +
    Bit 9: WF_WHEEL +
    Bit 10: wind_get(WF_FIRSTAREAXYWH) +
    Bit 11: wind_get/set(WF_OPTS) +
    Bit 12: wind_get/set(WF_MENU) +
    Bit 13: wind_get/set(WF_WORKXYWH) +
    Bit 14: wind_get(WF_CALCW2F/WF_CALCF2W) und WO0_WCOWORK +
    Bit 15: wind_set und wind_get können mit dem speziellen handle -2 +aufgerufen werden. Wind_set und wind_get liefern dann mit spezielen handle +und dem Modus ob dieser vorhanden ist (1) oder nicht (0). + +
    + +
    ap_gout2: + + + + + + +
    Bit 0: wind_get/set (WF_WIDGETS), N.AES +
    Bit 1..15: reserviert + +
    + +
    ap_gout3: vorhandene Fensterbuttons + + + + + + + + + + + + + + + +
    Bit 0: Iconifier +
    Bit 1: Backdrop-Button (MagiC) +
    Bit 2: Shift-Click für Backdrop +
    Bit 3: "Hot" Closebox (GEM/3 und MagiC) +
    Bit 4..15: reserviert, 0 + +
    + +
    ap_gout4: wind_update 'check and set' vorhanden (1) oder nicht (0) + +
    + + +
    AES_MESSAGE (12): Nachrichten +
      + + + + + + + + + +
    ap_gout1: gesetzte Bits sind unterstützte Nachrichten: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Bit 0: WM_NEWTOP +
    Bit 1: WM_UNTOPPED +
    Bit 2: WM_ONTOP +
    Bit 3: AP_TERM +
    Bit 4: MultiTOS-Auflösungswechsel +
    Bit 5: CH_EXIT +
    Bit 6: WM_BOTTOMED +
    Bit 7: WM_ICONIFY +
    Bit 8: WM_UNICONIFY +
    Bit 9: WM_ALLICONIFY +
    Bit 10: WM_REPOSED + +
    + +
    ap_gout2: reserviert, alle 0 +
    ap_gout3: WM_ICONIFY liefert Koordinaten (1) oder nicht (0) + +
    + + +
    AES_OBJECT (13): OBJECTs +
      + + + + + + + + + + + + +
    ap_gout1: 3D-Objekte über ob_flags vorhanden (1) oder nicht (0) +
    ap_gout2: 0 - objc_sysvar nicht vorhanden +
    1 - MultiTOS 1.01 objc_sysvar +
    2 - extended objc_sysvar +
    ap_gout3: Speedo- und GDOS-Fonts im TEDINFO erlaubt (1) oder nicht (0) +
    ap_gout4: reserviert für MagiC und andere Erweiterungen, MultiTOS setzt +alle Rückgabewerte immer auf 0. In MagiC und N.AES gilt: + + + + + + + + + + + + +
    Bit 0: G_SWBUTTON vorhanden +
    Bit 1: G_POPUP vorhanden +
    Bit 2: WHITEBAK steuert Unterstriche und Buttons +
    Bit 3: G_SHORTCUT vorhanden + +
    + + +
    + + + + + + + +
    AES_FORM (14): Formulare (MagiC form_xdo und +form_xdial) +
      + + + + + + + + + + + + +
    ap_gout1: MagiC-Flydials vorhanden (1) oder nicht (0) +
    ap_gout2: MagiC-Tastaturtabellen vorhanden (1) oder nicht (0) +
    ap_gout3: letzte Cursorposition wird zurückgegeben (1) oder nicht (0) +
    ap_gout4: reserviert, 0 + +
    + + +
    AES_EXTENDED (64): Erweiterte Funktionen +
      + + + + + + + + + + + + +
    ap_gout1: shel_write(10) mit AP_AESTERM möglich (1) oder nicht (0) +
    ap_gout2: extended shel_write() SHW_SHUTDOWN(4)/SHW_RESCHANGE(5) vorhanden +(1) oder nicht (0) +
    ap_gout3: appl_search: + + + + + + +
    Bit 0: Langnamen vorhanden +
    Bit 1: Modus APP_TASKINFO vorhanden + +
    + +
    ap_gout4: form_error() mit allen GEMDOS-Fehlercodes vorhanden (1) oder +nicht (0) + +
    + + +
    AES_NAES (65): Zusätzliche N.AES Funktionen +
      + + + + + + + + + + + + +
    ap_gout1: appl_control() vorhanden (1) oder nicht (0) +
    ap_gout2: höchster Opcode für appl_control() +
    ap_gout3: shel_help() vorhanden (1) oder nicht (0) +
    ap_gout4: wind_draw() vorhanden (1) oder nicht (0) + +
    + + + +
    AES_VERSION (96): AES Version +
    There is an extended mode since XaAES from 2004-12-18. +
      + + + + + + + + + + + + +
    ap_gout1: Major version number (decimal) +
    ap_gout2: Minor version number (decimal) +
    ap_gout3: Development Status (Beta, alpha, etc.) +
    This is a 16-bit integer where bits 0-7 (the low byte) is a value +indicating the development status of the AES, see below +(AES_DEVSTATUS_xxx) for meaning of different values. Bits 8-15 are +flags, see below (AES_FDEVSTATUS_xxx) for current definitions. +
    + + + +
    AES_DEVSTATUS_ALPHA   0 +
    AES_DEVSTATUS_BETA    1 +
    AES_DEVSTATUS_RELEASE 2 +
    + +
    AES_FDEVSTATUS_STABLE 0x100 +
    ap_gout4: Zielplattform (m68k, etc.) +
    This is a value indicating which platform the AES was built for. +See below (AES_ARCH_xxx) for meaning of different values. +
    + + + + + + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    LabelWertZielplattform
    AES_ARCH_M68K0MC-68000
    AES_ARCH_M680000MC-68000
    AES_ARCH_M680101MC-68010
    AES_ARCH_M680202MC-68020
    AES_ARCH_M680303MC-68030
    AES_ARCH_M680404MC-68040
    AES_ARCH_M680605MC-68060
    AES_ARCH_M68020606MC-68020-060
    AES_ARCH_COLDFILRE7Coldfire
    +
    + + +
    + +
    Together (ap_gout1 & ap_gout2), these two +contain the decimal representation of the AES's version number. For +XaAES v0.992, ap_gout1 contains 0 (0x0000) and +ap_gout1 contains 992 (0x3e0). +
      + + +
    AES_WOPTS (97): Available WF_OPTS settings +
    since XaAES 2005-07-09 +
      + + + + + + + + + + + + +
    ap_gout1: available window options 0 - see wind_set/get(WF_OPTS, wopt0) +
    ap_gout2: available window options 1 - see wind_set/get(WF_OPTS, wopt1) +
    ap_gout3: available window options 2 - see wind_set/get(WF_OPTS, wopt2) +
    ap_gout4: reserved - always cleared + +
    + + + +
    AES_FUNCTIONS (98): Available extended AES function +
    since XaAES 2005-12-08 +
      + + + + + + + + + + + + +
    ap_gout1: + + + + + + + + + + + + +
    Bit 0: If set, the following MagiC 5.10-introduced functions exists: + + + + + + + + + + + + + + + + + + +
    objc_wdraw +
    objc_wchange +
    objc_wedit +
    graf_wwatchbox +
    form_wbutton +
    form_wkeybd + +
    + +
    Bit 1: If set, appl_options() exists. +
    Bit 2: If set, objc_data() exists. +
    Bit 3..15: Not yet defined, always reads 0. + +
    + +
    ap_gout2: Not yet defined, all bits reads 0 +
    ap_gout3: Not yet defined, all bits reads 0 +
    ap_gout4: Not yet defined, all bits reads 0 + +
    + + + +
    AES_AOPTS (99): Available application options +
    The bitmasks returned here are identical to the bitmasks used to +modify the application options via appl_options(APL_OPTS). Needless to +say, this option is not available if bit 0 in ap_gout1 is cleared +after appl_getinfo(AES_FUNCTIONS). +
    since XaAES 2005-12-08 +
      + + + + + + + + + + + + +
    ap_gout1: + + + + + + + + + +
    Bit 0: If set, extended slider management is available. +
    Bit 1: If set, extended objc_edit() cursor management is present. See +more info about this below. +
    Bit 2..15: Not yet defined, always reads 0. + +
    + +
    ap_gout2: Not yet defined, all bits reads 0 +
    ap_gout3: Not yet defined, all bits reads 0 +
    ap_gout4: Not yet defined, all bits reads 0 + +
    + + +
    AES_WINX (22360): Infos zu Erweiterungen in WINX +
    dieser Informationstyp existiert seit WINX 2.3 +
      + + + + + + + + + + + + +
    ap_gout1: Bitvektor für WF_-Funktionen in wind_get/wind_set + + + + + + + + + + + + + + + + + + + + + + + + +
    Bit 0: WF_WINX +
    Bit 1: WF_WINXCFG +
    Bit 2: WF_DDELAY +
    Bit 3: WF_SHADE +
    Bit 4: WF_STACK +
    Bit 5: WF_TOPALL +
    Bit 6: WF_BOTTOMALL +
    Bit 7: WF_KIND + +
    + +
    ap_gout2: Bitvektor für AES-Nachrichten + + + + + + + + + +
    Bit 0: Erweitertes WM_ARROWED +
    Bit 1: WM_SHADED Nachricht wird versandt +
    Bit 2: WM_UNSHADED Nachricht wird versandt + +
    + +
    ap_gout3: Bitvektor für Erweiterungen von AES-Funktionen + + + +
    Bit 0: wind_calc erlaubt WC_WIN-Modi + +
    + +
    ap_gout4: Bitvektor für allgemeine Informationen zum AES + + + +
    Bit 0: DPAT-Schreibtischhintergrund wird vom AES direkt unterstützt + +
    + + +
    + + +
    22358: XaAES +
    Wird ab dem 2004-12-18 nicht mehr unterstützt. Siehe ap_gtype += 96 +
      + + + + + + + + + + + + +
    ap_gout1: Hautpversionnummer +
    ap_gout2: Unterversionnummer +
    ap_gout3: Zielplattform für die XaAES erstellt wurde. +
    ap_gout4: Status (Beta, alpha, etc.) + +
    + +
    Hinweis: Ein Problem dieser Funktion besteht darin, +festzustellen, wann sie überhaupt aufgerufen werden darf. Zwar sollte +sie ab AES-Version 4.0 vorhanden sein, MagiC 2.0 (und auch MagiC 3.0) +besitzt aber beispielsweise die Version 3.99. Aus diesem Grund +definieren viele Programmierer die Funktion appl_xgetinfo, in der +überprüft wird, ob appl_getinfo in der aktuellen Systemumgebung +vorhanden ist. +
      +
    Hinweis: This function was backported to FreeGEM as +xapp_getinfo (opcode 1020) and exists if the ABLE_GETINFO bit is set +in the "abilities" bitmap. +
      +
    Ergebnis: Ein Rückgabewert von 0 zeigt einen Fehler an; bei einem Wert +von 1 ist kein Fehler aufgetreten. +
      +
    Verfügbar: Available as of AES version 4.00. +
      +
    Gruppe: Applikationen +
      +
    Querverweis: Binding +
      + +
    + +

    8.3.5.1 Bindings für appl_getinfo

    + + + + + + + + + +
    C: int16_t appl_getinfo ( int16_t ap_gtype, int16_t *ap_gout1, +int16_t *ap_gout2, int16_t *ap_gout3, int16_t *ap_gout4 ); +
      +
    Umsetzung: +
      +
    int16_t appl_getinfo (int16_t ap_gtype, int16_t *ap_gout1,
    +                      int16_t *ap_gout2, int16_t *ap_gout3,
    +                      int16_t *ap_gout4)
    +{
    +   int_in[0] = ap_gtype;
    +
    +   crys_if (130);
    +
    +   *ap_gout1 = int_out[1];
    +   *ap_gout2 = int_out[2];
    +   *ap_gout3 = int_out[3];
    +   *ap_gout4 = int_out[4];
    +
    +   return ( int_out[0] );
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]130 # Opcode der Funktion
    control+2control[1]1 # Einträge in int_in
    control+4control[2]5 # Einträge in int_out
    control+6control[3]0 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_inint_in[0]ap_gtype
    int_outint_out[0]Return-Wert
    int_out+2int_out[1]ap_gout1
    int_out+4int_out[2]ap_gout2
    int_out+6int_out[3]ap_gout3
    int_out+8int_out[4]ap_gout4
    +
    + + +
    + +

    8.3.5.2 appl_xgetinfo

    + +
    /* Der folgende Code testet, ob appl_getinfo in der aktuellen
    +   Systemumgebung zur Verfuegung steht, und ruft im positiven
    +   Fall die besagte Funktion auf.
    +
    +   Es bietet sich an, statt appl_getinfo nur appl_xgetinfo
    +   in eigenen Programmen zu verwenden. */
    +
    +
    +GLOBAL int16_t appl_xgetinfo ( int16_t type, int16_t *out1, int16_t *out2,
    +                            int16_t *out3, int16_t *out4 )
    +{
    +
    +   BOOLEAN has_agi = FALSE;
    +
    +   has_agi = ((_GemParBlk.global[0] == 0x399 && (is_MagiC() >= 0x0200))
    +             || (_GemParBlk.global[0] >= 0x400)
    +             || (appl_find ("?AGI") >= 0));
    +
    +   if (has_agi)
    +      return (appl_getinfo (type, out1, out2, out3, out4));
    +   else
    +      return (0);
    +} /* appl_xgetinfo */
    +
    +

    Die Abfrage is_MagiC ist eine Funktion, welche den MagiC-Cookie +auswertet und die Versionsnummer zurückliefert. Dies ist notwendig da +bereits MagiC 2 die Funktion appl_getinfo kennt, allerdings noch nicht die +Abfrage per "?AGI" erlaubt. +

    +

    Querverweis: Applikationen   GEM   Style-Guidelines +

    +

    8.3.6 appl_getinfo_str

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Application get information« - Informationen über +vorhandene Funktionsaufrufe und Eigenschaften erfragen. +
      +
    AES-Nummer: 130 +
      +
    Deklaration: int16_t appl_getinfo_str ( int16_t ap_gtype, int16_t *ap_gout1, +int16_t *ap_gout2, int16_t *ap_gout3, int16_t *ap_gout4 ); +
      +
    Beschreibung: Dies ist eine erweiterte Version von appl_getinfo. Statt der +integer Werte liefert sie Zeichenketten zurück. +
      +
    ap_gtype bestimmt die Art der Informationen, die erfragt +werden sollen. Es bedeutet: +
      +
    96: AES Version +
      + + + + + + + + + + + + +
    ap_gout1: This is a character string with a fixed length of 8 bytes, into +which the AES will write its unique AES ID. the AES ID is a +right-aligned, space padded string, and can be considered to be the +current AES's short name. For XaAES this string is filled with " +XaAES". This string is not null-terminated. +
    ap_gout2: This is a character buffer that the application must ensure can +take up to 256 (255 + 0 termination) characters. The AES fills its +long name description into this buffer. Lines in here are delimitted +using CR (ascii 13). For XaAES, this buffer contains the following +after the call; +
    "XaAES Ain't the AES, a free MultiTasking AES for +FreeMiNT" +
    ap_gout3: This is a character buffer that the application must ensure can +take up to 256 (255 + 0 termination) characters. The AES fills this +buffer with the following information where each element is delimitted +by the "|" (ascii 0x7c) character. The string is constructed +as follows; +
    "asci version|development status|architecture target| build +date & time|compiler used",0 +
    Example string returned might be; +
    "0.992|Alpha|m68k|Dec 17 2004 22:58:52|gcc 2.95.3",0 +
    ap_gout4: reserved, set to NULL. + +
    + +
    Hinweis: Ein Problem dieser Funktion besteht darin, +festzustellen, wann sie überhaupt aufgerufen werden darf. Zwar sollte +sie ab AES-Version 4.0 vorhanden sein, MagiC 2.0 (und auch MagiC 3.0) +besitzt aber beispielsweise die Version 3.99. Aus diesem Grund +definieren viele Programmierer die Funktion appl_xgetinfo, in der +überprüft wird, ob appl_getinfo in der aktuellen Systemumgebung +vorhanden ist. +
      +
    Ergebnis: Ein Rückgabewert von 0 zeigt einen Fehler an; bei einem Wert +von 1 ist kein Fehler aufgetreten. +
      +
    Verfügbar: since XaAES from 2004-12-18 +
      +
    Gruppe: Applikationen +
      +
    Querverweis: Binding   appl_getinfo +
      + +
    + +

    8.3.6.1 Bindings für appl_getinfo_str

    + + + + + + + + + +
    C: int16_t appl_getinfo_str ( int16_t ap_gtype, int16_t *ap_gout1, +int16_t *ap_gout2, int16_t *ap_gout3, int16_t *ap_gout4 ); +
      +
    Umsetzung: +
      +
    int16_t appl_getinfo_str(int16_t ap_gtype, int16_t *ap_gout1,
    +                         int16_t *ap_gout2, int16_t *ap_gout3,
    +                         int16_t *ap_gout4)
    +{
    +   int_in[0] = ap_gtype;
    +
    +   addr_in[0] = (int32_t)ap_out1;
    +   addr_in[1] = (int32_t)ap_out2;
    +   addr_in[2] = (int32_t)ap_out3;
    +   addr_in[3] = (int32_t)ap_out4;
    +
    +   crys_if (130);
    +
    +   return ( int_out[0] );
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]130 # Opcode der Funktion
    control+2control[1]1 # Einträge in int_in
    control+4control[2]1 # Einträge in int_out
    control+6control[3]4 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_inint_in[0]ap_gtype
    addr_inaddr_in[0]ap_gout1
    addr_in+4addr_in[1]ap_gout2
    addr_in+8addr_in[2]ap_gout3
    addr_in+12addr_in[3]ap_gout4
    int_outint_out[0]Return-Wert
    +
    + + +
    + +

    8.3.7 appl_getcicon

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Application get Cicon« +
      +
    AES-Nummer: 131 +
      +
    Deklaration: int16_t appl_getcicon(int16_t type,char *name,int16_t size, +int_16_t *cicon_width,int16_t *cicon_height, CICON **cicon_data); +
      +
    Beschreibung: The goal of this function is to provide cicon server (24 bit +true color for MyAES or 32 picture) This function provide only CICON +data with bitmap and mask and not a full object icon. Data provide by +this function should be relocated and copy, AES not keep in memory +CICON block provided that should be copy. +
      + + + + + + + + + + + + + + + + + + + + + + + + +
    Parameter Bedeutung +
        +
    type type&0xFF : kind of icon type: +
    + + + + + + + + + + + + + + + +
    0 : Application icon +
    1 : File extension icon +
    2 : Reserved +
    3 : Load PNG file as icon from specific path +
    4 : Other icon (any other specific icon) + +
    + +
    +
    +
    If type&0x100 = 0 cicon_data return a CICON block as need by +AES for display color icon else cicon_data return a simple bitmap +block in ARBG format with 8 bit transparency (this format is not +recognize by AES) +
    name name of the cicon to load, some exemple: +
    with type&0xFF: + + + + + + + + + + + + +
    0 : name = "purec" +
    1 : name = "html" +
    3 : name = "C:\myprog\mypng\pngname.png" +
    4 : name = "computer" + +
    + +
    size Size of the cicon to load, there is 3 different case: + + + + + + + + + +
    size > 0 is the size of the icon requested and should be a multiple of +16 +
    size = 0 the default cicon size is requested and is set by aes +configuration +
    size = -1 the return cicon can be of any size and can change from a cicon +to another + +
    + +
    cicon_width cicon width return +
    cicon_height cicon height return +
    cicon_data Return block of type CICON + mask + icon bitmap if +type&0x100 = 0 else a bitmap 32 bit with alpha channel in the +format ARGB 8 bits per channel. +
    +
    Relocation of cicon_data, cicon_data provide CICON block + mask ++ bitmap +
    +
    +
    num_planes : number of planes +
    +
    *col_data, *col_mask, *sel_data, *sel_mask: provide relative +position from the start of cicon_data and should be relocated +
    +
    +
    As the block can be free by the AES you should copy the block +for your need, the size of the block to copy is: +
    number_of_block = 0
    +if(cicon_data->col_data) number_of_block++;
    +if(cicon_data->col_mask) number_of_block++;
    +if(cicon_data->sel_data) number_of_block++;
    +if(cicon_data->sel_mask) number_of_block++;
    +
    +size = sizeof(CICON) + (cicon_data->num_planes * cicon_width * cicon_height * number_of_block)/8 + cicon_width*cicon_height;
    +
    +CICON *newcicon;
    +newcicon = malloc(size);
    +memcpy(newcicon,cicon_data);
    +if(cicon_data->col_data) newcicon->col_data += newcicon;
    +if(cicon_data->col_mask) newcicon->col_mask += newcicon;
    +if(cicon_data->sel_data) newcicon->sel_data += newcicon;
    +if(cicon_data->sel_mask) newcicon->sel_mask += newcicon;
    +
    +
    +
    +
    In the case of 32 bits bitmap size of the block = cicon_width * +cicon_height * 4 + +
    + +
    Ergebnis: Ein Fehler ist aufgetreten, wenn als Ergebnis 0 zurückgegeben +wird. Bei einem Ergebnis von 1 ist alles OK. +
      +
    Verfügbar: Seit MyAES 0.96 beta1 +
      +
    Gruppe: Applikationen +
      +
    Querverweis: Binding +
      + +
    + +

    8.3.7.1 Bindings für appl_getcicon

    + + + + + + + + + +
    C: int16_t appl_getcicon(int16_t type,char *name,int16_t size, +int_16_t *cicon_width,int16_t *cicon_height, CICON **cicon_data); +
      +
    Umsetzung: +
      +
    int16_t appl_getcicon (int16_t type,const char *name,int16_t size,
    +                        int16_t *cicon_width,int16_t *cicon_height
    +                        CICON **cicon_data)
    +{
    +   int_in[0] = type;
    +   int_in[1] = size;
    +
    +   addr_in[0] = name;
    +
    +   addr_out[0] = (void *)cicon_data;
    +
    +   crys_if (131);
    +
    +   *cicon_width = int_out[1];
    +   *cicon_height = int_out[2];
    +
    +   return ( int_out[0] );
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]131 # Opcode der Funktion
    control+2control[1]2 # Einträge in int_in
    control+4control[2]3 # Einträge in int_out
    control+6control[3]1 # Einträge in addr_in
    control+8control[4]1 # Einträge in addr_out
    int_inint_in[0]type
    int_in+2int_in[1]size
    addr_inaddr_in[0]name
    int_outint_out[0]Return-Wert
    int_out+2int_out[1]cicon_width
    int_out+4int_out[2]cicon_height
    addr_outaddr_out[0]cicon_data
    +
    + + +
    + +

    8.3.8 appl_init

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Application Initialization« - meldet die Applikation unter +AES an. +
      +
    AES-Nummer: 10 +
      +
    Deklaration: int16_t appl_init ( void ); +
    int16_t appl_init ( X_BUF_V2 *xbuf ); +
      +
    Beschreibung: Die Funktion meldet das Programm beim AES an, und initialisiert +die internen Parameterübergabefelder. +
      +
    The extra parameter to an X_BUF_V2 is an extension in the +FreeGEM AES. If addr_in[0] is set to 1 and an initialised X_BUF_V2 +structure is passed in, then on return its arch member will be 0 for +DRI GEM or ViewMAX, and 16 or 32 for FreeGEM. +
      +
    Hinweis: Die Versionsnummer des AES läßt sich nach +diesem Aufruf über das Globalfeld (global[0]) erfragen. +
      + +
    Um zu testen, ob ein Programm aus dem Auto-Ordner heraus +gestartet worden ist, bietet sich folgendes Verfahren an: +
      +
      +
    • Wert 0 in global[0] schreiben +
    • +
    • Funktion appl_init aufrufen +
    • +
    • Globalfeld (global[0]) inspizieren: steht dort immer noch eine +Null, so ist das AES noch nicht betriebsbereit, und das Programm +wurde aus dem Auto-Ordner heraus gestartet. +
    • +
    + +
    Dieses Verfahren ist zwar nicht offiziell dokumentiert, wird +aber auch im Mausbeschleuniger MACCEL von Atari so angewendet. +
      +
    KAOS-GEM 1.4.2 liefert in int_in[0] 'KA' und int_in[1] 'OS' +zurück. +
      +
    Ergebnis: Die Funktion liefert die ID der Applikation zurück. Im +Fehlerfall wird der Wert -1 zurückgegeben. +
      +
    Verfügbar: All AES versions. +
      +
    Gruppe: Applikationen +
      +
    Querverweis: Binding   appl_find   appl_search   appl_exit +
      + +
    + +

    8.3.8.1 Bindings für appl_init

    + + + + + + + + + +
    C: int16_t appl_init ( void ); +
      +
    Umsetzung: +
      +
    EXTERN AESPB c;
    +
    +int16_t appl_init (void)
    +{
    +   c.cb_pcontrol = control;
    +   c.cb_pglobal  = global;
    +   c.cb_pintin   = int_in;
    +   c.cb_pintout  = int_out;
    +   c.cb_padrin   = addr_in;
    +   c.cb_padrout  = addr_out;
    +
    +   control[4] = 0;
    +   crys_if (10);
    +
    +   return (int_out[0]);
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]10 # Opcode der Funktion
    control+2control[1]0 # Einträge in int_in
    control+4control[2]1 # Einträge in int_out
    control+6control[3]0 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_outint_out[0]Return-Wert
    +
    + + +
    + +

    8.3.9 appl_options

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »-« - +
      +
    AES-Nummer: 137 +
      +
    Deklaration: int16_t appl_options(int16_t mode, int16_t aopts0, int16_t +aopts1, int16_t aopts2, int16_t aopt3, int16_t *out0, int16_t *out1, +int16_t *out2, int16_t *out3); +
      +
    Beschreibung: Its purpose is to let application set/get options available to +it, such as the extended objc_edit mode. +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Parameter Bedeutung +
        + + +
    mode Selects the mode. If mode is AOPT_CLEAR (0), then the selected +options found in aopt0 - aopt3 is cleared, disabling then. If AOPT_SET +(1) then the selected option bit is set, enabling them. + + +
    aopt0 The first 16 of options which have the following meaning; + + + + + + +
    Bit 0 - AO0_WF_SLIDER +
    If this bit is set, blah, blah, yeah. +
    Bit 1 - AO0_OBJC_EDIT +
    If this options is enabled, objc_edit()... blah + +
    + +
    aopt1 The second group of 16 options, none of which is defined yet. +Always reads 0. +
    aopt2 The third group of 16 options, none of which is defined yet. +Always reads 0. +
    aopt3 The third group of 16 options, none of which is defined yet. +Always reads 0. +
    out0 +
    out1 +
    out2 +
    out3 + +
    + +
    Ergebnis: Return 1 = OK or 0 = error. +
      +
    Verfügbar: Das Vorhandensein der Funktion ist über appl_getinfo (Opcode 98) +nachprüfbar. +
      +
    Gruppe: Applikationen +
      +
    Querverweis: Binding +
      + +
    + +

    8.3.9.1 Bindings für appl_options

    + + + + + + + + + +
    C: int16_t appl_options(int16_t mode, int16_t aopts0, int16_t +aopts1, int16_t aopts2, int16_t aopt3, int16_t *out0, int16_t *out1, +int16_t *out2, int16_t *out3); +
      +
    Binding: +
      +
    int16_t appl_options(int16_t mode,
    +                int16_t aopts0, int16_t aopts1,
    +                int16_t aopts2, int16_t aopt3,
    +                int16_t *out0, int16_t *out1,
    +                int16_t *out2, int16_t *out3)
    +{
    +   int_in[0]  = mode;
    +   int_in[1]  = aopts0;
    +   int_in[2]  = aopts1;
    +   int_in[3]  = aopts2;
    +   int_in[4]  = aopts3;
    +
    +   crys_if(137);
    +
    +  *out0 = int_out[1];
    +  *out1 = int_out[2];
    +  *out2 = int_out[3];
    +  *out3 = int_out[4];
    +
    +  return ( int_out[0] );
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]137 # Opcode der Funktion
    control+2control[1]5 # Einträge in int_in
    control+4control[2]5 # Einträge in int_out
    control+6control[3]0 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_inint_in[0]mode
    int_in+2int_in[1]aopts0
    int_in+4int_in[2]aopts1
    int_in+6int_in[3]aopts2
    int_in+8int_in[4]aopts3
    int_outint_out[0]Return-Wert
    int_out+2int_out[1]out0
    int_out+4int_out[2]out1
    int_out+6int_out[3]out2
    int_out+8int_out[4]out3
    +
    + + +
    + +

    8.3.10 appl_read

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Application read« - empfängt eine Mitteilung einer anderen +Applikation. +
      +
    AES-Nummer: 11 +
      +
    Deklaration: int16_t appl_read ( int16_t ap_rid, int16_t ap_rlength, void +*ap_rpbuff ); +
      +
    Beschreibung: Die Funktion liest eine Anzahl von Bytes aus der Message-Pipe. +Es gilt: +
      + + + + + + + + + + + + + + + +
    Parameter Bedeutung +
        +
    ap_rid ID der Applikation, aus deren Ereignispuffer gelesen werden +soll. +
    ap_rlength Anzahl der zu lesenden Bytes +
    ap_rpbuff Adresse des Puffers, in dem die Daten abgelegt werden sollen + +
    + +
    Die Funktion wartet ggfs. bis die angeforderte Anzahl an Bytes +tatsächlich zur Verfügung steht. In MagiC und MultiTOS ist die +Funktion so erweitert worden, daß sie mit einer entsprechenden +Meldung zurückkehrt, wenn keine Daten vorhanden sind (ap_rid: +-1). +
      +
    Hinweis: appl_read arbeitet destruktiv, d.h. daß +Nachrichten nach dem Auslesen aus der Message-Pipe entfernt werden. +Dies macht es notwendig, die gelesene Nachricht so auszuwerten, wie es +beispielsweise nach einem evnt_multi-Aufruf geschieht. +
      +
    Das Vorhandensein des erweiterten Feature kann über appl_getinfo +(Opcode 6) abgefragt werden. +
      +
    Ergebnis: Wird eine Null zurückgegeben, so ist ein Fehler aufgetreten, +sonst wird eine positive Zahl als Ergebnis zurückgegeben. +
      +
    Verfügbar: In allen AES Versionen. +
      +
    Gruppe: Applikationen +
      +
    Querverweis: Binding   appl_init   appl_write   evnt_mesag   evnt_multi +
      + +
    + +

    8.3.10.1 Bindings für appl_read

    + + + + + + + + + +
    C: int16_t appl_read ( int16_t ap_rid, int16_t ap_rlength, void +*ap_rpbuff ); +
      +
    Umsetzung: +
      +
    int16_t appl_read (int16_t ap_rid, int16_t ap_rlength,
    +                   void *ap_rpbuff)
    +{
    +   int_in[0]  = ap_rid;
    +   int_in[1]  = ap_rlength;
    +   addr_in[0] = ap_rpbuff;
    +
    +   return ( crys_if(11) );
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]11 # Opcode der Funktion
    control+2control[1]2 # Einträge in int_in
    control+4control[2]1 # Einträge in int_out
    control+6control[3]1 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_inint_in[0]ap_rid
    int_in+2int_in[1]ap_rlength
    addr_inaddr_in[0]ap_rpbuff
    int_outint_out[0]Return-Wert
    +
    + + +
    + +

    8.3.11 appl_search

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Application search« - im System vorhandene Applikationen +suchen. +
      +
    AES-Nummer: 18 +
      +
    Deklaration: int16_t appl_search ( int16_t ap_smode, int8_t *ap_sname, +int16_t *ap_stype, int16_t *ap_sid ); +
      +
    Beschreibung: Je nach Parameter sucht die Funktion verschiedene im System +vorhandene Applikationen. Es bedeuten: +
      + + + + + + + + + + + + + + + + + + +
    Parameter Bedeutung +
        + + + + +
    ap_smode Suche +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    APP_FIRST0erste Applikation
    APP_NEXT1nächste Applikation
    APP_DESK2System Shell
    APP_TASKINFO0x100Taskinformation anfordern, XaAES
      Bit das hinzugefügt werden kann.
    +
    + +
    ap_sname Puffer der den Namen der gefundenen Applikation aufnimmt +(mindestens 9 Bytes). + + + + + + +
    ap_stype Typ des Prozesses als Bitvektor +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    APP_SYSTEM0x001System-Prozeß
    APP_APPLICATION0x002Applikation
    APP_ACCESSORY0x004Accessory
    APP_SHELL0x008System Shell
    APP_AESSYS0x010AES System-Prozeß, XaAES
    APP_AESTHREAD0x020AES System-Thread, XaAES
    APP_HIDDEN0x100Task ist ausgeblendet, XaAES
      nur bei APP_TASKINFO
    APP_FOCUS0x200Aktive Applikation, XaAES
      nur bei APP_TASKINFO
    +
    + +
    ap_sid ID der gefundenen Applikation + +
    + +
    Es ist möglich der Langname einer Applikation zu ermittelt, +wenn man ihre Applikations-ID kennt. +
      +
    Der Langname ist derjenige, der von der Applikation bei einem +menu_register()- Aufruf übergeben wurde und auch in der Menüleiste +dargestellt wird. +
      +
    Kennt man die Applikations-ID apid einer Anwendung, so wird ihr +Langname durch folgenden Aufruf von appl_search in den Buffer langname +übertragen: +
      +
    appl_search(-apid, &langname[0], &typ, &pid) +
      +
    type ist hierbei die auch normalerweise gelieferte +Bitmaske des Applikationstyps, pid die MiNT-pid (nicht: apid) der +Applikation. +
      +
    Als erster Parameter ist also der negative Wert der +Applikations-ID zu übergeben, um den Langnamen eben dieser +Applikation zu ermitteln. Dieser Name kann maximal 32 Zeichen lang +sein (31 Zeichen plus ein Nullbyte), man sollte also einen +entsprechend großen Buffer für langname reservieren. +
      +
    APP_TASKINFO liefert automatisch den Langnamen einer Applikation +und steht nur unter XaAES zur Verfügung. +
      +
    Mit dieser Routine können keine Threads gefunden +werden. +
      + + + +
    Geneva have three extra modes: +
      +
      +
    • X_APS_CHEXIT (-1) +
      Retrieves the name, ID, and type of the last application to exit. +This makes it possible for a program which receives a CH_EXIT notice +to determine the name of the program which exited. Note that this +information is not buffered; this means that if one process terminates +and its parent does not make the appl_search() call before a second +one does, the information will no longer reflect the first process +which terminated. +
        +

    • +
    • X_APS_CHILD0 (0x7100) +
      Retrieve the data concerning the child of the current application +which has the lowest application ID. (This is not necessarily the +first child application the parent ran.) +
        +

    • +
    • X_APS_CHILD (0x7101) +
      Retrieve the data for each additional child of the current +application. +
        +

    • +
    + +
    Ergebnis: Die Funktion liefert den Wert 1, wenn kein Fehler aufgetreten +ist, bzw. den Wert 0, wenn keine weiteren Applikationen vorhanden +sind. +
      +
    Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 4) +festgestellt werden. Die Ermittlung des Langname und Taskinformationen +erkennt man an appl_getinfo (Opcode 64). +
      +
    Gruppe: Applikationen +
      +
    Querverweis: Binding   appl_find   Broadcasting +
      + +
    + +

    8.3.11.1 Bindings für appl_search

    + + + + + + + + + +
    C: int16_t appl_search ( int16_t ap_smode, int8_t *ap_sname, +int16_t *ap_stype, int16_t *ap_sid ); +
      +
    Umsetzung: +
      +
    int16_t appl_search (int16_t ap_smode, int8_t *ap_sname,
    +                     int16_t *ap_stype, int16_t *ap_sid)
    +{
    +   int_in[0]  = ap_smode;
    +   addr_in[0] = ap_sname;
    +
    +  crys_if(18);
    +
    +  *ap_stype = int_out[1];
    +  *ap_sid   = int_out[2];
    +
    +   return ( int_out[0] );
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]18 # Opcode der Funktion
    control+2control[1]1 # Einträge in int_in
    control+4control[2]3 # Einträge in int_out
    control+6control[3]1 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_inint_in[0]ap_smode
    addr_inaddr_in[0]ap_sname
    int_outint_out[0]Return-Wert
    int_out+2int_out[1]ap_stype
    int_out+4int_out[2]ap_sid
    +
    + + +
    + +

    8.3.12 appl_tplay

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Application play« - spielt aufgezeichnete AES-Ereignisse +ab. +
      +
    AES-Nummer: 14 +
      +
    Deklaration: int16_t appl_tplay ( APPLRECORD *ap_tpmem, int16_t ap_tpnum, +int16_t ap_tpscale ); +
      +
    Beschreibung: Die Funktion bietet die Möglichkeit, aufgezeichnete +Benutzeraktionen wieder abzuspielen. Es gilt: +
      + + + + + + + + + + + + + + + +
    Parameter Bedeutung +
        +
    ap_tpmem Adresse des Puffers, in welchem sich die abzuspielenden +Ereignisse befinden +
    ap_tpnum Anzahl der auszuführenden Ereignisse +
    ap_tpscale Geschwindigkeitsfaktor für das Abspielen der Ereignisse. Ein +Wert von 100 steht für normale Geschwindigkeit + +
    + +
    Ergebnis: Als Ergebnis wird immer der Wert 1 zurückgegeben. +
      +
    Verfügbar: All AES versions. +
      +
    Gruppe: Applikationen +
      +
    Querverweis: Binding   appl_trecord +
      + +
    + +

    8.3.12.1 Bindings für appl_tplay

    + + + + + + + + + +
    C: int16_t appl_tplay ( APPLRECORD *ap_tpmem, int16_t ap_tpnum, +int16_t ap_tpscale ); +
      +
    Umsetzung: +
      +
    int16_t appl_tplay (APPLRECORD *ap_tpmem, int16_t ap_tpnum,
    +                    int16_t ap_tpscale)
    +{
    +   int_in[0]  = ap_tpnum;
    +   int_in[1]  = ap_tpscale;
    +   addr_in[0] = ap_tpmem;
    +
    +   return ( crys_if(14) );
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]14 # Opcode der Funktion
    control+2control[1]2 # Einträge in int_in
    control+4control[2]1 # Einträge in int_out
    control+6control[3]1 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_inint_in[0]ap_tpnum
    int_in+2int_in[1]ap_tpscale
    addr_inaddr_in[0]ap_tpmem
    int_outint_out[0]Return-Wert
    +
    + + +
    + +

    8.3.13 appl_trecord

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Application record« - nimmt AES-Ereignisse auf. +
      +
    AES-Nummer: 15 +
      +
    Deklaration: int16_t appl_trecord ( APPLRECORD *ap_tbuffer, int16_t +ap_trcount ); +
      +
    Beschreibung: Die Funktion dient zum Speichern von Benutzeraktionen, um diese +später wieder abzuspielen. Es gilt: +
      + + + + + + + + + + + + +
    Parameter Bedeutung +
        +
    ap_tbuffer Adresse des Speicherbereichs, in dem die Ereignisse abgelegt +werden sollen +
    ap_trcount Anzahl der zu speichernden Ereignisse + +
    + +
    Ergebnis: Als Ergebnis wird die Anzahl der tatsächlich aufgezeichneten +Ereignisse zurückgeliefert. +
      +
    Verfügbar: All AES versions. Die Funktion ist erst ab GEM-Version 1.2 +richtig implementiert. +
      +
    Gruppe: Applikationen +
      +
    Querverweis: Binding   appl_tplay +
      + +
    + +

    8.3.13.1 Bindings für appl_trecord

    + + + + + + + + + +
    C: int16_t appl_trecord ( APPLRECORD *ap_tbuffer, int16_t +ap_trcount ); +
      +
    Umsetzung: +
      +
    int16_t appl_trecord (APPLRECORD *ap_tbuffer,
    +                      int16_t ap_trcount)
    +{
    +   int_in[0]  = ap_trcount;
    +   addr_in[0] = ap_tbuffer;
    +
    +   return ( crys_if(15) );
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]15 # Opcode der Funktion
    control+2control[1]1 # Einträge in int_in
    control+4control[2]1 # Einträge in int_out
    control+6control[3]1 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_inint_in[0]ap_trcount
    addr_inaddr_in[0]ap_tbuffer
    int_outint_out[0]Return-Wert
    +
    + + +
    + +

    8.3.14 appl_write

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Application write« - sendet eine Mitteilung an eine andere +Applikation. +
      +
    AES-Nummer: 12 +
      +
    Deklaration: int16_t appl_write ( int16_t ap_wid, int16_t ap_wlength, void +*ap_wpbuff ); +
      +
    Beschreibung: Die Funktion schreibt eine Anzahl von Bytes in eine +Message-Pipe. Es gilt: +
      + + + + + + + + + + + + + + + +
    Parameter Bedeutung +
        +
    ap_wid ID der Applikation, zu der die Nachricht geschickt werden soll +
    ap_wlength Anzahl der zu sendenden Bytes +
    ap_wpbuff Adresse des Puffers mit der zu übertragenden Nachricht + +
    + +
    Hinweis: Durch diese Funktion besitzt eine Applikation +auch die Möglichkeit, sich selbst eine Redraw-Nachricht zukommen zu +lassen. Ab MagiC Version 4.0 gilt: besitzt der Parameter +ap_wid den Wert -2, so zeigt ap_wpbuff auf eine +XAESMSG-Struktur. +
      +
    Ergebnis: Wird eine Null zurückgegeben, so ist ein Fehler aufgetreten, +sonst wird eine positive Zahl als Ergebnis zurückgegeben. +
      +
    Verfügbar: All AES versions. +
      +
    Gruppe: Applikationen +
      +
    Querverweis: Binding   appl_init   appl_read   appl_find   Nachrichten +
      + +
    + +

    8.3.14.1 Bindings für appl_write

    + + + + + + + + + +
    C: int16_t appl_write ( int16_t ap_wid, int16_t ap_wlength, void +*ap_wpbuff ); +
      +
    Umsetzung: +
      +
    int16_t appl_write (int16_t ap_wid, int16_t ap_wlength,
    +                    void *ap_wpbuff)
    +{
    +   int_in[0]  = ap_wid;
    +   int_in[1]  = ap_wlength;
    +   addr_in[0] = ap_wpbuff;
    +
    +   return ( crys_if(12) );
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]12 # Opcode der Funktion
    control+2control[1]2 # Einträge in int_in
    control+4control[2]1 # Einträge in int_out
    control+6control[3]1 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_inint_in[0]ap_wid
    int_in+2int_in[1]ap_wlength
    addr_inaddr_in[0]ap_wpbuff
    int_outint_out[0]Return-Wert
    +
    + + +
    + +

    8.3.15 appl_xbvget

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Extended application bit-vector get« - ermittelt die +angeschlossenen logischen Laufwerke für die Dateiauswahlbox +
      +
    AES-Nummer: 18 +
      +
    Deklaration: int16_t appl_xbvget ( uint32_t *bvdisk, uint32_t *bvhard ); +
      +
    Beschreibung: Die Funktion ermittelt die Liste der vorhandenen logischen +Laufwerke, die u.a. für die Dateiauswahl-box (Fileselector) verwendet +werden. Es gilt: +
      + + + + + + + + + + + + +
    Parameter Bedeutung +
        +
    bvdisk Bitvektor der vorhandenen Diskettenlaufwerke (Bit-31 = +Laufwerk-A etc). +
    bvhard Bitvektor der vorhandenen Festplattenlaufwerke (Bit-31 = +Laufwerk-A etc). + +
    + +
    Ergebnis: Als Ergebnis wird immer eine 1 zurückgegeben. +
      +
    Verfügbar: GEM/4, GEM/5 und FreeGEM. +
      +
    The function to do this is present on FreeGEM if the ABLE_XBVSET +bit is set in the "abilities" bitmap. +
      +
    Gruppe: Applikationen +
      +
    Querverweis: Binding   appl_bvset   appl_xbvset +
      + +
    + +

    8.3.15.1 Bindings für appl_xbvget

    + + + + + + + + + +
    C: int16_t appl_xbvget ( uint32_t *bvdisk, uint32_t *bvhard ); +
      +
    Umsetzung: +
      +
    int16_t appl_xbvget (uint32_t *bvdisk, uint32_t *bvhard)
    +{
    +   int_in[0]  = 0;
    +
    +   crys_if(18);
    +
    +   *bvdisk = int_out[1..2];
    +   *bvhard = int_out[3..4];
    +
    +   return ( int_out[0] );
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]18 # Opcode der Funktion
    control+2control[1]1 # Einträge in int_in
    control+4control[2]5 # Einträge in int_out
    control+6control[3]0 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_outint_out[0]Return-Wert
    int_out+2int_out[1..2]bvdisk
    int_out+6int_out[3..4]bvhard
    +
    + + +
    + +

    8.3.16 appl_xbvset

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Extended application bit-vector set« +
      +
    AES-Nummer: 18 +
      +
    Deklaration: int16_t appl_xbvset ( uint32_t bvdisk, uint32_t bvhard ); +
      +
    Beschreibung: Die Funktion informiert das GEM über die vorhandenen logischen +Laufwerke, die u.a. für die Dateiauswahl-box (Fileselector) benötigt +werden. Es gilt: +
      + + + + + + + + + + + + +
    Parameter Bedeutung +
        +
    bvdisk Bitvektor der vorhandenen Diskettenlaufwerke (Bit-31 = +Laufwerk-A etc). +
    bvhard Bitvektor der vorhandenen Festplattenlaufwerke (Bit-31 = +Laufwerk-A etc). + +
    + +
    Ergebnis: Der Rückgabewert der Funktion ist z.Zt. nicht bekannt. +
      +
    Verfügbar: GEM/4, GEM/5 und FreeGEM. +
      +
    The function to do this is present on FreeGEM if the ABLE_XBVSET +bit is set in the "abilities" bitmap. +
      +
    Gruppe: Applikationen +
      +
    Querverweis: Binding   appl_bvset   appl_xbvget +
      + +
    + +

    8.3.16.1 Bindings für appl_xbvset

    + + + + + + + + + +
    C: int16_t appl_xbvset ( uint32_t bvdisk, uint32_t bvhard ); +
      +
    Umsetzung: +
      +
    int16_t appl_xbvset (uint32_t bvdisk, uint32_t bvhard)
    +{
    +   int_in[0]  = 1;
    +   addr_in[0] = bvdisk;
    +   addr_in[1] = bvhard;
    +
    +   return ( crys_if(18) );
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]18 # Opcode der Funktion
    control+2control[1]1 # Einträge in int_in
    control+4control[2]1 # Einträge in int_out
    control+6control[3]2 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    addr_inaddr_in[0]bvdisk
    addr_in+4addr_in[1]bvhard
    int_outint_out[0]Return-Wert
    +
    + + +
    + +

    8.3.17 appl_yield

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Application yield« - Prozeßwechsel erzwingen +
      +
    AES-Nummer: 17 +
      +
    Deklaration: int16_t appl_yield ( void ); +
      +
    Beschreibung: Mit Hilfe dieser Funktion kann ein AES-Prozeßwechsel erzwungen +werden. +
      +
    Hinweis: Dies kann analog durch einen kurzen Aufruf der +Funktion evnt_timer erreicht werden. +
      +
    Ergebnis: Der Rückgabewert der Funktion ist z.Zt. nicht bekannt. +
      +
    Verfügbar: Die Funktion steht nur unter PC-GEM, Geneva, sowie MagiC +(jeweils) ab Version 2.0, N.AES und XaAES zur Verfügung. +
      +
    Gruppe: Applikationen +
      +
    Querverweis: Binding   evnt_timer   _appl_yield +
      + +
    + +

    8.3.17.1 Bindings für appl_yield

    + + + + + + + + + +
    C: int16_t appl_yield ( void ); +
      +
    Umsetzung: +
      +
    int16_t appl_yield (void)
    +{
    +   return ( crys_if(17) );
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]17 # Opcode der Funktion
    control+2control[1]0 # Einträge in int_in
    control+4control[2]1 # Einträge in int_out
    control+6control[3]0 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_outint_out[0]Return-Wert
    +
    + + +
    + +

    8.3.18 _appl_yield

    + + + + + + + + + + + + + + + + + + + + + +
    Name: »Application yield« - Prozeßwechsel erzwingen +
      +
    Deklaration: void _appl_yield ( void ); +
      +
    Beschreibung: Mit Hilfe dieser Funktion kann ein AES-Prozeßwechsel erzwungen +werden. +
      +
    Hinweis: Dies kann analog durch einen kurzen Aufruf der +Funktion evnt_timer oder appl_yield erreicht werden. +
      +
    Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
      +
    Verfügbar: Die Funktion ist verfügbar seit TOS 1.0, KAOS und MagiC seit +Version 1.0. +
      +
    Gruppe: Applikationen +
      +
    Querverweis: Binding   evnt_timer   appl_yield +
      + +
    + +

    8.3.18.1 Bindings für _appl_yield

    + + + + + + +
    C: void _appl_yield ( void ); +
      +
    Umsetzung: +
      +
    _appl_yield:    move.l  a2,-(sp)
    +                move.w  #201,d0         ; _appl_yield()
    +                trap    #2
    +                movea.l (sp)+,a2
    +                rts
    +
    + +
    + +

    8.3.19 x_appl_flags

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Control execution flags« - Get or set program flags +
      +
    AES-Nummer: 28928 +
      +
    Deklaration: int16_t x_appl_flags( int16_t getset, int16_t index, APPFLAGS +*flags ); +
      +
    Beschreibung: The call x_appl_flags controls the execution flags that are +used when determining how an application gets run. It works in two +modes, globally and for a particular application. +
      + + + + + + + + + + + + + + + + + + +
    Mode 0: Get by index +
    Get the 'nth' block of global application flags. If index +is zero, the Default flags will be retrieved. If flags is not +NULL, the flags will be copied into the APPFLAGS structure pointed to by +the flags parameter. +
      +
    Mode 1: Set by index +
    Set the 'nth' block of global application flags. If flags +is not NULL, the flags will be copied from the APPFLAGS structure +pointed to by the flags parameter. If index is zero, +the Default flags will be set, in which case the name and +desc fields of the APPFLAGS are not altered. If index +is less than zero, a new APPFLAGS structure will be added to the end +of the global list, and it will be given the contents of +flags. +
      +
    Mode 2: Delete by index +
    Delete the 'nth' block of global application flags. The +index parameter must be a number greater than zero (since the +Default flags cannot be deleted.) The flags parameter is not +used in this mode. +
      +
    Mode 3: Get by application ID +
    Get the application flags for a particular process. index +must be a valid application ID. If flags is not NULL, the +flags will be copied into the APPFLAGS structure pointed to by the +flags parameter. +
      +
    Mode 4: Set by application ID +
    Set the application flags for a particular process. index +must be a valid application ID. If flags is not NULL, the +flags will be set for the application. +
      + +
    Mode 5: (X_APF_SEARCH) (since Release 004) +
    Use the APPFLAGS name element to search for the set of +flags that would be used by Geneva were it to run the application with +that name. Note that the name element is overwritten in the +process. The index parameter is not used. +
      +
    Example: Get the flags for FOO.PRG and force it to run +in single-tasking mode: +
      +
    APPFLAGS a;
    +SHWRCMD shwrcmd;
    +
    +strcpy( a.name, "FOO.PRG" );
    +x_appl_flags( X_APF_SEARCH, 0, &a );
    +a.flags.s.multitask = 0;
    +shwrcmd.name = "FOO.PRG";
    +shwrcmd.app_flags = a.flags.l;
    +shel_write( XSHD_FLAGS|XSHW_RUNANY,
    +            0, 0, (char *)&shwrcmd, "" );
    +
    + +
    + +
    Note: Changing the multitask attribute of an application +in this manner will have no effect, since this can only be changed +before the application is launched. +
      +
    Descriptions of each of the available flags can be found in the +section of the manual describing the Task Manager's "Flags" +dialog. +
      +
    Ergebnis: 0 = Out of memory (mode 1) +
        Flags not found (all modes) +
      +
    Verfügbar: Die Funktion steht nur unter Geneva zur Verfügung. +
      +
    Gruppe: Applikationen +
      +
    Querverweis: Binding +
      + +
    + +

    8.3.19.1 Bindings für x_appl_flags

    + + + + + + + + + +
    C: int16_t x_appl_flags( int16_t getset, int16_t index, APPFLAGS +*flags ); +
      +
    Umsetzung: +
      +
    int16_t x_appl_flags( int16_t getset, int16_t index,
    +                      APPFLAGS *flags )
    +{
    +   int_in[0]  = getset;
    +   int_in[1]  = index;
    +   addr_in[0] = flags;
    +   return ( crys_if(28928) );
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]28928 # Opcode der Funktion
    control+2control[1]2 # Einträge in int_in
    control+4control[2]1 # Einträge in int_out
    control+6control[3]1 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_inint_in[0]getset
    int_in+2int_in[1]index
    addr_inaddr_in[0]flags
    int_outint_out[0]Return-Wert
    +
    + + +
    + +

    8.3.20 x_appl_font

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Change font and window borders« - (Geneva) +
      +
    AES-Nummer: 28929 +
      +
    Deklaration: int16_t x_appl_font( int16_t getset, int16_t zero, XFONTINFO +*info ); +
      +
    Beschreibung: Change the characteristics of the large font used by Geneva, +and also the window gadget borders. +
      +
    This function gives one control over what font is used to +display characters in the menu bar, dialogs, etc. +
      +
    When Geneva first runs, it checks to see if the font ID saved in +GENEVA.CNF is anything other than 1 (for a system font). If so, and +GDOS is present, it loads all available fonts, and uses the correct +font. If the particular font is not available, it reverts to the +system font. +
      +
    Regardless of the font's availability, the closest point size to +the one specified is used. The window gadgets will have a width which +is equal to the width of one character in the font, plus the value +specified by the user. A similar calculation is used for the gadget +height. +
      +
    When any element in the structure pointed to by info is -2, the +default value for that element (as though there had been no GENEVA.CNF +file when Geneva loaded) is used; in the case of a getset +value of zero (get), this default value is returned in the info +structure. +
      +
    When getset is 1 and any element is -1, that element +will cause Geneva to ignore the setting, leaving the old value in +tact. +
      +
    Setting these values will have no immediate effect. The +GENEVA.CNF file must be re-saved, and Geneva must be restarted before +a change can be noticed. +
      +
    This example: +
      +
    XFONTINFO info = { -2, -2, -2, -2 };
    +x_appl_font( 0, 0, &info ); /* get default values            */
    +x_appl_font( 1, 0, &info ); /* set to these values           */
    +
    +Is the same as:
    +
    +XFONTINFO info = { -2, -2, -2, -2 };
    +x_appl_font( 1, 0, &info ); /* set to default values         */
    +
    +Set it to something else:
    +
    +XFONTINFO info = { 1,       /* Select the system font        */
    +                  10,       /* 10 point (8 x 16)             */
    +                   5,       /* Gadget width = 8 + 5 pixels   */
    +                   4 };     /* Gadget height = 16 + 4 pixels */
    +x_appl_font( 1, 0, &info );
    +
    +
    Cautions: +
      +
      +
    • Only monospaced fonts should be used. +
        +

    • +
    • While Geneva will work properly with any size font, some +programs may not function properly with larger or smaller fonts. This +is especially true when it comes to fonts which are more than 8 pixels +wide. +
        +

    • +
    + +
    The parameter zero is reserved for future expansion. +Must always be 0. +
      +
    Ergebnis: Return value of the function is unknown at present. +
      +
    Verfügbar: Die Funktion steht nur unter Geneva zur Verfügung. +
      +
    Gruppe: Applikationen +
      +
    Querverweis: Binding +
      + +
    + +

    8.3.20.1 Bindings für x_appl_font

    + + + + + + + + + +
    C: int16_t x_appl_font( int16_t getset, int16_t zero, XFONTINFO +*info ); +
      +
    Umsetzung: +
      +
    int16_t x_appl_font( int16_t getset, int16_t zero,
    +                     XFONTINFO *info );
    +{
    +   int_in[0]  = getset;
    +   int_in[1]  = zero;
    +   addr_in[0] = info;
    +   return ( crys_if(28929) );
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]28929 # Opcode der Funktion
    control+2control[1]2 # Einträge in int_in
    control+4control[2]1 # Einträge in int_out
    control+6control[3]1 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_inint_in[0]getset
    int_in+2int_in[1]zero
    addr_inaddr_in[0]info
    int_outint_out[0]Return-Wert
    +
    + + +
    + +

    8.3.21 x_appl_sleep

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Put application to sleep« - or wake it up +
      +
    AES-Nummer: 28930 +
      +
    Deklaration: int16_t x_appl_sleep( int16_t id, int16_t sleep ); +
      +
    Beschreibung: The call x_appl_sleep searches for the application whose ID +(found by appl_find or appl_search) is id and either puts it +to sleep or wakes it up. While an application is asleep, its windows +are automatically closed, and it does not receive any events. +
      +

    +
    + + + + + + + + + + + + + + + + +
    ParameterBedeutung
    sleep0: Awaken application
      1: Put application to sleep
     -1: No change
    +
    + +
    The old state of wakefulness is always returned, unless an error +occurs. There are several situations where an error code will be +returned: +
      +
      +
    • There is no application with the ID specified. +
    • +
    • The application was the only program awake and the user tried +to put it to sleep. +
    • +
    • The application has a single-tasking child. +
    • +
    + +
    If an application puts itself to sleep, it will not be able to +wake itself; this must be done by another application or by the user +from the Desk menu. +
      +
    If an application which is asleep is about to be terminated for +any reason, it is first awakened, so that it can receive the AP_TERM +message. +
      +
    Ergebnis: -1: Application not found, or the state could not be changed +
      +

    +
    + + + + + + + + +
    bit 0 set:The application is multitasking
    bit 1 set:The application is single-tasking
    +
    + +
    Verfügbar: Die Funktion steht nur unter Geneva zur Verfügung. +
      +
    Gruppe: Applikationen +
      +
    Querverweis: Binding +
      + +
    + +

    8.3.21.1 Bindings für x_appl_sleep

    + + + + + + + + + +
    C: int16_t x_appl_sleep( int16_t id, int16_t sleep ); +
      +
    Umsetzung: +
      +
    int16_t x_appl_sleep( int16_t id, int16_t sleep );
    +{
    +   int_in[0]  = id;
    +   int_in[1]  = sleep;
    +   return ( crys_if(28930) );
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]28930 # Opcode der Funktion
    control+2control[1]2 # Einträge in int_in
    control+4control[2]1 # Einträge in int_out
    control+6control[3]0 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_inint_in[0]id
    int_in+2int_in[1]sleep
    int_outint_out[0]Return-Wert
    +
    + + +
    + +

    8.3.22 x_appl_term

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Terminate application« - Terminate an application and remove +it from memory (Geneva). +
      +
    AES-Nummer: 28931 +
      +
    Deklaration: int16_t x_appl_term( int16_t apid, int16_t retrn, int16_t +set_me ); +
      +
    Beschreibung: The call x_appl_term will cause an application to terminate. It +is similar to shel_write mode 4, except that it allows for just one +application to be terminated. +
      +
      +
    • apid is the application ID of the application to be +terminated. +
    • +
    • retrn is a value which is returned to the program which +launched the application; this should usually correspond to a GEMDOS +error number, or 0 for no error. +
    • +
    • The set_me parameter must always be non-zero. +
    • +
    + +
    If the application to be terminated does not recognize the +AP_TERM message, the user will first be presented with an alert box +confirming that he wants to terminate. +
      +
    Ergebnis: 0 = Die Applikation wurde nicht gefunden +
      +
    Verfügbar: Die Funktion steht nur unter Geneva zur Verfügung. +
      +
    Gruppe: Applikationen +
      +
    Querverweis: Binding +
      + +
    + +

    8.3.22.1 Bindings für x_appl_term

    + + + + + + + + + +
    C: int16_t x_appl_term( int16_t apid, int16_t retrn, int16_t +set_me ); +
      +
    Umsetzung: +
      +
    int16_t x_appl_term( int16_t apid, int16_t retrn,
    +                     int16_t set_me )
    +{
    +   int_in[0]  = apid;
    +   int_in[1]  = retrn;
    +   int_in[2]  = set_me;
    +   return ( crys_if(28931) );
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]28931 # Opcode der Funktion
    control+2control[1]3 # Einträge in int_in
    control+4control[2]1 # Einträge in int_out
    control+6control[3]0 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_inint_in[0]apid
    int_in+2int_in[1]retrn
    int_in+4int_in[2]set_me
    int_outint_out[0]Return-Wert
    +
    + + +
    + +

    8.3.23 xappl_getinfo

    + + + + + + + + + + + + +
    Name: »Application get information« - Inquire information about +available function calls and properties of the AES. +
      +
    Opcode: 1020 +
      +
    Syntax: int16_t xappl_getinfo ( int16_t ap_gtype, int16_t *ap_gout1, +int16_t *ap_gout2, int16_t *ap_gout3, int16_t *ap_gout4 ); +
      +
    Description: This is the GEM/3 equivalent of appl_getinfo() for the Atari. +It has a different name because internally it uses a different opcode +(130, which is used in the Atari AES, is already assigned to +xgrf_stepcalc() in GEM/3) +
      + +
    + +
    + +Home +AESAES +Grundlagen des AESGrundlagen des AES +DateiauswahlDateiauswahl + + diff --git a/de/ascii.html b/de/ascii.html new file mode 100644 index 000000000..0cc926fe4 --- /dev/null +++ b/de/ascii.html @@ -0,0 +1,514 @@ + + + + + +Die Anleitung zum TOS: ASCII-Tabelle + + + + + + + + + +Home +Inhaltsverzeichnis +XSSI-ProtokollXSSI-Protokoll +Der Scan-CodeDer Scan-Code + +
    + +

    A ASCII-Tabelle

    +

    Der ASCII-Code (American Standard Code for Information +Interchange) ist ein 7-Bit-Code, und umfaßt dem entsprechend +128 Zeichen. Das achte Bit kann entweder auf Null gesetzt, +für Erweiterungen (Zeichen ab 128 sind dann allerdings nicht mehr +genormt) oder für die Parität benutzt werden. Im letzteren +Fall wären damit alle (2n+1) Bitfehler erkennbar. Der Code ist wie +folgt definiert: +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    HexDezASCIIHexDezASCIIHexDezASCIIHexDezASCII
    000NUL2032SPACE4064@6096'
    011SOH2133!4165A6197a
    022STX2234"4266B6298b
    033ETX2335#4367C6399c
    044EOT2436$4468D64100d
    055ENQ2537%4569E65101e
    066ACK2638&4670F66102f
    077BEL2739'4771G67103g
    088BS2840(4872H68104h
    099HT2941)4973I69105i
    0A10LF2A42*4A74J6A106j
    0B11VT2B43+4B75K6B107k
    0C12FF2C44,4C76L6C108l
    0D13CR2D45-4D77M6D109m
    0E14SO2E46.4E78N6E110n
    0F15SI2F47/4F79O6F111o
    1016DLE304805080P70112p
    1117DC1314915181Q71113q
    1218DC2325025282R72114r
    1319DC3335135383S73115s
    1420DC4345245484T74116t
    1521NAK355355585U75117u
    1622SYN365465686V76118v
    1723ETB375575787W77119w
    1824CAN385685888X78120x
    1925EM395795989Y79121y
    1A26SUB3A58:5A90Z7A122z
    1B27ESC3B59;5B91[7B123{
    1C28FS3C60<5C92\7C124|
    1D29GS3D61=5D93]7D125}
    1E30RS3E62>5E94^7E126~
    1F31US3F63?5F95_7F127DEL
    +
    + +

    Hinweis: Weitere wichtige Codierungen sind der BCD-Code, +EBCIDIC, UNICODE, sowie ISO-Latin (ein 8-Bit-Zeichensatz mit +europäischen Sonderzeichen). Die Zeichen zwischen 32 und 127 des +ASCII-Codes entsprechen übrigens den Definitionen im +Systemzeichensatz des Atari. +

    +

    Querverweis: Tabelle der Scan-Codes +

    +
    + +Home +Inhaltsverzeichnis +XSSI-ProtokollXSSI-Protokoll +Der Scan-CodeDer Scan-Code + + diff --git a/de/bilder/gif/alert_bomb.gif b/de/bilder/gif/alert_bomb.gif new file mode 100644 index 0000000000000000000000000000000000000000..0a00bcec38393becbb3e5f63b88c27fbe76aaae4 GIT binary patch literal 309 zcmZ?wbh9u|RA5kG_{_lY9|#zL6p#U;fHaUefBt+e5C8>g86XsphOl&if2}dLese2d`;o*6JXdNI zl5*Nu{;+YfY^&@J>siR0y7iP|>yAt>o5+aphU@PI946Zw_tW+Jx%9E7fuTr=vsj}j zJBK6(dr)g!LT9%me>X>`#Uzm_Q#rbGgeK^9ESlOgzh%}^hPlgCg%@im8m^zZ%6Ycf zHpv}$?m?bV8VXu*TGPgoipNYX50J`ad*8l(j literal 0 HcmV?d00001 diff --git a/de/bilder/gif/alert_system.gif b/de/bilder/gif/alert_system.gif new file mode 100644 index 0000000000000000000000000000000000000000..06fab3d38630f0ca577b563bb5a0f470fcbf00dd GIT binary patch literal 268 zcmZ?wbh9u|RA5kG_{_lY9|#zL6p#U;fHaUefBt+e5C8>g86XsphOl&ife>f^7uab;HZmJ011 z3e8Ssy?yXbudG?F!H}#bimd4#~yx;NgiKHNdH2?rB Bb4>sM literal 0 HcmV?d00001 diff --git a/de/bilder/gif/aligment.gif b/de/bilder/gif/aligment.gif new file mode 100644 index 0000000000000000000000000000000000000000..0fae75acadc076b38dcbee2b5dc0aa6052070cdc GIT binary patch literal 3043 zcmaJ=c{o&k8y=}_MY4w)4TaDmV~a|%B(z9b-pOEw8MA1NQPv0{+4sG~Xsj87P?9Xe zSjrYs*3a0&AiMc^D}CPU`rh-$d4A`9o_jgxdXBEXj*2prd)G6-A^^Z-G69KNZ7c0){jJGs07b)a&_7}#JH>vsw^RhSRen*nBFX*Bm-~k@3$Gyzjm16q zzg9onJFR|EwygLJVffA0N5TFGi0;h#dtggKXglq1^zYYI_?NufgTJT%mV?(&SUetv z`{VeJ&HB~fGW@eyze!u6|828=&u!a@8(^_GTLcD*hhdx^IN@Pv7*K9&`?vlDHg+a} zgHxmG zl1VOBUjbbESz9OK7`BZ;iVm6+i>HShpYmNPo;0%>Ys$L$Xlm_2-b4!yDrAc;qo6xV zooq5ZUKe9O7IH8=*DXqBhYTNo`@a8N@yrM@+#uD+WEo41PPVfPNiJKQR?T%{@@OWy z&(4lkW#2W9bf(kU(jV*a98z3eT{1kAxu$|+_PF!1S-C6=*!S!2KAhF>qc2t8|L6e8 z7UIiqD*V+~5S}&QFGipbJO&;fwF;1oVdwQfmYFpeBv-7$8>CQsXE5MQr~S}VmH%W7 zg_M1)9|~QnVjm9E7Bow-(>wNZIN~aJY&i0oj?74ui78?v`i?om)=�aw`@Rvl|{q z4d-Z!gUkBC6AtH6Gp}Rba>ORxs?i^{b}@q4S!)KVLQ@5%;_ZxmIKioU+}3Q;m;Ja& zH`BeU*ls)zD;$wFiSCiI@+c4=m+@jET!zC7#a#z8jA7=n4~c#~<6aRlOrcaa*P5O% zQdWcSgn3Sc-JSf=>$0*Qi75#uZkCf4kdBpFC6=yaZZ0_|UMV+}LFaR+BUv6*D{_>k z%jJCznQBo}l!KnPYoo?-~;R`D%C2W-j z{lzS57T=H4!NI1nxC`kHXOp#iNnx!TYLucRP4#s~ySaP=Unh!z za;`LIgQtD~<@V-2u)%hr{UDb-96mqH*l*Xpl;Qyn+PGmq*M&7;juM>lm&%KCHvCE# zzj-_fD805DizJo%^{$gE96^E%PnxyncuV5w7uAQU4wI^*FG4YD^o(@RGCHZGd1WHj zPQi`-s;&7>VxFhk@_Ty=RPSKcYnlu6Dx|NVxty7-&YcY;i6Dt5*sR4Rt zDlTZy5cI}w3z|^nsCR?u@K6+U7!0HvI(ml%rfHkN-nx&4IBu+_u*n1@1`3?=>buy# z4AgtO5RN>1tu1ZuUE+nId)SlSAVI)I;k>Fn1vvMk{ri~vYLG0`p;mY)S%G-{zYh%Pw}q7$1HTr9R5>IJPr5b0Lt(aE+x>y@^PbWHUza@wT)L ze1`fPk`cwVD9&^tixUkJrBd`WjVRe)5$3v7J*{VfZHbqh$5%IQcb3Hnj zI@(}ja>FR_wVMR%OLK4t-tnBHB$9_YUJ${Qg(DRtZ>b|{%s<5NhCt*Xm_)Wqi&Lkc ziMAgRxUQRCu^#3C88DA364JODLqOHJ!=2I6owfh@M6OOAYZNA#y;oWc3jUI_gcpE} z7gO|g+eF-_5Jr|rJ_IQV3%Ok)yc)hx`89XI=^|3P36@V_1J8^fsIb~o9#X|aI5jD` zZ-Apkp-Kqj=nty6ymv!6Z;bDhM^4$-HSJrdm2<>E4tF6s+^M@p6;HOuWsFDJDhXfdrOE+9kiT@@0V&MXE9(hGa+KBpx| zV@)@L!uN0uGk%sD{|dADHzXesL(2m=R-hdUY6t!QmtvGsNQPdZdn0!h}bRB zcj|Y+EuQ;s5S->l)w<1ab_zuarzg5bbo@1p4gte@i9>osGq0nR`L-KZv)r7!s1}es zsEvAmafGWw=JyeUSi7+n@WG~wPm>!6O%ssSm9BT-?(A&U$r=7tiKm)BQldQ&a3^Ya zlYepE3;9Dx|zO0)~-lou?XBy?=`YF*e z!5@0#gLj_VV9opU#RP7fdqkx?sOECB+s0fP&l|d~@ye&fjrlC&H{-WkRyxZ!779Y& SOxhW*_VjN2;N@TksQ(wI_nW8y literal 0 HcmV?d00001 diff --git a/de/bilder/gif/atos.gif b/de/bilder/gif/atos.gif new file mode 100644 index 0000000000000000000000000000000000000000..492f4c91af5991e27953406129d06378bd7164ec GIT binary patch literal 5140 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 b1fMR0Q8oGsO+k?xt#+trHr-ew1poj$D#@`~ literal 0 HcmV?d00001 diff --git a/de/bilder/gif/cl_width.gif b/de/bilder/gif/cl_width.gif new file mode 100644 index 0000000000000000000000000000000000000000..c26be7986bafc3b6d3b1ee784bdcceae97717884 GIT binary patch literal 3771 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 NKB(n596AVT{2v%IiaY=S literal 0 HcmV?d00001 diff --git a/de/bilder/gif/disk.gif b/de/bilder/gif/disk.gif new file mode 100644 index 0000000000000000000000000000000000000000..14aab07efbf0fcb48d2e7df3ce92e756ac119078 GIT binary patch literal 1015 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 INe1Qr0=h`46aWAK literal 0 HcmV?d00001 diff --git a/de/bilder/gif/drv_udev.gif b/de/bilder/gif/drv_udev.gif new file mode 100644 index 0000000000000000000000000000000000000000..57ab9bba494ba21f5dc1d96a9733d2d2243a6561 GIT binary patch literal 2903 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 WEHsd>yrJRT^M(s=8yFcGbp8h)%Oi9E literal 0 HcmV?d00001 diff --git a/de/bilder/gif/email_gs.gif b/de/bilder/gif/email_gs.gif new file mode 100644 index 0000000000000000000000000000000000000000..4ed713fed5a7df5fb842d9e1e6d31815ca0457b4 GIT binary patch literal 1294 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 Nd2glR%t;F6zX1=(X?6er literal 0 HcmV?d00001 diff --git a/de/bilder/gif/extent_en.gif b/de/bilder/gif/extent_en.gif new file mode 100644 index 0000000000000000000000000000000000000000..abb294a1403361040cad9e368c73024cc4f273e0 GIT binary patch literal 3014 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 literal 0 HcmV?d00001 diff --git a/de/bilder/gif/f_select_en.gif b/de/bilder/gif/f_select_en.gif new file mode 100644 index 0000000000000000000000000000000000000000..a988f0c71fc7b5a9f7423fa012d5db1bbd46106d GIT binary patch literal 6007 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 literal 0 HcmV?d00001 diff --git a/de/bilder/gif/fenster.gif b/de/bilder/gif/fenster.gif new file mode 100644 index 0000000000000000000000000000000000000000..3beb9f8044f0ca0e5f900d795c89a00990e77712 GIT binary patch literal 14749 zcmaL5bx<5_vp$>z5-gD5PSD`)?(Xig!QI{6A;{tq+}&B+VR3hNSP1Uf-}9W;zV}pp zXa1PJr@Jq?r+R9pMp9aWixXh+f$hV?yLV71^xa&J-xi8or$Tl zi_owKX08Nkk**euZLU*LbSy?ak4V(DTFa4@rXvIV#h|1h=uSBuL(^z7cj zko;5epBXyh|1ackK@RZbU$wujqW#YtFmrO@R~UH;m>jp=^~@c-NEzZ(9g!2Y+}e`Wt?yA1z_-+wp$ z6Z-Bwnv#vZi;Jn#e-!`MWc{=Lx8Q#!>tCS1P5)n$^{>8v%Mr@j+dG+9+5ucl?VLTG zT}*9FiRu2H{=c6EIC$v0_wWQ#wZD3U;n8XIMr!l=!@rWrWJ%TK4@Tp#TCI=N6%5A{ zi$)Ph*B6c^QK^>ejn)@|Q<;p%vZNb|Co;L5PuE8qOagKRF+Z`xCtJJ=7e&It%uqX- zi4jUgw82w86)V?ZmhfG@G14f|%eGplNhnta>h@cy^DfvdwP4S&+*vKsYc(lj``PlQ zocFZboP6?&SYQxubAVn@v@ScScZa~yN+99VtaU`P>bi`3Fdc=6X8IkBKV50&JQU#5ZMbZ6$26yp(JVikR6wHKLT>la8fXC`aoXL{UTqfH zD^gZcM3v>3Ep0u>awv@t0sUxp0iu28s80{uAU%|ow?cTZ!OS$a1&>)^U3IN zjz@JHcCMEuDwlrHLM$AS$)fZKu}H)y5F>^H-F;{ZR2#V=Ca(MR-~g_Knt|=!gOnhdr7vd+lhI+&uq#; zvf8!uQJzf@_hzn#28LP0B<2!Teg}lRG*yQtvMdvd+q#z@5Hw=p$;Z*2p5-l)dXkZ1 zb()hPa0mr1#wX*A9eS6cq!pXidFc?B0wz7r(j8WLPIEb(bX02{PupmUi^AG1^-32l zQ(b(`@F89vlR7q4O^B(qVLe!7n)#V%?G;Hw9LrX%Qy1lQapRxxYMN{8tRamhJl;0B z%O9R=e%(u$|85X&t~f1SN?BVfauDF58%XbqVjSE`vAE~}i)1kU#2OpX?3tc!0o%jj-ucIDUpIe_Hh<(at=~ihN8v^6`(3 z%>aXJm2RO?Y}?yhGR^MoBj_&KrkO`h8bMA+c+K4h>5>+68LtL zj2=4iuqBs0KHV1(oqR4Ef?fT%8ZF}k8e)mX>roz^JYy;m(Fork{akdW$S|bf->(S^Md&O6lk}vMf>%4k-1-o-3Vtc z-zAuL>vVUT9-Vcv8j_)$iu=K~3=G z0hBCgabtby4{Zi-)W3u8grZJ6yuj$sp-_QfcLxH`lL%lNhK1(j9Re`V*FO4^CLx>s zq#!!qhJzX5f)8^DDPbi>40i9^?kxY7cC;q1bAMlQFV7{mGb*PE#hzZSsANt%F={ zYow&^b=xXsLVCHT(4=Jq;1IUtLvd~uAyDa=B!=x|HkRTdn`ttadeXST&wd0I(YQ$R zZyPV6N_XqMUnVBiU9umP0g=m4{KT0du4-P3lxBfw6Qs=Cz=xfmF3a zceb^PsOhT_M`_NFs)Ve)l>foC$_R3{u#bmcBw|-%@?_0(dCK31c&`>CPOU$x(=jT* z;V`XwZVH33jB?0sEz)>y_AzOt9F3_0^4Z4x3;xQC0DFG*!Y{xQ4{r-}a=r`fO_UK6;HF<^jGF1<5J=J zHt|vAEY#e-&5W6?v5^{ANro|&mpmhrn8@R?WXMO-OYO6<_gT!2S!2PrXiGWw>@|W1 z^1O;x9d}UC>{7 zo#Ah>PjQA-_!gL%D=psaoKINlL3GWv4w;8J@4XC+Z7B5*kyDriqlxbF$-H76s=UJd zE1lm9zMaiCd7&lbm{lph^{Tm7uP#mAH-p|F4)LJ%BO>>=CO2@$uGQ(lXn(Kn-!Hh(K;pM;!wToq=od+ zIgpXvAX7mcE=X4`1?qaN91C_z6ZClx!!-fG+L~nDtu1NW1ua2h02@hf4bL-1-yN{~1dK{-Wb`86 zf9w)QPj3TnQ5J8^8Tw8J=gPiM@;@q(BP*t9aCa~1mr!J-gG=+G8}QF`^l3J=tNfrq z%j%RLt~uA@aIhpYS|0#yVI=+-xGk!oj={Oc;%Ne-Xno`Hz1Si5Q}CBzAIuc#4-qB= zt?J}j0Iwp$M8`nJRND8gJf)hPhDkndup(X9VnPqv+Dl%tt-+{V3N}ZIN>rh;l3uC9 zD#}tJS{4GTi=krop(YWEPU!kBsbN;FVK&QQc8_5WQhI0+y1du`Qz=*1RuePxaCZx9 z@6vG3R)Ftuc%T%(pDH5Q!!eW#5Du?Q1wGWXaTcgV^`dt3L>B!K(SkpF6q48)@%279 zuGs;&VA~_=4Liq(7ZR1W%q+nf&U36rkFBpa9A5FsLYRY7VUN=ggFQ`*V@r%3CnA7c zgJOPw#oZ)?7~7*?S#o4VvX9GGIwIO&-weZD+vsDIDCM{2R;5gGLZxf_J{614TJ&&7 zQG;xpQjhkXpE&lygE?A#z-E4sRyz!L=Xh85PG#pikD%+_SlJ{e!$VrHVhg$w|05Ck zL9s}Pd)z0_pPTNCmm~D`obeH6@!XVJQ>M;7t??p@vAa|W^k}jn#jGOmL6qMuSg(VS zq+`CXh!?UYB5;~~T8{JBCte5)%ZIw!hW>Ebu8WO_5BTQ!y(z?QI3;etE%CD_3tU8^ zc?R->HRgpF~tiIlLYxn2*Hin6bhK2f|XCfx`T#xR~F2 z_>XD)w$BvR57l8^RLVhb!v8}+!QuXGUkcCHe7%6@Q4DO;8V997G zH+)*-qq^K02?A5mHb#3>C$M03zTv5<)&+d7jTc@9$4>1WiIYMSx7j3D`Y&ifeJ&~QD$H5$k zbZmPmZ)&S-hkMZJNqWR%&RwL)by=wGpe{_5Q9@l(lXUPYHUL?J_X+;jH?k~b8rs&A ztY+fexVO~ zkUopGQ$)Ng;YOjsD(eN#x5e_BWmm$uDBk5$^O(Gw^H0X5q0cDzu$sra>MM9uAOcs| zMo}nr`ZI^QI2kjonG0_sjAu5*dLt|?+|f<``PcMgMxjUH;8T`oy8zsCK`d(VC>iaH zN%5s)Axac}S8HHGglYhk!$D)k9VJj$V8eDtyXl<6m?mJ5t!+{qu{8=Gt)M% zBq=Uu<8*dFEHm}e`q^I~1~ly+sgTDh&3Z0v_A2|?UX^=N)#g?8O-3-6r}}$&t|*>F zxL4(1MkS=2@LOsz>{|L{d5MR!EB{@&qD<_IS9LaC5qxOs*R`r|pdvn;>NT~3ImA-L z=yIAeQexUVa&J2}s5dD(rR@f`q5&{I3ijvtsRh<(jUhE3k8I&PZ{P>o`jx1v^|=y5 znPT%hvfnu7s!g?bE49C)s_CLlBzaB!%FEIQGalO$a>}X+tr{_-3+-eYVZe>{v;vosZ` z3;H8d^eM9qevK&$TveFi0mQQ$IBU^3^BaF|;!kT>O_NH&uO0ke_o%}{gWCwothYM@ zx{-CZA+>Bnz1#2x72pwzd##)L*K}QZ9asx~>0}n~w{(E;T$r5*XDS-WTbh1?3j7~i zn_jvoqKn!=ogKU?`}ocEj$NNPJFZ-th}_yaWZ4TV3Kn%+bXTj2z|k-<#ZZs#$*0=+ zFc1!?cbq(oQZ@j7y(vb#>Fkc0_vJIOB4%Zg!W%vd(RQ=Jz?mDQ<$-3QAz zz=|{=WzzF8v&tQ*GAto+PCWnObf5vT9T&d|bv#LCrAaX*y$19HjkN1!wbfDQ;7$5R7P)KMeI4Vwus9pjps>{OIRGsoIFl{+z^K7+4i-OHHcqu+h?7(tk(yYXvzUjVXeHr@JnfAsc z=9KruDR*EIRYSPG(YATMv3c>fxfEF;QAmsKxh9PZynb7pPLG(^j}+!gx+hFm~OM#zU`{Wn?mc1R`yshKAsW-l^NVtO*R}n#>AynFX2wBHU+bOPE zB~S<}YRif`^&8^qM2Yi>f7+(X+12uhz!@unqut2W+?Ck#Bth6GXV~W>+9#UZ6T8@x z^4pjAvnMC8uV}EZbg{42wXeRpufZ_#O>dR|6r}R!Kql_shrofhz@bsjz6H?%K;h7= z>(IRV(9-X~M&QVv;Yc^%wM$=E$$HPQHC)JdqQz^~r+QbSY8DS=)Bq}Q{B@+-L)$E* z;)u8U_%(d#Bl1Zk!^wO}YV71VW!yke+zC0?&Q9#H3({%E@UcH=gU9crc+(@_?-&c? zr0U`np3^bQ?+lsztiiyeX7j{G?=)e|0ueqE6erjm=TN#-6q&O}I_Uxzn>$z?I8-&) ziFE!wXa1+_P5=?)WBUmw{aTte#QXbh3Z-4);Pl!ggy?*{RpFF2lhBr742EcXsrq7I z5AsK2uY%#?0eS2mv~-3Dxi|0zA)i&FpVSWfCAZcI;7`KDt2Yr{joO_o`W0Xm|E$Y{ ze7U>;%R^|3wwOl(k?a*@Etl{GH6Mw(=L{g1c00=g*Vf4XAE5r%q>a}FL}y?-uXldq zpyr!nxf|}}>(-nL;weLhsq~)5pJ4_UVv0ANn-^S$r$RM=(zx?yA^~rKyC{pBPln*i z>N~jNlVO3Y{IWBnFGh+}7i~E=yZa2^?YD4cxU1U7OBim|Pp|eeHE1B`_VEyX6LIFE zpFhPP;!^MBzwAi(TlH@~)SoQ{*f&!6Jn&N8qxs({R-CbmT*#-d&2rTdQtsLI9}=B# zY^NrkiO!{?{#(E*FrB-zEGxuzanJD4wd-byP%IBv0xpTc6vf# zF-gU!l=6kcP;qGnJnBfrBVoRHt-~wtOC?gs=ZK}N9LS{5tA~jpI2XyKvfFMB;IbZ# zCw;;Hb8E>`Aetr`XoZ2>Sg2eqMQ?Xo)<`W~ru5f~TStvnxmq%b^zG64NUPp-BF9%t znSL;nZK^ADjl*s>M*~DN;pJYT*@b0j@Ns>CQMWI+PNdR`>-TJDRHPe*++%@Gi!;69 z&}+TvK~6fqzr=aEvs%wj+%xtKW@D>`gwSS#5xhI7Se!!ctcEQ+J!HAnHeN0U$L(?} zp7P>TwqBb>_@``6MJo3vm)0zBTr;g3m&00rXXf{dXLiedNl#~tZ<`)co7>*9)dYH6 zoBd6~Sj9Pp-STI7PnU3COa2VuF$uwZ5p(FeK{KfpPMP&$XuoB1uI+>UBzCJi@28nrln!i$Le6q69V(sQXKjw7^c51CP*Mh?)p)+j`=V6uoY8 z-<%yf%H(6x(TlZeas!m226LhvKZC9gWQchk6#_1^6)rvL4%Mq|(ZMKcvH5ZF41 zc;`ByY?z5WqbgfA7)?WV0&l&!AC?#hnZM-LiD*KJ^7uh%9YUYHed#@BHurUXu) zXxDAJo^MD7!!&IIt_tQ1>TP>B)JUSTmP1O+klP$5t%pL;${LE%r8rI5|8IN$@#j z=G{%KXrXiR9dzC8rKudZZmz3fAcY}YYECfd{q9*};ME$+<$JjDWVH7LX_#I!sc*DW z@ZA3Dyhivgf;$n;m%Z z5fRKWrchQNlBULkwxZDJK&%14XG@#`Jd~?2$q)dlv&8^8+DxQWBLF>bWPnN|Axcy4 z2UgWxH$r($;9;~8&LBJ!(b%z{0pAwRLaW5~6}iWIIWqhMu3k6hei zLW_zj?k>6CrQ62#_*oLtlgVjK%lKtizW}rK_UT;9_%xrH65G~InMBQ{rT{F!It(+G zx<%O|Y8JV%kV6*vQF=rk=#Bl%z+rdVlcd%M*37LC4CVNv+&Se~W}^LSV+GIqB+=9LocP+kLU*kBTsYeVE`A9GIB-hIezCVWk-1Fs09R2zqxQOX!cMP@ z8hl*1;A=89eOU{P0<*JnkcP172U2(Rv7tm}Czqf(Rrq_b<=Rz=3{Zv)QP zipSDI-ysTqfG9XaG3h6Ei7VRTc9V;{SF8cTDy-u)@^+E*zeEHz)k~hsm8};h<(Nxy zP6JU39y7*!YSGx+=s&ab!$Q8uBT8En0ZpuV7j3waRQG%Do2w?O?v7U!y02Mcl@Kr7 zBQlw@v>^q5{YiCpe@R_;!7ic^IT6xNT@8DiFE-4^%c#d6ZSz}l-@(MzDxj^|nWe80 z1J-yiRg?_oH0FEQS_W;utc^Cxw$4>CdO4fTyahQ`w{Faxl;a!0B73MZPteKHN^-8P zw)A#xoc_c}AvsqW?n^1K)2zU$T$p(Xb9wuHBjzoG9*^USm07tN;Ia6`qo$20lO3&$ zw1o35sbvfoiZ7lQJ@}T@I-+=Q@!@Q=t!@^(mx-g)KCk1zO2duY?%KvzmH?a5d1buc zx<;tN%(PKuQTdgRHT5Mrk3C$y7&FW{E3ZQjv7mJFvGXSDy7Gv0%2Vbi{W{<(Moxq? zW5^VP!lJO9cdi-^9DGq00WS?f@7IDHP5+_h|iZ*TI7d7*ssy6ok_ zN=uM?{wo$)l{KNUHtpgZsEek8Y(hdG#=E<7)37cU`4leR({Iec%`V~X+)z@ts83=a zFV7azs-W9abN4f8aa{>HuuY!f+{&@UgwouQYfQklGC5s#n2`)trRE0f_*n*R0H1?J{KuC z`ZE{=46bk?6C};VnQNdv@fNDp>K>A zytR4W+yosd*p+Nu-XaSb!el;Kw@UnoYfKsVg6IV8S<%^)a)Q^0(U93@E7c|_vva#L z83-w}c&&hlosOO3wbKOD|DK1%%b3khmvN1((DtUk@L7lqNjTq{j{CN&(vn5|l{3T| z6ok&?jYQ+=Jdi!gFXa;>y+42;S|2Pb2&C@uSwoQ56I09+TVg2>Jri|d7FRWCkuBs> z_ThKEsp%dgJO9!CUWS#_Mto@iYH+V+yBj`H@sb7HG#(D zvnWPITS8Quv~l0J{%*@MpvXXxXtK~GPhY=E`;|}@?QJ`{46nP1ByP+wF&?j_9*@_4 zyCrN{H4<+FOgCCPyB1xEVT>S3L1)lw-?3=rC2!^=dIoH! zE1>?$i{7*ILCg@g<%~u04ZowIeyD#<=r(B>#kgxEPzs|^D$PddtZ(F#TI0@~h|H~& zZYBSSGj9-GZ_Aj_d~mCLp&)z=S2=>vgpPCp20upu2#xPEuc{23*hoKj+ag%%rwxbp z{P(amCTqH}w=@2Qov|V{*|J8Vy0fv&LcWj2UFCcuZJFRopRq!{kysx-Hnjq|5UMVb zMx3k;*Uw$;qmpqUB;@n_j9I;j^Bq5BC1WcyISbQ9>EwuD`#D0SiF7;vc(Z9%wB#m% zdQIePlgp|;4@C?NS<4ALf;#|pa>i_&1UKWhA@ayBA{67})*YPCU%Ybbu(ZDj*m=lV zYfVrm&+!jF|El>cwpWR=-vQ(s5Ia?4*gbF5AP}2I92GztfQ(Z+5{x7?PDUlMIjm1~ zuyHjdPO9uDshMyGW{E5EiGyfjxO^0XIz$7Lr<_KmlWs~)lXH~Tg*`-NV!fqYm04a0 zn%h^&M#)G5bEV%34xNf$()AJCN?3d@vkBquOdg@>P?A>b zL6h$b7g7ELBM<~4#Ew=R7R!kst+Y3hAhi8*{wnyEr8NG^h}ADS7!4jhRk|{s1fPqX zFH5%Q)l+0q_xFRMDwS7)fRl}-P6YjA3n;SViq|$-WtH7fSb5b`XTi+ILHLc?^PAeG zz_H>+l|W{`FqbhH6IsqXkif>=!Ii8e-ppyk*ho-j5*_{Eeh-~b3(|pX5M%J7V`;v_5;xf--b74hFgDT9ehD+6e z@I;drNC;O)_&deSG7?Eva`k7zUgy2xVUzhAnNcXXPu&V_TAv~vO+KrFPc=q8>jFcb zl%F3rR7D1Tl0$bMpPnCRsP62m0Yxos(v!{-eC;#wC zbTaFz3@AD-uzaB?y^~9y9YAN+!2mX5wp4ytW}?y1Cr`x2O#g$io-!yt zfJvpLuSWw)XuY) zzP~AVjcck^X?&0$$>8t)rNhr?qZ(Rh5ZTnRZbRR0Qt>%Tb_;!BI%Yi~%b@vnYo%^D z5x5l+yX2eQb^y`*<4W41J}ZH&(T=pkMK6GAAQwE*df%xqT4X51ZuFd_fn1~(Ik?@1 zj33!of-)`-^aP*|EV;yLz#DAc_Y3{e{p(kcQG*SiVbKy!*nE)9u1;fj!RXF}jwagP zn7RBsJe&GA{T~CjE2k;|T=ZpqLCx*5ScIu>8;hyIgw5h6bTNQrw<-p==O+ z_4eSJs~A8aZj9tyu&4>Mx=3QLKXbxYmAJ9*O-y}Ke}gf0Xgs@fYJVj;T^^{vSl6Ju z$tU8*rVKTm!ARLK0qImCQ-)N1JvP;45k0sH0nk#LTG6g*qD*}Z(-ZKa*Ig`QUSweH zT*C`iw2;@hDP(O!Ui0W56t7#<;y4_p*q41TS9_pja^I!sw}y3x7yddhpl|jtuZxSN ztA5L(;j#@NGKa;CJ=s~)vOB7qFf%pN^SD0@K%Dt0{{sgSH_xx16lxOXqJBLxlPm_v zGZuE?04%%ePm7CHzi34t96^U59-(Sn^q~}j9@Pb%>7eYJEg=4IlOKh(wQ!IsWzO@y_zzxIt?0$7Y_=Hw8YsKRf!bQgx;#j0UH|mZv$@})(~udnO@;Hms{+lA36;) z?x;@&lL%Su~=-<=TOKL%wap+ z+~R1q$UM|+d0r^pv&y;?7V_IW_p{I&G;KrCBBhv6Tv+}wuN{sen%=zr+j~R4ORK4C z?lt>z)8K^SRSWt{Zk%G}7kGb&kJFjkZU?a1amQ+4u<9VbD{3>~YW7>C*y;k5fN zCodY7Y`M-JF81ju6I(z@Zod;@My(_RoPIa)1(fsMLVe-U8_bXAzwVv0D=wH8HxE&_ z*cT=$P|m6)X8Ut)yyZ{VKBcf$I{)xCM1u+tF-44aw|A9#K!m2Zv z)aKz_-`Xt&8ko{bT06x7Q2gVi z@eeGvgahKV9F=lXD;u+0Nrqzx!!EX{o9LzRZ?o}CbLRjogJ}-!cv}xeei!o^W)1%~ zVt-bMoK|Qblx2Y6E21XX7sax2`M7oM zi;4SOlyDynod?MQu6BDC)RrrF&YetWJ2D~%w;5!v!)BZZ@8x@G8o2R#$Ow%9ApGr0 zINSv~KfF2-p0=fbL&3PH5VO{#SPQ^9rY;^^w0$))e)c}yCt-E&mfz**c4Zcv$YTTn z%oh;n?*ejlHgiSuvYz4&?a|^cPQPr3FFYf3P1Sc_EL^^PO4-y=-(8=yt;%h6+W6DM z#=F6IasUVa?gJbeoyBkBz7Rxg7MtVWBm)s>*qUDK*o$D>zL6mN?qe7$KOp$ERw~gYWex-soH_Ef+ z?quHFddN@h#r|rk4SN3PmH)LuMP4-g!obh1Zmp!z^z9LtmbVa&Wrrws z4Kj=OUTOJpjL(l`KZO|{l;Y)ki`QZu56tuulo6iDla*ygmwfKj)pHFcoraR2_B{s? zyUBnk?(gZSerX5px*}59QC{qkGnuAi+?3hB2Q3aVEK(@(Z7r*@%&lAzd8qOTunq?mn+6)RiPcExsjHg!pk;-M*%$kC=Lyv}QUcxq-SK4U zYe$Qt=v#LL;Hol5(*P=rnT;jNoaFB=H0uuL6fnzr`5?A4U;V&4@Ua7Qgt0h_Wt4u{ z`?R~I`kZ9~9vi7*gn5d`d4hipR6EIQe$G0xm|;`YLH9D^JR@(6)Y#X{0%2Pi-#o7_ zQ~9FLzJ%Q0kuW=Fx52)0rQ&m~0*EHGTCw$xtqGV=fN*Ri8^oFq*QJGzd1vMp@+My(Ns~|{SJOYpW?r!zBbDw7OJ!2zgL!vub zJjKfm%^~gABybYN4?An>$m}}@2%B&4iLS?6`$$8v&(JX^o*y*#C%q+U>a2hFw;!yU~gE&+_Rxn&<&;}W$#`tv>Z<85noJHA!JaP%ZOgwAgWyhH z$pzA<8{bMvak+5mhcZqK14t$QbXXI1x~71@soDF`#OU`T`}tG^2YY_hD&V+*1kEu` zv;bi`81R(-MRkb}xA~_c8sF|a?#D6;9f-AJ2RvpNp(-GK`u8~o;=esD~@Izg1bw5YjK9j1uGh-6PJBRs@tNltz3f@6U zOnKEhZZ~0-G^kICCNsLgd7@MBs!wj>RVRH>msYJ;amIvJe(ly+8PoQYkE}wcNH>uN z>wmwDPOJMi;4%sZpo|-N@%}k_9V?I`u1)p>z*e^##^Ns**c)U$HPT{jTr48w(O4KYc zqcP$b(S(~_Mg@3+RLmHgL-2$DNN;)~?N2lR>&HYfvHk`zGlEQxokby=ND&&y za;UJ}DrCsSN-?s0HqTDILI^@LJ7PS69(NaPi?;|pUR05*-O zQiNYwovXP9R`}l05PX}jv(5OF?i^Uue)vhV;QkYdg?QVN1t=c<<*HLG-`F$ZGmAJwi+N@Sc*`j+#JOI16rD{jrC!v?flxp zX_&hH{FFLSwJGPfRHLxOU*FtdNTp{k&&IKeX1foNoGuzJnfjtG?)L#9DnLu%U>33a zsdEV&)4pi&bk*ZVu5f~3p+`h>*Zc(q+2sLB`vZEb^FUrUS%pnbxr3T5EbjvrmHFHXf`+OZ6lo72)`K~@mXh>2fAvMd z^UWSC-#W$OQex=$%wN!sI#I#I8NG&VQhwYMpV?-cpVck}%(f%apb2|dS4taX!qa9? zule-D+cI|jrcQ*$Jw%D>Z5+N+nWo$8kg{Y{Y^ml4V9hfTuP4h;AL`mT=A_<2Aj{!F;10! zNU1ku)e#9lgzSrgwmeX|a|v)syHT4Ue=+kGugyqVgv#$sW3F3&Y;&U`f59;r!MA6pCj9zsx_#Q28#lOqDsKo+ntN%vy&?Xq2Hxno zQUC0CV{PW^^3H0*Zz9z9(Cy>9oY2SZ*H8l3&TJpsnZ|%^^lSY|3P8}?_J>%N?MT8^ zUqUa~ygx3fhr*M8aB$Gvm+p$ z)g?wDr5Gh9A^M?;OG?T>>RkDaOyEa76)Cv_X@C?dg#l?OApg5eEQMV@rGyHlUq02J zb*hy7l{8WsnJBViQrZi3+OFNKN>aMXUB?kp`c2Y^P*R57eEN%g#y_M?p9+|+lb_qR zyQfhSr1GBLsS3R*;4W$`1j-|x>@qzQur31f#f+zbSrhDg5dMO_bR#P{GAH%D*UEaW7vnI-;hPVie;>p2ybGDldu_(3w|IMlOdK2+Q*43yu6BEwIxB7 zG2!;gh0!qjT}OP!9PwD07KN+zro3&#W$4tK`v&|X;Wq{qH&$vVpF5d>AIkZ?LMCuM zB(IgGwn(HZu+5RbEv!HRD`P5xXN2NKgd9bt(vBr}y{sa#f=ZL4o=tv#VyIny0ROcA zZpcIls|Yq_Yx$12Jl53tF*o;|Tz<%CWWwY(AmJsC%xSd9pqb($OT4p<(Ew%$@A?9Eq*J;qc=_>q__Ld1&vDqJTeGW6>$!$Q?!jEzU`11!Ton@G))3KWjhf-COf(9Y+MTcko}>t$e|h0)gghw sj??L$TgtY~1&IU^mMamZXG)1@4y9LdiB~nHcXNq%7iBjr>^t872XMzjumAu6 literal 0 HcmV?d00001 diff --git a/de/bilder/gif/fenster_en.gif b/de/bilder/gif/fenster_en.gif new file mode 100644 index 0000000000000000000000000000000000000000..9f142cd090c617592d831a3505f752fe4d2a0df5 GIT binary patch literal 12551 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

    dK|_Zt}Nw`%?3oy;>s^8t|URp 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 br^ON!iW1!K@2eRWzki_Tz0>SYKp^se`c?F9 literal 0 HcmV?d00001 diff --git a/de/bilder/gif/fontinfo.gif b/de/bilder/gif/fontinfo.gif new file mode 100644 index 0000000000000000000000000000000000000000..9b7ac27d776ecded1802f293942a83f6d416785e GIT binary patch literal 3090 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 S`PP&@bG@gTs>8;{qVZq+#jc?M literal 0 HcmV?d00001 diff --git a/de/bilder/gif/fontinfo_en.gif b/de/bilder/gif/fontinfo_en.gif new file mode 100644 index 0000000000000000000000000000000000000000..7e226ff6b2136083eb23d1998e575d5dc048634f GIT binary patch literal 3155 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 literal 0 HcmV?d00001 diff --git a/de/bilder/gif/frage.gif b/de/bilder/gif/frage.gif new file mode 100644 index 0000000000000000000000000000000000000000..dc485afd56a6649683e6c7ffd2114267aacd368e GIT binary patch literal 1001 zcmZ?wbh9u|)L>9!_|Cxa9|#zL6p#U;fHaUebLLD(N5?9lz$%7SUSV^fx49rsQ zF8;x~Aw{W~K(3C0OHpZZHc*^_iCGL?P!}l5sOy`Vmy%jsl2)3RU6PrfS6rH#mYA2W zkk(iP(+o3>fl=8hvm`gMAT7TrH?c$^DK!(Oqy%DL9s{!?)JCX?jsmh4kcE71i4|}Y znZ;0@3zP#nRS51>kYbQ73HPGJw9M?1#H5_mk`jb|1yubgsz4^mz)eDt0-Gu5otT?i zl!!1)64fw>G{_WDxG7LAASdbI2{|;A83lb)bMuQTaaskDMzsp61!R@5Z)yq9`#Gry z1Ef*i3R3_wLLBZ|m?+r0dU)ImR|wV0z$g@ulV4JjT7<9>EoDLFK^7uX7EBY!(fCpp zOdZ@hS?~P(qLj?M#FEs!;>zNZ)ZA1B9bh770ObXCj&lr*95Nmo794Em5Y~!0v0>ri zb~a{@IUXAq9qr~)bxK+BF@d2`+_~$`kBiC;6EzH{_53JIah#$a?$(oOxbVbe$>^|{ z6+z2R&Sg>Gcjx8h#pn7IG}%JCOq6|RI!xx$?FvvnvovgFSZ$Q>>d=nJ-FzymuBu&M zmR^|0qg|qNvsdBru2e2_&G7YBuaEUsZO?JurkMOnwtCyL`1Zt&Tyj1;)`o2Dd24o7 x$};2Ow5ijVxkmqdapjEjd_A_iKa4ZaPVtZaw<_xMi)%srhv)f9mpL$40{}jaU{L@7 literal 0 HcmV?d00001 diff --git a/de/bilder/gif/gdos_ahn.gif b/de/bilder/gif/gdos_ahn.gif new file mode 100644 index 0000000000000000000000000000000000000000..2744ce26764618f5c45a4130ce3298a007906782 GIT binary patch literal 2930 zcmaJ=c|25m8#k#NZYe~T$&#zGha}u|uk7>Mx0G#|Va8w>L-us7(b&RRveZ}ypwZ4(J%60%cfQZ_UC#MDM_X6xiV`>)zzs5fFMN=HV2Ysx+*dl#`dgC&1a^a>z(2+K4vKwmGgP?uRen$yk);0R%l$(cz@ZOy zL!$ituhsYVL8~7Wh834S6utZUuF#(X0td714KO55@2A~E|9)MWf62Q)_=Cy>;52eY zqR~*)Pse|3){j2J@aJajkr<)>ZL{{~_U+DqkVq5+?hZyn-M#$0&`>w1uoPqa8UMmj z7CIAv1*lV=^E{M=OTxOn{84k{Nm0FrIu(ywV|W!@-nLiZUc?Dsj|S>K&Fy$_!4z-Z z@idQuz3ABaP?wP3opHr${%r@L;AQq7p=@XLDhprZbRJ09bXFGi793*MN#^%7{j%k`r#|7XN| zakN@F9RtKFxmDJL{)!wGxH4S_iIlYKA=iAKd4((E2Gx;P7lsIk@t(TcwGR``F?1or zdh+_`Xhc3X*6*t0n*1c;4&5qvem!UD=)i}>Yr*6lD))pQ^Nx~DkTN&S{w5o~e?s?! z%#eAQov}`0IOpYX5i@~^K5&F?P$Bp);WsmBQG$=1dRMj zm}tyzwA8`a>j2$^c(oCYsry%X;DZU*g zY$Bpo!1Wa#Qi__+N?$6Yb3B6rY~mbLoo_BPUVKz}QV8go#--p|LE^>b%jvKkm0D>i?W{#r0iCzx z$#NOLdpU~F_{fI|;VKD4!MLp_oqrO5#gu&TvvKdF#|V^nsFn6oQ-Q8@YX4W2Z8XX_ zE<^E+c|hHzK|9krZ-k}5;H4q(8j*Jx%9SZMVpFz3Xt?!ETdCvbZMy51J`^&>tNpKD zYxz)b5p4CSKcIk!43vA41<5c!=Mx=fs4W0>))ibwMys-~P2n&WZ)eX?ZOTI-R#odR z7=bUm(^Xof@Jd#&F_w&stb39^qowBaJDjx8 zwwcl0tVv$%=nk$!^aV(6e0ykD9TZ*~5Vxh?J05Heo1`F>UoEhhG=DGvY9SM#dv;rl*c-V3eIYW(SPI9^jB_jm_ys|J5;0vJ8TCBmnZy2^os zn?bZr&MD~&CdQ|HnK~~PRizibB9bbRCvG?#Z>C;)-;E4ObAh!Qs3j(;CP9EuWy;y* z#N^PDEZGH?E_=4m5v>|xDfTb|#3JlL6*^yo>`QUtLEY@L7L^5ukwor2QFK|LRiM|~ zY}vU2r4}i3^?n9mT`wKlNc@rT^K~Qrvzc6;oYbZode7k9^1COcxYgER25j|4nHj}1 zt7h2l>+(z5C-iTeczwQw^|34(1TVaviM(=(k(YiUWhwhAjPCFgaEK*#W=jd?40skB6EOVM)rmJ z^yEkf;#J{z^RJq#am#75fK9)LU$)ANbAT?U=HV6wrK`C}P3SFYZc9;jE=W5N=9FGI zc1NGjDnZDX)C-#amuT5K=6IV5i4V`W8lwO1$}meD5?5R~6w zlDB$ZA4+!17h3|FN}lc?OQ?EPnGbgq01ePdKG%p;31_c>3hIgv46`LY@t5l8=uSJa zavSPdQ>{0-QBu(}J?xB=v>7*f<}gsV>{amV&=jXa)mZm?)#d=pB^QNSTAlFi-T>P` z&7?ZV#j|>o0(NWuW`wC$KI6^w@wG+EvhCFmmU9TpVAkYD=VL?G99vyJ(y7na!(_sg zlqV4@rA;YkmJ?y^4adJmXCg%$97N7Kcx zMOM1JVu8vyj<0trbh_r*-{WSx)RCvm+Wg` z-+_~k-0ixtX7OB0R$2`yiLvM8az(e#y*J@kiK(xQP%O>;kHQVO=le^Mv;eR%?qhx4 z<<&w2NyR*SqcIh|YI=j}V)c@Lpn_NxAt=RZXzANI->aAkH ziZ4C<(@tS^!Eg@M<6BEl{vtU*$`U=|JF)J>GSc1#!6vRYD{p%?1sw0$0K9$4V>p`t zQt-UDjDGKMZfu=hMm_8{*;CN+mztK*W2o3{AoNqMZ#$u2<;+nsLDJ4QNwuAJryfXi ztpC(WI0j`OS)Z{_u4z!n>c5hm+Agi-Z@f9@aaxe%#dgQn>YmhUoDX%>?nLd-3xlsu K&#MSCss0x>)n5|; literal 0 HcmV?d00001 diff --git a/de/bilder/gif/img2034.gif b/de/bilder/gif/img2034.gif new file mode 100644 index 0000000000000000000000000000000000000000..d600d058de991b654111a2558cedb39cf0bf9ae7 GIT binary patch literal 10196 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 literal 0 HcmV?d00001 diff --git a/de/bilder/gif/img2035.gif b/de/bilder/gif/img2035.gif new file mode 100644 index 0000000000000000000000000000000000000000..673e983231b839434a5342f77ecf38d75826794e GIT binary patch literal 7298 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 literal 0 HcmV?d00001 diff --git a/de/bilder/gif/img2036.gif b/de/bilder/gif/img2036.gif new file mode 100644 index 0000000000000000000000000000000000000000..eea858d691415eb1aedbc81d5fa3c8b814816a58 GIT binary patch literal 6948 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 literal 0 HcmV?d00001 diff --git a/de/bilder/gif/img2037.gif b/de/bilder/gif/img2037.gif new file mode 100644 index 0000000000000000000000000000000000000000..292604cfd5daf527cd6ce99572c3cff6e61898fd GIT binary patch literal 4464 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

    A{GULzU3k?VJS7wD0~Z#F4&RqYDALNy=F zgiF0gBNo6aAEQKsHb-NXuXz{UEAaE0^k1c1@XkOAZMCK1q7tU^HE#RP5J=b7W=aQs z@tfOFP+M*_Ha~Lu6=vQtx8YiSn&RiDjXtWB!L4qk3GL-=6)Ji8!s-Hc>)yEmEuD1r zCFJ?DB})_}{>zFwSbegKdQ*72am>_ed%4wZP90aTD)Vf9R+!jWyZp+!v2U)~dXuF? zeKB*vK%V^;Q#7I~ugMMD9-2XS7!YB-{z$yA-o{3{u&LF(?4idNh*d!8GRt7p{pK&7 zu|vv&Y=qCK!d%Jt&j8qvJIW zGJkHm2iL3q_3e6%mU`6jV0ZwZkXJ`}8qnC^$l%UNdT^uV5sHru=G5^-tPUs)7jvFD zyGXBw^EqBSAnjL(#2FR6XZI`OS}spmD-`M(n@30MR}L&v?XS)>^hMQ(rZ1Ly7g}0T zV$iSe$ldamJG;ag)H)}+={wzhmc2Yw=|rrsKrI=1u{^jcVwC@heZJDQkuaDbD8-t>{|d7Bra}XCxOnt%pld%XjT5VucX&6WL92 zZdNIn3KrbBrT2yq7MV>E&96zY*T1j^O`aVRKgz9FfxWEYd*KbA+3-yTCAPjyKTLtj zbccpxx>1HfK&}-N;W0lGEpn* zI?G$Yc6}PiL%dbxWY$nuM?{qt8wC=f@a`K!bfMMaJnl266JOOevUSmQb*hL145hQ`NjpU1{;G)EF@xvEn6}1&`S>#-} ziBD_BXoX$YTBme)S6f9LSJjJO$4P^8^cLl3zvkt}^Ikj?PMJHc7^-u?E)P)?e>Z(5 z!vyG1%E2EWc+D}}uyP?hg(fXE!{!P2ctl!d_x0(;{ufQj2tv VC!^9HH0#z64N%v@nVA8qe*@7dV!;3a literal 0 HcmV?d00001 diff --git a/de/bilder/gif/img2040_en.gif b/de/bilder/gif/img2040_en.gif new file mode 100644 index 0000000000000000000000000000000000000000..5581b59c810965e7cfced50cc789a2c4bd6363ac GIT binary patch literal 2940 zcmZuvc{o&U8$T_Uyp>9*k$BsLD2_2IX+@2tvL@>&rx3E1EsDw#lO!F6Y-8+$v5qA| zkwex}W9ik~5F+zd;-&LF$9G-dU*B_GXRf)Q`@Vno@AtbO{WE%66j}o$wqg!~a2$ug z@Bcm!;~>O&Jf54ITLrlP?^gj1_zMCUf)EHoAqXS-Km@}Oj6g67!59SNL=u4^1c49~ zLNExyiCPqfPy|9z2*n^2Ct5KW!Vm~UAq;~sVkCsa5RO1N3gH-_MF11f01GsOYMhuu z95A2(hA|k%iLnT{Kwt!g5e!Cff&~i0C<3D>jAAf~6Qn>bhQJsKV;GF#fFo#yaRkOu z7{_27Oa-g~7$6N;0$Lyk1_NvW4X{8nP6#4ma8Lxn5CkXmfw3S$Q3S;h6er{Y79feC z2!gFX_+*!lVu(R@G>-b4q!{bJfKMcL45E6AczA&p%7#QK_u`> z|Nkw>fIO(;0E0oFKp^1r`3(&X91h3G$cRKD?E}34Ol$=tibE?zx9vR;+88D(p=8rq zOoQ%h*hyuaF3D(#-U7P}R&}SpqRStQ+IFTit1W)x@jRQz4b1k$1DE`4o(dcq!zos; z2irIb)O!a{u5@tjVs&SpR#+)ZjdwO+>56C?Qp;W5FfVwXsN4EIx1a4`pqj8?Mmtw@ zuI`>~`&&l~j9)_(w)3(P@`meU-^z!%$C=Xt z7M3V9eNxYuOvGj93+Wf-exK^PwX!I2G@42i-T7d<7v)pTm+FX556Ca8cGA^A2YBl>)w&^7V3y8_Gqc(=K+8 z9&m-S*#^^BoKv&119q3JQ_bI7>g4rh%0`IP{v}^DYJP9zQ%zU-lyTXpJr&wJ#8l81 zwDuY&#-bR+Yh^x1@^e^_x!jr&*PrJ>pt`8l)LN4tWgseM)kiL zhuO)DO$&op*H8+04F*4zp4C)x|4@G(qAsIW8GYPYy>X~$3T;(o343Gd0fw+Otj{Wp z(mElX-aPA7!*QNhy_TOQ#LJni)U&)X{AOE^lTY|g`x|A2#}#DCDqeX8|LC!^jQUZ% z_Yct@T~|Vmlz%W^rK$1W%AWM|g9FE{a=^eo&o|Y34iBab8Bykbwt4=uR5{|Su>GcI z*bPP*-Sy)QRA0mPCmT~mo>@l`S{nu&N>|2Zf(2bt=ZO)_b@7R(*rL`!`k;Ai@ifLa8 z&qFm^S{6li6~{$8B}+Uh*&|sjvfViZk4{@%{)rXZC>Hjx_oFbcf48v3nsCTP?&j&7 z1CHo{yHL1|kZf~t1ud2)qLJ2EK;ABu{_W2G@N`jpX0HCvO==-Z+K!v<=A4@EV@Dp` zC$sssE0G&zN0B!=V8cxb&bpp~E!4E^iSQHUt2g>Q%pmnNh^DV8 zeRyfT&spZ*IVWE*M$YxC_kg1P=E2yIMKl^MlRoke?-j+N}Ieby$cCL}f z#ynbD(A(Hzt6c(G`$b!Buhh|I<2}ZlCr>Z$6o;$vS5_oAj=y%NP~Dfa@=|6=jK7iI zk7%|~REdqq?y)0AySg~xImvzk$9x}u?3!^|<|d=Pr=!<&#ohWIy@%|0#*}IjURsu@ z9PDgJQ!)*VD$CY1+HLHeS1>uR5qNAV_gom&Y+rqD&S}{^lla$tlWN{9e`N);BLTg+ zq;jTdu##Ch*R*J~FP|)wZ`hJo<1|5k#$Umj3W~5`OIt1w#I&t1RN_W!SIqKc>LzS;}~BvJVdK4Yq*aeWfiiHQe=2najGAUJj$}(*gjCHw7I;Tym?)@G;=0x zQ@-y~f&KYDJs~?zSW^E!WubiCb8+R`;gaocan=I|{_?(bHt3z7zO-Gu9fdhY_VBm8 zVqvRpS-9kNVPZ?tP|mHs%4Q+^m6qlm)%?mDr3AL(Q0rUEpX`hw)4|4L2JgHN{fdo9 zppk{97+r^|>f@Ib?!NP3WA4{qka)6Zom^?TNpESfgJY{yb{mWpKS|!=r|dm$(1q*$ zve)9U@8^?Ddhh&-U*A6)W4$eZZG2TD9Am1uX6iK_8rk|$!pq*DVKeQl(Qu@~C2}j) z^F6k&U0%prza_{}U7{CjJjL1HUu!U|@&oTMih&tpjM}m8`A)A+IQ9N(#O9}eREPyX zphfDce)U-Esb86?b zXZ(59!{0k8^=QEKuOGZ%+|ItCoAON{X%i%Z+r20pboZbPUj8bZZKwS8nuFz&*QJ^Y z6>f_=)bmXH+060`vBinRl%!AAw3j!pyH?M}j**z0`r=H)S`bsG{kdqJZ%Oh}WAe^} zf2+$Kd}Ho=S#f5eRAa=v8(u4j78iY{a<)4mX1$A}a!~A}>4~P6I$y6>JWU7jnt@k3 Wb}GqBQ&-Q{e0bOC*S2~!bof8bkG;_V literal 0 HcmV?d00001 diff --git a/de/bilder/gif/img2041.gif b/de/bilder/gif/img2041.gif new file mode 100644 index 0000000000000000000000000000000000000000..aea3207824bd4a5a8cee1590b4841e53c752b77f GIT binary patch literal 5497 zcmaJ^cT^MG)&~(TVtHPauBdd7B1Jl)D1?q8p%*EkHjH=j6$LCM+rO){y*U;{o+l06wZ9er&WK+9zmQ|Wa~ih(zZmIQf46&7JGRRF%j$9SF^U}kwsmxI zgWB4;gP_oV@K=Aw|JHTPbm9fm{;6Z@0Rr3pL&ott*fuKj*cL)7L!1cS=pAE+pY`@(8%>HM);{U_% zug1TjG_=h3-Myet5cnU(|C+47>&JrsOx91(vFZOcSwH)J$z9g*@&Y@!c-lfio)8!W z3i1G56+NE*4Dh=B;F7`g8#V*6T9DEqw7k~`azCW(W$x_|rb>=FY+tfQ9FHC+m~Xh$ zph!DMn}8oJH?4P_86cF8V|B_9X^O1wlrmm8{_;Tj$~e(`LBL9fSUHmld?_`mlu>Qi z97=bZTeqpkw)U!mK;s7@cDU#d)zWsIW>13>%_}LQu&CNR={48O3d{D-yB#p4(YDt5!^tNGb;w&G)D7z4XQD;W7g}Vl zHDkxp+mQZiWfrjW43TEOuLx{b&_jAZE1x~dO!H70Uq<5yK5hA#u%|g7Yxqp%%GI!r zFw?n6>0qMOLs1{b`FO>#^qJ5b1CHEJHgSBHkUVCY#qfojTJw-I8fFVm92SM%rCqZ# z%k$7uTwMfXeU`a>0phUy7$F7)Ost`{R!Nq;-9%A3B*3%?t@dN=YPKUdeKv4c*mpW3 z!jOUgiAW=gH<2ZLw+J<>-g3DphQ(Fb0u+toMhBf3044b&MDV70@gnAh7rVzNbEiwR zarPO#RFPC1+}1?IoPQ~R6G-fKVzqBzxbE)r3{P3B&F8M&C_9n zFyUCf(Kzk9wn3cL8(gb@pYA4}+sC7`(Y)TcCjMykMC)ej*D<&1rs4sm&Gv(xwd!hT zT&tI5HS-#<$&#hweGa&`d9kql$DnIk$SQ|ZmX~maw>6KzrO!PC-!uGi%r=pa3Wd!r zg?nwTDdNiIjHg!OE+UY{U3|~hoyq$e`=5rU(_+iLv-c^Br6Z5gwT0a0`n@}$JF7)d zW$|@L4i^zAM0yx4`ZZINnw9%Hhnw6`WCRdhC2O%=zS(c`bV!nH*}A$t9+W)eSQ_F= z)&4|jEcE~brng$D} zCgw4nQ%!Bl#UHJqV~5;t70tfk#eeM4t6A=%wvwxVeESq|t7dJzPl9Uvxm5M*!QQf0 z$j0}VB}bp9_0vrZnw=*&KZP>tzEhuO>ts;8e`7l^|D>S*4FQi~+3*R&CtqRit9WlT%Ny_vlhyMw!dVoo&Zz=%v4o3%D5c=OI?}Euc0D zZ3I71!f79}y-8~^^1l;=)1^&+lhx8tC_5^o4{?3KSy&l;X1$m>PT?B&kIE>uMOz8L zLwvDuO^GzuOeF&hzjV14sb4uQe^)@eH2g*){h_X6mVXDk-k;^pDy~vgtg$BIrgG4T zJ&zxQM*ip-Ox<^Vt80I#C`E6j=bfIE%YeNQ;KbHQsyisq2VyFMUq$Qd+Fx1LHfa`F zs@rU^%4gp%cySBw9mq8zja#KO&HY5nG z#IX2IWAPdH2jxWIX?nTa)rXjSxzat9b6Zi$V6?ZJaDP?sW>X?(xn1?()H}Q6!~%M5 zU-j!2(Y?k*%sqZ6|4s8w-%aS)WeLB2#r{p^&D6QG4}}PU*T_toca5bavc8=h$-}>q ztgYXj%A?!Z&^<5|H*lB_-0$yUy+hWwkeBc`o(Z@3@c2iz(I z=_t*eAO6@Ts$WTym(}-H+?RyesI%)@HOcl!>yt>aaLUtl01NC;`(C`y4&6;%;DRK^ ziIFR6d|mIV#JnN~me%KQkca)gG`~966BA$32vRd>w2F@x4HrDysaZerEJ4<)lV;|@ z;^VZZ#*GcO0Djk)Q3`n8)~$=j%C$aV@7P)4BOrCslDO3LG zGC8-nJU!~UqV{zq?dM`Vn5K5p+Ehm1n04!~W2{h?VCezvfsbr#(*sP*&O_QfY3cxX$s+qbW>*SbAHU=Hzm|lHUhiBM=Zp1jwOYCiT6tF zE4P3xpdoOAIb#W04U<~d__&TPo_&Qo_bE`&-{+*j4KmPL4`cvYjsQtzVzg{?<yi}-S63l-C-YJzrFBwH%33W zA|Y>CUz(cNz5HqGitEAZn&B=JplSP~+2Mw&)VHDSA5^tgiC}R%)y+u>RjK~!AGeO? zV$e&Kfg(X=&$ZbPx~AfQR5Yjv<&<&S7A;8!w=DxD-`xL(gdCKC-j*yA5iTPDYb16oeQBa-nicLVgKAGm0;plo(>z5wd`ehR6q;LTMV5w_G(Kv zbCxx?+i}0ZV|AL&SqKTgj)fN$1VKx~W_SlzGj-D+p;*fDwD7fUmbcRS0+^~zNGxa=dlm|76NHE53F@_)ZAu7WXR=++RMfjJaB69sa1u`O2_Y&AN z-6mP>y=CnKFD7UdC*%ks)o(^}0Ro)WVilYdllI)+H~RVkeQia4s+_zXfL$J#QbmFSkSe^!5|5Tsd`puE zb;)l42;jDB;Wx1wR_UQIl4-|| z4oKFC-PA5~+tY^8mCujI-X%keF~W!9nL3)`XXf9>;NM~IncD4-(7M6M4yFZo;7z~* zO;LB8;#D3Z=UK8$GK_~96KClyApOaji^RQn|$KuoDsL7NKZj22@@+r zKok+^W(~_eBY>Lb^{S;VX=6{J9L94d_n}M0zLQ9+{GJ?JCo5^zNM7d{`*GXg%n)2= z_U>xD;|?rZICJ`IM$|qG*O%c!NutHYQqqG>wsQ4wX{RX`Em`@NzA%bUPQGR+Xcf+| znsI^2!xxeo8JWb*mi$mFMim+8zA9-qaa&0EftP}jQBq)%1vs&>y#1eU?b}ks}|4FT|XX%^fc$fW?aD>I$W2r+;JeZ_Ct&fC2@vS*^Gw9 zIaF!{$aF-P8v9lCV1aosNN)>%oT)qrpAL5}WnN7$LRGUGgW3Xgx)dUaF#H?JBamP9 z0UFm49Hs(YHj$Fjd9kE7MM5;qtiL0P~a7 zmGF9VcNv|OEo`w^OnR7HwTwF6BN}DsY~k4?TX`zL9ij=2Mtq%!lWpafKb_>mLI9qK z3?gK(nV0eSVKvQ4m0hhLafVS14YrGKy<5(=cMFlAG)lcMA}}VV08$s3bB9fd_bgKP z9Q+!LOEM5?cmmOVP14D{aX*q6ep*5k9U9$g5*b*xh9w$vrX{8lBe=rjVwznBh(+ki z@7qxf7(Z(Zh=^OYH=m=mES##9Q*Z2EqM>! zBB8`g;lTW^KwwsHblLTMI*W#Wi#A!8x|r6Q{uOjoxesQqoEOt><%idzQu3ynv**|9 z+c|vT7rZRFklYxiZ~~ULUkeaKSHSRgbOZH;z?TlCp2mx9|>N=!L891lloi zRDYXF&%<}h`^7Hnc=hm?EW&bKKd3$`SHJMR{Zck!A+w_QRB};NJX_mSzSi<>t;apC zUAb%isTO&ggRv~+++86^1+4ZW7p4Z*y#lPwfOXtfGx`u%G`C$>biL|qY$U=7UdiSU z9cIy?KfsY>9F$^LKIEKHYrf zdmJF9z&smls3^{HhM0S?C?H7fo@LRKibgLkl5j(-9yx4OiFATm(M=jPvMYafXTEl~ zyKfJZg0N@?!eQ4ITS20yEMVS>J-O=z z)v=FnuMo~mwzy9x*^s;MDu^OqVU!%15_`a`jhD zXH_>1>WDQLn)Pl{Nye74*%lGuaet+e{q@CDW*4xm});&K_3q zbG?>B4-f?LTXKI!9Q}7hHMx1Hr5=pYUK|G>szR;C_aWo{Dyofv!-0oR6$|4bDr#X? z-SC+^v%C|?oIA;a1jqIXxe>YZXDK%Zl29^5_QP1d6{S#RGD}6y z88eA*pRAafWV(2(RHeVBa$xtuRNahfjC*+FW%c?e;oiil9iAIe*~*ZXtpK>a|(r}W#Q^FGSV|jFv3_nU$V6WW%8^`vWg_#&Wr@}?EG2T_i+m3 z1=vc?EJKkDz7Y8OaF%??RwMnE-dB0&2{AWLlJA@8;pOo9L-TgUca^bI*Q}-(#mVh@ c%_nBxb@5D_txd89&#~vuaps<1#6S^QJlmJo! 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 ST<32A54->DxpN0Y^#1_5g`%SX literal 0 HcmV?d00001 diff --git a/de/bilder/gif/img2042_en.gif b/de/bilder/gif/img2042_en.gif new file mode 100644 index 0000000000000000000000000000000000000000..9ea76cf38d3b6bc1c0c8cad5cf6658d246b15c0d GIT binary patch literal 8726 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 literal 0 HcmV?d00001 diff --git a/de/bilder/gif/img2044_en.gif b/de/bilder/gif/img2044_en.gif new file mode 100644 index 0000000000000000000000000000000000000000..f9be680c89b23ad18b1822e9358f62e99792d35e GIT binary patch literal 3260 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 U=RsMM&9i?JzYJ~`6#?k~4L`Fc_y7O^ literal 0 HcmV?d00001 diff --git a/de/bilder/gif/img2045_en.gif b/de/bilder/gif/img2045_en.gif new file mode 100644 index 0000000000000000000000000000000000000000..7e70f60bd32831608907d799e1f5159f46e9322b GIT binary patch literal 2891 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 literal 0 HcmV?d00001 diff --git a/de/bilder/gif/koords_en.gif b/de/bilder/gif/koords_en.gif new file mode 100644 index 0000000000000000000000000000000000000000..85a298f1e71866a2c195a6d56b083c5616ae739e GIT binary patch literal 3847 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 G^8WyhvX-X+ literal 0 HcmV?d00001 diff --git a/de/bilder/gif/linien.gif b/de/bilder/gif/linien.gif new file mode 100644 index 0000000000000000000000000000000000000000..333f6abe7bf82d46b8cdce463afee8df974cf07b GIT binary patch literal 959 zcmZ?wbh9u|3}sMe_|Cxa|NnmmAPL7n{(m6%|Lxnib8~aI0mUJB8xR1Q+mcd?7?`Ep zUHpS}LyA%}fm|I0m!i_-Y@j#;6SEk)pe|69QP(#!FD13OB&{?ryCgF|uedZfEio@$ zA+50prWs}$1EaE2W=U>hL0W!MZeoc-QfeklNeRThJO*Y(sEtq&9R*}9APf225-Z>) zGK--)7bpjEsu0|%AjKeE67EHbX_?t2iAg!BB_#;`3aI)~RDn#Aft!RP1vXRAJ25x4 zC=p?pB&uN$X^<(Ra8saKKu*%Z6LM%KGYa~q=H?ew;d5wFqG&TFQdTgDga(ESM&cqw%FI zm^!$1vflamMJbtii6yCd#g)Y+skx~NI=~dp0LlyO97`A&StL9*EI8QAA*>a1Vnd=M zgMh5p9FL7kP903TS$9rMR5;eJ;M^tSxoOGC$r{0{Voq*adV0D+@~JtVo0pxPZBhK{ z&dJTo&(C*g-o#Js?c`H^;vgcnP^{MFYD;n%k}xu ziKQv=Wu}=XYj17Ks}<_?-oEbc?uyT^?w;Ph{{H?3X6|Dg+cq4X&?fBdvS!CdrwNRV G4AuZBIZ^Kb literal 0 HcmV?d00001 diff --git a/de/bilder/gif/marker.gif b/de/bilder/gif/marker.gif new file mode 100644 index 0000000000000000000000000000000000000000..d184013ffc1621c95e47d988a3458bacac66e937 GIT binary patch literal 989 zcmZ?wbh9u|6k!Ns_|Cxa|NnmmAPL7n{(m6%|Lxnib8~aI0mUJB8xR1Q+mcd?7?`Ep zUHpS}LyA%}fm|I0m!i_-Y@j#;6SEk)pe|69QP(#!FD13OB&{?ryCgF|uedZfEio@$ zA+50prWs}$1EaE2W=U>hL0W!MZeoc-QfeklNeRThJO*Y(sEtq&9R*}9APf225-Z>) zGK--)7bpjEsu0|%AjKeE67EHbX_?t2iAg!BB_#;`3aI)~RDn#Aft!RP1vXRAJ25x4 zC=p?pB&uN$X^<(Ra8saKKu*%Z6LM%KGYa~q=H?ew;d5wFqG&TFQdTgDga(ESM&cqw%FI zm^!$1vflamMJbtii6yCd#g)Y+skx~NI=~dp0LlyO9ETVfIb=Kx7!EdbaI3|vn4sv~ z%qQ;D(^0VKFoT3~))^1MhNFE<_Dv!;C#twk77T2PIk{=+>FJv8W;~UJ4_v02*gmsa zDg4~APt%<1D`&_u$N83uLR(LMdFV4&HPLIX*H*2o3!Q`?sq75RKGPLn-&XrdG{<+d z-$gH-*+c?)5H0qt k;)}tZZZ%_e-HIP8PM=cN&3n3Pr~cDP3nEwXa4=W{03%IU#{d8T literal 0 HcmV?d00001 diff --git a/de/bilder/gif/meta_3.gif b/de/bilder/gif/meta_3.gif new file mode 100644 index 0000000000000000000000000000000000000000..875d8642945d0e93278ee16dc7c78f2191b73c90 GIT binary patch literal 6635 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 literal 0 HcmV?d00001 diff --git a/de/bilder/gif/muster.gif b/de/bilder/gif/muster.gif new file mode 100644 index 0000000000000000000000000000000000000000..173fd79b81ecd8e0dd202186fc8cbe81f15aaa33 GIT binary patch literal 12239 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 literal 0 HcmV?d00001 diff --git a/de/bilder/gif/olga_2.gif b/de/bilder/gif/olga_2.gif new file mode 100644 index 0000000000000000000000000000000000000000..4d6825cb2069d0ee0936341ab1d5344d3243aa5a GIT binary patch literal 4114 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 literal 0 HcmV?d00001 diff --git a/de/bilder/gif/olga_4.gif b/de/bilder/gif/olga_4.gif new file mode 100644 index 0000000000000000000000000000000000000000..2617e77d71d632ae4db8e0e90a16f7a64ce09e90 GIT binary patch literal 2714 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 e(vraw(Es$n@_K6P#R6gFQ=B_|62Z2kvae+4N3 literal 0 HcmV?d00001 diff --git a/de/bilder/gif/raster.gif b/de/bilder/gif/raster.gif new file mode 100644 index 0000000000000000000000000000000000000000..36d13ebf650cb25a4247fc8a483fb83387d7175d GIT binary patch literal 7270 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 literal 0 HcmV?d00001 diff --git a/de/bilder/gif/sspicon_.gif b/de/bilder/gif/sspicon_.gif new file mode 100644 index 0000000000000000000000000000000000000000..3f51b52e0bab527bc626be1432669408bd3479be GIT binary patch literal 2723 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 Xc~kowKhJwrx#Q#G6O)U1I2fz}q-$_y literal 0 HcmV?d00001 diff --git a/de/bilder/gif/taskman.gif b/de/bilder/gif/taskman.gif new file mode 100644 index 0000000000000000000000000000000000000000..d02b136d58d16578f73cfda144deedddec413bef GIT binary patch literal 13646 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 f!`ZsYcV4U=)`#}?74QE8s5C4W literal 0 HcmV?d00001 diff --git a/de/bilder/gif/taskman_en.gif b/de/bilder/gif/taskman_en.gif new file mode 100644 index 0000000000000000000000000000000000000000..05e622a8f87e08006def2b61e10342aa14f2ffea GIT binary patch literal 13004 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 literal 0 HcmV?d00001 diff --git a/de/bilder/gif/tpa.gif b/de/bilder/gif/tpa.gif new file mode 100644 index 0000000000000000000000000000000000000000..d0f5df223db3e20334c3c515be27e1008278a336 GIT binary patch literal 3072 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 literal 0 HcmV?d00001 diff --git a/de/bilder/gif/tpa_en.gif b/de/bilder/gif/tpa_en.gif new file mode 100644 index 0000000000000000000000000000000000000000..6caf984d1559e5364b53587ff97a01145e5b51ee GIT binary patch literal 3131 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 NSLo(nI5;5H{{XH8NofE8 literal 0 HcmV?d00001 diff --git a/de/bilder/gif/wr_modi.gif b/de/bilder/gif/wr_modi.gif new file mode 100644 index 0000000000000000000000000000000000000000..0bbed1d0b74dc2a13e7928be92088251dc9ba5d4 GIT binary patch literal 5558 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 S{*JSIM3V&iL%6s=C;tZv;EYND literal 0 HcmV?d00001 diff --git a/de/bilder/gif/xcontrol_en.gif b/de/bilder/gif/xcontrol_en.gif new file mode 100644 index 0000000000000000000000000000000000000000..01522fb0acf6c3171ea5848a83d68d2de95e9d37 GIT binary patch literal 3947 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 + + + + +Die Anleitung zum TOS: Die Ein-/Ausgabekanäle des BIOS + + + + + + + + + +Home +BIOSBIOS +Das BIOSDas BIOS +Einklinken in den Reset-VektorEinklinken in den Reset-Vektor + +


    + +

    3.2 Die Ein-/Ausgabekanäle des BIOS

    +

    Die folgende Tabelle ist eine Zusammenfassung der Kanäle, +welche dem BIOS bekannt sind. Zu beachten ist, daß per Bconmap +weitere Kanäle installiert werden können. +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    KanalNameBedeutung
    0PRTparallele Schnittstelle
    1AUXserielle Schnittstelle
    2CONConsole (mit VT-52-Sequenzen)
    3MIDIMIDI-Schnittstelle
    4IKBDIntelligent-Keyboard-Prozessor
    5RAWCONConsole (ohne Steuerzeichen)
    6——ST-komp. seriell (Modem-1)
    7——SCC Kanal-B (Modem-2)
    8——TT-MFP (Seriell-1)
    9——SCC Kanal-A (Seriell-2)
    +
    + +

    Hinweis: Ausgaben über Kanal-5 (RAWCON) können in +einer deutlich höheren Geschwindigkeit erfolgen als über +Kanal-2 (CON), da die Steuersequenzen entfallen. Ein weiterer Vorteil +ist der daraus resultierende größere Zeichenvorrat. +

    +

    Querverweis: +
    Bconin   Bconout   Bconstat   Bcostat   Verzeichnis U:\DEV +

    +
    + +Home +BIOSBIOS +Das BIOSDas BIOS +Einklinken in den Reset-VektorEinklinken in den Reset-Vektor + + diff --git a/de/bios_cookiejar.html b/de/bios_cookiejar.html new file mode 100644 index 000000000..da4e8f264 --- /dev/null +++ b/de/bios_cookiejar.html @@ -0,0 +1,10621 @@ + + + + + +Die Anleitung zum TOS: Cookie-Jar + + + + + + + + + +Home +BIOSBIOS +BIOS FehlermeldungenBIOS Fehlermeldungen +VT-52-TerminalVT-52-Terminal + +
    + +

    3.7 Cookie-Jar

    +

    Der Cookie-Jar wurde mit TOS 1.06 eingeführt und stellt eine +Verallgemeinerung der Systemvariablen dar. Es handelt sich dabei um eine +Tabelle von einzelnen Cookies die wie folgt definiert sind: +

    +
    typedef struct
    +{
    +    BYTE cookie_id[4];   /* Identifikations-Code */
    +    LONG cookie_value;   /* Wert des Cookies     */
    +} COOKIE;
    +
    +

    Um mit Cookies arbeiten bzw. diese nutzen zu können, inspiziert +man zunächst den Inhalt der Systemvariablen _p_cookies (0x5a0L). +Befindet sich hier ein Nullzeiger, so bedeutet dies, daß noch kein +Cookie-Jar im Speicher installiert ist. Beim Einsatz der MiNTLibs des +GCC sollten die dort zur Verfügung gestellten Funktionen benutzt +werden! +

    +

    Jeder andere Wert ist ein Zeiger auf eine Tabelle von Paaren von +32-Bit Werten (den sogenannten Cookie-Jar) der benutzt werden kann, um +den Jar gezielt nach bestimmten Cookies abzusuchen. +

    + +

    Bei der Wahl eines Cookie-Namens sollte man unbedingt die +folgenden Punkte beachten: +

    +
      +
    • Kennungen die mit '_' beginnen sind für Atari reserviert +
    • +
    • die Cookie-ID sollte aus vier ASCII-Zeichen bestehen +
    • +
    • man sollte aus der Cookie-ID auf das zugehörige Programm +schließen können +
    • +
    + + + + + +

    Das Ende des Cookie-Jars wird durch den Null-Cookie +(Hex: 0x00000000) gekennzeichnet, der als Wert die maximale Anzahl von +Einträgen im Jar enthält. +

    + +

    Um einen Cookie einzutragen, sucht man über _p_cookies +nach dem Null-Cookie und überprüft, ob der Jar noch Platz für einen +Eintrag bietet. Wenn dies der Fall ist, wird der neue Cookie an der +Position des Null-Cookies eingefügt, welcher wiederum um eine +Position nach unten geschoben wird. Anderenfalls muß Speicher für +eine größere Tabelle angefordert werden, der alte Cookie-Jar +kopiert, und die Systemvariable _p_cookies angepaßt werden. +

    + +

    Um einen Cookie zu löschen muss man diesen zunächst +suchen, und dann alle folgenden Cookies (einschließlich des +Null-Cookies) um eine Position nach vorne kopieren. +

    +

    Tip: Quelltexte für die wichtigsten Funktionen im +Umgang mit dem Cookie-Jar können der Zeitschrift ST-Computer +(Ausgaben 12/1990, 01/1991) entnommen werden. +

    +

    Querverweis: Cookie- und XBRA-Liste   BIOS   Beispiel-Code +

    +

    3.7.1 Beispiel-Code

    +
    /* 'get_cookie':  fragt den Wert eines Cookies ab.
    +                  Als Parameter werden dabei die ID des zu suchenden
    +                  Cookies, sowie ein Zeiger auf den gefundenen Wert
    +                  übergeben.
    +
    +                  Die Routine liefert den Wert FALSE falls der
    +                  angegebene Cookie nicht existiert... */
    +
    +typedef struct
    +{
    +    LONG id;             /* Identifikations-Code */
    +    LONG value;          /* Wert des Cookies     */
    +} COOKJAR;
    +
    +
    +WORD get_cookie( LONG cookie, void *value )
    +{
    +  static WORD use_ssystem = -1;
    +  COOKJAR *cookiejar;
    +  LONG    val = -1l;
    +  WORD    i=0;
    +
    +  if( use_ssystem < 0 )
    +    use_ssystem = (Ssystem(S_INQUIRE, 0l, 0)==E_OK);
    +
    +  if(use_ssystem)
    +  {
    +    if( Ssystem(S_GETCOOKIE, cookie, (LONG)&val)==E_OK )
    +    {
    +      if( value!=NULL )
    +        *(LONG *)value = val;
    +      return TRUE;
    +    }
    +  }
    +  else
    +  {
    +    /* Zeiger auf Cookie Jar holen */
    +    cookiejar = (COOKJAR *)(Setexc(0x05A0/4,(const void (*)(void))-1));
    +    if( cookiejar )
    +    {
    +      for( i=0 ; cookiejar[i].id ; i++ )
    +        if( cookiejar[i].id==cookie )
    +        {
    +          if( value )
    +            *(LONG *)value = cookiejar[i].value;
    +          return TRUE;
    +        }
    +    }
    +  }
    +
    +  return FALSE;
    +}
    +
    +

    3.7.2 Cookie- und XBRA-Liste

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CXNameAutorBeschreibung
     x3DMNSven Kopacz3D-Menu
    xx3RDBOle PahlThird Button
     x60HzJean-Pierre Rasquon60Hz resident
     x8*8Rainer SeitelSchriftumschaltung für GEM-Programme
     xA2svHarald SiegmundTrapsave
     xAB40GE-Soft68882.PRG
     xACCSSteffen EngelACC.PRG
    xxAFntHayo SchmidtAES Font Loader
     xAgK0Marcel WaldvogelAusGuck RAMdisk
    xxAHVRAlexander Herzlinger, OverScan GbRVRAM
      ALHP Alman HP Deskjet Screendumper
    xxALICSven KopaczAlice
     xALRMTorsten LangDriver for DIGIFON TDS3000
    xxAmANSven KopaczA-MAN
     xAMC1Arnd BeißnerMonitor Switchbox
     xAMC2Arnd BeißnerPC Keyboard Driver Software
    x AMCGArnd BeißnerAMC-GDOS
     xANSeBorek LupomeskyANSI-Emulation
    x APGMAndreas PietschSysGem
     xARAeARAnyMARAnyM ethernet card emulation
     xARTSMassimo FarinaScreen-Artist screensaver
    xxasGTHarald Siegmund, adequate systemsWacom Graphiktablett Driver
     xASumHolger Nassenstein, MW-electronicASUNLENK
      AVmw Virus Warning Program
     xAVOJOliver JoppichOliver Joppich's Anti Virus program
     xAVSVAlexander BartonAV-Server
     xBASHEdgar RöderBourne Again Shell
    xxBBD2Michael MaaßenBastel-Bus-Treiber V2.xx
    x BCKWC. DupuydaubyBackWard
    x BGEMThomas MuchBubbleGEM
    x BGHDThomas MuchBubbleGEM-Help-Dämon
     xBHdlSteffen RichterBadHandle
    x BHLPThomas MuchBubbleGEM Konficookie
    xxBIGSJulian Reschke, SciLab GmbHBig Screen
     xBIOCTiemann BjörnPirosca
      BLNK Screenblanker
    xxBLOWGeorg Acher, Michael EberlBlowup030
    xxBScnRoland SkuplikBACKSCAN
     xBSIMMarcel WaldvogelDrive B Simulator
     xBSTEMatthias AndräBigSTE
     xBUG1Markus FritzeBugaboo Debugger
     xC24PCybercube Research LimitedCyRel 24Bit-Patch
    x CACHRobert FederleCache-Control
    x CALDWalter HermannComputer Aided Loudspeaker Desgin
    x CASEJulian ReschkeCasing Type Gemini
     xCatSHayo SchmidtCatStick
    x CaTTCybercube Research Ltd, Toronto, CanadaCyRel Cattamaran
     xCB2KClaus BrodClaus Brod GEMDOS Bug Patch
     xCBCEClaus BrodClaus Brod Critical Error Handler Patch
     xCBDFClaus BrodClaus Brod Dabbel Feature
     xCBHDClaus BrodClaus Brod HD Driver
     xCBHYClaus BrodClaus Brod Hyper Format
     xCBITGuido SawadeC'T Bus Interface Driver
    x CBTSAndre FelbrichCrazy Bits Tabletttreiber System
     xCCDACCDTempus Word
     xcdMCGuenther LeisCDROM.XFS
     xCDOT Crazy-Dots Grafikkarten Treiber
    x ceciCENTEKCecile Festplattentreiber
      CFIX Console Fix
      CFsl Compo FSel
    xxCHAMKarsten IsakovicChameleon
     xCHBT Changes
    xxCHN1 Changes
      CHNG Changes
     xCHTWDirk HaunChatwin
    x CICNRoger JordanC-ICON
     xCISYIngo CiechowskiCISYSTEM
     xCJARVolker JanzenCookie.prg
    x CJar JarXXX Program
     xck01Arnd BeissnerCookie library
    xxCKBDPascal FellerichComposed Character Deluxe Keyboard Driver
     xCKJRJulian ReschkeCreate Cookie Jar Program
    xxCLCKSieghard SchäferMega-ST Hardware clock TSR Utilities
     xCLK1Dieter JankowskiMEGA ST Clock Utility
      CLOK CLOK for GMT settings (?)
    x CM16Cybercube Research LimitedCyReL's M16 Versatile Installation Program
      CNTSDavid Godec, Sacha Hnatiuk, CENTEKCentScreen
     xCOLOMeinolf SchneiderColos Mono-Colour Converter
     xCPSLPatrick Dubbrow, Jürgen HeindelCaps Lock Display
     xCRACProtarProtar HD Driver
    xxCRITThomas Schröter, Fast Electronic GmbHCrypt-It
    xxCSMDCybercube Research LimitedCyReL's Serial Mouse Manager
    x CT40 CT40 68040 Falcon Beschleunigerkarte von Rodolphe Czuba
    xxCT60Didier MequignonCT60 68060 Falcon Beschleunigerkarte von Rodolphe Czuba
    x CTCHEdgar RöderMaster-Module Catch.mmx
     xCtCpJean-Pierre RasquinCapsLock Display
     xCTSFLars Erik OsterudCTS Bug Fix
    x cVDICybercube Research LimitedCyReL's M-16-1280 VDI Driver
      CWCo Compo FSel
    x DATE Led Panel Date
    xxDATLDelirium Arts A. Freude & P. Scherer GbRTwiLight
      DAWN Before Dawn
    xxDBFXJulian ReschkeDiablo Emulator patch fix for MiNT
      DCdd Double-Click Software Data Diet
     xDCF7Sven KopaczDCF77
    x DCSD Calamus Bildschirmtreiber
    xxDECDMarkus FichtenbauerDECDriver Cookie
    xxDEPINorbert MarschalleckDeskPic
    x DHSTThomas MuchDocument History Protocol
      DIG2Emmanuel JaccardDigiplay
     xDJBXRoland SkuplikDeskJet-Init BIOS-Erweiterung
      DKEYBrainstormDead Key
      DNTR DNT ramdisk
    x DPATMartin OsiekaDesktop Patterns
     xDPRSWilfried CordesPrinter Buffer
     xDRIVStefan HintzDrive Edit
     xDRRHDietmar RabichWodan Keyboard Layout Program
     xDselSven KopaczDsel - Systemkern für Fileselector
     xDSSODavid von StettenSokrates Keyboard Driver
    x DYDLDimitri JunkerDIR_LWR
     xDYJADimitri JunkerCCONRS.PRG
     xDYJDDimitri JunkerDosound_MPC
     xDYJTDimitri JunkerToBig
    x DYNLRobert FederleDynamic Link Library Driver
    x DYWLDimitri JunkerWIN_LNK
    x DYwlDimitri JunkerWIN_LNK
    x F117 Beschleuniger SST
     xEADCJürgen LuersEasydisc - Ramdisk
      EBPO EB Modeleur Universel Modeler
    xxEdDISven & Wilfried Behne, BELAEdDI
     xEDFXHansi Richstein, Kaktus GbREDPBFIX.PRG
      EGON EGON! CD-ROM Driver
     xEMNPJiri LamacMNP emulator
      ENV$ Desktop environment manager
    xxENVNVolker JanzenEnviron.prg - setzt GEM-Environment
    x ENVRPascal FellerichEnvironment manager
    xxEProRoger BurrowsExtendos Pro CD-ROM Driver
     xETMM. NickEntmauser
    x EURO Euro-Zeichen
    x EUSB Ethernet USB API exported by inet4
     xEXRAMarcel WaldvogelExtra RAM Speeder Card Software
      EXTD TOS File Name Extender
    x FaKEGuido FlohrFakeMiNT
     xFALTRichard KurzFaltoff Screen() MEGA STE bugfixer
    x FAX!Ingo LinkweilerSTarFax
     xFAXRJulian F. Reschke, TKR GmbHFaxRedirector
     xFHFXThomas BinderF030HFIX - Falcon-GEMDOS-Handle-Fix
    x FIX2Uwe SeimetFIX24 68030 -> 24 bits
    xxFLTPPatrick DubbrowFlyTop
     xFLXDAlex EsserFlexdisk
     xfMSXJ. Jørgen von BargenfreeMSX emulators
    xxFOseHayo SchmidtFontselector
      Fose Font Selector
      FrmD Form_do_it
    x FSEL(Standardcookie)Extended File Selector (e.g. Selectric™,Freedom™)
    xxFSERFranz SirlFast Serial Interface Routines
    x FSMC Advanced GDOS
     xFSmpMartin PatzelFileselector
    xxfVDIJohan KlockarsfVDI
    x FxOP Tele Office
     xF_3DRalf TrinlerFocus 3D
     xGABIMichael SchwingenGabrielle Serial Port Typewriter Emulator
      GBel GemBell
    x GCOMThomas MuchGEM Component Object Model
    x GDEVEdgar RöderGNU-C Device-Driver
     xGEHCGE-SoftHypercache Turbo
     xGEHDGE-SoftHarddisktreiber
      GEMB GE Soft HD Driver
     xGENVJulian ReschkeGEM Environment Setter
     xGfixThomas BinderGamefix for Falcon030
    xxGI30Andreas BärGandhi
     xGIGARoland AlderGiga Box ST Driver
     xgk5" Gerd KnopsTreiber für 5.25" HIGH-Density-Drittlaufwerk
     xgkCOGerd KnopsCalamus Thingy
     xGLASUland TäffnerFree memorydisplay
    xxGLBLVolker JanzenGEMLABEL System Extension
    xxGMNIStefan Eissing & Gereon SteffensGemini
    x GMTC Timezone CPX
     xGNUCEdgar Röder, Jwahar BammiGNU-C Library
    x GnvaGribnif SoftwareGeneva Multi-tasking AES
    x GOBJThomas MuchObjectGEM PurePascal library
     xGOffLaurenz PrüßnerGrow/Shrinkbox off
    x GSNDRichard KurzGEM Sound
     xGSP1Steven van RossenGEM Spooler
      GSXB Generic sound Xbios
     xGULMJwahar BammiGulam Shell
     xHABOJulian ReschkeHaboo Harddisk Cache
      hadeMedusaHades
     xHAMMIngomar Otter & Hybrid ArtsMelody Maker Software
    xxHBFSHarald BeckerBoxKite File Selector
     xHcP6Michael SchwingenNEC P6 Hardcopy Driver
      HDDR HD Driver
    x HDEXUwe SeimetHDDriver-eigenes Interface
     xHDEYBorek LupomeskyHard Disc Eye
    xxHDJRDieter Jankowski, J. Reschke, Hard&SoftHushi HD Interface Driver
     xHDLDJean-Pierre Rasquin'HD-LED'
     xHDPRRoland ScholzHD Protect
    xxHDRCTorsten LangAUDIODRV
      HDST Eickmann HD Driver
     xHDSWOliver ScheelHigh Density Switcher
    xxHFIXPatrick DubbrowHandle Bug Fix
     xhFRBSteffen EngelBIOS-Treiber für Rwabs-Transfers
     xHIDSOliver ScheelHigh Density Disk Driver
     xHMDUThomas UhlHM2 System Memory Dump
     xHMOCAndreas AlichHänisch Modula Object Cache
     xHMRDThomas UhlHänisch Modula Run-Time Debugger
     xHMRSThomas UhlHM2 Run-Time System
     xHPHCMartin WunderliHP Deskjet Hardcopy
     xHPLJRobert FederleHP-Laserjet-Emulator V1.04
     xHSCDJulian ReschkeMiNT-CDROM-Treiber
    x HSNDRichard KurzCrazySounds
     xHSndRichard KurzCrazySounds
      HWAM Cookie Jar creator program
     xIBMPLars Erik OsterudNorwegian->IBM Printer Converter
    xxICFSDirk HaunIconify Server
    x ICST INETCUST Cookie
     xIDSKStefan BeckerIcon Desk
     xIMACWilfried CordesBootsector Guardian
      IMNE Imagine graphics card
    x INSJOliver GroegerCookie Jar installer/extendor program
    x INXRDietmar Püttmann/Dietmar RabichIndex generator
    xxiPRNPeter MisseliPRN
     xIRSBIlja RateiczakSEGA Shutterbrille
     xiTMARobert WeissMFP Timer A Interrupt Handler
     xJAM1Pascal FellerichButler James
    x JAM1vhf ComputerJanus Emulator
    xxJB2GJohn McLoudBios2Gdos
    xxJCLKPetr StehlikClocky Multiutility
     xJCNBJens C. NeffeJCN Bootselector
     xJCNCJens C. NeffeJCN Multi Accessory
     xJCNHJens C. NeffeHardcopy Program
     xJCNTJens C. NeffeCocteau Word Processor
    xxJFTPJan-Hinrich FesselSCSI driver for generic tape devices
      JINX Jinx
     xJMLBJohn McLoudMcBoot
    xxJMLSJohn McLoudJML Snapshot
     xJSHDJürgen StessunHyper Density Control Program
     xJUSTRobert Irrgang, Trillian Computer AGJustify
    x J_ScJohn McLoudSECURE.PRG
    x KAOSAndreas KromkeKAOS TOS 1.4
     xKbEvMichael SeyfriedMM2 Keyboard Handling Module
    x KEYTThomas MuchKEYTAB
      KGTF Tos Fix
     xKIDIRobert IrrgangRAMdisk
     xKLMEAndreas KromkeCMD
     xKREGJulian F. ReschkeKillRegisters
     xKyMpEric SmithKeyboard Macro & Remapping Utility
    x KyWtManfred LippertKeyWatch
    xxLaceUlf Ronald AnderssonLaceScan
     xLACYOliver MichalakLAZy-Shell-III
     xLALALaurenz PrüßnerAlbolala BellHook Sample Player
     xlancTorsten LangMiNT-Net ethernet driver for AMD LANCE
     xLASBKlaus Garms, DMCLaserbrain
    xxLAWCRobert FederleLook-Ahead-Write-Cache
    x LDGMOlivier Landemarre && Dominique BereziatGEM Dynamical Libraries (LDG)
    xxLEDPChristoph ZwerschkeLED-Panel
    xxLEmuUlf Ronald AnderssonLaceScan command-keys
    x LityChristian KrügerLiberty
     xLLCRLogilexLogilex 1st Lock
    xxLMusUlf Ronald AnderssonLaceScan mouse accelerators
    xxLOGBUwe Holtkamp, Jürgen HoltkampLogbuch
     xLoSeMarkus KohmSER-LOG
     xLP/2Laurenz PrüßnerMalloc 2 Gemdos Vector
     xLPCDLaurenz PrüßnerCarrier Detector
     xLPJMLaurenz PrüßnerJoy Mouse
    xxLTMFOliver ScheelLet 'em Fly
     xM16sCybercube Research LimitedCyRel M16-1280 Graphikkarte
     xM16XCybercube Research LimitedCyReL M16 XBIOS-Emulator
    xxmaccKen Badertscher, Atari CorporationMaccel 3
    x MADDUwe SeimetAdd mem for TT
    x MADNRobert FederleNEX-Output
     xMaesOlivier LandemarreMyAES
    x MagCDirk SteinsMagic Dials Configuration program
    x MAGNMichael SchwingenMAGNUM-Karte
    x MagXSven&Wilfried Behne, Andreas KromkeMagiC
     xMASTNaumann&RöderMaster
    x MaTC Matrix True Colour Graphics Card
    x MbArManfred LippertMenuBar
    xxMBRDMichael MaaßenBlit_RD: Ramdisk
      MCL_ MiNT control
    x McSn MacSound
     xMCSPF. AschwandenUnimplemented Integer Instruction und Floating Point Handler
    x MCWR Microwire DMA sound interface
    xxMDIAHelmut NeukirchenMulti-Dialog
     xMDRKSteffen EngelMegaDark
    x MDSaBill PennerMedical Design Software's Serial Fix
      MFAC Multi Accessory
     xMFFMMarkus HaeblerMarcus' file selector for MiNT
     xMFIXThomas BinderMONOFIX.PRG
    x MFMV Wird von Magic installiert
    xxMFNTHayo SchmidtFontloader
    xxMGEMPascal MerleMultiGEM
    x MgMcTempelmann, Kromke, Behne, ASHMagiC Mac
    x MgMxAndreas KromkeMagiC Mac X
    x MgPCFranz Schmerbeck, Andreas KromkeMagiC PC
    x MgSnDidier MequignonMagiC Mac Sound driver
     xMID3Lars Erik OsterudMIDINET3
     xMIMAOliver ScheelMIDI Manager
    xxMiNTEric Smith, Atari CorporationMint/MultiTOS
    xxMIPSMichael MaaßenSPOOL120.PRG - Druckerspooler
     xMJAFMartin JahrAUTOFONT
     xMKHCMarcus KraftHardcopy Fixer
    x MkJrThomas SchallarCookie Jar creator program
     xMM2XThomas TempelmannMegamax Modula
    xxMMACEmanuel MoecklinMagic Mouse Accelerator
     xMMUTOliver ScheelMidi Maze II Utility
     xMM_2Markus FritzeMidimaze 2
     xMN3DManfred LippertMenüs und Submenüs im 3D-Look
    x MNAMStandardcookieName cookie
     xMOAFMartin OsiekaARROWFIX
    xxMOGRMartin OsiekaGEMRAM
    x MPROThomas KuennethMagic Pro Config CPX
     xMRAMRainer SeitelMore RAM
     xMSPDLars Erik OsterudMouse Speeder
    xxMSPOEmanuel MoecklinMagic Spooler
      mstx Mouse tricks
     XMTCI MATRIX MatGraph - TCxx
    xxMTftMarkus KohmTrapper
    xxMUPFGereon SteffensMupfel
    x MWHLArmin DiederingMWheel
      MZTR TRASH
    xxMZVTMichael ZuhlDriver videotext decoder from Print-Technik
     XM_IN MATRIX MatGraph - Cxx
     xN203Noud v. KruysbergenMulti Accessory
    x nAESJens Hiescher, Rainer Mannigel, Woller SystemeN.AES, Das AES für MiNT
    xxNAH3Noud van KruysbergenN_ALTHLP Snapshot-Tool
     xNBELRobert IrrgangSOUND.PRG
     xNBLLVolker JanzenNEWBELL.PRG
    xxNCLNOliver ScheelNiceLine
     xne2kTorsten Langne2000.xif
     xNERVLaurenz Prüßner/ST-MagazinNo etv_critic_alert
     xNETSPAM's SoftwarePAM Novell Software
    x NEXBRobert FederleNEX-Buffer
    x NEXKRobert FederleNEX-Toolkit
    x NFMTAndreas KunzINFOMAT
      NFnt Neodesk Font Loader
     xNKCCHarald SiegmundNKCC - Normalized Key Code Converter
      NLdr Neodesk Loader
     xNMGESimon GleissnerNo More amc-Gdos Errors
     xNO7PLars Erik OsterudNorwegian->7 bit printer converter
      noCF noSystem
     xNOR5Lars Erik OsterudNorwegian Keyboard Driver
      NOVA NOVA graphics card
     xNSC1Noud v. KruysbergenN_Syscom accessory
    x Nspd Nemesis
    x nTASSteffen EngelTAS-Instruktionen
      NTK4 NTK4 Falcon MOD player
     xnTOSRainer MannigelMilanBlaster
      NUL> System startup utility
    xxNVDISven&Wilfried Behne, BELANewVDI
    x OBNLStephan Junker, Dirk HaunLoad-Time-Linking Protokoll
    xxOFLSHans-Jürgen Richstein (Standardcookie)Check Open Files
    xxOPMMMartin MertensOpen Helper
      OSBL Screen Blaster
      OSTT OverScan TT
    x OTOS oTOSis - TOS emulator for Linux/68K
     xOV24 OverScan Hardcopy Driver 24 pins
     xoVDIOdd SkanckeoVDI
     xOVDJKarsten Isakovic, OverScan GbROverscan Hardcopytreiber für HP-DeskJet
     xOVEPKarsten Isakovic, OverScan GbROverScan Hardcopy Driver 9 pins
    xxOVERKarsten Isakovic, OverScan GbRAutoSwitch OverScan Hardware Driver
     xOVEXKarsten Isakovic, OverScan GbROverScan Exception Patch
     xOVFSKarsten Isakovic, OverScan GbROverScan Fileselector Patch
     xOVIMKarsten Isakovic, OverScan GbROverScan Hardcopy Driver
     xOVLSKarsten Isakovic, OverScan GbROverScan DMC Laserbrain Patch
     xOVRDKarsten Isakovic, OverScan GbROverScan RamDisk
     xOVUTKarsten Isakovic, OverScan GbROverScan Screen Blanker
     xOVWIKarsten Isakovic, OverScan GbROverScan Window-Size Patch
     xPAMNPAM's SoftwarePAM Network Driver
     xPAULPascal FellerichPaula 2, Amiga-MODfile-Player
    xxPBUGEmanuel MoecklinPeaceBug
     xPDEBDimitri JunkerPureDebuggger
     xPDebDimitri JunkerPureDebuggger
    xxPDOSChris LathamPowerDOS
     xPDRZPatrick DubbrowLockGetrez
     xPFIXJulian Reschke, SciLab GmbHPTSINFIX Fix
     xPinpJens SchmidtParallel Input Port Driver
     xPKSHPahlen & Krauß SoftwarePKS-Shell
    x PMMUAlexander Herzlinger (Standardcookie)PMMU reprogrammed
     xPOISBernhard Artz/Gregor Tielsch/ShiftPoison!
      POWM PowerMouse
     xPRCSPeter RohdeCopySTar
     xPRDSPeter RohdePeter Rohde Disk Speeder
     xPRMDMarkus KohmMIDIPRT
      PRN! WandelSZ
     xPRNßMichal Bernards/ST-MagazinWandelSZ
     xPRO5Lars Erik OsterudResident virus check/kill/protect program
     xPROBMarkus und Michael MeurerProfibase
     xPROTMeinolf SchneiderProtos Screen Utility
     xPRTDRobert FederlePrint to Disk V1.10
     xPRTOPeter RohdeST Tools
     xPRTRProtarProtar HD Driver
     xprtrKonrad HinsenAtari->IBM Printer Converter
      PSND ProSound Driver
     xPSSGThomas MuchPaint Shop Hardcopy vector
    xxPTOSAlexander HerzlingerROMRAM: copy TOS in TT-RAM
     xQIKMGereon SteffensQuick Mouse
     xQMACWilfried CordesQuick Mouse Driver Accessory
     xQMCPWilfried CordesChemplot Quick Mouse Driver
      QST2 Quick ST 2
      QST3 Quick ST 3
     xQUANBernd BlankQuanTOS Multiutility
     xRAILOtmar BirnRail Manager
      RaSn Rational Sounds
     xRESGJörg HahneRESET GUARD
    xxRFLXKarsten Isakovic, OverScan GbRAutoSwitch Treiber für Reflex Graphics Card
     xRFUSMichael BernardsRufus terminal program
     xRGUSDaniel HollisArgus
     xRINGJulian ReschkeTelefonklingel Detektor
     xROMDAndreas KromkeMagiC DOS Treiber für ROM Module
     xROT8Thomas FürhölterRotate
     xRPITArpad BeszedesTIMEFIX
     xRREGReiner WiechertRestore Register
     xRSLTVolker Brodel, GengTECGengTEC VGA Monochrome/16 Colour Driver
    x RSpdStephan SkrodzkiRS_SPEED (Serial Fix)
    xxRSVEHarun ScheutzowRSVE Patch
    x RSVFHarun ScheutzowRS232 Version Fast (HSMODEM)
     xRTKCRobert TolksdorfKeyclick
     xRTOBRobert TolksdorfOptobell
    xxRWINKarsten IsakovicRootWindow
      SAM System Audio Manager
     xSBKMStefan BrückRing Recognition in Modem Routs
     xSBTEStefan BrückTerminal Program
     xSBTSStefan BrückTrap Spy
     xSCAHJulian Reschke, Hard&SoftSpeed Cache
    xxSCKM MagXNet (SOCKET.DEV)
    x SCPN Screen Blaster 3 screen enhancer
     xSCRDRobert FederleScreen To Disk
     xSCRNEdgar RöderScreen Scroll
     xSCRSUrs ThürmannScreen Blanker
    xxSCRWUwe SeimetScreen Watch
    x SCSI SCSI Driver
      SCSV Line Art Screensaver
     xSDCHSven Kopacz2C - Second Chance
     xSDESMarkus und Michael MeurerSoftdesk
     xSDskGerhard HölscherSoftdisk
     xSDWNMarcel WaldvogelScreenDown
     xSELCMichael HaydnC-Lab File selector
     xSENVAndreas GroßSet Environment
    xxSFA^Sevo StilleFontloader system
     xSFIXAllan Pratt, Atari CorporationSerial Port Fix
      SFMN SafeMenu
     xShLkJean-Pierre RasquinShift Lock
     xshlpJörg Westheideshelhelp
    xxSKEYOle PahlSpecialKeys
     xSLCTStefan Radermacher & Oliver ScheelSelectric
    xxSLifMichael SchwingenSoundLifter
    x SLIPSven KopaczSocket library
    xxSM00STAGE MicrosystemsSOTA Printer Spooler
    xxSM01STAGE MicrosystemsReProK Office Management DUO
    xxSM02STAGE MicrosystemsReProK International EM-NET II
    x SMALM. Nick, H. Schmidt (Standardcookie)Small AES Icon fonts
     xSMAUMarcel WaldvogelSet Mouse Accessory
     xSMonKarsten Isakovic, OverScan GbRSysMon
    xxSMTTKarsten Isakovic, OverScan GbRSM-124 Emulator
     xSNAPKonrad HinsenThat's Snap Accessory
     xSOFSMarkus und Michael MeurerSoftscreen
     xSOSWMarkus und Michael MeurerSoftswitch
    xxSpcEChristian GrunenbergSpace
     xSPCKRobert IrrgangRAMdisk for SPC Modula
     xSPEEStefan HintzMouse Speeder
     xSPEKStefan Hintz, Wilhelm ElektronikSpektrum-Grafikkarten
    xxSPEXStefan Eissing, SciLab GmbhSteve's Printing Exzessory
    xxspMRMartin RoggeDrucker und Filespuler
    xxSpolAndreas MandelFlexible Printer Spooler
     xSPRGBernd Blank  STARTER.ACC
    x SR17 Beschleuniger SST Cockpit
      SSND Petra
     xST-CMatthias AndräCache Program
     xST17Daniel HollisST-68017
     xSTATLaurenz PrüßnerStaTOS
    x STEMThomas GöttschSTEmulator
    xxSTEWJohn McLoudStewart
      STFA Sound treiber fur Atari
    x StIcJohn McLoudStewart Iconserver
      STiK ST Internet Kit
     xSTMSMartin Backschat & Peter MelzerST Magazin Screendump
    x strk StarTrack XBIOS Erweiterung
    x STRXMartin SperberSAT-Trax Antenna driver
    x SupV SuperVidel Treiber
    x SVARBrad PickeringShows MacMiNT
      SVGA Super VGA Emulator
    xxSWAPUwe Seimet, Maxon ComputerOutside
    xxSwTmMatthias WallmannUhr
    xxSYMBRobert FederleSymbol driver
      SYNL Dynamic Link Library Driver
     xSYNTMarcel WaldvogelSyntex
     xSysEMartin DürrschnabelSystem Editor
     xSysoHecker + Knobbe Computersysteme GbRST Sysop
     xSYSTSven KopaczSystime
     xSZ_MNickel SzebrowskiDynamic Mouse Speeder
    x S_DRPeter HilbringCDROM SCSI driver
     xT206Harun ScheutzowPATCHX06.PRG
    x T2GMThomas BinderTOS2GEM
    x TALKGadgetsMegaTalk
      TAPE TapeBIOS
     xTASSMarkus FritzeTurbo Assembler
     xTCFSBorland MünchenTurbo C File Selector
    xxTCRBRalf BiedermannTurbo Cache
     xTenvMarkus BankEnvironment Set Program for Terminal
     xTFIXKarsten Isakovic, Atari CorporationTOS 1.04 fix
    xxTHNXDirk HaunThinx
    xxTHRMOle PahlTemoeraturdatenauswertung
     xTHSTJiri LamacTurboHST
     xTIM3Lars Erik OsterudTime Driver
     xTIM5Lars Erik OsterudTime Driver plus Screen Blanker
    x TIME Led Panel Time
    xxTK40 MC68040 ToolKit
     xTL3DTorsten LangDritte Floppy
     xTLWVTorsten LangSTGAWVBL
    xxTmonThomas Tempelmann & Johannes HillTempleMon
      TMONThomas Tempelmann & Johannes HillTempleMon
    x tmsWTMSTMS Wacom-Treiber
     xTOpWLaurenz PrüßnerTop Manager Watcher
     xTOUCSteffen EngelTouch
     xTPatLaurenz PrüßnerTos Patch
     xTPGMJörg WestheideTraPatch
     xTRAKJulian F. ReschkeTrack Speed
    xxTraPJörg WestheideTraPatch
     xTrppManfred LippertTrapper
     xTRUEChristoph ZwerschkeTrueDisk
     xTSENJürgen KriegeTSE Net
    xxTSWPMatthias BeckerTonySoft Write Protection
    x TTTFMarcel WaldvogelThirty Two to Twenty Four
    x TUBSAndreas AlichTUBS - The Ultimate Boot Selector
     xTWFSKonrad HinsenThat's Write File Selector Accessory
    xxTyp1Frank KnobbeDaisywheel accessory
    x UFSLMichael ThänitzExtended Universal Font Selector
      UIS3 Universal Item Selector 3
     xUKB1Uwe KoloskaFastload
     xUKB3Uwe KoloskaFastload plus MIDI Through
     xUN*XMichael SchwingenUnixname (/->\ Converter)
     xUSCKUwe SeimetCHECKIT
    xxUSHDUwe SeimetDiskus HD driver
    x UsNmCarsten TolkmitUser-Name-Cookie
    x USPKUwe SeimetHard Disk Auto Parker
    xxUSRSUwe SeimetRomspeed
    x USSCUwe SeimetSCSI Treiber für Hatari und ARAnyM
      UTRK Ultimate Tracker
     xVBLFThomas BinderVBLFIX.PRG
    xxVDIp VDI performance logger
    x VDLY Videlity
     xVECSStephan GerleVecshow
      VeiL Turbo Veille
    xxVFIXKarsten IsakovicVDIFix
    xxVFNTHarald SommerfeldtVdiFont
    xxVGASChristoph ZwerschkeVGA Simulator
    x VI-2Francois GaleaVidel Inside
      View View Protocol
     xVIRACarsten Frischkorn, GalacticVirus Alarm
    x VMEMRobert FederleVirtual Memory
     xVPCHRobert IrrgangVDIPATCH.PRG
    x VRAMAlexander Herzlinger, OverScan GbRVirtual Memory Management for the TT
     xVREPCarsten Frischkorn, GalacticVector Guard
     xVScoArnfried GriesertVirus Scope
    x VSCRJulian F. Reschke (Standardcookie)Structure of Virtual Screens
     xVSTMFocke FrentzenMIDI Transfer
     xvT52Cybercube Research LimitedCyRel VT52-Emulator
     xVTFXThomas BinderVT52FIX.PRG
     xVXCKMartin H. SmithVoxClock
    x WaHWWalter HermannHIGH_WAY
      WARP Warp 9
    x WaSAWalter HermannSATELLIT
      WBrd Bird's Wing
     xwdlgBehne & Behne GbRWindow-Dialog-Library (wdialog)
    xxWDOGRobert FederleWatchdog
    xxWEGADietmar RabichWEGA Libraries
    x WfNaManfred LippertAbfrage des Fenstertittel per wind_get(WF_NAME)
    xxWFSLGert KramerWindow File Selector
    xxWICOSven KopaczWinCom
     xWinKJörg WestheideWinKeys
    x WINXMartin OsiekaWINX
     xWINZClaus BrodLuftschloß/Winz RAMdisk
    xxWPROChristoph ConradWrite Protect
     xWRAPRichard KurzWarpMouse
    x WrApRichard KurzWarpMouse
    x XALT AlberTT GFX card driver
     xXBTNTassilo NitzMaus-Routine in 'XBOOT'
    xxXDskThomas SchallarX-DISK ramdisk
      XFRB Extended Fast Ram Buffer
    xxXFS1Edgar RöderMaster Module for extended TOS File System
    x xFSLDirk Haun, Stefan RogelExtended Font Selector
    x XgemEric RebouxWindframe Xgem
    x XHDIDiverse (Standardcookie)XHDI driver
     xXKBDAlex EsserExtended Keyboard
      XMMU TK40's interface for PMMU setting
      XMuz Ultra Player
     xxNetDaniel RoeddingxNet-ST
      XPCI XBIOS Funktionen für das PCI-BIOS
    xxxRmtMarkus GutschkeXREMOTE
    x XSDDStephan BauckeExtended Serial Device Driver
      XSNDThomas HuthDigi-Sound
    x XSSI Extended Screen Saver Information
    x XTOSLoïc SébaldExtend TOS
    x xUAG MegaVision300
      xUFC Extended Universal Font Selector Configuration Program
     xXWinKonrad HinsenExtended Windows module
      zCAC 680x0 Cache Control CPX
    xxzDCFRalf ZimmermannDCF-Time receiver
     x_5MSVincent RivièreZeiger auf den 200 Hz System Timer Interupt Vektor
      _AFM Audio Fun Machine
    x _AKPAtari CorporationKeyboard/Language Configuration
    x _CF_Didier MequignonColdFire CPU
    x _CPUAtari CorporationCentral Processor Unit Type
     x_DOSAtari CorporationGEMDOS-Einsprung (im GEMDOS 0.30)
    x _FDCAtari Corporation (Standardcookie)Disk Drive Type
    x _FLKAtari Corporation (Standardcookie)File Locking Extension
    x _FPUAtari CorporationFloating Point Unit Type
      _FRB Fast Ram Buffer
     x_FSRAtari CorporationPatch program for Serial port (TOS 4.00->4.04)
    x _IDTAtari CorporationInternational Date/Time Format
    x _INFAtari CorporationSTEFIX Program
    x _INUMartin OsiekaFormat for numbers
    x _ISO specifies the real keyboard/font nationality
      _JPD Falcon030 JPEG Decoder by Brainstorm
    x _MCF ColdFire features
    x _MCHAtari CorporationMachine Type
     x_METAtari CorporationMetaDOS
    x _MILMichael SchwingenMilan computer
    x _NETAtari CorporationGEMDOS Network Support
    xx_OOLAllan Pratt, Atari CorporationPool Fix
    x _PCIMarkus FichtenbauerPCI-BIOS
      _PKT Paket Driver Cookie
      _PWR Power Management unit
    x _SLMAtari CorporationSLM Driver
    x _SNDAtari CorporationSound Hardware
    x _SWIAtari CorporationConfiguration Switches
    x _T2W TOS2WIN Emulator
    x _T30Andreas KromkeKAOS TOS
    x _USB USB core API driver
    x _VDIMichael SchwingenMilan VDI
    x _VDOAtari CorporationVideo Type
    x __NF Native features proposal
      ΣFSC Falcon Screen
    +
    + +

    3.7.2.1 Cookie, 3DMN

    +

    3D-Menu +

    +

    setzt bei allen Menüleisten die 3D-Flags. Verbiegt Vektor 45 +(Bios) und 34 (AES). +

    +

    3.7.2.2 Cookie, 3RDB

    +

    Third Button +

    +

    Treiber für 3-Tasten-Mäuse am TT-Mausport (an anderen Rechnern +mit einer kleinen Modifikation) wie z.B. die GI-6000. Hängt sich in +joyvec ein. +

    +

    Status: Freeware +

    +

    3.7.2.3 Cookie, 60Hz

    +

    60Hz resident +

    +

    Schaltet 200 mal pro Sekunde auf 60Hz (Freeware, verschiedene +Spiele laufen dann trotzdem mit 60 Hz). Verbiegt 200Hz System Clock. +

    +

    3.7.2.4 Cookie, 8*8

    +

    Schriftumschaltung für GEM-Programme +

    +

    3.7.2.5 Cookie, A2sv

    +

    Trapsave +

    +

    Sorgt dafür, daß von den vier Trap Handlern keine CPU-Register +verändert werden (außer dem Rückgaberegister D0). +

    +

    Copyrightstatus: Public Domain. TRAPSAVE.LZH. +

    +

    Vektoren: GEMDOS-Trap, GEM-Trap, BIOS-Trap, XBIOS-Trap. +

    +

    3.7.2.6 Cookie, AB40

    +

    Die AfterBurner 040 FPU-Emulation ist installiert. +

    +

    Vektoren: Line-F ($2c), Branch or Set on Unordered Condition +($c0), Inexact Result ($c4), Divide by Zero ($c8), Underflow ($cc), +Operand Error ($d0), Overflow ($d4), Signaling NAN ($d8), +Unimplemented data type ($dc) +

    +

    3.7.2.7 Cookie, ACCS

    +

    ACCS.PRG +

    +

    Accessories werden aus dem Ordner \ACCS geladen. Verbiegt GEMDOS +Aufruf Fsfirst('\*.ACC') zweimal, danach Auskettung. +

    +

    3.7.2.8 Cookie, AFnt

    +

    AES Font Loader +

    +

    Auto-Ordner-TSR. Lädt neue IBM- und SMALL-Fonts für das AES +und paßt die rsrc-Routinen des AES an. Cookie enthält Zeiger, der +Zugriff auf auf Datenstruktur ermöglicht. +

    +

    Verbiegt Trap #1, #2 (AES/VDI) und #13. +

    +

    Status: Freeware bis v0.9. +

    +

    3.7.2.9 Cookie, AgK0

    +

    AusGUCK-"RAM"-Disk +

    +

    3.7.2.10 Cookie, AHVR

    +

    VRAM +

    +

    Virtuelle Speicherverwaltung für den TT030. +

    +

    Verbiegt hdv_rw, hdv_bpb, buserror, ikbdsys... +

    +

    3.7.2.11 Cookie, ALHP

    +

    Alman HP Deskjet Screendumper +

    +

    3.7.2.12 Cookie, ALIC

    +

    Alice +

    +

    macht alle Applikationen Iconify-fähig. Voraussetzung ist ein +Iconify-fähiges Betriebssystem. +

    +

    Verbiegt die Vektoren 45 (BIOS) und 34 (AES). +

    +

    3.7.2.13 Cookie, ALRM

    +

    Treibersoftware zur Ansteuerung der DIGIFON TDS3000 +Empfangsstation. Enthält eigene RS232-Routinen sowie einen +Taskswitcher, der auch im SV-Mode arbeitet. +

    +

    3.7.2.14 Cookie, AmAN

    +

    A-MAN +

    +

    verbiegt Vektor 45 (BIOS) und 34 (AES) und kann die MENU_ID +der installierten Accessories sowie zusätzliche Fensterinformationen +unter allen Betriebssystemen liefern. +

    +

    3.7.2.15 Cookie, AMC1

    +

    Software zur Monitor-Switchbox von Hard&Soft. +

    +

    3.7.2.16 Cookie, AMC2

    +

    Treibersoftware zum PC-Tastaturinterface von Hard&Soft. +

    +

    3.7.2.17 Cookie, AMCG

    +

    AMC-GDOS ist ein GDOS, welches im Wesentlichen den gleichen +Funktionsumfang wie das Atari-GDOS hat und wurde zusammen mit diesem +vertrieben. +

    +

    3.7.2.18 Cookie, ANSe

    +

    ANSI-Emulation (verbiegt Bconout-Vektor). +

    +

    3.7.2.19 Cookie, APGM

    +

    SysGem (Zusatz zu Sys-Info, zeigt Rechnerdaten an). Shareware. +

    +

    3.7.2.20 Cookie, ARAe

    +

    Atari part of the MiNTNet netword card emulation for ARAnyM. +Hooks auto-vector interrupt #3. +

    +

    3.7.2.21 Cookie, ARTS

    +

    ARTSEVNT.PRG. 'TT-Artist' screen saver resident part, by +Cybercube Research & Massimo Farina. +

    +

    3.7.2.22 Cookie, asGT

    +

    Wacom Graphiktablett-Treiber +

    +

    (als Cookie-ID für alle Graphiktablett-Treiber, die dem ASGARD +Standard entsprechen). Treiber mit Mausemulation und +Mausstatuspufferung für Wacom-Graphiktabletts der UD-Serie (Wacom +II-S und Wacom IV Emulation). +

    +

    Copyrightstatus: Löhnware. Bezugsquelle: as adequate systems +GmbH +

    +

    Vektoren: 200 Hz system clock ($114), XBIOS-Trap, +KBDVBASE.mousevec. +

    +

    3.7.2.23 Cookie, ASum

    +

    ASUMLENK +

    +

    lenkt Bildschirmausgaben von AUTO-Ordner-Programmen auf den +Drucker um. Verbiegt TRAP #1 und #13. +

    +

    3.7.2.24 Cookie, AVmw

    +

    Virus Warning Program +

    +

    3.7.2.25 Cookie, AVOJ

    +

    Anti-Virus-Programm +

    +

    3.7.2.26 Cookie, AVSV

    +

    AV-Server +

    +

    Verbiegt Vektor 34 (AES) +

    +

    Implementiert fehlende AV-Protokoll Funktionen für MAGXDESK. https://alex.barton.de/computer/atari/download/ +

    +

    3.7.2.27 Cookie, BASH

    +

    Bourne-Again-Shell der FSF +

    +

    Umgebogen: shell_p. +

    +

    3.7.2.28 Cookie, BBD2

    +

    Bastel-Bus-Treiber V2.xx. +

    +

    Ermöglicht die Ansteuerung eines Meß- und Steuerbus über das +BIOS. +

    +

    Verbiegt: prv_lst, prv_lsto, xconstat0, xconin0, xcostat0, +xconout0, trap #13 (BIOS). +

    +

    3.7.2.29 Cookie, BCKW

    +

    BackWard +

    +

    The ST emulator for FALCON 030 +

    +

    3.7.2.30 Cookie, BGEM

    +

    Wird ab BubbleGEM 05 zusätzlich zum Cookie BHLP angelegt und +zeigt auf eine Struktur mit Versionsangaben etc. +

    +

    Status: Freeware. +

    +

    3.7.2.31 Cookie, BGHD

    +

    Enthält Konfigurationsflags für den BubbleGEM +Help-Daemon. +

    +

    Status: Freeware. +

    +

    3.7.2.32 Cookie, BHdl

    +

    BadHandle 1/92, behebt den "ungueltiges +Handle" - Fehler diverser Programme im Zusammenhang mit GDOS. +

    +

    verbogen: TRAP #2 (VDI/AES). +

    +

    3.7.2.33 Cookie, BHLP

    +

    Enthält Konfigurationsflags für BubbleGEM. +

    +

    Status: Freeware. +

    +

    3.7.2.34 Cookie, BIGS

    +

    BigScreen 2 +

    +

    Das neue BigScreen für ST, STe und TT +

    +

    verbiegt: TRAP #2, XBIOS und VBlank). +

    +

    3.7.2.35 Cookie, BIOC

    +

    Pirosca +

    +

    Residenter Druckerspooler mit Hardcopy-Utility. +

    +

    3.7.2.36 Cookie, BLNK

    +

    Screenblanker +

    +

    3.7.2.37 Cookie, BLOW

    +

    Blowup030 +

    +

    3.7.2.38 Cookie, BScn

    +

    BACKSCAN - ST-Low-Screen-Copy +

    +

    BACKSCAN installiert sich in diversen Systemvektoren uns setzt +einen Cookie. +

    +

    Der Cookie 'BScn' enthält als Wert einen Zeiger auf folgende +Struktur: +

    +
    Offset    Gröβe     Inhalt
    + +0       int8_t    Versionsnummer (aktuell: 2)
    + +1       int8_t    Releasenummer  (aktuell: 3)
    + +2       int8_t    Backscan-Switch; =0 Routine aktiv, !=0 gesperrt
    + +3       int8_t    Reserviert, NICHT VERÄNDERN!!!
    + +4       int16_t   Anzahl der Zeilen pro 5ms, Obergrenzwert aus dem ACC
    +                    nicht überschreiten! max. 200, aber wohl nur auf einem
    +                    060er
    + +6       int32_t   Adresse einer Testroutine, die einen relativen
    +                    Testwert in D0.l zurückliefert; der Wert gibt an,
    +                    wieviel 'Zeit' der CPU zwischen zwei Kopiervorgängen
    +                    verbleibt. ACHTUNG! Der Wert schwankt
    +
    +

    3.7.2.39 Cookie, BSIM

    +

    BLiTSIM, ein "BLiTTER-Simulator" (hängt sich im TRAP +#14 ein). Er meldet auf eine Blitmode()-Anfrage bloß zurück, daß +ein Blitter installiert und aktiv sei. +

    +

    3.7.2.40 Cookie, BSTE

    +

    BigSTE +

    +

    Aus der Zeitschrift ST-Computer 1/1992 +

    +

    3.7.2.41 Cookie, BUG1

    +

    Bugaboo (Debugger). +

    +

    3.7.2.42 Cookie, C24P

    +

    XBRA-Kennung des CyReL 24Bit-Patch-Programms. Diese Programm +verändert den XBIOS-Vektor and wandelt die True Color Pixel Formate +aRGB nach RGBa um. +

    +

    3.7.2.43 Cookie, CACH

    +

    Cache Control +

    +

    AUTO-Ordner-TSR. Der Cookie zeigt auf eine Tabelle mit +Funktionen zur Verwaltung der CPU-Caches, angefangen beim 68020 bis +hin zum 68060. +

    +

    Cache-Control ist Freeware. +

    +

    3.7.2.44 Cookie, CALD

    +

    Wird von HIGH_END (Computer Aided Loudspeaker Design ab +Version 4.5) zur Laufzeit benutzt, um u.a. Messages mit Modulen +auszutauschen. +

    +

    Das Programm ist Shareware. +

    +

    3.7.2.45 Cookie, CASE

    +

    Gehäuseform (Gemini) +

    +

    Dieser Cookie legt fest, welche Gehäuseform Gemini beim Startup +im Willkommen-Dialog anzeigt. +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    0:520
    1:1040, Falcon
    2:Mega ST
    3:Stacy
    4:TT, MegaSTE
    5:ST-Book
    6:Tower
    +
    + +

    Andere Werte sind reserviert. +

    +

    Wird von CASETOWR gesetzt, welches sich in der +Gemini-Distribution befindet. +

    +

    3.7.2.46 Cookie, CatS

    +

    CatStick - Accessory. +

    +

    Bindet einen Joystick als Eingabemedium für das +Maustausch-Frontend CAT ein. +

    +

    Während der Laufzeit von CAT werden die IKBD-Vektoren mousevec +und joyvec verbogen. +

    +

    Status: Freeware. +

    +

    3.7.2.47 Cookie, CaTT

    +

    CyReL Dashboard, CyReL CaTTamaran GIOS +

    +

    Cookie des CyReL CaTTamaran TT030 Beschleuniger Moduls. Zeigt +auf die Einsprungadresse des CyReL CaTTamaran GIOS (General I/O +System, siehe CyReL CaTTamaran Developer's Documentation). +

    +

    Cybercube Research Limited, 126 Grenadier Crescent, Thornhill, +Ontario, L4J 7V7, Canada. +

    +

    3.7.2.48 Cookie, CB2K

    +

    Patch zur Behebung des 2kB Gemdos bug. +

    +

    3.7.2.49 Cookie, CBCE

    +

    Modifizierter Critical Error handler +

    +

    3.7.2.50 Cookie, CBDF

    +

    Dabbel Feature +

    +

    Umlenkung von Laufwerkszugriffen. +

    +

    3.7.2.51 Cookie, CBHD

    +

    Harddisktreiber +

    +

    3.7.2.52 Cookie, CBHY

    +

    Tastaturtreiber in 'Hyperformat'. +

    +

    3.7.2.53 Cookie, CBIT

    +

    c't Bus-Interface-Treiber +

    +

    3.7.2.54 Cookie, CBTS

    +

    Crazy Bits Tabletttreiber System +

    +
    typedef struct
    +{
    +  int16_t x;
    +  int16_t y;
    +  int16_t t;
    +  int16_t pressue;
    +  int16_t winkel;
    +  int16_t res1;
    +  int32_t res2;
    +  int16_t mac;
    +  int16_t mac_w;
    +} CBTS;
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    x X-Koordinate des Siftes/Lupe im CBTS-Screen absolut (0=linker +Rand; 2^15-1=rechter Rand; -1=alle Daten bis res1 ungültig, Medium +außerhalb der CBTS-Fläche) +
      +
    y Y-Koordinate des Siftes/Lupe im CBTS-Screen absolut (0=oberer +Rand; 2^15-1=unterer Rand) +
      +
    t Tastenstatus: 0=Keine Taste 1=Links 2=Rechts 3=Beide +
      +
    pressue Andruck: 0 (min) - 63 (max); -1=Daten ungültig +
      +
    winkel Winkel des Stiftes 0 (senkrecht) - 90 (waagerecht); -1=Daten +ungültig +
      +
    res1 Reserviert (muß 0 sein) +
      +
    res2 Reserviert (muß 0 sein) +
      +
    mac Absolute Nr. des angeklicktes Makrofeldes (0=links oben, +1=rechs daneben usw.; -1 kein Makrofeld angeklickt) +
      +
    mac_w Anzahl der Makros pro Zeile. Dadurch kann zusammen mit +mac die genaue Position des Makrofeldes bestimmt werden. Z.B. +Spalte 3, Zeile 5. Dies ist wichtig, wenn man in eigenen Applikationen +bestimmten Feldern eine Funktion zuweisen möchte und diese Funktion +bei allen Tabletts an der selben Stelle liegen soll. (Denn +verschiedene Tabletts haben unterschiedliche Größen und damit auch +verschieden viele Makros pro Zeile, wodurch sich mac +verschiebt! +
      + +
    + +

    3.7.2.55 Cookie, CCDA

    +

    Tempus Word 2.0 +

    +

    3.7.2.56 Cookie, cdMC

    +

    CDROM.XFS > V0.6 +

    +

    Dateisystem für CDROMs unter MiNT/MultiTOS > V0.4. +

    +

    Vektor: hdv_mediach. +

    +

    Status: Freeware. +

    +

    3.7.2.57 Cookie, CDOT

    +

    Crazy-Dots graphic driver +

    +

    3.7.2.58 Cookie, ceci

    +

    Cecile Festplattentreiber +

    +

    3.7.2.59 Cookie, CFIX

    +

    Console Fix +

    +

    3.7.2.60 Cookie, CFsl

    +

    Compo FSel +

    +

    3.7.2.61 Cookie, CHAM

    +

    Chameleon +

    +

    Accessory zum Nachladen/Entfernen von Accessories. +

    +

    3.7.2.62 Cookie, CHBT

    +

    Changes +

    +

    3.7.2.63 Cookie, CHN1

    +

    Changes +

    +

    3.7.2.64 Cookie, CHNG

    +

    Changes +

    +

    3.7.2.65 Cookie, CHTW

    +

    Chatwin +

    +

    Universelle Entwicklungsumgebung +

    +

    Verbiegt die xconout-Vektoren #2 und #5 (Ausgabeumlenkung). +Ältere Versionen verbiegen auch den Timer-A-Vektor. +

    +

    Status: Freeware +

    +

    3.7.2.66 Cookie, CICN

    +

    C-ICON +

    +

    Das Programm ermöglicht das Laden und Verwenden von Resourcen +mit Farbicons. +

    +

    3.7.2.67 Cookie, CISY

    +

    CISYSTEM (Ciechowsky Computer Innovations). +

    +

    3.7.2.68 Cookie, CJar

    +

    JarXXX program +

    +

    3.7.2.69 Cookie, CJAR

    +

    Cookie.prg +

    +

    Setzt Cookie-Jar auf 40 Einträge. +

    +

    Verbogen: Resetvektor. +

    +

    Status: Freeware. +

    +

    3.7.2.70 Cookie, ck01

    +

    Reset Handler der Cookie-Library +

    +

    Installiert einen Reset Handler, welchen den Cookie-Jar bei +erneuten Booten löscht. +

    +

    3.7.2.71 Cookie, CKBD

    +

    COMPOSE +

    +

    Läuft auf allen ST-kompatiblen Rechnern; ist ein erweiterter +flexibler Tastaturtreiber für Atari-Computer, der es erlaubt, +beliebige Sonderzeichen zu erzeugen). +

    +

    Features: Erzeugung von Sonderzeichen mittels dreier +verschiedener Methoden, auswechselbare Tabellen. +

    +

    Verbiegt IKBDSYS und ggf. resvector, kcl_hook und bell_hook. +

    +

    Status: Freeware. +

    +

    3.7.2.72 Cookie, CKJR

    +

    Installiert einen leeren Cookie Jar (ST-Magazin +3/1990). +

    +

    Verbiegt den Reset-Vektor. +

    +

    3.7.2.73 Cookie, CLCK

    +

    Zwei Auto-Ordner-TSR-Utilities für Mega-ST Hardwareuhr +oder Online-Anzeige der Tastaturprozessor-Uhr in Rechnern ohne +Hardware-Uhr. +

    +

    Verbogen wird der IKBD-Systemvektor ikbdsys wg. Hotkey. +

    +

    Außerdem erfolgt ein Cookie- und ein VBL-Eintrag. +

    +

    3.7.2.74 Cookie, CLK1

    +

    Utility für MEGA-ST Hardwareuhr. +

    +

    3.7.2.75 Cookie, CLOK

    +

    CLOCK for GMT settings (?) +

    +

    3.7.2.76 Cookie, CM16

    +

    Dieses Cookie wird von dem CM16_VIP.PRG (CyReL M16 +Versatile Installation Program) eingetragen, falls eine oder mehrere +CyReL M16-1280 True-Color-Graphikkarte(n) im System installiert +ist/sind. Der Cookie zeigt dann auf den Anfang der M16-STRUCTure +(siehe X M16s). Ist das niederwertigste Bit des Pointers gesetzt +(zeigt also auf eine UNGERADE Adresse) dann wird die +M16-STRUCTure gerade von einem anderem Programm bearbeitet/verändert. +Das LSB muss vor jedem Zugriff geprüft und mit einer +READ/MODIFY/WRITE Instruktion gesetzt werden. Nach der Bearbeitung der +M16-STRUCTure wird das MSB wieder zurückgesetzt. +

    +

    3.7.2.77 Cookie, CNTS

    +

    CentScreen +

    +

    3.7.2.78 Cookie, COLO

    +

    Colos +

    +

    Mono->Color-Converter +

    +

    Vertrieb :ASH +

    +

    3.7.2.79 Cookie, CPSL

    +

    CapsLock-Anzeige (ab V2.0), von Jürgen Heindel und +Patrick Dubbrow. +

    +

    In der Mega ST-Tastatur sind schon alle Vorbereitungen für eine +LED, die den Status der CapsLock-Taste anzeigt, getroffen. Auch in +ST/STE/TT läßt sie sich leicht einbauen. Das Programm installiert +eine VBLANK-Routine. +

    +

    3.7.2.80 Cookie, CRAC

    +

    Protar-Festplattentreiber +

    +

    3.7.2.81 Cookie, CRIT

    +

    CRYPT-IT +

    +

    Personal Data Protection für Atari ST/TT'. +

    +

    Verbiegt die drei hdv_-Vektoren. +

    +

    3.7.2.82 Cookie, CSMD

    +

    CyReL Serial Mouse Manager. +

    +

    Der Cookie zeigt auf einen Parameterblock im residenten +Maustreiber, der als eine AUTO-Ordner-Programm geladen wird. Der +Treiber klinkt sich in die Keyboard-, Mouse-, 200Hz- und +Reset-Vektoren ein. Zusammen mit dem dazugehörigen Accessory können +folgende serielle Muse an jedem seriellen Port des Atari +(ST/MegaST/STe/MegaSTE/TT030/Falcon030) betrieben werden: Microsoft +Mouse kompatible Eingabegeräte (Muse, PenMouse, TouchScreen), Mouse +System Corporation kompatible Geräte, Summagraphics MM Digitizer +sowie Summagraphics BitPad II Digitizer sowie kompatible Tablette. +

    +

    3.7.2.83 Cookie, CT40

    +

    CT40 ist vorhanden +

    +

    3.7.2.84 Cookie, CT60

    +

    CT60 ist vorhanden +

    +
    typedef struct
    +{
    +  unit16_t trigger_temp;
    +  unit16_t daystop;
    +  unit16_t timestop;
    +  unit16_t speed_fan;
    +  unsigned long cpu_frequency;        /* in MHz * 10 */
    +  unit16_t beep;
    +} CT60_COOKIE;
    +
    +

    3.7.2.85 Cookie, CTCH

    +

    Master-Modul catch.mmx +

    +

    Abfangen von ^C, ^\ und ^Z, Timeouts für Programme. +

    +

    3.7.2.86 Cookie, CtCp

    +

    Control Caps V1.4 +

    +

    CapsLock-Anzeige und Sonderfunktionen per +CTRL-ALT-Tatsenkombination. +

    +

    Verbiegt IKBD, evt_term, 1 VBL-Slot (falls alle belegt, verbiegt +letzter Slot per XBRA). +

    +

    Status: Freeware. +

    +

    3.7.2.87 Cookie, CTSF

    +

    CTSFIX.PRG +

    +

    CTS-bug fix. +

    +

    3.7.2.88 Cookie, cVDI

    +

    Dieser Bezeichner wird vom CyReL M16-1280 VDI-Treiber +verwendet. Er wird im VDI-Trap eingetragen. Das Cookie zeigt +auf einen Parameterblock im VDI-Treiber, der Informationen +über die momentane Auflösung, Modus, Line-A Konfiguration u.a. +enthält. +

    +

    3.7.2.89 Cookie, CWCo

    +

    Compo FSel +

    +

    3.7.2.90 Cookie, DATE

    +

    Led Panel Date +

    +

    Der "DATE"-Cookie enthält einen Zeiger auf ein +word-große Variable mit dem aktuellen Datum im Tgetdate-Format. +

    +

    3.7.2.91 Cookie, DATL

    +

    TwiLight - Der Bildschirmschoner +

    +

    Verbiegt TRAP #1, TRAP #2, 200 Hz System Timer, IKBD/MIDI, +Resvector, midivec (Kbdvbase), mousevec (Kbdvbase), joyvec (Kbdvbase). +

    +

    Vertrieb: DDT Digital Desktop GmbH. Delirium Arts Alvar Freude +& Peter Scherer GbR +

    +

    3.7.2.92 Cookie, DAWN

    +

    Before Dawn +

    +

    Bildschirmschoner +

    +

    3.7.2.93 Cookie, DBFX

    +

    Patchprogramm, das den Betrieb des Diablo-Emulators unter +MiNT 0.96 (und neuer) möglich macht. Wird ab Diablo-Version 1.6 +nicht mehr benötigt. +

    +

    Verbiegt die BIOS-Ausgaberoutinen für den Drucker. +

    +

    Status: Freeware. +

    +

    3.7.2.94 Cookie, DCdd

    +

    Double-Click Software Data Diet +

    +

    3.7.2.95 Cookie, DCF7

    +

    DCF77 decodiert die Signale eines +Joystickport-Funkuhrempfängers. Per Accessory frei konfigurierbare +Menü-Uhr. +

    +

    Verbiegt Kbdvbase->joyvec. +

    +

    Status: Freeware. +

    +

    3.7.2.96 Cookie, DCSD

    +

    Calamus Bildschirmtreiber +

    +
    struct DCSD_cookie
    +{
    +  int16_t version;
    +  void    CDECL (*init)(void);
    +  void    CDECL (*exit)(void);
    +  int32_t CDECL (*active)(void);
    +  void*   CDECL (*getbase)(void);
    +  void    CDECL (*gettlt)(uint8_t tlt[256]);
    +  void    CDECL (*blit_from_screen)(struct DCSD_BLITARGS *args);
    +  void    CDECL (*blit_to_screen)(struct DCSD_BLITARGS *args);
    +  int32_t CDECL (*custom)(int32_t par);      /* Customer function */
    +};
    +
    +

    3.7.2.97 Cookie, DECD

    +

    DECDriver +

    +

    Eesidenter Hardware-Treiber für DEC-Ethernetkarten am PCI-Bus, +komplette PCI-Interrupt-Verarbeitung, läuft nur auf Rechnern mit +PCI-Bus (Hades,...), PCI-BIOS (_PCI) wird vorausgesetzt. +

    +

    Vektoren: TT-MFP-Interrupt-Vektoren, abhängig davon, wie viele, +und in welchen PCI-Slots Netzwerkkarten stecken - diese Infos werden +vom PCI-BIOS bereitgestellt. +

    +

    Copyright: Shareware +

    +

    3.7.2.98 Cookie, DEPI

    +

    DeskPic (ACC und TSR-Programm) +

    +

    Bild als Desktop- und Programmhintergrund anmelden. +

    +

    Vektoren: VDI (ausgewertet wird die Nummer 114, recfill), +BIOS (zwecks Neuinstallation des VDI-Traps z.B. nach Start von +TOS/TTP-Anwendungen)). +

    +

    3.7.2.99 Cookie, DHST

    +

    Document History Protokoll +

    +

    Enthält im unteren Word des Cookie-Wertes die AES-ID des +Document-History- Servers. Das Document-History-Protokoll ist ab +StartMeUp! 7.01 verfügbar. +

    +

    Status: Freeware. +

    +

    3.7.2.100 Cookie, DIG2

    +

    Digiplay von Emmanuel Jaccard +

    +

    3.7.2.101 Cookie, DJBX

    +

    Die DeskJet-Init BIOS-Erweiterung meldet den DJ +automatisch ab, wenn er nachträglich eingeschaltet wird. +

    +

    Hängt sich in den BIOS-Trap +

    +

    3.7.2.102 Cookie, DKEY

    +

    Dead Key von Brainstorm +

    +

    3.7.2.103 Cookie, DNTR

    +

    DNT RAMdisk +

    +

    3.7.2.104 Cookie, DPAT

    +

    Desktop Patterns +

    +

    3.7.2.105 Cookie, DPRS

    +

    Druckerbuffer +

    +

    Status: PD. +

    +

    3.7.2.106 Cookie, DRIV

    +

    Drive-Edit +

    +

    Verbiegt die drei Harddisk-Vektoren. +

    +

    3.7.2.107 Cookie, DRRH

    +

    Wodan +

    +

    Accessory zur Tastaturbelegung. +

    +

    3.7.2.108 Cookie, Dsel

    +

    Dsel +

    +

    Systemkern für Fileselector. +

    +

    Verbiegt Vektor 45 (BIOS) und 34 (AES). +

    +

    3.7.2.109 Cookie, DSSO

    +

    SOKRATES +

    +

    Tastaturtreiber. +

    +

    Verbiegt den IKBD-Vektor. +

    +

    3.7.2.110 Cookie, DYDL

    +

    DIR_LWR +

    +

    Zusatzprogramm zum Patch von égale. +

    +

    3.7.2.111 Cookie, DYJA

    +

    CCONRS.PRG installiert neue CCONRS-Routine, mit +Korrekturmöglichkeiten (Cursortasten, Delete, Backspace,...) und +History-Buffer. +

    +

    Der GEMDOS-Vektor wird verbogen. +

    +

    Das Programm ist Freeware +

    +

    3.7.2.112 Cookie, DYJD

    +

    Dosound +

    +

    Ersetzt Dosound, Cconout und Crawio. Dies ist hauptsächlich +sinnvoll auf Systemen die diese Routine nicht unterstützen, also z.B. +auf einem PC mit MagiC PC (MPC). +

    +

    Verbogen werden GEMDOS und BIOS-Vektoren. +

    +

    3.7.2.113 Cookie, DYJT

    +

    To_Big +

    +

    Dieses Programm manipuliert die Dfree Routine des +Betriebssystems. Dies ist nötig auf Systemen mit Partitionen >2GB +(4GB) und Programmen die damit nicht zurechtkommen. +

    +

    Verbogen wird der GEMDOS-Vektor. +

    +

    3.7.2.114 Cookie, DYNL

    +

    Kennung des Dynamic Link Library Driver, mit dem das +dynamische Linken von Programmen auf dem Atari unterstützt wird. +

    +

    Status: Freeware. +

    +

    Bezugsquelle: noch nicht freigegeben, +

    +

    Benutzte Vektoren: TRAP #9. +

    +

    Achtung: derzeit noch in Entwicklung! +

    +

    3.7.2.115 Cookie, DYwl

    + +

    WIN_LNK +

    +

    Dieses Programm ermöglicht MagiC PC die Windowsverknüpfungen +als vollwertige Links zu nutzen. +

    +

    3.7.2.116 Cookie, EADC

    +

    Easydisc F +

    +

    lexible und resetfeste RAMdisk mit vielen Extras. +

    +

    3.7.2.117 Cookie, EBPO

    +

    EB Modeleur +

    +

    Universel Modeler +

    +

    3.7.2.118 Cookie, EdDI

    +

    EdDI von Sven&Wilfried Behne, BELA +

    +

    Der Enhancer installiert ebenso wie NVDI einen Cookie mit der +Kennung 'EdDI'. Das auf diese Kennung folgende Langwort ist die +Adresse eines Funktionsdispatchers, der mit der Funktionsnummer in +Register d0 aufgerufen wird. Der Aufruf erfolgt nach den Pure +C-Konventionen (Register d0-d2/a0-a1 und der Stack werden zur +Parameterübergabe benutzt). +

    +

    Bisher existiert nur die Funktion 0, die als Funktionsresultat +eine Versionsnummer zurückliefert, anhand er man auf die +unterstützten Funktionen schließen kann. +

    +

    Ab Version 1.00 ($100 wird zurückgeliefert) sind die Funktionen +v_opnbm, v_clsbm und vq_scrninfo vorhanden. +

    +

    Ab Version 1.10 hat v_opnbm, vq_scrninfo zusätzlichen +Parameter. +

    +

    Ab Version 1.20 sind die Funktionen v_open_bm und v_resize_bm +vorhanden. +

    +

    3.7.2.119 Cookie, EDFX

    +

    EDPBFIX.PRG +

    +

    Patchprogramm zum Betrieb von MS-DOS-ED-Disketten (1 Sektor pro +Cluster) unter TOS. +

    +

    Status: Freeware. +

    +

    3.7.2.120 Cookie, EGON

    +

    EGON! +

    +

    CD-ROM Driver +

    +

    3.7.2.121 Cookie, EMNP

    +

    MNP emulator +

    +

    Software that emulates MNP (without compression). +

    +

    3.7.2.122 Cookie, ENV$

    +

    Desktop environment manager +

    +

    3.7.2.123 Cookie, ENVN

    +

    Environ.prg +

    +

    Setzt GEM-Environment. +

    +

    Verbogen: exec_os, Resetvektor. +

    +

    Status: Freeware. +

    +

    3.7.2.124 Cookie, ENVR

    +

    Programm zum Setzen des Desktop-Environments. +

    +

    3.7.2.125 Cookie, EPro

    +

    Extendos Pro CD-ROM Driver +

    +

    Hängt in GEMDOS-, XBIOS-Trap, hdv_bpb, hdv_rw, hdv_mediach +

    +

    3.7.2.126 Cookie, F117

    +

    From the spedder SST. +

    +

    Points to 64K ST-RAM-Only Disk "Stealth Buffer". +

    +

    Currently used a lot bey SST. +

    +

    3.7.2.127 Cookie, ETM

    +

    Entmauser +

    +

    3.7.2.128 Cookie, EURO

    +

    Euro-Zeichen +

    +

    Der Cookie hat folgenden Bit-Aufbau: +

    +

    00000000 00000000 000000rs cccccccc +

    + + + + + + + + + + + + +
    c - Bit 0..7: Die vom System verwendete Position des Euro-Zeichens +
      +
    s - Bit 8: Flag, ob das Euro-Zeichen im System-Zeichensatz vorhanden ist +(1) oder nicht (0) +
      +
    r - Bit 9: Flag, ob das Euro-Zeichen durch den Text "EUR" +ersetzt werden soll (1) oder nicht (0), falls es nicht im +System-Zeichensatz enthalten ist +
      +
    0 - Bit 10..31: reserviert +
      + +
    + +

    3.7.2.129 Cookie, EUSB

    +

    Ethernet USB API +

    +

    Der Cookie zeigt auf eine Struktur, über die die Kommunikation +mit externen USB Ethernet Treibern abgewickelt wird. +

    +

    3.7.2.130 Cookie, EXRA

    +

    ExtraRAM-Verwaltung für die FAFST-Beschleunigerkarte. +

    +

    Herstellung und Vertrieb: F. Aschwanden. +

    +

    Vektoren: GEMDOS, BIOS, XBIOS. +

    +

    3.7.2.131 Cookie, EXTD

    +

    TOS Filename Extender +

    +

    3.7.2.132 Cookie, FaKE

    +

    FakeMiNT +

    +

    Installiert MiNT-Cookie auf Non-MiNT-Systemen. +

    +

    Verbiegt keine Vektoren. +

    +

    Bezugsquelle: http://stud.uni-sb.de/ gufl0000/atari. +

    +

    Lizensierung: GNU General Public License. +

    +

    3.7.2.133 Cookie, FALT

    +

    FALTOFF +

    +

    Fixprogramm für ein Problem bei Setscreen() auf MegaSTE's. +

    +

    ST-Computer 1/1992, Seite 165 +

    +

    Status: PD. +

    +

    3.7.2.134 Cookie, FAX!

    +

    Wird zum versenden von Faxen durch das Programm STarFax +genutzt. +

    +

    Bit 0...7: Anzahl bereiter Fax-Seiten +
    Bit 8..31: Reserviert +

    +

    3.7.2.135 Cookie, FAXR

    +

    FaxRedirector +

    +

    Sorgt für die automatische Umlenkung von GDOS-Druckerausgaben +auf die FAX-Gerätenummer. +

    +

    Verbiegt TRAP #2, ist aber normalerweise unsichtbar (da der TRAP +anschließend noch vom AES verbogen wird). +

    +

    Für Tele-Office-Benutzer bei TKR frei erhältlich. +

    +

    3.7.2.136 Cookie, FHFX

    +

    F030HFIX.PRG (Falcon030-GEMDOS-Handle-Fix) +

    +

    Korrigiert einen Fehler im GEMDOS des Falcon, der dazu führt, +daß sämtliche Filefunktionen nicht mehr mit den negativen +Geraetehandles (-3 bis -1) zurechtkommen (deswegen kann Gfa-Basic auch +nicht mehr drucken). +

    +

    Verbogene Vektoren: TRAP #1. +

    +

    3.7.2.137 Cookie, FIX2

    +

    FIX24 +

    +

    Beschränkt 68030-Adressierung auf 24 Bit, veröffentlicht in +ST- Computer. +

    +

    3.7.2.138 Cookie, FLTP

    +

    FlyTop +

    +

    Erlaubt Bestimmung der Position, an der fliegende Dialogboxen +erscheinen. +

    +

    Verbiegt Trap 2 und bei Neuinstallierung des Cookie Jars +resvector). Legt VSCR-Cookie an. +

    +

    ST-Magazin 1/92. +

    +

    3.7.2.139 Cookie, FLXD

    +

    Flexdisk (Version 1.4) +

    +

    3.7.2.140 Cookie, fMSX

    +

    fMSX.PRG +

    +

    Portierung des freeMSXemulators auf GEM. +

    +

    Vektoren: Kbdvbase()->kb_kbdsys +

    +

    Status: Freeware. +

    +

    3.7.2.141 Cookie, Fose

    +

    Font Selector +

    +

    3.7.2.142 Cookie, FOse

    +

    Fontselector (ACC oder PRG) +

    +

    Zusatzprogramm FOSEINST.PRG. +

    +

    ST-Computer PD 430, PD-Pool 2239). +

    +

    3.7.2.143 Cookie, FrmD

    +

    Form_do_it +

    +

    3.7.2.144 Cookie, FSEL

    +

    Extended File-Selector +

    +

    Das Vorhandensein dieses Cookie signalisiert, daß der +AES-Aufruf 'fsel_exinput' gemacht werden darf (wird von einigen +File-Select-Boxen gesetzt). +

    +

    3.7.2.145 Cookie, FSER

    +

    Fast_Ser +

    +

    Routinen zur Bedienung der seriellen Schnittstelle(n). +

    +

    Verbiegt MAPTAP- sowie SCC-Vektoren. +

    +

    Status: Freeware. +

    +
    typedef struct
    +{
    +    uint16_t version;
    +    unsigned unused:15;
    +    unsigned baud_table_flag:1;        /* bit 0 in einem word */
    +    BASPAG *mem_blk;
    +} FSER_INFO;
    +
    +

    3.7.2.146 Cookie, FSMC

    +

    Vektorfont-GDOS +

    +

    Der Cookie wird von einem Vektorfont-fähigen GDOS (z.B. +SpeedoGDOS oder NVDI) angelegt, und zeigt auf die +folgende Struktur: +

    +
    typedef struct
    +{
    +   int8_t  magic[4];
    +   int16_t version;   /* Versionsnummer (0x400 für 4.00) */
    +   int16_t quality;
    +} SPEEDO;
    +
    +

    Hinweis: Beim offiziell nie erhältlichen FSM-GDOS +besitzt die Komponente magic den Wert '_FSM'. '_FNT' steht für +FONTGDOS, '_SPD' für SpeedoGDOS und 'TTFG' für +ttf-gdos von Trevor Blight. +

    +

    3.7.2.147 Cookie, FSmp

    +

    Martin Patzel File Selector +

    +

    3.7.2.148 Cookie, fVDI

    +

    Zeigt das vorhanden sein von fVDI an. +

    +

    3.7.2.149 Cookie, FxOP

    +

    Fax Treiber von Tele Office +

    +

    3.7.2.150 Cookie, F_3D

    +

    Focus 3D (Grafikprogramm). +

    +

    Der Cookie zeigt auf eine Struktur, über die die Kommunikation +mit externen Modulen von Focus 3D abgewickelt wird. +

    +

    3.7.2.151 Cookie, GABI

    +

    Gabriele 9009 IFD1-Emulator +

    +

    Treiber fuer Schreibmaschine an der seriellen Schnittstelle +(verbesserte Version, Original war mal in ST-Computer). +

    +

    Belegt Trap #13 und MFP Int #12. +

    +

    3.7.2.152 Cookie, GBel

    +

    GemBell +

    +

    3.7.2.153 Cookie, GCOM

    +

    GEM Component Object Model +

    +

    Dieser Cookie zeigt die Verfügbarkeit der GCOM-Erweiterung an. +Der Wert des Cookies ist ein Pointer auf die Serviceroutinen. GCOM ist +derzeit noch nicht öffentlich erhältlich (Thomas Much). +

    +

    Status: GCOM wird Freeware. +

    +

    3.7.2.154 Cookie, GDEV

    +

    GNU-C Device-Driver +

    +

    Der Wert ist ein Zeiger auf eine verkettete Liste von +Device-Records (eine genauere Beschreibung gibt es auf Anfrage), die +von Programmen beim Start in eine entsprechende interne Liste +eingehaengt werden. Gemeinsam realisieren sie dann eine dem +/dev-Directory von Unix entsprechende Sammlung von Geraetetreibern. +

    +

    (Im Moment verfuegbar: /dev/tty, /dev/tty1, /dev/mouse, +/dev/null, /dev/lp, weitere Treiber sind geplant). +

    +

    3.7.2.155 Cookie, GEHC

    +

    Hotkey-Treiber für Hypercache Turbo+ +

    +

    Verbiegt ikbdsys. +

    +

    3.7.2.156 Cookie, GEHD

    +

    Harddisktreiber +

    +

    3.7.2.157 Cookie, GEMB

    +

    GE Soft HD Driver +

    +

    3.7.2.158 Cookie, GENV

    +

    GEM-Environment-Setter +

    +

    Quellen: ST-Magazin 6/1990. +

    +

    3.7.2.159 Cookie, Gfix

    +

    Gamefix für Falcon030 und davon erzeugte Programme. +

    +

    Fängt bei aktivierter alter Bildschirmadresse den Srealloc-Call +ab, allerdings liegt die Routine in einem offiziell nicht mehr +zugänglichen Speicherbereich. +

    +

    Verbogene Vektoren: trap #1. +

    +

    Status: Erschienen in ST-Computer 11/93. +

    +

    3.7.2.160 Cookie, GI30

    +

    Gandhi - gibt die zu den Exceptions erhältlichen Infos +aus +

    +

    Cookie zeigt auf eine Konfigurations-Struktur. +

    +

    Verbiegt folgende Vektoren: 2-9, 11, 13, 48-54, 56-58. +

    +

    Status: Freeware. +

    +

    3.7.2.161 Cookie, GIGA

    +

    GIGA-BOX ST driver +

    +

    3.7.2.162 Cookie, gk5"

    +

    Treibersoftware für 5.25" +HIGH-Density-Drittlaufwerk. +

    +

    Verbiegt hdv_rw, hdv_bpb, hdv_mediach, etv_critic. +

    +

    3.7.2.163 Cookie, gkCO

    +

    Calamus Oberflächenmodul (gkCO) +

    +

    Mausknopfroutine (über VDI:: vex_butv) und Mausbewegung +(über VDI:: vex_motv)). +

    +

    3.7.2.164 Cookie, GLAS

    +

    ACC zur Anzeige des freien Speicherplatzes auf den +GEMDOS-Laufwerken. +

    +

    Hängt in hdw_rw und TRAP #1. +

    +

    3.7.2.165 Cookie, GLBL

    +

    GLBX_EXT.PRG - GEMLABEL System Extension +

    +

    Verbogen: Resetvektor, GEMDOS-Trap. +

    +

    Status: Freeware. +

    +

    3.7.2.166 Cookie, GMNI

    +

    GEMINI - Der Shareware-Desktop (Cookie nur alten +Versionen). +

    +

    3.7.2.167 Cookie, GMTC

    +

    Timezone CPX +

    +
    3322 2222 2222 1111 1111 1100 0000 0000
    +1098 7654 3210 9876 5432 1098 7654 3210
    +---------------------------------------
    +rrrr rrrr rrrr rrrs mmmm mmmm mmmm mmmm
    +
    +r - reserviert (Info, welche Stadt im CPX angeklickt wurde)
    +s - 1 bei Sommerzeit, 0 bei Winterzeit
    +m - Differenz zur GMT in Minuten bei Winterzeit
    +
    +

    3.7.2.168 Cookie, GNUC

    +

    GNU-CC Libraries +

    +

    Verbiegt: alle Traps von Buserror bis Tracetrap, +kbd_vecs->ikbdsys, VBL, etv_term, etv_timer, resvector. +

    +

    3.7.2.169 Cookie, Gnva

    +

    Geneva Multi-Tasking AES +

    +

    This cookie either contains a pointer to the G_COOKIE structure +or it contains zero. If it contains zero, this means that Geneva was +previously installed, but is no longer. +

    +
    typedef struct
    +{
    +  int16_t ver;
    +  int8_t *process_name;
    +  int16_t apid;
    +  int16_t (**aes_funcs)();
    +  int16_t (**xaes_funcs)();
    +  struct G_vectors *vectors;    /* Release 004 */
    +} G_COOKIE;
    +
    + + + + + + + + + + + + + + + +
    ver Geneva version, 0x0102 means 1.02 +
      +
    process_name Points to the name of the process currently using Geneva; this +is in appl_find format +
      +
    apid Application ID of the process +
      +
    aes_funcs Internal table of AES functions +
      +
    xaes_funcs Internal table of extended functions +
      + +
    + +

    Note: The function tables are subject to change in +future versions. +

    +

    3.7.2.170 Cookie, GOBJ

    +

    Wurde von der PurePascal-Bibliothek ObjectGEM bis +Version 1.20 verwendet. Ab Version 1.50 wird der Cookie nicht mehr +angelegt. +

    +

    3.7.2.171 Cookie, GOff

    +

    Grow- und Shrinkboxen abschalten +

    +

    Verbogen: Trap #2. +

    +

    3.7.2.172 Cookie, GSND

    +

    GEM Sound +

    +

    3.7.2.173 Cookie, GSP1

    +

    GEM Spooler +

    +

    3.7.2.174 Cookie, GSXB

    +

    Generic sound XBIOS +

    +

    3.7.2.175 Cookie, GULM

    +

    Guläm, Command-Shell +

    +

    verbiegt: _shell_p +

    +

    3.7.2.176 Cookie, HABO

    +

    HaBoo 1.8, Harddiskcache (erstmals veröffentlicht in +ST-Magazin 6/1988). +

    +

    Hinweis: wird nicht mehr unterstützt, Nachfrage +zwecklos. Stattdessen TOS 1.04 (oder neuer) mit CACHENNN.PRG o. ä. +benutzen! +

    +

    3.7.2.177 Cookie, hade

    +

    Hades Computer +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Bitvorhandene Hardware
    0ROM-Port
    1VME-Bus
    2SCSI-Karte
    3Atari DMA
    4 - 11reserviert
    12 - 15reserviert für Video Hardware
     12 = ET4000 am ISA Bus
     13 = Videokarte am VME Bus
     14 = PCI-Bus Graphikkarte
    16 - 31Maschinenversion (derzeit 0)
    +
    + +

    3.7.2.178 Cookie, HAMM

    +

    Software zum 'Melody Maker' +

    +

    Verbiegt verschiedene Timer-Vektoren. +

    +

    3.7.2.179 Cookie, HBFS

    +

    BoxKite - residente Dateiauswahlbox. +

    +

    Verbiegt Trap #2 und #13. Der Wert des Cookies ist die +Einsprungadresse des Trap #2-Handlers. +

    +

    Status: Freeware. +

    +

    3.7.2.180 Cookie, HcP6

    +

    Nec-P6-Hardcopy in zwei Groessen, laeuft mit +Hyperscreen. +

    +

    Belegt Hardcopy-Vektor ($502). +

    +

    3.7.2.181 Cookie, HDDR

    +

    HD Driver +

    +

    3.7.2.182 Cookie, HDEX

    +

    HDDriver-eigenes Interface +

    +

    3.7.2.183 Cookie, HDEY

    +

    Hard Disc Eye +

    +

    Lights drive's A: LED whenever harddrive is accessed +

    +

    verbiegt: hdv_rw. +

    +

    3.7.2.184 Cookie, HDJR

    +

    HuSHI +

    +

    Hard & Soft Harddisk-Interface (Festplattentreiber). +

    +

    3.7.2.185 Cookie, HDLD

    +

    'HD-LED' Drive A: +

    +

    LED als HD-LED +

    +

    Verbiegt hdv_rw. +

    +

    Status: Public Domain, dissassembliert und Fehler behoben. +

    +

    3.7.2.186 Cookie, HDPR

    +

    HDPROTEC +

    +

    Schreib- und Leseschutzprogramm. +

    +

    3.7.2.187 Cookie, HDRC

    +

    AUDIODRV +

    +

    Treiber für ein Harddiskrecordingsystem, das am ACSI-Port +angeschlossen wird. +

    +

    Vektoren: 200Hz-Timer, hdv_bpb, hdv_rw, hdv_boot, hdv_mediach. +

    +

    3.7.2.188 Cookie, HDST

    +

    Eickmann HD Driver +

    +

    3.7.2.189 Cookie, HDSW

    +

    HDSWITCH.PRG - High Density Switcher (z.Zt. V1.1). +

    +

    Konfiguration für HIDS. +

    +

    Über [LSHIFT][ALT][HELP] wird der Modus gewechselt (auto, +forced HD, forced DD). +

    +

    Verbiegt scr_dump. +

    +

    3.7.2.190 Cookie, HFIX

    +

    Handle-Fix +

    +

    Sorgt dafür, daß bei v_opnvwk die von den Atari-GDOS-Versionen +erwünschte Gerätenummer übergeben wird. +

    +

    Veröffentlich im ST-Magazin 4/92. +

    +

    3.7.2.191 Cookie, hFRB

    +

    BIOS-Treiber für Rwabs-Transfers ins/aus dem Fast-RAM +

    +

    Fängt Rwabs ab, und biegt alle Zugriffe auf Fast-RAM durch den +FRB hindurch. Nötig für PAK mit Fast-RAM. +

    +

    Status: PD. +

    +

    3.7.2.192 Cookie, HIDS

    +

    HIGHDENS.PRG - High Density Disk Driver (z.Zt. V2.0). +

    +

    Durch Schaltungsänderung der MAXON-HD-Lösung ist mit diesem +Driver ein (fast) nicht bemerkbares High-Density Handling möglich, +insbesondere bei 5 1/4"-Drives und/oder zwei Laufwerken. +

    +

    Verbiegt etv_critic, hdv_bpb, hdv_rw, XBIOS. Braucht 1 x VBI. +

    +

    3.7.2.193 Cookie, HMDU

    +

    Speicherdump für PMD des Hänisch Modula2-Systems +

    +

    Exception 2-8 +

    +

    3.7.2.194 Cookie, HMOC

    +

    Object-Cache für Hänisch-Modula +

    +

    3.7.2.195 Cookie, HMRD

    +

    Runtime-Debugger des Hänisch-Modula +

    +

    Folgende Vektoren werden verbogen: TRAP 0, 3-12, 15; +Exceptionvektor 2-8, VBL-Interrupt. +

    +

    3.7.2.196 Cookie, HMRS

    +

    Runtime-System des HM2-Systems +

    +

    Exception 2-8. +

    +

    3.7.2.197 Cookie, HPHC

    +

    Hardcopy für HP Deskjet +

    +

    Verbiegt Hardcopy-Vektor. +

    +

    3.7.2.198 Cookie, HPLJ

    +

    HP-Laserjet-Emulator V1.04 +

    +

    Dieses Accessory wandelt die Drucker-Steuercodes eines +HP-Laserjet-Druckers, die über eine GEMDOS- oder BIOS-Funktion +ausgegeben werden, in eine Raster-Grafik um. +

    +

    Benutzte Vektoren: Trap #1, Trap #13. +

    +

    3.7.2.199 Cookie, HSCD

    +

    MiNT-CDROM-Treiber +

    +

    Verändert den Mediachange-Vektor +

    +

    Kommerzielles Produkt von Hard & Soft. +

    +

    3.7.2.200 Cookie, HSND

    + +

    CrazySounds +

    +

    Belegt Betriebssystemaktionen, Tastendrücke usw. mit +Sampleausgaben. +

    +

    Vektoren: GEMDOS; BIOS; AES/VDI; IKBD/MIDI; Maus (KBDVECS.mousevec); bell_hook; +kcl_hook; Busfehler; Adressfehler; illegaler Befehl; ST-MFP-I13 (Timer +A). +

    +

    Vertrieb durch MAXON Computer GmbH. +

    +

    3.7.2.201 Cookie, HWAM

    +

    Cookie Jar creator program +

    +

    3.7.2.202 Cookie, IBMP

    +

    IBMPRINT.PRG +

    +

    Converts Norwegian characters to IBM standard printer +characters. +

    +

    3.7.2.203 Cookie, ICFS

    +

    ICFS - Iconify-Server +

    +

    Vergibt Positionen für ikonifizierte Fenster für Programme, +die ein Iconify auch unter alten TOS-Versionen und MagiC 2.0 +anbieten wollen. Die XBRA-Kennung wird unter MagiC ab Version 3 +verwendet, welches durch Verbiegen von Trap #2 dazu überredet wird, +ICFS zu verwenden. +

    +

    3.7.2.204 Cookie, ICST

    +

    INETCUST Cookie +

    +

    3.7.2.205 Cookie, IDSK

    +

    ICON-Desk +

    +

    Quelle: ST-Digital. +

    +

    3.7.2.206 Cookie, IMAC

    +

    Bootsektor-Wächter +

    +

    Status: PD. +

    +

    3.7.2.207 Cookie, IMNE

    +

    Imagine graphics card +

    +

    3.7.2.208 Cookie, INSJ

    +

    Insjar +

    +

    Installiert einen Cookie-Jar oder erweitert einen bereits +bestehenden. Die fünf Standard-Cookies werden eingetragen. _CPU und +_FPU werden mit den Werten entsprechend der installierten Hardware +versorgt. Falls ein 68030 Board vorhanden ist, wird _longframe +entsprechend gesetzt. +

    +

    3.7.2.209 Cookie, INXR

    +

    Indexgenerator +

    +

    3.7.2.210 Cookie, iPRN

    +

    iPRN - Interrupt-benutzender BIOS-Handler für Gerät +PRN. +

    +

    Beschleunigt die Druckausgabe bei Programmen, die über GEMDOS +oder BIOS drucken, sowie den Bildschirmausdruck über +Alternate-Help. Eliminiert die Gedenkminute bei ausgeschaltetem +Drucker sowie das Müllbyte beim Reset. Der Cookie enthält einen +Zeiger auf Konfigurationsvariablen. +

    +

    Verbiegt den BIOS-Trap, prv-lsto, prv-lst, xcostat0, xconout0 +und resvector (alle mit XBRA). Aktiviert und benutzt MFP-Interrupt I0. +

    +

    Status: Freeware bis 0.99, danach Shareware. +

    +

    3.7.2.211 Cookie, IRSB

    +

    VBL_BRIX.PRG +

    +

    Verbiegt den Autovektor-Interrupt, Level 4, um die Umschaltung +der Shutter eine SEGA Shutterbrille im VBL zu ermöglichen. +

    +

    Status: Shareware. +

    +

    3.7.2.212 Cookie, iTMA

    +

    MFP-Timer-A-Interrupthandler +

    +

    Interruptgesteuerte Diskettenoperationen +(Lesen/Schreiben/Formatieren). +

    +

    Installiert von E-Copy ab 2.0, E-Backup ab 2.0, Kobold ab 3.0 +

    +

    3.7.2.213 Cookie, JAM1

    +

    'Butler James' +

    +

    Verbogene Vektoren sind hdv_rw, hdv_bpb, Trap #1, Trap #14, +scrdump, MouseVec, IKBDsys. Außerdem wird ein VBL-Slot belegt. +

    +

    Bezugsquelle: div. Mailboxen, oder direkt beim Autor (siehe +ST-Magazin 2/90). +

    +

    3.7.2.214 Cookie, JANU

    +

    Der Atari Emulator Janus von vhf Computer ist vorhanden. +

    +

    3.7.2.215 Cookie, JB2G

    +

    BIOS2Gdos +

    +

    Dieses Programm gibt alle Text-, und HP-PCL-Ausgaben über +Bconout(0) per GDOS aus. +

    +

    Der Cookie zeigt auf eine interne Struktur, um das TSR per CPX +zu konfigurieren. +

    +

    Verbogene Vektoren: Xconstat[0], Xconout[0]. +

    +

    Status: Shareware. +

    +

    3.7.2.216 Cookie, JCLK

    +

    Clocky multi-utility +

    +

    3.7.2.217 Cookie, JCNB

    +

    JCNBOOT - Mausbedienbarer Bootselektor (Auto, ACC, +Setups) +

    +

    3.7.2.218 Cookie, JCNC

    +

    Kontrollfeld (little multi ACC). +

    +

    Verbiegt: etv_term, $114, mousevec, kbdsys und vielleicht in +Zukunft clockvec. +

    +

    3.7.2.219 Cookie, JCNH

    +

    Hardcopyprogramm +

    +

    Verbogen $100. +

    +

    3.7.2.220 Cookie, JCNT

    +

    COCTEAU (may still be changed) +

    +

    Textverarbeitungsprogramm von Jens C. Neffe. +

    +

    Verbiegt: etv_term. +

    +

    3.7.2.221 Cookie, JFTP

    +

    SCSI-Treiber für generische Bandgeräte +

    +

    Kompatibel zu Paul Moreaus Tape-Driver, in Basisfunktionen auch +zu Alan Houriane's Kopie. Treiber für MiNT. +

    +

    Vektoren: BIOS wird bei Versionen < 2.0 erweitert. Aktuelle +Version: 1.4. +

    +

    Vertrieb: Shareware/Beta-Releases. Versionen > 2.0 evtl. mit +MultiTOS. +

    +

    3.7.2.222 Cookie, JINX

    +

    Jinx +

    +

    3.7.2.223 Cookie, JMLB

    +

    McBoot Bootselektor +

    +

    Verbogene Vektoren: resvector, exec_os +

    +

    Status: Shareware +

    +

    Freier Schlüssel: +

    +
    general key
    +no street
    +no town
    +1554446552
    +
    +

    3.7.2.224 Cookie, JMLS

    +

    JML_SNAP +

    +

    Ein Snapshotprogramm für alle Auflösungen in 2/4/16/256 Farben +im Palette-Modus sowie 15/16/24/32 Bit im Direct-Color-Modus. Der +Cookie zeigt auf eine Programmierschnittstelle. +

    +

    Verbogene Vektoren: scr_dump +

    +

    3.7.2.225 Cookie, JSHD

    +

    Hyper-Density Kontrollprogramm +

    +

    Quelle: ST-Computer 7/1989. +

    +

    3.7.2.226 Cookie, JUST

    +

    Justify +

    +

    Registriert alle Programm- und deren Datei-Aufrufe und sichert +diese. Diese Informationen können dann ausgewertet werden. +

    +

    Verbogen: GEMDOS-Trap. +

    +

    3.7.2.227 Cookie, J_Sc

    +

    SECURE.PRG +

    +

    Stellt einen Zeiger zu Verfügung, der von JML-Snapshot benutzt +wird. SECURE ist Bestandteil des JML-Snapshotpakets, aber Freeware. +

    +

    3.7.2.228 Cookie, KAOS

    +

    KAOS ist eine Betriebssystemmodifikation. +

    +

    Ab der Version 1.4 legt es den Cookie an. Im Langwort ist steht +das Erstellungsdatum im gepackten BCD-Format: +

    +

    0x22121989L entspricht "22.12.1989" +

    +

    3.7.2.229 Cookie, KbEv

    +

    Keyboard-Handling-Modul für Megamax Modula2. +

    +

    3.7.2.230 Cookie, KEYT

    +

    KEYTAB - Zeichensatz-Konversionen +

    +

    Zeigt auf eine Struktur mit Umwandlungsroutinen für diverse +Zeichensatztabellen (Atari, ANSI, Mac, PC). Freeware +

    +

    3.7.2.231 Cookie, KGTF

    +

    Tos Fix +

    +

    3.7.2.232 Cookie, KIDI

    +

    RAMdisk von Robert Irrgang +

    +

    3.7.2.233 Cookie, KLME

    +

    CMD is the extremely compact command line interpreter for TOS, +KAOS and MagiC. +

    +

    The executable can be named: +
    +

    +

    - MCMD for MagiC +
    - KCMD for KAOS +
    - CMD for TOS +
    +

    +

    Verbiegt: etv_term +

    +

    3.7.2.234 Cookie, KREG

    +

    KillRegisters +

    +

    Hängt im GEMDOS-Trap und zerstört die Register a0/a1/a2/d1/d2 +

    +

    Status: Freeware, killregs.zoo +

    +

    3.7.2.235 Cookie, KyMp

    +

    Keyboard Macro & Remapping Utility +

    +

    Verbogene Vektoren: kbdvbase->ikbdsys und etv_timer. +

    +

    Status: Public Domain. +

    +

    3.7.2.236 Cookie, KyWt

    +

    KeyWatch +

    +

    Überwacht alle Tastatureingaben, die mit gleichzeitig +gedrückter Control- und Alternate-Taste erfolgen. Desweiteren bietet +KeyWatch anderen Programmen die Möglichkeit, sich in diese +Tastendrücke "einzuklinken". Somit werden +programmübergreifende Shortcuts möglich. +

    +

    3.7.2.237 Cookie, Lace

    +

    LaceScan +

    +

    LaceScan is a package that allows an ordinary ST to display a +much larger screen area (i.e. more pixels) than that ordinarily used +by each of the three original resolutions, and also to emulate some +larger resolutions than even this enlarged screen can display +physically. +

    +

    3.7.2.238 Cookie, LACY

    +

    LAZy-Shell-III +

    +

    Verbiegt TRAP1, TRAP13, GEMDOS. +

    +

    Sonderdisk bei MAXON Computer GmbH. +

    +

    3.7.2.239 Cookie, LALA

    +

    ALBOLALA! +

    +

    Modul zum Abspielen von Samples via bell_hook +(ST-Magazin 1/92). +

    +

    3.7.2.240 Cookie, lanc

    +

    MiNT-Net Ethernet-Treiber für AMD LANCE +

    +

    lance.xif, pamintrn.xif, rieblmst.xif, rieblmst_fast.xif, +rieblspc.xif, rieblspc_fast.xif, rieblste.xif, riebltt.xif - es +handelt sich hierbei um einen Teil der Ethernet-Treiber des +MiNT-Net-Paketes für AMD LANCE basierte Ethernet-Karten (PAMsNet, +Riebl). +

    +

    Vektoren: int2 (HBI), int4 (VBI), int5. +

    +

    3.7.2.241 Cookie, LASB

    +

    Laserbrain - Epson-Emulator für Atari-SLM-Laserdrucker +

    +

    Verbiegt: BIOS-Trap, GEMDOS-Trap, Hardcopy-Vektor. +

    +

    3.7.2.242 Cookie, LAWC

    +

    Look-Ahead-Write-Cache V1.10 +

    +

    Dieses Cache-Utility setzt zum Lesen von Sektoren das +Look-Ahead-Verfahren und zum Schreiben einen Write-Cache ein. +

    +

    Benutzte Vektoren: hdv_rw. +

    +

    3.7.2.243 Cookie, LDGM

    +

    GEM Dynamical Libraries (LDG) +

    +

    3.7.2.244 Cookie, LEDP

    +

    LED-Panel +

    +

    Zeigt Harddisk-Zugriffe und anderes auf dem Bildschirm an. +

    +

    Über XBRA verbogen: hdv_rw. +

    +

    Status: Version 2.4 (31.1.94), PD. +

    +

    3.7.2.245 Cookie, LEmu

    +

    LaceScan command-keys emulator +

    +

    3.7.2.246 Cookie, Lity

    +

    Liberty +

    +

    3.7.2.247 Cookie, LLCR

    +

    1st_lock +

    +

    verbiegt: hdv-Vektoren +

    +

    3.7.2.248 Cookie, LMus

    +

    LaceScan mouse accelerator +

    +

    3.7.2.249 Cookie, LOGB

    +

    Logbuch +

    +

    Startet mittels Programmhistory in einem Popup Programme nach. +Hängt im GEM-Trap und wartet auf shel_write-Aufrufe. Freeware +

    +
    typedef struct
    +{
    +   int16_t numln;
    +   int16_t reserved1;
    +   int16_t reserved2;
    +   int16_t reserved3;
    +   int16_t reserved4;
    +   int16_t reserved5;
    +   int16_t reserved6;
    +   int8_t  **lnptr;
    +} HISTREC;
    +
    +

    Lnptr zeigt auf ein Feld von maximal numln +nullterminierten Strings, die die Programmnamen mit vollem Pfad +enthalten. Sind es weniger als numln Einträge, so endet die +Liste mit einem Leerstring. +

    +

    3.7.2.250 Cookie, LoSe

    +

    SER-LOG - Protokolliert Ausgaben von und an das Modem. +

    +

    Verändert xconin und xconout für AUX. +

    +

    3.7.2.251 Cookie, LPCD

    +

    Carrier Detector +

    +

    3.7.2.252 Cookie, LPJM

    +

    Joy-Mouse +

    +

    Quelle: ST-Magazin 7/89. +

    +

    3.7.2.253 Cookie, LP/2

    +

    Verändert Malloc/2, GEMDOS-Vektor. +

    +

    Vorgestellt im ST-Magazin 3/91. +

    +

    3.7.2.254 Cookie, LTMF

    +

    LETEMFLY.PRG bzw. LET_LGHT.PRG - Let 'em Fly! +

    +

    Ersetzt/erweitert fast alle form_xxxx Routinen des AES. +Dadurch sind jetzt viele Dialoge a) flugfähig, b) über die Tastatur +zu bedienen und c) bei Edit-Feldern mit zusätzlichen Funktionen +ausgestattet. Weiterhin wird über den Cookie-Jar eine Flugroutine +für non-form_do() Dialoge bereitgestellt. +

    +

    Verbiegt: TRAP #2 (AES/VDI), TRAP #13 (BIOS). +

    +

    Status: Freeware. +

    +

    3.7.2.255 Cookie, M16s

    +

    Bezeichnet den Start der CyReL M16 STRUCTure. Ein +residenter Datenblock, der die I/O-Vektoren und Hardwareadressen der +CyReL M16-1280 True-Color-Graphikkarten enthält (max. 4 pro System). +Wenn das CyReL GIOS (General IO System) installiert ist, wird diese +XBRA-Kennung auch im BIOS-, XBIOS- und GEMDOS-Vektor eingetragen. +

    +

    3.7.2.256 Cookie, M16X

    +

    CyReL M16 XBIOS-Emulator +

    +

    Wird im XBIOS-Vektor eingetragen. +

    +

    3.7.2.257 Cookie, macc

    +

    MACCEL 3.3 +

    +

    Der Cookie hat einen anderen (nicht druckbaren) Wert (nämlich +$00AA006E). +

    +

    Verbiegt MFP rec. buffer full, mousevec, ikbdsys). +

    +

    3.7.2.258 Cookie, MADD

    +

    ADDMEM +

    +

    Nutzung des TT-RAM trotz 24-Bit-Adressierung. +

    +

    Veröffentlicht in ST-Computer. +

    +

    3.7.2.259 Cookie, MADN

    +

    NEX-Output - AUTO-Ordner-TSR. +

    +

    Der Cookie enthält die Adresse einer Funktion, die zum +Übertragen von Daten inkl. Steuercodes über die serielle +Schnittstelle respektive auf die Console zuständig ist. +

    +

    NEX-Output ist nur im NEX-Paket enthalten und unterliegt damit +dem gleichen Status. +

    +

    Bezugsquelle für NEX (Shareware) und Anfragen bzgl. NEX: Franz +Blaha, +

    +

    3.7.2.260 Cookie, Maes

    +

    Von MyAES, welches das AES ersetzt. +

    +

    3.7.2.261 Cookie, MagC

    +

    Konfiguration der MagicDials für CAT und CatPutz und +andere Magic-Programme, die den Cookie unterstützen. Konfiguriert +werden kann die Flugfähigkeit, die Tastaturbedienung, das Aussehen +der Alertboxen usw. +

    +

    3.7.2.262 Cookie, MAGN

    +

    Wenn die MAGNUM-Karte das FastRAM installiert hat, wird +der Cookie "MAGN" angelegt. +

    +
    struct
    +{
    +  uint16_t version;   /* Versionsnummer - momentan 1 */
    +  uint32_t fr_start;  /* Startadresse FastRAM        */
    +  uint32_t fr_len;    /* Länge FastRAM               */
    +} MAGN_cookie;
    +
    +

    Diese Information kann z.B von Festplattentreibern ausgenutzt +werden, um in diesem Speicherbereich Daten direkt per DMA zu +übertragen. Andere Programme sollten diesen Cookie ignorieren und +ihren Speicher sauber per Mxalloc anfordern. +

    +

    3.7.2.263 Cookie, MagX

    + + +

    MagiC-Betriebssystem +

    +

    Der Cookie wird vom alternativen Betriebssystem MagiC +installiert, und zeigt auf folgende Struktur: +

    +
    typedef struct
    +{
    +   int32_t   config_status;
    +   DOSVARS  *dosvars;
    +   AESVARS  *aesvars;
    +   void     *res1;
    +   void     *hddrv_functions;
    +   int32_t   status_bits;
    +} MAGX_COOKIE;
    +
    +

    Hinweis: Die Komponenten res1 und +hddrv_functions stehen erst ab MagiC 3, status_bits erst +ab der Version vom 24.05.1995 zur Verfügung. +

    +

    Achtung: Die Versionsnummer von MagiC, die das +Vorhandensein dieses erweiterten Cookies enthält, läßt sich +dummerweise nicht über AESVARS abfragen, weil dieser Zeiger auf die +Variablen des AES zur Bootzeit noch NULL ist. Glücklicherweise +gelangt man an den Zeiger auch über den Systemheader des TOS (denn +dieser Zeiger ist immer gültig); dies geht per DOMagixAESVars. +

    +

    Querverweise: MgMc   MgMx   MgPC +

    +

    3.7.2.264 Cookie, MAST

    +

    Master +

    +

    Verbiegt: Buserror, Trap #1, Trap #13, etv_critic, etv_term, +_shell_p, resvector (old_resvalid steht direct vor dem 'XBRA'). +

    +

    3.7.2.265 Cookie, MaTC

    +

    Matrix True Colour Graphics Card +

    +
    typedef struct
    +{
    +  int16_t version, release;
    +  int8_t *date;
    +
    +  SCREENparameter *scr_par;
    +  BOARDparameter  *brd_par;
    +  TCXXtables      *tables;
    +  E2Pparameter    *e2p_par;
    +} TCXXparameterBlock;
    +
    +

    3.7.2.266 Cookie, MbAr

    +

    Sofern MenuBar installiert ist, kann man mit +menu_bar(-2/-3) die Baumadresse der Menüleiste einer Applikation +erfragen. menu_bar(-2) liefert das High-Word und menu_bar(-3) das +Low-Word. +

    +

    3.7.2.267 Cookie, MBRD

    +

    Blit_RD - RAMdisk, die – wenn vorhanden – +den Blitter benutzt. +

    +

    Verbiegt die drei hdv_... Vektoren. +

    +

    3.7.2.268 Cookie, MCL_

    +

    MiNT control +

    +

    3.7.2.269 Cookie, McSn

    +

    MacSound +

    +

    Falcon-kompatible Soundroutinen +

    +

    Der Cookie zeigt die Verfügbarkeit von Falcon-kompatiblen +XBIOS Soundroutinen an. +

    +

    3.7.2.270 Cookie, MCSP

    +

    Unimplemented Integer Instruction und Floating Point Handler +

    +

    Nutzt den Line-F Vector. +

    +

    3.7.2.271 Cookie, MCWR

    +

    Microwire DMA sound interface +

    +

    Der Wert des MCWR-COOKIEs wird als Werte für das +MICROWIRE-Interface benutzt. +

    +

    Das höchste Byte steht für die Gesamtlautstärke Das +darauffolgende Byte repräsentiert die Lautstärke des linken Kanals. +Das darauffolgende Byte repräsentiert die Lautstärke des rechten +Kanals. Das letzte Byte wird in zwei Nibble aufgeteilt. Das +höherwertige stellt den Wert für Tiefen, das Niederwertige den für +Höhen dar. +

    +

    In 'C' ausgedrückt: +

    +

    Der Wert des MCWR-COOKIEs repräsentiert folgende Struktur. +

    +
    typedef struct
    +{
    +  unsigned volume: 8;
    +  unsigned left:   8;
    +  unsigned right:  8;
    +  unsigned bass:   4;
    +  unsigned treble: 4;
    +} MCWR;
    +
    +

    3.7.2.272 Cookie, MDIA

    +

    MultiDialog - befördert beliebige Dialoge in Fenster. +

    +

    Cookie-Jar enthält Zeiger auf diverse Informationen. +

    +

    Verbiegt: TRAP #2 (AES), TRAP #13 (BIOS), etv_term +(GEMDOS-Vektor #258). +

    +

    Status: Freeware +

    +

    3.7.2.273 Cookie, MDRK

    +

    MegaDark - Bilschirmschoner für die +MegaVision300-Grafikkarte +

    +

    Verändert ein Slot in der vbl-queue, ikbdsys und InitMouse +

    +

    Quelle: Sang Support-Mailbox +

    +

    3.7.2.274 Cookie, MDSa

    +

    Medical Design Software's Serial Fix +

    +

    3.7.2.275 Cookie, MFAC

    +

    Multi Accessory +

    +

    3.7.2.276 Cookie, MFFM

    +

    Mfsfm - Marcus' file selector for MiNT. +

    +

    Verbogene Vektoren: GEM/VDI-Trap, BIOS-Trap. +

    +

    Status: Shareware. +

    +

    3.7.2.277 Cookie, MFIX

    +

    MONOFIX.PRG für Falcon 030. +

    +

    Setzt, wenn ein SM124/44/46 angeschlossen ist, die +Systemvariable $44c auf den korrekten Wert 2 (Maccel schont dann +richtig) und ändert die Palettengröße im VDI work_out-Feld +ebenfalls auf 2. Damit funktionieren einige ältere Programme, die +vorher meinten, sie liefen nicht in ST-hoch, wieder. +

    +

    Verbogene Vektoren: TRAP #2. +

    +

    3.7.2.278 Cookie, MFMV

    +

    Wird von MagiC installiert. +

    +

    3.7.2.279 Cookie, MFNT

    +

    Fontloader-Accessory oder Programm mit Zusatzprogramm +MFNTINST.PRG +

    +

    Quelle: (PD-Pool 2240). +

    +

    3.7.2.280 Cookie, MGEM

    +

    MultiGEM +

    +

    Quelle: Maxon GmbH. +

    +

    3.7.2.281 Cookie, MgMc

    + +

    MagiC Mac-Betriebssystem +

    +

    Der Cookie wird vom alternativen Betriebssystem MagiC Mac einer +Portierung von MagiC auf die Hardware des Apple (Power) Macintosh +angelegt, und zeigt auf eine MgMc Cookie-Struktur. +

    +

    Querverweise: MagX   MgMx   MgPC +

    +

    3.7.2.282 Cookie, MgMx

    +

    MagiC Mac X +

    +

    Querverweise: MagX   MgMc   MgPC +

    +

    3.7.2.283 Cookie, MgPC

    +

    MagiC PC +

    +

    Querverweise: MagX   MgMc   MgMx +

    +

    3.7.2.284 Cookie, MgSn

    +

    MagiC Mac Sound driver +

    +

    Emulation of Falcon's XBIOS. There is no matrix like the one +in the Falcon in the MacOS system. Nevertheless it's possible to: +

    +
      +
    • Play samples in 8/16-bit mono and stereo (with/without D2D) +
    • +
    • Record 16-bit samples in stereo like the Falcon (with/without +D2D) +
    • +
    • Select the input source (the current input source when MagiC +Mac is started or the number one) +
    • +
    • Connect or remove the audio source to the audio output +
    • +
    • Set the level output on the two channels +
    • +
    • Set the gain input on the two channels +
    • +
    • Emulation on the selection of tracks (1 to 4) +
    • +
    • FFDI external clock selection compatible +
    • +
    • Extended functions added, like the GSXB/MilanBlaster drivers, +for example. It's possible to choose the true frequency. Bit 5 of the +_SND cookie is set. However, 24/32-bit and the mixer are not +supported, and only Motorola format is supported. +
    • +
    • This driver can run on the Hades! The output is from the YAMAHA +chip or the MV16/PSOUND card. In this case audio input functions are +removed. The Timer A of the MFP2 is used. +
    • +
    • This driver can run on Aranym! The driver uses SDL calls inside +Aranym. Recording isn't possible. +
    • +
    + +

    3.7.2.285 Cookie, MID3

    +

    MIDINET3.PRG - 'Resident MidiNet terminal (for use with +MiniBBS)'. +

    +

    3.7.2.286 Cookie, MIMA

    +

    MIDIMAN.PRG/ACC - MIDI-Manager (z.Zt V1.0ß) +

    +

    Ein MIDI-Utility, welches es erlaubt, SysEx-Daten auszutauschen, +einen MIDI-Monitor, ein MIDI-Keyboard, einen MIDI-Filter und +natürlich MIDI-Thru enthält. +

    +

    verbiegt: midisys, klinkt aus: midivec, braucht: 1xVBI +

    +

    3.7.2.287 Cookie, MiNT

    + +

    MiNT (MiNT is now TOS) +

    +

    Der Cookie wird von der GEMDOS-Erweiterung MiNT angelegt, einem +leistungsfähigen Kernel, der auch unter Multi-TOS eingesetzt wird. +Der Wert des Cookies besteht aus einer Haupt-/Nebenversionsnummer im +High/Low Byte des Low-Words. Ein Wert von 0x00000113L steht demnach +für Version 1.19. +

    +

    3.7.2.288 Cookie, MIPS

    +

    SPOOL120.PRG - Druckerspooler 120KB mit +Hardwareinterrupt. +

    +

    Verbiegt: 1290: prv_lst, xconin0, xcostat0, xconout0, BusyInt. +

    +

    3.7.2.289 Cookie, MJAF

    +

    AUTOFONT +

    +

    3.7.2.290 Cookie, MKHC

    +

    Hardcopy-Fix +

    +

    Quelle: ST-Computer 12/1989. +

    +

    3.7.2.291 Cookie, MkJr

    +

    Der Cookie identifiziert mein MakeCookieJar +Auto-Ordner-Programm, das auf allen Nicht-STEs bzw. Nicht-TTs einen +Cookie Jar einrichtet. Die vier Systemcookies werden angelegt, wobei +_CPU die Prozessortypen 68000, 68010, 68020 und 68030 (sauber) +unterscheidet, die anderen Cookies jedoch fixe Werte zugewiesen +bekommen (entsprechend einem [Mega] ST[F[M]]). +

    +

    3.7.2.292 Cookie, MM2X

    +

    Megamax Modula Low-Level Modul, mit dem +Modula-Prozeduren ohne Assembler-Einsatz zum Abfangen jeder beliebigen +Prozessor-Exception (TRAP-Instruktionen, Bus-Error, usw.) installiert +werden können. +

    +

    3.7.2.293 Cookie, MMAC

    +

    MM_ACCEL.PRG - MagicMouse +

    +

    Mausbeschleuniger (Polynom 6. Grades). +

    +

    Vektoren die verbogen werden: MOUSE_VEC, RESVECTOR. +

    +

    Status: Freeware. +

    +

    3.7.2.294 Cookie, MMUT

    +

    MM2_UTIL.PRG - Midi-Maze ][ Utility. +

    +

    Mit the Midi-Maze ][ Utility wird der Ringtest etwas +komfortabler gestaltet. Weiterhin ist durch ein MIDI Thru eine +verlassen von Midi-Maze möglich, ohne daß der Ring zusammenbricht. +

    +

    Verbiegt: midivec. +

    +

    Status: Freeware. +

    +

    3.7.2.295 Cookie, MM_2

    +

    Midimaze 2 +

    +

    Status: Shareware. +

    +

    3.7.2.296 Cookie, MN3D

    +

    MENU3D.PRG - Menüs und Submenüs im 3D-Look +

    +

    Wird MENU3D.PRG gestartet, so erscheinen alle in Zukunft +angemeldeten Menüzeilen und Submenüs im 3D-Look, falls das System +3D-Look unterstützt. +

    +

    Nutzt Trap #2/AES-VDI +

    +

    3.7.2.297 Cookie, MNAM

    + + +

    Maschinen-Name +

    +

    Der Cookie zeigt auf einen nullterminierten ASCII-String +(maximal 24 Zeichen plus Null-Byte), der den Typ der Rechner-Hardware +beschreibt (z.B. "ATARI TT030"). Beim Setzen des Namens +bitte kurzfassen! +

    +

    3.7.2.298 Cookie, MOAF

    +

    ARROWFIX - Fixprogramm fürGEM 3.2 (TOS 2.06, 3.06) +

    +

    Korrigiert Fehler in WM_ARROWED-Nachrichten des GEM 3.2. +

    +

    Verändert BIOS-und GEM-Trap, falls das GEM nicht +gepatcht werden kann. +

    +

    3.7.2.299 Cookie, MOGR

    +

    GEMRAM - installiert GEM im RAM +

    +

    Verändert _sysbase, _exec_os und in der Folge alle Vektoren des +GEM. Trägt sich bei erfolgreicher Installation in den Cookiejar +ein. Muß ein neuer Jar angelegt werden, wird eine Resetroutine zur +Deinstallation eingebunden. +

    +

    3.7.2.300 Cookie, MPRO

    +

    MagicPro-Config-CPX. +

    +

    Enthält Zeiger auf Konfigurationsdaten von Programmen, die +Magic Professional >= 1.00 benutzen. Genaues Format auf Anfrage. +

    +

    3.7.2.301 Cookie, MRAM

    +

    Mehr RAM - vergrößert den freien Speicher +

    +

    3.7.2.302 Cookie, MSPD

    +

    MSPEED.PRG - 'Very small and simple mouse speeder' +

    +

    3.7.2.303 Cookie, MSPO

    +

    MS_SPOOL.PRG - MagicSpooler +

    +

    Druckerspooler, Drucken in Datei, Swappen auf Disk. +

    +

    Vektoren, die verbogen werden: BIOS, BUSY_INT, HZ_200, +RESVECTOR, PRV_LSTO, PRV_LST, VBL_SLOT. +

    +

    Status: Freeware. +

    +

    3.7.2.304 Cookie, mstx

    +

    Mouse Tricks +

    +

    3.7.2.305 Cookie, MTCI

    +

    MATRIX MatGraph - TCxx +

    +

    Das Programm tcxxinfo.tos von der MATRIX Grafikkarte installiert +einige XBIOS Funktionen. +

    +

    Siehe auch: MATRIX +

    +

    3.7.2.306 Cookie, MTft

    +

    Trapper - AUTO-Ordner-TSR +

    +

    Installiert für BIOS, XBIOS, GEMDOS und (bisher noch nicht +für) AES eine Funktionstabelle, über die TSRs sich einfach +einhängen können. +

    +

    Cookie enthält Zeiger, der Zugriff auf Datenstruktur und +verschiedene Funktionen ermöglicht. +

    +

    Verbiegt Trap #1, #13, #14 und (noch nicht) #2. +

    +

    Version 1.0 ist Freeware. +

    +

    3.7.2.307 Cookie, MUPF

    +

    Mupfel - Unix-Shell, bis Version 1.2x +

    +

    3.7.2.308 Cookie, MWHL

    +

    MWheel +

    +

    3.7.2.309 Cookie, MZTR

    +

    TRASH +

    +

    3.7.2.310 Cookie, MZVT

    +

    VT_DRIVE.PRG +

    +

    VT_DRIVE.PRG stellt einen Treiber für den Videotext-Decoder von +Print- Technik (neuere Version zum Anschluß an den ROM-Port) zur +Verfügung. +

    +

    Der Treiber stelle eine neue BIOS Funktion zur Verfügung mit +deren hilfe der Decoder angesteuert werden kann. +

    +

    Vektoren: BIOS-Trap +

    +

    3.7.2.311 Cookie, M_IN

    +

    MATRIX MatGraph - Cxx +

    +

    Das Programm cxx_info.tos von der MATRIX Grafikkarte installiert +einige XBIOS Funktionen. +

    +

    Siehe auch: MATRIX +

    +

    3.7.2.312 Cookie, N203

    +

    Multipurpose accessory +

    +

    Veränderte Vektoren: Timer C, GEMDOS, BIOS, XBIOS, +Hardcopy, hdv_rw, hdv_bpb, hdv_mediach, Tastatur, Maus, Vblank). +

    +

    3.7.2.313 Cookie, nAES

    + +

    N.AES - Das AES für MiNT +

    +

    Der Cookie wird vom AES-Ersatz N.AES angelegt und zeigt auf +die Struktur N_AESINFO. +

    +

    3.7.2.314 Cookie, NAH3

    +

    Das N_ALTHLP Snapshot-Tool ist installiert. +

    +

    Vektoren: scr_dump ($502) +

    +

    3.7.2.315 Cookie, NBEL

    +

    SOUND.PRG +

    +

    Hängt sich in bell_hook und gibt eine DMA-Sound aus. +

    +

    3.7.2.316 Cookie, NBLL

    +

    NEWBELL.PRG +

    +

    Setzt eine neue Systemglocke. +

    +

    Verbogen: bell_hook, Resetvektor. +

    +

    Status: Freeware. +

    +

    3.7.2.317 Cookie, NCLN

    +

    Niceline +

    +

    Mit diesem residenten Programm bekommen fast alle Applikationen +die von Gemini bekannten Trennstriche in den Menüs +

    +

    Verbiegt TRAP #2 und TRAP #13. +

    +

    3.7.2.318 Cookie, ne2k

    +

    ne2000.xif - Treiber fuer PCI NE2000-Karten. +

    +

    Setzt auf dem PCI-BIOS auf (z. Z.LowLevel). +

    +

    Vektoren: Klinkt sich in die Interrupt-Chain des PCI-BIOS ein. +

    +

    Status: kommerziell. +

    +

    3.7.2.319 Cookie, NERV

    +

    No etv_critic_alert +

    +

    Unterbindet die etv-critic-Alertbox auf den Laufwerken A: und B: +nach mehrmaligem Versuch. +

    +

    3.7.2.320 Cookie, NETS

    +

    Treibersoftware zur PAM Novell-Netware +

    +

    3.7.2.321 Cookie, NEXB

    +

    NEX-BUFFER +

    +

    Reserviert einen Speicherblock fixer Größe und verkettet ihn +über eine Cookie-Struktur. +

    +

    Vektoren werden nicht verbogen. +

    +

    Status: NEX-BUFFER ist Bestandteil des Maustausch-Externals NEX +(Shareware) und ist nur mit diesem Paket verfügbar, d.h. NEX-BUFFER +darf getrennt nicht vertrieben werden. +

    +

    3.7.2.322 Cookie, NEXK

    +

    NEX-Toolkit - AUTO-Ordner-TSR +

    +

    Installiert einen Cookie auf eine Funktionstabelle mit ständig +benötigten Funktionen für das MausTausch-Programm NEX. +

    +

    Status: NEX-Toolkit ist nur im NEX-Paket enthalten und +unterliegt damit dem gleichen Status. +

    +

    3.7.2.323 Cookie, NFMT

    +

    INFOMAT +

    +

    Zeigt Cookie-/Systeminfos und erzeugt/erweitert auf Wunsch einen +Cookie-Jar. Der Cookie enthält Informationen über das ihn +installierende Programm und die Art der erfolgten Aktion. +

    +

    Status: Freeware +

    +

    3.7.2.324 Cookie, NFnt

    +

    Neodesk Font Loader +

    +

    3.7.2.325 Cookie, NKCC

    +

    Normalized Key Code Converter - Keyboard- und +Event-Manager. +

    +

    Library zum Einbinden in Pure-C- bzw. Turbo-C-Programme. +Konvertiert Tastencodes in ein von der TOS-Version (Landessprache!) +unabhängiges, wesentlich bequemeres Format. Alle möglichen +Tastenkombinationen werden erkannt. Außerdem sind ein Deadkey +Mechanismus (z.B. e und ' wird zu é) und direkte ASCII Eingabe +(Alternate + Ziffernblock) eingebaut. +

    +

    Vektoren: 200 Hz system clock ($114), GEM-Trap, VDI vex_butv. +

    +

    Copyright status: Public Domain. +

    +

    3.7.2.326 Cookie, NLdr

    +

    Neodesk Loader +

    +

    3.7.2.327 Cookie, NMGE

    +

    No More amc-Gdos Errors +

    +

    Hängt im TRAP #2. +

    +

    3.7.2.328 Cookie, NO7P

    +

    NO7PRINT.PRG - Converts norwegian characters to 7-bits +printers. +

    +

    3.7.2.329 Cookie, noCF

    +

    noSystem +

    +

    3.7.2.330 Cookie, NOR5

    +

    NORKEY5.PRG - Norwegian keyboard-driver with lots of +extra stuff +

    +

    3.7.2.331 Cookie, NOVA

    +

    NOVA Grafikkarte +

    +

    3.7.2.332 Cookie, NSC1

    +

    N_SYSCOM 1.1 +

    +

    Ein Accessory, das alle GEMDOS-, XBIOS-, BIOS- und +GEM-Aufrufe auf dem Bildschirm anzeigt. +

    +

    3.7.2.333 Cookie, Nspd

    +

    Cookie des Faclon Beschleuniger Nemesis. +

    +

    Der Cookie enthält eine der drei Informationen: +

    +
      0  Nemesis Off
    +  1  Nemesis Lo
    +  2  Nemesis Hi
    +
    +

    3.7.2.334 Cookie, nTAS

    +

    Zeigt an, daß keine TAS-Instruktionen ausgeführt +werden sollen (wg. Fehler in `HyperCache'). Wird von GEMAR beachtet. +

    +

    3.7.2.335 Cookie, NTK4

    +

    NTK4 - Falcon MOD player +

    +

    3.7.2.336 Cookie, nTOS

    +

    MilanBlaster +

    +

    Nutzt den Trap#14/XBIOS und TTMFP/SCSI DMAC. +

    +

    3.7.2.337 Cookie, NUL>

    +

    System startup utility +

    +

    3.7.2.338 Cookie, NVDI

    + +

    NVDI - Schneller Ersatz des VDI +

    +

    Der Cookie wird vom 'Bildschirmbeschleuniger' NVDI installiert, +und zeigt auf folgende Struktur: +

    + +
    typedef struct
    +{
    +   uint16_t nvdi_version;       /* Version im BCD-Format       */
    +                                /* 0x400 für 4.00              */
    +   uint32_t nvdi_datum;         /* Datum im BCD-Format         */
    +                                /* 0x18061990 für 18.06.1990   */
    +   struct
    +   {
    +      unsigned            : 9;  /* reserviert                  */
    +      unsigned alert      : 1;  /* Fehlermeldungen ein/aus     */
    +      unsigned            : 1;  /* reserviert                  */
    +      unsigned linea      : 1;  /* LINE-A                      */
    +      unsigned mouse      : 1;  /* Dynamische Maus             */
    +      unsigned gemdos     : 1;  /* GEMDOS-Zeichenausgabe       */
    +      unsigned fehler     : 1;  /* Fehlerkompatibilität        */
    +      unsigned gdos       : 1;  /* GDOS                        */
    +   } nvdi_config;
    +} NVDI_STRUC;
    +
    +

    Verändert GEM, GEMDOS, BIOS, XBIOS und den LINE-A Vektor. +

    +

    3.7.2.339 Cookie, OBNL

    +

    Load-Time Linking +

    +

    Über diesen Cookie kann ein Protokoll zum Load-Time-Linking +zwischen einer Shell und einem Loader abgewickelt werden. Erstmals +verwendet von STJ-Oberon-2 und der Shell Chatwin. +

    +

    Dokumentation: Archiv LTLPROTO.LZH +

    +

    3.7.2.340 Cookie, OFLS

    +

    Check Open Files +

    +

    Wird zur Protokollierung, wieviele Dateien noch auf welchem +Laufwerk geöffnet sind. Wird von dem PD-Programm 'CHECK_OFLS' +implementiert. +

    +

    Dokumentation siehe Manual und ST-Magazin 11/1991. +

    +

    3.7.2.341 Cookie, OPMM

    +

    Open Helper +

    +

    Das Programm hilft bei 'Fopen()' nach, wenn der Pfad nicht +stimmt. Bei Bedarf wird versuchsweise '/' nach '\' konvertiert (UNIX- +Modus) und eine Pfadnamen-Tabelle benutzt. Zusätzlich kann der +Pfadname auf Drucker/Bildschirm/MIDI ausgedruckt werden. +

    +

    Verbiegt den GEMDOS-Vektor und bei TOS <1.06 den +Reset-Vektor. +

    +

    Status: PD +

    +

    3.7.2.342 Cookie, OSBL

    +

    Screen Blaster +

    +

    3.7.2.343 Cookie, OSTT

    +

    OverScan TT030 +

    +

    3.7.2.344 Cookie, OTOS

    +

    oTOSis - TOS emulator for Linux/68K +

    +

    Der Wert enthält die Versionsnummer. +

    +

    3.7.2.345 Cookie, OV24

    +

    OverScan Hardcopy Driver 24 pins +

    +

    3.7.2.346 Cookie, oVDI

    +

    oVDI - alternative Treiber für das NOVA-VDI +

    +

    Status: noch nicht veröffentlich +

    +

    3.7.2.347 Cookie, OVDJ

    +

    OVER_DJT - Overscanv Hardcopytreiber für HP-DeskJet ab +V 2.0 +

    +

    (c) Patrick Dubbrow +

    +

    3.7.2.348 Cookie, OVEP

    +

    Hardcopytreiber für 9 Nadel-Drucker +

    +

    3.7.2.349 Cookie, OVER

    + +

    Treiber zur AutoSwitch-OverScan Hardware. +

    +

    Der Cookie enthält als Wert die (hexadezimale) Versionsnummer +des OverScan-Treibers. Ein Wert von 0x300 steht z.B. für die Version +3.0. +

    +

    Verändert GEM, GEMDOS, BIOS, XBIOS, LINEA, IKBDSYS, +IPL_4, VBL und RESET Vektoren. +

    +

    3.7.2.350 Cookie, OVEX

    +

    OVER_EXC - OverScan Exception Patch +

    +

    3.7.2.351 Cookie, OVFS

    +

    OVER_FSB - OverScan Fileselector Patch +

    +

    3.7.2.352 Cookie, OVIM

    +

    OVER_24N - Hardcopytreiber für 24 Nadel-Drucker ab V +2.0 +

    +

    (c) Patrick Dubbrow +

    +

    3.7.2.353 Cookie, OVLS

    +

    OVER_LSB - Patch für DMC-Laserbrain +

    +

    3.7.2.354 Cookie, OVRD

    +

    OVER_RAM - OverScan RAMDisk (iV) +

    +

    3.7.2.355 Cookie, OVUT

    +

    OVERUTIL - Bildschirmschoner, Desktopuhr (Mousespeeder +iV) +

    +

    3.7.2.356 Cookie, OVWI

    +

    OVER_WIN - OverScan Window-Size Patch +

    +

    3.7.2.357 Cookie, PAMN

    +

    Treibersoftware zum PAM's-Net. +

    +

    3.7.2.358 Cookie, PAUL

    +

    Paula 2 - Amiga-MODfile-Player +

    +

    Paula spielt die sogenannten 'MOD-Files' auf dem DMA-Soundchip +des STE/TT ab. Diese MODfiles, auch als 'Module' bezeichnet, stammen +ursprünglich vom Amiga, der einen speziellen 4-Kanal Soundchip namens +'Paula' besitzt. +

    +

    Paula belegt den I07 (monochrome monitor detect) - Interrupt der +68901 MFP. Dazu wird eine XBRA-Kennung 'PAUL' benutzt. +

    +

    3.7.2.359 Cookie, PBUG

    +

    PEACEBUG.PRG +

    +

    Backgrounddebugger, integrierter MC680x0 Disassembler/ +Assembler, resetfest, resetresident, voll symbolisch, komfortable +Oberfläche. +

    +

    Vektoren, die verbogen werden können: alle Exceptionvektoren, +HZ_200, KEYBOARD, RING_INDICATOR, ETV_CRITIC, RESVECTOR. +

    +

    Status: Shareware. +

    +

    3.7.2.360 Cookie, PDEB

    + +

    PureDebug +

    +

    Verbiegt die Systemvektoren: 2-10, 13, 14, 24, 33, 34, 45, 46, +48-54, 257 und 258. In der von Dimitri Junker gepatchten Version wird +dazu XBRA benutzt (in der Einmonitorversion (PD_1.PRG) mit der Kennung +'PDeb' und in der Zweimonitorversion (PD_2.PRG) mit der Kennung +'PDEB'). +

    +

    Das Patchprogramm liegt in der Maus B3, oder auf +http://www.dimitri-junker.de/software/ +

    +

    Status: Freeware. +

    +

    Der PureDebugger selbst ist nicht mehr erhältlich und wurde +zuletzt von ASH vertrieben. +

    +

    3.7.2.361 Cookie, PDOS

    +

    PowerDOS is a pre-emptive multitasking kernel that +replaces GemDOS and fixes all the bugs! Extremely efficient kernel +based on OS-9 and Unix. Features shared memory, semaphores, queues, +signals, pipes, pseudo TTY's, loadable file systems, loadable device +drivers. Doesn't block other processes during disk I/O like some other +kernels do. Compatible with all Atari ST/STe/MSTe/TT/Falcon030. +Loadable network file system available (commercial) for RS232, MIDI, +and LAN. +

    +

    Vectors: TRAP #1, TRAP #13, TRAP #14, MFP (all). +

    +

    Status: Shareware. +

    +

    3.7.2.362 Cookie, PDRZ

    +

    LockGetrez +

    +

    Mini-Hack zum Festlegen eines gewünschten Rückgabewertes der +XBIOS-Funktion Getrez. Überzeugt manches unsauber programmierte +Programm. +

    +

    3.7.2.363 Cookie, PFIX

    +

    PTSINFIX +

    +

    Behebt einen Fehler im VDI des TOS 3.01. +

    +

    3.7.2.364 Cookie, Pinp

    +

    Treiber für die Eingabe vom parallelen Port +

    +

    Dieser Treiber läßt den Port für einen anderen Rechner wie +einen Drucker aussehen (mit einem Kabel, bei dem Strobe und Busy +gekreuzt sind) und ermöglicht das Lesen von diesem Port mit den +BIOS-Routinen. +

    +

    Verbogene Vektoren sind $100, $51E, $53E, $55E und $57E. +

    +

    3.7.2.365 Cookie, PKSH

    +

    PKS-Shell +

    +

    Verbiegt _shell_p. +

    +

    3.7.2.366 Cookie, PMMU

    +

    Paged-Memory-Management-Unit +

    +

    Der Cookie wird von Programmen wie Outside oder +VRAM angelegt, die von der im System vorhandenen PMMU gebrauch +machen. Der Wert des Cookies ist entweder ein Null-Zeiger oder stellt +die Einsprungadresse eines Funktionshandlers dar, der einige +MMU-bezogene Manipulationen ermöglicht. Ein Null-Zeiger signalisiert +lediglich die Benutzung der PMMU, was für andere Programme ein +Zeichen sein kann, sich nicht zu installieren. +

    +

    3.7.2.367 Cookie, POIS

    +

    Poison! +

    +

    Vergleicht bei jedem Diskettenwechsel automatisch im Hintergrund +den Bootsektor mit der in Poison! integrierten Virenliste. +

    +

    Hängt sich in Trap #13 +

    +

    3.7.2.368 Cookie, POWM

    +

    PowerMouse +

    +

    3.7.2.369 Cookie, PRCS

    +

    copySTar v4.0 +

    +

    Kopierprogramm (ab Version 4.0). +

    +

    3.7.2.370 Cookie, PRDS

    +

    PR's Disk-Speeder v1.1 +

    +

    Harddiskcache +

    +

    3.7.2.371 Cookie, PRMD

    +

    MIDIPRT - Aktuelle Version 0.9 +

    +

    Leitet die BIOS-Ausgabe der parallelen Schnittstelle auf den +MIDI-Port um. Ein Empfangsprogramm auf dem Zielrechner gibt die +empfangenen Daten dann auf den Drucker aus. +

    +

    Benutzt die xbcon...-Vektoren. +

    +

    3.7.2.372 Cookie, PRN!

    +

    WandelSZ +

    +

    Wandelt das ß des ST in ein MS-DOS-ß um. +

    +

    Hängt im BIOS. +

    +

    3.7.2.373 Cookie, PRNß

    +

    WandelSZ +

    +

    Hängt im BIOS und wandelt das ß des ST in ein MS-DOS-ß um. +

    +

    3.7.2.374 Cookie, PRO5

    +

    PROTECT5.PRG +

    +

    Resident virus check/kill/protect program. +

    +

    3.7.2.375 Cookie, PROB

    +

    Profibase +

    +

    Poolware-Datenbank mit diversen Sonderfunktionen, insbesondere +Programmierbarkeit. +

    +

    Verbiegt: TRAP #2, etv_critic, etv_term. +

    +

    Vertrieb: PD-Pool, LogicBase Software GbR +

    +

    3.7.2.376 Cookie, PROT

    +

    Protos +

    +

    Screen-Utility +

    +

    Vertrieb: Application Systems Heidelberg +

    +

    3.7.2.377 Cookie, PRTD

    +

    Print To Disk V1.10 +

    +

    Leitet die GEMDOS- und BIOS-Ausgaben für den Drucker in eine +Datei um. +

    +

    Benutzte Vektoren: Trap #1, Trap #13. +

    +

    3.7.2.378 Cookie, PRTO

    +

    "ST-Tools v1.0 +

    +

    3.7.2.379 Cookie, prtr

    +

    Druckertreiber zur Anpassung des Atari-Zeichensatzes an +IBM-Drucker +

    +

    Verbiegt BIOS-Trap. +

    +

    3.7.2.380 Cookie, PRTR

    +

    Protar-Wechselplattentreiber +

    +

    3.7.2.381 Cookie, PSND

    +

    ProSound driver +

    +

    3.7.2.382 Cookie, PSSG

    +

    Paint Shop +

    +

    Verbiegt: Hardcopyvektor. +

    +

    3.7.2.383 Cookie, PTOS

    +

    ROMRAM +

    +

    Kopiert TOS in TT-RAM, beschleunigt dadurch die Ausführung +und erlaubt Modifikationen, ohne die ROMs ändern zu müssen). +

    +

    ROMRAM hängt sich je nach den eingestellten Optionen in +'hdv_rw' und den Reset-Vektor ein. Geplant: Bus-Error und 'ikbdsys'. +

    +

    3.7.2.384 Cookie, QIKM

    +

    QuickMouse - überarbeitete Version des +Mausbeschleunigers aus der c't. +

    +

    3.7.2.385 Cookie, QMAC

    +

    Quickmaustreiber-Acc +

    +

    Status: PD. +

    +

    3.7.2.386 Cookie, QMCP

    +

    Quickmaustreiber in CHEMPLOT. +

    +

    3.7.2.387 Cookie, QST2

    +

    Quick ST 2 +

    +

    3.7.2.388 Cookie, QST3

    +

    Quick ST 3 +

    +

    3.7.2.389 Cookie, QUAN

    +

    QUANTOS - Multiutility (Ramdisk, Spooler, Hardcopy). +

    +

    Verbiegt: TRAP #1, TRAP #13, MFP Parallel Port, MFP Timer C, MFP +Keyboard/Midi ACIA, etv_term, hdv_bpb, hdv_rw, hdv_mediach, exec_os, +dump_vec. +

    +

    3.7.2.390 Cookie, RAIL

    +

    RAIL_MAN -Modellbahnsteuerung +

    +

    Verbiegt TRAP #1, MFP-CTS und MFP-Empfangspuffer-Voll-Interrupt. +

    +

    3.7.2.391 Cookie, RaSn

    +

    Rational Sounds +

    +

    3.7.2.392 Cookie, RESG

    +

    RESET GUARD +

    +

    Dies ist ein Programm zur Überwachung des Reset-Vektors +("resvector"). +

    +

    Verbogen wird lediglich der VBL-Vektor. +

    +

    Status: Das Programm gehört zu den BOOT-TOOLS und ist Public +Domain. +

    +

    3.7.2.393 Cookie, RFLX

    +

    AutoSwitch-Treiber für die REFLEX Graphic Card von +Overscan GdR. +

    +

    Verändert GEM, GEMDOS, BIOS, XBIOS, LINEA, IPL_4, VBL +und RESET Vektoren. +

    +

    3.7.2.394 Cookie, RFUS

    +

    RUFUS - das Shareware-Terminalprogramm. +

    +

    3.7.2.395 Cookie, RGUS

    +

    Argus-XBRA - zeigt Track-/Sektoradressen ab. +

    +

    Verbiegt hdv_rw und Floprd. +

    +

    3.7.2.396 Cookie, RING

    +

    Telefonklingel-Detektor +

    +

    3.7.2.397 Cookie, ROMD

    +

    MagiC DOS Treiber für ROM Module +

    +

    Verändert den GEMDOS Trap +

    +

    3.7.2.398 Cookie, ROT8

    +

    Rotate +

    +

    3.7.2.399 Cookie, RPIT

    +

    TIMEFIX - fixes GEMDOS time/date globals and IKBD (for +TOS 1.04) +

    +

    Useful for Cubase users +

    +

    https://bitbucket.org/rpins/timefix/ +

    +

    http://www.atarimania.com/utility-atari-st-timefix_37921.html +

    +

    Status: Freeware +

    +

    3.7.2.400 Cookie, RREG

    +

    RestoreRegister - Sichert und restauriert A0/A1/A2/D1/D2 +

    +

    Verbiegt: GEMDOS-, BIOS-, XBIOS- und etv_term-Vektor. +

    +

    Status: Freeware +

    +

    3.7.2.401 Cookie, RSLT

    +

    Treibersoftware für die GengTEC-VGA im Monochrom- und +16-Farbmodus. +

    +

    Verbiegt XBIOS-, VBL- und GEM-Vektoren. +

    +

    3.7.2.402 Cookie, RSpd

    +

    RS_Speed +

    +

    RS_Speed bietet auf normalen ST's, d.h. 260, 520, 520+, 1040 +(auch STE), Mega ST (aber nicht STE), zusätzliche Baudraten für die +serielle Schnittstelle an. Diese Baudraten betragen 38400, 57600 und +115200 Baud. Der Cookie wird von der beiliegenden Software gesetzt. +

    +

    3.7.2.403 Cookie, RSVE

    +

    RSVE_SET.PRG Patch +

    +

    Informationen: Dieser Cookie wird angelegt, um das Vorhandensein +der Baudratenerweiterung RSVE anzuzeigen. RSVE wandelt +110Bd->38400, 134Bd->57600, 150Bd->115200. Derzeit ist der +Wert des Cookies 0. Wenn <>0, ist dies ein Zeiger auf eine noch +nicht spezifizierte Datenstruktur. +

    +

    Hängt auch im TRAP #13 und TRAP #14. +

    +

    Bezugsquelle: Der RSVE-Bauplan ist quasi PD und in Mailboxen zu +finden. +

    +

    3.7.2.404 Cookie, RSVF

    +

    DRVIN.PRG - RS-232 Version Fast (HSMODEM) +

    +

    Cookie enthält Zeiger auf verkettete Listen mit den +Eigenschaften von Kommunikationsschnittstellen (z.B. RS232), die für +DFÜ u.ä. nutzbar sind. Der Cookie wird vom DRVIN.PRG installiert. +Die Listen werden von den Schnittstellentreibern angelegt. Genaue +Beschreibung steht im RSVF_COO.TXT, der in den HSMODA*-Paketen +enthalten ist. +

    +

    Status: Freeware. +

    +

    3.7.2.405 Cookie, RTKC

    +

    Keyclick +

    +

    Verändert ikbd_sys, AES, VDI, GEMDOS und XBIOS-Vektoren. +

    +

    3.7.2.406 Cookie, RTOB

    +

    OptoBell - Ändert die Darstellung von ASCII-BEL +

    +

    Quelle: ST-Computer. +

    +

    Ändert BIOS-trap. +

    +

    3.7.2.407 Cookie, RWIN

    +

    RootWin - Laden eines neuen Desktop-Hintergrunds. +

    +

    Verändert VDI- und BIOS-Trap. +

    +

    3.7.2.408 Cookie, SAM

    +

    System Audio Manager +

    +

    3.7.2.409 Cookie, SBKM

    +

    RING-Erkennung in Modem-Routinen. +

    +

    3.7.2.410 Cookie, SBTE

    +

    Terminalprogramm +

    +

    3.7.2.411 Cookie, SBTS

    +

    Trap-Spy +

    +

    3.7.2.412 Cookie, SCAH

    +

    Speed Cache - Festplattencache für TOS-Versionen vor +1.04 +

    +

    Verbiegt die BIOS-Festplattenvektoren. +

    +

    3.7.2.413 Cookie, SCKM

    +

    MagXNet (SOCKET.DEV) +

    +

    3.7.2.414 Cookie, SCPN

    +

    Screen Blaster 3 screen enhancer +

    +

    3.7.2.415 Cookie, SCRD

    +

    Screen To Disk V1.10 +

    +

    Leitet die GEMDOS- und BIOS-Ausgaben für die Console +zusätzlich in eine Datei um. +

    +

    Benutzte Vektoren: TRAP #1, TRAP #13. +

    +

    Archivname: SCR2DISK.LZH +

    +

    3.7.2.416 Cookie, SCRN

    +

    Master-Modul screen.mmx - Setzen von Scrolling-Regions +

    +

    3.7.2.417 Cookie, SCRS

    +

    Bildschirmschoner +

    +

    3.7.2.418 Cookie, SCRW

    +

    SCREENWATCH.PRG - Warnton bei unsauberen +Bildschirmzugriffen +

    +

    3.7.2.419 Cookie, SCSI

    +

    SCSIDRV Interface +

    +

    3.7.2.420 Cookie, SCSV

    +

    Line Art Screensaver +

    +

    3.7.2.421 Cookie, SDCH

    +

    2C - Second Chance +

    +

    Ändert Löschungen per Fdelete in Frename in Ordner namens +-TRASH- im Rootdirectory (sofern vorhanden). +

    +

    Verbiegt Vektor 33 GEMDOS. +

    +

    Status: Freeware. +

    +

    3.7.2.422 Cookie, SDES

    +

    Softdesk +

    +

    Desktoputility zur Installation eines beliebigen +Desktophintergrunds, eines neuen Fensterdesigns, animierte +Systemmausformen usw. +

    +

    Vektoren: TRAP #2, TRAP #13. +

    +

    Vertrieb: LogicBase Software GbR +

    +

    3.7.2.423 Cookie, SDsk

    +

    Softdisk - resetfeste, bootfähige RAMdisk +

    +

    Verbiegt hdv_bpb, hdv_rw und hdv_mediach. +

    +

    3.7.2.424 Cookie, SDWN

    +

    ScreenDown - behält Bildschirmspeicher im ST-RAM +

    +

    Vektoren: XBIOS. +

    +

    Status: Public Domain. +

    +

    3.7.2.425 Cookie, SELC

    +

    File-Selector von C-Lab +

    +

    3.7.2.426 Cookie, SENV

    +

    Environment-Setter +

    +

    3.7.2.427 Cookie, SFA^

    +

    FONT_BLK.PRG (residenter Autoordnerteil), +FONTLOAD.ACC, FONTLOAD.PRG, FONTLOAD.CPX +

    +

    Ladeprogramme für die 8*16-ST-Systemfonts. +

    +

    3.7.2.428 Cookie, SFIX

    +

    Serial Port Fix +

    +

    Patchprogramm für die serielle Schnittstelle (TOS 2.05, TOS 3.01 and TOS 3.05). +

    +

    3.7.2.429 Cookie, SFMN

    +

    SafeMenu +

    +

    3.7.2.430 Cookie, ShLk

    +

    Shift Lock +

    +

    Per ALT-Recht-Shift wird ShiftLock ein-/ausgeschaltet. +

    +

    Verbiegt IKBD. +

    +

    Status: Freeware. +

    +

    3.7.2.431 Cookie, shlp

    +

    shelhelp +

    +

    Dies ist ein TSR, daß die N.AES-Funktion shel_help auch unter +anderen Systemen zur Verfügung stellt. Damit ist es auf einfache Art +und Weise möglich einen der verfügbaren Viewer für eine bestimmte +Art von Help-File-Formaten auszuwählen und so eine einheitliche +Online-Hilfe zu bekommen. +

    +

    Nur in TraPatch-interner XBRA-Liste. +

    +

    Status: Freeware +

    +

    3.7.2.432 Cookie, SKEY

    +

    SpecialKeys - Treiber für eine DTP-Spezialtastatur am +MIDI-Port. +

    +

    Verbiegt midivec, belegt einen VBL-Slot. +

    +

    Status: Kommerzielles Produkt. +

    +

    3.7.2.433 Cookie, SLCT

    +

    Selectric™ - File-Selector. +

    +

    Verbiegt TRAP #2 und #13. +

    +

    Status: Shareware. +

    +

    3.7.2.434 Cookie, SLif

    +

    SoundLifter +

    +

    Eingangsumschaltung für Falcon, gehört zur +SoundLifter-Hardware. +

    +

    Verbiegt XBIOS-Trap. +

    +

    3.7.2.435 Cookie, SLIP

    +

    SLIP +

    +

    Socket/UDP/TCP/IP/SLIP-Implementation für MagiC. Stellt die +wichtigsten Netzwerk-Befehle zur Verfügung. +

    +

    3.7.2.436 Cookie, SM00

    +

    SOTA - Printer Spooler +

    +

    3.7.2.437 Cookie, SM01

    +

    ReProK - Office management DUO (siehe Cookie, SM02) +

    +

    3.7.2.438 Cookie, SM02

    +

    ReProK international EM-NET II - Datenbank-Server für +das PAMs-Netzwerk +

    +

    Dieser Server besteht aus zwei Komponenten: PAMSERVE.PRG +(AUTO-Ordner) und PAMSERVE.ACC. +

    +

    PAMSERVE.PRG installiert einen neuen Reset-Vektor ($426 resvalid +und $42a resvector) mit der XBRA-ID SM02 sowie einen Cookie SM02 zur +Kommunikation mit dem Accessory. +

    +

    3.7.2.439 Cookie, SMAL

    +

    Small AES icon fonts +

    +

    Enthält im niederwertigen Wort die Höhe des AES-Iconfonts +(SMALL) in Pixeln (wie er von vst_height verwendet wird). Das +höherwertige Wort enthält optional die Höhe des IBM-Fonts. Ist von +jedem Programm zu setzen, welches die Größe des SMALL-Fonts +verändert (z.B. AESFONT von H. Schmidt). Genaue Definition in RUBY +(M. Nick). +

    +

    3.7.2.440 Cookie, SMAU

    +

    Set-Maus-Accessory. +

    +

    3.7.2.441 Cookie, SMon

    +

    SysMon - Der System-Monitor. +

    +

    Verändert GEM, GEMDOS, BIOS, XBIOS, LINEA, RTX (TRAP #4 & 5), VBL, IKBDSYS. +

    +

    3.7.2.442 Cookie, SMTT

    +

    SM124-Emulator +

    +

    Verbiegt AES-, GEMDOS-, BIOS- und XBIOS-Trap sowie den +exec_os-Vektor. +

    +

    3.7.2.443 Cookie, SNAP

    +

    That's-Snap-Accessory +

    +

    Verbiegt Hardcopy-Vektor. +

    +

    3.7.2.444 Cookie, SOFS

    +

    Softscreen - Virtueller Großbildschirm mit +Preview-Funktion. +

    +

    Vektoren: Line-A, VBL, TRAP #1. TRAP #2, TRAP #13, IKBD/MIDI, +scr_dump, mousevec. +

    +

    Vertrieb: LogicBase Software GbR +

    +

    3.7.2.445 Cookie, SOSW

    +

    Softswitch +

    +

    Multiswitcher mit vielfältigen Multitasking-Möglichkeiten, +virt. Großbildschirm etc. +

    +

    Vektoren: Line-A, VBL, TRAP #1. TRAP #2, TRAP #13, TRAP #14, +Busy-Interrupt Timer A, Timer C, Timer D, ikbdsys, midivec, mousevec, +BUTTON CHANGE VECTOR, MOUSE MOVEMENT VECTOR, CURSOR CHANGE VECTOR. +

    +

    Vertrieb: LogicBase Software GbR +

    +

    3.7.2.446 Cookie, SpcE

    +

    Space +

    +

    Alternatives und XControl-kompatibles Multitasking-Kontrollfeld +

    +

    Verbiegt TRAP #2 (GEM) und TRAP #13 (BIOS). +

    +

    Status: Shareware. +

    +

    3.7.2.447 Cookie, SPCK

    +

    RAMdisk für SPC-Modula +

    +

    3.7.2.448 Cookie, SPEE

    +

    Mouse Speeder +

    +

    Status: PD. +

    +

    3.7.2.449 Cookie, SPEK

    +

    Treiber für die 'Spektrum'-Grafikkarten +

    +

    Verändert: Timer-Interrupt und Mausroutine. +

    +

    3.7.2.450 Cookie, SPEX

    +

    Steve's Printing Exzessory 2.0 +

    +

    Druckerspooler für ST/STE und TT. +

    +

    Verbiegt BIOS-Trap, BIOS-Ausgabevektoren und BUSY-Interrupt. +

    +

    3.7.2.451 Cookie, spMR

    +

    Drucker und Filespuler +

    +

    3.7.2.452 Cookie, Spol

    +

    SPOOL.PRG - Flexibler Druckerspooler. +

    +

    Hängt sich (bei Bedarf) in TRAP #1, #13, MFP-Parallel Port +Interrupt, prt_stat, prt_vec und in den VBL-Queue (und, falls der +Cookiejar angelegt werden muß, noch in den Resetvector). +

    +

    Status: Shareware. +

    +

    3.7.2.453 Cookie, SPRG

    +

    STARTER.ACC +

    +

    Startet unter alten Desktop-Versionen Programme auf +Funktionstastendruck. +

    +

    Benutzt kurzzeitig TRAP #1 und TRAP #2. +

    +

    3.7.2.454 Cookie, SR17

    +

    Pointer to the base of the SST cockpit. +

    +

    3.7.2.455 Cookie, SSND

    +

    Petra +

    +

    PETRA installiert einen Cookie (SSND) über den dann PAULA PETRA +mitteilt, was denn mit welcher Samplefrequenz abzuspielen ist. Details +über diese Schnittstelle kann man bei mir anfordern. +

    +

    PETRA verbiegt Vektoren und hält sich an das XBRA Verfahren. +Als Kennung wird SSND benutzt. +

    +

    PETRA benutzt Timer A zur Sample Ausgabe. Außerdem wird der +Tastaturinterrupt modifiziert, um auch während Mausbewegungen Samples +abzuspielen. +

    +

    3.7.2.456 Cookie, ST-C

    +

    ST-Cache +

    +

    Verbiegt hdv_rw und hdv_mediach. +

    +

    3.7.2.457 Cookie, ST17

    +

    ST-68017 +

    +

    Emuliert einen Teil (30.5) der 68020-Instruktionen auf dem +68000er. +

    +

    Verbiegt die Exception-Vektoren 3 und 4. +

    +

    3.7.2.458 Cookie, STAT

    +

    STaTOS +

    +

    Statistische Auswertung von BIOS-, XBIOS– und +GEMDOS-Aufrufen. +

    +

    Quelle: Erschienen im ST-Magazin. +

    +

    3.7.2.459 Cookie, STEM

    +

    STEmulator +

    +

    3.7.2.460 Cookie, STEW

    +

    Stewart +

    +

    Ein Sharewareprogramm, das MagiC (ab v3.00) ein paar optische +Features von MacOs 8 (Copland) unterschiebt (z.B. sich drehende +Grow/Shrinkboxen, graue Menüs). +

    +

    Verbogene Vektoren: TRAP #2 +

    +

    3.7.2.461 Cookie, STFA

    +

    Sound Treiber für Atari +

    +

    3.7.2.462 Cookie, StIc

    +

    Stewart-Iconserver +

    +

    Zusammen mit Stewart erscheint statt dem MagiC Logo ein +(Farb)Icon in der Menüleiste - für jede angemeldete Applikation ein +Anderes. +

    +

    3.7.2.463 Cookie, STiK

    +

    ST Internet Kit +

    +

    3.7.2.464 Cookie, STMS

    +

    Screendump +

    +

    Quelle: ST-Magazin 2/1990. +

    +

    Verbiegt den Hardcopy-Vektor. +

    +

    3.7.2.465 Cookie, strk

    +

    StarTrack XBIOS extension +

    +

    3.7.2.466 Cookie, STRX

    +

    SAT-Trax +

    +

    Treiber für Antennensteuerung in einem +Satellitenbeobachtungsprogramm. +

    +

    3.7.2.467 Cookie, SupV

    +

    Die Falcon Erweiterung SuperVidel ist vorhanden. +

    +

    3.7.2.468 Cookie, SVAR

    +

    Shows MacMiNT +

    +

    Zeigt an, daß der Rechner unter MacMiNT läuft (d.h., daß +keine Zugriffe auf Systemvariablen außer p_cookies möglich sind). +

    +

    3.7.2.469 Cookie, SVGA

    +

    Super VGA Emulator +

    +

    3.7.2.470 Cookie, SWAP

    +

    OUTSIDE.PRG - Virtuelle Speicherverwaltung für TT +

    +

    3.7.2.471 Cookie, SwTm

    +

    Show Time +

    +

    Die ulti-/informative Uhr.Alle Atari-Auflösungen. Zeigt +Uhrzeit, freies RAM (auch bei MagiC), das Datum, CapsLock-/DCF-Status +usw. +

    +

    Hotkeys für Taktumschaltung bei Turbokarten oder Mega STEs. +CapsLock LED. Mit INF-Datei Anzeige und Turbo +an-/abschalt-/(verschieb)bar. +

    +

    Der Cookie zeigt auf eine Datenstruktur mit der ShowTime +an-/ausgeschaltet werden kann. +

    +

    Verbogene Vektoren: GEMDOS-Trap, VDI/AES-Trap, IKBD. +

    +

    Copyrightstatus: Freeware/Postcardware +

    +

    3.7.2.472 Cookie, SYMB

    +

    Resident Symbol Driver (1.23). +

    +

    Leitet die GEMDOS-Routinen Pexec, Pterm, Pterm0 und Mfree auf +eigene Routinen um. Bei jedem Pexec-Aufruf wird überprüft, ob das zu +startende Programm eine Symboltabelle enthält. In diesem Fall wird +zuerst die Symboltabelle und dann das Programm geladen, wobei die +Symbole mit den entprechenden Werten aus TEXT-, DATA- und BSS-Segment +angepaßt werden. Aufrufe von Pterm, Pterm0 oder Mfree (Chameleon) +sorgen dafür, daß die Tabelle wieder aus dem Speicher entfernt wird. +Der Cookie zeigt auf eine verkettete Liste von Symboltabellen, mit +deren Hilfe das symbolische Debuggen von speicherresidenten Programmen +möglich ist (z. B. in Verbindung mit TempleMon ab V2.02). +

    +

    Benutzte Vektoren: TRAP #1. +

    +

    Status: Freeware. +

    +

    3.7.2.473 Cookie, SYNL

    +

    Dynamic Link Library Driver +

    +

    3.7.2.474 Cookie, SYNT

    +

    Syntex - Schrifterkennung, Marvin AG). +

    +

    Tastatursimulation: TOS 1.0: BIOS; nicht TOS 1.0: +xconstat und xconin der Console; Joystick. +

    +

    3.7.2.475 Cookie, SysE

    +

    Systemeditor - Verwaltet und fügt Änderungen ins +Betriebssystem ein +

    +

    3.7.2.476 Cookie, Syso

    +

    ST-Sysop - PC-Net kompatible Mailbox fuer Atari +

    +

    Verbiegt versch. Exception-Vektoren, BIOS-Vektoren und einen +Eintrag der VBL-Queue. +

    +

    3.7.2.477 Cookie, SYST

    +

    Systime - Auslastungsanzeige in der Menüzeile. +

    +

    Verbiegt Vektor 256 (etv_timer). +

    +

    Status: Freeware +

    +

    3.7.2.478 Cookie, SZ_M

    +

    Dynamischer Mausbeschleuniger +

    +

    Bezugsquelle: NICKEL@MAFIA.ZER, +/usergroups-lokal/st/file-system@MAFIA.ZER +

    +

    Verbogen wird: mousevec (XBIOS 34 Kbdvbase). +

    +

    3.7.2.479 Cookie, S_DR

    +

    CDROM SCSI driver +

    +

    3.7.2.480 Cookie, T206

    +

    PATCHX06.PRG +

    +

    Korrigiert Fehler im Diskbios des TOS 2.06/3.06 und +ermöglicht korrekte ED-Behandlung durch Getbpb. +

    +

    Verbiegt hdv_bpb, hdv_rw, hdv_mediach. +

    +

    Status: Public Domain. +

    +

    3.7.2.481 Cookie, T2GM

    +

    TOS2GEM +

    +

    3.7.2.482 Cookie, TALK

    +

    MegaTalk +

    +

    Die Gadgets MegaTalk ist eine Karte für den Megabus und besitzt +zwei serielle Schnittstellen. Sie sind kompatible mit den des +Macintosh Puls und können vom Spectre 128/GCR genutzt werden. Im +Atarimodus können sie als normale Schnittstellen genutzt werden. +

    +

    Der Cookie TALK zeigt auf folgenden Struktur: +
    +

    +
    struct
    +{
    +  int16_t  version;     /* Treiberversion im TOS format (0x0100 = 1.0) */
    +  int32_t *p_txbint;    /* Zeiger Port B transmit interrupt Handler    */
    +  int32_t *p_exbint;    /* Zeiger Port B ext/status interrupt Handler  */
    +  int32_t *p_rxbint;    /* Zeiger Port B Empfangs interrupt Handler    */
    +  int32_t *p_specb;     /* Zeiger Port B special interrupt Handler     */
    +  int32_t *p_txaint;    /* Zeiger Port A transmit interrupt Handler    */
    +  int32_t *p_exaint;    /* Zeiger Port A ext/status interrupt Handler  */
    +  int32_t *p_rxaint;    /* Zeiger Port A Empfangs interrupt Handler    */
    +  int32_t *p_speca;     /* Zeiger Port A special interrupt Handler     */
    +  int32_t *p_ahighin;   /* Zeiger Port A high speed input Routine      */
    +  int32_t *p_bhighin;   /* Zeiger Port B high speed input Routine      */
    +  int32_t *p_ahighout;  /* Zeiger Port A high speed output Routine     */
    +  int32_t *p_bhighout;  /* Zeiger Port B high speed output Routine     */
    +  int32_t  highbuf;     /* Adresse des High speed I/O buffer           */
    +  int16_t  highlen;     /* Länge des High speed I/O buffer             */
    +  int8_t   ack;         /* Optional transmitter ACK Byte               */
    +  int8_t   res;         /* Unbenutzt/Reserviert                        */
    +  int32_t  p_baudrate;  /* Zeiger auf die Baudraten Tabelle            */
    +}
    +
    +

    3.7.2.483 Cookie, TAPE

    +

    Tape-BIOS +

    +

    3.7.2.484 Cookie, TASS

    +

    Turbo-Assembler +

    +

    3.7.2.485 Cookie, TCFS

    +

    Turbo-C-Fileselector als Accessory +

    +

    Verbiegt den GEM-Trap. +

    +

    3.7.2.486 Cookie, TCRB

    +

    Turbo Cache - Harddiskcache +

    +

    Hängt in hdv_bpb, hdv_mediach, hdv_rw und TRAP #13. +

    +

    3.7.2.487 Cookie, Tenv

    +

    Gehört zum Terminalprogramm TRAPIDO +

    +

    Setzt Enviroment aus AUTO-Ordner. +

    +

    Verbiegt exec_os. +

    +

    3.7.2.488 Cookie, TFIX

    +

    XBRA-Version des TOS 1,04 FIX Programm von Atari. +

    +

    Verändert XBIOS, LINEF und RESET Vektoren. +

    +

    3.7.2.489 Cookie, THNX

    +

    THINX (Shell). +

    +

    Zeichenfilter für Druckerausgaben. Das Programm wird unter dem +Namen Chatwin (siehe CHTW) weiterentwickelt. +

    +

    Verbiegt den BIOS-Vektor. +

    +

    3.7.2.490 Cookie, THRM

    +

    Auswerten der Temperaturdaten mit dem ST über den +Druckerport. +

    +

    Verbiegt den MFP-Busy-Interruptvektor. Der ursprüngliche Wert +des Vektors steht nicht in der XBRA-Struktur. +

    +

    Status: Freeware. +

    +

    3.7.2.491 Cookie, THST

    +

    TurboHST- enhanced serial driver with special options +for USR HST modems +

    +

    Verbiegt: MFP-Vektoren: Mfp: Timer C, ACIAs, RS cts, RS s.err, +RS s.buf, RS r.err, RS r.buf. +

    +

    3.7.2.492 Cookie, TIM3

    +

    TIMEDRV3.PRG - Corner clock and active disk +drive/direction display +

    +

    3.7.2.493 Cookie, TIM5

    +

    TIMEDRV5.PRG - Same as TIMEDRV3.PRG but with screen protector +

    +

    3.7.2.494 Cookie, TIME

    +

    Led Panel Time +

    +

    Der "TIME"-Cookie enthält einen Zeiger auf ein +word-große Variable mit der aktuellen Uhrzeit im Tgettime-Format. +

    +

    3.7.2.495 Cookie, TK40

    +

    MC68040 ToolKit +

    +

    3.7.2.496 Cookie, TL3D

    +

    BIOS-Treiber zur Ansteuerung einer dritten Floppy. +Unterstützt auch 40-Track-Disketten (5,25") in einem +80-Track-Laufwerk ohne spezielle HW-Umschaltung. +

    +

    Verbogene Vektoren: XBIOS. +

    +

    3.7.2.497 Cookie, TLWV

    +

    STGAWVBL +

    +

    Rüstet die in NVDI fehlende WVBL-Routine fuer den +MEGA4000-Adapter nach. +

    +

    Verbogene Vektoren: XBIOS. +

    +

    3.7.2.498 Cookie, Tmon

    + +

    Templemon - Unverzichtbarer Debugger +

    +

    3.7.2.499 Cookie, tmsW

    +

    TMS Wacom-Treiber +

    +
    typedef struct
    +{
    +  int8_t pressure;       /* Aktueller Andruck */
    +  int8_t driver_running; /* Flag ob Wacom_Treiber läuft */
    +  int8_t limit;          /* Schwelle für Emulation der linken Maustaste */
    +  int8_t pen;            /* Flag ob pressure Mode eingeschaltet oder nicht */
    +  int8_t lmb;            /* Flag ob Emulation der linken Maustaste eingeschaltet */
    +} COOKIE_WACOM;
    +
    +

    In pressure steht der aktuelle Andruck. Er bewegt sich +zwischen MIN_PRESS(=0) und MAX_PRESS(=60). Falls der Stift außerhalb +der Tablettreichweite ist steht dort NO_PRESS(=-64). +

    +

    driver_running ist 1, wenn der Wacom-Tabletttreiber +aktiv ist. 0 wenn sonst. +

    +

    limit ist die Andruckschwelle ab der bei eingeschalteter +linker Maustasten-emulation ein Klick mit der linkem Maustaste +simuliert wird. +

    +

    In der Variablen pen steht ob der Drucksensitive Modus +aktiviert ist (PRESSURE_MODE='1') oder nicht (STANDARD_MODE='0'). +

    +

    lmb ist 1, wenn die linke Maustastenemulation +eingeschaltet ist. 0 wenn sonst. +

    +

    ACHTUNG: COOKIE_WACOM ist eine read-only Struktur => +niemals hineinschreiben! +

    +

    3.7.2.500 Cookie, TOpW

    +

    Top-Manager Watcher +

    +

    Verändert etv_critic. +

    +

    3.7.2.501 Cookie, TOUC

    +

    Touch +

    +

    Setzt das Datei-Datum einer modifizierten Datei auf das aktuelle +System-Datum (Datum entspricht last modified, statt created). +

    +

    Fängt Fopen, Fclose, Fwrite aus GEMDOS ab. +

    +

    Quelle: Im Lieferumfang der Shareware-Streamersoftware `GEMAR'. +

    +

    3.7.2.502 Cookie, TPat

    +

    TOS Patch für vr_trnfm +

    +

    Behebt den int-overflow-Fehler in der vr_trnfm-Routine des +TOS. +

    +

    Verbiegt VDI/AES- und BIOS-Traps. +

    +

    3.7.2.503 Cookie, TPGM

    +

    TraPatch - siehe TraP +

    +

    (nur in TraPatch-interner XBRA-Liste) +

    +

    3.7.2.504 Cookie, TRAK

    +

    Track-Speed - einfacher Maus-Speeder +

    +

    Hängt im Maus-Vektor. +

    +

    3.7.2.505 Cookie, TraP

    +

    TraPatch +

    +

    Ermöglicht es sich in einzelne BS-Calls einzuhängen, so daß +es nicht mehr nötig ist, sich in direkt einen Trap einzuhängen und +dadurch andere BS-Calls abzubremsen. Es werden intern XBRA-Ketten +benutzt, für die die XBRA-IDs dieser Liste gelten! +

    +

    Veränderte Vektoren: GEMDOS, GEM, (X)BIOS. +

    +

    Copyright: Freeware +

    +

    3.7.2.506 Cookie, Trpp

    +

    Trapper ist ein Programm, das die Entwicklung von +Systemerweiterungen für Programmierer enorm vereinfacht. +

    +

    Trapper klinkt sich ins BIOS, XBIOS, GEMDOS, VDI und AES. Als Schnittstelle zu Trapper +wurde die XBIOS-Funktion Nummer 555. +

    +

    3.7.2.507 Cookie, TRUE

    +

    TrueDisk - Eine schnelle residente RAM-Disk. Version 2.2 +(2.1.94) +

    +

    Über XBRA verbogen: hdv_bpb, hdv_rw, hdv_mediach. +

    +

    Status: PD. +

    +

    3.7.2.508 Cookie, TSEN

    +

    TSE-NET - Netzwerk von Inotec +

    +

    3.7.2.509 Cookie, TSWP

    +

    TonySoft Write Protection +

    +

    Schützt logische Laufwerke vor Schreibzugriffen und hängt sich +dazu in den hdv_rw-Vektor. +

    +

    3.7.2.510 Cookie, TTTF

    +

    TT2TF - "Thirty-Two to Twenty-Four +

    +

    Damit wird dem TT ein 24-Bit-Adressbus verpaßt, so daß z.B. +TEMPUS drauf läuft. Der Cookie zeigt auf eine Routine, mit der +zwischen 24- und 32-Bit-Adressbus umgeschalten werden kann. +

    +

    3.7.2.511 Cookie, TUBS

    +

    TUBS - The Ultimate Boot Selector +

    +

    3.7.2.512 Cookie, TWFS

    +

    That's-Write-File-Selector-Accessory +

    +

    Verbiegt TRAP #2 +

    +

    3.7.2.513 Cookie, Typ1

    +

    TYPENRAD-Accessory +

    +

    Hängt in PRN-OUT, PRN-OUTSTAT und VBL-Vektor. +

    +

    3.7.2.514 Cookie, UFSL

    +

    Extended Universal Font Selector +

    +

    Querverweise: Die UFSL-Schnittstelle +

    +

    3.7.2.515 Cookie, UIS3

    +

    Universal Item Selector 3. +

    +

    3.7.2.516 Cookie, UKB1

    +

    Fastload +

    +

    3.7.2.517 Cookie, UKB3

    +

    Fastload & MIDI Through +

    +

    3.7.2.518 Cookie, UN*X

    +

    Unixname +

    +

    Konvertiert UNIX-Filenamen bei allen GEMDOS- Aufrufen in +GEMDOS-konformes Format (im Moment nur '/' nach '\'). +

    +

    Belegt TRAP #1, +

    +

    3.7.2.519 Cookie, USCK

    +

    CHECKIT +

    +

    Überprüft nach jedem Programmende (also auch nach einem +Absturz) diverse Systemvektoren und die VBL-Queue. Zeigt ein Vektor in +einen Speicherbereich, der innerhalb des terminierten Programms liegt, +so wird dieser Vektor gelöscht (VBL) bzw. ausgeklinkt (XBRA) oder auf +ein RTE gelegt (falls kein XBRA). +

    +

    3.7.2.520 Cookie, USHD

    +

    HDDRIVER.PRG - Diskus-Plattentreiber ab Version 2.5 +

    +

    3.7.2.521 Cookie, UsNm

    +

    User-Name-Cookie - Stellt den Benutzername als Cookie +zur Verfügung +

    +

    3.7.2.522 Cookie, USPK

    +

    AUTOPARK.PRG +

    +

    Programm für den AUTO-Ordner zur Unterstützung des +AUTOPARK-Accessories in Versionen < 4.0. AUTOPARK parkt Platten +eine gewisse Zeit nach dem letzten Zugriff automatisch. Es wird ein +XHDI-kompatibler Festplattenreiber benötigt. +

    +

    (AUTOPARK ist Bestandteil der HDDRIVER-Festplattensoftware.) +

    +

    3.7.2.523 Cookie, USRS

    +

    ROMSPEED +

    +

    Verlegt auf 68030-Maschinen das ROM ins RAM, +

    +

    Quelle: Im Lieferumfang von Outside enthalten. Wird ggfs. auch +von Outside angelegt. +

    +

    3.7.2.524 Cookie, USSC

    +

    NF_SCSI - SCSI Treiber für Hatari und ARAnyM +

    +

    3.7.2.525 Cookie, UTRK

    +

    Ultimate Tracker +

    +

    3.7.2.526 Cookie, VBLF

    +

    VBLFIX.PRG für Falcon030 +

    +

    Korrigiert am SM124/44/46 den VBL-Interrupt, der zu häufig +ausgeloest wird (Folge: Zu schnelles Cursorblinken, Maccel schont zu +früh, evtl. noch mehr). +

    +

    Verbogene Vektoren: VBL-Vektor (0x70). +

    +

    3.7.2.527 Cookie, VDIp

    +

    VDI performance logger +

    +

    3.7.2.528 Cookie, VDLY

    +

    Videlity +

    +

    3.7.2.529 Cookie, VECS

    +

    Vecshow - zeigt Systemvektoren an +

    +

    Verbiegt: Bus error. +

    +

    3.7.2.530 Cookie, VeiL

    +

    Turbo Veille +

    +

    3.7.2.531 Cookie, VFIX

    +

    VDI-Fix +

    +

    Beseitigt das in ST-Magazin 1/90 beschriebene +Handle-Problem im VDI von TOS 1.0, TOS 1.04, TOS 1.06, +TOS 1.62 und TOS 2.05 +

    +

    Verändert TRAP #2-Vektor. +

    +

    3.7.2.532 Cookie, VFNT

    +

    VdiFont.PRG +

    +

    Zeichensatz vom AES oder Applikationen auf beliebigen GDOS- +Font einstellen. +

    +

    Vektoren: VDI (TRAP #2), v_opnwk, v_opnvwk und +vst_load_fonts. +

    +

    Copyright: FreeWare. +

    +

    3.7.2.533 Cookie, VGAS

    +

    VGA-Simulator +

    +

    Dies simuliert auf dem Atari TT die fünf niedrigen Bildschirm- +Auflösungen (VGA-Auflösungen) mit der hohen TT-Auflösung. +

    +

    Über XBRA verbogen: BIOS-, XBIOS- und GEM-Trap, je nach +Bedarf aber auch mehr. +

    +

    Status: Version 1.08 (30.1.94), Shareware. +

    +

    3.7.2.534 Cookie, VI-2

    +

    Videl Inside +

    +

    3.7.2.535 Cookie, View

    +

    View protocol +

    +

    3.7.2.536 Cookie, VIRA

    +

    VIRUS-Alarm +

    +

    Ein residentes Programm, das eingelegte Disketten auf +ausführbare Bootsektoren überprüft. +

    +

    Veränderter Vektor: hdv_bpb. +

    +

    3.7.2.537 Cookie, VMEM

    +

    VMEM.PRG - realisiert virtuellen Speicher für jeden +Atari-Rechner. +

    +

    Natürlich wird dadurch keine MMU emuliert, aber dank der +Funktionsschnittstelle kann man sozusagen einen "manuell" +gesteuerten virtuellen Speicher verwalten, der zudem auf wirklich +jedem Rechner funktioniert. Der Cookie-Wert ist die Adresse des +Funktionshandlers. +

    +

    Sämtliche Routinen (Pure C-Source) sind frei verfügbar. Archiv +VMEM11.ZIP +

    +

    3.7.2.538 Cookie, VPCH

    +

    VDIPATCH.PRG +

    +

    Hängt sich in Trap #2, fängt die VDI-Raster-Copy Calls ab +und schaut ob in fd_addr LogBase oder PhysBase eingetragen ist. Falls +ja, wird dies durch NULL ersetzt. +

    +

    3.7.2.539 Cookie, VRAM

    +

    VRAM - virtuelle Speicherverwaltung für TT +

    +

    3.7.2.540 Cookie, VREP

    +

    Vector Guard - Resetresidentes Programm, das +Systemvektoren überwacht +

    +

    Veränderter Vektor: resvector. +

    +

    3.7.2.541 Cookie, VSco

    +

    Virusscope +

    +

    Quelle: Maxon PD-Disk 227. +

    +

    3.7.2.542 Cookie, VSCR

    + + +

    Virtueller-Bildschirm +

    +

    Der Cookie enthält einen Zeiger auf eine Struktur, die +Informationen über den sichtbaren Bildschirmausschnitt zur Verfügung stellt. +

    +

    3.7.2.543 Cookie, VSTM

    +

    Transfer (über MIDI) +

    +

    Status: PD. +

    +

    3.7.2.544 Cookie, vT52

    +

    Kennzeichnet den CyReL VT52-Emulator für die CyReL +M16-1280 True-Color-Graphikkarten. +

    +

    Wird in einem VBL-Slot und im constat-Vektor eingetragen. +

    +

    3.7.2.545 Cookie, VTFX

    +

    VT52FIX.PRG für Falcon030. +

    +

    Korrigiert die Fehler im VT52-Emulator des Falcon-TOS +(fehlerhafte Esc-Sequenzen und falsches Scrolling). +

    +

    Verbogene Vektoren: xconout für CON und RAWCON. +

    +

    3.7.2.546 Cookie, VXCK

    +

    VoxClock - sprechende Uhr für DMA-Sound +

    +

    Verbiegt GEMDOS-Timer-Vektor, DMA-Active-Interrupt und +IKBD-Clock-Packet-Handler. +

    +

    3.7.2.547 Cookie, WaHW

    +

    Wird von HIGH_WAY.ACC angelegt und benutzt. +

    +

    Status: Shareware. +

    +

    3.7.2.548 Cookie, WARP

    +

    Warp 9 accelerator +

    +

    3.7.2.549 Cookie, WaSA

    +

    SATELLIT +

    +

    Dies ist ein Multi-ACC, das die Kennung zur Kommunikation +benutzt. +

    +

    Status: Shareware +

    +

    3.7.2.550 Cookie, WBrd

    +

    Bird's Wing +

    +

    3.7.2.551 Cookie, wdlg

    +

    WDIALOG.PRG -Window-Dialog-Library für Standard-TOS +(kompatibel zu MagiC 4.0). +

    +

    Verbogen: TRAP #2 (VDI/AES), TRAP #13 +

    +

    Status: Freeware. +

    +

    3.7.2.552 Cookie, WDOG

    +

    Watchdog (1.21) +

    +

    Dieses Utility ermöglicht in Verbindung mit dem "Resident +Symbol Driver" ein Profiling auf Zeitbasis. So kann man +herausfinden, welche Funktion eines Programmes die meiste Rechenzeit +schluckt. Um jedoch den Code in Funktionen unterteilen zu können, +muß eine Symboltabelle vorhanden sein. Der Cookie-Jar wird benötigt, +um mit dem Steuer-Accessory die Funktionen des speicherresidenten +Programms kontrollieren zu können. +

    +

    Benutzte Vektoren: MFP-Interrupt 13 (Timer A). +

    +

    3.7.2.553 Cookie, WEGA

    +

    Wird von der WEGA-Library (Dialogboxen etc) benutzt. +

    +

    3.7.2.554 Cookie, WfNa

    +

    WFNAME.PRG +

    +

    Dies erweitert MagiC um eine spezielle Funktion. Es ermöglicht +anderen Programmen, den Fenstertitel beliebiger Fenster abfragen zu +können. +

    +

    Für Programmierer: +

    +
      +
    • Sofern WFNAME.PRG installiert ist, kann man Fenstertitel +beliebiger Fenster mit wind_get(WF_NAME) erfragen. +
        +

    • +
    • WFNAME.PRG gibt sich durch einen 'WfNa'-Cookie zu erkennen. +Abfrage, ob wind_get(WF_NAME) möglich ist, sollte daher so erfolgen: +
        +
      'WfNa'-Cookie vorhanden ODER +
      'AmAN'-Cookie vorhanden ODER +
      MagiC >= 6.0 vorhanden. +
        +

    • +
    + +

    3.7.2.555 Cookie, WFSL

    +

    WFSEL - Window-File-SELector +

    +

    Verbiegt AES-Trap und BIOS-Trap. +

    +

    Status: Shareware. +

    +

    3.7.2.556 Cookie, WICO

    +

    WINCOM - Der Window Commander (nur für MagiC ab V2.0) +

    +

    Bietet die MagiC Popup Funktionen per Hotkeys, außerdem +Echtzeitfunktionen für Fenster, Fenster tastaturbedienbar, ACCs über +Tastatur abrufbar. +

    +

    Verbiegt die Vektoren 33(GEMDOS), 34 (AES), 256 (etv_timer), +258 (etv_term), Kbdvbase->ikbdsys und Kbdvbase->mousevec. +

    +

    Status: Shareware +

    +

    3.7.2.557 Cookie, WinK

    +

    WinKeys +

    +

    Stellt systemweite Tastatursteuerung der Fenster (close, move, +backdrop, un-/all-/iconify, full, scrolling, size) über Control- +Ziffernblock-Shortcuts zur Verfügung. TraPatch wird vorausgesetzt! +

    +

    Vektoren: evnt_multi, wind_set (TraPatch!) +

    +

    Status: Freeware. +

    +

    3.7.2.558 Cookie, WINX

    +

    WINX +

    +

    3.7.2.559 Cookie, WINZ

    +

    Luftschloß/WINZ-RAMdisk (aus dem Buch +Scheibenkleister) +

    +

    3.7.2.560 Cookie, WPRO

    +

    Write Protect - Softwaremäßiger Schreibschutz fuer +beliebige logische Laufwerke +

    +

    Verbogen wird hdv_rw. +

    +

    3.7.2.561 Cookie, WRAP

    +

    WM.PRG - WrapMouse +

    +

    Treiber für serielle MS-DOS-Mäuse, Joystick-Maus, Mausspeeder +und Wraper. +

    +

    Vektoren: ST-MFP-I12($130); TT-MFP-I12($170); SCC-Vektoren an +$190, $198, $1b0 und $1b8; Maus (KBDVECS.mousevec); GEMDOS. +

    +

    Status: Version 1.0 wird/wurde vom TOS-Magazin. +vertrieben. Version 1.5 ist Shareware (DM 30.-) +

    +

    3.7.2.562 Cookie, XALT

    +

    AlberTT GFX card driver +

    +

    3.7.2.563 Cookie, XBTN

    +

    Mouse speeder routine from XBOOT +

    +

    3.7.2.564 Cookie, XDsk

    +

    Der Cookie identifiziert die X-Disk (resetfeste Ramdisk +mit allen möglichen Spielereien und Firlefanz). Im Value steht ein +Bit-Vektor, der alle Devices angibt, die von der X-Disk kontrolliert +werden (analog zur Systemvariable _drvbits). +

    +

    3.7.2.565 Cookie, XFRB

    + + +

    Extended-Fast-RAM-Buffer +

    +

    Der Cookie wird u.a. vom Festplatten-Treiber HDDRIVER angelegt, +und zeigt auf die folgende Struktur: +

    +
    typedef struct xfrb
    +{
    +   int16_t version;   /* Versionsnummer im BCD-Format */
    +   int8_t  *xflock;   /* Semaphore                    */
    +   int8_t  *buffer;   /* Pufferadresse                */
    +   int32_t size;      /* Puffergröße                  */
    +   xfrb    *next;     /* Zeiger auf nächsten XFRB     */
    +} XFRB;
    +
    +

    3.7.2.566 Cookie, XFS1

    +

    Master-Modul xfs.mmx - Erweitertes Filesystem für TOS, +

    +

    Biegt GEMDOS-Trap um +

    +

    3.7.2.567 Cookie, xFSL

    +

    Extended Font-Selector +

    +

    Der Cookie signalisiert das Vorhandensein eines systemweiten +Fontselektors mit erweiterter Funktionalität (gegenüber dem UFSL). +Erstmals verwendet von den Fontselektoren Calvino (Freeware von Dirk +Haun) und HuGo! (Freeware von Stefan Rogel). Die Beschreibung der +Schnittstelle liegt den beiden Fontselektoren bei. +

    +

    3.7.2.568 Cookie, Xgem

    +

    Windframe Xgem Manager für MagiC 6 +

    +

    3.7.2.569 Cookie, XHDI

    +

    XHDI - eXtended HardDisk Interface +

    +

    Der Cookie zeigt auf die Adresse einer Funktion, die +massenspeicherbezogene Funktionen zur Verfügung stellt. Siehe auch: +XHDI-Cookie +

    +

    Querverweis: XHDI-Spezifikation +

    +

    3.7.2.570 Cookie, XKBD

    +

    Extended Keyboard - aktuelle Version +

    +

    Ursprünglich veröffentlicht in ST-Computer 6/1988. +

    +

    3.7.2.571 Cookie, XMMU

    +

    TK40's interface for PMMU setting +

    +

    3.7.2.572 Cookie, XMuz

    +

    Ultra Player +

    +

    3.7.2.573 Cookie, xNet

    +

    xNet-ST - Low-Cost-Netzwerk +

    +

    3.7.2.574 Cookie, XPCI

    +

    XBIOS functions for PCI-BIOS +

    +

    Querverweis: PCI-BIOS   Cookie _PCI +

    +

    3.7.2.575 Cookie, xRmt

    +

    xRemote.prg, xRMaster.prg, xRemAcc.acc +

    +

    Fernwartung per Modem. +

    +

    Verbogene Vektoren: TRAP #2, TRAP #3, TRAP #13, +Kbdvbase-ikbdsys, hz200 ($114.w)... +

    +

    3.7.2.576 Cookie, XSDD

    +

    Extended Serial Device Driver +

    +

    Einleitung +

    +

    Bekanntlich sind die Möglichkeiten des TOS zur Bedienung der +seriellen Schnittstellen recht beschränkt: +

    +
      +
    • die Bedienung diverser Kontrolleitungen (wie DCD, DTR, RI usw.) +ist nur durch Direktzugriff auf die Hardware möglich +
    • +
    • Es sind nur die von Rsconf angebotenen Baudraten einstellbar, +auch wenn die Hardware mehr erlaubt +
    • +
    • Der Zugriff auf eine Schnittstelle von mehreren Programmen kann +nicht koordiniert werden +
    • +
    • Da mit BIOS jedes Zeichen einzeln übertragen werden muß, ist +die I/O-Performance nicht sehr hoch +
    • +
    + +

    Im Rahmen der Entwicklung eines seriellen Treibers für MiNT, +der diese Schwächen beheben sollte, kam die Idee auf, die erweiterte +Funktionalität auch unter reinem TOS zugänglich zu machen. Dies ist +ein erster Vorschlag, wie das aussehen könnte. Im wesentlichen werden +dabei die Low-Level-Routinen des MiNT-Treibers über einen Cookie von +außen zugänglich gemacht. Denkbar wäre jedoch auch, die beiden +Ebenen völlig zu trennen und den MiNT-Treiber auf einen separaten +TOS-Treiber aufzusetzen. +

    + +

    Das XSDD-Protokoll +

    +

    Das XSDD-Protokoll unterstützt die über Bconmap verwalteten +Devices 6 bis einschließlich <maptabsize+5> (soweit das +zugrundeliegende TOS sie zur Verfügung stellt), sowie das Device 1 +(AUX). Operationen auf AUX beziehen sich immer auf das zum Zeitpunkt +des Aufrufs von XSDD gerade aktuelle Bconmap-Device. In Zukunft wird +AUX möglicherweise aus technischen Gründen nur noch dann +unterstützt, wenn das zugrundeliegende TOS kein Bconmap hat. +

    +

    Der Treiber installiert einen Cookie "XSDD". Der +Cookie zeigt auf den Einsprungpunkt des XSDD-Treibers. Unmittelbar vor +der Routine (also an Offset -4 vor der Adresse aus dem Cookie) steht +zur Absicherung nochmals die Long-Konstante "XSDD". +

    +

    Aufruf: Welche Funktion ausgeführt werden soll, wird durch +einen Opcode (WORD) angegeben. Dieser Opcode ist bei jedem Aufruf das +erste Argument. Wenn ein ungültiger Opcode angegeben wird, wird +EINVFN zurückgeliefert. +

    +

    Die Übergabe aller Parameter erfolgt nach GEMDOS-Konvention, +d.h. auf dem Stack. Der Rückgabewert wird in D0 geliefert. Außer D0 +werden keine Register verändert. Der Aufruf von XSDD darf +AUSSCHLIESSLICH im Supervisor-Modus erfolgen. +

    +

    Zur Zeit sind die im folgenden aufgelisteten Funktionen +vorgesehen (Opcodes müssen noch vergeben werden). Für die +Parametertypen gilt folgende Vereinbarung: +

    +
    BYTE:  8-Bit-Zeichen
    +WORD:  16-Bit signed Integer
    +UWORD: 16-Bit unsigned Integer
    +LONG:  32-Bit signed Integer
    +
    +
    +
    WORD XSVersion(void)
    +
    +

    +
    Liefert die Versionsnummer des vom XSDD-Treibers implementierten +Protokolls zurück, Major-Version im Hi-Byte, Minor-Version im +Low-Byte (Beispiel: 0x0102 entspricht Version 1.2). Diese Nummer soll +nicht etwa die Version des Treiber- programms wiederspiegeln, sondern +nur die des implementierten Protokolls. +
      +
    Rückgabe: +
    Protokollversion. +
      +

    + +
    +
    WORD XSDriverInfo(BYTE *info, LONG *product, WORD *version)
    +
    +

    +
    Dieser Aufruf liefert einen Info-String, eine Produktkennung, +sowie die Version des jeweiligen Treiberprogramms zurück. +info muß dabei auf einen mindestens 80 Bytes großen Puffer +zeigen, in den der Info-String nullterminiert eingetragen wird (der +String kann z.B. den Author und den Namen des Treibers enthalten). In +den LONG, auf den product zeigt, wird die Produktkennung +eingetragen, sowie in das WORD, auf das version zeigt, die +Treiberversion. +
      +
    Rückgabe: +
    0 +
      +

    + +
    +
    WORD XSDevName(WORD device, BYTE *name)
    +
    +

    +
    Ermittelt den Namen des zum BIOS-Device gehörigen Ports (z.B. +"Modem1"). name muß auf ein mindestens 9 Bytes +großes Array zeigen. Dort wird der Name nullterminiert eingetragen. +
      +
    Rückgabe: +
    0 bei Erfolg +
    EUNDEV - Ungültiges Device +
      +

    + +
    +
    WORD XSReserve(WORD device)
    +
    +

    +
    Device reservieren. Es handelt sich hier um ein +"advisory" Locking, d.h. es ist darauf angewiesen, daß +jedes Programm den Lock abfragt und freiwillig auf weitere Zugriffe +verzichtet, wenn das Device bereits belegt ist. Jedes Programm hat vor +irgendeinem Zugriff auf das Device diesen Aufruf durchzuführen. Wenn +das Device noch frei war, ist es nach dem Aufruf reserviert. Wenn es +bereits reserviert war, wird ein Fehlercode zurückgeliefert. In +diesem Fall sollte keinerlei Zugriff mehr auf das Device erfolgen. +
      +
    Rückgabewert: +
    0 - das Device ist jetzt reserviert +
    EACCDN - das Gerät war bereits reserviert +
    EUNDEV - Ungültiges Device +
      +

    + +
    +
    WORD XSRelease(WORD device)
    +
    +

    +
    Device wieder freigeben. Dieser Aufruf darf NUR gemacht werden, +wenn vorher ein erfolgreicher XSReserve durchgeführt werden konnte +(mit Rückgabe 0). +
      +
    Falls auf dem Device noch eine XSCtlSig-Routine angemeldet war, +wird sie automatisch freigegeben. +
      +
    Rückgabewert: +
    0 bei Erfolg, +
    EACCDN - wenn das Device nicht reserviert war. +
    EUNDEV - Ungültiges Device +
      +

    + +
    +
    LONG XSCapMap(WORD device)
    +
    +

    +
    Fragt diverse Eigenschaften von Treiber und Device ab. Wenn kein +Fehler vorliegt, wird ein Bitvektor zurückgeliefert. Folgende Bits +sind z.Zt. definiert: +
      +

      #define XS_BREAK  0x01   /* Device kann Break
    +                              senden */
    +  #define XS_RTSCTS 0x02   /* Device beherrscht
    +                              RTS/CTS-Handshaking */
    +  #define XS_TANDEM 0x04   /* Device beherrscht
    +                              XON/XOFF-Handshaking */
    +  #define XS_IOBAUD 0x08   /* Device beherrscht verschiedene
    +                              I- und O-Baudraten */
    +
    +  #define XS_BIOSRW 0x8000 /* Treiber benutzt
    +                              BIOS zum Lesen/Schreiben */
    +
    +
    Alle anderen Bits sind reserviert und sollten bis auf weiteres +ignoriert werden. +
      +
    Rückgabewert: +
    >=0 (LONG!) - Verfügbare Fähigkeiten +
    EUNDEV - Ungültiges Device +
      +

    + +
    +
    LONG XSIBaud(WORD device, LONG baudrate)
    +
    +

    +
    Eingabe-Baudrate (genauer: bps) des angegebenen Devices +setzen/abfragen. Die Baud- rate wird unkodiert im "Klartext" +angegeben (38400L entspricht z.B. 38400 bps). Wenn -1L angegeben wird, +wird die Baudrate nicht verändert (nur Abfrage). Falls eine Baudrate +angfordert wird, die auf dem Device nicht zur Verfügung steht, wird +die nächst niedrigere verfügbare eingestellt und zurückgeliefert. +
      +
    Die meisten Devices unterstützen keine getrennten Baudraten +für Ein- und Ausgabe. In diesem Fall wird mit einem XSIBaud +gleichzeitig auch die Ausgabe- Baudrate verändert (dies kann mit +XSCapMap abgefragt werden). +
      +
    Rückgabewert: +
    >0 - eingestellte Baudrate +
    EUNDEV - Ungültiges Device +
      +
    Anmerkung: Durch die Rückgabe der nächst niedrigen +verfügbaren Baudrate kann der Aufrufer alle für dieses Device +verfügbaren Baudraten durch "Abklappern" von oben nach +unten ermitteln. +
      +

    + +
    +
    LONG XSOBaud(WORD device, LONG baudrate)
    +
    +

    +
    Ausgabe-Baudrate (genauer: bps) des angegebenen Devices +setzen/abfragen. Die Funktionsweise ist ansonsten analog zu XSIBaud. +
      +
    Die meisten Devices unterstützen keine getrennten Baudraten +für Ein- und Ausgabe. In diesem Fall wird mit einem XSOBaud +gleichzeitig auch die Eingabe- Baudrate verändert (dies kann mit +XSCapMap abgefragt werden). +
      +
    Rückgabewert: +
    >0 - eingestellte Baudrate +
    EUNDEV - Ungültiges Device +
      +

    + +
    +
    WORD XSBreak(WORD device, WORD on)
    +
    +

    +
    Ein BREAK auf dem Device setzen/löschen. Wenn on ungleich +0 ist, wird BREAK gesetzt, ansonsten gelöscht. Wenn das Device BREAK +nicht beherrscht, wird der Aufruf ignoriert. +
      +
    Rückgabe: +
    0 bei Erfolg +
    EUNDEV - Ungültiges Device +
      +

    + +
    +
    LONG XSSetFlags(WORD device, UWORD flags)
    +
    +

    +
    Übertragungsparameter einstellen. Versuche, Einstellungen zu +machen, die auf dem Device nicht möglich sind (d.h. solche, die +XSCapMap als nicht verfügbar meldet), werden ignoriert. flags +enthält die Einstellung in folgender Kodierung (entspricht der des +TIOCGFLAGS-Fcntl von MiNT): +
      +
    Maske: TF_STOPBITS 0x0003 +
    Werte: +
    0x0000 Ungültig +
    0x0001 1 Stop-Bit +
    0x0002 1.5 Stop-Bits +
    0x0003 2 Stop-Bits +
      +
    Maske: TF_CHARBITS 0x000C +
    Werte: +
    0x0000 8 Bits pro Zeichen +
    0x0004 7 Bits +
    0x0008 6 Bits +
    0x000C 5 Bits +
      +
    Maske: TF_PARITY 0xc000 +
    Werte: +
    0x0000 Keine Parität +
    0x4000 Gerade Parität +
    0x8000 Ungerade Parität +
    0xc000 Ungültig +
      +
    Weitere Bits: +
    T_TANDEM 0x1000 XON/XOFF Handshake +
    T_RTSCTS 0x2000 RTS/CTS Handshake +
      +
    Alle übrigen Bits sind reserviert und sollten 0 sein. +
      +
    Rückgabewert: +
    >=0 (LONG!) - die vor dem Aufruf eingestellten Flags +
    ERANGE - es wurden ungültige Parameter festgestellt +
    EUNDEV - Ungültiges Device +
      +

    + +
    +
    LONG XSGetFlags(WORD device)
    +
    +

    +
    Übertragungsparameter abfragen. +
      +
    Rückgabewert: +
    >=0 (LONG!) - Eingestellte Parameter (Kodierung siehe +XSSetFlags). +
    EUNDEV - Ungültiges Device +
      +

    + +
    +
    LONG XSCtlMap(WORD device)
    +
    +

    +
    Auf dem Device verfügbare Kontrolleitungen abfragen. Wenn kein +Fehler vorliegt, wird ein Bitvektor zurückgeliefert, in dem für die +verfügbaren Kontrolleitungen das entsprechende Bit 1 ist, für die +nicht verfügbaren 0. Folgende Bits sind definiert: +
      +

      #define TIOCM_LE  0x01        /* line enable */
    +  #define TIOCM_DTR 0x02        /* data terminal ready */
    +  #define TIOCM_RTS 0x04        /* ready to send */
    +  #define TIOCM_CTS 0x08        /* clear to send */
    +  #define TIOCM_CAR 0x10        /* carrier detect */
    +  #define TIOCM_RNG 0x20        /* ring */
    +  #define TIOCM_DSR 0x40        /* data set ready */
    +
    +
    Alle anderen Bits sind reserviert und sollten bis auf weiteres +ignoriert werden. +
      +
    Rückgabewert: +
    >=0 (LONG!) - Verfügbare Kontrolleitungen +
    EUNDEV - Ungültiges Device +
      +
    Anmerkung: Die Werte werden möglicherweise noch geändert, um +sie an die (hoffentlich bald festgelegten) Definitionen der +entsprechenden MiNT-Fcntls anzupassen. +
      +

    + +
    +
    LONG XSGetCtl(WORD device)
    +
    +

    +
    Status der Kontrolleitungen abfragen (DCD, RI etc.). Falls kein +Fehler auf- tritt, wird ein Bit-Vektor geliefert (Kodierung wie bei +XSCtlMap beschrieben). Die Bits sind 1, wenn die entsprechende Leitung +aktiviert ist, sonst 0. +
      +
    Rückgabewert: +
    >=0 (LONG!) - Status der Kontrolleitungen +
    EUNDEV - Ungültiges Device +
      +

    + +
    +
    WORD XSSetCtl(WORD device, UWORD ctl)
    +
    +

    +
    Kontrolleitungen setzen. Kodierung wieder wie in XSCtlMap. Manche +Leitungen (z.B. CTS) sind Read-only und können daher nicht +beeinflußt werden (das sollte aus dem Kontext hervorgehen). Versuche, +solche und Leitungen, die nicht von dem Device unterstützt werden +(d.h. von XSCtlMap als nicht verfügbar gemeldet wurden), zu +beeinflussen, werden ignoriert. +
      +
    Rückgabewert: +
    0 bei Erfolg +
    EUNDEV - Ungültiges Device +
      +

    + +
    +
    WORD XSOnCtl(WORD device, UWORD on_mask)
    +
    +

    +
    Die Kontrolleitungen, deren Bit in on_mask gesetzt ist, +aktivieren, ohne die anderen zu beeiflussen. Ansonsten gelten +dieselben Bedingungen, wie bei XSSetCtl. +
      +
    Rückgabewert: +
    0 bei Erfolg +
    EUNDEV - Ungültiges Device +
      +

    + +
    +
    WORD XSOffCtl(WORD device, UWORD off_mask)
    +
    +

    +
    Die Kontrolleitungen, deren Bit in off_mask gesetzt ist, +ausschalten, ohne die anderen zu beeiflussen. Ansonsten gelten +dieselben Bedingungen, wie beiXSSetCtl. +
      +
    Rückgabewert: +
    0 bei Erfolg +
    EUNDEV - Ungültiges Device +
      +

    + +
    +
    LONG XSInStat(WORD device)
    +
    +

    +
    Ermittelt Anzahl der Zeichen, die z.Zt. auf dem Device zum Lesen +verfügbar sind. Der zurückgelieferte Wert muß nicht exakt sein. Es +ist nur garantiert, daß mit dem nächsten Lesezugriff mindestens +soviele Bytes gelesen werden können, es können aber auch mehr sein. +
      +
    Rückgabewert: +
    >=0 - Anzahl der verfügbaren Zeichen +
    EUNDEV - Ungültiges Device +
      +

    + +
    +
    LONG XSOutStat(WORD device)
    +
    +

    +
    Ermittelt Anzahl der Zeichen, die z.Zt. auf das Device geschrieben +werden können. Der zurückgelieferte Wert muß nicht exakt sein. Es +ist nur garantiert, daß mit dem nächsten Schreibzugriff mindestens +soviele Bytes ausgegeben werden können, es können aber auch mehr +sein. +
      +
    Rückgabewert: +
    >=0 - Anzahl der Zeichen, die ausgegeben werden können +
    EUNDEV - Ungültiges Device +
      +

    + +
    +
    LONG XSRead(WORD device, LONG count, BYTE *buffer)
    +
    +

    +
    Maximal count Zeichen in den durch buffer +angegebenen Speicherbereich lesen. Wenn z. Zt. nicht soviele Zeichen +verfügbar sind, kehrt XSRead sofort zurück (non-blocking). +
      +
    Rückgabewert: +
    >=0 - Anzahl der Zeichen, die gelesen wurden +
    EUNDEV - Ungültiges Device +
    Weitere (negative) TOS-Fehlernummern bei I/O-fehlern +
      +

    + +
    +
    LONG XSWrite(WORD device, LONG count, BYTE *buffer)
    +
    +

    +
    count Zeichen aus dem durch buffer angegebenen +Speicherbereich auf das Device schreiben. Wenn z. Zt. nicht so viele +Zeichen geschrieben werden können, kehrt XSWrite sofort zurück +(non-blocking). +
      +
    Rückgabewert: +
    >=0 - Anzahl der Zeichen, die geschrieben wurden +
    EUNDEV - Ungültiges Device +
    Weitere (negative) TOS-Fehlernummern bei I/O-Fehlern +
      +

    + +
    +
    WORD XSFlush(WORD device, WORD mode)
    +
    +

    +
    Verwerfe Zeichen, die noch im Puffer des Treibers stehen. +mode gibt genauer an, was verworfen wird: +
    0: Verwerfe Zeichen, die empfangen, aber noch nicht ausgelesen +wurden +
    1: Verwerfe Zeichen, die geschrieben, aber noch nicht gesendet +wurden +
    2: Verwerfe alle noch gepufferten Zeichen +
      +
    Wenn die Operation auf dem Device nicht möglich ist, wird der +Aufruf ignoriert. +
      +
    Rückgabewert: +
    0 bei Erfolg +
    ERANGE - wenn mode nicht 0, 1 oder 2 ist +
    EUNDEV - Ungültiges Device +
      +

    + +
    +
    WORD XSInSig(WORD device, void (*func)(WORD device))
    +
    +

    +
    Weist den Treiber an, die durch func angegebene Funktion +anzuspringen, sobald ein neues Zeichen von dem Device eingetroffen +ist. Der Routine wird dabei die Device-Nummer auf dem Stack +übergeben. Die angegebene Routine wird sehr wahr- scheinlich aus +einem Interrupt heraus aufgerufen. Dementsprechend darf sie keine +Register verändern und sollte möglichst kurz sein. Die Routine wird +nur genau einmal aufgerufen, danach wird der XSInSig automatisch +wieder deaktiviert. Wenn vor dem Aufruf bereits ein XSInSig aktiv war, +wird der neue nicht installiert und EACCDN zurückgeliefert. +
      +
    Wenn als func ein Null-Zeiger übergeben wird, wird ein +vorher gesetzter XSInSig annuliert. +
      +
    XSInSig muß nicht auf jedem Device verfügbar sein; in diesem +Fall wird EINVFN zurückgeliefert. +
      +
    Rückgabe: +
    0 - bei Erfolg +
    EINVFN - Device unterstützt XSInSig nicht +
    EACCDN - Es ist bereits ein XSInSig aktiv +
    EUNDEV - Ungültiges Device +
      +
    Anmerkung: Diese Funktion ist in der Hauptsache zur +Implementation von MiNT- Treibern gedacht und sollte von +Anwendungsprogrammen nicht verwendet werden. +
      +

    + +
    +
    WORD XSOutSig(WORD device, void (*func)(WORD device))
    +
    +

    +
    Weist den Treiber an, die durch func angegebene Funktion +anzuspringen, sobald ein neues Zeichen auf das Device ausgegeben +werden kann. Die Funktionsweise ist ansonsten analog zu XSInSig. +
      +
    Wenn als func ein Null-Zeiger übergeben wird, wird ein +vorher gesetzter XSOutSig annuliert. +
      +
    XSOutSig muß nicht auf jedem Device verfügbar sein; in diesem +Fall wird EINVFN zurückgeliefert. +
      +
    Rückgabe: +
    0 - bei Erfolg +
    EINVFN - Device unterstützt XSOutSig nicht +
    EACCDN - Es ist bereits ein XSOutSig aktiv +
    EUNDEV - Ungültiges Device +
      +
    Anmerkung: Diese Funktion ist in der Hauptsache zur +Implementation von MiNT- Treibern gedacht und sollte von +Anwendungsprogrammen nicht verwendet werden. +
      +

    + +
    +
    LONG XSCtlSig(WORD device, UWORD ctl_mask, void (*func)(WORD device, UWORD ctl))
    +
    +

    +
    Weist den Treiber an, die durch func angegebene Funktion +anzuspringen, sobald sich der Zustand einer der in ctl_mask +spezifizierten Kontrolleitungen ändert (Kodierung wie bei XSCtlMap +angegeben). Der Routine wird dabei die Device-Nummer und ein +Bitvektor, in dem das Bit der auslösenden Kontrolleitung gesetzt ist, +auf dem Stack übergeben. Die angegebene Routine wird sehr +wahrscheinlich aus einem Interrupt heraus aufgerufen. Dementsprechend +darf sie keine Register verändern und sollte möglichst kurz sein. +Die Routine wird nur genau einmal aufge- rufen, danach wird der +XSCtlSig automatisch wieder deaktiviert. Wenn vor dem Aufruf bereits +ein XSCtlSig aktiv war, wird der neue nicht installiert und EACCDN +zurückgeliefert. +
      +
    Wenn als func ein Null-Zeiger übergeben wird, wird ein +vorher gesetzter XSCtlSig annuliert. +
      +
    XSCtlSig muß nicht auf jedem Device verfügbar sein; in diesem +Fall wird EINVFN zurückgeliefert. Ebenso muß er nicht für alle +verfügbaren Kontrolleitungen verfügbar sein. Wenn in +ctl_mask Kontrolleitungen angegeben werden, die durch XSCtlSig +nicht unterstützt werden, wird das ignoriert. Auf welche Leitungen +tatsächlich reagiert wird, kann man aus dem Rückgabewert ersehen. +
      +
    Sobald ein Device mit XSRelease freigegeben wird, werden noch +darauf installierte XCtlSig automatisch abgemeldet. +
      +
    Rückgabe: +
    >0 (LONG!) - Maske mit den tatsächlich berücksichtigten +Kontrolleitungen. +
    EINVFN - Device unterstützt XSCtlSig nicht +
    EACCDN - Es ist bereits ein XSCtlSig aktiv +
    EUNDEV - Ungültiges Device +
      +
    Anmerkung: Diese Funktion kann z.B. verwendet werden, um +effizient die RI- oder DCD-Leitungen zu überwachen (man installiert +eine Routine, die im eigenen Programm ein Flag setzt und fragt dieses +periodisch ab). ACHTUNG: Ein Programm, daß diese Funktion benutzt, +darf keinesfalls vergessen, den XSCtlSig vor dem Beenden wieder zu +annulieren. +
      +

    + +
    +
    +

    3.7.2.577 Cookie, XSND

    +

    Digi-Sound - per Betriebsystem auf jedem ST/E und TT. +

    +

    Hängt im XBIOS und etv_term +

    +

    3.7.2.578 Cookie, XSSI

    +

    Extended Screen Saver Information +

    +

    Querverweise: XSSI-Protokoll +

    +

    3.7.2.579 Cookie, XTOS

    +

    Extend TOS +

    +

    3.7.2.580 Cookie, xUAG

    +

    Von der Grafikkarte MegaVision300. +

    +

    3.7.2.581 Cookie, xUFC

    +

    Extended Universal Font-Selector Configuration program +

    +

    3.7.2.582 Cookie, XWin

    +

    Extended-Windows-Modul. +

    +

    3.7.2.583 Cookie, zCAC

    +

    680x0 Cache Control CPX +

    +

    3.7.2.584 Cookie, zDCF

    +

    DCF_TIME +

    +

    Das Programm decodiert im Hintergrund die Signale eines +DCF77-Empfängers. +

    +

    Benutzte Vektoren: TRAP #1, TRAP #14, joyvec (Kbdvbase), +Resetvektor (falls Cookie Jar neu installiert). +

    +

    Status: Freeware +

    +

    3.7.2.585 Cookie, _5MS

    +

    On Atari hardware, the 200 Hz system timer is implemented with +the MFP Timer C. Its interrupt vector is located at address 0x114. +

    +

    On non-Atari hardware, the 200 Hz system timer is implemented +differently, and may use a different interrupt vector. In this case, +the _5MS cookie is set with the address of that vector. Then it can be +used by FreeMiNT to hook the system timer on non-Atari hardware. +

    +

    3.7.2.586 Cookie, _AFM

    +

    Audio Fun Machine +

    +

    3.7.2.587 Cookie, _AKP

    +

    Tastatur-Layout und Landessprache +

    +

    Der Cookie informiert über die Landessprache und das +Tastatur-Layout des Systems. Die Bits 0-7 informieren über das Layout +der Tastatur. Es gilt: +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    0=USA
    1=Deutschland
    2=Frankreich
    3=England
    4=Spanien
    5=Italien
    6=Schweden
    7=(französische) Schweiz
    8=(deutsche) Schweiz
    9=Türkei
    10=Finnland
    11=Norwegen
    12=Dänemark
    13=Saudi-Arabien
    14=Niederlande
    15=CSSR
    16=Ungarn
    17=Polen
    18=Litauen
    19=Rusland
    20=Estland
    21=Weißrussland
    22=Ukraine
    23=Slowakei
    24=Rumänien
    25=Bulgarien
    26=Slowenien
    27=Kroatien
    28=Serbien
    29=Montenegro
    30=Mazedonien
    31=Griechenland
    32=Lettland
    33=Israel
    34=Südafrika
    35=Portugal
    36=Belgien
    37=Japan
    38=China
    39=Korea
    40=Vietnam
    41=Indien
    42=Iran
    43=Mongolei
    44=Nepal
    45=Laos
    46=Kambodscha
    47=Indonesien
    48=Bangladesch
    +
    + +

    Die Bits 8-15 identifizieren die Landessprache. Es gilt: +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    0=USA
    1=Deutschland
    2=Frankreich
    3=England
    4=Spanien
    5=Italien
    6=Schweden
    7=(französische) Schweiz
    8=(deutsche) Schweiz
    9=Türkei
    10=Finnland
    11=Norwegen
    12=Dänemark
    13=Saudi-Arabien
    14=Niederlande
    15=CSSR
    16=Ungarn
    17=Polen
    18=Litauen
    19=Rusland
    20=Estland
    21=Weißrussland
    22=Ukraine
    23=Slowakei
    24=Rumänien
    25=Bulgarien
    26=Slowenien
    27=Kroatien
    28=Serbien
    29=Montenegro
    30=Mazedonien
    31=Griechenland
    32=Lettland
    33=Israel
    34=Südafrika
    35=Portugal
    36=Belgien
    37=Japan
    38=China
    39=Korea
    40=Vietnam
    41=Indien
    42=Iran
    43=Mongolei
    44=Nepal
    45=Laos
    46=Kambodscha
    47=Indonesien
    48=Bangladesch
    +
    + +

    Das obere Wort ist für zukünftige Zwecke reserviert. +

    +

    3.7.2.588 Cookie, _CF_

    +

    ColdFire CPU +

    +

    3.7.2.589 Cookie, _CPU

    + + + +

    Prozessortyp +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    0=MC-68000
    10=MC-68010
    20=MC-68020
    30=MC-68030
    40=MC-68040
    60=MC-68060
    +
    + +

    3.7.2.590 Cookie, _DOS

    +

    GEMDOS-Einsprung (im GEMDOS 0.30). +

    +

    3.7.2.591 Cookie, _FDC

    + + + +

    Floppy-Disk-Controller +

    +

    Der Cookie wird normalerweise von Treibersoftware für +Floppycontroller höherer Schreibdichte installiert. Das oberste Byte +gibt über die Art der höchsten Schreibdichte im System Auskunft. Es +gilt: +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    0=normales Floppy-Interface(z.B. 720kByte Disk)
    1=High-Density(HD - 1,44 MByte)
    2=Extra-High-Density(ED - 2,88 MByte)
    >2=reserviert 
    +
    + +

    Die restlichen drei Bytes geben darüber Auskunft, wer den +Cookie gesetzt hat. +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    $000000keine Information
    $415443»ATC«, Atari Corporation
    $445031»DP1«, Dreampark Development, offensichtlich
     ein amerikanischer Hersteller von HD-Erweiterungen
    $4D6163»Mac«, MagiC Mac oder MagiC Mac X
    $4D494C»MIL«, MilanTOS
    +
    + +

    Beim Hades stimmt die Belegung nicht. Hier enthält der int32_t +Wert »hade«. +

    +

    3.7.2.592 Cookie, _FLK

    + +

    File-Locking +

    +

    Der Cookie ist gesetzt, wenn das installierte GEMDOS über +File-Locking-Erweiterungen verfügt. Der Wert des Cookies ist die +Versionsnummer der Erweiterung. +

    +

    3.7.2.593 Cookie, _FPU

    + + + + +

    Typ der FPU +

    +

    Das obere Wort beschreibt den Typ der benutzten FPU. Es gilt: +

    + + + + + + + + + + + + +
    Bit 0: SFP-004 oder kompatible FPU-Karte (68881 als +Peripheriebaustein), falls gesetzt +
      +
    Bit 1..2: 68881 oder 68882 als Koprozessor. Es gilt: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + +
    0=weder - noch
    1=genauer Typ unbekannt
    2=68881
    3=68882
    +
    + +
    Bit 3: FPU im MC-68040 +
      +
    Bit 4: FPU im MC-68060 +
      + +
    + +

    Das untere Wort ist für Informationen über +Softwareunterstützung via Line-F-Trap reserviert und ist z.Zt. noch +nicht benutzt. Laut Atari bedeutet ein Wert ungleich Null, daß +Line-F-Unterstützung vorhanden ist. +

    +

    3.7.2.594 Cookie, _FRB

    + +

    Fast-RAM-Buffer +

    +

    Der Cookie zeigt auf einen 64 Kbyte großen Puffer im ST-RAM der +vom Atari-TT für ACSI-DMA-Transfer benutzt werden kann (das Fast-RAM +des TT kann hierfür nicht benutzt werden). +

    +

    Gerätetreiber für die ACSI-Schnittstelle dürfen diesen Puffer +als temporären Zwischenspeicher für Transfers in das Fast-RAM +nutzen; der Zugriff wird über die Systemvariable flock koordiniert. +

    +

    Wenn dieser Cookie nicht vorhanden ist, verfügt die Maschine +entweder über kein Fast-RAM, oder über keine ACSI-Schnittstelle. +

    +

    3.7.2.595 Cookie, ΣFSC

    +

    Falcon Screen +

    +

    3.7.2.596 Cookie, _FSR

    +

    FLCNSER 1.0 - Patchprogramm für Fehler in den +TOS-Routinen für die seriellen Schnittstellen (benötigt für +TOS 4.00...TOS 4.04). +

    +

    3.7.2.597 Cookie, _IDT

    +

    Formatierung von Datum und Zeit +

    +

    Der Cookie gibt Aufschluß über die Formatierung von Datum und +Zeit innerhalb des Systems. Die Bits 0-7 enthalten den ASCII-Wert des +Zeichens, das als Trenner für die Datumsangaben dienen soll, wenn 0 +wird "/" genommen. +

    +

    Die Bits 8-11 beschreiben die Formatierung des Datums. Es gilt: +

    +

    0 = Format "MM-DD-YY"  (Monat, Tag, Jahr) +
    1 = Format "DD-MM-YY"  (Tag, Monat, Jahr) +
    2 = Format "YY-MM-DD"  (Jahr, Monat, Tag) +
    3 = Format "YY-DD-MM"  (Jahr, Tag, Monat) +

    +

    In den Bits 12-15 ist das Zeitformat codiert. Es gilt: +

    +

    0 = 12-Stunden Darstellung +
    1 = 24-Stunden Darstellung +

    +

    Das obere Wort ist für zukünftige Zwecke reserviert. +

    +

    3.7.2.598 Cookie, _INF

    + + +

    STEFIX-Patchprogramm +

    +

    Der Cookie wird vom Patchprogramm STEFIX angelegt, welches +einige Fehler im Desktop von TOS 1.06 behebt. In der von Karsten +Isakovic modifizierten Version mit XBRA. +

    +

    3.7.2.599 Cookie, _INU

    +

    Format for numbers +

    +

    3.7.2.600 Cookie, _ISO

    +

    Specifies the real keyboard/font nationality +

    +

    0 = default/undefiniert 1 = ISO-8859-1 (Latin-1) +Westeuropäisch(!nl) 2 = ISO-8859-2 (Latin-2) Mitteleuropäisch(!nl) 3 += ISO-8859-3 (Latin-3) Südeuropäisch(!nl) x = ISO-8859-x +

    +

    3.7.2.601 Cookie, _JPD

    +

    JPEG-Dekodierer mit DSP-Unterstützung +

    +

    Der Cookie zeigt die Verfügbarkeit eines JPEG-Dekodierers der +Firmen Brainstorm/Atari an, der sich die Möglichkeiten des Digitalen +Signalprozessors (DSP) zunutze macht. +

    +

    3.7.2.602 Cookie, _MCF

    +

    ColdFire features +

    +
    typedef struct {
    +  int8_t magic[3];           /* Magic number 0x4d4346 (MCF), identifies this struct */
    +  uint8_t  version;          /* This struct version                                 */
    +  int8_t   device_name[16];  /* Device identification number, null terminated       */
    +  int8_t   core;             /* ColdFire core version number                        */
    +  int8_t   revision;         /* Processor revision number                           */
    +  uint32_t units;            /* Bit mask. b0: MAC, b1: DIV, b2: EMAC, b3: FPU, b4: MMU */
    +  int8_t   isa;              /* Instruction-Set Architecture (ISA) revision level   */
    +  int8_t   debug;            /* Debug module revision                               */
    +  int16_t  sysbus_frequency; /* System bus frequency in Mhz                         */
    +} MCF_COOKIE;
    +
    +

    Values defined taken from ColdFire Family Programmer's Reference +Manual (CFPRM). Section 1.10 Hardware Configuration Information. +

    + + + + + + + + + + + + + + + +
    device_name Is the "device identification number" as specified in +the different families reference manuals, in sections describing the +registers SDID, CIR, DEVICEID or JTAGID (depending on the CF family). +For example: MCF5474, MCF5485, MCF54455, etc ... +
      +
    core ColdFire core version +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    unknown-1
    MCF_V11
    MCF_V22
    MCF_V33
    MCF_V44
    MCF_V55
    +
    + +
    units Bit mask for units, set when present +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    unknown0
    MCF_UNITS_MAC1
    MCF_UNITS_DIV2
    MCF_UNITS_EMAC4
    MCF_UNITS_FPU8
    MCF_UNITS_MMU16
    +
    + +
    isa Instruction-Set Architecture (ISA) revision level +
      +

    +
    + + + + + + + + + + + + + + + + + + + + +
    unknown-1
    MCF_ISA_A0
    MCF_ISA_B1
    MCF_ISA_C2
    MCF_ISA_A_PLUS8
    +
    + +
    debug Debug module revision number +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    unknown-1
    MCF_DEBUG_A0
    MCF_DEBUG_B1
    MCF_DEBUG_C2
    MCF_DEBUG_D3
    MCF_DEBUG_E4
    MCF_DEBUG_B_PLUS9
    MCF_DEBUG_D_PLUS11
    MCF_DEBUG_D_PLUS_PST15
    +
    + + +
    + +

    3.7.2.603 Cookie, _MCH

    + + + +

    Maschinentyp +

    +

    Das obere Wort beschreibt die Rechnerfamilie, das Untere dient +für feinere Unterscheidungen. +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OberesUnteresRechner
    0x00000x0000Atari ST (260 ST,520 ST,1040 ST,Mega ST,...)
    0x00000x4D34Medusa T40 without SCSI
    0x00010x0000Atari STE (1040 STE, ST Book, STylus/STPad)
    0x00010x0010Mega STE
    0x00010x0100Sparrow (Falcon pre-production machine)
    0x00020x0000Atari TT or Hades
    0x00020x4D34Medusa T40 with SCSI
    0x00030x0000Atari-Falcon030
    0x00040x0000Milan
    0x00050x0000ARAnyM >=v0.8.5beta
    +
    + +

    Das untere Wort dient für feinere Unterscheidungen, und ist +z.Zt. nur für die STE-Modelle definiert. Es gilt: +

    +

    0x001 = ST Book oder STylus +
    0x002 = ST Book +
    0x003 = STylus +
    0x008 = STE mit IDE-Hardware +
    +

    +

    Ist der Wert -1, dann handelt es sich um nicht-ST-kompatible +Hardware. In diesem Fall haben alle Hardware-Zugriffe zu unterbleiben. +

    +

    3.7.2.604 Cookie, _MET

    +

    MetaDOS +

    +

    Der Cookie ist genau dann vorhanden, wenn die +Betriebssystemerweiterung MetaDOS (ab Version 2.2) installiert ist. +

    +

    3.7.2.605 Cookie, _MIL

    +

    Milan Computer +

    +

    3.7.2.606 Cookie, _NET

    + +

    Netzwerkerweiterungen für GEMDOS +

    +

    Der Cookie dient als Flag für etwaige Netzwerkerweiterungen. +Der Wert ist ein Zeiger auf zwei LONG-Werte. Der erste enthält eine +Herstellerkennung für das Netzwerk, der zweite die vom Hersteller +vergebene Versionsnummer. +

    + +
    struct netinfo
    +{
    +  int32_t publisher_id;      /* Special code for publisher to assigned */
    +                             /* by ATARI (USA)                         */
    +                             /* Usually a four-byte ASCII string       */
    +  int32_t version;           /* Version number of the network          */
    +};
    +
    +

    Als Herstellerkennung gibt es bis jetzt: +
    +

    +
    + + + + + + + + + + + + +
    Application Design Software"A&D\0"
    Pams Software"PAMS"
    Itos Software"ITOS"
    +
    + +

    3.7.2.607 Cookie, _OOL

    + + +

    POOLFIX3-Patchprogramm +

    +

    Der Cookie wird vom Patchprogramm POOLFIX3 angelegt, welches +einige Fehler in GEMDOS-Version 0.15 behebt. +

    +

    3.7.2.608 Cookie, _PCI

    +

    PCI-BIOS +

    +

    Stellt Funktionen zur Konfiguration und Initialisierung von +PCI-Karten über eine Sprungtabelle zur Verfügung (für alle +ATARI-kompatiblen mit PCI-Bus). +

    +

    Vektoren: keine verbogenen Vektoren. +

    +

    Copyright: Freeware +

    +

    Querverweis: PCI-BIOS   Cookie XPCI +

    +

    3.7.2.609 Cookie, _PKT

    +

    Packet Driver +

    +

    3.7.2.610 Cookie, _PWR

    +

    Power management unit +

    +

    3.7.2.611 Cookie, _SLM

    + +

    Diablo-Treiber für SLM-Laserdrucker +

    +

    Der Cookie wird vom Diablo-Treiber (ab Version 1.4) der +SLM-Laserdrucker gesetzt. Der Wert des Cookies zeigt auf eine +nicht dokumentierte Struktur. +

    +

    3.7.2.612 Cookie, _SND

    + + +

    Soundhardware +

    +

    Bittabelle, die die vorhandenen Soundmöglichkeiten beschreibt. +Es gilt: +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Bit 0=GI/Yamaha Sound-Chip
    Bit 1=Stereo-DMA-Sound (wie bei STE und TT)
    Bit 2=CODEC
    Bit 3=Digitaler Signalprozessor (DSP)
    Bit 4=Multiplexer
    Bit 5=erweiterte XBIOS-Routinen (Milan, GSXB)
    +
    + +

    Alle anderen Bits sind für zukünftige Zwecke reserviert. +

    +

    Das MilanBlaster XBIOS setzt die Bit Nr. 2 und Nr. 5 +(0x00000024l). +

    +

    3.7.2.613 Cookie, _SWI

    + +

    DIP-Switches +

    +

    Die oberen 24 Bit sind z.Zt. unbelegt. Für die unteren 8 Bit +gilt folgende Belegung: +

    +

    Bit 6 = 720 Kbyte bzw. 1,44 Mbyte Diskettenlaufwerk +
    Bit 7 = Stereo bzw. Mono System +

    +

    Die restlichen der unteren 8 Bits sind z.Zt. ebenfalls nicht +belegt. +

    +

    3.7.2.614 Cookie, _T2W

    +

    TOS2WIN Emulator +

    +

    3.7.2.615 Cookie, _T30

    +

    KAOS TOS +

    +

    3.7.2.616 Cookie, _USB

    +

    USB Treiber +

    +

    3.7.2.617 Cookie, _VDI

    +

    Milan VDI +

    +
    typedef struct
    +{
    +   int16_t Version;   /* Versionsnummer (0x100 für 1.00) */
    +   int32_t Subcookie;
    +   int32_t Driverflags;
    +   int32_t Dispatcheraddress;
    +} _VDI_Structure;
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    DriverflagsBitnummern
    HARD_SOLIDRECT0
    HARD_PATTERNRECT1
    HARD_SOLIDHLINE2
    HARD_PATTERNHLINE3
    HARD_SOLIDVLINE4
    HARD_PATTERNVLINE5
    HARD_BITBLT6
    HARD_TBITBLT7
    HARD_SOLIDABLINE8
    HARD_PATTERNABLINE9
    HARD_QUICKTXT16
    HARD_QUICKBIOS17
    +
    + +

    Dispatcher Funktionen: +

    +
    + + + + + + + + + + + + + + + +
    DRIVER_ACCEL1Grafikbeschleuniger (graphic accelerator)
    DRIVER_DEVICE2graphic device routines
    DRIVER_BIOS3BIOS/XBIOS routines
    +
    + +

    Grafikbeschleuniger Funktionen: +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    DRAW_SOLIDRECT$00010000Füllt einen Rechteckbereich mit einer Farbe
    DRAW_PATTERNRECT$00020000Füllt einen Rechteckbereich mit einem monochromen Pattern
    DRAW_SOLIDHLINE$00030000 
    DRAW_PATTERNHLINE$00040000 
    DRAW_SOLIDVLINE$00050000 
    DRAW_PATTERNVLINE$00060000 
    DRAW_BITBLT$00070000 
    DRAW_TBITBLT$00080000 
    DRAW_SOLIDABLINE$00090000 
    DRAW_PATTERNABLINE$000A0000 
    DRAW_QUICKTXT$00100000 
    DRAW_QUICKBIOS$00110000 
    +
    + +

    DRAW_SOLIDRECT +
    Aufruf: a0 = solidrectdata, a1: Struktur von LineA +

    +

    DRAW_PATTERNRECT +
    Aufruf: a0 = patternrectdata, a1: Struktur von LineA +

    +

    Graphic device routines: +

    +
    + + + + + + + + + + + + + + + +
    DEVICE_GETDEVICELIST$00010000 
    DEVICE_GETDEVICE$00020000 
    DEVICE_SETDEVICE$00030000 
    +
    + +

    BIOS/XBIOS Funktionen +

    +
    + + + + + +
    BIOS_PHYSBASE$00010000Returns physical screen address
    +
    + +

    3.7.2.618 Cookie, _VDO

    + + +

    Videohardware +

    +

    Das obere Wort wird für die grobe Klassifizierung benutzt. Es +gilt: +

    + + + + + + + + + + + + + + + + + + +
    -1 = nicht-ST-kompatible Hardware. In diesem Fall haben alle +Hardware-Zugriffe zu unterbleiben. +
     0 = Atari ST (260 ST, 520 ST, 1040 ST, Mega ST, ...) +
     1 = Atari STE (1040 STE, Mega STE, ST Book) +
     2 = Atari TT +
     3 = Atari Falcon030 +
     4 = Milan + +
    + +

    Das untere Wort ist für feinere Unterscheidungen reserviert. +

    +

    3.7.2.619 Cookie, __NF

    +

    Native features proposal +

    +
    + +Home +BIOSBIOS +BIOS FehlermeldungenBIOS Fehlermeldungen +VT-52-TerminalVT-52-Terminal + + diff --git a/de/bios_errors.html b/de/bios_errors.html new file mode 100644 index 000000000..457fa0b38 --- /dev/null +++ b/de/bios_errors.html @@ -0,0 +1,197 @@ + + + + + +Die Anleitung zum TOS: BIOS Fehlermeldungen + + + + + + + + + +Home +BIOSBIOS +Die SystemvektorenDie Systemvektoren +Cookie-JarCookie-Jar + +
    + +

    3.6 BIOS Fehlermeldungen

    +

    Fehler werden von BIOS und XBIOS als negative Werte gemeldet. +Die folgende Liste enthält alle bekannten Fehlermeldungen: +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Nr.BezeichnungBedeutung
    0E_OKOk. Kein Fehler aufgetreten.
    -1ERRORFehler (nicht genau zu spezifizieren)
    -2EDRVNRAngesprochenes Gerät nicht funktionsbereit.
    -3EUNCMDDas angegebene Kommando ist nicht bekannt.
    -4E_CRCFehler beim Lesen eines Sektors.
    -5EBADRQGerät kann das Kommando nicht ausführen.
    -6E_SEEKTrack konnte vom Laufwerk nicht erreicht werden.
    -7EMEDIALesefehler (Medium hat unkorrekten Bootsektor).
    -8ESECNFSektor wurde nicht gefunden.
    -9EPAPERDrucker ist nicht betriebsbereit.
    -10EWRITFFehler bei einer Schreiboperation.
    -11EREADFFehler bei einer Leseoperation.
    -12EGENRLAllgemeiner Fehler.
    -13EWRPROMedium ist schreibgeschützt.
    -14E_CHNGMedium wurde nach Schreiboperation gewechselt.
    -15EUNDEVGerät ist dem Betriebssystem unbekannt.
    -16EBADSFDefekte Sektoren beim Formatieren entdeckt.
    -17EOTHEREine andere Diskette muß eingelegt werden. Dieser
      Fehler tritt nur auf, wenn Laufwerk B: angesprochen
      wird, ohne angeschlossen zu sein. In diesem Fall
      wird der Benutzer aufgefordert, die Diskette in das
      erste Laufwerk einzufügen.
    -18EINSERTMetaDOS-Fehler: Medium einlegen
    -19EDVNRSPMetaDOS-Fehler: Gerät antwortet nicht.
    -128SNDNOTLOCKFalcon-XBIOS: Sound-System nicht reserviert.
    -129SNDLOCKEDFalcon-XBIOS: Sound-System bereits reserviert.
    +
    + +

    Querverweis: Fehlermeldungen in MagiC   GEMDOS-Fehlermeldungen +

    +
    + +Home +BIOSBIOS +Die SystemvektorenDie Systemvektoren +Cookie-JarCookie-Jar + + diff --git a/de/bios_functions.html b/de/bios_functions.html new file mode 100644 index 000000000..dc4faeed3 --- /dev/null +++ b/de/bios_functions.html @@ -0,0 +1,300 @@ + + + + + +Die Anleitung zum TOS: BIOS-Funktionsliste + + + + + + + + + +Home +BIOSBIOS +BSIM-BIOS-ErweiterungenBSIM-BIOS-Erweiterungen +BIOS StrukturenBIOS Strukturen + +
    + +

    3.11 BIOS-Funktionsliste

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    dezhexFunktionsnamevorhanden
    00x00GetmpbTOS
    10x01BconstatTOS
    20x02BconinTOS
    30x03BconoutTOS
    40x04RwabsTOS
    50x05SetexcTOS
    60x06TickcalTOS
    70x07GetbpbTOS
    80x08BcostatTOS
    90x09MediachTOS
    100x0ADrvmapTOS
    110x0BKbshiftTOS
    120x0CMessageLantech LAN von Lantech Systems
    120x0CWrite_ASCxVT52; ST-Computer 1988-04
    120x0CLrwabs?, keine Information
    160x10ScResetDOLMEN, SCSI Funktion
    170x11??DIAB630?
    170x11date_timePC GEMDOS, interne BIOS Funktion
        EmuTOS bis Version 0.7
    170x11ScGetDOLMEN, SCSI Funktion
    180x12ScSelectDOLMEN, SCSI Funktion
    190x13ScCmdDOLMEN, SCSI Funktion
    200x14ScCompleteDOLMEN, SCSI Funktion
    210x15ScReadDOLMEN, SCSI Funktion
    220x16ScWriteDOLMEN, SCSI Funktion
    230x17ScReadDmaDOLMEN, SCSI Funktion
    240x18ScWriteDmaDOLMEN, SCSI Funktion
    250x19ScReadBackDOLMEN, SCSI Funktion
    260x1AScWriteBackDOLMEN, SCSI Funktion
    270x1BScStatDOLMEN, SCSI Funktion
    280x1CScSelAtnDOLMEN, SCSI Funktion
    290x1DScMsgInDOLMEN, SCSI Funktion
    300x1EscMsgOutDOLMEN, SCSI Funktion
    320x20AtaResetDOLMEN, IDE Funktion
    1210x79VT_DRVVideotext-Decoder (Print-Technik)
    1320x84BforceST-Computer 1991-07, Seite 78 ff.
    3000x12cbsim_idDrive B Simulator
    3010x12dload_diskDrive B Simulator
    3020x12ekill_diskDrive B Simulator
    3030x12fsave_diskDrive B Simulator
    3040x130drv_changeDrive B Simulator
    3050x131drvprotecDrive B Simulator
    3060x132dstateDrive B Simulator
    +
    + +
    + +Home +BIOSBIOS +BSIM-BIOS-ErweiterungenBSIM-BIOS-Erweiterungen +BIOS StrukturenBIOS Strukturen + + diff --git a/de/bios_main.html b/de/bios_main.html new file mode 100644 index 000000000..b8bc7ee4f --- /dev/null +++ b/de/bios_main.html @@ -0,0 +1,48 @@ + + + + + +Die Anleitung zum TOS: BIOS + + + + + + + + + +Home +Inhaltsverzeichnis +GEMGEM +Das BIOSDas BIOS + +
    + +

    3 BIOS

    + +
    +
    + +Home +Inhaltsverzeichnis +GEMGEM +Das BIOSDas BIOS + + diff --git a/de/bios_resvector.html b/de/bios_resvector.html new file mode 100644 index 000000000..777ce8841 --- /dev/null +++ b/de/bios_resvector.html @@ -0,0 +1,80 @@ + + + + + +Die Anleitung zum TOS: Einklinken in den Reset-Vektor + + + + + + + + + +Home +BIOSBIOS +Die Ein-/Ausgabekanäle des BIOSDie Ein-/Ausgabekanäle des BIOS +Die SystemvariablenDie Systemvariablen + +
    + +

    3.3 Einklinken in den Reset-Vektor

    + +

    Das Kochrezept, um eigene Funktionen in den Reset-Vektor +einklinken zu können, lautet wie folgt: +

    +
      +
    • Die Systemvariable resvalid auf den Wert 0x31415926 setzen, +denn anderenfalls wird resvector vom BIOS gar nicht beachtet. +
        +

    • +
    • Adresse der eigenen Funktion in den resvector-Vektor schreiben. +
        +

    • +
    • Per jmp(a6) aus der Funktion zurückspringen. +
        +

    • +
    + +

    Wichtig: Ein Rücksprung per rts aus der installierten +Funktion ist nicht möglich, da zu diesem Zeitpunkt noch kein +Stack initialisiert ist. In der Praxis könnte man z.B. so vorgehen: +

    +
    RESMAGIC    equ       $31415926
    +_resvalid   equ       $426
    +_resvector  equ       $42a
    +
    +            .text
    +install:    move.l    _resvalid,oldvalid
    +            move.l    #RESMAGIC,resvalid
    +            move.l    _resvector,oldreset
    +            move.l    #newreset,_resvector
    +            rts
    +
    +            dc.b      "XBRARESV"
    +oldreset:   dc.l      0
    +
    +newreset:   move.l    oldreset,_resvector
    +            move.l    oldvalid,_resvalid
    +            jmp       (a6)
    +
    +            .bss
    +oldvalid:   .ds.l     1
    +
    +

    Achtung: Damit sich mehrere Programme installieren +können, muß nach Abarbeitung der Funktion eine saubere +De-Installation erfolgen. +

    +

    Querverweis: Systemvariablen   Systemvektoren   XBRA-Verfahren +

    +
    + +Home +BIOSBIOS +Die Ein-/Ausgabekanäle des BIOSDie Ein-/Ausgabekanäle des BIOS +Die SystemvariablenDie Systemvariablen + + diff --git a/de/bios_structures.html b/de/bios_structures.html new file mode 100644 index 000000000..c866bc51d --- /dev/null +++ b/de/bios_structures.html @@ -0,0 +1,226 @@ + + + + + +Die Anleitung zum TOS: BIOS Strukturen + + + + + + + + + +Home +BIOSBIOS +BIOS-FunktionslisteBIOS-Funktionsliste +XBIOSXBIOS + +
    + +

    3.12 BIOS Strukturen

    + +
    +

    3.12.1 BPB

    +
    typedef struct
    +{
    +  WORD   recsiz;       /* Bytes pro Sektor                    */
    +  WORD   clsiz;        /* Sektoren pro Cluster                */
    +  WORD   clsizb;       /* Bytes pro Cluster                   */
    +  WORD   rdlen;        /* Verzeichnislänge                    */
    +  WORD   fsiz;         /* Länge der FAT in Sektoren           */
    +  WORD   fatrec;       /* Start der 2. FAT                    */
    +  WORD   datrec;       /* 1. freier Sektor                    */
    +  WORD   numcl;        /* Gesamtzahl an Cluster               */
    +  WORD   bflags;       /* Flags als Bitvektor                 */
    +                       /* Bit 0: 0 (12-Bit-FAT), 1 16-Bit-FAT */
    +                       /* Bit 1: 0 (zwei FATs), 1 (eine FAT)  */
    +                       /*        erst ab TOS 2.06 verfügbar   */
    +} BPB ;
    +
    +

    Querverweis: Getbpb +

    +

    3.12.2 MD

    +
    typedef struct
    +{
    +     MD *m_link;         /* next MD (or NULL)          */
    +     long m_start;       /* saddr of block             */
    +     long m_length;      /* # bytes in block           */
    +     PD *m_own;          /* owner's process descriptor */
    +} MD;
    +
    +
    +

    Querverweis: BIOS   Getmpb   MPB +

    +

    3.12.3 MPB

    +
    typedef struct
    +{
    +    MD *mp_mfl;      /* Liste des freien Speicher   */
    +    MD *mp_mal;      /* Liste des belegten Speicher */
    +    MD *mp_rover;    /* verschiebbarer Zeiger       */
    +} MPB;
    +
    +
    +

    Querverweis: BIOS   Getmpb +

    +

    3.12.4 patternrectdata

    +
    struct patternrectdata
    +{
    +  int16_t x1, y1;
    +  int16_t x2, y2;
    +  int32_t fg_color;
    +  int32_t bg_color;
    +  int16_t mode;
    +  int32_t *pattern;
    +  int32_t *patternmask;
    +}
    +
    +

    Querverweis: _VDI +

    +

    3.12.5 PUN_INFO

    +

    Diese Struktur ist wie folgt definiert: +

    +
    typedef struct
    +{
    +    WORD puns;               /* Anzahl der Geräte               */
    +    BYTE pun[16];            /* diverse Flags                   */
    +    LONG part_start[16];     /* Partitionsanfänge               */
    +    LONG P_cookie;           /* muss "AHDI" sein                */
    +    LONG *P_cookptr;         /* zeigt auf das vorherige Element */
    +    UWORD P_version;         /* Versionsnummer (>= 0x0300)      */
    +    UWORD P_max_sector;      /* maximale Sektorgröße            */
    +    LONG  reserved[16];      /* reserviert                      */
    +} PUN_INFO;
    +
    + + + + + + + + + + + + + + + + + + + + + +
    puns Enthält die Anzahl vom Hard-Disk-Treiber gefundenen +Festplatten. Mit zwei Dummyeinträgen (0xFF) für die Laufwerke A und +B. +
      +
    pun +
      + + + + + + + + + + + + + + + + + + +
    Bit 0..2: Gerätenummer der Festplatte. +
      +
    Bit 3: Bei gesetzem Bit handelt es sich um ein Gerät an der +SCSI-Schnittstelle (sonst: ACSI): Diese Bit ist zwar noch nicht +offiziell dokumentiert, kann aber wohl ohne Vorbehalt benutzt werden. +
      +
    Bit 4: Falcon IDE +
      +
    Bit 5: USB +
      +
    Bit 6: Wechselmedien +
      +
    Bit 7: Wenn dieses Bit gesetzt ist, dann wird das BIOS-Gerät nicht +vom Plattentreiber verwaltet (gilt beispielsweise für die beiden +Diskettenlaufwerke auf den Gerätenummern 0 und 1) +
      + +
    + +
    part_start Enthält für jede (unterstützte) Gerätenummer die Nummer des +Startsektors auf der betreffenden Festplatte. Wieder mit zwei +Dummyeinträge (0L) für Laufwerk A und B. +
      +
    P_cookie Magic-Wert; immer "AHDI" +
      +
    P_cookptr Sollte immer auf das vorherige Strukrurelement zeigen. +
      +
    P_version Versionsnummer z.B. 0x0300 +
      +
    P_max_sector Beschreibt die größte auftretbare Blockgröße für +BIOS-Sektoren. +
      + +
    + +

    Beispiel wie man die Adresse der Struktur bekommt: +

    +
    PUN_INFO *GetPunPtr (void)
    +{
    +  PUN_INFO *P;
    +  int32_t oldstack;
    +
    +  oldstack = Super (0L);
    +  P = *((PUN_INFO **)(0x516L));
    +  Super ((void *)oldstack);
    +
    +  if (P)
    +    if (P->P_cookptr == &(P->P_cookie)) /* Cookie ok? */
    +      if (P->P_version >= 0x300)
    +        return P;
    +
    +  return 0L;
    +}
    +
    +

    Querverweis: XHDI-Spezifikation   pun_ptr +

    +

    3.12.6 solidrectdata

    +
    struct solidrectdata
    +{
    +  int16_t x1, y1;
    +  int16_t x2, y2;
    +  int32_t fg_color;
    +  int32_t bg_color;
    +  int16_t mode;
    +}
    +
    +

    Querverweis: _VDI +

    +
    + +Home +BIOSBIOS +BIOS-FunktionslisteBIOS-Funktionsliste +XBIOSXBIOS + + diff --git a/de/bios_sysvars.html b/de/bios_sysvars.html new file mode 100644 index 000000000..3b0258478 --- /dev/null +++ b/de/bios_sysvars.html @@ -0,0 +1,1225 @@ + + + + + +Die Anleitung zum TOS: Die Systemvariablen + + + + + + + + + +Home +BIOSBIOS +Einklinken in den Reset-VektorEinklinken in den Reset-Vektor +Die SystemvektorenDie Systemvektoren + +
    + +

    3.4 Die Systemvariablen

    +

    Da die Systemvariablen und -vektoren die unterste Schicht des +Betriebssystems darstellen, sollten Anwenderprogramme nur wenn +unbedingt notwendig auf diese zugreifen. Konkret: +

    +
      +
    • keine Systemvariablen verändern, die nicht verändert werden +dürfen. +
    • +
    • keine Systemvariablen benutzen, wenn statt dessen auch eine +Funktion des Betriebssystems aufgerufen werden könnte (Beispiel: +Mfpint). +
    • +
    + +

    Die folgende Liste enthält alle Systemvariablen des TOS: +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Variable     Adresse Beschreibung +
      + + + +
    _autopath    LONG 0x4ca Zeiger auf Zugriffspfad für den AUTO-Ordner (unbenutzt und +nicht offiziell dokumentiert). +
      + + + +
    _bootdev     WORD 0x446 enthält normalerweise die Nummer des Laufwerks, von dem +gebootet worden ist. Außerdem wird diese Variable noch beim Booten +benutzt, um das Bootlaufwerk zu wählen (das klappt i.a. aber nur +dann, wenn kein Festplattentreiber gebootet wird). Wenn man also die +Variable auf 1 setzt, keine autobootfähige Festplatte angeschlossen +hat und einen Reset auslöst, wird von Laufwerk B gebootet! +
      + + + + +
    _bufl        LONG 0x4b2 zwei Zeiger auf GEMDOS-Pufferlisten. +
      + + + +
    _cmdload     WORD 0x482 wenn dieses Register nicht 0 ist, wird versucht, anstelle von +GEM das Programm COMMAND.PRG zu starten. Das Register kann durch ein +Programm in einem ausführbaren Bootsektor gesetzt werden. +
      + + +
    _dskbufp     LONG 0x4c6 Zeiger auf einen 1024 Bytes großen Puffer zum Lesen und +Schreiben auf Disketten oder Festplatten (z.B. beim Bootversuch). Der +Zeiger wird auch vom VDI benutzt. +
      + + + +
    _drvbits     LONG 0x4c2 Bit-Tabelle über die angemeldeten Laufwerke des BIOS. Es +gilt: +
      +
    Bit-0 = Laufwerk A +
    Bit-1 = Laufwerk B +
    Bit-2 = Laufwerk C (usw.) +
      +
    Die Variable wird in TOS 1.00 beim Reset nicht gelöscht. +Eigene Treiber sollten daher bei einem Reset die selbst eingetragenen +Bits löschen; anderenfalls kann es passieren, daß Laufwerkskennungen +plötzlich "verschwinden". +
      + + +
    _frclock     LONG 0x466 analog _vbclock, mit dem Unterschied, daß die Zählung nicht +durch vblsem angehalten wird. +
      + + + + + +
    _fverify     WORD 0x444 legt fest, ob das BIOS beim Schreiben auf Disketten per Rwabs +einen Verify durchführen soll, oder nicht. Dabei gilt: +
      +
    0 = kein Verify +
      +
    Im Normalfall ist das Verify eingeschaltet. +
      + + +
    _hz_200      LONG 0x4ba bisherige Anzahl der 200-Hz Interrupts. +
      + + + + +
    _longframe   WORD 0x59e Wenn dieses Flag nicht null ist, dann ist eine CPU mit +langen Stackframes (also kein 68000er) installiert. Dieser +Wert ist z.B. dann von Interesse, wenn eine Routine in einen +Exception-Vektor eingeklinkt werden soll, und die zu untersuchenden +Werte auf dem Stack übergeben werden. Falls diese Variable den Wert 0 +besitzt findet man die Parameter bei Offset 6, anderenfalls +bei Offset 8. +
      + + +
    _md          LONG 0x49e offiziell nicht dokumentiert, und wohl auch unbenutzt. +
      + + +
    _membot      LONG 0x432 Unteres Ende des unter GEMDOS freien ST-kompatiblen Speichers +(also der Anfang der ursprünglichen TPA). Die Variable wird von der +BIOS-Funktion Getmpb verwendet. +
      + + +
    _memtop      LONG 0x436 Analog zu _membot das Ende des freien ST-kompatiblen +Speicherbereiches. +
      + + + +
    _nflops      WORD 0x4a6 Zahl der angeschlossenen Diskettenlaufwerke +
      + + +
    _p_cookies   LONG 0x5a0 Zeiger auf den Cookie-Jar. +
      + + +
    _prtabt      WORD 0x4f0 Flag für Abbruch des Druckvorgangs. Es ist jedoch ungenutzt. +
      + + +
    _shell_p     LONG 0x4f6 Dieser Zeiger wird vom ROM nicht genutzt, d.h. Programme die +ihn selbst benutzen, müssen ihn im Falle eines Resets und bei +Programm-Ende selbst löschen. Normalerweise wird _shell_p von +UNIX-ählichen Shells gesetzt, und zeigt auf eine Routine, die eine +Kommandozeile abarbeitet. Die Adresse der Zeichenkette wird auf dem +Stack (4(sp)) übergeben, das Ergebnis der Operation erhält man in +Register D0. +
      + + +
    _sysbase     LONG 0x4f2 zeigt auf eine OSHEADER-Struktur. +
      + + +
    _timr_ms     WORD 0x442 Zeit in Millisekunden, die normalerweise zwischen zwei Aufrufen +des System-Timers vergeht. Dieser Wert wird auch von der +BIOS-Funktion Tickcal zurückgeliefert. +
      + + + +
    _v_bas_ad    LONG 0x44e Zeiger auf den Anfang des Bildschirmspeicher, der beim ST auf +einer 256-Byte-Grenze beginnen muss. Beim STE und TT ist es eine 2- +bzw. 8-Byte Grenze. Diese Varibale wird von von Logbase +zurückgeliefert. +
      + + + +
    _vbl_list    LONG 0x4ce ursprüngliche Liste der Vertical-Blank Routinen. Man sollte +immer nur über _vblqueue zugreifen. +
      + + + +
    _vbclock     LONG 0x462 Anzahl der erfolgten Vertical-Blanks. +
      + + +
    _vblqueue    LONG 0x456 Zeiger auf Zeigertabelle für Vertical-Blank-Prozesse. +
      + + +
    bell_hook    LONG 0x5ac Zeiger auf eine Routine zur Ausgabe des Ping-Geräusches. Das +BIOS sorgt selbsttätig für die Abfrage des Flags in con_term und +ruft diese Routine nur dann auf, wenn das Geräusch wirklich erklingen +soll. Die Routine wird im Supervisor-Modus aufgerufen per RTS +abgeschlossen, und darf die Register D0-D2 und A0-A2 verändern. Auch +BIOS Aufrufe vom "innern" der Routine aus sind erlaubt. +(ab TOS 1.06, ab KAOS 1.4.2) +
      + + +
    colorptr     LONG 0x45a Zeiger auf eine Farbpalette, die beim nächsten Vertical-Blank +in die ST-Hardware Farbregister geladen wird (ab Adresse 0xffff8240). +Damit wird ein unschönes Zucken auf dem Bildschirm vermieden. Steht +in colorptr eine Null, so passiert nichts. Nach Übertragung der +Farbwerte wird der Zeiger gelöscht. +
      + + +
    con_state    LONG 0x4a8 interner Zeiger für Bildschirm-Ausgaberoutinen (offiziell +nicht dokumentiert). +
      + + + +
    conterm      BYTE 0x484 Attribut-Bits für das BIOS-Gerät "CON:". Es gilt: +
      + + + + + + + + + + + + +
    Bit-0 = Tastenklick ein/aus +
    Bit-1 = Tastenwiederholung ein/aus +
    Bit-2 = Glocke bei Ausgabe von CTRL-G +
    Bit-3 = bei Bconin den aktuellen Wert von Kbshift in den Bits 24..31 +zurückgeben. + +
    + + + +
    criticret    LONG 0x48a offiziell nicht dokumentiert, und auch wohl unbenutzt. +
      + + +
    defshiftmd   BYTE 0x44a Standard-Farbgrafik-Auflösung. Schaltet der Computer auf +Farbbetrieb um (nach einem Reset, durch Wechseln der Stecker oder +durch Einschalten), wird in die angegebene Auflösung geschaltet. +
      + + + +
    end_os       LONG 0x4fa Zeiger auf das erste, nicht für TOS-interne Variablen benutzte +Byte (also das erste Byte des freien Speichers). +
      + + +
    etv_critic   LONG 0x404 logischer GEMDOS-Vektor 257. Sollte immer nur per Setexc +gesetzt werden. +
      + + +
    etv_term     LONG 0x408 logischer GEMDOS-Vektor 258. Sollte immer nur per Setexc +gesetzt werden. Programme, die sich in irgendwelche Systemvektoren hängen, +sollten sich auch in diesen Vektor einklinken. Falls das +Programm abnormal beendet wird, springt das Betriebssystem zunächst +über diesen Vektor, so daß man sich in Ruhe aus allen veränderten +Vektoren zurückziehen kann. Da MagiC für jede Applikation einen +eigenen etv_term-Vektor verwendet, kann es dabei nicht +zu Kollisionen kommen. +
      + + +
    etv_timer    LONG 0x400 logischer GEMDOS-Vektor 256. Sollte immer nur per Setexc +gesetzt werden. +
      + + +
    etv_xtra     LONG 0x40c reserviert für die logischen Vektoren 259-263 des GEMDOS, und +z.Zt. unbenutzt. +
      + + +
    exec_os      LONG 0x4fe Zeiger auf das erste Byte des Textsegmentes des +Shell-Programms. +
      + + + +
    flock        WORD 0x43e wenn hier ein Wert ungleich 0 steht, dann darf nicht +auf den DMA-Chip zugegriffen werden. DMA-Gerätetreiber müssen also +zunächst abfragen, ob der DMA-Chip blockiert worden ist, und flock +dann, wenn sie mit der Arbeit beginnen, selbst setzen. +
      + + + +
    hdv_boot     LONG 0x47a Vektor zur Routine zum Laden des Bootsektors. Diese Routine +wird vom BIOS benutzt, um festzustellen, ob ein Bootsektor vorhanden +und ob er ausführbar ist. +
      + + + +
    hdv_bpb      LONG 0x472 Vektor zur Routine, die den BPB eines BIOS-Laufwerkes +ermittelt. Die Gerätenummer wird auf dem Stack (4(sp)) übergeben. +
      + + +
    hdv_init     LONG 0x46a Vektor zu den Initialisierungsroutinen für die +Diskettenlaufwerke. Wird vor dem Lesen der Bootsektoren ausgelesen, +und kann daher nur von reset-residenten Programmen oder ROM-Modulen +verändert werden. Zu den Aufgaben gehören: +
      +
      +
    • Initialisierung der Diskettenlaufwerke (_nflops wird +entsprechend gesetzt). +
    • +
    • Übertragung von seekrate in die internen Variablen des BIOS. +
    • +
    + + + + +
    hdv_mediach  LONG 0x47e Vektor zur Routine zur Bestimmung des Media-Change-Status eines +BIOS-Laufwerks. Die BIOS-Gerätenummer wird auf dem Stack (4(sp)) +übergeben. +
      + + +
    hdv_rw       LONG 0x476 Vektor zur Routine zum Lesen und Schreiben von Blöcken auf +BIOS-Laufwerken. Auf dem Stack werden die gleichen Parameter wie bei +Rwabs übergeben (beginnend mit 4(sp); rwflag). +
      + + + +
    kcl_hook     LONG 0x5b0 Zeiger auf eine Routine zur Ausgabe des +Tastenklick-Geräusches. Das BIOS sorgt selbsttätig für die Abfrage +des Flags in con_term und ruft diese Routine nur dann auf, wenn das +Geräusch wirklich erklingen soll. Die Routine wird im Supervisor-Mode +aufgerufen, per RTS abgeschlossen und darf die Register D0-D2 und +A0-A2 verändern und sollte nicht allzu viel Zeit verbrauchen. (ab TOS +1.06, ab KAOS 1.4.2) +
      + + +
    memcntrl     BYTE 0x424 enthält die untersten vier Bits des Speicher-Kontrollregisters +(0xffff8001) +
    Einige bekannte Werte sind: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + +
    SpeichergrößeWert
    128 K0
    512 K4
    256 K (2 Bänke)0
    1 MB5
    +
    + + + +
    memval2      LONG 0x43a sollte den Magic-Wert 0x237698aa enthalten. Haben sowohl +memval2 als auch memvalid den geforderten Wert, (und ab TOS 1.02 +auch memval3), wird beim nächsten Reset nur ein Warmstart ausgelöst. +
      + + +
    memval3      LONG 0x51a siehe auch memval und memval2. In diesem Fall ist der magische +Wert 0x5555aaaa. (ab TOS 1.02) +
      + + +
    memvalid     LONG 0x420 sollte die magische Zahl 0x752019f3 enthalten. +
      + + +
    nvbls        WORD 0x454 Anzahl der Einträge, auf die _vblqueue zeigt. Identisch mit +der Maximalzahl von gleichzeitig installierbaren +Vertical-Blank-Routinen (Standardwert: 8). +
      + + + + +
    palmode      WORD 0x448 legt laut Atari die Fernsehnorm fest. Es gilt: +
      +
    0 = NTSC-Modus (60 Hz) +
    1 = PAL-Modus  (50 Hz) +
      +
    Tatsächlich wird diese Systemvariable nicht berücksichtigt. +Eine Änderung der Bildwiederholfrequenz ist nur über die +entsprechenden Hardwareregister möglich. +
      + + +
    phystop      LONG 0x42e Zeiger auf das erste Byte über dem physikalischen Ende des +ST-kompatiblen RAM-Bereichs. +
      + + + +
    prt_cnt      WORD 0x4ee Zähler für die Alternate-Help Tastendrücke. Es gilt: +
      + + + + + + + + + +
    -1 = normaler Status +
     0 = Hardcopy beginnen +
    >0 = Hardcopy abbrechen und auf Wert -1 zurücksetzen. + +
    + +
    Diese Variable muss man auch vor einem Aufruf von Prtblk setzen. +
      + + +
    prv_aux      LONG 0x512 Zeiger auf eine Routine zur Ausgabe auf dem seriellen Port +(ebenfalls für Hardcopy Routine). Das auszugebende Zeichen steht in +6(sp). +
      + + +
    prv_auxo     LONG 0x50e Zeiger auf eine Routine zum Feststellen des Status der +seriellen Schnittstelle (ebenfalls für Hardcopy-Funktion). +
      + + +
    prv_lst      LONG 0x50a Zeiger auf eine Routine zur Ausgabe auf dem parallelen Port +(ebenfalls für Hardcopy Routine). Das auszugebende Zeichen steht in +6(sp). +
      + + +
    prv_lsto     LONG 0x506 Zeiger auf eine Routine zum Feststellen des Status des +parallelen Ports (ebenfalls für Hardcopy-Routine). +
      + + +
    pun_ptr      LONG 0x516 zeigt bei erfolgreicher Installation eines AHDI-kompatiblen +Festplattentreibers auf eine PUN_INFO-Struktur. +
      + + + +
    ramtop       LONG 0x5a4 Zeiger auf das Ende des Fast-RAM's im Atari-TT (nicht offiziell +dokumentiert). +
      + + +
    ramvalid     LONG 0x5a8 Magic-Wert der anzeigt, ob ramtop einen sinnvollen Wert +enthält. Muß 0x1357bd13 sein. Nicht offiziell dokumentiert. +
      + + +
    resvalid     LONG 0x426 wenn diese Adresse bei einem Reset den Wert 0x31415926 +enthält, wird durch resvector gesprungen. +
      + + +
    resvector    LONG 0x42a wird bei der Systeminitialisierung benutzt. Enthält den Vektor +für einen Reset, falls resvalid den korrekten Wert beinhaltet. Zum +Zeitpunkt des Aufrufs sind die Hardwareregister noch nicht gesetzt, +und auch der Stackpointer ist noch nicht initialisiert. +
      + + +
    sav_context  LONG 0x4ae sollte eigentlich ein Zeiger auf den Speicherbereich sein, in +den bei Exceptions die Register und Teile des Stacks gerettet werden. +Tatsächlich wird er aber vom TOS nicht benutzt, und daher muß man +direkt auf die Variablen bei Adresse 0x380 zugreifen. +
      + + +
    sav_row      WORD 0x4ac interner Puffer zur Zwischenspeicherung der Cursor-Position +(nicht offiziell dokumentiert). +
      + + +
    savptr       LONG 0x4a2 Zeiger auf Register-Zwischenspeicher von BIOS und XBIOS. +
      + + + +
    scr_dump     LONG 0x502 Zeiger auf die Hardcopy-Routine. Wird von der XBIOS-Funktion +Scrdmp benutzt. +
      + + +
    screenpt     LONG 0x45e Zeiger auf den Anfang des Bildspeichers. Wird beim nächsten +Vertical-Blank in die betreffenden Hardware-Register (Rückgabe von +Physbase) und nach _v_bas_ad (Rückgabe von Logbase) übertragen, +anschließend aber nicht gelöscht. Daher sollte man stattdessen immer +mit Setscreen arbeiten. +
      + + + +
    seekrate     WORD 0x440 Seekrate für die beiden Floppies. Es gilt: +
      +
    0 =  6 ms +
    1 = 12 ms +
    2 =  2 ms +
    3 =  3 ms +
    +
      +
    Die Variable wird gleich nach dem Systemstart vom BIOS +ausgelesen, und danach ignoriert. Zum ändern der tatsächlich +benutzten Seekrate muß man die XBIOS-Funktion Floprate verwenden. +
      + + +
    sshiftmd     BYTE 0x44c Kopie des Modus-Registers des Shifters. Es gilt: +
      +
    0 =  320 * 200 (vier Planes) +
    1 =  640 * 200 (zwei Planes) +
    2 =  640 * 400 (ein Plane) +
    3 =  640 * 480 (vier Planes, nur TT) +
    4 = 1280 * 960 (ein Plane, nur TT) +
    5 =  320 * 480 (acht Planes, nur TT) +
      +
    Alle anderen Werte sind für zukünftige Erweiterungen +reserviert. +
      + + +
    swv_vec      LONG 0x46e Zeiger auf die Routine, die auf das Anschließen eines +Schwarz-Weiß bzw. Farbmonitors reagiert (zeigt zu Beginn auf die +normale Reset-Routine). +
      + + + +
    the_env      LONG 0x4be Zeiger auf die Standard-Environment Strings (unbenutzt). +
      + + + +
    themd        MD   0x48e Zeiger auf MD-Struktur des GEMDOS. Diese wird ein einziges mal +bei der Initialisierung des Systems gesetzt, und darf nicht verändert +werden (und das würde sie bei Benutzung von Getmpb!). +
      + + +
    trp14ret     LONG 0x486 offiziell nicht dokumentiert, und auch wohl unbenutzt. +
      + + +
    vblsem       WORD 0x452 ein Wert von 1 bedeutet, daß der Vertical-Blank-Handler +aktiviert ist. +
      + + +
    xconin       LONG 0x53e Acht Vektoren für Bconin-Routinen. (ab TOS 1.02) +
      + + +
    xconout      LONG 0x57e Acht Vektoren für Bconout-Routinen. (ab TOS 1.02) +
      + + +
    xconstat     LONG 0x51e Acht Vektoren für Bconstat-Routinen. (ab TOS 1.02) +
      + + +
    xcostat      LONG 0x55e Acht Vektoren für Bcostat-Routinen. (ab TOS 1.02) +
      + +
    + +

    Querverweis: +
    Reset-Vektor   Systemvektoren   Programmstart und TPA   Systemvariablen, +nummerisch sortiert +

    +

    3.4.1 Systemvariablen, nummerisch sortiert

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    VariableGrößeAdresse
    0x400LONGetv_timer
    0x404LONGetv_critic
    0x408LONGetv_term
    0x40cLONGetv_xtra
    0x420LONGmemvalid
    0x424BYTEmemcntrl
    0x426LONGresvalid
    0x42aLONGresvector
    0x42eLONGphystop
    0x432LONG_membot
    0x436LONG_memtop
    0x43aLONGmemval2
    0x43eWORDflock
    0x440WORDseekrate
    0x442WORD_timr_ms
    0x444WORD_fverify
    0x446WORD_bootdev
    0x448WORDpalmode
    0x44aBYTEdefshiftmd
    0x44cBYTEsshiftmd
    0x44eLONG_v_bas_ad
    0x452WORDvblsem
    0x454WORDnvbls
    0x456LONG_vblqueue
    0x45aLONGcolorptr
    0x45eLONGscreenpt
    0x462LONG_vbclock
    0x466LONG_frclock
    0x46aLONGhdv_init
    0x46eLONGswv_vec
    0x472LONGhdv_bpb
    0x476LONGhdv_rw
    0x47aLONGhdv_boot
    0x47eLONGhdv_mediach
    0x482WORD_cmdload
    0x484BYTEconterm
    0x486LONGtrp14ret
    0x48aLONGcriticret
    0x48eMDthemd
    0x49eLONG_md
    0x4a2LONGsavptr
    0x4a6WORD_nflops
    0x4a8LONGcon_state
    0x4acWORDsav_row
    0x4aeLONGsav_context
    0x4b2LONG_bufl
    0x4baLONG_hz_200
    0x4beLONGthe_env
    0x4c2LONG_drvbits
    0x4c6LONG_dskbufp
    0x4caLONG_autopath
    0x4ceLONG_vbl_list
    0x4eeWORDprt_cnt
    0x4f0WORD_prtabt
    0x4f2LONG_sysbase
    0x4f6LONG_shell_p
    0x4faLONGend_os
    0x4feLONGexec_os
    0x502LONGscr_dump
    0x506LONGprv_lsto
    0x50aLONGprv_lst
    0x50eLONGprv_auxo
    0x512LONGprv_aux
    0x516LONGpun_ptr
    0x51aLONGmemval3
    0x51eLONGxconstat
    0x53eLONGxconin
    0x55eLONGxcostat
    0x57eLONGxconout
    0x59eWORD_longframe
    0x5a0LONG_p_cookies
    0x5a4LONGramtop
    0x5a8LONGramvalid
    0x5acLONGbell_hook
    0x5b0LONGkcl_hook
    +
    + +

    Querverweise: Systemvariablen +

    +
    + +Home +BIOSBIOS +Einklinken in den Reset-VektorEinklinken in den Reset-Vektor +Die SystemvektorenDie Systemvektoren + + diff --git a/de/c_task_royal.html b/de/c_task_royal.html new file mode 100644 index 000000000..6f5b15334 --- /dev/null +++ b/de/c_task_royal.html @@ -0,0 +1,66 @@ + + + + + +Die Anleitung zum TOS: C'Task Royal + + + + + + + + + +Home +GEMDOSGEMDOS +ARGV-VerfahrenARGV-Verfahren +NAP BioNet100NAP BioNet100 + +
    + +

    5.19 C'Task Royal

    + + + + + + + + + + + + + + + + + + + + + + + + +

    C'Task Royal eine Sammlung von Routinen an, die es ermöglichen, +C- oder Assemblerprogramme mit Multitasking-Fähigkeiten auszustatten. +Dazu muß der Programmierer sein Programm in mehrere Prozesse +aufteilen, die dann gleichzeitig ablaufen. +

    +

    Weitere Informationen: +
    ST Computer 12/1986 +
    ST Computer 08/1987 +
    +

    +
    + +Home +GEMDOSGEMDOS +ARGV-VerfahrenARGV-Verfahren +NAP BioNet100NAP BioNet100 + + diff --git a/de/contact.html b/de/contact.html new file mode 100644 index 000000000..2b2a26613 --- /dev/null +++ b/de/contact.html @@ -0,0 +1,40 @@ + + + + + +Die Anleitung zum TOS: Kontakt + + + + + + + + + +Home +EinleitungEinleitung +EinleitungEinleitung +Altes Vorwort von Rolf KotzianAltes Vorwort von Rolf Kotzian + +
    + +

    1.1 Kontakt

    +

    Dieser Text kann per Definition nie aktuell sein. Wer Fehler +findet, Anregungen hat oder mitarbeiten möchte kann sich bei mir +melden: +

    +

    +

    +

    Dieser Text ist unter der GNU General Public Licence veröffentlicht. +

    +
    + +Home +EinleitungEinleitung +EinleitungEinleitung +Altes Vorwort von Rolf KotzianAltes Vorwort von Rolf Kotzian + + diff --git a/de/crazydots.html b/de/crazydots.html new file mode 100644 index 000000000..7477e2878 --- /dev/null +++ b/de/crazydots.html @@ -0,0 +1,871 @@ + + + + + +Die Anleitung zum TOS: Crazy-Dots-XBIOS-Erweiterung + + + + + + + + + +Home +XBIOSXBIOS +CENTScreen-XBIOS-ErweiterungCENTScreen-XBIOS-Erweiterung +CT60-XBIOS-ErweiterungCT60-XBIOS-Erweiterung + +
    + +

    4.7 Crazy-Dots-XBIOS-Erweiterung

    + + +

    Hinweis: +
    Diese Funktionen stehen nur zur Verfügung, wenn der Treiber der +Grafikkarte Crazy-Dots gestartet wurde. Es handelt sich nicht +um dokumentierte Routinen des Betriebssystems. +

    +

    4.7.1 GetScreenDescriptor

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »GetScreenDescriptor« - +
      +
    Xbiosnummer: 194 +
      +
    Binding: +
      +
    Beschreibung: Bindings für GetScreenDescriptor +
      +
    Ergebnis: 194L = XBIOS-Call ist nicht installiert (keine Crazy-Dots +Software installiert). +
      +
    Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Grafikkarte Crazy-Dots gestartet wurde. Es handelt sich +nicht um dokumentierte Routinen des Betriebssystems. +
      +
    Gruppe: Crazy-Dots-XBIOS-Erweiterung +
      +
    Querverweis: Binding +
      + +
    + +

    4.7.1.1 Bindings für GetScreenDescriptor

    + + + + + + +
    C: SCREEN xbios( 194 ); +
      +
    Assembler: +
      +
    move.w    #194,-(sp)   ; Offset 0
    +trap      #14          ; XBIOS aufrufen
    +addq.l    #4,sp        ; Stack korrigieren
    +
    + +
    + +

    4.7.2 ResetScreen

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »ResetScreen« - +
      +
    Xbiosnummer: 195 +
      +
    Binding: Bindings für ResetScreen +
      +
    Beschreibung: Initalisiert den Grafikcontroller mit den in +"Screen->ModStruct" enthaltenen Daten neu. In der Regel +also die aktuelle Auflösung. Eignet sich als gut als Notbremse für +fehlgeschlagene eigene Versuche an den Registern. +
      +
    Ergebnis: keines +
      +
    Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Grafikkarte Crazy-Dots gestartet wurde. Es handelt sich +nicht um dokumentierte Routinen des Betriebssystems. +
      +
    Gruppe: Crazy-Dots-XBIOS-Erweiterung +
      +
    Querverweis: Binding +
      + +
    + +

    4.7.2.1 Bindings für ResetScreen

    + + + + + + +
    C: void xbios( 195 ); +
      +
    Assembler: +
      +
    move.w    #195,-(sp)   ; Offset 0
    +trap      #14          ; XBIOS aufrufen
    +addq.l    #4,sp        ; Stack korrigieren
    +
    + +
    + +

    4.7.3 GetNumberofPModes

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »GetNumberofPModes« - +
      +
    Xbiosnummer: 196 +
      +
    Binding: Bindings für GetNumberOfPModes +
      +
    Beschreibung: Anzahl der verfügbaren phys. Auflösungen erfragen. +
      +
    Ergebnis: Anzahl der verfügbaren phys. Auflösungen. +
      +
    Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Grafikkarte Crazy-Dots gestartet wurde. Es handelt sich +nicht um dokumentierte Routinen des Betriebssystems. +
      +
    Gruppe: Crazy-Dots-XBIOS-Erweiterung +
      +
    Querverweis: Binding +
      + +
    + +

    4.7.3.1 Bindings für GetNumberOfPModes

    + + + + + + +
    C: int32_t xbios( 196 ); +
      +
    Assembler: +
      +
    move.w    #196,-(sp)   ; Offset 0
    +trap      #14          ; XBIOS aufrufen
    +addq.l    #4,sp        ; Stack korrigieren
    +
    + +
    + +

    4.7.4 GetPMode

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »GetPMode« - +
      +
    Xbiosnummer: 197 +
      +
    Binding: Bindings für GetPMode +
      +
    Beschreibung: n: Nummer des Modes (0 <= n <= +GetNumberofPModes) +
      +
    Ergebnis: Pointer auf eine Struktur MOD_DESC. +
      +
    Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Grafikkarte Crazy-Dots gestartet wurde. Es handelt sich +nicht um dokumentierte Routinen des Betriebssystems. +
      +
    Gruppe: Crazy-Dots-XBIOS-Erweiterung +
      +
    Querverweis: Binding +
      + +
    + +

    4.7.4.1 Bindings für GetPMode

    + + + + + + +
    C: MOD_DESC xbios( 197, int16_t n); +
      +
    Assembler: +
      +
    move.w    n,-(sp)      ; Offset 2
    +move.w    #197,-(sp)   ; Offset 0
    +trap      #14          ; XBIOS aufrufen
    +addq.l    #6,sp        ; Stack korrigieren
    +
    + +
    + +

    4.7.5 ReadMode

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »ReadMode« - +
      +
    Xbiosnummer: 198 +
      +
    Binding: Bindings für ReadMode +
      +
    Beschreibung: List den durch (MOD_DESC *) GetPMode beschriebenen Grafikmodus +in einen Buffer (Struktur PMODE). +
      +
    n: Nummer des Modes (0 <= n <= +GetNumberofPModes) +
      +
    Ergebnis: Pointer auf eine Struktur PMODE +
      +
    Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Grafikkarte Crazy-Dots gestartet wurde. Es handelt sich +nicht um dokumentierte Routinen des Betriebssystems. +
      +
    Gruppe: Crazy-Dots-XBIOS-Erweiterung +
      +
    Querverweis: Binding +
      + +
    + +

    4.7.5.1 Bindings für ReadMode

    + + + + + + +
    C: PMODE xbios( 198, int16_t n ); +
      +
    Assembler: +
      +
    move.w    n,-(sp)      ; Offset 2
    +move.w    #198,-(sp)   ; Offset 0
    +trap      #14          ; XBIOS aufrufen
    +addq.l    #6,sp        ; Stack korrigieren
    +
    + +
    + +

    4.7.6 CopyModeToActiveMode

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »CopyModeToActiveMode« - +
      +
    Xbiosnummer: 199 +
      +
    Binding: Bindings für CopyModeToActiveMode +
      +
    Beschreibung: Macht den mit ReadMode geladenen Modus zum aktiven Modus. +Anschließend muß er noch mit ResetScreen in den Videocontroller +geladen werden. +
      +
    Ergebnis: keines +
      +
    Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Grafikkarte Crazy-Dots gestartet wurde. Es handelt sich +nicht um dokumentierte Routinen des Betriebssystems. +
      +
    Gruppe: Crazy-Dots-XBIOS-Erweiterung +
      +
    Querverweis: Binding +
      + +
    + +

    4.7.6.1 Bindings für CopyModeToActiveMode

    + + + + + + +
    C: void xbios( 199 ); +
      +
    Assembler: +
      +
    move.w    #199,-(sp)   ; Offset 0
    +trap      #14          ; XBIOS aufrufen
    +addq.l    #4,sp        ; Stack korrigieren
    +
    + +
    + +

    4.7.7 ActiveModeNumber

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »ActiveModeNumber« - +
      +
    Xbiosnummer: 200 +
      +
    Binding: Bindings für ActiveModeNumber +
      +
    Beschreibung: +
      +
    Ergebnis: Nummmer des aktuellen Videomodus +
      +
    Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Grafikkarte Crazy-Dots gestartet wurde. Es handelt sich +nicht um dokumentierte Routinen des Betriebssystems. +
      +
    Gruppe: Crazy-Dots-XBIOS-Erweiterung +
      +
    Querverweis: Binding +
      + +
    + +

    4.7.7.1 Bindings für ActiveModeNumber

    + + + + + + +
    C: int16_t xbios( 200 ); +
      +
    Assembler: +
      +
    move.w    #200,-(sp)   ; Offset 0
    +trap      #14          ; XBIOS aufrufen
    +addq.l    #4,sp        ; Stack korrigieren
    +
    + +
    + +

    4.7.8 GetActiveModeDesc

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »GetActiveModeDesc« - +
      +
    Xbiosnummer: 201 +
      +
    Binding: Bindings für GetActiveModeDesc +
      +
    Beschreibung: +
      +
    Ergebnis: Zeiger auf die PMODE-Struktur des aktuellen Grafikmodus +
      +
    Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Grafikkarte Crazy-Dots gestartet wurde. Es handelt sich +nicht um dokumentierte Routinen des Betriebssystems. +
      +
    Gruppe: Crazy-Dots-XBIOS-Erweiterung +
      +
    Querverweis: Binding +
      + +
    + +

    4.7.8.1 Bindings für GetActiveModeDesc

    + + + + + + +
    C: PMODE xbios( 201 ); +
      +
    Assembler: +
      +
    move.w    #201,-(sp)   ; Offset 0
    +trap      #14          ; XBIOS aufrufen
    +addq.l    #4,sp        ; Stack korrigieren
    +
    + +
    + +

    4.7.9 GetRegisterbase

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »GetRegisterbase« - +
      +
    Xbiosnummer: 202 +
      +
    Binding: Bindings für GetRegisterbase +
      +
    Beschreibung: +
      +
    Ergebnis: Basisadresse der Crazy-Dots Register +
      +
    Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Grafikkarte Crazy-Dots gestartet wurde. Es handelt sich +nicht um dokumentierte Routinen des Betriebssystems. +
      +
    Gruppe: Crazy-Dots-XBIOS-Erweiterung +
      +
    Querverweis: Binding +
      + +
    + +

    4.7.9.1 Bindings für GetRegisterbase

    + + + + + + +
    C: int32_t xbios( 202 ); +
      +
    Assembler: +
      +
    move.w    #202,-(sp)   ; Offset 0
    +trap      #14          ; XBIOS aufrufen
    +addq.l    #4,sp        ; Stack korrigieren
    +
    + +
    + +

    4.7.10 GetFeatures

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »GetFeatures« - +
      +
    Xbiosnummer: 203 +
      +
    Binding: Bindings für GetFeatures +
      +
    Beschreibung: Liefert Informationen über installierte Crazy-Dots +Erweiterungen. +
      +
    Ergebnis: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    BitVorhandene Erweiterung
    0ECL-Interface (Pixeltakt bis 140 MHz monochrom)
    1Genlock-Interface
    212 Bit Pixel (4096 Farben)
    316 Bit Pixel (65536 Farben)
    424 Bit Pixel (True Color)
    532 Bit Pixel (True Color + 8 Bit Overlaybild)
    64 Bit Pixel (nibble Mode,
      bis 160 MHz Pixeltakt, Farbe)
    7-31Reserviert
    +
    + +
    Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Grafikkarte Crazy-Dots gestartet wurde. Es handelt sich +nicht um dokumentierte Routinen des Betriebssystems. +
      +
    Gruppe: Crazy-Dots-XBIOS-Erweiterung +
      +
    Querverweis: Binding +
      + +
    + +

    4.7.10.1 Bindings für GetFeatures

    + + + + + + +
    C: int32_t xbios( 203 ); +
      +
    Assembler: +
      +
    move.w    #203,-(sp)   ; Offset 0
    +trap      #14          ; XBIOS aufrufen
    +addq.l    #4,sp        ; Stack korrigieren
    +
    + +
    + +

    4.7.11 GetActiveFeatures

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »GetActiveFeatures« - +
      +
    Xbiosnummer: 204 +
      +
    Binding: Bindings für GetActiveFeatures +
      +
    Beschreibung: Liefert Informationen über installierte und aktive Crazy-Dots +Erweiterungen. +
      +
    Ergebnis: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    BitVorhandene Erweiterung
    0ECL-Interface (Pixeltakt bis 140 MHz monochrom)
    1Genlock-Interface
    212 Bit Pixel (4096 Farben)
    316 Bit Pixel (65536 Farben)
    424 Bit Pixel (True Color)
    532 Bit Pixel (True Color + 8 Bit Overlaybild)
    64 Bit Pixel (nibble Mode,
      bis 160 MHz Pixeltakt, Farbe)
    7-31Reserviert
    +
    + +
    Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Grafikkarte Crazy-Dots gestartet wurde. Es handelt sich +nicht um dokumentierte Routinen des Betriebssystems. +
      +
    Gruppe: Crazy-Dots-XBIOS-Erweiterung +
      +
    Querverweis: Binding +
      + +
    + +

    4.7.11.1 Bindings für GetActiveFeatures

    + + + + + + +
    C: int32_t xbios( 204 ); +
      +
    Assembler: +
      +
    move.w    #204,-(sp)   ; Offset 0
    +trap      #14          ; XBIOS aufrufen
    +addq.l    #4,sp        ; Stack korrigieren
    +
    + +
    + +
    + +Home +XBIOSXBIOS +CENTScreen-XBIOS-ErweiterungCENTScreen-XBIOS-Erweiterung +CT60-XBIOS-ErweiterungCT60-XBIOS-Erweiterung + + diff --git a/de/ct60.html b/de/ct60.html new file mode 100644 index 000000000..5a1fe7b23 --- /dev/null +++ b/de/ct60.html @@ -0,0 +1,598 @@ + + + + + +Die Anleitung zum TOS: CT60-XBIOS-Erweiterung + + + + + + + + + +Home +XBIOSXBIOS +Crazy-Dots-XBIOS-ErweiterungCrazy-Dots-XBIOS-Erweiterung +Datum, Uhrzeit und ZeitgeberDatum, Uhrzeit und Zeitgeber + +
    + +

    4.8 CT60-XBIOS-Erweiterung

    + + + + + + + + + + + + + + + +
    ct60_cache aktivieren/deaktivieren der 68060 Caches. +
    ct60_flush_cache flush 68060 Caches. +
    ct60_read_core_temperature Temperatur des 68060 lesen. +
    ct60_rw_parameter Lesen oder Schreiben eines Parameter im Flash Eprom. +
    ct60_vmalloc Speicher reservieren (Radeon Treiber) + +
    + +

    4.8.1 ct60_cache

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »ct60_cache« - aktivieren/deaktivieren der 68060 Caches. +
      +
    Xbiosnummer: 50700 (0xc60c) +
      +
    Deklaration: int32_t ct60_cache( int16_t cache_mode ); +
      +
    Beschreibung: Diese XBIOS Funktion wird in der gepatchten Version des +General.cpx benutzt, die 68060 Caches zu aktivieren/deaktivieren. +
      + + + + + + + + + +
    Parameter Bedeutung +
        +
    cache_mode  1 = Caches aktivieren. +
     0 = Caches deaktivieren. +
    -1 = keine Änderung. + +
    + +
    Achtung: +
    Vom Anwender sollte die CacheCtrl Funktion benutzt werden. +
      +
    Ergebnis: Liefert CACR. +
      +
    Verfügbar: TOS 4.04 mit Patch für CT60 Beschleunigerboard. +
      +
    Gruppe: CT60-XBIOS-Erweiterung +
      +
    Querverweis: Binding +
      + +
    + +

    4.8.1.1 Bindings für ct60_cache

    + + + + + + +
    C: int32_t ct60_cache( int16_t cache_mode ); +
      +
    Assembler: +
      +
    move.w    cache_mode,-(sp); Offset 2
    +move.w    #$c60c,-(sp)    ; Offset 0
    +trap      #14             ; XBIOS aufrufen
    +addq.l    #4,sp           ; Stack korrigieren
    +
    + +
    + +

    4.8.2 ct60_flush_cache

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »ct60_flush_cache« - flush 68060 Caches +
      +
    Xbiosnummer: 50701 (0xc60d) +
      +
    Deklaration: int32_t ct60_flush_cache( void ); +
      +
    Beschreibung: Diese XBIOS Funktion wird in der gepatchten Version des +General.cpx benutzt, um den Instruction- und den Datencache zu +löschen. +
      +
    Achtungt: +
    Vom Anwender sollte die CacheCtrl Funktion benutzt werden. +
      +
    Ergebnis: E_OK (0) +
      +
    Verfügbar: TOS 4.04 mit Patch für CT60 Beschleunigerboard. +
      +
    Gruppe: CT60-XBIOS-Erweiterung +
      +
    Querverweis: Binding +
      + +
    + +

    4.8.2.1 Bindings für ct60_flush_cache

    + + + + + + +
    C: int32_t ct60_flush_cache( void ); +
      +
    Assembler: +
      +
    move.w    #$c60d,-(sp)    ; Offset 0
    +trap      #14             ; XBIOS aufrufen
    +addq.l    #2,sp           ; Stack korrigieren
    +
    + +
    + +

    4.8.3 ct60_read_core_temperature

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »ct60_read_core_temperature« - Temperatur des 68060 lesen. +
      +
    Xbiosnummer: 50698 (0xc60a) +
      +
    Deklaration: int32_t ct60_read_core_temperature( int16_t type_deg ); +
      +
    Beschreibung: Diese XBIOS Funktion ermittelt die Temperatur des 68060. +
      + + + +
    type_deg: CT60_CELCIUS    0 +
    CT60_FARENHEIT  1 + +
    + +
    Ergebnis: Die ermittelte Temperatur oder ERROR (-1) im Fehlerfall. +
      +
    Verfügbar: TOS 4.04 mit Patch für CT60 Beschleunigerboard. +
      +
    Gruppe: CT60-XBIOS-Erweiterung +
      +
    Querverweis: Binding +
      + +
    + +

    4.8.3.1 Bindings für ct60_read_core_temperature

    + + + + + + +
    C: int32_t ct60_read_core_temperature( int16_t type_deg ); +
      +
    Assembler: +
      +
    move.w    type_deg,-(sp)  ; Offset 2
    +move.w    #$c60a,-(sp)    ; Offset 0
    +trap      #14             ; XBIOS aufrufen
    +addq.l    #4,sp           ; Stack korrigieren
    +
    + +
    + +

    4.8.4 ct60_rw_parameter

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »ct60_rw_parameter« - Lesen oder Schreiben eines Parameter im +Flash Eprom. +
      +
    Xbiosnummer: 50699 (0xc60b) +
      +
    Deklaration: int32_t ct60_rw_parameter( int16_t mode, int32_t type_param, +int32_t value ); +
      +
    Beschreibung: Diese XBIOS Funktion liest oder schreibt einen Parameter in +das Flash Eprom. Die Funktion liefert den Wert zurück. +
      + + + + + + +
    mode CT60_MODE_READ (0) +
    Parameter lesen. +
      +
    CT60_MODE_WRITE (1) +
    Parameter schreiben. +
      +
    type_param CT60_PARAM_TOSRAM (0) +
    Ist der Wert von value 1, wird das TOS in der Bootphase in das +SDRAM kopiert (PMMU wird benutzt und Cookie PMMU angelegt). Ist der +Wert von value 0, wird das TOS im Flash Eprom benutzt. +
      +
    CT60_BLITTER_SPEED (1) +
    Ist der Wert von value 0, läuft der Blitter mit 8/10 MHz. Ist der +Wert von value 1, läuft der Blitter mit 16/20 MHz. +
      +
    CT60_CACHE_DELAY (2) +
    If the bit 0 of the value is cleared, the Pexec function is normal +(flushes cache). +
    If the bit 0 of the value is set, the caches are disabled for 5 +seconds when a program is started under TOS with the Pexec +function. +
    If the bit 1 of the value is set, there are an Fread test and +maybe a copyback alert if the code begin by $601A. With this alert you +can remove the cache during 5 seconds. +
    If the bit 1 of the value is cleared, there is no copyback alert. +
      +
    CT60_BOOT_ORDER (3) +
    New boot +
    Ist der Wert von value 0, dann bootet TOS von SCSI +Geräten (0-7) vor IDE Geräten (0-1). +
    Ist der Wert von value 1, dann bootet TOS von IDE +Geräten (0-1) vor SCSI Geräten (0-7). +
    Ist der Wert von value 2, dann bootet TOS von SCSI +Geräten (7-0) vor IDE Geräten (1-0). +
    Ist der Wert von value 3, dann bootet TOS von IDE +Geräten (1-0) vor SCSI Geräten (7-0). +
    +
      +
    Old boot +
    If the value is set to 4, TOS boots from SCSI drives (0-7) +before IDE drives (0-1). +
    If the value is set to 5, TOS boots from IDE drives (0-1) +before SCSI drives (0-7). +
    If the value is set to 6, TOS boots from SCSI drives (7-0) before +IDE drives (1-0). +
    If the value is set to 7, TOS boots from IDE drives (1-0) +before SCSI drives (7-0). +
    +
      +
    CT60_CPU_FPU (4) +
    Ist das Bit 0 von value gelöscht, dann ist die FPU +abgeschaltet. +
      +
    CT60_BOOT_LOG (5) +
    If the bit 0 is cleared, the stdout output of the AUTO folder +files is writed inside a boot.log on the boot drive. +
      +
    CT60_VMODE (6) +
    Boot extended modecode for CTPCI graphic card: F030 modecode + +extended bits: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    HORFLAG0x200for double width
    HORFLAG20x400for width increased
    VESA_6000x800for SVGA 600
    VESA_7680x1000for SVGA 768
    VERTFLAG20x2000for double height
    BPS325for True Color
    +
    + +
    CT60_SAVE_NVRAM_1 (7) +
    CT60_SAVE_NVRAM_2 (8) +
    CT60_SAVE_NVRAM_3 (9) +
    Reserved for TOS NVM backup, do not use. +
      +
    CT60_PARAM_OFFSET_TLV (10) +
    Der Wert value enthält einen vorzeichenbehafteten Offset +in Punkten. Ein Punkt entspricht 2.8 °C. +
      +
    CT60_ABE_CODE (11) +
    CT60_SDR_CODE (12) +
    Reserved for save ABE/SDR versions, do not use. +
      +
    CT60_CLOCK (13) +
    CTPCM boot clock frequency in KHz (65000-110000) +
    WARNING, if you increase frequency !!! +
      +
    CT60_PARAM_CTPCI (14) +
    If the bit 0 of the value is cleared, the TOS boot on the native +F030 IDE port. +
    If the bit 0 of the value is set, the TOS boot n the CTPCI IDE +port who replaces the F030 at the same address. +
    If the bit 1 of the value is cleared, the VDI not use the CTPCI +PLX DMA (slower for vro_cpyfm). +
    If the bit 1 of the value is set, the VDI use the CTPCI PLX DMA +(faster for vro_cpyfm). +
      + +
    + +
    Ergebnis: Der Parameter oder: +
      + + + + + + + + + +
    EBADRQ (-5) wenn der Parameter >=15 ist. +
    EWRITF (-10) für einen Schreibfehler. +
    EUNDEV (-15) wenn das Flash nicht gefunden wurde. + +
    + +
    Verfügbar: TOS 4.04 mit Patch für CT60 Beschleunigerboard. +
      +
    Gruppe: CT60-XBIOS-Erweiterung +
      +
    Querverweis: Binding +
      + +
    + +

    4.8.4.1 Bindings für ct60_rw_parameter

    + + + + + + +
    C: int32_t ct60_rw_parameter( int16_t mode, int32_t type_param, +int32_t value ); +
      +
    Assembler: +
      +
    move.l    value,-(sp)     ; Offset 8
    +move.l    type_param,-(sp); Offset 4
    +move.w    mode,-(sp)      ; Offset 2
    +move.w    #$c60b,-(sp)    ; Offset 0
    +trap      #14             ; XBIOS aufrufen
    +lea       12(sp),sp       ; Stack korrigieren
    +
    + +
    + +

    4.8.5 ct60_vmalloc

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »ct60_vmalloc« - memory allocation (Radeon driver) +
      +
    Xbiosnummer: 50702 (0xc60e) +
      +
    Deklaration: int32_t ct60_vmalloc( int16_t mode, int32_t value ) +
      +
    Beschreibung: This function is used to allocate memory inside the offscreen +area. +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    mode 
    0value <=> malloc size, return address or null
     if memory full
     value = -1 => return bytes free ct60_vmalloc(0, -1L).
    1value <=> address of previous malloc to free.
    2null value for init. (normally never used excepted
     by radeon.sys or VsetScreen)
    +
    + +
    Ergebnis: Die Adresse oder null wenn der Speicher voll ist. +
      +
    Achtung! +
    In allen Beschreibungen wird als Rückgabe ein int32_t angegeben. +In Wirklichkeit kann der Wert aber auch größer sein. Deswegen ist +ein uint32_t besser. +
      +
    Verfügbar: Only valid with internal TOS Radeon driver (PCI.HEX). TOS 4.04 +mit Patch für CT60 Beschleunigerboard (2007-01-24). +
    Ist auch verfügbar wenn der Cookie SupV vorhanden ist. +
      +
    Gruppe: CT60-XBIOS-Erweiterung +
      +
    Querverweis: Binding +
      + +
    + +

    4.8.5.1 Bindings für ct60_vmalloc

    + + + + + + +
    C: int32_t ct60_vmalloc( int16_t mode, int32_t value ); +
      +
    Assembler: +
      +
    move.l    value,-(sp)     ; Offset 4
    +move.w    mode,-(sp)      ; Offset 2
    +move.w    #$c60e,-(sp)    ; Offset 0
    +trap      #14             ; XBIOS aufrufen
    +addq.l    #8,sp           ; Stack korrigieren
    +
    + +
    + +
    + +Home +XBIOSXBIOS +Crazy-Dots-XBIOS-ErweiterungCrazy-Dots-XBIOS-Erweiterung +Datum, Uhrzeit und ZeitgeberDatum, Uhrzeit und Zeitgeber + + diff --git a/de/develop.html b/de/develop.html new file mode 100644 index 000000000..b7a8a8ac3 --- /dev/null +++ b/de/develop.html @@ -0,0 +1,239 @@ + + + + + +Die Anleitung zum TOS: Entwicklungssysteme + + + + + + + + + +Home +Inhaltsverzeichnis +Der Scan-CodeDer Scan-Code +Literatur zum TOS-BetriebssystemLiteratur zum TOS-Betriebssystem + +
    + +

    C Entwicklungssysteme

    +

    Die folgende Liste ist eine Aufstellung aller mir bekannten +Programmiersprachen bzw. Entwicklungssysteme für TOS-kompatible +Betriebssysteme; sie erhebt keinen Anspruch auf Vollständigkeit. +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ArtNameHersteller/Vertrieb
    Application Builder• ACSproMaxon Computer GmbH
    APL• APL.68000MicroAPL
    Assembler• DevpacHiSoft, R.O.M. Software
     • Devpac-DSPHiSoft
     • DSPditCrac, TSCC
     • Easy RiderAndreas Borchard, Osnabrück
     • PureApplication Systems
     • TurboAssFreeware, Markus Fritze
    Basic• GFA-BasicGFA, Richter Distributor
     • HiSoft-BasicHiSoft
     • Omikron-BasicOmikron
    C• GNUfrei erhältlich (GNU-Lizenz)
     • LatticeHiSoft, R.O.M. Software
     • Mark Williams CMark Williams Company
     • PureApplication Systems
     • SozobonFreeware, Jerry Geiger
    C++• GNUfrei erhältlich (GNU-Lizenz)
    Fortran77+• Fortran for GEMProspero, Plünnecke
     • Fortran for TTProspero, Plünnecke
    Funktionale Sprachen• ClispFreeware, Michael Stoll
     • GoferMarc P. Jones
    Modula-2• Hänisch-ModulaModular Systems, Würzburg
     • LPR-ModulaTechnische Uni München
     • MegamaxThomas Tempelmann
     • Modula-2/68Ana-Systems Inc.
     • TDI-ModulaModula/2 Soft
    Oberon• STJ-Oberon-2Stephan Junker
    Pascal• Maxon-PascalMaxon Computer GmbH
     • Pascal XSCNumerik Software GmbH
     • Pure PascalApplication Systems
     • ST-PascalCCD, Walluf
    RCS• Interfaceno|Software
     • ORCSFreeware, Thorsten Otto
     • ResourceMasterArmin Diedering
    +
    + +

    Querverweis: Literatur   Anhang +

    +
    + +Home +Inhaltsverzeichnis +Der Scan-CodeDer Scan-Code +Literatur zum TOS-BetriebssystemLiteratur zum TOS-Betriebssystem + + diff --git a/de/edit.html b/de/edit.html new file mode 100644 index 000000000..6143f310d --- /dev/null +++ b/de/edit.html @@ -0,0 +1,4484 @@ + + + + + +Die Anleitung zum TOS: Editobjekt-Funktionen + + + + + + + + + +Home +AESAES +DruckdialogeDruckdialoge +EreignisverwaltungEreignisverwaltung + +
    + +

    8.6 Editobjekt-Funktionen

    +

    Diese Bibliothek stellt Funktionen zur Verfügung, um +Editieroperationen an einem Objekt vorzunehmen. +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    edit_close Schließt ein Editobjekt. +
    edit_create Erstellt ein neues Editobjekt. +
    edit_cursor Schaltet den Objekt-Cursor an bzw. aus. +
    edit_delete Entfernt ein Editobjekt aus dem Speicher. +
    edit_evnt Ereignisverwaltung für das Objekt. +
    edit_get_buf Textpuffer des Objektes abfragen. +
    edit_get_colour Farben ermitteln. +
    edit_get_cursor Cursorposition ermitteln. +
    edit_get_dirty Objekt auf Veränderungen überprüfen. +
    edit_get_font Zeichensatz ermitteln. +
    edit_get_format Formatierungen ermitteln. +
    edit_get_pos   +
    edit_get_scrollinfo Informationen für Scrollbalken ermitteln. +
    edit_get_sel Selektierten Bereich ermitteln. +
    edit_open Öffnet ein Editobjekt. +
    edit_resized Objektgröße verändern. +
    edit_scroll Scrollt das Objekt in eine Richtung. +
    edit_set_buf Weist dem Objekt einen Textpuffer zu. +
    edit_set_colour Farben setzen. +
    edit_set_cursor Cursorposition setzen. +
    edit_set_dirty Objekt als verändert markieren. +
    edit_set_font Zeichensatz setzen. +
    edit_set_format Formatierungen setzen. +
    edit_set_pos   + +
    + +

    Hinweis: Das Edit-Objekt steht ab MagiC 5.20 zur +Verfügung, und ist als SharedLibrary implementiert. Aus diesem Grund +muss die entsprechende Bibliothek mit +Slbopen("EDITOBJC.SLB", NULL, 0L, &slb, &slbexec) +geöffnet werden. Anschliessend stehen dann die o.g. Funktionen, sowie +der neue AES-Objekttyp G_EDIT zur Verfügung. +

    +

    Querverweis: Verwendung G_EDIT-Objekt   AES   GEM   +Objektfunktionen +

    +

    8.6.1 edit_close

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Edit Object Close« - schließt ein Editobjekt. +
      +
    AES-Nummer: 212 +
      +
    Deklaration: void edit_close ( OBJECT *tree, int16_t obj ); +
      +
    Beschreibung: Die von der Objektgröße abhängigen Verwaltungsstrukturen +werden geschlossen und der Speicher freigegeben. Der Deskriptor selbst +bleibt jedoch erhalten. Textbehandlung ist jetzt nicht mehr möglich. +
      +

    +
    + + + + + + + + + + + + +
    ParameterBedeutung
    treeRSC-Baum des Objekts
    objObjektnummer
    +
    + +
    Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
      +
    Verfügbar: ab MagiC 5.20 mittels SharedLibrary +
      +
    Gruppe: Editobjekt-Funktionen +
      +
    Querverweis: Binding +
      + +
    + +

    8.6.1.1 Bindings für edit_close

    + + + + + + + + + +
    C: void edit_close ( OBJECT *tree, int16_t obj ); +
      +
    Umsetzung: +
      +
    void edit_close ( OBJECT *tree, int16_t obj )
    +{
    +   int_in[0] = obj;
    +
    +   addr_in[0] = tree;
    +
    +   return ( crys_if(212) );
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]212 # Opcode der Funktion
    control+2control[1]1 # Einträge in int_in
    control+4control[2]0 # Einträge in int_out
    control+6control[3]1 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_inint_in[0]obj
    addr_inaddr_in[0]tree
    +
    + + +
    + +

    8.6.2 edit_create

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Edit Object Create« - erstellt ein Editobjekt. +
      +
    AES-Nummer: 210 +
      +
    Deklaration: void *edit_create ( void ) +
      +
    Beschreibung: Der entsprechende Deskriptor wird angelegt (Speicher wird +reserviert), aber der Editor ist noch nicht geöffnet. Es können +jetzt verschiedene Einstellungen über edit_set_xxx geändert werden. +Die Default-Einstellungen sind: +
      +
    Systemzeichensatz, 10 pt +
    Schwarz auf Weiß +
    Kein Zeilenumbruch +
    Tabulatorweite 64 Pixel +
      +
    Ergebnis: Die Funktion liefert einen Zeiger auf einen Deskriptor des +Editobjektes zurück, oder im Fehlerfall den Wert NULL. Der Deskriptor +muss anschließend in der Komponente ob_spec der +OBJECT-Struktur gespeichert werden. +
      +
    Verfügbar: ab MagiC 5.20 mittels SharedLibrary +
      +
    Gruppe: Editobjekt-Funktionen +
      +
    Querverweis: Binding +
      + +
    + +

    8.6.2.1 Bindings für edit_create

    + + + + + + + + + +
    C: void *edit_create ( void ) +
      +
    Umsetzung: +
      +
    void *edit_create ( void )
    +{
    +    crys_if(210);
    +
    +    return ( addr_out[0] );
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]210 # Opcode der Funktion
    control+2control[1]0 # Einträge in int_in
    control+4control[2]0 # Einträge in int_out
    control+6control[3]0 # Einträge in addr_in
    control+8control[4]1 # Einträge in addr_out
    addr_outaddr_out[0]Return-Wert
    +
    + + +
    + +

    8.6.3 edit_cursor

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Edit Object Cursor« - schaltet den Cursor eines Editobjektes +ein oder aus. +
      +
    AES-Nummer: 214 +
      +
    Deklaration: int16_t edit_cursor ( OBJECT *tree, int16_t obj, int16_t whdl, +int16_t show ); +
      +
    Beschreibung: +
      + + + + + + + + + + + + + + + + + + +
    Parameter Bedeutung +
        +
    tree RSC-Baum des Objekts +
    obj Objektnummer +
    whdl Fenster-Handle oder -1 +
    show Der Cursor wird eingeschaltet (1), ausgeschaltet (0) oder +abgefragt (-1). + +
    + +
    Der Aufruf kann geschachtelt werden. +
      +
    Ergebnis: Rückgabewert ist der Cursor-Aus-Zähler. +
      +
    Verfügbar: ab MagiC 5.20 mittels SharedLibrary +
      +
    Gruppe: Editobjekt-Funktionen +
      +
    Querverweis: Binding +
      + +
    + +

    8.6.3.1 Bindings für edit_cursor

    + + + + + + + + + +
    C: int16_t edit_cursor ( OBJECT *tree, int16_t obj, int16_t whdl, +int16_t show ); +
      +
    Umsetzung: +
      +
    int16_t edit_cursor ( OBJECT *tree, int16_t obj, int16_t whdl,
    +                   int16_t show )
    +{
    +   addr_in[0] = tree;
    +
    +   int_in[0]  = obj;
    +   int_in[1]  = whdl;
    +   int_in[2]  = show;
    +
    +   crys_if( 214 );
    +
    +   return ( int_out[0] );
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]214 # Opcode der Funktion
    control+2control[1]3 # Einträge in int_in
    control+4control[2]1 # Einträge in int_out
    control+6control[3]1 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_inint_in[0]obj
    int_in+2int_in[1]whdl
    int_in+2int_in[2]show
    addr_inaddr_in[0]tree
    int_outint_out[0]Return-Wert
    +
    + + +
    + +

    8.6.4 edit_delete

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Edit Object Delete« - entfernt ein Editobjekt aus dem +Speicher. +
      +
    AES-Nummer: 213 +
      +
    Deklaration: void edit_delete ( void *editinfo ); +
      +
    Beschreibung: Der Deskriptor editinfo wird freigegeben. Soll das +Objekt weiter verwendet werden, muß der Objekttyp auf G_BOX +zurückgesetzt werden. +
      +
    Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
      +
    Verfügbar: ab MagiC 5.20 mittels SharedLibrary +
      +
    Gruppe: Editobjekt-Funktionen +
      +
    Querverweis: Binding +
      + +
    + +

    8.6.4.1 Bindings für edit_delete

    + + + + + + + + + +
    C: void edit_delete ( void *editinfo ); +
      +
    Umsetzung: +
      +
    void edit_delete ( void *editinfo )
    +{
    +   addr_in[0] = editinfo;
    +
    +   crys_if( 213 );
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]213 # Opcode der Funktion
    control+2control[1]0 # Einträge in int_in
    control+4control[2]0 # Einträge in int_out
    control+6control[3]1 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    addr_inaddr_in[0]editinfo
    +
    + + +
    + +

    8.6.5 edit_evnt

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Edit Object Event« - übernimmt die Bearbeitung eines +Editobjektes. +
      +
    AES-Nummer: 215 +
      +
    Deklaration: int16_t edit_evnt ( OBJECT *tree, int16_t obj, int16_t whdl, +EVNT *events, int32_t *errcode ); +
      +
    Beschreibung: Events, d.h. Mausklicks und Tasten, werden an das Edit-Objekt +übermittelt und von diesem ggf. verarbeitet. Wenn ein Ereignis +verarbeitet wurde, wird das entsprechende Bit in der EVENT-Struktur +gelöscht. +
      + + + + + + + + + + + + + + + + + + + + + +
    Parameter Bedeutung +
        +
    tree RSC-Baum des Objekts +
    obj Objektnummer +
    whdl Fenster-Handle oder -1 +
    events EVENT-Struktur wie bei wdlg_evnt, fnts_evnt. Die Events werden +vom Dialog verarbeitet, wenn sie für das zugehörige Fenster bestimmt +sind. +
    errcode Fehlercode (-200 = Textpuffer voll) + +
    + +
    Ergebnis: Die Funktion liefert im Fehlerfall den Wert 0 zurück. Der +genaue Fehlercode wird in diesem Fall in der Variablen errcode +abgelegt. +
      +
    Verfügbar: ab MagiC 5.20 mittels SharedLibrary +
      +
    Gruppe: Editobjekt-Funktionen +
      +
    Querverweis: Binding   Tastaturcodes +
      + +
    + +

    8.6.5.1 Bindings für edit_evnt

    + + + + + + + + + +
    C: int16_t edit_evnt ( OBJECT *tree, int16_t obj, int16_t whdl, +EVNT *events, int32_t *errcode ); +
      +
    Umsetzung: +
      +
    int16_t edit_evnt ( OBJECT *tree, int16_t obj, int16_t whdl,
    +                 EVNT *events, int32_t *errcode )
    +{
    +   int_in[0]  = obj;
    +   int_in[1]  = whdl;
    +
    +   addr_in[0] = tree;
    +   addr_in[1] = events;
    +
    +   int_out[1] = 0;          /* für alte SLB */
    +   int_out[2] = 0;          /* für alte SLB */
    +
    +   crys_if( 215 )
    +
    +   *errcode = int_out[1..2];
    +
    +
    +   return ( int_out[0] );
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]215 # Opcode der Funktion
    control+2control[1]2 # Einträge in int_in
    control+4control[2]3 # Einträge in int_out
    control+6control[3]2 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_inint_in[0]obj
    int_in+2int_in[1]whdl
    addr_inaddr_in[0]tree
    addr_in+4addr_in[1]events
    int_outint_out[0]Retrurn-Wert
    int_out+2int_out[1..2]errcode
    +
    + + +
    + +

    Der Fehlercode errcode ist erst ab Version 7 vorhanden, +das Binding sollte dafür sorgen, daß alte SLB-Versionen immer Nullen +liefern. Umgekehrt erkennen neue SLB-Versionen per contrl[2], ob ein +Fehlercode angefordert wurde. +

    +

    8.6.6 edit_get_buf

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Edit Object Get Buffer« - ermittelt den aktuellen Text eines +Editobjektes. +
      +
    AES-Nummer: 216 (Unterfunktion 0) +
      +
    Deklaration: int16_t edit_get_buf ( OBJECT *tree, int16_t obj, int8_t **buf, +int32_t *buflen, int32_t *txtlen ); +
      +
    Beschreibung: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    ParameterBedeutung
    treeRSC-Baum des Objekts
    objObjektnummer
    bufAdresse des Puffers
    buflenPuffer-Länge
    txtlenaktuelle Textlänge ohne EOS
    +
    + +
    Ergebnis: Die Funktion liefert bei erfolgreicher Ausführung den Wert 1 +bzw. im Fehlerfall den Wert 0 zurück. +
      +
    Verfügbar: ab MagiC 5.20 mittels SharedLibrary +
      +
    Gruppe: Editobjekt-Funktionen +
      +
    Querverweis: Binding +
      + +
    + +

    8.6.6.1 Bindings für edit_get_buf

    + + + + + + + + + +
    C: int16_t edit_get_buf ( OBJECT *tree, int16_t obj, int8_t **buf, +int32_t *buflen, int32_t *txtlen ); +
      +
    Umsetzung: +
      +
    int16_t edit_get_buf ( OBJECT *tree, int16_t obj,
    +                       int8_t **buf,
    +                       int32_t *buflen, int32_t *txtlen )
    +{
    +   int_in[0]  = obj;
    +   int_in[1]  = 0;      /* Subcode für Funktion */
    +
    +   addr_in[0] = tree;
    +
    +   crys_if( 216 );
    +
    +   *buflen = int_out[1..2];
    +   *txtlen = int_out[3..4];
    +
    +   *buf = addr_out[0];
    +
    +   return ( int_out[0] );
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]216 # Opcode der Funktion
    control+2control[1]2 # Einträge in int_in
    control+4control[2]5 # Einträge in int_out
    control+6control[3]1 # Einträge in addr_in
    control+8control[4]1 # Einträge in addr_out
    int_inint_in[0]obj
    int_in+2int_in[1]0 # Sub-Opcode
    addr_inaddr_in[0]tree
    int_outint_out[0]Return-Wert
    int_out+2int_out[1..2]buflen
    int_out+6int_out[3..4]txtlen
    addr_outaddr_out[0]buf
    +
    + + +
    + +

    8.6.7 edit_get_colour

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Edit Object Get Colour« - ermittelt die Farbeinstellungen +eines Editobjektes. +
      +
    AES-Nummer: 216 (Unterfunktion 2) +
      +
    Deklaration: int16_t edit_get_colour ( OBJECT *tree, int16_t obj, int16_t +*tcolour, int16_t *bcolour ); +
      +
    Beschreibung: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + +
    ParameterBedeutung
    treeRSC-Baum des Objekts
    objObjektnummer
    tcolourTextfarbe
    bcolourHintergrundfarbe
    +
    + +
    Ergebnis: Die Funktion liefert bei erfolgreicher Ausführung den Wert 1 +und im Fehlerfall den Wert 0 zurück. +
      +
    Verfügbar: ab MagiC 5.20 mittels SharedLibrary +
      +
    Gruppe: Editobjekt-Funktionen +
      +
    Querverweis: Binding +
      + +
    + +

    8.6.7.1 Bindings für edit_get_colour

    + + + + + + + + + +
    C: int16_t edit_get_colour ( OBJECT *tree, int16_t obj, int16_t +*tcolour, int16_t *bcolour ); +
      +
    Umsetzung: +
      +
    int16_t edit_get_colour ( OBJECT *tree, int16_t obj,
    +                          int16_t *tcolour, int16_t  *bcolour )
    +{
    +   int_in[0]  = obj;
    +   int_in[1]  = 2;      /* Subcode für Funktion */
    +
    +   addr_in[0] = tree;
    +
    +   crys_if( 216 );
    +
    +   *tcolour = int_out[1];
    +   *bcolour = int_out[2];
    +
    +   return ( int_out[0] );
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]216 # Opcode der Funktion
    control+2control[1]2 # Einträge in int_in
    control+4control[2]3 # Einträge in int_out
    control+6control[3]1 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_inint_in[0]obj
    int_in+2int_in[1]2 # Sub-Opcode
    addr_inaddr_in[0]tree
    int_outint_out[0]Return-Wert
    int_out+2int_out[1]tcolour
    int_out+4int_out[2]bcolour
    +
    + + +
    + +

    8.6.8 edit_get_cursor

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Edit Object Get Cursor« - ermittelt die Position des Cursors +innerhalb eines Editobjektes. +
      +
    AES-Nummer: 216 (Unterfunktion 4) +
      +
    Deklaration: int16_t edit_get_cursor ( OBJECT *tree, int16_t obj, int8_t +**cursorpos ); +
      +
    Beschreibung: +
      +

    +
    + + + + + + + + + + + + + + + + +
    ParameterBedeutung
    treeRSC-Baum des Objekts
    objObjektnummer
    cursorposCursorposition im Text
    +
    + +
    Ergebnis: Die Funktion liefert bei erfolgreicher Ausführung den Wert 1 +und im Fehlerfall den Wert 0 zurück. +
      +
    Verfügbar: ab MagiC 5.20 mittels SharedLibrary +
      +
    Gruppe: Editobjekt-Funktionen +
      +
    Querverweis: Binding +
      + +
    + +

    8.6.8.1 Bindings für edit_get_cursor

    + + + + + + + + + +
    C: int16_t edit_get_cursor ( OBJECT *tree, int16_t obj, int8_t +**cursorpos ); +
      +
    Umsetzung: +
      +
    int16_t edit_get_cursor ( OBJECT *tree, int16_t obj,
    +                          int8_t **cursorpos )
    +{
    +   int_in[0]  = obj;
    +   int_in[1]  = 4;      /* Subcode für Funktion */
    +
    +   addr_in[0] = tree;
    +
    +   crys_if( 216 );
    +
    +   *cursorpos = addr_out[0];
    +
    +   return ( int_out[0] );
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]216 # Opcode der Funktion
    control+2control[1]2 # Einträge in int_in
    control+4control[2]1 # Einträge in int_out
    control+6control[3]1 # Einträge in addr_in
    control+8control[4]1 # Einträge in addr_out
    int_inint_in[0]obj
    int_in+2int_in[1]4 # Sub-Opcode
    addr_inaddr_in[0]tree
    int_outint_out[0]Return-Wert
    addr_outaddr_out[0]cursorpos
    +
    + + +
    + +

    8.6.9 edit_get_dirty

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Edit Object Get Dirtyflag« - testet, ob der Inhalt eines +Editobjektes verändert worden ist. +
      +
    AES-Nummer: 216 (Unterfunktion 7) +
      +
    Deklaration: int16_t edit_get_dirty ( OBJECT *tree, int16_t obj ); +
      +
    Beschreibung: Hiermit kann ermittelt werden, ob der Text zwischenzeitlich +geändert wurde. Das Flag kann mit edit_set_dirty oder edit_set_buf +wieder zurückgesetzt werden. +
      +

    +
    + + + + + + + + + + + + +
    ParameterBedeutung
    treeRSC-Baum des Objekts
    objObjektnummer
    +
    + +
    Ergebnis: Die Funktion liefert den Wert 1 wenn der Text verändert wurde +und sonst 0. +
      +
    Verfügbar: ab MagiC 5.20 mittels SharedLibrary +
      +
    Gruppe: Editobjekt-Funktionen +
      +
    Querverweis: Binding +
      + +
    + +

    8.6.9.1 Bindings für edit_get_dirty

    + + + + + + + + + +
    C: int16_t edit_get_dirty ( OBJECT *tree, int16_t obj ); +
      +
    Umsetzung: +
      +
    int16_t edit_get_dirty ( OBJECT *tree, int16_t obj )
    +{
    +   int_in[0]  = obj;
    +   int_in[1]  = 7;      /* Subcode für Funktion */
    +
    +   addr_in[0] = tree;
    +
    +   crys_if( 216 );
    +
    +   return ( int_out[0] );
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]216 # Opcode der Funktion
    control+2control[1]2 # Einträge in int_in
    control+4control[2]1 # Einträge in int_out
    control+6control[3]1 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_inint_in[0]obj
    int_in+2int_in[1]7 # Sub-Opcode
    addr_inaddr_in[0]tree
    int_outint_out[0]Return-Wert
    +
    + + +
    + +

    8.6.10 edit_get_font

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Edit Object Get Font« - ermittelt den Zeichensatz eines +Editobjektes. +
      +
    AES-Nummer: 216 (Unterfunktion 3) +
      +
    Deklaration: int16_t edit_get_font ( OBJECT *tree, int16_t obj, int16_t +*fontID, int16_t *fontH, int16_t *fontPix, int16_t *mono ); +
      +
    Beschreibung: +
      + + + + + + + + + + + + + + + + + + + + + + + + +
    Parameter Bedeutung +
        +
    tree RSC-Baum des Objekts +
    obj Objektnummer +
    fontID Zeichensatz-ID +
    fontH Höhe für vst_point +
    fontPix 0=Punkt 1=Pixel +
    Ist erst ab Version 8 (3.5.98) der SLB verfügbar. +
    mono Flag für äquidistanten Zeichensatz + +
    + +
    Ergebnis: Die Funktion liefert bei erfolgreicher Ausführung den Wert 1 +und im Fehlerfall den Wert 0 zurück. +
      +
    Verfügbar: ab MagiC 5.20 mittels SharedLibrary +
      +
    Gruppe: Editobjekt-Funktionen +
      +
    Querverweis: Binding +
      + +
    + +

    8.6.10.1 Bindings für edit_get_font

    + + + + + + + + + +
    C: int16_t edit_get_font ( OBJECT *tree, int16_t obj, int16_t +*fontID, int16_t *fontH, int16_t *fontPix, int16_t *mono ); +
      +
    Umsetzung: +
      +
    int16_t edit_get_font ( OBJECT *tree, int16_t obj,
    +                        int16_t *fontID, int16_t *fontH,
    +                        int16_t *fontPix, int16_t *mono )
    +{
    +   int_in[0]  = obj;
    +   int_in[1]  = 3;      /* Subcode für Funktion */
    +
    +   addr_in[0] = tree;
    +
    +   int_out[4] = 0;      /* für alte SLB         */
    +
    +   crys_if( 216 );
    +
    +   *fontID  = int_out[1];
    +   *fontH   = int_out[2];
    +   *mono    = int_out[3];
    +   *fontPix = int_out[4];
    +
    +   return ( int_out[0] );
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]216 # Opcode der Funktion
    control+2control[1]2 # Einträge in int_in
    control+4control[2]5 # Einträge in int_out
    control+6control[3]1 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_inint_in[0]obj
    int_in+2int_in[1]3 # Sub-Opcode
    addr_inaddr_in[0]tree
    int_outint_out[0]Return-Wert
    int_out+2int_out[1]fontID
    int_out+4int_out[2]fontH
    int_out+6int_out[3]mono
    int_out+8int_out[4]fontPix
    +
    + + +
    + +

    8.6.11 edit_get_format

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Edit Object Get Format« - ermittelt die Formatierung in +einem Editobjekt. +
      +
    AES-Nummer: 216 (Unterfunktion 1) +
      +
    Deklaration: int16_t edit_get_format ( OBJECT *tree, int16_t obj, int16_t +*tabwidth, int16_t *autowrap ); +
      +
    Beschreibung: +
      + + + + + + + + + + + + + + + + + + +
    Parameter Bedeutung +
        +
    tree RSC-Baum des Objekts +
    obj Objektnummer +
    tabwidth Tabulatorweite +
    autowrap > 0: Pixelbreite für autom. Zeilenumbruch (i.a. == +Objektbreite) +
    = 0: kein Umbruch, sondern horiz. Scrolling + +
    + +
    Ergebnis: Die Funktion liefert bei erfolgreicher Ausführung den Wert 1 +und im Fehlerfall den Wert 0 zurück. +
      +
    Verfügbar: ab MagiC 5.20 mittels SharedLibrary +
      +
    Gruppe: Editobjekt-Funktionen +
      +
    Querverweis: Binding +
      + +
    + +

    8.6.11.1 Bindings für edit_get_format

    + + + + + + + + + +
    C: int16_t edit_get_format ( OBJECT *tree, int16_t obj, int16_t +*tabwidth, int16_t *autowrap ); +
      +
    Umsetzung: +
      +
    int16_t edit_get_format ( OBJECT *tree, int16_t obj,
    +                          int16_t *tabwidth,
    +                          int16_t *autowrap )
    +{
    +   int_in[0]  = obj;
    +   int_in[1]  = 1;      /* Subcode für Funktion */
    +
    +   addr_in[0] = tree;
    +
    +   crys_if( 216 );
    +
    +   *tabwidth  = int_out[1];
    +   *autowrap  = int_out[2];
    +
    +   return ( int_out[0] );
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]216 # Opcode der Funktion
    control+2control[1]2 # Einträge in int_in
    control+4control[2]3 # Einträge in int_out
    control+6control[3]1 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_inint_in[0]obj
    int_in+2int_in[1]1 # Sub-Opcode
    addr_inaddr_in[0]tree
    int_outint_out[0]Return-Wert
    int_out+2int_out[1]tabwidth
    int_out+4int_out[2]autowrap
    +
    + + +
    + +

    8.6.12 edit_get_pos

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Edit Object Get ?« - ermittelt wichtige Informationen ? +eines Editobjektes. +
      +
    AES-Nummer: 216 (Unterfunktion 5) +
      +
    Deklaration: void edit_get_pos ( OBJECT *tree, int16_t obj, int16_t +*xscroll, int32_t *yscroll, int8_t **cyscroll, int8_t **cursorpos, +int16_t *cx, int16_t *cy ); +
      +
    Beschreibung: +
      +
    Was genau die Funktion bewirkt ist unbekannt, da sie nur im +Binding mt_edit.c auftaucht. +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ParameterBedeutung
    treeRSC-Baum des Objekts
    objObjektnummer
    xscroll 
    yscroll 
    cyscroll 
    cursorpos 
    cx 
    cy 
    +
    + +
    Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
      +
    Verfügbar: ab MagiC 5.20 mittels SharedLibrary +
      +
    Gruppe: Editobjekt-Funktionen +
      +
    Querverweis: Binding +
      + +
    + +

    8.6.12.1 Bindings für edit_get_pos

    + + + + + + + + + +
    C: void edit_get_pos ( OBJECT *tree, int16_t obj, int16_t +*xscroll, int32_t *yscroll, int8_t **cyscroll, int8_t **cursorpos, +int16_t *cx, int16_t *cy ); +
      +
    Umsetzung: +
      +
    void edit_get_pos ( OBJECT *tree, int16_t obj,
    +                    int16_t *xscroll, int32_t *yscroll,
    +                    int8_t **cyscroll, int8_t **cursorpos,
    +                    int16_t *cx, int16_t *cy )
    +{
    +   int_in[0]  = obj;
    +   int_in[1]  = 5;      /* Subcode für Funktion */
    +
    +   addr_in[0] = tree;
    +
    +   crys_if( 216 );
    +
    +   *xscroll = int_out[1];
    +   *yscroll = int_out[2..3];
    +   *cx      = int_out[4];
    +   *cy      = int_out[5];
    +
    +   *cyscroll  = addr_out[0];
    +   *cursorpos = addr_out[1];
    +
    +   return;
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]216 # Opcode der Funktion
    control+2control[1]2 # Einträge in int_in
    control+4control[2]6 # Einträge in int_out
    control+6control[3]1 # Einträge in addr_in
    control+8control[4]2 # Einträge in addr_out
    int_inint_in[0]obj
    int_in+2int_in[1]5 # Sub-Opcode
    addr_inaddr_in[0]tree
    int_outint_out[0]undefiniert
    int_out+2int_out[1]xscroll
    int_out+4int_out[2..3]yscroll
    int_out+8int_out[4]cx
    int_out+10int_out[5]cy
    addr_outaddr_out[0]cyscroll
    addr_out+4addr_out[1]cursorpos
    +
    + + +
    + +

    8.6.13 edit_get_scrollinfo

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Edit Object Get Scrollinformation« - ermittelt wichtige +Informationen für die Scrollbalken eines Editobjektes. +
      +
    AES-Nummer: 216 (Unterfunktion 9) +
      +
    Deklaration: void edit_get_scrollinfo ( OBJECT *tree, int16_t obj, int32_t +*nlines, int32_t *yscroll, int16_t *yvis, int16_t *yval, int16_t +*ncols, int16_t *xscroll, int16_t *xvis ); +
      +
    Beschreibung: +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Parameter Bedeutung +
        +
    tree RSC-Baum des Objekts +
    obj Objektnummer +
    nlines Anzahl Zeilen im Text +
    yscroll erste sichtbare Zeile +
    yvis Anzahl max. sichtbarer Zeilen +
    yval Anzahl momentan sichtbarer Zeilen +
    ncols Anzahl Spalten oder -1 (unbekannt) +
    xscroll horiz. Scroll-Offset in Pixeln +
    xvis Anzahl sichtbarer Spalten (in Pixeln) + +
    + +
    Diese Informationen werden benötigt, um horizontale und +vertikale Scrollbalken einzustellen. Da das Edit-Objekt für jede +einzelne Zeile ein vq_extend() machen müßte, und zwar bei jeder +Änderung einer Zeile, wird die Anzahl Spalten momentan nicht +bestimmt, der Aufruf liefert -1. MGEDIT nimmt hier einfach eine feste +Breite an, wie dies andere Programme, z.B. VIEW.PRG und PC.PRG +ebenfalls tun. +
      +
    yval ist immer kleiner oder gleich yvis. Falls +der Text weniger als yvis Zeilen hat, ist yval immer +kleiner. +
      +
    Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
      +
    Verfügbar: ab MagiC 5.20 mittels SharedLibrary +
      +
    Gruppe: Editobjekt-Funktionen +
      +
    Querverweis: Binding +
      + +
    + +

    8.6.13.1 Bindings für edit_get_scrollinfo

    + + + + + + + + + +
    C: void edit_get_scrollinfo ( OBJECT *tree, int16_t obj, int32_t +*nlines, int32_t *yscroll, int16_t *yvis, int16_t *yval, int16_t +*ncols, int16_t *xscroll, int16_t *xvis ); +
      +
    Umsetzung: +
      +
    void edit_get_scrollinfo ( OBJECT *tree, int16_t obj,
    +                           int32_t *nlines, int32_t *yscroll,
    +                           int16_t *yvis, int16_t *yval,
    +                           int16_t *ncols, int16_t *xscroll,
    +                           int16_t *xvis )
    +{
    +   int_in[0]  = obj;
    +   int_in[1]  = 9;      /* Subcode für Funktion */
    +
    +   addr_in[0] = tree;
    +
    +   crys_if( 216 );
    +
    +   *nlines   = int_out[1..2];
    +   *yscroll  = int_out[3..4];
    +   *yvis     = int_out[5];
    +   *yval     = int_out[6];
    +   *ncols    = int_out[7];
    +   *xscroll  = int_out[8];
    +   *xvis     = int_out[9];
    +
    +   return;
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]216 # Opcode der Funktion
    control+2control[1]2 # Einträge in int_in
    control+4control[2]10 # Einträge in int_out
    control+6control[3]1 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_inint_in[0]obj
    int_in+2int_in[1]9 # Sub-Opcode
    addr_inaddr_in[0]tree
    int_outint_out[0]undefiniert
    int_out+2int_out[1..2]nlines
    int_out+6int_out[3..4]yscroll
    int_out+10int_out[5]yvis
    int_out+11int_out[6]yval
    int_out+12int_out[7]ncols
    int_out+13int_out[8]xscroll
    int_out+14int_out[9]xvis
    +
    + +
    In der mt_edit.c wird control[2] mit 6 belegt (?). +
      + +
    + +

    8.6.14 edit_get_sel

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Edit Object Get Selection« - ermittelt den selektierten +Bereich innerhalb eines Editobjektes. +
      +
    AES-Nummer: 216 (Unterfunktion 8) +
      +
    Deklaration: void edit_get_sel ( OBJECT *tree, int16_t obj, int8_t **bsel, +int8_t **esel ); +
      +
    Beschreibung: +
      + + + + + + + + + + + + + + + + + + +
    Parameter Bedeutung +
        +
    tree RSC-Baum des Objekts +
    obj Objektnummer +
    bsel Beginn des selektierten Bereichs +
    esel hinter das Ende des selektierten Bereichs + +
    + +
    Wenn kein Bereich selektiert ist, ist bsel == NULL. +
      +
    Ergebnis: Die Funktion liefert bei erfolgreicher Ausführung den Wert 1 +und im Fehlerfall den Wert 0 zurück. +
      +
    Verfügbar: ab MagiC 5.20 mittels SharedLibrary +
      +
    Gruppe: Editobjekt-Funktionen +
      +
    Querverweis: Binding +
      + +
    + +

    8.6.14.1 Bindings für edit_get_sel

    + + + + + + + + + +
    C: void edit_get_sel ( OBJECT *tree, int16_t obj, int8_t **bsel, +int8_t **esel ); +
      +
    Umsetzung: +
      +
    void edit_get_sel ( OBJECT *tree, int16_t obj,
    +                    int8_t **bsel, int8_t **esel )
    +{
    +   int_in[0]  = obj;
    +   int_in[1]  = 8;      /* Subcode für Funktion */
    +
    +   addr_in[0] = tree;
    +
    +   crys_if( 216 );
    +
    +   *bsel  = addr_out[0];
    +   *esel  = addr_out[1];
    +
    +   return;
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]216 # Opcode der Funktion
    control+2control[1]2 # Einträge in int_in
    control+4control[2]0 # Einträge in int_out
    control+6control[3]1 # Einträge in addr_in
    control+8control[4]2 # Einträge in addr_out
    int_inint_in[0]obj
    int_in+2int_in[1]8 # Sub-Opcode
    addr_inaddr_in[0]tree
    addr_outaddr_out[0]bsel
    addr_out+4addr_out[1]esel
    +
    + +
    In der Original Doku ist diese Funktion mit der Rückgabe +int16_t definiert. In der mt_edit.c aber als void. +
      + +
    + +

    8.6.15 edit_open

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Edit Object Open« - öffnet ein Editobjekt. +
      +
    AES-Nummer: 211 +
      +
    Deklaration: int16_t edit_open ( OBJECT *tree, int16_t obj ); +
      +
    Beschreibung: +
      + + + + + + + + + + + + +
    Parameter Bedeutung +
        +
    tree RSC-Baum des Objekts +
    obj Objektnummer + +
    + +
    Für die Objektgröße wird ausgerechnet, wieviele Zeilen und +Spalten Text sichtbar sind, und entsprechende Zeiger angelegt. Dafür +wird Speicher angefordert. +
      +
    Ergebnis: Die Funktion liefert bei erfolgreicher Ausführung den Wert 1 +zurück. +
      +
    Verfügbar: ab MagiC 5.20 mittels SharedLibrary +
      +
    Gruppe: Editobjekt-Funktionen +
      +
    Querverweis: Binding +
      + +
    + +

    8.6.15.1 Bindings für edit_open

    + + + + + + + + + +
    C: int16_t edit_open ( OBJECT *tree, int16_t obj ); +
      +
    Umsetzung: +
      +
    int16_t edit_open ( OBJECT *tree, int16_t obj )
    +{
    +   int_in[0]  = obj;
    +
    +   addr_in[0] = tree;
    +
    +   crys_if( 211 );
    +
    +   return ( int_out [0] );
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]211 # Opcode der Funktion
    control+2control[1]1 # Einträge in int_in
    control+4control[2]1 # Einträge in int_out
    control+6control[3]1 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_inint_in[0]obj
    addr_inaddr_in[0]tree
    int_outint_out[0]Return-Wert
    +
    + + +
    + +

    8.6.16 edit_resized

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Edit Object Resized« - verändert die Größe eines +Editobjektes. +
      +
    AES-Nummer: 217 (Unterfunktion 6) +
      +
    Deklaration: int16_t edit_resized ( OBJECT *tree, int16_t obj, int16_t +*oldrh, int16_t *newrh ); +
      +
    Beschreibung: +
      + + + + + + + + + + + + + + + + + + +
    Parameter Bedeutung +
        +
    tree RSC-Baum des Objekts +
    obj Objektnummer +
    oldrh alte Netto-Höhe des Objekts +
    newrh neue Netto-Höhe des Objekts + +
    + +
    Das Editobjekt muß bei Veränderung der Objektgröße Speicher +freigeben und anfordern. Daher kann es im Extremfall vorkommen, daß +die Operation wegen Speichermangel fehlschlägt. Rückgabewert ist +dann 0. Damit das aufrufende Programm einen korrekten Redraw +ausführen kann, wird die vorherige und neue tatsächliche Höhe +zurückgegeben. Tatsächlich bedeutet hier die Anzahl sichtbarer +Zeilen, multipliziert mit der Zeilenhöhe, d.h. die Objekthöhe ohne +unbenutzten, unteren weißen Rand. +
      +
    Ergebnis: Die Funktion liefert bei erfolgreicher Ausführung den Wert 1 +und im Fehlerfall den Wert 0 zurück. +
      +
    Verfügbar: ab MagiC 5.20 mittels SharedLibrary +
      +
    Gruppe: Editobjekt-Funktionen +
      +
    Querverweis: Binding +
      + +
    + +

    8.6.16.1 Bindings für edit_resized

    + + + + + + + + + +
    C: int16_t edit_resized ( OBJECT *tree, int16_t obj, int16_t +*oldrh, int16_t *newrh ); +
      +
    Umsetzung: +
      +
    int16_t edit_resized ( OBJECT *tree, int16_t obj,
    +                       int16_t *oldrh, int16_t *newrh )
    +{
    +   int_in[0]  = obj;
    +   int_in[1]  = 6;      /* Subcode für Funktion */
    +
    +   addr_in[0] = tree;
    +
    +   crys_if( 217 );
    +
    +   *oldrh = int_out[1];
    +   *newrh = int_out[2];
    +
    +   return ( int_out [0] );
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]217 # Opcode der Funktion
    control+2control[1]2 # Einträge in int_in
    control+4control[2]3 # Einträge in int_out
    control+6control[3]1 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_inint_in[0]obj
    int_in+2int_in[1]6 # Sub-Opcode
    addr_inaddr_in[0]tree
    int_outint_out[0]Return-Wert
    int_out+2int_out[1]oldrh
    int_out+4int_out[4]newrh
    +
    + + +
    + +

    8.6.17 edit_scroll

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Edit Object Scroll« - scroll den Inhalt eines Editobjekts. +
      +
    AES-Nummer: 217 (Unterfunktion 9) +
      +
    Deklaration: int16_t edit_scroll ( OBJECT *tree, int16_t obj, int16_t whdl, +int32_t yscroll, int16_t xscroll ); +
      +
    Beschreibung: +
      + + + + + + + + + + + + + + + + + + + + + +
    Parameter Bedeutung +
        +
    tree RSC-Baum des Objekts +
    obj Objektnummer +
    whdl Fenster-Handle oder -1 +
    yscroll vertik. Scroll-Offset in Zeilen +
    xscroll horiz. Scroll-Offset in Pixeln + +
    + +
    Hiermit wird horizontal und vertikal absolut gescrollt. Dieser +Aufruf wird benötigt, wenn ein Scrollbalken oder -pfeil betätigt +wurde. Das Fenster-Handle wird benötigt, damit beim Scrollen die +Rechteckliste berücksichtigt werden kann. +
      +
    Ein Fehlercode wird zurückgegeben, wenn die Anzahl der Zeilen +überschritten wurde. +
      +
    Ergebnis: Die Funktion liefert bei erfolgreicher Ausführung den Wert 1 +und im Fehlerfall den Wert 0 zurück. +
      +
    Verfügbar: ab MagiC 5.20 mittels SharedLibrary +
      +
    Gruppe: Editobjekt-Funktionen +
      +
    Querverweis: Binding +
      + +
    + +

    8.6.17.1 Bindings für edit_scroll

    + + + + + + + + + +
    C: int16_t edit_scroll ( OBJECT *tree, int16_t obj, int16_t whdl, +int32_t yscroll, int16_t xscroll ); +
      +
    Umsetzung: +
      +
    int16_t edit_scroll ( OBJECT *tree, int16_t obj, int16_t whdl,
    +                      int32_t yscroll, int16_t xscroll )
    +{
    +   int_in[0]    = obj;
    +   int_in[1]    = 9;      /* Subcode für Funktion */
    +   int_in[2]    = whdl;
    +   int_in[3..4] = yscroll;
    +   int_in[5]    = xscroll;
    +
    +   addr_in[0] = tree;
    +
    +   crys_if( 217 );
    +
    +   return ( int_out [0] );
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]217 # Opcode der Funktion
    control+2control[1]6 # Einträge in int_in
    control+4control[2]1 # Einträge in int_out
    control+6control[3]1 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_inint_in[0]obj
    int_in+2int_in[1]9 # Sub-Opcode
    int_in+4int_in[2]whdl
    int_in+6int_in[3..4]yscroll
    int_in+10int_in[5]xscroll
    addr_inaddr_in[0]tree
    int_outint_out[0]Return-Wert
    +
    + + +
    + +

    8.6.18 edit_set_buf

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Edit Object Set Buffer« - ändert den Inhalt des Textpuffers +eines Editobjektes. +
      +
    AES-Nummer: 217 (Unterfunktion 0) +
      +
    Deklaration: void edit_set_buf ( OBJECT *tree, int16_t obj, int8_t *buf, +int32_t buflen ); +
      +
    Beschreibung: +
      + + + + + + + + + + + + + + + + + + +
    Parameter Bedeutung +
        +
    tree RSC-Baum des Objekts +
    obj Objektnummer +
    buf Textpuffer. Der Text liegt im DOS-Format mit CR/LF als +Zeilenende- Kennzeichen vor und wird mit einem Nullbyte abgeschlossen. +
    buflen Länge des Textpuffers inklusive abschließendem Nullbyte. + +
    + +
    Der Puffer wird dem Edit-Objekt zugewiesen, die Anzahl der +Zeilen wird bestimmt. Der Cursor wird an den Textanfang gesetzt. +Dieser Aufruf löscht das Dirty-Flag. +
      +
    Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
      +
    Verfügbar: ab MagiC 5.20 mittels SharedLibrary +
      +
    Gruppe: Editobjekt-Funktionen +
      +
    Querverweis: Binding +
      + +
    + +

    8.6.18.1 Bindings für edit_set_buf

    + + + + + + + + + +
    C: void edit_set_buf ( OBJECT *tree, int16_t obj, int8_t *buf, +int32_t buflen ); +
      +
    Umsetzung: +
      +
    void edit_set_buf ( OBJECT *tree, int16_t obj, int8_t *buf,
    +                    int32_t buflen )
    +{
    +   int_in[0]    = obj;
    +   int_in[1]    = 0;      /* Subcode für Funktion */
    +   int_in[2..3] = buflen;
    +
    +   addr_in[0] = tree;
    +   addr_in[1] = buf;
    +
    +   crys_if( 217 );
    +
    +   return;
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]217 # Opcode der Funktion
    control+2control[1]4 # Einträge in int_in
    control+4control[2]0 # Einträge in int_out
    control+6control[3]2 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_inint_in[0]obj
    int_in+2int_in[1]0 # Sub-Opcode
    int_in+4int_in[2..3]buflen
    addr_inaddr_in[0]tree
    addr_in+4addr_in[1]buf
    +
    + + +
    + +

    8.6.19 edit_set_colour

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Edit Object Set Colour« - verändert die Farben eines +Editobjektes. +
      +
    AES-Nummer: 217 (Unterfunktion 2) +
      +
    Deklaration: void edit_set_colour ( OBJECT *tree, int16_t obj, int16_t +tcolour, int16_t bcolour ); +
      +
    Beschreibung: +
      + + + + + + + + + + + + + + + + + + +
    Parameter Bedeutung +
        +
    tree RSC-Baum des Objekts +
    obj Objektnummer +
    tcolour Textfarbe +
    bcolour Hintergrundfarbe + +
    + +
    Wenn eines der beiden Attribute unverändert bleiben soll, kann +-1 übergeben werden. +
      +
    Wenn das Editobjekt bereits geöffnet wurde, ist bei Änderung +eines der Attributs i.a. ein Redraw auszulösen. +
      +
    Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
      +
    Verfügbar: ab MagiC 5.20 mittels SharedLibrary +
      +
    Gruppe: Editobjekt-Funktionen +
      +
    Querverweis: Binding +
      + +
    + +

    8.6.19.1 Bindings für edit_set_colour

    + + + + + + + + + +
    C: void edit_set_colour ( OBJECT *tree, int16_t obj, int16_t +tcolour, int16_t bcolour ); +
      +
    Umsetzung: +
      +
    void edit_set_colour ( OBJECT *tree, int16_t obj,
    +                       int16_t tcolour, int16_t bcolour )
    +{
    +   int_in[0]  = obj;
    +   int_in[1]  = 2;      /* Subcode für Funktion */
    +   int_in[2]  = tcolour;
    +   int_in[3]  = bcolour;
    +
    +   addr_in[0] = tree;
    +
    +   crys_if( 217 );
    +
    +   return;
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]217 # Opcode der Funktion
    control+2control[1]4 # Einträge in int_in
    control+4control[2]0 # Einträge in int_out
    control+6control[3]1 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_inint_in[0]obj
    int_in+2int_in[1]2 # Sub-Opcode
    int_in+4int_in[2]tcolour
    int_in+6int_in[3]bcolour
    addr_inaddr_in[0]tree
    +
    + + +
    + +

    8.6.20 edit_set_cursor

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Edit Object Set Cursor« - positioniert den Cursor eines +Editobjektes. +
      +
    AES-Nummer: 217 (Unterfunktion 4) +
      +
    Deklaration: void edit_set_cursor ( OBJECT *tree, int16_t obj, int8_t +*cursorpos ); +
      +
    Beschreibung: +
      + + + + + + + + + + + + + + + +
    Parameter Bedeutung +
        +
    tree RSC-Baum des Objekts +
    obj Objektnummer +
    cursorpos absolute Cursorposition + +
    + +
    Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
      +
    Verfügbar: ab MagiC 5.20 mittels SharedLibrary +
      +
    Gruppe: Editobjekt-Funktionen +
      +
    Querverweis: Binding +
      + +
    + +

    8.6.20.1 Bindings für edit_set_cursor

    + + + + + + + + + +
    C: void edit_set_cursor ( OBJECT *tree, int16_t obj, int8_t +*cursorpos ); +
      +
    Umsetzung: +
      +
    void edit_set_cursor ( OBJECT *tree, int16_t obj,
    +                       int8_t *cursorpos )
    +{
    +   int_in[0]  = obj;
    +   int_in[1]  = 4;      /* Subcode für Funktion */
    +
    +   addr_in[0] = tree;
    +   addr_in[1] = cursorpos;
    +
    +   crys_if( 217 );
    +
    +   return;
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]217 # Opcode der Funktion
    control+2control[1]2 # Einträge in int_in
    control+4control[2]0 # Einträge in int_out
    control+6control[3]2 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_inint_in[0]obj
    int_in+2int_in[1]4 # Sub-Opcode
    addr_inaddr_in[0]tree
    addr_in+4addr_in[1]cursorpos
    +
    + + +
    + +

    8.6.21 edit_set_dirty

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Edit Object Set Dirtyflag« - kennzeichnet ein Editobjekt als +verändert. +
      +
    AES-Nummer: 217 (Unterfunktion 7) +
      +
    Deklaration: void edit_set_dirty ( OBJECT *tree, int16_t obj, int16_t dirty +); +
      +
    Beschreibung: +
      + + + + + + + + + + + + + + + +
    Parameter Bedeutung +
        +
    tree RSC-Baum des Objekts +
    obj Objektnummer +
    dirty 0 oder 1 + +
    + +
    Hiermit kann das Dirty-Flag gelöscht werden, wenn der Text +abgespeichert wurde. +
      +
    Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
      +
    Verfügbar: ab MagiC 5.20 mittels SharedLibrary +
      +
    Gruppe: Editobjekt-Funktionen +
      +
    Querverweis: Binding +
      + +
    + +

    8.6.21.1 Bindings für edit_set_dirty

    + + + + + + + + + +
    C: void edit_set_dirty ( OBJECT *tree, int16_t obj, int16_t dirty +); +
      +
    Umsetzung: +
      +
    void edit_set_dirty ( OBJECT *tree, int16_t obj,
    +                      int16_t dirty )
    +{
    +   int_in[0]  = obj;
    +   int_in[1]  = 7;      /* Subcode für Funktion */
    +   int_in[2]  = dirty;
    +
    +   addr_in[0] = tree;
    +
    +   crys_if( 217 );
    +
    +   return;
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]217 # Opcode der Funktion
    control+2control[1]3 # Einträge in int_in
    control+4control[2]0 # Einträge in int_out
    control+6control[3]1 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_inint_in[0]obj
    int_in+2int_in[1]7 # Sub-Opcode
    int_in+4int_in[4]dirty
    addr_inaddr_in[0]tree
    +
    + + +
    + +

    8.6.22 edit_set_font

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Edit Object Set Font« - ändert den Zeichensatz eines +Editobjektes. +
      +
    AES-Nummer: 217 (Unterfunktion 3) +
      +
    Deklaration: void edit_set_font ( OBJECT *tree, int16_t obj, int16_t fontID, +int16_t fontH, int16_t fontPix, int16_t mono ); +
      +
    Beschreibung: +
      + + + + + + + + + + + + + + + + + + + + + + + + +
    Parameter Bedeutung +
        +
    tree RSC-Baum des Objekts +
    obj Objektnummer +
    fontID Zeichensatz-ID +
    fontH Zeichenhöhe in "Punkt" +
    fontPix 0=Punkt 1=Pixel (ab 3.5.98) +
    mono Flag "äquidistant" + +
    + +
    Wenn das Editobjekt bereits geöffnet wurde, ist bei Änderung +des Zeichensatzes i.a. ein Redraw auszulösen. +
      +
    Das Flag mono wird benötigt, um dem Editobjekt die +Möglichkeit zu geben, äquidistante Zeichensätze (mono = 1) +wesentlich schneller zu bearbeiten als proportionale Zeichensätze +(mono = 0). +
      +
    fontPix steht erst ab Version 8 der SLB zur Verfügung. +Ältere Versionen nehmen immer fontPix=0 an, d.h. verwenden +ausschließlich vst_point zum Einstellen der Zeichenhöhe. Die SLB +erkennt an contrl[1], ob fontPix übergeben wurde. Wenn nicht, wird 0 +angenommen. +
      +
    Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
      +
    Verfügbar: ab MagiC 5.20 mittels SharedLibrary +
      +
    Gruppe: Editobjekt-Funktionen +
      +
    Querverweis: Binding +
      + +
    + +

    8.6.22.1 Bindings für edit_set_font

    + + + + + + + + + +
    C: void edit_set_font ( OBJECT *tree, int16_t obj, int16_t fontID, +int16_t fontH, int16_t fontPix, int16_t mono ); +
      +
    Umsetzung: +
      +
    void edit_set_font ( OBJECT *tree, int16_t obj,
    +                     int16_t fontID, int16_t fontH,
    +                     int16_t fontPix, int16_t mono )
    +{
    +   int_in[0]  = obj;
    +   int_in[1]  = 3;      /* Subcode für Funktion */
    +   int_in[2]  = fontID;
    +   int_in[3]  = fontH;
    +   int_in[4]  = mono;
    +   int_in[5]  = fontPix;
    +
    +   addr_in[0] = tree;
    +
    +   crys_if( 217 );
    +
    +   return;
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]217 # Opcode der Funktion
    control+2control[1]6 # Einträge in int_in
    control+4control[2]0 # Einträge in int_out
    control+6control[3]1 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_inint_in[0]obj
    int_in+2int_in[1]3 # Sub-Opcode
    int_in+4int_in[2]fontID
    int_in+6int_in[3]fontH
    int_in+8int_in[4]mono
    int_in+10int_in[5]fontPix
    addr_inaddr_in[0]tree
    +
    + + +
    + +

    8.6.23 edit_set_format

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Edit Object Set Format« - ändert die Formatierung eines +Editobjektes. +
      +
    AES-Nummer: 217 (Unterfunktion 1) +
      +
    Deklaration: void edit_set_format ( OBJECT *tree, int16_t obj, int16_t +tabwidth, int16_t autowrap ); +
      +
    Beschreibung: +
      + + + + + + + + + + + + + + + + + + +
    Parameter Bedeutung +
        +
    tree RSC-Baum des Objekts +
    obj Objektnummer +
    tabwidth -1 oder Tabulatorbreite in Pixeln +
    autowrap  -1: nicht ändern +
    > 0: Pixelbreite für autom. Zeilenumbruch +
         (i.a. == Objektbreite) +
    = 0: kein Umbruch, sondern horiz. Scrolling + +
    + +
    Wenn eines der beiden Attribute unverändert bleiben soll, kann +-1 übergeben werden. +
      +
    Wenn das Editobjekt bereits geöffnet wurde, ist bei Änderung +eines der Attributs i.a. ein Redraw auszulösen. Ab Version 9 der SLB +wird bei Änderung der autowrap-Einstellung die Anzahl der +Zeilen neu berechnet. In älteren Versionen geschieht das nur bei +edit_set_buf. +
      +
    Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
      +
    Verfügbar: ab MagiC 5.20 mittels SharedLibrary +
      +
    Gruppe: Editobjekt-Funktionen +
      +
    Querverweis: Binding +
      + +
    + +

    8.6.23.1 Bindings für edit_set_format

    + + + + + + + + + +
    C: void edit_set_format ( OBJECT *tree, int16_t obj, int16_t +tabwidth, int16_t autowrap ); +
      +
    Umsetzung: +
      +
    void edit_set_format ( OBJECT *tree, int16_t obj,
    +                       int16_t tabwidth, int16_t autowrap )
    +{
    +   int_in[0]  = obj;
    +   int_in[1]  = 1;      /* Subcode für Funktion */
    +   int_in[2]  = tabwidth;
    +   int_in[3]  = autowrap;
    +
    +   addr_in[0] = tree;
    +
    +   crys_if( 217 );
    +
    +   return;
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]217 # Opcode der Funktion
    control+2control[1]4 # Einträge in int_in
    control+4control[2]0 # Einträge in int_out
    control+6control[3]1 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_inint_in[0]obj
    int_in+2int_in[1]1 # Sub-Opcode
    int_in+4int_in[2]tabwidth
    int_in+6int_in[3]autowrap
    addr_inaddr_in[0]tree
    +
    + + +
    + +

    8.6.24 edit_set_pos

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Edit Object Set ?« - setzt wichtige Informationen ? eines +Editobjektes. +
      +
    AES-Nummer: 217 (Unterfunktion 5) +
      +
    Deklaration: void edit_set_pos ( OBJECT *tree, int16_t obj, int16_t xscroll, +int32_t yscroll, int8_t *cyscroll, int8_t *cursorpos, int16_t cx, +int16_t cy ); +
      +
    Beschreibung: Was genau die Funktion bewirkt ist unbekannt, da sie nur im +Binding mt_edit.c auftaucht. +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ParameterBedeutung
    treeRSC-Baum des Objekts
    objObjektnummer
    xscroll 
    yscroll 
    cyscroll 
    cursorpos 
    cx 
    cy 
    +
    + +
    Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
      +
    Verfügbar: ab MagiC 5.20 mittels SharedLibrary +
      +
    Gruppe: Editobjekt-Funktionen +
      +
    Querverweis: Binding +
      + +
    + +

    8.6.24.1 Bindings für edit_set_pos

    + + + + + + + + + +
    C: void edit_set_pos ( OBJECT *tree, int16_t obj, int16_t xscroll, +int32_t yscroll, int8_t *cyscroll, int8_t *cursorpos, int16_t cx, +int16_t cy ); +
      +
    Umsetzung: +
      +
    void edit_set_pos ( OBJECT *tree, int16_t obj,
    +                    int16_t xscroll, int32_t yscroll,
    +                    int8_t *cyscroll, int8_t *cursorpos,
    +                    int16_t cx, int16_t cy )
    +{
    +   int_in[0]    = obj;
    +   int_in[1]    = 5;      /* Subcode für Funktion */
    +   int_in[2]    = xscroll;
    +   int_in[3..4] = yscroll;
    +   int_in[5]    = cx;
    +   int_in[6]    = cy;
    +
    +   addr_in[0] = tree;
    +   addr_in[1] = cyscroll;
    +   addr_in[2] = cursorpos;
    +
    +   crys_if( 217 );
    +
    +   return;
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]217 # Opcode der Funktion
    control+2control[1]7 # Einträge in int_in
    control+4control[2]0 # Einträge in int_out
    control+6control[3]3 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_inint_in[0]obj
    int_in+2int_in[1]5 # Sub-Opcode
    int_in+4int_in[2]xscroll
    int_in+6int_in[3..4]yscroll
    int_in+10int_in[5]cx
    int_in+12int_in[6]cy
    addr_inaddr_in[0]tree
    addr_in+4addr_in[1]cyscroll
    addr_in+8addr_in[2]cursorpos
    +
    + + +
    + +

    8.6.25 Verwendung G_EDIT-Objekt

    + +
      +
    • In der RSC-Datei wird eine G_BOX, weiß, ohne Rahmen +eingetragen +
    • +
    • Im Programm wird die SharedLib geladen +
    • +
    • Für jedes G_EDIT-Objekt: +
        +
      • Textpuffer anlegen. +
      • +
      • Editobjekt mit edit_create erzeugen. +
      • +
      • Objekttyp in G_EDIT ändern und ob_spec auf das Editobjekt +legen. +
      • +
      • mit edit_set_buf den Textpuffer zuweisen. +
      • +
      • Ggf. Einstellungen des Edit-Objekt per edit_set_xxx ändern. +
      • +
      • Edit-Objekt mit edit_open öffnen. +
      • +
      • Erst dann den Baum per objc_draw zeichnen. +
      • +
      + +
    • +
    • Um Tastaturcodes und Mausklicks an das Edit-Objekt zu +übergeben, muß man edit_evnt aufrufen. Die Syntax ist völlig analog +zu wdlg_evnt, fslx_evnt und fnts_evnt. +
    • +
    • Beim Schließen muß das Edit-Feld per edit_close geschlossen +werden, per edit_delete wird der Speicher für das Editfeld wieder +freigegeben. Es darf dann kein objc_draw mehr durchgeführt werden! +Ggf. den Objekttyp wieder auf G_BOX setzen. +
    • +
    + +

    Querverweise: Tastaturcodes von G_EDIT +

    +

    8.6.26 Tastaturcodes von G_EDIT

    +

    Folgend Tastaturcodes werden von G_EDIT ausgewertet: +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CursorCursorbewegung
    Ctrl-Cursor-hoch/runterScrollen
    Ctrl-Cursor-links/rechtsWortweise Cursor bewegen
    Shift-Cursor-links/rechtsCursor zum Zeilenanfang/-ende
    Esc(noch) nichts
    Einf(noch) nichts
    Shift-Einf(noch) nichts
    BackspaceZeichen links vom Cursor löschen
    DeleteZeichen rechts vom Cursor löschen
    Ctrl-Delete(noch) nichts
    HomeCursor an Textanfang
    Ende (MF-2) und
    Ende (Mac) und
    Shift-Clr/HomeTextende
    Bild hoch (Mac) und
    Shift-Cursor-hochCursor eine Seite hoch
    Bild runter (Mac) und
    Shift-Cursor-runterCursor eine Seite runter
    ^Aalles auswählen (seit 27.1.98)
    ^CBlock aufs Klemmbrett
    ^XBlock löschen und aufs Klemmbrett
    ^VKlemmbrett an Cursorposition einfügen
    +
    + +
    + +Home +AESAES +DruckdialogeDruckdialoge +EreignisverwaltungEreignisverwaltung + + diff --git a/de/emulators.html b/de/emulators.html new file mode 100644 index 000000000..ad40eac7a --- /dev/null +++ b/de/emulators.html @@ -0,0 +1,41 @@ + + + + + +Die Anleitung zum TOS: Emulatoren + + + + + + + + + +Home +Inhaltsverzeichnis +Veraltete XaAES-FunktionenVeraltete XaAES-Funktionen +MagiC Mac-SpezifikaMagiC Mac-Spezifika + +
    + +

    14 Emulatoren

    + +
    +
    + +Home +Inhaltsverzeichnis +Veraltete XaAES-FunktionenVeraltete XaAES-Funktionen +MagiC Mac-SpezifikaMagiC Mac-Spezifika + + diff --git a/de/emulators_magicmac.html b/de/emulators_magicmac.html new file mode 100644 index 000000000..ce9e129ff --- /dev/null +++ b/de/emulators_magicmac.html @@ -0,0 +1,1346 @@ + + + + + +Die Anleitung zum TOS: MagiC Mac-Spezifika + + + + + + + + + +Home +EmulatorenEmulatoren +EmulatorenEmulatoren +MagiC PC-SchnittstelleMagiC PC-Schnittstelle + +
    + +

    14.1 MagiC Mac-Spezifika

    +

    MagiC Mac ist eine Implementation des im Atari-Bereich bekannten +MagiC auf die Hardware der Apple (Power-) Macintosh Computer. Dieser +Abschnitt beschreibt die folgenden Punkte: +

    + + +

    Wer Fragen hat oder wer bestimmte Features für die +Atari-Mac-Schnittstelle vermißt, wende sich bitte an den Autor des +MagiC Mac-Kernels, bevor er an Internas herumbastelt, die bei der +nächsten MagiC Mac-Version dann vielleicht nicht mehr funktionieren. +

    +

    Querverweis: GEMDOS   BIOS   XBIOS   GEM +

    +

    14.1.1 Allgemeines zu MagiC Mac

    +

    Der Kern der 'Emulation' der Atari-Umgebung auf dem Macintosh +liegt in der Umprogrammierung der PMMU. Sowohl Atari- als auch +Macintosh-Programme gehen davon aus, daß sie in den untersten 2 KB +des Adreßraums bestimmte Variablen (die sog. Systemvariablen) +vorfinden. Wenn nun ein Atari-Programm läuft, erwartet es aber dort +andere Werte als z.B. das Mac-Betriebssystem. Der sog. Kernel von +MagiC Mac sorgt nun dafür, daß je nachdem, ob gerade eine Mac- oder +eine Atari-Routine läuft, die passenden Systemvariablen im unteren +Adreßbereich vorliegen. Dies geschieht durch entsprechende +Programmierung der PMMU, einem Coprozessor für die +Speicherverwaltung. +

    +

    So gibt es also zwei MMU-Modi: Den Mac- und den +Atari-Modus. Zwischen ihnen kann mittels zweier Routinen hin- und +hergeschaltet werden. Ausgehend davon, daß der Mac-Modus der normale +Modus ist, gibt es folgende Veränderungen beim Übergang in den +Atari-Modus: +

    +
      +
    • Ein Speicherbereich, der irgendwo auf dem Macintosh-Heap +alloziert wurde, wird ab Adresse $0 im Atari-Adreßraum eingeblendet. +Dieser Bereich ist zwischen 4 und 32KB lang und enthält garantiert +ausschließlich die Exception-Vektortabelle und die dokumentierten +Systemvariablen. +
        +

    • +
    • Der Adreßraum von $00FF8000 bis $00FFFFFF (und entsprechend +$FFFF8000 bis $FFFFFFFF) wird ausgeblendet. Dies ist beim Atari der +I/O-Adreßraum der normalerweise beim Macintosh nicht zur Verfügung +steht (dort ist beim Macintosh höchstens RAM). +
        +
      Damit Programme nicht irrtümlich diesen Adreßraum als RAM +ansprechen, falls beim Macintosh dort solches vorliegt, wird durch +diese Ausblendung jeder Zugriff zu einem Bus-Fehler führen. +Allerdings ist es möglich, daß spezielle Atari-kompatible Hardware +im Macintosh installiert wird, woraufhin dieser Adreßraum dann diese +Harware an den entsprechenden Stellen einblendet. Das heißt: +Ein Programm, das erkennt, daß es unter MagiC auf dem Mac läuft, +sollte nicht automatisch davon ausgehen, daß keine +Atari-Hardware im I/O-Bereich vorhanden ist, sondern sollte weiterhin +mit einem Testzugriff (durch Umlenken des Bus-Fehler-Vektors) prüfen, +ob Zugriffe auf die Bausteine möglich sind. +
        +

    • +
    • RAM, das weder zur TPA von MagiC, noch zum MagiC OS oder den +Kernel-Daten und -Routinen gehört, ist im Atari-Adreßraum nicht +vorhanden, d.h. Zugriffe außerhalb des speziell für Atari-Programme +reservierten Bereichs führen zu einem Bus-Fehler. Dies schützt +andere Macintosh-Applikationen besser vor fehlerhaften +Atari-Programmen. Dieser Schutz funktioniert allerdings nur +bei 68K-Rechnern, nicht bei PowerPCs! +
        +

    • +
    + +

    Querverweis: Programmstart und TPA +

    +

    14.1.2 MagiC Mac und Power-Macs

    +

    MagiC Mac läuft natürlich auch auf den neuen PCI-Maschinen von +Apple (Power Macintosh 7600, 8200, 8500 und 9500). Beim Einsatz +auf dieser Hardware sollten die folgenden Punkte beachtet werden: +

    +
      +
    • Die von MagiC nicht benutzten, aber im Mac-Adreßraum +vorhandenen Adreßbereiche können nicht ausgeblendet und +damit auch nicht zugriffsgeschützt werden. D.h., daß bei +Zugriffen außerhalb der TPA und dem Programm- und Heap-Bereich von +MagiC Mac keine Bus-Errors gemeldet werden, wie es bei den +68K-Rechnern der Fall ist. +
        +

    • +
    • Bei den PowerMac-Modellen seit Mitte 1995 wird der obere +Adreßbereich für PCI- Karten und/oder ROM verwendet. So erhält man +beim Zugriff auf den Atari-I/O-Bereich bei $FFFF8000-$FFFFFFFF +keinen Bus-Error sondern undefinierte Daten. Dies ist +leider nicht zu ändern. Es wird daher empfohlen, daß Programme nur +auf den I/O-Bereich bei $00FF8000-$00FFFFFF zugreifen, um entweder das +Vorhandensein von Bausteinen zu prüfen (indem ein Zugriff darauf +gemacht wird und geprüft wird, ob dabei ein Bus-Error auftritt) oder +mit der Hardware-Erweiterung McSTout arbeiten zu können für +den Fall, daß sie auch für die PCI-Macs verfügbar gemacht wird. +Programme können diesen Umstand ggf. an Bit 5 in Cookie.flags1 erkennen. +
        +

    • +
    + +

    Querverweis: Programmstart und TPA +

    +

    14.1.3 Cookies unter MagiC Mac

    +

    MagiC Mac unterstützt natürlich auch den Cookie-Jar, und legt +die folgenden Cookies an: +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Cookie Bedeutung in MagiC Mac +
        +
    _CPU enthält den Wert 20, 30 oder 40. Auf 68000-Rechnern läuft MM +nicht; bei PowerPC-Maschinen wird eine 68020 angezeigt. +
    _FDC $014D6163 - Die 3 letzten Bytes ergeben den Text 'Mac' +
    _FPU die üblichen Werte. Bei 68040 steht hier nur dann 8 drin, wenn +auch die zugehörige FPU-Software installiert ist. +
    _MCH keine Atari-kompatible Hardware vorhanden (-1). +
    _SND 0 +
    _VDO keine Atari-kompatible Video-Hardware vorhanden (-1). +
    MagX Analog zu MagiC. +
    MgMc Zeigt auf eine MgMcCookie-Struktur. +
    MNAM Zeiger auf Null-terminierten String mit dem Namen des Rechners. +Dieser dient nur zur Information für den Benutzer. +
    PMMU Null. Zeigt an, daß die MMU belegt ist und nicht von anderen +Programmen benutzt werden darf. + +
    + +

    Querverweis: Cookie- und XBRA-Liste +

    +

    14.1.4 Dateisysteme unter MagiC Mac

    +

    MagiC Mac erlaubt wie MagiC die Einbindung alternativer +Dateisysteme. Zur Zeit werden die folgenden Systeme unterstützt: +

    +
      +
    • FAT-Dateisysteme nach TOS-Konventionen: So können +Floppy-Disks sowie Hard-Disks im Atari-üblichen Format mit allen +TOS-Funktionen (GEMDOS, aber auch z.B. Rwabs) angesprochen werden. +
        +

    • +
    • Mac-Dateisysteme: Da diese keine FAT haben, ist der +Zugriff auf diese Laufwerke nur über GEMDOS, nicht jedoch über BIOS, +möglich. +
        +

    • +
    + +

    Das Mac-Dateisystem unter MagiC Mac: +

    +

    Da die GEMDOS-Funktionen meist direkt auf die +Mac-Dateisystemfunktionen abgebildet sind, können alle unter MacOS +benutzbaren Dateiformate auch unter MagiC Mac benutzt werden, d.h., +sobald man ein Laufwerk auf dem Mac 'mounten' kann, ist es oder ein +Ordnerinhalt davon auch als Laufwerk unter MM anmeldbar. Damit können +in der Regel auch CD-ROMs oder Netzwerklaufwerke ohne weitere Treiber +in MagiC Mac benutzt werden. MagiC Mac erlaubt z.B. auch das +Mac-typische Auswerfen von Diskette. +

    +

    Querverweis: XFS-Konzept in MagiC   Dpathconf +

    +

    14.1.5 Einschränkungen von MagiC Mac

    +

    MagiC Mac implementiert nicht alle Funktionen, die +MagiC für ATARIs bietet. AES, VDI & GEMDOS sind vollständig +implementiert, beim BIOS & XBIOS gibt es aber Einschränkungen. Es +ist jedoch möglich, daß durch Zusätze, wie McSTout oder +einen Sound-Treiber, einige der Funktionalitäten wiederhergestellt +werden. +

    +
      +
    • Nicht implementierte bzw. ignorierte Funktionen beim XBIOS: +
      Initmouse, Mfpint, Ikbdws, Jdisint, Jenabint, Giaccess, Offgibit, Ongibit, +Xbtimer, Dosound. +
        +

    • +
    + +

    Außerdem gibt es Einschränkungen bei einigen Funktionen, +hauptsächlich in Verbindung mit dem Dateisystem und den Devices: +

    +
      +
    • Das MIDI-Device ist z.Zt. nicht benutzbar, es sei denn, die +Hardware-Erweiterung McSTout mit MIDI-Option ist installiert. +Es kann auch sein, daß MIDI später über eine der seriellen +Schnittstellen des Macs realisiert wird, so daß man lediglich sagen +kann: Ob MIDI benutzbar ist, muß der Benutzer festlegen - ein +Programm kann das praktisch nicht selbst erkennen! Für Midiws() gilt +das gleiche. +
        +

    • +
    • Das IKBD-Device ist nicht vorhanden. +
        +

    • +
    • Liefert Getbpb() Null, kann es sein, daß eine Mac-formatierte +Disk einliegt, die sich dennoch mit den Dateifunktionen über +Laufwerk A: ansprechen läßt. +
        +

    • +
    • Liegt eine Mac-formatierte Disk im Floppy-Laufwerk, liefert +Rwabs() einen Fehler ("drive not ready"). Die Dateien auf +der Disk können ggf. dennoch mit den GEMDOS-Dateifunktionen +angesprochen werden. +
        +

    • +
    • Drvmap() liefert auch gesetzte Bits bei den Laufwerken, die +Mac-formatiert sind und somit nur über GEMDOS und nicht mit Rwabs() +ansprechbar sind. +
        +

    • +
    • Getrez() liefert immer 2 (ST-High), ist also unbrauchbar. +
        +

    • +
    • Setscreen() kann die phys. Adresse nur ändern, wenn der Benutzer +MagiC Mac im ST-Auflösungsemulationsmodus (z.B. ST-High) gestartet +hat. Um zu erkennen, ob dies der Fall ist, sollte man zuerst die Adr. +mit Setscreen() zu ändern versuchen und dann mit Physbase() ermitteln, ob +sich die Adresse ändern ließ. +
        +

    • +
    • Floprd(), Flopwr(), und Flopver() funktionieren nicht, wenn +Mac-formatierte Disks eingelegt sind (erst ab MM 1.2.2 implementiert). +Die Bad-Sector-Liste bei Flopver() meldet im Fehlerfall alle Sektoren +der Spur als defekt, da die genaue Spur nicht ermittelt werden kann. +
        +

    • +
    • Flopfmt() kann seit MM 1.2.2 Disks formatieren, aber nur 80 +Spuren, 2 Seiten und je nach eingelegter Disk 9 bzw. 18 Sektoren pro +Spur. Über den MgMc-Cookie kann hierzu ermittelt werden, was für +eine Disk (DD oder HD) sich im Laufwerk befindet. Nicht +wundern: Der Mac bietet nur eine Funktion, um alle Spuren auf +einmal zu formatieren. Deswegen wird das bei MM so gelöst, daß +bei Aufruf von Flopfmt() für Spur 0 (bzw. 79, je nachdem, wo +angefangen wird) gleich die ganze Disk formatiert wird und bei Aufruf +von Flopfmt für die restlichen Spuren nichts passiert, die Funktion +also sofort mit Fehlercode Null zurückkehrt. Auch ist es so, daß im +Fall eines Formatierproblems für alle Spuren ein Fehler gemeldet +wird. Die zu formatierende Disk muß folglich völlig in Ordnung sein. +
        +

    • +
    • Rsconf(): Die MPF-spezifischen Parameter werden ignoriert. +
        +

    • +
    • Puntaes() kennt mehrere Modi, MagiC Mac wird ggf. beendet. +
        +

    • +
    + +

    Querverweis: GEMDOS   BIOS   XBIOS   GEM +

    +

    14.1.6 Exceptions unter MagiC Mac

    +

    Ein Atari-Programm kann, wie auf einem echten Atari, die Exceptionvektoren +benutzen, sprich: umlenken. Allerdings darf das Programm dabei nur die +Exception-Vektoren im Adreßbereich zw. $0 und $400 benutzen, nicht +etwa die, auf die das VBR zeigt (denn es zeigt woanders hin!). Wer +sich daran nicht hält, kann Schwierigkeiten mit späteren Versionen +von MagiC Mac bekommen. Programme, die die PMMU benutzen, z.B. +OUTSIDE, können unter MagiC Mac nicht laufen. +

    +

    Folgende Atari-Interrupts werden z.Zt. vom Kernel +simuliert: +

    +
      +
    • $070: Autovektor-Interupt Level 4 (VBL). +
        +

    • +
    • $114: MFP-Interrupt 5 (200 Hz System-Timer). +
        +

    • +
    • $118: MFP-Interrupt 6 (IKBD). Allerdings wird hier nur das +Ereignis von Tastendrücken und Mausbewegungen simuliert, d.h., der +Interrupt-Handler erfährt die spezifische Art des Ereignisses auf +eine andere Art als beim Atari. +
        +

    • +
    + +

    Die Interrupts treten bedingt durch die Mac-Hardware jedoch +evtl. mit anderen Prioritäten auf; die Interrupt-Maske des SR +hat somit u.U. andere Werte als beim Atari. Der Vektor bei $400 +(etv_timer) wird natürlich vom MagiC OS auch angesprungen, als +Unterroutine vom Interrupt-Handler für MFP Intr. 5, ganz wie beim +Original-Atari auch. Ebenso kann sich ein Programm, das Maus- oder +Tastenereignisse erfahren möchte, über die XBIOS-Funktion Kbdvbase() +in die Ereignisvektoren ganz wie beim Atari einhängen. +

    +

    Noch ein wichtiger Hinweis zu Interrupts: Beim Mac muß, +damit Tastatur, Maus und Timer funktionieren, die Interrupt-Maske (im +CPU-Register SR) stets auf Null stehen. Beim Atari dagegen steht sie +normalerweise auf drei. Programme, die nun Code, wie z.B. MOVE +#$2300,SR enthalten, werden einen Macintosh in einen +Schlafzustand versetzen, bei dem nur noch ein Reset hilft. Wer +also die Interrupt-Maske nur zeitweise verändert sollte dies so +machen (funktioniert auf Atari und Mac gleichermaßen): +

    +
      MOVE SR,-(A7)    ; altes SR merken
    +  ORI  #$0700,SR   ; alle Interrupts für einen kritischen Zugriff sperren
    +  ...
    +  MOVE (A7)+,SR    ; am Ende altes SR wiederherstellen
    +
    +

    Wer unbedingt den Rechner wieder in einen Grundzustand bringen +will, sollte nicht MOVE #$2300,SR sondern besser MOVE +#$2000,SR benutzen. Auf dem Atari wird dann in kürzester Zeit von der +HBL-Interrupt-Routine das SR auf $2300 hochgesetzt. So kommt man auf +beiden Maschinen mit dem selben Code zum Ziel. +

    +

    Werden Interrupt- oder andere asynchrone Routinen mittels +MacOS-Funktionen installiert und sollen dann diese Funktionen vom Mac- +in den Atari-Modus schalten, sind einige Dinge zu beachten, die weiter +unten genauer beschrieben sind: +

    +
      +
    • Setzen eines Semaphores (s. intrLock/intrUnlock). +
        +

    • +
    • Abfrage, ob zu dem Zeitpunkt eine Atari-Modusumschaltung +überhaupt möglich ist (s. atariModePossible). +
        +

    • +
    • Deinstallation der Routine beim Beenden von MagiC Mac (s. +macAppSwitch). +
        +

    • +
    • Vor der Umschaltung in den Atari-Modus muß sichergestellt +sein, daß der Stack Pointer (SP) innerhalb des Atari-Adreßraums +befindet, weil es sonst zum doppelten Bus-Error kommt und die CPU +stehen bleibt. +
        +
      Merke: 1. Es kann sein, daß der Aufruf der Routine +durch das MacOS dann erfolgt, wenn eine andere Mac-Applikation läuft +und dann ist der aktuelle Stack nicht der von MagiC Mac. 2. +Bei den 68K-Maschinen ist im Atari-Modus nur der Adreßraum der 2 +TPAs, den untersten 32KB, ggf. der I/O-Bereich sowie der Bereich der +MagiC Mac-Applikation sichtbar, anderer Speicher vom MacOS und anderen +Mac-Applikationen wird ausgeblendet, dort gibt's dann nur Bus-Errors. +Fazit: Um sicherzustellen, daß beim Schalten in den Atari +MMU-Modus der SP im Atari-Adreßraum liegt, muß vorher ein +Stack-Bereich dafür reserviert werden und dieser dann benutzt werden. +Um sicherzustellen, daß der Stack groß genug ist (1-2 KB sind +deutlich zu wenig!), ist der Cookie-Wert minStackSize zu +beachten! +
        +

    • +
    • Immer in den Supervisor-Modus wechseln, bevor 'modeAtari' +aufgerufen wird (sonst läuft's nicht unter Virtual Memory). Dazu wird +folgender Code vorgeschlagen: +
        +

              clr     d0
      +        move    sr,d0
      +        btst    #13,d0
      +        bne     ok1
      +        moveq   #8,D0        ;   EnterSupervisorMode
      +        dc.w    $A08D        ;   _DebugUtil
      +  ok1:
      +        move    d0,-(a7)     ; Sichern des alten Modus
      +
      +        ; hier nun modeAtari ... modeMac usw. aufrufen.
      +
      +        move.w  (a7)+,sr     ; alten Modus wiederherstellen
      +
      +

    • +
    • Mac-Subroutinen dürfen in der Regel nur die Register +D0-D2/A0/A1 verändern, jedoch nicht, wie beim Atari oft üblich, A2! +
        +

    • +
    + +

    Querverweis: Programmstart und TPA   Reset-Vektor   Systemvariablen +

    +

    14.1.7 Sauberes Programmieren

    +

    Wenn auch die spezifische Implementation von MagiC Mac nicht für +jeden ATARI-Programmierer von Interesse ist, so gibt es doch einige +Grundregeln, die man auch auf ATARI-Ebene einhalten sollte, um +weitgehend sicher zu sein, daß die Programme auch auf MagiC Mac +laufen können. Hier sind u.a. die folgenden Punkte zu nennen: +

    + + + + + + +
      +
    • Selbstmodifizierender Code +
      Wenn Code (gilt auch für XBRA-Vektoren) verändert wird, muß +unbedingt der CPU-Cache gelöscht werden. Zwar kann man durch +Ausprobieren feststellen, daß dies auf einer 68020 mit ihrem kleinen +Cache nicht nötig ist, jedoch kann man nie sicher sein: Auf dem Mac +gibt es einen 68K-Emulator für die PowerPC-Maschinen, der eine 68020 +simuliert, jedoch erstens einen größeren Cache als die echte 68020 +hat (incl. Datencache, der sonst erst bei der 68030 vorhanden ist) und +zweitens auch noch den Code in PowerPC-Code kompiliert. +
        +
      Wird dann der Code vom ATARI-Programm verändert, kann der +Emulator das nur erkennen, wenn ein Befehl zum Cache-Löschen +ausgeführt wird. Ebenso ist ein Cache-Löschen bei den 68040/60-CPUs +in der Regel vonnöten! Hier ist der Code, mit dem in solchen Fällen +der gesamte Cache zu löschen ist: +
        + + + + + + + + + + + + +
      Prozessor Code +
          +
      68020/30 +
            MOVE  CACR,D
      +      ORI.W #$0808,D0
      +      MOVE  D0,CACR
      +
      +
      oder auch so: +
            DC.W  $4E7A,$0002,$0040,$0808,$4E7B,$0002
      +
      +
      68040/60 +
            NOP
      +      CPUSHA DC/IC
      +
      +
      oder: +
            DC.W   $4E71,$F4F8
      +
      + +
      + +
      Der Prozessor-Typ sollte dabei durch Inspektion des _CPU +-Cookies ermittelt werden. +
        +

    • +
    • Interrupts sperren +
      Falls kurzzeitig die Interrupts gesperrt werden müssen, dann +danach niemals das SR auf den festen Wert $2300 setzen, +sondern möglichst vor dem Sperren das alte SR sichern (z.B. auf dem +Stack) und hinterher wieder zurückladen. Wenn unbedingt ein +Rücksetzen des SR, unabhängig vom alten SR, erfolgen soll, dann die +Interrupt-Maske auf Null und nicht auf Drei setzen, also z.B. +MOVE #$2000,SR statt MOVE #$2300,SR. Das ATARI-Betriebssystem sorgt +dann automatisch für das Umsetzen auf Maskenwert 3, während beim Mac +die Maske auf 0 bleibt, sonst geht nämlich nix mehr. +
        +

    • +
    • Hardware-Zugriffe +
      Bevor man bestimmte Hardware-Register direkt programmieren will +(z.B. den Centronics-Port zum Drucken), sollte man den _MCH -Cookie +prüfen. Ist sein Wert $FFFFFFFF (dez. -1), dann heißt das, daß +keine ATARI-Hardware vorhanden ist (das PRG also z.B. auf dem +Macintosh läuft) und deswegen auch erst gar nicht versucht werden +sollte, auf die Hardware zuzugreifen, weil dort dann RAM sein könnte, +was natürlich nicht durch solche Zugriffe verändert werden +darf. +
        +

    • +
    • Supervisor-Modus +
      Seit den Multitasking-Betriebssystemen, wie MultiTOS und MagiC, +sollte kein Programm mehr den Supervisor-Stackpointer eigenmächtig +umsetzen, z.B., um einen größeren Stack zu haben, weil sonst +unabsehbare Abstürze passieren können (auf den PCI-Macs ist z.B. ein +sehr großer Supervisor-Stack notwendig, mind. 8MB, u.U. aber auch +24MB - dies kann nur das Betriebssystem wissen und korrekt +installieren). Wichtig: Um in den Supervisor-Modus zu +gelangen, keinesfalls die GEMDOS-Funktion Super() verwenden, +sondern Supexec() aus dem XBIOS. Nur Supexec() kann sicherstellen, +daß ein ausreichend großer Supervisor-Stack verwendet wird. +
        +

    • +
    + +

    Querverweis: +
    Programmier-Guidelines   Style-Guidelines   XBRA-Verfahren +

    +

    14.1.8 Der Shutdown in MagiC Mac

    + +

    Unter MagiC Mac wird der Shutdown vom Programm 'shutdown.prg' +übernommen; sofern sich dabei alle z.Zt. aktiven (Atari-) Programme +beenden ließen, wird auch MagiC Mac selbst beendet. Für einige +Programmierer dürfte interessant sein, wie man MagiC Mac ohne +Nachfrage beenden kann. Dies kann in zwei Schritten erfolgen: +

    +
      +
    • In den Macintosh-Modus wechseln (per modeMac) +
    • +
    • Ausführen der Mac-Routine ExitToShell. +
    • +
    + +

    In Pure-C könnte dies z.B. folgendermaßen aussehen: +

    +
      static pascal void ExitToShell (void) 0xA9F4;
    +  MgMcCookie *mgmc;
    +  ...
    +  ...
    +  get_cookie ("MgMc", &mgmc);  /* Zeiger auf MgMc-Cookie-Struktur  */
    +  mgmc->modeMac ();            /* zum Mac-Modus wechseln           */
    +  ExitToShell ();              /* Beendet MM sofort ohne Nachfrage */
    +
    +

    Wichtig könnten diese Informationen etwa bei der Programmierung +eines eigenen shutdown.prg werden. +

    +

    Querverweis: +
    Allgemeines zum Shutdown   shel_write   Shutdown in MultiTOS   +Shutdown in MagiC   Shutdown beim Empfänger   Shutdown beim Initiator   +

    +

    14.1.9 XCMDs unter MagiC Mac

    +

    XCMDs sind kleine externe Code-Module für +Macintosh-Applikationen. Sie können in der Regel ziemlich +einfach mit den Entwicklungswerkzeugen unter MacOS erzeugt werden +(z.B. mit Metrowerks CodeWarrior oder Symantec C). Ab Version +1.2.2 erlaubt MagiC Mac auch die einfache Benutzung solcher +CODE-Module von Programmen aus, die unter MagiC laufen. Dies +erleichtert die Entwicklung von Programmen oder Treibern, die +Funktionen vom Macintosh nutzen wollen, weil diese Teile dann mit +einem Macintosh-Compiler erstellt werden können, anstatt umständlich +die Interfaces unter einem Atari-Entwicklungssystem noch einmal +nachbilden zu müssen. +

    +

    Ein Beispiel für ein solches XCMD befindet sich im Ordner +'Demo XCMD' der original MagiC Mac-Dokumentation. Das erzeugte +Modul kann dann einfach in den Ordner 'MagiC Mac XCMDs' gelegt +werden. Dieser Ordner muß sich im selben Verzeichnis wie die MagiC +Mac-Applikation befinden. Beim Start von MagiC Mac wird dieser Ordner +nach Dateien mit dem Dateityp 'xCmd' durchsucht und die darin +enthaltenen XCMD Resourcen geladen und ausgeführt. Diese XCMDs +können sich dabei bei MagiC Mac registrieren und stehen damit +MagiC-Programmen zur Verfügung. +

    +

    Eine Anwendung zeigt das Pure C-Programm im Ordner +'MGMC_API' der original MagiC Mac-Dokumentation. Es zeigt, wie +einfach ein installiertes XCMD geöffnet und aufgerufen werden kann. +Die dazu über den Cookie (xcmdMgrPtr) angebotenen Funktionen gehen +dabei automatisch ggf. in den Supervisor-Modus und schalten auf die +Mac-Umgebung (per callMacContext) um und regeln auch die Parameterübergabe. Der +Aufruf der XCMD-Funktionen auf diese Weise ist also nur erlaubt, wenn +der Atari-Modus aktiv ist und wenn der Aufruf nicht von einem +Interrupt aus erfolgt. +

    +

    Wenn die XCMD-Funktionen aus Interrupts oder im Mac-Modus +aufgerufen werden sollen, kann über "xcmdMgrPtr->getAdr" +die Einsprungadresse des XCMD-Dispatchers ermittelt werden und dann +direkt angesprungen werden. +

    +

    Weitere Informationen zu XCMDs befinden sich im Quelltext 'Demo +XCMD.c' der original MagiC Mac-Dokumentation. +

    +

    14.1.10 Die Zusammenarbeit von MagiC und MacOS

    +

    MagiC Mac hängt sich direkt in alle Interrupt-Vektoren, die der +Macintosh benutzt. Wenn MagiC läuft und ein Hardware-Interrupt +auftritt, schaltet MagiC Mac die MMU zurück in den normalen +Macintosh-Modus. Am Ende der IntrRoutine wird zurück in den +Atari-Modus gewechselt und das unter MagiC laufende Programm +fortgeführt. Solange der Mac-Modus aktiv ist, mischt sich MagiC Mac +nicht weiter in die Intr-Bearbeitung ein, sondern nur, solange +der Atari-Modus aktiv ist. +

    +

    Immer dann, wenn vom Mac-Modus zurück in den Atari-Modus +gewechselt wird, wird noch überprüft, ob eine bestimmte Zeit +verstrichen ist (in Ticks gemessen; ein Tick ist ca. 1/60s), um dann +ggf. periodische Aufgaben zu erledigen. Diese werden hier Mac-Tasks +genannt. +

    +

    Mac-Tasks erledigen u.a. folgende Dinge: +

    +
      +
    • Pollen der Mac-Events (Funktionen GetOSEvent bzw. +WaitNextEvent). +
        +

    • +
    • Auswerten von Befehl-Q und Befehl-W. +
        +

    • +
    • Auswerten externer Apple-Events, z.B. Suspend/Resume (MagiC Mac +in den Hintergrund schalten) und externes Beenden. +
        +

    • +
    • Rechenzeitabgabe an andere Mac-Applikationen (durch +WaitNextEvent). +
        +

    • +
    + +

    Die Entscheidung, ob zum Pollen der Events GetOSEvent oder +WaitNextEvent (WNE) benutzt wird, kann über die Preferences und auch +eine Cookie-Funktion eingestellt werden. Nur, wenn WNE benutzt wird, +wird auch Rechenzeit an andere Mac-Applikationen abgegeben. +

    +

    Mac-Tasks dürfen nur ausgeführt werden, wenn sicher ist, daß +gerade keine andere MacOS-Funktion bearbeitet wird, denn das MacOS ist +nicht reentrant. Mac-Tasks werden deshalb nur dann ausgeführt, +wenn alle folg. Bedingungen zutreffen: +

    +
      +
    • Nach der Unterbrechung (Interrupt oder Aufruf von mode_atari) +wird der Atari-Modus aktiv sein und die Interrupt-Level-Maske ist +Null, d.h, es ist kein anderer Interrupt in Bearbeitung (um +dies sicherzustellen, muß in Intr-Handlern, die vom Mac-Modus in den +Atari-Modus wechseln, intrLock korrekt benutzt werden, s.u.). +
        +

    • +
    • Es wird gerade keine Routine im Mac-Kontext ausgeführt +(callMacContext). +
        +

    • +
    • MagiC Mac ist nicht dabei, sich zu beenden. +
        +

    • +
    + +

    14.1.11 Der Cookie von MagiC Mac

    +

    Das Betriebssystem MagiC Mac [eine Portierung von MagiC auf die +Hardware des Apple (Power) Macintosh] legt einen Cookie MgMc an, der +auf die folgende Struktur zeigt: +

    + + +
    typedef struct
    +{
    +  SHORT   vers;                 /* Versionskennung im BCD-Format       */
    +  SHORT   size;                 /* Größe der Struktur in Bytes         */
    +  LONG    flags1;               /* verschiedene Flags:                 */
    +                                /*                                     */
    +                                /* Bit-0: 640*400-Emulation aktiv      */
    +                                /* Bit-1: Rechts-Shift möglich         */
    +                                /* Bit-2: 2-Tasten-Maus                */
    +                                /* Bit-3: 68K-Emulation auf Power-PC   */
    +                                /* Bit-4: u. I/O-Bereich nicht vorh.   */
    +                                /* Bit-5: o. I/O-Bereich nicht vorh.   */
    +                                /*                                     */
    +                                /* Hinweis: Bit-2 steht erst ab        */
    +                                /* der Version 1.01, Bit-3 ab Version  */
    +                                /* 1.05 und die folgenden erst ab Ver- */
    +                                /* sion 1.10 zur Verfügung.            */
    +  PixMap  *scrnPMPtr;           /* Zeiger auf Screen-Beschreibung      */
    +  BOOLEAN *updatePalette;       /* Ist zu setzen, um Farbtabellen      */
    +                                /* zu restaurieren                     */
    +  ProcPtr modeMac;              /* MMU-Umschaltung auf Mac-Modus       */
    +  ProcPtr modeAtari;            /* MMU-Umschaltung auf Atari-Modus     */
    +  ProcPtr getBaseMode;          /* Liefert in D0.W den MMU-Modus.      */
    +                                /* Es gilt:                            */
    +                                /*                                     */
    +                                /*    0 = Macintosh                    */
    +                                /* <> 0 = Atari                        */
    +  ProcPtr getIntrCount;         /* Liefert in D0.L Intr-Semaphore-     */
    +                                /* Zähler (0 = frei)                   */
    +  ProcPtr intrLock;             /* Erhöht Interrupt-Semaphore-Zähler   */
    +  ProcPtr intrUnlock;           /* Erniedrigt Inter.-Semaphore-Zähler  */
    +  ProcPtr callMacContext;       /* Führt Routine im Mac-Kontext aus;   */
    +                                /* Proc-Adr auf Stack.                 */
    +                                /*                                     */
    +                                /* Achtung: Die RegisterD0-D2/A0/A1    */
    +                                /* A5 und A7 werden zerstört.          */
    +  Ptr     atariZeroPage;        /* Zeiger auf Atari-Speicherbereich    */
    +                                /* $0-$800 im Macintosh-Adreßraum      */
    +  Ptr     macA5;                /* Wert des A5-Regist. im Mac-Kontext  */
    +  ProcPtr macAppSwitch;         /* Aufruf durch MagiC-Kernel (D0/4(A7).*/
    +                                /* Es gilt:                            */
    +                                /*                                     */
    +                                /*   0 = Suspend                       */
    +                                /*   1 = Resume                        */
    +                                /*   2 = Quit                          */
    +                                /* 3/4 = atariModePossbile wechselt    */
    +  ProcPtr controlSwitch;        /* Aufruf durch MagiC-Kernel (D0/4(A7) */
    +                                /* Es gilt:                            */
    +                                /*                                     */
    +                                /* 0 = Atari-Screen verstecken         */
    +                                /* 1 = Atari-Screen zeigen             */
    +  LONG    hardwareAttr1;        /* z.Zt. undefiniert.                  */
    +  LONG    hardwareAttr2;        /* z.Zt. undefiniert.                  */
    +  Ptr     magiC_BP;             /* BASEPAGE des MagiC OS.              */
    +  Ptr     auxOutName;           /* Pascal-String für AUX-Ausg.-Device  */
    +  Ptr     auxInName;            /* Pascal-String für AUX-Eing.-Device  */
    +  ProcPtr auxControl;           /* Aufruf durch MagiC-Kernel (D0/4(A7) */
    +                                /* Es gilt:                            */
    +                                /*                                     */
    +                                /* 0 = Suspend                         */
    +                                /* 1 = Resume                          */
    +                                /* 2 = Quit                            */
    +  PrintDesc *printDescPtr;
    +  GenProc   configKernel;       /* Aufruf (C-Konvention) Atari-Modus   */
    +  BOOLEAN   *atariModePossible; /* Zeiger auf ein Flag das anzeigt, ob */
    +                                /* der Aufruf von modeAtari z.Zt. er-  */
    +                                /* laubt ist.                          */
    +  MacVersion *versionOfMacAppl; /* Version der MagiC Mac-Applikation   */
    +                                /* (ab Version 1.06)                   */
    +  VOID       *hwEmulSupport;    /* interner Gebrauch (ab Version 1.07) */
    +  FlpDrvInfo *floppyDrvInfoPtr; /* zeigt auf Infos für Laufwerke A und */
    +                                /* B (ab Version 1.07)                 */
    +  XCMDgrRec *xcmdMgrPtr;        /* XCMD-Interface (ab Version 1.08)    */
    +  ProcPtr   giveTimeToMac;      /* Aufrufen im Mac-Kontext falls idle  */
    +  LONG      minStackSize;       /* Mindest-Supervisor-Stackgröße       */
    +  GenProc   ext;                /* Hilfsroutinen, Aufr. aus Atari-Mode */
    +  GenProc   extMac;             /* analog 'ext'; Aufruf aus Mac-Modus  */
    +  ProcPtr   stackLoad;          /* (ab 1.11 / MagiC Mac 2.0)           */
    +  ProcPtr   stackUnload;        /* (ab 1.11 / MagiC Mac 2.0)           */
    +  LONG      reserved[3];        /* z.Zt. undefiniert                   */
    +} MgMcCookie;
    +
    +

    Hinweise: +

    +
      +
    • Die Komponenten giveTimeToMac und minStackSize stehen erst +ab Version 1.09 zur Verfügung; alle weiteren Komponenten erst ab +Version 1.10. +
        +

    • +
    • Unbenutzte Bits und undefinierte Werte sind stets Null! +
        +

    • +
    • Alle Zeiger bleiben konstant, d.h., es ist erlaubt, sich einmal +die Zeigerinhalte zu kopieren und damit dann zu arbeiten. +
        +

    • +
    • Aufruf nach C-Konvention bedeutet, daß Parameter auf dem Stack +übergeben werden und daß Register D0-D2/A0-A2 zerstört werden +können. +
        +

    • +
    + +

    Querverweis: +
    MagiC Mac-Typvereinbarungen   Cookie- und XBRA-Liste +

    +

    14.1.11.1 MagiC Mac-Typvereinbarungen

    +

    Im folgenden eine Liste von Typvereinbarungen, die im +Zusammenhang mit MagiC Mac eine Rolle spielen: +

    +
    typedef char Boolean;
    +typedef char *Ptr, **Handle;
    +typedef unsigned char *StringPtr;
    +typedef void PixMap;
    +typedef Handle THPrint;
    +typedef void (*ProcPtr)(void);
    +
    +typedef long cdecl (*GenProc) (short function, void *data);
    +typedef Boolean cdecl (*PrSetupProc) (Boolean alwaysInteractively);
    +
    +

    Hinweis: Die XCMD-Strukturen sind im File 'MgMc_API.h' +der Original-Dokumentation von MagiC Mac enthalten. +

    +

    Querverweis: Typdefinitionen in MagiC +

    +

    14.1.11.2 mmc_flg1_bit4

    +

    Der untere I/O-Bereich ($00FF8000-$00FFFFFF) ist nicht +als solcher vorhanden, d.h., dort kann sich ganz normales RAM, wie an +jeder anderen Stelle auch, befinden. In diesem Fall wird auch +keine Unterscheidung zw. ST- und TT-RAM gemacht - das ganze +von MagiC Mac benutzte RAM, auch das oberhalb von 16MB, wird als +ST-RAM verfügbar gemacht. +

    +

    Das bedeutet natürlich, daß in diesem Fall Programme +keine I/O-Zugriffe auf diesem Bereich machen dürfen! Ist +dieses Bit gelöscht, kann ein Programm jedoch dort Zugriffe machen +und mit einem Bus-Error rechnen, wenn keine Atari-kompatible Hardware +(wie z.B. McSTout) dort installiert ist. +

    +

    14.1.11.3 mmc_flg1_bit5

    +

    Der obere I/O-Bereich ($FFFF8000-$FFFFFFFF) ist nicht +als solcher zugänglich (siehe Besonderheiten bei Power-Macs); +bei Zugriff erhält man keinen Bus-Error sondern Daten aus dem +Macintosh-ROM. +

    +

    14.1.11.4 auxControl

    +

    ... ist für den HSMODEM-Treiber gedacht: Der Word-Parameter auf +dem Stack bestimmt, ob die Ports freigegeben werden sollen (2 = ganz +schließen, 0 = schließen, aber ggf. DTR halten) oder eine +Wiederbelegung des Ports erlaubt ist (Wert = 1). Zwischen Wert-0 und +Wert-1 können sich die Namen (auxInPort, auxOutPort) geändert haben. +

    +

    Hinweis: Der Aufruf sollte im Atari-Supervisor-Modus +stattfinden, der USP ist undefiniert. +

    +

    Querverweis: Cookie von MagiC Mac   Cookie- und XBRA-Liste +

    +

    14.1.11.5 callMacContext

    +

    ... dient dazu, die notwendige Macintosh-Umgebung zum Aufruf +beliebiger MacOS-Routinen herzustellen. Die Routine muß im +Mac-Modus aufgerufen werden, im Supervisor-Modus und nicht aus einem +Interrupt heraus. +

    +

    Dazu ist auf dem Stack die Adresse der Routine zu übergeben, +die als Subroutine im Mac-Kontext aufzurufen ist. Für die aufgerufene +Routine wird der normale User-Stack von MagiC Mac verwendet, zudem +wird das Register A5 mit macA5 geladen und im Falle, daß Virtual +Memory aktiv ist, auch in den User-Modus geschaltet. Da diese Funktion +den Stack wechselt, ist keine Parameterübergabe über den Stack möglich. +Die Register D0-D2/A0/A1/A5/A7 werden sowohl beim Aufruf als auch bei +der Rückkehr der Subroutine verändert (jedoch haben A5/A7 nach +Rückkehr von 'callMacContext' die selben Werte wie vor dem Aufruf). +Die anderen Register werden nicht verändert und können zur +Parameterübergabe und -rückgabe benutzt werden. +

    +

    Die Ausführung dieser Subroutine bringt implizit den Aufruf von +intrLock und intrUnlock mit sich, das heißt, währenddessen werden +keine Mac-Tasks bearbeitet, auch wenn dabei zeitweise in den +Atari-Modus gewechselt wird. Um trotzdem die Bearbeitung von Mac-Tasks +zu ermöglichen, kann die Funktion 'giveTimeToMac' aufgerufen werden. +

    +

    Querverweis: Cookie von MagiC Mac   Cookie- und XBRA-Liste +

    +

    14.1.11.6 configKernel

    +

    ... bietet Zugriff auf einige der Einstellungen, die sonst nur +über die Macintosh-Seite interaktiv zugänglich sind. Dazu wird in +der Regel im 'function'-Parameter eine Funktionsnummer und im +'data'-Parameter ein Zeiger auf eine Variable übergeben, die vor dem +Aufruf den zu setzenden Wert enthalten muß oder -1 für den Fall, +daß kein neuer Wert gesetzt werden soll. +

    +

    Nach dem Aufruf enthält die Variable den aktuellen Wert. Die +Einstellungen werden in die "Preferences" übernommen, wenn +nichts anderes angegeben ist. Die Funktionen: +

    + + + + + + + + + + + + + + + + + + +
    Wert Beschreibung +
        +
    1 data zeigt auf ein Byte, das bestimmt, ob der 200Hz-Timer durch +den MacOS-Timer simuliert werden soll. Es gilt: +
    +
    + + + + + + + + + + +
    0=nein
    1=ja (default)
    +
    + +
    2 Bestimmt, ob Mac-Hintergrundprozesse aufgerufen werden sollen. +Es gilt: +
    +
    + + + + + + + + + + +
    0=nein
    1=ja
    +
    + +
    3 Bestimmt, ob IDLE-Zustand bei Powerbooks erlaubt ist. +Es gilt: +
    +
    + + + + + + + + + + +
    0=nein
    1=ja
    +
    + +
    4 Analog (1), für das Flag 'UnlockMemOnMacSide' (siehe auch +unter atariModePossible): Ist es ungleich Null, wird der von MagiC Mac +belegte Speicher für die TPA zum Auslagern freigegeben, falls Virtual +Memory aktiv ist. Andernfalls läßt er sich nicht auslagern. Wird +z.Zt. nicht in den Prefs gesichert. + +
    + +

    Querverweis: Programmstart und TPA   Cookie von MagiC Mac +

    +

    14.1.11.7 controlSwitch

    +

    Hier können sich Atari-Routinen per XBRA-Verfahren einhängen. +Sie werden dann im Atari-Modus (Supervisor-Modus) aufgerufen, wenn +eines der angegebenen Ereignisse eintritt. Dies ist z.B. nötig, wenn +ein Atari-Programm sich bestimmter Macintosh-Routinen bedient. So kann +sich z.B. ein Programm, das die Sound-Routinen des Mac benutzt, +hierüber informieren lassen, wenn MagiC Mac beendet wird, um dann die +Sound-Kanäle zu schließen und Speicher freizugeben. +

    +

    Folgende Werte werden in D0.W und auf dem Stack übergeben (und +müssen dort auch bleiben): +

    + + + + + + + + + + + + +
    Wert Beschreibung +
        +
    0 Hide +
    Maus- und Tastaturkontrolle für MagiC setzen aus, weil z.B. ein +Mac-Dialog geöffnet ist. Es sollten dann auch keine Ausgaben auf den +Bildschirm geschehen (z.B. bei Interruptroutinen), weil damit sonst +der Macintosh-Dialog überschrieben werden könnte. +
    1 Show +
    Gegenteil von Hide. + +
    + +

    Hinweis: Die Routine muß im Atari-Supervisor-Modus +aufgerufen werden, der USP ist undefiniert. +

    +

    Querverweis: Cookie von MagiC Mac   Cookie- und XBRA-Liste +

    +

    14.1.11.8 getBaseMode

    +

    Falls getBaseMode in einem Interrupt aufgerufen wird, liefert +die Funktion den Modus, der zum Zeitpunkt vor der +Interrupt-Bearbeitung bestand. +

    +

    14.1.11.9 intrLock

    +

    ... muß aufgerufen werden, bevor von einer Macintosh-Routine, +die im Interrupt laufen könnte, eine Umschaltung in den Atari-Modus +erfolgt. Zusätzlich muß vor der Umschaltung damit gerechnet werden, +daß ein fremder Stack aktiv ist, der nicht zum Adreßraum des +Atari-Modus gehört. +

    +

    Deshalb muß zuvor auf einen Stack (siehe minStackSize) aus dem +Atari-Adreßraum gewechselt werden. Nach der Rückschaltung in den +Macintosh-Modus muß selbstverständlich intrUnlock aufgerufen werden. +

    +

    Mit Hilfe dieser Intr-Semaphore wird erkannt, wann die CPU +Befehle unter MagiC im Nicht-Interrupt-Zustand ausführt. Dieser +Zustand muß erkannt werden, weil nur dann die +Macintosh-Hintergrundprozesse und sonstige Macintosh-Routinen +gefahrlos vom MagiC Mac-Kernel durch seine Interrupt-Kontrollroutinen +aufgerufen werden können. (Während Interrupt-Routinen oder +Macintosh-Routinen abgearbeitet werden, darf keine Mac-Routine vom +MagiC Mac-Kernel aufgerufen werden, weil das MacOS nicht reentrant +ist. Während dieser Zeit werden keine Mac-Events bearbeitet; auch +Befehl-W/-Q funktionieren dann nicht). +

    +

    Querverweis: Cookie von MagiC Mac   Cookie- und XBRA-Liste +

    +

    14.1.11.10 macAppSwitch

    +

    Hier können sich Atari-Routinen per XBRA-Verfahren einhängen. +Sie werden dann im Atari-Modus (Supervisor-Modus) aufgerufen, wenn +eines der angegebenen Ereignisse eintritt. Dies ist z.B. nötig, wenn +ein Atari-Programm sich bestimmter Macintosh-Routinen bedient. So kann +sich z.B. ein Programm, das die Sound-Routinen des Mac benutzt, +hierüber informieren lassen, wenn MagiC Mac beendet wird, um dann die +Sound-Kanäle zu schließen und Speicher freizugeben. +

    +

    Folgende Werte werden in D0.W und auf dem Stack übergeben (und +müssen dort auch bleiben): +

    + + + + + + + + + + + + + + + + + + + + + +
    Wert Beschreibung +
        +
    0 Suspend +
    MagiC Mac tritt in den Hintergrund - eine andere +Macintosh-Applikation kommt in den Vordergrund (z.B. der Finder). +
    1 Resume +
    MagiC Mac ist wieder die Vordergrundapplikation auf +Macintosh-Seite. +
    2 Quit +
    MagiC Mac wird beendet. +
    3 Flag atariModePossible wird danach FALSE +
    4 Flag atariModePossible ist wieder TRUE + +
    + +

    Hinweis: Die Routine muß im Atari-Supervisor-Modus +aufgerufen werden, der USP ist undefiniert. +

    +

    Querverweis: Cookie von MagiC Mac   Cookie- und XBRA-Liste +

    +

    14.1.11.11 atariModePossible

    +

    ... zeigt auf ein Byte, das anzeigt, ob augenblicklich ein +Wechsel vom Mac- in den Atari-MMU-Modus möglich ist (0=verboten, +1=erlaubt). Solange der Macintosh ohne Virtual Memory (auch +RAM-Doubler) läuft, ist der Aufruf von 'modeAtari' immer möglich, +wenn jedoch VM aktiv ist und das Flag "UnlockMemOnMacSide" +auch ungleich Null ist, wird beim Wechsel vom MagiC- zum +Mac-Bildschirm der von MM für die TPA belegte Speicher zum Auslagern +freigegeben. +

    +

    Sobald die VM-Verwaltung jedoch einen Block auslagert, sind die +von MM berechneten MMU-Tabellen nicht mehr gültig und müßten vor +der nächsten Umschaltung in den Atari-Modus erst neu berechnet +werden. Dies wird jedoch nicht automatisch getan, sondern erst, wenn +zurück zum Atari-Bildschirm gewechselt wird. Aus diesem Grund dürfen +Interrupt- und andere asynchrone Routinen, die unter MagiC Mac mittels +MacOS-Funktionen installiert sind, unter den beschriebenen Umständen +keine Atari-Modusumschaltung vornehmen. +

    +

    Atari-Programme, die sich in die Atari-Vektoren einhängen (z.B. +den VBL-Vektor bei $70), müssen dies alles nicht beachten, weil im +Fall, daß die MMU-Tabellen ungültig werden, die Atari-Interrupts +erst gar nicht mehr simuliert werden. Für den Fall, daß weitere +Maßnahmen ergriffen werden sollen, bevor bzw. nachdem sich der Status +des Flags ändert, kann auch eine Routine über macAppSwitch +installiert werden, die dann mit den Werten 3 und 4 in D0.W dieses +Ereignis anzeigt). +

    +

    Querverweis: Programmstart und TPA   Cookie von MagiC Mac +

    +

    14.1.11.12 modeAtari

    +

    Bevor diese Funktion aufgerufen werden kann, müssen folgende +Bedingungen zutreffen: +

    +
      +
    • Der Mac-Modus muß aktiv sein. +
        +

    • +
    • Die CPU muß sich im Supervisor-Modus befinden. Unter Virtual +Memory laufen Mac-Programme und auch die Mac-Interrupt-Routinen im +User-Modus. Falls von dort heraus zeitweise in den Atari-Modus +gewechselt werden soll, muß zuvor in den Supervisor-Modus gewechselt +werden. Siehe dazu 'EnterSupervisorMode'. +
        +

    • +
    • Der aktuelle Stack muß im Atari-Adreßraum liegen, sonst +bleibt CPU sofort wg. doppeltem Bus-Error stehen, sofern das Programm +auf einem 68K-Rechner läuft, weil dann andere Bereiche, also auch der +Stack-Bereich, nicht mehr ansprechbar sind. Beachte hierzu auch +minStackSize. +
        +

    • +
    • atariModePossible muß anzeigen, daß der MMU-Switch erlaubt +ist. Andernfalls erscheint bei installiertem MacsBug die Meldung: +"Fatal Error: Atari-Mode currently not available (MMU-Tables +invalid)". +
        +

    • +
    + +

    Querverweis: Cookie von MagiC Mac   Cookie- und XBRA-Liste +

    +

    14.1.11.13 modeMac

    +

    ... kann jederzeit aufgerufen werden, auch in +Interrupt-Routinen, sofern sich das Programm z.Zt. im Atari-Modus und +im Supervisor-Modus befindet. Danach kann auf den gesamten +Mac-Adreßraum zugegriffen werden. +

    +

    Der Speicher, der im Atari-Modus bei Adresse Null beginnt, +beginnt im Mac-Modus dort, wohin atariZeroPage zeigt. Wurde +von einer normalen Atari-Anwendung aus mittels modeMac in den +Mac-Modus gewechselt, dürfen nur solche MacOS-Routinen aufgerufen +werden, die auch im Interrupt aufgerufen werden dürfen (siehe 'Inside +Macintosh'), ggf. muß dazu noch das Register A5 mit dem Wert aus +macA5 belegt werden. Andere Routinen sollten nur über callMacContext +aufgerufen werden, insbesondere solche, die QuitDraw-Routinen benutzen +– ggf. ist das auszuprobieren. Falls ein Aufruf von callMacContext +nötig ist, erkannt man es oft daran, daß sonst Busfehler auftreten +oder keine Texte in Dialogboxen usw. erscheinen. +

    +

    Querverweis: Cookie von MagiC Mac   Cookie- und XBRA-Liste +

    +

    14.1.11.14 versionOfMacAppl

    +

    Hierüber kann die Versionskennung von der laufenden MagiC +Mac-Applikation ermittelt werden (also die Kennung, die auch imFinder +angezeigt werden kann). Damit können Programme sich endlich auf die +MM-Versionen einstellen. +

    +

    14.1.11.15 giveTimeToMac

    +

    ... dient dazu, Zeit an die Mac-Event-Bearbeitung von MagiC Mac +abzugeben, wenn sich der Rechner längere Zeit (sinnvoll ab 1/60s) im +Mac-Modus befindet, z.B., während auf Beendigung von asynchronen +Bearbeitungen gewartet wird. +

    +

    'giveTimeToMac' kann dann beliebig oft aufgerufen +werden; die Mac-Events werden trotzdem nur so oft gepollt, wie in +den Prefs eingestellt ist (normal: jede 1/60s, dies ist auch die +maximale Frequenz). Um die Routine aufzurufen, muß der vollständige +Mac-Context hergestellt sein, d.h., der Applikations-Stack aktiv und +A5 entspr. gesetzt sein (dies wird z.B. durch callMacContext erreicht. +Die Routine macht keine sonstigen Aktionen, die nicht auch sonst +passieren, wenn der Atari-Modus aktiv ist und dabei automatisch +zyklisch die Mac-Events gepollt werden. Als Besonderheit gilt, daß +die Routine nicht ein anstehendes Quit-Kommando auswertet, damit die +Routine, die 'giveTimeToMac' aufruft, davon ausgehen kann, daß sie +gleich wieder drankommt (sofern nicht ein fataler Fehler auftritt). +

    +

    Querverweis: Cookie von MagiC Mac   Cookie- und XBRA-Liste +

    +

    14.1.11.16 minStackSize

    +

    ... gibt die Mindestgröße für Supervisor-Stacks an, falls ein +Programm selbst so einen Stack reservieren muß (beispielsweise dann, +wenn eine Callback-Routine vom MacOS aufgerufen wird und diese dann +eine Routine im Atari-Modus aufrufen will, weil dazu sichergestellt +werden muß, daß sich der SP beim Umschalten in den Atari-Modus +innerhalb des Atari-Adreßraums befindet und dies nur durch einen +eigenen, lokalen Stack zu bewerkstelligen ist). +

    +

    Achtung: Man sollte sich unbedingt an diesen Wert +halten, da z.B. zwar auf den 68K-Maschinen in der Regel 5KB reichen, +auf den neueren PCI-PowerMacs jedoch schon über 12KB nötig sind, +wenn das Netzwerk (Ether-Talk) aktiv ist! Am Besten ist es jedoch, +wenn man völlig darauf verzichtet, einen eigenen Supervisor-Stack +anzulegen, um solche Schwierigkeiten in Zukunft zu vermeiden. Im +Zweifel sollte mit dem Autor des MagiC Mac-Kernels Kontakt aufgenommen +werden! +

    +

    Querverweis: Cookie von MagiC Mac   Cookie- und XBRA-Liste +

    +

    14.1.11.17 ext

    +

    ... bietet diverse Hilfsfunktionen des MagiC Mac-Kernels. Aufruf +muß aus dem Atari-Modus (User- oder Supervisor-Modus) geschehen. +Aufrufe aus Interrupts sind nicht erlaubt. +

    +

    Dazu wird im "function"-Parameter eine Funktionsnummer +und im "data"-Par. ein Zeiger auf evtl. zusätzlich +benötigte Daten übergeben. Bei Aufruf nicht definierter +Funktionsnummern wird immer als Funktionsergebnis -1 zurückgegeben. +Die Funktionen: +

    + + + + + + + + + + + + + + + + + + +
    Wert Beschreibung +
        +
    0 extMax +
    "data" ist unbenutzt (Null übergeben!), +zurückgeliefert wird die höchste implementierte Funktionsnummer. +
    1 extAlert +
    Zeigt einen generischen Mac-Dialog (Alert) an. "data" +zeigt auf einen Null-terminierten String (maximal 255 Zeichen lang!), +der in dem Dialog angezeigt wird. Achtung: Umlaute müssen Mac-Codes +haben. Zum Zeilentrennen einfach ein CR einfügen. Rückgabe: Immer +Null. +
    2 extAUXOpenErr +
    Zeigt einen Mac-Alert an mit dem (entspr. der Sprache angepaßten) +Text, daß der serielle Port nicht geöffnet werden kann, weil er +belegt ist (wird von HSMODEM/MACM1 benötigt). "data" ist +unbenutzt. Rückgabe: Immer Null. +
    3 extFSSpecToPath +
    Konvertiert einen Macintosh-Dateipfad in einen GEMDOS-konformen +Pfad. "data" zeigt auf folg. Struktur: Zuerst ein FSSpec +(siehe Mac-Doku), dahinter ein Puffer mit Platz für 256 Zeichen. +Dieser Puffer wird mit einem C-String gefüllt, der einen +vollständigen Pfadnamen beschreibt, mit dem über +GEMDOS-Dateifunktionen auf die Datei zugegriffen werden kann. Es kann +später auch gut sein, daß dies ein Pfad über das Pseudo-Laufwerk +"u:\" ist, in dem dann alle z.Zt. vorhandenen Mac-Laufwerke +verfügbar sind. Dabei muß auch damit gerechnet werden, daß es sich +um Datei- und Ordnernamen handelt, die nicht ins 8.3-Schema passen. +
    Handelt es sich um einen Ordner, ist der Pfad auf jeden Fall mit +"\" abgeschlossen. Wenn kein Pfad nicht ermittelt werden +kann, weil z.B. keines der konfigurierten MagiC-Laufwerke den +betreffenden Ordner sichtet, gibt die Funktion den Wert -2 zurück. Im +Erfolgsfall wird 0 geliefert. + +
    + +

    Achtung: Diese Funktion kostet u.U. viel Zeit, da die +von MM benutzten Verzeichnisse ggf. durchsucht werden müssen, daher +nicht sorglos dauernd aufrufen, wenn es vermeidbar ist. +

    +

    Querverweis: Cookie von MagiC Mac   Cookie- und XBRA-Liste +

    +

    14.1.11.18 extMac

    +

    Entspricht 'ext', jedoch muß Aufruf aus dem Mac-Kontext (siehe +'callMacContext') geschehen. Ist vorteilhaft, wenn sich das Programm +wg. Aufruf anderer Mac-Funktionen bereits im Mac-Modus befindet. +Aufrufe aus Interrupts sind i.d.R. nicht erlaubt. +

    +

    14.1.11.19 stackLoad

    +

    stackLoad aktiviert einen neuen CPU-Stack (A7). +

    +

    Dies ist dann nötig, wenn aus einem Mac-Kontext, bei dem ein +beliebiger CPU-Stack aktiv ist, eine Routine im ATARI-Kontext +aufgerufen werden soll, also, bevor ein Modus-Wechsel mit +"modeAtari" erfolgt. Das Wechseln auf einen anderen Stack +ist dann nötig, weil evtl. der Bereich, den A7 gerade benutzt, durch +den Wechsel zum Atari-Modus ausgeblendet wird und es dann zu einem +CPU-Stillstand käme (siehe auch Kap. "Interrupt-Handler unter +MagiC Mac"). +

    +

    Anstatt einfach selbst den A7 azf den neuen Stack zu setzen, +sollte 'stackLoad' benutzt werden. Diese Funktion tut im Grunde das +selbe, jedoch informiert sie zusaetzlich das MacOS davon (durch Setzen +weniger globaler Variablen). Damit wird erreicht, dass das MacOS +waehrenddessen nicht den A7 periodisch überprüft. Denn sonst könnte +es auf bestimmten MacOS-Versionen (vor 7.5 und wieder ab 7.5.3) zur +Meldung eines Stack-Überlaufs durch das MacOS kommen, obwohl dies gar +nicht der Fall ist. +

    +

    Falls Virtual Memory aktiviert ist, wird hiermit außerdem +erreicht, daß dieser Stack-Bereich nicht ausgelagert werden kann, was +sonst u.U. einen Rechnerstillstand zur Folge haben kann. +

    +

    Benutzung: In A0 ist ein Zeiger auf ein MemArea-Struktur (s.o.) +zu übergeben. Darin muß der Zeiger auf den Beginn (niedrigste +Adresse) des Stacks sowie seine Länge (beachte 'minStackSize'!) +enthalten sein. Die Routine zerstört die Register A0 und A1 und setzt +A7 auf den Wert von <MemArea.start+MemArea.length>. +

    +

    14.1.11.20 stackUnload

    +

    Dioe Umkehrung zu 'stackLoad'. Aufzurufen, wenn der zuvor aktiv +gewesene Stack wieder benutzt werden soll. +

    +

    Die Routine zerstört das Register A0 (A7 erhält wieder den +Wert von vor dem stackLoad-Aufruf). +

    +
    + +Home +EmulatorenEmulatoren +EmulatorenEmulatoren +MagiC PC-SchnittstelleMagiC PC-Schnittstelle + + diff --git a/de/emulators_magicpc.html b/de/emulators_magicpc.html new file mode 100644 index 000000000..bb20bcbc1 --- /dev/null +++ b/de/emulators_magicpc.html @@ -0,0 +1,1579 @@ + + + + + +Die Anleitung zum TOS: MagiC PC-Schnittstelle + + + + + + + + + +Home +EmulatorenEmulatoren +MagiC Mac-SpezifikaMagiC Mac-Spezifika +STEmulatorSTEmulator + +
    + +

    14.2 MagiC PC-Schnittstelle

    +

    MagiC PC kennt mehrere Schnittelstellen mit denen man Funktionen +des Windowssystem aufrufen kann. +

    +
      +
    • mec0 (MPS) Schnittstelle: +
      Diese dient dazu beliebigen (selbstgeschriebenen) Windowscode +auszuführen. Dieser wird in einer DLL abgelegt, und über illegale +Opcodes aus MagiC PC heraus aufgerufen. +
        +

    • +
    • mec1 Schnittstelle: +
      Hiermit kann ein vorgegebenes Set an Spezialfunktionen aufgerufen werden. +
        +

    • +
    • mec2 Schnittstelle: +
      Wird von XFS_PC.LDR zur Verfügung gestellt. +
        +

    • +
    • mec3 Schnittstelle: +
      Wird von MPC_ACC zur Kommunikation mit MagiCPC genutzt. +
        +

    • +
    • mecnvdi Schnittstelle: +
      Wird von NVDI_PC.DLL zur Verfügung gestellt. +
        +

    • +
    + +

    14.2.1 mec0 (MPS) Schnittstelle

    +

    0. Allgemeines +

    +

    MPS = Magic_Programmier_Schnittstelle +

    +

    Dateien des Demobeispieles: +

    + + + + + + + + + + + + + + + + + + +
    mps_base.def Die Exportliste der DLL, NICHT ÄNDERN +
    mps_base.h Definition der MPS_Schnittstelle, NICHT ÄNDERN +
    mps_base.cpp Basis-Funktionen der DLL, NICHT ÄNDERN +
    mps_demo.h Definitionen für die Demo-DLL +
    mps_demo.cpp Die MPS_Funktionen der Demo-DLL +
    testmps.s Motorola - Beispiel zum Aufruf der MPS-Funktionen des +Demo-Beispieles + +
    + +

    Um eigene MPS_DLLs zu entwickeln, verwenden Sie bitte mps_base.def, +mps_base.h und mps_base.cpp unverändert. Zu ändern/ergänzen sind mps_demo.h und +mps_demo.cpp. Insbesondere wählen Sie bitte eine eigene DLL_ID in +mps_demo.h zur Unterscheidung von anderen MPS_DLLs. +

    +

    I. Konzept +

    +

    Windowsseitig können über dynamische Bibliotheken (DLLs) +beliebig viele Funktionen (im folgenden MPS_Funktionen genannt) +eingerichtet werden, die innerhalb von MagiC_PC (motorolaseitig) +aufgerufen werden können. +

    +

    In der Startphase versucht MagiC_PC, alle DLLs im +Unterverzeichnis MPS zu laden und zu starten. Dazu ruft MagiC PC drei +von der DLL zu exportierende Funktionen auf (in dieser Reihenfolge): +

    + +
      +
    1. mps_get_type(): muß 0x4701 liefern! +
        +

    2. +
    3. mps_get_functionlist(...): ermittelt DLL_ID und +MPS_Funktionsliste der DLL. +
        +

    4. +
    5. mps_magicinfo: teilt MagiC PC-eigene Daten/Funktionen mit, die +die DLL bei Bedarf verwenden kann. +
        +

    6. +
    + +

    Alle in 2) angemeldeten Funktionen können über spezielle +Opcodes motorola-seitig aufgerufen werden. Näheres zum Aufruf siehe +IV. +

    +

    II. Zu exportierende Funktionen der DLL +("Basisfunktionen") +

    +

    Eine MPS-DLL muß genau 3 C-Funktionen unter fester Ordinalzahl +exportieren: (auch Basisfunktionen genannt) (siehe mfp_base.def, +mfp_base.cpp, mfp_base.h) +

    +
      +
    • @101: int mps_get_type() +
        +
      Zweck: Dient der Rückversicherung, ob tatsächlich MPS_DLL +erwischt. !! Rückgabewert: 0x4701 !! +
        +

    • +
    • @102: int mps_get_functionlist(DWORD *mps_dll_id,MPS_fuptr +**p_funktionsliste); +
        +
      Zweck: MagiC PC möchte DLL_ID und MPS_Funktionsliste wissen. +
        +
      Rückgabewerte: +
      *mps_ddl_id: DLL_ID (4 Bytes, DLL_spezifisch zu wählen!) +
      *p_funktionsliste: Zeiger auf Liste der MPS_Funktionen. +
      return: 1: alles klar +
        +

    • +
    • @103: void mps_magicinfo(MPS_magicinfo *is); +
        +
      Zweck: MagiC PC teilt eigene Infos / Funktionspointer mit, die +die DLL verwenden darf: +
        + +

         typedef struct {
      +    DWORD sizeof_str;               // Größe von MPS_magicinfo
      +    DWORD magic_version;            // z.B. 0x010001
      +    DWORD magic_date;               // z.B. 19960815 (aufsteigend)
      +    BYTE  is_demo;                  // Ist demoversion?
      +    BYTE  uu1, uu2, uu3;            // noch unbenutzt, 0
      +
      +    // Adressumrechnung Motorola -> Intel
      +    BYTE *(*intel_adr)(DWORD motadr);
      +    // Pointer-Umrechnung Motorola -> Intel (NULL bleibt NULL!)
      +    BYTE *(*intel_ptr)(DWORD motptr);
      +
      +    WORD (*swap_word)(WORD w);      // Ein Word swappen
      +    DWORD (*swap_long)(DWORD dw);   // Ein Langwort swappen
      +    } MPS_magicinfo;
      +
      +
      Die Adressumrechnungen ergeben NULL, falls motadr bzw motptr +ungültig ist. +
        +

    • +
    + +

    III. Die frei definierbaren MPS_Funktionen einer DLL: +

    +

    MPS_Funktionen haben grundsätzlich die Form +

    +

    void funktion_blabla( MPS_motregs *motregs ) +

    +

    motregs zeigt dabei auf die Liste der Motorola-Register d0-a7. +Der Inhalt der Register ist schon im richtigen Intel-ByteSex. Die +Motorola-Register dürfen auch mit neuen Werten beschrieben werden. +

    +

    Die DLL übergibt mit mps_get_functionlist die Liste der +Adressen aller solcher MPS_Funktionen. Die Funktionsnummern +entsprechen der Position der Funktion innerhalb der Liste. Soll eine +Nummer freibleiben, ist als Adresse 0xffffffff (= -1) zu übergeben. +Siehe auch mps_demo.cpp. +

    +

    IV. Motorola-seitiger Aufruf +

    +

    MPS_Funktionen werden durch einen 8-Byte-Opcode motorola-seitig +aufgerufen: +

    +
        dc.w    $4fbf       * 2 Bytes: nicht ändern
    +    dc.l    DLL_ID      * 4 Bytes: DLL-spezifische DLL_ID
    +    dc.w    Fkt_Nr.     * 2 Bytes: Funktionsnummer.
    +
    +

    Die DLL_ID ist die über mps_get_functionlist mitgeteilte DLL_ID +(4 Bytes!). Funktionsnummer ist die Position der Funktion in der über +mps_get_functionlist mitgeteilten Funktionsliste (Zählung beginnt bei +0). +

    +

    V. Sonstiges +

    + +
      +
    1. Jede DLL sollte eine individuelle DLL_ID verwenden, um +Konflikte zwischen mehreren DLLs zu vermeiden (siehe mps_demo.h). +DLL_IDs mit gesetztem Bit 31 sind für uns (Application Systems) bzw. +für zugeteilte IDs reserviert. Bitte wählen Sie deshalb keine DLL_ID +mit gesetztem Bit 31! Falls wir Ihnen eine reservierte DLL_ID zuteilen +sollen, setzen Sie sich bitte mit Herrn Hoffmann von Application +Systems in Verbindung. +
        +
      Folgende DLL IDs sind vergeben: +
        +

      +

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      DLL IDProgrammnameAuthor
      0x003f5c66MPCTimeRobert Weiß
      0x2053434BMPCSTiKDan Ackerman
      0x21342812Draconis Windows Sockets
      0x44594a01In2CatDimitri Junker
      0x44594a02Win_LnkDimitri Junker
      0x4e415446mpsyield
      0x50475752MPC_POWREmanuel Welter
      +
      + +

    2. +
    3. Achten Sie auf die Verschiebung des Adressraumes!! +
      Wollen Sie eine Motorola-Adresse DLL-seitig verwenden, ist zur +Konvertierung intel_adr(..) bzw. intel_ptr(..) aufzurufen (siehe +MPS_magicinfo in mps_base.h). Adressen aus dem DLL-Adressraum können +motorola-seitig NICHT verwendet werden! +
        +

    4. +
    5. Achten Sie auf den unterschiedlichen Byte-Sex zwischen +Motorola- und Intel-Prozessor. Worte und Langworte aus dem +Motorola-Adressraum müssen geswappt werden, damit sie in der DLL +richtig vorliegen. Beim eventuellen zurückschreiben ist wieder zu +swappen. Sie können dazu die Funktionen swap_word(..) bzw. +swap_long(..) aufrufen (siehe MPS_magicinfo in mps_base.h). Aber: Die +Elemente von MPS_motregs (d0-a7) liegen schon intelmäßig vor und +müssen nicht mehr geswappt werden. +
        +

    6. +
    + +

    14.2.1.1 mps_base.def

    +
    ; ========================================================
    +; Export-Definitionen für MPS MagiC_PC Progr.Schnittstelle    FS 15.08.96
    +; ========================================================
    +;
    +; !! NICHT ÄNDERN !!
    +; ==================
    +EXPORTS
    +   mps_get_type         @101
    +   mps_get_functionlist @102
    +   mps_magicinfo        @103
    +
    +

    14.2.1.2 mps_base.h

    +
    // Tabsize: 3
    +
    +// Letzte Änderung:  15.08.96
    +// Autor:   FS
    +
    +// ------------------------------------------------------------------------
    +//
    +// Die MagiC PC - Programmier-Schnittstelle
    +//
    +// mps_base.h: Basis-Include     !! UNVERÄNDERT ÜBERNEHMEN !!
    +//                               ======================
    +
    +#ifdef __cplusplus
    +   extern "C" {
    +#endif
    +
    +/* ========================================================================
    +   Die vom Anwender frei definierbaren DLL-Funktionen haben die Form
    +   void mps_funktion(MPS_motregs *r),
    +   wobei r ein Pointer auf die 16 Motorola-Register darstellt, also:
    +*/
    +   typedef struct {           // MPS_motregs = Die Motorola-Register
    +     long d0,d1,d2,d3,d4,d5,d6,d7;
    +     long a0,a1,a2,a3,a4,a5,a6,a7;
    +     } MPS_motregs;
    +                              // MPS_fuptr = Pointer auf eine MPS_Funktion:
    +   typedef void (*MPS_fuptr)(MPS_motregs *);
    +
    +
    +/* ============================================================
    +   Der DLL-Basisfunktion mps_info wird der folgende Infoblock
    +   MPS_infostr mitgegeben:
    +*/
    +   typedef struct {
    +     DWORD sizeof_str;           // Größe von MPS_infostr
    +     DWORD magic_version;        // z.B. 0x010001
    +     DWORD magic_date;           // z.B. 19960815     (aufsteigend)
    +     BYTE  is_demo;              // Ist demoversion?
    +     BYTE  uu1, uu2, uu3;        // noch unbenutzt, 0
    +
    +     // Adressumrechnung Motorola -> Intel
    +     BYTE *(*intel_adr)(DWORD motadr);
    +     // Pointer-Umrechnung Motorola -> Intel (NULL bleibt NULL!)
    +     BYTE *(*intel_ptr)(DWORD motptr);
    +
    +     WORD (*swap_word)(WORD w);           // Ein Word swappen
    +     DWORD (*swap_long)(DWORD dw);        // Ein Langwort swappen
    +     } MPS_magicinfo;
    +
    +// =============== zu exportieren sind 3 Basisfunktionen: =================
    +//
    +   int mps_get_type();                                              // @101
    +   int mps_get_functionlist(DWORD *mps_dll_id,                      // @102
    +                            MPS_fuptr **p_funktionsliste);
    +   void mps_magicinfo(MPS_magicinfo *is);                           // @103
    +//
    +// siehe auch mps_base.cpp, mps_base.def
    +
    +
    +#ifdef __cplusplus
    +   }
    +#endif
    +
    +

    Querverweise: MagiC PC-Schnittstelle +

    +

    14.2.1.3 mps_base.cpp

    +
    // Tabsize: 3
    +
    +// Letzte Änderung:  15.08.96
    +// Autor:   FS
    +
    +// ------------------------------------------------------------------------
    +// Demobeispiel zu MagiC PC - Programmier-Schnittstelle (MPS)
    +//
    +// Teil 1: Basisfunktionen, UNVERÄNDERT übernehmen!
    +// =======
    +//
    +// ------------------------------------------------------------------------
    +
    +#include "windows.h"
    +#include "mps_base.h"
    +#include "mps_demo.h"
    +
    +//
    +// Die folgenden 3 Basisfunktionen müssen von der DLL exportiert werden:
    +//
    +
    +
    +// 1) Basisfunktion @101: Typabfrage
    +// ---------------------
    +   int mps_get_type()
    +// ----------------
    + {
    +   return(0x4701);         // muß diesen Wert zurückgeben
    + }
    +
    +// 2) Basisfunktion @102: MagiC PC fordert Id und Funktionsliste an.
    +// ---------------------
    +   int mps_get_functionlist(DWORD *mps_dll_id,MPS_fuptr **p_funktionsliste)
    +// ------------------------
    + {
    +   *mps_dll_id = DLL_ID;         // benutzerdefinierte ID, siehe mps_demo.h
    +   *p_funktionsliste = my_funclist;  // Zeiger auf Funktionsliste eintragen
    +   return(1);
    + }
    +
    +// 3) Basisfunktion @103: MagiC PC übergibt MPS_magicinfo an die DLL
    +// ---------------------
    +   void mps_magicinfo(MPS_magicinfo *is)
    +// -------------
    + {
    +   m_info = *is;                    // Merken
    + }
    +
    +//
    +// ENDE Basisfunktionen ---------------------------------------------------
    +//
    +
    +
    +

    Querverweise: MagiC PC-Schnittstelle +

    +

    14.2.1.4 mps_demo.h

    +
    // Tabsize: 3
    +
    +// Letzte Änderung:  15.08.96
    +// Autor:   FS
    +
    +// ------------------------------------------------------------------------
    +// Demobeispiel zu MagiC PC - Programmier-Schnittstelle (MPS)
    +//
    +// Teil 2: Benutzer-definierte Funktionen, DLL_ID auf eigenen Wert ändern !
    +// =======
    +//
    +// ------------------------------------------------------------------------
    +
    +#define DLL_ID  0x01020304            // auf eigenen Wert ändern.
    +                                      // !! Werte mit gesetztem Bit 31
    +                                      // reserviert für Appl.Systems.
    +                                      // ID-Reservierung: Bei Appl.Systems
    +                                      // (Herrn Hoffmann) anfragen!
    +
    +   extern MPS_fuptr my_funclist[];    // Die Funktionsliste in der Demo-DLL
    +
    +   extern MPS_magicinfo m_info;       // wird von MagiC_PC übernommen
    +
    +

    Querverweise: MagiC PC-Schnittstelle +

    +

    14.2.1.5 mps_demo.cpp

    +
    // Tabsize: 3
    +
    +// Letzte Änderung:  15.08.96
    +// Autor:   FS
    +
    +// ------------------------------------------------------------------------
    +// Demobeispiel zu MagiC PC - Programmier-Schnittstelle (MPS)
    +//
    +// Teil 2: Benutzer-definierte Funktionen, frei änderbar.
    +// =======
    +//
    +// ------------------------------------------------------------------------
    +
    +#include "windows.h"
    +#include "mps_base.h"
    +#include "mps_demo.h"
    +
    +   MPS_magicinfo m_info;               // global für die DLL
    +
    +//
    +// Liste der benutzerdefinierten Funktionen (nach Bedarf ändern/erweitern):
    +// -----------------------------------------------------------------------
    +   static void demo_0(MPS_motregs *r);
    +   static void demo_1(MPS_motregs *r);
    +   static void demo_3(MPS_motregs *r);
    +   static void copy_string(MPS_motregs *r);
    +
    +   MPS_fuptr my_funclist[] = {
    +     demo_0,                        // Demo-Funktion 0
    +     demo_1,                        // Demo-Funktion 1
    +     (MPS_fuptr) -1,                // -1 (d.h Funktion Nummer 2
    +                                    //     nicht definiert)
    +     demo_3,                        // Demo-Funktion 3
    +     copy_string,                   // Demo-Funktion 4
    +     NULL                           // !! Am Listenende ein NULL-Eintrag !!
    +     } ;
    +
    +
    +// ************************************************************************
    +//
    +// Hier die benutzerdefinierten Funktionen:
    +// ========================================
    +//
    +
    +// Demo_0 liefert nur in d0 den Wert 1 zurück:
    +//
    +   static void demo_0(MPS_motregs *r)
    +// ----------------------
    + {
    +   r->d0 = 1;                       // Demo-0 setzt d0 auf 1
    +   return;
    + }
    +
    +// Demo_1 addiert die Register d1 und d2; Ergebnis nach d0:
    +//
    +   static void demo_1(MPS_motregs *r)
    +// ----------------------
    + {
    +   r->d0 = r->d1 + r->d2;
    +   return;
    + }
    +
    +// Demo_3 tut gar nichts:
    +//
    +   static void demo_3(MPS_motregs *r)
    +// ----------------------
    + {
    +   return;
    + }
    +
    +// Demo-Routine4 copy_string kopiert einen String in den Motorola-
    +// Adressraum:
    +//               -----------
    +// a0: Ziel-Adresse,
    +// d0: Maximalzahl der Zeichen (incl. 0)
    +//
    +   static void copy_string(MPS_motregs *r)
    +// -----------------------
    + {
    +   static char string[] = "Dies ist ein Demo-Text von copy_string(..)";
    +
    +   int i, nchmax;
    +   char *ziel;
    +
    +   nchmax = (int) r->d0;
    +   ziel = (char *) (*m_info.intel_ptr)(r->a0);
    +   if (nchmax<=0 || ziel==NULL) return;         // ungültig?
    +
    +   for (i=0; i<nchmax; i++) {
    +     if ((ziel[i] = string[i])==0)
    +       return;
    +     }
    +   ziel[nchmax-1] = 0;                          // zu lange->abschneiden
    +   return;
    + }
    +
    +

    Querverweise: MagiC PC-Schnittstelle +

    +

    14.2.1.6 testmps.s

    +
    +*                                                 FS  15.08.96
    +*
    +*   =============================================================
    +*   Beispiel für den Aufruf der MPS-Funktionen von Motorola aus
    +*   =============================================================
    +*
    +* Quelle Windows-seitig:
    +* ----------------------
    +* mps_base.cpp, mps_demo.cpp
    +*
    +mps_code .equ  $4fbf                   * !! NICHT ÄNDERN !!
    +DLL_ID   .equ  $01020304               * hier eigene DLL_ID eintragen
    +
    +* -------------------------------------- 60 Bytes Puffer
    +bufsize  .equ  60
    +.bss
    +.even
    +buffer:   ds.w  bufsize
    +* --------------------------------------
    +
    +
    +*
    +* ------------------- Hier gehts los: ---------------------------------
    +*
    +.text
    +.globl _main
    +_main:
    +      moveq    #-1,d0                  * d0 auf -1 (zum Testen)
    +
    +*     ===========================      * Funktion 0 (Demo_0) aufrufen:
    +      dc.w     mps_code                * = $4fbf
    +      dc.l     DLL_ID                  * = eigene DLL_ID
    +      dc.w     0                       * Funktionsnummer (hier 0)
    +*     ===========================
    +      cmpi.l   #1,d0                   * müßte 1 zurückliefern
    +      bne      fertig
    +
    +* Beispiel für Aufruf mit Parametern (copy_string)
    +* ----------------------------------
    +      movea.l  #buffer,a0              * Zeiger auf Puffer für String
    +      move.l   #bufsize,d0             * Max. Stringlänge (incl.0-Byte).
    +
    +*     ===========================      * Funktion 4 (copy_string) aufrufen:
    +      dc.w     mps_code                * = $4fbf
    +      dc.l     DLL_ID                  * = eigene DLL_ID
    +      dc.w     4                       * Funktionsnummer (hier 4)
    +*     ===========================
    +
    +      bsr      put_line                * Zeile (a0) ausgeben
    +fertig:
    +      bsr      wait                    * Auf Tastendruck warten
    +      rts
    +*
    +* --------------------- ENDE Hauptroutine _main ------------------------
    +*
    +
    +
    +* ------------------------ Zeile (a0) ausgeben -----------------------
    +put_line:
    +      moveq    #13,d0
    +      bsr      put_char
    +      moveq    #10,d0
    +put_lnext:
    +      bsr      put_char
    +      move.b   (a0)+,d0
    +      bne      put_lnext
    +      rts
    +
    +* ------------------------ Zeichen d0 ausgeben -----------------------
    +put_char:
    +      movem.l  d0-d2/a0-a2,-(sp)
    +      move.w   d0,-(sp)
    +      move.w   #2,-(sp)
    +      move.w   #3,-(sp)
    +      trap     #13
    +      addq.l   #6,sp
    +      movem.l  (sp)+,d0-d2/a0-a2
    +      rts
    +
    +* -------------------------- auf Tastendruck warten. --------------------
    +wait:
    +      move.w   #2,-(sp)
    +      move.w   #2,-(sp)
    +      trap     #13
    +      addq.l   #4,sp
    +      rts
    +
    +
    +

    Querverweise: MagiC PC-Schnittstelle +

    +

    14.2.2 mec1 Schnittstelle

    + +
      +
    1. Konzept +
        +
      Die mec1-Schnittstelle ermöglicht es, im Motorola-Code vom +Emulator vorgegebene Funktionen aufrufen. Sie entspricht der +mec0-Schnittstelle; die Funktionen sind jedoch nicht in einer DLL frei +definierbar, sondern schon vom Emulator vorgegeben. +
        +

    2. +
    3. Aufruf: Die Funktionen werden einheitlich durch den Opcode +$43bf aufgerufen, mit nachfolgender Funktionsnummer, also 4 Bytes +Gesamtlänge. Beispiel: +
        +
      dc.w $43bf,$0031 +
        +
      ruft die mec1-Funktion mit der Nummer 0x31 auf. ($43bf ist der +Opcode für chk <ea>,D1, mit <ea> = 111111 binär, also +ungültig). Die Parameter-Übergabe erfolgt wie bei mec0 über die +Motorola Register. +
        +

    4. +
    5. Die Funktionen +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      $0001 long emu_version: +
        +

      +
      + + + + + + + + + + + + + + + + +
      Parameter:keine
      return:d0: Versions-Nummer
       d1: Versions-Datum
       d2: Bit0: Ist Demo-Version?
      +
      + +
      $0002 long emu_enquire: Ermittelt Verschiedenes. +
        +

      +
      + + + + + + + + +
      Parameter:long d0: was willst Du wissen?
      return:long d0: Wert
      +
      + +
      bisher definiert: +
        +

      +
      + + + + + + + + + + + + +
      was:1: Versionsnummer
       2: Versionsdatum
       3: Ist Demo?
      +
      + +
      $0003 void emu_getexepath: Ermittelt vollen Pfad (incl. Laufwerk, +ohne MAGIC_PC.EXE) +
        +

      +
      + + + + + + + + +
      Parameter:a0: char *bufadr (Buffer)
       d0: short nb_max (max. Byteszahl für Buffer)
      +
      + +
      $0004 int emu_install_newvdi: +
        +

      +
      + + + + + + + + + + + + + + + + + + + + +
      Parameter:a0: Byte *bufadr (neuer Inhalt von NVDI_PC.DLL)
       d0: long nbytes (Länge)
      return:d0: >0: erfolgreich NVDI_PC.DLN erzeugt.
       Beim nächsten Hochstarten wird automatisch
       umbenannt in NVDI_PC.DLL, wie besprochen.
      +
      + +
      $0008 +
        +

      +
      + + + + + + + + + + + + +
      Parameter:d0: unknown
       d1: unknown
       d2: unknown
      +
      + +
      $0009 +
        +

      +
      + + + + +
      Parameter:a0: unknown
      +
      + +
      $0010 void dw_addline:  ! ab 03.97 +
        +
      Text in neuer Zeile im Debug-Fenster ausgeben +
        +

      +
      + + + + +
      Parameter:a0: Zeiger auf den Text.
      +
      + +
      $0011 void dw_addtext:  ! ab 03.97 +
        +
      Text im Debug-Fenster ausgeben +
        +

      +
      + + + + +
      Parameter:a0: Zeiger auf den Text.
      +
      + +
      $0012 void dw_formtxt:  ! ab 03.97 +
        +
      Text sprintf-like im Debug-Fenster ausgeben +
        +

      +
      + + + + + + + + + + + + + + + + + + + + +
      Parameter:a0: Zeiger auf den Format-String
       d0, d1, ... zusätzliche Parameter, passend zu
       dem Format-String. Der Formatstring entspricht
       ungefähr sprintf(format,...); Stringpointer
       sind jedoch nicht zulässig.
      +
      + +
      $0020 enq_bigscreen +
        +

      +
      + + + + + + + + + + + + + + + + + + + + + + + + +
      Parameter:a0: unknown
      Return:d0<>0: All OK, 0=Error
       d1: unknown
       d2: unknown
       d3: unknown
       d4: unknown
      +
      + +
      $0021 new_bigscreen +
        +

      +
      + + + + + + + + + + + + + + + + +
      Parameter:d1: unknown
       d2: unknown
       d3: unknown
       d4: unknown
      +
      + +
      $0022 +
        +

      +
      + + + + +
      Parameter:d0: unknown
      +
      + +
      $0028 +
        +

      +
      + + + + + + + + +
      Parameter:d0: unknown
      Return:d0: unknown
      +
      + +
      $0031 int printer_open  ! ab 03.97 +
        +
      printer_open öffnet den Standarddrucker und beginnt ein neues +Dokument +
        +

      +
      + + + + + + + + + + + + +
      Parameter:a0: char *DocName (NULL-Pointer erlaubt)
      return:d0>0: alles klar
       d0<=0 Fehler
      +
      + +
      $0032 int printer_close  ! ab 03.97 +
        +
      printer_close beendet das zuvor geöffnete Dokument und +schließt den Drucker +
        +

      +
      + + + + + + + + + + + + +
      Parameter:keine
      return:d0>0: alles klar
       d0<=0 Fehler
      +
      + +
      $0033 int printer_write  ! ab 03.97 +
        +

      +
      + + + + + + + + + + + + +
      Parameter:a0: Byte *pData; // Zeiger auf den DatenBuffer
      d0: long nBytes; // Zahl der Bytes im Buffer
      return:d0: übertragene Bytes.
      +
      + +
      $0040 DWORD getTickCount  ! ab 03.97 +
        +

      +
      + + + + +
      return:d0: TickCount (msec seit Start des Rechners)
      +
      + +
      $0041 DWORD getDrivePath  ! ab 02.99 +
        +
      Die Funktion ermittelt den Windows-Pfad für ein Magic-Laufwerk. +
        +

      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Parameter:d0: DriveNr (0 für A:, 1 für B:, ...)
       a0: Textbuffer für den Pfad
       d1: Größe des Textbuffers
      return:d0: 0: nicht gefunden,
           1: Container-Laufwerk,
           2: xfs-Laufwerk (Windows-Laufwerk)
           4: Floppy-Laufwerk
      +
      + +
      $0042 DWORD setClipboardDir  ! ab 02.99 +
        +

      +
      + + + + + + + + +
      Parameter:a0: char *pPath // NULL: auf Default setzen
      return:d0: 1
      +
      + +
      Beispiel: +
        +
              movea.l stringadr,a0   *
      +        dc.w    $43bf,$0042    * mec1,Funktion $42 aufrufen
      +        tst.l   d0             * -1: Fkt. nicht implementiert
      +        jl  nichtimplementiert
      +
      +
      $0043 long getMouseWheel +
        +

      +
      + + + + + + + + + + + + +
      Parameter:d0.l: 1: Position nach dem Auslesen zurücksetzen
            0: Position nach dem Auslesen nicht zurücksetzen
      return:d0.l: aktuelle Position des Mausrades
      +
      + +
      Beispiel: +
        +
              moveq   #1,d0       * Position nach dem Auslesen
      +                            * zurücksetzen
      +        dc.w    $43bf,$0043 * mec1,Funktion $43 aufrufen
      +        tst.l   d0          * Position seit letztem
      +                            * zurücksetzen geändert
      +        je  no_action
      +        <d0.l verarbeiten>
      +
      +
      $0045 long setCompiler  ! ab 17.06.99 +
        +

      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Parameter:d0.l: Auswahl, im Moment realisert:
       d0 = 1: Compiler ein/ausschalten:
       ————————-
       d1 = 0: Compiler aus,
       d1 = 1: Compiler ein
       d1 = -1: Modus erfragen (Nach meinen Erfahrungen
                funtioniert dies nicht, soll aber in
                der 6.20 funktionieren)
      return:alter Modus (0 oder 1).
      +
      + + +
      + +

    6. +
    + +

    14.2.3 mec2 Schnittstelle

    + +
      +
    1. Konzept +
        +
      Die mec2-Schnittstelle wird von XFS_PC.LDR zur Verfügung +gestellt. +
        +

    2. +
    3. Aufruf: Die Funktionen werden einheitlich durch den Opcode +$45bf aufgerufen, mit nachfolgender Funktionsnummer, also 4 Bytes +Gesamtlänge. Beispiel: +
        +
      dc.w $45bf,$0001 +
        +

    4. +
    5. Die Funktionen +
        +
      Details über die einzelnen Funktionen sind z.Z. noch nicht +bekannt. +
        +

    6. +
    + +

    14.2.4 mec3 Schnittstelle

    + +
      +
    1. Konzept +
        +
      Die mec3-Schnittstelle wird von MPC_ACC zur Kommunikation mit +MagiCPC benutzt. +
        +

    2. +
    3. Aufruf: Die Funktionen werden einheitlich durch den Opcode +$47bf aufgerufen, mit nachfolgender Funktionsnummer, also 4 Bytes +Gesamtlänge. Beispiel: +
        +
      dc.w $47bf,$0001 +
        +

    4. +
    5. Die Funktionen +
        + + + + + + + + + + + + + + + +
      $0001 long mpc_shutdown: +
        +
      MagiCPC beenden. +
        +

      +
      + + + + + + + + +
      Parameter:Keine
      Return:d0<>0: All OK, 0=Error
      +
      + +
      $0002 long mpc_restart: +
        +
      MagiCPC neu starten. +
        +

      +
      + + + + + + + + +
      Parameter:Keine
      Return:d0<>0: Alles OK, 0=Fehler
      +
      + +
      $0010 : long start_winfile +
        +
      Windows-Programm ausführen. +
        +

      +
      + + + + + + + + + + + + + + + + + + + + +
      Parameter:a0: pathname (must not be null)
       a1: command line (can be null)
       a2: environment (can be null)
       a3: current directory (can be null)
      Return:d0<>0: Alles OK, 0=Fehler
      +
      + +
      $0020 : long mpc_control +
        +
      This function has several subfunctions, whose number is passed +in d0.l +
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      $0010 mpc_init +
        +
      Tell MagiCPC that MPC_ACC is active. +
        +

      +
      + + + + + + + + +
      Parameter:Keine
      Return:d0<>0: Alles OK, 0=Fehler
      +
      + +
      $0011 mpc_exit +
        +
      Tell MagiCPC that MPC_ACC is no longer active. +
        +

      +
      + + + + + + + + +
      Parameter:Keine
      Return:d0<>0: Alles OK, 0=Fehler
      +
      + +
      $0020 mpc_control +
        +
      Ask MagiCPC whether a shutdown should be initiated. +
        +

      +
      + + + + + + + + +
      Parameter:Keine
      Return:d0>0: Shutdown should be started.
      +
      + +
      $0021 mpc_shutdown_start Tell MagiCPC that shutdown has started. +
        +

      +
      + + + + + + + + +
      Parameter:Keine
      Return:d0>0: Shutdown should be started.
      +
      + +
      $0022 mpc_shutdown_completed +
        +
      Tell MagiCPC that shutdown has successfully completed. +
        +

      +
      + + + + + + + + +
      Parameter:Keine
      Return:Keine
      +
      + +
      $0023 mpc_shutdown_cancelled +
        +
      Tell MagiCPC that shutdown has been canceled. +
        +

      +
      + + + + + + + + +
      Parameter:Keine
      Return:Keine
      +
      + +
      $0030 mpc_execute +
        +
      Get filename to be executed from MagiCPC. +
        +

      +
      + + + + + + + + + + + + + + + + + + + + +
      Parameter:a1: pathname
       d1: max length for pathname
       a2: command line
       d2: max length for command line
      Return:d0<>0: Alles OK, 0=Fehler
      +
      + +
      $0031 mpc_start_exe +
        +
      Windows-Programm ausführen. Diese Funktion wird benutzt, wenn +Parameter per VA_START an MPC_ACC gesendet werden. +
        +

      +
      + + + + + + + + +
      Parameters:a0: pointer to argument vector
      Return:d0<>0: Alles OK, 0=Fehler
      +
      + +
      $0040 mpc_debout +
        +
      Text sprintf-like im Debug-Fenster ausgeben +
        +

      +
      + + + + + + + + + + + + + + + + + + + + + + + + +
      Parameters:a0: Zeiger auf den Format-String
       d1, ... d7 zusätzliche Parameter, passend zu
       dem Format-String der Formatstring entspricht
       ungefähr sprintf(format,...); Stringpointer
       sind jedoch nicht zulässig.
      Return:Keine
      +
      + +
      others For unknown/illegal subfunction codes, -1 is returned in d0.l +
        + +
      + +
      others For unknown/illegal function codes, -1 is returned in d0.l +
        + +
      + +

    6. +
    + +

    14.2.5 mecnvdi Schnittstelle

    + +
      +
    1. Konzept +
        +
      Die mecnvdi-Schnittstelle wird von NVDI_PC.DLL zur Verfügung +gestellt. +
        +

    2. +
    3. Aufruf: Die Funktionen werden einheitlich durch den Opcode +$41bf aufgerufen, mit nachfolgender Funktionsnummer, also 4 Bytes +Gesamtlänge. Beispiel: +
        +
      dc.w $41bf,$0001 +
        +

    4. +
    5. Die Funktionen +
        +
      Details über die einzelnen Funktionen sind z.Z. noch nicht +bekannt. +
        +

    6. +
    + +
    + +Home +EmulatorenEmulatoren +MagiC Mac-SpezifikaMagiC Mac-Spezifika +STEmulatorSTEmulator + + diff --git a/de/emulators_others.html b/de/emulators_others.html new file mode 100644 index 000000000..e8830fb28 --- /dev/null +++ b/de/emulators_others.html @@ -0,0 +1,251 @@ + + + + + +Die Anleitung zum TOS: Detecting the presence of TosBox, Steem and PaCifiST + + + + + + + + + +Home +EmulatorenEmulatoren +TOS2WINTOS2WIN +ProtokolleProtokolle + +
    + +

    14.5 Detecting the presence of TosBox, Steem and PaCifiST

    + + + +
    ; FOR ST PROGRAMMERS - How to detect PaCifiST (0.46 or greater)
    +;
    +; When Vsync is called with d6=d7='Emu?' and those registers are
    +; altered, you can assume you're running under an emulator.
    +
    +; If d6='PaCi' & d7='fiST', then it's under PaCifiST and a0 points out
    +; some extra hardware registers:
    +;
    +; 0     BYTE    major version (BCD)
    +; 1     BYTE    minor version (BCD)
    +
    +; TosBox
    +; The approved method, à la PaCifiST, is to call Vsync with d6 = d7 =
    +; 'Emu?'($456D753F). On return, d6 will contain 'TBox' ($54426f78) and
    +; d7 will contain the ASCII-encoded version number.
    +
    +; Steem
    +; modified 16/4/02 by Anthony Hayward to recognize Steem - that
    +; returns d6='STEe'=$53544565, d7='mEng'=$6d456e67. Since v2.4
    +; a0 points to extra information (read-only unless stated):
    +;
    +; 0     BYTE    Major version (BCD)
    +; 1     BYTE    Minor version (BCD)
    +; 2     BYTE    Slow motion flag
    +; 3     BYTE    Slow motion speed (%)
    +; 4     BYTE    Fast forward flag
    +; 5     BYTE    Millions of cpu cycles per second (read-write on v3+,
    +;               changes at next VBL)
    +; 6     BYTE    Debug build flag
    +; 7     BYTE    Snapshot loaded flag (read-write). If you set this
    +;               flag to 0 at the start of your program then you
    +;               can detect users loading snapshots.
    +; 8     WORD    Run speed (%) (read-write on v3+)
    +; 10    WORD    How fast Steem is actually managing to run
    +;               as a percentage. If the computer is fast enough
    +;               this will equal run speed most of the time. It
    +;               is updated every 12 VBLs and can jump around a bit.
    +;
    +; The following are available on Steem v2.5 and higher:
    +;
    +; 12    LONG    Cycle count (overflows every 8 minutes at 8Mhz)
    +; 16    LONG    Cycle count at start of frame (last VBL interrupt)
    +; 20    LONG    Cycle count at start of line (last HBL interrupt)
    +; 24    WORD    Signed word containing the number of the current line.
    +;               In low/medium res the first line after the top border
    +;               is 0, the last before the bottom border is 199.
    +; 26    BYTE    Print ST logs in user build flag (read-write). If you
    +;               set this flag then writing the address of a NULL-
    +;               terminated string to 0xffc1f0 will output it to the
    +;               parallel port. In the debug build the string is always
    +;               written to the log file.
    +;
    +; The following are available on Steem v3.2 and higher:
    +;
    +; 27    BYTE    Super video mode (read-write). This register is here
    +;               to allow developers to test Falcon graphics using
    +;               Steem. Possible values are 0 - normal ST mode,
    +;               1 - Falcon 256 colour (palette at $FF9800),
    +;               2 - Falcon true colour (16-bit).
    +;               Note: You can't switch to super video from ST high res
    +;               or if Steem is running in 256 colour mode. To check
    +;               for this, read the register back immediately after
    +;               setting it.
    +; 28    BYTE    Super video size (read-write) 0=320x200, 1=640x400,
    +;               2=320x240, 3=640x480.
    +;
    +; There are two write-only registers:
    +;
    +; 0     LONG    (Steem v3+) This register allows you to create new
    +;               disk images in the user's home directory. You must
    +;               write the address of a string in ST memory that
    +;               contains the disk name and a parameter list separated
    +;               by NULLs; the string must be double NULL-terminated.
    +;               The first parameter is the number of sides the disk
    +;               should have, the second the number of tracks and the
    +;               third sets the sectors per track. All parameters are
    +;               passed as strings. Here is an example:
    +;
    +;   create_disk_string:  dc.b   'New Disk Name',0,'2',0,'80',0,'11',0,0
    +;
    +;               That will create a 900 kb disk with the name
    +;               "New Disk Name.st". Once the disk is created it will
    +;               be inserted into drive A. Make sure you delay for half
    +;               a second after creating a new disk before accessing it
    +;               - this allows TOS to detect media change.
    +;
    +; 4     BYTE    (Steem v3.2+) Writing anything to this address will
    +;               disable the extra hardware registers. When the
    +;               hardware registers are available, some ST programs
    +;               may detect they are running on a Falcon; to stop that,
    +;               write to this when you no longer need the extra
    +;               features. Any writes to extra registers after writing
    +;               a byte here will cause a bus error.
    +;
    +; Every address up to offset 31 is reserved for future use (won't
    +; cause bus errors on read or write). If you want anything put in
    +; here let us know (steem@gmx.net).
    +
    +        move.l  #'Emu?',d5
    +        move.l  d5,d7
    +        move.l  d5,d6
    +        move    #$25,-(a7)
    +        trap    #$e
    +        addq.l  #2,a7
    +        move.l  a0,regbase
    +
    +        cmp.l   d5,d6
    +        bne.s   under_emu
    +        cmp.l   d5,d7
    +        bne.s   under_emu
    +
    +        lea     no_emu(pc),a0
    +        bra.s   print_and_quit
    +
    +under_emu:
    +        cmp.l  #'PaCi',d6
    +        bne.s  not_pacifist
    +        cmp.l  #'fiST',d7
    +        bne.s  not_pacifist
    +
    +        pea     getversion_pacifist(pc)
    +        move.w  #$26,-(a7)
    +        trap    #$e
    +        addq.l  #6,a7
    +        lea     pacifist_emu(pc),a0
    +        bra.s   print_and_quit
    +
    +not_pacifist:
    +        cmp.l   #"TBox",d6
    +        bne.s   not_tosbox
    +
    +        move.l  #tosbver+1,d0
    +        and     #$fffe,d0
    +        move.l  d0,a0
    +        move.l  d7,(a0)
    +        lea     tosbox_emu(pc),a0
    +        bra.s   print_and_quit
    +
    +not_tosbox:
    +        cmp.l   #'STEe',d6
    +        bne.s   not_steem
    +        cmp.l   #'mEng',d7
    +        bne.s   not_steem
    +
    +        pea     getversion_steem(pc)
    +        move.w  #$26,-(a7)
    +        trap    #$e
    +        addq.l  #6,a7
    +        lea     steem_emu(pc),a0
    +        bra.s   print_and_quit
    +
    +not_steem:
    +        lea     an_emu(pc),a0
    +
    +print_and_quit:
    +        pea     (a0)
    +        move    #9,-(a7)
    +        trap    #1
    +
    +        addq.l  #6,a7
    +        move    #1,-(a7)
    +        trap    #1
    +
    +        addq.l  #2,a7
    +        clr.w   -(a7)
    +        trap    #1
    +
    +getversion_pacifist:
    +        move.l  regbase(pc),a0
    +        move.b  (a0),d0
    +        add.b   d0,pacifist_majorv
    +        move.b  1(a0),d0
    +        move    d0,d1
    +        lsr     #4,d1
    +        and     #$f,d0
    +        and     #$f,d1
    +        add.b   d1,pacifist_minorv
    +        add.b   d0,pacifist_minorv+1
    +        rts
    +
    +getversion_steem:
    +        move.l  regbase(pc),a0
    +        move.b  (a0),d0
    +        add.b   d0,steem_majorv
    +        move.b  1(a0),d0
    +        move    d0,d1
    +        lsr     #4,d1
    +        and     #$f,d0
    +        and     #$f,d1
    +        add.b   d1,steem_minorv
    +        add.b   d0,steem_minorv+1
    +        rts
    +
    +
    +  SECTION DATA
    +
    +regbase     dc.l    0
    +
    +no_emu:          dc.b    "It seems you're running under a",13,10
    +                 dc.b    "mere ST.",13,10,0
    +
    +an_emu:          dc.b    "It seems you're running under an",13,10
    +                 dc.b    "emulator.",13,10,0
    +
    +steem_emu:       dc.b    "You're running under Steem v"
    +steem_majorv:    dc.b    "0."
    +steem_minorv:    dc.b    "00.",13,10,0
    +
    +pacifist_emu:    dc.b    "You're running under PaCifiST v"
    +pacifist_majorv: dc.b    "0."
    +pacifist_minorv: dc.b    "00.",13,10,0
    +
    +tosbox_emu:      dc.b    "You're running under TOSBOX "
    +tosbver          dcb.b   32,5
    +                 dc.b    13,10,0
    +
    +
    + +Home +EmulatorenEmulatoren +TOS2WINTOS2WIN +ProtokolleProtokolle + + diff --git a/de/emulators_stem.html b/de/emulators_stem.html new file mode 100644 index 000000000..6ff62b684 --- /dev/null +++ b/de/emulators_stem.html @@ -0,0 +1,60 @@ + + + + + +Die Anleitung zum TOS: STEmulator + + + + + + + + + +Home +EmulatorenEmulatoren +MagiC PC-SchnittstelleMagiC PC-Schnittstelle +TOS2WINTOS2WIN + +
    + +

    14.3 STEmulator

    +

    Der STEmulator emuliert einen Motorola 68000 Mikroprozessor und +die in einem Atari ST vorhandene Hardware wie MFP, Shifter, MMU oder +Blitter. Zum sinnvollen Betrieb wird ein Pentium PC und Windows +95/98/NT benötigt. +

    +

    Seit der Version 1.21 wird ein Cookie angelegt, der anzeigt, +dass der STEmulator aktiv ist. Er lautet STEM und sein Wert zeigt +zurzeit auf folgende Struktur: +

    +
    struct _stemu_vars
    +{
    +  int16_t Version;           /* z.B. 0x0121 Version 1.21    */
    +  int32_t unused             /* 0 solange unbenutzt         */
    +}
    +
    +

    Des Weiteren werden Cookies für die Landessprache (_AKP), die +Zeitdarstellung (_IDT), das HD-Laufwerk (_FDC) und die Switches +(_SWI) gesetzt. +

    +

    Der Cookie für die GEMDOS-Netzwerks-Erweiterung (_FLK) ist +gesetzt und die entsprechenden GEMDOS-Funktionen sind vorhanden. +

    +

    Der Cookie MNAM zeigt auf den Maschinen-Namen hier: STEmulator +

    +

    Der STEmulator stellt folgende GEMDOS-Funktionen zur Verfügung: +

    +

    STEFcntrl +

    +
    + +Home +EmulatorenEmulatoren +MagiC PC-SchnittstelleMagiC PC-Schnittstelle +TOS2WINTOS2WIN + + diff --git a/de/emulators_tos2win.html b/de/emulators_tos2win.html new file mode 100644 index 000000000..cb43b4b58 --- /dev/null +++ b/de/emulators_tos2win.html @@ -0,0 +1,189 @@ + + + + + +Die Anleitung zum TOS: TOS2WIN + + + + + + + + + +Home +EmulatorenEmulatoren +STEmulatorSTEmulator +Detecting the presence of TosBox, Steem and PaCifiSTDetecting the presence of TosBox, Steem and PaCifiST + +
    + +

    14.4 TOS2WIN

    +

    Tos2Win Cookie +

    +

    Um feststellen zu können welche Tos2Win Version und welche +Features vorhanden sind, gibt es ab Version 1.19 einen Cookie '_T2W' +mit einem Zeiger auf folgende Datenstruktur: +

    + + + + + + + + + + + + +
    1 x Word Länge der Struktur +
    1 x Word Version in BCD d.h. $0119 = Version 1.19 +
    1 x Long Offset des Atari-Speichers im PC-Speicher zum Umrechnen von +Zeigern +
    4 x Long Bitfelder für einzelne T2W Features + +
    + +

    +
    PC-DLL's aufrufen ab Version 1.19J +

    +

    In TOS2WIN werden alle PC-Aufrufe über die Sequenz $4858 +eingeleitet, danach folgt der Gruppencode z.B. $5043 für die +DLL-Funktionen und wird mit der Funktionsnummer z.B. $0000 +abgeschlossen. +

    +

    Ein Aufruf einer DLL-Funktion würde also wie folgt aussehen: +

    +
    FunktionsAnfang
    +                    .
    +                    .
    +                    .
    +                  $4858
    +                  $5043
    +                  $0000
    +                    .
    +                    .
    +                    .
    +Funktionsende      RTS
    +
    +

    Die Parameter für die Funktion liegen ab A7 + 4. d.h. Alle +notwendigen Parameter auf den Stack legen (immer nur Langworte) und +dann ein bsr auf FunktionsAnfang. +

    +

    Alle an die PC-Funktion übergebenen Zeiger auf Werte im +Atarispeicher müssen mit einem Offset korrigiert werden. +Atari-Adresse plus Offset ist PC-Adresse. Den Offset bekommt man +entweder über den Tos2Win-Cookie oder über die DLL-Funktion $0000. +Der Offset verändert sich während der Laufzeit des Programms nicht. +

    +

    DLL-Funktion +

    + + + + + + + + + + + + + + + +
    $0000 LONG HoleOffset() +
      + + + +
    Rückgabewert: Liefert in D0 den Offset zum umrechnen zurück. + +
    + +
    Diese Funktion kann auch dazu benutzt werden, um festzustellen, +ob die nachfolgenden Funktionen vorhanden sind. Einfach das Register +D0 mit Null laden und die Funktion aufrufen. Wenn immer noch Null in +D0 steht, sind die Funktionen nicht implementiert. +
      +
    $0001 LONG OpenLibrary(Name) +
      + + + + + + +
    Name : Zeiger auf einen Nullterminierten String, der den Namen der +gewünschten DLL enthält z.B. 'GDI32.DLL' (der Zeiger muß mit dem +Offset korrigiert werden). +
    Rückgabewert: Liefert in D0 ein Handle auf die DLL zurück. + +
    + +
    $0002 VOID CloseLibrary(Handle) +
      + + + +
    Handle : Handle auf die zu schließende DLL. wenn der interne Zähler +Von Windows bei Null angekommen ist, wird die DLL aus dem Speicher +entfernt. + +
    + +
    $0003 LONG GetFunctionAdress(Handle,Name) +
      + + + + + + + + + +
    Handle : Handle auf die DLL. +
    Name : Zeiger auf einen Nullterminierten String, der den Namen der +Funktion enthält. (Zeiger muß korrigiert werden) +
    Rückgabewert: Adresse der Funktion im PC-Speicher + +
    + +
    $0004 LONG CallLibraryFunction(Adr,Anzahl,.....) +
      + + + + + + + + + + + + +
    Adr : Adresse der gewünschten Funktion. +
    Anzahl : Anzahl der an die PC-Funktion zu übergebenden Parameter. +
    .... : Die entsprechenden Parameter (Zeiger müssen korrigiert werden) +
    Rückgabewert: eventueller Rückgabewert der PC-Funktion. + +
    + + +
    + +
    + +Home +EmulatorenEmulatoren +STEmulatorSTEmulator +Detecting the presence of TosBox, Steem and PaCifiSTDetecting the presence of TosBox, Steem and PaCifiST + + diff --git a/de/evnt.html b/de/evnt.html new file mode 100644 index 000000000..19e009531 --- /dev/null +++ b/de/evnt.html @@ -0,0 +1,7422 @@ + + + + + +Die Anleitung zum TOS: Ereignisverwaltung + + + + + + + + + +Home +AESAES +Editobjekt-FunktionenEditobjekt-Funktionen +FensterdialogeFensterdialoge + +
    + +

    8.7 Ereignisverwaltung

    +

    Diese Bibliothek stellt Funktionen zur Verfügung, mit deren +Hilfe Ereignisse erkannt und bearbeitet werden können. Für diesen +Zweck stehen die folgenden Routinen zur Verfügung: +

    + + + + + + + + + + + + + + + + + + + + + +
    evnt_button Auf Maustastendruck warten. +
    evnt_dclick Geschwindigkeit für Doppelklicks ermitteln/ändern. +
    evnt_keybd Auf Tastendruck warten. +
    evnt_mesag Auf Mitteilung warten. +
    evnt_mouse Auf Bewegungen des Mauszeigers warten. +
    evnt_multi Auf mehrere Ereignisse reagieren. +
    evnt_timer Auf Zeit-Ereignis warten. + +
    + + + + + + + +
    Standard-Nachrichten   +
    Nachrichten-Liste Übersicht von allen bekannten Nachrichten + +
    + +

    Hinweis: Unter Ereignissen sind in diesem Fall Nachrichten, +Tastaturklicks, Mausbewegungen, Zeitereignisse usw. zu verstehen. +

    +

    Querverweis: AES   GEM   Style-Guidelines +

    +

    8.7.1 evnt_button

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Event Button« - wartet auf einen Mausknopfereignis. +
      +
    AES-Nummer: 21 +
      +
    Deklaration: int16_t evnt_button ( int16_t ev_bclicks, int16_t ev_bmask, +int16_t ev_bstate, int16_t *ev_bmx, int16_t *ev_bmy, int16_t +*ev_bbutton, int16_t *ev_bkstate ); +
      +
    Beschreibung: Die Funktion wartet auf einen Button-Event, d.h. bis die in +ev_bmask spezifizierten Mausknöpfe in den in +ev_bstate angegeben Zustand versetzt werden. Genauer: +
      +
    Die Funktion wartet bis das verlangte Ereignis einmal +eingetreten ist. Danach wird gewartet und kontrolliert, ob das +Ereignis noch einmal auftritt. Falls das Ereignis ev_bclicks +mal eingetreten (oder die über evnt_dclick einstellbare Zeit +abgelaufen) ist, kehrt die Funktion sofort zurück. +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Parameter Bedeutung +
        +
    ev_bclicks maximale Anzahl der Klicks +
    ev_bmask einen Bitvektor, der die zu betrachtenden Knöpfe mit einer 1 +maskiert. Dabei gilt +
    +
    + + + + + + + + + + + + + + + +
    Bit-0=linker Knopf
    Bit-1=rechter Knopf.
    Bit-2=mittlerer Knopf, PC-GEM
    +
    + +
    ev_bstate einen Bitvektor wie ev_bmask, der für jeden Knopf +festlegt welchen Status er erreichen muß. Es gilt: +
    +
    + + + + + + + + + + +
    0=nicht gedrückt
    1=gedrückt
    +
    + +
    ev_bmx   +
    ev_bmy die x bzw. y Koordinate der Maus zum Zeitpunkt des Auftretens +des Ereignisses +
    ev_bbutton der Zustand der Mausknöpfe beim Auftreten des Ereignisses +(analog ev_bstate) +
    ev_bkstate den Zustand der Sondertasten der Tastatur beim Auftreten des +Ereignisses +
    +
    + + + + + + + + + + + + + + + + + + + + +
    0x001=rechte Shifttaste
    0x002=linke Shifttaste
    0x004=Controltaste
    0x008=Alternatetaste
    +
    + +
    Bei gedrückter Taste wird das entsprechende Bit gesetzt + +
    + +
    Hinweis: Ab PC-GEM/3 unterstützen die Event-Funktionen +nur noch eine Maustaste. Obwohl offiziell nicht dokumentiert, +ist es auch möglich beide Maustasten unabhängig voneinander +abzufragen. Die folgende Methode wird z.B. vom Atari-Desktop benutzt, +und funktioniert seit TOS 1.0: +
      +
    ev_bclicks += 0x100; +
      +
    In diesem Fall wird auf das folgende Ereignis gewartet: +(ev_bstate & ev_bmask) != (*ev_bbutton & ev_bmask) +
      +
    Ergebnis: Die Funktion liefert die Anzahl der tatsächlich vorgenommenen +Mausklicks. +
      +
    Verfügbar: All AES versions. +
      +
    Gruppe: Ereignisverwaltung +
      +
    Querverweis: Binding   evnt_multi   Nachrichten +
      + +
    + +

    8.7.1.1 Bindings für evnt_button

    + + + + + + + + + +
    C: int16_t evnt_button ( int16_t ev_bclicks, int16_t ev_bmask, +int16_t ev_bstate, int16_t *ev_bmx, int16_t *ev_bmy, int16_t +*ev_bbutton, int16_t *ev_bkstate ); +
      +
    Umsetzung: +
      +
    int16_t evnt_button (int16_t ev_bclicks, int16_t ev_bmask,
    +                     int16_t ev_bstate,  int16_t *ev_bmx,
    +                     int16_t *ev_bmy, int16_t *ev_bbutton,
    +                     int16_t *ev_bkstate )
    +{
    +   int_in[0] = ev_bclicks;
    +   int_in[1] = ev_bmask;
    +   int_in[2] = ev_bstate;
    +
    +   crys_if (21);
    +
    +   *ev_bmx     = int_out[1];
    +   *ev_bmy     = int_out[2];
    +   *ev_bbutton = int_out[3];
    +   *ev_bkstate = int_out[4];
    +
    +   return ( int_out[0] );
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]21 # Opcode der Funktion
    control+2control[1]3 # Einträge in int_in
    control+4control[2]5 # Einträge in int_out
    control+6control[3]0 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_inint_in[0]ev_bclicks
    int_in+2int_in[1]ev_bmask
    int_in+4int_in[2]ev_bstate
    int_outint_out[0]Return-Wert
    int_out+2int_out[1]ev_bmx
    int_out+4int_out[2]ev_bmy
    int_out+6int_out[3]ev_bbutton
    int_out+8int_out[4]ev_bkstate
    +
    + + +
    + +

    8.7.2 evnt_dclick

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Event Doubleclick« - ermittelt oder legt den Zeitraum +zwischen den beiden Klicks eines Doppelklicks fest. +
      +
    AES-Nummer: 26 +
      +
    Deklaration: int16_t evnt_dclick ( int16_t ev_dnew, int16_t ev_dgetset ); +
      +
    Beschreibung: Die Funktion setzt oder ermittelt die Geschwindigkeit mit der +Doppelklicks der Maus ausgeführt werden müssen. Es gilt: +
      +

    +
    + + + + + + + + + + + + + + + + +
    ParameterBedeutung
    ev_dnewneue Geschwindigkeit von 0 (langsam) bis 4 (schnell).
    ev_dgetset0 = aktuellen Wert ermitteln
     1 = neuen Wert setzen
    +
    + +
    Hinweis: Man sollte immer daran denken, daß es Menschen +gibt, die mit zu hohen Geschwindigkeiten Probleme haben, und dann +keine Doppelklicks mehr ausführen können. +
      +
    Die Funktion wird in älteren GEM-Dokumentationen häufig auch +evnt_dclicks genannt. +
      +
    Ergebnis: Die Funktion liefert die gültige Geschwindigkeit für +Doppelklicks zurück. +
      +
    Verfügbar: All AES versions. +
      +
    Gruppe: Ereignisverwaltung +
      +
    Querverweis: Binding   Nachrichten +
      + +
    + +

    8.7.2.1 Bindings für evnt_dclick

    + + + + + + + + + +
    C: int16_t evnt_dclick ( int16_t ev_dnew, int16_t ev_dgetset ); +
      +
    Umsetzung: +
      +
    int16_t evnt_dclick (int16_t ev_dnew, int16_t ev_dgetset)
    +{
    +   int_in[0] = ev_dnew;
    +   int_in[1] = ev_dgetset;
    +
    +   return ( crys_if(26) );
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]26 # Opcode der Funktion
    control+2control[1]2 # Einträge in int_in
    control+4control[2]1 # Einträge in int_out
    control+6control[3]0 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_inint_in[0]ev_dnew
    int_in+2int_in[1]ev_dgetset
    int_outint_out[0]Return-Wert
    +
    + + +
    + +

    8.7.3 evnt_keybd

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Event Keyboard« - wartet auf ein Tastaturereignis. +
      +
    AES-Nummer: 20 +
      +
    Deklaration: int16_t evnt_keybd ( void ); +
      +
    Beschreibung: Die Funktion wartet auf ein Tastaturereignis, und gibt den +entsprechenden Code zurück. +
      +
    Hinweis: Tastatur-Events werden immer nur der +Applikation gemeldet, die das aktive Fenster besitzt. +
      +
    Ergebnis: Die Funktion liefert in den Bits 0..7 den ASCII-Code, und in den +Bits 8..15 den Scan-Code der gedrückten Taste. +
      +
    Verfügbar: All AES versions. +
      +
    Gruppe: Ereignisverwaltung +
      +
    Querverweis: Binding   evnt_multi   Nachrichten +
      + +
    + +

    8.7.3.1 Bindings für evnt_keybd

    + + + + + + + + + +
    C: int16_t evnt_keybd ( void ); +
      +
    Umsetzung: +
      +
    int16_t evnt_keybd (void)
    +{
    +   return ( crys_if (20) );
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]20 # Opcode der Funktion
    control+2control[1]0 # Einträge in int_in
    control+4control[2]1 # Einträge in int_out
    control+6control[3]0 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_outint_out[0]Return-Wert
    +
    + + +
    + +

    8.7.4 evnt_mesag

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Event Message« - wartet auf eine Mitteilung des AES. +
      +
    AES-Nummer: 23 +
      +
    Deklaration: int16_t evnt_mesag ( int16_t *msg ); +
      +
    Beschreibung: Die Funktion wartet bis in der Message-Pipe der Applikation ein +Ereignis vorliegt. +
      +
    Der Parameter msg ist ein Zeiger auf den 16 Bytes +großen Nachrichten-Puffer. +
      +
    Ergebnis: Als Ergebnis wir immer 1 zurückgegeben. +
      +
    Verfügbar: All AES versions. +
      +
    Gruppe: Ereignisverwaltung +
      +
    Querverweis: Binding   Nachrichten +
      + +
    + +

    8.7.4.1 Bindings für evnt_mesag

    + + + + + + + + + +
    C: int16_t evnt_mesag ( int16_t *msg ); +
      +
    Umsetzung: +
      +
    int16_t evnt_mesag (int16_t *msg)
    +{
    +   addr_in[0] = msg;
    +   return ( crys_if (23) );
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]23 # Opcode der Funktion
    control+2control[1]0 # Einträge in int_in
    control+4control[2]1 # Einträge in int_out
    control+6control[3]1 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_outint_out[0]Return-Wert
    addr_inaddr_in[0]msg
    +
    + + +
    + +

    8.7.5 evnt_mouse

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Event Mouse« - wartet darauf, daß der Mauszeiger in einen +Bereich hinein- oder hinausgeschoben wird. +
      +
    AES-Nummer: 22 +
      +
    Deklaration: int16_t evnt_mouse ( int16_t ev_moflags, int16_t ev_mox, +int16_t ev_moy, int16_t ev_mowidth, int16_t ev_moheight, int16_t +*ev_momx, int16_t *ev_momy, int16_t *ev_mobutton, int16_t *ev_mokstate +); +
      +
    Beschreibung: Die Funktion wartet darauf, bis der Mauszeiger einen bestimmten +Teil des Bildschirms betritt oder verläßt. +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Parameter Bedeutung +
        +
    ev_moflags +
    +
    + + + + + + + + + + +
    0=Ereignis beim Betreten
    1=Ereignis beim Verlassen
    +
    + +
    ev_mox, x-Koordinate +
    ev_moy y-Koordinate des zu überwachenden Rechtecks +
    ev_mowidth, Breite und +
    ev_moheight Höhe des zu überwachenden Rechtecks +
    ev_momx, x-Koordinate +
    ev_momy y-Koordinate des Mauszeigers beim Betreten bzw. Verlassen des +Rechtecks +
    ev_mobutton der Zustand der Mausknöpfe (Bit-0 = linker Knopf, Bit-1 = +rechter Knopf) +
    ev_mokstate den Zustand der Sondertasten bei Auftreten des Ereignisses. Es +gilt: +
    +
    + + + + + + + + + + + + + + + + + + + + +
    0x0001=Shift-rechts
    0x0002=Shift-links
    0x0004=Control
    0x0008=Alternate
    +
    + + +
    + +
    Ergebnis: Als Ergebnis wird immer eine 1 zurückgeliefert. +
      +
    Verfügbar: All AES versions. +
      +
    Gruppe: Ereignisverwaltung +
      +
    Querverweis: Binding   Nachrichten +
      + +
    + +

    8.7.5.1 Bindings für evnt_mouse

    + + + + + + + + + +
    C: int16_t evnt_mouse ( int16_t ev_moflags, int16_t ev_mox, +int16_t ev_moy, int16_t ev_mowidth, int16_t ev_moheight, int16_t +*ev_momx, int16_t *ev_momy, int16_t *ev_mobutton, int16_t *ev_mokstate +); +
      +
    Umsetzung: +
      +
    int16_t evnt_mouse (int16_t ev_moflags, int16_t ev_mox,
    +                    int16_t ev_moy, int16_t ev_mowidth,
    +                    int16_t ev_moheight, int16_t *ev_momx,
    +                    int16_t *ev_momy, int16_t *ev_mobutton,
    +                    int16_t *ev_mokstate)
    +{
    +   int_in[0] = ev_moflags;
    +   int_in[1] = ev_mox;
    +   int_in[2] = ev_moy;
    +   int_in[3] = ev_mowidth;
    +   int_in[4] = ev_moheight;
    +
    +   crys_if (22);
    +
    +   *ev_momx     = int_out[1];
    +   *ev_momy     = int_out[2];
    +   *ev_mobutton = int_out[3];
    +   *ev_mokstate = int_out[4];
    +
    +   return (int_out[0]);
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]22 # Opcode der Funktion
    control+2control[1]5 # Einträge in int_in
    control+4control[2]5 # Einträge in int_out
    control+6control[3]0 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_inint_in[0]ev_moflags
    int_in+2int_in[1]ev_mox
    int_in+4int_in[2]ev_moy
    int_in+6int_in[3]ev_mowidth
    int_in+8int_in[4]ev_moheight
    int_outint_out[0]Return-Wert
    int_out+2int_out[1]ev_momx
    int_out+4int_out[2]ev_momy
    int_out+6int_out[3]ev_mobutton
    int_out+8int_out[4]ev_mokstate
    +
    + + +
    + +

    8.7.6 evnt_multi

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Event Multi« - wartet auf ein beliebiges Ereignis. +
      +
    AES-Nummer: 25 +
      +
    Deklaration: int16_t evnt_multi ( int16_t ev_mflags, int16_t ev_mbclicks, +int16_t ev_mbmask, int16_t ev_mbstate, int16_t ev_mm1flags, int16_t +ev_mm1x, int16_t ev_mm1y, int16_t ev_mm1width, int16_t ev_mm1height, +int16_t ev_mm2flags, int16_t ev_mm2x, int16_t ev_mm2y, int16_t +ev_mm2width, int16_t ev_mm2height, int16_t *ev_mmgpbuff, int16_t +ev_mtlocount, int16_t ev_mthicount, int16_t *ev_mmox, int16_t +*ev_mmoy, int16_t *ev_mmbutton, int16_t *ev_mmokstate, int16_t +*ev_mkreturn, int16_t *ev_mbreturn ); +
      +
    Beschreibung: Die evnt_multi Funktion wartet auf eine Reihe verschiedener +Events. +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Parameter Bedeutung +
        + + + + + + + + + + + + +
    ev_mflags gewünschtes Ereignis: +
    MU_KEYBD      (0x0001) Tastaturereignis +
    MU_BUTTON     (0x0002) Buttonereignis +
    MU_M1         (0x0004) Mausereignis 1 +
    MU_M2         (0x0008) Mausereignis 2 +
    MU_MESAG      (0x0010) Nachrichten +
    MU_TIMER      (0x0020) Zeitereignisse +
    MU_WHEEL      (0x0040) Mausrad, XaAES +
    MU_MX         (0x0080) Mausbewegung, XaAES +
    MU_KEYBD4     (0x0100) GEM/4 +
    MU_NORM_KEYBD (0x0100) normierte Tastenkodes, XaAES +
    MU_DYNAMIC_KEYBD (0x0200) XaAES, noch nicht vorhanden +
    X_MU_DIALOG   (0x4000) (Geneva) +
    ev_mbclicks Anzahl der Klicks, siehe ev_bclicks in evnt_button +
    ev_mbmask welche Mausknöpfe sollen betrachtet werden (Format siehe +ev_bmask in evnt_button) +
    ev_mbstate welchen Zustand müssen die Mausknöpfe einnehmen (Format, +siehe ev_bstate in evnt_button) +
    ev_mm1flags soll der Event beim Betreten (0) oder Verlassen (1) des ersten +Rechtecks ausgelöst werden, siehe ev_moflags in evnt_mouse +
    ev_mm1x,   +
    ev_mm1y x und y Koordinate des ersten Rechtecks, siehe ev_mox, +ev_moy in evnt_mouse +
    ev_mm1width die Breite des ersten Rechtecks, siehe ev_mowidth in +evnt_mouse +
    ev_mm1height die Höhe des ersten Rechtecks, siehe ev_moheight in +evnt_mouse +
    ev_mm2flags,   +
    ev_mm2x,   +
    ev_mm2y,   +
    ev_mm2width,   +
    ev_mm2height sind die Parameter für das zweite Maus-Event Rechteck +
    ev_mmgpbuff ein 16 Byte Messagebuffer, siehe evnt_mesag und +ev_mgpbuff +
    ev_mtlocount low-Word für den Timercounter, siehe evnt_timer +
    ev_mthicount high-Word für den Timercounter, siehe evnt_timer Achtung: +Unter TOS 1.0 darf in einem Accessorie der Timer nicht auf 0 gesetzt +werden, sonst hängt sich das System auf. +
    ev_mmox,   +
    ev_mmoy die x und y Koordinate des Mauszeigers beim Auftreten des +Events, siehe evnt_mouse, (MU_WHEEL) +
    ev_mmobutton Zustand der Mausknöpfe beim Auftreten des Events (Format siehe +evnt_button) +
    ev_mmokstate den Zustand der Sondertasten der Tastatur beim Auftreten des +Events (Format, siehe evnt_button) +
    Bei MU_WHEEL: Radnummer +
    ev_mkreturn der Scancode der gedrückten Taste +
    ev_mbreturn Anzahl der Klicks mit der Maustaste +
    Bei MU_WHEEL: Anzahl der Radumdrehungen + +
    + +
    Hinweis: Durch die große Anzahl der zu übergebenden +Parameter verbraucht diese Funktion relativ viel CPU-Zeit; denn die +Parameter müssen zunächst auf dem Stack abgelegt, und dann noch auf +die Eingabefelder des GEM verteilt werden. +
      +
    MU_WHEEL: +
    Wird nur versendet wenn es keine obenliegendes Fenster gibt oder +das Fenster keine Pfeile besitzt. +
      +
    MU_MX: +
    Es wird jede Bewegung der Maus gemeldet (ev_mmox, +ev_mmoy), zusätzlich noch erfolgt noch die Rückgabe des +Status der Tastaur. +
      +
    MU_KEYBD4: +
    Used internally in GEM/4 to check for a context-sensitive help +request. +
      +
    MU_NORM_KEYBD: +
    Wenn das Ereignis MU_NORM_KEYBD mit in die Ergenismaske +aufgenommen wird, bekommt die Applikation anstatt den standard AES +Scancode einen normaliesierten Tastencode (NKCC) und Staus der Maus +geliefert. Wird in der Maske MU_KEYBD und MU_NORM_KEYBD angeben, wird +immer MU_NORM_KEYBD geliefert. Die Rückgabe erfolgt in +ev_mmokstate und ev_mkreturn, wobei bei der gleichen +Wert besitzen. +
      +
    X_MU_DIALOG: +
    If the ev_mflags parameter has bit 14 set +(ev_mflags |= X_MU_DIALOG), any mouse clicks and keyboard +actions within windows containing dialogs will cause the +ev_mwhich return value from evnt_multi to have bit 14 set. +
    When this happens, ev_mmgpbuff word 2 contains the index +of the object within the dialog which was selected. If the object was +a TOUCHEXIT button and the user double-clicked on it, then bit 15 will +be set, similar to the way form_do works. Word 3 of the message buffer +ev_mmgpbuff contains the window handle of the window in which +the event occurred. +
    This feature is used in conjunction with the wind_set option +X_WF_DIALOG. +
      +
    Ergebnis: Als Ergebnis liefert die Funktion die Nummer des oder der +aufgetretenen Events im oben angegebenen Format. +
      +
    Verfügbar: In allen AES Versionen. +
      +
    Gruppe: Ereignisverwaltung +
      +
    Querverweis: Binding   evnt_keybd   evnt_button   evnt_mouse   evnt_mesag   +evnt_timer   evnt_dclick   Nachrichten +
      + +
    + +

    8.7.6.1 Bindings für evnt_multi

    + + + + + + + + + +
    C: int16_t evnt_multi ( int16_t ev_mflags, int16_t ev_mbclicks, +int16_t ev_mbmask, int16_t ev_mbstate, int16_t ev_mm1flags, int16_t +ev_mm1x, int16_t ev_mm1y, int16_t ev_mm1width, int16_t ev_mm1height, +int16_t ev_mm2flags, int16_t ev_mm2x, int16_t ev_mm2y, int16_t +ev_mm2width, int16_t ev_mm2height, int16_t *ev_mmgpbuff, int16_t +ev_mtlocount, int16_t ev_mthicount, int16_t *ev_mmox, int16_t +*ev_mmoy, int16_t *ev_mmbutton, int16_t *ev_mmokstate, int16_t +*ev_mkreturn, int16_t *ev_mbreturn ); +
      +
    Umsetzung: +
      +
    int16_t evnt_multi (int16_t ev_mflags,  int16_t ev_mbclicks,
    +                    int16_t ev_mbmask,  int16_t ev_mbstate,
    +                    int16_t ev_mm1flags, int16_t ev_mm1x,
    +                    int16_t ev_mm1y, int16_t ev_mm1width,
    +                    int16_t ev_mm1height, int16_t ev_mm2flags,
    +                    int16_t ev_mm2x, int16_t ev_mm2y,
    +                    int16_t ev_mm2width, int16_t ev_mm2height,
    +                    int16_t *ev_mmgpbuff,
    +                    int16_t ev_mtlocount,
    +                    int16_t ev_mthicount,
    +                    int16_t *ev_mmox, int16_t *ev_mmoy,
    +                    int16_t *ev_mmbutton,
    +                    int16_t *ev_mmokstate,
    +                    int16_t *ev_mkreturn,
    +                    int16_t *ev_mbreturn)
    +{
    +   int_in[0]  = ev_mflags;
    +   int_in[1]  = ev_mbclicks;
    +   int_in[2]  = ev_mbmask;
    +   int_in[3]  = ev_mbstate;
    +   int_in[4]  = ev_mm1flags;
    +   int_in[5]  = ev_mm1x;
    +   int_in[6]  = ev_mm1y;
    +   int_in[7]  = ev_mm1width;
    +   int_in[8]  = ev_mm1height;
    +   int_in[9]  = ev_mm2flags;
    +   int_in[10] = ev_mm2x;
    +   int_in[11] = ev_mm2y;
    +   int_in[12] = ev_mm2width;
    +   int_in[13] = ev_mm2height;
    +   int_in[14] = ev_mtlocount;
    +   int_in[15] = ev_mthicount;
    +   addr_in[0] = ev_mmgpbuff;
    +
    +   crys_if (25);
    +
    +   *ev_mmox      = int_out[1];
    +   *ev_mmoy      = int_out[2];
    +   *ev_mmbutton  = int_out[3];
    +   *ev_mmokstate = int_out[4];
    +   *ev_mkreturn  = int_out[5];
    +   *ev_mbreturn  = int_out[6];
    +
    +   return (intout[0]);
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]25 # Opcode der Funktion
    control+2control[1]16 # Einträge in int_in
    control+4control[2]7 # Einträge in int_out
    control+6control[3]1 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_inint_in[0]ev_mflags
    int_in+2int_in[1]ev_mbclicks
    int_in+4int_in[2]ev_mbmask
    int_in+6int_in[3]ev_mbstate
    int_in+8int_in[4]ev_mm1flags
    int_in+10int_in[5]ev_mm1x
    int_in+12int_in[6]ev_mm1y
    int_in+14int_in[7]ev_mm1width
    int_in+16int_in[8]ev_mm1height
    int_in+18int_in[9]ev_mm2flags
    int_in+20int_in[10]ev_mm2x
    int_in+22int_in[11]ev_mm2y
    int_in+24int_in[12]ev_mm2width
    int_in+26int_in[13]ev_mm2height
    int_in+28int_in[14]ev_mtlocount
    int_in+30int_in[15]ev_mthicount
    int_outint_out[0]Return-Wert
    int_out+2int_out[1]ev_mmox
    int_out+4int_out[2]ev_mmoy
    int_out+6int_out[3]ev_mmbutton
    int_out+8int_out[4]ev_mmokstate
    int_out+10int_out[5]ev_mkreturn
    int_out+12int_out[6]ev_mbreturn
    addr_inaddr_in[0]ev_mmgpbuff
    +
    + + +
    + +

    8.7.7 evnt_timer

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Name: »Event Timer« - wartet einen Zeitabschnitt ab. +
      +
    AES-Nummer: 24 +
      +
    Deklaration: int16_t evnt_timer ( int16_t ev_tlocount, int16_t ev_thicount +); +
      +
    Beschreibung: Die Funktion wartet bis eine bestimmte Zeit vergangen ist. Es +gilt: +
      +

    +
    + + + + + + + + + + + + +
    ParameterBedeutung
    ev_tlocountLow-Word der Millisekunden
    ev_thicountHigh-Word der Millisekunden
    +
    + +
    Hinweis: Für Warteschleifen in Programmen sollte +immer diese Funktion benutzt werden. Das Betriebssystem kann +dann (auch ohne echtes Multitasking) einem anderen Prozess die CPU +zuteilen. +
      +
    Unter TOS 1.0 darf in einem Accessorie der Timer nicht auf 0 +gesetzt werden, sonst hängt sich das System auf. +
      +
    Ergebnis: Als Ergebnis wird immer eine 1 zurückgeliefert. +
      +
    Verfügbar: All AES versions. +
      +
    Gruppe: Ereignisverwaltung +
      +
    Querverweis: Binding   Nachrichten +
      + +
    + +

    8.7.7.1 Bindings für evnt_timer

    + + + + + + + + + +
    C: int16_t evnt_timer ( int16_t ev_tlocount, int16_t ev_thicount +); +
      +
    Umsetzung: +
      +
    int16_t evnt_timer (int16_t ev_tlocount, int16_t ev_thicount)
    +{
    +   int_in[0] = ev_tlocount;
    +   int_in[1] = ev_thicount;
    +
    +   return ( crys_if (24) );
    +}
    +
    +
    GEM-Arrays: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AdresseFeldelementBelegung
    controlcontrol[0]24 # Opcode der Funktion
    control+2control[1]2 # Einträge in int_in
    control+4control[2]1 # Einträge in int_out
    control+6control[3]0 # Einträge in addr_in
    control+8control[4]0 # Einträge in addr_out
    int_inint_in[0]ev_tlocount
    int_in+2int_in[1]ev_thicount
    int_outint_out[0]Return-Wert
    +
    + + +
    + +

    8.7.8 Nachrichten

    + +

    Die Standardmessages des Screenmanagers sind wie folgt +aufgebaut: +

    + + + + + + + + + +
    msg[0] Art der Message +
      +
    msg[1] ID der Applikation, die die Nachricht abgeschickt hat +
      +
    msg[2] Anzahl der Bytes die über die Standardlänge von 16 Bytes +hinausgehen, und dann mit appl_read gelesen werden müssen +
      + +
    + +

    Arten der Standardmessages: +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Nachricht Bedeutung +
      +
        +
      + +
    AC_CLOSE (41) wird an ein Accessory geschickt, wenn die aktuelle Applikation +beendet, der Bildschirm gelöscht und der Windowmanager neu +initialisiert wird. +
      + + + +
    msg[3] Identifikator des Accessories + +
    + +
    Hinweis: Diese Nachricht spielt in Multitaskingsystemen +praktisch keine Rolle mehr, und ist in MagiC auch nicht mehr +vorhanden! +
      + +
    AC_OPEN (40) ein Accessory wurde aktiviert +
      + + + +
    msg[4] Identifikator des Accessories +
    PC-GEM liefert diese Information in msg[3]! KAOS 1.4.2 setzt beide +Einträge. + +
    + +
    Geneva have the following extension: +
    If an application sends an AC_OPEN message to another application, +it can optionally set word 4 of the message to -1. In this case, +Geneva will automatically substitute the correct menu identifier for +the application in word 4. Example to open application with ID #5: +
      +
    int buf[8]im { AC_OPEN, 5, 0, my_apid, -1 }; +
    appl_write( 5, 16, buf ); +
      +
    Sending an AC_OPEN message to a desk accessory will cause it to +open if it is not already open, or it will make its window topmost (by +sending a WM_TOPPED message) if the desk accessory has a window open. +An application will receive a WM_TOPPED message, if it has a window +open. +
      + +
    AP_DRAGDROP (63) ist ein Teil des Drag&Drop-Protokolls und wird vom Sender +an den Empfänger geschickt. +
      + + + + + + + + + + + + + + + +
    msg[3] Kennung des Zielfensters +
    msg[4] X-Position des Mauszeigers +
    msg[5] Y-Position des Mauszeigers +
    msg[6] Keyboard-Shift-Status +
    msg[7] zwei Zeichen der Pipe-Extension + +
    + +
    Hinweis: Wird anstelle einer gültigen Fensterkennung +der Wert -1 übergeben, so ist das Ziel der Drag&Drop Operation +kein spezielles Fenster, sondern die Applikation selbst. Es sollte +dann normalerweise ein zusätzliches Fenster für die angegebenen +Daten geöffnet werden. +
      + +
    AP_RESCHG (57) durch diese Nachricht wird die betreffende Applikation darüber +informiert, daß ein Auflösungswechsel stattfinden soll. Der Empfänger dieser +Nachricht sollte sich dann sobald wie möglich beenden. +
      + +
    AP_TERM (50) das Betriebssystem fordert die Applikation auf, sich zu +beenden. Dies kann z.B. beim Auflösungswechsel notwendig sein, oder +von einem allgemeinen Shut-Down Utility ausgelöst werden. +
      + + + +
    msg[5] Grund des Shut-Downs, also z.B. + + + + + + +
    AP_TERM (generell beenden) +
    AP_RESCHG (Auflösungswechsel) + +
    + + +
    + +
    Achtung: Entgegen der üblichen Konvention muss +in msg[1] der Wert -1 eingetragen werden, da lt. MagiC Dokumentation +sonst nicht garantiert ist, daß der Desktop von einer +Shut-Down-Sequenz (Alternate-Control-Delete) ausgeht. +
      + +
    AP_TFAIL (51) wird vom Empfänger einer AC_CLOSE bzw. AP_TERM Nachricht +verschickt, falls dieser sich nicht beenden möchte oder kann. +
      + +
    CH_EXIT (90) wird an den Parent-Prozess geschickt, wenn ein Child +terminiert. +
      + + + + + + +
    msg[3] Applikations-ID des Childs +
    msg[4] Exit-Code des Childs + +
    + + +
    CT_KEY (53) wird vom modularen Kontrollfeld XCONTROL verschickt, um +Tastendrücke auswerten zu können, die keine Auswirkungen auf +Editfelder haben können, also z.B. HELP oder UNDO. +
      + + + +
    msg[3] Highbyte: Scancode der gedrückten Taste. +
    Lowbyte : ASCII-Code der Taste. + +
    + + +
    FNT_CHANGED (83) wird verschickt, wenn zur Laufzeit GDOS-Fonts an- bzw. +abgemeldet wurden. +
    Auf den Empfang dieser Nachricht sollte mit vst_unload_fonts und +direkt anschließendem vst_load_fonts reagiert werden. Dadurch ist +sichergestellt, daß die Applikation mit den aktuellen Zeichensätzen +arbeiten kann. Ausserdem sollte geprüft werden, ob die Fonts von +bereits geöffneten Dokumenten noch verfügbar sind. +
      + + + + + + + + + + + + + + + +
    msg[3] Anzahl der deinstallierten Fonts +
    msg[4] Anzahl der neu installierten Fonts +
    msg[5] Reserviert (0) +
    msg[6] Reserviert (0) +
    msg[7] Reserviert (0) + +
    + + +
    MN_SELECTED (10) ein Menüeintrag wurde ausgewählt +
      + + + + + + + + + + + + + + + +
    msg[3] Objektnummer des Titeleintrags +
    msg[4] Objektnummer des Eintrags +
    msg[5] Zeiger auf die OBJECT-Struktur des Menübaums, wie er auch an +
    msg[6] menu_bar übergeben wurde. +
    msg[7] Parent des angewählten Eintrags, d.h. die Objektnummer der +'heruntergefallenen' Box, die den Eintrag enthält. + +
    + +
    Hinweis: Das Vorhandensein der erweiterten Nachricht +(msg[5] und folgende) sollte am besten per appl_getinfo (Opcode 9) ermittelt +werden. +
      + +
    PRN_CHANGED (82) Diese Nachricht wird vom GDOS-Konfigurationsprogramm an alle +erreichbaren Applikationen verschickt, um diese über Änderungen an +Gerätetreibern zu informieren. Es gilt: +
      + + + + + + +
    msg[3] Gerätenummer +
    msg[4] Aktion +
    +
    + + + + + + + + + + + + + + + +
    0=neu
    1=geändert
    2=entfernt
    +
    + + +
    + +
    Eine Applikation kann nach dem Empfang dieser Nachricht z.B. die +entsprechende Workstation neu öffnen, die jetzt aktuellen +Einstellungen ermitteln, und einen evtl. Preview neu anbieten. +
      + +
    RESCH_COMPLETED (61) diese Nachricht wird an diejenige Applikation geschickt, die +einen Auflösungswechsel eingeleitet hat. Wenn kein Fehler aufgetreten +ist, muß diese sich nun auch beenden. +
      + + + +
    msg[3] Status (0 = Fehler, 1 = OK) + +
    + + +
    SC_CHANGED (80) diese Nachricht sollte von einem Programm an alle anderen +Applikationen im System verschickt werden, wenn dieses den Inhalt des +GEM-Klemmbrettes verändert hat. +
      + + + + + + + + + + + + + + + +
    msg[3] Beschreibung des File-Formats: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    0x0000 = keine genauere Spezifizierung +
    0x0001 = Daten für eine Datenbank +
    0x0002 = Textdateien +
    0x0004 = Vektor-Grafiken +
    0x0008 = Raster-Grafiken +
    0x0010 = Spreadsheet-Daten +
    0x0020 = Samples, MIDI-Files, Sound +
    0x0040 = Archivdateien (z.B. ".zip", ".lzh") +
    0x8000 = Systemdateien (z.B. Farbpaletten) + +
    + +
    Dabei sollte das Format 0x0000 nach Möglichkeit vermieden +werden! +
    msg[4] 4 Zeichen, die das "beste" Format (möglichst wenig +Informationsverlust) für +
    msg[5] den Datenimport beschreiben. Beispiel: ".RTF" statt +".TXT" +
    msg[6] reserviert, 0 +
    msg[7] reserviert, 0 + +
    + + +
    SH_WDRAW (72) diese Nachricht sollte von einer Applikation an die +System-Shell versandt werden, wenn der Inhalt eines Laufwerkes +verändert worden ist. Die Shell kann daraufhin die entsprechenden +Fenster aktualisieren. +
      + + + +
    msg[3] Laufwerk (0 = A, 1 = B, usw). + +
    + +
    Hinweis: Ein Wert von -1 bedeutet, daß die Shell alle +Fenster aktualisieren soll. +
      + +
    SHUT_COMPLETED (60) wird vom Betriebssystem an den Initiator eines Shut-Down +geschickt, wenn alle anderen Applikationen davon bereits informiert +wurden, und diese positiv reagiert haben. +
      + + + + + + + + + + +
    SM_M_SPECIAL (101) diese Nachricht steht nur unter MagiC (ab Version 2.0) zur +Verfügung, und muß an den Screen-Manager geschickt werden. +
      + + + + + + + + + + + + + + + +
    msg[3] 0 +
    msg[4] 'MA' +
    msg[5] 'GX' +
    msg[6] gewünschte Aktion; es gilt: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    0 = Redraw ausführen +
    1 = Applikation beenden +
    2 = auf Applikation umschalten +
    3 = Applikation einfrieren +
    4 = Applikation wieder auftauen +
    5 = z.Zt. keine Information bekannt +
    6 = alle Applikationen einblenden +
    7 = andere Applikationen ausblenden +
    8 = aktuelle Applikation ausblenden + +
    + +
    msg[7] 0 + +
    + +
    Hinweis: Die Codes 6..8 von msg[6] stehen dabei erst ab +MagiC Version 3.1 zur Verfügung. +
    Bei "Redraw ausführen" und "alle Applikationen +einblenden" muß als ID die des Screenmanager (1) angegeben +werden. +
      + +
    THR_EXIT (88) Diese Nachricht wird an den Thread bzw. die Applikation +geschickt, der bzw. die den beendeten Thread erzeugt hat. Es gilt: +
      + + + + + + + + + +
    msg[3] AES ID des beendeten Threads +
    msg[4] Rückgabe- bzw. Fehlercode als +
    msg[5] LONG-Wert + +
    + + +
    WM_ALLICONIFY (36) alle Fenster der Applikation sollen zu einem ikonifizierten +Fenster zusammengefaßt werden. +
      + + + + + + + + + + + + +
    msg[4] X-Koordinate +
    msg[5] Y-Koordinate +
    msg[6] Breite +
    msg[7] Höhe des ikonifizierten Fensters + +
    + + + + + + + + + + + +
    WM_ARROWED (24) ein Pfeil oder Rollbalken wurde angeklickt. +
      + + + + + + +
    msg[3] Handle des Fensters +
    msg[4] einer der folgenden Werte: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    WA_UPPAGE (0) = Seite nach oben +
    WA_DNPAGE (1) = Seite nach unten +
    WA_UPLINE (2) = Zeile nach oben +
    WA_DNLINE (3) = Zeile nach unten +
    WA_LFPAGE (4) = Seite nach links +
    WA_RTPAGE (5) = Seite nach rechts +
    WA_LFLINE (6) = Spalte nach links +
    WA_RTLINE (7) = Spalte nach rechts +
    WA_WHEEL  (8) = siehe unten + +
    + + +
    + +
    Ab XaAES v0.960 gibt es einer Erweiterung dieser Nachricht, da +es neue Treiber für Mäuse mit Rädern gibt. +
      + + + + + + + + + +
    msg[5] 'MW' (0x4d57) oder 'Mw' (0x4d77) +
    'MW' (0x4d57) für die erste Mausrad Drehung +
    'Mw' (0x4d77) für jeder weitere +
      +
    msg[6] 0 +
      +
    msg[7] Aktuelle Nummer der Mausrad Drehung. Damit kann man mehrere +Drehungen zusammenfassen, z.B. zu einer Bewegung des Sliders. +
      + +
    + +
    Es besteht aber auch die Möglichkeit per WF_WHEEL echte +Nachrichten der Mausrad Drehung zu bekommen. +
      + + + + + + + + + +
    msg[4] WA_WHEEL (8) +
      +
    msg[6] Nummer des Rädchen +
      +
    msg[7] Anzahl der Mausrad Drehung. Damit kann man mehrere Drehungen +zusammenfassen, z.B. zu einer Bewegung des Sliders. +
      + +
    + +
    Falls WINX installiert ist kann es zu einer erweiterten +WM_ARROWE Nachricht kommen. +
      + + + + + + + + + +
    msg[5] negierter Geschwindigkeitsfaktor für msg[4] +
      +
    msg[6] Scrollart und Richtung, mögliche Werte wie msg[4] +
      +
    msg[7] negierter Geschwindigkeitsfaktor für msg[6] +
      + +
    + +
    Man sollte so vorgehen: +
    Ist [5] >=0, dann handelt es sich um eine normale +Scrollnachricht. +
    Ist [5] < 0, dann negiert man den Wert und erhält den Faktor +für [4] +
    Ist [7] < 0, dann negiert man den Wert und erhält den Faktor +für [6] +
    ansonsten wird [6] ignoriert +
      +
    Beispiel: +
    Erhält man z.B. [WM_ARROWED 1 0 win WA_DNLINE -2 WA_RTLINE -1], +dann sollte man zwei Zeilen nach unten und eine Spalte nach rechts +scrollen. +
      + +
    WM_BACKDROPPED (31) +
      + + + +
    msg[3] Handle des betreffenden Fensters + +
    + +
    Beim betätigen des Backdrop-Button des Fensters bekommt die +Applikation diese Meldung. Nur in KAOS 1.4.2 sowie MagiC 1 und 2 +vorhanden. Seit MagiC Version 3 wird WM_BOTTOMED verschickt. +
      + +
    WM_BOTTOMED (33) wird vom Screen-Manager benutzt um die Applikation +aufzufordern, ein Fenster in den Hintergrund zu legen. +
      + + + +
    msg[3] Handle des betreffenden Fensters + +
    + +
    Hinweis: das Fenster kann von der Applikation dann +einfach per wind_set (msg[3], WF_BOTTOM, 0, 0 ,0, 0) in den +Hintergrund gelegt werden. Unter MagiC 2.0 heißt diese Meldung noch +WM_M_BDROPPED. +
      + +
    WM_CLOSED (22) das oberste Fenster soll geschlossen werden +
      + + + +
    msg[3] Handle des zu schließenden Fensters + +
    + + +
    WM_FULLED (23) der Fullsizeknopf des obersten Fensters wurde angeklickt. +
      + + + +
    msg[3] Handle des Fensters, das auf volle Größe gebracht werden soll + +
    + + +
    WM_HSLID (25) der horizontale Rollbalken wurde verschoben +
      + + + + + + +
    msg[3] Handle des Fensters +
    msg[4] die neue Sliderposition: +
    +
    + + + + + + + + + + +
    0000=ganz links
    1000=ganz rechts
    +
    + + +
    + + +
    WM_ICONIFY (34) ein Fenster der Applikation soll ikonifiziert werden. +
      + + + + + + + + + + + + + + + +
    msg[3] Kennung des betreffenden Fensters +
    msg[4] X-Koordinate +
    msg[5] Y-Koordinate +
    msg[6] Breite +
    msg[7] Höhe des ikonifizierten Fensters + +
    + + +
    WM_M_BDROPPED (100) wird vom Screen-Manager benutzt um die Applikation +aufzufordern, ein Fenster in den Hintergrund zu legen. Ab MagiC 3 wird +nicht mehr dieser Opcode, sondern WM_BOTTOMED verschickt. +
      + + + +
    msg[3] Handle des betreffenden Fensters + +
    + + +
    WM_MOVED (28) das ganze Fenster wurde verschoben +
      + + + + + + + + + + + + + + + +
    msg[3] Handle des Fensters +
    msg[4] neue x-Koordinate +
    msg[5] neue y-Koordinate +
    msg[6] neue Fensterbreite (unverändert) +
    msg[7] neue Fensterhöhe (unverändert) + +
    + + +
    WM_NEWTOP (29) das Fenster wurde nach oben gebracht +
      + + + +
    msg[3] Handle des Fensters + +
    + + +
    WM_ONTOP (31) ein Fenster wird (nach dem Schließen oder Deaktivieren eines +anderen Fensters) zum aktuellen bzw. aktiven. +
      + + + +
    msg[3] Handle des betreffenden Fensters + +
    + +
    Hinweis: zum Zeitpunkt der Ankunft der Nachricht kann +sich der Fensterstapel bereits wieder verändert haben. Die Nachricht +wird nur verschickt, wenn die Applikation nicht mit einem Aufruf das +Fenster selbst in den Vordergrund gesetzt hat. +
      +
    Nachrichten dieses Typs werden im AES-Messagepuffer +verschmolzen. Daraus folgt, daß immer die letzte Nachricht dieser Art +empfangen wird; es können sich also nicht mehrere dieser Nachrichten +im Puffer befinden. +
      + +
    WM_REDRAW (20) ein Fensterbereich muß neu gezeichnet werden +
      + + + + + + + + + + + + + + + +
    msg[3] Handle des neuzuzeichnenden Fensters +
    msg[4] x-Koordinate des Bereichs +
    msg[5] y-Koordinate des Bereichs +
    msg[6] Breite des Bereichs +
    msg[7] Höhe des Bereichs + +
    + + +
    WM_SHADED (22360) Fenster wurde eingeklappt. +
      + + + +
    msg[3] Handle des Fensters + +
    + + +
    WM_SIZED (27) die Fenstergröße wurde verändert +
      + + + + + + + + + + + + + + + +
    msg[3] Handle des Fensters +
    msg[4] neue x-Koordinate (unverändert) +
    msg[5] neue y-Koordinate (unverändert) +
    msg[6] neue Fensterbreite +
    msg[7] neue Fensterhöhe + +
    + + +
    WM_TOOLBAR (37) behandelt Mausklicks in ein Toolbar-Objekt; es gilt: +
      + + + + + + + + + + + + +
    msg[3] Kennung des Fensters +
    msg[4] angeklicktes Objekt +
    msg[5] Anzahl der Mausklicks +
    msg[6] Tastatur-Status von Shift, Alternate und Control + +
    + +
    Hinweis: Bei allen Objekten der Toolbox sollte das Flag +TOUCHEXIT gesetzt werden, gilt nicht für XaAES. +
      +
    Hier gibt es noch den zusätzlichen Wert: +
      + + + +
    msg[7] Aktuelles Objekt in dem sich der Textcursor befindet. +
      + +
    + + +
    WM_TOPPED (21) ein Fenster soll zum oben liegenden Fenster werden. +
      + + + +
    msg[3] Handle des nach oben zu holenden Fensters + +
    + + +
    WM_UNICONIFY (35) ein oder mehrere Fenster der Applikation sollen unikonifiziert +werden. Falls mehrere Fenster betroffen sind (WM_ALLICONIFY) ist die +Applikation auf sich allein gestellt, da das AES keine Informationen +über die betroffenen Fenster sowie deren Positionen/Ausmaße +bereitstellt. +
      + + + + + + + + + + + + + + + +
    msg[3] Kennung des betreffenden Fensters +
    msg[4] X-Koordinate +
    msg[5] Y-Koordinate +
    msg[6] Breite +
    msg[7] Höhe des unikonifizierten Fensters + +
    + + +
    WM_UNSHADED (22361) Fenster wurde ausgeklappt. +
      + + + +
    msg[3] Handle des Fensters + +
    + + +
    WM_UNTOPPED (30) ein Fenster wird gerade inaktiv. +
      + + + +
    msg[3] Handle des betreffenden Fensters + +
    + +
    Hinweis: zum Zeitpunkt der Ankunft der Nachricht kann +sich der Fensterstapel bereits wieder verändert haben. Die Nachricht +wird nur verschickt, wenn die Applikation nicht mit einem Aufruf das +Fenster selbst in den Hintergrund gelegt hat. +
      + +
    WM_VSLID (26) der vertikale Rollbalken wurde verschoben +
      + + + + + + +
    msg[3] Handle des Fensters +
    msg[4] die neue Sliderposition: +
    +
    + + + + + + + + + + +
    0000=ganz oben
    1000=ganz unten
    +
    + + +
    + + +
    + +

    Die Unterstützung der neuen Nachrichtentypen kann per appl_getinfo +(Opcode 12) erfragt werden. Für benutzerdefinierte Mitteilungen hat +Digital Research übrigens Message-Nummern jenseits von 1024 +vorgeschlagen. +

    +

    Zur Größe des Nachrichtenpuffers: +

    +

    Eine einzelne Applikation sollte unter MagiC 2.0 nicht mehr als +16 Fenster nutzen, da sonst der Nachrichtenpuffer des Systems +überlaufen kann und evtl. Redraws nicht mehr ausgeführt werden +können. +

    +

    Querverweis: evnt_multi   evnt_mesag   AV-Protokoll   +OLGA-Protokoll   Drag&Drop +

    +

    8.7.9 Nachrichten-Liste

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    HexDezName
    $000a10MN_SELECTED
    $001420WM_REDRAW
    $001521WM_TOPPED
    $001622WM_CLOSED
    $001723WM_FULLED
    $001824WM_ARROWED
    $001925WM_HSLID
    $001a26WM_VSLID
    $001b27WM_SIZED
    $001c28WM_MOVED
    $001d29WM_NEWTOP
    $001e30WM_UNTOPPED
    $001f31WM_ONTOP
    $001f31WM_BACKDROPPEDKAOS 1.4.2
    $002032WM_OFFTOPMultiGEM
    $002133WM_BOTTOMED
    $002234WM_ICONIFY
    $002335WM_UNICONIFY
    $002436WM_ALLICONIFY
    $002537WM_TOOLBAR
    $002638WM_REPOSEDXaAES
    $002840AC_OPEN
    $002941AC_CLOSE
    $002b43WM_ISTOPMultiGEM
    $003250AP_TERM
    $003250CT_UPDATEDR
    $003351AP_TFAIL
    $003351CT_MOVEDR
    $003452CT_NEWTOPDR
    $003452AP_AESTERMN.AES
    $003553CT_KEYXControl
    $003957AP_RESCHG
    $003c60SHUT_COMPLETED
    $003d61RESCH_COMPLETED
    $003f63AP_DRAGDROP
    $004670TDI_QuestionTDI-Modula
    $004771TDI_AnswerTDI-Modula
    $004872SH_WDRAW
    $005080SC_CHANGED
    $005282PRN_CHANGEDNVDI
    $005383FNT_CHANGEDNVDI
    $005484COLORS_CHANGEDNVDI
    $005888THR_EXIT
    $005989PA_EXITMagiC 3
    $005a90CH_EXIT
    $0064100WM_M_BDROPPEDMagiC
    $0064100DruckauftragCALCLOCK, from DR
    $0065101SM_M_SPECIALMagiC
    $0065101Druckauftrag emfpangenCALCLOCK, from DR
    $0066..$006d102..109SM_M_RESMagiC (intern)
    $006e..$00c7110..199reserviertScreen-Manager
    $00c8200PRT_MSGOutput
    $00c9201STRT_MSGOutput
    $00ca202QUIT_MSGOutput
    $00cb..$0158203..344reserviertScreen-Manager
    $0159345WM_WHEELXaAES
    $015a..$03e7346..999reserviertScreen-Manager
    $03e81000SCRAP_OKScrap
    $03e91001SCRAP_NOTOKScrap
    $03ea1002SCRAP_UPDTScrap
    $03eb1003SCRAP_OPENScrap
    $03ec..$03ff1004..1023reserviertScreen-Manager
    $03fd1021SHOWMultiGEM2
    $03ff1023HIDEMultiGEM2
    $04001024ACC_IDXAcc Protocol
    $04011025ACC_OPENXAcc Protocol
    $04021026ACC_CLOSEXAcc Protocol
    $04031027ACC_ACCXAcc Protocol
    $04041028ACC_EXITXAcc Protocol
    $04381080MYOSD_DISPLAYMyOSD
    $04391081MYOSD_OKMyOSD
    $043A1082MYOSD_NOKMyOSD
    $04801152ACC_REQUESTXAcc Protocol
    $04811153ACC_REPLYXAcc Protocol
    $05001280ACC_ACKXAcc Protocol
    $05011281ACC_TEXTXAcc Protocol
    $05021282ACC_KEYXAcc Protocol
    $05031283ACC_METAXAcc Protocol
    $05041284ACC_IMGXAcc Protocol
    $05101296ACC_GETDSIXAcc Protocol
    $05111297ACC_DSINFOXAcc Protocol
    $05121298ACC_FILEINFOXAcc Protocol
    $05131299ACC_GETFIELDSXAcc Protocol
    $05141300ACC_FIELDINFOXAcc Protocol
    $05201312ACC_FORCESDFXAcc Protocol
    $05211313ACC_GETSDFXAcc Protocol
    $04011025AC_HELPPureC-Help Protocol
    $04021026AC_REPLYPureC-Help Protocol
    $04031027AC_VERSIONPureC-Help Protocol
    $04041028AC_COPYPureC-Help Protocol
    $0708..$07101800..1808interne KommunikationHänisch Modula-2
    $07d02000MSG_IDENTIFYSTalker
    $07d12001MSG_SLEEPSTalker
    $07d22002MSG_WAKESTalker
    $07d32003MSG_DISPLAYSTalker
    $07d42004MSG_INFOSTalker
    $07d52005MSG_CONFIGSTalker
    $07d62006MSG_BUFFERSTalker
    $07d72007MSG_RESOURCESTalker
    $07d82008MSG_SENDSTRINGSTalker
    $07d92009MSG_KEYSTROKESTalker
    $07da2010MSG_EXECUTE_SCRIPTSTalker
    $07db2011MSG_ENABLESTalker
    $07db2011INST_CURSORHFB-Hausfinanzbuchhaltung
    $07dc2012CHANGE_MENUHFB-Hausfinanzbuchhaltung
    $07dd2013PUT_VORGABE_DO2HFB-Hausfinanzbuchhaltung
    $07de2014PUT_VORGABE_EIGENTHFB-Hausfinanzbuchhaltung
    $07df2015PUT_DATA_IN_BOXHFB-Hausfinanzbuchhaltung
    $07e02016MY_WM_ONTOPHFB-Hausfinanzbuchhaltung
    $09302352WM_MOUSEWHEEL
    $09352357WIND_DATA
    $09362358DO_WPOPUPDirUp
    $09912449Holger Weets
    $09942452ICON_MSGASH-EMailer
    $09952453RSDAEMON_MSGPPP-Connect
    $09962454DD_STRING
    $09972455WISEL_MSG
    $09982456MSG_NOEVENT
    $09992457WINCOM_MSG
    $0a2b2603TOPW_OPENEDManager
    $0a912705FILE_UPDATEDManager
    $0c943220ASK_ALTA_LISTAAlta Lista
    $0c95..$0c9d3221..3229reserviertAlta Lista
    $0c9e3230AL_ReplyAlta Lista
    $0cf13313TWSTARTTosWin2, tw-call
    $0cf23314TWOKTosWin2, tw-call
    $0cf33315TWWRITETosWin2, tw-call
    $0cf43316TWREADTosWin2, tw-call
    $0cf53317TWERRTosWin2, tw-call
    $0cf63318TWTOPTosWin2, tw-call
    $0cf73319TWSHELLTosWin2, tw-call
    $0fa04000PENGUIN_VersionHomePage Penguin
    $0fa14001PENGUIN_ReplyHomePage Penguin
    $0fa2..$0faf4002..4015reserviertHomePage Penguin
    $10004096WM_SAVEMenü Protocol
    $10014097WM_SAVEASMenü Protocol
    $10024098WM_PRINTMenü Protocol
    $10034099WM_UNDOMenü Protocol
    $10044100WM_CUTMenü Protocol
    $10054101WM_COPYMenü Protocol
    $10064102WM_PASTEMenü Protocol
    $10074103WM_SELECTALLMenü Protocol
    $10084104WM_FINDMenü Protocol
    $10094105WM_REPLACEMenü Protocol
    $100a4106WM_FINDNEXTMenü Protocol
    $100b4107WM_HELPMenü Protocol
    $100c4108WM_DELETEMenü Protocol
    $10654197IDC_FROM_ACCIDC
    $10a54261IDC_WAKE_UPIDC
    $10e54325IDC_FROM_APPIDC
    $11504432JINNEE_MSG
    $12354661GO_PRIVATEObjectGEM
    $12364662OLGA_INITOLGA-Protocol
    $12384664OLGA_UPDATEOLGA-Protocol
    $12394665OLGA_ACKOLGA-Protocol
    $123a4666OLGA_RENAMEOLGA-Protocol
    $123b4667OLGA_OPENDOCOLGA-Protocol
    $123c4668OLGA_CLOSEDOCOLGA-Protocol
    $123d4669OLGA_LINKOLGA-Protocol
    $123e4670OLGA_UNLINKOLGA-Protocol
    $123f4671OLGA_UPDATEDOLGA-Protocol
    $12404672OLGA_RENAMELINKOLGA-Protocol
    $12414673OLGA_LINKRENAMEDOLGA-Protocol
    $12424674OLGA_GETOBJECTSOLGA-Protocol
    $12434675OLGA_OBJECTSOLGA-Protocol
    $12444676OLGA_BREAKLINKOLGA-Protocol
    $12454677OLGA_LINKBROKENOLGA-Protocol
    $12464678OLGA_STARTOLGA-Protocol
    $12474679OLGA_GETINFOOLGA-Protocol
    $12484680OLGA_INFOOLGA-Protocol
    $12494681OLGA_IDLEOLGA-Protocol
    $124a4682OLGA_ACTIVATEOLGA-Protocol
    $124b4683OLGA_EMBEDOLGA-Protocol
    $124c4684OLGA_EMBEDDEDOLGA-Protocol
    $124d4685OLGA_UNEMBEDOLGA-Protocol
    $124e4686OLGA_GETSETTINGSOLGA-Protocol
    $124f4687OLGA_SETTINGSOLGA-Protocol
    $12504688OLGA_REQUESTNOTIFICATIONOLGA-Protocol
    $12514689OLGA_RELEASENOTIFICATIONOLGA-Protocol
    $12524690OLGA_NOTIFYOLGA-Protocol
    $12534691OLGA_NOTIFIEDOLGA-Protocol
    $12544692OLGA_SERVERTERMINATEDOLGA-Protocol
    $12554693OLGA_CLIENTTERMINATEDOLGA-Protocol
    $12564694OLGA_INPLACEUPDATEOLGA-Protocol
    $12574695OLGA_ID4UPDATEOLGA-Protocol
    $12584696OLGA_GETEXTENSIONOLGA-Protocol
    $12594697OLGA_EXTENSIONOLGA-Protocol
    $125a4698OLGA_GETSERVERPATHOLGA-Protocol
    $125b4699OLGA_SERVERPATHOLGA-Protocol
    $125c4700OLGA_IE_BUTTONOLGA-Protocol
    $125d4701OLGA_IE_KEYOLGA-Protocol
    $125e..$126f4702..4719reserviertOLGA-Protocol
    $126f4719SSP_SRASRSystem Services Protocol
    $12704720SSP_SSIRSystem Services Protocol
    $12714721SSP_SPASISystem Services Protocol
    $12724722SSP_SSURSystem Services Protocol
    $12734723SSP_SPASASystem Services Protocol
    $12744724SSP_SSASystem Services Protocol
    $1275..$128d4725..4738reservedSystem Services Protocol
    $13504944GS_REQUESTGEMScript Protocol
    $13514945GS_REPLYGEMScript Protocol
    $13524946GS_COMMANDGEMScript Protocol
    $13534947GS_ACKGEMScript Protocol
    $13544948GS_QUITGEMScript Protocol
    $13554949GS_OPENMACROGEMScript Protocol
    $13564950GS_MACROGEMScript Protocol
    $13574951GS_WRITEGEMScript Protocol
    $13584952GS_CLOSEMACROGEMScript Protocol
    $17706000_ASSIGNMIDI_COM
    $17716001_GOOD_BYEMIDI_COM
    $17726002_SEND_DATAMIDI_COM
    $17736003_PRINTMIDI_COM
    $17746004_WAIT_TOKENMIDI_COM
    $17756005_FREE_TOKENMIDI_COM
    $17776007_UNITIMEMIDI_COM
    $17786008_STOP_RINGMIDI_COM
    $17796009_GET_VERWMIDI_COM
    $178e6030_PRKONFMIDI_COM
    $17956037_SHUTDOWNMIDI_COM
    $17966038_VERSIONMIDI_COM
    $19706512RS_INITIATERelationships
    $19716513RS_TERMINATERelationships
    $19726514RS_ACKRelationships
    $19736515RS_HELLORelationships
    $19746516RS_BYERelationships
    $19756517RS_LINKRelationships
    $19766518RS_UNLINKRelationships
    $19776519RS_DATARelationships
    $19786520RS_OPENRelationships
    $1a0066561ADDR_INIT1st Address
    $1a0166571ADDR_SEARCH1st Address
    $1a0266581ADDR_INPUT1st Address
    $1a0366591ADDR_SORT1st Address
    $1a0466601ADDR_ALL1st Address
    $1a0566611ADDR_REPLACE1st Address
    $1a0666621ADDR_DELETE1st Address
    $1a8067841ADDR_ANSW_INIT1st Address
    $1a8167851ADDR_ANSW_SEARCH1st Address
    $1a8267861ADDR_ANSW_INPUT1st Address
    $1a8367871ADDR_ANSW_SORT1st Address
    $1a8467881ADDR_ANSW_ALL1st Address
    $1a8567891ADDR_ANSW_REPLACE1st Address
    $1a8667901ADDR_ANSW_DELETE1st Address
    $1aff69111ADDR_QUIT1st Address
    $1f408000GM_SHOW_FILEGREPIT
    $1f418001GM_OPEN_DIALOGGREPIT
    $1f428002GM_OPEN_PRGINFOGREPIT
    $2f1012048KOBOLD_JOBKobold Protocol
    $2f1112049KOBOLD_JOB_NO_WINDOWKobold Protocol
    $2f1212050KOBOLD_ANSWERKobold Protocol
    $2f1312051KOBOLD_CONFIGKobold Protocol
    $2f1412052KOBOLD_FIRST_SLCTKobold Protocol
    $2f1512053KOBOLD_NEXT_SLCTKobold Protocol
    $2f1612054KOBOLD_CLOSEKobold Protocol
    $2f1712055KOBOLD_FREE_DRIVESKobold Protocol
    $3d00..$3d7f15616..15743CAD-3D_Request_xxxCAD-3D
    $3d80..$3dff15744..15871CAD-3D_Reply_xxxCAD-3D
    $414B16715'AK'MG-Copy -> MagxDesk
    $415016720 Aniplayer
    $420016896SE_INITSE-Protocol
    $420116897SE_OKSE-Protocol
    $420216898SE_ACKSE-Protocol
    $420316899SE_OPENSE-Protocol
    $420416900SE_ERRORSE-Protocol
    $420516901SE_ERRFILESE-Protocol
    $420616902SE_PROJECTSE-Protocol
    $420716903SE_QUITSE-Protocol
    $420816904SE_TERMINATESE-Protocol
    $420916905SE_CLOSESE-Protocol
    $424016960ES_INITSE-Protocol
    $424116961ES_OKSE-Protocol
    $424216962ES_ACKSE-Protocol
    $424316963ES_COMPILESE-Protocol
    $424416964ES_MAKESE-Protocol
    $424516965ES_MAKEALLSE-Protocol
    $424616966ES_LINKSE-Protocol
    $424716967ES_EXECSE-Protocol
    $424816968ES_MAKEEXECSE-Protocol
    $424916969ES_PROJECTSE-Protocol
    $424a16970ES_QUITSE-Protocol
    $424b16971ES_SHLCTRLSE-Protocol
    $440017408WM_DESTROYWinDom
    $440117409WM_MNSELECTEDWinDom
    $440217410WM_FORMWinDom
    $440317411AP_LOADCONFWinDom
    $440417412AP_BUTTONWinDom
    $440517413AP_KEYBDWinDom
    $441017424AP_DEBUGWinDom
    $441117425WM_UPLINEWinDom
    $441217426WM_DNLINEWinDom
    $441317427WM_LFLINEWinDom
    $441417428WM_RTLINEWinDom
    $441517429WM_UPPAGEWinDom
    $441617430WM_DNPAGEWinDom
    $441717431WM_LFPAGEWinDom
    $441817432WM_RTPAGEWinDom
    $441917433WM_PREREDRAWWinDom
    $451117681eb_dump_capture_fullscreenEB DUMP
    $451217682eb_dump_capture_windowEB DUMP
    $451317683eb_dump_capture_mouseEB DUMP
    $451417684eb_dump_disable_selectorEB DUMP
    $451517685eb_dump_enable_selectorEB DUMP
    $451617686eb_dump_disable_windframeEB DUMP
    $451717687eb_dump_enable_windframeEB DUMP
    $456017760FILE_SELECTEDFreedom
    $456417764AF_DOALERTFreedom Protocol
    $456517765FA_ALERTISOPENFreedom Protocol
    $456617766FA_ALERTDONEFreedom Protocol
    $456717767AF_DOFSELECTFreedom Protocol
    $456817768FA_FSELISOPENFreedom Protocol
    $456917769FA_FSELCLOSEDFreedom Protocol
    $457017776AF_CLOSEACKFreedom Protocol
    $457117777AF_SENDREDRAWFreedom Protocol
    $460017920BA_BUBBLE_REQUESTTrouble Bubble
    $460117921AB_OPEN_BUBBLETrouble Bubble
    $460217922BA_BUBBLE_OPENEDTrouble Bubble
    $460317923AB_CLOSE_BUBBLETrouble Bubble
    $460417924BA_BUBBLE_CLOSEDTrouble Bubble
    $46ff18175THING_CMDThing
    $470018176AV_PROTOKOLLAV Protocol
    $470118177VA_PROTOSTATUSAV Protocol
    $470318179AV_GETSTATUSAV Protocol
    $470418180AV_STATUSAV Protocol
    $470518181VA_SETSTATUSAV Protocol
    $470918185AV_SENDCLICKAV Protocol
    $471018192AV_SENDKEYAV Protocol
    $471118193VA_STARTAV Protocol
    $471218194AV_ASKFILEFONTAV Protocol
    $471318195VA_FILEFONTAV Protocol
    $471418196AV_ASKCONFONTAV Protocol
    $471518197VA_CONFONTAV Protocol
    $471618198AV_ASKOBJECTAV Protocol
    $471718199VA_OBJECTAV Protocol
    $471818200AV_OPENCONSOLEAV Protocol
    $471918201VA_CONSOLEOPENAV Protocol
    $472018208AV_OPENWINDAV Protocol
    $472118209VA_WINDOPENAV Protocol
    $472218210AV_STARTPROGAV Protocol
    $472318211VA_PROGSTARTAV Protocol
    $472418212AV_ACCWINDOPENAV Protocol
    $472518213VA_DRAGACCWINDAV Protocol
    $472618214AV_ACCWINDCLOSEDAV Protocol
    $472818216AV_COPY_DRAGGEDAV Protocol
    $472918217VA_COPY_COMPLETEAV Protocol
    $473018224AV_PATH_UPDATEAV Protocol
    $473218226AV_WHAT_IZITAV Protocol
    $473318227VA_THAT_IZITAV Protocol
    $473418228AV_DRAG_ON_WINDOWAV Protocol
    $473518229VA_DRAG_COMPLETEAV Protocol
    $473618230AV_EXITAV Protocol
    $473818232AV_STARTEDAV Protocol
    $473918233VA_FONTCHANGEDAV Protocol
    $474018240AV_XWINDAV Protocol
    $474118241VA_XOPENAV Protocol
    $474218242GBGFA-Basic Editor
    $475118257AV_VIEWAV Protocol
    $475218258VA_VIEWEDAV Protocol
    $475318259AV_FILEINFOAV Protocol
    $475418260VA_FILECHANGEDAV Protocol
    $475518261AV_COPYFILEAV Protocol
    $475618262VA_FILECOPIEDAV Protocol
    $475718263AV_DELFILEAV Protocol
    $475818264VA_FILEDELETEDAV Protocol
    $475918265AV_SETWINDPOSAV Protocol
    $475a18266GZ_PRIVATEGSZRZ Z-Modem
    $476018272VA_PATH_UPDATEAV Protocol
    $4790..$479918320..18329Mafia 2
    $479818328VA_SERVER_INFOAV-Server
    $479918329AV_SERVER_INFOAV-Server
    $480018432MP_ACKPaula Protocol
    $480118433MP_NAKPaula Protocol
    $480218434MP_STARTPaula Protocol
    $480318435MP_STOPPaula Protocol
    $480418436MP_SHUTDOWNPaula Protocol
    $488818568SEND_TRACETracer
    $488918569ANSWER_TRACETracer
    $494D18765IM_COMImagine Grafikartentreiber IM_COL.ACC
    $495018768OLE_INITOLE Protocol
    $495018768IP_DIAL_REQUESTQdialer
    $495118769OLE_EXITOLE Protocol
    $495118769IP_DIAL_HANGUPQdialer
    $495218770OLE_NEWOLE Protocol
    $495218770IP_DIAL_DONEQdialer
    $495318771IP_DIAL_ERRORQdialer
    $495418772IP_HANGUP_DONEQdialer
    $495518773IP_STATUS_GETQdialer
    $4b4819272DA_KNOWHOW
    $4c0119457AT_PERGAMONPEGASUS, SCHECKS, EVER, TARKUS
    $4c4a19530LDG_QUITLDG
    $4c4d19533LDG_LOST_LIBLDG
    $4d0019712MOD_OKTetrax
    $4d0119713MOD_NAKTetrax
    $4d0219714MOD_PLAYTetrax
    $4d0319715MOD_STOPTetrax
    $4d0419716MOD_LOADTetrax
    $4d0519717MOD_CLEARTetrax
    $4d5019762 M_PLAYER
    $4e2020000VTX_GET_BIN_PAGEVideotext Protocol
    $4e2120001VTX_GET_ASCII_PAGEVideotext Protocol
    $4e5220050VTX_FOUNDVideotext Protocol
    $4e5320051VTX_NOTFOUNDVideotext Protocol
    $4e5420052VTX_PROCESSKILLEDVideotext Protocol
    $4e5520053VTX_TERMVideotext Protocol
    $4f4d20301M_ASKVARInterface
    $4f4e20302M_SENDVARInterface
    $500020480PDF_AV_OPEN_FILEMyPDF
    $500120481PDF_AV_CLOSE_FILEMyPDF
    $500220482PDF_AV_PRINT_FILEMyPDF
    $500320483PDF_AV_FIND_WORDMyPDF
    $500420484PDF_AV_SHOW_INFOMyPDF
    $500520485PDF_AV_GET_INFOMyPDF
    $501020496MYTASK_STARTMyTask
    $501120497MYTASK_NEW_COLORMyTask
    $501220498MYTASK_NEW_ICONMyTask
    $501320499MYTASK_DELETE_ICONMyTask
    $501420500MYTASK_ICON_CLICKMyTask
    $501520501MYTASK_BUTTONMyTask
    $501620502MYTASK_NEW_WINDOWMyTask
    $501720503MYTASK_NAMEMyTask
    $501820504MYTASK_GET_SIZEMyTask
    $501920505MYTASK_BUBBLE_CHANGEMyTask
    $501a20506MYTASK_ICON_ERRORMyTask
    $501b20507MYTASK_CHANGED_OPTIONSMyTask
    $501c20508MYTASK_SEND_OPTIONSMyTask
    $520821000OEP_OKObject Exchange Protocol (OEP)
    $520921001OEP_CONFIGObject Exchange Protocol (OEP)
    $520a21002OEP_INFOObject Exchange Protocol (OEP)
    $520b21003OEP_LINKObject Exchange Protocol (OEP)
    $520c21004OEP_RESObject Exchange Protocol (OEP)
    $520d21005OEP_UPDATEObject Exchange Protocol (OEP)
    $520e21006OEP_DATAObject Exchange Protocol (OEP)
    $520f21007OEP_CHANGEDObject Exchange Protocol (OEP)
    $521021008OEP_SERVJOBObject Exchange Protocol (OEP)
    $521121009OEP_TAKEOVERObject Exchange Protocol (OEP)
    $521221010OEP_RES0Object Exchange Protocol (OEP)
    $521321011OEP_RES1Object Exchange Protocol (OEP)
    $521421012OEP_RES2Object Exchange Protocol (OEP)
    $521521013OEP_RES3Object Exchange Protocol (OEP)
    $521621014OEP_RES4Object Exchange Protocol (OEP)
    $521721015OEP_RES5Object Exchange Protocol (OEP)
    $521821016OEP_RES6Object Exchange Protocol (OEP)
    $521921017OEP_RES7Object Exchange Protocol (OEP)
    $521a21018OEP_RES8Object Exchange Protocol (OEP)
    $521b21019OEP_RES9Object Exchange Protocol (OEP)
    $530021248SRTY_SETUPSecurity
    $530121249SRTY_GETDEVSSecurity
    $530221250SRTY_DEVSTATSecurity
    $534321315SH_CHANGEDIFormats-CPXe
    $534621318 STarFax
    $535421332 XaAESnap
    $560022016VIEW_FILEView Protocol
    $560122017VIEW_FAILEDView Protocol
    $560222018VIEW_OPENView Protocol
    $560322019VIEW_CLOSEDView Protocol
    $560422020VIEW_DATAView Protocol
    $561022032VIEW_GETMFDBView Protocol
    $561122033VIEW_SETMFDBView Protocol
    $561222034VIEW_MFDBView Protocol
    $5613..$56ff22035..22271reservedView Protocol
    $564622086 ViewFax
    $575822360WM_SHADEDWINX
    $575922361WM_UNSHADEDWINX
    $636825448CHTW_MSGChatwin
    $640025600che_existCHEMCALC
    $640125601mes_ackCHEMCALC
    $640325603set_modusCHEMCALC
    $641125617app_exitCHEMCALC
    $641425620get_menu_pointCHEMCALC
    $641525621send_menu_pointCHEMCALC
    $642025632request_file_extCHEMCALC
    $642125633send_file_extCHEMCALC
    $64ff25855errorCHEMCALC
    $650225858request_floatCHEMCALC
    $650325859send_floatCHEMCALC
    $660226114request_textCHEMCALC
    $660326115send_textCHEMCALC
    $666626214LOAD_FILEPorthos
    $666726215READ_HeaderPorthos
    $666826216READ_CATALOGPorthos
    $666926217CHG_PAGEPorthos
    $666a26218LOOK_PAGEPorthos
    $666b26219SAVE_REGPorthos
    $666c26220SEND_IMGPorthos
    $666d26221WRK_NAVIGPorthos
    $670226370decl_textCHEMCALC
    $670426372send_decltextCHEMCALC
    $670526373send_declfloatCHEMCALC
    $740729703GEMJING_RETURNGEMJing
    $78f130961WinChangeFontTrueMagic
    $78f2..$791730962..30999TrueMagic
    $799631126AES_Load
    $7a0031232OBJC_EDITEDEnhancedGEM
    $7a0131233CURSOR_INITEnhancedGEM
    $7a0231234OBJC_CHANGEDEnhancedGEM
    $7a0331235OBJC_SIZEDEnhancedGEM
    $7a0431236OBJC_DRAGGEDEnhancedGEM
    $7a0531237MENU_INITEnhancedGEM
    $7a0631238MOUSE_INITEnhancedGEM
    $7a0831239POPUP_CHANGEDEnhancedGEM
    $7a0831240SLIDER_CHANGEDEnhancedGEM
    $7a1031248XACC_AV_INITEnhancedGEM
    $7a1131249XACC_AV_EXITEnhancedGEM
    $7a1231250XACC_AV_CLOSEEnhancedGEM
    $7a13..$7a1731251..31255EnhancedGEM
    $7a1831256FONT_CHANGEDFont Protocol
    $7a1931257FONT_SELECTFont Protocol
    $7a1a31258FONT_ACKFont Protocol
    $7a1b31259XFONT_CHANGEDFont Protocol
    $7a1c..$7a1f31260..31263EnhancedGEM
    $7a2031264WIN_CHANGEDEnhancedGEM
    $7a2131265WIN_SCROLLEDEnhancedGEM
    $7a2231266WIN_TOPPEDEnhancedGEM
    $7a2331267WIN_CLOSEDEnhancedGEM
    $7a2431268WIN_VSLSIZEEnhancedGEM
    $7a2531269WIN_HSLSIZEEnhancedGEM
    $7a2631270WIN_NAMEEnhancedGEM
    $7a2731271WIN_INFOEnhancedGEM
    $7a2831272WIN_HSLIDEEnhancedGEM
    $7a2931273WIN_VSLIDEEnhancedGEM
    $7a2a31274WIN_SIZEDEnhancedGEM
    $7a2b31275WIN_NEWTOPEnhancedGEM
    $7a2c..$7a4f31276..31311EnhancedGEM
    $800032768CatMsgCAT
    $800132769ExtCatMsgCAT
    $800332771CatProtoMsgCAT
    $927737495 Suji, nur intern
    $999339315RC_ROTATERoute It! / Circu It!
    $999539317RC_MOVERoute It! / Circu It!
    $999639318RC_UNDORoute It! / Circu It!
    $999739319CR_REDRAWRoute It! / Circu It!
    $999839320CR_PARARoute It! / Circu It!
    $999939321RC_SENDPARARoute It! / Circu It!
    $9a0039424WR_RECWinRec
    $9a0139425WR_STOPWinRec
    $9a0239426WR_PLAYWinRec
    $9a0339427WR_TIMEWinRec
    $a08141089 QFax/Pro
    $baba47802BUBBLEGEM_REQUESTBubbleGEM
    $babb47803BUBBLEGEM_SHOWBubbleGEM
    $babc47804BUBBLEGEM_ACKBubbleGEM
    $babd47805BUBBLEGEM_ASKFONTBubbleGEM
    $babe47806BUBBLEGEM_FONTBubbleGEM
    $babf47807BUBBLEGEM_HIDEBubbleGEM
    $c01049168COLOR_IDColor-Drag&Drop
    $c01149169COLOR_RGBColor-Drag&Drop
    $cab051888CAB_CHANGEDCAB Protocol
    $cab151889CAB_EXITCAB Protocol
    $cab251890CAB_PATHCAB Protocol
    $cab351891CAB_VIEWCAB Protocol
    $cab451892CAB_TERMCAB Protocol
    $cab551893CAB_REQUESTSTATUSCAB Protocol
    $cab651894CAB_RELEASESTATUSCAB Protocol
    $cab751895CAB_STATUSCAB Protocol
    $cab851896CAB_HELLOCAB Protocol
    $cab951897CAB_MAILCAB Protocol
    $caba51898CAB_MAILSENTCAB Protocol
    $cabb51899CAB_MAILSENTCAB Protocol
    $cabc..$cabf51900..51903CAB Protocol
    $cc00..$cc7f52224..52351CYBSMASH_Request_xxxCybersmash
    $cc80..$ccff52352..52479CYBSMASH_Reply_xxxCybersmash
    $cc6052320MSG_CT60_TEMPCT60-CPX
    $dadd56029DHST_ADDDocument History Protocol
    $dade56030DHST_ACKDocument History Protocol
    $de00..$de7f56832..56959DEGAS_Request_xxxDegas
    $de80..$deff56960..57087DEGAS_Reply_xxxDegas
    $e00057344X_MN_SELECTEDGeneva
    $e10057600X_WM_SELECTEDGeneva
    $e20057856X_GET_HELPGeneva
    $e40058368X_WM_HSPLITGeneva
    $e60058880X_WM_ARROWED2Geneva
    $e70059136X_WM_HSLID2Geneva
    $e80059392X_WM_VSLID2Geneva
    $e90059648X_WM_OBJECTGeneva
    $ea0059904X_WM_VECKEYGeneva Release 004
    $ea0159905X_WM_VECSWGeneva Release 004
    $ea0259906X_WM_VECEVNTGeneva Release 004
    $ed0060672ED_HELLOSTeno
    $ed0160673ED_OPENSTeno
    $ed0260674ED_BYESTeno
    $ed1060688ED_LOADFSTeno
    $ed1160676ED_NEWSTeno
    $ed1260677ED_SAVEFSTeno
    $ed1460692ED_CUTSTeno
    $ed1560693ED_COPYSTeno
    $ed1660694ED_PASTESTeno
    $ed1760695ED_DELETESTeno
    $ed1860696ED_FINDSTeno
    $ed1960697ED_CHANGESTeno
    $ed1a60698ED_PRINTSTeno
    $ed1d60701ED_LINESTeno
    $ed1e60702ED_READSTeno
    $ed1f60703ED_INQINFSTeno
    $ed3060720ED_DCLICKSTeno
    $ed3160721ED_SELECTSTeno
    $ed4060736ED_MLOADSTeno
    $ed4160737ED_MNEWSTeno
    $ed4260738ED_MSAVESTeno
    $ed5060752ED_CLOSESTeno
    $ed5160753ED_UNDOKSTeno
    $ed8060800ED_REPLY (Answer to ED_HELLO)STeno
    $ed9f60831Answer of ED_INQINFSTeno
    $f3d062416F3D_INITFocus 3D
    $f3d162417F3D_EXITFocus 3D
    $f3d262418F3D_REQUESTFocus 3D
    $f3d362419F3D_RETURNFocus 3D
    $f3d4..$f3df62420..62431reserviertFocus 3D
    $f82563525Answer of MSG_ENABLESTalker
    -2011
    $f82663526Answer of MSG_EXECUTE_SCRIPTSTalker
    -2010
    $f82763527Answer of MSG_KEYSTROKESTalker
    -2009
    $f82863528Answer of MSG_SENSTRINGSTalker
    -2008
    $f82963529Answer of MSG_RESOURCESTalker
    -2007
    $f82a63530Answer of MSG_BUFFERSTalker
    -2006
    $f82b63531Answer of MSG_CONFIGSTalker
    -2005
    $f82c63532Answer of MSG_INFOSTalker
    -2004
    $f82d63533Answer of MSG_DISPLAYSTalker
    -2003
    $f82e63534Answer of MSG_WAKESTalker
    -2002
    $f82f63535Answer of MSG_SLEEPSTalker
    -2001
    $f83063536Answer of MSG_IDENTIFYSTalker
    -2000
    $fe0065034 PRINTMON.APP (NVDI)
    $fe0165035 PRINTMON.APP (NVDI)
    $ff0165281 PRINTMON.APP (NVDI)
    $fff065520XMESSAGEXMSG - Message Server
    $fff165521XMSG_ASKXMSG - Message Server
    $fff265522XMSG_OKXMSG - Message Server
    +
    + +

    8.7.9.1 Das CAB-Protokoll

    +

    Das CAB-Protokoll besteht aus einer Reihe von AES-Messages mit +deren Hilfe beliebige GEM-Programme bestimmte Aufgaben an CAB +übertragen können, bzw. bestimmte Aktionen mit CAB koordinieren +können. +

    +

    Der Inhalt der Environment-Variablen BROWSER= (sofern definiert) +enthält den Zugriffspfad von CAB. Sollte sich CAB nicht im Speicher +befinden kann ein Programm über diese Variable CAB selbst +nachstarten. +

    +

    Eine mögliche Anwendung: Falls man im Internet weitere aktuelle +Informationen oder Updates zu eigenen Programmen anbietet, könnte man +mit dem CAB-Protokoll ohne großen Aufwand den Zugriff auf diese +Informationen aus diesen Programmen heraus ermöglichen. CAB erledigt +dann den Download der Daten und die Darstellung. +

    +

    Die Beschreibung der Messages +

    + +

    CAB_HELLO (0xCAB8) (Nachricht von CAB) +
    CAB verschickt nach seinem Start an alle laufenden Programme diese +Nachricht +

    +
    msg[0] = 0xCAB8
    +msg[1] = Id von CAB
    +msg[2] = 0
    +msg[3] = Version des CAB-Protokolls (0x0100 entspricht V1.00)
    +msg[4] = Bitvektor mit den von CAB (CAB.OVL) unterstützten Internet-
    +         Protokollen
    +             Bit 0: HTTP
    +             Bit 1: FTP
    +             Bit 2: GOPHER
    +             Bit 3: WAIS
    +             Bit 4: MAILTO
    +             Bit 5: NNTP
    +             Bit 6: TELNET
    +             Bit 7-15: 0 (reserviert)
    +msg[5] = Bitvektor mit den von CAB unterstützten Nachrichten des
    +         CAB-Protokolls.
    +             Bit 0: CAB_VIEW
    +             Bit 1: CAB_MAIL, CAB_MAILSENT
    +             Bit 2: CAB_REQUESTSTATUS, CAB_RELEASESTATUS, CAB_STATUS,
    +                    CAB_EXIT
    +             Bit 3-15: 0 (reserviert)
    +msg[6] = 0
    +msg[7] = 0
    +
    + +

    CAB_SUPPORT (0xCABB) (Nachricht an CAB) +
    Wird diese Nachricht an CAB geschickt, sendet CAB die Nachricht +CAB_HELLO zurück. Bleibt CAB_HELLO aus, wird noch eine alte Version +von CAB benutzt welche das CAB-Protokoll noch nicht unterstützt. Alle +Programme, die an den Informationen interessiert sind, die CAB_HELLO +liefert, sollten nach dem Start CAB_SUPPORT an CAB senden. Wird CAB +erst später gestartet, wird CAB_HELLO automatisch an das Programm +geschickt. +

    +
    msg[0] = 0xCABB
    +msg[1] = Id des PRGs
    +msg[2] = 0
    +msg[3] = 0
    +msg[4] = 0
    +msg[5] = 0
    +msg[6] = 0
    +msg[7] = 0
    +
    + +

    CAB_VIEW (0xCAB3) (Nachricht an CAB) +
    Ähnlich wie VA_START aber statt eines Dateinamens wird eine URL +übergeben. CAB zeigt diese Datei dann an. +

    +
    msg[0] = 0xCAB3
    +msg[1] = Id des PRGs
    +msg[2] = 0
    +msg[3] = \ Zeiger auf die URL
    +msg[4] = /
    +msg[5] = Wenn hier 1 eingetragen wurde, stellt CAB die URL in einem neuen
    +         Fenster dar, wenn 0 eingetragen wurde wird das oberste CAB-
    +         Fenster benutzt.
    +msg[6] = 0
    +msg[7] = 0
    +
    + +

    CAB_REQUESTSTATUS (0xCAB5) (Nachricht an CAB) +
    Kann an CAB geschickt werden, um zu erfahren ob CAB zur Zeit +online oder offline ist. CAB schickt daraufhin bei jeder Änderung des +On-/Offline- Statuses die Message CAB_STATUS. +

    +
    msg[0] = 0xCAB5
    +msg[1] = Id des PRGs
    +msg[2] = 0
    +msg[3] = 0
    +msg[4] = 0
    +msg[5] = 0
    +msg[6] = 0
    +msg[7] = 0
    +
    + +

    CAB_RELEASESTATUS (0xCAB7) (Nachricht an CAB) +
    Sollte an CAB geschickt werden, wenn ein Programm nicht mehr an +den on/offline- Informationen interessiert ist, die mit +CAB_REQUESTSTATUS angefordert wurden (z.B. weil es sich beendet). +

    +
    msg[0] = 0xCAB7
    +msg[1] = Id des PRGs
    +msg[2] = 0
    +msg[3] = 0
    +msg[4] = 0
    +msg[5] = 0
    +msg[6] = 0
    +msg[7] = 0
    +
    + +

    CAB_STATUS (0xCAB6) (Nachricht von CAB) +
    Wird von CAB an alle Programme verschickt, die sich mit +CAB_REQUESTSTATUS angemeldet haben. +

    +
    msg[0] = 0xCAB6
    +msg[1] = Id von CAB
    +msg[2] = 0
    +msg[3] = 1 falls CAB online; 0 falls CAB offline.
    +msg[4] = 0
    +msg[5] = 0
    +msg[6] = 0
    +msg[7] = 0
    +
    + +

    CAB_EXIT (0xCAB1) (Nachricht von CAB) +
    Wird von CAB an alle Programme geschickt, die sich mit +CAB_REQUESTSTATUS angemeldet haben, sobald sich CAB beendet. Vorher +wird auch noch ein CAB_STATUS gesendet, in dem der offline-Zustand +gemeldet wird. +

    +
    msg[0] = 0xCAB1
    +msg[1] = Id von CAB
    +msg[2] = 0
    +msg[3] = 0
    +msg[4] = 0
    +msg[5] = 0
    +msg[6] = 0
    +msg[7] = 0
    +
    + +

    CAB_MAIL (0xCAB9) (Nachricht an CAB) +
    Kann an CAB geschickt werden, um Mails zu verschicken. +

    +
    msg[0] = 0xCAB9
    +msg[1] = Id des PRGs
    +msg[2] = 0
    +
    +msg[3] = \ Zeiger auf die URL. Ein 'Betreff' (Subject) kann, durch ein
    +msg[4] = / Fragezeichen getrennt, direkt an die URL gehängt werden.
    +
    +msg[5] = \ Zeiger auf eine Datei, die den Mailinhalt enthält oder
    +msg[6] = / null (dann öffnet CAB einen Editor, in dem die Mail eingegeben
    +           wird).
    +
    +msg[7] = Bitvektor mit weiteren Optionen.
    +             Bit 0: 0 falls die Maildatei sofort verschickt werden soll,
    +                    oder 1 falls die Maildatei vom Benutzer noch in CAB
    +                    bearbeitet/geändert werden soll.
    +             Bit 1: bei 1 wird die Maildatei gelöscht, nachdem
    +                    sie verschickt wurde, bei 0 bleibt sie erhalten.
    +             Bit 2-15: 0 (reserviert)
    +
    + +

    CAB_MAILSENT (0xCABA) (Nachricht von CAB) +
    Wird von CAB an das Programm geschickt, welches CAB_MAIL gesendet +hat und enthält Informationen, ob das Verschicken der Mail geklappt +hat oder nicht. +

    +
    msg[0] = 0xCABA
    +msg[1] = Id von CAB
    +msg[2] = 0
    +msg[3] = 1 falls die Mail ohne Fehler verschickt wurde; 0 bei Fehler (in
    +         diesem Fall ist in msg[4] die Fehlerursache zu erfahren).
    +msg[4] = Enthält eine Fehlernummer, falls msg[3]=0
    +              0: Keine URL angegeben.
    +              1: Offline, Netzverbindung gestört, Server nicht erreichbar.
    +              2: Benutzer hat Aktion abgebrochen (Falls die Mail in CAB
    +                 bearbeitet werden sollte, hat der Benutzer die
    +                 Möglichkeit die Aktion abzubrechen)
    +              3: GEMDOS-Fehler beim Zugriff auf die Maildatei.
    +              4: Editor zum Bearbeiten konnte nicht aufgerufen werden.
    +msg[5] = 0
    +msg[6] = 0
    +msg[7] = 0
    +
    +

    Spezielle Messages für 'Cache-Tools' +
    +

    + +

    CAB_CHANGED (0xCAB0) (Nachricht an/von CAB) +
    Der Cache (bzw. CACHE.CAB) wurde verändert und soll neu +eingelesen werden. +

    +
    msg[0] = 0xCAB0
    +msg[1] = Id von CAB/des PRGs
    +msg[2] = 0
    +msg[3] = 0
    +msg[4] = 0
    +msg[5] = 0
    +msg[6] = 0
    +msg[7] = 0
    +
    +

    CAB_EXIT (0xCAB1) (Nachricht an/von CAB) +
    CAB oder das Cache-Tool beendet sich (als Info für das jeweils +andere PRG) +

    +
    msg[0] = 0xCAB1
    +msg[1] = Id von CAB/des PRGs
    +msg[2] = 0
    +msg[3] = 0
    +msg[4] = 0
    +msg[5] = 0
    +msg[6] = 0
    +msg[7] = 0
    +
    + +

    CAB_PATH (0xCAB2) (Nachricht von CAB) +
    Die lokalen HTML-Verzeichnisse und/oder das Cache-Verzeichnis +wurde geändert. Nähere Infos sind in der Cache-Tools-Dokumentation +zu erfahren. +

    +
    msg[0] = 0xCAB2
    +msg[1] = Id von CAB
    +msg[2] = 0
    +msg[3] = 0
    +msg[4] = 0
    +msg[5] = 0
    +msg[6] = 0
    +msg[7] = 0
    +
    + +

    CAB_TERM (0xCAB4) (Nachricht von CAB) +
    Das Cache-Tool soll sich beenden. +

    +
    msg[0] = 0xCAB4
    +msg[1] = Id von CAB
    +msg[2] = 0
    +msg[3] = 0
    +msg[4] = 0
    +msg[5] = 0
    +msg[6] = 0
    +msg[7] = 0
    +
    +

    8.7.9.2 Messages from Geneva

    +
    +
    +
    X_MN_SELECTED (0xE000)
    +
    +

    +
    This message is either accompanied by the MU_MESAG bit of an +evnt_multi return, or is returned by the evnt_mesag call. When this +message occurs, the message buffer contains: +
      +

    + + + + + + + + + + + + + + + + + + + + + + + + +
    PortionContents
    msg[0]0xE000
    msg[3]The object index of the menu title selected
    msg[4]The object index of the selected menu item
    msg[5], [6]The object tree of the menu item selected
    msg[7]The handle of the window containing the menu
    +
    + +
    This feature is used in conjunction with the wind_set option +X_WF_MENU, described in detail, below. +
      +
    +

    + +

    bj`h=2_YT}p61>|eN$L@@Nym6 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

+
X_WM_SELECTED (0xE100)
+
+

+
This message is received when the user clicks on a window gadget +in a window whose flags were modified with the wind_tree function. It +only occurs when the X_WTFL_CLICKS attribute is off. If the user +clicks on one of the normal scroll gadgets or arrows, a standard +WM_ARROWED message is sent to the application. However, when the user +clicks on any other gadget, an X_WM_SELECTED message is sent: +
  +

+ + + + + + + + + + + + + + + + + + + + +
PortionContents
msg[0]0xE100
msg[3]The handle of the window containing the gadget
msg[4]The object index of the window tree object the user
 clicked on
+
+ +
This feature is used by the Task Manager's +"Keyboard..." dialog. +
  +
+

+ + +
X_GET_HELP (0xE200)
+
+

+
This message is sent to the Help display program when the user +requests help on a certain topic. The message is actually comprised of +two parts. When the application sees the X_GET_HELP message, it must +then use the appl_read function to get the entire remainder of the +message, whether it intends to use the whole thing or not. The first +part of the message is comprised of the following values: +
  +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PortionContents
msg[0]0xE200
msg[1]Application ID
msg[2]Length of the second part ofthe message
msg[3]Length of the topic portion of the message, including
 the NUL terminator
msg[4]Length of the filename portion of the message, including
 the NUL terminator
msg[5]Upper/lowercase sensitivity. If non-zero, the topic is
 case-sensitive.
+
+ +
The second part of the message contains the actual text of the +topic and filename fields. This can be read with one or more calls to +appl_read. +
  +
Example: +
  +
    void read_string( char *s, int max, int size )
+    {
+      char dummy;
+
+      if( size<=max )               /* the whole string fits */
+        appl_read( my_application_id, size, s );
+      else
+      {
+        /* read what we can */
+        appl_read( my_application_id, max-1, s);
+        s[max-1] = '\0';            /* terminate the string   */
+        /* now, get the remaining bytes of the string         */
+        for( size=size-(max-1); size>0; size-- )
+           appl_read( my_application_id, 1, &dummy );
+      }
+    }
+
+    main()
+    {
+      int msg[8], caps_sens;
+      char topic[20], filename[100];
+
+      evnt_mesag( msg );
+      switch( msg[0] )
+      {
+        case X_GET_HELP:
+           caps_sens = msg[5];
+          /* Read the topic portion */
+           read_string( topic, sizeof(topic), msg[3] );
+          /* Read the filename portion */
+            read_string( filename, sizeof(filename). msg[4] );
+          /* Do whatever with it... */
+
+
+

+ + +
X_WM_HSPLIT (0xE400)
+
+

+
This message is sent to an application when the position of the +horizontal split bar has changed: +
  +

+ + + + + + + + + + + + + + + + + + + + + + + + +
PortionContents
msg[0]0xE400
msg[1]Application ID
msg[2]0
msg[3]Handle of the window being affected
msg[4]The new offset (in pixels) of the split bar
+
+ +
The application is then free to either act upon this message and +change the split bar position with wind_set(X_WF_HSPLIT), or to ignore +the message completely. +
  +
See the x_wind_create function for more information. +
  +
+

+ + +
X_WM_ARROWED2 (0xE600)
+
+

+
This message is sent to an application when the user has licked on +one of the arrow or scroll bar gadgets which are not reported by the +normal WM_ARROWED message. X_WM_ARROWED2 reports changes in gadgets +which are below a vertical split bar and/or to the right of a +horizontal split bar. The format of a X_WM_ARROWED2 message is +identical to that of WM_ARROWED. +
  +
See the x_wind_create function for more information. +
  +

+

+ + +
X_WM_HSLID2 (0xE700)
+
+

+
This message is sent to an application when the user has dragged +the second horizontal scroll gadget, which appears to the right of a +horizontal split bar. The format of this message is identical to that +of WM_HSLID. +
  +
See the x_wind_create function for more information. +
  +

+

+ + +
X_WM_VSLID2 (0xE800)
+
+

+
This message is sent to an application when the user has dragged +the second vertical scroll gadget, which appears below a vertical +split bar. The format of this message is identical to that of +WM_VSLID. +
  +
See the x_wind_create function for more information. +
  +

+

+ + +
X_WM_OBJECT (0xE900) (since Release 003)
+
+

+
This message type is returned to an application when it uses +wind_set mode X_WF_OBJHAND to affect the manner in which window +gadgets are handled. +
  +
If an application receives this message, it is because the +object tree handler routine instructed Geneva not to process the mouse +click on a window gadget as a normal event. Instead, a special message +is returned to the application: +
  +

+ + + + + + + + + + + + + + + + + + + + + + + + +
PortionContents
msg[0]0xE900
msg[1]Application ID
msg[2]0
msg[3]Handle of the window containing the object
msg[4]Object tree index of the object which was clicked
+
+ +
Note that in order for Geneva to determine that the mouse has +been clicked on an object in a window's tree structure, it must be of +type EXIT or TOUCHEXIT. Geneva's default window gadgets already have +these attributes set correctly. +
  +
See also: wind_set mode   X_WF_OBJHAND. +
  +

+ +
+ +

8.7.9.3 RSDAEMON_MSG

+

Der RSDAEMON ist eine parallel laufende Applikation, die die +Aufgabe des Resolvers per AES-Message übernimmt. Sinn ist quasi +ein nichtblockierendes gethostbyname(), allerdings liefert der +RSDAEMON nur eine IP, kein ganzes hostent-struct. +

+

Der RSDAEMON wird normalerweise automatisch von IConnect +gestartet und beendet. +

+

Nutzung: +

+

Per appl_find("RSDAEMON") ist die App-ID zu ermitteln. +Im Fehlerfall sollte man auf das blockierende gethostbyname() +zurückgreifen und nur, wenn garnicht anders möglich, stattdessen mit +Fehlermeldung abbrechen. +

+

Nun kann dem RSDAEMON eine AES-Message geschickt werden: +

+
#include <rsdaemon.h>
+
+pbuf[0]=RSDAEMON_MSG
+pbuf[1]=<eigene App-ID>
+pbuf[2]=0
+pbuf[3]=RSD_REQUEST_IP
+pbuf[4]=<eigene frei wählbare ID, um die Antwort zuordnen zu können>
+pbuf[5/6]=<Zeiger auf den String, der den Namen des Hosts enthält>
+           (Ggf. Speicherschutz beachten!)
+
+Der RSDAEMON liefert eine Antwort folgender Form:
+
+pbuf[0]=RSDAEMON_MSG
+pbuf[1]=<RSDAEMON-ID>
+pbuf[2]=0
+
+pbuf[3]=RSD_IP_UNKNOWN = IP konnte nicht ermittelt werden. Das kann
+                         verschiedene Ursachen haben (User hat keinen
+                         DNS eingetragen, DNS kenn den Host nicht etc.)
+pbuf[4]=<hier wird die ID aus dem Request zurückgeliefert>
+
+oder:
+
+pbuf[3]=RSD_IP_FOUND
+pbuf[4]=<hier wird die ID aus dem Request zurückgeliefert>
+pbuf[5/6]=<IP des Hosts als ulong>
+
+

Und hier noch die RSDAEMON.H: +

+
#ifndef __RSDAEMON__
+#define __RSDAEMON__
+
+#define RSDAEMON_MSG    0x995
+
+#define RSD_REQUEST_IP  1
+#define RSD_IP_FOUND    2
+#define RSD_IP_UNKNOWN  3
+
+#endif
+
+
+ +Home +AESAES +Editobjekt-FunktionenEditobjekt-Funktionen +FensterdialogeFensterdialoge + + diff --git a/de/fnts.html b/de/fnts.html new file mode 100644 index 000000000..bfe7de5f4 --- /dev/null +++ b/de/fnts.html @@ -0,0 +1,2738 @@ + + + + + +Die Anleitung zum TOS: Zeichensatzauswahl + + + + + + + + + +Home +AESAES +Erweiterte ShellfunktionenErweiterte Shellfunktionen +AES-FunktionslisteAES-Funktionsliste + +
+ +

8.25 Zeichensatzauswahl

+

Diese Bibliothek enthält Routinen zur Handhabung eines +Font-Selektors, mit dem eine Applikation Zeichensätze auswählen +kann. Die Routinen wurden mit MagiC 4 eingeführt. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
fnts_add Eigene Fonts zur Auswahl hinzufügen +
fnts_close Auswahl schließen +
fnts_create Initialisiert die Zeichensatzauswahl +
fnts_delete Speicher freigeben +
fnts_do Modalen Dialog anzeigen +
fnts_evnt Ereignisse für Dialog im Fenster bearbeiten +
fnts_get_info Informationen über einen Font ermitteln +
fnts_get_name Namen eines Fonts ermitteln +
fnts_get_no_styles Zahl der Stile einer Fontfamilie ermitteln +
fnts_get_style ID des n-ten Stil einer Familie ermitteln +
fnts_open Auswahl im Fenster öffnen +
fnts_remove Eigene Fonts aus der Liste entfernen +
fnts_update Zeichensatzauswahl aktualisieren + +
+ +

Hinweis: Die Existenz dieser Funktionen sollte am besten +durch einen Aufruf von appl_getinfo (Opcode 7) festgestellt werden. +

+

Querverweis: +
Auswahl im Fenster   Auswahl als Dialog   WDIALOG   xFSL-Schnittstelle +

+

8.25.1 fnts_add

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Font Selector Add User Fonts« - fügt eigene Fonts zur +Zeichensatzauswahl hinzu. +
  +
AES-Nummer: 185 (Unterfunktion 0) +
  +
Deklaration: int16_t fnts_add ( FNT_DIALOG *fnt_dialog, FNTS_ITEM +*user_fonts ); +
  +
Beschreibung: Die Funktion fügt eigene Zeichensätze zu den von der +Fontauswahl angezeigten hinzu. Es gilt: +
  +

+
+ + + + + + + + + + + + +
ParameterBedeutung
fnt_dialogZeiger auf Verwaltungsstruktur
user_fontsZeiger auf eigene Zeichensätze
+
+ +
Hinweis: Die ID der eigenen Fonts muß jeweils größer +als 65535 sein. Darüber hinaus muß in der Komponente display +der FNTS_ITEM-Struktur ein Zeiger auf die Anzeigefunktion eingetragen +werden. +
  +
Ergebnis: Die Funktion liefert bei fehlerfreier Ausführung den Wert 1 +zurück. Ein Wert von 0 signalisiert hingegen einen Fehler. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Zeichensatzauswahl +
  +
Querverweis: Binding   fnts_delete   fnts_remove   xFSL-Schnittstelle +
  + +
+ +

8.25.1.1 Bindings für fnts_add

+ + + + + + + + + +
C: int16_t fnts_add ( FNT_DIALOG *fnt_dialog, FNTS_ITEM +*user_fonts ); +
  +
Umsetzung: +
  +
int16_t fnts_add ( FNT_DIALOG *fnt_dialog,
+                   FNTS_ITEM *user_fonts )
+{
+   addr_in[0] = fnt_dialog;
+   addr_in[1] = user_fonts;
+
+   int_in[0] = 0;
+   crys_if (185);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]185 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]fnt_dialog
addr_in+4addr_in[1]user_fonts
int_inint_in[0]0 # Unterfunktion
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.25.2 fnts_close

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Font Selector Close Window« - schließt die Fontauswahl. +
  +
AES-Nummer: 183 +
  +
Deklaration: int16_t fnts_close ( FNT_DIALOG *fnt_dialog, int16_t *x, +int16_t *y ); +
  +
Beschreibung: Die Funktion schließt das Fenster der Zeichensatzauswahl. Dabei gilt: +
  +

+
+ + + + + + + + + + + + + + + + +
ParameterBedeutung
fnt_dialogZeiger auf Verwaltungsstruktur
xZeiger auf eine Variable in der die letzte x-Koordinate des Dialogs zurückgeliefert wird.
yZeiger auf eine Variable in der die letzte y-Koordinate des Dialogs zurückgeliefert wird.
+
+ +
Hinweis: Alte WDIALOG-Versionen liefern nicht die +Fensterkoordinaten zurück. In diesem Fall trägt das Binding -1 ein, +so daß der Dialog beim nächsten Aufruf automatisch zentriert wird. +
  +
Ergebnis: Die Funktion liefert stets den Wert 1 zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Zeichensatzauswahl +
  +
Querverweis: Binding   fnts_open   xFSL-Schnittstelle +
  + +
+ +

8.25.2.1 Bindings für fnts_close

+ + + + + + + + + +
C: int16_t fnts_close ( FNT_DIALOG *fnt_dialog, int16_t *x, +int16_t *y ); +
  +
Umsetzung: +
  +
int16_t fnts_close ( FNT_DIALOG *fnt_dialog, int16_t *x,
+                     int16_t *y )
+{
+   int_out[1] = -1;
+   int_out[2] = -1;
+
+   addr_in[0] = fnt_dialog;
+
+   crys_if (183);
+
+   *x = int_out[1];
+   *y = int_out[2];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]183 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]3 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]fnt_dialog
int_outint_out[0]Return-Wert
int_out+2int_out[1]letzte x-Koordinate des Dialogs
int_out+4int_out[2]letzte y-Koordinate des Dialogs
+
+ + +
+ +

8.25.3 fnts_create

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Font Selector Create« - initialisiert die +Zeichensatzauswahl. +
  +
AES-Nummer: 180 +
  +
Deklaration: FNT_DIALOG *fnts_create ( int16_t vdi_handle, int16_t no_fonts, +int16_t font_flags, int16_t dialog_flags, int8_t *sample, int8_t +*opt_button ); +
  +
Beschreibung: Die Funktion initialisiert die Zeichensatzauswahl. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
vdi_handle Kennung der benutzten Workstation +
no_fonts Anzahl der verfügbaren Fonts (oder 0) +
font_flags Bitvektor der anzuzeigenden Fonts + + + + +
+
+ + + + + + + + + + + + + + + + + + + + +
Bit-0=Bitmapfonts anzeigen ( FNTS_BTMP = 1)
Bit-1=Vektorfonts anzeigen ( FNTS_OUTL = 2)
Bit-2=äquidistante Fonts zeigen ( FNTS_MONO = 4)
Bit-3=proportionale Fonts zeigen ( FNTS_PROP = 8)
+
+ + + +
dialog_flags Aussehen des Dialogs +
FNTS_3D (1) = Auswahl im 3D-Look anzeigen +
FNTS_DISPLAY (2) = Stile anzeigen (XaAES) +
sample String für Beispieltext +
opt_button Zeiger auf einen String für einen optionalen Button, oder NULL + +
+ +
Hinweis: Falls no_fonts den Wert 0 besitzt, wird +die Funktion vst_load_fonts mit vdi_handle aufgerufen. +Anderenfalls wird davon ausgegangen, daß no_fonts die Anzahl +aller über vdi_handle verfügbaren Fonts ist, d.h. die Anzahl +aller Systemfonts zuzüglich der Anzahl der nachgeladenen Fonts. +
  +
Da diese Funktion je nach Systemkonfiguration durchaus 1 Sekunde +(oder mehr) benötigt, sollte man sie am Programmstart und nicht erst +direkt vor der Anzeige der Fontauswahl aufrufen. +
  +
Achtung: Der Fontselektor verändert die Attribute der +mit vdi_handle bezeichneten Workstation. Wenn man die bei +fnts_create übergebene Workstation noch für andere Zwecke benutzen +möchte, müssen auf jeden Fall die Attribute vorher gesetzt werden, +da sie evtl. zwischenzeitlich vom Fontselektor geändert wurden. +
  +
Ergebnis: Die Funktion liefert einen Zeiger auf die Verwaltungsstruktur +der Zeichensätze zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Zeichensatzauswahl +
  +
Querverweis: Binding   fnts_open   fnts_close   xFSL-Schnittstelle +
  + +
+ +

8.25.3.1 Bindings für fnts_create

+ + + + + + + + + +
C: FNT_DIALOG *fnts_create ( int16_t vdi_handle, int16_t no_fonts, +int16_t font_flags, int16_t dialog_flags, int8_t *sample, int8_t +*opt_button ); +
  +
Umsetzung: +
  +
FNT_DIALOG *fnts_create ( int16_t vdi_handle,
+                          int16_t no_fonts,
+                          int16_t font_flags,
+                          int16_t dialog_flags,
+                          int8_t *sample,
+                          int8_t *opt_button )
+{
+   addr_in[0] = sample;
+   addr_in[1] = opt_button;
+
+   int_in[0] = vdi_handle;
+   int_in[1] = no_fonts;
+   int_in[2] = font_flags;
+   int_in[3] = dialog_flags;
+   crys_if (180);
+
+   return ( addr_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]180 # Opcode der Funktion
control+2control[1]4 # Einträge in int_in
control+4control[2]0 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]1 # Einträge in addr_out
addr_inaddr_in[0]sample
addr_in+4addr_in[1]opt_button
int_inint_in[0]vdi_handle
int_in+2int_in[1]no_fonts
int_in+4int_in[2]font_flags
int_in+6int_in[3]dialog_flags
addr_outaddr_out[0]Return-Wert
+
+ + +
+ +

8.25.4 fnts_delete

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Font Selector Delete« - Speicher der Zeichensatzauswahl freigeben. +
  +
AES-Nummer: 181 +
  +
Deklaration: int16_t fnts_delete ( FNT_DIALOG *fnt_dialog, int16_t +vdi_handle ); +
  +
Beschreibung: Die Funktion gibt den Speicherplatz für die Zeichensatzauswahl wieder +frei. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
fnt_dialog Zeiger auf Verwaltungsstruktur +
vdi_handle Kennung der Workstation (oder 0) + +
+ +
Hinweis: Ist vdi_handle ungleich 0, so wird die +Funktion vst_unload_fonts aufgerufen. +
  +
Ergebnis: Die Funktion liefert stets den Wert 1 zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Zeichensatzauswahl +
  +
Querverweis: Binding   fnts_close   fnts_remove   xFSL-Schnittstelle +
  + +
+ +

8.25.4.1 Bindings für fnts_delete

+ + + + + + + + + +
C: int16_t fnts_delete ( FNT_DIALOG *fnt_dialog, int16_t +vdi_handle ); +
  +
Umsetzung: +
  +
int16_t fnts_delete ( FNT_DIALOG *fnt_dialog,
+                      int16_t vdi_handle )
+{
+   addr_in[0] = fnt_dialog;
+   int_in[0]  = vdi_handle;
+   crys_if (181);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]181 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]fnt_dialog
int_inint_in[0]vdi_handle
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.25.5 fnts_do

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Font Selector Do« - Zeichensatzauswahl im modalen Dialog anzeigen. +
  +
AES-Nummer: 187 +
  +
Deklaration: int16_t fnts_do ( FNT_DIALOG *fnt_dialog, int16_t button_flags, +int32_t id_in, int32_t pt_in, int32_t ratio_in, int16_t *check_boxes, +int32_t *id, fix31 *pt, int32_t *ratio ); +
  +
Beschreibung: Die Funktion zeigt die Zeichensatzauswahl in einem modalen Dialog an. Es +gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
fnt_dialog Zeiger auf Verwaltungsstruktur +
button_flags Flags für unterstützte Buttons + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
0x0001 = Checkbox für Namen selektieren +
0x0002 = Checkbox für Stile selektieren +
0x0004 = Checkbox für die Höhe selekt. +
0x0008 = Checkbox für Breiten/Höhenverhältnis selektieren +
0x0100 = Checkbox für Namen anzeigen +
0x0200 = Checkbox für Stile anzeigen +
0x0400 = Checkbox für Höhe anzeigen +
0x0800 = Checkbox für Breiten/Höhenverhältnis anzeigen +
0x1000 = Breiten/Höhen Verh. einstellbar +
0x2000 = Button 'setzen' anwählbar +
0x4000 = Button 'markieren' anwählbar + +
+ +
id_in ID des anzuzeigenden Fonts +
pt_in Höhe des anzuzeigenden Fonts +
ratio_in dto. jedoch Breiten/Höhen-Verhältnis +
check_boxes Status der Checkboxen +
id ID des ausgewählten Fonts +
pt Höhe des Fonts in 1/65536 Punkten +
ratio Breiten/Höhen-Verhältnis + +
+ +
Hinweis: Diese Funktion kann als Gegenstück zu +fnts_open, fnts_evnt und fnts_close aufgefaßt werden. Sie kehrt erst +dann zum Aufrufer zurück, wenn einer der EXIT-Buttons betätigt +wurde. +
  +
Ergebnis: Die Funktion liefert die Nummer des ausgewählten Buttons (oder +0) zurück, dabei gilt: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
1=Abbruch-Button
2=Ok-Button
3=Setzen-Button
4=markieren-Button
5=optionaler Button
+
+ +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Zeichensatzauswahl +
  +
Querverweis: Binding   fnts_open   fnts_evnt   xFSL-Schnittstelle +
  + +
+ +

8.25.5.1 Bindings für fnts_do

+ + + + + + + + + +
C: int16_t fnts_do ( FNT_DIALOG *fnt_dialog, int16_t button_flags, +int32_t id_in, int32_t pt_in, int32_t ratio_in, int16_t *check_boxes, +int32_t *id, fix31 *pt, int32_t *ratio ); +
  +
Umsetzung: +
  +
int16_t fnts_do ( FNT_DIALOG *fnt_dialog,
+                  int16_t button_flags,
+                  int32_t id_in, int32_t pt_in,
+                  int32_t ratio_in, int16_t *check_boxes,
+                  int32_t *id, fix31 *pt, int32_t *ratio )
+{
+   addr_in[0] = fnt_dialog;
+
+   int_in[0]    = button_flags;
+   int_in[1..2] = id_in;
+   int_in[3..4] = pt_in;
+   int_in[5..6] = ratio_in;
+   crys_if (187);
+
+   *check_boxes = int_out[1];
+   *id          = int_out[2..3];
+   *pt          = int_out[4..5];
+   *ratio       = int_out[6..7];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]187 # Opcode der Funktion
control+2control[1]7 # Einträge in int_in
control+4control[2]8 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]fnt_dialog
int_inint_in[0]button_flags
int_in+2int_in[1..2]id_in
int_in+6int_in[3..4]pt_in
int_in+10int_in[5..6]ratio_in
int_outint_out[0]Return-Wert
int_out+2int_out[1]check_boxes
int_out+4int_out[2..3]id
int_out+8int_out[4..5]pt
int_out+12int_out[6..7]ratio
+
+ + +
+ +

8.25.6 fnts_evnt

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Font Selector Handle Event« - Ereignisse für Zeichensatzauswahl +bearbeiten. +
  +
AES-Nummer: 186 +
  +
Deklaration: int16_t fnts_evnt ( FNT_DIALOG *fnt_dialog, EVNT *events, +int16_t *button, int16_t *check_boxes, int32_t *id, fix31 *pt, int32_t +*ratio ); +
  +
Beschreibung: Die Funktion wertet die übergebene EVNT-Struktur aus. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
fnt_dialog Zeiger auf Verwaltungsstruktur +
events Zeiger auf EVNT-Struktur +
button ausgewählter Button (oder 0) + + + + + + + + + + + + + + + +
1 = Abbruch +
2 = Ok +
3 = Setzen +
4 = markieren +
5 = optional (Applikations-Eigen) + +
+ +
check_boxes Status der Checkboxen + + + + + + + + + + + + +
Bit-0 = Box für Namen selektiert +
Bit-1 = Box für Stile selektiert +
Bit-2 = Box für Höhe selektiert +
Bit-3 = dto. für Breiten/Höhenverhältnis + +
+ +
id ID des ausgewählten Fonts +
pt Höhe des Fonts in 1/65536 Punkten +
ratio Breiten/Höhen-Verhältnis + +
+ +
Hinweis: Die Funktion ruft intern wdlg_evnt auf. +
  +
Ergebnis: Die Funktion liefert den Wert 0 zurück, falls ein Exitbutton +angewählt worden ist. Ein Wert von 1 hingegen zeigt an, daß nichts +passiert ist. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Zeichensatzauswahl +
  +
Querverweis: Binding   fnts_do   xFSL-Schnittstelle +
  + +
+ +

8.25.6.1 Bindings für fnts_evnt

+ + + + + + + + + +
C: int16_t fnts_evnt ( FNT_DIALOG *fnt_dialog, EVNT *events, +int16_t *button, int16_t *check_boxes, int32_t *id, fix31 *pt, int32_t +*ratio ); +
  +
Umsetzung: +
  +
int16_t fnts_evnt ( FNT_DIALOG *fnt_dialog, EVNT *events,
+                    int16_t *button, int16_t *check_boxes,
+                    int32_t *id, fix31 *pt, int32_t *ratio )
+{
+   addr_in[0] = fnt_dialog;
+   addr_in[1] = events;
+   crys_if (186);
+
+   *button      = int_out[1];
+   *check_boxes = int_out[2];
+   *id          = int_out[3..4];
+   *pt          = int_out[5..6];
+   *ratio       = int_out[7..8];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]186 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]9 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]fnt_dialog
addr_in+4addr_in[1]events
int_outint_out[0]Return-Wert
int_out+2int_out[1]button
int_out+4int_out[2]check_boxes
int_out+6int_out[3..4]id
int_out+10int_out[5..6]pt
int_out+14int_out[7..8]ratio
+
+ + +
+ +

8.25.7 fnts_get_info

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Font Selector - Get Font Info« - Informationen über einen +Zeichensatz ermitteln. +
  +
AES-Nummer: 184 (Unterfunktion 3) +
  +
Deklaration: int16_t fnts_get_info ( FNT_DIALOG *fnt_dialog, int32_t id, +int16_t *mono, int16_t *outline ); +
  +
Beschreibung: Die Funktion ermittelt Informationen über einen Zeichensatz. +Es gilt: +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
fnt_dialogZeiger auf Verwaltungsstruktur
idID des Zeichensatzes
monoFlag für Monospaced (Äquidistanz)
outlineFlag für Vektorfont
+
+ +
Hinweis: Die Funktion ermittelt ob der angegebene Font +ein äquidistanter oder ein Vektorzeichensatz ist. +
  +
Ergebnis: Die Funktion liefert die Nummer des Zeichensatzes (oder im +Fehlerfall den Wert 0) zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Zeichensatzauswahl +
  +
Querverweis: Binding   fnts_get_name   fnts_get_style   xFSL-Schnittstelle +
  + +
+ +

8.25.7.1 Bindings für fnts_get_info

+ + + + + + + + + +
C: int16_t fnts_get_info ( FNT_DIALOG *fnt_dialog, int32_t id, +int16_t *mono, int16_t *outline ); +
  +
Umsetzung: +
  +
int16_t fnts_get_info ( FNT_DIALOG *fnt_dialog, int32_t id,
+                        int16_t *mono, int16_t *outline )
+{
+   addr_in[0] = fnt_dialog;
+
+   int_in[0]    = 3;
+   int_in[1..2] = id;
+   crys_if (184);
+
+   *mono    = int_out[1];
+   *outline = int_out[2];
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]184 # Opcode der Funktion
control+2control[1]3 # Einträge in int_in
control+4control[2]3 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]fnt_dialog
int_inint_in[0]3 # Unterfunktion
int_in+2int_in[1..2]id
int_outint_out[0]Return-Wert
int_out+2int_out[1]mono
int_out+4int_out[2]outline
+
+ + +
+ +

8.25.8 fnts_get_name

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Font Selector GetFontName« - Namen eines Zeichensatzes +ermitteln. +
  +
AES-Nummer: 184 (Unterfunktion 2) +
  +
Deklaration: int16_t fnts_get_name ( FNT_DIALOG *fnt_dialog, int32_t id, +int8_t *full_name, int8_t *family_name, int8_t *style_name ); +
  +
Beschreibung: Die Funktion ermittelt für einen Zeichensatz dessen Namen, +Familiennamen und Stilnamen. Es gilt: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
fnt_dialogZeiger auf Verwaltungsstruktur
idID des Zeichensatzes
full_namevollständiger Name (oder NULL)
family_nameFamilienname (oder NULL)
style_nameStilname (oder NULL)
+
+ +
Ergebnis: Die Funktion liefert bei fehlerfreier Ausführung den Wert 1 +zurück. Ein Wert von 0 hingegen signalisiert einen Fehler. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Zeichensatzauswahl +
  +
Querverweis: Binding   fnts_get_info   fnts_get_style   xFSL-Schnittstelle +
  + +
+ +

8.25.8.1 Bindings für fnts_get_name

+ + + + + + + + + +
C: int16_t fnts_get_name ( FNT_DIALOG *fnt_dialog, int32_t id, +int8_t *full_name, int8_t *family_name, int8_t *style_name ); +
  +
Umsetzung: +
  +
int16_t fnts_get_name ( FNT_DIALOG *fnt_dialog, int32_t id,
+                        int8_t *full_name,
+                        int8_t *family_name,
+                        int8_t *style_name )
+{
+   addr_in[0] = fnt_dialog;
+   addr_in[1] = full_name;
+   addr_in[2] = family_name;
+   addr_in[3] = style_name;
+
+   int_in[0]    = 2;
+   int_in[1..2] = id;
+   crys_if (184);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]184 # Opcode der Funktion
control+2control[1]3 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]4 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]fnt_dialog
addr_in+4addr_in[1]full_name
addr_in+8addr_in[2]family_name
addr_in+12addr_in[3]style_name
int_inint_in[0]2 # Unterfunktion
int_in+2int_in[1..2]id
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.25.9 fnts_get_no_styles

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Font Selector Get Number Of Styles« - ermittelt die Anzahl +der Stile einer Fontfamilie. +
  +
AES-Nummer: 184 (Unterfunktion 0) +
  +
Deklaration: int16_t fnts_get_no_styles ( FNT_DIALOG *fnt_dialog, int32_t id +); +
  +
Beschreibung: Die Funktion ermittelt die Anzahl der Stile eines Fonts. Es +gilt: +
  +

+
+ + + + + + + + + + + + +
ParameterBedeutung
fnt_dialogZeiger auf Verwaltungsstruktur
idID des Zeichensatzes
+
+ +
Hinweis: Der Parameter id ist dabei die Font-ID +des Zeichensatzes, die z.B. bei fnts_evnt zurückgeliefert worden sein +kann. +
  +
Ergebnis: Die Funktion liefert die Anzahl der zum Font gehörenden Stile +zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Zeichensatzauswahl +
  +
Querverweis: Binding   fnts_get_info   fnts_get_name   xFSL-Schnittstelle +
  + +
+ +

8.25.9.1 Bindings für fnts_get_no_styles

+ + + + + + + + + +
C: int16_t fnts_get_no_styles ( FNT_DIALOG *fnt_dialog, int32_t id +); +
  +
Umsetzung: +
  +
int16_t fnts_get_no_styles ( FNT_DIALOG *fnt_dialog,
+                             int32_t id )
+{
+   addr_in[0] = fnt_dialog;
+
+   int_in[0]    = 0;
+   int_in[1..2] = id;
+   crys_if (184);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]184 # Opcode der Funktion
control+2control[1]3 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]fnt_dialog
int_inint_in[0]0 # Unterfunktion
int_in+2int_in[1..2]id
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.25.10 fnts_get_style

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Font Selector Get Style ID« - Zeichensatz ID des n-ten Stils +einer Font-Familie ermitteln. +
  +
AES-Nummer: 184 (Unterfunktion 1) +
  +
Deklaration: int32_t fnts_get_style ( FNT_DIALOG *fnt_dialog, int32_t id, +int16_t index ); +
  +
Beschreibung: Die Funktion ermittelt die ID des n-ten Fonts einer +Zeichensatzfamilie. Es gilt: +
  +

+
+ + + + + + + + + + + + + + + + +
ParameterBedeutung
fnt_dialogZeiger auf Verwaltungsstruktur
idID eines Fonts der Familie
indexgewünschter Index innerhalb der Familie
+
+ +
Hinweis: Der Parameter index muß eine Zahl +zwischen 1 und dem Ergebnis von fnts_get_no_styles sein. +
  +
Ergebnis: Die Funktion liefert die ID des n-ten Fonts der +Zeichensatzfamilie zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Zeichensatzauswahl +
  +
Querverweis: Binding   fnts_get_info   fnts_get_name   xFSL-Schnittstelle +
  + +
+ +

8.25.10.1 Bindings für fnts_get_style

+ + + + + + + + + +
C: int32_t fnts_get_style ( FNT_DIALOG *fnt_dialog, int32_t id, +int16_t index ); +
  +
Umsetzung: +
  +
int32_t fnts_get_style ( FNT_DIALOG *fnt_dialog, int32_t id,
+                         int16_t index )
+{
+   addr_in[0] = fnt_dialog;
+
+   int_in[0]    = 1;
+   int_in[1..2] = id;
+   int_in[3]    = index;
+   crys_if (184);
+
+   return ( int_out[0..1] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]184 # Opcode der Funktion
control+2control[1]4 # Einträge in int_in
control+4control[2]2 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]fnt_dialog
int_inint_in[0]1 # Unterfunktion
int_in+2int_in[1..2]id
int_in+6int_in[3]index
int_outint_out[0..1]Return-Wert
+
+ + +
+ +

8.25.11 fnts_open

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Font Selector Open Window« - Zeichensatzauswahl im Fenster darstellen. +
  +
AES-Nummer: 182 +
  +
Deklaration: int16_t fnts_open ( FNT_DIALOG *fnt_dialog, int16_t +button_flags, int16_t x, int16_t y, int32_t id, fix31 pt, fix31 ratio +); +
  +
Beschreibung: Die Funktion öffnet einen Fensterdialog mit der Zeichensatzauswahl. Es +gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
fnt_dialog Zeiger auf Verwaltungsstruktur +
button_flags Flags für unterstützte Buttons + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
0x0001 = Checkbox für Namen selektieren +
0x0002 = Checkbox für Stile selektieren +
0x0004 = Checkbox für die Höhe selekt. +
0x0008 = Checkbox für Breiten/Höhenverhältnis selektieren +
0x0100 = Checkbox für Namen anzeigen +
0x0200 = Checkbox für Stile anzeigen +
0x0400 = Checkbox für Höhe anzeigen +
0x0800 = Checkbox für Breiten/Höhenverhältnis anzeigen +
0x1000 = Breiten/Höhen Verh. einstellbar +
0x2000 = Button 'setzen' anwählbar +
0x4000 = Button 'markieren' anwählbar + +
+ +
x x-Koordinate +
y y-Koordinate des Fensters +
id ID des Zeichensatzes +
pt Höhe des Fonts in 1/65536 Punkten +
ratio Breiten/Höhen-Verhältnis + +
+ +
Hinweis: Bei Koordinaten von (-1,-1) wird der Dialog +zentriert auf dem Bildschirm dargestellt. +
  +
Ergebnis: Die Funktion liefert die AES-Fensterkennung des Fensters +(oder im Fehlerfall den Wert 0) zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Zeichensatzauswahl +
  +
Querverweis: Binding   fnts_close   xFSL-Schnittstelle +
  + +
+ +

8.25.11.1 Bindings für fnts_open

+ + + + + + + + + +
C: int16_t fnts_open ( FNT_DIALOG *fnt_dialog, int16_t +button_flags, int16_t x, int16_t y, int32_t id, fix31 pt, fix31 ratio +); +
  +
Umsetzung: +
  +
int16_t fnts_open ( FNT_DIALOG *fnt_dialog,
+                    int16_t button_flags,
+                    int16_t x, int16_t y, int32_t id,
+                    fix31 pt, fix31 ratio )
+{
+   addr_in[0] = fnt_dialog;
+
+   int_in[0]    = button_flags;
+   int_in[1]    = x;
+   int_in[2]    = y;
+   int_in[3..4] = id;
+   int_in[5..6] = pt;
+   int_in[7..8] = ratio;
+   crys_if (182);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]182 # Opcode der Funktion
control+2control[1]9 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]fnt_dialog
int_inint_in[0]button_flags
int_in+2int_in[1]x
int_in+4int_in[2]y
int_in+6int_in[3..4]id
int_in+10int_in[5..6]pt
int_in+14int_in[7..8]ratio
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.25.12 fnts_remove

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Font Selector Remove User Fonts« - eigene Fonts aus der +Zeichensatzliste entfernen. +
  +
AES-Nummer: 185 (Unterfunktion 1) +
  +
Deklaration: void fnts_remove ( FNT_DIALOG *fnt_dialog ); +
  +
Beschreibung: Die Funktion entfernt die mit fnts_add angemeldeten Fonts aus +der Zeichensatzliste. Es gilt: +
  +

+
+ + + + + + + + +
ParameterBedeutung
fnt_dialogZeiger auf Verwaltungsstruktur
+
+ +
Hinweis: Falls programmeigene Zeichensätze angemeldet +sind, muß fnts_remove vor fnts_delete aufgerufen werden. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Zeichensatzauswahl +
  +
Querverweis: Binding   fnts_delete   fnts_add   xFSL-Schnittstelle +
  + +
+ +

8.25.12.1 Bindings für fnts_remove

+ + + + + + + + + +
C: void fnts_remove ( FNT_DIALOG *fnt_dialog ); +
  +
Umsetzung: +
  +
void fnts_remove ( FNT_DIALOG *fnt_dialog )
+{
+   addr_in[0] = fnt_dialog;
+   int_in[0] = 1;
+   crys_if (185);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]185 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]0 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]fnt_dialog
int_inint_in[0]1 # Unterfunktion
+
+ + +
+ +

8.25.13 fnts_update

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Font Selector Update Window« - Zeichensatzauswahl aktualsieren. +
  +
AES-Nummer: 185 (Unterfunktion 2) +
  +
Deklaration: int16_t fnts_update ( FNT_DIALOG *fnt_dialog, int16_t +button_flags, int32_t id, fix31 pt, int32_t ratio ); +
  +
Beschreibung: Die Funktion sorgt für ein Update der Zeichensatzauswahl. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
fnt_dialog Zeiger auf Verwaltungsstruktur +
button_flags Flags für unterstützte Buttons + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
0x0001 = Checkbox für Namen selektieren +
0x0002 = Checkbox für Stile selektieren +
0x0004 = Checkbox für die Höhe selekt. +
0x0008 = Checkbox für Breiten/Höhenverhältnis selektieren +
0x0100 = Checkbox für Namen anzeigen +
0x0200 = Checkbox für Stile anzeigen +
0x0400 = Checkbox für Höhe anzeigen +
0x0800 = Checkbox für Breiten/Höhenverhältnis anzeigen +
0x1000 = Breiten/Höhen Verh. einstellbar +
0x2000 = Button 'setzen' anwählbar +
0x4000 = Button 'markieren' anwählbar + +
+ +
id ID des Zeichensatzes. +
pt Höhe des Fonts in 1/65536 Punkten +
ratio Breiten/Höhen-Verhältnis + +
+ +
Ergebnis: Die Funktion liefert einen der folgenden Werte zurück: +
  +

+
+ + + + + + + + + + + + + + + +
-1=Funktion nicht vorhanden.
0=Fehler (Auswahl per fnts_close schliessen).
1=alles in Ordnung.
+
+ +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
In älteren Versionen von WDIALOG war diese Funktion noch nicht +vorhanden. Das Binding sorgt dafür, daß in diesem Fall der Wert -1 +zurückgegeben wird. +
  +
Gruppe: Zeichensatzauswahl +
  +
Querverweis: Binding   fnts_close   xFSL-Schnittstelle +
  + +
+ +

8.25.13.1 Bindings für fnts_update

+ + + + + + + + + +
C: int16_t fnts_update ( FNT_DIALOG *fnt_dialog, int16_t +button_flags, int32_t id, fix31 pt, int32_t ratio ); +
  +
Umsetzung: +
  +
int16_t fnts_update ( FNT_DIALOG *fnt_dialog,
+                      int16_t button_flags,
+                      int32_t id, fix31 pt, int32_t ratio )
+{
+   addr_in[0] = fnt_dialog;
+
+   int_in[0]    = 2;
+   int_in[1]    = button_flags;
+   int_in[2..3] = id;
+   int_in[4..5] = pt;
+   int_in[6..7] = ratio;
+   crys_if (185);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]185 # Opcode der Funktion
control+2control[1]8 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]fnt_dialog
int_inint_in[0]2
int_in+2int_in[1]button_flags
int_in+4int_in[2..3]id
int_in+8int_in[4..5]pt
int_in+12int_in[6..7]ratio
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.25.14 Zeichensatzauswahl im Fenster

+ + + + + + + + + + + + + + + +
Programmstart: fnts_create() +
. +
Aufruf der Fontauswahl: fnts_open() +
. +
Event-Loop: fnts_evnt() +
. +
......evtl. fnts_get_no_styles()/fnts_get_style()/... +
(je nach Status der Checkboxen) +
. +
Schließen der Fontauswahl: fnts_close() +
. +
Programmende: fnts_delete() + +
+ +

8.25.15 Zeichensatzauswahl als Dialog

+ + + + + + + + + +
Programmstart: fnts_create() +
. +
Aufruf der Fontauswahl: fnts_do() +
. +
+
......evtl. fnts_get_no_styles()/fnts_get_style()/... +
(je nach Status der Checkboxen) +
. +
Programmende: fnts_delete() + +
+ +
+ +Home +AESAES +Erweiterte ShellfunktionenErweiterte Shellfunktionen +AES-FunktionslisteAES-Funktionsliste + + diff --git a/de/form.html b/de/form.html new file mode 100644 index 000000000..d7bfe5e0b --- /dev/null +++ b/de/form.html @@ -0,0 +1,3681 @@ + + + + + +Die Anleitung zum TOS: Formularfunktionen + + + + + + + + + +Home +AESAES +FileselektorenFileselektoren +Geneva FunktionenGeneva Funktionen + +
+ +

8.11 Formularfunktionen

+

Diese Bibliothek enthält nützliche Funktionen zur Verarbeitung +von Dialog- bzw. Alarmboxen aller Art. Für diesen Zweck stehen die +folgenden Routinen zur Verfügung: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
form_alert Alertbox darstellen. +
form_button Simulieren eines Mausklicks. +
form_center Zentrieren eines Objektes. +
form_dial Bildschirmspeicher reservieren und freigeben. +
form_do Behandlung eines Dialogs. +
form_error Betriebssystemfehlermeldung ausgeben. +
form_keybd Auswerten einer Tastatureingabe. +
form_popup Verwaltung eines Popup-Menüs. +
form_wbutton Simulieren eines Mausklicks (im Fenster). +
form_wkeybd Auswerten einer Tastatureingabe (im Fenster). +
form_xdial Bildschirmspeicher reservieren/freigeben (Flydials). +
form_xdo Erweiterte Dialogbehandlung. +
form_xerr Betriebssystemfehlermeldung ausgeben. +
xfrm_popup Verwaltung eines Popup-Menüs, erweiterte Version +
x_form_center Zentrieren eines Objektes. +
x_form_error Betriebssystemfehlermeldung ausgeben. +
x_form_filename Konvertiert ein standard GEMDOS Dateiname in einem editierbaren +Feld in einem Dialog. +
x_form_mouse Handle mouse clicks in a dialog, including editable cursor +movement. + +
+ +

Hinweis: Einige dieser Funktionen sind nur unter MagiC +vorhanden, und bieten viel zusätzlichen Komfort (z.B. +verschiebbare Dialogboxen). +

+

Querverweis: Dialogboxen   Style-Guidelines   Scrollende Eingabefelder +

+

8.11.1 form_alert

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Form alert box« - zeichnet eine Alarmbox. +
  +
AES-Nummer: 52 +
  +
Deklaration: int16_t form_alert ( int16_t fo_adefbttn, CONST int8_t +*fo_astring ); +
  +
Beschreibung: Die Funktion stellt eine Alarmbox auf dem Bildschirm dar und +gibt die Nummer des Buttons zurück, mit dem die Alarmbox verlassen +wurde. Der Bildschirmhintergrund wird dabei vom AES gesichert. +
  +
Der Parameter fo_adefbttn bestimmt die Nummer des +Defaultbuttons der darzustellenden Alarmbox. Es gilt: +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
WertBedeutung
0kein Defaultbutton
1erster Button
2zweiter Button
3dritter Button
+
+ +
Der Parameter fo_astring ist ein Zeiger auf den String, +der das Aussehen der Alarmbox bestimmt. Das verwendete Format ist +"[n][lines][buttons]" wobei n die Nummer des +einzublendenden Icons ist: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
n Bedeutung Symbole +
    +
0 kein Icon   +
+
1 Ausrufezeichen +

+
2 Fragezeichen +

+
3 Stopschild +

+
4 Info-Icon, ab AES 4.10 +

+
5 Diskettensymbol, ab AES 4.10 +

+
6 Bombe, XaAES +

+
7 System, XaAES +

+ +
+ +
Hinweis: Die zur Verfügung stehenden Icons sollten +nicht willkürlich eingesetzt werden, sondern zur jeweiligen Situation +passen, d.h: +
  +
    +
  • das Ausrufezeichen sollte für alle Arten von +Mitteilungen benutzt werden, die der Benutzer nur kurz bestätigen +soll. +
      +

  • +
  • das Fragezeichen dient für alle Abfragen, die vor +einer Aktion ausgeführt werden sollten (z.B. das Löschen einer +Datei). +
      +

  • +
  • das Stopschild sollte bei wichtigen Problemen +eingesetzt werden, die der Benutzer unbedingt zur Kenntnis nehmen +muss. +
      +

  • +
+ +
Die Komponente lines beschreibt die einzelnen +Textzeilen. Es sind höchstens fünf Textzeilen mit maximal 30 +Zeichen, die durch das Zeichen '|' getrennt werden, erlaubt. +
  +
Die Komponente buttons beschreibt die Texte für +höchstens drei Buttons, die durch das Zeichen '|' getrennt werden. +
  +
+
MagiC:
+
+

Aufgrund der Kompatibilität zu GEM/3 können Alertboxen hier +bis zu 40 Zeichen pro Textzeile, und 20 Zeichen pro Button enthalten. +Darüberhinaus sind alle Alertboxen komplett über die Tastatur bedienbar, +mit der Funktionstaste F1 den linken, F2 den mittleren und mit F3 den +rechten Button. +
  +

+ +
+
ViewMAX/2
+
+

and later parse the "default button" parameter as two +bytes; the low byte is the default button and the high byte is the +cancel button (ESC is a shortcut for it). This style of parameter will +crash earlier GEM versions. +
  +

+ +
+
Under Geneva,
+
+

the alert string can contain left bracket ("[") +characters within the text of the buttons. These denote the keyboard +equivalents to be used for the buttons. For example, this defines an +alert with the equivalents [Alternate][H] and [Alternate][Y]: +
  +
form_alert( 1, "[1][Hi there!][[Hi!|B[ye!]" ); +
  +
If an alert button does not contain a pre-defined keyboard +equivalent, it will be considered for an automatic keyboard +equivalent. +
  +
Note:DO NOT use this type of alert string when running without +Geneva, as this will have unpredictable results. +
  +
Additionally, if an alert would normally not have a default +button, Geneva always forces the rightmost button to be the default. +For example: +
  +
form_alert( 2, "[1][Hi!][OK]" ); /* OK is the default +*/ +
  +

+ +
+
+
Ergebnis: Als Ergebnis wird die Nummer des Buttons geliefert, mit dem die +Alertbox verlassen wurde; dabei besitzt der ganz links stehende Button +den Wert 1. +
  +
Verfügbar: In allen AES Versionen. +
  +
Gruppe: Formulare +
  +
Querverweis: Binding +
  + +
+ +

8.11.1.1 Bindings für form_alert

+ + + + + + + + + +
C: int16_t form_alert ( int16_t fo_adefbttn, CONST int8_t +*fo_astring ); +
  +
Umsetzung: +
  +
int16_t form_alert (int16_t fo_adefbttn,
+                    CONST int8_t *fo_astring)
+{
+   int_in[0]  = fo_adefbttn;
+   addr_in[0] = fo_astring;
+
+   return ( crys_if(52) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]52 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]fo_adefbttn
addr_inaddr_in[0]fo_astring
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.11.2 form_button

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Form Button« - simuliert das Anklicken eines Objektes +
  +
AES-Nummer: 56 +
  +
Deklaration: int16_t form_button ( OBJECT *fo_btree, int16_t fo_bobject, +int16_t fo_bclicks, int16_t *fo_bnxtobj ); +
  +
Beschreibung: Die Funktion simuliert das Anklicken eines Objektes. Es gilt: +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
fo_btree Adresse des Objektbaumes +
fo_bobject zu bearbeitendes Objekt +
fo_bclicks Anzahl der Mausklicks +
fo_bnxtobj neues aktuelles Objekt, oder 0, falls das nächste Objekt den +Status HIDDEN oder DISABLED besitzt bzw. nicht editierbar ist. + +
+ +
Hinweis: Bei einem Doppelklick auf ein Objekt mit TOUCHEXIT, +wird im Parameter fo_bnxtobj Bit-15 gesetzt. Die Rechteckliste +wird von dieser Funktion nicht beachtet. +
  +
Ergebnis: Der Rückgabewert der Funktion ist Null, falls ein Exitobjekt +selektiert wurde, sonst ist er positiv. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Formulare +
  +
Querverweis: Binding   OBJECT   evnt_multi   form_keybd +
  + +
+ +

8.11.2.1 Bindings für form_button

+ + + + + + + + + +
C: int16_t form_button ( OBJECT *fo_btree, int16_t fo_bobject, +int16_t fo_bclicks, int16_t *fo_bnxtobj ); +
  +
Umsetzung: +
  +
int16_t form_button (OBJECT *fo_btree, int16_t fo_bobject,
+                     int16_t fo_bclicks, int16_t *fo_bnxtobj)
+{
+   int_in[0]  = fo_bobject;
+   int_in[1]  = fo_bclicks;
+   addr_in[0] = fo_btree;
+
+   crys_if (56);
+
+   *fo_bnxtobj = int_out[1];
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]56 # Opcode der Funktion
control+2control[1]2 # Einträge in int_in
control+4control[2]2 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]fo_bobject
int_in+2int_in[1]fo_bclicks
addr_inaddr_in[0]fo_btree
int_outint_out[0]Return-Wert
int_out+2int_out[1]fo_bnxtobj
+
+ + +
+ +

8.11.3 form_center

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Form centered Object« - zentriert ein Objekt auf dem +Bildschirm. +
  +
AES-Nummer: 54 +
  +
Deklaration: int16_t form_center ( OBJECT *fo_ctree, int16_t *fo_cx, int16_t +*fo_cy, int16_t *fo_cw, int16_t *fo_ch ); +
  +
Beschreibung: Die Funktion zentriert ein Objekt in der Bildschirmmitte, und +liefert die tatsächliche Position des Objektes zurück. Es gilt: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
fo_ctreeAdresse des Objektbaumes
fo_cxx-Koordinate
fo_cyy-Koordinate
fo_cwBreite
fo_chHöhe (jeweils zentriert)
+
+ +
Hinweis: Die Funktion berücksichtigt auch spezielle +Attribute des Objektes, wie z.B. OUTLINED (nicht jedoch SHADOWED). +
  +
Ab PC-GEM/3 wird der Objektbaum in y-Richtung nicht +mehr auf dem ganzen Bildschirm zentriert. Begründet wurde dies damit, +dass ein Benutzer auf Großbildschirmen ansonsten einen zu weiten Weg +von der Menüzeile bis zum Objekt (etwa einer Dialogbox) zurücklegen +muss. +
  +
Ergebnis: Als Ergebnis wird immer eine 1 zurückgegeben. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Formulare +
  +
Querverweis: Binding   x_form_center   OBJECT   objc_offset +
  + +
+ +

8.11.3.1 Bindings für form_center

+ + + + + + + + + +
C: int16_t form_center ( OBJECT *fo_ctree, int16_t *fo_cx, int16_t +*fo_cy, int16_t *fo_cw, int16_t *fo_ch ); +
  +
Umsetzung: +
  +
int16_t form_center (OBJECT *fo_ctree, int16_t *fo_cx,
+                     int16_t *fo_cy, int16_t *fo_cw,
+                     int16_t *fo_ch)
+{
+   addr_in[0] = fo_ctree;
+
+   crys_if (54);
+
+   *fo_cx = int_out[1];
+   *fo_cy = int_out[2];
+   *fo_cw = int_out[3];
+   *fo_ch = int_out[4];
+
+   return (int_out[0]);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]54 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]5 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]fo_ctree
int_outint_out[0]Return-Wert
int_out+2int_out[1]fo_cx
int_out+4int_out[2]fo_cy
int_out+6int_out[3]fo_cw
int_out+8int_out[4]fo_ch
+
+ + +
+ +

8.11.4 form_dial

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Form Dialog Space« - reserviert oder gibt Speicherplatz frei +für ein Dialogobjekt. +
  +
AES-Nummer: 51 +
  +
Deklaration: int16_t form_dial ( int16_t fo_diflag, int16_t fo_dilittlx, +int16_t fo_dilittly, int16_t fo_dilittlw, int16_t fo_dilittlh, int16_t +fo_dibigx, int16_t fo_dibigy, int16_t fo_dibigw, int16_t fo_dibigh ); +
  +
Beschreibung: Die Funktion übernimmt abhängig von den übergebenen +Parametern verschiedene Aufgaben. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
fo_diflag Auszuführende Aktion: +
0 = FMD_START Bildschirmausschnitt reservieren. +
1 = FMD_GROW zeichnet mehrere sich ausdehnende Rechtecke +
2 = FMD_SHRINK zeichnet mehrere schrumpfende Rechtecke +
3 = FMD_FINISH gibt den reservierten Bildschirmausschnitt +wieder frei +
1000 = X_FMD_START (Geneva) +
Store the information in the rectangular screen area described by +the "fo_dibig" parameters for restoration later. If there is +insufficient free memory for the area to be saved, then form_dial will +return a 0 (error) condition. +
1003 = X_FMD_FINISH (Geneva) +
Copy back the information previously saved with X_FMD_START. This +MUST be done whenever X_FMD_START is used, but not if an error +occurred during the X_FMD_START. +
fo_dilittlx x-Koordinate +
fo_dilittly y-Koordinate +
fo_dilittlw Breite +
fo_dilittlh Höhe des kleinsten Rechteckes +
fo_dibigx x-Koordinate +
fo_dibigy y-Koordinate +
fo_dibigw Breite +
fo_dibigh Höhe des größten Rechteckes + +
+ +
Hinweis: Durch den Opcode FMD_FINISH erhalten alle +betroffenen Fenster vom AES eine WM_REDRAW Nachricht. Die Menüzeile +kann auf diese Art jedoch nicht restauriert werden, da sie +außerhalb des Arbeitsbereichs des Desktop-Fensters liegt. +
  +
Die Opcodes FMD_GROW und FMD_SHRINK sind in PC-GEM Version 2.0 +den Rechtsstreitigkeiten zwischen Apple und Digital +Research zum Opfer gefallen. +
  +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Verfügbar: In allen AES Versionen. +
  +
Gruppe: Formulare +
  +
Querverweis: Binding   evnt_mesag   form_xdial   graf_growbox   +graf_shrinkbox +
  + +
+ +

8.11.4.1 Bindings für form_dial

+ + + + + + + + + +
C: int16_t form_dial ( int16_t fo_diflag, int16_t fo_dilittlx, +int16_t fo_dilittly, int16_t fo_dilittlw, int16_t fo_dilittlh, int16_t +fo_dibigx, int16_t fo_dibigy, int16_t fo_dibigw, int16_t fo_dibigh ); +
  +
Umsetzung: +
  +
int16_t form_dial (int16_t fo_diflag, int16_t fo_dilittlx,
+                   int16_t fo_dilittly, int16_t fo_dilittlw,
+                   int16_t fo_dilittlh, int16_t fo_dibigx,
+                   int16_t fo_dibigy, int16_t fo_dibigw,
+                   int16_t fo_dibigh)
+{
+   int_in[0]  = fo_diflag;
+   int_in[1]  = fo_dilittlx;
+   int_in[2]  = fo_dilittly;
+   int_in[3]  = fo_dilittlw;
+   int_in[4]  = fo_dilittlh;
+   int_in[5]  = fo_dibigx;
+   int_in[6]  = fo_dibigy;
+   int_in[7]  = fo_dibigw;
+   int_in[8]  = fo_dibigh;
+
+   return ( crys_if(51) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]51 # Opcode der Funktion
control+2control[1]9 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]fo_diflag
int_in+2int_in[1]fo_dilittlx
int_in+4int_in[2]fo_dilittly
int_in+6int_in[3]fo_dilittlw
int_in+8int_in[4]fo_dilittlh
int_in+10int_in[5]fo_dibigx
int_in+12int_in[6]fo_dibigy
int_in+14int_in[7]fo_dibigw
int_in+16int_in[8]fo_dibigh
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.11.5 form_do

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Form do Dialog« - führt den Dialog mit dem Anwender durch. +
  +
AES-Nummer: 50 +
  +
Deklaration: int16_t form_do ( OBJECT *fo_dotree, int16_t fo_dostartob ); +
  +
Beschreibung: Die Funktion übernimmt die Behandlung von Benutzeraktionen in +einem Formular. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
fo_dotree Zeiger auf den Objektbaum der Dialogbox +
fo_dostartob Nummer des Editobjekts, wo sich zu Dialogbeginn der Textcursor +befinden soll (0 falls der Objektbaum kein Editobjekt enthält) + +
+ +
Hinweis: Die Funktion kehrt erst dann zurück, wenn der +Benutzer ein Objekt mit EXIT- bzw. TOUCHEXIT Status aktiviert. +
  +
Ergebnis: Als Ergebnis wird der Index des Objekts zurückgegeben, mit +dessen Hilfe der Dialog beendet wurde. Bei einem Doppelklick wird +zusätzlich das 15. Bit gesetzt. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Formulare +
  +
Querverweis: Binding   form_xdo   OBJECT +
  + +
+ +

8.11.5.1 Bindings für form_do

+ + + + + + + + + +
C: int16_t form_do ( OBJECT *fo_dotree, int16_t fo_dostartob ); +
  +
Umsetzung: +
  +
int16_t form_do (OBJECT *fo_dotree, int16_t fo_dostartob)
+{
+   int_in[0]  = fo_dostartob;
+   addr_in[0] = fo_dotree;
+
+   return ( crys_if(50) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]50 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]fo_dostartob
addr_inaddr_in[0]fo_dotree
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.11.6 form_error

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Form Error« - stellt eine Fehlerbox für TOS-Fehler dar. +
  +
AES-Nummer: 53 +
  +
Deklaration: int16_t form_error ( int16_t fo_enum ); +
  +
Beschreibung: Die Funktion gibt eine MS-DOS Fehlernummer im Klartext (d.h. in +einer Alertbox) aus. +
  +
Der Parameter fo_enum ist dabei die entsprechende +Fehlernummer. +
  +
Hinweis: Diese Funktion ist aus Kompatibilitätsgründen +zum PC-GEM vorhanden. Auf TOS-Systemen muß daher zunächst die +GEMDOS-Fehlernummer auf die MS-DOS Codierung umgerechnet werden. Für +die Umrechnung (GEMDOS -> MS-DOS) kann z.B. die folgende Formel +benutzt werden: (~fo_enum) - 30. +
  +
In N.AES gibt es einer erweiterte Form von form_error mit allen +GEMDOS-Fehlercodes. Deren vorhandensein kann mit appl_getinfo (Opcode 64) +festgestellt werden. +
  +
Geneva interpreted a negative number as a GEMDOS/BIOS error +code, and an appropriate error message is displayed. For instance, the +call: +
form_error(-33); +
produces an alert with the text "There is no file with this +name". +
  +
Ergebnis: Als Ergebnis wird die Nummer (1-3) der ausgewählten Option +zurückgegeben. Bei jetzigen GEM-Versionen steht jedoch nur eine +Option zur Verfügung. +
  +
Verfügbar: In allen AES Versionen. +
  +
Gruppe: Formulare +
  +
Querverweis: Binding   form_xerr   form_error in N.AES +
  + +
+ +

8.11.6.1 Bindings für form_error

+ + + + + + + + + +
C: int16_t form_error ( int16_t fo_enum ); +
  +
Umsetzung: +
  +
int16_t form_error (int16_t fo_enum)
+{
+   int_in[0] = fo_enum;
+   return ( crys_if(53) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]53 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]fo_enum
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.11.7 form_keybd

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Form Keyboard« - Nimmt Tastatureingaben in ein Formular vor. +
  +
AES-Nummer: 55 +
  +
Deklaration: int16_t form_keybd ( OBJECT *fo_ktree, int16_t fo_kobject, +int16_t fo_kobnext, int16_t fo_kchar, int16_t *fo_knxtobject, int16_t +*fo_knxtchar ); +
  +
Beschreibung: Die Funktion übernimmt Tastatureingaben in ein Formular. Es +gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
fo_ktree Adresse des Objektbaumes +
fo_kobject Nummer des Edit-Objektes +
fo_kobnext unbenutzt, sollte 0 sein +
fo_kchar eingegebenes Zeichen +
fo_knxtobject Edit-Objekt für nächsten Aufruf +
fo_knxtchar 0 = Zeichen war Cursortaste, Tabulator oder Return +
>0 = übergebenes Zeichen + +
+ +
Bei der Eingabe wird ggfs. das Edit-Objekt geändert +(Cursortasten oder Tabulator), oder das Default-Objekt selektiert +(Return). +
  +
Hinweis zu MagiC, N.AES: Wird als Objektnummer der Wert +0x8765 angegeben, so werden Tasten verarbeitet, die zusammen mit der +Alternate-Taste betätigt wurden. Falls ein passendes Objekt gefunden +wurde, wird der Wert 1 zurückgegeben, das Zeichen gelöscht, und in +fo_knxtobject die zugehörige Objektnummer übergeben. +
  +
Ergebnis: Der Rückgabewert der Funktion ist Null, falls ein Exitobjekt +gewählt wurde, sonst ist er positiv. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Formulare +
  +
Querverweis: Binding   OBJECT   objc_edit   form_button   form_wkeybd +
  + +
+ +

8.11.7.1 Bindings für form_keybd

+ + + + + + + + + +
C: int16_t form_keybd ( OBJECT *fo_ktree, int16_t fo_kobject, +int16_t fo_kobnext, int16_t fo_kchar, int16_t *fo_knxtobject, int16_t +*fo_knxtchar ); +
  +
Umsetzung: +
  +
int16_t form_keybd (OBJECT *fo_ktree, int16_t fo_kobject,
+                    int16_t fo_kobnext, int16_t fo_kchar,
+                    int16_t *fo_knxtobject,
+                    int16_t *fo_knxtchar)
+{
+   int_in[0]  = fo_kobject;
+   int_in[1]  = fo_kchar;
+   int_in[2]  = fo_kobnext;
+   addr_in[0] = fo_ktree;
+
+   crys_if (55);
+
+   *fo_knxtobject = int_out[1];
+   *fo_knxtchar   = int_out[2];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]55 # Opcode der Funktion
control+2control[1]3 # Einträge in int_in
control+4control[2]3 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]fo_kobject
int_in+2int_in[1]fo_kchar
int_in+4int_in[2]fo_kobnext
addr_inaddr_in[0]fo_ktree
int_outint_out[0]Return-Wert
int_out+2int_out[1]fo_knxtobject
int_out+4int_out[2]fo_knxtchar
+
+ + +
+ +

8.11.8 form_popup

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Form Popup« - verwaltet ein Popup-Menü +
  +
AES-Nummer: 135 +
  +
Deklaration: int16_t form_popup ( OBJECT *tree, int16_t x, int16_t y ); +
  +
Beschreibung: Die Funktion stellt ein Popup-Menü auf dem Bildschirm dar, +und übernimmt dessen Verwaltung. Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
tree Adresse des Objektbaumes +
x x-Koordinate +
y y-Koordinate, um die die Box zentriert werden soll. + +
+ +
Hinweis: Falls die Parameter x und y den +Wert 0 besitzen, werden die entsprechenden Werte aus der +Objektstruktur beachtet, und das zentrieren entfällt. Es wird immer +dafür gesorgt, daß das Popup vollständig auf dem Bildschirm liegt. +
  +
Wählbare Objekte müssen den Status SELECTABLE, nicht +wählbare Objekte den Status DISABLED erhalten. Das Objekt mit der +Nummer 0 im Objektbaum, sollte den Typ G_BOX oder G_IBOX besitzen. +
  +
Ergebnis: Die Funktion liefert die Nummer des gewählten Objektes aus dem +Popup-Menü oder den Wert -1. +
  +
Verfügbar: Seit MagiC 1.11, kann aber auch per appl_getinfo (Opcode 9) abgefragt +werden, da andere System die Funktion auch kennen. +
  +
Gruppe: Formulare +
  +
Querverweis: Binding   OBJECT   xfrm_popup +
  + +
+ +

8.11.8.1 Bindings für form_popup

+ + + + + + + + + +
C: int16_t form_popup ( OBJECT *tree, int16_t x, int16_t y ); +
  +
Umsetzung: +
  +
int16_t form_popup (OBJECT *tree, int16_t x, int16_t y)
+{
+   int_in[0]  = x;
+   int_in[1]  = y;
+   addr_in[0] = tree;
+
+   return ( crys_if(135) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]135 # Opcode der Funktion
control+2control[1]2 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]x
int_in+2int_in[1]y
addr_inaddr_in[0]tree
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.11.9 form_wbutton

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Form Window Button« - simuliert das Anklicken eines Objektes +in einem Fenster. +
  +
AES-Nummer: 63 +
  +
Deklaration: int16_t form_wbutton ( OBJECT *fo_btree, int16_t fo_bobject, +int16_t fo_bclicks, int16_t *fo_bnxtobj, int16_t whandle ); +
  +
Beschreibung: Die Funktion simuliert das Anklicken eines Objektes in einem +Fenster. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
fo_btree Adresse des Objektbaumes +
fo_bobject zu bearbeitendes Objekt +
fo_bclicks Anzahl der Mausklicks +
fo_bnxtobj neues aktuelles Objekt, oder 0, falls das nächste Objekt den +Status HIDDEN oder DISABLED besitzt bzw. nicht editierbar ist. +
whandle Kennung des Fensters. + +
+ +
Hinweis: Bei einem Doppelklick auf ein Objekt mit TOUCHEXIT, +wird im Parameter fo_bnxtobj Bit-15 gesetzt. +
  +
Die Funktion entspricht im wesentlichen form_button mit dem +Unterschied, dass hier die Rechteckliste eines Fensters beachtet wird. +Die Funktion steht in MagiC ab Version 5.10 zur Verfügung. +
  +
Ergebnis: Der Rückgabewert der Funktion ist Null, falls ein Exitobjekt +selektiert wurde, sonst ist er positiv. +
  +
Verfügbar: ab MagiC Version 5.10 +
  +
Gruppe: Formulare +
  +
Querverweis: Binding   OBJECT   evnt_multi   form_keybd +
  + +
+ +

8.11.9.1 Bindings für form_wbutton

+ + + + + + + + + +
C: int16_t form_wbutton ( OBJECT *fo_btree, int16_t fo_bobject, +int16_t fo_bclicks, int16_t *fo_bnxtobj, int16_t whandle ); +
  +
Umsetzung: +
  +
int16_t form_wbutton (OBJECT *fo_btree, int16_t fo_bobject,
+                      int16_t fo_bclicks, int16_t *fo_bnxtobj,
+                      int16_t whandle)
+{
+   int_in[0]  = fo_bobject;
+   int_in[1]  = fo_bclicks;
+   int_in[2]  = whandle;
+
+   addr_in[0] = fo_btree;
+
+   crys_if (63);
+
+   *fo_bnxtobj = int_out[1];
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]63 # Opcode der Funktion
control+2control[1]3 # Einträge in int_in
control+4control[2]2 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]fo_bobject
int_in+2int_in[1]fo_bclicks
int_in+4int_in[2]whandle
addr_inaddr_in[0]fo_btree
int_outint_out[0]Return-Wert
int_out+2int_out[1]fo_bnxtobj
+
+ + +
+ +

8.11.10 form_wkeybd

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Form Window Keyboard« - Nimmt Tastatureingaben in ein +Formular in einem Fenster vor. +
  +
AES-Nummer: 64 +
  +
Deklaration: int16_t form_wkeybd ( OBJECT *fo_ktree, int16_t fo_kobject, +int16_t fo_kobnext, int16_t fo_kchar, int16_t *fo_knxtobject, int16_t +*fo_knxtchar, int16_t whandle ); +
  +
Beschreibung: Die Funktion übernimmt Tastatureingaben in ein Formular in +einem Fenster. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
fo_ktree Adresse des Objektbaumes +
fo_kobject Nummer des Edit-Objektes +
fo_kobnext unbenutzt, sollte 0 sein +
fo_kchar eingegebenes Zeichen +
fo_knxtobject Edit-Objekt für nächsten Aufruf +
fo_knxtchar 0 = Zeichen war Cursortaste, Tabulator oder Return +
>0 = übergebenes Zeichen +
whandle Kennung des Fensters. + +
+ +
Bei der Eingabe wird ggfs. das Edit-Objekt geändert +(Cursortasten oder Tabulator), oder das Default-Objekt selektiert +(Return). +
  +
Hinweis zu MagiC: Wird als Objektnummer der Wert 0x8765 +angegeben, so werden Tasten verarbeitet, die zusammen mit der +Alternate-Taste betätigt wurden. Falls ein passendes Objekt gefunden +wurde, wird der Wert 1 zurückgegeben, das Zeichen gelöscht, und in +fo_knxtobject die zugehörige Objektnummer übergeben. +
  +
Diese Funktion entspricht im wesentlichen form_keybd mit dem +Unterschied, dass hier die Rechteckliste eines Fensters beachtet wird. +
  +
Ergebnis: Der Rückgabewert der Funktion ist Null, falls ein Exitobjekt +gewählt wurde, sonst ist er positiv. +
  +
Verfügbar: ab MagiC Version 5.10 +
  +
Gruppe: Formulare +
  +
Querverweis: Binding   OBJECT   objc_edit   form_button +
  + +
+ +

8.11.10.1 Bindings für form_wkeybd

+ + + + + + + + + +
C: int16_t form_wkeybd ( OBJECT *fo_ktree, int16_t fo_kobject, +int16_t fo_kobnext, int16_t fo_kchar, int16_t *fo_knxtobject, int16_t +*fo_knxtchar, int16_t whandle ); +
  +
Umsetzung: +
  +
int16_t form_wkeybd (OBJECT *fo_ktree, int16_t fo_kobject,
+                     int16_t fo_kobnext, int16_t fo_kchar,
+                     int16_t *fo_knxtobject,
+                     int16_t *fo_knxtchar,
+                     int16_t whandle)
+{
+   int_in[0]  = fo_kobject;
+   int_in[1]  = fo_kchar;
+   int_in[2]  = fo_kobnext;
+   int_in[3]  = whandle;
+
+   addr_in[0] = fo_ktree;
+
+   crys_if (64);
+
+   *fo_knxtobject = int_out[1];
+   *fo_knxtchar   = int_out[2];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]64 # Opcode der Funktion
control+2control[1]4 # Einträge in int_in
control+4control[2]3 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]fo_kobject
int_in+2int_in[1]fo_kchar
int_in+4int_in[2]fo_kobnext
int_in+6int_in[3]whandle
addr_inaddr_in[0]fo_ktree
int_outint_out[0]Return-Wert
int_out+2int_out[1]fo_knxtobject
int_out+4int_out[2]fo_knxtchar
+
+ + +
+ +

8.11.11 form_xdial

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Form XDialog Space« - reserviert oder gibt Speicherplatz +frei für ein Dialogobjekt. +
  +
AES-Nummer: 51 +
  +
Deklaration: int16_t form_xdial ( int16_t fo_diflag, int16_t fo_dilittlx, +int16_t fo_dilittly, int16_t fo_dilittlw, int16_t fo_dilittlh, int16_t +fo_dibigx, int16_t fo_dibigy, int16_t fo_dibigw, int16_t fo_dibigh, +void **flydial ); +
  +
Beschreibung: Die Funktion übernimmt abhängig von den übergebenen +Parametern verschiedene Aufgaben. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
fo_diflag 0 = FMD_START reserviert Bildschirmspeicher für den +Dialog. +
3 = FMD_FINISH restauriert den Bildschirm und gibt den +Puffer mit dem geretteten Hintergrund wieder frei. +
fo_dilittlx x und y Koordinate, +
fo_dilittly Breite und Höhe, +
fo_dilittlw des kleinsten sich ausdehnenden bzw. +
fo_dilittlh schließenden Rechtecks. +
fo_dibigx x und y Koordinate, +
fo_dibigy Breite und Höhe, +
fo_dibigw des größten sich ausdehnenden bzw. +
fo_dibigh schließenden Rechtecks. +
flydial siehe unten + +
+ +
Hinweis: Wenn flydial ungleich 0 ist, wird +getestet, ob genügend Speicher zur Verfügung steht, um den +Hintergrund der Dialogbox zu retten. Ein Zeiger auf die geretteten +Daten wird dann in dieser Variablen vermerkt. Falls nicht genügend +Speicher zur Verfügung steht, um den Hintergrund zu retten, ist die +per form_xdo zu bearbeitende Dialogbox nicht verschiebbar; in diesem +Fall wird auch keine 'Flugecke' im Dialog angezeigt. +
  +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Verfügbar: Das Vorhandensein der Flydials kann per appl_getinfo (Opcode 14) +abgefragt werden. +
  +
Gruppe: Formulare +
  +
Querverweis: Binding   evnt_mesag   form_dial   graf_growbox   graf_shrinkbox +
  + +
+ +

8.11.11.1 Bindings für form_xdial

+ + + + + + + + + +
C: int16_t form_xdial ( int16_t fo_diflag, int16_t fo_dilittlx, +int16_t fo_dilittly, int16_t fo_dilittlw, int16_t fo_dilittlh, int16_t +fo_dibigx, int16_t fo_dibigy, int16_t fo_dibigw, int16_t fo_dibigh, +void **flydial ); +
  +
Umsetzung: +
  +
int16_t form_xdial (int16_t fo_diflag, int16_t fo_dilittlx,
+                    int16_t fo_dilittly, int16_t fo_dilittlw,
+                    int16_t fo_dilittlh, int16_t fo_dibigx,
+                    int16_t fo_dibigy, int16_t fo_dibigw,
+                    int16_t fo_dibigh, void **flydial)
+{
+   int_in[0]  = fo_diflag;
+   int_in[1]  = fo_dilittlx;
+   int_in[2]  = fo_dilittly;
+   int_in[3]  = fo_dilittlw;
+   int_in[4]  = fo_dilittlh;
+   int_in[5]  = fo_dibigx;
+   int_in[6]  = fo_dibigy;
+   int_in[7]  = fo_dibigw;
+   int_in[8]  = fo_dibigh;
+   addr_in[0] = flydial;
+   addr_in[1] = 0;              /* reserviert */
+
+   return ( crys_if(51) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]51 # Opcode der Funktion
control+2control[1]9 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]fo_diflag
int_in+2int_in[1]fo_dilittlx
int_in+4int_in[2]fo_dilittly
int_in+6int_in[3]fo_dilittlw
int_in+8int_in[4]fo_dilittlh
int_in+10int_in[5]fo_dibigx
int_in+12int_in[6]fo_dibigy
int_in+14int_in[7]fo_dibigw
int_in+16int_in[8]fo_dibigh
addr_inaddr_in[0]flydial
addr_in+4addr_in[1]0
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.11.12 form_xdo

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Form do XDialog« - führt einen erweiterten Dialog mit dem +Anwender durch. +
  +
AES-Nummer: 50 +
  +
Deklaration: int16_t form_xdo ( OBJECT *tree, int16_t startob, int16_t +*lastcrsr, XDO_INF *tabs, void *flydial ); +
  +
Beschreibung: Die Funktion übernimmt die Behandlung von Benutzeraktionen in +einem Formular. +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
tree Zeiger auf den Objektbaum der Dialogbox +
startob Nummer des Editobjekts, wo sich zu Dialogbeginn der Textcursor +befinden soll (0 falls der Objektbaum kein Editobjekt enthält). +
lastcrsr enthält die Nummer des Objekts, in dem sich der Cursor beim +Beenden des Dialogs befand. +
tabs Zeiger auf Tastatur-Tabellen oder NULL +
flydial der entsprechende von form_xdial gelieferte Parameter, oder +NULL, wenn auf Flydials verzichtet wird. + +
+ +
Ergebnis: Als Ergebnis wird der Index des Objekts zurückgegeben, mit +dessen Hilfe der Dialog beendet wurde. +
  +
Verfügbar: Die Funktion steht nur unter MagiC (ab Version 2.0) zur +Verfügung. Das Vorhandensein der Flydials, der Tastaturtabellen sowie +der Möglichkeit, die letzte Cursorposition zu erfragen, kann per +appl_getinfo (Opcode 14) abgefragt werden. +
  +
Gruppe: Formulare +
  +
Querverweis: Binding   form_do +
  + +
+ +

8.11.12.1 Bindings für form_xdo

+ + + + + + + + + +
C: int16_t form_xdo ( OBJECT *tree, int16_t startob, int16_t +*lastcrsr, XDO_INF *tabs, void *flydial ); +
  +
Umsetzung: +
  +
int16_t form_xdo (OBJECT *tree, int16_t startob,
+                  int16_t *lastcrsr,
+                  XDO_INF *tabs, void *flydial)
+{
+   int_in[0]  = startob;
+   addr_in[0] = tree;
+   addr_in[1] = tabs;
+   addr_in[2] = flydial;
+
+   crys_if (50);
+
+   *lastcrsr = int_out[1];
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]50 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]2 # Einträge in int_out
control+6control[3]3 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]startob
addr_inaddr_in[0]tree
addr_in+4addr_in[1]tabs
addr_in+8addr_in[2]flydial
int_outint_out[0]Return-Wert
int_out+2int_out[1]lastcrsr
+
+ + +
+ +

8.11.13 form_xerr

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Form XError« - stellt eine Fehlerbox für TOS-Fehler dar. +
  +
AES-Nummer: 136 +
  +
Deklaration: int16_t form_xerr ( int32_t errcode, int8_t *errfile ); +
  +
Beschreibung: Gibt eine Fehlerbox auf dem Bildschirm aus, die die übergebene +Fehlernummer im Klartext beinhaltet. Im Gegensatz zu form_error +entfällt jedoch eine Umrechnung vom TOS in das MSDOS Format. +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
errcode normaler, negativer GEMDOS oder BIOS Fehlercode. Falls dieser +EBREAK (Programmabbruch per Control-C) oder E_OK (kein Fehler) ist, +wird keine Alertbox angezeigt. +
errfile Pfad einer Datei, in der der Fehler aufgetreten ist. Bei einem +Nullpointer wird der Parameter ignoriert; -1 bedeutet daß die Zeile +"Programm gab zurück:" der Meldung vorangestellt wird. + +
+ +
Ergebnis: Als Ergebnis wird die Nummer (1-3) der ausgewählten Option +zurückgegeben. Bei der jetzigen GEM-Version steht jedoch nur eine +Option zur Verfügung. +
  +
Verfügbar: Die Funktion steht nur unter MagiC (ab Version 2.0) zur +Verfügung. +
  +
Gruppe: Formulare +
  +
Querverweis: Binding   form_error +
  + +
+ +

8.11.13.1 Bindings für form_xerr

+ + + + + + + + + +
C: int16_t form_xerr ( int32_t errcode, int8_t *errfile ); +
  +
Umsetzung: +
  +
int16_t form_xerr (int32_t errcode, int8_t *errfile)
+{
+   int_in[0]  = errcode (High);
+   int_in[1]  = errcode (Low);
+   addr_in[0] = errfile;
+
+   return ( crys_if(136) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]136 # Opcode der Funktion
control+2control[1]2 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]errcode (High)
int_in+2int_in[1]errcode (Low)
addr_inaddr_in[0]errfile
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.11.14 xfrm_popup

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Form Popup« - verwaltet ein Popup-Menü +
  +
AES-Nummer: 135 +
  +
Deklaration: int16_t xfrm_popup( OBJECT *tree, int16_t x, int16_t y, int16_t +firstscrlob, int16_t lastscrlob, int16_t nlines, void cdecl +(*init)(OBJECT *tree, int16_t scrollpos, int16_t nlines, void *param), +void *param, int16_t *lastscrlpos ) +
  +
Beschreibung: Die Funktion stellt ein Popup-Menü auf dem Bildschirm dar, und +übernimmt dessen Verwaltung. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
tree Adresse des Objektbaumes +
x x-Koordinate +
y y-Koordinate, um die die Box zentriert werden soll. +
firstscrlob Objektnummer des ersten scrollenden Objekts +
lastscrlob Objektnummer des letzten scrollenden Objekts +
nlines Anzahl tatsächlich vorhandener Zeilen +
init Callback- Routine zum Umsetzen der Objekte. <tree>, +<param> und <nlines> sind die Parameter, die an xfrm_popup +übergeben wurden. <scrollpos> gibt die aktuelle Scrollposition +an. Sie liegt in: 0..(nlines-(lastscrlob-firstscrlob+1). Soll das +Popup nicht scrollen, muß init == NULL übergeben werden. +
param benutzerdefinierter Parameter +
lastscrlpos letzte Scrollposition + +
+ +
Hinweis: Falls die Parameter x und y den +Wert 0 besitzen, werden die entsprechenden Werte aus der +Objektstruktur beachtet, und das zentrieren entfällt. Es wird immer +dafür gesorgt, daß das Popup vollständig auf dem Bildschirm liegt. +
  +
Wählbare Objekte müssen das Flag SELECTABLE, nicht +wählbare Objekte den Status DISABLED erhalten. Das Objekt mit der +Nummer 0 im Objektbaum, sollte den Typ G_BOX oder G_IBOX besitzen. +
  + +
    +
  1. Der Objektbaum wird vor dem ersten Zeichnen automatisch durch +Aufruf der init()- Routine initialisiert. +
      +

  2. +
  3. Die Variable <scrollpos> braucht nicht initialisiert zu +werden, das System beginnt immer bei Scrollpos 0. +
      +

  4. +
  5. Die Init-Routine ist dafür verantwortlich, das erste/und/oder +letzte Scrollobjekt mit einem Pfeil zu initialisieren. +
      +

  6. +
  7. Die scrollenden Objekte sind <firstscrlob> .. +<lastscrlob>. Die Objektnummern müssen direkt +aufeinanderfolgen. Die Objekte müssen untereinander liegen und alle +dieselbe Größe haben. +
      +

  8. +
+ +
Ergebnis: Die Funktion liefert die Nummer des gewählten Objektes aus dem +Popup-Menü oder den Wert -1. +
  +
Verfügbar: Die Funktion steht ab MagiC 5.03 zur Verfügung. +
  +
Gruppe: Formulare +
  +
Querverweis: Binding   OBJECT   form_popup +
  + +
+ +

8.11.14.1 Bindings für xfrm_popup

+ + + + + + + + + +
C: int16_t xfrm_popup( OBJECT *tree, int16_t x, int16_t y, int16_t +firstscrlob, int16_t lastscrlob, int16_t nlines, void cdecl +(*init)(OBJECT *tree, int16_t scrollpos, int16_t nlines, void *param), +void *param, int16_t *lastscrlpos ) +
  +
Umsetzung: +
  +
int16_t xfrm_popup( OBJECT *tree, int16_t x, int16_t y,
+                    int16_t firstscrlob, int16_t lastscrlob,
+                    int16_t nlines,
+                    void  cdecl (*init)(OBJECT *tree,
+                    int16_t scrollpos,
+                    int16_t nlines, void *param),
+                    void *param, int16_t *lastscrlpos )
+{
+   int_in[0]  = x;
+   int_in[1]  = y;
+   int_in[2]  = firstscrlob;
+   int_in[3]  = lastscrlob;
+   int_in[4]  = nlines;
+   int_in[5]  = *lastscrlpos;
+   addr_in[0] = tree;
+   addr_in[1] = init;
+   addr_in[2] = param;
+
+   int_out[1] = *lastscrlpos;   /* vorbesetzen */
+
+   crys_if(135)
+
+   *lastscrlpos = int_out[1];
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]135 # Opcode der Funktion
control+2control[1]6 # Einträge in int_in
control+4control[2]2 # Einträge in int_out
control+6control[3]3 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]x
int_in+2int_in[1]y
int_in+4int_in[2]firstscrlob
int_in+6int_in[3]lastscrlob
int_in+8int_in[4]nlines
int_in+10int_in[5]lastscrlpos
addr_inaddr_in[0]tree
addr_in+4addr_in[1]init
addr_in+8addr_in[2]param
int_outint_out[0]Return-Wert
int_out+2int_out[1]lastscrlpos
+
+ + +
+ +

8.11.15 x_form_center

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Form centered Object« - zentriert ein Objekt auf dem +Bildschirm. +
  +
AES-Nummer: 28944 +
  +
Deklaration: int16_t x_form_center( OBJECT *tree, int16_t *cx, int16_t *cy, +int16_t *cw, int16_t *ch ); +
  +
Beschreibung: Center a dialog on the screen, taking into account all object +attributes that can affect the outer border. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
treeObject tree being modified
cxX-coordinate of the outer rectangle
cyY-coordinate of the outer rectangle
cwWidth of the outer rectangle
chHeight of the outer rectangle
+
+ +
This function is essentially identical in purpose to the AES +form_center call, however it takes all attributes which can affect the +size of the outer border of the object tree (SHADOWED, OUTLINED, 3D +effect, etc.) into consideration. The returned rectangle describes the +entire area containing these effects. +
  +
Ergebnis: Als Ergebnis wird immer eine 1 zurückgegeben. +
  +
Verfügbar: Die Funktion steht nur unter Geneva zur Verfügung. +
  +
Gruppe: Formulare +
  +
Querverweis: Binding   form_center +
  + +
+ +

8.11.15.1 Bindings für x_form_center

+ + + + + + + + + +
C: int16_t x_form_center( OBJECT *tree, int16_t *cx, int16_t *cy, +int16_t *cw, int16_t *ch ); +
  +
Umsetzung: +
  +
int16_t x_form_center( OBJECT *tree, int16_t *cx, int16_t *cy,
+                       int16_t *cw, int16_t *ch )
+{
+   addr_in[0] = tree;
+
+   crys_if(28944);
+
+   *cx = int_out[1];
+   *cy = int_out[2];
+   *cw = int_out[3];
+   *ch = int_out[4];
+
+   return (int_out[0]);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]28944 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]5 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]tree
int_outint_out[0]Return-Wert
int_out+2int_out[1]cx
int_out+4int_out[2]cy
int_out+6int_out[3]cw
int_out+8int_out[4]ch
+
+ + +
+ +

8.11.16 x_form_error

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »XForm error« - stellt eine Fehlerbox für TOS-Fehler da +(Geneva). +
  +
AES-Nummer: 28945 +
  +
Deklaration: int16_t x_form_error ( uint8_t *fmt, int16_t errnum ); +
  +
Beschreibung: This function takes the error code specified by errnum +and finds an appropriate error message string. It then inserts this +text into a program-defined alert string and displays an alert. +
  +
The fmt should be in standard form_alert format, with a +"%s" to indicate the location where the error message should +be inserted. Since an alert can contain no more than five lines of 30 +characters each, and the pre-defined error messages can take up to +three lines, there should be no more than two lines of text +surrounding the inserted error text. +
  +
Example: +
  +
if( x_form_error( "[1][Error!|%s][Continue|Quit]", -33 ) == 1 )
+  continue...
+else quit...
+
+
Ergebnis: Als Ergebnis wird die Nummer (1-3) der ausgewählten Option +zurückgegeben. +
  +
Verfügbar: Die Funktion steht nur unter Geneva zur Verfügung. +
  +
Gruppe: Formulare +
  +
Querverweis: Binding   form_error   form_xerr   form_error in N.AES +
  + +
+ +

8.11.16.1 Bindings für x_form_error

+ + + + + + + + + +
C: int16_t x_form_error ( uint8_t *fmt, int16_t errnum ); +
  +
Umsetzung: +
  +
int16_t x_form_error ( uint8_t *fmt, int16_t errnum )
+{
+   int_in[0] = errnum;
+
+   addr_in[0] = fmt;
+
+   return ( crys_if(28945) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]28945 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]enum
addr_inaddr_in[0]fmt
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.11.17 x_form_filename

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »XForm filename« - Convert to/from a standard GEMDOS filename +in editable field in a dialog. +
  +
AES-Nummer: 28996 +
  +
Deklaration: int16_t x_form_filename( OBJECT *tree, int16_t obj, int16_t +to_from, uint8_t *string ); +
  +
Beschreibung: +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
tree Object tree of the dialog containing the editable field +
obj Index of the editable object in the tree +
to_from Convert to (0) or from (1) the field +
string Pointer to the string containing the GEMDOS-formatted +(FILENAME.EXT) string. + +
+ +
Since filenames are typically entered in a GEM dialog using the +period to separate the filename from the extension, and filenames with +less than eight characters before the period are padded with spaces, +converting to and from the editable field can be a difficult task. +
  +
When the mode parameter passed to x_form_filename is 0, the +string is converted from the FILENAME.EXT format to the editable field +format. When mode is 1, the filename is converted from the editable +field and written into string in FILENAME.EXT format. Note that this +function assumes that the editable field is an object of type G_FTEXT +or G_FBOXTEXT and uses the te_ptmplt string "________.___". +
  +
Example: +
  +
OBJECT *tree;
+char name[13] = "DEFAULT.TXT";
+
+x_form_filename( tree, object, 0, name );
+form_do( tree, object );
+x_form_filename( tree, object, 1, name );
+/* "name" now contains what the user changed it to */
+
+
Ergebnis: Liefert immer 1. +
  +
Verfügbar: Die Funktion steht nur unter Geneva zur Verfügung. +
  +
Gruppe: Formulare +
  +
Querverweis: Binding +
  + +
+ +

8.11.17.1 Bindings für x_form_filename

+ + + + + + + + + +
C: int16_t x_form_filename( OBJECT *tree, int16_t obj, int16_t +to_from, uint8_t *string ); +
  +
Umsetzung: +
  +
int16_t x_form_filename( OBJECT *tree, int16_t obj,
+                         int16_t to_from, uint8_t *string )
+{
+   int_in[0] = obj;
+   int_in[1] = to_from;
+
+   addr_in[0] = tree;
+   addr_in[1] = string;
+
+   return ( crys_if(28996) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]28996 # Opcode der Funktion
control+2control[1]2 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]obj
int_in+2int_in[1]to_from
addr_inaddr_in[0]tree
addr_in+4addr_in[1]string
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.11.18 x_form_mouse

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »XForm mouse« - Handle mouse clicks in a dialog, including +editable cursor movement. +
  +
AES-Nummer: 28997 +
  +
Deklaration: int16_t x_form_mouse( OBJECT *tree, int16_t mouse_x, int16_t +mouse_y, int16_t clicks, int16_t *edit_obj, int16_t *next_obj, int16_t +*edit_idx ); +
  +
Beschreibung: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
tree Object tree of the dialog +
mouse_x X coordinate of the mouse pointer +
mouse_y Y coordinate of the mouse pointer +
clicks Number of clicks to be processed +
edit_obj Object currently having the edit cursor +
next_obj Object selected with the mouse +
edit_idx Position of edit cursor within field + +
+ +
This function begins by calling form_button. If neither an EXIT +nor a TOUCHEXIT button is selected, and the object is EDITABLE, then +the editable cursor is moved to the character within the editable +field which is under the mouse pointer. +
  +
Ergebnis: 0 = Ein Objekt wurde selektiert +
1 = Kein Objekt angewählt. +
  + + + + + + + + + + + + +
Parameter Bedeutung +
edit_obj New object having the edit cursor +
next_obj Selected object, or 0 for none +
edit_idx New edit cursor position + +
+ +
Verfügbar: Die Funktion steht nur unter Geneva zur Verfügung. +
  +
Gruppe: Formulare +
  +
Querverweis: Binding +
  + +
+ +

8.11.18.1 Bindings für x_form_mouse

+ + + + + + + + + +
C: int16_t x_form_mouse( OBJECT *tree, int16_t mouse_x, int16_t +mouse_y, int16_t clicks, int16_t *edit_obj, int16_t *next_obj, int16_t +*edit_idx ); +
  +
Umsetzung: +
  +
int16_t x_form_mouse( OBJECT *tree, int16_t mouse_x, int16_t
+mouse_y, int16_t clicks, int16_t *edit_obj, int16_t *next_obj,
+int16_t *edit_idx )
+{
+   int_in[0] = mouse_x;
+   int_in[1] = mouse_y;
+   int_in[2] = clicks;
+   int_in[3] = edit_obj;
+   int_in[4] = next_obj;
+   int_in[5] = edit_idx;
+
+   addr_in[0] = tree;
+
+   crys_if(28997);
+
+   *edit_obj = int_out[1];
+   *next_obj = int_out[2];
+   *edit_idx = int_out[3];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]28997 # Opcode der Funktion
control+2control[1]6 # Einträge in int_in
control+4control[2]4 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]mouse_x
int_in+2int_in[1]mouse_y
int_in+4int_in[2]clicks
int_in+6int_in[3]edit_obj
int_in+8int_in[4]next_obj
int_in+10int_in[5]edit_idx
int_outint_out[0]Return-Wert
int_out+2int_out[1]edit_obj
int_out+4int_out[2]next_obj
int_out+6int_out[3]edit_idx
+
+ + +
+ +
+ +Home +AESAES +FileselektorenFileselektoren +Geneva FunktionenGeneva Funktionen + + diff --git a/de/fsel.html b/de/fsel.html new file mode 100644 index 000000000..e79c0b44c --- /dev/null +++ b/de/fsel.html @@ -0,0 +1,924 @@ + + + + + +Die Anleitung zum TOS: Dateiauswahl + + + + + + + + + +Home +AESAES +ApplikationsfunktionenApplikationsfunktionen +DruckdialogeDruckdialoge + +
+ +

8.4 Dateiauswahl

+

Die Funktionen dieser Bibliothek stellen eine Dateiauswahl zur +Verfügung, mit deren Hilfe sich Dateien laden bzw. abspeichern +lassen. Für diesen Zweck sind die folgenden Routinen vorhanden: +

+ + + + + + + + + + + + +
fsel_boxinput Dateinamen per File-Selektor auswählen (Boxkite) +
fsel_exinput Dateinamen per File-Selektor auswählen +
fsel_input Dateinamen per File-Selektor auswählen +
x_fsel_input Dateinamen per File-Selektor auswählen (Geneva) + +
+ +

Hinweis: Leider werden alternative Dateisysteme +(Stichwort: lange Dateinamen) nicht unterstützt; ab MagiC 4 wird dies +jedoch von den Funktionen der FSLX-Library übernommen. +

+

Querverweis: Fileselektoren   Style-Guidelines +

+

8.4.1 fsel_boxinput

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »File Selection Extended Input« - selektiert Dateinamen. +
  +
AES-Nummer: 91 +
  +
Deklaration: int16_t fsel_boxinput ( int16_t *global, int8_t *fs_einpath, +int8_t *fs_einsel, int16_t *fs_eexbutton, int8_t *elabel, +FSEL_CALLBACK callback ); +
  +
Beschreibung: Die Funktion stellt eine Dateiauswahlbox zur Verfügung, der +auch ein Titel-String übergeben werden kann. Es handelt sich hierbei um +eine erweiterte Version der Dateiauswahl BoxKite. +
  +
Der Funktion werden folgende Parameter übergeben: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
fs_einpath Name des Default-Zugriffspfades (absolut) mit angehängter +Suchmaske. Enthält nach dem Aufruf den neuen Pfadnamen. +
fs_einsel Name der Default-Datei. Enthält nach dem Aufruf den neuen +Dateinamen. +
fs_eexbutton +
+
+ + + + + + + + + + +
0=es wurde Abbruch gewählt
1=es wurde Ok gewählt
+
+ +
fs_elabel Titelzeile +
callback Adresse einer Funktion, welche von BoxKite aufgerufen wird +falls eine GEM-Message an die Hauptapplikation übergeben werden soll. +
Es handelt sich dabei nicht nur um die Message WM_REDRAW. Sondern +z.B. auch um WM_MOVED, da es immerhin Betriebssystemversionen gibt, +die das Verschieben von hintenliegenden Fenstern ermöglichen. Messages, +die implizit neue Fenster öffnen oder vorhandene nach oben bringen, +sollten dagegen ignoriert oder aufgehoben und erst nach der Rückkehr +aus dem Fileselector behandelt werden. WM_TOPPED-Messages werden nicht +an den Message-Callback durchgereicht. + +
+ +
Hinweis: BoxKite stellt ab Version 2.00 auch die +Funktionen der MagiC 4 Dateiauswahl zur Verfügung. Das Vorhandensein dieser +Funktionen kann per appl_getinfo (Opcode 7) festgestellt werden. +
  +
Ergebnis: Der Rückgabewert der Funktion (0 = Fehler) sollte unbedingt +beachtet werden, da z.B. bei Speichermangel kein Fileselektor mehr +benutzt werden kann. +
  +
Verfügbar: Wenn der BoxKite ab Version 1.71 installiert ist. Dazu kann der +Cookie HBFS auf des vorhandensein geprüft werden. Allerdings ist +dieser auch schon vor der Version 1.71 vorhanden. +
  +
Gruppe: Dateiauswahl +
  +
Querverweis: Binding   XFS-Konzept in MagiC +
  + +
+ +

8.4.1.1 Bindings für fsel_boxinput

+ + + + + + + + + +
C: +
  + +
/* Prototyp des Message-Handlers. */ +
typedef void cdecl (* FSEL_CALLBACK)(int16_t *msg); +
  +
int16_t fsel_boxinput ( int16_t *global, int8_t *fs_einpath, +int8_t *fs_einsel, int16_t *fs_eexbutton, int8_t *elabel, +FSEL_CALLBACK callback ); +
  +
Umsetzung: +
  +
int16_t fsel_boxinput ( int16_t *global, int8_t *fs_einpath,
+                        int8_t *fs_einsel,
+                        int16_t *fs_eexbutton,
+                        int8_t *elabel,
+                        FSEL_CALLBACK callback )
+{
+  void *aespb[6], *addrin[6], *addrout[6];
+  int contrl[5], intin[16], intout[7];
+
+  aespb[0] = contrl;
+  aespb[1] = global;
+  aespb[2] = intin;
+  aespb[3] = intout;
+  aespb[4] = addrin;
+  aespb[5] = addrout;
+
+  contrl[0] = 91;
+  contrl[1] = 0;
+  contrl[2] = 2;
+  contrl[3] = 4;
+  contrl[4] = 0;
+
+   addr_in[0] = fs_einpath;
+   addr_in[1] = fs_einsel;
+   addr_in[2] = elabel;
+   addr_in[3] = callback;
+
+  _crystal((AESPB *)aespb);
+
+   *fs_eexbutton = int_out[1];
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]91 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]2 # Einträge in int_out
control+6control[3]4 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]fs_einpath
addr_in+4addr_in[1]fs_einsel
addr_in+8addr_in[2]elabel
addr_in+12addr_in[3]callback
int_outint_out[0]Return-Wert
int_out+2int_out[1]fs_eexbutton
+
+ + +
+ +

Achtung BoxKite benötigt Informationen aus dem +'global'-Array der Hauptapplikation. Die mitgelieferten GEM-Bindings +von Entwicklungssystemen übergeben dieses normalerweise automatisch. +

+

8.4.2 fsel_exinput

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »File Selection Extended Input« - selektiert Dateinamen. +
  +
AES-Nummer: 91 +
  +
Deklaration: int16_t fsel_exinput ( int8_t *fs_einpath, int8_t *fs_einsel, +int16_t *fs_eexbutton, int8_t *elabel ); +
  +
Beschreibung: Die Funktion stellt eine Dateiauswahlbox zur Verfügung, der +auch ein Titel-String übergeben werden kann. +
  +

+
Der Funktion werden folgende Parameter übergeben: +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
fs_einpath Name des Default-Zugriffspfades (absolut) mit angehängter +Suchmaske. Enthält nach dem Aufruf den neuen Pfadnamen. +
fs_einsel Name der Default-Datei. Enthält nach dem Aufruf den neuen +Dateinamen. +
fs_eexbutton +
+
+ + + + + + + + + + +
0=es wurde Abbruch gewählt
1=es wurde Ok gewählt
+
+ +
fs_elabel Titelzeile + +
+ +
Hinweis: Die Funktion sollte mit wind_update (BEG_MCTRL +bzw. END_MCTRL) geschachtelt werden, um zu verhindern, daß +Doppelklicks an darunter liegende Fenster weitergereicht werden. +
  +
Ergebnis: Der Rückgabewert der Funktion (0 = Fehler) sollte unbedingt +beachtet werden, da z.B. bei Speichermangel kein Fileselektor mehr +benutzt werden kann. +
  +
Verfügbar: Diese Funktion ist erst ab AES 1.4 verfügbar. +
  +
This is also present in FreeGEM. To check for this feature, use +appl_init and check that xbuf.arch is nonzero. +
  +
Gruppe: Dateiauswahl +
  +
Querverweis: Binding   fsel_input   XFS-Konzept in MagiC +
  + +
+ +

8.4.2.1 Bindings für fsel_exinput

+ + + + + + + + + +
C: int16_t fsel_exinput ( int8_t *fs_einpath, int8_t *fs_einsel, +int16_t *fs_eexbutton, int8_t *elabel ); +
  +
Umsetzung: +
  +
int16_t fsel_exinput (int8_t *fs_einpath, int8_t *fs_einsel,
+                      int16_t *fs_eexbutton, int8_t *elabel)
+{
+   addr_in[0] = fs_einpath;
+   addr_in[1] = fs_einsel;
+   addr_in[2] = elabel;
+
+   crys_if (91);
+
+   *fs_eexbutton = int_out[1];
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]91 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]2 # Einträge in int_out
control+6control[3]3 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]fs_einpath
addr_in+4addr_in[1]fs_einsel
addr_in+8addr_in[2]elabel
int_outint_out[0]Return-Wert
int_out+2int_out[1]fs_eexbutton
+
+ + +
+ +

8.4.3 fsel_input

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »File Selection Input« - selektiert Dateinamen. +
  +
AES-Nummer: 90 +
  +
Deklaration: int16_t fsel_input ( int8_t *fs_iinpath, int8_t *fs_iinsel, +int16_t *fs_iexbutton ); +
  +
Beschreibung: Die Funktion stellt eine Dateiauswahlbox zur Verfügung. Es +gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
fs_iinpath Name des Default-Zugriffspfades (absolut) mit angehängter +Suchmaske. Enthält nach dem Aufruf den neuen Pfadnamen. +
fs_iinsel Name der Default-Datei. Enthält nach dem Aufruf den neuen +Dateinamen. +
fs_iexbutton +
+
+ + + + + + + + + + +
0=es wurde Abbruch gewählt
1=es wurde Ok gewählt
+
+ + +
+ +
Hinweis: Die Funktion sollte mit wind_update (BEG_MCTRL +bzw. END_MCTRL) geschachtelt werden, um zu verhindern, daß +Doppelklicks an darunter liegende Fenster weitergereicht werden. +
  +
In AES-Versionen kleiner als 1.4 können übrigens nur +maximal 100 Dateien angezeigt werden; dort wird dann mit einem +'Ping'-Geräusch gewarnt, wenn nicht alle Dateien angezeigt werden +konnten. +
  +
Ergebnis: Der Rückgabewert der Funktion (0 = Fehler) sollte unbedingt +beachtet werden, da z.B. bei Speichermangel kein Fileselektor mehr +benutzt werden kann. +
  +
Verfügbar: All AES versions, not present in ViewMAX/3, and will crash +ViewMAX/2. +
  +
Gruppe: Dateiauswahl +
  +
Querverweis: Binding   fsel_exinput   XFS-Konzept in MagiC +
  + +
+ +

8.4.3.1 Bindings für fsel_input

+ + + + + + + + + +
C: int16_t fsel_input ( int8_t *fs_iinpath, int8_t *fs_iinsel, +int16_t *fs_iexbutton ); +
  +
Umsetzung: +
  +
int16_t fsel_input (int8_t *fs_iinpath, int8_t *fs_iinsel,
+                    int16_t *fs_iexbutton)
+{
+   addr_in[0] = fs_iinpath;
+   addr_in[1] = fs_iinsel;
+
+   crys_if (90);
+
+   *fs_iexbutton = int_out[1];
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]90 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]2 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]fs_iinpath
addr_in+4addr_in[1]fs_iinsel
int_outint_out[0]Return-Wert
int_out+2int_out[1]fs_iexbutton
+
+ + +
+ +

8.4.4 x_fsel_input

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Extended file selector« +
  +
AES-Nummer: 28960 +
  +
Deklaration: int16_t x_fsel_input( int8_t *inpath, int16_t pathlen, int8_t +*files, int16_t sels, int16_t *exbutton, int8_t *label ); +
  +
Beschreibung: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
inpath Pointer to the path (with wildcards) to start selection at +
pathlen Maximum length (incl. null) of inpath +
files Pointer to the string containing the default filename to be +displayed. Also, holds up to "sels" filenames (each +null-terminated) upon return. +
sels Maximum number of items that can be selected upon return from +the call +
exbutton Exit Button: +
+
+ + + + + + + + + + +
0=es wurde Abbruch gewählt
1=es wurde Ok gewählt
+
+ +
label A label of up to 30 characters, which will appear at the top of +the item selector. + +
+ +
This function is similar to fsel_exinput, but has several +extensions: +
  +
    +
  • The inpath parameter can contain not only the +traditional * and ? wildcards, but can also contain regular +expressions using [] and {}: +
      +
    • Any characters contained between square brackets +("[]") define a list of acceptable characters to substitute +into that one position. This can either be individual characters, like +"[ABCD]", a range separated by a hyphen like +"[A-D]", or a mix of the two, like "[A-DXYZ]". +
    • +
    • A list of words contained within curly brackets +("{}") defines one or more acceptable values. The values +must be separated by commas. +
    • +
    + +
  • +
  • The pathlen parameter defines the maximum length of +inpath. If the user adds too many extensions or the path otherwise +grows too long, an error alert will appear. +
  • +
  • Upon successful return, files can contain up to sels filenames. +Each name in the list is followed by a NULL character (ASCII 0) and +the last filename is followed by a final NULL. The exception to this +rule is when sels is one, in which case the final NULL is not used; +For all other cases, the area pointed to by files must be at least (13 +* sels)+1 bytes long. +
  • +
+ +
Ergebnis: 0 = Ein Fehler ist aufgetreten. +
  +
Verfügbar: Die Funktion steht nur unter Geneva zur Verfügung. +
  +
Gruppe: Dateiauswahl +
  +
Querverweis: Binding +
  + +
+ +

8.4.4.1 Bindings für x_fsel_input

+ + + + + + + + + +
C: int16_t x_fsel_input( int8_t *inpath, int16_t pathlen, int8_t +*files, int16_t sels, int16_t *exbutton, int8_t *label ); +
  +
Umsetzung: +
  +
int16_t x_fsel_input( int8_t *inpath, int16_t pathlen, int8_t
+*files, int16_t sels, int16_t *exbutton, int8_t *label )
+{
+   int_in[0] = pathlen;
+   int_in[1] = sels;
+
+   addr_in[0] = inpath;
+   addr_in[1] = files;
+   addr_in[2] = label;
+
+   crys_if(28960);
+
+   *exbutton = int_out[1];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]28960 # Opcode der Funktion
control+2control[1]2 # Einträge in int_in
control+4control[2]2 # Einträge in int_out
control+6control[3]3 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]pathlen
int_in+2int_in[1]sels
addr_inaddr_in[0]inpath
addr_in+4addr_in[1]files
addr_in+8addr_in[2]label
int_outint_out[0]Return-Wert
int_out+2int_out[1]exbutton
+
+ + +
+ +
+ +Home +AESAES +ApplikationsfunktionenApplikationsfunktionen +DruckdialogeDruckdialoge + + diff --git a/de/fslx.html b/de/fslx.html new file mode 100644 index 000000000..40948271a --- /dev/null +++ b/de/fslx.html @@ -0,0 +1,1600 @@ + + + + + +Die Anleitung zum TOS: Fileselektoren + + + + + + + + + +Home +AESAES +FensterverwaltungFensterverwaltung +FormularfunktionenFormularfunktionen + +
+ +

8.10 Fileselektoren

+

Die folgenden Funktionen wurden mit MagiC 4 eingeführt, und +ermöglichen die Verwaltung der Dateiauswahl (Fileselektor): +

+ + + + + + + + + + + + + + + + + + +
fslx_close Auswahl schließen und Speicher freigeben. +
fslx_do Schneller Aufruf des Fileselektors. +
fslx_evnt Auswahl zur Benutzung freigeben. +
fslx_getnxtfile Alle weiteren selekt. Einträge ermitteln. +
fslx_open Auswahl initialisieren und öffnen. +
fslx_set_flags Setzt bestimmte Flags für das ganze System. + +
+ +

Hinweis: Die Existenz dieser Funktionen kann per appl_getinfo +(Opcode 7) festgestellt werden. +

+

Der Hauptvorteil bei der Verwendung dieser Routinen ist darin zu +sehen, daß die hier angegebenen Funktionen auch mit alternativen +Dateisystemen (Stichwort: lange Dateinamen) zurechtkommen. +

+

Querverweis: +
Fileselektor als Dialog   Fileselektor im Fenster   Bedienung der Dateiauswahl +

+

8.10.1 fslx_close

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »File SelectionX Close« - Auswahl schließen und Speicher +freigeben. +
  +
AES-Nummer: 191 +
  +
Deklaration: int16_t fslx_close ( void *fsd ); +
  +
Beschreibung: Die Funktion schließt die Dateiauswahl, und gibt den angegebenen +Deskriptor wieder frei. Es gilt: +
  + + + + + + + + + +
Parameter Bedeutung +
    +
fsd Deskriptor, der beim erfolgreichen Öffnen eines +Dateiauswahlfensters übergeben wurde + +
+ +
Ergebnis: Die Funktion liefert bei fehlerfreier Ausführung den Wert 1 +zurück, anderenfalls den Wert 0. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Fileselektoren +
  +
Querverweis: Binding   fslx_open +
  + +
+ +

8.10.1.1 Bindings für fslx_close

+ + + + + + + + + +
C: int16_t fslx_close ( void *fsd ); +
  +
Umsetzung: +
  +
int16_t fslx_close ( void *fsd )
+{
+   addr_in[0] = fsd;
+   crys_if (191);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]191 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]fsd
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.10.2 fslx_do

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »File SelectionX Do« - schneller Aufruf des Fileselektors. +
  +
AES-Nummer: 194 +
  +
Deklaration: void *fslx_do ( int8_t *title, int8_t *path, int16_t pathlen, +int8_t *fname, int16_t fnamelen, int8_t *patterns, XFSL_FILTER +*filter, int8_t *paths, int16_t *sort_mode, int16_t flags, int16_t +*button, int16_t *nfiles, int8_t **pattern ); +
  +
Beschreibung: Die Funktion stellt eine Dateiauswahlbox auf dem Bildschirm +dar, und übernimmt deren Bearbeitung. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
title Titel der Auswahl oder NULL +
path vollständiger Pfad, welcher mit dem Laufwerk beginnt, und mit +'\' endet. +
pathlen Länge des aufnehmenden Pfad-Puffers. +
fname Puffer für den Dateinamen. +
fnamelen Länge des aufnehmenden Dateinamen-Puffers. +
patterns Dateinamensmuster wie "*.TXT", "*.PRG" oder +"*.IMG". Diese alternativ anwählbaren Muster sind durch EOS +getrennt und durch EOS, EOS abgeschlossen. +
filter Filterfunktion, die vor dem Mustervergleich aufgerufen +wird (oder NULL). Gibt diese den Wert 0 zurück, so ist die Datei +ungültig; bei einem Wert von 1 wird der Dateiname angezeigt. +
paths Pfad-History. Die alternativ anwählbaren Pfade sind durch EOS +getrennt, und durch EOS, EOS abgeschlossen. +
sort_mode Sortiermodus für die Anzeige +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
0=nach Namen
1=nach Datum
2=nach Größe
3=nach Typ
4=unsortiert (physik. Reihenfolge)
+
+ +
flags verschiedene Einstellungen + + + + + + + + + +
1 = DOSMODE. Dies ist der Kompatibilitätsmodus, der auch von +fsel_(ex)input verwendet wird, und Dateinamen grundsätzlich im Format +8+3 liefert. Dazu werden alle Unterverzeichnisse per Dopendir (name, +1) aufgerufen. +
2 = symbolische Links nicht verfolgen. In diesem Fall +gehören also Datum, Uhrzeit sowie die XATTR-Struktur, die filter +übergeben wird, zum Link selbst. +
8 = Mehrfachauswahl. In diesem Fall können mehrere Dateien auf +einmal ausgewählt und übergeben werden. + +
+ +
button Nummer des ausgewählten Buttons +
+
+ + + + + + + + + + +
0=Abbruch-Button
1=Ok-Button
+
+ +
nfiles Anzahl der ausgewählten Dateien +
pattern ausgewähltes Dateinamensmuster wie "*.TXT" + +
+ +
Hinweis: Die Funktion ist eine Kombination aus fslx_open +und fslx_evnt, benutzt aber eine Dialogbox ohne Fenster. +
  +
Ergebnis: Die Funktion liefert einen Zeiger auf einen Deskriptor zurück, +der bei den anderen Routinen anzugeben ist. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Fileselektoren +
  +
Querverweis: Binding   fslx_open   fslx_evnt +
  + +
+ +

8.10.2.1 Bindings für fslx_do

+ + + + + + + + + +
C: void *fslx_do ( int8_t *title, int8_t *path, int16_t pathlen, +int8_t *fname, int16_t fnamelen, int8_t *patterns, XFSL_FILTER +*filter, int8_t *paths, int16_t *sort_mode, int16_t flags, int16_t +*button, int16_t *nfiles, int8_t **pattern ); +
  +
Umsetzung: +
  +
void *fslx_do ( int8_t *title, int8_t *path, int16_t pathlen,
+                int8_t *fname, int16_t fnamelen,
+                int8_t *patterns,
+                XFSL_FILTER *filter, int8_t *paths,
+                int16_t *sort_mode, int16_t flags,
+                int16_t *button,
+                int16_t *nfiles, int8_t **pattern )
+{
+   addr_in[0] = title;
+   addr_in[1] = path;
+   addr_in[2] = fname;
+   addr_in[3] = patterns;
+   addr_in[4] = filter;
+   addr_in[5] = paths;
+
+   int_in[0] = pathlen;
+   int_in[1] = fnamelen;
+   int_in[2] = *sort_mode;
+   int_in[3] = flags;
+
+   crys_if (194);
+
+   *button    = int_out[1];
+   *nfiles    = int_out[2];
+   *sort_mode = int_out[3];
+   *pattern   = addr_out[1];
+
+   return ( (void *) addr_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]194 # Opcode der Funktion
control+2control[1]4 # Einträge in int_in
control+4control[2]4 # Einträge in int_out
control+6control[3]6 # Einträge in addr_in
control+8control[4]2 # Einträge in addr_out
addr_inaddr_in[0]title
addr_in+4addr_in[1]path
addr_in+8addr_in[2]fname
addr_in+12addr_in[3]patterns
addr_in+16addr_in[4]filter
addr_in+20addr_in[5]paths
int_inint_in[0]pathlen
int_in+2int_in[1]fnamelen
int_in+4int_in[2]sort_mode
int_in+6int_in[3]flags
addr_outaddr_out[0]Return-Wert
addr_out+4addr_out[1]pattern
int_outint_out[0]1
int_out+2int_out[1]button
int_out+4int_out[2]nfiles
int_out+6int_out[3]sort_mode
+
+ + +
+ +

8.10.3 fslx_evnt

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »File SelectionX Event« - übernimmt die Bearbeitung der +Dateiauswahl. +
  +
AES-Nummer: 193 +
  +
Deklaration: int16_t fslx_evnt ( void *fsd, EVNT *events, int8_t *path, +int8_t *fname, int16_t *button, int16_t *nfiles, int16_t *sort_mode, +int8_t **pattern ); +
  +
Beschreibung: Die Funktion übernimmt die Bearbeitung einer auf dem +Bildschirm dargestellten Dateiauswahl. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
fsd Deskriptor, der beim Öffnen der Auswahl zurückgeliefert +wurde. +
events EVNT-Struktur. Die Ereignisse werden von der Auswahl +bearbeitet, wenn sie für das entsprechende Fenster bestimmt sind. +
path Zeiger auf den ausgewählten Pfad. +
fname Zeiger auf den ausgewählten Dateipfad. +
button Nummer des ausgewählten Buttons +
+
+ + + + + + + + + + +
0=Abbruch-Button
1=Ok-Button
+
+ +
nfiles Anzahl der ausgewählten Dateien. +
sort_mode ausgewählter Sortiermodus. +
pattern ausgewähltes Dateinamensmuster wie "*.TXT" + +
+ +
Hinweis: Ereignisse werden zunächst an die Dateiauswahl +übermittelt, und von dieser dann ggfs. verarbeitet. Sobald ein +Ereignis bearbeitet wurde, wird das entsprechende Bit in der +EVNT-Struktur gelöscht. +
  +
Ergebnis: Die Funktion liefert den Wert 0, wenn der Dialog beendet werden +soll und anderenfalls den Wert 1. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Fileselektoren +
  +
Querverweis: Binding +
  + +
+ +

8.10.3.1 Bindings für fslx_evnt

+ + + + + + + + + +
C: int16_t fslx_evnt ( void *fsd, EVNT *events, int8_t *path, +int8_t *fname, int16_t *button, int16_t *nfiles, int16_t *sort_mode, +int8_t **pattern ); +
  +
Umsetzung: +
  +
int16_t fslx_evnt ( void *fsd, EVNT *events, int8_t *path,
+                    int8_t *fname, int16_t *button,
+                    int16_t *nfiles,
+                    int16_t *sort_mode, int8_t **pattern )
+{
+   addr_in[0] = fsd;
+   addr_in[1] = events;
+   addr_in[2] = path;
+   addr_in[3] = fname;
+
+   crys_if (193);
+
+   *button    = int_out[1];
+   *nfiles    = int_out[2];
+   *sort_mode = int_out[3];
+   *pattern   = addr_out[0];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]193 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]4 # Einträge in int_out
control+6control[3]4 # Einträge in addr_in
control+8control[4]1 # Einträge in addr_out
addr_inaddr_in[0]fsd
addr_in+4addr_in[1]events
addr_in+8addr_in[2]path
addr_in+12addr_in[3]fname
addr_outaddr_out[0]pattern
int_outint_out[0]Return-Wert
int_out+2int_out[1]button
int_out+4int_out[2]nfiles
int_out+6int_out[3]sort_mode
+
+ + +
+ +

8.10.4 fslx_getnxtfile

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »File SelectionX GetNextFile« - ermittelt alle weiteren +selektierten Einträge der Dateiauswahl. +
  +
AES-Nummer: 192 +
  +
Deklaration: int16_t fslx_getnxtfile ( void *fsd, int8_t *fname ); +
  +
Beschreibung: Die Funktion ermittelt alle weiteren, selektierten Einträge +der Dateiauswahl. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
fsd Deskriptor, der beim Öffnen der Auswahl zurückgeliefert wurde +
fname Name des ermittelten Eintrags + +
+ +
Hinweis: Wurde das Flag GETMULTI bei fslx_do oder +fslx_open übergeben, wird durch fslx_do bzw. fslx_evnt im Parameter +nfiles die Anzahl der Dateien zurückgegeben, die zusätzlich +zu dem in fname zurückgegebenen noch selektiert sind. Man +kann die weiteren Dateien mit fslx_getnxtfile abrufen. Erst danach +darf man fslx_close aufrufen. +
  +
Ergebnis: Die Funktion liefert den Wert 0, wenn keine weitere Datei +ausgewählt ist, bzw. den Wert 1, falls noch ein Dateiname kopiert +wurde. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Fileselektoren +
  +
Querverweis: Binding   fslx_open   fslx_close +
  + +
+ +

8.10.4.1 Bindings für fslx_getnxtfile

+ + + + + + + + + +
C: int16_t fslx_getnxtfile ( void *fsd, int8_t *fname ); +
  +
Umsetzung: +
  +
int16_t fslx_getnxtfile ( void *fsd, int8_t *fname )
+{
+   addr_in[0] = fsd;
+   addr_in[1] = fname;
+
+   crys_if (192);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]192 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]fsd
addr_in+4addr_in[1]fname
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.10.5 fslx_open

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »File SelectionX Open« - initialisiert und öffnet die +Dateiauswahl. +
  +
AES-Nummer: 190 +
  +
Deklaration: void *fslx_open ( int8_t *title, int16_t x, int16_t y, int16_t +*whdl, int8_t *path, int16_t pathlen, int8_t *fname, int16_t fnamelen, +int8_t *patterns, XFSL_FILTER *filter, int8_t *paths, int16_t +sort_mode, int16_t flags ); +
  +
Beschreibung: Die Funktion initialisiert und öffnet die Dateiauswahlbox. Es +gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
title Fenstertitel der Auswahl oder NULL +
x x-Koordinate +
y y-Koordinate der linken oberen Ecke des Fensters. Falls diese +den Wert -1 besitzen, so wird das Fenster zentriert dargestellt. +
whdl Fensterkennung nach erfolgreichem Öffnen. +
path vollständiger Pfad, welcher mit dem Laufwerk beginnt, und mit +'\' endet. +
Seit MagiC 6.10 darf der Pfad, wie bei fsel_xxx(), unvollständig +initialisiert werden, z.B. als Leer-String. MagiC komplettiert dann +den Pfad sinnvoll. +
pathlen Länge des aufnehmenden Pfad-Puffers. +
fname Puffer für den Dateinamen. +
fnamelen Länge des aufnehmenden Dateinamen-Puffers. +
patterns Dateinamensmuster wie "*.TXT", "*.PRG" oder +"*.IMG". Diese alternativ anwählbaren Muster sind durch EOS +getrennt und durch EOS,EOS abgeschlossen. +
Seit MagiC 6.10 darf hier ein Nullzeiger übergeben werden, MagiC +verwendet dann "*\0". +
filter Filterfunktion, die vor dem Mustervergleich aufgerufen +wird (oder NULL). Gibt diese den Wert 0 zurück, so ist die Datei +ungültig; bei einem Wert von 1 wird der Dateiname angezeigt. +
paths Pfad-History. Die alternativ anwählbaren Pfade sind durch EOS +getrennt, und durch EOS,EOS abgeschlossen. +
sort_mode Sortiermodus für die Anzeige + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SORTBYNAME (0)=nach Namen
SORTBYDATE (1)=nach Datum
SORTBYSIZE (2)=nach Größe
SORTBYTYPE (3)=nach Typ
SORTBYNONE (4)=unsortiert (physik. Reihenfolge)
SORTDEFAULT (-1)=default
+
+ +
SORTDEFAULT existiert seit MagiC 6.10 und bedeutet, daß der im +System gespeicherte Sortiermodus verwendet wird. + + + +
flags verschiedene Einstellungen + + + + + + + + + +
1 = (DOSMODE) Dies ist der Kompatibilitätsmodus, der auch von +fsel_(ex)input verwendet wird, und Dateinamen grundsätzlich im Format +8+3 liefert. Dazu werden alle Unterverzeichnisse per Dopendir +(DOPEN_COMPAT) aufgerufen. +
2 = (NFOLLOWSLKS) symbolische Links nicht verfolgen. In +diesem Fall gehören also Datum, Uhrzeit sowie die XATTR-Struktur, die +filter übergeben wird, zum Link selbst. +
8 = Ist GETMULTI gesetzt, können mehrere Dateien auf einmal +ausgewählt und übergeben werden. Dazu wird fslx_getnxtfile +verwendet, wenn fslx_evnt bzw. fslx_do im Parameter nfiles +signalisieren, daß noch weitere Dateien selektiert sind. + +
+ + +
+ +
Ergebnis: Die Funktion liefert einen Deskriptor für die weiteren +Aktionen, bzw. den Wert NULL, wenn ein Fehler aufgetreten ist. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Fileselektoren +
  +
Querverweis: Binding   fslx_close +
  + +
+ +

8.10.5.1 Bindings für fslx_open

+ + + + + + + + + +
C: void *fslx_open ( int8_t *title, int16_t x, int16_t y, int16_t +*whdl, int8_t *path, int16_t pathlen, int8_t *fname, int16_t fnamelen, +int8_t *patterns, XFSL_FILTER *filter, int8_t *paths, int16_t +sort_mode, int16_t flags ); +
  +
Umsetzung: +
  +
void *fslx_open ( int8_t *title, int16_t x, int16_t y,
+                  int16_t *whdl, int8_t *path,
+                  int16_t pathlen, int8_t *fname,
+                  int16_t fnamelen, int8_t *patterns,
+                  XFSL_FILTER *filter, int8_t *paths,
+                  int16_t sort_mode, int16_t flags )
+{
+   addr_in[0] = title;
+   addr_in[1] = path;
+   addr_in[2] = fname;
+   addr_in[3] = patterns;
+   addr_in[4] = filter;
+   addr_in[5] = paths;
+
+   int_in[0] = x;
+   int_in[1] = y;
+   int_in[2] = pathlen;
+   int_in[3] = fnamelen;
+   int_in[4] = sort_mode;
+   int_in[5] = flags;
+
+   crys_if (190);
+
+   *whdl = int_out[0];
+   return ( (void *) addr_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]190 # Opcode der Funktion
control+2control[1]6 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]6 # Einträge in addr_in
control+8control[4]1 # Einträge in addr_out
addr_inaddr_in[0]title
addr_in+4addr_in[1]path
addr_in+8addr_in[2]fname
addr_in+12addr_in[3]patterns
addr_in+16addr_in[4]filter
addr_in+20addr_in[5]paths
int_inint_in[0]x
int_in+2int_in[1]y
int_in+4int_in[2]pathlen
int_in+6int_in[3]fnamelen
int_in+8int_in[4]sort_mode
int_in+10int_in[5]flags
addr_outaddr_out[0]Return-Wert
int_outint_out[0]whdl
+
+ + +
+ +

8.10.6 fslx_set_flags

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »File SelectionX SetFlags« - setzt bestimmte Flags der +Dateiauswahl für das ganze System. +
  +
AES-Nummer: 195 +
  +
Deklaration: int16_t fslx_set_flags ( int16_t flags, int16_t *oldval ); +
  +
Beschreibung: Die Funktion setzt bestimmte Flags der Dateiauswahlbox für das +ganze System. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
flags verschiedene Flags + + + + +
1 = Format 8+3: Dies gilt nur für die Darstellung von +Verzeichnissen auf DOS-Laufwerken. Entspricht dem Schalter +"TOS-Dateien als 8+3" in MagXDesk. + +
+ +
oldval vorheriger Wert + +
+ +
Ergebnis: Die Funktion liefert im Fehlerfall den Wert 0, und den Wert 1 +bei fehlerfreier Ausführung. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Fileselektoren +
  +
Querverweis: Binding   fslx_open   fslx_close +
  + +
+ +

8.10.6.1 Bindings für fslx_set_flags

+ + + + + + + + + +
C: int16_t fslx_set_flags ( int16_t flags, int16_t *oldval ); +
  +
Umsetzung: +
  +
int16_t fslx_set_flags ( int16_t flags, int16_t *oldval )
+{
+   int_in[0] = 0;
+   int_in[1] = flags;
+
+   crys_if (195);
+
+   *oldval = int_out[1];
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]195 # Opcode der Funktion
control+2control[1]2 # Einträge in int_in
control+4control[2]2 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]0
int_in+2int_in[1]flags
int_outint_out[0]Return-Wert
int_out+2int_out[1]oldval
+
+ + +
+ +

8.10.7 Die Bedienung des File-Selektors ab MagiC 4

+

MagiC stellt ab Version 4.0 eine eigene Dateiauswahlbox zur +Verfügung, die neben der Unterstützung von langen Dateinamen auch +einiges an Bedienungskomfort bietet, welcher sonst nur von +alternativen Selektoren bekannt war. Die folgende Tabelle gibt eine +Übersicht über die wichtigsten Shortcuts: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tasten-Kombination Funktion +
    +
Return Keine Datei ausgewählt: Gibt den Text im Editfeld an +das Programm zurück. +
Datei ausgewählt: Gibt ausgewählte Datei zurück. +
Ordner ausgewählt: Öffnet den Ordner. +
Alt-A..Z Öffnet das jeweilige Laufwerk im aktuellen Verzeichnis. +
Ctrl-Esc Verzeichnis neu einlesen +
Ctrl-Backspace oder +
Ctrl-H Geht eine Verzeichnisebene zurück. +
Ctrl-D Deselektiert alle Einträge. Damit kann man erzwingen, daß der +eingegebene Dateiname statt der selektierten Datei zurückgegeben +wird. +
Cursor up,down Auswahl verschieben +
Ctrl-Cursor up,down scrollen +
Sh-Cursor up,down Auswahl seitenweise verschieben +
Sh-Ctrl-Cursor up,down seitenweise scrollen +
Home selektiert oberstes Element +
Sh-Home selektiert unterstes Element + +
+ +

Auch bei der Bedienung der Buttons gibt es einiges zu +beachten: Ein Doppelklick auf das 'parent'-Feld geht zurück aufs +Wurzelverzeichnis. Ein Klick auf eine Zeile selektiert das +entsprechende Objekt. Für den Fall, daß mehrere Dateien auswählbar +sind (dies ist durch den Systemaufruf beeinflußbar), werden diese +durch Shift-Klick ausgewählt. In jedem Fall kann man eine Datei mit +Shift-Klick deselektieren. +

+

Zu beachten ist ferner: +

+
    +
  • Lange Dateinamen werden nur dann zurückgegeben, wenn der +Aufrufer zuvor mit Pdomain(1) angekündigt hat, daß er damit auch +etwas anfangen kann. +
      +

  • +
  • Bei Auswahl eines Ordners durch [Return] wird das Eingabefeld +gelöscht. Wenn nichts selektiert ist, selektiert "Cursor +runter" die erste Zeile, "Cursor hoch" die letzte. +
      +

  • +
  • Bei den alten Aufrufen fsel_(ex)input() wird der eingestellte +Sortiermodus beim Booten auf "nach Namen" gesetzt und +später in einer globalen Variablen gemerkt, d.h. der letzte +eingestellte Sortiermodus wird bis zum nächsten Bootvorgang +gespeichert. +
      +

  • +
  • Bei den alten Funktionen fsel_(ex)input() wird ggf. das Muster +"*.*" statt "*" zurückgegeben. +
      +

  • +
+ +

Querverweis: Tastaturbelegung +

+

8.10.8 Fileselektor als Dialog

+
fsel = fslx_do(..., &button, &nfiles, ...);
+
+if (fsel) /* war der Selektor offen? */
+{
+   if (button)
+   {
+      while (--nfiles) /* mehrere Files? */
+         fslx_getnxtfile(...);   /* alle abholen */
+   }
+
+   fslx_close(fsel); /* alles wieder freigeben */
+}
+
+

8.10.9 Fileselektor im Fenster

+
fsel = fslx_open(...);
+if (fsel)
+{
+   do {
+      evnt.mwhich = evnt_multi(...);
+      rv = fslx_evnt(fsel, &evnt, ..., &nfiles, ...);
+
+      /* Bits für eigene Fenster/Menüs auswerten */
+   } while (rv);
+
+   while (--nfiles) fslx_getnxtfile(...);
+   fslx_close(fsel);
+}
+
+
+ +Home +AESAES +FensterverwaltungFensterverwaltung +FormularfunktionenFormularfunktionen + + diff --git a/de/gem_about.html b/de/gem_about.html new file mode 100644 index 000000000..2b22eab80 --- /dev/null +++ b/de/gem_about.html @@ -0,0 +1,222 @@ + + + + + +Die Anleitung zum TOS: GEM + + + + + + + + + +Home +TOSTOS +Das Betriebssystem TOSDas Betriebssystem TOS +BIOSBIOS + +
+ +

2.2 GEM

+

Das GEM (Graphics Environment Manager) ist der Teil des +Betriebssystems, der die (grafische) Schnittstelle zum Benutzer +realisiert. GEM wurde 1984 von der Firma Digital Research für +PC's mit Intel Prozessoren entwickelt. Bekannt wurde dieses System +jedoch vor allem durch die Markteinführung des Atari-ST, der eine +leistungsfähige und preiswerte Alternative zu den (damals) teuren +PC's und Macintosh Rechnern bot. +

+

GEM wurde im Laufe der Zeit auf unterschiedliche Betriebssysteme +bzw. Hardwareplattformen angepaßt, u.a: +

+
    +
  • PC GEM +
  • +
  • Atari GEM +
  • +
  • GEM on X (Version für Unix-Systeme) +
  • +
  • X/GEM, unter dem FlexOS Betriebssystem +
  • +
+ +

GEM läßt sich in zwei Teilbereiche untergliedern: +

+
    +
  • AES, Application Environment Services +
  • +
  • VDI, Virtual Device Interface +
  • +
+ +

Das AES übernimmt dabei die Organisation der Benutzerumgebung, +wohingegen das VDI für eine einheitliche grafische Gestaltung der +Benutzeroberfläche sorgt. Bei der Entwicklung von GEM-Programmen +sollte man sich unbedingt an die geltenden Style-Guidelines halten, +und keinesfalls versuchen, dem Benutzer eine eigene Oberfläche +aufzuzwingen, die sich an keine Standards hält. +

+

2.2.1 Die verschiedenen GEM-Versionen

+

Als GEM-Versionsnummer wird normalerweise die bei appl_init im +Globalfeld zurückgelieferte Kennung benutzt. Das VDI hingegen hat +eigentlich keine eigene Versionsnummer, zumal das Verhalten +der einzelnen VDI-Funktionen hauptsächlich von den benutzten +Gerätetreibern bestimmt wird, die sich ja austauschen lassen. +

+

Man kann grob zwischen den folgenden GEM-Versionen +unterscheiden: +

+ +

GEM 1.x: Diese erste AES-Version (1.x) hatte nicht von +ungefähr sehr auffällige Ähnlichkeiten mit dem Betriebssystem des +Apple Macintosh. Das äußerte sich nicht nur im Design der +Fensterelemente, sondern auch in vielen Eigenschaften des Desktops und +anderer Anwendungsprogramme. Damals wurde GEM meist im Zusammenhang +mit Testversionen von GEM-Draw, GEM-Paint und +GEM-Write gezeigt, die in vielen Details den bekannten +Macintosh-Vorbildern MacDraw, MacPaint und MacWrite entsprachen. +

+

Dies ist auch die Version, die schließlich von Atari +übernommen und im ST ausgeliefert wurde; auf dieser Fassung beruhen +auch alle neueren Versionen des Atari-GEM. Die Firma Atari hat +nämlich damals alle Rechte an der bestehenden Version erworben, und +die Entwicklung selbst fortgeführt. Damit lassen sich auch die immer +weiter klaffenden Unterschiede zwischen PC-GEM und Atari-GEM +erklären. Grösstes Manko der Atari-Version war sicherlich das Fehlen +des Graphics Device Operating Systems (GDOS); dieses beinhaltet +geräteunabhängige Grafikfunktionen, die auf dem Atari nur für den +Bildschirm implementiert wurden, und für Drucker, Plotter, Kameras +etc. nachgeladen werden müssen. So kam es, daß (vor allem in der +Anfangszeit des Atari) jedes Programm eigene Treiber und Formate +benutzte, und ein Datenaustausch zwischen den Applikationen fast +unmöglich wurde. +

+ +

GEM 2.x: Aufgrund einer juristischen +Auseinandersetzung zwischen Apple und Digital Research (bei der es in +erster Linie um das Outfit der Anwendungsprogramme und des Desktops +ging), mußte die PC-Version des GEM verändert werden. +

+

Die Einigung, die Ataris GEM-Version nicht betraf, sah +folgendermaßen aus: +

+
    +
  • einige Fensterelemente wurden so verändert, daß sie nicht +mehr ganz so wie die Macintosh Fenster aussahen (in erster Linie der +Titelbalken) +
  • +
  • das Accessory-Menü wanderte in die gegenüberliegende (rechte) +Bildschirmecke +
  • +
  • die Funktionen graf_growbox und graf_shrinkbox wurden +eliminiert +
  • +
  • das Desktop wurde völlig neu programmiert, und auf zwei feste +Fenster festgelegt. Entgegen landläufiger Meinung war dies allerdings +nur eine Änderung im Desktop, und nicht in den AES, die +weiterhin bis zu acht überlappende Fenster erlauben. +
  • +
+ +

Doch es gab nicht nur Einschränkungen, sondern auch +Verbesserungen. Als wichtigstes Beispiel sei erwähnt, daß +Accessories eine eigene Menüleiste anmelden durften. +

+

Diese Version erhielt die Versionsnummer 2.0 und wurde ab 1987 +ausgeliefert; nur wenig später wurde sie von dem niederländischen +Softwarehaus ABC zusammen mit GEM-Draw, GEM-Paint, +GEM-Graph und natürlich GEM-Desktop auf den Atari +portiert. Diese Version erlangte jedoch leider nie eine große +Bedeutung, und ist heute nicht mehr erhältlich. +

+ +

PC-GEM 3.x: In dieser Version sind nur noch +geringfügige Verbesserungen vorgenommen worden. So läßt sich z.B. +das Menüverhalten von Drop-Down auf Pull-Down umschalten. +

+

Ab GEM/3 Version 3.11 existieren weitere VDI-Funktionen, die +sich mit Bezier-Funktionen und Postscript-Drucker beschäftigen. Das +Programm ARTLINE macht mit seinen Vektorfonts Gebrauch von diesen +neuen Funktionen. +

+

Aufgrund der Dominanz von MS-Windows ist diese Version praktisch +vom PC-Markt verschwunden. +

+

GEM Desktop 3.13 : The last standard retail version shipped. +Part of the GEM PTK/SDK 3.13 which finally was rewritten to support +ANSI C compilers. +

+ +

GEM/4: Only made it to the market as runtime support +for Artline/2, PresTeam/2, Publish it/3 etc. The VDI will use EMS, if +available. +

+

The GEM/3 desktop will not run properly, and a com shell +provided to launch gem/4 apps from the GEM/3 desktop may crash +after repeated use. +

+ +

GEM/5: Only made it to the market as runtime support +for Timeworks Publisher 2.1. It had scalable font support using XMS +memory, and adds 3D look and feel to AES objects. +

+

Both GEM/4 and GEM/5 added new VDI and AES calls but their +bindings are unknown. This proprietary AES 4.0 has support for a new +MU_HELP message and some calls take an additional parameter for +context-sensitive help. What these features really do is not known. +

+ +

GEM/XM: Probably the model for DRI's X/GEM for FlexOS +(a 32bit protected mode multitasking system). GEM/XM planned to bring +support for multitasking under DOS but remained unfinished. Latest +release is FreeGEM/XM 3.0beta5-je1. +

+ + +

ViewMAX: ViewMAX/1 (DR-DOS 5.0) is a 'crippled' GEM/4 +kernel, can only be used as a shell to call GEM Applications. +Although designed for DR DOS, it will run under MS-DOS 3.x and later +(minus passwords). To use it with GEM apps you must have a GEM/3 +installation as well as a ViewMAX installation. This version was +written in Lattice C 3.x +

+

ViewMAX/2 (DR-DOS 6.0) was an improved version of the above, but +with the same kernel limitations as the above. This version was +rewritten in Turbo C2.0 and and allows configuration via *.ini file. +

+

ViewMAX/3 (DR-DOS 7.0) was never released but beta code is +available. +

+ + + +

X/GEM: Diese GEM-Version wurde von Digital +Research auf einem Multiuser Multitasking Betriebssystem (FlexOS) +entwickelt, und erlaubt die gleichzeitige Bearbeitung von mehreren +Applikationen im Vordergrund. +

+ +

Atari-GEM 1.4: Wichtige Änderungen hat Atari erst im +GEM 1.4 des TOS 1.04 vorgenommen; bekannteste Auswirkung ist der +stark verbesserte Fileselektor. +

+ +

Atari-GEM 3.x: noch nicht geschrieben. +

+ +

Atari-GEM 4.x: noch nicht geschrieben. +

+

Querverweis: GEM   Style-Guidelines +

+
+ +Home +TOSTOS +Das Betriebssystem TOSDas Betriebssystem TOS +BIOSBIOS + + diff --git a/de/gemdos_about.html b/de/gemdos_about.html new file mode 100644 index 000000000..d5e0053ee --- /dev/null +++ b/de/gemdos_about.html @@ -0,0 +1,96 @@ + + + + + +Die Anleitung zum TOS: Das GEMDOS + + + + + + + + + +Home +GEMDOSGEMDOS +GEMDOSGEMDOS +Unterstützung fremder DateisystemeUnterstützung fremder Dateisysteme + +
+ +

5.1 Das GEMDOS

+

Das GEMDOS ist, abgesehen von den hardware-abhängigen BIOS und +XBIOS, das eigentliche Betriebssystem des Atari. Seine Funktionen +werden über den 680X0-Trap #1 aufgerufen. Die +Betriebssystemfunktionen lassen sich sehr leicht aufgrund des ersten +Buchstabens des Funktionsnamens in Kategorien einteilen: +

+ + + + + + + + + + + + + + + + + + + + + + + + +
Dateifunktionen (F...) +
Datum und Uhrzeit (T...) +
Prozessfunktionen (P...) +
Speicherverwaltung (M...) +
Systemfunktionen (S...) +
Verzeichnisfunktionen (D...) +
Zeichenweise Ein-/Ausgabe (C...) +
Netzwerk (F...) + +
+ +

GEMDOS arbeitet unter MagiC reentrant (ab MagiC 3.0 gilt dies +sogar für das Dateisystem!). Sichtbar ist dies z.B. daran, daß +Altertboxen des Typs "Daten auf Disk A: defekt" verschiebbar +sind - hierzu muß nämlich Speicher angefordert werden, was unter +(Multi)TOS nicht funktioniert, da gerade eine Dateioperation im GEMDOS +abgearbeitet wird. +

+ +

Mit dem Erscheinen von MiNT wurde das GEMDOS um viele Funktionen +erweitert. Auch MagiC besitzt ab Version 3.0 MiNT-kompatible +Funktionen und es sind schon MetaDOS-Treiber mit entsprechender +Funktionalität gesichtet worden. +

+ + +

Das GEMDOS nimmt seine Parameter auf dem Stack entgegen; dabei +wird das letzte Argument aus der Parameterliste als erstes auf dem +Stack abgelegt. Funktionsergebnisse werden im Prozessorregister d0 +zurückgeliefert. Nur die Register d3-d7 und a3-a7 werden gerettet, +alle anderen werden durch den Aufruf verändert. +

+

Querverweis: XFS-Konzept in MagiC   Hintergrund-DMA   Programmformat   Funktionsliste +

+
+ +Home +GEMDOSGEMDOS +GEMDOSGEMDOS +Unterstützung fremder DateisystemeUnterstützung fremder Dateisysteme + + diff --git a/de/gemdos_argv.html b/de/gemdos_argv.html new file mode 100644 index 000000000..8df9da8c7 --- /dev/null +++ b/de/gemdos_argv.html @@ -0,0 +1,170 @@ + + + + + +Die Anleitung zum TOS: ARGV-Verfahren + + + + + + + + + +Home +GEMDOSGEMDOS +NetzwerkNetzwerk +C'Task RoyalC'Task Royal + +
+ +

5.18 ARGV-Verfahren

+ +

Das ARGV-Verfahren dient zur Übergabe erweiterter +Kommandozeilen, und wurde im Herbst 1989 von Ken Badertscher +(Atari-USA) offiziell spezifiziert. Das Verfahren arbeitet wie folgt: +

+

Die Environmentvariable ARGV zeigt an, daß dieses Verfahren +angewendet wird; der Wert der Variablen spielt dabei keine +Rolle, allein die Anwesenheit ist entscheidend. Die ARGV-Variable muss +die letzte Environmentvariable sein, damit das aufgerufene Programm +den "vorderen" Teil als sein normales Environment +weiterbenutzen kann. +

+

Die erweiterte Kommandozeile wird nun einfach als Folge von +Strings (Null-Terminiert !) hinter ARGV in das Environment +geschrieben. Der erste String enthält dabei den Namen des gestarteten +Programms, wie man ihn auch bei Pexec übergibt (und entspricht dem +bislang nicht genutzten argv[0]). Die weiteren Strings enthalten die +einzelnen Parameter, in denen auch Leerzeichen auftauchen dürfen; das +Ende der Liste wird wie bei einem normalen Environment durch eine +doppelte 0 gekennzeichnet. +

+

Darüber hinaus übergibt man bei Pexec als Längenbyte (erstes +Byte in der Kommandozeile) den Wert 127, der wegen der existierenden +Längenbeschränkung auf 125 Bytes bislang nicht angenommen werden +konnte. Dies ermöglicht es dem aufgerufenen Programm, +sicherzustellen, daß die im Environment übergebenen Werte +tatsächlich gültig sind und nicht etwa von einem Programm, das den +ARGV-Standard nicht kennt, übriggelassen wurden. +

+

Je nachdem, ob man per ARGV Parameter an andere Programme +übergeben, oder diese selbst lesen möchte, behandelt man einen der +folgenden zwei Punkte: +

+

• ARGV beim gestarteten Programm +

+ +

Zunächst stellt man fest, ob die Variable ARGV im Environment +vorhanden ist. Wenn dies der Fall ist, und das +Kommandozeilen-Längenbyte den Wert 127 besitzt, dann findet man nach +der ersten 0 nach ARGV (denn diese Variable könnte ja einen Wert +haben), die einzelnen Kommandozeilenparameter. Zum Schluß sollte man +den ersten Buchstaben von ARGV auf 0 den Wert 0 setzen, damit das +Environment wieder die Standardform besitzt. +

+

• ARGV beim Aufrufer +

+ +

Zunächst muß ein neues Environment für das aufzurufende +Programm erzeugt werden. Dazu berechnet man z.B. die Länge des +bereits vorhandenen Environments, addiert die Länge der Kommandozeile +und alloziert entsprechend viele Bytes. Dann wird das bestehende +Environment kopiert (und dabei eine evtl. bereits bestehende +ARGV-Variable entfernt), die neue ARGV-Variable und die +Kommandozeilenparameter nacheinander angehängt (jeweils +null-terminiert). Eine letzte Null schließt das Environment dann +endgültig ab. Zu guter letzt übergibt man im Längenbyte der +Kommandozeile den magischen Wert 127. +

+

• Erweiterung des ARGV-Verfahrens +

+ +

Ein Problem mit der ursprünglichen Definition des +ARGV-Verfahrens besteht darin, leere Parameter übergeben zu +können (zwei aufeinanderfolgende Nullen schließen ja das Environment +ab !). Um diese dennoch übergeben zu können, wurde das Verfahren wie +folgt erweitert: +

+
    +
  • leere Parameter werden in der Kommandozeile in einfache +Anführungsstriche gesetzt, und tauchen im Environment als +genau ein Leerzeichen auf. +
      +

  • +
  • für die Variable ARGV wird ein Wert definiert: falls diese mit +'NULL:' beginnt, enthält der Rest der Zeile (durch Kommata getrennt) +die Positionen der leeren Parameter. Beispiel: ARGV=NULL:3,5,9 +bedeutet, daß argv[3], argv[5] und argv[9] leer sind. Der +Startup-Code sollte sich dann darum kümmern, die entsprechenden +Parameter zu löschen. +
      +

  • +
+ +

Hinweis: Um maximale Kompatibilität zu alten Programmen +zu gewährleisten, sollte das erweiterte ARGV-Verfahren nur +dann eingesetzt werden, wenn tatsächlich leere Parameter +übergeben werden müssen. In allen anderen Fällen sollte man +stattdessen auf die ursprüngliche Definiton zurückgreifen. +

+

• ARGV-Verfahren ab MagiC 3.0 +

+ + +

Ab MagiC-3 wird das ARGV-Verfahren bereits von Pexec auf drei +verschiedene Arten unterstützt: +

+
    +
  • Ist das Längenbyte der Kommandozeile 127, geht Pexec +davon aus, daß das aufrufende Programm ARGV unterstützt und das +Environment bereits entsprechend manipuliert ist; das Environment wird +daher nicht geändert. +
      +

  • +
  • Ist das Längenbyte 254, erwartet MagiC direkt +dahinter die Zeichenkette "ARGV=", gefolgt von einem +Nullbyte und von einer durch zwei Nullbytes abgeschlossenen Liste von +Parametern. Durch Übergaben von "ARGV=NULL..." usw. kann +man auch das erweiterte ARGV-Verfahren verwenden, das die Übergabe +von leeren Parametern ermöglicht (s.o). +
      +
    Pexec löscht ein evntl. vorhandenes ARGV und trägt das neue +ins Environment ein. Die Kommandozeile besteht nur aus dem Wert 127 +als Indikator, daß die Parameter im Environment liegen. Das Verfahren +ist geeignet, wenn das aufgerufene Programm mit Sicherheit das +ARGV-Verfahren beherrscht. +
      +

  • +
  • Ist das Längenbyte 255, erwartet MagiC direkt +dahinter eine durch Leerstellen getrennte und durch ein Nullbyte +abgeschlossene Liste von Parametern (wie i.a. die Kommandozeile +übergeben wird). Pexec löscht ein evntl. vorhandenes ARGV, erstellt +aus der Kommandozeile eine Argumentliste und trägt diese als ARGV ins +Environment ein. Als argv[0] wird der Programmdatei-Pfad genommen, der +Pexec übergeben wurde. Ist dieser Pfad ungültig, gibt es Müll, +deshalb sollte man auch bei Modus 5 von Pexec (Basepage erstellen) +einen sinnvollen Programmnamen übergeben. Bei Modus 7 heißt argv[0] +dann einfach "NONAME", weil hier kein Name übergeben wird. +
      +
    Die Kommandozeile hat als Längenbyte 127 als Indikator für das +Vorhandensein von ARGV. Ist die Länge der Kommandozeile < 127, +wird diese außerdem in die Basepage kopiert, ansonsten besteht die +Kommandozeile nur aus dem Wert 127. Das Verfahren ist geeignet, wenn +das aufrufende Programm nicht sicher ist, daß das aufgerufene +Programm ARGV versteht. +
      +

  • +
+ +
+ +Home +GEMDOSGEMDOS +NetzwerkNetzwerk +C'Task RoyalC'Task Royal + + diff --git a/de/gemdos_chrinout.html b/de/gemdos_chrinout.html new file mode 100644 index 000000000..5e9fc72ea --- /dev/null +++ b/de/gemdos_chrinout.html @@ -0,0 +1,1452 @@ + + + + + +Die Anleitung zum TOS: Zeichenweise Ein-/Ausgabe + + + + + + + + + +Home +GEMDOSGEMDOS +VerzeichnisfunktionenVerzeichnisfunktionen +NetzwerkNetzwerk + +
+ +

5.16 Zeichenweise Ein-/Ausgabe

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Cauxin  Zeichen von serieller Schnittstelle lesen. +
Cauxis  Eingabe-Status der seriellen Schnittstelle ermitteln. +
Cauxos  Ausgabe-Status der seriellen Schnittstelle ermitteln. +
Cauxout Zeichen auf serielle Schnittstelle schreiben. +
Cconin  Zeichen von Standardeingabegerät einlesen. +
Cconis  Tastatur-Puffer nach anliegenden Zeichen abfragen. +
Cconos  Ausgabe-Status des Standardausgabegeräts überprüfen. +
Cconout Zeichen auf Standardausgabegerät schreiben. +
Cconrs  String von Standardeingabegerät einlesen. +
Cconws  String auf Standardausgabegerät ausgeben. +
Cnecin  Zeichen ohne Darstellung am Bildschirm einlesen. +
Cprnos  Drucker-Status ermitteln. +
Cprnout Zeichen auf Drucker ausgeben. +
Crawcin Zeichen ohne Darstellung/Interpretation einlesen. +
Crawio  Zeichen direkt von Tastatur lesen oder auf Bildschirm ausgeben. + +
+ +

Hinweis: Die Ausgaberoutinen des GEMDOS emulieren ein +VT-52-Terminal. +

+

5.16.1 Cauxin

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »character auxiliary input« - Eingabe über serielle +Schnittstelle. +
  +
Gemdosnummer: 3 +
  +
Deklaration: int32_t Cauxin ( void ); +
  +
Beschreibung: Die GEMDOS-Routine Cauxin liest ein Zeichen von Handle 2 ein - +normalerweise die seriellen Schnittstelle aux:. Die Funktion wartet +solange, bis das Zeichen eingetroffen ist. +
  +
Hinweis: Atari empfiehlt, für diese Zwecke die +BIOS-Funktion Bconin zu verwenden. +
  +
Ergebnis: Die Funktion liefert als Ergebnis das eingelesene Zeichen im +low Byte des zurückgelieferten WORDs. +
  +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Zeichenweise Ein-/Ausgabe +
  +
Querverweis: Binding   Cauxout   Bconin +
  + +
+ +

5.16.1.1 Bindings für Cauxin

+ + + + + + +
C: int32_t Cauxin ( void ); +
  +
Assembler: +
  +
move.w    #3,-(sp)     ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

5.16.2 Cauxis

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »character auxiliary input status« - überprüft den +Eingabestatus der seriellen Schnittstelle. +
  +
Gemdosnummer: 18 +
  +
Deklaration: int16_t Cauxis ( void ); +
  +
Beschreibung: Die GEMDOS-Routine Cauxis überprüft den Status von Handle 2 - +normalerweise die seriellen Schnittstelle aux:, dahingehend, ob ein +Zeichen empfangen werden kann. +
  +
Hinweis: Die Funktion arbeitet bei Umlenkung der +Ein-/Ausgabe erst ab GEMDOS-Version 0.15 korrekt. Atari empfiehlt, +für diese Zwecke die entsprechende BIOS-Funktion zu verwenden. +
  +
Ergebnis: Die Funktion liefert folgende Resultate: +
  + + + + + + + + + + + + +
Wert Bedeutung +
    +
-1 Zeichen im Puffer verfügbar +
0 kein Zeichen verfügbar + +
+ +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Zeichenweise Ein-/Ausgabe +
  +
Querverweis: Binding   Cauxos +
  + +
+ +

5.16.2.1 Bindings für Cauxis

+ + + + + + +
C: int16_t Cauxis ( void ); +
  +
Assembler: +
  +
move.w    #18,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

5.16.3 Cauxos

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »character auxiliary output status« - überprüft den +Ausgabestatus der seriellen Schnittstelle. +
  +
Gemdosnummer: 19 +
  +
Deklaration: int16_t Cauxos ( void ); +
  +
Beschreibung: Die GEMDOS-Routine Cauxos überprüft den Status von Handle 2 - +normalerweise die seriellen Schnittstelle aux: dahingehend, ob Zeichen +ausgegeben werden können. +
  +
Hinweis: Atari empfiehlt, für diese Zwecke die +BIOS-Funktion Bcostat zu verwenden. +
  +
Ergebnis: Die Funktion liefert folgende Resultate: +
  + + + + + + + + + + + + +
Wert Bedeutung +
    +
-1 Zeichen kann ausgegeben werden +
0 Zeichen kann nicht ausgegeben werden + +
+ +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Zeichenweise Ein-/Ausgabe +
  +
Querverweis: Binding   Cauxis   Bcostat +
  + +
+ +

5.16.3.1 Bindings für Cauxos

+ + + + + + +
C: int16_t Cauxos ( void ); +
  +
Assembler: +
  +
move.w    #19,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

5.16.4 Cauxout

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »character auxiliary output« - schreibt ein Zeichen auf die +serielle Schnittstelle. +
  +
Gemdosnummer: 4 +
  +
Deklaration: int32_t Cauxout ( int16_t c ); +
  +
Beschreibung: Die GEMDOS-Routine Cauxout schreibt das Zeichen c auf +Handle 2 - normalerweise die seriellen Schnittstelle aux:. +
  +
Hinweis: Die Funktion arbeitet bei Umlenkung der +Ein-/Ausgabe erst ab GEMDOS-Version 0.15 korrekt. Atari empfiehlt, +für diese Zwecke die BIOS-Funktion Bconout zu verwenden. +
  +
Ergebnis: Die Funktion liefert im Fehlerfall einen negativen Wert +zurück. +
  +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Zeichenweise Ein-/Ausgabe +
  +
Querverweis: Binding   Cauxin   Bconout +
  + +
+ +

5.16.4.1 Bindings für Cauxout

+ + + + + + +
C: int32_t Cauxout ( int16_t c ); +
  +
Assembler: +
  +
move.w    c,-(sp)      ; Offset 2
+move.w    #4,-(sp)     ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

5.16.5 Cconin

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »character console input« - liest ein Zeichen vom +Standardeingabegerät. +
  +
Gemdosnummer: 1 +
  +
Deklaration: int32_t Cconin ( void ); +
  +
Beschreibung: Die GEMDOS-Routine Cconin wartet, bis ein Zeichen verfügbar +ist und liest ein Zeichen vom Standardeingabegerät mit Handle 0. Als +Standardeingabegerät dient in der Regel die Tastatur. +
  +
Hinweis: Durch Setzen von Bit-3 der Systemvariablen +conterm kann veranlaßt werden, daß in den Bits 24..31 der +Wert von Kbshift zurückgegeben wird. Leider gibt es keine +Möglichkeit, Ein-/Ausgabeumlenkung sowie ein Dateiende zu erkennen. +Aus diesem Grund definieren viele Bibliotheken die Tastenkombination +Control-Z (ASCII-Code 26) als Zeichen für das Dateiende. +
  +
Ergebnis: Die Funktion liefert als Ergebnis in einem LONG den ASCII-Code +des Zeichens im niederwertigen Wort (Bits 0 .. 7). Wenn das +eingelesene Zeichen von der Tastatur kommt, beinhalten die unteren +acht Bits des höherwertigen Worts (Bits 16 ... 23) den Scancode der +Tastatur mit dem Zustand der Shift Taste wie oben beschrieben. Wenn +eine Nicht-ASCII Taste gedrückt wurde, wird als ASCII Code 0 +zurückgeliefert. +
  +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Zeichenweise Ein-/Ausgabe +
  +
Querverweis: Binding   Cconout   Cconis   Kbshift +
  + +
+ +

5.16.5.1 Bindings für Cconin

+ + + + + + +
C: int32_t Cconin ( void ); +
  +
Assembler: +
  +
move.w    #1,-(sp)     ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

5.16.6 Cconis

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »character console is waiting« - prüft nach, ob ein Zeichen +im Standardeingabepuffer vorliegt. +
  +
Gemdosnummer: 11 +
  +
Deklaration: int32_t Cconis ( void ); +
  +
Beschreibung: Die GEMDOS-Routine Cconis überprüft den Status von Handle 0 - +normalerweise der Standardeingabe-Puffer, dahingehend, ob ein Zeichen +empfangen werden kann. +
  +
Ergebnis: Die Funktion liefert folgende Resultate: +
  + + + + + + + + + + + + +
Wert Bedeutung +
    +
-1L Zeichen verfügbar +
0L Zeichen nicht verfügbar + +
+ +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Zeichenweise Ein-/Ausgabe +
  +
Querverweis: Binding   Cconin +
  + +
+ +

5.16.6.1 Bindings für Cconis

+ + + + + + +
C: int32_t Cconis ( void ); +
  +
Assembler: +
  +
move.w    #11,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

5.16.7 Cconos

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »character console output status« - prüft den Status des +Standardausgabegerätes. +
  +
Gemdosnummer: 16 +
  +
Deklaration: int16_t Cconos ( void ); +
  +
Beschreibung: Die GEMDOS-Routine Cconos überprüft den Status von Handle 1 - +normalerweise das Standardausgabegerät, dahingehend, ob Zeichen +ausgegeben werden können. +
  +
Hinweis: Die Funktion arbeitet bei Umlenkung der +Ein-/Ausgabe erst ab GEMDOS-Version 0.15 korrekt. +
  +
Ergebnis: Die Funktion liefert als Ergebnis den Status des +Standardausgabegeräts, und zwar wie folgt: +
  + + + + + + + + + + + + +
Wert Bedeutung +
    +
0 Zeichen kann nicht ausgegeben werden +
1 Zeichen kann ausgegeben werden + +
+ +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Zeichenweise Ein-/Ausgabe +
  +
Querverweis: Binding   Cconout +
  + +
+ +

5.16.7.1 Bindings für Cconos

+ + + + + + +
C: int16_t Cconos ( void ); +
  +
Assembler: +
  +
move.w    #16,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

5.16.8 Cconout

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »character console output« - schreibt ein Zeichen auf das +Standardausgabegerät. +
  +
Gemdosnummer: 2 +
  +
Deklaration: int32_t Cconout ( int16_t c ); +
  +
Beschreibung: Die GEMDOS-Routine Cconout schreibt das Zeichen c auf +das GEMDOS Handle 1 - normalerweise das Standardausgabegerät. Als +Standardausgabegerät dient in der Regel der Bildschirm. +
  +
Hinweis: Das Zeichen c enthält in den Bits 0..7 +den zugehörigen ASCII-Code (alle anderen Bits müssen 0 sein). Es +erfolgt keine Umwandlung von Linefeed, deshalb müssen ASCII 13 und +ACII 10 ausgegeben werden, um einen Zeilenumbruch zu erzeugen. Die +Funktion arbeitet bei Umlenkung der Ein- bzw. Ausgabe erst ab +GEMDOS-Version 0.15 korrekt. Für ältere Versionen darf dieses Handle +nicht auf ein reines Ausgabedevice umgelenkt werden, da dieser Aufruf +versucht, aus dem Ausgabestream zu lesen um spezielle +Tastenkombinationen zu bearbeiten. +
  +
Ergebnis: Der Rückgabewert der Funktion ist vom Betriebssystem +abhängig. Es gilt: +
  + + + + + + + + + + + + + + + +
Betriebssystem Wert +
    +
TOS kein sinnvoller Rückgabewert +
MagiC < 3.00 + + + + + + + + + +
< 0 = Fehler +
0L = Ausgabegerät ist voll +
1L = Ausgabe war erfolgreich + +
+ +
MiNT/MagiC > 3.00 + + + + + + + + + + + + +
< 0 = Fehler +
0L = Ausgabegerät ist voll +
1L = Ausgabe war erfolgreich +
4L = Ausgabe auf dem Terminal war erfolgreich + +
+ + +
+ +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Zeichenweise Ein-/Ausgabe +
  +
Querverweis: BindingCconin   Cconos   VT-52-Terminal +
  + +
+ +

5.16.8.1 Bindings für Cconout

+ + + + + + +
C: int32_t Cconout ( int16_t c ); +
  +
Assembler: +
  +
move.w    c,-(sp)      ; Offset 2
+move.w    #2,-(sp)     ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

5.16.9 Cconrs

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »character console read string« - liest einen String von der +Standardeingabe. +
  +
Gemdosnummer: 10 +
  +
Deklaration: int32_t Cconrs ( LINE *buf ); +
  +
Beschreibung: Die GEMDOS-Routine Cconrs liest einen String von der +Standardeingabe (GEMDOS Handle 0) - normalerweise die Tastatur, und +schreibt die Zeichen gleichzeitig auf die Standardausgabe (GEMDOS +Handle 1) - normalerweise der Bildschirm. +
  +
Dazu schreibt man in die Komponente maxlen die Anzahl +der einzulesenden Zeichen - 1. Die Eingabe wird von der Funktion +abgebrochen, wenn die Return-Taste betätigt wird, oder die maximale +Eingabelänge überschritten wurde. +
  +
Spezielle Tastenkombinationen bewirken unterschiedliche +Funktionen. Im einzelnen: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Eingabe Bedeutung +
    +
Return Ende der Eingabe +
Control-J End of line; don't place Ctrl-J in buffer +
Control-H Kill last character (= Delete) +
Backspace letztes Zeichen löschen +
Control-U/X ganze Zeile löschen +
Control-R Zeile neu eingeben +
Control-C Programm (!) abbrechen + +
+ +
Hinweis: Umlaute werden von der Funktion erst ab GEMDOS +Version 0.15 korrekt behandelt, ein evtl. Dateiende wird nicht +erkannt. Gelesene Zeichen werden sogar dann auf dem Bildschirm +ausgegeben, wenn die Standardausgabe umgelenkt worden ist. +
  +
In MagiC ist die Funktion stark erweitert worden; hier +gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Eingabe Bedeutung +
    +
Cursor hoch/runter letzte Eingaben zurückholen +
Cursor links/rechts Cursor ein Zeichen bewegen +
dto. mit Shift Cursor an Zeilenanfang/-ende +
Home Cursor an Zeilenanfang +
Insert Einfügemodus +
Shift-Insert Überschreibmodus +
Shift-Clear Eingabe löschen +
Tabulator wechselseitig Zeilenanfang/ende +
Undo letzte Eingabe +
Delete/Backspace Zeichen unter/vor Cursor löschen +
F1..F10 Environmentvariablen F1..F10 abrufen + +
+ +
Bei normalen Dateien wird in MagiC bis zum ersten LF gelesen, +wobei CR überlesen wird. Die Environmentvariablen können dabei mit +jedem beliebigen Kommandointerpreter (z.B. der Mupfel) belegt +werden. +
  +
Ergebnis: Die Funktion liefert bei fehlerfreier Ausführung den Wert 0L +zurück und im Fehlerfall eine negative Zahl. +
  +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Zeichenweise Ein-/Ausgabe +
  +
Querverweis: Binding   Cconws   MagiC +
  + +
+ +

5.16.9.1 Bindings für Cconrs

+ + + + + + +
C: int32_t Cconrs ( LINE *buf ); +
  +
Assembler: +
  +
pea       buf          ; Offset 2
+move.w    #10,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

5.16.10 Cconws

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »character console write string« - schreibt einen String auf +das Standardausgabegerät. +
  +
Gemdosnummer: 9 +
  +
Deklaration: int32_t Cconws ( CONST BYTE *buf ); +
  +
Beschreibung: Die GEMDOS-Routine Cconws schreibt den String buf auf +das GEMDOS Handle 1 - normalerweise das Standardausgabegerät con:. +Der String muß mit dem ASCII-Zeichen Null beendet werden. Für GEMDOS +Versions kleiner 0.15 darf dieses Handle nicht auf ein reines +Ausgabedevice umgelenkt werden, da dieser Aufruf versucht, aus dem +Ausgabestream zu lesen um spezielle Tastenkombinationen zu bearbeiten. +
  +
Ergebnis: Unter TOS 1.04 liefert die Funktion den Wert 0L bei +erfolgreicher Ausführung bzw. den Wert -1L im Fehlerfall. +
Ab MagiC 3.00 gibt es keinen Rückgabewert bzw. es wird der Wert +von Fwrite geliefert. +
  +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Zeichenweise Ein-/Ausgabe +
  +
Querverweis: Binding   Cconrs   VT-52-Terminal   ASCII-Tabelle +
  + +
+ +

5.16.10.1 Bindings für Cconws

+ + + + + + +
C: int32_t Cconws ( CONST BYTE *buf ); +
  +
Assembler: +
  +
pea       buf          ; Offset 2
+move.w    #9,-(sp)     ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

5.16.11 Cnecin

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »character no echo input« - liest ein Zeichen vom +Standardeingabegerät. +
  +
Gemdosnummer: 8 +
  +
Deklaration: int32_t Cnecin ( void ); +
  +
Beschreibung: Die GEMDOS-Routine Cnecin liest ein Zeichen direkt vom GEMDOS +Handle 0 - normalerweise der Standardeingabe con: (üblicherweise die +Tastatur), ohne daß das Zeichen auf dem Standardausgabegerät +ausgegeben wird. +
  +
Hinweis: Flußkontrolle kann durch die +Tastenkombinationen Control-S (Ausgabe stoppen) bzw. Control-Q +(Ausgabe fortsetzen) erreicht werden. Bei GEMDOS Versions kleiner 0.30 +hängt sich die Funktion auf, wenn das Handle umgeleitet wurde un ein +End-of-File erkannt wird. +
  +
Ergebnis: Die Funktion liefert als Ergebnis das eingelesene Zeichen. +
  +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Zeichenweise Ein-/Ausgabe +
  +
Querverweis: Binding   Cconin   Crawcin   Crawio +
  + +
+ +

5.16.11.1 Bindings für Cnecin

+ + + + + + +
C: int32_t Cnecin ( void ); +
  +
Assembler: +
  +
move.w    #8,-(sp)     ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

5.16.12 Cprnos

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »character printer output status« - prüft den Status der +Druckerschnittstelle. +
  +
Gemdosnummer: 17 +
  +
Deklaration: int16_t Cprnos ( void ); +
  +
Beschreibung: Die GEMDOS-Routine Cprnos überprüft den Status von Handle 3 - +normalerweise die parallele Schnittstelle, dahingehend, ob Zeichen +ausgegeben werden können. +
  +
Hinweis: Es ist sehr zu empfehlen, diese Funktion vor +einer gewünschten Druckausgabe zu nutzen, da zum Erkennen des +Drucker-Timeouts ein Zeitraum von ca. 30 Sekunden vergeht. +
  +
Ergebnis: Die Funktion liefert folgende Resultate: +
  + + + + + + + + + + + + +
Wert Bedeutung +
    +
-1 Drucker bereit +
0 Drucker nicht bereit + +
+ +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Zeichenweise Ein-/Ausgabe +
  +
Querverweis: Binding   Cconos +
  + +
+ +

5.16.12.1 Bindings für Cprnos

+ + + + + + +
C: int16_t Cprnos ( void ); +
  +
Assembler: +
  +
move.w    #17,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

5.16.13 Cprnout

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »character printer output« - schreibt ein Zeichen auf die +Druckerschnittstelle. +
  +
Gemdosnummer: 5 +
  +
Deklaration: int32_t Cprnout ( int16_t c ); +
  +
Beschreibung: Die GEMDOS-Routine Cprnout schreibt das Zeichen c auf +das GEMDOS Handle 3 - normalerweise die Druckerschnittstelle prn:. +
  +
Das auszugebende Zeichen belegt dabei die Bits 0..7, alle +anderen Bits müssen 0 sein. +
  +
Hinweis: Vor der Druckausgabe sollte per Cprnos +überprüft werden, ob der Drucker zur Ausgabe bereit ist. Die mit +Hilfe der Funktion Setprt vorgenommenen Einstellungen werden beim +Druck von quasi allen TOS Versionen nicht beachtet. Die +Funktion arbeitet bei Umlenkung der Ein-/Ausgabe erst ab +GEMDOS-Version 0.15 korrekt. +
  +
Ergebnis: Die Funktion liefert im Fehlerfall den Wert 0 zurück. +
  +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Zeichenweise Ein-/Ausgabe +
  +
Querverweis: Binding   Cprnos   Setprt +
  + +
+ +

5.16.13.1 Bindings für Cprnout

+ + + + + + +
C: int32_t Cprnout ( int16_t c ); +
  +
Assembler: +
  +
move.w    c,-(sp)      ; Offset 2
+move.w    #5,-(sp)     ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

5.16.14 Crawcin

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »character raw input« - liest ein Zeichen ungepuffert vom +Standardeingabegerät. +
  +
Gemdosnummer: 7 +
  +
Deklaration: int32_t Crawcin ( void ); +
  +
Beschreibung: Die GEMDOS-Routine Crawcin liest ein Zeichen vom GEMDOS Handle +- üblicherweise die Standardeingabe, ohne daß es dabei sofort auf +dem Bildschirm ausgegeben wird oder die spezielle Tastenkombinationen +bearbeitet werden. +
  +
Hinweis: Die Funktion arbeitet bei Umlenkung der +Ein-/Ausgabe erst ab GEMDOS-Version 0.15 korrekt. +
  +
Ergebnis: Die Funktion liefert als Ergebnis das eingelesene Zeichen. +
  +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Zeichenweise Ein-/Ausgabe +
  +
Querverweis: Binding   Cconin   Cconout   Crawio +
  + +
+ +

5.16.14.1 Bindings für Crawcin

+ + + + + + +
C: int32_t Crawcin ( void ); +
  +
Assembler: +
  +
move.w    #7,-(sp)     ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

5.16.15 Crawio

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »character raw input output« - ermöglicht ungepufferte +Ein-/Ausgaben. +
  +
Gemdosnummer: 6 +
  +
Deklaration: int32_t Crawio ( int16_t w ); +
  +
Beschreibung: Die GEMDOS-Routine Crawio führt ungepufferte Ein-Ausgaben +durch. Für den Parameter w gilt, wobei nur die unteren 8 Bits +beachtet werden (und alle anderen Bits 0 sein sollten): +
  + + + + + + + + + + + + +
Wert Bedeutung +
    +
0xff Zeichen von Standardeingabe lesen +
sonst Zeichen auf Standardausgabe ausgeben + +
+ +
Hinweis: Die Funktion arbeitet bei Umlenkung der +Ein-/Ausgabe erst ab GEMDOS-Version 0.15 korrekt. +
  +
Ergebnis: Falls der Parameter w den Wert 0xff besitzt, liefert +die Funktion in einem LONG den ASCII Code des eingelesenen Zeichens im +niederwertige WORD (Bits 0 .. 7) zurück. Wurde das Zeichen von der +Tastatur gelesen, enthält das höherwertige WORD (Bits 16 ... 23) den +Scancode der Tastatur mit dem Status der Shifttaste in den oberen 8 +Bits wenn Bit 3 der Systemvariable conterm gesetzt ist. Wenn +eine Nicht-ASCII Taste gedrückt wurde, wird als ASCII Code 0 +zurückgeliefert. +
  +
Ein Wert von 0 bedeutet, daß kein Zeichen verfügbar ist. +
  +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Zeichenweise Ein-/Ausgabe +
  +
Querverweis: Binding   Cconin   Cconout   VT-52-Terminal +
  + +
+ +

5.16.15.1 Bindings für Crawio

+ + + + + + +
C: int32_t Crawio ( int16_t w ); +
  +
Assembler: +
  +
move.w    w,-(sp)      ; Offset 2
+move.w    #6,-(sp)     ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +
+ +Home +GEMDOSGEMDOS +VerzeichnisfunktionenVerzeichnisfunktionen +NetzwerkNetzwerk + + diff --git a/de/gemdos_datetime.html b/de/gemdos_datetime.html new file mode 100644 index 000000000..68c11109b --- /dev/null +++ b/de/gemdos_datetime.html @@ -0,0 +1,1018 @@ + + + + + +Die Anleitung zum TOS: Datum und Uhrzeit + + + + + + + + + +Home +GEMDOSGEMDOS +DateifunktionenDateifunktionen +ProzessfunktionenProzessfunktionen + +
+ +

5.10 Datum und Uhrzeit

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tadjtime   Zeit synchronisieren. +
Talarm     Weckfunktion. +
Tgetdate   Datum ermitteln. +
Tgettime   Uhrzeit ermitteln. +
Tgettimeofday interrogates the state of the internal, high resolution system +clock. +
Tmalarm    reads/sets a process alarm for the current process. +
Tsetdate   Datum einstellen. +
Tsetitimer Steuerung eines periodischen Timers. +
Tsettime   Uhrzeit einstellen. +
Tsettimeofday sets the state of the internal, high resolution system clock. + +
+ +

Querverweis: Datum und Zeit im XBIOS +

+

5.10.1 Tadjtime

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Adjust time« - correct the time to synchronize the system +clock. +
  +
Opcode: 343 (0x157) +
  +
Syntax: int Tadjtime ( const struct timeval *delta, struct timeval +*olddelta ); +
  +
Description: The Tadjtime() function gradually adjusts the system clock (as +returned by Tgettimeofday). The amount of time by which the clock is +to be adjusted is specified in the structure pointed to by delta. +
  +
If the adjustment in delta is positive, then the system clock is +speeded up by some small percentage (i.e., by adding a small amount of +time to the clock value in each second) until the adjustment has been +completed. If the adjustment in delta is negative, then the clock is +slowed down in a similar fashion. +
  +
If a clock adjustment from an earlier Tadjtime() call is already +in progress at the time of a later Tadjtime() call, and delta is not +NULL for the later call, then the earlier adjustment is stopped, but +any already completed part of that adjustment is not undone. +
  +
If olddelta is not NULL, then the buffer that it points to is +used to return the amount of time remaining from any previous +adjustment that has not yet been completed. +
  +
Return value: A return value 0 if the setting was successful, otherwise a +negative error code is returned. +
  +
Notes: The adjustment that Tadjtime() makes to the clock is carried +out in such a manner that the clock is always monotonically +increasing. Using Tadjtime() to adjust the time prevents the problems +that can be caused for certain applications (e.g., make(1)) by abrupt +positive or negative jumps in the system time. +
  +
Availability: This function is available as of FreeMiNT 1.16. +
  +
Group: Date and Time +
  +
See also: Binding   Tsetdate   Tsettime +
  + +
+ +

5.10.1.1 Bindings for Tadjtime

+ + + + + + +
C: int Tadjtime ( const struct timeval *delta, struct timeval +*olddelta ); +
  +
Assembler: +
  +
move.l    olddelta,-(sp)   ; Offset 6
+move.l    delta,-(sp)  ; Offset 2
+move.w    #343,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+lea       10(sp),sp    ; Correct stack
+
+ +
+ +

5.10.2 Talarm

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Talarm« - Lesen/setzen eines Alarms für den aktuellen +Prozess. +
  +
Gemdosnummer: 288 (0x0120) +
  +
Deklaration: int32_t Talarm ( int32_t time ); +
  +
Beschreibung: Die Funktion sendet dem aufrufenden Prozess nach time +Sekunden ein SIGALRM-Signal. +
  +
Falls für dieses Signal kein Signal-Handler per Psignal +installiert wurde, wird der Prozess sofort (d.h. beim Eintreffen des +Signals) terminiert. +
  +
Durch einen Wert von time = 0, kann ein früher +gesetzter Alarm storniert werden. Ist time negativ, so hat die +Funktion keine Auswirkungen und lediglich der Rückgabewert wird +geliefert. +
  +
Ergebnis: Die Funktion liefert die Zeit bis zum Eintreffen des +SIGALRM-Signals (wenn ein Alarm aktiviert wurde) in Sekunden zurück, +und anderenfalls den Wert 0. +
  +
Verfügbar: Seit der ersten in MultiTOS integrierten MiNT Version 1.04. +
  +
Diese Funktion wurde mit MiNT Version 0.8pl8 eingeführt, aber +für Versionen vor 1.12 enthält der Code einen Fehler, der die +Funktionalität beeinträchtigt. +
  +
Gruppe: Datum und Uhrzeit +
  +
Querverweis: Binding   Tmalarm   Pause   Psignal   Signale +
  + +
+ +

5.10.2.1 Bindings für Talarm

+ + + + + + +
C: int32_t Talarm ( int32_t time ); +
  +
Assembler: +
  +
move.l    time,-(sp)   ; Offset 2
+move.w    #288,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

5.10.3 Tgetdate

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »get date« - Tagesdatum ermitteln. +
  +
Gemdosnummer: 42 +
  +
Deklaration: uint16_t Tgetdate ( void ); +
  +
Beschreibung: Die GEMDOS-Routine Tgetdate ermittelt das aktuelle Tagesdatum. +
  +
Ergebnis: Die Funktion liefert als Ergebnis eine uint32_t-Zahl mit dem +Tagesdatum. Das Datum ist wie folgt codiert: +
  + + + + + + + + + + + + + + + +
Bits Bedeutung +
    +
0-4 Tag (1-31) +
5-8 Monat (1-12) +
9-15 Jahr (0-119, 0= 1980) + +
+ +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Datum und Uhrzeit +
  +
Querverweis: Binding   Tsetdate +
  + +
+ +

5.10.3.1 Bindings für Tgetdate

+ + + + + + +
C: uint16_t Tgetdate ( void ); +
  +
Assembler: +
  +
move.w    #42,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

5.10.4 Tgettime

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »get time« - ermittelt die Uhrzeit. +
  +
Gemdosnummer: 44 +
  +
Deklaration: uint16_t Tgettime ( void ); +
  +
Beschreibung: Die GEMDOS-Routine Tgettime ermittelt die Uhrzeit. +
  +
Ergebnis: Die Funktion liefert als Ergebnis die Uhrzeit. Sie ist wie +folgt codiert: +
  + + + + + + + + + + + + + + + +
Bits Bedeutung +
    +
0-4 Sekunden im Zweierschritt (0-29) +
5-10 Minuten (0-59) +
11-15 Stunden (0-23) + +
+ +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Datum und Uhrzeit +
  +
Querverweis: Binding   Tsettime +
  + +
+ +

5.10.4.1 Bindings für Tgettime

+ + + + + + +
C: uint16_t Tgettime ( void ); +
  +
Assembler: +
  +
move.w    #44,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

5.10.5 Tgettimeofday

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Tgettimeofday« - erfragt den Status der internen, +hochauflösenden Systemzeit. +
  +
Gemdosnummer: 341 (0x0155) +
  +
Deklaration: int32_t Tgettimeofday ( timeval *tv, timezone *tzp ); +
  +
Beschreibung: Diese Funktion erfragt den Status der internen, +hochauflösenden Systemzeit. +
  +
Das Argument tv ist ein Zeiger auf eine timeval +Struktur. +
  +
Das Argument tzp ist ein Zeiger auf eine timezone +Struktur. +
  +
Es kann für jeden der beiden Argumente NULL übergeben werden. +Dies wird nicht als Fehler angesehen. +
  +
Entwickler von Bibliotheken sollten beachten, daß die +Definition der Struktur timezone nicht konform zu der anderer Strukturen +ist. Die Member sind vom Datentyp int und nicht long (Dies trifft nur +für die Struktur timezone zu, die Member der Struktur timeval sind vom +Datentyp long). 16-Bit Bibliotheken müssen den Inhalt der Struktur, +auf die tzp zeigt, kopieren. +
  +
Der Ssystem() Aufruf hat ein Kommando S_CLOCKMODE. Dieses +Kommando erlaubt es, den Modus des Kernel Zeitgebers zu setzen oder +anzufragen. Z.B. festzulegen, ob die Hardware Uhr UTC oder die local +time anzeigt. +
Es ist geplant, MiNT kompatibel zu dem kernel time keeping model +aus der RFC1305 zu machen. Dieses Modell wurde erfolgreich in +Betriebssystemen wie SunOS, Ultrix, OSF/1, HP-UX und Linux umgesetzt. +Es ist zu erwarten, daß sich die interen Realsierung in Zukunft +ändert. +
  +
Ergebnis: Der Aufruf kann nicht fehlschlagen, es wird immer E_OK +zurückgeliefert. +
  +
Verfügbar: Verfügbar, wenn ein MiNT Kernel mit einer Versionsnummer von +mindestens 1.15.0 erkannt wird. +
  +
Gruppe: Datum und Uhrzeit +
  +
Querverweis: Binding   Ssystem   Tsettimeofday +
  + +
+ +

5.10.5.1 Bindings für Tgettimeofday

+ + + + + + +
C: int32_t Tgettimeofday ( timeval *tv, timezone *tzp ); +
  +
Assembler: +
  +
pea       tzp          ; Offset 6
+pea       tv           ; Offset 2
+move.w    #341,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+lea       $0a(sp),sp   ; Stack korrigieren
+
+ +
+ +

5.10.6 Tmalarm

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Tmalarm« - interrogates the state of the internal, high +resolution system clock. +
  +
Gemdosnummer: 317 (0x013d) +
  +
Deklaration: int32_t Tmalarm( int32_t time ); +
  +
Beschreibung: This function reads/sets a process alarm for the current +process. +
  +
time specifies the length of time (in milliseconds) to +wait before a SIGALRM signal is delivered. If time is 0 then any +previously set alarm is cancelled. If time is negative the function +does not modify any alarm currently set. +
  +
If no SIGALRM signal handler has been set up when the alarm is +triggered, the process will be killed. +
  +
Ergebnis: Returns 0 if no alarm was scheduled prior to this call or the +amount of time remaining (in milliseconds) before the alarm is +triggered. +
  +
Verfügbar: Available when a 'MiNT' cookie with a version of at least 1.10 +exists. +
  +
Gruppe: Datum und Uhrzeit +
  +
Querverweis: Binding   Talarm   Pause   Psignal +
  + +
+ +

5.10.6.1 Bindings für Tmalarm

+ + + + + + +
C: int32_t Tmalarm( int32_t time ); +
  +
Assembler: +
  +
move.l    time,-(sp)   ; Offset 2
+move.w    #341,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

5.10.7 Tsetdate

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »set date« - Tagesdatum setzen. +
  +
Gemdosnummer: 43 +
  +
Deklaration: int16_t Tsetdate ( uint16_t date ); +
  +
Beschreibung: Die GEMDOS-Routine Tsetdate setzt das aktuelle Tagesdatum. Der +Parameter date ist wie folgt codiert: +
  + + + + + + + + + + + + + + + +
Bits Bedeutung +
    +
0-4 Tag (1-31) +
5-8 Monat (1-12) +
9-15 Jahr (0-119, 0= 1980) + +
+ +
Hinweis: Ab dem Blitter-TOS wird das Datum auch in der +jeweils vorhandenen Hardware-Uhr gesetzt. +
  +
Ergebnis: Ein Rückgabewert von -1 kennzeichnet ein ungültiges Format +des Datums. +
  +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Datum und Uhrzeit +
  +
Querverweis: Binding   Tgetdate   Tadjtime +
  + +
+ +

5.10.7.1 Bindings für Tsetdate

+ + + + + + +
C: int32_t Tsetdate ( uint16_t date ); +
  +
Assembler: +
  +
move.w    date,-(sp)   ; Offset 2
+move.w    #43,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

5.10.8 Tsetitimer

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Tsetitimer« - steuert einen periodischen Timer. +
  +
Gemdosnummer: 329 (0x0149) +
  +
Deklaration: int32_t Tsetitimer ( int16_t which, int32_t *interval, int32_t +*value, int32_t *ointerval, int32_t *ovalue ); +
  +
Beschreibung: Die GEMDOS-Routine Tsetitimer steuert einen von insgesamt drei +möglichen periodischen Timern. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
which gewünschter Timer + + + + + + + + + + +
0 = Dieser Timer arbeitet in Echtzeit, und sendet nach Ablauf das +Signal SIGALRM. + +
1 = Dieser Timer arbeitet in 'virtueller Prozess-Zeit', und sendet +nach Ablauf das Signal SIGVTALRM. Der Timer läuft in diesem Fall nur, +wenn der Prozess, welcher den Timer steuert, aktuell die CPU besitzt. + +
2 = Dieser Timer arbeitet sowohl in 'virtueller Prozess-Zeit' als +auch dann, wenn das Betriebssystem selbst aktiv ist. Nach Ablauf des +Timers wird das Signal SIGPROF gesendet. + +
+ +
interval Adresse eines Long-Wertes, welcher den Wert enthält, auf den +der Timer nach Ablauf gesetzt werden soll. Ein NULL-Zeiger bedeutet, +daß der entsprechende alte Wert nicht verändert werden soll. Falls +der int32_t-Wert den Wert 0 besitzt, wird der Timer nach seinem Ablauf +deaktiviert. +
value Adresse eines Long-Wertes, welcher den Initialwert des Timers +in Millisekunden beschreibt. Ein NULL-Zeiger läßt den aktuellen +Timer unangetastet. Falls der int32_t-Wert den Wert 0 besitzt, wird +der Timer deaktiviert. +
ointerval Adresse eines Long-Wertes, welcher das aktuelle Intervall des +Timers aufnimmt, bzw. NULL, wenn dieser Wert nicht von Interesse ist. +
ovalue Adresse eines Long-Wertes, welcher den aktuellen Wert des +Timers aufnimmt oder NULL, wenn dieser Wert nicht von Interesse ist. + +
+ +
Da alle internen Berechnungen in Millisekunden gemessen werden, +ist es nicht möglich einen Timer auf beliebige (sehr große, +zukünftige) Werte zu setzen. +
  +
Ergebnis: Die Funktion liefert bei korrekter Ausführung 0, und im +Fehlerfall einen negativen Wert zurück. +
  +
Verfügbar: Diese Funktion ist optional, daher darf ein Aufruf mit EINVFN +beantwortet werden. Sie ist verfügbar, wenn 'MiNT' Cookie mit einer +Versionsnummer von mindestens 1.11 existiert. +
  +
Gruppe: Datum und Uhrzeit +
  +
Querverweis: Binding   Pause   Psignal   Talarm +
  + +
+ +

5.10.8.1 Bindings für Tsetitimer

+ + + + + + +
C: int32_t Tsetitimer ( int16_t which, int32_t *interval, int32_t +*value, int32_t *ointerval, int32_t *ovalue ); +
  +
Assembler: +
  +
move.l    ovalue,-(sp)    ; Offset 16
+move.l    ointerval,-(sp) ; Offset 12
+move.l    value,-(sp)     ; Offset  8
+move.l    interval,-(sp)  ; Offset  4
+move.w    which,-(sp)     ; Offset  2
+move.w    #329,-(sp)      ; Offset  0
+trap      #1              ; GEMDOS aufrufen
+lea       20(sp),sp       ; Stack korrigieren
+
+ +
+ +

5.10.9 Tsettime

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »set time« - setzt die Uhrzeit. +
  +
Gemdosnummer: 45 +
  +
Deklaration: int16_t Tsettime ( uint16_t time ); +
  +
Beschreibung: Die GEMDOS-Routine Tsettime setzt die Uhrzeit. Der Parameter +time muß wie folgt codiert werden: +
  + + + + + + + + + + + + + + + +
Bits Bedeutung +
    +
0-4 Sekunden im Zweierschritt (0-29) +
5-10 Minuten (0-59) +
11-15 Stunden (0-23) + +
+ +
Hinweis: Ab dem Blitter-TOS 1.02 wird die Zeit auch in +der jeweils vorhandenen Hardware-Uhr gesetzt. +
  +
Ergebnis: Ein Rückgabewert von -1 kennzeichnet ein ungültiges +Zeitformat. +
  +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Datum und Uhrzeit +
  +
Querverweis: Binding   Tgettime +
  + +
+ +

5.10.9.1 Bindings für Tsettime

+ + + + + + +
C: int32_t Tsettime ( uint16_t time ); +
  +
Assembler: +
  +
move.w    time,-(sp)   ; Offset 2
+move.w    #45,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

5.10.10 Tsettimeofday

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Tsettimeofday« - sets the state of the internal, high +resolution system clock. +
  +
Gemdosnummer: 342 (0x0156) +
  +
Deklaration: int32_t Tsettimeofday ( timeval *tv, timezone *tzp ); +
  +
Beschreibung: This function sets the state of the internal, high resolution +system clock. +
  +
The argument tv is a pointer to the timeval structure. +
  +
The argument tzp is a pointer to the timezone structure. +
  +
You may safely pass NULL for either argument. This isn't +considered an error. +
  +
Implementors of library bindings should be aware that the +definition of struct timezone is non-standard. The members are actually +int and not long int (this applies only to struct timezone; the members +of struct timeval are always long). 16-bit libraries will have to copy +the contents of the structure that tzp points to. +
  +
The tz_dsttime member of timezone is stored, but not evaluated +within the kernel. Beware not to misunderstand its meaning: if +non-zero it simply signifies that daylight savings time apply during +some part of the year, not necessarily now. In other words: if it is +non-zero someday, it should be non-zero during the entire year. The +Ssystem() call has a command S_CLOCKMODE. This command allows to +retrieve or set the kernel clock mode, i.e. to specify whether the +hardware clock is meant to run in UTC or in local time. +
It is planned to make MiNT compliant with the kernel time keeping +model described in RFC1305. This model is already successfully +implemented in operating systems such as SunOS, Ultrix, OSF/1, HP-UX +and Linux. Please expect the internal realization to change in the +future. +
  +
Ergebnis: The following error conditions are defined: +
  +
EPERM - an attempt was made by a user without super-user +privileges to change the system time or system time zone information. +
  +
EBADARG - one of the arguments is out of range. Note that the +kernel time cannot be set to dates before Jan 1 1980 00:00:00 and +after some day in 2038 (yep, MAX_LONG seconds since the epoch). +Timezone offsets must be in the range of +/- 720 minutes. +
  +
Verfügbar: Available when a MiNT kernel of a version at least 1.15.0 +release is detected. +
  +
Gruppe: Datum und Uhrzeit +
  +
Querverweis: Binding   Ssystem   Tgettimeofday +
  + +
+ +

5.10.10.1 Bindings für Tsettimeofday

+ + + + + + +
C: int32_t Tsettimeofday ( timeval *tv, timezone *tzp ); +
  +
Assembler: +
  +
pea       tzp          ; Offset 6
+pea       tv           ; Offset 2
+move.w    #342,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+lea       $0a(sp),sp   ; Stack korrigieren
+
+ +
+ +
+ +Home +GEMDOSGEMDOS +DateifunktionenDateifunktionen +ProzessfunktionenProzessfunktionen + + diff --git a/de/gemdos_directory.html b/de/gemdos_directory.html new file mode 100644 index 000000000..2afde810f --- /dev/null +++ b/de/gemdos_directory.html @@ -0,0 +1,2941 @@ + + + + + +Die Anleitung zum TOS: Verzeichnisfunktionen + + + + + + + + + +Home +GEMDOSGEMDOS +SystemfunktionenSystemfunktionen +Zeichenweise Ein-/AusgabeZeichenweise Ein-/Ausgabe + +
+ +

5.15 Verzeichnisfunktionen

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dchroot     changes the root directory for the calling process +
Dclosedir   Schließt ein Verzeichnis. +
Dcntl       Filesystem-spezifische Operation auf Datei/Verzeichnis. +
Dcreate     Verzeichnis anlegen. +
Ddelete     Verzeichnis löschen. +
Dfree       Freie und Gesamtkapazität eines Laufwerks ermitteln. +
Dgetcwd     Verzeichnis eines Prozesses ermitteln. +
Dgetdrv     Aktuelles Laufwerk ermitteln. +
Dgetpath    Aktuelles Verzeichnis ermitteln. +
Dlock       BIOS-Gerät sperren bzw. wieder freigeben. +
Dopendir    Verzeichnis zum Lesen öffnen. +
Dpathconf   Informationen über ein Filesystem ermitteln. +
Dreaddir    Verzeichnis-Informationen lesen. +
Dreadlabel  Filesystem Label lesen. +
Drewinddir  Geöffentes Verzeichnis zurücksetzen. +
Dsetdrv     Aktuelles Laufwerk ändern. +
Dsetkey     Sets key/passphrase for a drive. +
Dsetpath    Aktuelles Verzeichnis ändern. +
Dwritelabel Filesystem Label setzen. +
Dxopendir   Verzeichnis zum Lesen öffnen. +
Dxreaddir   Verzeichnis-Informationen lesen, Attribute ermitteln. + +
+ +

Querverweis: Dateifunktionen   XBIOS-Laufwerksfunktionen +

+

5.15.1 Dchroot

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dchroot« - changes the root directory for the calling +process +
  +
Gemdosnummer: 330 (0x014a) +
  +
Deklaration: int32_t Dchroot( int8_t *path ); +
  +
Beschreibung: The path parameter is a pathname of the folder that +will be the new root directory for the calling process. Directories +and files which are outside to the specified tree will be no longer +accessible. +
  +
Dchroot does not automatically change the current directory to +the newly specified root. Also, the call needs root privileges to +operate properly. This function is used by e.g. ftpd to limit the user +privileges in accessing filesystems. +
  +
Ergebnis: Returns the E_OK on success or a negative GEMDOS error code +otherwise. +
  +
Verfügbar Available as of FreeMiNT version 1.15.4 +
  +
Gruppe: Verzeichnisfunktionen +
  +
Querverweis: Binding   Dopendir   Dreaddir   MagiC +
  + +
+ +

5.15.1.1 Bindings für Dchroot

+ + + + + + +
C: int32_t Dchroot( int8_t *path ); +
  +
Assembler: +
  +
pea       path             ; Offset 2
+move.w    #330,-(sp)       ; Offset 0
+trap      #1               ; GEMDOS aufrufen
+addq.l    #6,sp            ; Stack korrigieren
+
+ +
+ +

5.15.2 Dclosedir

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dclosedir« - schließt ein Verzeichnis. +
  +
Gemdosnummer: 299 +
  +
Deklaration: int32_t Dclosedir ( int32_t dirhandle ); +
  +
Beschreibung: Die Funktion schließt das Verzeichnis mit dem Handle +dirhandle. +
  +
Ergebnis: Die Funktion liefert den Wert 0, falls das Verzeichnis korrekt +geschlossen werden konnte. Wenn dirhandle ungültig ist, wird +der Wert EBADF zurückgegeben. +
  +
Verfügbar: Verfügbar, wenn ein 'MiNT' Cookie mit einer Versionsnummer von +mindestens 0.90 existiert und in MagiC ab Version 3.0. +
  +
Gruppe: Verzeichnisfunktionen +
  +
Querverweis: Binding   Dopendir   Dreaddir   MagiC +
  + +
+ +

5.15.2.1 Bindings für Dclosedir

+ + + + + + +
C: int32_t Dclosedir ( int32_t dirhandle ); +
  +
Assembler: +
  +
move.l    dirhandle,-(sp)  ; Offset 2
+move.w    #299,-(sp)       ; Offset 0
+trap      #1               ; GEMDOS aufrufen
+addq.l    #6,sp            ; Stack korrigieren
+
+ +
+ +

5.15.3 Dcntl

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dcntl« - führt eine Filesystem spezifische Operation auf +einer Datei bzw. einem Verzeichnis durch. +
  +
Gemdosnummer: 304 +
  +
Deklaration: int32_t Dcntl ( int16_t cmd, int8_t *name, int32_t arg ); +
  +
Beschreibung: Die Funktion führt das Kommando cmd auf dem File bzw. +Verzeichnis name aus. Einzelheiten sind vom Filesystem +abhängig, auf das sich name bezieht. Die Bedeutung des +Parameters arg ist wiederum von cmd abhängig. +
  +
Standardmäßig wird der Dcntl-Aufruf von den Filesystemen U:\\ +und U:\DEV unterstützt. +
  +
Das Unified-Filesystem U:\ kennt die folgenden +Kommandos: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Kommando Beschreibung +
  + +
FS_INSTALL (0xf001) installiert ein neues Filesystem +
  + + + + + + +
name: U:\ +
arg: Zeiger auf fs_descr Struktur + +
+ + +
FS_MOUNT (0xf002) Bindet ein bereits existierendes Filesystem in das +Unified-System U:\ ein. +
  + + + + + + +
name: Name unter dem auf das Filesystem zugegriffen werden kann. +
arg: Zeiger auf fs_descr Struktur + +
+ + +
FS_UNMOUNT (0xf003) entfernt ein per FS_MOUNT eingehängtes System. +
  + + + + + + +
name: Name unter dem das Filesystem eingebunden wurde. +
arg: Zeiger auf fs_descr Struktur + +
+ + +
FS_UNINSTALL (0xf004) Entfernt ein Filesystem vollständig aus dem Kernel. Dieser +Befehl ist nur erlaubt, wenn keine weiteren Verweise auf das +Filesystem existieren, also beispielsweise etwaige Mounts rückgängig +gemacht wurden. +
  + + + + + + +
name: U:\\ +
arg: Zeiger auf fs_descr Struktur + +
+ +
FUTIME (0x4603) Ist das Pendant zur gleichnamigen Fcntl()-Funktion. Sie wird +von MiNT sowie vom DOS-XFS in MagiC unterstützt. Als Parameter wird +ein Zeiger auf eine mutimbuf-Struktur übergeben. +
  + + +
KER_GETINFO (0x0100) Ermittelt einen Zeiger auf die Kernelfunktionen von MagiC. Bei +den Parametern name und arg muss es sich um NULL-Werte +handeln. Zurückgeliefert wird ein Zeiger auf eine MX_KERNEL-Struktur. +(*) +
  +
Ab MagiC 6: MX_KER_GETINFO (0x6d00) (1) +
  + + +
KER_DOSLIMITS (0x0101) Fordert den Kernel von MagiC auf, die Limits für +FAT-Dateisysteme zu ermitteln. Die Parameter name und +arg müssen auf NULL gesetzt werden. Zurückgeliefert wird ein +Zeiger auf einen Zeiger auf eine MX_DOSLIMITS Struktur; dieser kann +daher auf eine eigene Struktur umgebogen werden, falls ein neuer +Treiber installiert wird. Dieser Opcode wird normalerweise nur von +Festplattentreibern (wie dem HDDRIVER) verwendet. (*) +
  +
Ab MagiC 6: MX_KER_DOSLIMITS (0x6d01) (1) +
  + +
KER_INTMAVAIL (0x102)   +
  + +
KER_INTGARBC (0x103) Diese Funktionen existierten vor der Version 4.01 von MagiC, +und wurden auf Sconfig-Aufrufe umgesetzt, um Konflikte mit Treibern zu +vermeiden, die Probleme mit unbekannten Opcodes besitzen (*). +
  + + +
KER_DRVSTAT (0x0104) Ermittelt einfache Informationen über ein Laufwerk. Es gilt: +
  + + + + + + +
name: wird ignoriert +
arg: Zeiger auf zwei int16_ts. + +
+ +
Das erste int16_t muss dabei eine Null enthalten, in das zweite +wird eine Laufwerksnummer von 0..25 (A..Z) geschrieben. Die möglichen +Rückgabewerte für diesen Opcode lauten: +
  + + + + + + +
EDRIVE : ungültige Laufwerksnummer +
ELOCKED : Laufwerk z.Zt. gesperrt + +
+ +
Ein Wert von 0 bzw. >0 zeigt an, daß das Laufwerk z.Zt. +gemounted bzw. nicht gemounted ist. Dieser Opcode steht erst ab der +MagiC-Version vom 09.09.95 zur Verfügung (*). +
  +
Ab MagiC 6: MX_KER_DRVSTAT (0x6d04) (1) +
  + + +
KER_XFSNAME (0x0105) Ermittelt den Namen des Treibers, welcher für ein bestimmtes +Verzeichnis zuständig ist. +
  + + + + + + +
name: Pfadname (kein Dateiname!) +
arg: Zeiger auf einen mindestens 9 Zeichen großen Puffer, der an +einer geraden Adresse liegen muss. + +
+ +
Ein Rückgabewert < 0 kennzeichnet einen Fehler; ansonsten +wird im angegebenen Puffer der Name des Treibers abgelegt; z.Zt. sind +folgende Treibernamen bekannt: +
  + + + + + + + + + +
(a) "DOS_XFS": altes DOS-XFS +
(b) "VDOS_XFS": DOS-XFS mit VFAT +
(c) "MMAC_HFS": MagiCMac-HFS + +
+ +
Dieser Opcode steht erst ab der MagiC-Version vom 15.06.1996 zur +Verfügung (*). +
  +
Ab MagiC 6: MX_KER_XFSNAME (0x6d05) (1) +
  + + +
KER_INSTXFS (0x0200) Fordert den Kernel von MagiC auf, ein XFS zu installieren. (*) +
  + + + + + + +
name: NULL-Zeiger +
arg: einzubindender Treiber + +
+ +
Ab MagiC 6: MX_KER_INSTXFS (0x6d02) (1) +
  + +
KER_SETWBACK (0x0300) Fordert den Kernel von MagiC auf, den WriteBack zu +konfigurieren. Ab MagiC-Version 4.01 wurde dieser Opcode auf einen +Sconfig-Aufruf umgesetzt, um Konflikte mit Treibern zu vermeiden, die +Probleme mit unbekannten Opcodes besitzen (*). +
  + + +
DFS_GETINFO (0x1100) Ermittelt einen Zeiger auf die DOS_XFS-Funktionen von MagiC. +Bei den Parametern name und arg muss es sich um +NULL-Werte handeln. Zurückgeliefert wird ein Zeiger auf eine +???-Struktur. (*) +
  +
Ab MagiC 6: MX_DFS_GETINFO (0x6d40) (1) +
  + + +
DFS_INSTDFS (0x1200) Installiert ein DFS unter MagiC (*). +
  + + + + + + +
name: NULL-Zeiger +
arg: einzubindender Treiber + +
+ +
CDROMEJECT (0x4309) Übernimmt das Auswerfen von Medien. +
  + + + + + + +
name: Pfad des auszuwerf. Mediums +
arg: NULL + +
+ +
Die Auswurffunktion wird für alle Laufwerke unterstützt, die +über einen XHDI-kompatiblen Treiber angesprochen werden, sowie für +Macintosh Volumes (unter MagiCMac). +
  +
Ab MagiC 6: MX_DFS_INSTDFS (0x6d41) (1) +
  + +
VFAT_CNFDFLN (0x5600) Konfiguriert ein VFAT-Dateisystem. +
  + + + + + + +
name: U:\\ +
arg: Bitvektor der festlegt, bei welchen Laufwerken lange Dateinamen +zugelassen werden. + +
+ +
Die Einstellung wird erst beim mounten eines Dateisystems aktiv, +daher können bereits gemountete Dateisysteme mit diesem Befehl +nicht beeinflußt werden. Dieser Opcode steht erst ab der +MagiC-Version vom 02.01.96 zur Verfügung. (*). +
  + +
VFAT_CNFLN (0x5601) Dient der Konfiguration eines VFAT-Dateisystems. Genauer: Legt +fest, ob ein gemountetes Laufwerk lange Dateinamen unterstützt, oder +nicht. Mit diesem Opcode kann also der per VFAT_CNFDFLN festgelegte +Defaultwert überladen werden. Damit die Umstellung für den +Benutzer sichtbar wird, sollte eine SH_WDRAW-Nachricht an die +System-Shell geschickt werden. Dieser Opcode steht erst ab der +MagiC-Version vom 02.01.96 zur Verfügung (*). +
  + +
PROC_CREATE (0xcc00) Diese Funktion ist in MagiC für zukünftige Zwecke reserviert +(*). Sie wird ab MagiC 6 nicht mehr verwendet. +
  + +
+ +
Das Filesystem U:\DEV kennt folgende Kommandos: +
  + + + + + + + + + + + + + + + + + + +
Kommando Beschreibung +
  +
    +
  + +
DEV_INSTALL (0xde02) installiert einen neuen Treiber für ein Gerät. +
  + + + + + + +
name: vollständiger Pfadname des Treibers +
arg: Zeiger auf dev_descr-Struktur + +
+ +
Auf das so installierte Gerät, darf nur über GEMDOS +Operationen zugegriffen werden. +
  + + +
DEV_M_INSTALL (0xcd00) entspricht DEV_INSTALL und muß aufgrund des inkompatiblen +Treiberformates zu MultiTOS in MagiC benutzt werden. (*) +
  + + + + + + +
name: vollst. Pfadname des Treibers +
arg: Zeiger auf MX_DDEV-Struktur + +
+ +
Ab MagiC 6: MX_DEV_INSTALL (0x6d20) (1) +
  + +
DEV_NEWTTY (0xde00) installiert Treiber für ein neues BIOS Terminal +
  + + + + + + +
name: Name des Terminals (in der Form 'U:\DEV\DEVNAME') +
arg: BIOS Gerätenummer des Terminals + +
+ +
Das BIOS muß per Bconmap über das Gerät informiert worden sein, +anderenfalls wird jeder Versuch auf das Gerät zuzugreifen mit EUNDEV +bestraft. +
  + +
DEV_NEWBIOS (0xde01) installiert einen Treiber für ein neues BIOS nicht-Terminal +Gerät. +
  + + + + + + +
name: vollständiger Name des Geräts +
arg: zugehörige BIOS Gerätenummer + +
+ +
Das BIOS muß per Bconmap über das Gerät informiert worden sein, +anderenfalls wird jeder Versuch auf das Gerät zuzugreifen mit EUNDEV +bestraft. +
  + +
+ +
Hinweis: Die mit (*) gekennzeichneten Opcodes stehen +dabei nur unter MagiC, alle anderen nur unter MiNT bzw. MultiTOS zur +Verfügung. Ausnahmen: Die Opcodes FUTIME und CDROMEJECT stehen sowohl +unter MiNT/MultiTOS als auch unter MagiC zur Verfügung. +
  +
(1): Leider gab es Kollisionen zwischen MagiC und dem Minix-XFS +für MiNT. Daher enthält MagiC ab der Version 6 neue Codes, die +alten werden aber noch unterstützt. Die neuen Codes haben ein 0x6d im +oberen Word, diese Kennung ist für MagiC reserviert. +
  +
Ergebnis: Der Rückgabewert ist abhängig von der gewünschten Operation +und dem zugrunde liegenden Filesystem. Bei einem Wert >= 0 ist +alles erfolgreich verlaufen. Eine Ausnahme ist der Wert bei +DEV_INSTALL, welcher entweder auf eine Informationsstruktur des +Kernels zeigt, oder aber den Wert 0 besitzt. +
  +
Bei einem ungültigen Opcode wird EINVFN zurückgeliefert. +
  +
Verfügbar: Verfügbar, wenn ein 'MiNT' Cookie mit einer Versionsnummer von +mindestens 0.90 existiert und in MagiC ab Version 3.0. +
  +
Gruppe: Verzeichnisfunktionen +
  +
Querverweis: Binding   XFS-Konzept in MagiC   Bconmap   Fcntl   MagiC   Metaioctl +
  + +
+ +

5.15.3.1 Bindings für Dcntl

+ + + + + + +
C: int32_t Dcntl ( int16_t cmd, int8_t *name, int32_t arg ); +
  +
Assembler: +
  +
move.l    arg,-(sp)    ; Offset 8
+pea       name         ; Offset 4
+move.w    cmd,-(sp)    ; Offset 2
+move.w    #304,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+lea       $C(sp),sp    ; Stack korrigieren
+
+ +
+ +

5.15.4 Dcreate

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »create directory« - Verzeichnis anlegen. +
  +
Gemdosnummer: 57 +
  +
Deklaration: int32_t Dcreate ( CONST int8_t *path ); +
  +
Beschreibung: Die GEMDOS-Routine Dcreate legt ein Verzeichnis mit dem +Pfadnamen path an, der mit dem ASCII-Zeichen 0 abgeschlossen +sein muss. +
  +
Hinweis: Aufgrund mangelhafter Fehlerbehandlungen in +GEMDOS-Versionen < 0.15 konnte u.U. das Dateisystem beschädigt +werden. Ferner wurde nicht überprüft, ob eine Datei des angegebenen +Namens bereits existiert. +
  +
Das Atari GEMDOS Reference Manual vom 4. April 1986 warnt über +die Übergabe von Pfaden mit einem Backlslash am Ende und tatsächlich +liefert die Funktion bis TOS 1.0x in so einem Fall EPTHNF. +
  +
Ab MagiC-3 wird der Aufruf vom Kernel weitergegeben als +xfs_dcreate mit Erstellmodus Fxattr %0100000111101101 (d.h. 'directory +file' mit einer Zugriffsberechtigung RWXRwXRwX). Das XFS sollte keine +gleichnamigen Dateien oder Unterverzeichnisse löschen, sondern in +diesem Fall den Fehlercode EACCDN liefern. Ungültige Dateinamen wie +"." oder ".." müssen auch vom XFS abgefangen +werden. +
  +
Ergebnis: Die Funktion liefert folgende Resultate: +
  + + + + + + + + + + + + + + + +
Wert Bedeutung +
    +
E_OK kein Fehler aufgetreten +
EPTHNF Verzeichnis nicht gefunden +
EACCDN Zugriff verweigert + +
+ +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Verzeichnisfunktionen +
  +
Querverweis: Binding   Ddelete   ASCII-Tabelle +
  + +
+ +

5.15.4.1 Bindings für Dcreate

+ + + + + + + + + +
C: int32_t Dcreate ( CONST int8_t *path ); +
  +
Assembler: +
  +
pea       path         ; Offset 2
+move.w    #57,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+
GFA-Basic Fehler%=Gemdos(&H39,L:path%) +
  + +
+ +

5.15.5 Ddelete

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »delete directory« - Verzeichnis löschen. +
  +
Gemdosnummer: 58 +
  +
Deklaration: int32_t Ddelete ( CONST int8_t *path ); +
  +
Beschreibung: Die GEMDOS-Routine Ddelete löscht ein Verzeichnis mit dem +Pfadnamen path, das keine weiteren Dateien oder +Unterverzeichnisse enthalten darf. Der String path muß mit +dem ASCII-Zeichen 0 abgeschlossen sein. +
  +
Hinweis: In GEMDOS-Versionen < 0.15 funktionierte ein +Aufruf von Dcreate mit unmittelbar folgendem Ddelete nicht - erst ein +weiteres Ddelete brachte das gewünschte Resultat. +
  +
In MagiC testet der Kernel vorher, ob das Verzeichnis ein +aktueller Pfad ist, und liefert ggfs. eine Fehlermeldung zurück. Nach +Möglichkeit sollten nur leere Verzeichnisse gelöscht werden; dies +ist jedoch Sache des XFS. Ab MagiC-Version 4.01 können mit Hilfe +dieser Funktion auch symbolische Links gelöscht werden; in älteren +Versionen wurde stets das Verzeichnis gelöscht, auf welches der Link +zeigte. +
  +
Ergebnis: Die Funktion liefert folgende Resultate: +
  + + + + + + + + + + + + + + + + + + +
Wert Bedeutung +
    +
E_OK kein Fehler aufgetreten +
EPTHNF Verzeichnis nicht gefunden +
EACCDN Zugriff verweigert +
EINTRN interner Fehler des GEMDOS + +
+ +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Verzeichnisfunktionen +
  +
Querverweis: Binding   Dcreate   XFS-Konzept in MagiC +
  + +
+ +

5.15.5.1 Bindings für Ddelete

+ + + + + + + + + +
C: int32_t Ddelete ( CONST int8_t *path ); +
  +
Assembler: +
  +
pea       path         ; Offset 2
+move.w    #58,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+
GFA-Basic Fehler%=Gemdos(&H3A,L:path%) +
  + +
+ +

5.15.6 Dfree

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »free disk space« - ermittelt die Kapazitätsauslastung eines +Laufwerks. +
  +
Gemdosnummer: 54 +
  +
Deklaration: int16_t Dfree ( DISKINFO *buf, int16_t driveno ); +
  +
Beschreibung: Die GEMDOS-Routine Dfree ermittelt die Kapazität und Belegung +eines Laufwerks. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
buf Adresse des Informations-Puffers +
driveno + + + + + + + + + +
0 = aktuelles Laufwerk +
1 = Laufwerk-A +
2 = Laufwerk-B (usw.) + +
+ + +
+ +
Hinweis: In GEMDOS-Versionen < 0.15 ist diese +Funktion unglaublich langsam. +
  +
Auf das Verzeichnis U:\PROC angewandt, liefert diese Funktion ab +MagiC 3 die minimale, tatsächliche Blocklänge (als Sektoren pro +Cluster). Zur Zeit wird der Speicher wortweise belegt, d.h. die +'Sektorgröße' ist 1 int8_t, und die Clustergröße beträgt 2 +Sektoren (also 2 int8_ts). +
  +
Ergebnis: Die Funktion liefert bei korrekter Ausführung eine 0, und eine +negative Zahl, wenn es zu einem Fehler kam. +
  +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Verzeichnisfunktionen +
  +
Querverweis: Binding   Fdelete +
  + +
+ +

5.15.6.1 Bindings für Dfree

+ + + + + + + + + +
C: int16_t Dfree ( DISKINFO *buf, int16_t driveno ); +
  +
Assembler: +
  +
move.w    driveno,-(sp)  ; Offset 6
+pea       buf            ; Offset 2
+move.w    #54,-(sp)      ; Offset 0
+trap      #1             ; GEMDOS aufrufen
+addq.l    #8,sp          ; Stack korrigieren
+
+
GFA-Basic Fehler%=Gemdos(&H36,L:buf%,W:driveno%) +
  + +
+ +

5.15.7 Dgetcwd

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dgetcwd« - bestimmt das aktuelle Verzeichnis eines +Prozesses. +
  +
Gemdosnummer: 315 +
  +
Deklaration: int32_t Dgetcwd ( int8_t *path, int16_t drv, int16_t size ); +
  +
Beschreibung: Es wird das aktuelle Arbeitsverzeichnis des aktiven Prozesses +auf Laufwerk drv geliefert. Der Parameter size gibt +die Größe des den Namen aufnehmenden Puffers an. +
  +
Ergebnis: path: Verzeichnis des aktuellen Prozesses. +
  +
Der Rückgabewert der Funktion ist entweder 0 (alles ok), ERANGE +(die Größe des Puffers reicht nicht aus, um die exakte Beschreibung +des Verzeichnisses aufzunehmen), oder EDRIVE (kein gültiges GEMDOS +Laufwerk). +
  +
Verfügbar: Verfügbar, wenn ein 'MiNT' Cookie mit einer Versionsnummer von +mindestens 0.96 existiert und in MagiC ab Version 3.0. +
  +
Gruppe: Verzeichnisfunktionen +
  +
Querverweis: Binding   Dgetpath +
  + +
+ +

5.15.7.1 Bindings für Dgetcwd

+ + + + + + +
C: int32_t Dgetcwd ( int8_t *path, int16_t drv, int16_t size ); +
  +
Assembler: +
  +
move.w    size,-(sp)   ; Offset 8
+move.w    drv,-(sp)    ; Offset 6
+pea       path         ; Offset 2
+move.w    #315,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+lea       $A(sp),sp    ; Stack korrigieren
+
+ +
+ +

5.15.8 Dgetdrv

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »disk get drive« - ermittelt das aktuelle Laufwerk. +
  +
Gemdosnummer: 25 +
  +
Deklaration: int16_t Dgetdrv ( VOID ); +
  +
Beschreibung: Die GEMDOS-Routine Dgetdrv ermittelt das aktuelle Laufwerk. +
  +
Ergebnis: Die Funktion liefert als Ergebnis eine Zahl, die wie folgt +codiert ist: +
  + + + + + + + + + + + + + + + + + + +
Wert Bedeutung +
    +
0 Laufwerk-A +
1 Laufwerk-B +
2 Laufwerk-C +
3 Laufwerk-D (usw.) + +
+ +
Hinweis: Ab MagiC 3 sind Laufwerke von A bis Z, d.h. +Werte von 0 bis 25 zulässig. +
  +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Verzeichnisfunktionen +
  +
Querverweis: Binding   Dsetdrv   _drvbits +
  + +
+ +

5.15.8.1 Bindings für Dgetdrv

+ + + + + + + + + +
C: int16_t Dgetdrv ( VOID ); +
  +
Assembler: +
  +
move.w    #25,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+
GFA-Basic Fehler%=Gemdos(&H19) +
  + +
+ +

5.15.9 Dgetpath

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »get path« - aktuelles Verzeichnis ermitteln. +
  +
Gemdosnummer: 71 +
  +
Deklaration: int16_t Dgetpath ( int8_t *path, int16_t driveno ); +
  +
Beschreibung: Die GEMDOS-Routine Dgetpath ermittelt das aktuelle Verzeichnis +auf dem Laufwerk driveno. Die Bezeichnungen der Laufwerke +werden im Parameter driveno wie folgt codiert: +
  + + + + + + + + + + + + + + + + + + +
driveno Bedeutung +
    +
0 aktuelles Laufwerk +
1 Laufwerk-A +
2 Laufwerk-B +
3 Laufwerk-C (usw.) + +
+ +
Der Pfad wird im Puffer path als String abgelegt. Da die +maximale Länge eines Pfades im GEMDOS nicht begrenzt, und nur bei +Existenz der Funktion Dpathconf ermittelt werden kann, sollte der +aufnehmende Puffer ausreichend Platz bieten (256 Bytes dürften wohl +ausreichend sein). +
  +
Ergebnis: Die Funktion liefert folgende Resultate: +
  +

+
+ + + + + + + + + + +
E_OK:kein Fehler aufgetreten
EDRIVE:falsche Laufwerksnummer
+
+ +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Verzeichnisfunktionen +
  +
Querverweis: Binding   Dsetpath +
  + +
+ +

5.15.9.1 Bindings für Dgetpath

+ + + + + + + + + +
C: int16_t Dgetpath ( int8_t *path, int16_t driveno ); +
  +
Assembler: +
  +
move.w    driveno,-(sp)  ; Offset 6
+pea       path           ; Offset 2
+move.w    #71,-(sp)      ; Offset 0
+trap      #1             ; GEMDOS aufrufen
+addq.l    #8,sp          ; Stack korrigieren
+
+
GFA-Basic Fehler%=Gemdos(&H47,L;path%,W:driveno%) +
  + +
+ +

5.15.10 Dlock

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dlock« - sperrt ein BIOS Gerät bzw. gibt es wieder frei. +
  +
Gemdosnummer: 309 +
  +
Deklaration: int32_t Dlock ( int16_t mode, int16_t drv ); +
  +
Beschreibung: Die Funktion erlaubt es, das BIOS-Gerät drv zu +sperren, bzw. wieder freizugeben. Auf einem gelockten Laufwerk sind +keine GEMDOS File-Operationen zugelassen; Rwabs ist nur für den +sperrenden Prozess erlaubt. +
  +
Der Sinn und Zweck der Funktion besteht darin, daß Low-Level +Programme (etwa zum Formatieren) (X)BIOS Funktionen ausführen +können, während das Gerät für normale Dateizugriffe gesperrt +bleibt. +
  +

+
+ + + + + + + + +
Bit 0 von mode = 1:Gerät sperren
= 0:Gerät freigeben
+
+ +
Wird ein Prozeß beendet der noch eine Sperre auf einem Gerät +hält, so wird diese Sperre aufgehoben. +
  +
Bit 1 von mode zeigt an, welche Rückgabewerte +gewünscht sind. Ist dieses Bit gesetzt, und das entsprechende Gerät +bereits von einem anderen Prozeß gesperrt (oder hat ein anderer +Prozeß Files auf diesem Gerät geöffnet), dann wird dessen +Prozeß-ID zurückgeliefert. Dies erlaubt sinnvollere Fehlermeldungen +an den Benutzer, da nun mitgeteilt werden kann, welcher Prozeß das +Gerät benutzt, wenn das Sperren fehlschlagen sollte. +
  +
Alle anderen Bits von mode sind reserviert und müssen +auf 0 gesetzt werden. +
  +
Ein Sperren eines Gerätes mit unmittelbar folgendem Freigeben +desselben, ist einem Medienwechsel sehr ähnlich. Zu beachten ist +lediglich, daß nicht gesperrt werden kann, wenn auf dem angegebenen +Gerät noch Dateien geöffnet sind. +
  +
Hinweis für MagiC: Vor Sperren des Laufwerks werden, +falls ein Dateisystem für das Laufwerk existiert, die Caches über +den Vektor xfs_sync zurückgeschrieben. Dann stellt der Kernel über +xfs_drv_close eine Anfrage, ob das Laufwerk gesperrt werden kann. Wenn +ja, gibt das XFS seine Strukturen frei und signalisiert dann dem +Kernel, daß auch er seine Strukturen für das Laufwerk freigeben und +die Sperrung durchführen kann. +
  +
Ergebnis: Die Funktion kann die folgenden Werte zurückliefern: +
  + + + + + + + + + + + + + + + +
E_OK : kein Fehler aufgetreten. +
EACCDN : Gerät konnte nicht gesperrt werden, da offene Dateien bzw. +Verzeichnisse vorhanden sind. +
EDRIVE : drv ist kein gültiges BIOS-Gerät. +
ELOCKED : Gerät ist bereits von einem Prozeß gesperrt. +
ENSLOCK : Gerät ist bereits freigegeben. + +
+ +
Verfügbar: Verfügbar, wenn ein 'MiNT' Cookie mit einer Versionsnummer von +mindestens 0.93 existiert und in MagiC ab Version 3.0. +
  +
Gruppe: Verzeichnisfunktionen +
  +
Querverweis: Binding   Fxattr   XFS-Konzept in MagiC +
  + +
+ +

5.15.10.1 Bindings für Dlock

+ + + + + + +
C: int32_t Dlock ( int16_t mode, int16_t drv ); +
  +
Assembler: +
  +
move.w    drv,-(sp)    ; Offset 4
+move.w    mode,-(sp)   ; Offset 2
+move.w    #309,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

5.15.11 Dopendir

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dopendir« - öffnet ein Verzeichnis zum Lesen. +
  +
Gemdosnummer: 296 +
  +
Deklaration: int32_t Dopendir ( int8_t *name, int16_t flag ); +
  +
Beschreibung: Die Funktion öffnet das Verzeichnis name zum Lesen. +Der Parameter name muß NULL-terminiert sein und darf keinen +abschließenden Backslash enthalten. Der Parameter flag +beschreibt die Art und Weise, wie das Verzeichnis geöffnet werden +soll: +
  + + + + + + + + + + + + +
flag Bedeutung +
    +
0 Normalmodus +
In diesem Modus wird versucht, die Länge von Dateinamen nicht zu +begrenzen. Darüber hinaus gibt Dreaddir in diesem Modus eine +Indexnummer (ähnlich den UNIX inode's) in den ersten 4 Bytes des +Dateinamens zurück. +
1 Kompatibilitätsmodus +
In diesem Modus verhalten sich Dateisysteme so, als würden +Fsfirst- bzw. Fsnext-Aufrufe benutzt. Insbesondere werden Dateinamen +nach DOS-Konvention auf 8+3 Zeichen verkürzt, wenn dies möglich ist. + +
+ +
Neuere Programme sollten nach Möglichkeit immer den Normalmodus +benutzen, um die volle Funktionalität zu nutzen. +
  +
Ergebnis: Die Funktion liefert im Erfolgsfall eine 32bit +Verzeichnis-Handle. Diese darf auch negativ sein, enthält aber auf +keinen Fall den Wert 0xff im obersten Byte, wodurch es von Fehlern +unterschieden werden kann. +
  +
Im Fehlerfall sind folgende Rückgabewerte möglich: +
  + + + + + + + + + +
EPTHNF : name ist kein gültiges Verzeichnis +
EACCDN : Das Verzeichnis ist von diesem Programm nicht ansprechbar. +
ENSMEM : Der Kernel kann für diese Operation keinen Speicher +allozieren. + +
+ +
Verfügbar: Verfügbar, wenn ein 'MiNT' Cookie mit einer Versionsnummer von +mindestens 0.90 existiert und in MagiC ab Version 3.0. +
  +
Gruppe: Verzeichnisfunktionen +
  +
Querverweis: Binding   Dclosedir   Dreaddir   Drewinddir   Pdomain +
  + +
+ +

5.15.11.1 Bindings für Dopendir

+ + + + + + +
C: int32_t Dopendir ( int8_t *name, int16_t flag ); +
  +
Assembler: +
  +
move.w    flag,-(sp)   ; Offset 6
+pea       name         ; Offset 2
+move.w    #296,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #8,sp        ; Stack korrigieren
+
+ +
+ +

5.15.12 Dpathconf

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dpathconf« - Informationen über ein Filesystem ermitteln. +
  +
Gemdosnummer: 292 +
  +
Deklaration: int32_t Dpathconf ( BYTE *name, int16_t mode ); +
  +
Beschreibung: Die Funktion ermöglicht es Informationen über das Filesystem, +welches die Datei name enthält, zu ermitteln. +
  +
Der Parameter mode gibt an, welche Möglichkeiten bzw. +Einschränkungen des Filesystems erfragt werden sollen. Mögliche +Werte sind hier: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
mode Bedeutung +
  +
    +
  +
-1: max. erlaubter Wert für Dpathconf selbst. +
  + +
DP_IOPEN (0): max. Anzahl der geöffneten Dateien. +
  + +
DP_MAXLINKS (1): max. Anzahl der Verweise (Links) auf eine Datei. +
  + +
DP_PATHMAX (2): max. Länge des vollen Pfadnamens. +
  + +
DP_NAMEMAX (3): max. Länge eines Dateinamens. +
  + +
DP_ATOMIC (4): Anzahl der Bytes, die auf einmal geschrieben werden können. +
  + +
DP_TRUNC (5): Informationen über das Kürzen von Dateinamen: +
  + + + + + + + + + +
0 = Dateinamen werden nicht gekürzt. Wenn bei einem Systemaufruf +die Länge des maximalen Dateinamens überschritten wird, wird der +Wert ERANGE zurückgeliefert. +
1 = Dateinamen werden automatisch auf die maximal mögliche Länge +verkürzt. +
2 = Dateinamen werden nach DOS-Konvention gekürzt. (also: 8 +Zeichen Name, 3 Zeichen Extension). + +
+ + +
DP_CASE (6): Informationen über Groß-/Kleinschreibung: +
  + + + + + + + + + +
0 = Unterscheidung zwischen Groß-/Kleinschreibung. +
1 = keine Unterscheidung zwischen Groß-/Kleinschreibung (alle +Zeichen werden entweder in Groß-, oder in Kleinbuchstaben +umgewandelt). +
2 = keine Unterscheidung zwischen Groß-/Kleinschreibung. Das +Dateisystem speichert aber Pfad- und Dateinamen mit den Originalwerten +ab. +
Beispiel: Die angezeigte Datei 'HelloWorld' kann auch über +'HELLOWorld' oder 'HeLLoWORLD' angesprochen werden. + +
+ + + +
DP_MODEATTR (7): Informationen über Modus-Bits einer Datei: +
  +
Dieser Modus liefert Informationen über die Gültigkeit der in +den Feldern mode und attr der XATTR Struktur +definierten Werte. Die Bits 0..5 beschreiben welche Flags der +Komponente attr gültig sind. Dabei gilt: +
  + + + + + + + + + + + + + + + + + + +
FA_RDONLY (0x01): wird nur gesetzt wenn die Leseberechtigung über dieses Bit +gesteuert wird, und nicht, wenn es über die Bedeutung der +mode-Bits emuliert wird. +
FA_HIDDEN (0x02):   +
FA_SYSTEM (0x04): wird gesetzt, wenn das Filesystem diese speziellen Attribute +unterstützt (normalerweise nur bei DOS Filesystemen der Fall). +
FA_LABEL (0x08): wird gesetzt, wenn das Filesystem-Label per Fsfirst/Fsnext +ermittelt werden kann. +
FA_DIR (0x10): reserviert. Um zu entscheiden, ob es sich um einen Ordner auf +dem Filesystem handelt, sollte auf die Datei-Typ-Bits (s.u.) +zurückgegriffen werden. +
FA_CHANGED (0x20): wird gesetzt, wenn das Filesystem den Begriff des Archiv-Bits +kennt, und das attr-Feld für diesen Zweck benutzt wird. + +
+ +
Die Bits 6 und 7 sind reserviert. In den Bits 8..19 werden +Informationen darüber abgelegt, ob die unteren 12-Bits der +mode-Komponente gültig sind. Die Bits 20..27 beschreiben, +welche Dateitypen von dem Filesystem unterstützt werden. Dabei gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
DP_FT_DIR (0x00100000L): Ordner +
DP_FT_CHR (0x00200000L): spezielle Character-Files +
DP_FT_BLK (0x00400000L): spezielle Block-Files (z.Zt. unbenutzt) +
DP_FT_REG (0x00800000L): Reguläre Dateien +
DP_FT_LNK (0x01000000L): Symbolische Links +
DP_FT_SOCK (0x02000000L): Sockets (z.Zt. unbenutzt) +
DP_FT_FIFO (0x04000000L): Pipes +
DP_FT_MEM (0x08000000L): Shared Memory oder Prozess Dateien + +
+ +
Die Bits 28..31 sind reserviert. +
  + + +
DP_XATTRFIELDS (8): Informationen über erweiterte Attribute: +
  +
In diesem Modus wird eine Bit-Maske der unterstützten (in der +XATTR-Struktur angegebenen) Felder zurückgeliefert. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DP_INDEX (0x0001): Index-Feld für jede Datei auf dem Filesystem +eindeutig +
DP_DEV (0x0002): Gerätenummer +
DP_RDEV (0x0004): rdev-Feld gültig, und nicht zum dev-Feld +identisch +
DP_NLINK (0x0008): Anzahl der Links +
DP_UID (0x0010): Benutzernummer +
DP_GID (0x0020): Gruppennummer +
DP_BLKSIZE (0x0040): Blockgröße +
DP_SIZE (0x0080): Dateilänge +
DP_NBLOCKS (0x0100): Anzahl der Blöcke +
DP_ATIME (0x0200): Zeit des letzten Zugriffs +
DP_CTIME (0x0400): Zeit der Dateierstellung +
DP_MTIME (0x0800): Zeit der letzten Änderung + +
+ +
Alle anderen Bits sind für zukünftige Zwecke reserviert. +
  + +
DP_VOLNAMEMAX (9): maximum length of a volume name (0 if volume names not +supported) +
  + +
+ +
Ein Rückgabewert von 0x7fffffff (2^31 -1) bedeutet, daß es +für die erfragte Komponente keine Beschränkung gibt. +
  +
Hinweis: In MagiC kann die Funktion auch auf +Dateien angewendet werden. Der Dateiname wird jedoch in diesem +Fall ignoriert, d.h. nur der Pfad wird ausgewertet. Die Funktion +sollte in MagiC ggf. nach Dopendir aufgerufen werden, da Dpathconf +keine Diskwechsel erkennt (Grund: wenn der Pfad noch im Cache ist, +wird kein Diskzugriff durchgeführt, und daher kein +Diskwechsel erkannt). +
  +
Ergebnis: Die Funktion liefert die Eigenschaften/Einschränkungen des +Filesystems bzgl. des Parameters mode zurück (s.o.). +
  +
Verfügbar: Seit der ersten in MultiTOS integrierten MiNT Version 1.04 und +in MagiC ab Version 3.0. +
  +
Gruppe: Verzeichnisfunktionen +
  +
Querverweis: Binding Sysconf   XFS-Konzept in MagiC   Test auf Pipes +
  + +
+ +

5.15.12.1 Bindings für Dpathconf

+ + + + + + +
C: int32_t Dpathconf ( BYTE *name, int16_t mode ); +
  +
Assembler: +
  +
move.w    mode,-(sp)   ; Offset 6
+pea       name         ; Offset 2
+move.w    #292,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #8,sp        ; Stack korrigieren
+
+ +
+ +

5.15.13 Dreaddir

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dreaddir« - Verzeichnis Informationen lesen. +
  +
Gemdosnummer: 297 +
  +
Deklaration: int32_t Dreaddir ( int16_t len, int32_t dirhandle, int8_t *buf +); +
  +
Beschreibung: Die Funktion liefert die nächste Datei im Verzeichnis +dirhandle zurück. Der Dateiname und ein optionaler 4Byte +Index für die Datei, werden in buf geschrieben. +
  +
Der Dateiindex wird weggelassen, wenn das Verzeichnis im +Kompatibilitätsmodus geöffnet wurde, anderenfalls erscheint er als +erstes in buf, gefolgt von einem (nullterminierten) +Dateinamen. +
  +
(Ggfs. unterschiedliche) Namen mit gleichem Index, gehören zur +selben Datei. (Ggfs gleiche) Namen mit unterschiedlichem Index +gehören zu verschiedenen Dateien. +
  +
Hinweis für MagiC: Für FAT-Dateisysteme liefert die +Funktion die folgenden Index-Daten: +
  +
    +
  • Verzeichnisse: Startcluster im Motorola-Format +
  • +
  • sonstige Dateien: + + + + + + +
    Hiword = Startcluster des Verzeichnisses +
    Loword = Position innerhalb des Verzeichnisses >> 5 + +
    + +
  • +
+ +
Dieses Verfahren ist ähnlich wie das, welches Linux und Solaris +verwenden. Nachteil ist, daß Dateien beim Verschieben ihren Index +ändern. +
  +
In len muß die Größe des aufnehmenden Puffers +angegeben werden. +
  +
Ergebnis: Die Funktion kann folgende Rückgabewerte liefern: +
  + + + + + + + + + +
E_OK : kein Fehler aufgetreten. +
ENMFIL : keine weiteren Dateien vorhanden. +
ERANGE : Die Pufferlänge ist nicht ausreichend. + +
+ +
Verfügbar: Verfügbar, wenn ein 'MiNT' Cookie mit einer Versionsnummer von +mindestens 0.90 existiert und in MagiC ab Version 3.0. +
  +
Gruppe: Verzeichnisfunktionen +
  +
Querverweis: Binding   Dclosedir   Dopendir   Drewinddir   Dxreaddir +
  + +
+ +

5.15.13.1 Bindings für Dreaddir

+ + + + + + +
C: int32_t Dreaddir ( int16_t len, int32_t dirhandle, int8_t *buf +); +
  +
Assembler: +
  +
pea       buf          ; Offset 8
+move.l    dirhandle    ; Offset 4
+move.w    len          ; Offset 2
+move.w    #297,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+lea       $C(sp),sp    ; Stack korrigieren
+
+ +
+ +

5.15.14 Dreadlabel

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dreadlabel« - Filesystem Label lesen. +
  +
Gemdosnummer: 338 (0x0152) +
  +
Deklaration: int32_t Dreadlabel ( CONST int8_t *path, int8_t *label, int16_t +length ); +
  +
Beschreibung: Die Funktion liefert in label den Namen des auf +path liegenden Filesystems zurück. Der Parameter +length gibt die Größe des aufnehmendes Puffers label +an. +
  +
Ergebnis: Die Funktion kann folgende Rückgabewerte liefern: +
  + + + + + + +
E_OK : kein Fehler aufgetreten +
ENAMETOOLONG : Der Name des Filesystems ist länger als die Größe des +aufnehmenden Puffers. + +
+ +
Verfügbar: MagiC ab Version 3.0, ab MiNT 1.12 +
  +
Gruppe: Verzeichnisfunktionen +
  +
Querverweis: Binding   Dwritelabel   XFS-Konzept in MagiC +
  + +
+ +

5.15.14.1 Bindings für Dreadlabel

+ + + + + + +
C: int32_t Dreadlabel ( CONST int8_t *path, int8_t *label, int16_t +length ); +
  +
Assembler: +
  +
move.w    length,-(sp)  ; Offset 10
+pea       label         ; Offset  6
+pea       path          ; Offset  2
+move.w    #338,-(sp)    ; Offset  0
+trap      #1            ; GEMDOS aufrufen
+lea       $C(sp),sp     ; Stack korrigieren
+
+ +
+ +

5.15.15 Drewinddir

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Drewinddir« - geöffnetes Verzeichnis zurücksetzen. +
  +
Gemdosnummer: 298 +
  +
Deklaration: int32_t Drewinddir ( int32_t handle ); +
  +
Beschreibung: Die Funktion setzt das Verzeichnis handle auf den +Anfang zurück, so daß der nächste Aufruf von Dreaddir wieder den +ersten Eintrag im Verzeichnis liest. +
  +
Ergebnis: Die Funktion kann folgende Rückgabewerte liefern: +
  + + + + + + + + + +
E_OK : kein Fehler aufgetreten. +
EINVFN : Verzeichnis kann nicht zurückgesetzt werden. +
EBADF : Das Verzeichnis handle ist nicht geöffnet. + +
+ +
Verfügbar: Verfügbar, wenn ein 'MiNT' Cookie mit einer Versionsnummer von +mindestens 0.90 existiert und in MagiC ab Version 3.0. +
  +
Gruppe: Verzeichnisfunktionen +
  +
Querverweis: Binding   Dopendir   Dreaddir +
  + +
+ +

5.15.15.1 Bindings für Drewinddir

+ + + + + + +
C: int32_t Drewinddir ( int32_t handle ); +
  +
Assembler: +
  +
move.l    handle,-(sp)  ; Offset 2
+move.w    #298,-(sp)    ; Offset 0
+trap      #1            ; GEMDOS aufrufen
+addq.l    #6,sp         ; Stack korrigieren
+
+ +
+ +

5.15.16 Dsetdrv

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »disk set drive« - legt das aktuelle Laufwerk fest und +liefert eine Bitmap sämtlicher gemounteter Laufwerke. +
  +
Gemdosnummer: 14 +
  +
Deklaration: int32_t Dsetdrv ( int16_t drv ); +
  +
Beschreibung: Die GEMDOS-Routine Dsetdrv macht das Laufwerk drv zum +aktuellen Laufwerk. Es gilt: +
  + + + + + + + + + + + + + + + +
drv Bedeutung +
    +
0 Laufwerk A +
1 Laufwerk B +
2 Laufwerk C (usw.) + +
+ +
Hinweis: Eine falsche Laufwerksnummer kann zu schweren +Schäden in GEMDOS-internen Strukturen führen. Die vom GEMDOS +unterstützten Laufwerke erfragt man am besten wie folgt: +
  +
Dsetdrv (Dgetdrv ());
+
+
Ab MagiC 3 sind Laufwerke von A bis Z, d.h. Werte von 0 bis 25 +zulässig. Es wird nicht überprüft, ob das angegebene Laufwerk +überhaupt existiert. +
  +
GEMDOS 0.30 (TOS 4.00-4.04) gibt für Laufwerke über P +fälschlich EDRIVE zurück! +
  +
Ergebnis: Die Funktion liefert als Ergebnis eine Bit-Tabelle mit allen +angeschlossenen Laufwerken. Jedes angeschlossene Laufwerk wird mit +einem gesetzten Bit angezeigt. +
  +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Verzeichnisfunktionen +
  +
Querverweis: Binding   Dgetdrv   _drvbits +
  + +
+ +

5.15.16.1 Bindings für Dsetdrv

+ + + + + + + + + +
C: int32_t Dsetdrv ( int16_t drv ); +
  +
Assembler: +
  +
move.w    drv,-(sp)    ; Offset 2
+move.w    #14,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+
GFA-Basic Fehler%=Gemdos(&H0E,W:drv%) +
  + +
+ +

5.15.17 Dsetkey

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set key« - Set the key/passphrase for a drive. +
  +
Gemdosnummer: 333 (0x014d) +
  +
Deklaration: int32_t Dsetkey ( int32_t hidev, int32_t lowdev, int8_t *key, +int16_t cipher ); +
  +
Beschreibung: The GEMDOS routine Dsetkey set the key/passphrase for the drive +specified by hidev and lowdev. Drive will be +deferenced if it is an alias. +
  +
The parameter key is a pointer to the new passhrase; if +this is an empty string, ciphering will be disabled for the drive; if +it is a NULL pointer, the function checks the current ciphering mode. +
  +
The parameter cipher specifies the cipher type to use. +Currently, only zero (Blowfish) is supported. Other values are +reserved for future expansion. +
  +
As changing the key directly influences data access, the drive +is Dlock()ed during this process to prevent data loss. +
  +
Ergebnis: If key is NULL, the function returns 0 if ciphering is +disabled on dev, or any other value if ciphering is enabled. +
  +
If key is not NULL, the following return values are +possible: +
  + + + + + + + + + + + + +
E_OK No error has arisen +
EDRIVE Drive is invalid +
EINVAL Cipher is invalid +
Otherwise Any GEMDOS error code returned by Dlock() + +
+ +
Verfügbar: Sie steht ab FreeMiNT 1.15.4 zur Verfügung. +
  +
Gruppe: Verzeichnisfunktionen +
  +
Querverweis: Binding +
  + +
+ +

5.15.17.1 Bindings für Dsetkey

+ + + + + + + + + +
C: int32_t Dsetkey ( int32_t hidev, int32_t lowdev, int8_t *key, +int16_t cipher ); +
  +
Assembler: +
  +
move.w    cipher,-(sp) ; Offset 14
+pea       key          ; Offset 10
+move.l    lowdev,-(sp) ; Offset 6
+move.l    hidev,-(sp)  ; Offset 2
+move.w    #333,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+lea       16(sp),sp    ; Stack korrigieren
+
+
GFA-Basic Fehler%=Gemdos(&H14D,L:hidev%,L:lowdev%,L:key%,W:cipher%) +
  + +
+ +

5.15.18 Dsetpath

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »set path« - legt das aktuelle Verzeichnis fest. +
  +
Gemdosnummer: 59 +
  +
Deklaration: int16_t Dsetpath ( CONST int8_t *path ); +
  +
Beschreibung: Die GEMDOS-Routine Dsetpath setzt einen neuen Zugriffspfad für +das aktuelle Laufwerk. Der Parameter path enthält den neuen +aktuellen Zugriffspfad für das Laufwerk. +
  +
Hinweis: Für jedes Laufwerk merkt sich GEMDOS das +aktuelle Verzeichnis. Die Funktion Dsetpath sollte aber nur für das +aktuelle Laufwerk benutzt werden. Für andere Laufwerke sollte +hingegen die folgende Methode angewendet werden: +
  +
    +
  • aktuelles Laufwerk ermitteln +
  • +
  • gewünschtes Laufwerk setzen +
  • +
  • Pfad für dieses Laufwerk setzen +
  • +
  • das alte (gemerkte) Laufwerk wieder zum aktuellen machen. +
  • +
+ +
Auf einigen (älteren) Versionen von GEMDOS kann ein zu +häufiges Setzen von nicht existierenden Pfaden zu Störungen in +internen Strukturen führen. +
  +
Ergebnis: Die Funktion liefert folgende Resultate: +
  + + + + + + + + + + + + +
Wert Bedeutung +
    +
E_OK kein Fehler aufgetreten +
EPTHNF Verzeichnis nicht gefunden + +
+ +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Verzeichnisfunktionen +
  +
Querverweis: Binding   Dgetpath +
  + +
+ +

5.15.18.1 Bindings für Dsetpath

+ + + + + + + + + +
C: int16_t Dsetpath ( CONST int8_t *path ); +
  +
Assembler: +
  +
pea       path         ; Offset 2
+move.w    #59,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+
GFA-Basic Fehler%=Gemdos(&H3B,L:path%) +
  + +
+ +

5.15.19 Dwritelabel

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dwritelabel« - Filesystem Label setzen. +
  +
Gemdosnummer: 339 (0x0153) +
  +
Deklaration: int32_t Dwritelabel ( CONST int8_t *path, CONST int8_t *label +); +
  +
Beschreibung: Die Funktion schreibt den in label angegebenen Namen +auf das in path angegebene Filesystem. +
  +
Prior to MiNT version 1.14.5 this call contained a bug that +allowed the label to be changed by all users. +
  +
Ergebnis: E_OK wenn erfolgreich oder einen negativen GEMDOS Fehlercode. +
  +
Verfügbar: MagiC ab Version 3.0, MiNT 1.12 +
  +
Gruppe: Verzeichnisfunktionen +
  +
Querverweis: Binding   Dreadlabel   XFS-Konzept in MagiC +
  + +
+ +

5.15.19.1 Bindings für Dwritelabel

+ + + + + + +
C: int32_t Dwritelabel ( CONST int8_t *path, CONST int8_t *label +); +
  +
Assembler: +
  +
pea       label        ; Offset 6
+pea       path         ; Offset 2
+move.w    #339,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+lea       $A(sp),sp    ; Stack korrigieren
+
+ +
+ +

5.15.20 Dxopendir

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dxopendir« - öffnet ein Verzeichnis zum Lesen. +
  +
Gemdosnummer: 1296 +
  +
Deklaration: int32_t Dxopendir ( int8_t *name, int16_t flag ); +
  +
Beschreibung: Dxopendir ruft das normale Dopendir auf, speichert allerdings +dann das zurückgegebene Handle und Flag in einer verketten Liste so +wissen Dreaddir und Dxreaddir das sie bei diesem Verzeichnis wandeln +müssen. Dcloseddir löscht das Handle wieder aus der Liste. +
  +
Dreaddir und Dxreaddir wandeln den zurück gegebenen Namen in +Kleinbuchstaben. +
  +
Die Funktion öffnet das Verzeichnis name zum Lesen. Der +Parameter flag beschreibt die Art und Weise, wie das +Verzeichnis geöffnet werden soll: +
  + + + + + + + + + + + + +
flag Bedeutung +
    +
0 Normalmodus +
In diesem Modus wird versucht, die Länge von Dateinamen nicht zu +begrenzen. Darüber hinaus gibt Dreaddir in diesem Modus eine +Indexnummer (ähnlich den UNIX inode's) in den ersten 4 Bytes des +Dateinamens zurück. +
1 Kompatibilitätsmodus +
In diesem Modus verhalten sich Dateisysteme so, als würden +Fsfirst- bzw. Fsnext-Aufrufe benutzt. Insbesondere werden Dateinamen +nach DOS-Konvention auf 8+3 Zeichen verkürzt, wenn dies möglich ist. + +
+ +
Neuere Programme sollten nach Möglichkeit immer den Normalmodus +benutzen, um die volle Funktionalität zu nutzen. +
  +
Ergebnis: Die Funktion liefert im Erfolgsfall eine 32bit +Verzeichnis-Handle. Diese darf auch negativ sein, enthält aber auf +keinen Fall den Wert 0xff im obersten Byte, wodurch es von Fehlern +unterschieden werden kann. +
  +
Im Fehlerfall sind folgende Rückgabewerte möglich: +
  + + + + + + + + + +
EPTHNF : name ist kein gültiges Verzeichnis +
EACCDN : Das Verzeichnis ist von diesem Programm nicht ansprechbar. +
ENSMEM : Der Kernel kann für diese Operation keinen Speicher +allozieren. + +
+ +
Verfügbar: Wenn die Systemerweiterung Dir_Lwr (liegt Égale 4.2 bei) +installiert ist. Legt den Cookie 'DYDL' an. +
  +
Gruppe: Verzeichnisfunktionen +
  +
Querverweis: Binding   Dclosedir   Dreaddir   Drewinddir   Pdomain +
  + +
+ +

5.15.20.1 Bindings für Dxopendir

+ + + + + + +
C: int32_t Dxopendir ( int8_t *name, int16_t flag ); +
  +
Assembler: +
  +
move.w    flag,-(sp)   ; Offset 6
+pea       name         ; Offset 2
+move.w    #1296,-(sp)  ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #8,sp        ; Stack korrigieren
+
+ +
+ +

5.15.21 Dxreaddir

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dxreaddir« - Verzeichnis Informationen lesen. +
  +
Gemdosnummer: 322, (0x142) +
  +
Deklaration: int32_t Dxreaddir ( int16_t ln, int32_t dirh, int8_t *buf, +XATTR *xattr, int32_t *xr ); +
  +
Beschreibung: Die Funktion liefert die nächste Datei aus dem Verzeichnis mit +dem Handle dirh. Der Dateiname und der optionale 4 Bytes +große Dateiindex werden in dem durch buf spezifizierten +Puffer abgelegt. +
  +
Der Dateiindex wird weggelassen, wenn bei Dopendir der +Kompatibilitätmodus angegeben wurde. Wenn zwei Dateinamen den +gleichen Index besitzen, stehen sie für die selbe Datei. +
  +
MagiC liefert für FAT-Dateisysteme die folgenden Index-Daten: +
  +
    +
  • Verzeichnisse: Startcluster im Motorola-Format +
  • +
  • sonstige Dateien: + + + + + + +
    Hiword = Startcluster des Verzeichnisses +
    Loword = Position innerhalb des Verzeichnisses >> 5 + +
    + +
  • +
+ +
Dieses Verfahren ist ähnlich wie das, welches Linux und Solaris +verwenden. Nachteil ist, daß Dateien beim Verschieben ihren Index +ändern. +
  +
Der Parameter ln gibt die Länge des aufnehmendes +Puffers buf an. Die erweiterten Dateiattribute werden analog +zu Fxattr in der Struktur xattr abgelegt, wobei symbolische +Links nicht aufgelöst werden. +
  +
Hinweis: Dieser Teil des Aufrufs kann fehlschlagen, +obwohl der Dateiname lesbar war. In diesem Fall wird ein getrennter +Returncode in dem long-Wert abgelegt, auf das der Parameter xr +zeigt. +
  +
Ergebnis: Die Funktion kann folgende Rückgabewerte liefern: +
  + + + + + + + + + +
E_OK : kein Fehler aufgetreten. +
ENMFIL : keine weiteren Dateien gefunden. +
ERANGE : der aufnehmende Puffer ist nicht groß genug. + +
+ +
Verfügbar: MagiC ab Version 3.0, ab MiNT 1.11 +
  +
Gruppe: Verzeichnisfunktionen +
  +
Querverweis: Binding   Dreaddir   Dopendir   Dclosedir   Drewinddir +
  + +
+ +

5.15.21.1 Bindings für Dxreaddir

+ + + + + + +
C: int32_t Dxreaddir ( int16_t ln, int32_t dirh, int8_t *buf, +XATTR *xattr, int32_t *xr ); +
  +
Assembler: +
  +
pea       xr           ; Offset 16
+pea       xattr        ; Offset 12
+pea       buf          ; Offset  8
+move.l    dirh         ; Offset  4
+move.w    ln           ; Offset  2
+move.w    #322,-(sp)   ; Offset  0
+trap      #1           ; GEMDOS aufrufen
+lea       $14(sp),sp   ; Stack korrigieren
+
+ +
+ +
+ +Home +GEMDOSGEMDOS +SystemfunktionenSystemfunktionen +Zeichenweise Ein-/AusgabeZeichenweise Ein-/Ausgabe + + diff --git a/de/gemdos_errors.html b/de/gemdos_errors.html new file mode 100644 index 000000000..8a9ba921c --- /dev/null +++ b/de/gemdos_errors.html @@ -0,0 +1,948 @@ + + + + + +Die Anleitung zum TOS: GEMDOS-Fehlermeldungen + + + + + + + + + +Home +GEMDOSGEMDOS +Unterstützung fremder DateisystemeUnterstützung fremder Dateisysteme +Pipes, Test aufPipes, Test auf + +
+ +

5.3 GEMDOS-Fehlermeldungen

+

Fehler werden von GEMDOS als negative LONG-Werte gemeldet. Die +folgende Liste enthält alle bekannten Fehlermeldungen: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Nr. Bezeichnung Bedeutung +
    + +
  0 E_OK Ok. Kein Fehler aufgetreten. + +
-32 EINVFN Unbekannte Funktionsnummer. + +
-33 EFILNF Datei nicht gefunden. + +
-34 EPTHNF Verzeichnis (Ordner) nicht gefunden. + +
-35 ENHNDL Keine Datei-Handles mehr verfügbar. + +
-36 EACCDN Zugriff nicht erlaubt. + +
-37 EIHNDL Datei-Handle war nicht korrekt. + +
-39 ENSMEM Speicher reicht nicht aus. + +
-40 EIMBA Adresse des Speicherblocks ungültig. + +
-46 EDRIVE Laufwerksbezeichnung ungültig. + +
-47 ECWD Aktuelles Verzeichnis kann nicht gelöscht werden. + +
-48 ENSAME Dateien auf versch. logischen Laufwerken. + +
-49 ENMFIL Es können keine Dateien mehr geöffnet werden. + +
-58 ELOCKED Bereich einer Datei ist geschützt (Netzwerk). + +
-59 ENSLOCK Angegebenes Locking existiert nicht. + +
-64 ERANGE Dateizeiger in ungültigem Bereich. (siehe auch FreeMiNT +Meldung -88) + +
-65 EINTRN Interner Fehler des GEMDOS. + +
-66 EPLFMT Ungültiges Programm-Format. + +
-67 EGSBF Allozierter Speicherblock konnte nicht vergrößert werden. + +
-68 EBREAK Programm-Abbruch durch Control-C. + +
-69 EXCPT 68000er Exception (Bomben). + +
-70 EPTHOV Pfad Überlauf. + +
-80 ELOOP Zu tief verschachtelte symbolische Links, evtl. Endlosschleife. + +
-81 EPIPE Write to broken pipe. + +
+ +

Unter FreeMiNT sind einige Fehlermeldungen mehr vorhanden bzw. +wurden die Werte angepasst. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Nr. Bezeichnung Bedeutung +
    + +
  -1 EERROR Generic error. + +
  -2 EBUSY Resource busy. + +
  -3 EUKCMD Unknown command. + +
  -4 ECRC CRC error. + +
  -5 EBADR Bad request. + +
  -6 ESPIPE Illegal seek. + +
  -7 EMEDIUMTYPE Wrong medium type. + +
  -8 ESECTOR Sector not found. + +
 -10 EWRITE Write fault. + +
 -12 EGENERIC General mishap. + +
 -13 EROFS Write protected. + +
 -14 ECHMEDIA Media change. + +
 -15 ENODEV No such device. + +
 -16 EBADSEC Bad sectors found. + +
 -17 ENOMEDIUM No medium found. + +
 -20 ESRCH No such process. + +
 -21 ECHILD No child processes. + +
 -22 EDEADLK Resource deadlock would occur. + +
 -23 ENOTBLK Block device required. + +
 -24 EISDIR Is a directory. + +
 -25 EINVAL Invalid argument. + +
 -26 EFTYPE Inappropriate file type or format. + +
 -27 EILSEQ Illegal byte sequence. + +
 -32 ENOSYS Function not implemented. + +
 -33 ENOENT No such file or directory. + +
 -34 ENOTDIR Not a directory. + +
 -35 EMFILE Too many open files. + +
 -36 EACCES Permission denied. + +
 -37 EBADF Bad file descriptor. + +
 -38 EPERM Operation not permitted. + +
 -39 ENOMEM Cannot allocate memory. + +
 -40 EFAULT Bad address. + +
 -46 ENXIO No such device or address. + +
 -48 EXDEV Cross-device link. + +
 -49 ENMFILES No more matching file names. + +
 -50 ENFILE File table overflow. +
 -58 ELOCKED Locking conflict. +
 -59 ENSLOCK No such lock. + +
 -64 EBADARG Bad argument. + +
 -65 EINTERNAL Internal error. + +
 -66 ENOEXEC Invalid executable file format. + +
 -67 ESBLOCK Memory block growth failure. +
 -68 EBREAK Aborted by user. +
 -69 EXCPT Terminated with bombs. + +
 -70 ETXTBSY Text file busy. + +
 -71 EFBIG File too big. +
 -80 ELOOP Too many symbolic links. +
 -81 EPIPE Broken pipe. + +
 -82 EMLINK Too many links. + +
 -83 ENOTEMPTY Directory not empty. + +
 -85 EEXIST File exists. + +
 -86 ENAMETOOLONG Name too long. + +
 -87 ENOTTY Not a tty. +
 -88 ERANGE Range error. + +
 -89 EDOM Domain error. + +
 -90 EIO I/O error + +
 -91 ENOSPC No space left on device. +
 -92 reserved for TraPatch. +
 -93 reserved for TraPatch. +
 -94 reserved for TraPatch. +
 -95 reserved for TraPatch. +
 -96 reserved for TraPatch. +
 -97 reserved for TraPatch. +
 -98 reserved for TraPatch. +
 -99 reserved for TraPatch. + +
-100 EPROCLIM Too many processes for user. + +
-101 EUSERS Too man y users. + +
-102 EDQUOT Quota exceeded. + +
-103 ESTALE Stale NFS file handle. + +
-104 EREMOTE Object is remote. + +
-105 EBADRPC RPC struct is bad. + +
-106 ERPCMISMATCH RPC version wrong. + +
-107 EPROGUNAVAIL RPC program not available. + +
-108 EPROGMISMATCH RPC program version wrong. + +
-109 EPROCUNAVAIL RPC bad procedure for program. + +
-110 ENOLCK No locks available. + +
-111 EAUTH Authentication error. + +
-112 ENEEDAUTH Need authenticator. + +
-113 EBACKGROUND Inappropriate operation for background process. + +
-114 EBADMSG Not a data message. + +
-115 EIDRM Identifier removed. + +
-116 EMULTIHOP Multihop attempted. + +
-117 ENODATA No data available. + +
-118 ENOLINK Link has been severed. + +
-119 ENOMSG No message of desired type. + +
-120 ENOSR Out of streams resources. + +
-121 ENOSTR Device not a stream. + +
-122 EOVERFLOW Value too large for defined data type. + +
-123 EPROTO Protocol error. + +
-124 ETIME Timer expired. + +
-125 E2BIG Argument list too long. + +
-126 ERESTART Interrupted system call should be + +
-127 ECHRNG Channel number out of range. + +
-128 EINTR Interrupted function call. + +
-129 ESNDLOCKED Sound system is already locked. + +
-130 ESNDNOTLOCK Sound system is not locked. + +
-131 EL2NSYNC Level 2 not synchronized. + +
-132 EL3HLT Level 3 halted. + +
-133 EL3RST Level 3 reset. + +
-134 ELNRNG Link number out of range. + +
-135 EUNATCH Protocol driver not attached. + +
-136 ENOCSI No CSI structure available. + +
-137 EL2HLT Level 2 halted. + +
-138 EBADE Invalid exchange. + +
-139 EXFULL Exchange full. + +
-140 ENOANO No anode. + +
-141 EBADRQC Invalid request code. + +
-142 EBADSLT Invalid slot. + +
-143 EBFONT Bad font file format. + +
-144 ENONET Machine is not on the network. + +
-145 ENOPKG Package is not installed. + +
-146 EADV Advertise error. + +
-147 ESRMNT Srmount error. + +
-148 ECOMM Communication error on send. + +
-149 EDOTDOT RFS specific error. + +
-150 ELIBACC Cannot access a needed shared library. + +
-151 ELIBBAD Accessing a corrupted shared library. + +
-152 ELIBSCN .lib section in a.out corrupted. + +
-153 ELIBMAX Attempting to link too many shared libraries. + +
-154 ELIBEXEC Cannot exec a shared library directly. + +
-155 ESTRPIPE Streams pipe error. + +
-156 EUCLEAN Structure needs cleaning. + +
-157 ENOTNAM Not a XENIX named type file. + +
-158 ENAVAIL NO XENIX semaphores available. + +
-159 EREMOTEIO Remote I/O error. + +
-200 EMOUNT Mount point crossed (indicator) + +
-300 ENOTSOCK Socket operation on non-socket. + +
-301 EDESTADDRREQ Destination address required. + +
-302 EMSGSIZE Message too long. + +
-303 EPROTOTYPE Protocol wrong type for socket. + +
-304 ENOPROTOOPT Protocol not available. + +
-305 EPROTONOSUPPORT Protocol not supported. + +
-306 ESOCKTNOSUPPORT Socket type not supported. + +
-307 EOPNOTSUPP Operation not supported. + +
-308 EPFNOSUPPORT Protocol family not supported. + +
-309 EAFNOSUPPORT Address family not supported by protocol. + +
-310 EADDRINUSE Address already in use + +
-311 EADDRNOTAVAIL Cannot assign requested address. + +
-312 ENETDOWN Network is down. + +
-313 ENETUNREACH Network is unreachable. + +
-314 ENETRESET Network dropped conn. because of reset. + +
-315 ECONNABORTED Software caused connection abort. + +
-316 ECONNRESET Connection reset by peer. + +
-317 EISCONN Socket is already connected. + +
-318 ENOTCONN Socket is not connected. + +
-319 ESHUTDOWN Cannot send after shutdown. + +
-320 ETIMEDOUT Connection timed out. + +
-321 ECONNREFUSED Connection refused. + +
-322 EHOSTDOWN Host is down. + +
-323 EHOSTUNREACH No route to host. + +
-324 EALREADY Operation already in progress. + +
-325 EINPROGRESS Operation now in progress. + +
-326 EAGAIN Operation would block. + +
-326 EWOULDBLOCK siehe EAGAIN + +
-327 ENOBUFS No buffer space available. + +
-328 ETOOMANYREFS Too many references. + +
+ +

Querverweis: Fehlermeldungen in MagiC   BIOS und XBIOS Fehlermeldungen +

+
+ +Home +GEMDOSGEMDOS +Unterstützung fremder DateisystemeUnterstützung fremder Dateisysteme +Pipes, Test aufPipes, Test auf + + diff --git a/de/gemdos_file.html b/de/gemdos_file.html new file mode 100644 index 000000000..8e935dc4f --- /dev/null +++ b/de/gemdos_file.html @@ -0,0 +1,5685 @@ + + + + + +Die Anleitung zum TOS: Dateifunktionen + + + + + + + + + +Home +GEMDOSGEMDOS +gemdos-Trapgemdos-Trap +Datum und UhrzeitDatum und Uhrzeit + +
+ +

5.9 Dateifunktionen

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Fattrib    Dateiattribute ändern oder ermitteln. +
Fchdir     Sets the current directory from a file descriptor. +
Fchmod     Berechtigung für Dateizugriffe setzen. +
Fchown     Besitzer einer Datei ändern. +
Fchown16   Besitzer einer Datei ändern. +
Fclose     Datei schließen. +
Fcntl      Kontrolloperationen auf einem File ausführen. +
Fcreate    Datei anlegen. +
Fdatime    Änderungsdatum einer Datei ermitteln oder ändern. +
Fdelete    Datei löschen. +
Fdirfd     Returns a file descriptor from a directory handle. +
Fdup       Dateihandle duplizieren. +
Ffchmod    Berechtigung für eine geöffnete Datei setzen. +
Ffchown    Besitzer einer geöffneten Datei ändern. +
Ffdopendir Opens a directory from a file descriptor. +
Fforce     Umlenken von Ein-/Ausgaben von Standardkanälen. +
Ffstat64   Erweiterte Fileattribute ermitteln. +
Fgetchar   Zeichen aus einer Datei lesen. +
Fgetdta    Diskettenübertragungsadresse ermitteln. +
Finstat    Eingabestatus für ein File festlegen. +
Flink      Link auf ein File erzeugen. +
Flock      File Record sperren oder freigeben. +
Fmidipipe  MIDI Ein-/Ausgabe umlenken. +
Fopen      Datei öffnen. +
Foutstat   Ausgabestatus für ein File festlegen. +
Fpipe      Pipe anlegen. +
Fpoll      Auswählen von Filedeskriptoren. +
Fputchar   Zeichen in ein File ausgeben. +
Fread      Aus Datei lesen. +
Freadlink  Inhalt eines symbolischen Links festlegen. +
Frename    Datei umbenennen. +
Fseek      Zeiger auf bestimmte Position innerhalb einer Datei setzen. +
Fseek64    Zeiger auf bestimmte 64-bit Position innerhalb einer Datei +setzen. +
Fselect    Auswählen von Filedeskriptoren. +
Fsetdta    Diskettenübertragungsadresse ändern. +
Fsfirst    Ersten Eintrag in Verzeichnis suchen. +
Fsnext     Nächsten Eintrag in Verzeichnis suchen. +
Fsymlink   Symbolischen Link auf ein File erzeugen. +
Fstat64    Erweiterte Fileattribute ermitteln. +
Fsync      Synchronisation einer Datei. +
Fwrite     In Datei schreiben. +
Fxattr     Erweiterte Fileattribute ermitteln. + +
+ +

Querverweis: Verzeichnisfunktionen   XBIOS-Laufwerksfunktionen   +Test auf Pipes +

+

5.9.1 Fattrib

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »file attribute« - Dateiattribut ermitteln oder setzen. +
  +
Gemdosnummer: 67 +
  +
Deklaration: int16_t Fattrib ( const int8_t *filename, int16_t wflag, +int16_t attrib ); +
  +
Beschreibung: Die GEMDOS-Routine Fattrib ermittelt oder setzt die Attribute +einer Datei. Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
filename Dateiname der entsprechenden Datei +
wflag + + + + + + +
0 = Attribute auslesen +
1 = Attribute setzen + +
+ + + +
attrib Dateiattribute + + + + + + + + + + + + + + + + + + +
Bit-0: Datei ist schreibgeschützt +
Bit-1: Datei ist versteckt +
Bit-2: Systemdatei +
Bit-3: Diskettenname +
Bit-4: Verzeichnis +
Bit-5: Archiv-Bit + +
+ + +
+ +
Hinweis: Programme sollten nach Möglichkeit auf die +Routinen Fxattr und Fchmod zurückgreifen, da diese leistungsfähiger +als Fattrib sind. +
  +
Ergebnis: Die Funktion liefert folgende Resultate: +
  + + + + + + + + + + + + +
EACCDN : Zugriff verweigert +
EFILNF : Datei nicht gefunden +
EPTHNF : Verzeichnis nicht gefunden +
sonst : die aktuellen Dateiattribute + +
+ +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Dateifunktionen +
  +
Querverweis: Binding   Fxattr +
  + +
+ +

5.9.1.1 Bindings für Fattrib

+ + + + + + + + + +
C: int16_t Fattrib ( const int8_t *filename, int16_t wflag, +int16_t attrib ); +
  +
Assembler: +
  +
move.w    attrib,-(sp) ; Offset 8
+move.w    wflag,-(sp)  ; Offset 6
+pea       filename     ; Offset 2
+move.w    #67,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+lea       $A(sp),sp    ; Stack korrigieren
+
+
GFA-Basic Fehler%=Gemdos(&H43,L:filename%,W:wflag%,W:attrib%) +
  + +
+ +

5.9.2 Fchdir

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Set directory« - Set the current directory from a file +descriptor. +
  +
Gemdosnummer: 385 +
  +
Deklaration: int32_t Fchdir ( int16_t handle ); +
  +
Beschreibung: The GEMDOS routine Fchdir sets the current directory for the +current process from a directory with the ID handle. +
  +
Ergebnis: E_OK = Alles OK oder negative GEMDOS-Fehlernummer. +
  +
Verfügbar: Sie steht ab FreeMiNT 1.17 zur Verfügung. +
  +
Gruppe: Dateifunktionen +
  + +
+ +

5.9.2.1 Bindings für Fchdir

+ + + + + + + + + +
C: int32_t Fchdir ( int16_t handle ); +
  +
Assembler: +
  +
move.w    handle,-(sp) ; Offset 2
+move.w    #385,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #4,sp        ; Stack korrigieren
+
+
GFA-Basic Fehler%=Gemdos(&H181,W:handle%) +
  + +
+ +

5.9.3 Fchmod

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Fchmod« - Berechtigung für Dateizugriffe setzen. +
  +
Gemdosnummer: 306 +
  +
Deklaration: int32_t Fchmod ( int8_t *name, int16_t mode ); +
  +
Beschreibung: Die Funktion ändert die Zugriffsrechte für die Datei +name. Der Parameter mode enthält die neuen +Zugriffsrechte: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Zugriff durchmodeBedeutung
Besitzer der0400Leseberechtigung
Datei0200Schreibberechtigung
 0100Ausführungsrecht
   
Gruppe der0040Leseberechtigung
Datei0020Schreibberechtigung
 0010Ausführungsrecht
   
Alle anderen0004Leseberechtigung
Benutzer0002Schreibberechtigung
 0001Ausführungsrecht
+
+ +
Für ausführbare Dateien gilt: +
  + + + + + + + + + + + + + + + + + + +
mode Bedeutung +
    +
04000 effektive UID des Prozesses auf die UID dessen setzen, der +diesen Prozeß ausführt. +
02000 effektive GID des Prozesses auf die GID dessen setzen, der +diesen Prozeß ausführt. +
01000 Die Datei ist ein Verzeichnis +
Nur der Datei- bzw. Verzeichnis-Eigentümer (oder root) können +Dateien in diesem Verzeichnis löschen. +
???? Die Datei ist ein Shared-Text Programm +
Nach der Abarbeitung wird das Programm nicht aus dem Speicher +entfernt und muß dem entsprechend für eine erneute Bearbeitung nicht +nachgeladen werden. + +
+ +
Hinweis: Nicht alle Filesysteme müssen alle +Möglichkeiten unterstützen. Nicht unterstützte Zugriffsrechte +werden dann ignoriert. Ausführungsrecht für ein Verzeichnis +bedeutet, daß in diesem Verzeichnis nach einem Namen bzw. einer +Namenskomponente gesucht werden darf. +
  +
Ergebnis: Die Funktion kann folgende Rückgabewerte liefern: +
  + + + + + + + + + + + + +
E_OK   : kein Fehler aufgetreten. +
EFILNF : Datei nicht gefunden. +
EPTHNF : Pfad zur Datei nicht gefunden. +
EACCDN : Die EUID des aufrufenden Prozesses unterscheidet sich von der +UID des Dateibesitzers und ist auch nicht die des Kernels (0). + +
+ +
Verfügbar: Verfügbar, wenn ein 'MiNT' Cookie mit einer Versionsnummer von +mindestens 0.90 existiert. +
  +
Gruppe: Dateifunktionen +
  +
Querverweis: Binding   Fattrib   Fxattr   XFS-Konzept in MagiC +
  + +
+ +

5.9.3.1 Bindings für Fchmod

+ + + + + + +
C: int32_t Fchmod ( int8_t *name, int16_t mode ); +
  +
Assembler: +
  +
move.w    mode,-(sp)   ; Offset 6
+pea       name         ; Offset 2
+move.w    #306,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS  aufrufen
+addq.l    #8,sp        ; Stack korrigieren
+
+ +
+ +

5.9.4 Fchown

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Fchown« - Eigentümer/Gruppenkennungen ändern. +
  +
Gemdosnummer: 305 +
  +
Deklaration: int32_t Fchown ( int8_t *name, int16_t uid, int16_t gid ); +
  +
Beschreibung: Die Funktion ändert die Benutzer-/Gruppenkennung der Datei +name, die wiederum die Zugriffsrechte der Datei regeln. +
  +
Dieser Aufruf kann nur von einem Prozeß erfolgen der eine +effektive Benutzerkennung (EUID) hat, die 0 ist, oder die der UID der +Datei entspricht. Im letzteren Fall muß die neue UID der alten +entsprechen, und darüber hinaus der aufrufende Prozeß Mitglied der +Gruppe mit der Gruppennummer GID sein. +
  +
Ergebnis: Die Funktion kann folgende Rückgabewerte liefern: +
  + + + + + + + + + +
E_OK : kein Fehler aufgetreten. +
EINVFN : das Filesystem unterstützt nicht das Konzept von +Benutzer-/Gruppenkennungen (Beispiel: TOS-FS). +
EACCDN : Die EUID des aufrufenden Prozesses differiert von der UID des +Dateibesitzers und ist auch nicht 0. + +
+ +
Verfügbar: Verfügbar, wenn ein 'MiNT' Cookie mit einer Versionsnummer von +mindestens 0.90 existiert. +
  +
Gruppe: Dateifunktionen +
  +
Querverweis: Binding   Fchown16   Fchmod   Fxattr   XFS-Konzept in MagiC +
  + +
+ +

5.9.4.1 Bindings für Fchown

+ + + + + + +
C: int32_t Fchown ( int8_t *name, int16_t uid, int16_t gid ); +
  +
Assembler: +
  +
move.w    gid,-(sp)    ; Offset 8
+move.w    uid,-(sp)    ; Offset 6
+pea       name         ; Offset 2
+move.w    #305,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+lea       $A(sp),sp    ; Stack korrigieren
+
+ +
+ +

5.9.5 Fchown16

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Fchown16« - Eigentümer/Gruppenkennungen ändern. +
  +
Gemdosnummer: 384 +
  +
Deklaration: int32_t Fchown16 ( int8_t *name, int16_t uid, int16_t gid, +int16_t flag ); +
  +
Beschreibung: Die Funktion ändert die Benutzer-/Gruppenkennung der Datei +name, die wiederum die Zugriffsrechte der Datei regeln. +
  +
Der Parameter flag gibt an, wie symbolische Links +behandelt werden sollen. Es gilt: +
  + + + + + + + + + + + + +
flag Bedeutung +
    +
0 der Besitzer des symbolischen Links selbst wird geändert. Dies +entspricht einem Aufruf von Fchown(name, uid, gid). +
1 symbolische Links werden bis zur Ursprungsdatei verfolgt, und +der Besitzer dieser Datei wird geändert. + +
+ +
Dieser Aufruf kann nur von einem Prozeß erfolgen der eine +effektive Benutzerkennung (EUID) hat, die 0 ist, oder die der UID der +Datei entspricht. Im letzteren Fall muß die neue UID der alten +entsprechen, und darüber hinaus der aufrufende Prozeß Mitglied der +Gruppe mit der Gruppennummer GID sein. +
  +
Ergebnis: Die Funktion kann folgende Rückgabewerte liefern: +
  + + + + + + + + + +
E_OK : kein Fehler aufgetreten. +
EINVFN : das Filesystem unterstützt nicht das Konzept von +Benutzer-/Gruppenkennungen (Beispiel: TOS-FS). +
EACCDN : Die EUID des aufrufenden Prozesses differiert von der UID des +Dateibesitzers und ist auch nicht 0. + +
+ +
Verfügbar: Verfügbar, wenn ein 'MiNT' Cookie mit einer Versionsnummer von +mindestens 1.16.0 existiert. +
  +
Gruppe: Dateifunktionen +
  +
Querverweis: Binding   Fchown   Fchmod   Fxattr   XFS-Konzept in MagiC +
  + +
+ +

5.9.5.1 Bindings für Fchown16

+ + + + + + +
C: int32_t Fchown16 ( int8_t *name, int16_t uid, int16_t gid, +int16_t flag ); +
  +
Assembler: +
  +
move.w    flag,-(sp)   ; Offset 10
+move.w    gid,-(sp)    ; Offset 8
+move.w    uid,-(sp)    ; Offset 6
+pea       name         ; Offset 2
+move.w    #384,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+lea       12(sp),sp    ; Stack korrigieren
+
+ +
+ +

5.9.6 Fclose

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »file close« - Datei schließen. +
  +
Gemdosnummer: 62 +
  +
Deklaration: int16_t Fclose ( int16_t handle ); +
  +
Beschreibung: Die GEMDOS-Routine Fclose schließt eine Datei mit der +Dateikennung handle. +
  +
Hinweis: Im Netzwerk wird das aktive Locking aufgehoben. +Beim Schließen von Standardkanälen wird ab GEMDOS-Version 0.15 +wieder der ursprüngliche Kanal eingesetzt. +
  +
Ergebnis: Die Funktion liefert folgende Resultate: +
  + + + + + + +
E_OK kein Fehler aufgetreten +
EBADF falsche Dateikennung + +
+ +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Dateifunktionen +
  +
Querverweis: Binding   Fopen +
  + +
+ +

5.9.6.1 Bindings für Fclose

+ + + + + + + + + +
C: int16_t Fclose ( int16_t handle ); +
  +
Assembler: +
  +
move.w    handle,-(sp)  ; Offset 2
+move.w    #62,-(sp)     ; Offset 0
+trap      #1            ; GEMDOS aufrufen
+addq.l    #4,sp         ; Stack korrigieren
+
+
GFA-Basic Fehler%=Gemdos(&H3E,W:handle%) +
  + +
+ +

5.9.7 Fcntl

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Fcntl« - Kontrolloperationen auf einem File ausführen. +
  +
Gemdosnummer: 260 +
  +
Deklaration: int32_t Fcntl ( int16_t fh, int32_t arg, int16_t cmd ); +
  +
Beschreibung: Die Funktion führt verschiedene Kontrolloperationen auf der +Datei mit der Handle fh duch. Der Parameter cmd +beschreibt die gewünschte Operation, und kann folgende Werte annehmen +(arg ist dabei vom gewählten Kommando abhängig): +
  + + +
F_DUPFD (0): +
Dupliziert das angegebene Datei-Handle. Für das neue Intervall +gilt: arg <= Handle < 32. Falls in dem angegebenen +Bereich keine freien Handles existieren, wird die Fehlermeldung ENHNDL +zurückgegeben. Ein Aufruf von Fdup (handle) ist also äquivalent zu +Fcntl (handle, 6L, F_DUPFD). +
  + +
F_GETFD (1): +
Dieses Kommando gibt das nicht-vererbungs-Flag für das Handle fh +zurück. Das Flag ist 0, wenn per Pexec gestartete Tochterprozesse die +angegebene Datei erben sollen, anderenfalls hat es den Wert 1. Der +Parameter arg besitzt keine Bedeutung. +
  + +
F_SETFD (2): +
Dieses Kommando setzt das nicht-vererbungs-Flag für das Handle f. +arg gibt an, ob ein mittels Pexec gestarteter Child Processes +die Dateihandle erbt. Ein Wert von 1 steht für nicht vererben, ein +Wert von 0 für vererben. Der Defaultwert des Flags ist 0 für die +Standard GEMDOS-Handles im Bereich von 0...5 und 1 für alle anderen, +also nicht-Standard-Handles. +
  + +
F_GETFL (3): +
Dieses Kommando gibt die Dateihandle-Flags zurück, die durch den +Benutzer verändert werden können. Dabei handelt es sich um den bei +Fopen angegebenen Parameter mode, sofern dieser nicht durch einen +anderen Aufruf von Fcntl verändert worden ist. +
  + +
F_SETFL (4): +
Dieses Kommando setzt die Dateihandle-Flags neu, die durch den +Benutzer verändert werden können (andere Bits werden ignoriert, und +sollten auf den Wert 0 gesetzt werden). Es ist nicht möglich, den +Schreib-Lese Modus bzw. die Modi für Filesharing zu verändern. +
  + +
F_GETLK (5): +
Dieses Kommando testet auf einen Lock auf einer Datei. Der +Parameter arg ist ein Zeiger auf eine flock-Struktur, in der +Informationen über einen Datei-Lock gespeichert sind. Falls ein Lock +existiert, wird er in die Struktur kopiert. Dabei wird in der +Komponenten l_pid die PID des sperrenden Prozesses vermerkt. Falls +kein Lock existiert, wird die Komponente l_type auf den Wert F_UNLCK +gesetzt. Für den Fall, daß der Lock von einem anderen Rechner im +Netzwerk gehalten wird, wird die Komponente l_pid auf einen vom NFS +(Netzwerk-Filesystem) definierten Wert gesetzt. Für diesen Wert gilt: +0x1000 <= l_pid <= 0xffff. Man denke daran, daß normale PID's +einen Wert kleiner als 1000 besitzen. +
  + +
F_SETLK (6): +
Dieses Kommando setzt (l_type = F_RDLCK oder F_WRLCK) bzw. löscht +(l_type = F_UNLCK) einen beratenden Lock auf eine Datei. Falls diese +eine FIFO-Queue (First-in-First-Out) ist, muß die gesamte Datei auf +einmal behandelt werden. Für den Fall, daß der Lock mit von anderen +Prozessen gesetzten Locks kollidiert, wird der Wert ELOCKED +zurückgegeben. Wenn versucht wird, einen nicht-existierenden Lock zu +löschen, wird der Wert ENSLOCK zurückgeliefert. Zu beachten ist, +daß sich Read-Locks überlappen dürfen, Write-Locks hingegen nicht. +Falls eine gelockte Datei geschlossen wird, oder der entsprechende +Prozess terminiert, werden alle gesetzten Locks automatisch aufgehoben +(d.h. zurückgesetzt). +
  + +
F_SETLKW (7): +
Analog F_SETLK, mit dem Unterschied, daß wenn der Lock mit +solchen von anderen Prozessen kollidiert, nicht ELOCKED +zurückgeliefert wird, sondern der sperrende Prozess suspendiert wird, +bis das Locking vom anderen Prozess aufgehoben wird. +
  + +
FSTAT (0x4600): +
Ermittelt die Attribute einer Datei. Im Parameter arg wird +ein Zeiger auf eine XATTR-Struktur zurückgeliefert, so als ob ein +Aufruf von Fxattr gemacht worden wäre. Das Kommando wird in MagiC ab +Version 3.0 unterstützt. +
  + +
FIONREAD (0x4601): +
Im Parameter arg wird ein Zeiger auf einen Long-Wert +zurückgegeben, in dem die Anzahl der Bytes angegeben ist, die z.Zt. +vom angegebenen Datei-Handle gelesen werden können, ohne daß der +Prozess blockiert wird. Die Angabe ist nicht zwingend korrekt, da die +genaue Anzahl in einigen Fällen nur geschätzt werden kann. Das +Kommando wird in MagiC ab Version 3.0 unterstützt. +
  + +
FIONWRITE (0x4602): +
Analog FIONREAD, nur wird hier die Anzahl der Bytes, die z.Zt. +geschrieben werden können, ausgegeben. Das Kommando wird in MagiC ab +Version 3.0 unterstützt. +
  + +
FUTIME (0x4603): +
z.Zt. keine Informationen bekannt. +
  + +
FTRUNCATE (0x4604): +
Der Parameter arg ist ein Zeiger auf einen Long-Wert, der +die neue Länge der zu verkürzenden Datei enthält. Das Kommando wird +in MagiC ab Version 3.0 unterstützt. +
  + +
FIOEXECPT (0x4605): +
Im Parameter arg wird ein Zeiger auf einen Long-Wert +zurückgegeben, in dem steht, ob sich die Datei in einem +Ausnahmezustand befindet (1) oder nicht (0). +
  + +
Die folgenden Kommandos sind auf alle Terminal-Devices wie die +Console oder ein Pseudo-Terminal anzuwenden: +
  + +
TIOCGETP (0x5400): +
Dieses Kommando gibt über den Parameter arg einen Zeiger +auf eine sgttyb-Struktur zurück, in der die Parameter des Terminals +definiert sind. +
  + +
TIOCSETN (0x5401): +
Über dieses Kommando kann ein neue sgttyb-Struktur gesetzt +werden, welche die Parameter des Terminals festlegt. Es müssen zeurst +die Parameter des Terminals erfragt werden, die gewünschten +verändert und dann mit diesem Kommando gesetzt werden. +
  + +
TIOCGETC (0x5402): +
Dieses Kommando liefert über den Parameter arg einen +Zeiger auf eine tchars-Struktur zurück, in welcher die +Terminal-Kontrollzeichen definiert sind. +
  + +
TIOCSETC (0x5403): +
Über dieses Kommando können neue Terminal-Kontrollzeichen +gesetzt werden. Dazu übergibt man in arg einen Zeiger auf +eine tchars-Struktur, in welcher die Kontrollzeichen definiert sind. +Wird ein Zeichen auf 0 gesetzt, so wird die entsprechende Funktion +gesperrt. +
  + +
TIOCGLTC (0x5404): +
Dieses Kommando liefert über den Parameter arg einen +Zeiger auf eine ltchars-Struktur zurück, in welcher die erweiterten +Terminal-Kontrollzeichen definiert sind. +
  + +
TIOCSLTC (0x5405): +
Über dieses Kommando können neue erweiterte +Terminal-Kontrollzeichen gesetzt werden. Dazu übergibt man in +arg einen Zeiger auf eine ltchars-Struktur, in welcher die +Kontrollzeichen definiert sind. Wird ein Zeichen auf 0 gesetzt, so +wird die entsprechende Funktion gesperrt. +
  + +
TIOCGPGRP (0x5406): +
Dieses Kommando liefert über den Parameter arg einen +Zeiger auf die Prozess-Gruppe des Terminals zurück. +
  + +
TIOCSPGRP (0x5407): +
Über dieses Kommando kann die Prozess-Gruppe des Terminals +eingestellt werden. Dazu wird über den Parameter arg ein +Zeiger auf die entsprechende Prozess-Gruppe übergeben. Sollten +Prozesse aus anderen Gruppen versuchen, auf dieses Terminal (lesend +oder schreibend) zuzugreifen, so werden ihnen Job-Control-Signale +(SIGTSTP etc.) gesendet. +
  + +
TIOCFLUSH (0x5408): +
Über dieses Kommando kann die Art des Flushings spezifiziert +werden. Dazu wird über den Parameter arg ein Zeiger auf einen +Long-Wert übergeben, der die gewünschte Art beschreibt. Dabei gilt: +
  + + + + + + + + + + + + + + + +
Wert Bedeutung +
    +
0 Ein- und Ausgabe flushen +
Bit-0 gesetzt Eingabe flushen +
Bit-1 gesetzt Ausgabe flushen + +
+ + +
TIOCSTOP (0x5409): +
Dieses Kommando unterbricht die Ausgabe auf das Terminal (ähnlich +der Flußkontrolle per Control-S). Der Parameter arg ist in +diesem Zusammenhang ohne Bedeutung. +
  + +
TIOCSTART (0x540a): +
Dieses Kommando sorgt dafür, daß die Ausgabe des Terminals +wieder aufgenommen wird (ähnlich der Flußkontrolle per Control-Q). +Der Parameter arg ist in diesem Zusammenhang ohne Bedeutung. +
  + +
TIOCGWINSZ (0x540b): +
Über dieses Kommando kann die Fenstergröße für ein Textfenster +erfragt werden. Dazu wird über den Parameter arg ein Zeiger +auf eine winsize-Struktur zurückgeliefert. Falls eine Komponente +dieser Struktur den Wert 0 besitzt, so bedeutet dies, daß der +entsprechende Wert unbekannt ist. +
  + +
TIOCSWINSZ (0x540c): +
Über dieses Kommando kann die Fenstergröße gesetzt werden. Dazu +wird über den Parameter arg ein Zeiger auf eine +winsize-Struktur übergeben, die die notwendigen Informationen +enthält. Zu beachten ist in diesem Zusammenhang, daß der Kernel den +Aufruf zwar bearbeitet, die Ausführung aber Window-Managern +überläßt. Diese senden auch das Signal SIGWINCH, falls notwendig. +
  + +
TIOCGXKEY (0x540d): +
Dieses Kommando ermittelt die Definition einer Funktions- bzw. +Cursortaste. Dazu wird über den Parameter arg ein Zeiger auf +eine xkey-Struktur übergeben. Die Komponente xk_num der Struktur muß +dabei mit der gewünschten Taste gefüllt werden: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
xk_numTaste
0-9F1-F10
10-19F11-F20 (über shift erreichbar)
20Cursor hoch
21Cursor runter
22Cursor nach rechts
23Cursor nach links
24Help
25Undo
26Insert
27Clr/Home
28Shift + Cursor hoch
29Shift + Cursor runter
30Shift + Cursor nach rechts
31Shift + Cursor nach links
+
+ +
Der zu der Taste gehörende String (es gilt die Konvention der +Sprache C) wird über die Komponente xk_def zurückgeliefert. +
  + +
TIOCSXKEY (0x540e): +
Über dieses Kommando kann die Definition einer Funktions- bzw. +Cursortaste gesetzt werden. Dazu übergibt man über den Parameter +arg einen Zeiger auf eine xkey-Struktur, in der die +Komponenten xk_num und xk_def bereits gesetzt sein müssen. Nach +Ausführung des Kommandos wird dann per Fread der in xk_def angegebene +String (statt ASCII-0) zurückgeliefert. Diese Übersetzung findet +jedoch nur statt, wenn das Programm per Pdomain in die MiNT-Domain +gesetzt wurde und die Zeichen vom Terminal mittels Fread gelesen +werden. Da der in xk_def übergebene String nullterminiert sein muß, +können auf diese Art und Weise maximal 7 Zeichen übergeben werden. +
  + +
TIOCIBAUD (0x5412): +
Über dieses Kommando kann die Baudrate für die Eingabe des +Terminals eingestellt werden. Dazu wird über den Parameter +arg ein Zeiger auf einen Long-Wert übergeben, in dem die +Baudrate angegeben ist. +
  + +
TIOCOBAUD (0x5413): +
Über dieses Kommando kann die Baudrate für die Ausgabe des +Terminals eingestellt werden. Dazu wird über den Parameter +arg ein Zeiger auf einen Long-Wert übergeben, in dem die +Baudrate angegeben ist. +
  + +
TIOCCBRK (0x5414): +
Dieses Kommando löscht Bit-3 des TSR-Registers des +Peripherie-Bausteins MFP68901. +
  + +
TIOCSBRK (0x5415): +
Dieses Kommando setzt Bit-3 des TSR-Registers des +Peripherie-Bausteins MFP68901. Dadurch wird ein Break gesendet, sobald +das Senderegister leer ist. Der Parameter arg ist in diesem +Zusammenhang ohne Bedeutung. +
  + +
TIOCGFLAGS (0x5416): +
Dieses Kommando gibt über den Parameter arg einen Zeiger +auf die Terminal-Kontrollflags zurück. Dieses Kommando gibt in den +unteren Bits des LONGS, auf den der Parameter arg zeigt, die +Terminal-Kontrollflags (z.B. Anzahl Stop-Bits und Daten-Bits) zurück. +Folgend Bitmasken sind möglich: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MaskeBedeutung
0x00011 Stop-Bit
0x00021.5 Stop-Bits
0x00032 Stop-Bits
0x00008 Daten-Bits
0x00047 Daten-Bits
0x00086 Daten-Bits
0x000C5 Daten-Bits
+
+ + +
TIOCSFLAGS (0x5417): +
Dieses Kommando setzt neue Terminal-Kontrollflags, die über den +Parameter arg übergeben werden. +
  + +
TIOCOUTQ (0x5418): +
Dieses Kommando gibt in arg einen Zeiger auf einen +Long-Wert zurück, in dem die Anzahl der Bytes im Ausgabepuffer +gespeichert ist. +
  + +
TIOCSETP (0x5419): +
Funktioniert analog zu TIOCSETN, mit dem Unterschied, daß (wenn +das Terminal TIOCOUTQ unterstützt) die Funktion erst dann +zurückkehrt, wenn der Ausgabepuffer leer ist. +
  + +
TCURSOFF (0x6300): +
Dieses Kommando schaltet den Cursor des Terminals aus. +
  + +
TCURSON (0x6301): +
Dieses Kommando schaltet den Cursor des Terminals ein. +
  + +
TCURSBLINK (0x6302): +
Dieses Kommando schaltet den Cursor des Terminals auf Blinken. Die +Blinkrate läßt sich per TCURSSRATE einstellen. +
  + +
TCURSSTEADY (0x6303): +
Dieses Kommando schaltet das Cursor-Blinken des Terminals wieder +aus. +
  + +
TCURSSRATE (0x6304): +
Dieses Kommando setzt die Cursor-Blinkrate des Terminals. Dazu +wird in arg ein Zeiger auf einen Word-Wert übergeben, der +angibt, nach wievielen Vertical-Blanks der Cursor einmal invertiert +werden soll. +
  + +
TCURSGRATE (0x6305): +
Dieses Kommando ermittelt die Cursor-Blinkrate des Terminals. +Diese wird in einem Word-Wert zurückgegeben, auf den arg +zeigt. +
  + +
Die folgenden Kommandos sind nur auf (als Dateien geöffnete) +Prozesse anwendbar. Um den eigenen Prozess als Datei zu öffnen, muß +als Pfad für Fopen 'U:\PROC\prozessname.-1' angegeben werden. Dabei +wählt die Extension -1 den eigenen, und -2 den Parent-Prozess. +
  + +
PBASEADDR (0x5002): +
Im Parameter arg wird ein Zeiger auf die Adresse der +Basepage, des als Datei geöffneten Prozesses zurückgegeben. Das +Kommando wird in MagiC ab Version 3.0 unterstützt. +
  + +
PPROCADDR (0x5001): +
Im Parameter arg wird ein Zeiger auf die Adresse des PCB +(Prozess-Control-Blocks) zurückgegeben. +
  + +
PCTXTSIZE (0x5003): +
Im Parameter arg wird ein Zeiger auf einen Long-Wert +geliefert, in dem die Länge des Prozess-Context-Blocks angegeben ist. +Zwei dieser Strukturen befinden sich im Speicher vor dem PCB, dessen +Adresse mit PPROCADDR erfragt werden kann. Die erste Struktur ist +dabei für den aktuellen Prozesskontext verantwortlich, während die +zweite den gespeicherten Kontext des letzten Systemaufrufs enthält. +
  + +
PSETFLAGS (0x5004): +
Dieses Kommando setzt die Programmflags (entsprechend denen im +Programmheader. In arg wird dazu ein Zeiger auf einen +Long-Wert übergeben, dessen untere 16 Bits die Programmflags +darstellen. +
  + +
PGETFLAGS (0x5005): +
Dieses Kommando ermittelt die aktuellen Programmflags. Über den +Parameter arg wird dabei ein Zeiger auf diese Flags +zurückgegeben. +
  + +
PTRACESFLAGS (0x5006): +
Dieses Kommando setzt die Prozess-Tracing-Flags. Im Parameter +arg wird ein Zeiger auf einen Word-Wert übergeben, der die +Flags repräsentiert: +
  + + + + + + + + + + + + +
P_ENABLE = 1 (Tracen einschalten) +
P_DOS = 2 (GEMDOS-Aufrufe tracen) +
P_BIOS = 4 (BIOS-Aufrufe tracen) +
P_XBIOS = 8 (XBIOS-Aufrufe tracen) + +
+ + +
PTRACEGFLAGS (0x5007): +
Dieses Kommando ermittelt die aktuellen Prozess-Tracing Flags. +Über den Parameter arg wird ein Zeiger auf diese Flags +zurückgegeben. +
  +
PTRACEGO (0x5008): (ab MC-68020 Prozessor) +
PTRACEFLOW (0x5009): +
PTRACESTEP (0x500a): +
PTRACE11 (0x500b): +
Diese Funktionen sollen einmal das Tracen von Prozessen +ermöglichen. Der zu tracende Prozess muß sich dafür im Zustand +'suspendiert' befinden. Er wird durch die Trace Funktion wieder +aufgeweckt. Diese Funktionen sind z.Zt. jedoch noch nicht +implementiert. +
  + +
PLOADINFO (0x500c): +
Dieses Kommando gibt in arg einen Zeiger auf die ploadinfo +Struktur zurück, in der Programmname und Kommandozeile gespeichert +sind. +
  + +
PFSTAT (0x500d): +
Dieses Kommando entspricht FSTAT. Es ermittelt die erweiterten +Attribute der zum Prozess gehörenden Programmdatei. +
  + +
Die folgenden Kommandos sind nur auf Dateien anwendbar, die +Shared Memory repräsentieren: +
  + +
SHMGETBLK (0x4d00): +
Dieses Kommando liefert die Adresse eines per SHMSETBLK +allozierten Speicherblocks zurück (bzw. einen Nullzeiger bei +Fehlern). Aus Kompatibilitätsgründen muß der Parameter arg +auf den Wert 0 gesetzt werden. Hinweis: Verschiedene Prozesse +können den Speicherblock an unterschiedlichen Stellen in ihrem +Adressraum sehen. Aus diesem Grund darf ein Shared-Memory-Bereich +keine absoluten Zeiger auf Daten enthalten! Das Kommando wird in MagiC +ab Version 3.0 unterstützt. +
  + +
SHMSETBLK (0x4d01): +
Im Parameter arg wird ein Zeiger auf einen Speicherblock +übergeben, welcher vorher per Malloc/Mxalloc alloziert wurde. Der +Speicher wird nun unter dem Dateinamen der Datei mit Handle fh +zum Sharing angeboten. Die Datei muß dazu im Unterverzeichnis U:\SHM +angelegt werden. Der Block wird derart markiert, daß er nicht beim +Beenden des Prozesses freigegeben wird. Die Länge wird ermittelt und +sowohl für die geöffnete Datei verwendet, als auch in das +Verzeichnis eingetragen. Ungültige Blockadressen führen zum +Fehlercode EIMBA oder zu einem Bus- oder Adreßfehler. Das Kommando +wird in MagiC ab Version 3.0 unterstützt. +
  + + +
Die folgenden Kommandos sind im Zusammenhang mit CD-ROM's +interessant: +
  + +
CDROMREADOFFSET (0x4300): +
Dieses Kommando ermittelt die Blocknummer des ersten Sektors der +letzten Session einer Multi-Session-CD. Der Parameter arg +enthält nach dem Aufruf diese Blocknummer. +
  + +
CDROMPAUSE (0x4301): +
Dieses Kommando veranlaßt ein CD-ROM beim Abspielen einer +Audio-CD in den Status Pause zu treten. +
  + +
CDROMRESUME (0x4302): +
Dieses Kommando veranlaßt ein CD-ROM das Abspielen einer Audio-CD +fortzusetzen (Pause wird aufgehoben). +
  + +
CDROMPLAYMSF (0x4303): +
Dieses Kommando startet eine Audio-Wiedergabe. Der Parameter +arg ist ein Zeiger auf eine cdrom_msf-Struktur, in die +Anfangs- und Endzeit in MSF-Notation einzutragen sind. +
  + +
CDROMPLAYTRKIND (0x4304): +
Dieses Kommando startet eine Audio-Wiedergabe. Der Parameter +arg ist ein Zeiger auf eine cdrom_ti-Struktur, in die Start- +und Endposition in Track/Index-Schreibweise einzutragen sind. Bei den +meisten Audio-CD's aus dem POP Bereich sind die Tracks nicht weiter +eingeteilt. Viele Klassik-CD's haben aber auch innerhalb der Tracks +noch eine feinere Einstellung in Indices. Achtung: Nicht jedes +CD-ROM kann gezielt Indizes ungleich Eins ansteuern! +
  + +
CDROMREADTOCHDR (0x4305): +
Dieses Kommando erlaubt es, Informationen über den Aufbau einer +CD zu ermitteln. Der Parameter arg ist ein Zeiger auf eine +cdrom_tochdr-Struktur, in welche der erste und letzte Track der CD +eingetragen werden. +
  + +
CDROMREADTOCENTRY (0x4306): +
Dieses Kommando erlaubt es, Informationen über den Aufbau einer +CD zu ermitteln. Der Parameter arg ist ein Zeiger auf eine +cdrom_tocentry-Struktur, in welche die gewünschten Informationen +eingetragen werden. +
  + +
CDROMSTOP (0x4307): +
Dieses Kommando stoppt das entsprechende Laufwerk. +
  + +
CDROMSTART (0x4308): +
Dieses Kommando startet das entsprechende Laufwerk, und zieht +ggfs. die Schublade wieder ein. +
  + +
CDROMEJECT (0x4309): +
Dieses Kommando sorgt für das Ausfahren der Schublade des +entsprechenden Laufwerkes. +
  + +
CDROMVOLCTRL (0x430a): +
Dieses Kommando erlaubt es, die Lautstärke und Kanalzuordnungen +der einzelnen Audio-Kanäle zu verändern. Der Parameter arg +ist ein Zeiger auf eine cdrom_volctrl-Struktur. Das Kommando ist zum +entsprechenden SunOS-Aufruf kompatibel. Achtung: Das +Verstellen der Lautstärke ist nicht bei allen Geräten möglich! +
  + +
CDROMSUBCHNL (0x430b): +
Dieses Kommando ermittelt die aktuellen Positionsdaten, sowie den +Audio-Status. Der Parameter arg ist ein Zeiger auf eine +cdrom_subchnl-Struktur. +
  + +
CDROMREADMODE2 (0x430c): +
Dieses Kommando ermöglicht das Lesen von Modus-2 Sektoren. Solche +Sektoren werden bei XA-CDs (Beispiel: Photo-CD ohne Fehlerkorrektur +oder Video-CD) verwendet und enthalten 2336 Bytes. Der Parameter +arg ist ein Zeiger auf eine cdrom_read Struktur. +Achtung: Nicht alle Geräte können diese Sektortypen lesen, +und nicht alle Treiber bieten diese Funktion an. +
  + +
CDROMREADMODE1 (0x430d): +
Dieses Kommando ermöglicht das Lesen von Modus-1 Sektoren. Solche +Sektoren sind 2048 Bytes groß, und werden auf normalen CD-ROMs +benutzt. Der Parameter arg ist ein Zeiger auf eine +cdrom_read-Struktur. Achtung: Nicht alle Geräte können diese +Sektortypen lesen, und nicht alle Treiber bieten diese Funktion an. +
  + +
CDROMPREVENTREMOVAL (0x430e): +
Dieses Kommando sperrt die Auswurffunktion des entsprechenden +CD-ROMs. Dies kann z.B. nützlich sein, wenn das Gerät an einem +öffentlichen Ort steht, und man dem CD-Klau vorbeugen will. +
  + +
CDROMALLOWRMOVAL (0x430f): +
Dieses Kommando gibt den Auswurf des entsprechenden CD-ROMs wieder +frei. +
  + +
CDROMAUDIOCTRL (0x4310): +
Diese Kommando erlaubt es, die Lautstärke und Kanalzuordnungen +der einzelnen Audio-Kanäle zu verändern. Der Parameter arg +ist ein Zeiger auf eine cdrom_audioctrl-Struktur. Indem man die +Komponente set dieser Struktur auf den Wert Null setzt, können die +aktuellen Einstellungen erfragt werden. Achtung: Das +Verstellen der Lautstärke ist nicht bei allen Geräten möglich! +
  + +
CDROMREADDA (0x4311): +
Dieses Kommando ermöglicht das Lesen von Digital-Audio (DA) +Sektoren. Solche Sektoren sind 2352 Bytes groß, und enthalten pro +Sektor 588 Samples im 16-Bit-Stereo-PCM Format. Der Parameter +arg ist ein Zeiger auf eine cdrom_read Struktur. +Achtung: Nicht alle Geräte können diese Sektortypen lesen, +und nicht alle Treiber bieten diese Funktion an. +
  + +
CDROMGETMCN (0x4313): +
Dieses Kommando ermittelt die Media Catalog Number, die +theoretisch benutzt werden kann, um eine CD einwandfrei zu +identifizieren. Leider ist diese Information auf den allerwenigsten +CDs vorhanden. Der Parameter arg ist ein Zeiger auf eine +cdrom_mcn-Struktur. +
  + +
CDROMGETTISRC (0x4314): +
Dieses Kommando ermittelt den Track-International-Standard +Recording-Code, der eine eindeutige Kennzeichnung für einzelne Tracks +darstellen soll. Der Parameter arg ist ein Zeiger auf eine +cdrom_tisrc-Struktur. +
  +
Ergebnis: Die Funktion kann folgende Rückgabewerte liefern: +
  + + + + + + + + + +
>= 0 : kein Fehler aufgetreten (Abweichungen s.o.) +
EBADF : ungültiges Datei-Handle. +
EINVFN : Kommando kann mit dem Handle fh nicht ausgeführt +werden. + +
+ +
Verfügbar: Seit der ersten in MultiTOS integrierten MiNT Version 1.04 und +MagiC ab Version 3.0. +
  +
Gruppe: Dateifunktionen +
  +
Querverweis: Binding   Fdup   Flock   Fopen   Fxattr   Pgetpgrp   Psetpgrp   +Metaioctl   CD-ROM Definitionen +
  + +
+ +

5.9.7.1 Bindings für Fcntl

+ + + + + + +
C: int32_t Fcntl ( int16_t fh, int32_t arg, int16_t cmd ); +
  +
Assembler: +
  +
move.w    cmd,-(sp)    ; Offset 8
+move.l    arg,-(sp)    ; Offset 4
+move.w    fh,-(sp)     ; Offset 2
+move.w    #260,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+lea       $A(sp),sp    ; Stack korrigieren
+
+ +
+ +

5.9.8 Fcreate

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »file create« - Datei anlegen. +
  +
Gemdosnummer: 60 +
  +
Deklaration: int16_t Fcreate ( const int8_t *fname, int16_t attr ); +
  +
Beschreibung: Die GEMDOS-Routine Fcreate legt eine neue Datei mit dem +angegebenen Namen und Attributen an oder löscht den Inhalt einer +vorhandenen. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
fname Zeiger auf den Dateinamen +
attr Dateiattribute + + + + + + + + + + + + + + + +
Bit-0: Datei ist schreibgeschützt +
Bit-1: Datei ist versteckt +
Bit-2: Systemdatei +
Bit-3: Diskettenname +
Bit-5: Archiv Bit + +
+ + +
+ +
Hinweis: Im Netzwerk setzt das Erzeugen einer Datei die +Exclusivität. Ob das zugrundeliegende GEMDOS netzwerkfähig ist, kann +über den Cookie _FLK ermittelt werden. +
  +
Anmerkung zu MagiC: Ist Bit-3 in attr gesetzt, wird die +XFS-Funktion xfs_wlabel aufgerufen. Wenn diese Funktion ohne Fehler +ausgeführt werden kann, wird als Rückgabewert 0x0000fffc +zurückgegeben. Dies entspricht einem Handle für die Datei NUL: bzw. +U:\DEV\NULL. Dieses Feature ist jedoch nur noch aus +Kompatibilitätsgründen vorhanden; ab MagiC 3 sollte besser auf die +Funktion Dwritelabel zurückgegriffen werden. +
  +
Die angegebenen Attribute existieren nur unter DOS-Dateisystemen +und werden von anderen Dateisystemen ignoriert oder simuliert. Beim +Macintosh Dateisystem (HFS) wird z.B. nur Bit-0 von attr +unterstützt. +
  +
Symbolische Links werden übrigens von dieser Funktion +dereferenziert, d.h. wenn die Datei bereits als symb. Link existiert, +wird die von diesem Link referenzierte Datei auf die Länge Null +gesetzt. +
  +
Ergebnis: Die Funktion liefert folgende Resultate: +
  + + + + + + + + + + + + +
EPTHNF : Zugriffspfad ist unkorrekt +
ENHNDL : keine freien Dateihandles mehr +
EACCDN : kein Schreibzugriff möglich +
sonst : Kennung der Datei + +
+ +
Verfügbar: Alle GEMDOS Versionen. Wird mit GEMDOS Version 0.13 eine +schreibgeschützte Datei angelegt, wird ein unbrauchbares Handle +zurück geliefert. GEMDOS Versionen kleiner 0.15 erlauben +fälschlicherweise mehr als einen Diskettenname auf einer Diskette. +
  +
Gruppe: Dateifunktionen +
  +
Querverweis: Binding   Fopen   XFS-Konzept in MagiC +
  + +
+ +

5.9.8.1 Bindings für Fcreate

+ + + + + + + + + +
C: int16_t Fcreate ( const int8_t *fname, int16_t attr ); +
  +
Assembler: +
  +
move.w    attr,-(sp)   ; Offset 6
+pea       fname        ; Offset 2
+move.w    #60,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #8,sp        ; Stack korrigieren
+
+
GFA-Basic Handle%=Gemos(&H3c,L:fname%,W:attr) +
  + +
+ +

5.9.9 Fdatime

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »file date and time« - Uhrzeit und Datum einer Datei +ermitteln oder setzen. +
  +
Gemdosnummer: 87 +
  +
Deklaration: void Fdatime ( DOSTIME *timeptr, int16_t handle, int16_t wflag +); +
  +
Beschreibung: Die GEMDOS-Routine Fdatime liest bzw. setzt Datum und Uhrzeit +der Erstellung einer Datei. Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
timeptr Zeiger auf aufnehmende Struktur +
handle Dateikennung +
wflag + + + + + + +
0 = Werte abfragen +
1 = Werte setzen + +
+ + +
+ +
Hinweis: Aufgrund einiger Fehler in älteren Versionen +des GEMDOS, sollte die Funktion wie folgt angewendet werden: +
  +
    +
  • Datei öffnen +
  • +
  • Fdatime aufrufen +
  • +
  • Datei schließen +
  • +
+ +
Ergebnis: Die Funktion liefert kein direktes Ergebnis. +
  +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Dateifunktionen +
  +
Querverweis: Binding   Tgettime   Tsettime +
  + +
+ +

5.9.9.1 Bindings für Fdatime

+ + + + + + + + + +
C: void Fdatime ( DOSTIME *timeptr, int16_t handle, int16_t wflag +); +
  +
Assembler: +
  +
move.w    wflag,-(sp)   ; Offset 8
+move.w    handle,-(sp)  ; Offset 6
+pea       timeptr       ; Offset 2
+move.w    #87,-(sp)     ; Offset 0
+trap      #1            ; GEMDOS aufrufen
+lea       $A(sp),sp     ; Stack korrigieren
+
+
GFA-Basic Fehler%=Gemdos(&H57,L:timeptr%,W:handle%,W:wflag%) +
  + +
+ +

5.9.10 Fdelete

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »file delete« - Datei löschen. +
  +
Gemdosnummer: 65 +
  +
Deklaration: int16_t Fdelete ( const int8_t *fname ); +
  +
Beschreibung: Die GEMDOS-Routine Fdelete löscht die mit fname +bezeichnete Datei. +
  +
Hinweis: Die Funktion sollte nicht auf geöffnete +Dateien angewendet werden. Ab MagiC 4 funktioniert das Löschen auch +bei Dateien mit den Attributen 'Hidden' und 'System'. In MagiC werden +ferner keine symbolischen Links dereferenziert, d.h. es wird +der Link gelöscht, nicht die Datei oder der Ordner, auf die +der Link verweist. +
  +
Ergebnis: Die Funktion liefert folgende Resultate: +
  + + + + + + + + + +
E_OK kein Fehler aufgetreten +
EFILNF Datei nicht gefunden +
EACCDN Zugriff verweigert + +
+ +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Dateifunktionen +
  +
Querverweis: Binding   Fcreate +
  + +
+ +

5.9.10.1 Bindings für Fdelete

+ + + + + + + + + +
C: int16_t Fdelete ( const int8_t *fname ); +
  +
Assembler: +
  +
pea       fname        ; Offset 2
+move.w    #65,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+
GFA-Basic Fehler%=Gemdos(&H41,L:fname%) +
  + +
+ +

5.9.11 Fdirfd

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Fdirfd« - Return a file descriptor from a directory handle. +
  +
Gemdosnummer: 387 (0x0183) +
  +
Deklaration: int16_t Fdirfd ( int32_t handle ); +
  +
Beschreibung: The function Fdirfd returns a file descriptor from the +specified directory handle. +
  +
Ergebnis: Die Funktion liefert die entsprechende Dateikennung, oder eine +negative Fehlermeldung zurück. +
  +
Verfügbar: Sie steht ab FreeMiNT 1.17 zur Verfügung. +
  +
Gruppe: Dateifunktionen +
  +
Querverweis: Binding   Dopendir   Dclosedir   Dreaddir   Drewinddir   +Ffdopendir   Pdomain +
  + +
+ +

5.9.11.1 Bindings für Fdirfd

+ + + + + + +
C: int16_t Fdirfd ( int32_t handle ); +
  +
Assembler: +
  +
move.l    handle,-(sp) ; Offset 2
+move.w    #387,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

5.9.12 Fdup

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »file duplicate« - Datei-Handle duplizieren. +
  +
Gemdosnummer: 69 +
  +
Deklaration: int16_t Fdup ( int16_t handle ); +
  +
Beschreibung: Die GEMDOS-Routine Fdup erzeugt für einen Standardkanal (0-5) +eine Kopie und liefert eine neue Kennung (>6) für einen +Standardkanal. Es gilt: +
  + + + + + + + + + + + + + + + + + + +
handle Bedeutung +
    +
0 Tastatur (stdin) +
1 Bildschirm (stdout) +
2 serielle Schnittstelle (stdaux) +
3 parallele Schnittstelle (stdprn) + +
+ +
Hinweis: In allen bekannten GEMDOS-Versionen (bis +einschließlich 0.19) treten Fehler auf, wenn nach einem Fdup, ein +Programm per Pexec gestartet wird. Ab MagiC 4 kann man mit Hilfe +dieser Funktion auch die Gerätedateien -1,-2, -3 (systemglobal) und +-4 (NULL Device) ermitteln. +
  +
Ergebnis: Die Funktion liefert folgende Resultate: +
  + + + + + + + + + +
ENHNDL : keine Kennung mehr frei +
EBADF : falsche Kennung +
sonst : die gewünschte neue Kennung + +
+ +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Dateifunktionen +
  +
Querverweis: Binding   Fforce +
  + +
+ +

5.9.12.1 Bindings für Fdup

+ + + + + + + + + +
C: int16_t Fdup ( int16_t handle ); +
  +
Assembler: +
  +
move.w    handle,-(sp)  ; Offset 2
+move.w    #69,-(sp)     ; Offset 0
+trap      #1            ; GEMDOS aufrufen
+addq.l    #4,sp         ; Stack korrigieren
+
+
GFA-Basic Phys_channel%=Gemdos(&H45,W:handle%) +
  + +
+ +

5.9.13 Ffchmod

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Ffchmod« - changes access permissions for an open file. +
  +
Gemdosnummer: 258 (0x0102) +
  +
Deklaration: int32_t Ffchmod ( int16_t fd, int16_t mode); +
  +
Beschreibung: +
  +
Ergebnis: Returns E_OK on success or a negative GEMDOS error code +otherwise. +
  +
Verfügbar: Available as of FreeMiNT version 1.15.2 +
  +
Gruppe: Dateifunktionen +
  +
Querverweis: Binding   Ffchown   Fchmod +
  + +
+ +

5.9.13.1 Bindings für Ffchmod

+ + + + + + +
C: int32_t Ffchmod ( int16_t fd, int16_t mode); +
  +
Assembler: +
  +
move.w    mode,-(sp)   ; Offset 4
+move.w    fd,-(sp)     ; Offset 2
+move.w    #258,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

5.9.14 Ffchown

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Ffchown« - changes ownership of an open file to uid and gid +respectively. +
  +
Gemdosnummer: 257 (0x0101) +
  +
Deklaration: int32_t Ffchown ( int16_t fd, int16_t uid, int16_t gid ); +
  +
Beschreibung: This function changes ownership of an open file to uid and gid +respectively. +
  +
A non privileged process can only change the ownership of a file +that is owned by this user to the effective group id of the process or +one of its supplementary groups. +
  +
Ergebnis: Returns E_OK on success or a negative GEMDOS error code +otherwise. +
  +
Verfügbar: Available as of FreeMiNT version 1.15.2 +
  +
Gruppe: Dateifunktionen +
  +
Querverweis: Binding   Ffchmod   Fchown +
  + +
+ +

5.9.14.1 Bindings für Ffchown

+ + + + + + +
C: int32_t Ffchown ( int16_t fd, int16_t uid, int16_t gid ); +
  +
Assembler: +
  +
move.w    gid,-(sp)    ; Offset 6
+move.w    uid,-(sp)    ; Offset 4
+move.w    fd,-(sp)     ; Offset 2
+move.w    #257,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #8,sp        ; Stack korrigieren
+
+ +
+ +

5.9.15 Ffdopendir

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Ffdopendir« - Duplicate a directory handle from a file +descriptor. +
  +
Gemdosnummer: 386 (0x182) +
  +
Deklaration: int32_t Ffdopendir ( int16_t fd ); +
  +
Beschreibung: The function Ffdopendir duplicates a directory handle of a +opened directory by specifying its file descriptor. The flag +of the directory with ID fd is inherited by the new directory +handle. +
  +
Ergebnis: Die Funktion liefert im Erfolgsfall eine 32bit +Verzeichnis-Handle. Diese darf auch negativ sein, enthält aber auf +keinen Fall den Wert 0xff im obersten Byte, wodurch es von Fehlern +unterschieden werden kann. +
  +
Im Fehlerfall sind folgende Rückgabewerte möglich: +
  + + + + + + + + + +
EPTHNF : fd ist kein gültiges Verzeichnis +
EACCDN : Das Verzeichnis ist von diesem Programm nicht ansprechbar. +
ENSMEM : Der Kernel kann für diese Operation keinen Speicher +allozieren. + +
+ +
Verfügbar: Sie steht ab FreeMiNT 1.17 zur Verfügung. +
  +
Gruppe: Dateifunktionen +
  +
Querverweis: Binding   Dopendir   Dclosedir   Dreaddir   Drewinddir   FdirfdPdomain +
  + +
+ +

5.9.15.1 Bindings für Ffdopendir

+ + + + + + +
C: int32_t Ffdopendir ( int16_t fd ); +
  +
Assembler: +
  +
move.w    fd,-(sp)     ; Offset 2
+move.w    #386,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

5.9.16 Fforce

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »file force« - Standard-Datei umleiten. +
  +
Gemdosnummer: 70 +
  +
Deklaration: int16_t Fforce ( int16_t stdh, int16_t nonstdh ); +
  +
Beschreibung: Die GEMDOS-Routine Fforce lenkt einen Standardkanal auf einen +beliebigen anderen Kanal um. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
stdh Umzuleitender Kanal + + + + + + + + + + + + +
0 = Tastatur +
1 = Bildschirm +
2 = serielle Schnittstelle +
3 = parallele Schnittstelle + +
+ +
nonstdh Nummer des ersetzenden Kanals + +
+ +
Unter MiNT können auch die folgenden Kanäle umgeleitet werden: +
  + + + + + + + + + + + + + + + +
-1 = Verweist auf BIOS Handle 2, leitet BIOS Ausgabe um +
-2 = Verweist auf BIOS Handle 1, leitet BIOS Ausgabe um +
-3 = Verweist auf BIOS Handle 0, leitet BIOS Ausgabe um +
-4 = GEMDOS Handles -4 und -5 verweisen +
-5 = auf MIDI Eingabe und Ausgabe. Eine Umleitung dieser Kanäle +beeinflußt BIOS Handle 3. + +
+ +
Hinweis: Ab MagiC 4 können über diese Funktion auch +die Gerätedateien -1,-2 und -3 (systemglobal) umgelenkt werden. Das +NULL-Device (-4) darf allerdings nicht umgeleitet werden. +
  +
Um etwa Bildschirmausgaben auf einen Drucker umzuleiten kann +eine Konstruktion wie Fforce(1, Fdup(3)) benutzt werden. +
  +
Ergebnis: Die Funktion liefert folgende Resultate: +
  + + + + + + +
E_OK : kein Fehler aufgetreten +
EBADF : falsche Kennung + +
+ +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Dateifunktionen +
  +
Bemerkung: Diese Funktion wird oft benutzt, um die Eingabe oder Ausgabe +eines Child Prozess umzuleiten. Sie sollte zusammen mit Fdup benutzt +werden, um das Standardhandle wiederherzustellen, bevor sich der Child +Prozess beendet. Dabei muß beachtet werden, daß jedes Dateihandle, +das auf ein Standardhandle (z.B. con:) umgeleitet wird, automatisch +geschlossen wird wenn sich der Child Prozess beendet und nicht vom +Parent geschlossen werden darf. +
  +
Querverweis: Binding   Fdup   Verzeichnis U:\DEV +
  + +
+ +

5.9.16.1 Bindings für Fforce

+ + + + + + + + + +
C: int16_t Fforce ( int16_t stdh, int16_t nonstdh ); +
  +
Assembler: +
  +
move.w    nonstdh,-(sp)  ; Offset 4
+move.w    stdh,-(sp)     ; Offset 2
+move.w    #70,-(sp)      ; Offset 0
+trap      #1             ; GEMDOS aufrufen
+addq.l    #6,sp          ; Stack korrigieren
+
+
GFA-Basic Fehler%=Gemdos(&H46,W:stdh%,W:nonstdh%) +
  + +
+ +

5.9.17 Ffstat64

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Ffstat64« - erweiterte Fileattribute einer geöffneten Datei +ermitteln. +
  +
Gemdosnummer: 349 (0x15d) +
  +
Deklaration: int32_t Ffstat64 ( int16_t fd, STAT *stat ); +
  +
Beschreibung: Die Funktion ermittelt die erweiterten Attribute der Datei, +deren Dateihandle in fd angegeben ist, und speichert diese in +stat. +
  +
Hinweis: Diese Funktion ist äquivalent zu einem Aufruf +von Fcntl (Modus F_STAT64). +
  +
Ergebnis: Die Funktion kann folgende Rückgabewerte liefern: +
  + + + + + + + + + +
E_OK : kein Fehler aufgetreten. +
EFILNF : Datei nicht gefunden. +
EPTHNF : Pfad zur Datei nicht gefunden. + +
+ +
Verfügbar: Sie steht ab FreeMiNT 1.16 zur Verfügung. +
  +
Gruppe: Dateifunktionen +
  +
Querverweis: Binding   Fattrib   Fsnext   Fstat64   STAT +
  + +
+ +

5.9.17.1 Bindings für Ffstat64

+ + + + + + +
C: int32_t Ffstat64 ( int16_t d, STAT *stat ); +
  +
Assembler: +
  +
pea       stat         ; Offset  4
+move.w    fd,-(sp)     ; Offset  2
+move.w    #349,-(sp)   ; Offset  0
+trap      #1           ; GEMDOS aufrufen
+lea       8(sp),sp     ; Stack korrigieren
+
+ +
+ +

5.9.18 Fgetchar

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Fgetchar« - Zeichen aus einer Datei lesen. +
  +
Gemdosnummer: 263 +
  +
Deklaration: int32_t Fgetchar ( int16_t fh, int16_t mode ); +
  +
Beschreibung: Die Funktion liest ein Zeichen aus der Datei mit der Handle +fh. Der Parameter mode ist nur dann von Interesse, +wenn die geöffnete Datei ein (Pseudo-)Terminal ist. Für diesen Fall +gelten die folgenden Werte: +
  + + + + + + + + + + + + + + + +
mode Bedeutung +
    +
0 Raw-Mode +
keine Auswertung von Kontrollzeichen. +
1 Cooked-Mode +
spezielle Kontrollzeichen (Control-C, Control-Z) werden gesucht +und ggfs. interpretiert. Das selbe gilt für die Flußkontrolle +(Control-S, Control-Q). +
2 Echo-Mode +
Gelesene Zeichen werden auf dem Terminal ausgegeben. + +
+ +
Der ASCII-Wert des gelesenen Zeichens wird im Low-Byte des +Funktionsergebnisses abgelegt. Für den Fall, daß die Datei ein +(Pseudo-)Terminal ist, werden Scan-Code und Shift-Status wie bei +Bconin zurückgeliefert. +
  +
Die einzelnen Modi von mode können natürlich auch +durch eine ODER-Operation verknüpft werden. +
  +
Achtung: Diese Funktion ist optional, daher darf ein +Aufruf mit EINVFN beantwortet werden. +
  +
Ergebnis: Die Funktion kann folgende Rückgabewerte liefern: +
  + + + + + + + + + +
>= 0 : kein Fehler, sondern das gelesene Zeichen. +
0xff1a : End-of-File (EOF) wurde erkannt. +
EBADF : ungültiges Datei-Handle. + +
+ +
Verfügbar: Seit der ersten in MultiTOS integrierten MiNT Version 1.04. +
  +
Gruppe: Dateifunktionen +
  +
Querverweis: Binding   Bconin   Cconin   Cauxin   Fputchar   Fread +
  + +
+ +

5.9.18.1 Bindings für Fgetchar

+ + + + + + +
C: int32_t Fgetchar ( int16_t fh, int16_t mode ); +
  +
Assembler: +
  +
move.w    mode,-(sp)   ; Offset 4
+move.w    fh,-(sp)     ; Offset 2
+move.w    #263,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

5.9.19 Fgetdta

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »get disk transfer address« - ermittelt den +Übertragungsbereich für Diskettenoperationen. +
  +
Gemdosnummer: 47 +
  +
Deklaration: DTA *Fgetdta ( void ); +
  +
Beschreibung: Die GEMDOS-Routine Fgetdta ermittelt die Adresse eines Buffers +für Fsfirst und Fsnext. +
  +
Ergebnis: Die Funktion liefert als Ergebnis die Adresse der DTA +(Disk Transfer Address). +
  +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Dateifunktionen +
  +
Bemerkung: Nach dem Start eines Programms überlappt dessen DTA die +Komamndozeile. Wird keine neue DTA angelegt, überschreibt jeder +Aufruf von Fsfirst oder Fsnext die Kommandozeile des Programms. Um +dies zu vermeiden, sollte vor dem ersten Aufruf von Fsfirst oder +Fsnext mit Fsetdta eine neue DTA angelegt werden. Vorsicht ist +geboten, wenn die DTA als lokale oder Auto-Variable angelegt wird und +der ursprüngliche Zustand nicht wiederhergestellt wurde, bevor der +Gültigkeitsbereich der Variable verlassen wird. +
  +
Querverweis: Binding   Fsetdta   Fsfirst   Fsnext   DTA +
  + +
+ +

5.9.19.1 Bindings für Fgetdta

+ + + + + + + + + +
C: DTA *Fgetdta ( void ); +
  +
Assembler: +
  +
move.w    #47,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+
GFA-Basic Pointer%=Gemdos(&H2F) +
  + +
+ +

5.9.20 Finstat

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Finstat« - Eingabestatus für ein File festlegen. +
  +
Gemdosnummer: 261 +
  +
Deklaration: int32_t Finstat ( int16_t fh ); +
  +
Beschreibung: Die Funktion Finstat gibt die maximale Anzahl der Bytes +zurück, die aus der Datei mit dem Handle fh ohne zu Warten +gelesen werden können. +
  +
Wenn die Anzahl der Bytes nicht genau angegeben werden kann, +wird der Wert 1 zurückgeliefert. +
  +
Hinweis: In MagiC versucht der Kernel zunächst, den +Aufruf auf Fcntl (FIONREAD) zurückzuführen. Wenn diese Subfunktion +von dev_ioctl nicht existiert (d.h. der Dateitreiber liefert EINVFN), +wird dev_stat aufgerufen. In diesem Fall kann nur die Aussage +getroffen werden "Zeichen liegt an" (Rückgabe == 1) bzw. +"kein Zeichen liegt an" (Rückgabe == 0). FAT-Dateien und +Shared Memory liefern die tatsächliche Dateilänge minus der +aktuellen Position. Pipes liefern die Anzahl der vorhandenen Bytes im +Block. +
  +
Ergebnis: Die Funktion kann folgende Rückgabewerte liefern: +
  + + + + + + +
>= 0 : kein Fehler aufgetreten (Anzahl der Bytes). +
EBADF : ungültiges Datei-Handle. + +
+ +
Verfügbar: Seit der ersten in MultiTOS integrierten MiNT Version 1.04 und +in MagiC ab Version 3.0. +
  +
Gruppe: Dateifunktionen +
  +
Querverweis: Binding   Cauxis   Cconis   Fcntl   Foutstat +
  + +
+ +

5.9.20.1 Bindings für Finstat

+ + + + + + +
C: int32_t Finstat ( int16_t fh ); +
  +
Assembler: +
  +
move.w    fh,-(sp)     ; Offset 2
+move.w    #261,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

5.9.21 Flink

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Flink« - erzeugt einen neuen (Hard-)Link auf ein File. +
  +
Gemdosnummer: 301 +
  +
Deklaration: int32_t Flink ( int8_t *oldname, int8_t *newname ); +
  +
Beschreibung: Die Funktion Flink erzeugt einen neuen Namen (newname) +für die Datei mit dem Namen oldname. Die Datei kann +anschließend unter beiden Namen angesprochen werden, und das Löschen +(per Fdelete) eines Namens hat keinen Einfluß auf den anderen. +
  +
Zu beachten ist, daß sich oldname und newname +auf demselben physikalischen Laufwerk befinden müssen, und nicht alle +Filesysteme die Möglichkeit bieten, Links zu setzen. +
  +
Ergebnis: Die Funktion kann folgende Rückgabewerte liefern: +
  + + + + + + + + + + + + + + + +
E_OK : kein Fehler aufgetreten. +
EINVFN : das Filesystem unterstützt keine Hard-Links. +
EFILNF : die Datei oldname existiert nicht. +
EXDEV : (siehe unten) +
ENSAME : die Dateien oldname/newname befinden sich nicht +auf dem gleichen physikalischen Laufwerk. + +
+ +
Verfügbar: Verfügbar, wenn ein 'MiNT' Cookie mit einer Versionsnummer von +mindestens 0.90 existiert und in MagiC ab Version 3.0. +
  +
Gruppe: Dateifunktionen +
  +
Querverweis: Binding   Frename   Fsymlink   XFS-Konzept in MagiC +
  + +
+ +

5.9.21.1 Bindings für Flink

+ + + + + + +
C: int32_t Flink ( int8_t *oldname, int8_t *newname ); +
  +
Assembler: +
  +
pea       newname      ; Offset 6
+pea       oldname      ; Offset 2
+move.w    #301,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+lea       $A(sp),sp    ; Stack korrigieren
+
+ +
+ +

5.9.22 Flock

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »file record locking« - Teile einer Datei sperren oder +freigeben. +
  +
Gemdosnummer: 92 +
  +
Deklaration: int32_t Flock ( int16_t handle, int16_t mode, int32_t start, +int32_t length ); +
  +
Beschreibung: Die GEMDOS-Routine Flock dient dazu, Teile von Dateien gegen +den Zugriff von anderen Prozessen zu schützen. Es gilt: +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Dateikennung +
mode + + + + + + +
0 = Blockierung setzen +
1 = Blockierung aufheben + +
+ +
start Startposition in der Datei +
length Anzahl der betroffenen Bytes + +
+ +
Achtung: Diese Funktion ist optional, daher darf ein +Aufruf mit EINVFN beantwortet werden. Es sollte insbesondere beachtet +werden, daß Flock nicht auf allen installierten Dateisystemen +zur Verfügung stehen muss. +
  +
Ergebnis: Die Funktion liefert folgende Resultate: +
  + + + + + + + + + +
E_OK : kein Fehler aufgetreten +
ELOCKED : Blockierung bereits vorhanden +
ENSLOCK : Zu entfernende Blockierung existiert nicht + +
+ +
Verfügbar: Nur vorhanden wenn der Cookie _FLK gesetzt ist. +
  +
Gruppe: Dateifunktionen +
  +
Querverweis: Binding   Fcreate   Fopen   Fclose   Fdelete   Ptermres   +F_SETLK +
  + +
+ +

5.9.22.1 Bindings für Flock

+ + + + + + +
C: int32_t Flock ( int16_t handle, int16_t mode, int32_t start, +int32_t length ); +
  +
Assembler: +
  +
move.l    length,-(sp)  ; Offset 10
+move.l    start,-(sp)   ; Offset  6
+move.w    mode,-(sp)    ; Offset  4
+move.w    handle,-(sp)  ; Offset  2
+move.w    #92,-(sp)     ; Offset  0
+trap      #1            ; GEMDOS aufrufen
+lea       $E(sp),sp     ; Stack korrigieren
+
+ +
+ +

5.9.23 Fmidipipe

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Fmidipipe« - MIDI Ein/Ausgabe umlenken. +
  +
Gemdosnummer: 294 +
  +
Deklaration: int32_t Fmidipipe ( int16_t pid, int16_t in, int16_t out ); +
  +
Beschreibung: Die Funktion verändert die GEMDOS-Handles für MIDI Ein- und +Ausgabe für den Prozeß mit der Kennung pid. Die Parameter +in bzw. out beschreiben die GEMDOS-Handles, welche +für den angegebenen Prozeß die MIDI-Eingabe bzw. -ausgabe +übernehmen. +
  +
Im Fall pid = 0, wird der aktuelle Prozeß benutzt. Dann +ist der Funktionsaufruf äquivalent zu den folgenden beiden Zeilen: +
  +
Fforce (-4, in);
+Fforce (-5, out);
+
+
Ergebnis: Die Funktion kann folgende Rückgabewerte liefern: +
  + + + + + + + + + + + + +
E_OK : kein Fehler aufgetreten. +
EFILNF : der Prozeß pid wurde nicht gefunden. +
EACCDN : in/out sind nicht zum Lesen bzw. Schreiben +geöffnet. +
EBADF : in/out ist kein gültiges Handle. + +
+ +
Verfügbar: Verfügbar, wenn ein 'MiNT' Cookie mit einer Versionsnummer von +mindestens 0.90 existiert. +
  +
Gruppe: Dateifunktionen +
  +
Querverweis: Binding   Fdup   Fforce   Test auf Pipes +
  + +
+ +

5.9.23.1 Bindings für Fmidipipe

+ + + + + + +
C: int32_t Fmidipipe ( int16_t pid, int16_t in, int16_t out ); +
  +
Assembler: +
  +
move.w    out,-(sp)    ; Offset 6
+move.w    in,-(sp)     ; Offset 4
+move.w    pid,-(sp)    ; Offset 2
+move.w    #294,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #8,sp        ; Stack korrigieren
+
+ +
+ +

5.9.24 Fopen

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »file open« - öffnet eine Datei. +
  +
Gemdosnummer: 61 +
  +
Deklaration: int32_t Fopen ( const int8_t *fname, int16_t mode ); +
  +
Beschreibung: Die GEMDOS-Routine Fopen dient dazu, Dateien zu öffnen. Es +gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
fname Name der zu öffnenden Datei +
mode Modus als Bitvektor + + + + + + + + + + + + +
Bit-0..2 = Zugriffsmodus + + + + + + + + + +
0 = nur lesen +
1 = nur schreiben +
2 = lesen und schreiben + +
+ +
Bit-3 = reserviert (auf Null setzen) +
Bit-4..6 = Sharing-Modus +
Bit-7 = Vererbungsflag + +
+ +
Die Bits 3..7 stehen nur bei einem GEMDOS mit Filelocking +Erweiterungen (Cookie _FLK testen) zu Verfügung. Das Vererbungsflag +bestimmt, ob vom Prozess gestartete Childs das entsprechende Handle +erben und die gleichen Zugriffsrechte haben. Wenn das Flag gesetzt +ist, muß das Child jede Datei, die es nutzen möchte, erneut öffnen +und hat die gleichen Restriktionen wie jeder andere Prozess. Der +Sharing-Modus legt fest, auf welche Art andere Prozesse auf die Datei +zugreifen dürfen, wenn sie erst einmal geöffnet ist. Es gilt: + + + + + + + + + + + + + + + + + + + + + +
Sharing Bedeutung +
    +
0 Kompatibilitätsmodus (wird von den Programmen benutzt, die +nichts von den Netzwerkerweiterungen wissen). +
1 Lesen und Schreiben verbieten (die Datei darf kein zweites Mal +geöffnet werden). +
2 Schreiben verbieten (die Datei darf nur noch zum Lesen +geöffnet werden). +
3 Lesen verbieten (die Datei darf nur noch zum Schreiben +geöffnet werden). +
4 Alles ist erlaubt. + +
+ + +
+ +
Achtung: Das File-Locking kann beratend implementiert +sein, d.h. daß es möglich sein kann, auf Bereiche trotz eines +vorgenommenen Lockings zuzugreifen. Programme, die File-Locking +unterstützen, sollten daher vor einem Zugriff selbst einen +Lock setzen und diesen unmittelbar nach dem Zugriff wieder +freigeben. So ist garantiert, daß etwaige Locks anderer Seiten +respektiert werden. +
  +
In MiNT und MagiC stehen darüber hinaus die folgenden Modi zur +Verfügung: +
  + + + + + + + + + + + + + + + + + + + + + +
mode Bedeutung +
    +
0x080 reserviert für MiNT. +
0x100 Datei bei I/O nicht blockieren. +
0x200 Datei erstellen, falls diese nicht exist. +
0x400 existierende Datei auf Null-Länge setzen. +
0x800 existierende Datei nicht öffnen. + +
+ +
Hinweis: Für einige Geräte existieren bereits +Standardkanal-Nummern, so daß es nicht notwendig ist, Fopen +aufzurufen. Im einzelnen: +
  + + + + + + + + + + + + + + + + + + +
Kanal Bedeutung +
    +
0 Tastatur (stdin) +
1 Bildschirm (stdout) +
2 serielle Schnittstelle (stdaux) +
3 parallele Schnittstelle (stdprn) + +
+ +
Lt. Atari sind die Standardkanal-Nummern 4 und 5 reserviert, so +daß normale Kanalnummern für Dateien erst bei 6 beginnen. +
  +
Darüber hinaus lassen sich auch die folgenden +zeichenorientierten Geräte öffnen: +
  +
    +
  • PRN: (parallele Schnittstelle, -3) +
  • +
  • AUX: (serielle Schnittstelle, -2) +
  • +
  • CON: (Konsole, -1) +
  • +
+ +
Symbolische Links werden von dieser Funktion automatisch +dereferenziert, d.h. wenn die Datei bereits als symbolischer Link +existiert, wird die davon referenzierte Datei geöffnet bzw., je nach +Modus, auf die Länge Null gebracht. +
  +
Ergebnis: Die Funktion liefert die entsprechende Dateikennung, oder eine +negative Fehlermeldung zurück. +
  +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Dateifunktionen +
  +
Querverweis: Binding   Fcreate   Ein-/Ausgabekanäle des BIOS   F_SETLK +
  + +
+ +

5.9.24.1 Bindings für Fopen

+ + + + + + + + + +
C: int32_t Fopen ( const int8_t *fname, int16_t mode ); +
  +
Assembler: +
  +
move.w    mode,-(sp)   ; Offset 6
+pea       fname        ; Offset 2
+move.w    #61,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #8,sp        ; Stack korrigieren
+
+
GFA-Basic Handle%=Gemdos(&H3D,L:fname%,W:mode%) +
  + +
+ +

5.9.25 Foutstat

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Foutstat« - Ausgabestatus für ein File festlegen. +
  +
Gemdosnummer: 262 +
  +
Deklaration: int32_t Foutstat ( int16_t fh ); +
  +
Beschreibung: Die Funktion Foutstat gibt die Anzahl der Bytes zurück, die in +die Datei mit der Handle fh ausgegeben werden können, ohne +den entsprechenden Prozeß zu blockieren. +
  +
Wenn die Anzahl der Bytes nicht genau angegeben werden kann, +wird der Wert 1 zurückgeliefert. +
  +
Hinweis: In MagiC versucht der Kernel zunächst, den +Aufruf auf Fcntl (FIONWRITE) zurückzuführen. Wenn diese Subfunktion +von dev_ioctl nicht existiert (d.h. der Dateitreiber liefert EINVFN), +wird dev_stat aufgerufen. In diesem Fall kann nur die Aussage +getroffen werden "ein Zeichen kann geschrieben werden" +(Rückgabe == 1) bzw. "kein Zeichen kann geschrieben werden" +(Rückgabe == 0). FAT-Dateien liefern stets den Wert 1, Shared Memory +die tatsächliche Dateilänge minus der aktuellen Position. Pipes +liefern die Anzahl der noch freien Bytes im Block. +
  +
Ergebnis: Die Funktion kann folgende Rückgabewerte liefern: +
  + + + + + + +
>= 0 : kein Fehler aufgetreten (Anzahl der Bytes). +
EBADF : ungültiges Datei-Handle. + +
+ +
Derzeit liefert diese Funktion immer 1 für Dateien auf +Massenspeicher zurück. +
  +
Verfügbar: Seit der ersten in MultiTOS integrierten MiNT Version 1.04 und +in MagiC ab Version 3.0. +
  +
Gruppe: Dateifunktionen +
  +
Querverweis: Binding   Cauxos   Cconos   Cprnos   Fcntl   Finstat +
  + +
+ +

5.9.25.1 Bindings für Foutstat

+ + + + + + +
C: int32_t Foutstat ( int16_t fh ); +
  +
Assembler: +
  +
move.w    fh,-(sp)     ; Offset 2
+move.w    #262,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

5.9.26 Fpipe

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Fpipe« - erzeugt eine Pipe. +
  +
Gemdosnummer: 256 +
  +
Deklaration: int32_t Fpipe ( int16_t usrh[2] ); +
  +
Beschreibung: Die Funktion erzeugt eine Pipe, die für +Interprozeß-Kommunikation (IPC) benutzt werden kann. Sie wird +normalerweise von Shells benutzt, die den Input und Output ihres +Childs umleiten möchten. Vor dem Start des Childs leitet die Shell +ihren input und output (falls nötig) auf das Leseende und Schreibende +der neu erzeugten Datei um. Bei erfolgreichem Aufruf werden in +usrh zwei GEMDOS-Handles geliefert. +
  +
usrh[0] ist dabei das Handle für das Leseende der Pipe, +(Read-Only) während usrh[1] das Handle für das Schreibende +(Write-Only) der Pipe kennzeichnet. +
  +
Die auf diese Weise erzeugte Pipe wird im Verzeichnis U:\PIPE +als Pseudo-Datei angelegt und mit dem Namen 'sys$pipe.xxx' versehen, +wobei xxx als dreistellige ganze Zahl aufzufassen ist. +
  +
Ergebnis: Die Funktion kann folgende Rückgabewerte liefern: +
  + + + + + + + + + + + + +
E_OK : kein Fehler aufgetreten. +
ENHNDL : keine 2 Handles mehr frei. +
EACCDN : keine Pipeline mehr frei (max. 999 verfügbar). +
ENSMEM : nicht genug Speicher vorhanden, um die Pipe zu erzeugen. + +
+ +
Verfügbar: Verfügbar, wenn ein 'MiNT' Cookie mit einer Versionsnummer von +mindestens 0.90 existiert und in MagiC ab Version 3.0. +
  +
Gruppe: Dateifunktionen +
  +
Querverweis: Binding   Fmidipipe   Test auf Pipes +
  + +
+ +

5.9.26.1 Bindings für Fpipe

+ + + + + + +
C: int32_t Fpipe ( int16_t usrh[2] ); +
  +
Assembler: +
  +
pea       usrh         ; Offset 2
+move.w    #256,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

5.9.27 Fpoll

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Fpoll« - Enquiry of the file status with timeout. +
  +
Opcode: 346 +
  +
Syntax: int32_t Fpoll (POLLFD *fds, uint32_t nfds, uint32_t timeout ); +
  +
Description: Fpoll() performs a similar task to Fselect: it waits for one of +a set of file descriptors to become ready to perform I/O. +
  +
The set of file descriptors to be monitored is specified in the +fds argument, which is an array of structures of the following form: +
  +
typedef struct pollfd
+{
+        int32_t  fd;            /* file descriptor */
+        uint16_t events;        /* requested events */
+        uint16_t revents;       /* returned events */
+} POLLFD;
+
+
The caller should specify the number of items in the fds array +in nfds. +
  +
The field fd contains a file descriptor for an open file. If +this field is negative, then the corresponding events field is ignored +and the revents field returns zero. (This provides an easy way of +ignoring a file descriptor for a single poll() call: simply negate the +fd field.) +
  +
The field events is an input parameter, a bit mask specifying +the events the application is interested in for the file descriptor +fd. If this field is specified as zero, then all events are ignored +for fd and revents returns zero. +
  +
The field revents is an output parameter, filled by the kernel +with the events that actually occurred. The bits returned in revents +can include any of those specified in events, or one of the values +POLLERR, POLLHUP, or POLLNVAL. (These three bits are meaningless in +the events field, and will be set in the revents field whenever the +corresponding condition is true.) +
  +
If none of the events requested (and no error) has occurred for +any of the file descriptors, then poll() blocks until one of the +events occurs. +
  +
The timeout argument specifies the minimum number of +milliseconds that poll() will block. (This interval will be rounded up +to the system clock granularity, and kernel scheduling delays mean +that the blocking interval may overrun by a small amount.) Specifying +a negative value in timeout means an infinite timeout. Specifying a +timeout of zero causes poll() to return immediately, even if no file +descriptors are ready. +
  +
The bits that may be set/returned in events and revents are +defined in <poll.h>: +
  + + + + + + + + + + + + + + + + + + + + + +
POLLIN There is data to read. +
POLLPRI There is urgent data to read (e.g., out-of-band data on TCP +socket; pseudoterminal master in packet mode has seen state change in +slave). +
POLLOUT Writing now will not block. +
POLLRDHUP Stream socket peer closed connection, or shut down writing half +of connection. The _GNU_SOURCE feature test macro must be defined +(before including any header files) in order to obtain this +definition. +
POLLERR Error condition (output only). +
POLLHUP Hang up (output only). +
POLLNVAL Invalid request: fd not open (output only). + +
+ +
When compiling with _XOPEN_SOURCE defined, one also has the +following, which convey no further information beyond the bits listed +above: +
  + + + + + + + + + + + + +
POLLRDNORM Equivalent to POLLIN. +
POLLRDBAND Priority band data can be read (generally unused on MiNT). +
POLLWRNORM Equivalent to POLLOUT. +
POLLWRBAND Priority data may be written. + +
+ +
MiNT(Lib) also knows about, but does not use POLLMSG. +
  +
Return value: The function can return the following results: +
  + + + + + + + + + + + + + + + + + + + + + +
0 : The call timed out and no file descriptors were ready. +
>0 : The number of structures which have nonzero revents fields (in +other words, those descriptors with events or errors reported). +
EBADF : At least one of the handles is not assigned to an open file. +
EFAULT : The array given as argument was not contained in the calling +program's address space. +
EINTR : A signal occurred before any requested event; see Psignal. +
EINVAL : The nfds value exceeds the RLIMIT_NOFILE value. +
ENOMEM : There was no space to allocate file descriptor tables. + +
+ +
Availability: This function is available as of FreeMiNT 1.15.12. +
  +
Group: File functions +
  +
See also: Binding   Fselect   Finstat   Foutstat +
  + +
+ +

5.9.27.1 Bindings for Fpoll

+ + + + + + +
C: int32_t Fpoll (POLLFD *fds, uint32_t nfds, uint32_t timeout ); +
  +
Assembler: +
  +
move.l    timeout,-(sp)  ; Offset  10
+move.l    nfds,-(sp)     ; Offset  6
+pea       fds            ; Offset  2
+move.w    #346,-(sp)     ; Offset  0
+trap      #1             ; GEMDOS
+lea       14(sp),sp      ; Correct stack
+
+ +
+ +

5.9.28 Fputchar

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Fputchar« - Zeichen in ein File ausgeben. +
  +
Gemdosnummer: 264 +
  +
Deklaration: int32_t Fputchar ( int16_t fh, int32_t ch, int16_t mode ); +
  +
Beschreibung: Die Funktion schreibt ein Zeichen in die Datei mit dem Handle +fh. Der Parameter mode ist nur von Bedeutung, wenn die +Datei ein (Pseudo-)Terminal ist: +
  + + + + + + + + + + + + +
mode Bedeutung +
    +
0 Raw-Mode +
keine Auswertung der Sonderzeichen. +
1 Cooked-Mode +
spezielle Kontrollzeichen (Control-C, Control-Z) werden gesucht +und ggfs. interpretiert. Das selbe gilt für die Flußkontrolle +(Control-S, Control-Q). + +
+ +
Wenn die Datei ein (Pseudo-)Terminal ist, können alle 4 Bytes +übertragen werden. Auf diese Art und Weise ist es möglich, +simulierte BIOS-Scancodes und Shift-Statusmeldungen zu übertragen. +Anderenfalls wird nur das Low-Byte von ch übertragen. +
  +
Ergebnis: Die Funktion kann folgende Rückgabewerte liefern: +
  + + + + + + + + + + + + + + + +
4 : Anzahl geschriebener Bytes, wenn Datei ein Terminal ist. +
1 : Ausgabe erfolgreich, aber Datei ist kein Terminal. +
0 : Bytes konnten nicht ausgegeben werden. +
EBADF : ungültiges Datei-Handle. +
  Ein negativer BIOS Fehlercode, wenn ein I/O Fehler auftrat. + +
+ +
Verfügbar: Seit der ersten in MultiTOS integrierten MiNT Version 1.04. +
  +
Gruppe: Dateifunktionen +
  +
Querverweis: Binding   Bconout   Cauxout   Cconout   Crawio   Fgetchar   +Fwrite +
  + +
+ +

5.9.28.1 Bindings für Fputchar

+ + + + + + +
C: int32_t Fputchar ( int16_t fh, int32_t ch, int16_t mode ); +
  +
Assembler: +
  +
move.w    mode,-(sp)   ; Offset 8
+move.l    ch,-(sp)     ; Offset 4
+move.w    fh,-(sp)     ; Offset 2
+move.w    #264,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+lea       $A(sp),sp    ; Stack korrigieren
+
+ +
+ +

5.9.29 Fread

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »file read« - Datei lesen. +
  +
Gemdosnummer: 63 +
  +
Deklaration: int32_t Fread ( int16_t handle, int32_t count, void *buf ); +
  +
Beschreibung: Die GEMDOS-Routine Fread liest eine bestimmte Anzahl von Bytes +aus einer Datei. Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Dateikennung +
count Anzahl der zu lesenden Bytes +
buf Adresse des aufnehmenden Puffers (mindestens Platz für +count Bytes) + +
+ +
Hinweis: In allen GEMDOS-Versionen < 0.15 kommt es +zum System-Stillstand, wenn der Parameter count den Wert 0 besitzt. +Beim Lesen von Standardkanälen dürfen maximal 16383 Zeichen gelesen +werden. +
  +
Ergebnis: Die Funktion liefert als Ergebnis die Anzahl der gelesenen +Zeichen. Die Anazhl gelesener Bytes kann kleiner als count +sein, wenn ein EOF (end of file) erreicht wird. Im Fehlerfall gilt: +
  + + + + + + +
EBADF : falsche Dateikennung +
ELOCKED : Datei-Abschnitt ist markiert + +
+ +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Dateifunktionen +
  +
Querverweis: Binding   Fwrite   FIONREAD +
  + +
+ +

5.9.29.1 Bindings für Fread

+ + + + + + + + + +
C: int32_t Fread ( int16_t handle, int32_t count, void *buf ); +
  +
Assembler: +
  +
pea       buf           ; Offset 8
+move.l    count,-(sp)   ; Offset 4
+move.w    handle,-(sp)  ; Offset 2
+move.w    #63,-(sp)     ; Offset 0
+trap      #1            ; GEMDOS aufrufen
+lea       $C(sp),sp     ; Stack korrigieren
+
+
GFA-Basic Fehler%=Gemdos(&H3F,W:handle%,L:count%,L:buf%) +
  + +
+ +

5.9.30 Freadlink

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Freadlink« - symbolischen Link verfolgen. +
  +
Gemdosnummer: 303 +
  +
Deklaration: int32_t Freadlink ( int16_t bufsiz, int8_t *buf, int8_t *name +); +
  +
Beschreibung: Die Funktion ermittelt den Dateinamen des symbolischen Links +name. Dies ist der Name, der bei Fsymlink als erster Parameter +angegeben wurde. +
  +
Der Name wird im Puffer buf abgelegt, der eine Länge +von bufsiz Zeichen umfaßt. +
  +
Ergebnis: Die Funktion kann folgende Rückgabewerte liefern: +
  + + + + + + + + + + + + + + + +
E_OK : kein Fehler aufgetreten. +
EINVFN : das Filesystem von name erlaubt keine symb. Links. +
EFILNF : der symbolische Link name wurde nicht gefunden. +
EACCDN : name ist kein symbolischer Link. +
ERANGE : der Puffer buf ist zu klein für den zu ermittelnden +Dateinamen. + +
+ +
Verfügbar: Verfügbar, wenn ein 'MiNT' Cookie mit einer Versionsnummer von +mindestens 0.90 existiert und in MagiC ab Version 3.0. +
  +
Gruppe: Dateifunktionen +
  +
Querverweis: Binding   Fsymlink   XFS-Konzept in MagiC +
  + +
+ +

5.9.30.1 Bindings für Freadlink

+ + + + + + +
C: int32_t Freadlink ( int16_t bufsiz, int8_t *buf, int8_t *name +); +
  +
Assembler: +
  +
pea       Name          ; Offset 10
+pea       buf           ; Offset  6
+move.w    bufsiz,-(sp)  ; Offset  2
+move.w    #303,-(sp)    ; Offset  0
+trap      #1            ; GEMDOS aufrufen
+lea       $C(sp),sp     ; Stack korrigieren
+
+ +
+ +

5.9.31 Frename

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »file rename« - Datei umbenennen. +
  +
Gemdosnummer: 86 +
  +
Deklaration: int32_t Frename ( const int8_t *oldname, const int8_t *newname +); +
  +
Beschreibung: Die GEMDOS-Routine Frename dient zum Umbenennen von Dateien. +Der neue Name darf auch einen kompletten Zugriffspfad innerhalb des +betreffenden Laufwerks enthalten. In diesem Fall wird die Datei +verschoben. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
oldname Zeiger auf bisherigen Namen +
newname Zeiger auf neuen Namen + +
+ +
Hinweis: Ab GEMDOS-Version 0.15 ist es möglich auch den +Namen von Verzeichnissen zu verändern. Diese können jedoch nicht +verschoben werden. Man sollte es vermeiden, Dateien umzubenennen, die +bereits geöffnet sind. +
  +
Anmerkung zu MagiC: Es ist Sache des XFS zu +entscheiden, ob Verzeichnisse umbenannt oder verschoben werden +dürfen. Das integrierte DOS-XFS erlaubt erst seit MagiC 5 ein +Verschieben von Verzeichnissen. +
  +
Ergebnis: Die Funktion liefert folgende Resultate: +
  + + + + + + + + + + + + +
E_OK : kein Fehler aufgetreten +
EPTHNF : Verzeichnis nicht gefunden +
EACCDN : Zugriff verweigert (Schreibschutz) +
ENSAME : Ziel ist nicht das gleiche Laufwerk + +
+ +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Dateifunktionen +
  +
Querverweis: Binding   Fdelete   XFS-Konzept in MagiC +
  + +
+ +

5.9.31.1 Bindings für Frename

+ + + + + + + + + +
C: int32_t Frename ( const int8_t *oldname, const int8_t *newname +); +
  +
Assembler: +
  +
pea       newname      ; Offset 8
+pea       oldname      ; Offset 4
+move.w    #0,-(sp)     ; Offset 2
+move.w    #86,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+lea       $C(sp),sp    ; Stack korrigieren
+
+
Hinweis: Der Null-Parameter wird beim C-Binding +normalerweise automatisch hinzugefügt. +
  +
GFA-Basic Fehler%=Gemdos(&H56,W:0,L:oldname%,L:newname%) +
  + +
+ +

5.9.32 Fseek

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »file seek« - Dateiposition verschieben. +
  +
Gemdosnummer: 66 +
  +
Deklaration: int32_t Fseek ( int32_t offset, int16_t handle, int16_t +seekmode ); +
  +
Beschreibung: Die GEMDOS-Routine Fseek erlaubt es, den Dateizeiger innerhalb +einer Datei neu zu positionieren. Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
offset Anzahl der Bytes, die übersprungen werden sollen +
handle Dateikennung +
seekmode Art der Positionierung + + + + + + + + + +
0 = vom Dateianfang +
1 = ab aktueller Position +
2 = vom Dateiende + +
+ + +
+ +
Hinweis: Auf Pipes angewandt liefert die Funktion den +Wert EACCDN; damit können Applikationen Geräte und Pipes +unterscheiden. +
  +
Ergebnis: Die Funktion liefert als positives Ergebnis die neue Position +innerhalb der Datei, oder eine negative Fehlermeldung. +
  +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Dateifunktionen +
  +
Querverweis: Binding   Fread   Fwrite   Test auf Pipes +
  + +
+ +

5.9.32.1 Bindings für Fseek

+ + + + + + + + + +
C: int32_t Fseek ( int32_t offset, int16_t handle, int16_t +seekmode ); +
  +
Assembler: +
  +
move.w    seekmode,-(sp)  ; Offset 8
+move.w    handle,-(sp)    ; Offset 6
+move.l    offset,-(sp)    ; Offset 2
+move.w    #66,-(sp)       ; Offset 0
+trap      #1              ; GEMDOS aufrufen
+lea       $A(sp),sp       ; Stack korrigieren
+
+
GFA-Basic Fehler%=Gemdos(&H42,L:offset%,W:handle%,W:seekmode%) +
  + +
+ +

5.9.33 Fseek64

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »file seek« - 64 bit Dateiposition verschieben. +
  +
Gemdosnummer: 332 (0x014c) +
  +
Deklaration: int32_t Fseek64 ( int32_t hioffset, uint32_t lowoffset, int16_t +handle, int16_t seekmode, int64_t *newpos ); +
  +
Beschreibung: Die GEMDOS-Routine Fseek64 erlaubt es, den Dateizeiger +innerhalb einer Datei neu zu positionieren. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
hioffset Anzahl der Bytes, die übersprungen werden sollen (high) +
lowoffset Anzahl der Bytes, die übersprungen werden sollen (low) +
handle Dateikennung +
seekmode Art der Positionierung + + + + + + + + + +
0 = vom Dateianfang +
1 = ab aktueller Position +
2 = vom Dateiende + +
+ +
newpos Neue Position + +
+ +
Hinweis: Auf Pipes angewandt liefert die Funktion den +Wert EACCDN; damit können Applikationen Geräte und Pipes +unterscheiden. +
  +
Hinweis: At the moment Fseek64() is only a wrapper +around Fseek() as there is no 64bit XFS/XDD support. If the specified +offset is greater than 2147483647L (2^31-1), the call fails and +returns EBADARG. +
  +
Ergebnis: Die Funktion liefert als positives Ergebnis die neue Position +innerhalb der Datei, oder eine negative Fehlermeldung. +
  +
Verfügbar: Sie steht ab FreeMiNT 1.15.10 zur Verfügung. +
  +
Gruppe: Dateifunktionen +
  +
Querverweis: Binding   Fread   Fseek   Fwrite   Test auf Pipes +
  + +
+ +

5.9.33.1 Bindings für Fseek64

+ + + + + + + + + +
C: int32_t Fseek64 ( int32_t hioffset, uint32_t lowoffset, int16_t +handle, int16_t seekmode, int64_t *newpos ); +
  +
Assembler: +
  +
pea       newpos          ; Offset 14
+move.w    seekmode,-(sp)  ; Offset 12
+move.w    handle,-(sp)    ; Offset 10
+move.l    lowoffset,-(sp) ; Offset 6
+move.l    hioffset,-(sp)  ; Offset 2
+move.w    #332,-(sp)      ; Offset 0
+trap      #1              ; GEMDOS aufrufen
+lea       $12(sp),sp      ; Stack korrigieren
+
+
GFA-Basic +Fehler%=Gemdos(&H14C,L:hioffset%,L:lowoffset%,W:handle%,W:seekmode%,L:newpos%) +
  + +
+ +

5.9.34 Fselect

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Fselect« - Abfrage des Dateistatus mit Timeout. +
  +
Gemdosnummer: 285 +
  +
Deklaration: int32_t Fselect ( uint16_t timeout, int32_t *rfds, int32_t +*wfds, ((int32_t) 0) ); +
  +
Beschreibung: Die Funktion kontrolliert, welche geöffneten Dateien zum Lesen +bzw. Schreiben bereit sind. Der Parameter rfds zeigt auf ein +Langwort, welches eine Menge von GEMDOS File-Deskriptoren +repräsentiert. +
  +
In diesem Langwort ist das Bit n gesetzt, wenn der +File-Deskriptor n auf Eingabe überprüft werden soll. Eine leere +Menge kann optional auch durch einen Nullzeiger dargestellt werden. +
  +
Analog zeigt wfds auf eine Menge von File-Deskriptoren, +deren Ausgabestatus überprüft werden soll. +
  +
Bei Rückkehr der Funktion werden in rfds und +wfds die Handles der Dateien übergeben, die zum Lesen bzw. +Schreiben bereit sind, und auch überprüft werden sollten. +
  +
Zur Zeit ist das einzige BIOS Gerät, das mit Fselect abgefragt +werden kann, die Tastatur. +
  +
Unter timeout kann angegeben werden, wieviele +Millisekunden gewartet werden soll, bevor die Funktion zurückkehrt. +Ein Wert von 0 bedeutet in diesem Zusammenhang, daß die Funktion +wartet, bis eine der angegebenen Dateien zum Lesen bzw. Schreiben +bereit ist. +
  +
Beispiel: +
  + + + + + + +
Fselect (0, 0L, 0L, 0L) wartet für immer. +
Fselect (1, 0L, 0L, 0L) wartet für eine Millisekunde. + +
+ +
Ergebnis: Die Funktion kann folgende Rückgabewerte liefern: +
  + + + + + + + + + +
0 : in der angegebenen Zeit wurde keine der Dateien zum Lesen bzw. +Schreiben bereit (Timeout). +
>0 : Summe der gesetzten Bits von rfds und wfds. +
EBADF : mindestens eine der Handles ist keiner geöffneten Datei +zuzuordnen. + +
+ +
Verfügbar: Seit der ersten in MultiTOS integrierten MiNT Version 1.04 +sowie MagiC seit Version 3.00. +
  +
Gruppe: Dateifunktionen +
  +
Querverweis: Binding   Finstat   Foutstat +
  + +
+ +

5.9.34.1 Bindings für Fselect

+ + + + + + +
C: int32_t Fselect ( uint16_t timeout, int32_t *rfds, int32_t +*wfds, ((int32_t) 0) ); +
  +
Assembler: +
  +
move.l    dummy,-(sp)    ; Offset 12
+pea       wfds           ; Offset  8
+pea       rfds           ; Offset  4
+move.w    timeout,-(sp)  ; Offset  2
+move.w    #285,-(sp)     ; Offset  0
+trap      #1             ; GEMDOS aufrufen
+lea       $10(sp),sp     ; Stack korrigieren
+
+ +
+ +

5.9.35 Fsetdta

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »set disk transfer address« - Setzen der Adresse für den +Übertragungsbereich für Diskettenoperationen. +
  +
Gemdosnummer: 26 +
  +
Deklaration: void Fsetdta ( DTA *buf ); +
  +
Beschreibung: Die GEMDOS-Routine Fsetdta setzt die Adresse auf einen +Speicherblock, der als neue DTA benutzt wird. Der Parameter +buf ist ein Zeiger auf diese Struktur. +
  +
Hinweis: Bei Programmstart wird die DTA ab dem Offset +0x80 in der Basepage eingerichtet. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Dateifunktionen +
  +
Querverweis: Binding   Fgetdta   Fsfirst   BASEPAGE   DTA +
  + +
+ +

5.9.35.1 Bindings für Fsetdta

+ + + + + + + + + +
C: void Fsetdta ( DTA *buf ); +
  +
Assembler: +
  +
pea       buf          ; Offset 2
+move.w    #26,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+
GFA-Basic Fehler%=Gemdos(&H1A,L:buf%) +
  + +
+ +

5.9.36 Fsfirst

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »search first file« - ersten Dateieintrag suchen. +
  +
Gemdosnummer: 78 +
  +
Deklaration: int32_t Fsfirst ( const int8_t *filename, int16_t attr ); +
  +
Beschreibung: Die GEMDOS-Routine Fsfirst erlaubt es, Informationen über +Dateien oder Verzeichnisse zu ermitteln. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
filename Zeiger auf den Dateinamen +
attr Attribute, die auf den gesuchten Dateityp passen sollen. + + + + + + + + + + + + + + + + + + +
Bit-0: Datei ist schreibgeschützt +
Bit-1: Datei ist versteckt +
Bit-2: Systemdatei +
Bit-3: Diskettenname +
Bit-4: Verzeichnis +
Bit-5: Archiv-Bit + +
+ + +
+ +
Der Pfadname kann auch die Joker '*' und '?' enthalten. Nach +Abschluß der Funktion steht der Verzeichniseintrag unter der +Diskettenübertragungsadresse DTA, die mit Fgetdta und Fsetdta +ermittelt bzw. festgelegt werden kann. Die Informationen können dann +der Struktur DTA entnommen werden. +
  +
Die DTA muss durch Fsfirst() initialisiert werden! +
  +
Hinweis: Falls das Programm in der MiNT-Domain läuft, +liefert Fsfirst 'lower case' Filenamen. Da es Filesysteme gibt die +case sensitiv arbeiten, sollten Sie diese Umwandlung auf keinen Fall +manuell durchführen. Wenn Sie hingegen unbedingt 'upper case' +Filenamen benötigen, sollten Sie Ihr Programm per Pdomain in der +TOS-Domain laufen lassen. +
  +
Anmerkung zu MagiC: Ist Bit-3 von attr gesetzt, so ruft +der Kernel die XFS-Funktion xfs_rlabel auf. Das aufrufende +Anwenderprogramm kann damit leider unter MagiC nicht mehr Datum und +Uhrzeit des Disknamens ermitteln. Der Kernel setzt alle Felder auf 0, +und die Funktion Fsnext darf dann nicht ausgeführt werden. Ab MagiC +3 wird stattdessen die Funktion Dreadlabel benutzt, die auch mit +langen Dateinamen zurechtkommt. +
  +
Ist Bit-3 von attr nicht gesetzt, wird wie in TOS nach Dateien +gesucht. Ist eine Datei ein symbolischer Link, ruft der DOS-Kernel die +Funktion Fxattr auf, um den Link zu verfolgen. Die von Fxattr +gelieferten Werte werden dann in die DTA kopiert. +
  +
Achtung: MagiC ist nicht immer in der Lage, relative +symbolische Links während eines Fsfirst/Fsnext korrekt auszuwerten. +Es bieten sich 3 Auswege an: +
  + + + + + + + + + +
(a) Am besten: Dxreaddir verwenden. +
(b) Nur absolute symbolische Links verwenden. +
(c) Das Suchverzeichnis jeweils zum aktuellen machen. + +
+ +
MiNT behandelt diesen Fall zwar korrekt, jedoch auf Kosten eines +gewaltigen Aufwands. Das Fsfirst/next-Konzept ist grundsätzlich +veraltet, ineffektiv und unsicher, und sollte sowohl in MiNT als auch +in MagiC vermieden werden. +
  +
Ergebnis: Die Funktion liefert folgende Resultate: +
  + + + + + + + + + +
E_OK : kein Fehler aufgetreten +
EFILNF : Datei nicht gefunden +
ENMFIL : keine weiteren Dateien + +
+ +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Dateifunktionen +
  +
Querverweis: Binding   Fgetdta   Fsetdta   Fsnext   DTA   rekursive Suche   XFS-Konzept +
  + +
+ +

5.9.36.1 Bindings für Fsfirst

+ + + + + + + + + +
C: int32_t Fsfirst ( const int8_t *filename, int16_t attr ); +
  +
Assembler: +
  +
move.w    attr,-(sp)   ; Offset 6
+pea       filename     ; Offset 2
+move.w    #78,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #8,sp        ; Stack korrigieren
+
+
GFA-Basic Fehler%=Gemdos(&H4E,L:filename%,W:attr%) +
  + +
+ +

5.9.37 Fsnext

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »search next file« - nächsten Dateieintrag suchen. +
  +
Gemdosnummer: 79 +
  +
Deklaration: int16_t Fsnext ( void ); +
  +
Beschreibung: Die GEMDOS-Routine Fsnext sucht den nächsten Dateieintrag auf +den die von Fsfirst gemachte Spezifizierung paßt. Die Funktion wird +nach einem Aufruf von Fsfirst so oft aufgerufen, wie sie Dateien +findet, die zur angegebenen Spezifizierung passen. +
  +
Diese Funktion benutzt die DTA der Applikation, die nach dem +Start in der Kommandozeile liegt. Fird diese Funktion benutzt, ohne +eine neue DTA zu setzen, wird die Kommandozeile überschrieben. +
  +
Hinweis: Falls das Programm in der MiNT-Domain läuft, +liefert Fsnext 'lower case' Filenamen. Da es Filesysteme gibt die case +sensitiv arbeiten, sollten Sie diese Umwandlung auf keinen Fall +manuell durchführen. Wenn Sie hingegen unbedingt 'upper case' +Filenamen benötigen, sollten Sie Ihr Programm per Pdomain in der +TOS-Domain laufen lassen. +
  +
Ergebnis: Die Funktion liefert als Ergebnis 0, wenn eine Datei gefunden +werden konnte, ansonsten eine negative Fehlermeldung. +
  +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Dateifunktionen +
  +
Querverweis: Binding   Fgetdta   Fsetdta   Fsfirst +
  + +
+ +

5.9.37.1 Bindings für Fsnext

+ + + + + + + + + +
C: int16_t Fsnext ( void ); +
  +
Assembler: +
  +
move.w    #79,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+
GFA-Basic Fehler%=Gemdos(&H4F) +
  + +
+ +

5.9.38 Fsymlink

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Fsymlink« - symbolischen Link auf ein File erzeugen. +
  +
Gemdosnummer: 302 +
  +
Deklaration: int32_t Fsymlink ( int8_t *oldname, int8_t *newname ); +
  +
Beschreibung: Die Funktion erzeugt einen symbolischen Link newname +für die Datei mit dem Namen oldname. Bei erfolgreichem Aufruf +kann die Datei anschließend unter beiden Namen angesprochen werden. +Ein Löschen per Fdelete für newname berührt die Datei +selbst nicht, sondern nur den symbolischen Link. Wird hingegen Fdelete +auf oldname angewendet, so wird die Datei wie gewohnt +gelöscht, und Zugriffe auf newname sind nicht mehr möglich. +
  +
Der Unterschied zu Hard-Links besteht darin, daß symbolische +Links zwischen verschiedenen physikalischen Geräten (und damit sogar +verschiedenen Filesystem-Typen) bestehen können. +
  +
Ergebnis: Die Funktion kann folgende Rückgabewerte liefern: +
  + + + + + + +
E_OK : kein Fehler aufgetreten. +
EINVFN : das Filesystem unterstützt keine symbolischen Links. + +
+ +
Verfügbar: Verfügbar, wenn ein 'MiNT' Cookie mit einer Versionsnummer von +mindestens 0.90 existiert und in MagiC ab Version 3.0. +
  +
Gruppe: Dateifunktionen +
  +
Querverweis: Binding   Flink   Freadlink   Frename   XFS-Konzept +
  + +
+ +

5.9.38.1 Bindings für Fsymlink

+ + + + + + +
C: int32_t Fsymlink ( int8_t *oldname, int8_t *newname ); +
  +
Assembler: +
  +
pea       newname      ; Offset 6
+pea       oldname      ; Offset 2
+move.w    #302,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+lea       $A(sp),sp    ; Stack korrigieren
+
+ +
+ +

5.9.39 Fstat64

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Fstat64« - erweiterte Fileattribute ermitteln. +
  +
Gemdosnummer: 331 (0x14b) +
  +
Deklaration: int32_t Fstat64 ( int16_t flag, int8_t *name, STAT *stat ); +
  +
Beschreibung: Die Funktion ermittelt die erweiterten Attribute der Datei, +deren vollständiger Name in name angegeben ist, und speichert +diese in stat. +
  +
Der Parameter flag gibt an, wie symbolische Links +behandelt werden sollen. Es gilt: +
  + + + + + + + + + + + + +
flag Bedeutung +
    +
0 symbolische Links werden bis zur Ursprungsdatei verfolgt, und +die erweiterten Attribute werden von dieser Datei ermittelt. (Dies +entspricht dem Vorgehen von stat unter UNIX). +
1 die erweiterten Attribute des symbolischen Links selbst werden +ermittelt. (Dies entspricht dem Vorgehen von lstat unter UNIX). + +
+ +
Hinweis: Diese Funktion ist äquivalent zu einem Aufruf +von Fcntl (Modus F_STAT64) mit dem Unterschied, daß statt eines +Dateinamens das Handle einer bereits geöffneten Datei übergeben +wird. +
  +
Ergebnis: Die Funktion kann folgende Rückgabewerte liefern: +
  + + + + + + + + + +
E_OK : kein Fehler aufgetreten. +
EFILNF : Datei nicht gefunden. +
EPTHNF : Pfad zur Datei nicht gefunden. + +
+ +
Verfügbar: Sie steht ab FreeMiNT 1.15.4 zur Verfügung. +
  +
Gruppe: Dateifunktionen +
  +
Querverweis: Binding   Fattrib   Fsnext   STAT +
  + +
+ +

5.9.39.1 Bindings für Fstat64

+ + + + + + +
C: int32_t Fstat64 ( int16_t flag, int8_t *name, STAT *stat ); +
  +
Assembler: +
  +
pea       stat         ; Offset 10
+pea       name         ; Offset  6
+move.w    flag,-(sp)   ; Offset  2
+move.w    #331,-(sp)   ; Offset  0
+trap      #1           ; GEMDOS aufrufen
+lea       $C(sp),sp    ; Stack korrigieren
+
+ +
+ +

5.9.40 Fsync

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Fsync« - Synchronize a file's in-core state with storage +device. +
  +
Opcode: 259 (0x0103) +
  +
Syntax: int16_t Fsync ( int16_t handle ); +
  +
Description: +
  +
Fsync() transfers ("flushes") all modified in-core +data of (i.e., modified buffer cache pages for) the file referred to +by the file descriptor fd to the disk device (or other permanent +storage device) so that all changed information can be retrieved even +after the system crashed or was rebooted. This includes writing +through or flushing a disk cache if present. The call blocks until the +device reports that the transfer has completed. It also flushes +metadata information associated with the file (see stat(2)). +
  +
Calling Fsync() does not necessarily ensure that the entry in +the directory containing the file has also reached disk. For that an +explicit Fsync() on a file descriptor for the directory is also +needed. +
  +
Warning: In MiNT this function is currently not +implemented and calls Sync() instead. +
  +
Return value: On success, these system call return zero. Otherwise, it +returns one of the following error codes: +
  + + + + + + + + + + + + +
EBADF : Incorrect file handle. +
EIO : An error occurred during synchronization. +
EROFS: +
EINVAL: "handle" is bound to a special file which does not +support synchronization. + +
+ +
Availability: Available as of FreeMiNT version 1.15.10. +
  +
Group: File functions +
  +
See also: Binding   Sync +
  + +
+ +

5.9.40.1 Bindings for Fsync

+ + + + + + +
C: int16_t Fsync ( int16_t handle ); +
  +
Assembler: +
  +
move.w    handle,-(sp)  ; Offset 2
+move.w    #259,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

5.9.41 Fwrite

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »file write« - auf Datei schreiben. +
  +
Gemdosnummer: 64 +
  +
Deklaration: int32_t Fwrite ( int16_t handle, int32_t count, void *buf ); +
  +
Beschreibung: Die GEMDOS-Routine Fwrite schreibt eine Anzahl von Bytes in +eine Datei. Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Dateikennung +
count Anzahl der zu schreibenden Bytes +
buf Anfangsadresse des Puffers + +
+ +
Hinweis zu MagiC: Übergibt man als Anzahl der zu +schreibenden Bytes den Wert 0, und in buf den Wert -1, so wird +die Datei auf die aktuelle Position des Dateizeigers +geschrumpft. +
  +
Ergebnis: Die Funktion liefert die Anzahl der tatsächlich geschriebenen +Bytes, oder eine der folgenden Fehlermeldungen: +
  + + + + + + + + + +
EACCDN : Zugriff verwehrt +
EBADF : falsche Dateikennung +
ELOCKED : Datei-Abschnitt ist markiert + +
+ +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Dateifunktionen +
  +
Querverweis: Binding   Fread   FIONWRITE +
  + +
+ +

5.9.41.1 Bindings für Fwrite

+ + + + + + + + + +
C: int32_t Fwrite ( int16_t handle, int32_t count, void *buf ); +
  +
Assembler: +
  +
pea       buf           ; Offset 8
+move.l    count,-(sp)   ; Offset 4
+move.w    handle,-(sp)  ; Offset 2
+move.w    #64,-(sp)     ; Offset 0
+trap      #1            ; GEMDOS aufrufen
+lea       $C(sp),sp     ; Stack korrigieren
+
+
GFA-Basic Fehler%=Gemdos(&H40,W:handle,L:count%,L:buf%) +
  + +
+ +

5.9.42 Fxattr

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Fxattr« - erweiterte Fileattribute ermitteln. +
  +
Gemdosnummer: 300 +
  +
Deklaration: int32_t Fxattr ( int16_t flag, int8_t *name, XATTR *xattr ); +
  +
Beschreibung: Die Funktion ermittelt die erweiterten Attribute der Datei, +deren vollständiger Name in name angegeben ist, und speichert +diese in xattr. +
  +
Der Parameter flag gibt an, wie symbolische Links +behandelt werden sollen. Es gilt: +
  + + + + + + + + + + + + +
flag Bedeutung +
    +
0 symbolische Links werden bis zur Ursprungsdatei verfolgt, und +die erweiterten Attribute werden von dieser Datei ermittelt. (Dies +entspricht dem Vorgehen von stat unter UNIX). +
1 die erweiterten Attribute des symbolischen Links selbst werden +ermittelt. (Dies entspricht dem Vorgehen von lstat unter UNIX). + +
+ +
Hinweis: Diese Funktion ist äquivalent zu einem Aufruf +von Fcntl (Modus F_STAT) mit dem Unterschied, daß statt eines +Dateinamens das Handle einer bereits geöffneten Datei übergeben +wird. +
  +
Ergebnis: Die Funktion kann folgende Rückgabewerte liefern: +
  + + + + + + + + + +
E_OK : kein Fehler aufgetreten. +
EFILNF : Datei nicht gefunden. +
EPTHNF : Pfad zur Datei nicht gefunden. + +
+ +
Verfügbar: Available when a 'MiNT' cookie with a version of at least 0.90 +exists und in MagiC ab Version 3.0. +
  +
Gruppe: Dateifunktionen +
  +
Querverweis: Binding   Fattrib   Fsnext   XFS-Konzept in MagiC +
  + +
+ +

5.9.42.1 Bindings für Fxattr

+ + + + + + +
C: int32_t Fxattr ( int16_t flag, int8_t *name, XATTR *xattr ); +
  +
Assembler: +
  +
pea       xattr        ; Offset 10
+pea       name         ; Offset  6
+move.w    flag,-(sp)   ; Offset  2
+move.w    #300,-(sp)   ; Offset  0
+trap      #1           ; GEMDOS aufrufen
+lea       $C(sp),sp    ; Stack korrigieren
+
+ +
+ +
+ +Home +GEMDOSGEMDOS +gemdos-Trapgemdos-Trap +Datum und UhrzeitDatum und Uhrzeit + + diff --git a/de/gemdos_filesys.html b/de/gemdos_filesys.html new file mode 100644 index 000000000..715c8641c --- /dev/null +++ b/de/gemdos_filesys.html @@ -0,0 +1,78 @@ + + + + + +Die Anleitung zum TOS: Unterstützung fremder Dateisysteme + + + + + + + + + +Home +GEMDOSGEMDOS +Das GEMDOSDas GEMDOS +GEMDOS-FehlermeldungenGEMDOS-Fehlermeldungen + +
+ +

5.2 Unterstützung fremder Dateisysteme

+ + + +

Das MiNT-Projekt des Kanadiers Eric Smith ermöglichte +zum ersten mal den Einsatz alternativer Dateisysteme, und damit die +Verwendung langer Dateinamen unter TOS. Dies wurde durch die +Einführung neuer GEMDOS Funktionen erreicht. +

+

Die neuen Funktionen müssen jedoch nicht nur dann vorhanden +sein, wenn MiNT installiert ist: MagiC besitzt ab der Version 3.0 +kompatible Funktionen, und auch MetaDOS-Treiber mit entsprechender +Funktionalität sind schon gesichtet worden. Aus diesem Grund sollten +Abfragen auf den MiNT-Cookie unbedingt aus allen Programmen entfernt +werden. Das Vorhandensein einer GEMDOS-Funktion wird daran erkannt, +daß als Funktionsergebnis nicht der Wert EINVFN +zurückgeliefert wird. +

+

Um Informationen über das zugrundeliegende Dateisystem zu +erhalten, bedient man sich der GEMDOS-Funktion Dpathconf. +

+

+

Die obige Abbildung zeigt die Beschränkungen eines reinen +TOS-Dateisystems für die verschiedenen Laufwerke. Die Spalte +files gibt an, wieviele Dateien pro Prozess maximal geöffnet +sein dürfen (vom Prozess-internen Limit abgesehen). Unter +links kann abgelesen werden, wieviele Verweise (Links) auf +eine Datei maximal existieren können. path_max zeigt, wie +lang komplette Dateinamen (inklusive Pfad) auf dem Dateisystem werden +können. Die Spalte name_max informiert über die maximale +Länge eines Dateinamens, und unter atomic ist angegeben, +wieviele Bytes in einem Rutsch geschrieben werden können. Besonders +wichtig ist die Spalte trunc, die darüber Aufschluß gibt, +wie zu lange Dateinamen abgeschnitten werden. Zu guter Letzt kann man +per case erfahren, ob und auf welche Weise Dateinamen mit +gemischter Groß- bzw. Kleinschreibung unterstützt werden. +

+ + +

Als Faustregel gilt: Dateinamen und -pfade immer genauso +weiterverwenden, wie sie vom Betriebssystem geliefert worden sind; +Dateinamen grundsätzlich klein schreiben, denn auch auf Systemen mit +gemischter Groß- und Kleinschreibung sind großgeschriebene +Dateinamen eher die Ausnahme! +

+

Querverweis: XFS-Konzept in MagiC   Dpathconf +

+
+ +Home +GEMDOSGEMDOS +Das GEMDOSDas GEMDOS +GEMDOS-FehlermeldungenGEMDOS-Fehlermeldungen + + diff --git a/de/gemdos_functions.html b/de/gemdos_functions.html new file mode 100644 index 000000000..9841ab379 --- /dev/null +++ b/de/gemdos_functions.html @@ -0,0 +1,1949 @@ + + + + + +Die Anleitung zum TOS: GEMDOS-Funktionsliste + + + + + + + + + +Home +GEMDOSGEMDOS +TekBiosTekBios +GEMDOS-StrukturenGEMDOS-Strukturen + +
+ +

5.23 GEMDOS-Funktionsliste

+

Die folgende Liste ist eine Übersicht der GEMDOS-Routinen, +geordnet nach Funktionsnummern: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
dezhexFunktionsnamevorhanden
00x00Pterm0TOS
10x01CconinTOS
20x02CconoutTOS
30x03CauxinTOS
40x04CauxoutTOS
50x05CprnoutTOS
60x06CrawioTOS
70x07CrawcinTOS
80x08CnecinTOS
90x09CconwsTOS
100x0ACconrsTOS
110x0BCconisTOS
140x0EDsetdrvTOS
160x10CconosTOS
170x11CprnosTOS
180x12CauxisTOS
190x13CauxosTOS
200x14MaddaltTOS
210x15SreallocTOS 4
220x16SlbopenMagiC
230x17SlbcloseMagiC
250x19DgetdrvTOS
260x1AFsetdtaTOS
320x20SuperTOS
420x2ATgetdateTOS
430x2BTsetdateTOS
440x2CTgettimeTOS
450x2DTsettimeTOS
470x2FFgetdtaTOS
480x30SversionTOS
490x31PtermresTOS
510x33SconfigMagiC
540x36DfreeTOS
570x39DcreateTOS
580x3ADdeleteTOS
590x3BDsetpathTOS
600x3CFcreateTOS
610x3DFopenTOS
620x3EFcloseTOS
630x3FFreadTOS
640x40FwriteTOS
650x41FdeleteTOS
660x42FseekTOS
670x43FattribTOS
680x44MxallocTOS
690x45FdupTOS
700x46FforceTOS
710x47DgetpathTOS
720x48MallocTOS
730x49MfreeTOS
740x4AMshrinkTOS
750x4BPexecTOS
760x4CPtermTOS
780x4EFsfirstTOS
790x4FFsnextTOS
860x56FrenameTOS
870x57FdatimeTOS
910x5Bnap_ioNAP BioNet100
920x5CFlock
960x60Nversion
960x60Init_ProcessC'Task Royal
970x61Load_ProcessC'Task Royal
980x62Frlock
990x62End_ProcessC'Task Royal
990x63Frunlock
990x63Stop_ProcessC'Task Royal
1000x64Flock
1000x64Cont_ProcessC'Task Royal
1000x64SetLinkAdrTekBios
1010x65Funlock
1010x65Find_ProcessC'Task Royal
1010x65ByteToLinkTekBios
1020x66Fflush
1020x66Stop_AllC'Task Royal
1020x66ByteFromLinkTekBios
1030x67Cont_AllC'Task Royal
1030x67LongWordToLinkTekBios
1030x68Creat_QueueC'Task Royal
1040x68LongWordFromLinkTekBios
1050x69Delete_QueueC'Task Royal
1050x69SliceToLinkTekBios
1060x6AWrite_QueueC'Task Royal
1060x6ASliceFromLinkTekBios
1070x6BRead_QueueC'Task Royal
1070x6BreserviertTekBios
1080x6CQueue_InfoC'Task Royal
1080x6CreserviertTekBios
1090x6DFind_QueueC'Task Royal
1090x6DreserviertTekBios
1100x6EEvnt_SignalC'Task Royal
1100x6EreserviertTekBios
1110x6FEvnt_WaitC'Task Royal
1110x6FTestErrorTekBios
1110x6Ftrap111MIDI_COM, seit Version 3.7
1120x70AttachC'Task Royal
1120x70SetResetTekBios
1120x70MforkMultiGEM
1130x71Pr_AssignC'Task Royal
1130x71SetAnalyseTekBios
1140x72Creat_ScreenC'Task Royal
1140x72BootRootTekBios
1150x73NenablePAMs Net
1150x73Del_ScreenC'Task Royal
1160x74NdisablePAMs Net
1160x74InstallC'Task Royal
1170x75NremotePAMs Net
1170x75MvarsC'Task Royal
1180x76NmsgPAMs Net
1180x76AllocC'Task Royal
1190x77NrecordPAMs Net
1190x77FreeC'Task Royal
1200x78NresetPAMs Net
1210x79NprinterPAMs Net
1220x7ANlockedPAMs Net
1230x7BNunlockPAMs Net
1240x7CNlockPAMs Net
1250x7DNloggedPAMs Net
1260x7ENnodeidPAMs Net
1270x7FNactivePAMs Net
1280x80PuseridPowerDOS
1290x81PpriorityPowerDOS
1300x82PgetpidPowerDOS
1300x82nap_in_sNAP BioNet100
1310x83PgetppidPowerDOS
1310x83nap_out_sNAP BioNet100
1320x84PgetpdPowerDOS
1330x85PfindpidPowerDOS
1340x86PprocinfPowerDOS
1350x87PnicePowerDOS
1360x88SmallocPowerDOS
1370x89MassignPowerDOS
1390x8BFstatusPowerDOS
1400x8CFsfirstidxPowerDOS
1410x8DWake_parentPowerDOS
1420x8EWaitPowerDOS
1430x8FSleepPowerDOS
1440x90IoqueuePowerDOS
1450x91Wait_dtPowerDOS
1460x92Dev_createPowerDOS
1470x93Fm_addPowerDOS
1480x94Drv_addPowerDOS
1490x95DevinfoPowerDOS
1500x96SendPowerDOS
1510x97Sig_interceptPowerDOS
1520x98SuspendPowerDOS
1530x99Q_messagePowerDOS
1540x9ASemaphorePowerDOS
1550x9BMem_sharePowerDOS
1580x9EChgvectorPowerDOS
1590x9FChgsysvarPowerDOS
1600xA0PnamePowerDOS
1610xA1PvectorPowerDOS
1620xA2PattribPowerDOS
1630xA3PmaxmemPowerDOS
2550xFFSyieldMiNT
2560x100FpipeMiNT
2570x101FfchownMiNT
2580x102FfchmodMiNT
2590x103FsyncMiNT
2600x104FcntlMiNT
2610x105FinstatMiNT
2620x106FoutstatMiNT
2630x107FgetcharMiNT
2640x108FputcharMiNT
2650x109PwaitMiNT
2660x10APniceMiNT
2670x10BPgetpidMiNT
2680x10CPgetppidMiNT
2690x10DPgetpgrpMiNT
2700x10EPsetpgrpMiNT
2710x10FPgetuidMiNT
2720x110PsetuidMiNT
2730x111PkillMiNT
2740x112PsignalMiNT
2750x113PvforkMiNT
2760x114PgetgidMiNT
2770x115PsetgidMiNT
2780x116PsigblockMiNT
2790x117PsigsetmaskMiNT
2800x118PusrvalMiNT
2810x119PdomainMiNT
2820x11APsigreturnMiNT
2830x11BPforkMiNT
2840x11CPwait3MiNT
2850x11DFselectMiNT
2860x11EPrusageMiNT
2870x11FPsetlimitMiNT
2880x120TalarmMiNT
2890x121PauseMiNT
2900x122SysconfMiNT
2910x123PsigpendingMiNT
2920x124DpathconfMiNT
2930x125PmsgMiNT
2940x126FmidipipeMiNT
2950x127PreniceMiNT
2960x128DopendirMiNT
2970x129DreaddirMiNT
2980x12ADrewinddirMiNT
2990x12BDclosedirMiNT
3000x12CFxattrMiNT
3010x12DFlinkMiNT
3020x12EFsymlinkMiNT
3030x12FFreadlinkMiNT
3040x130DcntlMiNT
3050x131FchownMiNT
3060x132FchmodMiNT
3070x133PumaskMiNT
3080x134PsemaphoreMiNT
3090x135DlockMiNT
3100x136PsigpauseMiNT
3110x137PsigactionMiNT
3120x138PgeteuidMiNT
3130x139PgetegidMiNT
3140x13APwaitpidMiNT
3150x13BDgetcwdMiNT
3160x13CSalertMiNT
3170x13DTmalarmMiNT 1.10
3180x13EPsigintrMiNT 1.11 bis einschließlich FreeMiNT 1.15.12
3190x13FSuptimeMiNT 1.11
3200x140PtraceMiNT
3210x141MvalidateFreeMiNT 1.15.12
3220x142DxreaddirMiNT 1.11
3230x143PseteuidMiNT 1.11
3240x144PsetegidMiNT 1.11
3250x145PgetauidMiNT 1.11
3260x146PsetauidMiNT 1.11
3270x147PgetgroupsMiNT 1.11
3280x148PsetgroupsMiNT 1.11
3290x149TsetitimerMiNT 1.11
3300x14AScookieMiNT (obsolete)
3300x14ADchrootMiNT ^^^^
3310x14BFstat64MiNT 1.15.4
3320x14CFseek64MiNT
3330x14DDsetkeyMiNT
3340x14EPsetreuidMiNT 1.12
3350x14FPsetregidMiNT 1.12
3360x150SyncMiNT, MagiC
3370x151ShutdownMiNT
3380x152DreadlabelMiNT 1.12
3390x153DwritelabelMiNT 1.12
3400x154SsystemMiNT 1.15.0
3410x155TgettimeofdayMiNT 1.15.0
3420x156TsettimeofdayMiNT 1.15.0
3430x157TadjtimeMiNT 1.16
3440x158PgetpriorityMiNT 1.15.0
3450x159PsetpriorityMiNT 1.15.0
3460x15aFpollFreeMiNT 1.15.12
3470x15BFwritevMiNTNet
3480x15CFreadvMiNTNet
3490x15DFfstat64FreeMint 1.16
3500x15EPsysctlMiNT
3510x15FPemulationMiNT
3520x160FsocketMiNTNet
3530x161FsocketpairMiNTNet
3540x162FacceptMiNTNet
3550x163FconnectMiNTNet
3560x164FbindMiNTNet
3570x165FlistenMiNTNet
3580x166FrecvmsgMiNTNet
3590x167FsendmsgMiNTNet
3600x168FrecvfromMiNTNet
3610x169FsendtoMiNTNet
3620x16AFsetsockoptMiNTNet
3630x16BFgetsockoptMiNTNet
3640x16CFgetpeernameMiNTNet
3650x16DFgetsocknameMiNTNet
3660x16EFshutdownMiNTNet
3680x170PshmgetMiNT
3690x171PshmctlMiNT
3700x172PshmatMiNT
3710x173PshmdtMiNT
3720x174PsemgetMiNT
3730x175PsemctlMiNT
3740x176PsemopMiNT
3750x177PsemconfigMiNT
3760x178PmsggetMiNT
3770x179PmsgctlMiNT
3780x17APmsgsndMiNT
3790x17BPmsgrcvMiNT
3810x17DMaccessMiNT
3820x17EMmapReserviert für FreeMiNT
3830x17FMunmapReserviert für FreeMiNT
3840x180Fchown16FreeMiNT 1.16.0
3850x181FchdirFreeMiNT 1.17
3860x182FfdopendirFreeMiNT 1.17
3870x183FdirfdFreeMiNT 1.17
5030x1F7getprtAtari Network Service
5040x1F8dflushAtari Network Service
5050x1F9chpwAtari Network Service
6010x259DisableAtari Network Service
6020x25AEnableAtari Network Service
6030x25BGetTaskAtari Network Service
6040x25COpenPortAtari Network Service
6050x25DGetMsgAtari Network Service
6060x25EAskMsgAtari Network Service
6070x25FAskPortAtari Network Service
6080x260SendMsgAtari Network Service
6090x261ReplyMsgAtari Network Service
6100x262ClosePortAtari Network Service
6120x264GetIPAddrAtari Network Service
6130x265PGetMsgAtari Network Service
6140x266mytimeAtari Network Service
6150x267IamBackAtari Network Service
6200x26Cudp_openAtari Network Service
6210x26Cudp_closeAtari Network Service
6220x26Cudp_readAtari Network Service
6230x26Dudp_writeAtari Network Service
6300x276tcp_openAtari Network Service
6310x277tcp_writeAtari Network Service
6320x278tcp_readAtari Network Service
6330x279tcp_closeAtari Network Service
6340x27Atcp_abortAtari Network Service
6350x27Btcp_statAtari Network Service
12960x510DxopendirDir_Lwr
42000x1068Sys_BreakSysMon
42010x1069Sys_PrintfSysMon
240000x5DC0STEFcntrlSTEmulator
+
+ +

Querverweis: GEMDOS   BIOS-Funktionsliste   XBIOS-Funktionsliste +

+
+ +Home +GEMDOSGEMDOS +TekBiosTekBios +GEMDOS-StrukturenGEMDOS-Strukturen + + diff --git a/de/gemdos_main.html b/de/gemdos_main.html new file mode 100644 index 000000000..d9b5ab7a2 --- /dev/null +++ b/de/gemdos_main.html @@ -0,0 +1,60 @@ + + + + + +Die Anleitung zum TOS: GEMDOS + + + + + + + + + +Home +Inhaltsverzeichnis +XBIOS StrukturenXBIOS Strukturen +Das GEMDOSDas GEMDOS + +
+ +

5 GEMDOS

+ +
+
+ +Home +Inhaltsverzeichnis +XBIOS StrukturenXBIOS Strukturen +Das GEMDOSDas GEMDOS + + diff --git a/de/gemdos_memory.html b/de/gemdos_memory.html new file mode 100644 index 000000000..3f9581c5b --- /dev/null +++ b/de/gemdos_memory.html @@ -0,0 +1,909 @@ + + + + + +Die Anleitung zum TOS: Speicherverwaltung + + + + + + + + + +Home +GEMDOSGEMDOS +ProzessfunktionenProzessfunktionen +NetzwerkfunktionenNetzwerkfunktionen + +
+ +

5.12 Speicherverwaltung

+ + + + + + + + + + + + + + + + + + + + + +
Maccess   Speicherbereich auf Zugriff prüfen. +
Maddalt   Alternativen Speicher anmelden. +
Malloc    Speicher reservieren bzw. freien Speicher erfragen. +
Mfree     Speicherbereich freigeben. +
Mshrink   Speicherbereich verkleinern/vergrößern. +
Mvalidate Prozess-Speicherbereich auf Zugriff prüfen. +
Mxalloc   Speicherbereich reservieren. + +
+ +

Achtung: An dieser Stelle sei darauf hingewiesen, daß +im Hinblick auf zukünftige Betriebssystem-Versionen zur Kommunikation +zwischen verschiedenen Programmen benutzte oder über Zeiger +zugewiesene Speicherbereiche global sein müssen +(Mxalloc-Funktion mit Global-Flag). Andernfalls wird es beim Einsatz +auf Rechnern mit PMMU (z.B. Atari-TT oder Falcon) zu +Speicherschutzverletzungen kommen. +

+

Querverweis: Programmstart und TPA   Prozessfunktionen   +Speicherverwaltung in TOS   Speicherverwaltung in MagiC +

+

5.12.1 Maccess

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: Maccess - verify accessibility of a region of memory +
  +
Opcode: 381 (0x17d) +
  +
Syntax: int32_t Maccess ( void *start, int32_t size, int16_t mode ); +
  +
Description: Maccess verifies accessibility for the calling process's memory +page(s) containing any part of the address range in the interval +[addr, addr+len-1]. +
  + + + + + + + + + + + + +
Parameter Meaning +
start Start address of the memory block to be verified list +
size Length of the memory block +
mode mode is either 1 to check for read access, or 0 to check for +read/write access. + +
+ +
Return value: The function returns the value 0 on success, else a negative +error code. +
  +
Availability: This function is available as of FreeMiNT 1.15.12. +
  +
Group: Memory management +
  +
See also: Binding   Mfree   Malloc   Mxalloc   Mvalidate +
  + +
+ +

5.12.1.1 Bindings for Maccess

+ + + + + + +
C: int32_t Maccess ( void *start, int32_t size, int16_t mode ); +
  +
Assembler: +
  +
move.w    mode,-(sp)   ; Offset 10
+move.l    size,-(sp)   ; Offset 6
+pea       start        ; Offset 2
+move.w    #381,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+lea       $C(sp),sp    ; Correct stack
+
+ +
+ +

5.12.2 Maddalt

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inform Gemdos of alternative memory« - Alternativen Speicher +anmelden. +
  +
Gemdosnummer: 20 +
  +
Deklaration: int32_t Maddalt ( void *start, int32_t size ); +
  +
Beschreibung: Die GEMDOS-Routine Maddalt erlaubt es, einen Block von +Alternate-RAM in die Speicherliste des GEMDOS aufzunehmen. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
start Anfangsadresse des Speichers +
size Länge des Speicherbereichs + +
+ +
Hinweis: Der Block bleibt Eigentum von DOS und darf +nicht zurückgefordert werden. Wenn hinzugefügte Blöcke nicht +hintereinander liegen, ist die Anzahl der hinzufügbaren Blöcke auf +ca. 12 beschränkt. +
  +
Nützlich könnte diese Funktion etwa beim Einsatz von +VME-Bus-Karten im Atari-TT sein, wenn deren Speicher für GEMDOS +zugänglich gemacht werden soll. +
  +
Ergebnis: Die Funktion liefert den Wert 0, oder eine negative +Fehlermeldung. +
  +
Verfügbar: Die Funktion ist erst ab GEMDOS 0.19 verfügbar. +
  +
Gruppe: Speicherverwaltung +
  +
Querverweis: Binding   Mfree   Malloc   Mxalloc +
  + +
+ +

5.12.2.1 Bindings für Maddalt

+ + + + + + +
C: int32_t Maddalt ( void *start, int32_t size ); +
  +
Assembler: +
  +
move.l    size,-(sp)   ; Offset 6
+pea       start        ; Offset 2
+move.w    #20,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+lea       $A(sp),sp    ; Stack korrigieren
+
+ +
+ +

5.12.3 Malloc

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »memory allocation« - Speicherplatz reservieren. +
  +
Gemdosnummer: 72 +
  +
Deklaration: void *Malloc ( int32_t number ); +
  +
Beschreibung: Die GEMDOS-Routine Malloc reserviert Speicherplatz, oder +berechnet die Größe des verfügbaren Speichers. Für den Parameter +number gilt: +
  + + + + + + + + + + + + +
Wert Bedeutung +
    +
-1 Länge des größten verfügbaren Blocks ermitteln +
sonst Anzahl der zu reservierenden Bytes + +
+ +
Hinweis: Man darf sich nie darauf verlassen, daß +tatsächlich so viele Bytes wie gewünscht alloziert wurden. +Konstruktionen der Art Malloc(Malloc(-1L)) sind besonders in +Multitasking-Systemen schlicht indiskutabel (Stichwort: Task-Wechsel). +
  +
Unter TOS untersützt das GEMDOS nur eine begrenzte Anzahl von +Speicherblöcke. Aus diesem Grund sollte man die Funktion nicht zu +häüfig innerhalb eines Programms nutzen, sondern größere +Speicherblöcke (mindestens 16KBytes) reservieren und selbst +verwalten. +
  +
Ferner sollte man folgende Punkte beachten: +
  +
    +
  • der Speicherblock muß nicht leer sein +
      +

  • +
  • nacheinander allozierte Speicherblöcke müssen nicht zwingend +zusammenhängen +
      +

  • +
  • niemals auf Speicherbereiche zugreifen, der nicht dem eigenen +Prozess gehört. In Systemen mit Speicherschutz kommt es sonst zu +einer Exception. +
      +

  • +
+ +
In MagiC wird dieser Aufruf auf Mxalloc mit den Modi 0 bzw. 3 +zurückgeführt (abhängig von den Konfigurationsbits im +Programmdatei-Header). Die Konfigurationsbits werden z.Zt. in der +Basepage abgelegt. +
  +
Ergebnis: Die Funktion liefert als Ergebnis die Anfangsadresse des +reservierten Bereichs. Ein Nullzeiger bedeutet, daß nicht mehr +genügend Speicher zur Verfügung steht. Im Fall number = -1 +wird die Länge des größten verfügbaren Speicherblocks +zurückgegeben. +
  +
Verfügbar: Alle GEMDOS Versionen. GEMDOS Versionen kleiner 0.15 liefern +für den Aufruf Malloc( 0L ) einen Zeiger auf ungültigen Speicher +statt daß der Aufruf fehlschlägt wie er sollte. +
  +
Gruppe: Speicherverwaltung +
  +
Querverweis: Bindings für Malloc   Mfree   Mxalloc   Maddalt   Programmflags +
  + +
+ +

5.12.3.1 Bindings für Malloc

+ + + + + + +
C: void *Malloc ( int32_t number ); +
  +
Assembler: +
  +
move.l    number,-(sp) ; Offset 2
+move.w    #72,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

5.12.4 Mfree

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »memory free« - Speicherplatz freigeben. +
  +
Gemdosnummer: 73 +
  +
Deklaration: int32_t Mfree ( void *block ); +
  +
Beschreibung: Die GEMDOS-Routine Mfree gibt einen mit Malloc reservierten +Speicherbereich wieder frei. +
  +
Der Parameter block enthält die Anfangsadresse des +freizugebenden Speicherbereichs. +
  +
Hinweis: In fast allen GEMDOS-Versionen wird nicht +überprüft, ob der freizugebende Block dem betreffenden Prozess auch +gehört. Daher ist vor allem in Multitasking-Systemen besondere +Vorsicht angebracht. +
  +
Ergebnis: Die Funktion liefert folgende Resultate: +
  + + + + + + + + + + + + +
Wert Bedeutung +
    +
E_OK kein Fehler aufgetreten +
EIMBA falsche Speicherblockadresse + +
+ +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Speicherverwaltung +
  +
Querverweis: Binding   Malloc   Mxalloc   Maddalt +
  + +
+ +

5.12.4.1 Bindings für Mfree

+ + + + + + +
C: int32_t Mfree ( void *block ); +
  +
Assembler: +
  +
pea       block        ; Offset 2
+move.w    #73,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

5.12.5 Mshrink

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »memory shrink« - Speicherbereich verkürzen oder +vergrößern. +
  +
Gemdosnummer: 74 +
  +
Deklaration: int32_t Mshrink ( void *block, int32_t newsiz ); +
  +
Beschreibung: Die GEMDOS-Routine Mshrink verkürzt oder vergrößert einen +bereits reservierten Speicherbereich. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
block Anfangsadresse des Speicherblocks +
newsiz neue (geänderte) Länge des Blocks; in MagiC +zusätzlich: + + + + + + +
-1 = ermitteln der größtmöglichen Größe des Speicherblocks +
 0 = Block freigeben + +
+ + +
+ +
Hinweis: Es wird i.d.R. nicht überprüft, ob der +Speicherblock dem Aufrufer überhaupt gehört. Die Möglichkeit einen +Speicherblock zu vergrößern, steht z.Zt. nur in MagiC zur +Verfügung. Allerdings funktioniert dies nur, wenn über dem +betreffenden Block ein genügend großer freier Block vorhanden ist, +und die TOS-Kompatibilität deaktiviert wurde. +
  +
Ergebnis: Die Funktion liefert folgende Resultate: +
  + + + + + + + + + +
E_OK : kein Fehler aufgetreten +
EIMBA : falsche Blockadresse +
EGSBF : Block würde vergrößert + +
+ +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Speicherverwaltung +
  +
Querverweis: Binding   Malloc   Mfree +
  + +
+ +

5.12.5.1 Bindings für Mshrink

+ + + + + + +
C: int32_t Mshrink ( void *block, int32_t newsiz ); +
  +
Assembler: +
  +
move.l    newsiz,-(sp)  ; Offset 8
+pea       block         ; Offset 4
+move.w    #0,-(sp)      ; Offset 2
+move.w    #74,-(sp)     ; Offset 0
+trap      #1            ; GEMDOS aufrufen
+lea       $C(sp),sp     ; Stack korrigieren
+
+
Hinweis: Der Null-Parameter wird beim C-Binding +normalerweise automatisch hinzugefügt. +
  + +
+ +

5.12.6 Mvalidate

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: Mvalidate - verify access to a process memory region +
  +
Opcode: 321 (0x141) +
  +
Syntax: int32_t Mvalidate ( int16_t pid, void *start, int32_t size, +int32_t *flags ); +
  +
Description: Mvalidate verifies accessibility for the specified process's +memory page(s) containing any part of the address range in the +interval [addr, addr+len-1]. +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
pid Process id of the process to check. May be 0 for the current +process. +
start Start address of the memory block to be verified. +
size Length of the memory block. +
flags Upon a successfull call, will contain the protection flags of +the specified memory region. + +
+ +
Return value: The function returns the value 0 on success, else a negative +error code. +
  +
Availability: This function is available as of FreeMiNT 1.15.12. +
  +
Group: Memory management +
  +
See also: Binding   Mfree   Malloc   Mxalloc   Maccess +
  + +
+ +

5.12.6.1 Bindings for Mvalidate

+ + + + + + +
C: int32_t Mvalidate ( int16_t pid, void *start, int32_t size, +int32_t *flags ); +
  +
Assembler: +
  +
pea       flags        ; Offset 12
+move.l    size,-(sp)   ; Offset 8
+pea       start        ; Offset 4
+move.w    pid,-(sp)    ; Offset 2
+move.w    #321,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+lea       $10(sp),sp   ; Correct stack
+
+ +
+ +

5.12.7 Mxalloc

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Allocate memory (with preference)« - Speicherplatz +reservieren. +
  +
Gemdosnummer: 68 +
  +
Deklaration: void *Mxalloc ( int32_t amount, int16_t mode ); +
  +
Beschreibung: Die GEMDOS-Routine Mxalloc reserviert einen Speicherbereich der +Größe amount. Über die Bits des Parameters mode +kann die gewünschte Speicherart spezifiziert werden; es gilt: +
  + + + + + + + + + + + + + + + + + + +
Bits Bedeutung +
    +
0-2 Behandlung des TT-RAMs + + + + + + + + + + + + +
0 = nur ST-RAM +
1 = nur TT-RAM +
2 = egal, ST-RAM bevorzugt +
3 = egal, TT-RAM bevorzugt + +
+ +
3 reserviert +
4-7 Speicherschutz-Modus + + + + + + + + + + + + + + + +
0 = Abhängig von den Programmflags +
1 = Privat +
2 = Global +
3 = Super +
4 = nur lesbar + +
+ +
Alle anderen Werte sind undefiniert, und für zukünftige Zwecke +reserviert. +
14 No-Free-Modus +
Wenn dieses Bit gesetzt ist und der Besitzer dieses Speichers +terminiert, wird der Speicherbereich nicht freigegeben, sondern an das +Betriebssystem vererbt. Dieser Modus ist nur für das Betriebssystem +interessant, und steht normalen Anwenderprogrammen nicht zur +Verfügung. + +
+ +
Alle weiteren Bits sind für zukünftige Zwecke reserviert. Mit +dem Wert -1 für amount kann man die Länge des größten +zusammenhängend verfügbaren Speicherblocks (abhängig von +mode) erfragen. +
  +
Unter MagiC werden alle Speicherallozierungen mitprotokolliert. +Wenn die mit LIMITMEM vorgegebene Beschränkung überschritten wird, +wird ein Nullzeiger zurückgegeben. Im Fall amount = -1 wird +das Minimum von freiem Speicher und noch nicht ausgeschöpfter +LIMITMEM-Beschränkung zurückgegeben. Ausnahmen sind Aufrufe des +Bildschirm-Managers (SCRENMGR), der die Menüs kontrolliert. Dadurch +wird sichergestellt, daß auch per LIMITMEM beschränkte Programme +keine Probleme mit dem Redraw bei Menüs haben. +
  +
Hinweis: Ein Problem besteht darin, festzustellen, wann +die erweiterten Modi (Bits 3 und folgende) benutzt werden dürfen. +Einige ältere Versionen des GEMDOS kommen nämlich nicht mit diesen +Modi zurecht, und sorgen z.T. für den Absturz der Applikation bzw. +des ganzen Systems. Aus diesem Grund testen viele Programmierer +explizit auf das Vorhandensein von MiNT/MultiTOS oder Versionen von +MagiC >= 2.0. Alternativ kann auch die Funktion Mxmask benutzt +werden. +
  +
Ergebnis: Die Funktion liefert als Ergebnis die Anfangsadresse des +reservierten Bereichs als typenlosen Zeiger. Mxalloc liefert als +Ergebnis eine 0, wenn nicht mehr genügend Speicher vorhanden ist. +
  +
Verfügbar: Diese Funktion existiert erst ab GEMDOS-Version 0.19. +
  +
Gruppe: Speicherverwaltung +
  +
Querverweis: Binding   Mfree   Malloc   Maddalt   Programmflags +
  + +
+ +

5.12.7.1 Bindings für Mxalloc

+ + + + + + +
C: void *Mxalloc ( int32_t amount, int16_t mode ); +
  +
Assembler: +
  +
move.w    mode,-(sp)    ; Offset 6
+move.l    amount,-(sp)  ; Offset 2
+move.w    #68,-(sp)     ; Offset 0
+trap      #1            ; GEMDOS aufrufen
+addq.l    #8,sp         ; Stack korrigieren
+
+ +
+ +

5.12.7.2 Mxmask

+
/*
+   Mxmask() liefert eine Bitmaske mit der man das Moduswort eines
+   Mxalloc() Aufrufs maskieren sollte, falls man Protectionbits
+   benutzen möchte. Dies ist notwendig, da Mxalloc() bei der Angabe
+   von Protectionbits leider in einigen GEMDOS Implementierungen
+   fehlerhafte Resultate liefert, die in der Folge zum Absturz des
+   Systems fuehren koennen. ((c) 1994 Martin Osieka)
+   Anwendungsbeispiel:
+   mxMask = Mxmask();
+   p = mxMask ? Mxalloc( size, 0x43 & mxMask) : Malloc( size); */
+
+SHORT Mxmask (void)
+{
+    void *svStack;      /* Supervisor-Stack */
+    int32_t sRAM, sRAMg;   /* ST-RAM          */
+    int32_t aRAM, aRAMg;   /* Alternate RAM   */
+
+    /*
+    // Beispieltabelle moeglicher Werte:
+    //           | newfashion  | oldfashion
+    // sRAM aRAM | sRAMg aRAMg | sRAMg aRAMg
+    //   1    0  |   1     0   |   1     1
+    //   0    2  |   0     2   |   2     2
+    //   1    2  |   1     2   |   3     3
+    */
+
+    svStack = (void *) Super( 0);  /* unterbinde Taskwechsel */
+
+    sRAM  = (int32_t) Mxalloc( -1, 0);
+    /* im Fehlerfall Mxalloc( -1, 3) */
+    sRAMg = (int32_t) Mxalloc( -1, 0x40);
+    aRAM  = (int32_t) Mxalloc( -1, 1);
+    /* im Fehlerfall Mxalloc( -1, 3) */
+    aRAMg = (int32_t) Mxalloc( -1, 0x41);
+
+    Super( svStack);  /* erlaube Taskwechsel */
+
+    if (sRAM == -32)
+        return 0x0000;  /* Mxalloc() ist nicht implementiert */
+
+    else if ( ((sRAM + aRAM) == sRAMg) && ((sRAM + aRAM) == aRAMg) )
+        return 0x0003;  /* oldfashion Mxalloc() */
+
+    else
+        return 0xFFFF;
+
+} /* Mxmask */
+
+

Querverweis: GEMDOS   Speicherverwaltung +

+
+ +Home +GEMDOSGEMDOS +ProzessfunktionenProzessfunktionen +NetzwerkfunktionenNetzwerkfunktionen + + diff --git a/de/gemdos_mintnet.html b/de/gemdos_mintnet.html new file mode 100644 index 000000000..69775b0ba --- /dev/null +++ b/de/gemdos_mintnet.html @@ -0,0 +1,868 @@ + + + + + +Die Anleitung zum TOS: Netzwerk + + + + + + + + + +Home +GEMDOSGEMDOS +Zeichenweise Ein-/AusgabeZeichenweise Ein-/Ausgabe +ARGV-VerfahrenARGV-Verfahren + +
+ +

5.17 Netzwerk

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Fwritev       Daten aus mehreren Puffern schreiben +
Freadv        Daten in mehrere Puffer lesen +
Fsocket       Endpunkt für die Kommunikation erstellen +
Fsocketpair   Ein Paar verbundener Sockets erstellen +
Faccept       Eine Verbindung an einem Socket akzeptieren +
Fconnect      Eine Verbindung an einem Socket initiieren +
Fbind         Einen Namen mit einem Socket verbinden +
Flisten       Auf Verbindungen an einem Socket warten +
Frecvmsg      Eine Nachricht von einem Socket erhalten +
Fsendmsg      Eine Nachricht an einen Socket schicken +
Frecvfrom     Eine Nachricht von einem Socket erhalten +
Fsendto       Eine Nachricht an einen Socket schicken +
Fsetsockopt   Optionen für Sockets festlegen +
Fgetsockopt   Optionen für Sockets erfragen +
Fgetpeername  Namen des verbundenen Peer-Sockets erfragen +
Fgetsockname  Socket-Namen abrufen +
Fshutdown     Teil einer Vollduplex-Verbindung herunter fahren + +
+ +

Querverweis: Netzwerkfunktionen +

+

5.17.1 Fwritev

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »file write« - Daten aus mehreren Puffern schreiben +
  +
Gemdosnummer: 347 +
  +
Deklaration: int32_t Fwritev(int16_t handle, struct iovec *iov, int32_t +niov); +
  +
Beschreibung: +
  +
Ergebnis: +
  +
Verfügbar: Sie steht ab FreeMiNT 1.16 zur Verfügung. +
  +
Gruppe: Netzwerk +
  +
Querverweis: +
  + +
+ +

5.17.2 Freadv

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »file read« - Daten in mehrere Puffer lesen +
  +
Gemdosnummer: 348 +
  +
Deklaration: int32_t Freadv(int16_t handle, struct iovec *iov, int32_t +niov); +
  +
Beschreibung: +
  +
Ergebnis: +
  +
Verfügbar: Sie steht ab FreeMiNT 1.16 zur Verfügung. +
  +
Gruppe: Netzwerk +
  +
Querverweis: +
  + +
+ +

5.17.3 Fsocket

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »socket« - Endpunkt für die Kommunikation erstellen +
  +
Gemdosnummer: 352 +
  +
Deklaration: int32_t Fsocket(int32_t domain, int32_t type, int32_t +protocol); +
  +
Beschreibung: +
  +
Ergebnis: +
  +
Verfügbar: Sie steht ab FreeMiNT 1.16 zur Verfügung. +
  +
Gruppe: Netzwerk +
  +
Querverweis: +
  + +
+ +

5.17.4 Fsocketpair

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »socketpair« - Ein Paar verbundener Sockets erstellen +
  +
Gemdosnummer: 353 +
  +
Deklaration: int32_t Fsocketpair(int32_t domain, int32_t type, int32_t +protocol, int16_t fds[2]); +
  +
Beschreibung: +
  +
Ergebnis: +
  +
Verfügbar: Sie steht ab FreeMiNT 1.16 zur Verfügung. +
  +
Gruppe: Netzwerk +
  +
Querverweis: +
  + +
+ +

5.17.5 Faccept

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »accetp« - Eine Verbindung an einem Socket akzeptieren +
  +
Gemdosnummer: 354 +
  +
Deklaration: int32_t Faccept(int16_t fd, struct sockaddr *name, uint32_t +*anamelen); +
  +
Beschreibung: +
  +
Ergebnis: +
  +
Verfügbar: Sie steht ab FreeMiNT 1.16 zur Verfügung. +
  +
Gruppe: Netzwerk +
  +
Querverweis: +
  + +
+ +

5.17.6 Fconnect

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »connect« - Eine Verbindung an einem Socket initiieren +
  +
Gemdosnummer: 355 +
  +
Deklaration: int32_t Fconnect(int16_t fd, struct sockaddr *name, uint32_t +anamelen); +
  +
Beschreibung: +
  +
Ergebnis: +
  +
Verfügbar: Sie steht ab FreeMiNT 1.16 zur Verfügung. +
  +
Gruppe: Netzwerk +
  +
Querverweis: +
  + +
+ +

5.17.7 Fbind

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »bind« - Einen Namen mit einem Socket verbinden +
  +
Gemdosnummer: 356 +
  +
Deklaration: int32_t Fbind(int16_t fd, const struct sockaddr *name, uint32_t +anamelen); +
  +
Beschreibung: +
  +
Ergebnis: +
  +
Verfügbar: Sie steht ab FreeMiNT 1.16 zur Verfügung. +
  +
Gruppe: Netzwerk +
  +
Querverweis: +
  + +
+ +

5.17.8 Flisten

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »listen« - Auf Verbindungen an einem Socket warten +
  +
Gemdosnummer: 357 +
  +
Deklaration: int32_t Flisten(int16_t fd, int32_t backlog); +
  +
Beschreibung: +
  +
Ergebnis: +
  +
Verfügbar: Sie steht ab FreeMiNT 1.16 zur Verfügung. +
  +
Gruppe: Netzwerk +
  +
Querverweis: +
  + +
+ +

5.17.9 Frecvmsg

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »recvmsg« - Eine Nachricht von einem Socket erhalten +
  +
Gemdosnummer: 358 +
  +
Deklaration: int32_t Frecvmsg(int16_t fd, struct msghdr *msg, int32_t +flags); +
  +
Beschreibung: +
  +
Ergebnis: +
  +
Verfügbar: Sie steht ab FreeMiNT 1.16 zur Verfügung. +
  +
Gruppe: Netzwerk +
  +
Querverweis: +
  + +
+ +

5.17.10 Fsendmsg

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »sendmsg« - Eine Nachricht an einen Socket schicken +
  +
Gemdosnummer: 359 +
  +
Deklaration: int32_t Fsendmsg(int16_t fd, const struct msghdr *msg, int32_t +flags); +
  +
Beschreibung: +
  +
Ergebnis: +
  +
Verfügbar: Sie steht ab FreeMiNT 1.16 zur Verfügung. +
  +
Gruppe: Netzwerk +
  +
Querverweis: +
  + +
+ +

5.17.11 Frecvfrom

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »recvfrom« - Eine Nachricht von einem Socket erhalten +
  +
Gemdosnummer: 360 +
  +
Deklaration: int32_t Frecvfrom(int16_t fd, void *buf, int32_t buflen, +int32_t flags, struct sockaddr *to, uint32_t *addrlen); +
  +
Beschreibung: +
  +
Ergebnis: +
  +
Verfügbar: Sie steht ab FreeMiNT 1.16 zur Verfügung. +
  +
Gruppe: Netzwerk +
  +
Querverweis: +
  + +
+ +

5.17.12 Fsendto

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »sendto« - Eine Nachricht an einen Socket schicken +
  +
Gemdosnummer: 361 +
  +
Deklaration: int32_t Fsendto(int16_t fd, const void *buf, int32_t buflen, +int32_t flags, const struct sockaddr *to, uint32_t addrlen); +
  +
Beschreibung: +
  +
Ergebnis: +
  +
Verfügbar: Sie steht ab FreeMiNT 1.16 zur Verfügung. +
  +
Gruppe: Netzwerk +
  +
Querverweis: +
  + +
+ +

5.17.13 Fsetsockopt

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »setsockopt« - Optionen für Sockets festlegen +
  +
Gemdosnummer: 362 +
  +
Deklaration: int32_t Fsetsockopt(int16_t fd, int32_t level, int32_t name, +const void *val, uint32_t valsize); +
  +
Beschreibung: +
  +
Ergebnis: +
  +
Verfügbar: Sie steht ab FreeMiNT 1.16 zur Verfügung. +
  +
Gruppe: Netzwerk +
  +
Querverweis: +
  + +
+ +

5.17.14 Fgetsockopt

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »getsockopt« - Optionen für Sockets erfragen +
  +
Gemdosnummer: 363 +
  +
Deklaration: int32_t Fgetsockopt(int16_t fd, int32_t level, int32_t name, +void *val, uint32_t *valsize); +
  +
Beschreibung: +
  +
Ergebnis: +
  +
Verfügbar: Sie steht ab FreeMiNT 1.16 zur Verfügung. +
  +
Gruppe: Netzwerk +
  +
Querverweis: +
  + +
+ +

5.17.15 Fgetpeername

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »getpeername« - Namen des verbundenen Peer-Sockets erfragen +
  +
Gemdosnummer: 364 +
  +
Deklaration: int32_t Fgetpeername(int16_t fd, struct sockaddr *asa, uint32_t +*alen); +
  +
Beschreibung: +
  +
Ergebnis: +
  +
Verfügbar: Sie steht ab FreeMiNT 1.16 zur Verfügung. +
  +
Gruppe: Netzwerk +
  +
Querverweis: +
  + +
+ +

5.17.16 Fgetsockname

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »getsockname« - Socket-Namen abrufen +
  +
Gemdosnummer: 365 +
  +
Deklaration: int32_t Fgetsockname(int16_t fd, struct sockaddr *asa, uint32_t +*alen); +
  +
Beschreibung: +
  +
Ergebnis: +
  +
Verfügbar: Sie steht ab FreeMiNT 1.16 zur Verfügung. +
  +
Gruppe: Netzwerk +
  +
Querverweis: +
  + +
+ +

5.17.17 Fshutdown

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »shutdown« - Teil einer Vollduplex-Verbindung herunter fahren +
  +
Gemdosnummer: 366 +
  +
Deklaration: int32_t Fshutdown(int16_t fd, int32_t how); +
  +
Beschreibung: +
  +
Ergebnis: +
  +
Verfügbar: Sie steht ab FreeMiNT 1.16 zur Verfügung. +
  +
Gruppe: Netzwerk +
  +
Querverweis: +
  + +
+ +
+ +Home +GEMDOSGEMDOS +Zeichenweise Ein-/AusgabeZeichenweise Ein-/Ausgabe +ARGV-VerfahrenARGV-Verfahren + + diff --git a/de/gemdos_network.html b/de/gemdos_network.html new file mode 100644 index 000000000..23057618b --- /dev/null +++ b/de/gemdos_network.html @@ -0,0 +1,570 @@ + + + + + +Die Anleitung zum TOS: Netzwerkfunktionen + + + + + + + + + +Home +GEMDOSGEMDOS +SpeicherverwaltungSpeicherverwaltung +SystemfunktionenSystemfunktionen + +
+ +

5.13 Netzwerkfunktionen

+ + + + + + + + + + + + + + + + + + +
Fflush Datenpuffer einer Datei leeren +
Flock Datei von aktuelle Position sperren +
Frlock File Record sperren +
Frunlock File record freigeben +
Funlock File freigeben +
Nversion Kennung des Netzwerkes + +
+ +

5.13.1 Fflush

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Fflush« - Leert den Datenpuffer der Datei +
  +
Gemdosnummer: 102 (0x0066) +
  +
Deklaration: int32_t Fflush ( int16_t handle ); +
  +
Beschreibung: Die Funktion leert den Datenpuffer der angegebenen Datei und +schreibt die angesammelten Daten in die Datei. +
  +
Ergebnis: Die Funktion liefert bei korrekter Ausführung eine 0, und eine +negative Zahl, wenn es zu einem Fehler kam. +
  +
Verfügbar: Verfügbar, wenn ein Netzwerktreiber installiert ist. +
  +
Gruppe: Netzwerkfunktionen +
  +
Querverweis: Binding +
  + +
+ +

5.13.1.1 Bindings für Fflush

+ + + + + + +
C: int32_t Fflush ( int16_t handle ); +
  +
Assembler: +
  +
move.w    handle,-(sp) ; Offset 2
+move.w    #102,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

5.13.2 F_lock

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Flock« - schützt Teile von Dateien +
  +
Gemdosnummer: 100 (0x0064) +
  +
Deklaration: int32_t Flock ( int16_t handle, int32_t length ); +
  +
Beschreibung: Die GEMDOS-Routine Flock dient dazu, Teile von Dateien (von +der aktuellen position) gegen den Zugriff von anderen Prozessen zu +schützen. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Dateikennung +
start Anzahl der betroffenen Bytes + +
+ +
Hinweis: Verwechseln Sie diese Funktion ($64) nicht mit +Flock ($5C) aus der Spezifikation für GEMDOS File Sharing & +Record Locking. +
  +
Ergebnis: Die Funktion liefert bei korrekter Ausführung eine 0, und eine +negative Zahl, wenn es zu einem Fehler kam. +
  +
Verfügbar: Verfügbar, wenn ein Netzwerktreiber installiert ist. +
  +
Gruppe: Netzwerkfunktionen +
  +
Querverweis: Binding Funlock +
  + +
+ +

5.13.2.1 Bindings für F_lock

+ + + + + + +
C: int32_t Flock ( int16_t handle, int32_t length ); +
  +
Assembler: +
  +
move.l    length,-(sp) ; Offset 4
+move.w    handle,-(sp) ; Offset 2
+move.w    #100,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #8,sp        ; Stack korrigieren
+
+ +
+ +

5.13.3 Frlock

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Frlock« - schützt Teile von Dateien +
  +
Gemdosnummer: 98 (0x0062) +
  +
Deklaration: int32_t Frlock ( int16_t handle, int32_t start, int32_t length +); +
  +
Beschreibung: Die GEMDOS-Routine Frlock dient dazu, Teile von Dateien gegen +den Zugriff von anderen Prozessen zu schützen. Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Dateikennung +
start Startposition in der Datei +
length Anzahl der betroffenen Bytes + +
+ +
Ergebnis: Die Funktion liefert bei korrekter Ausführung eine 0, und eine +negative Zahl, wenn es zu einem Fehler kam. +
  +
Verfügbar: Verfügbar, wenn ein Netzwerktreiber installiert ist. +
  +
Gruppe: Netzwerkfunktionen +
  +
Querverweis: Binding Frunlock Nversion +
  + +
+ +

5.13.3.1 Bindings für Frlock

+ + + + + + +
C: int32_t Frlock ( int16_t handle, int32_t start, int32_t length +); +
  +
Assembler: +
  +
move.l    length,-(sp) ; Offset 8
+move.l    start,-(sp)  ; Offset 4
+move.w    handle,-(sp) ; Offset 2
+move.w    #98,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+lea       12(sp),sp    ; Stack korrigieren
+
+ +
+ +

5.13.4 Frunlock

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Frunlock« - entschützt Teile von Dateien +
  +
Gemdosnummer: 99 (0x0063) +
  +
Deklaration: int32_t Frunlock ( int16_t handle, int32_t start ); +
  +
Beschreibung: Die GEMDOS-Routine Frlock dient dazu, den gesperrten Teil einer +Datei zu entsperren. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Dateikennung +
start Startposition in der Datei + +
+ +
Ergebnis: Die Funktion liefert bei korrekter Ausführung eine 0, und eine +negative Zahl, wenn es zu einem Fehler kam. +
  +
Verfügbar: Verfügbar, wenn ein Netzwerktreiber installiert ist. +
  +
Gruppe: Netzwerkfunktionen +
  +
Querverweis: Binding Frlock Nversion +
  + +
+ +

5.13.4.1 Bindings für Frunlock

+ + + + + + +
C: int32_t Frunlock ( int16_t handle, int32_t start ); +
  +
Assembler: +
  +
move.l    start,-(sp)  ; Offset 4
+move.w    handle,-(sp) ; Offset 2
+move.w    #99,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #8,sp        ; Stack korrigieren
+
+ +
+ +

5.13.5 Funlock

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Funlock« - entschützt Teile von Dateien +
  +
Gemdosnummer: 101 (0x0065) +
  +
Deklaration: int32_t Funlock ( int16_t handle ); +
  +
Beschreibung: Die GEMDOS-Routine Funlock hebt von Flock gesetzte Sperre +wieder auf. Es gilt: +
  + + + + + + + + + +
Parameter Bedeutung +
    +
handle Dateikennung + +
+ +
Ergebnis: Die Funktion liefert bei korrekter Ausführung eine 0, und eine +negative Zahl, wenn es zu einem Fehler kam. +
  +
Verfügbar: Verfügbar, wenn ein Netzwerktreiber installiert ist. +
  +
Gruppe: Netzwerkfunktionen +
  +
Querverweis: Binding Flock +
  + +
+ +

5.13.5.1 Bindings für Funlock

+ + + + + + +
C: int32_t Funlock ( int16_t handle ); +
  +
Assembler: +
  +
move.w    handle,-(sp) ; Offset 2
+move.w    #101,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

5.13.6 Nversion

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Nversion« - Kennung des Netzwerkes +
  +
Gemdosnummer: 96 +
  +
Deklaration: int32_t Nversion( void ); +
  +
Beschreibung: Liefert die Kennung des angeschlossenen Netzwerkes zurück. +
  +
Ergebnis: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KennungName
1Bionet
2A-Net
3Elan
4TSE-Net
5Atlanet
6PAMs-Net
7Transnet
+
+ +
Verfügbar: +
  +
Gruppe: Netzwerkfunktionen +
  +
Querverweis: Binding +
  + +
+ +

5.13.6.1 Bindings für Nversion

+ + + + + + +
C: int32_t Nversion( void ); +
  +
Assembler: +
  +
move.w    #96,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +
+ +Home +GEMDOSGEMDOS +SpeicherverwaltungSpeicherverwaltung +SystemfunktionenSystemfunktionen + + diff --git a/de/gemdos_pipes.html b/de/gemdos_pipes.html new file mode 100644 index 000000000..2588ff6fa --- /dev/null +++ b/de/gemdos_pipes.html @@ -0,0 +1,48 @@ + + + + + +Die Anleitung zum TOS: Pipes, Test auf + + + + + + + + + +Home +GEMDOSGEMDOS +GEMDOS-FehlermeldungenGEMDOS-Fehlermeldungen +Das ProgrammformatDas Programmformat + +
+ +

5.4 Pipes, Test auf

+

Um zu testen ob Pipes vorhanden sind, kann man wie folgt +vorgehen: +

+
    +
  • Ist Laufwerk U vorhanden? +
      +

  • +
  • Gibt es dort ein Verzeichnis PIPE? +
      +

  • +
  • Sind dort erstellte Dateien wirklich Pipes, d.h. liefert +Fxattr nach einem Fcreate den Typ PIPE zurück? +
      +

  • +
+ +
+ +Home +GEMDOSGEMDOS +GEMDOS-FehlermeldungenGEMDOS-Fehlermeldungen +Das ProgrammformatDas Programmformat + + diff --git a/de/gemdos_process.html b/de/gemdos_process.html new file mode 100644 index 000000000..37065d10e --- /dev/null +++ b/de/gemdos_process.html @@ -0,0 +1,5457 @@ + + + + + +Die Anleitung zum TOS: Prozessfunktionen + + + + + + + + + +Home +GEMDOSGEMDOS +Datum und UhrzeitDatum und Uhrzeit +SpeicherverwaltungSpeicherverwaltung + +
+ +

5.11 Prozessfunktionen

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Pause        Prozess bis zum Eintreffen eines Signales suspendieren. +
Pdomain      Prozess-Umgebung setzen bzw. erfragen. +
Pexec        Weiteres Programm laden und ausführen. +
Pfork        Kopie des aktuellen Prozesses erzeugen. +
Pgetauid     User-ID eines Prozesses zu Beginn ermitteln. +
Pgetegid     Effektive Gruppen-ID eines Prozesses ermitteln. +
Pgeteuid     Effektive User-ID eines Prozesses ermitteln. +
Pgetgid      Gruppen-ID eines Prozesses ermitteln. +
Pgetgroups   gets the supplementary group ids for the calling process. +
Pgetpgrp     Aktuelle Prozess-Gruppennummer erfragen. +
Pgetpid      Aktuelle Prozess-ID erfragen. +
Pgetppid     Prozess-ID für Vater-Prozess erfragen. +
Pgetpriority gets the current priority value for a process. +
Pgetuid      User-ID eines Prozesses ermitteln. +
Pkill        Signal zu einem Prozess schicken. +
Pmsg         Nachrichten senden und empfangen. +
Pnice        Priorität des aktuellen Prozesses verändern. +
Prenice      Priorität eines Prozesses verändern. +
Prusage      Informationen über Resourcenverbrauch ermitteln. +
Psemaphore   Erzeugen, anwenden, zerstören einer Semaphore. +
Psetauid     User-ID eines Prozesses zu Beginn setzen. +
Psetegid     Effektive Gruppen-ID eines Prozesses setzen. +
Pseteuid     Effektive User-ID eines Prozesses setzen. +
Psetgid      Gruppen-ID eines Prozesses verändern. +
Psetgroups   sets the supplementary group ids for the calling process. +
Psetlimit    Limits der Systemresourcen setzen/erfragen. +
Psetpgrp     Prozess-Gruppennummer eines Prozesses setzen/erfragen. +
Psetpriority sets the current priority value for a process. +
Psetregid    sets the real and/or effective group id for the calling +process. +
Psetreuid    sets the real and/or effective user id for the calling process. +
Psetuid      User-ID eines Prozesses verändern. +
Psigaction   Art der Signalbehandlung verändern. +
Psigblock    Signalmaske verändern. +
Psigintr     Assigns a signal to a particular exception vector. +
Psignal      Art der Signalbehandlung verändern. +
Psigpause    Signalmaske setzen und Prozess bis zum Eintreffen eines Signals +suspendieren. +
Psigpending  Kontrollieren von abgeschickten Signalen. +
Psigreturn   Verlassen eines Signal-Handlers. +
Psigsetmask  Signalmaske ersetzen. +
Psysctl      Gets or sets system information. +
Pterm        Programm beenden und Wert an Aufrufer zurückgeben. +
Pterm0       Programm beenden und 0 an Aufrufer zurückgeben. +
Ptermres     Programm beenden, aber im Speicher behalten. +
Ptrace       Process tracing and debugging. +
Pumask       Erstellungsmaske für Dateien/Verzeichnisse setzen. +
Pusrval      Spezifische Informationen eines Prozesses setzen/erfragen. +
Pvfork       Kopie des aktuellen Prozesses erstellen. +
Pwait        Auf Childprozess warten, Exitcode ermitteln. +
Pwait3       Exitcode eines Childprozess ermitteln. +
Pwaitpid     Exitcode eines oder mehrerer Childs ermitteln. + +
+ +

Querverweis: Speicherverwaltung   Signale   Task-Manager +

+

5.11.1 Pause

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pause« - Prozess bis zum Eintreffen eines Signals +suspendieren. +
  +
Gemdosnummer: 289 +
  +
Deklaration: void Pause ( void ); +
  +
Beschreibung: Die Funktion suspendiert den aufrufenden Prozeß, bis ein +Signal für diesen eintrifft. Wenn für dieses Signal ein +Signal-Handler mittels Psignal installiert worden ist, wird der +Handler aufgerufen, bevor die Funktion Pause zurückkehrt. +
  +
Die Funktion wird nicht zurückkehren, wenn der Signal-Handler +einen nicht lokalen Sprung (per longjump) ausführt, oder das Programm +beendet wird. +
  +
Ergebnis: Die Funktion hat kein direktes Ergebnis. +
  +
Verfügbar: Seit der ersten in MultiTOS integrierten MiNT Version 1.04 und +MagiC ab Version 4.50. +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Psigblock   Psignal   Psigpause   Psigsetmask   +Signale +
  + +
+ +

5.11.1.1 Bindings für Pause

+ + + + + + +
C: void Pause ( void ); +
  +
Assembler: +
  +
move.w    #289,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

5.11.2 Pdomain

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pdomain« - Prozessumgebung setzen bzw. erfragen. +
  +
Gemdosnummer: 281 +
  +
Deklaration: int16_t Pdomain ( int16_t dom ); +
  +
Beschreibung: Die Funktion dient dem Setzen bzw. Abfragen der Umgebung, in +der der Prozeß ausgeführt wird. Diese Umgebung beeinflußt das +Verhalten des Prozesses zum Teil drastisch. Es gilt: +
  + + + + + + + + + + + + + + + +
dom Bedeutung +
    +
-1 aktuell gültige Domain erfragen. + + +
 0 TOS-Domain (Default-Wert). In dieser Umgebung verhalten +sich alle Systemaufrufe exakt genauso wie unter dem normalen TOS. + + +
 1 MiNT-Domain. In dieser Umgebung wird das Verhalten von +Fread und Fwrite durch die von Fcntl eingestellten Parameter +beeinflußt, wenn diese auf ein Terminal angewendet werden. Außerdem +werden Dateinamen die per Fsfirst bzw. Fsnext geliefert werden, anders +behandelt. + +
+ +
Hinweis: MiNT-kompatible Prozesse sollten auch mit +Dateien umgehen können, die nicht der Standard DOS-Konvention +(8+3 Zeichen) entsprechen. +
  +
Ergebnis: Die Funktion liefert die Umgebung des Prozesses zurück, die +beim Funktionsaufruf gültig war. +
  +
Verfügbar: Seit der ersten in MultiTOS integrierten MiNT Version 1.04 und +MagiC ab Version 4.0 (05.11.1995). +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Dpathconf   Dopendir +
  + +
+ +

5.11.2.1 Bindings für Pdomain

+ + + + + + +
C: int16_t Pdomain ( int16_t dom ); +
  +
Assembler: +
  +
move.w    dom,-(sp)    ; Offset 2
+move.w    #281,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

5.11.3 Pexec

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »program execution« - Programm laden und ausführen. +
  +
Gemdosnummer: 75 +
  +
Deklaration: int32_t Pexec ( uint16_t mode, ... ); +
  +
Beschreibung: Die Funktion lädt und startet ein Programm. Über den +Parameter mode lassen sich verschiedene Varianten auswählen: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
mode Bedeutung +
  +
0 int32_t Pexec (0, int8_t *name, int8_t *cmdline, int8_t *env); +
  +
Load and go: Lädt und startet das in name +angegebene Programm, und übergibt die Kommandozeile cmdline. +Für den Parameter env gilt: +
  + + + + + + +
-1 = kein Environment anlegen. +
NULL = Environment des Parent vererben. + +
+ +
Jeder andere Wert ist ein Zeiger auf das zu vererbene +Environment. +
  +
3 PD *Pexec (3, int8_t* name, int8_t *cmdline, int8_t *env); +
+
  +
Load, don't go: wird meist zum Starten von Overlays oder +zum Laden von Programmen in einem Debugger benutzt. Entspricht +mode 0, mit dem Unterschied, daß das Programm nicht sofort +gestartet wird, sondern ein Zeiger auf die Basepage als LONG +zurückgeliefert wird. Der Parent ist der Eigentümer des Speichers, +den die Basepage und das Environment des Childs belegen und muß ihn +freigeben, wenn das Child sich beendet hat. +
  +
4 int32_t Pexec (4, 0L, PD *basepage, 0L); +
+
  +
Just go: startet ein bereits geladenes Programm. Die +Basepage sollte mit mode 3 oder 5 erzeugt worden sein. +
  +
5 PD *Pexec (5, 0L, int8_t *cmdline, int8_t *env); +
+
  +
Create Basepage: Zunächst legt GEMDOS ein neues +Environment an. Dann wird der größte zusammenhängende Speicherblock +alloziert und in den ersten 256 Byte eine Basepage angelegt. Für den +Parameter env gilt: +
  + + + + + + +
-1 = kein Environment anlegen. +
NULL = Environment des Parent vererben. + +
+ +
Jeder andere Wert ist ein Zeiger auf das zu vererbende +Environment. +
  +
Unter MiNT kann dieser Mode zusammen mit mode 3 dazu +benutzt werden, einen Aufruf von Pvfork ohne Blockieren des parent zu +emulieren. +
  +
6 int32_t Pexec (6, 0L, PD *basepage, 0L); +
+
  +
Just go, then free: Entspricht mode 4, mit dem +Unterschied, daß allozierter Speicher dem gestarteten Prozess und +nicht dem Starter gehört, so daß der Speicher, den die Basepage +belegt, automatisch freigegeben wird, wenn das Child mit Pterm +terminiert. Zusammen mit Modus 3 kann damit der gleiche Effekt erzielt +werden, wie durch Modus 0. Dieser Modus steht erst ab GEMDOS-Version +0.15 zur Verfügung. +
  +
7 PD *Pexec (7, uint32_t prgflags, int8_t *cmdline, int8_t *env); +
  +
Create Basepage, respecting prgflags: Analog +mode 5, nur kann in prgflags die gleiche Information +wie im Feld ph_prgflags des Programm-Headers übergeben werden. Dieser +Modus wird vom BIOS des TT benutzt, um GEM zu starten, und steht erst +ab GEMDOS Version 0.19 zur Verfügung. +
  +
100 int32_t Pexec (100, int8_t *name, int8_t *cmdline, int8_t +*env); +
  +
Load, go, don't wait: Analog mode 0, nur wartet +der Aufrufer nicht, bis das gestartete Programm beendet wird, d.h. die +Funktion kehrt sofort zum Parent Prozess zurück, während das Child +startet. Der Rückgabewert ist ein negativer Fehlercode oder die +positive PID des Childs. +
  +
101 da dieser Modus nur MagiC-intern zum Vererben von Pfad- und +Dateihandles benutzt wird, wird auf die Angabe der genauen Syntax an +dieser Stelle verzichtet. +
  +
102 wird MagiC-intern verwendet, um einen bestimmten Prozess zu +entfernen. Auf die genaue Syntax wird daher an dieser Stelle +verzichtet. +
  +
104 int32_t Pexec (104, int8_t *name, PD *basepage, 0L); +
+
  +
Just go, don't wait: Analog mode 4, nur wartet +der Aufrufer nicht, bis das gestartete Programm beendet wird. Es wird +ein Prozess gestartet, dessen Basepage vorher durch einen Modus von 3, +5 oder 7 gesetzt wurde. Zu beachten ist, daß das Environment und die +Basepage des Childs sich auch im Besitz des Parents befinden +(tatsächlich erbt der Child allen Speicher, der sich im Besitz des +Parents befindet). Der Parameter name ist ein Zeiger auf einen +String, der den Namen des neuen Prozesses beschreibt; bei einem +NULL-Wert wird der Name des Parent-Prozesses benutzt. Die Funktion +liefert einen negativen Fehlercode, oder die positive PID des Childs +zurück. +
  +
106 int32_t Pexec (106, int8_t *name, PD *basepage, 0L); +
+
  +
Just go, don't wait, no sharing: Analog mode +104, allerdings befinden sich Environment und Basepage des Childs +nicht im Besitz des Parents, und der Child hat keinen Zugriff +auf Speicher, welcher dem Parent-Prozess zugeteilt wurde. Beim Beenden +des Childs wird dessen Speicherplatz wieder freigegeben. In Verbindung +mit Modus 3 entspricht Pexec (106, ...) daher dem Modus 100 (während +Modus 3 gefolgt von Modus 6 einem Aufruf von Pexec (0, ...) +entspricht). +
Wird ab MagiC 2.0 nicht mehr unterstützt. +
  +
107 entspricht im wesentlichen mode 7, und wird intern von +MagiC seit Version 2.10 verwendet. Auf die genaue Syntax wird daher an +dieser Stelle verzichtet. +
  +
108 wird von MagiC seit Version 2.10 intern zum Starten eines +Accessories verwendet. Da die genaue Syntax offiziell nicht +dokumentiert ist, sollten eigene Programme besser auf shel_write +zurückgreifen. +
  +
200 int32_t Pexec (200, int8_t *name, int8_t *cmdline, int8_t +*env); +
  +
Replace program and go: Analog mode 100, jedoch +überschreibt der neue Prozess den alten vollständig. Der alte +Prozess behält zwar seine PID und die meisten seiner Attribute, aber +sein gesamter Speicherplatz wird freigegeben. Während Pexec (0, ...) +als Unterprogrammaufruf (call...return) angesehen werden kann, wirkt +dieser Modus eher wie ein 'goto'. +
  +
300 +
  +
301 +
  +
401 da diese Modus nur MagiC-intern, wird auf die Angabe der +genauen Syntax an dieser Stelle verzichtet. +
  + +
+ +
Hinweis: Nicht alle Modi sind unter allen +Betriebssystemvarianten verfügbar; deshalb sollte der Rückgabewert +der Funktion beachtet werden. Unbekannte Modi sorgen für ein +Funktionsergebnis von EINVFN. +
  +
Kommandozeilen werden als String im Pascal-Format +übergeben, d.h. im ersten Byte befindet sich die Länge der Zeile +(maximal 124 Zeichen). +
  +
Ergebnis: Die Funktion liefert als Ergebnis den Abschlußcode des +Child-Prozesses. Wenn ein Overlay geladen wurde, enthält das Ergebnis +die Basepage des Overlays. Bei einem negativen Resultat ist ein Fehler +aufgetreten. +
  +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   shel_write   Programmflags   ARGV-Verfahren +
  + +
+ +

5.11.3.1 Bindings für Pexec

+ + + + + + + + + +
C: int32_t Pexec ( uint16_t mode, ... ); +
  +
Assembler: +
  +
pea       env          ; Offset 12
+pea       cmdline      ; Offset  8
+pea       name         ; Offset  4
+move.w    mode,-(sp)   ; Offset  2
+move.w    #75,-(sp)    ; Offset  0
+trap      #1           ; GEMDOS aufrufen
+lea       $10(sp),sp   ; Stack korrigieren
+
+
GFA-Basic Adresse%=Gemdos(&H4B,W:mode%,L:name%,L:cmdline%,L:env) +
  + +
+ +

5.11.4 Pfork

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pfork« - Kopie des aktuellen Prozesses erzeugen. +
  +
Gemdosnummer: 283 +
  +
Deklaration: int16_t Pfork ( void ); +
  +
Beschreibung: Die Funktion erzeugt eine Kopie des aktuellen Prozesses. Der +Child-Prozeß erbt dabei eine Kopie des Adreßraums des +Parent-Prozesses, d.h. Änderungen, die der Child an Variablen macht, +haben keinen Einfluß auf den Parent. +
  +
Der neu erzeugte Prozeß beginnt seine Arbeit, wenn die Funktion +Pfork zurückkehrt. +
  +
Wenn der Parent im Supervisor-Modus ist, wenn diese Funktion +aufgerufen wird, wird das Child dennoch im User-Modus gestartet. +
  +
Ein neuer Prozess, der mit dieser Funktion gestartet wird, darf +nicht Mshrink aufrufen, muß aber jede GEM Initialisierung wie +appl_init und v_openvwk erneut ausführen (wenn er GEM benötigt). +Parent und Child müssen beide Pterm oder Pterm0 aufrufen, um sich zu +beenden. +
  +
Ergebnis: Die Funktion kann folgende Rückgabewerte liefern: +
  + + + + + + + + + +
E_OK  : im Child-Prozeß. +
>0    : neue Prozess-ID im Parent-Prozeß. +
ENSMEM: nicht genug Speicher vorhanden, um den neuen Prozeß zu +erzeugen. + +
+ +
Verfügbar: Seit der ersten in MultiTOS integrierten MiNT Version 1.04. +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Pexec   Pvfork   Threads +
  + +
+ +

5.11.4.1 Bindings für Pfork

+ + + + + + +
C: int16_t Pfork ( void ); +
  +
Assembler: +
  +
move.w    #283,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

5.11.5 Pgetauid

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pgetauid« - User ID eines Prozesses zu Beginn ermitteln. +
  +
Gemdosnummer: 325 (0x0145) +
  +
Deklaration: int16_t Pgetauid ( void ); +
  +
Beschreibung: Die Funktion ermittelt die Anfangs-User-ID des aktuellen +Prozesses. Zusammen mit Psetauid kann damit in einer Multiuserumgebung +festgestellt werden, wer der zuerst eingeloggte Benutzer war. +
  +
Ergebnis: Der Rückgabewert ist die Anfangs-User-ID des Prozesses. +
  +
Verfügbar: ab MiNT 1.11 +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Psetauid +
  + +
+ +

5.11.5.1 Bindings für Pgetauid

+ + + + + + +
C: int16_t Pgetauid ( void ); +
  +
Assembler: +
  +
move.w    #325,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

5.11.6 Pgetegid

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pgetegid« - effektive Gruppen-ID eines Prozesses ermitteln. +
  +
Gemdosnummer: 313 +
  +
Deklaration: int32_t Pgetegid ( void ); +
  +
Beschreibung: Die Funktion liefert die effektive Gruppen-ID des aktuellen +Prozesses und ähnelt dem Systemaufruf Pgetgid. Der Unterschied +besteht darin, daß hier die effektive Gruppen-ID zurückgegeben wird. +
  +
Diese ist normalerweise mit der wirklichen Gruppen-ID identisch; +falls aber ein Programm läuft, welches das setgid Bit gesetzt hat, +ist seine effektive Gruppen-ID gleich der (wirklichen) ID des +Besitzers dieser Programmdatei. +
  +
Dateizugriff basiert u.a. auf der effektiven Gruppen-ID, so daß +der setgid-Mechanismus es Benutzern (vor allem dem Super-User) +erlaubt, anderen Usern Zugriff zu erlauben. +
  +
Ergebnis: Der Rückgabewert ist die effektive Gruppen-ID des Prozesses. +
  +
Verfügbar: Verfügbar, wenn ein 'MiNT' Cookie mit einer Versionsnummer von +mindestens 0.95 existiert. +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Pgetuid   Pgetgid   Pgeteuid +
  + +
+ +

5.11.6.1 Bindings für Pgetegid

+ + + + + + +
C: int32_t Pgetegid ( void ); +
  +
Assembler: +
  +
move.w    #313,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

5.11.7 Pgeteuid

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pgeteuid« - effektive User-ID eines Prozesses ermitteln. +
  +
Gemdosnummer: 312 +
  +
Deklaration: int32_t Pgeteuid ( void ); +
  +
Beschreibung: Die Funktion liefert die effektive User-ID des aktuellen +Prozesses und ähnelt dem Systemaufruf Pgetuid. Der Unterschied +besteht darin, daß hier die effektive User-ID zurückgegeben wird. +
  +
Diese ist normalerweise mit der wirklichen User-ID identisch; +falls aber ein Programm läuft, welches das setuid Bit gesetzt hat, +ist seine effektive User-ID gleich der (wirklichen) ID des Besitzers +dieser Programmdatei. +
  +
Dateizugriff basiert u.a. auf der effektiven User-ID, so daß +der setuid-Mechanismus es Benutzern (vor allem dem Super-User) +erlaubt, anderen Usern Zugriff zu erlauben. +
  +
Ergebnis: Der Rückgabewert ist die effektive User-ID des Prozesses. +
  +
Verfügbar: Verfügbar, wenn ein 'MiNT' Cookie mit einer Versionsnummer von +mindestens 0.95 existiert. +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Pgetuid   Pgetgid   Pgetegid +
  + +
+ +

5.11.7.1 Bindings für Pgeteuid

+ + + + + + +
C: int32_t Pgeteuid ( void ); +
  +
Assembler: +
  +
move.w    #312,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

5.11.8 Pgetgid

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pgetgid« - Gruppen ID eines Prozesses ermitteln. +
  +
Gemdosnummer: 276 +
  +
Deklaration: int16_t Pgetgid ( void ); +
  +
Beschreibung: Die Funktion liefert die wirkliche Gruppen-ID des aktuellen +Prozesses zurück. Dies ist eine Zahl zwischen 0 und 255, die die +Rechte der Prozessgruppe festlegt. +
  +
Ergebnis: Der Rückgabewert ist die wirkliche Gruppen-ID des Prozesses. +
  +
Verfügbar: Seit der ersten in MultiTOS integrierten MiNT Version 1.04. +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Pgetuid   Pgeteuid   Pgetegid +
  + +
+ +

5.11.8.1 Bindings für Pgetgid

+ + + + + + +
C: int16_t Pgetgid ( void ); +
  +
Assembler: +
  +
move.w    #276,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

5.11.9 Pgetgroups

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pgetgroups« - gets the supplementary group ids for the +calling process. +
  +
Gemdosnummer: 327 (0x0147) +
  +
Deklaration: int32_t Pgetgroups( int16_t len, int16_t *gidset); +
  +
Beschreibung: This function gets the supplementary group ids for the calling +process. +
  +
len specifies the length (in words) of the array to be +filled with the supplementary group ids available. This value must be +a positive number not greater than NGROUPS_MAX. If len is a +zero, the call will return the number of supplementary group ids +currently available for the calling process. +
  +
gidset is a pointer to a word array to be filled with +retrieved ids. +
  +
The NGROUPS_MAX value is returned by Sysconf(). +
  +
Ergebnis: Returns a number of supplementary group ids for the process on +success or a negative GEMDOS error code otherwise. +
  +
Verfügbar: Sie steht ab MiNT 1.11 zu Verfügung. +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Psetgroups   Sysconf +
  + +
+ +

5.11.9.1 Bindings für Pgetgroups

+ + + + + + +
C: int32_t Pgetgroups( int16_t len, int16_t *gidset); +
  +
Assembler: +
  +
pea       gidset       ; Offset 4
+move.w    len,-(sp)    ; Offset 2
+move.w    #327,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #8,sp        ; Stack korrigieren
+
+ +
+ +

5.11.10 Pgetpgrp

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pgetpgrp« - aktuelle Prozess Gruppennummer erfragen. +
  +
Gemdosnummer: 269 +
  +
Deklaration: int16_t Pgetpgrp ( void ); +
  +
Beschreibung: Es wird die Gruppen-Nummer des aktuell aktiven Prozesses +zurück geliefert. Prozessgruppen werden gewöhnlich für Job-Control +und andere Zwecke benutzt. +
  +
Ergebnis: Prozeß-Gruppen-Nummer des aktiven Prozesses. +
  +
Verfügbar: Seit der ersten in MultiTOS integrierten MiNT Version 1.04. +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Bindings für Pgetpgrp   Pkill   Pgetpid   Psetpgrp +
  + +
+ +

5.11.10.1 Bindings für Pgetpgrp

+ + + + + + +
C: int16_t Pgetpgrp ( void ); +
  +
Assembler: +
  +
move.w    #269,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

5.11.11 Pgetpid

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pgetpid« - aktuelle Prozess ID erfragen. +
  +
Gemdosnummer: 267 (0x010b) +
  +
Deklaration: int16_t Pgetpid ( void ); +
  +
Beschreibung: Die Funktion liefert die PID des aktuell aktiven Prozesses, +also desjenigen, der momentan die CPU besitzt; es handelt sich dabei +um den Dateityp, unter dem der aktuelle Prozess im Verzeichnis U:\PROC +geführt wird. +
  +
A PID is dynamically assigned to a process when it is created. +You should make no assumption on the PID a process may have. For the +kernel, the PID is a WORD but when you program in C, you should use +the pid_t type, which complies with the POSIX standard. The FreeMiNT +kernel's PID is always 0. +
  +
The PID is useful when it is important to identify a process +among others in the system. Knowing the PID of a program, it is +possible to do a lot of things: send it a signal with Psignal(), look +for its name in /proc by searching with a "*.xxx" mask (xxx +is the PID of the program which name we wanna know), etc. +
  +
Ergebnis: PID des aktiven Prozesses. +
  +
Verfügbar: Sie steht in MagiC ab Version 3.0 und unter MiNT zur +Verfügung. +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Pgetpgrp   Pgetppid +
  + +
+ +

5.11.11.1 Bindings für Pgetpid

+ + + + + + +
C: int16_t Pgetpid ( void ); +
  +
Assembler: +
  +
move.w    #267,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

5.11.12 Pgetppid

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pgetppid« - Prozess ID für Vater Prozess erfragen. +
  +
Gemdosnummer: 268 (0x010c) +
  +
Deklaration: int16_t Pgetppid ( void ); +
  +
Beschreibung: Die Funktion liefert die PID des Parent-Prozesses, des z.Zt. +aktiven Prozesses. +
  +
In the FreeMiNT kernel, processes are represented as a tree. The +root of the tree is the kernel itself (PID 0). At boot time, the +kernel launches another process (which can be 'init' in case of a +Unix-like setup, or an AES, a shell or whatever) specified by the INIT +or GEM keyword in the mint.cnf file. This process will launch other +processes (daemons, accessories, programs etc) that are its so-called +children. +
  +
Therefore, every process (but the kernel, obviously) is created +by its so-called parent. The Pgetppid() (get parent's PID) call allows +to determine the PID of the parent of the calling process. To have a +good illustration of this, you can use the 'ps' command in your shell. +You will see that all accessories's parent is the AES, and that the +daemons are started by the 'init' program. +
  +
Ergebnis: Prozess-ID des Parent (positiv). Wenn der aktuelle Prozess +direkt vom Kernel gestartet wurde, wird 0 zurück geliefert. Ein +Rückgabewert von -1 signalisiert, daß der Prozess keinen Parent +besitzt. +
  +
Verfügbar: Seit der ersten in MultiTOS integrierten MiNT Version 1.04 und +MagiC ab Version 3.0. +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Pgetpgrp   Pgetpid +
  + +
+ +

5.11.12.1 Bindings für Pgetppid

+ + + + + + +
C: int16_t Pgetppid ( void ); +
  +
Assembler: +
  +
move.w    #268,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

5.11.13 Pgetpriority

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pgetpriority« - gets the current priority value for a +process +
  +
Gemdosnummer: 344 (0x0158) +
  +
Deklaration: int32_t Pgetpriority ( int16_t which, int16_t who); +
  +
Beschreibung: This function gets the priority of the processes specified by +which and who. The interpretation of parameter +who depends on which: +
  + +
PRIO_PROCESS (0) reads the priority of process with process id +who. A who of 0 implies the process id of the calling +process. +
  + +
PRIO_PGRP (1) reads the priority of the process group with +process group id who. If the priorities of the process differ, +the lowest valued priority (i. e. the highest CPU usage priority) is +returned. A who of 0 implies the process group id of the +calling process. +
  + +
PRIO_USER (2) reads the priority of the process of the user with +user id who. For multiple processes the lowest valued priority +is returned. A who of 0 implies the user id of the calling +process. +
  +
Library functions should first check for an error condition and +then decrement the returned value by 20. +
  +
This call makes calls Pnice and Prenice obsolete. +
  +
Ergebnis: Return value is either a negative error number in case of +failure or the requested priority + 20 on success. +
  +
Verfügbar: MiNT 1.15.0 +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Psetpriority +
  + +
+ +

5.11.13.1 Bindings für Pgetpriority

+ + + + + + +
C: int32_t Pgetpriority ( int16_t which, int16_t who); +
  +
Assembler: +
  +
move.w    who,-(sp)    ; Offset 4
+move.w    which,-(sp)  ; Offset 2
+move.w    #344,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

5.11.14 Pgetuid

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pgetuid« - User ID eines Prozesses ermitteln. +
  +
Gemdosnummer: 271 +
  +
Deklaration: int16_t Pgetuid ( void ); +
  +
Beschreibung: Die Funktion liefert die wirkliche User-ID des aktuellen +Prozesses zurück. Dies ist eine Zahl zwischen 0 und 255, die die +Zugriffsrechte des Prozesses festlegt und benutzt werden kann, um in +Multi-User-Systemen die einzelnen Benutzer zu unterscheiden. +
  +
Ergebnis: Der Rückgabewert ist die tatsächliche User-ID des Prozesses. +
  +
Verfügbar: Seit der ersten in MultiTOS integrierten MiNT Version 1.04. +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Pgetgid   Pgeteuid   Pgetegid +
  + +
+ +

5.11.14.1 Bindings für Pgetuid

+ + + + + + +
C: int16_t Pgetuid ( void ); +
  +
Assembler: +
  +
move.w    #271,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

5.11.15 Pkill

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pkill« - Signal zu einem Prozess schicken. +
  +
Gemdosnummer: 273 +
  +
Deklaration: int32_t Pkill ( int16_t pid, int16_t sig ); +
  +
Beschreibung: Die Funktion sendet das Signal sig an einen oder +mehrere Prozesse. Für den Parameter pid gilt: +
  + + + + + + + + + + + + + + + +
pid Bedeutung +
    +
> 0 das Signal wird dem Prozess mit der angegebenen pid +geschickt. +
= 0 das Signal wird an alle Prozesse der entsprechenden +Prozessgruppe geschickt (dazu gehört auch der Aufrufer selbst !). +
< 0 das Signal wird an alle Prozesse mit der Gruppennummer -pid +geschickt. + +
+ +
Das Signal SIGNULL wird von Pkill nicht in der gewohnten Weise +behandelt. Es kann benutzt werden, um die Existenz eines Prozesses zu +testen. Dazu schickt man diesem ein SIGNULL, und kontrolliert, ob Pkill +mit dem Wert 0 zurückkehrt. +
  +
Seit MagiC 6.01 (1998.10.10) werden auch PIDs < 0 +unterstützt. +
  +
Ergebnis: Die Funktion kann folgende Rückgabewerte liefern: +
  + + + + + + + + + + + + +
E_OK  : kein Fehler aufgetreten. +
EFILNF: falls pid > 0 und der angegebene Prozess nicht mehr +existiert bzw. falls pid < 0 und die angegebene +Prozeßgruppe keine Mitglieder mehr besitzt. +
EACCDN: falls pid > 0, und der sendende Prozess keine EUID +von 0 besitzt und außerdem die UID des empfangenden von der des +sendenden Prozesses abweicht. +
ERANGE: sig ist kein gültiges Signal. + +
+ +
Hinweis: Wenn der aktuelle Prozess das Signal selbst +empfängt und terminiert wird, kehrt die Funktion nicht zurück! +
  +
Verfügbar: Seit der ersten in MultiTOS integrierten MiNT Version 1.04 und +MagiC ab Version 4.50. +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Psetpgrp   Psignal   Signale +
  + +
+ +

5.11.15.1 Bindings für Pkill

+ + + + + + +
C: int32_t Pkill ( int16_t pid, int16_t sig ); +
  +
Assembler: +
  +
move.w    sig,-(sp)    ; Offset 4
+move.w    pid,-(sp)    ; Offset 2
+move.w    #273,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

5.11.16 Pmsg

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pmsg« - Empfangen und Senden von Nachrichten. +
  +
Gemdosnummer: 293 +
  +
Deklaration: int32_t Pmsg ( int16_t mode, int32_t mbox, void *msg ); +
  +
Beschreibung: Die Funktion sendet bzw. empfängt eine Nachricht zu bzw. von +einer Mailbox. Die jeweils auszuführende Operation kann über die +Bits des Parameters mode festgelegt werden. Es bedeutet: +
  + + + + + + + + + + + + + + + + + + +
mode Operation +
    +
0x0000 Blockiert den Prozess bis aus der übergebenen Mailbox mit der +ID mbox eine Nachricht gelesen werden kann und speichert diese +in der Struktur, auf die msg zeigt. +
0x0001 Blockiert den Prozess bis ein Prozess auf eine Nachricht aus +der Mailbox mit der ID mbox wartet und diese Nachricht aus der +Struktur, auf die msg zeigt, ausliest. +
0x0002 Blockiert den Prozess bis ein Prozess auf eine Nachricht aus +der Mailbox mit der ID mbox wartet und diese Nachricht aus der +Struktur, auf die msg zeigt, ausliest und in der Mailbox mit +der Kennung 0xffffxxxx eine Nachricht liegt (dabei ist xxxx die PID +des aktuellen Prozesses). +
0x8000 Durch eine ODER-Verknüpfung mit diesem Wert kann die Operation +im nicht-blockierenden Modus ausgeführt werden. + +
+ +
Die Nachrichten sind 5 Wörter lang, und zwar zwei Langworte und ein +Short (in dieser Reihenfolge). Dabei können die 2 Langwörter vom +Prozess mit beliebiger Information gefüllt werden, während im Short +die PID des Senders einzutragen ist. +
  +
Nach dem die Nachricht verschickt worden ist, enthält dieses +Short die PID des Prozesses, der die Nachricht gelesen hat. Umgekehrt +enthält dieser nach dem Lesen einer Nachricht die PID des Prozesses, +der die Nachricht geschrieben hat. +
  +
Wenn in mode das höchstwertige Bit gesetzt ist, und es +keinen Leser bzw. Schreiber für die Mailbox mbox gibt, wird +der Wert -1 zurückgeliefert. Anderenfalls wartet eine Leseoperation +bis eine Nachricht geschrieben wurde, bzw. eine Schreiboperation bis +ein lesender Prozess bereit ist. +
  +
Im Modus 2 gibt der Schreiber an, daß er auf eine Antwort +warten möchte. Die Idee dabei ist, daß dieser Prozess sich schlafen +legen kann, und zu einem späteren Zeitpunkt von dem Prozess der die +Nachricht erhält, wieder aufgeweckt werden kann. Dabei wird +garantiert, daß der Prozess, welcher die Original-Nachricht erhält +beim Schreiben der Antwort nicht blockiert wird. +
  +
Ergebnis: Die Funktion kann folgende Rückgabewerte liefern: +
  + + + + + + + + + +
E_OK : kein Fehler aufgetreten. +
EINVFN : ungültiger Wert für den Parameter mode. +
-1 : Bit-15 ist gesetzt, und Pmsg würde blockieren. + +
+ +
Verfügbar: Verfügbar, wenn ein 'MiNT' Cookie mit einer Versionsnummer von +mindestens 0.90 existiert. +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding +
  + +
+ +

5.11.16.1 Bindings für Pmsg

+ + + + + + +
C: int32_t Pmsg ( int16_t mode, int32_t mbox, void *msg ); +
  +
Assembler: +
  +
pea       msg          ; Offset 8
+move.l    mbox,-(sp)   ; Offset 4
+move.w    mode,-(sp)   ; Offset 2
+move.w    #293,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+lea       $C(sp),sp    ; Stack korrigieren
+
+ +
+ +

5.11.17 Pnice

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pnice« - Priorität des aktuellen Prozesses verändern. +
  +
Gemdosnummer: 266 +
  +
Deklaration: int16_t Pnice ( int16_t delta ); +
  +
Beschreibung: Die Funktion ändert die Priorität des aktuellen Prozesses um +den Wert delta. Eine höhere Priorität bedeutet, daß der +Prozess eine größere Zeitscheibe erhält, also nicht so oft +umgeschaltet wird. Analog bedeutet eine niedrige Priorität, daß die +Zeitscheibe des Prozesses verkleinert wird, und er daher öfter die +CPU abgeben muß. +
  +
Für den Parameter delta muß gelten: +
- 20 <= delta <= 20. +
  +
Die Funktion Pnice entspricht Prenice (Pgetpid(), delta) und ist +zur Abwärtskompatibilität implementiert. +
  +
Ergebnis: Die Funktion liefert die aktuelle Prozeß Umschalt-Priorität +zurück. Diese ist per Default auf 0 eingestellt. Größere bzw. +kleinere Werte bedeuten, daß der Prozess eine größere bzw. kleinere +Zeitscheibe besitzt. +
  +
Verfügbar: Seit der ersten in MultiTOS integrierten MiNT Version 1.04 und +MagiC ab Version 6.20 (2000-02-02). +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Prenice +
  + +
+ +

5.11.17.1 Bindings für Pnice

+ + + + + + +
C: int16_t Pnice ( int16_t delta ); +
  +
Assembler: +
  +
move.w    delta,-(sp)  ; Offset 2
+move.w    #266,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

5.11.18 Prenice

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Prenice« - Priorität eines Prozesses verändern. +
  +
Gemdosnummer: 295 +
  +
Deklaration: int32_t Prenice ( int16_t pid, int16_t delta ); +
  +
Beschreibung: Die Funktion ändert die Priorität des Prozesses mit der +Kennung pid um den Wert delta. Eine höhere Priorität +bedeutet, daß der Prozess eine größere Zeitscheibe erhält, also +nicht so oft umgeschaltet wird. Analog bedeutet eine niedrige +Priorität, daß die Zeitscheibe des Prozesses verkleinert wird, und +er daher öfter die CPU abgeben muß. +
  +
Für den Parameter delta muß gelten: +
- 20 <= delta <= 20. +
  +
Ergebnis: Die Funktion liefert die aktuelle Prozeß Umschalt-Priorität +zurück. Diese ist per Default auf 0 eingestellt. Größere bzw. +kleinere Werte bedeuten, daß der Prozess eine größere bzw. kleinere +Zeitscheibe besitzt. +
  +
Im Fehlerfall liefert die Funktion: +
  + + + + + + +
EFILNF: der angegebene Prozess existiert nicht. +
EACCDN: der angegebene Prozess besitzt eine andere User-ID als der +aufrufende Prozess. + +
+ +
Verfügbar: Verfügbar, wenn ein 'MiNT' Cookie mit einer Versionsnummer von +mindestens 0.90 existiert und MagiC ab Version 6.20 (2000-01-02). +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Bindings für Prenice   Pnice +
  + +
+ +

5.11.18.1 Bindings für Prenice

+ + + + + + +
C: int32_t Prenice ( int16_t pid, int16_t delta ); +
  +
Assembler: +
  +
move.w    delta,-(sp)  ; Offset 4
+move.w    pid,-(sp)    ; Offset 2
+move.w    #295,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

5.11.19 Prusage

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Prusage« - Informationen über Resourcenverbrauch ermitteln. +
  +
Gemdosnummer: 286 +
  +
Deklaration: int32_t Prusage ( int32_t *r ); +
  +
Beschreibung: Die Funktion liefert Informationen über den Bedarf an +Systemresourcen des aktuellen Prozesses. +
  +
Die Informationen werden im Array r nach außen +gereicht; es gilt folgende Belegung: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
r[0]: Prozess-Zeit im Kernel +
r[1]: Prozess-Zeit im eigenen Programmcode +
r[2]: Gesamt-Prozesszeit der Childs im Kernel +
r[3]: Gesamt-Prozesszeit der Childs im eigenen Programmcode +
r[4]: Speicher der diesem Prozess gehört (in Bytes) +
r[5]: reserviert +
r[6]: reserviert +
r[7]: reserviert + +
+ +
Alle Zeiten sind in Milli-Sekunden angegeben. +
  +
Ergebnis: Die Funktion hat kein direktes Ergebnis. +
  +
Verfügbar: Seit der ersten in MultiTOS integrierten MiNT Version 1.04. +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Psetlimit +
  + +
+ +

5.11.19.1 Bindings für Prusage

+ + + + + + +
C: int32_t Prusage ( int32_t *r ); +
  +
Assembler: +
  +
pea       r            ; Offset 2
+move.w    #286,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

5.11.20 Psemaphore

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Psemaphore« - erzeugen, anwenden, zerstören einer +Semaphore. +
  +
Gemdosnummer: 308 +
  +
Deklaration: int32_t Psemaphore ( int16_t mode, int32_t id, int32_t timeout +); +
  +
Beschreibung: Die Funktion implementiert nicht-zählende Semaphore. Nur ein +Prozess kann einen Semaphor zur gleichen Zeit besitzen. +
  +
Semaphoren können z.B. benutzt werden, um den Zugriff auf +Datenstrukturen im Shared Memory von unterschiedlichen Teilprozessen +zu synchronisieren: So muß ein Teilprozess, bevor er auf den Speicher +zugreift, versuchen, in den Besitzt des Semaphors zu kommen. Dieser +kann z.B. bei der Initialisierung erzeugt, und bei Programmende wieder +entfernt werden. +
  +
Semaphore werden durch einen Namen identifiziert. Dieser Name +ist ein Langwort, das auch vier ASCII-Zeichen enthalten kann. +Semaphore, deren Namen mit dem Unterstrich '_' beginnen sind dabei +für das Betriebssystem reserviert. +
  +
Der Parameter timeout wird nur im Modus 2 benutzt. +Es gilt dabei die folgende Belegung: +
  + + + + + + +
timeout =  0: sofort zurückkehren +
  = -1: kein Timeout (Forever). + +
+ +
Andere Werte für timeout geben die Wartezeit in +Millisekunden an, bevor ein Timeout eintritt. +
  +
Für den Parameter mode sind folgende Werte +möglich: +
  + + + + + + + + + + + + + + + + + + +
mode Bedeutung +
    +
0 Semaphore mit Kennung id erzeugen (und besitzen). +
1 Semaphore mit Kennung id entfernen. Dies klappt nur, +wenn der Aufrufer die Semaphore besitzt. +
2 Besitz der Semaphore mit Kennung id beantragen. Dies +blockiert den Aufrufer bis die Semaphore frei wird, oder ein Timeout +eintritt. +
3 Semaphore mit Kennung id freigeben. Dies klappt nur, +wenn der Aufrufer die Semaphore besitzt. + +
+ +
Hinweis: Wenn ein Prozess eine Semaphore erzeugt, +besitzt er sie auch sofort. Damit andere Prozesse diese nutzen +können, muß sie zunächst freigegeben werden. Da für das Erzeugen +einer Semphore interner Speicher angefordert werden muss, sollte die +Funktion sparsam verwendet werden. +
  +
Wenn ein blockierter Prozess auf eine Semaphore wartet (bevor +der Timeout eintritt), und ein anderer Prozess entfernt die Semaphore, +dann kehrt die Funktion Psemaphore mit der Meldung ERANGE zurück, da +die angeforderte Semaphore nicht länger existiert. +
  +
Wenn ein Prozess terminiert, werden alle Semaphore die er +besitzt, automatisch freigegeben (aber nicht zerstört). Der Besitz +einer Semaphore kann nicht vererbt werden (etwa mit Pfork). Wenn ein +Prozess eine Semaphore erzeugt und dann abstürzt, bleibt die +Semaphore erhalten, und kann nicht mehr entfernt werden. +
  +
In MagiC sorgen Plausibilitätsüberprüfungen dafür, daß +keine System-Semaphoren freigegeben werden können; außerdem werden +z.Zt. nur die Modi 2 und 3 unterstützt. +
  +
Ergebnis: Die Funktion kann folgende Rückgabewerte liefern: +
  + + + + + + + + + + + + +
E_OK  : kein Fehler aufgetreten. +
ERROR : es wurde eine Semaphore beantragt, die der Antragsteller +bereits besitzt. +
EACCDN: es wurde versucht eine Semaphore zu erzeugen, die bereits +existiert, der Aufrufer ist nicht im Besitz der Semaphore oder ein +Timeout ist eingetreten. +
ERANGE: der angegebene Semaphor existiert nicht. + +
+ +
Verfügbar: Verfügbar, wenn ein 'MiNT' Cookie mit einer Versionsnummer von +mindestens 0.92 existiert und in MagiC ab Version 3.0. +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Semaphoren in MagiC +
  + +
+ +

5.11.20.1 Bindings für Psemaphore

+ + + + + + +
C: int32_t Psemaphore ( int16_t mode, int32_t id, int32_t timeout +); +
  +
Assembler: +
  +
move.l    timeout,-(sp)  ; Offset 8
+move.l    id,-(sp)       ; Offset 4
+move.w    mode,-(sp)     ; Offset 2
+move.w    #308,-(sp)     ; Offset 0
+trap      #1             ; GEMDOS aufrufen
+lea       $C(sp),sp      ; Stack korrigieren
+
+ +
+ +

5.11.21 Psetauid

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Psetauid« - User ID eines Prozesses zu Beginn setzen. +
  +
Gemdosnummer: 326 (0x0146) +
  +
Deklaration: int16_t Psetauid ( int16_t id ); +
  +
Beschreibung: Die Funktion setzt die Anfangs-User-ID des aktuellen Prozesses. +Dies kann nur einmal geschehen. Zusammen mit Pgetauid kann damit in +einer Multiuser-Umgebung festgestellt werden, wer der zuerst +eingeloggte Benutzer war. Der Parameter id ist die gewünschte +Anfangs-ID. +
  +
Achtung: Diese Funktion ist optional, daher darf ein +Aufruf mit EINVFN beantwortet werden. +
  +
Ergebnis: z.Zt. unbekannt +
  +
Verfügbar: Verfügbar, wenn ein 'MiNT' Cookie mit einer Versionsnummer von +mindestens 0.92 existiert. +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Pgetauid +
  + +
+ +

5.11.21.1 Bindings für Psetauid

+ + + + + + +
C: int16_t Psetauid ( int16_t id ); +
  +
Assembler: +
  +
move.w    id,-(sp)     ; Offset 2
+move.w    #326,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

5.11.22 Psetegid

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Psetegid« - sets the effective group id for the calling +process. +
  +
Gemdosnummer: 324 (0x0144) +
  +
Deklaration: int32_t Psetegid ( int16_t egid ); +
  +
Beschreibung: egid specifies the new effective group id for the +calling process. +
  +
Prior to MiNT version 1.12 this call contained a bug affecting +its functionality. Setting effective group id needs root privileges. +
  +
This call is often used by daemon processes to downgrade their +privileges to user level. +
  +
Ergebnis: Returns new egid on success or a negative GEMDOS error code +otherwise. +
  +
Verfügbar: MiNT 1.11 +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Pseteuid   Psetgid   Psetregid +
  + +
+ +

5.11.22.1 Bindings für Psetegid

+ + + + + + +
C: int32_t Psetegid ( int16_t egid ); +
  +
Assembler: +
  +
move.w    egid,-(sp)   ; Offset 2
+move.w    #324,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

5.11.23 Pseteuid

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pseteuid« - sets the effective user id for the calling +process. +
  +
Gemdosnummer: 323 (0x0143) +
  +
Deklaration: int32_t Pseteuid ( int16_t euid ); +
  +
Beschreibung: euid specifies the new effective user id for the +calling process. +
  +
Prior to MiNT version 1.12 this call contained a bug affecting +its functionality. Setting effective user id needs root privileges. +
  +
This call is often used by daemon processes to downgrade their +privileges to user level. +
  +
Ergebnis: Returns new euid on success or a negative GEMDOS error code +otherwise. +
  +
Verfügbar: ab MiNT 1.11 +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Psetegid   Psetuid   Psetreuid +
  + +
+ +

5.11.23.1 Bindings für Pseteuid

+ + + + + + +
C: int32_t Pseteuid ( int16_t euid ); +
  +
Assembler: +
  +
move.w    euid,-(sp)   ; Offset 2
+move.w    #323,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

5.11.24 Psetgid

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Psetgid« - Gruppen ID eines Prozesses verändern. +
  +
Gemdosnummer: 277 +
  +
Deklaration: int16_t Psetgid ( int16_t id ); +
  +
Beschreibung: Die Funktion setzt die Gruppen-ID des aktuellen Prozesses auf +id. Dies muß eine Zahl von 0 bis 255 sein. +
  +
Ergebnis: Die Funktion kann folgende Rückgabewerte liefern: +
  + + + + + + +
0-255 : kein Fehler aufgetreten (die neue ID). +
EACCDN: der Prozess hat keine Berechtigung, seine ID zu verändern. + +
+ +
Verfügbar: Seit der ersten in MultiTOS integrierten MiNT Version 1.04. +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Psetuid +
  + +
+ +

5.11.24.1 Bindings für Psetgid

+ + + + + + +
C: int16_t Psetgid ( int16_t id ); +
  +
Assembler: +
  +
move.w    id,-(sp)     ; Offset 2
+move.w    #277,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

5.11.25 Psetgroups

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Psetgroups« - sets the supplementary group ids for the +calling process. +
  +
Gemdosnummer: 328 (0x0148) +
  +
Deklaration: int32_t Psetgroups( int16_t len, int16_t *gidset); +
  +
Beschreibung: This function sets the supplementary group ids for the calling +process. +
  +
len specifies the length (in words) of the array +containing the supplementary group ids to be set. This value must be a +positive number not greater than NGROUPS_MAX. If len is a +zero, the call will return the number of supplementary group ids those +have been set. +
  +
gidset is a pointer to a word array containing the new +supplementary group ids for the process. +
  +
Setting new supplementary group ids needs root privileges. +
  +
The NGROUPS_MAX value is returned by Sysconf(). +
  +
Ergebnis: Returns a number of new supplementary group ids for the process +on success or a negative GEMDOS error code otherwise. +
  +
Verfügbar: Sie steht ab MiNT 1.11 zu Verfügung. +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Pgetgroups   Sysconf +
  + +
+ +

5.11.25.1 Bindings für Psetgroups

+ + + + + + +
C: int32_t Psetgroups( int16_t len, int16_t *gidset); +
  +
Assembler: +
  +
peam      gidset       ; Offset 4
+move.w    len,-(sp)    ; Offset 2
+move.w    #328,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #8,sp        ; Stack korrigieren
+
+ +
+ +

5.11.26 Psetlimit

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Psetlimit« - Limits der Systemresourcen setzen/erfragen. +
  +
Gemdosnummer: 287 +
  +
Deklaration: int32_t Psetlimit ( int16_t lim, int32_t value ); +
  +
Beschreibung: Die Funktion dient dem Setzen/Abfragen einer +Resourcenbegrenzung für den aktuellen Prozess. Der Parameter +lim bestimmt die gewünschte Resource-Art: +
  + + + + + + + + + + + + + + + +
lim Bedeutung +
    +
1 max. CPU-Zeit für den Prozess (Millisekunden) +
2 max. Gesamtspeicher des Prozesses in Bytes +
3 max. allozierbarer Speicher für den Prozess (in Bytes). + +
+ +
Der Unterschied zwischen 2 und 3 besteht darin, daß der +Gesamtspeicher auch die TEXT-, DATA- und BSS-Segmente des Prozesses +umfaßt. +
  +
Mit Hilfe dieser Funktion werden die Resource-Begrenzungen +sowohl für den aktuellen Prozess, als auch für alle später +erzeugten Childs einzeln eingestellt. Wenn ein Prozess also ein +CPU-Limit einstellt, und danach mehrere Child-Prozesse erzeugt, dann +gilt dieses CPU-Limit auch für jeden einzelnen Child, und nicht etwa +für alle Childs zusammen. +
  +
Der Parameter value bestimmt den Wert, den eine Resource +annehmen soll. Ein Wert von 0 bedeutet in diesem Zusammenhang, daß +die Resource unbegrenzt ist. Ein negativer Wert läßt die Resource +unverändert. +
  +
Hinweis: Es gibt keine Restriktionen beim Vergrößern +der Begrenzungen. Jeder Prozess kann jede seiner Begrenzungen beliebig +verändern oder sogar auf unbegrenzt setzen. +
  +
Speicherbegrenzungen kommen bei Pexec nicht zur Anwendung. Ist +z.B. ein Prozess auf 256Kbyte begrenzt, kann er dennoch mit Pexec +einen Tochterprozess starten, der mehr Speicher verbraucht. +Achtung: Dies gilt nicht in MagiC; hier werden +Speicherbegrenzungen bei Pexec vererbt! +
  +
Speicherbegrenzungen sind nicht rückwirkend gültig. Besitzt +ein Prozess z.B. 256Kbyte und ruft dann Psetlimit auf, um seinen +Bedarf auf 128Kbyte zu reduzieren, dann wird er zwar nicht beendet, +aber er kann keinen Speicher mehr allozieren, bis seine Größe unter +die angegebenen 128Kbyte fällt. +
  +
Begrenzungen der CPU-Zeit wirken hingegen rückwirkend. +Verkürzt ein Prozess seine CPU-Zeit unter den bisher gültigen Wert, +dann empfängt er sofort ein SIGXCPU-Signal. +
  +
Achtung: Ungültige Funktionsnummern und solche, die von +MagiC nicht unterstützt werden, liefern EINVFN. +
  +
Hinweis zu MagiC: Ist ein Programm mit dem +Dienstprogramm LIMITMEM modifiziert worden, hat diese Einstellung +Vorrang vor dem Speicherlimit des aufrufenden Prozesses. Psetlimit +wird vom erweiterten shel_write()-Modus unterstützt; damit können +speicherbeschränkte Applikationen auch parallel gestartet werden. +
  +
Ergebnis: Die Funktion liefert den alten Begrenzungswert zurück. +
  +
Verfügbar: MagiC ab Version 4.0 (17.09.1996) und ab der ersten in MultiTOS +integrierten MiNT Version 1.04. +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Prusage   Signale +
  + +
+ +

5.11.26.1 Bindings für Psetlimit

+ + + + + + +
C: int32_t Psetlimit ( int16_t lim, int32_t value ); +
  +
Assembler: +
  +
move.l    value,-(sp)  ; Offset 4
+move.w    lim,-(sp)    ; Offset 2
+move.w    #287,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #8,sp        ; Stack korrigieren
+
+ +
+ +

5.11.27 Psetpgrp

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Psetpgrp« - Prozess Gruppennummer eines Prozesses +setzen/ermitteln. +
  +
Gemdosnummer: 270 +
  +
Deklaration: int16_t Psetpgrp ( int16_t pid, int16_t newgrp ); +
  +
Beschreibung: Die Funktion verändert die Gruppennummer des Prozesses mit der +Kennung pid auf den Wert newgrp, oder gibt den +Gruppennummer zurück, wenn newgrp negativ ist. Der Prozess +muß die gleiche UID wie der aktuelle Prozess besitzen, oder dessen +Parent sein. +
  +
Falls pid = 0 ist, wird die Prozessgruppe des aktuellen +Prozesses gesetzt. Falls newgrp = 0 ist, wird die +Prozessgruppe auf den Wert der PID des aktuellen Prozesses gesetzt. +
  +
Ergebnis: Die Funktion kann folgende Rückgabewerte liefern: +
  + + + + + + + + + +
>= 0  : kein Fehler (neue oder aktuelle Prozessgruppen-Nummer). +
EFILNF: der Prozess pid existiert nicht. +
EACCDN: der Prozess pid besitzt eine andere UID, und ist kein +Child des aufrufenden Prozesses. + +
+ +
Verfügbar: Seit der ersten in MultiTOS integrierten MiNT Version 1.04. +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Pkill   Pgetpgrp   Pgetpid +
  + +
+ +

5.11.27.1 Bindings für Psetpgrp

+ + + + + + +
C: int16_t Psetpgrp ( int16_t pid, int16_t newgrp ); +
  +
Assembler: +
  +
move.w    newgrp,-(sp)  ; Offset 4
+move.w    pid,-(sp)     ; Offset 2
+move.w    #270,-(sp)    ; Offset 0
+trap      #1            ; GEMDOS aufrufen
+addq.l    #6,sp         ; Stack korrigieren
+
+ +
+ +

5.11.28 Psetpriority

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Psetpriority« - sets the current priority value for a +process. +
  +
Gemdosnummer: 345 (0x0159) +
  +
Deklaration: int32_t Psetpriority ( int16_t which, int16_t who, int16_t pri +); +
  +
Beschreibung: This function sets the priority pri (not an increment +but an absolute value) for the processes specified by which +and who. The interpretation of parameter who depends +on which: +
  +
PRIO_PROCESS (0) sets the priority of process with process id +who. A who of 0 implies the process id of the calling +process. +
  +
PRIO_PGRP (1) sets the priority of the process group with +process group id who. A who of 0 implies the process +group id of the calling process. +
  +
PRIO_USER (2) sets the priority of the process of the user with +user id who. A who of 0 implies the user id of the +calling process. +
  + + +
The pri argument is silently changed to the maximum +(resp. minimum) possible value if it is not in the range between +PRIO_MIN (-20) and PRIO_MAX (+20). +
  +
This call makes calls Pnice and Prenice obsolete. +
  +
Ergebnis: The function returns E_OK on success or a negative error code +otherwise. The following error conditions are defined: +
  +
EINVAL, invalid argument for who, which or +pri. +
  +
EACCES, the calling process is not an owner of one or more of +the selected processes. The other selected processes are still +affected. EPERM, the calling process does not have privileges to +change the priority of one or more of the selected processes. This can +only happen if an attempt was made to change the priority of a process +to a positive value. +
  +
ESRCH, the combination of which and who does not +match any existing process. +
  +
The error condition reported is the last error condition +encountered (in other words if both EACCES and EPERM occur the return +value is arbitrary). +
  +
Verfügbar: ab MiNT 1.15.0 +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Pgetpriority +
  + +
+ +

5.11.28.1 Bindings für Psetpriority

+ + + + + + +
C: int32_t Psetpriority ( int16_t which, int16_t who, int16_t pri +); +
  +
Assembler: +
  +
move.w    pri,-(sp)    ; Offset 6
+move.w    who,-(sp)    ; Offset 4
+move.w    which,-(sp)  ; Offset 2
+move.w    #345,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #8,sp        ; Stack korrigieren
+
+ +
+ +

5.11.29 Psetregid

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Psetregid« - sets the real and/or effective group id for the +calling process. +
  +
Gemdosnummer: 335 (0x014f) +
  +
Deklaration: int32_t Psetregid ( int16_t rgid, int16_t egid); +
  +
Beschreibung: This function sets the real and/or effective group id for the +calling process. +
  +
rgid specifies the new real group id and egid +specifies the new effective group id for the calling process. If +either argument is -1, only the other gets changed +
  +
Setting group ids needs root privileges. +
  +
This call is often used by daemon processes to downgrade their +privileges to user level. +
  +
Ergebnis: Returns E_OK on success or a negative error code otherwise. +
  +
Verfügbar: since MiNT 1.12 +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Psetreuid   Psetegid +
  + +
+ +

5.11.29.1 Bindings für Psetregid

+ + + + + + +
C: int32_t Psetregid ( int16_t rgid, int16_t egid); +
  +
Assembler: +
  +
move.w    egid,-(sp)   ; Offset 4
+move.w    rgid,-(sp)   ; Offset 2
+move.w    #335,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

5.11.30 Psetreuid

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Psetreuid« - sets the real and/or effective user id for the +calling process. +
  +
Gemdosnummer: 334 (0x014e) +
  +
Deklaration: int32_t Psetreuid ( int16_t ruid, int16_t euid); +
  +
Beschreibung: This function sets the real and/or effective user id for the +calling process. +
  +
ruid specifies the new real user id and euid +specifies the new effective user id for the calling process. If either +argument is -1, only the other gets changed. +
  +
Setting user ids needs root privileges. +
  +
This call is often used by daemon processes to downgrade their +privileges to user level. +
  +
Ergebnis: Returns E_OK on success or a negative GEMDOS error code +otherwise. +
  +
Verfügbar: since MiNT 1.12 +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Psetregid   Pseteuid +
  + +
+ +

5.11.30.1 Bindings für Psetreuid

+ + + + + + +
C: int32_t Psetreuid ( int16_t ruid, int16_t euid); +
  +
Assembler: +
  +
move.w    euid,-(sp)   ; Offset 4
+move.w    ruid,-(sp)   ; Offset 2
+move.w    #334,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

5.11.31 Psetuid

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Psetuid« - User ID eines Prozesses verändern. +
  +
Gemdosnummer: 272 +
  +
Deklaration: int16_t Psetuid ( int16_t id ); +
  +
Beschreibung: Die Funktion setzt die User ID des aktuellen Prozesses auf +id. Dies muß eine Zahl von 0 bis 255 sein. Die Funktion +schlägt fehl, wenn die User-ID des Prozesses nicht den Wert 0 +besitzt, d.h. einmal gesetzt, kann die User-ID nicht mehr verändert +werden. +
  +
Ergebnis: Die Funktion kann folgende Rückgabewerte liefern: +
  + + + + + + +
0-255 : kein Fehler aufgetreten (die neue ID). +
EACCDN: der Prozess hat keine Berechtigung, seine ID zu verändern. + +
+ +
Verfügbar: Seit der ersten in MultiTOS integrierten MiNT Version 1.04. +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Psetgid +
  + +
+ +

5.11.31.1 Bindings für Psetuid

+ + + + + + +
C: int16_t Psetuid ( int16_t id ); +
  +
Assembler: +
  +
move.w    id,-(sp)     ; Offset 2
+move.w    #272,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

5.11.32 Psigaction

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Psigaction« - Art der Signalbehandlung verändern. +
  +
Gemdosnummer: 311 +
  +
Deklaration: int32_t Psigaction ( int16_t sig, struct sigaction *act, struct +sigaction *oact ); +
  +
Beschreibung: Die Funktion ändert die Art und Weise, wie auf das Signal +sig reagiert werden soll. Der Parameter act ist dabei +entweder NULL, oder zeigt auf eine sigaction-Struktur, die das +Verhalten des Signal-Handlings beschreibt. Für die Komponente +sa_handler gilt dabei: +
  + + + + + + + + + + + + +
sa_handler Bedeutung +
    +
0 beim Eintreffen des Signals wird die Default-Aktion für das +Signal ausgeführt. +
1 das Signal sig wird ignoriert. Liegt es gerade an, so +wird es gelöscht. + +
+ +
Jeder andere Wert von sa_handler wird als die Adresse +einer Funktion interpretiert, die beim Auftreten des Signals +aufgerufen wird. Über den Stack wird dieser Funktion ein Long-Wert +übergeben, der der jeweiligen Signalnummer entspricht. Auf diese Art +und Weise ist es möglich, den Signal-Handler für mehrere Signale zu +benutzen. +
  +
Solange ein Signal bearbeitet wird, kann es nicht erneut +gesendet werden. Zu beachten ist ferner, daß (im Gegensatz zu einigen +Unix-Versionen) das Signal-Handling vor der Ausführung des Handlers +nicht auf den Default-Handler zurückgesetzt wird. +
  +
Der Signalhandler muß entweder mit RTS (Return to Sender) +beendet werden, oder Psigreturn aufrufen, um anzuzeigen, daß die +Signalbehandlung abgeschlossen ist. Anschließend wird die Blockierung +des Signals aufgehoben. Psigreturn führt zusätzlich einige interne +Säuberungen des Kernels durch, die notwendig sind, falls der +Signal-Handler nicht beendet wird (longjump). +
  +
Signalhandler können beliebige BIOS, XBIOS und GEMDOS Aufrufe +machen. AES- oder VDI-Aufrufe sind hingegen nicht gestattet. Dies gilt +jedoch nicht in MagiC; hier gibt es einige Unterschiede zu beachten. +
  +
Ein Aufruf von Psigaction hat den Nebeneffekt, daß das Signal +demaskiert (d.h. freigegeben) wird. So kann ein Prozess beim +Abarbeiten eines Signals dieses zurücksetzen und es sich erneut +zusenden, um sich beispielsweise selbst zu suspendieren, während ein +Signal für Job-Control bearbeitet wird. Die Signalbearbeitung ist +gegenüber Pfork/Pvfork abgesichert. +
  +
Signale, die von einem Prozess ignoriert werden, werden auch vom +Child nach einem Pexec-Aufruf ignoriert. Außerdem werden Signale, die +von einem Signal-Handler abgefangen werden, im Child-Prozess auf den +Defaultwert zurückgesetzt. +
  +
Die Komponente sa_flags der sigaction-Struktur definiert +ein zusätzliches, Signal-spezifisches Verhalten. Wenn sig das +Signal SIGCHLD ist, und in sa_flags das SA_NOCLDSTOP Bit +gesetzt ist, wird SIGCHLD dem Prozess nur dann gesendet, wenn einer +seiner Childs terminiert (und eben nicht dann, wenn ein Child durch +ein Job-Control-Signal suspendiert wird). +
  +
Ergebnis: Die Funktion kann folgende Rückgabewerte liefern: +
  + + + + + + + + + +
E_OK  : kein Fehler aufgetreten. +
EACCDN: Signal kann vom Benutzer nicht abgefangen werden. +
ERANGE: sig ist kein gültiges Signal. + +
+ +
Verfügbar: Verfügbar, wenn ein 'MiNT' Cookie mit einer Versionsnummer von +mindestens 0.95 existiert und in MagiC ab Version 4.50. +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Pkill   Psigblock   Psignal   Psigreturn   Signale +
  + +
+ +

5.11.32.1 Bindings für Psigaction

+ + + + + + +
C: int32_t Psigaction ( int16_t sig, struct sigaction *act, struct +sigaction *oact ); +
  +
Assembler: +
  +
pea       oact         ; Offset 8
+pea       act          ; Offset 4
+move.w    sig,-(sp)    ; Offset 2
+move.w    #311,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+lea       $C(sp),sp    ; Stack korrigieren
+
+ +
+ +

5.11.33 Psigblock

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Psigblock« - Signalmaske verändern. +
  +
Gemdosnummer: 278 +
  +
Deklaration: int32_t Psigblock ( int32_t mask ); +
  +
Beschreibung: Die Funktion Psigblock blockiert den Empfang ausgewählter +Signale. Sie fügt die in mask angegebenen Signale der Menge +der aktuell blockierenden Signale hinzu. Dabei repräsentiert jedes Bit +des Parameters mask ein Signal. Wenn Bit n in mask +gesetzt ist, bedeutet dies, daß das Signal mit der Nummer n blockiert +wird. +
  +
Zu beachten ist, daß manche Signale (z.B. SIGKILL) nicht +blockiert werden können. Der Kernel wird diese Signale aus +mask löschen, bevor die jeweilige Änderung der Signalmengen +vorgenommen wird. +
  +
Ferner sei darauf hingewiesen, daß blockierte Signale auch über +Pfork/Pvfork Aufrufe hinweg blockiert bleiben. Nach einem Pexec-Aufruf +startet der Child stets mit einer leeren Menge zu blockierender +Signale, unabhängig davon, welche Signale vom Parent blockiert wurden. +
  +
Achtung: Diese Funktion ist optional, daher darf ein +Aufruf mit EINVFN beantwortet werden. +
  +
Ergebnis: Die Funktion liefert die Menge der blockierten Signale zurück, +die vor dem Aufruf gültig waren. Über einen Aufruf von Psigsetmask kann +so die alte Menge wieder hergestellt werden. +
  +
Verfügbar: Seit der ersten in MultiTOS integrierten MiNT Version 1.04 und +sie steht in MagiC ab Version 4.50 zur Verfügung. +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Psigsetmask   Signale +
  + +
+ +

5.11.33.1 Bindings für Psigblock

+ + + + + + +
C: int32_t Psigblock ( int32_t mask ); +
  +
Assembler: +
  +
move.l    mask,-(sp)   ; Offset 2
+move.w    #278,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

5.11.34 Psigintr

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Psigintr« - assigns a signal to a particular exception +vector. +
  +
Gemdosnummer: 318 (0x013e) +
  +
Deklaration: int32_t Psigintr ( int16_t vec, int16_t sig ); +
  +
Beschreibung: This function assigns a signal to a particular exception +vector. When the exception occurs, the kernel will send the signal to +the process. +
  +
vec specifies the exception vector. This is the same +value as specified for Setexc() call. sig specifies the signal +number that is supposed to be delivered when an exception assigned to +the vector vec occurs. When both sig and vec +are zero, all handlers installed by your program are removed. +
  +
You should install a signal handler prior to making this call, +otherwise your process will most probably get killed by the first +occurrence of the interrupt assigned to vec vector. +
Also notice that the function is not available on machines +equipped with 68000 and 68010 processors. +
  +
This function has been totally rewritten as of MiNT version +1.15.1. However, the only change visible to programs is that the old +value of vec is no longer returned (it had little use anyway). Also, +since long stack frames are needed, a 68020 or newer processor is +required. +
  +
The handler set up by Psigintr gets removed when your process +terminates. +
  +
Ergebnis: Returns E_OK on success, or a negative GEMDOS error code +otherwise: +
  + + + + + + + + + + + + +
EBADARG: A signal or vector number was specified outside the allowed +range. Only autovectors ($60-$7c), traps ($80-$bc) and user defined +interrupts 0100-$03fc) are allowed (other interrupts already generate +fixed signals). +
ENOMEM: The kernel ran out of memory while trying to allocate RAM for +internal structures needed by this call. +
ENXIO: The interrupt you want to register has no service routine +installed. +
ENOSYS: The function is not available (wrong architecture). + +
+ +
Verfügbar: When a 'MiNT' cookie with a version of at least 1.11 exists. As +of MiNT version 1.15.1 this call is available only on machines +equipped with 68020 processor or newer. +
  +
This function has been disabled as of FreeMiNT 1.16. +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Pause   Pkill   Psigsetmask   Psignal   Signale +
  + +
+ +

5.11.34.1 Bindings für Psigintr

+ + + + + + +
C: int32_t Psigintr ( int16_t vec, int16_t sig ); +
  +
Assembler: +
  +
move.w    sig,-(sp)    ; Offset 4
+move.w    vec,-(sp)    ; Offset 2
+move.w    #318,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

5.11.35 Psignal

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Psignal« - Art der Signalbehandlung verändern. +
  +
Gemdosnummer: 274 +
  +
Deklaration: int32_t Psignal ( int16_t sig, int32_t handler ); +
  +
Beschreibung: Die Funktion ändert die Art und Weise, wie auf das Signal +sig reagiert werden soll. Der Parameter handler kann 3 +verschiedene Werte annehmen: +
  + + + + + + + + + + + + +
handler Bedeutung +
    +
0 Das Signal wird mit der Default-Aktion beantwortet. +
1 Das Signal wird ignoriert. Liegt es gerade an, so wird es +gelöscht. + +
+ +
Jeder andere Wert wird als die Adresse einer Benutzerfunktion +interpretiert, die beim Auftreten des Signals sig aufgerufen +wird. Dieser Funktion wird (über den Stack) ein Long-Wert übergeben, +welcher der Signalnummer entspricht. Auf diese Art ist es möglich, +den Signal-Handler für mehrere Signale zu benutzen. +
  +
Solange ein Signal bearbeitet wird, kann es nicht erneut +gesendet werden. Zu beachten ist ferner, daß (im Gegensatz zu einigen +Unix-Versionen) das Signal-Handling vor der Ausführung des Handlers +nicht auf den Default-Handler zurückgesetzt wird. +
  +
Der Signalhandler muß entweder mit RTS (Return to Sender) +beendet werden, oder Psigreturn aufrufen, um anzuzeigen, daß die +Signalbehandlung abgeschlossen ist. Anschließend wird die Blockierung +des Signals aufgehoben. Psigreturn führt zusätzlich einige interne +Säuberungen des Kernels durch, die notwendig sind, falls der +Signal-Handler nicht beendet wird (longjump). +
  +
Signalhandler können beliebige BIOS, XBIOS und GEMDOS Aufrufe +machen. AES- oder VDI-Aufrufe sind hingegen nicht gestattet. Dies gilt +jedoch nicht in MagiC; hier gibt es einige Unterschiede zu beachten. +
  +
Ein Aufruf von Psignal hat den Nebeneffekt, daß das Signal +demaskiert (d.h. freigegeben) wird. So kann ein Prozess beim +Abarbeiten eines Signals dieses zurücksetzen und es sich erneut +zusenden, um sich beispielsweise selbst zu suspendieren, während ein +Signal für Job-Control bearbeitet wird. Die Signalbearbeitung ist +gegenüber Pfork/Pvfork abgesichert. +
  +
Signale, die von einem Prozess ignoriert werden, werden auch vom +Child nach einem Pexec-Aufruf ignoriert. Außerdem werden Signale, die +von einem Signal-Handler abgefangen werden, im Child-Prozess auf den +Defaultwert zurückgesetzt. +
  +
Ergebnis: Die Funktion liefert den alten Wert des Signal-Handlers +zurück. Dies ist entweder 0, 1 oder die Adresse des Handlers. +
  +
Im Fehlerfall werden folgende Werte zurückgeliefert: +
  + + + + + + +
EACCDN: das Signal kann nicht abgefangen werden. +
ERANGE: sig ist kein gültiges Signal. + +
+ +
Verfügbar: Seit der ersten in MultiTOS integrierten MiNT Version 1.04 und +in MagiC ab der Version 4.50. +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Pkill   Psigaction   Psigblock   Psigreturn   Signale +
  + +
+ +

5.11.35.1 Bindings für Psignal

+ + + + + + +
C: int32_t Psignal ( int16_t sig, int32_t handler ); +
  +
Assembler: +
  +
move.l    handler,-(sp)  ; Offset 4
+move.w    sig,-(sp)      ; Offset 2
+move.w    #274,-(sp)     ; Offset 0
+trap      #1             ; GEMDOS aufrufen
+addq.l    #8,sp          ; Stack korrigieren
+
+ +
+ +

5.11.36 Psigpause

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Psigpause« - Prozess bis zum Eintreffen eines Signals +suspendieren. +
  +
Gemdosnummer: 310 +
  +
Deklaration: void Psigpause ( int32_t mask ); +
  +
Beschreibung: Die Funktion setzt die neue Signalmaske mask, und +suspendiert den aufrufenden Prozess, bis ein Signal eintrifft, welches +nicht maskiert ist oder ignoriert wird. +
  +
Falls per Psignal für dieses Signal ein Handler installiert +wurde, wird dieser aufgerufen, bevor die Funktion zurückkehrt. Falls +der Handler einen longjump in einen anderen Programmteil ausführt +oder der Prozess terminiert, wird die Funktion niemals zurückkehren. +
  +
Hinweis: Wenn die Funktion zurückkehrt, wird die +Signalmaske auf den Wert zurückgesetzt, der vor dem Aufruf von +Psigpause gültig war. Die von der Funktion gesetzte Signalmaske ist +also nur temporär gültig. In MagiC kann es Probleme geben wenn +mehrere Threads gleichzeitig diese Funktion aufrufen, da die +Signalmaske hier prozessglobal ist. +
  +
Ergebnis: Die Funktion liefert immer 0 zurück. +
  +
Verfügbar: Verfügbar, wenn ein 'MiNT' Cookie mit einer Versionsnummer von +mindestens 0.95 existiert und in MagiC ab Version 4.50. +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Pause   Psigblock   Psignal   Psigsetmask   Signale +
  + +
+ +

5.11.36.1 Bindings für Psigpause

+ + + + + + +
C: void Psigpause ( int32_t mask ); +
  +
Assembler: +
  +
move.w    mask,-(sp)   ; Offset 2
+move.w    #310,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

5.11.37 Psigpending

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Psigpending« - feststellen welche Signale abgeschickt, aber +nicht bearbeitet wurden. +
  +
Gemdosnummer: 291 +
  +
Deklaration: int32_t Psigpending ( void ); +
  +
Beschreibung: Die Funktion liefert die Signale, die dem aufrufenden Prozess +zwar gesendet, aber nicht bearbeitet wurden. (z.B. weil sie per +Psigblock blockiert sind oder weil sie gerade in Bearbeitung sind). +
  +
Ergebnis: Die Funktion liefert die gewünschten Signale als Bitmaske in +einem LONG zurück, für jedes gesetzte Bit n steht das Signal +n zum Bearbeiten an. +
  +
Verfügbar: Seit der ersten in MultiTOS integrierten MiNT Version 1.04 und +in MagiC ab der Version 4.50. +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Psigblock   Psignal   Psigsetmask   Signale +
  + +
+ +

5.11.37.1 Bindings für Psigpending

+ + + + + + +
C: int32_t Psigpending ( void ); +
  +
Assembler: +
  +
move.w    #291,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

5.11.38 Psigreturn

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Psigreturn« - Verlassen eines Signal Handlers. +
  +
Gemdosnummer: 282 +
  +
Deklaration: void Psigreturn ( void ); +
  +
Beschreibung: Die Funktion bereitet das Verlassen eines Signal-Handlers vor. +Da dies automatisch geschieht wenn der Handler zurückkehrt, ist ein +Aufruf von Psigreturn nur notwendig, falls der Handler einen +nicht-lokalen Sprung durchführt (etwa per longjump). +
  +
Der Aufruf hat keine Wirkung, wenn z.Zt. kein Signal bearbeitet +wird. +
  +
In MagiC wird der Thread der aktiven Signalbehandlung zum +Haupt-Thread des Prozesses und anschließend entfernt. Alle anderen +Signalbehandlungen werden ebenfalls entfernt (Verschachtelung). Die +gesperrten Semaphoren des Haupt-Thread werden freigegeben, der +Supervisor-Stack wird auf den Wert bei Prozeßstart zurückgesetzt. +
  +
Ergebnis: Die Funktion besitzt unter MiNT/MultiTOS kein direktes +Ergebnis; in MagiC wird der Wert EACCDN zurückgeliefert falls der +Aufrufer keine Signalbehandlungsroutine ist, und anderenfalls +der Wert E_OK. +
  +
Verfügbar: Seit der ersten in MultiTOS integrierten MiNT Version 1.04 und +MagiC ab der Version 4.50. +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Psignal   Signale   Signalhandler in MagiC +
  + +
+ +

5.11.38.1 Bindings für Psigreturn

+ + + + + + +
C: void Psigreturn ( void ); +
int32_t Psigreturn ( void ); +
  +
Assembler: +
  +
move.w    #282,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

5.11.39 Psigsetmask

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Psigsetmask« - Signalmaske ersetzen. +
  +
Gemdosnummer: 279 +
  +
Deklaration: int32_t Psigsetmask ( int32_t mask ); +
  +
Beschreibung: Die Funktion ersetzt die Menge der aktuell zu blockierenden +Signale vollständig durch die im Parameter mask +spezifizierten Signale. +
  +
Zu beachten ist, daß manche Signale (z.B. SIGKILL) nicht +blockiert werden können. Der Kernel wird diese Signale aus +mask löschen, bevor die jeweilige Änderung der Signalmengen +vorgenommen wird. +
  +
Ferner sei darauf hingewiesen, daß blockierte Signale auch +über Pfork/Pvfork Aufrufe hinweg blockiert bleiben. Nach einem +Pexec-Aufruf startet der Child stets mit einer leeren Menge zu +blockierender Signale, unabhängig davon, welche Signale vom Parent +blockiert wurden. +
  +
Ergebnis: Die Funktion liefert die Menge der blockierten Signale zurück, +die vor dem Aufruf gültig waren. +
  +
Verfügbar: Seit der ersten in MultiTOS integrierten MiNT Version 1.04 und +in MagiC ab der Version 4.50. +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Psigblock   Signale   Signalhandler in MagiC +
  + +
+ +

5.11.39.1 Bindings für Psigsetmask

+ + + + + + +
C: int32_t Psigsetmask ( int32_t mask ); +
  +
Assembler: +
  +
move.l    mask,-(sp)   ; Offset 2
+move.w    #279,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

5.11.40 Psysctl

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Psysctl« - Get or set system information. +
  +
Gemdosnummer: 350 (0x015e) +
  +
Deklaration: int32_t Psysctl ( int32_t *name, uint32_t namelen, void *old, +uint32_t *oldlenp, void *new, uint32_t newlen ); +
  +
Beschreibung: The function Psysctl retrieves system information and allows +processes with appropriate privileges to set system information. The +system information may be an integer, a string or a structure. +
  +
name and namelen specify the system information +to retrieve. name is an array of longwords which defines a +path to the actual value. The first longword holds the top level name, +the second longword is the second level name... namelen is the +size of this array. +
  +
The information is copied into the buffer specified by +old and oldlenp. +
  +
Before the call, oldlenp points to a long specifiying +the size of the buffer. After the call, this long word is set to the +amount of copied data. +
  +
If both old and oldlenp are set to NULL, the old +value is not returned. +
  +
If only old is set to NULL, oldlenp will be set +to the amount of available data. +
  +
To set a new value, new is set to a pointer to a buffer +of lenght newlen. Otherwise, new should be set to NULL +and newlen set to 0. +
  +
The top level names are defined with the following CTL_ prefix. +
  + +
CTL_KERN (1): Kernel +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KERN_OSTYPE=1 (string) System version +
KERN_OSRELEASE=2 (string) System release +
KERN_OSREV=3 (integer) System revision +
KERN_VERSION=4 (string) Compile time information +
KERN_HOSTNAME=5 (string) Hostname +
KERN_DOMAINNAME=6 (string) (YP) Domainname +
KERN_SECURELVL=7 (integer) System security level +
KERN_MAXPROC=8 (integer) Max processes +
KERN_MAXFILES=9 (integer) Max open files +
KERN_NGROUPS=10 (integer) Number of supplemental group IDs +
KERN_IOV_MAX=11 (integer) Max iovec's for readv(2) etc. +
KERN_LOGIN_NAME_MAX=12 (integer) Max length login name + NUL +
KERN_BOOTTIME=13 (struct timeval) Time kernel was booted +
KERN_INITIALTPA=14 (integer) Max TPA size of a process +
KERN_SYSDIR=15 (string) The system directory + +
+ + +
CTL_HW (2): Generic CPU/IO +
  + + + + + + + + + + + + + + + + + + + + + +
HW_MACHINE=1 (string) Machine class +
HW_MACHINE_ARCH=2 (string) Machine architecture +
HW_MODEL=3 (string) Specific machine model +
HW_NCPU=4 (integer) Number of CPUs +
HW_BYTEORDER=5 (integer) Machine byte order +
HW_PAGESIZE=6 (integer) Software page size +
HW_FREEPHYSMEM=7 (integer) Free physical memory + +
+ + +
CTL_MACHDEP (3): Machine dependent (not yet implemented) +
  + +
CTL_DEBUG (4): Debugging parameters (not yet +implemented) +
  + +
CTL_PROC (5): Per-proc attributes +
The second level name specifies the process ID (PROC_CURPROC or +any PID), the third level name specifies the system information +(PROC_PID_DEBUG). +
  + + + + + + +
PROC_CURPROC=0x7fffffff (2^31-1) (integer) Select the current process +
Other value (integer) ID of specified process + + + +
PROC_PID_DEBUG=1 (integer) Process debug level + +
+ + +
+ + +
CTL_KBD (6): Keyboard configuration +
  + + + + + + + + + +
KBD_PC_STYLE_CAPS=1 (integer) CAPS key operate in PC style mode +
KBD_MOUSE_PIXELS=2 (integer) Keyboard mouse movement pixels +
KBD_PIXELS_FINE=3 (integer) Keyboard mouse movement pixels 'fine' + +
+ +
Ergebnis: Die Funktion kann folgende Rückgabewerte liefern: +
  + + + + + + + + + + + + + + + + + + + + + +
E_OK  : No error has arisen +
ENOMEM : The amount of data available is greater than the size of the +buffer supplied +
EACCDN: An attempt was made to change a read-only value or was made by +a process with insufficient privilege +
ERANGE: The name array was less than two or greater than +CTL_MAXNAME +
ENOTDIR: name specifies an intermediate rather than terminal +name +
EOPNOTSUPP: name not found +
ESRCH Process not found + +
+ +
Verfügbar: Siesteht ab FreeMiNT 1.15.12 zur Verfügung. +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Sysconf +
  + +
+ +

5.11.40.1 Bindings für Psysctl

+ + + + + + +
C: int32_t Psysctl ( int32_t *name, uint32_t namelen, void *old, +uint32_ *oldlenp, void *new, uint32_t newlen ); +
  +
Assembler: +
  +
move.l    newlen,-(sp)   ; Offset 22
+pea       new,-(sp)      ; Offset 18
+pea       oldlenp,-(sp)  ; Offset 14
+pea       old,-(sp)      ; Offset 10
+move.l    namelen,-(sp)  ; Offset 6
+pea       name,-(sp)     ; Offset 2
+move.w    #350,-(sp)     ; Offset 0
+trap      #1             ; GEMDOS aufrufen
+lea       $1A(sp),sp     ; Stack korrigieren
+
+ +
+ +

5.11.41 Pterm

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »process termination« - beendet ein TOS-Programm. +
  +
Gemdosnummer: 76 +
  +
Deklaration: void Pterm ( uint16_t retcode ); +
  +
Beschreibung: Die GEMDOS-Routine Pterm beendet den laufenden Prozess, und +entfernt diesen aus dem Speicher. Es gilt: +
  + + + + + + + + + +
Parameter Bedeutung +
    +
retcode Status, der an das aufrufende Programm zurückgegeben wird. + + + + + + + + + + + + + + + +
-32 = sollte nicht benutzt werden, da man diesen Wert bei per +Control-C abgebrochenen Programmen erhält. +
 -1 = sollte nicht benutzt werden, da dieser Wert ab GEMDOS 0.15 bei +einem Programmabsturz zurückgeliefert wird. +
  0 = kein Fehler aufgetreten +
  1 = allgemeiner Fehler +
  2 = Fehler in den Parametern + +
+ + +
+ +
Hinweis zu MagiC: Bevor irgendwelche Maßnahmen +ergriffen werden, wird über Setexc der Vektor etv_term ermittelt und +über diesen gesprungen. Anschließend wird der Prozeß ordentlich +abgeräumt (einschließlich VDI-Workstations, Informierung aller +XFSs über xfs_pterm, schließen aller geöffneten Dateien und +aktuellen Pfade und Löschen der Prozeßdatei im Verzeichnis U:\PROC). +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Pexec   Pterm0   Ptermres   XFS-Konzept in MagiC +
  + +
+ +

5.11.41.1 Bindings für Pterm

+ + + + + + +
C: void Pterm ( uint16_t retcode ); +
  +
Assembler: +
  +
move.w    retcode,-(sp)  ; Offset 2
+move.w    #76,-(sp)      ; Offset 0
+trap      #1             ; GEMDOS aufrufen
+addq.l    #4,sp          ; Stack korrigieren
+
+ +
+ +

5.11.42 Pterm0

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »process termination« - beendet ein TOS-Programm. +
  +
Gemdosnummer: 0 +
  +
Deklaration: void Pterm0 ( void ); +
  +
Beschreibung: Die GEMDOS-Routine Pterm0 beendet ein TOS-Programm und kehrt +nicht wieder zurück. Die Routine liefert den Return-Code 0 zurück. +
  +
Hinweis: In MagiC wird diese Funktion direkt als +Pterm(0) ausgeführt. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Pexec   Pterm   Ptermres +
  + +
+ +

5.11.42.1 Bindings für Pterm0

+ + + + + + +
C: void Pterm0 ( void ); +
  +
Assembler: +
  +
move.w    #0,-(sp)     ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

5.11.43 Ptermres

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »terminate and stay resident« - Programm beenden, aber im +Speicher behalten. +
  +
Gemdosnummer: 49 +
  +
Deklaration: void Ptermres ( int32_t keepcnt, int16_t retcode ); +
  +
Beschreibung: Die GEMDOS-Routine Ptermres beendet ein Programm, ein Teil der +TPA des Programms verbleibt jedoch intakt und der verbliebene Speicher +wird aus Speicherverwaltung des GEMDOS entfernt. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
keepcnt Anzahl der Bytes, die resident gehalten werden sollen (gilt ab +Anfang der Basepage und schließt die Länge des TEXT, DATA und BSS +Segments des Programms plus der Länge des Stacks ein; Minimum sind +128 Bytes). +
Achtung: Der nach diesem Aufruf verbliebene Speicher +kann später nicht freigegeben werden, da er komplett aus der +Speicherverwaltung des GEMDOS entfernt wurde. +
retcode Status, der an das aufrufende Programm zurückgegeben wird. + + + + + + + + + + + + + + + +
-32 = sollte nicht benutzt werden, da man diesen Wert bei per +Control-C abgebrochenen Programmen erhält. +
 -1 = sollte nicht benutzt werden, da dieser Wert ab GEMDOS 0.15 bei +einem Programmabsturz zurückgeliefert wird. +
  0 = kein Fehler aufgetreten +
  1 = allgemeiner Fehler +
  2 = Fehler in den Parametern + +
+ + +
+ +
Hinweis: Im Netzwerk werden alle Lockings des Prozesses +aufgehoben. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Alle GEMDOS Versionen. +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Pexec   Pterm   Pterm0 +
  + +
+ +

5.11.43.1 Bindings für Ptermres

+ + + + + + +
C: void Ptermres ( int32_t keepcnt, int16_t retcode ); +
  +
Assembler: +
  +
move.w    retcode,-(sp)  ; Offset 6
+move.l    keepcnt,-(sp)  ; Offset 2
+move.w    #49,-(sp)      ; Offset 0
+trap      #1             ; GEMDOS aufrufen
+addq.l    #8,sp          ; Stack korrigieren
+
+ +
+ +

5.11.44 Ptrace

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Ptrace« - process tracing and debugging +
  +
Gemdosnummer: 320 +
  +
Deklaration: int16_t Ptrace(int16_t request, int16_t pid, void * addr, +int32_t data) +
  +
Beschreibung: Ptrace provides tracing and debugging facilities. It allows one +process (the tracing process) to control another (the traced process). +Most of the time, the traced process runs normally, but when it +receives a signal (see sigaction(2)), it stops. The tracing process is +expected to notice this via wait(2) or the delivery of a SIGCHLD +signal, examine the state of the stopped process, and cause it to +terminate or continue as appropriate. Ptrace is the mechanism by which +all this happens. +
  +
The request argument specifies what operation is being +performed; the meaning of the rest of the arguments depends on the +operation, but except for one special case noted below, all ptrace +calls are made by the tracing process, and the pid argument specifies +the process ID of the traced process. request can be: +
  + + + + + + + + + + + + + + + + + + + + + + + + + +
PT_TRACE_ME (0) This request is the only one used by the traced process; it +declares that the process expects to be traced by its parent. All the +other arguments are ignored. (If the parent process does not expect to +trace the child, it will probably be rather confused by the results; +once the traced process stops, it cannot be made to continue except +via ptrace.) When a process has used this request and calls execve(2) +or any of the routines built on it (such as execv(3)), it will stop +before executing the first instruction of the new image. Also, any +setuid or setgid bits on the executable being executed will be +ignored. +
  + + +
PT_READ_I (1), PT_READ_D (2) +
These requests read a single int of data from the traced process' +address space. Traditionally, ptrace has allowed for machines with +distinct address spaces for instruction and data, which is why there +are two requests: conceptually, PT_READ_I reads from the instruction +space and PT_READ_D reads from the data space. In the current NetBSD +implementation, these two requests are completely identical. The addr +argument specifies the address (in the traced process' virtual address +space) at which the read is to be done. This address does not have to +meet any alignment constraints. The value read is returned as the +return value from ptrace. +
  + + +
PT_WRITE_I (4), PT_WRITE_D (5) +
These requests parallel PT_READ_I and PT_READ_D, except that they +write rather than read. The data argument supplies the value to be +written. +
  + +
PT_CONTINUE (7) The traced process continues execution. addr is an +address specifying the place where execution is to be resumed (a new +value for the program counter), or (caddr_t)1 to indicate that +execution is to pick up where it left off. data provides a +signal number to be delivered to the traced process as it resumes +execution, or 0 if no signal is to be sent. +
  + +
PT_KILL (8) The traced process terminates, as if PT_CONTINUE had been used +with SIGKILL given as the signal to be delivered. +
  + +
PT_ATTACH (9) This request allows a process to gain control of an otherwise +unrelated process and begin tracing it. It does not need any +cooperation from the to-be-traced process. In this case, pid specifies +the process ID of the to-be-traced process, and the other two +arguments are ignored. This request requires that the target process +must have the same real UID as the tracing process, and that it must +not be executing a setuid or setgid executable. (If the tracing +process is running as root, these restrictions do not apply.) The +tracing process will see the newly-traced process stop and may then +control it as if it had been traced all along. +
  +
Two other restrictions apply to all tracing processes, even +those running as root. First, no process may trace the process running +init(8). Second, if a process has its root directory set with +chroot(2), it may not trace another process unless that process's root +directory is at or below the tracing process's root. +
  + +
PT_DETACH (10) This request is like PT_CONTINUE, except that it does not allow +specifying an alternative place to continue execution, and after it +succeeds, the traced process is no longer traced and continues +execution normally. +
  + +
PT_SYSCALL (11) Continue and stop at next return from syscall. +
  + +
+ +
Additionally, machine-specific requests can exist. On the SPARC, +these are: +
  + + + + + + + + + + + + +
PT_GETREGS This request reads the traced process' machine registers into +the struct reg (defined in <machine/reg.h>) pointed to by addr. +
  +
PT_SETREGS This request is the converse of PT_GETREGS; it loads the traced +process' machine registers from the struct reg (defined in +<machine/reg.h>) pointed to by addr. +
  +
PT_GETFPREGS This request reads the traced process' floating-point registers +into the struct fpreg (defined in <machine/reg.h>) pointed to by +addr. +
  +
PT_SETFPREGS This request is the converse of PT_GETFPREGS; it loads the +traced process' floating-point registers from the struct fpreg +(defined in <machine/reg.h>) pointed to by addr. +
  + +
+ +
Ergebnis: Some requests can cause ptrace to return -1 as a non-error +value; to disambiguate, errno can be set to 0 before the call and +checked afterwards. The possible errors are: +
  + + + + + + + + + + + + +
ww No process having the specified process ID exists. +
  +
EINVAL +
  +
    +
  • A process attempted to use PT_ATTACH on itself. +
  • +
  • The request was not one of the legal requests. +
  • +
  • The signal number (in data) to PT_CONTINUE was neither +0 nor a legal signal number. +
  • +
  • PT_GETREGS, PT_SETREGS, PT_GETFPREGS, or PT_SETFPREGS was +attempted on a process with no valid register set. (This is normally +true only of system processes.) +
  • +
+ +
EBUSY +
  +
    +
  • PT_ATTACH was attempted on a process that was already being +traced. +
  • +
  • A request attempted to manipulate a process that was being +traced by some process other than the one making the request. +
  • +
  • A request (other than PT_ATTACH) specified a process that +wasn't stopped. +
  • +
+ +
EPERM +
  +
    +
  • A request (other than PT_ATTACH) attempted to manipulate a +process that wasn't being traced at all. +
  • +
  • An attempt was made to use PT_ATTACH on a process in violation +of the requirements listed under PT_ATTACH above. +
  • +
+ + +
+ +
Verfügbar: This function is available since FreeMiNT 1.15.11. +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding +
  + +
+ +

5.11.44.1 Bindings für Ptrace

+ + + + + + +
C: int16_t Ptrace(int16_t request, int16_t pid, void *addr, +int32_t data); +
  +
Assembler: +
  +
move.l    data,-(sp)    ; Offset 10
+pea       addr          ; Offset 6
+move.w    pid,-(sp)     ; Offset 4
+move.w    request,-(sp) ; Offset 2
+move.w    #320,-(sp)    ; Offset 0
+trap      #1            ; GEMDOS aufrufen
+lea       14(sp),sp     ; Stack korrigieren
+
+ +
+ +

5.11.45 Pumask

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pumask« - Datei und Verzeichnis Erstellungsmaske setzen. +
  +
Gemdosnummer: 307 +
  +
Deklaration: int16_t Pumask ( int16_t mode ); +
  +
Beschreibung: Die Funktion ändert die Datei-/Verzeichnis Erstellungsmaske +des aktuellen Prozesses auf mode, welches eine WORD Bitmaske +mit den durch Fchmod definierten Zugriffsrechten ist. Der neue Wert +der Maske wird an Child-Prozesse vererbt. +
  +
Wenn eine neue Datei (per Fcreate) oder ein neues Verzeichnis +(per Dcreate) erzeugt wird, werden die Zugriffsrechte normalerweise so +gesetzt, daß ein voller Zugriff erlaubt ist. (Ausnahme: neue Dateien +sind normalerweise nicht ausführbar). +
  +
Mit Hilfe von Pumask kann festgelegt werden, welche +Zugriffsrechte bei der Erzeugung einer Datei nicht (!) erlaubt sein +sollen. +
  +
Explizite Fchmod-Aufrufe werden von Pumask nicht beeinflußt. +
  +
Achtung: In MagiC wird die Maske allerdings von keinem +der internen XFS von MagiC ausgewertet und hat ihren Sinn +ausschließlich bei UNIX-ähnlichen Dateisystemen. +
  +
Ergebnis: Die Funktion liefert den Wert der alten Erstellungsmaske. +
  +
Verfügbar: Verfügbar, wenn ein 'MiNT' Cookie mit einer Versionsnummer von +mindestens 0.92 existiert und in MagiC ab Version 5.04. +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Dcreate   Fchmod   Fcreate +
  + +
+ +

5.11.45.1 Bindings für Pumask

+ + + + + + +
C: int16_t Pumask ( int16_t mode ); +
  +
Assembler: +
  +
move.w    mode,-(sp)   ; Offset 2
+move.w    #307,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

5.11.46 Pusrval

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pusrval« - spezifische Informationen eines Prozesses setzen +bzw. abfragen. +
  +
Gemdosnummer: 280 +
  +
Deklaration: int32_t Pusrval ( int32_t val ); +
  +
Beschreibung: Die Funktion erlaubt das Setzen bzw. Abfragen von +Prozessspezifischen Informationen. Diese werden in einem Langwort +gespeichert, und an alle Child-Prozesse weitervererbt. +
  +
Die Bedeutung des Wertes kann vom aufrufenden Programm frei +bestimmt werden. +
  +
Ergebnis: Die Funktion liefert den alten Wert zurück. +
  +
Verfügbar: Seit der ersten in MultiTOS integrierten MiNT Version 1.04 und +in MagiC ab der Version 5.04. +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding +
  + +
+ +

5.11.46.1 Bindings für Pusrval

+ + + + + + +
C: int32_t Pusrval ( int32_t val ); +
  +
Assembler: +
  +
move.l    val,-(sp)    ; Offset 2
+move.w    #280,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

5.11.47 Pvfork

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pvfork« - Kopie des aktuellen Prozesses erstellen. +
  +
Gemdosnummer: 275 +
  +
Deklaration: int16_t Pvfork ( void ); +
  +
Beschreibung: Die Funktion erzeugt eine Kopie des aktuellen Prozesses. +Parent- und Childprozess teilen sich denselben Adressraum, d.h. jede +Änderung, die der Child an Variablen vornimmt, betreffen auch den +Parent. Der neue Prozess beginnt seine Arbeit, wenn die Funktion +Pvfork zurückkehrt. +
  +
Auch wenn der Parent diese Funktion aus dem Supervisormode +aufruft, läuft das Child im Usermode. +
  +
Da sich beide Prozesse den gleichen Adressraum (und Stack) +teilen, gäbe es Probleme, wenn beide zur gleichen Zeit laufen +würden. Deshalb wird der Parent angehalten, bis der Child-Prozess +entweder beendet wird oder sich mittels Pexec (Modus 200) selbst mit +einem neuen Prozess in einem neuen Adressraum überschreibt. +
  +
Ergebnis: Die Funktion kann folgende Rückgabewerte liefern: +
  + + + + + + + + + +
E_OK  : im Child-Prozess. +
>0    : neue Prozess-ID im Parent-Prozess. +
ENSMEM: nicht genug Speicher vorhanden, um den neuen Prozeß zu +erzeugen. + +
+ +
Verfügbar: Seit der ersten in MultiTOS integrierten MiNT Version 1.04. +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Pexec   Pfork   Threads +
  + +
+ +

5.11.47.1 Bindings für Pvfork

+ + + + + + +
C: int16_t Pvfork ( void ); +
  +
Assembler: +
  +
move.w    #275,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

5.11.48 Pwait

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pwait« - auf Childprozess warten, Exitcode ermitteln. +
  +
Gemdosnummer: 265 +
  +
Deklaration: int32_t Pwait ( void ); +
  +
Beschreibung: Diese Funktion ist äquivalent zu Pwait3 (2, NULL) und wird aus +Gründen der Abwärtskompatibilität angeboten. +
  +
Laut POSIX sollte die Bibliotheksfunktion 'wait' als Pwaitpid +(-1, 0, NULL) implementiert werden. Daher sollte Pwait für eine +POSIX-kompatible Bibliothek nicht benutzt werden. +
  +
Achtung: In MagiC ist die Funktion als Pwaitpid (-1, 2, +NULL) implementiert. +
  +
Ergebnis: Die Funktion kann folgende Rückgabewerte liefern: +
  + + + + + + + + + +
>0    : Exit-Status und PID des Childs in den unteren bzw. oberen 16 +Bits eines 32-Bit Returnwerts. +
 0    : Kein Child Prozess ist terminiert. +
EFILNF: es existieren keine Childs. + +
+ +
Verfügbar: Seit der ersten in MultiTOS integrierten MiNT Version 1.04 und +in MagiC ab Version 5.04. +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Pwait3   Pwaitpid +
  + +
+ +

5.11.48.1 Bindings für Pwait

+ + + + + + +
C: int32_t Pwait ( void ); +
  +
Assembler: +
  +
move.w    #265,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

5.11.49 Pwait3

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pwait3« - auf Childprozess warten, Exitcode ermitteln. +
  +
Gemdosnummer: 284 +
  +
Deklaration: int32_t Pwait3 ( int16_t flag, int32_t *rusage ); +
  +
Beschreibung: Diese Funktion ist äquivalent zu einem Aufruf von Pwaitpid +(-1, flag, rusage) und ermittelt damit den Exit-Status sowie die +CPU-Auslastung eines terminierten oder beendeten Child-Prozesses. +
  +
flag ist eine Bitmaske, die das Verhalten des +Funktionsaufrufs wie folgt festlegt: +
  + + + + + + + + + + + + +
Wert Bedeutung +
    +
1 Wenn gesetzt, blockiert die Funktion nicht den aufrufenden +Prozess und liefert 0 zurück. Wenn nicht gesetzt (gelöscht), wird +der Prozess solange blockiert bis das Child sich beendet oder gestoppt +wurde. +
2 Wenn gesetzt, werden die Returnwerte von Prozessen die beendet +wurden genauso wie von gestoppten zurückgeliefert. Wenn gelöscht, +werden nur Returnwerte von Prozessen die aktuell beendet wurden, +zurückgeliefert. + +
+ +
rusage zeigt auf ein Feld mit zwei LONGS, die mit +Informationen über den Verbrauch von Resourcen des beendeten oder +gestoppten Prozesses gefüllt werden. Der erste LONG enthält die +Anzahl Millisekunden, die vom Child verbraucht wurden. Der zweite LONG +enthält die Anzahl Millisekunden, die der Prozess im Kernelspace +verbracht hat. Wird diese Information nicht gewünscht, kann +rusage auf NULL gesetzt werden. +
  +
Ergebnis: Die Funktion kann folgende Rückgabewerte liefern: +
  + + + + + + + + + +
>0    : Exit-Status und PID des Childs im unteren und oberen 16 bit des +32 Bit Returnwerts. +
 0    : Kein Child Prozess wurde gestoppt oder beendet, oder, falls +Bit-0 des Parameters flag gesetzt ist, die Funktion würde +beim Warten auf das Exit bzw. Stop des Childs blockiert werden. +
EFILNF: es existieren keine Childs. + +
+ +
Verfügbar: Seit der ersten in MultiTOS integrierten MiNT Version 1.04 und +in MagiC ab Version 5.04. +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Pwait   Pwaitpid +
  + +
+ +

5.11.49.1 Bindings für Pwait3

+ + + + + + +
C: int32_t Pwait3 ( int16_t flag, int32_t *rusage ); +
  +
Assembler: +
  +
pea       rusage       ; Offset 4
+move.w    flag,-(sp)   ; Offset 2
+move.w    #284,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #8,sp        ; Stack korrigieren
+
+ +
+ +

5.11.50 Pwaitpid

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pwaitpid« - auf Childprozess warten, Exitcode ermitteln. +
  +
Gemdosnummer: 314 +
  +
Deklaration: int32_t Pwaitpid ( int16_t pid, int16_t flag, int32_t *rusage +); +
  +
Beschreibung: Die Funktion versucht den Exit-Code von Childprozessen, die +gestoppt oder beendet worden sind, zu ermitteln. Falls Bit-1 des +Parameters flag gesetzt ist, werden z.Zt. gestoppte, +anderenfalls gerade beendete bzw. durch Tracing gestoppte +Childprozesse gemeldet. +
  +
Ein gestoppter Prozess wird i.d.R. einmal gemeldet (sofern er +nicht neu gestartet, und wieder gestoppt wurde). Ebenso wird ein +beendetet Prozess nur einmal gemeldet. +
  +
Wenn Childs vorhanden sind, die weder gestoppt oder beendet sind +(oder auf ein solches Ereignis warten), wird das weitere Verhalten der +Funktion durch Bit-0 des Parameters flag gesteuert. Dabei +gilt: +
  + + + + + + +
Bit-0 = 0: warten, bis Child stoppt oder beendet wird. +
Bit-0 = 1: sofort zurückkehren. + +
+ +
Über den Parameter pid können die Childs genauer +spezifiziert werden. Es gilt: +
  + + + + + + + + + + + + + + + + + + +
pid Bedeutung +
    +
-1 Status für alle Childs abfragen +
>0 pid ist die Prozess-Kennung des Childs, dessen Status +erfragt werden soll +
=0 Status für alle Childs abfragen, deren Gruppen-ID gleich der +des aufrufenden Prozesses ist. +
< -1 Status für alle Childs abfragen, deren Gruppen-ID dem +Absolutwert (Betrag) von pid entspricht. + +
+ +
Über den Parameter rusage werden Informationen +über den Verbrauch an CPU-Zeit des Childs abgelegt: +
  + + + + + + +
rusage[0]: Zeitverbrauch im User-Space (msec) +
rusage[1]: Zeitverbrauch im Kernel-Space (msec) + +
+ +
Falls ein Child gefunden wurde, wird dessen PID in den oberen +16-Bit und sein Exit-Status in den unteren 16-Bit des Rückgabewertes +abgelegt. Wenn der Prozess durch das Signal mit der Nummer n gestoppt +oder beendet wurde, ist sein Exit-Status 256*n+x mit: +
  + + + + + + +
x = 127, falls der Prozess gestoppt wurde. +
x = 0, falls der Prozess beendet wurde. + +
+ +
Achtung: In MagiC werden angehaltene Child-Prozesse noch +nicht erkannt, sondern nur beendete Childs. Darüber hinaus werden im +Parameter rusage z.Zt. immer nur Null-Werte zurückgegeben. +
  +
Auch Prozeßgruppen werden z.Zt. noch nicht richtig +unterstützt, da die Funktion Psetpgrp() noch fehlt. +
  +
Ergebnis: Die Funktion kann folgende Rückgabewerte liefern: +
  + + + + + + + + + +
>0    : Exit-Status und PID des Childs im unteren und oberen 16 bit des +32 Bit Returnwerts. +
 0    : Kein Child Prozess wurde gestoppt oder beendet, oder, falls +Bit-0 des Parameters flag gesetzt ist, und die Funktion beim +Warten auf das Exit bzw. Stop des Childs blockiert werden würde. +
EFILNF: es existieren keine Childs. + +
+ +
Verfügbar: Verfügbar, wenn ein 'MiNT' Cookie mit einer Versionsnummer von +mindestens 0.96 existiert und in MagiC ab Version 5.04. +
  +
Gruppe: Prozessfunktionen +
  +
Querverweis: Binding   Pwait   Pwait3 +
  + +
+ +

5.11.50.1 Bindings für Pwaitpid

+ + + + + + +
C: int32_t Pwaitpid ( int16_t pid, int16_t flag, int32_t *rusage +); +
  +
Assembler: +
  +
pea       rusage       ; Offset 6
+move.w    flag,-(sp)   ; Offset 4
+move.w    pid,-(sp)    ; Offset 2
+move.w    #314,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+lea       $A(sp),sp    ; Stack korrigieren
+
+ +
+ +
+ +Home +GEMDOSGEMDOS +Datum und UhrzeitDatum und Uhrzeit +SpeicherverwaltungSpeicherverwaltung + + diff --git a/de/gemdos_programs.html b/de/gemdos_programs.html new file mode 100644 index 000000000..04c4cf053 --- /dev/null +++ b/de/gemdos_programs.html @@ -0,0 +1,265 @@ + + + + + +Die Anleitung zum TOS: Das Programmformat + + + + + + + + + +Home +GEMDOSGEMDOS +Pipes, Test aufPipes, Test auf +Programmstart und TPAProgrammstart und TPA + +
+ +

5.5 Das Programmformat

+ +

Eine Programmdatei besteht unter GEMDOS aus den folgenden +Komponenten: +

+
    +
  • Header +
  • +
  • Text-, DATA- und BSS-Segment +
  • +
  • Symboltabelle (optional) +
  • +
  • Relokationstabelle (optional) +
  • +
+ +

Der Header ist dabei wie folgt aufgebaut: +

+ + + +
typedef struct
+{
+   WORD  ph_branch;        /* Branch zum Anfang des Programms  */
+                           /* (muß 0x601a sein!)               */
+
+   LONG  ph_tlen;          /* Länge  des TEXT - Segments       */
+   LONG  ph_dlen;          /* Länge  des DATA - Segments       */
+   LONG  ph_blen;          /* Länge  des BSS  - Segments       */
+   LONG  ph_slen;          /* Länge  der Symboltabelle         */
+   LONG  ph_res1;          /* reserviert, sollte 0 sein        */
+                           /* wird von PureC benötigt          */
+   LONG  ph_prgflags;      /* Programmflags                    */
+   WORD  ph_absflag;       /* 0 = Relozierungsinf. vorhanden   */
+} PH;
+
+ +

Eine Symboltabelle im Digital-Research-Format besteht +aus jeweils 14 Bytes langen Einträgen, die aus dem Symbolnamen +(maximal 8 Bytes; lediglich kürzere Namen sind mit einer 0 +abgeschlossen!), einem 2 Bytes langen Symboltyp und dem eigentlichen +Symbolwert (4 Bytes) bestehen. Die unterstützten Symboltypen sind in +der folgenden Tabelle zusammengefaßt: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
WertSymboltyp
0x0100in der BSS
0x0200im Programmtext
0x0280Start eines Objektmoduls
0x02c0Start einer Library
0x0400im DATA-Bereich
0x0800External
0x1000Register
0x2000Globales Symbol
0x4000Equated
0x8000Defined
+
+ + +

Viele Entwicklungssysteme (z.B. Pure-C) benutzen allerdings ein +eigenes (i.d.R. leistungsfähigeres) Symbolformat. Da Programme unter +TOS an eine beliebige Stelle des Arbeitsspeichers geladen werden +können (und dort ablauffähig sein müssen), enthält eine +Programmdatei normalerweise eine Relokationstabelle, mit deren +Hilfe die im Programmcode angegebenen Adressen auf die tatsächlich +zugewiesenen Bereiche umgerechnet werden können. +

+

Ob Relokations-Informationen vorhanden sind oder nicht, kann der +Komponente ph_absflag des Programmheaders (s.o.) entnommen +werden. Es ist grundsätzlich nur eine Relozierung von 32-Bit-Werten +(d.h. Adressen) möglich; vor GEMDOS-Version 0.15 (bzw. TOS-Version +1.04) durften die Relozierungsinformationen nur maximal 32 Kbyte +umfassen. +

+

Die Relokationstabelle selbst beginnt mit einem 32-Bit-Wert, +welcher den Offset des ersten zu relozierenden Wertes relativ +zum Beginn des Textsegmentes markiert. Für alle folgenden Offsets +werden dann einzelne Bytes benutzt. Um auch Abstände größer als +255 korrekt handhaben zu können, wird dabei wie folgt verfahren: +Wird als Offset eine 1 gefunden (dies ist aufgrund der Charakteristika +der MC-680x0 Prozessorfamilie unmöglich), wird automatisch zum Offset +der Wert 254 addiert. Für besonders große Abstände kann dieser +Vorgang natürlich auch wiederholt werden. Eine leere +Relokationstabelle wird übrigens durch einen Long-Wert von 0 +gekennzeichnet. +

+

Querverweis: Fcntl   ARHEADER   OHEADER   OSHEADER   PSETFLAGS   +Die Programmflags +

+

5.5.1 Die Programmflags

+ + +

Bei den Programmflags handelt es sich um einen Bitvektor +innerhalb des Programmheaders, der wie folgt aufgebaut ist: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Bits Bedeutung +
    +
   0 Fastload-Flag. Wenn dieses Bit gesetzt ist, wird der +Heap nicht gelöscht, sondern lediglich das BSS-Segment +vorinitialisiert. +
   1 Wenn dieses Bit gesetzt ist, darf das Programm in das schnelle +Alternate-RAM geladen werden. +
   2 Wenn dieses Bit gesetzt ist, dürfen Speicheranforderungen per +Malloc aus dem Alternate-RAM bedient werden. +
   3 reserviert, sollte Null sein. +
Wird für die Shared Library benutzt. + + + +
 4-7 Speicherschutz-Modus + + + + + + + + + + + + + + +
0 = Privat: +
Nur der Prozess selbst, und das Betriebssystem kann auf den +Speicher zugreifen. + + +
1 = Global: +
Der Speicher ist völlig ungeschützt, und daher kann von allen +Programmen auf diesen zugegriffen werden. + + +
2 = Super; +
Auf den Speicher kann von allen Prozessen zugegriffen werden, die +im Supervisor-Modus arbeiten. + + +
3 = Nur lesbar; +
Jeder Prozess kann aus dem Speicher lesen; das Schreiben ist +jedoch nur dem Prozess selbst, sowie dem Betriebssystem erlaubt. + +
+ +
8-11 reserviert, sollte Null sein. + +
  12 Shared-Text. Wenn dieses Bit gesetzt ist, darf das +Text-Segment des Programms geshared werden. Wenn ein +derartiges Programm beispielsweise 3-mal gestartet wird, dann +existieren 3 verschiedene DATA- und BSS-Segmente, aber nur ein +gemeinsames Text-Segment. Achtung: Das Bit sollte nur gesetzt +werden, wenn das Programm keine absoluten Zugriffe auf das DATA- oder +BSS-Segment durchführt. +
13-27 reserviert, sollte Null sein. + + +
28-31 TPA-Größenfeld. Hier kann in Schritten zu 128 Kbyte +festgelegt werden, wieviel Speicher aus dem Alternate-RAM dem Programm +maximal zugeteilt werden soll, wenn der Rechner über mehr ST-RAM als +Alternate-RAM verfügt. Die 16 möglichen Werte stehen für Angaben +zwischen 128 Kbyte und 2MByte. + +
+ +

Querverweis: Programmheader   Programmstart und TPA +

+
+ +Home +GEMDOSGEMDOS +Pipes, Test aufPipes, Test auf +Programmstart und TPAProgrammstart und TPA + + diff --git a/de/gemdos_signals.html b/de/gemdos_signals.html new file mode 100644 index 000000000..ead46af94 --- /dev/null +++ b/de/gemdos_signals.html @@ -0,0 +1,534 @@ + + + + + +Die Anleitung zum TOS: Signale + + + + + + + + + +Home +GEMDOSGEMDOS +Programmstart und TPAProgrammstart und TPA +gemdos-Trapgemdos-Trap + +
+ +

5.7 Signale

+

Das aus der U*NIX-Welt stammende Signal-Konzept steht auch unter +den Betriebssystemen MultiTOS und MagiC (ab Version 4.50) zur +Verfügung. Signale können als natürliche Zahlen aufgefaßt werden, +die einen bestimmten Ausnahmezustand (Exception) repräsentieren. Sie +sind mit einem Interrupt oder einer CPU-Exception vergleichbar, mit +dem Unterschied jedoch, daß es sich um eine reine +Software-Implementation handelt. +

+

Jeder Prozess besitzt: +

+
    +
  • einen Bitvektor der wartenden Signale (pending Signals). Dieser +beschreibt diejenigen Signale, die noch auf ihre Bearbeitung warten, +weil sie z.B. gerade durch die Signalmaske gesperrt sind, oder weil +der Prozess in einem Zustand ist, in dem er keine Signale bearbeiten +kann. +
      +

  • +
  • eine Signalmaske. Dieser 32bit-Wert definiert als Bitvektor +diejenigen Signale, die momentan gesperrt sind; wenn in diesem Vektor +z.B. Bit-30 gesetzt ist, ist das Signal SIGUSR2 gesperrt. Die +Signalmaske wird nicht nur explizit (d.h. durch Systemaufrufe), +sondern auch implizit durch andere Vorgänge beeinflußt. +Während der Abarbeitung eines Signals ist dieses z.B. gesperrt, +andere können jedoch noch auftreten. Nach der Bearbeitung des Signals +wird dieses wieder freigegeben und damit evtl. eine weitere +Signalbehandlung ausgelöst. Beachtet werden muss, daß einige Signale +(z.B. SIGKILL, SIGSTOP, SIGCONT) nicht maskiert werden +können. +
      +

  • +
  • eine Tabelle der Form struct sigaction +
      +

  • +
+ +

Bei einem Pexec werden die Signalmaske und der pending-Wert +(s.o.) des Child-Prozesses auf Null gesetzt. Die Komponente +sa_handler der sigaction Struktur wird vererbt, wobei ein Wert +ungleich 0 oder 1 immer auf 0 gesetzt wird. Die Komponenten +sa_mask und sa_flags der Struktur werden auf den Wert +Null gesetzt. +

+

Die meisten Signale können von einem Programm abgefangen, (um +etwa beim Eintreffen eine bestimmte Routine aufzurufen) ignoriert, +oder auch blockiert werden. Blockierte Signale werden solange nicht +berücksichtigt, bis die Blockade wieder aufgehoben wird. Zur +Terminologie: Man sagt, daß ein Signal zu einem Prozess +geschickt wird, wenn die das Signal repräsentierende +Exception auftritt, oder wenn das Signal per Pkill von einem anderen +Prozess gesendet wird. Ein Signal wurde hingegen an einen Prozess +überbracht, wenn der entsprechende Prozess aufwacht, und die +für das Signal passenden Aktionen einleitet. Zu beachten ist, daß +das SignalHandling nicht zeitlos geschieht: Zwischen dem Abschicken +eines Signals, und der Aufnahme der dazu passenden Aktionen kann evtl. +ein beträchtlicher Zeitraum verstreichen. +

+ +

Insgesamt stehen 31 mögliche Signale (0 bis 30) zur Verfügung, +denen aber noch nicht allen eine feste Bedeutung zugewiesen ist. Die +folgende Liste beschreibt (soweit bekannt) alle möglichen Signale in +der Form: Signalnummer, Name des Signals, Bedeutung des Signals für +den empfangenden Prozess. Sofern nicht ausdrücklich anders +beschrieben, besteht die Default Aktion beim Eintreffen eines Signals +in der Terminierung des empfangenden Prozesses. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Nummer Name Bedeutung +
    + +
   0   SIGNULL Null: Dieses Signal besitzt keine Defaultaktion, da es streng +genommen gar kein Signal ist. Zusammen mit Pkill kann es jedoch +benutzt werden, um die Existenz eines Prozesses zu testen. Das Signal +kann nicht maskiert oder abgefangen werden. + +
   1   SIGHUP Hang Up: Wird normalerweise verschickt, wenn ein Terminal, mit +dem ein Prozess verbunden ist, nicht mehr gültig ist. Nach Erhalt +dieses Signals sollte der Prozess keine Ausgaben mehr auf das Terminal +machen. In MagiC wird der VT52 das Signal verschicken, wenn ein +Terminalfenster geschlossen wurde. + +
   2   SIGINT Interrupt: Wird i.a. verschickt, wenn der Benutzer die +Tastenkombination ^C betätigt. Dieses Signal wird von zukünftigen +Versionen MagiC statt der bisherigen ^C-Behandlung benutzt. + +
   3   SIGQUIT Quit: Wird i.a. verschickt, wenn der Benutzer die +Tastenkombination ^\ betätigt. Das Signal soll 'härter' als SIGINT +sein, und wird z.Zt. noch nicht von MagiC bzw. VT52 verschickt. + +
   4   SIGILL Illegal instruction: Entspricht dem gleichnamigen +Exceptionvektor des 68K-Prozessors. Das Signal sollte nicht +abgefangen werden. In MiNT kann das Signal abgefangen werden, d.h. der +Vektor wird praktisch für jeden Prozess umgebogen. In MagiC +funktioniert das jedoch z.Zt. noch nicht, so daß hier immer 8 Bomben +erscheinen. + +
   5   SIGTRAP Trap: Entspricht dem Exceptionvektor 'Trace' des 68K-Prozessors +und wird nach jeder Anweisung gesendet, wenn das System im +Einzelschritt 'trace' Modus läuft. Dieses Signal sollte nur von +Debuggern abgefangen werden. In MiNT kann das Signal +abgefangen werden, d.h. der Vektor wird praktisch für jeden Prozess +umgebogen. In MagiC funktioniert das z.Zt. jedoch noch nicht, d.h. es +erscheinen immer 9 Bomben. + +
   6   SIGABRT Abort: Wird normalerweise von der Bibliotheksfunktion abort() +in ANSI C verwendet, und sollte nicht abgefangen werden. +Dieses Signal wird nicht vom Betriebssystem selbst verschickt. + +
   7   SIGPRIV Privilege Violation: Entspricht dem gleichnamigen +Exceptionvektor im 68K-Prozessor, wenn ein Prozess versucht, eine +Anweisung im User-Mode auszuführen, die nur im Supervisor Mode +ausgeführt werden darf. Dieses Signal sollte nicht abgefangen werden; +in MiNT ist dies jedoch möglich, so daß der Exceptionvektor +praktisch für jeden Prozess umgebogen wird. In MagiC funktioniert +das z.Zt. jedoch noch nicht, d.h. es erscheinen immer 8 Bomben. + +
   8   SIGFPE Floating Point Exception: Die Default-Aktion besteht darin, das +Signal zu ignorieren. Es entspricht dem 68k-Execptionvektor 'Division +durch Null' oder eine Floating Point Exception. Das Signal kann +ignoriert oder abgefangen werden. In MiNT kann das Signal abgefangen +werden, so daß der Vektor praktisch für jeden Prozess umgebogen +wird. In MagiC ist dies z.Zt. noch nicht möglich. + +
   9   SIGKILL Kill: Terminiert den empfangenden Prozess. Das Signal kann +nicht maskiert bzw. abgefangen werden; deshalb sollte dieses Signal +erst dann verschickt werden, wenn SIGTERM erfolglos war. Das Signal +wird von MagiC selbst z.Zt. noch nicht verschickt. + +
  10   SIGBUS Bus Error: Entspricht dem gleichnamigen Exceptionvektor des +68K-Prozessors. Das Signal sollte nicht ignoriert oder +abgefangen werden. In MiNT kann das Signal abgefangen werden, d.h. der +Exceptionvektor wird praktisch für jeden Prozess umgebogen; in MagiC +geht das z.Zt. jedoch noch nicht, so daß immer 2 Bomben erscheinen. +In MiNT werden SIGBUS, SIGSEGV und SIGPRIV beim ersten Eintreffen des +Signals auf die Defaultroutine des Systems zurückgesetzt, so daß ein +doppelter Bus-/Adreß-/Privilegfehler den Prozess immer +beendet. + +
  11   SIGSEGV Segmentation violation: Entspricht dem Exceptionvektor +'Adressfehler' des 68K-Prozessors. Das Signal sollte nicht +abgefangen oder ignoriert werden. In MiNT kann das Signal abgefangen +werden, d.h. der Exceptionvektor wird praktisch für jeden Prozess +umgebogen. In MagiC geht das jedoch z.Zt. noch nicht, d.h. es +erscheinen immer 3 Bomben. + +
  12   SIGSYS Bad System Call: Wird verschickt, wenn ein Parameter für ein +Systemaufruf ungültig ist bzw. den erlaubten Wertebereich +überschreitet und der Aufruf selbst keinen Fehler meldet. Wird von +MagiC z.Zt. noch nicht verschickt. + +
  13   SIGPIPE Pipe Error: Wird beim Versuch verschickt, in eine nicht mehr +existierende Pipe zu schreiben, und kann z.B. beim +Drag&Drop-Protokoll maskiert werden. Dieses Signal wird z.Zt. von +MagiC noch nicht verschickt. + +
  14   SIGALRM Alarm: Wird von MiNT für Talarm verwendet, und dient z.B. zum +Behandeln von Time-Outs. In MagiC wird dieses Signal z.Zt. noch nicht +verschickt. + +
  15   SIGTERM Terminate: Standardsignal zum Beenden eines Prozesses; es wird +von MiNT z.B. beim Löschen einer Programmdatei im Verzeichnis U:\PROC +verschickt, von MagiC z.Zt. jedoch noch ignoriert. + +
  16   SIGURG Dieses Signal ist z.Zt. noch nicht definiert. + +
  17   SIGSTOP Stop: Die Default-Aktion besteht darin, den empfangenden +Prozess anzuhalten. Das Signal kann nicht blockiert bzw. +abgefangen werden. In MagiC werden dabei sämtliche Threads eines +Prozesses angehalten. Im gestoppten Zustand gehen in MagiC keinerlei +Maus- bzw. Tastaturklicks verloren; beim Fortfahren des Prozesses per +SIGCONT werden die entsprechenden Nachrichten ausgewertet. + +
  18   SIGTSTP Terminal Stop: Die Default-Aktion besteht darin, den +empfangenden Prozess anzuhalten. Das Signal entspricht SIGSTOP, und +wird i.a. vom Benutzer durch Drücken der Tastenkombination ^Z +ausgelöst. Es kann nicht maskiert bzw. abgefangen werden. Das +Signal wird z.Zt. noch nicht von MagiC und VT52 verschickt. + +
  19   SIGCONT Continue: Die Default-Aktion besteht darin, den empfangenen +(und vorher durch SIGSTOP oder Pause gestoppten) Prozess wieder +aufzuwecken. Obwohl das Signal nicht maskiert bzw. ignoriert werden +kann, kann eine Behandlungsroutine für das Signal installiert werden. +In MagiC werden sämtliche Threads aufgeweckt, die durch einen Aufruf +von Pause bzw. SIGSTOP angehalten worden sind. + +
  20   SIGCHLD Child Terminated: Die Default-Aktion besteht darin, das Signal +zu ignorieren. Es wird sowohl beim Terminieren als auch beim Anhalten +eines Prozesses an den Parent-Prozess verschickt. In MiNT kann +festgelegt werden, daß dieses Signal nur beim Terminieren verschickt +wird, und darüber hinaus auch festgestellt werden, welcher +Child-Prozess betroffen war. Da MagiC bisher nur das wartende Pexec +kennt (d.h. der Parent wartet so lange, bis der Child terminiert), +gibt es das Signal hier noch nicht. Die durch shel_write erzeugten +Prozesse sind keine richtigen Childs, sondern völlig +unabhängige Prozesse; in diesen Fällen muss daher auf das Eintreffen +der Nachricht CH_EXIT gewartet werden. + +
  21   SIGTTIN Terminal Input-Error: Die Default-Aktion besteht darin, den +empfangenden Prozess anzuhalten. In der Regel versucht ein Prozess von +einem Terminal zu lesen, das ihm nicht gehört. Von MagiC bzw. VT52 +wird das Signal z.Zt. noch nicht verschickt. + +
  22   SIGTTOU Terminal Output-Error: Die Default-Aktion besteht darin, den +empfangenden Prozess anzuhalten. In der Regel versucht ein Prozess +Ausgaben auf ein Terminal vorzunehmen, das ihm nicht gehört. Von +MagiC bzw. VT52 wird das Signal z.Zt. noch nicht verschickt. + +
  23   SIGIO I/O possible: Eine Ein-/Ausgabe für eine Dateikennung ist +möglich. + +
  24   SIGXCPU Exhaustion of CPU-Limit: Das per Psetlimit bzw. durch die +erweiterten shel_write-Modi festgelegte Rechenzeit-Kontingent ist +abgelaufen. Da die Begrenzung der Rechenzeit in MagiC bisher nicht +implementiert ist, wird das Signal z.Zt. noch nicht verschickt. + +
  25   SIGXFSZ File size limit exceeded: Wird verschickt wenn eine Datei auf +eine Weise verändert wird, die die maximale Größe einer Datei, die +dem Prozess erlaubt ist, überschritten wird. + +
  26   SIGVTALRM Time limit expired: Wird an einen Prozess geschickt, der seine +maximale CPU Zeit überschritten hat. + +
  27   SIGPROF Profiling time expired: Wird an einen Prozess geschickt, um ihm +mitzuteilen, daß seine maximale Profiling Zeit überschritten ist. + +
  28   SIGWINCH Window-Changed: Die Default-Aktion besteht darin, das Signal zu +ignorieren. Es wird normalerweise verschickt, wenn sich die +Terminalgröße (d.h. die Anzahl der Zeilen bzw. Spalten) verändert +hat. Ein Programm daß im Terminalfenster abläuft, kann sich nun +entsprechend neu konfigurieren. Zur Ermittlung der aktuellen +Fenstergröße gibt es in MiNT Fcntl-Opcodes, die in MagiC bisher +jedoch noch nicht implementiert sind. Das Signal wird daher z.Zt. noch +nicht von MagiC bzw. VT52 verschickt. + +
  29   SIGUSR1 User-Defined: + +
  30   SIGUSR2 User-Defined: Diese zwei Signale dürfen durch +Benutzerprogramme verschickt werden. Da ein Prozess beim Empfangen +dieses Signals per Default terminiert wird, sollte es nur verschickt +werden, wenn der Empfänger bekannt ist. + +
  31   SIGPWR Das System wird wegen eines Fehlers in der Stromversorgung neu +gestartet. + +
+ +

Querverweis: +
Signalhandler in MagiC   Prozessfunktionen   Beispielcode   Psigaction   +Psignal   Pkill   Test auf Pipes +

+

5.7.1 Signalhandler in MagiC

+

Da sich Signalhandler in MagiC etwas von denen in MiNT bzw. +MultiTOS unterscheiden, wird an dieser Stelle auf die wichtigsten +Unterschiede bzw. Eigenschaften eingegangen. Zunächst einmal muss +festgestellt werden, daß in MagiC AES- und VDI-Aufrufe aus einem +Signalhandler heraus erlaubt sind (ganz im Gegensatz zu MiNT). +

+

Ein Signalhandler läuft im Usermodus und verwendet den +Userstack des Haupt-Threads, der solange schläft. In MiNT wird der +Supervisor-Stack des Prozesses verwendet. Daher schießt laut +MiNT-Dokumentation die Verschachtelung von Signalen ab 4 Stück einen +Prozeß wegen Stapelüberlaufs ab. In MagiC ist jeder Signalhandler +ein eigener Thread mit eigenem Supervisor-Stack, es +kann also lediglich der extrem unwahrscheinliche Fall des +Userstack-Überlaufs eintreten. Wenn jedoch zur Behandlung eines +Signals zuwenig Speicher für einen neuen Thread zur Verfügung steht, +wird eine Alertbox "System hat keinen freien Speicher mehr" +ausgegeben, und es sollte schleunigst ein Programm beendet werden. +Für jede Signalbehandlung benötigt MagiC ca. 7k Speicherplatz. +

+

Für Signale gilt in MagiC das gleiche wie für Threads (ein +Signalhandler ist ein Thread), d.h. die entsprechenden +Systembibliotheken müssen reentrant sein. Es kommt jedoch +noch erschwerend hinzu, daß der Haupt-Thread während der Abarbeitung +des Signals angehalten wird. Wenn also der Haupt-Thread eine Semaphore +(Stichwort: wind_update) gesetzt hat, ensteht ein Deadlock, wenn der +Signalhandler diese Semaphore ebenfalls setzen will. Weiterhin kann +ein Prozeß in MagiC an beinahe beliebiger Stelle unterbrochen werden +(MagiC ist reentrant, sogar DOS ist unterbrechbar), so daß der +Haupt-Thread u.U. wichtige Bereiche des Systems sperrt (Dateien, +Verzeichnisse, Semaphoren). Daher kann es z.B. vorkommen, daß +bestimmte Dateien nicht gelöscht oder geöffnet werden können. +

+

Beim normalen Beenden eines Signalhandlers werden alle von dem +Handler gesperrten Semaphoren automatisch freigegeben. Weiterhin +werden ggf. Fenster, Bildschirmhintergrund und Menüleiste des +Signalhandlers freigegeben. Man beachte, daß ein Signalhandler eine +eigene AES Message-Queue besitzt, d.h. evnt_message und appl_write +sind mit Vorsicht zu verwenden. +

+

Bei Psigreturn werden die Semaphoren aller Signalhandler als +auch die des Haupt-Thread freigegeben. Nicht freigegeben werden jedoch +Fenster, Bildschirmhintergrund und Menüleiste der Signalhandler. Das +wäre zwar kein großes Problem gewesen, dürfte aber in der Praxis +nicht notwendig sein. Psigreturn restauriert den Supervisor-Stack des +Haupt-Thread, d.h. ein setjmp/longjmp-Mechanismus braucht nur den USP +zu setzen. Dies ist in der MiNT-Dokumentation nicht ausreichend +dokumentiert und funktioniert auch nur dann, wenn der Haupt-Thread per +GEMDOS-Aufruf wartet. Kommt AES ins Spiel, stürzt MultiTOS ab. +Psigreturn sollte daher nach Möglichkeit vermieden werden. Psigreturn +ist in MagiC nicht vom Typ VOID wie in MiNT, sondern vom Typ LONG. +Wenn die Funktion von einem Nicht-Signalhandler aufgerufen wird, +liefert Psigreturn den Wert EACCDN zurück, sonst E_OK. Hat Psigreturn +E_OK geliefert, sollte (wie in MiNT) auf keinen Fall die +Behandlungs-Prozedur normal per rts beendet werden, weil die +Rücksprungadresse auf dem Userstack nach der Ausführung von +Psigreturn ungültig ist. +

+

Ein Problem existiert in MagiC mit den bisherigen Versionen von +VT52. Ein Signalhandler kann noch keine Tastaturabfragen im +VT52 durchführen; die Tasten werden noch nicht empfangen. Dies wird +sich in einer späteren Version jedoch noch ändern. +

+

Querverweis: Prozessfunktionen   Signale   Threads +

+

5.7.2 Beispielcode zu Signalen

+

Das erste Programm installiert einen Signalhandler für die +beiden Signale SIGUSR1 und SIGUSR2. Damit kann man die Verschachtelung +der beiden Signale testen, wenn beide hintereinander verschickt werden. +Das Programm sollte im VT52 bzw. im MINIWIN laufen. Wenn man während +der "for()" Warteschleife Ctrl-Alt-Esc betätigt, erkennt +man, daß MagiC für jeden Signalhandler einen eigenen Thread +erstellt. Das hat den Vorteil, daß unter MagiC keine Ereignisse +(Maus, Timer, ...) verlorengehen können, während ein Signal +bearbeitet wird. +

+
------------------------------ schnipp --------------------------
+#include <tos.h>
+#include <stdio.h>
+
+void cdecl handler(long signr)
+{
+    long i;
+
+    printf("handler: Signal %ld empfangen.\n", signr);
+    Cconws("warte...");
+    for (i = 0; i < 7000000L; i++)
+        ;
+    Cconws("...OK\r\n");
+}
+
+int main( void )
+{
+    long ret;
+
+    printf("Meine ProcID ist %d.\n", Pgetpid());
+    ret = (long) Psignal(SIGUSR1, handler);
+    printf("Psignal => %ld\n", ret);
+    ret = (long) Psignal(SIGUSR2, handler);
+    printf("Psignal => %ld\n", ret);
+    Cconin();
+    return(0);
+}
+------------------------------ schnipp --------------------------
+
+

Das zweite Programm zeigt die Behandlung des +Psigreturn()-Aufrufs. Unter MiNT funktioniert dieses Programm nur, +wenn man keine AES-Aufrufe (evnt_keybd() oder evnt_multi()) verwendet, +sondern z.B. Cconin() verwendet. D.h. das folgende Programm +funktioniert unter MagiC und stürzt unter MultiTOS (MiNT 1.08+AES +4.1) ab. Das Problem liegt wahrscheinlich an der Restauration des +Supervisor-Stacks (Systemstapelzeiger), dabei versagt MultiTOS wegen +des inhomogenen Konzepts AES<->MiNT. +

+
------------------------------ schnipp --------------------------
+#include <tos.h>
+#include <aes.h>
+#include <setjmp.h>
+#include <tosdefs.h>
+#include <stdio.h>
+
+jmp_buf env;
+
+void cdecl handler(long signr)
+{
+    printf("handler: Signal %ld empfangen.\n", signr);
+    Cconws("Mache Psigreturn()\r\n");
+    Psigreturn();
+    longjmp(env, 1);
+}
+
+int main( void )
+{
+    long ssp;
+
+    appl_init();
+    printf("Meine ProcID ist %d.\n", Pgetpid());
+    Psignal(SIGUSR1, handler);
+
+    if  (setjmp(env))
+        Cconws("komme von longjmp.\r\n");
+    else    Cconws("komme von setjmp.\r\n");
+    ssp = Super(0L);
+    Super((void *) ssp);
+    printf("ssp = 0%08lx\n", ssp);
+    evnt_keybd();
+    return(0);
+}
+
+

Querverweis: Signale   Prozessfunktionen   GEMDOS +

+
+ +Home +GEMDOSGEMDOS +Programmstart und TPAProgrammstart und TPA +gemdos-Trapgemdos-Trap + + diff --git a/de/gemdos_structures.html b/de/gemdos_structures.html new file mode 100644 index 000000000..7b799c67b --- /dev/null +++ b/de/gemdos_structures.html @@ -0,0 +1,1022 @@ + + + + + +Die Anleitung zum TOS: GEMDOS-Strukturen + + + + + + + + + +Home +GEMDOSGEMDOS +GEMDOS-FunktionslisteGEMDOS-Funktionsliste +Line-ALine-A + +
+ +

5.24 GEMDOS-Strukturen

+ +
+

5.24.1 CD-ROM Definitionen

+ + + + + + + + + + + + + +
/* Adressierungs-Typen */
+
+#define CDROM_LBA               0x01
+#define CDROM_MSF               0x02
+
+/* SUB-Q Kontroll-Bits */
+
+#define CDROM_AUDIO_EMPHASIS    0x01
+#define CDROM_COPY_PERMITTED    0x02
+#define CDROM_DATA_TRACK        0x04
+#define CDROM_FOUR_CHANNEL      0x08
+
+/* The leadout track is always 0xAA, regardless of # of tracks on disc */
+
+#define CDROM_LEADOUT   0xAA
+
+/* Rückgabewerte von READ SUBCHANNEL DATA */
+
+/* audio status not supported         */
+#define CDROM_AUDIO_INVALID     0x00
+/* audio play operation in progress   */
+#define CDROM_AUDIO_PLAY        0x11
+/* audio play operation paused        */
+#define CDROM_AUDIO_PAUSED      0x12
+/* audio play successfully completed  */
+#define CDROM_AUDIO_COMPLETED   0x13
+/* audio play stopped due to error    */
+#define CDROM_AUDIO_ERROR       0x14
+/* no current audio status to return  */
+#define CDROM_AUDIO_NO_STATUS   0x15
+
+

Querverweis: CD-ROM Opcodes für Fcntl +

+

5.24.2 cdrom_audioctrl

+
struct cdrom_audioctrl
+{
+    /* Eingabe-Parameter */
+
+    int16_t set;                   /* 0 = nur nachfragen */
+
+    /* Ein-/Ausgabe-Parameter */
+
+    struct
+    {
+        int8_t selection;
+        int8_t volume;
+    } channel[4];
+};
+
+

Querverweis: CD-ROM Opcodes für Fcntl +

+

5.24.3 cdrom_mcn

+
struct cdrom_mcn
+{
+    int8_t  mcn_audiostatus;
+    int8_t  mcn_mcn[23];       /* Media-Katalog-Nummer als ASCII-String */
+};
+
+

Querverweis: CD-ROM Opcodes für Fcntl   ASCII-Tabelle +

+

5.24.4 cdrom_msf

+
struct cdrom_msf
+{
+    int8_t cdmsf_min0;       /* Anfangs-Minute  */
+    int8_t cdmsf_sec0;       /* Anfangs-Sekunde */
+    int8_t cdmsf_frame0;     /* Anfangs-Frame   */
+    int8_t cdmsf_min1;       /* Ende-Minute     */
+    int8_t cdmsf_sec1;       /* Ende-Sekunde    */
+    int8_t cdmsf_frame1;     /* Ende-Frame      */
+};
+
+

Querverweis: CD-ROM Opcodes für Fcntl +

+

5.24.5 cdrom_read

+
struct cdrom_read
+{
+    int32_t  cdread_lba;       /* Adresse               */
+    int8_t  *cdread_bufaddr;   /* Zeiger auf den Puffer */
+    int32_t  cdread_buflen;    /* Länge des Puffers     */
+};
+
+

Querverweis: CD-ROM Opcodes für Fcntl +

+

5.24.6 cdrom_subchnl

+
struct cdrom_subchnl
+{
+    /* Eingabe-Parameter */
+
+    int8_t cdsc_format;             /* CDROM_MSF oder CDROM_LBA */
+
+    /* Ausgabe-Parameter */
+
+    int8_t   cdsc_audiostatus;
+    unsigned cdsc_resvd: 8;         /* reserviert               */
+    unsigned cdsc_adr  : 4;
+    unsigned cdsc_ctrl : 4;
+    int8_t   cdsc_track;            /* aktueller Track          */
+    int8_t   cdsc_ind;              /* aktueller Index          */
+    cd_ad    cdsc_absaddr;          /* absolute Adresse         */
+    cd_ad    cdsc_reladdr;          /* relative Track-Adresse   */
+};
+
+

Querverweis: CD-ROM Opcodes für Fcntl +

+

5.24.7 cdrom_ti

+
struct cdrom_ti
+{
+    int8_t cdti_trk0;        /* Start-Track */
+    int8_t cdti_ind0;        /* Start-Index */
+    int8_t cdti_trk1;        /* Ende-Track  */
+    int8_t cdti_ind1;        /* Ende-Index  */
+};
+
+

Querverweis: CD-ROM Opcodes für Fcntl +

+

5.24.8 cdrom_tisrc

+

Diese Struktur ist wie folgt definiert: +

+
struct cdrom_tisrc
+{
+    /* Eingabe-Parameter */
+
+    int8_t tisrc_track;          /* Track-Nummer */
+
+    /* Ausgabe-Parameter */
+
+    int8_t tisrc_audiostatus;
+    int8_t tisrc_tisrc[23];      /* Track International Standard
+                                    Recording Code als ASCII-String */
+};
+
+

Querverweis: CD-ROM Opcodes für Fcntl   ASCII-Tabelle +

+

5.24.9 cdrom_tocentry

+

Diese Struktur ist wie folgt definiert: +

+
struct cdrom_tocentry
+{
+    /* Eingabe-Parameter */
+
+    int8_t cdte_track;             /* Track-Nummer oder CDROM_LEADOUT */
+    int8_t cdte_format;            /* CDROM_LBA oder CDROM_MSF        */
+
+    /* Ausgabe-Parameter */
+
+    unsigned cdte_adr:4;           /* SUBQ Channel Encodes; es gilt:
+                                      0 = keine
+                                      1 = Positions-Daten
+                                      2 = MCN
+                                      3 = ISRC
+                                      (alle anderen Werte reserviert) */
+    unsigned cdte_ctrl:4;          /* Bit-0: Audio mit Pre-Emphasis
+                                      Bit-1: digitale Kopie möglich
+                                      Bit-2: Daten Track
+                                      Bit-3: 4-Kanal                  */
+    int8_t   cdte_datamode;        /* z.Zt. unbenutzt                 */
+    cd_ad    dte_addr;             /* Track-Start                     */
+};
+
+

Querverweis: CD-ROM Opcodes für Fcntl +

+

5.24.10 cdrom_tochdr

+
struct cdrom_tochdr
+{
+    int8_t cdth_trk0;        /* Start-Track */
+    int8_t cdth_trk1;        /* Ende-Track  */
+};
+
+

Querverweis: CD-ROM Opcodes für Fcntl +

+

5.24.11 cdrom_volctrl

+
struct cdrom_volctrl
+{
+    int8_t  channel0;   /* Kanal-1: Lautstärke 0...255 */
+    int8_t  channel1;   /* Kanal-2: Lautstärke 0...255 */
+    int8_t  channel2;   /* Kanal-3: Lautstärke 0...255 */
+    int8_t  channel3;   /* Kanal-4: Lautstärke 0...255 */
+};
+
+

Querverweis: CD-ROM Opcodes für Fcntl +

+

5.24.12 cd_ad

+

Diese Union ist wie folgt definiert: +

+
typedef union
+{
+    struct
+    {
+       int8_t reserved;    /* reserviert */
+       int8_t minute;      /* Minute     */
+       int8_t second;      /* Sekunde    */
+       int8_t frame;       /* Frame      */
+    } msf;
+    int32_t lba;
+} cd_ad;
+
+

Querverweis: CD-ROM Opcodes für Fcntl +

+

5.24.13 DISKINFO

+
typedef struct
+{
+    uint32_t   b_free;    /* Anzahl der freien Cluster */
+    uint32_t   b_total;   /* Gesamtzahl der Cluster    */
+    uint32_t   b_secsiz;  /* Bytes pro Sektor          */
+    uint32_t   b_clsiz;   /* Sektoren pro Cluster      */
+} DISKINFO;
+
+

Querverweis: Dfree   GEMDOS +

+

5.24.14 DOSTIME

+
typedef struct
+{
+   uint16_t     time;  /* Zeit wie in Tgettime  */
+   uint16_t     date;  /* Datum wie in Tgetdate */
+} DOSTIME;
+
+

Die Struktur der beiden Integer-Werte gliedert sich wie folgt: +

+ + + + + + + + + + + + + + + +
Bit time +
    +
0-4 Sekunden in Zweierschritten (0-29) +
5-10 Minuten (0-59) +
11-15 Stunden (0-23) + +
+ + + + + + + + + + + + + + + + +
Bit date +
    +
0-4 Tag im Monat (1-31) +
5-8 Monat (1-12) +
9-15 Jahr (0-119, 0=1980) + +
+ +

Querverweis: Fdatime   GEMDOS +

+

5.24.15 DOSVARS

+
typedef struct
+{
+   int8_t    *in_dos;                 /* Adresse der DOS- Semaphore */
+   int16_t   *dos_time;               /* Adresse der DOS- Zeit      */
+   int16_t   *dos_date;               /* Adresse des DOS- Datums    */
+   int32_t   res1;                    /*                            */
+   int32_t   res2;                    /*                            */
+   int32_t   res3;                    /* ist 0L                     */
+   VOID      *act_pd;                 /* Laufendes Programm         */
+   int32_t   res4;                    /*                            */
+   int16_t   res5;                    /*                            */
+   VOID      *res6;                   /*                            */
+   VOID      *res7;                   /* interne DOS- Speicherliste */
+   VOID      (*resv_intmem)();        /* DOS- Speicher erweitern    */
+   int32_t   (*etv_critic)();         /* etv_critic des GEMDOS      */
+   int8_t *  ((*err_to_str)(int8_t e)); /* Umrechnung Code->Klartext*/
+   VOID      *xaes_appls;             /*                              */
+   VOID      *mem_root;               /*                              */
+   VOID      *ur_pd;                  /*                              */
+} DOSVARS;
+
+

Hinweis: Diese Variablen sind READ-ONLY ! +

+

Mit Hilfe der Funktion resv_intmem läßt sich ähnlich +wie mit FOLDRnnnn Speicher für die interne Speicherverwaltung +reservieren. Im Gegensatz zu TOS wird diese jedoch deutlich weniger +belastet, so daß ein Erweitern i.a. nicht notwendig ist. Muß der +Speicher erweitert werden, was auch in ADDMEM geschieht, übergibt man +der Funktion resv_intmem in Register A0 die Adresse, und in +Register D0 die Länge des zu reservierenden Speicherblocks. +

+

Der Prototyp für den Event-Critic-Handler +lautet: +

+
int32_t etv_critic (int16_t errcode, int16_t drvnr)
+
+

Man beachte, daß die Funktion die Argumente auf dem Stack +erwartet, und daher in Pure-C als cdecl deklariert +werden muß. +

+

Die Funktion err_to_str erwartet in Register D0 einen +TOS-Fehlercode, und gibt in den Registern D0 und A0 einen Zeiger auf +die beschreibende Zeichenkette zurück. Bei einem ungültigen +Fehlercode erhält man in D0 eine Null, und in A0 einen Zeiger auf die +Zeichenkette 'TOS-Fehler'. +

+

Aus der Sicht von KAOS 1.4.2 sieht die Struktur folgendermaßen +aus: +

+
typedef struct
+{
+   int8_t    *in_dos;                 /* Adresse der DOS- Semaphore */
+   int16_t   *dos_time;               /* Adresse der DOS- Zeit      */
+   int16_t   *dos_date;               /* Adresse des DOS- Datums    */
+   int32_t   dos_stack;               /* Stack für DOS selbst       */
+   int32_t   pgm_superset;            /* Benutzerpgm.-Sup.stack     */
+   MD        *menlist[3];             /* Adresse der 3 MD-Listen    */
+   VOID      *act_pd;                 /* Laufendes Programm         */
+   FCB       *fcbx;                   /* Dateien                    */
+   int16_t   fcbn;                    /* Länge von fcbx[]           */
+   DMD       *dmdx;                   /* Zeiger auf 16 DMDs         */
+   IMB       *imbx;                   /* interne DOS- Speicherliste */
+   VOID      (*resv_intmem)();        /* DOS- Speicher erweitern    */
+   int32_t   (*etv_critic)();         /* etv_critic des GEMDOS      */
+   int8_t *  ((*err_to_str)(int8_t e)); /* Umrechnung Code->Klartext  */
+} DOSVARS;
+
+

Querverweis: AESVARS   Cookie von MagiC   Sconfig +

+

5.24.16 DTA

+

Diese Struktur ist wie folgt definiert: +

+
typedef struct
+{
+    int8_t    d_reserved[21];  /* für GEMDOS reserviert */
+    uint8_t   d_attrib;        /* Datei-Attribut        */
+    uint16_t  d_time;          /* Uhrzeit               */
+    uint16_t  d_date;          /* Datum                 */
+    uint32_t  d_length;        /* Dateilänge            */
+    int8_t    d_fname[14];     /* Dateiname             */
+} DTA;
+
+

rekursive Suche in Ordnern +

+

In je einer DTA werden genau alle nötigen Informationen +gespeichert, die nach einem Fsfirst für weitere Fsnext benötigt +werden. Das heißt, daß auf keinen Fall erneut Fsfirst für andere +Verzeichnisse/Wildcards aufrufen sollte, solange noch weitere +Fsnext-Aufrufe in der Verzeichnis-Ebene gemachen werden. +
Bei einer rekursiven Suche mußt für jedes neue Fsfirst eine +eigene DTA verwendet werden, die solange erhalten bleiben muß, bis +alle Fsnext für den Fsfirst getätigt sind. Hier ein Bsp in pseudo-C: +

+
void durchsuche_verzeichnis (int8_t *pfadname)
+{
+  DTA_Record local_dta, saved_dta;
+
+  saved_dta = GetDTA ();
+  SetDTA (local_dta);
+
+  err = Fsfirst (pfadname, ...);
+  while (err == 0) {
+    if (local_dta.attrib == subdir) {
+      // rekursive suche in sub-dir
+      durchsuche_verzeichnis (subdir-pfadname);
+    } else {
+      ... normales file auswerten
+    }
+    err = Fsnext ();
+  }
+
+  SetDTA (saved_dta);
+}
+
+

Querverweis: Fgetdta   Fsetdta   Fsfirst   Fsnext   GEMDOS +

+

5.24.17 fcookie

+
typedef struct f_cookie
+{
+    struct filesys *fs; /* Filesystem welches diesen Cookie kennt     */
+    uint16_t dev;       /* Device-Info (z.B. Rwabs Gerätenummer)      */
+    uint16_t aux;       /* weitere Daten für das Filesystem           */
+    int32_t   index;    /* dient zusammen mit dev zur Identifizierung */
+                        /* eines Files */
+} fcookie;
+
+

Querverweis: FILEPTR   FILESYS   XFS-Konzept in MagiC +

+

5.24.18 FILEPTR

+
typedef struct fileptr
+{
+    int16_t         links;
+    uint16_t        flags;
+    int32_t         pos;
+    int32_t         devinfo;
+    fcookie         fc;
+    struct devdrv  *dev;
+    struct fileptr *next;
+} FILEPTR;
+
+

Querverweis: Dcntl   DEVDRV +

+

5.24.19 flock, Fcntl

+
struct flock
+{
+    int16_t  l_type;     /* Art des Lockings */
+    int16_t  l_whence;   /* SEEK_SET, SEEK_CUR, SEEK_END */
+    int32_t  l_start;    /* Start des Locking-Bereiches  */
+    int32_t  l_len;      /* Länge des Locking-Bereiches  */
+    int16_t  l_pid;      /* PID des sperrenden Prozesses */
+};
+
+

Hinweis: Mögliche Werte für l_type sind 0 = +Read-Locking, 1 = Write-Locking sowie 3 = kein Locking. +

+

5.24.20 iovec

+
struct iovec
+{
+    char    *iov_base;
+    int32_t iov_len;
+};
+
+

5.24.21 LINE

+
typedef struct
+{
+    uint8_t   maxlen;        /* max. Zeilenlänge     */
+    uint8_t   actuallen;     /* aktuelle Zeilenlänge */
+    int8_t    buffer[255];   /* Zeilen-Puffer        */
+} LINE;
+
+

Querverweis: Cconrs   GEMDOS +

+

5.24.22 ltchars

+
struct ltchars
+{
+    int8_t t_suspc;
+    int8_t t_dsuspc;
+    int8_t t_rprntc;
+    int8_t t_flushc;
+    int8_t t_werasc;
+    int8_t t_lnextc;
+};
+
+

Querverweis: struct tty   XFS-Konzept in MagiC +

+

5.24.23 msghdr

+
/* structure used with sendmsg() and recvmsg() */
+struct msghdr
+{
+    struct sockaddr *msg_name;
+    int32_t         msg_namelen;
+    struct iovec    *msg_iov;
+    int32_t         msg_iovlen;
+    void            *msg_accrights;
+    int32_t         msg_accrightslen;
+};
+
+

5.24.24 mutimbuf

+
struct mutimbuf
+{
+   uint16_t actime;     /* Zugriffszeit                 */
+   uint16_t acdate;     /* Zugriffsdatum                */
+   uint16_t modtime;    /* Uhrzeit der letzten Änderung */
+   uint16_t moddate;    /* Datum der letzten Änderung   */
+};
+
+

Querverweis: Dcntl   Fcntl   GEMDOS +

+

5.24.25 Process-Descriptor (PD) bzw. BASEPAGE

+ + +
typedef struct pd
+{
+   VOID     *p_lowtpa;      /* Anfangsadresse der TPA            */
+   VOID     *p_hitpa;       /* erstes Byte nach dem Ende der TPA */
+   VOID     *p_tbase;       /* Anfangsadresse des Programmcodes  */
+   int32_t   p_tlen;        /* Länge des Programmcodes           */
+   VOID     *p_dbase;       /* Anfangsadresse des DATA-Bereichs  */
+   int32_t   p_dlen;        /* Länge des DATA-Abschnittes        */
+   VOID     *p_bbase;       /* Anfangsadresse des BSS-Bereichs   */
+   int32_t   p_blen;        /* Länge des BSS-Abschnittes         */
+   DTA      *p_dta;         /* Zeiger auf Default-DTA.           */
+                            /* Achtung: zeigt zunächst in die    */
+                            /* Kommandozeile !                   */
+   struct pd *p_parent;     /* Zeiger auf die Basepage des auf-  */
+                            /* rufenden Prozesses                */
+   int32_t   p_resrvd0;     /* reserviert                        */
+   int8_t   *p_env;         /* Adresse der Environment-Strings   */
+   int8_t    p_resrvd1[80]; /* reserviert                        */
+   int8_t    p_cmdlin[128]; /* Kommandozeile                     */
+} PD; /* auch: BASEPAGE */
+
+

Hinweis zur Kommandozeile: Im ersten Byte wird die +Anzahl der Zeichen eingesetzt. Die maximale Länge der Kommandozeile +beläuft sich nicht auf 127, sondern nur auf 124 Zeichen! +(Dies trift nicht für MagiC ab Version 3 zu - siehe ARGV-Verfahren). +

+

Querverweis: GEMDOS   OSHEADER   Pexec   Programmstart und TPA +

+

5.24.26 Poll Descriptor

+ +
typedef struct pollfd
+{
+        int32_t  fd;            /* File descriptor to poll */
+        uint16_t events;        /* Types of events poller cares about */
+        uint16_t revents;       /* Types of events that actually occurred */
+} POLLFD;
+
+

See also: GEMDOS   Fpoll +

+

5.24.27 ploadinfo

+
struct ploadinfo
+{
+   int16_t fnamelen;  /* Länge von 'fname'                         */
+   int8_t *cmdlin;    /* Kommandozeile des Prozesses (128 Bytes)   */
+   int8_t *fname;     /* vollst. Pfad- und Dateiname des Prozesses */
+};
+
+

Querverweis: Fcntl   PLOADINFO +

+

5.24.28 sgttyb

+
struct sgttyb
+{
+    int8_t   sg_ispeed;
+    int8_t   sg_ospeed;
+    int8_t   sg_erase;
+    int8_t   sg_kill;
+    uint16_t sg_flags;
+};
+
+

Querverweis: struct tty   XFS-Konzept in MagiC +

+

5.24.29 struct sigaction

+ +

Diese Struktur ist wie folgt definiert: +

+
struct sigaction
+{
+   void cdecl (*sa_handler)(int32_t sig);
+   int32_t    sa_mask;
+   int16_t    sa_flags;
+};
+
+

Hinweis: Die Komponente sa_handler kann dabei +verschiedene Werte annehmen. Ein Wert von 0 bedeutet eine +Default-Signal-Behandlung durch das System, bei einem Wert von 1 wird +das Signal ignoriert; jeder andere Werte wird als die Adresse einer +Signalbehandlungsroutine interpretiert, die dann aufgerufen wird. +

+

Die Komponente sa_mask enthält die zusätzlich (zu dem +gerade in Bearbeitung befindlichen Signal) während der +Signalbehandlung zu maskierenden Signale. Es gilt dann also mask = +oldmask+(1<<sig)+sa_mask). Über sa_flags kann das +Verhalten eines Signals weiter beeinflußt werden. Ein Wert von 1 für +sa_flags bedeutet in MiNT, daß das Signal SIGCHLD nur beim +Terminieren, und nicht beim Anhalten eines Childs ausgelöst wird; +andere Werte für sa_flags sind z.Zt. noch nicht definiert. +

+

Querverweis: Signale   Signalhandler in MagiC   GEMDOS   +Psigaction   Prozessfunktionen +

+

5.24.30 sockaddr

+
/* generic socket address */
+struct sockaddr
+{
+    int16_t sa_family;
+    char    sa_data[14];
+};
+
+

5.24.31 STAT

+
struct time
+{
+   int32_t high_time;
+   int32_t time;
+   uint32_t nanoseconds;
+};
+
+typedef struct STAT
+{
+   uint64_t   dev;               /* Gerätenummer               */
+   uint32_t   ino;               /* Dateinummer                */
+   uint32_t   mode;              /* Dateimodus, Angaben zu     */
+                                 /* - möglichen Filetypen      */
+                                 /* - speziellen Bits          */
+                                 /* - Zugriffsrechten          */
+   uint32_t   nlink;             /* Anzahl der Links           */
+   uint32_t   uid;               /* Benutzernummer             */
+   uint32_t   gid;               /* Gruppennummer              */
+   uint64_t   rdev;              /* tatsächliches Gerät        */
+                                 /* (z.B. bei BIOS-Files)      */
+   struct time atime;            /* Datum des letzten Zugriffs */
+   struct time mtime;            /* Datum der letzten Änderung */
+   struct time ctime;            /* Datum der letzten Status-Änderung */
+   int64_t    size;              /* Dateilänge                 */
+   int64_t    blocks;            /* belegte Blocks             */
+   int32_t    blksize;           /* Blockgröße                 */
+   uint32_t   flags;             /* Benutzer-definierte Flags  */
+   uint32_t   gen;               /* file generation number     */
+   int32_t    reserved[7];       /* reserviert                 */
+} STAT;
+
+

Hinweis: MagiC liefert für FAT-Dateisysteme folgende +Index-Daten: +

+ + + + + + +
• Verzeichnisse: Startcluster im Motorola-Format +
• sonstige Dateien: + + + + + + +
Hiword = Startcluster des Verzeichnisses +
Loword = Position innerhalb des Verzeichnisses >> 5 + +
+ + +
+ +

Dieses Verfahren ist ähnlich wie das, welches Linux und Solaris +verwenden. Nachteil ist, daß Dateien beim Verschieben ihren Index +ändern. +

+

Die Komponente index ist also ein Langwort zur +eindeutigen Identifizierung einer Datei bzw. eines Ordners. Der Index +muß innerhalb eines Dateisystems eindeutig sein; zusammen mit dem +folgenden Feld (dev) ist damit eine Datei oder ein Ordner +systemglobal vollständig festgelegt. +

+

Unter UNIX-ähnlichen Dateisystemen ist index die Nummer +des Inode. +

+

Auf Macintosh-Partitionen wird die hard file ID bzw. die hard +dir ID verwendet, die vom MacOS zur Verfügung gestellt wird. Das +MacOS verwendet als Standard-Deskriptoren aber das FSSpec. Für +Verzeichnisse, d.h. für Directory IDs, gibt es Funktionen des MacOS, +um einen FSSpec zu berechnen. Leider lassen sich die hard file IDs +für normale Dateien (d.h. nicht Unterverzeichnisse) nicht +weiter verwenden, da sie von keiner Funktion des MacOS verarbeitet +werden. +

+

Querverweis: XFS-Konzept in MagiC   Fxattr   Dxreaddir +

+

5.24.31.1 STAT, dev-Komponente

+

Legt das Dateisystem fest. Auf dem Atari sind 0..25 die +BIOS-Laufwerke A: bis Z:, Laufwerk U: oder andere Dateisysteme +verwenden höhere Nummern. Auf dem Macintosh wird die 'volume ID' +eingesetzt, die vom MacOS vergeben wird. +

+

5.24.31.2 STAT, mögliche Filetypen

+ +

Mögliche Filetypen, die über die STAT-Struktur gesetzt +bzw. ermittelt werden können: +

+
#define S_IFMT   0170000  /* zur Isolierung des Filetyps */
+#define S_IFSOCK 0010000  /* Socket Datei                */
+#define S_IFCHR  0020000  /* spezielles BIOS-File        */
+#define S_IFDIR  0040000  /* Verzeichnis                 */
+#define S_IFBLK  0060000  /* Block special file          */
+#define S_IFREG  0100000  /* normale Datei               */
+#define S_IFIFO  0120000  /* FIFO (Pipe mit Namen)       */
+#define S_IMEM   0140000  /* Speicherblock/Prozeßfile    */
+#define S_IFLNK  0160000  /* symbolischer Link           */
+
+

5.24.31.3 STAT, Sticky-Bit

+

Spezielle Bits, die über die STAT-Struktur gesetzt bzw. +ermittelt werden können: +

+
#define S_ISUID 04000  /* User-ID des Eigentümers setzen */
+#define S_ISGID 02000  /* Gruppen-ID bei Aufruf setzen   */
+#define S_ISVTX 01000  /* Sticky bit                     */
+
+

Hinweis: Die Bedeutung des Sticky-Bits ist dabei +vom Filetyp abhängig. +

+

5.24.31.4 STAT, size-Komponente

+

Auf DOS-Partitionen wird für Ordner der Wert 0 als +Länge geliefert. Die tatsächliche Länge kann leider aufgrund der +Einschränkungen von MSDOS nicht ermittelt werden. Die Länge des +Wurzelverzeichnisses kann allerdings ermittelt werden. +

+

Auf Macintosh-Partitionen haben Ordner immer die Länge +0, die tatsächliche Länge läßt sich (zumindest unter System 7) +nicht ermitteln. +

+

5.24.31.5 STAT, Zugriffsrechte

+

Mögliche Zugriffsrechte, die über die STAT-Struktur +gesetzt bzw. ermittelt werden können: +

+
#define S_IRUSR 0400   /* Eigentümer darf Datei lesen    */
+#define S_IWUSR 0200   /* dto. darf beschreiben          */
+#define S_IXUSR 0100   /* dto. darf ausführen            */
+#define S_IRGRP 0040   /* Gruppenmitglieder dürfen lesen */
+#define S_IWGRP 0020   /* dto. dürfen beschreiben        */
+#define S_IXGRP 0010   /* dto. dürfen ausführen          */
+#define S_IROTH 0004   /* Andere dürfen Datei lesen      */
+#define S_IWOTH 0002   /* dto. dürfen beschreiben        */
+#define S_IXOTH 0001   /* dto. dürfen ausführen          */
+
+

5.24.32 tchars

+
struct tchars
+{
+    int8_t t_intrc;
+    int8_t t_quitc;
+    int8_t t_startc;
+    int8_t t_stopc;
+    int8_t t_eofc;
+    int8_t t_brkc;
+};
+
+

Querverweis: struct tty   XFS-Konzept in MagiC +

+

5.24.33 timeval

+
struct timeval
+{
+  int32_t int tv_sec;
+  int32_t int tv_usec;
+};
+
+

tv_sec enthält die Anzahl Sekunden, die seit dem Ursprung +vergangen sind. Der Ursprung ist Donnerstag, 1.Januar 1970, 00:00:00 +UTC. +

+

tv_usec enthält den Nachkommaanteil von tv_sec in +Mikrosekunden. +

+

5.24.34 timezone

+
struct timezone
+{
+  int32_t int tz_minuteswest;
+  int32_t int tz_dsttime;
+};
+
+

tz_minuteswest enthält den Offset zur UTC in Sekunden. +Zeitzonen östlich den Null-Meridians (z.B. Osteuropa) haben einen +negativen Offset, Zeitzonen westlich des Null-Meridians (z.B. Amerika) +haben einen positiven. +

+

tz_dsttime ist ungleich Null, wenn innerhalb des Jahr auf +Sommerzeit umgestellt wird. +

+

5.24.35 struct tty

+
struct tty
+{
+    int16_t         pgrp;
+    int16_t         state;
+    int16_t         use_cnt;
+    int16_t         res1;
+    struct sgttyb   sg;
+    struct tchars   tc;
+    struct ltchars  ltc;
+    struct winsize  wsiz;
+    int32_t         rsel;
+    int32_t         wsel;
+    int8_t          *xkey;
+    int32_t         hup_ospeed;
+    uint16_t        vmin, vtime;
+    int32_t         resrvd[1];
+};
+
+

Querverweis: Dcntl   dev_descr   XFS-Konzept in MagiC +

+

5.24.36 winsize

+
struct winsize
+{
+    int16_t  ws_row;
+    int16_t  ws_col;
+    int16_t  ws_xpixel;
+    int16_t  ws_ypixel;
+};
+
+

Querverweise: Fcntl   TIOCGWINSZ +

+

5.24.37 XATTR

+
typedef struct xattr
+{
+   uint16_t   mode;              /* Dateimodus, Angaben zu     */
+                                 /* - möglichen Filetypen      */
+                                 /* - speziellen Bits          */
+                                 /* - Zugriffsrechten          */
+   int32_t    index;             /* Dateinummer                */
+   uint16_t   dev;               /* Gerätenummer               */
+   uint16_t   rdev;              /* tatsächliches Gerät        */
+                                 /* (z.B. bei BIOS-Files)      */
+                                 /* in MagiC jedoch reserviert */
+   uint16_t   nlink;             /* Anzahl der Links           */
+   uint16_t   uid;               /* Benutzernummer             */
+   uint16_t   gid;               /* Gruppennummer              */
+   int32_t    size;              /* Dateilänge                 */
+   int32_t    blksize, nblocks;  /* Blockgröße/belegte Blocks  */
+   uint16_t   mtime, mdate;      /* Datum der letzten Änderung */
+   uint16_t   atime, adate;      /* Datum des letzten Zugriffs */
+   uint16_t   ctime, cdate;      /* Erstellungsdatum           */
+   uint16_t   attr;              /* TOS-Dateiattribute         */
+   uint16_t   reserved2;         /* reserviert                 */
+   int32_t    reserved3[2];      /* reserviert                 */
+} XATTR;
+
+

Hinweis: MagiC liefert für FAT-Dateisysteme folgende +Index-Daten: +

+ + + + + + +
• Verzeichnisse: Startcluster im Motorola-Format +
• sonstige Dateien: + + + + + + +
Hiword = Startcluster des Verzeichnisses +
Loword = Position innerhalb des Verzeichnisses >> 5 + +
+ + +
+ +

Dieses Verfahren ist ähnlich wie das, welches Linux und Solaris +verwenden. Nachteil ist, daß Dateien beim Verschieben ihren Index +ändern. +

+

Die Komponente index ist also ein Langwort zur +eindeutigen Identifizierung einer Datei bzw. eines Ordners. Der Index +muß innerhalb eines Dateisystems eindeutig sein; zusammen mit dem +folgenden Feld (dev) ist damit eine Datei oder ein Ordner +systemglobal vollständig festgelegt. +

+

Unter UNIX-ähnlichen Dateisystemen ist index die Nummer +des Inode. +

+

Auf Macintosh-Partitionen wird die hard file ID bzw. die hard +dir ID verwendet, die vom MacOS zur Verfügung gestellt wird. Das +MacOS verwendet als Standard-Deskriptoren aber das FSSpec. Für +Verzeichnisse, d.h. für Directory IDs, gibt es Funktionen des MacOS, +um einen FSSpec zu berechnen. Leider lassen sich die hard file IDs +für normale Dateien (d.h. nicht Unterverzeichnisse) nicht +weiter verwenden, da sie von keiner Funktion des MacOS verarbeitet +werden. +

+

Querverweis: XFS-Konzept in MagiC   Fxattr   Dxreaddir +

+

5.24.37.1 XATTR, dev-Komponente

+

Legt das Dateisystem fest. Auf dem Atari sind 0..25 die +BIOS-Laufwerke A: bis Z:, Laufwerk U: oder andere Dateisysteme +verwenden höhere Nummern. Auf dem Macintosh wird die 'volume ID' +eingesetzt, die vom MacOS vergeben wird. +

+

5.24.37.2 XATTR, mögliche Filetypen

+

Mögliche Filetypen, die über die XATTR-Struktur gesetzt +bzw. ermittelt werden können: +

+
#define S_IFMT  0170000  /* zur Isolierung des Filetyps */
+#define S_IFCHR 0020000  /* spezielles BIOS-File        */
+#define S_IFDIR 0040000  /* Verzeichnis                 */
+#define S_IFREG 0100000  /* normale Datei               */
+#define S_IFIFO 0120000  /* FIFO (Pipe mit Namen)       */
+#define S_IMEM  0140000  /* Speicherblock/Prozeßfile    */
+#define S_IFLNK 0160000  /* symbolischer Link           */
+
+

5.24.37.3 XATTR, Sticky-Bit

+

Spezielle Bits, die über die XATTR-Struktur gesetzt bzw. +ermittelt werden können: +

+
#define S_ISUID 04000  /* User-ID des Eigentümers setzen */
+#define S_ISGID 02000  /* Gruppen-ID bei Aufruf setzen   */
+#define S_ISVTX 01000  /* Sticky bit                     */
+
+

Hinweis: Die Bedeutung des Sticky-Bits ist dabei +vom Filetyp abhängig. +

+

5.24.37.4 XATTR, size-Komponente

+

Auf DOS-Partitionen wird für Ordner der Wert 0 als +Länge geliefert. Die tatsächliche Länge kann leider aufgrund der +Einschränkungen von MSDOS nicht ermittelt werden. Die Länge des +Wurzelverzeichnisses kann allerdings ermittelt werden. +

+

Auf Macintosh-Partitionen haben Ordner immer die Länge +0, die tatsächliche Länge läßt sich (zumindest unter System 7) +nicht ermitteln. +

+

5.24.37.5 XATTR, Zugriffsrechte

+

Mögliche Zugriffsrechte, die über die XATTR-Struktur +gesetzt bzw. ermittelt werden können: +

+
#define S_IRUSR 0400   /* Eigentümer darf Datei lesen    */
+#define S_IWUSR 0200   /* dto. darf beschreiben          */
+#define S_IXUSR 0100   /* dto. darf ausführen            */
+#define S_IRGRP 0040   /* Gruppenmitglieder dürfen lesen */
+#define S_IWGRP 0020   /* dto. dürfen beschreiben        */
+#define S_IXGRP 0010   /* dto. dürfen ausführen          */
+#define S_IROTH 0004   /* Andere dürfen Datei lesen      */
+#define S_IWOTH 0002   /* dto. dürfen beschreiben        */
+#define S_IXOTH 0001   /* dto. dürfen ausführen          */
+
+

5.24.37.6 XATTR, spezielle Bits

+

Spezielle Bits, die über die XATTR-STruktur gesetzt bzw. +ermittelt werden können: +

+
#define S_ISUID 04000  /* User-ID des Eigentümers setzen */
+#define S_ISGID 02000  /* Gruppen-ID bei Aufruf setzen   */
+#define S_ISVTX 01000  /* Sticky bit                     */
+
+

Hinweis: Die Bedeutung des Sticky-Bits ist dabei +vom Filetyp abhängig. +

+

5.24.38 xkey

+
struct xkey
+{
+    int16_t   xk_num;
+    int8_t    xk_def[8];
+};
+
+

Querverweise: Fcntl   TIOCGXKEY +

+
+ +Home +GEMDOSGEMDOS +GEMDOS-FunktionslisteGEMDOS-Funktionsliste +Line-ALine-A + + diff --git a/de/gemdos_system.html b/de/gemdos_system.html new file mode 100644 index 000000000..9db76c23d --- /dev/null +++ b/de/gemdos_system.html @@ -0,0 +1,2785 @@ + + + + + +Die Anleitung zum TOS: Systemfunktionen + + + + + + + + + +Home +GEMDOSGEMDOS +NetzwerkfunktionenNetzwerkfunktionen +VerzeichnisfunktionenVerzeichnisfunktionen + +
+ +

5.14 Systemfunktionen

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Salert    Warnung bzw. Fehlermeldung ausgeben. +
Sconfig   Betriebssystem-Konfiguration ermitteln/setzen. +
Scookie   Controlling Cookie Jar. +
Shutdown  Kills all processes, syncs filesystems then halts or reboots +the system. +
Slbclose  Schließt eine Shared Library +
Slbopen   Öffnet eine Shared Library +
Srealloc  Bildschirmspeicher reservieren. +
Ssystem   Controlling Cookie Jar, memory access and various system +settings. +
STEFcntrl STEmulator Kontrollfunktionen +
Super     Supervisor-Modus ermitteln oder ändern. +
Suptime   Returns the current uptime and load averages from the system. +
Sversion  Versionsnummer von GEMDOS ermitteln. +
Syield    CPU für andere Prozesse freigeben. +
Sync      Synchronisation der gemounteten Dateisysteme. +
Sysconf   Betriebssystem-Konfiguration überprüfen. + +
+ +

Querverweis: Dateifunktionen   Prozessfunktionen +

+

5.14.1 Salert

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Salert« - Warnung bzw. Fehlermeldung ausgeben. +
  +
Gemdosnummer: 316 +
  +
Deklaration: void Salert ( int8_t *msg ); +
  +
Beschreibung: Die Funktion gibt eine Fehler- bzw. Warnmeldung aus, die in die +Alert-Pipeline U:\PIPE\ALERT geschrieben wird. +
  +
Die Meldung msg sollte keine Steuerzeichen, Linefeeds +etc. enthalten. Sie sollte eine einfache einzeilige Warn- oder +Fehlermeldung sein. +
  +
Die Funktion formatiert die Meldung selbständig und sendet sie +dem Benutzer. Die genaue Form des Outputs hängt jedoch von der +verwendeten Systemkonfiguration ab. +
  +
Ergebnis: Die Funktion hat kein direktes Ergebnis. +
  +
Verfügbar: Verfügbar, wenn ein 'MiNT' Cookie mit einer Versionsnummer von +mindestens 0.98 existiert. +
  +
Gruppe: Systemfunktionen +
  +
Querverweis: Binding   Cconws   Test auf Pipes +
  + +
+ +

5.14.1.1 Bindings für Salert

+ + + + + + +
C: void Salert ( int8_t *msg ); +
  +
Assembler: +
  +
pea       msg          ; Offset 2
+move.w    #316,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

5.14.2 Sconfig

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Sconfig« - erlaubt die Konfigurierung von Teilen des +Betriebssystems. +
  +
Gemdosnummer: 51 +
  +
Deklaration: int32_t Sconfig ( int16_t mode, int32_t flags ); +
  +
Beschreibung: Die Funktion erlaubt die Konfigurierung von Teilen des +Betriebssystems. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
mode Aktion + + + + + + + + + + + + + + + + + + + + + +
0 = Konfiguration ermitteln +
1 = Konfiguration setzen +
2 = Zeiger auf DOSVARS-Struktur ermitteln; seit KAOS 1.4.2 und +MagiC +
3 = reserviert; MagiC 3.00 +
4 = für WBDAEMON; MagiC 4.01 +
5 = reserviert; MagiC 4.01 +
6 = reserviert; MagiC 4.01 + +
+ +
flags Konfiguration als Bitvektor + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Bit-0 = Pfadüberprüfung ein +
Bit-1 = Einfügemodus für GEMDOS und Dialogboxen +
Bit-2 = reserviert +
Bit-3 = reserviert +
Bit-4 = Fastload für Diskette aus +
Bit-5 = TOS-Kompatibilität ein +
Bit-6 = Smart-Redraw aus +
Bit-7 = Grow-/Shrinkboxen aus +
Bit-8 = kein Halt nach TOS-Programmen +
Bit-9 = reserviert +
Bit-10 = Pulldown-Menüs +
Bit-11 = Floppy-Hintergrundbetrieb + +
+ + +
+ +
Hinweis: Gesetzte Bits schalten die jeweilige Funktion +ein, nicht gesetzte Bits schalten sie wieder aus. +
Bit-11 steht erst ab MagiC 3.0 zur Verfügung. Das Setzen der +Konfiguration ist nur bei abgeschalteter TOS-Kompatibilität +möglich. +
  +
Die Funktion ist auch in KAOS vorhanden, allerings mit einer +etwas anderen Belegung des Bitvektors. Als mode kennt KAOS 1.2 +nur die ersten beiden Unterfunktionen. +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Bit-0 = Pfadüberprüfung ein +
Bit-1 = Diskwechsel-Simulation im Desktop ein +
Bit-2 = Break ein; CTRL-C Abfrage bei jedem DOS-Aufruf +
Bit-3 = CTRL-C Abfrage aus; für zeichenorientierte Funktionen +
Bit-4 = Fastload für Diskette aus +
Bit-5 = TOS-Kompatibilität ein (seit KAOS 1.4.2) +
Bit-6 = Smart-Redraw aus (seit KAOS 1.4.2) +
Bit-7 = Grow-/Shrinkboxen aus (seit KAOS 1.4.2) +
Bit-8 = kein Halt nach TOS-Programmen (seit KAOS 1.4.2) +
Bit-9 = MF2-Layout ein (seit KAOS 1.4.2) +
Bit-10 = Pulldown-Menüs (seit KAOS 1.4.2) +
Bit-11..30 = reserviert (seit KAOS 1.4.2) +
Bit-31 = muß unbedingt 0 sein, sonst Fehler! (seit KAOS 1.4.2) + +
+ +
Ergebnis: Die Funktion liefert, in Abhängigkeit des Parameters +mode, die aktuell gültige Konfiguration oder einen Zeiger auf +eine DOSVARS-Struktur zurück. +
Im Fehlerfall wird EINVFN oder EACCDN zurückgeben. +
  +
Verfügbar: seit KAOS Version 1.2 und MagiC ab Version 1.0 +
  +
Gruppe: Systemfunktionen +
  +
Querverweis: Binding   Sysconf +
  + +
+ +

5.14.2.1 Bindings für Sconfig

+ + + + + + +
C: int32_t Sconfig ( int16_t mode, int32_t flags ); +
  +
Assembler: +
  +
move.l    flags,-(sp)  ; Offset 4
+move.w    mode,-(sp)   ; Offset 2
+move.w    #51,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #8,sp        ; Stack korrigieren
+
+ +
+ +

5.14.3 Scookie

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Scookie« - Cookie jar management. +
  +
Gemdosnummer: 330 (0x014a) +
  +
Deklaration: int32_t Scookie ( int16_t action, COOKIE *cookie ); +
  +
Beschreibung: The function Scookie permits the management of the cookie jar. +The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
action Meaning +
    +
C_BAKE (0x01) cookie is a pointer to a cookie you want to install +into the cookie jar. Only root can bake a cookie (or you get EACCDN), +and you cannot overwrite an existing cookie (ELOCKED). +
Returns 0 for success, or a negative error code +
C_GRAB (0x02) cookie is a pointer to a cookie you want to grab from +the cookie jar. You must supply a cookie with a tag name to look for. +If you use a -1 (LONG) value for the cookie tag, then the first cookie +will be returned to you. If the cookie is found, it will be copied +into the cookie pointed to by cookie. +
Returns 0 for success or EFILNF. If you need direct access to the +jar, pass -1L as your cookie pointer. This will return a +pointer to the jar +
C_MORE (0x04) Like C_GRAB but find the NEXT cookie after the one with +a tag like cookie's. This is so that you can find the entire +jar with C_GRAB and C_MORE. The found cookie is copied +into cookie. The NULL cookie is copied into cookie if +cookie was the last cookie, or returns EFILNF if not found. +
Returns 0 for success (or last cookie) +
C_READ (0x08) cookie should be a LONG tag value to find, NOT a +pointer! The returned value is the value of the cookie indicated, or +EFILNF if not found. Use this when you know the cookie exists, such as +"_MCH" since this is faster and easier. +
C_SIZE (0x10) Returns the number of cookies that are actually in the jar. Use +C_READ,0 to find out how many cookies can be put in the jar +without resizing +
C_EAT (0x20) cookie is the cookie to delete (only need tag value). +Only root can eat cookies (or you get EACCDN). +
Returns EFILNF if cookie is not found or zero for success. + +
+ +
Ergebnis: The return value depends on the parameter action +
In case of invalid action value the function will return EINVFN. +
  +
Verfügbar: This function is not available, use Ssystem() instead to manage +cookies. +
  +
This function has been disabled as of FreeMiNT 1.12.4. +Opcode 330 is now assigned to Dchroot(). +
  +
Gruppe: Systemfunktionen +
  +
Querverweis: Binding   Ssystem +
  + +
+ +

5.14.3.1 Bindings für Scookie

+ + + + + + +
C: int32_t Scookie ( int16_t action, COOKIE *cookie ); +
  +
Assembler: +
  +
pea       cookie       ; Offset 4
+move.w    action,-(sp) ; Offset 2
+move.w    #330,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #8,sp        ; Stack korrigieren
+
+ +
+ +

5.14.4 Shutdown

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Shutdown« - kills all processes, syncs filesystems then +halts or reboots the system. +
  +
Gemdosnummer: 337 (0x0151) +
  +
Deklaration: int32_t Shutdown ( int32_t mode ); +
  +
Beschreibung: This function kills all processes, syncs filesystems then halts +or reboots the system. +
  + +
On mode equal to SHUT_POWER (0L), the system will turn +the power off. The only hardware that supports it at present is CT60 +and the FireBee. If the hardware does not support it, SHUT_HALT will +be performed. SHUT_POWER mode is recognized as of FreeMiNT version +1.16a; older versions of the kernel will treat the SHUT_POWER mode as +SHUT_COLD. +
  + +
On mode equal to SHUT_BOOT (1L), the system will reboot +the machine after shutting everything down. +
  + +
On mode equal to SHUT_COLD (2L), the system will act the +same as with the SHUT_BOOT mode, except that a cold start rather than +the warm start will be performed. +
SHUT_COLD mode is recognized as of FreeMiNT version 1.15.5, older +versions of the kernel will treat the SHUT_COLD as SHUT_BOOT. +
  + +
On mode equal to SHUT_HALT (3L), the system will shut +down, then enter a halted condition. +
  +
All other values of mode are reserved for future definition. +
  +
Older versions of MiNT contained a bug that might cause the +system to crash, if you called Shutdown() while both GEM AES and +virtual console daemon were present. +
  +
You need root privileges to shut the system down. +
  +
Ergebnis: Returns a negative GEMDOS error code, if failed. On success +this call obviously never returns. +
  +
Verfügbar: Seit der ersten in MultiTOS integrierten MiNT Version 1.04. +
  +
Gruppe: Systemfunktionen +
  +
Querverweis: Binding   Sync +
  + +
+ +

5.14.4.1 Bindings für Shutdown

+ + + + + + +
C: void Shutdown ( int32_t mode ); +
  +
Assembler: +
  +
move.l    mode,-(sp)   ; Offset 2
+move.w    #337,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

5.14.5 Slbclose

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Slbclose« - schließt eine "shared lib". +
  +
Gemdosnummer: 23 (0x017) +
  +
Deklaration: int32_t Slbclose( SHARED_LIB *sl ); +
  +
Beschreibung: Die Funktion schließt eine Shared Lib +
  +
Der Parameter sl ist der Deskriptor welcher bei Slbopen +ermittelt wird. +
  +
Seit MagiC 6: Ist sl=-1, dann werden alle Shared +Lib geschlossen. +
  +
Ergebnis: E_OK = Alles OK oder negative GEMDOS-Fehlernummer. +
  +
Verfügbar: Sie steht ab MagiC 5.20 und FreeMiNT 1.15.4 zu Verfügung. +
  +
Gruppe: Systemfunktionen +
  +
Querverweis: Binding   Slbopen   Shared Libraries +
  + +
+ +

5.14.5.1 Bindings für Slbclose

+ + + + + + +
C: int32_t Slbclose( SHARED_LIB *sl ); +
  +
Assembler: +
  +
pea       sl           ; Offset 2
+move.w    #23,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

5.14.6 Slbopen

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Slbopen« - Öffnet eine "shared lib" +
  +
Gemdosnummer: 22 (0x016) +
  +
Deklaration: int32_t Slbopen( int8_t *name, int8_t *path, int32_t min_ver, +SHARED_LIB *sl, SLB_EXEC *fn ); +
  +
Beschreibung: Die Funktion öffnet eine Shared Lib +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
  +
name Der Name der Bibliothek, in Großschrift, inkl. Extension +(".SLB"). Der Bibliotheksname ist gleichzeitig Dateiname. +
  +
path Pfad bei dem zuerst nach der Bibliothek gesucht (der Pfad muß +in MagiC 5.20 mit '\' abgeschlossen sein; dies ist in MagiC 6 nicht +mehr nötig). +
Wenn der Parameter NULL ist oder die Bibliothek im angegebenen +Pfad nicht gefunden wurde, wird im XTENSION-Ordner gesucht. +
Ab MagiC 6 wird die Environment-Variable SLBPATH ausgewertet. Sie +enthält wie PATH eine Liste der Suchpfade, jeweils durch ';' +getrennt. Ist die Variable definiert, wird nicht mehr extra im +XTENSION-Ordner gesucht. +
  +
Bei FreeMiNT wird versucht die Bibliothek aus dem aktuellen +Verzeichnis zu laden, falls path NULL ist. +
  +
min_ver Minimal notwendige Versionsnummer der Bibliothek. +
  +
sl Zeiger auf den Deskriptor. +
  +
fn Zeiger auf den Funktionszeiger. +
  + +
+ +
Ergebnis: +
  + + + + + + + + + + + + + + + +
>= 0 Alles OK, Versionsnummer der Bibliothek. +
+
ERANGE Versionsnummer zu niedrig +
+
EACCDN Bibliothek schon von diesem Prozeß geöffnet +
+
EFILNF Bibliothek nicht gefunden +
+
ENSMEM zuwenig Speicher + +
+ +
Verfügbar: Sie steht ab MagiC 5.20 und FreeMiNT 1.15.4 zu Verfügung. +
  +
Gruppe: Systemfunktionen +
  +
Querverweis: Binding   Slbclose   Shared Libraries +
  + +
+ +

5.14.6.1 Bindings für Slbopen

+ + + + + + +
C: int32_t Slbopen( int8_t *name, int8_t *path, int32_t min_ver, +SHARED_LIB *sl, SLB_EXEC *fn ); +
  +
Assembler: +
  +
pea       fn           ; Offset 18
+pea       sl           ; Offset 14
+move.l    minver,-(sp) ; Offset 10
+pea       path         ; Offset 6
+pea       name         ; Offset 2
+move.w    #22,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+lea       22(sp),sp    ; Stack korrigieren
+
+ +
+ +

5.14.7 Srealloc

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Srealloc« - Bildschirmspeicher allozieren. +
  +
Gemdosnummer: 21 +
  +
Deklaration: int32_t Srealloc ( int32_t len ); +
  +
Beschreibung: Die GEMDOS-Routine Srealloc alloziert für den +Bildschirmspeicher einen Bereich der Länge len Bytes. +
  +
Der Bildschirmspeicher ist ein Block des ST-RAM, dessen Eigner +der Bootprozeß ist. Die Adresse des Bildschirmspeichers (logbase oder +physbase) wird von dieser Funktion nicht beeinflußt. +
  +
Ergebnis: Die Funktion liefert (falls len den Wert -1 besitzt) +die maximal mögliche Größe des Bildschirmspeichers zurück. +
  +
Verfügbar: ab GEMDOS 0.30 (TOS 4). +
  +
Gruppe: Systemfunktionen +
  +
Querverweis: Binding +
  + +
+ +

5.14.7.1 Bindings für Srealloc

+ + + + + + +
C: int32_t Srealloc ( int32_t len ); +
  +
Assembler: +
  +
move.l    len,-(sp)    ; Offset 2
+move.w    #21,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

5.14.8 Ssystem

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Ssystem« - controlling Cookie Jar, memory access and various +system settings. +
  +
Gemdosnummer: 340 (0x0154) +
  +
Deklaration: int32_t Ssystem ( int16_t mode, int32_t arg1, int32_t arg2 ); +
  +
Beschreibung: The Ssystem call has been designed to make your life easier. +Using this you can get some closer control on the system and the kernel +itself. Via this call the kernel now supports e.g. an easy Cookie Jar +management and provides a safe access to supervisor memory. It's +strictly encouraged to access GEMDOS variables and system vectors via +the Ssystem(), because this way is considered safe for multiuser +setups. +
  +
arg1 and arg2 are long parameters specific for a +particular mode. If a mode doesn't use a parameter, it is usually +ignored, but should be set to a zero for future compatibility. mode +specifies a particular action as follows: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
mode meaning +
  + +
S_INQUIRE(0xffff) Returns a zero if the kernel supports Ssystem. You can expect +the function to be present if MiNT version at least 1.15 is detected. +
  + +
S_OSNAME(0x0000) Identifies the operating system type. Returned longword +contains a 32-bit positive number, which interpreted as an ASCII +string gives a 4-character id. For MiNT the returned value is +0x4d694e54 ('MiNT'). +
  + +
S_OSXNAME(0x0001) Identifies the subtype of the operating system. If this call +returns a zero or a negative value, that means, that no subtype is +available. Otherwise the returned value, when interpreted as an ASCII +string gives a 4-character subtype id. For FreeMiNT, being a +derivative of the MiNT, the returned value is 0x46726565 ('Free'). +
  +
If a subtype id is less than 4 characters long, it should be +padded with zeros. +
  + +
S_OSVERSION(0x0002) Identifies the exact operating system version. Returned +longword contains a 32 bit positive version number encoded as follows: +
  + + + + + + + + + + + + + + + + + + +
bits meaning +
    +
0-7 some printable character to characterize the current version, +e.g. + + + + + + +
0x61 (`a') if alpha release, +
0x62 (`b') if beta release. + +
+ +
For official releases you will always find a value of 0 here. +
8-15 patchlevel (0x55 for pl 88) +
16-23 minor version number (0x0e for x.14) +
24-31 major version number (0x01 for 1.xx) + +
+ +
Definition of an official release: every release for which in +bits 0-7 a value of 0 is returned... +
  + +
S_OSHEADER(0x0003) Allows to access the TOS header in order to get some +information from. Current implementation allows to access the first +256 longwords of the header. The address of the required longword, +relative to the begin address of the TOS header, has to be specified +as arg1. Only even values are allowed (bit 0 of the arg1 is masked out +by the kernel). Always a whole longword is returned. +
  + +
S_OSBUILDDATE(0x0004) Returns a 32 bit positive value with the build date encoded as +follows: +
  + + + + + + + + + + + + + + + +
bits meaning +
    +
0-15 binary year (0x07dd for 1998) +
16-23 binary month (0x0c for the December) +
24-31 binary day of the month + +
+ + +
S_OSBUILDTIME(0x0005) Returns a 32 bit positive value with the build time encoded as +follows: +
  + + + + + + + + + + + + + + + + + + +
bits meaning +
    +
0-7 binary seconds +
8-15 binary minutes +
16-23 binary hours +
24-31 day of week + +
+ +
day of week has 1 for Monday, 2 for Tuesday... 7 for Sunday. +
  +
The call should never return a zero in these bits, but if it +does, it should be interpreted as Sunday. +
  + +
S_OSCOMPILE(0x0006) Returns a 32-bit positive value specifying the primary CPU type +the kernel has been compiled for. Encoding: +
  + + + + + + + + + + + + + + + +
bits meaning +
    +
0-7 binary minor CPU ID +
8-15 binary major CPU ID +
16-31 reserved for future definition. + +
+ +
The major ID identifies a particular series of processors. A +value of $00 is assigned to the Motorola 68k series and since kernel +version 1.19 a value of $01 is assigned to the ColdFire processors. +Other values of this field are reserved for future definition. +
  +
The minor CPU ID interpretation depends on the major ID. For 68k +series, values are as follows: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
0x0068000
0x0a68010
0x1468020
0x1e68030
0x2868040
0x3c68060
+
+ +
For the ColdFire series: +
  +

+
+ + + + + + + + + + + + + + + + +
0x00isa_a
0X01isa_a+
0X02isa_b
0X03isa_c
+
+ +
This is not the same as the _CPU cookie value. The _CPU +cookie specifies the CPU physically present in the machine, while the +S_OSCOMPILE indicates the processor type selected at the time when the +system was compiled. In other words, running a 68000-compiled kernel +will return a 0x00 here, even if the machine is running 68040 or +something. +
  + +
S_OSFEATURES(0x0007) Returns a 32-bit positive value specifying the state of kernel +features. Encoding: +
  + + + + + + + + + + + + + + + +
bits meaning +
    +
0 memory protection (1 = turned on) +
1 virtual memory (1 = turned on) +
2-31 reserved for future usage + +
+ +
This call has an informative purpose only and you cannot toggle +anything with it. +
  + +
S_GETCOOKIE(0x0008) Fetches required information from the Cookie Jar. +
  + +
    +
  1. If arg1 is a value bigger than 65535 (0xffff), it is +interpreted as a tag id. The Cookie Jar is searched for such a tag, +then if the tag is found, the corresponding slot value is returned or +-1 otherwise. +
      +

  2. +
  3. If arg1 is a value between 1 and 65535, it is interpreted as a +slot number, not a tag id.Then the corresponding tag id is fetched and +returned or a value of -1 if the specified slot is free or does not +exist at all (a slot number past the end of the Cookie Jar was +specified). The first slot in the Cookie Jar is considered number 1. +
      +

  4. +
  5. If arg1 is equal to a zero, then the Cookie Jar is searched for +the NULL cookie, then the corresponding slot value is returned. +
      +

  6. +
+ +
The place where the value fetched from the Cookie Jar will be +returned is defined by the arg2. If this is a zero, the call returns +its values in the GEMDOS return value (d0). If the arg2 is not a zero, +it is interpreted as a pointer to a memory location, where the slot +tag or its value should be written to. The return value is 0 (E_OK) +then, if everything went OK, or -1 otherwise. +
  +
This behaviour (where arg2 != NULL) is not implemented in MiNT +versions below 1.14.8. +
  + +
S_SETCOOKIE(0x0009) Places a tag id specified by the arg1 with the value of the +arg2 in the Cookie Jar. If a slot with the specified tag id already +exists, it will be replaced with the new value. NULL cookie is +reallocated automatically and its value is adjusted. If there are no +more free slots, no action is performed and ENOMEM is returned +instead. +
  +
S_SETCOOKIE requires root euid, EACCES is returned otherwise and +no action is performed. +
  +
The call refuses to place a cookie (a value of -1 is returned) +whose tag ID contains a zero-byte. +
  + +
S_GETLVAL(0x000a) Fetches and returns a LONGword from the address of supervisor +area specified as a 16-bit, even, unsigned integer value passed as +arg1. Bit 0 and bits 16-31 are masked out (ignored). The call +returns a zero if the value at the specified address has to be +"hidden" from reading. Currently the hidden values are the +initial PC value and the initial stack pointer value stored at +0x00000000 and 0x00000004 respectively. Reading a hidden value may +require root euid. +
  +
If the desired address is LONGword aligned, LONGwords can be +also retrieved from the supervisor area using Setexc. +
  + +
S_GETWVAL(0x000b) Fetches and returns a word from the address of supervisor area +specified as a 16-bit, even, unsigned integer value passed as +arg1. Bit 0 and bits 16-31 are masked out (ignored). The call +returns a zero if the value at the specified address has to be +"hidden" from reading. Currently the hidden values are the +initial PC value and the initial stack pointer value stored at +0x00000000 and 0x00000004 respectively. Reading a hidden value may +require root euid. +
  + +
S_GETBVAL(0x000c) Fetches and returns a byte from the address of supervisor area +specified as a 16-bit unsigned integer value passed as arg1. +Bits 16-31 are masked out (ignored). The call returns a zero if the +value at the specified address has to be "hidden" from +reading. Currently the hidden values are the initial PC value and the +initial stack pointer value stored at 0x00000000 and 0x00000004 +respectively. Reading a hidden value may require root euid. +
  + +
S_SETLVAL(0x000d) Places a LONGword value specified by arg2 at address +specified as 16-bit integer by arg1. Bit 0 and bits 16-31 of +the arg1 are masked out (ignored). Since this call is designed +to manipulate operating system variables located within the supervisor +area (first 32k), it is restricted to root euid and returns EACCES if +called by an unprivileged process. +
  + +
S_SETWVAL(0x000e) Places a word value specified by arg2 at address +specified as 16-bit integer by arg1. Bit 0 and bits 16-31 of +the arg1 are masked out (ignored). Since this call is designed +to manipulate operating system variables located within the supervisor +area (first 32k), it is restricted for root euid and returns EACCES if +called by an unprivileged process. +
  + +
S_SETBVAL(0x000f) Places a byte value specified by arg2 at address +specified as 16-bit integer by arg1. Bits 16-31 of the +arg1 are masked out (ignored). Since this call is designed to +manipulate operating system variables located within the supervisor +area (first 32k), it is restricted for root euid and returns EACCES if +called by an unprivileged process. +
  + +
S_SECLEVEL(0x0010) Resets the current security level to a value specified by +arg1. Valid levels are as follows: +
  +
0: none of hardware specific system calls are restricted. This +is a 'MultiTOS compatibility' mode. +
  +
1: BIOS and XBIOS calls require root privileges; any call +except Supexec and Super returns EACCES if called by an unprivileged +process. This does not apply to Setexc, which sends SIGSYS to the +caller if a change of an exception vector was attempted. +
  +
2: as above, with except that Supexec and Super generates SIGSYS +in order to kill the calling process. +
  +
On values bigger than 2, EACCES is returned. If arg1 is +equal to -1, the current security level value is returned. +
  +
The call absolutely needs root privileges - user processes +cannot even inquire the current security level value. +
  + +
S_RUNLEVEL(0x0011) Reserved for future definition. +
  + +
S_TSLICE(0x0012) Allows setting/interrogating the global timeslice value. Values +are exactly the same as for SLICES keyword in mint.cnf. If +arg1 is equal to -1, the call returns the current global +timeslice value. +
  +
Setting the timeslice requires root privileges. +
  + +
S_FASTLOAD(0x0013) Allows changing the interpretation of the FASTLOAD bit in the +program header. +
  +
On Ssystem(S_FASTLOAD, 0L, 0L); the program header bit will be +used as before, this is actually equal to FASTLOAD=NO in mint.cnf. +
  +
On Ssystem(S_FASTLOAD, 1L, 0L); , the program header bit will be +ignored and fastload will be forced for all programs. +
  +
arg1 = -1 allows interrogation of the current state of +this variable. +
  +
You need root privileges to toggle the FASTLOAD mode. +
  + +
S_SYNCTIME(0x0014) Allows interrogation or changing the global file-system sync +time. The default value is 5 sec. +
  +
If arg1 is a positive value, it is interpreted as a new +sync time value. +
  +
If arg1 is equal to -1, the current sync time value will +be returned. +
  +
To be able to change the file-system sync time you must have +root privileges. +
  + +
S_BLOCKCACHE(0x0015) A positive value of arg1 ranging from 0 to 100 +specifies the percentage of file-system cache to be filled with linear +reads, as in the PERCENTAGE keyword in the mint.cnf file. A negative +value of arg1 returns the currently set percentage value. +
  +
Root privileges are required to use this mode. +
  + +
S_FLUSHCACHE(0x0016) Invalidates CPU cache entries. arg1 is a pointer to the +memory area whose cache entries should be invalidated, arg2 is +the size of the area in bytes. Passing -1 as arg2 invalidates +all cache entries. If the CPU features separate instruction and data +caches, both are flushed. +
  +
This call automatically recognizes caches in 68020/030/040/060 +and handles them as appropriate. The 68060 branch cache is +automatically invalidated too. On 68000/68010 calling this mode has no +effect. This mode is in fact just an interface to the MiNT function +cpush used internally by the system. +
  +
Root privileges are NOT required to use this mode. +
  + +
S_CTRLCACHE(0x0017) Provides an universal (among 68k family members) way of +controlling the CPU on-chip caches. arg1, referenced as Cache +Control Word (CCW), is a bit-field where each bit enables (if 1) or +disables (if 0) a particular function of CPU caches. arg2, +referenced as Cache Control Mask (CCM), is a bit-mask where you define +(by setting appropriate bits to 1) which bits of the Cache Control +Word should be actually taken into account and written into the Cache +Control Register (CACR). This is the control mode of the S_CTRLCACHE. +
  +
In inquire mode you can pass -1 as either argument. If the CCW +is -1, the call returns a LONGword reflecting the actual state of the +caches. +
  +
If the CCM is -1, a default bit-mask is returned, where any bit +set indicates that a cache function defined by the same bit in the +Cache Control Word is valid for the processor the MiNT is currently +running on. +
  +
If both arguments are negative, the call simply returns E_OK if +it is valid at all, or ENOSYS otherwise. This is the acknowledge mode +of the S_CTRLCACHE. +
  +
Bits in either argument are defined as follows: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
020030040060CFv4e
0Enable instruction cachexxxxx
1Enable data cache-xxxx
2Enable branch cache---xx
3Freeze instruction cachexx---
4Freeze data cache-x---
5Instruction burst enable-x---
6Data burst enable-x---
7Enable write allocate-x---
8Instruction cache full mode enable---x-
9Instruction cache read/write allocate---x-
10Data cache full mode enable---x-
11Data cache read/write allocate enable---x-
12Invalidate branch cache---xx
13Invalidate branch cache user entries---x-
14Enable CPUSH invalidate---xx
15Enable store buffer---xx
16Instruction cache invalidate all----x
17Instruction cache mode default----x
18Instruction cache half lock enable----x
19CPUSH invalidate enable (instruction)----x
20Default cache-inhibited fill buffer----x
21Data cache invalidate all----x
22Default data cache mode (bit 0)----x
23Default data cache mode (bit 1)----x
24Data cache half lock enable----x
25-31Reserved for future definition
+
+ +
Note that no processor currently supports all of these functions +and some (68000 and 68010) have no on-chip caches at all. To figure +out what functions are valid for the actual CPU used, you should first +request the default bit-mask using the inquire mode described above. +Your program should save this mask, logically AND the arg2 +with it, then pass the result as the Cache Control Mask for a control +mode call. +
  +
Also note that the above bit definition does not exactly reflect +the function and even position of actual bits in the physical Cache +Control Register. The bits of either argument are arbitrarily assigned +to particular cache functions, but their position and state are +converted by the system before the Cache Control Register is written +and after it is read, so that the user program can see always the same +functions assigned to bits as above regardless of the physical +configuration of the Cache Control Register. +
  +
Since changing cache configuration is global and may severely +affect system performance, root privileges are needed to use +S_CTRLCACHE control mode. +
  + +
S_INITIALTPA(0x0018) A positive non-zero value of arg1 defines the default +amount of memory (in bytes) allocated for TPA space, as in the +INITIALMEM keyword of the mint.cnf file. A negative value allows one +to interrogate the value currently set. A value of 0 is illegal and +will cause the call to fail and return EBADARG. Note that even if you +define a very small value, like 1 or 2 bytes, the system will round +this up to the smallest size of a memory block possible to allocate. +
  +
Root privileges are required to use this mode. +
  + +
S_CTRLALTDEL(0x0019) Reserved for future definition. +
  + +
S_DELCOOKIE(0x001a) Removes a tag ID specified by arg1 from the cookie jar. +If there is no slot with the specified tag ID, no action is performed +and EINVAL is returned instead. +
  +
S_DELCOOKIE requires root euid, EPERM is returned otherwise and +no action is performed. +
  + +
S_LOADKBD(0x001b) Load the keyboard table into memory. arg1 specify the +address of the complete path to the keyboard table or NULL. If path is +NULL the default path of <sysdir>/keyboard.tbl is used. Returns +a negative GEMDOS error-code if it fails. On success this call returns +0 and _AKP and _ISO cookies are updated. +
  +
S_LOADKBD requires root euid, EPERM is returned otherwise and no +action is performed. +
  + +
S_SETEXC(0x001c) Allow Setexc(). Valid argc1 values are as follows: +
  + + + + + + + + + + + + + + + + + + +
Value Meaning +
    +
-1 Return the current setting +
0 Deny all (only kernel-processes may change sys-vectors) +
1 Deny trap-changes (numbers 0-15) +
2 Allow all (default) + +
+ +
Returns EBADARG if arg1 is greater than 2, or 0 on +success. +
  +
S_SETEXC requires root euid, EPERM is returned otherwise and no +action is performed. +
  + +
S_GETBOOTLOG(0x001d) Inquires the file path of bootlog file. arg1 and +arg2 specify the address and length in bytes, respectively, of +a memory buffer where a NULL-terminated ASCII string will be written +identifying the full name of the bootlog file. If the memory buffer is +not long enough to hold the entire string, the string is truncated +down to the buffer size. Returns EBADARG if arg1 is null or if +arg2 is 0. On success this call returns 0. +
  +
S_GETBOOTLOG requires root euid, EPERM is returned otherwise and +no action is performed. +
  + +
S_CLOCKUTC(0x0064) S_CLOCKUTC called with an arg1 of -1 inquires the +kernel's notion of the hardware system clock. If the command returns a +zero, the hardware clock is considered to tick in UTC; if it returns a +positive non-zero value, it is considered to tick in local time. Any +other positive value of arg1 sets the current clock mode. On a +0 it is reset to UTC, or to local time otherwise. +
  +
Although this call will never really change the setting of the +hardware clock, due to the changed interpretation the clock seems to +warp; don't play around too much with it. +
  + +
S_KNAME(0x0384) arg1 and arg2 specify the address and length in +bytes, respectively, of a memory buffer where a NULL-terminated ASCII +string will be written identifying the full name and version of the +system kernel. If the memory buffer is not long enough to hold the +entire string, the string is truncated down to the buffer size. +
  + +
S_CNAME(0x038e) arg1 and arg2 specify the address and length in +bytes, respectively, of a memory buffer where a NULL-terminated ASCII +string will be written identifying the full name of the compiler used +to compile the system kernel. If the memory buffer is not long enough +to hold the entire string, the string is truncated down to the buffer +size. +
  + +
S_CVERSION(0x038f) arg1 and arg2 specify the address and length in +bytes, respectively, of a memory buffer where a NULL-terminated ASCII +string will be written identifying the version of the compiler used to +compile the system kernel. If the memory buffer is not long enough to +hold the entire string, the string is truncated down to the buffer +size. +
  + +
S_CDEFINES(0x0390) arg1 and arg2 specify the address and length in +bytes, respectively, of a memory buffer where a NULL-terminated ASCII +string will be written containing the compile time definitions +(switches) used while compiling the system kernel. If the memory +buffer is not long enough to hold the entire string, the string is +truncated down to the buffer size. +
  + +
S_COPTIM(0x0391) arg1 and arg2 specify the address and length in +bytes, respectively, of a memory buffer where a NULL-terminated ASCII +string will be written containing the compile time optimization +options used while compiling the system kernel. If the memory buffer +is not long enough to hold the entire string, the string is truncated +down to the buffer size. +
  + +
S_DEBUGLEVEL(0x03e8) S_DEBUGLEVEL called with an arg1 of -1 inquires the +kernel's current debug level. Any other positive value will set the +current debug level. If it is a zero, the kernel will not output any +debugging information, except for fatal error-messages. The higher the +debug level, the more MiNT will spew about what it is doing. +
  +
Note that special debug kernels will output more information +than an ordinary distribution kernel. +
  +
Root privileges are needed to change the debug level. +
  + +
S_DEBUGDEVICE(0x03e9) S_DEBUGDEVICE called with an arg1 of -1 inquires the +current BIOS device to output the debug information to. The order of +defined BIOS devices is as follows: +
  +
    +
  • 0, printer +
  • +
  • 1, AUX: +
  • +
  • 2, console (default) +
  • +
  • 3, MIDI +
  • +
  • 4, keyboard +
  • +
  • 5, raw screen +
  • +
+ +
Any positive value of arg1, ranging from 0 to 9, will +redirect the debug information output to an appropriate BIOS device. +Notice however, that setting device 4 (keyboard) as a debug device +does not make much sense and may produce undesired results. The system +does not restrict this in any way though, just assuming that you know +what you're doing. +
  +
Root privileges are needed to change the debug device. +
  + +
S_DEBUGKMTRACE(0x044c) Dump out kmalloc'ed blocks with size and caller (debug kernel). +arg1 specify the address of the kmalloc'ed block to check and +arg2 specify the memory buffer where the dump will be written. +Returns ENOENT if it fails. On success this call returns 0. +
  +
S_DEBUGKMTRACE requires root euid, EPERM is returned otherwise +and no action is performed. +
  + +
S_TIOCMGET(0x54f8) This mode is reserved for the internal and exclusive usage of +the MiNT Library. +
  + +
+ +
Ssystem was first introduced as of MiNT version 1.14.6, but it +is considered fully functional as of MiNT version 1.15.0 release. +
  +
The S_OSHEADER opcode should be only used for fetching the +TOS version number when running MiNT versions below 1.15.0 release. +
  +
The S_FLUSHCACHE, S_CTRLCACHE, S_DEBUGLEVEL and S_DEBUGDEV are +supported as of MiNT version 1.15.1 release. +
  +
You should never use Ssystem(S_TIOCMGET, ...); in your own +programs. +
  +
The Ssystem behaviour does not depend on the S_SECLEVEL +settings. +
  +
Any values returned by the kernel on reserved fields should be +considered undocumented and no software should rely on them. +
  +
It's strictly encouraged to access GEMDOS variables and system +vectors via the Ssystem, because this way is considered safe for +multi-user setups. For example, you can access the cookie jar pointer +using the call Ssystem(S_GETLVAL, 0x05a0, NULL), though if +TOS-compatibility is the issue you should rather use (2, -1). +
  +
Prior to any further Ssystem usage, your application should +first check if the kernel supports this call. If it does, the +Ssystem(-1, 0L, 0L); should return a zero. +
  +
Ssystem is used and supported by the MiNT Library as of +patchlevel 48. +
  +
Ergebnis: +
  +
Verfügbar: Available when a 'MiNT' cookie with a version of at least 1.15 +exists. +
  +
Gruppe: Systemfunktionen +
  +
Querverweis: Binding   Tgettimeofday   Tsettimeofday +
  + +
+ +

5.14.8.1 Bindings für Ssystem

+ + + + + + +
C: int32_t Ssystem ( int16_t mode, int32_t arg1, int32_t arg2 ); +
  +
Assembler: +
  +
move.l    arg2,-(sp)   ; Offset 8
+move.l    arg1,-(sp)   ; Offset 4
+move.w    mode,-(sp)   ; Offset 2
+move.w    #340,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+lea       $0c(sp),sp   ; Stack korrigieren
+
+ +
+ +

5.14.9 STEFcntrl

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »STEFcntrl« - STEmulator Kontrollfunktionen +
  +
Gemdosnummer: 24000 (0x5DC0) +
  +
Deklaration: int32_t STEFcntrl ( int16_t func, int32_t special1, int32_t +special2 ); +
  +
Beschreibung: +
  +
SET_INFOTEXT (1) +
special1 = (int8_t *) Zeiger auf neue Infozeile +
special2 = (int8_t *) Zeiger auf alte Infozeile +
  +
Der String auf den special1 zeigt, wird als neue +Infozeile in die Status-Zeile des STEmulator übernommen. Ein Wert von +NULL schaltet wieder auf die Standard-Anzeige zurück. +
  +
Wenn in special2 ein gültiger Zeiger auf einen Buffer +übergeben wird, enthält dieser nach dem Funktionsaufruf den alten +Text der Infozeile. Bei NULL, passiert nichts. +
  +
SET_WINDOWTITLE (2) +
special1 = (int8_t *) Zeiger auf neue Titelzeile +
special2 = (int8_t *) Zeiger auf alte Titelzeile +
  +
Der String auf den special1 zeigt, wird als neue Titel +des STEmulator-Fenster übernommen. +
  +
Wenn in special2 ein gültiger Zeiger auf einen Buffer +übergeben wird, enthält dieser nach dem Funktionsaufruf den alten +Fenstertitel. Bei NULL, passiert nichts. +
  +
Ergebnis: EINVFN = Unbekannte Funktion +
ERANGE = ungültiger Parameter +
  +
Verfügbar: STEmulator +
  +
Gruppe: Systemfunktionen +
  +
Querverweis: Binding +
  + +
+ +

5.14.9.1 Bindings für STEFcntrl

+ + + + + + +
C: int32_t STEFcntrl ( int16_t func, int32_t special1, int32_t +special2 ); +
  +
Assembler: +
  +
move.l    special2,-(sp)   ; Offset 8
+move.l    special1,-(sp)   ; Offset 4
+move.w    func,-(sp)       ; Offset 2
+move.w    #24000,-(sp)     ; Offset 0
+trap      #1               ; GEMDOS aufrufen
+lea       $0c(sp),sp       ; Stack korrigieren
+
+ +
+ +

5.14.10 Super

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »supervisor« - Supervisor-Modus umschalten. +
  +
Gemdosnummer: 32 (0x0020) +
  +
Deklaration: int32_t Super ( void *stack ); +
  +
Beschreibung: Die GEMDOS-Routine Super schaltet zwischen User- und +Supervisor-Modus um bzw. fragt den aktuellen Betriebsmodus ab. +
  +
Die Adresse des Supervisor-Stacks kann beim Umschalten +verändert werden. übergibt man für den Parameter stack den +Wert 1, so wird der aktuelle Betriebsmodus erfragt. Der Wert 0 +schaltet zwischen User und Supervisor-Modus um. Alle anderen Werten +werden als neue Adresse für den Supervisor-Stack betrachtet. Im +Supervisor-Modus kann auf alle geschützten Speicherstellen +zugegriffen werden. +
  +
Hinweis: Im Hinblick auf zukünftige +Betriebssystemversionen sollten Sie den Einsatz der Super-Funktion +vermeiden. Diese Funktion verursacht im Zusammenhang mit virtuellem +Speicher und unterbrechbaren (und reentranten) Dateisystemen in einem +Multitaskingsystem große Probleme. Stellen Sie ggf. Ihren Code so um, +daß Sie die BIOS-Funktion Supexec verwenden können. +
  +
Für MiNT gilt: +
If you are in SECURELEVEL > 1, you must have root privileges to +get into supervisor mode. If you don't have them and call Super, the +SIGSYS signal (12) will be raised. +
  +
Ergebnis: Sollte der Zustand ermittelt werden, erhält man als Resultat 0 +für den User- und -1 für den Supervisor-Modus. Ansonsten liefert die +Funktion als Ergebnis die Adresse des alten Supervisor-Stacks, sofern +in den Supervisor-Modus umgeschaltet wurde. +
  +
Verfügbar: Alle GEMDOS Versionen +
  +
Gruppe: Systemfunktionen +
  +
Querverweis: Binding   Supexec +
  + +
+ +

5.14.10.1 Bindings für Super

+ + + + + + +
C: int32_t Super ( void *stack ); +
  +
Assembler: +
  +
pea       stack        ; Offset 2
+move.w    #32,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

5.14.10.2 Hinweis zur Verwendung der GEMDOS-Funktion Super

+

Die Funktion Super setzt bei der Umschaltung in den +Supervisor-Modus den Super-Stackpointer auf den User-Stack des +Programms. Das kann fatal sein, da das Programm nicht wissen kann, wie +groß ein Super-Stackbereich sein muß. Ein zu kleiner Stack kann zu +Fehlverhalten, Abstürzen o.ä. führen. Der Super-Stack liegt nicht +mehr in einem möglicherweise durch Speicherschutzmechanismen +gesicherten Bereich, kann also durch das Programm zerstört werden. +

+

Ein Teil des User-Stacks könnte durch virtuelle +Speichermechanismen ausgelagert worden sein. Ein ausgelagerter +Super-Stack bedeutet Prozessorhalt, da der MC-680x0 Prozessor seine +bei Exceptions übliche Sicherung des CPU-Status auf den Super-Stack +nicht mehr durchführen kann und dann absichtlich stehenbleibt. Kein +Anwendungsprogrammierer sollte es sich anmaßen, dem System irgendeine +Beschränkung der Supervisor-Stackgröße aufzuerlegen. +

+

Querverweis: GEMDOS   Supexec +

+

5.14.11 Suptime

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Suptime« - returns the current uptime and load averages from +the system. +
  +
Gemdosnummer: 319 (0x013f) +
  +
Deklaration: int32_t Suptime ( int32_t *uptime, int32_t *loadaverage ); +
  +
Beschreibung: This function returns the current uptime and load averages from +the system. +
  +
uptime is a pointer to a LONG value that will be filled +with the current amount of seconds elapsed since last reboot. +
  +
loadaverage is a pointer to a three longword array, that +will be filled with the current load averages (for last 1, 5 and 15 +minutes). +
  +
The load average value is calculated using the following +formula: +
  +
sum += (new_load - old_load) * LOAD_SCALE; +
load_avg = sum / MAX_SIZE; +
  +
where LOAD_SCALE is 2048, MAX_SIZE is the number of 5 second +periods in the specified amount of time (12 for 1 min., 60 for 5 min. +and 180 for 15 min). new_load is the number of currently running +processes, old_load is the number of processes running previous time. +A 'running' process is considered the one which is put onto run or +ready queue. +
  +
Ergebnis: Returns E_OK or a negative GEMDOS error code otherwise +(actually it may be only ENOSYS if the call is not supported...). +
  +
Verfügbar: Available when a 'MiNT' cookie with a version of at least 1.11 +exists. +
  +
Gruppe: Systemfunktionen +
  +
Querverweis: Binding +
  + +
+ +

5.14.11.1 Bindings für Suptime

+ + + + + + +
C: int32_t Suptime ( int32_t *uptime, int32_t *loadaverage ); +
  +
Assembler: +
  +
pea       loadaverage  ; Offset 6
+pea       uptime       ; Offset 4
+move.w    #48,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+lea       $0a(sp),sp   ; Stack korrigieren
+
+ +
+ +

5.14.12 Sversion

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »operating system version« - ermittelt die Nummer der +GEMDOS-Version. +
  +
Gemdosnummer: 48 +
  +
Deklaration: uint16_t Sversion ( void ); +
  +
Beschreibung: Die GEMDOS-Routine Sversion ermittelt die Versionsnummer des +GEMDOS. Zur Zeit sind folgende Versionen bekannt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Version Erklärung +
  +
0.13 Findet sich in TOS 1.00 und 1.02. Diese Version zeichnet sich +durch etliche Fehler aus, sollte daher nicht mehr benutzt werden. +
  +
0.14 Nummer des Turbo-DOS, welches für eine kurze Zeit von Atari +mit Festplatten ausgeliefert wurde. Schnell, aber auch sehr unsicher. +Auch KAOS 1.2.x besitzt diese Versionsnummer +
  +
0.15 Findet sich in TOS 1.04 und 1.06. Diese Version ist relativ +schnell und stabil. +
  +
0.16 KAOS 1.4.x +
  +
0.17 Findet sich in TOS 1.62. Der Unterschied zur Version 0.15 liegt +lediglich darin, daß das Patchprogramm POOLFIX3.PRG nicht mehr +benötigt wird. +
  +
0.19 Findet sich in TOS 2.01, 2.05, 2.06, 3.01, 3.05, 3.06. Diese +Version wurde im wesentlichen um Funktionen zur Verwaltung des +Alternate-Memory erweitert, und wird auch von MagiC bis Version 6.10 +angezeigt. +
  +
0.20 TOS 2.06 bis TOS 2.95 und TOS 3.06 haben die GEMDOS-Version +0.20. Einzige bislang bekannte Änderung: Medien mit nur einer FAT +werden unterstützt. +
MagiC 6.20 gibt ebenfalls 0.20 zurück. +
  +
0.30 TOS 4.00 bis 4.04, auch MultiTOS 1.00 und 1.08. +
  +
0.31 Milan-TOS 4.05. Mxalloc() ignoriert Bit 2 bis 15 von mode. +
  +
0.32 Milan-TOS 4.08, Release 08.07.1999 +
  +
0.33 Milan-TOS 4.08, Release 15.06.2001 +
  +
0.40 FreeMiNT +
  + +
+ +
Ergebnis: Die Funktion liefert die genannte Versionsnummer, und zwar wie +folgt: +
  + + + + + + +
Low-Byte : Haupt-Versionsnummer +
High-Byte : Neben-Versionsnummer + +
+ +
Der Wert wird im BCD Format geliefert. +
  +
Verfügbar: Alle GEMDOS Versionen +
  +
Gruppe: Systemfunktionen +
  +
Querverweis: Binding   Sysconf   TOS Liste +
  + +
+ +

5.14.12.1 Bindings für Sversion

+ + + + + + +
C: uint16_t Sversion ( void ); +
  +
Assembler: +
  +
move.w    #48,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

5.14.13 Syield

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Syield« - CPU für andere Prozesse freigeben. +
  +
Gemdosnummer: 255 +
  +
Deklaration: void Syield ( void ); +
  +
Beschreibung: Durch den Aufruf dieser Funktion, gibt ein Prozeß die CPU ab, +so daß anderen Prozessen diese (möglicherweise früher als geplant) +zugeteilt werden kann. +
  +
Hinweis: Unter MagiC ruft diese Funktion direkt die +AES-Routine appl_yield auf, und wird im Auto-Ordner ignoriert. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Sie steht in MagiC ab Version 3.0 und wenn der MiNT Cookie +vorhanden ist zur Verfügung. +
  +
Gruppe: Systemfunktionen +
  +
Querverweis: Binding   Pause   Fselect +
  + +
+ +

5.14.13.1 Bindings für Syield

+ + + + + + +
C: void Syield ( void ); +
  +
Assembler: +
  +
move.w    #255,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

5.14.14 Sync

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Sync« - synchronisiert alle gemounteten Dateisysteme. +
  +
Gemdosnummer: 336 (0x0150) +
  +
Deklaration: void Sync ( void ); +
  +
Beschreibung: Die Funktion synchronisiert alle gemounteten Dateisysteme. +
  +
Achtung: In MagiC wird diese Funktion mit Ssync +bezeichnet. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Verfügbar: MagiC ab Version 4.01 und seit der ersten in MultiTOS +integrierten MiNT Version 1.04. +
  +
Gruppe: Systemfunktionen +
  +
Querverweis: Binding   Shutdown +
  + +
+ +

5.14.14.1 Bindings für Sync

+ + + + + + +
C: void Sync ( void ); +
  +
Assembler: +
  +
move.w    #336,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

5.14.15 Sysconf

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Sysconf« - Informationen über die Konfiguration des +Betriebssystems ermitteln. +
  +
Gemdosnummer: 290 +
  +
Deklaration: int32_t Sysconf ( int16_t n ); +
  +
Beschreibung: Die Funktion liefert Informationen über die Möglichkeiten +(bzw. die Konfiguration) des Betriebssystems. Über den Parameter +n lassen sich die verschiedenen Werte abfragen: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
n Bedeutung +
    +
-1 max. legaler Wert für n selbst. +
 0 max. Wert von Speicherbereichen pro Prozeß. +
 1 max. Länge der Kommandozeile für Pexec. +
 2 max. Anzahl offener Dateien pro Prozess. +
 3 max. Anzahl der Supplementary-Groups pro Prozess. +
 4 max. Anzahl der Prozesse je Benutzer. +
 5 HZ (CLK_TCK). +
 6 Größe einer Speicherseite. +
 7 verfügbare physikalische Seiten. +
 8 Größe des Passwort-Puffers. +
 9 Größe des Gruppe-Puffers. + +
+ +
Ein Rückgabewert von 0x7fffffff (2^31 - 1) bedeutet, daß der +entsprechende Wert unbegrenzt ist. +
Achtung: MagiC gibt -1 für unbegrenzte Werte zurück. +
  +
Ergebnis: Die Funktion liefert die durch den Parameter n +spezifizierte Information zurück. +
  +
Verfügbar: Seit der ersten in MultiTOS integrierten MiNT Version 1.04. +
  +
Gruppe: Systemfunktionen +
  +
Querverweis: Binding   Dpathconf +
  + +
+ +

5.14.15.1 Bindings für Sysconf

+ + + + + + +
C: int32_t Sysconf ( int16_t n ); +
  +
Assembler: +
  +
move.w    n,-(sp)      ; Offset 2
+move.w    #290,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +
+ +Home +GEMDOSGEMDOS +NetzwerkfunktionenNetzwerkfunktionen +VerzeichnisfunktionenVerzeichnisfunktionen + + diff --git a/de/gemdos_tpa.html b/de/gemdos_tpa.html new file mode 100644 index 000000000..3108390f9 --- /dev/null +++ b/de/gemdos_tpa.html @@ -0,0 +1,93 @@ + + + + + +Die Anleitung zum TOS: Programmstart und TPA + + + + + + + + + +Home +GEMDOSGEMDOS +Das ProgrammformatDas Programmformat +SignaleSignale + +
+ +

5.6 Programmstart und TPA

+ + +

Zu Beginn eines Programms ist es sehr wichtig überflüssigen +Speicher per Mshrink an das Betriebssystem zurückzugeben, da +anderenfalls kein Speicherplatz mehr für andere Prozesse zur +Verfügung steht. +

+

Ein Compiler übernimmt diese Aufgabe normalerweise automatisch; +als Assembler-Programmierer muss man diese Prozedur jedoch selbst +durchführen. Die entsprechende Routine könnte wie folgt aussehen: +

+
            .text
+
+            move.l    4(sp),a0      ; Zeiger auf BASEPAGE
+            lea       mystack,sp    ; Stack-Pointer setzen
+            move.l    #$100,d0      ; Länge der Basepage
+            add.l     $c(a0),d0     ; Länge des Text-Segments
+            add.l     $14(a0),d0    ; Länge des Data-Segments
+            add.l     $1c(a0),d0    ; Länge des BSS-Segments
+            move.l    d0,-(sp)      ; Ergebnis auf dem Stack
+            move.l    a0,-(sp)      ; Basepage-Adresse auf Stack
+            clr.w     -(sp)         ; Füllparameter
+            move.w    #$4a,-(sp)    ; Mshrink
+            trap      #1            ; GEMDOS aufrufen
+            lea       $c(sp),sp     ; Stack korrigieren
+            jsr       main          ; Hauptprogramm aufrufen
+            move.w    d0,-(sp)      ; Return-Wert des Programms
+            move.w    #$4c,-(sp)    ; Pterm
+            trap      #1            ; GEMDOS aufrufen
+
+            .bss
+
+            .ds.l     2000          ; 8000 Bytes Stack
+mystack:    .ds.l     2
+
+

Im Klartext: Der benötigte Speicherplatzbedarf wird +errechnet, indem die Länge der Basepage, des Text-, Data- und +BSS-Segments sowie ggfs. des Stacks aufaddiert werden. Alle +notwendigen Angaben befinden sich in der Basepage, deren Adresse als +Parameter auf dem Stack (4(sp)) mitgeteilt wird. Der errechnete Wert +ist dann die Anzahl der Bytes, auf die die TPA (Transient Program +Area, Speicherbereich eines Programms) geschrumpft werden kann. +

+

Nach Ausführung dieser Prozedur besitzt die TPA eines +Programms dann die folgende Gestalt: +

+

+

Der so freigegebene Speicherplatz kann nun vom GEMDOS für +andere Zwecke genutzt werden: etwa zum Starten weiterer Programme, +oder um Speicheranforderungen per Malloc bzw. Mxalloc zu befriedigen. +

+ + +

Auch bei einem TSR-Programm (Terminate and Stay Resident) kann +der benötigte Speicherplatz nach der oben angegebenen Methode +berechnet werden; der einzige Unterschied ist, daß Programme dieser +Art sich nicht per Pterm sondern per Ptermres beenden, und +sich dadurch resident im Speicher verankern. +

+

Querverweis: BASEPAGE   Speicherverwaltung +

+
+ +Home +GEMDOSGEMDOS +Das ProgrammformatDas Programmformat +SignaleSignale + + diff --git a/de/gemdos_trap.html b/de/gemdos_trap.html new file mode 100644 index 000000000..d146fece2 --- /dev/null +++ b/de/gemdos_trap.html @@ -0,0 +1,62 @@ + + + + + +Die Anleitung zum TOS: gemdos-Trap + + + + + + + + + +Home +GEMDOSGEMDOS +SignaleSignale +DateifunktionenDateifunktionen + +
+ +

5.8 gemdos-Trap

+ + + + + + + + + + + + + + + + +
Name: »gemdos« - GEMDOS-Trap ausführen. +
  +
Deklaration: LONG gemdos ( VOID , ... ); +
  +
Beschreibung: Die Routine gemdos führt einen TRAP #1 durch. Die übergebenen +Parameter hängen von der jeweiligen GEMDOS-Funktion ab. +
  +
Ergebnis: Die Funktion liefert als Ergebnis einen Wert vom Datentyp LONG. +
  +
Querverweis: bios   xbios   GEMDOS   Dispatcher +
  + +
+ +
+ +Home +GEMDOSGEMDOS +SignaleSignale +DateifunktionenDateifunktionen + + diff --git a/de/geneva_function.html b/de/geneva_function.html new file mode 100644 index 000000000..fd0dcd642 --- /dev/null +++ b/de/geneva_function.html @@ -0,0 +1,1542 @@ + + + + + +Die Anleitung zum TOS: Geneva Funktionen + + + + + + + + + +Home +AESAES +FormularfunktionenFormularfunktionen +GrafikfunktionenGrafikfunktionen + +
+ +

8.12 Geneva Funktionen

+

Diese Bibliothek enthält spezielle Funktionen, welche nur unter +Geneva zur Verfügung stehen. +

+ + + + + + + + + + + + + + + + + + + + + + + + +
x_help Start the Help display program. +
x_malloc Speicherplatz reservieren von Geneva. +
x_mfree Freigeben des Speicherplatz welcher mit x_malloc reserviert +wurde. +
x_mshrink Shrink a memory block with x_malloc. +
x_realloc Change the size of memory allocated with x_malloc. +
x_settings Get or set Geneva's internal settings. +
x_sprintf Print data to a string. +
x_sscanf Read formatted data from a string. + +
+ +

Querverweis: AES +

+

8.12.1 x_help

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Geneva help« - Inform the Help display program of a request +for help text. +
  +
AES-Nummer: 29061 +
  +
Deklaration: int16_t x_help( int8_t *topic, int8_t *helpfile, int16_t +sensitive ); +
  +
Beschreibung: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
topic Help topic to search for +
helpfile GEMDOS file name to search first for the help topic, or NULL to +search only GENEVA.HLP. +
sensitive 0 = topic is not case-sensitive + +
+ +
This function is used by a program to provide online help for +its features. +
  +
Geneva begins by checking to see if the help display program is +already in memory. If it is not, then it is loaded from disk by way of +the SHOWHELP environmental variable, as set in GEM.CNF. +
  +
Once the program is in memory, it is sent a message containing +the values passed in the x_help function call. The user is then either +shown the help text, or an error message saying that the topic was not +found. +
  +
The topic parameter points to a NUL-terminated string +containing the help topic to search for. If sensitive is +non-zero, then the case (upper/lower) of the topic must exactly match +what is stored in the help file. If, however, sensitive is zero, both +the case-sensitive and case-insensitive sections of the help file are +searched for the topic. +
  +
filename points to a NUL-terminated string describing +the path and file name of the default help file to search for the +topic. If no path information is used, then the PATH environmental +variable is searched (by way of shel_find) for the file. If this file +is not found, or the topic is not found in the file, the user receives +an error message. If filename is NULL (0L), then the topic is only +searched for in GENEVA.HLP. +
  +
Ergebnis: An error code (0) is returned if either the help program could +not be loaded, or there was insufficient free memory to send the +message. +
  +
Verfügbar: Die Funktion steht nur unter Geneva zur Verfügung. +
  +
Gruppe: Geneva Funktionen +
  +
Querverweis: Binding +
  + +
+ +

8.12.1.1 Bindings für x_help

+ + + + + + + + + +
C: int16_t x_help( int8_t *topic, int8_t *helpfile, int16_t +sensitive ); +
  +
Umsetzung: +
  +
int16_t x_help( int8_t *topic, int8_t *helpfile, int16_t
+sensitive )
+{
+   int_in[0] = sensitive
+   addr_in[0] = topic;
+   addr_in[1] = helpfile;
+
+   crys_if(29061);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]29061 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]sensitive
addr_inaddr_in[0]topic
addr_in+4addr_in[1]helpfile
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.12.2 x_malloc

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »memory allocation« - Speicherplatz reservieren von Geneva. +
  +
AES-Nummer: 29062 +
  +
Deklaration: void x_malloc( void **addr, int32_t size ); +
  +
Beschreibung: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
size Number of bytes to be reserved +
addr Pointer to a pointer which receives the address of an allocated +block, or 0L + +
+ +
This function allocates memory, much in the same way Malloc or +malloc does. The only major difference is that it comes without the +extra overhead of malloc. Since Geneva takes this memory from the same +pool as the rest of its memory, it is also not as likely to cause +memory fragmentation if the application allocates lots of small blocks +using this call as it is when doing so with Malloc. +
  +
If no memory could be allocated, the addr is set to NULL +(0L). +
  +
Unlike the GEMDOS Malloc function, this function does not accept +the "size" -1L. +
  +
Ergebnis: Die Funktion hat keinen Rückgabewert. +
  +
Verfügbar: Die Funktion steht nur unter Geneva seit Release 004 zur +Verfügung. +
  +
Gruppe: Geneva Funktionen +
  +
Querverweis: Binding +
  + +
+ +

8.12.2.1 Bindings für x_malloc

+ + + + + + + + + +
C: void x_malloc( void **addr, int32_t size ); +
  +
Umsetzung: +
  +
void x_malloc( void **addr, int32_t size )
+{
+   (int32_t)int_in[0] = size;
+
+   addr_in[0] = addr;
+
+   crys_if(29062);
+
+   return;
+}
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]29062 # Opcode der Funktion
control+2control[1]2 # Einträge in int_in
control+4control[2]0 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]MSW of the size
int_in+2int_in[1]LSW of the size (lower 16 bits)
addr_inaddr_in[0]addr
+
+ + +
+ +

8.12.3 x_mfree

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »memory free« - Free memory allocated with x_malloc. +
  +
AES-Nummer: 29063 +
  +
Deklaration: int16_t x_mfree( void *addr ); +
  +
Beschreibung: +
  + + + + + + + + + +
Parameter Bedeutung +
    +
addr Pointer to a memory block previously allocated with x_malloc. + +
+ +
Ergebnis: 0 = Erfolgreich +
sonst = Fehler +
  +
Verfügbar: Die Funktion steht nur unter Geneva seit Release 004 zur +Verfügung. +
  +
Gruppe: Geneva Funktionen +
  +
Querverweis: Binding +
  + +
+ +

8.12.3.1 Bindings für x_mfree

+ + + + + + + + + +
C: int16_t x_mfree( void *addr ); +
  +
Umsetzung: +
  +
int16_t x_mfree( void *addr )
+{
+   addr_in[0] = addr;
+
+   crys_if(29063);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]29063 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]addr
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.12.4 x_mshrink

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »memory shrink« - Shrink a memory block allocated with +x_malloc. +
  +
AES-Nummer: 29064 +
  +
Deklaration: int16_t x_mshrink( void *addr, int32_t newsize ); +
  +
Beschreibung: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
addr Pointer to a memory block previously allocated with x_malloc. +
newsize New size of the memory block. + +
+ +
This function shrinks (decreases the size of) a block of memory +previously allocated with the x_malloc function. The newsize +must be less than the original size, or Failure will be returned. +
  +
Ergebnis: 0 = Erfolgreich +
sonst = Fehler +
  +
Verfügbar: Die Funktion steht nur unter Geneva seit Release 004 zur +Verfügung. +
  +
Gruppe: Geneva Funktionen +
  +
Querverweis: Binding +
  + +
+ +

8.12.4.1 Bindings für x_mshrink

+ + + + + + + + + +
C: int16_t x_mshrink( void *addr, int32_t newsize ); +
  +
Umsetzung: +
  +
int16_t x_mshrink( void *addr, int32_t newsize )
+{
+   int_in[0-1] = newsize;    /* int_in[0] MSW of the size */
+                             /* int_in[1] LSW of the size (lower 16 bits) */
+   addr_in[0] = addr;
+
+   crys_if(29064);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]29064 # Opcode der Funktion
control+2control[1]2 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]newsize; MSW of the size
int_in+2int_in[1]newsize; LSW of the size (lower 16 bits)
addr_inaddr_in[0]addr
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.12.5 x_realloc

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »memory realloc« - Change the size of memory allocated with +x_malloc. +
  +
AES-Nummer: 29065 +
  +
Deklaration: int16_t x_realloc( void **addr, int32_t newsize ); +
  +
Beschreibung: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
addr Pointer to a memory block previously allocated with x_malloc. +
newsize New size of the memory block. + +
+ +
This function changes the size of a block of memory previously +allocated with the x_malloc function. If newsize is greater +than the block's original size, it may be necessary for Geneva to move +the block to a new location. If there is insufficient free memory to +increase the size of the block, the "old" block continues to +reside where it was and an error code is returned. +
  +
Ergebnis: 0 = Erfolgreich +
sonst = Fehler +
  +
Verfügbar: Die Funktion steht nur unter Geneva seit Release 004 zur +Verfügung. +
  +
Gruppe: Geneva Funktionen +
  +
Querverweis: Binding +
  + +
+ +

8.12.5.1 Bindings für x_realloc

+ + + + + + + + + +
C: int16_t x_realloc( void **addr, int32_t newsize ); +
  +
Umsetzung: +
  +
int16_t x_realloc( void **addr, int32_t newsize )
+{
+   int_in[0-1] = newsize;    /* int_in[0] MSW of the size */
+                             /* int_in[1] LSW of the size (lower 16 bits) */
+   addr_in[0] = addr;
+
+   crys_if(29065);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]29065 # Opcode der Funktion
control+2control[1]2 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]newsize; MSW of the size
int_in+2int_in[1]newsize; LSW of the size (lower 16 bits)
addr_inaddr_in[0]addr
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.12.6 x_settings

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Geneva settings« - Get or set Geneva's internal settings. +
  +
AES-Nummer: 29056 +
  +
Deklaration: int16_t x_settings ( int16_t getset, int16_t length, SETTINGS +*user ); +
  +
Beschreibung: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
getset 0 = Get, 1 = Set, -1 = Reset +
length length of bytes to get or set +
user Points to SETTINGS to get or set, or NULL + +
+ +
0: Get +
Read length bytes (or the maximum length of the SETTINGS +structure.) Setting length to a negative number will read the whole +structure, though this is not recommended since future versions may +expand the SETTINGS structure. +
  +
Example: +
  +
SETTINGS set;
+x_settings ( 0, sizeof(set), &set );
+
+
1: Set +
Set length bytes (or the maximum length of the SETTINGS +structure.) Setting length to a negative number will set the whole +structure, though this is not recommended since future versions may +expand the SETTINGS structure. The contents of user are not modified. +
  +
Example: Temporarily disable pulldowns: +
  +
SETTINGS set;
+x_settings ( 0, sizeof(set), &set ); /* get current        */
+set.pulldown = 0;
+x_settings ( 1, sizeof(set), &set ); /* turn off           */
+...                                  /* do some stuff here */
+set.pulldown = 1;
+x_settings ( 1, sizeof(set), &set ); /* turn back on       */
+
+
-1: Reset +
Reset length bytes of the settings to their default values. If +length is less than zero, all of the settings will be reset. The user +parameter can be NULL, since it is not used. +
  +
Ergebnis: Die Funktion liefert immer 1. +
  +
Verfügbar: Die Funktion steht nur unter Geneva zur Verfügung. +
  +
Gruppe: Geneva Funktionen +
  +
Querverweis: Binding +
  + +
+ +

8.12.6.1 Bindings für x_settings

+ + + + + + + + + +
C: int16_t x_settings ( int16_t getset, int16_t length, SETTINGS +*user ); +
  +
Umsetzung: +
  +
int16_t x_settings ( int16_t getset, int16_t length, SETTINGS
+*user )
+{
+   int_in[0] = getset;
+   int_in[1] = length;
+   addr_in[0] = user;
+
+   crys_if(29056);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]29056 # Opcode der Funktion
control+2control[1]2 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]getset
int_in+2int_in[1]length
addr_inaddr_in[0]user
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.12.7 x_sprintf

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Geneva sprinft« - Print data to a string, with extended +formats. +
  +
AES-Nummer: 29059 +
  +
Deklaration: void x_sprintf( int8_t *buf, int8_t *fmt, ... ); +
  +
Beschreibung: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
buf Buffer to receive output string +
fmt Null-terminated format string +
... Pointer to first argument on user stack + +
+ +
This function acts almost identically to the sprintf function +found in C programming libraries. It understands the following format +specifiers: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
%cCharacter
%sString
%xUnsigned int in hexadecimal
%XUnsigned long in hexadecimal
%dSigned int in decimal
%DSigned long in decimal
%oSigned int in octal
%bBoolean: 'F' for 0, or 'T' for non-zero
%kWhen passed a pointer to a KEYCODE structure, output
all three elements using the format "%02x %02x %02x"
%vTake the int argument and output the MSB and LSB in the
format "%x.%02x". Used for generating version numbers.
%SSurround the string with curly braces, so that a string
containing spaces can be read back in correctly with
the x_sscanf function
%hSame as %x
+
+ +
These prefixes can be used before the string and number formats: +
  +

+
+ + + + + + + + + + + + + + + + +
-Left-justified, instead of right-justified
0Pad with 0's insteausof spaces
0-9Any number of digits (following a possible first '0'
for padding) specify the field length, in decimal
+
+ +
Example:                                   Result:
+x_sprintf( str, "%04x", 0xFE );            00FE
+x_sprintf( str, "%-06s", "Hi!" );          Hi!000
+x_sprintf( str, "%6s", "Hi!" );            Hi!
+x_sprintf( str, "%b %v", 2, 0x502 );       T 5.02
+x_sprintf( str, "%S %s", "a b", "c d" );   {a b} c d
+KEYCODE key = { 1, 0, 'X' };
+x_sprintf( str, "key=%k", &key );          keyd 1 00 58
+
+
This sort of thing doesn't really belong in a GUI, but it made +sense to include it, since it is used by Geneva internally, anyway. +
  +
Ergebnis: Die Funktion hat keinen Rückgabewert. +
  +
Verfügbar: Die Funktion steht nur unter Geneva zur Verfügung. +
  +
Gruppe: Geneva Funktionen +
  +
Querverweis: Binding +
  + +
+ +

8.12.7.1 Bindings für x_sprintf

+ + + + + + + + + +
C: void x_sprintf( int8_t *buf, int8_t *fmt, ... ); +
  +
Umsetzung: +
  +
void x_sprintf( int8_t *buf, int8_t *fmt, ... )
+{
+   addr_in[0] = buf;
+   addr_in[1] = fmt;
+   addr_in[2] = &...;
+
+   crys_if(29059);
+
+   return;
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]29059 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]0 # Einträge in int_out
control+6control[3]3 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]buf
addr_in+4addr_in[1]fmt
addr_in+8addr_in[2]...
+
+ + +
+ +

8.12.8 x_sscanf

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Geneva sscanf« - Read formatted data from a string, with +extended formats. +
  +
AES-Nummer: 29060 +
  +
Deklaration: void x_sscanf( int8_t *buf, int8_t *fmt, ... ); +
  +
Beschreibung: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
buf Buffer containing data +
fmt Null-terminated format string +
... Pointer to first argument on user stack + +
+ +
This function acts almost identically to the sscanf function +found in C programming libraries. It understands the following format +specifiers: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
%cCharacter
%sString
%xUnsigned int in hexadecimal
%XUnsigned long in hexadecimal
%dSigned int in decimal
%DSigned long in decimal
%oSigned int in octal
%bBoolean: 'F' for 0, or 'T' for non-zero
%kWhen passed a pointer to a KEYCODE structure, output
all three elements using the format "%02x %02x %02x"
%vTake the int argument and output the MSB and LSB in the
format "%x.%02x". Used for generating version numbers.
%SSurround the string with curly braces, so that a string
containing spaces can be read back in correctly with
the x_sscanf function
%hUnsigned char in hexadecimal
+
+ +
Example:                                   Result:
+int i;
+char str[10], str2[10], bool;
+KEYCODE key;
+x_sscanf( "FE", "%x", &i );                i = 0xFE
+x_sscanf( "Hi!", "%s", str );              str = "Hi!"
+x_sscanf( "T 5.02", "%b %v", &bool, &i );  bool = 1, i = 0x502
+x_sscanf( "{a b} c", "%S %s", str, str2 ); str = "a b", str2 = "c"
+x_sprintf( "01 00 58", "%k", &key );       key = { 1, 0, 58 };
+
+
This sort of thing doesn't really belong in a GUI, but it made +sense to include it, since it is used by Geneva internally, anyway. +
  +
Ergebnis: Die Funktion hat keinen Rückgabewert. +
  +
Verfügbar: Die Funktion steht nur unter Geneva zur Verfügung. +
  +
Gruppe: Geneva Funktionen +
  +
Querverweis: Binding +
  + +
+ +

8.12.8.1 Bindings für x_sscanf

+ + + + + + + + + +
C: void x_sscanf( int8_t *buf, int8_t *fmt, ... ); +
  +
Umsetzung: +
  +
void x_sscanf( int8_t *buf, int8_t *fmt, ... )
+{
+   addr_in[0] = buf;
+   addr_in[1] = fmt;
+   addr_in[2] = &...;
+
+   crys_if(29060);
+
+   return;
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]29060 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]0 # Einträge in int_out
control+6control[3]3 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]buf
addr_in+4addr_in[1]fmt
addr_in+8addr_in[2]...
+
+ + +
+ +
+ +Home +AESAES +FormularfunktionenFormularfunktionen +GrafikfunktionenGrafikfunktionen + + diff --git a/de/gpl.html b/de/gpl.html new file mode 100644 index 000000000..9d41e9e8e --- /dev/null +++ b/de/gpl.html @@ -0,0 +1,384 @@ + + + + + +Die Anleitung zum TOS: The GNU General Public Licence + + + + + + + + + +Home +EinleitungEinleitung +Neu in dieser VersionNeu in dieser Version +TOSTOS + +
+ +

1.4 The GNU General Public Licence

+
                   GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                  GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange;
+    or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject
+to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do
+not excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program
+by all those who receive copies directly or indirectly through you,
+then the only way you could satisfy both it and this License would be
+to refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended
+to apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new
+versions of the General Public License from time to time.  Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Program does not specify a
+version number of this License, you may choose any version ever
+published by the Free Software Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the
+author to ask for permission.  For software which is copyrighted by
+the Free Software Foundation, write to the Free Software Foundation;
+we sometimes make exceptions for this.  Our decision will be guided by
+the two goals of preserving the free status of all derivatives of our
+free software and of promoting the sharing and reuse of software
+generally.
+
+    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+PROGRAM IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                END OF TERMS AND CONDITIONS
+
+
+        How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these
+terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year>  <name of author>
+
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
+  USA
+
+
+Also add information on how to contact you by electronic and paper
+mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type
+    `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the
+appropriate parts of the General Public License.  Of course, the
+commands you use may be called something other than `show w' and
+`show c'; they could even be mouse-clicks or menu items -- whatever
+suits your program.
+
+You should also get your employer (if you work as a programmer) or
+your school, if any, to sign a "copyright disclaimer" for the program,
+if necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  program `Gnomovision' (which makes passes at compilers) written by
+  James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library,
+you may consider it more useful to permit linking proprietary
+applications with the library.  If this is what you want to do, use
+the GNU Library General Public License instead of this License.
+
+
+
+ +Home +EinleitungEinleitung +Neu in dieser VersionNeu in dieser Version +TOSTOS + + diff --git a/de/graf.html b/de/graf.html new file mode 100644 index 000000000..f2c402dce --- /dev/null +++ b/de/graf.html @@ -0,0 +1,3680 @@ + + + + + +Die Anleitung zum TOS: Grafikfunktionen + + + + + + + + + +Home +AESAES +Geneva FunktionenGeneva Funktionen +Klemmbrett-FunktionenKlemmbrett-Funktionen + +
+ +

8.13 Grafikfunktionen

+

Diese Bibliothek übernimmt die Verwaltung von Rechtecken; so +kann etwa ein Rechteck aufgezogen werden, daß sich automatisch mit +dem Mauszeiger mitbewegt. Insgesamt stehen die folgenden Funktionen +zur Verfügung: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
graf_dragbox Verschieben eines Rechtecks. +
graf_growbox Animation eines sich vergrößernden Rechtecks. +
graf_handle Kennung der AES-Workstation ermitteln. +
graf_mbox Rechteckverschiebung darstellen. +
graf_mkstate Maus- und Tastaturstatus ermitteln. +
graf_mouse Form des Mauszeigers bestimmen. +
graf_multirubber Zwei Rechteckhülle (»Gummiband«) darstellen. +
graf_rubbox Rechteckhülle (»Gummiband«) darstellen. +
graf_shrinkbox Animation eines sich verkleinernden Rechtecks. +
graf_slidebox Sliderposition ermitteln. +
graf_watchbox Objektstatus an Position des Mauszeigers koppeln. +
graf_wwatchbox Objektstatus an Mausposition koppeln (im Fenster). +
graf_xhandle Kennung der AES-Workstation ermitteln. +
x_graf_blit Blit one area of the screen to another location +
x_graf_rast2rez Convert a bit image +
x_graf_rubberbox Extended rubberband box drawing + +
+ +

Hinweis: Eine besondere Beachtung hat dabei graf_handle +verdient, mit dessen Hilfe die Kennung der physikalischen +Bildschirm-Workstation erfragt werden kann. +

+

Querverweis: Style-Guidelines +

+

8.13.1 graf_dragbox

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Graphics drag Box« - verschiebt ein Rechteck mit der Maus. +
  +
AES-Nummer: 71 +
  +
Deklaration: int16_t graf_dragbox ( int16_t gr_dwidth, int16_t gr_dheight, +int16_t gr_dstartx, int16_t gr_dstarty, int16_t gr_dboundx, int16_t +gr_dboundy, int16_t gr_dboundw, int16_t gr_dboundh, int16_t +*gr_dfinishx, int16_t *gr_dfinishy ); +
  +
Beschreibung: Die Funktion ermöglicht das Verschieben eines kleineren +Rechtecks innerhalb eines größeren Begrenzungsrechtecks. +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
gr_dwidth Breite +
gr_dheight Höhe +
gr_dstartx x-Koordinate +
gr_dstarty y-Koordinate des zu verschiebenden Rechtecks +
gr_dboundx x-Koordinate +
gr_dboundy y-Koordinate +
gr_dboundw Breite +
gr_dboundh Höhe des Begrenzungsrechteckes +
gr_dfinishx x-Koordinate +
gr_dfinishy y-Koordinate des zu verschiebenden Rechtecks beim Loslassen des +Mausknopfs + +
+ +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Grafikfunktionen +
  +
Querverweis: Binding +
  + +
+ +

8.13.1.1 Bindings für graf_dragbox

+ + + + + + + + + +
C: int16_t graf_dragbox ( int16_t gr_dwidth, int16_t gr_dheight, +int16_t gr_dstartx, int16_t gr_dstarty, int16_t gr_dboundx, int16_t +gr_dboundy, int16_t gr_dboundw, int16_t gr_dboundh, int16_t +*gr_dfinishx, int16_t *gr_dfinishy ); +
  +
Umsetzung: +
  +
int16_t graf_dragbox (int16_t gr_dwidth, int16_t gr_dheight,
+                      int16_t gr_dstartx, int16_t gr_dstarty,
+                      int16_t gr_dboundx, int16_t gr_dboundy,
+                      int16_t gr_dboundw, int16_t gr_dboundh,
+                      int16_t *gr_dfinishx,
+                      int16_t *gr_dfinishy)
+{
+   int_in[0] = gr_dwidth;
+   int_in[1] = gr_dheight;
+   int_in[2] = gr_dstartx;
+   int_in[3] = gr_dstarty;
+   int_in[4] = gr_dboundx;
+   int_in[5] = gr_dboundy;
+   int_in[6] = gr_dboundw;
+   int_in[7] = gr_dboundh;
+
+   crys_if (71);
+
+   *gr_dfinishx = int_out[1];
+   *gr_dfinishy = int_out[2];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]71 # Opcode der Funktion
control+2control[1]8 # Einträge in int_in
control+4control[2]3 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]gr_dwidth
int_in+2int_in[1]gr_dheight
int_in+4int_in[2]gr_dstartx
int_in+6int_in[3]gr_dstarty
int_in+8int_in[4]gr_dboundx
int_in+10int_in[5]gr_dboundy
int_in+12int_in[6]gr_dboundw
int_in+14int_in[7]gr_dboundh
int_outint_out[0]Return-Wert
int_out+2int_out[1]gr_dfinishx
int_out+4int_out[2]gr_dfinishy
+
+ + +
+ +

8.13.2 graf_growbox

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Graphics grow Box« - zeichnet ein sich vergrößerndes +Rechteck. +
  +
AES-Nummer: 73 +
  +
Deklaration: int16_t graf_growbox ( int16_t gr_gstx, int16_t gr_gsty, +int16_t gr_gstwidth, int16_t gr_gstheight, int16_t gr_gfinx, int16_t +gr_gfiny, int16_t gr_gfinwidth, int16_t gr_gfinheight ); +
  +
Beschreibung: Die Funktion zeichnet ein sich ausdehnendes Rechteck. Es gilt: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
gr_gstxx-Koordinate
gr_gstyy-Koordinate
gr_gstwidthBreite
gr_gstheightHöhe des Rechtecks (zu Beginn)
gr_gfinxx-Koordinate
gr_gfinyy-Koordinate
gr_gfinwidthBreite
gr_gfinheightHöhe des Rechtecks (am Ende)
+
+ +
Hinweis: Ab PC-GEM Version 2.0 wird dieser Befehl +ignoriert. Dies liegt in den Rechtsstreitigkeiten zwischen +Apple und Digital Research begründet. +
  +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Grafikfunktionen +
  +
Querverweis: Binding   form_dial   graf_shrinkbox +
  + +
+ +

8.13.2.1 Bindings für graf_growbox

+ + + + + + + + + +
C: int16_t graf_growbox ( int16_t gr_gstx, int16_t gr_gsty, +int16_t gr_gstwidth, int16_t gr_gstheight, int16_t gr_gfinx, int16_t +gr_gfiny, int16_t gr_gfinwidth, int16_t gr_gfinheight ); +
  +
Umsetzung: +
  +
int16_t graf_growbox (int16_t gr_gstx, int16_t gr_gsty,
+                      int16_t gr_gstwidth,
+                      int16_t gr_gstheight, int16_t gr_gfinx,
+                      int16_t gr_gfiny, int16_t gr_gfinwidth,
+                      int16_t gr_gfinheight)
+{
+   int_in[0] = gr_gstx;
+   int_in[1] = gr_gsty;
+   int_in[2] = gr_gstwidth;
+   int_in[3] = gr_gstheight;
+   int_in[4] = gr_gfinx;
+   int_in[5] = gr_gfiny;
+   int_in[6] = gr_gfinwidth;
+   int_in[7] = gr_gfinheight;
+
+   return ( crys_if(73) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]73 # Opcode der Funktion
control+2control[1]8 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]gr_gstx
int_in+2int_in[1]gr_gsty
int_in+4int_in[2]gr_gstwidth
int_in+6int_in[3]gr_gstheight
int_in+8int_in[4]gr_gfinx
int_in+10int_in[5]gr_gfiny
int_in+12int_in[6]gr_gfinwidth
int_in+14int_in[7]gr_gfinheight
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.13.3 graf_handle

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Graphics handle« - ermittelt den VDI-Handle der +Arbeitsstation. +
  +
AES-Nummer: 77 +
  +
Deklaration: int16_t graf_handle ( int16_t *gr_hwchar, int16_t *gr_hhchar, +int16_t *gr_hwbox, int16_t *gr_hhbox ); +
  +
Beschreibung: Die Funktion ermittelt die Kennung der Bildschirm-Workstation, +auf der das AES ausgibt. Es gilt: +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
gr_hwchar Breite +
gr_hhchar Höhe eines Zeichens aus dem Systemzeichensatz in Punkten +
gr_hwbox Breite +
gr_hhbox Höhe einer Zelle, in die ein beliebiges Zeichen aus dem +Systemzeichensatz komplett hinein paßt. + +
+ +
Hinweis: Die Information aus den Parametern +gr_hwbox bzw. gr_hhbox wird vom AES für die Breite +der einzelnen Fensterelemente verwendet. +
  +
Ergebnis: Die Funktion liefert die Kennung (handle) der geöffneten +AES-Workstation. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Grafikfunktionen +
  +
Querverweis: Binding   v_opnvwk   graf_xhandle +
  + +
+ +

8.13.3.1 Bindings für graf_handle

+ + + + + + + + + +
C: int16_t graf_handle ( int16_t *gr_hwchar, int16_t *gr_hhchar, +int16_t *gr_hwbox, int16_t *gr_hhbox ); +
  +
Umsetzung: +
  +
int16_t graf_handle (int16_t *gr_hwchar, int16_t *gr_hhchar,
+                     int16_t *gr_hwbox, int16_t *gr_hhbox)
+{
+   crys_if (77);
+
+   *gr_hwchar = int_out[1];
+   *gr_hhchar = int_out[2];
+   *gr_hwbox  = int_out[3];
+   *gr_hhbox  = int_out[4];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]77 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]5 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_outint_out[0]Return-Wert
int_out+2int_out[1]gr_hwchar
int_out+4int_out[2]gr_hhchar
int_out+6int_out[3]gr_hwbox
int_out+8int_out[4]gr_hhbox
+
+ + +
+ +

8.13.4 graf_mbox

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Graphics move Box« - verschiebt ein Rechteck mit der Maus. +
  +
AES-Nummer: 72 +
  +
Deklaration: int16_t graf_mbox ( int16_t gr_mwidth, int16_t gr_mheight, +int16_t gr_msourcex, int16_t gr_msourcey, int16_t gr_mdestx, int16_t +gr_mdesty ); +
  +
Beschreibung: Die Funktion zeichnet ein sich bewegendes Rechteck mit +konstanter Größe. Es gilt: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
gr_mwidthBreite
gr_mheightHöhe des Rechteckes
gr_msourcexx-Koordinate
gr_msourceyy-Koordinate (zu Beginn)
gr_mdestxx-Koordinate
gr_mdestyy-Koordinate (am Ende)
+
+ +
Hinweis: Die Funktion kann beispielsweise dann +angewendet werden, wenn das Verschieben eines Piktogramms nicht +erlaubt ist, (Drucker-Symbol auf das Papierkorb-Icon legen) und es an +seine ursprünglich Stelle zurückpositioniert werden soll. +
  +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Grafikfunktionen +
  +
Querverweis: Binding +
  + +
+ +

8.13.4.1 Bindings für graf_mbox

+ + + + + + + + + +
C: int16_t graf_mbox ( int16_t gr_mwidth, int16_t gr_mheight, +int16_t gr_msourcex, int16_t gr_msourcey, int16_t gr_mdestx, int16_t +gr_mdesty ); +
  +
oder +
  +
int16_t graf_movebox ( ... ) +
  +
Umsetzung: +
  +
int16_t graf_mbox (int16_t gr_mwidth, int16_t gr_mheight,
+                   int16_t gr_msourcex, int16_t gr_msourcey,
+                   int16_t gr_mdestx, int16_t gr_mdesty)
+{
+   int_in[0] = gr_mwidth;
+   int_in[1] = gr_mheight;
+   int_in[2] = gr_msourcex;
+   int_in[3] = gr_msourcey;
+   int_in[4] = gr_mdestx;
+   int_in[5] = gr_medsty;
+
+   return ( crys_if(72) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]72 # Opcode der Funktion
control+2control[1]6 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]gr_mwidth
int_in+2int_in[1]gr_mheight
int_in+4int_in[2]gr_msourcex
int_in+6int_in[3]gr_msourcey
int_in+8int_in[4]gr_mdestx
int_in+10int_in[5]gr_mdesty
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.13.5 graf_mkstate

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Graphics Mouse and Keyboard Status« - ermittelt den Status +von Maus und Tastatur. +
  +
AES-Nummer: 79 +
  +
Deklaration: int16_t graf_mkstate ( int16_t *gr_mkmx, int16_t *gr_mkmy, +int16_t *gr_mkmstate, int16_t *gr_mkkstate ); +
  +
Beschreibung: Die Funktion ermittelt die aktuelle Mausposition sowie den +Zustand der Maustasten und Sondertasten der Tastatur. Es gilt: +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
gr_mkmx x-Position +
gr_mkmy y-Position des Mauszeigers +
gr_mkmstate Zustand der Mausknöpfe (Bit-0 = linke Taste, usw.) +
gr_mkkstate Sondertasten der Tastatur als Bitvektor: +
+
+ + + + + + + + + + + + + + + + + + + + +
0x0001=rechte Shift-Taste
0x0002=linke Shift-Taste
0x0004=Control-Taste
0x0008=Alternate-Taste
+
+ + +
+ +
Hinweis: Ein Bit ist dabei genau dann gesetzt, wenn die +entsprechende Taste gedrückt ist. +
  +
Ergebnis: Als Ergebnis wird immer eine 1 zurückgegeben. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Grafikfunktionen +
  +
Querverweis: Binding   evnt_button +
  + +
+ +

8.13.5.1 Bindings für graf_mkstate

+ + + + + + + + + +
C: int16_t graf_mkstate ( int16_t *gr_mkmx, int16_t *gr_mkmy, +int16_t *gr_mkmstate, int16_t *gr_mkkstate ); +
  +
Umsetzung: +
  +
int16_t graf_mkstate (int16_t *gr_mkmx, int16_t *gr_mkmy,
+                      int16_t *gr_mkmstate,
+                      int16_t *gr_mkkstate)
+{
+   crys_if (79);
+
+   *gr_mkmx     = int_out[1];
+   *gr_mkmy     = int_out[2];
+   *gr_mkmstate = int_out[3];
+   *gr_mkkstate = int_out[4];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]79 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]5 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_outint_out[0]Return-Wert
int_out+2int_out[1]gr_mkmx
int_out+4int_out[2]gr_mkmy
int_out+6int_out[3]gr_mkmstate
int_out+8int_out[4]gr_mkkstate
+
+ + +
+ +

8.13.6 graf_mouse

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Graphics Mouse« - verändert die Darstellung des +Mauszeigers. +
  +
AES-Nummer: 78 +
  +
Deklaration: int16_t graf_mouse ( int16_t gr_monumber, MFORM *gr_mofaddr ); +
  +
Beschreibung: Die Funktion erlaubt es, das Aussehen des Mauszeigers zu +verändern. Für den Parameter gr_monumber gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 gr_monumberBedeutung
ARROW0Pfeil
TEXT_CRSR1Textcursor
HOURGLASS2Sanduhr, Biene
BUSY_BEE2siehe HOURGLASS
BUSYBEE2siehe HOURGLASS
POINT_HAND3zeigende Hand
FLAT_HAND4flache Hand
THIN_CROSS5feines Fadenkreuz
THICK_CROSS6breites Fadenkreuz
OUTLN_CROSS7umrissenes Fadenkreuz
 8Sizer (N.AES)
X_LFTRT8left-right arrow (Geneva)
 9horizontal arrows (N.AES)
X_UPDOWN9up-down arrow (Geneva)
 10vertical arrows (N.AES)
USER_DEF255eigene Mausform
M_OFF256Mauszeiger ausschalten
M_ON257Mauszeiger einschalten
M_SAVE258aktuelle Mausform sichern
M_RESTORE259vorherige Mausform herstellen
M_LAST260letzte Mausform herstellen
M_PREVIOUS260siehe M_LAST
XACRS_BUBBLE_DISC270The Data Uncertain logo (XaAES)
XACRS_RESIZER271The 'resize window' cursors (XaAES)
XACRS_NE_SIZER272(XaAES)
XACRS_MOVER273The 'move window' cursor (XaAES)
XACRS_VERTSIZER274The 'resize vertically' cursor (XaAES)
XACRS_HORSIZER275The 'resize horizontally' cursor (XaAES)
XACRS_POINTSLIDE276The 'two-arrows pointing inwards'
  cursor to pinpoint slider position(XaAES)
X_MRESET1000(Geneva)
X_MGET1001(Geneva)
X_SET_SHAPE1100(Geneva)
+
+ +
Im Fall gr_monumber = USER_DEF, ist gr_mofaddr +ein Zeiger auf die Struktur MFORM, die das Aussehen des Mauszeigers +festlegt. +
  +
Hinweis: Man sollte darauf achten, daß außerhalb des +Arbeitsbereichs des eigenen Fensters, der Mauszeiger nur die Form +eines Pfeils oder einer Sanduhr besitzt. +
  +
In the event that the application must change the mouse form, +set the highest bit ( Bit 15 ) of gr_monumber to 1 and OR in with the +desired mouse form number. After finishing the work, call the +graf_mouse with value 0 to set the mouse back to arrow. +
  + +
M_FORCE   0x8000 +
  +
Ob die Modi 258-260 zur Verfügung stehen, bzw. ob die Mausform +für jede Applikation lokal verwaltet wird, kann per appl_getinfo (Opcode 8) +abgefragt werden. +
  +
+
X_MRESET (1000)
+
+

+
  +
graf_mouse( X_MRESET, 0L ); +
  +
Resets the mouse so that it is "on" just once, and +also updates graf_mouse's idea of the hide count. +
  +

+ +
+
X_MGET (1001)
+
+

+
  +
hidecount = graf_mouse( X_MGET, MFORM *mouse ); +
  +
In this mode, if "mouse" is non-zero, then the MFORM +it points to is filled-in with the shape of the last mouse set with +graf_mouse(). "hidecount" gets the number of times the mouse +was hidden using graf_mouse(M_OFF...). If this number is greater than +zero, the mouse is hidden that number of times. If it is zero, the +mouse is shown once. If it is less than zero, the mouse is +"shown" more than once. +
  +

+ +
+
X_SET_SHAPE (1100)
+
+

+
  +
graf_mouse( X_SET_SHAPE+index, ANI_MOUSE *mouse_form ); +
  +
Change the shape of the mouse form whose number is +"index". The ANI_MOUSE structure contains up to 32 mouse +shapes to be animated in a continuous loop while that particular mouse +shape is being displayed. +
If the "frames" portion of the ANI_MOUSE structure is +one, then no animation is performed. Otherwise, it should be the +number of frames contained in the mouse animation sequence. The +"delay" value is the number of 50 Hz timer tics to pause +between each frame in the animation. The "form" portion of +the structure only needs to be initialized for the number of frames, +so if there are only two frames, this means that only form[0] and +form[1] are used. If a NULL pointer is passed, instead of a pointer to +an ANI_MOUSE structure, then the mouse shape is restored to its +default. +
It does not matter if the application which sets a new shape +terminates without resetting the mouse shape, as this call allocates +memory internally to hold the new shape data. +
  +

+ +
+
+
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Verfügbar: In allen AES Versionen. +
  +
Gruppe: Grafikfunktionen +
  +
Querverweis: Binding   Mausklicks und Formen +
  + +
+ +

8.13.6.1 Bindings für graf_mouse

+ + + + + + + + + +
C: int16_t graf_mouse ( int16_t gr_monumber, MFORM *gr_mofaddr ); +
  +
Umsetzung: +
  +
int16_t graf_mouse (int16_t gr_monumber, MFORM *gr_mofaddr)
+{
+   int_in[0]  = gr_monumber;
+   addr_in[0] = gr_mofaddr;
+
+   return ( crys_if(78) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]78 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]gr_monumber
addr_inaddr_in[0]gr_mofaddr
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.13.7 graf_multirubber

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Graphics Rubberbox« - zeichnet eine 'Rubberbox' +(Gummirechteck) auf den Bildschirm. +
  +
AES-Nummer: 69 +
  +
Deklaration: int16_t graf_multirubber(int16_t x, int16_t y, int16_t minw, +int16_t minh, GRECT *rec, int16_t *outw, int16_t *outh) +
  +
Beschreibung: Die Funktion stellt ein Gummiband in Form eines Rechtecks auf +dem Bildschirm dar, dessen obere linke Ecke festbleibt und dessen +untere rechte Ecke solange bewegt werden kann, wie die linke Maustaste +gedrückt wird. Ähnelt graf_rubberbox, nur mit zwei Rechtecken. +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
x x-Koordinate +
y y-Koordinate der linken, oberen Ecke +
minw kleinste Breite des Gummibandes +
minh kleinste Höhe des Gummibandes +
rec   +
outw Breite des Gummibandes bei Loslassen des Mausknopfs +
outh Höhe des Gummibandes bei Loslassen des Mausknopfs + +
+ +
Hinweis: Die Funktion sollte aus den o.g. Gründen nur +bei bereits gedrückter Maustaste aufgerufen werden. Interessant ist, +daß bei der Angabe der minimalen Breite und Höhe auch +negative Werte zugelassen sind; das Gummiband läßt sich dann +von rechts unten nach links oben ziehen. +
  +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Verfügbar: Die Funktion steht nur unter N.AES zur Verfügung. +
  +
Gruppe: Grafikfunktionen +
  +
Querverweis: Binding   graf_rubberbox   x_graf_rubberbox +
  + +
+ +

8.13.7.1 Bindings für graf_multirubber

+ + + + + + + + + +
C: int16_t graf_multirubber(int16_t x, int16_t y, int16_t minw, +int16_t minh, GRECT *rec, int16_t *outw, int16_t *outh) +
  +
Umsetzung: +
  +
int16_t graf_multirubber (int16_t x, int16_t y, int16_t minw,
+                          int16_t minh, GRECT *rec,
+                          int16_t *outw, int16_t *outh)
+{
+   int_in[0] = x;
+   int_in[1] = y;
+   int_in[2] = minw;
+   int_in[3] = minh;
+
+   addr_in[0] = rec;
+
+   crys_if (69);
+
+   *outw = int_out[1];
+   *outh = int_out[2];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]69 # Opcode der Funktion
control+2control[1]4 # Einträge in int_in
control+4control[2]3 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]x
int_in+2int_in[1]y
int_in+4int_in[2]minw
int_in+6int_in[3]minh
addr_inaddr_in[0]rec
int_outint_out[0]Return-Wert
int_out+2int_out[1]outw
int_out+4int_out[2]outh
+
+ + +
+ +

8.13.8 graf_rubberbox

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Graphics Rubberbox« - zeichnet eine 'Rubberbox' +(Gummirechteck) auf den Bildschirm. +
  +
AES-Nummer: 70 +
  +
Deklaration: int16_t graf_rubberbox ( int16_t gr_rx, int16_t gr_ry, int16_t +gr_minwidth, int16_t gr_minheight, int16_t *gr_rlastwidth, int16_t +*gr_rlastheight ); +
  +
oder +
  +
int16_t graf_rubbox ( ... ); +
  +
Beschreibung: Die Funktion stellt ein Gummiband in Form eines Rechtecks auf +dem Bildschirm dar, dessen obere linke Ecke festbleibt und dessen +untere rechte Ecke solange bewegt werden kann, wie die linke Maustaste +gedrückt wird. +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
gr_rx x-Koordinate +
gr_ry y-Koordinate der linken, oberen Ecke +
gr_minwidth kleinste Breite des Gummibandes +
gr_minheight kleinste Höhe des Gummibandes +
gr_rlastwidth Breite +
gr_rlastheight Höhe des Gummibandes bei Loslassen des Mausknopfs + +
+ +
Hinweis: Die Funktion sollte aus den o.g. Gründen nur +bei bereits gedrückter Maustaste aufgerufen werden. Interessant ist, +daß bei der Angabe der minimalen Breite und Höhe auch +negative Werte zugelassen sind; das Gummiband läßt sich dann +von rechts unten nach links oben ziehen. +
  +
In älteren GEM-Dokumentationen auch häufig als +"graf_rubbox" bezeichnet! +
  +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Grafikfunktionen +
  +
Querverweis: Binding   graf_multirubber   x_graf_rubberbox +
  + +
+ +

8.13.8.1 Bindings für graf_rubberbox

+ + + + + + + + + +
C: int16_t graf_rubbox ( int16_t gr_rx, int16_t gr_ry, int16_t +gr_minwidth, int16_t gr_minheight, int16_t *gr_rlastwidth, int16_t +*gr_rlastheight ); +
  +
oder +
  +
int16_t graf_rubberbox ( ... ) +
  +
Umsetzung: +
  +
int16_t graf_rubbox (int16_t gr_rx, int16_t gr_ry,
+                     int16_t gr_minwidth,
+                     int16_t gr_minheight,
+                     int16_t *gr_rlastwidth,
+                     int16_t *gr_rlastheight)
+{
+   int_in[0] = gr_rx;
+   int_in[1] = gr_ry;
+   int_in[2] = gr_minwidth;
+   int_in[3] = gr_minheight;
+
+   crys_if (70);
+
+   *gr_rlastwidth = int_out[1];
+   *gr_lastheight = int_out[2];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]70 # Opcode der Funktion
control+2control[1]4 # Einträge in int_in
control+4control[2]3 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]gr_rx
int_in+2int_in[1]gr_ry
int_in+4int_in[2]gr_minwidth
int_in+6int_in[3]gr_minheight
int_outint_out[0]Return-Wert
int_out+2int_out[1]gr_rlastwidth
int_out+4int_out[2]gr_rlastheight
+
+ + +
+ +

8.13.9 graf_shrinkbox

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Graphics shrink Box« - zeichnet ein sich verkleinerndes +Rechteck. +
  +
AES-Nummer: 74 +
  +
Deklaration: int16_t graf_shrinkbox ( int16_t gr_sfinx, int16_t gr_sfiny, +int16_t gr_sfinwidth, int16_t gr_sfinheight, int16_t gr_sstx, int16_t +gr_ssty, int16_t gr_sstwidth, int16_t gr_sstheight ); +
  +
Beschreibung: Die Funktion zeichnet ein schrumpfendes Rechteck. Es gilt: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
gr_sfinxx-Koordinate
gr_sfinyy-Koordinate
gr_sfinwidthBreite
gr_sfinheightHöhe des Rechteckes (am Ende)
gr_sstxx-Koordinate
gr_sstyy-Koordinate
gr_sstwidthBreite
gr_sstheightHöhe des Rechteckes (zu Beginn)
+
+ +
Hinweis: Ab PC-GEM Version 2.0 wird dieser Befehl +ignoriert. Dies liegt in den Rechtsstreitigkeiten zwischen +Apple und Digital Research begründet. +
  +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Grafikfunktionen +
  +
Querverweis: Binding   form_dial   graf_growbox +
  + +
+ +

8.13.9.1 Bindings für graf_shrinkbox

+ + + + + + + + + +
C: int16_t graf_shrinkbox ( int16_t gr_sfinx, int16_t gr_sfiny, +int16_t gr_sfinwidth, int16_t gr_sfinheight, int16_t gr_sstx, int16_t +gr_ssty, int16_t gr_sstwidth, int16_t gr_sstheight ); +
  +
Umsetzung: +
  +
int16_t graf_shrinkbox (int16_t gr_sfinx, int16_t gr_sfiny,
+                        int16_t gr_sfinwidth,
+                        int16_t gr_sfinheight,
+                        int16_t gr_sstx, int16_t gr_ssty,
+                        int16_t gr_sstwidth,
+                        int16_t gr_sstheight)
+{
+   int_in[0] = gr_sfinx;
+   int_in[1] = gr_sfiny;
+   int_in[2] = gr_sfinwidth;
+   int_in[3] = gr_sfinheight;
+   int_in[4] = gr_sstx;
+   int_in[5] = gr_ssty;
+   int_in[6] = gr_sstwidth;
+   int_in[7] = gr_sstheight;
+
+   return ( crys_if(74) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]74 # Opcode der Funktion
control+2control[1]8 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]gr_sfinx
int_in+2int_in[1]gr_sfiny
int_in+4int_in[2]gr_sfinwidth
int_in+6int_in[3]gr_sfinheight
int_in+8int_in[4]gr_sstx
int_in+10int_in[5]gr_ssty
int_in+12int_in[6]gr_sstwidth
int_in+14int_in[7]gr_sstheight
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.13.10 graf_slidebox

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Graphics slide Box« - ermittelt die Position der +Schieberegler. +
  +
AES-Nummer: 76 +
  +
Deklaration: int16_t graf_slidebox ( OBJECT *gr_slptree, int16_t +gr_slparent, int16_t gr_slobject, int16_t gr_slvh ); +
  +
Beschreibung: Die Funktion dient zur Abfrage von Schiebereglern (Slidern). Es +gilt: +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
gr_slptree Adresse des Objektbaumes +
gr_slparent Nummer des Parent-Rechteckes +
gr_slobject Nummer des zu verschiebenden Rechteckes (Slider) +
gr_slvh +
+
+ + + + + + + + + + +
0=horizontal verschieben
1=vertikal verschieben
+
+ + +
+ +
Hinweis: Die Funktion darf nur bei gedrückter Maustaste +aufgerufen werden, da sie beim Loslassen des Mausknopfes sofort +abbricht. +
  +
In Geneva hat sich der Parameter gr_slvh geringfügig geändert. +
  +
Ergebnis: Die Funktion liefert die relative Position zwischen 0 (ganz +links bzw. ganz oben) und 1000 (ganz rechts bzw. ganz unten) des +Sliders. +
  +
Verfügbar: In allen AES Versionen. +
  +
Gruppe: Grafikfunktionen +
  +
Querverweis: Binding   OBJECT +
  + +
+ +

8.13.10.1 graf_slidebox von Geneva

+

The meaning of the gr_slvh parameter has changed +slightly, to provide for real-time updating of sliders: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
LSB0for horizontal slider, 1 for vertical
MSB0for old-style, dotted outline drag box
 1to describe the area to be scrolled in real-time
 2to initialize real-time scrolling
 3to process the scroll bar in real time
+
+ +

To use real-time scroll bars, a program does the following: +

+ +
    +
  1. Call graf_slidebox with gr_slvh mode 0x1XX (where +"XX" is 00 for a horizontal slider, and 01 for vertical). In +this mode, the gr_slparent parameter describes the size of the +entire area to be scrolled, and gr_slobject describes the size +of the area which is visible at one time. Both of these values can be +in any units the programmer chooses. +
      +

  2. +
  3. Call graf_slidebox with gr_slvh mode 0x2XX. In this mode, +gr_slparent and gr_slobject have the same meaning they +normally do. The return value will either be -1, if the user has +released the slider, or it will be a number >= 0 which represents +the new position of the slider. This number is based on the numbers +passed in Step 1. The call does not return until the slider has either +moved enough to change the position within the list, or the mouse +button has been released. +
      +

  4. +
  5. If the result of the last graf_slidebox call was -1, then continue on +with the rest of the program. Otherwise, perform whatever action is +necessary to redraw the list of items, starting at the returned index. +The slider position is updated automatically by Geneva; the program +must not alter it. +
      +

  6. +
  7. Call graf_slidebox with gr_slvh mode 0x3XX. In this mode, +gr_slparent and gr_slobject have the same meaning they +normally do. Go to Step 3. +
      +

  8. +
+ +

Example: Process a list of 100 items, 10 of which are visible at +once +

+
if( graf_slidebox( 0L, 100, 10, 0x101 ) >= 0 )
+{
+  i = graf_slidebox( object_tree, parent_obj, slider_obj, 0x201 );
+  while( i>=0 )
+  {
+     redraw_list_starting_at(i);
+     i = graf_slidebox( object_tree, parent_obj, slider_obj, 0x301 );
+  }
+}
+
+

8.13.10.2 Bindings für graf_slidebox

+ + + + + + + + + +
C: int16_t graf_slidebox ( OBJECT *gr_slptree, int16_t +gr_slparent, int16_t gr_slobject, int16_t gr_slvh ); +
  +
Umsetzung: +
  +
int16_t graf_slidebox (OBJECT *gr_slptree,
+                       int16_t gr_slparent,
+                       int16_t gr_slobject, int16_t gr_slvh)
+{
+   int_in[0]  = gr_slparent;
+   int_in[1]  = gr_slobject;
+   int_in[2]  = gr_slvh;
+   addr_in[0] = gr_slptree;
+
+   return ( crys_if(76) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]76 # Opcode der Funktion
control+2control[1]3 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]gr_slparent
int_in+2int_in[1]gr_slobject
int_in+4int_in[2]gr_slvh
addr_inaddr_in[0]gr_slptree
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.13.11 graf_watchbox

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Graphics watch Box« - selektiert ein Objekt und überwacht +die Mausbewegungen bezüglich dieses Objekts. +
  +
AES-Nummer: 75 +
  +
Deklaration: int16_t graf_watchbox ( OBJECT *gr_wptree, int16_t gr_wobject, +int16_t gr_winstate, int16_t gr_woutstate ); +
  +
Beschreibung: Die Funktion setzt den Objektstatus eines Objektes in +Abhängigkeit von der Position des Mauszeigers. Es gilt: +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
gr_wptree Adresse des Objektbaumes +
gr_wpobject Nummer des Objektes +
gr_winstate Objektstatus, wenn sich der Mauszeiger innerhalb der Begrenzung +befindet: +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NORMAL(0x0000)
SELECTED(0x0001)
CROSSED(0x0002)
CHECKED(0x0004)
DISABLED(0x0008)
OUTLINED(0x0010)
SHADOWED(0x0020)
+
+ +
gr_woutstate Objektstatus, wenn sich der Mauszeiger außerhalb der +Begrenzung befindet. + +
+ +
Hinweis: Die Funktion bricht ab, wenn der Mausknopf +losgelassen wird. +
  +
Ergebnis: Die Funktion liefert die Position des Mauszeigers beim +Loslassen des Buttons (0 = außerhalb des Objektes, 1 = innerhalb des +Objektes). +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Grafikfunktionen +
  +
Querverweis: Binding   graf_wwatchbox   OBJECT +
  + +
+ +

8.13.11.1 Bindings für graf_watchbox

+ + + + + + + + + +
C: int16_t graf_watchbox ( OBJECT *gr_wptree, int16_t gr_wobject, +int16_t gr_winstate, int16_t gr_woutstate ); +
  +
Umsetzung: +
  +
int16_t graf_watchbox (OBJECT *gr_wptree, int16_t gr_wobject,
+                       int16_t gr_winstate,
+                       int16_t gr_woutstate)
+{
+   int_in[0]  = 0;
+   int_in[1]  = gr_wobject;
+   int_in[2]  = gr_winstate;
+   int_in[3]  = gr_woutstate;
+
+   addr_in[0] = gr_wptree;
+
+   return ( crys_if(75) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]75 # Opcode der Funktion
control+2control[1]4 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]0
int_in+2int_in[1]gr_wobject
int_in+4int_in[2]gr_winstate
int_in+6int_in[3]gr_woutstate
addr_inaddr_in[0]gr_wptree
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.13.12 graf_wwatchbox

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Graphics window watch Box« - selektiert ein Objekt in einem +Fenster und überwacht die Mausbewegungen bezüglich dieses Objekts. +
  +
AES-Nummer: 62 +
  +
Deklaration: int16_t graf_wwatchbox ( OBJECT *gr_wptree, int16_t gr_wobject, +int16_t gr_winstate, int16_t gr_woutstate, int16_t whandle ); +
  +
Beschreibung: Die Funktion setzt den Objektstatus eines Objektes in einem +Fenster in Abhängigkeit von der Position des Mauszeigers. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
gr_wptree Adresse des Objektbaumes +
gr_wpobject Nummer des Objektes +
gr_winstate Objektstatus, wenn sich der Mauszeiger innerhalb der Begrenzung +befindet: +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NORMAL(0x0000)
SELECTED(0x0001)
CROSSED(0x0002)
CHECKED(0x0004)
DISABLED(0x0008)
OUTLINED(0x0010)
SHADOWED(0x0020)
+
+ +
gr_woutstate Objektstatus, wenn sich der Mauszeiger außerhalb der +Begrenzung befindet. +
whandle Kennung des Fensters + +
+ +
Hinweis: Die Funktion bricht ab, wenn der Mausknopf +losgelassen wird. Die Funktion entspricht im wesentlichen +graf_watchbox mit dem Unterschied, dass hier die Rechteckliste eines +Fensters beachtet wird. +
  +
Ergebnis: Die Funktion liefert die Position des Mauszeigers beim +Loslassen des Buttons (0 = außerhalb des Objektes, 1 = innerhalb des +Objektes). +
  +
Verfügbar: Die Funktion steht in MagiC ab Version 5.10 zur Verfügung. +
  +
Gruppe: Grafikfunktionen +
  +
Querverweis: Binding   graf_watchbox   OBJECT +
  + +
+ +

8.13.12.1 Bindings für graf_wwatchbox

+ + + + + + + + + +
C: int16_t graf_wwatchbox ( OBJECT *gr_wptree, int16_t gr_wobject, +int16_t gr_winstate, int16_t gr_woutstate, int16_t whandle ); +
  +
Umsetzung: +
  +
int16_t graf_wwatchbox (OBJECT *gr_wptree, int16_t gr_wobject,
+                        int16_t gr_winstate,
+                        int16_t gr_woutstate,
+                        int16_t whandle)
+{
+   int_in[0]  = gr_wobject;
+   int_in[1]  = gr_winstate;
+   int_in[2]  = gr_woutstate;
+   int_in[3]  = whandle;
+
+   addr_in[0] = gr_wptree;
+
+   return ( crys_if(62) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]62 # Opcode der Funktion
control+2control[1]4 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]gr_wobject
int_in+2int_in[1]gr_winstate
int_in+4int_in[2]gr_woutstate
int_in+6int_in[3]whandle
addr_inaddr_in[0]gr_wptree
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.13.13 graf_xhandle

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Graphics handle« - ermittelt den VDI-Handle der +Arbeitsstation. +
  +
AES-Nummer: 77 +
  +
Deklaration: int16_t graf_xhandle ( int16_t *gr_hwchar, int16_t *gr_hhchar, +int16_t *gr_hwbox, int16_t *gr_hhbox, int16_t *device ); +
  +
Beschreibung: Die Funktion ermittelt die Kennung der Bildschirm-Workstation, +auf der das AES ausgibt. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
gr_hwchar Breite +
gr_hhchar Höhe eines Zeichens aus dem Systemzeichensatz in Punkten +
gr_hwbox Breite +
gr_hhbox Höhe einer Zelle, in die ein beliebiges Zeichen aus dem +Systemzeichensatz komplett hinein paßt. +
device Gerätehandle des AES (vdi_device) + +
+ +
Hinweis: Die Information aus den Parametern +gr_hwbox bzw. gr_hhbox wird vom AES für die Breite +der einzelnen Fensterelemente verwendet. +
  +
Ergebnis: Die Funktion liefert die Kennung (handle) der geöffneten +AES-Workstation. +
  +
Verfügbar: Seit KAOS 1.4 +
  +
Gruppe: Grafikfunktionen +
  +
Querverweis: Binding   v_opnvwk   graf_handle +
  + +
+ +

8.13.13.1 Bindings für graf_xhandle

+ + + + + + + + + +
C: int16_t graf_xhandle ( int16_t *gr_hwchar, int16_t *gr_hhchar, +int16_t *gr_hwbox, int16_t *gr_hhbox, int16_t *device ); +
  +
Umsetzung: +
  +
int16_t graf_xhandle (int16_t *gr_hwchar, int16_t *gr_hhchar,
+                      int16_t *gr_hwbox, int16_t *gr_hhbox,
+                      int16_t *device )
+{
+   crys_if (77);
+
+   *gr_hwchar = int_out[1];
+   *gr_hhchar = int_out[2];
+   *gr_hwbox  = int_out[3];
+   *gr_hhbox  = int_out[4];
+   *device    = int_out[5];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]77 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]6 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_outint_out[0]Return-Wert
int_out+2int_out[1]gr_hwchar
int_out+4int_out[2]gr_hhchar
int_out+6int_out[3]gr_hwbox
int_out+8int_out[4]gr_hhbox
int_out+10int_out[5]device
+
+ + +
+ +

8.13.14 x_graf_blit

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Blit area« +
  +
AES-Nummer: 28976 +
  +
Deklaration: int16_t x_graf_blit( GRECT *source, GRECT *dest ); +
  +
Beschreibung: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
source Adresse des Quellrechteck oder NULL +
dest Adresse des Zielrechteck oder NULL + +
+ +
If source and dest are both non-zero, then the +function simply blits the screen data from one rectangle to the other. +
  +
If dest is NULL, then the operation saves the area of +the screen specified by source in its internal buffer. When the +function ise=ater called with source NULL and dest properly set, it +will restore the area in the (new) location. +
  +
The internal buffer is large enough to hold 1/2 of the current +screen. Exceeding this will cause Geneva to try to allocate enough +memory to hold the screen data. If this fails, a zero will be +returned. Since this buffer is also used by Geneva to hold the screen +data for alerts and menus, and also by the item selector, you should +always surround code which uses x_graf_blit with wind_update calls. +
  +
This example displays a dialog and uses a blit to restore what +was underneath it: +
  +
OBJECT *tree;
+GRECT r;
+
+rsrc_gaddr( 0, 0, &tree );                    /* get dialog        */
+form_center( tree, &r.x, &r.y, &r.w, &r.h );  /* center it         */
+wind_update( BEG_UPDATE );                    /* lock menu bar     */
+x_graf_blit( &r, 0L );                        /* save what's there */
+objc_draw( tree, 0, 8, r.x, r.y, r.w, r.h );  /* draw dialog       */
+form_do( tree, 0 );                           /* get user response */
+x_graf_blit( 0L, &r );                        /* now restore       */
+wind_update( END_UPDATE );                    /* re-enable menus   */
+
+
Ergebnis: 0 = Nicht genügend Speicher umd die Daten zu sichern +
1 = Kein Fehler +
  +
Verfügbar: Die Funktion steht nur unter Geneva zur Verfügung. +
  +
Gruppe: Grafikfunktionen +
  +
Querverweis: Binding +
  + +
+ +

8.13.14.1 Bindings für x_graf_blit

+ + + + + + + + + +
C: int16_t x_graf_blit( GRECT *source, GRECT *dest ); +
  +
Umsetzung: +
  +
int16_t x_graf_blit( GRECT *source, GRECT *dest )
+{
+   addr_in[0] = source;
+   addr_in[1] = dest;
+
+   crys_if(28976);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]28976 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]source
addr_in+4addr_in[1]dest
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.13.15 x_graf_rast2rez

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »« - +
  +
AES-Nummer: 28978 +
  +
Deklaration: void x_graf_rast2rez( uint16_t *src_data, int32_t plane_len, +int16_t old_planes, MFDB *mfdb, int16_t devspef ); +
  +
Beschreibung: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
plane_len Size of one bitplane of data, in the dest. image, in bytes +
old_planes Number of bitplanes in the source data +
devspef If non-zero, the dest. image is in device-specific format. +Otherwise, it is in VDI format. +
src_data Pointer to the location of the source image's data. +
mfdb Pointer to the MFDB describing the dest. image. All values must +be correct, including the fd_addr. + +
+ +
This function will convert an image (in either VDI or +device-specific format) to a format which can be displayed in the +current video mode. This includes things like transforming a color +image of fewer bitplanes than the current video mode into an image +that can be displayed using vro_cpyfm. If the source is a monochrome +image, it is much faster to simply use vrt_cpyfm to display it and +avoid x_graf_rast2rez completely. +
  +
All values in mfdb describe the destination image, +except for fd_stand, which describes the source image. +
  +
Example: Take the image described by source, convert it +to the current video mode, and display it. +
  +
MFDB source,                           /* assume this is already filled-in */
+     dest,
+     screen;
+     int32_t dest_size;
+
+     dest = source;                    /* most values are the same to start */
+     dest.fd_nplanes = current_video_planes;
+     dest_size = (long)dest.fd_nplanes * dest.fd_wdwidth*2 * dest.fd_h;
+     dest.fd_addr = Malloc(dest_size);
+     x_graf_rast2rez( source.fd_addr, (long)source.fd_wdwidth*2 * source.fd_h,
+                      source.fd_nplanes, &dest, 1 );
+     screen.fd_addr = 0L;
+     vro_cpyfm( vdi_handle, MD_REPLACE, array, &dest, &screen );
+
+
Ergebnis: Die Funktion liefert keinen Wert. +
  +
Verfügbar: Die Funktion steht nur unter Geneva seit Release 004 zur +Verfügung. +
  +
Gruppe: Grafikfunktionen +
  +
Querverweis: Binding +
  + +
+ +

8.13.15.1 Bindings für x_graf_rast2rez

+ + + + + + + + + +
C: void x_graf_rast2rez( uint16_t *src_data, int32_t plane_len, +int16_t old_planes, MFDB *mfdb, int16_t devspef ); +
  +
Umsetzung: +
  +
void x_graf_rast2rez( uint16_t *src_data, int32_t plane_len, int16_t old_planes,
+                      MFDB *mfdb, int16_t devspef )
+{
+   int_in[0-1] = plane_len;
+   int_in[2]   = old_planes;
+   int_in[3]   = devspef;
+
+   addr_in[0] = src_data;
+   addr_in[1] = mfdb;
+
+   crys_if(28978);
+
+   return;
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]28978 # Opcode der Funktion
control+2control[1]4 # Einträge in int_in
control+4control[2]0 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]plane_len
int_in+2int_in[1]plane_len
addr_inaddr_in[0]src_data
addr_in+4addr_in[1]mfdb
+
+ + +
+ +

8.13.16 x_graf_rubberbox

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Extended rubberband box drawing« +
  +
AES-Nummer: 28977 +
  +
Deklaration: int16_t x_graf_rubberbox(GRECT *area, GRECT *outer, int16_t +minwidth, int16_t minheight, int16_t maxwidth, int16_t maxheight, +int16_t snap, int16_t lag ); +
  +
Beschreibung: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
area Initial size of the rubberband box +
outer Outer limit of the rubberband box +
minwidth Minimum width of the rubberband box +
minheight Minimum height of the box +
maxwidth Maximum width of the box +
maxheight Maximum height of the box +
snap Width/height increment +
lag +
+
+ + + + + + + + + + +
0=Follow mouse exactly
1=Move relative to initial width and height
+
+ + +
+ +
This function is similar to the AES function graf_rubberbox, but +it offers several extensions. +
  +
    +
  • The area parameter points to a GRECT structure which +describes the dimensions of the initial rubberband box. If the lag +parameter is zero, then the g_w and g_h elements of area are ignored. +
  • +
  • outer describes the size of the outside bounding +rectangle. The rubberband box will never go outside this box. If this +is a NULL pointer, the outside boundaries will be the whole desktop. +
  • +
  • minwidth and minheight describe the minimum +height of the rubberband box; maxwidth and maxheight +are the maximums. If either of the minimums are greater than zero, +then extended resizing is possible. In this mode, the mouse can be +dragged to the left or top edge of the minimum area, and resizing +happens in a manner similar to Geneva's extended window resizing. +
  • +
  • snap is the number of pixels to jump by. If this value +is greater than 1, the rubberband box will only move when its width or +height is an even increment of this value. +
  • +
  • The lag parameter says whether the rubberband box +should exactly follow the mouse, or if it should stay a constant +distance from the mouse pointer. When resizing a window, Geneva uses +the lag mode so that if the resize gadget is released before the mouse +is moved, the window will not be resized. +
  • +
+ +
Ergebnis: 0 = The mouse was released prematurely +
1 = Kein Fehler +
  +
Verfügbar: Die Funktion steht nur unter Geneva zur Verfügung. +
  +
Gruppe: Grafikfunktionen +
  +
Querverweis: Binding   graf_rubberbox   graf_multirubber +
  + +
+ +

8.13.16.1 Bindings für x_graf_rubberbox

+ + + + + + + + + +
C: int16_t x_graf_rubberbox(GRECT *area, GRECT *outer, int16_t +minwidth, int16_t minheight, int16_t maxwidth, int16_t maxheight, +int16_t snap, int16_t lag ); +
  +
Umsetzung: +
  +
int16_t x_graf_rubberbox(GRECT *area, GRECT *outer, int16_t
+minwidth, int16_t minheight, int16_t maxwidth, int16_t
+maxheight, int16_tsnap, int16_t lag )
+{
+   int_in[0] = minwidth;
+   int_in[1] = minheight;
+   int_in[2] = maxwidth;
+   int_in[3] = maxheight;
+   int_in[4] = snap;
+   int_in[5] = lag;
+
+   addr_in[0] = area;
+   addr_in[1] = outer;
+
+   crys_if(28977);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]28977 # Opcode der Funktion
control+2control[1]6 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]minwidth
int_in+2int_in[1]minheight
int_in+4int_in[2]maxwidth
int_in+6int_in[3]maxheight
int_in+8int_in[4]snap
int_in+10int_in[5]lag
addr_inaddr_in[0]area
addr_in+4addr_in[1]outer
int_outint_out[0]Return-Wert
+
+ + +
+ +
+ +Home +AESAES +Geneva FunktionenGeneva Funktionen +Klemmbrett-FunktionenKlemmbrett-Funktionen + + diff --git a/de/guidelines.html b/de/guidelines.html new file mode 100644 index 000000000..b8d01c431 --- /dev/null +++ b/de/guidelines.html @@ -0,0 +1,38 @@ + + + + + +Die Anleitung zum TOS: Programmierrichtlinen + + + + + + + + + +Home +Inhaltsverzeichnis +Das XCONTROLDas XCONTROL +Drei wichtige ProgrammierregelnDrei wichtige Programmierregeln + +
+ +

10 Programmierrichtlinen

+ +
+
+ +Home +Inhaltsverzeichnis +Das XCONTROLDas XCONTROL +Drei wichtige ProgrammierregelnDrei wichtige Programmierregeln + + diff --git a/de/guidelines_rules.html b/de/guidelines_rules.html new file mode 100644 index 000000000..2da04be46 --- /dev/null +++ b/de/guidelines_rules.html @@ -0,0 +1,91 @@ + + + + + +Die Anleitung zum TOS: Drei wichtige Programmierregeln + + + + + + + + + +Home +ProgrammierrichtlinenProgrammierrichtlinen +ProgrammierrichtlinenProgrammierrichtlinen +Style-GuidelinesStyle-Guidelines + +
+ +

10.1 Drei wichtige Programmierregeln

+

Da das Betriebssystem TOS relativ sauber in mehrere Schichten +gegliedert ist, sollten alle Programmierer bei der Erstellung einer +Applikation die folgenden drei Regeln im Hinterkopf behalten: +

+
    +
  • Niemals für eine Aufgabe Aufrufe verschiedener +Betriebssystemschichten vermischen. Beispiel: In GEM-Programmen werden +Maus und Tastatur per AES abgefragt, und nicht etwa über das BIOS. +Die Mißachtung dieser Regel kann zu Konflikten zwischen den +verschiedenen Schichten führen. +
      +

  • +
  • Niemals von irgendwelchen unsicheren Annahmen über +interne Zusammenhänge zwischen den einzelnen Schichten ausgehen. +Beispiel: Ein GEMDOS Laufwerk kann sowohl auf einem BIOS- als auch +auf einem MetaDOS Gerät liegen. Die Maus hängt normalerweise am +Tastaturchip, sie muss es aber nicht (neue Hardware, +Tastaturinterfaces etc.) +
      +

  • +
  • Immer nach Möglichkeit die höchste +Betriebssystemschicht für eine Aufgabe benutzen. Beispiel: Die zu +benutzende Sprache könnte zwar aus dem Betriebssystemheader ermittelt +werden, besser ist es jedoch, hierfür den _AKP-Cookie bzw. die +Funktion appl_getinfo zu benutzen. +
      +

  • +
+ +

Darüber hinaus existieren viele weitere Programmierregeln, +die eigentlich bekannt sein sollten, aber leider immer noch nicht von +allen Applikationen beachtet werden. Einige Beispiele: +

+
    +
  • Nur soviel Speicherplatz belegen wie unbedingt nötig ist, +damit in einer Multitasking-Umgebung auch noch andere Prozesse +gestartet werden bzw. sinnvoll arbeiten können. +
      +

  • +
  • Den Eintritt in den Supervisor-Modus so oft wie nur möglich +vermeiden, da er eigentlich nur für das Betriebssystem +gedacht ist, und in vielen Umgebungen kein Task-Switching +stattfindet, wenn sich ein Prozess in diesem Modus befindet. +
      +

  • +
  • Niemals direkt in den Bildschirmspeicher schreiben, sondern +stattdessen auf die jeweiligen GEM-Funktionen (AES, VDI) +zurückgreifen. +
      +

  • +
  • Niemals auf Speicher zugreifen der nicht dem eigenen Programm +gehört, oder für dieses zugänglich gemacht worden ist, da es in +Systemen mit Speicherschutz sonst zu einer Exception kommt. Ferner +sollte Speicher immer so alloziert werden, daß andere Prozesse +möglichst nicht auf diesen zugreifen können. +
      +

  • +
+ +
+ +Home +ProgrammierrichtlinenProgrammierrichtlinen +ProgrammierrichtlinenProgrammierrichtlinen +Style-GuidelinesStyle-Guidelines + + diff --git a/de/guidelines_styles.html b/de/guidelines_styles.html new file mode 100644 index 000000000..dea94579e --- /dev/null +++ b/de/guidelines_styles.html @@ -0,0 +1,819 @@ + + + + + +Die Anleitung zum TOS: Style-Guidelines + + + + + + + + + +Home +ProgrammierrichtlinenProgrammierrichtlinen +Drei wichtige ProgrammierregelnDrei wichtige Programmierregeln +MagiCMagiC + +
+ +

10.2 Style-Guidelines

+ +

Wenn man mehrere GEM-Applikationen der gleichen Kategorie +betrachtet, so fällt auf, daß einige Programme leicht und andere +wiederum sehr schwer zu bedienen sind. Eine Textverarbeitung wie z.B. +Papyrus dürfte sicherlich von den meisten Anwendern +problemlos zu bedienen sein; ganz im Gegensatz zu Programmen wie +Signum!2, das vielen Benutzern den Angstschweiß auf die Stirn +treibt. +

+

Ob ein Programm leicht zu bedienen ist, hängt in hohem Maße +von der Gestaltung der Benutzerschnittstelle ab. Dieses Kapitel +versucht einige Tips zur Gestaltung des User-Interfaces zu geben, und +behandelt die folgenden Punkte bzw. Aspekte: +

+ + +

Allen Software-Entwicklern wird dringend empfohlen, den hier +gemachten Empfehlungen Folge zu leisten bzw. sich an vorbildlichen +GEM-Applikationen zu orientieren. Die Akzeptanz eines Programms (und +damit der Verkaufserfolg) hängt neben der Funktionalität zu einem +großen Teil von der Gestaltung der Benutzerschnittstelle ab. +

+

Beispiele für Fehler im GUI-Design bzw. eine schlechte +Benutzerführung findet man unter +http://www.iarchitect.com/mshame.htm. +

+

Querverweis: AES   VDI   GDOS +

+

10.2.1 Dialogboxen

+ +

Bei der Gestaltung der Dialogboxen sollte ein +Software-Entwickler auf eine innere und äußere Konsistenz achten, +d.h. er sollte sich an vorbildlichen Dialogboxen anderer Programme +orientieren (äußere Konsistenz), und darauf achten, daß innerhalb +seiner Anwendung die Dialogboxen ein einheitliches Outfit erhalten +(innere Konsistenz). +

+ +

Die folgende Liste nennt beispielhaft einige Aspekte, die +beim Design von Dialogboxen beachtet werden sollten: +

+
    +
  • gleicher Aufbau aller Dialogboxen der Applikation +
      +

  • +
  • möglichst gleicher Aufbau der Dialogboxen aller Applikationen +
      +

  • +
  • jeder Dialog sollte eine in sich abgeschlossene Teilaufgabe +behandeln +
      +

  • +
  • für gleiche Aktionen einheitliche Buttons verwenden +
      +

  • +
  • Informationen in logische Blöcke aufspalten +
      +

  • +
  • überflüssige Informationen weglassen +
      +

  • +
  • nicht zu viele Objekte auf einer Ebene verwenden +
      +

  • +
  • aktivierbare Elemente deutlich von Anzeigen trennen +
      +

  • +
  • Spezialeffekte und Farben sehr überlegt und sparsam einsetzen +
      +

  • +
+ +

Darüber hinaus sollte man sich genau überlegen, welche Art von +Dialog für welchen Zweck eingesetzt wird. Hier lassen sich die +folgenden Dialogarten unterscheiden: +

+ + +

+

Alertboxen werden eingesetzt, um den Benutzer über +wichtige Ereignisse zu informieren, oder um Rückfragen an ihn zu +stellen. Sie informieren in knapper Form über den Sachverhalt, und +bieten ggfs. mehrere Alternativen, um auf diesen zu reagieren. Die +Abbildung oben zeigt eine Alertbox, die zur aktiven Unterstützung von +Multitasking in ein Fenster gelegt wurde. +

+ + +

+

Modale Dialogboxen sollten immer dann benutzt werden, +wenn der Benutzer zu einer sofortigen Aktion gezwungen werden muß +bzw. soll. Der Anwender kann erst dann in der Applikation +weiterarbeiten, wenn er den entsprechenden Dialog verlassen hat. Die +Abbildung oben zeigt eine modale Dialogbox, die zur aktiven +Unterstützung von Multitasking in ein Fenster gelegt wurde. Modale +Fensterdialoge können vom Benutzer anhand des fehlenden Closers der +Fensterkomponenten erkannt werden. +

+ + +

+

Unmodale Dialogboxen sollten eingesetzt werden, wann +immer dies möglich ist. Ein solcher Dialog existiert wie ein Fenster +parallel zum eigentlichen Programm, und bietet dem Anwender ein +Maximum an Flexibilität. Die Abbildung oben zeigt eine nicht-modale +Dialogbox, die zur aktiven Unterstützung von Multitasking in ein +Fenster gelegt wurde. Nicht-modale Fensterdialoge können vom Benutzer anhand +des Closer in den Komponenten des Fensters erkannt werden. +

+

Wichtig: Damit in einer Multitasking-Umgebung alle +Applikationen zu jeder Zeit ungehindert Ausgaben auf dem Bildschirm +tätigen können, sollten die Alert- und Dialogboxen eines Programms +unbedingt in Fenster gelegt werden. Einige Applikationen (z.B. der +Resource-Editor Interface) erlauben es, jederzeit zwischen +konventionellen Dialogen und Fensterdialogen umzuschalten; diese +Möglichkeit sollte jedoch nur dann angeboten werden, wenn es wirklich +notwendig ist. Im Hinblick auf zukünftige bzw. bereits bestehende, +Multitasking-fähige TOS-Versionen, werden koventionelle Dialoge nur +noch eine untergeordnete Rolle spielen. +

+

Querverweis: AES   Fensterdialoge   Formulare +

+

10.2.2 Hilfesysteme

+

Mit steigender Komplexität einer Software steigt auch die +Notwendigkeit der aktiven Anwenderunterstützung, durch ein überlegt +implementiertes Hilfesystem. +

+

+

Neben der Entlastung des Langzeitgedächtnisses sollte +solch ein System dem Anwender die 4 folgenden Fragen beantworten: +

+
    +
  • Wo bin ich? +
  • +
  • Was kann ich hier tun? +
  • +
  • Wie kam ich hierhin? +
  • +
  • Wo kann ich hin, und wie komme ich dorthin? +
  • +
+ +

Ein sehr gutes Hilfesystem bietet die relationale Datenbank +Phoenix der Firma Application Systems Heidelberg (ähnliches +bieten auch Pure-C, Grismo oder der ST-Guide). +

+ +

Prinzipiell arbeitet solch ein System wie folgt: Die +gewünschten Informationen werden in einem Fenster angezeigt, und +durch optisch hervorgehobene Querverweise lassen sich per +Mausklick jederzeit weitere Informationen zu bestimmten Themen +ermitteln. Über ein Inhaltsverzeichnis ist es möglich wie in einem Buch zu +bestimmten Themen zu springen, ein Index ermöglicht die gezielte +Suche einer bestimmten Information. +

+ + +

Bewährt hat sich vor allem die kontext-sensitive Hilfe: +Hierunter versteht man eine Hilfestellung, die sich auf die +augenblickliche Situation bezieht. +

+

Ist beispielsweise ein Fenster oder eine Dialogbox geöffnet, so +erscheint beim Aufruf des Hilfesystems eine Erklärung zu genau diesem +Fenster bzw. +

+ +

Bei der Entwicklung eines Hilfesystems für eine Applikation +sollten die folgenden Punkte berücksichtigt werden: +

+
    +
  • in jeder Dialogbox sollte sich ein Hilfe-Knopf +befinden, bei dessen Betätigung Informationen über genau diesen +Dialog erscheinen. +
      +

  • +
  • in jeder Fehlermeldung sollte sich ein Hilfe-Knopf +befinden, bei dessen Betätigung dem Benutzer erklärt werden soll, +warum der Fehler aufgetreten ist, und wie er sich beheben läßt. +
      +

  • +
  • ist ein Fenster der Applikation (und keine Dialogbox) +geöffnet, so muß zu diesem Fenster eine Hilfemeldung ausgegeben +werden. In diesem Zusammenhang sei darauf hingewiesen, daß auch die +Funktionsweise des Hilfesystems selbst erklärt werden muß. +
      +

  • +
  • falls keine Fenster bzw. Dialogboxen geöffnet sind, und auch keine +Objekte (z.B. Icons) der Applikation selektiert sind, so sollte eine +generelle Hilfe zum Programm selbst eingeblendet werden. +
      +

  • +
+ +

+

Jeder Hilfetext sollte mindestens die folgenden Informationen +beinhalten: +

+
    +
  • auf welches Objekt bezieht sich die Hilfe (Fenster, Dialogbox, +Icon etc.) ? +
      +

  • +
  • welche Aktionen können an bzw. mit diesem Objekt ausgeführt +werden? +
      +

  • +
+ + +

Die von vielen Software-Entwicklern geäußerte Angst, durch ein +zu gutes Hilfesystem das Raubkopieren zu unterstützen, ist +zwar verständlich, sollte aber nicht auf Kosten der ehrlichen +Anwender ausgetragen werden. +

+

Querverweis: AES   Fensterverwaltung +

+

10.2.3 Mausklicks und Formen

+

Auch ein relativ unscheinbares Objekt wie der Mauszeiger hat in +einem System mit grafischer Benutzeroberfläche eine wichtige +Bedeutung. Sowohl die Anzahl der Mausklicks, als auch die Form des +Mauszeigers sind für den Anwender eines Programms von besonderem +Interesse. +

+

Es hat sich eingebürgert, je nach auszuführender Operation dem +Mauszeiger eine bestimmte Form zuzuordnen; im einzelnen: +

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Form des MauszeigersBedeutung
Pfeilallgemeine Bedienung (Regelfall)
BalkenTexteingabe
Biene bzw. Sanduhrder Computer ist mit einer Operation beschäftigt,
 und der menschliche Benutzer kann während der
 Ausführung dieser Aktion nichts machen
ZeigefingerAuswahl oder Dimensionierung
flache HandVerschieben oder positionieren von Objekten
Fadenkreuz, dünnZeichnen oder Auswahl
Fadenkreuz, dickkeine feste Bedeutung
Fadenkreuz, Umrißkeine feste Bedeutung
+
+ +

Darüber hinaus läßt sich der Mauszeiger auch komplett +abschalten; dies ist z.B. bei der Ausführung von Zeichenoperationen +sinnvoll, um Pixelmüll zu vermeiden. In besonderen Fällen kann die +Form des Mauszeigers auch frei definiert werden; dabei sollte die neue +Form des Mauszeigers allerdings immer zur jeweiligen Situation passen. +

+ +

Als Faustregel gilt, daß der Mauszeiger außerhalb des +Arbeitsbereiches des eigenen Fensters immer die Form eines Pfeils +besitzen sollte. +

+

Auch über die Anzahl der Mausklicks gibt es einiges zu +berichten. Ein einfacher Klick dient i.a. dazu, bestimmte Elemente +auszuwählen. Das könnten Elemente einer Dialogbox (Checkboxen, +Radiobuttons, etc.), Icons auf dem Desktop einer Shell, aber auch die +Komponenten eines Fensters sein. In vielen Fällen lassen sich über +einen einfachen Klick weitere Aktionen auslösen. Wird der Mausknopf +beispielsweise nicht losgelassen, so können Objekte wie Icons +verschoben werden, oder es läßt sich eine ganze Gruppe von Objekten +auswählen, d.h. selektieren. +

+ + +

Ein Doppelklick leitet meist eine spezielle Operation +ein; der Desktop startet beispielsweise ein Programm, wenn auf das +zugehörige Sinnbild doppelt geklickt wird. +

+ + +

Prinzipiell stehen neben dem Einfach- und Doppelklick auch +Drei- oder Vierfachklicks mit der Maus zur Verfügung. Von +diesen Varianten ist jedoch dringend abzuraten, da es vielen Menschen +erhebliche Probleme bereiten dürfte, innerhalb eines bestimmten +Zeitintervalls die entsprechende Anzahl von Mausklicks auszuführen. +

+ +

Last but not least lassen sich Mausklicks auch in +Zusammenhang mit der Tastatur (Alternate, Control, Shift) +einsetzen. Ein Mausklick in Verbindung mit einer Shift-Taste sorgt +i.a. dafür, daß weitere Objekte ausgewählt werden können. Die +Shell Gemini öffnet bei einem Doppelklick auf ein Icon und +gleichzeitig gedrückter Alternate-Taste, ein Fenster mit dem zu +diesem Icon gehörenden Verzeichnis. +

+

Querverweis: graf_mouse +

+

10.2.4 Menüs und Menüzeilen

+ +

Die Gestaltung der Menüs ist in hohem Maße mitverantwortlich +für die Übersichtlichkeit und Benutzerfreundlichkeit einer +Applikation. Deshalb sollte sich jeder Software-Entwickler genügend +Zeit nehmen, um diese sinnvoll und ansprechend zu gestalten. +

+ +

Wie bereits erwähnt ist die Kapazität des +Kurzzeitgedächtnisses beschränkt. Aus diesem Grund sollte eine +Menüzeile möglichst nicht mehr als sieben Menü-Punkte anbieten; +anderenfalls muß ein Benutzer mehrere Male auf die Menüzeile +blicken, um entscheiden zu können, welche Auswahl er treffen will. +Die folgende Abbildung zeigt die Hauptmenüzeile des relationalen +Datenbanksystems Phoenix: +

+
     MANAGER  Datei  Bearbeiten  Prozeß  Parameter  Optionen  Hilfe
+
+ +

Sowohl die Menüzeile als auch die darin enthaltenen Menüs +sollten einen Standardaufbau besitzen, damit sich ein Anwender +nach dem Starten eines Programms sofort "heimisch" fühlt. +Das erste Menü von links sollte stets den Namen der aktuellen +Applikation tragen; dies hat in einer Multitasking-Umgebung den +unschätzbaren Vorteil, durch einen kurzen Blick auf die Menüzeile +die aktive Applikation identifizieren zu können. +

+

+

Der zweite Menütitel sollte immer den Namen Datei +besitzen, und Menüpunkte anbieten, die sich mit verschiedenen +Aspekten der Ein- und Ausgabe befassen. Der unterste Eintrag in diesem +Menü sollte stets die Möglichkeit bieten, das Programm zu verlassen. +

+ +

Wie man in der obenstehenden Abbildung sieht, können einzelne +Einträge innerhalb eines Menüs zu logischen Untergruppen +zusammengefaßt werden, was erheblich zur übersichtlichkeit und +Akzeptanz durch den Benutzer beiträgt. +

+

Um unnötige Handbewegungen zwischen Tastatur und Maus zu +verhindern, sollte jeder Menüpunkt auch durch eine +Tastenkombination (Shortcut) aufgerufen werden können. Es +handelt sich dabei meist um Control- bzw. Alternate-Sequenzen, die am +rechten Rand eines Menüs angezeigt werden sollten, und dabei +mindestens ein Leerzeichen Abstand zum eigentlichen Eintrag bieten. +Dieser wiederum beginnt immer zwei Zeichen vom linken und eines vom +rechten Rand entfernt, um genug Platz für ein Häkchen zu bieten. +

+ +

Dabei spielt es keine Rolle, ob überhaupt ein solches angezeigt +werden soll oder nicht. Drei Punkte hinter einem Menüpunkt +deuten an, daß sich nach Auswahl dieses Eintrags eine Dialogbox (oder +der Fileselektor) öffnet. Der Benutzer kann sich dann darauf +einstellen, und z.B. den Mauszeiger schon in die Mitte des Bildschirms +bewegen, während der Dialog aufgebaut wird. +

+

Weitere und oft benutzte Menütitel sind Bearbeiten, +Parameter, Optionen und Hilfe. Ersterer befindet sich +stets rechts vom +

+ +

Datei-Menü, letzterer sollte immer am rechten Ende einer +Menüzeile plaziert werden. Jeder Titel sollte mit einem +Großbuchstaben beginnen (der ganz links stehende Name des Programms +wird komplett in Großbuchstaben angegeben), aus nur einem Wort +bestehen, und als Abgrenzung zu den anderen Titeln je ein +Leerzeichen nach links und rechts enthalten. +

+ + +

Darüber hinaus sollte man Menüeinträge immer +kontext-sensitiv gestalten, d.h. ein Eintrag darf nur dann +anwählbar sein, wenn dies in der aktuellen Situation des Programms +möglich bzw. sinnvoll ist. So macht es beispielsweise keinen Sinn, +den Menüeintrag Speichern aufzurufen, wenn es nichts zu +speichern gibt. Gleiches gilt auch für einen Eintrag +Schließen, der nur dann anwählbar sein sollte, wenn es auch +ein Fenster bzw. einen Dialog gibt, der geschlossen werden kann. +

+

+

Von der konventionellen Menüzeile abgesehen gibt es noch +weitere und interessante Möglichkeiten, dem Benutzer eine Auswahl zu +ermöglichen. Viele Programme (z.B. die Shell Thing oder +Ease - vgl. Abbildung) stellen dem Benutzer +Pop-Up-Menüs zur Verfügung um schnell zwischen verschiedenen +Alternativen auswählen zu können oder eine Operation +

+ + +

auszuführen. Der Hauptvorteil eines Pop-Up-Menüs besteht +darin, die Mauswege zu verkürzen. Das Menü erscheint +einfach an der Bildschirmposition, an der ein Mausklick ausgeführt +wird. Bei der Implementierung von Pop-Up-Menüs sollte man darauf +achten, daß diese immer vollständig auf dem Bildschirm erscheinen. +

+ +

Last but not least gibt es die Möglichkeit, eine Menüzeile +im Fenster unterzubringen. Diese Methode bietet verschiedene +Vorteile: erstens läßt sich auf diese Art und Weise die +Hauptmenüzeile entlasten und dadurch viel übersichtlicher gestalten, +zweitens ist es dadurch möglich, eine Applikation viel logischer +aufzubauen. Alle Operationen die lokal auf ein Fenster wirken, wandern +in das Fenstermenü, alle anderen in die globale Menüzeile. +

+

+ +

Da man Fenster nicht nur auf dem Bildschirm verschieben, sondern +i.a. auch in der Größe verändern kann, ist es möglich, daß nicht +alle Titel eines Fenster-Menüs sichtbar sind. Einige Programme +erlauben es daher, die Menüzeile zu scrollen. Dies ist z.B. +beim Texteditor Grismo, oder beim Resource Editor +Interface der Fall. +

+

Querverweis: AES   Menüfunktionen +

+

10.2.5 Optische und akustische Rückmeldungen

+ + + +

Beim Arbeiten am Computer ist der menschliche Benutzer auf +optische oder akustische Rückmeldungen angewiesen, um stets das +Gefühl zu haben, die auszuführende Aufgabe zu kontrollieren, bzw. +den aktuellen Stand der Bearbeitung erfassen zu können. +

+

Das GEM bietet eine Vielzahl von Möglichkeiten, dem Anwender +ein Feedbackgefühl zu vermitteln. So werden z.B. Menütitel oder +Icons invertiert, wenn der Benutzer diese mit der Maus selektiert. +

+

Akustische Rückmeldungen sind besonders im Zusammenhang +mit Fehler-, bzw. Warnmeldungen sinnvoll, die in Dialogboxen angezeigt +werden können. +

+

Optische Rückmeldungen sind immer dann einzusetzen, +wenn der Benutzer Objekte auf dem Bildschirm selektiert, oder eine +Aufgabe mit einer längeren Bearbeitungsphase startet. Der Anwender +darf niemals darüber im Unklaren gelassen werden, welche Operation +gerade ausgeführt wird, und wie weit sie fortgeschritten ist. Dabei +sind grafische Kontrollanzeigen i.a. den textuellen +vorzuziehen, da letztere vom Benutzer erst dekodiert werden müssen. +

+

+

Optische Rückmeldungen werden z.B. vom relationalen +Datenbanksystem Phoenix eingesetzt, um den Benutzer über den Stand +einer Abfrage zu unterrichten; die Shell Gemini benutzt diese Methode, +um dem Anwender beim Formatieren von Disketten ein Zeitgefühl zu +vermitteln, und der Texteditor Grismo invertiert u.a. +Querverweise seines Hilfesystems, wenn der Benutzer diese mit der Maus +aktiviert. +

+

Querverweis: AES   Style-Guidelines +

+

10.2.6 Selektionen

+

Unter einer Selektion versteht man das Auswählen eines oder +mehrerer Objekte. Auf dem Desktop lassen sich beispielsweise die +Dateien eines Laufwerkfensters per Mausklick, Shift-Mausklick oder +durch Aufziehen eines Gummibandes selektieren. +

+

+

Grundsätzlich gelten die folgenden Konventionen: +

+ + +

Mausklick: Durch einen einfachen Klick mit der Maus wird +das ausgewählte Objekt selektiert; bereits ausgewählte Objekte +müssen wieder deselektiert werden. +

+ + +

Shift-Mausklick: fügt das ausgewählte Objekt in die +Menge der bereits selektierten Objekte ein (bereits ausgewählte +Objekte bleiben also weiterhin selektiert). Durch einen +Shift-Mausklick auf ein selektiertes Objekt wird dieses aus der Menge +der ausgewählten Objekte wieder entfernt. +

+ + +

Gummiband: Durch Aufziehen eines Gummibandes (Rubberbox) +werden alle Objekte die von diesem Band geschnitten werden, +selektiert; bereits ausgewählte Objekte müssen wieder deselektiert +werden. Durch Kombination mit der Shift Taste können die betroffenen +Objekte in die Menge der ausgewählten Objekte eingefügt werden. +

+ + +

Eine besonders angenehme Art der Selektion ist die +Echtzeit-Selektion. Hierunter versteht man, daß der +ausgewählte Bereich bereits während der Bewegung des Mauszeigers +invertiert wird. Viele Programme wie Pure-C, Gemini +oder Grismo nutzen diese Methode der Selektion, und scrollen +dabei sogar automatisch den Inhalt des Fensters, wenn der Fensterrand +erreicht wird. +

+

Querverweis: AES   Style-Guidelines +

+

10.2.7 Spezialeffekte

+

Beim Einsatz von Farben, Texteffekten etc. ist besondere +Vorsicht angebracht. Hier gilt die zumeist die Devise: Weniger ist +mehr ! +

+

Es kann an dieser Stelle kein Patent-Rezept, sondern nur der +Ratschlag gegeben werden, sich an vorbildlichen Applikationen zu +orientieren. +

+ +

Speziell bei Verwendung von Farben sollte ein +Software-Entwickler immer im Hinterkopf haben, daß das +Farbempfinden eines Menschen sehr subjektiv ist; daraus folgt, +daß es dem Benutzer möglich sein sollte, die für ihn angenehmen +Farben einstellen zu können. +

+

+

Eine vorbildliche Applikation in dieser Hinsicht ist z.B. das +relationale Datenbanksystem Phoenix von Application Systems +Heidelberg. Hier läßt sich nahezu die gesamte Benutzeroberfläche +vom Anwender frei konfigurieren. +

+ +

In Textdokumenten sollte darauf geachtet werden, nicht zu viele +Texteffekte gleichzeitig einzusetzen bzw. zu vermischen. Auch hier gilt: +Weniger ist mehr ! Doch kann diese Aussage auch nicht +pauschalisiert werden: Es gibt Fälle, in denen der Einsatz mehrerer +Effekte zum gleichen Zeitpunkt nicht nur toleriert werden kann, +sondern sogar sinnvoll ist. In einem Hypertext-system +beispielsweise müssen Querverweise dem Benutzer besonders +deutlich gemacht werden. Auf nahezu allen Plattformen gilt der +Standard, diese Referenzen unterstrichen, und wenn möglich, +gleichzeitig auch in Farbe darzustellen. Das hat den Vorteil, daß +Textstellen, die einen einfachen Effekt nutzen, trotzdem noch von +Querverweisen unterschieden werden können. +

+

Das Fehlen eines Patent-Rezeptes führt bei vielen Entwicklern +zu Unsicherheit, die darin gipfelt, auf Spezialeffekte bzw. Farbe ganz +zu verzichten. Das kann jedoch nicht Sinn der Sache sein ! So +kann Farbe, sinnvoll eingesetzt, nicht nur zu erheblich mehr +Übersichtlichkeit beitragen, sondern auch die Attraktivität einer +Applikation drastisch erhöhen. +

+

Lange Rede - kurzer Sinn: Spezialeffekte (gleich welcher Art) +sollten sehr überlegt und sparsam eingesetzt werden. +

+ + +

Bei der Entwicklung eines Softwareproduktes tut ein +Programmierer gut daran, möglichst früh den Benutzer in seine Arbeit +einzubeziehen (User-Testing), und sich an vorbildlichen +Programmen zu orientieren. Am sinnvollsten ist es, alle heiklen Punkte +für den Anwender frei konfigurierbar zu machen ! +

+

Querverweis: AES   Style-Guidelines +

+

10.2.8 Tastaturbelegung

+

Da der Mensch ein Gewohnheitstier ist, wäre es wünschenswert, +wenn nicht nur Dialoge und Menüs möglichst einheitlich aufgebaut +werden, sondern die wichtigsten Funktionen eines Programms auch per +Tastatur einheitlich aufgerufen werden könnten. +

+ +

Tatsächlich gibt es eine Reihe von Befehlstasten-Kombinationen +(Shortcuts) die entweder fest genormt sind, oder sich aber als quasi +Standard etabliert haben; im einzelnen: +

+ +

Genormt laut Beschluß der Entwicklerkonferenz (August +'89): +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tasten-KombinationFunktion
Control-Ckopieren
Control-Fsuchen
Control-Oöffnen
Control-QProgramm beenden
Control-Veinfügen
Control-Xausschneiden
Shift-"Pfeil hoch"eine Seite zurück blättern
Shift-"Pfeil runter"eine Seite vorwärts blättern
Shift-"Pfeil links"Cursor zum Anfang der Zeile
Shift-"Pfeil rechts"Cursor an das Ende der Zeile
Control-"Pfeil links"um ein Wort zurück
Control-"Pfeil rechts"um ein Wort vorwärts
Homean den Anfang des Dokumentes
Shift-Home (Clr)an das Ende des Dokumentes
+
+ + +

Nicht genormt, aber Quasi-Standard: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tasten-KombinationFunktion
Control-Aalles auswählen
Control-Gnächste Fundstelle
Control-MSichern unter...
Control-NNeues Dokument
Control-PDrucken
Control-SSichern
Control-RErsetzen
Control-UOberstes Fenster schließen
Control-Wzum nächsten Fenster blättern
Control-Yaktuelle Zeile ausschneiden
Control-ZShell starten
+
+ + +

Wichtiger Hinweis: Alle +'Alternate-Control'-Tastenkombinationen sind für das Betriebssystem +reserviert. Als Beispiele seien an dieser Stelle genannt: +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +
Tasten-KombinationFunktion
Alternate-Control-TabTaskwechsel unter MagiC
Alternate-Control-DeleteShut-Down-Sequenz starten
Alternate-Control-EscProgramm-Manager unter MagiC
Alternate-Control-Spaceaktuelles Fenster ikonifizieren
dto. jedoch mit ShiftApplikation ikonifizieren
+
+ +

Querverweis: Bedienung des Fileselektors   ASCII-Tabelle   Scan-Code Tabelle +

+

10.2.9 Toolboxen

+

Es kann vorkommen, daß der Platz in der Menüleiste und den +Dialogboxen einer Applikation nicht ausreicht, um die volle Funktionalität +darin unterzubringen. +

+

Anstatt nun die Menüleiste zu überfüllen, oder zu viele +Informationen in einen Dialog zu quetschen, sollte man in diesen +Fällen auf eine Werkzeugleiste (Toolbox) oder lokale +Menüzeilen in Fenstern zurückgreifen. +

+

In nahezu allen Fällen lassen sich dadurch die entsprechenden +Funktionen in der Benutzerschnittstelle unterbringen, - und dazu noch +übersichtlich. +

+

Toolboxen werden i.a. am oberen oder rechten Rand eines Fensters +angeboten. +

+

+

Lokale Menüzeilen und Werkzeugleisten werden z.B. vom +Resource-Editor Interface eingesetzt. Es kann nützlich sein, wenn man +eine Toolbox (zumindest kurzfristig) ausblenden kann, um so +mehr der eigentlich wichtigen Informationen im Fenster darstellen zu +können; dies erlaubt beispielsweise der Texteditor Grismo. +

+

Querverweis: AES   Style-Guidelines +

+
+ +Home +ProgrammierrichtlinenProgrammierrichtlinen +Drei wichtige ProgrammierregelnDrei wichtige Programmierregeln +MagiCMagiC + + diff --git a/de/history.html b/de/history.html new file mode 100644 index 000000000..f6fde80f3 --- /dev/null +++ b/de/history.html @@ -0,0 +1,4604 @@ + + + + + +Die Anleitung zum TOS: Neu in dieser Version + + + + + + + + + +Home +EinleitungEinleitung +Altes Vorwort von Rolf KotzianAltes Vorwort von Rolf Kotzian +The GNU General Public LicenceThe GNU General Public Licence + +
+ +

1.3 Neu in dieser Version

+ +
+

1.3.1 Version 5.01

+
2014-12-23 Tuesday 19:00  Gerhard Stoll
+
+        * gem/vdi/control/: v_opnvwk.ui, v_opnwk.ui:
+
+        Value for work_in[0] is only x = 2 + Getrez() (Mike Fulton)
+
+2014-11-15 Saturday 10:29  Gerhard Stoll
+
+        * magic/magic_en.u:
+
+        Correct label (Lonny Pursell)
+
+2014-10-28 Tuesday 18:36  Gerhard Stoll
+
+        * gem/aes/aes_f.u:
+
+        Add function appl_options (Lonny Pursell)
+
+        * gem/aes/graf_/graf_multirubber.ui:
+
+        Wrong parameter name (Lonny Pursell)
+
+2014-07-20 Sunday 08:51  Gerhard Stoll
+
+        * gem/vdi/vdi_f.u:
+
+        Add function from the MATRIX TC-VDI
+
+2014-04-06 Sunday 15:39  Gerhard Stoll
+
+        * bios/structures/pun_info.ui:
+
+        Add bit for Falcon IDE and USB
+
+2014-04-05 Saturday 08:12  Gerhard Stoll
+
+        * xbios/pci_bios/pci_bios.u:
+
+        Correct cookie
+
+2014-04-05 Saturday 08:11  Gerhard Stoll
+
+        * protokol/xssi.u:
+
+        Correct text
+
+2014-04-05 Saturday 08:10  Gerhard Stoll
+
+        * gem/aes/appl_/appl_get_cicon.ui:
+
+        Add english version
+
+2014-04-05 Saturday 08:10  Gerhard Stoll
+
+        * bios/cookie/description/XSSI.ui:
+
+        Add link
+
+2014-04-05 Saturday 08:10  Gerhard Stoll
+
+        * bios/cookie/description/PCI_.ui:
+
+        Change link
+
+2014-04-05 Saturday 08:09  Gerhard Stoll
+
+        * bios/cookie/description/_PCI.ui:
+
+        Change Link
+
+2014-03-18 Tuesday 19:44  Gerhard Stoll
+
+        * protokol/xssi.u:
+
+        ID from BUBBLES
+
+2014-03-18 Tuesday 19:44  Gerhard Stoll
+
+        * html/tos_hyp.u:
+
+        Link to the archives
+
+2014-03-18 Tuesday 19:43  Gerhard Stoll
+
+        * anhang/typedefs.u:
+
+        Change headline from MCB for MagiC
+
+2014-03-18 Tuesday 16:17  Gerhard Stoll
+
+        * gem/aes/: aes_f.u, appl_/appl_.u, appl_/appl_get_cicon.ui:
+
+        New function appl_get_cicon from Olivier Landemarre
+
+2014-03-14 Friday 18:58  Gerhard Stoll
+
+        * gem/aes/evnt_/messages/messages.u:
+
+        Messages from Tetrax
+
+2014-02-02 Sunday 15:59  Michael Bernstein
+
+        * gem/aes/structures/applrecord.ui:
+
+        Change field descriptions to values evaluated by tests from Roger Burrows
+
+2013-09-17 Tuesday 13:41  Gerhard Stoll
+
+        * gemdos/gemdos_f.u:
+
+        Function from BiNet100 and Atari Network Service
+
+2013-06-30 Sunday 08:32  Gerhard Stoll
+
+        * bios/bios_f.u:
+
+        Add function from the Drive B Simulator
+
+2013-03-24 Sunday 09:32  Gerhard Stoll
+
+        * xbios/xbios_f.u:
+
+        XBIOS function from Hatari and the Hatari version from DHS
+
+
+
+

1.3.2 Version 5.00

+
2013-03-04 Monday 17:49  Gerhard Stoll
+
+        * anhang/anhang/ascii.ui:
+
+        Lowercase letter "c" was shown instead of "e"
+        (Hex code 65). (David Gálvez)
+
+2013-01-20 Sunday 08:29  Gerhard Stoll
+
+        * gem/vdi/inquire/vq_color.ui:
+
+        Declaration wrong, there is a return value
+        (init16_t and not void).
+
+2012-11-26 Monday 17:34  Gerhard Stoll
+
+        * gem/vdi/control/v_opnprn.ui:
+
+        Wrong Opcode in binding.
+
+2012-09-21 Friday 18:22  Gerhard Stoll
+
+        * gemdos/memory/malloc.ui:
+
+        Info about the limits from that function.
+
+2012-09-19 Wednesday 17:03  Gerhard Stoll
+
+        * gemdos/datetime/tsetitim.ui:
+
+        Correct C prototyp
+
+2012-03-10 Saturday 15:59  Gerhard Stoll
+
+        * gem/aes/appl_/appl_getinfo.ui:
+
+        more detailed AES_ARCH-defines
+
+2012-03-01 Thursday 18:45  Gerhard Stoll
+
+        * anhang/typedefs.u:
+
+        Correct OSHEADER for EmuTOS (Helmut Karlowski)
+
+2012-01-20 Friday 10:25  Gerhard Stoll
+
+        * gem/aes/appl_/appl_find.ui:
+
+        Add MyAES for Mode -3.
+
+2011-07-30 Saturday 17:16  Gerhard Stoll
+
+        * bios/cookie/: list.ui, description/AmAN.ui, description/cVDI.ui,
+        description/ALIC.ui:
+
+        Delete german paragraph in english doc. Contributed by Paul Wratt.
+
+2011-05-29 Sunday 08:23  Gerhard Stoll
+
+        * bios/sys_var_en.u, bios/sys_vec_en.ui, magic/magic_en.u:
+
+        Small changes from Peter A. West
+
+2011-01-16 Sunday 15:00  Gerhard Stoll
+
+        * gem/aes/wind_/: wind_get_set.ui, wind_set.ui,
+        wind_set/WF_TOPMOST.ui:
+
+        Add WF_TOPMOST
+
+2011-01-01 Saturday 17:53  Gerhard Stoll
+
+        * bios/cookie/cookie.u:
+
+        _PCI and XPCI are displayed in the ST-Guideversion
+
+
+

1.3.3 Version 4.99

+
2010-11-01 Monday 07:52  Gerhard Stoll
+
+  * bios/cookie/description/PCI_.ui,
+    bios/cookie/description/XPCI.ui,
+    xbios/pci_bios/pci_bios.u:
+
+  Add links
+
+2010-10-20 Wednesday 18:51  Gerhard Stoll
+
+  * bios/cookie/: cookie.u, list.ui, description/8_8.ui,
+  description/BIGS.ui, description/BSTE.ui:
+
+  Add some more cookies
+
+2010-10-11 Monday 16:49  Gerhard Stoll
+
+  * bios/cookie/: cookie.u, list.ui, description/CT40.ui,
+  description/FALT.ui, description/Lity.ui, description/MFMV.ui,
+  description/MgPC.ui, description/ceci.ui, description/iTMA.ui,
+  description/nAES.ui:
+
+  Add some more cookies
+
+2010-10-07 Thursday 09:15  Gerhard Stoll
+
+  * bios/cookie/list.ui:
+
+  Some changes (Olivier Landemarre)
+
+2010-09-30 Thursday 07:29  Gerhard Stoll
+
+  * anhang/anhang/xhdi/: xhdi_de.ui, xhdi_en.ui:
+
+  Correct short description from XHMediumChanged (by David Gálvez)
+
+2010-08-08 Sunday 16:37  Gerhard Stoll
+
+  * xbios/spezial/puntaes.ui:
+
+  Some more infos from MagiC.
+
+2010-07-31 Saturday 20:14  Gerhard Stoll
+
+  * xbios/spezial/puntaes.ui:
+
+  Some more info from MagiC
+
+2010-07-24 Saturday 11:52  Gerhard Stoll
+
+  * gem/aes/: aes_f.u, structures/WINFRAME_HANDLER.ui,
+  structures/WINFRAME_SETTINGS.ui, structures/WININFO.ui,
+  structures/structures.u, wind_/sys_set_winframe_manager.ui,
+  wind_/wind_.u:
+
+  Add sys_set_winframe_manager from MagiC 6
+
+2010-07-24 Saturday 11:50  Gerhard Stoll
+
+  * gem/aes/rsrc_/sys_recalc_cicon_colours.ui:
+
+  Correct binding
+
+2010-07-21 Wednesday 19:53  Gerhard Stoll
+
+  * bios/cookie/: cookie.u, list.ui, description/Xgem.ui:
+
+  Add cookie Xgem from Winframe Xgem.
+
+2010-07-21 Wednesday 18:52  Gerhard Stoll
+
+  * gem/aes/aes_f.u:
+
+  Wrong opcode in edit_set.
+
+2010-07-04 Sunday 16:21  Gerhard Stoll
+
+  * bios/cookie/description/_MCH.ui:
+
+  Delete the values from M5484LITE and Coldari, which was in some EmuTOS
+  version, which was never released.
+
+2010-06-26 Saturday 17:56  Gerhard Stoll
+
+  * anhang/typedefs.u:
+
+  OSHEADER: More info about p_run and p_root
+
+2010-06-17 Thursday 18:51  Gerhard Stoll
+
+  * gem/aes/scrp_/scrp_clear.ui:
+
+  Translate from english to german
+
+2010-06-17 Thursday 18:50  Gerhard Stoll
+
+  * gem/aes/appl_/: _appl_yield.ui, appl_.u, appl_yield.ui:
+
+  Add _appl_yield
+
+2010-04-25 Sunday 07:04  Gerhard Stoll
+
+  * protokol/vscreen.u:
+
+  Add id from NOVA VDI
+
+2010-04-18 Sunday 17:07  Gerhard Stoll
+
+  * protokol/AV/: av_de.ui, av_en.ui:
+
+  VA_COPY_COMPLETE is the anser from AV_COPY_DRAGGED
+
+2010-04-17 Saturday 09:31  Gerhard Stoll
+
+  * gem/vdi/inquire/v_delete_driver_info.ui:
+
+  Correct binding
+
+2010-04-14 Wednesday 18:00  Gerhard Stoll
+
+  * gemdos/network/Nversion.ui:
+
+  Correct binding
+
+2010-02-04 Thursday 21:25  Gerhard Stoll
+
+  * gemdos/gemdos.u:
+
+  Add some info to the programflags
+
+2010-02-04 Thursday 21:24  Gerhard Stoll
+
+  * magic/sharelib.u:
+
+  Example how to make a shared library
+
+2010-01-24 Sunday 17:05  Gerhard Stoll
+
+  * gem/vdi/: vdi_f.u, inquire/inquire.u, inquire/vq_devinfo.ui,
+  inquire/vq_ext_devinfo.ui, inquire/vqt_devinfo.ui:
+
+  Add vqt_devinfo
+
+2010-01-13 Wednesday 20:49  Gerhard Stoll
+
+  * gem/vdi/control/: v_opnvwk.ui, v_opnwk.ui:
+
+  2+Getrez()
+
+2009-12-19 Saturday 20:22  Gerhard Stoll
+
+  * xbios/: bildscrm/Setscreen_ct60.ui, ct60/cache.ui,
+  ct60/ct60_vmalloc.ui, ct60/rd_param.ui:
+
+  Update to new ct60 document
+
+2009-12-13 Sunday 10:57  Gerhard Stoll
+
+  * bios/cookie/description/_MCH.ui:
+
+  Add values from M5484LITE and Coldari
+
+2009-10-10 Saturday 16:21  Gerhard Stoll
+
+  * bios/cookie/: list.ui, description/CT60.ui, description/_CF_.ui:
+
+  Add _CF_ cookie
+
+2009-06-12 Friday 13:33  Gerhard Stoll
+
+  * gemdos/gemdos_f.u:
+
+  Add function Fchdir, Ffdopendir and Fdirfd from FreeMiNT 1.17
+
+2009-01-06 Tuesday 17:05  Gerhard Stoll
+
+  * gem/aes/appl_/appl_getinfo.ui:
+
+  Bit 15 in WINOWS
+
+
+

1.3.4 Version 4.98

+
+2008-11-19 Wednesday 17:49  Gerhard Stoll
+
+  * config.u, e_aes.u, e_bios.u, e_cpxdok.u, e_funk_l.u, e_gemdos.u,
+  e_linea.u, e_magic.u, e_olga.u, e_protok.u, e_tos.u, e_tos_li.u,
+  e_vdi.u, e_view.u, e_vt52.u, e_xbios.u, e_xbra.u, e_xhdi.u,
+  tos_hyp.u, gem/aes/evnt_/messages/messages.u, gemdos/filesys.u,
+  gemdos/*, xbios/*:
+
+  Change line end
+
+2008-11-18 Tuesday 20:19  Gerhard Stoll
+
+  * doc/liesmich, doc/styl.u, emulator.en/sonstige.u,
+  emulator.en/stem.u, emulator.en/tos2win.u, gem/*,
+  linea/*, magic/*, n_aes/n_aes.u, protokol/*,
+  tos/tos_de.ui, tos/tos_en.ui, tos/tosmain.u,
+  xaaes/xaaes.u:
+
+  Change lineend
+
+2008-11-16 Sunday 14:25  Gerhard Stoll
+
+  * gem/aes/: appl_/*, edit_/*, evnt_/*:
+
+  Change line end
+
+2008-11-16 Sunday 14:24  Gerhard Stoll
+
+  * xbios/xbios_f.u:
+
+  Add function form ct60
+
+2008-11-09 Sunday 14:30  Gerhard Stoll
+
+  * anhang/*, bios/*:
+
+  Change line end to unix
+
+2008-11-09 Sunday 08:51  Gerhard Stoll
+
+  * gem/vdi/output/v_arc.ui:
+
+  Test upload
+
+2008-11-06 Thursday 20:38  Michael Bernstein
+
+  * gemdos/system/ssystem.ui:
+
+  Syntaxfehler in begin_table end_tabel in deutschen Teil behoben.
+
+  Bugfix of syntax error with begin_table end_table in german part.
+
+2008-11-05 Wednesday 21:04  Michael Bernstein
+
+  * gemdos/: argv.u, gemdos_f.u, chrinout/cauxin.ui,
+  chrinout/cauxos.ui, chrinout/cauxout.ui, chrinout/cconis.ui,
+  chrinout/cconout.ui, chrinout/cconrs.ui, chrinout/cconws.ui,
+  chrinout/cprnos.ui, chrinout/crawcin.ui, chrinout/crawio.ui,
+  datetime/tgettime.ui, datetime/tsettime.ui, dir/dclosedi.ui,
+  dir/dcntl.ui, dir/dcreate.ui, dir/ddelete.ui, dir/dfree.ui,
+  dir/dgetcwd.ui, dir/dgetdrv.ui, dir/dgetpath.ui, dir/dreadlab.ui,
+  dir/dsetdrv.ui, dir/dsetpath.ui, dir/dwritela.ui, dir/dxopendir.ui,
+  dir/dxreaddi.ui, file/fattrib.ui, file/fclose.ui, file/fdatime.ui,
+  file/fdelete.ui, file/fgetdta.ui, file/fread.ui, file/fsnext.ui,
+  file/fwrite.ui, memory/mfree.ui, memory/mshrink.ui,
+  memory/mxalloc.ui, network/Nversion.ui, prozess/pseteuid.ui,
+  prozess/psigintr.ui, prozess/pterm.ui, prozess/pterm0.ui,
+  structures/DISKINFO.ui, structures/DTA.ui, structures/FILEPTR.ui,
+  structures/LINE.ui, structures/PD.ui, structures/XATTR.ui,
+  structures/cd_ad.ui, structures/cdrom_tocentry.ui,
+  structures/fcookie.ui, structures/mutimbuf.ui,
+  structures/ploadinfo.ui, structures/tty.ui, structures/winsize.ui,
+  structures/xkey.ui, system/slbclose.ui, system/slbopen.ui,
+  system/super.ui:
+
+  Doppelte Zeilenumbrüch entfernt, die aus jeder Zeile einen Absatz
+  gemacht hatten.
+
+  Remove double newlines which case UDO to take every line as a
+  separate paragraph
+
+2008-11-02 Sunday 21:48  Michael Bernstein
+
+  * gemdos/: chrinout/chrinout.u, system/system.u:
+
+  Fehler in Verschachtelung iflang-endif mit begin_node end_node
+
+  Bugfix in iflang-endif with begin_node end_node
+
+2008-11-01 Saturday 18:29  Michael Bernstein
+
+  * gemdos/system/ssystem.ui:
+
+  Syntaxfehler in Item eienr XLIST im deutschen Teil behoben.
+
+  Bugfix in item part of xlist from german part.
+
+2008-10-31 Friday 08:31  Gerhard Stoll
+
+  * gem/vdi/attribut/bitmap/vsr_bg_color.ui,
+  gem/vdi/attribut/text/vst_error.ui, gemdos/gemdos.u,
+  gemdos/signale.u, gemdos/dir/dclosedi.ui, gemdos/dir/dcntl.ui,
+  gemdos/dir/dcreate.ui, gemdos/dir/ddelete.ui, gemdos/dir/dfree.ui,
+  gemdos/dir/dgetcwd.ui, gemdos/dir/dgetdrv.ui,
+  gemdos/dir/dgetpath.ui, gemdos/dir/dlock.ui,
+  gemdos/dir/dopendir.ui, gemdos/dir/dpathcon.ui,
+  gemdos/dir/dreaddir.ui, gemdos/dir/dreadlab.ui,
+  gemdos/dir/drewindd.ui, gemdos/dir/dsetdrv.ui,
+  gemdos/dir/dsetpath.ui, gemdos/dir/dwritela.ui,
+  gemdos/dir/dxopendir.ui, gemdos/dir/dxreaddi.ui,
+  gemdos/file/fchown.ui, gemdos/file/fsnext.ui,
+  xbios/intrface/dosound.ui, xbios/laufwerk/floprd.ui,
+  xbios/spezial/blitmode.ui, xbios/spezial/cachectr.ui,
+  xbios/spezial/cjar.ui, xbios/spezial/dbmsg.ui,
+  xbios/spezial/janus.ui, xbios/spezial/puntaes.ui,
+  xbios/spezial/random.ui, xbios/spezial/ssbrk.ui,
+  xbios/spezial/supexec.ui, xbios/spezial/trapper.ui,
+  xbios/spezial/wdgctrl.ui, xbios/startrac/hardplay.ui:
+
+  Correct links
+
+2008-10-27 Monday 19:52  Gerhard Stoll
+
+  * anhang/hilfe.u:
+
+  Add address
+
+2008-10-27 Monday 19:37  Gerhard Stoll
+
+  * anhang/anhang/tos_vers.u:
+
+  Some more AES versions
+
+2008-10-25 Saturday 20:51  Michael Bernstein
+
+  * gemdos/: chrinout/chrinout.u, datetime/datetime.u,
+  datetime/talarm.ui, datetime/tgettofd.ui, datetime/tsetitim.ui,
+  dir/dclosedi.ui, dir/dcntl.ui, dir/dgetcwd.ui, dir/dir.u,
+  dir/dlock.ui, dir/dopendir.ui, dir/dreaddir.ui, dir/drewindd.ui,
+  file/fchmod.ui, file/fchown.ui, file/file.u, file/flink.ui,
+  file/fmidipip.ui, file/fpipe.ui, file/freadlin.ui,
+  file/fsymlink.ui, memory/memory.u, network/network.u,
+  prozess/pgetegid.ui, prozess/pgeteuid.ui, prozess/pmsg.ui,
+  prozess/prenice.ui, prozess/prozess.u, prozess/psemapho.ui,
+  prozess/psetauid.ui, prozess/psigacti.ui, prozess/psigpaus.ui,
+  prozess/pumask.ui, prozess/pwaitpid.ui, structures/timeval.ui,
+  structures/timezone.ui, system/salert.ui, system/ssync.ui,
+  system/system.u:
+
+  kleine englische Teile im deutschen Zweig aud deutsch übersetzt.
+
+  Translate small english parts in german part to german.
+
+2008-10-19 Sunday 18:50  Michael Bernstein
+
+  * gemdos/: filesys.u, gemdos.u, signale.u, chrinout/cnecin.ui,
+  datetime/talarm.ui, dir/dcntl.ui, dir/dir.u, dir/dopendir.ui,
+  file/fchmod.ui, file/fcntl.ui, file/fdup.ui, file/fforce.ui,
+  file/file.u, file/flock.ui, file/fsfirst.ui, memory/memory.u,
+  network/network.u, prozess/pause.ui, prozess/prozess.u,
+  prozess/prusage.ui, prozess/psigpaus.ui, structures/cdrom.ui,
+  structures/sigaction.ui, system/salert.ui, system/ssystem.ui,
+  system/system.u:
+
+  Ändern einiger Formatierungen nach Vorlagen von Peter West,
+  soweit mit UDO möglich. Korrektur von verschachtelten
+  if-else mit begin_node end_node.
+
+  Modify some formats found by Peter West if they can be done with
+  UDO. Bugfix in some nested if-else with begin_node end_node
+
+2008-10-17 Friday 21:02  Michael Bernstein
+
+  * gemdos/: dir/dpathcon.ui, file/fcntl.ui, file/fgetchar.ui,
+  file/finstat.ui, file/foutstat.ui, file/fputchar.ui,
+  file/fselect.ui, prozess/pause.ui, prozess/pdomain.ui,
+  prozess/pfork.ui, prozess/pgetgid.ui, prozess/pgetpgrp.ui,
+  prozess/pgetppid.ui, prozess/pgetuid.ui, prozess/pkill.ui,
+  prozess/pnice.ui, prozess/prusage.ui, prozess/psetgid.ui,
+  prozess/psetlimi.ui, prozess/psetpgrp.ui, prozess/psetuid.ui,
+  prozess/psigbloc.ui, prozess/psignal.ui, prozess/psigpend.ui,
+  prozess/psigretu.ui, prozess/psigsetm.ui, prozess/pusrval.ui,
+  prozess/pvfork.ui, prozess/pwait.ui, prozess/pwait3.ui,
+  system/shutdown.ui, system/sysconf.ui:
+
+  Beschreibung der Verfügbarkeit für ab MultiTOS vorhandene
+  Funktionen um MiNT Versionsnummer 1.04 erweitert
+
+  Expand description of availability for functions which are
+  available as of MultiTOS by MiNT version number 1.04
+
+2008-10-12 Sunday 16:52  Gerhard Stoll
+
+  * bios/cookie/description/: _FDC.ui, hade.ui:
+
+  Add some infos from the Hades
+
+2008-10-05 Sunday 07:48  Gerhard Stoll
+
+  * protokol/vscreen.u:
+
+  Add a table with program and identifier
+
+2008-10-05 Sunday 07:47  Gerhard Stoll
+
+  * gemdos/gemdos_f.u:
+
+  Add function from SysMon
+
+2008-10-03 Friday 15:19  Gerhard Stoll
+
+  * gem/aes/appl_/appl_exit.ui, gem/vdi/*,
+  gemdos/datetime/tgettime.ui, gemdos/datetime/tsettime.ui,
+  gemdos/dir/dcreate.ui, gemdos/dir/ddelete.ui, gemdos/dir/dfree.ui,
+  gemdos/dir/dgetdrv.ui, gemdos/dir/dsetpath.ui,
+  gemdos/file/fattrib.ui, gemdos/file/fchown.ui,
+  gemdos/file/fclose.ui, gemdos/file/fdatime.ui,
+  gemdos/file/fdelete.ui, gemdos/file/fforce.ui,
+  gemdos/file/fgetdta.ui, gemdos/file/fwrite.ui,
+  gemdos/memory/mfree.ui, gemdos/memory/mshrink.ui,
+  gemdos/prozess/pseteuid.ui, gemdos/prozess/pterm.ui,
+  gemdos/prozess/pterm0.ui, gemdos/system/slbclose.ui, magic/magic.u,
+  xbios/bildscrm/cursconf.ui, xbios/bildscrm/getrez.ui,
+  xbios/interrpt/jenabint.ui, xbios/intrface/dosound.ui,
+  xbios/intrface/giaccess.ui, xbios/intrface/ikbdws.ui,
+  xbios/intrface/iorec.ui, xbios/intrface/kbdvbase.ui,
+  xbios/intrface/mfpint.ui, xbios/intrface/midiws.ui,
+  xbios/intrface/offgibit.ui, xbios/intrface/ongibit.ui,
+  xbios/intrface/rsconf.ui, xbios/laufwerk/flopfmt.ui,
+  xbios/laufwerk/floprd.ui, xbios/laufwerk/flopver.ui,
+  xbios/laufwerk/flopwr.ui, xbios/laufwerk/protobt.ui,
+  xbios/spezial/blitmode.ui, xbios/spezial/cachectr.ui,
+  xbios/spezial/cjar.ui, xbios/spezial/dbmsg.ui,
+  xbios/spezial/janus.ui, xbios/spezial/puntaes.ui,
+  xbios/spezial/random.ui, xbios/spezial/ssbrk.ui,
+  xbios/spezial/supexec.ui, xbios/spezial/trapper.ui,
+  xbios/spezial/wdgctrl.ui:
+
+  Add some nolink
+
+2008-09-23 Tuesday 21:02  Michael Bernstein
+
+  * gemdos/gemdos.u:
+
+  Shorten paragraph about mint compatible function in introduction
+  because the same text occures in the chapter about filesystems.
+
+  Kürzen des Absatz über Mint kompatible Funktionen in der Einleitung,
+  da der Text ganauso im Kapitel üner Dateisystem erscheint.
+
+2008-09-21 Sunday 20:58  Michael Bernstein
+
+  * gemdos/prozess/pusrval.ui:
+
+  remove short part which cause problem for translation and gives
+  not additional information
+
+  kurze Passage entfernt, die keine Zusatzinformation liefert, aber
+  Probleme mit der Übersetzung machte
+
+2008-09-21 Sunday 20:53  Michael Bernstein
+
+  * gemdos/prozess/prozess.u:
+
+  modify short description of Psigaction
+
+  Kurzbeschreibung von Psigaction geändert
+
+2008-09-21 Sunday 20:50  Michael Bernstein
+
+  * gemdos/prozess/pexec.ui:
+
+  modify names of some modes to names given by atari compendium
+
+  Namen einiger Modi auf die Namen geändert, die das Atari
+  Compendium benutzt
+
+2008-09-18 Thursday 18:26  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/description/cab.ui:
+
+  Translation by Peter A. West
+
+2008-09-17 Wednesday 17:53  Gerhard Stoll
+
+  * xbios/: xbios.u, bildscrm/*, centscrn/*,
+  crazydot/*, ct60/*, datetime/datetime.ui, datetime/gettime.ui,
+  datetime/nvmacces.ui, datetime/settime.ui, datetime/xbtimer.ui,
+  drucker/*, dsp56001/*, interrpt/*, intrface/*,
+  laufwerk/*, overscan/*, pci_bios/*, sound/*,
+  startrac/*, tastatur/*:
+
+  Change the psition of Group and Availability
+
+2008-09-09 Tuesday 15:02  Gerhard Stoll
+
+  * gemdos/network/Nversion.ui, gemdos/network/network.u,
+  gem/vdi/escape/camera/vqp_error.ui,
+  gem/vdi/escape/camera/vqp_films.ui,
+  gem/vdi/escape/camera/vqp_state.ui,
+  gem/vdi/escape/camera/vsp_save.ui,
+  gem/vdi/escape/camera/vsp_state.ui:
+
+  Translation by Peter A. West
+
+2008-09-09 Tuesday 15:01  Gerhard Stoll
+
+  * bios/bios_en.ui, bios/bios_trap.ui, bios/sys_var_en.u,
+  bios/sys_vec_en.ui, bios/vt52.u, bios/xbra.u,
+  bios/cookie/cookie_en.ui, bios/cookie/description/_FSR.ui,
+  bios/function/bconin.u, bios/function/bconout.u,
+  bios/function/bconstat.u, bios/function/bcostat.u,
+  bios/function/drvmap.u, bios/function/getbpb.u,
+  bios/function/getmpb.u, bios/function/kbshift.u,
+  bios/function/mediach.u, bios/function/rwabs.u,
+  bios/function/setexc.u, bios/function/tickcal.u,
+  bios/structures/bpb.ui, bios/structures/md.ui,
+  bios/structures/mpb.ui, bios/structures/pun_info.ui, tos/tos_en.ui:
+
+  Correct some text and links
+
+2008-09-09 Tuesday 13:27  Gerhard Stoll
+
+  * tos_hyp.u, anhang/gpl.ui, anhang/hilfe.u:
+
+  Add GPL
+
+2008-09-03 Wednesday 23:39  Gerhard Stoll
+
+  * anhang/typedefs.u, anhang/anhang/anhang.u, anhang/anhang/pmmu.u,
+  anhang/anhang/xhdi/xhdi_en.ui, emulator.en/stem.u, magic/magic.u,
+  magic/magic_en.u, magic/magicerr.u, magic/magicinf.u,
+  magic/sharelib.u, magic/DFS/dfs_en.ui,
+  magic/MagiC_PC/magicpc_en.ui, magic/XFS/xfs_en.ui,
+  magic/threads/threads.u, protokol/dd.u, protokol/dhst.u,
+  protokol/font.u, protokol/gdps.ui, protokol/ltlproto.u,
+  protokol/xfsl.u, protokol/AV/av_en.ui,
+  protokol/BubbleGEM/bubble_en.ui, protokol/olga/olga_en.ui,
+  protokol/xacc/xacc_en.ui:
+
+  Correct links and wrong UDO commandos
+
+2008-09-03 Wednesday 07:45  Gerhard Stoll
+
+  * gem/cpxdoku.u:
+
+  Correct links
+
+2008-09-03 Wednesday 07:44  Gerhard Stoll
+
+  * bios/cookie/cookie_en.ui, gem/*, gemdos/*, linea/*,
+  protokol/ssp/ssp.u, xbios/laufwerk/laufwerk.u:
+
+  Correct links and wrong UDO commandos
+
+2008-09-01 Monday 12:28  Gerhard Stoll
+
+  * magic/magic_en.u, magic/DFS/dfs_en.ui,
+  magic/MagiC_Mac/magicmac_en.ui, magic/shutdown/shutdown_en.ui,
+  tos/tos_en.ui, tos_hyp.u, xbios/intrface/giaccess.ui,
+  xbios/intrface/ikbdws.ui, xbios/intrface/iorec.ui,
+  xbios/laufwerk/flopfmt.ui, xbios/overscan/oscanscr.ui,
+  xbios/overscan/oscanvb.ui, xbios/pci_bios/pci_bios.u,
+  xbios/pci_bios/read_config_byte.ui,
+  xbios/pci_bios/read_config_longword.ui,
+  xbios/pci_bios/read_config_word.ui,
+  xbios/pci_bios/set_interrupt.ui, xbios/pci_bios/special_cycle.ui,
+  xbios/pci_bios/unhook_interrupt.ui, xbios/sound/sound.u,
+  xbios/sound/soundcmd.ui, xbios/startrac/wr_dconv.ui,
+  xbios/startrac/wr_dpat1.ui, xbios/startrac/wr_dpat2.ui,
+  xbios/startrac/wr_dpdat.ui, xbios/startrac/wr_dport.ui,
+  xbios/startrac/wr_raes.ui, xbios/startrac/wr_rdsp.ui,
+  xbios/startrac/wr_rhi.ui, xbios/startrac/wr_rlow.ui,
+  xbios/structures/DSPBLOCK.ui, xbios/structures/OVERPATCH.ui,
+  xbios/structures/PBDEF.ui, xbios/tastatur/keytbl.ui,
+  gem/guidelns/style_en.u, gem/vdi/vdi_en.u, gemdos/gemdos.u,
+  gemdos/file/fforce.ui, gem/aes/shel_/shel_write.ui,
+  gem/aes/fnts_/fnts_.u, gem/aes/fnts_/fnts_add.ui,
+  gem/aes/fnts_/fnts_close.ui, gem/aes/fnts_/fnts_create.ui,
+  gem/aes/fnts_/fnts_delete.ui, gem/aes/fnts_/fnts_do.ui,
+  gem/aes/fnts_/fnts_evnt.ui, gem/aes/fnts_/fnts_get_info.ui,
+  gem/aes/fnts_/fnts_get_name.ui,
+  gem/aes/fnts_/fnts_get_no_styles.ui,
+  gem/aes/fnts_/fnts_get_style.ui, gem/aes/fnts_/fnts_open.ui,
+  gem/aes/fnts_/fnts_remove.ui, gem/aes/fnts_/fnts_update.ui,
+  anhang/typedefs.u, anhang/anhang/anhang.u, anhang/anhang/ascii.ui,
+  anhang/anhang/pmmu.u, anhang/anhang/scan-code.ui,
+  anhang/anhang/tos_vers.u, anhang/anhang/xhdi/xhdi_en.ui,
+  bilder/farbe/olga_1.img, bilder/farbe/olga_2.img,
+  bilder/farbe/olga_3.img, bilder/farbe/olga_4.img,
+  bilder/gif/olga_1.gif, bilder/gif/olga_2.gif,
+  bilder/gif/olga_3.gif, bilder/gif/olga_4.gif,
+  bilder/mono/olga_1.img, bilder/mono/olga_2.img,
+  bilder/mono/olga_3.img, bilder/mono/olga_4.img, bios/bios_en.ui,
+  bios/sys_var_en.u, bios/xbra.u, bios/cookie/cookie_en.ui,
+  bios/function/bconin.u, bios/function/getmpb.u:
+
+  Change links
+
+2008-09-01 Monday 12:27  Gerhard Stoll
+
+  * protokol/: xfsl.u, xssi.u, olga/olga_de.ui, olga/olga_en.ui,
+  ssp/ssp.u:
+
+  Translation by Peter A. West
+
+2008-08-26 Tuesday 13:59  Gerhard Stoll
+
+  * protokol/: dd.u, dhst.u, font.u, gdps.ui, ltlproto.u, view.u,
+  vscreen.u, AV/av_en.ui, BubbleGEM/bubble_de.ui,
+  BubbleGEM/bubble_en.ui, olga/olga_de.ui, olga/olga_en.ui,
+  seproto/seproto_de.ui, seproto/seproto_en.ui, ssp/ssp.u,
+  xacc/xacc_de.ui, xacc/xacc_en.ui:
+
+  Translation by Peter A. West
+
+2008-08-03 Sunday 09:47  Gerhard Stoll
+
+  * config.u, bios/bios_trap.ui, bios/sys_vec_en.ui,
+  gem/aes/appl_/appl_search.ui, gem/aes/fslx_/fslx_.u,
+  gem/aes/menu_/menu_settings.ui, gem/aes/objc_/objc_sysvar.ui,
+  gem/guidelns/style_en.u, gemdos/dir/dreadlab.ui,
+  gemdos/prozess/prozess.u, magic/DFS/dfs_en.ui, magic/XFS/xfs_en.ui,
+  xbios/laufwerk/laufwerk.u:
+
+  Correct links
+
+2008-07-31 Thursday 18:00  Gerhard Stoll
+
+  * bilder/: farbe/img2035_en.img, farbe/img2037_en.img,
+  farbe/img2040_en.img, farbe/img2041_en.img, farbe/img2042_en.img,
+  farbe/img2043_en.img, farbe/img2044_en.img, farbe/img2045_en.img,
+  gif/img2035_en.gif, gif/img2037_en.gif, gif/img2040_en.gif,
+  gif/img2041_en.gif, gif/img2042_en.gif, gif/img2043_en.gif,
+  gif/img2044_en.gif, gif/img2045_en.gif, mono/img2035_en.img,
+  mono/img2037_en.img, mono/img2040_en.img, mono/img2041_en.img,
+  mono/img2042_en.img, mono/img2043_en.img, mono/img2044_en.img,
+  mono/img2045_en.img:
+
+  Translation by Peter A. West
+
+2008-07-31 Thursday 17:54  Gerhard Stoll
+
+  * xbios/pci_bios/: get_routing.ui, set_interrupt.ui,
+  special_cycle.ui:
+
+  Wrong UDO syntax
+
+2008-07-31 Thursday 17:49  Gerhard Stoll
+
+  * gem/aes/: appl_/appl_control.ui, wind_/wind_set.ui:
+
+  Wrong UDO commando
+
+2008-07-31 Thursday 17:49  Gerhard Stoll
+
+  * emulator.en/sonstige.u, emulator.en/stem.u,
+  emulator.en/tos2win.u, gem/guidelns/style_en.u, magic/XFS/xfs.u,
+  n_aes/n_aes.u,
+  * magic/:
+  * xaaes/xaaes.u, tos_hyp.u, e_magic.u:
+
+  Translation by Peter A. West
+
+2008-07-27 Sunday 15:28  Michael Bernstein
+
+  * gemdos/: gemdos.u, datetime/talarm.ui, datetime/tgetdate.ui,
+  dir/dopendir.ui, file/fcntl.ui, file/fgetdta.ui, file/finstat.ui,
+  file/flink.ui, file/foutstat.ui, file/fputchar.ui, file/fread.ui,
+  prozess/pexec.ui, prozess/psetpgrp.ui, prozess/psigbloc.ui,
+  prozess/psigpaus.ui, prozess/pwait.ui, structures/DTA.ui,
+  system/sversion.ui, system/sysconf.ui:
+
+  Bugfixes aufgrund von Anmerkungen, die Peter West beim Vergleich
+  mit dem Atari Compendium bei der Übersetzung gemacht hatte.
+
+  Bugfixes made because of annotations made by Peter West as a result
+  of comparing with Atari Compendium while translating from german to
+  english.
+
+2008-07-19 Saturday 18:39  Gerhard Stoll
+
+  * magic/:
+  * gem/cpxdoku.u, gem/guidelns/style.u, gem/guidelns/style_en.u:
+
+  Translation by Peter A. West
+
+2008-06-29 Sunday 13:46  Gerhard Stoll
+
+  * anhang/hilfe.u, anhang/typedefs.u, anhang/anhang/anhang.u,
+  anhang/changes/04_90.ui, anhang/changes/04_93.ui,
+  anhang/changes/04_95.ui, anhang/changes/old.ui, bios/sys_vec_de.ui,
+  bios/sys_vec_en.ui, bios/vt52.u, bios/cookie/list.ui,
+  bios/cookie/description/DYJD.ui, bios/cookie/description/DYwl.ui,
+  bios/cookie/description/MagX.ui, bios/cookie/description/MgMc.ui,
+  bios/cookie/description/MgMx.ui, bios/cookie/description/MgSn.ui,
+  bios/cookie/description/StIc.ui, bios/cookie/description/SwTm.ui,
+  bios/cookie/description/WICO.ui, bios/cookie/description/_FDC.ui,
+  bios/cookie/description/_FLK.ui, gem/aes/aes_f.u,
+  gem/aes/evnt_/messages/evnts_de.ui,
+  gem/aes/evnt_/messages/messages.u, gem/aes/fnts_/fnts_.u,
+  gem/aes/fsel_/fsel_.u, gem/aes/fsel_/fsel_boxinput.ui,
+  gem/aes/fslx_/fslx_.u, gem/aes/fslx_/use.ui, gem/aes/lbox_/lbox_.u,
+  gem/aes/menu_/menu_.u, gem/aes/objc_/objc_.u,
+  gem/aes/objc_/objc_sysvar.ui, gem/aes/shel_/shel_.u,
+  gem/aes/shel_/shel_get.ui, gem/aes/shel_/shel_put.ui,
+  gem/aes/shel_/shel_write.ui, gem/aes/structures/hndl_obj.ui,
+  gem/aes/structures/prn_settings.ui, gem/aes/wdlg_/wdlg_.u,
+  gem/aes/wdlg_/wdlg_get_edit.ui, gem/aes/wind_/wind_create.ui,
+  gem/aes/wind_/wind_get.ui, gem/aes/wind_/wind_open.ui,
+  gem/aes/wind_/wind_set.ui, gem/guidelns/style.u,
+  gem/guidelns/style_en.u, gem/vdi/vdi.u, gem/vdi/vdi_en.u,
+  gemdos/dir/dfree.ui, gemdos/dir/dgetdrv.ui, gemdos/dir/dsetdrv.ui,
+  gemdos/file/fcreate.ui, gemdos/file/fdelete.ui,
+  gemdos/file/fdup.ui, gemdos/file/fforce.ui, gemdos/file/frename.ui,
+  gemdos/file/fselect.ui, gemdos/file/fsfirst.ui,
+  gemdos/system/sconfig.ui, gemdos/system/slbclose.ui,
+  gemdos/system/slbopen.ui, magic/magic.u, magic/magicinf.u,
+  magic/magicmac.u, magic/magicpc.u, magic/xfs.u,
+  magic/shutdown/shutdown_de.ui, magic/threads/threads.u,
+  protokol/ltlproto.u, tos/tos_de.ui, tos/tos_en.ui, xbios/xbios.u,
+  xbios/drucker/prtblk.ui, xbios/drucker/scrdmp.ui,
+  xbios/laufwerk/floprate.ui, xbios/pci_bios/pci_bios.u,
+  xbios/spezial/blitmode.ui, xbios/spezial/ssbrk.ui,
+  xbios/structures/META_INFO_2.ui, xbios/structures/bconmap.ui:
+
+  Change MagiCMac and MagiCPC to MagiC Mac and MagiC PC
+
+2008-06-12 Thursday 17:59  Gerhard Stoll
+
+  * gem/aes/:
+  * gem/structures/:
+  * gem/aes/appl_/:
+  * gem/aes/shel_/:
+
+  Translation by Peter A. West
+
+2008-06-08 Sunday 07:07  Gerhard Stoll
+
+  * gem/aes/wind_/wind_get_set.ui:
+
+  Add source from WF_MINXYWH and WF_INFOXYWH
+
+2008-06-08 Sunday 07:07  Gerhard Stoll
+
+  * gem/aes/objc_/:
+  * gem/aes/rsrc_/:
+  * gem/aes/menu_/:
+  * gem/aes/xgrf_/:
+  * gem/aes/lbox_/:
+
+  Translation by Peter A. West
+
+2008-06-03 Tuesday 19:24  Gerhard Stoll
+
+  * gem/aes/appl_/appl_getinfo.ui:
+
+  Wrong number fron WinX
+
+2008-05-31 Saturday 06:14  Gerhard Stoll
+
+  * gem/aes/:
+  * gem/scrp_/:
+  * gem/aes/form_/:
+
+  Translation by Peter A. West
+
+2008-05-27 Tuesday 16:14  Gerhard Stoll
+
+  * bios/cookie/: cookie.u, list.ui, description/AMCG.ui:
+
+  Add the cookie AMCG (AMC-GDOS)
+
+2008-05-27 Tuesday 16:11  Gerhard Stoll
+
+  * xbios/: xbios_f.u, xbios_f.u:
+
+  Wrong opcode by GetActiveFeatures
+
+2008-05-23 Friday 07:39  Gerhard Stoll
+
+  * gem/aes/fslx_/:
+  * gem/aes/wind_/:
+  * gem/aes/wdlg_/:
+  * gem/aes/evnt_/:
+  * gem/aes/edit_/:
+  * gem/aes/pdlg_/:
+  * gem/aes/fsel_/:
+  * gem/aes/: aes_f.u, toolbar.ui
+  * gem/aes/appl_/:
+
+  Translation by Peter A. West
+
+2008-05-13 Tuesday 14:11  Gerhard Stoll
+
+  * xbios/: xbios_f.u, pci_bios/get_routing.ui, pci_bios/pci_bios.u,
+  pci_bios/set_interrupt.ui, pci_bios/special_cycle.ui:
+
+  Add more PCI-XBIOS function
+
+2008-05-01 Thursday 16:55  Gerhard Stoll
+
+  * gem/aes/: aes.u, aes_en.u, toolbar.ui:
+
+  Translation by Peter A. West
+
+2008-05-01 Thursday 16:54  Gerhard Stoll
+
+  * bilder/: gif/fenster_en.gif, farbe/fenster_en.img,
+  mono/fenster_en.img:
+
+  New picture from Peter A. West
+
+2008-03-30 Sunday 09:31  Gerhard Stoll
+
+  * gem/vdi/raster/:
+
+  Translation by Peter A. West
+
+2008-03-29 Saturday 20:21  Gerhard Stoll
+
+  * gem/vdi/attribut/:
+  * gem/vdi/control/:
+  * gem/vdi/inquire/:
+  * gem/vdi/output/:
+  * gem/vdi/colortable/:
+  * gem/vdi/escape/:
+  * bios/bios_en.ui, bios/sys_vec_en.ui, gem/aes/aes_en.u,
+  * gem/aes/appl_/appl_getinfo.ui, gem/vdi/vdi_en.u,
+  gem/vdi/attribut/text/*, gem/vdi/attribut/uebergeordnete/*,
+  gem/vdi/escape/metafile/*, gem/vdi/output/*,
+  gem/vdi/structures/xfnt_info.ui, gemdos/gemdos.u, gemdos/signale.u,
+  gemdos/file/fforce.ui, gemdos/file/fopen.ui, xbios/xbios.u:
+
+  Translation by Peter A. West
+
+2008-03-22 Saturday 09:06  Gerhard Stoll
+
+  * gem/vdi/input/: input.u, v_hide_c.ui, v_show_c.ui, vex_butv.ui,
+  vex_curv.ui, vex_motv.ui, vex_timv.ui, vex_wheelv.ui, vq_key_s.ui,
+  vq_mouse.ui, vrq_choice.ui, vrq_locator.ui, vrq_string.ui,
+  vrq_valuator.ui, vsc_form.ui, vsin_mode.ui, vsm_choice.ui,
+  vsm_locator.ui, vsm_string.ui, vsm_valuator.ui:
+
+  Translation by Peter A. West
+
+2008-03-21 Friday 14:41  Gerhard Stoll
+
+  * gem/vdi/inquire/: disable_nvdi.ui, fontheader.ui, inquire.u,
+  v_create_driver_info.ui, v_delete_driver_info.ui,
+  v_get_driver_info.ui, v_getbitmap_info.ui,
+  v_read_default_settings.ui, v_write_default_settings.ui,
+  vq_cellarray.ui, vq_color.ui, vq_devinfo.ui, vq_ext_devinfo.ui,
+  vq_extnd.ui, vq_scrninfo.ui, vqf_attributes.ui, vqf_bg_color.ui,
+  vqf_fg_color.ui, vqin_mode.ui, vql_attributes.ui, vql_bg_color.ui,
+  vql_fg_color.ui, vqm_attributes.ui, vqm_bg_color.ui,
+  vqm_fg_color.ui, vqr_bg_color.ui, vqr_fg_color.ui, vqt_advance.ui,
+  vqt_advance32.ui, vqt_attributes.ui, vqt_bg_color.ui,
+  vqt_cachesize.ui, vqt_char_index.ui, vqt_ext_name.ui,
+  vqt_extent.ui, vqt_f_extent.ui, vqt_fg_color.ui, vqt_fontheader.ui,
+  vqt_fontinfo.ui, vqt_get_table.ui, vqt_justified.ui, vqt_name.ui,
+  vqt_name_and_id.ui, vqt_pairkern.ui, vqt_real_extent.ui,
+  vqt_trackkern.ui, vqt_width.ui, vqt_xfntinfo.ui:
+
+  Translation by Peter A. West
+
+2008-03-17 Monday 13:25  Gerhard Stoll
+
+  * gemdos/gemdos_f.u:
+
+  Wrong opcode from Maccess
+
+2008-03-16 Sunday 16:34  Gerhard Stoll
+
+  * gem/vdi/output/: output.u, v_arc.ui, v_bar.ui, v_bez.ui,
+  v_bez_fill.ui, v_cellarray.ui, v_circle.ui, v_contourfill.ui,
+  v_ellarc.ui, v_ellipse.ui, v_ellpie.ui, v_etext.ui, v_fillarea.ui,
+  v_ftext.ui, v_ftext_offset.ui, v_gtext.ui, v_justified.ui,
+  v_pieslice.ui, v_pline.ui, v_pmarker.ui, v_rbox.ui, v_rfbox.ui,
+  vr_recfl.ui:
+
+  Translation by Peter A. West
+
+2008-03-12 Wednesday 18:33  Gerhard Stoll
+
+  * gemdos/: prozess/pwait3.ui, system/ssystem.ui:
+
+  Wrong UDO syntax
+
+2008-03-12 Wednesday 18:32  Gerhard Stoll
+
+  * bios/bios.u, bios/bios_en.ui, xbios/xbios.u, gemdos/gemdos.u,
+  magic/magicerr.u:
+
+  Translation by Peter A. West
+
+2008-03-07 Friday 17:56  Gerhard Stoll
+
+  * bios/cookie/: list.ui, description/*:
+  * gem/vdi/: vdi_f.u, attribut/*, structures/*:
+  * bios/cookie/description/_VDI.ui, xbios/bildscrm/getrez.ui,
+  xbios/bildscrm/setpalet.ui, xbios/bildscrm/vsetmask.ui,
+  gem/vdi/assign_sys.ui, gem/vdi/metafile.u, gem/vdi/vdi.u,
+  gem/vdi/vdi_en.u, gem/vdi/attribut/attribut.u,
+  gem/vdi/attribut/bitmap/bitmap.u, gem/vdi/attribut/fill/fill.u,
+  gem/vdi/attribut/linien/lines.u, gem/vdi/attribut/marker/marker.u,
+  gem/vdi/attribut/text/text.u,
+  gem/vdi/attribut/uebergeordnete/superior.u:
+
+  Translation by Peter A. West
+
+2008-01-27 Sunday 13:34  Gerhard Stoll
+
+  * tos/: tos_de.ui, tos_en.ui:
+  * linea/:
+
+  Translation by Peter A. West
+
+2008-01-13 Sunday 20:41  Michael Bernstein
+
+  * gemdos/: signale.u
+  * gemdos/chrinout/:
+  * gemdos/dir/:
+  * gemdos/file/:
+  * gemdos/prozess/:
+  * gemdos/structures/PD.ui, structures/flock.ui:
+
+  Erweiterungen hinzugefuegt, die Peter West beim Uebersetzen von Deutsch
+  nach Englisch mit Hilfe des AC eingefuegt hatte.
+
+  Add extensions made by Peter West with help of AC while translate from
+  german to english.
+
+2008-01-08 Tuesday 18:32  Gerhard Stoll
+
+  * gemdos/: filesys.u, gemdos.u, gemdos_f.u, signale.u,
+  chrinout/cauxin.ui, chrinout/cconws.ui, file/fforce.ui,
+  prozess/psetauid.ui, prozess/psignal.ui, prozess/pwait3.ui,
+  structures/PD.ui, structures/sigaction.ui, system/ssystem.ui,
+  system/super.ui:
+
+  Translation by Peter A. West
+
+2008-01-01 Tuesday 19:38  Michael Bernstein
+
+  * gemdos/: argv.u, filesys.u, gemdos.u, gemdos_f.u, signale.u,
+  tekbios.u, chrinout/*, datetime/*, dir/*, file/*,
+  memory/*, prozess/*, structures/*, system/*:
+
+  Uebersetzung von Peter West integriert. Seine Kommentare wurden
+  noch nicht beachtet, da sie etwas Recherche erfordern.
+
+  Add translations from Peter West. His comments ignored at this
+  time because they need some research work.
+
+2007-12-30 Sunday 09:33  Gerhard Stoll
+
+  * xbios/*, bios/sys_var_en.u, bios/xbra.u,
+  bios/cookie/description/FSMC.ui,
+  bios/cookie/description/NVDI.ui, bios/cookie/description/_FLK.ui,
+  bios/cookie/description/_NET.ui, bios/structures/mpb.ui,
+  anhang/anhang/ascii.ui:
+
+  Translation by Peter A. West
+
+2007-12-27 Thursday 10:22  Gerhard Stoll
+
+  * xbios/: startrac/installe.ui
+  * xbios/structures/:
+  * xbios/: xbios_f.u
+  * xbios/spezial/:
+  * xbios/tastatur/:
+  * xbios/: sound/*, startrac/*:
+  * xbios/pci_bios/:
+
+  Translation by Peter A. West
+
+2007-12-09 Sunday 10:30  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/messages.u:
+
+  Messages from Porthos add
+
+2007-12-04 Tuesday 20:10  Gerhard Stoll
+
+  * xbios/overscan/: oscanis.ui, oscanpat.ui, oscanphy.ui,
+  oscanscr.ui, oscanswi.ui, oscantab.ui, oscanvb.ui, overscan.u:
+
+  Translation by Peter A. West
+
+2007-12-04 Tuesday 20:10  Gerhard Stoll
+
+  * gemdos/gemdos_f.u:
+
+  Add function from GEMTASK Royal to the list
+
+2007-12-02 Sunday 09:50  Gerhard Stoll
+
+  * xbios/: datetime/settime.ui, dsp56001/iostream.ui,
+  dsp56001/outstrea.ui, interrpt/jdisint.ui, interrpt/jenabint.ui,
+  laufwerk/*:
+  * xbios/centscrn/: vattrib.ui, vclose.ui, vcreate.ui, vdelete.ui,
+  vfirst.ui, vload.ui, vlock.ui, vnext.ui, voffset.ui, vopen.ui,
+  vread.ui, vsave.ui, vscroll.ui, vseek.ui, vsize.ui, vvalid.ui,
+  vwrite.ui:
+  * xbios/: dsp56001/*, interrpt/interrpt.u,
+  interrpt/jdisint.ui, interrpt/jenabint.ui:
+
+  Translation by Peter A. West
+
+2007-10-07 Sunday 08:59  Gerhard Stoll
+
+  * bios/cookie/description/: CT60.ui, FSMC.ui, NVDI.ui, _MCH.ui:
+
+  More infos from some cookies
+
+2007-10-07 Sunday 08:58  Gerhard Stoll
+
+  * xbios/: datetime/datetime.u, datetime/datetime.ui,
+  datetime/gettime.ui, datetime/nvmacces.ui, datetime/settime.ui,
+  datetime/xbtimer.ui, drucker/drucker.u, drucker/prtblk.ui,
+  drucker/scrdmp.ui, drucker/setprt.ui, dsp56001/availabl.ui,
+  dsp56001/blkbytes.ui, dsp56001/blkhndsh.ui, dsp56001/dsp56001.u:
+  * config.u, bios/cookie/example_en.ui, gem/vdi/vdi.u,
+  gem/vdi/vdi_en.u, xbios/bildscrm/*, xbios/centscrn/*,
+  xbios/crazydot/*, xbios/crazydot/resetscr.ui,
+  xbios/ct60/cache.ui, xbios/ct60/ct60.u,
+  xbios/ct60/ct60_vmalloc.ui, xbios/ct60/fl_cache.ui,
+  xbios/ct60/rcortemp.ui, xbios/ct60/rd_param.ui:
+  * config.u, gem/aes/aes_f.u, gem/aes/appl_/appl_getinfo.ui,
+  gemdos/gemdos_f.u, xbios/xbios.u, xbios/bildscrm/bildscrm.u,
+  xbios/bildscrm/cursconf.ui, xbios/bildscrm/egetpale.ui,
+  xbios/bildscrm/egetshif.ui, xbios/bildscrm/esetbank.ui,
+  xbios/startrac/scmsmode.ui:
+
+  Translation by Peter A. West
+
+2007-08-26 Sunday 16:37  Gerhard Stoll
+
+  * xbios/pci_bios/get_machine_id.ui:
+
+  Manufacturer code from ARAnyM
+
+2007-08-26 Sunday 16:36  Gerhard Stoll
+
+  * bios/: bios_en.ui, cookie/cookie.u, cookie/cookie_en.ui,
+  cookie/description/CHBT.ui, cookie/description/CHN1.ui,
+  cookie/description/CHNG.ui, cookie/description/FSER.ui:
+
+  Small text changes
+
+2007-08-13 Monday 19:50  Gerhard Stoll
+
+  * magic/magic.u, anhang/typedefs.u:
+
+  Wrong label
+
+2007-08-13 Monday 19:50  Gerhard Stoll
+
+  * protokol/dhst.u:
+
+  Add define DHST_ADD and DHST_ACK
+
+2007-08-13 Monday 19:49  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/: geneva.ui, messages.u, rsdaemon.ui,
+  description/cab.ui, description/geneva.ui, description/rsdaemon.ui:
+
+  CAB Protocol
+
+2007-08-13 Monday 19:48  Gerhard Stoll
+
+  * bios/cookie/: list.ui, description/GSND.ui:
+
+  GSND is a cookie
+
+2007-08-04 Saturday 05:52  Gerhard Stoll
+
+  * bios/cookie/description/GMTC.ui:
+
+  Infos for programmer
+
+2007-08-04 Saturday 05:52  Gerhard Stoll
+
+  * gemdos/structures/flock.ui:
+
+  Add some lables
+
+2007-08-04 Saturday 05:52  Gerhard Stoll
+
+  * anhang/typedefs.u:
+
+  Wrong syntax in XCPB
+
+2007-07-03 Tuesday 18:01  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/messages.u:
+
+  Message from the GFA-Basic Editor (GBE)
+
+2007-07-03 Tuesday 18:00  Gerhard Stoll
+
+  * gemdos/: gemdos.u, network/Nversion.ui, network/network.u:
+
+  Network function
+
+2007-07-03 Tuesday 17:59  Gerhard Stoll
+
+  * anhang/: neu.u, changes/04_98.ui:
+
+  Start with version 4.98
+
+2007-06-17 Sunday 17:05  Gerhard Stoll
+
+  * anhang/changes/04_97.ui:
+
+  Make Release 4.97
+
+2007-06-17 Sunday 06:52  Gerhard Stoll
+
+  * bios/cookie/: cookie.u, list.ui:
+
+  Delete some links
+
+2007-06-16 Saturday 12:14  Gerhard Stoll
+
+  * bios/bios_en.ui:
+
+  Small chnages
+
+2007-06-16 Saturday 12:13  Gerhard Stoll
+
+  * gem/aes/wind_/wind_get_set_geneva.ui:
+
+  Double defined symbol
+
+2007-06-16 Saturday 08:24  Gerhard Stoll
+
+  * bios/cookie/description/PRNß.ui:
+
+  Delete file with no good filename
+
+2007-06-15 Friday 17:07  Gerhard Stoll
+
+  * bios/cookie/description/PRNSS.ui:
+
+  Change filename
+
+2007-06-15 Friday 16:40  Gerhard Stoll
+
+  * bios/cookie/list.ui:
+
+  Wrong UDO syntax
+
+2007-06-15 Friday 16:40  Gerhard Stoll
+
+  * bios/cookie/description/LMus.ui:
+
+  Wrong headline
+
+
+

1.3.5 Version 4.97

+
+2007-06-15 Friday 16:40  Gerhard Stoll
+
+  * anhang/anhang/tos_vers.u:
+
+  Add TOS 4.06
+
+2007-06-03 Sunday 07:16  Gerhard Stoll
+
+  * bios/cookie/description/MAGN.ui:
+
+  More info about the cookie
+
+2007-06-03 Sunday 07:13  Gerhard Stoll
+
+  * bios/bios_f.u:
+
+  Correct Bios function 0x10
+
+2007-05-28 Monday 08:01  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/messages.u:
+
+  Add messages from MyOSD
+
+2007-05-19 Saturday 08:38  Gerhard Stoll
+
+  * bios/cookie/description/LOGB.ui:
+
+  More info about the cookie
+
+2007-05-05 Saturday 13:20  Gerhard Stoll
+
+  * config.u, bilder/farbe/cl_width_en.img,
+  bilder/farbe/extent_en.img, bilder/farbe/f_select_en.img,
+  bilder/farbe/fenster_en.img, bilder/farbe/fontinfo_en.img,
+  bilder/farbe/img2034_en.img, bilder/farbe/koords_en.img,
+  bilder/farbe/raster_en.img, bilder/farbe/taskman_en.img,
+  bilder/farbe/tpa_en.img, bilder/farbe/wr_modi_en.img,
+  bilder/farbe/xcontrol_en.img, bilder/gif/cl_width_en.gif,
+  bilder/gif/extent_en.gif, bilder/gif/f_select_en.gif,
+  bilder/gif/fenster_en.gif, bilder/gif/fontinfo_en.gif,
+  bilder/gif/img2034_en.gif, bilder/gif/koords_en.gif,
+  bilder/gif/raster_en.gif, bilder/gif/taskman_en.gif,
+  bilder/gif/tpa_en.gif, bilder/gif/wr_modi_en.gif,
+  bilder/gif/xcontrol_en.gif, bilder/mono/cl_width_en.img,
+  bilder/mono/extent_en.img, bilder/mono/f_select_en.img,
+  bilder/mono/fenster_en.img, bilder/mono/fontinfo_en.img,
+  bilder/mono/img2034_en.img, bilder/mono/koords_en.img,
+  bilder/mono/raster_en.img, bilder/mono/taskman_en.img,
+  bilder/mono/tpa_en.img, bilder/mono/wr_modi_en.img,
+  bilder/mono/xcontrol_en.img, gem/aes/fsel_/fsel_exinput.ui,
+  gem/aes/wind_/components.ui, gem/aes/wind_/wind_get_set_geneva.ui,
+  gem/guidelns/style_en.u, gem/vdi/vdi_en.u,
+  gem/vdi/attribut/fill/filltypes.ui, gem/vdi/control/v_opnbm.ui,
+  gem/vdi/control/v_pat_rotate.ui, gem/vdi/inquire/vqt_extent.ui,
+  gem/vdi/inquire/vqt_fontinfo.ui, gem/vdi/inquire/vqt_width.ui,
+  gemdos/gemdos.u:
+
+  Translation by Peter A. West
+
+2007-04-28 Saturday 13:02  Gerhard Stoll
+
+  * config.u, tos_hyp.u, bios/bios_en.ui, gem/aes/wind_/wind_get.ui,
+  xbios/bildscrm/cursconf.ui, xbios/bildscrm/egetpale.ui,
+  xbios/bildscrm/egetshif.ui, xbios/bildscrm/esetbank.ui,
+  xbios/bildscrm/esetcolo.ui, xbios/bildscrm/esetgray.ui,
+  xbios/bildscrm/esetpale.ui, xbios/bildscrm/esetshif.ui,
+  xbios/bildscrm/esetsmea.ui, xbios/bildscrm/getrez.ui,
+  xbios/bildscrm/initmous.ui, xbios/bildscrm/logbase.ui,
+  xbios/bildscrm/mon_type.ui, xbios/bildscrm/physbase.ui,
+  xbios/bildscrm/setcolor.ui, xbios/bildscrm/setpalet.ui,
+  xbios/bildscrm/setscree.ui, xbios/bildscrm/vgetrgb.ui,
+  xbios/bildscrm/vgetsize.ui, xbios/bildscrm/vsetmask.ui,
+  xbios/bildscrm/vsetmode.ui, xbios/bildscrm/vsetrgb.ui,
+  xbios/bildscrm/vsetscre.ui, xbios/bildscrm/vsetsync.ui,
+  xbios/bildscrm/vsync.ui, xbios/centscrn/multimon.ui,
+  xbios/centscrn/setmon.ui, xbios/centscrn/sizecomp.ui,
+  xbios/centscrn/vattrib.ui, xbios/centscrn/vclose.ui,
+  xbios/centscrn/vcreate.ui, xbios/centscrn/vdelete.ui,
+  xbios/centscrn/vfirst.ui, xbios/centscrn/vload.ui,
+  xbios/centscrn/vlock.ui, xbios/centscrn/vnext.ui,
+  xbios/centscrn/voffset.ui, xbios/centscrn/vopen.ui,
+  xbios/centscrn/vread.ui, xbios/centscrn/vsave.ui,
+  xbios/centscrn/vscroll.ui, xbios/centscrn/vseek.ui,
+  xbios/centscrn/vsize.ui, xbios/centscrn/vvalid.ui,
+  xbios/centscrn/vwrite.ui, xbios/crazydot/acmodenr.ui,
+  xbios/crazydot/cpmd2amd.ui, xbios/crazydot/gamddesc.ui,
+  xbios/crazydot/getafeat.ui, xbios/crazydot/getfeat.ui,
+  xbios/crazydot/getnofpm.ui, xbios/crazydot/getpmode.ui,
+  xbios/crazydot/gregbase.ui, xbios/crazydot/gscrdesc.ui,
+  xbios/crazydot/readmode.ui, xbios/crazydot/resetscr.ui:
+
+  Translation by Peter A. West
+
+2007-04-28 Saturday 12:57  Gerhard Stoll
+
+  * bios/cookie/description/Gnva.ui, gem/aes/appl_/appl_yield.ui,
+  gem/aes/appl_/x_appl_flags.ui, gem/aes/appl_/x_appl_sleep.ui,
+  gem/aes/evnt_/messages/geneva.ui, gem/aes/graf_/graf_slidebox.ui,
+  gem/aes/structures/rsxhdr.ui, gem/aes/wind_/wind_.u,
+  gem/aes/wind_/wind_get_set.ui,
+  gem/aes/wind_/wind_get_set_geneva.ui, gem/aes/form_/form_.u,
+  gem/aes/form_/form_center.ui, gem/aes/form_/form_dial.ui,
+  gem/aes/form_/x_form_center.ui, gem/aes/form_/x_form_error.ui:
+
+  Infos from Geneva add
+
+2007-04-24 Tuesday 18:39  Gerhard Stoll
+
+  * gem/aes/: appl_/x_appl_flags.ui, structures/ANI_MOUSE.ui,
+  structures/APPFLAGS.ui, structures/APPFLG.ui,
+  structures/XFONTINFO.ui, structures/menu.ui,
+  structures/structures.u:
+
+  Add some structures from Geneva
+
+2007-04-22 Sunday 17:34  Gerhard Stoll
+
+  * tos_hyp.u, anhang/hilfe.u, anhang/anhang/anhang.u,
+  anhang/anhang/ascii.ui, anhang/anhang/scan-code.ui,
+  anhang/anhang/xhdi/xhdi_en.ui, bios/bios_en.ui, bios/bios_trap.ui,
+  bios/sys_vec_en.ui, bios/vt52.u, bios/xbra.u,
+  bios/function/bconin.u, bios/function/bconout.u,
+  bios/function/bconstat.u, bios/function/bcostat.u,
+  bios/function/drvmap.u, bios/function/getbpb.u,
+  bios/function/getmpb.u, bios/function/kbshift.u,
+  bios/function/mediach.u, bios/function/rwabs.u,
+  bios/function/setexc.u, bios/function/tickcal.u,
+  gem/aes/evnt_/evnt_keybd.ui, gem/aes/structures/scanx.ui,
+  gem/aes/structures/xdo_inf.ui, gem/guidelns/style_en.u,
+  protokol/AV/av_en.ui, xbios/tastatur/keytbl.ui,
+  xbios/tastatur/tastatur.u:
+
+  Translation by Peter A. West
+
+2007-04-21 Saturday 06:51  Gerhard Stoll
+
+  * config.u, e_aes.u, e_bios.u, e_cpxdok.u, e_funk_l.u, e_gemdos.u,
+  e_linea.u, e_magic.u, e_olga.u, e_protok.u, e_tos.u, e_tos_li.u,
+  e_vdi.u, e_view.u, e_vt52.u, e_xbios.u, e_xbra.u, e_xhdi.u,
+  tos_hyp.u, anhang/hilfe.u, anhang/anhang/tos_vers.u, bios/bios.u,
+  bios/bios_en.ui, bios/sys_var.u, bios/sys_var_de.u,
+  bios/sys_var_en.u, bios/sys_vec_de.ui, bios/sys_vec_en.ui,
+  gem/gem.u, tos/tos_de.ui, tos/tos_en.ui:
+
+  Translation by Peter A. West
+
+2007-04-08 Sunday 08:38  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/messages.u:
+
+  Message form Aniplayer and M_PLAYER
+
+2007-04-06 Friday 10:02  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/messages.u:
+
+  Message form Suji
+
+2007-03-25 Sunday 17:33  Gerhard Stoll
+
+  * protokol/AV/: av.u, av_de.ui, av_en.ui:
+
+  Update AV protocol
+  VA_THAT_IZIT  : VA_OB_NOTEPAD and VA_OB_NOTE
+  VA_PROTOSTATUS: Bit 5 (AV_SENDCLICK)
+  AV_XWIND      : Bit 2
+  AV_VIEW       : msg[5]
+
+2007-03-09 Friday 10:27  Gerhard Stoll
+
+  * protokol/AV/av.u, protokol/AV/av_de.ui, protokol/AV/av_en.ui,
+  protokol/av.u, e_protok.u, tos_hyp.u:
+
+  First translation of the AV protocol
+
+2007-03-07 Wednesday 07:48  Gerhard Stoll
+
+  * gem/aes/wind_/wind_get.ui:
+
+  Description the bug in TOS 1.02 by WF_SCREEN
+
+2007-02-16 Friday 17:39  Gerhard Stoll
+
+  * xbios/: xbios_f.u, pci_bios/error.ui,
+  pci_bios/fast_read_config_byte.ui,
+  pci_bios/fast_read_config_longword.ui,
+  pci_bios/fast_read_config_word.ui, pci_bios/fpclassc.ui,
+  pci_bios/fpdevice.ui, pci_bios/get_machine_id.ui,
+  pci_bios/get_resource.ui, pci_bios/hook_interrupt.ui,
+  pci_bios/pci_bios.u, pci_bios/read_config_longword.ui,
+  pci_bios/unhook_interrupt.ui, pci_bios/write_config_longword.ui,
+  pci_bios/write_config_word.ui, structures/PCI_RSC_DESC.ui,
+  structures/structures.u:
+
+  Add PCI-BIOS function get_machine_id, get_resource and
+  unhook_interrupt
+
+2007-02-12 Monday 06:37  Gerhard Stoll
+
+  * xbios/bildscrm/mon_type.ui:
+
+  Value Value four and five from the ct60
+
+2007-02-11 Sunday 14:39  Gerhard Stoll
+
+  * bios/cookie/: cookie.u, description/MN3D.ui:
+
+  Cookie form the MENU3D.PRG
+
+2007-02-11 Sunday 14:34  Gerhard Stoll
+
+  * bios/cookie/: cookie.u, list.ui, description/Nspd.ui:
+
+  Cookie form the acceleration-card Nemesis
+
+2007-02-03 Saturday 16:06  Gerhard Stoll
+
+  * xbios/: xbios_f.u, bildscrm/Setscreen_Milan.ui,
+  bildscrm/Setscreen_ct60.ui, bildscrm/bildscrm.u,
+  bildscrm/vsetscre.ui, ct60/cache.ui, ct60/ct60.u,
+  ct60/ct60_vmalloc.ui, ct60/fl_cache.ui, ct60/rcortemp.ui,
+  ct60/rd_param.ui, structures/SCREENINFO.ui,
+  structures/SCRMEMBLK.ui:
+
+  Add new XBIOS functions from the ct60 (2007-01-24)
+
+2007-01-20 Saturday 16:20  Gerhard Stoll
+
+  * gem/vdi/: vdi_en.u, attribut/attribut.u,
+  attribut/bitmap/bitmap.u, attribut/fill/vsf_xperimeter.ui,
+  attribut/linien/lines.u, attribut/linien/v_bez_qual.ui,
+  attribut/linien/vsl_bg_color.ui, attribut/linien/vsl_color.ui,
+  attribut/linien/vsl_ends.ui, attribut/linien/vsl_fg_color.ui,
+  attribut/linien/vsl_type.ui, attribut/linien/vsl_udsty.ui,
+  attribut/linien/vsl_width.ui, attribut/marker/marker.u,
+  attribut/marker/vsm_bg_color.ui, attribut/marker/vsm_color.ui,
+  attribut/marker/vsm_fg_color.ui, attribut/text/text.u,
+  attribut/text/v_topbot.ui, attribut/text/vst_alignment.ui,
+  attribut/text/vst_arbpt.ui, attribut/text/vst_bg_color.ui,
+  attribut/text/vst_fg_color.ui, attribut/text/vst_scratch.ui,
+  attribut/text/vst_setsize.ui, attribut/uebergeordnete/superior.u,
+  attribut/uebergeordnete/v_ps_halftone.ui,
+  attribut/uebergeordnete/v_setrgb.ui,
+  attribut/uebergeordnete/v_setrgbi.ui,
+  attribut/uebergeordnete/vs_color.ui,
+  attribut/uebergeordnete/vs_color2.ui,
+  attribut/uebergeordnete/vs_grayoverride.ui,
+  attribut/uebergeordnete/vswr_mode.ui:
+
+  Small Update for the english version
+
+2007-01-01 Monday 15:43  Gerhard Stoll
+
+  * bios/cookie/: cookie.u, list.ui, description/FAX_.ui,
+  description/MCWR.ui:
+
+  Cookie from STarFax
+
+2007-01-01 Monday 15:42  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/messages.u:
+
+  Messages from QFax/Pro, STarFax and ViewFax
+
+2006-12-15 Friday 18:10  Gerhard Stoll
+
+  * bios/cookie/: cookie.u, list.ui, description/CHBT.ui,
+  description/CHTW.ui, description/CICN.ui, description/CLOK.ui,
+  description/DATE.ui, description/DYDL.ui, description/DYwl.ui,
+  description/EURO.ui, description/FSER.ui, description/Gnva.ui,
+  description/HSND.ui, description/MCSP.ui, description/McSn.ui,
+  description/MgSn.ui, description/PAUL.ui, description/PDEB.ui,
+  description/RFLX.ui, description/RSVE.ui, description/SCSI.ui,
+  description/SSND.ui, description/TIME.ui, description/Tmon.ui,
+  description/Typ1.ui, description/UFSL.ui, description/UsNm.ui,
+  description/WRAP.ui, description/XSDD.ui, description/_FSR.ui,
+  description/ck01.ui, description/nTOS.ui:
+
+  More Cookies and XBRA
+
+2006-12-15 Friday 18:08  Gerhard Stoll
+
+  * xbios/sound/soundcmd.ui:
+
+  Add info about mode 7
+
+2006-11-19 Sunday 09:53  Gerhard Stoll
+
+  * anhang/anhang/tos_vers.u:
+
+  Add more TOS versions
+
+2006-11-18 Saturday 19:45  Gerhard Stoll
+
+  * bios/cookie/list.ui:
+
+  VDLY is a cookie
+
+2006-11-04 Saturday 09:36  Gerhard Stoll
+
+  * gemdos/system/sconfig.ui:
+
+  Small translation
+
+2006-11-04 Saturday 09:33  Gerhard Stoll
+
+  * xbios/bildscrm/bildscrm.u:
+
+  Small correcting
+
+2006-11-04 Saturday 09:32  Gerhard Stoll
+
+  * bios/cookie/: cookie.u, list.ui, description/KAOS.ui:
+
+  Add KAOS cookie
+
+
+

1.3.6 Version 4.96

+
+2006-10-21 Saturday 13:30  Gerhard Stoll
+
+  * bios/cookie/: list.ui, description/EdDI.ui:
+
+  More info about EdDI
+
+2006-10-21 Saturday 13:30  Gerhard Stoll
+
+  * bios/sys_var.u:
+
+  More info from memcntrl
+
+2006-09-14 Thursday 14:54  Gerhard Stoll
+
+  * gem/aes/shel_/shel_write.ui, gem/aes/structures/sheltail.ui,
+  magic/magic.u, magic/magicmac.u, magic/shutdown/shutdown.u,
+  magic/shutdown/shutdown_de.ui, magic/shutdown/shutdown_en.ui:
+
+  Translate a little bit
+
+2006-09-07 Thursday 16:24  Gerhard Stoll
+
+  * bios/cookie/: cookie.u, list.ui:
+
+  Cookie DCSD, fVDI and VDI, CKBD is also a cookie
+
+2006-09-07 Thursday 16:24  Gerhard Stoll
+
+  * bios/cookie/description/: DCSD.ui, VDIp.ui, fVDI.ui:
+
+  Cookie DCSD, fVDI and VDI
+
+2006-08-27 Sunday 08:35  Gerhard Stoll
+
+  * anhang/anhang/tos_vers.u:
+
+  Mistake in UDO syntax
+
+2006-08-18 Friday 16:01  Gerhard Stoll
+
+  * bios/cookie/description/_MCH.ui:
+
+  Mistake in UDO syntax
+
+2006-08-12 Saturday 19:25  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/messages.u:
+
+  Messages from MultiGEM2
+
+2006-08-12 Saturday 19:24  Gerhard Stoll
+
+  * gemdos/gemdos_f.u, gem/aes/aes_f.u:
+
+  Function from MultiGEM2
+
+2006-08-08 Tuesday 17:11  Gerhard Stoll
+
+  * gem/aes/: aes_f.u, appl_/appl_.u, appl_/appl_search.ui,
+  appl_/x_appl_flags.ui, appl_/x_appl_font.ui, appl_/x_appl_sleep.ui,
+  appl_/x_appl_term.ui, evnt_/evnt_multi.ui, form_/form_alert.ui,
+  form_/form_dial.ui, form_/form_error.ui, graf_/graf_mouse.ui,
+  graf_/graf_slidebox.ui, rsrc_/rsrc_load.ui, shel_/shel_write.ui,
+  wind_/wind_get.ui, wind_/wind_set.ui:
+
+  x_appl_flags, x_appl_font, x_appl_sleep, x_appl_term and other infos form Geneva
+
+2006-08-08 Tuesday 15:54  Gerhard Stoll
+
+  * bios/cookie/list.ui:
+
+  AHVR is also a cookie
+
+2006-08-08 Tuesday 15:50  Gerhard Stoll
+
+  * gemdos/structures/DOSVARS.ui, gem/aes/rsrc_/rsrc_rcfix.ui:
+
+  Change the look of the text
+
+2006-08-08 Tuesday 15:50  Gerhard Stoll
+
+  * gem/vdi/control/v_savecache.ui:
+
+  Correcting the binding
+
+2006-08-07 Monday 18:08  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/messages.u:
+
+  Messages from Interface
+
+2006-08-06 Sunday 17:14  Gerhard Stoll
+
+  * gem/aes/structures/: rshdr.ui, rsxhdr.ui, structures.u,
+  tedinfo.ui:
+
+  Add extend resource header
+
+2006-08-06 Sunday 17:13  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/: evnts_de.ui, evnts_en.ui, geneva.ui,
+  messages.u:
+
+  Add Messages from Geneva
+
+2006-08-06 Sunday 17:12  Gerhard Stoll
+
+  * gem/aes/appl_/appl_read.ui:
+
+  Add link to appl_getinfo
+
+2006-08-06 Sunday 17:12  Gerhard Stoll
+
+  * gem/aes/aes.u, gem/aes/aes_en.u, gem/aes/evnt_/evnt_mesag.ui,
+  gem/aes/menu_/menu_attach.ui, bios/cookie/description/_MCH.ui:
+
+  Change the look of the text
+
+2006-08-06 Sunday 17:11  Gerhard Stoll
+
+  * bios/cookie/list.ui:
+
+  BLOW used as cookie and XBRA
+
+2006-06-19 Monday 20:45  Gerhard Stoll
+
+  * bios/cookie/: cookie.u, list.ui, description/LEmu.ui,
+  description/LMus.ui, description/Lace.ui, description/MgSn.ui:
+
+  Cookie MgSn, Lace, LEmu and LMus add
+
+2006-06-19 Monday 20:43  Gerhard Stoll
+
+  * anhang/typedefs.u:
+
+  Adress from p_run for TOS < 1.02 (OSHEADER)
+
+2006-06-19 Monday 20:43  Gerhard Stoll
+
+  * protokol/vscreen.u:
+
+  Small translation
+
+2006-06-16 Friday 14:40  Gerhard Stoll
+
+  * anhang/typedefs.u:
+
+  Detecting from EmuTOS (OSHEADER)
+
+2006-06-12 Monday 09:55  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/messages.u:
+
+  Messages from EB DUMP
+
+2006-06-11 Sunday 09:47  Gerhard Stoll
+
+  * anhang/: changes/04_96.ui, neu.u:
+
+  Start with version 4.96
+
+2006-06-11 Sunday 09:38  Gerhard Stoll
+
+  * config.u, anhang/changes/04_95.ui:
+
+  Make Release 4.95
+
+2006-06-11 Sunday 09:36  Gerhard Stoll
+
+  * anhang/hilfe.u:
+
+  Change email
+
+2006-06-11 Sunday 09:36  Gerhard Stoll
+
+  * bilder/gif/email.gif:
+
+  Email as graphic
+
+
+

1.3.7 Version 4.95

+
+2006-06-09 Friday 18:30  Gerhard Stoll
+
+  * bios/cookie/description/MaTC.ui:
+
+  Add structure
+
+2006-06-05 Monday 10:45  Gerhard Stoll
+
+  * bios/cookie/list.ui:
+
+  TK40 used for cookie and XBRA
+
+2006-06-03 Saturday 15:35  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/messages.u:
+
+  Message from XaAESnap
+
+2006-06-02 Friday 16:51  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/messages.u:
+
+  Messages from Qdialer (STiK)
+
+2006-06-02 Friday 16:51  Gerhard Stoll
+
+  * xbios/xbios_f.u:
+
+  Add XBIOS function from MATRIX grahpic cards
+
+2006-06-02 Friday 16:50  Gerhard Stoll
+
+  * bios/cookie/description/_NET.ui:
+
+  Add structure netinfo
+
+2006-05-27 Saturday 07:15  Gerhard Stoll
+
+  * config.u, gemdos/structures/cdrom_msf.ui,
+  gemdos/structures/cdrom_read.ui,
+  gemdos/structures/cdrom_subchnl.ui, gemdos/structures/cdrom_ti.ui,
+  gemdos/structures/cdrom_tocentry.ui, xbios/laufwerk/metainit.ui,
+  gemdos/structures/cdrom.ui, gemdos/structures/cdrom_audioctrl.ui,
+  gemdos/structures/cdrom_mcn.ui, gemdos/structures/cdrom_tisrc.ui,
+  gemdos/structures/cdrom_tochdr.ui, xbios/laufwerk/metaopen.ui,
+  xbios/structures/CD_DISC_INFO.ui, xbios/structures/META_INFO_1.ui,
+  xbios/structures/META_INFO_2.ui:
+
+  Translation from some MetaDOS structures
+
+2006-05-25 Thursday 17:03  Gerhard Stoll
+
+  * anhang/typedefs.u:
+
+  Remove some structures to an other place
+
+2006-05-25 Thursday 17:02  Gerhard Stoll
+
+  * gemdos/: gemdos.u, struktur.ui, structures/DISKINFO.ui,
+  structures/DOSTIME.ui, structures/DOSVARS.ui, structures/DTA.ui,
+  structures/FILEPTR.ui, structures/LINE.ui, structures/PD.ui,
+  structures/XATTR.ui, structures/cd_ad.ui, structures/cdrom.ui,
+  structures/cdrom_audioctrl.ui, structures/cdrom_mcn.ui,
+  structures/cdrom_msf.ui, structures/cdrom_read.ui,
+  structures/cdrom_subchnl.ui, structures/cdrom_ti.ui,
+  structures/cdrom_tisrc.ui, structures/cdrom_tocentry.ui,
+  structures/cdrom_tochdr.ui, structures/cdrom_volctrl.ui,
+  structures/fcookie.ui, structures/flock.ui, structures/ltchars.ui,
+  structures/mutimbuf.ui, structures/ploadinfo.ui,
+  structures/sgttyb.ui, structures/sigaction.ui,
+  structures/structures.u, structures/tchars.ui,
+  structures/timeval.ui, structures/timezone.ui, structures/tty.ui,
+  structures/winsize.ui, structures/xkey.ui:
+
+  New structures dircetory and some translations
+
+2006-05-23 Tuesday 19:49  Gerhard Stoll
+
+  * config.u, e_bios.u, tos_hyp.u, anhang/typedefs.u,
+  bilder/farbe/bubblegem.img, bilder/farbe/pipeline.img,
+  bilder/farbe/sspicon_.img, bilder/gif/aligment.gif,
+  bilder/gif/bubblegem.gif, bilder/gif/cl_width.gif,
+  bilder/gif/disk.gif, bilder/gif/drv_u.gif, bilder/gif/drv_udev.gif,
+  bilder/gif/drvuproc.gif, bilder/gif/extent.gif,
+  bilder/gif/f_select.gif, bilder/gif/fenster.gif,
+  bilder/gif/filesys.gif, bilder/gif/fontinfo.gif,
+  bilder/gif/frage.gif, bilder/gif/gdos_ahn.gif,
+  bilder/gif/img2034.gif, bilder/gif/img2035.gif,
+  bilder/gif/img2036.gif, bilder/gif/img2037.gif,
+  bilder/gif/img2038.gif, bilder/gif/img2039.gif,
+  bilder/gif/img2040.gif, bilder/gif/img2041.gif,
+  bilder/gif/img2042.gif, bilder/gif/img2043.gif,
+  bilder/gif/img2044.gif, bilder/gif/img2045.gif,
+  bilder/gif/info.gif, bilder/gif/koords.gif, bilder/gif/linien.gif,
+  bilder/gif/marker.gif, bilder/gif/meta_3.gif,
+  bilder/gif/metafile.gif, bilder/gif/muster.gif,
+  bilder/gif/pipeline.gif, bilder/gif/raster.gif,
+  bilder/gif/rufen.gif, bilder/gif/sspicon_.gif, bilder/gif/stop.gif,
+  bilder/gif/taskman.gif, bilder/gif/tpa.gif, bilder/gif/wr_modi.gif,
+  bilder/gif/xcontrol.gif, bilder/mono/bubblegem.img,
+  bilder/mono/pipeline.img, bilder/mono/sspicon_.img,
+  bios/bios_en.ui, bios/sys_var.u, bios/cookie/cookie_en.ui,
+  bios/cookie/description/CHTW.ui, bios/cookie/description/MagX.ui,
+  bios/cookie/description/_MCH.ui, bios/function/bconin.u,
+  bios/function/bconout.u, bios/function/bconstat.u,
+  bios/function/bcostat.u, bios/function/drvmap.u,
+  bios/function/getbpb.u, bios/function/getmpb.u,
+  bios/function/kbshift.u, bios/function/mediach.u,
+  bios/function/rwabs.u, bios/function/setexc.u,
+  bios/function/tickcal.u, emulator.en/stem.u, gem/cpxdoku.u,
+  gem/aes/aes.u, gem/aes/aes_en.u, gem/aes/toolbar.ui,
+  gem/aes/appl_/appl_bvset.ui, gem/aes/appl_/appl_getinfo.ui,
+  gem/aes/appl_/appl_options.ui, gem/aes/evnt_/messages/evnts_de.ui,
+  gem/aes/evnt_/messages/evnts_en.ui, gem/aes/menu_/menu_istart.ui,
+  gem/aes/structures/media_type.ui, gem/aes/structures/object.ui,
+  gem/aes/structures/prn_settings.ui, gem/aes/structures/prn_tray.ui,
+  gem/aes/structures/scanx.ui, gem/aes/wind_/components.ui,
+  gem/aes/wind_/wind_get.ui, gem/aes/wind_/wind_set.ui,
+  gem/guidelns/img2034.gif, gem/guidelns/img2035.gif,
+  gem/guidelns/img2036.gif, gem/guidelns/img2037.gif,
+  gem/guidelns/img2038.gif, gem/guidelns/img2039.gif,
+  gem/guidelns/img2040.gif, gem/guidelns/img2041.gif,
+  gem/guidelns/img2042.gif, gem/guidelns/img2043.gif,
+  gem/guidelns/img2044.gif, gem/guidelns/img2045.gif,
+  gem/guidelns/style.u, gem/guidelns/style_en.u, gem/vdi/vdi.u,
+  gem/vdi/vdi_en.u, gem/vdi/attribut/fill/filltypes.ui,
+  gem/vdi/control/v_resize_bm.ui, gem/vdi/escape/camera/vqp_films.ui,
+  gem/vdi/escape/camera/vsc_expose.ui, gem/vdi/input/vrq_valuator.ui,
+  gem/vdi/inquire/vq_ext_devinfo.ui, gem/vdi/inquire/vq_extnd.ui,
+  gem/vdi/inquire/vqf_attributes.ui, gemdos/filesys.u,
+  gemdos/gemdos.u, gemdos/struktur.ui, gemdos/datetime/datetime.u,
+  gemdos/dir/dcreate.ui, gemdos/dir/ddelete.ui, gemdos/dir/dfree.ui,
+  gemdos/dir/dgetdrv.ui, gemdos/dir/dgetpath.ui,
+  gemdos/dir/dsetdrv.ui, gemdos/dir/dsetpath.ui,
+  gemdos/file/fattrib.ui, gemdos/file/fclose.ui,
+  gemdos/file/fcntl.ui, gemdos/file/fcreate.ui,
+  gemdos/file/fdatime.ui, gemdos/file/fdelete.ui,
+  gemdos/file/fdup.ui, gemdos/file/fforce.ui, gemdos/file/fgetdta.ui,
+  gemdos/file/flock.ui, gemdos/file/fopen.ui, gemdos/file/fread.ui,
+  gemdos/file/frename.ui, gemdos/file/fseek.ui,
+  gemdos/file/fsetdta.ui, gemdos/file/fsfirst.ui,
+  gemdos/file/fsnext.ui, gemdos/file/fwrite.ui,
+  gemdos/prozess/pexec.ui, gemdos/system/ssystem.ui,
+  gemdos/system/system.u, magic/magicpc.u, magic/xfs.u,
+  protokol/font.u, protokol/ltlproto.u, protokol/view.u,
+  protokol/BubbleGEM/bubble_de.ui, protokol/BubbleGEM/bubble_en.ui,
+  protokol/BubbleGEM/img20.img, protokol/ssp/pipeline.gif,
+  protokol/ssp/pipeline.img, protokol/ssp/ssp.u,
+  protokol/ssp/sspicon_.gif, protokol/ssp/sspicon_.img,
+  xbios/bildscrm/bildscrm.u, xbios/bildscrm/cursconf.ui,
+  xbios/bildscrm/egetpale.ui, xbios/bildscrm/egetshif.ui,
+  xbios/bildscrm/esetbank.ui, xbios/bildscrm/esetcolo.ui,
+  xbios/bildscrm/esetgray.ui, xbios/bildscrm/esetpale.ui,
+  xbios/bildscrm/esetshif.ui, xbios/bildscrm/esetsmea.ui,
+  xbios/bildscrm/getrez.ui, xbios/bildscrm/initmous.ui,
+  xbios/bildscrm/logbase.ui, xbios/bildscrm/mon_type.ui,
+  xbios/bildscrm/physbase.ui, xbios/bildscrm/setcolor.ui,
+  xbios/bildscrm/setpalet.ui, xbios/bildscrm/setscree.ui,
+  xbios/bildscrm/vgetrgb.ui, xbios/bildscrm/vgetsize.ui,
+  xbios/bildscrm/vsetmask.ui, xbios/bildscrm/vsetrgb.ui,
+  xbios/bildscrm/vsetscre.ui, xbios/bildscrm/vsetsync.ui,
+  xbios/bildscrm/vsync.ui, xbios/centscrn/centscrn.u,
+  xbios/ct60/rcortemp.ui, xbios/datetime/datetime.u,
+  xbios/datetime/datetime.ui, xbios/datetime/gettime.ui,
+  xbios/datetime/nvmacces.ui, xbios/datetime/settime.ui,
+  xbios/datetime/xbtimer.ui, xbios/drucker/drucker.u,
+  xbios/drucker/prtblk.ui, xbios/drucker/scrdmp.ui,
+  xbios/drucker/setprt.ui, xbios/interrpt/interrpt.u,
+  xbios/interrpt/jdisint.ui, xbios/interrpt/jenabint.ui,
+  xbios/laufwerk/flopfmt.ui, xbios/laufwerk/floprd.ui,
+  xbios/laufwerk/flopver.ui, xbios/laufwerk/flopwr.ui,
+  xbios/laufwerk/laufwerk.u, xbios/laufwerk/protobt.ui,
+  xbios/sound/buffoper.ui, xbios/sound/buffptr.ui,
+  xbios/sound/devconne.ui, xbios/sound/gpio.ui,
+  xbios/sound/locksnd.ui, xbios/sound/setbuffe.ui,
+  xbios/sound/setinter.ui, xbios/sound/setmode.ui,
+  xbios/sound/setmontr.ui, xbios/sound/sndstatu.ui,
+  xbios/sound/sound.u, xbios/sound/soundcmd.ui,
+  xbios/sound/unlocksn.ui, xbios/sound/waveplay.ui,
+  xbios/spezial/spezial.u, xbios/tastatur/tastatur.u:
+
+  - Change for a HTML version
+  - Binding for GFA-Basic
+  - Change Status and download from Chatwin and STJ-Oberon-2
+  - MagiC PC DLL-ID from Draconis Windows Sockets
+
+2006-05-14 Sunday 14:29  Gerhard Stoll
+
+  * xbios/laufwerk/metaopen.ui:
+
+  Missing syntay
+
+2006-05-14 Sunday 14:29  Gerhard Stoll
+
+  * xbios/laufwerk/floprate.ui:
+
+  Undocumented systemvariable for the seek rate
+
+2006-05-11 Thursday 17:36  Gerhard Stoll
+
+  * magic/: magic.u, magicmac.u:
+
+  Change links for new cookie structure
+
+2006-05-11 Thursday 17:36  Gerhard Stoll
+
+  * bios/: sys_vec.u, sys_vec_de.ui, sys_vec_en.ui, bios_en.ui:
+
+  some translations
+
+2006-05-11 Thursday 17:31  Gerhard Stoll
+
+  * bios/: bios.u, bios_f.u, cookie.u, sys_var.u, vt52.u, xbra.u,
+  cookie/cookie.u, cookie/cookie_de.ui, cookie/cookie_en.ui,
+  cookie/example_de.ui, cookie/example_en.ui, cookie/list.ui,
+  cookie/description/3DMN.ui, cookie/description/3RDB.ui,
+  cookie/description/60Hz.ui, cookie/description/8_8.ui,
+  cookie/description/ACCS.ui, cookie/description/AFnt.ui,
+  cookie/description/AHVR.ui, cookie/description/ALHP.ui,
+  cookie/description/ALIC.ui, cookie/description/AMC1.ui,
+  cookie/description/AMC2.ui, cookie/description/ANSe.ui,
+  cookie/description/ASum.ui, cookie/description/AVOJ.ui,
+  cookie/description/AVmw.ui, cookie/description/AgK0.ui,
+  cookie/description/AmAN.ui, cookie/description/BASH.ui,
+  cookie/description/BBD2.ui, cookie/description/BCKW.ui,
+  cookie/description/BGEM.ui, cookie/description/BGHD.ui,
+  cookie/description/BHLP.ui, cookie/description/BHdl.ui,
+  cookie/description/BLNK.ui, cookie/description/BLOW.ui,
+  cookie/description/BSIM.ui, cookie/description/BUG1.ui,
+  cookie/description/C24P.ui, cookie/description/CACH.ui,
+  cookie/description/CALD.ui, cookie/description/CASE.ui,
+  cookie/description/CB2K.ui, cookie/description/CBDF.ui,
+  cookie/description/CBHD.ui, cookie/description/CBHY.ui,
+  cookie/description/CBIT.ui, cookie/description/CCDA.ui,
+  cookie/description/CDOT.ui, cookie/description/CFIX.ui,
+  cookie/description/CFsl.ui, cookie/description/CHAM.ui,
+  cookie/description/CHN1.ui, cookie/description/CHNG.ui,
+  cookie/description/CJar.ui, cookie/description/CKBD.ui,
+  cookie/description/CKJR.ui, cookie/description/CLCK.ui,
+  cookie/description/CLK1.ui, cookie/description/CLOK.ui,
+  cookie/description/CM16.ui, cookie/description/CNTS.ui,
+  cookie/description/CPSL.ui, cookie/description/CRAC.ui,
+  cookie/description/CRIT.ui, cookie/description/CSMD.ui,
+  cookie/description/CT60.ui, cookie/description/CTCH.ui,
+  cookie/description/CTSF.ui, cookie/description/CtCp.ui,
+  cookie/description/DATE.ui, cookie/description/DATL.ui,
+  cookie/description/DAWN.ui, cookie/description/DBFX.ui,
+  cookie/description/DCF7.ui, cookie/description/DECD.ui,
+  cookie/description/DEPI.ui, cookie/description/DHST.ui,
+  cookie/description/DIG2.ui, cookie/description/DJBX.ui,
+  cookie/description/DKEY.ui, cookie/description/DNTR.ui,
+  cookie/description/DPAT.ui, cookie/description/DPRS.ui,
+  cookie/description/DRIV.ui, cookie/description/DRRH.ui,
+  cookie/description/DSSO.ui, cookie/description/DYJA.ui,
+  cookie/description/DYJD.ui, cookie/description/A2sv.ui,
+  cookie/description/ALRM.ui, cookie/description/APGM.ui,
+  cookie/description/ARTS.ui, cookie/description/DYNL.ui,
+  cookie/description/DYwl.ui, cookie/description/Dsel.ui,
+  cookie/description/EBPO.ui, cookie/description/EDFX.ui,
+  cookie/description/EGON.ui, cookie/description/EMNP.ui,
+  cookie/description/ENV$.ui, cookie/description/ENVN.ui,
+  cookie/description/ENVR.ui, cookie/description/EPro.ui,
+  cookie/description/ETM.ui, cookie/description/EURO.ui,
+  cookie/description/EXRA.ui, cookie/description/EXTD.ui,
+  cookie/description/EdDI.ui, cookie/description/FALT.ui,
+  cookie/description/FAXR.ui, cookie/description/FHFX.ui,
+  cookie/description/FIX2.ui, cookie/description/FLTP.ui,
+  cookie/description/FLXD.ui, cookie/description/FOse_.ui,
+  cookie/description/FSEL.ui, cookie/description/FSER.ui,
+  cookie/description/FSMC.ui, cookie/description/FSmp.ui,
+  cookie/description/F_3D.ui, cookie/description/FaKE.ui,
+  cookie/description/Fose.ui, cookie/description/FrmD.ui,
+  cookie/description/GABI.ui, cookie/description/GBel.ui,
+  cookie/description/GCOM.ui, cookie/description/GDEV.ui,
+  cookie/description/GEHC.ui, cookie/description/GEHD.ui,
+  cookie/description/GEMB.ui, cookie/description/GENV.ui,
+  cookie/description/GI30.ui, cookie/description/GIGA.ui,
+  cookie/description/GLAS.ui, cookie/description/GLBL.ui,
+  cookie/description/GMTC.ui, cookie/description/GNUC.ui,
+  cookie/description/GOBJ.ui, cookie/description/GOff.ui,
+  cookie/description/GSND.ui, cookie/description/GSXB.ui,
+  cookie/description/GULM.ui, cookie/description/Gfix.ui,
+  cookie/description/Gnva.ui, cookie/description/HABO.ui,
+  cookie/description/HAMM.ui, cookie/description/BIGS.ui,
+  cookie/description/BIOC.ui, cookie/description/CBCE.ui,
+  cookie/description/CHTW.ui, cookie/description/CISY.ui,
+  cookie/description/CJAR_.ui, cookie/description/COLO.ui,
+  cookie/description/CWCo.ui, cookie/description/CaTT.ui,
+  cookie/description/CatS.ui, cookie/description/HBFS.ui,
+  cookie/description/HDDR.ui, cookie/description/HDEX.ui,
+  cookie/description/HDEY.ui, cookie/description/HDJR.ui,
+  cookie/description/HDLD.ui, cookie/description/HDPR.ui,
+  cookie/description/HDRC.ui, cookie/description/HDST.ui,
+  cookie/description/HDSW.ui, cookie/description/HFIX.ui,
+  cookie/description/HIDS.ui, cookie/description/HMDU.ui,
+  cookie/description/HMOC.ui, cookie/description/HMRD.ui,
+  cookie/description/HMRS.ui, cookie/description/HPHC.ui,
+  cookie/description/HPLJ.ui, cookie/description/HSCD.ui,
+  cookie/description/HSND.ui, cookie/description/HWAM.ui,
+  cookie/description/HcP6.ui, cookie/description/IBMP.ui,
+  cookie/description/ICFS.ui, cookie/description/ICST.ui,
+  cookie/description/IDSK.ui, cookie/description/IMAC.ui,
+  cookie/description/IMNE.ui, cookie/description/INSJ.ui,
+  cookie/description/INXR.ui, cookie/description/IRSB.ui,
+  cookie/description/JAM1.ui, cookie/description/JB2G.ui,
+  cookie/description/JCLK.ui, cookie/description/JCNB.ui,
+  cookie/description/JCNC.ui, cookie/description/JCNH.ui,
+  cookie/description/JCNT.ui, cookie/description/JFTP.ui,
+  cookie/description/JMLB.ui, cookie/description/JMLS.ui,
+  cookie/description/JSHD.ui, cookie/description/JUST.ui,
+  cookie/description/J_Sc.ui, cookie/description/KEYT.ui,
+  cookie/description/KGTF.ui, cookie/description/KIDI.ui,
+  cookie/description/KREG.ui, cookie/description/KbEv.ui,
+  cookie/description/KyMp.ui, cookie/description/LACY.ui,
+  cookie/description/LALA.ui, cookie/description/LASB.ui,
+  cookie/description/LAWC.ui, cookie/description/DCdd.ui,
+  cookie/description/DYJT.ui, cookie/description/EADC.ui,
+  cookie/description/LDGE.ui, cookie/description/LEDP.ui,
+  cookie/description/LLCR.ui, cookie/description/LPJM.ui,
+  cookie/description/LTMF.ui, cookie/description/MADD.ui,
+  cookie/description/MADN.ui, cookie/description/MAGN.ui,
+  cookie/description/MBRD.ui, cookie/description/MCL_.ui,
+  cookie/description/MCSP.ui, cookie/description/MCWR.ui,
+  cookie/description/MDIA.ui, cookie/description/MDRK.ui,
+  cookie/description/MDSa.ui, cookie/description/MFAC.ui,
+  cookie/description/MFFM.ui, cookie/description/MFIX.ui,
+  cookie/description/MFNT.ui, cookie/description/MGEM.ui,
+  cookie/description/MID3.ui, cookie/description/MIMA.ui,
+  cookie/description/MIPS.ui, cookie/description/MJAF.ui,
+  cookie/description/MM2X.ui, cookie/description/MMAC.ui,
+  cookie/description/MMUT.ui, cookie/description/MM_2.ui,
+  cookie/description/MNAM.ui, cookie/description/MOAF.ui,
+  cookie/description/MOGR.ui, cookie/description/MPRO.ui,
+  cookie/description/MRAM.ui, cookie/description/MSPD.ui,
+  cookie/description/MSPO.ui, cookie/description/MTft.ui,
+  cookie/description/MUPF.ui, cookie/description/MWHL.ui,
+  cookie/description/MZTR.ui, cookie/description/MaTC.ui,
+  cookie/description/MagC.ui, cookie/description/MagX.ui,
+  cookie/description/MbAr.ui, cookie/description/McSn.ui,
+  cookie/description/MgMc.ui, cookie/description/MgMx.ui,
+  cookie/description/GMNI.ui, cookie/description/GSP1.ui,
+  cookie/description/MiNT.ui, cookie/description/MkJr.ui,
+  cookie/description/N203.ui, cookie/description/NBEL.ui,
+  cookie/description/NBLL.ui, cookie/description/NCLN.ui,
+  cookie/description/NERV.ui, cookie/description/NETS.ui,
+  cookie/description/NEXB.ui, cookie/description/NEXK.ui,
+  cookie/description/NFMT.ui, cookie/description/NFnt.ui,
+  cookie/description/NKCC.ui, cookie/description/NLdr.ui,
+  cookie/description/NMGE.ui, cookie/description/NO7P.ui,
+  cookie/description/NOR5.ui, cookie/description/NOVA.ui,
+  cookie/description/NSC1.ui, cookie/description/NTK4.ui,
+  cookie/description/NUL_.ui, cookie/description/NVDI.ui,
+  cookie/description/OBNL.ui, cookie/description/OFLS.ui,
+  cookie/description/OPMM.ui, cookie/description/OSBL.ui,
+  cookie/description/OSTT.ui, cookie/description/OTOS.ui,
+  cookie/description/OV24.ui, cookie/description/OVDJ.ui,
+  cookie/description/OVEP.ui, cookie/description/OVER.ui,
+  cookie/description/OVEX.ui, cookie/description/OVFS.ui,
+  cookie/description/OVIM.ui, cookie/description/OVLS.ui,
+  cookie/description/OVRD.ui, cookie/description/OVUT.ui,
+  cookie/description/OVWI.ui, cookie/description/PAMN.ui,
+  cookie/description/PBUG.ui, cookie/description/PCI_.ui,
+  cookie/description/PDEB.ui, cookie/description/PDOS.ui,
+  cookie/description/PDRZ.ui, cookie/description/PFIX.ui,
+  cookie/description/PKSH.ui, cookie/description/PMMU.ui,
+  cookie/description/POIS.ui, cookie/description/POWM.ui,
+  cookie/description/PRCS.ui, cookie/description/PRDS.ui,
+  cookie/description/PRMD.ui, cookie/description/PRN!.ui,
+  cookie/description/PRNß.ui, cookie/description/PRO5.ui,
+  cookie/description/PROB.ui, cookie/description/PROT.ui,
+  cookie/description/JINX.ui, cookie/description/KyWt.ui,
+  cookie/description/LOGB.ui, cookie/description/LPCD.ui,
+  cookie/description/LP_2.ui, cookie/description/LoSe.ui,
+  cookie/description/M16X.ui, cookie/description/M16s.ui,
+  cookie/description/MAST.ui, cookie/description/MKHC.ui,
+  cookie/description/PRTD.ui, cookie/description/PRTO.ui,
+  cookie/description/PRTR_.ui, cookie/description/PSND.ui,
+  cookie/description/PSSG.ui, cookie/description/PTOS.ui,
+  cookie/description/Pinp.ui, cookie/description/QIKM.ui,
+  cookie/description/QMAC.ui, cookie/description/QMCP.ui,
+  cookie/description/QST2.ui, cookie/description/QST3.ui,
+  cookie/description/QUAN.ui, cookie/description/RAIL.ui,
+  cookie/description/RESG.ui, cookie/description/RFLX.ui,
+  cookie/description/RFUS.ui, cookie/description/RGUS.ui,
+  cookie/description/RING.ui, cookie/description/ROT8.ui,
+  cookie/description/RREG.ui, cookie/description/RSLT.ui,
+  cookie/description/RSVE.ui, cookie/description/RSVF.ui,
+  cookie/description/RSpd.ui, cookie/description/RTKC.ui,
+  cookie/description/RTOB.ui, cookie/description/RWIN.ui,
+  cookie/description/RaSn.ui, cookie/description/SAM.ui,
+  cookie/description/SBKM.ui, cookie/description/SBTE.ui,
+  cookie/description/SBTS.ui, cookie/description/SCAH.ui,
+  cookie/description/SCKM.ui, cookie/description/SCPN.ui,
+  cookie/description/SCRD.ui, cookie/description/SCRN.ui,
+  cookie/description/SCRS.ui, cookie/description/SCRW.ui,
+  cookie/description/SCSI.ui, cookie/description/SCSV.ui,
+  cookie/description/SDCH.ui, cookie/description/SDES.ui,
+  cookie/description/SDWN.ui, cookie/description/SDsk.ui,
+  cookie/description/SELC.ui, cookie/description/SENV.ui,
+  cookie/description/SFA^.ui, cookie/description/SFIX.ui,
+  cookie/description/SFMN.ui, cookie/description/SKEY.ui,
+  cookie/description/SLCT.ui, cookie/description/SLIP.ui,
+  cookie/description/SLif.ui, cookie/description/SM00.ui,
+  cookie/description/SM01.ui, cookie/description/SM02.ui,
+  cookie/description/SMAL.ui, cookie/description/SMAU.ui,
+  cookie/description/SMTT.ui, cookie/description/SMon.ui,
+  cookie/description/SNAP.ui, cookie/description/SOFS.ui,
+  cookie/description/SOSW.ui, cookie/description/SPCK.ui,
+  cookie/description/SPEE.ui, cookie/description/SPEK.ui,
+  cookie/description/SPEX.ui, cookie/description/SPRG.ui,
+  cookie/description/SSND.ui, cookie/description/ST-C.ui,
+  cookie/description/ST17.ui, cookie/description/STAT.ui,
+  cookie/description/STEM.ui, cookie/description/STEW.ui,
+  cookie/description/STFA.ui, cookie/description/STMS.ui,
+  cookie/description/STRX.ui, cookie/description/STiK.ui,
+  cookie/description/SVAR.ui, cookie/description/SVGA.ui,
+  cookie/description/SWAP.ui, cookie/description/SYMB.ui,
+  cookie/description/SYNL.ui, cookie/description/SYNT.ui,
+  cookie/description/SYST.ui, cookie/description/SZ_M.ui,
+  cookie/description/S_DR.ui, cookie/description/ShLk.ui,
+  cookie/description/SpcE.ui, cookie/description/Spol.ui,
+  cookie/description/StIc.ui, cookie/description/SwTm.ui,
+  cookie/description/SysE.ui, cookie/description/Syso.ui,
+  cookie/description/T206.ui, cookie/description/T2GM.ui,
+  cookie/description/TAPE.ui, cookie/description/TASS.ui,
+  cookie/description/TCFS.ui, cookie/description/TCRB.ui,
+  cookie/description/TFIX.ui, cookie/description/THNX.ui,
+  cookie/description/THRM.ui, cookie/description/THST.ui,
+  cookie/description/TIM3.ui, cookie/description/TIM5.ui,
+  cookie/description/TIME.ui, cookie/description/TK40.ui,
+  cookie/description/TL3D.ui, cookie/description/TLWV.ui,
+  cookie/description/TOUC.ui, cookie/description/TOpW.ui,
+  cookie/description/TPGM.ui, cookie/description/TPat.ui,
+  cookie/description/TRAK.ui, cookie/description/TRUE.ui,
+  cookie/description/TSEN.ui, cookie/description/TSWP.ui,
+  cookie/description/TTTF.ui, cookie/description/TUBS.ui,
+  cookie/description/TWFS.ui, cookie/description/Tenv.ui,
+  cookie/description/Tmon.ui, cookie/description/TraP.ui,
+  cookie/description/Trpp.ui, cookie/description/Typ1.ui,
+  cookie/description/UFSL.ui, cookie/description/UIS3.ui,
+  cookie/description/UKB1.ui, cookie/description/UKB3.ui,
+  cookie/description/USCK.ui, cookie/description/USHD.ui,
+  cookie/description/USPK.ui, cookie/description/USRS.ui,
+  cookie/description/UTRK.ui, cookie/description/VBLF.ui,
+  cookie/description/VDLY.ui, cookie/description/VECS.ui,
+  cookie/description/VFIX.ui, cookie/description/VFNT.ui,
+  cookie/description/VGAS.ui, cookie/description/VI-2.ui,
+  cookie/description/VIRA.ui, cookie/description/VMEM.ui,
+  cookie/description/VPCH.ui, cookie/description/VRAM.ui,
+  cookie/description/VREP.ui, cookie/description/VSCR.ui,
+  cookie/description/VSTM.ui, cookie/description/VSco.ui,
+  cookie/description/VTFX.ui, cookie/description/VXCK.ui,
+  cookie/description/VeiL.ui, cookie/description/View.ui,
+  cookie/description/WARP.ui, cookie/description/WBrd.ui,
+  cookie/description/WDOG.ui, cookie/description/WEGA.ui,
+  cookie/description/WFSL.ui, cookie/description/WICO.ui,
+  cookie/description/WINX.ui, cookie/description/WINZ.ui,
+  cookie/description/WPRO.ui, cookie/description/WRAP.ui,
+  cookie/description/WaHW.ui, cookie/description/WaSA.ui,
+  cookie/description/WfNa.ui, cookie/description/WinK.ui,
+  cookie/description/XALT.ui, cookie/description/XBTN.ui,
+  cookie/description/XDsk.ui, cookie/description/XFRB.ui,
+  cookie/description/XFS1.ui, cookie/description/XHDI.ui,
+  cookie/description/XKBD.ui, cookie/description/XMMU.ui,
+  cookie/description/XMuz.ui, cookie/description/XPCI.ui,
+  cookie/description/XSND.ui, cookie/description/XSSI.ui,
+  cookie/description/XTOS.ui, cookie/description/XWin.ui,
+  cookie/description/_AFM.ui, cookie/description/_AKP.ui,
+  cookie/description/_CPU.ui, cookie/description/_DOS.ui,
+  cookie/description/_FDC.ui, cookie/description/_FLK.ui,
+  cookie/description/_FPU.ui, cookie/description/_FRB.ui,
+  cookie/description/_FSC.ui, cookie/description/_FSR.ui,
+  cookie/description/_IDT.ui, cookie/description/_INF.ui,
+  cookie/description/_INU.ui, cookie/description/_ISO.ui,
+  cookie/description/_JPD.ui, cookie/description/_MCH.ui,
+  cookie/description/_MET.ui, cookie/description/_MIL.ui,
+  cookie/description/_NET.ui, cookie/description/_OOL.ui,
+  cookie/description/_PCI.ui, cookie/description/_PKT.ui,
+  cookie/description/_PWR.ui, cookie/description/_SLM.ui,
+  cookie/description/_SND.ui, cookie/description/_SWI.ui,
+  cookie/description/_T2W.ui, cookie/description/_T30.ui,
+  cookie/description/_VDI.ui, cookie/description/_VDO.ui,
+  cookie/description/__NF.ui, cookie/description/asGT.ui,
+  cookie/description/cVDI.ui, cookie/description/cdMC.ui,
+  cookie/description/fMSX.ui, cookie/description/gk5_.ui,
+  cookie/description/gkCO.ui, cookie/description/hFRB.ui,
+  cookie/description/hade.ui, cookie/description/iPRN.ui,
+  cookie/description/iTMA.ui, cookie/description/lanc.ui,
+  cookie/description/macc.ui, cookie/description/mstx.ui,
+  cookie/description/nAES.ui, cookie/description/nTAS.ui,
+  cookie/description/ne2k.ui, cookie/description/noCF.ui,
+  cookie/description/oVDI.ui, cookie/description/prtr.ui,
+  cookie/description/shlp.ui, cookie/description/spMR.ui,
+  cookie/description/strk.ui, cookie/description/un_x.ui,
+  cookie/description/vT52.ui, cookie/description/wdlg.ui,
+  cookie/description/xFSL.ui, cookie/description/xNet.ui,
+  cookie/description/xRmt.ui, cookie/description/xUFC.ui,
+  cookie/description/zCAC.ui, cookie/description/zDCF.ui,
+  function/kbshift.u:
+
+  Cookie- and XBRA-List
+
+2006-05-11 Thursday 17:24  Gerhard Stoll
+
+  * bios/structures/: md.ui, structures.u:
+
+  Add structure MD
+
+2006-05-07 Sunday 09:51  Gerhard Stoll
+
+  * gem/aes/wind_/wind_get_set.ui:
+
+  WF_USER_POINTER, WF_WIND_ATTACH and WF_WIND_ATTACH add to the list
+
+2006-04-18 Tuesday 22:38  Gerhard Stoll
+
+  * gem/aes/appl_/appl_control.ui:
+
+  Internal modes from OAESis and XaAES
+
+2006-04-16 Sunday 18:10  Gerhard Stoll
+
+  * xbios/structures/bconmap.ui:
+
+  Undocument element
+
+2006-04-10 Monday 12:24  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/messages.u:
+
+  Messages from Geneva add
+
+2006-04-04 Tuesday 16:04  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/messages.u:
+
+  Messages from MyPDF add
+
+2006-04-03 Monday 06:07  Gerhard Stoll
+
+  * gem/aes/shel_/shel_write.ui:
+
+  shel_write (9) NM_INHIBIT_HIDE
+
+2006-04-03 Monday 06:06  Gerhard Stoll
+
+  * gem/aes/aes_f.u:
+
+  Add objc_data to the list
+
+2006-04-03 Monday 06:06  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/messages.u:
+
+  Add WM_WHEEL to the list
+
+2006-04-03 Monday 06:06  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/: evnts_de.ui, evnts_en.ui:
+
+  Fixed docu from SM_M_SPECIAL
+
+2006-04-03 Monday 06:05  Gerhard Stoll
+
+  * gem/aes/structures/: menu.ui, mn_set.ui:
+
+  Translate
+
+2006-03-12 Sunday 08:33  Gerhard Stoll
+
+  * gem/aes/wind_/wind_new.ui:
+
+  Available since AES version 1.4
+
+2006-03-12 Sunday 08:33  Gerhard Stoll
+
+  * protokol/dd.u:
+
+  Add some labels
+
+
+

1.3.8 Version 4.94

+
2006-02-25 Saturday 09:45  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/messages.u:
+
+  Labels for the messages from EnhancedGEM
+
+2006-02-19 Sunday 09:04  Gerhard Stoll
+
+  * bios/function/kbshift.u:
+
+  Adress from pkbshift in TOS 1.00
+
+2006-02-09 Thursday 17:00  Gerhard Stoll
+
+  * linea/linea.u:
+
+  Same text correcting
+
+2006-02-09 Thursday 16:59  Gerhard Stoll
+
+  * xbios/: pci_bios/error.ui, pci_bios/fast_read_config_byte.ui,
+  pci_bios/fast_read_config_longword.ui,
+  pci_bios/fast_read_config_word.ui, pci_bios/fpclassc.ui,
+  pci_bios/fpdevice.ui, pci_bios/hook_interrupt.ui,
+  pci_bios/pci_bios.u, pci_bios/read_config_byte.ui,
+  pci_bios/read_config_longword.ui, pci_bios/read_config_word.ui,
+  pci_bios/write_config_byte.ui, pci_bios/write_config_longword.ui,
+  pci_bios/write_config_word.ui, struktur.ui, xbios_f.u:
+
+  Some function from the PCI BIOS add
+
+2006-02-09 Thursday 16:24  Gerhard Stoll
+
+  * magic/threads/: exapmle.ui, threads.u, vdi.u:
+
+  some translations
+
+2006-02-08 Wednesday 18:01  Gerhard Stoll
+
+  * gem/vdi/vdi.u:
+
+  Add some NVDI and SpeedoGDOS version number, only as comment
+
+2006-02-08 Wednesday 18:00  Gerhard Stoll
+
+  * bios/cookie.u:
+
+  Add quality to FSMC structure
+
+2006-02-08 Wednesday 18:00  Gerhard Stoll
+
+  * gem/aes/form_/xfrm_popup.ui:
+
+  More info about some parameter
+
+2006-02-08 Wednesday 18:00  Gerhard Stoll
+
+  * magic/magicpc.u:
+
+  Add DLL_ID from MPCSTiK
+
+2006-01-26 Thursday 17:49  Gerhard Stoll
+
+  * gemdos/system/sconfig.ui:
+
+  Add new modes
+
+2006-01-26 Thursday 17:49  Gerhard Stoll
+
+  * gem/aes/form_/form_xdial.ui:
+
+  Correct binding
+
+2006-01-26 Thursday 17:49  Gerhard Stoll
+
+  * gem/aes/appl_/appl_getinfo.ui:
+
+  Interface resource file supported from MyAES
+
+2006-01-21 Saturday 15:42  Gerhard Stoll
+
+  * e_olga.u, e_protok.u, tos_hyp.u, protokol/font.u,
+  protokol/olga.u, protokol/olga/olga.u, protokol/olga/olga_de.ui,
+  protokol/olga/olga_en.ui:
+
+  Start with an english version from OLGA
+
+2006-01-08 Sunday 18:16  Gerhard Stoll
+
+  * gemdos/dir/: dir.u, dxopendir.ui:
+
+  New Gemdos function Dxopendir from Dir_Lwr
+
+2005-12-29 Thursday 16:46  Gerhard Stoll
+
+  * bios/bios.u, bios/bios_str.u, bios/structures/bpb.ui,
+  bios/structures/mpb.ui, bios/structures/pun_info.ui,
+  bios/structures/structures.u, xbios/structures/CD_DISC_INFO.ui,
+  xbios/structures/CD_TOC_ENTRY.ui, xbios/structures/DSPBLOCK.ui,
+  xbios/structures/IOREC.ui, xbios/structures/KBDVBASE.ui,
+  xbios/structures/KEYTAB.ui, xbios/structures/MAPTAB.ui,
+  xbios/structures/META_DRVINFO.ui, xbios/structures/META_INFO_1.ui,
+  xbios/structures/META_INFO_2.ui, xbios/structures/MOD_DESC.ui,
+  xbios/structures/MOUSE.ui, xbios/structures/OVERPATCH.ui,
+  xbios/structures/PBDEF.ui, xbios/structures/PMODE.ui,
+  xbios/structures/SCREEN.ui, xbios/structures/SCREENINFO.ui,
+  xbios/structures/SCREEN_OverScan.ui, xbios/structures/SCRMEMBLK.ui,
+  xbios/structures/VDO_MODE.ui, xbios/structures/VDO_PARAM.ui,
+  xbios/structures/VPOS.ui, xbios/structures/bconmap.ui,
+  xbios/structures/structures.u, xbios/xbios.u:
+
+  New structure
+
+2005-12-11 Sunday 14:56  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/evnts.ui:
+
+  English version
+
+2005-12-11 Sunday 14:52  Gerhard Stoll
+
+  * gem/aes/menu_/menu_unregister.ui:
+
+  Add Info about KAOS 1.4.2, thanks to Michael Schroeter
+
+2005-12-11 Sunday 14:51  Gerhard Stoll
+
+  * gem/aes/wind_/: wind_get.ui, wind_get_set.ui, wind_set.ui,
+  wind_xget.ui, wind_xset.ui:
+
+  WF_CALCF2W and WF_CALCW2F from XaAES
+
+2005-12-11 Sunday 14:45  Gerhard Stoll
+
+  * gem/aes/appl_/: appl_.u, appl_options.ui:
+
+  New function aes_options from XaAES, not finished
+
+2005-12-11 Sunday 14:45  Gerhard Stoll
+
+  * gem/aes/appl_/appl_getinfo.ui:
+
+  Add new modes (98, 99) from XaAES
+
+2005-12-11 Sunday 14:44  Gerhard Stoll
+
+  * gem/vdi/attribut/text/vst_error.ui:
+
+  Some error codes from SpeedoGDOS 5 add
+
+2005-12-08 Thursday 21:00  Gerhard Stoll
+
+  * gem/aes/xgrf_/: xgrf_2box.ui, xgrf_stepcalc.ui:
+
+  Add Info about KAOS 1.4.2, thanks to Michael Schroeter
+
+2005-12-08 Thursday 20:56  Gerhard Stoll
+
+  * gem/aes/appl_/appl_bvset.ui, gem/aes/appl_/appl_init.ui,
+  anhang/anhang/tos_vers.u, gemdos/system/sconfig.ui,
+  gemdos/struktur.ui, bios/sys_var.u,
+  gem/aes/evnt_/messages/evnts_de.ui,
+  gem/aes/evnt_/messages/evnts_en.ui,
+  gem/aes/evnt_/messages/messages.u, gem/aes/wind_/wind_get.ui,
+  gem/aes/wind_/wind_get_set.ui, gem/aes/wind_/wind_set.ui,
+  gem/aes/menu_/menu_click.ui,
+  gem/aes/scrp_/scrp_clear.ui,
+  gem/aes/shel_/shel_rdef.ui, gem/aes/shel_/shel_wdef.ui:
+
+  Add Info about KAOS 1.4.2, thanks to Michael Schroeter
+
+2005-12-08 Thursday 20:43  Gerhard Stoll
+
+  * gem/aes/appl_/appl_find.ui:
+
+  Special mode in KAOS and MagiC
+
+2005-12-08 Thursday 13:06  Gerhard Stoll
+
+  * gemdos/system/sconfig.ui:
+
+  Wrong description from bit 4
+
+2005-12-03 Saturday 10:53  Gerhard Stoll
+
+  * gem/aes/: aes.u, aes_en.u, aes_f.u, struktur.ui, toolbar.ui,
+  appl_/appl_getinfo.ui, fnts_/fnts_create.ui, form_/form_.u,
+  form_/form_popup.ui, fslx_/fslx_close.ui, fslx_/fslx_do.ui,
+  fslx_/fslx_evnt.ui, fslx_/fslx_getnxtfile.ui, fslx_/fslx_open.ui,
+  fslx_/fslx_set_flags.ui, lbox_/flags.ui, lbox_/lbox_create.ui,
+  pdlg_/pdlg_.u, pdlg_/pdlg_add_printers.ui,
+  pdlg_/pdlg_add_sub_dialogs.ui, pdlg_/pdlg_close.ui,
+  pdlg_/pdlg_create.ui, pdlg_/pdlg_delete.ui,
+  pdlg_/pdlg_dflt_settings.ui, pdlg_/pdlg_do.ui, pdlg_/pdlg_evnt.ui,
+  pdlg_/pdlg_free_settings.ui, pdlg_/pdlg_get_setsize.ui,
+  pdlg_/pdlg_new_settings.ui, pdlg_/pdlg_open.ui,
+  pdlg_/pdlg_remove_printers.ui, pdlg_/pdlg_remove_sub_dialogs.ui,
+  pdlg_/pdlg_save_default_settings.ui, pdlg_/pdlg_update.ui,
+  pdlg_/pdlg_use_settings.ui, pdlg_/pdlg_validate_settings.ui,
+  pdlg_/use.ui, shel_/shel_.u, structures/applrecord.ui,
+  structures/bitblk.ui, structures/cicon.ui, structures/ciconblk.ui,
+  structures/clrcat.ui, structures/dialog.ui,
+  structures/dither_mode.ui, structures/drv_entry.ui,
+  structures/drv_info.ui, structures/evnt.ui,
+  structures/fnt_dialog.ui, structures/fnts_item.ui,
+  structures/hndl_obj.ui, structures/iconblk.ui,
+  structures/lbox_item.ui, structures/list_box.ui,
+  structures/media_size.ui, structures/media_type.ui,
+  structures/menu.ui, structures/mform.ui, structures/mn_set.ui,
+  structures/object.ui, structures/parmblk.ui,
+  structures/pdlg_hndl.ui, structures/pdlg_init.ui,
+  structures/pdlg_reset.ui, structures/pdlg_sub.ui,
+  structures/popinfo.ui, structures/prn_dialog.ui,
+  structures/prn_entry.ui, structures/prn_mode.ui,
+  structures/prn_settings.ui, structures/prn_switch.ui,
+  structures/prn_tray.ui, structures/rshdr.ui, structures/scanx.ui,
+  structures/set_item.ui, structures/sheltail.ui,
+  structures/slct_item.ui, structures/structures.u,
+  structures/swinfo.ui, structures/tedinfo.ui, structures/userblk.ui,
+  structures/utxt_fn.ui, structures/x_buf_v2.ui,
+  structures/xaesmsg.ui, structures/xdo_inf.ui,
+  structures/xfsl_filter.ui, structures/xshw_command.ui,
+  structures/xted.ui, wind_/wind_get_set.ui, wind_/wind_set.ui,
+  wind_/wind_xget.ui:
+
+  New structures dircetory and some translations
+
+2005-12-03 Saturday 10:49  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/: evnts_de.ui, evnts_en.ui:
+
+  Wrong parameter number in AC_CLOSE
+
+2005-12-03 Saturday 10:48  Gerhard Stoll
+
+  * gem/aes/evnt_/: evnt_.u, evnts.ui, messages/evnts_de.ui,
+  messages/evnts_en.ui:
+
+  English version
+
+2005-11-13 Sunday 07:51  Gerhard Stoll
+
+  * magic/magicmac.u:
+
+  Add cookie elements from version 1.11
+
+2005-11-13 Sunday 07:50  Gerhard Stoll
+
+  * xbios/pci_bios/: error.ui, fpclassc.ui, fpdevice.ui, pci_bios.u:
+
+  error codes
+
+2005-11-13 Sunday 07:50  Gerhard Stoll
+
+  * xbios/xbios_f.u:
+
+  Add the function form the ct60
+
+2005-11-01 Tuesday 07:59  Gerhard Stoll
+
+  * gem/vdi/inquire/vq_extnd.ui:
+
+  work_out[32] indicate new style colour routines (NVDI 5.xx)
+
+2005-11-01 Tuesday 07:58  Gerhard Stoll
+
+  * anhang/anhang/tos_vers.u:
+
+  Translate
+
+2005-10-19 Wednesday 18:26  Gerhard Stoll
+
+  * gem/vdi/: assign_sys.ui, struktur.ui, vdi.u, vdi_en.u,
+  attribut/attribut.u, attribut/fill/vsf_color.ui,
+  attribut/fill/vsf_interior.ui, attribut/fill/vsf_perimeter.ui,
+  attribut/fill/vsf_style.ui, attribut/fill/vsf_udpat.ui,
+  attribut/linien/v_bez_qual.ui, attribut/linien/vsl_color.ui,
+  attribut/linien/vsl_ends.ui, attribut/linien/vsl_type.ui,
+  attribut/linien/vsl_udsty.ui, attribut/linien/vsl_width.ui,
+  attribut/marker/vsm_color.ui, attribut/marker/vsm_height.ui,
+  attribut/marker/vsm_type.ui, attribut/text/vst_alignment.ui,
+  attribut/text/vst_arbpt32.ui, attribut/text/vst_charmap.ui,
+  attribut/text/vst_color.ui, attribut/text/vst_effects.ui,
+  attribut/text/vst_font.ui, attribut/text/vst_height.ui,
+  attribut/text/vst_kern.ui, attribut/text/vst_map_mode.ui,
+  attribut/text/vst_name.ui, attribut/text/vst_point.ui,
+  attribut/text/vst_rotation.ui, attribut/text/vst_setsize32.ui,
+  attribut/text/vst_skew.ui, attribut/text/vst_track_offset.ui,
+  attribut/text/vst_width.ui, attribut/uebergeordnete/vs_color.ui,
+  attribut/uebergeordnete/vswr_mode.ui, control/v_bez_off.ui,
+  control/v_bez_on.ui, control/v_clrwk.ui, control/v_clsbm.ui,
+  control/v_clswk.ui, control/v_getoutline.ui, control/v_opnbm.ui,
+  control/v_opnvwk.ui, control/v_opnwk.ui, control/v_opnwk_pc_gem.ui,
+  control/vs_clip.ui, control/vst_load_fonts.ui, escape/escape.u,
+  escape/graphic/v_bit_image.ui, escape/graphic/v_copies.ui,
+  escape/graphic/v_orient.ui, escape/graphic/v_page_size.ui,
+  escape/graphic/v_tray.ui, escape/graphic/vq_calibrate.ui,
+  escape/graphic/vq_page_name.ui, escape/graphic/vq_tray_names.ui,
+  escape/graphic/vs_calibrate.ui, escape/metafile/v_meta_extents.ui,
+  escape/metafile/v_write_meta.ui, escape/metafile/vm_coords.ui,
+  escape/metafile/vm_filename.ui, escape/metafile/vm_pagesize.ui,
+  escape/special/v_escape2000.ui, escape/text/v_curaddress.ui,
+  escape/text/v_curdown.ui, escape/text/v_curleft.ui,
+  escape/text/v_curright.ui, escape/text/v_curtext.ui,
+  escape/text/v_curup.ui, escape/text/vq_chcells.ui,
+  escape/text/vq_curaddress.ui, input/input.u, input/v_hide_c.ui,
+  input/v_show_c.ui, input/vex_butv.ui, input/vex_curv.ui,
+  input/vex_motv.ui, input/vex_timv.ui, input/vq_key_s.ui,
+  input/vq_mouse.ui, input/vrq_choice.ui, input/vrq_locator.ui,
+  input/vrq_string.ui, input/vsc_form.ui, input/vsin_mode.ui,
+  input/vsm_choice.ui, input/vsm_string.ui, inquire/inquire.u,
+  inquire/v_getbitmap_info.ui, inquire/vq_color.ui,
+  inquire/vq_devinfo.ui, inquire/vq_ext_devinfo.ui,
+  inquire/vq_extnd.ui, inquire/vq_scrninfo.ui,
+  inquire/vqf_attributes.ui, inquire/vqin_mode.ui,
+  inquire/vql_attributes.ui, inquire/vqm_attributes.ui,
+  inquire/vqt_advance32.ui, inquire/vqt_attributes.ui,
+  inquire/vqt_char_index.ui, inquire/vqt_ext_name.ui,
+  inquire/vqt_extent.ui, inquire/vqt_f_extent.ui,
+  inquire/vqt_fontheader.ui, inquire/vqt_fontinfo.ui,
+  inquire/vqt_get_table.ui, inquire/vqt_name_and_id.ui,
+  inquire/vqt_pairkern.ui, inquire/vqt_real_extent.ui,
+  inquire/vqt_trackkern.ui, inquire/vqt_width.ui,
+  inquire/vqt_xfntinfo.ui, output/output.u, output/v_arc.ui,
+  output/v_bar.ui, output/v_bez.ui, output/v_bez_fill.ui,
+  output/v_circle.ui, output/v_contourfill.ui, output/v_ellarc.ui,
+  output/v_ellipse.ui, output/v_ellpie.ui, output/v_fillarea.ui,
+  output/v_ftext.ui, output/v_ftext_offset.ui, output/v_gtext.ui,
+  output/v_justified.ui, output/v_pieslice.ui, output/v_pline.ui,
+  output/v_pmarker.ui, output/v_rbox.ui, output/v_rfbox.ui,
+  output/vr_recfl.ui, raster/v_get_pixel.ui, raster/vr_trnfm.ui,
+  raster/vro_cpyfm.ui, raster/vrt_cpyfm.ui,
+  structures/color_entry.ui, structures/color_rgb.ui,
+  structures/color_tab.ui, structures/fix31.ui,
+  structures/font_hdr.ui, structures/gcbitmap.ui, structures/mfdb.ui,
+  structures/point16.ui, structures/point32.ui,
+  structures/pxyarray.ui, structures/rect16.ui, structures/rect32.ui,
+  structures/structures.u, structures/xfnt_info.ui:
+
+  A very raw translation
+
+2005-10-19 Wednesday 18:21  Gerhard Stoll
+
+  * magic/magicmac.u:
+
+   Delete info about the ASH-Mailbox
+
+2005-08-30 Tuesday 16:41  Gerhard Stoll
+
+  * bios/sys_vec.u:
+
+  NVDI use TRAP #15, Cubase MROS use TRAP #8
+
+2005-08-23 Tuesday 16:51  Gerhard Stoll
+
+  * protokol/dhst.u:
+
+  English version form Document History Protocol (DHST)
+
+2005-08-06 Saturday 06:40  Gerhard Stoll
+
+  * gem/vdi/control/v_opnbm.ui:
+
+  Change availability
+
+2005-08-06 Saturday 06:39  Gerhard Stoll
+
+  * gem/vdi/inquire/: disable_nvdi.ui, v_read_default_settings.ui,
+  v_write_default_settings.ui:
+
+  Missing Subfunction
+
+2005-08-06 Saturday 06:39  Gerhard Stoll
+
+  * gem/vdi/inquire/vqr_bg_color.ui:
+
+  Wrong subfunction number
+
+2005-08-06 Saturday 06:39  Gerhard Stoll
+
+  * gem/vdi/attribut/uebergeordnete/v_setrgb.ui:
+
+  Wrong opcode
+
+2005-08-04 Thursday 10:16  Gerhard Stoll
+
+  * gem/aes/appl_/appl_getinfo.ui:
+
+  New bits in mode 11 and new mode 97 from XaAES
+
+2005-08-04 Thursday 10:15  Gerhard Stoll
+
+  * gem/aes/appl_/appl_getinfo_str.ui:
+
+  Replace appl_getinfo with appl_getinfo_str
+
+2005-07-18 Monday 08:19  Gerhard Stoll
+
+  * protokol/xacc/: xacc.u, xacc_de.ui, xacc_en.ui:
+
+  XACC protocol; parts of the text from Thomas Much
+
+2005-07-16 Saturday 07:59  Gerhard Stoll
+
+  * bios/cookie.u:
+
+  Hades add to _FDC
+
+2005-07-10 Sunday 15:16  Gerhard Stoll
+
+  * anhang/anhang/: xhdi.u, xhdi/xhdi.u, xhdi/xhdi_de.ui,
+  xhdi/xhdi_en.ui:
+
+  English version
+
+
+

1.3.9 Version 4.93

+
2005-07-03 Sunday 08:35  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/messages.u:
+
+  Messages from WinDom, LDG and Output add
+
+2005-06-04 Saturday 17:47  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/messages.u:
+
+  Messages from MyTask add
+
+2005-06-03 Friday 07:35  Gerhard Stoll
+
+  * gem/aes/evnt_/: evnt_.u, messages/messages.u,
+  messages/rsdaemon.ui:
+
+  GEM-Messageslist from Martin Elsaesser add
+
+2005-06-03 Friday 07:33  Gerhard Stoll
+
+  * anhang/anhang/anhang.u:
+
+  ResourceMaster add to developer tools
+
+2005-06-03 Friday 07:29  Gerhard Stoll
+
+  * gem/aes/wind_/: wind_.u, wind_get.ui, wind_get_set.ui,
+  wind_set.ui, wind_xget.ui, wind_xset.ui:
+
+  Overwork all about wind_get and wind_set, add new modes from XaAES
+
+2005-05-24 Tuesday 21:27  Gerhard Stoll
+
+  * gem/aes/evnt_/: evnt_multi.ui, evnt_timer.ui:
+
+  Do not use with timer vaule 0 with TOS 1.0
+
+2005-05-24 Tuesday 21:27  Gerhard Stoll
+
+  * gem/aes/struktur.ui:
+
+  Better description from APPLRECORD
+
+2005-05-24 Tuesday 21:26  Gerhard Stoll
+
+  * protokol/view.u:
+
+  Some messages defines add
+
+2005-05-24 Tuesday 21:26  Gerhard Stoll
+
+  * protokol/seproto/: seproto.u, seproto_de.ui, seproto_en.ui:
+
+  English version
+
+2005-05-24 Tuesday 21:24  Gerhard Stoll
+
+  * gem/aes/wind_/wind_get.ui:
+
+  WF_NAME also available since MagiC 6
+
+2005-05-24 Tuesday 21:24  Gerhard Stoll
+
+  * gem/aes/menu_/menu_register.ui:
+
+  Mode -1 from the programs A-MAN and MenuBar
+
+2005-05-24 Tuesday 21:24  Gerhard Stoll
+
+  * gem/aes/menu_/menu_bar.ui:
+
+  Mode -2 and -3 from the programs A-MAN and MenuBar
+
+2005-05-24 Tuesday 21:23  Gerhard Stoll
+
+  * gem/aes/appl_/appl_xbvset.ui:
+
+  Function appl_xbvset from GEM/4, GEM/5 and FreeGEM
+
+2005-05-24 Tuesday 21:22  Gerhard Stoll
+
+  * gem/aes/appl_/appl_getinfo.ui:
+
+  Worng type number for XaAES and WINX
+
+2005-05-24 Tuesday 21:22  Gerhard Stoll
+
+  * gem/aes/appl_/appl_find.ui:
+
+  Mode -3 also in XaAES available
+
+2005-05-24 Tuesday 21:22  Gerhard Stoll
+
+  * e_protok.u, tos_hyp.u:
+
+  Add BubbleGEM
+
+2005-05-24 Tuesday 21:22  Gerhard Stoll
+
+  * protokol/BubbleGEM/: bubble.u, bubble_de.ui, bubble_en.ui,
+  img20.img:
+
+  Add BubbleGEM
+  Thanks to Thomas Much and Goetz Hoffart, which allow
+  to use some parts of the original doc.
+
+2005-03-05 Saturday 10:22  Gerhard Stoll
+
+  * bios/cookie.u:
+
+  Wrong description of the _AKP cookie
+
+2005-03-05 Saturday 10:22  Gerhard Stoll
+
+  * magic/xfs.u:
+
+  New elements in MX_KERNEL
+
+2005-03-05 Saturday 10:22  Gerhard Stoll
+
+  * bios/sys_vec.u:
+
+  Trap#3 is used from the Omega-Color-CAD
+
+2005-03-05 Saturday 10:22  Gerhard Stoll
+
+  * xbios/datetime/datetime.ui:
+
+  More info about the NVRAM
+
+2005-03-05 Saturday 10:21  Gerhard Stoll
+
+  * gem/vdi/: inquire/disable_nvdi.ui, inquire/inquire.u,
+  inquire/v_create_driver_info.ui, inquire/v_delete_driver_info.ui,
+  inquire/v_read_default_settings.ui,
+  inquire/v_write_default_settings.ui, vdi_f.u:
+
+  Add Funktion 180, 181 and 182 form NVDI 5.xx (WDialog)
+
+2005-02-20 Sunday 10:27  Gerhard Stoll
+
+  * gem/aes/graf_/graf_xhandle.ui:
+
+  Description from parameter device
+
+2005-02-20 Sunday 10:27  Gerhard Stoll
+
+  * n_aes/n_aes.u:
+
+  XaAES fake 'nAES' cookie
+
+2005-01-30 Sunday 09:39  Gerhard Stoll
+
+  * gem/aes/objc_/objc_.u:
+
+  objc_xedit listen
+
+2005-01-30 Sunday 09:38  Gerhard Stoll
+
+  * magic/magicpc.u:
+
+  Some DLL IDs for MagiC PC DLLs add
+
+2005-01-24 Monday 16:54  Gerhard Stoll
+
+  * gem/aes/appl_/appl_getinfo.ui:
+
+  Worng type number for XaAES
+
+2005-01-24 Monday 16:53  Gerhard Stoll
+
+  * gem/aes/graf_/graf_mouse.ui:
+
+  Add mouse form from N.AES and XaAES
+
+2005-01-02 Sunday 11:29  Gerhard Stoll
+
+  * anhang/typedefs.u, bios/bios.u, gem/aes/aes.u, gem/aes/aes_en.u,
+  gem/aes/aes_f.u, gem/aes/struktur.ui, gem/aes/appl_/appl_.u,
+  gem/aes/appl_/appl_bvset.ui, gem/aes/appl_/appl_find.ui,
+  gem/aes/appl_/appl_init.ui, gem/aes/evnt_/evnt_button.ui,
+  gem/aes/evnt_/evnt_dclick.ui, gem/aes/evnt_/evnt_multi.ui,
+  gem/aes/form_/form_alert.ui, gem/aes/fsel_/fsel_exinput.ui,
+  gem/aes/fsel_/fsel_input.ui, gem/aes/graf_/graf_mouse.ui,
+  gem/aes/graf_/graf_rubberbox.ui, gem/aes/menu_/menu_bar.ui,
+  gem/aes/objc_/objc_draw.ui, gem/aes/objc_/objc_edit.ui,
+  gem/aes/rsrc_/rsrc_gaddr.ui, gem/aes/rsrc_/rsrc_saddr.ui,
+  gem/aes/scrp_/scrp_clear.ui, gem/aes/scrp_/scrp_read.ui,
+  gem/aes/scrp_/scrp_write.ui, gem/aes/wind_/wind_get_set.ui,
+  gem/vdi/vdi_f.u, gem/vdi/escape/graphic/v_xbit_image.ui,
+  gem/vdi/inquire/vq_extnd.ui, gem/vdi/inquire/vqt_name.ui:
+
+  Add some more infos from GEM/3, GEM/4, ViewMAX and FreeGEM
+
+2004-12-31 Friday 14:28  Gerhard Stoll
+
+  * gem/aes/appl_/: appl_.u, appl_getinfo.ui, appl_getinfo_str.ui:
+
+  AES_VERSION
+
+2004-12-31 Friday 14:27  Gerhard Stoll
+
+  * gem/aes/appl_/appl_search.ui:
+
+  APP_TASKINFO, APP_HIDDEN and APP_FOCUS from XaAES
+
+2004-12-31 Friday 14:27  Gerhard Stoll
+
+  * gem/aes/wind_/: wind_.u, wind_get.ui, wind_get_set.ui,
+  wind_set.ui:
+
+  Overview about all subfunction form wind_get/set
+
+2004-12-31 Friday 14:26  Gerhard Stoll
+
+  * gem/aes/struktur.ui:
+
+  Some new links in HNDL_OBJ
+
+2004-12-31 Friday 14:25  Gerhard Stoll
+
+  * anhang/changes/04_93.ui:
+
+  Changelog updated
+
+2004-12-31 Friday 14:25  Gerhard Stoll
+
+  * xbios/xbios.u:
+
+  Errorlist formated
+
+2004-12-31 Friday 14:25  Gerhard Stoll
+
+  * anhang/anhang/tos_vers.u:
+
+  Table formated
+
+2004-12-28 Tuesday 15:12  Gerhard Stoll
+
+  * gem/aes/wind_/wind_create.ui:
+
+  Add BORDER
+
+2004-12-28 Tuesday 15:12  Gerhard Stoll
+
+  * gem/aes/wdlg_/wdlg_close.ui:
+
+  Wrong Syntax, missing parameter X and Y
+
+2004-12-28 Tuesday 15:12  Gerhard Stoll
+
+  * gem/aes/fsel_/fsel_boxinput.ui:
+
+  The GEM-Arrays was wrong
+
+2004-12-28 Tuesday 15:12  Gerhard Stoll
+
+  * xbios/datetime/datetime.ui:
+
+  TOS Bootprferenz is 0x80 and not 0x00
+
+2004-12-28 Tuesday 15:12  Gerhard Stoll
+
+  * xbios/bildscrm/vsetmode.ui:
+
+  mode VM_INQUIRE (-1)
+
+2004-12-19 Sunday 10:52  Gerhard Stoll
+
+  * protokol/gdps.ui, e_protok.u, tos_hyp.u:
+
+  New: GDPS: Gerti's Driver Piping System
+
+2004-12-19 Sunday 10:52  Gerhard Stoll
+
+  * anhang/anhang/tos_vers.u:
+
+  TOS 7.0x
+
+2004-12-19 Sunday 10:52  Gerhard Stoll
+
+  * bios/bios_f.u:
+
+  DOLMEN function
+
+2004-12-19 Sunday 10:52  Gerhard Stoll
+
+  * gemdos/prozess/: prozess.u, ptrace.ui:
+
+  Add function Ptrace
+
+2004-12-19 Sunday 10:52  Gerhard Stoll
+
+  * gemdos/file/freadlin.ui:
+
+  Wrong Binding
+
+2004-12-19 Sunday 10:52  Gerhard Stoll
+
+  * gemdos/gemdos.u:
+
+  GEMDOS errors from FreeMiNT add
+
+2004-12-19 Sunday 10:51  Gerhard Stoll
+
+  * magic/magicpc.u:
+
+  mec1 interface from MagiC PC
+
+2004-12-05 Sunday 14:55  Gerhard Stoll
+
+  * xbios/: struktur.ui, bildscrm/Setscreen_Milan.ui,
+  bildscrm/bildscrm.u, bildscrm/vsetscre.ui:
+
+  Milan Setscreen
+
+2004-12-05 Sunday 14:51  Gerhard Stoll
+
+  * anhang/anhang/tos_vers.u:
+
+  TOS 3.00 add
+
+2004-12-05 Sunday 14:51  Gerhard Stoll
+
+  * xbios/datetime/datetime.ui:
+
+  Info about the size of the NVM from the Milan
+
+2004-12-05 Sunday 14:51  Gerhard Stoll
+
+  * gem/vdi/vdi.u:
+
+  Add the device ID number form 101 to 130
+
+2004-12-05 Sunday 14:50  Gerhard Stoll
+
+  * gem/aes/appl_/: appl_control.ui, appl_find.ui, appl_getinfo.ui:
+
+  Small translation
+
+2004-11-22 Monday 17:58  Gerhard Stoll
+
+  * gem/vdi/vdi.u:
+
+  Add fVDI at vq_vgdos
+
+2004-11-15 Monday 19:24  Gerhard Stoll
+
+  * linea/linea.u:
+
+  Remove the label Line-A, because it was twice
+
+2004-11-15 Monday 19:23  Gerhard Stoll
+
+  * gemdos/memory/mxalloc.ui:
+
+  Change bit3 to reserved
+
+2004-11-09 Tuesday 16:59  Gerhard Stoll
+
+  * gem/aes/fslx_/use.ui, gem/aes/pdlg_/pdlg_.u,
+  xbios/bildscrm/setscree.ui, xbios/ct60/rd_param.ui,
+  xbios/datetime/datetime.ui, xbios/pci_bios/fpclassc.ui:
+
+  Some small translation
+
+2004-11-09 Tuesday 16:55  Gerhard Stoll
+
+  * gem/aes/wind_/: wind_.u, wind_get.ui, wind_get_set.ui,
+  wind_set.ui:
+
+  Overview from the wind_get and wind_set mode
+
+2004-11-09 Tuesday 16:55  Gerhard Stoll
+
+  * gem/aes/evnt_/evnt_keybd.ui:
+
+  Link to ASCII- and scancode
+
+2004-11-09 Tuesday 16:55  Gerhard Stoll
+
+  * emulator.en/sonstige.u:
+
+  New parameter from Steem v3.2 add
+
+2004-10-22 Friday 16:53  Gerhard Stoll
+
+  * doc/tos_hyp.upl:
+
+  Description for upload
+
+2004-10-22 Friday 16:48  Gerhard Stoll
+
+  * xbios/xbios_f.u:
+
+  Add PCI-BIOS function name and VideoCtrl from MilanTOS
+
+2004-10-15 Friday 16:47  Gerhard Stoll
+
+  * gemdos/datetime/tsetitim.ui:
+
+  Parameter which is int16_t and not int32_t
+
+2004-10-15 Friday 16:46  Gerhard Stoll
+
+  * gemdos/datetime/tsetdate.ui:
+
+  Return value is a int16_t and not uint32_t
+
+2004-10-02 Saturday 13:19  Gerhard Stoll
+
+  * gem/aes/: struktur.ui, evnt_/evnts.ui,
+    fnts_/...,
+    lbox_/lbox_delete.ui:
+
+  A raw translation of some parts
+
+2004-10-02 Saturday 13:18  Gerhard Stoll
+
+  * anhang/typedefs.u:
+
+  Change typdef
+
+2004-10-02 Saturday 13:18  Gerhard Stoll
+
+  * gem/aes/graf_/: graf_.u, graf_handle.ui, graf_xhandle.ui:
+
+  graf_xhandle was missed in the overview
+
+2004-09-26 Sunday 08:56  Gerhard Stoll
+
+  * gem/aes/edit_/...
+    gem/aes/lbox_/...
+    gem/aes/rsrc_/sys_recalc_cicon_colours.ui,
+    gem/aes/wind_/wind_get.ui, gem/vdi/vdi.u, gemdos/gemdos_f.u,
+    xbios/spezial/cachectr.ui:
+
+  A raw translation of some parts
+
+2004-09-26 Sunday 08:53  Gerhard Stoll
+
+  * xbios/ct60/rd_param.ui:
+
+  New 'type_param' add
+
+2004-09-22 Wednesday 07:38  Gerhard Stoll
+
+  * gem/aes/: appl_/appl_getinfo.ui, evnt_/evnts.ui,
+  wind_/wind_calc.ui, wind_/wind_get.ui, wind_/wind_set.ui:
+
+  Add WINX informations
+
+2004-09-22 Wednesday 07:38  Gerhard Stoll
+
+  * gem/aes/appl_/appl_find.ui:
+
+  Add defined names
+
+2004-09-22 Wednesday 07:37  Gerhard Stoll
+
+  * gem/aes/: aes.u, aes_en.u:
+
+  Add links
+
+2004-09-22 Wednesday 07:37  Gerhard Stoll
+
+  * gem/vdi/vdi_f.u:
+
+  Add function from the SpeedoGDOS driver from Thierry Rodolfo
+
+2004-09-22 Wednesday 07:36  Gerhard Stoll
+
+  * xbios/spezial/cjar.ui:
+
+  new link
+
+2004-09-22 Wednesday 07:36  Gerhard Stoll
+
+  * xbios/spezial/puntaes.ui:
+
+  infos about the MagiC subfunction
+
+2004-09-22 Wednesday 07:36  Gerhard Stoll
+
+  * xbios/xbios.u:
+
+  forget to include the drucker.u
+
+2004-09-22 Wednesday 07:36  Gerhard Stoll
+
+  * bios/cookie.u:
+
+  _FDC: Add >Mac<
+
+
+

1.3.10 Version 4.92

+
The tos.hyp goes CVS.
+
+2004-08-31 Tuesday 16:00  Gerhard Stoll
+
+  * n_aes/n_aes.u:
+
+  add a ~ in the formula
+
+2004-08-31 Tuesday 16:00  Gerhard Stoll
+
+  * gem/vdi/: colortable/v_color2nearest.ui,
+  colortable/v_ctab_idx2value.ui, colortable/vq_dflt_ctab.ui,
+  control/v_pat_rotate.ui:
+
+  correct the binding
+
+2004-08-31 Tuesday 15:59  Gerhard Stoll
+
+  * bios/cookie.u:
+
+  Cookie _FPU: add 68060
+
+2004-08-07 Saturday 17:29  Gerhard Stoll
+
+  * tos_hyp.u, bios/cookie.u, gem/aes/aes.u, gem/aes/aes_f.u,
+  gem/aes/toolbar.ui, gem/aes/appl_/appl_getinfo.ui,
+  gem/aes/appl_/appl_yield.ui, gem/aes/evnt_/evnt_.u,
+  gem/aes/evnt_/evnt_multi.ui, gem/aes/evnt_/evnts.ui,
+  gem/aes/form_/form_alert.ui, gem/aes/wind_/wind_create.ui,
+  gem/aes/wind_/wind_get.ui, gem/aes/wind_/wind_set.ui,
+  xaaes/xaaes.u:
+
+  Added info about XaAES
+
+2004-07-31 Saturday 09:09  Gerhard Stoll
+
+  * gem/vdi/inquire/vqt_get_table.ui:
+
+  Add mapping tables
+
+2004-07-31 Saturday 09:07  Gerhard Stoll
+
+  * xbios/struktur.ui:
+
+  KEYTAB: undocumented tables add
+
+2004-07-29 Thursday 19:58  Gerhard Stoll
+
+  * bios/cookie.u:
+
+  Cookie: _FDC: Milan add
+
+2004-07-17 Saturday 16:52  Gerhard Stoll
+
+  * bios/cookie.u:
+
+  Cookie _MCH: Medusa T40 add
+
+2004-06-25 Friday 17:29  Gerhard Stoll
+
+  * gem/aes/: appl_/appl_init.ui, fsel_/fsel_boxinput.ui,
+  fsel_/fsel_exinput.ui, menu_/menu_bar.ui, pdlg_/pdlg_do.ui,
+  pdlg_/pdlg_open.ui, wind_/wind_draw.ui:
+
+  Small text correcting
+
+2004-06-25 Friday 17:29  Gerhard Stoll
+
+  * gem/aes/form_/: form_wbutton.ui, form_wkeybd.ui:
+
+  Add availability
+
+2004-06-25 Friday 17:27  Gerhard Stoll
+
+  * gem/vdi/attribut/uebergeordnete/vs_bkcolor.ui:
+
+  Comments in GEM-Array wrong
+
+2004-06-25 Friday 17:27  Gerhard Stoll
+
+  * gem/vdi/attribut/marker/vsm_bg_color.ui:
+
+  Wrong group
+
+2004-06-25 Friday 17:26  Gerhard Stoll
+
+  * gem/aes/objc_/: objc_edit.ui, objc_xedit.ui:
+
+  Chance availability
+
+2004-06-25 Friday 17:26  Gerhard Stoll
+
+  * gem/aes/form_/xfrm_popup.ui:
+
+  Add Return-Value in Binding
+
+2004-05-13 Thursday 19:04  Gerhard Stoll
+
+  * gem/vdi/escape.u:
+
+  Binding fuer vqp_error geschrieben
+
+2004-05-10 Monday 19:36  Gerhard Stoll
+
+  * linea/: bitblt.ui, drsprite.ui, fillpoly.ui, fillrect.ui,
+  getpixel.ui, hdmouse.ui, hline.ui, init.ui, line.ui, putpixel.ui,
+  seedfill.ui, shmouse.ui, textblt.ui, trmouse.ui, udrsprit.ui:
+
+  Im Assemblerteil Lina-A Opcode durch Line-A Opcode ersetzt
+
+2004-05-10 Monday 19:36  Gerhard Stoll
+
+  * linea/cpraster.ui:
+
+  Im deutschen Binding stand linea_init. Im Assemblerteil Lina-A Opcode
+  durch Line-A Opcode ersetzt
+
+2004-05-10 Monday 19:36  Gerhard Stoll
+
+  * linea/linea.u:
+
+  Strukture LINEA um Kommentare ergaenzt. Alle Strukturen etwas formatiert
+
+2004-05-10 Monday 19:36  Gerhard Stoll
+
+  * tos_hyp.u:
+
+  Korrekte Schreibweise von Line-A
+
+2004-05-10 Monday 19:35  Gerhard Stoll
+
+  * gem/vdi/eingabe.u:
+
+  Verfügbarkeit eingetragen, Datentypen angepasst. Beim Binding von
+  vex_wheelv den korrekten Funktionsnamen eingetragen
+
+2004-05-08 Saturday 19:51  Gerhard Stoll
+
+  * gem/vdi/: ausgabe.u, auskunft.u:
+
+  Datentypen angepasst
+
+2004-05-08 Saturday 19:51  Gerhard Stoll
+
+  * gem/vdi/attribut.u:
+
+  Statt des Bindings steht nun die Deklaration auf der Beschreibungsseite
+
+2004-05-07 Friday 16:36  Gerhard Stoll
+
+  * gem/vdi/attribut.u:
+
+  Verfuegabekeit und Datentypen geaendert
+
+2004-05-05 Wednesday 18:32  Gerhard Stoll
+
+  * xbios/drucker/prtblk.ui:
+
+  Statt Prtblk stand nur c bei begin_node
+
+2004-05-05 Wednesday 18:32  Gerhard Stoll
+
+  * tos_hyp.u:
+
+  Linea eingefuegt
+
+2004-05-05 Wednesday 18:31  Gerhard Stoll
+
+  * anhang/anhang/tos_vers.u:
+
+  Der Befehl end_node war nicht vorhanden
+
+2004-05-04 Tuesday 20:31  Gerhard Stoll
+
+  * magic/magic.u:
+
+  Fuer die Links in den Zeilen 1176 und 11617 haben sich die Ueberschriften
+  geaendert
+
+2004-05-04 Tuesday 20:30  Gerhard Stoll
+
+  * xbios/xbios.u:
+
+  Fuer die Links in den Zeilen 1210 und 1211 haben sich die Ueberschriften
+  geaendert
+
+2004-05-04 Tuesday 20:30  Gerhard Stoll
+
+  * bios/bios.u:
+
+  Versuchte die Datei bios_strukt.u statt bios_str.u zu oeffnen
+
+2004-05-04 Tuesday 19:51  Gerhard Stoll
+
+  * anhang/anhang/tos_vers.u:
+
+  TOS 1.60 nach 1.06 genaendert und TOS 1.62 hinzugefuegt
+
+2004-05-04 Tuesday 19:49  Gerhard Stoll
+
+  * anhang/typedefs.u:
+
+  end_node bei OSHEADER an falscher Stelle.
+
+2004-05-04 Tuesday 19:46  Gerhard Stoll
+
+  * bios/function/rwabs.u:
+
+  Titel kam nicht in den Index
+
+2004-05-04 Tuesday 19:46  Gerhard Stoll
+
+  * bios/cookie.u:
+
+  Quellenangabe bei _FPU
+
+2004-05-04 Tuesday 19:20  Gerhard Stoll
+
+  * bilder/: farbe/disk.img, farbe/info.img, mono/disk.img,
+  mono/info.img:
+
+  config.u   - Die zusätzlichen Sprachen gelöscht, da es nur deutsch und
+               englisch gibt.
+  tos_hyp.u  - Neuse Kapitel Emulatoren eingefügt.
+  cpxdoku.u  - Darstellung der Auflistung der Funktionen verbessert.
+  vdi.u      - Hinweis auf einen möglichen Absturz von ABC-GEM.
+               Bei Assmblerquelltext von vq_vgdos stand die falsche
+               Bezeichnung.
+               Einige Rückgabewerte von vq_vgdos ergänzt.
+  metafile.u - DIN-A3 und ähnliche heißen jetzt DIN A3.
+  attribut.u - Bei (!begin_liste) [Beschreibung:] den Doppelpunkt gelöscht.
+               !item [Verfügbarkeit] eingefügt und entsprechend eingtragen.
+
+  Bei allen restlichen Dateien des VDIs:
+               Bei (!begin_liste) [Beschreibung:] den Doppelpunkt gelöscht.
+               !item [Verfügbarkeit] eingefügt.
+
+  aes.u      - Reihenfolge der Nodes geändert. Die Funktionen kommen nun
+               zum Schluß.
+  appl_.u    - Bei (!begin_liste) [Beschreibung:] den Doppelpunkt gelöscht.
+               Appl_getinfo 13: Wert um objc_sysvar erweitert.
+  wind_.u    - wind_create: wi_crkind um MENUBAR von XaAES ergänzt.
+               wind_set: Beschränkung von WF_INFO und WF_NAME
+  form_.u    - form_alert: Icon Info und Diskettesymbol von AES 4.10
+  aes_f.u    - Opcodenummer bei den fsel_ Funktionen korrigiert.
+               Funktionen von XaAES und Geneva nachgetragen.
+  aes/struktur.ui - Tedinfo: te_pvalid Beschreibung verbessert und neuer
+                    Typ ergänzt.
+  style.u    - Ein Label von einem " befreit.
+  tosmain.u  - Neuer Querverweis beim Node "Das Betriebssystem TOS".
+
+  magic/dfs.u   - Bei (!begin_liste) [Beschreibung:] den Doppelpunkt ge-
+                  löscht.
+  magic/xfs.u   - Bei (!begin_liste) [Beschreibung:] den Doppelpunkt ge-
+                  löscht.
+  magic/magic.u - Teile heraus genommen.
+                  Ein Label von einem " befreit.
+  magic/magicmac.u - Supervisor-Modus anstatt Supervisormodus.
+  magic/sharelib.u - Minimale Übersetzungen ins englische.
+  magic/magicerr.u - Übersetzt ins englische.
+  n_aes/n_aes.u    - ~ ein ! vorrangestellt, dass es angezeigt wird.
+  bios.u           - Die einzelnen Funktionen aus dem Text gelöst.
+  cookie.u         - Niederlande heißt jetzt Holland.
+                     _MCH: ARAnyM ergänzt
+  sys_var.u        - Nummerisch sortierte Liste
+  sys_vec.u        - Hinweis auf SuperCharger (Trap #4), Wind-XES (Trap #5)
+                     und TapeBIOS (Trap #10)
+  bios_str.u       - Struktur BPB und PUN_INFO hierher kopiert. Letztere um
+                     einige Erklärung erweitert.
+  bios_f.u         - Ein paar Ergänzungen.
+  typedef.u        - Einige Strukturen sind gewandert.
+  neu.u            - Version 4.92 angefangen
+  anhang.u         - Scancode um Milan Alt Gr erweitert.
+  pmmu.u           - Bei (!begin_liste) [Beschreibung:] den Doppelpunkt
+                     gelöscht.
+  xhdi.u           - Bei (!begin_liste) [Beschreibung:] den Doppelpunkt
+                     gelöscht.
+  tos_vers.u       - Einige TOS Versionen ergänzt.
+  gemdos.u         - Neue Struktur erstellt.
+  signale.u        - Querverweise an neue Überschriften angepasst.
+  gemdos/struktur.u- Ein Struktieren sind hierher gekommen.
+                     Erläuterung zum rekursiven Bearbeiten von Directories.
+  tekbios.u        - Erweitert für englische Übersetzung
+  olga.u           - Hinweis auf das Archiv gelöscht, Maus KA gibt es nicht
+                     mehr.
+                     Bei (!begin_liste) [Beschreibung:] den Doppelpunkt
+                     gelöscht.
+
+  Neuer Ordner bios/function mit den einzelnen Funktionen.
+
+  Neuer Ordner emulator.en angelegt mit den Dateien sonstige.u, stem.u,
+  tos2win.u. disk.img und info.img in Bilder/Farbe und Bilder/mono abgelegt.
+
+2004-04-15 Thursday 20:32  Michael Bernstein
+
+  * .cvsignore, Makefile, config.u, e_linea.u, linea/bitblt.ui,
+  linea/cpraster.ui, linea/drsprite.ui, linea/fillpoly.ui,
+  linea/fillrect.ui, linea/getpixel.ui, linea/hdmouse.ui,
+  linea/hline.ui, linea/init.ui, linea/line.ui, linea/linea.u,
+  linea/putpixel.ui, linea/seedfill.ui, linea/shmouse.ui,
+  linea/textblt.ui, linea/trmouse.ui, linea/udrsprit.ui:
+
+  Beschreibung von Lina-A mit Makefile hinzugefuegt
+
+
    +
  • Von den Systemvariablen gibt nun auch eine Liste welche nach +Adressen sortiert ist. +
  • +
  • Beschreibung der XBIOS-Funktionen: +
    Janus +
  • +
  • Grobe Beschreibung der CENTScreen-XBIOS-Funktionen +
  • +
  • Dcntl Kommandos von MagiC 6 ergänzt. +
  • +
  • BPB->bflags um Bit 1 ergänzt. +
  • +
  • In der AES Funktionsliste Opcode für fsel_input und fsel_exinput +korrigiert. +
  • +
  • appl_getinfo: Rückgabe zu objc_sysvar erweitert. +
  • +
  • Rückgabe Parameter von tsettime von ULONG in WORD verändert. +
  • +
  • Einige Textstellen korrigiert. +
  • +
+ +

1.3.11 Version 4.91

+ + +

1.3.12 Version 4.90

+
    +
  • Der komplette Quelltext wurde ins UDO-Format konvertiert. +Dadurch fehlen jetzt zum Teil interne und externe Verweise, werden +aber mit der Zeit wieder vervollständigt. +
    Ein Teil der Doku ist in englisch. Nach dem Motto, besser +Überhaupt eine Doku als nichts. +
  • +
  • XBIOS Funktion WavePlay +
  • +
  • Beschreibung der Shared Libraries +
  • +
  • Bugfix bei soundcmd +
  • +
  • Meta-DOS durch MetaDOS ersetzt. +
  • +
  • Funktionsliste des AES und VDI-Routinen eingebaut. +
  • +
  • Bei den Funktionslisten wurden alle Funktionen aufgeführt die +ich gefunden habe. Auch solche die nur zu bestimmten Treibern oder +Programmen gehören. +
  • +
  • Unterstützung des DHST-Protokolls. +
  • +
  • Unterstützung des VIEW-Protokolls. +
  • +
  • Unterstützung des XSSI-Protokolls. +
  • +
  • Sversion um MilanTOS erweitern +
  • +
  • XBIOS-Routinen des Milans beschrieben. +
  • +
  • Cookie _VDO, _MCH und _SND um Milan erweitert +
  • +
  • objc_xedit aus MagiC (Parameter 103) +
  • +
  • N.AES Funktionen +
  • +
  • Zwei Funktionen des noch nicht vorhandenen PCI-BIOS 2.00 ;-) +
  • +
  • AV_SENDKEY um CodeAlpha Erweiterung ergänzt +
  • +
  • Neue Message AV_SENDCLICK +
  • +
  • Einige MiNT Funktionen ergänzt +
  • +
  • Alle NVDI 5.0x Erweiterungen beschrieben. +
  • +
  • Ffchown, Ffchmod, Dchroot +
  • +
  • MagiC PC Programmierschnittstelle +
  • +
  • Beschreibung der Crazy-Dots-XBIOS-Erweiterungen (Dank an +Johann-Wilhelm Arndt) +
  • +
  • Beschreibung der StarTrack-XBIOS-Erweiterungen +
  • +
  • XHDI-Spezifikation überarbeitet (1.30) +
  • +
+ +

1.3.13 Version 4.80 - 0.40

+

Version 4.80 +

+
    +
  • Unterstützung der neuen AES-Funktionen von MagiC 5.10 +sowie der scrollenden Eingabefelder. +
  • +
  • Beschreibungen der GEMDOS-Funktionen an den aktuellen +MagiC-Stand angepaßt. +
  • +
  • diverse Bug-Fixes. +
  • +
  • Index geringfügig erweitert. +
  • +
  • Seiten teilweise überarbeitet. +
  • +
+ +

Version 4.70 +

+
    +
  • Unterstützung der AES-Druckdialoge. +
  • +
  • Bugfix bzw. Ergänzung bei AP_TERM. +
  • +
  • Bugfix bei Mxalloc (Dank an Thomas Much und Daniel Höpfl). +
  • +
  • Seiten teilweise überarbeitet. +
  • +
+ +

Version 4.65 +

+
    +
  • Erweiterung des AV-Protokolls und von SC_CHANGED. (Dank an Norbert +Hanz und Thomas Much). +
  • +
  • kleinere Bugfixes. +
  • +
  • Seiten teiweise überarbeitet. +
  • +
+ +

Version 4.60 +

+
    +
  • Unterstützung von NVDI (bis Version 4.1) +
  • +
  • Unterstützung von COPS. +
  • +
  • diverse Bugfixes. +
  • +
  • Index geringfügig überarbeitet. +
  • +
  • Seiten teilweise überarbeitet. +
  • +
+ +

Version 4.50 +

+
    +
  • dies ist die erste Version des Hypertextes, die nicht auf einem +Atari, sondern auf einem Apple Power-Macintosh entwickelt wurde. +
  • +
  • Unterstützung von MagiC 5 +
  • +
  • die Syntax der Pexec-Modi 101,102 und 107 wird auf Wunsch von +Andreas Kromke nicht mehr angegeben. +
  • +
  • kleinere Bugfixes. +
  • +
  • Seiten teilweise überarbeitet. +
  • +
+ +

Version 4.35 +

+
    +
  • Beschreibung der Objekttypen G_SWBUTTON und G_POPUP. +
  • +
  • Vergleich der Speicherverwaltungs-Mechanismen von TOS und +MagiC. +
  • +
  • Informationen zu den work_in/work_out-Arrays bei vq_extnd und +v_opnwk von PC-GEM/3. +
  • +
  • Bugfix bei Pexec (Dank an Andreas Kromke). +
  • +
  • Unterstützung weiterer Datentypen bzw. Strukturen. +
  • +
  • kleinere Bugfixes. +
  • +
  • Update der Links auf externe Hypertexte. +
  • +
  • detailliertere Informationen zur XATTR-Struktur. +
  • +
  • Beschreibung der VDI-Funktion vs_color2. +
  • +
  • Index geringfügig überarbeitet. +
  • +
  • Seiten teilweise überarbeitet. +
  • +
+ +

Version 4.30 +

+
    +
  • Beschreibung des OUT-Dateiformats von PC-GEM. +
  • +
  • Angabe weiterer Details bzw. Unterschiede zu PC-GEM. +
  • +
  • Unterstützung des OLGA-Protokolls. +
  • +
  • ShutDown in MagiC Mac überarbeitet. (Dank an Thomas +Tempelmann) +
  • +
  • Bugfix bei scrp_read. +
  • +
  • Seiten teilweise überarbeitet. +
  • +
+ +

Version 4.20 +

+
    +
  • Übersicht der möglichen Kombinationen von Fülltyp und +Musterindex eingefügt (vgl. Fülltyp-Attribute. +
  • +
  • neue Grafiken eingefügt (Dank an Sven Dreier). +
  • +
  • Beschreibung der Nachricht FNT_CHANGED. +
  • +
  • Bugfix in den VDI-Bindings. +
  • +
  • Bugfix in der MN_SET-Struktur, sowie beim Drag&Drop-Protokoll (Dank an +Thomas Much). +
  • +
  • Bugfix bei Dgetcwd. +
  • +
  • Tabelle der ASCII-Codes eingefügt. +
  • +
  • Tabelle der Scan-Codes eingefügt. +
  • +
  • grafische Übersicht geändert. +
  • +
  • neue Querverweise (Links) eingebaut. +
  • +
  • Update der Links auf externe Hypertexte, sowie Angabe einer +entsprechenden Liste. +
  • +
  • Angabe der Standard-RGB-Werte für die ersten 16 Objektfarben. +
  • +
  • Funktionsliste der GEMDOS, BIOS und XBIOS-Routinen +eingebaut. +
  • +
  • Hypertext besser strukturiert. +
  • +
  • Index geringfügig überarbeitet. +
  • +
  • sehr viele (!) Seiten überarbeitet. +
  • +
+ +

Version 4.10 +

+
    +
  • Hypertext bzgl. MagiC 4 nochmals stark überarbeitet +
  • +
  • Beschreibung der MX_DOSLIMITS-Struktur, sowie Anpassung des +Dcntl-Opcodes KER_DOSLIMITS. +
  • +
  • Querverweise auf den Hypertext XFSL.HYP eingefügt, welcher die +xFSL-Schnittstelle beschreibt. +
  • +
  • Bugfix in den AES-Bindings +
  • +
  • Seiten teilweise überarbeitet +
  • +
+ +

Version 4.01 +

+
    +
  • das Font-Protokoll wird nicht mehr länger unterstützt, da +Font-Selektoren mittlerweile ein Teil des Betriebssystems sind. +
  • +
  • Seiten teilweise überarbeitet +
  • +
+ +

Version 4.00 +

+
    +
  • Unterstützung von MagiC 4 +
  • +
  • Beschreibung der VDI-Routinen v_orient, v_tray und v_copies +(Dank an Ulrich Roßgoderer) +
  • +
  • Seiten teilweise überarbeitet +
  • +
+ +

Version 3.75 +

+
    +
  • Bugfix in den VDI-Bindings +
  • +
  • einige Funktionen von PC-GEM/3 berücksichtigt +
  • +
  • Beschreibung der AES-Message PRN_CHANGED +
  • +
  • Liste der Metafile Sub-Opcodes überarbeitet +
  • +
  • Seiten teilweise überarbeitet +
  • +
+ +

Version 3.70 +

+
    +
  • da die Spendenmoral mehr als dürftig ist, und ich es mir auf +Dauer nicht leisten kann mehrere MByte Daten kostenlos in der Mailbox +abzulegen, muss das Experiment Fairware als gescheitert angesehen +werden. +
  • +
  • Bugfix bei Frename (Dank an Winfried Salomon) +
  • +
  • Bugfix bei Fopen und in den VT-52-Sequenzen (Dank an Jan +Starzynski) +
  • +
  • Bugfix bei evnt_button (Dank an Thomas Baade) +
  • +
  • Bugfix beim FSMC-Cookie (Dank an Dirk Haun) +
  • +
  • Bugfix in den VDI-Bindings +
  • +
  • Beschreibung der Dcntl-Modi von MagiC +
  • +
  • Beschreibung des DFS-Konzeptes in MagiC (Teil-1) +
  • +
  • Beschreibung des PMMU-Cookies/Funktionshandlers +
  • +
  • aktuelle Beschreibung von MagiC Mac-Spezifika (Dank an Thomas Tempelmann) +
  • +
  • Liste der GEMDOS-Fehlermeldungen überarbeitet +
  • +
  • Liste der Cookies überarbeitet +
  • +
  • einige Links/XREF's optimiert +
  • +
  • viele Seiten überarbeitet +
  • +
+ +

Version 3.60 +

+
    +
  • Bugfix bei Flopver (Dank an Markus Kohm) +
  • +
  • Bugfix bei shel_write (Dank an Christian Felsch) +
  • +
  • Bugfix bei Mshrink (Dank an Jan Starzynski) +
  • +
  • Bugfix bei Dopendir (Dank an Jörg Hahne) +
  • +
  • Bugfix in der KBDVBASE-Struktur (Dank an Christoph Zwerschke) +
  • +
  • Bugfixes im Zusammenhang mit dem @xref-Kommando (die 'Typdefinitionen' +heißen jetzt auch wieder so) +
  • +
  • Beschreibung des Toolbar-Supports von AES 4.1 (Dank an +Ulrich Rossgoderer) +
  • +
  • Beschreibung der OverScan-XBIOS-Erweiterungen (Dank an Patrick Jerchel) +
  • +
  • Liste der Cookies überarbeitet +
  • +
  • Beschreibung des XFS-Konzeptes in MagiC (Teil-1) +
  • +
  • allgemeines zu Vektorschriften, Kerning, usw. +
  • +
  • Index geringfügig überarbeitet +
  • +
  • viele Seiten optisch und inhaltlich überarbeitet +
  • +
+ +

Version 3.50 +

+
    +
  • der Hypertext wurde intern darauf vorbereitet, wahl- weise (und +schnell) eine Version mit Monochrom- oder Farbbildern erzeugen zu +können +
  • +
  • es gibt nun eine spezielle MagiC-Seite, die einen leichten +Zugriff auf die MagiC-Specials ermöglicht +
  • +
  • XHDI-Spezifikation überarbeitet +
  • +
  • Unterstützung des @xref-Kommandos vervollständigt +
  • +
  • Seiten teilweise überarbeitet +
  • +
+ +

Version 3.10 +

+
    +
  • der Hypertext besitzt ab sofort einen neuen Autor, und der +Status wurde von Freeware auf Fairware geändert +
  • +
  • Beschreibung der AES-Message SM_M_SPECIAL, sowie Bugfix bei vq_extnd +(Dank an Thomas Baade und Dimitri Junker) +
  • +
  • Liste der Systemvariablen überarbeitet +
  • +
  • GEMDOS-Funktion Cconrs überarbeitet +
  • +
  • AES-Funktion objc_sysvar überarbeitet +
  • +
  • weitere Informationen zum MagX-Cookie +
  • +
  • Eingabefelder in MagiC +
  • +
  • AV-Protokoll überarbeitet +
  • +
  • Informationen zum Smart-Redraw in MagiC +
  • +
  • neue Informationen zum Iconifying in MagiC +
  • +
  • Informationen über die MagiC-Zusatzprogramme +
  • +
  • Beschreibung der GEMDOS-Funktion Srealloc +
  • +
  • Beschreibung der GEMDOS-Funktion Tsetitimer +
  • +
  • GEMDOS-Funktionen Fchmod, Psignal und Psigaction überarbeitet +
  • +
  • einige Seiten unterstützen bereits das neue @xref-Kommando, so +z.B. das AES- und BIOS-Kapitel +
  • +
  • Bugfixes in den AES-Bindings +
  • +
  • viele Seiten überarbeitet +
  • +
+ +

Version 3.00 +

+
    +
  • Beschreibung grundlegender AES-Konzepte +
  • +
  • Beschreibung grundlegender VDI-Konzepte +
  • +
  • Hypertext besser strukturiert +
  • +
  • viele Seiten überarbeitet +
  • +
+ +

Version 2.60 +

+
    +
  • Aufruf der VDI-Funktionen in Assembler beschrieben +
  • +
  • Allgemeines zum Datenaustausch per Klemmbrett +
  • +
  • Allgemeine Informationen über die AES-Bibliotheken +
  • +
  • Weitere Informationen zu den GEMDOS, BIOS und XBIOS Bindings +
  • +
  • Bugfixes in den AES-Bindings +
  • +
  • Seiten teilweise überarbeitet +
  • +
+ +

Version 2.40 +

+
    +
  • Aufruf der AES-Funktionen in Assembler beschrieben +
  • +
  • Liste der Entwicklungssysteme überarbeitet +
  • +
  • Seiten teilweise überarbeitet +
  • +
+ +

Version 2.30 +

+
    +
  • BIOS Funktion Rwabs erweitert (Dank an Erik Dick) +
  • +
  • Beschreibung der AES-Funktionen menu_attach und menu_istart +
  • +
  • Objektarten und Objektflags erweitert +
  • +
  • Informationen zum Analysieren einer Metadatei +
  • +
  • Aufruf der GEMDOS, BIOS und XBIOS-Funktionen in Assembler +beschrieben +
  • +
  • Angabe der verwendeten Quellen +
  • +
  • Liste der einschlägigen Literatur, sowie der bekannten Entwicklungssysteme +hinzugefügt +
  • +
  • viele Seiten überarbeitet +
  • +
+ +

Version 2.10 +

+
    +
  • Flock nochmals überarbeitet +
  • +
  • Beschreibung des Metafile-Formats, sowie der entsprechenden +Sub-Opcodes +
  • +
  • Querverweise auf die Hypertexte grafform.hyp und aip.hyp +eingefügt, welche Informationen über verschiedene Grafikformate bzw. +Programme zur Verfügung stellen +
  • +
  • Seiten teilweise überarbeitet +
  • +
+ +

Version 2.00 +

+
    +
  • wind_set (WF_DCOLOR) überarbeitet +
  • +
  • Objektstatus DRAW3D überarbeitet +
  • +
  • Bugfix beim Objektflag FL3DACT, sowie bei Flock (Dank an Thomas +Baade und Rolf Kotzian) +
  • +
  • Beschreibung der Nachricht WM_TOOLBAR +
  • +
  • Beschreibung der Programmflags +
  • +
  • Radikale Umstrukturierung des Hypertextes für HypTree +
  • +
  • Seiten teilweise überarbeitet +
  • +
+ +

Version 1.95 +

+
    +
  • Bugfixes bei den Trap-Nummern von (X)BIOS +
  • +
  • Funktionsnummern der Falcon-XBIOS-Routinen hinzugefügt (Dank +an Ben-Jamin Wilke) +
  • +
  • Beschreibung des Shutdown in MagiC Mac +
  • +
  • Beschreibung des ARGV-Verfahrens in MagiC +
  • +
  • Beschreibung des MagiC-spezifischen 3D-Looks +
  • +
  • Beschreibung der MAGX.INF Datei von MagiC +
  • +
  • Beschreibung der GEMDOS-Funktion Sconfig +
  • +
  • weitere GEMDOS-Specials von MagiC +
  • +
  • Beschreibung der AES-Funktion menu_popup +
  • +
  • Beschreibung der AES-Funktion menu_settings +
  • +
  • AES bzgl. MagiC 3 überarbeitet +
  • +
  • Unterstützung des Font-Protokolls +
  • +
  • Seiten teilweise überarbeitet +
  • +
+ +

Version 1.80 +

+
    +
  • GEMDOS bzgl. MagiC3 überarbeitet +
  • +
  • Seiten teilweise überarbeitet +
  • +
+ +

Version 1.70 +

+
    +
  • Beschreibung des AES Bindings +
  • +
  • Beschreibung des VDI Bindings +
  • +
  • Beschreibung des Mindestfunktionsumfangs für die verschiedenen +GDOS-Gerätetreiber +
  • +
  • MagiC Mac Spezifika +
  • +
  • Beschreibung des Laufwerks U: in MagiC +
  • +
  • Beschreibung des Hintergrund-DMA in MagiC +
  • +
  • neue Tips zum Iconifying +
  • +
  • Unterstützung weiterer Datentypen/Strukturen +
  • +
  • Seiten teilweise überarbeitet +
  • +
+ +

Version 1.50 +

+
    +
  • Unterstützung von NVDI (bis Version 3.02) +
  • +
  • neuer Modus für objc_sysvar +
  • +
  • neue Modi für Fopen +
  • +
  • TEDINFO vervollständigt +
  • +
  • Fehlermeldungen (GEMDOS) überarbeitet +
  • +
  • Seiten teilweise überarbeitet +
  • +
+ +

Version 1.30 +

+
    +
  • Beschreibung von XControl (Teil-2) +
  • +
  • Objekttypen überarbeitet +
  • +
  • Mxalloc überarbeitet +
  • +
  • Beschreibung der Systemvektoren +
  • +
  • Beschreibung der xgrf-Funktionen +
  • +
  • Hypertext besser strukturiert +
  • +
  • Seiten teilweise überarbeitet +
  • +
+ +

Version 1.20 +

+
    +
  • Beschreibung des XIMG-Formats +
  • +
  • Erste Seiten an MagiC 3 angepaßt +
  • +
  • Funktionsnummern der AES- und VDI-Routinen hinzugefügt. +
  • +
  • Hinweise zur Unterstützung fremder Dateisysteme (Teil-1) +
  • +
  • Beschreibung von XControl +
  • +
  • Index überarbeitet +
  • +
  • viele Seiten nochmals überarbeitet +
  • +
+ +

Version 1.10 +

+
    +
  • Liste der System-Cookies überarbeitet +
  • +
  • Beschreibung des VSCR-Protokolls +
  • +
  • Belegung des NVM der Echtzeituhr +
  • +
  • Seiten teilweise überarbeitet +
  • +
+ +

Version 1.00 +

+
    +
  • Beschreibung des ARGV-Verfahrens +
  • +
  • Beschreibung des Drag&Drop-Protokolls +
  • +
  • grafische Übersicht geändert +
  • +
  • Index stark überarbeitet +
  • +
  • Seiten teilweise überarbeitet +
  • +
+ +

Version 0.99 +

+
    +
  • Beschreibung des Cookie-Jars, sowie der wichtigsten Cookies +
  • +
  • Beschreibung der Systemvariablen +
  • +
  • Beschreibung des XBRA-Verfahrens +
  • +
  • Index überarbeitet +
  • +
  • Seiten teilweise überarbeitet +
  • +
+ +

Version 0.98 +

+
    +
  • Bugfixes bei den Routinen appl_getinfo und appl_search (Dank an Dirk Haun) +
  • +
  • Beschreibung der MetaDOS Funktionen +
  • +
  • CD ROM Opcodes für Fcntl +
  • +
  • Hypertext besser strukturiert +
  • +
  • Seiten teilweise überarbeitet +
  • +
+ +

Version 0.97 +

+
    +
  • Unterstützung weiterer Datentypen +
  • +
  • Datentypen auf portables Format umgestellt (z.B. WORD statt int) +
  • +
  • Neues Kapitel über Style-Guidelines (Teil-1) +
  • +
  • Einbindung weiterer Grafiken +
  • +
  • Hypertext besser strukturiert +
  • +
  • neue Komponente für wind_create +
  • +
  • viele Seiten nochmals überarbeitet +
  • +
+ +

Version 0.96 +

+
    +
  • aktuelle Beschreibung der TEDINFO-Struktur +
  • +
  • es gibt nun eine grafische Übersicht über den +grundsätzlichen Aufbau des Hypertextes bzw. des TOS +
  • +
  • Beschreibung der wichtigsten GDOS-Treiber, sowie des Aufbaus der +ASSIGN.SYS-Datei +
  • +
  • Hypertext besser strukturiert +
  • +
  • Seiten teilweise überarbeitet +
  • +
+ +

Version 0.95 +

+
    +
  • viele Seiten überarbeitet (VDI fast komplett) +
  • +
+ +

Version 0.90 +

+
    +
  • neue Modi für wind_get/wind_set Fensterverwaltung +
  • +
  • Beschreibung der neuen AES-Messages +
  • +
  • es gibt nun einen Querverweis auf den Hypertext newdesk.hyp, welcher +das Format der NEWDESK.INF Datei des Desktops beschreibt +
  • +
  • Seiten teilweise überarbeitet, AES komplett überarbeitet +bzw. vervollständigt. +
  • +
+ +

Version 0.85 +

+
    +
  • GEMDOS wesentlich überarbeitet +
  • +
+ +

Version 0.80 +

+
    +
  • Unterstützung von SpeedoGDOS (Teil-1) +
  • +
  • Beschreibung der AES-Funktion objc_sysvar +
  • +
  • Beschreibung der erweiterten appl_find Features +
  • +
  • Beschreibung der neuen shel_write Features +
  • +
  • Beschreibung der AES-Funktion objc_xfind +
  • +
  • Beschreibung der neuen Objektflags +
  • +
  • Einbindung erster Grafiken +
  • +
  • viele Seiten überarbeitet, BIOS und XBIOS komplett überarbeitet bzw. +vervollständigt. +
  • +
+ +

Version 0.70 +

+
    +
  • Unterstützung weiterer Datentypen +
  • +
  • Beschreibung der neuen Pexec-Modi +
  • +
  • Beschreibung der erweiterten Mxalloc-Funktion +
  • +
  • Seiten optisch sehr stark überarbeitet +
  • +
+ +

Version 0.60 +

+
    +
  • Beschreibung der XHDI-Spezifikation (Version 1.25) +
  • +
  • MiNT kompatible Funktionen (Teil-1) +
  • +
  • Fehlermeldungen des GEMDOS +
  • +
+ +

Version 0.50 +

+
    +
  • Unterstützung von NVDI (z.Zt. erst Version 2.50) +
  • +
  • Beschreibung des AV-Protokolls von Gemini +
  • +
  • Unterstützung von Datentypen +
  • +
  • Seiten optisch überarbeitet +
  • +
+ +

Version 0.40 +

+
    +
  • Erste öffentliche Version +
  • +
+ +
+ +Home +EinleitungEinleitung +Altes Vorwort von Rolf KotzianAltes Vorwort von Rolf Kotzian +The GNU General Public LicenceThe GNU General Public Licence + + diff --git a/de/index.html b/de/index.html new file mode 100644 index 000000000..b3934b4f4 --- /dev/null +++ b/de/index.html @@ -0,0 +1,79 @@ + + + + + +Die Anleitung zum TOS + + + + + + + + + +Home + + +EinleitungEinleitung + +
+ +
+

Die Anleitung zum

+

TOS

+

+tos.hyp
+22. November 2024
+

+


+ +
+

Inhaltsverzeichnis

+ +
+

Anhang

+ +
+

Index

+ +
+
+
+ +Home + + +EinleitungEinleitung + + diff --git a/de/index.ulh b/de/index.ulh new file mode 100644 index 000000000..d76d189ce --- /dev/null +++ b/de/index.ulh @@ -0,0 +1,38 @@ +######## errors, warnings and notes: + + +######## information: + +source file: /home/runner/work/tos.hyp/tos.hyp/tos_hyp.u + +Warnings: 0 +Notes: 0 +Errors: 0 + +Nodes: 25 +Subnodes: 208 +Subsubnodes: 1624 +Subsubsubnodes: 2014 +Subsubsubsubnodes: 95 +Subsubsubsubsubnodes: 2 +Subsubsubsubsubsubnodes: 0 +Subsubsubsubsubsubsubnodes: 0 +Subsubsubsubsubsubsubsubnodes: 0 +Total nodes: 3969 +Macros: 2 +Defines: 21 +Hyphens: 0 + +started: 19:51:15 +finished: 19:51:17 + +GIF written to /home/runner/work/tos.hyp/tos.hyp/gh-pages/de/udo_hm.gif +GIF written to /home/runner/work/tos.hyp/tos.hyp/gh-pages/de/udo_up.gif +GIF written to /home/runner/work/tos.hyp/tos.hyp/gh-pages/de/udo_lf.gif +GIF written to /home/runner/work/tos.hyp/tos.hyp/gh-pages/de/udo_rg.gif +GIF written to /home/runner/work/tos.hyp/tos.hyp/gh-pages/de/udo_nohm.gif +GIF written to /home/runner/work/tos.hyp/tos.hyp/gh-pages/de/udo_noup.gif +GIF written to /home/runner/work/tos.hyp/tos.hyp/gh-pages/de/udo_nolf.gif +GIF written to /home/runner/work/tos.hyp/tos.hyp/gh-pages/de/udo_norg.gif +Tree file written to /home/runner/work/tos.hyp/tos.hyp/gh-pages/de/index.uth +Output written to /home/runner/work/tos.hyp/tos.hyp/gh-pages/de/index.html diff --git a/de/index.uth b/de/index.uth new file mode 100644 index 000000000..eddda85f8 --- /dev/null +++ b/de/index.uth @@ -0,0 +1,6118 @@ +/home/runner/work/tos.hyp/tos.hyp/tos_hyp.u +|----config.u +|----hyphen.ui +|----hyphen_en.ui +|----macros.ui +|----anhang/hilfe.u +|----anhang/neu.u +|----|----anhang/changes/05_01.ui +|----|----anhang/changes/05_00.ui +|----|----anhang/changes/04_99.ui +|----|----anhang/changes/04_98.ui +|----|----anhang/changes/04_97.ui +|----|----anhang/changes/04_96.ui +|----|----anhang/changes/04_95.ui +|----|----anhang/changes/04_94.ui +|----|----anhang/changes/04_93.ui +|----|----anhang/changes/04_92.ui +|----|----anhang/changes/04_91.ui +|----|----anhang/changes/04_90.ui +|----|----anhang/changes/old.ui +|----anhang/gpl.ui +|----tos/tosmain.u +|----|----tos/tos_de.ui +|----bios/bios.u +|----|----bios/bios_trap.ui +|----|----bios/function/bconin.u +|----|----bios/function/bconout.u +|----|----bios/function/bconstat.u +|----|----bios/function/bcostat.u +|----|----bios/function/drvmap.u +|----|----bios/function/getbpb.u +|----|----bios/function/getmpb.u +|----|----bios/function/kbshift.u +|----|----bios/function/mediach.u +|----|----bios/function/rwabs.u +|----|----bios/function/setexc.u +|----|----bios/function/tickcal.u +|----|----bios/sys_var_de.u +|----|----bios/sys_vec_de.ui +|----|----bios/cookie/cookie.u +|----|----|----bios/cookie/cookie_de.ui +|----|----|----|----bios/cookie/example_de.ui +|----|----|----|----bios/cookie/list.ui +|----|----|----|----|----bios/cookie/description/3DMN.ui +|----|----|----|----|----bios/cookie/description/3RDB.ui +|----|----|----|----|----bios/cookie/description/60Hz.ui +|----|----|----|----|----bios/cookie/description/8_8.ui +|----|----|----|----|----bios/cookie/description/A2sv.ui +|----|----|----|----|----bios/cookie/description/AB40.ui +|----|----|----|----|----bios/cookie/description/ACCS.ui +|----|----|----|----|----bios/cookie/description/AFnt.ui +|----|----|----|----|----bios/cookie/description/AgK0.ui +|----|----|----|----|----bios/cookie/description/AHVR.ui +|----|----|----|----|----bios/cookie/description/ALHP.ui +|----|----|----|----|----bios/cookie/description/ALIC.ui +|----|----|----|----|----bios/cookie/description/ALRM.ui +|----|----|----|----|----bios/cookie/description/AmAN.ui +|----|----|----|----|----bios/cookie/description/AMC1.ui +|----|----|----|----|----bios/cookie/description/AMC2.ui +|----|----|----|----|----bios/cookie/description/AMCG.ui +|----|----|----|----|----bios/cookie/description/ANSe.ui +|----|----|----|----|----bios/cookie/description/APGM.ui +|----|----|----|----|----bios/cookie/description/ARAe.ui +|----|----|----|----|----bios/cookie/description/ARTS.ui +|----|----|----|----|----bios/cookie/description/asGT.ui +|----|----|----|----|----bios/cookie/description/ASum.ui +|----|----|----|----|----bios/cookie/description/AVmw.ui +|----|----|----|----|----bios/cookie/description/AVOJ.ui +|----|----|----|----|----bios/cookie/description/AVSV.ui +|----|----|----|----|----bios/cookie/description/BASH.ui +|----|----|----|----|----bios/cookie/description/BBD2.ui +|----|----|----|----|----bios/cookie/description/BCKW.ui +|----|----|----|----|----bios/cookie/description/BGEM.ui +|----|----|----|----|----bios/cookie/description/BGHD.ui +|----|----|----|----|----bios/cookie/description/BHdl.ui +|----|----|----|----|----bios/cookie/description/BHLP.ui +|----|----|----|----|----bios/cookie/description/BIGS.ui +|----|----|----|----|----bios/cookie/description/BIOC.ui +|----|----|----|----|----bios/cookie/description/BLNK.ui +|----|----|----|----|----bios/cookie/description/BLOW.ui +|----|----|----|----|----bios/cookie/description/BScn.ui +|----|----|----|----|----bios/cookie/description/BSIM.ui +|----|----|----|----|----bios/cookie/description/BSTE.ui +|----|----|----|----|----bios/cookie/description/BUG1.ui +|----|----|----|----|----bios/cookie/description/C24P.ui +|----|----|----|----|----bios/cookie/description/CACH.ui +|----|----|----|----|----bios/cookie/description/CALD.ui +|----|----|----|----|----bios/cookie/description/CASE.ui +|----|----|----|----|----bios/cookie/description/CatS.ui +|----|----|----|----|----bios/cookie/description/CaTT.ui +|----|----|----|----|----bios/cookie/description/CB2K.ui +|----|----|----|----|----bios/cookie/description/CBCE.ui +|----|----|----|----|----bios/cookie/description/CBDF.ui +|----|----|----|----|----bios/cookie/description/CBHD.ui +|----|----|----|----|----bios/cookie/description/CBHY.ui +|----|----|----|----|----bios/cookie/description/CBIT.ui +|----|----|----|----|----bios/cookie/description/CBTS.ui +|----|----|----|----|----bios/cookie/description/CCDA.ui +|----|----|----|----|----bios/cookie/description/cdMC.ui +|----|----|----|----|----bios/cookie/description/CDOT.ui +|----|----|----|----|----bios/cookie/description/ceci.ui +|----|----|----|----|----bios/cookie/description/CFIX.ui +|----|----|----|----|----bios/cookie/description/CFsl.ui +|----|----|----|----|----bios/cookie/description/CHAM.ui +|----|----|----|----|----bios/cookie/description/CHBT.ui +|----|----|----|----|----bios/cookie/description/CHN1.ui +|----|----|----|----|----bios/cookie/description/CHNG.ui +|----|----|----|----|----bios/cookie/description/CHTW.ui +|----|----|----|----|----bios/cookie/description/CICN.ui +|----|----|----|----|----bios/cookie/description/CISY.ui +|----|----|----|----|----bios/cookie/description/CJar.ui +|----|----|----|----|----bios/cookie/description/CJAR_.ui +|----|----|----|----|----bios/cookie/description/ck01.ui +|----|----|----|----|----bios/cookie/description/CKBD.ui +|----|----|----|----|----bios/cookie/description/CKJR.ui +|----|----|----|----|----bios/cookie/description/CLCK.ui +|----|----|----|----|----bios/cookie/description/CLK1.ui +|----|----|----|----|----bios/cookie/description/CLOK.ui +|----|----|----|----|----bios/cookie/description/CM16.ui +|----|----|----|----|----bios/cookie/description/CNTS.ui +|----|----|----|----|----bios/cookie/description/COLO.ui +|----|----|----|----|----bios/cookie/description/CPSL.ui +|----|----|----|----|----bios/cookie/description/CRAC.ui +|----|----|----|----|----bios/cookie/description/CRIT.ui +|----|----|----|----|----bios/cookie/description/CSMD.ui +|----|----|----|----|----bios/cookie/description/CT40.ui +|----|----|----|----|----bios/cookie/description/CT60.ui +|----|----|----|----|----bios/cookie/description/CTCH.ui +|----|----|----|----|----bios/cookie/description/CtCp.ui +|----|----|----|----|----bios/cookie/description/CTSF.ui +|----|----|----|----|----bios/cookie/description/cVDI.ui +|----|----|----|----|----bios/cookie/description/CWCo.ui +|----|----|----|----|----bios/cookie/description/DATE.ui +|----|----|----|----|----bios/cookie/description/DATL.ui +|----|----|----|----|----bios/cookie/description/DAWN.ui +|----|----|----|----|----bios/cookie/description/DBFX.ui +|----|----|----|----|----bios/cookie/description/DCdd.ui +|----|----|----|----|----bios/cookie/description/DCF7.ui +|----|----|----|----|----bios/cookie/description/DCSD.ui +|----|----|----|----|----bios/cookie/description/DECD.ui +|----|----|----|----|----bios/cookie/description/DEPI.ui +|----|----|----|----|----bios/cookie/description/DHST.ui +|----|----|----|----|----bios/cookie/description/DIG2.ui +|----|----|----|----|----bios/cookie/description/DJBX.ui +|----|----|----|----|----bios/cookie/description/DKEY.ui +|----|----|----|----|----bios/cookie/description/DNTR.ui +|----|----|----|----|----bios/cookie/description/DPAT.ui +|----|----|----|----|----bios/cookie/description/DPRS.ui +|----|----|----|----|----bios/cookie/description/DRIV.ui +|----|----|----|----|----bios/cookie/description/DRRH.ui +|----|----|----|----|----bios/cookie/description/Dsel.ui +|----|----|----|----|----bios/cookie/description/DSSO.ui +|----|----|----|----|----bios/cookie/description/DYDL.ui +|----|----|----|----|----bios/cookie/description/DYJA.ui +|----|----|----|----|----bios/cookie/description/DYJD.ui +|----|----|----|----|----bios/cookie/description/DYJT.ui +|----|----|----|----|----bios/cookie/description/DYNL.ui +|----|----|----|----|----bios/cookie/description/DYwl.ui +|----|----|----|----|----bios/cookie/description/EADC.ui +|----|----|----|----|----bios/cookie/description/EBPO.ui +|----|----|----|----|----bios/cookie/description/EdDI.ui +|----|----|----|----|----bios/cookie/description/EDFX.ui +|----|----|----|----|----bios/cookie/description/EGON.ui +|----|----|----|----|----bios/cookie/description/EMNP.ui +|----|----|----|----|----bios/cookie/description/ENV$.ui +|----|----|----|----|----bios/cookie/description/ENVN.ui +|----|----|----|----|----bios/cookie/description/ENVR.ui +|----|----|----|----|----bios/cookie/description/EPro.ui +|----|----|----|----|----bios/cookie/description/F117.ui +|----|----|----|----|----bios/cookie/description/ETM.ui +|----|----|----|----|----bios/cookie/description/EURO.ui +|----|----|----|----|----bios/cookie/description/EUSB.ui +|----|----|----|----|----bios/cookie/description/EXRA.ui +|----|----|----|----|----bios/cookie/description/EXTD.ui +|----|----|----|----|----bios/cookie/description/FaKE.ui +|----|----|----|----|----bios/cookie/description/FALT.ui +|----|----|----|----|----bios/cookie/description/FAX_.ui +|----|----|----|----|----bios/cookie/description/FAXR.ui +|----|----|----|----|----bios/cookie/description/FHFX.ui +|----|----|----|----|----bios/cookie/description/FIX2.ui +|----|----|----|----|----bios/cookie/description/FLTP.ui +|----|----|----|----|----bios/cookie/description/FLXD.ui +|----|----|----|----|----bios/cookie/description/fMSX.ui +|----|----|----|----|----bios/cookie/description/Fose.ui +|----|----|----|----|----bios/cookie/description/FOse_.ui +|----|----|----|----|----bios/cookie/description/FrmD.ui +|----|----|----|----|----bios/cookie/description/FSEL.ui +|----|----|----|----|----bios/cookie/description/FSER.ui +|----|----|----|----|----bios/cookie/description/FSMC.ui +|----|----|----|----|----bios/cookie/description/FSmp.ui +|----|----|----|----|----bios/cookie/description/fVDI.ui +|----|----|----|----|----bios/cookie/description/FxOP.ui +|----|----|----|----|----bios/cookie/description/F_3D.ui +|----|----|----|----|----bios/cookie/description/GABI.ui +|----|----|----|----|----bios/cookie/description/GBel.ui +|----|----|----|----|----bios/cookie/description/GCOM.ui +|----|----|----|----|----bios/cookie/description/GDEV.ui +|----|----|----|----|----bios/cookie/description/GEHC.ui +|----|----|----|----|----bios/cookie/description/GEHD.ui +|----|----|----|----|----bios/cookie/description/GEMB.ui +|----|----|----|----|----bios/cookie/description/GENV.ui +|----|----|----|----|----bios/cookie/description/Gfix.ui +|----|----|----|----|----bios/cookie/description/GI30.ui +|----|----|----|----|----bios/cookie/description/GIGA.ui +|----|----|----|----|----bios/cookie/description/gk5_.ui +|----|----|----|----|----bios/cookie/description/gkCO.ui +|----|----|----|----|----bios/cookie/description/GLAS.ui +|----|----|----|----|----bios/cookie/description/GLBL.ui +|----|----|----|----|----bios/cookie/description/GMNI.ui +|----|----|----|----|----bios/cookie/description/GMTC.ui +|----|----|----|----|----bios/cookie/description/GNUC.ui +|----|----|----|----|----bios/cookie/description/Gnva.ui +|----|----|----|----|----bios/cookie/description/GOBJ.ui +|----|----|----|----|----bios/cookie/description/GOff.ui +|----|----|----|----|----bios/cookie/description/GSND.ui +|----|----|----|----|----bios/cookie/description/GSP1.ui +|----|----|----|----|----bios/cookie/description/GSXB.ui +|----|----|----|----|----bios/cookie/description/GULM.ui +|----|----|----|----|----bios/cookie/description/HABO.ui +|----|----|----|----|----bios/cookie/description/hade.ui +|----|----|----|----|----bios/cookie/description/HAMM.ui +|----|----|----|----|----bios/cookie/description/HBFS.ui +|----|----|----|----|----bios/cookie/description/HcP6.ui +|----|----|----|----|----bios/cookie/description/HDDR.ui +|----|----|----|----|----bios/cookie/description/HDEX.ui +|----|----|----|----|----bios/cookie/description/HDEY.ui +|----|----|----|----|----bios/cookie/description/HDJR.ui +|----|----|----|----|----bios/cookie/description/HDLD.ui +|----|----|----|----|----bios/cookie/description/HDPR.ui +|----|----|----|----|----bios/cookie/description/HDRC.ui +|----|----|----|----|----bios/cookie/description/HDST.ui +|----|----|----|----|----bios/cookie/description/HDSW.ui +|----|----|----|----|----bios/cookie/description/HFIX.ui +|----|----|----|----|----bios/cookie/description/hFRB.ui +|----|----|----|----|----bios/cookie/description/HIDS.ui +|----|----|----|----|----bios/cookie/description/HMDU.ui +|----|----|----|----|----bios/cookie/description/HMOC.ui +|----|----|----|----|----bios/cookie/description/HMRD.ui +|----|----|----|----|----bios/cookie/description/HMRS.ui +|----|----|----|----|----bios/cookie/description/HPHC.ui +|----|----|----|----|----bios/cookie/description/HPLJ.ui +|----|----|----|----|----bios/cookie/description/HSCD.ui +|----|----|----|----|----bios/cookie/description/HSND.ui +|----|----|----|----|----bios/cookie/description/HWAM.ui +|----|----|----|----|----bios/cookie/description/IBMP.ui +|----|----|----|----|----bios/cookie/description/ICFS.ui +|----|----|----|----|----bios/cookie/description/ICST.ui +|----|----|----|----|----bios/cookie/description/IDSK.ui +|----|----|----|----|----bios/cookie/description/IMAC.ui +|----|----|----|----|----bios/cookie/description/IMNE.ui +|----|----|----|----|----bios/cookie/description/INSJ.ui +|----|----|----|----|----bios/cookie/description/INXR.ui +|----|----|----|----|----bios/cookie/description/iPRN.ui +|----|----|----|----|----bios/cookie/description/IRSB.ui +|----|----|----|----|----bios/cookie/description/iTMA.ui +|----|----|----|----|----bios/cookie/description/JAM1.ui +|----|----|----|----|----bios/cookie/description/JANU.ui +|----|----|----|----|----bios/cookie/description/JB2G.ui +|----|----|----|----|----bios/cookie/description/JCLK.ui +|----|----|----|----|----bios/cookie/description/JCNB.ui +|----|----|----|----|----bios/cookie/description/JCNC.ui +|----|----|----|----|----bios/cookie/description/JCNH.ui +|----|----|----|----|----bios/cookie/description/JCNT.ui +|----|----|----|----|----bios/cookie/description/JFTP.ui +|----|----|----|----|----bios/cookie/description/JINX.ui +|----|----|----|----|----bios/cookie/description/JMLB.ui +|----|----|----|----|----bios/cookie/description/JMLS.ui +|----|----|----|----|----bios/cookie/description/JSHD.ui +|----|----|----|----|----bios/cookie/description/JUST.ui +|----|----|----|----|----bios/cookie/description/J_Sc.ui +|----|----|----|----|----bios/cookie/description/KAOS.ui +|----|----|----|----|----bios/cookie/description/KbEv.ui +|----|----|----|----|----bios/cookie/description/KEYT.ui +|----|----|----|----|----bios/cookie/description/KGTF.ui +|----|----|----|----|----bios/cookie/description/KIDI.ui +|----|----|----|----|----bios/cookie/description/KLME.ui +|----|----|----|----|----bios/cookie/description/KREG.ui +|----|----|----|----|----bios/cookie/description/KyMp.ui +|----|----|----|----|----bios/cookie/description/KyWt.ui +|----|----|----|----|----bios/cookie/description/Lace.ui +|----|----|----|----|----bios/cookie/description/LACY.ui +|----|----|----|----|----bios/cookie/description/LALA.ui +|----|----|----|----|----bios/cookie/description/lanc.ui +|----|----|----|----|----bios/cookie/description/LASB.ui +|----|----|----|----|----bios/cookie/description/LAWC.ui +|----|----|----|----|----bios/cookie/description/LDGM.ui +|----|----|----|----|----bios/cookie/description/LEDP.ui +|----|----|----|----|----bios/cookie/description/LEmu.ui +|----|----|----|----|----bios/cookie/description/Lity.ui +|----|----|----|----|----bios/cookie/description/LLCR.ui +|----|----|----|----|----bios/cookie/description/LMus.ui +|----|----|----|----|----bios/cookie/description/LOGB.ui +|----|----|----|----|----bios/cookie/description/LoSe.ui +|----|----|----|----|----bios/cookie/description/LPCD.ui +|----|----|----|----|----bios/cookie/description/LPJM.ui +|----|----|----|----|----bios/cookie/description/LP_2.ui +|----|----|----|----|----bios/cookie/description/LTMF.ui +|----|----|----|----|----bios/cookie/description/M16s.ui +|----|----|----|----|----bios/cookie/description/M16X.ui +|----|----|----|----|----bios/cookie/description/macc.ui +|----|----|----|----|----bios/cookie/description/MADD.ui +|----|----|----|----|----bios/cookie/description/MADN.ui +|----|----|----|----|----bios/cookie/description/Maes.ui +|----|----|----|----|----bios/cookie/description/MagC.ui +|----|----|----|----|----bios/cookie/description/MAGN.ui +|----|----|----|----|----bios/cookie/description/MagX.ui +|----|----|----|----|----bios/cookie/description/MAST.ui +|----|----|----|----|----bios/cookie/description/MaTC.ui +|----|----|----|----|----bios/cookie/description/MbAr.ui +|----|----|----|----|----bios/cookie/description/MBRD.ui +|----|----|----|----|----bios/cookie/description/MCL_.ui +|----|----|----|----|----bios/cookie/description/McSn.ui +|----|----|----|----|----bios/cookie/description/MCSP.ui +|----|----|----|----|----bios/cookie/description/MCWR.ui +|----|----|----|----|----bios/cookie/description/MDIA.ui +|----|----|----|----|----bios/cookie/description/MDRK.ui +|----|----|----|----|----bios/cookie/description/MDSa.ui +|----|----|----|----|----bios/cookie/description/MFAC.ui +|----|----|----|----|----bios/cookie/description/MFFM.ui +|----|----|----|----|----bios/cookie/description/MFIX.ui +|----|----|----|----|----bios/cookie/description/MFMV.ui +|----|----|----|----|----bios/cookie/description/MFNT.ui +|----|----|----|----|----bios/cookie/description/MGEM.ui +|----|----|----|----|----bios/cookie/description/MgMc.ui +|----|----|----|----|----bios/cookie/description/MgMx.ui +|----|----|----|----|----bios/cookie/description/MgPC.ui +|----|----|----|----|----bios/cookie/description/MgSn.ui +|----|----|----|----|----bios/cookie/description/MID3.ui +|----|----|----|----|----bios/cookie/description/MIMA.ui +|----|----|----|----|----bios/cookie/description/MiNT.ui +|----|----|----|----|----bios/cookie/description/MIPS.ui +|----|----|----|----|----bios/cookie/description/MJAF.ui +|----|----|----|----|----bios/cookie/description/MKHC.ui +|----|----|----|----|----bios/cookie/description/MkJr.ui +|----|----|----|----|----bios/cookie/description/MM2X.ui +|----|----|----|----|----bios/cookie/description/MMAC.ui +|----|----|----|----|----bios/cookie/description/MMUT.ui +|----|----|----|----|----bios/cookie/description/MM_2.ui +|----|----|----|----|----bios/cookie/description/MN3D.ui +|----|----|----|----|----bios/cookie/description/MNAM.ui +|----|----|----|----|----bios/cookie/description/MOAF.ui +|----|----|----|----|----bios/cookie/description/MOGR.ui +|----|----|----|----|----bios/cookie/description/MPRO.ui +|----|----|----|----|----bios/cookie/description/MRAM.ui +|----|----|----|----|----bios/cookie/description/MSPD.ui +|----|----|----|----|----bios/cookie/description/MSPO.ui +|----|----|----|----|----bios/cookie/description/mstx.ui +|----|----|----|----|----bios/cookie/description/MTCI.ui +|----|----|----|----|----bios/cookie/description/MTft.ui +|----|----|----|----|----bios/cookie/description/MUPF.ui +|----|----|----|----|----bios/cookie/description/MWHL.ui +|----|----|----|----|----bios/cookie/description/MZTR.ui +|----|----|----|----|----bios/cookie/description/MZVT.ui +|----|----|----|----|----bios/cookie/description/M_IN.ui +|----|----|----|----|----bios/cookie/description/N203.ui +|----|----|----|----|----bios/cookie/description/nAES.ui +|----|----|----|----|----bios/cookie/description/NAH3.ui +|----|----|----|----|----bios/cookie/description/NBEL.ui +|----|----|----|----|----bios/cookie/description/NBLL.ui +|----|----|----|----|----bios/cookie/description/NCLN.ui +|----|----|----|----|----bios/cookie/description/ne2k.ui +|----|----|----|----|----bios/cookie/description/NERV.ui +|----|----|----|----|----bios/cookie/description/NETS.ui +|----|----|----|----|----bios/cookie/description/NEXB.ui +|----|----|----|----|----bios/cookie/description/NEXK.ui +|----|----|----|----|----bios/cookie/description/NFMT.ui +|----|----|----|----|----bios/cookie/description/NFnt.ui +|----|----|----|----|----bios/cookie/description/NKCC.ui +|----|----|----|----|----bios/cookie/description/NLdr.ui +|----|----|----|----|----bios/cookie/description/NMGE.ui +|----|----|----|----|----bios/cookie/description/NO7P.ui +|----|----|----|----|----bios/cookie/description/noCF.ui +|----|----|----|----|----bios/cookie/description/NOR5.ui +|----|----|----|----|----bios/cookie/description/NOVA.ui +|----|----|----|----|----bios/cookie/description/NSC1.ui +|----|----|----|----|----bios/cookie/description/Nspd.ui +|----|----|----|----|----bios/cookie/description/nTAS.ui +|----|----|----|----|----bios/cookie/description/NTK4.ui +|----|----|----|----|----bios/cookie/description/nTOS.ui +|----|----|----|----|----bios/cookie/description/NUL_.ui +|----|----|----|----|----bios/cookie/description/NVDI.ui +|----|----|----|----|----bios/cookie/description/OBNL.ui +|----|----|----|----|----bios/cookie/description/OFLS.ui +|----|----|----|----|----bios/cookie/description/OPMM.ui +|----|----|----|----|----bios/cookie/description/OSBL.ui +|----|----|----|----|----bios/cookie/description/OSTT.ui +|----|----|----|----|----bios/cookie/description/OTOS.ui +|----|----|----|----|----bios/cookie/description/OV24.ui +|----|----|----|----|----bios/cookie/description/oVDI.ui +|----|----|----|----|----bios/cookie/description/OVDJ.ui +|----|----|----|----|----bios/cookie/description/OVEP.ui +|----|----|----|----|----bios/cookie/description/OVER.ui +|----|----|----|----|----bios/cookie/description/OVEX.ui +|----|----|----|----|----bios/cookie/description/OVFS.ui +|----|----|----|----|----bios/cookie/description/OVIM.ui +|----|----|----|----|----bios/cookie/description/OVLS.ui +|----|----|----|----|----bios/cookie/description/OVRD.ui +|----|----|----|----|----bios/cookie/description/OVUT.ui +|----|----|----|----|----bios/cookie/description/OVWI.ui +|----|----|----|----|----bios/cookie/description/PAMN.ui +|----|----|----|----|----bios/cookie/description/PAUL.ui +|----|----|----|----|----bios/cookie/description/PBUG.ui +|----|----|----|----|----bios/cookie/description/PDEB.ui +|----|----|----|----|----bios/cookie/description/PDOS.ui +|----|----|----|----|----bios/cookie/description/PDRZ.ui +|----|----|----|----|----bios/cookie/description/PFIX.ui +|----|----|----|----|----bios/cookie/description/Pinp.ui +|----|----|----|----|----bios/cookie/description/PKSH.ui +|----|----|----|----|----bios/cookie/description/PMMU.ui +|----|----|----|----|----bios/cookie/description/POIS.ui +|----|----|----|----|----bios/cookie/description/POWM.ui +|----|----|----|----|----bios/cookie/description/PRCS.ui +|----|----|----|----|----bios/cookie/description/PRDS.ui +|----|----|----|----|----bios/cookie/description/PRMD.ui +|----|----|----|----|----bios/cookie/description/PRN!.ui +|----|----|----|----|----bios/cookie/description/PRNSS.ui +|----|----|----|----|----bios/cookie/description/PRO5.ui +|----|----|----|----|----bios/cookie/description/PROB.ui +|----|----|----|----|----bios/cookie/description/PROT.ui +|----|----|----|----|----bios/cookie/description/PRTD.ui +|----|----|----|----|----bios/cookie/description/PRTO.ui +|----|----|----|----|----bios/cookie/description/prtr.ui +|----|----|----|----|----bios/cookie/description/PRTR_.ui +|----|----|----|----|----bios/cookie/description/PSND.ui +|----|----|----|----|----bios/cookie/description/PSSG.ui +|----|----|----|----|----bios/cookie/description/PTOS.ui +|----|----|----|----|----bios/cookie/description/QIKM.ui +|----|----|----|----|----bios/cookie/description/QMAC.ui +|----|----|----|----|----bios/cookie/description/QMCP.ui +|----|----|----|----|----bios/cookie/description/QST2.ui +|----|----|----|----|----bios/cookie/description/QST3.ui +|----|----|----|----|----bios/cookie/description/QUAN.ui +|----|----|----|----|----bios/cookie/description/RAIL.ui +|----|----|----|----|----bios/cookie/description/RaSn.ui +|----|----|----|----|----bios/cookie/description/RESG.ui +|----|----|----|----|----bios/cookie/description/RFLX.ui +|----|----|----|----|----bios/cookie/description/RFUS.ui +|----|----|----|----|----bios/cookie/description/RGUS.ui +|----|----|----|----|----bios/cookie/description/RING.ui +|----|----|----|----|----bios/cookie/description/ROMD.ui +|----|----|----|----|----bios/cookie/description/ROT8.ui +|----|----|----|----|----bios/cookie/description/RPIT.ui +|----|----|----|----|----bios/cookie/description/RREG.ui +|----|----|----|----|----bios/cookie/description/RSLT.ui +|----|----|----|----|----bios/cookie/description/RSpd.ui +|----|----|----|----|----bios/cookie/description/RSVE.ui +|----|----|----|----|----bios/cookie/description/RSVF.ui +|----|----|----|----|----bios/cookie/description/RTKC.ui +|----|----|----|----|----bios/cookie/description/RTOB.ui +|----|----|----|----|----bios/cookie/description/RWIN.ui +|----|----|----|----|----bios/cookie/description/SAM.ui +|----|----|----|----|----bios/cookie/description/SBKM.ui +|----|----|----|----|----bios/cookie/description/SBTE.ui +|----|----|----|----|----bios/cookie/description/SBTS.ui +|----|----|----|----|----bios/cookie/description/SCAH.ui +|----|----|----|----|----bios/cookie/description/SCKM.ui +|----|----|----|----|----bios/cookie/description/SCPN.ui +|----|----|----|----|----bios/cookie/description/SCRD.ui +|----|----|----|----|----bios/cookie/description/SCRN.ui +|----|----|----|----|----bios/cookie/description/SCRS.ui +|----|----|----|----|----bios/cookie/description/SCRW.ui +|----|----|----|----|----bios/cookie/description/SCSI.ui +|----|----|----|----|----bios/cookie/description/SCSV.ui +|----|----|----|----|----bios/cookie/description/SDCH.ui +|----|----|----|----|----bios/cookie/description/SDES.ui +|----|----|----|----|----bios/cookie/description/SDsk.ui +|----|----|----|----|----bios/cookie/description/SDWN.ui +|----|----|----|----|----bios/cookie/description/SELC.ui +|----|----|----|----|----bios/cookie/description/SENV.ui +|----|----|----|----|----bios/cookie/description/SFA^.ui +|----|----|----|----|----bios/cookie/description/SFIX.ui +|----|----|----|----|----bios/cookie/description/SFMN.ui +|----|----|----|----|----bios/cookie/description/ShLk.ui +|----|----|----|----|----bios/cookie/description/shlp.ui +|----|----|----|----|----bios/cookie/description/SKEY.ui +|----|----|----|----|----bios/cookie/description/SLCT.ui +|----|----|----|----|----bios/cookie/description/SLif.ui +|----|----|----|----|----bios/cookie/description/SLIP.ui +|----|----|----|----|----bios/cookie/description/SM00.ui +|----|----|----|----|----bios/cookie/description/SM01.ui +|----|----|----|----|----bios/cookie/description/SM02.ui +|----|----|----|----|----bios/cookie/description/SMAL.ui +|----|----|----|----|----bios/cookie/description/SMAU.ui +|----|----|----|----|----bios/cookie/description/SMon.ui +|----|----|----|----|----bios/cookie/description/SMTT.ui +|----|----|----|----|----bios/cookie/description/SNAP.ui +|----|----|----|----|----bios/cookie/description/SOFS.ui +|----|----|----|----|----bios/cookie/description/SOSW.ui +|----|----|----|----|----bios/cookie/description/SpcE.ui +|----|----|----|----|----bios/cookie/description/SPCK.ui +|----|----|----|----|----bios/cookie/description/SPEE.ui +|----|----|----|----|----bios/cookie/description/SPEK.ui +|----|----|----|----|----bios/cookie/description/SPEX.ui +|----|----|----|----|----bios/cookie/description/spMR.ui +|----|----|----|----|----bios/cookie/description/Spol.ui +|----|----|----|----|----bios/cookie/description/SPRG.ui +|----|----|----|----|----bios/cookie/description/SR17.ui +|----|----|----|----|----bios/cookie/description/SSND.ui +|----|----|----|----|----bios/cookie/description/ST-C.ui +|----|----|----|----|----bios/cookie/description/ST17.ui +|----|----|----|----|----bios/cookie/description/STAT.ui +|----|----|----|----|----bios/cookie/description/STEM.ui +|----|----|----|----|----bios/cookie/description/STEW.ui +|----|----|----|----|----bios/cookie/description/STFA.ui +|----|----|----|----|----bios/cookie/description/StIc.ui +|----|----|----|----|----bios/cookie/description/STiK.ui +|----|----|----|----|----bios/cookie/description/STMS.ui +|----|----|----|----|----bios/cookie/description/strk.ui +|----|----|----|----|----bios/cookie/description/STRX.ui +|----|----|----|----|----bios/cookie/description/SupV.ui +|----|----|----|----|----bios/cookie/description/SVAR.ui +|----|----|----|----|----bios/cookie/description/SVGA.ui +|----|----|----|----|----bios/cookie/description/SWAP.ui +|----|----|----|----|----bios/cookie/description/SwTm.ui +|----|----|----|----|----bios/cookie/description/SYMB.ui +|----|----|----|----|----bios/cookie/description/SYNL.ui +|----|----|----|----|----bios/cookie/description/SYNT.ui +|----|----|----|----|----bios/cookie/description/SysE.ui +|----|----|----|----|----bios/cookie/description/Syso.ui +|----|----|----|----|----bios/cookie/description/SYST.ui +|----|----|----|----|----bios/cookie/description/SZ_M.ui +|----|----|----|----|----bios/cookie/description/S_DR.ui +|----|----|----|----|----bios/cookie/description/T206.ui +|----|----|----|----|----bios/cookie/description/T2GM.ui +|----|----|----|----|----bios/cookie/description/TALK.ui +|----|----|----|----|----bios/cookie/description/TAPE.ui +|----|----|----|----|----bios/cookie/description/TASS.ui +|----|----|----|----|----bios/cookie/description/TCFS.ui +|----|----|----|----|----bios/cookie/description/TCRB.ui +|----|----|----|----|----bios/cookie/description/Tenv.ui +|----|----|----|----|----bios/cookie/description/TFIX.ui +|----|----|----|----|----bios/cookie/description/THNX.ui +|----|----|----|----|----bios/cookie/description/THRM.ui +|----|----|----|----|----bios/cookie/description/THST.ui +|----|----|----|----|----bios/cookie/description/TIM3.ui +|----|----|----|----|----bios/cookie/description/TIM5.ui +|----|----|----|----|----bios/cookie/description/TIME.ui +|----|----|----|----|----bios/cookie/description/TK40.ui +|----|----|----|----|----bios/cookie/description/TL3D.ui +|----|----|----|----|----bios/cookie/description/TLWV.ui +|----|----|----|----|----bios/cookie/description/Tmon.ui +|----|----|----|----|----bios/cookie/description/tmsW.ui +|----|----|----|----|----bios/cookie/description/TOpW.ui +|----|----|----|----|----bios/cookie/description/TOUC.ui +|----|----|----|----|----bios/cookie/description/TPat.ui +|----|----|----|----|----bios/cookie/description/TPGM.ui +|----|----|----|----|----bios/cookie/description/TRAK.ui +|----|----|----|----|----bios/cookie/description/TraP.ui +|----|----|----|----|----bios/cookie/description/Trpp.ui +|----|----|----|----|----bios/cookie/description/TRUE.ui +|----|----|----|----|----bios/cookie/description/TSEN.ui +|----|----|----|----|----bios/cookie/description/TSWP.ui +|----|----|----|----|----bios/cookie/description/TTTF.ui +|----|----|----|----|----bios/cookie/description/TUBS.ui +|----|----|----|----|----bios/cookie/description/TWFS.ui +|----|----|----|----|----bios/cookie/description/Typ1.ui +|----|----|----|----|----bios/cookie/description/UFSL.ui +|----|----|----|----|----bios/cookie/description/UIS3.ui +|----|----|----|----|----bios/cookie/description/UKB1.ui +|----|----|----|----|----bios/cookie/description/UKB3.ui +|----|----|----|----|----bios/cookie/description/un_x.ui +|----|----|----|----|----bios/cookie/description/USCK.ui +|----|----|----|----|----bios/cookie/description/USHD.ui +|----|----|----|----|----bios/cookie/description/UsNm.ui +|----|----|----|----|----bios/cookie/description/USPK.ui +|----|----|----|----|----bios/cookie/description/USRS.ui +|----|----|----|----|----bios/cookie/description/USSC.ui +|----|----|----|----|----bios/cookie/description/UTRK.ui +|----|----|----|----|----bios/cookie/description/VBLF.ui +|----|----|----|----|----bios/cookie/description/VDIp.ui +|----|----|----|----|----bios/cookie/description/VDLY.ui +|----|----|----|----|----bios/cookie/description/VECS.ui +|----|----|----|----|----bios/cookie/description/VeiL.ui +|----|----|----|----|----bios/cookie/description/VFIX.ui +|----|----|----|----|----bios/cookie/description/VFNT.ui +|----|----|----|----|----bios/cookie/description/VGAS.ui +|----|----|----|----|----bios/cookie/description/VI-2.ui +|----|----|----|----|----bios/cookie/description/View.ui +|----|----|----|----|----bios/cookie/description/VIRA.ui +|----|----|----|----|----bios/cookie/description/VMEM.ui +|----|----|----|----|----bios/cookie/description/VPCH.ui +|----|----|----|----|----bios/cookie/description/VRAM.ui +|----|----|----|----|----bios/cookie/description/VREP.ui +|----|----|----|----|----bios/cookie/description/VSco.ui +|----|----|----|----|----bios/cookie/description/VSCR.ui +|----|----|----|----|----bios/cookie/description/VSTM.ui +|----|----|----|----|----bios/cookie/description/vT52.ui +|----|----|----|----|----bios/cookie/description/VTFX.ui +|----|----|----|----|----bios/cookie/description/VXCK.ui +|----|----|----|----|----bios/cookie/description/WaHW.ui +|----|----|----|----|----bios/cookie/description/WARP.ui +|----|----|----|----|----bios/cookie/description/WaSA.ui +|----|----|----|----|----bios/cookie/description/WBrd.ui +|----|----|----|----|----bios/cookie/description/wdlg.ui +|----|----|----|----|----bios/cookie/description/WDOG.ui +|----|----|----|----|----bios/cookie/description/WEGA.ui +|----|----|----|----|----bios/cookie/description/WfNa.ui +|----|----|----|----|----bios/cookie/description/WFSL.ui +|----|----|----|----|----bios/cookie/description/WICO.ui +|----|----|----|----|----bios/cookie/description/WinK.ui +|----|----|----|----|----bios/cookie/description/WINX.ui +|----|----|----|----|----bios/cookie/description/WINZ.ui +|----|----|----|----|----bios/cookie/description/WPRO.ui +|----|----|----|----|----bios/cookie/description/WRAP.ui +|----|----|----|----|----bios/cookie/description/XALT.ui +|----|----|----|----|----bios/cookie/description/XBTN.ui +|----|----|----|----|----bios/cookie/description/XDsk.ui +|----|----|----|----|----bios/cookie/description/XFRB.ui +|----|----|----|----|----bios/cookie/description/XFS1.ui +|----|----|----|----|----bios/cookie/description/xFSL.ui +|----|----|----|----|----bios/cookie/description/Xgem.ui +|----|----|----|----|----bios/cookie/description/XHDI.ui +|----|----|----|----|----bios/cookie/description/XKBD.ui +|----|----|----|----|----bios/cookie/description/XMMU.ui +|----|----|----|----|----bios/cookie/description/XMuz.ui +|----|----|----|----|----bios/cookie/description/xNet.ui +|----|----|----|----|----bios/cookie/description/XPCI.ui +|----|----|----|----|----bios/cookie/description/xRmt.ui +|----|----|----|----|----bios/cookie/description/XSDD.ui +|----|----|----|----|----bios/cookie/description/XSND.ui +|----|----|----|----|----bios/cookie/description/XSSI.ui +|----|----|----|----|----bios/cookie/description/XTOS.ui +|----|----|----|----|----bios/cookie/description/xUAG.ui +|----|----|----|----|----bios/cookie/description/xUFC.ui +|----|----|----|----|----bios/cookie/description/XWin.ui +|----|----|----|----|----bios/cookie/description/zCAC.ui +|----|----|----|----|----bios/cookie/description/zDCF.ui +|----|----|----|----|----bios/cookie/description/_5MS.ui +|----|----|----|----|----bios/cookie/description/_AFM.ui +|----|----|----|----|----bios/cookie/description/_AKP.ui +|----|----|----|----|----bios/cookie/description/_CF_.ui +|----|----|----|----|----bios/cookie/description/_CPU.ui +|----|----|----|----|----bios/cookie/description/_DOS.ui +|----|----|----|----|----bios/cookie/description/_FDC.ui +|----|----|----|----|----bios/cookie/description/_FLK.ui +|----|----|----|----|----bios/cookie/description/_FPU.ui +|----|----|----|----|----bios/cookie/description/_FRB.ui +|----|----|----|----|----bios/cookie/description/_FSC.ui +|----|----|----|----|----bios/cookie/description/_FSR.ui +|----|----|----|----|----bios/cookie/description/_IDT.ui +|----|----|----|----|----bios/cookie/description/_INF.ui +|----|----|----|----|----bios/cookie/description/_INU.ui +|----|----|----|----|----bios/cookie/description/_ISO.ui +|----|----|----|----|----bios/cookie/description/_JPD.ui +|----|----|----|----|----bios/cookie/description/_MCF.ui +|----|----|----|----|----bios/cookie/description/_MCH.ui +|----|----|----|----|----bios/cookie/description/_MET.ui +|----|----|----|----|----bios/cookie/description/_MIL.ui +|----|----|----|----|----bios/cookie/description/_NET.ui +|----|----|----|----|----bios/cookie/description/_OOL.ui +|----|----|----|----|----bios/cookie/description/_PCI.ui +|----|----|----|----|----bios/cookie/description/_PKT.ui +|----|----|----|----|----bios/cookie/description/_PWR.ui +|----|----|----|----|----bios/cookie/description/_SLM.ui +|----|----|----|----|----bios/cookie/description/_SND.ui +|----|----|----|----|----bios/cookie/description/_SWI.ui +|----|----|----|----|----bios/cookie/description/_T2W.ui +|----|----|----|----|----bios/cookie/description/_T30.ui +|----|----|----|----|----bios/cookie/description/_USB.ui +|----|----|----|----|----bios/cookie/description/_VDI.ui +|----|----|----|----|----bios/cookie/description/_VDO.ui +|----|----|----|----|----bios/cookie/description/__NF.ui +|----|----bios/vt52.u +|----|----bios/xbra.u +|----|----bios/bios_bsim.u +|----|----|----bios/bsim/bsim_id.ui +|----|----|----bios/bsim/drv_change.ui +|----|----|----bios/bsim/drvprotec.ui +|----|----|----bios/bsim/dstate.ui +|----|----|----bios/bsim/kill_disk.ui +|----|----|----bios/bsim/load_disk.ui +|----|----|----bios/bsim/save_disk.ui +|----|----bios/bios_f.u +|----|----bios/structures/structures.u +|----|----|----bios/structures/bpb.ui +|----|----|----bios/structures/md.ui +|----|----|----bios/structures/mpb.ui +|----|----|----bios/structures/patternrectdata.ui +|----|----|----bios/structures/pun_info.ui +|----|----|----bios/structures/solidrecdata.ui +|----xbios/xbios.u +|----|----xbios/bildscrm/bildscrm.u +|----|----|----xbios/bildscrm/cursconf.ui +|----|----|----xbios/bildscrm/egetpale.ui +|----|----|----xbios/bildscrm/egetshif.ui +|----|----|----xbios/bildscrm/esetbank.ui +|----|----|----xbios/bildscrm/esetcolo.ui +|----|----|----xbios/bildscrm/esetgray.ui +|----|----|----xbios/bildscrm/esetpale.ui +|----|----|----xbios/bildscrm/esetshif.ui +|----|----|----xbios/bildscrm/esetsmea.ui +|----|----|----xbios/bildscrm/getrez.ui +|----|----|----xbios/bildscrm/initmous.ui +|----|----|----xbios/bildscrm/logbase.ui +|----|----|----xbios/bildscrm/mon_type.ui +|----|----|----xbios/bildscrm/physbase.ui +|----|----|----xbios/bildscrm/setcolor.ui +|----|----|----xbios/bildscrm/setpalet.ui +|----|----|----xbios/bildscrm/setscree.ui +|----|----|----xbios/bildscrm/Setscreen_Milan.ui +|----|----|----xbios/bildscrm/Setscreen_ct60.ui +|----|----|----xbios/bildscrm/validmod.ui +|----|----|----xbios/bildscrm/vgetrgb.ui +|----|----|----xbios/bildscrm/vsetscre.ui +|----|----|----xbios/bildscrm/vgetsize.ui +|----|----|----xbios/bildscrm/vsetmask.ui +|----|----|----xbios/bildscrm/vsetmode.ui +|----|----|----xbios/bildscrm/vsetrgb.ui +|----|----|----xbios/bildscrm/vsetsync.ui +|----|----|----xbios/bildscrm/vsync.ui +|----|----|----xbios/bildscrm/bildscrm.ui +|----|----xbios/centscrn/centscrn.u +|----|----|----xbios/centscrn/multimon.ui +|----|----|----xbios/centscrn/setmon.ui +|----|----|----xbios/centscrn/sizecomp.ui +|----|----|----xbios/centscrn/vattrib.ui +|----|----|----xbios/centscrn/vclose.ui +|----|----|----xbios/centscrn/vcreate.ui +|----|----|----xbios/centscrn/vdelete.ui +|----|----|----xbios/centscrn/vfirst.ui +|----|----|----xbios/centscrn/vload.ui +|----|----|----xbios/centscrn/vlock.ui +|----|----|----xbios/centscrn/vnext.ui +|----|----|----xbios/centscrn/voffset.ui +|----|----|----xbios/centscrn/vopen.ui +|----|----|----xbios/centscrn/vread.ui +|----|----|----xbios/centscrn/vsave.ui +|----|----|----xbios/centscrn/vscroll.ui +|----|----|----xbios/centscrn/vseek.ui +|----|----|----xbios/centscrn/vsize.ui +|----|----|----xbios/centscrn/vvalid.ui +|----|----|----xbios/centscrn/vwrite.ui +|----|----xbios/crazydot/crazydot.u +|----|----|----xbios/crazydot/gscrdesc.ui +|----|----|----xbios/crazydot/resetscr.ui +|----|----|----xbios/crazydot/getnofpm.ui +|----|----|----xbios/crazydot/getpmode.ui +|----|----|----xbios/crazydot/readmode.ui +|----|----|----xbios/crazydot/cpmd2amd.ui +|----|----|----xbios/crazydot/acmodenr.ui +|----|----|----xbios/crazydot/gamddesc.ui +|----|----|----xbios/crazydot/gregbase.ui +|----|----|----xbios/crazydot/getfeat.ui +|----|----|----xbios/crazydot/getafeat.ui +|----|----xbios/ct60/ct60.u +|----|----|----xbios/ct60/cache.ui +|----|----|----xbios/ct60/fl_cache.ui +|----|----|----xbios/ct60/rcortemp.ui +|----|----|----xbios/ct60/rd_param.ui +|----|----|----xbios/ct60/ct60_vmalloc.ui +|----|----xbios/datetime/datetime.u +|----|----|----xbios/datetime/gettime.ui +|----|----|----xbios/datetime/nvmacces.ui +|----|----|----xbios/datetime/settime.ui +|----|----|----xbios/datetime/xbtimer.ui +|----|----|----xbios/datetime/datetime.ui +|----|----xbios/drucker/drucker.u +|----|----|----xbios/drucker/prtblk.ui +|----|----|----xbios/drucker/scrdmp.ui +|----|----|----xbios/drucker/setprt.ui +|----|----xbios/dsp56001/dsp56001.u +|----|----|----xbios/dsp56001/availabl.ui +|----|----|----xbios/dsp56001/blkbytes.ui +|----|----|----xbios/dsp56001/blkhndsh.ui +|----|----|----xbios/dsp56001/blkunpac.ui +|----|----|----xbios/dsp56001/blkwords.ui +|----|----|----xbios/dsp56001/doblock.ui +|----|----|----xbios/dsp56001/execboot.ui +|----|----|----xbios/dsp56001/execprog.ui +|----|----|----xbios/dsp56001/flushsub.ui +|----|----|----xbios/dsp56001/getproga.ui +|----|----|----xbios/dsp56001/getwords.ui +|----|----|----xbios/dsp56001/hf0.ui +|----|----|----xbios/dsp56001/hf1.ui +|----|----|----xbios/dsp56001/hf2.ui +|----|----|----xbios/dsp56001/hf3.ui +|----|----|----xbios/dsp56001/hstat.ui +|----|----|----xbios/dsp56001/inqsubra.ui +|----|----|----xbios/dsp56001/instream.ui +|----|----|----xbios/dsp56001/iostream.ui +|----|----|----xbios/dsp56001/loadprog.ui +|----|----|----xbios/dsp56001/loadsubr.ui +|----|----|----xbios/dsp56001/lock.ui +|----|----|----xbios/dsp56001/lodtobin.ui +|----|----|----xbios/dsp56001/multbloc.ui +|----|----|----xbios/dsp56001/outstrea.ui +|----|----|----xbios/dsp56001/removein.ui +|----|----|----xbios/dsp56001/requestu.ui +|----|----|----xbios/dsp56001/reserve.ui +|----|----|----xbios/dsp56001/runsubro.ui +|----|----|----xbios/dsp56001/setvecto.ui +|----|----|----xbios/dsp56001/triggerh.ui +|----|----|----xbios/dsp56001/unlock.ui +|----|----xbios/dhs/dhs.u +|----|----|----xbios/dhs/cyclesrd.ui +|----|----|----xbios/dhs/cyclesst.ui +|----|----|----xbios/dhs/frequenc.ui +|----|----|----xbios/dhs/debug.ui +|----|----|----xbios/dhs/debugui.ui +|----|----|----xbios/dhs/hatariop.ui +|----|----|----xbios/dhs/register.ui +|----|----xbios/interrpt/interrpt.u +|----|----|----xbios/interrpt/jdisint.ui +|----|----|----xbios/interrpt/jenabint.ui +|----|----xbios/laufwerk/laufwerk.u +|----|----|----xbios/laufwerk/dmaread.ui +|----|----|----xbios/laufwerk/dmawrite.ui +|----|----|----xbios/laufwerk/flopfmt.ui +|----|----|----xbios/laufwerk/floprate.ui +|----|----|----xbios/laufwerk/floprd.ui +|----|----|----xbios/laufwerk/flopver.ui +|----|----|----xbios/laufwerk/flopwr.ui +|----|----|----xbios/laufwerk/metaclos.ui +|----|----|----xbios/laufwerk/metadinf.ui +|----|----|----xbios/laufwerk/metagett.ui +|----|----|----xbios/laufwerk/metainit.ui +|----|----|----xbios/laufwerk/metaioct.ui +|----|----|----xbios/laufwerk/metaopen.ui +|----|----|----xbios/laufwerk/metaread.ui +|----|----|----xbios/laufwerk/metaseek.ui +|----|----|----xbios/laufwerk/metasets.ui +|----|----|----xbios/laufwerk/metastar.ui +|----|----|----xbios/laufwerk/metastat.ui +|----|----|----xbios/laufwerk/metastop.ui +|----|----|----xbios/laufwerk/metawrit.ui +|----|----|----xbios/laufwerk/protobt.ui +|----|----xbios/matrix/matrix.u +|----|----xbios/overscan/overscan.u +|----|----|----xbios/overscan/oscanis.ui +|----|----|----xbios/overscan/oscanpat.ui +|----|----|----xbios/overscan/oscanphy.ui +|----|----|----xbios/overscan/oscanscr.ui +|----|----|----xbios/overscan/oscanswi.ui +|----|----|----xbios/overscan/oscantab.ui +|----|----|----xbios/overscan/oscanvb.ui +|----|----xbios/pci_bios/pci_bios.u +|----|----|----xbios/pci_bios/bus_to_virt.ui +|----|----|----xbios/pci_bios/fast_read_config_byte.ui +|----|----|----xbios/pci_bios/fast_read_config_longword.ui +|----|----|----xbios/pci_bios/fast_read_config_word.ui +|----|----|----xbios/pci_bios/fast_read_io_byte.ui +|----|----|----xbios/pci_bios/fast_read_io_longword.ui +|----|----|----xbios/pci_bios/fast_read_io_word.ui +|----|----|----xbios/pci_bios/fast_read_mem_byte.ui +|----|----|----xbios/pci_bios/fast_read_mem_longword.ui +|----|----|----xbios/pci_bios/fast_read_mem_word.ui +|----|----|----xbios/pci_bios/fpclassc.ui +|----|----|----xbios/pci_bios/fpdevice.ui +|----|----|----xbios/pci_bios/get_card_used.ui +|----|----|----xbios/pci_bios/get_machine_id.ui +|----|----|----xbios/pci_bios/get_pagesize.ui +|----|----|----xbios/pci_bios/get_resource.ui +|----|----|----xbios/pci_bios/get_routing.ui +|----|----|----xbios/pci_bios/hook_interrupt.ui +|----|----|----xbios/pci_bios/phys_to_virt.ui +|----|----|----xbios/pci_bios/read_config_byte.ui +|----|----|----xbios/pci_bios/read_config_longword.ui +|----|----|----xbios/pci_bios/read_config_word.ui +|----|----|----xbios/pci_bios/read_io_byte.ui +|----|----|----xbios/pci_bios/read_io_longword.ui +|----|----|----xbios/pci_bios/read_io_word.ui +|----|----|----xbios/pci_bios/read_mem_byte.ui +|----|----|----xbios/pci_bios/read_mem_longword.ui +|----|----|----xbios/pci_bios/read_mem_word.ui +|----|----|----xbios/pci_bios/set_card_used.ui +|----|----|----xbios/pci_bios/set_interrupt.ui +|----|----|----xbios/pci_bios/special_cycle.ui +|----|----|----xbios/pci_bios/unhook_interrupt.ui +|----|----|----xbios/pci_bios/virt_to_bus.ui +|----|----|----xbios/pci_bios/virt_to_phys.ui +|----|----|----xbios/pci_bios/write_config_byte.ui +|----|----|----xbios/pci_bios/write_config_longword.ui +|----|----|----xbios/pci_bios/write_config_word.ui +|----|----|----xbios/pci_bios/write_io_byte.ui +|----|----|----xbios/pci_bios/write_io_longword.ui +|----|----|----xbios/pci_bios/write_io_word.ui +|----|----|----xbios/pci_bios/write_mem_byte.ui +|----|----|----xbios/pci_bios/write_mem_longword.ui +|----|----|----xbios/pci_bios/write_mem_word.ui +|----|----|----xbios/pci_bios/error.ui +|----|----xbios/intrface/intrface.u +|----|----|----xbios/intrface/bconmap.ui +|----|----|----xbios/intrface/dosound.ui +|----|----|----xbios/intrface/extrscon.ui +|----|----|----xbios/intrface/giaccess.ui +|----|----|----xbios/intrface/ikbdws.ui +|----|----|----xbios/intrface/iorec.ui +|----|----|----xbios/intrface/kbdvbase.ui +|----|----|----xbios/intrface/mfpint.ui +|----|----|----xbios/intrface/midiws.ui +|----|----|----xbios/intrface/offgibit.ui +|----|----|----xbios/intrface/ongibit.ui +|----|----|----xbios/intrface/rsconf.ui +|----|----xbios/sound/sound.u +|----|----|----xbios/sound/buffoper.ui +|----|----|----xbios/sound/buffptr.ui +|----|----|----xbios/sound/devconne.ui +|----|----|----xbios/sound/dsptrist.ui +|----|----|----xbios/sound/gpio.ui +|----|----|----xbios/sound/locksnd.ui +|----|----|----xbios/sound/setbuffe.ui +|----|----|----xbios/sound/setinter.ui +|----|----|----xbios/sound/setmode.ui +|----|----|----xbios/sound/setmontr.ui +|----|----|----xbios/sound/settrack.ui +|----|----|----xbios/sound/sndstatu.ui +|----|----|----xbios/sound/soundcmd.ui +|----|----|----xbios/sound/startrac.ui +|----|----|----|----xbios/startrac/installe.ui +|----|----|----|----xbios/startrac/cardslot.ui +|----|----|----|----xbios/startrac/cardsel.ui +|----|----|----|----xbios/startrac/cardmagi.ui +|----|----|----|----xbios/startrac/cardadr.ui +|----|----|----|----xbios/startrac/digana.ui +|----|----|----|----xbios/startrac/digcom.ui +|----|----|----|----xbios/startrac/dspmode.ui +|----|----|----|----xbios/startrac/sclock.ui +|----|----|----|----xbios/startrac/highsrat.ui +|----|----|----|----xbios/startrac/bypass.ui +|----|----|----|----xbios/startrac/recmode.ui +|----|----|----|----xbios/startrac/playmode.ui +|----|----|----|----xbios/startrac/mode24.ui +|----|----|----|----xbios/startrac/digmode.ui +|----|----|----|----xbios/startrac/scmsmode.ui +|----|----|----|----xbios/startrac/mycopybi.ui +|----|----|----|----xbios/startrac/emphasis.ui +|----|----|----|----xbios/startrac/digsrate.ui +|----|----|----|----xbios/startrac/digcode.ui +|----|----|----|----xbios/startrac/errorcod.ui +|----|----|----|----xbios/startrac/cblmode.ui +|----|----|----|----xbios/startrac/cblread.ui +|----|----|----|----xbios/startrac/recstat.ui +|----|----|----|----xbios/startrac/playstat.ui +|----|----|----|----xbios/startrac/volad.ui +|----|----|----|----xbios/startrac/volda.ui +|----|----|----|----xbios/startrac/readsmp.ui +|----|----|----|----xbios/startrac/writesmp.ui +|----|----|----|----xbios/startrac/intact.ui +|----|----|----|----xbios/startrac/dspintac.ui +|----|----|----|----xbios/startrac/sysreset.ui +|----|----|----|----xbios/startrac/dspreset.ui +|----|----|----|----xbios/startrac/dspmemor.ui +|----|----|----|----xbios/startrac/clkdivid.ui +|----|----|----|----xbios/startrac/pathset.ui +|----|----|----|----xbios/startrac/dsp_host.ui +|----|----|----|----xbios/startrac/dspclear.ui +|----|----|----|----xbios/startrac/mix.ui +|----|----|----|----xbios/startrac/dspmix.ui +|----|----|----|----xbios/startrac/monitor.ui +|----|----|----|----xbios/startrac/recwait.ui +|----|----|----|----xbios/startrac/memrec.ui +|----|----|----|----xbios/startrac/memplay.ui +|----|----|----|----xbios/startrac/recplay.ui +|----|----|----|----xbios/startrac/hardrec.ui +|----|----|----|----xbios/startrac/hardplay.ui +|----|----|----|----xbios/startrac/hrecplay.ui +|----|----|----|----xbios/startrac/init_pea.ui +|----|----|----|----xbios/startrac/init_ime.ui +|----|----|----|----xbios/startrac/init_ipl.ui +|----|----|----|----xbios/startrac/init_ipm.ui +|----|----|----|----xbios/startrac/init_hre.ui +|----|----|----|----xbios/startrac/init_hpl.ui +|----|----|----|----xbios/startrac/init_hpm.ui +|----|----|----|----xbios/startrac/init_mrp.ui +|----|----|----|----xbios/startrac/init_mpp.ui +|----|----|----|----xbios/startrac/init_mpk.ui +|----|----|----|----xbios/startrac/init_hrp.ui +|----|----|----|----xbios/startrac/init_hpp.ui +|----|----|----|----xbios/startrac/init_hpk.ui +|----|----|----|----xbios/startrac/init_xmr.ui +|----|----|----|----xbios/startrac/init_xmp.ui +|----|----|----|----xbios/startrac/init_xxp.ui +|----|----|----|----xbios/startrac/init_xr4.ui +|----|----|----|----xbios/startrac/init_xp4.ui +|----|----|----|----xbios/startrac/peakshak.ui +|----|----|----|----xbios/startrac/read_rlo.ui +|----|----|----|----xbios/startrac/read_rhi.ui +|----|----|----|----xbios/startrac/read_rds.ui +|----|----|----|----xbios/startrac/read_rae.ui +|----|----|----|----xbios/startrac/read_rin.ui +|----|----|----|----xbios/startrac/wr_rlow.ui +|----|----|----|----xbios/startrac/wr_rhi.ui +|----|----|----|----xbios/startrac/wr_rdsp.ui +|----|----|----|----xbios/startrac/wr_raes.ui +|----|----|----|----xbios/startrac/wr_rint.ui +|----|----|----|----xbios/startrac/read_dp1.ui +|----|----|----|----xbios/startrac/read_dp2.ui +|----|----|----|----xbios/startrac/read_dpo.ui +|----|----|----|----xbios/startrac/read_dco.ui +|----|----|----|----xbios/startrac/read_dpd.ui +|----|----|----|----xbios/startrac/read_dcl.ui +|----|----|----|----xbios/startrac/wr_dpat1.ui +|----|----|----|----xbios/startrac/wr_dpat2.ui +|----|----|----|----xbios/startrac/wr_dport.ui +|----|----|----|----xbios/startrac/wr_dconv.ui +|----|----|----|----xbios/startrac/wr_dpdat.ui +|----|----|----|----xbios/startrac/wr_dclk.ui +|----|----|----|----xbios/startrac/fastcut.ui +|----|----|----|----xbios/startrac/peaksuch.ui +|----|----|----|----xbios/startrac/zerono.ui +|----|----|----|----xbios/startrac/fading.ui +|----|----|----xbios/sound/unlocksn.ui +|----|----|----xbios/sound/waveplay.ui +|----|----xbios/spezial/spezial.u +|----|----|----xbios/spezial/blitmode.ui +|----|----|----xbios/spezial/cachectr.ui +|----|----|----xbios/spezial/cjar.ui +|----|----|----xbios/spezial/dbmsg.ui +|----|----|----xbios/spezial/janus.ui +|----|----|----xbios/spezial/puntaes.ui +|----|----|----xbios/spezial/random.ui +|----|----|----xbios/spezial/ssbrk.ui +|----|----|----xbios/spezial/supexec.ui +|----|----|----xbios/spezial/trapper.ui +|----|----|----xbios/spezial/wdgctrl.ui +|----|----xbios/tastatur/tastatur.u +|----|----|----xbios/tastatur/bioskeys.ui +|----|----|----xbios/tastatur/kbrate.ui +|----|----|----xbios/tastatur/keytbl.ui +|----|----xbios/vidix/vidix.u +|----|----|----xbios/vidix/vdxconfigplayback.ui +|----|----|----xbios/vidix/vdxdestroy.ui +|----|----|----xbios/vidix/vdxgetcapability.ui +|----|----|----xbios/vidix/vdxgetgrkeys.ui +|----|----|----xbios/vidix/vdxgetversion.ui +|----|----|----xbios/vidix/vdxinit.ui +|----|----|----xbios/vidix/vdxplaybackcopyframe.ui +|----|----|----xbios/vidix/vdxplaybackframeselect.ui +|----|----|----xbios/vidix/vdxplaybackgetdeint.ui +|----|----|----xbios/vidix/vdxplaybackgeteq.ui +|----|----|----xbios/vidix/vdxplaybackoff.ui +|----|----|----xbios/vidix/vdxplaybackon.ui +|----|----|----xbios/vidix/vdxplaybacksetdeint.ui +|----|----|----xbios/vidix/vdxplaybackseteq.ui +|----|----|----xbios/vidix/vdxprobe.ui +|----|----|----xbios/vidix/vdxquerydmastatus.ui +|----|----|----xbios/vidix/vdxqueryfourcc.ui +|----|----|----xbios/vidix/vdxsetgrkeys.ui +|----|----xbios/xbios_f.u +|----|----xbios/structures/structures.u +|----|----|----xbios/structures/bconmap.ui +|----|----|----xbios/structures/CD_DISC_INFO.ui +|----|----|----xbios/structures/CD_TOC_ENTRY.ui +|----|----|----xbios/structures/DSPBLOCK.ui +|----|----|----xbios/structures/IOREC.ui +|----|----|----xbios/structures/KEYBDPARMS.ui +|----|----|----xbios/structures/KBDVBASE.ui +|----|----|----xbios/structures/KEYTAB.ui +|----|----|----xbios/structures/MAPTAB.ui +|----|----|----xbios/structures/META_DRVINFO.ui +|----|----|----xbios/structures/META_INFO_1.ui +|----|----|----xbios/structures/META_INFO_2.ui +|----|----|----xbios/structures/MOD_DESC.ui +|----|----|----xbios/structures/MOUSE.ui +|----|----|----xbios/structures/OVERPATCH.ui +|----|----|----xbios/structures/PBDEF.ui +|----|----|----xbios/structures/PCI_RSC_DESC.ui +|----|----|----xbios/structures/PMODE.ui +|----|----|----xbios/structures/SCRCLIPMEMBLK.ui +|----|----|----xbios/structures/SCRCOPYMEMBLK.ui +|----|----|----xbios/structures/SCREEN.ui +|----|----|----xbios/structures/SCREENINFO.ui +|----|----|----xbios/structures/SCREEN_OverScan.ui +|----|----|----xbios/structures/SCRFILLMEMBLK.ui +|----|----|----xbios/structures/SCRLINEMEMBLK.ui +|----|----|----xbios/structures/SCRMEMBLK.ui +|----|----|----xbios/structures/SCRTEXTUREMEMBLK.ui +|----|----|----xbios/structures/VDO_MODE.ui +|----|----|----xbios/structures/VDO_PARAM.ui +|----|----|----xbios/structures/vidix_capability.ui +|----|----|----xbios/structures/vidix_deinterlace.ui +|----|----|----xbios/structures/vidix_dma.ui +|----|----|----xbios/structures/vidix_fourcc.ui +|----|----|----xbios/structures/vidix_grkey.ui +|----|----|----xbios/structures/vidix_playback.ui +|----|----|----xbios/structures/vidix_video_eq.ui +|----|----|----xbios/structures/VPOS.ui +|----gemdos/gemdos.u +|----|----gemdos/filesys.u +|----|----gemdos/signale.u +|----|----gemdos/file/file.u +|----|----|----gemdos/file/fattrib.ui +|----|----|----gemdos/file/fchdir.ui +|----|----|----gemdos/file/fchmod.ui +|----|----|----gemdos/file/fchown.ui +|----|----|----gemdos/file/fchown16.ui +|----|----|----gemdos/file/fclose.ui +|----|----|----gemdos/file/fcntl.ui +|----|----|----gemdos/file/fcreate.ui +|----|----|----gemdos/file/fdatime.ui +|----|----|----gemdos/file/fdelete.ui +|----|----|----gemdos/file/fdirfd.ui +|----|----|----gemdos/file/fdup.ui +|----|----|----gemdos/file/ffchmod.ui +|----|----|----gemdos/file/ffchown.ui +|----|----|----gemdos/file/ffdopendir.ui +|----|----|----gemdos/file/fforce.ui +|----|----|----gemdos/file/ffstat64.ui +|----|----|----gemdos/file/fgetchar.ui +|----|----|----gemdos/file/fgetdta.ui +|----|----|----gemdos/file/finstat.ui +|----|----|----gemdos/file/flink.ui +|----|----|----gemdos/file/flock.ui +|----|----|----gemdos/file/fmidipip.ui +|----|----|----gemdos/file/fopen.ui +|----|----|----gemdos/file/foutstat.ui +|----|----|----gemdos/file/fpipe.ui +|----|----|----gemdos/file/fpoll.ui +|----|----|----gemdos/file/fputchar.ui +|----|----|----gemdos/file/fread.ui +|----|----|----gemdos/file/freadlin.ui +|----|----|----gemdos/file/frename.ui +|----|----|----gemdos/file/fseek.ui +|----|----|----gemdos/file/fseek64.ui +|----|----|----gemdos/file/fselect.ui +|----|----|----gemdos/file/fsetdta.ui +|----|----|----gemdos/file/fsfirst.ui +|----|----|----gemdos/file/fsnext.ui +|----|----|----gemdos/file/fsymlink.ui +|----|----|----gemdos/file/fstat64.ui +|----|----|----gemdos/file/fsync.ui +|----|----|----gemdos/file/fwrite.ui +|----|----|----gemdos/file/fxattr.ui +|----|----gemdos/datetime/datetime.u +|----|----|----gemdos/datetime/tadjtime.ui +|----|----|----gemdos/datetime/talarm.ui +|----|----|----gemdos/datetime/tgetdate.ui +|----|----|----gemdos/datetime/tgettime.ui +|----|----|----gemdos/datetime/tgettofd.ui +|----|----|----gemdos/datetime/tmalarm.ui +|----|----|----gemdos/datetime/tsetdate.ui +|----|----|----gemdos/datetime/tsetitim.ui +|----|----|----gemdos/datetime/tsettime.ui +|----|----|----gemdos/datetime/tsettofd.ui +|----|----gemdos/prozess/prozess.u +|----|----|----gemdos/prozess/pause.ui +|----|----|----gemdos/prozess/pdomain.ui +|----|----|----gemdos/prozess/pexec.ui +|----|----|----gemdos/prozess/pfork.ui +|----|----|----gemdos/prozess/pgetauid.ui +|----|----|----gemdos/prozess/pgetegid.ui +|----|----|----gemdos/prozess/pgeteuid.ui +|----|----|----gemdos/prozess/pgetgid.ui +|----|----|----gemdos/prozess/pgetgrou.ui +|----|----|----gemdos/prozess/pgetpgrp.ui +|----|----|----gemdos/prozess/pgetpid.ui +|----|----|----gemdos/prozess/pgetppid.ui +|----|----|----gemdos/prozess/pgetprio.ui +|----|----|----gemdos/prozess/pgetuid.ui +|----|----|----gemdos/prozess/pkill.ui +|----|----|----gemdos/prozess/pmsg.ui +|----|----|----gemdos/prozess/pnice.ui +|----|----|----gemdos/prozess/prenice.ui +|----|----|----gemdos/prozess/prusage.ui +|----|----|----gemdos/prozess/psemapho.ui +|----|----|----gemdos/prozess/psetauid.ui +|----|----|----gemdos/prozess/psetegid.ui +|----|----|----gemdos/prozess/pseteuid.ui +|----|----|----gemdos/prozess/psetgid.ui +|----|----|----gemdos/prozess/psetgrou.ui +|----|----|----gemdos/prozess/psetlimi.ui +|----|----|----gemdos/prozess/psetpgrp.ui +|----|----|----gemdos/prozess/psetprio.ui +|----|----|----gemdos/prozess/psetregi.ui +|----|----|----gemdos/prozess/psetreui.ui +|----|----|----gemdos/prozess/psetuid.ui +|----|----|----gemdos/prozess/psigacti.ui +|----|----|----gemdos/prozess/psigbloc.ui +|----|----|----gemdos/prozess/psigintr.ui +|----|----|----gemdos/prozess/psignal.ui +|----|----|----gemdos/prozess/psigpaus.ui +|----|----|----gemdos/prozess/psigpend.ui +|----|----|----gemdos/prozess/psigretu.ui +|----|----|----gemdos/prozess/psigsetm.ui +|----|----|----gemdos/prozess/psysctl.ui +|----|----|----gemdos/prozess/pterm.ui +|----|----|----gemdos/prozess/pterm0.ui +|----|----|----gemdos/prozess/ptermres.ui +|----|----|----gemdos/prozess/ptrace.ui +|----|----|----gemdos/prozess/pumask.ui +|----|----|----gemdos/prozess/pusrval.ui +|----|----|----gemdos/prozess/pvfork.ui +|----|----|----gemdos/prozess/pwait.ui +|----|----|----gemdos/prozess/pwait3.ui +|----|----|----gemdos/prozess/pwaitpid.ui +|----|----gemdos/memory/memory.u +|----|----|----gemdos/memory/maccess.ui +|----|----|----gemdos/memory/maddalt.ui +|----|----|----gemdos/memory/malloc.ui +|----|----|----gemdos/memory/mfree.ui +|----|----|----gemdos/memory/mshrink.ui +|----|----|----gemdos/memory/mvalidate.ui +|----|----|----gemdos/memory/mxalloc.ui +|----|----gemdos/network/network.u +|----|----|----gemdos/network/fflush.ui +|----|----|----gemdos/network/flock.ui +|----|----|----gemdos/network/frlock.ui +|----|----|----gemdos/network/frunlock.ui +|----|----|----gemdos/network/funlock.ui +|----|----|----gemdos/network/Nversion.ui +|----|----gemdos/system/system.u +|----|----|----gemdos/system/salert.ui +|----|----|----gemdos/system/sconfig.ui +|----|----|----gemdos/system/scookie.ui +|----|----|----gemdos/system/shutdown.ui +|----|----|----gemdos/system/slbclose.ui +|----|----|----gemdos/system/slbopen.ui +|----|----|----gemdos/system/srealloc.ui +|----|----|----gemdos/system/ssystem.ui +|----|----|----gemdos/system/stefcntr.ui +|----|----|----gemdos/system/super.ui +|----|----|----gemdos/system/suptime.ui +|----|----|----gemdos/system/sversion.ui +|----|----|----gemdos/system/syield.ui +|----|----|----gemdos/system/sync.ui +|----|----|----gemdos/system/sysconf.ui +|----|----gemdos/dir/dir.u +|----|----|----gemdos/dir/dchroot.ui +|----|----|----gemdos/dir/dclosedi.ui +|----|----|----gemdos/dir/dcntl.ui +|----|----|----gemdos/dir/dcreate.ui +|----|----|----gemdos/dir/ddelete.ui +|----|----|----gemdos/dir/dfree.ui +|----|----|----gemdos/dir/dgetcwd.ui +|----|----|----gemdos/dir/dgetdrv.ui +|----|----|----gemdos/dir/dgetpath.ui +|----|----|----gemdos/dir/dlock.ui +|----|----|----gemdos/dir/dopendir.ui +|----|----|----gemdos/dir/dpathcon.ui +|----|----|----gemdos/dir/dreaddir.ui +|----|----|----gemdos/dir/dreadlab.ui +|----|----|----gemdos/dir/drewindd.ui +|----|----|----gemdos/dir/dsetdrv.ui +|----|----|----gemdos/dir/dsetkey.ui +|----|----|----gemdos/dir/dsetpath.ui +|----|----|----gemdos/dir/dwritela.ui +|----|----|----gemdos/dir/dxopendir.ui +|----|----|----gemdos/dir/dxreaddi.ui +|----|----gemdos/chrinout/chrinout.u +|----|----|----gemdos/chrinout/cauxin.ui +|----|----|----gemdos/chrinout/cauxis.ui +|----|----|----gemdos/chrinout/cauxos.ui +|----|----|----gemdos/chrinout/cauxout.ui +|----|----|----gemdos/chrinout/cconin.ui +|----|----|----gemdos/chrinout/cconis.ui +|----|----|----gemdos/chrinout/cconos.ui +|----|----|----gemdos/chrinout/cconout.ui +|----|----|----gemdos/chrinout/cconrs.ui +|----|----|----gemdos/chrinout/cconws.ui +|----|----|----gemdos/chrinout/cnecin.ui +|----|----|----gemdos/chrinout/cprnos.ui +|----|----|----gemdos/chrinout/cprnout.ui +|----|----|----gemdos/chrinout/crawcin.ui +|----|----|----gemdos/chrinout/crawio.ui +|----|----gemdos/mintnet/mintnet.u +|----|----|----gemdos/mintnet/fwritev.ui +|----|----|----gemdos/mintnet/freadv.ui +|----|----|----gemdos/mintnet/fsocket.ui +|----|----|----gemdos/mintnet/fsocketpair.ui +|----|----|----gemdos/mintnet/faccept.ui +|----|----|----gemdos/mintnet/fconnect.ui +|----|----|----gemdos/mintnet/fbind.ui +|----|----|----gemdos/mintnet/flisten.ui +|----|----|----gemdos/mintnet/frecvmsg.ui +|----|----|----gemdos/mintnet/fsendmsg.ui +|----|----|----gemdos/mintnet/frecvfrom.ui +|----|----|----gemdos/mintnet/fsendto.ui +|----|----|----gemdos/mintnet/fsetsockopt.ui +|----|----|----gemdos/mintnet/fgetsockopt.ui +|----|----|----gemdos/mintnet/fgetpeername.ui +|----|----|----gemdos/mintnet/fgetsockname.ui +|----|----|----gemdos/mintnet/fshutdown.ui +|----|----gemdos/argv.u +|----|----gemdos/c_task.u +|----|----gemdos/bionet.u +|----|----gemdos/powerdos.u +|----|----gemdos/tekbios.u +|----|----gemdos/gemdos_f.u +|----|----gemdos/structures/structures.u +|----|----|----gemdos/structures/cdrom.ui +|----|----|----gemdos/structures/cdrom_audioctrl.ui +|----|----|----gemdos/structures/cdrom_mcn.ui +|----|----|----gemdos/structures/cdrom_msf.ui +|----|----|----gemdos/structures/cdrom_read.ui +|----|----|----gemdos/structures/cdrom_subchnl.ui +|----|----|----gemdos/structures/cdrom_ti.ui +|----|----|----gemdos/structures/cdrom_tisrc.ui +|----|----|----gemdos/structures/cdrom_tocentry.ui +|----|----|----gemdos/structures/cdrom_tochdr.ui +|----|----|----gemdos/structures/cdrom_volctrl.ui +|----|----|----gemdos/structures/cd_ad.ui +|----|----|----gemdos/structures/DISKINFO.ui +|----|----|----gemdos/structures/DOSTIME.ui +|----|----|----gemdos/structures/DOSVARS.ui +|----|----|----gemdos/structures/DTA.ui +|----|----|----gemdos/structures/fcookie.ui +|----|----|----gemdos/structures/FILEPTR.ui +|----|----|----gemdos/structures/flock.ui +|----|----|----gemdos/structures/iovec.ui +|----|----|----gemdos/structures/LINE.ui +|----|----|----gemdos/structures/ltchars.ui +|----|----|----gemdos/structures/msghdr.ui +|----|----|----gemdos/structures/mutimbuf.ui +|----|----|----gemdos/structures/PD.ui +|----|----|----gemdos/structures/POLLFD.ui +|----|----|----gemdos/structures/ploadinfo.ui +|----|----|----gemdos/structures/sgttyb.ui +|----|----|----gemdos/structures/sigaction.ui +|----|----|----gemdos/structures/sockaddr.ui +|----|----|----gemdos/structures/STAT.ui +|----|----|----gemdos/structures/tchars.ui +|----|----|----gemdos/structures/timeval.ui +|----|----|----gemdos/structures/timezone.ui +|----|----|----gemdos/structures/tty.ui +|----|----|----gemdos/structures/winsize.ui +|----|----|----gemdos/structures/XATTR.ui +|----|----|----gemdos/structures/xkey.ui +|----linea/linea.u +|----|----linea/init.ui +|----|----linea/putpixel.ui +|----|----linea/getpixel.ui +|----|----linea/line.ui +|----|----linea/hline.ui +|----|----linea/fillrect.ui +|----|----linea/fillpoly.ui +|----|----linea/bitblt.ui +|----|----linea/textblt.ui +|----|----linea/shmouse.ui +|----|----linea/hdmouse.ui +|----|----linea/trmouse.ui +|----|----linea/udrsprit.ui +|----|----linea/drsprite.ui +|----|----linea/cpraster.ui +|----|----linea/seedfill.ui +|----gem/vdi/vdi.u +|----|----gem/vdi/assign_sys.ui +|----|----gem/vdi/metafile.u +|----|----gem/vdi/structures/vdipb.ui +|----|----gem/vdi/attribut/attribut.u +|----|----|----gem/vdi/attribut/bitmap/bitmap.u +|----|----|----gem/vdi/attribut/fill/fill.u +|----|----|----gem/vdi/attribut/linien/lines.u +|----|----|----gem/vdi/attribut/marker/marker.u +|----|----|----gem/vdi/attribut/text/text.u +|----|----|----gem/vdi/attribut/uebergeordnete/superior.u +|----|----|----gem/vdi/attribut/bitmap/vsr_bg_color.ui +|----|----|----gem/vdi/attribut/bitmap/vsr_fg_color.ui +|----|----|----gem/vdi/attribut/fill/filltypes.ui +|----|----|----gem/vdi/attribut/fill/vsf_bg_color.ui +|----|----|----gem/vdi/attribut/fill/vsf_color.ui +|----|----|----gem/vdi/attribut/fill/vsf_fg_color.ui +|----|----|----gem/vdi/attribut/fill/vsf_interior.ui +|----|----|----gem/vdi/attribut/fill/vsf_perimeter.ui +|----|----|----gem/vdi/attribut/fill/vsf_style.ui +|----|----|----gem/vdi/attribut/fill/vsf_udpat.ui +|----|----|----gem/vdi/attribut/fill/vsf_xperimeter.ui +|----|----|----gem/vdi/attribut/linien/vsl_bg_color.ui +|----|----|----gem/vdi/attribut/linien/vsl_color.ui +|----|----|----gem/vdi/attribut/linien/vsl_ends.ui +|----|----|----gem/vdi/attribut/linien/vsl_fg_color.ui +|----|----|----gem/vdi/attribut/linien/vsl_type.ui +|----|----|----gem/vdi/attribut/linien/vsl_udsty.ui +|----|----|----gem/vdi/attribut/linien/vsl_width.ui +|----|----|----gem/vdi/attribut/linien/v_bez_qual.ui +|----|----|----gem/vdi/attribut/marker/vsm_bg_color.ui +|----|----|----gem/vdi/attribut/marker/vsm_color.ui +|----|----|----gem/vdi/attribut/marker/vsm_fg_color.ui +|----|----|----gem/vdi/attribut/marker/vsm_height.ui +|----|----|----gem/vdi/attribut/marker/vsm_type.ui +|----|----|----gem/vdi/attribut/text/vst_alignment.ui +|----|----|----gem/vdi/attribut/text/vst_arbpt.ui +|----|----|----gem/vdi/attribut/text/vst_arbpt32.ui +|----|----|----gem/vdi/attribut/text/vst_bg_color.ui +|----|----|----gem/vdi/attribut/text/vst_charmap.ui +|----|----|----gem/vdi/attribut/text/vst_color.ui +|----|----|----gem/vdi/attribut/text/vst_effects.ui +|----|----|----gem/vdi/attribut/text/vst_error.ui +|----|----|----gem/vdi/attribut/text/vst_fg_color.ui +|----|----|----gem/vdi/attribut/text/vst_font.ui +|----|----|----gem/vdi/attribut/text/vst_height.ui +|----|----|----gem/vdi/attribut/text/vst_kern.ui +|----|----|----gem/vdi/attribut/text/vst_map_mode.ui +|----|----|----gem/vdi/attribut/text/vst_name.ui +|----|----|----gem/vdi/attribut/text/vst_point.ui +|----|----|----gem/vdi/attribut/text/vst_rotation.ui +|----|----|----gem/vdi/attribut/text/vst_scratch.ui +|----|----|----gem/vdi/attribut/text/vst_setsize.ui +|----|----|----gem/vdi/attribut/text/vst_setsize32.ui +|----|----|----gem/vdi/attribut/text/vst_skew.ui +|----|----|----gem/vdi/attribut/text/vst_track_offset.ui +|----|----|----gem/vdi/attribut/text/vst_width.ui +|----|----|----gem/vdi/attribut/text/v_topbot.ui +|----|----|----gem/vdi/attribut/uebergeordnete/vswr_mode.ui +|----|----|----gem/vdi/attribut/uebergeordnete/vs_bkcolor.ui +|----|----|----gem/vdi/attribut/uebergeordnete/vs_color.ui +|----|----|----gem/vdi/attribut/uebergeordnete/vs_color2.ui +|----|----|----gem/vdi/attribut/uebergeordnete/vs_grayoverride.ui +|----|----|----gem/vdi/attribut/uebergeordnete/v_ps_halftone.ui +|----|----|----gem/vdi/attribut/uebergeordnete/v_setrgb.ui +|----|----|----gem/vdi/attribut/uebergeordnete/v_setrgbi.ui +|----|----gem/vdi/output/output.u +|----|----|----gem/vdi/output/vr_recfl.ui +|----|----|----gem/vdi/output/v_arc.ui +|----|----|----gem/vdi/output/v_bar.ui +|----|----|----gem/vdi/output/v_bez.ui +|----|----|----gem/vdi/output/v_bez_fill.ui +|----|----|----gem/vdi/output/v_cellarray.ui +|----|----|----gem/vdi/output/v_circle.ui +|----|----|----gem/vdi/output/v_contourfill.ui +|----|----|----gem/vdi/output/v_ellarc.ui +|----|----|----gem/vdi/output/v_ellipse.ui +|----|----|----gem/vdi/output/v_ellpie.ui +|----|----|----gem/vdi/output/v_etext.ui +|----|----|----gem/vdi/output/v_fillarea.ui +|----|----|----gem/vdi/output/v_ftext.ui +|----|----|----gem/vdi/output/v_ftext_offset.ui +|----|----|----gem/vdi/output/v_gtext.ui +|----|----|----gem/vdi/output/v_justified.ui +|----|----|----gem/vdi/output/v_pieslice.ui +|----|----|----gem/vdi/output/v_pline.ui +|----|----|----gem/vdi/output/v_pmarker.ui +|----|----|----gem/vdi/output/v_rbox.ui +|----|----|----gem/vdi/output/v_rfbox.ui +|----|----gem/vdi/inquire/inquire.u +|----|----|----gem/vdi/inquire/vqf_attributes.ui +|----|----|----gem/vdi/inquire/vqf_bg_color.ui +|----|----|----gem/vdi/inquire/vqf_fg_color.ui +|----|----|----gem/vdi/inquire/vqin_mode.ui +|----|----|----gem/vdi/inquire/vql_attributes.ui +|----|----|----gem/vdi/inquire/vql_bg_color.ui +|----|----|----gem/vdi/inquire/vql_fg_color.ui +|----|----|----gem/vdi/inquire/vqm_attributes.ui +|----|----|----gem/vdi/inquire/vqm_bg_color.ui +|----|----|----gem/vdi/inquire/vqm_fg_color.ui +|----|----|----gem/vdi/inquire/vqr_bg_color.ui +|----|----|----gem/vdi/inquire/vqr_fg_color.ui +|----|----|----gem/vdi/inquire/vqt_advance.ui +|----|----|----gem/vdi/inquire/vqt_advance32.ui +|----|----|----gem/vdi/inquire/vqt_attributes.ui +|----|----|----gem/vdi/inquire/vqt_bg_color.ui +|----|----|----gem/vdi/inquire/vqt_cachesize.ui +|----|----|----gem/vdi/inquire/vqt_char_index.ui +|----|----|----gem/vdi/inquire/vqt_devinfo.ui +|----|----|----gem/vdi/inquire/vqt_extent.ui +|----|----|----gem/vdi/inquire/vqt_ext_name.ui +|----|----|----gem/vdi/inquire/vqt_fg_color.ui +|----|----|----gem/vdi/inquire/vqt_fontheader.ui +|----|----|----gem/vdi/inquire/vqt_fontinfo.ui +|----|----|----gem/vdi/inquire/vqt_f_extent.ui +|----|----|----gem/vdi/inquire/vqt_get_table.ui +|----|----|----gem/vdi/inquire/vqt_justified.ui +|----|----|----gem/vdi/inquire/vqt_name.ui +|----|----|----gem/vdi/inquire/vqt_name_and_id.ui +|----|----|----gem/vdi/inquire/vqt_pairkern.ui +|----|----|----gem/vdi/inquire/vqt_real_extent.ui +|----|----|----gem/vdi/inquire/vqt_trackkern.ui +|----|----|----gem/vdi/inquire/vqt_width.ui +|----|----|----gem/vdi/inquire/vqt_xfntinfo.ui +|----|----|----gem/vdi/inquire/vq_cellarray.ui +|----|----|----gem/vdi/inquire/vq_color.ui +|----|----|----gem/vdi/inquire/vq_devinfo.ui +|----|----|----gem/vdi/inquire/vq_extnd.ui +|----|----|----gem/vdi/inquire/vq_ext_devinfo.ui +|----|----|----gem/vdi/inquire/vq_ptsinsz.ui +|----|----|----gem/vdi/inquire/vq_scrninfo.ui +|----|----|----gem/vdi/inquire/v_create_driver_info.ui +|----|----|----gem/vdi/inquire/v_delete_driver_info.ui +|----|----|----gem/vdi/inquire/v_getbitmap_info.ui +|----|----|----gem/vdi/inquire/v_get_driver_info.ui +|----|----|----gem/vdi/inquire/v_read_default_settings.ui +|----|----|----gem/vdi/inquire/v_write_default_settings.ui +|----|----|----gem/vdi/inquire/fontheader.ui +|----|----|----gem/vdi/inquire/disable_nvdi.ui +|----|----gem/vdi/input/input.u +|----|----|----gem/vdi/input/vex_butv.ui +|----|----|----gem/vdi/input/vex_curv.ui +|----|----|----gem/vdi/input/vex_motv.ui +|----|----|----gem/vdi/input/vex_timv.ui +|----|----|----gem/vdi/input/vex_wheelv.ui +|----|----|----gem/vdi/input/vq_key_s.ui +|----|----|----gem/vdi/input/vq_mouse.ui +|----|----|----gem/vdi/input/vrq_choice.ui +|----|----|----gem/vdi/input/vrq_locator.ui +|----|----|----gem/vdi/input/vrq_string.ui +|----|----|----gem/vdi/input/vrq_valuator.ui +|----|----|----gem/vdi/input/vsc_form.ui +|----|----|----gem/vdi/input/vsin_mode.ui +|----|----|----gem/vdi/input/vsm_choice.ui +|----|----|----gem/vdi/input/vsm_locator.ui +|----|----|----gem/vdi/input/vsm_string.ui +|----|----|----gem/vdi/input/vsm_valuator.ui +|----|----|----gem/vdi/input/v_hide_c.ui +|----|----|----gem/vdi/input/v_show_c.ui +|----|----gem/vdi/escape/escape.u +|----|----|----gem/vdi/escape/graphic/graphic.u +|----|----|----|----gem/vdi/escape/graphic/vq_bit_image.ui +|----|----|----|----gem/vdi/escape/graphic/vq_calibrate.ui +|----|----|----|----gem/vdi/escape/graphic/vq_driver_info.ui +|----|----|----|----gem/vdi/escape/graphic/vq_driver_name.ui +|----|----|----|----gem/vdi/escape/graphic/vq_image_type.ui +|----|----|----|----gem/vdi/escape/graphic/vq_margins.ui +|----|----|----|----gem/vdi/escape/graphic/vq_page_name.ui +|----|----|----|----gem/vdi/escape/graphic/vq_prn_scaling.ui +|----|----|----|----gem/vdi/escape/graphic/vq_scan.ui +|----|----|----|----gem/vdi/escape/graphic/vq_tabstatus.ui +|----|----|----|----gem/vdi/escape/graphic/vq_tray_names.ui +|----|----|----|----gem/vdi/escape/graphic/vs_calibrate.ui +|----|----|----|----gem/vdi/escape/graphic/vs_crop.ui +|----|----|----|----gem/vdi/escape/graphic/vs_document_info.ui +|----|----|----|----gem/vdi/escape/graphic/vs_load_disp_list.ui +|----|----|----|----gem/vdi/escape/graphic/vs_page_info.ui +|----|----|----|----gem/vdi/escape/graphic/vs_palette.ui +|----|----|----|----gem/vdi/escape/graphic/vs_save_disp_list.ui +|----|----|----|----gem/vdi/escape/graphic/v_bit_image.ui +|----|----|----|----gem/vdi/escape/graphic/v_clear_disp_list.ui +|----|----|----|----gem/vdi/escape/graphic/v_copies.ui +|----|----|----|----gem/vdi/escape/graphic/v_dspcur.ui +|----|----|----|----gem/vdi/escape/graphic/v_form_adv.ui +|----|----|----|----gem/vdi/escape/graphic/v_hardcopy.ui +|----|----|----|----gem/vdi/escape/graphic/v_orient.ui +|----|----|----|----gem/vdi/escape/graphic/v_output_window.ui +|----|----|----|----gem/vdi/escape/graphic/v_page_size.ui +|----|----|----|----gem/vdi/escape/graphic/v_rmcur.ui +|----|----|----|----gem/vdi/escape/graphic/v_tray.ui +|----|----|----|----gem/vdi/escape/graphic/v_xbit_image.ui +|----|----|----gem/vdi/escape/tablet/tablet.u +|----|----|----|----gem/vdi/escape/tablet/vq_tdimensions.ui +|----|----|----|----gem/vdi/escape/tablet/vt_alignment.ui +|----|----|----|----gem/vdi/escape/tablet/vt_axis.ui +|----|----|----|----gem/vdi/escape/tablet/vt_origin.ui +|----|----|----|----gem/vdi/escape/tablet/vt_resolution.ui +|----|----|----gem/vdi/escape/metafile/metafile.u +|----|----|----|----gem/vdi/escape/metafile/vm_coords.ui +|----|----|----|----gem/vdi/escape/metafile/vm_filename.ui +|----|----|----|----gem/vdi/escape/metafile/vm_pagesize.ui +|----|----|----|----gem/vdi/escape/metafile/v_meta_extents.ui +|----|----|----|----gem/vdi/escape/metafile/v_write_meta.ui +|----|----|----gem/vdi/escape/camera/camera.u +|----|----|----|----gem/vdi/escape/camera/vqp_error.ui +|----|----|----|----gem/vdi/escape/camera/vqp_filmname.ui +|----|----|----|----gem/vdi/escape/camera/vqp_films.ui +|----|----|----|----gem/vdi/escape/camera/vqp_state.ui +|----|----|----|----gem/vdi/escape/camera/vsc_expose.ui +|----|----|----|----gem/vdi/escape/camera/vsp_film.ui +|----|----|----|----gem/vdi/escape/camera/vsp_message.ui +|----|----|----|----gem/vdi/escape/camera/vsp_save.ui +|----|----|----|----gem/vdi/escape/camera/vsp_state.ui +|----|----|----gem/vdi/escape/sound/sound.u +|----|----|----|----gem/vdi/escape/sound/vmid_load.ui +|----|----|----|----gem/vdi/escape/sound/vmid_play.ui +|----|----|----|----gem/vdi/escape/sound/vmid_unload.ui +|----|----|----|----gem/vdi/escape/sound/vqspl_position_d2d.ui +|----|----|----|----gem/vdi/escape/sound/vqspl_position_dma.ui +|----|----|----|----gem/vdi/escape/sound/vqspl_status_d2d.ui +|----|----|----|----gem/vdi/escape/sound/vqspl_status_dma.ui +|----|----|----|----gem/vdi/escape/sound/vqspl_time_left_d2d.ui +|----|----|----|----gem/vdi/escape/sound/vspl_load_d2d.ui +|----|----|----|----gem/vdi/escape/sound/vspl_load_sample.ui +|----|----|----|----gem/vdi/escape/sound/vspl_make_d2d.ui +|----|----|----|----gem/vdi/escape/sound/vspl_pause_d2d.ui +|----|----|----|----gem/vdi/escape/sound/vspl_pause_dma.ui +|----|----|----|----gem/vdi/escape/sound/vspl_play.ui +|----|----|----|----gem/vdi/escape/sound/vspl_play_d2d.ui +|----|----|----|----gem/vdi/escape/sound/vspl_play_dma.ui +|----|----|----|----gem/vdi/escape/sound/vspl_stop_d2d.ui +|----|----|----|----gem/vdi/escape/sound/vspl_stop_dma.ui +|----|----|----|----gem/vdi/escape/sound/vspl_unload_d2d.ui +|----|----|----|----gem/vdi/escape/sound/vspl_unload_sample.ui +|----|----|----|----gem/vdi/escape/sound/vsspl_monitor_off.ui +|----|----|----|----gem/vdi/escape/sound/vsspl_monitor_on.ui +|----|----|----gem/vdi/escape/special/special.u +|----|----|----|----gem/vdi/escape/special/v_escape2000.ui +|----|----|----|----gem/vdi/escape/special/v_fontinit.ui +|----|----|----|----gem/vdi/escape/special/v_offset.ui +|----|----|----|----gem/vdi/escape/special/v_sound.ui +|----|----|----|----gem/vdi/escape/special/vs_mute.ui +|----|----|----gem/vdi/escape/text/text.u +|----|----|----|----gem/vdi/escape/text/vq_chcells.ui +|----|----|----|----gem/vdi/escape/text/vq_curaddress.ui +|----|----|----|----gem/vdi/escape/text/v_alpha_text.ui +|----|----|----|----gem/vdi/escape/text/v_curaddress.ui +|----|----|----|----gem/vdi/escape/text/v_curdown.ui +|----|----|----|----gem/vdi/escape/text/v_curhome.ui +|----|----|----|----gem/vdi/escape/text/v_curleft.ui +|----|----|----|----gem/vdi/escape/text/v_curright.ui +|----|----|----|----gem/vdi/escape/text/v_curtext.ui +|----|----|----|----gem/vdi/escape/text/v_curup.ui +|----|----|----|----gem/vdi/escape/text/v_eeol.ui +|----|----|----|----gem/vdi/escape/text/v_eeos.ui +|----|----|----|----gem/vdi/escape/text/v_enter_cur.ui +|----|----|----|----gem/vdi/escape/text/v_exit_cur.ui +|----|----|----|----gem/vdi/escape/text/v_rvoff.ui +|----|----|----|----gem/vdi/escape/text/v_rvon.ui +|----|----gem/vdi/colortable/colortable.u +|----|----|----gem/vdi/colortable/v_color2nearest.ui +|----|----|----gem/vdi/colortable/v_color2value.ui +|----|----|----gem/vdi/colortable/v_create_ctab.ui +|----|----|----gem/vdi/colortable/v_create_itab.ui +|----|----|----gem/vdi/colortable/v_ctab_idx2value.ui +|----|----|----gem/vdi/colortable/v_ctab_idx2vdi.ui +|----|----|----gem/vdi/colortable/v_ctab_vdi2idx.ui +|----|----|----gem/vdi/colortable/v_delete_ctab.ui +|----|----|----gem/vdi/colortable/v_delete_itab.ui +|----|----|----gem/vdi/colortable/v_get_ctab_id.ui +|----|----|----gem/vdi/colortable/v_value2color.ui +|----|----|----gem/vdi/colortable/vq_ctab.ui +|----|----|----gem/vdi/colortable/vq_ctab_entry.ui +|----|----|----gem/vdi/colortable/vq_ctab_id.ui +|----|----|----gem/vdi/colortable/vq_dflt_ctab.ui +|----|----|----gem/vdi/colortable/vq_px_format.ui +|----|----|----gem/vdi/colortable/vs_ctab.ui +|----|----|----gem/vdi/colortable/vs_ctab_entry.ui +|----|----|----gem/vdi/colortable/vs_dflt_ctab.ui +|----|----gem/vdi/control/control.u +|----|----|----gem/vdi/control/v_bez_off.ui +|----|----|----gem/vdi/control/v_bez_on.ui +|----|----|----gem/vdi/control/v_clrwk.ui +|----|----|----gem/vdi/control/v_clsbm.ui +|----|----|----gem/vdi/control/v_clsvwk.ui +|----|----|----gem/vdi/control/v_clswk.ui +|----|----|----gem/vdi/control/v_flushcache.ui +|----|----|----gem/vdi/control/v_getoutline.ui +|----|----|----gem/vdi/control/v_get_outline.ui +|----|----|----gem/vdi/control/v_killoutline.ui +|----|----|----gem/vdi/control/v_loadcache.ui +|----|----|----gem/vdi/control/v_load_cache.ui +|----|----|----gem/vdi/control/v_open_bm.ui +|----|----|----gem/vdi/control/v_opnbm.ui +|----|----|----gem/vdi/control/v_opnprn.ui +|----|----|----gem/vdi/control/v_opnvwk.ui +|----|----|----gem/vdi/control/v_opnwk.ui +|----|----|----gem/vdi/control/v_opnwk_pc_gem.ui +|----|----|----gem/vdi/control/v_pat_rotate.ui +|----|----|----gem/vdi/control/v_resize_bm.ui +|----|----|----gem/vdi/control/v_savecache.ui +|----|----|----gem/vdi/control/v_save_cache.ui +|----|----|----gem/vdi/control/v_set_app_buff.ui +|----|----|----gem/vdi/control/v_updwk.ui +|----|----|----gem/vdi/control/vs_clip.ui +|----|----|----gem/vdi/control/vst_ex_load_fonts.ui +|----|----|----gem/vdi/control/vst_load_fonts.ui +|----|----|----gem/vdi/control/vst_unload_fonts.ui +|----|----gem/vdi/raster/raster.u +|----|----|----gem/vdi/raster/v_get_pixel.ui +|----|----|----gem/vdi/raster/vq_hilite_color.ui +|----|----|----gem/vdi/raster/vq_max_color.ui +|----|----|----gem/vdi/raster/vq_min_color.ui +|----|----|----gem/vdi/raster/vq_weight_color.ui +|----|----|----gem/vdi/raster/vr_clip_rects32_by_dst.ui +|----|----|----gem/vdi/raster/vr_clip_rects32_by_src.ui +|----|----|----gem/vdi/raster/vr_clip_rects_by_dst.ui +|----|----|----gem/vdi/raster/vr_clip_rects_by_src.ui +|----|----|----gem/vdi/raster/vr_transfer_bits.ui +|----|----|----gem/vdi/raster/vr_trnfm.ui +|----|----|----gem/vdi/raster/vro_cpyfm.ui +|----|----|----gem/vdi/raster/vrt_cpyfm.ui +|----|----|----gem/vdi/raster/vs_hilite_color.ui +|----|----|----gem/vdi/raster/vs_max_color.ui +|----|----|----gem/vdi/raster/vs_min_color.ui +|----|----|----gem/vdi/raster/vs_weight_color.ui +|----|----gem/vdi/tcvdi/tcvdi.u +|----|----|----gem/vdi/tcvdi/vq_colors.ui +|----|----|----gem/vdi/tcvdi/vq_pixcol.ui +|----|----|----gem/vdi/tcvdi/vq_pixrgb.ui +|----|----|----gem/vdi/tcvdi/vrf_rgb.ui +|----|----|----gem/vdi/tcvdi/vrl_rgb.ui +|----|----|----gem/vdi/tcvdi/vrt_rgb.ui +|----|----|----gem/vdi/tcvdi/vrun_parallel.ui +|----|----|----gem/vdi/tcvdi/vrun_rect.ui +|----|----|----gem/vdi/tcvdi/vrun_triangle.ui +|----|----|----gem/vdi/tcvdi/vs_colors.ui +|----|----|----gem/vdi/tcvdi/vs_pixcol.ui +|----|----|----gem/vdi/tcvdi/vs_pixrgb.ui +|----|----|----gem/vdi/tcvdi/vsf_rgb.ui +|----|----|----gem/vdi/tcvdi/vsl_rgb.ui +|----|----|----gem/vdi/tcvdi/vst_rgb.ui +|----|----gem/vdi/vdi_f.u +|----|----gem/vdi/structures/structures.u +|----|----|----gem/vdi/structures/vdipb.ui +|----|----|----gem/vdi/structures/bit_image.ui +|----|----|----gem/vdi/structures/color_entry.ui +|----|----|----gem/vdi/structures/color_rgb.ui +|----|----|----gem/vdi/structures/color_tab.ui +|----|----|----gem/vdi/structures/fix31.ui +|----|----|----gem/vdi/structures/font_hdr.ui +|----|----|----gem/vdi/structures/gcbitmap.ui +|----|----|----gem/vdi/structures/mfdb.ui +|----|----|----gem/vdi/structures/point16.ui +|----|----|----gem/vdi/structures/point32.ui +|----|----|----gem/vdi/structures/pxyarray.ui +|----|----|----gem/vdi/structures/rect16.ui +|----|----|----gem/vdi/structures/rect32.ui +|----|----|----gem/vdi/structures/xfnt_info.ui +|----gem/aes/aes.u +|----|----gem/aes/toolbar.ui +|----|----gem/aes/structures/AESPB.ui +|----|----gem/aes/appl_/appl_.u +|----|----|----gem/aes/appl_/appl_bvset.ui +|----|----|----gem/aes/appl_/appl_control.ui +|----|----|----gem/aes/appl_/appl_exit.ui +|----|----|----gem/aes/appl_/appl_find.ui +|----|----|----gem/aes/appl_/appl_getinfo.ui +|----|----|----gem/aes/appl_/appl_getinfo_str.ui +|----|----|----gem/aes/appl_/appl_get_cicon.ui +|----|----|----gem/aes/appl_/appl_init.ui +|----|----|----gem/aes/appl_/appl_options.ui +|----|----|----gem/aes/appl_/appl_read.ui +|----|----|----gem/aes/appl_/appl_search.ui +|----|----|----gem/aes/appl_/appl_tplay.ui +|----|----|----gem/aes/appl_/appl_trecord.ui +|----|----|----gem/aes/appl_/appl_write.ui +|----|----|----gem/aes/appl_/appl_xbvget.ui +|----|----|----gem/aes/appl_/appl_xbvset.ui +|----|----|----gem/aes/appl_/appl_yield.ui +|----|----|----gem/aes/appl_/_appl_yield.ui +|----|----|----gem/aes/appl_/x_appl_flags.ui +|----|----|----gem/aes/appl_/x_appl_font.ui +|----|----|----gem/aes/appl_/x_appl_sleep.ui +|----|----|----gem/aes/appl_/x_appl_term.ui +|----|----|----gem/aes/appl_/x_appl_getinfo.ui +|----|----gem/aes/fsel_/fsel_.u +|----|----|----gem/aes/fsel_/fsel_boxinput.ui +|----|----|----gem/aes/fsel_/fsel_exinput.ui +|----|----|----gem/aes/fsel_/fsel_input.ui +|----|----|----gem/aes/fsel_/x_fsel_input.ui +|----|----gem/aes/pdlg_/pdlg_.u +|----|----|----gem/aes/pdlg_/pdlg_add_printers.ui +|----|----|----gem/aes/pdlg_/pdlg_add_sub_dialogs.ui +|----|----|----gem/aes/pdlg_/pdlg_close.ui +|----|----|----gem/aes/pdlg_/pdlg_create.ui +|----|----|----gem/aes/pdlg_/pdlg_delete.ui +|----|----|----gem/aes/pdlg_/pdlg_dflt_settings.ui +|----|----|----gem/aes/pdlg_/pdlg_do.ui +|----|----|----gem/aes/pdlg_/pdlg_evnt.ui +|----|----|----gem/aes/pdlg_/pdlg_free_settings.ui +|----|----|----gem/aes/pdlg_/pdlg_get_setsize.ui +|----|----|----gem/aes/pdlg_/pdlg_new_settings.ui +|----|----|----gem/aes/pdlg_/pdlg_open.ui +|----|----|----gem/aes/pdlg_/pdlg_remove_printers.ui +|----|----|----gem/aes/pdlg_/pdlg_remove_sub_dialogs.ui +|----|----|----gem/aes/pdlg_/pdlg_save_default_settings.ui +|----|----|----gem/aes/pdlg_/pdlg_update.ui +|----|----|----gem/aes/pdlg_/pdlg_use_settings.ui +|----|----|----gem/aes/pdlg_/pdlg_validate_settings.ui +|----|----|----gem/aes/pdlg_/use.ui +|----|----gem/aes/edit_/edit_.u +|----|----|----gem/aes/edit_/edit_close.ui +|----|----|----gem/aes/edit_/edit_create.ui +|----|----|----gem/aes/edit_/edit_cursor.ui +|----|----|----gem/aes/edit_/edit_delete.ui +|----|----|----gem/aes/edit_/edit_evnt.ui +|----|----|----gem/aes/edit_/edit_get_buf.ui +|----|----|----gem/aes/edit_/edit_get_colour.ui +|----|----|----gem/aes/edit_/edit_get_cursor.ui +|----|----|----gem/aes/edit_/edit_get_dirty.ui +|----|----|----gem/aes/edit_/edit_get_font.ui +|----|----|----gem/aes/edit_/edit_get_format.ui +|----|----|----gem/aes/edit_/edit_get_pos.ui +|----|----|----gem/aes/edit_/edit_get_scrollinfo.ui +|----|----|----gem/aes/edit_/edit_get_sel.ui +|----|----|----gem/aes/edit_/edit_open.ui +|----|----|----gem/aes/edit_/edit_resized.ui +|----|----|----gem/aes/edit_/edit_scroll.ui +|----|----|----gem/aes/edit_/edit_set_buf.ui +|----|----|----gem/aes/edit_/edit_set_colour.ui +|----|----|----gem/aes/edit_/edit_set_cursor.ui +|----|----|----gem/aes/edit_/edit_set_dirty.ui +|----|----|----gem/aes/edit_/edit_set_font.ui +|----|----|----gem/aes/edit_/edit_set_format.ui +|----|----|----gem/aes/edit_/edit_set_pos.ui +|----|----|----gem/aes/edit_/uses.ui +|----|----gem/aes/evnt_/evnt_.u +|----|----|----gem/aes/evnt_/evnt_button.ui +|----|----|----gem/aes/evnt_/evnt_dclick.ui +|----|----|----gem/aes/evnt_/evnt_keybd.ui +|----|----|----gem/aes/evnt_/evnt_mesag.ui +|----|----|----gem/aes/evnt_/evnt_mouse.ui +|----|----|----gem/aes/evnt_/evnt_multi.ui +|----|----|----gem/aes/evnt_/evnt_timer.ui +|----|----|----gem/aes/evnt_/messages/evnts.ui +|----|----|----|----gem/aes/evnt_/messages/evnts_de.ui +|----|----|----gem/aes/evnt_/messages/messages.u +|----|----|----|----gem/aes/evnt_/messages/description/cab.ui +|----|----|----|----gem/aes/evnt_/messages/description/geneva.ui +|----|----|----|----gem/aes/evnt_/messages/description/rsdaemon.ui +|----|----gem/aes/wdlg_/wdlg_.u +|----|----|----gem/aes/wdlg_/wdlg_close.ui +|----|----|----gem/aes/wdlg_/wdlg_create.ui +|----|----|----gem/aes/wdlg_/wdlg_delete.ui +|----|----|----gem/aes/wdlg_/wdlg_evnt.ui +|----|----|----gem/aes/wdlg_/wdlg_get_edit.ui +|----|----|----gem/aes/wdlg_/wdlg_get_handle.ui +|----|----|----gem/aes/wdlg_/wdlg_get_tree.ui +|----|----|----gem/aes/wdlg_/wdlg_get_udata.ui +|----|----|----gem/aes/wdlg_/wdlg_open.ui +|----|----|----gem/aes/wdlg_/wdlg_redraw.ui +|----|----|----gem/aes/wdlg_/wdlg_set_edit.ui +|----|----|----gem/aes/wdlg_/wdlg_set_iconify.ui +|----|----|----gem/aes/wdlg_/wdlg_set_size.ui +|----|----|----gem/aes/wdlg_/wdlg_set_tree.ui +|----|----|----gem/aes/wdlg_/wdlg_set_uniconify.ui +|----|----gem/aes/wind_/wind_.u +|----|----|----gem/aes/wind_/wind_apfind.ui +|----|----|----gem/aes/wind_/wind_calc.ui +|----|----|----gem/aes/wind_/wind_close.ui +|----|----|----gem/aes/wind_/wind_create.ui +|----|----|----gem/aes/wind_/wind_delete.ui +|----|----|----gem/aes/wind_/wind_draw.ui +|----|----|----gem/aes/wind_/wind_find.ui +|----|----|----gem/aes/wind_/wind_get.ui +|----|----|----gem/aes/wind_/wind_new.ui +|----|----|----gem/aes/wind_/wind_open.ui +|----|----|----gem/aes/wind_/wind_set.ui +|----|----|----|----gem/aes/wind_/wind_set/WF_TOPMOST.ui +|----|----|----gem/aes/wind_/wind_update.ui +|----|----|----gem/aes/wind_/wind_xget.ui +|----|----|----gem/aes/wind_/wind_xset.ui +|----|----|----gem/aes/wind_/x_wdial_change.ui +|----|----|----gem/aes/wind_/x_wdial_draw.ui +|----|----|----gem/aes/wind_/x_wind_calc.ui +|----|----|----gem/aes/wind_/x_wind_create.ui +|----|----|----gem/aes/wind_/x_wind_tree.ui +|----|----|----gem/aes/wind_/components.ui +|----|----|----gem/aes/wind_/wind_get_set.ui +|----|----|----gem/aes/wind_/wind_get_set_geneva.ui +|----|----gem/aes/fslx_/fslx_.u +|----|----|----gem/aes/fslx_/fslx_close.ui +|----|----|----gem/aes/fslx_/fslx_do.ui +|----|----|----gem/aes/fslx_/fslx_evnt.ui +|----|----|----gem/aes/fslx_/fslx_getnxtfile.ui +|----|----|----gem/aes/fslx_/fslx_open.ui +|----|----|----gem/aes/fslx_/fslx_set_flags.ui +|----|----|----gem/aes/fslx_/use.ui +|----|----gem/aes/form_/form_.u +|----|----|----gem/aes/form_/form_alert.ui +|----|----|----gem/aes/form_/form_button.ui +|----|----|----gem/aes/form_/form_center.ui +|----|----|----gem/aes/form_/form_dial.ui +|----|----|----gem/aes/form_/form_do.ui +|----|----|----gem/aes/form_/form_error.ui +|----|----|----gem/aes/form_/form_keybd.ui +|----|----|----gem/aes/form_/form_popup.ui +|----|----|----gem/aes/form_/form_wbutton.ui +|----|----|----gem/aes/form_/form_wkeybd.ui +|----|----|----gem/aes/form_/form_xdial.ui +|----|----|----gem/aes/form_/form_xdo.ui +|----|----|----gem/aes/form_/form_xerr.ui +|----|----|----gem/aes/form_/xfrm_popup.ui +|----|----|----gem/aes/form_/x_form_center.ui +|----|----|----gem/aes/form_/x_form_error.ui +|----|----|----gem/aes/form_/x_form_filename.ui +|----|----|----gem/aes/form_/x_form_mouse.ui +|----|----gem/aes/geneva_/geneva_.u +|----|----|----gem/aes/geneva_/x_help.ui +|----|----|----gem/aes/geneva_/x_malloc.ui +|----|----|----gem/aes/geneva_/x_mfree.ui +|----|----|----gem/aes/geneva_/x_mshrink.ui +|----|----|----gem/aes/geneva_/x_realloc.ui +|----|----|----gem/aes/geneva_/x_settings.ui +|----|----|----gem/aes/geneva_/x_sprintf.ui +|----|----|----gem/aes/geneva_/x_sscanf.ui +|----|----gem/aes/graf_/graf_.u +|----|----|----gem/aes/graf_/graf_dragbox.ui +|----|----|----gem/aes/graf_/graf_growbox.ui +|----|----|----gem/aes/graf_/graf_handle.ui +|----|----|----gem/aes/graf_/graf_mbox.ui +|----|----|----gem/aes/graf_/graf_mkstate.ui +|----|----|----gem/aes/graf_/graf_mouse.ui +|----|----|----gem/aes/graf_/graf_multirubber.ui +|----|----|----gem/aes/graf_/graf_rubberbox.ui +|----|----|----gem/aes/graf_/graf_shrinkbox.ui +|----|----|----gem/aes/graf_/graf_slidebox.ui +|----|----|----gem/aes/graf_/graf_watchbox.ui +|----|----|----gem/aes/graf_/graf_wwatchbox.ui +|----|----|----gem/aes/graf_/graf_xhandle.ui +|----|----|----gem/aes/graf_/x_graf_blit.ui +|----|----|----gem/aes/graf_/x_graf_rast2rez.ui +|----|----|----gem/aes/graf_/x_graf_rubberbox.ui +|----|----gem/aes/scrp_/scrp_.u +|----|----|----gem/aes/scrp_/scrp_clear.ui +|----|----|----gem/aes/scrp_/scrp_read.ui +|----|----|----gem/aes/scrp_/scrp_write.ui +|----|----|----gem/aes/scrp_/x_scrp_get.ui +|----|----gem/aes/lbox_/lbox_.u +|----|----|----gem/aes/lbox_/lbox_ascroll_to.ui +|----|----|----gem/aes/lbox_/lbox_bscroll_to.ui +|----|----|----gem/aes/lbox_/lbox_cnt_items.ui +|----|----|----gem/aes/lbox_/lbox_create.ui +|----|----|----gem/aes/lbox_/lbox_delete.ui +|----|----|----gem/aes/lbox_/lbox_do.ui +|----|----|----gem/aes/lbox_/lbox_free_items.ui +|----|----|----gem/aes/lbox_/lbox_free_list.ui +|----|----|----gem/aes/lbox_/lbox_get_afirst.ui +|----|----|----gem/aes/lbox_/lbox_get_avis.ui +|----|----|----gem/aes/lbox_/lbox_get_bentries.ui +|----|----|----gem/aes/lbox_/lbox_get_bfirst.ui +|----|----|----gem/aes/lbox_/lbox_get_bvis.ui +|----|----|----gem/aes/lbox_/lbox_get_idx.ui +|----|----|----gem/aes/lbox_/lbox_get_item.ui +|----|----|----gem/aes/lbox_/lbox_get_items.ui +|----|----|----gem/aes/lbox_/lbox_get_slct_idx.ui +|----|----|----gem/aes/lbox_/lbox_get_slct_item.ui +|----|----|----gem/aes/lbox_/lbox_get_tree.ui +|----|----|----gem/aes/lbox_/lbox_get_udata.ui +|----|----|----gem/aes/lbox_/lbox_set_asldr.ui +|----|----|----gem/aes/lbox_/lbox_set_bentries.ui +|----|----|----gem/aes/lbox_/lbox_set_bsldr.ui +|----|----|----gem/aes/lbox_/lbox_set_items.ui +|----|----|----gem/aes/lbox_/lbox_update.ui +|----|----|----gem/aes/lbox_/use.ui +|----|----|----gem/aes/lbox_/flags.ui +|----|----gem/aes/magic_/magic_.u +|----|----|----gem/aes/magic_/sys_set_getdisp.ui +|----|----|----gem/aes/magic_/sys_recalc_cicon_colours.ui +|----|----|----gem/aes/magic_/sys_set_editob.ui +|----|----|----gem/aes/magic_/sys_set_getfn.ui +|----|----|----gem/aes/magic_/sys_set_setfn.ui +|----|----|----gem/aes/magic_/sys_set_winframe_manager.ui +|----|----|----gem/aes/magic_/sys_set_appl_getinfo.ui +|----|----gem/aes/menu_/menu_.u +|----|----|----gem/aes/menu_/menu_attach.ui +|----|----|----gem/aes/menu_/menu_bar.ui +|----|----|----gem/aes/menu_/menu_click.ui +|----|----|----gem/aes/menu_/menu_icheck.ui +|----|----|----gem/aes/menu_/menu_ienable.ui +|----|----|----gem/aes/menu_/menu_istart.ui +|----|----|----gem/aes/menu_/menu_popup.ui +|----|----|----gem/aes/menu_/menu_register.ui +|----|----|----gem/aes/menu_/menu_settings.ui +|----|----|----gem/aes/menu_/menu_text.ui +|----|----|----gem/aes/menu_/menu_tnormal.ui +|----|----|----gem/aes/menu_/menu_unregister.ui +|----|----gem/aes/objc_/objc_.u +|----|----|----gem/aes/objc_/objc_add.ui +|----|----|----gem/aes/objc_/objc_change.ui +|----|----|----gem/aes/objc_/objc_delete.ui +|----|----|----gem/aes/objc_/objc_draw.ui +|----|----|----gem/aes/objc_/objc_edit.ui +|----|----|----gem/aes/objc_/objc_find.ui +|----|----|----gem/aes/objc_/objc_offset.ui +|----|----|----gem/aes/objc_/objc_order.ui +|----|----|----gem/aes/objc_/objc_sysvar.ui +|----|----|----gem/aes/objc_/objc_wchange.ui +|----|----|----gem/aes/objc_/objc_wdraw.ui +|----|----|----gem/aes/objc_/objc_wedit.ui +|----|----|----gem/aes/objc_/objc_xedit.ui +|----|----|----gem/aes/objc_/objc_xfind.ui +|----|----|----gem/aes/objc_/x_objc_edit.ui +|----|----gem/aes/proc_/proc_.u +|----|----|----gem/aes/proc_/proc_create.ui +|----|----|----gem/aes/proc_/proc_delete.ui +|----|----|----gem/aes/proc_/proc_info.ui +|----|----|----gem/aes/proc_/proc_malloc.ui +|----|----|----gem/aes/proc_/proc_mfree.ui +|----|----|----gem/aes/proc_/proc_run.ui +|----|----|----gem/aes/proc_/proc_setblock.ui +|----|----|----gem/aes/proc_/proc_shrink.ui +|----|----|----gem/aes/proc_/proc_switch.ui +|----|----gem/aes/prop_/prop_.u +|----|----|----gem/aes/prop_/prop_del.ui +|----|----|----gem/aes/prop_/prop_get.ui +|----|----|----gem/aes/prop_/prop_gui_get.ui +|----|----|----gem/aes/prop_/prop_gui_set.ui +|----|----|----gem/aes/prop_/prop_put.ui +|----|----gem/aes/rsrc_/rsrc_.u +|----|----|----gem/aes/rsrc_/rsrc_free.ui +|----|----|----gem/aes/rsrc_/rsrc_gaddr.ui +|----|----|----gem/aes/rsrc_/rsrc_load.ui +|----|----|----gem/aes/rsrc_/rsrc_obfix.ui +|----|----|----gem/aes/rsrc_/rsrc_rcfix.ui +|----|----|----gem/aes/rsrc_/rsrc_saddr.ui +|----|----gem/aes/shel_/shel_.u +|----|----|----gem/aes/shel_/shel_envrn.ui +|----|----|----gem/aes/shel_/shel_find.ui +|----|----|----gem/aes/shel_/shel_get.ui +|----|----|----gem/aes/shel_/shel_help.ui +|----|----|----gem/aes/shel_/shel_put.ui +|----|----|----gem/aes/shel_/shel_rdef.ui +|----|----|----gem/aes/shel_/shel_read.ui +|----|----|----gem/aes/shel_/shel_wdef.ui +|----|----|----gem/aes/shel_/shel_write.ui +|----|----|----gem/aes/shel_/x_shel_get.ui +|----|----|----gem/aes/shel_/x_shel_put.ui +|----|----gem/aes/xgrf_/xgrf_.u +|----|----|----gem/aes/xgrf_/xgrf_2box.ui +|----|----|----gem/aes/xgrf_/xgrf_stepcalc.ui +|----|----|----gem/aes/xgrf_/xgrf_color.ui +|----|----|----gem/aes/xgrf_/xgrf_dtimage.ui +|----|----gem/aes/xshl_/xshl_.u +|----|----|----gem/aes/xshl_/xshl_getshell.ui +|----|----|----gem/aes/xshl_/xshl_setshell.ui +|----|----gem/aes/fnts_/fnts_.u +|----|----|----gem/aes/fnts_/fnts_add.ui +|----|----|----gem/aes/fnts_/fnts_close.ui +|----|----|----gem/aes/fnts_/fnts_create.ui +|----|----|----gem/aes/fnts_/fnts_delete.ui +|----|----|----gem/aes/fnts_/fnts_do.ui +|----|----|----gem/aes/fnts_/fnts_evnt.ui +|----|----|----gem/aes/fnts_/fnts_get_info.ui +|----|----|----gem/aes/fnts_/fnts_get_name.ui +|----|----|----gem/aes/fnts_/fnts_get_no_styles.ui +|----|----|----gem/aes/fnts_/fnts_get_style.ui +|----|----|----gem/aes/fnts_/fnts_open.ui +|----|----|----gem/aes/fnts_/fnts_remove.ui +|----|----|----gem/aes/fnts_/fnts_update.ui +|----|----|----gem/aes/fnts_/use.ui +|----|----gem/aes/aes_f.u +|----|----gem/aes/structures/structures.u +|----|----|----gem/aes/structures/AESPB.ui +|----|----|----gem/aes/structures/ANI_MOUSE.ui +|----|----|----gem/aes/structures/APPFLAGS.ui +|----|----|----gem/aes/structures/APPFLG.ui +|----|----|----gem/aes/structures/applrecord.ui +|----|----|----gem/aes/structures/bitblk.ui +|----|----|----gem/aes/structures/cicon.ui +|----|----|----gem/aes/structures/ciconblk.ui +|----|----|----gem/aes/structures/clrcat.ui +|----|----|----gem/aes/structures/dialog.ui +|----|----|----gem/aes/structures/dither_mode.ui +|----|----|----gem/aes/structures/drv_entry.ui +|----|----|----gem/aes/structures/drv_info.ui +|----|----|----gem/aes/structures/evnt.ui +|----|----|----gem/aes/structures/fnts_item.ui +|----|----|----gem/aes/structures/fnt_dialog.ui +|----|----|----gem/aes/structures/G_VECTORS.ui +|----|----|----gem/aes/structures/hndl_obj.ui +|----|----|----gem/aes/structures/iconblk.ui +|----|----|----gem/aes/structures/KEYCODE.ui +|----|----|----gem/aes/structures/lbox_item.ui +|----|----|----gem/aes/structures/list_box.ui +|----|----|----gem/aes/structures/media_size.ui +|----|----|----gem/aes/structures/media_type.ui +|----|----|----gem/aes/structures/menu.ui +|----|----|----gem/aes/structures/mform.ui +|----|----|----gem/aes/structures/mn_set.ui +|----|----|----gem/aes/structures/object.ui +|----|----|----gem/aes/structures/OB_PREFER.ui +|----|----|----gem/aes/structures/parmblk.ui +|----|----|----gem/aes/structures/pdlg_hndl.ui +|----|----|----gem/aes/structures/pdlg_init.ui +|----|----|----gem/aes/structures/pdlg_reset.ui +|----|----|----gem/aes/structures/pdlg_sub.ui +|----|----|----gem/aes/structures/popinfo.ui +|----|----|----gem/aes/structures/prn_dialog.ui +|----|----|----gem/aes/structures/prn_entry.ui +|----|----|----gem/aes/structures/prn_mode.ui +|----|----|----gem/aes/structures/prn_settings.ui +|----|----|----gem/aes/structures/prn_switch.ui +|----|----|----gem/aes/structures/prn_tray.ui +|----|----|----gem/aes/structures/rshdr.ui +|----|----|----gem/aes/structures/rsxhdr.ui +|----|----|----gem/aes/structures/scanx.ui +|----|----|----gem/aes/structures/SETTINGS.ui +|----|----|----gem/aes/structures/set_item.ui +|----|----|----gem/aes/structures/sheltail.ui +|----|----|----gem/aes/structures/shelw.ui +|----|----|----gem/aes/structures/slct_item.ui +|----|----|----gem/aes/structures/swinfo.ui +|----|----|----gem/aes/structures/tedinfo.ui +|----|----|----gem/aes/structures/userblk.ui +|----|----|----gem/aes/structures/utxt_fn.ui +|----|----|----gem/aes/structures/WIND_TREE.ui +|----|----|----gem/aes/structures/WINFRAME_HANDLER.ui +|----|----|----gem/aes/structures/WINFRAME_SETTINGS.ui +|----|----|----gem/aes/structures/WININFO.ui +|----|----|----gem/aes/structures/xaesmsg.ui +|----|----|----gem/aes/structures/xdo_inf.ui +|----|----|----gem/aes/structures/XFONTINFO.ui +|----|----|----gem/aes/structures/xfsl_filter.ui +|----|----|----gem/aes/structures/xshw_command.ui +|----|----|----gem/aes/structures/xted.ui +|----|----|----gem/aes/structures/x_buf_v2.ui +|----gem/cpxdoku.u +|----gem/guidelns/style.u +|----magic/magic.u +|----|----magic/magicerr.u +|----|----magic/magicinf.u +|----|----magic/shutdown/shutdown.u +|----|----|----magic/shutdown/shutdown_de.ui +|----|----magic/threads/threads.u +|----|----|----magic/threads/vdi.u +|----|----|----magic/threads/example.ui +|----|----magic/DFS/dfs.u +|----|----|----magic/DFS/dfs_de.ui +|----|----magic/XFS/xfs.u +|----|----|----magic/XFS/xfs_de.ui +|----|----magic/sharelib.u +|----n_aes/n_aes.u +|----xaaes/xaaes.u +|----|----xaaes/function/function.u +|----|----|----xaaes/function/appl_pipe.ui +|----|----|----xaaes/function/client_exit.ui +|----|----|----xaaes/function/new_client.ui +|----|----|----xaaes/function/rregen.ui +|----|----|----xaaes/function/wredraw.ui +|----magic/MagiC_Mac/magicmac.u +|----|----magic/MagiC_Mac/magicmac_de.ui +|----magic/MagiC_PC/magicpc.u +|----|----magic/MagiC_PC/magicpc_de.ui +|----emulator.en/stem.u +|----emulator.en/tos2win.u +|----emulator.en/sonstige.u +|----protokol/AV/av.u +|----|----protokol/AV/av_de.ui +|----protokol/BubbleGEM/bubble.u +|----|----protokol/BubbleGEM/bubble_de.ui +|----protokol/dd.u +|----protokol/dhst.u +|----protokol/font.u +|----protokol/gdps.ui +|----protokol/ltlproto.u +|----protokol/olga/olga.u +|----|----protokol/olga/olga_de.ui +|----protokol/seproto/seproto.u +|----|----protokol/seproto/seproto_de.ui +|----protokol/ssp/ssp.u +|----protokol/view.u +|----protokol/vscreen.u +|----protokol/xacc/xacc.u +|----|----protokol/xacc/xacc_de.ui +|----protokol/xfsl.u +|----protokol/xssi.u +|----anhang/anhang/anhang.u +|----|----anhang/anhang/ascii.ui +|----|----anhang/anhang/scan-code.ui +|----|----anhang/anhang/pmmu.u +|----|----anhang/anhang/tos_vers.u +|----|----anhang/anhang/xhdi/xhdi.u +|----|----|----anhang/anhang/xhdi/xhdi_de.ui +|----|----anhang/typedefs.u +|----|----|----anhang/typedefs/AESVARS.ui +|----|----|----anhang/typedefs/ARHEADER.ui +|----|----|----anhang/typedefs/BCB.ui +|----|----|----anhang/typedefs/CPXINFO.ui +|----|----|----anhang/typedefs/FlpDrvInfo.ui +|----|----|----anhang/typedefs/GEM_MUPB.ui +|----|----|----anhang/typedefs/GRECT.ui +|----|----|----anhang/typedefs/HDFUNCS.ui +|----|----|----anhang/typedefs/MacVersion.ui +|----|----|----anhang/typedefs/MCB.ui +|----|----|----anhang/typedefs/MD.ui +|----|----|----anhang/typedefs/MRETS.ui +|----|----|----anhang/typedefs/OHEADER.ui +|----|----|----anhang/typedefs/OSHEADER.ui +|----|----|----anhang/typedefs/PrintDesc.ui +|----|----|----anhang/typedefs/RGB_LIST.ui +|----|----|----anhang/typedefs/THREADINFO.ui +|----|----|----anhang/typedefs/XCPB.ui +/home/runner/work/tos.hyp/tos.hyp/gh-pages/de/udooEw37w + + 1 Einleitung; /home/runner/work/tos.hyp/tos.hyp/tos_hyp.u; introduction + 1 1 Kontakt; anhang/hilfe.u; contact + 1 2 Altes Vorwort von Rolf Kotzian; anhang/hilfe.u; old_preface + 1 3 Neu in dieser Version; anhang/neu.u; history + 1 3 1 Version 5.01; anhang/changes/05_01.ui; history + 1 3 2 Version 5.00; anhang/changes/05_00.ui; history + 1 3 3 Version 4.99; anhang/changes/04_99.ui; history + 1 3 4 Version 4.98; anhang/changes/04_98.ui; history + 1 3 5 Version 4.97; anhang/changes/04_97.ui; history + 1 3 6 Version 4.96; anhang/changes/04_96.ui; history + 1 3 7 Version 4.95; anhang/changes/04_95.ui; history + 1 3 8 Version 4.94; anhang/changes/04_94.ui; history + 1 3 9 Version 4.93; anhang/changes/04_93.ui; history + 1 3 10 Version 4.92; anhang/changes/04_92.ui; history + 1 3 11 Version 4.91; anhang/changes/04_91.ui; history + 1 3 12 Version 4.90; anhang/changes/04_90.ui; history + 1 3 13 Version 4.80 - 0.40; anhang/changes/old.ui; history + 1 4 The GNU General Public Licence; anhang/gpl.ui; gpl + 2 TOS; /home/runner/work/tos.hyp/tos.hyp/tos_hyp.u; tos_main + 2 1 Das Betriebssystem TOS; tos/tos_de.ui; tos_about + 2 2 GEM; tos/tos_de.ui; gem_about + 2 2 1 Die verschiedenen GEM-Versionen; tos/tos_de.ui; gem_about + 3 BIOS; /home/runner/work/tos.hyp/tos.hyp/tos_hyp.u; bios_main + 3 1 Das BIOS; bios/bios.u; About_the_BIOS + 3 1 1 bios-Trap; bios/bios_trap.ui; About_the_BIOS + 3 1 2 Bconin; bios/function/bconin.u; About_the_BIOS + 3 1 2 1 Bindings für Bconin; bios/function/bconin.u; About_the_BIOS + 3 1 3 Bconout; bios/function/bconout.u; About_the_BIOS + 3 1 3 1 Bindings für Bconout; bios/function/bconout.u; About_the_BIOS + 3 1 4 Bconstat; bios/function/bconstat.u; About_the_BIOS + 3 1 4 1 Bindings für Bconstat; bios/function/bconstat.u; About_the_BIOS + 3 1 5 Bcostat; bios/function/bcostat.u; About_the_BIOS + 3 1 5 1 Bindings für Bcostat; bios/function/bcostat.u; About_the_BIOS + 3 1 6 Drvmap; bios/function/drvmap.u; About_the_BIOS + 3 1 6 1 Bindings für Drvmap; bios/function/drvmap.u; About_the_BIOS + 3 1 7 Getbpb; bios/function/getbpb.u; About_the_BIOS + 3 1 7 1 Bindings für Getbpb; bios/function/getbpb.u; About_the_BIOS + 3 1 8 Getmpb; bios/function/getmpb.u; About_the_BIOS + 3 1 8 1 Bindings für Getmpb; bios/function/getmpb.u; About_the_BIOS + 3 1 9 Kbshift; bios/function/kbshift.u; About_the_BIOS + 3 1 10 Bindings für Kbshift; bios/function/kbshift.u; About_the_BIOS + 3 1 11 Mediach; bios/function/mediach.u; About_the_BIOS + 3 1 11 1 Bindings für Mediach; bios/function/mediach.u; About_the_BIOS + 3 1 12 Rwabs; bios/function/rwabs.u; About_the_BIOS + 3 1 12 1 Bindings für Rwabs; bios/function/rwabs.u; About_the_BIOS + 3 1 13 Setexc; bios/function/setexc.u; About_the_BIOS + 3 1 13 1 Bindings für Setexc; bios/function/setexc.u; About_the_BIOS + 3 1 14 Tickcal; bios/function/tickcal.u; About_the_BIOS + 3 1 14 1 Bindings für Tickcal; bios/function/tickcal.u; About_the_BIOS + 3 2 Die Ein-/Ausgabekanäle des BIOS; bios/bios.u; bios_channels + 3 3 Einklinken in den Reset-Vektor; bios/bios.u; bios_resvector + 3 4 Die Systemvariablen; bios/sys_var_de.u; bios_sysvars + 3 4 1 Systemvariablen, nummerisch sortiert; bios/sys_var_de.u; bios_sysvars + 3 5 Die Systemvektoren; bios/sys_vec_de.ui; the_system_vectors + 3 6 BIOS Fehlermeldungen; bios/bios.u; bios_errors + 3 7 Cookie-Jar; bios/cookie/cookie_de.ui; bios_cookiejar + 3 7 1 Beispiel-Code; bios/cookie/example_de.ui; bios_cookiejar + 3 7 2 Cookie- und XBRA-Liste; bios/cookie/cookie_de.ui; bios_cookiejar + 3 7 2 1 Cookie, 3DMN; bios/cookie/description/3DMN.ui; bios_cookiejar + 3 7 2 2 Cookie, 3RDB; bios/cookie/description/3RDB.ui; bios_cookiejar + 3 7 2 3 Cookie, 60Hz; bios/cookie/description/60Hz.ui; bios_cookiejar + 3 7 2 4 Cookie, 8*8; bios/cookie/description/8_8.ui; bios_cookiejar + 3 7 2 5 Cookie, A2sv; bios/cookie/description/A2sv.ui; bios_cookiejar + 3 7 2 6 Cookie, AB40; bios/cookie/description/AB40.ui; bios_cookiejar + 3 7 2 7 Cookie, ACCS; bios/cookie/description/ACCS.ui; bios_cookiejar + 3 7 2 8 Cookie, AFnt; bios/cookie/description/AFnt.ui; bios_cookiejar + 3 7 2 9 Cookie, AgK0; bios/cookie/description/AgK0.ui; bios_cookiejar + 3 7 2 10 Cookie, AHVR; bios/cookie/description/AHVR.ui; bios_cookiejar + 3 7 2 11 Cookie, ALHP; bios/cookie/description/ALHP.ui; bios_cookiejar + 3 7 2 12 Cookie, ALIC; bios/cookie/description/ALIC.ui; bios_cookiejar + 3 7 2 13 Cookie, ALRM; bios/cookie/description/ALRM.ui; bios_cookiejar + 3 7 2 14 Cookie, AmAN; bios/cookie/description/AmAN.ui; bios_cookiejar + 3 7 2 15 Cookie, AMC1; bios/cookie/description/AMC1.ui; bios_cookiejar + 3 7 2 16 Cookie, AMC2; bios/cookie/description/AMC2.ui; bios_cookiejar + 3 7 2 17 Cookie, AMCG; bios/cookie/description/AMCG.ui; bios_cookiejar + 3 7 2 18 Cookie, ANSe; bios/cookie/description/ANSe.ui; bios_cookiejar + 3 7 2 19 Cookie, APGM; bios/cookie/description/APGM.ui; bios_cookiejar + 3 7 2 20 Cookie, ARAe; bios/cookie/description/ARAe.ui; bios_cookiejar + 3 7 2 21 Cookie, ARTS; bios/cookie/description/ARTS.ui; bios_cookiejar + 3 7 2 22 Cookie, asGT; bios/cookie/description/asGT.ui; bios_cookiejar + 3 7 2 23 Cookie, ASum; bios/cookie/description/ASum.ui; bios_cookiejar + 3 7 2 24 Cookie, AVmw; bios/cookie/description/AVmw.ui; bios_cookiejar + 3 7 2 25 Cookie, AVOJ; bios/cookie/description/AVOJ.ui; bios_cookiejar + 3 7 2 26 Cookie, AVSV; bios/cookie/description/AVSV.ui; bios_cookiejar + 3 7 2 27 Cookie, BASH; bios/cookie/description/BASH.ui; bios_cookiejar + 3 7 2 28 Cookie, BBD2; bios/cookie/description/BBD2.ui; bios_cookiejar + 3 7 2 29 Cookie, BCKW; bios/cookie/description/BCKW.ui; bios_cookiejar + 3 7 2 30 Cookie, BGEM; bios/cookie/description/BGEM.ui; bios_cookiejar + 3 7 2 31 Cookie, BGHD; bios/cookie/description/BGHD.ui; bios_cookiejar + 3 7 2 32 Cookie, BHdl; bios/cookie/description/BHdl.ui; bios_cookiejar + 3 7 2 33 Cookie, BHLP; bios/cookie/description/BHLP.ui; bios_cookiejar + 3 7 2 34 Cookie, BIGS; bios/cookie/description/BIGS.ui; bios_cookiejar + 3 7 2 35 Cookie, BIOC; bios/cookie/description/BIOC.ui; bios_cookiejar + 3 7 2 36 Cookie, BLNK; bios/cookie/description/BLNK.ui; bios_cookiejar + 3 7 2 37 Cookie, BLOW; bios/cookie/description/BLOW.ui; bios_cookiejar + 3 7 2 38 Cookie, BScn; bios/cookie/description/BScn.ui; bios_cookiejar + 3 7 2 39 Cookie, BSIM; bios/cookie/description/BSIM.ui; bios_cookiejar + 3 7 2 40 Cookie, BSTE; bios/cookie/description/BSTE.ui; bios_cookiejar + 3 7 2 41 Cookie, BUG1; bios/cookie/description/BUG1.ui; bios_cookiejar + 3 7 2 42 Cookie, C24P; bios/cookie/description/C24P.ui; bios_cookiejar + 3 7 2 43 Cookie, CACH; bios/cookie/description/CACH.ui; bios_cookiejar + 3 7 2 44 Cookie, CALD; bios/cookie/description/CALD.ui; bios_cookiejar + 3 7 2 45 Cookie, CASE; bios/cookie/description/CASE.ui; bios_cookiejar + 3 7 2 46 Cookie, CatS; bios/cookie/description/CatS.ui; bios_cookiejar + 3 7 2 47 Cookie, CaTT; bios/cookie/description/CaTT.ui; bios_cookiejar + 3 7 2 48 Cookie, CB2K; bios/cookie/description/CB2K.ui; bios_cookiejar + 3 7 2 49 Cookie, CBCE; bios/cookie/description/CBCE.ui; bios_cookiejar + 3 7 2 50 Cookie, CBDF; bios/cookie/description/CBDF.ui; bios_cookiejar + 3 7 2 51 Cookie, CBHD; bios/cookie/description/CBHD.ui; bios_cookiejar + 3 7 2 52 Cookie, CBHY; bios/cookie/description/CBHY.ui; bios_cookiejar + 3 7 2 53 Cookie, CBIT; bios/cookie/description/CBIT.ui; bios_cookiejar + 3 7 2 54 Cookie, CBTS; bios/cookie/description/CBTS.ui; bios_cookiejar + 3 7 2 55 Cookie, CCDA; bios/cookie/description/CCDA.ui; bios_cookiejar + 3 7 2 56 Cookie, cdMC; bios/cookie/description/cdMC.ui; bios_cookiejar + 3 7 2 57 Cookie, CDOT; bios/cookie/description/CDOT.ui; bios_cookiejar + 3 7 2 58 Cookie, ceci; bios/cookie/description/ceci.ui; bios_cookiejar + 3 7 2 59 Cookie, CFIX; bios/cookie/description/CFIX.ui; bios_cookiejar + 3 7 2 60 Cookie, CFsl; bios/cookie/description/CFsl.ui; bios_cookiejar + 3 7 2 61 Cookie, CHAM; bios/cookie/description/CHAM.ui; bios_cookiejar + 3 7 2 62 Cookie, CHBT; bios/cookie/description/CHBT.ui; bios_cookiejar + 3 7 2 63 Cookie, CHN1; bios/cookie/description/CHN1.ui; bios_cookiejar + 3 7 2 64 Cookie, CHNG; bios/cookie/description/CHNG.ui; bios_cookiejar + 3 7 2 65 Cookie, CHTW; bios/cookie/description/CHTW.ui; bios_cookiejar + 3 7 2 66 Cookie, CICN; bios/cookie/description/CICN.ui; bios_cookiejar + 3 7 2 67 Cookie, CISY; bios/cookie/description/CISY.ui; bios_cookiejar + 3 7 2 68 Cookie, CJar; bios/cookie/description/CJar.ui; bios_cookiejar + 3 7 2 69 Cookie, CJAR; bios/cookie/description/CJAR_.ui; bios_cookiejar + 3 7 2 70 Cookie, ck01; bios/cookie/description/ck01.ui; bios_cookiejar + 3 7 2 71 Cookie, CKBD; bios/cookie/description/CKBD.ui; bios_cookiejar + 3 7 2 72 Cookie, CKJR; bios/cookie/description/CKJR.ui; bios_cookiejar + 3 7 2 73 Cookie, CLCK; bios/cookie/description/CLCK.ui; bios_cookiejar + 3 7 2 74 Cookie, CLK1; bios/cookie/description/CLK1.ui; bios_cookiejar + 3 7 2 75 Cookie, CLOK; bios/cookie/description/CLOK.ui; bios_cookiejar + 3 7 2 76 Cookie, CM16; bios/cookie/description/CM16.ui; bios_cookiejar + 3 7 2 77 Cookie, CNTS; bios/cookie/description/CNTS.ui; bios_cookiejar + 3 7 2 78 Cookie, COLO; bios/cookie/description/COLO.ui; bios_cookiejar + 3 7 2 79 Cookie, CPSL; bios/cookie/description/CPSL.ui; bios_cookiejar + 3 7 2 80 Cookie, CRAC; bios/cookie/description/CRAC.ui; bios_cookiejar + 3 7 2 81 Cookie, CRIT; bios/cookie/description/CRIT.ui; bios_cookiejar + 3 7 2 82 Cookie, CSMD; bios/cookie/description/CSMD.ui; bios_cookiejar + 3 7 2 83 Cookie, CT40; bios/cookie/description/CT40.ui; bios_cookiejar + 3 7 2 84 Cookie, CT60; bios/cookie/description/CT60.ui; bios_cookiejar + 3 7 2 85 Cookie, CTCH; bios/cookie/description/CTCH.ui; bios_cookiejar + 3 7 2 86 Cookie, CtCp; bios/cookie/description/CtCp.ui; bios_cookiejar + 3 7 2 87 Cookie, CTSF; bios/cookie/description/CTSF.ui; bios_cookiejar + 3 7 2 88 Cookie, cVDI; bios/cookie/description/cVDI.ui; bios_cookiejar + 3 7 2 89 Cookie, CWCo; bios/cookie/description/CWCo.ui; bios_cookiejar + 3 7 2 90 Cookie, DATE; bios/cookie/description/DATE.ui; bios_cookiejar + 3 7 2 91 Cookie, DATL; bios/cookie/description/DATL.ui; bios_cookiejar + 3 7 2 92 Cookie, DAWN; bios/cookie/description/DAWN.ui; bios_cookiejar + 3 7 2 93 Cookie, DBFX; bios/cookie/description/DBFX.ui; bios_cookiejar + 3 7 2 94 Cookie, DCdd; bios/cookie/description/DCdd.ui; bios_cookiejar + 3 7 2 95 Cookie, DCF7; bios/cookie/description/DCF7.ui; bios_cookiejar + 3 7 2 96 Cookie, DCSD; bios/cookie/description/DCSD.ui; bios_cookiejar + 3 7 2 97 Cookie, DECD; bios/cookie/description/DECD.ui; bios_cookiejar + 3 7 2 98 Cookie, DEPI; bios/cookie/description/DEPI.ui; bios_cookiejar + 3 7 2 99 Cookie, DHST; bios/cookie/description/DHST.ui; bios_cookiejar + 3 7 2 100 Cookie, DIG2; bios/cookie/description/DIG2.ui; bios_cookiejar + 3 7 2 101 Cookie, DJBX; bios/cookie/description/DJBX.ui; bios_cookiejar + 3 7 2 102 Cookie, DKEY; bios/cookie/description/DKEY.ui; bios_cookiejar + 3 7 2 103 Cookie, DNTR; bios/cookie/description/DNTR.ui; bios_cookiejar + 3 7 2 104 Cookie, DPAT; bios/cookie/description/DPAT.ui; bios_cookiejar + 3 7 2 105 Cookie, DPRS; bios/cookie/description/DPRS.ui; bios_cookiejar + 3 7 2 106 Cookie, DRIV; bios/cookie/description/DRIV.ui; bios_cookiejar + 3 7 2 107 Cookie, DRRH; bios/cookie/description/DRRH.ui; bios_cookiejar + 3 7 2 108 Cookie, Dsel; bios/cookie/description/Dsel.ui; bios_cookiejar + 3 7 2 109 Cookie, DSSO; bios/cookie/description/DSSO.ui; bios_cookiejar + 3 7 2 110 Cookie, DYDL; bios/cookie/description/DYDL.ui; bios_cookiejar + 3 7 2 111 Cookie, DYJA; bios/cookie/description/DYJA.ui; bios_cookiejar + 3 7 2 112 Cookie, DYJD; bios/cookie/description/DYJD.ui; bios_cookiejar + 3 7 2 113 Cookie, DYJT; bios/cookie/description/DYJT.ui; bios_cookiejar + 3 7 2 114 Cookie, DYNL; bios/cookie/description/DYNL.ui; bios_cookiejar + 3 7 2 115 Cookie, DYwl; bios/cookie/description/DYwl.ui; bios_cookiejar + 3 7 2 116 Cookie, EADC; bios/cookie/description/EADC.ui; bios_cookiejar + 3 7 2 117 Cookie, EBPO; bios/cookie/description/EBPO.ui; bios_cookiejar + 3 7 2 118 Cookie, EdDI; bios/cookie/description/EdDI.ui; bios_cookiejar + 3 7 2 119 Cookie, EDFX; bios/cookie/description/EDFX.ui; bios_cookiejar + 3 7 2 120 Cookie, EGON; bios/cookie/description/EGON.ui; bios_cookiejar + 3 7 2 121 Cookie, EMNP; bios/cookie/description/EMNP.ui; bios_cookiejar + 3 7 2 122 Cookie, ENV$; bios/cookie/description/ENV$.ui; bios_cookiejar + 3 7 2 123 Cookie, ENVN; bios/cookie/description/ENVN.ui; bios_cookiejar + 3 7 2 124 Cookie, ENVR; bios/cookie/description/ENVR.ui; bios_cookiejar + 3 7 2 125 Cookie, EPro; bios/cookie/description/EPro.ui; bios_cookiejar + 3 7 2 126 Cookie, F117; bios/cookie/description/F117.ui; bios_cookiejar + 3 7 2 127 Cookie, ETM; bios/cookie/description/ETM.ui; bios_cookiejar + 3 7 2 128 Cookie, EURO; bios/cookie/description/EURO.ui; bios_cookiejar + 3 7 2 129 Cookie, EUSB; bios/cookie/description/EUSB.ui; bios_cookiejar + 3 7 2 130 Cookie, EXRA; bios/cookie/description/EXRA.ui; bios_cookiejar + 3 7 2 131 Cookie, EXTD; bios/cookie/description/EXTD.ui; bios_cookiejar + 3 7 2 132 Cookie, FaKE; bios/cookie/description/FaKE.ui; bios_cookiejar + 3 7 2 133 Cookie, FALT; bios/cookie/description/FALT.ui; bios_cookiejar + 3 7 2 134 Cookie, FAX!; bios/cookie/description/FAX_.ui; bios_cookiejar + 3 7 2 135 Cookie, FAXR; bios/cookie/description/FAXR.ui; bios_cookiejar + 3 7 2 136 Cookie, FHFX; bios/cookie/description/FHFX.ui; bios_cookiejar + 3 7 2 137 Cookie, FIX2; bios/cookie/description/FIX2.ui; bios_cookiejar + 3 7 2 138 Cookie, FLTP; bios/cookie/description/FLTP.ui; bios_cookiejar + 3 7 2 139 Cookie, FLXD; bios/cookie/description/FLXD.ui; bios_cookiejar + 3 7 2 140 Cookie, fMSX; bios/cookie/description/fMSX.ui; bios_cookiejar + 3 7 2 141 Cookie, Fose; bios/cookie/description/Fose.ui; bios_cookiejar + 3 7 2 142 Cookie, FOse; bios/cookie/description/FOse_.ui; bios_cookiejar + 3 7 2 143 Cookie, FrmD; bios/cookie/description/FrmD.ui; bios_cookiejar + 3 7 2 144 Cookie, FSEL; bios/cookie/description/FSEL.ui; bios_cookiejar + 3 7 2 145 Cookie, FSER; bios/cookie/description/FSER.ui; bios_cookiejar + 3 7 2 146 Cookie, FSMC; bios/cookie/description/FSMC.ui; bios_cookiejar + 3 7 2 147 Cookie, FSmp; bios/cookie/description/FSmp.ui; bios_cookiejar + 3 7 2 148 Cookie, fVDI; bios/cookie/description/fVDI.ui; bios_cookiejar + 3 7 2 149 Cookie, FxOP; bios/cookie/description/FxOP.ui; bios_cookiejar + 3 7 2 150 Cookie, F_3D; bios/cookie/description/F_3D.ui; bios_cookiejar + 3 7 2 151 Cookie, GABI; bios/cookie/description/GABI.ui; bios_cookiejar + 3 7 2 152 Cookie, GBel; bios/cookie/description/GBel.ui; bios_cookiejar + 3 7 2 153 Cookie, GCOM; bios/cookie/description/GCOM.ui; bios_cookiejar + 3 7 2 154 Cookie, GDEV; bios/cookie/description/GDEV.ui; bios_cookiejar + 3 7 2 155 Cookie, GEHC; bios/cookie/description/GEHC.ui; bios_cookiejar + 3 7 2 156 Cookie, GEHD; bios/cookie/description/GEHD.ui; bios_cookiejar + 3 7 2 157 Cookie, GEMB; bios/cookie/description/GEMB.ui; bios_cookiejar + 3 7 2 158 Cookie, GENV; bios/cookie/description/GENV.ui; bios_cookiejar + 3 7 2 159 Cookie, Gfix; bios/cookie/description/Gfix.ui; bios_cookiejar + 3 7 2 160 Cookie, GI30; bios/cookie/description/GI30.ui; bios_cookiejar + 3 7 2 161 Cookie, GIGA; bios/cookie/description/GIGA.ui; bios_cookiejar + 3 7 2 162 Cookie, gk5"; bios/cookie/description/gk5_.ui; bios_cookiejar + 3 7 2 163 Cookie, gkCO; bios/cookie/description/gkCO.ui; bios_cookiejar + 3 7 2 164 Cookie, GLAS; bios/cookie/description/GLAS.ui; bios_cookiejar + 3 7 2 165 Cookie, GLBL; bios/cookie/description/GLBL.ui; bios_cookiejar + 3 7 2 166 Cookie, GMNI; bios/cookie/description/GMNI.ui; bios_cookiejar + 3 7 2 167 Cookie, GMTC; bios/cookie/description/GMTC.ui; bios_cookiejar + 3 7 2 168 Cookie, GNUC; bios/cookie/description/GNUC.ui; bios_cookiejar + 3 7 2 169 Cookie, Gnva; bios/cookie/description/Gnva.ui; bios_cookiejar + 3 7 2 170 Cookie, GOBJ; bios/cookie/description/GOBJ.ui; bios_cookiejar + 3 7 2 171 Cookie, GOff; bios/cookie/description/GOff.ui; bios_cookiejar + 3 7 2 172 Cookie, GSND; bios/cookie/description/GSND.ui; bios_cookiejar + 3 7 2 173 Cookie, GSP1; bios/cookie/description/GSP1.ui; bios_cookiejar + 3 7 2 174 Cookie, GSXB; bios/cookie/description/GSXB.ui; bios_cookiejar + 3 7 2 175 Cookie, GULM; bios/cookie/description/GULM.ui; bios_cookiejar + 3 7 2 176 Cookie, HABO; bios/cookie/description/HABO.ui; bios_cookiejar + 3 7 2 177 Cookie, hade; bios/cookie/description/hade.ui; bios_cookiejar + 3 7 2 178 Cookie, HAMM; bios/cookie/description/HAMM.ui; bios_cookiejar + 3 7 2 179 Cookie, HBFS; bios/cookie/description/HBFS.ui; bios_cookiejar + 3 7 2 180 Cookie, HcP6; bios/cookie/description/HcP6.ui; bios_cookiejar + 3 7 2 181 Cookie, HDDR; bios/cookie/description/HDDR.ui; bios_cookiejar + 3 7 2 182 Cookie, HDEX; bios/cookie/description/HDEX.ui; bios_cookiejar + 3 7 2 183 Cookie, HDEY; bios/cookie/description/HDEY.ui; bios_cookiejar + 3 7 2 184 Cookie, HDJR; bios/cookie/description/HDJR.ui; bios_cookiejar + 3 7 2 185 Cookie, HDLD; bios/cookie/description/HDLD.ui; bios_cookiejar + 3 7 2 186 Cookie, HDPR; bios/cookie/description/HDPR.ui; bios_cookiejar + 3 7 2 187 Cookie, HDRC; bios/cookie/description/HDRC.ui; bios_cookiejar + 3 7 2 188 Cookie, HDST; bios/cookie/description/HDST.ui; bios_cookiejar + 3 7 2 189 Cookie, HDSW; bios/cookie/description/HDSW.ui; bios_cookiejar + 3 7 2 190 Cookie, HFIX; bios/cookie/description/HFIX.ui; bios_cookiejar + 3 7 2 191 Cookie, hFRB; bios/cookie/description/hFRB.ui; bios_cookiejar + 3 7 2 192 Cookie, HIDS; bios/cookie/description/HIDS.ui; bios_cookiejar + 3 7 2 193 Cookie, HMDU; bios/cookie/description/HMDU.ui; bios_cookiejar + 3 7 2 194 Cookie, HMOC; bios/cookie/description/HMOC.ui; bios_cookiejar + 3 7 2 195 Cookie, HMRD; bios/cookie/description/HMRD.ui; bios_cookiejar + 3 7 2 196 Cookie, HMRS; bios/cookie/description/HMRS.ui; bios_cookiejar + 3 7 2 197 Cookie, HPHC; bios/cookie/description/HPHC.ui; bios_cookiejar + 3 7 2 198 Cookie, HPLJ; bios/cookie/description/HPLJ.ui; bios_cookiejar + 3 7 2 199 Cookie, HSCD; bios/cookie/description/HSCD.ui; bios_cookiejar + 3 7 2 200 Cookie, HSND; bios/cookie/description/HSND.ui; bios_cookiejar + 3 7 2 201 Cookie, HWAM; bios/cookie/description/HWAM.ui; bios_cookiejar + 3 7 2 202 Cookie, IBMP; bios/cookie/description/IBMP.ui; bios_cookiejar + 3 7 2 203 Cookie, ICFS; bios/cookie/description/ICFS.ui; bios_cookiejar + 3 7 2 204 Cookie, ICST; bios/cookie/description/ICST.ui; bios_cookiejar + 3 7 2 205 Cookie, IDSK; bios/cookie/description/IDSK.ui; bios_cookiejar + 3 7 2 206 Cookie, IMAC; bios/cookie/description/IMAC.ui; bios_cookiejar + 3 7 2 207 Cookie, IMNE; bios/cookie/description/IMNE.ui; bios_cookiejar + 3 7 2 208 Cookie, INSJ; bios/cookie/description/INSJ.ui; bios_cookiejar + 3 7 2 209 Cookie, INXR; bios/cookie/description/INXR.ui; bios_cookiejar + 3 7 2 210 Cookie, iPRN; bios/cookie/description/iPRN.ui; bios_cookiejar + 3 7 2 211 Cookie, IRSB; bios/cookie/description/IRSB.ui; bios_cookiejar + 3 7 2 212 Cookie, iTMA; bios/cookie/description/iTMA.ui; bios_cookiejar + 3 7 2 213 Cookie, JAM1; bios/cookie/description/JAM1.ui; bios_cookiejar + 3 7 2 214 Cookie, JANU; bios/cookie/description/JANU.ui; bios_cookiejar + 3 7 2 215 Cookie, JB2G; bios/cookie/description/JB2G.ui; bios_cookiejar + 3 7 2 216 Cookie, JCLK; bios/cookie/description/JCLK.ui; bios_cookiejar + 3 7 2 217 Cookie, JCNB; bios/cookie/description/JCNB.ui; bios_cookiejar + 3 7 2 218 Cookie, JCNC; bios/cookie/description/JCNC.ui; bios_cookiejar + 3 7 2 219 Cookie, JCNH; bios/cookie/description/JCNH.ui; bios_cookiejar + 3 7 2 220 Cookie, JCNT; bios/cookie/description/JCNT.ui; bios_cookiejar + 3 7 2 221 Cookie, JFTP; bios/cookie/description/JFTP.ui; bios_cookiejar + 3 7 2 222 Cookie, JINX; bios/cookie/description/JINX.ui; bios_cookiejar + 3 7 2 223 Cookie, JMLB; bios/cookie/description/JMLB.ui; bios_cookiejar + 3 7 2 224 Cookie, JMLS; bios/cookie/description/JMLS.ui; bios_cookiejar + 3 7 2 225 Cookie, JSHD; bios/cookie/description/JSHD.ui; bios_cookiejar + 3 7 2 226 Cookie, JUST; bios/cookie/description/JUST.ui; bios_cookiejar + 3 7 2 227 Cookie, J_Sc; bios/cookie/description/J_Sc.ui; bios_cookiejar + 3 7 2 228 Cookie, KAOS; bios/cookie/description/KAOS.ui; bios_cookiejar + 3 7 2 229 Cookie, KbEv; bios/cookie/description/KbEv.ui; bios_cookiejar + 3 7 2 230 Cookie, KEYT; bios/cookie/description/KEYT.ui; bios_cookiejar + 3 7 2 231 Cookie, KGTF; bios/cookie/description/KGTF.ui; bios_cookiejar + 3 7 2 232 Cookie, KIDI; bios/cookie/description/KIDI.ui; bios_cookiejar + 3 7 2 233 Cookie, KLME; bios/cookie/description/KLME.ui; bios_cookiejar + 3 7 2 234 Cookie, KREG; bios/cookie/description/KREG.ui; bios_cookiejar + 3 7 2 235 Cookie, KyMp; bios/cookie/description/KyMp.ui; bios_cookiejar + 3 7 2 236 Cookie, KyWt; bios/cookie/description/KyWt.ui; bios_cookiejar + 3 7 2 237 Cookie, Lace; bios/cookie/description/Lace.ui; bios_cookiejar + 3 7 2 238 Cookie, LACY; bios/cookie/description/LACY.ui; bios_cookiejar + 3 7 2 239 Cookie, LALA; bios/cookie/description/LALA.ui; bios_cookiejar + 3 7 2 240 Cookie, lanc; bios/cookie/description/lanc.ui; bios_cookiejar + 3 7 2 241 Cookie, LASB; bios/cookie/description/LASB.ui; bios_cookiejar + 3 7 2 242 Cookie, LAWC; bios/cookie/description/LAWC.ui; bios_cookiejar + 3 7 2 243 Cookie, LDGM; bios/cookie/description/LDGM.ui; bios_cookiejar + 3 7 2 244 Cookie, LEDP; bios/cookie/description/LEDP.ui; bios_cookiejar + 3 7 2 245 Cookie, LEmu; bios/cookie/description/LEmu.ui; bios_cookiejar + 3 7 2 246 Cookie, Lity; bios/cookie/description/Lity.ui; bios_cookiejar + 3 7 2 247 Cookie, LLCR; bios/cookie/description/LLCR.ui; bios_cookiejar + 3 7 2 248 Cookie, LMus; bios/cookie/description/LMus.ui; bios_cookiejar + 3 7 2 249 Cookie, LOGB; bios/cookie/description/LOGB.ui; bios_cookiejar + 3 7 2 250 Cookie, LoSe; bios/cookie/description/LoSe.ui; bios_cookiejar + 3 7 2 251 Cookie, LPCD; bios/cookie/description/LPCD.ui; bios_cookiejar + 3 7 2 252 Cookie, LPJM; bios/cookie/description/LPJM.ui; bios_cookiejar + 3 7 2 253 Cookie, LP/2; bios/cookie/description/LP_2.ui; bios_cookiejar + 3 7 2 254 Cookie, LTMF; bios/cookie/description/LTMF.ui; bios_cookiejar + 3 7 2 255 Cookie, M16s; bios/cookie/description/M16s.ui; bios_cookiejar + 3 7 2 256 Cookie, M16X; bios/cookie/description/M16X.ui; bios_cookiejar + 3 7 2 257 Cookie, macc; bios/cookie/description/macc.ui; bios_cookiejar + 3 7 2 258 Cookie, MADD; bios/cookie/description/MADD.ui; bios_cookiejar + 3 7 2 259 Cookie, MADN; bios/cookie/description/MADN.ui; bios_cookiejar + 3 7 2 260 Cookie, Maes; bios/cookie/description/Maes.ui; bios_cookiejar + 3 7 2 261 Cookie, MagC; bios/cookie/description/MagC.ui; bios_cookiejar + 3 7 2 262 Cookie, MAGN; bios/cookie/description/MAGN.ui; bios_cookiejar + 3 7 2 263 Cookie, MagX; bios/cookie/description/MagX.ui; bios_cookiejar + 3 7 2 264 Cookie, MAST; bios/cookie/description/MAST.ui; bios_cookiejar + 3 7 2 265 Cookie, MaTC; bios/cookie/description/MaTC.ui; bios_cookiejar + 3 7 2 266 Cookie, MbAr; bios/cookie/description/MbAr.ui; bios_cookiejar + 3 7 2 267 Cookie, MBRD; bios/cookie/description/MBRD.ui; bios_cookiejar + 3 7 2 268 Cookie, MCL_; bios/cookie/description/MCL_.ui; bios_cookiejar + 3 7 2 269 Cookie, McSn; bios/cookie/description/McSn.ui; bios_cookiejar + 3 7 2 270 Cookie, MCSP; bios/cookie/description/MCSP.ui; bios_cookiejar + 3 7 2 271 Cookie, MCWR; bios/cookie/description/MCWR.ui; bios_cookiejar + 3 7 2 272 Cookie, MDIA; bios/cookie/description/MDIA.ui; bios_cookiejar + 3 7 2 273 Cookie, MDRK; bios/cookie/description/MDRK.ui; bios_cookiejar + 3 7 2 274 Cookie, MDSa; bios/cookie/description/MDSa.ui; bios_cookiejar + 3 7 2 275 Cookie, MFAC; bios/cookie/description/MFAC.ui; bios_cookiejar + 3 7 2 276 Cookie, MFFM; bios/cookie/description/MFFM.ui; bios_cookiejar + 3 7 2 277 Cookie, MFIX; bios/cookie/description/MFIX.ui; bios_cookiejar + 3 7 2 278 Cookie, MFMV; bios/cookie/description/MFMV.ui; bios_cookiejar + 3 7 2 279 Cookie, MFNT; bios/cookie/description/MFNT.ui; bios_cookiejar + 3 7 2 280 Cookie, MGEM; bios/cookie/description/MGEM.ui; bios_cookiejar + 3 7 2 281 Cookie, MgMc; bios/cookie/description/MgMc.ui; bios_cookiejar + 3 7 2 282 Cookie, MgMx; bios/cookie/description/MgMx.ui; bios_cookiejar + 3 7 2 283 Cookie, MgPC; bios/cookie/description/MgPC.ui; bios_cookiejar + 3 7 2 284 Cookie, MgSn; bios/cookie/description/MgSn.ui; bios_cookiejar + 3 7 2 285 Cookie, MID3; bios/cookie/description/MID3.ui; bios_cookiejar + 3 7 2 286 Cookie, MIMA; bios/cookie/description/MIMA.ui; bios_cookiejar + 3 7 2 287 Cookie, MiNT; bios/cookie/description/MiNT.ui; bios_cookiejar + 3 7 2 288 Cookie, MIPS; bios/cookie/description/MIPS.ui; bios_cookiejar + 3 7 2 289 Cookie, MJAF; bios/cookie/description/MJAF.ui; bios_cookiejar + 3 7 2 290 Cookie, MKHC; bios/cookie/description/MKHC.ui; bios_cookiejar + 3 7 2 291 Cookie, MkJr; bios/cookie/description/MkJr.ui; bios_cookiejar + 3 7 2 292 Cookie, MM2X; bios/cookie/description/MM2X.ui; bios_cookiejar + 3 7 2 293 Cookie, MMAC; bios/cookie/description/MMAC.ui; bios_cookiejar + 3 7 2 294 Cookie, MMUT; bios/cookie/description/MMUT.ui; bios_cookiejar + 3 7 2 295 Cookie, MM_2; bios/cookie/description/MM_2.ui; bios_cookiejar + 3 7 2 296 Cookie, MN3D; bios/cookie/description/MN3D.ui; bios_cookiejar + 3 7 2 297 Cookie, MNAM; bios/cookie/description/MNAM.ui; bios_cookiejar + 3 7 2 298 Cookie, MOAF; bios/cookie/description/MOAF.ui; bios_cookiejar + 3 7 2 299 Cookie, MOGR; bios/cookie/description/MOGR.ui; bios_cookiejar + 3 7 2 300 Cookie, MPRO; bios/cookie/description/MPRO.ui; bios_cookiejar + 3 7 2 301 Cookie, MRAM; bios/cookie/description/MRAM.ui; bios_cookiejar + 3 7 2 302 Cookie, MSPD; bios/cookie/description/MSPD.ui; bios_cookiejar + 3 7 2 303 Cookie, MSPO; bios/cookie/description/MSPO.ui; bios_cookiejar + 3 7 2 304 Cookie, mstx; bios/cookie/description/mstx.ui; bios_cookiejar + 3 7 2 305 Cookie, MTCI; bios/cookie/description/MTCI.ui; bios_cookiejar + 3 7 2 306 Cookie, MTft; bios/cookie/description/MTft.ui; bios_cookiejar + 3 7 2 307 Cookie, MUPF; bios/cookie/description/MUPF.ui; bios_cookiejar + 3 7 2 308 Cookie, MWHL; bios/cookie/description/MWHL.ui; bios_cookiejar + 3 7 2 309 Cookie, MZTR; bios/cookie/description/MZTR.ui; bios_cookiejar + 3 7 2 310 Cookie, MZVT; bios/cookie/description/MZVT.ui; bios_cookiejar + 3 7 2 311 Cookie, M_IN; bios/cookie/description/M_IN.ui; bios_cookiejar + 3 7 2 312 Cookie, N203; bios/cookie/description/N203.ui; bios_cookiejar + 3 7 2 313 Cookie, nAES; bios/cookie/description/nAES.ui; bios_cookiejar + 3 7 2 314 Cookie, NAH3; bios/cookie/description/NAH3.ui; bios_cookiejar + 3 7 2 315 Cookie, NBEL; bios/cookie/description/NBEL.ui; bios_cookiejar + 3 7 2 316 Cookie, NBLL; bios/cookie/description/NBLL.ui; bios_cookiejar + 3 7 2 317 Cookie, NCLN; bios/cookie/description/NCLN.ui; bios_cookiejar + 3 7 2 318 Cookie, ne2k; bios/cookie/description/ne2k.ui; bios_cookiejar + 3 7 2 319 Cookie, NERV; bios/cookie/description/NERV.ui; bios_cookiejar + 3 7 2 320 Cookie, NETS; bios/cookie/description/NETS.ui; bios_cookiejar + 3 7 2 321 Cookie, NEXB; bios/cookie/description/NEXB.ui; bios_cookiejar + 3 7 2 322 Cookie, NEXK; bios/cookie/description/NEXK.ui; bios_cookiejar + 3 7 2 323 Cookie, NFMT; bios/cookie/description/NFMT.ui; bios_cookiejar + 3 7 2 324 Cookie, NFnt; bios/cookie/description/NFnt.ui; bios_cookiejar + 3 7 2 325 Cookie, NKCC; bios/cookie/description/NKCC.ui; bios_cookiejar + 3 7 2 326 Cookie, NLdr; bios/cookie/description/NLdr.ui; bios_cookiejar + 3 7 2 327 Cookie, NMGE; bios/cookie/description/NMGE.ui; bios_cookiejar + 3 7 2 328 Cookie, NO7P; bios/cookie/description/NO7P.ui; bios_cookiejar + 3 7 2 329 Cookie, noCF; bios/cookie/description/noCF.ui; bios_cookiejar + 3 7 2 330 Cookie, NOR5; bios/cookie/description/NOR5.ui; bios_cookiejar + 3 7 2 331 Cookie, NOVA; bios/cookie/description/NOVA.ui; bios_cookiejar + 3 7 2 332 Cookie, NSC1; bios/cookie/description/NSC1.ui; bios_cookiejar + 3 7 2 333 Cookie, Nspd; bios/cookie/description/Nspd.ui; bios_cookiejar + 3 7 2 334 Cookie, nTAS; bios/cookie/description/nTAS.ui; bios_cookiejar + 3 7 2 335 Cookie, NTK4; bios/cookie/description/NTK4.ui; bios_cookiejar + 3 7 2 336 Cookie, nTOS; bios/cookie/description/nTOS.ui; bios_cookiejar + 3 7 2 337 Cookie, NUL>; bios/cookie/description/NUL_.ui; bios_cookiejar + 3 7 2 338 Cookie, NVDI; bios/cookie/description/NVDI.ui; bios_cookiejar + 3 7 2 339 Cookie, OBNL; bios/cookie/description/OBNL.ui; bios_cookiejar + 3 7 2 340 Cookie, OFLS; bios/cookie/description/OFLS.ui; bios_cookiejar + 3 7 2 341 Cookie, OPMM; bios/cookie/description/OPMM.ui; bios_cookiejar + 3 7 2 342 Cookie, OSBL; bios/cookie/description/OSBL.ui; bios_cookiejar + 3 7 2 343 Cookie, OSTT; bios/cookie/description/OSTT.ui; bios_cookiejar + 3 7 2 344 Cookie, OTOS; bios/cookie/description/OTOS.ui; bios_cookiejar + 3 7 2 345 Cookie, OV24; bios/cookie/description/OV24.ui; bios_cookiejar + 3 7 2 346 Cookie, oVDI; bios/cookie/description/oVDI.ui; bios_cookiejar + 3 7 2 347 Cookie, OVDJ; bios/cookie/description/OVDJ.ui; bios_cookiejar + 3 7 2 348 Cookie, OVEP; bios/cookie/description/OVEP.ui; bios_cookiejar + 3 7 2 349 Cookie, OVER; bios/cookie/description/OVER.ui; bios_cookiejar + 3 7 2 350 Cookie, OVEX; bios/cookie/description/OVEX.ui; bios_cookiejar + 3 7 2 351 Cookie, OVFS; bios/cookie/description/OVFS.ui; bios_cookiejar + 3 7 2 352 Cookie, OVIM; bios/cookie/description/OVIM.ui; bios_cookiejar + 3 7 2 353 Cookie, OVLS; bios/cookie/description/OVLS.ui; bios_cookiejar + 3 7 2 354 Cookie, OVRD; bios/cookie/description/OVRD.ui; bios_cookiejar + 3 7 2 355 Cookie, OVUT; bios/cookie/description/OVUT.ui; bios_cookiejar + 3 7 2 356 Cookie, OVWI; bios/cookie/description/OVWI.ui; bios_cookiejar + 3 7 2 357 Cookie, PAMN; bios/cookie/description/PAMN.ui; bios_cookiejar + 3 7 2 358 Cookie, PAUL; bios/cookie/description/PAUL.ui; bios_cookiejar + 3 7 2 359 Cookie, PBUG; bios/cookie/description/PBUG.ui; bios_cookiejar + 3 7 2 360 Cookie, PDEB; bios/cookie/description/PDEB.ui; bios_cookiejar + 3 7 2 361 Cookie, PDOS; bios/cookie/description/PDOS.ui; bios_cookiejar + 3 7 2 362 Cookie, PDRZ; bios/cookie/description/PDRZ.ui; bios_cookiejar + 3 7 2 363 Cookie, PFIX; bios/cookie/description/PFIX.ui; bios_cookiejar + 3 7 2 364 Cookie, Pinp; bios/cookie/description/Pinp.ui; bios_cookiejar + 3 7 2 365 Cookie, PKSH; bios/cookie/description/PKSH.ui; bios_cookiejar + 3 7 2 366 Cookie, PMMU; bios/cookie/description/PMMU.ui; bios_cookiejar + 3 7 2 367 Cookie, POIS; bios/cookie/description/POIS.ui; bios_cookiejar + 3 7 2 368 Cookie, POWM; bios/cookie/description/POWM.ui; bios_cookiejar + 3 7 2 369 Cookie, PRCS; bios/cookie/description/PRCS.ui; bios_cookiejar + 3 7 2 370 Cookie, PRDS; bios/cookie/description/PRDS.ui; bios_cookiejar + 3 7 2 371 Cookie, PRMD; bios/cookie/description/PRMD.ui; bios_cookiejar + 3 7 2 372 Cookie, PRN!; bios/cookie/description/PRN!.ui; bios_cookiejar + 3 7 2 373 Cookie, PRNß; bios/cookie/description/PRNSS.ui; bios_cookiejar + 3 7 2 374 Cookie, PRO5; bios/cookie/description/PRO5.ui; bios_cookiejar + 3 7 2 375 Cookie, PROB; bios/cookie/description/PROB.ui; bios_cookiejar + 3 7 2 376 Cookie, PROT; bios/cookie/description/PROT.ui; bios_cookiejar + 3 7 2 377 Cookie, PRTD; bios/cookie/description/PRTD.ui; bios_cookiejar + 3 7 2 378 Cookie, PRTO; bios/cookie/description/PRTO.ui; bios_cookiejar + 3 7 2 379 Cookie, prtr; bios/cookie/description/prtr.ui; bios_cookiejar + 3 7 2 380 Cookie, PRTR; bios/cookie/description/PRTR_.ui; bios_cookiejar + 3 7 2 381 Cookie, PSND; bios/cookie/description/PSND.ui; bios_cookiejar + 3 7 2 382 Cookie, PSSG; bios/cookie/description/PSSG.ui; bios_cookiejar + 3 7 2 383 Cookie, PTOS; bios/cookie/description/PTOS.ui; bios_cookiejar + 3 7 2 384 Cookie, QIKM; bios/cookie/description/QIKM.ui; bios_cookiejar + 3 7 2 385 Cookie, QMAC; bios/cookie/description/QMAC.ui; bios_cookiejar + 3 7 2 386 Cookie, QMCP; bios/cookie/description/QMCP.ui; bios_cookiejar + 3 7 2 387 Cookie, QST2; bios/cookie/description/QST2.ui; bios_cookiejar + 3 7 2 388 Cookie, QST3; bios/cookie/description/QST3.ui; bios_cookiejar + 3 7 2 389 Cookie, QUAN; bios/cookie/description/QUAN.ui; bios_cookiejar + 3 7 2 390 Cookie, RAIL; bios/cookie/description/RAIL.ui; bios_cookiejar + 3 7 2 391 Cookie, RaSn; bios/cookie/description/RaSn.ui; bios_cookiejar + 3 7 2 392 Cookie, RESG; bios/cookie/description/RESG.ui; bios_cookiejar + 3 7 2 393 Cookie, RFLX; bios/cookie/description/RFLX.ui; bios_cookiejar + 3 7 2 394 Cookie, RFUS; bios/cookie/description/RFUS.ui; bios_cookiejar + 3 7 2 395 Cookie, RGUS; bios/cookie/description/RGUS.ui; bios_cookiejar + 3 7 2 396 Cookie, RING; bios/cookie/description/RING.ui; bios_cookiejar + 3 7 2 397 Cookie, ROMD; bios/cookie/description/ROMD.ui; bios_cookiejar + 3 7 2 398 Cookie, ROT8; bios/cookie/description/ROT8.ui; bios_cookiejar + 3 7 2 399 Cookie, RPIT; bios/cookie/description/RPIT.ui; bios_cookiejar + 3 7 2 400 Cookie, RREG; bios/cookie/description/RREG.ui; bios_cookiejar + 3 7 2 401 Cookie, RSLT; bios/cookie/description/RSLT.ui; bios_cookiejar + 3 7 2 402 Cookie, RSpd; bios/cookie/description/RSpd.ui; bios_cookiejar + 3 7 2 403 Cookie, RSVE; bios/cookie/description/RSVE.ui; bios_cookiejar + 3 7 2 404 Cookie, RSVF; bios/cookie/description/RSVF.ui; bios_cookiejar + 3 7 2 405 Cookie, RTKC; bios/cookie/description/RTKC.ui; bios_cookiejar + 3 7 2 406 Cookie, RTOB; bios/cookie/description/RTOB.ui; bios_cookiejar + 3 7 2 407 Cookie, RWIN; bios/cookie/description/RWIN.ui; bios_cookiejar + 3 7 2 408 Cookie, SAM; bios/cookie/description/SAM.ui; bios_cookiejar + 3 7 2 409 Cookie, SBKM; bios/cookie/description/SBKM.ui; bios_cookiejar + 3 7 2 410 Cookie, SBTE; bios/cookie/description/SBTE.ui; bios_cookiejar + 3 7 2 411 Cookie, SBTS; bios/cookie/description/SBTS.ui; bios_cookiejar + 3 7 2 412 Cookie, SCAH; bios/cookie/description/SCAH.ui; bios_cookiejar + 3 7 2 413 Cookie, SCKM; bios/cookie/description/SCKM.ui; bios_cookiejar + 3 7 2 414 Cookie, SCPN; bios/cookie/description/SCPN.ui; bios_cookiejar + 3 7 2 415 Cookie, SCRD; bios/cookie/description/SCRD.ui; bios_cookiejar + 3 7 2 416 Cookie, SCRN; bios/cookie/description/SCRN.ui; bios_cookiejar + 3 7 2 417 Cookie, SCRS; bios/cookie/description/SCRS.ui; bios_cookiejar + 3 7 2 418 Cookie, SCRW; bios/cookie/description/SCRW.ui; bios_cookiejar + 3 7 2 419 Cookie, SCSI; bios/cookie/description/SCSI.ui; bios_cookiejar + 3 7 2 420 Cookie, SCSV; bios/cookie/description/SCSV.ui; bios_cookiejar + 3 7 2 421 Cookie, SDCH; bios/cookie/description/SDCH.ui; bios_cookiejar + 3 7 2 422 Cookie, SDES; bios/cookie/description/SDES.ui; bios_cookiejar + 3 7 2 423 Cookie, SDsk; bios/cookie/description/SDsk.ui; bios_cookiejar + 3 7 2 424 Cookie, SDWN; bios/cookie/description/SDWN.ui; bios_cookiejar + 3 7 2 425 Cookie, SELC; bios/cookie/description/SELC.ui; bios_cookiejar + 3 7 2 426 Cookie, SENV; bios/cookie/description/SENV.ui; bios_cookiejar + 3 7 2 427 Cookie, SFA^; bios/cookie/description/SFA^.ui; bios_cookiejar + 3 7 2 428 Cookie, SFIX; bios/cookie/description/SFIX.ui; bios_cookiejar + 3 7 2 429 Cookie, SFMN; bios/cookie/description/SFMN.ui; bios_cookiejar + 3 7 2 430 Cookie, ShLk; bios/cookie/description/ShLk.ui; bios_cookiejar + 3 7 2 431 Cookie, shlp; bios/cookie/description/shlp.ui; bios_cookiejar + 3 7 2 432 Cookie, SKEY; bios/cookie/description/SKEY.ui; bios_cookiejar + 3 7 2 433 Cookie, SLCT; bios/cookie/description/SLCT.ui; bios_cookiejar + 3 7 2 434 Cookie, SLif; bios/cookie/description/SLif.ui; bios_cookiejar + 3 7 2 435 Cookie, SLIP; bios/cookie/description/SLIP.ui; bios_cookiejar + 3 7 2 436 Cookie, SM00; bios/cookie/description/SM00.ui; bios_cookiejar + 3 7 2 437 Cookie, SM01; bios/cookie/description/SM01.ui; bios_cookiejar + 3 7 2 438 Cookie, SM02; bios/cookie/description/SM02.ui; bios_cookiejar + 3 7 2 439 Cookie, SMAL; bios/cookie/description/SMAL.ui; bios_cookiejar + 3 7 2 440 Cookie, SMAU; bios/cookie/description/SMAU.ui; bios_cookiejar + 3 7 2 441 Cookie, SMon; bios/cookie/description/SMon.ui; bios_cookiejar + 3 7 2 442 Cookie, SMTT; bios/cookie/description/SMTT.ui; bios_cookiejar + 3 7 2 443 Cookie, SNAP; bios/cookie/description/SNAP.ui; bios_cookiejar + 3 7 2 444 Cookie, SOFS; bios/cookie/description/SOFS.ui; bios_cookiejar + 3 7 2 445 Cookie, SOSW; bios/cookie/description/SOSW.ui; bios_cookiejar + 3 7 2 446 Cookie, SpcE; bios/cookie/description/SpcE.ui; bios_cookiejar + 3 7 2 447 Cookie, SPCK; bios/cookie/description/SPCK.ui; bios_cookiejar + 3 7 2 448 Cookie, SPEE; bios/cookie/description/SPEE.ui; bios_cookiejar + 3 7 2 449 Cookie, SPEK; bios/cookie/description/SPEK.ui; bios_cookiejar + 3 7 2 450 Cookie, SPEX; bios/cookie/description/SPEX.ui; bios_cookiejar + 3 7 2 451 Cookie, spMR; bios/cookie/description/spMR.ui; bios_cookiejar + 3 7 2 452 Cookie, Spol; bios/cookie/description/Spol.ui; bios_cookiejar + 3 7 2 453 Cookie, SPRG; bios/cookie/description/SPRG.ui; bios_cookiejar + 3 7 2 454 Cookie, SR17; bios/cookie/description/SR17.ui; bios_cookiejar + 3 7 2 455 Cookie, SSND; bios/cookie/description/SSND.ui; bios_cookiejar + 3 7 2 456 Cookie, ST-C; bios/cookie/description/ST-C.ui; bios_cookiejar + 3 7 2 457 Cookie, ST17; bios/cookie/description/ST17.ui; bios_cookiejar + 3 7 2 458 Cookie, STAT; bios/cookie/description/STAT.ui; bios_cookiejar + 3 7 2 459 Cookie, STEM; bios/cookie/description/STEM.ui; bios_cookiejar + 3 7 2 460 Cookie, STEW; bios/cookie/description/STEW.ui; bios_cookiejar + 3 7 2 461 Cookie, STFA; bios/cookie/description/STFA.ui; bios_cookiejar + 3 7 2 462 Cookie, StIc; bios/cookie/description/StIc.ui; bios_cookiejar + 3 7 2 463 Cookie, STiK; bios/cookie/description/STiK.ui; bios_cookiejar + 3 7 2 464 Cookie, STMS; bios/cookie/description/STMS.ui; bios_cookiejar + 3 7 2 465 Cookie, strk; bios/cookie/description/strk.ui; bios_cookiejar + 3 7 2 466 Cookie, STRX; bios/cookie/description/STRX.ui; bios_cookiejar + 3 7 2 467 Cookie, SupV; bios/cookie/description/SupV.ui; bios_cookiejar + 3 7 2 468 Cookie, SVAR; bios/cookie/description/SVAR.ui; bios_cookiejar + 3 7 2 469 Cookie, SVGA; bios/cookie/description/SVGA.ui; bios_cookiejar + 3 7 2 470 Cookie, SWAP; bios/cookie/description/SWAP.ui; bios_cookiejar + 3 7 2 471 Cookie, SwTm; bios/cookie/description/SwTm.ui; bios_cookiejar + 3 7 2 472 Cookie, SYMB; bios/cookie/description/SYMB.ui; bios_cookiejar + 3 7 2 473 Cookie, SYNL; bios/cookie/description/SYNL.ui; bios_cookiejar + 3 7 2 474 Cookie, SYNT; bios/cookie/description/SYNT.ui; bios_cookiejar + 3 7 2 475 Cookie, SysE; bios/cookie/description/SysE.ui; bios_cookiejar + 3 7 2 476 Cookie, Syso; bios/cookie/description/Syso.ui; bios_cookiejar + 3 7 2 477 Cookie, SYST; bios/cookie/description/SYST.ui; bios_cookiejar + 3 7 2 478 Cookie, SZ_M; bios/cookie/description/SZ_M.ui; bios_cookiejar + 3 7 2 479 Cookie, S_DR; bios/cookie/description/S_DR.ui; bios_cookiejar + 3 7 2 480 Cookie, T206; bios/cookie/description/T206.ui; bios_cookiejar + 3 7 2 481 Cookie, T2GM; bios/cookie/description/T2GM.ui; bios_cookiejar + 3 7 2 482 Cookie, TALK; bios/cookie/description/TALK.ui; bios_cookiejar + 3 7 2 483 Cookie, TAPE; bios/cookie/description/TAPE.ui; bios_cookiejar + 3 7 2 484 Cookie, TASS; bios/cookie/description/TASS.ui; bios_cookiejar + 3 7 2 485 Cookie, TCFS; bios/cookie/description/TCFS.ui; bios_cookiejar + 3 7 2 486 Cookie, TCRB; bios/cookie/description/TCRB.ui; bios_cookiejar + 3 7 2 487 Cookie, Tenv; bios/cookie/description/Tenv.ui; bios_cookiejar + 3 7 2 488 Cookie, TFIX; bios/cookie/description/TFIX.ui; bios_cookiejar + 3 7 2 489 Cookie, THNX; bios/cookie/description/THNX.ui; bios_cookiejar + 3 7 2 490 Cookie, THRM; bios/cookie/description/THRM.ui; bios_cookiejar + 3 7 2 491 Cookie, THST; bios/cookie/description/THST.ui; bios_cookiejar + 3 7 2 492 Cookie, TIM3; bios/cookie/description/TIM3.ui; bios_cookiejar + 3 7 2 493 Cookie, TIM5; bios/cookie/description/TIM5.ui; bios_cookiejar + 3 7 2 494 Cookie, TIME; bios/cookie/description/TIME.ui; bios_cookiejar + 3 7 2 495 Cookie, TK40; bios/cookie/description/TK40.ui; bios_cookiejar + 3 7 2 496 Cookie, TL3D; bios/cookie/description/TL3D.ui; bios_cookiejar + 3 7 2 497 Cookie, TLWV; bios/cookie/description/TLWV.ui; bios_cookiejar + 3 7 2 498 Cookie, Tmon; bios/cookie/description/Tmon.ui; bios_cookiejar + 3 7 2 499 Cookie, tmsW; bios/cookie/description/tmsW.ui; bios_cookiejar + 3 7 2 500 Cookie, TOpW; bios/cookie/description/TOpW.ui; bios_cookiejar + 3 7 2 501 Cookie, TOUC; bios/cookie/description/TOUC.ui; bios_cookiejar + 3 7 2 502 Cookie, TPat; bios/cookie/description/TPat.ui; bios_cookiejar + 3 7 2 503 Cookie, TPGM; bios/cookie/description/TPGM.ui; bios_cookiejar + 3 7 2 504 Cookie, TRAK; bios/cookie/description/TRAK.ui; bios_cookiejar + 3 7 2 505 Cookie, TraP; bios/cookie/description/TraP.ui; bios_cookiejar + 3 7 2 506 Cookie, Trpp; bios/cookie/description/Trpp.ui; bios_cookiejar + 3 7 2 507 Cookie, TRUE; bios/cookie/description/TRUE.ui; bios_cookiejar + 3 7 2 508 Cookie, TSEN; bios/cookie/description/TSEN.ui; bios_cookiejar + 3 7 2 509 Cookie, TSWP; bios/cookie/description/TSWP.ui; bios_cookiejar + 3 7 2 510 Cookie, TTTF; bios/cookie/description/TTTF.ui; bios_cookiejar + 3 7 2 511 Cookie, TUBS; bios/cookie/description/TUBS.ui; bios_cookiejar + 3 7 2 512 Cookie, TWFS; bios/cookie/description/TWFS.ui; bios_cookiejar + 3 7 2 513 Cookie, Typ1; bios/cookie/description/Typ1.ui; bios_cookiejar + 3 7 2 514 Cookie, UFSL; bios/cookie/description/UFSL.ui; bios_cookiejar + 3 7 2 515 Cookie, UIS3; bios/cookie/description/UIS3.ui; bios_cookiejar + 3 7 2 516 Cookie, UKB1; bios/cookie/description/UKB1.ui; bios_cookiejar + 3 7 2 517 Cookie, UKB3; bios/cookie/description/UKB3.ui; bios_cookiejar + 3 7 2 518 Cookie, UN*X; bios/cookie/description/un_x.ui; bios_cookiejar + 3 7 2 519 Cookie, USCK; bios/cookie/description/USCK.ui; bios_cookiejar + 3 7 2 520 Cookie, USHD; bios/cookie/description/USHD.ui; bios_cookiejar + 3 7 2 521 Cookie, UsNm; bios/cookie/description/UsNm.ui; bios_cookiejar + 3 7 2 522 Cookie, USPK; bios/cookie/description/USPK.ui; bios_cookiejar + 3 7 2 523 Cookie, USRS; bios/cookie/description/USRS.ui; bios_cookiejar + 3 7 2 524 Cookie, USSC; bios/cookie/description/USSC.ui; bios_cookiejar + 3 7 2 525 Cookie, UTRK; bios/cookie/description/UTRK.ui; bios_cookiejar + 3 7 2 526 Cookie, VBLF; bios/cookie/description/VBLF.ui; bios_cookiejar + 3 7 2 527 Cookie, VDIp; bios/cookie/description/VDIp.ui; bios_cookiejar + 3 7 2 528 Cookie, VDLY; bios/cookie/description/VDLY.ui; bios_cookiejar + 3 7 2 529 Cookie, VECS; bios/cookie/description/VECS.ui; bios_cookiejar + 3 7 2 530 Cookie, VeiL; bios/cookie/description/VeiL.ui; bios_cookiejar + 3 7 2 531 Cookie, VFIX; bios/cookie/description/VFIX.ui; bios_cookiejar + 3 7 2 532 Cookie, VFNT; bios/cookie/description/VFNT.ui; bios_cookiejar + 3 7 2 533 Cookie, VGAS; bios/cookie/description/VGAS.ui; bios_cookiejar + 3 7 2 534 Cookie, VI-2; bios/cookie/description/VI-2.ui; bios_cookiejar + 3 7 2 535 Cookie, View; bios/cookie/description/View.ui; bios_cookiejar + 3 7 2 536 Cookie, VIRA; bios/cookie/description/VIRA.ui; bios_cookiejar + 3 7 2 537 Cookie, VMEM; bios/cookie/description/VMEM.ui; bios_cookiejar + 3 7 2 538 Cookie, VPCH; bios/cookie/description/VPCH.ui; bios_cookiejar + 3 7 2 539 Cookie, VRAM; bios/cookie/description/VRAM.ui; bios_cookiejar + 3 7 2 540 Cookie, VREP; bios/cookie/description/VREP.ui; bios_cookiejar + 3 7 2 541 Cookie, VSco; bios/cookie/description/VSco.ui; bios_cookiejar + 3 7 2 542 Cookie, VSCR; bios/cookie/description/VSCR.ui; bios_cookiejar + 3 7 2 543 Cookie, VSTM; bios/cookie/description/VSTM.ui; bios_cookiejar + 3 7 2 544 Cookie, vT52; bios/cookie/description/vT52.ui; bios_cookiejar + 3 7 2 545 Cookie, VTFX; bios/cookie/description/VTFX.ui; bios_cookiejar + 3 7 2 546 Cookie, VXCK; bios/cookie/description/VXCK.ui; bios_cookiejar + 3 7 2 547 Cookie, WaHW; bios/cookie/description/WaHW.ui; bios_cookiejar + 3 7 2 548 Cookie, WARP; bios/cookie/description/WARP.ui; bios_cookiejar + 3 7 2 549 Cookie, WaSA; bios/cookie/description/WaSA.ui; bios_cookiejar + 3 7 2 550 Cookie, WBrd; bios/cookie/description/WBrd.ui; bios_cookiejar + 3 7 2 551 Cookie, wdlg; bios/cookie/description/wdlg.ui; bios_cookiejar + 3 7 2 552 Cookie, WDOG; bios/cookie/description/WDOG.ui; bios_cookiejar + 3 7 2 553 Cookie, WEGA; bios/cookie/description/WEGA.ui; bios_cookiejar + 3 7 2 554 Cookie, WfNa; bios/cookie/description/WfNa.ui; bios_cookiejar + 3 7 2 555 Cookie, WFSL; bios/cookie/description/WFSL.ui; bios_cookiejar + 3 7 2 556 Cookie, WICO; bios/cookie/description/WICO.ui; bios_cookiejar + 3 7 2 557 Cookie, WinK; bios/cookie/description/WinK.ui; bios_cookiejar + 3 7 2 558 Cookie, WINX; bios/cookie/description/WINX.ui; bios_cookiejar + 3 7 2 559 Cookie, WINZ; bios/cookie/description/WINZ.ui; bios_cookiejar + 3 7 2 560 Cookie, WPRO; bios/cookie/description/WPRO.ui; bios_cookiejar + 3 7 2 561 Cookie, WRAP; bios/cookie/description/WRAP.ui; bios_cookiejar + 3 7 2 562 Cookie, XALT; bios/cookie/description/XALT.ui; bios_cookiejar + 3 7 2 563 Cookie, XBTN; bios/cookie/description/XBTN.ui; bios_cookiejar + 3 7 2 564 Cookie, XDsk; bios/cookie/description/XDsk.ui; bios_cookiejar + 3 7 2 565 Cookie, XFRB; bios/cookie/description/XFRB.ui; bios_cookiejar + 3 7 2 566 Cookie, XFS1; bios/cookie/description/XFS1.ui; bios_cookiejar + 3 7 2 567 Cookie, xFSL; bios/cookie/description/xFSL.ui; bios_cookiejar + 3 7 2 568 Cookie, Xgem; bios/cookie/description/Xgem.ui; bios_cookiejar + 3 7 2 569 Cookie, XHDI; bios/cookie/description/XHDI.ui; bios_cookiejar + 3 7 2 570 Cookie, XKBD; bios/cookie/description/XKBD.ui; bios_cookiejar + 3 7 2 571 Cookie, XMMU; bios/cookie/description/XMMU.ui; bios_cookiejar + 3 7 2 572 Cookie, XMuz; bios/cookie/description/XMuz.ui; bios_cookiejar + 3 7 2 573 Cookie, xNet; bios/cookie/description/xNet.ui; bios_cookiejar + 3 7 2 574 Cookie, XPCI; bios/cookie/description/XPCI.ui; bios_cookiejar + 3 7 2 575 Cookie, xRmt; bios/cookie/description/xRmt.ui; bios_cookiejar + 3 7 2 576 Cookie, XSDD; bios/cookie/description/XSDD.ui; bios_cookiejar + 3 7 2 577 Cookie, XSND; bios/cookie/description/XSND.ui; bios_cookiejar + 3 7 2 578 Cookie, XSSI; bios/cookie/description/XSSI.ui; bios_cookiejar + 3 7 2 579 Cookie, XTOS; bios/cookie/description/XTOS.ui; bios_cookiejar + 3 7 2 580 Cookie, xUAG; bios/cookie/description/xUAG.ui; bios_cookiejar + 3 7 2 581 Cookie, xUFC; bios/cookie/description/xUFC.ui; bios_cookiejar + 3 7 2 582 Cookie, XWin; bios/cookie/description/XWin.ui; bios_cookiejar + 3 7 2 583 Cookie, zCAC; bios/cookie/description/zCAC.ui; bios_cookiejar + 3 7 2 584 Cookie, zDCF; bios/cookie/description/zDCF.ui; bios_cookiejar + 3 7 2 585 Cookie, _5MS; bios/cookie/description/_5MS.ui; bios_cookiejar + 3 7 2 586 Cookie, _AFM; bios/cookie/description/_AFM.ui; bios_cookiejar + 3 7 2 587 Cookie, _AKP; bios/cookie/description/_AKP.ui; bios_cookiejar + 3 7 2 588 Cookie, _CF_; bios/cookie/description/_CF_.ui; bios_cookiejar + 3 7 2 589 Cookie, _CPU; bios/cookie/description/_CPU.ui; bios_cookiejar + 3 7 2 590 Cookie, _DOS; bios/cookie/description/_DOS.ui; bios_cookiejar + 3 7 2 591 Cookie, _FDC; bios/cookie/description/_FDC.ui; bios_cookiejar + 3 7 2 592 Cookie, _FLK; bios/cookie/description/_FLK.ui; bios_cookiejar + 3 7 2 593 Cookie, _FPU; bios/cookie/description/_FPU.ui; bios_cookiejar + 3 7 2 594 Cookie, _FRB; bios/cookie/description/_FRB.ui; bios_cookiejar + 3 7 2 595 Cookie, ΣFSC; bios/cookie/description/_FSC.ui; bios_cookiejar + 3 7 2 596 Cookie, _FSR; bios/cookie/description/_FSR.ui; bios_cookiejar + 3 7 2 597 Cookie, _IDT; bios/cookie/description/_IDT.ui; bios_cookiejar + 3 7 2 598 Cookie, _INF; bios/cookie/description/_INF.ui; bios_cookiejar + 3 7 2 599 Cookie, _INU; bios/cookie/description/_INU.ui; bios_cookiejar + 3 7 2 600 Cookie, _ISO; bios/cookie/description/_ISO.ui; bios_cookiejar + 3 7 2 601 Cookie, _JPD; bios/cookie/description/_JPD.ui; bios_cookiejar + 3 7 2 602 Cookie, _MCF; bios/cookie/description/_MCF.ui; bios_cookiejar + 3 7 2 603 Cookie, _MCH; bios/cookie/description/_MCH.ui; bios_cookiejar + 3 7 2 604 Cookie, _MET; bios/cookie/description/_MET.ui; bios_cookiejar + 3 7 2 605 Cookie, _MIL; bios/cookie/description/_MIL.ui; bios_cookiejar + 3 7 2 606 Cookie, _NET; bios/cookie/description/_NET.ui; bios_cookiejar + 3 7 2 607 Cookie, _OOL; bios/cookie/description/_OOL.ui; bios_cookiejar + 3 7 2 608 Cookie, _PCI; bios/cookie/description/_PCI.ui; bios_cookiejar + 3 7 2 609 Cookie, _PKT; bios/cookie/description/_PKT.ui; bios_cookiejar + 3 7 2 610 Cookie, _PWR; bios/cookie/description/_PWR.ui; bios_cookiejar + 3 7 2 611 Cookie, _SLM; bios/cookie/description/_SLM.ui; bios_cookiejar + 3 7 2 612 Cookie, _SND; bios/cookie/description/_SND.ui; bios_cookiejar + 3 7 2 613 Cookie, _SWI; bios/cookie/description/_SWI.ui; bios_cookiejar + 3 7 2 614 Cookie, _T2W; bios/cookie/description/_T2W.ui; bios_cookiejar + 3 7 2 615 Cookie, _T30; bios/cookie/description/_T30.ui; bios_cookiejar + 3 7 2 616 Cookie, _USB; bios/cookie/description/_USB.ui; bios_cookiejar + 3 7 2 617 Cookie, _VDI; bios/cookie/description/_VDI.ui; bios_cookiejar + 3 7 2 618 Cookie, _VDO; bios/cookie/description/_VDO.ui; bios_cookiejar + 3 7 2 619 Cookie, __NF; bios/cookie/description/__NF.ui; bios_cookiejar + 3 8 VT-52-Terminal; bios/vt52.u; VT_52_terminal + 3 8 1 Bell; bios/vt52.u; VT_52_terminal + 3 8 2 Blink_off; bios/vt52.u; VT_52_terminal + 3 8 3 Blink_on; bios/vt52.u; VT_52_terminal + 3 8 4 Clear_down; bios/vt52.u; VT_52_terminal + 3 8 5 Clear_eol; bios/vt52.u; VT_52_terminal + 3 8 6 Clear_home; bios/vt52.u; VT_52_terminal + 3 8 7 Clear_line; bios/vt52.u; VT_52_terminal + 3 8 8 Clear_sol; bios/vt52.u; VT_52_terminal + 3 8 9 Clear_up; bios/vt52.u; VT_52_terminal + 3 8 10 Cur_down; bios/vt52.u; VT_52_terminal + 3 8 11 Cur_home; bios/vt52.u; VT_52_terminal + 3 8 12 Cur_left; bios/vt52.u; VT_52_terminal + 3 8 13 Cur_off; bios/vt52.u; VT_52_terminal + 3 8 14 Cur_on; bios/vt52.u; VT_52_terminal + 3 8 15 Cur_right; bios/vt52.u; VT_52_terminal + 3 8 16 Cur_up; bios/vt52.u; VT_52_terminal + 3 8 17 Del_line; bios/vt52.u; VT_52_terminal + 3 8 18 Escapesequenzen; bios/vt52.u; VT_52_terminal + 3 8 19 Get_blink; bios/vt52.u; VT_52_terminal + 3 8 20 Goto_pos; bios/vt52.u; VT_52_terminal + 3 8 21 Ink; bios/vt52.u; VT_52_terminal + 3 8 22 Ins_line; bios/vt52.u; VT_52_terminal + 3 8 23 Line_feed; bios/vt52.u; VT_52_terminal + 3 8 24 Load_pos; bios/vt52.u; VT_52_terminal + 3 8 25 Paper; bios/vt52.u; VT_52_terminal + 3 8 26 Return; bios/vt52.u; VT_52_terminal + 3 8 27 Rev_off; bios/vt52.u; VT_52_terminal + 3 8 28 Rev_on; bios/vt52.u; VT_52_terminal + 3 8 29 Save_pos; bios/vt52.u; VT_52_terminal + 3 8 30 Scroll_up; bios/vt52.u; VT_52_terminal + 3 8 31 Set_blink; bios/vt52.u; VT_52_terminal + 3 8 32 Tab; bios/vt52.u; VT_52_terminal + 3 8 33 Wrap_off; bios/vt52.u; VT_52_terminal + 3 8 34 Wrap_on; bios/vt52.u; VT_52_terminal + 3 9 XBRA-Verfahren; bios/xbra.u; xbra_main + 3 10 BSIM-BIOS-Erweiterungen; bios/bios_bsim.u; BSIM-BIOS-Extension + 3 10 1 bsim_id; bios/bsim/bsim_id.ui; BSIM-BIOS-Extension + 3 10 1 1 Bindings für bsim_id; bios/bsim/bsim_id.ui; BSIM-BIOS-Extension + 3 10 2 drv_change; bios/bsim/drv_change.ui; BSIM-BIOS-Extension + 3 10 2 1 Bindings für drv_change; bios/bsim/drv_change.ui; BSIM-BIOS-Extension + 3 10 3 drvprotec; bios/bsim/drvprotec.ui; BSIM-BIOS-Extension + 3 10 3 1 Bindings für drvprotec; bios/bsim/drvprotec.ui; BSIM-BIOS-Extension + 3 10 4 dstate; bios/bsim/dstate.ui; BSIM-BIOS-Extension + 3 10 4 1 Bindings für dstate; bios/bsim/dstate.ui; BSIM-BIOS-Extension + 3 10 5 kill_disk; bios/bsim/kill_disk.ui; BSIM-BIOS-Extension + 3 10 5 1 Bindings für kill_disk; bios/bsim/kill_disk.ui; BSIM-BIOS-Extension + 3 10 6 load_disk; bios/bsim/load_disk.ui; BSIM-BIOS-Extension + 3 10 6 1 Bindings für load_disk; bios/bsim/load_disk.ui; BSIM-BIOS-Extension + 3 10 7 save_disk; bios/bsim/save_disk.ui; BSIM-BIOS-Extension + 3 10 7 1 Bindings für save_disk; bios/bsim/save_disk.ui; BSIM-BIOS-Extension + 3 11 BIOS-Funktionsliste; bios/bios_f.u; bios_functions + 3 12 BIOS Strukturen; bios/structures/structures.u; bios_structures + 3 12 1 BPB; bios/structures/bpb.ui; bios_structures + 3 12 2 MD; bios/structures/md.ui; bios_structures + 3 12 3 MPB; bios/structures/mpb.ui; bios_structures + 3 12 4 patternrectdata; bios/structures/patternrectdata.ui; bios_structures + 3 12 5 PUN_INFO; bios/structures/pun_info.ui; bios_structures + 3 12 6 solidrectdata; bios/structures/solidrecdata.ui; bios_structures + 4 XBIOS; /home/runner/work/tos.hyp/tos.hyp/tos_hyp.u; xbios_main + 4 1 Das XBIOS; xbios/xbios.u; xbios_about + 4 2 MetaDOS; xbios/xbios.u; xbios_metados + 4 3 XBIOS Fehlermeldungen; xbios/xbios.u; xbios_errors + 4 4 xbios-Trap; xbios/xbios.u; xbios_trap + 4 5 Bildschirmfunktionen; xbios/bildscrm/bildscrm.u; Screen_functions + 4 5 1 Cursconf; xbios/bildscrm/cursconf.ui; Screen_functions + 4 5 1 1 Bindings für Cursconf; xbios/bildscrm/cursconf.ui; Screen_functions + 4 5 2 EgetPalette; xbios/bildscrm/egetpale.ui; Screen_functions + 4 5 2 1 Bindings für EgetPalette; xbios/bildscrm/egetpale.ui; Screen_functions + 4 5 3 EgetShift; xbios/bildscrm/egetshif.ui; Screen_functions + 4 5 3 1 Bindings für EgetShift; xbios/bildscrm/egetshif.ui; Screen_functions + 4 5 4 EsetBank; xbios/bildscrm/esetbank.ui; Screen_functions + 4 5 4 1 Bindings für EsetBank; xbios/bildscrm/esetbank.ui; Screen_functions + 4 5 5 EsetColor; xbios/bildscrm/esetcolo.ui; Screen_functions + 4 5 5 1 Bindings für EsetColor; xbios/bildscrm/esetcolo.ui; Screen_functions + 4 5 6 EsetGray; xbios/bildscrm/esetgray.ui; Screen_functions + 4 5 6 1 Bindings für EsetGray; xbios/bildscrm/esetgray.ui; Screen_functions + 4 5 7 EsetPalette; xbios/bildscrm/esetpale.ui; Screen_functions + 4 5 7 1 Bindings für EsetPalette; xbios/bildscrm/esetpale.ui; Screen_functions + 4 5 8 EsetShift; xbios/bildscrm/esetshif.ui; Screen_functions + 4 5 8 1 Bindings für EsetShift; xbios/bildscrm/esetshif.ui; Screen_functions + 4 5 9 EsetSmear; xbios/bildscrm/esetsmea.ui; Screen_functions + 4 5 9 1 Bindings für EsetSmear; xbios/bildscrm/esetsmea.ui; Screen_functions + 4 5 10 Getrez; xbios/bildscrm/getrez.ui; Screen_functions + 4 5 10 1 Bindings für Getrez; xbios/bildscrm/getrez.ui; Screen_functions + 4 5 11 Initmouse; xbios/bildscrm/initmous.ui; Screen_functions + 4 5 11 1 Bindings für Initmouse; xbios/bildscrm/initmous.ui; Screen_functions + 4 5 12 Logbase; xbios/bildscrm/logbase.ui; Screen_functions + 4 5 12 1 Bindings für Logbase; xbios/bildscrm/logbase.ui; Screen_functions + 4 5 13 mon_type; xbios/bildscrm/mon_type.ui; Screen_functions + 4 5 13 1 Bindings für mon_type; xbios/bildscrm/mon_type.ui; Screen_functions + 4 5 14 Physbase; xbios/bildscrm/physbase.ui; Screen_functions + 4 5 14 1 Bindings für Physbase; xbios/bildscrm/physbase.ui; Screen_functions + 4 5 15 Setcolor; xbios/bildscrm/setcolor.ui; Screen_functions + 4 5 15 1 Bindings für Setcolor; xbios/bildscrm/setcolor.ui; Screen_functions + 4 5 16 Setpalette; xbios/bildscrm/setpalet.ui; Screen_functions + 4 5 16 1 Bindings für Setpalette; xbios/bildscrm/setpalet.ui; Screen_functions + 4 5 17 Setscreen; xbios/bildscrm/setscree.ui; Screen_functions + 4 5 17 1 Bindings für Setscreen; xbios/bildscrm/setscree.ui; Screen_functions + 4 5 18 Setscreen, Milan; xbios/bildscrm/Setscreen_Milan.ui; Screen_functions + 4 5 19 Setscreen, ct60; xbios/bildscrm/Setscreen_ct60.ui; Screen_functions + 4 5 20 ValidMode; xbios/bildscrm/validmod.ui; Screen_functions + 4 5 20 1 Bindings für ValidMode; xbios/bildscrm/validmod.ui; Screen_functions + 4 5 21 VgetRGB; xbios/bildscrm/vgetrgb.ui; Screen_functions + 4 5 21 1 Bindings für VgetRGB; xbios/bildscrm/vgetrgb.ui; Screen_functions + 4 5 22 VsetScreen; xbios/bildscrm/vsetscre.ui; Screen_functions + 4 5 22 1 Bindings für VsetScreen; xbios/bildscrm/vsetscre.ui; Screen_functions + 4 5 23 VgetSize; xbios/bildscrm/vgetsize.ui; Screen_functions + 4 5 23 1 Bindings für VgetSize; xbios/bildscrm/vgetsize.ui; Screen_functions + 4 5 24 VsetMask; xbios/bildscrm/vsetmask.ui; Screen_functions + 4 5 24 1 Bindings für VsetMask; xbios/bildscrm/vsetmask.ui; Screen_functions + 4 5 25 VsetMode; xbios/bildscrm/vsetmode.ui; Screen_functions + 4 5 25 1 Bindings für VsetMode; xbios/bildscrm/vsetmode.ui; Screen_functions + 4 5 26 VsetRGB; xbios/bildscrm/vsetrgb.ui; Screen_functions + 4 5 26 1 Bindings für VsetRGB; xbios/bildscrm/vsetrgb.ui; Screen_functions + 4 5 27 VsetSync; xbios/bildscrm/vsetsync.ui; Screen_functions + 4 5 27 1 Bindings für VsetSync; xbios/bildscrm/vsetsync.ui; Screen_functions + 4 5 28 Vsync; xbios/bildscrm/vsync.ui; Screen_functions + 4 5 28 1 Bindings für Vsync; xbios/bildscrm/vsync.ui; Screen_functions + 4 5 29 Konstanten zur Videohardware des Falcons; xbios/bildscrm/bildscrm.ui; Screen_functions + 4 6 CENTScreen-XBIOS-Erweiterung; xbios/centscrn/centscrn.u; CENTScreen_XBIOS_extension + 4 6 1 MultiMon; xbios/centscrn/multimon.ui; CENTScreen_XBIOS_extension + 4 6 1 1 Bindings für MultiMon; xbios/centscrn/multimon.ui; CENTScreen_XBIOS_extension + 4 6 2 SetMon; xbios/centscrn/setmon.ui; CENTScreen_XBIOS_extension + 4 6 2 1 Bindings für SetMon; xbios/centscrn/setmon.ui; CENTScreen_XBIOS_extension + 4 6 3 SizeComp; xbios/centscrn/sizecomp.ui; CENTScreen_XBIOS_extension + 4 6 3 1 Bindings für SizeComp; xbios/centscrn/sizecomp.ui; CENTScreen_XBIOS_extension + 4 6 4 Vattrib; xbios/centscrn/vattrib.ui; CENTScreen_XBIOS_extension + 4 6 4 1 Bindings für Vattrib; xbios/centscrn/vattrib.ui; CENTScreen_XBIOS_extension + 4 6 5 Vclose; xbios/centscrn/vclose.ui; CENTScreen_XBIOS_extension + 4 6 5 1 Bindings für Vclose; xbios/centscrn/vclose.ui; CENTScreen_XBIOS_extension + 4 6 6 Vcreate; xbios/centscrn/vcreate.ui; CENTScreen_XBIOS_extension + 4 6 6 1 Bindings für Vcreate; xbios/centscrn/vcreate.ui; CENTScreen_XBIOS_extension + 4 6 7 Vdelete; xbios/centscrn/vdelete.ui; CENTScreen_XBIOS_extension + 4 6 7 1 Bindings für Vdelete; xbios/centscrn/vdelete.ui; CENTScreen_XBIOS_extension + 4 6 8 Vfirst; xbios/centscrn/vfirst.ui; CENTScreen_XBIOS_extension + 4 6 8 1 Bindings für Vfirst; xbios/centscrn/vfirst.ui; CENTScreen_XBIOS_extension + 4 6 9 Vload; xbios/centscrn/vload.ui; CENTScreen_XBIOS_extension + 4 6 9 1 Bindings für Vload; xbios/centscrn/vload.ui; CENTScreen_XBIOS_extension + 4 6 10 Vlock; xbios/centscrn/vlock.ui; CENTScreen_XBIOS_extension + 4 6 10 1 Bindings für Vlock; xbios/centscrn/vlock.ui; CENTScreen_XBIOS_extension + 4 6 11 Vnext; xbios/centscrn/vnext.ui; CENTScreen_XBIOS_extension + 4 6 11 1 Bindings für Vnext; xbios/centscrn/vnext.ui; CENTScreen_XBIOS_extension + 4 6 12 Voffset; xbios/centscrn/voffset.ui; CENTScreen_XBIOS_extension + 4 6 12 1 Bindings für Voffset; xbios/centscrn/voffset.ui; CENTScreen_XBIOS_extension + 4 6 13 Vopen; xbios/centscrn/vopen.ui; CENTScreen_XBIOS_extension + 4 6 13 1 Bindings für Vopen; xbios/centscrn/vopen.ui; CENTScreen_XBIOS_extension + 4 6 14 Vread; xbios/centscrn/vread.ui; CENTScreen_XBIOS_extension + 4 6 14 1 Bindings für Vread; xbios/centscrn/vread.ui; CENTScreen_XBIOS_extension + 4 6 15 Vsave; xbios/centscrn/vsave.ui; CENTScreen_XBIOS_extension + 4 6 15 1 Bindings für Vsave; xbios/centscrn/vsave.ui; CENTScreen_XBIOS_extension + 4 6 16 Vscroll; xbios/centscrn/vscroll.ui; CENTScreen_XBIOS_extension + 4 6 16 1 Bindings für Vscroll; xbios/centscrn/vscroll.ui; CENTScreen_XBIOS_extension + 4 6 17 Vseek; xbios/centscrn/vseek.ui; CENTScreen_XBIOS_extension + 4 6 17 1 Bindings für Vseek; xbios/centscrn/vseek.ui; CENTScreen_XBIOS_extension + 4 6 18 Vsize; xbios/centscrn/vsize.ui; CENTScreen_XBIOS_extension + 4 6 18 1 Bindings für Vsize; xbios/centscrn/vsize.ui; CENTScreen_XBIOS_extension + 4 6 19 Vvalid; xbios/centscrn/vvalid.ui; CENTScreen_XBIOS_extension + 4 6 19 1 Bindings für Vvalid; xbios/centscrn/vvalid.ui; CENTScreen_XBIOS_extension + 4 6 20 Vwrite; xbios/centscrn/vwrite.ui; CENTScreen_XBIOS_extension + 4 6 20 1 Bindings für Vwrite; xbios/centscrn/vwrite.ui; CENTScreen_XBIOS_extension + 4 7 Crazy-Dots-XBIOS-Erweiterung; xbios/crazydot/crazydot.u; crazydots + 4 7 1 GetScreenDescriptor; xbios/crazydot/gscrdesc.ui; crazydots + 4 7 1 1 Bindings für GetScreenDescriptor; xbios/crazydot/gscrdesc.ui; crazydots + 4 7 2 ResetScreen; xbios/crazydot/resetscr.ui; crazydots + 4 7 2 1 Bindings für ResetScreen; xbios/crazydot/resetscr.ui; crazydots + 4 7 3 GetNumberofPModes; xbios/crazydot/getnofpm.ui; crazydots + 4 7 3 1 Bindings für GetNumberOfPModes; xbios/crazydot/getnofpm.ui; crazydots + 4 7 4 GetPMode; xbios/crazydot/getpmode.ui; crazydots + 4 7 4 1 Bindings für GetPMode; xbios/crazydot/getpmode.ui; crazydots + 4 7 5 ReadMode; xbios/crazydot/readmode.ui; crazydots + 4 7 5 1 Bindings für ReadMode; xbios/crazydot/readmode.ui; crazydots + 4 7 6 CopyModeToActiveMode; xbios/crazydot/cpmd2amd.ui; crazydots + 4 7 6 1 Bindings für CopyModeToActiveMode; xbios/crazydot/cpmd2amd.ui; crazydots + 4 7 7 ActiveModeNumber; xbios/crazydot/acmodenr.ui; crazydots + 4 7 7 1 Bindings für ActiveModeNumber; xbios/crazydot/acmodenr.ui; crazydots + 4 7 8 GetActiveModeDesc; xbios/crazydot/gamddesc.ui; crazydots + 4 7 8 1 Bindings für GetActiveModeDesc; xbios/crazydot/gamddesc.ui; crazydots + 4 7 9 GetRegisterbase; xbios/crazydot/gregbase.ui; crazydots + 4 7 9 1 Bindings für GetRegisterbase; xbios/crazydot/gregbase.ui; crazydots + 4 7 10 GetFeatures; xbios/crazydot/getfeat.ui; crazydots + 4 7 10 1 Bindings für GetFeatures; xbios/crazydot/getfeat.ui; crazydots + 4 7 11 GetActiveFeatures; xbios/crazydot/getafeat.ui; crazydots + 4 7 11 1 Bindings für GetActiveFeatures; xbios/crazydot/getafeat.ui; crazydots + 4 8 CT60-XBIOS-Erweiterung; xbios/ct60/ct60.u; ct60 + 4 8 1 ct60_cache; xbios/ct60/cache.ui; ct60 + 4 8 1 1 Bindings für ct60_cache; xbios/ct60/cache.ui; ct60 + 4 8 2 ct60_flush_cache; xbios/ct60/fl_cache.ui; ct60 + 4 8 2 1 Bindings für ct60_flush_cache; xbios/ct60/fl_cache.ui; ct60 + 4 8 3 ct60_read_core_temperature; xbios/ct60/rcortemp.ui; ct60 + 4 8 3 1 Bindings für ct60_read_core_temperature; xbios/ct60/rcortemp.ui; ct60 + 4 8 4 ct60_rw_parameter; xbios/ct60/rd_param.ui; ct60 + 4 8 4 1 Bindings für ct60_rw_parameter; xbios/ct60/rd_param.ui; ct60 + 4 8 5 ct60_vmalloc; xbios/ct60/ct60_vmalloc.ui; ct60 + 4 8 5 1 Bindings für ct60_vmalloc; xbios/ct60/ct60_vmalloc.ui; ct60 + 4 9 Datum, Uhrzeit und Zeitgeber; xbios/datetime/datetime.u; xbios_datetime + 4 9 1 Gettime; xbios/datetime/gettime.ui; xbios_datetime + 4 9 1 1 Bindings für Gettime; xbios/datetime/gettime.ui; xbios_datetime + 4 9 2 NVMaccess; xbios/datetime/nvmacces.ui; xbios_datetime + 4 9 2 1 Bindings für NVMaccess; xbios/datetime/nvmacces.ui; xbios_datetime + 4 9 3 Settime; xbios/datetime/settime.ui; xbios_datetime + 4 9 3 1 Bindings für Settime; xbios/datetime/settime.ui; xbios_datetime + 4 9 4 Xbtimer; xbios/datetime/xbtimer.ui; xbios_datetime + 4 9 4 1 Bindings für Xbtimer; xbios/datetime/xbtimer.ui; xbios_datetime + 4 9 5 Die Belegung des NVM der Echtzeit-Uhr; xbios/datetime/datetime.ui; xbios_datetime + 4 10 Druckerfunktionen; xbios/drucker/drucker.u; xbios_printer + 4 10 1 Prtblk; xbios/drucker/prtblk.ui; xbios_printer + 4 10 1 1 Bindings für Prtblk; xbios/drucker/prtblk.ui; xbios_printer + 4 10 2 Scrdmp; xbios/drucker/scrdmp.ui; xbios_printer + 4 10 2 1 Bindings für Scrdmp; xbios/drucker/scrdmp.ui; xbios_printer + 4 10 3 Setprt; xbios/drucker/setprt.ui; xbios_printer + 4 10 3 1 Bindings für Setprt; xbios/drucker/setprt.ui; xbios_printer + 4 11 DSP-Programmierung; xbios/dsp56001/dsp56001.u; xbios_dsp56001 + 4 11 1 Dsp_Available; xbios/dsp56001/availabl.ui; xbios_dsp56001 + 4 11 1 1 Bindings für Dsp_Available; xbios/dsp56001/availabl.ui; xbios_dsp56001 + 4 11 2 Dsp_BlkBytes; xbios/dsp56001/blkbytes.ui; xbios_dsp56001 + 4 11 2 1 Bindings für Dsp_BlkBytes; xbios/dsp56001/blkbytes.ui; xbios_dsp56001 + 4 11 3 Dsp_BlkHandShake; xbios/dsp56001/blkhndsh.ui; xbios_dsp56001 + 4 11 3 1 Bindings für Dsp_BlkHandShake; xbios/dsp56001/blkhndsh.ui; xbios_dsp56001 + 4 11 4 Dsp_BlkUnpacked; xbios/dsp56001/blkunpac.ui; xbios_dsp56001 + 4 11 4 1 Bindings für Dsp_BlkUnpacked; xbios/dsp56001/blkunpac.ui; xbios_dsp56001 + 4 11 5 Dsp_BlkWords; xbios/dsp56001/blkwords.ui; xbios_dsp56001 + 4 11 5 1 Bindings für Dsp_BlkWords; xbios/dsp56001/blkwords.ui; xbios_dsp56001 + 4 11 6 Dsp_DoBlock; xbios/dsp56001/doblock.ui; xbios_dsp56001 + 4 11 6 1 Bindings für Dsp_DoBlock; xbios/dsp56001/doblock.ui; xbios_dsp56001 + 4 11 7 Dsp_ExecBoot; xbios/dsp56001/execboot.ui; xbios_dsp56001 + 4 11 7 1 Bindings für Dsp_ExecBoot; xbios/dsp56001/execboot.ui; xbios_dsp56001 + 4 11 8 Dsp_ExecProg; xbios/dsp56001/execprog.ui; xbios_dsp56001 + 4 11 8 1 Bindings für Dsp_ExecProg; xbios/dsp56001/execprog.ui; xbios_dsp56001 + 4 11 9 Dsp_FlushSubroutines; xbios/dsp56001/flushsub.ui; xbios_dsp56001 + 4 11 9 1 Bindings für Dsp_FlushSubroutines; xbios/dsp56001/flushsub.ui; xbios_dsp56001 + 4 11 10 Dsp_GetProgAbility; xbios/dsp56001/getproga.ui; xbios_dsp56001 + 4 11 10 1 Bindings für Dsp_GetProgAbility; xbios/dsp56001/getproga.ui; xbios_dsp56001 + 4 11 11 Dsp_GetWordSize; xbios/dsp56001/getwords.ui; xbios_dsp56001 + 4 11 11 1 Bindings für Dsp_GetWordSize; xbios/dsp56001/getwords.ui; xbios_dsp56001 + 4 11 12 Dsp_Hf0; xbios/dsp56001/hf0.ui; xbios_dsp56001 + 4 11 12 1 Bindings für Dsp_Hf0; xbios/dsp56001/hf0.ui; xbios_dsp56001 + 4 11 13 Dsp_Hf1; xbios/dsp56001/hf1.ui; xbios_dsp56001 + 4 11 13 1 Bindings für Dsp_Hf1; xbios/dsp56001/hf1.ui; xbios_dsp56001 + 4 11 14 Dsp_Hf2; xbios/dsp56001/hf2.ui; xbios_dsp56001 + 4 11 14 1 Bindings für Dsp_Hf2; xbios/dsp56001/hf2.ui; xbios_dsp56001 + 4 11 15 Dsp_Hf3; xbios/dsp56001/hf3.ui; xbios_dsp56001 + 4 11 15 1 Bindings für Dsp_Hf3; xbios/dsp56001/hf3.ui; xbios_dsp56001 + 4 11 16 Dsp_HStat; xbios/dsp56001/hstat.ui; xbios_dsp56001 + 4 11 16 1 Bindings für Dsp_HStat; xbios/dsp56001/hstat.ui; xbios_dsp56001 + 4 11 17 Dsp_InqSubrAbility; xbios/dsp56001/inqsubra.ui; xbios_dsp56001 + 4 11 17 1 Bindings für Dsp_InqSubrAbility; xbios/dsp56001/inqsubra.ui; xbios_dsp56001 + 4 11 18 Dsp_InStream; xbios/dsp56001/instream.ui; xbios_dsp56001 + 4 11 18 1 Bindings für Dsp_InStream; xbios/dsp56001/instream.ui; xbios_dsp56001 + 4 11 19 Dsp_IOStream; xbios/dsp56001/iostream.ui; xbios_dsp56001 + 4 11 19 1 Bindings für Dsp_IOStream; xbios/dsp56001/iostream.ui; xbios_dsp56001 + 4 11 20 Dsp_LoadProg; xbios/dsp56001/loadprog.ui; xbios_dsp56001 + 4 11 20 1 Bindings für Dsp_LoadProg; xbios/dsp56001/loadprog.ui; xbios_dsp56001 + 4 11 21 Dsp_LoadSubroutine; xbios/dsp56001/loadsubr.ui; xbios_dsp56001 + 4 11 21 1 Bindings für Dsp_LoadSubroutine; xbios/dsp56001/loadsubr.ui; xbios_dsp56001 + 4 11 22 Dsp_Lock; xbios/dsp56001/lock.ui; xbios_dsp56001 + 4 11 22 1 Bindings für Dsp_Lock; xbios/dsp56001/lock.ui; xbios_dsp56001 + 4 11 23 Dsp_LodToBinary; xbios/dsp56001/lodtobin.ui; xbios_dsp56001 + 4 11 23 1 Bindings für Dsp_LodToBinary; xbios/dsp56001/lodtobin.ui; xbios_dsp56001 + 4 11 24 Dsp_MultBlocks; xbios/dsp56001/multbloc.ui; xbios_dsp56001 + 4 11 24 1 Bindings für Dsp_MultBlocks; xbios/dsp56001/multbloc.ui; xbios_dsp56001 + 4 11 25 Dsp_OutStream; xbios/dsp56001/outstrea.ui; xbios_dsp56001 + 4 11 25 1 Bindings für Dsp_OutStream; xbios/dsp56001/outstrea.ui; xbios_dsp56001 + 4 11 26 Dsp_RemoveInterrupts; xbios/dsp56001/removein.ui; xbios_dsp56001 + 4 11 26 1 Bindings für Dsp_RemoveInterrupts; xbios/dsp56001/removein.ui; xbios_dsp56001 + 4 11 27 Dsp_RequestUniqueAbility; xbios/dsp56001/requestu.ui; xbios_dsp56001 + 4 11 27 1 Bindings für Dsp_RequestUniqueAbility; xbios/dsp56001/requestu.ui; xbios_dsp56001 + 4 11 28 Dsp_Reserve; xbios/dsp56001/reserve.ui; xbios_dsp56001 + 4 11 28 1 Bindings für Dsp_Reserve; xbios/dsp56001/reserve.ui; xbios_dsp56001 + 4 11 29 Dsp_RunSubroutine; xbios/dsp56001/runsubro.ui; xbios_dsp56001 + 4 11 29 1 Bindings für Dsp_RunSubroutine; xbios/dsp56001/runsubro.ui; xbios_dsp56001 + 4 11 30 Dsp_SetVectors; xbios/dsp56001/setvecto.ui; xbios_dsp56001 + 4 11 30 1 Bindings für Dsp_SetVectors; xbios/dsp56001/setvecto.ui; xbios_dsp56001 + 4 11 31 Dsp_TriggerHC; xbios/dsp56001/triggerh.ui; xbios_dsp56001 + 4 11 31 1 Bindings für Dsp_TriggerHC; xbios/dsp56001/triggerh.ui; xbios_dsp56001 + 4 11 32 Dsp_Unlock; xbios/dsp56001/unlock.ui; xbios_dsp56001 + 4 11 32 1 Bindings für Dsp_Unlock; xbios/dsp56001/unlock.ui; xbios_dsp56001 + 4 12 Hatari-DHS-XBIOS-Erweiterung; xbios/dhs/dhs.u; xbios_dhs + 4 12 1 CounterRead; xbios/dhs/cyclesrd.ui; xbios_dhs + 4 12 1 1 Bindings für CounterRead; xbios/dhs/cyclesrd.ui; xbios_dhs + 4 12 2 CounterStart; xbios/dhs/cyclesst.ui; xbios_dhs + 4 12 2 1 Bindings für CounterStart; xbios/dhs/cyclesst.ui; xbios_dhs + 4 12 3 CPUFreq; xbios/dhs/frequenc.ui; xbios_dhs + 4 12 3 1 Bindings für CPUFreq; xbios/dhs/frequenc.ui; xbios_dhs + 4 12 4 Debug; xbios/dhs/debug.ui; xbios_dhs + 4 12 4 1 Bindings für Debug; xbios/dhs/debug.ui; xbios_dhs + 4 12 5 DebugUI; xbios/dhs/debugui.ui; xbios_dhs + 4 12 5 1 Bindings für DebugUI; xbios/dhs/debugui.ui; xbios_dhs + 4 12 6 HatariOption; xbios/dhs/hatariop.ui; xbios_dhs + 4 12 6 1 Bindings für HatariOption; xbios/dhs/hatariop.ui; xbios_dhs + 4 12 7 Registers; xbios/dhs/register.ui; xbios_dhs + 4 12 7 1 Bindings für Registers; xbios/dhs/register.ui; xbios_dhs + 4 13 Interruptfunktionen; xbios/interrpt/interrpt.u; xbios_interrupt + 4 13 1 Jdisint; xbios/interrpt/jdisint.ui; xbios_interrupt + 4 13 1 1 Bindings für Jdisint; xbios/interrpt/jdisint.ui; xbios_interrupt + 4 13 2 Jenabint; xbios/interrpt/jenabint.ui; xbios_interrupt + 4 13 2 1 Bindings für Jenabint; xbios/interrpt/jenabint.ui; xbios_interrupt + 4 14 Laufwerksfunktionen; xbios/laufwerk/laufwerk.u; xbios_drive + 4 14 1 DMAread; xbios/laufwerk/dmaread.ui; xbios_drive + 4 14 1 1 Bindings für DMAread; xbios/laufwerk/dmaread.ui; xbios_drive + 4 14 2 DMAwrite; xbios/laufwerk/dmawrite.ui; xbios_drive + 4 14 2 1 Bindings für DMAwrite; xbios/laufwerk/dmawrite.ui; xbios_drive + 4 14 3 Flopfmt; xbios/laufwerk/flopfmt.ui; xbios_drive + 4 14 3 1 Bindings für Flopfmt; xbios/laufwerk/flopfmt.ui; xbios_drive + 4 14 4 Floprate; xbios/laufwerk/floprate.ui; xbios_drive + 4 14 4 1 Bindings für Floprate; xbios/laufwerk/floprate.ui; xbios_drive + 4 14 4 2 Seekrate für alle TOS-Versionen; xbios/laufwerk/floprate.ui; xbios_drive + 4 14 5 Floprd; xbios/laufwerk/floprd.ui; xbios_drive + 4 14 5 1 Bindings für Floprd; xbios/laufwerk/floprd.ui; xbios_drive + 4 14 6 Flopver; xbios/laufwerk/flopver.ui; xbios_drive + 4 14 6 1 Bindings für Flopver; xbios/laufwerk/flopver.ui; xbios_drive + 4 14 7 Flopwr; xbios/laufwerk/flopwr.ui; xbios_drive + 4 14 7 1 Bindings für Flopwr; xbios/laufwerk/flopwr.ui; xbios_drive + 4 14 8 Metaclose; xbios/laufwerk/metaclos.ui; xbios_drive + 4 14 8 1 Bindings für Metaclose; xbios/laufwerk/metaclos.ui; xbios_drive + 4 14 9 Metadiscinfo; xbios/laufwerk/metadinf.ui; xbios_drive + 4 14 9 1 Bindings für Metadiscinfo; xbios/laufwerk/metadinf.ui; xbios_drive + 4 14 10 Metagettoc; xbios/laufwerk/metagett.ui; xbios_drive + 4 14 10 1 Bindings für Metagettoc; xbios/laufwerk/metagett.ui; xbios_drive + 4 14 11 Metainit; xbios/laufwerk/metainit.ui; xbios_drive + 4 14 11 1 Bindings für Metainit; xbios/laufwerk/metainit.ui; xbios_drive + 4 14 12 Metaioctl; xbios/laufwerk/metaioct.ui; xbios_drive + 4 14 12 1 Bindings für Metaioctl; xbios/laufwerk/metaioct.ui; xbios_drive + 4 14 13 Metaopen; xbios/laufwerk/metaopen.ui; xbios_drive + 4 14 13 1 Bindings für Metaopen; xbios/laufwerk/metaopen.ui; xbios_drive + 4 14 14 Metaread; xbios/laufwerk/metaread.ui; xbios_drive + 4 14 14 1 Bindings für Metaread; xbios/laufwerk/metaread.ui; xbios_drive + 4 14 15 Metaseek; xbios/laufwerk/metaseek.ui; xbios_drive + 4 14 15 1 Bindings für Metaseek; xbios/laufwerk/metaseek.ui; xbios_drive + 4 14 16 Metasetsongtime; xbios/laufwerk/metasets.ui; xbios_drive + 4 14 16 1 Bindings für Metasetsongtime; xbios/laufwerk/metasets.ui; xbios_drive + 4 14 17 Metastartaudio; xbios/laufwerk/metastar.ui; xbios_drive + 4 14 17 1 Bindings für Metastartaudio; xbios/laufwerk/metastar.ui; xbios_drive + 4 14 18 Metastatus; xbios/laufwerk/metastat.ui; xbios_drive + 4 14 18 1 Bindings für Metastatus; xbios/laufwerk/metastat.ui; xbios_drive + 4 14 19 Metastopaudio; xbios/laufwerk/metastop.ui; xbios_drive + 4 14 19 1 Bindings für Metastopaudio; xbios/laufwerk/metastop.ui; xbios_drive + 4 14 20 Metawrite; xbios/laufwerk/metawrit.ui; xbios_drive + 4 14 20 1 Bindings für Metawrite; xbios/laufwerk/metawrit.ui; xbios_drive + 4 14 21 Protobt; xbios/laufwerk/protobt.ui; xbios_drive + 4 14 21 1 Bindings für Protobt; xbios/laufwerk/protobt.ui; xbios_drive + 4 15 MATRIX-XBIOS-Erweiterung; xbios/matrix/matrix.u; matrix_XBIOS_extension + 4 15 1 MatScreen - Cxx; xbios/matrix/matrix.u; matrix_XBIOS_extension + 4 15 2 MatGraph - TCxx; xbios/matrix/matrix.u; matrix_XBIOS_extension + 4 16 OverScan-XBIOS-Erweiterungen; xbios/overscan/overscan.u; xbios_overscan + 4 16 1 Oscanis; xbios/overscan/oscanis.ui; xbios_overscan + 4 16 1 1 Bindings für Oscanis; xbios/overscan/oscanis.ui; xbios_overscan + 4 16 2 Oscanpatch; xbios/overscan/oscanpat.ui; xbios_overscan + 4 16 2 1 Bindings für Oscanpatch; xbios/overscan/oscanpat.ui; xbios_overscan + 4 16 3 Oscanphy; xbios/overscan/oscanphy.ui; xbios_overscan + 4 16 3 1 Bindings für Oscanphy; xbios/overscan/oscanphy.ui; xbios_overscan + 4 16 4 Oscanscr; xbios/overscan/oscanscr.ui; xbios_overscan + 4 16 4 1 Bindings für Oscanscr; xbios/overscan/oscanscr.ui; xbios_overscan + 4 16 5 Oscanswitch; xbios/overscan/oscanswi.ui; xbios_overscan + 4 16 5 1 Bindings für Oscanswitch; xbios/overscan/oscanswi.ui; xbios_overscan + 4 16 6 Oscantab; xbios/overscan/oscantab.ui; xbios_overscan + 4 16 6 1 Bindings für Oscantab; xbios/overscan/oscantab.ui; xbios_overscan + 4 16 7 Oscanvb; xbios/overscan/oscanvb.ui; xbios_overscan + 4 16 7 1 Bindings für Oscanvb; xbios/overscan/oscanvb.ui; xbios_overscan + 4 17 PCI-BIOS; xbios/pci_bios/pci_bios.u; PCI_BIOS + 4 17 1 bus_to_virt; xbios/pci_bios/bus_to_virt.ui; PCI_BIOS + 4 17 1 1 Bindings für bus_to_virt; xbios/pci_bios/bus_to_virt.ui; PCI_BIOS + 4 17 2 fast_read_config_byte; xbios/pci_bios/fast_read_config_byte.ui; PCI_BIOS + 4 17 2 1 Bindings für fast_read_config_byte; xbios/pci_bios/fast_read_config_byte.ui; PCI_BIOS + 4 17 3 fast_read_config_longword; xbios/pci_bios/fast_read_config_longword.ui; PCI_BIOS + 4 17 3 1 Bindings für fast_read_config_longword; xbios/pci_bios/fast_read_config_longword.ui; PCI_BIOS + 4 17 4 fast_read_config_word; xbios/pci_bios/fast_read_config_word.ui; PCI_BIOS + 4 17 4 1 Bindings für fast_read_config_word; xbios/pci_bios/fast_read_config_word.ui; PCI_BIOS + 4 17 5 fast_read_io_byte; xbios/pci_bios/fast_read_io_byte.ui; PCI_BIOS + 4 17 5 1 Bindings für fast_read_io_byte; xbios/pci_bios/fast_read_io_byte.ui; PCI_BIOS + 4 17 6 fast_read_io_longword; xbios/pci_bios/fast_read_io_longword.ui; PCI_BIOS + 4 17 6 1 Bindings für fast_read_io_longword; xbios/pci_bios/fast_read_io_longword.ui; PCI_BIOS + 4 17 7 fast_read_io_word; xbios/pci_bios/fast_read_io_word.ui; PCI_BIOS + 4 17 7 1 Bindings für fast_read_io_word; xbios/pci_bios/fast_read_io_word.ui; PCI_BIOS + 4 17 8 fast_read_mem_byte; xbios/pci_bios/fast_read_mem_byte.ui; PCI_BIOS + 4 17 8 1 Bindings für fast_read_mem_byte; xbios/pci_bios/fast_read_mem_byte.ui; PCI_BIOS + 4 17 9 fast_read_mem_longword; xbios/pci_bios/fast_read_mem_longword.ui; PCI_BIOS + 4 17 9 1 Bindings für fast_read_mem_longword; xbios/pci_bios/fast_read_mem_longword.ui; PCI_BIOS + 4 17 10 fast_read_mem_word; xbios/pci_bios/fast_read_mem_word.ui; PCI_BIOS + 4 17 10 1 Bindings für fast_read_mem_word; xbios/pci_bios/fast_read_mem_word.ui; PCI_BIOS + 4 17 11 find_pci_classcode; xbios/pci_bios/fpclassc.ui; PCI_BIOS + 4 17 11 1 Bindings für find_pci_classcode; xbios/pci_bios/fpclassc.ui; PCI_BIOS + 4 17 12 find_pci_device; xbios/pci_bios/fpdevice.ui; PCI_BIOS + 4 17 12 1 Bindings für find_pci_device; xbios/pci_bios/fpdevice.ui; PCI_BIOS + 4 17 13 get_card_used; xbios/pci_bios/get_card_used.ui; PCI_BIOS + 4 17 13 1 Bindings für get_card_used; xbios/pci_bios/get_card_used.ui; PCI_BIOS + 4 17 14 get_machine_id; xbios/pci_bios/get_machine_id.ui; PCI_BIOS + 4 17 14 1 Bindings für get_machine_id; xbios/pci_bios/get_machine_id.ui; PCI_BIOS + 4 17 15 get_pagesize; xbios/pci_bios/get_pagesize.ui; PCI_BIOS + 4 17 15 1 Bindings für get_pagesize; xbios/pci_bios/get_pagesize.ui; PCI_BIOS + 4 17 16 get_resource; xbios/pci_bios/get_resource.ui; PCI_BIOS + 4 17 16 1 Bindings für get_resource; xbios/pci_bios/get_resource.ui; PCI_BIOS + 4 17 17 get_routing; xbios/pci_bios/get_routing.ui; PCI_BIOS + 4 17 17 1 Bindings für get_routing; xbios/pci_bios/get_routing.ui; PCI_BIOS + 4 17 18 hook_interrupt; xbios/pci_bios/hook_interrupt.ui; PCI_BIOS + 4 17 18 1 Bindings für hook_interrupt; xbios/pci_bios/hook_interrupt.ui; PCI_BIOS + 4 17 19 phys_to_virt; xbios/pci_bios/phys_to_virt.ui; PCI_BIOS + 4 17 19 1 Bindings für phys_to_virt; xbios/pci_bios/phys_to_virt.ui; PCI_BIOS + 4 17 20 read_config_byte; xbios/pci_bios/read_config_byte.ui; PCI_BIOS + 4 17 20 1 Bindings für read_config_byte; xbios/pci_bios/read_config_byte.ui; PCI_BIOS + 4 17 21 read_config_longword; xbios/pci_bios/read_config_longword.ui; PCI_BIOS + 4 17 21 1 Bindings für read_config_longword; xbios/pci_bios/read_config_longword.ui; PCI_BIOS + 4 17 22 read_config_word; xbios/pci_bios/read_config_word.ui; PCI_BIOS + 4 17 22 1 Bindings für read_config_word; xbios/pci_bios/read_config_word.ui; PCI_BIOS + 4 17 23 read_io_byte; xbios/pci_bios/read_io_byte.ui; PCI_BIOS + 4 17 23 1 Bindings für read_io_byte; xbios/pci_bios/read_io_byte.ui; PCI_BIOS + 4 17 24 read_io_longword; xbios/pci_bios/read_io_longword.ui; PCI_BIOS + 4 17 24 1 Bindings für read_io_longword; xbios/pci_bios/read_io_longword.ui; PCI_BIOS + 4 17 25 read_io_word; xbios/pci_bios/read_io_word.ui; PCI_BIOS + 4 17 25 1 Bindings für read_io_word; xbios/pci_bios/read_io_word.ui; PCI_BIOS + 4 17 26 read_mem_byte; xbios/pci_bios/read_mem_byte.ui; PCI_BIOS + 4 17 26 1 Bindings für read_mem_byte; xbios/pci_bios/read_mem_byte.ui; PCI_BIOS + 4 17 27 read_mem_longword; xbios/pci_bios/read_mem_longword.ui; PCI_BIOS + 4 17 27 1 Bindings für read_mem_longword; xbios/pci_bios/read_mem_longword.ui; PCI_BIOS + 4 17 28 read_mem_word; xbios/pci_bios/read_mem_word.ui; PCI_BIOS + 4 17 28 1 Bindings für read_mem_word; xbios/pci_bios/read_mem_word.ui; PCI_BIOS + 4 17 29 set_card_used; xbios/pci_bios/set_card_used.ui; PCI_BIOS + 4 17 29 1 Bindings für set_card_used; xbios/pci_bios/set_card_used.ui; PCI_BIOS + 4 17 30 set_interrupt; xbios/pci_bios/set_interrupt.ui; PCI_BIOS + 4 17 30 1 Bindings für set_interrupt; xbios/pci_bios/set_interrupt.ui; PCI_BIOS + 4 17 31 special_cycle; xbios/pci_bios/special_cycle.ui; PCI_BIOS + 4 17 31 1 Bindings für special_cycle; xbios/pci_bios/special_cycle.ui; PCI_BIOS + 4 17 32 unhook_interrupt; xbios/pci_bios/unhook_interrupt.ui; PCI_BIOS + 4 17 32 1 Bindings für unhook_interrupt; xbios/pci_bios/unhook_interrupt.ui; PCI_BIOS + 4 17 33 virt_to_bus; xbios/pci_bios/virt_to_bus.ui; PCI_BIOS + 4 17 33 1 Bindings für virt_to_bus; xbios/pci_bios/virt_to_bus.ui; PCI_BIOS + 4 17 34 virt_to_phys; xbios/pci_bios/virt_to_phys.ui; PCI_BIOS + 4 17 34 1 Bindings für virt_to_phys; xbios/pci_bios/virt_to_phys.ui; PCI_BIOS + 4 17 35 write_config_byte; xbios/pci_bios/write_config_byte.ui; PCI_BIOS + 4 17 35 1 Bindings für write_config_byte; xbios/pci_bios/write_config_byte.ui; PCI_BIOS + 4 17 36 write_config_longword; xbios/pci_bios/write_config_longword.ui; PCI_BIOS + 4 17 36 1 Bindings für write_config_longword; xbios/pci_bios/write_config_longword.ui; PCI_BIOS + 4 17 37 write_config_word; xbios/pci_bios/write_config_word.ui; PCI_BIOS + 4 17 37 1 Bindings für write_config_word; xbios/pci_bios/write_config_word.ui; PCI_BIOS + 4 17 38 write_io_byte; xbios/pci_bios/write_io_byte.ui; PCI_BIOS + 4 17 38 1 Bindings für write_io_byte; xbios/pci_bios/write_io_byte.ui; PCI_BIOS + 4 17 39 write_io_longword; xbios/pci_bios/write_io_longword.ui; PCI_BIOS + 4 17 39 1 Bindings für write_io_longword; xbios/pci_bios/write_io_longword.ui; PCI_BIOS + 4 17 40 write_io_word; xbios/pci_bios/write_io_word.ui; PCI_BIOS + 4 17 40 1 Bindings für write_io_word; xbios/pci_bios/write_io_word.ui; PCI_BIOS + 4 17 41 write_mem_byte; xbios/pci_bios/write_mem_byte.ui; PCI_BIOS + 4 17 41 1 Bindings für write_mem_byte; xbios/pci_bios/write_mem_byte.ui; PCI_BIOS + 4 17 42 write_mem_longword; xbios/pci_bios/write_mem_longword.ui; PCI_BIOS + 4 17 42 1 Bindings für write_mem_longword; xbios/pci_bios/write_mem_longword.ui; PCI_BIOS + 4 17 43 write_mem_word; xbios/pci_bios/write_mem_word.ui; PCI_BIOS + 4 17 43 1 Bindings für write_mem_word; xbios/pci_bios/write_mem_word.ui; PCI_BIOS + 4 17 44 PCI-BIOS Fehlercodes; xbios/pci_bios/error.ui; PCI_BIOS + 4 18 Schnittstellenprogrammierung; xbios/intrface/intrface.u; xbios_interface + 4 18 1 Bconmap; xbios/intrface/bconmap.ui; xbios_interface + 4 18 1 1 Bindings für Bconmap; xbios/intrface/bconmap.ui; xbios_interface + 4 18 2 Dosound; xbios/intrface/dosound.ui; xbios_interface + 4 18 2 1 Bindings für Dosound; xbios/intrface/dosound.ui; xbios_interface + 4 18 3 ExtRsConf; xbios/intrface/extrscon.ui; xbios_interface + 4 18 3 1 Bindings für ExtRsConf; xbios/intrface/extrscon.ui; xbios_interface + 4 18 4 Giaccess; xbios/intrface/giaccess.ui; xbios_interface + 4 18 4 1 Bindings für Giaccess; xbios/intrface/giaccess.ui; xbios_interface + 4 18 5 Ikbdws; xbios/intrface/ikbdws.ui; xbios_interface + 4 18 5 1 Bindings für Ikbdws; xbios/intrface/ikbdws.ui; xbios_interface + 4 18 6 Iorec; xbios/intrface/iorec.ui; xbios_interface + 4 18 6 1 Bindings für Iorec; xbios/intrface/iorec.ui; xbios_interface + 4 18 7 Kbdvbase; xbios/intrface/kbdvbase.ui; xbios_interface + 4 18 7 1 Bindings für Kbdvbase; xbios/intrface/kbdvbase.ui; xbios_interface + 4 18 8 Mfpint; xbios/intrface/mfpint.ui; xbios_interface + 4 18 8 1 Bindings für Mfpint; xbios/intrface/mfpint.ui; xbios_interface + 4 18 9 Midiws; xbios/intrface/midiws.ui; xbios_interface + 4 18 9 1 Bindings für Midiws; xbios/intrface/midiws.ui; xbios_interface + 4 18 10 Offgibit; xbios/intrface/offgibit.ui; xbios_interface + 4 18 10 1 Bindings für Offgibit; xbios/intrface/offgibit.ui; xbios_interface + 4 18 11 Ongibit; xbios/intrface/ongibit.ui; xbios_interface + 4 18 11 1 Bindings für Ongibit; xbios/intrface/ongibit.ui; xbios_interface + 4 18 12 Rsconf; xbios/intrface/rsconf.ui; xbios_interface + 4 18 12 1 Bindings für Rsconf; xbios/intrface/rsconf.ui; xbios_interface + 4 19 Soundroutinen; xbios/sound/sound.u; xbios_sound + 4 19 1 buffoper; xbios/sound/buffoper.ui; xbios_sound + 4 19 1 1 Bindings für buffoper; xbios/sound/buffoper.ui; xbios_sound + 4 19 2 buffptr; xbios/sound/buffptr.ui; xbios_sound + 4 19 2 1 Bindings für buffptr; xbios/sound/buffptr.ui; xbios_sound + 4 19 3 devconnect; xbios/sound/devconne.ui; xbios_sound + 4 19 3 1 Bindings für devconnect; xbios/sound/devconne.ui; xbios_sound + 4 19 4 dsptristate; xbios/sound/dsptrist.ui; xbios_sound + 4 19 4 1 Bindings für dsptristate; xbios/sound/dsptrist.ui; xbios_sound + 4 19 5 gpio; xbios/sound/gpio.ui; xbios_sound + 4 19 5 1 Bindings für gpio; xbios/sound/gpio.ui; xbios_sound + 4 19 6 locksnd; xbios/sound/locksnd.ui; xbios_sound + 4 19 6 1 Bindings für locksnd; xbios/sound/locksnd.ui; xbios_sound + 4 19 7 setbuffer; xbios/sound/setbuffe.ui; xbios_sound + 4 19 7 1 Bindings für setbuffer; xbios/sound/setbuffe.ui; xbios_sound + 4 19 8 setinterrupt; xbios/sound/setinter.ui; xbios_sound + 4 19 8 1 Bindings für setinterrupt; xbios/sound/setinter.ui; xbios_sound + 4 19 9 setmode; xbios/sound/setmode.ui; xbios_sound + 4 19 9 1 Bindings für setmode; xbios/sound/setmode.ui; xbios_sound + 4 19 10 setmontracks; xbios/sound/setmontr.ui; xbios_sound + 4 19 10 1 Bindings für setmontracks; xbios/sound/setmontr.ui; xbios_sound + 4 19 11 settracks; xbios/sound/settrack.ui; xbios_sound + 4 19 11 1 Bindings für settracks; xbios/sound/settrack.ui; xbios_sound + 4 19 12 sndstatus; xbios/sound/sndstatu.ui; xbios_sound + 4 19 12 1 Bindings für sndstatus; xbios/sound/sndstatu.ui; xbios_sound + 4 19 13 soundcmd; xbios/sound/soundcmd.ui; xbios_sound + 4 19 13 1 Bindings für soundcmd; xbios/sound/soundcmd.ui; xbios_sound + 4 19 14 StarTrack; xbios/sound/startrac.ui; xbios_sound + 4 19 15 installed; xbios/startrac/installe.ui; xbios_sound + 4 19 15 1 Bindings für installed; xbios/startrac/installe.ui; xbios_sound + 4 19 16 cardslot; xbios/startrac/cardslot.ui; xbios_sound + 4 19 16 1 Bindings für cardslot; xbios/startrac/cardslot.ui; xbios_sound + 4 19 17 cardsel; xbios/startrac/cardsel.ui; xbios_sound + 4 19 17 1 Bindings für cardsel; xbios/startrac/cardsel.ui; xbios_sound + 4 19 18 cardmagic; xbios/startrac/cardmagi.ui; xbios_sound + 4 19 18 1 Bindings für cardmagic; xbios/startrac/cardmagi.ui; xbios_sound + 4 19 19 cardadr; xbios/startrac/cardadr.ui; xbios_sound + 4 19 19 1 Bindings für cardadr; xbios/startrac/cardadr.ui; xbios_sound + 4 19 20 digana; xbios/startrac/digana.ui; xbios_sound + 4 19 20 1 Bindings für digana; xbios/startrac/digana.ui; xbios_sound + 4 19 21 digcom; xbios/startrac/digcom.ui; xbios_sound + 4 19 21 1 Bindings für digcom; xbios/startrac/digcom.ui; xbios_sound + 4 19 22 dspmode; xbios/startrac/dspmode.ui; xbios_sound + 4 19 22 1 Bindings für dspmode; xbios/startrac/dspmode.ui; xbios_sound + 4 19 23 sclock; xbios/startrac/sclock.ui; xbios_sound + 4 19 23 1 Bindings für sclock; xbios/startrac/sclock.ui; xbios_sound + 4 19 24 highsrate; xbios/startrac/highsrat.ui; xbios_sound + 4 19 24 1 Bindings für highsrate; xbios/startrac/highsrat.ui; xbios_sound + 4 19 25 bypass; xbios/startrac/bypass.ui; xbios_sound + 4 19 25 1 Bindings für bypass; xbios/startrac/bypass.ui; xbios_sound + 4 19 26 recmode; xbios/startrac/recmode.ui; xbios_sound + 4 19 26 1 Bindings für recmode; xbios/startrac/recmode.ui; xbios_sound + 4 19 27 playmode; xbios/startrac/playmode.ui; xbios_sound + 4 19 27 1 Bindings für playmode; xbios/startrac/playmode.ui; xbios_sound + 4 19 28 mode24; xbios/startrac/mode24.ui; xbios_sound + 4 19 28 1 Bindings für mode24; xbios/startrac/mode24.ui; xbios_sound + 4 19 29 digmode; xbios/startrac/digmode.ui; xbios_sound + 4 19 29 1 Bindings für digmode; xbios/startrac/digmode.ui; xbios_sound + 4 19 30 scmsmode; xbios/startrac/scmsmode.ui; xbios_sound + 4 19 30 1 Bindings für scmsmode; xbios/startrac/scmsmode.ui; xbios_sound + 4 19 31 mycopybit; xbios/startrac/mycopybi.ui; xbios_sound + 4 19 31 1 Bindings für mycopybit; xbios/startrac/mycopybi.ui; xbios_sound + 4 19 32 emphasis; xbios/startrac/emphasis.ui; xbios_sound + 4 19 32 1 Bindings für emphasis; xbios/startrac/emphasis.ui; xbios_sound + 4 19 33 digsrate; xbios/startrac/digsrate.ui; xbios_sound + 4 19 33 1 Bindings für digsrate; xbios/startrac/digsrate.ui; xbios_sound + 4 19 34 digcode; xbios/startrac/digcode.ui; xbios_sound + 4 19 34 1 Bindings für digcode; xbios/startrac/digcode.ui; xbios_sound + 4 19 35 errorcode; xbios/startrac/errorcod.ui; xbios_sound + 4 19 35 1 Bindings für errorcode; xbios/startrac/errorcod.ui; xbios_sound + 4 19 36 cblmode; xbios/startrac/cblmode.ui; xbios_sound + 4 19 36 1 Bindings für cblmode; xbios/startrac/cblmode.ui; xbios_sound + 4 19 37 cblread; xbios/startrac/cblread.ui; xbios_sound + 4 19 37 1 Bindings für cblread; xbios/startrac/cblread.ui; xbios_sound + 4 19 38 recstat; xbios/startrac/recstat.ui; xbios_sound + 4 19 38 1 Bindings für recstat; xbios/startrac/recstat.ui; xbios_sound + 4 19 39 playstat; xbios/startrac/playstat.ui; xbios_sound + 4 19 39 1 Bindings für playstat; xbios/startrac/playstat.ui; xbios_sound + 4 19 40 volad; xbios/startrac/volad.ui; xbios_sound + 4 19 40 1 Bindings für volad; xbios/startrac/volad.ui; xbios_sound + 4 19 41 volda; xbios/startrac/volda.ui; xbios_sound + 4 19 41 1 Bindings für volda; xbios/startrac/volda.ui; xbios_sound + 4 19 42 readsmp; xbios/startrac/readsmp.ui; xbios_sound + 4 19 42 1 Bindings für readsmp; xbios/startrac/readsmp.ui; xbios_sound + 4 19 43 writesmp; xbios/startrac/writesmp.ui; xbios_sound + 4 19 43 1 Bindings für writesmp; xbios/startrac/writesmp.ui; xbios_sound + 4 19 44 intact; xbios/startrac/intact.ui; xbios_sound + 4 19 44 1 Bindings für intact; xbios/startrac/intact.ui; xbios_sound + 4 19 45 dspintact; xbios/startrac/dspintac.ui; xbios_sound + 4 19 45 1 Bindings für dspintact; xbios/startrac/dspintac.ui; xbios_sound + 4 19 46 sysreset; xbios/startrac/sysreset.ui; xbios_sound + 4 19 46 1 Bindings für sysreset; xbios/startrac/sysreset.ui; xbios_sound + 4 19 47 dspreset; xbios/startrac/dspreset.ui; xbios_sound + 4 19 47 1 Bindings für dspreset; xbios/startrac/dspreset.ui; xbios_sound + 4 19 48 dspmemory; xbios/startrac/dspmemor.ui; xbios_sound + 4 19 48 1 Bindings für dspmemory; xbios/startrac/dspmemor.ui; xbios_sound + 4 19 49 clkdivide; xbios/startrac/clkdivid.ui; xbios_sound + 4 19 49 1 Bindings für clkdivide; xbios/startrac/clkdivid.ui; xbios_sound + 4 19 50 pathset; xbios/startrac/pathset.ui; xbios_sound + 4 19 50 1 Bindings für pathset; xbios/startrac/pathset.ui; xbios_sound + 4 19 51 dsp_hostcommand; xbios/startrac/dsp_host.ui; xbios_sound + 4 19 51 1 Bindings für dsp_hostcommand; xbios/startrac/dsp_host.ui; xbios_sound + 4 19 52 dspclear; xbios/startrac/dspclear.ui; xbios_sound + 4 19 52 1 Bindings für dspclear; xbios/startrac/dspclear.ui; xbios_sound + 4 19 53 mix; xbios/startrac/mix.ui; xbios_sound + 4 19 53 1 Bindings für mix; xbios/startrac/mix.ui; xbios_sound + 4 19 54 dspmix; xbios/startrac/dspmix.ui; xbios_sound + 4 19 54 1 Bindings für dspmix; xbios/startrac/dspmix.ui; xbios_sound + 4 19 55 monitor; xbios/startrac/monitor.ui; xbios_sound + 4 19 55 1 Bindings für monitor; xbios/startrac/monitor.ui; xbios_sound + 4 19 56 recwait; xbios/startrac/recwait.ui; xbios_sound + 4 19 56 1 Bindings für recwait; xbios/startrac/recwait.ui; xbios_sound + 4 19 57 memrec; xbios/startrac/memrec.ui; xbios_sound + 4 19 57 1 Bindings für memrec; xbios/startrac/memrec.ui; xbios_sound + 4 19 58 memplay; xbios/startrac/memplay.ui; xbios_sound + 4 19 58 1 Bindings für memplay; xbios/startrac/memplay.ui; xbios_sound + 4 19 59 recplay; xbios/startrac/recplay.ui; xbios_sound + 4 19 59 1 Bindings für recplay; xbios/startrac/recplay.ui; xbios_sound + 4 19 60 hardrec; xbios/startrac/hardrec.ui; xbios_sound + 4 19 60 1 Bindings für hardrec; xbios/startrac/hardrec.ui; xbios_sound + 4 19 61 hardplay; xbios/startrac/hardplay.ui; xbios_sound + 4 19 61 1 Bindings für hardplay; xbios/startrac/hardplay.ui; xbios_sound + 4 19 62 hrecplay; xbios/startrac/hrecplay.ui; xbios_sound + 4 19 62 1 Bindings für hrecplay; xbios/startrac/hrecplay.ui; xbios_sound + 4 19 63 init_peak; xbios/startrac/init_pea.ui; xbios_sound + 4 19 63 1 Bindings für init_peak; xbios/startrac/init_pea.ui; xbios_sound + 4 19 64 init_imemrec; xbios/startrac/init_ime.ui; xbios_sound + 4 19 64 1 Bindings für init_imemrec; xbios/startrac/init_ime.ui; xbios_sound + 4 19 65 init_imemplay; xbios/startrac/init_ipl.ui; xbios_sound + 4 19 65 1 Bindings für init_imemplay; xbios/startrac/init_ipl.ui; xbios_sound + 4 19 66 init_implaymix; xbios/startrac/init_ipm.ui; xbios_sound + 4 19 66 1 Bindings für init_implaymix; xbios/startrac/init_ipm.ui; xbios_sound + 4 19 67 init_hrec; xbios/startrac/init_hre.ui; xbios_sound + 4 19 67 1 Bindings für init_hrec; xbios/startrac/init_hre.ui; xbios_sound + 4 19 68 init_hplay; xbios/startrac/init_hpl.ui; xbios_sound + 4 19 68 1 Bindings für init_hplay; xbios/startrac/init_hpl.ui; xbios_sound + 4 19 69 init_ihplaymix; xbios/startrac/init_hpm.ui; xbios_sound + 4 19 69 1 Bindings für init_ihplaymix; xbios/startrac/init_hpm.ui; xbios_sound + 4 19 70 init_mrecpeak; xbios/startrac/init_mrp.ui; xbios_sound + 4 19 70 1 Bindings für init_mrecpeak; xbios/startrac/init_mrp.ui; xbios_sound + 4 19 71 init_mplaypeak; xbios/startrac/init_mpp.ui; xbios_sound + 4 19 71 1 Bindings für init_mplaypeak; xbios/startrac/init_mpp.ui; xbios_sound + 4 19 72 init_mrppeak; xbios/startrac/init_mpk.ui; xbios_sound + 4 19 72 1 Bindings für init_mrppeak; xbios/startrac/init_mpk.ui; xbios_sound + 4 19 73 init_hrecpeak; xbios/startrac/init_hrp.ui; xbios_sound + 4 19 73 1 Bindings für init_hrecpeak; xbios/startrac/init_hrp.ui; xbios_sound + 4 19 74 init_hplaypeak; xbios/startrac/init_hpp.ui; xbios_sound + 4 19 74 1 Bindings für init_hplaypeak; xbios/startrac/init_hpp.ui; xbios_sound + 4 19 75 init_hrppeak; xbios/startrac/init_hpk.ui; xbios_sound + 4 19 75 1 Bindings für init_hrppeak; xbios/startrac/init_hpk.ui; xbios_sound + 4 19 76 init_xmemrec; xbios/startrac/init_xmr.ui; xbios_sound + 4 19 76 1 Bindings für init_xmemrec; xbios/startrac/init_xmr.ui; xbios_sound + 4 19 77 init_xmemplay; xbios/startrac/init_xmp.ui; xbios_sound + 4 19 77 1 Bindings für init_xmemplay; xbios/startrac/init_xmp.ui; xbios_sound + 4 19 78 init_xmixplay; xbios/startrac/init_xxp.ui; xbios_sound + 4 19 78 1 Bindings für init_xmixplay; xbios/startrac/init_xxp.ui; xbios_sound + 4 19 79 init_xmemrec4; xbios/startrac/init_xr4.ui; xbios_sound + 4 19 79 1 Bindings für init_xmemrec4; xbios/startrac/init_xr4.ui; xbios_sound + 4 19 80 init_xmemplay4; xbios/startrac/init_xp4.ui; xbios_sound + 4 19 80 1 Bindings für init_xmemplay4; xbios/startrac/init_xp4.ui; xbios_sound + 4 19 81 peakshake; xbios/startrac/peakshak.ui; xbios_sound + 4 19 81 1 Bindings für peakshake; xbios/startrac/peakshak.ui; xbios_sound + 4 19 82 read_rlow; xbios/startrac/read_rlo.ui; xbios_sound + 4 19 82 1 Bindings für read_rlow; xbios/startrac/read_rlo.ui; xbios_sound + 4 19 83 read_rhi; xbios/startrac/read_rhi.ui; xbios_sound + 4 19 83 1 Bindings für read_rhi; xbios/startrac/read_rhi.ui; xbios_sound + 4 19 84 read_rdsp; xbios/startrac/read_rds.ui; xbios_sound + 4 19 84 1 Bindings für read_rdsp; xbios/startrac/read_rds.ui; xbios_sound + 4 19 85 read_raes; xbios/startrac/read_rae.ui; xbios_sound + 4 19 85 1 Bindings für read_raes; xbios/startrac/read_rae.ui; xbios_sound + 4 19 86 read_rint; xbios/startrac/read_rin.ui; xbios_sound + 4 19 86 1 Bindings für read_rint; xbios/startrac/read_rin.ui; xbios_sound + 4 19 87 wr_rlow; xbios/startrac/wr_rlow.ui; xbios_sound + 4 19 87 1 Bindings für wr_rlow; xbios/startrac/wr_rlow.ui; xbios_sound + 4 19 88 wr_rhi; xbios/startrac/wr_rhi.ui; xbios_sound + 4 19 88 1 Bindings für wr_rhi; xbios/startrac/wr_rhi.ui; xbios_sound + 4 19 89 wr_rdsp; xbios/startrac/wr_rdsp.ui; xbios_sound + 4 19 89 1 Bindings für wr_rdsp; xbios/startrac/wr_rdsp.ui; xbios_sound + 4 19 90 wr_raes; xbios/startrac/wr_raes.ui; xbios_sound + 4 19 90 1 Bindings für wr_raes; xbios/startrac/wr_raes.ui; xbios_sound + 4 19 91 wr_rint; xbios/startrac/wr_rint.ui; xbios_sound + 4 19 91 1 Bindings für wr_rint; xbios/startrac/wr_rint.ui; xbios_sound + 4 19 92 read_dpath1; xbios/startrac/read_dp1.ui; xbios_sound + 4 19 92 1 Bindings für read_dpath1; xbios/startrac/read_dp1.ui; xbios_sound + 4 19 93 read_dpath2; xbios/startrac/read_dp2.ui; xbios_sound + 4 19 93 1 Bindings für read_dpath2; xbios/startrac/read_dp2.ui; xbios_sound + 4 19 94 read_dport; xbios/startrac/read_dpo.ui; xbios_sound + 4 19 94 1 Bindings für read_dport; xbios/startrac/read_dpo.ui; xbios_sound + 4 19 95 read_dconv; xbios/startrac/read_dco.ui; xbios_sound + 4 19 95 1 Bindings für read_dconv; xbios/startrac/read_dco.ui; xbios_sound + 4 19 96 read_dpdat; xbios/startrac/read_dpd.ui; xbios_sound + 4 19 96 1 Bindings für read_dpdat; xbios/startrac/read_dpd.ui; xbios_sound + 4 19 97 read_dclk; xbios/startrac/read_dcl.ui; xbios_sound + 4 19 97 1 Bindings für read_dclk; xbios/startrac/read_dcl.ui; xbios_sound + 4 19 98 wr_dpath1; xbios/startrac/wr_dpat1.ui; xbios_sound + 4 19 98 1 Bindings für wr_dpath1; xbios/startrac/wr_dpat1.ui; xbios_sound + 4 19 99 wr_dpath2; xbios/startrac/wr_dpat2.ui; xbios_sound + 4 19 99 1 Bindings für wr_dpath2; xbios/startrac/wr_dpat2.ui; xbios_sound + 4 19 100 wr_dport; xbios/startrac/wr_dport.ui; xbios_sound + 4 19 100 1 Bindings für wr_dport; xbios/startrac/wr_dport.ui; xbios_sound + 4 19 101 wr_dconv; xbios/startrac/wr_dconv.ui; xbios_sound + 4 19 101 1 Bindings für wr_dconv; xbios/startrac/wr_dconv.ui; xbios_sound + 4 19 102 wr_dpdat; xbios/startrac/wr_dpdat.ui; xbios_sound + 4 19 102 1 Bindings für wr_dpdat; xbios/startrac/wr_dpdat.ui; xbios_sound + 4 19 103 wr_dclk; xbios/startrac/wr_dclk.ui; xbios_sound + 4 19 103 1 Bindings für wr_dclk; xbios/startrac/wr_dclk.ui; xbios_sound + 4 19 104 fastcut; xbios/startrac/fastcut.ui; xbios_sound + 4 19 104 1 Bindings für fastcut; xbios/startrac/fastcut.ui; xbios_sound + 4 19 105 peaksuch; xbios/startrac/peaksuch.ui; xbios_sound + 4 19 105 1 Bindings für peaksuch; xbios/startrac/peaksuch.ui; xbios_sound + 4 19 106 zerono; xbios/startrac/zerono.ui; xbios_sound + 4 19 106 1 Bindings für zerono; xbios/startrac/zerono.ui; xbios_sound + 4 19 107 fading; xbios/startrac/fading.ui; xbios_sound + 4 19 107 1 Bindings für fading; xbios/startrac/fading.ui; xbios_sound + 4 19 108 unlocksnd; xbios/sound/unlocksn.ui; xbios_sound + 4 19 108 1 Bindings für unlocksnd; xbios/sound/unlocksn.ui; xbios_sound + 4 19 109 WavePlay; xbios/sound/waveplay.ui; xbios_sound + 4 19 109 1 Bindings für WavePlay; xbios/sound/waveplay.ui; xbios_sound + 4 20 Spezialbefehle; xbios/spezial/spezial.u; xbios_special + 4 20 1 Blitmode; xbios/spezial/blitmode.ui; xbios_special + 4 20 1 1 Bindings für Blitmode; xbios/spezial/blitmode.ui; xbios_special + 4 20 2 CacheCtrl; xbios/spezial/cachectr.ui; xbios_special + 4 20 2 1 Bindings für CacheCtrl; xbios/spezial/cachectr.ui; xbios_special + 4 20 3 CJar; xbios/spezial/cjar.ui; xbios_special + 4 20 3 1 Bindings für CJar; xbios/spezial/cjar.ui; xbios_special + 4 20 4 Dbmsg; xbios/spezial/dbmsg.ui; xbios_special + 4 20 4 1 Bindings für Dbmsg; xbios/spezial/dbmsg.ui; xbios_special + 4 20 5 Janus; xbios/spezial/janus.ui; xbios_special + 4 20 5 1 Bindings für Janus; xbios/spezial/janus.ui; xbios_special + 4 20 6 Puntaes; xbios/spezial/puntaes.ui; xbios_special + 4 20 6 1 Bindings für Puntaes; xbios/spezial/puntaes.ui; xbios_special + 4 20 7 Random; xbios/spezial/random.ui; xbios_special + 4 20 7 1 Bindings für Random; xbios/spezial/random.ui; xbios_special + 4 20 8 Ssbrk; xbios/spezial/ssbrk.ui; xbios_special + 4 20 8 1 Bindings für Ssbrk; xbios/spezial/ssbrk.ui; xbios_special + 4 20 9 Supexec; xbios/spezial/supexec.ui; xbios_special + 4 20 9 1 Bindings für Supexec; xbios/spezial/supexec.ui; xbios_special + 4 20 10 Trapper; xbios/spezial/trapper.ui; xbios_special + 4 20 10 1 Bindings für Trapper; xbios/spezial/trapper.ui; xbios_special + 4 20 11 WdgCtrl; xbios/spezial/wdgctrl.ui; xbios_special + 4 20 11 1 Bindings für WdgCtrl; xbios/spezial/wdgctrl.ui; xbios_special + 4 21 Tastaturfunktionen; xbios/tastatur/tastatur.u; xbios_keyboard + 4 21 1 Bioskeys; xbios/tastatur/bioskeys.ui; xbios_keyboard + 4 21 1 1 Bindings für Bioskeys; xbios/tastatur/bioskeys.ui; xbios_keyboard + 4 21 2 Kbrate; xbios/tastatur/kbrate.ui; xbios_keyboard + 4 21 2 1 Bindings für Kbrate; xbios/tastatur/kbrate.ui; xbios_keyboard + 4 21 3 Keytbl; xbios/tastatur/keytbl.ui; xbios_keyboard + 4 21 3 1 Bindings für Keytbl; xbios/tastatur/keytbl.ui; xbios_keyboard + 4 22 VIDIX-XBIOS-Erweiterung; xbios/vidix/vidix.u; vidix_xbios_extension + 4 22 1 vdxConfigPlayback; xbios/vidix/vdxconfigplayback.ui; vidix_xbios_extension + 4 22 1 1 Bindings für vdxConfigPlayback; xbios/vidix/vdxconfigplayback.ui; vidix_xbios_extension + 4 22 2 vdxDestroy; xbios/vidix/vdxdestroy.ui; vidix_xbios_extension + 4 22 2 1 Bindings für vdxDestroy; xbios/vidix/vdxdestroy.ui; vidix_xbios_extension + 4 22 3 vdxGetCapability; xbios/vidix/vdxgetcapability.ui; vidix_xbios_extension + 4 22 3 1 Bindings für vdxGetCapability; xbios/vidix/vdxgetcapability.ui; vidix_xbios_extension + 4 22 4 vdxGetGrKeys; xbios/vidix/vdxgetgrkeys.ui; vidix_xbios_extension + 4 22 4 1 Bindings für vdxGetGrKeys; xbios/vidix/vdxgetgrkeys.ui; vidix_xbios_extension + 4 22 5 vdxGetVersion; xbios/vidix/vdxgetversion.ui; vidix_xbios_extension + 4 22 5 1 Bindings für vdxGetVersion; xbios/vidix/vdxgetversion.ui; vidix_xbios_extension + 4 22 6 vdxInit; xbios/vidix/vdxinit.ui; vidix_xbios_extension + 4 22 6 1 Bindings für vdxInit; xbios/vidix/vdxinit.ui; vidix_xbios_extension + 4 22 7 vdxPlaybackCopyFrame; xbios/vidix/vdxplaybackcopyframe.ui; vidix_xbios_extension + 4 22 7 1 Bindings für vdxPlaybackCopyFrame; xbios/vidix/vdxplaybackcopyframe.ui; vidix_xbios_extension + 4 22 8 vdxPlaybackFrameSelect; xbios/vidix/vdxplaybackframeselect.ui; vidix_xbios_extension + 4 22 8 1 Bindings für vdxPlaybackFrameSelect; xbios/vidix/vdxplaybackframeselect.ui; vidix_xbios_extension + 4 22 9 vdxPlaybackGetDeint; xbios/vidix/vdxplaybackgetdeint.ui; vidix_xbios_extension + 4 22 9 1 Bindings für vdxPlaybackGetDeint; xbios/vidix/vdxplaybackgetdeint.ui; vidix_xbios_extension + 4 22 10 vdxPlaybackGetEq; xbios/vidix/vdxplaybackgeteq.ui; vidix_xbios_extension + 4 22 10 1 Bindings für vdxPlaybackGetEq; xbios/vidix/vdxplaybackgeteq.ui; vidix_xbios_extension + 4 22 11 vdxPlaybackOff; xbios/vidix/vdxplaybackoff.ui; vidix_xbios_extension + 4 22 11 1 Bindings für vdxPlaybackOff; xbios/vidix/vdxplaybackoff.ui; vidix_xbios_extension + 4 22 12 vdxPlaybackOn; xbios/vidix/vdxplaybackon.ui; vidix_xbios_extension + 4 22 12 1 Bindings für vdxPlaybackOn; xbios/vidix/vdxplaybackon.ui; vidix_xbios_extension + 4 22 13 vdxPlaybackSetDeint; xbios/vidix/vdxplaybacksetdeint.ui; vidix_xbios_extension + 4 22 13 1 Bindings für vdxPlaybackSetDeint; xbios/vidix/vdxplaybacksetdeint.ui; vidix_xbios_extension + 4 22 14 vdxPlaybackSetEq; xbios/vidix/vdxplaybackseteq.ui; vidix_xbios_extension + 4 22 14 1 Bindings für vdxPlaybackSetEq; xbios/vidix/vdxplaybackseteq.ui; vidix_xbios_extension + 4 22 15 vdxProbe; xbios/vidix/vdxprobe.ui; vidix_xbios_extension + 4 22 15 1 Bindings für vdxProbe; xbios/vidix/vdxprobe.ui; vidix_xbios_extension + 4 22 16 vdxQueryDMAStatus; xbios/vidix/vdxquerydmastatus.ui; vidix_xbios_extension + 4 22 16 1 Bindings für vdxQueryDMAStatus; xbios/vidix/vdxquerydmastatus.ui; vidix_xbios_extension + 4 22 17 vdxQueryFourcc; xbios/vidix/vdxqueryfourcc.ui; vidix_xbios_extension + 4 22 17 1 Bindings für vdxQueryFourcc; xbios/vidix/vdxqueryfourcc.ui; vidix_xbios_extension + 4 22 18 vdxSetGrKeys; xbios/vidix/vdxsetgrkeys.ui; vidix_xbios_extension + 4 22 18 1 Bindings für vdxSetGrKeys; xbios/vidix/vdxsetgrkeys.ui; vidix_xbios_extension + 4 23 XBIOS-Funktionsliste; xbios/xbios_f.u; xbios_functions + 4 24 XBIOS Strukturen; xbios/structures/structures.u; xbios_structures + 4 24 1 BCONMAP; xbios/structures/bconmap.ui; xbios_structures + 4 24 2 CD_DISC_INFO; xbios/structures/CD_DISC_INFO.ui; xbios_structures + 4 24 3 CD_TOC_ENTRY; xbios/structures/CD_TOC_ENTRY.ui; xbios_structures + 4 24 4 DSPBLOCK; xbios/structures/DSPBLOCK.ui; xbios_structures + 4 24 5 IOREC; xbios/structures/IOREC.ui; xbios_structures + 4 24 6 KEYBDPARMS; xbios/structures/KEYBDPARMS.ui; xbios_structures + 4 24 7 KBDVBASE; xbios/structures/KBDVBASE.ui; xbios_structures + 4 24 8 KEYTAB; xbios/structures/KEYTAB.ui; xbios_structures + 4 24 9 MAPTAB; xbios/structures/MAPTAB.ui; xbios_structures + 4 24 10 META_DRVINFO; xbios/structures/META_DRVINFO.ui; xbios_structures + 4 24 11 META_INFO_1; xbios/structures/META_INFO_1.ui; xbios_structures + 4 24 12 META_INFO_2; xbios/structures/META_INFO_2.ui; xbios_structures + 4 24 13 MOD_DESC; xbios/structures/MOD_DESC.ui; xbios_structures + 4 24 14 MOUSE; xbios/structures/MOUSE.ui; xbios_structures + 4 24 15 OVERPATCH; xbios/structures/OVERPATCH.ui; xbios_structures + 4 24 16 PBDEF; xbios/structures/PBDEF.ui; xbios_structures + 4 24 17 PCI_RSC_DESC; xbios/structures/PCI_RSC_DESC.ui; xbios_structures + 4 24 18 PMODE; xbios/structures/PMODE.ui; xbios_structures + 4 24 19 SCRCLIPMEMBLK; xbios/structures/SCRCLIPMEMBLK.ui; xbios_structures + 4 24 20 SCRCOPYMEMBLK; xbios/structures/SCRCOPYMEMBLK.ui; xbios_structures + 4 24 21 SCREEN; xbios/structures/SCREEN.ui; xbios_structures + 4 24 22 SCREENINFO; xbios/structures/SCREENINFO.ui; xbios_structures + 4 24 23 SCREEN, OverScan; xbios/structures/SCREEN_OverScan.ui; xbios_structures + 4 24 24 SCRFILLMEMBLK; xbios/structures/SCRFILLMEMBLK.ui; xbios_structures + 4 24 25 SCRLINEMEMBLK; xbios/structures/SCRLINEMEMBLK.ui; xbios_structures + 4 24 26 SCRMEMBLK; xbios/structures/SCRMEMBLK.ui; xbios_structures + 4 24 27 SCRTEXTUREMEMBLK; xbios/structures/SCRTEXTUREMEMBLK.ui; xbios_structures + 4 24 28 VDO_MODE; xbios/structures/VDO_MODE.ui; xbios_structures + 4 24 29 VDO_PARAM; xbios/structures/VDO_PARAM.ui; xbios_structures + 4 24 30 vidix_capability_t; xbios/structures/vidix_capability.ui; xbios_structures + 4 24 31 vidix_deinterlace_t; xbios/structures/vidix_deinterlace.ui; xbios_structures + 4 24 32 vidix_dma_t; xbios/structures/vidix_dma.ui; xbios_structures + 4 24 33 vidix_fourcc_t; xbios/structures/vidix_fourcc.ui; xbios_structures + 4 24 34 vidix_grkey_t; xbios/structures/vidix_grkey.ui; xbios_structures + 4 24 35 vidix_playback_t; xbios/structures/vidix_playback.ui; xbios_structures + 4 24 36 vidix_video_eq_t; xbios/structures/vidix_video_eq.ui; xbios_structures + 4 24 37 VPOS; xbios/structures/VPOS.ui; xbios_structures + 5 GEMDOS; /home/runner/work/tos.hyp/tos.hyp/tos_hyp.u; gemdos_main + 5 1 Das GEMDOS; gemdos/gemdos.u; gemdos_about + 5 2 Unterstützung fremder Dateisysteme; gemdos/filesys.u; gemdos_filesys + 5 3 GEMDOS-Fehlermeldungen; gemdos/gemdos.u; gemdos_errors + 5 4 Pipes, Test auf; gemdos/gemdos.u; gemdos_pipes + 5 5 Das Programmformat; gemdos/gemdos.u; gemdos_programs + 5 5 1 Die Programmflags; gemdos/gemdos.u; gemdos_programs + 5 6 Programmstart und TPA; gemdos/gemdos.u; gemdos_tpa + 5 7 Signale; gemdos/signale.u; gemdos_signals + 5 7 1 Signalhandler in MagiC; gemdos/signale.u; gemdos_signals + 5 7 2 Beispielcode zu Signalen; gemdos/signale.u; gemdos_signals + 5 8 gemdos-Trap; gemdos/gemdos.u; gemdos_trap + 5 9 Dateifunktionen; gemdos/file/file.u; gemdos_file + 5 9 1 Fattrib; gemdos/file/fattrib.ui; gemdos_file + 5 9 1 1 Bindings für Fattrib; gemdos/file/fattrib.ui; gemdos_file + 5 9 2 Fchdir; gemdos/file/fchdir.ui; gemdos_file + 5 9 2 1 Bindings für Fchdir; gemdos/file/fchdir.ui; gemdos_file + 5 9 3 Fchmod; gemdos/file/fchmod.ui; gemdos_file + 5 9 3 1 Bindings für Fchmod; gemdos/file/fchmod.ui; gemdos_file + 5 9 4 Fchown; gemdos/file/fchown.ui; gemdos_file + 5 9 4 1 Bindings für Fchown; gemdos/file/fchown.ui; gemdos_file + 5 9 5 Fchown16; gemdos/file/fchown16.ui; gemdos_file + 5 9 5 1 Bindings für Fchown16; gemdos/file/fchown16.ui; gemdos_file + 5 9 6 Fclose; gemdos/file/fclose.ui; gemdos_file + 5 9 6 1 Bindings für Fclose; gemdos/file/fclose.ui; gemdos_file + 5 9 7 Fcntl; gemdos/file/fcntl.ui; gemdos_file + 5 9 7 1 Bindings für Fcntl; gemdos/file/fcntl.ui; gemdos_file + 5 9 8 Fcreate; gemdos/file/fcreate.ui; gemdos_file + 5 9 8 1 Bindings für Fcreate; gemdos/file/fcreate.ui; gemdos_file + 5 9 9 Fdatime; gemdos/file/fdatime.ui; gemdos_file + 5 9 9 1 Bindings für Fdatime; gemdos/file/fdatime.ui; gemdos_file + 5 9 10 Fdelete; gemdos/file/fdelete.ui; gemdos_file + 5 9 10 1 Bindings für Fdelete; gemdos/file/fdelete.ui; gemdos_file + 5 9 11 Fdirfd; gemdos/file/fdirfd.ui; gemdos_file + 5 9 11 1 Bindings für Fdirfd; gemdos/file/fdirfd.ui; gemdos_file + 5 9 12 Fdup; gemdos/file/fdup.ui; gemdos_file + 5 9 12 1 Bindings für Fdup; gemdos/file/fdup.ui; gemdos_file + 5 9 13 Ffchmod; gemdos/file/ffchmod.ui; gemdos_file + 5 9 13 1 Bindings für Ffchmod; gemdos/file/ffchmod.ui; gemdos_file + 5 9 14 Ffchown; gemdos/file/ffchown.ui; gemdos_file + 5 9 14 1 Bindings für Ffchown; gemdos/file/ffchown.ui; gemdos_file + 5 9 15 Ffdopendir; gemdos/file/ffdopendir.ui; gemdos_file + 5 9 15 1 Bindings für Ffdopendir; gemdos/file/ffdopendir.ui; gemdos_file + 5 9 16 Fforce; gemdos/file/fforce.ui; gemdos_file + 5 9 16 1 Bindings für Fforce; gemdos/file/fforce.ui; gemdos_file + 5 9 17 Ffstat64; gemdos/file/ffstat64.ui; gemdos_file + 5 9 17 1 Bindings für Ffstat64; gemdos/file/ffstat64.ui; gemdos_file + 5 9 18 Fgetchar; gemdos/file/fgetchar.ui; gemdos_file + 5 9 18 1 Bindings für Fgetchar; gemdos/file/fgetchar.ui; gemdos_file + 5 9 19 Fgetdta; gemdos/file/fgetdta.ui; gemdos_file + 5 9 19 1 Bindings für Fgetdta; gemdos/file/fgetdta.ui; gemdos_file + 5 9 20 Finstat; gemdos/file/finstat.ui; gemdos_file + 5 9 20 1 Bindings für Finstat; gemdos/file/finstat.ui; gemdos_file + 5 9 21 Flink; gemdos/file/flink.ui; gemdos_file + 5 9 21 1 Bindings für Flink; gemdos/file/flink.ui; gemdos_file + 5 9 22 Flock; gemdos/file/flock.ui; gemdos_file + 5 9 22 1 Bindings für Flock; gemdos/file/flock.ui; gemdos_file + 5 9 23 Fmidipipe; gemdos/file/fmidipip.ui; gemdos_file + 5 9 23 1 Bindings für Fmidipipe; gemdos/file/fmidipip.ui; gemdos_file + 5 9 24 Fopen; gemdos/file/fopen.ui; gemdos_file + 5 9 24 1 Bindings für Fopen; gemdos/file/fopen.ui; gemdos_file + 5 9 25 Foutstat; gemdos/file/foutstat.ui; gemdos_file + 5 9 25 1 Bindings für Foutstat; gemdos/file/foutstat.ui; gemdos_file + 5 9 26 Fpipe; gemdos/file/fpipe.ui; gemdos_file + 5 9 26 1 Bindings für Fpipe; gemdos/file/fpipe.ui; gemdos_file + 5 9 27 Fpoll; gemdos/file/fpoll.ui; gemdos_file + 5 9 27 1 Bindings for Fpoll; gemdos/file/fpoll.ui; gemdos_file + 5 9 28 Fputchar; gemdos/file/fputchar.ui; gemdos_file + 5 9 28 1 Bindings für Fputchar; gemdos/file/fputchar.ui; gemdos_file + 5 9 29 Fread; gemdos/file/fread.ui; gemdos_file + 5 9 29 1 Bindings für Fread; gemdos/file/fread.ui; gemdos_file + 5 9 30 Freadlink; gemdos/file/freadlin.ui; gemdos_file + 5 9 30 1 Bindings für Freadlink; gemdos/file/freadlin.ui; gemdos_file + 5 9 31 Frename; gemdos/file/frename.ui; gemdos_file + 5 9 31 1 Bindings für Frename; gemdos/file/frename.ui; gemdos_file + 5 9 32 Fseek; gemdos/file/fseek.ui; gemdos_file + 5 9 32 1 Bindings für Fseek; gemdos/file/fseek.ui; gemdos_file + 5 9 33 Fseek64; gemdos/file/fseek64.ui; gemdos_file + 5 9 33 1 Bindings für Fseek64; gemdos/file/fseek64.ui; gemdos_file + 5 9 34 Fselect; gemdos/file/fselect.ui; gemdos_file + 5 9 34 1 Bindings für Fselect; gemdos/file/fselect.ui; gemdos_file + 5 9 35 Fsetdta; gemdos/file/fsetdta.ui; gemdos_file + 5 9 35 1 Bindings für Fsetdta; gemdos/file/fsetdta.ui; gemdos_file + 5 9 36 Fsfirst; gemdos/file/fsfirst.ui; gemdos_file + 5 9 36 1 Bindings für Fsfirst; gemdos/file/fsfirst.ui; gemdos_file + 5 9 37 Fsnext; gemdos/file/fsnext.ui; gemdos_file + 5 9 37 1 Bindings für Fsnext; gemdos/file/fsnext.ui; gemdos_file + 5 9 38 Fsymlink; gemdos/file/fsymlink.ui; gemdos_file + 5 9 38 1 Bindings für Fsymlink; gemdos/file/fsymlink.ui; gemdos_file + 5 9 39 Fstat64; gemdos/file/fstat64.ui; gemdos_file + 5 9 39 1 Bindings für Fstat64; gemdos/file/fstat64.ui; gemdos_file + 5 9 40 Fsync; gemdos/file/fsync.ui; gemdos_file + 5 9 40 1 Bindings for Fsync; gemdos/file/fsync.ui; gemdos_file + 5 9 41 Fwrite; gemdos/file/fwrite.ui; gemdos_file + 5 9 41 1 Bindings für Fwrite; gemdos/file/fwrite.ui; gemdos_file + 5 9 42 Fxattr; gemdos/file/fxattr.ui; gemdos_file + 5 9 42 1 Bindings für Fxattr; gemdos/file/fxattr.ui; gemdos_file + 5 10 Datum und Uhrzeit; gemdos/datetime/datetime.u; gemdos_datetime + 5 10 1 Tadjtime; gemdos/datetime/tadjtime.ui; gemdos_datetime + 5 10 1 1 Bindings for Tadjtime; gemdos/datetime/tadjtime.ui; gemdos_datetime + 5 10 2 Talarm; gemdos/datetime/talarm.ui; gemdos_datetime + 5 10 2 1 Bindings für Talarm; gemdos/datetime/talarm.ui; gemdos_datetime + 5 10 3 Tgetdate; gemdos/datetime/tgetdate.ui; gemdos_datetime + 5 10 3 1 Bindings für Tgetdate; gemdos/datetime/tgetdate.ui; gemdos_datetime + 5 10 4 Tgettime; gemdos/datetime/tgettime.ui; gemdos_datetime + 5 10 4 1 Bindings für Tgettime; gemdos/datetime/tgettime.ui; gemdos_datetime + 5 10 5 Tgettimeofday; gemdos/datetime/tgettofd.ui; gemdos_datetime + 5 10 5 1 Bindings für Tgettimeofday; gemdos/datetime/tgettofd.ui; gemdos_datetime + 5 10 6 Tmalarm; gemdos/datetime/tmalarm.ui; gemdos_datetime + 5 10 6 1 Bindings für Tmalarm; gemdos/datetime/tmalarm.ui; gemdos_datetime + 5 10 7 Tsetdate; gemdos/datetime/tsetdate.ui; gemdos_datetime + 5 10 7 1 Bindings für Tsetdate; gemdos/datetime/tsetdate.ui; gemdos_datetime + 5 10 8 Tsetitimer; gemdos/datetime/tsetitim.ui; gemdos_datetime + 5 10 8 1 Bindings für Tsetitimer; gemdos/datetime/tsetitim.ui; gemdos_datetime + 5 10 9 Tsettime; gemdos/datetime/tsettime.ui; gemdos_datetime + 5 10 9 1 Bindings für Tsettime; gemdos/datetime/tsettime.ui; gemdos_datetime + 5 10 10 Tsettimeofday; gemdos/datetime/tsettofd.ui; gemdos_datetime + 5 10 10 1 Bindings für Tsettimeofday; gemdos/datetime/tsettofd.ui; gemdos_datetime + 5 11 Prozessfunktionen; gemdos/prozess/prozess.u; gemdos_process + 5 11 1 Pause; gemdos/prozess/pause.ui; gemdos_process + 5 11 1 1 Bindings für Pause; gemdos/prozess/pause.ui; gemdos_process + 5 11 2 Pdomain; gemdos/prozess/pdomain.ui; gemdos_process + 5 11 2 1 Bindings für Pdomain; gemdos/prozess/pdomain.ui; gemdos_process + 5 11 3 Pexec; gemdos/prozess/pexec.ui; gemdos_process + 5 11 3 1 Bindings für Pexec; gemdos/prozess/pexec.ui; gemdos_process + 5 11 4 Pfork; gemdos/prozess/pfork.ui; gemdos_process + 5 11 4 1 Bindings für Pfork; gemdos/prozess/pfork.ui; gemdos_process + 5 11 5 Pgetauid; gemdos/prozess/pgetauid.ui; gemdos_process + 5 11 5 1 Bindings für Pgetauid; gemdos/prozess/pgetauid.ui; gemdos_process + 5 11 6 Pgetegid; gemdos/prozess/pgetegid.ui; gemdos_process + 5 11 6 1 Bindings für Pgetegid; gemdos/prozess/pgetegid.ui; gemdos_process + 5 11 7 Pgeteuid; gemdos/prozess/pgeteuid.ui; gemdos_process + 5 11 7 1 Bindings für Pgeteuid; gemdos/prozess/pgeteuid.ui; gemdos_process + 5 11 8 Pgetgid; gemdos/prozess/pgetgid.ui; gemdos_process + 5 11 8 1 Bindings für Pgetgid; gemdos/prozess/pgetgid.ui; gemdos_process + 5 11 9 Pgetgroups; gemdos/prozess/pgetgrou.ui; gemdos_process + 5 11 9 1 Bindings für Pgetgroups; gemdos/prozess/pgetgrou.ui; gemdos_process + 5 11 10 Pgetpgrp; gemdos/prozess/pgetpgrp.ui; gemdos_process + 5 11 10 1 Bindings für Pgetpgrp; gemdos/prozess/pgetpgrp.ui; gemdos_process + 5 11 11 Pgetpid; gemdos/prozess/pgetpid.ui; gemdos_process + 5 11 11 1 Bindings für Pgetpid; gemdos/prozess/pgetpid.ui; gemdos_process + 5 11 12 Pgetppid; gemdos/prozess/pgetppid.ui; gemdos_process + 5 11 12 1 Bindings für Pgetppid; gemdos/prozess/pgetppid.ui; gemdos_process + 5 11 13 Pgetpriority; gemdos/prozess/pgetprio.ui; gemdos_process + 5 11 13 1 Bindings für Pgetpriority; gemdos/prozess/pgetprio.ui; gemdos_process + 5 11 14 Pgetuid; gemdos/prozess/pgetuid.ui; gemdos_process + 5 11 14 1 Bindings für Pgetuid; gemdos/prozess/pgetuid.ui; gemdos_process + 5 11 15 Pkill; gemdos/prozess/pkill.ui; gemdos_process + 5 11 15 1 Bindings für Pkill; gemdos/prozess/pkill.ui; gemdos_process + 5 11 16 Pmsg; gemdos/prozess/pmsg.ui; gemdos_process + 5 11 16 1 Bindings für Pmsg; gemdos/prozess/pmsg.ui; gemdos_process + 5 11 17 Pnice; gemdos/prozess/pnice.ui; gemdos_process + 5 11 17 1 Bindings für Pnice; gemdos/prozess/pnice.ui; gemdos_process + 5 11 18 Prenice; gemdos/prozess/prenice.ui; gemdos_process + 5 11 18 1 Bindings für Prenice; gemdos/prozess/prenice.ui; gemdos_process + 5 11 19 Prusage; gemdos/prozess/prusage.ui; gemdos_process + 5 11 19 1 Bindings für Prusage; gemdos/prozess/prusage.ui; gemdos_process + 5 11 20 Psemaphore; gemdos/prozess/psemapho.ui; gemdos_process + 5 11 20 1 Bindings für Psemaphore; gemdos/prozess/psemapho.ui; gemdos_process + 5 11 21 Psetauid; gemdos/prozess/psetauid.ui; gemdos_process + 5 11 21 1 Bindings für Psetauid; gemdos/prozess/psetauid.ui; gemdos_process + 5 11 22 Psetegid; gemdos/prozess/psetegid.ui; gemdos_process + 5 11 22 1 Bindings für Psetegid; gemdos/prozess/psetegid.ui; gemdos_process + 5 11 23 Pseteuid; gemdos/prozess/pseteuid.ui; gemdos_process + 5 11 23 1 Bindings für Pseteuid; gemdos/prozess/pseteuid.ui; gemdos_process + 5 11 24 Psetgid; gemdos/prozess/psetgid.ui; gemdos_process + 5 11 24 1 Bindings für Psetgid; gemdos/prozess/psetgid.ui; gemdos_process + 5 11 25 Psetgroups; gemdos/prozess/psetgrou.ui; gemdos_process + 5 11 25 1 Bindings für Psetgroups; gemdos/prozess/psetgrou.ui; gemdos_process + 5 11 26 Psetlimit; gemdos/prozess/psetlimi.ui; gemdos_process + 5 11 26 1 Bindings für Psetlimit; gemdos/prozess/psetlimi.ui; gemdos_process + 5 11 27 Psetpgrp; gemdos/prozess/psetpgrp.ui; gemdos_process + 5 11 27 1 Bindings für Psetpgrp; gemdos/prozess/psetpgrp.ui; gemdos_process + 5 11 28 Psetpriority; gemdos/prozess/psetprio.ui; gemdos_process + 5 11 28 1 Bindings für Psetpriority; gemdos/prozess/psetprio.ui; gemdos_process + 5 11 29 Psetregid; gemdos/prozess/psetregi.ui; gemdos_process + 5 11 29 1 Bindings für Psetregid; gemdos/prozess/psetregi.ui; gemdos_process + 5 11 30 Psetreuid; gemdos/prozess/psetreui.ui; gemdos_process + 5 11 30 1 Bindings für Psetreuid; gemdos/prozess/psetreui.ui; gemdos_process + 5 11 31 Psetuid; gemdos/prozess/psetuid.ui; gemdos_process + 5 11 31 1 Bindings für Psetuid; gemdos/prozess/psetuid.ui; gemdos_process + 5 11 32 Psigaction; gemdos/prozess/psigacti.ui; gemdos_process + 5 11 32 1 Bindings für Psigaction; gemdos/prozess/psigacti.ui; gemdos_process + 5 11 33 Psigblock; gemdos/prozess/psigbloc.ui; gemdos_process + 5 11 33 1 Bindings für Psigblock; gemdos/prozess/psigbloc.ui; gemdos_process + 5 11 34 Psigintr; gemdos/prozess/psigintr.ui; gemdos_process + 5 11 34 1 Bindings für Psigintr; gemdos/prozess/psigintr.ui; gemdos_process + 5 11 35 Psignal; gemdos/prozess/psignal.ui; gemdos_process + 5 11 35 1 Bindings für Psignal; gemdos/prozess/psignal.ui; gemdos_process + 5 11 36 Psigpause; gemdos/prozess/psigpaus.ui; gemdos_process + 5 11 36 1 Bindings für Psigpause; gemdos/prozess/psigpaus.ui; gemdos_process + 5 11 37 Psigpending; gemdos/prozess/psigpend.ui; gemdos_process + 5 11 37 1 Bindings für Psigpending; gemdos/prozess/psigpend.ui; gemdos_process + 5 11 38 Psigreturn; gemdos/prozess/psigretu.ui; gemdos_process + 5 11 38 1 Bindings für Psigreturn; gemdos/prozess/psigretu.ui; gemdos_process + 5 11 39 Psigsetmask; gemdos/prozess/psigsetm.ui; gemdos_process + 5 11 39 1 Bindings für Psigsetmask; gemdos/prozess/psigsetm.ui; gemdos_process + 5 11 40 Psysctl; gemdos/prozess/psysctl.ui; gemdos_process + 5 11 40 1 Bindings für Psysctl; gemdos/prozess/psysctl.ui; gemdos_process + 5 11 41 Pterm; gemdos/prozess/pterm.ui; gemdos_process + 5 11 41 1 Bindings für Pterm; gemdos/prozess/pterm.ui; gemdos_process + 5 11 42 Pterm0; gemdos/prozess/pterm0.ui; gemdos_process + 5 11 42 1 Bindings für Pterm0; gemdos/prozess/pterm0.ui; gemdos_process + 5 11 43 Ptermres; gemdos/prozess/ptermres.ui; gemdos_process + 5 11 43 1 Bindings für Ptermres; gemdos/prozess/ptermres.ui; gemdos_process + 5 11 44 Ptrace; gemdos/prozess/ptrace.ui; gemdos_process + 5 11 44 1 Bindings für Ptrace; gemdos/prozess/ptrace.ui; gemdos_process + 5 11 45 Pumask; gemdos/prozess/pumask.ui; gemdos_process + 5 11 45 1 Bindings für Pumask; gemdos/prozess/pumask.ui; gemdos_process + 5 11 46 Pusrval; gemdos/prozess/pusrval.ui; gemdos_process + 5 11 46 1 Bindings für Pusrval; gemdos/prozess/pusrval.ui; gemdos_process + 5 11 47 Pvfork; gemdos/prozess/pvfork.ui; gemdos_process + 5 11 47 1 Bindings für Pvfork; gemdos/prozess/pvfork.ui; gemdos_process + 5 11 48 Pwait; gemdos/prozess/pwait.ui; gemdos_process + 5 11 48 1 Bindings für Pwait; gemdos/prozess/pwait.ui; gemdos_process + 5 11 49 Pwait3; gemdos/prozess/pwait3.ui; gemdos_process + 5 11 49 1 Bindings für Pwait3; gemdos/prozess/pwait3.ui; gemdos_process + 5 11 50 Pwaitpid; gemdos/prozess/pwaitpid.ui; gemdos_process + 5 11 50 1 Bindings für Pwaitpid; gemdos/prozess/pwaitpid.ui; gemdos_process + 5 12 Speicherverwaltung; gemdos/memory/memory.u; gemdos_memory + 5 12 1 Maccess; gemdos/memory/maccess.ui; gemdos_memory + 5 12 1 1 Bindings for Maccess; gemdos/memory/maccess.ui; gemdos_memory + 5 12 2 Maddalt; gemdos/memory/maddalt.ui; gemdos_memory + 5 12 2 1 Bindings für Maddalt; gemdos/memory/maddalt.ui; gemdos_memory + 5 12 3 Malloc; gemdos/memory/malloc.ui; gemdos_memory + 5 12 3 1 Bindings für Malloc; gemdos/memory/malloc.ui; gemdos_memory + 5 12 4 Mfree; gemdos/memory/mfree.ui; gemdos_memory + 5 12 4 1 Bindings für Mfree; gemdos/memory/mfree.ui; gemdos_memory + 5 12 5 Mshrink; gemdos/memory/mshrink.ui; gemdos_memory + 5 12 5 1 Bindings für Mshrink; gemdos/memory/mshrink.ui; gemdos_memory + 5 12 6 Mvalidate; gemdos/memory/mvalidate.ui; gemdos_memory + 5 12 6 1 Bindings for Mvalidate; gemdos/memory/mvalidate.ui; gemdos_memory + 5 12 7 Mxalloc; gemdos/memory/mxalloc.ui; gemdos_memory + 5 12 7 1 Bindings für Mxalloc; gemdos/memory/mxalloc.ui; gemdos_memory + 5 12 7 2 Mxmask; gemdos/memory/mxalloc.ui; gemdos_memory + 5 13 Netzwerkfunktionen; gemdos/network/network.u; gemdos_network + 5 13 1 Fflush; gemdos/network/fflush.ui; gemdos_network + 5 13 1 1 Bindings für Fflush; gemdos/network/fflush.ui; gemdos_network + 5 13 2 F_lock; gemdos/network/flock.ui; gemdos_network + 5 13 2 1 Bindings für F_lock; gemdos/network/flock.ui; gemdos_network + 5 13 3 Frlock; gemdos/network/frlock.ui; gemdos_network + 5 13 3 1 Bindings für Frlock; gemdos/network/frlock.ui; gemdos_network + 5 13 4 Frunlock; gemdos/network/frunlock.ui; gemdos_network + 5 13 4 1 Bindings für Frunlock; gemdos/network/frunlock.ui; gemdos_network + 5 13 5 Funlock; gemdos/network/funlock.ui; gemdos_network + 5 13 5 1 Bindings für Funlock; gemdos/network/funlock.ui; gemdos_network + 5 13 6 Nversion; gemdos/network/Nversion.ui; gemdos_network + 5 13 6 1 Bindings für Nversion; gemdos/network/Nversion.ui; gemdos_network + 5 14 Systemfunktionen; gemdos/system/system.u; gemdos_system + 5 14 1 Salert; gemdos/system/salert.ui; gemdos_system + 5 14 1 1 Bindings für Salert; gemdos/system/salert.ui; gemdos_system + 5 14 2 Sconfig; gemdos/system/sconfig.ui; gemdos_system + 5 14 2 1 Bindings für Sconfig; gemdos/system/sconfig.ui; gemdos_system + 5 14 3 Scookie; gemdos/system/scookie.ui; gemdos_system + 5 14 3 1 Bindings für Scookie; gemdos/system/scookie.ui; gemdos_system + 5 14 4 Shutdown; gemdos/system/shutdown.ui; gemdos_system + 5 14 4 1 Bindings für Shutdown; gemdos/system/shutdown.ui; gemdos_system + 5 14 5 Slbclose; gemdos/system/slbclose.ui; gemdos_system + 5 14 5 1 Bindings für Slbclose; gemdos/system/slbclose.ui; gemdos_system + 5 14 6 Slbopen; gemdos/system/slbopen.ui; gemdos_system + 5 14 6 1 Bindings für Slbopen; gemdos/system/slbopen.ui; gemdos_system + 5 14 7 Srealloc; gemdos/system/srealloc.ui; gemdos_system + 5 14 7 1 Bindings für Srealloc; gemdos/system/srealloc.ui; gemdos_system + 5 14 8 Ssystem; gemdos/system/ssystem.ui; gemdos_system + 5 14 8 1 Bindings für Ssystem; gemdos/system/ssystem.ui; gemdos_system + 5 14 9 STEFcntrl; gemdos/system/stefcntr.ui; gemdos_system + 5 14 9 1 Bindings für STEFcntrl; gemdos/system/stefcntr.ui; gemdos_system + 5 14 10 Super; gemdos/system/super.ui; gemdos_system + 5 14 10 1 Bindings für Super; gemdos/system/super.ui; gemdos_system + 5 14 10 2 Hinweis zur Verwendung der GEMDOS-Funktion Super; gemdos/system/super.ui; gemdos_system + 5 14 11 Suptime; gemdos/system/suptime.ui; gemdos_system + 5 14 11 1 Bindings für Suptime; gemdos/system/suptime.ui; gemdos_system + 5 14 12 Sversion; gemdos/system/sversion.ui; gemdos_system + 5 14 12 1 Bindings für Sversion; gemdos/system/sversion.ui; gemdos_system + 5 14 13 Syield; gemdos/system/syield.ui; gemdos_system + 5 14 13 1 Bindings für Syield; gemdos/system/syield.ui; gemdos_system + 5 14 14 Sync; gemdos/system/sync.ui; gemdos_system + 5 14 14 1 Bindings für Sync; gemdos/system/sync.ui; gemdos_system + 5 14 15 Sysconf; gemdos/system/sysconf.ui; gemdos_system + 5 14 15 1 Bindings für Sysconf; gemdos/system/sysconf.ui; gemdos_system + 5 15 Verzeichnisfunktionen; gemdos/dir/dir.u; gemdos_directory + 5 15 1 Dchroot; gemdos/dir/dchroot.ui; gemdos_directory + 5 15 1 1 Bindings für Dchroot; gemdos/dir/dchroot.ui; gemdos_directory + 5 15 2 Dclosedir; gemdos/dir/dclosedi.ui; gemdos_directory + 5 15 2 1 Bindings für Dclosedir; gemdos/dir/dclosedi.ui; gemdos_directory + 5 15 3 Dcntl; gemdos/dir/dcntl.ui; gemdos_directory + 5 15 3 1 Bindings für Dcntl; gemdos/dir/dcntl.ui; gemdos_directory + 5 15 4 Dcreate; gemdos/dir/dcreate.ui; gemdos_directory + 5 15 4 1 Bindings für Dcreate; gemdos/dir/dcreate.ui; gemdos_directory + 5 15 5 Ddelete; gemdos/dir/ddelete.ui; gemdos_directory + 5 15 5 1 Bindings für Ddelete; gemdos/dir/ddelete.ui; gemdos_directory + 5 15 6 Dfree; gemdos/dir/dfree.ui; gemdos_directory + 5 15 6 1 Bindings für Dfree; gemdos/dir/dfree.ui; gemdos_directory + 5 15 7 Dgetcwd; gemdos/dir/dgetcwd.ui; gemdos_directory + 5 15 7 1 Bindings für Dgetcwd; gemdos/dir/dgetcwd.ui; gemdos_directory + 5 15 8 Dgetdrv; gemdos/dir/dgetdrv.ui; gemdos_directory + 5 15 8 1 Bindings für Dgetdrv; gemdos/dir/dgetdrv.ui; gemdos_directory + 5 15 9 Dgetpath; gemdos/dir/dgetpath.ui; gemdos_directory + 5 15 9 1 Bindings für Dgetpath; gemdos/dir/dgetpath.ui; gemdos_directory + 5 15 10 Dlock; gemdos/dir/dlock.ui; gemdos_directory + 5 15 10 1 Bindings für Dlock; gemdos/dir/dlock.ui; gemdos_directory + 5 15 11 Dopendir; gemdos/dir/dopendir.ui; gemdos_directory + 5 15 11 1 Bindings für Dopendir; gemdos/dir/dopendir.ui; gemdos_directory + 5 15 12 Dpathconf; gemdos/dir/dpathcon.ui; gemdos_directory + 5 15 12 1 Bindings für Dpathconf; gemdos/dir/dpathcon.ui; gemdos_directory + 5 15 13 Dreaddir; gemdos/dir/dreaddir.ui; gemdos_directory + 5 15 13 1 Bindings für Dreaddir; gemdos/dir/dreaddir.ui; gemdos_directory + 5 15 14 Dreadlabel; gemdos/dir/dreadlab.ui; gemdos_directory + 5 15 14 1 Bindings für Dreadlabel; gemdos/dir/dreadlab.ui; gemdos_directory + 5 15 15 Drewinddir; gemdos/dir/drewindd.ui; gemdos_directory + 5 15 15 1 Bindings für Drewinddir; gemdos/dir/drewindd.ui; gemdos_directory + 5 15 16 Dsetdrv; gemdos/dir/dsetdrv.ui; gemdos_directory + 5 15 16 1 Bindings für Dsetdrv; gemdos/dir/dsetdrv.ui; gemdos_directory + 5 15 17 Dsetkey; gemdos/dir/dsetkey.ui; gemdos_directory + 5 15 17 1 Bindings für Dsetkey; gemdos/dir/dsetkey.ui; gemdos_directory + 5 15 18 Dsetpath; gemdos/dir/dsetpath.ui; gemdos_directory + 5 15 18 1 Bindings für Dsetpath; gemdos/dir/dsetpath.ui; gemdos_directory + 5 15 19 Dwritelabel; gemdos/dir/dwritela.ui; gemdos_directory + 5 15 19 1 Bindings für Dwritelabel; gemdos/dir/dwritela.ui; gemdos_directory + 5 15 20 Dxopendir; gemdos/dir/dxopendir.ui; gemdos_directory + 5 15 20 1 Bindings für Dxopendir; gemdos/dir/dxopendir.ui; gemdos_directory + 5 15 21 Dxreaddir; gemdos/dir/dxreaddi.ui; gemdos_directory + 5 15 21 1 Bindings für Dxreaddir; gemdos/dir/dxreaddi.ui; gemdos_directory + 5 16 Zeichenweise Ein-/Ausgabe; gemdos/chrinout/chrinout.u; gemdos_chrinout + 5 16 1 Cauxin; gemdos/chrinout/cauxin.ui; gemdos_chrinout + 5 16 1 1 Bindings für Cauxin; gemdos/chrinout/cauxin.ui; gemdos_chrinout + 5 16 2 Cauxis; gemdos/chrinout/cauxis.ui; gemdos_chrinout + 5 16 2 1 Bindings für Cauxis; gemdos/chrinout/cauxis.ui; gemdos_chrinout + 5 16 3 Cauxos; gemdos/chrinout/cauxos.ui; gemdos_chrinout + 5 16 3 1 Bindings für Cauxos; gemdos/chrinout/cauxos.ui; gemdos_chrinout + 5 16 4 Cauxout; gemdos/chrinout/cauxout.ui; gemdos_chrinout + 5 16 4 1 Bindings für Cauxout; gemdos/chrinout/cauxout.ui; gemdos_chrinout + 5 16 5 Cconin; gemdos/chrinout/cconin.ui; gemdos_chrinout + 5 16 5 1 Bindings für Cconin; gemdos/chrinout/cconin.ui; gemdos_chrinout + 5 16 6 Cconis; gemdos/chrinout/cconis.ui; gemdos_chrinout + 5 16 6 1 Bindings für Cconis; gemdos/chrinout/cconis.ui; gemdos_chrinout + 5 16 7 Cconos; gemdos/chrinout/cconos.ui; gemdos_chrinout + 5 16 7 1 Bindings für Cconos; gemdos/chrinout/cconos.ui; gemdos_chrinout + 5 16 8 Cconout; gemdos/chrinout/cconout.ui; gemdos_chrinout + 5 16 8 1 Bindings für Cconout; gemdos/chrinout/cconout.ui; gemdos_chrinout + 5 16 9 Cconrs; gemdos/chrinout/cconrs.ui; gemdos_chrinout + 5 16 9 1 Bindings für Cconrs; gemdos/chrinout/cconrs.ui; gemdos_chrinout + 5 16 10 Cconws; gemdos/chrinout/cconws.ui; gemdos_chrinout + 5 16 10 1 Bindings für Cconws; gemdos/chrinout/cconws.ui; gemdos_chrinout + 5 16 11 Cnecin; gemdos/chrinout/cnecin.ui; gemdos_chrinout + 5 16 11 1 Bindings für Cnecin; gemdos/chrinout/cnecin.ui; gemdos_chrinout + 5 16 12 Cprnos; gemdos/chrinout/cprnos.ui; gemdos_chrinout + 5 16 12 1 Bindings für Cprnos; gemdos/chrinout/cprnos.ui; gemdos_chrinout + 5 16 13 Cprnout; gemdos/chrinout/cprnout.ui; gemdos_chrinout + 5 16 13 1 Bindings für Cprnout; gemdos/chrinout/cprnout.ui; gemdos_chrinout + 5 16 14 Crawcin; gemdos/chrinout/crawcin.ui; gemdos_chrinout + 5 16 14 1 Bindings für Crawcin; gemdos/chrinout/crawcin.ui; gemdos_chrinout + 5 16 15 Crawio; gemdos/chrinout/crawio.ui; gemdos_chrinout + 5 16 15 1 Bindings für Crawio; gemdos/chrinout/crawio.ui; gemdos_chrinout + 5 17 Netzwerk; gemdos/mintnet/mintnet.u; gemdos_mintnet + 5 17 1 Fwritev; gemdos/mintnet/fwritev.ui; gemdos_mintnet + 5 17 2 Freadv; gemdos/mintnet/freadv.ui; gemdos_mintnet + 5 17 3 Fsocket; gemdos/mintnet/fsocket.ui; gemdos_mintnet + 5 17 4 Fsocketpair; gemdos/mintnet/fsocketpair.ui; gemdos_mintnet + 5 17 5 Faccept; gemdos/mintnet/faccept.ui; gemdos_mintnet + 5 17 6 Fconnect; gemdos/mintnet/fconnect.ui; gemdos_mintnet + 5 17 7 Fbind; gemdos/mintnet/fbind.ui; gemdos_mintnet + 5 17 8 Flisten; gemdos/mintnet/flisten.ui; gemdos_mintnet + 5 17 9 Frecvmsg; gemdos/mintnet/frecvmsg.ui; gemdos_mintnet + 5 17 10 Fsendmsg; gemdos/mintnet/fsendmsg.ui; gemdos_mintnet + 5 17 11 Frecvfrom; gemdos/mintnet/frecvfrom.ui; gemdos_mintnet + 5 17 12 Fsendto; gemdos/mintnet/fsendto.ui; gemdos_mintnet + 5 17 13 Fsetsockopt; gemdos/mintnet/fsetsockopt.ui; gemdos_mintnet + 5 17 14 Fgetsockopt; gemdos/mintnet/fgetsockopt.ui; gemdos_mintnet + 5 17 15 Fgetpeername; gemdos/mintnet/fgetpeername.ui; gemdos_mintnet + 5 17 16 Fgetsockname; gemdos/mintnet/fgetsockname.ui; gemdos_mintnet + 5 17 17 Fshutdown; gemdos/mintnet/fshutdown.ui; gemdos_mintnet + 5 18 ARGV-Verfahren; gemdos/argv.u; gemdos_argv + 5 19 C'Task Royal; gemdos/c_task.u; c_task_royal + 5 20 NAP BioNet100; gemdos/bionet.u; nap_bionet100 + 5 21 PowerDOS; gemdos/powerdos.u; powerdos + 5 22 TekBios; gemdos/tekbios.u; tekbios + 5 23 GEMDOS-Funktionsliste; gemdos/gemdos_f.u; gemdos_functions + 5 24 GEMDOS-Strukturen; gemdos/structures/structures.u; gemdos_structures + 5 24 1 CD-ROM Definitionen; gemdos/structures/cdrom.ui; gemdos_structures + 5 24 2 cdrom_audioctrl; gemdos/structures/cdrom_audioctrl.ui; gemdos_structures + 5 24 3 cdrom_mcn; gemdos/structures/cdrom_mcn.ui; gemdos_structures + 5 24 4 cdrom_msf; gemdos/structures/cdrom_msf.ui; gemdos_structures + 5 24 5 cdrom_read; gemdos/structures/cdrom_read.ui; gemdos_structures + 5 24 6 cdrom_subchnl; gemdos/structures/cdrom_subchnl.ui; gemdos_structures + 5 24 7 cdrom_ti; gemdos/structures/cdrom_ti.ui; gemdos_structures + 5 24 8 cdrom_tisrc; gemdos/structures/cdrom_tisrc.ui; gemdos_structures + 5 24 9 cdrom_tocentry; gemdos/structures/cdrom_tocentry.ui; gemdos_structures + 5 24 10 cdrom_tochdr; gemdos/structures/cdrom_tochdr.ui; gemdos_structures + 5 24 11 cdrom_volctrl; gemdos/structures/cdrom_volctrl.ui; gemdos_structures + 5 24 12 cd_ad; gemdos/structures/cd_ad.ui; gemdos_structures + 5 24 13 DISKINFO; gemdos/structures/DISKINFO.ui; gemdos_structures + 5 24 14 DOSTIME; gemdos/structures/DOSTIME.ui; gemdos_structures + 5 24 15 DOSVARS; gemdos/structures/DOSVARS.ui; gemdos_structures + 5 24 16 DTA; gemdos/structures/DTA.ui; gemdos_structures + 5 24 17 fcookie; gemdos/structures/fcookie.ui; gemdos_structures + 5 24 18 FILEPTR; gemdos/structures/FILEPTR.ui; gemdos_structures + 5 24 19 flock, Fcntl; gemdos/structures/flock.ui; gemdos_structures + 5 24 20 iovec; gemdos/structures/iovec.ui; gemdos_structures + 5 24 21 LINE; gemdos/structures/LINE.ui; gemdos_structures + 5 24 22 ltchars; gemdos/structures/ltchars.ui; gemdos_structures + 5 24 23 msghdr; gemdos/structures/msghdr.ui; gemdos_structures + 5 24 24 mutimbuf; gemdos/structures/mutimbuf.ui; gemdos_structures + 5 24 25 Process-Descriptor (PD) bzw. BASEPAGE; gemdos/structures/PD.ui; gemdos_structures + 5 24 26 Poll Descriptor; gemdos/structures/POLLFD.ui; gemdos_structures + 5 24 27 ploadinfo; gemdos/structures/ploadinfo.ui; gemdos_structures + 5 24 28 sgttyb; gemdos/structures/sgttyb.ui; gemdos_structures + 5 24 29 struct sigaction; gemdos/structures/sigaction.ui; gemdos_structures + 5 24 30 sockaddr; gemdos/structures/sockaddr.ui; gemdos_structures + 5 24 31 STAT; gemdos/structures/STAT.ui; gemdos_structures + 5 24 31 1 STAT, dev-Komponente; gemdos/structures/STAT.ui; gemdos_structures + 5 24 31 2 STAT, mögliche Filetypen; gemdos/structures/STAT.ui; gemdos_structures + 5 24 31 3 STAT, Sticky-Bit; gemdos/structures/STAT.ui; gemdos_structures + 5 24 31 4 STAT, size-Komponente; gemdos/structures/STAT.ui; gemdos_structures + 5 24 31 5 STAT, Zugriffsrechte; gemdos/structures/STAT.ui; gemdos_structures + 5 24 32 tchars; gemdos/structures/tchars.ui; gemdos_structures + 5 24 33 timeval; gemdos/structures/timeval.ui; gemdos_structures + 5 24 34 timezone; gemdos/structures/timezone.ui; gemdos_structures + 5 24 35 struct tty; gemdos/structures/tty.ui; gemdos_structures + 5 24 36 winsize; gemdos/structures/winsize.ui; gemdos_structures + 5 24 37 XATTR; gemdos/structures/XATTR.ui; gemdos_structures + 5 24 37 1 XATTR, dev-Komponente; gemdos/structures/XATTR.ui; gemdos_structures + 5 24 37 2 XATTR, mögliche Filetypen; gemdos/structures/XATTR.ui; gemdos_structures + 5 24 37 3 XATTR, Sticky-Bit; gemdos/structures/XATTR.ui; gemdos_structures + 5 24 37 4 XATTR, size-Komponente; gemdos/structures/XATTR.ui; gemdos_structures + 5 24 37 5 XATTR, Zugriffsrechte; gemdos/structures/XATTR.ui; gemdos_structures + 5 24 37 6 XATTR, spezielle Bits; gemdos/structures/XATTR.ui; gemdos_structures + 5 24 38 xkey; gemdos/structures/xkey.ui; gemdos_structures + 6 Line-A; /home/runner/work/tos.hyp/tos.hyp/tos_hyp.u; linea_main + 6 1 Der Line-A-Emulator; linea/linea.u; linea_about + 6 2 LINEA; linea/linea.u; linea_vars + 6 3 Die negativen Line-A Variablen; linea/linea.u; linea_escape + 6 4 BITBLT; linea/linea.u; linea_structures + 6 5 Initialization; linea/init.ui; linea_init + 6 5 1 Bindings für linea_init; linea/init.ui; linea_init + 6 6 Put pixel; linea/putpixel.ui; linea_putpixel + 6 6 1 Bindings für put_pixel; linea/putpixel.ui; linea_putpixel + 6 7 Get pixel; linea/getpixel.ui; linea_getpixel + 6 7 1 Bindings für get_pixel; linea/getpixel.ui; linea_getpixel + 6 8 Arbitrary line; linea/line.ui; linea_line + 6 8 1 Bindings für draw_line; linea/line.ui; linea_line + 6 9 Horizontal line; linea/hline.ui; linea_hline + 6 9 1 Bindings für horizontal_line; linea/hline.ui; linea_hline + 6 10 Filled rectangle; linea/fillrect.ui; linea_fillrect + 6 10 1 Bindings für filled_rect; linea/fillrect.ui; linea_fillrect + 6 11 Filled polygon; linea/fillpoly.ui; linea_fillpoly + 6 11 1 Bindings für filled_polygon; linea/fillpoly.ui; linea_fillpoly + 6 12 Bit block transfer; linea/bitblt.ui; linea_bitblt + 6 12 1 Bindings für bit_blt; linea/bitblt.ui; linea_bitblt + 6 13 Text block transfer; linea/textblt.ui; linea_textblt + 6 13 1 Bindings für text_blt; linea/textblt.ui; linea_textblt + 6 14 Show mouse; linea/shmouse.ui; linea_showmouse + 6 14 1 Bindings für show_mouse; linea/shmouse.ui; linea_showmouse + 6 15 Hide mouse; linea/hdmouse.ui; linea_hidemouse + 6 15 1 Bindings für hide_mouse; linea/hdmouse.ui; linea_hidemouse + 6 16 Transform mouse; linea/trmouse.ui; linea_transform + 6 16 1 Bindings für transform_mouse; linea/trmouse.ui; linea_transform + 6 17 Undraw sprite; linea/udrsprit.ui; linea_undrawsprite + 6 17 1 Bindings für undraw_sprite; linea/udrsprit.ui; linea_undrawsprite + 6 18 Draw sprite; linea/drsprite.ui; linea_drawsprite + 6 18 1 Bindings für draw_sprite; linea/drsprite.ui; linea_drawsprite + 6 19 Copy raster form; linea/cpraster.ui; linea_copyraster + 6 19 1 Bindings für copy_raster; linea/cpraster.ui; linea_copyraster + 6 20 Seedfill; linea/seedfill.ui; linea_seedfill + 6 20 1 Bindings für seed_fill; linea/seedfill.ui; linea_seedfill + 7 VDI; /home/runner/work/tos.hyp/tos.hyp/tos_hyp.u; vdi_main + 7 1 Das VDI; gem/vdi/vdi.u; About_the_VDI + 7 2 Grundlagen des VDI; gem/vdi/vdi.u; VDI_fundamentals + 7 2 1 Clipping; gem/vdi/vdi.u; VDI_fundamentals + 7 2 2 Das GDOS; gem/vdi/vdi.u; VDI_fundamentals + 7 2 3 Der Aufbau der ASSIGN.SYS-Datei; gem/vdi/assign_sys.ui; VDI_fundamentals + 7 2 4 GDOS-Treiber; gem/vdi/vdi.u; VDI_fundamentals + 7 2 4 1 Bildschirm-Treiber; gem/vdi/vdi.u; VDI_fundamentals + 7 2 4 2 Mindestfunktionsumfang für Bildschirmtreiber; gem/vdi/vdi.u; VDI_fundamentals + 7 2 4 3 Bit-Image Treiber; gem/vdi/vdi.u; VDI_fundamentals + 7 2 4 4 Drucker-Treiber; gem/vdi/vdi.u; VDI_fundamentals + 7 2 4 5 Mindestfunktionsumfang für Drucker-Treiber; gem/vdi/vdi.u; VDI_fundamentals + 7 2 4 6 Bitmapformat bei Druckertreibern; gem/vdi/vdi.u; VDI_fundamentals + 7 2 4 7 Fax-Treiber; gem/vdi/vdi.u; VDI_fundamentals + 7 2 4 8 Grafiktablett-Treiber; gem/vdi/vdi.u; VDI_fundamentals + 7 2 4 9 Kamera-Treiber; gem/vdi/vdi.u; VDI_fundamentals + 7 2 4 10 Mindestfunktionsumfang für Kamera-Treiber; gem/vdi/vdi.u; VDI_fundamentals + 7 2 4 11 Memory-Treiber; gem/vdi/vdi.u; VDI_fundamentals + 7 2 4 12 Metafile-Treiber; gem/vdi/vdi.u; VDI_fundamentals + 7 2 4 13 Mindestfunktionsumfang für Metafile-Treiber; gem/vdi/vdi.u; VDI_fundamentals + 7 2 4 14 Plotter-Treiber; gem/vdi/vdi.u; VDI_fundamentals + 7 2 4 15 Mindestfunktionsumfang für Plotter-Treiber; gem/vdi/vdi.u; VDI_fundamentals + 7 2 5 Koordinatensysteme des VDI; gem/vdi/vdi.u; VDI_fundamentals + 7 2 6 Metafile-Format; gem/vdi/metafile.u; VDI_fundamentals + 7 2 6 1 Metafile Sub-Opcodes; gem/vdi/metafile.u; VDI_fundamentals + 7 2 6 2 Analysieren eines Metafiles; gem/vdi/metafile.u; VDI_fundamentals + 7 2 6 3 Binding eines Metafile-Subopcodes; gem/vdi/metafile.u; VDI_fundamentals + 7 2 6 4 Beispiel-Analyse eines Metafile; gem/vdi/metafile.u; VDI_fundamentals + 7 2 6 5 Metafile-Version; gem/vdi/metafile.u; VDI_fundamentals + 7 2 7 NVDI; gem/vdi/vdi.u; VDI_fundamentals + 7 2 7 1 is_EdDI; gem/vdi/vdi.u; VDI_fundamentals + 7 2 8 Off-Screen-Bitmaps; gem/vdi/vdi.u; VDI_fundamentals + 7 2 9 Das OUT-Dateiformat; gem/vdi/vdi.u; VDI_fundamentals + 7 2 10 Rasterformate; gem/vdi/vdi.u; VDI_fundamentals + 7 2 11 SpeedoGDOS; gem/vdi/vdi.u; VDI_fundamentals + 7 2 12 Details zu Vektorschriften; gem/vdi/vdi.u; VDI_fundamentals + 7 2 12 1 Äquidistante Fonts; gem/vdi/vdi.u; VDI_fundamentals + 7 2 12 2 Font-ID und Index; gem/vdi/vdi.u; VDI_fundamentals + 7 2 12 3 Größe von Vektorfonts; gem/vdi/vdi.u; VDI_fundamentals + 7 2 12 4 Höhe und Breite von Vektorfonts; gem/vdi/vdi.u; VDI_fundamentals + 7 2 12 5 Kerning; gem/vdi/vdi.u; VDI_fundamentals + 7 2 12 6 Positionierung von Vektortext; gem/vdi/vdi.u; VDI_fundamentals + 7 2 12 7 Vektor- oder Bitmap-Font?; gem/vdi/vdi.u; VDI_fundamentals + 7 2 13 Workstations des VDI; gem/vdi/vdi.u; VDI_fundamentals + 7 2 14 Das XIMG-Format für Pixelbilder; gem/vdi/vdi.u; VDI_fundamentals + 7 3 VDI-Bindings; gem/vdi/vdi.u; vdi_bindings + 7 3 1 Wandel VDI-String nach C-String; gem/vdi/vdi.u; vdi_bindings + 7 3 2 Wandel C-String nach VDI-String; gem/vdi/vdi.u; vdi_bindings + 7 4 Attributfunktionen; gem/vdi/attribut/attribut.u; vdi_attribute + 7 4 1 Bitmap-Attribute; gem/vdi/attribut/bitmap/bitmap.u; vdi_attribute + 7 4 2 Fülltyp-Attribute; gem/vdi/attribut/fill/fill.u; vdi_attribute + 7 4 3 Linien-Attribute; gem/vdi/attribut/linien/lines.u; vdi_attribute + 7 4 4 Markierungs-Attribute; gem/vdi/attribut/marker/marker.u; vdi_attribute + 7 4 5 Text-Attribute; gem/vdi/attribut/text/text.u; vdi_attribute + 7 4 6 übergeordnete Attribute; gem/vdi/attribut/uebergeordnete/superior.u; vdi_attribute + 7 4 6 1 vsr_bg_color; gem/vdi/attribut/bitmap/vsr_bg_color.ui; vdi_attribute + 7 4 6 2 Bindings für vsr_bg_color; gem/vdi/attribut/bitmap/vsr_bg_color.ui; vdi_attribute + 7 4 6 3 vsr_fg_color; gem/vdi/attribut/bitmap/vsr_fg_color.ui; vdi_attribute + 7 4 6 4 Bindings für vsr_fg_color; gem/vdi/attribut/bitmap/vsr_fg_color.ui; vdi_attribute + 7 4 6 5 Grafische Übersicht von Fülltyp und Musterindex; gem/vdi/attribut/fill/filltypes.ui; vdi_attribute + 7 4 6 6 Beschreibung der VDI-Schreibmodi; gem/vdi/attribut/fill/filltypes.ui; vdi_attribute + 7 4 6 7 vsf_bg_color; gem/vdi/attribut/fill/vsf_bg_color.ui; vdi_attribute + 7 4 6 8 Bindings für vsf_bg_color; gem/vdi/attribut/fill/vsf_bg_color.ui; vdi_attribute + 7 4 6 9 vsf_color; gem/vdi/attribut/fill/vsf_color.ui; vdi_attribute + 7 4 6 10 Bindings für vsf_color; gem/vdi/attribut/fill/vsf_color.ui; vdi_attribute + 7 4 6 11 vsf_fg_color; gem/vdi/attribut/fill/vsf_fg_color.ui; vdi_attribute + 7 4 6 12 Bindings für vsf_fg_color; gem/vdi/attribut/fill/vsf_fg_color.ui; vdi_attribute + 7 4 6 13 vsf_interior; gem/vdi/attribut/fill/vsf_interior.ui; vdi_attribute + 7 4 6 14 Bindings für vsf_interior; gem/vdi/attribut/fill/vsf_interior.ui; vdi_attribute + 7 4 6 15 vsf_perimeter; gem/vdi/attribut/fill/vsf_perimeter.ui; vdi_attribute + 7 4 6 16 Bindings für vsf_perimeter; gem/vdi/attribut/fill/vsf_perimeter.ui; vdi_attribute + 7 4 6 17 vsf_style; gem/vdi/attribut/fill/vsf_style.ui; vdi_attribute + 7 4 6 18 Bindings für vsf_style; gem/vdi/attribut/fill/vsf_style.ui; vdi_attribute + 7 4 6 19 vsf_udpat; gem/vdi/attribut/fill/vsf_udpat.ui; vdi_attribute + 7 4 6 20 Bindings für vsf_udpat; gem/vdi/attribut/fill/vsf_udpat.ui; vdi_attribute + 7 4 6 21 vsf_xperimeter; gem/vdi/attribut/fill/vsf_xperimeter.ui; vdi_attribute + 7 4 6 22 Bindings für vsf_xperimeter; gem/vdi/attribut/fill/vsf_xperimeter.ui; vdi_attribute + 7 4 6 23 vsl_bg_color; gem/vdi/attribut/linien/vsl_bg_color.ui; vdi_attribute + 7 4 6 24 Bindings für vsl_bg_color; gem/vdi/attribut/linien/vsl_bg_color.ui; vdi_attribute + 7 4 6 25 vsl_color; gem/vdi/attribut/linien/vsl_color.ui; vdi_attribute + 7 4 6 26 Bindings für vsl_color; gem/vdi/attribut/linien/vsl_color.ui; vdi_attribute + 7 4 6 27 vsl_ends; gem/vdi/attribut/linien/vsl_ends.ui; vdi_attribute + 7 4 6 28 Bindings für vsl_ends; gem/vdi/attribut/linien/vsl_ends.ui; vdi_attribute + 7 4 6 29 vsl_fg_color; gem/vdi/attribut/linien/vsl_fg_color.ui; vdi_attribute + 7 4 6 30 Bindings für vsl_fg_color; gem/vdi/attribut/linien/vsl_fg_color.ui; vdi_attribute + 7 4 6 31 vsl_type; gem/vdi/attribut/linien/vsl_type.ui; vdi_attribute + 7 4 6 32 Bindings für vsl_type; gem/vdi/attribut/linien/vsl_type.ui; vdi_attribute + 7 4 6 33 vsl_udsty; gem/vdi/attribut/linien/vsl_udsty.ui; vdi_attribute + 7 4 6 34 Bindings für vsl_udsty; gem/vdi/attribut/linien/vsl_udsty.ui; vdi_attribute + 7 4 6 35 vsl_width; gem/vdi/attribut/linien/vsl_width.ui; vdi_attribute + 7 4 6 36 Bindings für vsl_width; gem/vdi/attribut/linien/vsl_width.ui; vdi_attribute + 7 4 6 37 v_bez_qual; gem/vdi/attribut/linien/v_bez_qual.ui; vdi_attribute + 7 4 6 38 Bindings für v_bez_qual; gem/vdi/attribut/linien/v_bez_qual.ui; vdi_attribute + 7 4 6 39 vsm_bg_color; gem/vdi/attribut/marker/vsm_bg_color.ui; vdi_attribute + 7 4 6 40 Bindings für vsm_bg_color; gem/vdi/attribut/marker/vsm_bg_color.ui; vdi_attribute + 7 4 6 41 vsm_color; gem/vdi/attribut/marker/vsm_color.ui; vdi_attribute + 7 4 6 42 Bindings für vsm_color; gem/vdi/attribut/marker/vsm_color.ui; vdi_attribute + 7 4 6 43 vsm_fg_color; gem/vdi/attribut/marker/vsm_fg_color.ui; vdi_attribute + 7 4 6 44 Bindings für vsm_fg_color; gem/vdi/attribut/marker/vsm_fg_color.ui; vdi_attribute + 7 4 6 45 vsm_height; gem/vdi/attribut/marker/vsm_height.ui; vdi_attribute + 7 4 6 46 Bindings für vsm_height; gem/vdi/attribut/marker/vsm_height.ui; vdi_attribute + 7 4 6 47 vsm_type; gem/vdi/attribut/marker/vsm_type.ui; vdi_attribute + 7 4 6 48 Bindings für vsm_type; gem/vdi/attribut/marker/vsm_type.ui; vdi_attribute + 7 4 6 49 vst_alignment; gem/vdi/attribut/text/vst_alignment.ui; vdi_attribute + 7 4 6 50 Bindings für vst_alignment; gem/vdi/attribut/text/vst_alignment.ui; vdi_attribute + 7 4 6 51 vst_arbpt; gem/vdi/attribut/text/vst_arbpt.ui; vdi_attribute + 7 4 6 52 Bindings für vst_arbpt; gem/vdi/attribut/text/vst_arbpt.ui; vdi_attribute + 7 4 6 53 vst_arbpt32; gem/vdi/attribut/text/vst_arbpt32.ui; vdi_attribute + 7 4 6 54 Bindings für vst_arbpt32; gem/vdi/attribut/text/vst_arbpt32.ui; vdi_attribute + 7 4 6 55 vst_bg_color; gem/vdi/attribut/text/vst_bg_color.ui; vdi_attribute + 7 4 6 56 Bindings für vst_bg_color; gem/vdi/attribut/text/vst_bg_color.ui; vdi_attribute + 7 4 6 57 vst_charmap; gem/vdi/attribut/text/vst_charmap.ui; vdi_attribute + 7 4 6 58 Bindings für vst_charmap; gem/vdi/attribut/text/vst_charmap.ui; vdi_attribute + 7 4 6 59 vst_color; gem/vdi/attribut/text/vst_color.ui; vdi_attribute + 7 4 6 60 Bindings für vst_color; gem/vdi/attribut/text/vst_color.ui; vdi_attribute + 7 4 6 61 vst_effects; gem/vdi/attribut/text/vst_effects.ui; vdi_attribute + 7 4 6 62 Bindings für vst_effects; gem/vdi/attribut/text/vst_effects.ui; vdi_attribute + 7 4 6 63 vst_error; gem/vdi/attribut/text/vst_error.ui; vdi_attribute + 7 4 6 64 Bindings für vst_error; gem/vdi/attribut/text/vst_error.ui; vdi_attribute + 7 4 6 65 vst_fg_color; gem/vdi/attribut/text/vst_fg_color.ui; vdi_attribute + 7 4 6 66 Bindings für vst_fg_color; gem/vdi/attribut/text/vst_fg_color.ui; vdi_attribute + 7 4 6 67 vst_font; gem/vdi/attribut/text/vst_font.ui; vdi_attribute + 7 4 6 68 Bindings für vst_font; gem/vdi/attribut/text/vst_font.ui; vdi_attribute + 7 4 6 69 vst_height; gem/vdi/attribut/text/vst_height.ui; vdi_attribute + 7 4 6 70 Bindings für vst_height; gem/vdi/attribut/text/vst_height.ui; vdi_attribute + 7 4 6 71 vst_kern; gem/vdi/attribut/text/vst_kern.ui; vdi_attribute + 7 4 6 72 Bindings für vst_kern; gem/vdi/attribut/text/vst_kern.ui; vdi_attribute + 7 4 6 73 vst_map_mode; gem/vdi/attribut/text/vst_map_mode.ui; vdi_attribute + 7 4 6 74 Bindings für vst_map_mode; gem/vdi/attribut/text/vst_map_mode.ui; vdi_attribute + 7 4 6 75 vst_name; gem/vdi/attribut/text/vst_name.ui; vdi_attribute + 7 4 6 76 Bindings für vst_name; gem/vdi/attribut/text/vst_name.ui; vdi_attribute + 7 4 6 77 vst_point; gem/vdi/attribut/text/vst_point.ui; vdi_attribute + 7 4 6 78 Bindings für vst_point; gem/vdi/attribut/text/vst_point.ui; vdi_attribute + 7 4 6 79 vst_rotation; gem/vdi/attribut/text/vst_rotation.ui; vdi_attribute + 7 4 6 80 Bindings für vst_rotation; gem/vdi/attribut/text/vst_rotation.ui; vdi_attribute + 7 4 6 81 vst_scratch; gem/vdi/attribut/text/vst_scratch.ui; vdi_attribute + 7 4 6 82 Bindings für vst_scratch; gem/vdi/attribut/text/vst_scratch.ui; vdi_attribute + 7 4 6 83 vst_setsize; gem/vdi/attribut/text/vst_setsize.ui; vdi_attribute + 7 4 6 84 Bindings für vst_setsize; gem/vdi/attribut/text/vst_setsize.ui; vdi_attribute + 7 4 6 85 vst_setsize32; gem/vdi/attribut/text/vst_setsize32.ui; vdi_attribute + 7 4 6 86 Bindings für vst_setsize32; gem/vdi/attribut/text/vst_setsize32.ui; vdi_attribute + 7 4 6 87 vst_skew; gem/vdi/attribut/text/vst_skew.ui; vdi_attribute + 7 4 6 88 Bindings für vst_skew; gem/vdi/attribut/text/vst_skew.ui; vdi_attribute + 7 4 6 89 vst_track_offset; gem/vdi/attribut/text/vst_track_offset.ui; vdi_attribute + 7 4 6 90 Bindings für vst_track_offset; gem/vdi/attribut/text/vst_track_offset.ui; vdi_attribute + 7 4 6 91 vst_width; gem/vdi/attribut/text/vst_width.ui; vdi_attribute + 7 4 6 92 Bindings für vst_width; gem/vdi/attribut/text/vst_width.ui; vdi_attribute + 7 4 6 93 v_topbot; gem/vdi/attribut/text/v_topbot.ui; vdi_attribute + 7 4 6 94 Bindings für v_topbot; gem/vdi/attribut/text/v_topbot.ui; vdi_attribute + 7 4 6 95 vswr_mode; gem/vdi/attribut/uebergeordnete/vswr_mode.ui; vdi_attribute + 7 4 6 96 Bindings für vswr_mode; gem/vdi/attribut/uebergeordnete/vswr_mode.ui; vdi_attribute + 7 4 6 97 vs_bkcolor; gem/vdi/attribut/uebergeordnete/vs_bkcolor.ui; vdi_attribute + 7 4 6 98 Bindings für vs_bkcolor; gem/vdi/attribut/uebergeordnete/vs_bkcolor.ui; vdi_attribute + 7 4 6 99 vs_color; gem/vdi/attribut/uebergeordnete/vs_color.ui; vdi_attribute + 7 4 6 100 Bindings für vs_color; gem/vdi/attribut/uebergeordnete/vs_color.ui; vdi_attribute + 7 4 6 101 vs_color2; gem/vdi/attribut/uebergeordnete/vs_color2.ui; vdi_attribute + 7 4 6 102 Bindings für vs_color2; gem/vdi/attribut/uebergeordnete/vs_color2.ui; vdi_attribute + 7 4 6 103 vs_grayoverride; gem/vdi/attribut/uebergeordnete/vs_grayoverride.ui; vdi_attribute + 7 4 6 104 Bindings für vs_grayoverride; gem/vdi/attribut/uebergeordnete/vs_grayoverride.ui; vdi_attribute + 7 4 6 105 v_ps_halftone; gem/vdi/attribut/uebergeordnete/v_ps_halftone.ui; vdi_attribute + 7 4 6 106 Bindings für v_ps_halftone; gem/vdi/attribut/uebergeordnete/v_ps_halftone.ui; vdi_attribute + 7 4 6 107 v_setrgb; gem/vdi/attribut/uebergeordnete/v_setrgb.ui; vdi_attribute + 7 4 6 108 Bindings für v_setrgb; gem/vdi/attribut/uebergeordnete/v_setrgb.ui; vdi_attribute + 7 4 6 109 v_setrgbi; gem/vdi/attribut/uebergeordnete/v_setrgbi.ui; vdi_attribute + 7 4 6 110 Bindings für v_setrgbi; gem/vdi/attribut/uebergeordnete/v_setrgbi.ui; vdi_attribute + 7 5 Ausgabefunktionen; gem/vdi/output/output.u; vdi_output + 7 5 1 vr_recfl; gem/vdi/output/vr_recfl.ui; vdi_output + 7 5 2 Bindings für vr_recfl; gem/vdi/output/vr_recfl.ui; vdi_output + 7 5 3 v_arc; gem/vdi/output/v_arc.ui; vdi_output + 7 5 4 Bindings für v_arc; gem/vdi/output/v_arc.ui; vdi_output + 7 5 5 v_bar; gem/vdi/output/v_bar.ui; vdi_output + 7 5 6 Bindings für v_bar; gem/vdi/output/v_bar.ui; vdi_output + 7 5 7 v_bez; gem/vdi/output/v_bez.ui; vdi_output + 7 5 8 Bindings für v_bez; gem/vdi/output/v_bez.ui; vdi_output + 7 5 9 v_bez_fill; gem/vdi/output/v_bez_fill.ui; vdi_output + 7 5 10 Bindings für v_bez_fill; gem/vdi/output/v_bez_fill.ui; vdi_output + 7 5 11 v_cellarray; gem/vdi/output/v_cellarray.ui; vdi_output + 7 5 12 Bindings für v_cellarray; gem/vdi/output/v_cellarray.ui; vdi_output + 7 5 13 v_circle; gem/vdi/output/v_circle.ui; vdi_output + 7 5 14 Bindings für v_circle; gem/vdi/output/v_circle.ui; vdi_output + 7 5 15 v_contourfill; gem/vdi/output/v_contourfill.ui; vdi_output + 7 5 16 Bindings für v_contourfill; gem/vdi/output/v_contourfill.ui; vdi_output + 7 5 17 v_ellarc; gem/vdi/output/v_ellarc.ui; vdi_output + 7 5 18 Bindings für v_ellarc; gem/vdi/output/v_ellarc.ui; vdi_output + 7 5 19 v_ellipse; gem/vdi/output/v_ellipse.ui; vdi_output + 7 5 20 Bindings für v_ellipse; gem/vdi/output/v_ellipse.ui; vdi_output + 7 5 21 v_ellpie; gem/vdi/output/v_ellpie.ui; vdi_output + 7 5 22 Bindings für v_ellpie; gem/vdi/output/v_ellpie.ui; vdi_output + 7 5 23 v_etext; gem/vdi/output/v_etext.ui; vdi_output + 7 5 24 Bindings für v_etext; gem/vdi/output/v_etext.ui; vdi_output + 7 5 25 v_fillarea; gem/vdi/output/v_fillarea.ui; vdi_output + 7 5 26 Bindings für v_fillarea; gem/vdi/output/v_fillarea.ui; vdi_output + 7 5 27 v_ftext; gem/vdi/output/v_ftext.ui; vdi_output + 7 5 28 Bindings für v_ftext; gem/vdi/output/v_ftext.ui; vdi_output + 7 5 29 v_ftext_offset; gem/vdi/output/v_ftext_offset.ui; vdi_output + 7 5 30 Bindings für v_ftext_offset; gem/vdi/output/v_ftext_offset.ui; vdi_output + 7 5 31 v_gtext; gem/vdi/output/v_gtext.ui; vdi_output + 7 5 32 Bindings für v_gtext; gem/vdi/output/v_gtext.ui; vdi_output + 7 5 33 v_justified; gem/vdi/output/v_justified.ui; vdi_output + 7 5 34 Bindings für v_justified; gem/vdi/output/v_justified.ui; vdi_output + 7 5 35 v_pieslice; gem/vdi/output/v_pieslice.ui; vdi_output + 7 5 36 Bindings für v_pieslice; gem/vdi/output/v_pieslice.ui; vdi_output + 7 5 37 v_pline; gem/vdi/output/v_pline.ui; vdi_output + 7 5 38 Bindings für v_pline; gem/vdi/output/v_pline.ui; vdi_output + 7 5 39 v_pmarker; gem/vdi/output/v_pmarker.ui; vdi_output + 7 5 40 Bindings für v_pmarker; gem/vdi/output/v_pmarker.ui; vdi_output + 7 5 41 v_rbox; gem/vdi/output/v_rbox.ui; vdi_output + 7 5 42 Bindings für v_rbox; gem/vdi/output/v_rbox.ui; vdi_output + 7 5 43 v_rfbox; gem/vdi/output/v_rfbox.ui; vdi_output + 7 5 44 Bindings für v_rfbox; gem/vdi/output/v_rfbox.ui; vdi_output + 7 6 Auskunftsfunktionen; gem/vdi/inquire/inquire.u; vdi_inquire + 7 6 1 vqf_attributes; gem/vdi/inquire/vqf_attributes.ui; vdi_inquire + 7 6 2 Bindings für vqf_attributes; gem/vdi/inquire/vqf_attributes.ui; vdi_inquire + 7 6 3 vqf_bg_color; gem/vdi/inquire/vqf_bg_color.ui; vdi_inquire + 7 6 4 Bindings für vqf_bg_color; gem/vdi/inquire/vqf_bg_color.ui; vdi_inquire + 7 6 5 vqf_fg_color; gem/vdi/inquire/vqf_fg_color.ui; vdi_inquire + 7 6 6 Bindings für vqf_fg_color; gem/vdi/inquire/vqf_fg_color.ui; vdi_inquire + 7 6 7 vqin_mode; gem/vdi/inquire/vqin_mode.ui; vdi_inquire + 7 6 8 Bindings für vqin_mode; gem/vdi/inquire/vqin_mode.ui; vdi_inquire + 7 6 9 vql_attributes; gem/vdi/inquire/vql_attributes.ui; vdi_inquire + 7 6 10 Bindings für vql_attributes; gem/vdi/inquire/vql_attributes.ui; vdi_inquire + 7 6 11 vql_bg_color; gem/vdi/inquire/vql_bg_color.ui; vdi_inquire + 7 6 12 Bindings für vql_bg_color; gem/vdi/inquire/vql_bg_color.ui; vdi_inquire + 7 6 13 vql_fg_color; gem/vdi/inquire/vql_fg_color.ui; vdi_inquire + 7 6 14 Bindings für vql_fg_color; gem/vdi/inquire/vql_fg_color.ui; vdi_inquire + 7 6 15 vqm_attributes; gem/vdi/inquire/vqm_attributes.ui; vdi_inquire + 7 6 16 Bindings für vqm_attributes; gem/vdi/inquire/vqm_attributes.ui; vdi_inquire + 7 6 17 vqm_bg_color; gem/vdi/inquire/vqm_bg_color.ui; vdi_inquire + 7 6 18 Bindings für vqm_bg_color; gem/vdi/inquire/vqm_bg_color.ui; vdi_inquire + 7 6 19 vqm_fg_color; gem/vdi/inquire/vqm_fg_color.ui; vdi_inquire + 7 6 20 Bindings für vqm_fg_color; gem/vdi/inquire/vqm_fg_color.ui; vdi_inquire + 7 6 21 vqr_bg_color; gem/vdi/inquire/vqr_bg_color.ui; vdi_inquire + 7 6 22 Bindings für vqr_bg_color; gem/vdi/inquire/vqr_bg_color.ui; vdi_inquire + 7 6 23 vqr_fg_color; gem/vdi/inquire/vqr_fg_color.ui; vdi_inquire + 7 6 24 Bindings für vqr_fg_color; gem/vdi/inquire/vqr_fg_color.ui; vdi_inquire + 7 6 25 vqt_advance; gem/vdi/inquire/vqt_advance.ui; vdi_inquire + 7 6 26 Bindings für vqt_advance; gem/vdi/inquire/vqt_advance.ui; vdi_inquire + 7 6 27 vqt_advance32; gem/vdi/inquire/vqt_advance32.ui; vdi_inquire + 7 6 28 Bindings für vqt_advance32; gem/vdi/inquire/vqt_advance32.ui; vdi_inquire + 7 6 29 vqt_attributes; gem/vdi/inquire/vqt_attributes.ui; vdi_inquire + 7 6 30 Bindings für vqt_attributes; gem/vdi/inquire/vqt_attributes.ui; vdi_inquire + 7 6 31 vqt_bg_color; gem/vdi/inquire/vqt_bg_color.ui; vdi_inquire + 7 6 32 Bindings für vqt_bg_color; gem/vdi/inquire/vqt_bg_color.ui; vdi_inquire + 7 6 33 vqt_cachesize; gem/vdi/inquire/vqt_cachesize.ui; vdi_inquire + 7 6 34 Bindings für vqt_cachesize; gem/vdi/inquire/vqt_cachesize.ui; vdi_inquire + 7 6 35 vqt_char_index; gem/vdi/inquire/vqt_char_index.ui; vdi_inquire + 7 6 36 Bindings für vqt_char_index; gem/vdi/inquire/vqt_char_index.ui; vdi_inquire + 7 6 37 vqt_devinfo; gem/vdi/inquire/vqt_devinfo.ui; vdi_inquire + 7 6 38 Bindings für vqt_devinfo; gem/vdi/inquire/vqt_devinfo.ui; vdi_inquire + 7 6 39 vqt_extent; gem/vdi/inquire/vqt_extent.ui; vdi_inquire + 7 6 40 Bindings für vqt_extent; gem/vdi/inquire/vqt_extent.ui; vdi_inquire + 7 6 41 vqt_ext_name; gem/vdi/inquire/vqt_ext_name.ui; vdi_inquire + 7 6 42 Bindings für vqt_ext_name; gem/vdi/inquire/vqt_ext_name.ui; vdi_inquire + 7 6 43 vqt_fg_color; gem/vdi/inquire/vqt_fg_color.ui; vdi_inquire + 7 6 44 Bindings für vqt_fg_color; gem/vdi/inquire/vqt_fg_color.ui; vdi_inquire + 7 6 45 vqt_fontheader; gem/vdi/inquire/vqt_fontheader.ui; vdi_inquire + 7 6 46 Bindings für vqt_fontheader; gem/vdi/inquire/vqt_fontheader.ui; vdi_inquire + 7 6 47 vqt_fontinfo; gem/vdi/inquire/vqt_fontinfo.ui; vdi_inquire + 7 6 48 Bindings für vqt_fontinfo; gem/vdi/inquire/vqt_fontinfo.ui; vdi_inquire + 7 6 49 vqt_f_extent; gem/vdi/inquire/vqt_f_extent.ui; vdi_inquire + 7 6 50 Bindings für vqt_f_extent; gem/vdi/inquire/vqt_f_extent.ui; vdi_inquire + 7 6 51 vqt_get_table; gem/vdi/inquire/vqt_get_table.ui; vdi_inquire + 7 6 52 Bindings für vqt_get_table; gem/vdi/inquire/vqt_get_table.ui; vdi_inquire + 7 6 53 vqt_justified; gem/vdi/inquire/vqt_justified.ui; vdi_inquire + 7 6 54 Bindings für vqt_justified; gem/vdi/inquire/vqt_justified.ui; vdi_inquire + 7 6 55 vqt_name; gem/vdi/inquire/vqt_name.ui; vdi_inquire + 7 6 56 Bindings für vqt_name; gem/vdi/inquire/vqt_name.ui; vdi_inquire + 7 6 57 vqt_name_and_id; gem/vdi/inquire/vqt_name_and_id.ui; vdi_inquire + 7 6 58 Bindings für vqt_name_and_id; gem/vdi/inquire/vqt_name_and_id.ui; vdi_inquire + 7 6 59 vqt_pairkern; gem/vdi/inquire/vqt_pairkern.ui; vdi_inquire + 7 6 60 Bindings für vqt_pairkern; gem/vdi/inquire/vqt_pairkern.ui; vdi_inquire + 7 6 61 vqt_real_extent; gem/vdi/inquire/vqt_real_extent.ui; vdi_inquire + 7 6 62 Bindings für vqt_real_extent; gem/vdi/inquire/vqt_real_extent.ui; vdi_inquire + 7 6 63 vqt_trackkern; gem/vdi/inquire/vqt_trackkern.ui; vdi_inquire + 7 6 64 Bindings für vqt_trackkern; gem/vdi/inquire/vqt_trackkern.ui; vdi_inquire + 7 6 65 vqt_width; gem/vdi/inquire/vqt_width.ui; vdi_inquire + 7 6 66 Bindings für vqt_width; gem/vdi/inquire/vqt_width.ui; vdi_inquire + 7 6 67 vqt_xfntinfo; gem/vdi/inquire/vqt_xfntinfo.ui; vdi_inquire + 7 6 68 Bindings für vqt_xfntinfo; gem/vdi/inquire/vqt_xfntinfo.ui; vdi_inquire + 7 6 69 vq_cellarray; gem/vdi/inquire/vq_cellarray.ui; vdi_inquire + 7 6 70 Bindings für vq_cellarray; gem/vdi/inquire/vq_cellarray.ui; vdi_inquire + 7 6 71 vq_color; gem/vdi/inquire/vq_color.ui; vdi_inquire + 7 6 72 Bindings für vq_color; gem/vdi/inquire/vq_color.ui; vdi_inquire + 7 6 73 vq_devinfo; gem/vdi/inquire/vq_devinfo.ui; vdi_inquire + 7 6 74 Bindings für vq_devinfo; gem/vdi/inquire/vq_devinfo.ui; vdi_inquire + 7 6 75 vq_extnd; gem/vdi/inquire/vq_extnd.ui; vdi_inquire + 7 6 76 Bindings für vq_extnd; gem/vdi/inquire/vq_extnd.ui; vdi_inquire + 7 6 77 vq_ext_devinfo; gem/vdi/inquire/vq_ext_devinfo.ui; vdi_inquire + 7 6 78 Bindings für vq_ext_devinfo; gem/vdi/inquire/vq_ext_devinfo.ui; vdi_inquire + 7 6 79 vq_ptsinsz; gem/vdi/inquire/vq_ptsinsz.ui; vdi_inquire + 7 6 80 Bindings für vq_ptsinsz; gem/vdi/inquire/vq_ptsinsz.ui; vdi_inquire + 7 6 81 vq_scrninfo; gem/vdi/inquire/vq_scrninfo.ui; vdi_inquire + 7 6 82 Bindings für vq_scrninfo; gem/vdi/inquire/vq_scrninfo.ui; vdi_inquire + 7 6 83 Beispiele zu vq_scrninfo; gem/vdi/inquire/vq_scrninfo.ui; vdi_inquire + 7 6 84 v_create_driver_info; gem/vdi/inquire/v_create_driver_info.ui; vdi_inquire + 7 6 85 Bindings für v_create_driver_info; gem/vdi/inquire/v_create_driver_info.ui; vdi_inquire + 7 6 86 v_delete_driver_info; gem/vdi/inquire/v_delete_driver_info.ui; vdi_inquire + 7 6 87 Bindings für v_delete_driver_info; gem/vdi/inquire/v_delete_driver_info.ui; vdi_inquire + 7 6 88 v_getbitmap_info; gem/vdi/inquire/v_getbitmap_info.ui; vdi_inquire + 7 6 89 Bindings für v_getbitmap_info; gem/vdi/inquire/v_getbitmap_info.ui; vdi_inquire + 7 6 90 v_get_driver_info; gem/vdi/inquire/v_get_driver_info.ui; vdi_inquire + 7 6 91 Bindings für v_get_driver_info; gem/vdi/inquire/v_get_driver_info.ui; vdi_inquire + 7 6 92 v_read_default_settings; gem/vdi/inquire/v_read_default_settings.ui; vdi_inquire + 7 6 93 Bindings für v_read_default_settings; gem/vdi/inquire/v_read_default_settings.ui; vdi_inquire + 7 6 94 v_write_default_settings; gem/vdi/inquire/v_write_default_settings.ui; vdi_inquire + 7 6 95 Bindings für v_write_default_settings; gem/vdi/inquire/v_write_default_settings.ui; vdi_inquire + 7 6 96 Aufbau des Fontheaders; gem/vdi/inquire/fontheader.ui; vdi_inquire + 7 6 97 disable_nvdi_errors; gem/vdi/inquire/disable_nvdi.ui; vdi_inquire + 7 6 98 enable_nvdi_errors; gem/vdi/inquire/disable_nvdi.ui; vdi_inquire + 7 7 Eingabefunktionen; gem/vdi/input/input.u; vdi_input + 7 7 1 vex_butv; gem/vdi/input/vex_butv.ui; vdi_input + 7 7 2 Bindings für vex_butv; gem/vdi/input/vex_butv.ui; vdi_input + 7 7 3 vex_curv; gem/vdi/input/vex_curv.ui; vdi_input + 7 7 4 Bindings für vex_curv; gem/vdi/input/vex_curv.ui; vdi_input + 7 7 5 vex_motv; gem/vdi/input/vex_motv.ui; vdi_input + 7 7 6 Bindings für vex_motv; gem/vdi/input/vex_motv.ui; vdi_input + 7 7 7 vex_timv; gem/vdi/input/vex_timv.ui; vdi_input + 7 7 8 Bindings für vex_timv; gem/vdi/input/vex_timv.ui; vdi_input + 7 7 9 vex_wheelv; gem/vdi/input/vex_wheelv.ui; vdi_input + 7 7 10 Bindings für vex_wheelv; gem/vdi/input/vex_wheelv.ui; vdi_input + 7 7 11 vq_key_s; gem/vdi/input/vq_key_s.ui; vdi_input + 7 7 12 Bindings für vq_key_s; gem/vdi/input/vq_key_s.ui; vdi_input + 7 7 13 vq_mouse; gem/vdi/input/vq_mouse.ui; vdi_input + 7 7 14 Bindings für vq_mouse; gem/vdi/input/vq_mouse.ui; vdi_input + 7 7 15 vrq_choice; gem/vdi/input/vrq_choice.ui; vdi_input + 7 7 16 Bindings für vrq_choice; gem/vdi/input/vrq_choice.ui; vdi_input + 7 7 17 vrq_locator; gem/vdi/input/vrq_locator.ui; vdi_input + 7 7 18 Bindings für vrq_locator; gem/vdi/input/vrq_locator.ui; vdi_input + 7 7 19 vrq_string; gem/vdi/input/vrq_string.ui; vdi_input + 7 7 20 Bindings für vrq_string; gem/vdi/input/vrq_string.ui; vdi_input + 7 7 21 vrq_valuator; gem/vdi/input/vrq_valuator.ui; vdi_input + 7 7 22 Bindings für vrq_valuator; gem/vdi/input/vrq_valuator.ui; vdi_input + 7 7 23 vsc_form; gem/vdi/input/vsc_form.ui; vdi_input + 7 7 24 Bindings für vsc_form; gem/vdi/input/vsc_form.ui; vdi_input + 7 7 25 vsin_mode; gem/vdi/input/vsin_mode.ui; vdi_input + 7 7 26 Bindings für vsin_mode; gem/vdi/input/vsin_mode.ui; vdi_input + 7 7 27 vsm_choice; gem/vdi/input/vsm_choice.ui; vdi_input + 7 7 28 Bindings für vsm_choice; gem/vdi/input/vsm_choice.ui; vdi_input + 7 7 29 vsm_locator; gem/vdi/input/vsm_locator.ui; vdi_input + 7 7 30 Bindings für vsm_locator; gem/vdi/input/vsm_locator.ui; vdi_input + 7 7 31 vsm_string; gem/vdi/input/vsm_string.ui; vdi_input + 7 7 32 Bindings für vsm_string; gem/vdi/input/vsm_string.ui; vdi_input + 7 7 33 vsm_valuator; gem/vdi/input/vsm_valuator.ui; vdi_input + 7 7 34 Bindings für vsm_valuator; gem/vdi/input/vsm_valuator.ui; vdi_input + 7 7 35 v_hide_c; gem/vdi/input/v_hide_c.ui; vdi_input + 7 7 36 Bindings für v_hide_c; gem/vdi/input/v_hide_c.ui; vdi_input + 7 7 37 v_show_c; gem/vdi/input/v_show_c.ui; vdi_input + 7 7 38 Bindings für v_show_c; gem/vdi/input/v_show_c.ui; vdi_input + 7 8 Escapefunktionen; gem/vdi/escape/escape.u; vdi_escape + 7 8 1 Grafikspezial-Funktionen; gem/vdi/escape/graphic/graphic.u; vdi_escape + 7 8 1 1 vq_bit_image; gem/vdi/escape/graphic/vq_bit_image.ui; vdi_escape + 7 8 1 2 Bindings für vq_bit_image; gem/vdi/escape/graphic/vq_bit_image.ui; vdi_escape + 7 8 1 3 vq_calibrate; gem/vdi/escape/graphic/vq_calibrate.ui; vdi_escape + 7 8 1 4 Bindings für vq_calibrate; gem/vdi/escape/graphic/vq_calibrate.ui; vdi_escape + 7 8 1 5 vq_driver_info; gem/vdi/escape/graphic/vq_driver_info.ui; vdi_escape + 7 8 1 6 Bindings für vq_driver_info; gem/vdi/escape/graphic/vq_driver_info.ui; vdi_escape + 7 8 1 7 vq_driver_name; gem/vdi/escape/graphic/vq_driver_name.ui; vdi_escape + 7 8 1 8 Bindings für vq_driver_name; gem/vdi/escape/graphic/vq_driver_name.ui; vdi_escape + 7 8 1 9 vq_image_type; gem/vdi/escape/graphic/vq_image_type.ui; vdi_escape + 7 8 1 10 Bindings für vq_image_type; gem/vdi/escape/graphic/vq_image_type.ui; vdi_escape + 7 8 1 11 vq_margins; gem/vdi/escape/graphic/vq_margins.ui; vdi_escape + 7 8 1 12 Bindings für vq_margins; gem/vdi/escape/graphic/vq_margins.ui; vdi_escape + 7 8 1 13 vq_page_name; gem/vdi/escape/graphic/vq_page_name.ui; vdi_escape + 7 8 1 14 Bindings für vq_page_name; gem/vdi/escape/graphic/vq_page_name.ui; vdi_escape + 7 8 1 15 vq_prn_scaling; gem/vdi/escape/graphic/vq_prn_scaling.ui; vdi_escape + 7 8 1 16 Bindings für vq_prn_scaling; gem/vdi/escape/graphic/vq_prn_scaling.ui; vdi_escape + 7 8 1 17 vq_scan; gem/vdi/escape/graphic/vq_scan.ui; vdi_escape + 7 8 1 18 Bindings für vq_scan; gem/vdi/escape/graphic/vq_scan.ui; vdi_escape + 7 8 1 19 vq_tabstatus; gem/vdi/escape/graphic/vq_tabstatus.ui; vdi_escape + 7 8 1 20 Bindings für vq_tabstatus; gem/vdi/escape/graphic/vq_tabstatus.ui; vdi_escape + 7 8 1 21 vq_tray_names; gem/vdi/escape/graphic/vq_tray_names.ui; vdi_escape + 7 8 1 22 Bindings für vq_tray_names; gem/vdi/escape/graphic/vq_tray_names.ui; vdi_escape + 7 8 1 23 vs_calibrate; gem/vdi/escape/graphic/vs_calibrate.ui; vdi_escape + 7 8 1 24 Bindings für vs_calibrate; gem/vdi/escape/graphic/vs_calibrate.ui; vdi_escape + 7 8 1 25 vs_crop; gem/vdi/escape/graphic/vs_crop.ui; vdi_escape + 7 8 1 26 Bindings für vs_crop; gem/vdi/escape/graphic/vs_crop.ui; vdi_escape + 7 8 1 27 vs_document_info; gem/vdi/escape/graphic/vs_document_info.ui; vdi_escape + 7 8 1 28 Bindings für vs_document_info; gem/vdi/escape/graphic/vs_document_info.ui; vdi_escape + 7 8 1 29 vs_load_disp_list; gem/vdi/escape/graphic/vs_load_disp_list.ui; vdi_escape + 7 8 1 30 Bindings für vs_load_disp_list; gem/vdi/escape/graphic/vs_load_disp_list.ui; vdi_escape + 7 8 1 31 vs_page_info; gem/vdi/escape/graphic/vs_page_info.ui; vdi_escape + 7 8 1 32 Bindings für vs_page_info; gem/vdi/escape/graphic/vs_page_info.ui; vdi_escape + 7 8 1 33 vs_palette; gem/vdi/escape/graphic/vs_palette.ui; vdi_escape + 7 8 1 34 Bindings für vs_palette; gem/vdi/escape/graphic/vs_palette.ui; vdi_escape + 7 8 1 35 vs_save_disp_list; gem/vdi/escape/graphic/vs_save_disp_list.ui; vdi_escape + 7 8 1 36 Bindings für vs_save_disp_list; gem/vdi/escape/graphic/vs_save_disp_list.ui; vdi_escape + 7 8 1 37 v_bit_image; gem/vdi/escape/graphic/v_bit_image.ui; vdi_escape + 7 8 1 38 Bindings für v_bit_image; gem/vdi/escape/graphic/v_bit_image.ui; vdi_escape + 7 8 1 39 v_clear_disp_list; gem/vdi/escape/graphic/v_clear_disp_list.ui; vdi_escape + 7 8 1 40 Bindings für v_clear_disp_list; gem/vdi/escape/graphic/v_clear_disp_list.ui; vdi_escape + 7 8 1 41 v_copies; gem/vdi/escape/graphic/v_copies.ui; vdi_escape + 7 8 1 42 Bindings für v_copies; gem/vdi/escape/graphic/v_copies.ui; vdi_escape + 7 8 1 43 v_dspcur; gem/vdi/escape/graphic/v_dspcur.ui; vdi_escape + 7 8 1 44 Bindings für v_dspcur; gem/vdi/escape/graphic/v_dspcur.ui; vdi_escape + 7 8 1 45 v_form_adv; gem/vdi/escape/graphic/v_form_adv.ui; vdi_escape + 7 8 1 46 Bindings für v_form_adv; gem/vdi/escape/graphic/v_form_adv.ui; vdi_escape + 7 8 1 47 v_hardcopy; gem/vdi/escape/graphic/v_hardcopy.ui; vdi_escape + 7 8 1 48 Bindings für v_hardcopy; gem/vdi/escape/graphic/v_hardcopy.ui; vdi_escape + 7 8 1 49 v_orient; gem/vdi/escape/graphic/v_orient.ui; vdi_escape + 7 8 1 50 Bindings für v_orient; gem/vdi/escape/graphic/v_orient.ui; vdi_escape + 7 8 1 51 v_output_window; gem/vdi/escape/graphic/v_output_window.ui; vdi_escape + 7 8 1 52 Bindings für v_output_window; gem/vdi/escape/graphic/v_output_window.ui; vdi_escape + 7 8 1 53 v_page_size; gem/vdi/escape/graphic/v_page_size.ui; vdi_escape + 7 8 1 54 Bindings für v_page_size; gem/vdi/escape/graphic/v_page_size.ui; vdi_escape + 7 8 1 55 v_rmcur; gem/vdi/escape/graphic/v_rmcur.ui; vdi_escape + 7 8 1 56 Bindings für v_rmcur; gem/vdi/escape/graphic/v_rmcur.ui; vdi_escape + 7 8 1 57 v_tray; gem/vdi/escape/graphic/v_tray.ui; vdi_escape + 7 8 1 58 Bindings für v_tray; gem/vdi/escape/graphic/v_tray.ui; vdi_escape + 7 8 1 59 v_xbit_image; gem/vdi/escape/graphic/v_xbit_image.ui; vdi_escape + 7 8 2 Grafiktablett-Funktionen; gem/vdi/escape/tablet/tablet.u; vdi_escape + 7 8 2 1 vq_tdimensions; gem/vdi/escape/tablet/vq_tdimensions.ui; vdi_escape + 7 8 2 2 Bindings für vq_tdimensions; gem/vdi/escape/tablet/vq_tdimensions.ui; vdi_escape + 7 8 2 3 vt_alignment; gem/vdi/escape/tablet/vt_alignment.ui; vdi_escape + 7 8 2 4 Bindings für vt_alignment; gem/vdi/escape/tablet/vt_alignment.ui; vdi_escape + 7 8 2 5 vt_axis; gem/vdi/escape/tablet/vt_axis.ui; vdi_escape + 7 8 2 6 Bindings für vt_axis; gem/vdi/escape/tablet/vt_axis.ui; vdi_escape + 7 8 2 7 vt_origin; gem/vdi/escape/tablet/vt_origin.ui; vdi_escape + 7 8 2 8 Bindings für vt_origin; gem/vdi/escape/tablet/vt_origin.ui; vdi_escape + 7 8 2 9 vt_resolution; gem/vdi/escape/tablet/vt_resolution.ui; vdi_escape + 7 8 2 10 Bindings für vt_resolution; gem/vdi/escape/tablet/vt_resolution.ui; vdi_escape + 7 8 3 Metafile-Funktionen; gem/vdi/escape/metafile/metafile.u; vdi_escape + 7 8 3 1 vm_coords; gem/vdi/escape/metafile/vm_coords.ui; vdi_escape + 7 8 3 2 Bindings für vm_coords; gem/vdi/escape/metafile/vm_coords.ui; vdi_escape + 7 8 3 3 vm_filename; gem/vdi/escape/metafile/vm_filename.ui; vdi_escape + 7 8 3 4 Bindings für vm_filename; gem/vdi/escape/metafile/vm_filename.ui; vdi_escape + 7 8 3 5 vm_pagesize; gem/vdi/escape/metafile/vm_pagesize.ui; vdi_escape + 7 8 3 6 Bindings für vm_pagesize; gem/vdi/escape/metafile/vm_pagesize.ui; vdi_escape + 7 8 3 7 v_meta_extents; gem/vdi/escape/metafile/v_meta_extents.ui; vdi_escape + 7 8 3 8 Bindings für v_meta_extents; gem/vdi/escape/metafile/v_meta_extents.ui; vdi_escape + 7 8 3 9 v_write_meta; gem/vdi/escape/metafile/v_write_meta.ui; vdi_escape + 7 8 3 10 Bindings für v_write_meta; gem/vdi/escape/metafile/v_write_meta.ui; vdi_escape + 7 8 4 Polaroid-Funktionen; gem/vdi/escape/camera/camera.u; vdi_escape + 7 8 4 1 vqp_error; gem/vdi/escape/camera/vqp_error.ui; vdi_escape + 7 8 4 2 Bindings für vqp_error; gem/vdi/escape/camera/vqp_error.ui; vdi_escape + 7 8 4 3 vqp_filmname; gem/vdi/escape/camera/vqp_filmname.ui; vdi_escape + 7 8 4 4 Bindings für vqp_filmname; gem/vdi/escape/camera/vqp_filmname.ui; vdi_escape + 7 8 4 5 vqp_films; gem/vdi/escape/camera/vqp_films.ui; vdi_escape + 7 8 4 6 vqp_state; gem/vdi/escape/camera/vqp_state.ui; vdi_escape + 7 8 4 7 vsc_expose; gem/vdi/escape/camera/vsc_expose.ui; vdi_escape + 7 8 4 8 Bindings für vsc_expose; gem/vdi/escape/camera/vsc_expose.ui; vdi_escape + 7 8 4 9 vsp_film; gem/vdi/escape/camera/vsp_film.ui; vdi_escape + 7 8 4 10 Bindings für vsp_film; gem/vdi/escape/camera/vsp_film.ui; vdi_escape + 7 8 4 11 vsp_message; gem/vdi/escape/camera/vsp_message.ui; vdi_escape + 7 8 4 12 vsp_save; gem/vdi/escape/camera/vsp_save.ui; vdi_escape + 7 8 4 13 vsp_state; gem/vdi/escape/camera/vsp_state.ui; vdi_escape + 7 8 5 Sound-Funktionen; gem/vdi/escape/sound/sound.u; vdi_escape + 7 8 5 1 vmid_load; gem/vdi/escape/sound/vmid_load.ui; vdi_escape + 7 8 5 1 1 Bindings für vmid_load; gem/vdi/escape/sound/vmid_load.ui; vdi_escape + 7 8 5 2 vmid_play; gem/vdi/escape/sound/vmid_play.ui; vdi_escape + 7 8 5 2 1 Bindings für vmid_play; gem/vdi/escape/sound/vmid_play.ui; vdi_escape + 7 8 5 3 vmid_unload; gem/vdi/escape/sound/vmid_unload.ui; vdi_escape + 7 8 5 3 1 Bindings für vmid_unload; gem/vdi/escape/sound/vmid_unload.ui; vdi_escape + 7 8 5 4 vqspl_position_d2d; gem/vdi/escape/sound/vqspl_position_d2d.ui; vdi_escape + 7 8 5 4 1 Bindings für vqspl_position_d2d; gem/vdi/escape/sound/vqspl_position_d2d.ui; vdi_escape + 7 8 5 5 vqspl_position_dma; gem/vdi/escape/sound/vqspl_position_dma.ui; vdi_escape + 7 8 5 5 1 Bindings für vqspl_position_dma; gem/vdi/escape/sound/vqspl_position_dma.ui; vdi_escape + 7 8 5 6 vqspl_status_d2d; gem/vdi/escape/sound/vqspl_status_d2d.ui; vdi_escape + 7 8 5 6 1 Bindings für vqspl_status_d2d; gem/vdi/escape/sound/vqspl_status_d2d.ui; vdi_escape + 7 8 5 7 vqspl_status_dma; gem/vdi/escape/sound/vqspl_status_dma.ui; vdi_escape + 7 8 5 7 1 Bindings für vqspl_status_dma; gem/vdi/escape/sound/vqspl_status_dma.ui; vdi_escape + 7 8 5 8 vqspl_time_left_d2d; gem/vdi/escape/sound/vqspl_time_left_d2d.ui; vdi_escape + 7 8 5 8 1 Bindings für vqspl_time_left_d2d; gem/vdi/escape/sound/vqspl_time_left_d2d.ui; vdi_escape + 7 8 5 9 vspl_load_d2d; gem/vdi/escape/sound/vspl_load_d2d.ui; vdi_escape + 7 8 5 9 1 Bindings für vspl_load_d2d; gem/vdi/escape/sound/vspl_load_d2d.ui; vdi_escape + 7 8 5 10 vspl_load_sample; gem/vdi/escape/sound/vspl_load_sample.ui; vdi_escape + 7 8 5 10 1 Bindings für vspl_load_sample; gem/vdi/escape/sound/vspl_load_sample.ui; vdi_escape + 7 8 5 11 vspl_make_d2d; gem/vdi/escape/sound/vspl_make_d2d.ui; vdi_escape + 7 8 5 11 1 Bindings für vspl_make_d2d; gem/vdi/escape/sound/vspl_make_d2d.ui; vdi_escape + 7 8 5 12 vspl_pause_d2d; gem/vdi/escape/sound/vspl_pause_d2d.ui; vdi_escape + 7 8 5 12 1 Bindings für vspl_pause_d2d; gem/vdi/escape/sound/vspl_pause_d2d.ui; vdi_escape + 7 8 5 13 vspl_pause_dma; gem/vdi/escape/sound/vspl_pause_dma.ui; vdi_escape + 7 8 5 13 1 Bindings für vspl_pause_dma; gem/vdi/escape/sound/vspl_pause_dma.ui; vdi_escape + 7 8 5 14 vspl_play; gem/vdi/escape/sound/vspl_play.ui; vdi_escape + 7 8 5 14 1 Bindings für vspl_play; gem/vdi/escape/sound/vspl_play.ui; vdi_escape + 7 8 5 15 vspl_play_d2d; gem/vdi/escape/sound/vspl_play_d2d.ui; vdi_escape + 7 8 5 15 1 Bindings für vspl_play_d2d; gem/vdi/escape/sound/vspl_play_d2d.ui; vdi_escape + 7 8 5 16 vspl_play_dma; gem/vdi/escape/sound/vspl_play_dma.ui; vdi_escape + 7 8 5 16 1 Bindings für vspl_play_dma; gem/vdi/escape/sound/vspl_play_dma.ui; vdi_escape + 7 8 5 17 vspl_stop_d2d; gem/vdi/escape/sound/vspl_stop_d2d.ui; vdi_escape + 7 8 5 17 1 Bindings für vspl_stop_d2d; gem/vdi/escape/sound/vspl_stop_d2d.ui; vdi_escape + 7 8 5 18 vspl_stop_dma; gem/vdi/escape/sound/vspl_stop_dma.ui; vdi_escape + 7 8 5 18 1 Bindings für vspl_stop_dma; gem/vdi/escape/sound/vspl_stop_dma.ui; vdi_escape + 7 8 5 19 vspl_unload_d2d; gem/vdi/escape/sound/vspl_unload_d2d.ui; vdi_escape + 7 8 5 19 1 Bindings für vspl_unload_d2d; gem/vdi/escape/sound/vspl_unload_d2d.ui; vdi_escape + 7 8 5 20 vspl_unload_sample; gem/vdi/escape/sound/vspl_unload_sample.ui; vdi_escape + 7 8 5 20 1 Bindings für vspl_unload_sample; gem/vdi/escape/sound/vspl_unload_sample.ui; vdi_escape + 7 8 5 21 vsspl_monitor_off; gem/vdi/escape/sound/vsspl_monitor_off.ui; vdi_escape + 7 8 5 21 1 Bindings für vsspl_monitor_off; gem/vdi/escape/sound/vsspl_monitor_off.ui; vdi_escape + 7 8 5 22 vsspl_monitor_on; gem/vdi/escape/sound/vsspl_monitor_on.ui; vdi_escape + 7 8 5 22 1 Bindings für vsspl_monitor_on; gem/vdi/escape/sound/vsspl_monitor_on.ui; vdi_escape + 7 8 6 Spezialfunktionen; gem/vdi/escape/special/special.u; vdi_escape + 7 8 6 1 v_escape2000; gem/vdi/escape/special/v_escape2000.ui; vdi_escape + 7 8 6 2 Bindings für v_escape2000; gem/vdi/escape/special/v_escape2000.ui; vdi_escape + 7 8 6 3 v_fontinit; gem/vdi/escape/special/v_fontinit.ui; vdi_escape + 7 8 6 4 Bindings für v_fontinit; gem/vdi/escape/special/v_fontinit.ui; vdi_escape + 7 8 6 5 v_offset; gem/vdi/escape/special/v_offset.ui; vdi_escape + 7 8 6 6 Bindings für v_offset; gem/vdi/escape/special/v_offset.ui; vdi_escape + 7 8 6 7 v_sound; gem/vdi/escape/special/v_sound.ui; vdi_escape + 7 8 6 8 Bindings für v_sound; gem/vdi/escape/special/v_sound.ui; vdi_escape + 7 8 6 9 vs_mute; gem/vdi/escape/special/vs_mute.ui; vdi_escape + 7 8 6 10 Bindings für vs_mute; gem/vdi/escape/special/vs_mute.ui; vdi_escape + 7 8 7 Text-Funktionen; gem/vdi/escape/text/text.u; vdi_escape + 7 8 7 1 vq_chcells; gem/vdi/escape/text/vq_chcells.ui; vdi_escape + 7 8 7 2 Bindings für vq_chcells; gem/vdi/escape/text/vq_chcells.ui; vdi_escape + 7 8 7 3 vq_curaddress; gem/vdi/escape/text/vq_curaddress.ui; vdi_escape + 7 8 7 4 Bindings für vq_curaddress; gem/vdi/escape/text/vq_curaddress.ui; vdi_escape + 7 8 7 5 v_alpha_text; gem/vdi/escape/text/v_alpha_text.ui; vdi_escape + 7 8 7 6 Bindings für v_alpha_text; gem/vdi/escape/text/v_alpha_text.ui; vdi_escape + 7 8 7 7 v_curaddress; gem/vdi/escape/text/v_curaddress.ui; vdi_escape + 7 8 7 8 Bindings für v_curaddress; gem/vdi/escape/text/v_curaddress.ui; vdi_escape + 7 8 7 9 v_curdown; gem/vdi/escape/text/v_curdown.ui; vdi_escape + 7 8 7 10 Bindings für v_curdown; gem/vdi/escape/text/v_curdown.ui; vdi_escape + 7 8 7 11 v_curhome; gem/vdi/escape/text/v_curhome.ui; vdi_escape + 7 8 7 12 Bindings für v_curhome; gem/vdi/escape/text/v_curhome.ui; vdi_escape + 7 8 7 13 v_curleft; gem/vdi/escape/text/v_curleft.ui; vdi_escape + 7 8 7 14 Bindings für v_curleft; gem/vdi/escape/text/v_curleft.ui; vdi_escape + 7 8 7 15 v_curright; gem/vdi/escape/text/v_curright.ui; vdi_escape + 7 8 7 16 Bindings für v_curright; gem/vdi/escape/text/v_curright.ui; vdi_escape + 7 8 7 17 v_curtext; gem/vdi/escape/text/v_curtext.ui; vdi_escape + 7 8 7 18 Bindings für v_curtext; gem/vdi/escape/text/v_curtext.ui; vdi_escape + 7 8 7 19 v_curup; gem/vdi/escape/text/v_curup.ui; vdi_escape + 7 8 7 20 Bindings für v_curup; gem/vdi/escape/text/v_curup.ui; vdi_escape + 7 8 7 21 v_eeol; gem/vdi/escape/text/v_eeol.ui; vdi_escape + 7 8 7 22 Bindings für v_eeol; gem/vdi/escape/text/v_eeol.ui; vdi_escape + 7 8 7 23 v_eeos; gem/vdi/escape/text/v_eeos.ui; vdi_escape + 7 8 7 24 Bindings für v_eeos; gem/vdi/escape/text/v_eeos.ui; vdi_escape + 7 8 7 25 v_enter_cur; gem/vdi/escape/text/v_enter_cur.ui; vdi_escape + 7 8 7 26 Bindings für v_enter_cur; gem/vdi/escape/text/v_enter_cur.ui; vdi_escape + 7 8 7 27 v_exit_cur; gem/vdi/escape/text/v_exit_cur.ui; vdi_escape + 7 8 7 28 Bindings für v_exit_cur; gem/vdi/escape/text/v_exit_cur.ui; vdi_escape + 7 8 7 29 v_rvoff; gem/vdi/escape/text/v_rvoff.ui; vdi_escape + 7 8 7 30 Bindings für v_rvoff; gem/vdi/escape/text/v_rvoff.ui; vdi_escape + 7 8 7 31 v_rvon; gem/vdi/escape/text/v_rvon.ui; vdi_escape + 7 8 7 32 Bindings für v_rvon; gem/vdi/escape/text/v_rvon.ui; vdi_escape + 7 9 Farbtabellenfunktionen; gem/vdi/colortable/colortable.u; vdi_colortable + 7 9 1 v_color2nearest; gem/vdi/colortable/v_color2nearest.ui; vdi_colortable + 7 9 2 Bindings für v_color2nearest; gem/vdi/colortable/v_color2nearest.ui; vdi_colortable + 7 9 3 v_color2value; gem/vdi/colortable/v_color2value.ui; vdi_colortable + 7 9 4 Bindings für v_color2value; gem/vdi/colortable/v_color2value.ui; vdi_colortable + 7 9 5 v_create_ctab; gem/vdi/colortable/v_create_ctab.ui; vdi_colortable + 7 9 6 Bindings für v_create_ctab; gem/vdi/colortable/v_create_ctab.ui; vdi_colortable + 7 9 7 v_create_itab; gem/vdi/colortable/v_create_itab.ui; vdi_colortable + 7 9 8 Bindings für v_create_itab; gem/vdi/colortable/v_create_itab.ui; vdi_colortable + 7 9 9 v_ctab_idx2value; gem/vdi/colortable/v_ctab_idx2value.ui; vdi_colortable + 7 9 10 Bindings für v_ctab_idx2value; gem/vdi/colortable/v_ctab_idx2value.ui; vdi_colortable + 7 9 11 v_ctab_idx2vdi; gem/vdi/colortable/v_ctab_idx2vdi.ui; vdi_colortable + 7 9 12 Bindings für v_ctab_idx2vdi; gem/vdi/colortable/v_ctab_idx2vdi.ui; vdi_colortable + 7 9 13 v_ctab_vdi2idx; gem/vdi/colortable/v_ctab_vdi2idx.ui; vdi_colortable + 7 9 14 Bindings für v_ctab_vdi2idx; gem/vdi/colortable/v_ctab_vdi2idx.ui; vdi_colortable + 7 9 15 v_delete_ctab; gem/vdi/colortable/v_delete_ctab.ui; vdi_colortable + 7 9 16 Bindings für v_delete_ctab; gem/vdi/colortable/v_delete_ctab.ui; vdi_colortable + 7 9 17 v_delete_itab; gem/vdi/colortable/v_delete_itab.ui; vdi_colortable + 7 9 18 Bindings für v_delete_itab; gem/vdi/colortable/v_delete_itab.ui; vdi_colortable + 7 9 19 v_get_ctab_id; gem/vdi/colortable/v_get_ctab_id.ui; vdi_colortable + 7 9 20 Bindings für v_get_ctab_id; gem/vdi/colortable/v_get_ctab_id.ui; vdi_colortable + 7 9 21 v_value2color; gem/vdi/colortable/v_value2color.ui; vdi_colortable + 7 9 22 Bindings für v_value2color; gem/vdi/colortable/v_value2color.ui; vdi_colortable + 7 9 23 vq_ctab; gem/vdi/colortable/vq_ctab.ui; vdi_colortable + 7 9 24 Bindings für vq_ctab; gem/vdi/colortable/vq_ctab.ui; vdi_colortable + 7 9 25 vq_ctab_entry; gem/vdi/colortable/vq_ctab_entry.ui; vdi_colortable + 7 9 26 Bindings für vq_ctab_entry; gem/vdi/colortable/vq_ctab_entry.ui; vdi_colortable + 7 9 27 vq_ctab_id; gem/vdi/colortable/vq_ctab_id.ui; vdi_colortable + 7 9 28 Bindings für vq_ctab_id; gem/vdi/colortable/vq_ctab_id.ui; vdi_colortable + 7 9 29 vq_dflt_ctab; gem/vdi/colortable/vq_dflt_ctab.ui; vdi_colortable + 7 9 30 Bindings für vq_dflt_ctab; gem/vdi/colortable/vq_dflt_ctab.ui; vdi_colortable + 7 9 31 vq_px_format; gem/vdi/colortable/vq_px_format.ui; vdi_colortable + 7 9 32 Bindings für vq_px_format; gem/vdi/colortable/vq_px_format.ui; vdi_colortable + 7 9 33 vs_ctab; gem/vdi/colortable/vs_ctab.ui; vdi_colortable + 7 9 34 Bindings für vs_ctab; gem/vdi/colortable/vs_ctab.ui; vdi_colortable + 7 9 35 vs_ctab_entry; gem/vdi/colortable/vs_ctab_entry.ui; vdi_colortable + 7 9 36 Bindings für vs_ctab_entry; gem/vdi/colortable/vs_ctab_entry.ui; vdi_colortable + 7 9 37 vs_dflt_ctab; gem/vdi/colortable/vs_dflt_ctab.ui; vdi_colortable + 7 9 38 Bindings für vs_dflt_ctab; gem/vdi/colortable/vs_dflt_ctab.ui; vdi_colortable + 7 10 Kontrollfunktionen; gem/vdi/control/control.u; vdi_control + 7 10 1 v_bez_off; gem/vdi/control/v_bez_off.ui; vdi_control + 7 10 2 Bindings für v_bez_off; gem/vdi/control/v_bez_off.ui; vdi_control + 7 10 3 v_bez_on; gem/vdi/control/v_bez_on.ui; vdi_control + 7 10 4 Bindings für v_bez_on; gem/vdi/control/v_bez_on.ui; vdi_control + 7 10 5 v_clrwk; gem/vdi/control/v_clrwk.ui; vdi_control + 7 10 6 Bindings für v_clrwk; gem/vdi/control/v_clrwk.ui; vdi_control + 7 10 7 v_clsbm; gem/vdi/control/v_clsbm.ui; vdi_control + 7 10 8 Bindings für v_clsbm; gem/vdi/control/v_clsbm.ui; vdi_control + 7 10 9 v_clsvwk; gem/vdi/control/v_clsvwk.ui; vdi_control + 7 10 10 Bindings für v_clsvwk; gem/vdi/control/v_clsvwk.ui; vdi_control + 7 10 11 v_clswk; gem/vdi/control/v_clswk.ui; vdi_control + 7 10 12 Bindings für v_clswk; gem/vdi/control/v_clswk.ui; vdi_control + 7 10 13 v_flushcache; gem/vdi/control/v_flushcache.ui; vdi_control + 7 10 14 Bindings für v_flushcache; gem/vdi/control/v_flushcache.ui; vdi_control + 7 10 15 v_getoutline; gem/vdi/control/v_getoutline.ui; vdi_control + 7 10 16 Bindings für v_getoutline; gem/vdi/control/v_getoutline.ui; vdi_control + 7 10 17 v_get_outline; gem/vdi/control/v_get_outline.ui; vdi_control + 7 10 18 Bindings für v_get_outline; gem/vdi/control/v_get_outline.ui; vdi_control + 7 10 19 v_killoutline; gem/vdi/control/v_killoutline.ui; vdi_control + 7 10 20 v_loadcache; gem/vdi/control/v_loadcache.ui; vdi_control + 7 10 21 Bindings für v_loadcache; gem/vdi/control/v_loadcache.ui; vdi_control + 7 10 22 v_load_cache; gem/vdi/control/v_load_cache.ui; vdi_control + 7 10 23 Bindings für v_load_cache; gem/vdi/control/v_load_cache.ui; vdi_control + 7 10 24 v_open_bm; gem/vdi/control/v_open_bm.ui; vdi_control + 7 10 25 Bindings für v_open_bm; gem/vdi/control/v_open_bm.ui; vdi_control + 7 10 26 v_opnbm; gem/vdi/control/v_opnbm.ui; vdi_control + 7 10 27 Bindings für v_opnbm; gem/vdi/control/v_opnbm.ui; vdi_control + 7 10 28 v_opnprn; gem/vdi/control/v_opnprn.ui; vdi_control + 7 10 29 Bindings für v_opnprn; gem/vdi/control/v_opnprn.ui; vdi_control + 7 10 30 v_opnvwk; gem/vdi/control/v_opnvwk.ui; vdi_control + 7 10 31 Bindings für v_opnvwk; gem/vdi/control/v_opnvwk.ui; vdi_control + 7 10 32 v_opnwk; gem/vdi/control/v_opnwk.ui; vdi_control + 7 10 33 Bindings für v_opnwk; gem/vdi/control/v_opnwk.ui; vdi_control + 7 10 34 Änderungen in PC-GEM; gem/vdi/control/v_opnwk_pc_gem.ui; vdi_control + 7 10 35 v_pat_rotate; gem/vdi/control/v_pat_rotate.ui; vdi_control + 7 10 36 Bindings für v_pat_rotate; gem/vdi/control/v_pat_rotate.ui; vdi_control + 7 10 37 v_resize_bm; gem/vdi/control/v_resize_bm.ui; vdi_control + 7 10 38 Bindings für v_resize_bm; gem/vdi/control/v_resize_bm.ui; vdi_control + 7 10 39 v_savecache; gem/vdi/control/v_savecache.ui; vdi_control + 7 10 40 Bindings für v_savecache; gem/vdi/control/v_savecache.ui; vdi_control + 7 10 41 v_save_cache; gem/vdi/control/v_save_cache.ui; vdi_control + 7 10 42 Bindings für v_save_cache; gem/vdi/control/v_save_cache.ui; vdi_control + 7 10 43 v_set_app_buff; gem/vdi/control/v_set_app_buff.ui; vdi_control + 7 10 44 Bindings für v_set_app_buff; gem/vdi/control/v_set_app_buff.ui; vdi_control + 7 10 45 v_updwk; gem/vdi/control/v_updwk.ui; vdi_control + 7 10 46 Bindings für v_updwk; gem/vdi/control/v_updwk.ui; vdi_control + 7 10 47 vs_clip; gem/vdi/control/vs_clip.ui; vdi_control + 7 10 48 Bindings für vs_clip; gem/vdi/control/vs_clip.ui; vdi_control + 7 10 49 vst_ex_load_fonts; gem/vdi/control/vst_ex_load_fonts.ui; vdi_control + 7 10 50 Bindings für vst_ex_load_fonts; gem/vdi/control/vst_ex_load_fonts.ui; vdi_control + 7 10 51 vst_load_fonts; gem/vdi/control/vst_load_fonts.ui; vdi_control + 7 10 52 Bindings für vst_load_fonts; gem/vdi/control/vst_load_fonts.ui; vdi_control + 7 10 53 vst_unload_fonts; gem/vdi/control/vst_unload_fonts.ui; vdi_control + 7 10 54 Bindings für vst_unload_fonts; gem/vdi/control/vst_unload_fonts.ui; vdi_control + 7 11 Rasterfunktionen; gem/vdi/raster/raster.u; vdi_raster + 7 11 1 v_get_pixel; gem/vdi/raster/v_get_pixel.ui; vdi_raster + 7 11 2 Bindings für v_get_pixel; gem/vdi/raster/v_get_pixel.ui; vdi_raster + 7 11 3 vq_hilite_color; gem/vdi/raster/vq_hilite_color.ui; vdi_raster + 7 11 4 Bindings für vq_hilite_color; gem/vdi/raster/vq_hilite_color.ui; vdi_raster + 7 11 5 vq_max_color; gem/vdi/raster/vq_max_color.ui; vdi_raster + 7 11 6 Bindings für vq_max_color; gem/vdi/raster/vq_max_color.ui; vdi_raster + 7 11 7 vq_min_color; gem/vdi/raster/vq_min_color.ui; vdi_raster + 7 11 8 Bindings für vq_min_color; gem/vdi/raster/vq_min_color.ui; vdi_raster + 7 11 9 vq_weight_color; gem/vdi/raster/vq_weight_color.ui; vdi_raster + 7 11 10 Bindings für vq_weight_color; gem/vdi/raster/vq_weight_color.ui; vdi_raster + 7 11 11 vr_clip_rects32_by_dst; gem/vdi/raster/vr_clip_rects32_by_dst.ui; vdi_raster + 7 11 12 Bindings für vr_clip_rects32_by_dst; gem/vdi/raster/vr_clip_rects32_by_dst.ui; vdi_raster + 7 11 13 vr_clip_rects32_by_src; gem/vdi/raster/vr_clip_rects32_by_src.ui; vdi_raster + 7 11 14 Bindings für vr_clip_rects32_by_src; gem/vdi/raster/vr_clip_rects32_by_src.ui; vdi_raster + 7 11 15 vr_clip_rects_by_dst; gem/vdi/raster/vr_clip_rects_by_dst.ui; vdi_raster + 7 11 16 Bindings für vr_clip_rects_by_dst; gem/vdi/raster/vr_clip_rects_by_dst.ui; vdi_raster + 7 11 17 vr_clip_rects_by_src; gem/vdi/raster/vr_clip_rects_by_src.ui; vdi_raster + 7 11 18 Bindings für vr_clip_rects_by_src; gem/vdi/raster/vr_clip_rects_by_src.ui; vdi_raster + 7 11 19 vr_transfer_bits; gem/vdi/raster/vr_transfer_bits.ui; vdi_raster + 7 11 20 Bindings für vr_transfer_bits; gem/vdi/raster/vr_transfer_bits.ui; vdi_raster + 7 11 21 vr_trnfm; gem/vdi/raster/vr_trnfm.ui; vdi_raster + 7 11 22 Bindings für vr_trnfm; gem/vdi/raster/vr_trnfm.ui; vdi_raster + 7 11 23 vro_cpyfm; gem/vdi/raster/vro_cpyfm.ui; vdi_raster + 7 11 24 Bindings für vro_cpyfm; gem/vdi/raster/vro_cpyfm.ui; vdi_raster + 7 11 25 vrt_cpyfm; gem/vdi/raster/vrt_cpyfm.ui; vdi_raster + 7 11 26 Bindings für vrt_cpyfm; gem/vdi/raster/vrt_cpyfm.ui; vdi_raster + 7 11 27 vs_hilite_color; gem/vdi/raster/vs_hilite_color.ui; vdi_raster + 7 11 28 Bindings für vs_hilite_color; gem/vdi/raster/vs_hilite_color.ui; vdi_raster + 7 11 29 vs_max_color; gem/vdi/raster/vs_max_color.ui; vdi_raster + 7 11 30 Bindings für vs_max_color; gem/vdi/raster/vs_max_color.ui; vdi_raster + 7 11 31 vs_min_color; gem/vdi/raster/vs_min_color.ui; vdi_raster + 7 11 32 Bindings für vs_min_color; gem/vdi/raster/vs_min_color.ui; vdi_raster + 7 11 33 vs_weight_color; gem/vdi/raster/vs_weight_color.ui; vdi_raster + 7 11 34 Bindings für vs_weight_color; gem/vdi/raster/vs_weight_color.ui; vdi_raster + 7 12 TC-VDI-Funktionen; gem/vdi/tcvdi/tcvdi.u; tc_vdi + 7 12 1 vq_colors; gem/vdi/tcvdi/vq_colors.ui; tc_vdi + 7 12 2 Bindings für vq_colors; gem/vdi/tcvdi/vq_colors.ui; tc_vdi + 7 12 3 vq_pixcol; gem/vdi/tcvdi/vq_pixcol.ui; tc_vdi + 7 12 4 Bindings für vq_pixcol; gem/vdi/tcvdi/vq_pixcol.ui; tc_vdi + 7 12 5 vq_pixrgb; gem/vdi/tcvdi/vq_pixrgb.ui; tc_vdi + 7 12 6 Bindings für vq_pixrgb; gem/vdi/tcvdi/vq_pixrgb.ui; tc_vdi + 7 12 7 vrf_rgb; gem/vdi/tcvdi/vrf_rgb.ui; tc_vdi + 7 12 8 Bindings für vrf_rgb; gem/vdi/tcvdi/vrf_rgb.ui; tc_vdi + 7 12 9 vrl_rgb; gem/vdi/tcvdi/vrl_rgb.ui; tc_vdi + 7 12 10 Bindings für vrl_rgb; gem/vdi/tcvdi/vrl_rgb.ui; tc_vdi + 7 12 11 vrt_rgb; gem/vdi/tcvdi/vrt_rgb.ui; tc_vdi + 7 12 12 Bindings für vrt_rgb; gem/vdi/tcvdi/vrt_rgb.ui; tc_vdi + 7 12 13 vrun_parallel; gem/vdi/tcvdi/vrun_parallel.ui; tc_vdi + 7 12 14 Bindings für vrun_parallel; gem/vdi/tcvdi/vrun_parallel.ui; tc_vdi + 7 12 15 vrun_rect; gem/vdi/tcvdi/vrun_rect.ui; tc_vdi + 7 12 16 Bindings für vrun_rect; gem/vdi/tcvdi/vrun_rect.ui; tc_vdi + 7 12 17 vrun_triangle; gem/vdi/tcvdi/vrun_triangle.ui; tc_vdi + 7 12 18 Bindings für vrun_triangle; gem/vdi/tcvdi/vrun_triangle.ui; tc_vdi + 7 12 19 vs_colors; gem/vdi/tcvdi/vs_colors.ui; tc_vdi + 7 12 20 Bindings für vs_colors; gem/vdi/tcvdi/vs_colors.ui; tc_vdi + 7 12 21 vs_pixcol; gem/vdi/tcvdi/vs_pixcol.ui; tc_vdi + 7 12 22 Bindings für vs_pixcol; gem/vdi/tcvdi/vs_pixcol.ui; tc_vdi + 7 12 23 vs_pixrgb; gem/vdi/tcvdi/vs_pixrgb.ui; tc_vdi + 7 12 24 Bindings für vs_pixrgb; gem/vdi/tcvdi/vs_pixrgb.ui; tc_vdi + 7 12 25 vsf_rgb; gem/vdi/tcvdi/vsf_rgb.ui; tc_vdi + 7 12 26 Bindings für vsf_rgb; gem/vdi/tcvdi/vsf_rgb.ui; tc_vdi + 7 12 27 vsl_rgb; gem/vdi/tcvdi/vsl_rgb.ui; tc_vdi + 7 12 28 Bindings für vsl_rgb; gem/vdi/tcvdi/vsl_rgb.ui; tc_vdi + 7 12 29 vst_rgb; gem/vdi/tcvdi/vst_rgb.ui; tc_vdi + 7 12 30 Bindings für vst_rgb; gem/vdi/tcvdi/vst_rgb.ui; tc_vdi + 7 13 VDI-Funktionsliste; gem/vdi/vdi_f.u; vdi_functions + 7 14 VDI-Strukturen; gem/vdi/structures/structures.u; vdi_structures + 7 14 1 VDIPB; gem/vdi/structures/structures.u; vdi_structures + 7 14 2 BIT_IMAGE; gem/vdi/structures/bit_image.ui; vdi_structures + 7 14 3 COLOR_ENTRY; gem/vdi/structures/color_entry.ui; vdi_structures + 7 14 4 COLOR_RGB; gem/vdi/structures/color_rgb.ui; vdi_structures + 7 14 5 COLOR_TAB; gem/vdi/structures/color_tab.ui; vdi_structures + 7 14 6 fix31; gem/vdi/structures/fix31.ui; vdi_structures + 7 14 7 FONT_HDR; gem/vdi/structures/font_hdr.ui; vdi_structures + 7 14 8 GCBITMAP; gem/vdi/structures/gcbitmap.ui; vdi_structures + 7 14 9 MFDB; gem/vdi/structures/mfdb.ui; vdi_structures + 7 14 10 POINT16; gem/vdi/structures/point16.ui; vdi_structures + 7 14 11 POINT32; gem/vdi/structures/point32.ui; vdi_structures + 7 14 12 pxyarray; gem/vdi/structures/pxyarray.ui; vdi_structures + 7 14 13 RECT16; gem/vdi/structures/rect16.ui; vdi_structures + 7 14 14 RECT32; gem/vdi/structures/rect32.ui; vdi_structures + 7 14 15 XFNT_INFO; gem/vdi/structures/xfnt_info.ui; vdi_structures + 8 AES; /home/runner/work/tos.hyp/tos.hyp/tos_hyp.u; aes_main + 8 1 Das AES; gem/aes/aes.u; aes_about + 8 2 Grundlagen des AES; gem/aes/aes.u; aes_fundamentals + 8 2 1 Accessories; gem/aes/aes.u; aes_fundamentals + 8 2 1 1 Startupcode für Accessories; gem/aes/aes.u; aes_fundamentals + 8 2 1 2 Accessories in MagiC; gem/aes/aes.u; aes_fundamentals + 8 2 2 Das Desktop-Fenster; gem/aes/aes.u; aes_fundamentals + 8 2 3 Der Datenaustausch über das GEM-Klemmbrett; gem/aes/aes.u; aes_fundamentals + 8 2 4 Die Objekt-Struktur; gem/aes/aes.u; aes_fundamentals + 8 2 4 1 Objektarten des AES; gem/aes/aes.u; aes_fundamentals + 8 2 4 2 Objektfarben des AES; gem/aes/aes.u; aes_fundamentals + 8 2 4 3 Objektflags des AES; gem/aes/aes.u; aes_fundamentals + 8 2 4 4 Objektstati des AES; gem/aes/aes.u; aes_fundamentals + 8 2 5 Der Quarter-Screen-Buffer; gem/aes/aes.u; aes_fundamentals + 8 2 6 Die Rechteckliste eines Fensters; gem/aes/aes.u; aes_fundamentals + 8 2 7 Der Screen-Manager; gem/aes/aes.u; aes_fundamentals + 8 2 8 Toolbar-Support; gem/aes/toolbar.ui; aes_fundamentals + 8 2 8 1 Redraw und Updating von Toolbars; gem/aes/toolbar.ui; aes_fundamentals + 8 2 8 2 Toolbars und der Window-Manager; gem/aes/toolbar.ui; aes_fundamentals + 8 2 8 3 Probleme bei wind_calc in Toolbar-Fenstern; gem/aes/toolbar.ui; aes_fundamentals + 8 2 9 AES-Bindings; gem/aes/aes.u; aes_fundamentals + 8 2 9 1 Beispiel-Binding für AES-Funktionen; gem/aes/aes.u; aes_fundamentals + 8 3 Applikationsfunktionen; gem/aes/appl_/appl_.u; appl + 8 3 1 appl_bvset; gem/aes/appl_/appl_bvset.ui; appl + 8 3 1 1 Bindings für appl_bvset; gem/aes/appl_/appl_bvset.ui; appl + 8 3 2 appl_control; gem/aes/appl_/appl_control.ui; appl + 8 3 2 1 Bindings für appl_control; gem/aes/appl_/appl_control.ui; appl + 8 3 3 appl_exit; gem/aes/appl_/appl_exit.ui; appl + 8 3 3 1 Bindings für appl_exit; gem/aes/appl_/appl_exit.ui; appl + 8 3 4 appl_find; gem/aes/appl_/appl_find.ui; appl + 8 3 4 1 Bindings für appl_find; gem/aes/appl_/appl_find.ui; appl + 8 3 5 appl_getinfo; gem/aes/appl_/appl_getinfo.ui; appl + 8 3 5 1 Bindings für appl_getinfo; gem/aes/appl_/appl_getinfo.ui; appl + 8 3 5 2 appl_xgetinfo; gem/aes/appl_/appl_getinfo.ui; appl + 8 3 6 appl_getinfo_str; gem/aes/appl_/appl_getinfo_str.ui; appl + 8 3 6 1 Bindings für appl_getinfo_str; gem/aes/appl_/appl_getinfo_str.ui; appl + 8 3 7 appl_getcicon; gem/aes/appl_/appl_get_cicon.ui; appl + 8 3 7 1 Bindings für appl_getcicon; gem/aes/appl_/appl_get_cicon.ui; appl + 8 3 8 appl_init; gem/aes/appl_/appl_init.ui; appl + 8 3 8 1 Bindings für appl_init; gem/aes/appl_/appl_init.ui; appl + 8 3 9 appl_options; gem/aes/appl_/appl_options.ui; appl + 8 3 9 1 Bindings für appl_options; gem/aes/appl_/appl_options.ui; appl + 8 3 10 appl_read; gem/aes/appl_/appl_read.ui; appl + 8 3 10 1 Bindings für appl_read; gem/aes/appl_/appl_read.ui; appl + 8 3 11 appl_search; gem/aes/appl_/appl_search.ui; appl + 8 3 11 1 Bindings für appl_search; gem/aes/appl_/appl_search.ui; appl + 8 3 12 appl_tplay; gem/aes/appl_/appl_tplay.ui; appl + 8 3 12 1 Bindings für appl_tplay; gem/aes/appl_/appl_tplay.ui; appl + 8 3 13 appl_trecord; gem/aes/appl_/appl_trecord.ui; appl + 8 3 13 1 Bindings für appl_trecord; gem/aes/appl_/appl_trecord.ui; appl + 8 3 14 appl_write; gem/aes/appl_/appl_write.ui; appl + 8 3 14 1 Bindings für appl_write; gem/aes/appl_/appl_write.ui; appl + 8 3 15 appl_xbvget; gem/aes/appl_/appl_xbvget.ui; appl + 8 3 15 1 Bindings für appl_xbvget; gem/aes/appl_/appl_xbvget.ui; appl + 8 3 16 appl_xbvset; gem/aes/appl_/appl_xbvset.ui; appl + 8 3 16 1 Bindings für appl_xbvset; gem/aes/appl_/appl_xbvset.ui; appl + 8 3 17 appl_yield; gem/aes/appl_/appl_yield.ui; appl + 8 3 17 1 Bindings für appl_yield; gem/aes/appl_/appl_yield.ui; appl + 8 3 18 _appl_yield; gem/aes/appl_/_appl_yield.ui; appl + 8 3 18 1 Bindings für _appl_yield; gem/aes/appl_/_appl_yield.ui; appl + 8 3 19 x_appl_flags; gem/aes/appl_/x_appl_flags.ui; appl + 8 3 19 1 Bindings für x_appl_flags; gem/aes/appl_/x_appl_flags.ui; appl + 8 3 20 x_appl_font; gem/aes/appl_/x_appl_font.ui; appl + 8 3 20 1 Bindings für x_appl_font; gem/aes/appl_/x_appl_font.ui; appl + 8 3 21 x_appl_sleep; gem/aes/appl_/x_appl_sleep.ui; appl + 8 3 21 1 Bindings für x_appl_sleep; gem/aes/appl_/x_appl_sleep.ui; appl + 8 3 22 x_appl_term; gem/aes/appl_/x_appl_term.ui; appl + 8 3 22 1 Bindings für x_appl_term; gem/aes/appl_/x_appl_term.ui; appl + 8 3 23 xappl_getinfo; gem/aes/appl_/x_appl_getinfo.ui; appl + 8 4 Dateiauswahl; gem/aes/fsel_/fsel_.u; fsel + 8 4 1 fsel_boxinput; gem/aes/fsel_/fsel_boxinput.ui; fsel + 8 4 1 1 Bindings für fsel_boxinput; gem/aes/fsel_/fsel_boxinput.ui; fsel + 8 4 2 fsel_exinput; gem/aes/fsel_/fsel_exinput.ui; fsel + 8 4 2 1 Bindings für fsel_exinput; gem/aes/fsel_/fsel_exinput.ui; fsel + 8 4 3 fsel_input; gem/aes/fsel_/fsel_input.ui; fsel + 8 4 3 1 Bindings für fsel_input; gem/aes/fsel_/fsel_input.ui; fsel + 8 4 4 x_fsel_input; gem/aes/fsel_/x_fsel_input.ui; fsel + 8 4 4 1 Bindings für x_fsel_input; gem/aes/fsel_/x_fsel_input.ui; fsel + 8 5 Druckdialoge; gem/aes/pdlg_/pdlg_.u; pdlg + 8 5 1 pdlg_add_printers; gem/aes/pdlg_/pdlg_add_printers.ui; pdlg + 8 5 1 1 Bindings für pdlg_add_printers; gem/aes/pdlg_/pdlg_add_printers.ui; pdlg + 8 5 2 pdlg_add_sub_dialogs; gem/aes/pdlg_/pdlg_add_sub_dialogs.ui; pdlg + 8 5 2 1 Bindings für pdlg_add_sub_dialogs; gem/aes/pdlg_/pdlg_add_sub_dialogs.ui; pdlg + 8 5 3 pdlg_close; gem/aes/pdlg_/pdlg_close.ui; pdlg + 8 5 3 1 Bindings für pdlg_close; gem/aes/pdlg_/pdlg_close.ui; pdlg + 8 5 4 pdlg_create; gem/aes/pdlg_/pdlg_create.ui; pdlg + 8 5 4 1 Bindings für pdlg_create; gem/aes/pdlg_/pdlg_create.ui; pdlg + 8 5 5 pdlg_delete; gem/aes/pdlg_/pdlg_delete.ui; pdlg + 8 5 5 1 Bindings für pdlg_delete; gem/aes/pdlg_/pdlg_delete.ui; pdlg + 8 5 6 pdlg_dflt_settings; gem/aes/pdlg_/pdlg_dflt_settings.ui; pdlg + 8 5 6 1 Bindings für pdlg_dflt_settings; gem/aes/pdlg_/pdlg_dflt_settings.ui; pdlg + 8 5 7 pdlg_do; gem/aes/pdlg_/pdlg_do.ui; pdlg + 8 5 7 1 Bindings für pdlg_do; gem/aes/pdlg_/pdlg_do.ui; pdlg + 8 5 8 pdlg_evnt; gem/aes/pdlg_/pdlg_evnt.ui; pdlg + 8 5 8 1 Bindings für pdlg_evnt; gem/aes/pdlg_/pdlg_evnt.ui; pdlg + 8 5 9 pdlg_free_settings; gem/aes/pdlg_/pdlg_free_settings.ui; pdlg + 8 5 9 1 Bindings für pdlg_free_settings; gem/aes/pdlg_/pdlg_free_settings.ui; pdlg + 8 5 10 pdlg_get_setsize; gem/aes/pdlg_/pdlg_get_setsize.ui; pdlg + 8 5 10 1 Bindings für pdlg_get_setsize; gem/aes/pdlg_/pdlg_get_setsize.ui; pdlg + 8 5 11 pdlg_new_settings; gem/aes/pdlg_/pdlg_new_settings.ui; pdlg + 8 5 11 1 Bindings für pdlg_new_settings; gem/aes/pdlg_/pdlg_new_settings.ui; pdlg + 8 5 12 pdlg_open; gem/aes/pdlg_/pdlg_open.ui; pdlg + 8 5 12 1 Bindings für pdlg_open; gem/aes/pdlg_/pdlg_open.ui; pdlg + 8 5 13 pdlg_remove_printers; gem/aes/pdlg_/pdlg_remove_printers.ui; pdlg + 8 5 13 1 Bindings für pdlg_remove_printers; gem/aes/pdlg_/pdlg_remove_printers.ui; pdlg + 8 5 14 pdlg_remove_sub_dialogs; gem/aes/pdlg_/pdlg_remove_sub_dialogs.ui; pdlg + 8 5 14 1 Bindings für pdlg_remove_sub_dialogs; gem/aes/pdlg_/pdlg_remove_sub_dialogs.ui; pdlg + 8 5 15 pdlg_save_default_settings; gem/aes/pdlg_/pdlg_save_default_settings.ui; pdlg + 8 5 15 1 Bindings für pdlg_save_default_settings; gem/aes/pdlg_/pdlg_save_default_settings.ui; pdlg + 8 5 16 pdlg_update; gem/aes/pdlg_/pdlg_update.ui; pdlg + 8 5 16 1 Bindings für pdlg_update; gem/aes/pdlg_/pdlg_update.ui; pdlg + 8 5 17 pdlg_use_settings; gem/aes/pdlg_/pdlg_use_settings.ui; pdlg + 8 5 17 1 Bindings für pdlg_use_settings; gem/aes/pdlg_/pdlg_use_settings.ui; pdlg + 8 5 18 pdlg_validate_settings; gem/aes/pdlg_/pdlg_validate_settings.ui; pdlg + 8 5 18 1 Bindings für pdlg_validate_settings; gem/aes/pdlg_/pdlg_validate_settings.ui; pdlg + 8 5 19 Druckauswahl im Fenster; gem/aes/pdlg_/use.ui; pdlg + 8 5 20 Druckauswahl als Dialog; gem/aes/pdlg_/use.ui; pdlg + 8 6 Editobjekt-Funktionen; gem/aes/edit_/edit_.u; edit + 8 6 1 edit_close; gem/aes/edit_/edit_close.ui; edit + 8 6 1 1 Bindings für edit_close; gem/aes/edit_/edit_close.ui; edit + 8 6 2 edit_create; gem/aes/edit_/edit_create.ui; edit + 8 6 2 1 Bindings für edit_create; gem/aes/edit_/edit_create.ui; edit + 8 6 3 edit_cursor; gem/aes/edit_/edit_cursor.ui; edit + 8 6 3 1 Bindings für edit_cursor; gem/aes/edit_/edit_cursor.ui; edit + 8 6 4 edit_delete; gem/aes/edit_/edit_delete.ui; edit + 8 6 4 1 Bindings für edit_delete; gem/aes/edit_/edit_delete.ui; edit + 8 6 5 edit_evnt; gem/aes/edit_/edit_evnt.ui; edit + 8 6 5 1 Bindings für edit_evnt; gem/aes/edit_/edit_evnt.ui; edit + 8 6 6 edit_get_buf; gem/aes/edit_/edit_get_buf.ui; edit + 8 6 6 1 Bindings für edit_get_buf; gem/aes/edit_/edit_get_buf.ui; edit + 8 6 7 edit_get_colour; gem/aes/edit_/edit_get_colour.ui; edit + 8 6 7 1 Bindings für edit_get_colour; gem/aes/edit_/edit_get_colour.ui; edit + 8 6 8 edit_get_cursor; gem/aes/edit_/edit_get_cursor.ui; edit + 8 6 8 1 Bindings für edit_get_cursor; gem/aes/edit_/edit_get_cursor.ui; edit + 8 6 9 edit_get_dirty; gem/aes/edit_/edit_get_dirty.ui; edit + 8 6 9 1 Bindings für edit_get_dirty; gem/aes/edit_/edit_get_dirty.ui; edit + 8 6 10 edit_get_font; gem/aes/edit_/edit_get_font.ui; edit + 8 6 10 1 Bindings für edit_get_font; gem/aes/edit_/edit_get_font.ui; edit + 8 6 11 edit_get_format; gem/aes/edit_/edit_get_format.ui; edit + 8 6 11 1 Bindings für edit_get_format; gem/aes/edit_/edit_get_format.ui; edit + 8 6 12 edit_get_pos; gem/aes/edit_/edit_get_pos.ui; edit + 8 6 12 1 Bindings für edit_get_pos; gem/aes/edit_/edit_get_pos.ui; edit + 8 6 13 edit_get_scrollinfo; gem/aes/edit_/edit_get_scrollinfo.ui; edit + 8 6 13 1 Bindings für edit_get_scrollinfo; gem/aes/edit_/edit_get_scrollinfo.ui; edit + 8 6 14 edit_get_sel; gem/aes/edit_/edit_get_sel.ui; edit + 8 6 14 1 Bindings für edit_get_sel; gem/aes/edit_/edit_get_sel.ui; edit + 8 6 15 edit_open; gem/aes/edit_/edit_open.ui; edit + 8 6 15 1 Bindings für edit_open; gem/aes/edit_/edit_open.ui; edit + 8 6 16 edit_resized; gem/aes/edit_/edit_resized.ui; edit + 8 6 16 1 Bindings für edit_resized; gem/aes/edit_/edit_resized.ui; edit + 8 6 17 edit_scroll; gem/aes/edit_/edit_scroll.ui; edit + 8 6 17 1 Bindings für edit_scroll; gem/aes/edit_/edit_scroll.ui; edit + 8 6 18 edit_set_buf; gem/aes/edit_/edit_set_buf.ui; edit + 8 6 18 1 Bindings für edit_set_buf; gem/aes/edit_/edit_set_buf.ui; edit + 8 6 19 edit_set_colour; gem/aes/edit_/edit_set_colour.ui; edit + 8 6 19 1 Bindings für edit_set_colour; gem/aes/edit_/edit_set_colour.ui; edit + 8 6 20 edit_set_cursor; gem/aes/edit_/edit_set_cursor.ui; edit + 8 6 20 1 Bindings für edit_set_cursor; gem/aes/edit_/edit_set_cursor.ui; edit + 8 6 21 edit_set_dirty; gem/aes/edit_/edit_set_dirty.ui; edit + 8 6 21 1 Bindings für edit_set_dirty; gem/aes/edit_/edit_set_dirty.ui; edit + 8 6 22 edit_set_font; gem/aes/edit_/edit_set_font.ui; edit + 8 6 22 1 Bindings für edit_set_font; gem/aes/edit_/edit_set_font.ui; edit + 8 6 23 edit_set_format; gem/aes/edit_/edit_set_format.ui; edit + 8 6 23 1 Bindings für edit_set_format; gem/aes/edit_/edit_set_format.ui; edit + 8 6 24 edit_set_pos; gem/aes/edit_/edit_set_pos.ui; edit + 8 6 24 1 Bindings für edit_set_pos; gem/aes/edit_/edit_set_pos.ui; edit + 8 6 25 Verwendung G_EDIT-Objekt; gem/aes/edit_/uses.ui; edit + 8 6 26 Tastaturcodes von G_EDIT; gem/aes/edit_/uses.ui; edit + 8 7 Ereignisverwaltung; gem/aes/evnt_/evnt_.u; evnt + 8 7 1 evnt_button; gem/aes/evnt_/evnt_button.ui; evnt + 8 7 1 1 Bindings für evnt_button; gem/aes/evnt_/evnt_button.ui; evnt + 8 7 2 evnt_dclick; gem/aes/evnt_/evnt_dclick.ui; evnt + 8 7 2 1 Bindings für evnt_dclick; gem/aes/evnt_/evnt_dclick.ui; evnt + 8 7 3 evnt_keybd; gem/aes/evnt_/evnt_keybd.ui; evnt + 8 7 3 1 Bindings für evnt_keybd; gem/aes/evnt_/evnt_keybd.ui; evnt + 8 7 4 evnt_mesag; gem/aes/evnt_/evnt_mesag.ui; evnt + 8 7 4 1 Bindings für evnt_mesag; gem/aes/evnt_/evnt_mesag.ui; evnt + 8 7 5 evnt_mouse; gem/aes/evnt_/evnt_mouse.ui; evnt + 8 7 5 1 Bindings für evnt_mouse; gem/aes/evnt_/evnt_mouse.ui; evnt + 8 7 6 evnt_multi; gem/aes/evnt_/evnt_multi.ui; evnt + 8 7 6 1 Bindings für evnt_multi; gem/aes/evnt_/evnt_multi.ui; evnt + 8 7 7 evnt_timer; gem/aes/evnt_/evnt_timer.ui; evnt + 8 7 7 1 Bindings für evnt_timer; gem/aes/evnt_/evnt_timer.ui; evnt + 8 7 8 Nachrichten; gem/aes/evnt_/messages/evnts_de.ui; evnt + 8 7 9 Nachrichten-Liste; gem/aes/evnt_/messages/messages.u; evnt + 8 7 9 1 Das CAB-Protokoll; gem/aes/evnt_/messages/description/cab.ui; evnt + 8 7 9 2 Messages from Geneva; gem/aes/evnt_/messages/description/geneva.ui; evnt + 8 7 9 3 RSDAEMON_MSG; gem/aes/evnt_/messages/description/rsdaemon.ui; evnt + 8 8 Fensterdialoge; gem/aes/wdlg_/wdlg_.u; wdlg + 8 8 1 wdlg_close; gem/aes/wdlg_/wdlg_close.ui; wdlg + 8 8 1 1 Bindings für wdlg_close; gem/aes/wdlg_/wdlg_close.ui; wdlg + 8 8 2 wdlg_create; gem/aes/wdlg_/wdlg_create.ui; wdlg + 8 8 2 1 Bindings für wdlg_create; gem/aes/wdlg_/wdlg_create.ui; wdlg + 8 8 3 wdlg_delete; gem/aes/wdlg_/wdlg_delete.ui; wdlg + 8 8 3 1 Bindings für wdlg_delete; gem/aes/wdlg_/wdlg_delete.ui; wdlg + 8 8 4 wdlg_evnt; gem/aes/wdlg_/wdlg_evnt.ui; wdlg + 8 8 4 1 Bindings für wdlg_evnt; gem/aes/wdlg_/wdlg_evnt.ui; wdlg + 8 8 5 wdlg_get_edit; gem/aes/wdlg_/wdlg_get_edit.ui; wdlg + 8 8 5 1 Bindings für wdlg_get_edit; gem/aes/wdlg_/wdlg_get_edit.ui; wdlg + 8 8 6 wdlg_get_handle; gem/aes/wdlg_/wdlg_get_handle.ui; wdlg + 8 8 6 1 Bindings für wdlg_get_handle; gem/aes/wdlg_/wdlg_get_handle.ui; wdlg + 8 8 7 wdlg_get_tree; gem/aes/wdlg_/wdlg_get_tree.ui; wdlg + 8 8 7 1 Bindings für wdlg_get_tree; gem/aes/wdlg_/wdlg_get_tree.ui; wdlg + 8 8 8 wdlg_get_udata; gem/aes/wdlg_/wdlg_get_udata.ui; wdlg + 8 8 8 1 Bindings für wdlg_get_udata; gem/aes/wdlg_/wdlg_get_udata.ui; wdlg + 8 8 9 wdlg_open; gem/aes/wdlg_/wdlg_open.ui; wdlg + 8 8 9 1 Bindings für wdlg_open; gem/aes/wdlg_/wdlg_open.ui; wdlg + 8 8 10 wdlg_redraw; gem/aes/wdlg_/wdlg_redraw.ui; wdlg + 8 8 10 1 Bindings für wdlg_redraw; gem/aes/wdlg_/wdlg_redraw.ui; wdlg + 8 8 11 wdlg_set_edit; gem/aes/wdlg_/wdlg_set_edit.ui; wdlg + 8 8 11 1 Bindings für wdlg_set_edit; gem/aes/wdlg_/wdlg_set_edit.ui; wdlg + 8 8 12 wdlg_set_iconify; gem/aes/wdlg_/wdlg_set_iconify.ui; wdlg + 8 8 12 1 Bindings für wdlg_set_iconify; gem/aes/wdlg_/wdlg_set_iconify.ui; wdlg + 8 8 13 wdlg_set_size; gem/aes/wdlg_/wdlg_set_size.ui; wdlg + 8 8 13 1 Bindings für wdlg_set_size; gem/aes/wdlg_/wdlg_set_size.ui; wdlg + 8 8 14 wdlg_set_tree; gem/aes/wdlg_/wdlg_set_tree.ui; wdlg + 8 8 14 1 Bindings für wdlg_set_tree; gem/aes/wdlg_/wdlg_set_tree.ui; wdlg + 8 8 15 wdlg_set_uniconify; gem/aes/wdlg_/wdlg_set_uniconify.ui; wdlg + 8 8 15 1 Bindings für wdlg_set_uniconify; gem/aes/wdlg_/wdlg_set_uniconify.ui; wdlg + 8 9 Fensterverwaltung; gem/aes/wind_/wind_.u; wind + 8 9 1 wind_apfind; gem/aes/wind_/wind_apfind.ui; wind + 8 9 1 1 Bindings für wind_apfind; gem/aes/wind_/wind_apfind.ui; wind + 8 9 2 wind_calc; gem/aes/wind_/wind_calc.ui; wind + 8 9 2 1 Bindings für wind_calc; gem/aes/wind_/wind_calc.ui; wind + 8 9 3 wind_close; gem/aes/wind_/wind_close.ui; wind + 8 9 3 1 Bindings für wind_close; gem/aes/wind_/wind_close.ui; wind + 8 9 4 wind_create; gem/aes/wind_/wind_create.ui; wind + 8 9 4 1 Bindings für wind_create; gem/aes/wind_/wind_create.ui; wind + 8 9 5 wind_delete; gem/aes/wind_/wind_delete.ui; wind + 8 9 5 1 Bindings für wind_delete; gem/aes/wind_/wind_delete.ui; wind + 8 9 6 wind_draw; gem/aes/wind_/wind_draw.ui; wind + 8 9 6 1 Bindings für wind_draw; gem/aes/wind_/wind_draw.ui; wind + 8 9 7 wind_find; gem/aes/wind_/wind_find.ui; wind + 8 9 7 1 Bindings für wind_find; gem/aes/wind_/wind_find.ui; wind + 8 9 8 wind_get; gem/aes/wind_/wind_get.ui; wind + 8 9 8 1 Bindings für wind_get; gem/aes/wind_/wind_get.ui; wind + 8 9 9 wind_new; gem/aes/wind_/wind_new.ui; wind + 8 9 9 1 Bindings für wind_new; gem/aes/wind_/wind_new.ui; wind + 8 9 10 wind_open; gem/aes/wind_/wind_open.ui; wind + 8 9 10 1 Bindings für wind_open; gem/aes/wind_/wind_open.ui; wind + 8 9 11 wind_set; gem/aes/wind_/wind_set.ui; wind + 8 9 11 1 wind_set und PC-GEM; gem/aes/wind_/wind_set.ui; wind + 8 9 11 2 Bindings für wind_set; gem/aes/wind_/wind_set.ui; wind + 8 9 11 3 WF_TOPMOST, wind_set; gem/aes/wind_/wind_set/WF_TOPMOST.ui; wind + 8 9 12 wind_update; gem/aes/wind_/wind_update.ui; wind + 8 9 12 1 Bindings für wind_update; gem/aes/wind_/wind_update.ui; wind + 8 9 13 wind_xget; gem/aes/wind_/wind_xget.ui; wind + 8 9 13 1 Bindings für wind_xget; gem/aes/wind_/wind_xget.ui; wind + 8 9 14 wind_xset; gem/aes/wind_/wind_xset.ui; wind + 8 9 14 1 Bindings für wind_xset; gem/aes/wind_/wind_xset.ui; wind + 8 9 15 x_wdial_change; gem/aes/wind_/x_wdial_change.ui; wind + 8 9 15 1 Bindings für x_wdial_change; gem/aes/wind_/x_wdial_change.ui; wind + 8 9 16 x_wdial_draw; gem/aes/wind_/x_wdial_draw.ui; wind + 8 9 16 1 Bindings für x_wdial_draw; gem/aes/wind_/x_wdial_draw.ui; wind + 8 9 17 x_wind_calc; gem/aes/wind_/x_wind_calc.ui; wind + 8 9 17 1 Bindings für x_wind_calc; gem/aes/wind_/x_wind_calc.ui; wind + 8 9 18 x_wind_create; gem/aes/wind_/x_wind_create.ui; wind + 8 9 18 1 Bindings für x_wind_create; gem/aes/wind_/x_wind_create.ui; wind + 8 9 19 x_wind_tree; gem/aes/wind_/x_wind_tree.ui; wind + 8 9 19 1 Bindings für x_wind_tree; gem/aes/wind_/x_wind_tree.ui; wind + 8 9 20 Die Komponenten eines Fensters; gem/aes/wind_/components.ui; wind + 8 9 21 Übersicht der wind_get/set Unterfunktionen; gem/aes/wind_/wind_get_set.ui; wind + 8 9 22 wind_get und wind_set mode von Geneva; gem/aes/wind_/wind_get_set_geneva.ui; wind + 8 10 Fileselektoren; gem/aes/fslx_/fslx_.u; fslx + 8 10 1 fslx_close; gem/aes/fslx_/fslx_close.ui; fslx + 8 10 1 1 Bindings für fslx_close; gem/aes/fslx_/fslx_close.ui; fslx + 8 10 2 fslx_do; gem/aes/fslx_/fslx_do.ui; fslx + 8 10 2 1 Bindings für fslx_do; gem/aes/fslx_/fslx_do.ui; fslx + 8 10 3 fslx_evnt; gem/aes/fslx_/fslx_evnt.ui; fslx + 8 10 3 1 Bindings für fslx_evnt; gem/aes/fslx_/fslx_evnt.ui; fslx + 8 10 4 fslx_getnxtfile; gem/aes/fslx_/fslx_getnxtfile.ui; fslx + 8 10 4 1 Bindings für fslx_getnxtfile; gem/aes/fslx_/fslx_getnxtfile.ui; fslx + 8 10 5 fslx_open; gem/aes/fslx_/fslx_open.ui; fslx + 8 10 5 1 Bindings für fslx_open; gem/aes/fslx_/fslx_open.ui; fslx + 8 10 6 fslx_set_flags; gem/aes/fslx_/fslx_set_flags.ui; fslx + 8 10 6 1 Bindings für fslx_set_flags; gem/aes/fslx_/fslx_set_flags.ui; fslx + 8 10 7 Die Bedienung des File-Selektors ab MagiC 4; gem/aes/fslx_/use.ui; fslx + 8 10 8 Fileselektor als Dialog; gem/aes/fslx_/use.ui; fslx + 8 10 9 Fileselektor im Fenster; gem/aes/fslx_/use.ui; fslx + 8 11 Formularfunktionen; gem/aes/form_/form_.u; form + 8 11 1 form_alert; gem/aes/form_/form_alert.ui; form + 8 11 1 1 Bindings für form_alert; gem/aes/form_/form_alert.ui; form + 8 11 2 form_button; gem/aes/form_/form_button.ui; form + 8 11 2 1 Bindings für form_button; gem/aes/form_/form_button.ui; form + 8 11 3 form_center; gem/aes/form_/form_center.ui; form + 8 11 3 1 Bindings für form_center; gem/aes/form_/form_center.ui; form + 8 11 4 form_dial; gem/aes/form_/form_dial.ui; form + 8 11 4 1 Bindings für form_dial; gem/aes/form_/form_dial.ui; form + 8 11 5 form_do; gem/aes/form_/form_do.ui; form + 8 11 5 1 Bindings für form_do; gem/aes/form_/form_do.ui; form + 8 11 6 form_error; gem/aes/form_/form_error.ui; form + 8 11 6 1 Bindings für form_error; gem/aes/form_/form_error.ui; form + 8 11 7 form_keybd; gem/aes/form_/form_keybd.ui; form + 8 11 7 1 Bindings für form_keybd; gem/aes/form_/form_keybd.ui; form + 8 11 8 form_popup; gem/aes/form_/form_popup.ui; form + 8 11 8 1 Bindings für form_popup; gem/aes/form_/form_popup.ui; form + 8 11 9 form_wbutton; gem/aes/form_/form_wbutton.ui; form + 8 11 9 1 Bindings für form_wbutton; gem/aes/form_/form_wbutton.ui; form + 8 11 10 form_wkeybd; gem/aes/form_/form_wkeybd.ui; form + 8 11 10 1 Bindings für form_wkeybd; gem/aes/form_/form_wkeybd.ui; form + 8 11 11 form_xdial; gem/aes/form_/form_xdial.ui; form + 8 11 11 1 Bindings für form_xdial; gem/aes/form_/form_xdial.ui; form + 8 11 12 form_xdo; gem/aes/form_/form_xdo.ui; form + 8 11 12 1 Bindings für form_xdo; gem/aes/form_/form_xdo.ui; form + 8 11 13 form_xerr; gem/aes/form_/form_xerr.ui; form + 8 11 13 1 Bindings für form_xerr; gem/aes/form_/form_xerr.ui; form + 8 11 14 xfrm_popup; gem/aes/form_/xfrm_popup.ui; form + 8 11 14 1 Bindings für xfrm_popup; gem/aes/form_/xfrm_popup.ui; form + 8 11 15 x_form_center; gem/aes/form_/x_form_center.ui; form + 8 11 15 1 Bindings für x_form_center; gem/aes/form_/x_form_center.ui; form + 8 11 16 x_form_error; gem/aes/form_/x_form_error.ui; form + 8 11 16 1 Bindings für x_form_error; gem/aes/form_/x_form_error.ui; form + 8 11 17 x_form_filename; gem/aes/form_/x_form_filename.ui; form + 8 11 17 1 Bindings für x_form_filename; gem/aes/form_/x_form_filename.ui; form + 8 11 18 x_form_mouse; gem/aes/form_/x_form_mouse.ui; form + 8 11 18 1 Bindings für x_form_mouse; gem/aes/form_/x_form_mouse.ui; form + 8 12 Geneva Funktionen; gem/aes/geneva_/geneva_.u; geneva_function + 8 12 1 x_help; gem/aes/geneva_/x_help.ui; geneva_function + 8 12 1 1 Bindings für x_help; gem/aes/geneva_/x_help.ui; geneva_function + 8 12 2 x_malloc; gem/aes/geneva_/x_malloc.ui; geneva_function + 8 12 2 1 Bindings für x_malloc; gem/aes/geneva_/x_malloc.ui; geneva_function + 8 12 3 x_mfree; gem/aes/geneva_/x_mfree.ui; geneva_function + 8 12 3 1 Bindings für x_mfree; gem/aes/geneva_/x_mfree.ui; geneva_function + 8 12 4 x_mshrink; gem/aes/geneva_/x_mshrink.ui; geneva_function + 8 12 4 1 Bindings für x_mshrink; gem/aes/geneva_/x_mshrink.ui; geneva_function + 8 12 5 x_realloc; gem/aes/geneva_/x_realloc.ui; geneva_function + 8 12 5 1 Bindings für x_realloc; gem/aes/geneva_/x_realloc.ui; geneva_function + 8 12 6 x_settings; gem/aes/geneva_/x_settings.ui; geneva_function + 8 12 6 1 Bindings für x_settings; gem/aes/geneva_/x_settings.ui; geneva_function + 8 12 7 x_sprintf; gem/aes/geneva_/x_sprintf.ui; geneva_function + 8 12 7 1 Bindings für x_sprintf; gem/aes/geneva_/x_sprintf.ui; geneva_function + 8 12 8 x_sscanf; gem/aes/geneva_/x_sscanf.ui; geneva_function + 8 12 8 1 Bindings für x_sscanf; gem/aes/geneva_/x_sscanf.ui; geneva_function + 8 13 Grafikfunktionen; gem/aes/graf_/graf_.u; graf + 8 13 1 graf_dragbox; gem/aes/graf_/graf_dragbox.ui; graf + 8 13 1 1 Bindings für graf_dragbox; gem/aes/graf_/graf_dragbox.ui; graf + 8 13 2 graf_growbox; gem/aes/graf_/graf_growbox.ui; graf + 8 13 2 1 Bindings für graf_growbox; gem/aes/graf_/graf_growbox.ui; graf + 8 13 3 graf_handle; gem/aes/graf_/graf_handle.ui; graf + 8 13 3 1 Bindings für graf_handle; gem/aes/graf_/graf_handle.ui; graf + 8 13 4 graf_mbox; gem/aes/graf_/graf_mbox.ui; graf + 8 13 4 1 Bindings für graf_mbox; gem/aes/graf_/graf_mbox.ui; graf + 8 13 5 graf_mkstate; gem/aes/graf_/graf_mkstate.ui; graf + 8 13 5 1 Bindings für graf_mkstate; gem/aes/graf_/graf_mkstate.ui; graf + 8 13 6 graf_mouse; gem/aes/graf_/graf_mouse.ui; graf + 8 13 6 1 Bindings für graf_mouse; gem/aes/graf_/graf_mouse.ui; graf + 8 13 7 graf_multirubber; gem/aes/graf_/graf_multirubber.ui; graf + 8 13 7 1 Bindings für graf_multirubber; gem/aes/graf_/graf_multirubber.ui; graf + 8 13 8 graf_rubberbox; gem/aes/graf_/graf_rubberbox.ui; graf + 8 13 8 1 Bindings für graf_rubberbox; gem/aes/graf_/graf_rubberbox.ui; graf + 8 13 9 graf_shrinkbox; gem/aes/graf_/graf_shrinkbox.ui; graf + 8 13 9 1 Bindings für graf_shrinkbox; gem/aes/graf_/graf_shrinkbox.ui; graf + 8 13 10 graf_slidebox; gem/aes/graf_/graf_slidebox.ui; graf + 8 13 10 1 graf_slidebox von Geneva; gem/aes/graf_/graf_slidebox.ui; graf + 8 13 10 2 Bindings für graf_slidebox; gem/aes/graf_/graf_slidebox.ui; graf + 8 13 11 graf_watchbox; gem/aes/graf_/graf_watchbox.ui; graf + 8 13 11 1 Bindings für graf_watchbox; gem/aes/graf_/graf_watchbox.ui; graf + 8 13 12 graf_wwatchbox; gem/aes/graf_/graf_wwatchbox.ui; graf + 8 13 12 1 Bindings für graf_wwatchbox; gem/aes/graf_/graf_wwatchbox.ui; graf + 8 13 13 graf_xhandle; gem/aes/graf_/graf_xhandle.ui; graf + 8 13 13 1 Bindings für graf_xhandle; gem/aes/graf_/graf_xhandle.ui; graf + 8 13 14 x_graf_blit; gem/aes/graf_/x_graf_blit.ui; graf + 8 13 14 1 Bindings für x_graf_blit; gem/aes/graf_/x_graf_blit.ui; graf + 8 13 15 x_graf_rast2rez; gem/aes/graf_/x_graf_rast2rez.ui; graf + 8 13 15 1 Bindings für x_graf_rast2rez; gem/aes/graf_/x_graf_rast2rez.ui; graf + 8 13 16 x_graf_rubberbox; gem/aes/graf_/x_graf_rubberbox.ui; graf + 8 13 16 1 Bindings für x_graf_rubberbox; gem/aes/graf_/x_graf_rubberbox.ui; graf + 8 14 Klemmbrett-Funktionen; gem/aes/scrp_/scrp_.u; scrp + 8 14 1 scrp_clear; gem/aes/scrp_/scrp_clear.ui; scrp + 8 14 1 1 Bindings für scrp_clear; gem/aes/scrp_/scrp_clear.ui; scrp + 8 14 2 scrp_read; gem/aes/scrp_/scrp_read.ui; scrp + 8 14 2 1 Bindings für scrp_read; gem/aes/scrp_/scrp_read.ui; scrp + 8 14 3 scrp_write; gem/aes/scrp_/scrp_write.ui; scrp + 8 14 3 1 Bindings für scrp_write; gem/aes/scrp_/scrp_write.ui; scrp + 8 14 4 x_scrp_get; gem/aes/scrp_/x_scrp_get.ui; scrp + 8 14 4 1 Bindings für x_scrp_get; gem/aes/scrp_/x_scrp_get.ui; scrp + 8 15 Listboxen; gem/aes/lbox_/lbox_.u; lbox + 8 15 1 lbox_ascroll_to; gem/aes/lbox_/lbox_ascroll_to.ui; lbox + 8 15 1 1 Bindings für lbox_ascroll_to; gem/aes/lbox_/lbox_ascroll_to.ui; lbox + 8 15 2 lbox_bscroll_to; gem/aes/lbox_/lbox_bscroll_to.ui; lbox + 8 15 2 1 Bindings für lbox_bscroll_to; gem/aes/lbox_/lbox_bscroll_to.ui; lbox + 8 15 3 lbox_cnt_items; gem/aes/lbox_/lbox_cnt_items.ui; lbox + 8 15 3 1 Bindings für lbox_cnt_items; gem/aes/lbox_/lbox_cnt_items.ui; lbox + 8 15 4 lbox_create; gem/aes/lbox_/lbox_create.ui; lbox + 8 15 4 1 Bindings für lbox_create; gem/aes/lbox_/lbox_create.ui; lbox + 8 15 5 lbox_delete; gem/aes/lbox_/lbox_delete.ui; lbox + 8 15 5 1 Bindings für lbox_delete; gem/aes/lbox_/lbox_delete.ui; lbox + 8 15 6 lbox_do; gem/aes/lbox_/lbox_do.ui; lbox + 8 15 6 1 Bindings für lbox_do; gem/aes/lbox_/lbox_do.ui; lbox + 8 15 7 lbox_free_items; gem/aes/lbox_/lbox_free_items.ui; lbox + 8 15 7 1 Bindings für lbox_free_items; gem/aes/lbox_/lbox_free_items.ui; lbox + 8 15 8 lbox_free_list; gem/aes/lbox_/lbox_free_list.ui; lbox + 8 15 8 1 Bindings für lbox_free_list; gem/aes/lbox_/lbox_free_list.ui; lbox + 8 15 9 lbox_get_afirst; gem/aes/lbox_/lbox_get_afirst.ui; lbox + 8 15 9 1 Bindings für lbox_get_afirst; gem/aes/lbox_/lbox_get_afirst.ui; lbox + 8 15 10 lbox_get_avis; gem/aes/lbox_/lbox_get_avis.ui; lbox + 8 15 10 1 Bindings für lbox_get_avis; gem/aes/lbox_/lbox_get_avis.ui; lbox + 8 15 11 lbox_get_bentries; gem/aes/lbox_/lbox_get_bentries.ui; lbox + 8 15 11 1 Bindings für lbox_get_bentries; gem/aes/lbox_/lbox_get_bentries.ui; lbox + 8 15 12 lbox_get_bfirst; gem/aes/lbox_/lbox_get_bfirst.ui; lbox + 8 15 12 1 Bindings für lbox_get_bfirst; gem/aes/lbox_/lbox_get_bfirst.ui; lbox + 8 15 13 lbox_get_bvis; gem/aes/lbox_/lbox_get_bvis.ui; lbox + 8 15 13 1 Bindings für lbox_get_bvis; gem/aes/lbox_/lbox_get_bvis.ui; lbox + 8 15 14 lbox_get_idx; gem/aes/lbox_/lbox_get_idx.ui; lbox + 8 15 14 1 Bindings für lbox_get_idx; gem/aes/lbox_/lbox_get_idx.ui; lbox + 8 15 15 lbox_get_item; gem/aes/lbox_/lbox_get_item.ui; lbox + 8 15 15 1 Bindings für lbox_get_item; gem/aes/lbox_/lbox_get_item.ui; lbox + 8 15 16 lbox_get_items; gem/aes/lbox_/lbox_get_items.ui; lbox + 8 15 16 1 Bindings für lbox_get_items; gem/aes/lbox_/lbox_get_items.ui; lbox + 8 15 17 lbox_get_slct_idx; gem/aes/lbox_/lbox_get_slct_idx.ui; lbox + 8 15 17 1 Bindings für lbox_get_slct_idx; gem/aes/lbox_/lbox_get_slct_idx.ui; lbox + 8 15 18 lbox_get_slct_item; gem/aes/lbox_/lbox_get_slct_item.ui; lbox + 8 15 18 1 Bindings für lbox_get_slct_item; gem/aes/lbox_/lbox_get_slct_item.ui; lbox + 8 15 19 lbox_get_tree; gem/aes/lbox_/lbox_get_tree.ui; lbox + 8 15 19 1 Bindings für lbox_get_tree; gem/aes/lbox_/lbox_get_tree.ui; lbox + 8 15 20 lbox_get_udata; gem/aes/lbox_/lbox_get_udata.ui; lbox + 8 15 20 1 Bindings für lbox_get_udata; gem/aes/lbox_/lbox_get_udata.ui; lbox + 8 15 21 lbox_set_asldr; gem/aes/lbox_/lbox_set_asldr.ui; lbox + 8 15 21 1 Bindings für lbox_set_asldr; gem/aes/lbox_/lbox_set_asldr.ui; lbox + 8 15 22 lbox_set_bentries; gem/aes/lbox_/lbox_set_bentries.ui; lbox + 8 15 22 1 Bindings für lbox_set_bentries; gem/aes/lbox_/lbox_set_bentries.ui; lbox + 8 15 23 lbox_set_bsldr; gem/aes/lbox_/lbox_set_bsldr.ui; lbox + 8 15 23 1 Bindings für lbox_set_bsldr; gem/aes/lbox_/lbox_set_bsldr.ui; lbox + 8 15 24 lbox_set_items; gem/aes/lbox_/lbox_set_items.ui; lbox + 8 15 24 1 Bindings für lbox_set_items; gem/aes/lbox_/lbox_set_items.ui; lbox + 8 15 25 lbox_update; gem/aes/lbox_/lbox_update.ui; lbox + 8 15 25 1 Bindings für lbox_update; gem/aes/lbox_/lbox_update.ui; lbox + 8 15 26 Listboxen im Dialog; gem/aes/lbox_/use.ui; lbox + 8 15 27 Flags für das Verhalten der Listbox; gem/aes/lbox_/flags.ui; lbox + 8 16 MagiC Funktionen; gem/aes/magic_/magic_.u; magic_function + 8 16 1 sys_set_getdisp; gem/aes/magic_/sys_set_getdisp.ui; magic_function + 8 16 1 1 Bindings für sys_set_getdisp; gem/aes/magic_/sys_set_getdisp.ui; magic_function + 8 16 2 sys_recalc_cicon_colours; gem/aes/magic_/sys_recalc_cicon_colours.ui; magic_function + 8 16 2 1 Bindings für sys_recalc_cicon_colours; gem/aes/magic_/sys_recalc_cicon_colours.ui; magic_function + 8 16 3 sys_set_editob; gem/aes/magic_/sys_set_editob.ui; magic_function + 8 16 3 1 Bindings für sys_set_editob; gem/aes/magic_/sys_set_editob.ui; magic_function + 8 16 4 sys_set_getfn; gem/aes/magic_/sys_set_getfn.ui; magic_function + 8 16 4 1 Bindings für sys_set_getfn; gem/aes/magic_/sys_set_getfn.ui; magic_function + 8 16 5 sys_set_setfn; gem/aes/magic_/sys_set_setfn.ui; magic_function + 8 16 5 1 Bindings für sys_set_setfn; gem/aes/magic_/sys_set_setfn.ui; magic_function + 8 16 6 sys_set_winframe_manager; gem/aes/magic_/sys_set_winframe_manager.ui; magic_function + 8 16 6 1 Bindings für sys_set_winframe_manager; gem/aes/magic_/sys_set_winframe_manager.ui; magic_function + 8 16 7 sys_set_appl_getinfo; gem/aes/magic_/sys_set_appl_getinfo.ui; magic_function + 8 16 7 1 Bindings für sys_set_appl_getinfo; gem/aes/magic_/sys_set_appl_getinfo.ui; magic_function + 8 17 Menüfunktionen; gem/aes/menu_/menu_.u; menu + 8 17 1 menu_attach; gem/aes/menu_/menu_attach.ui; menu + 8 17 1 1 Bindings für menu_attach; gem/aes/menu_/menu_attach.ui; menu + 8 17 2 menu_bar; gem/aes/menu_/menu_bar.ui; menu + 8 17 2 1 Bindings für menu_bar; gem/aes/menu_/menu_bar.ui; menu + 8 17 3 menu_click; gem/aes/menu_/menu_click.ui; menu + 8 17 3 1 Bindings für menu_click; gem/aes/menu_/menu_click.ui; menu + 8 17 4 menu_icheck; gem/aes/menu_/menu_icheck.ui; menu + 8 17 4 1 Bindings für menu_icheck; gem/aes/menu_/menu_icheck.ui; menu + 8 17 5 menu_ienable; gem/aes/menu_/menu_ienable.ui; menu + 8 17 5 1 Bindings für menu_ienable; gem/aes/menu_/menu_ienable.ui; menu + 8 17 6 menu_istart; gem/aes/menu_/menu_istart.ui; menu + 8 17 6 1 Bindings für menu_istart; gem/aes/menu_/menu_istart.ui; menu + 8 17 7 menu_popup; gem/aes/menu_/menu_popup.ui; menu + 8 17 7 1 Bindings für menu_popup; gem/aes/menu_/menu_popup.ui; menu + 8 17 8 menu_register; gem/aes/menu_/menu_register.ui; menu + 8 17 8 1 Bindings für menu_register; gem/aes/menu_/menu_register.ui; menu + 8 17 9 menu_settings; gem/aes/menu_/menu_settings.ui; menu + 8 17 9 1 Bindings für menu_settings; gem/aes/menu_/menu_settings.ui; menu + 8 17 10 menu_text; gem/aes/menu_/menu_text.ui; menu + 8 17 10 1 Bindings für menu_text; gem/aes/menu_/menu_text.ui; menu + 8 17 11 menu_tnormal; gem/aes/menu_/menu_tnormal.ui; menu + 8 17 11 1 Bindings für menu_tnormal; gem/aes/menu_/menu_tnormal.ui; menu + 8 17 12 menu_unregister; gem/aes/menu_/menu_unregister.ui; menu + 8 17 12 1 Bindings für menu_unregister; gem/aes/menu_/menu_unregister.ui; menu + 8 18 Objektfunktionen; gem/aes/objc_/objc_.u; objc + 8 18 1 objc_add; gem/aes/objc_/objc_add.ui; objc + 8 18 1 1 Bindings für objc_add; gem/aes/objc_/objc_add.ui; objc + 8 18 2 objc_change; gem/aes/objc_/objc_change.ui; objc + 8 18 2 1 Bindings für objc_change; gem/aes/objc_/objc_change.ui; objc + 8 18 3 objc_delete; gem/aes/objc_/objc_delete.ui; objc + 8 18 3 1 Bindings für objc_delete; gem/aes/objc_/objc_delete.ui; objc + 8 18 4 objc_draw; gem/aes/objc_/objc_draw.ui; objc + 8 18 4 1 Bindings für objc_draw; gem/aes/objc_/objc_draw.ui; objc + 8 18 5 objc_edit; gem/aes/objc_/objc_edit.ui; objc + 8 18 5 1 Bindings für objc_edit; gem/aes/objc_/objc_edit.ui; objc + 8 18 6 objc_find; gem/aes/objc_/objc_find.ui; objc + 8 18 6 1 Bindings für objc_find; gem/aes/objc_/objc_find.ui; objc + 8 18 7 objc_offset; gem/aes/objc_/objc_offset.ui; objc + 8 18 7 1 Bindings für objc_offset; gem/aes/objc_/objc_offset.ui; objc + 8 18 8 objc_order; gem/aes/objc_/objc_order.ui; objc + 8 18 8 1 Bindings für objc_order; gem/aes/objc_/objc_order.ui; objc + 8 18 9 objc_sysvar; gem/aes/objc_/objc_sysvar.ui; objc + 8 18 9 1 Bindings für objc_sysvar; gem/aes/objc_/objc_sysvar.ui; objc + 8 18 10 objc_wchange; gem/aes/objc_/objc_wchange.ui; objc + 8 18 10 1 Bindings für objc_wchange; gem/aes/objc_/objc_wchange.ui; objc + 8 18 11 objc_wdraw; gem/aes/objc_/objc_wdraw.ui; objc + 8 18 11 1 Bindings für objc_wdraw; gem/aes/objc_/objc_wdraw.ui; objc + 8 18 12 objc_wedit; gem/aes/objc_/objc_wedit.ui; objc + 8 18 12 1 Bindings für objc_wedit; gem/aes/objc_/objc_wedit.ui; objc + 8 18 13 objc_xedit; gem/aes/objc_/objc_xedit.ui; objc + 8 18 13 1 Bindings für objc_xedit; gem/aes/objc_/objc_xedit.ui; objc + 8 18 14 objc_xfind; gem/aes/objc_/objc_xfind.ui; objc + 8 18 14 1 Bindings für objc_xfind; gem/aes/objc_/objc_xfind.ui; objc + 8 18 15 x_objc_edit; gem/aes/objc_/x_objc_edit.ui; objc + 8 18 15 1 Bindings für x_objc_edit; gem/aes/objc_/x_objc_edit.ui; objc + 8 19 Prozessverwaltung; gem/aes/proc_/proc_.u; proc + 8 19 1 proc_create; gem/aes/proc_/proc_create.ui; proc + 8 19 1 1 Bindings für proc_create; gem/aes/proc_/proc_create.ui; proc + 8 19 2 proc_delete; gem/aes/proc_/proc_delete.ui; proc + 8 19 2 1 Bindings für proc_delete; gem/aes/proc_/proc_delete.ui; proc + 8 19 3 proc_info; gem/aes/proc_/proc_info.ui; proc + 8 19 3 1 Bindings für proc_info; gem/aes/proc_/proc_info.ui; proc + 8 19 4 proc_malloc; gem/aes/proc_/proc_malloc.ui; proc + 8 19 4 1 Bindings für proc_malloc; gem/aes/proc_/proc_malloc.ui; proc + 8 19 5 proc_mfree; gem/aes/proc_/proc_mfree.ui; proc + 8 19 5 1 Bindings für proc_mfree; gem/aes/proc_/proc_mfree.ui; proc + 8 19 6 proc_run; gem/aes/proc_/proc_run.ui; proc + 8 19 6 1 Bindings für proc_run; gem/aes/proc_/proc_run.ui; proc + 8 19 7 proc_setblock; gem/aes/proc_/proc_setblock.ui; proc + 8 19 7 1 Bindings für proc_setblock; gem/aes/proc_/proc_setblock.ui; proc + 8 19 8 proc_shrink; gem/aes/proc_/proc_shrink.ui; proc + 8 19 8 1 Bindings für proc_shrink; gem/aes/proc_/proc_shrink.ui; proc + 8 19 9 proc_switch; gem/aes/proc_/proc_switch.ui; proc + 8 19 9 1 Bindings für proc_switch; gem/aes/proc_/proc_switch.ui; proc + 8 20 Eigenschaft-Funktionen; gem/aes/prop_/prop_.u; prop + 8 20 1 prop_del; gem/aes/prop_/prop_del.ui; prop + 8 20 1 1 Bindings für prop_del; gem/aes/prop_/prop_del.ui; prop + 8 20 2 prop_get; gem/aes/prop_/prop_get.ui; prop + 8 20 2 1 Bindings für prop_get; gem/aes/prop_/prop_get.ui; prop + 8 20 3 prop_gui_get; gem/aes/prop_/prop_gui_get.ui; prop + 8 20 3 1 Bindings für prop_gui_get; gem/aes/prop_/prop_gui_get.ui; prop + 8 20 4 prop_gui_set; gem/aes/prop_/prop_gui_set.ui; prop + 8 20 4 1 Bindings für prop_gui_set; gem/aes/prop_/prop_gui_set.ui; prop + 8 20 5 prop_put; gem/aes/prop_/prop_put.ui; prop + 8 20 5 1 Bindings für prop_put; gem/aes/prop_/prop_put.ui; prop + 8 21 Resourcefunktionen; gem/aes/rsrc_/rsrc_.u; rsrc + 8 21 1 rsrc_free; gem/aes/rsrc_/rsrc_free.ui; rsrc + 8 21 1 1 Bindings für rsrc_free; gem/aes/rsrc_/rsrc_free.ui; rsrc + 8 21 2 rsrc_gaddr; gem/aes/rsrc_/rsrc_gaddr.ui; rsrc + 8 21 2 1 Bindings für rsrc_gaddr; gem/aes/rsrc_/rsrc_gaddr.ui; rsrc + 8 21 3 rsrc_load; gem/aes/rsrc_/rsrc_load.ui; rsrc + 8 21 3 1 Bindings für rsrc_load; gem/aes/rsrc_/rsrc_load.ui; rsrc + 8 21 4 rsrc_obfix; gem/aes/rsrc_/rsrc_obfix.ui; rsrc + 8 21 4 1 Bindings für rsrc_obfix; gem/aes/rsrc_/rsrc_obfix.ui; rsrc + 8 21 5 rsrc_rcfix; gem/aes/rsrc_/rsrc_rcfix.ui; rsrc + 8 21 5 1 Bindings für rsrc_rcfix; gem/aes/rsrc_/rsrc_rcfix.ui; rsrc + 8 21 6 rsrc_saddr; gem/aes/rsrc_/rsrc_saddr.ui; rsrc + 8 21 6 1 Bindings für rsrc_saddr; gem/aes/rsrc_/rsrc_saddr.ui; rsrc + 8 22 Shellfunktionen; gem/aes/shel_/shel_.u; shel + 8 22 1 shel_envrn; gem/aes/shel_/shel_envrn.ui; shel + 8 22 1 1 Bindings für shel_envrn; gem/aes/shel_/shel_envrn.ui; shel + 8 22 2 shel_find; gem/aes/shel_/shel_find.ui; shel + 8 22 2 1 Bindings für shel_find; gem/aes/shel_/shel_find.ui; shel + 8 22 3 shel_get; gem/aes/shel_/shel_get.ui; shel + 8 22 3 1 Bindings für shel_get; gem/aes/shel_/shel_get.ui; shel + 8 22 4 shel_help; gem/aes/shel_/shel_help.ui; shel + 8 22 4 1 Bindings für shel_help; gem/aes/shel_/shel_help.ui; shel + 8 22 5 shel_put; gem/aes/shel_/shel_put.ui; shel + 8 22 5 1 Bindings für shel_put; gem/aes/shel_/shel_put.ui; shel + 8 22 6 shel_rdef; gem/aes/shel_/shel_rdef.ui; shel + 8 22 6 1 Bindings für shel_rdef; gem/aes/shel_/shel_rdef.ui; shel + 8 22 7 shel_read; gem/aes/shel_/shel_read.ui; shel + 8 22 7 1 Bindings für shel_read; gem/aes/shel_/shel_read.ui; shel + 8 22 8 shel_wdef; gem/aes/shel_/shel_wdef.ui; shel + 8 22 8 1 Bindings für shel_wdef; gem/aes/shel_/shel_wdef.ui; shel + 8 22 9 shel_write; gem/aes/shel_/shel_write.ui; shel + 8 22 9 1 Bindings für shel_write; gem/aes/shel_/shel_write.ui; shel + 8 22 10 x_shel_get; gem/aes/shel_/x_shel_get.ui; shel + 8 22 10 1 Bindings für x_shel_get; gem/aes/shel_/x_shel_get.ui; shel + 8 22 11 x_shel_put; gem/aes/shel_/x_shel_put.ui; shel + 8 22 11 1 Bindings für x_shel_put; gem/aes/shel_/x_shel_put.ui; shel + 8 23 Erweiterte Grafikfunktionen; gem/aes/xgrf_/xgrf_.u; xgrf + 8 23 1 xgrf_2box; gem/aes/xgrf_/xgrf_2box.ui; xgrf + 8 23 2 Bindings für xgrf_2box; gem/aes/xgrf_/xgrf_2box.ui; xgrf + 8 23 3 xgrf_stepcalc; gem/aes/xgrf_/xgrf_stepcalc.ui; xgrf + 8 23 4 Bindings für xgrf_stepcalc; gem/aes/xgrf_/xgrf_stepcalc.ui; xgrf + 8 23 5 xgrf_color; gem/aes/xgrf_/xgrf_color.ui; xgrf + 8 23 6 xgrf_dtimage; gem/aes/xgrf_/xgrf_dtimage.ui; xgrf + 8 24 Erweiterte Shellfunktionen; gem/aes/xshl_/xshl_.u; xshl + 8 24 1 xshl_getshell; gem/aes/xshl_/xshl_getshell.ui; xshl + 8 24 1 1 Bindings für xshl_getshell; gem/aes/xshl_/xshl_getshell.ui; xshl + 8 24 2 xshl_setshell; gem/aes/xshl_/xshl_setshell.ui; xshl + 8 24 2 1 Bindings für xshl_setshell; gem/aes/xshl_/xshl_setshell.ui; xshl + 8 25 Zeichensatzauswahl; gem/aes/fnts_/fnts_.u; fnts + 8 25 1 fnts_add; gem/aes/fnts_/fnts_add.ui; fnts + 8 25 1 1 Bindings für fnts_add; gem/aes/fnts_/fnts_add.ui; fnts + 8 25 2 fnts_close; gem/aes/fnts_/fnts_close.ui; fnts + 8 25 2 1 Bindings für fnts_close; gem/aes/fnts_/fnts_close.ui; fnts + 8 25 3 fnts_create; gem/aes/fnts_/fnts_create.ui; fnts + 8 25 3 1 Bindings für fnts_create; gem/aes/fnts_/fnts_create.ui; fnts + 8 25 4 fnts_delete; gem/aes/fnts_/fnts_delete.ui; fnts + 8 25 4 1 Bindings für fnts_delete; gem/aes/fnts_/fnts_delete.ui; fnts + 8 25 5 fnts_do; gem/aes/fnts_/fnts_do.ui; fnts + 8 25 5 1 Bindings für fnts_do; gem/aes/fnts_/fnts_do.ui; fnts + 8 25 6 fnts_evnt; gem/aes/fnts_/fnts_evnt.ui; fnts + 8 25 6 1 Bindings für fnts_evnt; gem/aes/fnts_/fnts_evnt.ui; fnts + 8 25 7 fnts_get_info; gem/aes/fnts_/fnts_get_info.ui; fnts + 8 25 7 1 Bindings für fnts_get_info; gem/aes/fnts_/fnts_get_info.ui; fnts + 8 25 8 fnts_get_name; gem/aes/fnts_/fnts_get_name.ui; fnts + 8 25 8 1 Bindings für fnts_get_name; gem/aes/fnts_/fnts_get_name.ui; fnts + 8 25 9 fnts_get_no_styles; gem/aes/fnts_/fnts_get_no_styles.ui; fnts + 8 25 9 1 Bindings für fnts_get_no_styles; gem/aes/fnts_/fnts_get_no_styles.ui; fnts + 8 25 10 fnts_get_style; gem/aes/fnts_/fnts_get_style.ui; fnts + 8 25 10 1 Bindings für fnts_get_style; gem/aes/fnts_/fnts_get_style.ui; fnts + 8 25 11 fnts_open; gem/aes/fnts_/fnts_open.ui; fnts + 8 25 11 1 Bindings für fnts_open; gem/aes/fnts_/fnts_open.ui; fnts + 8 25 12 fnts_remove; gem/aes/fnts_/fnts_remove.ui; fnts + 8 25 12 1 Bindings für fnts_remove; gem/aes/fnts_/fnts_remove.ui; fnts + 8 25 13 fnts_update; gem/aes/fnts_/fnts_update.ui; fnts + 8 25 13 1 Bindings für fnts_update; gem/aes/fnts_/fnts_update.ui; fnts + 8 25 14 Zeichensatzauswahl im Fenster; gem/aes/fnts_/use.ui; fnts + 8 25 15 Zeichensatzauswahl als Dialog; gem/aes/fnts_/use.ui; fnts + 8 26 AES-Funktionsliste; gem/aes/aes_f.u; aes_functions + 8 27 AES-Strukturen; gem/aes/structures/structures.u; aes_structures + 8 27 1 AESPB; gem/aes/structures/structures.u; aes_structures + 8 27 2 ANI_MOUSE; gem/aes/structures/ANI_MOUSE.ui; aes_structures + 8 27 3 APPFLAGS; gem/aes/structures/APPFLAGS.ui; aes_structures + 8 27 4 APFLG; gem/aes/structures/APPFLG.ui; aes_structures + 8 27 5 APPLRECORD; gem/aes/structures/applrecord.ui; aes_structures + 8 27 6 Die Bit-Block-Struktur; gem/aes/structures/bitblk.ui; aes_structures + 8 27 7 CICON; gem/aes/structures/cicon.ui; aes_structures + 8 27 8 CICONBLK; gem/aes/structures/ciconblk.ui; aes_structures + 8 27 9 CLRCAT; gem/aes/structures/clrcat.ui; aes_structures + 8 27 10 DIALOG; gem/aes/structures/dialog.ui; aes_structures + 8 27 11 DITHER_MODE; gem/aes/structures/dither_mode.ui; aes_structures + 8 27 12 DRV_ENTRY; gem/aes/structures/drv_entry.ui; aes_structures + 8 27 13 DRV_INFO; gem/aes/structures/drv_info.ui; aes_structures + 8 27 14 EVNT; gem/aes/structures/evnt.ui; aes_structures + 8 27 15 FNTS_ITEM; gem/aes/structures/fnts_item.ui; aes_structures + 8 27 16 FNT_DIALOG; gem/aes/structures/fnt_dialog.ui; aes_structures + 8 27 17 G_VECTORS; gem/aes/structures/G_VECTORS.ui; aes_structures + 8 27 18 HNDL_OBJ; gem/aes/structures/hndl_obj.ui; aes_structures + 8 27 18 1 Beispiel zu HNDL_OBJ; gem/aes/structures/hndl_obj.ui; aes_structures + 8 27 18 2 HNDL_INIT; gem/aes/structures/hndl_obj.ui; aes_structures + 8 27 18 3 HNDL_MESG; gem/aes/structures/hndl_obj.ui; aes_structures + 8 27 18 4 HNDL_OPEN; gem/aes/structures/hndl_obj.ui; aes_structures + 8 27 18 5 HNDL_CLSD; gem/aes/structures/hndl_obj.ui; aes_structures + 8 27 18 6 HNDL_MOVE; gem/aes/structures/hndl_obj.ui; aes_structures + 8 27 18 7 HNDL_TOPW; gem/aes/structures/hndl_obj.ui; aes_structures + 8 27 18 8 HNDL_UNTP; gem/aes/structures/hndl_obj.ui; aes_structures + 8 27 18 9 HNDL_EDIT; gem/aes/structures/hndl_obj.ui; aes_structures + 8 27 18 10 HNDL_EDDN; gem/aes/structures/hndl_obj.ui; aes_structures + 8 27 18 11 HNDL_EDCH; gem/aes/structures/hndl_obj.ui; aes_structures + 8 27 19 ICONBLK; gem/aes/structures/iconblk.ui; aes_structures + 8 27 20 KEYCODE; gem/aes/structures/KEYCODE.ui; aes_structures + 8 27 21 LBOX_ITEM; gem/aes/structures/lbox_item.ui; aes_structures + 8 27 22 LIST_BOX; gem/aes/structures/list_box.ui; aes_structures + 8 27 23 MEDIA_SIZE; gem/aes/structures/media_size.ui; aes_structures + 8 27 24 MEDIA_TYPE; gem/aes/structures/media_type.ui; aes_structures + 8 27 25 MENU; gem/aes/structures/menu.ui; aes_structures + 8 27 26 MFORM; gem/aes/structures/mform.ui; aes_structures + 8 27 27 MN_SET; gem/aes/structures/mn_set.ui; aes_structures + 8 27 28 OBJECT; gem/aes/structures/object.ui; aes_structures + 8 27 29 OB_PREFER; gem/aes/structures/OB_PREFER.ui; aes_structures + 8 27 30 PARMBLK; gem/aes/structures/parmblk.ui; aes_structures + 8 27 31 PDLG_HNDL; gem/aes/structures/pdlg_hndl.ui; aes_structures + 8 27 32 PDLG_INIT; gem/aes/structures/pdlg_init.ui; aes_structures + 8 27 33 PDLG_RESET; gem/aes/structures/pdlg_reset.ui; aes_structures + 8 27 34 PDLG_SUB; gem/aes/structures/pdlg_sub.ui; aes_structures + 8 27 35 POPINFO; gem/aes/structures/popinfo.ui; aes_structures + 8 27 36 PRN_DIALOG; gem/aes/structures/prn_dialog.ui; aes_structures + 8 27 37 PRN_ENTRY; gem/aes/structures/prn_entry.ui; aes_structures + 8 27 38 PRN_MODE; gem/aes/structures/prn_mode.ui; aes_structures + 8 27 39 PRN_SETTINGS; gem/aes/structures/prn_settings.ui; aes_structures + 8 27 40 PRN_SWITCH; gem/aes/structures/prn_switch.ui; aes_structures + 8 27 41 PRN_TRAY; gem/aes/structures/prn_tray.ui; aes_structures + 8 27 42 RSHDR; gem/aes/structures/rshdr.ui; aes_structures + 8 27 43 RSXHDR; gem/aes/structures/rsxhdr.ui; aes_structures + 8 27 44 SCANX; gem/aes/structures/scanx.ui; aes_structures + 8 27 45 SETTINGS; gem/aes/structures/SETTINGS.ui; aes_structures + 8 27 46 SET_ITEM; gem/aes/structures/set_item.ui; aes_structures + 8 27 47 SHELTAIL; gem/aes/structures/sheltail.ui; aes_structures + 8 27 48 SHELW; gem/aes/structures/shelw.ui; aes_structures + 8 27 49 SLCT_ITEM; gem/aes/structures/slct_item.ui; aes_structures + 8 27 50 SWINFO; gem/aes/structures/swinfo.ui; aes_structures + 8 27 51 TEDINFO; gem/aes/structures/tedinfo.ui; aes_structures + 8 27 52 USERBLK; gem/aes/structures/userblk.ui; aes_structures + 8 27 53 UTXT_FN; gem/aes/structures/utxt_fn.ui; aes_structures + 8 27 54 WIND_TREE; gem/aes/structures/WIND_TREE.ui; aes_structures + 8 27 55 WINFRAME_HANDLER; gem/aes/structures/WINFRAME_HANDLER.ui; aes_structures + 8 27 56 WINFRAME_SETTINGS; gem/aes/structures/WINFRAME_SETTINGS.ui; aes_structures + 8 27 57 WININFO; gem/aes/structures/WININFO.ui; aes_structures + 8 27 58 XAESMSG; gem/aes/structures/xaesmsg.ui; aes_structures + 8 27 59 XDO_INF; gem/aes/structures/xdo_inf.ui; aes_structures + 8 27 60 XFONTINFO; gem/aes/structures/XFONTINFO.ui; aes_structures + 8 27 61 XFSL_FILTER; gem/aes/structures/xfsl_filter.ui; aes_structures + 8 27 62 XSHW_COMMAND; gem/aes/structures/xshw_command.ui; aes_structures + 8 27 63 XTED; gem/aes/structures/xted.ui; aes_structures + 8 27 64 X_BUF_V2; gem/aes/structures/x_buf_v2.ui; aes_structures + 9 XCONTROL; /home/runner/work/tos.hyp/tos.hyp/tos_hyp.u; xcontrol_main + 9 1 Das XCONTROL; gem/cpxdoku.u; xcontrol + 9 1 1 CPX-Programmierrichtlinien; gem/cpxdoku.u; xcontrol + 9 1 2 CPX-Funktionen; gem/cpxdoku.u; xcontrol + 9 1 2 1 cpx_button; gem/cpxdoku.u; xcontrol + 9 1 2 2 cpx_call; gem/cpxdoku.u; xcontrol + 9 1 2 3 cpx_close; gem/cpxdoku.u; xcontrol + 9 1 2 4 cpx_draw; gem/cpxdoku.u; xcontrol + 9 1 2 5 cpx_hook; gem/cpxdoku.u; xcontrol + 9 1 2 6 cpx_init; gem/cpxdoku.u; xcontrol + 9 1 2 7 cpx_m1; gem/cpxdoku.u; xcontrol + 9 1 2 8 cpx_m2; gem/cpxdoku.u; xcontrol + 9 1 2 9 cpx_key; gem/cpxdoku.u; xcontrol + 9 1 2 10 cpx_timer; gem/cpxdoku.u; xcontrol + 9 1 2 11 cpx_wmove; gem/cpxdoku.u; xcontrol + 9 1 3 XCONTROL-Funktionen; gem/cpxdoku.u; xcontrol + 9 1 3 1 CPX_Save; gem/cpxdoku.u; xcontrol + 9 1 3 2 Get_Buffer; gem/cpxdoku.u; xcontrol + 9 1 3 3 getcookie; gem/cpxdoku.u; xcontrol + 9 1 3 4 GetFirstRect; gem/cpxdoku.u; xcontrol + 9 1 3 5 GetNextRect; gem/cpxdoku.u; xcontrol + 9 1 3 6 MFsave; gem/cpxdoku.u; xcontrol + 9 1 3 7 Popup; gem/cpxdoku.u; xcontrol + 9 1 3 8 rsh_fix; gem/cpxdoku.u; xcontrol + 9 1 3 9 rsh_obfix; gem/cpxdoku.u; xcontrol + 9 1 3 10 Set_Evnt_Mask; gem/cpxdoku.u; xcontrol + 9 1 3 11 Sl_arrow; gem/cpxdoku.u; xcontrol + 9 1 3 12 Sl_dragx; gem/cpxdoku.u; xcontrol + 9 1 3 13 Sl_dragy; gem/cpxdoku.u; xcontrol + 9 1 3 14 Sl_size; gem/cpxdoku.u; xcontrol + 9 1 3 15 Sl_x; gem/cpxdoku.u; xcontrol + 9 1 3 16 Sl_y; gem/cpxdoku.u; xcontrol + 9 1 3 17 Xform_do; gem/cpxdoku.u; xcontrol + 9 1 3 18 XGen_Alert; gem/cpxdoku.u; xcontrol + 10 Programmierrichtlinen; /home/runner/work/tos.hyp/tos.hyp/tos_hyp.u; guidelines + 10 1 Drei wichtige Programmierregeln; gem/guidelns/style.u; guidelines_rules + 10 2 Style-Guidelines; gem/guidelns/style.u; guidelines_styles + 10 2 1 Dialogboxen; gem/guidelns/style.u; guidelines_styles + 10 2 2 Hilfesysteme; gem/guidelns/style.u; guidelines_styles + 10 2 3 Mausklicks und Formen; gem/guidelns/style.u; guidelines_styles + 10 2 4 Menüs und Menüzeilen; gem/guidelns/style.u; guidelines_styles + 10 2 5 Optische und akustische Rückmeldungen; gem/guidelns/style.u; guidelines_styles + 10 2 6 Selektionen; gem/guidelns/style.u; guidelines_styles + 10 2 7 Spezialeffekte; gem/guidelns/style.u; guidelines_styles + 10 2 8 Tastaturbelegung; gem/guidelns/style.u; guidelines_styles + 10 2 9 Toolboxen; gem/guidelns/style.u; guidelines_styles + 11 MagiC; magic/magic.u; magic + 11 1 AESVARS, Zeiger auf AESVARS; magic/magic.u; magic_aesvars + 11 2 MAGX_COOKIE, status_bits; magic/magic.u; magic_cookie + 11 3 Auszug aus dem BIOS von MagiC; magic/magic.u; magic_bios + 11 4 Die AUTOEXEC.BAT-Datei in MagiC; magic/magic.u; magic_autoexec + 11 5 Anmerkungen zum 3D-Look von MagiC; magic/magic.u; magic_3dlook + 11 6 Eingabefelder in MagiC; magic/magic.u; magic_editable + 11 7 scrollende Eingabefelder; magic/magic.u; magic_scroll + 11 8 Spezielle Fehlermeldungen von MagiC; magic/magicerr.u; magic_errors + 11 8 1 Fataler Fehler beim Booten; magic/magicerr.u; magic_errors + 11 8 2 Fataler Fehler im Gemdos; magic/magicerr.u; magic_errors + 11 8 3 Kein interner Speicher mehr; magic/magicerr.u; magic_errors + 11 8 4 Speicherblock zerstört; magic/magicerr.u; magic_errors + 11 8 5 Fataler Fehler im AES; magic/magicerr.u; magic_errors + 11 8 6 Überlauf des Systemstapels; magic/magicerr.u; magic_errors + 11 9 Der Hintergrund-DMA von MagiC; magic/magic.u; magic_dma + 11 10 Das Iconify in MagiC; magic/magic.u; magic_iconify + 11 11 Das Laufwerk U: in MagiC; magic/magic.u; magic_driveu + 11 11 1 Das Verzeichnis U:\DEV; magic/magic.u; magic_driveu + 11 11 2 Das Verzeichnis U:\PIPE; magic/magic.u; magic_driveu + 11 11 3 Das Verzeichnis U:\PROC; magic/magic.u; magic_driveu + 11 11 4 Das Verzeichnis U:\SHM; magic/magic.u; magic_driveu + 11 12 Der Aufbau der MAGX.INF-Datei; magic/magicinf.u; magic_magxinf + 11 12 1 Beispiel einer MAGX.INF-Datei; magic/magicinf.u; magic_magxinf + 11 13 Semaphoren in MagiC; magic/magic.u; magic_semaphore + 11 14 Allgemeines zum Shutdown; magic/shutdown/shutdown_de.ui; magic_shutdown + 11 14 1 Shutdown in MultiTOS; magic/shutdown/shutdown_de.ui; magic_shutdown + 11 14 2 Shutdown in MagiC; magic/shutdown/shutdown_de.ui; magic_shutdown + 11 14 3 Der Shutdown aus Sicht der Applikation; magic/shutdown/shutdown_de.ui; magic_shutdown + 11 14 4 Der Shutdown aus Sicht des Initiators; magic/shutdown/shutdown_de.ui; magic_shutdown + 11 15 Der Smart-Redraw in MagiC; magic/magic.u; magic_smartredraw + 11 16 Der Task-Manager in MagiC; magic/magic.u; magic_taskmanager + 11 17 Test auf MagiC; magic/magic.u; magic_test + 11 18 Threads in MagiC; magic/threads/threads.u; magic_threads + 11 18 1 Threads und Signale; magic/threads/threads.u; magic_threads + 11 18 2 Threads und AES-Aufrufe; magic/threads/threads.u; magic_threads + 11 18 3 Threads und VDI-Aufrufe; magic/threads/vdi.u; magic_threads + 11 18 4 Verteilung der Resourcen bei Threads; magic/threads/threads.u; magic_threads + 11 18 5 Threads, Beispiel-Code zu; magic/threads/example.ui; magic_threads + 11 19 Die Zusatzprogramme für MagiC; magic/magic.u; magic_programs + 11 20 Das DFS-Konzept von MagiC; magic/DFS/dfs_de.ui; magic_dfs + 11 20 1 Der Aufbau eines DFS; magic/DFS/dfs_de.ui; magic_dfs + 11 20 1 1 dfs_dfree; magic/DFS/dfs_de.ui; magic_dfs + 11 20 1 2 dfs_dir2FD; magic/DFS/dfs_de.ui; magic_dfs + 11 20 1 3 dfs_dir2index; magic/DFS/dfs_de.ui; magic_dfs + 11 20 1 4 dfs_drv_close; magic/DFS/dfs_de.ui; magic_dfs + 11 20 1 5 dfs_drv_open; magic/DFS/dfs_de.ui; magic_dfs + 11 20 1 6 dfs_ext_fd; magic/DFS/dfs_de.ui; magic_dfs + 11 20 1 7 dfs_fcreate; magic/DFS/dfs_de.ui; magic_dfs + 11 20 1 8 dfs_fdelete; magic/DFS/dfs_de.ui; magic_dfs + 11 20 1 9 dfs_fxattr; magic/DFS/dfs_de.ui; magic_dfs + 11 20 1 10 dfs_init; magic/DFS/dfs_de.ui; magic_dfs + 11 20 1 11 dfs_name; magic/DFS/dfs_de.ui; magic_dfs + 11 20 1 12 dfs_next; magic/DFS/dfs_de.ui; magic_dfs + 11 20 1 13 dfs_pathconf; magic/DFS/dfs_de.ui; magic_dfs + 11 20 1 14 dfs_readlink; magic/DFS/dfs_de.ui; magic_dfs + 11 20 1 15 dfs_sfirst; magic/DFS/dfs_de.ui; magic_dfs + 11 20 1 16 dfs_snext; magic/DFS/dfs_de.ui; magic_dfs + 11 20 1 17 dfs_sync; magic/DFS/dfs_de.ui; magic_dfs + 11 20 2 Datenstrukturen für ein DFS; magic/DFS/dfs_de.ui; magic_dfs + 11 20 2 1 Der Verzeichniseintrag (DIR); magic/DFS/dfs_de.ui; magic_dfs + 11 20 2 2 Der Gerätetreiber (MX_DDEV); magic/DFS/dfs_de.ui; magic_dfs + 11 20 2 2 1 ddev_open; magic/DFS/dfs_de.ui; magic_dfs + 11 20 2 2 2 ddev_close; magic/DFS/dfs_de.ui; magic_dfs + 11 20 2 2 3 ddev_read; magic/DFS/dfs_de.ui; magic_dfs + 11 20 2 2 4 ddev_write; magic/DFS/dfs_de.ui; magic_dfs + 11 20 2 2 5 ddev_stat; magic/DFS/dfs_de.ui; magic_dfs + 11 20 2 2 6 ddev_seek; magic/DFS/dfs_de.ui; magic_dfs + 11 20 2 2 7 ddev_datime; magic/DFS/dfs_de.ui; magic_dfs + 11 20 2 2 8 ddev_ioctl; magic/DFS/dfs_de.ui; magic_dfs + 11 20 2 2 9 ddev_delete; magic/DFS/dfs_de.ui; magic_dfs + 11 20 2 2 10 ddev_getc; magic/DFS/dfs_de.ui; magic_dfs + 11 20 2 2 11 ddev_getline; magic/DFS/dfs_de.ui; magic_dfs + 11 20 2 2 12 ddev_putc; magic/DFS/dfs_de.ui; magic_dfs + 11 20 2 3 Die Disk-Transfer-Area (DTA); magic/DFS/dfs_de.ui; magic_dfs + 11 20 3 Installation eines DFS; magic/DFS/dfs_de.ui; magic_dfs + 11 21 Das XFS-Konzept von MagiC; magic/XFS/xfs_de.ui; magic_xfs + 11 21 1 Allgemeines zum XFS-Konzept von MagiC; magic/XFS/xfs_de.ui; magic_xfs + 11 21 2 Der Aufbau eines XFS; magic/XFS/xfs_de.ui; magic_xfs + 11 21 2 1 xfs_attrib; magic/XFS/xfs_de.ui; magic_xfs + 11 21 2 2 xfs_chmod; magic/XFS/xfs_de.ui; magic_xfs + 11 21 2 3 xfs_chown; magic/XFS/xfs_de.ui; magic_xfs + 11 21 2 4 xfs_dclosedir; magic/XFS/xfs_de.ui; magic_xfs + 11 21 2 5 xfs_dcntl; magic/XFS/xfs_de.ui; magic_xfs + 11 21 2 6 xfs_dcreate; magic/XFS/xfs_de.ui; magic_xfs + 11 21 2 7 xfs_ddelete; magic/XFS/xfs_de.ui; magic_xfs + 11 21 2 8 xfs_dfree; magic/XFS/xfs_de.ui; magic_xfs + 11 21 2 9 xfs_DD2name; magic/XFS/xfs_de.ui; magic_xfs + 11 21 2 10 xfs_dopendir; magic/XFS/xfs_de.ui; magic_xfs + 11 21 2 11 xfs_dpathconf; magic/XFS/xfs_de.ui; magic_xfs + 11 21 2 12 xfs_dreaddir; magic/XFS/xfs_de.ui; magic_xfs + 11 21 2 13 xfs_drewinddir; magic/XFS/xfs_de.ui; magic_xfs + 11 21 2 14 xfs_drv_close; magic/XFS/xfs_de.ui; magic_xfs + 11 21 2 15 xfs_drv_open; magic/XFS/xfs_de.ui; magic_xfs + 11 21 2 16 xfs_fdelete; magic/XFS/xfs_de.ui; magic_xfs + 11 21 2 17 xfs_flags; magic/XFS/xfs_de.ui; magic_xfs + 11 21 2 18 xfs_fopen; magic/XFS/xfs_de.ui; magic_xfs + 11 21 2 19 xfs_freeDD; magic/XFS/xfs_de.ui; magic_xfs + 11 21 2 20 xfs_garbcoll; magic/XFS/xfs_de.ui; magic_xfs + 11 21 2 21 xfs_init; magic/XFS/xfs_de.ui; magic_xfs + 11 21 2 22 xfs_link; magic/XFS/xfs_de.ui; magic_xfs + 11 21 2 23 xfs_name; magic/XFS/xfs_de.ui; magic_xfs + 11 21 2 24 xfs_next; magic/XFS/xfs_de.ui; magic_xfs + 11 21 2 25 xfs_path2DD; magic/XFS/xfs_de.ui; magic_xfs + 11 21 2 26 xfs_pterm; magic/XFS/xfs_de.ui; magic_xfs + 11 21 2 27 xfs_readlink; magic/XFS/xfs_de.ui; magic_xfs + 11 21 2 28 xfs_rlabel; magic/XFS/xfs_de.ui; magic_xfs + 11 21 2 29 xfs_sfirst; magic/XFS/xfs_de.ui; magic_xfs + 11 21 2 30 xfs_snext; magic/XFS/xfs_de.ui; magic_xfs + 11 21 2 31 xfs_symlink; magic/XFS/xfs_de.ui; magic_xfs + 11 21 2 32 xfs_sync; magic/XFS/xfs_de.ui; magic_xfs + 11 21 2 33 xfs_wlabel; magic/XFS/xfs_de.ui; magic_xfs + 11 21 2 34 xfs_xattr; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 Datenstrukturen für ein XFS; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 1 Der Verzeichnis-Deskriptor (DD); magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 1 1 dd_dmd; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 1 2 dd_refcnt; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 2 Der Directory-Handle-Deskriptor (DHD); magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 2 1 dhd_dmd; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 3 Der Drive-Medium-Deskriptor (DMD); magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 3 1 d_xfs; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 3 2 d_drive; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 3 3 d_root; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 3 4 d_biosdev; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 3 5 d_driver; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 3 6 d_devcode; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 3 7 d_dfs; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 4 Die Disk-Transfer-Area DTA; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 4 1 xfs_dta_res1; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 4 2 xfs_dta_drive; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 5 Der Datei-Deskriptor (FD); magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 5 1 fd_dmd; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 5 2 fd_refcnt; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 5 3 fd_mode; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 5 4 fd_dev; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 5 5 fd_ddev; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 5 6 fd_name; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 5 7 fd_attr; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 5 8 fd_owner; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 5 9 fd_parent; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 5 10 fd_children; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 5 11 fd_next; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 5 12 fd_multi; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 5 13 fd_multi1; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 5 14 fd_fpos; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 5 15 fd_dirch; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 5 16 fd_unused; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 5 17 fd_time; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 5 18 fd_date; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 5 19 fd_stcl; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 5 20 fd_len; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 5 21 fd_dirpos; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 5 22 fd_user1; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 5 23 fd_user2; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 6 Der Gerätetreiber (MX_DEV); magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 6 1 dev_close; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 6 2 dev_datime; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 6 3 dev_getc; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 6 4 dev_getline; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 6 5 dev_ioctl; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 6 6 dev_putc; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 6 7 dev_read; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 6 8 dev_seek; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 6 9 dev_stat; magic/XFS/xfs_de.ui; magic_xfs + 11 21 3 6 10 dev_write; magic/XFS/xfs_de.ui; magic_xfs + 11 21 4 Installation eines XFS; magic/XFS/xfs_de.ui; magic_xfs + 11 21 5 Kernelfunktionen für ein XFS; magic/XFS/xfs_de.ui; magic_xfs + 11 21 5 1 mxk_version; magic/XFS/xfs_de.ui; magic_xfs + 11 21 5 2 mxk_fast_clrmem; magic/XFS/xfs_de.ui; magic_xfs + 11 21 5 3 mxk_toupper; magic/XFS/xfs_de.ui; magic_xfs + 11 21 5 4 mxk__sprintf; magic/XFS/xfs_de.ui; magic_xfs + 11 21 5 5 mxk_act_pd; magic/XFS/xfs_de.ui; magic_xfs + 11 21 5 6 mxk_act_appl; magic/XFS/xfs_de.ui; magic_xfs + 11 21 5 7 mxk_keyb_app; magic/XFS/xfs_de.ui; magic_xfs + 11 21 5 8 mxk_pe_slice; magic/XFS/xfs_de.ui; magic_xfs + 11 21 5 9 mxk_pe_timer; magic/XFS/xfs_de.ui; magic_xfs + 11 21 5 10 mxk_appl_yield; magic/XFS/xfs_de.ui; magic_xfs + 11 21 5 11 mxk_appl_suspend; magic/XFS/xfs_de.ui; magic_xfs + 11 21 5 12 mxk_appl_begcritic; magic/XFS/xfs_de.ui; magic_xfs + 11 21 5 13 mxk_appl_endcritic; magic/XFS/xfs_de.ui; magic_xfs + 11 21 5 14 mxk_evnt_IO; magic/XFS/xfs_de.ui; magic_xfs + 11 21 5 15 mxk_evnt_mIO; magic/XFS/xfs_de.ui; magic_xfs + 11 21 5 16 mxk_appl_IOcomplete; magic/XFS/xfs_de.ui; magic_xfs + 11 21 5 17 mxk_evnt_sem; magic/XFS/xfs_de.ui; magic_xfs + 11 21 5 18 SEM_FREE; magic/XFS/xfs_de.ui; magic_xfs + 11 21 5 19 SEM_SET; magic/XFS/xfs_de.ui; magic_xfs + 11 21 5 20 SEM_TEST; magic/XFS/xfs_de.ui; magic_xfs + 11 21 5 21 SEM_CSET; magic/XFS/xfs_de.ui; magic_xfs + 11 21 5 22 SEM_GET; magic/XFS/xfs_de.ui; magic_xfs + 11 21 5 23 SEM_CREATE; magic/XFS/xfs_de.ui; magic_xfs + 11 21 5 24 SEM_DEL; magic/XFS/xfs_de.ui; magic_xfs + 11 21 5 25 mxk_Pfree; magic/XFS/xfs_de.ui; magic_xfs + 11 21 5 26 mxk_int_msize; magic/XFS/xfs_de.ui; magic_xfs + 11 21 5 27 mxk_int_malloc; magic/XFS/xfs_de.ui; magic_xfs + 11 21 5 28 mxk_int_mfree; magic/XFS/xfs_de.ui; magic_xfs + 11 21 5 29 mxk_resv_intmem; magic/XFS/xfs_de.ui; magic_xfs + 11 21 5 30 mxk_diskchange; magic/XFS/xfs_de.ui; magic_xfs + 11 21 5 31 mxk_DMD_rdevinit; magic/XFS/xfs_de.ui; magic_xfs + 11 21 5 32 mxk_proc_info; magic/XFS/xfs_de.ui; magic_xfs + 11 21 5 33 mxk_mxalloc; magic/XFS/xfs_de.ui; magic_xfs + 11 21 5 34 mxk_mfree; magic/XFS/xfs_de.ui; magic_xfs + 11 21 5 35 mshrink; magic/XFS/xfs_de.ui; magic_xfs + 11 21 6 Symbolische Links und das XFS-Konzept; magic/XFS/xfs_de.ui; magic_xfs + 11 21 7 MX_DOSLIMITS; magic/XFS/xfs_de.ui; magic_xfs + 11 21 8 XFS-Strukturen; magic/XFS/xfs_de.ui; magic_xfs + 11 21 8 1 dev_descr; magic/XFS/xfs_de.ui; magic_xfs + 11 21 8 2 DEVDRV; magic/XFS/xfs_de.ui; magic_xfs + 11 21 8 3 FILESYS; magic/XFS/xfs_de.ui; magic_xfs + 11 21 8 4 fs_descr; magic/XFS/xfs_de.ui; magic_xfs + 11 22 VFAT-XFS in MagiC; magic/magic.u; magic_vfat + 11 23 Shared Libraries; magic/sharelib.u; magic_sharelib + 11 23 1 Was sind Shared Libraries?; magic/sharelib.u; magic_sharelib + 11 23 2 Wozu Shared Libraries?; magic/sharelib.u; magic_sharelib + 11 23 3 Wie verwende ich eine Shared Libraries?; magic/sharelib.u; magic_sharelib + 11 23 4 Wie schreibe ich eine Shared Libraries?; magic/sharelib.u; magic_sharelib + 11 23 5 SLB_DEMO.C; magic/sharelib.u; magic_sharelib + 11 23 6 LIBHEAD.S; magic/sharelib.u; magic_sharelib + 11 23 7 SLB_DEMO.PRJ; magic/sharelib.u; magic_sharelib + 11 23 8 PH_BIT3.TTP; magic/sharelib.u; magic_sharelib + 11 23 9 SLB_BIND; magic/sharelib.u; magic_sharelib + 11 23 10 SLB.H; magic/sharelib.u; magic_sharelib + 12 N.AES; /home/runner/work/tos.hyp/tos.hyp/tos_hyp.u; n_aes + 12 1 form_error in N.AES; n_aes/n_aes.u; naes_formerror + 12 2 Der N.AES-Cookie; n_aes/n_aes.u; naes_cookie + 12 3 Die N.AES-Konfigurationsdatei; n_aes/n_aes.u; naes_cnf + 13 XaAES; /home/runner/work/tos.hyp/tos.hyp/tos_hyp.u; xaaes + 13 1 Toolbar-Support unter XaAES; xaaes/xaaes.u; xaaes_toolbar + 13 2 Veraltete XaAES-Funktionen; xaaes/function/function.u; xaaes_functions + 13 2 1 appl_pipe; xaaes/function/appl_pipe.ui; xaaes_functions + 13 2 1 1 Bindings für appl_pipe; xaaes/function/appl_pipe.ui; xaaes_functions + 13 2 2 client_exit; xaaes/function/client_exit.ui; xaaes_functions + 13 2 2 1 Bindings für client_exit; xaaes/function/client_exit.ui; xaaes_functions + 13 2 3 new_client; xaaes/function/new_client.ui; xaaes_functions + 13 2 3 1 Bindings für new_client; xaaes/function/new_client.ui; xaaes_functions + 13 2 4 rregen; xaaes/function/rregen.ui; xaaes_functions + 13 2 4 1 Bindings für rregen; xaaes/function/rregen.ui; xaaes_functions + 13 2 5 wredraw; xaaes/function/wredraw.ui; xaaes_functions + 13 2 5 1 Bindings für wredraw; xaaes/function/wredraw.ui; xaaes_functions + 14 Emulatoren; /home/runner/work/tos.hyp/tos.hyp/tos_hyp.u; emulators + 14 1 MagiC Mac-Spezifika; magic/MagiC_Mac/magicmac_de.ui; emulators_magicmac + 14 1 1 Allgemeines zu MagiC Mac; magic/MagiC_Mac/magicmac_de.ui; emulators_magicmac + 14 1 2 MagiC Mac und Power-Macs; magic/MagiC_Mac/magicmac_de.ui; emulators_magicmac + 14 1 3 Cookies unter MagiC Mac; magic/MagiC_Mac/magicmac_de.ui; emulators_magicmac + 14 1 4 Dateisysteme unter MagiC Mac; magic/MagiC_Mac/magicmac_de.ui; emulators_magicmac + 14 1 5 Einschränkungen von MagiC Mac; magic/MagiC_Mac/magicmac_de.ui; emulators_magicmac + 14 1 6 Exceptions unter MagiC Mac; magic/MagiC_Mac/magicmac_de.ui; emulators_magicmac + 14 1 7 Sauberes Programmieren; magic/MagiC_Mac/magicmac_de.ui; emulators_magicmac + 14 1 8 Der Shutdown in MagiC Mac; magic/MagiC_Mac/magicmac_de.ui; emulators_magicmac + 14 1 9 XCMDs unter MagiC Mac; magic/MagiC_Mac/magicmac_de.ui; emulators_magicmac + 14 1 10 Die Zusammenarbeit von MagiC und MacOS; magic/MagiC_Mac/magicmac_de.ui; emulators_magicmac + 14 1 11 Der Cookie von MagiC Mac; magic/MagiC_Mac/magicmac_de.ui; emulators_magicmac + 14 1 11 1 MagiC Mac-Typvereinbarungen; magic/MagiC_Mac/magicmac_de.ui; emulators_magicmac + 14 1 11 2 mmc_flg1_bit4; magic/MagiC_Mac/magicmac_de.ui; emulators_magicmac + 14 1 11 3 mmc_flg1_bit5; magic/MagiC_Mac/magicmac_de.ui; emulators_magicmac + 14 1 11 4 auxControl; magic/MagiC_Mac/magicmac_de.ui; emulators_magicmac + 14 1 11 5 callMacContext; magic/MagiC_Mac/magicmac_de.ui; emulators_magicmac + 14 1 11 6 configKernel; magic/MagiC_Mac/magicmac_de.ui; emulators_magicmac + 14 1 11 7 controlSwitch; magic/MagiC_Mac/magicmac_de.ui; emulators_magicmac + 14 1 11 8 getBaseMode; magic/MagiC_Mac/magicmac_de.ui; emulators_magicmac + 14 1 11 9 intrLock; magic/MagiC_Mac/magicmac_de.ui; emulators_magicmac + 14 1 11 10 macAppSwitch; magic/MagiC_Mac/magicmac_de.ui; emulators_magicmac + 14 1 11 11 atariModePossible; magic/MagiC_Mac/magicmac_de.ui; emulators_magicmac + 14 1 11 12 modeAtari; magic/MagiC_Mac/magicmac_de.ui; emulators_magicmac + 14 1 11 13 modeMac; magic/MagiC_Mac/magicmac_de.ui; emulators_magicmac + 14 1 11 14 versionOfMacAppl; magic/MagiC_Mac/magicmac_de.ui; emulators_magicmac + 14 1 11 15 giveTimeToMac; magic/MagiC_Mac/magicmac_de.ui; emulators_magicmac + 14 1 11 16 minStackSize; magic/MagiC_Mac/magicmac_de.ui; emulators_magicmac + 14 1 11 17 ext; magic/MagiC_Mac/magicmac_de.ui; emulators_magicmac + 14 1 11 18 extMac; magic/MagiC_Mac/magicmac_de.ui; emulators_magicmac + 14 1 11 19 stackLoad; magic/MagiC_Mac/magicmac_de.ui; emulators_magicmac + 14 1 11 20 stackUnload; magic/MagiC_Mac/magicmac_de.ui; emulators_magicmac + 14 2 MagiC PC-Schnittstelle; magic/MagiC_PC/magicpc_de.ui; emulators_magicpc + 14 2 1 mec0 (MPS) Schnittstelle; magic/MagiC_PC/magicpc_de.ui; emulators_magicpc + 14 2 1 1 mps_base.def; magic/MagiC_PC/magicpc_de.ui; emulators_magicpc + 14 2 1 2 mps_base.h; magic/MagiC_PC/magicpc_de.ui; emulators_magicpc + 14 2 1 3 mps_base.cpp; magic/MagiC_PC/magicpc_de.ui; emulators_magicpc + 14 2 1 4 mps_demo.h; magic/MagiC_PC/magicpc_de.ui; emulators_magicpc + 14 2 1 5 mps_demo.cpp; magic/MagiC_PC/magicpc_de.ui; emulators_magicpc + 14 2 1 6 testmps.s; magic/MagiC_PC/magicpc_de.ui; emulators_magicpc + 14 2 2 mec1 Schnittstelle; magic/MagiC_PC/magicpc_de.ui; emulators_magicpc + 14 2 3 mec2 Schnittstelle; magic/MagiC_PC/magicpc_de.ui; emulators_magicpc + 14 2 4 mec3 Schnittstelle; magic/MagiC_PC/magicpc_de.ui; emulators_magicpc + 14 2 5 mecnvdi Schnittstelle; magic/MagiC_PC/magicpc_de.ui; emulators_magicpc + 14 3 STEmulator; emulator.en/stem.u; emulators_stem + 14 4 TOS2WIN; emulator.en/tos2win.u; emulators_tos2win + 14 5 Detecting the presence of TosBox, Steem and PaCifiST; emulator.en/sonstige.u; emulators_others + 15 Protokolle; /home/runner/work/tos.hyp/tos.hyp/tos_hyp.u; protocols + 15 1 AV-Protokoll; protokol/AV/av_de.ui; proto_av + 15 1 1 Quoting im AV-Protokoll; protokol/AV/av_de.ui; proto_av + 15 1 2 AV-Funktionen; protokol/AV/av_de.ui; proto_av + 15 1 2 1 AV_ACCWINDCLOSED; protokol/AV/av_de.ui; proto_av + 15 1 2 2 AV_ACCWINDOPEN; protokol/AV/av_de.ui; proto_av + 15 1 2 3 AV_ASKCONFONT; protokol/AV/av_de.ui; proto_av + 15 1 2 4 AV_ASKFILEFONT; protokol/AV/av_de.ui; proto_av + 15 1 2 5 AV_ASKOBJECT; protokol/AV/av_de.ui; proto_av + 15 1 2 6 AV_COPY_DRAGGED; protokol/AV/av_de.ui; proto_av + 15 1 2 7 AV_COPYFILE; protokol/AV/av_de.ui; proto_av + 15 1 2 8 AV_DELFILE; protokol/AV/av_de.ui; proto_av + 15 1 2 9 AV_DRAG_ON_WINDOW; protokol/AV/av_de.ui; proto_av + 15 1 2 10 AV_EXIT; protokol/AV/av_de.ui; proto_av + 15 1 2 11 AV_FILEINFO; protokol/AV/av_de.ui; proto_av + 15 1 2 12 AV_GETSTATUS; protokol/AV/av_de.ui; proto_av + 15 1 2 13 AV_OPENCONSOLE; protokol/AV/av_de.ui; proto_av + 15 1 2 14 AV_OPENWIND; protokol/AV/av_de.ui; proto_av + 15 1 2 15 AV_PATH_UPDATE; protokol/AV/av_de.ui; proto_av + 15 1 2 16 AV_PROTOKOLL; protokol/AV/av_de.ui; proto_av + 15 1 2 17 AV_SENDCLICK; protokol/AV/av_de.ui; proto_av + 15 1 2 18 AV_SENDKEY; protokol/AV/av_de.ui; proto_av + 15 1 2 19 AV_SETWINDPOS; protokol/AV/av_de.ui; proto_av + 15 1 2 20 AV_STARTED; protokol/AV/av_de.ui; proto_av + 15 1 2 21 AV_STARTPROG; protokol/AV/av_de.ui; proto_av + 15 1 2 22 AV_STATUS; protokol/AV/av_de.ui; proto_av + 15 1 2 23 AV_VIEW; protokol/AV/av_de.ui; proto_av + 15 1 2 24 AV_WHAT_IZIT; protokol/AV/av_de.ui; proto_av + 15 1 2 25 AV_XWIND; protokol/AV/av_de.ui; proto_av + 15 1 3 VA-Funktionen; protokol/AV/av_de.ui; proto_av + 15 1 3 1 VA_ACC_QUOTING(a); protokol/AV/av_de.ui; proto_av + 15 1 3 2 VA_CONFONT; protokol/AV/av_de.ui; proto_av + 15 1 3 3 VA_CONSOLEOPEN; protokol/AV/av_de.ui; proto_av + 15 1 3 4 VA_COPY_COMPLETE; protokol/AV/av_de.ui; proto_av + 15 1 3 5 VA_DRAGACCWIND; protokol/AV/av_de.ui; proto_av + 15 1 3 6 VA_DRAG_COMPLETE; protokol/AV/av_de.ui; proto_av + 15 1 3 7 VA_FILECHANGED; protokol/AV/av_de.ui; proto_av + 15 1 3 8 VA_FILECOPIED; protokol/AV/av_de.ui; proto_av + 15 1 3 9 VA_FILEDELETED; protokol/AV/av_de.ui; proto_av + 15 1 3 10 VA_FILEFONT; protokol/AV/av_de.ui; proto_av + 15 1 3 11 VA_FONTCHANGED; protokol/AV/av_de.ui; proto_av + 15 1 3 12 VA_OBJECT; protokol/AV/av_de.ui; proto_av + 15 1 3 13 VA_PATH_UPDATE; protokol/AV/av_de.ui; proto_av + 15 1 3 14 VA_PROGSTART; protokol/AV/av_de.ui; proto_av + 15 1 3 15 VA_PROTOSTATUS; protokol/AV/av_de.ui; proto_av + 15 1 3 16 VA_SERVER_QUOTING(a); protokol/AV/av_de.ui; proto_av + 15 1 3 17 VA_SETSTATUS; protokol/AV/av_de.ui; proto_av + 15 1 3 18 VA_START; protokol/AV/av_de.ui; proto_av + 15 1 3 19 VA_THAT_IZIT; protokol/AV/av_de.ui; proto_av + 15 1 3 20 VA_VIEWED; protokol/AV/av_de.ui; proto_av + 15 1 3 21 VA_WINDOPEN; protokol/AV/av_de.ui; proto_av + 15 1 3 22 VA_XOPEN; protokol/AV/av_de.ui; proto_av + 15 2 BubbleGEM; protokol/BubbleGEM/bubble_de.ui; proto_bubblegem + 15 2 1 Aufruf von BubbleGEM; protokol/BubbleGEM/bubble_de.ui; proto_bubblegem + 15 2 2 Aufrufroutine; protokol/BubbleGEM/bubble_de.ui; proto_bubblegem + 15 2 3 Zeitgesteuerter Aufruf; protokol/BubbleGEM/bubble_de.ui; proto_bubblegem + 15 2 4 BubbleGEM-Cookies; protokol/BubbleGEM/bubble_de.ui; proto_bubblegem + 15 2 5 BubbleGEM-Environmentvariable; protokol/BubbleGEM/bubble_de.ui; proto_bubblegem + 15 2 6 Schriftauswahl; protokol/BubbleGEM/bubble_de.ui; proto_bubblegem + 15 2 7 AV_SENDCLICK, BubbleGEM; protokol/BubbleGEM/bubble_de.ui; proto_bubblegem + 15 3 Drag&Drop-Protokoll; protokol/dd.u; proto_dd + 15 3 1 D&D-Listing_1; protokol/dd.u; proto_dd + 15 3 2 Drag&Drop, Datentypen für; protokol/dd.u; proto_dd + 15 3 3 Drag&Drop, Status Bytes für; protokol/dd.u; proto_dd + 15 4 Document-History-Protokoll; protokol/dhst.u; proto_dhst + 15 5 Font-Protokoll; protokol/font.u; proto_font + 15 6 GDPS: Gerti's Driver Piping System; protokol/gdps.ui; proto_gdps + 15 6 1 Allgemeine Beschreibung; protokol/gdps.ui; proto_gdps + 15 6 2 Definition der Treiberverkettung; protokol/gdps.ui; proto_gdps + 15 6 3 Datenstruktur; protokol/gdps.ui; proto_gdps + 15 6 4 Treibertypen; protokol/gdps.ui; proto_gdps + 15 6 4 1 Treibergruppe Scanner; protokol/gdps.ui; proto_gdps + 15 6 4 2 GDPS, virtuelle Speicherverwaltung; protokol/gdps.ui; proto_gdps + 15 7 LTL-Protokoll; protokol/ltlproto.u; proto_ltl + 15 7 1 Der OBNL-Cookie; protokol/ltlproto.u; proto_ltl + 15 7 2 Die OBNCOMM-Struktur; protokol/ltlproto.u; proto_ltl + 15 7 3 Nachrichten der Shell an den Loader; protokol/ltlproto.u; proto_ltl + 15 7 3 1 CL_INIT; protokol/ltlproto.u; proto_ltl + 15 7 3 2 CL_COMMAND; protokol/ltlproto.u; proto_ltl + 15 7 3 3 CL_TIME; protokol/ltlproto.u; proto_ltl + 15 7 4 Nachrichten des Loaders an die Shell; protokol/ltlproto.u; proto_ltl + 15 7 4 1 LC_WRCHAR; protokol/ltlproto.u; proto_ltl + 15 7 4 2 LC_WRSTR; protokol/ltlproto.u; proto_ltl + 15 7 4 3 LC_OUTBUF; protokol/ltlproto.u; proto_ltl + 15 7 4 4 LC_CLOSEWIN; protokol/ltlproto.u; proto_ltl + 15 7 4 5 LC_OPENWIN; protokol/ltlproto.u; proto_ltl + 15 7 5 Beispiel: Chatwin und STJ-Oberon-2; protokol/ltlproto.u; proto_ltl + 15 8 OLGA-Protokoll; protokol/olga/olga_de.ui; proto_olga + 15 8 1 OLGA-Initialisierung; protokol/olga/olga_de.ui; proto_olga + 15 8 2 OLGA-Client; protokol/olga/olga_de.ui; proto_olga + 15 8 3 OLGA-Server; protokol/olga/olga_de.ui; proto_olga + 15 8 4 OLGA_BREAKLINK; protokol/olga/olga_de.ui; proto_olga + 15 8 4 1 OLGA_BREAKLINK, Antwort auf; protokol/olga/olga_de.ui; proto_olga + 15 8 5 OLGA_INFO; protokol/olga/olga_de.ui; proto_olga + 15 8 5 1 OLGA_INFO, Antwort auf; protokol/olga/olga_de.ui; proto_olga + 15 8 6 OLGA_RENAME; protokol/olga/olga_de.ui; proto_olga + 15 8 6 1 OLGA_RENAME, Antwort auf; protokol/olga/olga_de.ui; proto_olga + 15 8 7 OLGA_UPDATE; protokol/olga/olga_de.ui; proto_olga + 15 8 7 1 OLGA_UPDATE, Antwort auf; protokol/olga/olga_de.ui; proto_olga + 15 8 8 OLGA_CLOSEDOC; protokol/olga/olga_de.ui; proto_olga + 15 8 8 1 OLGA_CLOSEDOC, Antwort auf; protokol/olga/olga_de.ui; proto_olga + 15 8 9 OLGA_GETINFO; protokol/olga/olga_de.ui; proto_olga + 15 8 10 OLGA_LINK; protokol/olga/olga_de.ui; proto_olga + 15 8 10 1 OLGA_LINK, Antwort auf; protokol/olga/olga_de.ui; proto_olga + 15 8 11 OLGA_LINKBROKEN; protokol/olga/olga_de.ui; proto_olga + 15 8 12 OLGA_LINKRENAMED; protokol/olga/olga_de.ui; proto_olga + 15 8 13 OLGA_OPENDOC; protokol/olga/olga_de.ui; proto_olga + 15 8 14 OLGA_RENAMELINK; protokol/olga/olga_de.ui; proto_olga + 15 8 15 OLGA_START; protokol/olga/olga_de.ui; proto_olga + 15 8 15 1 OLGA_START, Antwort auf; protokol/olga/olga_de.ui; proto_olga + 15 8 15 2 OLGA_START, Antwort2 auf; protokol/olga/olga_de.ui; proto_olga + 15 8 15 3 OLS_TYPE; protokol/olga/olga_de.ui; proto_olga + 15 8 15 4 OLS_EXTENSION; protokol/olga/olga_de.ui; proto_olga + 15 8 15 5 OLS_NAME; protokol/olga/olga_de.ui; proto_olga + 15 8 16 OLGA_UPDATED; protokol/olga/olga_de.ui; proto_olga + 15 8 17 OLGA_UNLINK; protokol/olga/olga_de.ui; proto_olga + 15 8 17 1 OLGA_UNLINK, Antwort auf; protokol/olga/olga_de.ui; proto_olga + 15 8 18 Server minimal; protokol/olga/olga_de.ui; proto_olga + 15 8 19 Client minimal; protokol/olga/olga_de.ui; proto_olga + 15 8 20 OLE_EXIT; protokol/olga/olga_de.ui; proto_olga + 15 8 21 OLE_INIT; protokol/olga/olga_de.ui; proto_olga + 15 8 22 OLE_NEW; protokol/olga/olga_de.ui; proto_olga + 15 8 23 OLGA_INIT; protokol/olga/olga_de.ui; proto_olga + 15 8 24 OLGA-Info-Dateiformat; protokol/olga/olga_de.ui; proto_olga + 15 8 25 OLGAInfHeader; protokol/olga/olga_de.ui; proto_olga + 15 8 26 OLGABlockHeader; protokol/olga/olga_de.ui; proto_olga + 15 8 27 Much, Thomas; protokol/olga/olga_de.ui; proto_olga + 15 8 28 OL_SERVER; protokol/olga/olga_de.ui; proto_olga + 15 8 29 OL_CLIENT; protokol/olga/olga_de.ui; proto_olga + 15 8 30 OL_PEER; protokol/olga/olga_de.ui; proto_olga + 15 8 31 OL_PIPES; protokol/olga/olga_de.ui; proto_olga + 15 8 32 OL_START; protokol/olga/olga_de.ui; proto_olga + 15 8 33 OL_MANAGER; protokol/olga/olga_de.ui; proto_olga + 15 8 34 OL_OEP; protokol/olga/olga_de.ui; proto_olga + 15 9 SE-Protokoll; protokol/seproto/seproto_de.ui; proto_seproto + 15 9 1 Kontaktaufnahme; protokol/seproto/seproto_de.ui; proto_seproto + 15 9 2 Anmerkungen; protokol/seproto/seproto_de.ui; proto_seproto + 15 9 3 Nachrichten der Shell an den Editor; protokol/seproto/seproto_de.ui; proto_seproto + 15 9 3 1 SE_INIT; protokol/seproto/seproto_de.ui; proto_seproto + 15 9 3 2 SE_OK; protokol/seproto/seproto_de.ui; proto_seproto + 15 9 3 3 SE_ACK; protokol/seproto/seproto_de.ui; proto_seproto + 15 9 3 4 SE_OPEN; protokol/seproto/seproto_de.ui; proto_seproto + 15 9 3 5 SE_ERROR; protokol/seproto/seproto_de.ui; proto_seproto + 15 9 3 6 SE_ERRFILE; protokol/seproto/seproto_de.ui; proto_seproto + 15 9 3 7 SE_PROJECT; protokol/seproto/seproto_de.ui; proto_seproto + 15 9 3 8 SE_QUIT; protokol/seproto/seproto_de.ui; proto_seproto + 15 9 3 9 SE_TERMINATE; protokol/seproto/seproto_de.ui; proto_seproto + 15 9 3 10 SE_CLOSE; protokol/seproto/seproto_de.ui; proto_seproto + 15 9 3 11 SE_MENU; protokol/seproto/seproto_de.ui; proto_seproto + 15 9 4 Nachrichten des Editors an die Shell; protokol/seproto/seproto_de.ui; proto_seproto + 15 9 4 1 ES_INIT; protokol/seproto/seproto_de.ui; proto_seproto + 15 9 4 2 ES_OK; protokol/seproto/seproto_de.ui; proto_seproto + 15 9 4 3 ES_ACK; protokol/seproto/seproto_de.ui; proto_seproto + 15 9 4 4 ES_COMPILE; protokol/seproto/seproto_de.ui; proto_seproto + 15 9 4 5 ES_MAKE; protokol/seproto/seproto_de.ui; proto_seproto + 15 9 4 6 ES_MAKEALL; protokol/seproto/seproto_de.ui; proto_seproto + 15 9 4 7 ES_LINK; protokol/seproto/seproto_de.ui; proto_seproto + 15 9 4 8 ES_EXEC; protokol/seproto/seproto_de.ui; proto_seproto + 15 9 4 9 ES_MAKEEXEC; protokol/seproto/seproto_de.ui; proto_seproto + 15 9 4 10 ES_PROJECT; protokol/seproto/seproto_de.ui; proto_seproto + 15 9 4 11 ES_QUIT; protokol/seproto/seproto_de.ui; proto_seproto + 15 9 4 12 ES_SHLCTRL; protokol/seproto/seproto_de.ui; proto_seproto + 15 9 5 History; protokol/seproto/seproto_de.ui; proto_seproto + 15 9 6 Autoren und Programme; protokol/seproto/seproto_de.ui; proto_seproto + 15 10 System Services Protocol (SSP); protokol/ssp/ssp.u; proto_ssp + 15 10 1 SSP changes; protokol/ssp/ssp.u; proto_ssp + 15 10 2 What is SSP?; protokol/ssp/ssp.u; proto_ssp + 15 10 3 SSP messages; protokol/ssp/ssp.u; proto_ssp + 15 10 4 Services; protokol/ssp/ssp.u; proto_ssp + 15 10 5 SSP Server registration; protokol/ssp/ssp.u; proto_ssp + 15 10 6 General Rules; protokol/ssp/ssp.u; proto_ssp + 15 10 7 Timeouts and error handling; protokol/ssp/ssp.u; proto_ssp + 15 10 8 SSP message pipeline; protokol/ssp/ssp.u; proto_ssp + 15 10 9 Defines (SSP); protokol/ssp/ssp.u; proto_ssp + 15 10 10 How to implement an SRA; protokol/ssp/ssp.u; proto_ssp + 15 10 11 How to implement an SPA; protokol/ssp/ssp.u; proto_ssp + 15 10 12 List of prospective SSP-implementing software to date; protokol/ssp/ssp.u; proto_ssp + 15 10 13 Glossary; protokol/ssp/ssp.u; proto_ssp + 15 11 View protocol; protokol/view.u; proto_view + 15 11 1 The purpose(s) of the View protocol; protokol/view.u; proto_view + 15 11 2 Using the View protocol; protokol/view.u; proto_view + 15 11 3 Implementing the View protocol; protokol/view.u; proto_view + 15 11 3 1 Who is the viewer?; protokol/view.u; proto_view + 15 11 3 2 What kinds of files can be displayed?; protokol/view.u; proto_view + 15 11 3 3 How can I tell the viewer what is to be shown?; protokol/view.u; proto_view + 15 11 3 4 What does the viewer do?; protokol/view.u; proto_view + 15 11 4 The VIEW_XXX messages; protokol/view.u; proto_view + 15 11 4 1 View a file; protokol/view.u; proto_view + 15 11 4 2 Further communication; protokol/view.u; proto_view + 15 11 4 3 View data from memory; protokol/view.u; proto_view + 15 11 5 The View protocol messages; protokol/view.u; proto_view + 15 12 Virtual-Screen-Protokoll; protokol/vscreen.u; proto_vscreen + 15 13 XAcc; protokol/xacc/xacc_de.ui; proto_xacc + 15 13 1 Purpose of XAcc; protokol/xacc/xacc_de.ui; proto_xacc + 15 13 2 Classic XAcc; protokol/xacc/xacc_de.ui; proto_xacc + 15 13 2 1 XAcc message groups; protokol/xacc/xacc_de.ui; proto_xacc + 15 13 2 2 XAcc messages; protokol/xacc/xacc_de.ui; proto_xacc + 15 13 2 2 1 Basic XAcc messages; protokol/xacc/xacc_de.ui; proto_xacc + 15 13 2 2 1 1 Single-tasking GEM versions; protokol/xacc/xacc_de.ui; proto_xacc + 15 13 2 2 1 2 Multitasking GEM versions; protokol/xacc/xacc_de.ui; proto_xacc + 15 13 2 2 2 Extended names; protokol/xacc/xacc_de.ui; proto_xacc + 15 13 2 2 3 Message group 1; protokol/xacc/xacc_de.ui; proto_xacc + 15 13 2 2 4 Message group 2; protokol/xacc/xacc_de.ui; proto_xacc + 15 13 2 3 Compatibility considerations; protokol/xacc/xacc_de.ui; proto_xacc + 15 13 3 Extended XAcc; protokol/xacc/xacc_de.ui; proto_xacc + 15 13 3 1 MailMerge-Protokoll; protokol/xacc/xacc_de.ui; proto_xacc + 15 13 3 2 Remote-Mailmerge-Protokoll; protokol/xacc/xacc_de.ui; proto_xacc + 15 13 3 3 Inquiry-Protokoll; protokol/xacc/xacc_de.ui; proto_xacc + 15 13 3 4 Request/Reply-Protokoll; protokol/xacc/xacc_de.ui; proto_xacc + 15 13 4 Example: no|Link's XAcc protocol; protokol/xacc/xacc_de.ui; proto_xacc + 15 13 5 XACC.H; protokol/xacc/xacc_de.ui; proto_xacc + 15 14 xFSL-Schnittstelle; protokol/xfsl.u; proto_xfsl + 15 14 1 Die xFSL–Schnittstelle; protokol/xfsl.u; proto_xfsl + 15 14 1 1 Der xFSL–Cookie; protokol/xfsl.u; proto_xfsl + 15 14 1 2 Der vereinfachte Aufruf (xfsl_input); protokol/xfsl.u; proto_xfsl + 15 14 1 3 Der erweiterte Aufruf; protokol/xfsl.u; proto_xfsl + 15 14 1 3 1 xfsl_init; protokol/xfsl.u; proto_xfsl + 15 14 1 3 2 xfsl_event; protokol/xfsl.u; proto_xfsl + 15 14 1 3 3 xfsl_exit; protokol/xfsl.u; proto_xfsl + 15 14 1 3 4 Der Info–Aufruf (xfsl_info); protokol/xfsl.u; proto_xfsl + 15 14 1 3 5 Die VDI–Workstation; protokol/xfsl.u; proto_xfsl + 15 14 1 3 6 Die xFSL_PAR-Struktur; protokol/xfsl.u; proto_xfsl + 15 14 1 3 7 Die Kontrollflags; protokol/xfsl.u; proto_xfsl + 15 14 1 3 8 Die PFONTINFO-Struktur; protokol/xfsl.u; proto_xfsl + 15 14 1 3 9 Das User-Popup; protokol/xfsl.u; proto_xfsl + 15 14 1 4 Die Fontflags; protokol/xfsl.u; proto_xfsl + 15 14 1 5 xFSL Returncodes; protokol/xfsl.u; proto_xfsl + 15 14 1 6 Die Pure-C-Event-Struktur; protokol/xfsl.u; proto_xfsl + 15 14 2 xFSL Tips und Hinweise; protokol/xfsl.u; proto_xfsl + 15 14 2 1 Ein einfacher Aufruf; protokol/xfsl.u; proto_xfsl + 15 14 2 2 Fragen und Antworten; protokol/xfsl.u; proto_xfsl + 15 14 2 3 xFLS Programmiertechnische Hinweise; protokol/xfsl.u; proto_xfsl + 15 14 2 3 1 Datentypen; protokol/xfsl.u; proto_xfsl + 15 14 2 3 2 xFSL Parameterübergabe; protokol/xfsl.u; proto_xfsl + 15 14 2 3 3 Pure C und `cdecl'; protokol/xfsl.u; proto_xfsl + 15 14 3 Revisions–History; protokol/xfsl.u; proto_xfsl + 15 14 4 Programmübersicht; protokol/xfsl.u; proto_xfsl + 15 14 4 1 Fontselektor–Übersicht; protokol/xfsl.u; proto_xfsl + 15 14 4 2 Programme, die einen Fontselektor unterstützen; protokol/xfsl.u; proto_xfsl + 15 14 5 Die UFSL–Schnittstelle; protokol/xfsl.u; proto_xfsl + 15 14 6 Hinweise für Autoren anderer Fontselektoren; protokol/xfsl.u; proto_xfsl + 15 15 XSSI-Protokoll; protokol/xssi.u; appendix + A ASCII-Tabelle; anhang/anhang/ascii.ui; ascii + B Der Scan-Code; anhang/anhang/scan-code.ui; scancode + C Entwicklungssysteme; anhang/anhang/anhang.u; develop + D Literatur zum TOS-Betriebssystem; anhang/anhang/anhang.u; literature + E Angabe der Quellen; anhang/anhang/anhang.u; references + F Der PMMU-Funktionshandler; anhang/anhang/pmmu.u; pmmu + F 1 ClearPageMode; anhang/anhang/pmmu.u; pmmu_ClearPageMode + F 2 GetHdv_inuse; anhang/anhang/pmmu.u; pmmu_GetHdv_inuse + F 3 GetPageSize; anhang/anhang/pmmu.u; pmmu_GetPageSize + F 4 pmem_size; anhang/anhang/pmmu.u; pmmu_pmem_size + F 5 PMMUversion; anhang/anhang/pmmu.u; pmmu_PMMUversion + F 6 SetPageMode; anhang/anhang/pmmu.u; pmmu_SetPageMode + F 7 vmem_size; anhang/anhang/pmmu.u; pmmu_vmem_size + G TOS Liste; anhang/anhang/tos_vers.u; tos_vers + H XHDI - eXtended HardDisk Interface (Version 1.30); anhang/anhang/xhdi/xhdi_de.ui; xhdi + H 1 XHDI-Cookie; anhang/anhang/xhdi/xhdi_de.ui; xhdi_cookie + H 2 XHDI-Terminologie; anhang/anhang/xhdi/xhdi_de.ui; xhdi_terminology + H 3 Arbitration; anhang/anhang/xhdi/xhdi_de.ui; xhdi_arbitration + H 4 Empfohlene Partitiontypen; anhang/anhang/xhdi/xhdi_de.ui; xhdi_partition_types + H 4 1 Partitiontyp RAW; anhang/anhang/xhdi/xhdi_de.ui; xhdi_partition_types + H 5 XHDI-Funktionen; anhang/anhang/xhdi/xhdi_de.ui; xhdi_functions + H 5 1 XHGetVersion; anhang/anhang/xhdi/xhdi_de.ui; xhdi_functions + H 5 2 XHInqTarget; anhang/anhang/xhdi/xhdi_de.ui; xhdi_functions + H 5 3 XHReserve; anhang/anhang/xhdi/xhdi_de.ui; xhdi_functions + H 5 4 XHLock; anhang/anhang/xhdi/xhdi_de.ui; xhdi_functions + H 5 5 XHStop; anhang/anhang/xhdi/xhdi_de.ui; xhdi_functions + H 5 6 XHEject; anhang/anhang/xhdi/xhdi_de.ui; xhdi_functions + H 5 7 XHDrvMap; anhang/anhang/xhdi/xhdi_de.ui; xhdi_functions + H 5 8 XHInqDev; anhang/anhang/xhdi/xhdi_de.ui; xhdi_functions + H 5 9 XHInqDriver; anhang/anhang/xhdi/xhdi_de.ui; xhdi_functions + H 5 10 XHNewCookie; anhang/anhang/xhdi/xhdi_de.ui; xhdi_functions + H 5 11 XHReadWrite; anhang/anhang/xhdi/xhdi_de.ui; xhdi_functions + H 5 12 XHInqTarget2; anhang/anhang/xhdi/xhdi_de.ui; xhdi_functions + H 5 13 XHInqDev2; anhang/anhang/xhdi/xhdi_de.ui; xhdi_functions + H 5 14 XHDriverSpecial; anhang/anhang/xhdi/xhdi_de.ui; xhdi_functions + H 5 15 XHGetCapacity; anhang/anhang/xhdi/xhdi_de.ui; xhdi_functions + H 5 16 XHMediumChanged; anhang/anhang/xhdi/xhdi_de.ui; xhdi_functions + H 5 17 XHMiNTInfo; anhang/anhang/xhdi/xhdi_de.ui; xhdi_functions + H 5 18 XHDOSLimits; anhang/anhang/xhdi/xhdi_de.ui; xhdi_functions + H 5 19 XHLastAccess; anhang/anhang/xhdi/xhdi_de.ui; xhdi_functions + H 5 20 XHReaccess; anhang/anhang/xhdi/xhdi_de.ui; xhdi_functions + I Typdefinitionen; anhang/typedefs.u; typedefs + I 1 AESVARS; anhang/typedefs/AESVARS.ui; AESVARS + I 2 Archivheader (ARHEADER); anhang/typedefs/ARHEADER.ui; ARHEADER + I 3 Buffer-Control-Block (BCB); anhang/typedefs/BCB.ui; BCB + I 4 CPXINFO; anhang/typedefs/CPXINFO.ui; CPXINFO + I 5 FlpDrvInfo; anhang/typedefs/FlpDrvInfo.ui; FlpDrvInfo + I 6 GEM_MUPB; anhang/typedefs/GEM_MUPB.ui; GEM_MUPB + I 7 GRECT; anhang/typedefs/GRECT.ui; GRECT + I 8 HDFUNCS; anhang/typedefs/HDFUNCS.ui; HDFUNCS + I 9 MacVersion; anhang/typedefs/MacVersion.ui; MacVersion + I 10 Memory-Control-Block (MCB) in MagiC; anhang/typedefs/MCB.ui; magic_MCB + I 11 Memory-Deskriptor (MD) in TOS; anhang/typedefs/MD.ui; MD + I 12 MRETS; anhang/typedefs/MRETS.ui; MRETS + I 13 OHEADER; anhang/typedefs/OHEADER.ui; OHEADER + I 14 OSHEADER; anhang/typedefs/OSHEADER.ui; OSHEADER + I 15 PrintDesc; anhang/typedefs/PrintDesc.ui; PrintDesc + I 16 RGB_LIST; anhang/typedefs/RGB_LIST.ui; RGB_LIST + I 17 THREADINFO; anhang/typedefs/THREADINFO.ui; THREADINFO + I 18 XCPB; anhang/typedefs/XCPB.ui; XCPB + @ Index; /home/runner/work/tos.hyp/tos.hyp/gh-pages/de/udooEw37w; indexudo diff --git a/de/indexudo.html b/de/indexudo.html new file mode 100644 index 000000000..7b969b2c3 --- /dev/null +++ b/de/indexudo.html @@ -0,0 +1,5568 @@ + + + + + +Die Anleitung zum TOS: Index + + + + + + + + + +Home +Inhaltsverzeichnis +XCPBXCPB + + +
+ +

Index

+
+# + | % + | 2 + | A + | B + | C + | D + | E + | F + | G + | H + | I + | J + | K + | L + | M + | N + | O + | P + | Q + | R + | S + | T + | U + | V + | W + | X + | Z + | _ +
+ +

+#
+#_ACC
+#_APP
+#_AUT
+#_BKG
+#_BUF
+#_CTR
+#_DEV
+#_DRV
+#_ENV
+#_FLG
+#_FSL
+#_HDV
+#_INW
+#_MAG
+#_OBS
+#_SCP
+#_SHL
+#_SLB
+#_TRM
+#_TSL
+#_TXB
+#_TXT
+#_WND
+

+ +

+%
+%apgi_0
+%apgi_1
+%apgi_10
+%apgi_11
+%apgi_12
+%apgi_13
+%apgi_14
+%apgi_2
+%apgi_22360
+%apgi_22528
+%apgi_3
+%apgi_4
+%apgi_5
+%apgi_6
+%apgi_64
+%apgi_65
+%apgi_7
+%apgi_8
+%apgi_9
+%apgi_96
+%apgi_97
+%apgi_98
+%apgi_99
+%ctl_1
+%ctl_2
+%ctl_3
+%ctl_4
+%ctl_5
+%ctl_6
+%dpthconf_7
+%dpthconf_8
+%mmcookie_flgs1
+

+ +

+2
+200Hz Timer, Vektor für
+

+ +

+A
+ABC-GEM
+ABLE_EMSDESK
+ABLE_GETINFO
+ABLE_PROP
+ABLE_PROP2
+ABLE_WTREE
+ABLE_X3D
+ABLE_XBVSET
+ABLE_XSHL
+Accessories
+Accessories in MagiC
+Accessories, Startupcode für
+ACC_ACC
+ACC_ACK
+ACC_CLOSE
+ACC_DSINFO
+ACC_EXIT
+ACC_FIELDINFO
+ACC_FILEINFO
+ACC_FORCESDF
+ACC_GETDSI
+ACC_GETFIELDS
+ACC_GETSDF
+ACC_ID
+ACC_IMG
+ACC_KEY
+ACC_META
+ACC_OPEN
+ACC_REPLY
+ACC_REQUEST
+ACC_TEXT
+ACTBUTCOL
+ActiveModeNumber
+AC_CLOSE
+AC_COPY
+AC_HELP
+AC_OPEN
+AC_REPLY
+AC_VERSION
+AD3DVALUE
+ADDMEM
+addr_in
+addr_out
+Adreßfehler, Vektor für
+Änderungen in PC-GEM
+Äquidistante Fonts
+AES
+aes
+AES im Quelltext?
+AES, Entstehung des
+AES, Grundlagen des
+AES-Bindings
+AES-Broadcasting
+AES-Clones
+AES-Environment manipulieren
+AES-Funktionsliste
+AES-Messages
+AES-Parameterblock
+AES-Strukturen
+AES-TRAP
+AES-Versionsnummer
+AESPB
+AESVARS
+AESVARS, Zeiger auf AESVARS
+AES_AOPTS
+AES_ARCH_COLDFILRE
+AES_ARCH_M68000
+AES_ARCH_M68010
+AES_ARCH_M68020
+AES_ARCH_M6802060
+AES_ARCH_M68030
+AES_ARCH_M68040
+AES_ARCH_M68060
+AES_ARCH_M68K
+AES_DEVSTATUS_ALPHA
+AES_DEVSTATUS_BETA
+AES_DEVSTATUS_RELEASE
+AES_FDEVSTATUS_STABLE
+AES_FUNCTIONS
+AES_Load
+AES_VERSION
+AES_WOPTS
+AF_CLOSEACK
+AF_DOALERT
+AF_DOFSELECT
+AF_SENDREDRAW
+akustische Rückmeldungen
+Alertboxen
+Allgemeine Beschreibung
+Allgemeines zu MagiC Mac
+Allgemeines zum Shutdown
+Allgemeines zum XFS-Konzept von MagiC
+Alloc
+Alternate-Help, Zähler für
+AMC-GDOS
+Analysieren eines Metafiles
+Angabe der Quellen
+ANI_MOUSE
+Anmerkungen
+Anmerkungen zum 3D-Look von MagiC
+ANSWER_TRACE
+AO0_OBJC_EDIT
+AO0_WF_SLIDER
+AOPT_CLEAR
+AOPT_SET
+APCI_HASDESK
+APCI_HASMBAR
+APCI_HIDDEN
+APC_APP_CONFIG
+APC_HIDE
+APC_HIDENOT
+APC_INFO
+APC_INFORM_MESAG
+APC_KILL
+APC_MENU
+APC_SHOW
+APC_SYSTEM
+APC_TOP
+APC_TOPNEXT
+APC_WIDGETS
+APFLG
+APL-Entwicklungssysteme
+APPFLAGS
+APPLICAT
+Applikation, Auftauen einer
+Applikation, Einfrieren einer
+Applikation, Umschalten auf
+Applikationsfunktionen
+APPLRECORD
+appl_bvset
+appl_control
+appl_exit
+appl_find
+appl_getcicon
+appl_getinfo
+appl_getinfo, Existenz von
+appl_getinfo_str
+appl_init
+appl_options
+appl_pipe
+appl_read
+appl_search
+appl_tplay
+appl_trecord
+appl_write
+appl_xbvget
+appl_xbvset
+appl_xgetinfo
+appl_yield
+APP_ACCESSORY
+APP_AESSYS
+APP_AESTHREAD
+APP_APPLICATION
+APP_DESK
+APP_FIRST
+APP_NEXT
+APP_SHELL
+APP_SYSTEM
+APP_TASKINFO
+AP_BUTTON
+AP_DEBUG
+AP_DRAGDROP
+AP_KEYBD
+AP_LOADCONF
+AP_RESCHG
+AP_TERM
+AP_TFAIL
+Arbitrary line
+Arbitration
+Archivheader (ARHEADER)
+ARGV beim Aufrufer
+ARGV beim gestarteten Programm
+ARGV-Verfahren
+ARGV-Verfahren in MagiC
+ARGV-Verfahren, erweitertes
+ARHEADER
+ARROW
+ASCI, Vektor für
+ASCII-Tabelle
+Assembler-Entwicklungssysteme
+ASSIGN.SYS-Datei ab GEM/3
+atariModePossible
+Attach
+Attribute einer Datei
+Attribute, Bitmap-
+Attribute, Fülltyp-
+Attribute, Linien-
+Attribute, Markierungs-
+Attribute, Text-
+Attribute, übergeordnete
+Attributfunktionen
+AT_PERGAMON
+Aufbau des Fontheaders
+Auflösungswechsel
+Auftauen einer Applikation
+Ausgabeformat festlegen, VDI-
+Ausgabefunktionen
+Auskunftsfunktionen
+Ausrichtung
+Auswählen per Gummiband
+Auswählen per Maus
+Auswählen per Shift-Maus
+Auszug aus dem BIOS von MagiC
+Auto-Interrupt (Level-1), Vektor
+Auto-Interrupt (Level-2), Vektor
+Auto-Interrupt (Level-3), Vektor
+Auto-Interrupt (Level-4), Vektor
+Auto-Interrupt (Level-5), Vektor
+Auto-Interrupt (Level-6), Vektor
+Auto-Interrupt (Level-7), Vektor
+Auto-Ordner, Start aus dem
+AUTO-Ordner, Zugriffspfad für
+AUTOEXEC.BAT in MagiC
+Autoren und Programme
+auxControl
+AV-Funktionen
+AV-Protokoll
+AV-Protokoll, Quoting im
+AV_ACCWINDCLOSED
+AV_ACCWINDOPEN
+AV_ASKCONFONT
+AV_ASKFILEFONT
+AV_ASKOBJECT
+AV_COPYFILE
+AV_COPY_DRAGGED
+AV_DELFILE
+AV_DRAG_ON_WINDOW
+AV_EXIT
+AV_FILEINFO
+AV_GETSTATUS
+AV_OPENCONSOLE
+AV_OPENWIND
+AV_PATH_UPDATE
+AV_PROTOKOLL
+AV_SENDCLICK
+AV_SENDKEY
+AV_SETWINDPOS
+AV_STARTED
+AV_STARTPROG
+AV_STATUS
+AV_VIEW
+AV_WHAT_IZIT
+AV_XWIND
+

+ +

+B
+BACKDROP
+BACKGRCOL
+BASEPAGE
+Basic XAcc messages
+Basic-Entwicklungssysteme
+Baudratengenerator, Vektor für
+BCB
+Bconin
+Bconmap
+BCONMAP
+Bconout
+Bconstat
+Bcostat
+BEG_MCTRL
+BEG_UPDATE
+Beispiel einer MAGX.INF-Datei
+Beispiel zu HNDL_OBJ
+Beispiel-Analyse eines Metafile
+Beispiel-Binding AES
+Beispiel-Binding für AES-Funktionen
+Beispiel-Code
+Beispiel: Chatwin und STJ-Oberon-2
+Beispielcode zu Signalen
+Beispiele zu vq_scrninfo
+Bell
+bell_hook
+Beschreibung der VDI-Schreibmodi
+Betriebssystems, Ende des
+Bildformat, pixelorientiertes
+Bildformat, planeorientiertes
+Bildschirm, virtueller
+Bildschirm-Treiber
+Bildschirmfunktionen
+Bildspeicher, Anfang des
+Binding eines Metafile-Subopcodes
+Bindings des AES
+Bindings des VDI
+BIOS
+bios
+BIOS Fehlermeldungen
+BIOS Strukturen
+BIOS, Das
+BIOS, Parameterübergabe im
+BIOS-Dispatcher
+BIOS-Funktionsliste
+bios-Trap
+Bioskeys
+Bit block transfer
+Bit-Image Treiber
+Bit-Strings
+BITBLK
+BITBLT
+BITBUTTON
+Bitmap-Attribute
+Bitmap-Fonts, Header bei
+Bitmapformat bei Druckertreibern
+BITMAP_FONT
+BIT_IMAGE
+Blink_off
+Blink_on
+Blitmode
+BLK_CLEARED
+BLK_ERR
+BLK_OK
+Bootlaufwerks, Nummer des
+BootRoot
+Bootsektors, Laden des
+BORDER
+BPB
+BPB, Ermitteln des
+Broadcasting des AES
+BSIM
+BSIM-BIOS-Erweiterungen
+bsim_id
+BubbleGEM
+BubbleGEM-Cookies
+BubbleGEM-Environmentvariable
+BUBBLEGEM_ACK
+BUBBLEGEM_ASKFONT
+BUBBLEGEM_FONT
+BUBBLEGEM_HIDE
+BUBBLEGEM_REQUEST
+BUBBLEGEM_SHOW
+Buffer-Control-Block (BCB)
+buffoper
+buffptr
+Busfehler, Vektor für
+BUSY-Interrupt, Vektor für
+BUSYBEE
+BUSY_BEE
+bus_to_virt
+button_click
+bypass
+ByteFromLink
+ByteToLink
+

+ +

+C
+C'Task Royal
+C++ Entwicklungssysteme
+C-Entwicklungssysteme
+CAB_CHANGED
+CAB_EXIT
+CAB_HELLO
+CAB_MAIL
+CAB_MAILSENT
+CAB_PATH
+CAB_RELEASESTATUS
+CAB_REQUESTSTATUS
+CAB_STATUS
+CAB_SUPPORT
+CAB_TERM
+CAB_VIEW
+Cache löschen, CPU-
+CacheCtrl
+callMacContext
+cardadr
+cardmagic
+cardsel
+cardslot
+CatMsg
+CatProtoMsg
+Cauxin
+Cauxis
+Cauxos
+Cauxout
+cblmode
+cblread
+Cconin
+Cconis
+Cconos
+Cconout
+Cconrs
+Cconws
+CD
+CD-ROM Definitionen
+CD-ROM-Funktionen
+cdecl
+CDROMALLOWREMOVAL
+CDROMAUDIOCTRL
+CDROMEJECT
+CDROMGETMCN
+CDROMGETTISRC
+CDROMPAUSE
+CDROMPLAYMSF
+CDROMPLAYTRKIND
+CDROMPREVENTREMOVAL
+CDROMREADDA
+CDROMREADMODE1
+CDROMREADMODE2
+CDROMREADOFFSET
+CDROMREADTOCENTRY
+CDROMREADTOCHDR
+CDROMRESUME
+CDROMSTART
+CDROMSTOP
+CDROMSUBCHNL
+CDROMVOLCTRL
+cdrom_audioctrl
+CDROM_AUDIO_COMPLETED
+CDROM_AUDIO_EMPHASIS
+CDROM_AUDIO_ERROR
+CDROM_AUDIO_INVALID
+CDROM_AUDIO_NO_STATUS
+CDROM_AUDIO_PAUSED
+CDROM_AUDIO_PLAY
+CDROM_COPY_PERMITTED
+CDROM_DATA_TRACK
+CDROM_FOUR_CHANNEL
+CDROM_LBA
+CDROM_LEADOUT
+cdrom_mcn
+CDROM_MSF
+cdrom_msf
+cdrom_read
+cdrom_subchnl
+cdrom_ti
+cdrom_tisrc
+cdrom_tocentry
+cdrom_tochdr
+cdrom_volctrl
+cd_ad
+CD_DISC_INFO
+CD_TOC_ENTRY
+Central-Processing-Unit, Typ der
+CENTScreen-XBIOS-Erweiterung
+Character-Offset-Table
+CHECKED
+CHECKinst
+Chgsysvar
+Chgvector
+CHK-Befehl, Vektor für
+CHTW_MSG
+CH_EXIT
+CICON
+CICONBLK
+CJar
+Classic XAcc
+ClearPageMode
+Clear_down
+Clear_eol
+Clear_home
+Clear_line
+Clear_sol
+Clear_up
+Client minimal
+client_exit
+Clipping
+clkdivide
+Clones, AES-
+CLOSER
+CLRCAT
+CL_COMMAND
+CL_INIT
+CL_TIME
+CMD_ALLOCMEM
+CMD_ALLOCPAGE
+CMD_BLANK
+CMD_CLIPMEM
+CMD_COPYMEM
+CMD_COPYPAGE
+CMD_ENUMMODES
+CMD_FILLMEM
+CMD_FLIPPAGE
+CMD_FREEMEM
+CMD_FREEPAGE
+CMD_GETINFO
+CMD_GETMODE
+CMD_GETVERSION
+CMD_LINEMEM
+CMD_SETADR
+CMD_SETMODE
+CMD_SYNCMEM
+CMD_TESTMODE
+CMD_TEXTUREMEM
+Cnecin
+Code, selbstmodifizierender
+Color-Lookup-Table
+colorptr
+COLORS_CHANGED
+COLOR_ENTRY
+COLOR_ID
+COLOR_RGB
+COLOR_TAB
+COMMAND.PRG, Starten von
+Compatibility considerations
+CON: Attribut-Bits des Gerätes
+configKernel
+conterm
+contrl
+control
+controlSwitch
+Cont_All
+Cont_Process
+con_state
+Cookie, 3DMN
+Cookie, 3RDB
+Cookie, 60Hz
+Cookie, 8*8
+Cookie, A2sv
+Cookie, AB40
+Cookie, ACCS
+Cookie, AFnt
+Cookie, AgK0
+Cookie, AHVR
+Cookie, ALHP
+Cookie, ALIC
+Cookie, ALRM
+Cookie, AmAN
+Cookie, AMC1
+Cookie, AMC2
+Cookie, AMCG
+Cookie, ANSe
+Cookie, APGM
+Cookie, ARAe
+Cookie, ARTS
+Cookie, asGT
+Cookie, ASum
+Cookie, AVmw
+Cookie, AVOJ
+Cookie, AVSV
+Cookie, BASH
+Cookie, BBD2
+Cookie, BCKW
+Cookie, BGEM
+Cookie, BGHD
+Cookie, BHdl
+Cookie, BHLP
+Cookie, BIGS
+Cookie, BIOC
+Cookie, BLNK
+Cookie, BLOW
+Cookie, BScn
+Cookie, BSIM
+Cookie, BSTE
+Cookie, BUG1
+Cookie, C24P
+Cookie, CACH
+Cookie, CALD
+Cookie, CASE
+Cookie, CatS
+Cookie, CaTT
+Cookie, CB2K
+Cookie, CBCE
+Cookie, CBDF
+Cookie, CBHD
+Cookie, CBHY
+Cookie, CBIT
+Cookie, CBTS
+Cookie, CCDA
+Cookie, cdMC
+Cookie, CDOT
+Cookie, ceci
+Cookie, CFIX
+Cookie, CFsl
+Cookie, CHAM
+Cookie, CHBT
+Cookie, CHN1
+Cookie, CHNG
+Cookie, CHTW
+Cookie, CICN
+Cookie, CISY
+Cookie, CJar
+Cookie, CJAR
+Cookie, ck01
+Cookie, CKBD
+Cookie, CKJR
+Cookie, CLCK
+Cookie, CLK1
+Cookie, CLOK
+Cookie, CM16
+Cookie, CNTS
+Cookie, COLO
+Cookie, CPSL
+Cookie, CRAC
+Cookie, CRIT
+Cookie, CSMD
+Cookie, CT40
+Cookie, CT60
+Cookie, CTCH
+Cookie, CtCp
+Cookie, CTSF
+Cookie, cVDI
+Cookie, CWCo
+Cookie, DATE
+Cookie, DATL
+Cookie, DAWN
+Cookie, DBFX
+Cookie, DCdd
+Cookie, DCF7
+Cookie, DCSD
+Cookie, DECD
+Cookie, DEPI
+Cookie, DHST
+Cookie, DIG2
+Cookie, DJBX
+Cookie, DKEY
+Cookie, DNTR
+Cookie, DPAT
+Cookie, DPRS
+Cookie, DRIV
+Cookie, DRRH
+Cookie, Dsel
+Cookie, DSSO
+Cookie, DYDL
+Cookie, DYJA
+Cookie, DYJD
+Cookie, DYJT
+Cookie, DYNL
+Cookie, DYwl
+Cookie, DYWL
+Cookie, EADC
+Cookie, EBPO
+Cookie, EdDI
+Cookie, EDFX
+Cookie, EGON
+Cookie, Eintragen eines
+Cookie, EMNP
+Cookie, ENV$
+Cookie, ENVN
+Cookie, ENVR
+Cookie, EPro
+Cookie, ETM
+Cookie, EURO
+Cookie, EUSB
+Cookie, EXRA
+Cookie, EXTD
+Cookie, F117
+Cookie, FaKE
+Cookie, FALT
+Cookie, FAX!
+Cookie, FAXR
+Cookie, FHFX
+Cookie, FIX2
+Cookie, FLTP
+Cookie, FLXD
+Cookie, fMSX
+Cookie, Fose
+Cookie, FOse
+Cookie, FrmD
+Cookie, FSEL
+Cookie, FSER
+Cookie, FSMC
+Cookie, FSmp
+Cookie, fVDI
+Cookie, FxOP
+Cookie, F_3D
+Cookie, GABI
+Cookie, GBel
+Cookie, GCOM
+Cookie, GDEV
+Cookie, GEHC
+Cookie, GEHD
+Cookie, GEMB
+Cookie, GENV
+Cookie, Gfix
+Cookie, GI30
+Cookie, GIGA
+Cookie, gk5"
+Cookie, gkCO
+Cookie, GLAS
+Cookie, GLBL
+Cookie, GMNI
+Cookie, GMTC
+Cookie, GNUC
+Cookie, Gnva
+Cookie, GOBJ
+Cookie, GOff
+Cookie, GSND
+Cookie, GSP1
+Cookie, GSXB
+Cookie, GULM
+Cookie, HABO
+Cookie, hade
+Cookie, HAMM
+Cookie, HBFS
+Cookie, HcP6
+Cookie, HDDR
+Cookie, HDEX
+Cookie, HDEY
+Cookie, HDJR
+Cookie, HDLD
+Cookie, HDPR
+Cookie, HDRC
+Cookie, HDST
+Cookie, HDSW
+Cookie, HFIX
+Cookie, hFRB
+Cookie, HIDS
+Cookie, HMDU
+Cookie, HMOC
+Cookie, HMRD
+Cookie, HMRS
+Cookie, HPHC
+Cookie, HPLJ
+Cookie, HSCD
+Cookie, HSND
+Cookie, HSnd
+Cookie, HWAM
+Cookie, IBMP
+Cookie, ICFS
+Cookie, ICST
+Cookie, IDSK
+Cookie, IMAC
+Cookie, IMNE
+Cookie, INSJ
+Cookie, INXR
+Cookie, iPRN
+Cookie, IRSB
+Cookie, iTMA
+Cookie, JAM1
+Cookie, JANU
+Cookie, JB2G
+Cookie, JCLK
+Cookie, JCNB
+Cookie, JCNC
+Cookie, JCNH
+Cookie, JCNT
+Cookie, JFTP
+Cookie, JINX
+Cookie, JMLB
+Cookie, JMLS
+Cookie, JSHD
+Cookie, JUST
+Cookie, J_Sc
+Cookie, KAOS
+Cookie, KbEv
+Cookie, KEYT
+Cookie, KGTF
+Cookie, KIDI
+Cookie, KLME
+Cookie, KREG
+Cookie, KyMp
+Cookie, KyWt
+Cookie, Lace
+Cookie, LACY
+Cookie, LALA
+Cookie, lanc
+Cookie, LASB
+Cookie, LAWC
+Cookie, LDGM
+Cookie, LEDP
+Cookie, LEmu
+Cookie, Lity
+Cookie, LLCR
+Cookie, LMus
+Cookie, Löschen eines
+Cookie, LOGB
+Cookie, LoSe
+Cookie, LP/2
+Cookie, LPCD
+Cookie, LPJM
+Cookie, LTMF
+Cookie, M16s
+Cookie, M16X
+Cookie, macc
+Cookie, MADD
+Cookie, MADN
+Cookie, Maes
+Cookie, MagC
+Cookie, MAGN
+Cookie, MagX
+Cookie, MAST
+Cookie, MaTC
+Cookie, MbAr
+Cookie, MBRD
+Cookie, MCL_
+Cookie, McSn
+Cookie, MCSP
+Cookie, MCWR
+Cookie, MDIA
+Cookie, MDRK
+Cookie, MDSa
+Cookie, MFAC
+Cookie, MFFM
+Cookie, MFIX
+Cookie, MFMV
+Cookie, MFNT
+Cookie, MGEM
+Cookie, MgMc
+Cookie, MgMx
+Cookie, MgPC
+Cookie, MgSn
+Cookie, MID3
+Cookie, MIMA
+Cookie, MiNT
+Cookie, MIPS
+Cookie, MJAF
+Cookie, MKHC
+Cookie, MkJr
+Cookie, MM2X
+Cookie, MMAC
+Cookie, MMUT
+Cookie, MM_2
+Cookie, MN3D
+Cookie, MNAM
+Cookie, MOAF
+Cookie, MOGR
+Cookie, MPRO
+Cookie, MRAM
+Cookie, MSPD
+Cookie, MSPO
+Cookie, mstx
+Cookie, MTCI
+Cookie, MTft
+Cookie, MUPF
+Cookie, MWHL
+Cookie, MZTR
+Cookie, MZVT
+Cookie, M_IN
+Cookie, N203
+Cookie, nAES
+Cookie, NAH3
+Cookie, NBEL
+Cookie, NBLL
+Cookie, NCLN
+Cookie, ne2k
+Cookie, NERV
+Cookie, NETS
+Cookie, NEXB
+Cookie, NEXK
+Cookie, NFMT
+Cookie, NFnt
+Cookie, NKCC
+Cookie, NLdr
+Cookie, NMGE
+Cookie, NO7P
+Cookie, noCF
+Cookie, NOR5
+Cookie, NOVA
+Cookie, NSC1
+Cookie, Nspd
+Cookie, nTAS
+Cookie, NTK4
+Cookie, nTOS
+Cookie, NUL>
+Cookie, Null-
+Cookie, NVDI
+Cookie, OBNL
+Cookie, OFLS
+Cookie, OPMM
+Cookie, OSBL
+Cookie, OSTT
+Cookie, OTOS
+Cookie, OV24
+Cookie, oVDI
+Cookie, OVDJ
+Cookie, OVEP
+Cookie, OVER
+Cookie, OVEX
+Cookie, OVFS
+Cookie, OVIM
+Cookie, OVLS
+Cookie, OVRD
+Cookie, OVUT
+Cookie, OVWI
+Cookie, PAMN
+Cookie, PAUL
+Cookie, PBUG
+Cookie, PDEB
+Cookie, PDeb
+Cookie, PDOS
+Cookie, PDRZ
+Cookie, PFIX
+Cookie, Pinp
+Cookie, PKSH
+Cookie, PMMU
+Cookie, POIS
+Cookie, POWM
+Cookie, PRCS
+Cookie, PRDS
+Cookie, PRMD
+Cookie, PRN!
+Cookie, PRNß
+Cookie, PRO5
+Cookie, PROB
+Cookie, PROT
+Cookie, PRTD
+Cookie, PRTO
+Cookie, prtr
+Cookie, PRTR
+Cookie, PSND
+Cookie, PSSG
+Cookie, PTOS
+Cookie, QIKM
+Cookie, QMAC
+Cookie, QMCP
+Cookie, QST2
+Cookie, QST3
+Cookie, QUAN
+Cookie, RAIL
+Cookie, RaSn
+Cookie, RESG
+Cookie, RFLX
+Cookie, RFUS
+Cookie, RGUS
+Cookie, RING
+Cookie, ROMD
+Cookie, ROT8
+Cookie, RPIT
+Cookie, RREG
+Cookie, RSLT
+Cookie, RSpd
+Cookie, RSVE
+Cookie, RSVF
+Cookie, RTKC
+Cookie, RTOB
+Cookie, RWIN
+Cookie, SAM
+Cookie, SBKM
+Cookie, SBTE
+Cookie, SBTS
+Cookie, SCAH
+Cookie, SCKM
+Cookie, SCPN
+Cookie, SCRD
+Cookie, SCRN
+Cookie, SCRS
+Cookie, SCRW
+Cookie, SCSI
+Cookie, SCSV
+Cookie, SDCH
+Cookie, SDES
+Cookie, SDsk
+Cookie, SDWN
+Cookie, SELC
+Cookie, SENV
+Cookie, SFA^
+Cookie, SFIX
+Cookie, SFMN
+Cookie, ShLk
+Cookie, shlp
+Cookie, SKEY
+Cookie, SLCT
+Cookie, SLif
+Cookie, SLIP
+Cookie, SM00
+Cookie, SM01
+Cookie, SM02
+Cookie, SMAL
+Cookie, SMAU
+Cookie, SMon
+Cookie, SMTT
+Cookie, SNAP
+Cookie, SOFS
+Cookie, SOSW
+Cookie, SpcE
+Cookie, SPCK
+Cookie, SPEE
+Cookie, SPEK
+Cookie, SPEX
+Cookie, spMR
+Cookie, Spol
+Cookie, SPRG
+Cookie, SR17
+Cookie, SSND
+Cookie, ST-C
+Cookie, ST17
+Cookie, STAT
+Cookie, STEM
+Cookie, STEW
+Cookie, STFA
+Cookie, StIc
+Cookie, STiK
+Cookie, STMS
+Cookie, strk
+Cookie, STRX
+Cookie, SupV
+Cookie, SVAR
+Cookie, SVGA
+Cookie, SWAP
+Cookie, SwTm
+Cookie, SYMB
+Cookie, SYNL
+Cookie, SYNT
+Cookie, SysE
+Cookie, Syso
+Cookie, SYST
+Cookie, SZ_M
+Cookie, S_DR
+Cookie, T206
+Cookie, T2GM
+Cookie, TALK
+Cookie, TAPE
+Cookie, TASS
+Cookie, TCFS
+Cookie, TCRB
+Cookie, Tenv
+Cookie, TFIX
+Cookie, THNX
+Cookie, THRM
+Cookie, THST
+Cookie, TIM3
+Cookie, TIM5
+Cookie, TIME
+Cookie, TK40
+Cookie, TL3D
+Cookie, TLWV
+Cookie, Tmon
+Cookie, TMON
+Cookie, tmsW
+Cookie, TOpW
+Cookie, TOUC
+Cookie, TPat
+Cookie, TPGM
+Cookie, TRAK
+Cookie, TraP
+Cookie, Trpp
+Cookie, TRUE
+Cookie, TSEN
+Cookie, TSWP
+Cookie, TTTF
+Cookie, TUBS
+Cookie, TWFS
+Cookie, Typ1
+Cookie, UFSL
+Cookie, UIS3
+Cookie, UKB1
+Cookie, UKB3
+Cookie, UN*X
+Cookie, USCK
+Cookie, USHD
+Cookie, UsNm
+Cookie, USPK
+Cookie, USRS
+Cookie, USSC
+Cookie, UTRK
+Cookie, VBLF
+Cookie, VDIp
+Cookie, VDLY
+Cookie, VECS
+Cookie, VeiL
+Cookie, VFIX
+Cookie, VFNT
+Cookie, VGAS
+Cookie, VI-2
+Cookie, View
+Cookie, VIRA
+Cookie, VMEM
+Cookie, VPCH
+Cookie, VRAM
+Cookie, VREP
+Cookie, VSco
+Cookie, VSCR
+Cookie, VSTM
+Cookie, vT52
+Cookie, VTFX
+Cookie, VXCK
+Cookie, WaHW
+Cookie, WARP
+Cookie, WaSA
+Cookie, WBrd
+Cookie, wdlg
+Cookie, WDOG
+Cookie, WEGA
+Cookie, WfNa
+Cookie, WFSL
+Cookie, WICO
+Cookie, WinK
+Cookie, WINX
+Cookie, WINZ
+Cookie, WPRO
+Cookie, WRAP
+Cookie, XALT
+Cookie, XBTN
+Cookie, XDsk
+Cookie, XFRB
+Cookie, XFS1
+Cookie, xFSL
+Cookie, Xgem
+Cookie, XHDI
+Cookie, XKBD
+Cookie, XMMU
+Cookie, XMuz
+Cookie, xNet
+Cookie, XPCI
+Cookie, xRmt
+Cookie, XSDD
+Cookie, XSND
+Cookie, XSSI
+Cookie, XTOS
+Cookie, xUAG
+Cookie, xUFC
+Cookie, XWin
+Cookie, zCAC
+Cookie, zDCF
+Cookie, _5MS
+Cookie, _AFM
+Cookie, _AKP
+Cookie, _CF_
+Cookie, _CPU
+Cookie, _DOS
+Cookie, _FDC
+Cookie, _FLK
+Cookie, _FPU
+Cookie, _FRB
+Cookie, _FSR
+Cookie, _IDT
+Cookie, _INF
+Cookie, _INU
+Cookie, _ISO
+Cookie, _JPD
+Cookie, _MCF
+Cookie, _MCH
+Cookie, _MET
+Cookie, _MIL
+Cookie, _NET
+Cookie, _OOL
+Cookie, _PCI
+Cookie, _PKT
+Cookie, _PWR
+Cookie, _SLM
+Cookie, _SND
+Cookie, _SWI
+Cookie, _T2W
+Cookie, _T30
+Cookie, _USB
+Cookie, _VDI
+Cookie, _VDO
+Cookie, __NF
+Cookie, ΣFSC
+Cookie- und XBRA-Liste
+Cookie-Jar
+Cookie-Jar, Ende des
+Cookie-Jar, Größe des
+Cookie-Namens, Wahl des
+Cookies unter MagiC Mac
+COPS
+COPS, Test auf
+Copy raster form
+CopyModeToActiveMode
+core dump
+core dump, Name für
+CounterRead
+CounterStart
+Cprnos
+Cprnout
+CPU, Stackframes der
+CPU, Typ der
+CPU-Cache löschen
+CPUFreq
+CPX, Event-
+CPX, Form-
+CPX, Suffix eines
+CPX-Datei, Aufbau einer
+CPX-Datei, Header einer
+CPX-Funktionen
+CPX-Moduls, Aktivierung eines
+CPX-Programmierrichtlinien
+CPXHEAD
+CPXINFO
+cpx_button
+cpx_call
+cpx_close
+cpx_draw
+cpx_hook
+cpx_init
+cpx_key
+cpx_m1
+cpx_m2
+CPX_Save
+cpx_timer
+cpx_wmove
+Crawcin
+Crawio
+Crazy-Dots-XBIOS-Erweiterung
+Creat_Queue
+Creat_Screen
+criticret
+CROSSED
+crys_if
+CT60-XBIOS-Erweiterung
+ct60_cache
+ct60_flush_cache
+ct60_read_core_temperature
+ct60_rw_parameter
+ct60_vmalloc
+CTS-Interrupt, Vektor für
+CT_KEY
+CT_MOVE
+CT_NEWTOP
+CT_UPDATE
+Cubase MROS
+Cursconf
+Cursorposition, Rückgabe der
+CURSOR_INIT
+Cur_down
+Cur_home
+Cur_left
+Cur_off
+Cur_on
+Cur_right
+Cur_up
+

+ +

+D
+D&D-Listing_1
+Danksagung
+Das AES
+Das Betriebssystem TOS
+Das BIOS
+Das CAB-Protokoll
+Das Desktop-Fenster
+Das DFS-Konzept von MagiC
+Das GDOS
+Das GEMDOS
+Das Iconify in MagiC
+Das Laufwerk U: in MagiC
+Das OUT-Dateiformat
+Das Programmformat
+Das User-Popup
+Das VDI
+Das Verzeichnis U:\DEV
+Das Verzeichnis U:\PIPE
+Das Verzeichnis U:\PROC
+Das Verzeichnis U:\SHM
+Das XBIOS
+Das XCONTROL
+Das XFS-Konzept von MagiC
+Das XIMG-Format für Pixelbilder
+Data-type fix31
+dataID
+Datei-Deskriptor
+Dateiattribute von TOS
+Dateiauswahl
+Dateifunktionen
+Dateisysteme unter MagiC Mac
+Dateisysteme, Faustregel für
+Dateisysteme, fremde
+Datenaustausch per Clipboard
+Datenstruktur
+Datenstrukturen für ein DFS
+Datenstrukturen für ein XFS
+Datentypen
+Datum und Uhrzeit
+Datum, Uhrzeit und Zeitgeber
+DA_KNOWHOW
+DB
+Dbmsg
+DC
+DCD-Interrupt, Vektor für
+Dchroot
+Dclosedir
+Dcntl
+Dcreate
+Ddelete
+ddev_close
+ddev_datime
+ddev_delete
+ddev_getc
+ddev_getline
+ddev_ioctl
+ddev_open
+ddev_putc
+ddev_read
+ddev_seek
+ddev_stat
+ddev_write
+ddlisting
+DD_CLIPBOARD
+dd_dmd
+DD_EXT
+DD_LEN
+DD_NAK
+DD_OK
+DD_PRINTER
+dd_refcnt
+DD_STRING
+DD_TRASH
+Debug
+DebugUI
+DEFAULT
+Defines (SSP)
+Definition der Treiberverkettung
+defshiftmd
+Delete_Queue
+Del_line
+Del_Screen
+Der Aufbau der ASSIGN.SYS-Datei
+Der Aufbau der MAGX.INF-Datei
+Der Aufbau eines DFS
+Der Aufbau eines XFS
+Der Cookie von MagiC Mac
+Der Datei-Deskriptor (FD)
+Der Datenaustausch über das GEM-Klemmbrett
+Der Directory-Handle-Deskriptor (DHD)
+Der Drive-Medium-Deskriptor (DMD)
+Der erweiterte Aufruf
+Der Gerätetreiber (MX_DDEV)
+Der Gerätetreiber (MX_DEV)
+Der Hintergrund-DMA von MagiC
+Der Info–Aufruf (xfsl_info)
+Der Line-A-Emulator
+Der N.AES-Cookie
+Der OBNL-Cookie
+Der PMMU-Funktionshandler
+Der Quarter-Screen-Buffer
+Der Scan-Code
+Der Screen-Manager
+Der Shutdown aus Sicht der Applikation
+Der Shutdown aus Sicht des Initiators
+Der Shutdown in MagiC Mac
+Der Smart-Redraw in MagiC
+Der Task-Manager in MagiC
+Der vereinfachte Aufruf (xfsl_input)
+Der Verzeichnis-Deskriptor (DD)
+Der Verzeichniseintrag (DIR)
+Der xFSL–Cookie
+Deskriptor, Datei-
+Deskriptor, Directory-Handle
+Deskriptor, Drive-Medium
+Deskriptor, Verzeichnis-
+Details zu Vektorschriften
+Detecting the presence of TosBox, Steem and PaCifiST
+devconnect
+DEVDRV
+Devinfo
+dev_close
+Dev_create
+dev_datime
+dev_descr
+dev_getc
+dev_getline
+DEV_INSTALL
+dev_ioctl
+DEV_M_INSTALL
+DEV_NEWBIOS
+DEV_NEWTTY
+dev_putc
+dev_read
+dev_seek
+dev_stat
+dev_write
+Dfree
+DFS, Datenstrukturen für ein
+dfs_dfree
+dfs_dir2FD
+dfs_dir2index
+dfs_drv_close
+dfs_drv_open
+dfs_ext_fd
+dfs_fcreate
+dfs_fdelete
+dfs_fxattr
+DFS_GETINFO
+dfs_init
+DFS_INSTDFS
+dfs_name
+dfs_next
+dfs_pathconf
+dfs_readlink
+dfs_sfirst
+dfs_snext
+dfs_sync
+Dgetcwd
+Dgetdrv
+Dgetpath
+dhd_dmd
+DHST
+DHST_ACK
+DHST_ADD
+Diablo-Treiber
+DIALOG
+Dialogboxen
+Dialogboxen, Alert-
+Dialogboxen, Design-Regeln für
+Dialogboxen, Gestaltung von
+Dialogboxen, modale
+Dialogboxen, unmodale
+Dialogen, GDOS-Fonts in
+Die AUTOEXEC.BAT-Datei in MagiC
+Die Bedienung des File-Selektors ab MagiC 4
+Die Belegung des NVM der Echtzeit-Uhr
+Die Bit-Block-Struktur
+Die Disk-Transfer-Area (DTA)
+Die Disk-Transfer-Area DTA
+Die Ein-/Ausgabekanäle des BIOS
+Die Fontflags
+Die Komponenten eines Fensters
+Die Kontrollflags
+Die N.AES-Konfigurationsdatei
+Die negativen Line-A Variablen
+Die Objekt-Struktur
+Die OBNCOMM-Struktur
+Die PFONTINFO-Struktur
+Die Programmflags
+Die Pure-C-Event-Struktur
+Die Rechteckliste eines Fensters
+Die Systemvariablen
+Die Systemvektoren
+Die UFSL–Schnittstelle
+Die VDI–Workstation
+Die verschiedenen GEM-Versionen
+Die xFSL–Schnittstelle
+Die xFSL_PAR-Struktur
+Die Zusammenarbeit von MagiC und MacOS
+Die Zusatzprogramme für MagiC
+digana
+digcode
+digcom
+digmode
+digsrate
+DIN-A3 Format
+DIN-A4 Format
+DIN-A5 Format
+DIN-B5 Format
+DIP-Switches
+Directory-Deskriptor
+Directory-Handle-Deskriptor
+DISABLED
+Diskettenlaufwerke, Anzahl der
+Diskettenlaufwerks, Seekrate des
+DISKINFO
+Dispatcher, BIOS-
+Dispatcher, GEMDOS-
+Dispatcher, XBIOS-
+Display-Enable-Signal-Vektor
+DITHER_MODE
+Divison durch Null, Vektor für
+Dlock
+DMA-Chip, Zugriff auf
+DMAread
+DMAwrite
+DNARROW
+Document-History-Protokoll
+DOMagixAESVars
+Domain, MiNT-
+Domain, TOS-
+Dopendir
+Doppelklick
+DOSMODE
+Dosound
+DOSTIME
+DOSVARS
+DO_WPOPUP
+DP
+Dpathconf
+DP_ATOMIC
+DP_CASE
+DP_IOPEN
+DP_MAXLINKS
+DP_MODEATTR
+DP_NAMEMAX
+DP_PATHMAX
+DP_TRUNC
+DP_VOLNAMEMAX
+DP_XATTRFIELDS
+Drag&Drop Datentypen
+Drag&Drop Status Bytes
+Drag&Drop, Datentypen für
+Drag&Drop, Header bei
+Drag&Drop, Quelltext für
+Drag&Drop, Status Bytes für
+Drag&Drop-Protokoll
+Draw sprite
+DRAW3D
+Dreaddir
+Dreadlabel
+Drei wichtige Programmierregeln
+Drewinddir
+Drive-Medium-Deskriptor
+Drop-Down-Menüs ausschalten
+DRS
+Druckauswahl als Dialog
+Druckauswahl im Fenster
+Druckdialoge
+Drucker-Treiber
+Druckerfunktionen
+Druckers, Papierschacht des
+Druckertreiber, Bitmapformat
+Druckseite, Anzahl der Kopien
+Drvmap
+drvprotec
+Drv_add
+drv_change
+DRV_ENTRY
+DRV_INFO
+Dsetdrv
+Dsetkey
+Dsetpath
+DSP-Programmierung
+DSPBLOCK
+dspclear
+dspintact
+dspmemory
+dspmix
+dspmode
+dspreset
+dsptristate
+Dsp_Available
+Dsp_BlkBytes
+Dsp_BlkHandShake
+Dsp_BlkUnpacked
+Dsp_BlkWords
+Dsp_DoBlock
+Dsp_ExecBoot
+Dsp_ExecProg
+Dsp_FlushSubroutines
+Dsp_GetProgAbility
+Dsp_GetWordSize
+Dsp_Hf0
+Dsp_Hf1
+Dsp_Hf2
+Dsp_Hf3
+dsp_hostcommand
+Dsp_HStat
+Dsp_InqSubrAbility
+Dsp_InStream
+Dsp_IOStream
+Dsp_LoadProg
+Dsp_LoadSubroutine
+Dsp_Lock
+Dsp_LodToBinary
+Dsp_MultBlocks
+Dsp_OutStream
+Dsp_RemoveInterrupts
+Dsp_RequestUniqueAbility
+Dsp_Reserve
+Dsp_RunSubroutine
+Dsp_SetVectors
+Dsp_TriggerHC
+Dsp_Unlock
+dstate
+DT
+DTA
+Dwritelabel
+Dxopendir
+Dxreaddir
+d_biosdev
+d_devcode
+d_dfs
+d_drive
+d_driver
+d_root
+d_xfs
+

+ +

+E
+E2BIG
+EACCDN
+EACCES
+EADDRINUSE
+EADDRNOTAVAIL
+EADV
+EAFNOSUPPORT
+EAGAIN
+EALREADY
+EAUTH
+EBACKGROUND
+EBADARG
+EBADE
+EBADF
+EBADMSG
+EBADR
+EBADRPC
+EBADRQ
+EBADRQC
+EBADSEC
+EBADSF
+EBADSLT
+EBFONT
+EBREAK
+EBUSY
+ECHILD
+ECHMEDIA
+ECHRNG
+Echtzeit-Selektion
+ECOMM
+ECONNABORTED
+ECONNREFUSED
+ECONNRESET
+ECRC
+ECWD
+ED
+EDCHAR
+EdDI
+EDEADLK
+EDEND
+EDESTADDRREQ
+EDINIT
+EDITABLE
+Editfelder in MagiC
+Editobjekt-Funktionen
+edit_close
+edit_create
+edit_cursor
+edit_delete
+edit_evnt
+edit_get_buf
+edit_get_colour
+edit_get_cursor
+edit_get_dirty
+edit_get_font
+edit_get_format
+edit_get_pos
+edit_get_scrollinfo
+edit_get_sel
+edit_open
+edit_resized
+edit_scroll
+edit_set_buf
+edit_set_colour
+edit_set_cursor
+edit_set_dirty
+edit_set_font
+edit_set_format
+edit_set_pos
+EDOM
+EDOTDOT
+EDQUOT
+EDRIVE
+EDRVNR
+EDSTART
+EDVNRSP
+EERROR
+EEXIST
+EFAULT
+EFBIG
+EFILNF
+EFTYPE
+EGENERIC
+EGENRL
+EgetPalette
+EgetShift
+EGSBF
+EHOSTDOWN
+EHOSTUNREACH
+EIDRM
+Eigenschaft-Funktionen
+EIHNDL
+EILSEQ
+EIMBA
+Ein einfacher Aufruf
+Einfrieren einer Applikation
+Eingabefelder in MagiC
+Eingabefunktionen
+Einklinken in den Reset-Vektor
+Einleitung
+EINPROGRESS
+Einschränkungen von MagiC Mac
+EINSERT
+EINTERNAL
+EINTR
+EINTRN
+EINVAL
+EINVFN
+Einzugschacht des Druckers
+EIO
+EISCONN
+EISDIR
+EL2HLT
+EL2NSYNC
+EL3HLT
+EL3RST
+ELIBACC
+ELIBBAD
+ELIBEXEC
+ELIBMAX
+ELIBSCN
+ELNRNG
+ELOCKED
+ELOOP
+EMEDIA
+EMEDIUMTYPE
+EMFILE
+EMLINK
+EMOUNT
+Empfohlene Partitiontypen
+emphasis
+EMSGSIZE
+Emulatoren
+EMULTIHOP
+EmuTOS, Ermitteln von
+ENAMETOOLONG
+ENAVAIL
+END_MCTRL
+end_os
+End_Process
+END_UPDATE
+ENEEDAUTH
+ENETDOWN
+ENETRESET
+ENETUNREACH
+ENFILE
+ENHNDL
+ENMFIL
+ENMFILES
+ENOANO
+ENOBUFS
+ENOCSI
+ENODATA
+ENODEV
+ENOENT
+ENOEXEC
+ENOLCK
+ENOLINK
+ENOMEDIUM
+ENOMEM
+ENOMSG
+ENONET
+ENOPKG
+ENOPROTOOPT
+ENOSPC
+ENOSR
+ENOSTR
+ENOSYS
+ENOTBLK
+ENOTCONN
+ENOTDIR
+ENOTEMPTY
+ENOTNAM
+ENOTSOCK
+ENOTTY
+ENSAME
+ENSLOCK
+ENSMEM
+Entwicklungssysteme
+Entwicklungssysteme, APL
+Entwicklungssysteme, Assembler
+Entwicklungssysteme, Basic
+Entwicklungssysteme, C
+Entwicklungssysteme, C++
+Entwicklungssysteme, Fortran77+
+Entwicklungssysteme, funktionale
+Entwicklungssysteme, Modula
+Entwicklungssysteme, Oberon
+Entwicklungssysteme, Pascal
+Entwicklungssysteme, RCS
+ENUMMODE_CONT
+ENUMMODE_EXIT
+Environment des AES manipulieren
+Environment-Strings, Zeiger auf
+Environmentvariable OEPMANAGER
+Environmentvariable OLEMANAGER
+Environmentvariable OLGAMANAGER
+ENXIO
+EOPNOTSUPP
+EOTHER
+EOVERFLOW
+EPAPER
+EPERM
+EPFNOSUPPORT
+EPIPE
+EPLFMT
+EPROCLIM
+EPROCUNAVAIL
+EPROGMISMATCH
+EPROGUNAVAIL
+EPROTO
+EPROTONOSUPPORT
+EPROTOTYPE
+EPTHNF
+EPTHOV
+ERANGE
+EREADF
+Ereignisverwaltung
+EREMOTE
+EREMOTEIO
+ERESTART
+EROFS
+ERPCMISMATCH
+ERRINFO
+ERROR
+errorcode
+Erweiterte Grafikfunktionen
+Erweiterte Shellfunktionen
+ESBLOCK
+Escapefunktionen
+Escapesequenzen
+ESCCANCEL
+ESECNF
+ESECTOR
+EsetBank
+EsetColor
+EsetGray
+EsetPalette
+EsetShift
+EsetSmear
+ESHUTDOWN
+ESNDLOCKED
+ESNDNOTLOCK
+ESOCKTNOSUPPORT
+ESPIPE
+ESRCH
+ESRMNT
+ESTALE
+ESTRPIPE
+ES_ACK
+ES_COMPILE
+ES_EXEC
+ES_INIT
+ES_LINK
+ES_MAKE
+ES_MAKEALL
+ES_MAKEEXEC
+ES_OK
+ES_PROJECT
+ES_QUIT
+ES_SHLCTRL
+ETIME
+ETIMEDOUT
+ETOOMANYREFS
+etv_critic
+etv_term
+etv_timer
+etv_xtra
+ETXTBSY
+EUCLEAN
+EUKCMD
+EUNATCH
+EUNCMD
+EUNDEV
+EUSERS
+EVENT
+Event-CPX
+EVNT
+evnt_button
+evnt_dclick
+evnt_dclicks
+evnt_keybd
+evnt_mesag
+evnt_mouse
+evnt_multi
+Evnt_Signal
+evnt_timer
+Evnt_Wait
+ev_adrerr
+ev_a_line
+ev_buserr
+ev_chk_ofl
+ev_divby0
+ev_illegal
+ev_priverr
+ev_reset
+ev_trace
+ev_trapv
+EWOULDBLOCK
+EWRITE
+EWRITF
+EWRPRO
+Example: no|Link's XAcc protocol
+Exceptions unter MagiC Mac
+EXCPT
+EXDEV
+exec_os
+EXFULL
+EXIT
+ext
+ExtCatMsg
+Extended feature
+Extended GEM
+Extended names
+Extended XAcc
+Extended-Fast-RAM-Buffer
+extMac
+ExtRsConf
+E_CHNG
+E_CRC
+E_OK
+E_SEEK
+

+ +

+F
+Faccept
+fading
+FALCON_BITS
+Farbe, Subjektivität der
+Farbicons vorhanden?
+Farbnummer und Pixelwert, VDI-
+Farbtabellenfunktionen
+Fast-RAM, Ende des
+Fast-RAM-Buffer
+Fast-RAM-Buffer, Extended
+fastcut
+Fastload
+fast_read_config_byte
+fast_read_config_longword
+fast_read_config_word
+fast_read_io_byte
+fast_read_io_longword
+fast_read_io_word
+fast_read_mem_byte
+fast_read_mem_longword
+fast_read_mem_word
+Fataler Fehler beim Booten
+Fataler Fehler im AES
+Fataler Fehler im Gemdos
+Fattrib
+Fax-Treiber
+FA_ALERTDONE
+FA_ALERTISOPEN
+FA_FSELCLOSED
+FA_FSELISOPEN
+Fbind
+Fchdir
+Fchmod
+Fchown
+Fchown16
+Fclose
+Fcntl
+Fcntl, CD-ROM-Kommandos für
+Fcntl, File-Kommandos für
+Fcntl, Prozess-Kommandos für
+Fcntl, SharedMem-Kommandos für
+Fcntl, Terminal-Kommandos für
+Fconnect
+fcookie
+Fcreate
+Fdatime
+FDC, Schreibdichte des
+FDC, Vektor für
+Fdelete
+Fdirfd
+Fdup
+fd_attr
+fd_children
+fd_date
+fd_ddev
+fd_dev
+fd_dirch
+fd_dirpos
+fd_dmd
+fd_fpos
+fd_len
+fd_mode
+fd_multi
+fd_multi1
+fd_name
+fd_next
+fd_owner
+fd_parent
+fd_refcnt
+fd_stcl
+fd_time
+fd_unused
+fd_user1
+fd_user2
+Fenster, Desktop-
+Fensterdialoge
+Fensters, Rechteckliste eines
+Fensterverwaltung
+Fernsehnorm, NTSC-
+Fernsehnorm, PAL-
+Ffchmod
+Ffchown
+Ffdopendir
+Fflush
+Fforce
+Ffstat64
+Fgetchar
+Fgetdta
+Fgetpeername
+Fgetsockname
+Fgetsockopt
+File-Deskriptor
+File-Locking möglich?
+FILEPTR
+Fileselektor als Dialog
+Fileselektor im Fenster
+Fileselektoren
+FILESYS
+Filesysteme
+Filesysteme, Faustregel für
+Filesysteme, fremde
+FILE_SELECTED
+FILE_UPDATED
+Filled polygon
+Filled rectangle
+find_pci_classcode
+find_pci_device
+Find_Process
+Find_Queue
+Finstat
+FIOEXECPT
+FIONREAD
+FIONWRITE
+fix31
+FL3DACT
+FL3DBAK
+FL3DIND
+FLAG3D
+Flags eines Programms
+Flags für das Verhalten der Listbox
+FLAT_HAND
+FLG_16BIT
+FLG_32BIT
+FLG_8BIT
+FLG_ENDMASK
+Flink
+Flisten
+Floating-Point-Unit, Typ der
+flock
+Flock
+flock, Fcntl
+Flopfmt
+Floppy, Timeout der
+Floppy-Disk Controler
+Floppy-Parallelbetrieb
+Floprate
+Floprd
+Flopver
+Flopwr
+FlpDrvInfo
+FLP_PAR
+Flydials vorhanden?
+FMD_FINISH
+FMD_GROW
+FMD_SHRINK
+FMD_START
+Fmidipipe
+Fm_add
+FNTS_3D
+fnts_add
+FNTS_BTMP
+fnts_close
+fnts_create
+fnts_delete
+FNTS_DISPLAY
+fnts_do
+fnts_evnt
+fnts_get_info
+fnts_get_name
+fnts_get_no_styles
+fnts_get_style
+FNTS_ITEM
+FNTS_MONO
+fnts_open
+FNTS_OUTL
+FNTS_PROP
+fnts_remove
+fnts_update
+FNT_CHANGED
+FNT_DIALOG
+Font-ID und Index
+Font-Protokoll
+FontGDOS
+Fontselektor–Übersicht
+Fonttyp
+FONT_ACK
+FONT_CHANGED
+FONT_HDR
+FONT_SELECT
+Fopen
+Form-CPX
+Format, DIN A3
+Format, DIN A4
+Format, DIN A5
+Format, DIN B5
+Format, geräteunabhängiges
+Format, Half-
+Format, Hoch-
+Format, Ledger-
+Format, Legal-
+Format, Letter-
+Format, Quer-
+Format, Wide-
+Formate, Papier-
+Formate, Seiten-
+Formatieren im Hintergrund
+Formularfunktionen
+form_alert
+form_button
+form_center
+form_dial
+form_do
+form_error
+form_error in N.AES
+form_keybd
+form_popup
+form_wbutton
+form_wkeybd
+form_xdial
+form_xdo
+form_xerr
+Fortran77+ Entwicklungssysteme
+Foutstat
+Fpipe
+Fpoll
+FPU, Typ der
+Fputchar
+Fragen und Antworten
+Fread
+Freadlink
+Freadv
+Frecvfrom
+Frecvmsg
+Free
+Frename
+Frlock
+Frunlock
+Fseek
+Fseek64
+Fselect
+fsel_boxinput
+FSEL_CALLBACK
+fsel_exinput
+fsel_input
+Fsendmsg
+Fsendto
+Fsetdta
+Fsetsockopt
+Fsfirst
+Fsfirstidx
+Fshutdown
+fslx_close
+fslx_do
+fslx_evnt
+fslx_getnxtfile
+fslx_open
+fslx_set_flags
+FSM-GDOS
+Fsnext
+Fsocket
+Fsocketpair
+FSTAT
+Fstat64
+Fstatus
+Fsymlink
+Fsync
+fs_descr
+FS_INSTALL
+FS_MOUNT
+FS_UNINSTALL
+FS_UNMOUNT
+FTRUNCATE
+Fülltyp-Attribute
+FULLER
+Funktionale Entwicklungssysteme
+Funlock
+Further communication
+FUTIME
+Fwrite
+Fwritev
+Fxattr
+F_DUPFD
+F_GETFD
+F_GETFL
+F_GETLK
+F_lock
+F_SETFD
+F_SETFL
+F_SETLK
+F_SETLKW
+

+ +

+G
+GCBITMAP
+GDOS, AMC-
+GDOS, Familie des
+GDOS, Font-
+GDOS, FSM-
+GDOS, Speedo-
+GDOS-Fonts in Dialogen
+GDOS-Treiber
+GDOS-Treiber, Bildschirm
+GDOS-Treiber, Bit-Image
+GDOS-Treiber, Drucker
+GDOS-Treiber, Fax
+GDOS-Treiber, Grafiktablett
+GDOS-Treiber, Kamera
+GDOS-Treiber, Memory
+GDOS-Treiber, Metafile
+GDOS-Treiber, Plotter
+GDOS_AMC
+GDOS_AMCLIGHT
+GDOS_ATARI
+GDOS_FNT
+GDOS_FSM
+GDOS_NONE
+GDPS, virtuelle Speicherverwaltung
+GDPS: Gerti's Driver Piping System
+GEM
+GEM, Extended
+GEM-Version 1.4, Atari-
+GEM-Version 1.x
+GEM-Version 2.x
+GEM-Version 3.x, Atari-
+GEM-Version 3.x, PC-
+GEM-Version 4.x, Atari-
+GEM/4
+GEM/5
+GEM/XM
+GEMDOS
+gemdos
+GEMDOS, Parameterübergabe im
+GEMDOS, Programmformat unter
+GEMDOS, Versionsnummer
+GEMDOS-Dispatcher
+GEMDOS-Fehlermeldungen
+GEMDOS-Funktionsliste
+GEMDOS-Pufferlisten
+GEMDOS-Strukturen
+gemdos-Trap
+GEMJING_RETURN
+GEM_ALIGN
+GEM_BEZ_QUAL
+GEM_COLOR
+GEM_END_BEZIER
+GEM_END_BGIF
+GEM_END_FILL
+GEM_END_GREY
+GEM_END_GROUP
+GEM_END_JOIN
+GEM_END_SHADOW
+GEM_GRID
+GEM_MUPB
+GEM_NO_LINE_STYLE
+GEM_START_BEZIER
+GEM_START_BGIF
+GEM_START_FILL
+GEM_START_GREY
+GEM_START_GROUP
+GEM_START_JOIN
+GEM_START_SHADOW
+GEM_WIND
+General Rules
+Geneva Funktionen
+Gerätenummer des VDI
+Gerätetreiber, MX_DDEV
+Gerätetreiber, MX_DEV
+Geräteunabhängiges Format
+Get pixel
+GetActiveFeatures
+GetActiveModeDesc
+getBaseMode
+GETboard
+Getbpb
+getcookie
+GetFeatures
+GetFirstRect
+GetHdv_inuse
+Getmpb
+GETMULTI
+GetNextRect
+GetNumberofPModes
+GetPageSize
+GetPMode
+GetRegisterbase
+Getrez
+GETscreen
+GetScreenDescriptor
+Gettime
+Get_blink
+Get_Buffer
+get_card_used
+get_machine_id
+get_pagesize
+get_resource
+get_routing
+GG
+Giaccess
+giveTimeToMac
+global
+Globalfeld des AES
+Glossary
+GM_OPEN_DIALOG
+GM_OPEN_PRGINFO
+GM_SHOW_FILE
+Goto_pos
+GO_PRIVATE
+gpio
+GPU-Done, Vektor für
+Grafikfunktionen
+Grafikspezial-Funktionen
+Grafiktablett-Funktionen
+Grafiktablett-Treiber
+Grafische Übersicht von Fülltyp und Musterindex
+graf_dragbox
+graf_growbox
+graf_handle
+graf_mbox
+graf_mkstate
+graf_mouse
+graf_movebox
+graf_multirubber
+graf_rubberbox
+graf_rubbox
+graf_shrinkbox
+graf_slidebox
+graf_slidebox von Geneva
+graf_watchbox
+graf_wwatchbox
+graf_xhandle
+GRECT
+Größe von Vektorfonts
+Größenfeld der TPA
+Growboxen ausschalten
+Grundlagen des AES
+Grundlagen des VDI
+Guidelines, Style-
+GZ_PRIVATE
+G_BOX
+G_BOXCHAR
+G_BOXTEXT
+G_BUTTON
+G_CICON
+G_CLRICN
+G_DTMFDB
+G_EDIT
+G_EDIT-Objekt, Verwendung
+G_FBOXTEXT
+G_FTEXT
+G_IBOX
+G_ICON
+G_IMAGE
+G_POPUP
+G_SHORTCUT
+G_SLIST
+G_STRING
+G_SWBUTTON
+G_TEXT
+G_TITLE
+G_USERDEF
+G_VECTORS
+G_vectors
+G_WINTITLE
+

+ +

+H
+Half-Format
+HARDCOPY
+Hardcopy-Routine, Zeiger auf
+Hardcopy-Routinen installieren
+hardplay
+hardrec
+Hardware, nicht-ST-kompatible
+Hardware, Typ der
+HARD_CLUT
+Hatari-DHS-XBIOS-Erweiterung
+HatariOption
+HDFUNCS
+hdv_boot
+hdv_bpb
+hdv_init
+hdv_mediach
+hdv_rw
+Header einer Resource-Datei
+Header eines Programms
+HIDDEN
+HIDE
+Hide mouse
+HIDETREE
+HIGHLIGHTED
+highsrate
+Hilfe, kontext-sensitive
+Hilfesystem, Anforderungen ans dieser Dialogbox.
+Hilfesysteme
+Hilfesystemen, Mut zu
+Hilfesystems, Funktionsweise des
+Hintergrund-DMA ausschalten
+Hintergrund-DMA in MagiC
+Hinweis zur Verwendung der GEMDOS-Funktion Super
+Hinweise für Autoren anderer Fontselektoren
+History
+HNDL_CLSD
+HNDL_EDCH
+HNDL_EDDN
+HNDL_EDIT
+HNDL_INIT
+HNDL_MESG
+HNDL_MOVE
+HNDL_OBJ
+HNDL_OPEN
+HNDL_TOPW
+HNDL_UNTP
+Hochformat
+Höhe und Breite von Vektorfonts
+hook_interrupt
+Horizontal line
+Horizontal-Offset-Table
+Hot-Spot
+HOTCLOSEBOX
+HOURGLASS
+How can I tell the viewer what is to be shown?
+How to implement an SPA
+How to implement an SRA
+hrecplay
+HSLIDE
+

+ +

+I
+ICONBLK
+ICONIFIER
+Iconify in MagiC
+Iconify, Algorithmus beim
+Iconify, Elemente nach dem
+Iconify, Größe nach dem
+Iconify, Shortcuts für
+Icons vorhanden?, Farb-
+ICON_MSG
+IKBD-Interrupts, Vektor für
+Ikbdws
+Illegaler Befehl, Vektor für
+Implementing the View protocol
+INDBUTCOL
+INDIRECT
+INFO
+Initialization
+Initmouse
+init_hplay
+init_hplaypeak
+init_hrec
+init_hrecpeak
+init_hrppeak
+init_ihplaymix
+init_imemplay
+init_imemrec
+init_implaymix
+init_mplaypeak
+init_mrecpeak
+init_mrppeak
+init_peak
+Init_Process
+init_xmemplay
+init_xmemplay4
+init_xmemrec
+init_xmemrec4
+init_xmixplay
+Ink
+Inquiry-Protokoll
+Install
+Installation eines DFS
+installed
+Ins_line
+intact
+INTEL_BITS
+Interactive Service
+INTERLEAVE_PLANES
+Interrupt, BUSY-
+Interrupt, CTS-
+Interrupt, DCD-
+Interrupt, IKBD-
+Interrupt, MFP-TT
+Interrupt, MIDI-
+Interrupt, SCC-TT
+Interruptfunktionen
+intin
+intout
+intrLock
+int_in
+int_out
+Invisible Service
+Ioqueue
+Iorec
+IOREC
+iovec
+IP_DIAL_DONE
+IP_DIAL_ERROR
+IP_DIAL_HANGUP
+IP_DIAL_REQUEST
+IP_HANGUP_DONE
+IP_STATUS_GET
+IRS
+is_EdDI
+ITIMER_PROF
+ITIMER_REAL
+ITIMER_VIRTUAL
+

+ +

+J
+Janus
+Jdisint
+Jenabint
+JINNEE_MSG
+

+ +

+K
+Kamera-Treiber
+KAOS-TOS
+Kbdvbase
+KBDVBASE
+Kbrate
+Kbshift
+kcl_hook
+Kein interner Speicher mehr
+Kernelfunktionen für ein XFS
+Kerning
+Kerning Parameter
+Kerning, Pair-
+Kerning, Track-
+KER_DOSLIMITS
+KER_DRVSTAT
+KER_GETINFO
+KER_INSTXFS
+KER_INTGARBC
+KER_INTMAVAIL
+KER_SETWBACK
+KER_XFSNAME
+KEYBDPARMS
+KEYCODE
+KEYTAB
+Keytbl
+kill_disk
+Klemmbrett, Datenaustausch per
+Klemmbrett-Funktionen
+Klick, Doppel-
+Klicks, Mehrfach-
+KOBOLD_ANSWER
+KOBOLD_CLOSE
+KOBOLD_CONFIG
+KOBOLD_FIRST_SLCT
+KOBOLD_FREE_DRIVES
+KOBOLD_JOB
+KOBOLD_JOB_NO_WINDOW
+KOBOLD_NEXT_SLCT
+Kommandozeilen, erweiterte
+Komponenten eines Fensters
+Konstanten zur Videohardware des Falcons
+Kontakt
+Kontaktaufnahme
+Kontext-Sensitive Hilfe
+Kontext-Sensitive Menüs
+Kontrollfunktionen
+Koordinaten, NDC-
+Koordinaten, normalisierte
+Koordinaten, Raster-
+Koordinaten, RC-
+Koordinatensysteme des VDI
+Kopf einer Resource-Datei
+Kopien einer Druckseite
+Koprozessor, mathematischer
+Kurzzeitgedächtnis, Kapazität des
+

+ +

+L
+LASTOB
+Laufwerke des BIOS, angemeldete
+Laufwerksfunktionen
+LBOX_2SLDRS
+lbox_ascroll_to
+LBOX_AUTO
+LBOX_AUTOSLCT
+lbox_bscroll_to
+lbox_cnt_items
+lbox_create
+lbox_delete
+lbox_do
+lbox_free_items
+lbox_free_list
+lbox_get_afirst
+lbox_get_avis
+lbox_get_bentries
+lbox_get_bfirst
+lbox_get_bvis
+lbox_get_first
+lbox_get_idx
+lbox_get_item
+lbox_get_items
+lbox_get_slct_idx
+lbox_get_slct_item
+lbox_get_tree
+lbox_get_udata
+lbox_get_visible
+LBOX_ITEM
+LBOX_REAL
+lbox_scroll_to
+lbox_set_asldr
+lbox_set_bentries
+lbox_set_bsldr
+lbox_set_items
+lbox_set_slider
+LBOX_SHFT
+LBOX_SNGL
+LBOX_TOGGLE
+lbox_update
+LBOX_VERT
+LC_CLOSEWIN
+LC_OPENWIN
+LC_OUTBUF
+LC_WRCHAR
+LC_WRSTR
+Ledger-Format
+Legal-Format
+Letter-Format
+LFARROW
+LINE
+Line-A
+Line-A, Vektor für
+Line-F, Vektor für
+LINEA
+Line_feed
+Linien-Attribute
+Linking, Object-
+List of prospective SSP-implementing software to date
+Listboxen
+Listboxen im Dialog
+LIST_BOX
+Literatur zum TOS-Betriebssystem
+LK3DACT
+LK3DIND
+load_disk
+Load_pos
+Load_Process
+locksnd
+Löschen des CPU-Caches
+Logbase
+LongWordFromLink
+LongWordToLink
+Lookup-Table
+ltchars
+LTL-Protokoll
+

+ +

+M
+macAppSwitch
+Maccess
+MacVersion
+Maddalt
+MagiC
+MagiC Funktionen
+MagiC Mac und Power-Macs
+MagiC Mac, Cookie von
+MagiC Mac-Spezifika
+MagiC Mac-Typvereinbarungen
+MagiC PC-Schnittstelle
+MagiC, Accessories in
+MagiC, ARGV-Verfahren in
+MagiC, Aufbau eines DFS in
+MagiC, Aufbau eines XFS in
+MagiC, Bootprogramme für
+MagiC, Cookie von
+MagiC, DFS-Konzept in
+MagiC, Speicherverwaltung in
+MagiC, XFS-Konzept in
+MagiC-Flydials vorhanden?
+MagiC-Tastaturtab. vorhanden?
+MAGX.INF-Datei von MagiC
+MAGXBOOT
+MAGXCONF
+MAGX_COOKIE
+MAGX_COOKIE, status_bits
+MailMerge-Protokoll
+Major Device Number
+Malloc
+Mapping
+MAPTAB
+MAP_ASCII
+MAP_DIRECT
+Markierungs-Attribute
+Maschinen-Name
+Maschinentyp
+Massign
+MatGraph - TCxx
+mathematischer Koprozessor
+MATRIX-XBIOS-Erweiterung
+MatScreen - Cxx
+Mausform, Bedeutung der
+Mausform, Faustregel für
+Mausformen
+Mausformverwaltung, Art der
+Mausklick und Tastatur
+Mausklicks und Formen
+MC680x0-Cache löschen
+MCB
+MD
+MD-Struktur, Zeiger auf
+mec0 (MPS) Schnittstelle
+mec1 Schnittstelle
+mec2 Schnittstelle
+mec3 Schnittstelle
+mecnvdi Schnittstelle
+Media-Change-Status bestimmen
+Mediach
+MEDIA_SIZE
+MEDIA_TYPE
+Mehrfach-Klicks
+memcntrl
+Memory-Control-Block (MCB) in MagiC
+Memory-Deskriptor (MD) in TOS
+Memory-Protection
+Memory-Protection, Global-
+Memory-Protection, nur lesbar
+Memory-Protection, Private-
+Memory-Protection, Super-
+Memory-Treiber
+memplay
+memrec
+memval2
+memval3
+memvalid
+Mem_share
+MENU
+MENUBAR
+Menüfunktionen
+Menuefunktionen
+Menüfunktionen, erweiterte
+Menüs in Fenstern
+Menüs und Menüzeilen
+Menüs, Drei Punkte in
+Menüs, Gestaltung von
+Menüs, kontext-sensitive
+Menüs, scrollbare
+Menüs, Untergruppen in
+Menüs, Vorteil bei Popup-
+Menütiteln, Abgrenzung von
+Menüzeile, Standardaufbau der
+menu_attach
+menu_bar
+menu_click
+MENU_GETMODE
+MENU_HIDDEN
+MENU_HIDE
+menu_icheck
+menu_ienable
+MENU_INIT
+MENU_INSTL
+menu_istart
+menu_popup
+MENU_PULLDOWN
+menu_register
+MENU_SETMODE
+menu_settings
+MENU_SHADOWED
+MENU_SHOW
+menu_text
+menu_tnormal
+menu_unregister
+MENU_UPDATE
+Message
+Message group 1
+Message group 2
+Metaclose
+Metadiscinfo
+MetaDOS
+MetaDOS-Funktionen
+Metafile Sub-Opcodes
+Metafile-Format
+Metafile-Funktionen
+Metafile-Treiber
+Metafile-Version
+Metagettoc
+Metainit
+Metaioctl
+Metaopen
+Metaread
+Metaseek
+Metasetsongtime
+Metastartaudio
+Metastatus
+Metastopaudio
+Metawrite
+META_DRVINFO
+META_HEADER
+META_INFO_1
+META_INFO_2
+MFDB
+MFORM
+MFP-TT-Interrupt-Vektor
+Mfpint
+Mfree
+MFsave
+MGCOPY
+MGFORMAT
+MgMcCookie
+MGSEARCH
+MIDI-Interrupts, Vektor für
+MidiShare
+Midiws
+MinA
+Mindestfunktionsumfang für Bildschirmtreiber
+Mindestfunktionsumfang für Drucker-Treiber
+Mindestfunktionsumfang für Kamera-Treiber
+Mindestfunktionsumfang für Metafile-Treiber
+Mindestfunktionsumfang für Plotter-Treiber
+Minor Device Number
+minStackSize
+MiNT, Cookie von
+MiNT-Domain
+MiNT-kompatible Funktionen
+MINWINOBJ
+mix
+MI_MAGIC
+mmc_flg1_bit4
+mmc_flg1_bit5
+MN_SELECTED
+MN_SET
+Modale Dialogboxen
+mode24
+modeAtari
+modeMac
+Modula-Entwicklungssysteme
+MOD_DESC
+mögliche Filetypen
+monitor
+Monitor-Detect, Vektor für
+mon_type
+MOUSE
+MOUSE_INIT
+MOVER
+MPB
+mps_base.cpp
+mps_base.def
+mps_base.h
+mps_demo.cpp
+mps_demo.h
+MPS_magicinfo
+MP_ACK
+MP_NAK
+MP_SHUTDOWN
+MP_START
+MP_STOP
+MRETS
+msghdr
+MSG_CT60_TEMP
+MSG_NOEVENT
+Mshrink
+mshrink
+MU
+Much, Thomas
+MultiMon
+Multitasking GEM versions
+Multitasking preemptive?
+Multitasking vorhanden?
+Multitasking, Zeitscheiben für
+Musterindex-Tabelle
+mutimbuf
+MU_BUTTON
+MU_DYNAMIC_KEYBD
+MU_KEYBD
+MU_KEYBD4
+MU_M1
+MU_M2
+MU_MESAG
+MU_MX
+MU_NORM_KEYBD
+MU_TIMER
+MU_WHEEL
+MV
+Mvalidate
+Mvars
+Mxalloc
+mxk_act_appl
+mxk_act_pd
+mxk_appl_begcritic
+mxk_appl_endcritic
+mxk_appl_IOcomplete
+mxk_appl_suspend
+mxk_appl_yield
+mxk_diskchange
+mxk_DMD_rdevinit
+mxk_evnt_IO
+mxk_evnt_mIO
+mxk_evnt_sem
+mxk_fast_clrmem
+mxk_int_malloc
+mxk_int_mfree
+mxk_int_msize
+mxk_keyb_app
+mxk_mfree
+mxk_mxalloc
+mxk_pe_slice
+mxk_pe_timer
+mxk_Pfree
+mxk_proc_info
+mxk_resv_intmem
+mxk_toupper
+mxk_version
+mxk__sprintf
+Mxmask
+MX_DEV_INSTALL
+MX_DFS_GETINFO
+MX_DFS_INSTDFS
+MX_DOSLIMITS
+MX_ENABLE3D
+MX_KERNEL
+MX_KER_DOSLIMITS
+MX_KER_DRVSTAT
+MX_KER_GETINFO
+MX_KER_INSTXFS
+MX_KER_XFSNAME
+MX_MENUCOL
+mycopybit
+MYOSD_DISPLAY
+MYOSD_NOK
+MYOSD_OK
+MYTASK_BUBBLE_CHANGE
+MYTASK_BUTTON
+MYTASK_CHANGED_OPTIONS
+MYTASK_DELETE_ICON
+MYTASK_GET_SIZE
+MYTASK_ICON_CLICK
+MYTASK_ICON_ERROR
+MYTASK_NAME
+MYTASK_NEW_COLOR
+MYTASK_NEW_ICON
+MYTASK_NEW_WINDOW
+MYTASK_SEND_OPTIONS
+MYTASK_START
+M_FORCE
+M_LAST
+M_OFF
+M_ON
+M_PREVIOUS
+M_RESTORE
+M_SAVE
+

+ +

+N
+N.AES
+Nachrichten
+Nachrichten der Shell an den Editor
+Nachrichten der Shell an den Loader
+Nachrichten des Editors an die Shell
+Nachrichten des Loaders an die Shell
+Nachrichten-Liste
+nAES, Cookie von
+NAME
+Name eines Prozesses
+NAP BioNet100
+nap_in_s
+nap_io
+nap_out_s
+NDC-Koordinaten
+netinfo
+Netzwerk
+Netzwerkerweiterung vorhanden?
+Netzwerkfunktionen
+Neu in dieser Version
+new_client
+NFOLLOWSLKS
+NKCC
+NM_INHIBIT_HIDE
+Non-Volatile-Memory, Belegung des
+normalisierte Koordinaten
+Normalized Key Code Converter
+NO_CLUT
+NSoundcmd
+Null-Cookie
+nvbls
+NVDI
+NVDI, Cookie von
+NVDIMac
+NVDI_STRUC
+Nversion
+NVM, im Milan
+NVMaccess
+N_AES.CNF
+N_AESINFO
+

+ +

+O
+Oberon-Entwicklungssysteme
+objc_add
+objc_change
+OBJC_CHANGED
+objc_data
+objc_delete
+OBJC_DRAGGED
+objc_draw
+objc_edit
+OBJC_EDITED
+objc_find
+objc_offset
+objc_order
+objc_setscroll
+OBJC_SIZED
+objc_sysvar
+objc_wchange
+objc_wdraw
+objc_wedit
+objc_xedit
+objc_xfind
+OBJECT
+Object-Linking
+Objektarten des AES
+Objektfarben des AES
+Objektflags des AES
+Objektfunktionen
+Objektstati des AES
+Objekttypen des AES
+OBNCOMM
+OBNL
+OB_PREFER
+OEPMANAGER, Environmentvariable
+OEP_CHANGED
+OEP_CONFIG
+OEP_DATA
+OEP_INFO
+OEP_LINK
+OEP_OK
+OEP_RES
+OEP_RES0
+OEP_RES1
+OEP_RES2
+OEP_RES3
+OEP_RES4
+OEP_RES5
+OEP_RES6
+OEP_RES7
+OEP_RES8
+OEP_RES9
+OEP_SERV
+OEP_SERVJOB
+OEP_TAKEOVER
+OEP_UPDATE
+Off-Screen-Bitmaps
+Offgibit
+OHEADER
+OLEMANAGER, Environmentvariable
+OLEMANGR
+OLE_EXIT
+OLE_INIT
+OLE_NEW
+OLGA-Client
+OLGA-Info-Dateiformat
+OLGA-Initialisierung
+OLGA-Protokoll
+OLGA-Server
+OLGABlockHeader
+OLGAInfHeader
+OLGAMANAGER, Environmentvariable
+OLGA_BREAKLINK
+OLGA_BREAKLINK, Antwort auf
+OLGA_CLOSEDOC
+OLGA_CLOSEDOC, Antwort auf
+OLGA_GETINFO
+OLGA_INFO
+OLGA_INFO, Antwort auf
+OLGA_INIT
+OLGA_LINK
+OLGA_LINK, Antwort auf
+OLGA_LINKBROKEN
+OLGA_LINKRENAMED
+OLGA_OPENDOC
+OLGA_RENAME
+OLGA_RENAME, Antwort auf
+OLGA_RENAMELINK
+OLGA_START
+OLGA_START, Antwort auf
+OLGA_START, Antwort2 auf
+OLGA_UNLINK
+OLGA_UNLINK, Antwort auf
+OLGA_UPDATE
+OLGA_UPDATE, Antwort auf
+OLGA_UPDATED
+OLS_EXTENSION
+OLS_NAME
+OLS_TYPE
+OL_CLIENT
+OL_MANAGER
+OL_OEP
+OL_PEER
+OL_PIPES
+OL_SERVER
+OL_START
+Omega-Color-CAD
+Ongibit
+Optische und akustische Rückmeldungen
+Oscanis
+Oscanpatch
+Oscanphy
+Oscanscr
+Oscanswitch
+Oscantab
+Oscanvb
+OSHEADER
+OUTLINED
+OUTLN_CROSS
+OUTPUT-Format
+OVERPATCH
+OverScan, Cookie von
+OverScan-XBIOS-Erweiterungen
+

+ +

+P
+PaCifiST
+PACKEDPIX_PLANES
+Pair-Kerning
+palmode
+Paper
+Papierformate
+Papierschacht des Druckers
+Parallelbetrieb der Floppy
+Paralleles Starten von Programmen
+Parameterblock des AES
+Parameterblock des VDI
+Parameterübergabe im BIOS
+Parameterübergabe im GEMDOS
+Parameterübergabe im XBIOS
+PARMBLK
+Partitiontyp RAW
+Partitiontyp, BGM
+Partitiontyp, F32
+Partitiontyp, GEM
+Partitiontyp, LNX
+Partitiontyp, MAC
+Partitiontyp, MIX
+Partitiontyp, QWA
+Partitiontyp, SWP
+Partitiontyp, UNX
+Pascal-Entwicklungssysteme
+Patch, POOLFIX3
+Patch, STEFIX
+Patch, VDIFIX-
+pathset
+Pattern-Runs
+patternrectdata
+Pattrib
+Pause
+PA_EXIT
+PBASEADDR
+PBDEF
+PCI-BIOS
+PCI-BIOS Fehlercodes
+PCI_BAD_HANDLE
+PCI_BAD_REGISTER_NUMBER
+PCI_BAD_VENDOR_ID
+PCI_BIOS_NOT_INSTALLED
+PCI_BIOS_WRONG_VERSION
+PCI_BUFFER_TOO_SMALL
+PCI_DEVICE_NOT_FOUND
+PCI_FUNC_NOT_SUPPORTED
+PCI_GENERAL_ERROR
+PCI_RSC_DESC
+PCI_SET_FAILED
+PCI_SUCCESSFUL
+PCTXTSIZE
+PD
+PDF_AV_CLOSE_FILE
+PDF_AV_FIND_WORD
+PDF_AV_GET_INFO
+PDF_AV_OPEN_FILE
+PDF_AV_PRINT_FILE
+PDF_AV_SHOW_INFO
+PDLG_3D
+pdlg_add_printers
+pdlg_add_sub_dialogs
+PDLG_CANCEL
+pdlg_close
+pdlg_create
+pdlg_delete
+pdlg_dflt_settings
+pdlg_do
+pdlg_evnt
+pdlg_free_settings
+pdlg_get_setsize
+PDLG_HNDL
+PDLG_INIT
+pdlg_new_settings
+PDLG_OK
+pdlg_open
+pdlg_remove_printers
+pdlg_remove_sub_dialogs
+PDLG_RESET
+pdlg_save_default_settings
+PDLG_SUB
+pdlg_update
+pdlg_use_settings
+pdlg_validate_settings
+Pdomain
+PE
+peakshake
+peaksuch
+PENGUIN_Reply
+PENGUIN_Version
+Pexec
+PFB_FONT
+Pfindpid
+PFONTINFO
+Pfork
+PFSTAT
+Pgetauid
+Pgetegid
+Pgeteuid
+PGETFLAGS
+Pgetgid
+Pgetgroups
+Pgetpd
+Pgetpgrp
+Pgetpid
+Pgetppid
+Pgetpriority
+Pgetuid
+PH
+Physbase
+phystop
+phys_to_virt
+ph_prgflags
+Pipes
+Pipes, Test auf
+pixelorientiertes Bildformat
+Pixelwert und VDI-Farbnummer
+Pkill
+planeorientiertes Bildformat
+playmode
+playstat
+PLOADINFO
+ploadinfo
+Plotter-Treiber
+Pmaxmem
+pmem_size
+PMMUversion
+PMODE
+Pmsg
+Pname
+Pnice
+POINT16
+POINT32
+POINT_HAND
+Polaroid-Funktionen
+Poll Descriptor
+POLLFD
+POOLFIX3-Patch
+POPINFO
+Popup
+Popup-Menüs, Vorteil eines
+POPUP_CHANGED
+Positionierung von Vektortext
+PowerDOS
+Ppriority
+PPROCADDR
+Pprocinf
+Präemptives Multitasking?
+Prenice
+PrintDesc
+PRIO_MAX
+PRIO_MIN
+PRIO_PGRP
+PRIO_PROCESS
+PRIO_USER
+Privilegverletzung, Vektor für
+PRN_CHANGED
+PRN_DIALOG
+PRN_ENTRY
+PRN_MODE
+PRN_SETTINGS
+PRN_SWITCH
+PRN_TRAY
+Probleme bei wind_calc in Toolbar-Fenstern
+Process-Descriptor (PD) bzw. BASEPAGE
+PROC_CREATE
+proc_create
+proc_delete
+proc_info
+proc_malloc
+proc_mfree
+proc_run
+proc_setblock
+proc_shrink
+proc_switch
+Programmheader
+Programmierrichtlinen
+Programmstart und TPA
+Programmübersicht
+prop_del
+prop_get
+prop_gui_get
+prop_gui_set
+prop_put
+Protection, Memory-
+Protobt
+Protocol, View
+Protokoll, AV-
+Protokoll, DHST
+Protokoll, Document-History-Protokoll
+Protokoll, Drag&Drop-
+Protokoll, Virtual-Screen-Protokoll
+Protokoll, XSSI-Protokoll
+Protokolle
+Prozess, Umschalten auf einen
+Prozesses, Auftauen eines
+Prozesses, Einfrieren eines
+Prozesses, Name eines
+Prozessfunktionen
+Prozessortyp
+Prozessverwaltung
+Prtblk
+prt_cnt
+PRT_MSG
+Prusage
+prv_aux
+prv_auxo
+prv_lst
+prv_lsto
+Pr_Assign
+Psemaphore
+Psetauid
+Psetegid
+Pseteuid
+PSETFLAGS
+Psetgid
+Psetgroups
+Psetlimit
+Psetpgrp
+Psetpriority
+Psetregid
+Psetreuid
+Psetuid
+Psigaction
+Psigblock
+Psigintr
+Psignal
+Psigpause
+Psigpending
+Psigreturn
+Psigsetmask
+Psysctl
+Pterm
+Pterm0
+Ptermres
+Ptrace
+PTRACEGFLAGS
+PTRACESFLAGS
+ptsin
+ptsout
+PT_ATTACH
+PT_CONTINUE
+PT_DETACH
+PT_KILL
+PT_READ_D
+PT_READ_I
+PT_SYSCALL
+PT_TRACE_ME
+PT_WRITE_D
+PT_WRITE_I
+Pufferlisten des GEMDOS
+Pull-Down-Menüs einschalten
+Pumask
+Puntaes
+PUN_INFO
+pun_ptr
+Pure C und `cdecl'
+Purpose of XAcc
+Puserid
+Pusrval
+Put pixel
+Pvector
+Pvfork
+Pwait
+Pwait3
+Pwaitpid
+pxyarray
+P_getpid
+P_getppid
+P_nice
+

+ +

+Q
+Quelltext, AES im
+Querformat
+Queue_Info
+QUIT_MSG
+Quoting im AV-Protokoll
+Q_message
+

+ +

+R
+ramtop
+ramvalid
+Random
+Rasterformate
+Rasterfunktionen
+Rasterkoordinaten
+RBUTTON
+RC-Koordinaten
+RCS-Entwicklungssysteme
+ReadMode
+readsmp
+read_config_byte
+read_config_longword
+read_config_word
+read_dclk
+read_dconv
+read_dpath1
+read_dpath2
+read_dpdat
+read_dport
+read_io_byte
+read_io_longword
+read_io_word
+read_mem_byte
+read_mem_longword
+read_mem_word
+Read_Queue
+read_raes
+read_rdsp
+read_rhi
+read_rint
+read_rlow
+Rechnerfamilie
+recmode
+recplay
+recstat
+RECT16
+RECT32
+recwait
+Redraw und Updating von Toolbars
+Registers
+Relokationstabelle
+Remote-Mailmerge-Protokoll
+Replace-Modus
+Request/Reply-Protokoll
+RESCH_COMPLETED
+Reset-Vektor, Einklinken in
+Reset: PC Vektor
+Reset: SSP Vektor
+ResetScreen
+Resource-Format, neues
+Resource-Header
+Resource-Kopf
+Resourcedateien, Größe von
+Resourcefunktionen
+resvalid
+resvector
+Return
+Reverse Transparent-Modus
+Revisions–History
+Rev_off
+Rev_on
+RG
+RGB_LIST
+Richtlinien für CPX-Module
+Ring-Indicator, Vektor
+Rotation
+rregen
+RS232 Empfangsfehler, Vektor
+RS232 Empfangspuffer voll, Vektor
+RS232 Sendefehler, Vektor
+RS232 Sendepuffer leer, Vektor
+Rsconf
+RSC_IO
+RSC_LAST
+RSC_ROM
+RSDAEMON_MSG
+RSHDR
+rsh_fix
+rsh_obfix
+rsrc_free
+rsrc_gaddr
+rsrc_load
+rsrc_obfix
+rsrc_rcfix
+rsrc_saddr
+RSXHDR
+RTARROW
+Rückmeldungen, akustische
+Rückmeldungen, optische
+Rwabs
+R_BIPDATA
+R_BITBLK
+R_FRIMG
+R_FRSTR
+R_IBPDATA
+R_IBPMASK
+R_IBPTEXT
+R_ICONBLK
+R_IMAGEDATA
+R_OBJECT
+R_OBSPEC
+R_STRING
+R_TEDINFO
+R_TEPTEXT
+R_TEPTMPLT
+R_TEPVALID
+R_TREE
+

+ +

+S
+Salert
+Sauberes Programmieren
+save_disk
+Save_pos
+savptr
+sav_context
+sav_row
+SCANX
+SCC-TT-Interrupt-Vektor
+Schnittstellenprogrammierung
+Schreibdichte des FDC
+Schreibmodus
+sclock
+scmsmode
+Sconfig
+Scookie
+SCRAP_CSV
+SCRAP_DCA
+SCRAP_GEM
+SCRAP_IMG
+SCRAP_NOTOK
+SCRAP_OK
+SCRAP_OPEN
+SCRAP_TXT
+SCRAP_UPDT
+SCRAP_USR
+SCRCLIPMEMBLK
+SCRCOPYMEMBLK
+Scrdmp
+SCREEN
+SCREEN, OverScan
+Screen-Manager, ID des
+Screen-Manager, Name des
+SCREENINFO
+screenpt
+SCRFILLMEMBLK
+SCRINFO_OK
+SCRLINEMEMBLK
+SCRMEMBLK
+scrollende Eingabefelder
+SCROLLER
+Scroll_up
+scrp_clear
+scrp_read
+scrp_write
+SCRTEXTUREMEMBLK
+scr_dump
+SC_CHANGED
+SE-Protokoll
+Seedfill
+seekrate
+Seitenformate
+Selbstmodifizierender Code
+SELECTABLE
+SELECTED
+Selektion per Gummiband
+Selektion per Maus
+Selektion per Shift-Maus
+Selektion, Echtzeit-
+Selektionen
+Semaphore
+Semaphore, _DMA
+Semaphore, _NCR
+Semaphore, _SCR
+Semaphoren in MagiC
+SEMENUINFO
+SEM_CREATE
+SEM_CSET
+SEM_DEL
+SEM_FREE
+SEM_GET
+SEM_SET
+SEM_TEST
+Send
+SEND_TRACE
+Server debug mode
+Server minimal
+Server registration
+Service
+Services
+SetAnalyse
+setbuffer
+Setcolor
+Setexc
+setinterrupt
+SetLinkAdr
+setmode
+SetMon
+setmontracks
+SetPageMode
+Setpalette
+Setprt
+SetReset
+Setscreen
+Setscreen, ct60
+Setscreen, Milan
+Settime
+SETTINGS
+settracks
+Set_blink
+set_card_used
+Set_Evnt_Mask
+set_interrupt
+SET_ITEM
+SE_ACK
+SE_CLOSE
+SE_ERRFILE
+SE_ERROR
+SE_INIT
+SE_MENU
+SE_OK
+SE_OPEN
+SE_PROJECT
+SE_QUIT
+SE_TERMINATE
+sgttyb
+SHADOWED
+Shared Libraries
+Shared memory
+Shared-Text
+Shellfunktionen
+SHELTAIL
+SHELW
+shel_envrn
+shel_find
+shel_get
+shel_help
+shel_put
+shel_rdef
+shel_read
+shel_wdef
+shel_write
+shel_write und Single-TOS
+SHMGETBLK
+SHMSETBLK
+Shortcuts, genormte
+Shortcuts, Liste der
+Shortcuts, nicht genormte
+Shortcuts, reservierte
+SHOW
+Show mouse
+SHOW8P3
+SHP_HELP
+Shrinkboxen ausschalten
+Shutdown
+SHUTDOWN
+Shutdown abbrechen
+Shutdown in MagiC
+Shutdown in MagiC Mac
+Shutdown in MultiTOS
+Shutdown Modus
+Shutdown, partieller
+Shutdown, vollständiger
+SHUTDOWN.INF
+SHUT_BOOT
+SHUT_COLD
+SHUT_COMPLETED
+SHUT_HALT
+SHUT_POWER
+SH_CHANGED
+SH_WDRAW
+SIGABRT
+sigaction
+SIGALRM
+SIGBUS
+SIGCHLD
+SIGCONT
+SIGFPE
+SIGHUP
+SIGILL
+SIGINT
+SIGIO
+SIGKILL
+Signale
+Signale, Liste der
+Signalhandler in MagiC
+SIGNULL
+SIGPIPE
+SIGPRIV
+SIGPROF
+SIGPWR
+SIGQUIT
+SIGSEGV
+SIGSTOP
+SIGSYS
+SIGTERM
+SIGTRAP
+SIGTSTP
+SIGTTIN
+SIGTTOU
+SIGURG
+SIGUSR1
+SIGUSR2
+SIGVTALRM
+SIGWINCH
+SIGXCPU
+SIGXFSZ
+Sig_intercept
+Single-Modus
+Single-tasking GEM versions
+SizeComp
+SIZER
+Slbclose
+Slbopen
+SLCT_ITEM
+Sleep
+SliceFromLink
+SliceToLink
+SLIDER_CHANGED
+Sl_arrow
+Sl_dragx
+Sl_dragy
+Sl_size
+Sl_x
+Sl_y
+Smalloc
+Smart-Redraw
+Smart-Redraw ausschalten
+SM_M_SPECIAL
+SNDLOCKED
+SNDNOTLOCK
+sndstatus
+sockaddr
+SOFT_CLUT
+Solid-Runs
+solidrectdata
+SORTBYDATE
+SORTBYNAME
+SORTBYNONE
+SORTBYSIZE
+SORTBYTYPE
+SORTDEFAULT
+Sound-Funktionen
+soundcmd
+Soundhardware
+Soundmöglichkeiten
+Soundroutinen
+SPA
+special_cycle
+SpeedoGDOS
+SPEEDO_FONT
+Speicher erweitern, internen
+Speicherblock zerstört
+Speicherschutz, Global-
+Speicherschutz, Modi beim
+Speicherschutz, nur lesbar
+Speicherschutz, Privat-
+Speicherschutz, Super-
+Speicherverwaltung
+Speicherverwaltung in MagiC
+Speicherverwaltung in TOS
+Spezialbefehle
+Spezialeffekte
+Spezialfunktionen
+Spezielle Fehlermeldungen von MagiC
+Sprache des Betriebssystems
+Spurious-Interrupt, Vektor für
+SRA
+Srealloc
+SS
+Ssbrk
+sshiftmd
+SSP changes
+SSP message pipeline
+SSP messages
+SSP Server registration
+SSP-Server
+SSP_COMPRESSFILE
+SSP_CONTEXT
+SSP_DISPLAYINFO
+SSP_DISPLAYMESSAGE
+ssp_init
+SSP_SENDFILE
+SSP_SENDMESSAGE
+SSP_SPASA
+SSP_SPASI
+SSP_SRASR
+SSP_SSA
+SSP_SSIR
+SSP_SSUR
+SSP_STATUSDISPLAY
+SSP_UPLOADFILE
+Ssync
+Ssystem
+Stackframes der CPU
+stackLoad
+stackUnload
+Standardformat des VDI
+STANDARD_BITS
+STANDARD_PLANES
+StarTrack
+Startupcode für Accessories
+STAT
+STAT, dev-Komponente
+STAT, mögliche Filetypen
+STAT, size-Komponente
+STAT, Sticky-Bit
+STAT, Zugriffsrechte
+Steem
+STEFcntrl
+STEFIX-Patch
+STEmulator
+Stop_All
+Stop_Process
+STRT_MSG
+struct sigaction
+struct tty
+Style-Guidelines
+SUBMENU
+Super
+SuperCharger
+Supexec
+Suptime
+Suspend
+Sversion
+SWINFO
+swv_vec
+Syield
+Symbolische Links und das XFS-Konzept
+Symboltabelle
+Sync
+Sysconf
+SYSHDR
+sysreset
+System Services Protocol (SSP)
+Systemauszug (core dump)
+Systemfunktionen
+Systemvariable, bell_hook
+Systemvariable, colorptr
+Systemvariable, conterm
+Systemvariable, con_state
+Systemvariable, criticret
+Systemvariable, defshiftmd
+Systemvariable, end_os
+Systemvariable, etv_critic
+Systemvariable, etv_term
+Systemvariable, etv_timer
+Systemvariable, etv_xtra
+Systemvariable, exec_os
+Systemvariable, flock
+Systemvariable, hdv_boot
+Systemvariable, hdv_bpb
+Systemvariable, hdv_init
+Systemvariable, hdv_mediach
+Systemvariable, hdv_rw
+Systemvariable, kcl_hook
+Systemvariable, memcntrl
+Systemvariable, memval2
+Systemvariable, memval3
+Systemvariable, memvalid
+Systemvariable, nvbls
+Systemvariable, palmode
+Systemvariable, phystop
+Systemvariable, prt_cnt
+Systemvariable, prv_aux
+Systemvariable, prv_auxo
+Systemvariable, prv_lst
+Systemvariable, prv_lsto
+Systemvariable, pun_ptr
+Systemvariable, ramtop
+Systemvariable, ramvalid
+Systemvariable, resvalid
+Systemvariable, resvector
+Systemvariable, sav_context
+Systemvariable, sav_ptr
+Systemvariable, sav_row
+Systemvariable, screenpt
+Systemvariable, scr_dump
+Systemvariable, seekrate
+Systemvariable, sshiftmd
+Systemvariable, swv_vec
+Systemvariable, themd
+Systemvariable, the_env
+Systemvariable, trp14ret
+Systemvariable, vblsem
+Systemvariable, xconin
+Systemvariable, xconout
+Systemvariable, xconstat
+Systemvariable, xcostat
+Systemvariable, _autopath
+Systemvariable, _bootdev
+Systemvariable, _bufl
+Systemvariable, _cmdload
+Systemvariable, _drvbits
+Systemvariable, _dskbufp
+Systemvariable, _frclock
+Systemvariable, _fverify
+Systemvariable, _hz_200
+Systemvariable, _longframe
+Systemvariable, _md
+Systemvariable, _membot
+Systemvariable, _memtop
+Systemvariable, _nflops
+Systemvariable, _prtabt
+Systemvariable, _p_cookies
+Systemvariable, _shell_p
+Systemvariable, _sysbase
+Systemvariable, _timr_ms
+Systemvariable, _vbclock
+Systemvariable, _vblqueue
+Systemvariable, _vbl_list
+Systemvariable, _v_bas_ad
+Systemvariablen, nummerisch sortiert
+sys_recalc_cicon_colours
+sys_set_appl_getinfo
+sys_set_editob
+sys_set_getdisp
+sys_set_getfn
+sys_set_setfn
+sys_set_winframe_manager
+S_BLOCKCACHE
+S_CDEFINES
+S_CLOCKUTC
+S_CNAME
+S_COPTIM
+S_CTRLALTDEL
+S_CTRLCACHE
+S_CVERSION
+S_DEBUGDEVICE
+S_DEBUGKMTRACE
+S_DEBUGLEVEL
+S_DELCOOKIE
+S_FASTLOAD
+S_FLUSHCACHE
+S_GETBOOTLOG
+S_GETBVAL
+S_GETCOOKIE
+S_GETLVAL
+S_GETWVAL
+s_hutdown
+S_INITIALTPA
+S_INQUIRE
+S_KNAME
+S_LOADKBD
+S_OSBUILDDATE
+S_OSBUILDTIME
+S_OSCOMPILE
+S_OSFEATURES
+S_OSHEADER
+S_OSNAME
+S_OSVERSION
+S_OSXNAME
+S_RUNLEVEL
+S_SECLEVEL
+S_SETBVAL
+S_SETCOOKIE
+S_SETEXC
+S_SETLVAL
+S_SETWVAL
+S_SYNCTIME
+S_TIOCMGET
+S_TSLICE
+

+ +

+T
+Tab
+Tadjtime
+Talarm
+TapeBIOS
+Tastaturbelegung
+Tastaturcodes von G_EDIT
+Tastaturfunktionen
+Tastaturklicks, Geräusch bei
+Tastaturtabellen vorhanden?
+TC-VDI-Funktionen
+tchars
+TCURSBLINK
+TCURSGRATE
+TCURSOFF
+TCURSON
+TCURSSRATE
+TCURSSTEADY
+TDI_Answer
+TDI_Question
+TEDINFO
+TekBios
+Terminate and Stay Resident
+Test auf MagiC
+TestError
+Testing, User-
+testmps.s
+Text block transfer
+Text-Attribute
+Text-Funktionen
+Textausrichtung
+Texteffekte
+Texteffekten, Einsatz von
+Textrotation
+TEXT_CRSR
+Tgetdate
+Tgettime
+Tgettimeofday
+THA_CENTER
+THA_LEFT
+THA_RIGHT
+The GNU General Public Licence
+The purpose(s) of the View protocol
+The screen-manager
+The View protocol messages
+The VIEW_XXX messages
+themd
+the_env
+THICK_CROSS
+THING_CMD
+THIN_CROSS
+THREADINFO
+Threads in MagiC
+Threads und AES-Aufrufe
+Threads und Signale
+Threads und VDI-Aufrufe
+Threads, Beenden von
+Threads, Beispiel-Code zu
+Threads, Erzeugen von
+THR_EXIT
+Tickcal
+Timeout der Floppy
+Timeouts and error handling
+Timer (200Hz), Vektor für
+timeval
+timezone
+TIOCCBRK
+TIOCFLUSH
+TIOCGETC
+TIOCGETP
+TIOCGFLAGS
+TIOCGLTC
+TIOCGPGRP
+TIOCGWINSZ
+TIOCGXKEY
+TIOCIBAUD
+TIOCOBAUD
+TIOCOUTQ
+TIOCSBRK
+TIOCSETC
+TIOCSETN
+TIOCSETP
+TIOCSFLAGS
+TIOCSLTC
+TIOCSPGRP
+TIOCSTART
+TIOCSTOP
+TIOCSWINSZ
+TIOCSXKEY
+Tmalarm
+Toolbar, Anheften einer
+Toolbar, Austauschen einer
+Toolbar, Entfernen einer
+Toolbar-Support
+Toolbar-Support unter XaAES
+Toolbars und der Window-Manager
+Toolbars, Redraw und Update von
+Toolboxen
+TOPW_OPENED
+TOS
+TOS Liste
+TOS, Speicherverwaltung in
+TOS, Versionsnummer von
+TOS-Domain
+TOS-Kompatibilität
+TOS2WIN
+Tosbox
+TOUCHEXIT
+TPA und Programmstart
+TPA-Größenfeld
+Trace, Vektor für
+Track-Kerning
+Transform mouse
+Transient Program Area
+Transparent-Modus
+TRAP#0, Vektor für
+TRAP#1, Vektor für
+TRAP#10, Vektor für
+TRAP#13, Vektor für
+TRAP#14, Vektor für
+TRAP#15, Vektor für
+TRAP#2, Vektor für
+TRAP#3, Vektor für
+TRAP#4, Vektor für
+TRAP#5, Vektor für
+TRAP#6, Vektor für
+TRAP#8, Vektor für
+TRAP#9, Vektor für
+Trapper
+TRAPV-Befehl, Vektor für
+Treiber, Bildschirm-
+Treiber, Bit-Image
+Treiber, Drucker-
+Treiber, Fax-
+Treiber, GDOS-
+Treiber, Grafiktablett-
+Treiber, Kamera-
+Treiber, Memory-
+Treiber, Metafile-
+Treiber, Plotter-
+Treiber, VDI-
+Treibergruppe Scanner
+Treibertypen
+trp14ret
+Tsetdate
+Tsetitimer
+Tsettime
+Tsettimeofday
+TSLICE
+TSR-Programme
+TT_FONT
+TVA_BOTTOM
+TVA_CENTER
+TVA_TOP
+TWERR
+TWOK
+TWREAD
+TWSHELL
+TWSTART
+TWTOP
+TWWRITE
+Typdefinitionen
+

+ +

+U
+übergeordnete Attribute
+Überlauf des Systemstapels
+Übersicht der wind_get/set Unterfunktionen
+UFSL
+Umschalten auf eine Applikation
+UNDERLINE
+Undraw sprite
+UNHIGHLIGHTED
+unhook_interrupt
+union
+unlocksnd
+Unmodale Dialogboxen
+Unterstützung fremder Dateisysteme
+UPARROW
+USECOLOURCAT
+User-Testing
+USERBLK
+USERDEF
+USER_DEF
+Using the View protocol
+UTXT_FN
+

+ +

+V
+VA-Funktionen
+VA-Protokoll
+ValidMode
+Vattrib
+VA_ACC_QUOTING(a)
+VA_CONFONT
+VA_CONSOLEOPEN
+VA_COPY_COMPLETE
+VA_DRAGACCWIND
+VA_DRAG_COMPLETE
+VA_FILECHANGED
+VA_FILECOPIED
+VA_FILEDELETED
+VA_FILEFONT
+VA_FONTCHANGED
+VA_OBJECT
+VA_OB_CLIPBOARD
+VA_OB_DRIVE
+VA_OB_FILE
+VA_OB_FOLDER
+VA_OB_NOTE
+VA_OB_NOTEPAD
+VA_OB_SHREDDER
+VA_OB_TRASHCAN
+VA_OB_UNKNOWN
+VA_OB_WINDOW
+VA_PATH_UPDATE
+VA_PROGSTART
+VA_PROTOSTATUS
+VA_SERVER_QUOTING(a)
+VA_SETSTATUS
+VA_START
+VA_THAT_IZIT
+VA_VIEWED
+VA_WINDOPEN
+VA_XOPEN
+vblsem
+VcheckMode
+Vclose
+Vcreate
+Vdelete
+VDI
+vdi
+VDI, Entstehung des
+VDI, Grundlagen des
+VDI, Standardformat des
+VDI-Ausgabeformat festlegen
+VDI-Bindings
+VDI-Farbnummer und Pixelwert
+VDI-Funktionsliste
+VDI-Gerätenummer
+VDI-Parameterblock
+VDI-Strukturen
+VDI-TRAP
+VDI-Treiber
+VDIFIX, Patchprogramm
+VDIPB
+VDO_MODE
+VDO_PARAM
+vdxConfigPlayback
+vdxDestroy
+vdxGetCapability
+vdxGetGrKeys
+vdxGetVersion
+vdxInit
+vdxPlaybackCopyFrame
+vdxPlaybackFrameSelect
+vdxPlaybackGetDeint
+vdxPlaybackGetEq
+vdxPlaybackOff
+vdxPlaybackOn
+vdxPlaybackSetDeint
+vdxPlaybackSetEq
+vdxProbe
+vdxQueryDMAStatus
+vdxQueryFourcc
+vdxSetGrKeys
+Vektor, 200Hz Timer
+Vektor, ACSI
+Vektor, Adreßfehler-
+Vektor, Auto (Level-1)
+Vektor, Auto (Level-2)
+Vektor, Auto (Level-3)
+Vektor, Auto (Level-4)
+Vektor, Auto (Level-5)
+Vektor, Auto (Level-6)
+Vektor, Auto (Level-7)
+Vektor, Baudratengenerator
+Vektor, Busfehler-
+Vektor, BUSY-Interrupt
+Vektor, CHK-Befehl
+Vektor, CTS-Interrupt
+Vektor, DCD-Interrupt
+Vektor, Display Enable Signal
+Vektor, Division durch Null
+Vektor, FDC
+Vektor, GPU-Done
+Vektor, IKBD
+Vektor, Illegaler Befehl
+Vektor, Line-A
+Vektor, Line-F
+Vektor, MIDI
+Vektor, Monochrom Monitor Detect
+Vektor, PC-
+Vektor, Privilegverletzung
+Vektor, Ring Indicator
+Vektor, RS232 Empfangsfehler
+Vektor, RS232 Empfangspuffer voll
+Vektor, RS232 Sendefehler
+Vektor, RS232 Sendepuffer leer
+Vektor, Spurious Interrupt
+Vektor, SSP-
+Vektor, Trace
+Vektor, TRAP#0
+Vektor, TRAP#1
+Vektor, TRAP#10
+Vektor, TRAP#13
+Vektor, TRAP#14
+Vektor, TRAP#15
+Vektor, TRAP#2
+Vektor, TRAP#3
+Vektor, TRAP#4
+Vektor, TRAP#5
+Vektor, TRAP#6
+Vektor, TRAP#8
+Vektor, TRAP#9
+Vektor, TRAPV-
+Vektor- oder Bitmap-Font?
+Vektoren verbiegen
+Vektoren, TT-MFP-Interrupt
+Vektoren, TT-SCC-Interrupt
+Veraltete XaAES-Funktionen
+Verify ausführen ?
+Verify ausschalten
+Verify einschalten
+Version 4.80 - 0.40
+Version 4.90
+Version 4.91
+Version 4.92
+Version 4.93
+Version 4.94
+Version 4.95
+Version 4.96
+Version 4.97
+Version 4.98
+Version 4.99
+Version 5.00
+Version 5.01
+versionOfMacAppl
+Versionsnummer des AES
+Versionsnummer des GEMDOS
+Verteilung der Resourcen bei Threads
+Vertical Blanks, Anzahl der
+Vertical-Blank-Routinen
+Verwaltung der Mausform
+Verwendung G_EDIT-Objekt
+Verzeichnis-Deskriptor
+Verzeichnisfunktionen
+vex_butv
+vex_curv
+vex_motv
+vex_timv
+vex_wheelv
+VFAT, Konfigurieren bei
+VFAT-XFS in MagiC
+VFATCONF
+VFAT_CNFDFLN
+VFAT_CNFLN
+Vfirst
+VG
+VgetRGB
+VgetSize
+Videohardware
+Videohardware, nicht kompatible
+VIDIX-XBIOS-Erweiterung
+vidix_capability_t
+vidix_deinterlace_t
+vidix_dma_t
+vidix_fourcc_t
+vidix_grkey_t
+vidix_playback_t
+vidix_video_eq_t
+View a file
+View data from memory
+View protocol
+View protocol, The messages
+VIEWERR_COLOR
+VIEWERR_ERROR
+VIEWERR_MEM
+VIEWERR_SIZE
+VIEWERR_WID
+ViewMax
+ViewMAX
+VIEW_CLOSED
+VIEW_DATA
+VIEW_FAILED
+VIEW_FILE
+VIEW_GETMFDB
+VIEW_MFDB
+VIEW_OPEN
+VIEW_SETMFDB
+Virtual-Screen-Protokoll
+virtuelle Workstations
+virtueller Bildschirm
+virt_to_bus
+virt_to_phys
+Vload
+Vlock
+vmem_size
+vmid_load
+vmid_play
+vmid_unload
+vm_align
+vm_color
+vm_coords
+vm_end_bezier
+vm_end_bgif
+vm_end_fill
+vm_end_grey
+vm_end_group
+vm_end_join
+vm_end_shadow
+vm_filename
+vm_grid
+VM_INQUIRE
+vm_no_outline
+vm_pagesize
+vm_start_bezier
+vm_start_bgif
+vm_start_fill
+vm_start_grey
+vm_start_group
+vm_start_join
+vm_start_shadow
+VM_VER_APP
+vm_ver_app
+vm_wind
+Vnext
+Voffset
+volad
+volda
+Vopen
+VPOS
+vqf_attributes
+vqf_bg_color
+vqf_fg_color
+vqin_mode
+vql_attributes
+vql_bg_color
+vql_fg_color
+vqm_attributes
+vqm_bg_color
+vqm_fg_color
+vqp_error
+vqp_filmname
+vqp_films
+vqp_state
+vqr_bg_color
+vqr_fg_color
+vqspl_position_d2d
+vqspl_position_dma
+vqspl_status_d2d
+vqspl_status_dma
+vqspl_time_left_d2d
+vqt_advance
+vqt_advance32
+vqt_attributes
+vqt_bg_color
+vqt_cachesize
+vqt_char_index
+vqt_devinfo
+vqt_extent
+vqt_ext_name
+vqt_fg_color
+vqt_fontheader
+vqt_fontinfo
+vqt_f_extent
+vqt_get_table
+vqt_justified
+vqt_name
+vqt_name_and_id
+vqt_pairkern
+vqt_real_extent
+vqt_trackkern
+vqt_width
+vqt_xfntinfo
+vq_bit_image
+vq_calibrate
+vq_cellarray
+vq_chcells
+vq_color
+vq_colors
+vq_ctab
+vq_ctab_entry
+vq_ctab_id
+vq_curaddress
+vq_devinfo
+vq_dflt_ctab
+vq_driver_info
+vq_driver_name
+vq_extnd
+vq_ext_devinfo
+vq_gdos
+vq_hilite_color
+vq_image_type
+vq_key_s
+vq_margins
+vq_max_color
+vq_min_color
+vq_mouse
+vq_page_name
+vq_pixcol
+vq_pixrgb
+vq_prn_scaling
+vq_ptsinsz
+vq_px_format
+vq_scan
+vq_scrninfo
+vq_tabstatus
+vq_tdimensions
+vq_tray_names
+vq_vgdos
+vq_weight_color
+Vread
+vrf_rgb
+vrl_rgb
+vro_cpyfm
+vrq_choice
+vrq_locator
+vrq_string
+vrq_valuator
+vrt_cpyfm
+vrt_rgb
+vrun_parallel
+vrun_rect
+vrun_triangle
+vr_clip_rects32_by_dst
+vr_clip_rects32_by_src
+vr_clip_rects_by_dst
+vr_clip_rects_by_src
+vr_recfl
+vr_transfer_bits
+vr_trnfm
+Vsave
+VSCR
+Vscroll
+vsc_expose
+vsc_form
+Vseek
+VsetMask
+VsetMode
+VsetRGB
+VsetScreen
+VsetSync
+vsf_bg_color
+vsf_color
+vsf_fg_color
+vsf_interior
+vsf_perimeter
+vsf_rgb
+vsf_style
+vsf_udpat
+vsf_xperimeter
+vsin_mode
+Vsize
+VSLIDE
+vsl_bg_color
+vsl_color
+vsl_ends
+vsl_fg_color
+vsl_rgb
+vsl_type
+vsl_udsty
+vsl_width
+vsm_bg_color
+vsm_choice
+vsm_color
+vsm_fg_color
+vsm_height
+vsm_locator
+vsm_string
+vsm_type
+vsm_valuator
+vspl_load_d2d
+vspl_load_sample
+vspl_make_d2d
+vspl_pause_d2d
+vspl_pause_dma
+vspl_play
+vspl_play_d2d
+vspl_play_dma
+vspl_stop_d2d
+vspl_stop_dma
+vspl_unload_d2d
+vspl_unload_sample
+vsp_film
+vsp_message
+vsp_save
+vsp_state
+vsr_bg_color
+vsr_fg_color
+vsspl_monitor_off
+vsspl_monitor_on
+vst_alignment
+vst_arbpt
+vst_arbpt32
+vst_bg_color
+vst_charmap
+vst_color
+vst_effects
+vst_error
+vst_ex_load_fonts
+vst_fg_color
+vst_font
+vst_height
+vst_kern
+vst_load_fonts
+vst_map_mode
+vst_name
+vst_point
+vst_rgb
+vst_rotation
+vst_scratch
+vst_setsize
+vst_setsize32
+vst_skew
+vst_track_offset
+vst_unload_fonts
+vst_width
+vswr_mode
+Vsync
+vs_bkcolor
+vs_calibrate
+vs_clip
+vs_color
+vs_color2
+vs_colors
+vs_crop
+vs_ctab
+vs_ctab_entry
+vs_curaddress
+vs_dflt_ctab
+vs_document_info
+vs_grayoverride
+vs_hilite_color
+vs_load_disp_list
+vs_max_color
+vs_min_color
+vs_mute
+vs_page_info
+vs_palette
+vs_pixcol
+vs_pixrgb
+vs_save_disp_list
+vs_weight_color
+VT-52-Terminal
+vt_alignment
+vt_axis
+vt_origin
+vt_resolution
+Vvalid
+Vwrite
+v_alpha_text
+v_arc
+v_bar
+v_bez
+v_bez_fill
+v_bez_off
+v_bez_on
+v_bez_qual
+v_bit_image
+v_cellarray
+V_CHAR_ALL
+V_CHAR_ASC
+V_CHAR_IND
+V_CHAR_PRT
+v_circle
+v_clear_disp_list
+v_clrwk
+v_clsbm
+v_clsvwk
+v_clswk
+v_color2nearest
+v_color2value
+v_contourfill
+v_copies
+v_create_ctab
+v_create_driver_info
+v_create_itab
+v_ctab_idx2value
+v_ctab_idx2vdi
+v_ctab_vdi2idx
+v_curaddress
+v_curdown
+v_curhome
+v_curleft
+v_curright
+v_curtext
+v_curup
+v_delete_ctab
+v_delete_driver_info
+v_delete_itab
+v_dspcur
+v_eeol
+v_eeos
+v_ellarc
+v_ellipse
+v_ellpie
+v_enter_cur
+v_escape2000
+v_etext
+v_exit_cur
+v_fillarea
+v_flushcache
+v_fontinit
+v_form_adv
+v_ftext
+v_ftext_offset
+v_getbitmap_info
+v_getoutline
+v_get_ctab_id
+v_get_driver_info
+v_get_outline
+v_get_pixel
+v_gtext
+v_hardcopy
+v_hide_c
+v_justified
+v_killoutline
+v_loadcache
+v_load_cache
+v_meta_extents
+v_offset
+v_open_bm
+v_opnbm
+v_opnprn
+v_opnvwk
+v_opnwk
+v_opnwk, Besonderheiten
+v_orient
+v_output_window
+v_page_size
+v_pat_rotate
+v_pieslice
+v_pline
+v_pmarker
+v_ps_halftone
+v_rbox
+v_read_default_settings
+v_resize_bm
+v_rfbox
+v_rmcur
+v_rvoff
+v_rvon
+v_savecache
+v_save_cache
+v_setrgb
+v_setrgbi
+v_set_app_buff
+v_show_c
+v_sound
+v_topbot
+v_tray
+v_trays
+v_updwk
+v_updwk, Besonderheiten bei
+v_value2color
+v_write_default_settings
+v_write_meta
+v_xbit_image
+

+ +

+W
+Wait
+Wait_dt
+Wake_parent
+Wandel C-String nach VDI-String
+Wandel VDI-String nach C-String
+WavePlay
+WA_DNLINE
+WA_DNPAGE
+WA_LFLINE
+WA_LFPAGE
+WA_RTLINE
+WA_RTPAGE
+WA_UPLINE
+WA_UPPAGE
+WA_WHEEL
+WBDAEMON
+WC_BORDER
+WC_WIN
+WC_WORK
+WdgCtrl
+WDIALOG
+wdlg_close
+wdlg_create
+wdlg_delete
+wdlg_evnt
+wdlg_get_edit
+wdlg_get_handle
+wdlg_get_tree
+wdlg_get_udata
+wdlg_open
+wdlg_redraw
+wdlg_set_edit
+wdlg_set_iconify
+wdlg_set_size
+wdlg_set_tree
+wdlg_set_uniconify
+WF_APPICON, wind_set
+WF_ATTRB
+WF_ATTRB, wind_set
+WF_BACKDROP, wind_set
+WF_BEVENT
+WF_BEVENT, wind_get
+WF_BEVENT, wind_set
+WF_BITMAP
+WF_BITMAP, wind_get
+WF_BOTTOM
+WF_BOTTOM, wind_get
+WF_BOTTOM, wind_set
+WF_BOTTOMALL
+WF_BOTTOMALL, wind_set
+WF_CALCF2U
+WF_CALCF2W
+WF_CALCF2W, wind_xget
+WF_CALCU2F
+WF_CALCW2F
+WF_CALCW2F, wind_xget
+WF_COLOR
+WF_COLOR, wind_set
+WF_CURRXYWH
+WF_CURRXYWH, wind_get
+WF_CURRXYWH, wind_set
+WF_CURRXYWH, wind_xset
+WF_DCOLOR
+WF_DCOLOR, wind_get
+WF_DCOLOR, wind_set
+WF_DDELAY
+WF_DDELAY, wind_get
+WF_DDELAY, wind_set
+WF_FIRSTAREAXYWH
+WF_FIRSTAREAXYWH, wind_xget
+WF_FIRSTXYWH, wind_get
+WF_FTOOLBAR
+WF_FTOOLBAR, wind_get
+WF_FULLSCREEN
+WF_FULLSCREEN, wind_set
+WF_FULLXYWH
+WF_FULLXYWH, wind_get
+WF_FULLXYWH, wind_set
+WF_FULLXYWH, wind_xset
+WF_HSLIDE
+WF_HSLIDE, wind_get
+WF_HSLIDE, wind_set
+WF_HSLSIZE
+WF_HSLSIZE, wind_get
+WF_HSLSIZE, wind_set
+WF_ICONIFY
+WF_ICONIFY, wind_get
+WF_ICONIFY, wind_set
+WF_IGNORE, wind_set
+WF_INFO
+WF_INFO, wind_get
+WF_INFO, wind_set
+WF_INFOXYWH
+WF_INFOXYWH, wind_get
+WF_KIND
+WF_KIND, wind_get
+WF_KIND, wind_set
+WF_MAXWORKXYWH
+WF_MENU
+WF_MENU, wind_get
+WF_MENU, wind_set
+WF_MINXYWH
+WF_MINXYWH, wind_get
+WF_M_BACKDROP
+WF_M_BACKDROP, wind_set
+WF_M_OWNER
+WF_M_OWNER, wind_get
+WF_M_WINDLIST
+WF_M_WINDLIST, wind_get
+WF_NAME
+WF_NAME, wind_get
+WF_NAME, wind_set
+WF_NEWDESK
+WF_NEWDESK, wind_get
+WF_NEWDESK, wind_set
+WF_NEXTXYWH, wind_get
+WF_NTOOLBAR
+WF_NTOOLBAR, wind_get
+WF_OBFLAG
+WF_OBSPEC
+WF_OBTYPE
+WF_OPTIONS
+WF_OPTIONS, wind_set
+WF_OPTS
+WF_OPTS, wind_get
+WF_OPTS, wind_set
+WF_OWNER
+WF_OWNER, wind_get
+WF_PREVXYWH
+WF_PREVXYWH, wind_get
+WF_PREVXYWH, wind_set
+WF_PREVXYWH, wind_xset
+WF_RESVD, wind_set
+WF_SCREEN
+WF_SCREEN, wind_get
+WF_SHADE
+WF_SHADE, wind_get
+WF_SHADE, wind_set
+WF_SIZETOP
+WF_SIZETOP, wind_set
+WF_STACK
+WF_STACK, wind_set
+WF_TOOLBAR
+WF_TOOLBAR, wind_get
+WF_TOOLBAR, wind_set
+WF_TOP
+WF_TOP, wind_get
+WF_TOP, wind_set
+WF_TOPALL
+WF_TOPALL, wind_set
+WF_TOPAP
+WF_TOPMOST
+WF_TOPMOST, wind_get
+WF_TOPMOST, wind_set
+WF_UNICONIFY
+WF_UNICONIFY, wind_get
+WF_UNICONIFY, wind_set
+WF_UNICONIFYXYWH
+WF_UNICONIFYXYWH, wind_set
+WF_USER_POINTER
+WF_USER_POINTER, wind_get
+WF_USER_POINTER, wind_set
+WF_VSLIDE
+WF_VSLIDE, wind_get
+WF_VSLIDE, wind_set
+WF_VSLSIZE
+WF_VSLSIZE, wind_get
+WF_VSLSIZE, wind_set
+WF_WCOLOR, wind_set
+WF_WHEEL
+WF_WHEEL, wind_set
+WF_WIDGETS
+WF_WIDGETS, wind_get
+WF_WIDGETS, wind_set
+WF_WINDLIST, wind_get
+WF_WIND_ATTACH
+WF_WIND_ATTACH, wind_set
+WF_WINX
+WF_WINX, wind_get
+WF_WINXCFG
+WF_WINXCFG, wind_get
+WF_WINXCFG, wind_set
+WF_WORKXYWH
+WF_WORKXYWH, wind_get
+What does the viewer do?
+What is SSP?
+What is the SSP-Server?
+What kinds of files can be displayed?
+WHITEBAK
+Who is the viewer?
+Wide-Format
+WinChangeFont
+WINCOM_MSG
+Wind-XES
+wind_apfind
+wind_calc
+wind_calc, Probleme bei
+wind_close
+wind_create
+WIND_DATA
+wind_delete
+wind_draw
+wind_find
+wind_get
+wind_get und wind_set mode von Geneva
+wind_new
+wind_open
+wind_set
+wind_set und PC-GEM
+WIND_TREE
+wind_update
+wind_xget
+wind_xset
+WINFRAME_HANDLER
+WINFRAME_SETTINGS
+WININFO
+winsize
+WIN_CHANGED
+WIN_CHANGEFNT
+WIN_CLOSED
+WIN_HSLIDE
+WIN_HSLSIZE
+WIN_INFO
+WIN_NAME
+WIN_NEWTOP
+WIN_SCROLLED
+WIN_SIZED
+WIN_TOPPED
+WIN_VSLIDE
+WIN_VSLSIZE
+WISEL_MSG
+WM_ALLICONIFY
+WM_ARROWED
+WM_BACKDROPPED
+WM_BOTTOMED
+WM_CLOSED
+WM_COPY
+WM_CUT
+WM_DELETE
+WM_DESTROY
+WM_DNLINE
+WM_DNPAGE
+WM_FIND
+WM_FINDNEXT
+WM_FORM
+WM_FULLED
+WM_HELP
+WM_HSLID
+WM_ICONIFY
+WM_ISTOP
+WM_LFLINE
+WM_LFPAGE
+WM_MNSELECTED
+WM_MOUSEWHEEL
+WM_MOVED
+WM_M_BDROPPED
+WM_NEWTOP
+WM_OFFTOP
+WM_ONTOP
+WM_PASTE
+WM_PREREDRAW
+WM_PRINT
+WM_REDRAW
+WM_REPLACE
+WM_REPOSED
+WM_RTLINE
+WM_RTPAGE
+WM_SAVE
+WM_SAVEAS
+WM_SELECTALL
+WM_SHADED
+WM_SIZED
+WM_TOOLBAR
+WM_TOPPED
+WM_UNDO
+WM_UNICONIFY
+WM_UNSHADED
+WM_UNTOPPED
+WM_UPLINE
+WM_UPPAGE
+WM_VSLID
+WM_WHEEL
+WO0_FULLREDRAW
+WO0_NOBLITH
+WO0_NOBLITW
+WO0_SENDREPOS
+WO0_WCOWORK
+WO0_WHEEL
+Workstations des VDI
+Workstations, virtuelle
+WP
+Wrap_off
+Wrap_on
+wredraw
+Writeback-Daemon
+writesmp
+write_config_byte
+write_config_longword
+write_config_word
+write_io_byte
+write_io_longword
+write_io_word
+write_mem_byte
+write_mem_longword
+write_mem_word
+Write_Queue
+wr_dclk
+wr_dconv
+wr_dpath1
+wr_dpath2
+wr_dpdat
+wr_dport
+wr_raes
+wr_rdsp
+wr_rhi
+wr_rint
+wr_rlow
+W_BOTTOMER
+W_BOX
+W_CLOSER
+W_DATA
+W_DNARROW
+W_FULLER
+W_HBAR
+W_HELEV
+W_HSLIDE
+W_INFO
+W_LFARROW
+W_NAME
+W_RTARROW
+W_SIZER
+W_SMALLER
+W_TITLE
+W_UPARROW
+W_VBAR
+W_VELEV
+W_VSLIDE
+W_WORK
+

+ +

+X
+X/GEM
+XA
+XA, wind_get
+XaAES
+XaAES-Funktionen
+XAcc
+XAcc message groups
+XAcc messages
+XAcc-Programmtypen
+XACC.H
+XACC_AV_CLOSE
+XACC_AV_EXIT
+XACC_AV_INIT
+Xacc_Dsinfo
+Xacc_Dsi_Request
+Xacc_Field_Info
+Xacc_File_Info
+XACRS_BUBBLE_DISC
+XACRS_HORSIZER
+XACRS_MOVER
+XACRS_NE_SIZER
+XACRS_POINTSLIDE
+XACRS_RESIZER
+XACRS_VERTSIZER
+XAESMSG
+xappl_getinfo
+xapp_getinfo
+XATTR
+XATTR, dev-Komponente
+XATTR, mögliche Filetypen
+XATTR, size-Komponente
+XATTR, spezielle Bits
+XATTR, Sticky-Bit
+XATTR, Zugriffsrechte
+XBIOS
+xbios
+XBIOS Fehlermeldungen
+XBIOS Strukturen
+xbios(32000)
+xbios(32001)
+xbios(32002)
+XBIOS, Parameterübergabe im
+XBIOS-Dispatcher
+XBIOS-Funktionsliste
+xbios-Trap
+XBRA-Struktur
+XBRA-Verfahren
+Xbtimer
+XCMDs unter MagiC Mac
+xconin
+xconout
+xconstat
+XCONTROL
+XControl, Start von
+XCONTROL-Funktionen
+xcostat
+XCPB
+XDO_INF
+xFLS Programmiertechnische Hinweise
+XFNT_INFO
+XFONTINFO
+XFONT_CHANGED
+Xform_do
+xfrm_popup
+XFS, Datenstrukturen für ein
+XFS, Installation eines
+XFS, Kernelfunktionen für ein
+XFS-Konzept, Allgemeines
+XFS-Strukturen
+xFSL Parameterübergabe
+xFSL Returncodes
+xFSL Tips und Hinweise
+xFSL-Cookie
+xFSL-Schnittstelle
+xfsl_event
+xfsl_exit
+XFSL_FILTER
+xfsl_info
+xfsl_init
+xfsl_input
+xFSL_PAR
+xFSL_PENTRY
+xfs_attrib
+xfs_chmod
+xfs_chown
+xfs_dclosedir
+xfs_dcntl
+xfs_dcreate
+xfs_DD2name
+xfs_ddelete
+xfs_dfree
+xfs_dopendir
+xfs_dpathconf
+xfs_dreaddir
+xfs_drewinddir
+xfs_drv_close
+xfs_drv_open
+xfs_dta_drive
+xfs_dta_res1
+xfs_fdelete
+xfs_flags
+xfs_fopen
+xfs_freeDD
+xfs_garbcoll
+xfs_init
+xfs_link
+xfs_name
+xfs_next
+xfs_path2DD
+xfs_pterm
+xfs_readlink
+xfs_rlabel
+xfs_sfirst
+xfs_snext
+xfs_symlink
+xfs_sync
+xfs_wlabel
+xfs_xattr
+XGen_Alert
+xgrf_2box
+xgrf_color
+xgrf_dtimage
+xgrf_stepcalc
+XHDI
+XHDI - eXtended HardDisk Interface (Version 1.30)
+XHDI-Cookie
+XHDI-Fehlercodes
+XHDI-Funktionen
+XHDI-Terminologie
+XHDOSLimits
+XHDriverSpecial
+XHDrvMap
+XHEject
+XHGetCapacity
+XHGetVersion
+XHInqDev
+XHInqDev2
+XHInqDriver
+XHInqTarget
+XHInqTarget2
+XHLastAccess
+XHLock
+XHMediumChanged
+XHMiNTInfo
+XHNewCookie
+XHReaccess
+XHReadWrite
+XHReserve
+XHStop
+XH_DL_BFLAGS
+XH_DL_CLSIZB
+XH_DL_CLUSTS
+XH_DL_CLUSTS12
+XH_DL_CLUSTS32
+XH_DL_DRIVES
+XH_DL_MAXFAT
+XH_DL_MAXSEC
+XH_DL_MAXSPC
+XH_DL_MINFAT
+XH_DL_MINSPC
+XH_DL_RDLEN
+XH_DL_SECSIZ
+XH_MI_GETKERINFO
+XH_MI_SETKERINFO
+XH_TARGET_EJECTABLE
+XH_TARGET_LOCKABLE
+XH_TARGET_LOCKED
+XH_TARGET_REMOVABLE
+XH_TARGET_RESERVED
+XH_TARGET_STOPPABLE
+XH_TARGET_STOPPED
+XIMG-Format
+XIMG-Header
+xkey
+XMEN_MGR
+XOR-Modus
+XSDD-Protokoll
+xshelw
+xshl_getshell
+xshl_setshell
+XSHW_COMMAND
+XSHW_RUNACC
+XSHW_RUNANY
+XSHW_RUNAPP
+XSSI-Protokoll
+XSTATE
+XTED
+xUFSL
+X_APF_SEARCH
+x_appl_flags
+x_appl_font
+x_appl_sleep
+x_appl_term
+X_APS_CHEXIT
+X_APS_CHILD
+X_APS_CHILD0
+X_BUF_V2
+X_FMD_FINISH
+X_FMD_START
+x_form_center
+x_form_error
+x_form_filename
+x_form_mouse
+x_fsel_input
+X_GET_HELP
+x_graf_blit
+x_graf_rast2rez
+x_graf_rubberbox
+x_help
+X_HSPLIT
+X_LFTRT
+x_malloc
+X_MENU
+x_mfree
+X_MGET
+X_MN_SELECTED
+X_MRESET
+x_mshrink
+X_MU_DIALOG
+x_objc_edit
+x_realloc
+x_scrp_get
+x_settings
+X_SET_SHAPE
+X_SHACCESS
+X_SHCLOSE
+x_shel_get
+x_shel_put
+X_SHLOADSAVE
+X_SHOPEN
+x_sprintf
+x_sscanf
+X_UPDOWN
+X_VSPLIT
+x_wdial_change
+x_wdial_draw
+X_WD_ACTIVE
+X_WD_BLITSCRL
+X_WD_KEYS
+X_WF_DCOLSTAT
+X_WF_DCOLSTAT, wind_get
+X_WF_DCOLSTAT, wind_set
+X_WF_DFLTDESK
+X_WF_DFLTDESK, wind_get
+X_WF_DFLTDESK, wind_set
+X_WF_DIALEDIT
+X_WF_DIALEDIT, wind_get
+X_WF_DIALEDIT, wind_set
+X_WF_DIALFLGS
+X_WF_DIALFLGS, wind_get
+X_WF_DIALFLGS, wind_set
+X_WF_DIALHT
+X_WF_DIALHT, wind_get
+X_WF_DIALHT, wind_set
+X_WF_DIALOG
+X_WF_DIALOG, wind_get
+X_WF_DIALOG, wind_set
+X_WF_DIALWID
+X_WF_DIALWID, wind_get
+X_WF_DIALWID, wind_set
+X_WF_HSLIDE2
+X_WF_HSLIDE2, wind_get
+X_WF_HSLIDE2, wind_set
+X_WF_HSLSIZE2
+X_WF_HSLSIZE2, wind_get
+X_WF_HSLSIZE2, wind_set
+X_WF_HSPLIT
+X_WF_HSPLIT, wind_get
+X_WF_HSPLIT, wind_set
+X_WF_MENU
+X_WF_MENU, wind_get
+X_WF_MENU, wind_set
+X_WF_MINMAX
+X_WF_MINMAX, wind_get
+X_WF_MINMAX, wind_set
+X_WF_OBJHAND
+X_WF_OBJHAND, wind_get
+X_WF_OBJHAND, wind_set
+X_WF_SPLMIN
+X_WF_SPLMIN, wind_get
+X_WF_SPLMIN, wind_set
+X_WF_VSLIDE2
+X_WF_VSLIDE2, wind_get
+X_WF_VSLIDE2, wind_set
+X_WF_VSLSIZE2
+X_WF_VSLSIZE2, wind_get
+X_WF_VSLSIZE2, wind_set
+X_WF_VSPLIT
+X_WF_VSPLIT, wind_get
+X_WF_VSPLIT, wind_set
+x_wind_calc
+x_wind_create
+x_wind_tree
+X_WM_ARROWED2
+X_WM_HSLID2
+X_WM_HSPLIT
+X_WM_OBJECT
+X_WM_SELECTED
+X_WM_VECEVNT
+X_WM_VECKEY
+X_WM_VECSW
+X_WM_VSLID2
+X_WTFL_CLICKS
+X_WTFL_RESIZE
+X_WTFL_SLIDERS
+X_WT_GETCNT
+X_WT_READ
+X_WT_SET
+

+ +

+Z
+Zeichensätze in Dialogen
+Zeichensatzauswahl
+Zeichensatzauswahl als Dialog
+Zeichensatzauswahl im Fenster
+Zeichensatzes, Font-ID eines
+Zeichensatzes, Index eines
+Zeichenweise Ein-/Ausgabe
+Zeitscheiben für Multitasking
+zerono
+

+ +

+_
+_appl_yield
+_autopath
+_bootdev
+_bufl
+_cmdload
+_drvbits
+_dskbufp
+_frclock
+_fverify
+_hz_200
+_longframe
+_md
+_membot
+_memtop
+_nflops
+_PNAM
+_prtabt
+_p_cookies
+_shell_p
+_sysbase
+_timr_ms
+_vbclock
+_vblqueue
+_vbl_list
+_vq_gdos
+_v_bas_ad
+

+ +
+# + | % + | 2 + | A + | B + | C + | D + | E + | F + | G + | H + | I + | J + | K + | L + | M + | N + | O + | P + | Q + | R + | S + | T + | U + | V + | W + | X + | Z + | _ +
+ +
+ +Home +Inhaltsverzeichnis +XCPBXCPB + + + + + + + + diff --git a/de/introduction.html b/de/introduction.html new file mode 100644 index 000000000..7a310ce88 --- /dev/null +++ b/de/introduction.html @@ -0,0 +1,40 @@ + + + + + +Die Anleitung zum TOS: Einleitung + + + + + + + + + +Home +Inhaltsverzeichnis +Home +KontaktKontakt + +
+ +

1 Einleitung

+ +
+
+ +Home +Inhaltsverzeichnis +Home +KontaktKontakt + + diff --git a/de/lbox.html b/de/lbox.html new file mode 100644 index 000000000..03cc6036a --- /dev/null +++ b/de/lbox.html @@ -0,0 +1,4268 @@ + + + + + +Die Anleitung zum TOS: Listboxen + + + + + + + + + +Home +AESAES +Klemmbrett-FunktionenKlemmbrett-Funktionen +MagiC FunktionenMagiC Funktionen + +
+ +

8.15 Listboxen

+

Die folgenden Routinen wurden mit MagiC 4 eingeführt, und +erlauben die Erstellung und Handhabung von Listboxen: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
lbox_ascroll_to Slider-A der Listbox positionieren +
lbox_bscroll_to Slider-B der Listbox positionieren. +
lbox_cnt_items Anzahl der Listenelemente ermitteln. +
lbox_create Listbox initialisieren. +
lbox_delete Speicher für Listbox freigeben. +
lbox_do Button einer Listbox abarbeiten. +
lbox_free_items Elementliste freigeben. +
lbox_free_list Elementliste freigeben. +
lbox_get_afirst Index der ersten sichtbaren Elements ermitteln. +
lbox_get_avis Anzahl sichtbarer Einträge (Slider-A) ermitteln. +
lbox_get_bentries Anzahl der Elemente ermitteln (Slider B). +
lbox_get_bfirst Index des ersten sichtbaren Elements für Slider B ermitteln. +
lbox_get_bvis Anzahl sichtbarer Einträge ermitteln (Slider B). +
lbox_get_idx Index eines Elementes ermitteln. +
lbox_get_item Zeiger auf n-tes Element zurückliefern. +
lbox_get_items Zeiger auf das erste Element zurückliefern. +
lbox_get_slct_idx Index des ersten selekt. Elementes ermitteln. +
lbox_get_slct_item Zeiger auf das erste selekt. Element ermitteln. +
lbox_get_tree Objektbaum des Dialogs ermitteln. +
lbox_get_udata Zeiger auf programmeigene Daten holen. +
lbox_set_asldr Position des Sliders-A setzen. +
lbox_set_bentries Anzahl der Elemente für Slider-B setzen. +
lbox_set_bsldr Position des Sliders-B setzen. +
lbox_set_items Neue Elementliste setzen. +
lbox_update Listbox aktualisieren. + +
+ +

Hinweis: Die Existenz dieser Funktionen kann per appl_getinfo +(Opcode 7) festgestellt werden. +

+

Querverweis: Listboxen im Dialog   Style-Guidelines   WDIALOG +

+

8.15.1 lbox_ascroll_to

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List Box Scroll To, Slider A« - Slider der Listbox setzen. +
  +
AES-Nummer: 175 (Unterfunktion 4) +
  +
Deklaration: void lbox_ascroll_to ( LIST_BOX *box, int16_t first, GRECT +*box_rect, GRECT *slider_rect ); +
  +
oder +
  +
void lbox_scroll_to ( ... ); +
  +
Beschreibung: Die Funktion positioniert den Slider-A in einer Listbox. Es +gilt: +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
boxZeiger auf Listbox-Struktur
firstIndex des ersten sichbaren Eintrags
box_rectRedraw-Rechteck der Listbox (oder NULL)
slider_rectRedraw-Rechteck des Sliders (oder NULL)
+
+ +
Hinweis: Die Funktion arbeitet im Prinzip wie ein Aufruf +von lbox_set_slider mit anschließendem lbox_update. Der Unterschied +liegt darin, daß (falls möglich) gescrollt wird, um möglichst wenig +neu zeichnen zu müssen. Sollte sich die Elemenliste der Listbox +geändert haben, darf diese Funktion daher nicht benutzt +werden. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Listboxen +
  +
Querverweis: Binding   lbox_do   lbox_set_slider +
  + +
+ +

8.15.1.1 Bindings für lbox_ascroll_to

+ + + + + + + + + +
C: void lbox_ascroll_to ( LIST_BOX *box, int16_t first, GRECT +*box_rect, GRECT *slider_rect ); +
  +
oder +
  +
void lbox_scroll_to ( ... ); +
  +
Umsetzung: +
  +
void lbox_ascroll_to ( LIST_BOX *box, int16_t first,
+                       GRECT *box_rect,
+                       GRECT *slider_rect )
+
+oder
+
+void lbox_scroll_to ( ... )
+{
+   addr_in[0] = box;
+   addr_in[1] = box_rect;
+   addr_in[2] = slider_rect;
+
+   int_in[0] = 4;
+   int_in[1] = first;
+   crys_if (175);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]175 # Opcode der Funktion
control+2control[1]2 # Einträge in int_in
control+4control[2]0 # Einträge in int_out
control+6control[3]3 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]box
addr_in+4addr_in[1]box_rect
addr_in+8addr_in[2]slider_rect
int_inint_in[0]4 # Unterfunktion
int_in+2int_in[1]first
+
+ + +
+ +

8.15.2 lbox_bscroll_to

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List Box Scroll To, Slider B« - Slider einer Listbox +positionieren. +
  +
AES-Nummer: 175 (Unterfunktion 7) +
  +
Deklaration: void lbox_bscroll_to ( LIST_BOX *box, int16_t first, GRECT +*box_rect, GRECT *slider_rect ); +
  +
Beschreibung: Die Funktion positioniert den Slider-B einer Listbox. Es gilt: +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
boxZeiger auf Listbox-Struktur
firstIndex des ersten sichtb. Eintrags
box_rectRedraw-Rechteck (oder NULL)
slider_rectRedraw-Rechteck (oder NULL)
+
+ +
Hinweis: Der Parameter box_rect ist das +Redraw-Rechteck für die Listbox und slider_rect ist das +Redraw-Rechteck für den Slider. +
  +
Die Funktion arbeitet prinzipiell wie ein Aufruf von +lbox_set_bsldr mit anschließendem lbox_update; wenn möglich wird +aber gescrollt, um nur wenig neu zeichnen zu müssen. Sollte sich die +Elementliste der Listbox geändert haben, darf lbox_bscroll_to daher +nicht benutzt werden. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Listboxen +
  +
Querverweis: Binding   lbox_free_items   lbox_get_slct_item +
  + +
+ +

8.15.2.1 Bindings für lbox_bscroll_to

+ + + + + + + + + +
C: void lbox_bscroll_to ( LIST_BOX *box, int16_t first, GRECT +*box_rect, GRECT *slider_rect ); +
  +
Umsetzung: +
  +
void lbox_bscroll_to ( LIST_BOX *box, int16_t first,
+                       GRECT *box_rect,
+                       GRECT *slider_rect )
+{
+   addr_in[0] = box;
+   addr_in[1] = box_rect;
+   addr_in[2] = slider_rect;
+
+   int_in[0] = 7;
+   int_in[0] = first;
+   crys_if (175);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]175 # Opcode der Funktion
control+2control[1]2 # Einträge in int_in
control+4control[2]0 # Einträge in int_out
control+6control[3]3 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]box
addr_in+4addr_in[1]box_rect
addr_in+8addr_in[2]slider_rect
int_inint_in[0]7 # Unterfunktion
int_in+2int_in[1]first
+
+ + +
+ +

8.15.3 lbox_cnt_items

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List Box Count Items« - Anzahl der Listenelemente ermitteln. +
  +
AES-Nummer: 174 (Unterfunktion 0) +
  +
Deklaration: int16_t lbox_cnt_items ( LIST_BOX *box ); +
  +
Beschreibung: Die Funktion ermittelt die Anzahl der Elemente einer Listbox. +Es gilt: +
  +

+
+ + + + + + + + +
ParameterBedeutung
boxZeiger auf Listbox-Struktur
+
+ +
Ergebnis: Die Funktion gibt die Anzahl der Elemente der Listbox zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Listboxen +
  +
Querverweis: Binding   lbox_free_items   lbox_get_slct_item +
  + +
+ +

8.15.3.1 Bindings für lbox_cnt_items

+ + + + + + + + + +
C: int16_t lbox_cnt_items ( LIST_BOX *box ); +
  +
Umsetzung: +
  +
int16_t lbox_cnt_items ( LIST_BOX *box )
+{
+   addr_in[0] = box;
+   int_in[0]  = 0;
+   crys_if (174);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]174 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]box
int_inint_in[0]0 # Unterfunktion
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.15.4 lbox_create

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List Box Create« - Initialisieren einer Listbox. +
  +
AES-Nummer: 170 +
  +
Deklaration: LIST_BOX *lbox_create ( OBJECT *tree, SLCT_ITEM slct, SET_ITEM +set, LBOX_ITEM *items, int16_t visible_a, int16_t first_a, int16_t +*ctrl_objs, int16_t *objs, int16_t flags, int16_t pause_a, void +*user_data, DIALOG *dialog, int16_t visible_b, int16_t first_b, +int16_t entries_b, int16_t pause_b ); +
  +
Beschreibung: Die Funktion legt Speicherplatz für eine Listbox an, und +initialisiert deren Objekte. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
tree Zeiger auf den Objektbaum des Dialogs +
slct Zeiger auf die Auswahlroutine +
set Zeiger auf die Set-Routine +
items Zeiger auf eine verkette Liste der Listbox-Elemente (oder NULL) +
visible_a Anzahl sichtbarer Einträge (Slider A) +
first_a erstes sichtbares Element (Slider A) +
ctrl_objs Zeiger auf ein Feld mit den Objektnummern der Buttons und der +Slider. Es gilt: + + + + + + + + + + + + + + + +
ctrl_objs[0] = Box der Scroll-Objekte +
ctrl_objs[1] = Scrolling nach oben/links +
ctrl_objs[2] = dto. nach unten/rechts +
ctrl_objs[3] = Slider-Hintergrund +
ctrl_objs[4] = Slider-Box + +
+ +
Falls die Listbox 2 Slider besitzt, enthalten +ctrl_objs[5-8] die Nummern der Objekte von Slider B: + + + + + + + + + + + + +
ctrl_objs[5] = Scrolling nach oben/links +
ctrl_objs[6] = dto. nach unten/rechts +
ctrl_objs[7] = Slider-Hintergrund +
ctrl_objs[8] = Slider-Box + +
+ +
objs Zeiger auf ein Feld mit den Objektnummern der Listbox-Einträge +(insgesamt entries Einträge). Es gilt: + + + + + + +
objs[0] = erstes Objekt +
objs[entries-1] = letztes Objekt + +
+ +
Die Objekte sollten normalerweise den Status TOUCHEXIT besitzen. +
flags verschiedene Flags +
pause_a Verzögerung beim Scrolling in ms (Slider A) +
user_data Zeiger für die Applikation +
dialog Zeiger auf die Fensterdialog-Struktur, oder NULL +
visible_b Anzahl sichtbarer Elemente (Slider B) +
first_b erstes sichtbares Element (Slider B) +
entries_b Anzahl der Elemente (Slider B) +
pause_b Verzögerung beim Scrolling in ms (Slider B) + +
+ +
Hinweis: Das Initialisieren erfolgt dadurch, daß für +jedes der in objs angegebenen Objekte die Routine set +aufgerufen wird. Durch den Aufruf dieser Funktion wird die Listbox +nicht gezeichnet. Die Buttons, der Slider und dessen +Hintergrund sollten den Status TOUCHEXIT besitzen. Falls die Listbox +nur Buttons und keinen Slider besitzt müssen ctrl_objs[3] und +ctrl_objs[4] (bzw. [7/8]) den Wert -1 enthalten. +
  +
Unabhängig von der Hauptscrollrichtung kann die Listbox noch +einen zweiten Slider haben, wenn die Elemente selber noch gescrollt +werden sollen; dies kann z.B. bei einer vertikalen Listbox mit +Textelementen, die breiter als die Box selbst sind, sinnvoll sein. +
  +
Achtung: Sowohl slct als auch set sind +Funktionen, deren Parameter auf dem Stack übergeben werden. Die +Funktionen dürfen die Register d0-d2 und a0-a2 verändern. +slct wird immer dann aufgerufen, wenn ein Eintrag ausgewählt +oder aufgehoben wird. Die Variable selected aus der LBOX_ITEM +Struktur enthält beim Aufruf von slct bereits den neuen +Status des Objekts. +
  +
Ergebnis: Die Funktion liefert einen Zeiger auf die Struktur der Listbox +(oder im Fehlerfall den Wert NULL) zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Listboxen +
  +
Querverweis: Binding   lbox_delete   lbox_do +
  + +
+ +

8.15.4.1 Bindings für lbox_create

+ + + + + + + + + +
C: LIST_BOX *lbox_create ( OBJECT *tree, SLCT_ITEM slct, SET_ITEM +set, LBOX_ITEM *items, int16_t visible_a, int16_t first_a, int16_t +*ctrl_objs, int16_t *objs, int16_t flags, int16_t pause_a, void +*user_data, DIALOG *dialog, int16_t visible_b, int16_t first_b, +int16_t entries_b, int16_t pause_b ); +
  +
Umsetzung: +
  +
LIST_BOX *lbox_create ( OBJECT *tree, SLCT_ITEM slct,
+                        SET_ITEM set,
+                        LBOX_ITEM *items, int16_t visible_a,
+                        int16_t first_a, int16_t *ctrl_objs,
+                        int16_t *objs, int16_t flags,
+                        int16_t pause_a, void *user_data,
+                        DIALOG *dialog, int16_t visible_b,
+                        int16_t first_b, int16_t entries_b,
+                        int16_t pause_b )
+{
+   addr_in[0] = tree;
+   addr_in[1] = slct;
+   addr_in[2] = set;
+   addr_in[3] = items;
+   addr_in[4] = ctrl_objs;
+   addr_in[5] = objs;
+   addr_in[6] = user_data;
+   addr_in[7] = dialog;
+
+   int_in[0]  = visible_a;
+   int_in[1]  = first_a;
+   int_in[2]  = flags;
+   int_in[3]  = pause_a;
+
+   int_in[4]  = visible_b;
+   int_in[5]  = first_b;
+   int_in[6]  = entries_b;
+   int_in[7]  = pause_b;
+
+   crys_if (170);
+
+   return ( addr_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]170 # Opcode der Funktion
control+2control[1]4/8 # Einträge in int_in
control+4control[2]0 # Einträge in int_out
control+6control[3]8 # Einträge in addr_in
control+8control[4]1 # Einträge in addr_out
addr_inaddr_in[0]tree
addr_in+4addr_in[1]slct
addr_in+8addr_in[2]set
addr_in+12addr_in[3]items
addr_in+16addr_in[4]ctrl_objs
addr_in+20addr_in[5]objs
addr_in+24addr_in[6]user_data
addr_in+28addr_in[7]dialog
int_inint_in[0]visible_a
int_in+2int_in[1]first_a
int_in+4int_in[2]flags
int_in+6int_in[3]pause_a
int_in+8int_in[4]visible_b
int_in+10int_in[5]first_b
int_in+12int_in[6]entries_b
int_in+14int_in[7]pause_b
addr_outaddr_out[0]Return-Wert
+
+ + +
+ +

8.15.5 lbox_delete

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List Box Delete« - Speicher für Listbox freigeben. +
  +
AES-Nummer: 173 +
  +
Deklaration: int16_t lbox_delete ( LIST_BOX *box ); +
  +
Beschreibung: Die Funktion gibt den Speicherplatz für eine Listbox wieder +frei. Es gilt: +
  +

+
+ + + + + + + + +
ParameterBedeutung
boxZeiger auf die Listbox-Struktur
+
+ +
Ergebnis: Die Funktion liefert stets den Wert 1 zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Listboxen +
  +
Querverweis: Binding   lbox_create   lbox_do +
  + +
+ +

8.15.5.1 Bindings für lbox_delete

+ + + + + + + + + +
C: int16_t lbox_delete ( LIST_BOX *box ); +
  +
Umsetzung: +
  +
int16_t lbox_delete ( LIST_BOX *box )
+{
+   addr_in[0] = box;
+   crys_if (173);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]173 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]box
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.15.6 lbox_do

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List Box Do« - Button einer Listbox abarbeiten. +
  +
AES-Nummer: 172 +
  +
Binding: Bindings für lbox_do +
  +
Beschreibung: Die Funktion reagiert auf die Betätigung eines Buttons einer +Listbox. Es gilt: +
  +

+
+ + + + + + + + + + + + +
ParameterBedeutung
boxZeiger auf die Listbox-Struktur
objNummer des ausgewählten Objekts
+
+ +
Hinweis: Die Funktion sollte nach form_do (oder von der +Servicefunktion des Fensterdialogs) aufgerufen werden. Doppelklicks +(s.u.) werden von der Funktion am gesetzten obersten Bit (obj | +0x8000) der Objektnummer erkannt. Bei der zurückgelieferten +Objektnummer ist das oberste Bit in jedem Fall gelöscht. +
  +
Ergebnis: Die Funktion liefert die Nummer des ausgewählten Objekts (oder +den Wert -1, falls ein Doppelklick auf einen Eintrag erfolgte) zurück. Im +letzteren Fall sollte der Dialog geschlossen werden, und die Aktion +als Klick auf den Ok-Button angesehen werden. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Listboxen +
  +
Querverweis: Binding   lbox_delete   lbox_create +
  + +
+ +

8.15.6.1 Bindings für lbox_do

+ + + + + + + + + +
C: WORD lbox_do ( LIST_BOX *box, WORD obj ); +
  +
Implementierung: +
  +
WORD lbox_do ( LIST_BOX *box, WORD obj )
+{
+   addr_in[0] = box;
+   int_in[0]  = obj;
+   crys_if (172);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]172 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]box
int_inint_in[0]obj
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.15.7 lbox_free_items

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List Box Free Items« - Elementliste freigeben. +
  +
AES-Nummer: 175 (Unterfunktion 2) +
  +
Deklaration: void lbox_free_items ( LIST_BOX *box ); +
  +
Beschreibung: Die Funktion gibt den Speicherplatz für die Elemente der +Listbox zurück. Es gilt: +
  +

+
+ + + + + + + + +
ParameterBedeutung
boxZeiger auf die Listbox-Struktur
+
+ +
Hinweis: Voraussetzung für die vollständige Freigabe +des Speicherplatzes ist, daß für jedes Listenelement der Speicher +mit Malloc angefordert wurde. +
  +
Wurde hingegen eine eigene Speicherverwaltung benutzt (z.B. die +der C-Standard-Library), so muß auch eine eigene Funktion zum +Freigeben des Speichers aufgerufen werden. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Listboxen +
  +
Querverweis: Binding   lbox_free_list   lbox_delete +
  + +
+ +

8.15.7.1 Bindings für lbox_free_items

+ + + + + + + + + +
C: void lbox_free_items ( LIST_BOX *box ); +
  +
Umsetzung: +
  +
void lbox_free_items ( LIST_BOX *box )
+{
+   addr_in[0] = box;
+   int_in[0]  = 2;
+
+   crys_if (175);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]175 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]0 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]box
int_inint_in[0]2 # Unterfunktion
+
+ + +
+ +

8.15.8 lbox_free_list

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List Box Free Itemlist« - Elementliste freigeben. +
  +
AES-Nummer: 175 (Unterfunktion 3) +
  +
Deklaration: void lbox_free_list ( LBOX_ITEM *items ); +
  +
Beschreibung: Die Funktion gibt den Speicherplatz für die Elemente der +Listbox zurück. Es gilt: +
  +

+
+ + + + + + + + +
ParameterBedeutung
itemsZeiger auf eine verkettete Liste der Einträge
+
+ +
Hinweis: Die Funktion arbeitet wie lbox_free_items. Im +Gegensatz dazu wird diese Funktion aber mit einem Zeiger auf das erste +Listenelement aufgerufen. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Listboxen +
  +
Querverweis: Binding   lbox_free_items   lbox_delete +
  + +
+ +

8.15.8.1 Bindings für lbox_free_list

+ + + + + + + + + +
C: void lbox_free_list ( LBOX_ITEM *items ); +
  +
Umsetzung: +
  +
void lbox_free_list ( LBOX_ITEM *items )
+{
+   addr_in[0] = items;
+   int_in[0]  = 3;
+
+   crys_if (175);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]175 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]0 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]items
int_inint_in[0]3 # Unterfunktion
+
+ + +
+ +

8.15.9 lbox_get_afirst

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List Box Get First Visible Item, Slider A« - Index des +ersten sichtbaren Elementes ermitteln. +
  +
AES-Nummer: 174 (Unterfunktion 4) +
  +
Deklaration: int16_t lbox_get_afirst ( LIST_BOX *box ); +
  +
Beschreibung: Die Funktion ermittelt den Index des ersten sichtbaren +Elementes der Listbox für Slider-A. Es gilt: +
  +

+
+ + + + + + + + +
ParameterBedeutung
boxZeiger auf die Listbox-Struktur
+
+ +
Ergebnis: Die Funktion liefert den Index des ersten sichtbaren Elementes +der Listbox zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Listboxen +
  +
Querverweis: Binding   lbox_get_idx   lbox_get_item +
  + +
+ +

8.15.9.1 Bindings für lbox_get_afirst

+ + + + + + + + + +
C: int16_t lbox_get_afirst ( LIST_BOX *box ); +
  +
oder +
  +
int16_t lbox_get_first ( ... ); +
  +
Umsetzung: +
  +
int16_t lbox_get_afirst ( LIST_BOX *box )
+
+oder
+
+int16_t lbox_get_first  ( ... )
+{
+   addr_in[0] = box;
+   int_in[0]  = 4;
+   crys_if (174);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]174 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]box
int_inint_in[0]4 # Unterfunktion
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.15.10 lbox_get_avis

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List Box Get Number Of Visible Items, Slider A« - Anzahl der +sichtbaren Elemente ermitteln. +
  +
AES-Nummer: 174 (Unterfunktion 2) +
  +
Deklaration: int16_t lbox_get_avis ( LIST_BOX *box ); +
  +
Beschreibung: Die Funktion ermittelt die Anzahl der sichtbaren Einträge +einer Listbox für Slider-A. Es gilt: +
  +

+
+ + + + + + + + +
ParameterBedeutung
boxZeiger auf die Listbox-Struktur
+
+ +
Ergebnis: Die Funktion liefert die Anzahl der sichtbaren Einträge der +Listbox zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Listboxen +
  +
Querverweis: Binding   lbox_get_tree   lbox_get_first +
  + +
+ +

8.15.10.1 Bindings für lbox_get_avis

+ + + + + + + + + +
C: int16_t lbox_get_avis ( LIST_BOX *box ); +
  +
oder +
  +
int16_t lbox_get_visible ( ... ); +
  +
Umsetzung: +
  +
int16_t lbox_get_avis ( LIST_BOX *box )
+
+oder
+
+int16_t lbox_get_visible ( ... )
+{
+   addr_in[0] = box;
+   int_in[0]  = 2;
+   crys_if (174);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]174 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]box
int_inint_in[0]2 # Unterfunktion
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.15.11 lbox_get_bentries

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List Box Get Number Of Items, Slider B« - Anzahl der +Elemente ermitteln. +
  +
AES-Nummer: 174 (Unterfunktion 11) +
  +
Deklaration: int16_t lbox_get_bentries ( LIST_BOX *box ); +
  +
Beschreibung: Die Funktion ermittelt die Anzahl der Einträge einer Listbox +für Slider B. Es gilt: +
  +

+
+ + + + + + + + +
ParameterBedeutung
boxZeiger auf die Listbox-Struktur
+
+ +
Ergebnis: Die Funktion liefert die Anzahl der Einträge für den Slider-B +zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Listboxen +
  +
Querverweis: Binding   lbox_free_items   lbox_delete +
  + +
+ +

8.15.11.1 Bindings für lbox_get_bentries

+ + + + + + + + + +
C: int16_t lbox_get_bentries ( LIST_BOX *box ); +
  +
Umsetzung: +
  +
int16_t lbox_get_bentries ( LIST_BOX *box )
+{
+   addr_in[0] = box;
+   int_in[0]  = 11;
+
+   crys_if (174);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]174 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]box
int_inint_in[0]11 # Unterfunktion
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.15.12 lbox_get_bfirst

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List Box Get First Visible Item, Slider B« - Index des +ersten sichtbaren Elements ermitteln. +
  +
AES-Nummer: 174 (Unterfunktion 12) +
  +
Deklaration: int16_t lbox_get_bfirst ( LIST_BOX *box ); +
  +
Beschreibung: Die Funktion ermittelt den Index des ersten sichtbaren +Elementes einer Listbox für Slider B. Es gilt: +
  +

+
+ + + + + + + + +
ParameterBedeutung
boxZeiger auf die Listbox-Struktur
+
+ +
Ergebnis: Die Funktion liefert den Index des ersten sichtbaren Elements +der Listbox für Slider-B zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Listboxen +
  +
Querverweis: Binding   lbox_free_items   lbox_delete +
  + +
+ +

8.15.12.1 Bindings für lbox_get_bfirst

+ + + + + + + + + +
C: int16_t lbox_get_bfirst ( LIST_BOX *box ); +
  +
Umsetzung: +
  +
int16_t lbox_get_bfirst ( LIST_BOX *box )
+{
+   addr_in[0] = box;
+   int_in[0]  = 12;
+
+   crys_if (174);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]174 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]box
int_inint_in[0]12 # Unterfunktion
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.15.13 lbox_get_bvis

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List Box Get Number Of Visible Items, Slider B« - Anzahl +sichtbarer Einträge ermitteln. +
  +
AES-Nummer: 174 (Unterfunktion 10) +
  +
Deklaration: int16_t lbox_get_bvis ( LIST_BOX *box ); +
  +
Beschreibung: Die Funktion ermittelt die Anzahl der sichtbaren Einträge +einer Listbox für Slider B. Es gilt: +
  +

+
+ + + + + + + + +
ParameterBedeutung
boxZeiger auf die Listbox-Struktur
+
+ +
Ergebnis: Die Funktion liefert die Anzahl der sichtbaren Einträge +zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Listboxen +
  +
Querverweis: Binding   lbox_free_items   lbox_delete +
  + +
+ +

8.15.13.1 Bindings für lbox_get_bvis

+ + + + + + + + + +
C: int16_t lbox_get_bvis ( LIST_BOX *box ); +
  +
Umsetzung: +
  +
int16_t lbox_get_bvis ( LIST_BOX *box )
+{
+   addr_in[0] = box;
+   int_in[0]  = 10;
+
+   crys_if (174);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]174 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]box
int_inint_in[0]10 # Unterfunktion
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.15.14 lbox_get_idx

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List Box Get Item Index« - Index eines Elementes ermitteln. +
  +
AES-Nummer: 174 (Unterfunktion 9) +
  +
Deklaration: int16_t lbox_get_idx ( LBOX_ITEM *items, LBOX_ITEM *search ); +
  +
Beschreibung: Die Funktion liefert den Index eines bestimmten Elements der +Listbox zurück. Es gilt: +
  +

+
+ + + + + + + + + + + + +
ParameterBedeutung
itemsZeiger auf erstes Listenelement
searchZeiger auf zu suchendes Element
+
+ +
Ergebnis: Die Funktion liefert den Index des Elementes zurück, bzw. den +Wert -1, falls das angegebene Element nicht in der Liste ist. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Listboxen +
  +
Querverweis: Binding   lbox_get_item   lbox_get_first +
  + +
+ +

8.15.14.1 Bindings für lbox_get_idx

+ + + + + + + + + +
C: int16_t lbox_get_idx ( LBOX_ITEM *items, LBOX_ITEM *search ); +
  +
Umsetzung: +
  +
int16_t lbox_get_idx ( LBOX_ITEM *items, LBOX_ITEM *search )
+{
+   addr_in[0] = items;
+   addr_in[1] = search;
+   int_in[0]  = 9;
+   crys_if (174);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]174 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]items
addr_in+4addr_in[1]search
int_inint_in[0]9 # Unterfunktion
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.15.15 lbox_get_item

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List Box Get Item« - Zeiger auf n-tes Element der Listbox +ermitteln. +
  +
AES-Nummer: 174 (Unterfunktion 7) +
  +
Deklaration: LBOX_ITEM *lbox_get_item ( LIST_BOX *box, int16_t n ); +
  +
Beschreibung: Die Funktion liefert einen Zeiger auf das n-te Element +der Listbox zurück. Es gilt: +
  +

+
+ + + + + + + + + + + + +
ParameterBedeutung
boxZeiger auf Listbox-Struktur
nIndex des gewünschten Elements
+
+ +
Ergebnis: Die Funktion liefert einen Zeiger auf das n-te Element +der Liste (oder im Fehlerfall den Wert NULL) zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Listboxen +
  +
Querverweis: Binding   lbox_get_first   lbox_get_idx +
  + +
+ +

8.15.15.1 Bindings für lbox_get_item

+ + + + + + + + + +
C: LBOX_ITEM *lbox_get_item ( LIST_BOX *box, int16_t n ); +
  +
Umsetzung: +
  +
LBOX_ITEM *lbox_get_item ( LIST_BOX *box, int16_t n )
+{
+   addr_in[0] = box;
+   int_in[0]  = 7;
+   int_in[1]  = n;
+   crys_if (174);
+
+   return ( addr_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]174 # Opcode der Funktion
control+2control[1]2 # Einträge in int_in
control+4control[2]0 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]1 # Einträge in addr_out
addr_inaddr_in[0]box
int_inint_in[0]7 # Unterfunktion
int_in+2int_in[1]n
addr_outaddr_out[0]Return-Wert
+
+ + +
+ +

8.15.16 lbox_get_items

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List Box Get Items« - Zeiger auf erstes Listenelement +ermitteln. +
  +
AES-Nummer: 174 (Unterfunktion 6) +
  +
Deklaration: LBOX_ITEM *lbox_get_items ( LIST_BOX *box ); +
  +
Beschreibung: Die Funktion liefert einen Zeiger auf das erste Element der +Listbox zurück. Es gilt: +
  +

+
+ + + + + + + + +
ParameterBedeutung
boxZeiger auf die Listbox-Struktur
+
+ +
Ergebnis: Die Funktion liefert einen Zeiger auf das erste Listenelement +der Listbox zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Listboxen +
  +
Querverweis: Binding   lbox_get_first   lbox_get_idx +
  + +
+ +

8.15.16.1 Bindings für lbox_get_items

+ + + + + + + + + +
C: LBOX_ITEM *lbox_get_items ( LIST_BOX *box ); +
  +
Umsetzung: +
  +
LBOX_ITEM *lbox_get_items ( LIST_BOX *box )
+{
+   addr_in[0] = box;
+   int_in[0]  = 6;
+   crys_if (174);
+
+   return ( addr_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]174 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]0 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]1 # Einträge in addr_out
addr_inaddr_in[0]box
int_inint_in[0]6 # Unterfunktion
addr_outaddr_out[0]Return-Wert
+
+ + +
+ +

8.15.17 lbox_get_slct_idx

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List Box Get Index Of Selected Item« - Index des ersten +selektierten Eintrags ermitteln. +
  +
AES-Nummer: 174 (Unterfunktion 5) +
  +
Deklaration: int16_t lbox_get_slct_idx ( LIST_BOX *box ); +
  +
Beschreibung: Die Funktion liefert den Index des ersten selektierten Eintrags +der Listbox zurück. Es gilt: +
  +

+
+ + + + + + + + +
ParameterBedeutung
boxZeiger auf die Listbox-Struktur
+
+ +
Ergebnis: Die Funktion liefert den Index des ersten, selektierten +Eintrags der Listbox zurück. Falls kein Eintrag selektiert ist, wird +der Wert -1 zurückgegeben. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Listboxen +
  +
Querverweis: Binding   lbox_get_slct_item +
  + +
+ +

8.15.17.1 Bindings für lbox_get_slct_idx

+ + + + + + + + + +
C: int16_t lbox_get_slct_idx ( LIST_BOX *box ); +
  +
Umsetzung: +
  +
int16_t lbox_get_slct_idx ( LIST_BOX *box )
+{
+   addr_in[0] = box;
+   int_in[0]  = 5;
+   crys_if (174);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]174 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]box
int_inint_in[0]5 # Unterfunktion
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.15.18 lbox_get_slct_item

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List Box Get Selected Item« - Zeiger auf erstes selektiertes +Element ermitteln. +
  +
AES-Nummer: 174 (Unterfunktion 8) +
  +
Deklaration: LBOX_ITEM *lbox_get_slct_item ( LIST_BOX *box ); +
  +
Beschreibung: Die Funktion ermittelt das erste selektierte Element einer +Listbox. Es gilt: +
  +

+
+ + + + + + + + +
ParameterBedeutung
boxZeiger auf die Listbox-Struktur
+
+ +
Ergebnis: Die Funktion liefert einen Zeiger auf das erste selektierte +Element der Listbox (oder den Wert NULL) zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Listboxen +
  +
Querverweis: Binding   lbox_get_slct_idx +
  + +
+ +

8.15.18.1 Bindings für lbox_get_slct_item

+ + + + + + + + + +
C: LBOX_ITEM *lbox_get_slct_item ( LIST_BOX *box ); +
  +
Umsetzung: +
  +
LBOX_ITEM *lbox_get_slct_item ( LIST_BOX *box )
+{
+   addr_in[0] = box;
+   int_in[0]  = 8;
+   crys_if (174);
+
+   return ( addr_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]174 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]0 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]1 # Einträge in addr_out
addr_inaddr_in[0]box
int_inint_in[0]8 # Unterfunktion
addr_outaddr_out[0]Return-Wert
+
+ + +
+ +

8.15.19 lbox_get_tree

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List Box Get Tree« - Objektbaum des Dialogs ermitteln. +
  +
AES-Nummer: 174 (Unterfunktion 1) +
  +
Deklaration: OBJECT *lbox_get_tree ( LIST_BOX *box ); +
  +
Beschreibung: Die Funktion ermittelt den Zeiger auf den Objektbaum der +Dialogbox. Es gilt: +
  +

+
+ + + + + + + + +
ParameterBedeutung
boxZeiger auf die Listbox-Struktur
+
+ +
Ergebnis: Die Funktion liefert einen Zeiger auf den Objektbaum des +Dialogs zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Listboxen +
  +
Querverweis: Binding   lbox_get_udata   lbox_get_first +
  + +
+ +

8.15.19.1 Bindings für lbox_get_tree

+ + + + + + + + + +
C: OBJECT *lbox_get_tree ( LIST_BOX *box ); +
  +
Umsetzung: +
  +
OBJECT *lbox_get_tree ( LIST_BOX *box )
+{
+   addr_in[0] = box;
+   int_in[0]  = 1;
+   crys_if (174);
+
+   return ( addr_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]174 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]0 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]1 # Einträge in addr_out
addr_inaddr_in[0]box
int_inint_in[0]1 # Unterfunktion
addr_outaddr_out[0]Return-Wert
+
+ + +
+ +

8.15.20 lbox_get_udata

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List Box Get User Data« - Zeiger auf programmeigene Daten +ermitteln. +
  +
AES-Nummer: 174 (Unterfunktion 3) +
  +
Deklaration: void *lbox_get_udata ( LIST_BOX *box ); +
  +
Beschreibung: Die Funktion ermittelt den Zeiger auf die programmeigenen +Daten. Es gilt: +
  +

+
+ + + + + + + + +
ParameterBedeutung
boxZeiger auf die Listbox-Struktur
+
+ +
Ergebnis: Die Funktion liefert einen Zeiger auf die programmspezifischen +Daten zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Listboxen +
  +
Querverweis: Binding   lbox_get_tree   lbox_get_first +
  + +
+ +

8.15.20.1 Bindings für lbox_get_udata

+ + + + + + + + + +
C: void *lbox_get_udata ( LIST_BOX *box ); +
  +
Umsetzung: +
  +
void *lbox_get_udata ( LIST_BOX *box )
+{
+   addr_in[0] = box;
+   int_in[0]  = 3;
+   crys_if (174);
+
+   return ( addr_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]174 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]0 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]1 # Einträge in addr_out
addr_inaddr_in[0]box
int_inint_in[0]3 # Unterfunktion
addr_outaddr_out[0]Return-Wert
+
+ + +
+ +

8.15.21 lbox_set_asldr

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List Box Set Slider A« - Slider einer Listbox setzen. +
  +
AES-Nummer: 175 (Unterfunktion 0) +
  +
Deklaration: void lbox_set_asldr ( LIST_BOX *box, int16_t first, GRECT *rect +); +
  +
Beschreibung: Die Funktion positioniert den Slider-A einer Listbox. Es gilt: +
  +

+
+ + + + + + + + + + + + + + + + +
ParameterBedeutung
boxZeiger auf die Listbox-Struktur
firstIndex des ersten sichtbaren Eintrags
rectZeiger auf Redraw-Rechteck, oder NULL
+
+ +
Hinweis: Der Inhalt der Listbox wird durch diesen Aufruf +nicht aktualisiert, ggfs. muß also lbox_update aufgerufen +werden. Besitzt rect den Wert NULL, so wird nur die Position +der Sliderobjekte geändert, aber die Objekte selbst werden +nicht gezeichnet. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Listboxen +
  +
Querverweis: Binding   lbox_scroll_to +
  + +
+ +

8.15.21.1 Bindings für lbox_set_asldr

+ + + + + + + + + +
C: void lbox_set_asldr ( LIST_BOX *box, int16_t first, GRECT *rect +); +
  +
oder +
  +
void lbox_set_slider ( ... ); +
  +
Umsetzung: +
  +
void lbox_set_asldr ( LIST_BOX *box, int16_t first,
+                      GRECT *rect )
+
+oder
+
+void lbox_set_slider ( ... )
+{
+   addr_in[0] = box;
+   addr_in[1] = rect;
+
+   int_in[0] = 0;
+   int_in[1] = first;
+   crys_if (175);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]175 # Opcode der Funktion
control+2control[1]2 # Einträge in int_in
control+4control[2]0 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]box
addr_in+4addr_in[1]rect
int_inint_in[0]0 # Unterfunktion
int_in+2int_in[1]first
+
+ + +
+ +

8.15.22 lbox_set_bentries

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List Box Set Number Of Entries, Slider B« - Anzahl der +Elemente für Slider-B setzen. +
  +
AES-Nummer: 175 (Unterfunktion 6) +
  +
Deklaration: void lbox_set_bentries ( LIST_BOX *box, int16_t entries ); +
  +
Beschreibung: Die Funktion setzt die Anzahl der Elemente (bzw. +Unterteilungen) für Slider-B einer Listbox. Es gilt: +
  +

+
+ + + + + + + + + + + + +
ParameterBedeutung
boxZeiger auf die Listbox-Struktur
entriesAnzahl der Elemente
+
+ +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Listboxen +
  +
Querverweis: Binding   lbox_free_items   lbox_cnt_items +
  + +
+ +

8.15.22.1 Bindings für lbox_set_bentries

+ + + + + + + + + +
C: void lbox_set_bentries ( LIST_BOX *box, int16_t entries ); +
  +
Umsetzung: +
  +
void lbox_set_bentries ( LIST_BOX *box, int16_t entries )
+{
+   addr_in[0] = box;
+
+   int_in[0] = 6;
+   int_in[1] = entries;
+   crys_if (175);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]175 # Opcode der Funktion
control+2control[1]2 # Einträge in int_in
control+4control[2]0 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]box
int_inint_in[0]6 # Unterfunktion
int_in+2int_in[1]entries
+
+ + +
+ +

8.15.23 lbox_set_bsldr

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List Box Set Slider B« - Positioniert den Slider B einer +Listbox. +
  +
AES-Nummer: 175 (Unterfunktion 5) +
  +
Deklaration: void lbox_set_bsldr ( LIST_BOX *box, int16_t first, GRECT *rect +); +
  +
Beschreibung: Die Funktion positioniert den Slider-B einer Listbox. Es gilt: +
  +

+
+ + + + + + + + + + + + + + + + +
ParameterBedeutung
boxZeiger auf die Listbox-Struktur
firstIndex des ersten sichtbaren Eintrags
rectRedraw-Rechteck (oder NULL)
+
+ +
Hinweis: Der Slider wird innerhalb des Redraw-Rechtecks +rect neu gezeichnet. Der Inhalt der Listbox wird nicht +aktualisiert, d.h. evtl. muß lbox_update aufgerufen werden. Ist +rect 0L, dann wird nur die Position der Sliderobjekte +geändert, aber die Objekte werden nicht gezeichnet. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Listboxen +
  +
Querverweis: Binding   lbox_free_items   lbox_cnt_items +
  + +
+ +

8.15.23.1 Bindings für lbox_set_bsldr

+ + + + + + + + + +
C: void lbox_set_bsldr ( LIST_BOX *box, int16_t first, GRECT *rect +); +
  +
Umsetzung: +
  +
void lbox_set_bsldr ( LIST_BOX *box, int16_t first,
+                      GRECT *rect )
+{
+   addr_in[0] = box;
+   addr_in[1] = rect;
+
+   int_in[0] = 5;
+   int_in[1] = first;
+   crys_if (175);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]175 # Opcode der Funktion
control+2control[1]2 # Einträge in int_in
control+4control[2]0 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]box
addr_in+4addr_in[1]rect
int_inint_in[0]5 # Unterfunktion
int_in+2int_in[1]first
+
+ + +
+ +

8.15.24 lbox_set_items

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List Box Set New Item List« - neue Elementliste setzen. +
  +
AES-Nummer: 175 (Unterfunktion 1) +
  +
Deklaration: void lbox_set_items ( LIST_BOX *box, LBOX_ITEM *items ); +
  +
Beschreibung: Die Funktion setzt eine neue Liste mit Listbox-Einträgen. Es +gilt: +
  +

+
+ + + + + + + + + + + + +
ParameterBedeutung
boxZeiger auf die Listbox-Struktur
itemsZeiger auf die neue Element-Liste
+
+ +
Hinweis: Die alte Liste muß vorher per lbox_free_items +freigegeben werden. Der Parameter items kann auch den Wert +NULL besitzen, falls die Listbox leer ist, und keine Einträge +enthält. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Listboxen +
  +
Querverweis: Binding   lbox_free_items   lbox_cnt_items +
  + +
+ +

8.15.24.1 Bindings für lbox_set_items

+ + + + + + + + + +
C: void lbox_set_items ( LIST_BOX *box, LBOX_ITEM *items ); +
  +
Umsetzung: +
  +
void lbox_set_items ( LIST_BOX *box, LBOX_ITEM *items )
+{
+   addr_in[0] = box;
+   addr_in[1] = items;
+
+   int_in[0]  = 1;
+   crys_if (175);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]175 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]0 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]box
addr_in+4addr_in[1]items
int_inint_in[0]1 # Unterfunktion
+
+ + +
+ +

8.15.25 lbox_update

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List Box Update« - Inhalt der Listboxobjekte aktualisieren. +
  +
AES-Nummer: 171 +
  +
Deklaration: void lbox_update ( LIST_BOX *box, GRECT *rect ); +
  +
Beschreibung: Die Funktion bringt den Inhalt der Listbox-Objekte auf den +neuesten Stand. Es gilt: +
  +

+
+ + + + + + + + + + + + +
ParameterBedeutung
boxZeiger auf die Listbox-Struktur
rectZeiger auf Redraw-Rechteck, oder NULL
+
+ +
Hinweis: Die Aktualisierung erfolgt, indem die Funktion +set (vgl. lbox_create) für jedes der Objekte aufgerufen wird. +Besitzt rect nicht den Wert NULL, so wird es als Zeiger auf +eine Rechtecks-Beschreibung interpretiert, welche für den Redraw der +Listbox benutzt wird. Anderenfalls werden die Objekte nur aktualisiert +aber nicht gezeichnet. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Listboxen +
  +
Querverweis: Binding   lbox_do   lbox_scroll_to +
  + +
+ +

8.15.25.1 Bindings für lbox_update

+ + + + + + + + + +
C: void lbox_update ( LIST_BOX *box, GRECT *rect ); +
  +
Umsetzung: +
  +
void lbox_update ( LIST_BOX *box, GRECT *rect )
+{
+   addr_in[0] = box;
+   addr_in[1] = rect;
+
+   crys_if (171);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]171 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]0 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]box
addr_in+4addr_in[1]rect
+
+ + +
+ +

8.15.26 Listboxen im Dialog

+ + + + + + + + + + + + + + + + + + +
wind_update() Schirm sperren +
lbox_create() Listbox anlegen +
form_center() Dialog zentrieren +
form_dial() Ausschnitt puffern +
.   +
Schleife: form_do() +
lbox_do() + +
+ +

Ende der Schleife, evtl. lbox_get_slct_item()... +

+ + + + + + + + + + + + +
.   +
form_dial() Redraw-Message versenden +
wind_update() Schirm freigeben +
lbox_delete() Speicher für Listbox freigeben + +
+ +

8.15.27 Flags für das Verhalten der Listbox

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Bit + + + +
Zustand Bedeutung + +
+ +
  +
0 + + + + + + +
0 Die Box scrollt horizontal. +
1 Die Box scrollt vertikal. + +
+ +
1 + + + + + + +
0 kein automatisches Scrolling +
1 Es wird autmatisch gescrollt, sobald bei gedrückter Maustaste +der Mauszeiger über das erste oder letzte Element hinausbewegt wird. + +
+ +
2 + + + + + + +
0 Die Auswahl-Routine wird erst aufgerufen, wenn das automatische +Scrolling aufgehört hat, d.h. sie wird für den letzten selektierten +Eintrag aufgerufen. +
1 Beim automatischen Scrolling wird die Auswahl-Routine beim +Scrolling für jeden selektieren Eintrag aufgerufen. + +
+ +
3 + + + + + + +
0 Bei Bewegung des Sliders wird ein Rahmen verschoben +(graf_slidebox), die Listbox wird erst nach Loslassen der Maustaste +aktualisiert. +
1 Der Slider ist ein Real-Time-Slider. + +
+ +
4 + + + + + + +
0 Mehrfachselektion innerhalb der Listbox ist möglich. +
1 Es kann nur ein Element selektiert werden. + +
+ +
5 + + + + + + +
0 Mehrfachselektion ist ohne Shift-Taste möglich. +
1 Mehrfachselektion ist nur mit Shift-Taste möglich. + +
+ +
6 + + + + + + +
0 Bei Selektion ist der Status immer SELECTED. +
1 Bei Selektion wird der Status immer gewechselt. + +
+ +
7 + + + + + + +
0 Die Listbox hat nur einen Slider. +
1 Die Listbox hat zwei Slider. + +
+ + +
+ +

Hinweis: Es dürfte nützlich sein, die folgenden +Konstanten in eine Header-Datei zu übernehmen, um so die +Programmierung zu vereinfachen: +

+ + + + + + + + +
#define LBOX_VERT     1   /* Listbox mit vertik. Slider                 */
+#define LBOX_AUTO     2   /* Auto-Scrolling                             */
+#define LBOX_AUTOSLCT 4   /* automatische Darst. beim Auto-Scrolling    */
+#define LBOX_REAL     8   /* Real-Time-Slider                           */
+#define LBOX_SNGL    16   /* nur ein anwählbarer Eintrag                */
+#define LBOX_SHFT    32   /* Mehrfachselektionen mit Shift              */
+#define LBOX_TOGGLE  64   /* Status eines Eintrags bei Selekt. wechseln */
+#define LBOX_2SLDRS 128   /* Listbox hat hor. und vertikalen Slider     */
+
+

Das Flag LBOX_SNGL kann auch mit LBOX_SHFT oder LBOX_TOGGLE +kombiniert werden, um in einer Listbox mit nur einem anwählbaren +Eintrag auch Deselektion zu ermöglichen. LBOX_SNGL + LBOX_SHFT +bedeutet, daß der selektierte Eintrag durch Klick mit gedrückter +Shift-Taste deselektiert werden kann. LBOX_SNGL + LBOX_TOGGLE bewirkt +bei einem Klick auf einen selektierten Eintrag dessen Deselektion. +

+

Querverweis: Listboxen   lbox_create +

+
+ +Home +AESAES +Klemmbrett-FunktionenKlemmbrett-Funktionen +MagiC FunktionenMagiC Funktionen + + diff --git a/de/linea_about.html b/de/linea_about.html new file mode 100644 index 000000000..44f22604a --- /dev/null +++ b/de/linea_about.html @@ -0,0 +1,55 @@ + + + + + +Die Anleitung zum TOS: Der Line-A-Emulator + + + + + + + + + +Home +Line-ALine-A +Line-ALine-A +LINEALINEA + +
+ +

6.1 Der Line-A-Emulator

+

Der Line-A Emulator stellt schnelle Grafikroutinen zur +Verfügung, die als Basis für die VDI Funktionen dienen. Allerdings +sind die Line-A Funktionen nur für die 3 ST Auflösungen verwendbar! +Da sie nicht auflösungsunabhängig arbeiten, sollten sie deshalb im +Hinblick auf andere Grafiksysteme keinesfalls verwendet werden! Im TT +sind die Line-A Funktionen nur noch zur Kompatibilität vorhanden. +

+

Man spricht auch von Line-A Emulator, weil es in den Prozessoren +der 68k Reihe keine Opcodes gibt, die mit $A oder $F im höchsten +Nibble anfangen. Stattdessen wird eine Exception ausgelöst. Da der +Exceptionhandler nun selbst mehr oder weniger sinvolle Dinge tun kann, +läßt sich dieser Vorgang auch als eine Befehlserweiterung ansehen, +wobei die Opcodes nicht direkt im Prozessor ablaufen, sondern ein +Programm darstellen. Es wird also ein Maschinenbefehl quasi emuliert. +

+

Die Parameterübergabe an die Line-A Funktionen erfolgt in dem +Line-A Parameterblock. Die Adresse dieser Struktur kann mit +Initialization $A000 erfragt werden. +

+

Durch den Aufruf einer Line-A Funktion werden die Register D0-D2 +und A0-A2 verändert. Werden weitere Register verändert, wird in der +Beschreibung der jeweiligen Funktion gesondert darauf hingewiesen. +

+
+ +Home +Line-ALine-A +Line-ALine-A +LINEALINEA + + diff --git a/de/linea_bitblt.html b/de/linea_bitblt.html new file mode 100644 index 000000000..ff4d90a1a --- /dev/null +++ b/de/linea_bitblt.html @@ -0,0 +1,194 @@ + + + + + +Die Anleitung zum TOS: Bit block transfer + + + + + + + + + +Home +Line-ALine-A +Filled polygonFilled polygon +Text block transferText block transfer + +
+ +

6.12 Bit block transfer

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Bit block transfer« +
  +
Line-A Nummer: $A007 +
  +
Binding: Bindings für bit_blt +
  +
Beschreibung: Diese Line-A Funktion kopiert zwischen einem rechteckigen +Quell- und Zielbereich. Dabei kann der Quellbereich zusätzlich mit +einem Raster verknüpft werden. Quelle und Ziel können durch eine von +16 möglichen logischen Operationen verknüpft werden. Diese Funktion +dient auch als Basis für die Line-A Funktionen Text block transfer +und Copy raster form. +
  +
Für die Parameter muß eine Struktur des Typs BITBLT +ausgefüllt und in Register A6 übergeben werden. +
  +
Folgende logische Verknüpfungen stehen zur Verfügung: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OperationFunktion
0D' = 0Ziel ist Hintergrundfarbe
1D' = S & D
2D' = S &  D
3D' = S
4D' =  S & D
5D' = D
6D' = S ^ D
7D' = S | D
8D' =  (S | D)
9D' =  (S ^ D)
10D' =  D
11D' = S |  D
12D' =  S
13D' =  S | D
14D' =   (S & D)
15D' = 1Ziel ist Vordergrundfarbe
+
+ +
D' ist das Ziel (Destination) nach der Verknüpfung, S und D +sind Quelle (Source) und Ziel (Destination) vor der Verknüpfung. +& ist die logische UND (AND) Verknüpfung, | ODER (OR), ^ Exklusiv +ODER (XOR) und   die Invertierung. +
  +
Ergebnis: Die Funktion liefert keinen Returnwert. +
  +
Verfügbar: Alle TOS-Versionen. +
  +
Querverweis: Binding   Text block transfer   Copy raster form +
  + +
+ +

6.12.1 Bindings für bit_blt

+ + + + + + +
Pure-C: void bit_blt(BITBLT *bitblt); +
  +
Assembler: +
  +
movem.l   D0-D2/A0-A2,-(A7)  ; Register retten
+move.l    bitblt,A6          ; Adresse BITBLT Struktur
+dc.w      $A007              ; Line-A Opcode
+movem.l   (A7)+,D0-D2/A0-A2  ; Register restaurieren
+
+ +
+ +
+ +Home +Line-ALine-A +Filled polygonFilled polygon +Text block transferText block transfer + + diff --git a/de/linea_copyraster.html b/de/linea_copyraster.html new file mode 100644 index 000000000..6a6c2f93d --- /dev/null +++ b/de/linea_copyraster.html @@ -0,0 +1,170 @@ + + + + + +Die Anleitung zum TOS: Copy raster form + + + + + + + + + +Home +Line-ALine-A +Draw spriteDraw sprite +SeedfillSeedfill + +
+ +

6.19 Copy raster form

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Copy raster form« +
  +
Line-A Nummer: $A00E +
  +
Binding: Bindings für copy_raster +
  +
Beschreibung: Diese Line-A Funktion entspricht exakt der VDI Funktion Copy +Raster Opaque. Lediglich einige Felder des contrl Feld werden nicht +gesetzt, da keine VDI Workstation geöffnet sein muß. Deshalb sei auf +die Dokumentation der VDI Funktion verwiesen. Die folgenden Line-A +Variablen werden benutzt: +
  + + + + + + + + + + + + + + + +
Variable Bedeutung +
    +
patptr kann einen Zeiger auf ein Muster enthalten. +
multifill 0, wenn das Muster nur eine Ebene hat und 1 für mehrere +Ebenen. +
copy_tran 0 für opaques kopieren (Quelle und Ziel haben die gleiche +Anzahl Farbebenen) und 1 für transparentes kopieren (Ziel wird in +eine Farbebene kopiert) gesetzt. + +
+ +
Hinweis: Das Binding von Turbo C unterstützt diese +Funktion nicht. +
  +
Ergebnis: Die Funktion liefert keinen Returnwert. +
  +
Verfügbar: Alle TOS-Versionen. +
  +
Querverweis: Binding   vro_cpyfm +
  + +
+ +

6.19.1 Bindings für copy_raster

+ + + + + + +
Pure-C: void copy_raster( void ); /* WARNING: NOT supported ! */ +
  +
Assembler: +
  +
; Register retten
+movem.l   D0-D2/A0-A2,-(A7)
+; Zeiger Parameterblock LINEA
+move.l    pParamblk,A0
+; contrl nach A1
+move.l    (4,A0),A1
+; Adresse Source MFDB nach D0
+move.l    s_mfdb,D0
+; Unteres Wort Source MFDB nach contrl[8]
+move.w    D0,(8,A1)
+; Oberes Wort von D0 ...
+lsr.l     #8,D0
+; ... auf unteres Wort schieben
+lsr.l     #8,D0
+; Oberes Wort Source MFDB nach contrl[7]
+move.w    D0,(7,A1)
+; Adresse Ziel MFDB nach D0
+move.l    d_mfdb,D0
+; Unteres Wort Ziel MFDB nach contrl[10]
+move.w    D0,(10,A1)
+; Oberes Wort von D0 ...
+lsr.l     #8,D0
+; ... auf unteres Wort schieben
+lsr.l     #8,D0
+; Oberes Wort Ziel MFDB nach contrl[9]
+move.w    D0,(9,A1)
+; contrl in LINEA.contrl
+move.l    intin,(8,A0)
+; alten Wert des intin Feldes retten
+move.l    (8,A0),-(A7)
+; intin in LINEA.intin
+move.l    intin,(8,A0)
+; alten Wert des ptsin Feldes retten
+move.l    (12,A0),-(A7)
+; ptsin in LINEA.ptsin
+move.l    intin,(8,A0)
+; Linienmuster in LINEA.patptr
+move.w    patptr,(44,A0)
+; Ebenenflag in LINEA.multifill
+move.w    multifill,(50,A0)
+; Kopiermodus in LINEA.copy_tran
+move.w    copy_tran,(116,A0)
+; Line-A Opcode
+dc.w      $A00E
+; Zeiger Parameterblock LINEA
+move.l    pParamblk,A0
+; alten Wert des ptsin Feldes restaurieren
+move.l    (A7)+,(12,A0)
+; alten Wert des intin Feldes restaurieren
+move.l    (A7)+,(8,A0)
+; Register restaurieren
+movem.l   (A7)+,D0-D2/A0-A2
+
+ +
+ +
+ +Home +Line-ALine-A +Draw spriteDraw sprite +SeedfillSeedfill + + diff --git a/de/linea_drawsprite.html b/de/linea_drawsprite.html new file mode 100644 index 000000000..478f4e3fc --- /dev/null +++ b/de/linea_drawsprite.html @@ -0,0 +1,207 @@ + + + + + +Die Anleitung zum TOS: Draw sprite + + + + + + + + + +Home +Line-ALine-A +Undraw spriteUndraw sprite +Copy raster formCopy raster form + +
+ +

6.18 Draw sprite

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Draw sprite« +
  +
Line-A Nummer: $A00D +
  +
Binding: Bindings für draw_sprite +
  +
Beschreibung: Diese Line-A Funktion zeichnet ein Sprite auf den Bildschirm. +Die X Position wird in D0, die Y Position in D1 übergeben. A0 zeigt +auf eine Struktur des Typs SDB, die den Aufbau des Sprites beschreibt. +A2 zeigt auf den Sprite-Save-Puffer, der zur Aufnahme des geretteten +Hintergrunds dient und mindestens die Größe 10 + 64 * Anzahl der +Farbebenen haben muß. Das Register A6 wird zerstört. +
  +
typedef struct
+{
+  int16_t xhot,       /* X-Offset                   */
+          yhot,       /* Y-Offset                   */
+          form,       /* Format (1 = VDI, -1 = XOR) */
+          bgcol,      /* Hintergrundfarbe           */
+          fgcol,      /* Vordergrundfarbe           */
+          image[32];  /* Sprite-Image               */
+} SDB;
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Variable Bedeutung +
    +
xhot X-Koordinate des Aktionspunkts des Sprites, wie bei Transform +mouse. +
yhot Y-Koordinate des Aktionspunkts des Sprites, wie bei Transform +mouse. +
form 1 für das VDI-Format und -1 für das XOR-Format. +
bgcol Die Farbe des Hintergrunds +
fgcol Die Farbe des Vordergrunds. +
image Die Daten für den Vordergrund und den Hintergrund des 16*16 +Pixel großen Sprite. Dabei wird abwechselnd zuerst ein Wort des +Hintergrunds und dann ein Wort des Vordergrunds gespeichert. + +
+ +
Das Ergebnis auf dem Bildschirm ist abhängig von dem in form +bestimmten Format und kann für jeweils 1 Bit aus den Vordergrunddaten +und Hintergrunddaten der folgenden Tabelle entnommen werden. Old ist +der bisherige Bildpunkt, new der neue nach dem Zeichnen des Sprite: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Vordergr.Hintergr.VDI-FormatXOR-Format
00new = oldnew = old
01new = bgcolnew = bgcol
10new = fgcolnew = fgcol xor old
11new = fgcolnew = fgcol
+
+ +
Ergebnis: Die Funktion liefert keinen Returnwert. +
  +
Verfügbar: Alle TOS-Versionen. +
  +
Querverweis: Binding   Transform mouse   Undraw sprite +
  + +
+ +

6.18.1 Bindings für draw_sprite

+ + + + + + +
Pure-C: +
  +
typedef struct
+{
+  int16_t xhot,       /* X-Offset                   */
+          yhot,       /* Y-Offset                   */
+          form,       /* Format (1 = VDI, -1 = XOR) */
+          bgcol,      /* Hintergrundfarbe           */
+          fgcol,      /* Vordergrundfarbe           */
+          image[32];  /* Sprite-Image               */
+} SDB;
+
+typedef int16_t SSB[10 + 4 * 64];
+
+void draw_sprite( int16_t x, int16_t y, SDB *pSdb, SSB *pSsb );
+
+
Assembler: +
  +
; Register retten
+movem.l   D0-D2/A0-A2/A6,-(A7)
+; X-Position nach D0
+move.w    x,D0
+; Y-Position nach D1
+move.w    y,D1
+; Pointer Sprite-Definition-Block nach A0
+move.l    pSdb,A0
+; Pointer Sprite-Save-Block nach A2
+move.l    pSsb,A2
+; Line-A Opcode
+dc.w      $A00D
+; Register restaurieren
+movem.l   (A7)+,D0-D2/A0-A2/A6
+
+ +
+ +
+ +Home +Line-ALine-A +Undraw spriteUndraw sprite +Copy raster formCopy raster form + + diff --git a/de/linea_escape.html b/de/linea_escape.html new file mode 100644 index 000000000..47e8f524f --- /dev/null +++ b/de/linea_escape.html @@ -0,0 +1,130 @@ + + + + + +Die Anleitung zum TOS: Die negativen Line-A Variablen + + + + + + + + + +Home +Line-ALine-A +LINEALINEA +BITBLTBITBLT + +
+ +

6.3 Die negativen Line-A Variablen

+

Zusätzlich lassen sich über negative Offsets zu der +Anfangsadresse der Line-A Variablen die lokalen Variablen des +Bildschirmtreibers auslesen. Der Lesezugriff ist durch das Dokument +"S.A.L.A.D." von Atari offiziell freigegeben worden. +Allerdings sind dort die Offsets falsch angegeben. Diese Variablen +lassen sich durch die nachfolgende Struktur beschreiben. Die Zahl im +Kommentar gibt jeweils den Offset der Komponente zum Anfang Line-A +Variablen LINEA an. +

+
typedef struct
+{
+  int32_t  reserved6;          /* -$38E: reserviert                   */
+  FONT_HDR *cur_font;          /* -$38A: Zeiger auf Header akt. Font  */
+  int16_t  reserved5[23],      /* -$386: reserviert                   */
+           m_pos_hx,           /* -$358: X-Koordinate Maus Hotspot    */
+           m_pos_hy,           /* -$356: Y-Koordinate Maus Hotspot    */
+           m_planes,           /* -$354: Zeichenmodus der Maus        */
+                               /*        1 Replace, -1 XOR-Modus      */
+           m_cdb_bg,           /* -$352: Maus Hintergrundfarbe        */
+           m_cdb_fg,           /* -$350: Maus Vordergrundfarbe        */
+           mask_form[32],      /* -$34E: Vordergrund und Maske        */
+                               /*        abwechselnd 1 WORD           */
+                               /*        Vordergrund und Maske        */
+           inq_tab[45],        /* -$30E: wie vq_extnd                 */
+           dev_tab[45],        /* -$2B4: wie v_opnwk                  */
+           gcurx,              /* -$25A: X-Position Maus              */
+           gcury,              /* -$258: Y-Position Maus              */
+           m_hid_ct,           /* -$256: Anzahl der hide_mouse-calls  */
+           mouse_bt,           /* -$254: Status der Mausknöpfe        */
+           req_col[3][16],     /* -$252: Interne Daten für vq_color   */
+           siz_tab[15],        /* -$1F2: wie v_opnwk                  */
+           reserved4[2];       /*        reserviert                   */
+  void     *cur_work;          /* -$1D0: Attribute der akt. Workstn.  */
+  FONT_HDR *def_font;          /* -$1CC: Standard Systemzeichensatz   */
+  FONT_HDR *font_ring[4];      /* -$1C8: Zeichensatzlisten            */
+                               /*        verkette FONT_HDR Strukturen */
+                               /*        0 als Endekennung            */
+  int16_t  font_count,         /* -$1B8: Anzahl der Zeichensätze      */
+           reserved3[45];      /*        reserviert                   */
+  int8_t   cur_ms_stat,        /* -$15C: Mausstatus                   */
+                               /*        Bit 0:    linker Knopf       */
+                               /*        Bit 1:    rechter Knopf      */
+                               /*        Bit 2..4: reserviert         */
+                               /*        Bit 5:    1 Maus wurde bew.  */
+                               /*        Bit 6:    1 Status des r.    */
+                               /*                  Knopfs geändert    */
+                               /*        Bit 7:    1 Status des l.    */
+                               /*                  Knopfs geändert    */
+           reserved2;          /*        reserviert                   */
+  int16_t  v_hid_cnt,          /*        Anzahl der Hide_cursor-calls */
+           cur_x,              /* -$158: X-Position Maus              */
+           cur_y;              /* -$156: Y-Position Maus              */
+  int8_t   cur_flag,           /* -$154: != 0: im VBL Maus neu zeich. */
+           mouse_flag;         /* -$153: != 0: Maus-Interrupt ein     */
+  int32_t  reserved1;          /*        reserviert                   */
+  int16_t  v_sav_xy[2],        /* -$14E: gerettete X-Y-Koordinaten    */
+           save_len;           /* -$14A: Anzahl der Bildschirmzeilen  */
+  void     *save_addr;         /* -$148: Erstes gepuffertes Byte im   */
+                               /*        Bildspeicher                 */
+  int16_t  save_stat;          /* -$144: Dirty-Flag                   */
+                               /*        Bit 0: 1 Buffer ist gültig   */
+                               /*        Bit 1: 1 Long, 0 Word gebuf. */
+  int32_t  save_area[4][16];   /* -$142: Buffer für Bild unter Maus   */
+  void    (*user_tim)( void ); /*  -$42: Timer-Interrupt-Vektor       */
+                               /*        sollte zum Beenden next_tim  */
+                               /*        anspringen                   */
+  void    (*next_tim)( void ); /*  -$3E: alter Timer-Interrupt        */
+  void    (*user_but)( void ); /*  -$3A: Maustasten-Vektor            */
+  void    (*user_cur)( void ); /*  -$36: Maus-Vektor                  */
+  void    (*user_mot)( void ); /*  -$32: Mausbewegungs-Vektor         */
+  int16_t  v_cel_ht,           /*  -$2E: Zeichenhöhe                  */
+           v_cel_mx,           /*  -$2C: maximale Cursorspalte        */
+           v_cel_my,           /*  -$2A: maximale Cursorzeile         */
+           v_cel_wr,           /*  -$28: Characterzeilenbreite        */
+           v_col_bg,           /*  -$26: Hintergrundfarbe             */
+           v_col_fg;           /*  -$24: Vordergrundfarbe             */
+  void     *v_cur_ad;          /*  -$22: Adresse der Cursorposition   */
+  int16_t  v_cur_off,          /*  -$1E: Vertikaler Bildschirmoffset  */
+           v_cur_xy[2];        /*  -$1C: X-Y-Cursor                   */
+  int8_t   v_period,           /*  -$18: Blinkgeschwindigkeit         */
+           v_cur_ct;           /*  -$17: Zähler für Blinken           */
+  void     *v_fnt_ad;          /*  -$16: Zeiger auf Font              */
+  int16_t  v_fnt_nd,           /*  -$12: größter ASCII-Wert           */
+           v_fnt_st,           /*  -$10: kleinster ASCII-Wert         */
+           v_fnt_wd,           /*   -$E: Breite des Fontimage in Byte */
+           v_rez_hz,           /*   -$C: Bildschirmbreite in Pixel    */
+           *v_off_ad,          /*   -$A: Font-Offset-Tabelle          */
+           reserved,           /*   -$6: Cursorflag (TOS 1.00)/res.   */
+                               /*        Bit 0: Blinken aus/ein       */
+                               /*        Bit 1: Blinkstatus norm/inv  */
+                               /*        Bit 2: Cursor unsichtb/sicht */
+                               /*        Bit 3: Wrapping ein/aus      */
+                               /*        Bit 4: invers ein/aus        */
+                               /*        Bit 5: Cursorpos. gesp. n/j  */
+           v_rez_vt,           /*   -$4: Bildschirmhöhe in Pixel      */
+           bytes_lin;          /*   -$2: Bytes pro Pixelzeile         */
+} VDIESC;
+
+
+ +Home +Line-ALine-A +LINEALINEA +BITBLTBITBLT + + diff --git a/de/linea_fillpoly.html b/de/linea_fillpoly.html new file mode 100644 index 000000000..20532ce35 --- /dev/null +++ b/de/linea_fillpoly.html @@ -0,0 +1,246 @@ + + + + + +Die Anleitung zum TOS: Filled polygon + + + + + + + + + +Home +Line-ALine-A +Filled rectangleFilled rectangle +Bit block transferBit block transfer + +
+ +

6.11 Filled polygon

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Filled polygon« +
  +
Line-A Nummer: $A006 +
  +
Binding: Bindings für filled_polygon +
  +
Beschreibung: Diese Line-A Funktion zeichnet eine Zeile eine ausgefüllten +Polygons durch Aufrufe der Horizontal line Funktion. Zum Zeichnen des +gesamten Polygons muß diese Funktion für jede mögliche Y-Koordinate +aufgerufen werden. Zusätzlich besteht wie bei Filled rectangle die +Möglichkeit, das Zeichnen des Rechtecks nur in einem zusätzlich +übergebenen Clip-Bereich zuzulassen. +
  +
Sämtliche Punkte des Polygons werden in dem Feld ptsin +übergeben, die Anzahl der Punkte steht im zweiten Element des contrl +Feldes. In C steht damit in contrl[1] die Anzahl Punkte, ptsin[0] die +X-Koordinate des ersten Punkts, ptsin[1] die Y-Koordinate des ersten +Punkts, ptsin[2] die X-Koordinate des zweiten Punkts, ... Der letzte +Punkt in ptsin muß wieder der erste Punkt sein, damit das Polygon +geschlossen ist! Die Y-Koordinate der zu zeichnenden Zeile wird in dem +Line-A Parameterblock in y1 übergeben. +
  +
Die folgenden Line-A Variablen werden benutzt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Variable Bedeutung +
    +
y1 Y-Koordinate der zu zeichnenden Zeile. +
fg_bp_1 Bitwert der ersten Plane für die Farbe, mit der gefüllt +werden soll. +
fg_bp_2 Bitwert der zweiten Plane (nur niedrige oder mittlere +Auflösung). +
fg_bp_3 Bitwert der dritten Plane (nur niedrige Auflösung). +
fg_bp_4 Bitwert der vierten Plane (nur niedrige Auflösung). +
patptr Zeiger auf ein Feld mit 16 Bit Linienmustern. +
patmsk Anzahl Linienmuster - 1. In Abhängigkeit von der y-Koordinate +wird nun aus dem Feld mit den Linienmustern eines ausgewählt. Der +Index des verwendeten Linienmusters läßt sich durch (y mod (patmsk + +1)) berechnen. Durch die Angabe mehrerer Linienmuster und mehrmaliges +Aufrufen dieser Funktion für aufeinanderfolgende Zeilen lassen sich +leicht auch komplexe Muster zeichnen. +
wrt_mode Schreibmodes, es sind die folgenden Modie möglich: + + + + + + + + + + + + +
REPLACE 0 Replace +
TRANS 1 Transparent (OR) +
XOR 2 Inverse (XOR) +
INVERS 3 Inverse Transparent (XOR mit not(LN_MASK)) + +
+ +
clip 1 wenn Clipping gewünscht wird, 0 sonst. +
xmn_clip X-Koordinate der linken oberen Ecke des Clipping Bereichs, wenn +Clipping eingeschaltet ist. +
ymn_clip Y-Koordinate der linken oberen Ecke des Clipping Bereichs, wenn +Clipping eingeschaltet ist. +
xmx_clip X-Koordinate der rechten unteren Ecke des Clipping Bereichs, +wenn Clipping eingeschaltet ist. +
ymx_clip Y-Koordinate der rechten unteren Ecke des Clipping Bereichs, +wenn Clipping eingeschaltet ist. + +
+ +
Das Binding von TC übergibt Linienmuster, Schreibmodus und +Farbe nicht an die filled_polygon() Funktion, sondern benutzt separate +Funktionen set_fg_bp(), set_wrt_mode(), set_pattern() und +set_clipping() zum Setzen der Parameter in dem Line-A Parameterblock. +
  +
Ergebnis: Die Funktion liefert keinen Returnwert. +
  +
Verfügbar: Alle TOS-Versionen. +
  +
Querverweis: Binding   Horizontal line   Filled rectangle +
  + +
+ +

6.11.1 Bindings für filled_polygon

+ + + + + + +
Pure-C: void filled_polygon( int16_t *xy, int16_t count ); +
  +
Assembler: Es wird angenommen, daß das contrl Feld schon in den Line-A +Parameterblock eingetragen wurde. +
  +
; Register retten
+movem.l   D0-D2/A0-A2,-(A7)
+; Zeiger Parameterblock LINEA
+move.l    pParamblk,A0
+; contrl nach A1
+move.w    (4,A0),A1
+; Anzahl Punkte nach contrl[1]
+move.w    count,(2,A1)
+; alten Wert des ptsin Feldes retten
+move.l    (12,A0),-(A7)
+; Feld mit Koordinaten der Ecken in LINEA.ptsin
+move.l    xy,(12,A0)
+; zu zeichnende Zeile, Y-Koordinate in LINEA.y1
+move.w    y1,(40,A0)
+; Bit für erste Plane in LINEA.fg_bp_1
+move.w    colbit0,(24,A0)
+; Bit für erste Plane in LINEA.fg_bp_2
+move.w    colbit1,(26,A0)
+; Bit für erste Plane in LINEA.fg_bp_3
+move.w    colbit2,(28,A0)
+; Bit für erste Plane in LINEA.fg_bp_4
+move.w    colbit3,(30,A0)
+; Writemode in LINEA.wrt_mode
+move.w    wmode,(36,A0)
+; Linienmuster in LINEA.patptr
+move.w    patptr,(46,A0)
+; Anzahl Muster in LINEA.patmsk
+move.w    patmsk,(50,A0)
+; Clipmode in LINEA.clip
+move.w    mode,(54,A0)
+; linke obere Clip-Ecke, X-Koordinate in LINEA.xmn_clip
+move.w    cx1,(56,A0)
+; linke obere Clip-Ecke, Y-Koordinate in LINEA.ymn_clip
+move.w    cy1,(58,A0)
+; rechte untere Clip-Ecke, X-Koordinate in LINEA.xmx_clip
+move.w    cx2,(60,A0)
+; rechte untere Clip-Ecke, Y-Koordinate in LINEA.ymx_clip
+move.w    cy2,(62,A0)
+; Line-A Opcode
+dc.w      $A006
+; Zeiger Parameterblock LINEA
+move.l    pParamblk,A0
+; alten Wert des ptsin Feldes restaurieren
+move.l    (A7)+,(12,A0)
+; Register restaurieren
+movem.l   (A7)+,D0-D2/A0-A2
+
+ +
+ +
+ +Home +Line-ALine-A +Filled rectangleFilled rectangle +Bit block transferBit block transfer + + diff --git a/de/linea_fillrect.html b/de/linea_fillrect.html new file mode 100644 index 000000000..2cbd67549 --- /dev/null +++ b/de/linea_fillrect.html @@ -0,0 +1,240 @@ + + + + + +Die Anleitung zum TOS: Filled rectangle + + + + + + + + + +Home +Line-ALine-A +Horizontal lineHorizontal line +Filled polygonFilled polygon + +
+ +

6.10 Filled rectangle

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Filled rectangle« +
  +
Line-A Nummer: $A005 +
  +
Binding: Bindings für filled_rect +
  +
Beschreibung: Diese Line-A Funktion zeichnet ein ausgefülltes Rechteck durch +Aufrufe der Horizontal line Funktion. Zusätzlich besteht die +Möglichkeit, das Zeichnen des Rechtecks nur in einem zusätzlich +übergebenen Clip-Bereich zuzulassen. Die folgenden Line-A Variablen +werden benutzt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Variable Bedeutung +
    +
x1 X-Koordinate der linken oberen Ecke des Rechtecks. +
y1 Y-Koordinate der linken oberen Ecke des Rechtecks. +
x2 X-Koordinate der rechten unteren Ecke des Rechtecks. +
y2 Y-Koordinate der rechten unteren Ecke des Rechtecks. +
fg_bp_1 Bitwert der ersten Plane für die Farbe, mit der gefüllt +werden soll. +
fg_bp_2 Bitwert der zweiten Plane (nur niedrige oder mittlere +Auflösung). +
fg_bp_3 Bitwert der dritten Plane (nur niedrige Auflösung). +
fg_bp_4 Bitwert der vierten Plane (nur niedrige Auflösung). +
patptr Zeiger auf ein Feld mit 16 Bit Linienmustern. +
patmsk Anzahl Linienmuster - 1. In Abhängigkeit von der y-Koordinate +wird nun aus dem Feld mit den Linienmustern eines ausgewählt. Der +Index des verwendeten Linienmusters läßt sich durch (y mod (patmsk + +1)) berechnen. Durch die Angabe mehrerer Linienmuster und mehrmaliges +Aufrufen dieser Funktion für aufeinanderfolgende Zeilen lassen sich +leicht auch komplexe Muster zeichnen. +
wrt_mode Schreibmodes, es sind die folgenden Modie möglich: + + + + + + + + + + + + +
REPLACE 0 Replace +
TRANS 1 Transparent (OR) +
XOR 2 Inverse (XOR) +
INVERS 3 Inverse Transparent (XOR mit not(LN_MASK)) + +
+ +
clip 1 wenn Clipping gewünscht wird, 0 sonst. +
xmn_clip X-Koordinate der linken oberen Ecke des Clipping Bereichs, wenn +Clipping eingeschaltet ist. +
ymn_clip Y-Koordinate der linken oberen Ecke des Clipping Bereichs, wenn +Clipping eingeschaltet ist. +
xmx_clip X-Koordinate der rechten unteren Ecke des Clipping Bereichs, +wenn Clipping eingeschaltet ist. +
ymx_clip Y-Koordinate der rechten unteren Ecke des Clipping Bereichs, +wenn Clipping eingeschaltet ist. + +
+ +
Das Binding von TC übergibt Linienmuster, Schreibmodus und +Farbe nicht an die filled_rect() Funktion, sondern benutzt separate +Funktionen set_fg_bp(), set_wrt_mode(), set_pattern() und +set_clipping() zum Setzen der Parameter in dem Line-A Parameterblock. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis +
  +
Verfügbar: Alle TOS-Versionen. +
  +
Querverweis: Binding   Horizontal line +
  + +
+ +

6.10.1 Bindings für filled_rect

+ + + + + + +
Pure-C: void filled_rect( int16_t x1, int16_t y1, int16_t x2, int16_t +y2 ); +
  +
Assembler: +
  +
; Register retten
+movem.l   D0-D2/A0-A2,-(A7)
+; Zeiger Parameterblock LINEA
+move.l    pParamblk,A0
+; linke obere Ecke, X-Koordinate in LINEA.x1
+move.w    x1,(38,A0)
+; linke obere Ecke, Y-Koordinate in LINEA.y1
+move.w    y1,(40,A0)
+; rechte untere Ecke, X-Koordinate in LINEA.x2
+move.w    x2,(42,A0)
+; rechte untere Ecke, Y-Koordinate in LINEA.x2
+move.w    y2,(44,A0)
+; Bit für erste Plane in LINEA.fg_bp_1
+move.w    colbit0,(24,A0)
+; Bit für erste Plane in LINEA.fg_bp_2
+move.w    colbit1,(26,A0)
+; Bit für erste Plane in LINEA.fg_bp_3
+move.w    colbit2,(28,A0)
+; Bit für erste Plane in LINEA.fg_bp_4
+move.w    colbit3,(30,A0)
+; Writemode in LINEA.wrt_mode
+move.w    wmode,(36,A0)
+; Linienmuster in LINEA.patptr
+move.w    patptr,(46,A0)
+; Anzahl Muster in LINEA.patmsk
+move.w    patmsk,(50,A0)
+; Clipmode in LINEA.clip
+move.w    mode,(54,A0)
+; linke obere Clip-Ecke, X-Koordinate in LINEA.xmn_clip
+move.w    cx1,(56,A0)
+; linke obere Clip-Ecke, Y-Koordinate in LINEA.ymn_clip
+move.w    cy1,(58,A0)
+; rechte untere Clip-Ecke, X-Koordinate in LINEA.xmx_clip
+move.w    cx2,(60,A0)
+; rechte untere Clip-Ecke, Y-Koordinate in LINEA.ymx_clip
+move.w    cy2,(62,A0)
+; Line-A Opcode
+dc.w      $A005
+; Register restaurieren
+movem.l   (A7)+,D0-D2/A0-A2
+
+ +
+ +
+ +Home +Line-ALine-A +Horizontal lineHorizontal line +Filled polygonFilled polygon + + diff --git a/de/linea_getpixel.html b/de/linea_getpixel.html new file mode 100644 index 000000000..dcb192242 --- /dev/null +++ b/de/linea_getpixel.html @@ -0,0 +1,95 @@ + + + + + +Die Anleitung zum TOS: Get pixel + + + + + + + + + +Home +Line-ALine-A +Put pixelPut pixel +Arbitrary lineArbitrary line + +
+ +

6.7 Get pixel

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Get pixel« +
  +
Line-A Nummer: $A002 +
  +
Binding: Bindings für get_pixel +
  +
Beschreibung: Diese Line-A Funktion ermittelt die Farbe an den angegebenen +Koordinaten. +
  +
Ergebnis: Die Funktion liefert in D0 die Farbe der angegebenen +Koordinaten. +
  +
Verfügbar: Alle TOS-Versionen. +
  +
Querverweis: Binding   LINEA   Put Pixel +
  + +
+ +

6.7.1 Bindings für get_pixel

+ + + + + + +
Pure-C: int16_t get_pixel( int x, int y ); +
  +
Assembler: +
  +
movem.l   D0-D2/A0-A2,-(A7)  ; Register retten
+move.l    pParamblk,A0       ; Zeiger Parameterblock LINEA
+move.l    (12,A0),A1         ; Adresse ptsin
+move.w    x,(A1)             ; X-Koordinate in ptsin[0]
+move.w    y,(2,A1)           ; Y-Koordinate in ptsin[1]
+dc.w      $A002              ; Line-A Opcode
+move.w    D0,color           ; D0 enthält Farbe
+movem.l   (A7)+,D0-D2/A0-A2  ; Register restaurieren
+
+ +
+ +
+ +Home +Line-ALine-A +Put pixelPut pixel +Arbitrary lineArbitrary line + + diff --git a/de/linea_hidemouse.html b/de/linea_hidemouse.html new file mode 100644 index 000000000..8bd968863 --- /dev/null +++ b/de/linea_hidemouse.html @@ -0,0 +1,88 @@ + + + + + +Die Anleitung zum TOS: Hide mouse + + + + + + + + + +Home +Line-ALine-A +Show mouseShow mouse +Transform mouseTransform mouse + +
+ +

6.15 Hide mouse

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Hide mouse« +
  +
Line-A Nummer: $A00A +
  +
Binding: Bindings für hide_mouse +
  +
Beschreibung: Diese Line-A Funktion schaltet den Mauszeiger aus. +
  +
Ergebnis: Die Funktion liefert keinen Returnwert. +
  +
Verfügbar: Alle TOS-Versionen. +
  +
Querverweis: Binding   Show mouse +
  + +
+ +

6.15.1 Bindings für hide_mouse

+ + + + + + +
Pure-C: void hide_mouse( void ); +
  +
Assembler: +
  +
movem.l   D0-D2/A0-A2,-(A7)  ; Register retten
+dc.w      $A00A              ; Line-A Opcode
+movem.l   (A7)+,D0-D2/A0-A2  ; Register restaurieren
+
+ +
+ +
+ +Home +Line-ALine-A +Show mouseShow mouse +Transform mouseTransform mouse + + diff --git a/de/linea_hline.html b/de/linea_hline.html new file mode 100644 index 000000000..f830d2eeb --- /dev/null +++ b/de/linea_hline.html @@ -0,0 +1,206 @@ + + + + + +Die Anleitung zum TOS: Horizontal line + + + + + + + + + +Home +Line-ALine-A +Arbitrary lineArbitrary line +Filled rectangleFilled rectangle + +
+ +

6.9 Horizontal line

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Horizontal line« +
  +
Line-A Nummer: $A004 +
  +
Binding: Bindings für horizontal_line +
  +
Beschreibung: Diese Line-A Funktion zeichnet eine horizontale Line. Die +folgenden Line-A Variablen werden benutzt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Variable Bedeutung +
    +
x1 X-Koordinate des ersten Endpunkts. +
y1 Y-Koordinate der Linie. +
x2 X-Koordinate des zweiten Endpunkts. +
fg_bp_1 Bitwert der ersten Plane für die Farbe, mit der gefüllt +werden soll. +
fg_bp_2 Bitwert der zweiten Plane (nur niedrige oder mittlere +Auflösung). +
fg_bp_3 Bitwert der dritten Plane (nur niedrige Auflösung). +
fg_bp_4 Bitwert der vierten Plane (nur niedrige Auflösung). +
patptr Zeiger auf ein Feld mit 16 Bit Linienmustern. +
patmsk Anzahl Linienmuster - 1. In Abhängigkeit von der y-Koordinate +wird nun aus dem Feld mit den Linienmustern eines ausgewählt. Der +Index des verwendeten Linienmusters läßt sich durch (y mod (patmsk + +1)) berechnen. Durch die Angabe mehrerer Linienmuster und mehrmaliges +Aufrufen dieser Funktion für aufeinanderfolgende Zeilen lassen sich +leicht auch komplexe Muster zeichnen. +
wrt_mode Schreibmodes, es sind die folgenden Modie möglich: + + + + + + + + + + + + +
REPLACE 0 Replace +
TRANS 1 Transparent (OR) +
XOR 2 Inverse (XOR) +
INVERS 3 Inverse Transparent (XOR mit not(LN_MASK)) + +
+ +
multifill 0 gibt an, das nur die erste Farbebene gezeichnet werden soll, +ein Wert >0 daß alle Farbebenen gezeichnet werden sollen. + +
+ +
Hinweis: Diese Funktion wird intern für die +Flächenfüllroutinen benutzt. +
  +
Das Binding von TC übergibt Linienmuster, Schreibmodus und +Farbe nicht an die horizontal_line Funktion, sondern benutzt separate +Funktionen set_fg_bp(), set_wrt_mode() und set_pattern() zum Setzen +der Parameter in dem Line-A Parameterblock. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Alle TOS-Versionen. +
  +
Querverweis: Binding   LINEA   Filled rectangle +
  + +
+ +

6.9.1 Bindings für horizontal_line

+ + + + + + +
Pure-C: void horizontal_line( int16_t x1, int16_t y1, int16_t x2 ); +
  +
Assembler: +
  +
; Register retten
+movem.l   D0-D2/A0-A2,-(A7)
+; Zeiger Parameterblock LINEA
+move.l    pParamblk,A0
+; erste X-Koordinate in LINEA.x1
+move.w    x1,(38,A0)
+; erste Y-Koordinate in LINEA.y1
+move.w    y1,(40,A0)
+; zweite X-Koordinate in LINEA.x2
+move.w    x2,(42,A0)
+; Bit für erste Plane in LINEA.fg_bp_1
+move.w    colbit0,(24,A0)
+; Bit für erste Plane in LINEA.fg_bp_2
+move.w    colbit1,(26,A0)
+; Bit für erste Plane in LINEA.fg_bp_3
+move.w    colbit2,(28,A0)
+; Bit für erste Plane in LINEA.fg_bp_4
+move.w    colbit3,(30,A0)
+; Writemode in LINEA.wrt_mode
+move.w    wmode,(36,A0)
+; Linienmuster in LINEA.patptr
+move.w    patptr,(44,A0)
+; Anzahl Muster in LINEA.patmsk
+move.w    patmsk,(48,A0)
+; Writemode in LINEA.multifill
+move.w    mfill,(52,A0)
+; Line-A Opcode
+dc.w      $A004
+; Register restaurieren
+movem.l   (A7)+,D0-D2/A0-A2
+
+ +
+ +
+ +Home +Line-ALine-A +Arbitrary lineArbitrary line +Filled rectangleFilled rectangle + + diff --git a/de/linea_init.html b/de/linea_init.html new file mode 100644 index 000000000..656352f46 --- /dev/null +++ b/de/linea_init.html @@ -0,0 +1,105 @@ + + + + + +Die Anleitung zum TOS: Initialization + + + + + + + + + +Home +Line-ALine-A +BITBLTBITBLT +Put pixelPut pixel + +
+ +

6.5 Initialization

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Line-A Initialization« +
  +
Line-A Nummer: $A000 +
  +
Binding: Bindings für linea_init +
  +
Beschreibung: Diese Line-A Funktion dient dazu, die Adresses des Line-A +Parameterblock abzufragen. +
  +
Ergebnis: Die Funktion liefert in D0 und A0 einen Zeiger auf den +Parameterblock zurück. In A1 wird einen Zeiger auf ein Feld mit den 3 +Adressen der Systemzeichensätze zurückgeliefert. In A2 wird ein +Zeiger auf die Anfangsadressen der Line-A Routinen zurückgeliefert. +
  +
Hinweis: Einige Bindings, wie z.B. das von TC, liefern +die Adressen nicht an den Aufrufer zurück, sondern setzen selbst +intern die Parameter für den Aufruf der Line-A Funktionen. +
  +
Verfügbar: Alle TOS-Versionen. +
  +
Querverweis: Binding   LINEA +
  + +
+ +

6.5.1 Bindings für linea_init

+ + + + + + +
Pure-C: void linea_init( void ); +
  +
Assembler: +
  +
; Register retten
+movem.l   D0-D2/A0-A2,-(A7)
+; Line-A Opcode
+dc.w      $A000
+; Zeiger Parameterblock LINEA
+move.l    A0,pParamblk
+; Zeiger Systemzeichensätze
+move.l    A1,pFnthdr
+; Zeiger Anfangsadr. Line-A Routinen
+move.l    A2,pFktadr
+; Register restaurieren
+movem.l   (A7)+,D0-D2/A0-A2
+
+ +
+ +
+ +Home +Line-ALine-A +BITBLTBITBLT +Put pixelPut pixel + + diff --git a/de/linea_line.html b/de/linea_line.html new file mode 100644 index 000000000..b24949daf --- /dev/null +++ b/de/linea_line.html @@ -0,0 +1,206 @@ + + + + + +Die Anleitung zum TOS: Arbitrary line + + + + + + + + + +Home +Line-ALine-A +Get pixelGet pixel +Horizontal lineHorizontal line + +
+ +

6.8 Arbitrary line

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Arbitrary line« +
  +
Line-A Nummer: $A003 +
  +
Binding: Bindings für draw_line +
  +
Beschreibung: Diese Line-A Funktion zeichnet eine Line von links oben nach +rechts unten. Die folgenden Line-A Variablen werden benutzt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Variable Bedeutung +
    +
x1 X-Koordinate des ersten Endpunkts. +
y1 Y-Koordinate des ersten Endpunkts. +
x2 X-Koordinate des zweiten Endpunkts. +
y2 Y-Koordinate des zweiten Endpunkts. +
fg_bp_1 Bitwert der ersten Plane für die Farbe, mit der gefüllt +werden soll. +
fg_bp_2 Bitwert der zweiten Plane (nur niedrige oder mittlere +Auflösung). +
fg_bp_3 Bitwert der dritten Plane (nur niedrige Auflösung). +
fg_bp_4 Bitwert der vierten Plane (nur niedrige Auflösung). +
ln_mask Bitmuster für den Linientyp. Das Bitmuster ist als +Punktemuster zu interpretieren. +
wrt_mode Schreibmodes, es sind die folgenden Modie möglich: + + + + + + + + + + + + +
REPLACE 0 Replace +
TRANS 1 Transparent (OR) +
XOR 2 Inverse (XOR) +
INVERS 3 Inverse Transparent (XOR mit not(LN_MASK)) + +
+ +
lstlin Soll der letzte Pixel der Linie gezeichnet werden (1) oder +nicht (0). + +
+ +
Hinweis: Unabhängig von der Reihenfolge der Koordinaten +wird die Linie immer von links oben nach rechts unten gezeichnet. +
  +
Für eine horizontale Linie steht die schnellere Funktion $A004 +Horizontal line zur Verfügung. +
  +
Das Bindings von TC übergibt Linienmaske, Schreibmodus und +Farbe nicht an die draw_line Funktion sonder benutzt separate +Funktionen set_fg_bp(), set_ln_mask() und set_wrt_mode() zum Setzen +der Parameter in dem Line-A Paramterblock. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. Das Feld ln_mask des Line-A +Paramterblocks ist durch den Ausgabealgorithmus geshiftet. +
  +
Verfügbar: Alle TOS-Versionen. +
  +
Querverweis: Binding   LINEA   Horizontal line +
  + +
+ +

6.8.1 Bindings für draw_line

+ + + + + + +
Pure-C: void draw_line(int16_t x1, int16_t y1, int16_t x2, int16_t y2); +
  +
Assembler: +
  +
; Register retten
+movem.l   D0-D2/A0-A2,-(A7)
+; Zeiger Parameterblock LINEA
+move.l    pParamblk,A0
+; erste X-Koordinate in LINEA.x1
+move.w    x1,(38,A0)
+; erste Y-Koordinate in LINEA.y1
+move.w    y1,(40,A0)
+; zweite X-Koordinate in LINEA.x2
+move.w    x2,(42,A0)
+; zweite Y-Koordinate in LINEA.y2
+move.w    y2,(44,A0)
+; Bit für erste Plane in LINEA.fg_bp_1
+move.w    colbit0,(24,A0)
+; Bit für erste Plane in LINEA.fg_bp_2
+move.w    colbit1,(26,A0)
+; Bit für erste Plane in LINEA.fg_bp_3
+move.w    colbit2,(28,A0)
+; Bit für erste Plane in LINEA.fg_bp_4
+move.w    colbit3,(30,A0)
+; Linestyle in LINEA.ln_mask
+move.w    lnmask,(34,A0)
+; Writemode in LINEA.wrt_mode
+move.w    wmode,(36,A0)
+; Linestyle in LINEA.lstlin
+move.w    lstlin,(32,A0)
+; Line-A Opcode
+dc.w      $A003
+; Register restaurieren
+movem.l   (A7)+,D0-D2/A0-A2
+
+ +
+ +
+ +Home +Line-ALine-A +Get pixelGet pixel +Horizontal lineHorizontal line + + diff --git a/de/linea_main.html b/de/linea_main.html new file mode 100644 index 000000000..ce1334d62 --- /dev/null +++ b/de/linea_main.html @@ -0,0 +1,56 @@ + + + + + +Die Anleitung zum TOS: Line-A + + + + + + + + + +Home +Inhaltsverzeichnis +GEMDOS-StrukturenGEMDOS-Strukturen +Der Line-A-EmulatorDer Line-A-Emulator + +
+ +

6 Line-A

+ +
+
+ +Home +Inhaltsverzeichnis +GEMDOS-StrukturenGEMDOS-Strukturen +Der Line-A-EmulatorDer Line-A-Emulator + + diff --git a/de/linea_putpixel.html b/de/linea_putpixel.html new file mode 100644 index 000000000..abc30dbf7 --- /dev/null +++ b/de/linea_putpixel.html @@ -0,0 +1,95 @@ + + + + + +Die Anleitung zum TOS: Put pixel + + + + + + + + + +Home +Line-ALine-A +InitializationInitialization +Get pixelGet pixel + +
+ +

6.6 Put pixel

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Put pixel« +
  +
Line-A Nummer: $A001 +
  +
Binding: Bindings für put_pixel +
  +
Beschreibung: Diese Line-A Funktion setzt einen Punkt in der angegebenen +Farbe an die angegebenen Koordinaten. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Alle TOS-Versionen. +
  +
Querverweis: Binding   LINEA   Get Pixel +
  + +
+ +

6.6.1 Bindings für put_pixel

+ + + + + + +
Pure-C: void put_pixel( int16_t x, int16_t y, int16_t color ); +
  +
Assembler: +
  +
movem.l   D0-D2/A0-A2,-(A7)  ; Register retten
+move.l    pParamblk,A0       ; Zeiger Parameterblock LINEA
+move.l    (8,A0),A1          ; Adresse intin
+move.w    color,(A1)         ; Farbe in intin[0]
+move.l    (12,A0),A1         ; Adresse ptsin
+move.w    x,(A1)             ; X-Koordinate in ptsin[0]
+move.w    y,(2,A1)           ; Y-Koordinate in ptsin[1]
+dc.w      $A001              ; Line-A Opcode
+movem.l   (A7)+,D0-D2/A0-A2  ; Register reataurieren
+
+ +
+ +
+ +Home +Line-ALine-A +InitializationInitialization +Get pixelGet pixel + + diff --git a/de/linea_seedfill.html b/de/linea_seedfill.html new file mode 100644 index 000000000..e85114897 --- /dev/null +++ b/de/linea_seedfill.html @@ -0,0 +1,217 @@ + + + + + +Die Anleitung zum TOS: Seedfill + + + + + + + + + +Home +Line-ALine-A +Copy raster formCopy raster form +VDIVDI + +
+ +

6.20 Seedfill

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Seedfill« +
  +
Line-A Nummer: $A00F +
  +
Binding: Bindings für seed_fill +
  +
Beschreibung: Diese Line-A Funktion füllt einen Bereich mit einer Farbe aus +und entspricht damit der VDI Funktion v_contourfill. +
  +
Im ersten Word von ptsin (ptsin[0] in C) wird die X-Koordinate +und im zweiten Word von ptsin (ptsin[1] in C) wird die Y-Koordinate +des Startpunkts übergeben. In das erste Wort von intin (intin[0] in +C) wird das Mode-Wort geschrieben. Ist das Mode-Wort größer 0, gibt +es die Farbe der Umgrenzung an, bis zu der gefüllt werden soll. Ist +das Mode-Wort kleiner 0, besteht die Umgenzung aus allen Pixeln, die +nicht die Farbe des Startpunkts haben. +
  +
Die folgenden Line-A Variablen werden benutzt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Variable Bedeutung +
    +
fill_abort Dies ist die Adresse eine Funktion, die am Ende jeder Zeile +aufgerufen wird. Liefert diese Funktion in D0 den Wert 0, wird mit dem +Füllen fortgefahren, ansonsten abgebrochen. +
patptr Zeiger auf ein Feld mit 16 Bit Linienmustern. +
patmsk Anzahl Linienmuster - 1. In Abhängigkeit von der y-Koordinate +wird nun aus dem Feld mit den Linienmustern eines ausgewählt. Der +Index des verwendeten Linienmusters läßt sich durch (y mod (patmsk + +1)) berechnen. Durch die Angabe mehrerer Linienmuster und mehrmaliges +Aufrufen dieser Funktion für aufeinanderfolgende Zeilen lassen sich +leicht auch komplexe Muster zeichnen. +
multifill 0, wenn das Muster nur eine Ebene hat und 1 für mehrere +Ebenen. +
wrt_mode Schreibmodes, es sind die folgenden Modie möglich: + + + + + + + + + + + + +
REPLACE 0 Replace +
TRANS 1 Transparent (OR) +
XOR 2 Inverse (XOR) +
INVERS 3 Inverse Transparent (XOR mit not(LN_MASK)) + +
+ +
clip 1 wenn Clipping gewünscht wird, 0 sonst. +
xmn_clip X-Koordinate der linken oberen Ecke des Clipping Bereichs, wenn +Clipping eingeschaltet ist. +
ymn_clip Y-Koordinate der linken oberen Ecke des Clipping Bereichs, wenn +Clipping eingeschaltet ist. +
xmx_clip X-Koordinate der rechten unteren Ecke des Clipping Bereichs, +wenn Clipping eingeschaltet ist. +
ymx_clip Y-Koordinate der rechten unteren Ecke des Clipping Bereichs, +wenn Clipping eingeschaltet ist. + +
+ +
Ergebnis: Die Funktion liefert keinen Returnwert. +
  +
Verfügbar: Alle TOS-Versionen. +
  +
Querverweis: Binding   v_contourfill +
  + +
+ +

6.20.1 Bindings für seed_fill

+ + + + + + +
Pure-C: void seed_fill( void ); /* WARNING: NOT supported ! */ +
  +
Assembler: Es wird angenommen, daß das intin und ptsin Feld schon in den +Line-A Parameterblock eingetragen wurde. +
  +
; Register retten
+movem.l   D0-D2/A0-A2,-(A7)
+; Zeiger Parameterblock LINEA
+move.l    pParamblk,A0
+; Adresse intin nach A1
+move.l    (8,A0),A1
+; Mode-Wort nach intin[0]
+move.w    mode_wort,(A1)
+; Adresse ptsin nach A1
+move.l    (12,A0),A1
+; X-Koordinate nach ptsin[0]
+move.w    x,(A1)
+; Y-Koordinate nach ptsin[1]
+move.w    y,(2,A1)
+; Writemode in LINEA.wrt_mode
+move.w    wmode,(36,A0)
+; Linienmuster in LINEA.patptr
+move.w    patptr,(44,A0)
+; Anzahl Muster in LINEA.patmsk
+move.w    patmsk,(48,A0)
+; Ebenenflag in LINEA.multifill
+move.w    multifill,(50,A0)
+; Clipmode in LINEA.clip
+move.w    mode,(54,A0)
+; linke obere Clip-Ecke, X-Koordinate in LINEA.xmn_clip
+move.w    cx1,(56,A0)
+; linke obere Clip-Ecke, Y-Koordinate in LINEA.ymn_clip
+move.w    cy1,(58,A0)
+; rechte untere Clip-Ecke, X-Koordinate in LINEA.xmx_clip
+move.w    cx2,(60,A0)
+; rechte untere Clip-Ecke, Y-Koordinate in LINEA.ymx_clip
+move.w    cy2,(62,A0)
+; Abbruchfunktion nach LINEA.fill_abort
+move.l    fill_abort,(118,A0)
+; Line-A Opcode
+dc.w      $A00F
+; Register restaurieren
+movem.l   (A7)+,D0-D2/A0-A2
+
+ +
+ +
+ +Home +Line-ALine-A +Copy raster formCopy raster form +VDIVDI + + diff --git a/de/linea_showmouse.html b/de/linea_showmouse.html new file mode 100644 index 000000000..7ecaaf0cc --- /dev/null +++ b/de/linea_showmouse.html @@ -0,0 +1,96 @@ + + + + + +Die Anleitung zum TOS: Show mouse + + + + + + + + + +Home +Line-ALine-A +Text block transferText block transfer +Hide mouseHide mouse + +
+ +

6.14 Show mouse

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Show mouse« +
  +
Line-A Nummer: $A009 +
  +
Binding: Bindings für show_mouse +
  +
Beschreibung: Diese Line-A Funktion schaltet die Maus wieder ein. Wird der +erste Wert des intin Feldes auf 0 gesetzt, wird die Maus sofort +eingeschaltet. Ist der Wert ungleich 0, arbeitet die Funktion im +Normalmodus. Dann muß Show mouse so oft aufgerufen werden, wie Hide +mouse aufgerufen wurde, um den Mauszeiger wieder sichtbar zu machen. +
  +
Ergebnis: Die Funktion liefert keinen Returnwert. +
  +
Verfügbar: Alle TOS-Versionen. +
  +
Querverweis: Binding   Systemvektoren +
  + +
+ +

6.14.1 Bindings für show_mouse

+ + + + + + +
Pure-C: void show_mouse( int16_t flag ); +
  +
Assembler: Es wird angenommen, daß das intin Feld schon in den Line-A +Parameterblock eingetragen wurde. +
  +
movem.l   D0-D2/A0-A2,-(A7)  ; Register retten
+move.l    pParamblk,A0       ; Zeiger Parameterblock LINEA
+move.w    (8,A0),A1          ; intin nach A1
+move.w    flag,(A1)          ; Flag nach intin[0]
+dc.w      $A009              ; Line-A Opcode
+movem.l   (A7)+,D0-D2/A0-A2  ; Register restaurieren
+
+ +
+ +
+ +Home +Line-ALine-A +Text block transferText block transfer +Hide mouseHide mouse + + diff --git a/de/linea_structures.html b/de/linea_structures.html new file mode 100644 index 000000000..b620844df --- /dev/null +++ b/de/linea_structures.html @@ -0,0 +1,62 @@ + + + + + +Die Anleitung zum TOS: BITBLT + + + + + + + + + +Home +Line-ALine-A +Die negativen Line-A VariablenDie negativen Line-A Variablen +InitializationInitialization + +
+ +

6.4 BITBLT

+

Die Parameter für die Bit Block Transfer Funktion werden in der +folgenden Struktur übergeben: +

+
typedef struct
+{
+  int16_t  b_wd,         /* Breite des Blocks in Pixeln  */
+           b_ht,         /* Höhe des Blocks in Pixeln    */
+           plane_ct,     /* Anzahl der Farbplanes        */
+           fg_col,       /* Vordergrundfarbe             */
+           bg_col;       /* Hintergrundfarbe             */
+  int8_t   op_tab[4];    /* Verknüpfung (für jede Plane) */
+  int16_t  s_xmin,       /* X-Quellraster                */
+           s_ymin;       /* Y-Quellraster                */
+  void    *s_form;       /* Adresse des Quellrasters     */
+  int16_t  s_nxwd,       /* Offset zum nächsten Wort     */
+           s_nxln,       /* Breite des Quellrasters      */
+           s_nxpl,       /* Offset zur nächsten Plane    */
+           d_xmin,       /* X-Zielraster                 */
+           d_ymin;       /* Y-Zielraster                 */
+  void    *d_form;       /* Adresse des Zielrasters      */
+  int16_t  d_nxwd,       /* Offset zum nächsten Wort     */
+           d_nxln,       /* Breite des Quellrasters      */
+           d_nxpl;       /* Offset zur nächsten Plane    */
+  void    *p_addr;       /* 16-Bit-Masken zum Undieren   */
+  int16_t  p_nxln,       /* Breite der Maske in Bytes    */
+           p_nxpl,       /* Offset zur nächsten Plane    */
+           p_mask;       /* Höhe der Maske in Zeilen     */
+  int8_t   filler[24];   /* Interner Buffer              */
+} BITBLT;
+
+
+ +Home +Line-ALine-A +Die negativen Line-A VariablenDie negativen Line-A Variablen +InitializationInitialization + + diff --git a/de/linea_textblt.html b/de/linea_textblt.html new file mode 100644 index 000000000..b4ce7aff4 --- /dev/null +++ b/de/linea_textblt.html @@ -0,0 +1,367 @@ + + + + + +Die Anleitung zum TOS: Text block transfer + + + + + + + + + +Home +Line-ALine-A +Bit block transferBit block transfer +Show mouseShow mouse + +
+ +

6.13 Text block transfer

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Text block transfer« +
  +
Line-A Nummer: $A008 +
  +
Binding: Bindings für text_blt +
  +
Beschreibung: Diese Line-A Funktion gibt ein einzelnes Zeichen aus. Die +Quelle für das Zeichen muß den gleichen Aufbau wie in einem GDOS +Rasterfont haben. Man kann die Fontdaten als ein großes Bild +betrachten, dessen Höhe der Zeichenhöhe entspricht. Sämtliche +Zeichen stehen dicht nebeneinander in diesem "Bild". +Zusätzlich enthält ein GDOS Font eine Offset Tabelle, in der für +jedes Zeichen der Offset in diesem großen Bild steht. Der Parameter +ade_lo des Fontheaders gibt dabei das erste ASCII Zeichen an, für das +ein Image und damit auch ein Offset enthalten ist. Dieser Offset ist +neben dem Anfang der Fontdaten an diese Line-A Funktion zu übergeben. +Der Y-Offset ist gewöhnlich 0. Da Line-A die Zeichensätze nicht +selbst verwaltet und auch den Fontheader nicht kennt, müssen +entsprechende Paramter auf die Fontdaten übergeben werden. Hinzu +kommen eine Reihe weiterer Paramter für die diversen Effekte wie z.B. +kursiv, ... Die folgenden Line-A Variablen werden benutzt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Variable Bedeutung +
    +
wrt_mode Schreibmodes, es sind die folgenden Modie möglich: + + + + + + + + + + + + +
REPLACE 0 Replace +
TRANS 1 Transparent (OR) +
XOR 2 Inverse (XOR) +
INVERS 3 Inverse Transparent (XOR mit not(LN_MASK)) + +
+ +
xacc_dda Sollte vor jedem Aufruf auf $8000 gesetzt werden. +
dda_inc Vergrößerungsfaktor. +
t_sclsts Vergrößerungsrichtung, also ob Verkleinert oder Vergrößert +wird. +
mono_status 1 wenn sämtliche Zeichen die gleiche Breite haben, es also ein +nichtproportionaler Font ist, sonst 0. +
sourcex X-Koordinate des auszugebenden Zeichens im Font und kann durch +die Offset Tabelle ermittelt werden. +
sourcey Y-Koordinate des auszugebenden Zeichens im Font, normalerweise +0. +
destx X-Koordinate der Bildschirmposition, an der das Zeichen +ausgegeben werden soll. +
desty Y-Koordinate der Bildschirmposition, an der das Zeichen +ausgegeben werden soll. +
delx Breite des Zeichens, kann ebenfalls aus dem Fontheader +ermittelt werden. +
dely Höhe des Zeichens, kann ebenfalls aus dem Fontheader ermittelt +werden. +
fbase Der Zeiger auf die Fontdaten, also das "Bild" mit den +einzelnen Zeichen. +
fwidth Breite des Fontimage. +
style Gibt die Texteffekte an. Einzelne Bits stehen für einzelne +Effekte und können kombiniert werden: + + + + + + + + + + + + + + + +
Bit 0 Fettschrift +
Bit 1 Helle Schrift +
Bit 2 Kursivschrift +
Bit 3 Unterstrichen (wird ignoriert) +
Bit 4 Umrissene Schrift "outline" + +
+ +
litemask Eine Maske für helle (light) Schrift. +
skewmask Eine Maske für kursive (skew) Schrift. +
weight Die Breite bei Fettschrift (Bold). +
r_off Der rechten Offset für Kursivschrift, also quasi ein Paramter +für die "Schrägstellung" des Zeichens. +
l_off Der linke Offset für Kursivschrift, also quasi ein Paramter +für die "Schrägstellung" des Zeichens. +
scale 1, wenn eine Skalierung erwünscht ist. +
chup Rotationswinkel in 1/10 Grad. Es sind allerdings nur Drehungen +um ein Vielfaches von 90 Grad möglich, also die Werte 0, 900, 1800, +2700. +
text_fg Textfarbe. +
text_bg Hintergrundfarbe. +
scrtchp Ein Puffer, der doppelt soviel Platz bieten sollte, wie das +Zeichen belegt, damit Line-A die Texteffekte berechnen kann. +
scrpt2 Ein Index in den Puffer, der auf die Puffermitte zeigt, also +die halbe Puffergröße angibt. +
clip 1 wenn Clipping gewünscht wird, 0 sonst. +
xmn_clip X-Koordinate die linken oberen Ecke des Clipping Bereichs, wenn +Clipping eingeschaltet ist. +
ymn_clip Y-Koordinate die linken oberen Ecke des Clipping Bereichs, wenn +Clipping eingeschaltet ist. +
xmx_clip X-Koordinate der rechten unteren Ecke des Clipping Bereichs, +wenn Clipping eingeschaltet ist. +
ymx_clip Y-Koordinate der rechten unteren Ecke des Clipping Bereichs, +wenn Clipping eingeschaltet ist. + +
+ +
Das Binding von TC übergibt einen Zeiger auf den Font Header, +Flags für Skalierung, Stil, Rotationsvektor, Vorder- und +Hintergrundfarbe nicht an die text_blt Funktion, sondern benutzt die +separate Funktion set_text_blt() zum Setzen der Parameter in dem +Line-A Paramterblock. Daten über den Font werden dabei automatisch +gesetzt. +
  +
Ergebnis: Die Funktion liefert keinen Returnwert. +
  +
Verfügbar: Alle TOS-Versionen. +
  +
Querverweis: Binding   Bit block transfer +
  + +
+ +

6.13.1 Bindings für text_blt

+ + + + + + +
Pure-C: void text_blt( int16_t x, int16_t y, uint8_t c ); +
  +
Assembler: +
  +
; Register retten
+movem.l   D0-D2/A0-A2,-(A7)
+; Zeiger Parameterblock LINEA
+move.l    pParamblk,A0
+; Writemode in LINEA.wrt_mode
+move.w    wmode,(36,A0)
+; Clipmode in LINEA.clip
+move.w    mode,(54,A0)
+; linke obere Clip-Ecke, X-Koordinate in LINEA.xmn_clip
+move.w    cx1,(56,A0)
+; linke obere Clip-Ecke, Y-Koordinate in LINEA.ymn_clip
+move.w    cy1,(58,A0)
+; rechte untere Clip-Ecke, X-Koordinate in LINEA.xmx_clip
+move.w    cx2,(60,A0)
+; rechte untere Clip-Ecke, Y-Koordinate in LINEA.ymx_clip
+move.w    cy2,(62,A0)
+; xacc_dda mit $8000 besetzen
+move.w    #$8000,(64,A0)
+; Vergrößerungsfaktor in LINEA.dda_inc
+move.w    dda_inc,(66,A0)
+; Vergrößerungsrichtung in LINEA.t_sclsts
+move.w    t_sclsts,(68,A0)
+; Proportionalschrift in LINEA.mono_status
+move.w    mono_status,(70,A0)
+; X-Koordinate im Font in LINEA.sourcex
+move.w    sourcex,(72,A0)
+; Y-Koordinate im Font in LINEA.sourcey
+move.w    sourcey,(74,A0)
+; X-Zielkoordinate in LINEA.destx
+move.w    destx,(76,A0)
+; Y-Zielkoordinate in LINEA.desty
+move.w    desty,(78,A0)
+; Breite des Zeichens in LINEA.delx
+move.w    delx,(80,A0)
+; Höhe des Zeichens in LINEA.dely
+move.w    dely,(82,A0)
+; Start der Font-Daten in LINEA.fbase
+move.l    fbase,(84,A0)
+; Breite des Fontimage in LINEA.fwidth
+move.w    fwidth,(88,A0)
+; Schreibstil in LINEA.style
+move.w    style,(90,A0)
+; Maske für Light in LINEA.litemask
+move.w    litemask,(92,A0)
+; Maske für Kursiv in LINEA.skewmask
+move.w    skewmask,(94,A0)
+; Breite bei Bold in LINEA.weight
+move.w    weight,(96,A0)
+; Kursiv-Offset rechts in LINEA.r_off
+move.w    r_off,(98,A0)
+; Kursiv-Offset links in LINEA.l_off
+move.w    l_off,(100,A0)
+; Vergrößerung ja/nein in LINEA.scale
+move.w    scale,(102,A0)
+; Rotationswinkel in LINEA.chup
+move.w    chup,(104,A0)
+; Textfarbe in LINEA.text_fg
+move.w    text_fg,(106,A0)
+; Puffer in LINEA.scrtchp
+move.l    scrtchp,(108,A0)
+; Index in Puffermitte in LINEA.scrpt2
+move.w    scrpt2,(112,A0)
+; Hintergrundfarbe in LINEA.text_bg
+move.w    text_bg,(114,A0)
+; Line-A Opcode
+dc.w      $A008
+; Register restaurieren
+movem.l   (A7)+,D0-D2/A0-A2
+
+ +
+ +
+ +Home +Line-ALine-A +Bit block transferBit block transfer +Show mouseShow mouse + + diff --git a/de/linea_transform.html b/de/linea_transform.html new file mode 100644 index 000000000..f085eff3b --- /dev/null +++ b/de/linea_transform.html @@ -0,0 +1,164 @@ + + + + + +Die Anleitung zum TOS: Transform mouse + + + + + + + + + +Home +Line-ALine-A +Hide mouseHide mouse +Undraw spriteUndraw sprite + +
+ +

6.16 Transform mouse

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Transform mouse« +
  +
Line-A Nummer: $A00B +
  +
Binding: Bindings für transform_mouse +
  +
Beschreibung: Diese Line-A Funktion setzt den Mauszeiger auf ein neues +Erscheinungsbild. Die nötigen Parameter werden über das intin Feld +übergeben. Alternativ kann auch die AES Struktur MFORM benutzt +werden. Für den Aufruf der Line-A Funktion wird intin im Line-A +Parameterblock auf diese Struktur gesetzt und nach dem Aufruf wird der +alte Wert restauriert. +
  +
typedef struct mfstr
+{
+   int16_t mf_xhot;
+   int16_t mf_yhot;
+   int16_t mf_nplanes;
+   int16_t mf_fg;
+   int16_t mf_bg;
+   int16_t mf_mask[16];
+   int16_t mf_data[16];
+} MFORM;
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Variable Bedeutung +
    +
mf_xhot X-Koordinate des Aktionspunkts der Mausform. Für die Aktion +der Maus ist maßgeblich, wo sich dieser Punkt der Mausform befindet. +
mf_yhot Y-Koordinate des Aktionspunkts der Mausform. Für die Aktion +der Maus ist maßgeblich, wo sich dieser Punkt der Mausform befindet. +
mf_nplanes Muß auf 1 gesetzt werden, da die Mausform nur eine Farbebene +haben darf. +
mf_fg Die Farbe der Maske. +
mf_bg Die Farbe der Daten fest. +
mf_mask Die 16 * 16 Pixel große Maske. Jede 1 in der Maske löscht den +Hintergrund an der Stelle (bzw. setzt die Hintergrundfarbe). Damit +kann an den Stellen, an denen keine Mausdaten gezeichnet werden, das +"Durchscheinen" eines Hintergrunds verhindern und z.B. die +Maus mit einem "Rahmen" von dem Untergrund abgesetzt werden. +
mf_data Die 16 * 16 Pixel große Mausform. Jede 1 in der Mausform +erzeugt einen Punkt der Farbe mf_bg auf dem Bildschirm. + +
+ +
Ergebnis: Die Funktion liefert keinen Returnwert. +
  +
Verfügbar: Alle TOS-Versionen. +
  +
Querverweis: Binding   Undraw sprite   Draw sprite +
  + +
+ +

6.16.1 Bindings für transform_mouse

+ + + + + + +
Pure-C: void transform_mouse( MFORM *mform ); +
  +
Assembler: +
  +
; Register retten
+movem.l   D0-D2/A0-A2,-(A7)
+; Zeiger Parameterblock LINEA
+move.l    pParamblk,A0
+; alten Wert des intin Feldes retten
+move.l    (8,A0),-(A7)
+; Feld mit Mausform in LINEA.intin
+move.l    mform,(8,A0)
+; Line-A Opcode
+dc.w      $A00B
+; Zeiger Parameterblock LINEA
+move.l    pParamblk,A0
+; alten Wert des intin Feldes restaurieren
+move.l    (A7)+,(8,A0)
+; Register restaurieren
+movem.l   (A7)+,D0-D2/A0-A2
+
+ +
+ +
+ +Home +Line-ALine-A +Hide mouseHide mouse +Undraw spriteUndraw sprite + + diff --git a/de/linea_undrawsprite.html b/de/linea_undrawsprite.html new file mode 100644 index 000000000..59f7c50b0 --- /dev/null +++ b/de/linea_undrawsprite.html @@ -0,0 +1,94 @@ + + + + + +Die Anleitung zum TOS: Undraw sprite + + + + + + + + + +Home +Line-ALine-A +Transform mouseTransform mouse +Draw spriteDraw sprite + +
+ +

6.17 Undraw sprite

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Undraw sprite« +
  +
Line-A Nummer: $A00C +
  +
Binding: Bindings für undraw_sprite +
  +
Beschreibung: Diese Line-A Funktion löscht ein Sprite und restauriert den +Bildschirm. Der Funktion muß der Sprite-Save-Block übergeben werden, +der auch an Draw Sprite übergeben wurde und in der Draw sprite den +Bildschirm unter dem Sprite sichert. Das Register A6 wird zerstört. +
  +
Ergebnis: Die Funktion liefert keinen Returnwert. +
  +
Verfügbar: Alle TOS-Versionen. +
  +
Querverweis: Binding   Transform mouse   Draw sprite +
  + +
+ +

6.17.1 Bindings für undraw_sprite

+ + + + + + +
Pure-C: typedef int16_t SSB[10 + 4 * 64]; +
  +
void undraw_sprite( SSB *ssb ); +
  +
Assembler: +
  +
movem.l   D0-D2/A0-A2/A6,-(A7) ; Register retten
+move.l    ssb,A2               ; Sprite-Save-Block nach A2
+dc.w      $A00C                ; Line-A Opcode
+movem.l   (A7)+,D0-D2/A0-A2/A6 ; Register restaurieren
+
+ +
+ +
+ +Home +Line-ALine-A +Transform mouseTransform mouse +Draw spriteDraw sprite + + diff --git a/de/linea_vars.html b/de/linea_vars.html new file mode 100644 index 000000000..de64451fc --- /dev/null +++ b/de/linea_vars.html @@ -0,0 +1,88 @@ + + + + + +Die Anleitung zum TOS: LINEA + + + + + + + + + +Home +Line-ALine-A +Der Line-A-EmulatorDer Line-A-Emulator +Die negativen Line-A VariablenDie negativen Line-A Variablen + +
+ +

6.2 LINEA

+

Für die Übergabe der Parameter an die Line-A Funktionen wird +eine Struktur benutzt. Dieser statisch angelegte Line-A Parameterblock +hat den nachfolgend beschriebenen Aufbau. Die Zahl im Kommentar gibt +jeweils den Offset der Komponente zum Anfang der Struktur an. +

+
typedef struct
+{
+  int16_t  v_planes,               /*   0: # Bitplanes (1, 2 od. 4)     */
+           v_lin_wr,               /*   2: # Bytes/Scanline             */
+           *contrl,
+           *intin,
+           *ptsin,                 /*  12: Koordinaten-Eingabe          */
+           *intout,
+           *ptsout,                /*  20: Koordinaten-Ausgabe          */
+           fg_bp_1,                /*  24: Plane 0                      */
+           fg_bp_2,                /*  26: Plane 1                      */
+           fg_bp_3,                /*  28: Plane 2                      */
+           fg_bp_4,                /*  30: Plane 3                      */
+           lstlin;                 /*  32: letzten Pixel einer Linie    */
+                                   /*      zeichen (1) oder nicht (0)   */
+  uint16_t ln_mask;                /*  34: Linienmuster                 */
+  int16_t  wrt_mode,               /*  36: Schreib-Modus                */
+           x1, y1, x2, y2;         /*  38: Koordinaten                  */
+  void     *patptr;                /*  46: Füllmuster                   */
+  uint16_t patmsk;                 /*  50: .. dazugehörige Maske        */
+  int16_t  multifill,              /*  52: Füllmuster für Planes        */
+           clip,                   /*  54: Flag für Clipping            */
+           xmn_clip, ymn_clip,
+           xmx_clip, ymx_clip,     /*  60: Clipping Rechteck            */
+                                   /*      Rest für text_blt:           */
+           xacc_dda,               /*  64: vor Textausgaben auf 0x8000  */
+                                   /*      setzen                       */
+           dda_inc,                /*  66: Vergrößerungsfaktor          */
+           t_sclsts,               /*  68: Vergrößerungsrichtung        */
+           mono_status,            /*  70: Proportionalschrift          */
+           sourcex, sourcey,       /*  72: Koordinaten im Font          */
+           destx, desty,           /*  76: Bildschirmkoordinaten        */
+           delx, dely;             /*  80: Breite und Höhe des Zeichen  */
+  FONT_HDR *fbase;                 /*  84: Start der Font-Daten         */
+  int16_t  fwidth,                 /*  88: Breite des Fontimage         */
+           style;                  /*  90: Schreibstil                  */
+  uint16_t litemask,               /*  92: Maske für Light              */
+           skewmask;               /*  94: Maske für Kursiv             */
+  int16_t  weight,                 /*  96: Breite bei Bold              */
+           r_off,                  /*  98: Kursiv-Offset rechts         */
+           l_off,                  /* 100: Kursiv-Offset links          */
+           scale,                  /* 102: Vergrößerung ja/nein         */
+           chup,                   /* 104: Rotationswinkel *10          */
+           text_fg;                /* 106: Textfarbe                    */
+  void     *scrtchp;               /* 108: Buffer                       */
+  int16_t  scrpt2,                 /* 112: Index in Buffer              */
+           text_bg,                /* 114: unbenutzt                    */
+           copy_tran,              /* 116: --                           */
+           (*fill_abort)( void );  /* 118: Testet Seed Fill             */
+} LINEA;
+
+
+ +Home +Line-ALine-A +Der Line-A-EmulatorDer Line-A-Emulator +Die negativen Line-A VariablenDie negativen Line-A Variablen + + diff --git a/de/literature.html b/de/literature.html new file mode 100644 index 000000000..4727fcc02 --- /dev/null +++ b/de/literature.html @@ -0,0 +1,169 @@ + + + + + +Die Anleitung zum TOS: Literatur zum TOS-Betriebssystem + + + + + + + + + +Home +Inhaltsverzeichnis +EntwicklungssystemeEntwicklungssysteme +Angabe der QuellenAngabe der Quellen + +
+ +

D Literatur zum TOS-Betriebssystem

+

Leider gibt es keine allumfassende Dokumentation zum TOS bzw. +dazu kompatiblen Betriebssystemen, und aufgrund der aktuellen +Marktsituation muss man davon ausgehen, daß sich dies auch nicht mehr +ändern wird. +

+

Die hier angegebene Liste erhebt nicht den Anspruch auf +Vollständigkeit; Dokumentationen die nur für eingetragene Entwickler +erhältlich sind, wurden bewußt nicht mit aufgenommen. Es sei +ferner darauf hingewiesen, daß praktisch alle aufgeführten Werke +bezüglich des aktuellen Entwicklungsstands (AES-Version 4.x, MiNT, +Multi-TOS, MagiC, SpeedoGDOS, NVDI 4.x, etc.) nicht nur hoffnungslos +veraltet, sondern teilweise auch nicht mehr erhältlich sind. +

+

Liste der Bücher +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
• Assembler-Praxis auf Atari ST(TeWi Verlag)
• Atari Compendium(Atari Corp.)
• Atari Profibuch ST-STE-TT(Sybex Verlag)
• Atari-ST Assembler Buch(Markt & Technik)
• Atari ST - Das Floppy Arbeitsbuch(Sybex Verlag)
• Atari-ST GEM(Data Becker)
• Atari-ST Intern(Data Becker)
• C-Programmierung unter TOS(Markt & Technik)
• Das Atari-ST Grafikbuch(Sybex Verlag)
• Das TOS-Listing, BIOS-GEMDOS-VDI(Heise-Verlag)
• GEM-Programmier-Handbuch(Sybex Verlag)
• Programmierung des 68000(Sybex Verlag)
• Scheibenkleister II - Massenspeicher am ST(Maxon Computer)
• Vom Anfänger zum GEM-Profi (!nl)
  Dieter Geiß, Jürgen Geiß (!nl)
  Hüthig Verlag, ISBN 3-7785-2182-9
+
+ +

Liste der Zeitschriften +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
• Atari-Journal(Heim-Verlag)
• Byte(McGraw-Hill)
• c't - Magazin für Computertechnik(Heise-Verlag)
• ST-Computer(Heim-Verlag)
• ST-Magazin(Markt & Technik)
TOS - Magazin plus Software(ICP-Verlag)
+
+ +

Sonstiges +

+
+ + + + + + + + + + + + + + + + +
• GEM AES Reference Guide to GEM Version 2.0(Digital Research)
• GEM VDI Reference Guide to GEM Version 2.0(Digital Research)
• Introduction to GEM-Programming(Digital Research)
• Professional GEM(Antic Publishing)
+
+ +

Querverweis: Entwicklungssysteme   Quellen-Angabe   Anhang +

+
+ +Home +Inhaltsverzeichnis +EntwicklungssystemeEntwicklungssysteme +Angabe der QuellenAngabe der Quellen + + diff --git a/de/magic.html b/de/magic.html new file mode 100644 index 000000000..d5b647f1b --- /dev/null +++ b/de/magic.html @@ -0,0 +1,99 @@ + + + + + +Die Anleitung zum TOS: MagiC + + + + + + + + + +Home +Inhaltsverzeichnis +Style-GuidelinesStyle-Guidelines +AESVARS, Zeiger auf AESVARSAESVARS, Zeiger auf AESVARS + +
+ +

11 MagiC

+

... ist ein weitgehend TOS-kompatibles Betriebssystem, welches +mit preemptiven Multitasking und einer Reihe von weiteren Features +aufwarten kann. Das wichtigste Argument für MagiC ist +zweifellos die Tatsache, daß es das einzige (kompatible) +Betriebssystem ist, welches z.Zt. noch weiterentwickelt wird, und +darüber hinaus die Verwendung einer modernen Hardware (dem Power-PC) +ermöglicht. Letzteres wurde durch eine Portierung von MagiC auf die +Apple-Plattform realisiert (MagiC Mac). Dieser Abschnitt beschreibt +die folgenden Punkte: +

+ + +

Hinweis: Verschwiegen werden soll an dieser Stelle +nicht, daß MagiC gegenüber Atari's MultiTOS deutliche +Schwächen besitzt: Die Funktionalität des AES Version 4.0 ist +noch nicht erreicht, viele GEMDOS-Funktionen sind nicht implementiert, +und auch das Interface zur Einbindung alternativer Filesysteme darf, +verglichen mit der MultiTOS-Lösung, wohl als sehr unglücklich +bezeichnet werden. +

+

Querverweis: BIOS   XBIOS   GEM   VDI +

+
+ +Home +Inhaltsverzeichnis +Style-GuidelinesStyle-Guidelines +AESVARS, Zeiger auf AESVARSAESVARS, Zeiger auf AESVARS + + diff --git a/de/magic_3dlook.html b/de/magic_3dlook.html new file mode 100644 index 000000000..a428abbe6 --- /dev/null +++ b/de/magic_3dlook.html @@ -0,0 +1,77 @@ + + + + + +Die Anleitung zum TOS: Anmerkungen zum 3D-Look von MagiC + + + + + + + + + +Home +MagiCMagiC +Die AUTOEXEC.BAT-Datei in MagiCDie AUTOEXEC.BAT-Datei in MagiC +Eingabefelder in MagiCEingabefelder in MagiC + +
+ +

11.5 Anmerkungen zum 3D-Look von MagiC

+

Ab MagiC 3 steht für Objekte ein 3D-Look zur Verfügung, der +sich jedoch in einigen Details von der Atari-Variante unterscheidet. +Die wichtigsten Punkte in Kürze: +

+
    +
  • der 3D-Look steht nur in Auflösungen mit mindestens 16 +Farben zur Verfügung. +
      +

  • +
  • während man in TOS 4.0 per objc_sysvar das Verhalten der +Indikatoren und Aktivatoren, sowie die Farben beeinflussen kann, +erlaubt MagiC nur die Abfrage der Daten. Als Farben werden in MagiC +immer die Farbnummern 8 und 9 (hell- bzw. dunkelgrau) verwendet. +
      +

  • +
  • Aktivatoren werden bei SELECTED immer eingedrückt, Indikatoren +oder Background-Objekte werden verfärbt. +
      +

  • +
  • Indikatoren und Background-Objekte werden gleich behandelt. +
      +

  • +
  • für alle Objekttypen können 3D-Effekte angefordert werden, +dies gilt auch für Texteingabefelder, Überschriften, Gruppenrahmen +etc. +
      +

  • +
  • 3D-Objekte bekommen keinen zusätzlichen Rahmen und ändern +sich daher nicht in der Größe. Je nach Rahmenbreite stehen sie +weiter heraus und haben ggf. auch noch einen zusätzlichen Rand und +Schatten. Überschriften sollten statt bisher 1+2 die Höhe 1+3 haben, +damit es ordentlich aussieht. +
      +

  • +
  • der Objektstatus DRAW3D wird ignoriert. +
      +

  • +
  • Schmuckränder für Dialogboxen werden genau dann erzeugt, wenn ein +innerer Rahmen von 2 Pixeln und OUTLINED angewählt wurde. +
      +

  • +
+ +

Querverweis: AES   GEM   Style-Guidelines +

+
+ +Home +MagiCMagiC +Die AUTOEXEC.BAT-Datei in MagiCDie AUTOEXEC.BAT-Datei in MagiC +Eingabefelder in MagiCEingabefelder in MagiC + + diff --git a/de/magic_MCB.html b/de/magic_MCB.html new file mode 100644 index 000000000..00e55ecde --- /dev/null +++ b/de/magic_MCB.html @@ -0,0 +1,75 @@ + + + + + +Die Anleitung zum TOS: Memory-Control-Block (MCB) in MagiC + + + + + + + + + +Home +TypdefinitionenTypdefinitionen +MacVersionMacVersion +Memory-Deskriptor (MD) in TOSMemory-Deskriptor (MD) in TOS + +
+ +

I.10 Memory-Control-Block (MCB) in MagiC

+ + + +
typedef struct
+{
+    int32_t mcb_magic;        /* 'ANDR' oder 'KROM' (letzter)    */
+    int32_t mcb_len;          /* Nettolänge                      */
+    int32_t mcb_owner;        /* Zeiger auf PD-Struktur          */
+    int32_t mcb_prev;         /* vorh. Block oder NULL           */
+    int8_t mcb_data[0];
+} MCB;
+
+

Hinweis: Die Komponente mcb_magic besitzt den +Wert 'KROM', falls kein weiterer MCB folgt, und anderenfalls den Wert +'ANDR'. Im letzteren Fall liegt der nächste MCB mcb_len Bytes +hinter dem aktuellen MCB. Die Liste ist per mcb_prev +rückwärts verkettet, was viele Operationen erheblich beschleunigt. +

+ + + +

Bei allen Speicheroperationen wird immer die Komponente +mcb_magic überprüft, und das System bei einem Fehler sofort +angehalten. Beim Anhalten aufgrund eines Speicherfehlers werden die +Adresse des fehlerhaften MCB sowie die Daten (4 Langworte) ausgegeben. +Anschließend wird man gefragt, auf welches Laufwerk man einen +Systemauszug (core dump) speichern möchte. Gibt man ein +gültiges Laufwerk an, so wird der gesamte ST-Speicher von 0 bis +phystop auf das Wurzelverzeichnis des angegebenen Laufwerks +geschrieben, und zwar unter dem Namen "_sys_". Die Datei +kann natürlich je nach ST-Modell bis zu 4 oder gar 16 MB lang werden. +

+

Speicherresidente Programme (beenden sich über Ptermres) +arbeiten jetzt im Gegensatz zu früher einfach nur so, daß die +Blöcke nicht freigegeben werden, alle MCBs bleiben intakt und +werden auch weiterhin benutzt (jedesmal, wenn man in die Menüleiste +klickt, wird der freie Speicher ausgegeben, dazu wird die gesamte +Liste einmal durchlaufen und dabei alle MCBs überprüft). Wer +möchte, kann also speicherresidente Programme (oder auch Teile davon) +nachträglich freigeben. +

+

Querverweis: GEMDOS   MagiC   MD   Speicherverwaltung +

+
+ +Home +TypdefinitionenTypdefinitionen +MacVersionMacVersion +Memory-Deskriptor (MD) in TOSMemory-Deskriptor (MD) in TOS + + diff --git a/de/magic_aesvars.html b/de/magic_aesvars.html new file mode 100644 index 000000000..3f6d0b007 --- /dev/null +++ b/de/magic_aesvars.html @@ -0,0 +1,66 @@ + + + + + +Die Anleitung zum TOS: AESVARS, Zeiger auf AESVARS + + + + + + + + + +Home +MagiCMagiC +MagiCMagiC +MAGX_COOKIE, status_bitsMAGX_COOKIE, status_bits + +
+ +

11.1 AESVARS, Zeiger auf AESVARS

+ +
/* Der folgende Code ermittelt auf zuverlässige Art und Weise den
+   Zeiger auf die AESVARS-Struktur von MagiC.
+
+   Die Routine ist deshalb besonders wichtig, weil die entsprechende
+   Komponente im MagX-Cookie zur Bootzeit noch keinen gültigen Wert
+   besitzt. */
+
+
+AESVARS* DOMagixAESVars (VOID)
+{
+    LOCAL WORD have_it = 0;
+    LOCAL AESVARS *ap = 0;
+
+    if (!have_it)
+    {
+        OSHEADER *O;
+
+        have_it = 1;
+
+        O = (OSHEADER *) Supexec (get_osheader);
+        ap = (AESVARS *) O->os_magic;
+
+        if (!get_cookie ('MagX', NULL) ||
+            ap->magic != 0x87654321L || ap->magic2 != 'MAGX')
+              ap = 0;
+    }
+
+    return (ap);
+
+} /* DOMagixAESVars */
+
+

Querverweis: Test auf MagiC   get_cookie +

+
+ +Home +MagiCMagiC +MagiCMagiC +MAGX_COOKIE, status_bitsMAGX_COOKIE, status_bits + + diff --git a/de/magic_autoexec.html b/de/magic_autoexec.html new file mode 100644 index 000000000..804bff473 --- /dev/null +++ b/de/magic_autoexec.html @@ -0,0 +1,52 @@ + + + + + +Die Anleitung zum TOS: Die AUTOEXEC.BAT-Datei in MagiC + + + + + + + + + +Home +MagiCMagiC +Auszug aus dem BIOS von MagiCAuszug aus dem BIOS von MagiC +Anmerkungen zum 3D-Look von MagiCAnmerkungen zum 3D-Look von MagiC + +
+ +

11.4 Die AUTOEXEC.BAT-Datei in MagiC

+ +

Aufgrund des vorwärts- bzw. rückwärtssortierten Auto-Ordners +auf dem Apple Macintosh (Stichwort: MagiC Mac) gibt es jetzt auch für +Atari-Maschinen eine Alternative: +

+

Wird beim Booten im Auto-Ordner eine Datei mit Namen +AUTOEXEC.BAT gefunden, so werden alle Programme ausgeführt, die darin +zeilenweise aufgelistet sind. Leerzeilen sind erlaubt, Programmnamen +werden bis zum ersten Leerzeichen übernommen. Daher können +Kommentare (durch Leerzeichen von den Programmen getrennt) eingegeben +werden. Programmnamen dürfen absolute Pfade enthalten; tun +sie dies nicht, so wird im Auto-Ordner gesucht. +

+

Als aktuelles Verzeichnis gilt dabei, wie gehabt, das +Wurzelverzeichnis. Durch dieses Feature gibt es also eine +MagiC-spezifische Auto-Ordner-Kollektion, da die AUTOEXEC.BAT von +anderen Systemen ignoriert wird. +

+

Querverweis: _autopath   Systemvariablen +

+
+ +Home +MagiCMagiC +Auszug aus dem BIOS von MagiCAuszug aus dem BIOS von MagiC +Anmerkungen zum 3D-Look von MagiCAnmerkungen zum 3D-Look von MagiC + + diff --git a/de/magic_bios.html b/de/magic_bios.html new file mode 100644 index 000000000..73567d46b --- /dev/null +++ b/de/magic_bios.html @@ -0,0 +1,369 @@ + + + + + +Die Anleitung zum TOS: Auszug aus dem BIOS von MagiC + + + + + + + + + +Home +MagiCMagiC +MAGX_COOKIE, status_bitsMAGX_COOKIE, status_bits +Die AUTOEXEC.BAT-Datei in MagiCDie AUTOEXEC.BAT-Datei in MagiC + +
+ +

11.3 Auszug aus dem BIOS von MagiC

+
*******************************
+******* ACSI ******************
+*******************************
+
+
+* Interruptsteuerung:
+*
+* Alles geht über den Eingang I5 des ST-MFP, hat den Interrupt #7
+* (aktiviert mit Bit 7 von ierb)
+* Polling über Bit 5 von gpip
+* 1. aer für Bit 5 muß 0 sein, d.h. Interrupt wird ausgelöst beim
+*    Übergang von 1 auf 0
+* 2. Interrupt _mfpint (7) aktivieren und Vektor setzen (Adr. $11c)
+*
+
+**********************************************************************
+*
+* Sperre den FDC/ACSI-DMA
+* und gib ihn wieder frei.
+* Kein Register (außer d0 bei dma_end) wird verändert
+*
+* Für die Zeit, in der AES noch nicht initialisiert ist, kann evnt_sem
+* nicht sperren, weil act_appl immer NULL ist.
+*
+
+dma_begin:
+ movem.l  d1-d2/a0-a2,-(sp)
+ lea      dma_sem,a0
+ moveq    #0,d1               ; kein Timeout
+ moveq    #SEM_SET,d0
+ jsr      evnt_sem
+ st       flock
+ movem.l  (sp)+,d1-d2/a0-a2
+ rts
+
+dma_end:
+ movem.l  d0-d2/a0-a2,-(sp)
+ lea      dma_sem,a0
+ moveq    #SEM_FREE,d0
+ jsr      evnt_sem
+ clr.w    flock
+ movem.l  (sp)+,d0-d2/a0-a2
+ rts
+
+
+**********************************************************************
+*
+* long wait_ACSI( d0 = long ticks_200hz )
+*
+* RÜckgabe:    0    OK
+*             -1    TimeOut
+*             -2    Busfehler
+*
+
+wait_ACSI:
+ movem.l  d1-d2/a0-a2,-(sp)
+ tst.w    pe_slice            ; präemptiv ?
+ bmi.b    wdma_no_yield       ; nein, busy waiting
+ move.l   act_appl,d2
+ ble.b    wdma_no_yield       ; aktuelle Applikation ungültig
+
+* neue Routine über evnt_IO und MFP- Interrupt
+
+ lsr.l    #2,d0               ; AES: 50Hz statt 200Hz
+wdma_neu:
+ move     sr,d1
+ ori      #$700,sr
+ btst     #5,gpip             ; schon fertig ?
+ beq.b    wdma_ok2            ; ja, enable interrupt
+; Interrupt aufsetzen
+ pea      int_mfp7_unsel(pc)
+ move.l   d2,imfp7_appl       ; act_appl
+ move.l   sp,imfp7_unsel
+; Interrupt freigeben
+ move.w   d1,sr
+; Auf Interrupt warten
+ move.l   sp,a0
+;move.w   d0,d0               ; TimeOut in 50Hz- Ticks
+ jsr      evnt_IO
+ addq.l   #4,sp
+wdma_ende:
+ movem.l  (sp)+,d1-d2/a0-a2
+ rts
+
+* alte Routine mit busy waiting über _hz_200
+
+wdma_no_yield:
+ add.l    _hz_200,d0
+wdma_loop:
+ btst     #5,gpip
+ beq.b    wdma_ok
+ cmp.l    _hz_200,d0
+ bcc.b    wdma_loop
+wdma_timeout:
+ moveq    #-1,d0              ; Timeout
+ bra.b    wdma_ende
+wdma_ok2:
+ move.w   d1,sr
+wdma_ok:
+ moveq    #0,d0               ; OK
+ bra.b    wdma_ende
+
+
+**********************************************************************
+*
+* Interruptroutine für MFP, Interruptkanal #7 = I/O-Port 5
+* (DMA/FDC busy)
+*
+* Rückgabewert 0 (OK)
+*
+
+int_mfp7:
+ tst.l    imfp7_unsel                   ; Interrupt aktiviert ?
+ beq.b    imfp7_ende                    ; nein, weiter
+ movem.l  d0-d2/a0-a2,-(sp)
+
+ move.l   imfp7_unsel,a0
+ clr.l    imfp7_unsel                   ; Interrupt deaktivieren
+ clr.l    (a0)                          ; als eingetroffen markieren
+
+ move.l   imfp7_appl,a0
+ jsr      appl_IOcomplete               ; wartende APP aufwecken
+ movem.l  (sp)+,d0-d2/a0-a2
+imfp7_ende:
+ move.b   #$7f,isrb                     ; service- Bit löschen
+ rte
+
+
+**********************************************************************
+*
+* void int_mfp7_unsel( a0 = long *unselect, a1 = APPL *ap );
+*
+* Deaktiviert den Interrupt wieder, wenn er nicht eingetroffen ist
+* Rückgabewert -1 (Timeout)
+*
+
+int_mfp7_unsel:
+ clr.l    imfp7_unsel                   ; Interrupt deaktivieren
+ moveq    #-1,d0
+ move.l   d0,(a0)                       ; nicht eingetroffen
+ rts
+
+
+
+*******************************
+******* SCSI ******************
+*******************************
+
+
+* Interruptsteuerung:
+*
+* SCSI-DMA-Busfehler: Eingang I5 des TT-MFP
+* 1. aer für Bit 5 muß 0 sein, d.h. Interrupt wird ausgelöst beim
+*    Übergang von 1 auf 0
+* Polling über Bit 5 von gpip
+* Interrupt #7 des TT-MFP (Adresse $15c)
+
+* SCSI: Eingang I7 des TT-MFP
+* 1. aer für Bit 7 muß 1 sein, d.h. Interrupt wird ausgelöst beim
+*    Übergang von 0 auf 1
+* Polling über Bit 7 von gpip
+* Interrupt #15 des TT-MFP (Adresse $17c)
+
+* Während der Übertragung muß offenbar im Betriebsartenregister
+* $fff785 des ncr 5380 das Bit 3 (enable process interrupt)
+* gesetzt sein.
+
+**********************************************************************
+*
+* Interruptroutine für TT-MFP, Interruptkanal #7 = I/O-Port 5
+* (SCSI-DMA Busfehler)
+*
+* Rückgabewert -2
+*
+
+int_scsidma:
+ tst.l    ncrdma_unsel                  ; Interrupt aktiviert ?
+ beq.b    incrdma_ende                  ; nein, weiter
+ movem.l  d0-d2/a0-a2,-(sp)
+
+ moveq    #-2,d0                        ; eingetroffen (Fehler)
+ move.l   ncrdma_unsel,a0
+ clr.l    ncrdma_unsel                  ; Interrupt deaktivieren
+ move.l   d0,(a0)                       ; als eingetroffen markieren
+
+ move.l   ncrdma_appl,a0
+ jsr      appl_IOcomplete               ; wartende APP aufwecken
+ movem.l  (sp)+,d0-d2/a0-a2
+incrdma_ende:
+ move.b   #$7f,isrb+$80                 ; service- Bit löschen (TT-MFP)
+ rte
+
+
+**********************************************************************
+*
+* Interruptroutine für TT-MFP, Interruptkanal #15 = I/O-Port 7
+* (SCSI)
+*
+* Rückgabewert 0
+*
+
+int_ncr:
+ tst.l    ncrdma_unsel                  ; Interrupt aktiviert ?
+ beq.b    incr_ende                     ; nein, weiter
+ movem.l  d0-d2/a0-a2,-(sp)
+
+ move.l   ncrdma_unsel,a0
+ clr.l    ncrdma_unsel                  ; Interrupt deaktivieren
+ clr.l    (a0)                          ; als eingetroffen markieren
+
+ move.l   ncrdma_appl,a0
+ jsr      appl_IOcomplete               ; wartende APP aufwecken
+ movem.l  (sp)+,d0-d2/a0-a2
+incr_ende:
+ move.b   #$7f,isra+$80                 ; service- Bit löschen (TT-MFP)
+ rte
+
+
+**********************************************************************
+*
+* void incrdma_unsel( a0 = long *unselect, a1 = APPL *ap );
+*
+* Deaktiviert den Interrupt wieder, wenn er nicht eingetroffen ist.
+* (Rückgabewert -1)
+*
+
+incrdma_unsel:
+ clr.l    ncrdma_unsel                  ; Interrupt deaktivieren
+ moveq    #-1,d0                        ; Timeout
+ move.l   d0,(a0)                       ; nicht eingetroffen
+ rts
+
+
+**********************************************************************
+*
+* long wait_NCR( d0 = long ticks_200hz )
+*
+* RÜckgabe:    0    OK
+*             -2    Busfehler
+*             -1    TimeOut
+*
+* kein Register außer d0 wird verändert
+*
+
+wait_NCR:
+ movem.l  d1-d2/a0-a2,-(sp)
+ tst.w    pe_slice            ; präemptiv ?
+ bmi.b    wncr_no_yield       ; nein, busy waiting
+ move.l   act_appl,d2
+ ble.b    wncr_no_yield       ; aktuelle Applikation ungültig
+
+* neue Routine über evnt_IO und MFP- Interrupt
+
+ lsr.l    #2,d0               ; AES: 50Hz statt 200Hz
+wncr_neu:
+ move     sr,d1
+ ori      #$700,sr
+ btst     #5,gpip+$80         ; DMA- Busfehler ?
+ beq.b    wncr_err2           ; ja, return(-2)
+ btst     #7,gpip+$80         ; schon fertig ?
+ bne.b    wncr_ok2            ; ja, enable interrupt, return(0)
+; Interrupt aufsetzen
+ pea      incrdma_unsel(pc)
+ move.l   d2,ncrdma_appl      ; act_appl
+ move.l   sp,ncrdma_unsel
+; Interrupt freigeben
+ move.w   d1,sr
+; Auf Interrupt warten
+ move.l   sp,a0
+;move.w   d0,d0               ; TimeOut in 50Hz- Ticks
+ jsr      evnt_IO
+ addq.l   #4,sp
+wncr_ende:
+ movem.l  (sp)+,d1-d2/a0-a2
+ rts
+
+* alte Routine mit busy waiting über _hz_200
+
+wncr_no_yield:
+ add.l    _hz_200,d0
+wncr_loop:
+ btst     #5,gpip+$80
+ beq.b    wncr_err
+ btst     #7,gpip+$80
+ bne.b    wncr_ok
+ cmp.l    _hz_200,d0
+ bcc.b    wncr_loop
+ moveq    #-1,d0                   ; Timeout
+ bra.b    wncr_ende
+wncr_ok2:
+ move.w   d1,sr
+wncr_ok:
+ moveq    #0,d0
+ bra.b    wncr_ende
+wncr_err2:
+ move.w   d1,sr
+wncr_err:
+ moveq    #-2,d0
+ bra.b    wncr_ende
+
+
+**********************************************************************
+*
+* Sperre den NCR-SCSI
+*
+* kein Register außer d0 wird verändert
+*
+* und gib ihn wieder frei.
+*
+* Kein Register wird verändert
+*
+* Für die Zeit, in der AES noch nicht initialisiert ist, kann evnt_sem
+* nicht sperren, weil act_appl immer NULL ist.
+*
+
+ncr_begin:
+ movem.l  d1-d2/a0-a2,-(sp)
+ lea      ncr_sem,a0
+ moveq    #0,d1               ; kein Timeout
+ moveq    #SEM_SET,d0
+ jsr      evnt_sem
+ movem.l  (sp)+,d1-d2/a0-a2
+ rts
+
+ncr_end:
+ movem.l  d0-d2/a0-a2,-(sp)
+ lea      ncr_sem,a0
+ moveq    #SEM_FREE,d0
+ jsr      evnt_sem
+ movem.l  (sp)+,d0-d2/a0-a2
+ rts
+
+

Achtung: Die hier angegebenen Routinen, können sich +natürlich jederzeit wieder ändern! +

+

Querverweis: MagiC   GEMDOS   BIOS   XFS-Konzept in MagiC +

+
+ +Home +MagiCMagiC +MAGX_COOKIE, status_bitsMAGX_COOKIE, status_bits +Die AUTOEXEC.BAT-Datei in MagiCDie AUTOEXEC.BAT-Datei in MagiC + + diff --git a/de/magic_cookie.html b/de/magic_cookie.html new file mode 100644 index 000000000..db86bb37e --- /dev/null +++ b/de/magic_cookie.html @@ -0,0 +1,61 @@ + + + + + +Die Anleitung zum TOS: MAGX_COOKIE, status_bits + + + + + + + + + +Home +MagiCMagiC +AESVARS, Zeiger auf AESVARSAESVARS, Zeiger auf AESVARS +Auszug aus dem BIOS von MagiCAuszug aus dem BIOS von MagiC + +
+ +

11.2 MAGX_COOKIE, status_bits

+

Ein Bitvektor, der wie folgt definiert ist: +

+
+ + + + + + + + + + + + + + + + + + + + +
Bit-00=MagiC Task-Manager z.Zt. aktiv?
Bit-01=reserviert
.. 
Bit-31=reserviert
+
+ +

Achtung: Die angegebenen Bits in diesem LONG-Wert sind +Read-Only, d.h. sie dürfen nicht verändert werden. +

+
+ +Home +MagiCMagiC +AESVARS, Zeiger auf AESVARSAESVARS, Zeiger auf AESVARS +Auszug aus dem BIOS von MagiCAuszug aus dem BIOS von MagiC + + diff --git a/de/magic_dfs.html b/de/magic_dfs.html new file mode 100644 index 000000000..3af8f8cc5 --- /dev/null +++ b/de/magic_dfs.html @@ -0,0 +1,1647 @@ + + + + + +Die Anleitung zum TOS: Das DFS-Konzept von MagiC + + + + + + + + + +Home +MagiCMagiC +Die Zusatzprogramme für MagiCDie Zusatzprogramme für MagiC +Das XFS-Konzept von MagiCDas XFS-Konzept von MagiC + +
+ +

11.20 Das DFS-Konzept von MagiC

+ +

MagiC ermöglicht wie MultiTOS die Einbindung alternativer +Dateisysteme (sog. XFSs). Fest in MagiC integriert ist nur ein +einziges XFS, das DOS_XFS. Auf diesem XFS setzen wiederum +Untertreiber, sogenannte DFS (dos file system) auf, von denen zwei in +MagiC integriert sind, und zwar das FAT-Dateisystem und das +U-Dateisystem (das für Laufwerk U:). +

+

Ein DOS-Dateisystem (DFS) wird vom DOS_XFS aufgerufen. Hier +stehen nur die Dateifunktionen, während die Verzeichnisverwaltung im +wesentlichen vom DOS_XFS übernommen wird. Weitere DFSs können +eingebunden werden. Der Aufwand für ein DFS ist wesentlich +geringer als für ein XFS, da viele Funktionen vom DOS_XFS bereits +ausgeführt werden. Die wesentliche Voraussetzung ist eine +DOS-konforme Verzeichnisstruktur (mit 32-Byte-Einträgen und +Dateinamen des Formats 8+3). Dieses Kapitel behandelt die Punkte: +

+ + +

Querverweis: XFS-Konzept in MagiC +

+

11.20.1 Der Aufbau eines DFS

+ +

Da die Implementation eines DFS nur in Assembler erfolgen kann, +wird dessen Beschreibung in Assembler-Syntax angegeben: +

+
dfs_name:      DS.B      8    /* Untername des DOS-Dateisystems      */
+dfs_next:      DS.L      1    /* nächster Treiber                    */
+dfs_init:      DS.L      1    /* Initialisierung                     */
+dfs_sync:      DS.L      1    /* synchronisiert das Dateisystem      */
+dfs_drv_open:  DS.L      1    /* neues Laufwerk                      */
+dfs_drv_close: DS.L      1    /* Laufwerk freigeben                  */
+dfs_dfree:     DS.L      1    /* für Dfree                           */
+dfs_sfirst:    DS.L      1    /* für Fsfirst                         */
+dfs_snext:     DS.L      1    /* für Fsnext                          */
+dfs_ext_fd:    DS.L      1    /* erweitert ein Verzeichnis           */
+dfs_fcreate:   DS.L      1    /* erstellt ein Verzeichnis oder Datei */
+dfs_fxattr:    DS.L      1    /* für Fxattr                          */
+dfs_dir2index: DS.L      1    /* für Dreaddir                        */
+dfs_readlink:  DS.L      1    /* für Freadlink                       */
+dfs_dir2FD:    DS.L      1    /* für Fopen                           */
+dfs_fdelete:   DS.L      1    /* für Fdelete und Ddelete             */
+dfs_pathconf:  DS.L      1    /* für Dpathconf                       */
+
+

Querverweis: Aufbau eines XFS   MagiC +

+

11.20.1.1 dfs_dfree

+ + + + + + + + + + + + + + + +
Name: »dfs_dfree« +
  +
Parameter: +
  +

+
+ + + + + + + + + + + + + + + +
a0=FD *
a1=long df[4]
-> d0=long errcode
+
+ +
Beschreibung: Für Dfree(). I.a. reicht es, aus dem DD den zugehörigen +DMD zu ermitteln und den freien Platz auf dem ganzen Laufwerk +anzugeben. +
  +
Gruppe: Aufbau eines DFS +
  +
Querverweis: DFS-Konzept in MagiC +
  + +
+ +

11.20.1.2 dfs_dir2FD

+ + + + + + + + + + + + + + + +
Name: »dfs_dir2FD« +
  +
Parameter: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
a0=FD *dd
a1=DIR *dir
-> d0=long errcode
ggf.  
a0=LINK *l
+
+ +
Beschreibung: Initialisiert einen Prototyp-FD, und zwar die Felder +
  + + +
und ggf. +
  +
    +
  • fd_name +
  • +
  • fd_xftype +
  • +
  • fd_xdata usw. +
  • +
+ +
Ggfs. werden noch andere Daten des FD verändert. +
  +
Gruppe: Aufbau eines DFS +
  +
Querverweis: DFS-Konzept in MagiC +
  + +
+ +

11.20.1.3 dfs_dir2index

+ + + + + + + + + + + + + + + +
Name: »dfs_dir2index« +
  +
Parameter: +
  +

+
+ + + + + + + + + + + + + + + +
a0=FD *dd
a1=DIR *dir
-> d0=long index oder errcode
+
+ +
Beschreibung: Gibt einfach einen Index (32 Bit) zu einem DIR-Eintrag zurück. +Der FAT_DFS nimmt dazu den ent-intellisierten Startcluster. <dd> +ist das Verzeichnis, in dem die Datei liegt. +
  +
Gruppe: Aufbau eines DFS +
  +
Querverweis: DFS-Konzept in MagiC +
  + +
+ +

11.20.1.4 dfs_drv_close

+ + + + + + + + + + + + + + + +
Name: »dfs_drv_close« +
  +
Parameter: +
  +

+
+ + + + + + + + + + + + + + + +
d0=int mode
a0=DMD *d
-> d0=long errcode
+
+ +
Beschreibung: Auch diese Funktion erfüllt, abhängig vom <mode>, zwei +Aufgaben: +
  +
1. mode == 0: +
Das DOS_XFS fragt das DFS, ob das Laufwerk geschlossen werden +darf. Wenn dies nicht erlaubt ist, muß EACCDN geliefert werden, sonst +E_OK (nötig z.B. für Dlock()). Geöffnete Dateien wurden bereits +von Kernel und DOS_XFS erkannt, d.h. in solch einem Fall wird +dfs_drv_close überhaupt nicht aufgerufen. +
  +
Aus diesem Grund dürften i.A. keine veränderten Sektorpuffer +existieren, auch keine, die gerade gelesen oder beschrieben werden +(dies geschieht immer über Dateien!). In diesem Fall genügt es also, +immer ein E_OK zu liefern. Problematischer wird es, wenn man einen +Write-Back-Cache einsetzt. Dabei kann es vorkommen, daß keine Datei +mehr geöffnet ist, aber noch Puffer belegt sind und +zurückgeschrieben werden müssen. Der Kernel macht einen Sync-Aufruf +(xfs_sync, der weitergegeben wird an dfs_sync), bevor die Anfrage +gestellt wird; es dürften also keine veränderten Puffer mehr +existieren. Falls doch, sollte das DFS aus Sicherheitsgründen ein +EACCDN zurückliefern. +
  +
2. mode == 1: +
Das DOS_XFS erzwingt das Schließen, das DFS muß E_OK liefern. Es +dürfen keine Caches zurückgeschrieben werden, da das Laufwerk +bereits ungültig ist. (nachdem ein Diskwechsel bereits gemeldet +wurde). +
  +
Beim Dlock() wird dfs_drv_close() zunächst mit Modus 0, dann, +wenn es keinen Fehler gegeben hat, mit Modus 1 aufgerufen. Diese +Vorgehensweise wird auch dann durchgeführt, wenn einmal ein +Mechanismus eingebaut wird, der den Auswurfknopf von +Wechselplattenlaufwerken oder CD-ROM abfragt und ggf. den Auswurf +verweigert. +
  +
Gruppe: Aufbau eines DFS +
  +
Querverweis: DFS-Konzept in MagiC +
  + +
+ +

11.20.1.5 dfs_drv_open

+ + + + + + + + + + + + + + + +
Name: »dfs_drv_open« +
  +
Parameter: +
  +

+
+ + + + + + + + + + +
a0=DMD *d
-> d0=long errcode
+
+ +
Beschreibung: MagiC unterstützt genau 26 gleichzeitig aktive Dateisysteme +denen die Buchstaben 'A'..'Z' zugeordnet sind. Dieser Eintrag hat zwei +Aufgaben: +
  + +
    +
  1. Beim ersten Zugriff auf ein Laufwerk (etwa D:) legt der Kernel +einen DMD (drive media descriptor) an und "bietet" diesen +den XFSs an. Der DOS_XFS bietet diesen wiederum der Reihe nach allen +DFS-Treibern an. Der Eintrag d_dfs ist noch ein Nullzeiger, d_drive +ist initialisiert (zwischen 0 und 25, entsprechend 'A'..'Z'). Die +DFS-Treiber versuchen nun, auf dem Laufwerk "ihr" +Dateisystem zu erkennen. Falls dies gelingt, müssen d_dfs und d_root +initialisiert werden, der Rückgabewert ist dann E_OK. Andernfalls +wird EDRIVE gemeldet, und das DOS_XFS probiert das nächste DFS. +
      +

  2. +
  3. Beim wiederholten Zugriff ist d_dfs bereits initialisiert, und +das DFS hat die Gelegenheit, auf Mediumwechsel zu testen. Ist alles in +Ordnung, muß E_OK zurückgegeben werden. Ansonsten muß die +Diskwechselroutine des Kernels aufgerufen und E_CHNG zurückgegeben +werden. Den Zeiger auf die Diskwechselroutine des Kernels erhält man +dabei per Dcntl. +
      +

  4. +
+ +
Gruppe: Aufbau eines DFS +
  +
Querverweis: DFS-Konzept in MagiC +
  + +
+ +

11.20.1.6 dfs_ext_fd

+ + + + + + + + + + + + + + + +
Name: »dfs_ext_fd« +
  +
Parameter: +
  +

+
+ + + + + + + + + + +
a0=FD *fd
-> d0=long errcode
+
+ +
Beschreibung: Wird benutzt, wenn eine Datei angelegt werden soll, aber das +Verzeichnis bereits voll ist. Wird außerdem beim Anlegen eines +Ordners (Dcreate) verwendet. +
  +
<fd> ist ein Prototyp-FD, der bereits im exklusiven Modus +geöffnet ist. Die Datei muß erweitert und der neue Platz mit Nullen +initialisiert werden. +
  +
Gruppe: Aufbau eines DFS +
  +
Querverweis: DFS-Konzept in MagiC +
  + +
+ +

11.20.1.7 dfs_fcreate

+ + + + + + + + + + + + + + + +
Name: »dfs_fcreate« +
  +
Parameter: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
a0=FD *dd
a1=DIR *dir
d0=int cmd
d1=long arg
-> d0=long errcode
+
+ +
Beschreibung: Wird bei Fcreate, Dcreate und Dcntl benutzt. Der DOS_XFS hat +bereits im Verzeichnis <dd> einen freien Platz gefunden und, +zunächst im Speicher, den neuen Verzeichniseintrag <dir> +erstellt. Die nicht in jedem DFS verwendeten Teile des DIR (auch +Clusternummer) sind bereits mit Null initialisiert. Das DFS hat hier +die Gelegenheit, noch Korrekturen vorzunehmen und die reservierten +DIR-Bereiche je nach Dateityp zu initialisieren, bevor der DOS_XFS den +ganzen Eintrag in das Verzeichni schreibt. +
  +
Wenn der Aufruf von Dcntl oder Fsymlink kommt, stehen in d0 und +a0 die entsprechenden Parameter, sonst ist d0 == 0. Wenn d0 == +SYMLINK_CREATE ist, muß (oder zumindest kann, wenn möglich) ein +symbolischer Link erstellt werden. +
  +
Gruppe: Aufbau eines DFS +
  +
Querverweis: DFS-Konzept in MagiC +
  + +
+ +

11.20.1.8 dfs_fdelete

+ + + + + + + + + + + + + + + +
Name: »dfs_fdelete« +
  +
Parameter: +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
a0=FD *dd
a1=DIR *dir
d0=long dirpos
-> d0=long errcode
+
+ +
Beschreibung: Die Datei mit dem Verzeichniseintrag <dir> im Verzeichnis +<FD> soll gelöscht werden. Führt das tatsächliche Löschen +der Datei durch, das Löschen des Verzeichniseintrags und +Zugriffsprüfungen werden vom DOS_XFS durchgeführt. +
  +
Gruppe: Aufbau eines DFS +
  +
Querverweis: DFS-Konzept in MagiC +
  + +
+ +

11.20.1.9 dfs_fxattr

+ + + + + + + + + + + + + + + +
Name: »dfs_fxattr« +
  +
Parameter: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
a0=FD *dd
a1=DIR *dir oder NULL
d0=int mode
d1=XATTR *xattr
-> d0=long errcode
ggf.  
a0=LINK *l
+
+ +
Beschreibung: Für Fxattr. Der DOS_XFS hat bereits alle Informationen, die +für alle DFSs identisch sind, in den XATTR eingetragen. +xattr_blksize und xattr_nblocks müssen vom DFS noch initialisiert +werden, xattr_size kann z.B. bei Sonderdateien angepaßt werden. +xattr_index ist vom DOS_XFS mit dem in Motorola-Format umgewandelten +dir_stcl initialisiert worden. In vielen Fällen wird es nötig sein, +hier eine Korrektur vorzunehmen und z.B. einen Zeiger auf einen +Treiber oder eine globale Datenstruktur zu übergeben. +
  +
Beim Modus d0 == 0 (d.h. folge symbolischen Links) muß der DFS +entsprechend reagieren und im Fall eines Links in d0 ELINK und in a0 +den Link zurückgeben. Wenn dir == NULL ist, hat der DOS_XFS +keinen Verzeichniseintrag, sondern einen FD ermittelt (z.B. die Root +oder eine geöffnete Datei). +
  +
Gruppe: Aufbau eines DFS +
  +
Querverweis: DFS-Konzept in MagiC +
  + +
+ +

11.20.1.10 dfs_init

+ + + + + + + + + + + + + + + +
Name: »dfs_init« +
  +
Parameter: — +
  +
Beschreibung: Reserviert. Enthält im Fall MagiC-interner XFSs deren +Initialisierung. Wird bei nachgeladenen XFSs nicht verwendet. +
  +
Gruppe: Aufbau eines DFS +
  +
Querverweis: DFS-Konzept in MagiC +
  + +
+ +

11.20.1.11 dfs_name

+ + + + + + + + + + + + + + + +
Name: »dfs_name« +
  +
Parameter: — +
  +
Beschreibung: Der Name ist bisher nur Kommentar; er soll irgendwann auch +einmal die Möglichkeit bieten, festzustellen, welche Treiber +installiert sind und wie z.B. der für Laufwerk A: zuständige Treiber +heißt (d.h. was für ein Dateisystem die Diskette enthält). +
  +
Der Name des integrierten XFS lautet "DOS_XFS " (auf 8 +Zeichen per Leerstellen erweitert). +
  +
Gruppe: Aufbau eines DFS +
  +
Querverweis: DFS-Konzept in MagiC +
  + +
+ +

11.20.1.12 dfs_next

+ + + + + + + + + + + + + + + +
Name: »dfs_next« +
  +
Parameter: — +
  +
Beschreibung: Ist einfach ein Verkettungszeiger auf den nächsten Treiber. +Ein neuer Treiber wird vorn eingebunden, hat also immer höchste +Priorität. Damit ist es z.B. möglich, den integrierten DOS-Treiber +zu überladen. +
  +
Gruppe: Aufbau eines DFS +
  +
Querverweis: DFS-Konzept in MagiC +
  + +
+ +

11.20.1.13 dfs_pathconf

+ + + + + + + + + + + + + + + +
Name: »dfs_pathconf« +
  +
Parameter: +
  +

+
+ + + + + + + + + + + + + + + +
a0=FD *dd
d0=int which
-> d0=long val oder Fehlercode
+
+ +
Beschreibung: Verschiedene Beschränkungen werden abgefragt, die für einen +bestimmten Pfad <dd> gelten. Die meisten Werte für +<which> werden bereits vom DOS_XFS eingesetzt, deshalb kommen +nur folgende Werte vor: +
  +

+
+ + + + + + + + + + + + + + + +
DP_IOPEN(0)max. Anzahl gleichzeitig offener Dateien
DP_ATOMIC(4)interne Blockgröße
DP_MODEATTR(7)zulässige Dateitypen (ab 21.05.95)
+
+ +
Gruppe: Aufbau eines DFS +
  +
Querverweis: DFS-Konzept in MagiC +
  + +
+ +

11.20.1.14 dfs_readlink

+ + + + + + + + + + + + + + + +
Name: »dfs_readlink« +
  +
Parameter: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
a0=FD *dd
a1=DIR *dir
-> d0=long errcode
ggf.  
a0=LINK *l
+
+ +
Beschreibung: Für Freadlink. d0 ist entweder EACCDN, wenn <dir> kein +Symlink ist, oder ein anderer Fehlercode. Wenn kein Fehler aufgetreten +ist, muß in a0 der Link zurückgegeben werden, und d0 muß den Wert +ELINK haben. +
  +
Gruppe: Aufbau eines DFS +
  +
Querverweis: DFS-Konzept in MagiC +
  + +
+ +

11.20.1.15 dfs_sfirst

+ + + + + + + + + + + + + + + +
Name: »dfs_sfirst« +
  +
Parameter: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
a0=FD * d
a1=DIR *dir
d0=long pos
d1=DTA *dta
-> d0=long errcode
ggf.  
a0=LINK *l
+
+ +
Beschreibung: Der DOS_XFS hat bereits die Datei angesteuert. Das DFS braucht +lediglich für den nächsten Fsnext die reservierten Einträge +dta_usr1 und dta_usr2 zu initialisieren, damit die Stelle +wiedergefunden wird. +
  +
Dateideskriptoren (FDs) können in dta_usr nicht verwendet +werden, weil das Freigeben bei einer "garbage collection" +nicht verhindert werden kann. Die FDs einfach zu blockieren, ist auch +nicht möglich, da man das Ende der Fsfirst/Fsnext Operation nicht +vorhersagen kann. Eine bereits erfolglose Suche kann z.B. durch +Löschen von dta_sname markiert werden. +
  +
<pos> zeigt bereits auf den nächsten Eintrag, also 32 +Bytes hinter <dir>. Bei symbolischen Links muß das DFS +entsprechend reagieren, in d0 ELINK übergeben und in a0 einen Zeiger +auf den Link. Ein Link beginnt mit einem Wort (16 Bit) für die Länge +des Pfads, gefolgt vom Pfad selbst. +
  +
Achtung: Die Länge muß INKLUSIVE abschließendes +Nullbyte und außerdem gerade sein. Der Link muß auf einer geraden +Speicheradresse liegen. +
  +
Der Puffer für den Link kann statisch oder auch flüchtig sein, +da der Kernel die Daten sofort umkopiert, ohne daß zwischendurch ein +Kontextwechsel stattfinden kann. +
  +
Gruppe: Aufbau eines DFS +
  +
Querverweis: DFS-Konzept in MagiC +
  + +
+ +

11.20.1.16 dfs_snext

+ + + + + + + + + + + + + + + +
Name: »dfs_snext« +
  +
Parameter: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
a0=DTA *dta
a1=DMD *dmd
-> d0=long errcode
ggf.  
a0=LINK *l
+
+ +
Beschreibung: Gestützt auf die Daten, die dfs_sfirst im reservierten Bereich +der DTA abgelegt hat, wird die nächste passende Datei gesucht. +Dabei kann auf Funktionen des DOS_XFS zurückgegriffen werden, die per +Dcntl ermittelt werden können: +
  + + + + + + + + + + + + + + + + + + +
_dir_srch durchsucht ein Verzeichnis per FD +
reopen_FD öffnet einen FD +
close_DD schließt einen FD +
filename_match vergleicht Dateinamen +
conv_path_elem wandelt Dateinamen um +
init_DTA kopiert Daten vom DIR in die DTA + +
+ +
Gruppe: Aufbau eines DFS +
  +
Querverweis: DFS-Konzept in MagiC +
  + +
+ +

11.20.1.17 dfs_sync

+ + + + + + + + + + + + + + + +
Name: »dfs_sync« +
  +
Parameter: +
  +

+
+ + + + + + + + + + +
a0=DMD *d
-> d0=long errcode
+
+ +
Beschreibung: Der Kernel hat dem DOS_XFS mitgeteilt, daß auf Laufwerk +<d> alle Puffer zurückzuschreiben sind. Übergeben wird in +Register a0 ein Zeiger auf einen DMD (drive media descriptor). Das +DOS_XFS gibt diesen Aufruf direkt an das DFS weiter. +
  +
Zurückgeliefert wird ein Fehlercode. Wenn das DFS keine +Pufferverwaltung hat (z.B. eine RAMDisk), muß eine 0 geliefert +werden. +
  +
Gruppe: Aufbau eines DFS +
  +
Querverweis: DFS-Konzept in MagiC +
  + +
+ +

11.20.2 Datenstrukturen für ein DFS

+ +

Bei der Arbeit mit einem DFS sind die folgenden Datenstrukturen +wichtig: +

+
    +
  • DIR (Verzeichniseintrag) +
  • +
  • DMD (Medium-Deskriptor) +
  • +
  • DTA (Disk-Transfer-Area) +
  • +
  • DIR (Datei-Deskriptor) +
  • +
  • MX_DDEV (DOS-Gerätetreiber) +
  • +
+ +

Querverweis: XFS-Strukturen +

+

11.20.2.1 Der Verzeichniseintrag (DIR)

+

Die folgenden Felder sind bei jedem DFS identisch: +

+
dir_name:  DS.B   11    /* 0x00: Dateinname                          */
+dir_attr:  DS.B    1    /* 0x0b: Attribut                            */
+dir_usr1:  DS.W    1    /* 0x0c: zur freien Verwendung               */
+dir_usr2:  DS.L    1    /* 0x0e: zur freien Verwendung               */
+dir_usr3:  DS.L    1    /* 0x12: zur freien Verwendung               */
+dir_time:  DS.W    1    /* 0x16: Zeit  der letzten Änderung (Intel)  */
+dir_date:  DS.W    1    /* 0x18: Datum der letzten Änderung (Intel)  */
+dir_stcl:  DS.W    1    /* 0x1a: erster Cluster bzw. andere Info     */
+dir_flen:  DS.L    1    /* 0x1c: Dateilänge (Intel)                  */
+
+

Hinweis: Statt des Clusters sind auch andere Angaben +möglich. Das DOS_XFS behandelt allerdings den Eintrag zunächst wie +eine Clusterangabe (für xattr.index und fd_stcl sowie für das +Erstellen der Einträge "." und ".." bei Dcreate). +Im Fall Fxattr kann die Angabe vom DFS mit anderen Daten +überschrieben werden. +

+

Querverweis: DFS-Konzept in MagiC +

+

11.20.2.2 Der Gerätetreiber (MX_DDEV)

+ +

Der Unter-Gerätetreiber (MX_DDEV) wird beim Öffnen einer Datei +von der DFS-Funktion dfs_dir2FD in den Dateideskriptor eingesetzt und +vom DOS_XFS aufgerufen. Der MX_DDEV-Gerätetreiber muß folgende +Funktionen bereitstellen: +

+
typedef struct _mx_ddev
+{
+  LONG cdecl (*ddev_open)(struct _mx_dosfd *f);
+  LONG cdecl (*ddev_close)();
+  LONG cdecl (*ddev_read)();
+  LONG cdecl (*ddev_write)();
+  LONG cdecl (*ddev_stat)();
+  LONG cdecl (*ddev_seek)();
+  LONG cdecl (*ddev_datime)();
+  LONG cdecl (*ddev_ioctl)();
+  LONG cdecl (*ddev_delete)();
+  LONG cdecl (*ddev_getc)();
+  LONG cdecl (*ddev_getline)();
+  LONG cdecl (*ddev_putc)();
+} MX_DDEV;
+
+

Querverweis: DFS-Konzept in MagiC   XFS-Konzept in MagiC +

+
11.20.2.2.1 ddev_open
+ + + + + + + + + + + + + + + +
Name: »ddev_open« +
  +
Parameter: +
  +

+
+ + + + + + + + + + +
a0=FD *file
-> d0=long errcode
+
+ +
Beschreibung: Die Datei wird geöffnet, der FD ist bereits initialisiert. Im +Open-Modus (fd_mode) muß das Bit O_TRUNC ausgewertet werden. Ggf. ist +ein Fehlercode zurückzugeben, bei Geräten kann O_TRUNC getrost +ignoriert werden. +
  +
Das Feld fd_fpos ist bereits auf 0L initialisiert. Falls dies +nicht ausreicht (z.B. merkt sich das FAT_DFS immer den aktuellen +Cluster), sind die entsprechenden Felder des Benutzerbereichs des FD +zu initialisieren oder andere Felder des FD anzupassen. ddev_open wird +sowohl beim ersten Öffnen einer Datei aufgerufen (nach dfs_dir2FD) +als auch beim Duplizieren eines Dateideskriptors (wenn z.B. mehrere +Programme gleichzeitig auf eine Datei oder ein Verzeichnis zugreifen). +Die Verträglichkeit der Open-Modi (etwa shared read) wird vom Kernel +gewährleistet. Der Gerätetreiber kann z.B. den Openmodus derart +modifizieren, daß der FD immer "exklusiv" geöffnet ist, +oder per Bit OM_NOCHECK veranlassen, daß er den Openmodus selbst +überwachen möchte. Wird ddev_open für den Prototyp-FD aufgerufen, +ist fd->fd_multi1 == fd. Gibt ddev_open einen Fehlercode zurück, +wird der FD einfach wieder vom DOS-XFS freigegeben. +
  +
Gruppe: DOS-Gerätetreiber +
  +
Querverweis: — +
  + +
+ +
11.20.2.2.2 ddev_close
+

Die Datei wird geschlossen. Die Behandlung von fd_refcnt +wird vom DOS_XFS übernommen. Der MX_DDEV-Treiber braucht hier +lediglich eventuelle Puffer zurückzuschreiben. +

+

Parameter-Übergabe: +

+
+ + + + + + + + + + +
a0=FD *file,
-> d0=long errcode
+
+ +
11.20.2.2.3 ddev_read
+

Siehe dev_read. +

+

Parameter-übergabe: +

+
+ + + + + + + + + + + + + + + + + + + + +
a0=FD *file
d0=long count
a1=char *buffer
-> d0=long amount
+
+ +
11.20.2.2.4 ddev_write
+

Siehe dev_write. Der MX_DDEV braucht sich nicht um eine +Aktualisierung des Verzeichnisses oder das Datum des letzten Zugriffs +zu kümmern. +

+

Parameter-Übergabe: +

+
+ + + + + + + + + + + + + + + + + + + + +
a0=FD *file
d0=long count
a1=char *buffer
-> d0=long amount
+
+ +
11.20.2.2.5 ddev_stat
+

Siehe dev_stat. +

+

Parameter-übergabe: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
a0=FD *file
a1=MAGX_UNSEL *unselect oder NULL
d0=int rwflag
d1=long apcode
-> d0=long status
+
+ +
11.20.2.2.6 ddev_seek
+

Siehe dev_seek. +

+

Parameter-Übergabe: +

+
+ + + + + + + + + + + + + + + + + + + + +
a0=FD *file
d0=long where
d1=int mode
-> d0=long position
+
+ +
11.20.2.2.7 ddev_datime
+

Siehe dev_datime. Der MX_DDEV kann hier einfach einen +NULL-Zeiger einsetzen, dann führt das DOS_XFS die Standardprozedur +durch. Das DOS_XFS setzt Fcntl(FUTIME, ...) auf Fdatime um. +

+

Parameter-Übergabe: +

+
+ + + + + + + + + + + + + + + + + + + + +
a0=FD *file
a1=int d[2]
d0=int setflag
-> d0=long errcode
+
+ +
11.20.2.2.8 ddev_ioctl
+

Siehe dev_ioctl. Es sollten zumindest die Funktionen FTRUNCATE, +FIONREAD und FIONWRITE unterstützt werden. Das DOS_XFS setzt +Fcntl(FUTIME, ...) auf Fdatime() und damit auf ddev_datime um, d.h. +FUTIME braucht von ddev_ioctl nicht direkt unterstützt zu +werden. +

+

Parameter-Übergabe: +

+
+ + + + + + + + + + + + + + + + + + + + +
a0=FD *file
d0=int cmd
a1=void *buf
-> d0=long errcode
+
+ +
11.20.2.2.9 ddev_delete
+

Diese Funktion wird nur vom U_DFS, also dem integrierten +DFS-Dateisystem für Laufwerk U: aufgerufen. Wenn man also einen +eigenen Gerätetreiber installiert, ist genau hier der Zeitpunkt +gekommen, seinen Speicher freizugeben und sich damit aus dem System +zurückzuziehen. +

+

Parameter-übergabe: +

+
+ + + + + + + + + + + + + + + +
a0=FD *directory
a1=DIR *dir
-> d0=long errcode
+
+ +
11.20.2.2.10 ddev_getc
+

Siehe dev_getc. Der MX_DDEV kann hier einfach einen NULL-Zeiger +einsetzen, dann führt das DOS_XFS die Standardprozedur durch, d.h. +ruft ddev_read auf. +

+

Parameter-übergabe: +

+
+ + + + + + + + + + + + + + + +
a0=FD *file
d0=int mode
-> d0=unsigned long c
+
+ +
11.20.2.2.11 ddev_getline
+

Siehe dev_getline. Der MX_DDEV kann hier einfach einen +NULL-Zeiger einsetzen, dann führt das DOS_XFS die Standardprozedur +durch, d.h. ruft ddev_read auf. +

+

Parameter-Übergabe: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
a0=FD *file
a1=char *buf
d1=long size
d0=int mode
-> d0=long amount
+
+ +
11.20.2.2.12 ddev_putc
+

Siehe dev_putc. Der MX_DDEV kann hier einfach einen NULL-Zeiger +einsetzen, dann führt das DOS_XFS die Standardprozedur durch, d.h. +ruft ddev_write auf. +

+

Parameter-Übergabe: +

+
+ + + + + + + + + + + + + + + + + + + + +
a0=FD *file
d0=int mode
d1=long value
-> d0=unsigned long count
+
+ +

11.20.2.3 Die Disk-Transfer-Area (DTA)

+

Die DTA wird von den alten DOS-Funktionen Fsfirst und Fsnext +verwendet, deren ungeschickte Konzeption durch die MSDOS-Schöpfer +immer noch wie ein Fluch auf dem System lastet. Die Aufteilung in +res1/res2 hat historische Gründe, um den Aufbau zumindest im DOS_XFS +möglichst kompatibel zum alten TOS zu machen. Für das DOS_XFS und +damit alle DFSs sieht die Struktur folgendermaßen aus: +

+
dta_sname:  DS.B    12       /* 0x00: Suchname (von Fsfirst)       */
+dta_usr1 :  DS.L     1       /* 0x0c: zur freien Verwendung        */
+dta_usr2 :  DS.L     1       /* 0x10: zur freien Verfügung         */
+dta_drive:  DS.B     1       /* 0x14: logisches Laufwerk (0..25)   */
+dta_attr :  DS.B     1       /* 0x15: gefundenes Attribut          */
+dta_time :  DS.W     1       /* 0x16: gefundene Zeit               */
+dta_date :  DS.W     1       /* 0x18: gefundenes Datum             */
+dta_len  :  DS.L     1       /* 0x1a: gefundene Länge              */
+dta_name :  DS.B    14       /* 0x1e: gefundener Dateiname         */
+
+

Hinweis: Hier stehen 2 Langworte zur freien Verfügung. +In dta_sname steht der Suchname bereits im aktuellen Format. +In dta_usr1 und dta_usr2 muß die aktuelle Position +der Suche eingetragen werden, damit ein nachfolgendes Fsnext an der +richtigen Stelle weitersucht. +

+

Querverweis: DFS-Konzept in MagiC +

+

11.20.3 Installation eines DFS

+

Ein DFS ist einfach ein Programm, das den Treiber installiert +und sich resident beendet. Die Installation erfolgt durch: +
dosfunctions = Dcntl(DFS_INSTDFS, "U:\\", +&myxfs); +
Der Pfad "U:\\" ist wichtig, weil der Dcntl-Aufruf +nicht vom MagiC-Kernel, sondern vom DOS-XFS ausgeführt wird. Man +erhält einen Zeiger auf wichtige XFS-Funktionen zurück, oder einen +Fehlercode. +

+

Die DOS_XFS-Funktionen kann man auch unabhängig von der +Installation eines DFS erfragen über: +
dosfunctions = Dcntl(DFS_GETINFO, "U:\\", NULL); +
Per kernel = Dcntl (KER_GETINFO, NULL, NULL) erhält man +die Kernelfunktionen. +

+

Die Deinstallation eines DFS ist nicht vorgesehen. +

+
+ +Home +MagiCMagiC +Die Zusatzprogramme für MagiCDie Zusatzprogramme für MagiC +Das XFS-Konzept von MagiCDas XFS-Konzept von MagiC + + diff --git a/de/magic_dma.html b/de/magic_dma.html new file mode 100644 index 000000000..fac5a4c3d --- /dev/null +++ b/de/magic_dma.html @@ -0,0 +1,138 @@ + + + + + +Die Anleitung zum TOS: Der Hintergrund-DMA von MagiC + + + + + + + + + +Home +MagiCMagiC +Spezielle Fehlermeldungen von MagiCSpezielle Fehlermeldungen von MagiC +Das Iconify in MagiCDas Iconify in MagiC + +
+ +

11.9 Der Hintergrund-DMA von MagiC

+ +

Ab MagiC 3 ist das gesamte DOS einschließlich der Zugriffe auf +DOS Dateisysteme reentrant und läuft im Hintergrund ab. So ist es +möglich, auf Laufwerk A Dateien zu bearbeiten, ohne den Rechner bei +den Diskettenzugriffen merklich zu bremsen. Voraussetzung hierfür +sind jedoch Disketten- und Festplattenroutinen, die im Hintergrund +arbeiten. +

+

Damit der Plattentreiber diese Funktionen nicht zur Verfügung +zu stellen braucht, enthält das BIOS von MagiC alle notwendigen +Funktionen. Über den MagX-Cookie (Komponente hddrv_functions) +erhält man Zugriff auf die folgende Struktur, die Zeiger auf wichtige +Routinen des Hintergrund-DMAs enthält: +

+
typedef struct
+{
+    LONG dma_begin ( VOID);
+    LONG dma_end   ( VOID );
+    LONG dma_wait  ( d0 = LONG ticks_200hz );
+    LONG ncr_begin ( VOID );
+    LONG ncr_end   ( VOID );
+    LONG ncr_wait  ( d0 = LONG ticks_200hz );
+} HDFUNCS;
+
+

Hinweis: Direkt vor der Struktur (2 Bytes vorher) liegt +ein WORD, das die Tabellenlänge in LONGs angibt (in diesem Fall 6). +Alle 6 Zeiger liegen im Systemvariablenbereich und dürfen notfalls +verändert werden. Die internen Funktionen für die Floppy springen +ebenfalls über die 6 Zeiger. Wichtig: Der Zeiger +hddrv_functions im MagX-Cookie darf nicht verändert werden. +

+

Zur Bootzeit ist das präemptive Multitasking abgeschaltet +(eigentlich ist auch das Multitasking abgeschaltet), aber die Routinen +funktionieren auch vor Installation des AES, wobei die Warteroutinen +dann ein 'busy waiting' machen (wie auch beim Abschalten des +präemptiven Multitasking), und die Semaphorenroutinen machen (bis auf +das Setzen und Löschen von flock) einfach nichts. +

+

Dieser Hypertext enthält Auszüge aus dem BIOS von MagiC, die demonstrieren +sollen, wie das ganze funktioniert; dazu einige Worte: +

+
    +
  • die Routinen acsi_xxx sind gleichzeitig für ACSI und FDC, d.h. +dma_begin setzt flock, dma_end löscht es wieder. +
      +

  • +
  • die Routinen ncr_xxx sind für TT-SCSI. +
      +

  • +
  • die Funktionen xxx_begin reservieren die jeweilige Semaphore. +Für die Rückgabwerte gilt: +
      +

    +

    + + + + + + + + + + + + +
    WertBedeutung
    -1Semaphore ist bereits im Besitz
     0Ok
    +
    + +
    Die Routinen verändern mit Ausnahme von d0 keine Register. +
      +

  • +
  • die Funktionen xxx_end geben die Semaphore wieder frei; auch +hier wird kein Register verändert. +
      +

  • +
  • dma_wait wartet auf einen Interrupt des ACSI-DMA (bzw. FDC) +Controllers; ncr_wait ist für den SCSI-Bus des Atari-TT. Für die +Rückgabewerte gilt: +
      +

    +

    + + + + + + + + + + + + + + + + +
    WertBedeutung
    -2Busfehler (Interrupt vom TT-SCSI)
    -1Timeout
     0Ok
    +
    + +

  • +
+ +

Querverweis: BIOS   GEMDOS   XFS-Konzept in MagiC +

+
+ +Home +MagiCMagiC +Spezielle Fehlermeldungen von MagiCSpezielle Fehlermeldungen von MagiC +Das Iconify in MagiCDas Iconify in MagiC + + diff --git a/de/magic_driveu.html b/de/magic_driveu.html new file mode 100644 index 000000000..eecd812a5 --- /dev/null +++ b/de/magic_driveu.html @@ -0,0 +1,358 @@ + + + + + +Die Anleitung zum TOS: Das Laufwerk U: in MagiC + + + + + + + + + +Home +MagiCMagiC +Das Iconify in MagiCDas Iconify in MagiC +Der Aufbau der MAGX.INF-DateiDer Aufbau der MAGX.INF-Datei + +
+ +

11.11 Das Laufwerk U: in MagiC

+

Unter MagiC wird Laufwerk U: bei der Initialisierung des DOS +angelegt. Damit es von gängigen Programmen als existent erkannt wird, +wird das entsprechende Bit in _drvbits gesetzt; es existiert jedoch +kein entsprechendes BIOS-Laufwerk. +

+

+

Innerhalb des Laufwerks gibt es einige Spezialverzeichnisse, und +zwar: +

+ + +

Im Gegensatz zu MiNT sind dies jedoch keine eigenen +Dateisysteme, sondern einfach nur Unterverzeichnisse des DFS für +Laufwerk U:. Je nach Unterverzeichnis legt das U-DFS verschiedene +Dateitypen und -treiber an. Da die Verzeichniskontrolle dem DOS_XFS +obliegt, werden z.B. Schreibzugriffe auf ein Device im Verzeichnis per +Dateidatum protokolliert. Das geht sogar soweit, daß ein +Schreibzugriff auf das Wurzelverzeichnis von Laufwerk A: automatisch +das Dateidatum von U:\A verändert. +

+

Alle Verzeichnisse sind z.Zt. auf maximal 32 Einträge +beschränkt, und Aufrufe von Dfree liefern nur den Wert Null zurück. +Auf dem Wurzelverzeichnis können außer den bestehenden Dateien nur +symbolische Links (per Fsymlink) erstellt werden. +

+

Vor jedem Zugriff auf Laufwerk U: werden neu hinzugekommene +Laufwerke per symbolischem Link hinzugefügt bzw. nicht mehr +existierende entfernt; dies wird über _drvbits erkannt. Ein +symbolischer Link für Laufwerk X: wird standardmäßig unter dem +Namen U:\X angemeldet, und zeigt auf das Verzeichnis X:\. Symbolische +Links können umbenannt oder gelöscht werden (auch ein umbenannter +Link wird automatisch gelöscht, wenn das entsprechende Bit in der +Systemvariablen _drvbits gelöscht wird). +

+

Achtung: MiNT bindet die Laufwerke nicht als symbolische +Links ein, daher kann man folgende Befehlsfolge absetzen: +

+ + + + + + + + + + + + + + + +
Dsetdrv U: +
Dsetpath U:\A +
Dgetpath ==> U:\A +
Dsetpath .. +
Dgetpath ==> U:\ + +
+ +

Bei einem symbolischen Link wechselt man hingegen tatsächlich +den Pfad, d.h. in der dritten Zeile erscheint A:\ als aktueller Pfad. +Um dieses Problem zu umgehen, gibt es eine Sonderbehandlung im Kernel, +der die obige Befehlsfolge auch in MagiC ermöglicht. Dabei gibt es +allerdings ein Problem: Der symbolische Link darf nicht umbenannt +werden, da sonst folgendes passiert: +

+ + + + + + + + + + + + + + + + + + +
Frename U:\A U:\FLOPPY +
Dsetdrv U: +
Dsetpath U:\FLOPPY +
Dgetpath ==> U:\A +
Dsetpath .. +
Dgetpath ==> U:\ + +
+ +

Weil alle Dateifunktionen auf U: genauso funktionieren wie auf +einer Diskette ist es auch möglich, Verzeichnisse wie U:\DEV +umzubenennen. Achtung: Dies sollte tunlichst vermieden werden, +da sonst Anwenderprogramme ihre Gerätetreiber nicht mehr finden +können. +

+

Querverweis: BIOS   GEMDOS   XFS-Konzept in MagiC   Test auf Pipes +

+

11.11.1 Das Verzeichnis U:\DEV

+

In diesem Verzeichnis werden Gerätetreiber (Devices) +eingetragen. Es handelt sich dabei um Pseudodateien, die nur dem DOS, +nicht jedoch dem BIOS bekannt sind. +

+

+

Auch die altbekannten Gerätenamen finden sich in diesem +Verzeichnis wieder, denn es gilt: +

+
    +
  • CON: (Handle -1) ==> U:\DEV\CON +
  • +
  • AUX: (Handle -2) ==> U:\DEV\AUX +
  • +
  • PRN: (Handle -3) ==> U:\DEV\PRN +
  • +
  • NUL: (Handle -4) ==> U:\DEV\NULL +
  • +
+ +

Da auf die hier installierten Geräte mit den normalen +Dateifunktionen des GEMDOS zugegriffen werden kann, ist es z.B. +möglich ein Textdokument durch einfaches Speichern per Fwrite auf dem +Drucker auszugeben. Dateinamen wie CON: werden dabei vom Kernel +automatisch in die richtige Form umgewandelt (in diesem Fall also: +U:\DEV\CON). +

+

Abhängig vom Rechnermodell stehen per Default die folgenden +Devices zur Verfügung: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Gerät Beschreibung +
    +
AUX BIOS-Gerät 2 +
CON Console +
LAN BIOS-Gerät 7, i.a. SCC, Kanal A +
MIDI BIOS-Gerät 3, beim Ausgabestatus hingegen das Gerät mit der +Nummer 4. +
MODEM1 BIOS-Gerät 6, i.a. die mit dem ST-MFP realisierte serielle +Schnittstelle, auf dem Falcon der SCC mit Kanal-B. +
MODEM2 BIOS-Gerät 7, i.a. SCC, Kanal B +
NULL leere Pseudodatei, liefert beim Schreiben immer den Status Ok +und beim Lesen den Wert EOF (kein Zeichen verfügbar). +
PRN BIOS-Gerät 0, bei der Ausgabe wird bei einem Timeout +abgebrochen. +
SERIAL1 BIOS-Gerät 8, i.a. der TT-MFP +
SERIAL2 BIOS-Gerät 9, i.a. SCC, Kanal A + +
+ +

Von CON: einmal abgesehen, arbeiten alle Geräte im +"Raw-Modus", d.h. Steuersequenzen wie Control-C werden nicht +berücksichtigt. +

+

Weitere Geräte können jederzeit per Dcntl erstellt und +eingetragen werden; aufgrund des inkompatiblen Treiberformates muß +jedoch der Opcode DEV_M_INSTALL und nicht wie sonst üblich +DEV_INSTALL benutzt werden. Die vorhandenen Geräte können mit den +üblichen Methoden umbenannt und gelöscht werden; im Gegensatz zu +MiNT wird das Löschen eines Gerätes über den Gerätetreiber selbst +abgewickelt, der sich so aus den entsprechenden Systemvektoren +zurückziehen und den Speicher freigeben bzw. sich beenden kann. Ein +weiterer Unterschied zu MiNT besteht darin, daß MagiC die volle +Funktionalität des DOS-Dateisystems zur Verfügung stellt, d.h.: +

+
    +
  • es dürfen keine Geräte gleichen Namens existieren. +
  • +
  • Schreibzugriffe werden mit Änderung des Dateidatums +überwacht. +
  • +
  • schreibgeschützte Geräte dürfen nicht beschrieben, gelöscht +oder umbenannt werden. +
  • +
+ +

Hinweis: Über Fcreate können hier keine Dateien erzeugt +werden; es ist allerdings möglich per Fsymlink symbolische Links +anzulegen. +

+

Querverweis: BIOS   GEMDOS   XFS-Konzept in MagiC +

+

11.11.2 Das Verzeichnis U:\PIPE

+ +

In diesem Verzeichnis werden Pipes abgelegt; es handelt sich +dabei um temporäre Dateien, die insbesondere für den Datenaustausch +zwischen Prozessen benutzt werden. +

+

Man unterscheidet unidirektionale und +bidirektionale Pipes: erstere erlauben einen Datenfluß nur in +einer Richtung, letztere können in beide Richtungen übertragen, +jedoch nicht gleichzeitig. Bidirektionale Pipes finden z.B. beim +Drag&Drop-Protokoll Verwendung. Pipes liefern beim Lesen per +Fread grundsätzlich EOF (End-of-File) wenn sie leer sind, oder kein +schreibender Prozeß vorhanden ist. Analog wird beim Schreiben per +Fwrite der Wert EOF geliefert, falls kein lesender Prozess vorhanden +ist. +

+

Der Zugriff erfolgt dabei rein asynchron, d.h. Applikationen +warten auf das Lesen bzw. Schreiben und wecken ggf. eine andere +Applikation wieder auf. Pipes werden automatisch gelöscht, wenn das +letzte Programm, daß sie benutzt, die sie repräsentierende Datei +geschlossen hat. +

+

Hinweis: MagiC unterstützt maximal 32 Pipes +gleichzeitig. Ein Fseek auf Pipes führt grundsätztlich zur Rückgabe +von 0L, d.h. der Dateizeiger kann nicht beeinflußt werden. Im +Verzeichnisfenster erscheinen Pipes mit einer Länge von 2 bzw. 4k und +dem Datum ihrer Erstellung. Falls beim Öffnen einer Pipe eine Kennung +> 31 geliefert wird, kann die Systemfunktion Fselect nicht benutzt +werden. +

+

Darüber hinaus ist ab MagiC 3 folgendes zu beachten: +

+
    +
  • Pipes mit Modus 4 (Pseudo-TTYs) werden nicht unterstützt. +MagiC kennt nur uni- und bidirektionale Pipes und erstellt bei Modus 4 +eine bidirektionale Pipe. Der Hauptgrund für Pipes sind zur Zeit das +Drag&Drop-Protokoll. +
      +

  • +
  • Pipes liefern bei Finstat/Foutstat die Anzahl der vorhandenen +bzw. noch freien Bytes im Block. +
      +

  • +
  • Wird eine Pipe geschlossen, so werden alle wartenden Programme +aufgeweckt, um evtl. mögliche Deadlocks zu vermeiden. +
      +

  • +
+ +

Querverweis: +
Fcreate   Fread   Fwrite   Fclose   Fpipe   Test auf Pipes +

+

11.11.3 Das Verzeichnis U:\PROC

+ + + +

Dieses Verzeichnis gibt einen Überblick über die z.Zt. aktiven +Prozesse im System. Jeder Eintrag besteht aus den folgenden +Komponenten: +

+

+
    +
  • dem Prozessnamen +
  • +
  • der Prozess-ID (PID) +
  • +
  • dem aktuellen Speicherplatzverbrauch +
  • +
  • Datum und Uhrzeit der Prozesserstellung +
  • +
+ +

In der Abbildung oben beispielsweise, besitzt der Prozess +XCONTROL die PID 4 und belegt z.Zt. 93460 Bytes Speicherplatz. +

+

Prozess IDs werden beim Programmstart vergeben und beim +Terminieren freigegeben. Das Löschen einer Datei in diesem +Verzeichnis hat zur Folge, daß der entsprechende Prozess (über den +Programmanager des AES) zerstört wird. +

+

Hinweis: Die MiNT-konformen Prozess-Attribute (spezielle +Dateiattribute) werden von MagiC z.Zt. nicht unterstützt. Der Name +eines Prozesses kann auch über die Environment-Variable _PNAM +ermittelt werden; die Prozess-ID findet sich auch in der Basepage. +

+

Querverweis: GEM   Style-Guidelines   Task-Manager +

+

11.11.4 Das Verzeichnis U:\SHM

+ +

Dieses Verzeichnis dient als 'Ablage' für Shared Memory; hier +können also Dateien angelegt werden die Speicherblöcke +repräsentieren, und auf die andere Prozesse zugreifen dürfen. +

+

Über Shared Memory (gemeinsamen Speicher) läßt sich sehr +leicht eine Interprozess-Kommunikation (IPC) realisieren. +

+

Querverweis: Fcntl   SHMGETBLK   SHMSETBLK +

+
+ +Home +MagiCMagiC +Das Iconify in MagiCDas Iconify in MagiC +Der Aufbau der MAGX.INF-DateiDer Aufbau der MAGX.INF-Datei + + diff --git a/de/magic_editable.html b/de/magic_editable.html new file mode 100644 index 000000000..04b4f2f36 --- /dev/null +++ b/de/magic_editable.html @@ -0,0 +1,64 @@ + + + + + +Die Anleitung zum TOS: Eingabefelder in MagiC + + + + + + + + + +Home +MagiCMagiC +Anmerkungen zum 3D-Look von MagiCAnmerkungen zum 3D-Look von MagiC +scrollende Eingabefelderscrollende Eingabefelder + +
+ +

11.6 Eingabefelder in MagiC

+ +

Die Eingabefelder bieten in MagiC von Haus aus bereits viele +Funktionen, die sonst mühsam zu Fuß programmiert werden müssen. +U.a. sind dies: +

+
    +
  • exakte Cursorpositionierung per Maus +
  • +
  • Tastaturkürzel, um den Cursor zum vorherigen/nächsten Wort +oder zum Zeilenanfang/Zeilenende zu bewegen. +
  • +
  • Einfüge/Überschreibmodus +
  • +
  • Löschen bis Zeilenende +
  • +
  • Cut, Copy, Paste +
  • +
  • Eingabefelder mit kleiner Schrift funktionieren +
  • +
+ +

Die Funktionen für Help, Undo, Shift-hoch, Shift-runter und +Ctrl-Q sind in form_keybd enthalten (sie werden allerdings ignoriert, +falls das entsprechende Objekt DISABLED ist) die Cursorpositionierung +per Maus in form_do bzw. form_xdo und objc_edit und die restlichen +Funktionen in objc_edit. +

+

Wer in den Genuß der entsprechenden Funktionen kommen möchte, +muß die dazu gehörigen AES-Aufrufe benutzen. +

+

Querverweis: AES   GEM   Style-Guidelines   scrollende Eingabefelder +

+
+ +Home +MagiCMagiC +Anmerkungen zum 3D-Look von MagiCAnmerkungen zum 3D-Look von MagiC +scrollende Eingabefelderscrollende Eingabefelder + + diff --git a/de/magic_errors.html b/de/magic_errors.html new file mode 100644 index 000000000..b399fe4ec --- /dev/null +++ b/de/magic_errors.html @@ -0,0 +1,130 @@ + + + + + +Die Anleitung zum TOS: Spezielle Fehlermeldungen von MagiC + + + + + + + + + +Home +MagiCMagiC +scrollende Eingabefelderscrollende Eingabefelder +Der Hintergrund-DMA von MagiCDer Hintergrund-DMA von MagiC + +
+ +

11.8 Spezielle Fehlermeldungen von MagiC

+

Das alternative Betriebssystem MagiC kennt einige +Fehlermeldungen, die unter normalen TOS nicht vorhanden sind: +

+ + +

Querverweis: GEMDOS-Fehlermeldungen   BIOS und XBIOS Fehlermeldungen +

+

11.8.1 Fataler Fehler beim Booten

+

Ursache: +

+
    +
  • Das System hat zuwenig Speicher, um sich zu initialis. +
  • +
  • Interne Datenstrukturen sind zerstört und daher in einem +inkonsistenten Zustand. +
  • +
+ +

Abhilfe: System neu installieren, Plattentreiber +entfernen, von Diskette booten, AUTO-Ordner deaktivieren. +

+

11.8.2 Fataler Fehler im Gemdos

+

Ursache: +

+
    +
  • Beim Falcon liegt der Bildschirm an einer ungültigen Adresse. +
  • +
  • Beim Terminieren eines Prozesses ist der parent ungültig. +
  • +
  • Beim Falcon ist Srealloc() nicht durchführbar. +
  • +
  • Interne Datenstrukturen sind zerstört und daher in einem +inkonsistenten Zustand. +
  • +
+ +

Abhilfe: Je nach Auftreten. +

+

11.8.3 Kein interner Speicher mehr

+

Ursache: Die Systemanfrage zum Öffnen einer Datei, +eines Verzeichnisses oder eines Laufwerks kann nicht ausgeführt +werden, weil interne Speicherbereiche vollständig belegt sind. +

+

Abhilfe: Verschwindet das Problem auch nicht, wenn man +ADDMEM zwei oder dreimal unter verschiedenen Namen in den AUTO-Ordner +kopiert, ist die Ursache ein Anwenderprogramm, das z.B. Dateien oder +Ordner nicht schließt (fehlendes Fclose() oder Dclosedir()). +

+

11.8.4 Speicherblock zerstört

+

Ursache: Ein Anwenderprogramm hat einen allozierten +Speicherblock oder auch einen fremden Speicherblock überschrieben. +

+

Abhilfe: Das Anwenderprogramm kann unter MagiC nicht +verwendet werden. Zwar mag es unter TOS oder MultiTOS scheinbar +funktionieren, aber die Verwendung ist gefährlich, da unvorhersehbar. +

+

11.8.5 Fataler Fehler im AES

+

Ursache: +

+
    +
  • Zuwenig Speicher zum Start des AES vorhanden. +
  • +
  • Interne Datenstrukturen des AES sind zerstört und daher in +einem inkonsistenten Zustand. +
  • +
  • Ein ungültiger Objektbaum wurde an form_button übergeben. +
  • +
  • Der feste Hintergrundspeicher für Menüs reicht nicht aus, da +ein Menü eine unzulässige Größe hat. +
  • +
  • VDI-Gerät 1 ist ungültig. +
  • +
+ +

Abhilfe: Je nach Auftreten. +

+

11.8.6 Überlauf des Systemstapels

+

Ursache: Der Systemstapel eines Anwenderprogramms ist +übergelaufen. +

+

Abhilfe: Gegenüber TOS ist der Stack in MagiC um ein +vielfaches größer, Ursache kann daher nur ein amoklaufendes Programm +oder ein defekter Treiber (TSR-Programm oder Gerätetreiber) sein. +Fehlerhafte Programme entfernen! +

+
+ +Home +MagiCMagiC +scrollende Eingabefelderscrollende Eingabefelder +Der Hintergrund-DMA von MagiCDer Hintergrund-DMA von MagiC + + diff --git a/de/magic_function.html b/de/magic_function.html new file mode 100644 index 000000000..8976ebc55 --- /dev/null +++ b/de/magic_function.html @@ -0,0 +1,950 @@ + + + + + +Die Anleitung zum TOS: MagiC Funktionen + + + + + + + + + +Home +AESAES +ListboxenListboxen +MenüfunktionenMenüfunktionen + +
+ +

8.16 MagiC Funktionen

+

Diese Bibliothek enthält spezielle Funktionen, welche nur unter +MagiC zur Verfügung stehen. +

+ + + + + + + + + + + + + + + + + + + + + +
sys_recalc_cicon_colours Übergibt rgb-Tripel in Promille für die Iconwandlung bei +"direct colour" Bildschirm-Modi. +
sys_set_editob Edit-Objekt definieren +
sys_set_getfn AES-Funktion ermitteln +
sys_set_setfn AES-Funktion ändern +
sys_set_winframe_manager Installieren eines neuen Fensterrahmen-Manager +
sys_set_getdisp AES-Dispatcher ermitteln +
sys_set_appl_getinfo In appl_getinfo einklinken + +
+ +

Querverweis: AES +

+

8.16.1 sys_set_getdisp

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: AES-Dispatcher ermitteln. +
  +
AES-Nummer: 0 (Unterfunktion 0) +
  +
Deklaration: void sys_set_getdisp(void **disp_addr, void **disp_err); +
  +
Beschreibung: +
  +
Ergebnis: +
  +
Verfügbar: Ab MagiC 5.20 +
  +
Gruppe: MagiC Funktionen +
  +
Querverweis: Binding +
  + +
+ +

8.16.1.1 Bindings für sys_set_getdisp

+ + + + + + + + + +
C: void sys_set_getdisp(void **disp_addr, void **disp_err); +
  +
Umsetzung: +
  +
void sys_set_getdisp(void **disp_addr, void **disp_err);
+{
+   int_in[0]  = 0;      /* Subcode 0: determine AES dispatcher */
+
+   crys_if(0);
+
+   *disp_addr = addr_out[0];
+   if (disp_err)
+      *disp_err = addr_out[1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]0 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]2 # Entry in addr_out
int_inint_in[0]0
addr_outaddr_out[0]
+
+ + +
+ +

8.16.2 sys_recalc_cicon_colours

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: ??? +
  +
AES-Nummer: 0 (Unterfunktion 5) +
  +
Deklaration: void *sys_recalc_cicon_colours( uint16_t colour_values[3*256] +); +
  +
Beschreibung: Übergibt rgb-Tripel in Promille für die Iconwandlung bei +"direct colour" Bildschirm-Modi. +
  +
Wird laut Andreas Kromke nur von MagxDesk verwendet, um Icons +umzurechnen. Ist nicht näher dokumentiert. +
  +
Ergebnis: Unbekannt. +
  +
Verfügbar: Ab MagiC 5.20 vom 20.11.97 +
  +
Gruppe: Resourceorganisation +
  +
Querverweis: Binding +
  + +
+ +

8.16.2.1 Bindings für sys_recalc_cicon_colours

+ + + + + + + + + +
C: void *sys_recalc_cicon_colours( uint16_t colour_values[3*256] +); +
  +
Umsetzung: +
  +
void *sys_recalc_cicon_colours( uint16_t colour_values[3*256] );
+{
+   int_in[0]  = 5;               /* Subcode 5: */
+   addr_in[0] = colour_values;
+
+   crys_if(0);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]0 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]0 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]5
addr_inaddr_in[0]colour_values
+
+ + +
+ +

8.16.3 sys_set_editob

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: Edit-Objekt definieren +
  +
AES-Nummer: 0 (Unterfunktion 4) +
  +
Deklaration: void *sys_set_editob( int16_t cdecl (*editob) (PARMBLK *pb) ); +
  +
Beschreibung: +
  +
Ergebnis: Unbekannt. +
  +
Verfügbar: Ab MagiC 5.20 +
  +
Gruppe: MagiC Funktionen +
  +
Querverweis: Binding +
  + +
+ +

8.16.3.1 Bindings für sys_set_editob

+ + + + + + + + + +
C: void *sys_set_editob( int16_t cdecl (*editob) (PARMBLK *pb) ); +
  +
Umsetzung: +
  +
void *sys_set_editob( int16_t cdecl (*editob) (PARMBLK *pb) )
+{
+   int_in[0]  = 4;      /* Subcode 4: define Edit object */
+   addr_in[0] = editob;
+
+   crys_if(0);
+
+   return ( addr_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]0 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]1 # Entry in addr_out
int_inint_in[0]4
addr_inaddr_in[0]editob
addr_outaddr_out[0]
+
+ + +
+ +

8.16.4 sys_set_getfn

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: AES-Funktion ermitteln +
  +
AES-Nummer: 0 (Unterfunktion 1) +
  +
Deklaration: AES_FUNCTION *sys_set_getfn( int16_t fn ); +
  +
Beschreibung: Es wird ermittelt ob die AES Funktion mit der Nummer fn +vorhanden ist. +
  +
Ergebnis: NULL oder die Adresse der Funktion. +
  +
Verfügbar: MagiC +
  +
Gruppe: MagiC Funktionen +
  +
Querverweis: Binding +
  + +
+ +

8.16.4.1 Bindings für sys_set_getfn

+ + + + + + + + + +
C: AES_FUNCTION *sys_set_getfn( int16_t fn ); +
  +
Binding: +
  +
AES_FUNCTION *sys_set_getfn( int16_t fn )
+{
+   int_in[0]  = 1;      /* Subcode 1: AES-Funktion ermitteln */
+   int_in[1]  = fn;
+
+   crys_if(0);
+
+   return ( addr_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]0 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]1 # Entry in addr_out
int_inint_in[0]1
int_in+2int_in[1]fn
addr_outaddr_out[0]
+
+ + +
+ +

8.16.5 sys_set_setfn

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: AES-Funktion ändern +
  +
AES-Nummer: 0 (Unterfunktion 2) +
  +
Deklaration: int16_t sys_set_setfn( int16_t fn, AES_FUNCTION *f ); +
  +
Beschreibung: Setzt die Adresse der AES Funktion mit der Nummer fn +neu. +
  +
Ergebnis: +
  +
Verfügbar: MagiC +
  +
Gruppe: MagiC Funktionen +
  +
Querverweis: Binding +
  + +
+ +

8.16.5.1 Bindings für sys_set_setfn

+ + + + + + + + + +
C: int16_t sys_set_setfn( int16_t fn, AES_FUNCTION *f ); +
  +
Binding: +
  +
int16_t sys_set_setfn( int16_t fn, AES_FUNCTION *f )
+{
+   int_in[0]  = 2;      /* Subcode 2: AES-Funktion ändern */
+   int_in[1]  = fn;
+   addr_in[0] = f;
+
+   crys_if(0);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]0 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]1 # Entry in addr_out
int_inint_in[0]2
int_in+2int_in[1]fn
addr_inaddr_in[0]f
addr_outaddr_out[0]
+
+ + +
+ +

8.16.6 sys_set_winframe_manager

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: Installieren eines neuen Fensterrahmen-Manager +
  +
AES-Nummer: 0 (Unterfunktion 6) +
  +
Deklaration: int16_t sys_set_winframe_manager( WINFRAME_HANDLER *old_wfh, +WINFRAME_HANDLER *new_wfh, WINFRAME_SETTINGS **set ) +
  +
Beschreibung: +
  +
Ergebnis: Unbekannt. +
  +
Verfügbar: Ab MagiC 6 +
  +
Gruppe: Fensterverwaltung +
  +
Querverweis: Binding +
  + +
+ +

8.16.6.1 Bindings für sys_set_winframe_manager

+ + + + + + + + + +
C: int16_t sys_set_winframe_manager( WINFRAME_HANDLER *old_wfh, +WINFRAME_HANDLER *new_wfh, WINFRAME_SETTINGS **set ); +
  +
Umsetzung: +
  +
int16_t sys_set_winframe_manager( WINFRAME_HANDLER *old_wfh,
+            WINFRAME_HANDLER *new_wfh,
+            WINFRAME_SETTINGS **set )
+{
+   int_in[0]  = 6;      /* Subcode 6: Fensterrahmen-Manager */
+   addr_in[0] = old_wfh;
+   addr_in[1] = new_wfh;
+
+   crys_if(0);
+
+   *set = addr_out[0];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]0 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]1 # Einträge in addr_out
int_inint_in[0]6
addr_inaddr_in[0]old_wfh
addr_in+4addr_in[1]new_wfh
int_outint_out[0]Return-Wert
addr_outaddr_out[0]set
+
+ + +
+ +

8.16.7 sys_set_appl_getinfo

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: In appl_getinfo einklinken. +
  +
AES-Nummer: 0 (Unterfunktion 6) +
  +
Deklaration: AES_FUNCTION *sys_set_appl_getinfo( AES_FUNCTION *f ); +
  +
Beschreibung: +
  +
Ergebnis: Vorherige Funktion. +
  +
Verfügbar: Ab MagiC 5.20 +
  +
Gruppe: MagiC Funktionen +
  +
Querverweis: Binding +
  + +
+ +

8.16.7.1 Bindings für sys_set_appl_getinfo

+ + + + + + + + + +
C: AES_FUNCTION *sys_set_appl_getinfo( AES_FUNCTION *f ); +
  +
Umsetzung: +
  +
AES_FUNCTION *sys_set_appl_getinfo( AES_FUNCTION *f )
+{
+   int_in[0]  = 3;      /* Subcode 4: define Edit objcet */
+   addr_in[0] = f
+
+   crys_if(0);
+
+   return ( addr_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]0 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]1 # Entry in addr_out
int_inint_in[0]3
addr_inaddr_in[0]f
addr_outaddr_out[0]
+
+ + +
+ +
+ +Home +AESAES +ListboxenListboxen +MenüfunktionenMenüfunktionen + + diff --git a/de/magic_iconify.html b/de/magic_iconify.html new file mode 100644 index 000000000..b9acb8b47 --- /dev/null +++ b/de/magic_iconify.html @@ -0,0 +1,57 @@ + + + + + +Die Anleitung zum TOS: Das Iconify in MagiC + + + + + + + + + +Home +MagiCMagiC +Der Hintergrund-DMA von MagiCDer Hintergrund-DMA von MagiC +Das Laufwerk U: in MagiCDas Laufwerk U: in MagiC + +
+ +

11.10 Das Iconify in MagiC

+ +

MagiC beherrscht (ab Version 3.0) wie MultiTOS das +Ikonifizieren von Fenstern. Folgendes ist dabei zu beachten: +

+ +

Der Algorithmus zum Festlegen der Position des ikonifizierten +Fensters funktioniert anders als bei MultiTOS; MagiC durchsucht die +aktuellen Positionen der bereits ikonifizierten Fenster und setzt das +neue Fenster auf einen freien Platz. Ein Platz ist nur dann +frei, wenn der Schnitt mit der neuen Position leer ist. +

+ + +

Das AES schickt beim Un-/Ikonifizieren explizit eine +Redraw-Nachricht, auch wenn sich die Größe nicht geändert +hat. Ikonifizierte Fenster haben als Elemente nur Mover und Titel. +Ihre Größe beträgt (wie unter MultiTOS) 72x72 Pixel brutto. Diese +Größe ist jedoch keinesfalls als fest anzusehen; sie könnte sich in +späteren Versionen durchaus ändern. Aus diesem Grund sollte die +Größe eines ikonifizierten Fensters der WM_ICONIFY Nachricht entnommen, +oder per wind_get(WF_ICONIFY) ermittelt werden. +

+

Querverweis: wind_get   wind_set   WM_ICONIFY   WM_ALLICONIFY   +WM_UNICONIFY   Shortcuts +

+
+ +Home +MagiCMagiC +Der Hintergrund-DMA von MagiCDer Hintergrund-DMA von MagiC +Das Laufwerk U: in MagiCDas Laufwerk U: in MagiC + + diff --git a/de/magic_magxinf.html b/de/magic_magxinf.html new file mode 100644 index 000000000..fb5980308 --- /dev/null +++ b/de/magic_magxinf.html @@ -0,0 +1,585 @@ + + + + + +Die Anleitung zum TOS: Der Aufbau der MAGX.INF-Datei + + + + + + + + + +Home +MagiCMagiC +Das Laufwerk U: in MagiCDas Laufwerk U: in MagiC +Semaphoren in MagiCSemaphoren in MagiC + +
+ +

11.12 Der Aufbau der MAGX.INF-Datei

+ +

Über die MAGX.INF-Datei können Einstellungen vorgenommen +werden, die das Verhalten von MagiC beeinflussen. Es gilt: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Eintrag Bedeutung +
  + +
#_ACC Von dem in dieser Zeile angegebenen Pfad werden die Accessories +geladen; fehlt diese Zeile, werden sie vom aktuellen Verzeichnis des +Bootlaufwerks geladen, also i.a. vom Wurzelverzeichnis. +
  + +
#_APP Über diese Zeile kann das Verzeichnis zum Starten der +'Auto-Applikationen' angegeben werden. Die hier vorhandenen Programme +werden dann noch vor dem Start der Shell geladen, und stehen quasi +sofort zur Verfügung. Die Programme werden dabei im Grafik-Modus +gestartet. Achtung: Hier sollten nur Programme abgelegt +werden, die sich maßvoll in Bezug auf den Speicher verhalten; lädt +man etwa WORDPLUS auf diese Weise, so kann kein anderes Programm mehr +geladen werden, wenn man den Speicherhunger nicht mit LIMITMEM +begrenzt hat. +
  + +
#_AUT Legt ein Programm fest, daß beim Systemstart automatisch und +anstelle des Desktops bzw. der Default-Shell geladen und (im +Grafikmodus) gestartet werden soll. Erst wenn sich die hier angegebene +Applikation beendet, und keinen Nachfolger per shel_write bestimmt +hat, wird das Desktop bzw. die Default-Shell gestartet; der Eintrag +ist somit besonders praktisch für ein 'Login-Programm' in Netzwerken. +
  + +
#_BKG Mit diesem Eintrag kann man Farbe und Füllmuster des +Default-Desktop- Hintergrunds einstellen. Es wird eine Zahl +<num> angegeben. <num> = 120 (== 0x78) ergibt +beispielsweise Hellgrau. Dabei ist 0x70 das Füllmuster (7=ganz +gefüllt) und 8 die Farbe. Der Code entspricht also dem Wert, der im +AES-Objekt G_BOX das Aussehen eines gefüllten Rechtecks festlegt. +
  +
ab MagiC 5.20 +
  + +
#_BUF Legt die Größe des Shell-Puffers fest; dieser muß variabel +sein, damit alle beliebigen Shells ihren Daten unterbringen können. +Die Zahl darf nicht größer als 65535 sein; es werden immer +mindestens 4192 Bytes reserviert. Die Größe dieses Puffers kann von +einem Programm per shel_get ermittelt werden. Ein zu kleiner Wert +sorgt dafür, daß nicht alle Daten abgespeichert werden können. +
  + +
#_CTR Dieser Eintrag kennzeichnet das Ende der MagiC-Variablen, und +dient als Kennzeichnung dafür, daß die folgenden Daten (des +Kontrollfelds bzw. Desktops) direkt in den Shellpuffer übernommen +werden. +
  + +
#_DEV Legt die Gerätenummer für das VDI fest; die Gerätenummer +wird nicht ausgewertet, wenn das System für einen Auflösungswechsel +gerade neu gestartet wird. Gibt das VDI beim Öffnen der Workstation +einen Fehlercode zurück, so wird es noch einmal mit Gerätenummer 1 +(aktuelle Auflösung) gestartet. Die üblichen Auflösungen von ST/TT +sind: +
  +

+
+ + + + + + + + + + +
2 = ST niedrig,3 = ST mittel,4 = ST hoch
6 = TT mittel,8 = TT hoch,9 = TT niedrig
+
+ +
Weitere sind von den Gerätetreibern abhängig, die in der Datei +ASSIGN.SYS angemeldet wurden. Ab MagiC 4 muß hinter der o.g. Ziffer +eine weitere angegeben werden, die den Falcon-Auflösungsmodus +beschreibt. Diese zweite Zahl muß zwingend angegeben werden, da sonst +die MAGX.INF-Datei nicht gelesen wird. +
  + +
#_DRV Nicht mehr vorhanden ab ab Mag!X 2.0. +
  + +
#_ENV Über diesen Eintrag können Environment-Variablen definiert +werden. Da die Zeichenketten bis zum Zeilenende übernommen werden, +darf kein Kommentar hinter einer #_ENV-Zeile stehen (dies ist +notwendig, um z.B. auch Semikolons oder Leerstellen im +Environment-String zuzulassen). Das vom BIOS übermittelte Environment +wird genau dann vom AES benutzt, und weitergegeben, wenn keine +#_ENV-Zeile angegeben wurde. +
  + +
#_FLG Legt verschiedene Einstellungen von MagiC fest. Der hier +stehende Wert wird als Bitvektor aufgefaßt, und wie folgt +interpretiert: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Bit-0 = Position des MagiC-Logos (gesetzt ==> links) +
ab Mag!X 2.0 +
Bit-1 = Aktivierung des 3D-Looks (gesetzt ==> 3D aus) +
ab MagiC 3.0 +
Bit-2 = Backdrop Button zeigen ? (gesetzt ==> nein) +
ab MagiC 3.0 +
Bit-3 = Fensternamen im 3D-Look? (gesetzt ==> nein) +
ab MagiC 4.0 +
Bit-4 = 3D-Schrift im Fenstertitel? (gesetzt ==> nein) +
ab MagiC 4.0 +
Bit-5 = Echzeit-Scrolling benutzen? (gesetzt ==> nein) +
ab MagiC 4.02 +
Bit-6 = Echzeitvergößern und -verschieben benutzen? (gesetzt ==> +nein) +
ab MagiC 5.10 +
Bit-7 = 3D-Menüs benutzen? (gesetzt ==> ja) +
ab MagiC 6.00 + +
+ +
Hinweis: Fehlt dieser Eintrag, so werden alle Flags als +0 angenommen. Ist Bit-2 gesetzt, so kann ein Backdrop durch einen +kurzen Klick auf das Namensfeld eines aktiven Fensters +ausgelöst werden. +
  + +
#_FSL Hier kann man Einstellungen an der Dateiauswahl "file +selector" vornehmen. Dabei kommt zunächst ein Flag, das zur Zeit +noch ignoriert wird und daher immer Null sein sollte. Es folgt eine +Zeichenkette möglicher Dateitypen, die durch ';' getrennt sind. +Doppelmuster werden voneinander durch ',' getrennt (z.B. +"*.PRG,*.APP" oder "*.JPG,*.JPEG"). +
  +
ab MagiC 5.10 +
  + +
#_HDV Nicht mehr vorhanden ab 2.0. +
  + +
#_INW Hiermit kann man das Aussehen der INFO-Zeile aller Fenster +ändern +
  + + + + + + + + + + + + +
lineh Zeilenhöhe. Eine Höhe von 0 bedeutet: Standardhöhe +
fontID Zeichensatz-ID für die INFO-Zeile. Eine 0 bedeutet: derselbe +Zeichensatz wie für den großen AES-Text +
monoFlag 1 (äquidistant) oder 0 (proportional) +
fontH Zeichensatzhöhe für vst_height() + +
+ +
ab MagiC 6.00 +
  + +
#_MAG Dieser Eintrag ist reserviert, und dient z.Zt. lediglich als +reiner Kommentar. +
  + +
#_OBS Die Höhe einer Ressource-Einheit läßt sich ab MagiC 5.20 +unabhängig vom großen AES-Zeichensatz festlegen. Insbesondere bei +Vektorfonts sollte hier ein festes Raster von 8*16 eingetragen werden, +um Anwenderprogramme nicht zu verwirren. +
Syntax: #_OBS <horiz.Raster> <vertik.Raster> 0 0 +
  +
ab MagiC 5.20 +
  + +
#_SCP Legt das Verzeichnis für das GEM-Klemmbrett (Clipboard) fest; +hier sollte immer ein existierendes Verzeichnis angegeben werden, da +es anderenfalls undefiniert ist. +
  + +
#_SHL Enthält das Verzeichnis der Default-Shell, die ggfs. erst nach +einer Abarbeitung des #_AUT-Eintrags gestartet wird. Die Shell wird +immer im Grafikmodus gestartet; fehlt dieser Eintrag, so wird MAGXDESK +gestartet. +
  + +
#_SLB Hier kann man beliebig viele SharedLibraries laden. Sie werden +beim Start des AES geladen und beim Beenden bzw. Auflösungswechsel +wieder freigegeben. +
Einige davon (WINFRAME) ändern Eigenschaften des AES (quasi +als Systemerweiterung), andere (PDLG, EDITOBJC) können +"vorgehalten" werden, d.h. wenn ein Programm Slbopen() +aufruft, brauchen die Bibliotheken nicht extra nachgeladen zu werden. +Sinnvoll, wenn man genügend Speicher oder ein langsames +Speichermedium hat (das Nachladen einer SLB kostet Zeit). +
  +
ab MagiC 6.00 +
  + +
#_TRM Enthält den Programmnamen und vollständigen Pfad für das +Programm, das die Umlenkung von TOS-Programmen in Fenster durchführt. +Beim Start des ersten TOS-Programms wird das hier angegebene Programm +automatisch vorher in den Speicher geladen, falls es noch nicht +geladen ist. +
  +
ab Mag!X 2.0 +
  + +
#_TSL Steuert die Verteilung der Rechenzeit zwischen Vorder- und +Hintergrundprozeß. Der erste Wert gibt die Länge einer Zeitscheibe +in 5ms-Einheiten an, der zweite die Hintergrundpriorität. Ein Wert +von 32 für letztere bedeutet eine Priorität von 1:32 für +Hintergrundprozesse. Fehlt der Eintrag, so wird kein preemptives +Multitasking sondern kooperatives Multitasking aktiviert. Den hierduch +definierte Wert kann auch über das beiliegende Konfigurations ACC/CPX +eingestellt werden. Tip: Bei Bootproblemen empfiehlt es sich, +dieses Kommando aus der Datei 'magx.inf' zu entfernen, und die +Einstellung erst durch das CPX-Modul vornehmen zu lassen; in diesem +Fall läuft die Bootphase kooperativ ab, wodurch Timing-Probleme +zumeist vermieden werden können. +
  +
ab Mag!X 2.0 +
  + +
#_TXB +
  +
#_TXS Zeichensatz und -höhe lassen sich ab MagiC 5.20 für den +kleinen und den großen AES-Zeichensatz getrennt einstellen. Hier muß +unbedingt angegeben werden, ob der Zeichensatz proportional oder +äquidistant ist. Proportionale Zeichensätze funktionieren ab MagiC +6. Syntax +
für den großen Zeichensatz: #_TXB <fontID> +<monoFlag> <pixelHöhe> +
für den kleinen Zeichensatz: #_TXS <fontID> +<monoFlag> <pixelHöhe> +
+
  +
ab MagiC 5.20 +
  + +
#_TXT Legt den Font und die Texthöhe des AES-Zeichensatzes fest; +das Format lautet: <Höhe großer Font> <Höhe kleiner +Font> <Font-ID> Die Zeichenhöhe wird vom AES per vst_height +gesetzt; Höhen von 0 bedeuten Standardeinstellungen; Font-ID 1 ist +der Systemzeichensatz. +
  +
ab Mag!X 2.0, zusätzlicher Parameter; nicht mehr vorhanden ab +MagiC 6.00 +
  + +
#_WND Legt die Anzahl der Fenster fest, die maximal verwaltet werden +können. Gültige Werte liegen im Bereich zwischen 0 und 64; es +sollten jedoch keine Werte < 16 eingetragen werden. Fehlt dieser +Eintrag, so wird von einem Wert von 16 ausgegangen. +
  +
ab Mag!X 2.0 +
  +
#[aes] Mit der auf diesen Befehl folgenden Zeile beginnen die +Informationen für das AES. Die für das AES relevanten Zeilen +beginnen alle mit #_???. Wird diese Abschnittskennung nicht gefunden, +so wird implizit eine solche vor der ersten Zeile angenommen. +
  +
ab MagiC 5.01 +
  +
#[boot] Dier Werte ab dieser Abschnittkennung werden vor den Start des +AES ausgewertet. +
  +
ab MagiC 6.00 +
  +
#[shelbuf] Mit dieser Abschnittkennung endet der AES-Abschnitt. +
  +
ab MagiC 6.00 +
  +
#[vfat] Mit diesem Eintrag können diejenigen Laufwerke festgelegt +werden, die lange Dateinamen im Windows95-Format unterstützen sollen; +er ist daher als Alternative zum Programm VFATCONF anzusehen. Die auf +diesen Eintrag folgende Zeile muss mit dem Schlüsselwort +drives beginnen, und enthält eine Auflistung der Laufwerke, +die die langen Dateinamen unterstützen sollen. Beispiel: +drives=cdef. Für jedes so angegebene Laufwerk wird zuerst ein Unmount +durchgeführt, so daß es möglich ist, die langen Dateinamen auch auf +dem Bootlaufwerk zu benutzen. +
  +
ab MagiC 5.01 +
  +
aux Die GEMDOS-Standarddateien lassen sich jetzt auch auf +BIOS-Geräte umlenken, die in u:\dev liegen: aux=u:\dev\modem +
  +
ab MagiC 6.20 +
  +
biosdev Festlegung der BIOS-Geräte. Da ohne Änderungen an der +MAGX.INF ab MagiC 6.20 ein paar Dateinamen in u:/dev fehlen werden, +hier einige Beispiele für verschiedene Rechnertypen, die zu ergänzen +sind: +
  +
Atari ST:
+biosdev=3,u:\dev\midi
+biosdev=6,u:\dev\modem1
+
+Atari Mega-STE:
+biosdev=3,u:\dev\midi
+biosdev=6,u:\dev\modem1
+biosdev=7,u:\dev\modem2
+biosdev=8,u:\dev\serial2
+
+Atari TT:
+biosdev=3,u:\dev\midi
+biosdev=6,u:\dev\modem1
+biosdev=7,u:\dev\modem2
+biosdev=8,u:\dev\serial1
+biosdev=9,u:\dev\serial2
+
+Atari Falcon:
+biosdev=3,u:\dev\midi
+biosdev=6,u:\dev\modem1
+biosdev=7,u:\dev\lan
+
+Mac:
+(keine)
+
+
ab MagiC 6.20 +
  +
cookie Legt die Anzahl der Cookies im Cookie-Jar fest. Standardmäßig +werden immer mindestens 20 Cookies angelegt. +
  +
ab MagiC 6.00 +
  +
con Die GEMDOS-Standarddateien lassen sich jetzt auch auf +BIOS-Geräte umlenken, die in u:\dev liegen: con=u:\dev\console +
  +
ab MagiC 6.20 +
  +
image Ausgabe eines Logos, das zentriert dargestellt wird. +
  +
ab MagiC 6.00 +
  +
log Die BIOS-Ausgaben des AUTO-Ordners werden abgefangen in und +die angegebe Datei geschrieben. +
  +
ab MagiC 6.00 +
  +
prn Die GEMDOS-Standarddateien lassen sich jetzt auch auf +BIOS-Geräte umlenken, die in u:\dev liegen: prn=u:\dev\prn +
  +
ab MagiC 6.20 +
  +
titel Vor Ausführen des AUTO Ordners kann der Bildschirm zunächst +gekachelt werden. +
  +
ab MagiC 6.00 +
  + +
+ +

Hinweis: Zeilen die mit einem Semikolon beginnen werden +ignoriert, und können deshalb für Kommentarzwecke benutzt +werden. Ab MagiC 5 wird eine fehlerhafte Zeile beim Auswerten der +'magx.inf'-Datei auf dem Bildschirm dargestellt; da das AES zu +diesem Zeitpunkt aber noch nicht initialisiert ist, kann die Ausgabe +nicht in einer Dialogbox erfolgen. +

+

Querverweis: Beispielhafter Aufbau   MagiC   Style-Guidelines +

+

11.12.1 Beispiel einer MAGX.INF-Datei

+
#_MAG MAG!X V6.20
+#[boot]
+
+cookies=50
+log=c:\log\magic.log
+
+tiles=C:\GEMSYS\GEMDESK\PAT\16\PAT27.IMG
+image=C:\GEMSYS\GEMDESK\PAT\256\MAGIC.IMG
+
+;Atari TT:
+biosdev=3,u:\dev\midi
+biosdev=6,u:\dev\modem1
+biosdev=7,u:\dev\modem2
+biosdev=8,u:\dev\serial1
+biosdev=9,u:\dev\serial2
+
+con=u:\dev\console
+aux=u:\dev\modem
+prn=u:\dev\prn
+
+#[vfat]
+drives=ag
+#[aes]
+
+#_DEV 1 0
+#_FLG 0
+#_WND 40
+
+#_SCP C:\CLIPBRD\
+#_TRM c:\gemsys\gemdesk\vt52.prg
+#_ACC c:\acc\
+#_APP C:\APPS\
+
+#_ENV AVSERVER=JINNEE
+#_ENV SHELL=d:\desktop\gemini\mupfel.ttp
+
+#_SLB 0 WINFRAME.SLB
+#_SLB 0 PDLG.SLB
+
+#_SHL d:\desktop\jinnee\jinnee.app
+
+#[shelbuf]
+#_CTR
+#a000000
+#b000000
+#c7770007000600070055200505552220770557075055507703111103
+#d                                            ;
+#_DSK MAGXDESK V5.02 1
+
+

Querverweis: MagiC   MAGX.INF-Datei +

+
+ +Home +MagiCMagiC +Das Laufwerk U: in MagiCDas Laufwerk U: in MagiC +Semaphoren in MagiCSemaphoren in MagiC + + diff --git a/de/magic_programs.html b/de/magic_programs.html new file mode 100644 index 000000000..d3c95a7f7 --- /dev/null +++ b/de/magic_programs.html @@ -0,0 +1,363 @@ + + + + + +Die Anleitung zum TOS: Die Zusatzprogramme für MagiC + + + + + + + + + +Home +MagiCMagiC +Threads in MagiCThreads in MagiC +Das DFS-Konzept von MagiCDas DFS-Konzept von MagiC + +
+ +

11.19 Die Zusatzprogramme für MagiC

+

Auf der MagiC-Diskette befinden sich eine Reihe von Programmen +für unterschiedliche Zwecke; im einzelnen: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programm Bedeutung +
  +
    +
  + + +
ADDMEM entspricht dem für TOS notwendigen foldr100 und stellt dem +System zusätzlichen Speicher für die interne Verwaltung der Daten +zur Verfügung. Die Installation dieses Programmes ist nicht +zwingend erforderlich, sollte aber erfolgen, wenn die Meldung 'Kein +interner Speicher mehr' erscheint. +
  + +
APPLICAT Dieses Programm ist gewissermaßen eine ausgelagerte Funktion +des MagXDesk, sollte also nur von letzterem aufgerufen werden, und ist +insbesondere nicht geeignet zum direkten Start per Doppelklick auf das +Programm-Icon. Es ermöglicht die Zuordnung von Icons an Dateien sowie +das Anmelden von Applikationen für bestimmte Dateitypen. +
  + + + +
FLP_PAR Mit diesem Programm-Paar kann der Floppy-Parallelbetrieb +konfiguriert werden; es gilt: +
  + + + + + + +
FLP_PAR0 = Parallelbetrieb ausschalten +
FLP_PAR1 = Parallelbetrieb einschalten + +
+ + + +
HARDCOPY Die interne Hardcopyroutine für 9-Nadel-Epsondrucker ist aus +dem BIOS rausgeflogen. Statt der ALT-Help-Routine, Scrdmp und Prtblk +sind nur noch Dummy-Routinen vorhanden. +
  +
Das beiliegende Programm HARDCOPY.PRG installiert die bisher im +BIOS integrierten Hardcopy-Funktionen. Das Programm läßt sich nur +unter MagiC starten. Achtung: Es hat keine Abfrage auf die +MagiC-Version und darf unter MagiC Version 2.0 oder älteren +3.0-Versionen nicht gestartet werden. +
  + + +
MAGXBOOT Das Programm liegt in zwei Versionen vor (magxboot.prg und +magxboot32.prg). Die für ihr System geeignete Version dieses +Programmes wird in den Autoordner kopiert und startet bzw. installiert +MagiC beim Booten; daher sollte es möglichst weit vorne im +Autoordner stehen, damit alle anderen Programme auch mitbekommen, daß +MagiC läuft. Außerdem geht das Booten dann schneller, weil Magxboot +nach einem Kaltstart zusätzlich noch einen Warmstart auslöst. Der +Unterschied zwischen den beiden Startprogrammen ist der, daß +magxboot32 die Datei 'magic.ram' so in den Speicher lädt, daß es per +Outside (einer virtuellen Speicherverwaltung), Magx2rom etc. vor dem +Überschreiben durch amoklaufende Programme geschützt werden kann. +Dies funktioniert jedoch nur auf Rechnern ab 68030-Prozessor und PMMU, +also beispielsweise auf Computern der TT- und Falcon-Serie. +
  + +
MAGXCONF Das CPX-Modul bzw. Accessorie erlaubt die Konfiguration von +MagiC in einigen Punkten. Es bedeuten: +
  + + + + + + + + + + + + + + + + + + + +
Fastload +
Hiermit wird das schnelle Lesen von Disketten eingeschaltet; da es +das Schreiben nicht beeinflußt, kann es eigentlich immer +eingeschaltet werden. + +
TOS-Kompatibilität +
Aufgrund der Tatsache, daß MagiC mehrere Programme gleichzeitig +laufen lassen kann, müssen strengere Sicherheitsvorkehrungen +getroffen werden. Leider gibt es immer noch Programme, die fehlerhafte +Systemaufrufe machen, was unter Umständen zu Problemen im +Multitasking führen kann. Andererseits verlassen sich einige +Programme auf Fehler im TOS und laufen daher nicht mehr korrekt, wenn +sie unter MagiC gestartet werden. Daher können ein paar der +Sicherheitsvorkehrungen abgeschaltet werden, um solche Programme zur +Mitarbeit zu überreden - da dann natürlich die Betriebssicherheit +beeinträchtigt wird, sollten solche Programme schnellstmöglich gegen +neuere Versionen oder Alternativen ausgetauscht werden. + +
Smart Redraw +
(De-)Aktiviert den schnelleren Bildschirmaufbau unter MagiC. +Manche (meist ältere) Programme verlassen sich auf bestimmte +Eigenschaften des TOS beim Fenster-Redraw, die (weil unnötig oder +fehlerhaft) unter MagiC nicht mehr existieren. Um solche Programme +zur Mitarbeit zu überreden, kann der elegantere Smart-Redraw +Mechanismus von MagiC abgeschaltet werden. + + +
Grow- und Shrinkboxen +
Hiermit werden die wachsenden und schrumpfenden Rechtecke +ein/ausgeschaltet, die in manchen Programmen vor dem +Öffnen/Schließen von Fenstern/Dialogen erscheinen. Das Abschalten +bringt auf manchen Rechnern einen kleinen Geschwindigkeitsvorteil, hat +aber sonst keine Auswirkungen. + +
Hintergrund-DMA +
Über diesen Schalter kann der Hintergrundbetrieb der Floppy ein- +bzw. ausgeschaltet werden. + + +
Pull-Down-Menues +
Ist dieser Schalter aktiviert, so fallen die Menues erst bei einem +Mausklick herunter, öffnen sich also nicht mehr unerwünschterweise, +z.B. beim Verschieben eines Fensters. Dieses Verhalten ist z.B. vom +Apple Macintosh bekannt. + +
+ + +
MGCOPY Dieses Programm ist gewissermaßen eine ausgelagerte Funktion +des MagXDesk, sollte also nur von letzterem aufgerufen werden, und ist +insbesondere nicht geeignet zum direkten Start per Doppelklick auf das +Programm-Icon. Das Programm übernimmt das Kopieren und Verschieben +von Dateien und Ordnern; der Aufbau der Kommandozeile bzw. das Format +der verschickten Nachrichten ist nicht dokumentiert und kann sich +daher jederzeit ändern. +
  + + +
MGFORMAT Mit diesem Programm können Disketten formatiert werden, und +zwar ohne das dabei der Rechner blockiert wird. Zum Erstellen +des Bootsektors wird übrigens nicht mehr Protobt benutzt; bei +720k-Disketten wird jetzt ein MSDOS-Format mit 730.112 freien Bytes +erzeugt. +
  + +
MGSEARCH Dieses Programm ist gewissermaßen eine ausgelagerte Funktion +des MagXDesk, sollte also nur von letzterem aufgerufen werden, und ist +insbesondere nicht geeignet zum direkten Start per Doppelklick auf das +Programm-Icon. Das Tool stellt einen Dateisucher dar, wie er etwa im +TOS 2.06 Desktop eingebaut ist. Auch dieses Modul ist nicht oder nur +bedingt geeignet zum direkten Start per Doppelklick auf das Programmicon, +denn die zu durchsuchenden Laufwerke werden im Desktop eingestellt und +beim Direktstart wird nur das aktuelle Laufwerk durchsucht. +
  + +
SHUTDOWN Dies ist dasjenige Programm, welches normalerweise vom Desktop +bei der Auswahl von Ausschalten (oder Betätigen der +Tastenkombination Alternate-Control-Delete) aufgerufen wird, und +dafür sorgt, daß alle noch +
  + +
laufenden Applikationen ihre Daten sichern und terminieren. Die +Datei SHUTDOWN.INF dient als Konfigurationsdatei für dieses +Programm, und kann neben Kommentaren (eingeleitet durch das Zeichen +'#') die folgenden Kommandos enthalten: +
  +
    +
  • ignore <prg>: für unkritische alte Programme. +Diese werden nicht von SHUTDOWN angemahnt, so daß ein +Herunterfahren des Systems trotzdem möglich ist. Vorsicht: +Solche Programme sichern ihre Daten nicht, so daß es im Einzelfall +sinnvoll sein kann, sie von Hand zu beenden (bevor das System +heruntergefahren wird). +
  • +
  • terminate <prg>: Sonderfall für XCONTROL. Auf +diese Art aufgeführte Programme werden 'zwangsterminiert'; für die +Datensicherheit gilt das unter ignore gesagte. +
  • +
  • timeout <zeit>: maximale Reaktionszeit für +moderne Programme. Ein Wert von 0 steht für 'beliebig lange warten'. +
  • +
+ + + + +
TSLICE Mit diesem CPX-Modul kann zum einen das preemptive Multitasking +abgeschaltet werden, wonach das System im kooperativen Multitasking +läuft. Zum anderen kann hier die Zeitscheibenlänge sowie die +Hintergrundpriorität eingestellt werden. Preemptives Multitasking +kann man sich so vorstellen, daß es eine Uhr gibt, deren Ziffernblatt +in lauter gleichgroße Tortenstücke unterteilt wird, die dann an die +laufenden Programme verteilt werden. +
  +
Der Parameter Zeitscheibendauer bestimmt dann die +Größe der Tortenstücke, wählt man sie klein, so finden mehr +Wechsel statt, die natürlich auch Zeit kosten, dafür wird die +Rechenzeit gleichmäßiger verteilt; wählt man sie groß, so wird der +rechnende Prozeß seltener unterbrochen, die einzelnen Programme +müssen aber auch länger warten, bis sie wieder ein Tortenstück +bekommen, was sich im Extremfall z.B. in ruckelndem Scrolling zeigen +kann. +
  +
Der Parameter Hintergrundpriorität legt fest, wieviel +mehr Tortenstücke das Programm mit dem obersten Fenster erhält, denn +dieses wird offenbar aktuell benutzt und soll daher schneller +reagieren, als die im Hintergrund laufenden Programme. +
  +
In der Praxis hat sich eine Zeitscheibendauer von 5-10ms +(Millisekunden) und eine Hintergrundpriorität von 1:20 bis 1:32 +bewährt. Diese Werte können übrigens per _TSL auch direkt in der +MAGX.INF-Datei eingestellt werden. +
  + + +
VFATCONF Mit diesem Programm kann festgelegt werden, auf welchen +Festplattenpartitionen lange Dateinamen im VFAT-Format von Windows95 +unterstützt werden sollen. Das Programm läuft ab der MagiC-Version +4.02 vom 16.02.96. Weitere Einzelheiten zu VFATCONF können der +Originaldokumentation von MagiC entnommen werden. +
  + + +
WBDAEMON Der Writeback-Daemon ist ein Programm, daß die Schreibzugriffe +aller laufenden Applikationen verzögert und damit das System spürbar +beschleunigt. +
  +
Der Betrieb mit dem Writeback-Daemon ist jetzt prinzipiell +sicher, weil er nicht mehr eingefroren werden kann. Bisher führte der +Start einer Single-Tasking-Applikation immer dazu, daß der WBDAEMON +eingefroren wurde und bis zum Wiederauftauen der Cache nicht +zurückgeschrieben wurde. Im Gegensatz zum Atari, wo dieses Programm +nur optional ist, empfiehlt sich der Einsatz auf einem +Macintosh ausdrücklich: auf dieser Plattform steigert es +nämlich Geschwindigkeit und Datensicherheit des Dateisystems. +
  + +
WDIALOG Bei diesem Programm handelt es sich um eine Systemerweiterung, +die MagiC kompatible AES-Erweiterungen (z.B. Fenster- und +Druckdialoge, Listboxen, Zeichensatzauswahl) auch unter älteren +Betriebssystemen zur Verfügung stellt. Die Installation erfolgt durch +Kopieren des Programms in den AUTO-Ordner, und anschließenden +Neustart des Systems. Nach gängigen Erfahrungen empfiehlt sich eine +Reihenfolge im AUTO-Ordner, bei der WDIALOG vor NVDI liegt. +
  + + +
XMEN_MGR Das Programm ist für die Kompatibilität zu den erweiterten +Menü-Funktionen von MultiTOS entstanden und muß darum nur bei Bedarf +eingesetzt werden. Es installiert die folgenden Funktionen: +
  + + +
Die Funktion appl_getinfo liefert bei den entsprechenden +Unterfunktionen den Wert TRUE, wenn dieses Programm installiert ist. +
  + +
+ +

Querverweis: MagiC   GEM   Style-Guidelines +

+
+ +Home +MagiCMagiC +Threads in MagiCThreads in MagiC +Das DFS-Konzept von MagiCDas DFS-Konzept von MagiC + + diff --git a/de/magic_scroll.html b/de/magic_scroll.html new file mode 100644 index 000000000..77203d322 --- /dev/null +++ b/de/magic_scroll.html @@ -0,0 +1,216 @@ + + + + + +Die Anleitung zum TOS: scrollende Eingabefelder + + + + + + + + + +Home +MagiCMagiC +Eingabefelder in MagiCEingabefelder in MagiC +Spezielle Fehlermeldungen von MagiCSpezielle Fehlermeldungen von MagiC + +
+ +

11.7 scrollende Eingabefelder

+
/*******************************************************************
+*
+* Dieses Beispielprogramm demonstriert den Gebrauch scrollender
+* Eingabefelder in MagiC 3.
+*
+*******************************************************************/
+
+#include <aes.h>
+#include <tos.h>
+#include <string.h>
+#include <magx.h>
+#include "magxlib.h"
+#include "edscroll.h"
+
+#define TLEN  30
+
+int  do_dialog    (OBJECT *dialog);
+
+void main()
+{
+  OBJECT *adr_dialog;
+  ULONG crdate;
+  int is_scroll;
+
+  XTED xted;
+  char tmplt[TLEN+1],txt[TLEN+1];
+
+
+  /* Feststellen, ob das System Scrolledit kann */
+  /* ------------------------------------------ */
+
+  is_scroll = ((0 < get_MagiC_ver(&crdate)) &&
+    (crdate >= 0x19950829L));
+
+     /* Applikation beim AES anmelden */
+     /* ----------------------------- */
+
+     if   (appl_init() < 0)
+          Pterm(1);
+
+     /* Resourcedatei laden */
+     /* ------------------- */
+     if   (!rsrc_load("edscroll.rsc"))
+     {
+          form_alert(1, "[3][Kann \"EDSCROLL.RSC\"|nicht finden][Abbruch]");
+          goto err;
+     }
+
+     rsrc_gaddr(0, EDIT, &adr_dialog);
+
+  /* Scroll-TEDINFO initialisieren */
+  /* ----------------------------- */
+
+  init_scrlted(adr_dialog+EDITTXT, is_scroll, &xted,
+        txt, tmplt, TLEN);
+
+  strcpy(txt, "Beispiel");
+
+  /* Dialog */
+  /* ------ */
+
+     wind_update(BEG_MCTRL);
+     graf_mouse(ARROW, 0L);
+     do_dialog(adr_dialog);
+     wind_update(END_MCTRL);
+     rsrc_free();
+
+  err:
+     appl_exit();
+     Pterm0();
+}
+
+
+/****************************************************************
+*
+* do_dialog
+*
+****************************************************************/
+
+int do_dialog(OBJECT *dialog)
+{
+     int cx, cy, cw, ch;
+     int exitbutton;
+
+     form_center(dialog, &cx, &cy, &cw, &ch);
+     form_dial(FMD_START, 0,0,0,0, cx, cy, cw, ch);
+     objc_draw(dialog, ROOT, MAX_DEPTH, cx, cy, cw, ch);
+     exitbutton = 0x7f & form_do(dialog, 0);
+     form_dial(FMD_FINISH, 0,0,0,0,cx, cy, cw, ch);
+     return(exitbutton);
+}
+
+
+/*******************************************************************
+*
+* MagiC-Version ermitteln.
+* ========================
+*
+* Falls <crdate> != NULL ist, wird das Erstelldatum in der
+* Form jjjjmmdd geliefert. Durch "<" und ">" kann dann
+* direkt ermittelt werden, ob eine bestimmte Funktion
+* bei der vorliegenden MagiC- Version verfügbar ist.
+*
+* Rückgabe:  0     kein MagiC installiert
+*           -1    bin noch im AUTO-Ordner
+*       0x0a0b    Version a.b
+*
+*******************************************************************/
+
+WORD get_MagiC_ver(ULONG *crdate)
+{
+  ULONG *cookie;
+  AESVARS *av;
+
+  cookie = get_cookie('MagX');
+  if  (!cookie)
+    return(0);
+  else
+  {
+    av = ((MAGX_COOKIE *) (*cookie))->aesvars;
+    if  (!av)
+      return(-1);
+    else if (crdate)
+    {
+      *crdate = av->date << 16L;        /* jjjj0000 */
+      *crdate |= av->date >> 24L;       /* jjjj00tt */
+      *crdate |= (av->date >> 8L) & 0xff00L;    /* jjjjmmtt */
+      return(av->version);
+    }
+  }
+}
+
+
+/****************************************************************
+*
+* Macht ein F(BOX)TEXT-Objekt scrollbar, wenn MagiC läuft.
+*
+* Wenn <is_scroll> FALSE ist, wird nur das Textfeld auf eine
+* Benutzerzeichenkette umgesetzt.
+*
+* Im RCS sollte das Textfeld leer gelassen werden, die Schablone
+* und die Valid-Zeichenkette müssen jedoch eingegeben werden,
+* weil sonst das RCS streikt.
+* Für scrollende Felder muß eine neue Schablone angelegt werden,
+* die in der .RSC-Datei angemeldete kann nicht verwendet werden,
+* weil sie zu kurz ist. Die hier angelegte Schablone besteht
+* nur aus '_'-Zeichen, weil dies 99.9% aller Anwendungsfälle
+* für scrollende !{"Objekte" ignore} abdeckt. Die Länge der
+* Valid-Zeichenkette ist egal, d.h. muß mindestens 1 sein, weil
+* das AES das letzte Zeichen der Valid-Zeichenkette
+* automatisch vervielfacht, bis die Länge des Textfeld erreicht
+* ist.
+*
+* Die maximale Länge für die Eingabezeichenkette ist in jedem
+* Fall (TEDINFO.te_txtlen - 1).
+*
+****************************************************************/
+
+void init_scrlted(OBJECT *o, WORD is_scroll, XTED *xted,
+        char *txt, char *tmplt, WORD len)
+{
+  TEDINFO *t;
+
+  t = o->ob_spec.tedinfo;
+  t->te_just = TE_LEFT;   /* wichtig! */
+  t->te_ptext = txt;
+  if  (is_scroll)
+  {
+    memset(tmplt, '_', len);  /* neue Schablone */
+    tmplt[len] = '\0';
+    xted->xte_ptmplt = tmplt;
+    xted->xte_pvalid = t->te_pvalid;
+    xted->xte_vislen = t->te_tmplen - 1;
+    xted->xte_scroll = 0;
+
+    t->te_tmplen = len+1;
+    t->te_ptmplt = NULL;
+    t->te_pvalid = (void *) xted;
+  }
+  t->te_txtlen = t->te_tmplen;
+}
+
+

Querverweis: AES   Eingabefelder in MagiC   GEM   TEDINFO +

+
+ +Home +MagiCMagiC +Eingabefelder in MagiCEingabefelder in MagiC +Spezielle Fehlermeldungen von MagiCSpezielle Fehlermeldungen von MagiC + + diff --git a/de/magic_semaphore.html b/de/magic_semaphore.html new file mode 100644 index 000000000..52c70fcaf --- /dev/null +++ b/de/magic_semaphore.html @@ -0,0 +1,70 @@ + + + + + +Die Anleitung zum TOS: Semaphoren in MagiC + + + + + + + + + +Home +MagiCMagiC +Der Aufbau der MAGX.INF-DateiDer Aufbau der MAGX.INF-Datei +Allgemeines zum ShutdownAllgemeines zum Shutdown + +
+ +

11.13 Semaphoren in MagiC

+

Unter MagiC werden Semaphoren bei der Programmterminierung +(genauer: bei der Applikations-Terminierung) freigegeben. Im Gegensatz +zu MiNT gilt dies auch für die per Psemaphore belegten Semaphoren. +

+

MagiC unterstützt bei Psemaphore z.Zt. nur die Modi 2 und 3, und +kennt die folgenden System-Semaphoren: +

+ + + + + + + + + + + + + + + +
Semaphore Bedeutung +
    + +
_DMA ACSI und FDC +
Beim Erhalt dieser Semaphore darf nicht vergessen werden, die +Systemvariable flock zu setzen, und diese nach dem Freigeben der +Semaphore ebenfalls wieder freizugeben. + +
_NCR SCSI des Atari-TT + +
_SCR AES-Bildschirm (von wind_update benutzt) + +
+ +

Querverweis: GEMDOS   Prozessfunktionen   Signale +

+
+ +Home +MagiCMagiC +Der Aufbau der MAGX.INF-DateiDer Aufbau der MAGX.INF-Datei +Allgemeines zum ShutdownAllgemeines zum Shutdown + + diff --git a/de/magic_sharelib.html b/de/magic_sharelib.html new file mode 100644 index 000000000..603487f97 --- /dev/null +++ b/de/magic_sharelib.html @@ -0,0 +1,702 @@ + + + + + +Die Anleitung zum TOS: Shared Libraries + + + + + + + + + +Home +MagiCMagiC +VFAT-XFS in MagiCVFAT-XFS in MagiC +N.AESN.AES + +
+ +

11.23 Shared Libraries

+

Gemeinsame Bibliotheken (Shared Libraries) in MagiC ab +V6.00 +

+ + +

Hinweis: Shared Libraries wurden bereits mit MagiC +Version 5.20 eingeführt. Aufgrund eines Designfehlers mußte das +Format der Bibliothek ab Version 6.00 ändern. Da unterschiedliche +"magische" Kennungen verwendet werden, kann es aber nicht zu +Abstürzen kommen, sondern die Bibliotheken für 6.00 werden lediglich +von der alten Version 5.20 nicht erkannt und umgekehrt. Aufgrund +mehrerer Unzulänglichkeiten in der Version 5.20 sollten ohnehin nur +Bibliotheken für 6.00 erstellt werden. +

+

11.23.1 Was sind Shared Libraries?

+

Meist werden Bibliotheken mit häufig genutzten Prozeduren in +einem eigenen Objektmodul zusammengefaßt und mit mehreren Programmen +zusammengelinkt. Dabei erhält jedes Programm eine Kopie der +Bibliothek, die fest in die PRG-Datei integriert wird. Shared Libraries dagegen +existieren als eigene Dateien nur ein einziges Mal auf der Festplatte +und werden von mehreren Programmen, auch gleichzeitig, verwendet. +

+

11.23.2 Wozu Shared Libraries?

+

Gegenüber fest eingelinkten Bibliotheken ergeben sich eine +Reihe von Vorteilen: +

+
    +
  • Speicherplatzersparnis auf der Festplatte. Je mehr Programme +dieselben Bibliotheken verwenden, desto größer ist die Ersparnis. +
  • +
  • Speicherplatzersparnis im Hauptspeicher. Dies kommt erst dann +zum Tragen, wenn mehrere Programme gleichzeitig geladen sind, die +dieselbe Bibliothek verwenden. +
  • +
  • Systematische Wartung für den Programmierer: Beim Update +genügt es mitunter, nur eine neue Bibliothek nachzureichen. Von +diesem Update profitieren dann alle Programme, die die Bibliothek +verwenden. Außerdem sind weniger Quelltexte zu warten. Wenn eine +Bibliothek verändert wurde, müssen nicht alle Programme, die sie +verwenden, neu übersetzt werden. +
  • +
+ +

Natürlich gibt es auch Nachteile: +

+
    +
  • Das Programmladen dauert etwas länger. Jedoch nur, wenn die +Bibliothek noch nicht geladen ist. +
  • +
  • Es können sich Wechselwirkungen von Updates verschiedener +Programme ergeben. Beim Austausch einer Bibliothek können mehrere +Programme betroffen sein (positiv oder negativ). +
  • +
  • Bei der Installation eines Programms müssen Dateien in den +XTENSION- bzw. den ersten in der Suchliste SLBPATH angegebenen Ordner +(ab MagiC 6) kopiert werden, es ist also nicht mehr ohne weiteres +nachvollziehbar, zu welchem Programm welche Shared Library gehört. +Abhilfe z.B.: +
      +
    • Nur Aliase in den XTENSION-Ordner bzw. den ersten durch die +Environment-Variable SLBPATH (s.u.) angegebenen Ordner legen. +
    • +
    • Shared Libraries in einem Unterverzeichnis des Programms belassen und +lediglich die Environment-Variable SLBPATH in MAGX.INF um dieses +Verzeichnis erweitern (ab MagiC 6 möglich). Falls noch keine +Variable SLBPATH existiert, muß der XTENSION-Pfad dort zunächst +eingetragen werden. +
    • +
    + +
  • +
+ +

11.23.3 Wie verwende ich eine Shared Libraries?

+

Zunächst benötigt man zum Aufruf der beiden neuen +DOS-Funktionen das Objektmodul SLB_BIND, dazu muß man die Datei SLB.H +einbinden. +

+

Für jede benutzte Bibliothek deklariert man einen Deskriptor +vom Typ SHARED_LIB und einen Funktionszeiger vom Typ SLB_EXEC. +

+

Jede Bibliothek wird mit Slbopen() geöffnet (das Öffnen und +Schließen sollte nur im User-Modus erfolgen), dabei werden folgende +Parameter übergeben: +

+ + + + + + + + + + + + + + + +
char *name Der Name der Bibliothek, in Großschrift, inkl. Extension +(".SLB"). Der Bibliotheksname ist gleichzeitig Dateiname. +
char *path Wenn dieser Parameter nicht NULL ist, wird hier zuerst nach der +Bibliothek gesucht (der Pfad muß in MagiC 5.20 mit '\' abgeschlossen +sein; dies ist in MagiC 6 nicht mehr nötig). Der Pfad sollte absolut +sein, damit die Shared Library weiß, wo sie liegt. Wenn der Parameter +NULL ist oder die Bibliothek im angegebenen Pfad nicht gefunden wurde, +wird im XTENSION-Ordner gesucht. +
Ab MagiC 6 wird die Environment-Variable SLBPATH ausgewertet. Sie +enthält wie PATH eine Liste der Suchpfade, jeweils durch ';' +getrennt. Ist die Variable definiert, wird nicht mehr extra im +XTENSION-Ordner gesucht. +
LONG min_ver Minimal notwendige Versionsnummer der Bibliothek. +
Wenn ein Programm etwa die Version 3 benötigt, die Bibliothek +aber erst Version 2 ist, wird ERANGE zurückgegeben. Die tatsächliche +Versionsnummer der Bibliothek wird als Rückgabewert geliefert. +
SHARED_LIB *sl Zeiger auf den Deskriptor. Wenn die Bibliothek geöffnet wurde, +wird hier der Deskriptor eingetragen. +
SLB_EXEC *fn Zeiger auf den Funktionszeiger. Wenn die Bibliothek geöffnet +wurde, wird hier der Funktionszeiger eingetragen. + +
+ +

Rückgabewert kann sein: +

+
  >= 0        Alles OK, Versionsnummer der Bibliothek.
+  ERANGE      Versionsnummer zu niedrig
+  EACCDN      Bibliothek schon von diesem Prozeß geöffnet
+  EFILNF      Bibliothek nicht gefunden
+  ENSMEM      zuwenig Speicher
+  ...         andere Fehlercodes.
+
+

Die Bibliothek kann nun verwendet und schließlich mit +Slbclose() wieder geschlossen werden. Dies ist nicht unbedingt +notwendig, da alle geöffneten Bibliotheken bei Programmende +automatisch geschlossen werden, aber es ist guter Programmierstil. Auf +keinen Fall darf eine Bibliothek mehrmals geschlossen werden, der +Kernel kann solche Fehler nicht erkennen. +

+

Einige Bibliotheken, wie z.B. EDITOBJC.SLB, installieren neue +Systemaufrufe, in diesem Fall die AES-Aufrufe 210..217. Für diese +Bibliotheken wird der Funktionszeiger nicht benötigt. Ansonsten +werden alle Funktionen der Bibliothek über den Funktionszeiger +aufgerufen. Die Bibliotheks-Aufruf-Funktion ist folgendermaßen +deklariert: +

+
 typedef LONG cdecl (*SLB_EXEC)( SHARED_LIB sl, LONG fn,
+        WORD nargs, ... );
+
+

Da leider PureC hier einen Fehler hat, mußte ich die Funktion +notgedrungen deklarieren als "typedef LONG (*SLB_EXEC)( void , +... );" Damit sind leider alle Typüberprüfungen verbaut. Also +Vorsicht! +

+

Der Aufruf erwartet folgende Parameter: +

+
     Den Deskriptor der Bibliothek
+     Ein Langwort (!) für die Funktionsnummer
+     Ein WORD, das die Anzahl der Argumente in WORDs
+               (d.h. alle "..."-Argumente) angibt
+     weitere Argumente je nach Funktion
+
+

Am besten geschieht der Aufruf über ein Makro, das in einer +Headerdatei für die Bibliothek definiert werden sollte, z.B.: +

+

JPEG.H: +

+

#define SLBJPEG_WANDELN (a,b) (*slbjpeg_exec)(slbjpeg, 7L, 4, a, +b) +

+

Hierbei werden <slbjpeg_exec> und <slbjpeg> bei +Slbopen() ermittelt, 7L ist die Funktionsnummer für den Aufruf +WANDELN, 4 bezeichnet die Länge der folgenden Argumente (a und b sind +zwei Zeiger => 2*4 Bytes => 4 WORDs), a und b sind die Argumente +der Funktion WANDELN. +

+

Wenn die Funktion nicht vorhanden ist (die Bibliothek enthält +für diese Funktion einen Nullzeiger, oder die Funktionsnummer ist +höher als die Anzahl der tatsächlich vorhandenen Funktionen), +erhält man EINVFN als Funktionsergebnis (tatsächlich klappt das erst +ab MagiC 6 korrekt). +

+

11.23.4 Wie schreibe ich eine Shared Libraries?

+

Auch dazu gibt es eine Beispielbibliothek SLB_DEMO, die alle +notwendigen Elemente und Beschreibungen enthält. Am besten, man +kopiert SLB_DEMO.C, LIBHEAD.S und SLB_DEMO.PRJ und modifiziert die +Dateien entsprechend. Es muß dringend darauf geachtet werden, daß +Bit 3 der Flags im Programmheader einer Bibliothek gesetzt ist, dazu +kann man PH_BIT3.TTP verwenden. +

+

LIBHEAD ist der Header für eine Shared Library. Der Zeiger auf +die Funktionsnamen kann entfallen, ansonsten zeigt er auf eine Tabelle +von Zeigern mit den Namen der Bibliotheksfunktionen. Die Anzahl der +Funktionen muß korrekt festgelegt werden, ebenso die Tabelle der +Funktionen und der Bibliotheksname, welcher mit dem Dateinamen +identisch ist. Beim Hinzufügen von Funktionen muß darauf geachtet +werden, die Funktionsanzahl entsprechend anzupassen und ggf. die +Versionsnummer zu erhöhen. +

+

Bei öffentlich zugänglichen Shared Libraries ist +sicherzustellen, daß dokumentierte Funktionsaufrufe nie geändert +werden! Entweder sind neue Parameter zu ergänzen (die aufgerufene +Funktion kann die Anzahl der tatsächlich übergebenen Parameter +abfragen), oder es ist eine neue Funktionsnummer zu verwenden. +

+

Für die Funktionszeiger sind auch Nullzeiger zulässig, sie +geben beim Aufruf der Funktion ein EINVFN. +

+

Folgende Funktionen zur (De-) Initialisierung sind +obligatorisch: +

+

slb_init()/slb_exit() +

+

Werden beim Laden bzw. Entfernen der Bibliothek aufgerufen, und +zwar im Supervisor-Modus und im Kontext (Prozeß) der Bibliothek. +Typischerweise lädt slb_init() eine Konfigurationsdatei, alloziert +globalen Speicher für die Bibliothek und öffnet eine virtuelle VDI- +Workstation. slb_exit() schreibt die Konfigurationsdatei zurück, gibt +den Speicher wieder frei und schließt die VDI-Workstation. +

+

Falls slb_init() eine Datei öffnet, darf auf das Handle erst +wieder bei slb_exit() zugegriffen werden, da alle anderen Aufrufe der +Bibliothek im Kontext des Aufrufers ablaufen. +

+

Ab MagiC 6 erhält die Bibliothek in der +Kommandozeilen-Struktur der Basepage eine normale 'C'-Zeichenkette +übergeben, welche den vollständigen Pfad der SharedLibrary enthält. +Falls die SharedLibrary Konfigurations- oder RSC-Dateien laden muß, +kann der Pfad extrahiert und der Dateiname der Konfigurationsdatei +entsprechend zusammengebastelt werden. +

+

Falls slb_init() z.B. aufgrund eines Busfehlers beendet wird, +erhält der Aufrufer EXCPT als Ergebnis des Slbopen()-Aufrufs. Um die +unplanmäßige Terminierung der Bibliothek abzufangen, installiert der +Kernel vor Aufruf von slb_init()/exit() einen etv_term-Handler für +die Bibliothek. +

+

slb_open()/slb_close() +

+

Werden beim Öffnen bzw. Schließen der Bibliothek aufgerufen. +Wenn die Bibliothek nur einmal geöffnet wird, ist die Reihenfolge: +

+
  slb_init()
+  slb_open()
+  slb_close()
+  slb_exit()
+
+

Im Gegensatz zu slb_init()/slb_exit() laufen +slb_open()/slb_close() im Kontext des Aufrufers und im Usermodus mit +dem Userstack des Aufrufers ab, auch dann, wenn der Slbopen()-Aufruf +im Supervisor-Modus erfolgt ist. +

+

Die Bibliothek kann auch bei slb_open Speicher allozieren, +dieser gehört jedoch dem Aufrufer und sollte bei slb_close() wieder +freigegeben werden. Um die Zuordnung von alloziertem Speicher zum +Aufrufer zu ermöglichen, wird der Bibliothek bei slb_open(), +slb_close() und bei jedem Funktionsaufruf der aktuelle Prozeß- +Deskriptor mit übergeben. +

+

Achtung: Die Übergabe des PD an slb_open() und +slb_close() geht aufgrund eines Bugs in 5.20 erst ab MagiC 6. +

+

Der Kernel stellt sicher, daß die open/close Aufrufe korrekt +geschachtelt sind, d.h. ein Prozeß kann eine Bibliothek nicht +mehrmals öffnen. +

+

Funktionen +

+

Funktionen sind nicht obligatorisch, so kann eine Bibliothek +auch Systemaufrufe über AES oder DOS einhängen, die nach Beendigung +wieder entfernt werden, i.a. werden jedoch Funktionen zur Verfügung +gestellt. +

+

Eine Funktion wird mit folgenden Parametern auf dem Stack +aufgerufen: +

+ + + + + + + + + + + + +
PD *pd Prozeß-Deskriptor des Aufrufers, korrespondiert mit dem +zugehörigen slb_open()/close() +
LONG fn Funktionsnummer. Praktisch, wenn mehrere Funktionen +zusammengelegt sind (identische Funktionszeiger in LIBHEAD) +
WORD nargs Anzahl der folgenden Argumente, in WORDs. Hat eine Funktion +eine variable Anzahl von Parametern, kann die tatsächliche Anzahl +ermittelt werden. Sehr praktisch bei Erweiterungen, ohne neue +Funktionen einzubauen. Beispiel: Erwartet eine Funktion immer einen +Zeiger, optional aber noch ein WORD, erhält sie entweder 2 oder 3 als +<nargs>. +
... die übrigen Parameter + +
+ +

Die Funktionen werden im Kontext des Aufrufers und mit dessen +Stack ausgeführt. Da dieser Aufruf i.a. im User-Modus erfolgt, wird +das Multitasking auch bei längeren Aktionen nicht unterbrochen. Das +Funktions-Ergebnis kann je nach Funktion LONG, WORD, void usw. sein. +

+

Eine Funktion darf die Register d0-d2 und a0-a1 ändern, alle +anderen Register müssen ggf. gerettet werden. Insbesondere darf +Register a2 nicht verändert werden, damit Routinen von PureC aus +aufgerufen werden können. +

+

11.23.5 SLB_DEMO.C

+
/*
+*
+* Rumpf einer "shared library"
+*
+* Andreas Kromke
+* 22.10.97
+*
+*/
+
+#include <portab.h>
+#include <tos.h>
+#include <tosdefs.h>
+#pragma warn -par
+
+typedef void *PD;
+
+char *mem;      /* hier globalen Speicher */
+
+/*****************************************************************
+*
+* Die init-Funktion wird einmal beim Laden der Bibliothek
+* aufgerufen. Dabei läuft sie im Prozeß der Bibliothek,
+* d.h. es können Dateien geöffnet und Speicher angefordert
+* werden, die jeweils der Bibliothek gehören.
+* Achtung: Auf die dabei geöffneten Dateien darf durch die
+*          Bibliotheksfunktionen _NICHT_ zugegriffen werden,
+*          weil diese im Kontext des Aufrufers laufen.
+*
+* Achtung: Die init-Funktion läuft im Supervisormode, da eine
+*          Bibliothek i.a. keinen Userstack hat.
+*          Daher darf sie nicht zuviel Stack benutzen (max. 1kB)
+*          und nicht zu lange laufen (weil das Multitasking
+*          im Supervisormode blockiert ist).
+*          Ggf. kann aber ein Userstack alloziert und in den
+*          Usermode gewechselt werden.
+*
+*****************************************************************/
+
+extern LONG cdecl slb_init( void )
+{
+  mem = Malloc(4096L);
+  if  (mem)
+    return(E_OK);
+  else  return(ENSMEM);
+}
+
+/*****************************************************************
+*
+* Die exit-Funktion wird einmal beim Freigeben der Bibliothek
+* aufgerufen. Dabei läuft sie im Prozeß der Bibliothek,
+* d.h. es können Dateien geöffnet und Speicher angefordert
+* werden, die jeweils der Bibliothek gehören.
+*
+* Achtung: Die exit-Funktion läuft im Supervisormode, da eine
+*          Bibliothek i.a. keinen Userstack hat.
+*          Daher darf sie nicht zuviel Stack benutzen (max. 1kB)
+*          und nicht zu lange laufen (weil das Multitasking
+*          im Supervisormode blockiert ist).
+*          Ggf. kann aber ein Userstack alloziert und in den
+*          Usermode gewechselt werden.
+*
+*****************************************************************/
+
+extern void cdecl slb_exit( void )
+{
+  Mfree(mem);
+}
+
+
+/*****************************************************************
+*
+* Die open-Funktion wird einmal beim Öffnen der Bibliothek
+* durch einen Anwenderprozeß aufgerufen. Dabei läuft sie im
+* Prozeß des Aufrufers, d.h. es können Dateien geöffnet und
+* Speicher angefordert werden, die jeweils dem Aufrufer gehören.
+*
+* Durch den Kernel ist sichergestellt, daß jeder Prozeß die
+* Bibliothek nicht mehrmals öffnet und daß die Bibliothek immer
+* ordnungsgemäß geschlossen wird.
+*
+* Achtung: Die open-Funktion läuft im Usermode, und zwar mit dem
+*          Userstack des Aufrufers. Das heißt, daß der Aufrufer,
+*          auch wenn er im Supervisormode läuft, immer einen
+*          ausreichend großen usp zur Verfügung stellen muß.
+*
+*****************************************************************/
+
+extern LONG cdecl slb_open( PD *pd )
+{
+  return(E_OK);
+}
+
+
+/*****************************************************************
+*
+* Die close-Funktion wird einmal beim Schließen der Bibliothek
+* durch einen Anwenderprozeß aufgerufen. Dabei läuft sie im
+* Prozeß des Aufrufers, d.h. es können Dateien geöffnet bzw.
+* geschlossen und Speicher angefordert und freigegeben  werden,
+* die jeweils dem Aufrufer gehören.
+*
+* Achtung: Die close-Funktion läuft im Usermode, und zwar mit dem
+*          Userstack des Aufrufers. Das heißt, daß der Aufrufer,
+*          auch wenn er im Supervisormode läuft, immer einen
+*          ausreichend großen usp zur Verfügung stellen muß.
+*
+*****************************************************************/
+
+extern void cdecl slb_close( PD *pd )
+{
+}
+
+
+/*****************************************************************
+*
+* Eine Beispiel-Bibliotheksfunktion.
+* Sie wird im Kontext des Aufrufers ausgeführt, und zwar mit dem
+* Stack des Aufrufers (je nach Status usp oder ssp).
+*
+* Es wird dringend empfohlen, die Funktionen einer SLB nur im
+* Usermode aufzurufen, um die Kompatibilität zu späteren
+* Implementationen zu wahren.
+*
+*****************************************************************/
+
+extern LONG cdecl slb_fn0( PD *pd, LONG fn, WORD nargs, char *s )
+{
+  Cconws(s);
+  Cconws("\r\nTaste: ");
+  Cconin();
+  return(E_OK);
+}
+
+

11.23.6 LIBHEAD.S

+
/*
+*
+* Header für eine "shared library"
+* Wird statt des Start-Codes von PureC verwendet
+*
+* Andreas Kromke
+* 10.2.98
+*
+*/
+
+  XREF slb_init
+  XREF slb_exit
+  XREF slb_open
+  XREF slb_close
+  XREF slb_fn0
+
+  TEXT
+
+DC.L    $70004afc         ; magischer Wert (5.20: $42674e41)
+DC.L    name              ; Zeiger auf Namen der Bibliothek
+DC.L    1                 ; Versionsnummer
+DC.L    0                 ; Flags, z.Zt. 0L
+DC.L    slb_init          ; wird nach dem Laden aufgerufen
+DC.L    slb_exit          ; wird vor dem Entfernen aufgerufen
+DC.L    slb_open          ; wird beim Öffnen aufgerufen
+DC.L    slb_close         ; wird beim Schließen aufgerufen
+DC.L    0                 ; Zeiger auf Prozedurnamen (optional)
+DC.L    0,0,0,0,0,0,0,0   ; unbenutzt, immer NULL
+DC.L    1                 ; Anzahl der Funktionen (5.20: .W)
+DC.L    slb_fn0           ; Funktion #0
+
+name:   DC.B  'DEMO.SLB',0
+
+END
+
+

11.23.7 SLB_DEMO.PRJ

+
slb_demo.slb
+.L[-S=256]     ; minimaler Stack
+
+=
+
+libhead.s      ; startup code for SLBs
+slb_demo.c (slb.h)
+
+pctoslib.lib
+pcstdlib.lib
+
+

11.23.8 PH_BIT3.TTP

+
/*
+*
+* Programm zur Manipulation des Bit 3 im Programmheader.
+* MagiC benötigt dieses Bit, das i.a. Null ist, dafür, um
+* dem Programm nur den minimal notwendigen Speicher zuzuweisen,
+* d.h. nur Basepage+Text+Daten+Symbol+Bss.
+* Wird insbesondere für alle SharedLibraries benötigt.
+*
+* Andreas Kromke
+* 25.10.97
+*
+*/
+
+#include <portab.h>
+#include <tos.h>
+#include <tosdefs.h>
+#include <stdio.h>
+
+/* ProgramHeader, Programmkopf für ausführbare Dateien                  */
+/************************************************************************/
+
+typedef struct {
+ WORD ph_branch;         /* 0x00: muß 0x601a sein            */
+ LONG ph_tlen;           /* 0x02: Länge  des TEXT - Segments */
+ LONG ph_dlen;           /* 0x06: Länge  des DATA - Segments */
+ LONG ph_blen;           /* 0x0a: Länge  des BSS  - Segments */
+ LONG ph_slen;           /* 0x0e: Länge  der Symboltabelle   */
+ LONG ph_res1;           /* 0x12: von PureC benötigt         */
+ LONG ph_prgflags;       /* 0x16:  Bit 0: Heap nicht löschen */
+                         /*        Bit 1: Laden ins FastRAM  */
+                         /*        Bit 2: Malloc aus FastRAM */
+                         /*        Bit 3: nur t+d+b+s (MagiC 5.20) */
+                         /*        Bit 4,5,6,7: Speicherschutz (MiNT) */
+                         /*        Bit 8: unbenutzt          */
+                         /*        Bit 9: unbenutzt          */
+                         /*        Bit 10: unbenutzt         */
+                         /*        Bit 11: SharedText (MiNT) */
+                         /*        Bit 12: unbenutzt         */
+                         /*        Bit 13: unbenutzt         */
+                         /*        Bit 14: unbenutzt         */
+                         /*        Bit 15: unbenutzt         */
+                         /*        Bits 31..28: TPA-Size     */
+                         /*         (mal 128k + 128k: Mindestgr. Heap */
+ WORD ph_absflag;        /* 0x1a: ungleich Null => nicht relozieren */
+} PH;
+
+
+
+WORD main( WORD argc, char *argv[] )
+{
+     PH ph;
+     WORD ret = 0;
+     LONG err;
+     WORD f;
+
+     for  (argc--,argv++; argc; argc--,argv++)
+          {
+          Cconws("Datei: ");
+          Cconws(*argv);
+          err = Fopen(*argv, RMODE_RW); /* zum Lesen+Schreiben öffnen */
+          f = (WORD) err;     /* Datei-Handle */
+          err = Fread(f, sizeof(PH), &ph);
+          if   ((err != sizeof(PH)) || (ph.ph_branch != 0x601a))
+               {
+               err = EPLFMT;
+               goto nextone;
+               }
+          Fseek(0L, f, 0);         /* Dateizeiger an den Anfang */
+          ph.ph_prgflags |= 8;     /* Bit 3 setzen */
+          err = Fwrite(f, sizeof(PH), &ph);
+
+      nextone:
+          if   (f > 0)
+               Fclose(f);
+          if   (err < 0)
+               {
+               printf(" => Fehler %ld", err);
+               ret = (WORD) err;
+               }
+          Cconws("\r\n");
+          }
+     return(ret);
+}
+
+

11.23.9 SLB_BIND

+

Achtung: Die Funktion Slbopen enthält einen +zusätzliche Parameter param. Dieser taucht in der SLB.H nicht +mehr auf. Am besten einfach ignorieren. +

+
/*
+*
+* Binding für die Benutzung einer "shared library"
+*
+* Andreas Kromke
+* 22.10.97
+*
+*/
+
+#include <mgx_dos.h>
+
+/*****************************************************************
+*
+* Öffnet eine "shared lib".
+*
+* Eingabe:
+* name      Name der Bibliothek inkl. Extension.
+* path      Suchpfad mit '\', optional
+* min_ver   Minimale benötigte Versionsnummer
+* Rückgabe:
+* sl        Bibliotheks-Deskriptor
+* fn        Funktion zum Aufruf einer Bibliotheksfunktion
+* <ret>     tatsächliche Versionsnummer oder Fehlercode
+*
+*****************************************************************/
+
+LONG Slbopen( char *name, char *path, LONG min_ver,
+        SHARED_LIB *sl, SLB_EXEC *fn,
+        LONG param )
+{
+  return(gemdos(0x16, name, path, min_ver, sl, fn, param));
+}
+
+
+/*****************************************************************
+*
+* Schließt eine "shared lib".
+*
+* Rückgabe:
+* <ret>   EACCDN, falls Lib nicht geöffnet
+*
+*****************************************************************/
+
+extern LONG Slbclose( SHARED_LIB sl )
+
+{
+  return(gemdos(0x17, sl));
+}
+
+
+

11.23.10 SLB.H

+
/*
+*
+* Binding für Verwendung von "shared libraries"
+*
+* Andreas Kromke
+* 22.10.97
+*
+* 19.2.99
+* - SLB_EXEC mit cdecl korrigiert
+* 20.8.99
+* - Slbclose korrigiert
+*/
+
+#ifndef LONG
+#include <portab.h>
+#endif
+
+typedef void *SHARED_LIB;
+
+/* alte Version: typedef LONG (*SLB_EXEC)( void , ... );        */
+typedef LONG cdecl (*SLB_EXEC)( SHARED_LIB sl, LONG fn, WORD nargs, ... );
+
+extern LONG Slbopen( char *name, char *path, LONG min_ver,
+        SHARED_LIB *sl, SLB_EXEC *fn );
+extern LONG Slbclose( SHARED_LIB sl );
+
+
+ +Home +MagiCMagiC +VFAT-XFS in MagiCVFAT-XFS in MagiC +N.AESN.AES + + diff --git a/de/magic_shutdown.html b/de/magic_shutdown.html new file mode 100644 index 000000000..bb4559e1d --- /dev/null +++ b/de/magic_shutdown.html @@ -0,0 +1,374 @@ + + + + + +Die Anleitung zum TOS: Allgemeines zum Shutdown + + + + + + + + + +Home +MagiCMagiC +Semaphoren in MagiCSemaphoren in MagiC +Der Smart-Redraw in MagiCDer Smart-Redraw in MagiC + +
+ +

11.14 Allgemeines zum Shutdown

+

Unter einem Shutdown versteht man einen Mechanismus, der es +erlaubt ein System kontrolliert herunter zu fahren. In einer +Multitasking-Umgebung ist es nämlich eigentlich nicht mehr zulässig, +den Rechner nach Gebrauch einfach abzuschalten; auch ein Rücksetzen +per Reset-Taster sollte tabu sein. Vielmehr muß sichergestellt werden, daß +alle Programme korrekt beendet und alle offenen Dateien korrekt +geschlossen werden, bevor dem Computer der Strom abgedreht wird. Wird +dies nicht beachtet, kann es durchaus zu Datenverlusten kommen. +

+

Aus diesem Grund haben z.B. UNIX-Systeme oder der Apple +Macintosh einen Shutdown-Mechanismus; ein solcher wurde auch von Atari +im MultiTOS eingeführt und steht ebenfalls in MagiC (ab Version 3.0) +zur Verfügung. +

+

Aktiviert wird der Shutdown normalerweise über den Menüeintrag +Datei/Ausschalten im Desktop, durch die Tastenkombination Ctrl-Alt-Del +oder durch einen Auflösungswechsel. Während des Shutdown können keine +Programme gestartet werden. +

+

Querverweis: Shutdown in MultiTOS   Shutdown in MagiC   Shutdown beim Empfänger   +Shutdown beim Initiator   shel_write +

+

11.14.1 Shutdown in MultiTOS

+

Unter MultiTOS müssen Programme folgendes tun, um den Shutdown +Mechanismus zu unterstützen: +

+
    +
  • shel_write (mit doex = 9) ausführen, um dem AES mitzuteilen, +daß sie die Nachricht AP_TERM verstehen. +
      +

  • +
  • bei Empfang der AP_TERM-Nachricht terminieren oder AP_TFAIL +verschicken. +
      +

  • +
+ +

Hinweis: MultiTOS schickt die AP_TERM-Nachricht dabei nur +an solche Prozesse, die explizit AP_TERM verstehen. Da derzeit kaum +Programme existieren, die ein entsprechendes shel_write absetzen, würde +eine solche Implementierung in MagiC nicht das gewünschte Ergebnis +liefern. Daher wurde ein anderes Verfahren gewählt, bei dem die +AP_TERM Nachricht an alle laufenden Applikationen verschickt +wird. +

+

Querverweis: Shutdown in MagiC   shel_write   Shutdown beim Empfänger   Shutdown beim Initiator +

+

11.14.2 Shutdown in MagiC

+

Unter MagiC funktioniert der Shutdown wie folgt: alle laufenden +Programme erhalten eine AP_TERM-Nachricht die signalisiert, daß sie +sich beenden sollen. Sind nach einer gewissen Zeit immer noch +Programme im Speicher, so gibt SHUTDOWN eine Fehlermeldung aus. In der +Datei SHUTDOWN.INF können Programmnamen (ohne Suffix wie +".prg" oder ".app") angegeben werden, die +unkritisch sind und nicht zu einer Fehlermeldung durch SHUTDOWN führen +sollen. +

+

Darüber hinaus sollten die folgenden Punkte beachtet werden: +

+
    +
  • Wenn das System über Ctrl-Alt-Del beenden werden soll muss +darauf geachtet werden daß der Bildschirm nicht gesperrt ist, d.h. +daß z.B. nicht gerade ein Programm eine Dialogbox oder Alertbox auf +dem Bildschirm bearbeitet. Weiterhin muß eine geeignete Shell +(MAGXDESK, Thing) geladen sein, d.h. es darf kein Programm im +"single mode" oder im Modus "Shell nicht resident" +(z.B. per Alt-Doppelklick) geladen sein. +
      +

  • +
  • Ist der Bildschirm gesperrt, wird nur der Writeback-Daemon +beendet, d.h. der Cache zurückgeschrieben. Erst nach Freigeben des +Bildschirms (d.h. nach Schließen der Dialogbox oder Alertbox) kann +der Shutdown durchgeführt werden. +
      +

  • +
  • Sollte das System derart abgestürzt sein, daß kein Shutdown +mehr möglich ist, sollte Ctrl-Alt-Del ein zweites Mal betätigt +werden. Dann wird ein Warmstart durchgeführt, ohne daß Programme +beendet werden. +
      +

  • +
  • Ist der "single mode" aktiv oder die Shell nicht +geladen, wird ebenfalls nur der Writeback-Daemon beendet und der Cache +zurückgeschrieben. Für den vollständigen Shutdown muß erst das +laufende Programm beendet werden so daß die Shell wieder aktiv ist. +Der Shutdown muss dann über den Menüpunkt Datei/Ausschalten +durchgeführt werden. +
      +

  • +
+ +

In MagiC 4 wurde der Shutdown Mechanismus wie folgt +überarbeitet: Das AES schickt jetzt eine SHUT_COMPLETED-Nachricht mit +msg[3] = 0 (d.h. 'Shutdown erfolglos beendet') und msg[4] = -1 +(ungültige ap_id), wenn nur noch Programme im System sind, die nicht +exlizit AP_TERM verstehen. Damit bricht ein Programm, das nur die +MultiTOS-Spezifikation beherrscht, den Shutdown ab. SHUTDOWN.PRG dagegen +wurde an die neue Spezifikation angepaßt, und funktioniert wie +bisher, d.h. gibt den noch laufenden Programmen einen Timeout und gibt +dann die Namen aller unwilligen Applikationen aus. +

+

Darüber hinaus bekommt die Applikation #0 bei Ctrl-Alt-Del +keine zufälligen Daten mehr in msg[4,5,6,7] übergeben, sondern die +folgende Nachricht: +

+
  msg[3]     = -1
+  msg[4,6,7] =  0
+  msg[5]     = AP_TERM
+
+

Querverweis: +
Shutdown in MultiTOS   shel_write   Shutdown beim Empfänger   Shutdown beim Initiator +

+

11.14.3 Der Shutdown aus Sicht der Applikation

+

Zunächst sei darauf hingewiesen, daß sich der Shutdown +Mechanismus in MultiTOS von dem in MagiC unterscheidet: Ataris +MultiTOS verschickt eine AP_TERM-Nachricht nur an solche Applikationen, +die dem AES per shel_write (Opcode 9) explizit mitgeteilt haben, daß sie +die AP_TERM-Nachricht verstehen; MagiC hingegen verschickt die +Nachricht an alle aktiven Applikationen. +

+

Der Shutdown wird vom AES genau dann als erfolgreich +angesehen, wenn sich alle Programme, die explizit AP_TERM verstehen, +beendet haben. Sollte eine Applikation bekanntgeben daß sie sich +nicht beenden kann, so wird der Shutdown abgebrochen. Aus diesen +Gründen hat jedes Programm, daß eine AP_TERM Nachricht empfängt +prinzipiell nur zwei Möglichkeiten: +

+
    +
  • es beendet sich sofort +
  • +
  • es macht den folgenden Aufruf +
    msg[0] = AP_TFAIL;
    +msg[1] = err;
    +shel_write(10, 0, 0, (char *) msg, NULL);
    +
    +
    und informiert damit das AES, daß der Vorgang mit dem +Fehlercode err unterbrochen wurde. Die Applikation, die den Shutdown +verursacht hat, bekommt die ap_id und den Fehlercode der +unterbrechenden Applikation mitgeteilt. +
  • +
+ +

Reagiert die Applikation hingegen anders, d.h. ignoriert sie die +AP_TERM Nachricht, so hängt das Verhalten des Systems davon ab, ob +mitgeteilt wurde daß die AP_TERM-Nachricht verstanden wird. Im +Klartext: +

+
    +
  • Versteht die Applikation explizit AP_TERM, so geht das +System davon aus, daß die Applikation z.Zt. keine Nachrichten +empfangen kann. Der ShutDown wird nicht unterbrochen, sondern dauert +solange, bis der Aufrufer (i.a. das Programm SHUTDOWN) den Shutdown +abbricht. SHUTDOWN verwendet dazu einen Timeout von 3 Sekunden, d.h. +wenn 3 Sekunden nach Beginn des Shutdown noch Programme aktiv sind, +die AP_TERM verstehen, bricht das Programm den Shutdown-Prozeß ab. +
      +

  • +
  • Versteht die Applikation nicht explizit AP_TERM, meldet +das System dem Initiator des Shutdown (i.a. SHUTDOWN.PRG) den +erfolgreichen Abschluß des Shutdown-Vorgangs. Nur weil SHUTDOWN.PRG +so nachsichtig mit alten Programmen ist, testet es, ob noch +Applikationen aktiv sind, und gibt ggf. eine Meldung aus. Dabei kann +man in SHUTDOWN.INF Programme angeben, die nicht zu einer Fehlermeldung +führen sollen, d.h. die nicht beendet zu werden brauchen. +
      +

  • +
+ +

Hinweis: Wurde der Shutdown per Alternate-Control-Delete +ausgelöst, so bekommen zunächst nur der Writeback-Daemon und die +Applikation mit ID 0 eine AP_TERM-Nachricht. Als Absender ist dabei -1 +eingetragen. Die Applikation 0 (i.a. der Desktop) beendet sich dann +und startet das Shutdown-Programm. +

+

Querverweis: +
Shutdown beim Initiator   shel_write   Shutdown in MultiTOS   Shutdown in MagiC +

+

11.14.4 Der Shutdown aus Sicht des Initiators

+

Shutdown und Auflösungswechsel werden in MagiC von dem Programm SHUTDOWN +übernommen, das mit den folgenden Parametern aufgerufen wird: +

+
SHUTDOWN.PRG dev txt
+
+

Dabei ist dev = -1, wenn ein Shutdown ohne +Auflösungswechsel durchgeführt werden soll, ansonsten die +Gerätenummer des VDI-Bildschirmtreibers. txt ist die +Texthöhe für das AES; diese sollte i.a. Null sein. +

+

Ein Shutdown wird per ret = shel_write(4, TRUE, 0, NULL, NULL) +gestartet. Dabei signalisiert ein Rückgabewert von 0, daß ein Shutdown +nicht möglich ist, weil z.B. bereits ein Shutdown läuft. Ein +Auflösungswechsel wird mit ret = shel_write(5, dev, 0, NULL, NULL) +durchgeführt. Dabei ist dev der VDI-Gerätetreiber. +Alternativ kann mit shel_write(5, xdv, 1, NULL, NULL) in xdv ein +Falcon-Auflösungsmodus angegeben werden. +

+

Diese Aufrufe sind alle MultiTOS-konform. Zusätzlich existiert +ab MagiC 3 noch folgender Aufruf: ret = shel_write(5, dev, 100+txt, NULL, +NULL). Hiermit kann man die Texthöhe für das AES festlegen. Eine +Falcon-Auflösung kann man bei diesem Modus nicht übergeben, dev ist +also die Gerätenummer des VDI-Bildschirmtreibers. +

+

Die Gerätenummer hängt vom verwendeten System und VDI ab. +Bei einem nackten ST oder TT (ohne Grafikkarte) gilt die folgende +Zuordung: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
1Default-Auflösung 
2ST niedrig(320*200*16)
3ST mittel(640*200*4)
4ST hoch(640*400*2)
6TT mittel(640*480*16)
8TT hoch(1280*960*2)
9TT niedrig(320*480*256)
+
+ +

Bei Einsatz einer Grafikkarte oder auf einem Macintosh stehen +die Gerätenummern wie üblich in der ASSIGN.SYS-Datei im +Wurzelverzeichnis des Bootlaufwerks. +

+

Nach erfolgreichem shel_write-Aufruf befindet sich das System im +Shutdown-Modus, und es können keine Programme mehr gestartet werden. +Nach einem erfolgreichen Abschluß des Shutdown oder Auflösungswechsels +erhält der Initiator folgende Nachricht: +

+ + + + + + +
msg[0] = SHUT_COMPLETED +
msg[3] = 1 - Shutdown erfolgreich + +
+ +

bzw. beim Auflösungswechsel +

+ + + + + + +
msg[0] = RESCH_COMPLETED +
msg[3] = 1 - Auflösungswechsel erfolgreich + +
+ +

Erfolgreich heißt für das System, daß alle Programme, die +explizit AP_TERM verstehen, sich beendet haben. Soll der Shutdown +trotzdem abgebrochen werden, so kann dies per ret = shel_write(4, +FALSE, 0, NULL, NULL) erfolgen. Andernfalls wird der Auflösungswechsel endgültig +durchgeführt, wenn sich der Initiator beendet hat. Der Shutdown +dagegen wird abgebrochen, wenn der Initiator terminiert. +

+

Hat ein Programm per AP_TFAIL den Shutdown verweigert, so erhält +der Initiator die folgende Nachricht. +

+ + + + + + + + + + + + +
msg[0] = SHUT_COMPLETED +
msg[3] = 0 - Shutdown abgebrochen +
msg[4] = ap_id der Applikation, die verweigert hat +
msg[5] = Fehlercode dieser Applikation + +
+ +

bzw. beim Auflösungswechsel +

+ + + + + + + + + + + + +
msg[0] = RESCH_COMPLETED +
msg[3] = 0 - Auflösungswechsel abgebrochen +
msg[4] = ap_id der Applikation, die verweigert hat +
msg[5] = Fehlercode dieser Applikation + +
+ +

Das System hat in diesem Fall den Shutdown bzw. Auflösungswechsel schon +beendet, d.h. der Initiator kann nichts mehr tun. +

+

Hinweis: Weil es vorkommen kann, daß der Shutdown-Prozeß +niemals vom System als abgeschlossen oder abgebrochen gemeldet wird +(die RESCH_COMPLETED bzw. SHUT_COMPLETED-Nachricht also niemals verschickt wird), +sollte der Initiator beim Warten auf die Nachricht einen Timeout +vorsehen. Tritt dieser Fall ein, muß der Shutdown explizit abgebrochen +werden. Per appl_search kann der Initiator testen, ob noch Programme +aktiv sind, die nicht explizit AP_TERM verstehen. +

+

Querverweis: +
Shutdown beim Empfänger   shel_write   Shutdown in MultiTOS   Shutdown in MagiC +

+
+ +Home +MagiCMagiC +Semaphoren in MagiCSemaphoren in MagiC +Der Smart-Redraw in MagiCDer Smart-Redraw in MagiC + + diff --git a/de/magic_smartredraw.html b/de/magic_smartredraw.html new file mode 100644 index 000000000..286f559f0 --- /dev/null +++ b/de/magic_smartredraw.html @@ -0,0 +1,114 @@ + + + + + +Die Anleitung zum TOS: Der Smart-Redraw in MagiC + + + + + + + + + +Home +MagiCMagiC +Allgemeines zum ShutdownAllgemeines zum Shutdown +Der Task-Manager in MagiCDer Task-Manager in MagiC + +
+ +

11.15 Der Smart-Redraw in MagiC

+ +

MagiC verfolgt die Philosophie, daß Geschwindigkeit nicht mit +brutalen Mitteln wie Grafikprozessoren usw. erreicht werden soll, +sondern mit ein wenig Nachdenken. Dazu gehört vor allem, immer nur +soviel zu tun, wie nötig ist. Während TOS beim Wechsel des aktuellen +Fensters, beim Schließen oder beim Verschieben mit Vorliebe das +gesamte Fenster oder gar noch völlig unschuldige, +unbeteiligte andere Fenster neu zeichnet, wird dies unter MagiC +wirkungsvoll vermieden. Obwohl diese unschöne Eigenschaft des TOS +nirgendwo dokumentiert ist, existieren leider Programme und +Bibliotheken (etwa die aus dem Buch 'Vom Anfänger zum +GEM-Profi'), welche die Eigenschaft nutzen, daß TOS beim +Vergrößern eines Fensters dieses immer neu zeichnet. +

+

Dazu ein Beispiel: Nehmen wir an, in ein Fenster passen +fünf Spalten nebeneinander, die auch angezeigt werden. Wenn der +Benutzer nun das Fenster so weit verkleinert, daß nur noch vier +Spalten hineinpassen, sortiert das Programm seine Daten um und +veranlaßt anschließend selbständig ein Neuzeichnen des Fensters +(TOS zeichnet bei Verkleinerung das Fenster nicht von sich aus +neu). Vergrößert der Benutzer dagegen das Fenster auf eine Breite +von 7 Spalten, sortiert das Anwenderprogramm die Daten ebenfalls um, +veranlaßt jedoch hier kein Neuzeichnen des Fensters. Aufgrund +des eher als Fehlverhalten des TOS zu bezeichnenden Verhaltens, das +Fenster für diesen Fall immer ganz neu zu zeichnen, findet +dann die Ausgabe statt. +

+

MagiC zeichnet nun immer nur den minimal nötigen Teil des +Fensters neu; das wären im Fall des Aufziehens eines Fensters +höchstens rechts und unten zwei Rechtecke. Für die Programme, die +den oben beschriebenen Fehler des TOS ausnutzen, gibt sich so eine +Diskrepanz zwischen logischem und physikalischem +Bildschirminhalt. +

+

Viel einfacher wäre es gewesen, einfach auf die +Fallunterscheidung 'Fenster größer oder kleiner als vorher' zu +verzichten und immer im Fall des Umsortierens einen Redraw zu +veranlassen. Da das Betriebssystem auch im TOS die Redraws +zusammenfaßt, hat ein eventuell überflüssiger Redraw +niemals irgendwelche Auswirkungen. +

+

Den gleichen Effekt wie beschrieben hat man übrigens auch beim +Vergrößern des Fensters, wenn bereits die unterste Zeile bzw. die +rechteste Zeile dargestellt wird. +

+

Auch hier ein Beispiel: Ein Text habe 100 Zeilen, das +Fenster habe eine Höhe von 20 Zeilen. Da der Scrollbalken ganz unten +ist, werden also die Zeilen 80 bis 100 im Fenster dargestellt. Wird +nun das Fenster nach unten vergrößert, so daß etwa 30 Zeilen Platz +finden, könnte man eigentlich nur einen weißen Bereich aufziehen, da +unterhalb von Zeile 100 ja keine Daten mehr sind. Um dies zu +verhindern scrollen die meisten Programme in dieser Situation ihre +Daten, in unserem Beispiel um 10 Zeilen nach oben. Folglich zeigt das +Programm jetzt die Zeilen 70 bis 100 an; da es aber auf einem TOS- +Fehler aufbaut, wird kein Neuzeichnen veranlaßt, was unter +MagiC natürlich prompt zur Konfusion führt. +

+

Auch hier wäre ein generelles Neuzeichnen des Fensters beim +Umsortieren auch unter TOS nicht nur sauber, sondern auch ohne +Nebenwirkung, da TOS auch hier unnötige Redraws vermeidet. Beim +direkten Vergleich zwischen 'Smart Redraw' und 'TOS Redraw', was hier +durchaus im wörtlichen Sinn als Gegenteil zu verstehen ist, zeigt +sich in ersterem Fall ein wesentlich schnellerer, ruhigerer und +saubererer Bildschirmaufbau, der durchaus mit dem +Macintosh-System konkurrieren kann und unter TOS selbst mit +Blitter und 68040 Prozessor in dieser Form nicht möglich wäre. Daher +wird dringend empfohlen, diese elegante Lösung nicht durch Ausnutzen +undokumentierter Eigenschaften des TOS zunichte zu machen. +

+

Sollten sie Programme benutzen, die das oben beschriebene +Fehlverhalten aufweisen, so sollten sie wie folgt verfahren: +

+
    +
  • im MagxConf ACC/CPX den Schalter 'Smart Redraw' deaktivieren +
  • +
  • beim Autor des betreffenden Programmes anregen, daß dieser +Fehler umgehend behoben wird. +
  • +
+ +

Querverweis: Smart-Redraw ausschalten   GEM   Style-Guidelines +

+
+ +Home +MagiCMagiC +Allgemeines zum ShutdownAllgemeines zum Shutdown +Der Task-Manager in MagiCDer Task-Manager in MagiC + + diff --git a/de/magic_taskmanager.html b/de/magic_taskmanager.html new file mode 100644 index 000000000..972f8dd59 --- /dev/null +++ b/de/magic_taskmanager.html @@ -0,0 +1,96 @@ + + + + + +Die Anleitung zum TOS: Der Task-Manager in MagiC + + + + + + + + + +Home +MagiCMagiC +Der Smart-Redraw in MagiCDer Smart-Redraw in MagiC +Test auf MagiCTest auf MagiC + +
+ +

11.16 Der Task-Manager in MagiC

+

Über den Task-Manager von MagiC können verschiedene Aufgaben +wie z.B. das Einfrieren, Auftauen oder Beenden von Prozessen +ausgeführt werden. Aufgerufen wird der Manager durch die +Tastenkombination Ctrl-Alt-Esc. Nach dem Aufruf erscheint eine Liste +aller im Speicher befindlichen Programme, die wie folgt aufgebaut ist: +

+

+

Hinweis: Unterhalb dieser Liste befindet sich ein Menü, +welches eine Reihe von Kommandos zur Steuerung des Systems zur +Verfügung stellt. Im einzelnen: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Kommando Bedeutung +
    +
Control MagiC versucht, der gewählten Applikation die Kontrolle über +Bildschirm und Maus zu geben - dies kann u.U. bei Deadlocks helfen. +
freeze Die gewählte Applikation wird eingefroren, sie ist dann für +alle anderen Programme unsichtbar und bekommt keine Rechenzeit. +
OK zurück zum Normalbetrieb, der Taskmanager wird ohne Aktion +verlassen. +
prev, next eine Zeile der obigen Liste ist immer invertiert dargestellt, +welche das ist, kann mittels Cursor hoch/runter eingestellt werden; +die folgenden Kommandos beziehen sich jeweils auf die so festgelegte +Applikation. Applikationen mit einstelligen IDs können auch direkt +durch Eingabe der entsprechenden Ziffer ausgewählt werden. +
Switch Die Menueleiste der gewählten Applikation wird aktiviert. +
Terminate Die gewählte Applikation wird unsanft aus dem Speicher +geworfen, wobei in der Regel alle ihre Daten verloren gehen; zuweilen +kann das sogar zu Abstürzen führen, diese Funktion sollte also mit +besonderer Vorsicht genossen werden. +
unfreeze Hiermit werden eingefrorene Applikationen wieder aufgetaut, sie +fahren dann an der Stelle mit ihrer Arbeit fort, an der sie +eingefroren wurden. + +
+ +

Querverweis: Prozessfunktionen   U:\PROC +

+
+ +Home +MagiCMagiC +Der Smart-Redraw in MagiCDer Smart-Redraw in MagiC +Test auf MagiCTest auf MagiC + + diff --git a/de/magic_test.html b/de/magic_test.html new file mode 100644 index 000000000..c0183c2aa --- /dev/null +++ b/de/magic_test.html @@ -0,0 +1,65 @@ + + + + + +Die Anleitung zum TOS: Test auf MagiC + + + + + + + + + +Home +MagiCMagiC +Der Task-Manager in MagiCDer Task-Manager in MagiC +Threads in MagiCThreads in MagiC + +
+ +

11.17 Test auf MagiC

+
/*  Der folgende Code testet ob MagiC installiert ist, und liefert
+    einen der folgenden Werte zurück:
+
+    -1 = kein MagiC vorhanden
+    -2 = MagiC installiert, aber MagiC-AES inaktiv, d.h. MagiC
+         wird nur als schnelles Dateisystem benutzt.
+
+    >0 = MagiC vorhanden und MagiC-AES aktiv. Der Rückgabewert
+         enthält die BCD-codierte Versionsnummer. */
+
+GLOBAL WORD InqMagX (VOID)
+{
+    MAGX_COOKIE *cv;
+
+    if (get_cookie ("MagX", (LONG) &cv))
+    {
+        if (cv->aesvars)
+            return (cv->aesvars->version);
+        else
+           return (-2);
+    }
+    else
+       return (-1);
+} /* InqMagX */
+
+

Hinweis: Programme die im AUTO-Ordner gestartet werden, +können mit Hilfe dieser Routine nicht die Versionsnummer von +MagiC ermitteln, da das AES zur Bootzeit noch nicht initialisiert +ist. In diesem Fall sollte auf die Funktion DOMagixAESVars +zurückgegriffen werden. +

+

Querverweis: Cookie-Jar   Cookie- und XBRA-Liste +

+
+ +Home +MagiCMagiC +Der Task-Manager in MagiCDer Task-Manager in MagiC +Threads in MagiCThreads in MagiC + + diff --git a/de/magic_threads.html b/de/magic_threads.html new file mode 100644 index 000000000..e690bee90 --- /dev/null +++ b/de/magic_threads.html @@ -0,0 +1,323 @@ + + + + + +Die Anleitung zum TOS: Threads in MagiC + + + + + + + + + +Home +MagiCMagiC +Test auf MagiCTest auf MagiC +Die Zusatzprogramme für MagiCDie Zusatzprogramme für MagiC + +
+ +

11.18 Threads in MagiC

+

Das Konzept der Threads ermöglicht Quasi-Parallelität +innerhalb einer Anwendung, und ist unter Betriebssystemen wie +OS/2, MacOS oder UNIX schon länger bekannt. Im Gegensatz zum normalen +Multitasking können dabei mehrere Threads zu einem Programm +(bzw. Prozess) gehören. In MagiC werden Threads ab der Version 4.50 +(01.04.96) unterstützt, und sind als Applikation implementiert, d.h. +ein Thread besitzt unter MagiC eine eigene Applikations-ID. Das +Konzept lehnt sich dabei an das von Sun Solaris 2.x an. +

+

Dieser Abschnitt beschreibt die folgenden Punkte: +

+ + +

Querverweis: GEMDOS   Prozessfunktionen   Beispiel-Code +

+

11.18.1 Threads und Signale

+

Beim Zusammenspiel von Threads und Signalen ist folgendes zu +beachten: wird ein Prozess (z.B. per SIGSTOP) angehalten, so werden +auch alle zugehörigen Threads angehalten; durch das SIGCONT-Signal +können alle Threads wieder aufgeweckt werden. Falls ein Prozess per +SIGTERM oder SIGKILL beendet wird, werden auch alle betroffenen +Threads automatisch terminiert. +

+

Die Signalbehandlung wird immer nur vom Haupt-Thread +übernommen; dies ist derjenige, der mit Pexec gestartet worden ist. +Während der Abarbeitung eines Signalhandlers wird deshalb auch nur +der Haupt-Thread angehalten, und bei einem Aufruf von Psigreturn in +diesen zurückgesprungen. +

+

Achtung: Falls mehr als ein Thread die Signalmaske +manipuliert, kann es zu Unstimmigkeiten kommen, falls die Maske nicht +in der richtigen Reihenfolge wieder zurückgesetzt wird. Beispiel: +

+
Thread-A rettet alte Maske
+Thread-A ändert Maske
+Thread-B rettet alte Maske
+Thread-A restauriert alte Maske
+Thread-B restauriert alte Maske
+
+

In diesem Fall wird die Signalmaske ungewollt verändert. Eine +Lösung dieses Problems besteht darin, jedem Thread eine +eigene Signalmaske zuzuteilen, und als effektive +Signalmaske die Masken aller Threads durch eine Oder-Verknüpfung zu +verbinden. Möglicherweise wird das in einer späteren Version von +MagiC tatsächlich der Fall sein. +

+

Querverweis: Threads in MagiC   Signale   shel_write   +Prozessfunktionen +

+

11.18.2 Threads und AES-Aufrufe

+

Bei der Entwicklung von eigenen Programmen muss unbedingt darauf +geachtet werden, daß eine Multithread-sichere Bibliothek verwendet +wird. Die Standardbibliotheken von Pure-C etwa sind in weiten +Teilen diesbezüglich unbrauchbar. Es muss inbesondere darauf geachtet +werden, daß jeder Thread sein eigenes global-Feld erhält. Betroffen +sind daher die folgenden Funktionen: +

+ + +

Hinweis: Die original MagiC Dokumentation enthält +Beispiele für Multithread fähige AES-Funktionen, an deren Aufbau man +sich orientieren kann. Beachtet werden sollte noch, daß der Name +eines Threads auf AES-Ebene ungültig ist, d.h. er kann +nicht per appl_find oder appl_search gefunden werden. +

+

Querverweis: +
Threads und VDI-Aufrufe   Prozessfunktionen   AES-Bindings   +Signale +

+

11.18.3 Threads und VDI-Aufrufe

+

VDI-Aufrufe sind in den meisten Fällen nicht so kritisch wie +AES-Aufrufe, da hier seltener ein Reentranz-Problem auftritt. Der +Grund ist darin zu sehen, daß es bei Aufruf von VDI-Funktionen +nicht so häufig zu Taskwechseln kommt, wie dies z.B. beim AES der +Fall ist. +

+

Problematisch sind VDI-Aufrufe jedoch immer dann, wenn auf +Vektorfonts zugegriffen wird, da in diesen Fällen i.d.R. +Plattenzugriffe notwendig sind, die in MagiC bekanntlich unterbrechbar +sind. In einer solchen Situation kann es also zu einem Task-Switching +kommen. Welche VDI-Befehle im einzelnen unterbrechbar sind kann an +dieser Stelle nicht beantwortet werden; bei Bedarf ist dies +mit den NVDI-Entwicklern abzuklären, so daß dann nur für diese +Funktionen reentrante Bibliotheksfunktionen erforderlich wären. +

+

Querverweis: +
Threads und AES-Aufrufe   Prozessfunktionen   VDI-Bindings   +Signale +

+

11.18.4 Verteilung der Resourcen bei Threads

+

In MagiC laufen Threads auf demselben Prozess, besitzen jedoch +eine eigene Applikations-ID, und sind somit eine selbstständige Task. +Die folgende Tabelle gibt eine Übersicht über die Resourcen, die ein +Thread selbst besitzt, bzw. vom Hauptprogramm benutzt. +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Threads besitzenvom Hauptprogramm wird benutzt
• Userstack• Dateihandles
• Supervisor-Stack• Basepage
• Applikations-ID• Speicherblöcke
• Resource-Dateien• aktuelles Laufwerk/Verzeichnisse
• Menüzeile• Prozess-ID (PID)
• Desktop-Hintergrund• Domain (MiNT bzw. TOS)
• Fenster• umask
Message Queue• aktuelle DTA
• MauszeigerMalloc-Flags
• VT52-Fenster (optional)• Kommandozeile und Environment
etv_term-Vektor• Signal-Handler und -maske
• Semaphoren• VT52-Fenster (optional)
+
+ +

Hinweis: Wie man sieht erhält ein Thread damit z.B. +eine eigene AP_TERM Nachricht. Bei der Verwendung von +Resource-Dateien ist darauf zu achten, daß ggfs. ein eigenes +global-Feld benutzt wird. +

+

Zu beachten ist ferner, daß Speicher, den der Thread alloziert, +dem Prozess gehört, und bei Beendigung des Threads nicht +automatisch freigegeben wird; gleiches gilt für geöffnete Dateien, +die erst bei der Programmbeendigung geschlossen werden. Dies muss +deshalb ggfs. vom Thread übernommen werden. +

+

Achtung: Es ist unbedingt zu beachten, daß +

+
    +
  • keine DTA verwendet wird, da die Funktionen Fsfirst, Fsnext, +Fsetdta und Fgetdta nicht Multithread-sicher sind. +
      +

  • +
  • Zugriffe auf Dateihandles mit geeigneten Methoden +synchronisiert werden. Es dürfen nicht zwei Threads gleichzeitig auf +dieselbe Datei zugreifen. +
      +

  • +
+ +

Die Funktion Psemaphore ist bereits für Threads ausgelegt, und +kann sowohl zur Synchronisation zwischen Prozessen als auch zwischen +mehreren Threads eines Prozesses verwendet werden. Beim Beenden eines +Threads werden alle von diesem blockierten Semaphoren automatisch +freigegeben. +

+

Nach Möglichkeit sollte z.Zt. nur der Haupt-Thread ein Pexec +ausführen, nicht jedoch nebenläufige Threads. Theoretisch ist dies +jedoch erlaubt, und zwar dann, wenn kein anderer Thread oder der +Haupt-Thread Pexec aufgerufen hat, und der Haupt-Thread sich nicht +beendet. +

+

Das Problem liegt ganz einfach darin, daß z.Zt. +Rücksprungadressen bei Pexec nicht im laufenden Prozess sondern im +Parent abgelegt werden, und der Parent des vom Thread gestarteten +Prozesses ungültig wird. +

+

Falls ein Thread die Funktion Pterm ausführt, so wird z.Zt. nur +dieser Thread beendet. Angemerkt werden soll auch noch, daß ein +Thread andere Programme per shel_write (parallel) starten, und auf +deren Beendigung warten kann. +

+

Querverweis: Threads und AES-Aufrufe   Threads und VDI-Aufrufe   +Prozessfunktionen   GEMDOS +

+

11.18.5 Threads, Beispiel-Code zu

+
#include <tos.h>
+#include <mt_aes.h>
+
+WORD global[15];
+WORD ap_id;
+WORD fmt_id;
+
+LONG cdecl format_thread( struct fmt_parameter *par )
+{
+   WORD myglobal[15];
+   WORD ap_id;
+
+   /* wir braten das global-Feld der Haupt-APPL nicht über */
+
+   ap_id = MT_appl_init(myglobal);
+   (...)
+}
+
+
+/*********************************************************************
+*
+* Startet den Formatier-Thread.
+*
+*********************************************************************/
+
+WORD start_format( VOID *param )
+{
+   THREADINFO thi;
+
+   if   (fmt_id < 0)   /* Thread noch nicht aktiv */
+   {
+      thi.proc = (VOID *) format_thread;
+      thi.user_stack = NULL;
+      thi.stacksize = 4096L;
+      thi.mode = 0;
+      thi.res1 = 0L;
+      fmt_id = shel_write(SHW_THR_CREATE, 1, 0,
+                          (BYTE *) &thi, param);
+      return(fmt_id);
+   }
+   else
+      return(-1);    /* Thread läuft noch */
+}
+
+WORD main( VOID )
+{
+   if ((ap_id = MT_appl_init(global)) < 0)
+      Pterm(-1);
+   else
+   {
+      (...)
+      start_format( .... );
+
+      while(...)
+         (...);
+
+      appl_exit();
+      return(0);
+   }
+}
+
+

Querverweis: Threads   GEMDOS   Prozessfunktionen   Signale +

+
+ +Home +MagiCMagiC +Test auf MagiCTest auf MagiC +Die Zusatzprogramme für MagiCDie Zusatzprogramme für MagiC + + diff --git a/de/magic_vfat.html b/de/magic_vfat.html new file mode 100644 index 000000000..00da627ab --- /dev/null +++ b/de/magic_vfat.html @@ -0,0 +1,133 @@ + + + + + +Die Anleitung zum TOS: VFAT-XFS in MagiC + + + + + + + + + +Home +MagiCMagiC +Das XFS-Konzept von MagiCDas XFS-Konzept von MagiC +Shared LibrariesShared Libraries + +
+ +

11.22 VFAT-XFS in MagiC

+

MagiC unterstützt ab Version 5.0 ein VFAT-XFS, mit dessen +Hilfe sich lange Dateinamen im Windows95-Format auf dem Atari nutzen +lassen. +

+

Vorteile dieses Konzepts: +

+
    +
  • bestehende Partitionen müssen nicht neu formatiert werden; die +langen Dateinamen stehen also direkt zur Verfügung. +
      +

  • +
  • auf diese Weise erzeugte Dateien können direkt zwischen MagiC +und Windows95 ausgetauscht werden, und das Bearbeiten der erzeugten +Dateien ist auch ohne installiertes VFAT-XFS möglich (wichtig, falls +z.B. einmal ohne MagiC gebootet wird). +
      +

  • +
  • da VFAT auf dem FAT-Konzept beruht, war eine einfache +Implementierung ohne nennenswerten Speicherbedarf möglich. +
      +

  • +
+ +

Nachteile dieses Konzepts: +

+
    +
  • VFAT hat alle Probleme von FAT geerbt. So gibt es den bekannten +Clusterverschnitt z.B. auch unter VFAT. +
      +

  • +
  • es gibt modernere Konzepte, die sowohl schneller als auch +sicherer sind. +
      +

  • +
  • auf dem Atari fehlen derzeit noch Programme, die Volumes mit +langen Dateinamen reparieren können. Diese müssten allen +Dateinamenseinträge die unvollständig sind, oder von einem falschen +Haupteintrag gefolgt werden, löschen. +
      +

  • +
+ +

Technische Beschreibung des VFAT-Systems: +

+
typedef struct
+{
+    BYTE   head;       /* Bit 0..4: Nummer, Bit 6: Endofname */
+    UBYTE  name1[10];  /* 5 Unicode- Zeichen                 */
+    BYTE   attr;       /* Attribut (0x0f)                    */
+    BYTE   unused;     /* z.Zt. unbenutzt                    */
+    BYTE   chksum;     /* Checksumme des kurzen Namens       */
+    UBYTE  name2[12];  /* 6 Unicode- Zeichen                 */
+    WORD   stcl;       /* erster Cluster (0)                 */
+    UBYTE  name3[4];   /* 2 Unicode-Zeichen                  */
+} LDIR;
+
+

Hinweis: Dabei ist head beim ersten Eintrag z.B. +0x01, beim zweiten 0x02 und beim dritten 0x43, wenn der Name drei +Einträge braucht. +

+

Pro Eintrag können 13 Zeichen abgelegt werden. Die Einträge +mit dem langen Dateinamen liegen immer unmittelbar vor dem +Haupteintrag. Die Unicode Zeichen liegen im Intel-Format vor. Im +letzten Eintrag werden nach dem Nullbyte die nicht verwendeten Zeichen +mit 0xff,0xff belegt. Die Reihenfolge der Einträge ist umgekehrt, +d.h. die letzten 13 Zeichen des langen Namens liegen physikalisch an +erster Stelle. Der letzte Verzeichniseintrag, der mit gesetztem Bit 6 +im Feld head gekennzeichnet ist, liegt physikalisch an erster +Stelle. +

+

Die Komponente stcl ist immer Null; chksum +berechnet sich aus dem kurzen Namen (im internen Format) durch +abwechselndes Rechtsrotieren des bisherigen Ergebnisses und +Aufaddieren der 11 Zeichen. Linux verwendet das Feld unused, +um Flags für Groß-/Kleinschrift abzuspeichern. Die aktuelle +Windows95-Version schreibt jedoch immer Nullen in dieses Feld, und so +verhält sich auch MagiC. Weitere Hinweise: +

+
    +
  • das Umbenennen von Dateien bei bis auf Klein-/Großschrift +identischem Namen ist möglich. Beispiel: Durch das Umbenennen von +'test.txt' in 'TEST.TXT' fällt der lange Name automatisch weg. +
      +

  • +
  • die Umsetzung Unicode <-> ASCII ist entsprechend dem +NVDI-Mapping implementiert. +
      +

  • +
  • beim Erzeugen des Kurznamens werden Leerstellen durch +Unterstriche ersetzt. Beispiel: 'Wassili Kandinsky.app" -> +"WASSILI_.APP" +
      +

  • +
  • das VFAT-XFS kann (egal ob lange Namen zugelassen sind oder +nicht) auch Ordner innerhalb der Verzeichnisstruktur verschieben. +
      +

  • +
+ +

Querverweis: XFS-Konzept in MagiC   VFATCONF +

+
+ +Home +MagiCMagiC +Das XFS-Konzept von MagiCDas XFS-Konzept von MagiC +Shared LibrariesShared Libraries + + diff --git a/de/magic_xfs.html b/de/magic_xfs.html new file mode 100644 index 000000000..67454b5c1 --- /dev/null +++ b/de/magic_xfs.html @@ -0,0 +1,4227 @@ + + + + + +Die Anleitung zum TOS: Das XFS-Konzept von MagiC + + + + + + + + + +Home +MagiCMagiC +Das DFS-Konzept von MagiCDas DFS-Konzept von MagiC +VFAT-XFS in MagiCVFAT-XFS in MagiC + +
+ +

11.21 Das XFS-Konzept von MagiC

+ +

MagiC ermöglicht wie MultiTOS die Einbindung alternativer +Dateisysteme, und damit prinzipiell die Verwendung langer Dateinamen. +Aus verschiedenen Gründen wurde in MagiC jedoch ein anderer Ansatz +gewählt, als in Atari's Lösung. Dies hat leider zur Folge, daß die +für MultiTOS vorhandenen XFS's (Minix-XFS, CD-ROM-XFS, ...) unter +MagiC nicht eingesetzt werden können. Dieses Kapitel +beschreibt die folgenden Punkte: +

+ + +

Querverweis: VFAT-XFS in MagiC   DFS-Konzept in MagiC +

+

11.21.1 Allgemeines zum XFS-Konzept von MagiC

+ +

Das GEMDOS war bisher der konservativste Teil des +Betriebssystems MagiC. Für Netzwerktreiber mußten praktisch +sämtliche DOS-Aufrufe einschließlich Pexec nachgebildet werden, ohne +auf einer tieferen Ebene eingreifen zu können. In MagiC 1.x (wie in +TOS) war das DOS nicht einmal reentrant, da ein statisch angelegter +Stack verwendet wurde. +

+

In MultiTOS/MiNT wird das Problem dermaßen umgangen, daß +gewissermaßen über das GEMDOS ein System gelegt wird, das alle +höheren Verwaltungsaufgaben erledigt, andere Dateisysteme einbinden +kann und das GEMDOS nur noch als dummen Dateisystemtreiber verwendet. +Vorteil dieses Systems ist seine große Flexibilität und +Erweiterbarkeit, ein entscheidender Nachteil aber der gewaltive +Overhead bei der Verwendung von 'normalen' DOS-Dateisystemen. Dies +sind aber gerade diejenigen, die mit Abstand am häufigsten eingesetzt +werden. Hinzu kommt, daß das GEMDOS-Dateisystem mit dem Einsatz von +MiNT nichts an Funktionalität, Komfort oder Geschwindigkeit gewinnen +kann, da ja die alten Routinen nur mit zusätzlichem Overhead +ablaufen. Die Dateisystemzugriffe unter MiNT sind also i.a. +nicht reentrant, d.h. jeder Diskettenzugriff legt wie unter +MS-Windows den gesamten Rechner lahm. +

+

Eine weitere Eigenschaft von MiNT ist das Bemühen, die +Funktionen, die alle Dateisysteme gemeinsam haben, in den Kernel zu +übernehmen. Dabei bleiben zwar die Dateisystemtreiber (MiNT-XFSs) +kompakt, aber durch den Inode-orientierten Aufbau der Kernelfunktionen +wird den Dateitreibern eine unter Umständen ungünstige Struktur +aufgezwungen, außerdem sind i.a. viele Aufrufe des +Dateisystemtreibers für einen DOS-Aufruf notwendig. Schließlich ist +der MiNT-Kernel selbst sehr lang, liegt aber zum großen Teil brach, +solange keine anderen Dateisysteme als DOS eingesetzt werden. +

+

Unter MagiC wurde ein anderer Ansatz gewählt, der darin +bestand, das gesamte GEMDOS einschließlich der Lowlevel-Funktionen +für die Sektorpufferung von Grund auf neu zu schreiben und in +insgesamt drei, vier oder fünf Schichten zu zerlegen, in die von +außen (durch nachgeladene Treiber) eingegriffen werden kann. Als +Nebeneffekt kam eine Erweiterung der Funktionalität des +DOS-Dateisystems und ein zusätzliches Dateisystem auf dem logischen +Laufwerk U: heraus. +

+

Das gesamte Konzept einschließlich der Zugriffe auf +DOS-Dateisysteme ist reentrant und läuft im Hintergrund ab. So +ist es möglich, auf Laufwerk A: Dateien zu bearbeiten, ohne den +Rechner bei den Diskettenzugriffen merklich zu bremsen. Dabei ist +MagiC bisher nur um 10k länger geworden. Im Vergleich zu MiNT wurden +aber mehr Funktionen in die Dateisystemtreiber ausgelagert, was diese +zwar länger macht, aber ihnen die Möglichkeit gibt, die Funktionen +wesentlich effizienter auszuführen. Das DOS-Dateisystem ist eher noch +etwas schneller als langsamer geworden. +

+

Obwohl vollständig in Assembler realisiert, handelt es sich um +ein objektorientiertes System mit virtuellen Funktionen und +mehrstufigen Vererbungen. Ein Dateideskriptor, wie ihn der Kernel +verwendet und das XFS zur Verfügung stellt, ist ein Objekt mit +speziellen Daten und Funktionen. Das XFS realisiert aber ein +abgeleitetes Objekt mit weiteren Datenfeldern und Funktionen. Der +DFS-Untertreiber des DOS_XFS schließlich muß wiederum weitere +Funktionen und Daten im FD unterbringen und leitet die Klasse weiter +ab. Genauso sieht es mit dem DMD (drive medium descriptor) aus. Der +Kernel benötigt nur wenige Angaben, die unteren Schichten jedoch +wesentlich mehr, aber immer wieder verschiedene. +

+

Die Schichten im einzelnen: +

+ +
    +
  1. Der DOS-Kernel. Er liegt in MagiC selbst und wird +direkt von den Anwenderprogrammen über Trap #1 aufgerufen. Er +enthält Module für die Speicherverwaltung, für die +Prozeßverwaltung und für die Dateiverwaltung. Letztere hat die +folgenden Unterschichten. +
  2. +
  3. Das Dateisystem (XFS = eXtended File System). Sein +Aufbau ist grundsätzlich verschieden von einem MiNT-XFS, erfüllt +aber denselben Zweck. MagiC für Ataris enthält nur ein einziges XFS, +das sogenannte DOS_XFS, andere können eingebunden werden. Die +Macintosh-Version (MagiC Mac) enthält zusätzlich ein +Mac-XFS. Speziell dieses Dateisystem greift wieder auf Untertreiber +zu: + +
      +
    1. Ein DOS- Dateisystem (DFS) wird vom DOS_XFS aufgerufen. Hier +stehen nur die Dateifunktionen, während die Verzeichnisverwaltung im +wesentlichen vom DOS_XFS übernommen wird. MagiC direkt enthält zwei +DFSs. Eines für Laufwerk U:, ein zweites für FAT-Dateisysteme, die +auf BIOS Laufwerken liegen. Weitere DFSs können eingebunden werden. +Der Aufwand für ein DFS ist wesentlich geringer als für ein XFS, da +viele Funktionen vom DOS_XFS bereits ausgeführt werden. Die +wesentliche Voraussetzung ist eine DOS-konforme Verzeichnisstruktur +(mit 32-Byte Einträgen und Dateinamen des Formats 8+3). Der Kernel +selbst kommt mit dem DFS nicht in Berührung, sondern steuert +ihn transparent über das DOS-XFS an. +
    2. +
    + +
  4. +
  5. Die Dateitreiber (MX_DEV), die im wesentlichen das +Lesen und Schreiben einer Datei erledigen. Sie werden vom XFS angelegt +und verwaltet, aber bei Funktionen wie Fread() und Fwrite() direkt vom +Kernel aufgerufen, wodurch extrem wenig Overhead entsteht. Das DOS_XFS +enthält tatsächlich nur einen Dateitreiber. Dieser erledigt z.B. bei +Schreibzugriffen die Aktualisierung des Verzeichnisses und ruft wieder +Untertreiber (MX_DDEV) auf. + +
      +
    1. Der Untertreiber MX_DDEV wird nur vom DOS-Dateitreiber des +Dateisystems DOS_XFS aufgerufen. Der Benutzer kann eigene MX_DDEVs +über das Verzeichnis U:\\DEV einbinden. Der Kernel selbst kommt mit +den Untertreibern übrigens nicht in Berührung. +
    2. +
    + +
  6. +
+ +

Bemerkungen: +

+
    +
  • Im Gegensatz zu MiNT sind U:\PROC, U:\DEV usw. keine eigenen +Dateisysteme sondern einfach nur Unterverzeichnisse des DFS für +Laufwerk U:. Je nach Unterverzeichnis legt das U-DFS verschiedene +Dateitypen und -treiber an. Da die Verzeichniskontrolle dem DOS_XFS +obliegt, werden Schreibzugriffe auf z.B. ein Device im Verzeichnis per +Dateidatum protokolliert. Das geht sogar soweit, daß ein +Schreibzugriff auf das Wurzelverzeichnis von Laufwerk A: automatisch +das Dateidatum von U:\A verändert. +
      +
    Devices, Pipes und Shared-Memory-Blöcke können verschoben, +gelöscht oder umbenannt werden. In allen Verzeichnissen von Laufwerk +U: können symbolische Links angelegt werden, z.B. kann man mit +"ln -s U:\CON U:\CONSOLE" einen Alias für die Gerätedatei +CON anlegen. Man kann auch einfach leere Dateien anlegen, jedoch keine +Ordner, weil das Laufwerk U: keinen Speicher hat. +
      +

  • +
  • Im Gegensatz zu MiNT ist U:\ kein eigenes, spezielles +Dateisystem. Es wird lediglich darauf geachtet, daß nur symbolische +Links angelegt werden können. Die Verzeichnisse U:\A usw. sind +lediglich symbolische Links, die auch entfernt oder umbenannt werden +können. +
      +

  • +
  • Alle Verzeichnisse von U: sind z.Zt. auf 32 Einträge +beschränkt. +
      +

  • +
  • Der Aufbau aller internen Strukturen und die schnelle +registerbasierte Parameterübergabe und -rückgabe erfordert eine +Implementation aller Dateisysteme und -treiber in Assembler, zumindest +für die meisten Funktionen. +
      +

  • +
  • Der Aufbau des MX_DDEV-Dateitreibers hat sich seit MagiC V2.10 +geändert. Der Beispieltreiber DEV_LPT1 darf unter MagiC 3.00 nicht +verwendet werden. Die Konzepte sind jedoch identisch geblieben, nur +ein paar Konstanten haben sich geändert. Ein neuer Beispieltreiber +ist noch nicht fertig. +
      +

  • +
+ +

Querverweis: XFS-Konzept in MagiC   Test auf Pipes +

+

11.21.2 Der Aufbau eines XFS

+ +

Da die Implementation eines XFS nur in Assembler erfolgen kann, +wird dessen Beschreibung in Assembler-Syntax angegeben: +

+
xfs_name:       DS.B      8    /* Name des Dateisystems               */
+xfs_next:       DS.L      1    /* nächster Treiber                    */
+xfs_flags:      DS.L      1    /* Flags analog zu MiNT                */
+xfs_init:       DS.L      1    /* Initialisierung                     */
+xfs_sync:       DS.L      1    /* Synchronisation des Dateisystems    */
+xfs_pterm:      DS.L      1    /* teilt ein Programmende mit          */
+xfs_garbcoll:   DS.L      1    /* Garbage-Collection oder NULL        */
+xfs_freeDD:     DS.L      1    /* DD freigeben                        */
+xfs_drv_open:   DS.L      1    /* DMD (Mediach) testen/initialisieren */
+xfs_drv_close:  DS.L      1    /* erzwingt einen Disk-Wechsel         */
+xfs_path2DD:    DS.L      1    /* gibt einen DD zum Pfadnamen zurück  */
+xfs_sfirst:     DS.L      1    /* sucht die erste passende Datei      */
+xfs_snext:      DS.L      1    /* sucht die nächste passende Datei    */
+xfs_fopen:      DS.L      1    /* öffnet oder erstellt eine Datei     */
+xfs_fdelete:    DS.L      1    /* löscht eine Datei                   */
+xfs_link:       DS.L      1    /* für Frename und Flink benötigt      */
+xfs_xattr:      DS.L      1    /* für Fxattr benötigt                 */
+xfs_attrib:     DS.L      1    /* für Fattrib benötigt                */
+xfs_chown:      DS.L      1    /* für Fchown benötigt                 */
+xfs_chmod:      DS.L      1    /* für Fchmod benötigt                 */
+xfs_dcreate:    DS.L      1    /* erstellt ein Verzeichnis            */
+xfs_ddelete:    DS.L      1    /* löscht ein Verzeichnis              */
+xfs_DD2name:    DS.L      1    /* gibt den absoluten Pfadnamen zurück */
+xfs_dopendir:   DS.L      1    /* öffnet ein Verzeichnis              */
+xfs_dreaddir:   DS.L      1    /* liest nächsten Verzeichnis-Eintrag  */
+xfs_drewinddir: DS.L      1    /* setzt das dirhandle auf 1. Eintrag  */
+xfs_dclosedir:  DS.L      1    /* schließt das dirhandle              */
+xfs_dpathconf:  DS.L      1    /* ermittelt verschiedene Limits       */
+xfs_dfree:      DS.L      1    /* Anzahl freier Blöcke etc. ermitteln */
+xfs_wlabel:     DS.L      1    /* schreibt den Disk-Namen             */
+xfs_rlabel:     DS.L      1    /* liest den Disk-Namen                */
+xfs_symlink:    DS.L      1    /* erstellt einen symbolischen Link    */
+xfs_readlink:   DS.L      1    /* liest einen symbolischen Link       */
+xfs_dcntl:      DS.L      1    /* für Dcntl benötigt                  */
+
+

Querverweis: Aufbau eines DFS   XFS-Konzept in MagiC +

+

11.21.2.1 xfs_attrib

+ + + + + + + + + + + + + + + +
Name: »xfs_attrib« - für Fattrib notwendig +
  +
Parameter: +
  + + + + + + + + + + + + + + + + + + +
a0 = DD * +
a1 = char *name +
d0 = int rwflag +
d1 = int attrib +
-> d0 = char attr oder long errcode +
-> a0 = SYMLINK * + +
+ +
Beschreibung: Im Gegensatz zu MiNT führt MagiC diese Funktion nicht auf +Fxattr zurück, weil dies u.U. einen gewaltigen Overhead bedeutet. +Hierbei müssen symbolische Links verfolgt werden, d.h. die Rückgabe +von ELINK ist zulässig. +
  +
Diese Funktion wird vom XFS_DOS noch nicht ordentlich +durchführt, es werden keine symbolischen Links erkannt. +
  +
Gruppe: Aufbau eines XFS +
  +
Querverweis: XFS-Konzept in MagiC   Fattrib   Fxattr +
  + +
+ +

11.21.2.2 xfs_chmod

+ + + + + + + + + + + + + + + +
Name: »xfs_chmod« - für Fchmod notwendig +
  +
Parameter: +
  + + + + + + + + + + + + +
a0 = DD * +
a1 = char *name +
d0 = int mode +
-> d0 = long errcode + +
+ +
Beschreibung: Ändert die Zugriffsrechte einer Datei. Die Parameter +entsprechen denen von Fchmod. Symbolische Links werden nicht verfolgt. +
  +
Wird vom XFS_DOS nicht unterstützt. +
  +
Gruppe: Aufbau eines XFS +
  +
Querverweis: XFS-Konzept in MagiC   Fchmod +
  + +
+ +

11.21.2.3 xfs_chown

+ + + + + + + + + + + + + + + +
Name: »xfs_chown« - für Fchown notwendig. +
  +
Parameter: +
  + + + + + + + + + + + + + + + +
a0 = DD * +
a1 = char *name +
d0 = uid +
d1 = gid +
-> d0 = long errcode + +
+ +
Beschreibung: Ändert den Eigner (User-ID und Group-ID) einer Datei. Die +Parameter entsprechen denen von Fchown. Symbolische Links werden nicht +verfolgt, d.h. Eigner und Gruppe des symbolischen Links werden +modifiziert. +
  +
Wird vom XFS_DOS nicht unterstützt. +
  +
Gruppe: Aufbau eines XFS +
  +
Querverweis: XFS-Konzept in MagiC   Fchown +
  + +
+ +

11.21.2.4 xfs_dclosedir

+ + + + + + + + + + + + + + + +
Name: »xfs_dclosedir« - schließt ein Verzeichnis +
  +
Parameter: +
  + + + + + + +
a0 = DHD *dhd +
-> d0 = long errcode + +
+ +
Beschreibung: Analog zu MiNT. +
  +
Gruppe: Aufbau eines XFS +
  +
Querverweis: XFS-Konzept in MagiC   Dclosedir +
  + +
+ +

11.21.2.5 xfs_dcntl

+ + + + + + + + + + + + + + + +
Name: »xfs_dcntl« - für Dcntl notwendig. +
  +
Parameter: +
  + + + + + + + + + + + + + + + +
a0 = DD * +
a1 = char *name +
d0 = int cmd +
d1 = long arg +
-> d0 = long errcode + +
+ +
Beschreibung: Für Dcntl. Jedes XFS sollte FUTIME unterstützen. +
  +
Gruppe: Aufbau eines XFS +
  +
Querverweis: XFS-Konzept in MagiC +
  + +
+ +

11.21.2.6 xfs_dcreate

+ + + + + + + + + + + + + + + +
Name: »xfs_dcreate« - erstellt ein Verzeichnis +
  +
Parameter: +
  + + + + + + + + + +
a0 = DD * +
a1 = char *name (ohne Pfad) +
-> d0 = long errcode + +
+ +
Beschreibung: Für Dcreate benötigt. +
  +
Gruppe: Aufbau eines XFS +
  +
Querverweis: XFS-Konzept in MagiC   Dcreate +
  + +
+ +

11.21.2.7 xfs_ddelete

+ + + + + + + + + + + + + + + +
Name: »xfs_ddelete« - löscht ein Verzeichnis +
  +
Parameter: +
  + + + + + + +
a0 = DD * +
-> d0 = long errcode + +
+ +
Beschreibung: Diese Funktion musste ab MagiC Version 4.01 geändert werden. +Für MagiC < 4.01 (Kernelversion < 3) gilt: +
  +
Beim Löschen ist darauf zu achten, daß kein Verzeichnis durch +den Kernel referenziert sein darf außer durch den Aufruf selbst (d.h. +es muß dd_refcnt == 1 sein). Außerdem ist darauf zu achten, daß +keine Dateien im Verzeichnis liegen. ELINK darf nicht zurückgegeben +werden, symbolische Links dürfen nicht behandelt werden. Die +Zugriffsberechtigung muß (falls eine existiert) vom XFS geprüft +werden. +
  +
Für MagiC < 4.01 (Kernelversion >= 3) gilt: +
  +
Wegen Reentranzproblematiken ergeben sich einigen Änderungen, +wobei der Kernel dem XFS Zugriffskontrollen abnimmt und weiterhin der +Kernel den DD freigibt, nicht das XFS: Der Kernel öffnet zunächst +mit xfs_path2DD den Parent des zu löschenden Verzeichnisses, dann +testet er mit xfs_xattr, ob es sich um einen Symlink handelt, und +löscht ihn ggf. per xfs_fdelete. +
  +
Handelt es sich um ein Verzeichnis, öffnet der Kernel dieses +wieder per xfs_path2DD (Modus 1) und gibt den Parent wieder per xfs_freeDD +frei. Die Überprüfung von dd_refcnt wird vom Kernel durchgeführt, +der Zähler kann und muß daher vom XFS ignoriert werden. Das XFS muß +nun sicherstellen, daß das zu löschende Verzeichnis bzw. der DD +nicht anderweitig geöffnet oder benutzt werden können (wichtig für +reentrante XFSs). Das XFS löscht dann das Verzeichnis, gibt aber den +DD nicht (!) frei, damit der Kernel im Erfolgsfall (Rückgabe E_OK) +vorher seine Standardpfade freigeben kann. Der Kernel ruft dann xfs_freeDD +auf. Wie gehabt, muß das XFS prüfen, ob das Verzeichnis leer ist, +bzw. Zugriffsberechtigungen existieren. +
  +
Nochmal im Zusammenhang: +
  +
    +
  • Kernel ermittelt zu löschenden DD, prüft Referenzzähler. +
      +

  • +
  • xfs_ddelete sperrt den DD. Wenn das nicht geht, wird EACCDN +geliefert. +
      +

  • +
  • xfs_ddelete löscht das Verzeichnis, wenn es leer ist. Der DD +wirkt dabei als Sperre für parallel laufende Versuche, das gerade +gelöschte Verzeichnis zu benutzen. +
      +

  • +
  • xfs_ddelete läßt den jetzt ungültigen, aber noch als Sperre +dienenden DD weiterhin gültig (im Gegensatz zum alten Konzept). +
      +

  • +
  • Der Kernel macht bei Erfolg seine Standardpfade ungültig. +
      +

  • +
  • Der Kernel gibt den DD frei. +
      +

  • +
+ +
Gruppe: Aufbau eines XFS +
  +
Querverweis: XFS-Konzept in MagiC   Ddelete +
  + +
+ +

11.21.2.8 xfs_dfree

+ + + + + + + + + + + + + + + +
Name: »xfs_dfree« - Anzahl freier Blöcke ermitteln. +
  +
Parameter: +
  + + + + + + + + + +
a0 = DD * +
a1 = long[4] +
-> d0 = long errcode + +
+ +
Beschreibung: Für Dfree. XFS_DOS ruft direkt den zuständigen DFS-Treiber +auf. +
  +
Gruppe: Aufbau eines XFS +
  +
Querverweis: XFS-Konzept in MagiC   Dfree +
  + +
+ +

11.21.2.9 xfs_DD2name

+ + + + + + + + + + + + + + + +
Name: »xfs_DD2name« - gibt den absoluten Pfadnamen zurück. +
  +
Parameter: +
  + + + + + + + + + + + + +
a0 = DD * +
a1 = char *name +
d0 = int bufsize +
-> d0 = long errcode + +
+ +
Beschreibung: Für Dgetpath und Dgetcwd. Nach <name> wird der Pfad +kopiert der zum übergebenen Verzeichnis gehört. Der Pfad muß ohne +folgenden '\' zurückgegeben werden, d.h. ein Leerstring für das +Wurzelverzeichnis. <bufsize> versteht sich, wie überall, +inklusive abschließendes Nullbyte. Wenn der Puffer zu klein ist +(bufsize kleiner als der Pfad), muß wie in MiNT ERANGE zurückgegeben +werden. +
  +
Gruppe: Aufbau eines XFS +
  +
Querverweis: XFS-Konzept in MagiC +
  + +
+ +

11.21.2.10 xfs_dopendir

+ + + + + + + + + + + + + + + +
Name: »xfs_dopendir« - öffnet ein Verzeichnis +
  +
Parameter: +
  + + + + + + + + + +
a0 = DD * +
d0 = int tosflag +
-> d0 = DHD *dhd oder Fehlercode + +
+ +
Beschreibung: Für Dopendir. Als <tosflag> sind z.Zt. nur 0 und 1 +erlaubt. Ist <tosflag> == 0, werden Dateinamen nicht +abgeschnitten, und die ersten 4 Bytes, die von D(x)readdir +zurückgegeben werden, enthalten den Datei-Index. +
  +
Ist <tosflag> == 1, muß dreaddir die Dateinamen auf 8+3 +und Großschrift kürzen und darf keine Dateikennung zurückgeben. +
  +
Gruppe: Aufbau eines XFS +
  +
Querverweis: XFS-Konzept in MagiC   Dopendir   Dreaddir   Dxreaddir +
  + +
+ +

11.21.2.11 xfs_dpathconf

+ + + + + + + + + + + + + + + +
Name: »xfs_dpathconf« - ermittelt verschiedene Limits +
  +
Parameter: +
  + + + + + + + + + +
a0 = DD * +
d0 = int which +
-> d0 = long value + +
+ +
Beschreibung: Wie in MiNT. XFS_DOS ruft direkt den zuständigen DFS-Treiber +auf. <which> kann folgende Werte annehmen: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
DP_MAXREQ (-1) ermittle max. gültigen Wert für <which> +
DP_IOPEN (0) internes Limit für Anzahl offener Dateien +
DP_MAXLINKS (1) maximale Anzahl Links für eine Datei +
DP_PATHMAX (2) maximale Länge für vollen Pfadnamen +
DP_NAMEMAX (3) maximale Länge für Dateinamen +
DP_ATOMIC (4) Blockgröße +
DP_TRUNC (5) Dateinamen-Verkürzung liefert: + + + + + + + + + +
DP_NOTRUNC (0) nie kürzen, ggf. ERANGE +
DP_AUTOTRUNC (1) auf max. Länge gekürzt +
DP_DOSTRUNC (2) Verkürzung auf 8+3 + +
+ +
DP_CASE (6) Groß-/Kleinschreibung liefert: + + + + + + + + + +
DP_CASESENS (0) unterschieden +
DP_CASECONV (1) in Großschrift gewandelt +
DP_CASEINSENS (2) nicht unterschieden und nicht gewandelt + +
+ + +
+ +
Ab der MagiC Version vom 21.5.95 wird weiterhin unterstützt: +
  + + + + + + +
DP_MODEATTR (7) (vgl. Dpathconf) +
DP_XATTRFIELDS (8) (vgl. Dpathconf) + +
+ +
Gruppe: Aufbau eines XFS +
  +
Querverweis: XFS-Konzept in MagiC   Dpathconf +
  + +
+ +

11.21.2.12 xfs_dreaddir

+ + + + + + + + + + + + + + + +
Name: »xfs_dreaddir« - liest nächsten Verzeichniseintrag +
  +
Parameter: +
  + + + + + + + + + + + + + + + + + + +
a0 = DHD *dhd +
d0 = int size +
a1 = char *buf +
d1 = XATTR *xattr oder NULL +
d2 = long *xr (wenn xattr != NULL) +
-> d0 = long errcode + +
+ +
Beschreibung: Wie in MiNT. Übernimmt sowohl Dreaddir als auch Dxreaddir. +
  +
Gruppe: Aufbau eines XFS +
  +
Querverweis: XFS-Konzept in MagiC +
  + +
+ +

11.21.2.13 xfs_drewinddir

+ + + + + + + + + + + + + + + +
Name: »xfs_drewinddir« - Directory Handle auf 1. Eintrag setzen. +
  +
Parameter: +
  + + + + + + +
a0 = DHD * dhd +
-> d0 = long errcode + +
+ +
Beschreibung:Wie in MiNT. +
  +
Gruppe: Aufbau eines XFS +
  +
Querverweis: XFS-Konzept in MagiC   Drewinddir +
  + +
+ +

11.21.2.14 xfs_drv_close

+ + + + + + + + + + + + + + + +
Name: »xfs_drv_close« - erzwingt einen Diskwechsel. +
  +
Parameter: +
  + + + + + + + + + +
a0 = DMD * +
d0 = int mode +
-> d0 = long errcode + +
+ +
Beschreibung: Auch diese Funktion erfüllt, abhängig vom <mode>, zwei +Aufgaben: +
  + +
    +
  1. mode = 0: +
    Der Kernel bittet das XFS, das Laufwerk, wenn möglich, zu +schließen. Wenn dies nicht erlaubt ist, muß EACCDN geliefert werden, +sonst sind alle Strukturen freizugeben bzw. Caches zurückzuschreiben +und E_OK als Rückgabewert zu liefern. +
      +
    Geöffnete Dateien werden bereits vom Kernel erkannt und das +Schließen verhindert. Dabei können aber nur solche Dateien erkannt +werden, die ein Handle haben und dem Kernel bekannt sind. Der Kernel +ruft sicherheitshalber vor Aufruf dieser Funktion xfs_sync auf, falls +ein Write-Back-Cache verwendet wird. Diese Vorgehensweise wird auch +dann durchgeführt, wenn einmal ein Mechanismus eingebaut wird, der +den Auswurfknopf von Wechselplattenlaufwerken oder CD-ROM abfragt und +ggf. den Auswurf verweigert. +
      +

  2. +
  3. mode = 1: +
    Der Kernel erzwingt das Schließen, das XFS muß E_OK liefern. Es +dürfen keine Caches zurückgeschrieben werden, da das Laufwerk +bereits ungültig ist (nachdem ein Diskwechsel bereits gemeldet +wurde). DDs und FDs brauchen nicht freigegeben zu werden, soweit sie +vom Kernel noch referenziert werden, d.h. der Kernel führt auch nach +dem Diskwechsel noch xfs_freeDD bzw. dev_close aus. +
      +

  4. +
+ +
Das interne DOS_XFS leitet den Aufruf an die gleichnamige +Funktion des DFS weiter, außerdem werden ggf. XFS-Strukturen +freigegeben. +
  +
Gruppe: Aufbau eines XFS +
  +
Querverweis: XFS-Konzept in MagiC +
  + +
+ +

11.21.2.15 xfs_drv_open

+ + + + + + + + + + + + + + + +
Name: »xfs_drv_open« - DMD (Mediach) testen/initialisieren. +
  +
Parameter: +
  + + + + + + +
a0 = DMD * +
-> d0 = long errcode + +
+ +
Beschreibung: MagiC unterstützt genau 26 gleichzeitig aktive Dateisysteme +denen die Buchstaben 'A'..'Z' zugeordnet sind. Dieser Eintrag hat zwei +Aufgaben: +
  + +
    +
  1. Beim ersten Zugriff auf ein Laufwerk (etwa D:) legt der Kernel +einen DMD (drive media descriptor) an und "bietet" diesen +den XFSs an. Der Eintrag d_xfs ist noch ein Nullzeiger, d_drive ist +initialisiert (zwischen 0 und 25, entsprechend 'A'..'Z'). +
      +
    Die XFS-Treiber versuchen nun, auf dem Laufwerk "ihr" +Dateisystem zu erkennen. Falls dies gelingt, müssen d_xfs und d_root +initialisiert werden, der Rückgabewert ist dann E_OK. Andernfalls +wird EDRIVE gemeldet, und der Kernel probiert das nächste XFS. +
      +
    Achtung: Die root darf während der Lebensdauer eines +gemounteten Dateisystems nicht freigegeben werden. Der Referenzzähler +der root sollte mit 1 vorbesetzt werden, um zu verhindern, daß er per +free_DD freigegeben wird. In den Versionen vor MagiC 4.01 war dies +nicht notwendig, weil der Referenzzähler (in unsauberer Weise) vor +dem Aufruf von path2DD nicht inkrementiert und nachher dekrementier +wurde. +
      +

  2. +
  3. Beim wiederholten Zugriff ist d_xfs bereits initialisiert, und +das XFS hat die Gelegenheit, auf Mediumwechsel zu testen. Ist alles in +Ordnung, muß E_OK zurückgegeben werden. Ansonsten muß die +Diskwechselroutine des Kernels aufgerufen und E_CHNG zurückgegeben +werden. Den Zeiger auf die Diskwechselroutine des Kernels erhält man +bei der Installation des XFS. +
      +

  4. +
+ +
Das interne DOS_XFS leitet den Aufruf an die gleichnamige +Funktion des DFS weiter, d.h. alle DFS-Treiber werden durchprobiert. +
  +
Gruppe: Aufbau eines XFS +
  +
Querverweis: XFS-Konzept in MagiC +
  + +
+ +

11.21.2.16 xfs_fdelete

+ + + + + + + + + + + + + + + +
Name: »xfs_fdelete« - löscht eine Datei. +
  +
Parameter: +
  + + + + + + + + + +
a0 = DD * +
a1 = char *name (ohne Pfad) +
-> d0 = long errcode + +
+ +
Beschreibung: Für Fdelete. Beim Löschen eines Symlinks darf nur dieser +gelöscht werden, nicht etwa eine referenzierte Datei. D.h. der +Rückgabewert ELINK ist hier _UNZULÄSSIG_. +
  +
Zugriffsrecht-Überprüfungen obliegen vollständig dem XFS. +Beim Löschen ist darauf zu achten, daß keine Datei durch den Kernel +referenziert sein darf (d.h. fd_refcnt != 0). +
  +
Gruppe: Aufbau eines XFS +
  +
Querverweis: XFS-Konzept in MagiC +
  + +
+ +

11.21.2.17 xfs_flags

+ + + + + + + + + + + + + + + +
Name: »xfs_flags« - Flags analog zu MiNT +
  +
Parameter: — +
  +
Beschreibung: Reserviert. Sollte eigentlich Flags enthalten. Wird jedoch vom +MagiC Kernel nicht verwendet. Also bitte nicht verwenden! +
  +
Gruppe: Aufbau eines XFS +
  +
Querverweis: XFS-Konzept in MagiC +
  + +
+ +

11.21.2.18 xfs_fopen

+ + + + + + + + + + + + + + + +
Name: »xfs_fopen« - öffnet oder erstellt eine Datei. +
  +
Parameter: +
  + + + + + + + + + + + + + + + + + + +
a0 = DD * +
a1 = char *name (ohne Pfad) +
d0 = int omode (fürs Öffnen) +
d1 = int attrib (fürs Erstellen) +
-> d0 = FD * oder Fehlercode +
-> a0 = SYMLINK * + +
+ +
Beschreibung: Wird für die Funktionen Fopen und Fcreate verwendet. Der +Open-Modus ist im niederwertigen Byte anders als in MiNT, weil die +MiNT-Modi für die Implementierung der Abfragen ungünstig sind. Beim +Aufrufen von Fopen über Trap #1 werden die MiNT-Modi vom Kernel in +die internen Modi konvertiert. Hier die internen Modi, die vom +XFS-Treiber bearbeitet werden müssen (NOINHERIT wird nicht +unterstützt, weil nach TOS-Konvention nur die Handles 0..5 vererbt +werden). Ansonsten entspricht das HiByte den MiNT-Konventionen: +
  +
OM_RPERM   EQU  1   // Datei ist zum Lesen geöffnet
+OM_WPERM   EQU  2   // Datei ist zum Schreiben geöffnet
+OM_EXEC    EQU  4   // Datei ist zum Ausführen geöffnet
+OM_APPEND  EQU  8   // Schreibzugriffe ans Ende (Kernel!)
+OM_RDENY   EQU  16  // andere dürfen nicht gleichz. lesen
+OM_WDENY   EQU  32  // "" "" nicht gleichz. schreiben
+OM_NOCHECK EQU  64  // KEINE Überprüfung durch den Kernel
+
+
Das Bit OM_APPEND wird vom Kernel bei Aufruf von Fwrite() +automatisch beachtet, der Kernel führt vor jedem Schreibzugriff ein +Fseek() aus. +
  +
OM_NOCHECK wird vom Kernel gesetzt, wenn eine Datei als Device, +d.h. als Handle -1,-2,-3 oder -4 geöffnet bzw. auf ein solches Handle +umgelenkt (Fforce) wird. Ist dieses Bit gesetzt, sollte das XFS keine +Prüfung auf mehrfaches Öffnen der Datei machen (siehe auch unten bei +fd_mode), sondern dies dem Gerätetreiber überlassen. +
  +
Hier die Bits, die wie im MiNT verwendet werden: +
  +
O_CREAT EQU  $200 // Datei erstellen, falls nicht existiert
+O_TRUNC EQU  $400 // Datei leeren, falls existiert
+O_EXCL  EQU  $800 // nicht öffnen, falls existiert
+
+
Der Kernel führt Fcreate aus als Fopen (O_CREAT +O_RDWR + +O_TRUNC). O_COMPAT (d.h. nur der TOS-Modus 0,1 oder 2 angegeben, ist +in MagiC immer gleichbedeutend mit O_WDENY. +
  +
Die Überprüfung der Zugriffsrechte obliegt vollständig dem +XFS, der Kernel tut nichts. Das wäre auch wenig sinnvoll, da jedes +Dateisystem seine eigenen Mechanismen und Rechte hat. Zurückgegeben +wird dem Kernel ein Zeiger auf einen geöffneten FD, d.h. das +Öffnen des Dateitreibers muß vom XFS durchgeführt werden. Der +Referenzzähler des zurückgegebenen FDs ist vom XFS zu erhöhen bzw. +beim ersten Öffnen auf 1 zu initialisieren. Für symbolische Links +und Diskwechsel gilt dasselbe wie bei xfs_sfirst. +
  +
Fopen wird unter MiNT folgendermaßen zurückgeführt: +
  + +
    +
  1. per <lookup> Konvertierung pathname->fcookie +
  2. +
  3. per <getxattr> Ermittlung der Zugriffsrechte +
  4. +
  5. Test der Zugriffsrechte durch den Kernel +
  6. +
  7. per <getdev> Ermittlung des Dateitreibers +
  8. +
  9. per <getdev->open> Öffnen der Datei +
  10. +
+ +
Dieses Verfahren ist sehr langwierig. DOS gibt beim Suchen der +Datei bereits einen Zeiger auf den 32-Byte-Verzeichniseintrag zurück, +der direkt zum Überprüfen des Attributs und damit der Zugriffsrechte +und auch zum Öffnen der Datei dient. MagiC erwartet daher direkt die +Implementation des Fopen-Befehls mit allen Überprüfungen der +Zugriffsrechte. Zurückgeliefert wird eine FD-Struktur, in die der +Dateitreiber eingetragen und geöffnet wurde. +
  +
Gruppe: Aufbau eines XFS +
  +
Querverweis: XFS-Konzept in MagiC +
  + +
+ +

11.21.2.19 xfs_freeDD

+ + + + + + + + + + + + + + + +
Name: »xfs_freeDD« - gibt einen DD frei. +
  +
Parameter: +
  + + + + + + +
a0 = DD * +
-> void + +
+ +
Beschreibung: Der Kernel hat den Referenzzähler eines DD auf 0 +dekrementiert, der DD wird also vom Kernel nicht mehr referenziert. +Die Funktion wird z.B. aufgerufen, wenn der Kernel nach dem Fopen() +den Pfad, in dem die geöffnete Datei liegt und der an xfs_fopen +übergeben worden war, nicht mehr benötigt. XFSs, die keine garbage +collection machen, können über diese Funktion ihre DDs freigeben. +
  +
Es muss sichergestellt werden, daß die root nie freigegeben +wird. Entweder baut man hier eine spezielle Abfrage ein, oder +(eleganter) setzt den Referenzzähler der root bei drv_open bereits +auf 1. +
  +
Gruppe: Aufbau eines XFS +
  +
Querverweis: XFS-Konzept in MagiC +
  + +
+ +

11.21.2.20 xfs_garbcoll

+ + + + + + + + + + + + + + + +
Name: »xfs_garbcoll« - Garbage Collection. +
  +
Parameter: +
  + + + + + + +
a0 = DMD *d +
-> d0 = 1L oder 0L + +
+ +
Beschreibung: Der Kernel benötigt dringend internen GEMDOS-Speicher und +macht eine Müllsammlung (garbage collection). Ein XFS, das die +interne Speicherverwaltung des Kernels nicht verwendet, kann hier +einen Nullpointer als Funktion eintragen. +
  +
Achtung: Es sollten möglichst soviele Blöcke wie +möglich freigegeben werden, Rückgabe ist 1, wenn (mindestens) ein +Block freigegeben werden konnte. Bei einer garbage collection +durchläuft der Kernel die gesamte Liste aller angemeldeten logischen +Laufwerke. Das XFS wird also so oft um eine garbage collect ersucht, +wie es zu diesem Zeitpunkt Laufwerke verwaltet. +
  +
Gruppe: Aufbau eines XFS +
  +
Querverweis: XFS-Konzept in MagiC +
  + +
+ +

11.21.2.21 xfs_init

+ + + + + + + + + + + + + + + +
Name: »xfs_init« - Initialisierung. +
  +
Parameter: — +
  +
Beschreibung: Reserviert. Enthält im Fall MagiC interner XFSs deren +Initialisierung. Wird bei nachgeladenen XFSs nicht verwendet. +
  +
Gruppe: Aufbau eines XFS +
  +
Querverweis: XFS-Konzept in MagiC +
  + +
+ +

11.21.2.22 xfs_link

+ + + + + + + + + + + + + + + +
Name: »xfs_link« - für Frename und Flink notwendig. +
  +
Parameter: +
  + + + + + + + + + + + + + + + + + + +
a0 = DD *olddir +
a1 = DD *newdir +
d0 = char *oldname +
d1 = char *newname +
d2 = int flag_link +
-> d0 = long errcode + +
+ +
Beschreibung: Wird sowohl für Frename (d2 = 0) als auch für Flink (d2 = 1) +verwendet. Im Fall Frename ist ein neuer Verzeichniseintrag zu +erstellen und der alte Eintrag (Verweis auf die Datei) zu löschen +oder zu überschreiben. +
  +
Im Fall Flink wird ein weiterer Verweis auf dieselbe Datei +angelegt und der alte Eintrag nicht gelöscht. Beide DDs liegen immer +auf demselben Dateisystem, haben also denselben DMD. Wie bei Fdelete +ist im Fall eines symbolischen Links dieser umzubenennen bzw. ein +weiterer Link zu erstellen. D.h. der Rückgabewert ELINK ist hier (wie +bei xfs_fdelete) _UNZULÄSSIG_. +
  +
Flink wird vom DOS_XFS nicht unterstützt. +
  +
Gruppe: Aufbau eines XFS +
  +
Querverweis: XFS-Konzept in MagiC +
  + +
+ +

11.21.2.23 xfs_name

+ + + + + + + + + + + + + + + +
Name: »xfs_name« - Name des Dateisystems +
  +
Parameter: — +
  +
Beschreibung: Der Name ist bisher nur Kommentar; er soll irgendwann auch +einmal die Möglichkeit bieten, festzustellen, welche Treiber +installiert sind und wie z.B. der für Laufwerk A: zuständige Treiber +heißt (d.h. was für ein Dateisystem die Diskette enthält). +
  +
Der Name des integrierten XFS lautet "DOS_XFS " (auf 8 +Zeichen per Leerstellen erweitert). +
  +
Gruppe: Aufbau eines XFS +
  +
Querverweis: XFS-Konzept in MagiC +
  + +
+ +

11.21.2.24 xfs_next

+ + + + + + + + + + + + + + + +
Name: »xfs_next« - nächster Treiber. +
  +
Parameter: — +
  +
Beschreibung: Ist einfach ein Verkettungszeiger auf den nächsten Treiber. +Ein neuer Treiber wird vorn eingebunden, hat also immer höchste +Priorität. Damit ist es z.B. möglich, den integrierten DOS-Treiber +zu überladen. +
  +
Gruppe: Aufbau eines XFS +
  +
Querverweis: XFS-Konzept in MagiC +
  + +
+ +

11.21.2.25 xfs_path2DD

+ + + + + + + + + + + + + + + +
Name: »xfs_path2DD« - gibt einen DD zum Pfadnamen zurück. +
  +
Parameter: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
mode = 0: name ist Datei +
= 1: name ist selbst Verzeichnis +
d0 = int mode +
a0 = DD *reldir akt. Verzeichnis +
a1 = char *pathname +
-> d0 = DD * +
d1 = char *restpfad +
oder   +
-> d0 = ELINK +
d1 = Restpfad ohne beginnenden '\' +
a0 = FD des Pfades, in dem der symbolische Link liegt. Dies ist +wichtig bei relativen Pfadangaben im Link. +
a1 = NULL, Der Pfad stellt den Parent des Wurzelverzeichnisses dar. +
oder   +
a1 = Pfad des symbolischen Links + +
+ +
Beschreibung: Der Kernel unterscheidet zwischen zwei Typen von Deskriptoren, +Dateideskriptoren FD, file descriptor) und Verzeichnisdeskriptoren +(DD, directory descriptor), die aber im Aufbau identisch sein können. +Diese Funktion liefert zu einem Pfad einen Deskriptor zurück. Der +Referenzzähler des DD muß jedesmal, wenn er als Funktionswert +zurückgeliefert wird, um 1 erhöht werden, weil er vom Kernel +referenziert wird. Die Funktion path2DD entspricht einem +"Öffnen" des Pfades, es wird eine Art +"Dateihandle" dem Kernel zurückgegeben, das der Kernel +wieder schließen muß. Das Parsen des Pfades muß immer vom XFS +erledigt werden. +
  +
Eingabeparameter: +
  + + + + + + + + + +
<mode> Legt fest, ob das letzte Pfadelement selbst ein Verzeichnis ist +(mode == 1), oder ob der Pfad ermittelt werden soll, in dem diese +Datei liegt. +
<reldir> Verzeichnis, von dem aus gesucht werden soll. +
<pathname> Der Pfadname, ohne Laufwerkbuchstaben und ohne führendes '\'. + +
+ +
Ausgabeparameter: +
  +
1. Fall: Es ist ein Fehler aufgetreten +
  +
<d0> enthält den Fehlercode +
  +
2. Fall: Ein Verzeichnisdeskriptor (DD) konnte ermittelt werden. +
  + + + + + + +
<d0> Zeiger auf den DD. Der Referenzzähler des DD wurde vom XFS +um 1 erhöht. +
<d1> Zeiger auf den restlichen Dateinamen ohne beginnenden '\' bzw. +'/'. Wenn das Ende des Pfades erreicht wurde, zeigt dieser Zeiger auf +das abschliessende Nullbyte. + +
+ +
3. Fall: Das XFS ist bei der Pfadauswertung auf einen +symbolischen Link gestoßen +
  + + + + + + + + + + + + +
<d0> enthält den internen MagiC Fehlercode ELINK +
<d1> Zeiger auf den restlichen Pfad ohne beginnenden '\' bzw. '/' +
<a0> enthält den DD des Pfades, in dem der symbolische Link liegt. +Der Referenzzähler des DD wurde vom XFS um 1 erhöht. +
<a1> ist der Zeiger auf den Link selbst. Ein Link beginnt mit einem +Wort (16 Bit) für die Länge des Pfads, gefolgt vom Pfad selbst. + +
+ +
Achtung: Die Länge muß INKLUSIVE abschließendes +Nullbyte und außerdem gerade sein. Der Link muß auf einer geraden +Speicheradresse liegen. +
  +
Der Puffer für den Link kann statisch oder auch flüchtig sein, +da der Kernel die Daten sofort umkopiert, ohne daß zwischendurch ein +Kontextwechsel stattfinden kann. +
  +
Wird a1 == NULL übergeben, wird dem Kernel signalisiert, daß +der Parent des Wurzelverzeichnisses angewählt wurde. Befindet sich +der Pfad etwa auf U:\A, kann der Kernel auf U:\ zurückgehen. Der Wert +des Rückgaberegisters a0 wird vom Kernel ignoriert, es darf daher +kein Referenzzähler erhöht werden. +
  +
Gruppe: Aufbau eines XFS +
  +
Querverweis: XFS-Konzept in MagiC +
  + +
+ +

11.21.2.26 xfs_pterm

+ + + + + + + + + + + + + + + +
Name: »xfs_pterm« - teilt ein Programmende mit. +
  +
Parameter: +
  + + + + + + +
a0 = PD * +
-> void + +
+ +
Beschreibung: Diese Funktion wird bei jedem Programmende aufgerufen und gibt +dem XFS Gelegenheit, internen Strukturen freizugeben oder Locks zu +entfernen. Die für den Kernel sichtbaren Dateien (d.h. die, denen ein +Handle zugeordnet ist), werden vorher vom Kernel geschlossen. Die +Referenzzähler für Standardverzeichnisse werden ebenfalls vorher +durch den Kernel dekrementiert. Übergeben wird in a0 ein Zeiger auf +einen Prozeß-Deskriptor. +
  +
Gruppe: Aufbau eines XFS +
  +
Querverweis: XFS-Konzept in MagiC +
  + +
+ +

11.21.2.27 xfs_readlink

+ + + + + + + + + + + + + + + +
Name: »xfs_readlink« - liest einen symbolischen Link. +
  +
Parameter: +
  + + + + + + + + + + + + + + + +
a0 = DD * +
a1 = char *name +
d0 = char *buf +
d1 = int size +
-> d0 = long errcode + +
+ +
Beschreibung: Für Freadlink. Wird vom DOS_XFS unterstützt. +
  +
Gruppe: Aufbau eines XFS +
  +
Querverweis: XFS-Konzept in MagiC +
  + +
+ +

11.21.2.28 xfs_rlabel

+ + + + + + + + + + + + + + + +
Name: »xfs_rlabel« - liest den Disknamen. +
  +
Parameter: +
  + + + + + + + + + + + + + + + +
a0 = DD * +
a1 = char *name +
d0 = char *buf +
d1 = int len +
-> d0 = long errcode + +
+ +
Beschreibung: Zum Lesen des Medien-Namens. Wird vom Kernel dann aufgerufen, +wenn Fsfirst mit (Attribut == 8) durchgeführt wird. <name> ist +i.a. "*.*" und kann ignoriert werden. <len> ist die +Länge des Puffers <buf>, bei Überschreitung muß ERANGE +geliefert werden. Wird auch für Dreadlabel() aufgerufen. In diesem +Fall ist name == NULL. +
  +
Gruppe: Aufbau eines XFS +
  +
Querverweis: XFS-Konzept in MagiC +
  + +
+ +

11.21.2.29 xfs_sfirst

+ + + + + + + + + + + + + + + +
Name: »xfs_sfirst« - sucht die erste passende Datei. +
  +
Parameter: +
  + + + + + + + + + + + + + + + + + + +
a0 = DD * srchdir +
a1 = char *name (ohne Pfad) +
d0 = DTA * +
d1 = int attrib +
-> d0 = long errcode +
-> a0 = SYMLINK * (ggf. Symlink) + +
+ +
Beschreibung: Wird für Fsfirst benötigt. MiNT verwendet statt dieser +Funktion eine Kombination von Dreaddir und Fxattr, wozu aber sehr +viele Aufrufe des XFS-Treibers notwendig sind. Der reservierte Bereich +der DTA kann vom XFS frei verwendet werden, falls dieser zu klein +ist, muß mit ähnlichen heuristischen Methoden wie in MiNT +vorgegangen werden, d.h. Zeiger in die DTA eingetragen werden, die +auf fest angelegte Deskriptoren zeigen. +
  +
Diese Deskriptoren können aber nur nach heuristischen Methoden +freigegeben werden, weil man nie weiß, ob noch ein Fsnext kommt oder +nicht. Der Kernel ermittelt über path2DD bereits den vollständigen +Pfad, so daß nur noch der reine Dateiname in a1 übergeben wird. Wie +bei allen DOS-Aufrufen, die einen Pfad verarbeiten, muß das XFS +darauf achten, daß der DD für die Dauer der Bearbeitung geschützt +wird. Das ist besonders dann kritisch, wenn das Dateisystem reentrant +ist. +
  +
Ist eine gesuchte Datei ein symbolischer Link, muß als +Fehlercode in d0 ELINK und in a0 der Zeiger auf den Link übergeben +werden. Der Kernel ruft dann einfach Fxattr auf, um die DTA zu +füllen. Trat ein Diskwechsel auf, ist E_CHNG zurückzugeben, der +Kernel wiederholt dann automatisch die Funktion. Das gilt auch für +alle anderen Funktionen. +
  +
In jedem Fall muß dta_drive korrekt initialisiert werden, z.B. +per: dta.dta_drive = srchdir->dd_dmd->d_drive. Wird E_OK oder +ELINK zurückgegeben, ohne daß dta_drive initialisiert wurde, ist das +Resultat unvorhersehbar! +
  +
Gruppe: Aufbau eines XFS +
  +
Querverweis: XFS-Konzept in MagiC +
  + +
+ +

11.21.2.30 xfs_snext

+ + + + + + + + + + + + + + + +
Name: »xfs_snext« - sucht die nächste passende Datei. +
  +
Parameter: +
  + + + + + + + + + + + + +
a0 = DTA * +
a1 = DMD * +
-> d0 = long errcode, +
-> a0 = SYMLINK * (Symlink) + +
+ +
Beschreibung: Wird für Fsnext benötigt. Der Kernel hat aus der DTA +bereits das zugehörige Dateisystem ermittelt, dessen DMD in a1 +übergeben wird. Auch hier kann ein symbolischer Link auftreten. +
  +
Gruppe: Aufbau eines XFS +
  +
Querverweis: XFS-Konzept in MagiC +
  + +
+ +

11.21.2.31 xfs_symlink

+ + + + + + + + + + + + + + + +
Name: »xfs_symlink« - erstellt einen symbolischen Link. +
  +
Parameter: +
  + + + + + + + + + + + + +
a0 = DD * dir +
a1 = char *name +
d0 = char *to +
-> d0 = long errcode + +
+ +
Beschreibung: Für Fsymlink. Es muß unter dem neuen Namen <name> eine +Datei im Verzeichnis <dir> erstellt werden, die auf die Datei +<to> zeigt. Wird vom DOS_XFS unterstützt. +
  +
Gruppe: Aufbau eines XFS +
  +
Querverweis: XFS-Konzept in MagiC +
  + +
+ +

11.21.2.32 xfs_sync

+ + + + + + + + + + + + + + + +
Name: »xfs_sync« - synchronisiert das Dateisystem. +
  +
Parameter: +
  + + + + + + +
a0 = DMD *d +
-> long errcode + +
+ +
Beschreibung: Der Kernel teilt dem XFS mit, daß auf Laufwerk <d> alle +Puffer zurückzuschreiben sind. Übergeben wird in Register a0 ein +Zeiger auf einen DMD (drive media descriptor). Dieser wird vom Kernel +angelegt. +
  +
Zurückgeliefert wird ein Fehlercode. Wenn das XFS keine +Pufferverwaltung hat (z.B. eine RAMDisk), muß eine 0 geliefert +werden. Das interne DOS_XFS ruft einfach die gleichlautende DFS- +Funktion auf. +
  +
Gruppe: Aufbau eines XFS +
  +
Querverweis: XFS-Konzept in MagiC +
  + +
+ +

11.21.2.33 xfs_wlabel

+ + + + + + + + + + + + + + + +
Name: »xfs_wlabel« - schreibt den Disknamen. +
  +
Parameter: +
  + + + + + + + + + +
a0 = DD * +
a1 = char *name +
-> d0 = long errcode + +
+ +
Beschreibung: Zum (Um-)Benennen von Medien. Wird vom Kernel dann aufgerufen, +wenn Fcreate mit Attribut 8 durchgeführt werden. Wird der Diskname, +wie beim DOS-Dateisystem, als spezielle Datei abgelegt, müssen alle +anderen pfadbasierten XFS-Funktionen den Disknamen ignorieren. +
  +
Ein leerer Name oder ein aus "\xe5" bestehender +(Kompatibilität zu TOS) muß den Disknamen löschen (falls Medien +ohne Namen zulässig sind). Wird auch für Dwritelabel() aufgerufen. +
  +
Gruppe: Aufbau eines XFS +
  +
Querverweis: XFS-Konzept in MagiC +
  + +
+ +

11.21.2.34 xfs_xattr

+ + + + + + + + + + + + + + + +
Name: »xfs_xattr« - für Fxattr notwendig. +
  +
Parameter: +
  + + + + + + + + + + + + + + + + + + +
a0 = DD * +
a1 = char *name +
d0 = XATTR * +
d1 = int mode +
-> d0 = long errcode +
-> a0 = SYMLINK * + +
+ +
Beschreibung: Wird für Fxattr verwendet. Im Fall mode == 0 (d.h. folge +symbolischen Links) kann in d0 ELINK und in a0 ein Link zurückgegeben +werden, andernfalls ist ELINK unzulässig. +
  + + + + + + +
mode == 0: folge symbolischen Links (gib ggf. ELINK zurück) +
== 1: folge nicht (d.h. erstelle XATTR für den Link) + +
+ +
Gruppe: Aufbau eines XFS +
  +
Querverweis: XFS-Konzept in MagiC +
  + +
+ +

11.21.3 Datenstrukturen für ein XFS

+ +

Bei der Arbeit mit einem XFS sind die folgenden Datenstrukturen +wichtig: +

+ + + + + + + + + + + + + + + + + + +
DD (Verzeichnis-Deskriptor) +
DHD (Directory-Handle-Deskriptor) +
DMD (Medium-Deskriptor) +
DTA (Disk-Transfer-Area) +
FD (Datei-Deskriptor) +
MX_DEV (Gerätetreiber) + +
+ +

Querverweis: DFS-Strukturen   XFS-Konzept in MagiC +

+

11.21.3.1 Der Verzeichnis-Deskriptor (DD)

+ + + +

Die Verzeichnisdeskriptoren müssen vom XFS angelegt und +verwaltet werden. Alle Deskriptoren, die dem Kernel bekannt sind (d.h. +diejenigen, die für einen Prozeß als Standardpfad verwendet werden) +haben Referenzzähler ungleich Null. Eine Ausnahme bildet nur der DD +für das Wurzelverzeichnis eines Laufwerks; hier ist der +Referenzzähler immer 0, egal ob ein Prozeß das Wurzelverzeichnis als +Standardverzeichnis hat oder nicht. +

+

Für den Kernel sieht ein DD folgendermaßen aus, diese +Einträge müssen vom XFS angelegt werden: +

+
dd_dmd:      DS.L      1    /* 0x00: Zeiger auf DMD               */
+dd_refcnt:   DS.W      1    /* 0x04: Ref.zähler für Standardpfade */
+
+

Querverweis: XFS-Konzept in MagiC +

+
11.21.3.1.1 dd_dmd
+

Hier steht das zugehörige Dateisystem. +

+
11.21.3.1.2 dd_refcnt
+

Der Referenzzähler. Dieser Eintrag wird nur vom Kernel +verwendet, muß vom XFS beim Erstellen eines DD auf 0 initialiert +(bei der root am besten auf 1, s.o. bei xfs_drv_open) und bei jeder +Übergabe an den Kernel (-> xfs_path2DD) um 1 inkrementiert werden. +

+

D.h. daß xfs_path2DD beim Zurückgeben eines neuen DD (der +also vom Kernel sonst nicht referenziert wird) den Referenzzähler auf +1 setzen muß. +

+

Wenn der Referenzzähler ungleich 0 ist, hat der Kernel Zeiger +auf diesen DD, und er darf keinesfalls vom XFS freigegeben werden. Der +Kernel zählt den Referenzzähler jedesmal um 1 herunter, wenn er +einen DD nicht mehr benötigt. Erreicht der Zähler dabei Null, wird +xfs_freeDD aufgerufen. Das XFS kann dann den DD freigeben oder +ansonsten erst beim Aufruf von xfs_garbcoll (der "garbage +collection") oder bei xfs_drv_close. +

+

Achtung: Die root darf während der Lebensdauer eines +gemounteten Dateisystems nicht freigegeben werden. Der Referenzzähler +der root sollte mit 1 vorbesetzt werden, um zu verhindern, daß er per +free_DD freigegeben wird. +

+

Querverweis: XFS-Konzept in MagiC   Datenstrukturen für ein XFS +

+

11.21.3.2 Der Directory-Handle-Deskriptor (DHD)

+ + +

Die Directory-Handles werden für Dopendir/Dclosedir/Drewinddir +benötigt. Im Gegensatz zu den Dateideskriptoren (FD) hält der Kernel +keine Liste der geöffneten DHs. Wenn ein Prozeß terminiert, wird das +XFS über die Funktion xfs_pterm aufgerufen und muß alle für den +Prozeß angelegten DHs freigeben. +

+

Den Eigner eines DH kann das XFS über den Kernel-Zeiger +<act_pd> ermitteln. Für den Kernel sieht ein DH folgendermaßen +aus, diese Einträge müssen vom XFS angelegt werden: +

+
dhd_dmd:  DS.L   1   /* 0x00: Zeiger auf DMD  */
+
+

Querverweis: XFS-Konzept in MagiC   DMD +

+
11.21.3.2.1 dhd_dmd
+

Hier steht das zugehörige Dateisystem. +

+

11.21.3.3 Der Drive-Medium-Deskriptor (DMD)

+ + +

Der DMD wird vom Kernel (!) für jedes geöffnete Laufwerk +angelegt und auch ggf. wieder freigegeben. Hier legt der XFS alle +Daten an, die er sich für das Laufwerk merken muß. Die folgenden +Felder sind diejenigen, die der Kernel benötigt (Das Ur- Objekt, von +dem der XFS seinen XFS-DMD ableitet): +

+
d_xfs:      DS.L   1    /* 0x00: Der Dateisystemtreiber           */
+d_drive:    DS.W   1    /* 0x04: Laufwerknummer 0..25             */
+d_root:     DS.L   1    /* 0x06: Zeiger auf DD der Root           */
+d_biosdev:  DS.W   1    /* 0x0a: BIOS-Laufwerk oder -1            */
+d_driver:   DS.L   1    /* 0x0c: def. zus. mit devcode das Medium */
+d_devcode:  DS.L   1    /* 0x10: z.B. SCSI Target & Laufwerk      */
+d_dfs:      DS.L   1    /* 0x14: DOS-spez. Dateisystem-Treiber    */
+
+

Andere XFSs oder DFSs tragen weitere Daten in den DMD ein. Man +kann sich den DMD als eine Objektklasse vorstellen. Ein für das +DOS_XFS abgeleiteter DMD hat nur den zusätzlichen Eintrag d_dfs. Der +FAT-DFS trägt zusätzlich Daten wie die Clustergröße und die Anzahl +der Sektoren ein. +

+

Querverweis: XFS-Konzept in MagiC   DD +

+
11.21.3.3.1 d_xfs
+

Hier steht der zugehörige Dateisystemtreiber (XFS). Er wird von +xfs_drv_open eingetragen. +

+
11.21.3.3.2 d_drive
+

Hier steht, welchem logischen Laufwerk ('A' .. 'Z') das +Dateisystem zugeordnet ist. Das braucht nicht immer einem +BIOS-Laufwerk zu entsprechen. Dieser Wert wird immer +(!) vom Kernel eingetragen, wenn ein Laufwerk geöffnet wird, +bevor ein XFS eingetragen wird. +

+
11.21.3.3.3 d_root
+

Hier steht ein Zeiger auf den DD des Wurzelverzeichnisses. +

+
11.21.3.3.4 d_biosdev
+

Wenn es sich um eine Partition handelt, die mit BIOS +Rwabs behandelt wird, steht hier die BIOS-Gerätenummer. +Ansonsten muß -1 eingetragen werden (z.B. bei Laufwerk U: oder einer +Macintosh-Partition). +

+
11.21.3.3.5 d_driver
+

Bestimmt zusammen mit d_devcode das Medium. D.h. wenn d_driver +und d_devcode identisch sind, liegen beide Laufwerke auf demselben +Medium. D.h. wenn das Medium ausgeworfen werden soll, müssen beide +Dateisysteme gesperrt werden. Bei einer Harddisk-Partion ist d_biosdev +das BIOS-Laufwerk, d_driver ist beliebig (z.B. Zeiger +auf die XHDI-Struktur), d_devcode ist der XHDI-Code eines Mediums, d.h. +SCSI-Target und Gerätenummer (jew. ein WORD). +

+
11.21.3.3.6 d_devcode
+

Bestimmt zusammen mit d_driver das Medium. D.h. wenn d_driver +und d_devcode identisch sind, liegen beide Laufwerke auf demselben +Medium. D.h. wenn das Medium ausgeworfen werden soll, müssen beide +Dateisysteme gesperrt werden. Bei einer Harddisk-Partion ist d_biosdev +das BIOS-Laufwerk, d_driver ist beliebig (z.B. Zeiger auf die +XHDI-Struktur), d_devcode ist der XHDI-Code eines Mediums, d.h. +SCSI-Target und Gerätenummer (jew. ein WORD). +

+
11.21.3.3.7 d_dfs
+

Dieser Eintrag existiert zwingend nur für +DOS-Dateisysteme (also bereits für ein abgeleitetes Objekt) +und enthält einen Zeiger auf den DFS-Untertreiber. +

+

11.21.3.4 Die Disk-Transfer-Area DTA

+

Die DTA wird von den alten DOS-Funktionen Fsfirst und Fsnext +verwendet, deren ungeschickte Konzeption durch die MSDOS-Schöpfer +immer noch wie ein Fluch auf dem System lastet. Für den Kernel sieht +die Struktur folgendermaßen aus: +

+
dta_res1:        DS.B    20    /* 0x00: vom Kernel nicht benutzt */
+dta_drive:       DS.B     1    /* 0x14: logisches Laufwerk       */
+dta_attribute:   DS.B     1    /* 0x15: gefundenes Attribut      */
+dta_time:        DS.W     1    /* 0x16: gefundene Zeit           */
+dta_date:        DS.W     1    /* 0x18: gefundenes Datum         */
+dta_len:         DS.L     1    /* 0x1a: gefundene Länge          */
+dta_name:        DS.B    14    /* 0x1e: gefundener Dateiname     */
+
+

Hinweis: Die Komponenten dta_attribute bis +dta_name stellen den dokumentierten User-Bereich dar; dieser +muss nach GEMDOS-Spezifikation behandelt werden. +

+

Querverweis: XFS-Konzept in MagiC +

+
11.21.3.4.1 xfs_dta_res1
+

Wird vom Kernel nicht verwendet. Hier darf sich das XFS tummeln. +

+
11.21.3.4.2 xfs_dta_drive
+

Hier steht das zugehörige logische Laufwerk (0 +entspricht Laufwerk-A etc). Hierdurch kann der Kernel beim Fsnext +entscheiden, welches XFS die Anforderung ausführen muss. +

+

11.21.3.5 Der Datei-Deskriptor (FD)

+ + + +

Die Dateideskriptoren müssen vom XFS angelegt und verwaltet +werden. Alle Deskriptoren, die dem Kernel bekannt sind, haben +Referenzzähler ungleich Null. Für den Kernel sieht ein FD genauso +aus wie ein DD, weshalb im DOS_XFS die gleiche Datenstruktur +verwendet wird. +

+

Für den Kernel sieht ein FD folgendermaßen aus, diese +Einträge müssen vom XFS angelegt werden: +

+
fd_dmd:      DS.L    1   /* 0x00: Zeiger auf DMD                       */
+fd_refcnt:   DS.W    1   /* 0x04: Ref.zähler fürs Schließen oder -1    */
+fd_mode:     DS.W    1   /* 0x06: Open- Modus und flags                */
+fd_dev:      DS.L    1   /* 0x08: Zeiger auf MX_DEV                    */
+
+

Die vom DOS_XFS abgeleitete Klasse (ein "DOS-FD") hat +darüber hinaus noch die zusätzlichen Felder: +

+
fd_ddev:     DS.L    1    /* 0x0c: Zeiger auf MX_DDEV                  */
+fd_name:     DS.B   11    /* 0x10: DD_FD: Name im internen Format      */
+fd_attr:     DS.B    1    /* 0x1b: Attribut                            */
+fd_owner:    DS.L    1    /* 0x1c: DD_FD: Eigner eines FD oder NULL    */
+fd_parent:   DS.L    1    /* 0x20: Zeiger auf den Parent-DD_FD         */
+fd_children: DS.L    1    /* 0x24: DD_FD: Liste aller Kinder           */
+fd_next:     DS.L    1    /* 0x28: Zeiger auf FDs im selben Verzeichn. */
+fd_multi:    DS.L    1    /* 0x2c: Zeiger auf FD derselben Datei       */
+fd_multi1:   DS.L    1    /* 0x30: Zeiger auf erstes Listenelement     */
+fd_fpos:     DS.L    1    /* 0x34: Position des Dateizeigers           */
+fd_dirch:    DS.B    1    /* 0x38: Bit0: "dirty"                       */
+fd_unused:   DS.B    1    /* 0x39:                                     */
+fd_time:     DS.W    1    /* 0x3a: Zeit  (8086)                        */
+fd_date:     DS.W    1    /* 0x3c: Datum (8086)                        */
+fd_stcl:     DS.W    1    /* 0x3e: Start- Cluster                      */
+fd_len:      DS.L    1    /* 0x40: Dateilänge in Bytes                 */
+fd_dirpos:   DS.L    1    /* 0x44: Pos. des zug. Eintrags im Directory */
+fd_user1:    DS.L    1    /* 0x48: zur freien Verfügung                */
+fd_user2:    DS.L    1    /* 0x4c: zur freien Verfügung                */
+
+

Querverweis: XFS-Konzept in MagiC   DMD   MX_DDEV   MX_DEV +

+
11.21.3.5.1 fd_dmd
+

Hier steht das zugehörige Dateisystem. +

+
11.21.3.5.2 fd_refcnt
+

Der Referenzzähler. Dieser Eintrag wird nur vom Kernel +verwendet, muß beim Aufruf von dev_close dekrementiert und +durch xfs_fopen initialisiert werden (mit 1). +

+

Ein Referenzzähler von -1 signalisiert, daß der FD nie +freigegeben werden darf. Dies ist z.B. für die Gerätedateien +U:\DEV\CON, U:\DEV\AUX usw. notwendig, die immer zur Verfügung +stehen. +

+
11.21.3.5.3 fd_mode
+

Hier steht der Modus, wie bei xfs_fopen beschrieben. +Zeigen zwei FDs auf dieselbe Datei, müssen die Modi kompatibel sein. +Durch die einfache MagiC interne Modusdarstellung ist ein einfaches +Rotieren und verUNDen der Bits ausreichend, z.B: +

+
  move.w   fd_mode(a0),d1
+  btst     #BOM_NOCHECK,d1  ; kein Check durch das XFS?
+  bne.b    _opf_nxt         ; ja, ddev_open prüft
+  ror.b    #4,d1
+  and.b    d0,d1
+  bne      opd_eaccdn       ; Konflikt: return(EACCDN)
+
+
11.21.3.5.4 fd_dev
+

Dies ist der Zeiger auf den Gerätetreiber. +

+
11.21.3.5.5 fd_ddev
+

Hier muß das DFS beim Aufruf von dir2FD den MX_DDEV +eintragen, also den Gerätetreiber. +

+
11.21.3.5.6 fd_name
+

Hier wird der Name (8+3) im internen Format abgelegt. Der Name +ist nur gültig, wenn es sich um ein Unterverzeichnis handelt. +Der Name ist nur im Prototyp-FD, d.h. in fd->multi1 +gültig. Der Name der Root ist eine leere Zeichenkette. +

+
11.21.3.5.7 fd_attr
+

Hier wird das Datei-Attribut abgelegt. Dieses ist nur im +Prototyp-FD, d.h. in fd->multi1 gültig. Am Attribut kann man +erkennen, ob der FD ein Verzeichnis repräsentiert. +

+
11.21.3.5.8 fd_owner
+

Hier wird ein Zeiger auf den Eigner eines FD abgelegt (d.h. ein +Zeiger auf die Basepage). Ein Wert von NULL bedeutet, daß der +FD z.Zt. nicht belegt ist. +

+
11.21.3.5.9 fd_parent
+

Verkettungszeiger auf den Parent, d.h. auf das +Verzeichnis, in dem die Datei liegt bzw. das Elterverzeichnis eines +Unterverzeichnisses. fd_parent ist nur für den Prototyp-FD +gültig. +

+
11.21.3.5.10 fd_children
+

Liste aller geöffneten Dateien und geöffneten +Unterverzeichnisse. fd_children ist nur für den Prototyp-FD +gültig. +

+
11.21.3.5.11 fd_next
+

Zeiger auf den nächsten FD im selben Verzeichnis, d.h. auf das +nächste Geschwist, dieses kann eine geöffnete Datei oder ein +Unterverzeichnis sein, prinzipiell werden keine Unterschiede gemacht. +fd_next ist nur für den Prototyp-FD gültig. +

+
11.21.3.5.12 fd_multi
+

Wenn eine Datei mehrmals geöffnet wird, wird ein +'Clone' des Prototyp-FD angelegt. Für diesen Clone sind die +meisten Felder des FD ungültig, im wesentlichen sind nur Treiber, +Modus und Dateiposition gültig. fd_multi ist eine verkettete Liste, +die mit NULL abgeschlossen ist. +

+
11.21.3.5.13 fd_multi1
+

Der zugehörige Prototyp-FD, der die gültigen Dateiangaben +enthält. Wenn eine Datei nur einmal geöffnet ist, gilt: +fd->fd_multi == fd +

+
11.21.3.5.14 fd_fpos
+

Die Position des Dateizeigers, ist 0L bei einem Gerät. +

+
11.21.3.5.15 fd_dirch
+

Bit 0 zeigt an, ob eine Datei verändert wurde und daher beim +Schließen der Datei das Verzeichnis (fd_parent) aktualisiert +werden muß (passiert nicht, wenn es sich um einen Ordner handelt). +Die anderen Bits sind reserviert und werden teilweise vom +DOS_XFS verwendet. +

+
11.21.3.5.16 fd_unused
+

Unbenutzt und reserviert. +

+
11.21.3.5.17 fd_time
+

Uhrzeit aus dem Verzeichniseintrag im Intel-Format. +

+
11.21.3.5.18 fd_date
+

Datum aus dem Verzeichniseintrag im Intel-Format. +

+
11.21.3.5.19 fd_stcl
+

Start-Cluster im Motorola-Format. +

+
11.21.3.5.20 fd_len
+

Dateilänge in Bytes im Motorola-Format. +

+
11.21.3.5.21 fd_dirpos
+

Position des zugehörigen Eintrags im Parent. Ist nur für +den Prototyp-FD gültig. +

+
11.21.3.5.22 fd_user1
+

Zusammen mit fd_user2 2 Langworte zur freien Verfügung. +Das FAT_DFS speichert hier zusätzliche Informationen zu +fd_fpos ab, und zwar den aktuellen Cluster. Andere DFSs +können andere Daten ablegen. Diese Felder sind zunächst auch nur +für den Prototyp-FD gültig, es sei denn, beim Öffnen +(ddev_open) werden die Daten explizit aus dem Prototyp-FD in +den Clone kopiert. +

+
11.21.3.5.23 fd_user2
+

Zusammen mit fd_user1 2 Langworte zur freien Verfügung. +Das FAT_DFS speichert hier zusätzliche Informationen zu +fd_fpos ab, und zwar den aktuellen Cluster. Andere DFSs +können andere Daten ablegen. Diese Felder sind zunächst auch nur +für den Prototyp-FD gültig, es sei denn, beim Öffnen +(ddev_open) werden die Daten explizit aus dem Prototyp-FD in +den Clone kopiert. +

+

11.21.3.6 Der Gerätetreiber (MX_DEV)

+ +

Der Gerätetreiber wird beim Öffnen einer Datei vom XFS in den +Dateideskriptor eingesetzt und vom Kernel direkt aufgerufen. Der +Gerätetreiber muß die folgenden Funktionen bereitstellen: +

+
typedef struct _mx_dev
+{
+  LONG  (*dev_close)();
+  LONG  (*dev_read)();
+  LONG  (*dev_write)();
+  LONG  (*dev_stat)();
+  LONG  (*dev_seek)();
+  LONG  (*dev_datime)();
+  LONG  (*dev_ioctl)();
+  LONG  (*dev_getc)();
+  LONG  (*dev_getline)();
+  LONG  (*dev_putc)();
+} MX_DEV;
+
+

Querverweis: XFS-Konzept in MagiC +

+
11.21.3.6.1 dev_close
+ + + + + + + + + + + + + + + +
Name: »dev_close« +
  +
Parameter: +
  + + + + + + +
a0 = FD *file +
-> d0 = long errcode + +
+ +
Beschreibung: Wenn fd_refcnt nicht schon 0 ist, muß fd_refcnt dekrementiert +werden (dies muß vom MX_DEV erledigt werden). Bei dieser Gelegenheit +sollten auch möglicherweise vorhandene Puffer zurückgeschrieben bzw. +Verzeichniseinträge aktualisiert werden. Wenn fd_refcnt 0 ist, kann der +FD freigegeben werden. Beim Diskwechsel ist fd_refcnt bereits beim Aufruf +von dev_close 0, d.h. der FD muß einfach nur freigegeben werden. +
  +
Der vom DOS_XFS installierte Dateitreiber schreibt die +Verzeichnisdaten zurück und ruft dann den MX_DDEV-Untertreiber auf. +
  +
Gruppe: Gerätetreiber +
  +
Querverweis: — +
  + +
+ +
11.21.3.6.2 dev_datime
+

Für Fdatime. Der vom DOS_XFS installierte Dateitreiber +leitet den Aufruf an den MX_DDEV-Untertreiber weiter, wenn die Funktion +im MX_DDEV-Treiber unterstützt wird (Zeiger != NULL), ansonsten wird +die Funktion automatisch mit Hilfe der Daten des FD +ausgeführt. +

+

Parameter-Übergabe: +

+
+ + + + + + + + + + + + + + + + + + + + +
a0=FD *file
a1=int d[2]
d0=int setflag
-> d0=long errcode
+
+ +
11.21.3.6.3 dev_getc
+ + + + + + + + + + + + + + + +
Name: »dev_getc« +
  +
Parameter: +
  + + + + + + + + + +
a0 = FD *file +
d0 = int mode +
-> d0 = unsigned long c + +
+ +
Beschreibung: Wird vom Kernel für Fgetchar() und die zeichenorientierten +Funktionen (Cconin, Cconout, Cauxin usw.) verwendet. Im Fall eines +Geräts kann der Rückgabewert ein Langwort sein (so bei CON im Hiword +der Scancode der Taste), ansonsten ein Byte (immer als +"unsigned" erweitert). Bei EOF muß 0x0000FF1A geliefert +werden. +
  +
<mode> bedeutet: +
  + + + + + + + + + +
CMODE_COOKED (1) Bit 0 gesetzt: Steuerzeichen ^C, ^S, ^Q werden verarbeitet. +
CMODE_RAW (0) Bit 0 nicht gesetzt: "raw" Modus +
CMODE_ECHO (2) Bit 1 gesetzt: Eingabe wird ge-echo-t + +
+ +
Der vom DOS_XFS installierte Dateitreiber leitet den Aufruf an +den MX_DDEV-Untertreiber weiter, wenn die Funktion im MX_DDEV-Treiber +unterstützt wird (Zeiger != NULL), ansonsten wird die Funktion +automatisch auf dev_fread zurückgeführt. +
  +
Gruppe: Gerätetreiber +
  +
Querverweis: — +
  + +
+ +
11.21.3.6.4 dev_getline
+

Für zeilenorientierte Eingabe. <mode> wie in +dev_getc. Zurückgegeben wird die Anzahl der eingegebenen Zeichen ohne +Endezeichen o.ä. Der vom DOS_XFS installierte Dateitreiber leitet den +Aufruf an den MX_DDEV-Untertreiber weiter, wenn die Funktion im +MX_DDEV-Treiber unterstützt wird (Zeiger != NULL), ansonsten wird die +Funktion automatisch auf dev_fread zurückgeführt, die Zeile wird +dann mit CR und LF beendet, Steuerzeichen (BS oder Del) nicht +ausgewertet. +

+

Parameter-Übergabe: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
a0=FD *file
a1=char *buf
d1=long size
d0=int mode
-> d0=long amount
+
+ +
11.21.3.6.5 dev_ioctl
+

Für Fcntl. Der vom DOS_XFS installierte Dateitreiber +leitet den Aufruf direkt an den MX_DDEV-Untertreiber weiter. Bearbeitet +werden jedoch vorher folgende Funktionen: FSTAT und FUTIME. Diese +sollten auch von anderen XFSs ausgeführt werden. Jeder Dateitreiber +sollte FIONREAD und FIONWRITE unterstützen. +

+

Parameter-Übergabe: +

+
+ + + + + + + + + + + + + + + + + + + + +
a0=FD *file
d0=int cmd
a1=void *buf
-> d0=long errcode
+
+ +
11.21.3.6.6 dev_putc
+ + + + + + + + + + + + + + + +
Name: »dev_putc« +
  +
Parameter: +
  + + + + + + + + + + + + +
a0 = FD *file +
d0 = int mode +
d1 = long value +
-> d0 = unsigned long count + +
+ +
Beschreibung: Wird vom Kernel für Fgetchar() und die zeichenorientierten +Funktionen (Cconout, Cauxout usw.) verwendet. Im Fall eines Terminals +muß der Rückgabewert 4L sein (d.h. 4 Bytes geschrieben, ansonsten +1L, falls erfolgreich geschrieben wurde. +
  +
<mode> bedeutet: +
  + + + + + + +
CMODE_COOKED (1) Bit 0 gesetzt: Steuerzeichen ^C, ^S, ^Q werden verarbeitet. +
CMODE_RAW (0) Bit 0 nicht gesetzt: "raw" Modus + +
+ +
Der vom DOS_XFS installierte Dateitreiber leitet den Aufruf an +den MX_DDEV-Untertreiber weiter, wenn die Funktion im MX_DDEV-Treiber +unterstützt wird (Zeiger != NULL), ansonsten wird die Funktion +automatisch auf dev_fwrite zurückgeführt. +
  +
Gruppe: Gerätetreiber +
  +
Querverweis: — +
  + +
+ +
11.21.3.6.7 dev_read
+

Von Datei <file> werden <count> Bytes in den Puffer +<buffer> gelesen. Die Anzahl der tatsächlich gelesenen Zeichen +wird zurückgegeben. Der vom DOS_XFS installierte Dateitreiber leitet +den Aufruf direkt an den MX_DDEV-Untertreiber weiter. +

+

Parameter-Übergabe: +

+
+ + + + + + + + + + + + + + + + + + + + +
a0=FD *file
d0=long count
a1=char *buffer
-> d0=long amount
+
+ +
11.21.3.6.8 dev_seek
+

Für Fseek. <mode> ist, wie im TOS, 0, 1 oder 2. +Zurückgegeben wird die aktuelle Position des Schreib-/Lesezeigers, +Gerätetreiber müssen hier immer eine 0L zurückgeben. Der vom +DOS_XFS installierte Dateitreiber leitet den Aufruf direkt an den +MX_DDEV-Untertreiber weiter. +

+

Parameter-übergabe: +

+
+ + + + + + + + + + + + + + + + + + + + +
a0=FD *file
d0=long where
d1=int mode
-> d0=long position
+
+ +
11.21.3.6.9 dev_stat
+ + + + + + + + + + + + + + + +
Name: »dev_stat« +
  +
Parameter: +
  + + + + + + + + + + + + + + + +
a0 = FD *file +
a1 = MAGX_UNSEL *unselect oder NULL +
d0 = int rwflag +
d1 = long apcode +
-> d0 = long status + +
+ +
Beschreibung: Gibt den Lese-/Schreibstatus der Datei an. Wird z.B. bei +Fselect() aufgerufen (oder bei Cconos()/Cconis() usw.). Im Gegensatz +zu MiNT wird hier dem Treiber überlassen, ob er interruptfähig ist +oder nicht, d.h. ob er in der Lage ist, eine wartende Applikation im +Interrupt wieder aufzurufen oder nicht. rwflag gibt an, ob Schreib- +oder Lesestatus abgefragt wird. +
  +
<unselect> ist entweder NULL oder ein Zeiger auf folgende +Struktur: +
  +
typedef struct
+{
+   union
+   {
+      void (*unsel) (MAGX_UNSEL *un);
+      long status;
+   }
+   long param;
+} MAGX_UNSEL;
+
+
Vorgehensweise: +
  +
Allgemein gilt: Wenn <unselect> ungleich Null ist, muß +der Rückgabewert nicht nur als Funktionsergebnis (in d0.l), sondern +auch in unselect->status zurückgegeben werden. Das gilt für alle +Arten von Rückgabewerten. In unsel->param kann optional ein +Parameter abgelegt werden. +
  +
Wenn <apcode> == NULL ist, wird gepollt, d.h. die +Applikation wird nicht schlafengelegt. Also Rückgabe: +
  +
0 = nicht bereit, 1 = bereit, <0 = Fehler. +
  +
Wenn <apcode> != NULL ist (dann ist auch +<unselect> != NULL) wird zurückgegeben: +
  + + + + + + + + + + + + +
<0 Fehler +
0 nicht bereit, Gerät kann nur polling +
1 bereit +
>0 etwa Zeiger auf eine Funktion, die den Aufweckinterrupt wieder +deinstalliert (entspricht in etwa dem unselect in MiNT). + +
+ +
Falls das Gerät nicht bereit ist und interruptfähig ist, +geht man folgendermaßen vor: +
  + +
    +
  1. unselect mit der Adresse der Aufräumroutine und einem +optionalen Parameter initialisieren, Prototyp etwa: +
    void unselect( a0 = MAGX_UNSEL *un, a1 = void *ap_code );
    +
    +
  2. +
  3. Interrupt zum Aufwecken installieren, diesem unselect (und +damit auch den optionalen Parameter) und appl mitteilen. +
  4. +
  5. Zeiger auf Aufräumroutine in d0 zurückgeben. +
  6. +
+ +
Die Interruptroutine macht folgendes: +
  + +
    +
  1. Der Interrupt trifft ein. +
  2. +
  3. unselect->status wird mit 1 (ok) oder < 0 (nicht ok) +beschrieben und der Interrupt deaktiviert! Die Applikation wird +aufgeweckt mit +
    kernel->appl_IOcomplete( a0 = APPL *ap );
    +
    +
  4. +
+ +
Die Aufräumroutine macht folgendes: +
  + +
    +
  1. Der Interrupt wird deaktiviert. +
  2. +
  3. in unsel->status wird, falls noch nicht geschehen, eine 1 +(eingetroffen) oder 0 (nicht eingetroffen) oder < 0 (Fehler) +eingetragen. Es muß sichergestellt werden, daß kein IOcomplete und +kein Schreibzugriff auf unsel anschließend noch erfolgen kann. Ein +Wert ungleich 1, aber größer als Null wird immer als Adresse der +Aufräumroutine interpretiert, diese muß noch aufgerufen werden, wenn +der Interrupt nicht eingetroffen ist. Falls der Interrupt z.B. einen +Wert von 2L eintrüge, ginge der Kernel davon aus, daß der Interrupt +nicht eingetreten ist und immer noch die Adresse der Aufräumroutine +in der MAGX_UNSEL-Struktur steht. Ein Sprung nach Adresse 2 ist dann +aber schnell ziemlich tödlich. +
  4. +
+ +
Die DOS-Funktionen Finstat() und Foutstat() versuchen zunächst, +den Aufruf auf Fcntl (FIONREAD bzw. FIONWRITE) zurückzuführen. Wenn +diese Subfunktion von dev_ioctl nicht existiert (der Dateitreiber muß +EINVFN liefern!), wird dev_stat aufgerufen. In diesem Fall kann die +Aussage getroffen werden "Zeichen liegt an" (Wert == 1) bzw. +"kein Zeichen liegt an" (Wert == 0). +
  +
Der vom DOS_XFS installierte Dateitreiber leitet den Aufruf +direkt an den MX_DDEV-Untertreiber weiter. +
  +
Gruppe: Gerätetreiber +
  +
Querverweis: — +
  + +
+ +
11.21.3.6.10 dev_write
+

Auf Datei <file> werden <count> Bytes aus dem Puffer +<buffer> geschrieben. Die Anzahl der tatsächlich geschriebenen +Zeichen wird zurückgegeben. Der vom DOS_XFS installierte Dateitreiber +aktualisiert Zeit und Datum der Datei und leitet dann den Aufruf an +den MX_DDEV-Untertreiber weiter. +

+

Parameter-Übergabe: +

+
+ + + + + + + + + + + + + + + + + + + + +
a0=FD *file
d0=long count
a1=char *buffer
-> d0=long amount
+
+ +

11.21.4 Installation eines XFS

+ +

Ein XFS ist einfach ein Programm, das den Treiber installiert +und sich resident beendet. Die Installation erfolgt per kernel = +Dcntl (KER_INSTXFS, NULL, &myxfs). +

+

Man erhält einen Zeiger auf wichtige Kernelfunktionen oder +einen Fehlercode zurück. Die Kernelfunktionen kann man auch +unabhängig von der Installation eines XFS erfragen, und zwar per +kernel = Dcntl(KER_GETINFO, NULL, NULL). +

+

Die Deinstallation eines XFS ist nicht vorgesehen. +

+

11.21.5 Kernelfunktionen für ein XFS

+ +

MagiC stellt den installierten XFSs, DFSs oder Gerätetreibern +einige Kernelinformationen sowie -funktionen zur Verfügung. Bei den +Kernelfunktionen gilt dieselbe Registerkonvention wie für die +XFS-Funktionen, d.h. d0-d2 und a0-a2 können zerstört werden. Einen +Zeiger auf die Struktur, die die Kernelfunktionen enthält, bekommt +man über +

+
     kernel = Dcntl (KER_INSTXFS, NULL, &myxfs);   oder
+     kernel = Dcntl (KER_GETINFO, NULL, NULL);
+
+

Im ersten Fall wird ein XFS installiert, im zweiten Fall bekommt +man nur die Kernelstruktur (etwa für ein DFS oder einen +Gerätetreiber). Der Aufbau der Kernelstruktur im einzelnen: +

+ +
typedef struct
+{
+  WORD   mxk_version;
+  VOID (*mxk_fast_clrmem)      ( void *von, void *bis );
+  BYTE (*mxk_toupper)          ( char c );
+  VOID (*mxk__sprintf)         ( char *dest, char *source, LONG *p );
+  VOID  *mxk_mxk_act_pd;
+  APPL  *mxk_act_appl;
+  APPL  *mxk_keyb_app;
+  WORD  *mxk_pe_slice;
+  WORD  *mxk_pe_timer;
+  VOID (*mxk_appl_yield)       ( void );
+  VOID (*mxk_appl_suspend)     ( void );
+  VOID (*mxk_appl_begcritic)   ( void );
+  VOID (*mxk_appl_endcritic)   ( void );
+  LONG (*mxk_evnt_IO)          ( LONG ticks_50hz, void *unsel );
+  VOID (*mxk_evnt_mIO)         ( LONG ticks_50hz, void *unsel, WORD cnt );
+  VOID (*mxk_evnt_emIO)        ( APPL *ap );
+  VOID (*mxk_appl_IOcomplete)  ( APPL *ap );
+  LONG (*mxk_evnt_sem)         ( WORD mode, void *sem, LONG timeout );
+  VOID (*mxk_Pfree)            ( void *pd );
+  WORD   mxk_int_msize;
+  VOID  *mxk_int_malloc        ( void );
+  VOID   mxk_int_mfree         ( void *memblk );
+  VOID   mxk_resv_intmem       ( void *mem, LONG bytes );
+  LONG   mxk_diskchange        ( WORD drv );
+  LONG   mxk_DMD_rdevinit      ( DMD *dmd );
+  LONG   mxk_proc_info         ( WORD code, PD *pd );
+  LONG   mxk_mxalloc           ( d0 = LONG amount, d1 = WORD mode, a0 = PD *pd );
+  LONG   mxk_mfree             ( a0 = void *block );
+  LONG   mxk_mshrink           ( d0 = LONG newlen, a0 = void *block );
+} MX_KERNEL;
+
+

Querverweis: XFS-Konzept in MagiC +

+

11.21.5.1 mxk_version

+

Das ist die Versionsnummer, die z.Zt. einfach 3 ist. Bei jeder +Änderung der Kernelstruktur wird die Versionsnummer hochgesetzt, so +daß sich Programme entsprechend anpassen können. +

+

11.21.5.2 mxk_fast_clrmem

+

Eine schnelle Speicherlöschroutine, die den Speicher von +<von> bis <bis> (ausschließlich) auf 0 setzt. +

+

Dabei gilt: +

+
+ + + + + + + + + + +
a0=void *von
a1=void *bis
+
+ +

11.21.5.3 mxk_toupper

+

Wandelt das Zeichen <c> unter Berücksichtigung der +nationalen Sonderzeichen in Großschrift um. +

+

Dabei gilt: +

+
+ + + + + +
d0=char c
+
+ +

11.21.5.4 mxk__sprintf

+

Eine Funktion, die ihre Argumente auf dem Stack erwartet. +Übergeben wird die Ziel-Zeichenkette <dest>, die Schablone +<source> und die einzutragenden Werte p[]. Die Langworte werden +je nach Formatieranweisung als "unsigned int" (%W), +"signed long" (%L) oder Zeichenkette (%S) interpretiert. +

+

Bei %W wird das weiter unten im Speicher liegende Wort +verwendet, die Folge %% fügt ein Prozentzeichen ein. +

+

11.21.5.5 mxk_act_pd

+

Der Zeiger auf die aktuelle Basepage, die Adresse läßt +sich auch über den Systemheader oder die DOS-Variablen ermitteln. +

+

11.21.5.6 mxk_act_appl

+

Der Zeiger auf die aktuelle Applikation (d.h. die +laufende Task). Der Aufbau der Struktur ist nicht +dokumentiert, der Zeiger wird wegen des schnelleren Zugriffs anstelle +der ap_id als Deskriptor verwendet. +

+

11.21.5.7 mxk_keyb_app

+

Die Applikation, die z.Zt. die Tastatur besitzt. Der Zeiger kann +z.B. von Gerätetreibern verwendet werden, die die tastaturbesitzende +Applikation anders behandeln müssen. +

+

11.21.5.8 mxk_pe_slice

+

Für das präemptive Multitasking. Wenn <*pe_slice> == -1 +ist, ist das präemptive Multitasking abgeschaltet, und Diskzugriffe +werden nicht unterbrochen. +

+

11.21.5.9 mxk_pe_timer

+

Für das präemptive Multitasking. Wenn <*pe_slice> == -1 +ist, ist das präemptive Multitasking abgeschaltet, und Diskzugriffe +werden nicht unterbrochen. +

+

11.21.5.10 mxk_appl_yield

+

Gibt Rechenzeit ans System. Wichtig für Treiber, die nicht auf +einen Interrupt warten können und verhindern müssen, daß ihr +"busy waiting" das System lahmlegt. +

+

11.21.5.11 mxk_appl_suspend

+

Arbeitet wie appl_yield(), gibt jedoch der Applikation +eine geringere Priorität, etwa als Hintergrundprozeß. +

+

11.21.5.12 mxk_appl_begcritic

+

Die aktuelle Applikation tritt in eine kritische Phase und darf +nicht terminiert werden. +

+

11.21.5.13 mxk_appl_endcritic

+

Ende der kritischen Phase. Falls zwischenzeitlich der Befehl zur +Terminierung eingegangen ist, wird das Programm terminiert. +

+

11.21.5.14 mxk_evnt_IO

+ + + + + + + + + + + + + + + +
Name: »evnt_IO« +
  +
Parameter: +
  + + + + + + +
d0 = long ticks_50hz +
a0 = void *unsel + +
+ +
Beschreibung: evnt_IO ermöglicht es, auf EIN externes Ereignis zu warten. +Als externes Ereignis kommt entweder ein Interrupt oder eine andere +Applikation (die etwa zum Aufwecken in eine Pipe schreibt) in Frage. +Die Funktion wird zum Erstellen von Gerätetreibern verwendet: +
  +
Vorgehensweise (siehe DEV_LPT1 als Beispiel): +
  + +
    +
  1. Interrupts sperren +
  2. +
  3. Abfrage, ob das Ereignis (im Fall DEV_LPT1 lautet das Ereignis: +"centronics busy off" eingetroffen ist. +
  4. +
  5. Wenn ja, Interrupts freigeben und Aktion durchführen (im Fall +DEV_LPT1: Zeichen drucken) +
  6. +
  7. Wenn nein, Interruptroutine aufsetzen (im Fall DEV_LPT1: +MFP-I0, d.h. Centronics Busy Interrupt aktivieren) und diesem die +aktuelle Applikation (act_appl) sowie eine Langwortadresse zugänglich +machen, in die die Interruptroutine Rückmeldungen schreiben kann. +Diese Adresse ist mit der Adresse einer Routine zu beschreiben, die +den Interrupt wieder abmeldet, dahinter können nach eigenen +Anforderungen z.B. noch weitere Daten folgen. Die Unselect-Routine +bekommt später einen Zeiger auf alle diese Daten und kann z.B. die +optionalen Parameter auswerten. Der ganze Mechanismus ist notwendig, +um ein korrektes Deinitialisieren des Interrupts in jedem Fall zu +garantieren. +
  8. +
  9. Interrupts freigeben +
  10. +
  11. evnt_IO aufrufen. In d0.w die Anzahl der 50Hz- Ticks für den +Timeout angeben, 0 heißt "kein Timeout". In a0 die Adresse +des Langworts angeben, in dem die Adresse der Aufräumroutine steht, +die den Interrupt wieder abmeldet (dahinter folgen optional weitere +Parameter, falls die Unselect-Routine diese versteht). Im Fall des +Einbindens von Gerätetreibern für Fselect() ist nur ein optionales +Langwort möglich. +
    Die Interruptroutine schreibt bei Eintreffen des Interrupts +einen Status < 0L (Fehler) oder 1L (OK) statt der +Deinitialisierungsroutine in das Statuslangwort (in dem vorher ihre +eigene Startadresse stand). Anschließend deinstalliert sich die +Routine selbst bzw. stellt sicher daß bei folgenden Interrupts keine +Aktionen ausgeführt werden. Schließlich weckt die Interruptroutine +die dem Interrupt zugeordnete Applikation auf, und zwar über den +Aufruf appl_IOcomplete() mit der Applikation als Parameter. +
  12. +
  13. evnt_IO() liefert als Rückgabewert 0L (Timeout, der Interrupt +ist nicht eingetroffen) oder < 0 (der Interrupt hat Fehlermcode ins +Statuslangwort geschrieben) oder 1L (der Interrupt hat eine 1L ins +Statuslangwort geschrieben). Eine Deinstallierung des Interrupts ist +nicht mehr notwendig, dies hat der Kernel erledigt, falls die +Interruptroutine dies nicht selbst beim Eintreffen des Interrupts +getan hat. +
  14. +
+ +
Gruppe: Kernelfunktionen +
  +
Querverweis: — +
  + +
+ +

11.21.5.15 mxk_evnt_mIO

+ + + + + + + + + + + + + + + +
Name: »evnt_mIO« +
  +
Parameter: +
  + + + + + + + + + +
d0 = long ticks_50hz +
a0 = void *unsel +
d1 = int cnt + +
+ +
bzw. +
  + + + +
a0 = APPL *ap + +
+ +
Beschreibung: evnt_mIO() ermöglicht es, auf MEHRERE externe Ereignisse zu +warten, z.B. wird diese Funktion von Fselect verwendet (mehrere +Dateien!). +
  +
Vorgehensweise: +
  + +
    +
  1. Für n Ereignisse eine Langwort-Tabelle der Länge 2*n anlegen. +
  2. +
  3. Für jedes Ereignis die Aufräumroutine (unselect-Routine) +eintragen, (dahinter folgt ein optionaler Langwortparameter) und den +Interrupt aufsetzen. Die Reihenfolge ist wichtig, es muß verhindert +werden, daß die unselect-Adresse den Rückgabewert des bereits +eingetroffenen Interrupts überschreibt, ggf. Interrupts sperren. +
  4. +
  5. evnt_mIO aufrufen. Die Parameter sind wie bei evnt_IO, in d1.w +wird aber die Anzahl der Ereignisse übergeben, a0 ist der +Tabellenanfang. +
  6. +
  7. evnt_mIO() liefert keinen Rückgabewert. Die Tabelle muß +durchsucht und die Interrupts deinstalliert werden (z.B. die +unselect-Routinen aufrufen), dabei kann überprüft werden, welche +Interrupts bereits eingetroffen sind. +
  8. +
  9. evnt_emIO mit der aktuellen Applikation aufrufen. Dieser Aufruf +stellt sicher, daß nach Deinstallieren aller Interrupts deren jetzt +nutzlose Nachrichten an die Applikation gelöscht werden. +
  10. +
+ +
Auf die Ereignisse evnt_(m)IO wartende Applikationen erscheinen +im Programm-Manager als wartend auf "io" (Input/Output) oder +"io ti" (Input/Output mit Timeout). +
  +
Gruppe: Kernelfunktionen +
  +
Querverweis: — +
  + +
+ +

11.21.5.16 mxk_appl_IOcomplete

+

Weckt eine Applikation auf, die auf evnt_(m)IO wartet. +

+

Dabei gilt: +

+
+ + + + + +
a0=APPL *ap
+
+ +

11.21.5.17 mxk_evnt_sem

+ + + + + + + + + + + + + + + +
Name: »evnt_sem« +
  +
Parameter: +
  + + + + + + + + + +
d0 = int mode +
a0 = void *sem +
d1 = long timeout + +
+ +
Beschreibung: Für mode sind folgende Unterfunktionen möglich: +
  + + + + + + + + + + + + + + + + + + + + + +
0 SEM_FREE Semaphore freigeben (ohne Taskwechsel!) +
1 SEM_SET Semaphore setzen, ggf. warten +
2 SEM_TEST Eigner der Semaphore ermitteln (ggf. NULL) +
3 SEM_CSET Semaphore setzen, falls nicht schon gesetzt +
4 SEM_GET Semaphore ermitteln, falls Name bekannt ist. +
5 SEM_CREATE Semaphore erstellen, d.h. neue einrichten +
6 SEM_DEL Semaphore entfernen + +
+ +
SEM_SET und SEM_CSET sind die einzigen Unterfunktionen, die +einen Taskwechsel auslösen können. +
  +
Im Gegensatz zu wind_update() kann mit diesen Aufrufen das +Setzen und Freigeben von Semaphoren nicht geschachtelt werden. +Versucht man, eine bereits reservierte Semaphore nochmal zu +reservieren, gibt es einen Fehlercode. +
  +
Beim Freigeben der Semaphore wird kein Taskwechsel +durchgeführt, d.h. die Semaphore kann zwar ggf. jetzt einer anderen +Applikation gehören, die den Status "ready" hat, aber sie +hat noch keine Rechenzeit bekommen. Wenn die Situation unkritisch ist, +sollte in jedem Fall anschließend ein appl_yield() durchgeführt +werden. +
  +
Die Bildschirmsemaphore hat den Namen _SCR und darf mit +evnt_sem() nur mit der Unterfunktion SEM_TEST behandelt werden. +
  +
SEM_CREATE setzt den Erzeuger nicht automatisch als Eigner. Dies +ist nicht notwendig, weil kein Taskwechsel stattgefunden hat. Also +kann bedenkenlos ein SEM_SET anschließend durchgeführt werden. +
  +
SEM_DEL verlangt, daß der Löscher auch der Eigner ist. Beim +Löschen werden alle wartenden Applikationen freigegeben, sie +erhalten, wenn sie per evnt_sem(SEM_SET, ..) warten, eine -2 als +Rückgabewert. Wer System-Semaphoren (solche, deren Namen mit '_' +beginnen) löscht, ist selbst schuld. +
  +
Gruppe: Kernelfunktionen +
  +
Querverweis: — +
  + +
+ +

11.21.5.18 SEM_FREE

+

Parameter: +

+ + + +
a0 = Zeiger auf Semaphore + + + + + + +
-> 0 OK +
-> -1 Semaphore unbenutzt oder von anderer APP benutzt. + +
+ + +
+ +

11.21.5.19 SEM_SET

+

Parameter: +

+ + + + + + +
a0 = Zeiger auf Semaphore +
d1 = Timeout in 50Hz- Ticks + + + + + + + + + + + + +
-> 0 OK +
-> 1 Timeout +
-> -1 Semaphore war schon von mir gesetzt. +
-> -2 Semaphore wurde inzwischen entfernt. + +
+ + +
+ +

11.21.5.20 SEM_TEST

+

Parameter: +

+ + + +
a0 = Zeiger auf Semaphore + + + + + + +
-> >0 Eigner +
-> 0 nicht benutzt + +
+ + +
+ +

11.21.5.21 SEM_CSET

+

Parameter: +

+ + + + + + +
a0 = Zeiger auf Semaphore +
d1 = Timeout in 50Hz- Ticks + + + + + + + + + +
-> 0 OK +
-> 1 Semaphore von anderer APPL gesetzt. +
-> -1 Semaphore war schon von mir gesetzt. + +
+ + +
+ +

11.21.5.22 SEM_GET

+

Parameter: +

+ + + +
d1 = Name der Semaphore + + + + + + +
-> >0 Zeiger auf Semaphore. +
-> -1 Semaphore nicht gefunden. + +
+ + +
+ +

11.21.5.23 SEM_CREATE

+

Parameter: +

+ + + + + + +
a0 = Zeiger auf Semaphore (32 Bytes auf gerader Adresse) +
d1 = Name void + +
+ +

11.21.5.24 SEM_DEL

+

Parameter: +

+ + + +
a0 = Zeiger auf Semaphore + + + + + + +
-> 0 OK +
-> -1 Semaphore ungültig + +
+ + +
+ +

11.21.5.25 mxk_Pfree

+

Gibt den Speicher für einen Prozeß frei, der mit +Ptermres beendet  wurde. Dies ist notwendig, um einen +Gerätetreiber korrekt zu entfernen. +

+

Dabei gilt: +

+
+ + + + + +
a0=void *pd
+
+ +

11.21.5.26 mxk_int_msize

+

Die Länge eines Speicherblocks der internen (Kernel-) Speicherverwaltung. +

+

11.21.5.27 mxk_int_malloc

+

Alloziert einen internen Speicherblock. Ist kein Speicher mehr +frei, wird zunächst eine globale "garbage +collection" durchgeführt (siehe Beschreibung des XFS), dann +bei Mißerfolg das System angehalten. Interne Speicherblöcke dürfen +nur in kleinen Mengen angefordert werden, sonst erhält man sehr bald +ein "Out of internal memory", und das System steht. +

+

11.21.5.28 mxk_int_mfree

+

Gibt einen Block wieder frei. +

+

Dabei gilt: +

+
+ + + + + +
a0=void *memblk
+
+ +

11.21.5.29 mxk_resv_intmem

+

Erweitert den Kernelspeicher. Es ist keine Möglichkeit +vorgesehen, den Speicher zurückzufordern. Da der Kernel nur zur +Bootzeit ausreichend internen Speicher für die FAT-Laufwerke +anfordert, kann es für ein XFS notwendig sein, beim Start mit dieser +Funktion weiteren Kernelspeicher zu reservieren. +

+

Dabei gilt: +

+
+ + + + + + + + + + +
a0=void *mem
d0=long bytes
+
+ +

11.21.5.30 mxk_diskchange

+

Muss aufgerufen werden, wenn ein XFS- oder DFS-Treiber einen +Diskwechsel erkannt hat. Der XFS-Treiber gibt seine Dateien +und Strukturen frei, anschließend der Kernel. +

+

Rückgabe: +

+ + + + + + +
EDRIVE Laufwerk ungültig +
E_CHNG Laufwerk mit neuer Disk gültig + +
+ +

Dabei gilt: +

+
+ + + + + +
d0=int drv
+
+ +

11.21.5.31 mxk_DMD_rdevinit

+

Ab Kernelversion 1 +

+

Initialisiert die Felder d_driver und d_devcode +des DMD und benutzt dazu das Feld d_biosdev. Wird für +Diskwechselmechanismen benötigt. +

+

Dabei gilt: +

+
+ + + + + +
a0=DMD *dmd
+
+ +

11.21.5.32 mxk_proc_info

+

Ab Kernelversion 2 +

+

Ermittelt Daten für den aktuellen Prozeß. +

+ + + + + + + + + +
d0 = 0: 0: höchste verfügbare Unterfunktionsnummer, +
  1: Domain +
  2: Process-ID. + +
+ +

Dabei gilt: +

+
+ + + + + + + + + + +
d0=WORD code
a0=PD *pd
+
+ +

11.21.5.33 mxk_mxalloc

+

Ab Kernelversion 4 +

+

Ermöglicht eine schnelle Speicherallozierung, z.B. für ein +RAMDisk-XFS, ohne über den Trap gehen zu müssen. +

+

<pd> gibt den Prozeß an, der als Eigner des neuen Blocks +eingetragen wird, daher sollte normalerweise die Basepage des +XFS-Treibers übergeben werden. +

+

11.21.5.34 mxk_mfree

+

Ab Kernelversion 4 +

+

Gibt Speicher wieder frei. +

+

11.21.5.35 mshrink

+

Ab Kernelversion 4 +

+

Ändert die Größe eines Speicherblocks. +

+

11.21.6 Symbolische Links und das XFS-Konzept

+

Symbolische Links (in der Benutzerdokumentation in +Übereinstimmung mit der Macintosh Nomenklatur auch als Aliase +bezeichnet) sind Dateien, die in irgendeiner Form besonders +gekennzeichnet sind und statt Daten einen Pfad enthalten, der wiederum +auf eine andere Datei zeigt. Ein derartiger Pfad kann auch auf eine +nicht (mehr) bzw. noch nicht existierende Datei zeigen. Pfade können +absolut oder relativ sein, wobei letztere das +Verzeichnis als Bezug haben, in dem der Link liegt. +

+

Im Speicher werden derartige Links als Strukturen +verwaltet: +

+
{
+   WORD n;         /* auf gerade Anzahl aufgerundet, inkl. EOS */
+   char path[n];   /* Pfad mit EOS am Ende */
+}
+
+

Hinweis: Einige XFS-Funktionen müssen, wenn sie auf +einen Symlink stoßen, diesen dereferenzieren, d.h. sie liefern dem +Kernel in d0 den Fehlercode ELINK und in a0 einen Zeiger auf eine +Struktur der obigen Form. Der Kernel sorgt dann für die +Dereferenzierung und die Begrenzung der maximalen Verschachtelung +(falls der Symlink wieder auf einen solchen zeigt). Die +XFS-Funktionen, die ELINK liefern dürfen, sind: +

+

xfs_path2DD, xfs_sfirst, xfs_snext, xfs_fopen, xfs_xattr, +xfs_attrib. +

+

Querverweis: XFS-Konzept in MagiC +

+

11.21.7 MX_DOSLIMITS

+

Diese Struktur ist wie folgt definiert: +

+
typedef struct
+{
+    UWORD version;        /* Versionsnummer               */
+    UWORD num_drives;     /* max. Anzahl Laufwerke        */
+    ULONG max_secsizb;    /* max. Sektorgröße in Bytes    */
+    UWORD min_nfats;      /* min. Anzahl FATs             */
+    UWORD max_nfats;      /* max. Anzahl FATs             */
+    ULONG min_nclsiz;     /* min. Anzahl Sektoren/Cluster */
+    ULONG max_nclsiz;     /* max. Anzahl Sektoren/Cluster */
+    ULONG max_ncl;        /* max. Anzahl Cluster          */
+    ULONG max_nsec;       /* max. Anzahl Sektoren         */
+} MX_DOSLIMITS;
+
+

Querverweis: Dcntl   KER_DOSLIMITS   XFS-Konzept in MagiC +

+

11.21.8 XFS-Strukturen

+ +
+

11.21.8.1 dev_descr

+

Diese Struktur ist wie folgt definiert: +

+
struct dev_descr
+{
+    DEVDRV  *driver;
+    SHORT   dinfo;
+    SHORT   flags;
+    struct tty *tty;
+    LONG    devdrvsiz;
+    LONG    reserved[4];
+};
+
+

Hinweis: Die Komponente devdrvsiz beschreibt +dabei die Größe der DEVDRV-Struktur. +

+

Querverweis: Dcntl   XFS-Konzept in MagiC +

+

11.21.8.2 DEVDRV

+

Diese Struktur ist wie folgt definiert: +

+
typedef struct devdrv
+{
+    LONG (*open)      (FILEPTR *f);
+    LONG (*write)     (FILEPTR *f, BYTE *buf, LONG bytes);
+    LONG (*read)      (FILEPTR *f, BYTE *buf, LONG bytes);
+    LONG (*lseek)     (FILEPTR *f, LONG where, WORD whence);
+    LONG (*ioctl)     (FILEPTR *f, WORD mode, VOID *buf);
+    LONG (*datime)    (FILEPTR *f, WORD *timeptr, WORD rwflag);
+    LONG (*close)     (FILEPTR *f, WORD pid);
+    LONG (*select)    (FILEPTR *f, LONG proc, WORD mode);
+    VOID (*unselect)  (FILEPTR *f, LONG proc, WORD mode);
+    LONG reserved[3];
+} DEVDRV;
+
+

Querverweis: Dcntl   dev_descr   FILESYS   XFS-Konzept in MagiC +

+

11.21.8.3 FILESYS

+

Diese Struktur ist wie folgt definiert: +

+
typedef struct filesys
+{
+    struct  filesys *next;
+    LONG    fsflags;
+    LONG    (*root)       (WORD drv, fcookie *fc);
+    LONG    (*lookup)     (fcookie *dir, BYTE *name, fcookie *fc);
+    LONG    (*creat)      (fcookie *dir, BYTE *name, UWORD mode,
+                           WORD attrib, fcookie *fc);
+    DEVDRV *(*getdev)     (fcookie *fc, LONG *devspecial);
+    LONG    (*getxattr)   (fcookie *fc, XATTR *xattr);
+    LONG    (*chattr)     (fcookie *fc, WORD attr);
+    LONG    (*chown)      (fcookie *fc, WORD uid, WORD gid);
+    LONG    (*chmode)     (fcookie *fc, UWORD mode);
+    LONG    (*mkdir)      (fcookie *dir, BYTE *name, UWORD mode);
+    LONG    (*rmdir)      (fcookie *dir, BYTE *name);
+    LONG    (*remove)     (fcookie *dir, BYTE *name);
+    LONG    (*getname)    (fcookie *relto, fcookie *dir, BYTE *pathname,
+                           WORD size);
+    LONG    (*rename)     (fcookie *olddir, BYTE *oldname,
+                           fcookie *newdir, BYTE *newname);
+    LONG    (*opendir)    (DIR *dirh, WORD tosflag);
+    LONG    (*readdir)    (DIR *dirh, BYTE *nm, WORD nmlen, fcookie *fc);
+    LONG    (*rewinddir)  (DIR *dirh);
+    LONG    (*closedir)   (DIR *dirh);
+    LONG    (*pathconf)   (fcookie *dir, WORD which);
+    LONG    (*dfree)      (fcookie *dir, LONG *buf);
+    LONG    (*writelabel) (fcookie *dir, BYTE *name);
+    LONG    (*readlabel)  (fcookie *dir, BYTE *name, WORD namelen);
+    LONG    (*symlink)    (fcookie *dir, BYTE *name, BYTE *to);
+    LONG    (*readlink)   (fcookie *dir, BYTE *buf, WORD len);
+    LONG    (*hardlink)   (fcookie *fromdir, BYTE *fromname,
+                           fcookie *todir, BYTE *toname);
+    LONG    (*fscntl)     (fcookie *dir, BYTE *name, WORD cmd, LONG arg);
+    LONG    (*dskchng)    (WORD drv);
+    LONG    (*release)    (fcookie *fc);
+    LONG    (*dupcookie)  (fcookie *dest, fcookie *src);
+} FILESYS;
+
+

Querverweis: Dcntl   fs_descr   XFS-Konzept in MagiC +

+

11.21.8.4 fs_descr

+

Diese Struktur ist wie folgt definiert: +

+
struct fs_descr
+{
+    FILESYS *file_system;
+    SHORT   dev_no;
+    LONG    flags;
+    LONG    reserved[4];
+};
+
+

Querverweis: Dcntl   XFS-Konzept in MagiC +

+
+ +Home +MagiCMagiC +Das DFS-Konzept von MagiCDas DFS-Konzept von MagiC +VFAT-XFS in MagiCVFAT-XFS in MagiC + + diff --git a/de/matrix_XBIOS_extension.html b/de/matrix_XBIOS_extension.html new file mode 100644 index 000000000..7362983c5 --- /dev/null +++ b/de/matrix_XBIOS_extension.html @@ -0,0 +1,91 @@ + + + + + +Die Anleitung zum TOS: MATRIX-XBIOS-Erweiterung + + + + + + + + + +Home +XBIOSXBIOS +LaufwerksfunktionenLaufwerksfunktionen +OverScan-XBIOS-ErweiterungenOverScan-XBIOS-Erweiterungen + +
+ +

4.15 MATRIX-XBIOS-Erweiterung

+

Die Treiber für die MATRIX Grafikarten installieren einige +XBIOS Funktionen. +

+ + + +

4.15.1 MatScreen - Cxx

+

cxx_info.tos +

+
+ + + + + + + + + + + + + + + + +
FunktionsnummerBeschreibung
32000unbekannt
32001unbekannt
32002ckgabe 'CxOk' (0x43784f6b) wenn der Treiber isnatllisert ist.
+
+ +

XBRA ID M_IN +

+ + + +

4.15.2 MatGraph - TCxx

+

tcxxinfo.tos +

+
+ + + + + + + + + + + + + + + + +
FunktionsnummerBeschreibung
CHECKinst (31000)Rückgabe INSTokay='TcOk' (0x54634f6b) wenn der Treiber isnatllisert ist.
GETscreen (31001)Rückgabe eines Zeiger auf die SCREENparameter Struktur
GETboard (31002)RRückgabe eines Zeiger auf die BOARDparameter Struktur
+
+ +

XBRA ID MTCI Cookie MaTC +

+
+ +Home +XBIOSXBIOS +LaufwerksfunktionenLaufwerksfunktionen +OverScan-XBIOS-ErweiterungenOverScan-XBIOS-Erweiterungen + + diff --git a/de/menu.html b/de/menu.html new file mode 100644 index 000000000..8e0543476 --- /dev/null +++ b/de/menu.html @@ -0,0 +1,2168 @@ + + + + + +Die Anleitung zum TOS: Menüfunktionen + + + + + + + + + + +Home +AESAES +MagiC FunktionenMagiC Funktionen +ObjektfunktionenObjektfunktionen + +
+ +

8.17 Menüfunktionen

+

Diese Bibliothek stellt Funktionen zur Verfügung um Menüzeilen +zu zeichnen und zu manipulieren; für diesen Zweck sind die folgenden +Routinen vorhanden: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
menu_attach Hinzufügen, verändern, löschen eines Submenüs +
menu_bar Behandlung der Menüleiste +
menu_click Behandlung von Pull-Down-Menüs +
menu_icheck Häkchen bei Menüoptionen setzen oder löschen +
menu_ienable Menüeintrag sperren oder freigeben +
menu_istart Ausrichten eines Submenü-Eintrages +
menu_popup Darstellung und Bearbeitung eines Popup-Menüs +
menu_register Accessory im Desk-Menü eintragen +
menu_settings Menüparameter setzen bzw. abfragen +
menu_text Text eines Menüeintrages verändern +
menu_tnormal Menütitel invertieren +
menu_unregister Accessory-Namen aus dem Menü entfernen + +
+ +

Hinweis: Ab AES-Version 4.0 (bzw. MagiC 3) wurde diese +Bibliothek stark überarbeitet, und übernimmt nun auch die +Darstellung und Verwaltung von Popup- und Submenüs. +

+

Querverweis: Menüs und Menüzeilen   Style-Guidelines   +XMEN_MGR +

+

8.17.1 menu_attach

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Menu Attach« - Hinzufügen, löschen, verändern und +Informationen über ein Submenü ermitteln. +
  +
AES-Nummer: 37 +
  +
Deklaration: int16_t menu_attach ( int16_t mode, OBJECT *tree, int16_t item, +MENU *mdata ); +
  +
Beschreibung: Die Funktion ermöglicht das hinzufügen, löschen und +verändern eines Submenüs. Darüber hinaus lassen sich Informationen +über ein Submenü ermitteln. Es gilt: +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
mode gewünschte Aktion + + + + + + + + + +
0 = Information über ein Submenü ermitteln und in mdata ablegen. +
1 = Hinzufügen oder verändern eines Submenüs, dessen +Beschreibung in mdata abgelegt ist. Besitzt mdata den Wert NULL, so +wird das Submenü entfernt. +
2 = Direktes entfernen eines Submenüs; mdata sollte ein +NULL-Zeiger sein + +
+ +
tree Adresse des Menü-Objektbaumes +
item Index des Objektes, mit dem das Submenü verknüpft ist (oder +werden soll) bzw. von dem das Submenü entfernt oder verändert werden +soll +
mdata MENU-Struktur des Submenüs + +
+ +
Hinweis: +
  +
Nach Möglichkeit sollte nicht mehr als eine +Submenü-Ebene zu einem Menüeintrag angelegt werden, obwohl bis zu +vier Ebenen unterstützt werden. Die Anzahl der Submenüs pro +Menü ist auf 64 begrenzt. +
  +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis der Wert +0 zurückgegeben wird. +
  +
Verfügbar: Diese Funktion ist nur verfügbar seit AES Version 3.30 und +höher. In AES Version 4.0 und größer sollte appl_getinfo (Opcode 9) +benutzt werden ob der Aufruf möglich ist. +
  +
Gruppe: Menüs +
  +
Querverweis: Binding   menu_istart   menu_settings   menu_popup   XMEN_MGR +
  + +
+ +

8.17.1.1 Bindings für menu_attach

+ + + + + + + + + +
C: int16_t menu_attach ( int16_t mode, OBJECT *tree, int16_t item, +MENU *mdata ); +
  +
Umsetzung: +
  +
int16_t menu_attach (int16_t mode, OBJECT *tree, int16_t item,
+                     MENU *mdata)
+{
+   int_in[0]  = mode;
+   int_in[1]  = item;
+   addr_in[0] = tree;
+   addr_in[1] = mdata;
+
+   return ( crys_if(37) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]37 # Opcode der Funktion
control+2control[1]2 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]mode
int_in+2int_in[1]item
addr_inaddr_in[0]tree
addr_in+4addr_in[1]mdata
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.17.2 menu_bar

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Menu Bar« - Menüleiste zeigen, löschen bzw. installieren. +
  +
AES-Nummer: 30 +
  +
Deklaration: int16_t menu_bar ( OBJECT *me_btree, int16_t me_bshow ); +
  +
Beschreibung: Die Funktion führt abhängig vom Parameter me_bshow +verschiedenen Operationen aus: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
me_bshow Bedeutung +
    +
-3 Low-Word der Menüleiste einer Applikation erfragen. +
-2 High-Word der Menüleiste einer Applikation erfragen. +
-1 den Besitzer (Applikation) der Menüzeile erfragen. Da diese +laufend wechseln kann, muß zur sicheren Abfrage der Bildschirm per +wind_update gesperrt werden. +
0 Menüzeile löschen +
1 Menüzeile zeichnen +
3 Menüleistenmodus abfragen (N.AES) +
4 Menüleistenmodus setzen (N.AES, nicht implementiert) +
5 Update des Systemteils d. Menüleiste (N.AES) +
100 Menüzeile installieren, ohne eine Umschaltung der obersten +Applikation zu erzwingen. + +
+ +
Definitionen: +
  + + + + + + +
MENU_HIDE = 0 +
MENU_SHOW = 1 +
MENU_GETMODE = 3 +
MENU_SETMODE = 4 +
MENU_UPDATE = 5 +
MENU_INSTL = 100 +
  +
Menüleistenmodus: +
  + + + +
MENU_HIDDEN = 0x0001 Menüleiste nur bei Bedarf sichtbar +
MENU_PULLDOWN = 0x0002 Pulldown-Menüs +
MENU_SHADOWED = 0x0004 Menüleistenboxen mit Schatten +
  +
Hinweis: Der Parameter me_btree ist ein Zeiger +auf den Objektbaum des entsprechenden Menüs. Am Ende des Programms +darf nicht vergessen werden, die Menüzeile wieder abzumelden. +
  +
Mit menu_bar(-2/-3) kann die Baumadresse der Menüleiste einer +Applikation erfragen. menu_bar(-2) liefert das High-Word und +menu_bar(-3) das Low-Word. Nur Verfügbar wenn der Cookie 'MbAr' oder +'AmAN' vorhanden ist. +
  +
OBJECT *get_menu(int apid)
+{
+  unsigned int hi = menu_bar((OBJECT *)apid, -2);
+  unsigned int lo = menu_bar((OBJECT *)apid, -3);
+  OBJECT *tree = (OBJECT *)(((unsigned long)hi << 16) | lo);
+  return tree;
+}
+
+
Das Vorhandensein der erweiterten Möglichkeiten ist über die +Funktion appl_getinfo (Opcode 6) abfragbar. +
  +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgegeben wird. Ein Wert von -1 signalisiert, daß es keinen +Eigner der Menüzeile gibt. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Menüs +
  +
Querverweis: Binding   OBJECT +
  + +
+ +

8.17.2.1 Bindings für menu_bar

+ + + + + + + + + +
C: int16_t menu_bar ( OBJECT *me_btree, int16_t me_bshow ); +
  +
Umsetzung: +
  +
int16_t menu_bar (OBJECT *me_btree, int16_t me_bshow)
+{
+   int_in[0]  = me_bshow;
+   addr_in[0] = me_btree;
+
+   return ( crys_if(30) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]30 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]me_bshow
addr_inaddr_in[0]me_btree
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.17.3 menu_click

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Menu click« - Art der Menüsteuerung setzen bzw. erfragen +
  +
AES-Nummer: 37 +
  +
Deklaration: int16_t menu_click ( int16_t click, int16_t setit ); +
  +
Beschreibung: Mit Hilfe dieser Funktion ist es möglich die Behandlung der +Drop-Down-Menüs auf die vom Macintosh bekannten +Pull-Down-Menüs umzustellen. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
click +
+
+ + + + + + + + + + +
0=Dropdown
1=Pulldown
+
+ +
setit +
+
+ + + + + + + + + + +
0=Menüsteuerung abfragen
1=Menüsteuerung setzen
+
+ + +
+ +
Ergebnis: Die Funktion liefert die eingestellte Menüsteuerung zurück (0 += Dropdown, 1 = Pulldown). +
  +
Verfügbar: Auf dem PC steht diese Funktion erst ab GEM/3 und KAOS 1.4.2 +und MagiC zur Verfügung; auf dem Atari sollte das Vorhandensein per +appl_getinfo (Opcode 5) ermittelt werden. +
  +
Gruppe: Menüs +
  +
Querverweis: Binding +
  + +
+ +

8.17.3.1 Bindings für menu_click

+ + + + + + + + + +
C: int16_t menu_click ( int16_t click, int16_t setit ); +
  +
Umsetzung: +
  +
int16_t menu_click (int16_t click, int16_t setit)
+{
+   int_in[0] = click;
+   int_in[1] = setit;
+
+   return ( crys_if(37) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]37 # Opcode der Funktion
control+2control[1]2 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]click
int_in+2int_in[1]setit
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.17.4 menu_icheck

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Menu indicate Check« - schreibt oder löscht ein Häckchen +in der Menüleiste. +
  +
AES-Nummer: 31 +
  +
Deklaration: int16_t menu_icheck ( OBJECT *me_ctree, int16_t me_citem, +int16_t me_ccheck ); +
  +
Beschreibung: Die Funktion löscht oder setzt ein Häkchen vor einem +Menüeintrag. Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
me_ctree Adresse des Menü-Objektbaumes +
me_citem Nummer des Menüeintrages +
me_ccheck +
+
+ + + + + + + + + + +
0=Häkchen löschen
1=Häkchen setzen
+
+ + +
+ +
Hinweis: Aus optischen Gründen sollte man jeden Eintrag +eines Menüs mit zwei Leerzeichen beginnen lassen. Ab PC-GEM 2.0 +werden statt des Häkchens kleine Dreiecke für diesen Zweck +verwendet. +
  +
Ergebnis: Bei einem Rückgabewert von Null ist ein Fehler aufgetreten. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Menüs +
  +
Querverweis: Binding   OBJECT +
  + +
+ +

8.17.4.1 Bindings für menu_icheck

+ + + + + + + + + +
C: int16_t menu_icheck ( OBJECT *me_ctree, int16_t me_citem, +int16_t me_ccheck ); +
  +
Umsetzung: +
  +
int16_t menu_icheck (OBJECT *me_ctree, int16_t me_citem,
+                     int16_t me_ccheck)
+{
+   int_in[0]  = me_citem;
+   int_in[1]  = me_ccheck;
+   addr_in[0] = me_ctree;
+
+   return ( crys_if(31) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]31 # Opcode der Funktion
control+2control[1]2 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]me_citem
int_in+2int_in[1]me_ccheck
addr_inaddr_in[0]me_ctree
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.17.5 menu_ienable

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Menu indicate enable« - aktiviert oder deaktiviert einen +Menüpunkt. +
  +
AES-Nummer: 32 +
  +
Deklaration: int16_t menu_ienable ( OBJECT *me_etree, int16_t me_eitem, +int16_t me_eenable ); +
  +
Beschreibung: Die Funktion schaltet Menüeinträge ein oder aus. Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
me_etree Adresse des Menü-Objektbaumes +
me_eitem Nummer des Menüeintrages +
me_eenable +
+
+ + + + + + + + + + +
0=Menü deaktivieren
1=Menü aktivieren
+
+ + +
+ +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Menüs +
  +
Querverweis: Binding   OBJECT +
  + +
+ +

8.17.5.1 Bindings für menu_ienable

+ + + + + + + + + +
C: int16_t menu_ienable ( OBJECT *me_etree, int16_t me_eitem, +int16_t me_eenable ); +
  +
Umsetzung: +
  +
int16_t menu_ienable (OBJECT *me_etree, int16_t me_eitem,
+                      int16_t me_eenable)
+{
+   int_in[0]  = me_eitem;
+   int_in[1]  = me_eenable;
+   addr_in[0] = me_etree;
+
+   return ( crys_if(32) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]32 # Opcode der Funktion
control+2control[1]2 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]me_eitem
int_in+2int_in[1]me_eenable
addr_inaddr_in[0]me_etree
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.17.6 menu_istart

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Menu istart« - ausrichten eines Submenü-Eintrages +
  +
AES-Nummer: 38 +
  +
Deklaration: int16_t menu_istart ( int16_t flag, OBJECT *tree, int16_t +imenu, int16_t item ); +
  +
Beschreibung: Die Funktion ermöglicht die Ausrichtung eines Submenü-Eintrages +auf die Höhe des entsprechenden Eintrags des (Haupt-) Menüs. Es +gilt: +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
flag 1 = Ausrichtung vornehmen +
tree Adresse des Menü-Objektbaumes +
imenu Index des Submenü-Eintrags, der ausgerichtet werden soll +
item Index des Menüeintrags, mit welchem das Submenü verknüpft +werden soll + +
+ +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis der Wert +0 zurückgegeben wird. +
  +
Verfügbar: This function is only available with AES versions 3.30 and +above. +
  +
Das Vorhandensein dieser Funktion kann über einen Aufruf von +appl_getinfo (Opcode 9) festgestellt werden. +
  +
Gruppe: Menüs +
  +
Querverweis: Binding   menu_attach   XMEN_MGR +
  + +
+ +

8.17.6.1 Bindings für menu_istart

+ + + + + + + + + +
C: int16_t menu_istart ( int16_t flag, OBJECT *tree, int16_t +imenu, int16_t item ); +
  +
Umsetzung: +
  +
int16_t menu_istart (int16_t flag, OBJECT *tree,
+                     int16_t imenu, int16_t item)
+{
+   int_in[0]  = flag;
+   int_in[1]  = imenu;
+   int_in[2]  = item;
+   addr_in[0] = tree;
+
+   return ( crys_if(38) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]38 # Opcode der Funktion
control+2control[1]3 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]flag
int_in+2int_in[1]imenu
int_in+4int_in[2]item
addr_inaddr_in[0]tree
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.17.7 menu_popup

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Menu Popup« - übernimmt die Darstellung und Abarbeitung +eines Popup-Menüs +
  +
AES-Nummer: 36 +
  +
Deklaration: int16_t menu_popup ( MENU *me_menu, int16_t me_xpos, int16_t +me_ypos, MENU *me_mdata ); +
  +
Beschreibung: Die Funktion übernimmt die Darstellung und Bearbeitung eines +Popup-Menüs. Es gilt: +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
me_menu Zeiger auf die Struktur des Popups +
me_xpos x-Koordinate des Menüs +
me_ypos y-Koordinate des Menüs +
me_mdata Zeiger auf die Daten des selektierten Menüeintrages. + +
+ +
Wenn mn_scroll von MENU auf 0 gesetzt ist wenn +menu_popup aufgerufen wird, wird ein nicht scrollbares Popup-Menü +angezeigt. +
  +
Wenn mn_scroll von MENU auf >0 gesetzt ist wenn +menu_popup aufgerufen wird, wird ein scrollbares Popup-Menü +angezeigt; der Wert height von MN_SET bestimmt seine Höhe in +Elementen (beachten Sie, dass Ataris AES Auf-/Ab-Pfeile innerhalb des +Popups zum Scrollen implementiert, um das gleiche Erscheinungsbild von +Dropdown-Menüs beizubehalten, wie sie an Menüleistenelemente +angehängt werden können; beachten Sie, dass NAES genau dieses +Verhalten nachahmt). Siehe auch menu_settings. +
  +
Ab AES Version 4.1 wird, wenn mn_scroll von MENU auf +-1 gesetzt ist wenn menu_popup aufgerufen wird, ein +Dropdown-Listenfeld statt eines Popup-Menüs angezeigt; dieses +verfügt über eine Bildlaufleiste, wenn acht oder mehr Einträge +vorhanden sind. +
  +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis der Wert +0 zurückgegeben wird. +
  +
Verfügbar: Diese Funktion ist nur verfügbar seit AES Version 3.30 und +höher. +
  +
Das Vorhandensein dieser Funktion kann über einen Aufruf von +appl_getinfo (Opcode 9) festgestellt werden. +
  +
Gruppe: Menüs +
  +
Querverweis: Binding   menu_settings   XMEN_MGR +
  + +
+ +

8.17.7.1 Bindings für menu_popup

+ + + + + + + + + +
C: int16_t menu_popup ( MENU *me_menu, int16_t me_xpos, int16_t +me_ypos, MENU *me_mdata ); +
  +
Umsetzung: +
  +
int16_t menu_popup (MENU *me_menu, int16_t me_xpos,
+                   int16_t me_ypos, MENU *me_mdata)
+{
+   int_in[0]  = me_xpos;
+   int_in[1]  = me_ypos;
+   addr_in[0] = me_menu;
+   addr_in[1] = me_mdata;
+
+   return ( crys_if(36) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]36 # Opcode der Funktion
control+2control[1]2 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]me_xpos
int_in+2int_in[1]me_ypos
addr_inaddr_in[0]me_menu
addr_in+4addr_in[1]me_mdata
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.17.8 menu_register

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Menu Register« - fügt ein Accessory im Accessorymenü ein. +
  +
AES-Nummer: 35 +
  +
Deklaration: int16_t menu_register ( int16_t me_rapid, CONST int8_t +*me_rpstring ); +
  +
Beschreibung: Die Funktion trägt den Namen eines Accessories im +Accessory-Menü ein, oder ändert diesen. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
me_rapid Applikations-ID des Accessories oder -1, um den Namen der +Applikation zu verändern. +
me_rpstring Adresse des Textes für den Menüeintrag + +
+ +
Obwohl das Verändern des Namens der Applikation erst ab AES +4.0 dokumentiert ist, scheint dieses Feature in allen TOS-Versionen zu +funktionieren. +
  +
Wichtig: Der Parameter me_rpstring wird von GEM +nur als Zeiger benutzt; es wird also keine Kopie des neuen Eintrags +angelegt. Der Funktionsaufruf wird erst dann wirksam, wenn das +entsprechende Hauptprogramm einen menu_bar Aufruf tätigt. Daher +sollten Accessories diese Funktion gleich nach dem Start aufrufen, +anderenfalls laufen sie Gefahr, das menu_bar des Desktops zu verpassen. +
  +
Ist der Cookie 'MbAr' oder 'AmAN' vorhanden kann per +menu_register(-1,"?\0\n") die Applikations-ID ermittelt +werden. wobei n die ID des fraglichen Accessories angibt. Der +Rückgabewert stellt dann die menu_id (oder -1) dar. +
  +
Ergebnis: Die Funktion liefert die Menü-Kennung für das Accessory, oder +(im Fehlerfall) den Wert -1. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Menüs +
  +
Querverweis: Binding   menu_bar   menu_unregister +
  + +
+ +

8.17.8.1 Bindings für menu_register

+ + + + + + + + + +
C: int16_t menu_register ( int16_t me_rapid, CONST int8_t +*me_rpstring ); +
  +
Umsetzung: +
  +
int16_t menu_register (int16_t me_rapid,
+                       CONST int8_t *me_rpstring)
+{
+   int_in[0]  = me_rapid;
+   addr_in[0] = me_rpstring;
+
+   return ( crys_if(35) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]35 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]me_rapid
addr_inaddr_in[0]me_rpstring
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.17.9 menu_settings

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Menu Settings« - Parameter für Popup/Submenüs setzen bzw. +abfragen. +
  +
AES-Nummer: 39 +
  +
Deklaration: int16_t menu_settings ( int16_t me_flag, MN_SET *me_values ); +
  +
Beschreibung: Die Funktion ermöglicht die Manipulation der Parameter für +Popup- und Submenüs. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
me_flag Parameter +
+
+ + + + + + + + + + +
0=abfragen
1=setzen
+
+ +
me_values Zeiger auf MN_SET-Struktur + +
+ +
Hinweis: Die durch das Setzen vorgenommenen +Einstellungen gelten nicht nur für das eigene Programm, sondern für +das ganze System. Aus diesem Grund sollte die Funktion in normalen +Anwenderprogrammen nicht benutzt werden, sondern nur in +Konfigurations-Programmen (z.B. CPX-Modulen) zum Einsatz kommen. +
  +
Ergebnis: Die Funktion liefert stets den Wert 1 zurück. +
  +
Verfügbar: Diese Funktion ist nur verfügbar seit AES Version 3.30 und +höher. +
  +
Das Vorhandensein dieser Funktion kann über einen Aufruf von +appl_getinfo (Opcode 9) festgestellt werden. +
  +
Gruppe: Menüs +
  +
Querverweis: Binding   menu_popup   XMEN_MGR +
  + +
+ +

8.17.9.1 Bindings für menu_settings

+ + + + + + + + + +
C: int16_t menu_settings ( int16_t me_flag, MN_SET *me_values ); +
  +
Umsetzung: +
  +
int16_t menu_settings (int16_t me_flag, MN_SET *me_values)
+{
+   int_in[0]  = me_flag;
+   addr_in[0] = me_values;
+
+   return ( crys_if(39) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]39 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]me_flag
addr_inaddr_in[0]me_values
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.17.10 menu_text

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Menu Text« - ersetzt den Text eines Menüeintrags. +
  +
AES-Nummer: 34 +
  +
Deklaration: int16_t menu_text ( OBJECT *me_ttree, int16_t me_titem, CONST +int8_t *me_ttext ); +
  +
Beschreibung: Die Funktion ändert den Text in einem Menüeintrag. Auf diese +Art können Menütexte vom Zustand der Applikation abhängig gemacht, +d.h. kontext-sensitiv gestaltet werden. Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
me_ttree Adresse des Menü-Objektbaumes +
me_titem Nummer des zu ändernden Menüeintrages +
me_ttext Adresse des neuen Eintrags + +
+ +
Wichtig: Der Parameter me_ttext wird von GEM nur +als Zeiger benutzt; es wird also keine Kopie des neuen Eintrags +angelegt. Ferner sollte man darauf achten, daß der neue Eintrag die +Länge des alten nicht überschreitet. +
  +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Menüs +
  +
Querverweis: Binding   OBJECT +
  + +
+ +

8.17.10.1 Bindings für menu_text

+ + + + + + + + + +
C: int16_t menu_text ( OBJECT *me_ttree, int16_t me_titem, CONST +int8_t *me_ttext ); +
  +
Umsetzung: +
  +
int16_t menu_text (OBJECT *me_ttree, int16_t me_titem,
+                   CONST int8_t *me_ttext)
+{
+   int_in[0]  = me_titem;
+   addr_in[0] = me_ttree;
+   addr_in[1] = me_ttext;
+
+   return ( crys_if(34) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]34 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]me_titem
addr_inaddr_in[0]me_ttree
addr_in+4addr_in[1]me_ttext
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.17.11 menu_tnormal

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Menu Text normal« - stellt einen Menütitel invers oder +normal dar. +
  +
AES-Nummer: 33 +
  +
Deklaration: int16_t menu_tnormal ( OBJECT *me_ntree, int16_t me_ntitle, +int16_t me_nnormal ); +
  +
Beschreibung: Die Funktion invertiert einen Menütitel. Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
me_ntree Adresse des Menü-Objektbaumes +
me_ntitle Nummer des Menütitels +
me_nnormal +
+
+ + + + + + + + + + +
0=Menü invers darstellen
1=Menü normal darstellen
+
+ + +
+ +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Menüs +
  +
Querverweis: Binding +
  + +
+ +

8.17.11.1 Bindings für menu_tnormal

+ + + + + + + + + +
C: int16_t menu_tnormal ( OBJECT *me_ntree, int16_t me_ntitle, +int16_t me_nnormal ); +
  +
Umsetzung: +
  +
int16_t menu_tnormal (OBJECT *me_ntree, int16_t me_ntitle,
+                      int16_t me_nnormal)
+{
+   int_in[0]  = me_ntitle;
+   int_in[1]  = me_nnormal;
+   addr_in[0] = me_ntree;
+
+   return ( crys_if(33) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]33 # Opcode der Funktion
control+2control[1]2 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]me_ntitle
int_in+2int_in[1]me_nnormal
addr_inaddr_in[0]me_ntree
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.17.12 menu_unregister

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Menu unregister« - Accessory Namen aus Menü entfernen +
  +
AES-Nummer: 36 +
  +
Deklaration: int16_t menu_unregister ( int16_t mid ); +
  +
Beschreibung: Die Funktion erlaubt es einem Accessorie, seinen Namen wieder +aus der Menüzeile zu entfernen. +
  +
Der Parameter mid ist die Applikations-ID des +entsprechenden Accessories. +
  +
Ergebnis: z.Zt. unbekannt. +
  +
Verfügbar: Die Funktion steht nur unter PC-GEM ab 2.0, KAOS ab 1.4.2 und +MagiC zur Verfügung. +
  +
Gruppe: Menüs +
  +
Querverweis: Binding   menu_register +
  + +
+ +

8.17.12.1 Bindings für menu_unregister

+ + + + + + + + + +
C: int16_t menu_unregister ( int16_t mid ); +
  +
Umsetzung: +
  +
int16_t menu_unregister (int16_t mid)
+{
+   int_in[0] = mid;
+   return ( crys_if(36) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]36 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]mid
int_outint_out[0]Return-Wert
+
+ + +
+ +
+ +Home +AESAES +MagiC FunktionenMagiC Funktionen +ObjektfunktionenObjektfunktionen + + diff --git a/de/n_aes.html b/de/n_aes.html new file mode 100644 index 000000000..e72c159a7 --- /dev/null +++ b/de/n_aes.html @@ -0,0 +1,39 @@ + + + + + +Die Anleitung zum TOS: N.AES + + + + + + + + + +Home +Inhaltsverzeichnis +Shared LibrariesShared Libraries +form_error in N.AESform_error in N.AES + +
+ +

12 N.AES

+ +
+
+ +Home +Inhaltsverzeichnis +Shared LibrariesShared Libraries +form_error in N.AESform_error in N.AES + + diff --git a/de/naes_cnf.html b/de/naes_cnf.html new file mode 100644 index 000000000..cc74bd7eb --- /dev/null +++ b/de/naes_cnf.html @@ -0,0 +1,85 @@ + + + + + +Die Anleitung zum TOS: Die N.AES-Konfigurationsdatei + + + + + + + + + +Home +N.AESN.AES +Der N.AES-CookieDer N.AES-Cookie +XaAESXaAES + +
+ +

12.3 Die N.AES-Konfigurationsdatei

+ +

Die Konfigurationsdatei N_AES.CNF, die N.AES beim Systemstart +einliest und auswertet, enthält die benutzerdefinierbaren +Einstellungen (CNF-Variablen) und Kommandos (CNF-Befehle). +

+

Bitte erschrecken Sie nicht vor der Vielfalt der +Einstellungsmöglichkeiten! Die mitgelieferte Konfigurationsdatei +enthält Standardwerte für die einzelnen Variablen und sollte von +Ihnen zunächst ohne Änderungen eingesetzt werden kön- nen. Haben +Sie sich ein wenig mit N.AES vertraut gemacht, können Sie die +verschiedenen Einstellungen zu einem späteren Zeitpunkt nach Ihrem +Geschmack verändern. +

+

Die Konfigurationsdatei wird zur Laufzeit nicht im Speicher +gehalten, sondern zu Beginn einmalig ausgewertet und danach der für +sie benötigte Speicher wieder freigegeben. Daher braucht (und sollte) +man hier auch nicht mit Kommentaren zu sparen. +

+

Ein Kommentar wird durch das Zeichen # am Anfang einer Zeile +eingeleitet und reicht bis zum Ende dieser Zeile. Alles, was in einer +solchen Kommentarzeile steht, wird bei der Auswertung der +Konfigurationsdatei ignoriert. Ebenso werden Leerzeilen bei der +Auswertung übergangen. +

+

Die in der Konfigurationsdatei möglichen Angaben lassen sich in +drei Gruppen einteilen: +

+
    +
  • Mit Hilfe der CNF-Variablen werden die globalen +Betriebsparameter von N.AES festgelegt, welche zur Laufzeit momentan +nicht mehr geändert werden können. Zum Beispiel kann mit Hilfe +dieser Variablen die Größe der Iconfenster festgelegt werden. +
      +

  • +
  • Die CNF-Befehle werden kurz nach dem Einlesen der +Konfigurationsdatei ausgeführt und haben eine unmittelbare Wirkung. +So können mit Hilfe dieser Kommandos Programme gestartet oder +Umgebungsvariablen gesetzt werden. +
      +

  • +
  • Die CNF-Debugvariablen haben nur in einer speziellen +N.AES-Version eine Bedeutung, welche nicht Bestandteil der +Distribution ist. +
      +

  • +
+ +

Anmerkung zu den Variablen: Bitte gehen Sie besonders vorsichtig +beim Ändern von Einstellungen vor, die das System betreffen +(sstacksize, mpipesize, qsbchars, ...). Zu kleine oder zu große Werte +können eventuell ungewünschte Effekte hervorrufen oder sogar zum +Fehlverhalten von N.AES führen. +

+
+ +Home +N.AESN.AES +Der N.AES-CookieDer N.AES-Cookie +XaAESXaAES + + diff --git a/de/naes_cookie.html b/de/naes_cookie.html new file mode 100644 index 000000000..a6a5cc6ae --- /dev/null +++ b/de/naes_cookie.html @@ -0,0 +1,140 @@ + + + + + +Die Anleitung zum TOS: Der N.AES-Cookie + + + + + + + + + +Home +N.AESN.AES +form_error in N.AESform_error in N.AES +Die N.AES-KonfigurationsdateiDie N.AES-Konfigurationsdatei + +
+ +

12.2 Der N.AES-Cookie

+ +

N.AES legt einen Cookie mit dem Namen 'nAES' an. Sein Wert ist +ein Zeiger auf eine Struktur (readable), die folgendermaßen aufgebaut +ist: +

+
typedef struct {
+    unsigned int    version;
+    unsigned int    date;
+    unsigned int    time;
+    unsigned int    flags;
+    CNF_VAR         **config;
+    unsigned long   unused_2;
+} N_AESINFO;
+
+ + + + + + + + + + + + + + + +
version: Die hexadezimal codierte Versionsnummer von N.AES. Ein Wert von +0x0058 würde Versionsnummer 0.5.8 bedeuten, ein Wert von 0x0107 die +Version 1.0.7 +
  +
date/time: Das Erstelldatum und die Erstellzeit im TOS-Format, d.h so, wie +es Tgetdate und Tgettime liefern. +
  +
Hinweis: +
Die beim Booten von N.AES ausgegebene Zeit entspricht dem +Zeitpunkt der Compilation einer bestimmten Quelldatei von N.AES, die +Zeitangabe, die man im Cookie vorfindet, wird mittels eines +Patchprogrammes gesetzt und ist die eigentlich relevante Angabe. +
  +
flags: Bitmaske, deren Bits folgende Bedeutung haben: +
+
  + + + + + + + + + + + + + + + +
Bit  0 = 0: ST-Version +
+
Bit  0 = 1: TT-Version (Compileroption '68020') +
+
Bit  1 = 0: normale Version +
+
Bit  1 = 1: Debug-Version +
Bit 15 = Wenn diese Bit TRUE ist wurde der Cookie von XaAES angelegt. + +
+ +
config: Zeiger auf eine Liste der CNF-Variablen, die während das +System läuft geändert werden können. Der Speicher ist (global) +alloziert. Das mitgelieferte N_CONTRL.CPX macht gebrauch davon. +
  +
/* cnf types */
+#define CNF_TEND  0   /* Kennzeichnet das Ende der Liste. */
+#define CNF_TBOOL 1   /* true/false.                      */
+#define CNF_TWORD 2   /* 16 bit signed wert.              */
+#define CNF_TLONG 3
+/* weitere können folgen! */
+
+typedef enum {false, true} bool;
+
+typedef struct
+{
+  union cnf_typ { bool b; WORD w; LONG l; }
+          val;            /* der Inhalt.             */
+  WORD    typ;            /* Typ, CNF_T...           */
+  BYTE    text[22];       /* Name, wie in N_AES.CNF. */
+} CNF_INF;
+
+typedef struct
+{
+  BYTE    typ[16];  /* Kategorie, Text aus den Strings *
+                     * des Dialog-Baums CNF_TREE der   *
+                     * N_AESSYS.RSC.                   *
+                     * zB. "Fenster" oder "System".    */
+  CNF_INF *cnf_inf; /* Die Variablen eben.             */
+} CNF_VAR;
+
+
Das Ende der Liste wird durch einen NULL-Zeiger signalisiert. +
  +
unused_2: Freiplatz für spätere N.AES-Versionen +
  + +
+ +
+ +Home +N.AESN.AES +form_error in N.AESform_error in N.AES +Die N.AES-KonfigurationsdateiDie N.AES-Konfigurationsdatei + + diff --git a/de/naes_formerror.html b/de/naes_formerror.html new file mode 100644 index 000000000..68d325b60 --- /dev/null +++ b/de/naes_formerror.html @@ -0,0 +1,167 @@ + + + + + +Die Anleitung zum TOS: form_error in N.AES + + + + + + + + + +Home +N.AESN.AES +N.AESN.AES +Der N.AES-CookieDer N.AES-Cookie + +
+ +

12.1 form_error in N.AES

+

Die form_error-Funktion ist erweitert worden, so daß für +sämtliche GEMDOS-Fehler eine vernünftige Nachricht bei einem Aufruf +von form_error ausgegeben werden kann. +

+

Ein form_error()-Code berechnet sich aus einem GEMDOS-Fehlercode +durch: +

+

formcode = ~gemdoscode - 30 +

+

~ ist bitweises NOT +

+

In der Tabelle "form_error-Codes" werden alle möglichen +form_error-Codes den entsprechenden GEMDOS-Fehlern gegenübergestellt. +In der ersten Spalte steht der form_error-Code und der Name des +zugehörigen Objektes in der Systemressource, in der zweiten Spalte +der entsprechende GEMDOS-Fehler und in der dritten Spalte eine kurze +Beschreibung des Fehlers. +

+

Bitte beachten Sie, daß nicht allen form_error-Codes ein +GEMDOS-Fehler zugeordnet ist. +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CodeGEMDOS-FehlerBedeutung
0 ERR_TOSERR  !~
1 ERR_INVFN-32 EINVFNinvalid function
2 ERR_NOTFOUND-33 EFILNFfile not found
3 ERR_NOTFOUND-34 EPTHNFpath not found
4 ERR_NHNDL-35 ENHNDLno more handles
5 ERR_ACCDN-36 EACCDNaccess denied
6 ERR_IHNDL-37 EBADFinvalid handle
8 ERR_NSMEM-39 ENSMEMinsufficient memory
9 ERR_IMBA-40 EIMBAinvalid memory block address
15 ERR_DRIVE-46 EDRIVEinvalid drive specification
17 ERR_XDEV-48 EXDEVcross device rename
18 ERR_NOTFOUND-49 ENMFILno more files (fsnext)
27 ERR_LOCKING-58 ELOCKEDrecord is locked already
28 ERR_LOCKING-59 ENSLOCKinvalid lock removal request
33 ERR_TOSERR-64 ERANGErange error
34 ERR_INTRN-65 EINTRNinternal error
35 ERR_PLFMT-66 EPLFMTinvalid program load format
36 ERR_GSBF-67 EGSBFmemory block growth failure
49 ERR_LOOP-80 ELOOPtoo many symbolic links
50 ERR_PIPE-81 EPIPEwrite to a broken pipe
+
+ +

Jedem der verschiedenen form_errors entspricht auch eine +entsprechende Alertbox in der Systemressourcedatei N_AESSYS.RSC, deren +symbolische Konstante mit 'ERR_' beginnt und auch in der Tabelle +"form_error-Codes" in der ersten Spalte angegeben ist. +

+
+ +Home +N.AESN.AES +N.AESN.AES +Der N.AES-CookieDer N.AES-Cookie + + diff --git a/de/nap_bionet100.html b/de/nap_bionet100.html new file mode 100644 index 000000000..bcd2354c8 --- /dev/null +++ b/de/nap_bionet100.html @@ -0,0 +1,127 @@ + + + + + +Die Anleitung zum TOS: NAP BioNet100 + + + + + + + + + +Home +GEMDOSGEMDOS +C'Task RoyalC'Task Royal +PowerDOSPowerDOS + +
+ +

5.20 NAP BioNet100

+ + + +

BioNet was a GEMDOS network extension from BIODATA GmbH. +

+

Three functions are added to the GEMDOS, which allow the BioNet +Client to communicate with a 'Nap' hosted by the Nap Server. A server +can run multiple Nap, each of them is identified by a +nap_handle associated to a internal NAP_COM structure. +

+ + + + + + + + + + + + +
Number Meaning +
  +
91 nap_io() Nap input/output +
This function is the legacy function for bidirectional +communication with the server. nap_io is divided into the +nap_in_s and nap_out_s functions, which are executed +one after the other. +
The return value is the number of returned bytes. +
  +
Syntax: +
int32_t gemdos( 91, int16_t nap_handle, int8_t *buf_out, int32_t +len_out, int8_t *buf_in, int32_t len_in); +
  +
130 nap_in_s() Nap input +
This function writes data to the server. +
Returns the number of transferred bytes. +
  +
Syntax: +
int32_t gemdos( 130, int16_t nap_handle, int32_t mode, int32_t +count, int8_t *buffer); +
  +
131 nap_out_s() Nap output +
This function reads data from the server. +
Returns the number of transferred bytes. +
  +
Syntax: +
int32_t gemdos( 131, int16_t nap_handle, int32_t mode, int32_t +count, int8_t *buffer); +
  + +
+ +

The mode parameter is stored into the field +nap_wert by the server. Values from 0 to -9L are reserved by +BioNet100. The client can set mode to a value less than -9L to +acquire a lock, or to 0L to release the lock. If no transfer is +required, count should be set to 0. +

+

The NAP_COM structure is defined as follows: +

+
typedef struct
+{
+  int16_t    nap_handle;   /* Nap handle that identifies a program   */
+  int32_t    nummer;       /* BioNet client number                   */
+  int16_t    status;       /* Status of the client                   */
+                           /*   Bit 0: nap_in_s is active            */
+                           /*   Bit 1: nap_out_s is active           */
+                           /*   Bit 2: first data burst              */
+                           /*   Bit 3: last data burst               */
+                           /*   Bit 4: fatal error                   */
+  int32_t    ret_wert;     /* If bit 4 of status is set, specifies   */
+                           /* the message sent to the client:        */
+                           /*   0 = 'Cant repair protocoll-error...' */
+                           /*   1 = 'Repairing protocoll-error...'   */
+  int32_t    nap_wert;     /* If nonzero, prevents other client to   */
+                           /* communicate with this Nap. By default, */
+                           /* set to nummer. This value is returned  */
+                           /* as error-code to other client          */
+  int8_t    *in_buffer;    /* Pointer to the data buffer that holds  */
+                           /* either the data to read from nap_in_s, */
+                           /* or command data for nap_out_s          */
+  int8_t    *out_buffer;   /* Pointer to the data buffer that holds  */
+                           /* the data to send to the client through */
+                           /* nap_out_s.                             */
+  int32_t    ges_count;    /* Total number of data to send/receive   */
+  int32_t    akt_count;    /* Current number of data to send/receive */
+}
+
+

Note: The BioNet server complies to the XBRA protocol +with ID 'BioS'. +

+

Querverweis: GEMDOS   BIOS-Funktionsliste   XBIOS-Funktionsliste +

+
+ +Home +GEMDOSGEMDOS +C'Task RoyalC'Task Royal +PowerDOSPowerDOS + + diff --git a/de/objc.html b/de/objc.html new file mode 100644 index 000000000..c7a5ed0ba --- /dev/null +++ b/de/objc.html @@ -0,0 +1,3133 @@ + + + + + +Die Anleitung zum TOS: Objektfunktionen + + + + + + + + + +Home +AESAES +MenüfunktionenMenüfunktionen +ProzessverwaltungProzessverwaltung + +
+ +

8.18 Objektfunktionen

+

Diese Bibliothek stellt Funktionen zur Verfügung, um Objekte +(gleich welcher Art) zu zeichnen und zu manipulieren; hierzu gibt es +die folgenden Routinen: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
objc_add Objekt im Objektbaum einfügen +
objc_change Status eine Objekts ändern +
objc_delete Objekt aus dem Objektbaum entfernen +
objc_draw Objekt (mit Unterobjekten) zeichnen +
objc_edit Text eines Objektes editieren +
objc_find Objekt an der Mausposition ermitteln +
objc_offset Bildschirmkoordinaten eines Objekts ermitteln +
objc_order Reihenfolge im Objektbaum umstellen +
objc_sysvar Modifikation der 3D-Objekte +
objc_wchange Status eines Objektes ändern (im Fenster) +
objc_wdraw Objekt (mit Unterobjekten) zeichnen (im Fenster) +
objc_wedit Text eines Objektes editieren (im Fenster) +
objc_xedit Text eines Objektes editieren +
objc_xfind Objektindex über Position ermitteln +
• objc_xoffset z.Zt. keine Informationen bekannt +
x_objc_edit Text eines Objektes editieren, mit Erweiterung + +
+ +

Hinweis: Eine besondere Beachtung hat dabei objc_sysvar +verdient, mit dessen Hilfe der 3D-Look der Objekte gesteuert (und ab +MagiC 3 auch abgeschaltet) werden kann. +

+

Querverweis: AES   Objektstruktur im AES   Scrollende Eingabefelder   Style-Guidelines +

+

8.18.1 objc_add

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Object add« - fügt ein Objekt im Objektbaum ein. +
  +
AES-Nummer: 40 +
  +
Deklaration: int16_t objc_add ( OBJECT *ob_atree, int16_t ob_aparent, +int16_t ob_achild ); +
  +
Beschreibung: Die Funktion stellt zwischen zwei Objekten in einem Objektbaum +eine Hierarchische Verknüpfung her. Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
ob_atree Adresse des Objektbaumes +
ob_aparent Nummer des Objekts, zu dem das Child hinzugefügt werden soll +
ob_achild Nummer des Childs, d.h. des hinzuzufügenden Objektes + +
+ +
Hinweis: Beim Einfügen müssen die Komponenten +ob_head und ob_tail der OBJECT-Struktur bereits +passend initialisiert sein. +
  +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Objekte +
  +
Querverweise: Binding   OBJECT   objc_delete +
  + +
+ +

8.18.1.1 Bindings für objc_add

+ + + + + + + + + +
C: int16_t objc_add ( OBJECT *ob_atree, int16_t ob_aparent, +int16_t ob_achild ); +
  +
Umsetzung: +
  +
int16_t objc_add (OBJECT *ob_atree, int16_t ob_aparent,
+                  int16_t ob_achild)
+{
+   int_in[0]  = ob_aparent;
+   int_in[1]  = ob_achild;
+   addr_in[0] = ob_atree;
+
+   return ( crys_if(40) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]40 # Opcode der Funktion
control+2control[1]2 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]ob_aparent
int_in+2int_in[1]ob_achild
addr_inaddr_in[0]ob_atree
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.18.2 objc_change

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Object change« - verändert die Darstellung eines Objekts +innerhalb der angegebenen Grenzen. +
  +
AES-Nummer: 47 +
  +
Deklaration: int16_t objc_change ( OBJECT *ob_ctree, int16_t ob_cobject, +int16_t ob_cresvd, int16_t ob_cxclip, int16_t ob_cyclip, int16_t +ob_cwclip, int16_t ob_chclip, int16_t ob_cnewstate, int16_t ob_credraw +); +
  +
Beschreibung: Die Funktion ändert den Status eines Objektes und zeichnet es +ggfs. neu. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
ob_ctree Adresse des Objektbaumes +
ob_cobject Nummer des betreffenden Objektes +
ob_cresvd reserviert, sollte 0 sein +
ob_cxclip x-Koordinate +
ob_cyclip y-Koordinate +
ob_cwclip Breite +
ob_chclip Höhe des Clipping-Rechtecks +
ob_cnewstate neuer Status des Objektes +
ob_credraw +
+
+ + + + + + + + + + +
0=Objekt nicht neu zeichnen
1=Objekt neu zeichnen
+
+ + +
+ +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Objekte +
  +
Querverweise: Binding   objc_wchange   OBJECT +
  + +
+ +

8.18.2.1 Bindings für objc_change

+ + + + + + + + + +
C: int16_t objc_change ( OBJECT *ob_ctree, int16_t ob_cobject, +int16_t ob_cresvd, int16_t ob_cxclip, int16_t ob_cyclip, int16_t +ob_cwclip, int16_t ob_chclip, int16_t ob_cnewstate, int16_t ob_credraw +); +
  +
Umsetzung: +
  +
int16_t objc_change (OBJECT *ob_ctree, int16_t ob_cobject,
+                     int16_t ob_cresvd, int16_t ob_cxclip,
+                     int16_t ob_cyclip, int16_t ob_cwclip,
+                     int16_t ob_chclip, int16_t ob_cnewstate,
+                     int16_t ob_credraw)
+{
+   int_in[0]  = ob_cobject;
+   int_in[1]  = ob_cresvd;
+   int_in[2]  = ob_cxclip;
+   int_in[3]  = ob_cyclip;
+   int_in[4]  = ob_cwclip;
+   int_in[5]  = ob_chclip;
+   int_in[6]  = ob_cnewstate;
+   int_in[7]  = ob_credraw;
+
+   addr_in[0] = ob_ctree;
+
+   return ( crys_if(47) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]47 # Opcode der Funktion
control+2control[1]8 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]ob_cobject
int_in+2int_in[1]ob_cresvd
int_in+4int_in[2]ob_cxclip
int_in+6int_in[3]ob_cyclip
int_in+8int_in[4]ob_cwclip
int_in+10int_in[5]ob_chclip
int_in+12int_in[6]ob_cnewstate
int_in+14int_in[7]ob_credraw
addr_inaddr_in[0]ob_ctree
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.18.3 objc_delete

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Object delete« - löst ein Objekt aus einem Objektbaum. +
  +
AES-Nummer: 41 +
  +
Deklaration: int16_t objc_delete ( OBJECT *ob_dltree, int16_t ob_dlobject ); +
  +
Beschreibung: Die Funktion entfernt ein Objekt aus einem Objektbaum. Es gilt: +
  +

+
+ + + + + + + + + + + + +
ParameterBedeutung
ob_dltreeAdresse des Objektbaumes
ob_dlobjectNummer des zu löschenden Objektes
+
+ +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Objekte +
  +
See also: Binding   OBJECT   objc_add +
  + +
+ +

8.18.3.1 Bindings für objc_delete

+ + + + + + + + + +
C: int16_t objc_delete ( OBJECT *ob_dltree, int16_t ob_dlobject ); +
  +
Umsetzung: +
  +
int16_t objc_delete (OBJECT *ob_dltree, int16_t ob_dlobject)
+{
+   int_in[0]  = ob_dlobject;
+   addr_in[0] = ob_dltree;
+
+   return ( crys_if(41) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]41 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]ob_dlobject
addr_inaddr_in[0]ob_dltree
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.18.4 objc_draw

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Object draw« - zeichnet ein Objekt. +
  +
AES-Nummer: 42 +
  +
Deklaration: int16_t objc_draw ( OBJECT *ob_drtree, int16_t ob_drstart, +int16_t ob_drdepth, int16_t ob_drxclip, int16_t ob_dryclip, int16_t +ob_drwclip, int16_t ob_drhclip ); +
  +
Beschreibung: Die Funktion stellt Objekte (oder Teile von Objekten) auf dem +Bildschirm dar. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
ob_drtree Adresse des Objektbaumes +
ob_drstart Nummer des ersten zu zeichnenden Objektes +
ob_drdepth Anzahl der zu zeichnenden Ebenen (0 = nur das erste Objekt), +max 8 +
ob_drxclip x-Koordinate +
ob_dryclip y-Koordinate +
ob_drwclip Breite +
ob_drhclip Höhe des begrenzenden Rechteckes. + +
+ +
Hinweis: Über die Parameter kann ein Rechteck angegeben +werden, auf das sich die Darstellung beschränken soll (Clipping). +
  +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Objekte +
  +
Querverweise: Binding   objc_wdraw   OBJECT +
  + +
+ +

8.18.4.1 Bindings für objc_draw

+ + + + + + + + + +
C: int16_t objc_draw ( OBJECT *ob_drtree, int16_t ob_drstart, +int16_t ob_drdepth, int16_t ob_drxclip, int16_t ob_dryclip, int16_t +ob_drwclip, int16_t ob_drhclip ); +
  +
Umsetzung: +
  +
int16_t objc_draw (OBJECT *ob_drtree, int16_t ob_drstart,
+                   int16_t ob_drdepth, int16_t ob_drxclip,
+                   int16_t ob_dryclip, int16_t ob_drwclip,
+                   int16_t ob_drhclip)
+{
+   int_in[0]  = ob_drstart;
+   int_in[1]  = ob_drdepth;
+   int_in[2]  = ob_drxclip;
+   int_in[3]  = ob_dryclip;
+   int_in[4]  = ob_drwclip;
+   int_in[5]  = ob_drhclip;
+
+   addr_in[0] = ob_drtree;
+
+   return ( crys_if(42) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]42 # Opcode der Funktion
control+2control[1]6 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]ob_drstart
int_in+2int_in[1]ob_drdepth
int_in+4int_in[2]ob_drxclip
int_in+6int_in[3]ob_dryclip
int_in+8int_in[4]ob_drwclip
int_in+10int_in[5]ob_drhclip
addr_inaddr_in[0]ob_drtree
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.18.5 objc_edit

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Object edit« - editiert einen Text in einem Objekt. +
  +
AES-Nummer: 46 +
  +
Deklaration: int16_t objc_edit ( OBJECT *ob_edtree, int16_t ob_edobject, +int16_t ob_edchar, int16_t *ob_edidx, int16_t ob_edkind ); +
  +
Beschreibung: Die Funktion ermöglicht Texteingaben in Objekte des Typs +G_FTEXT oder G_FBOXTEXT. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
ob_edtree Adresse des Objektbaumes +
ob_edobject Nummer des zu editierenden Objektes +
ob_edchar eingegebenes Zeichen +
ob_edidx Position des Zeichens im String +
ob_edkind Funktionsauswahl, wie folgt: + + + + + + + + + + + + + + + + +
EDSTART 0 reserviert +
EDINIT 1 formatierten String berechnen, und Cursor einschalten +
EDCHAR 2 Zeichen verarbeiten und String anschließend neu anzeigen +
EDEND 3 Cursor ausschalten + +
+ + +
+ +
Hinweis: MagiC ab Version 2.0 kennt eine erweiterte +Funktion objc_xedit. +
  +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Objekte +
  +
Querverweise: Binding   objc_wedit   OBJECT   TEDINFO   objc_xedit +
  + +
+ +

8.18.5.1 Bindings für objc_edit

+ + + + + + + + + +
C: int16_t objc_edit ( OBJECT *ob_edtree, int16_t ob_edobject, +int16_t ob_edchar, int16_t *ob_edidx, int16_t ob_edkind ); +
  +
Umsetzung: +
  +
int16_t objc_edit (OBJECT *ob_edtree, int16_t ob_edobject,
+                   int16_t ob_edchar, int16_t *ob_edidx,
+                   int16_t ob_edkind)
+{
+   int_in[0]  = ob_edobject;
+   int_in[1]  = ob_edchar;
+   int_in[2]  = *ob_edidx;
+   int_in[3]  = ob_edkind;
+   addr_in[0] = ob_edtree;
+
+   crys_if (46);
+
+   *ob_edidx = int_out[1];
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]46 # Opcode der Funktion
control+2control[1]4 # Einträge in int_in
control+4control[2]2 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]ob_edobject
int_in+2int_in[1]ob_edchar
int_in+4int_in[2]ob_edidx
int_in+6int_in[3]ob_edkind
addr_inaddr_in[0]ob_edtree
int_outint_out[0]Return-Wert
int_out+2int_out[1]ob_edidx
+
+ + +
+ +

8.18.6 objc_find

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Object find« - ermittelt, welches Objekt sich an der +angegebenen Bildschirmposition befindet. +
  +
AES-Nummer: 43 +
  +
Deklaration: int16_t objc_find ( OBJECT *ob_ftree, int16_t ob_fstartob, +int16_t ob_fdepth, int16_t ob_fmx, int16_t ob_fmy ); +
  +
Beschreibung: Die Funktion bestimmt das Objekt, welches sich unter dem +Mauszeiger befindet. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
ob_ftree Adresse des Objektbaumes +
ob_fstartob Nummer des Objektes, bei dem die Suche beginnen soll +
ob_fdepth Anzahl der Ebenen, die durchsucht werden sollen (0 = nur +Mutterobjekt) +
ob_fmx x-Koordinate +
ob_fmy y-Koordinate der Bildschirmposition + +
+ +
Ergebnis: Als Ergebnis wird die Nummer des entsprechenden Objektes (oder +-1 für 'nicht gefunden') zurückgegeben. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Objekte +
  +
Querverweise: Binding   OBJECT   objc_xfind +
  + +
+ +

8.18.6.1 Bindings für objc_find

+ + + + + + + + + +
C: int16_t objc_find ( OBJECT *ob_ftree, int16_t ob_fstartob, +int16_t ob_fdepth, int16_t ob_fmx, int16_t ob_fmy ); +
  +
Umsetzung: +
  +
int16_t objc_find (OBJECT *ob_ftree, int16_t ob_fstartob,
+                   int16_t ob_fdepth, int16_t ob_fmx,
+                   int16_t ob_fmy)
+{
+   int_in[0]  = ob_fstartob;
+   int_in[1]  = ob_fdepth;
+   int_in[2]  = ob_fmx;
+   int_in[3]  = ob_fmy;
+   addr_in[0] = ob_ftree;
+
+   return ( crys_if(43) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]43 # Opcode der Funktion
control+2control[1]4 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]ob_fstartob
int_in+2int_in[1]ob_fdepth
int_in+4int_in[2]ob_fmx
int_in+6int_in[3]ob_fmy
addr_inaddr_in[0]ob_ftree
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.18.7 objc_offset

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Object Offset« - berechnet die Position eines Objekts auf +dem Bildschirm. +
  +
AES-Nummer: 44 +
  +
Deklaration: int16_t objc_offset ( OBJECT *ob_oftree, int16_t ob_ofobject, +int16_t *ob_ofxoff, int16_t *ob_ofyoff ); +
  +
Beschreibung: Die Funktion berechnet die Position eines Objektes in absoluten +Bildschirmkoordinaten. Es gilt: +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
ob_oftreeAdresse des Objektbaumes
ob_ofobjectNummer des entsprechenden Objektes
ob_ofxoffberechnete x-Koordinate
ob_ofyoffberechnete y-Koordinate
+
+ +
Ergebnis: Ein Rückgabewert von 0 kennzeichnet einen Fehler. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Objekte +
  +
See also: Binding   OBJECT   form_center +
  + +
+ +

8.18.7.1 Bindings für objc_offset

+ + + + + + + + + +
C: int16_t objc_offset ( OBJECT *ob_oftree, int16_t ob_ofobject, +int16_t *ob_ofxoff, int16_t *ob_ofyoff ); +
  +
Umsetzung: +
  +
int16_t objc_offset (OBJECT *ob_oftree, int16_t ob_ofobject,
+                     int16_t *ob_ofxoff, int16_t *ob_ofyoff)
+{
+   int_in[0]  = ob_ofobject;
+   addr_in[0] = ob_oftree;
+
+   crys_if (44);
+
+   *ob_ofxoff = int_out[1];
+   *ob_ofyoff = int_out[2];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]44 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]3 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]ob_ofobject
addr_inaddr_in[0]ob_oftree
int_outint_out[0]Return-Wert
int_out+2int_out[1]ob_ofxoff
int_out+4int_out[2]ob_ofyoff
+
+ + +
+ +

8.18.8 objc_order

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Object Order« - ordnet ein Objekt innerhalb eines +Objektbaumes neu an. +
  +
AES-Nummer: 45 +
  +
Deklaration: int16_t objc_order ( OBJECT *ob_ortree, int16_t ob_orobject, +int16_t ob_ornewpos ); +
  +
Beschreibung: Die Funktion verändert die Position eines Objektes innerhalb +eines Unterbaumes. Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
ob_ortree Adresse des Objektbaumes +
ob_orobject Nummer des betreffenden Objektes +
ob_ornewpos neue Position im Baum, und zwar: +
+
+ + + + + + + + + + + + + + + + + + + + +
-1=an das Ende
0=an den Anfang
1=an die zweite Stelle
2=an die dritte Stelle (usw.)
+
+ + +
+ +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Objekte +
  +
Querverweise: Binding   OBJECT +
  + +
+ +

8.18.8.1 Bindings für objc_order

+ + + + + + + + + +
C: int16_t objc_order ( OBJECT *ob_ortree, int16_t ob_orobject, +int16_t ob_ornewpos ); +
  +
Umsetzung: +
  +
int16_t objc_order (OBJECT *ob_ortree, int16_t ob_orobject,
+                    int16_t ob_ornewpos)
+{
+   int_in[0]  = ob_orobject;
+   int_in[1]  = ob_ornewpos;
+   addr_in[0] = ob_ortree;
+
+   return ( crys_if(45) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]45 # Opcode der Funktion
control+2control[1]2 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]ob_orobject
int_in+2int_in[1]ob_ornewpos
addr_inaddr_in[0]ob_ortree
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.18.9 objc_sysvar

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Object sysvar« - Manipulation der 3D Objekte +
  +
AES-Nummer: 48 +
  +
Deklaration: int16_t objc_sysvar ( int16_t ob_smode, int16_t ob_swhich, +int16_t ob_sival1, int16_t ob_sival2, int16_t *ob_soval1, int16_t +*ob_soval2 ); +
  +
Beschreibung: Die Funktion erlaubt es, das Erscheinungsbild der 3D-Objekte +des AES zu setzen bzw. zu erfragen. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
ob_smode +
+
+ + + + + + + + + + +
0-Status abfragen
1-neuen Status setzen
+
+ +
ob_swhich Gewünschte 3D-Komponente: +
+ +
LK3DIND (1) - Indikatoren + + + + + + +
Modus 0: ob_soval1 = 0 +
beim Selektieren eines Objektes bewegt sich der zugehörige Text +nicht. +
ob_soval1 = 1 +
beim Selektieren eines Objektes bewegt sich der zugehörige Text. +
ob_soval2 = 0 +
Objektfarbe ändert sich beim Selektieren nicht. +
ob_soval2 = 1 +
Objektfarbe wird beim Selektieren verändert. +
Modus 1: wie Modus 0, nur lassen sich jetzt die jeweiligen Werte, über +die Parameter ob_sival1 bzw. ob_sival2 setzen. + +
+ + +
LK3DACT (2) - Aktivatoren +
Bestimmt das Verhalten der Aktivatoren. Alle weiteren Angaben sind +analog den Indikatoren zu verwenden. +
+ +
INDBUTCOL (3) - Farbe nicht-selektierter Indikatoren! + + + + + + +
Modus 0: ob_soval1 ist die aktuelle Farbe. +
Modus 1: ob_sival1 enthält die zu setzende Farbe. + +
+ + +
ACTBUTCOL (4) - Farbe nicht-selektierter Aktivatoren + + + + + + +
Modus 0: ob_soval1 ist die aktuelle Farbe. +
Modus 1: ob_sival1 enthält die zu setzende Farbe. + +
+ + +
BACKGRCOL (5) - Farbe des 3D Hintergrundes + + + + + + +
Modus 0: ob_soval1 ist die aktuelle Farbe. +
Modus 1: ob_sival1 enthält die zu setzende Farbe. + +
+ + +
AD3DVALUE (6) - Pixelvergrößerung erfragen + + + + + + +
Modus 0: ob_soval1 +
Anzahl der Pixel in horizontaler Richtung, um die 3D-Buttons nach +jeder Seite vergrößert werden. +
ob_soval2 +
Anzahl der Pixel in vertikaler Richtung, um die 3D-Buttons nach +jeder Seite vergrößert werden. +
Hinweis: Dieser Modus liefert in MagiC stets den Wert 0, +da die Objektgrößen vom System nicht angetastet werden. +
Modus 1: z.Zt. nicht unterstützt. + +
+ + +
MX_ENABLE3D (10) - 3D Look ein-/ausschalten +
Dieser Modus ist nur unter MagiC (ab Version 3.0) vorhanden und +erlaubt es, den 3D-Look ein- bzw. auszuschalten. Es gilt: + + + + + + +
Modus 0: ob_soval1 = 0 +
(3D ist aus) +
ob_soval1 = 1 +
(3D ist aktiv) +
Modus 1: ob_sival1 = 0 +
ob_sival2 = 0 +
(3D-Look aus) +
ob_sival1 = 1 +
ob_sival2 = 1 +
(3D-Look ein) + +
+ + +
MX_MENUCOL (11) - Menüfarbe +
Dieser Modus ist nur unter MagiC (ab Version 6.0 09.04.1998) +vorhanden. +
Es kann die Farbe der Menüzeile ermittelt werden. + + + + + + +
Modus 0: ob_soval1 ist die aktuelle Farbe. +
Modus 1: Liefert einen Fehler. + +
+ + +
+ +
Hinweis: Die per objc_sysvar vorgenommenen Einstellungen +gelten nicht nur für das eigene Programm, sondern für das ganze +System. Aus diesem Grund sollte die Funktion in normalen +Anwenderprogrammen nicht benutzt werden, sondern nur in +Konfigurations-Programmen (z.B. CPX-Modulen) zum Einsatz kommen. +
  +
In MagiC 2.0 ist die Funktion zwar vorhanden, läßt jedoch +aufgrund der noch fehlenden 3D-Objekte keine Modifikationen zu. +Deshalb sollte der Rückgabewert der Funktion beachtet werden. Ab +MagiC 3 steht der 3D-Look zwar zur Verfügung, jedoch gilt es einige +Unterschiede zu beachten. +
  +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis der Wert +0 zurückgegeben wird. +
  +
Verfügbar: Available as of AES version 3.40. +
  +
Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 13) +erfragt werden. +
  +
Gruppe: Objekte +
  +
Querverweise: Binding +
  + +
+ +

8.18.9.1 Bindings für objc_sysvar

+ + + + + + + + + +
C: int16_t objc_sysvar ( int16_t ob_smode, int16_t ob_swhich, +int16_t ob_sival1, int16_t ob_sival2, int16_t *ob_soval1, int16_t +*ob_soval2 ); +
  +
Umsetzung: +
  +
int16_t objc_sysvar (int16_t ob_smode, int16_t ob_swhich,
+                     int16_t ob_sival1, int16_t ob_sival2,
+                     int16_t *ob_soval1, int16_t *ob_soval2)
+{
+   int_in[0] = ob_smode;
+   int_in[1] = ob_swhich;
+   int_in[2] = ob_sival1;
+   int_in[3] = ob_sival2;
+
+   crys_if (48);
+
+   *ob_soval1 = int_out[1];
+   *ob_soval2 = int_out[2];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]48 # Opcode der Funktion
control+2control[1]4 # Einträge in int_in
control+4control[2]3 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]ob_smode
int_in+2int_in[1]ob_swhich
int_in+4int_in[2]ob_sival1
int_in+6int_in[3]ob_sival2
int_outint_out[0]Return-Wert
int_out+2int_out[1]ob_soval1
int_out+4int_out[2]ob_soval2
+
+ + +
+ +

8.18.10 objc_wchange

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Object window change« - verändert die Darstellung eines +Objekts innerhalb der angegebenen Grenzen. +
  +
AES-Nummer: 61 +
  +
Deklaration: void objc_wchange ( OBJECT *ob_ctree, int16_t ob_cobject, +int16_t ob_cnewstate, GRECT *clip, int16_t whandle ); +
  +
Beschreibung: Die Funktion ändert den Status eines Objektes und zeichnet es +ggfs. neu. Es gilt: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
ob_ctreeAdresse des Objektbaumes
ob_cobjectNummer des betreffenden Objektes
ob_cnewstateneuer Status des Objektes
clipbegrenzendes Clipping-Rechteck
whandleKennung des Fensters
+
+ +
Hinweis: Ein Aufruf dieser Funktion ist äquivalent zu +objc_change (ohne Neuzeichnen) mit einem anschließendem objc_wdraw. +
  +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Verfügbar: Die Funktion steht in MagiC ab Version 5.10 zur Verfügung. +
  +
Gruppe: Objekte +
  +
Querverweise: Binding   objc_change   OBJECT +
  + +
+ +

8.18.10.1 Bindings für objc_wchange

+ + + + + + + + + +
C: void objc_wchange ( OBJECT *ob_ctree, int16_t ob_cobject, +int16_t ob_cnewstate, GRECT *clip, int16_t whandle ); +
  +
Umsetzung: +
  +
void objc_wchange (OBJECT *ob_ctree, int16_t ob_cobject,
+                   int16_t ob_cnewstate, GRECT *clip,
+                   int16_t whandle)
+{
+   int_in[0]  = ob_cobject;
+   int_in[1]  = ob_cnewstate;
+   int_in[2]  = whandle;
+
+   addr_in[0] = ob_ctree;
+   addr_in[1] = clip;
+
+   crys_if(61);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]61 # Opcode der Funktion
control+2control[1]3 # Einträge in int_in
control+4control[2]0 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]ob_cobject
int_in+2int_in[1]ob_cnewstate
int_in+4int_in[2]whandle
addr_inaddr_in[0]ob_ctree
addr_in+4addr_in[1]clip
+
+ + +
+ +

8.18.11 objc_wdraw

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Object window draw« - zeichnet ein Objekt im Fenster. +
  +
AES-Nummer: 60 +
  +
Deklaration: void objc_wdraw ( OBJECT *ob_drtree, int16_t ob_drstart, +int16_t ob_drdepth, GRECT *clip, int16_t whandle ); +
  +
Beschreibung: Die Funktion stellt Objekte (oder Teile von Objekten) auf dem +Bildschirm dar. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
ob_drtree Adresse des Objektbaumes +
ob_drstart Nummer des ersten zu zeichnenden Objektes +
ob_drdepth Anzahl der zu zeichnenden Ebenen (0 = nur das erste Objekt) +
clip begrenzendes Clipping-Rechteck +
whandle Kennung des Fensters + +
+ +
Hinweis: Über die Parameter kann ein Rechteck angegeben +werden, auf das sich die Darstellung beschränken soll (Clipping). +Besitzt clip den Wert NULL, so beschränkt sich der +Zeichenbereich auf den Arbeitsbereich des Fensters. +
  +
Die Funktion entspricht im wesentlichen objc_draw mit dem +Unterschied, dass hier die Rechteckliste eines Fensters beachtet wird. +
  +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Verfügbar: Die Funktion steht in MagiC ab Version 5.10 zur Verfügung. +
  +
Gruppe: Objekte +
  +
Querverweise: Binding   objc_draw   OBJECT +
  + +
+ +

8.18.11.1 Bindings für objc_wdraw

+ + + + + + + + + +
C: void objc_wdraw ( OBJECT *ob_drtree, int16_t ob_drstart, +int16_t ob_drdepth, GRECT *clip, int16_t whandle ); +
  +
Umsetzung: +
  +
void objc_wdraw (OBJECT *ob_drtree, int16_t ob_drstart,
+                 int16_t ob_drdepth, GRECT *clip,
+                 int16_t whandle)
+{
+   int_in[0]  = ob_drstart;
+   int_in[1]  = ob_drdepth;
+   int_in[2]  = whandle;
+
+   addr_in[0] = ob_drtree;
+   addr_in[1] = clip;
+
+   crys_if(60);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]60 # Opcode der Funktion
control+2control[1]3 # Einträge in int_in
control+4control[2]0 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]ob_drstart
int_in+2int_in[1]ob_drdepth
int_in+4int_in[2]whandle
addr_inaddr_in[0]ob_drtree
addr_in+4addr_in[1]clip
+
+ + +
+ +

8.18.12 objc_wedit

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Object window edit« - editiert einen Text in einem Objekt. +
  +
AES-Nummer: 65 +
  +
Deklaration: int16_t objc_wedit ( OBJECT *ob_edtree, int16_t ob_edobject, +int16_t ob_edchar, int16_t *ob_edidx, int16_t ob_edkind, int16_t +whandle ); +
  +
Beschreibung: Die Funktion ermöglicht Texteingaben in Objekte des Typs +G_FTEXT oder G_FBOXTEXT. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
ob_edtree Adresse des Objektbaumes +
ob_edobject Nummer des zu editierenden Objektes +
ob_edchar eingegebenes Zeichen +
ob_edidx Position des Zeichens im String +
ob_edkind Funktionsauswahl, wie folgt: + + + + + + + + + + + + + + + +
0 = reserviert +
1 = formatierten String berechnen, und Cursor einschalten +
2 = Zeichen verarbeiten und String anschließend neu anzeigen +
3 = Cursor ausschalten +
103 = Analog Modus-3, jedoch wird der Cursor im XOR-Modus +gezeichnet. + +
+ +
whandle Kennung des Fensters + +
+ +
Hinweis: Die Funktion entspricht im Prinzip objc_edit +mit dem Unterschied, dass hier die Rechteckliste eines Fensters +beachtet wird. +
  +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Verfügbar: Die Funktion steht in MagiC ab Version 5.10 zur Verfügung. +
  +
Gruppe: Objekte +
  +
Querverweise: Binding   objc_edit   OBJECT   TEDINFO +
  + +
+ +

8.18.12.1 Bindings für objc_wedit

+ + + + + + + + + +
C: int16_t objc_wedit ( OBJECT *ob_edtree, int16_t ob_edobject, +int16_t ob_edchar, int16_t *ob_edidx, int16_t ob_edkind, int16_t +whandle ); +
  +
Umsetzung: +
  +
int16_t objc_wedit (OBJECT *ob_edtree, int16_t ob_edobject,
+                    int16_t ob_edchar, int16_t *ob_edidx,
+                    int16_t ob_edkind, int16_t whandle)
+{
+   int_in[0] = ob_edobject;
+   int_in[1] = ob_edchar;
+   int_in[2] = *ob_edidx;
+   int_in[3] = ob_edkind;
+   int_in[4] = whandle;
+
+   addr_in[0] = ob_edtree;
+
+   crys_if (65);
+
+   *ob_edidx = int_out[1];
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]65 # Opcode der Funktion
control+2control[1]5 # Einträge in int_in
control+4control[2]2 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]ob_edobject
int_in+2int_in[1]ob_edchar
int_in+4int_in[2]ob_edidx
int_in+6int_in[3]ob_edkind
int_in+8int_in[4]whandle
addr_inaddr_in[0]ob_edtree
int_outint_out[0]Return-Wert
int_out+2int_out[1]ob_edidx
+
+ + +
+ +

8.18.13 objc_xedit

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Object edit« - editiert einen Text in einem Objekt. +
  +
AES-Nummer: 46 +
  +
Deklaration: int16_t objc_xedit ( OBJECT *ob_edtree, int16_t ob_edobject, +int16_t ob_edchar, int16_t *ob_edidx, int16_t ob_edkind, GRECT *r ); +
  +
Beschreibung: Die Funktion ermöglicht Texteingaben in Objekte des Typs +G_FTEXT oder G_FBOXTEXT. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
ob_edtree Adresse des Objektbaumes +
ob_edobject Nummer des zu editierenden Objektes +
ob_edchar eingegebenes Zeichen +
ob_edidx Position des Zeichens im String +
ob_edkind Funktionsauswahl, wie folgt: + + + + + + + + + + + + + + + +
  0 reserviert +
  1 formatierten String berechnen, und Cursor einschalten +
  2 Zeichen verarbeiten und String anschließend neu anzeigen +
  3 Cursor ausschalten +
103 Analog Modus-3, jedoch wird der Cursor im XOR-Modus gezeichnet. +Zusätzlich muß jedoch Zeiger auf ein GRECT übergeben werden, auf +das die Ausgabe beschränkt wird; wichtig für den Redraw im Fenster. + +
+ +
r siehe ob_edkind + +
+ +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Verfügbar: ab MagiC Version 2.0 +
  +
Gruppe: Objekte +
  +
Querverweise: Binding   objc_wedit   OBJECT   TEDINFO   objc_edit +
  + +
+ +

8.18.13.1 Bindings für objc_xedit

+ + + + + + + + + +
C: int16_t objc_xedit ( OBJECT *ob_edtree, int16_t ob_edobject, +int16_t ob_edchar, int16_t *ob_edidx, int16_t ob_edkind, GRECT *r ); +
  +
Umsetzung: +
  +
int16_t objc_xedit (OBJECT *ob_edtree, int16_t ob_edobject,
+                    int16_t ob_edchar, int16_t *ob_edidx,
+                    int16_t ob_edkind, GRECT *r)
+{
+   int_in[0]  = ob_edobject;
+   int_in[1]  = ob_edchar;
+   int_in[2]  = *ob_edidx;
+   int_in[3]  = ob_edkind;
+   addr_in[0] = ob_edtree;
+   addr_in[1] = r;
+
+   crys_if (46);
+
+   *ob_edidx = int_out[1];
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]46 # Opcode der Funktion
control+2control[1]4 # Einträge in int_in
control+4control[2]2 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]ob_edobject
int_in+2int_in[1]ob_edchar
int_in+4int_in[2]ob_edidx
int_in+6int_in[3]ob_edkind
addr_inaddr_in[0]ob_edtree
addr_in+4addr_in[1]r
int_outint_out[0]Return-Wert
int_out+2int_out[1]ob_edidx
+
+ + +
+ +

8.18.14 objc_xfind

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Object xfind« - ermittelt, welches Objekt sich an der +angegebenen Bildschirmposition befindet. +
  +
AES-Nummer: 49 +
  +
Deklaration: int16_t objc_xfind ( OBJECT *ob_ftree, int16_t ob_fstartob, +int16_t ob_fdepth, int16_t ob_fmx, int16_t ob_fmy ); +
  +
Beschreibung: Die Funktion bestimmt das Objekt, welches sich unter dem +Mauszeiger befindet. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
ob_ftree Adresse des Objektbaumes +
ob_fstartob Nummer des Objektes, bei dem die Suche beginnen soll +
ob_fdepth Anzahl der Ebenen, die durchsucht werden sollen (0 = nur +Mutterobjekt) +
ob_fmx x-Koordinate +
ob_fmy y-Koordinate der Bildschirmposition + +
+ +
Hinweis: Der Unterschied zu objc_find besteht darin, daß +statt dem normalen Objektrechteck das umfassende Objektrechteck +benutzt wird. Bei dieser Funktion wird also auch der Rahmen des +Objektes beachtet. +
  +
Ergebnis: Als Ergebnis wird die Nummer des entsprechenden Objektes (oder +-1 für 'nicht gefunden') zurückgegeben. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 5) +erfragt werden. +
  +
Gruppe: Objekte +
  +
Querverweise: Binding   OBJECT   objc_find +
  + +
+ +

8.18.14.1 Bindings für objc_xfind

+ + + + + + + + + +
C: int16_t objc_xfind ( OBJECT *ob_ftree, int16_t ob_fstartob, +int16_t ob_fdepth, int16_t ob_fmx, int16_t ob_fmy ); +
  +
Umsetzung: +
  +
int16_t objc_xfind (OBJECT *ob_ftree, int16_t ob_fstartob,
+                    int16_t ob_fdepth, int16_t ob_fmx,
+                    int16_t ob_fmy)
+{
+   int_in[0]  = ob_fstartob;
+   int_in[1]  = ob_fdepth;
+   int_in[2]  = ob_fmx;
+   int_in[3]  = ob_fmy;
+   addr_in[0] = ob_ftree;
+
+   return ( crys_if(49) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]49 # Opcode der Funktion
control+2control[1]4 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]ob_fstartob
int_in+2int_in[1]ob_fdepth
int_in+4int_in[2]ob_fmx
int_in+6int_in[3]ob_fmy
addr_inaddr_in[0]ob_ftree
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.18.15 x_objc_edit

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Object edit« - editiert einen Text in einem Objekt. +
  +
AES-Nummer: 28992 +
  +
Deklaration: int16_t x_objc_edit( OBJECT *tree, int16_t edit_obj, int16_t +key_press, int16_t shift_state, int16_t *edit_idx, int16_t mode ); +
  +
Beschreibung: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
tree Adresse des Objektbaumes +
edit_obj Nummer des zu editierenden Objektes +
key_press eingegebenes Zeichen +
shift_state +
+
+ + + + + + + + + + + + + + + +
Bit 0=Rechte Shift-Taste
Bit 1=Linke Shift-Taste
Bit 2=Control
+
+ +
edit_idx Current cursor position within field +
mode + + + + + + + + + +
1 formatierten String berechnen, und Cursor einschalten +
2 Zeichen verarbeiten und String anschließend neu anzeigen +
3 Cursor ausschalten + +
+ + +
+ +
This function is nearly identical to the objc_edit function +normaly found in GEM. By adding the shift_state, however, it is able +to correctly process extended keystrokes involving the [Control] and +[Shift] keys. +
  +
Ergebnis: 0 = edit_obj ist kein editierbares Feld +
1 = Kein Fehler +
  +
In edit_idx wird die neue Cursorposition +zurückgeliefert. +
  +
Verfügbar: Die Funktion steht nur unter Geneva zur Verfügung. +
  +
Gruppe: Objekte +
  +
Querverweis: Binding   objc_edit +
  + +
+ +

8.18.15.1 Bindings für x_objc_edit

+ + + + + + + + + +
C: int16_t x_objc_edit( OBJECT *tree, int16_t edit_obj, int16_t +key_press, int16_t shift_state, int16_t *edit_idx, int16_t mode ); +
  +
Umsetzung: +
  +
int16_t x_objc_edit( OBJECT *tree, int16_t edit_obj, int16_t key_press,
+int16_t shift_state, int16_t *edit_idx, int16_t mode )
+{
+   int_in[0] = edit_obj;
+   int_in[1] = key_press;
+   int_in[2] = *edit_idx;
+   int_in[3] = shift_state;
+   int_in[4] = mode;
+   addr_in[0] = tree;
+
+   crys_if(28992);
+
+   *edit_idx = int_out[1];
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]28992 # Opcode der Funktion
control+2control[1]6 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]edit_obj
int_in+2int_in[1]key_press
int_in+4int_in[2]edit_idx
int_in+6int_in[3]shift_state
int_in+8int_in[4]mode
addr_inaddr_in[0]tree
int_outint_out[0]Return-Wert
int_out+2int_out[1]edit_idx
+
+ + +
+ +
+ +Home +AESAES +MenüfunktionenMenüfunktionen +ProzessverwaltungProzessverwaltung + + diff --git a/de/old_preface.html b/de/old_preface.html new file mode 100644 index 000000000..8e8fac79f --- /dev/null +++ b/de/old_preface.html @@ -0,0 +1,195 @@ + + + + + +Die Anleitung zum TOS: Altes Vorwort von Rolf Kotzian + + + + + + + + + +Home +EinleitungEinleitung +KontaktKontakt +Neu in dieser VersionNeu in dieser Version + +
+ +

1.2 Altes Vorwort von Rolf Kotzian

+

Dieser Hypertext dient als Nachschlagewerk für die Systemfunktionen der +Betriebssysteme TOS, MultiTOS, MagiC und MagiC Mac. Da eine neue +Auflage des Atari-Profibuches nicht mehr zu erwarten ist, wird es +immer schwieriger gebündelte Informationen über die vorhandenen +Systemfunktionen zu bekommen. Ein gut strukturierter Hypertext für den ST-Guide +kann da Abhilfe schaffen, und ich glaube, daß diese Version des +Hypertextes mittlerweile vielen Ansprüchen gerecht wird. +

+

Da der ursprüngliche Autor aus verschiedenen Gründen kein +Interesse mehr an einer Pflege dieses Hypertextes hatte, habe ich ab +der Version 3.10 die Weiterentwicklung übernommen. Leider hat +sich das von mir gewählte Fairware-Konzept für diesen Hypertext als +glatter Reinfall erwiesen. Da die Entwicklung des Hypertextes +nicht nur mit sehr hohem zeitlichem, sondern auch mit finanziellem +Aufwand verbunden ist, und ich es mir auf Dauer nicht leisten kann +mehrere MByte Daten kostenlos in der Mailbox abzulegen, werden +zukünftige Versionen nur noch für Zahler (und nur noch direkt bei +mir) erhältlich sein. +

+

Natürlich ist klar, daß ich nur die Informationen in den +Hypertext einbauen kann, die mir selbst bekannt sind. Wer bestimmte +Informationen vermißt kann daher zunächst davon ausgehen, daß mir +diese z.Zt. fehlen, oder ich aufgrund bestimmter Umstände noch nicht +dazu gekommen bin, diese in den Hypertext einfließen zu lassen. Ich +bin grundsätzlich jedem dankbar der mir mit Informationen aushilft, +und auf diese Weise dazu beiträgt, daß dieser Hypertext ein +möglichst vollständiges und aktuelles Nachschlagewerk für die +TOS/MagiC-Programmierung wird. Es sollte klar sein, daß die +Möglichkeiten eines Betriebssystems nur dann in Programme Einzug +halten, wenn dieses ausreichend dokumentiert ist, - und genau das soll +mit diesem Projekt verwirklicht werden. In diesem Zusammenhang wäre +auch eine vollständige und ausführliche Dokumentation der +MiNT-Library wünschenswert. +

+

Ich weise an dieser Stelle ausdrücklich darauf hin, daß die in +diesem Hypertext vorhandenen Informationen nicht alle aus meiner Feder +stammen, sondern aus nahezu unzähligen Quellen-Angabe zusammengetragen, +sortiert, überarbeitet und in die Hypertextform transformiert wurden. +Mein Dank gilt in diesem Zusammenhang Volker Ritzhaupt und +Oliver Buchmann (Application Systems Heidelberg), die mir +wichtige Informationsquellen (MagiC, MagiC Mac und NVDI) zur Verfügung +gestellt haben, sowie Thomas Tempelmann} für tatkräftige +Unterstützung bei MagiC Mac-Spezifikas. +

+

Bei der Zusammenstellung der Informationen habe ich versucht, +die notwendige Sorgfalt walten zu lassen; trotzdem kann für die +Richtigkeit der in diesem Hypertext vorhandenen Information +keine Gewähr übernommen werden. Der Autor übernimmt für +jede Art von Schäden, die aus der Benutzung dieses Werkes entstehen +keine Haftung. Die Wiedergabe von Gebrauchsnamen, +Handelsnamen, Warenbezeichnungen usw. in diesem Werk berechtigt auch +ohne besondere Kennzeichnung nicht zu der Annahme, daß solche +Namen im Sinne der Warenzeichen- und Markenschutz-Gesetzgebung als +frei zu betrachten wären, und daher von jedermann benutzt werden +dürften. +

+

Wie bereits oben erwähnt hat sich das Fairware-Konzept für +diesen Hypertext leider als völliger Fehlschlag erwiesen. Aus +diesem Grund sind neue Versionen nur noch für Zahler, und nur noch +direkt über mich erhältlich. Wer sich bislang nicht zu einer Spende +durchgerungen hatte, jetzt aber doch an einer aktuellen Version des +Hypertextes interessiert ist, kann gegen eine einmalige +Zahlung von 35,-DM die aktuelle Version erwerben. Bei Erscheinen von +Updates braucht nicht mehr gezahlt zu werden (Update-Spenden +in beliebiger Höhe lehne ich aber natürlich nicht ab ;-). Das Geld +kann auf das folgende Konto überwiesen werden: +

+

Daten gelöscht! (Gerhard Stoll) +

+

Bei Zahlung bitte ich um einen Vermerk über den +Verwendungszweck (z.B. 'TOS-Hypertext'), sowie um Angabe einer +vollständigen und lesbaren Adresse. Wer eine E-Mail Adresse besitzt, +sollte mich am besten auch auf diesem Weg nocheinmal auf die Zahlung +hinweisen. Durch Zahlung der o.g. 35,-DM wird man bei mir registriert, +und erhält umgehend die aktuelle Version auf einer HD-Diskette +(nur HD-Disketten werden verschickt). Zukünftige Versionen +können dann durch Überweisung von 5,-DM (für Diskette, Porto und +Briefumschlag) auf mein Konto geordert werden, und sind für +registrierte User auch über das Internet downloadbar. +

+

Jeder Interessent sollte angeben, ob er die monochrome Version +oder die Farbversion des Hypertextes beziehen möchte. Fehlt diese +Angabe, so verschicke ich die monochrome Version. Bei der +Farbversion gibt es folgendes zu beachten: Diese enthält Grafiken mit +bis zu 16 Farben, die aber erst ab der ST-Guide Version vom 10.12.96 +korrekt angezeigt werden. Bis auf die Unterscheidung von monochromen +und farbigen Bildern, sind die monochrome und farbige Version des +Hypertextes natürlich völlig identisch, d.h. sie enthalten die +gleichen Informationen. +

+

Normalerweise sollte man davon ausgehen, daß die Bundespost +Briefsendungen zustellen kann. Abgesehen von zeitlichen Verzögerungen +soll es aber schon vorgekommen sein, daß Briefe oder sogar Pakete +plötzlich verschwinden. Für denjenigen, der Porto etc. bezahlt hat, +ist dies natürlich sehr ärgerlich. Ich bitte aber um Verständnis, +daß ich in diesem Fall nichts machen kann, und den Hypertext erst +nach neuer Überweisung von 5,-DM auf mein Konto abschicken werde. +

+

Lob, Kritik, Vorschläge und Bug-Reports können mich per Mail +an die folgende Adresse erreichen: +

+

Daten gelöscht! (Gerhard Stoll) +

+

Informationen zur aktuellen Version des Hypertextes können +auch über meine Homepage im Internet erfragt werden. Die URL +lautet: +

+

Daten gelöscht! (Gerhard Stoll) +

+

Wichtig: Aufgrund mangelnder Unterstützung durch die +Anwender, wurde der Status des Hypertextes nochmals geändert. Der +TOS-Hypertext ist weder Public-Domain noch Freeware, und ab der +Version 3.70 auch keine Fairware mehr. Eine Verbreitung auf +PD-Sammeldisketten, CD-ROMs, über Mailboxen und ähnliche Medien +ist nicht gestattet. +

+

Ich möchte hier keinesfalls den Eindruch erwecken, mit +diesem Projekt nur Kasse machen zu wollen. Reich werden kann ich +durch diesen Hypertext mit Sicherheit nicht (und das trifft wohl auf +nahezu alle Produkte im Atari- Markt zu). Aber ich bin der Meinung +daß diejenigen, die diesen Hypertext seit der Version 3.10 benutzen +(und von Updates Gebrauch gemacht haben), mal eine Minute über das +Wort Fairware, und den (auch finanziellen) Aufwand dieses +Projektes nachdenken sollten. +

+

Paderborn, August 1998 +

+

Rolf Kotzian +

+

Änderungen im Vertrieb (Stand: November 1998) +
+——————————————— +

+

Aufgrund des hohen Zeitaufwandes bei der Entwicklung des +Hypertextes habe ich mich bisher außer Stande gesehen, diesen +kostenlos abzugeben. In der letzten Zeit ist die Entwicklung aber +leider etwas ins Stocken geraten. Gründe: +

+

• beruflicher Streß +
• Veränderungen im Privatleben +
• zunehmende Fokussierung auf den Macintosh +

+

Da in der nächsten Zeit diesbezüglich leider keine Besserung +zu erwarten ist, und ich den verbliebenen Atari-Programmierern das +Leben etwas erleichtern möchte, ist der Hypertext ab sofort +kostenlos über meine Homepage downloadbar. Achtung: +Ich behalte mir das Recht vor, dies jederzeit wieder zu ändern. +Möglicherweise werden spätere Versionen des Hypertextes also wieder +nur gegen Bezahlung erhältlich sein. Apropos Bezahlung: wer den +Hypertext benutzt und diesen als nützlich ansieht, darf mir gerne +eine Spende in beliebiger Höhe zukommen lassen. Hierzu kann das +folgende Konto benutzt werden: +

+

Daten gelöscht! (Gerhard Stoll) +

+

Bei einer Spende wäre ich um einen Vermerk über den +Verwendungszweck (z.B. 'TOS-Hypertext'), sowie um Angabe einer +vollständigen und lesbaren Adresse dankbar. +

+

Paderborn, November 1998 +

+

Rolf Kotzian +

+
+ +Home +EinleitungEinleitung +KontaktKontakt +Neu in dieser VersionNeu in dieser Version + + diff --git a/de/pdlg.html b/de/pdlg.html new file mode 100644 index 000000000..60227e8aa --- /dev/null +++ b/de/pdlg.html @@ -0,0 +1,3014 @@ + + + + + +Die Anleitung zum TOS: Druckdialoge + + + + + + + + + +Home +AESAES +DateiauswahlDateiauswahl +Editobjekt-FunktionenEditobjekt-Funktionen + +
+ +

8.5 Druckdialoge

+

Die folgenden Routinen wurden mit MagiC eingeführt, und +erlauben die Erstellung und Handhabung von Druckdialogen: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
pdlg_add_printers Druckerbeschreibungen hinzufügen. +
pdlg_add_sub_dialogs Erstellt Unterdialoge zum Druckdialog. +
pdlg_close Schließt das Fenster des Druckdialogs. +
pdlg_create Initialisiert den Druckdialog. +
pdlg_delete Gibt den Speicher des Dialogs frei. +
pdlg_dflt_settings Übernimmt die Default-Initialisierung. +
pdlg_do Öffnet einen modalen Druckdialog. +
pdlg_evnt Übernimmt die Event-Verwaltung. +
pdlg_free_settings Speicher für Druckeinstellung freigeben. +
pdlg_get_setsize Ermittelt die Länge der PRN_SETTINGS Struktur. +
pdlg_new_settings Fordert Speicher für Druckeinstellungen. +
pdlg_open Öffnet ein Fenster mit dem Dialog. +
pdlg_remove_printers Druckerbeschreibungen entfernen. +
pdlg_remove_sub_dialogs Entfernt Unterdialoge des Druckdialogs. +
pdlg_save_default_settings   +
pdlg_update Setzt einen neuen Fensternamen. +
pdlg_use_settings Anwendung der Druckereinstellungen. +
pdlg_validate_settings Überprüft die Druckereinstellungen. + +
+ +

Hinweis: Die Existenz dieser Funktionen kann per appl_getinfo +(Opcode 7) festgestellt werden. +

+

Querverweis: +
Darstellung im Fenster   Darstellung als mod. Dialog   AES   GEM   WDIALOG   Style-Guidelines +

+

8.5.1 pdlg_add_printers

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Print Dialog - Add Private Printers« - eigene +Druckerbeschreibungen hinzufügen. +
  +
AES-Nummer: 205 (Unterfunktion 0) +
  +
Deklaration: int16_t pdlg_add_printers ( PRN_DIALOG *prn_dialog, DRV_INFO +*drv_info ); +
  +
Beschreibung: Die Funktion erlaubt es, eigene Druckerbeschreibungen zum +Druckdialog hinzuzufügen. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
prn_dialog Zeiger auf Verwaltungsstruktur +
drv_info Zeiger auf die Liste der verfügbaren Drucker und +Rasterverfahren + +
+ +
Hinweis: Die Treibernummer sollte auf 0x7fff gesetzt +werden, um den eigenen Treiber von denjenigen des Betriebssystems zu +unterscheiden. +
  +
Ergebnis: Die Funktion liefert bei korrekter Ausführung den Wert 1 und +im Fehlerfall den Wert 0 zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Druckdialoge +
  +
Querverweis: Binding   WDIALOG +
  + +
+ +

8.5.1.1 Bindings für pdlg_add_printers

+ + + + + + + + + +
C: int16_t pdlg_add_printers ( PRN_DIALOG *prn_dialog, DRV_INFO +*drv_info ); +
  +
Umsetzung: +
  +
int16_t pdlg_add_printers ( PRN_DIALOG *prn_dialog,
+                            DRV_INFO *drv_info )
+{
+   addr_in[0] = prn_dialog;
+   addr_in[1] = drv_info;
+   int_in[0] = 0;
+
+   crys_if (205);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]205 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]prn_dialog
addr_in+4addr_in[1]drv_info
int_inint_in[0]0 # Sub-Opcode
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.5.2 pdlg_add_sub_dialogs

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Print Dialog - Add Private Dialogs« - Unterdialoge zum +Druckdialog hinzufügen. +
  +
AES-Nummer: 205 (Unterfunktion 3) +
  +
Deklaration: int16_t pdlg_add_sub_dialogs ( PRN_DIALOG *prn_dialog, PDLG_SUB +*sub_dialog ); +
  +
Beschreibung: Die Funktion erlaubt das Hinzufügen eigener Unterdialoge zum +Druckdialog. +
  +

+
+ + + + + + + + + + + + +
ParameterBedeutung
prn_dialogZeiger auf Verwaltungsstruktur
sub_dialogListe von Unterdialogen
+
+ +
Nützlich ist diese Funktion etwa, um eigene Druckoptionen wie +Marken oder Hintergrundbilder anzubieten. +
  +
Ergebnis: Die Funktion liefert bei korrekter Ausführung den Wert 1 und +im Fehlerfall den Wert 0 zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Druckdialoge +
  +
Querverweis: Binding   WDIALOG +
  + +
+ +

8.5.2.1 Bindings für pdlg_add_sub_dialogs

+ + + + + + + + + +
C: int16_t pdlg_add_sub_dialogs ( PRN_DIALOG *prn_dialog, PDLG_SUB +*sub_dialog ); +
  +
Umsetzung: +
  +
int16_t pdlg_add_sub_dialogs ( PRN_DIALOG *prn_dialog,
+                               PDLG_SUB *sub_dialog )
+{
+   addr_in[0] = prn_dialog;
+   addr_in[1] = sub_dialog;
+   int_in[0] = 3;
+
+   crys_if (205);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]205 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]prn_dialog
addr_in+4addr_in[1]sub_dialog
int_inint_in[0]3 # Sub-Opcode
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.5.3 pdlg_close

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Print Dialog - Close Window« - Druckdialog schließen. +
  +
AES-Nummer: 203 +
  +
Deklaration: int16_t pdlg_close ( PRN_DIALOG *prn_dialog, int16_t *x, +int16_t *y ); +
  +
Beschreibung: Die Funktion schließt das Fenster des Druckdialogs. Es gilt: +
  +

+
+ + + + + + + + + + + + + + + + +
ParameterBedeutung
prn_dialogZeiger auf Verwaltungsstruktur
xx-Koordinate des Fensters
yy-Koordinate des Fensters
+
+ +
Hinweis: Bei den Parametern x und y handelt es sich um +die letzte Position des Druckdialogs. +
  +
Ergebnis: Die Funktion liefert stets den Wert 1 zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Druckdialoge +
  +
Querverweis: Binding   WDIALOG +
  + +
+ +

8.5.3.1 Bindings für pdlg_close

+ + + + + + + + + +
C: int16_t pdlg_close ( PRN_DIALOG *prn_dialog, int16_t *x, +int16_t *y ); +
  +
Umsetzung: +
  +
int16_t pdlg_close ( PRN_DIALOG *prn_dialog, int16_t *x,
+                     int16_t *y )
+{
+   int_out[1] = -1;
+   int_out[2] = -1;
+
+   addr_in[0] = prn_dialog;
+   crys_if (203);
+
+   *x = int_out[1];
+   *y = int_out[2];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]203 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]3 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]prn_dialog
int_outint_out[0]Return-Wert
int_out+2int_out[1]x
int_out+4int_out[2]y
+
+ + +
+ +

8.5.4 pdlg_create

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Print Dialog - Create« - Initialisiert den Druckdialog. +
  +
AES-Nummer: 200 +
  +
Deklaration: PRN_DIALOG *pdlg_create ( int16_t dialog_flags ); +
  +
Beschreibung: Die Funktion initialisiert den Druckdialog. Es gilt: +
  + + + + + + + + + +
Parameter Bedeutung +
    + +
dialog_flags Diverse Flags: + + + +
PDLG_3D (1) = Auswahl im 3D-Look anzeigen + +
+ + +
+ +
Hinweis: Beim Aufruf der Funktion werden die vorhandenen +Druckertreiber gescannt und Speicher für die Resource angefordert. +
  +
Ergebnis: Die Funktion liefert einen Zeiger auf eine PRN_DIALOG Struktur +zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Druckdialoge +
  +
Querverweis: Binding   WDIALOG +
  + +
+ +

8.5.4.1 Bindings für pdlg_create

+ + + + + + + + + +
C: PRN_DIALOG *pdlg_create ( int16_t dialog_flags ); +
  +
Umsetzung: +
  +
PRN_DIALOG *pdlg_create ( int16_t dialog_flags )
+{
+   int_in[0] = dialog_flags;
+   crys_if (200);
+
+   return ( addr_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]200 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]0 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]1 # Einträge in addr_out
int_inint_in[0]dialog_flags
addr_outaddr_out[0]Return-Wert
+
+ + +
+ +

8.5.5 pdlg_delete

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Print Dialog - Delete« - Speicher des Dialogs freigeben. +
  +
AES-Nummer: 201 +
  +
Deklaration: int16_t pdlg_delete ( PRN_DIALOG *prn_dialog ); +
  +
Beschreibung: Die Funktion gibt den Speicher für einen Druckdialog an das +Betriebssystem zurück. Es gilt: +
  +

+
+ + + + + + + + +
ParameterBedeutung
prn_dialogZeiger auf die PRN_DIALOG-Struktur
+
+ +
Ergebnis: Die Funktion liefert stets den Wert 1 zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Druckdialoge +
  +
Querverweis: Binding   WDIALOG +
  + +
+ +

8.5.5.1 Bindings für pdlg_delete

+ + + + + + + + + +
C: int16_t pdlg_delete ( PRN_DIALOG *prn_dialog ); +
  +
Umsetzung: +
  +
int16_t pdlg_delete ( PRN_DIALOG *prn_dialog )
+{
+   addr_in[0] = prn_dialog;
+   crys_if (201);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]201 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]prn_dialog
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.5.6 pdlg_dflt_settings

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Print Dialog - Default Settings« - Defaultinitialisierung. +
  +
AES-Nummer: 205 (Unterfunktion 7) +
  +
Deklaration: int16_t pdlg_dflt_settings ( PRN_DIALOG *prn_dialog, +PRN_SETTINGS *settings ); +
  +
Beschreibung: Die Funktion übernimmt die Initialisierung der +Default-Druckereinstellungen. +
  +

+
+ + + + + + + + + + + + +
ParameterBedeutung
prn_dialogZeiger auf Verwaltungsstruktur
settingsZeiger auf die Druckereinstellungen
+
+ +
Die Länge der PRN_SETTINGS-Struktur kann durch einen Aufruf von +pdlg_get_setsize ermittelt werden. +
  +
Ergebnis: Die Funktion liefert stets den Wert 1 zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Druckdialoge +
  +
Querverweis: Binding   WDIALOG +
  + +
+ +

8.5.6.1 Bindings für pdlg_dflt_settings

+ + + + + + + + + +
C: int16_t pdlg_dflt_settings ( PRN_DIALOG *prn_dialog, +PRN_SETTINGS *settings ); +
  +
Umsetzung: +
  +
int16_t pdlg_dflt_settings ( PRN_DIALOG *prn_dialog,
+                             PRN_SETTINGS *settings )
+{
+   addr_in[0] = prn_dialog;
+   addr_in[1] = settings;
+
+   int_in[0] = 7;
+   crys_if (205);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]205 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]prn_dialog
addr_in+4addr_in[1]settings
int_inint_in[0]7 # Sub-Opcode
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.5.7 pdlg_do

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Print Dialog - Do« - Öffnen einen Druckdialog. +
  +
AES-Nummer: 207 +
  +
Deklaration: int16_t pdlg_do ( PRN_DIALOG *prn_dialog, PRN_SETTINGS +*settings, int8_t *document_name, int16_t option_flags ); +
  +
Beschreibung: Die Funktion öffnet einen modalen Druckdialog. +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
prn_dialog Zeiger auf Verwaltungsstruktur +
settings Zeiger auf Druckereinstellungen +
document_name Name des Dokumentes +
option_flags Diverse Flags + + + + + + + + + + + + + + + + + + +
0x0000 = Einstelldialog zeigen +
0x0001 = Druckdialog zeigen +
0x0010 = Kopien anbieten +
0x0020 = Querformat anbieten +
0x0040 = Skalierung anbieten +
0x0100 = Option für gerade und ungerade Seiten anbieten + +
+ + +
+ +
Die Funktion kehrt erst dann zum Aufrufer zurück, wenn einer +der Exit-Buttons betätigt wurde. +
  +
Ergebnis: Die Funktion liefert den ausgewählten Button (1 = Abbruch, 2 = +OK) oder im Fehlerfall den Wert 0 zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Druckdialoge +
  +
Querverweis: Binding   WDIALOG +
  + +
+ +

8.5.7.1 Bindings für pdlg_do

+ + + + + + + + + +
C: int16_t pdlg_do ( PRN_DIALOG *prn_dialog, PRN_SETTINGS +*settings, int8_t *document_name, int16_t option_flags ); +
  +
Umsetzung: +
  +
int16_t pdlg_do ( PRN_DIALOG *prn_dialog,
+                  PRN_SETTINGS *settings,
+                  int8_t *document_name,
+                  int16_t option_flags )
+{
+   addr_in[0] = prn_dialog;
+   addr_in[1] = settings;
+   addr_in[2] = document_name;
+
+   int_in[0] = option_flags;
+   crys_if (207);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]207 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]3 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]prn_dialog
addr_in+4addr_in[1]settings
addr_in+8addr_in[2]document_name
int_inint_in[0]option_flags
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.5.8 pdlg_evnt

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Print Dialog - Handle Event« - Ereignisverwaltung des Druckdialoges. +
  +
AES-Nummer: 206 +
  +
Deklaration: int16_t pdlg_evnt ( PRN_DIALOG *prn_dialog, PRN_SETTINGS +*settings, EVNT *events, int16_t *button ); +
  +
Beschreibung: Die Funktion übernimmt die Ereignisverwaltung für einen Druckdialog. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
prn_dialogZeiger auf Verwaltungsstruktur
settingsZeiger auf Druckereinstellungen
eventsZeiger auf EVNT-Struktur
buttonausgewählter Button (oder 0)
 PDLG_CANCEL (1) = Abbruch
 PDLG_OK (2)     = OK
+
+ +
Die Funktion wertet die übergebene EVNT-Struktur aus und ruft +intern wdlg_evnt auf. Falls der Dialog bestätigt wurde, wird im +Parameter settings die neue Druckeinstellung zurückgeliefert. +
  +
Ergebnis: Die Funktion liefert den Wert 0 zurück, falls einer der +EXIT-Buttons angeklickt wurde, und anderenfalls den Wert 1. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Druckdialoge +
  +
Querverweis: Binding   WDIALOG +
  + +
+ +

8.5.8.1 Bindings für pdlg_evnt

+ + + + + + + + + +
C: int16_t pdlg_evnt ( PRN_DIALOG *prn_dialog, PRN_SETTINGS +*settings, EVNT *events, int16_t *button ); +
  +
Umsetzung: +
  +
int16_t pdlg_evnt ( PRN_DIALOG *prn_dialog,
+                    PRN_SETTINGS *settings,
+                    EVNT *events, int16_t *button )
+{
+   addr_in[0] = prn_dialog;
+   addr_in[1] = settings;
+   addr_in[2] = events;
+
+   crys_if (206);
+
+   *button = int_out[1];
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]206 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]2 # Einträge in int_out
control+6control[3]3 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]prn_dialog
addr_in+4addr_in[1]settings
addr_in+8addr_in[2]events
int_outint_out[0]Return-Wert
int_out+2int_out[1]button
+
+ + +
+ +

8.5.9 pdlg_free_settings

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Print Dialog - Free Settings« - Speicher zurückgeben. +
  +
AES-Nummer: 205 (Unterfunktion 6) +
  +
Deklaration: int16_t pdlg_free_settings ( PRN_SETTINGS *settings ); +
  +
Beschreibung: Die Funktion gibt den Speicherplatz frei, der durch einen +Aufruf von pdlg_new_settings angefordert wurde. Es gilt: +
  +

+
+ + + + + + + + +
ParameterBedeutung
settingsZeiger auf Druckereinstellungen
+
+ +
Ergebnis: Die Funktion liefert bei korrekter Ausführung den Wert 1 und +im Fehlerfall den Wert 0 zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Druckdialoge +
  +
Querverweis: Binding   WDIALOG +
  + +
+ +

8.5.9.1 Bindings für pdlg_free_settings

+ + + + + + + + + +
C: int16_t pdlg_free_settings ( PRN_SETTINGS *settings ); +
  +
Umsetzung: +
  +
int16_t pdlg_free_settings ( PRN_SETTINGS *settings )
+{
+   addr_in[0] = settings;
+   int_in[0] = 6;
+   crys_if (205);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]205 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]settings
int_inint_in[0]6 # Sub-Opcode
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.5.10 pdlg_get_setsize

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Print Dialog - Get Setting Structure Size« - Länge der +PRN_SETTINGS Struktur ermitteln. +
  +
AES-Nummer: 204 (Unterfunktion 0) +
  +
Deklaration: int32_t pdlg_get_setsize ( void ); +
  +
Beschreibung: Die Funktion ermittelt die Länge der PRN_SETTINGS-Struktur. +
  +
Ergebnis: Die Funktion liefert die Länge der Struktur in Bytes zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Druckdialoge +
  +
Querverweis: Binding   WDIALOG +
  + +
+ +

8.5.10.1 Bindings für pdlg_get_setsize

+ + + + + + + + + +
C: int32_t pdlg_get_setsize ( void ); +
  +
Umsetzung: +
  +
int32_t pdlg_get_setsize ( void )
+{
+   int_in[0] = 0;
+   crys_if (204);
+
+   return ( int_out[0..1] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]204 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]2 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]0 # Sub-Opcode
int_outint_out[0..1]Return-Wert
+
+ + +
+ +

8.5.11 pdlg_new_settings

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Print Dialog - New Default Settings« - Default +Druckereinstellungen setzen. +
  +
AES-Nummer: 205 (Unterfunktion 5) +
  +
Deklaration: PRN_SETTINGS *pdlg_new_settings ( PRN_DIALOG *prn_dialog ); +
  +
Beschreibung: Die Funktion setzt die Default-Druckereinstellungen. Es gilt: +
  +

+
+ + + + + + + + +
ParameterBedeutung
prn_dialogZeiger auf Verwaltungsstruktur
+
+ +
Ergebnis: Die Funktion liefert einen Zeiger auf eine PRN_SETTINGS +Struktur zurück, in der die aktuellen Druckereinstellungen vermerkt +sind. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Druckdialoge +
  +
Querverweis: Binding   WDIALOG +
  + +
+ +

8.5.11.1 Bindings für pdlg_new_settings

+ + + + + + + + + +
C: PRN_SETTINGS *pdlg_new_settings ( PRN_DIALOG *prn_dialog ); +
  +
Umsetzung: +
  +
PRN_SETTINGS *pdlg_new_settings ( PRN_DIALOG *prn_dialog )
+{
+   addr_in[0] = prn_dialog;
+   int_in[0] = 5;
+   crys_if (205);
+
+   return ( addr_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]205 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]0 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]1 # Einträge in addr_out
addr_inaddr_in[0]prn_dialog
int_inint_in[0]5 # Sub-Opcode
addr_outaddr_out[0]Return-Wert
+
+ + +
+ +

8.5.12 pdlg_open

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Print Dialog - Open Window« - Druckdialog im Fenster +öffnen. +
  +
AES-Nummer: 202 +
  +
Deklaration: int16_t pdlg_open ( PRN_DIALOG *prn_dialog, PRN_SETTINGS +*settings, int8_t *document_name, int16_t option_flags, int16_t x, +int16_t y ); +
  +
Beschreibung: Die Funktion öffnet ein Fenster mit dem Druckdialog. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
prn_dialog Zeiger auf die Verwaltungsstruktur +
settings Zeiger auf Druckereinstellungen +
document_name Name des Dokumentes +
option_flags Diverse Flags + + + + + + + + + + + + + + + + + + +
0x0000 = Einstelldialog zeigen +
0x0001 = Druckdialog zeigen +
0x0010 = Kopien anbieten +
0x0020 = Querformat anbieten +
0x0040 = Skalierung anbieten +
0x0100 = Option für gerade und ungerade Seiten + +
+ +
x x-Koordinate des Fensters oder -1 +
y y-Koordinate des Fensters oder -1 + +
+ +
Hinweis: Die Struktur settings enthält die +Druckeinstellung die mit jedem Dokument gespeichert werden sollte. +Wenn zu einem Dokument noch keine Einstellung existiert, kann sie +entweder mit pdlg_new_settings erzeugt werden oder die Applikation +kann Malloc und anschließend pdlg_dflt_settings aufrufen, um den +Speicher zu initialisieren. +
  +
Im Parameter option_flags wird u.a. mitgeteilt, ob der +Dialog als Einstell- oder Druckdialog angezeigt werden soll. Mit +weiteren Flags kann außerdem festgelegt werden, daß Skalierung, +Kopieroption und Querdruck auch dann angeboten werden, wenn ein +Treiber sie nicht unterstützt, so daß die Applikation z.B. die Seite +gedreht ausgeben muss. +
  +
Ergebnis: Die Funktion liefert die Kennung des erzeugten Fensters oder im +Fehlerfall den Wert 0 zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Druckdialoge +
  +
Querverweis: Binding   WDIALOG +
  + +
+ +

8.5.12.1 Bindings für pdlg_open

+ + + + + + + + + +
C: int16_t pdlg_open ( PRN_DIALOG *prn_dialog, PRN_SETTINGS +*settings, int8_t *document_name, int16_t option_flags, int16_t x, +int16_t y ); +
  +
Umsetzung: +
  +
int16_t pdlg_open ( PRN_DIALOG *prn_dialog,
+                    PRN_SETTINGS *settings,
+                    int8_t *document_name,
+                    int16_t option_flags,
+                    int16_t x, int16_t y)
+{
+   addr_in[0] = prn_dialog;
+   addr_in[1] = settings;
+   addr_in[2] = document_name;
+
+   int_in[0] = option_flags;
+   int_in[1] = x;
+   int_in[2] = y;
+   crys_if (202);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]202 # Opcode der Funktion
control+2control[1]3 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]3 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]prn_dialog
addr_in+4addr_in[1]settings
addr_in+8addr_in[2]document_name
int_inint_in[0]option_flags
int_in+2int_in[1]x
int_in+4int_in[2]y
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.5.13 pdlg_remove_printers

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Print Dialog - Remove Private Printers« - eigene Drucker aus +der Liste entfernen. +
  +
AES-Nummer: 205 (Unterfunktion 1) +
  +
Deklaration: int16_t pdlg_remove_printers ( PRN_DIALOG *prn_dialog ); +
  +
Beschreibung: Die Funktion entfernt die mit pdlg_add_printers angemeldeten +Drucker. Es gilt: +
  +

+
+ + + + + + + + +
ParameterBedeutung
prn_dialogZeiger auf Verwaltungsstruktur
+
+ +
Hinweis: Die Funktion muss vor pdlg_delete +aufgerufen werden. +
  +
Ergebnis: Die Funktion liefert stets den Wert 1 zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Druckdialoge +
  +
Querverweis: Binding   WDIALOG +
  + +
+ +

8.5.13.1 Bindings für pdlg_remove_printers

+ + + + + + + + + +
C: int16_t pdlg_remove_printers ( PRN_DIALOG *prn_dialog ); +
  +
Umsetzung: +
  +
int16_t pdlg_remove_printers ( PRN_DIALOG *prn_dialog )
+{
+   addr_in[0] = prn_dialog_dialog;
+   int_in[0] = 1;
+   crys_if (205);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]205 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]prn_dialog
int_inint_in[0]1 # Sub-Opcode
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.5.14 pdlg_remove_sub_dialogs

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Print Dialog - Remove Private Dialogs« - Unterdialoge aus +dem Druckdialog entfernen. +
  +
AES-Nummer: 205 (Unterfunktion 4) +
  +
Deklaration: int16_t pdlg_remove_sub_dialogs ( PRN_DIALOG *prn_dialog ); +
  +
Beschreibung: Die Funktion entfernt die applikationseigenen Unterdialoge aus +dem Druckdialog. Es gilt: +
  +

+
+ + + + + + + + +
ParameterBedeutung
prn_dialogZeiger auf Verwaltungsstruktur
+
+ +
Ergebnis: Die Funktion liefert stets den Wert 1 zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Druckdialoge +
  +
Querverweis: Binding   WDIALOG +
  + +
+ +

8.5.14.1 Bindings für pdlg_remove_sub_dialogs

+ + + + + + + + + +
C: int16_t pdlg_remove_sub_dialogs ( PRN_DIALOG *prn_dialog ); +
  +
Umsetzung: +
  +
int16_t pdlg_remove_sub_dialogs ( PRN_DIALOG *prn_dialog )
+{
+   addr_in[0] = prn_dialog;
+   int_in[0] = 4;
+   crys_if (205);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]205 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]prn_dialog
int_inint_in[0]4 # Sub-Opcode
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.5.15 pdlg_save_default_settings

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Print dialog - Save default settings« +
  +
AES-Nummer: 205 (Unterfunktion 10) +
  +
Deklaration: int16_t pdlg_save_default_settings ( PRN_DIALOG *prn_dialog, +PRN_SETTINGS *settings ); +
  +
Beschreibung: +
  +

+
+ + + + + + + + + + + + +
ParameterBedeutung
prn_dialogZeiger auf Verwaltungsstruktur
settingsZeiger auf Druckereinstellungen
+
+ +
Ergebnis: Die Funktion liefert bei korrekter Ausführung den Wert 1 und +im Fehlerfall den Wert 0 zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Druckdialoge +
  +
Querverweis: Binding   WDIALOG +
  + +
+ +

8.5.15.1 Bindings für pdlg_save_default_settings

+ + + + + + + + + +
C: int16_t pdlg_save_default_settings ( PRN_DIALOG *prn_dialog, +PRN_SETTINGS *settings ); +
  +
Umsetzung: +
  +
int16_t pdlg_save_default_settings ( PRN_DIALOG *prn_dialog,
+                                     PRN_SETTINGS *settings )
+{
+   addr_in[0] = prn_dialog;
+   addr_in[1] = settings;
+
+   int_in[0] = 10;
+
+   crys_if (205);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]205 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]prn_dialog
addr_in+4addr_in[1]settings
int_inint_in[0]10 # Sub-Opcode
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.5.16 pdlg_update

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Print Dialog - Update Window« - neuen Fensternamen setzen. +
  +
AES-Nummer: 205 (Unterfunktion 2) +
  +
Deklaration: int16_t pdlg_update ( PRN_DIALOG *prn_dialog, int8_t +*document_name ); +
  +
Beschreibung: Die Funktion setzt einen neuen Fensternamen. Es gilt: +
  +

+
+ + + + + + + + + + + + +
ParameterBedeutung
prn_dialogZeiger auf Verwaltungsstruktur
document_nameneuer Name des Dokumentes
+
+ +
Hinweis: Die Funktion sollte aufgerufen werden, wenn der +Fensterdialog im Hintergrund liegt und der Anwender ein neues +Dokumentenfenster nach vorne bringt. +
  +
Ergebnis: Die Funktion liefert bei korrekter Ausführung den Wert 1 und +im Fehlerfall den Wert 0 zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Druckdialoge +
  +
Querverweis: Binding   WDIALOG +
  + +
+ +

8.5.16.1 Bindings für pdlg_update

+ + + + + + + + + +
C: int16_t pdlg_update ( PRN_DIALOG *prn_dialog, int8_t +*document_name ); +
  +
Umsetzung: +
  +
int16_t pdlg_update ( PRN_DIALOG *prn_dialog,
+                      int8_t *document_name )
+{
+   addr_in[0] = prn_dialog;
+   addr_in[1] = 0;              /* reserviert (muß 0 sein!) */
+   addr_in[2] = document_name;
+
+   int_in[0] = 2;
+   crys_if (205);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]205 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]3 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]prn_dialog
addr_in+4addr_in[1]0
addr_in+8addr_in[2]document_name
int_inint_in[0]2 # Sub-Opcode
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.5.17 pdlg_use_settings

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Print Dialog - Use Settings« - Einstellungen anwenden. +
  +
AES-Nummer: 205 (Unterfunktion 9) +
  +
Deklaration: int16_t pdlg_use_settings ( PRN_DIALOG *prn_dialog, +PRN_SETTINGS *settings ); +
  +
Beschreibung: Die Funktion sorgt für eine Überprüfung der angegebenen +Druckereinstellungen. +
  +

+
+ + + + + + + + + + + + +
ParameterBedeutung
prn_dialogZeiger auf Verwaltungsstruktur
settingsZeiger auf Druckereinstellungen
+
+ +
Die Funktion sollte aufgerufen werden, wenn ein Programm gleich +ausdrucken möchte und es nicht möglich ist pdlg_do oder pdlg_open +und pdlg_evnt aufzurufen (etwa bei Calamus-Druckdialogen der Fall). +Die übergebenen Druckereinstellungen werden überprüft, und bei +alten Treibern gesichert. +
  +
Ergebnis: Die Funktion liefert bei korrekter Ausführung den Wert 1, und +im Fehlerfall den Wert 0 zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Druckdialoge +
  +
Querverweis: Binding   WDIALOG +
  + +
+ +

8.5.17.1 Bindings für pdlg_use_settings

+ + + + + + + + + +
C: int16_t pdlg_use_settings ( PRN_DIALOG *prn_dialog, +PRN_SETTINGS *settings ); +
  +
Umsetzung: +
  +
int16_t pdlg_use_settings ( PRN_DIALOG *prn_dialog,
+                            PRN_SETTINGS *settings )
+{
+   addr_in[0] = prn_dialog;
+   addr_in[1] = settings;
+
+   int_in[0] = 9;
+   crys_if (205);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]205 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]prn_dialog
addr_in+4addr_in[1]settings
int_inint_in[0]9 # Sub-Opcode
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.5.18 pdlg_validate_settings

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Print Dialog - Validate Settings« - Überprüfung der +Druckereinstellungen. +
  +
AES-Nummer: 205 (Unterfunktion 8) +
  +
Deklaration: int16_t pdlg_validate_settings ( PRN_DIALOG *prn_dialog, +PRN_SETTINGS *settings ); +
  +
Beschreibung: Die Funktion überprüft die angegebenen Druckereinstellungen. +
  +

+
+ + + + + + + + + + + + +
ParameterBedeutung
prn_dialogZeiger auf Verwaltungsstruktur
settingsZeiger auf Druckereinstellungen
+
+ +
Hinweis: Fehlerhafte Strukturinhalte werden von der +Funktion ggfs. korrigiert. +
  +
Ergebnis: Die Funktion liefert bei korrekter Ausführung den Wert 1, und +im Fehlerfall den Wert 0 zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Druckdialoge +
  +
Querverweis: Binding   WDIALOG +
  + +
+ +

8.5.18.1 Bindings für pdlg_validate_settings

+ + + + + + + + + +
C: int16_t pdlg_validate_settings ( PRN_DIALOG *prn_dialog, +PRN_SETTINGS *settings ); +
  +
Umsetzung: +
  +
int16_t pdlg_validate_settings ( PRN_DIALOG *prn_dialog,
+                                 PRN_SETTINGS *settings )
+{
+   addr_in[0] = prn_dialog;
+   addr_in[1] = settings;
+
+   int_in[0] = 8;
+   crys_if (205);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]205 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]prn_dialog
addr_in+4addr_in[1]settings
int_inint_in[0]8 # Sub-Opcode
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.5.19 Druckauswahl im Fenster

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Programmstart:   +
. pdlg_create() +
.   +
Aufruf des Druckdialogs: pdlg_open() +
.   +
Event-Loop: pdlg_evnt() +
.   +
Schließen des Druckdialogs: pdlg_close() +
.   +
. pdlg_delete() +
Programmende:   + +
+ +

8.5.20 Druckauswahl als Dialog

+ + + + + + + + + + + + + + + + + + + + + +
Programmstart:   +
. pdlg_create() +
.   +
Aufruf des Druckdialogs: pdlg_do() +
.   +
. pdlg_delete() +
Programmende:   + +
+ +
+ +Home +AESAES +DateiauswahlDateiauswahl +Editobjekt-FunktionenEditobjekt-Funktionen + + diff --git a/de/pmmu.html b/de/pmmu.html new file mode 100644 index 000000000..4281a0e0c --- /dev/null +++ b/de/pmmu.html @@ -0,0 +1,75 @@ + + + + + +Die Anleitung zum TOS: Der PMMU-Funktionshandler + + + + + + + + + +Home +Inhaltsverzeichnis +Angabe der QuellenAngabe der Quellen +ClearPageModeClearPageMode + +
+ +

F Der PMMU-Funktionshandler

+

Der Funktionshandler ist über den PMMU-Cookie erreichbar, und wird +von Programmen wie Outside oder VRAM angelegt. Der +Aufruf des Handlers ist nur im Supervisor-Modus erlaubt, und geschieht +über eine Funktionsnummer, die im Datenregister D0 abgelegt wird. +Eventuelle Rückgabewerte finden sich ebenfalls in diesem Register +wieder. Andere Prozessorregister werden nicht verändert. +

+

Zur Zeit stehen die folgenden Funktionen zur Verfügung: +

+ + +

Wichtiger Hinweis: Diese Funktionen sind nur für einige +wenige Programme aus dem Bereich der Systemsoftware von Bedeutung, und +haben in Anwenderprogrammen nichts zu suchen. +

+

Querverweis: Super   Supexec +

+ +
+
+ +Home +Inhaltsverzeichnis +Angabe der QuellenAngabe der Quellen +ClearPageModeClearPageMode + + diff --git a/de/pmmu_ClearPageMode.html b/de/pmmu_ClearPageMode.html new file mode 100644 index 000000000..87a1de2a7 --- /dev/null +++ b/de/pmmu_ClearPageMode.html @@ -0,0 +1,100 @@ + + + + + +Die Anleitung zum TOS: ClearPageMode + + + + + + + + + +Home +Der PMMU-FunktionshandlerDer PMMU-Funktionshandler +Der PMMU-FunktionshandlerDer PMMU-Funktionshandler +GetHdv_inuseGetHdv_inuse + +
+ +

F.1 ClearPageMode

+ + + + + + + + + + + + + + + + + + + + + +
Name: »ClearPageMode« - PMMU Modus für einen Bereich löschen. +
  +
Nummer: 2 +
  +
Deklaration: ULONG ClearPageMode ( ULONG mode, ULONG start_address, ULONG +length ); +
  +
Beschreibung: Die Funktion löscht den PMMU-Modus für einen bestimmten +Speicherbereich. Es gilt: +
  +

+
+ + + + + + + + + + + + + + + + +
ParameterBedeutung
modeBit-Vektor analog SetPageMode
start_addressAnfangsadresse des Speicherbereichs
lengthLänge des gewünschten Bereichs
+
+ +
Hinweis: Alle anderen Bits sind für zukünftige Zwecke +reserviert. Ein Programm darf nur die Bits löschen, die es vorher +selbst gesetzt hat. +
  +
Ergebnis: Die Funktion liefert bei fehlerfreier Ausführung den Wert Null +zurück. Anderenfalls wird ein Wert zurückgeliefert, bei dem die Bits +gesetzt sind, die nicht manipuliert werden konnten. +
  +
Gruppe: PMMU-Funktionshandler +
  +
Querverweis: GetHdv_inuse   GetPageSize   pmem_size   PMMUversion   +SetPageMode   vmem_size +
  + +
+ +
+ +Home +Der PMMU-FunktionshandlerDer PMMU-Funktionshandler +Der PMMU-FunktionshandlerDer PMMU-Funktionshandler +GetHdv_inuseGetHdv_inuse + + diff --git a/de/pmmu_GetHdv_inuse.html b/de/pmmu_GetHdv_inuse.html new file mode 100644 index 000000000..1fc900af0 --- /dev/null +++ b/de/pmmu_GetHdv_inuse.html @@ -0,0 +1,80 @@ + + + + + +Die Anleitung zum TOS: GetHdv_inuse + + + + + + + + + +Home +Der PMMU-FunktionshandlerDer PMMU-Funktionshandler +ClearPageModeClearPageMode +GetPageSizeGetPageSize + +
+ +

F.2 GetHdv_inuse

+ + + + + + + + + + + + + + + + + + + + + +
Name: »GetHdv_inuse« - Aktivität des Plattentreibers ermitteln. +
  +
Nummer: 4 +
  +
Deklaration: UWORD *GetHdv_inuse ( VOID ); +
  +
Beschreibung: Die Funktion ermöglicht es festzustellen, ob der +Plattentreiber gerade dabei ist, eine Seite ein- oder auszuswappen. +
  +
Hinweis: Eine Überprüfung dieses Wortes muß erfolgen, +bevor aus einer Interruptroutine heraus ein Zugriff auf das virtuelle +RAM stattfindet. Der Plattentreiber darf nämlich nicht durch einen +Zugriff auf eine nicht existente Speicherseite unterbrochen werden, +falls gerade eine andere Seite ausgelagert wird. Ist das Statuswort +ungleich Null, muß der Zugriff verschoben werden. +
  +
Ergebnis: Die Funktion liefert einen Zeiger auf das hdv_inuse-Wort +zurück. +
  +
Gruppe: PMMU-Funktionshandler +
  +
Querverweis: ClearPageMode   GetPageSize   pmem_size   PMMUversion   +SetPageMode   vmem_size +
  + +
+ +
+ +Home +Der PMMU-FunktionshandlerDer PMMU-Funktionshandler +ClearPageModeClearPageMode +GetPageSizeGetPageSize + + diff --git a/de/pmmu_GetPageSize.html b/de/pmmu_GetPageSize.html new file mode 100644 index 000000000..24193b7af --- /dev/null +++ b/de/pmmu_GetPageSize.html @@ -0,0 +1,75 @@ + + + + + +Die Anleitung zum TOS: GetPageSize + + + + + + + + + +Home +Der PMMU-FunktionshandlerDer PMMU-Funktionshandler +GetHdv_inuseGetHdv_inuse +pmem_sizepmem_size + +
+ +

F.3 GetPageSize

+ + + + + + + + + + + + + + + + + + + + + +
Name: »GetPageSize« - Größe der Speicherseiten ermitteln. +
  +
Nummer: 3 +
  +
Deklaration: ULONG GetPageSize ( VOID ); +
  +
Beschreibung: Die Funktion ermittelt die aktuelle Größe einer +Speicherseite. +
  +
Hinweis: Beim MC-68030 kann die Größe zwischen 256 +Bytes und 32 Kbyte liegen. +
  +
Ergebnis: Die Funktion liefert Größe einer Speicherseite zurück. +
  +
Gruppe: PMMU-Funktionshandler +
  +
Querverweis: ClearPageMode   GetHdv_inuse   pmem_size   PMMUversion   +SetPageMode   vmem_size +
  + +
+ +
+ +Home +Der PMMU-FunktionshandlerDer PMMU-Funktionshandler +GetHdv_inuseGetHdv_inuse +pmem_sizepmem_size + + diff --git a/de/pmmu_PMMUversion.html b/de/pmmu_PMMUversion.html new file mode 100644 index 000000000..796558be7 --- /dev/null +++ b/de/pmmu_PMMUversion.html @@ -0,0 +1,74 @@ + + + + + +Die Anleitung zum TOS: PMMUversion + + + + + + + + + +Home +Der PMMU-FunktionshandlerDer PMMU-Funktionshandler +pmem_sizepmem_size +SetPageModeSetPageMode + +
+ +

F.5 PMMUversion

+ + + + + + + + + + + + + + + + + + + + + +
Name: »PMMUversion« - ermittelt die Versionsnummer des Handlers +
  +
Nummer: 0 +
  +
Deklaration: UWORD PMMUversion ( VOID ); +
  +
Beschreibung: Die Funktion ermittelt die Versionsnummer des PMMU-Handlers. +Dabei wird in den Bits 8..15 die Version, und in den Bits 0..7 die +Revision abgelegt. Ein Wert von 0x102 steht demnach für Version 1.02 +
  +
Ergebnis: Die Funktion liefert die Versionsnummer des Handlers im o.g. +Format zurück. +
  +
Gruppe: PMMU-Funktionshandler +
  +
Querverweis: ClearPageMode   GetHdv_inuse   GetPageSize   pmem_size   +SetPageMode   vmem_size +
  + +
+ +
+ +Home +Der PMMU-FunktionshandlerDer PMMU-Funktionshandler +pmem_sizepmem_size +SetPageModeSetPageMode + + diff --git a/de/pmmu_SetPageMode.html b/de/pmmu_SetPageMode.html new file mode 100644 index 000000000..d68202d64 --- /dev/null +++ b/de/pmmu_SetPageMode.html @@ -0,0 +1,144 @@ + + + + + +Die Anleitung zum TOS: SetPageMode + + + + + + + + + +Home +Der PMMU-FunktionshandlerDer PMMU-Funktionshandler +PMMUversionPMMUversion +vmem_sizevmem_size + +
+ +

F.6 SetPageMode

+ + + + + + + + + + + + + + + + + + + + + +
Name: »SetPageMode« - PMMU Modus für einen Bereich setzen. +
  +
Nummer: 1 +
  +
Deklaration: ULONG SetPageMode ( ULONG mode, ULONG start_address, ULONG +length ); +
  +
Beschreibung: Die Funktion setzt den PMMU-Modus für einen bestimmten +Speicherbereich. Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
mode Modus als Bit-Vektor + + + + + + + + + + + + + + + +
Bit 0 = SwapInhabit +
Der Speicherbereich wird nicht ausgelagert. +
Bit 1 = WriteProtect +
Der Speicherbereich wird schreibgeschützt; Schreibversuche +führen zu einem Busfehler. +
Bit 2 = Used +
Der Speicherbereich wird als benutzt gekennzeichnet. Hierdurch +erhält er temporär eine höhere Priorität, und wird vorerst nicht +ausgelagert. +
Bit 3 = Modified +
Der Speicherbereich wird als verändert markiert. Dadurch wird +dieser Bereich auf jeden Fall auf die Platte geschrieben, bevor neue +Daten an seine physikalische Adresse eingelesen werden. +
Bit 4 = CacheInhabit +
Die Prozessor-Caches werden für den angegebenen Bereich +abgeschaltet. + +
+ +
start_address Anfangsadresse des Speicherbereichs +
length Länge des gewünschten Bereichs + +
+ +
Hinweis: Die restlichen Bits sind reserviert und müssen +auf Null gesetzt werden. Für die virtuelle Speicherverwaltung ist in +erster Linie das SwapInhabit-Bit von Bedeutung, da es die Möglichkeit +bietet, bestimmte Speicherbereiche gegen Auslagern abzusichern. +
  +
Beim Schreibschützen von Speicherbereichen ist unbedingt zu +beachten, daß der Speicher in Seiten unterteilt ist, die die kleinste +Einheit für einen Schreibschutz darstellen. Es muß sichergestellt +werden, daß sich der Schreibschutz nicht auch auf einen Bereich +erstreckt, der nicht geschützt werden darf, weil er beispielsweise +nicht zum eigenen Programm gehört. +
  +
Ergebnis: Die Funktion liefert bei fehlerfreier Ausführung den Wert Null +zurück. Anderenfalls wird ein Wert zurückgeliefert, bei dem die Bits +gesetzt sind, die nicht manipuliert werden konnten. +
  +
Gruppe: PMMU-Funktionshandler +
  +
Querverweis: ClearPageMode   GetHdv_inuse   GetPageSize   pmem_size   +PMMUversion   vmem_size +
  + +
+ +
+ +Home +Der PMMU-FunktionshandlerDer PMMU-Funktionshandler +PMMUversionPMMUversion +vmem_sizevmem_size + + diff --git a/de/pmmu_pmem_size.html b/de/pmmu_pmem_size.html new file mode 100644 index 000000000..bc132c3b1 --- /dev/null +++ b/de/pmmu_pmem_size.html @@ -0,0 +1,76 @@ + + + + + +Die Anleitung zum TOS: pmem_size + + + + + + + + + +Home +Der PMMU-FunktionshandlerDer PMMU-Funktionshandler +GetPageSizeGetPageSize +PMMUversionPMMUversion + +
+ +

F.4 pmem_size

+ + + + + + + + + + + + + + + + + + + + + +
Name: »pmem_size« - Gesamtgröße des vom Speichermanagers +verwalteten physikalischen Speichers ermitteln. +
  +
Nummer: 6 +
  +
Deklaration: ULONG pmem_size ( VOID ); +
  +
Beschreibung: Die Funktion ermittelt die Gesamtgröße des physikalischen +Speichers, der vom Speichermanager verwaltet wird. +
  +
Hinweis: Diese Funktion steht erst ab Version 1.01 des +PMMU-Cookies zur Verfügung. +
  +
Ergebnis: Die Funktion liefert die genannte Größe zurück. +
  +
Gruppe: PMMU-Funktionshandler +
  +
Querverweis: ClearPageMode   GetHdv_inuse   GetPageSize   PMMUversion   +SetPageMode   vmem_size +
  + +
+ +
+ +Home +Der PMMU-FunktionshandlerDer PMMU-Funktionshandler +GetPageSizeGetPageSize +PMMUversionPMMUversion + + diff --git a/de/pmmu_vmem_size.html b/de/pmmu_vmem_size.html new file mode 100644 index 000000000..4826fe612 --- /dev/null +++ b/de/pmmu_vmem_size.html @@ -0,0 +1,73 @@ + + + + + +Die Anleitung zum TOS: vmem_size + + + + + + + + + +Home +Der PMMU-FunktionshandlerDer PMMU-Funktionshandler +SetPageModeSetPageMode +TOS ListeTOS Liste + +
+ +

F.7 vmem_size

+ + + + + + + + + + + + + + + + + + + + + +
Name: »vmem_size« - Gesamtgröße des virtuellen Speichers +erfragen. +
  +
Nummer: 5 +
  +
Deklaration: ULONG vmem_size ( VOID ); +
  +
Beschreibung: Die Funktion ermittelt die Gesamtgröße des virtuellen +Speichers. +
  +
Ergebnis: Die Funktion liefert die genannte Größe zurück. +
  +
Gruppe: PMMU-Funktionshandler +
  +
Querverweis: ClearPageMode   GetHdv_inuse   GetPageSize   pmem_size   +PMMUversion   SetPageMode +
  + +
+ +
+ +Home +Der PMMU-FunktionshandlerDer PMMU-Funktionshandler +SetPageModeSetPageMode +TOS ListeTOS Liste + + diff --git a/de/powerdos.html b/de/powerdos.html new file mode 100644 index 000000000..86a408a93 --- /dev/null +++ b/de/powerdos.html @@ -0,0 +1,301 @@ + + + + + +Die Anleitung zum TOS: PowerDOS + + + + + + + + + +Home +GEMDOSGEMDOS +NAP BioNet100NAP BioNet100 +TekBiosTekBios + +
+ +

5.21 PowerDOS

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

PowerDOS is a GEMDOS extension for preemptive multitasking. +

+

For more information, see the PowerDOS Programmer's Manual. +

+

New modes for Pexec provide multitasking and threads support: +

+ + + + + + + + + + + + + + + + + + +
mode Meaning +
    +
0x10 Like mode 0, except that the parent continues to operate +concurrently with the newly created child task. +
0x16 Like mode 6, except that the parent continues to operate +concurrently with the newly created child task. +
0x17 Execute a code fragment that is within the text segment of the +calling process. +
0x18 Like mode 0x17, except that it allows a number of INTs to be +placed on the stack of the new task. + +
+ +

PowerDOS adds the function Flock and the cookie _FLK conforming +to the specification for GEMDOS File Sharing & Record Locking. +

+

Die folgende Liste ist eine Übersicht der PowerDOS-Routinen, +geordnet nach Funktionsnummern: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
128 Puserid Get or set Group.User ID of a process +
Syntax: int32_t Puserid(int16_t process_id, int16_t flag, int32_t +new_group_user) +
129 Ppriority Set or get the priority of given process +
Syntax: int32_t Ppriority(int16_t process_id, int16_t +new_priority) +
130 Pgetpid Get current process' process ID +
Syntax: int16_t Pgetpid() +
131 Pgetppid Get current process' parent's process ID +
Syntax: int32_t Pgetppid() +
132 Pgetpd Return pointer to process descriptor of given +process +
Syntax: void *Pgetpd(int16_t process_id) +
133 Pfindpid Find the process ID of a process with the +given name +
Syntax: int32_t Pfindpid(int8_t *process_name) +
134 Pprocinf Return information about process +
Syntax: int32_t Pprocinf(int16_t process_id, struct PROCINFO +*buffer) +
135 Pnice Change process priority using delta +
Syntax: int32_t Pnice(int16_t process_id, int16_t delta) +
136 Smalloc Allocate a block of system memory (top down) +
Syntax: char *Smalloc(int32_t mem_size) +
137 Massign Assign a block of memory owned by calling +process to process of given process ID +
Syntax: int32_t Massign(int16_t process_id, int8_t *mem_start) +
139 Fstatus Perform various status operations on an open +file +
Syntax: int32_t Fstatus(int16_t handle, int16_t sub_function, ...) +
140 Fsfirstidx Perform Fsfirst function with index into +directory structure +
Syntax: int32_t Fsfirstidx(int8_t *pathname, int16_t attributes, +int16_t index) +
141 Wake_parent Wake parent process of current process +
Syntax: int32_t Wake_parent(int16_t code) +
142 Wait Wait for child process to terminate +
Syntax: int32_t Wait() +
143 Sleep Sleep (block) for specified time, or indefinately +
Syntax: int32_t Sleep(int32_t time) +
144 Ioqueue Link to queue of processes waiting for access +I/O +
Syntax: int32_t Ioqueue(int16_t process_id, int32_t time) +
145 Wait_dt Wait (block) until a specified date/time +
Syntax: int32_t Wait_dt(uint32_t date_time) +
146 Dev_create Create a new I/O device +
Syntax: int32_t Dev_create(int8_t *dev_name, int8_t *fm_name, +int8_t *drv_name, int8_t *path_vars, int8_t *dev_vars, int16_t share) +
147 Fm_add Add a new file manager to the system +
Syntax: int32_t Fm_add(int8_t *fm_name, int8_t *subroutine_tab, +int8_t *fm_vars, int16_t fm_type) +
148 Drv_add Add a new device driver to the system, or +replace an old one +
Syntax: int32_t Drv_add(int8_t *drv_name, int8_t *subroutine_tab, +int8_t *drv_vars) +
149 Devinfo Return device info for requested device index +
Syntax: int32_t Devinfo(int16_t idx, struct dev_info *buffer) +
150 Send Send a signal to a process +
Syntax: int32_t Send(int16_t process_id, int32_t signal_code) +
151 Sig_intercept Install signal intercept routine +
Syntax: int32_t Sig_intercept(int16_t (*intercept_rtn)(int32_t, +void*), int32_t *var_ptr) +
152 Suspend Suspend a process +
Syntax: int32_t Suspend(int16_t process_id) +
153 Q_message The Message Queue +
Syntax: int16_t Q_message(struct mq_params *mqparams) +
154 Semaphore The Semaphore function +
Syntax: int16_t Semaphore(struct s_params *sparams) +
155 Mem_share Shared memory +
Syntax: int16_t Mem_share(struct ms_params *msparams) +
158 Chgvector Read or modify a GEMDOS, BIOS or XBIOS +function vector +
Syntax: int32_t Chgvector(int16_t trap_num, int16_t vector_num, +int8_t *new_vector) +
159 Chgsysvar Read or modify a PowerDOS internal variable +
Syntax: int32_t Chgsysvar(int16_t var_num, int16_t flag, int32_t +new_value) +
160 Pname Read or modify the name of a process +
Syntax: int32_t Pname(int16_t proc_id, int16_t get_set, int8_t +*name) +
161 Pvector Read or modify a process' user vector +
Syntax: int32_t Pvector(int16_t proc_id, int32_t vector) +
162 Pattrib Set or clear bits in a process' attribute byte +
Syntax: int32_t Pattrib(int16_t proc_id, unsigned char flag, +unsigned char mask) +
163 Pmaxmem Set or get the maximum memory returned for +Malloc(-1) for a process +
Syntax: int32_t Pmaxmem(int16_t proc_id, int16_t flag, int32_t +size) + +
+ +

Querverweis: GEMDOS   BIOS-Funktionsliste   XBIOS-Funktionsliste   Cookie PDOS   +Cookie _FLK +

+
+ +Home +GEMDOSGEMDOS +NAP BioNet100NAP BioNet100 +TekBiosTekBios + + diff --git a/de/proc.html b/de/proc.html new file mode 100644 index 000000000..87b5538c7 --- /dev/null +++ b/de/proc.html @@ -0,0 +1,1392 @@ + + + + + +Die Anleitung zum TOS: Prozessverwaltung + + + + + + + + + +Home +AESAES +ObjektfunktionenObjektfunktionen +Eigenschaft-FunktionenEigenschaft-Funktionen + +
+ +

8.19 Prozessverwaltung

+

This library is only available on GEM XM. These functions allow +to run up to 10 GEM and DOS applications at once, swapping out to +eXpanded Memory (XM) or to disk. Each process uses a +'channel' to store its system area, work area, interrupt table and +swap file. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
proc_create Create a new process +
proc_delete Close all desk accessories +
proc_info Obtain info about a process +
proc_malloc Allocate memory +
proc_mfree Release memory +
proc_run Run process +
proc_setblock Shrink channel and create swap file +
proc_shrink Shrink channel with optional swap creation +
proc_switch Switch to process + +
+ +

8.19.1 proc_create

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Process create« - Create a new process +
  +
AES-Nummer: 60 +
  +
Deklaration: int16_t proc_create ( void *address, int32_t size, int16_t +is_swap, int16_t is_gem, int16_t *num ); +
  +
Beschreibung: The call proc_create allocates a new process ID but does not +launch the process. The following apply: +
  + + + + + + + + + + + + + + + +
address Channel address at which to load process +
size Space to allocate, or 0 to allocate maximum channel space +
is_swap Nonzero if the process can be swapped out, zero if it must stay +paged in. The GEM XM Desktop marks accessories as not to be paged out +
is_gem Nonzero if the process is a GEM application, zero for DOS +application +
num Process ID of new process + +
+ +
Note: Since GEM XM doesn't support having more than one +newly-launched process waiting around, the process with ID num +must be launched through proc_run before calling proc_create again. +
  +
Ergebnis: An error has arisen only if the value 0 is returned (no more ID +available). +
  +
Verfügbar: The function is only available under GEM XM and FreeGEM/XM. +
  +
Gruppe: Prozessverwaltung +
  +
Querverweis: Binding   proc_run   proc_info   proc_switch +
  + +
+ +

8.19.1.1 Bindings für proc_create

+ + + + + + + + + +
C: int16_t proc_create ( void *address, int32_t size, int16_t +is_swap, int16_t is_gem, int16_t *num ); +
  +
Umsetzung: +
  +
int16_t proc_create (void *address, int32_t size, int16_t is_swap,
+                 int16_t is_gem, int16_t *num)
+{
+   int_in[0]  = is_swap;
+   int_in[1]  = is_gem;
+   addr_in[0] = address;
+   addr_in[1] = size;
+
+   crys_if(60);
+
+   *num = int_out[1];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]60 # Opcode der Funktion
control+2control[1]2 # Einträge in int_in
control+4control[2]2 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]is_swap
int_in+2int_in[1]is_gem
addr_inaddr_in[0]address
addr_in+4addr_in[1]size
int_outint_out[0]Return-Wert
int_out+2int_out[1]num
+
+ + +
+ +

8.19.2 proc_delete

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Process delete« - Close all desk accessories +
  +
AES-Nummer: 62 +
  +
Deklaration: int16_t proc_delete ( int16_t pr_deid ); +
  +
Beschreibung: The call proc_delete shuts down all desk accessories. The +pr_deid parameter is ignored, but Desktop uses -1. +
  +
Ergebnis: Return value of the function is unknown at present. +
  +
Verfügbar: The function is only available under GEM XM and FreeGEM/XM. +
  +
Gruppe: Prozessverwaltung +
  +
Querverweis: Binding +
  + +
+ +

8.19.2.1 Bindings für proc_delete

+ + + + + + + + + +
C: int16_t proc_delete ( int16_t pr_deid ); +
  +
Umsetzung: +
  +
int16_t proc_delete (int16_t pr_deid)
+{
+   int_in[0]  = pr_deid;
+   return ( crys_if(62) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]62 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]pr_deid
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.19.3 proc_info

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Process information« - Obtains information about a process +
  +
AES-Nummer: 63 +
  +
Deklaration: int16_t proc_info ( int16_t pid, int16_t *is_swap, int16_t +*is_gem, void **address, int32_t *csize, void **endmem, int32_t +*ssize, void **intaddr ); +
  +
Beschreibung: The call proc_info inquires information about a process. The +following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
pid Process ID about which to get info +
is_swap Nonzero if swappable, else zero +
is_gem Nonzero for a GEM application, zero for a DOS application +
address Address of channel +
csize Size of channel +
endmem First address beyond end of process memory +
ssize Channel system size +
intaddr Address of process's copy of the interrupt vector table + +
+ +
Ergebnis: An error has arisen only if the value 0 is returned. +
  +
Verfügbar: The function is only available under GEM XM and FreeGEM/XM. +
  +
Gruppe: Fensterverwaltung +
  +
Querverweis: Binding   proc_create   proc_run   proc_switch +
  + +
+ +

8.19.3.1 Bindings für proc_info

+ + + + + + + + + +
C: int16_t proc_info ( int16_t pid, int16_t *is_swap, int16_t +*is_gem, void **address, int32_t *csize, void **endmem, int32_t +*ssize, void **intaddr ); +
  +
Umsetzung: +
  +
int16_t proc_info (int16_t pid, int16_t *is_swap, int16_t *is_gem,
+              void **address, int32_t *csize, void **endmem,
+              int32_t *ssize, void **intaddr)
+{
+   int_in[0]  = pid;
+
+   crys_if(63);
+
+   *is_swap  = int_out[1];
+   *is_gem   = int_out[2];
+   *address  = addr_out[0];
+   *csize    = addr_out[1];
+   *endmem   = addr_out[2];
+   *ssize    = addr_out[3];
+   *intaddr  = addr_out[4];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]63 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]3 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]5 # Einträge in addr_out
int_inint_in[0]pid
int_outint_out[0]Return-Wert
int_out+2int_out[1]is_swap
int_out+4int_out[2]is_gem
addr_outaddr_out[0]address
addr_out+4addr_out[1]csize
addr_out+8addr_out[2]endmem
addr_out+12addr_out[3]ssize
addr_out+16addr_out[4]intaddr
+
+ + +
+ +

8.19.4 proc_malloc

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Process memory allocation« - Allocate memory +
  +
AES-Nummer: 64 +
  +
Deklaration: void *proc_malloc ( int32_t size, int32_t *ret_size ); +
  +
Beschreibung: The call proc_malloc allocates a memory block of size +bytes. +
  +
Ergebnis: The function returns a pointer to the allocated memory block, +or 0 if failed. ret_size is filled with either the size of the +allocated memory block, or with the maximum available size. +
  +
Verfügbar: The function is only available under GEM XM and FreeGEM/XM. +
  +
Gruppe: Prozessverwaltung +
  +
Querverweis: Binding   proc_mfree   proc_setblock   proc_shrink +
  + +
+ +

8.19.4.1 Bindings für proc_malloc

+ + + + + + + + + +
C: void *proc_malloc ( int32_t size, int32_t *ret_size ); +
  +
Umsetzung: +
  +
void *proc_malloc (int32_t size, int32_t *ret_size)
+{
+   addr_in[0] = size;
+
+   crys_if(64);
+
+   *ret_size = addr_out[1];
+
+   return ( addr_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]64 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]2 # Einträge in addr_out
addr_inaddr_in[0]size
int_outint_out[0]1 if success, or 0 if failure
addr_outaddr_out[0]Return-Wert
addr_out+4addr_out[1]ret_size
+
+ + +
+ +

8.19.5 proc_mfree

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Process memory free« - Release memory +
  +
AES-Nummer: 65 +
  +
Deklaration: int16_t proc_mfree ( int16_t pr_mfid ); +
  +
Beschreibung: The call proc_mfree deletes the channel associated to the +process ID pr_mfid from memory and disk for reuse. +
  +
Ergebnis: An error has arisen if the value 0 is returned. +
  +
Verfügbar: This function is only available under GEM XM and FreeGEM/XM. +
  +
Gruppe: Prozessverwaltung +
  +
Querverweis: Binding   proc_malloc   proc_setblock   proc_shrink +
  + +
+ +

8.19.5.1 Bindings für proc_mfree

+ + + + + + + + + +
C: int16_t proc_mfree ( int16_t pr_mfid ); +
  +
Umsetzung: +
  +
int16_t proc_mfree (int16_t pr_mfid)
+{
+   int_in[0]  = pr_mfid;
+   return ( crys_if(65) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]65 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]pr_mfid
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.19.6 proc_run

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Process run« - Run a process +
  +
AES-Nummer: 61 +
  +
Deklaration: int16_t proc_run ( int16_t pid, int16_t is_graphical, int16_t +options, int8_t *command, int8_t *tail ); +
  +
Beschreibung: The call proc_run launches a process previously created with +proc_create. The following apply: +
  + + + + + + + + + + + + + + + +
pid Process ID previously returned by proc_create +
is_graphical Nonzero for a GEM program, zero for a DOS program +
options Special load options: + + + + + + + + + +
3 Program is a desk accessory +
4 If this is a GEM program, its windows remain visible +whichever program is in the foreground; otherwise they are only +visible when the program in question is in the foreground +
-1 If the gl_allwins flag is turned on, then behaves like +type 4. Otherwise behaves as default. GEM provides no option to +turn this flag on programmatically; you have to patch the AES by +writing a nonzero value in the byte that follows the marker 'zyxg' +inside the binary AES file. + +
+ +
command Name of program to run +
tail Command tail to pass to it + +
+ +
Note: The odd range of values passed to the load options +is chosen for compatibility with the isover flag of +shel_write. +
  +
Ergebnis: An error has arisen only if the value 0 is returned. +
  +
Verfügbar: The function is only available under GEM XM and FreeGEM/XM. +
  +
Gruppe: Prozessverwaltung +
  +
Querverweis: Binding   proc_create   proc_info   proc_switch +
  + +
+ +

8.19.6.1 Bindings für proc_run

+ + + + + + + + + +
C: int16_t proc_run ( int16_t pid, int16_t is_graphical, int16_t +options, int8_t *command, int8_t *tail ); +
  +
Umsetzung: +
  +
int16_t proc_run (int16_t pid, int16_t is_graphical, int16_t options,
+                 int8_t *command, int8_t *tail)
+{
+   int_in[0]  = pid;
+   int_in[1]  = is_graphical;
+   int_in[2]  = options;
+   addr_in[0] = command;
+   addr_in[1] = tail;
+
+   return ( crys_if(61) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]61 # Opcode der Funktion
control+2control[1]3 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]pid
int_in+2int_in[1]is_graphical
int_in+4int_in[2]options
addr_inaddr_in[0]command
addr_in+4addr_in[1]tail
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.19.7 proc_setblock

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Process set block« - Shrink channel and create swap file +
  +
AES-Nummer: 67 +
  +
Deklaration: int16_t proc_setblock ( int16_t pr_seid ); +
  +
Beschreibung: The call proc_setblock reduces the channel size allocated to +the process pr_seid to what it is using now by eliminating its +free memory, and creates the swap file used to page it out. +
  +
Note This function calls proc_shrink(pr_seid, 1, +&dummy, &dummy). The FreeGEM/XM Desktop defines this function +as proc_shrink() with PROC_SHRINK=67 and omit to define a function for +opcode 68. Original sources stated PROC_SETBLOCK=67 (with PID only) +and PROC_SHRINK=68 (with extra parameters), as documented here. +
  +
Ergebnis: An error has arisen only if the value 0 is returned. +
  +
Verfügbar: The function is only available under GEM XM and FreeGEM/XM. +
  +
Gruppe: Prozessverwaltung +
  +
Querverweis: Binding   proc_malloc   proc_mfree   proc_shrink +
  + +
+ +

8.19.7.1 Bindings für proc_setblock

+ + + + + + + + + +
C: int16_t proc_setblock ( int16_t pr_seid ); +
  +
Umsetzung: +
  +
int16_t proc_setblock (int16_t pr_seid)
+{
+   int_in[0]  = pr_seid;
+   return ( crys_if(67) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]67 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]pr_seid
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.19.8 proc_shrink

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Process shrink« - Shrink channel +
  +
AES-Nummer: 68 +
  +
Deklaration: int16_t proc_shrink ( int16_t pr_shid, int16_t createswap, void +*address, int32_t *size ); +
  +
Beschreibung: The call proc_shrink reduces the size of the channel allocated +to the process pr_shid to what it is using now by eliminating +its free memory, and optionally creates the swap file used to page it +out if createswap is set to 1. +
  +
Note: This function is not used by FreeGEM/XM Desktop. +On this environment, the function with opcode 67 is called proc_shrink +and there is no binding for opcode 68. +
  +
Ergebnis: An error has arisen only if the value 0 is returned. On +success, this function returns the new size and +address of the channel. +
  +
Verfügbar: The function is only available under GEM XM. +
  +
Gruppe: Prozessverwaltung +
  +
Querverweis: Binding   proc_malloc   proc_mfree   proc_setblock +
  + +
+ +

8.19.8.1 Bindings für proc_shrink

+ + + + + + + + + +
C: int16_t proc_shrink ( int16_t pr_shid, int16_t createswap, void +*address, int32_t *size ); +
  +
Umsetzung: +
  +
int16_t proc_shrink (int16_t pr_shid, int16_t createswap, void *address, int32_t *size)
+{
+   int_in[0]  = pr_shid;
+   int_in[1]  = createswap;
+
+   crys_if(68);
+
+   *address = addr_out[0];
+   *size    = addr_out[1];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]68 # Opcode der Funktion
control+2control[1]2 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]2 # Einträge in addr_out
int_inint_in[0]pr_shid
int_in+2int_in[1]createswap
int_outint_out[0]Return-Wert
addr_outaddr_out[0]address
addr_out+4addr_out[1]size
+
+ + +
+ +

8.19.9 proc_switch

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Process switch« - Switch to process +
  +
AES-Nummer: 66 +
  +
Deklaration: int16_t proc_switch ( int16_t pr_swid ); +
  +
Beschreibung: The call proc_switch switches to process with the ID +pr_swid. +
  +
Ergebnis: Returns 0 if process is already the active process, else 1. +
  +
Verfügbar: This function is only available under GEM XM and FreeGEM/XM. +
  +
Gruppe: Prozessverwaltung +
  +
Querverweis: Binding   proc_create   proc_info   proc_run +
  + +
+ +

8.19.9.1 Bindings für proc_switch

+ + + + + + + + + +
C: int16_t proc_switch ( int16_t pr_swid ); +
  +
Umsetzung: +
  +
int16_t proc_switch (int16_t pr_swid)
+{
+   int_in[0]  = pr_swid;
+   return ( crys_if(66) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]66 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]pr_swid
int_outint_out[0]Return-Wert
+
+ + +
+ +
+ +Home +AESAES +ObjektfunktionenObjektfunktionen +Eigenschaft-FunktionenEigenschaft-Funktionen + + diff --git a/de/prop.html b/de/prop.html new file mode 100644 index 000000000..23ecf2f03 --- /dev/null +++ b/de/prop.html @@ -0,0 +1,971 @@ + + + + + +Die Anleitung zum TOS: Eigenschaft-Funktionen + + + + + + + + + +Home +AESAES +ProzessverwaltungProzessverwaltung +ResourcefunktionenResourcefunktionen + +
+ +

8.20 Eigenschaft-Funktionen

+

Diese Bibliothek enthält spezielle Funktionen, welche nur unter +FreeGEM zur Verfügung stehen. +

+ + + + + + + + + + + + + + + +
prop_del Deletes a setting from global properties file +
prop_get Gets settings from global properties file +
prop_gui_get Obtains GUI options +
prop_gui_set Sets GUI options +
prop_put Saves setting to global properties file + +
+ +

Querverweis: AES +

+

8.20.1 prop_del

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Property delete« - Delete setting from the GEM +configuration file. +
  +
AES-Nummer: 1012 +
  +
Deklaration: int16_t prop_del ( int8_t *program, int8_t *section, int16_t +options ); +
  +
Beschreibung: The call prop_del serves for deleting settings from the global +settings file of the AES. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
program Name that identifies the program. It should be formed of one or +more words separated by dots - for example, the DEMO sample uses +"PTK.DEMO". +
section Name of the field to delete. Again, this should be one or more +words separated by dots. DEMO uses "Pen.shade", +"Pen.colour" and "Pen.size". +
options Current user (0) or all users (1). Use 0 if possible although +multiple user profiles is not yet supported. + +
+ +
Ergebnis:  0 = Property delete successfully +
 1 = Property was not found +
-1 = File I/O error +
-2 = Not enough memory +
  +
Verfügbar: This call is a compile-time option in recent FreeGEM versions. +To check for this feature, use appl_init(xbuf) and check that bit 1 of +xbuf.abilities is set (ABLE_PROP). +
  +
Gruppe: Eigenschaft-Funktionen +
  +
Querverweis: Binding   prop_get   prop_put +
  + +
+ +

8.20.1.1 Bindings für prop_del

+ + + + + + + + + +
C: int16_t prop_del ( int8_t *program, int8_t *section, int16_t +options ); +
  +
Umsetzung: +
  +
int16_t prop_del (int8_t *program, int8_t *section, int16_t options )
+{
+   int_in[0]  = options;
+   addr_in[0] = program;
+   addr_in[1] = section;
+
+   return ( crys_if(1012) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]1012 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]options
addr_inaddr_in[0]program
addr_in+4addr_in[1]section
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.20.2 prop_get

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Property get« - Read setting from the GEM configuration +file. +
  +
AES-Nummer: 1010 +
  +
Deklaration: int16_t prop_get ( int8_t *program, int8_t *section, int8_t +*buffer, int16_t buflen, int16_t options ); +
  +
Beschreibung: The call prop_get serves for reading settings from the global +settings file of the AES. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
program Name that identifies the program. It should be formed of one or +more words separated by dots - for example, the DEMO sample uses +"PTK.DEMO". +
section Name of the field to retrieve. Again, this should be one or +more words separated by dots. DEMO uses "Pen.shade", +"Pen.colour" and "Pen.size". +
buffer Address of the buffer to which the information will be written. +
buflen Size of buffer, including the terminating 0. +
options Current user (0) or all users (1). Use 0 if possible although +multiple user profiles is not yet supported. + +
+ +
Ergebnis:  0 = Property read successfully +
 1 = Property was not found +
-1 = File I/O error +
-2 = Not enough memory +
  +
Verfügbar: This call is a compile-time option in recent FreeGEM versions. +To check for this feature, use appl_init(xbuf) and check that bit 1 of +xbuf.abilities is set (ABLE_PROP). +
  +
Gruppe: Eigenschaft-Funktionen +
  +
Querverweis: Binding   prop_del   prop_put +
  + +
+ +

8.20.2.1 Bindings für prop_get

+ + + + + + + + + +
C: int16_t prop_get ( int8_t *program, int8_t *section, int8_t +*buffer, int16_t buflen, int16_t options ); +
  +
Umsetzung: +
  +
int16_t prop_get (int8_t *program, int8_t *section, int8_t *buffer,
+                  int16_t buflen, int16_t options )
+{
+   int_in[0]  = options;
+   int_in[1]  = buflen;
+   addr_in[0] = program;
+   addr_in[1] = section;
+   addr_in[2] = buffer;
+
+   return ( crys_if(1010) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]1010 # Opcode der Funktion
control+2control[1]2 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]3 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]options
int_in+2int_in[1]buflen
addr_inaddr_in[0]program
addr_in+4addr_in[1]section
addr_in+8addr_in[2]buffer
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.20.3 prop_gui_get

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »GUI options get« - Gets the value of a GUI option. +
  +
AES-Nummer: 1013 +
  +
Deklaration: int16_t prop_gui_get ( int16_t option ); +
  +
Beschreibung: The call prop_gui_get returns the value of the given option, +zero if the option is out of range. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + +
option Bedeutung +
    +
0 Count of available options (currently returns 5; valid values +are 0-4). +
1 3D objects have square corners (0); otherwise rounded corners. +
2 Window frames follow GEM/2 style (0); otherwise GEM/5 +style. +
3 GEM emulation mode: +
+
+ + + + + + + + + + + + + + + +
0-GEM/1.
1-Atari GEM
2-FreeGEM
+
+ +
4 Menu flags: +
+
+ + + + + + + + + + +
Bit 0-Name of "Desk" menu is the current program name (0) or "Desk" (1)
Bit 1-"Desk" menu is on the right (0) or on the left (1)
+
+ + +
+ +
Ergebnis: Value of the requested option, or 0 if option is out of range. +
  +
Verfügbar: This call is a compile-time option in recent FreeGEM versions. +To check for this feature, use appl_init(xbuf) and check that bit 5 of +xbuf.abilities is set (ABLE_PROP2). +
  +
Gruppe: Eigenschaft-Funktionen +
  +
Querverweis: Binding   prop_gui_set +
  + +
+ +

8.20.3.1 Bindings für prop_gui_get

+ + + + + + + + + +
C: int16_t prop_gui_get ( int16_t option ); +
  +
Umsetzung: +
  +
int16_t prop_gui_get ( int16_t option )
+{
+   int_in[0]  = option;
+
+   return ( crys_if(1013) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]1013 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]option
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.20.4 prop_gui_set

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »GUI options set« - Sets the value of a GUI option. +
  +
AES-Nummer: 1014 +
  +
Deklaration: int16_t prop_gui_set ( int16_t option, int16_t value ); +
  +
Beschreibung: The call prop_gui_set changes the given option. The following +apply: +
  + + + + + + + + + + + + + + + + + + + + + +
option Bedeutung +
    +
0 Cannot be set. Return 0. +
1 3D objects: set square corners (0); otherwise rounded corners. +
2 Window frames: set GEM/2 style (0); otherwise GEM/5 style. +Takes effect when a new program is loaded. +
3 Set the GEM emulation mode: +
+
+ + + + + + + + + + + + + + + +
0-GEM/1
1-Atari GEM
2-FreeGEM
+
+ +
Currently, FreeGEM supports only modes 0 and 2 (they are the +same). The variable is set to 0 if the desired mode is not available, +or to the requested mode if it is available. +
4 Set menu flags: +
+
+ + + + + + + + + + +
Bit 0-Name of "Desk" menu is the current program name (0) or "Desk" (1)
Bit 1-"Desk" menu is on the right (0) or on the left (1)
+
+ + +
+ +
Ergebnis: Returns the value used, which may not be the same as the +requested value. +
  +
Verfügbar: This call is a compile-time option in recent FreeGEM versions. +To check for this feature, use appl_init(xbuf) and check that bit 5 of +xbuf.abilities is set (ABLE_PROP2). +
  +
Gruppe: Eigenschaft-Funktionen +
  +
Querverweis: Binding   prop_gui_get +
  + +
+ +

8.20.4.1 Bindings für prop_gui_set

+ + + + + + + + + +
C: int16_t prop_gui_set ( int16_t option, int16_t value ); +
  +
Umsetzung: +
  +
int16_t prop_gui_set ( int16_t option, int16_t value )
+{
+   int_in[0]  = option;
+   int_in[1]  = value;
+
+   return ( crys_if(1014) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]1014 # Opcode der Funktion
control+2control[1]2 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]option
int_in+2int_in[1]value
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.20.5 prop_put

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Property put« - Write setting to the GEM configuration +file. +
  +
AES-Nummer: 1011 +
  +
Deklaration: int16_t prop_put ( int8_t *program, int8_t *section, int8_t +*buffer, int16_t options ); +
  +
Beschreibung: The call prop_put serves for writing settings to the global +settings file of the AES. The following apply: +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
program Name that identifies the program. It should be formed of one or +more words separated by dots - for example, the DEMO sample uses +"PTK.DEMO". Program names starting with "GEM." +should be avoided to avoid a conflict with GEM itself. +
section Name of the field to store. Again, this should be one or more +words separated by dots. DEMO uses "Pen.shade", +"Pen.colour" and "Pen.size". +
buffer Address of the buffer containing the information to write +(NULL-terminated, without carriage returns or linefeeds). +
options Current user (0) or all users (1). Use 0 if possible although +multiple user profiles is not yet supported. + +
+ +
Hinweis: prop_get will remove any leading spaces from +returned values; so to write a string value that may start with +spaces, quotation marks must be added before calling prop_put and the +quotation marks should be removed after the prop_get. +
  +
Ergebnis:  0 = Property write successfully +
-1 = File I/O error +
-2 = Not enough memory +
  +
Verfügbar: This call is a compile-time option in recent FreeGEM versions. +To check for this feature, use appl_init(xbuf) and check that bit 1 of +xbuf.abilities is set (ABLE_PROP). +
  +
Gruppe: Eigenschaft-Funktionen +
  +
Querverweis: Binding   prop_del   prop_get +
  + +
+ +

8.20.5.1 Bindings für prop_put

+ + + + + + + + + +
C: int16_t prop_put ( int8_t *program, int8_t *section, int8_t +*buffer, int16_t options ); +
  +
Umsetzung: +
  +
int16_t prop_put (int8_t *program, int8_t *section, int8_t *buffer,
+                  int16_t options )
+{
+   int_in[0]  = options;
+   addr_in[0] = program;
+   addr_in[1] = section;
+   addr_in[2] = buffer;
+
+   return ( crys_if(1011) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]1011 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]3 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]options
addr_inaddr_in[0]program
addr_in+4addr_in[1]section
addr_in+8addr_in[2]buffer
int_outint_out[0]Return-Wert
+
+ + +
+ +
+ +Home +AESAES +ProzessverwaltungProzessverwaltung +ResourcefunktionenResourcefunktionen + + diff --git a/de/proto_av.html b/de/proto_av.html new file mode 100644 index 000000000..093021ee2 --- /dev/null +++ b/de/proto_av.html @@ -0,0 +1,2795 @@ + + + + + +Die Anleitung zum TOS: AV-Protokoll + + + + + + + + + +Home +ProtokolleProtokolle +ProtokolleProtokolle +BubbleGEMBubbleGEM + +
+ +

15.1 AV-Protokoll

+ + +

Das AV-Protokoll (Accessory-Venus) wurde von Stefan +Eissing entwickelt und zuerst im alternativen Desktop +Gemini eingesetzt. Mittlerweile wird dieses Protokoll jedoch +von vielen weiteren Shells (Ease, MagXDesk, Thing, ...) unterstützt. +Dieser Abschnitt beschreibt die Version des Protokolls aus der +Gemini-Distribution vom 29. Januar 1995 (Gemini 1.a). +

+

Die Kommunikation zwischen zwei Prozessen erfolgt beim +AV-Protokoll über den Austausch von (erweiterten) AES-Nachrichten, die sich +einer der folgenden Kategorien zuteilen lassen: +

+ + +

Achtung: An dieser Stelle sei darauf hingewiesen, daß +im Hinblick auf zukünftige Betriebssystem-Versionen zur Kommunikation +zwischen verschiedenen Programmen benutzte oder über Zeiger +zugewiesene Speicherbereiche global sein müssen (Mxalloc-Funktion mit +Global-Flag). Andernfalls wird es beim Einsatz auf Rechnern mit PMMU +(z.B. Atari-TT oder Falcon) zu Speicherschutzverletzungen kommen. +

+

Sollten in Nachrichten Pfade oder Dateinamen vorkommen, so muß immer +der absolute Pfad angegeben werden (also mit Laufwerk) und die +Laufwerksbuchstaben müssen Großbuchstaben sein. Pfade +sollten immer mit einem Backslash enden! +

+

Mit AV_PROTOKOLL kann jede Applikation nachfragen, welche Nachrichten +verstanden werden (nicht alle Shells unterstützen das vollständige +Protokoll). Es wäre schön, wenn auch andere Programme auf dieses +Protokoll reagieren würden. Zumindest AV_SENDKEY ist sicher leicht zu +implementieren und ist die einzige Methode, wie über Nachrichten +Tastaturdrücke simuliert werden können. +

+

Unter normalem TOS fragt dazu ein Accessorie, wenn es eine +AC_CLOSE-Nachricht vom AES erhalten hat, die Applikation (mit ID) 0 +per AV_PROTOKOLL ob sie etwas davon versteht. In einer Multitasking-Umgebung +(MultiTOS, MiNT/N.AES oder MagiC) muß aber das Programm nicht mehr +die ID 0 haben, zudem kommt es (fast) nicht mehr zu AC_CLOSE-Nachrichten. +Außerdem können nicht nur Accessories, sondern auch normale +Programme mit dem AV-Server kommunizieren wollen. Was tun? +

+

Wenn es mehr als eine Hauptapplikation geben kann, dann sollte +das Programm bzw. Accessory versuchen, mit GEMINI Kontakt aufzunehmen. +Die ID kann ja mit appl_find ermittelt werden. Scheitert dies, so kann +noch nach AVSERVER oder dem Inhalt der (AES)-Environmentvariable +AVSERVER gesucht werden. Besonders die letzte Möglichkeit erlaubt +eine leichte Konfiguration von außen. Die neuen Versionen der Library +VAFUNC von Stephan Gerle (in gutsortierten Mailboxen +erhältlich) verfahren fast genauso. +

+

Querverweis: Nachrichten Drag&Drop-Protokoll OLGA-Protokoll +

+

15.1.1 Quoting im AV-Protokoll

+ +

Mit Quoting ist im AV-Protkoll gemeint, daß Dateinamen optional +mit einfachen Anführungszeichen 'name' versehen werden können. Dies +ist aber nur erlaubt, wenn beide Parteien (Server und Client) sich +darüber einig sind, d.h. es verstehen können. +

+

Wie geht das also vor sich? Angenommen der Server schickt an +eine Applikation einen Dateinamen, der ein Leerzeichen enthält. Eine +Applikation, die Quoting nicht kann, wird statt einem +zwei Dateinamen erkennen, da normalerweise Leerzeichen +Dateinamen trennen. Versteht die Applikation aber Quoting (Bit 4 in +seinem Protokollstatus), so wird der Server den Dateinamen mit '' +umgeben und die Applikation erkennt, daß das Leerzeichen zum +Dateinamen gehört. Gleiches gilt natürlich auch für Dateinamen, die +von einer Applikation an einen Server geschickt werden. +

+

Die Frage bleibt, wie man denn nun einfache Anführungszeichen +überträgt. Nun, solche Zeichen, die zum Dateinamen gehören, werden +einfach verdoppelt. Aus Zorro's Hypertext wird für die Übertragung +'Zorro''s Hypertext'. In diesen Fällen wird also die gleiche Methode +wie beim Drag&Drop-Protokoll eingesetzt. +

+

Querverweis: +
AV_PROTOKOLL   VA_ACC_QUOTING(a)   VA_SERVER_QUOTING(a)   +VA_PROTOSTATUS   Drag&Drop-Protokoll +

+

15.1.2 AV-Funktionen

+

Diese Nachrichten werden von einer Applikation an Gemini bzw. +einen vorhandenen AV-Server geschickt. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AV_ACCWINDCLOSED Applikation hat ein Fenster geschlossen. +
AV_ACCWINDOPEN Applikation hat ein Fenster geöffnet. +
AV_ASKCONFONT Ermitteln des Zeichensatzes der Console. +
AV_ASKFILEFONT Ermitteln des Zeichensatzes für Dateien. +
AV_ASKOBJECT Ermitteln des derzeit selektierten Objektes. +
AV_COPY_DRAGGED Informieren über eine Kopier-Aktion. +
AV_COPYFILE Dateien bzw. Ordner kopieren. +
AV_DELFILE Dateien bzw. Ordner löschen. +
AV_DRAG_ON_WINDOW Informieren über verschobene Objekte. +
AV_EXIT Aus dem AV-Protokoll ausklinken. +
AV_FILEINFO Datei- bzw. Ordnerinformation anzeigen. +
AV_GETSTATUS Aktuellen Status ermitteln. +
AV_OPENCONSOLE Öffnet das Console-Fenster. +
AV_OPENWIND Öffnet ein Datei-Fenster. +
AV_PATH_UPDATE Inhalt eines Verzeichnisses wurde geändert. +
AV_PROTOKOLL Informieren über unterstützte Nachrichten. +
AV_SENDCLICK Maus-Ereignis senden. +
AV_SENDKEY Tastatur-Ereignis senden. +
AV_SETWINDPOS Position für Verzeichnisfenster festlegen. +
AV_STARTED Antwort auf eine VA_START-Nachricht. +
AV_STARTPROG Starten einer Applikation bzw. Datei. +
AV_STATUS Aktuellen Status setzen. +
AV_VIEW Viewer für einen bestimmten Dateityp laden. +
AV_WHAT_IZIT Information über Position auf dem Bildschirm. +
AV_XWIND Öffnet ein Datei-Fenster. + +
+ +

Querverweis: VA-Funktionen   Nachrichten +

+

15.1.2.1 AV_ACCWINDCLOSED

+ + + + + + + + + + + + + + + +
Name: »AV_ACCWINDCLOSED« +
  +
Nummer: 0x4726 +
  +
Beschreibung: Eine Applikation teilt dem AV-Server mit, daß ein Fenster +geschlossen wurde. Dies braucht die Applikation nur in dem Fall zu +tun, wenn sie selbst das Fenster schließt. +
  +

+
+ + + + + + + + +
ParameterBedeutung
Word 3AES-Handle des Fensters
+
+ +
Gruppe: AV-Funktionen +
  +
Querverweis: AV_ACCWINDOPEN   AV-Protokoll +
  + +
+ +

15.1.2.2 AV_ACCWINDOPEN

+ + + + + + + + + + + + + + + +
Name: »AV_ACCWINDOPEN« +
  +
Nummer: 0x4724 +
  +
Beschreibung: Mit dieser Nachricht kann eine Applikation dem AV-Server +mitteilen, daß sie ein Fenster geöffnet hat. +
  +

+
+ + + + + + + + +
ParameterBedeutung
Word 3AES-Handle des geöffneten Fensters
+
+ +
Gruppe: AV-Funktionen +
  +
Querverweis: AV_ACCWINDCLOSED   AV-Protokoll +
  + +
+ +

15.1.2.3 AV_ASKCONFONT

+ + + + + + + + + + + + + + + +
Name: »AV_ASKCONFONT« +
  +
Nummer: 0x4714 +
  +
Beschreibung: Mit dieser Nachricht fragt eine Applikation den AV-Server nach +dem eingestellten Zeichensatz für das Console-Fenster. +
  +
Gruppe: AV-Funktionen +
  +
Querverweis: AV_ASKFILEFONT   VA_CONFONT   VA_FILEFONT   AV-Protokoll +
  + +
+ +

15.1.2.4 AV_ASKFILEFONT

+ + + + + + + + + + + + + + + +
Name: »AV_ASKFILEFONT« +
  +
Nummer: 0x4712 +
  +
Beschreibung: Mit dieser Nachricht fragt eine Applikation den AV-Server nach +dem eingestellten Zeichensatz für Dateinamen. +
  +
Gruppe: AV-Funktionen +
  +
Querverweis: AV_ASKCONFONT   VA_CONFONT   VA_FILEFONT   AV-Protokoll +
  + +
+ +

15.1.2.5 AV_ASKOBJECT

+ + + + + + + + + + + + + + + +
Name: »AV_ASKOBJECT« +
  +
Nummer: 0x4716 +
  +
Beschreibung: Mit dieser Nachricht fragt eine Applikation den AV-Server nach +dem derzeit selektierten Objekt. Es wird der Name des derzeit +selektierten Objektes zurückgegeben; ist kein Objekt selektiert, so +ist der String leer. +
  +
Falls mehrere Objekte selektiert sind, so sind ihre Namen durch +Leerzeichen getrennt. +
  +
Gruppe: AV-Funktionen +
  +
Querverweis: VA_OBJECT   AV-Protokoll +
  + +
+ +

15.1.2.6 AV_COPY_DRAGGED

+ + + + + + + + + + + + + + + +
Name: »AV_COPY_DRAGGED« +
  +
Nummer: 0x4728 +
  +
Beschreibung: Über diese Nachricht teilt eine Applikation dem AV-Server mit, +daß die Objekte, die auf sein Fenster gezogen wurden, zu kopieren +sind. Dies kann z.B. nach dem Ziehen von Objekten auf das +TreeView-Fenster erwünscht sein. +
  +

+
+ + + + + + + + + + + + + + + + +
ParameterBedeutung
Word 3Status der Tastatur (Alt,Control,Shift)
Word 4+5Zeiger auf einen String, der den Namen des Zielobjektes enthält.
 Achtung: Dies muss ein Pfad sein.
+
+ +
Diese Nachricht ist nur als Antwort auf die Mitteilung VA_DRAGACCWIND +gedacht. +
  +
Gruppe: AV-Funktionen +
  +
Querverweis: VA_DRAGACCWIND   AV-Protokoll +
  + +
+ +

15.1.2.7 AV_COPYFILE

+ + + + + + + + + + + + + + + +
Name: »AV_COPYFILE« +
  +
Nummer: 0x4755 +
  +
Beschreibung: Dieser Befehl weist den AV-Server an, bestimmte Dateien oder +Ordner zu kopieren bzw. zu verschieben. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
Word 3+4Zeiger auf Quelldateien/Ordner
Word 5+6Zeiger auf den Zielordner
Word 7Verschiedene Flags
 Bit 0 = Originale löschen
 Bit 1 = Kopien umbenennen
 Bit 2 = Ziel einfach überschreiben
 Bit 3 = Nur symbolische Links der Quellen erzeugen
   = (Bit 0 ist dann bedeutungslos)
 Bit 4-15 = reserviert, immer 0
+
+ +
Mehrere Dateien müssen durch Leerzeichen voneinander getrennt, +und Ordner stets mit abschließendem '\' angegeben werden. +
  +
Gruppe: AV-Funktionen +
  +
Querverweis: VA_FILECOPIED   AV-Protokoll +
  + +
+ +

15.1.2.8 AV_DELFILE

+ + + + + + + + + + + + + + + +
Name: »AV_DELFILE« +
  +
Nummer: 0x4757 +
  +
Beschreibung: Dieser Befehl weist den AV-Server an, bestimmte Dateien bzw. +Ordner zu löschen. +
  +

+
+ + + + + + + + + + + + +
ParameterBedeutung
Word 3+4Zeiger auf die zu löschenden Dateien bzw. Ordner
Word 5-7reserviert (immer 0)
+
+ +
Mehrere Dateien bzw. Ordner müssen stets durch Leerzeichen +getrennt, und Ordner immer mit abschließendem '\' angegeben werden. +
  +
Gruppe: AV-Funktionen +
  +
Querverweis: VA_FILEDELETED   AV-Protokoll +
  + +
+ +

15.1.2.9 AV_DRAG_ON_WINDOW

+ + + + + + + + + + + + + + + +
Name: »AV_DRAG_ON_WINDOW« +
  +
Nummer: 0x4734 +
  +
Beschreibung: Eine Applikation teilt dem AV-Server mit, daß Objekte auf +eines seiner mittels AV_WHATIZIT erfragten Fenster gezogen worden +sind. +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
Word 3x-Position, wohin die Maus gezogen wurde
Word 4y-Position, wohin die Maus gezogen wurde
Word 5Status der Tastatur (Alt,Control,Shift)
Word 6+7Zeiger auf einen String, der die Namen der Objekte enthält.
+
+ +
Die Namen sind Namen von Dateien, Ordnern oder Laufwerken, +jeweils durch ein Leerzeichen getrennt. Namen von Ordnern oder +Laufwerken enden mit einem Backslash. +
  +
Gruppe: AV-Funktionen +
  +
Querverweis: VA_DRAG_COMPLETE   VA_DRAGACCWIND   AV-Protokoll +
  + +
+ +

15.1.2.10 AV_EXIT

+ + + + + + + + + + + + + + + +
Name: »AV_EXIT« +
  +
Nummer: 0x4736 +
  +
Beschreibung: Eine Applikation teilt dem AV-Server mit, daß sie nicht mehr +am Protokoll teilnimmt. +
  +

+
+ + + + + + + + +
ParameterBedeutung
Word 3AES-ID der Applikation
+
+ +
Das Absetzen dieser Nachricht sollte auf keinen Fall vergessen +werden! +
  +
Gruppe: AV-Funktionen +
  +
Querverweis: appl_init   AV-Protokoll +
  + +
+ +

15.1.2.11 AV_FILEINFO

+ + + + + + + + + + + + + + + +
Name: »AV_FILEINFO« +
  +
Nummer: 0x4753 +
  +
Beschreibung: Mit diesem Befehl wird der AV-Server aufgefordert, einen +Informations-Dialog für eine bestimmte Datei bzw. einen Ordner +anzuzeigen. +
  +

+
+ + + + + + + + + + + + +
ParameterBedeutung
Word 3+4Zeiger auf Datei bzw. Ordnernamen (ggfs. durch Leerzeichen getrennt)
Word 5-7reserviert (immer 0)
+
+ +
Mehrere Ordner bzw. Dateien werden durch Leerzeichen getrennt. +Ordnernamen müssen mit abschließendem '\' übergeben werden. +
  +
Gruppe: AV-Funktionen +
  +
Querverweis: VA_FILECHANGED   AV-Protokoll +
  + +
+ +

15.1.2.12 AV_GETSTATUS

+ + + + + + + + + + + + + + + +
Name: »AV_GETSTATUS« +
  +
Nummer: 0x4703 +
  +
Beschreibung: Eine Applikation erfragt beim AV-Server den aktuellen Status, +den es diesem per AV_STATUS einmal gegeben hat. +
  +
Gruppe: AV-Funktionen +
  +
Querverweis: AV_STATUS   AV-Protokoll +
  + +
+ +

15.1.2.13 AV_OPENCONSOLE

+ + + + + + + + + + + + + + + +
Name: »AV_OPENCONSOLE« +
  +
Nummer: 0x4718 +
  +
Beschreibung: Eine Applikation fordert den AV-Server auf, das Console-Fenster +zu öffnen. Ist dieses bereits offen, so wird es nach vorne gebracht. +
  +
Diese Aktion ist vor allem dann sinnvoll, wenn eine Applikation +ein TOS-Programm mittels der system-Funktion starten möchte. +
  +
Achtung: GEM-Programme dürfen von einer Applikation +auf keinen Fall per system gestartet werden. Ferner sollte +diese Nachricht nur auf ausdrücklichen Wunsch des Benutzers +eingesetzt werden, da sie ansonsten schnell zur Verwirrung führen +kann. +
  +
Diese Nachricht steht z.Zt. nur in Gemini zur Verfügung. +
  +
Gruppe: AV-Funktionen +
  +
Querverweis: AV_OPENWIND   AV_XWIND   VA_CONSOLEOPEN   VA_XOPEN   +VA_WINDOPEN   AV_STARTPROG +
  + +
+ +

15.1.2.14 AV_OPENWIND

+ + + + + + + + + + + + + + + +
Name: »AV_OPENWIND« +
  +
Nummer: 0x4720 +
  +
Beschreibung: Eine Applikation fordert den AV-Server auf, ein Datei-Fenster +zu öffnen. +
  +

+
+ + + + + + + + + + + + +
ParameterBedeutung
Word 3+4Zeiger auf den Pfad des Fensters
Word 5+6Zeiger auf Wildcard der darzustellenden Daten
+
+ +
Die Nachricht sollte nur dann eingesetzt werden, wenn die +Ursache für den Benutzer klar ersichtlich ist. +
  +
Gruppe: AV-Funktionen +
  +
Querverweis: AV_OPENCONSOLE   AV_XWIND   VA_CONSOLEOPEN   VA_WINDOPEN   +VA_XOPEN +
  + +
+ +

15.1.2.15 AV_PATH_UPDATE

+ + + + + + + + + + + + + + + +
Name: »AV_PATH_UPDATE« +
  +
Nummer: 0x4730 +
  +
Beschreibung: Eine Applikation teilt dem AV-Server mit, daß sich der Inhalt +eines Verzeichnisses geändert hat. Dieses kann dann neu eingelesen +bzw. dargestellt werden. +
  +

+
+ + + + + + + + +
ParameterBedeutung
Word 3+4Zeiger auf den absoluten Pfad
+
+ +
In Gemini wirkt dies auch auf die Unterverzeichnisse. Ein Update +von 'C:\' sorgt also dafür, daß alles, was mit Laufwerk C:\ zu tun +hat, aktualisiert wird. +
  +
Gruppe: AV-Funktionen +
  +
Querverweis: AV_OPENWIND   AV_XWIND   AV-Protokoll +
  + +
+ +

15.1.2.16 AV_PROTOKOLL

+ + + + + + + + + + + + + + + +
Name: »AV_PROTOKOLL« +
  +
Nummer: 0x4700 +
  +
Beschreibung: Mit dieser Nachricht sollte bei anderen Applikationen und dem +AV-Server nachgefragt werden, ob und welche Nachrichten verstanden +werden. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
Word 3Bit 0 = VA_SETSTATUS
 Bit 1 = VA_START
 Bit 2 = AV_STARTED
 Bit 3 = VA_FONTCHANGED
 Bit 4 = Quoting von Dateinamen wird verstanden und benutzt
 Bit 5 = VA_PATH_UPDATE
 Bit 6-15 = reserviert, immer 0
Word 4+5reserviert, immer 0
Word 6+7Zeiger auf den Programm-Namen wie er
 auch bei appl_find übergeben
 werden muß (8 Zeichen lang und nullterminiert).
+
+ +
Gruppe: AV-Funktionen +
  +
Querverweis: AV_STARTED   VA_FONTCHANGED   VA_SETSTATUS   VA_START +
  + +
+ +

15.1.2.17 AV_SENDCLICK

+ + + + + + + + + + + + + + + +
Name: »AV_SENDCLICK« +
  +
Nummer: 0x4709 +
  +
Beschreibung: Eine Applikation schickt dem AV-Server einen Maus-Event. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
Word 3ev_mmox
Word 4ev_mmoy
Word 5ev_mmobutton
Word 6ev_mmokstate
Word 7ev_mbreturn
+
+ +
Gruppe: AV-Funktionen +
  +
Querverweis: evnt_button   evnt_multi +
  + +
+ +

15.1.2.18 AV_SENDKEY

+ + + + + + + + + + + + + + + +
Name: »AV_SENDKEY« +
  +
Nummer: 0x4710 +
  +
Beschreibung: Eine Applikation schickt dem AV-Server einen Tastatur-Event, +den sie möglicherweise selbst nicht versteht. +
  +

+
+ + + + + + + + + + + + +
ParameterBedeutung
Word 3Status der Tastatur (ev_mmokstate)
Word 4Scancode der Taste (ev_mkreturn)
+
+ +
Als inoffizielle Erweiterung ("CodeAlpha") existiert +ein Konzept, mit dem auch ASCII Zeichen übertragen werden können, zu +denen kein Scancode existiert. Hierzu wird als Scancode 0, als ASCII +Wert der gewünschte und in msg[5] der Wert $5048 übergeben, +letzteres um anzuzeigen, daß msg[4] tatsächlich gültig ist und +keine Umrechnung über Scancode-Tabellen erforderlich ist. +
  +
Diese Nachricht sollte nach Möglichkeit immer unterstützt +werden, da mit ihrer Hilfe u.a. ein applikationsübergreifendes +Wechseln der Fenster realisiert werden kann. +
  +
Gruppe: AV-Funktionen +
  +
Querverweis: evnt_keybd   evnt_multi   Scan-Code Tabelle +
  + +
+ +

15.1.2.19 AV_SETWINDPOS

+ + + + + + + + + + + + + + + +
Name: »AV_SETWINDPOS« +
  +
Nummer: 0x4759 +
  +
Beschreibung: Mit diesem Befehl kann ein Client angeben, an welcher Position +und mit welcher Größe das nächste Verzeichnisfenster vom AV-Server +geöffnet werden soll. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
Word 3x-Position
Word 4y-Position
Word 5Breite
Word 6Höhe des Fensters
Word 7reserviert (immer 0)
+
+ +
Bei den Werten in Word-3 und Word-4 handelt es sich um +absolute Koordinaten. Wird durch AV_XWIND kein neues Fenster +geöffnet (sondern nur ein bereits geöffnetes Fenster getoppt), so +hat dieser Befehl keine Wirkung. +
  +
Gruppe: AV-Funktionen +
  +
Querverweis: AV_OPENWIND   AV_XWIND +
  + +
+ +

15.1.2.20 AV_STARTED

+ + + + + + + + + + + + + + + +
Name: »AV_STARTED« +
  +
Nummer: 0x4738 +
  +
Beschreibung: Eine Applikation teilt dem AV-Server mit, daß es die +VA_START-Nachricht verstanden hat. Der Server kann daraufhin den +Speicher des Strings, der an die Nachricht gehängt war, freigeben. +
  +

+
+ + + + + + + + + + + + +
ParameterBedeutung
Word 3+4Zeiger auf eine Kommandozeile, in der Pfad oder
 Dateinamen stehen können, und der auch NULL sein darf.
+
+ +
Um zu erkennen, um welche VA_START-Nachricht es sich handelt, +werden die Werte von VA_START zurückgeliefert. +
  +
Gruppe: AV-Funktionen +
  +
Querverweis: VA_START   AV-Protokoll +
  + +
+ +

15.1.2.21 AV_STARTPROG

+ + + + + + + + + + + + + + + +
Name: »AV_STARTPROG« +
  +
Nummer: 0x4722 +
  +
Beschreibung: Eine Applikation fordert den AV-Server auf, ein Programm zu +starten. +
  +

+
+ + + + + + + + + + + + + + + + +
ParameterBedeutung
Word 3+4Zeiger auf den Programmnamen mit komplettem Pfad
Word 5+6Zeiger auf eine Kommandozeile (kann NULL sein)
Word 7beliebiges 16-Bit Wort, welches in VA_PROGSTART wieder zurückgeliefert wird.
+
+ +
In Gemini werden auch die angemeldeten Applikationen mit +berücksichtigt. Dadurch ist es möglich eine Datei anzugeben, für +die dann ein Programm gesucht wird. +
  +
Gruppe: AV-Funktionen +
  +
Querverweis: VA_PROGSTART   AV-Protokoll +
  + +
+ +

15.1.2.22 AV_STATUS

+ + + + + + + + + + + + + + + +
Name: »AV_STATUS« +
  +
Nummer: 0x4704 +
  +
Beschreibung: Eine Applikation teilt dem AV-Server seinen Status mit, der von +diesem gespeichert und später per AV_GETSTATUS wieder abgefragt werden +kann. +
  +

+
+ + + + + + + + + + + + + + + + +
ParameterBedeutung
Word 3+4Zeiger auf einen String der keine Steuerzeichen
 enthalten, und nicht länger als 256 Zeichen
 sein darf. Der Zeiger darf auch NULL sein.
+
+ +
Die Applikation muss sich vorher beim Server per AV_PROTOKOLL +angemeldet haben. +
  +
Gruppe: AV-Funktionen +
  +
Querverweis: AV_GETSTATUS   AV_PROTOKOLL   AV-Protokoll +
  + +
+ +

15.1.2.23 AV_VIEW

+ + + + + + + + + + + + + + + +
Name: »AV_VIEW« +
  +
Nummer: 0x4751 +
  +
Beschreibung: Mit diesem Befehl wird der AV-Server angewiesen, den Viewer +für eine bestimmte Datei aufzurufen. +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
Word 3+4Zeiger auf den Namen der anzuzeigenden Datei.
Word 50 = Startet den Viewer
 1 = Startet den Editor
Word 6-7reserviert (immer 0)
+
+ +
Es darf nur eine einzelne Datei angegeben werden; ist +kein entsprechender Viewer vorhanden, so erhält der Benutzer eine +Fehlermeldung. +
  +
Gruppe: AV-Funktionen +
  +
Querverweis: VA_VIEWED   AV-Protokoll +
  + +
+ +

15.1.2.24 AV_WHAT_IZIT

+ + + + + + + + + + + + + + + +
Name: »AV_WHAT_IZIT« +
  +
Nummer: 0x4732 +
  +
Beschreibung: Eine Applikation fragt beim AV-Server nach, was sich an einer +bestimmten Position auf dem Bildschirm befindet. +
  +

+
+ + + + + + + + + + + + +
ParameterBedeutung
Word 3x-Koordinate
Word 4y-Koordinate
+
+ +
Die Koordinaten sind normale Pixelkoordinaten mit Ursprung in +der linken oberen Bildschirmecke. +
  +
Gruppe: AV-Funktionen +
  +
Querverweis: VA_THAT_IZIT   AV-Protokoll +
  + +
+ +

15.1.2.25 AV_XWIND

+ + + + + + + + + + + + + + + +
Name: »AV_XWIND« +
  +
Nummer: 0x4740 +
  +
Beschreibung: Eine Applikation fordert den AV-Server auf, ein Datei-Fenster +zu öffnen. Es gilt: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
Word 3+4Zeiger auf den Pfad für das Fenster
Word 5+6Zeiger auf Wildcard als Filter für die Anzeige
Word 7Bitmaske
 0x0001 = Fenster evtl. toppen
 0x0002 = Wildcard soll nur selektieren
 0x0004 = Vorhandenes Fenster soll
          weiterverwendet werden.
 Alle anderen Bits müssen auf Null gesetzt werden.
+
+ +
Diese Nachricht sollte nur dann eingesetzt werden, wenn die +Ursache für den Benutzer klar ersichtlich ist. +
  +
Gruppe: AV-Funktionen +
  +
Querverweis: AV_OPENCONSOLE   AV_OPENWIND   VA_CONSOLEOPEN   VA_WINDOPEN   +VA_XOPEN   AV-Protokoll +
  + +
+ +

15.1.3 VA-Funktionen

+

Diese Nachrichten werden von einem vorhandenen AV-Server an eine +Applikation geschickt. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VA_ACC_QUOTING(a) Protokoll-Status auf Quoting testen. +
VA_CONFONT Zeichensatz der Console übermitteln. +
VA_CONSOLEOPEN Ermitteln, ob Console-Fenster geöffnet ist. +
VA_COPY_COMPLETE Antwort auf AV_COPY. +
VA_DRAGACCWIND Objekte wurden auf Appl.-Fenster gezogen. +
VA_DRAG_COMPLETE AV_DRAG_ON_WINDOW-Aktion ist beendet. +
VA_FILECHANGED Antwort auf AV_FILEINFO. +
VA_FILECOPIED Antwort auf AV_COPYFILE. +
VA_FILEDELETED Antwort auf AV_DELFILE. +
VA_FILEFONT Zeichensatz für Dateien übermitteln. +
VA_FONTCHANGED Ein eingestellter Zeichensatz wurde verändert. +
VA_OBJECT Liefert die Namen der selektierten Objekte. +
VA_PATH_UPDATE Inhalt eines Verzeichnisses wurde geändert. +
VA_PROGSTART Information, ob Programm gestartet werden konnte. +
VA_PROTOSTATUS Antwort auf AV_PROTOKOLL. +
VA_SERVER_QUOTING(a) Protokoll-Status auf Quoting testen. +
VA_SETSTATUS Status einer Applikation übermitteln. +
VA_START Eine Applikation wurde aktiviert. +
VA_THAT_IZIT Informiert über Objekt an Bildschirmposition. +
VA_VIEWED Antwort auf AV_VIEW. +
VA_WINDOPEN Gibt an, ob das Console-Fenster geöffnet ist. +
VA_XOPEN Gibt an, ob ein Fenster geöffnet werden konnte. + +
+ +

Querverweis: AV-Funktionen   Nachrichten +

+

15.1.3.1 VA_ACC_QUOTING(a)

+

Dies ist ein Test des Protokollstatus auf Quoting. In C läßt +sich der Test als Makro wie folgt realisieren: +

+
#define VA_ACC_QUOTING(a)   ((a) & 0x10)
+
+

15.1.3.2 VA_CONFONT

+ + + + + + + + + + + + + + + +
Name: »VA_CONFONT« +
  +
Nummer: 0x4715 +
  +
Beschreibung: Liefert den derzeit eingestellten Zeichensatz für das +Console-Fenster. Es gilt: +
  +

+
+ + + + + + + + + + + + +
ParameterBedeutung
Word 3Zeichensatznummer (ID)
Word 4Zeichensatzgröße (Points)
+
+ +
Gruppe: VA-Funktionen +
  +
Querverweis: AV_ASKCONFONT   AV_ASKFILEFONT   VA_FILEFONT +
  + +
+ +

15.1.3.3 VA_CONSOLEOPEN

+ + + + + + + + + + + + + + + +
Name: »VA_CONSOLEOPEN« +
  +
Nummer: 0x4719 +
  +
Beschreibung: Gibt zurück, ob das Console-Fenster nach vorne gebracht worden +ist. +
  +

+
+ + + + + + + + + + + + +
ParameterBedeutung
Word 3 0  = nein
 <>0 = ja
+
+ +
Gruppe: VA-Funktionen +
  +
Querverweis: AV_OPENCONSOLE   AV-Protokoll +
  + +
+ +

15.1.3.4 VA_COPY_COMPLETE

+ + + + + + + + + + + + + + + +
Name: »VA_COPY_COMPLETE« +
  +
Nummer: 0x4729 +
  +
Beschreibung: Diese Nachricht ist eine direkte Antwort auf AV_COPY_DRAGGED. +
  +

+
+ + + + + + + + +
ParameterBedeutung
Word 3Status des Kopierens
+
+ +
Ein Wert <> 0 gibt an, daß wirklich etwas kopiert oder +verschoben worden ist. Dies kann die Applikation evtl. zum Neuaufbau +eines Fensters nutzen. +
  +
Gruppe: VA-Funktionen +
  +
Querverweis: AV_COPY_DRAGGED   AV-Protokoll +
  + +
+ +

15.1.3.5 VA_DRAGACCWIND

+ + + + + + + + + + + + + + + +
Name: »VA_DRAGACCWIND« +
  +
Nummer: 0x4725 +
  +
Beschreibung: Der AV-Server teilt einer Applikation mit, daß Objekte auf +eines seiner mittels AV_ACCWINDOPEN angemeldeten Fenster gezogen +worden sind. +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
Word 3AES-Handle des Fensters
Word 4x-Position der Maus
Word 5y-Position der Maus
Word 6+7Zeiger auf einen String, der die Namen der Objekte enthält.
+
+ +
Gruppe: VA-Funktionen +
  +
Querverweis: AV_ACCWINDOPEN   AV_ACCWINDCLOSED   AV_DRAG_ON_WINDOW +
  + +
+ +

15.1.3.6 VA_DRAG_COMPLETE

+ + + + + + + + + + + + + + + +
Name: »VA_DRAG_COMPLETE« +
  +
Nummer: 0x4735 +
  +
Beschreibung: Der AV-Server teilt einer Applikation mit, daß die Aktion die +per AV_DRAG_ON_WINDOW ausgelöst wurde, beendet ist. +
  + + + + + + +
Parameter Bedeutung +
  +
Word 3 Status der Aktion +
  +
Ein Wert <> 0 bedeutet, daß wirklich etwas kopiert oder +verschoben wurde. Dies kann die Applikation evtl. zum Neuaufbau eines +Fensters nutzen. +
  + +
+ +
Der zurückgelieferte Wert entspricht dem, der auch bei +AV_COPY_COMPLETE zurück gegeben wird. +
  +
Gruppe: VA-Funktionen +
  +
Querverweis: AV_DRAG_ON_WINDOW   VA_DRAGACCWIND   AV-Protokoll +
  + +
+ +

15.1.3.7 VA_FILECHANGED

+ + + + + + + + + + + + + + + +
Name: »VA_FILECHANGED« +
  +
Nummer: 0x4754 +
  +
Beschreibung: Diese Nachricht wird vom AV-Server als Antwort auf eine +AV_FILEINFO-Message an den Client geschickt. +
  + + + + + + + + + +
Parameter Bedeutung +
  +
Word 3+4 Zeiger auf die Namen der Dateien bzw. Ordner die bei AV_FILEINFO +übergeben wurden. +
  +
Word 5-7 reserviert (immer 0) +
  + +
+ +
Beachtet werden sollte, daß der Benutzer die Dateinamen im +Dialog verändert haben könnte, und deshalb ggfs. der über die +Wörter 3+4 erreichbare String nicht mehr mit dem von AV_FILEINFO +übereinstimmt. +
  +
Gruppe: VA-Funktionen +
  +
Querverweis: AV_FILEINFO   AV-Protokoll +
  + +
+ +

15.1.3.8 VA_FILECOPIED

+ + + + + + + + + + + + + + + +
Name: »VA_FILECOPIED« +
  +
Nummer: 0x4756 +
  +
Beschreibung: Diese Nachricht wird vom AV-Server als Antwort auf eine +AV_COPYFILE-Message an den Client geschickt. +
  +

+
+ + + + + + + + + + + + + + + + +
ParameterBedeutung
Word 30 = Fehler
 1 = alles ok
Word 4-7reserviert (immer 0)
+
+ +
Gruppe: VA-Funktionen +
  +
Querverweis: AV_COPYFILE   AV-Protokoll +
  + +
+ +

15.1.3.9 VA_FILEDELETED

+ + + + + + + + + + + + + + + +
Name: »VA_FILEDELETED« +
  +
Nummer: 0x4758 +
  +
Beschreibung: Diese Nachricht wird vom AV-Server als Antwort auf eine +AV_DELFILE-Message an den Client geschickt. +
  +

+
+ + + + + + + + + + + + + + + + +
ParameterBedeutung
Word 30 = Fehler
 1 = alles ok
Word 4-7reserviert (immer 0)
+
+ +
Gruppe: VA-Funktionen +
  +
Querverweis: AV_DELFILE   AV-Protokoll +
  + +
+ +

15.1.3.10 VA_FILEFONT

+ + + + + + + + + + + + + + + +
Name: »VA_FILEFONT« +
  +
Nummer: 0x4713 +
  +
Beschreibung: Liefert den derzeit eingestellten Zeichensatz für ein +Dateifenster zurück. +
  +

+
+ + + + + + + + + + + + +
ParameterBedeutung
Word 3Zeichensatznummer (ID)
Word 4Zeichensatzgröße (Points)
+
+ +
Gruppe: VA-Funktionen +
  +
Querverweis: AV_ASKCONFONT   AV_ASKFILEFONT   VA_CONFONT +
  + +
+ +

15.1.3.11 VA_FONTCHANGED

+ + + + + + + + + + + + + + + +
Name: »VA_FONTCHANGED« +
  +
Nummer: 0x4739 +
  +
Beschreibung: Der AV-Server informiert eine Applikation darüber, daß sich +einer der eingestellten Zeichensätze verändert hat. +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
Word 3Zeichensatz für Dateifenster (ID)
Word 4Größe des Zeichensatzes (Points)
Word 5Zeichensatz für Console-Fenster (ID)
Word 6Größe des Zeichensatzes (Points)
+
+ +
Die Nachricht wird an alle Applikationen geschickt, die vorher +schon einmal einen Zeichensatz beim AV-Server erfragt haben. +
  +
Gruppe: VA-Funktionen +
  +
Querverweis: AV_ASKCONFONT   AV_ASKFILEFONT   VA_FILEFONT +
  + +
+ +

15.1.3.12 VA_OBJECT

+ + + + + + + + + + + + + + + +
Name: »VA_OBJECT« +
  +
Nummer: 0x4717 +
  +
Beschreibung: Liefert die Namen der derzeit selektierten Objekte. +
  +

+
+ + + + + + + + +
ParameterBedeutung
Word 3+4Zeiger auf eine Kommandozeile mit den Namen der selektierten Objekte.
+
+ +
Gruppe: VA-Funktionen +
  +
Querverweis: AV_ASKOBJECT   AV-Protokoll +
  + +
+ +

15.1.3.13 VA_PATH_UPDATE

+ + + + + + + + + + + + + + + +
Name: »VA_PATH_UPDATE« +
  +
Nummer: 0x4760 +
  +
Beschreibung: Mit dieser Nachricht teilt der AV-Server einem Client mit, daß +sich der Inhalt eines Verzeichnisses geändert hat. +
  +

+
+ + + + + + + + + + + + +
ParameterBedeutung
Word 3+4Zeiger auf das Verzeichnis
Word 5-7reserviert (immer 0)
+
+ +
Das angegebene Verzeichnis ist stets mit dem Zeichen '\' +abgeschlossen. Der Client muss zunächst per AV_PROTOKOLL anzeigen, +daß er diese Nachricht versteht, und beim Eintreffen derselben dann +alle betroffenen Unterverzeichnisse neu einlesen bzw. schließen. +
  +
Gruppe: VA-Funktionen +
  +
Querverweis: AV_PROTOKOLL   AV-Protokoll +
  + +
+ +

15.1.3.14 VA_PROGSTART

+ + + + + + + + + + + + + + + +
Name: »VA_PROGSTART« +
  +
Nummer: 0x4723 +
  +
Beschreibung: Der AV-Server informiert eine Applikation, ob ein angegebenes +Programm gestartet wurde. +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
Word 3 0  = nicht gestartet
 <>0 = gestartet
Word 4Returncode des Programms
Word 716-Bit Wort aus AV_STARTPROG
+
+ +
Im allgemeinen wird die Applikation im Fehlerfall sofort eine +Nachricht bekommen; falls das Programm aber gestartet wird, erhält +die Applikation diese Nachricht erst nach dem Start des Programms, da +die Routine, welche den Pexec ausführt, nicht mehr wissen kann, das +eine Applikation noch schnell eine Nachricht bekommen muss. Bei einem +GEM-Programm kann man den Erfolg auch an dem AC_CLOSE erkennen. +
  +
Die Fehlererkennung ist leider nicht optimal; ferner weist der +Rückgabewert nicht aus, ob das Programm fehlerfrei gelaufen ist. +
  +
Gruppe: VA-Funktionen +
  +
Querverweis: AV_STARTPROG   VA_START   AV-Protokoll +
  + +
+ +

15.1.3.15 VA_PROTOSTATUS

+ + + + + + + + + + + + + + + +
Name: »VA_PROTOSTATUS« +
  +
Nummer: 0x4701 +
  +
Beschreibung: Dem Sender von AV_PROTOKOLL wird mitgeteilt, daß der +Empfänger etwas von diesem Protokoll weiß. Die Worte 3-7 des +Nachrichtenpuffers enthalten die Information, welche Nachrichten +verstanden werden. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
WORD 3Bit 0 = AV_SENDKEY
 Bit 1  = AV_ASKFILEFONT
 Bit 2  = AV_ASKCONFONT, AV_OPENCONSOLE
 Bit 3  = AV_ASKOBJECT
 Bit 4  = AV_OPENWIND
 Bit 5  = AV_STARTPROG
 Bit 6  = AV_ACCWINDOPEN, AV_ACCWINDCLOSED
 Bit 7  = AV_STATUS, AV_GETSTATUS
 Bit 8  = AV_COPY_DRAGGED
 Bit 9  = AV_PATH_UPDATE, AV_WHAT_IZIT, AV_DRAG_ON_WINDOW
 Bit 10 = AV_EXIT
 Bit 11 = AV_XWIND
 Bit 12 = VA_FONTCHANGED
 Bit 13 = AV_STARTED
 Bit 14 = Quoting von Dateinamen wird
          verstanden und benutzt.
 Bit 15 = AV_FILEINFO
WORD 4Bit 0 = AV_COPYFILE
 Bit 1 = AV_DELFILE
 Bit 2 = AV_VIEW
 Bit 3 = AV_SETWINDPOS
 Bit 4 = erlaubt Anlegen symbolischer Links
     mit AV_COPYFILE
 Bit 5 = AV_SENDCLICK
Word 5reserviert
Word 6+7Zeiger auf den Programmnamen, wie er auch bei appl_find übergeben werden muss.
+
+ +
Gesetzte Bits signalisieren, daß eine Nachricht bzw. eine +Nachrichtengruppe verstanden wird. Alle nicht belegten Bits +(insbesondere in den Worten 4 und 5) sind für zukünftige Zwecke +reserviert, und sollten daher mit Null vorbesetzt werden. +
  +
Gruppe: VA-Funktionen +
  +
Querverweis: AV_PROTOKOLL   AV-Protokoll +
  + +
+ +

15.1.3.16 VA_SERVER_QUOTING(a)

+

Dies ist ein Test des Protokollstatus auf Quoting. In C läßt +sich der Test als Makro wie folgt realisieren: +

+
#define VA_SERVER_QUOTING(a)  ((a) & 0x40)
+
+

15.1.3.17 VA_SETSTATUS

+ + + + + + + + + + + + + + + +
Name: »VA_SETSTATUS« +
  +
Nummer: 0x4705 +
  +
Beschreibung: Der AV-Server teilt einer Applikation den abgespeicherten +Status bei Nachfrage durch AV_GETSTATUS mit. +
  +

+
+ + + + + + + + + + + + + + + + +
ParameterBedeutung
Word 3+4Zeiger auf einen String, der keine Steuerzeichen
 enthält. Ein NULL-Wert gibt an, daß kein Status
 gespeichert war.
+
+ +
Der gelieferte Status kann anschließend von der Applikation +gesetzt werden. +
  +
Gruppe: VA-Funktionen +
  +
Querverweis: AV_GETSTATUS   AV-Protokoll +
  + +
+ +

15.1.3.18 VA_START

+ + + + + + + + + + + + + + + +
Name: »VA_START« +
  +
Nummer: 0x4711 +
  +
Beschreibung: Diese Nachricht wird vom AV-Server zum Start einer Applikation +benötigt. Es gilt: +
  +

+
+ + + + + + + + + + + + +
ParameterBedeutung
Word 3+4Zeiger auf eine Kommandozeile, in welcher
 Pfade oder Dateinamen stehen, oder NULL.
+
+ +
Gruppe: VA-Funktionen +
  +
Querverweis: AV_STARTPROG   AV_STARTED   VA_PROGSTART +
  + +
+ +

15.1.3.19 VA_THAT_IZIT

+ + + + + + + + + + + + + + + +
Name: »VA_THAT_IZIT« +
  +
Nummer: 0x4733 +
  +
Beschreibung: Der AV-Server teilt einer Applikation auf Nachfrage mit, was +sich an einer bestimmten Position auf dem Bildschirm befindet. +
  + + + + + + + + + + +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
Word 3ID der zuständigen Applikation
Word 4Typ des Objektes
 VA_OB_UNKNOWN   (0) = unbekannt
 VA_OB_TRASHCAN  (1) = Papierkorb
 VA_OB_SHREDDER  (2) = Reißwolf
 VA_OB_CLIPBOARD (3) = Klemmbrett
 VA_OB_FILE      (4) = Datei
 VA_OB_FOLDER    (5) = Ordner
 VA_OB_DRIVE     (6) = Laufwerkssymbol
 VA_OB_WINDOW    (7) = Fenster
 VA_OB_NOTEPAD   (8) = Notizblock
 VA_OB_NOTE      (9) =  
Word 5+6Zeiger auf den Namen des Objektes, oder NULL.
+
+ +
Alle anderen Werte sind für zukünftige Zwecke reserviert. +
  +
Gruppe: VA-Funktionen +
  +
Querverweis: AV_WHAT_IZIT   AV-Protokoll +
  + +
+ +

15.1.3.20 VA_VIEWED

+ + + + + + + + + + + + + + + +
Name: »VA_VIEWED« +
  +
Nummer: 0x4752 +
  +
Beschreibung: Diese Nachricht wird vom AV-Server als Antwort auf eine +AV_VIEW-Message an den Client verschickt. +
  +

+
+ + + + + + + + + + + + + + + + +
ParameterBedeutung
Word 30 = Fehler
 1 = alles ok
Word 4-7reserviert (immer 0)
+
+ +
Mit Hilfe dieser Nachricht teilt der Server dem Client mit, ob +die gewünschte Datei angezeigt wird, oder nicht. Die Antwort wird +sofort und immer verschickt, falls ein Fehler aufgetreten ist; +anderenfalls erhält man die Antwort in einer Multitasking-Umgebung +sobald der Viewer aktiv ist (oder unter Single-TOS nach Beendigung des +Viewers) falls der Server nicht vorher beendet wurde (z.B. durch +Auslagerung vor dem Start des Viewers). +
  +
Gruppe: VA-Funktionen +
  +
Querverweis: AV_VIEW   AV-Protokoll +
  + +
+ +

15.1.3.21 VA_WINDOPEN

+ + + + + + + + + + + + + + + +
Name: »VA_WINDOPEN« +
  +
Nummer: 0x4721 +
  +
Beschreibung: Der AV-Server informiert eine Applikation darüber, ob das +Console-Fenster geöffnet werden konnte. +
  +
Gruppe: VA-Funktionen +
  +
Querverweis: AV_OPENCONSOLE   VA_CONSOLEOPEN   AV-Protokoll +
  + +
+ +

15.1.3.22 VA_XOPEN

+ + + + + + + + + + + + + + + +
Name: »VA_XOPEN« +
  +
Nummer: 0x4741 +
  +
Beschreibung: Der AV-Server informiert eine Applikation darüber, ob ein +angegebenes Fenster geöffnet werden konnte. +
  +

+
+ + + + + + + + + + + + +
ParameterBedeutung
Word 3 0  = nein
 <>0 = ja
+
+ +
Gruppe: VA-Funktionen +
  +
Querverweis: AV_OPENWIND   AV_XWIND   VA_WINDOPEN +
  + +
+ +
+ +Home +ProtokolleProtokolle +ProtokolleProtokolle +BubbleGEMBubbleGEM + + diff --git a/de/proto_bubblegem.html b/de/proto_bubblegem.html new file mode 100644 index 000000000..c81a5c5ea --- /dev/null +++ b/de/proto_bubblegem.html @@ -0,0 +1,425 @@ + + + + + +Die Anleitung zum TOS: BubbleGEM + + + + + + + + + +Home +ProtokolleProtokolle +AV-ProtokollAV-Protokoll +Drag&Drop-ProtokollDrag&Drop-Protokoll + +
+ +

15.2 BubbleGEM

+

+

Die Icons werden immer zahlreicher und bunter, doch so manches +mal verbirgt sich der Sinn - oder wozu war nochmal der Button da? +Fragen, die sich jeder stellt. +

+

Die Antwort: BubbleGEM. Mittels dieses kleinen Progrämmchens +kann jeder Programmierer die beliebte und umsatzfördernde +Sprechblasenhilfe einbauen und jeder Benutzer mehr über die +Arbeitsoberfläche erfahren. +

+ +
+

15.2.1 Aufruf von BubbleGEM

+

Grundsätzlich gibt es zwei Möglichkeiten, BubbleGEM aufzurufen. +In den direkt folgenden Abschnitten wird der Aufruf aus unmodalen +Dialogen, also aus Fensterdialogen, beschrieben, der am einfachsten +ist. Seit der Release 05 kann man BubbleGEM nun aber auch aus modalen +Dialogen aufrufen. +

+

Als modernes Programm sucht man vor jedem Bubble-Aufruf per +appl_find("BUBBLE ") die +AES-Applikations-Identifikationsnummer (kurz: bubble_id) von BubbleGEM. +Hat man die AES-ID erhalten, kann man die Nachricht BUBBLEGEM_SHOW +(hexadezimal: 0xBABB) an die ap_id ver- schicken und erhält +BUBBLEGEM_ACK (0xBABC) zurück. +

+

Wichtig ist, daß die übergebene nullterminierte Zeichenkette +maximal 255 Zeichen lang sein darf und daß sie global lesbar sein +muß. In Systemen mit Speicherschutz kommt es sonst zu +Schutzverletzungen, was die Professionalität Ihres Programms nicht +gerade unterstreichen würde. Daher unbedingt globalen Speicher +anfordern! +

+

Die Nachricht BUBBLEGEM_SHOW sollte bereits losgesandt werden, +wenn die rechte Maustaste heruntergedrückt wurde, nicht erst beim +Los- lassen! Mit x und y übergibt man die Mauskoordinaten, an deren +Stelle die Sprechblase dann gezeichnet wird. +

+

Ein Umbruch in der Blase wird von BubbleGEM automatisch +vorgenommen, wer trotzdem manuell eingreifen will, kann den +senkrechten Strich "|" dafür verwenden. Leerzeichen davor +oder dahinter sind nicht notwendig. +

+

Ein kleines Beispiel in C: +

+ +
#include <portab.h>
+
+/* BUBBLEGEM_SHOW - Nachricht:
+ * msg[0]   0xBABB
+ * msg[1]   ap_id
+ * msg[2]   0
+ * msg[3]   Maus X
+ * msg[4]   Maus Y
+ * msg[5/6] Pointer auf nullterminierte Zeichenkette im globalen
+ *          Speicher
+ * msg[7]   0
+ */
+
+...
+
+#define MGLOBAL     0x20
+
+#define BUBBLEGEM_REQUEST  0xBABA
+#define BUBBLEGEM_SHOW     0xBABB
+#define BUBBLEGEM_ACK      0xBABC
+#define BUBBLEGEM_ASKFONT  0xBABD
+#define BUBBLEGEM_FONT     0xBABE
+#define BUBBLEGEM_HIDE     0xBABF
+
+#define MagX_COOKIE     0x4D616758L
+#define MiNT_COOKIE     0x4D694E54L
+...
+
+WORD msg[8];
+WORD bubble_id;
+BYTE *bubble_text;
+
+/* Feststellen, ob Mxalloc() vorhanden ist, wenn ja,
+ *  dann Speicherschutz-Modus auf "Global" setzen
+ */
+if ((get_cookie (MagX_COOKIE, &val) == TRUE) ||
+   (get_cookie (MiNT_COOKIE, &val) == TRUE))
+{
+  bubble_text = (BYTE *) Mxalloc (256, 0 | MGLOBAL);
+}
+else
+  bubble_text = (BYTE *) Malloc (256);
+
+if (!bubble_text)   /* Pointer ungültig, kein Speicher da */
+  return;
+
+if (rechte_maustaste_ueber_button_gedrueckt)
+{
+  /* Puffer füllen */
+  strncpy(bubble_text, "Meine erste Sprechblasenhilfe.", 255);
+
+  bubble_id = appl_find("BUBBLE  ");
+
+  if (bubble_id >= 0)
+  {
+    msg[0] = BUBBLEGEM_SHOW;
+    msg[1] = ap_id;
+    msg[2] = 0;
+    msg[3] = x;
+    msg[4] = y;
+    msg[5] = (WORD)(((LONG) bubble_text >> 16)
+             & 0x0000ffff);
+    msg[6] = (WORD)((LONG) bubble_text & 0x0000ffff);
+    msg[7] = 0;
+    if (appl_write(bubble_id, 16, msg) == 0)
+    {
+      /* Fehler */
+    }
+  }
+}
+
+ +

Als Antwortnachricht erhält man BUBBLEGEM_ACK (0xBABC) mit dem +Pointer auf die Zeichenkette, deren Speicher man nun bei Bedarf +freigeben kann. Die Arrayelemente 2, 3, 4 und 7 sind ausgenullt. Beim +nichtmoda- len Aufruf kommt das BUBBLEGEM_ACK erst nach dem Schließen +der Blase! +

+
/* BUBBLEGEM_ACK (0xBABC)
+ *
+ * msg[0]   0xBABC
+ * msg[1]   ap_id
+ * msg[2]   0
+ * msg[3]   0
+ * msg[4]   0
+ * msg[5/6] Pointer aus BUBBLEGEM_SHOW
+ * msg[7]   Gleicher Wert wie msg[7] beim Senden von BUBBLEGEM_SHOW;
+ *          derzeit 0.
+ */
+
+/* kurzer Beispielcode */
+
+pointer = *(BYTE **) &msg[5];
+
+if (pointer)
+  Mfree(pointer);
+
+

Zu bedenken ist, daß man die Zeichenketten am besten extern +auslagert, damit Übersetzungen in andere Sprachen leichter fallen - +also am besten ins Resource-File oder eine separate ASCII-Datei damit. +

+

Wenn bei BUBBLEGEM_SHOW das Bit BGS7_MOUSE (0x0004) in msg[7] +gesetzt ist, werden die übergebenen Koordinaten nur zum Zeichnen +verwendet; BubbleGEM ermittelt dann die Mauskoordinaten, anhand derer +eine Bewegung der Maus erkannt wird (und die zum Schließen der Blase +führt), kurz vor der Anzeige der Blase automatisch neu. +

+

Der Aufruf aus modalen Dialogen (siehe auch die Aufrufroutine) +erfolgt wie bei den unmodalen, vorausgesetzt, daß der BGEM-Cookie +vorhanden ist. Man setzt im Gegensatz zum Aufruf aus unmodalen +Dialogen jedoch BGS7_USRHIDE (0x0001) in msg[7]. +

+ +

Außerdem muß nach der Mausauswertung durch die aufrufende +Applikation BUBBLEGEM_HIDE (0xbabf) an BubbleGEM geschickt werden. Die +Auswertung der Maus- und Tastenereignisse muß die Applikation beim +Aufruf aus modalen Dialogen selbst übernehmen. +

+

Auf Systemen ohne wind_update()-Testmodus werden evtl. doppelte +Hilfstexte angezeigt (direkt nacheinander). Dies ist derzeit leider +nicht anders realisierbar. +

+

15.2.2 Aufrufroutine

+

Hier eine allgemeine Routine zum Aufruf von BubbleGEM in +Pseudocode. +

+
bubblegem:=appl_find('BUBBLE  ');
+if bubblegem<0 then
+  begin
+    pfad:=GetEnv('BUBBLEGEM');
+    if length(pfad)>0 then
+      begin
+        { BubbleGEM nachstarten, ID in bubblegem merken }
+        if bubblegem>=0 then evnt_timer(500,0)
+      end
+  end;
+if bubblegem<0 then exit; { BubbleGEM nicht gefunden -> Abbruch}
+StrPCopy(bubblebuf,hilfetext);
+msg[0]:=BUBBLEGEM_SHOW;
+msg[1]:=apID;
+msg[2]:=0;
+msg[3]:=mx;
+msg[4]:=my;
+msg[5]:=integer(HiWord(bubblebuf));
+msg[6]:=integer(LoWord(bubblebuf));
+msg[7]:=0;
+if unmodaler_Aufruf then
+  begin
+    appl_write(bubblegem,16,@msg);
+    evnt_timer(100,0)
+  end
+else
+  begin
+    { Aufruf aus einem systemmodalen Dialog heraus: }
+    if not(GetCookie('BGEM',bgemcookie)) then Bing { Fehler }
+      { modaler Aufruf nur möglich, wenn BGEM-Cookie vorhanden }
+    else
+      begin
+        msg[7]:=msg[7] or BGS7_USRHIDE;
+        appl_write(bubblegem,16,@msg);
+        evnt_timer(10,0);
+        graf_mkstate(dummy,dummy,ms,dummy);
+        if (ms and 3)=0 then { keine Maustaste gedrückt? }
+          begin
+            bclicks:=258;
+            bmask:=3;
+            bstate:=0
+          end
+        else
+          begin
+            bclicks:=0;
+            bmask:=3;
+            bstate:=0
+          end;
+        if not(GetCookie('BHLP',delay)) then delay:=200
+        else
+          delay:=(delay shr 16) and 0x0000ffff;
+        graf_mouse(USER_DEF,bgemcookie->mhelp);
+        evnt_timer(delay,0);
+        evnt_multi(MU_KEYBD or MU_BUTTON or MU_M1, bclicks, bmask,
+          bstate, 1, mX-6, mY-6, 13, 13, 0, 0, 0, 0, 0, msg,
+          0, 0, dummy, dummy, ms, dummy, dummy, dummy);
+        msg[0]:=BUBBLEGEM_HIDE;
+        msg[1]:=apID;
+        msg[2]:=0;
+        msg[3]:=0;
+        msg[4]:=0;
+        msg[5]:=0;
+        msg[6]:=0;
+        msg[7]:=0;
+        appl_write(bubblegem,16,@msg);
+        graf_mouse(ARROW,NULL)
+      end;
+    repeat
+      graf_mkstate(dummy,dummy,ms,dummy)
+    until (ms and 3)=0
+  end;
+
+

15.2.3 Zeitgesteuerter Aufruf

+

Die Anpassung von Applikationen ist denkbar einfach: +

+ +
    +
  • Beim Empfang von BUBBLEGEM_REQUEST (0xBABA) ruft man BubbleGEM +ganz normal (allerdings mit den Koordinaten aus BUBBLEGEM_REQUEST) +auf, nachdem man anhand der empfangenen Koordinaten festgestellt hat, +ob man für diese Position eine Hilfe anbieten kann. +
      +

  • +
  • Die Message BUBBLEGEM_REQUEST ist wie folgt aufgebaut: msg[0] +:= BUBBLEGEM_REQUEST; +
    msg[1] := demonID; +
    msg[2] := 0; +
    msg[3] := winID; { AES-ID des Fensters unter dem Mauscursor } +
    msg[4] := mX;    { Koordinaten der Maus } +
    msg[5] := mY; +
    msg[6] := KStat; { Status der Umschalttasten } +
    msg[7] := 0; +
      +

  • +
  • Die zeitgesteuerte Hilfe funktioniert nur nichtmodal. +
      +

  • +
  • Damit der Hilfe-Dämon funktionieren kann, muß das System +wind_get(WF_OWNER) unterstützen. +
      +

  • +
  • Der Dämon ist an, wenn Bit BGC_DEMONACTIVE (0x0008) im +BHLP-Cookie gesetzt ist; nach Änderung BUBBLEGEM_REQUEST (msg[3..7] +ausgenullt) an BUBBLE.APP schicken (statt wie bisher an HLPDEMON.APP) +
      +

  • +
  • Wenn BGC_TOPONLY (0x0010) gesetzt ist, arbeitet der HelpDemon +nur beim Top-Window. +
      +

  • +
  • An-/Ausschalten des Hilfe-Dämons auch per VA_START (obwohl CPX +besser, da Zustand an/aus gespeichert wird): "-demonon" +(="- demon1"), "-demonoff" (="-demon0") +
      +

  • +
  • Der Dämon-Timer ist per Default 200ms, er kann im Feld dtimer +des BGEM-Cookies geändert werden. +
      +

  • +
+ +

15.2.4 BubbleGEM-Cookies

+

BHLP: +

+

BubbleGEM wertet den Cookie "BHLP" aus. Im oberen Word +ist die Dauer der Mindest-Sichtbarkeit eingetragen, Standard sind 200 +Millisekunden. Das untere Word ist eine Bitmap; ist Bit 0 (0x0001 = +BGC_FONTCHANGED) gesetzt, so bedeutet dies, daß FONT_CHANGED +ausgewertet wird. Ist BGC_NOWINSTYLE (0x0002) (lies: no-win-style, +nicht now-in-style) gesetzt, so wird die Hilfe als Sprechblase +dargestellt (d.h. ein gelöschtes Bit entspricht der Windows-Hilfe!). +Ein gesetztes Bit bei BGC_SENDKEY (0x0004) bewirkt, daß nach +Schließen der Hilfe durch einen Tastendruck AV_SENDKEY an den +Aufrufer geschickt wird. BGC_DEMONACTIVE (0x0008) bewirkt, daß Dämon +eingeschaltet ist. BGC_TOPONLY (0x0010) bestimmt, ob der HelpDemon nur +beim Top-Window arbeitet. +

+

BGEM: +

+

Zusätzlich wird der BGEM-Cookie gesetzt. Er ist nur zur +Laufzeit von BubbleGEM vorhanden, d.h. er wird beim Start von BubbleGEM +angelegt und bei AP_TERM entfernt. +

+
 typedef struct
+ {
+   long   magic;   /* 'BGEM'                                   */
+   long   size;    /* Größe dieser Struktur, derzeit 18        */
+   int    release; /* derzeit 7, nie kleiner als 5             */
+   int    active;  /* <>0, wenn gerade eine Hilfe angezeigt wird;
+                        0  sonst                               */
+   MFORM *mhelp;   /* Zeiger auf Hilfe-Mausform                */
+   int    dtimer;  /* Dämon-Timer; Default 200ms; ab Release 6 */
+ } BGEM;
+
+

Die Struktur liegt im globalen Speicher. Wichtig: dtimer +ist das einzige Feld, das für Lesen und Schreiben +freigegeben ist, alle anderen Felder sind read only! +

+

15.2.5 BubbleGEM-Environmentvariable

+

Will man BubbleGEM von Hand nachstarten, falls es noch nicht +läuft, so findet man in der Environmentvariablen +"BUBBLEGEM" den absoluten Pfad inklusive Programmnamen zum +BUBBLE.APP, also für MagiC etwa: +

+

#_ENV BUBBLEGEM=D:\Tools\Bubble\Bubble.app +

+

15.2.6 Schriftauswahl

+ + +

BUBBLEGEM_ASKFONT wird beim Start von BubbleGEM an den AV-Server +oder an die Applikation mit der AES-ID 0 geschickt. Diese sollte dann +mit der Nachricht BUBBLEGEM_FONT antworten (Jinnee macht das bspw.). +

+
msg[0] = BUBBLEGEM_ASKFONT;
+msg[1] = apID;
+msg[2] = 0;
+msg[3] = 0;
+msg[4] = 0;
+msg[5] = 0;
+msg[6] = 0;
+msg[7] = 0;
+
+msg[0] = BUBBLEGEM_FONT;
+msg[1] = apID;
+msg[2] = 0;
+msg[3] = FontID;
+msg[4] = FontPt;
+msg[5] = 0;
+msg[6] = 0;
+msg[7] = 0;
+
+

Wenn BubbleGEM diese Nachricht empfängt, nimmt es ab sofort den +Font mit der ID msg[3] und der Größe (in Punkt) msg[4] zur +Darstellung der Hilfeblasen. ID und Größe werden ohne Prüfung +übernommen. Außerdem reagiert BubbleGEM auf FONT_CHANGED, wenn das +entsprechende Feld im CPX-Modul aktiviert ist. +

+

15.2.7 AV_SENDCLICK, BubbleGEM

+
msg[0] = AV_SENDCLICK  /* 0x4709 */
+msg[1] = ap_id;
+msg[2] = 0;
+msg[3] = ev_mmox;
+msg[4] = ev_mmoy;
+msg[5] = ev_mmobutton;
+msg[6] = ev_mmokstate;
+msg[7] = ev_mbreturn;
+
+

AV_SENDCLICK wird verschickt, wenn die Blase durch Klicken geschlossen +wurde (also nicht, wenn BubbleGEM mit gedrückter Maustaste aufgerufen +wird und die Blase durch Loslassen geschlossen wird!). +AV_SENDCLICK ist das Pendant zu AV_SENDKEY. +

+
+ +Home +ProtokolleProtokolle +AV-ProtokollAV-Protokoll +Drag&Drop-ProtokollDrag&Drop-Protokoll + + diff --git a/de/proto_dd.html b/de/proto_dd.html new file mode 100644 index 000000000..5c85f0756 --- /dev/null +++ b/de/proto_dd.html @@ -0,0 +1,305 @@ + + + + + +Die Anleitung zum TOS: Drag&Drop-Protokoll + + + + + + + + + +Home +ProtokolleProtokolle +BubbleGEMBubbleGEM +Document-History-ProtokollDocument-History-Protokoll + +
+ +

15.3 Drag&Drop-Protokoll

+ +

Das Drag&Drop-Protokoll wurde von Atari für das Multi-TOS +entwickelt. Es handelt sich dabei um ein sehr flexibles Protokoll, +welches nicht selbst Bestandteil des Betriebssystems ist, und daher +auch unter anderen Betriebssystemvarianten eingesetzt werden könnte, +wenn diese Multitasking und Pipes unterstützen. +

+

AES-Nachrichten werden in diesem Protokoll nur dazu benutzt, um die +Kommunikationspartner zusammenzubringen; die gesamte restliche +Datenübertragung erfolgt über eine Pipe, auf die man mit den +gewohnten Dateifunktionen des GEMDOS zugreifen kann. +

+

Um eine Drag&Drop-Kommunikation zu beginnen, legt +man in dem Verzeichnis U:\PIPE eine Datei mit dem Namen 'DRAGDROP.xx' +an, wobei ein x jeweils für die Buchstaben A bis Z stehen kann. +Dadurch könnten theoretisch bis zu 676 gleichzeitige +Drag&Drop-Vorgänge stattfinden, was sicherlich ausreichen sollte. +Zum Anlegen der Pipe sollte man die Funktion Fcreate verwenden, da +diese eine ordentliche Fehlermeldung zurückliefert wenn eine +gleichnamige Pipe bereits existieren sollte. Darüberhinaus sollte +beim Anlegen der Pipe das Hidden-Bit (Bit-1) gesetzt werden: +dadurch enthält die lesende Seite ein End-of-File (EOF), wenn die +andere Seite der Pipe geschlossen wird. +

+

Anschließend wird die Nachricht AP_DRAGDROP an den Empfänger +geschickt. Da keine Rückmeldung auf diese Mitteilung vorgesehen ist, +muß sich der Sender der Funktion Fselect bedienen, um festzustellen, +ob jemand auf der Gegenseite die Pipe zum Lesen geöffent hat und +empfangsbereit ist. Atari empfiehlt in diesem Zusammenhang ein +Time-Out von drei bis vier Sekunden. +

+

Achtung: Der Sender ist leider nicht in der Lage +im voraus festzustellen, ob die Ziel-Applikation das +Drag&Drop-Protokoll überhaupt unterstützt. Daher ist es +möglich, daß der Anwender erst nach Ablauf der Time-Out-Zeit eine +entsprechende Mitteilung erhält. Aus diesem Grund sollten alle +Applikationen, die das Protokoll nicht unterstützen, eine +negative Bestätigung zurückschicken, damit die lästige Wartezeit entfällt. Falls +der Empfänger hingegen zur Aufnahme der Daten bereit ist, sollte er +die Kennung DD_OK (mit dem Wert 0) zurückschicken. +

+

Als nächstes müssen sich beide Parteien über die Art der zu +verschickenden Daten einigen; Kernpunkt des Drag&Drop-Protokolls +sind nämlich unterschiedliche Arten von Datentypen, die als vier Zeichen lange +Buchstabenfolgen dargestellt werden. Dazu schickt der Empfänger eine +nach Präferenz sortierte Liste von acht für ihn brauchbaren +Datentypen an den Sender. Eine Textverarbeitung könnte auf diese Art z.B. +mitteilen, daß sie Dateien im Rich-Text-Format (RTF) und ASCII-Format +unterstützt, und dabei ersteren den Vorzug gibt. Wichtig: +Wenn weniger als acht Datentypen verstanden werden, muss der Rest der +Liste mit Null-Bytes aufgefüllt werden, so daß immer genau 32 Bytes +übermittelt werden. +

+

Der Sender kann dann anhand der vom Empfänger übermittelten +Liste entscheiden, welches Datenformat verwendet werden soll. Dabei +dient die übermittelte Liste jedoch nur als Richtlinie; der Sender +kann also durchaus eine andere Reihenfolge benutzen oder auch noch +andere Formate anbieten. +

+

Die Übermittlung der eigentlichen Daten erfolgt dann in den +folgenden Schritten: +

+ +
    +
  • Zuerst wird ein Header übermittelt, der alle Informationen +über die Daten - ihr Format und ihre Länge - enthält. Der +Empfänger kann darauf dann entsprechend reagieren. Der Header ist wie +folgt aufgebaut: +
      +

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PositionLängeBedeutung
    02 BytesLänge des Headers
    24 BytesDatentyp (z.B. ARGS)
    64 BytesLänge der zu übertragenden Daten
    10variabel(n)Name der Daten (null-terminiert)
    10+nvariabelDateiname (null-terminiert)
    +
    + +
    Da die Länge des Headers mit angegeben werden muss, ist dieser +für zukünftige Zwecke leicht erweiterbar. +
      +

  • +
  • Nachdem er den Header eingelesen hat, kann der Empfänger auf +diesen reagieren. So kann er beispielsweise dem Sender mitteilen, daß +er mit dem vorgeschlagenen Datenformat einverstanden ist, oder nicht. +Dies geschieht durch Senden von verschiedenen Status-Bytes. +
      +

  • +
  • Sobald der Empfänger mit DD_OK geantwortet hat, wird mit der +Übertragung der Daten begonnen; dabei werden genau so viele Bytes +geschrieben, wie im Header angegeben wurden, und anschließend die +Pipe geschlossen. +
      +

  • +
+ +

Wichtiger Hinweis: Normalerweise wird ein Prozess vom +Kernel terminiert, wenn er in eine Pipe schreibt, die von niemandem +zum Lesen geöffnet ist. Dies läßt sich verhindern, indem man das +Signal SIGPIPE ignoriert. Ferner sollte keiner der beiden Partner ein +wind_update benutzen, da es sonst u.U. zu einem Deadlock +kommen könnte, wenn eine der beiden Seiten versucht eine +Bildschirmausgabe (z.B. eine Alertbox) zu machen. +

+ +

Tip: Ein Beispiel-Quelltext zum Drag&Drop-Protokoll +befindet sich z.B. in der Zeitschrift ST-Computer (Ausgabe +12/1993). +

+

Querverweis: +
AV-Protokoll GEM Style-Guidelines Test auf Pipes OLGA-Protokoll +

+ +

15.3.1 D&D-Listing_1

+
/* Das folgende Programmfragment signalisiert dem Sender
+   des Drag&Drop-Protokolls, daß das eigene Programm
+   dieses Protokoll nicht versteht. */
+
+#define AP_DRAGDROP   63
+#define DD_NAK         1
+
+/* wir befinden uns nun in der Event-Schleife;
+   msg ist der Message-Puffer. */
+
+case AP_DRAGDROP:
+{
+    static BYTE pipename[] = "U:\\PIPE\\DRAGDROP.AA";
+    LONG fd;
+
+    pipename[18] = msg[7] & 0x00ff;
+    pipename[17] = (msg[7] & 0xff00) >> 8;
+
+    fd = Fopen (pipename, 2);
+    if (fd >= 0)
+    {
+        BYTE c = DD_NAK;
+
+        Fwrite ((WORD) fd, 1, &c);
+        Fclose ((WORD) fd);
+    }
+}
+break;
+
+ +

15.3.2 Drag&Drop, Datentypen für

+

Datentypen werden innerhalb des Drag&Drop-Protokolls durch +eine vier Zeichen lange Buchstabenfolge repräsentiert. Die folgende +Liste enthält die zur Zeit definierten Datentypen: +

+
+
ARGS
+
+

steht für eine Kommandozeile, also i.a. einen oder +mehrere Datei- oder Verzeichnisnamen, die voneinander durch +Leerzeichen getrennt sind. Für Dateinamen die selbst Leerzeichen +enthalten, ist eine Sonderbehandlung notwendig. Dazu wird der +Dateiname in einfache Anführungsstriche eingeschlossen, und +jeder Anführungsstrich, der im Namen auftritt, durch einen doppelten +ersetzt. +
  +
Beispiel: +
Aus Eric's file würde 'Eric''s file'. +
  +

+ +
+
PATH
+
+

ist reserviert, um Informationen über das vom Benutzer +gewählte Zielobjekt zu erfragen. Die Übertragung läuft in diesem +Fall in die umgekehrte Richtung; d.h. der Sender liest genau +so viele Bytes wie angegeben. Hierzu muß der Empfänger nach dem +Senden von DD_OK direkt die Daten übermitteln. Diese sollten den +vollständigen Pfadnamen bzw. Dateinamen des Zielfensters (mit '\' +terminiert) enthalten. +
  +

+ +
+
.XXX
+
+

steht für eine Extension (eines Dateinamens). +Beispiele: +
  +

+ + + + + + + + + + + + + + + + + + + + +
.IMG=Grafikdaten im XIMG-Format
.GEM=Grafikdaten im Metafile-Format
.TXT=Texte im ASCII-Format
.RTF=Texte im Rich-Text-Format
+
+ +

+ +
+
+

Querverweis: Drag&Drop-Protokoll +

+ +

15.3.3 Drag&Drop, Status Bytes für

+ + + + + + + +

Die folgende Liste enthält alle Status-Bytes, die innerhalb +einer Drag&Drop-Kommunikation anfallen können: +

+
#define DD_OK         0    /* Ok, - weitermachen                */
+#define DD_NAK        1    /* Drag&Drop abbrechen               */
+#define DD_EXT        2    /* Datenformat wird nicht akzeptiert */
+#define DD_LEN        3    /* Wunsch nach weniger Daten         */
+#define DD_TRASH      4    /* Ziel ist ein Papierkorb-Icon      */
+#define DD_PRINTER    5    /* Ziel ist ein Drucker-Icon         */
+#define DD_CLIPBOARD  6    /* Ziel ist ein Klemmbrett-Icon      */
+
+

Alle anderen Werte sind für zukünftige Erweiterungen +reserviert. +

+

Hinweis: Das Status-Byte DD_EXT wird verschickt, wenn +der Empfänger das angebotene Datenformat nicht mag. Der Sender wird +daraufhin einen neuen Header mit einem anderen Datenformat schicken, +oder seinerseits die Übertragung abbrechen. Dies kann sich solange +wiederholen, bis sich Sender und Empfänger auf ein Format geeinigt +haben, oder bis feststeht, daß es keine Möglichkeit der +Verständigung gibt. +

+

Querverweis: Drag&Drop-Protokoll +

+
+ +Home +ProtokolleProtokolle +BubbleGEMBubbleGEM +Document-History-ProtokollDocument-History-Protokoll + + diff --git a/de/proto_dhst.html b/de/proto_dhst.html new file mode 100644 index 000000000..a0144cbd5 --- /dev/null +++ b/de/proto_dhst.html @@ -0,0 +1,100 @@ + + + + + +Die Anleitung zum TOS: Document-History-Protokoll + + + + + + + + + +Home +ProtokolleProtokolle +Drag&Drop-ProtokollDrag&Drop-Protokoll +Font-ProtokollFont-Protokoll + +
+ +

15.4 Document-History-Protokoll

+ + + +

Das Document-History-(DHST-) Protokoll dient dazu, eine globale +Liste der zuletzt benutzten Dokumente zu verwalten (ähnlich dem +Abruf-Menü in z.B. Texel) und an einer einheitlichen Stelle (hier: +Start-Me-Up- Menü) schnell abrufbar zu machen. +

+

Dazu ein kurzer Auszug der Struktur in C-Notation: +

+ + +
 #define DHST_ADD 0xdadd
+ #define DHST_ACK 0xdade
+
+typedef struct
+{
+   int8_t *appname,
+          *apppath,
+          *docname,
+          *docpath;
+} DHSTINFO;
+
+

Jedesmal wenn der Anwender eine Datei öffnet, sucht die +Applikation nach dem Cookie 'DHST'. Ist dieser vorhanden, gibt das +untere Word des Cookie-Wertes die AES-ID des DHST-Servers an, an +den die Nachricht DHST_ADD geschickt wird. Die Applikation legt also +im globalen Spei- cher eine DHSTINFO-Struktur an und füllt +sie entsprechend auf: +

+
 appname:     Name der Applikation
+              (z.B. "Texel")
+
+ apppath:     absoluter Pfad der Applikation
+              (z.B. "c:\program\texel.app")
+
+ docname:     Name des Dokuments
+              (z.B. "balmer.txl")
+
+ docpath:     absoluter Pfad des Dokuments
+              (z.B. "d:\daten\balmer.txl")
+
+

Dann schickt sie dem DHST-Server folgende Nachricht: +

+
 msg[0]    DHST_ADD (0xdadd)
+ msg[1]    ap_id der Anwendung
+ msg[2]    0
+ msg[3]    und
+ msg[4]    Pointer auf DHSTINFO-Struktur
+ msg[5]    0
+ msg[6]    0
+ msg[7]    0
+
+

Als Antwort erhält die Applikation folgende Message, mit der +sie den globalen Speicher wieder freigeben kann: +

+
 msg[0]    DHST_ACK (0xdade)
+ msg[1]    ap_id des DHST-Servers
+ msg[2]    0
+ msg[3]    and
+ msg[4]    Pointer auf DHSTINFO-Struktur (wie bei DHST_ADD übergeben)
+ msg[5]    0
+ msg[6]    0
+ msg[7]    0=Fehler, sonst: OK
+
+

In der ST-Computer 10/98 findet sich ein ausführlicher Artikel +zu diesem Thema. +

+
+ +Home +ProtokolleProtokolle +Drag&Drop-ProtokollDrag&Drop-Protokoll +Font-ProtokollFont-Protokoll + + diff --git a/de/proto_font.html b/de/proto_font.html new file mode 100644 index 000000000..c1f9e6d9b --- /dev/null +++ b/de/proto_font.html @@ -0,0 +1,193 @@ + + + + + +Die Anleitung zum TOS: Font-Protokoll + + + + + + + + + +Home +ProtokolleProtokolle +Document-History-ProtokollDocument-History-Protokoll +GDPS: Gerti's Driver Piping SystemGDPS: Gerti's Driver Piping System + +
+ +

15.5 Font-Protokoll

+

Beschreibung des Font-Protokolls, Revision 5 +

+

Eine minimale Unterstützung dieses Protokolls besteht in der +Auswertung der Nachricht FONT_CHANGED. Programme, die eines +der (GDOS–) Attribute Textwinkel, –breite, –kerning, +–neigung oder die Angabe der Textgröße in 1/65536 Punkt +unterstützen, sollten auch die Nachricht XFONT_CHANGED, die +zusätzliche Informationen anbietet, unterstützen. +

+

Über die Nachricht FONT_SELECT kann der Fontselektor +auch von der Applikation aufgerufen werden. Dabei können auch die +aktuell eingestellten Attribute übergeben werden. +

+

Unterstützt die Anwendung auch das +XAcc–2–Protokoll, so kann sie auch leicht die +Unterstützung der Bestätigungsnachricht FONT_ACK offenlegen +und ohne Environment–Variable nach Fontselektoren im Speicher +suchen. +

+
    + +
  • FONT_CHANGED–Nachricht: +
    Nachricht des Fontselektors an eine Applikation, daß der +Zeichensatz und/oder die Zeichenattribute (Größe, Farbe und Effekte) +in einem oder mehreren Fenstern der Applikation gewechselt werden +sollen. Besitzt die Zielapplikation im erweiterten XAcc–Namen +die Kennung XFontAck, so muß diese Nachricht mit der +Nachricht FONT_ACK beantwortet werden. Ansonsten ist die +Unterstützung dieser Nachricht optional. +
      +
    Negative Werte in msg[6/7] bzw. Null in msg[4/5] +stehen für keine Veränderung +
      +

    +
    msg[0]  = FONT_CHANGED (0x7a18)
    +msg[1]  = apID
    +msg[2]  = 0
    +msg[3]  = Fenster-Handle oder negativer Wert, falls
    +          Font in allen Fenstern gewechselt werden soll
    +msg[4]  = Font-ID oder Null
    +msg[5]  = Font-Größe in Punkt (>0) oder Pixel (<0)
    +          bzw. Null für keine Veränderung
    +msg[6]  = Font-Farbe
    +msg[7]  = Effekte:
    +          Bit 0: Fett
    +          Bit 1: Hell
    +          Bit 2: Kursiv
    +          Bit 3: Unterstrichen
    +          Bit 4: Umrandet
    +          Bit 5: Schattiert
    +          Bit 6: Invers
    +          Bit 12: 1=Font ist monospaced; 0=unbekannt
    +          (restliche Bits sind reserviert)
    +
    +
    +
    Bit 12 ist mit der Revision 5 eingeführt worden. +
      + +

  • +
  • XFONT_CHANGED–Nachricht: +
    Erweiterte (GDOS–)Attribute übermitteln. Diese Nachricht +ist optional und wird vor der Nachricht FONT_CHANGED +verschickt, d.h. erst wenn die Nachricht FONT_CHANGED +eintrifft und den gleichen Absender (msg[1] vergleichen!) hat, +sollten diese Werte gesetzt werden! Dadurch werden doppelte Redraws +und/oder Fehler vermieden. +
      +
    Die Nachricht FONT_CHANGED enthält die auf Punkt +gerundete Größe, d.h. Programme, die XFONT_CHANGED nicht +unterstützen, können diesen Wert benutzen. +
      +
    Fontselektoren versenden idR diese Nachricht nur, wenn eines der +übermittelten Attribute vom Normalwert abweicht! +
      +

    +
    msg[0]   = XFONT_CHANGED (0x7a1b)
    +msg[1]   = apID
    +msg[2]   = 0
    +msg[3/4] = Größe in 1/65536-Punkt (fix31)
    +msg[5]   = Rotationswinkel in 1/10-Grad (0-3599)
    +msg[6]   = Neigung in 1/10-Grad (-1800 - 1800)
    +msg[7]   = Breite und Kerning:
    +           Bit 15:    Paar-Kerning
    +           Bit 13/14: Track-Kerningmodus (0-3)
    +           Bit 0-12:  Breite in Punkt
    +
    +           in C:
    +
    +           typedef struct
    +           {
    +               unsigned int  pair  : 1;
    +               unsigned int  track : 2;
    +               unsigned int  width : 13;
    +           } VECTOR_INFO;
    +
    +
    + +

  • +
  • FONT_SELECT–Nachricht: +
    Mit dieser Nachricht kann ein im Speicher vorhandener +Fontselektor, der im erweiterten XAcc–Namen die Kennung +XFontSelect besitzt, aufgerufen werden. Unterstützt +die Anwendung und/oder der Fontselektor kein +XAcc–2–Protokoll, so kann noch nach dem Inhalt der +(AES-)Environment–Variablen FONTSELECT gesucht +werden. Diese Variable kann gegebenenfalls auch mehrere Namen +(getrennt durch Semikolon) enthalten, wobei die Namen optional auch +Pfad und Dateierweiterung besitzen können, so daß man den +Fontselektor unter Multitasking bei Bedarf parallel nachladen +kann. +
      +
    Beispiele: +
      +

    setenv FONTSELECT=FONT_PAL;FONT_SEL
    +setenv FONTSELECT=C:\FONTSEL\FONT_SEL.APP;C:\FONTSEL\FONT_PAL.APP
    +
    +
    Zur passiven Unterstützung des Font–Protokolls genügt +aber die Auswertung der o.g. Nachrichten FONT_CHANGED und +XFONT_CHANGED. +
      +
    Negative Werte in msg[6/7] oder eine Null +msg[4/5] bedeuten, daß dieser Parameter nicht benötigt wird, +nicht eingestellt werden soll oder noch nicht gesetzt wurde +
      +
    +
    msg[0]   = FONT_SELECT (0x7a19)
    +msg[1]   = apID
    +msg[2]   = 0
    +msg[3]   = Handle des Fensters, dessen Zeichensatz ein-
    +           gestellt werden soll, oder ein negativer
    +           Wert, wenn der Zeichensatz in allen Fenstern
    +           der Applikation gewechselt werden soll
    +msg[4]   = Font-ID oder Null
    +msg[5]   = Font-Größe in Punkt (>0) oder Pixel (<0) bzw.
    +           Null, falls der Parameter nicht benötigt wird
    +           (s.o.)
    +msg[6]   = Farbe
    +msg[7]   = Effekte (s.o.)
    +
    +
    + +

  • +
  • FONT_ACK–Nachricht: +
    Fontselektor darüber informieren, ob die +FONT_CHANGED–Nachricht ausgewertet bzw. die +Zeichensatz–Attribute eingestellt werden konnten +
      +

    +
    msg[0]   = FONT_ACK (0x7a1a)
    +msg[1]   = apID
    +msg[2]   = 0
    +msg[3]   = TRUE (1):  Nachricht wurde ausgewertet
    +           FALSE (0): Nachricht wurde ignoriert
    +msg[4-7] = 0 (reserviert)
    +
    +
    +

  • +
+ +

Querverweis: xFSL-Schnittstelle   Zeichensatzauswahl von MagiC +

+
+ +Home +ProtokolleProtokolle +Document-History-ProtokollDocument-History-Protokoll +GDPS: Gerti's Driver Piping SystemGDPS: Gerti's Driver Piping System + + diff --git a/de/proto_gdps.html b/de/proto_gdps.html new file mode 100644 index 000000000..6bb45afa1 --- /dev/null +++ b/de/proto_gdps.html @@ -0,0 +1,692 @@ + + + + + +Die Anleitung zum TOS: GDPS: Gerti's Driver Piping System + + + + + + + + + +Home +ProtokolleProtokolle +Font-ProtokollFont-Protokoll +LTL-ProtokollLTL-Protokoll + +
+ +

15.6 GDPS: Gerti's Driver Piping System

+

Stand: 23.08.90 +

+ +
+

15.6.1 Allgemeine Beschreibung

+

Dieses Treiberkonzept soll ermöglichen, speicherresidente +Gerätetreiber der verschiedensten Art von beliebigen Programmen aus +aufzurufen. Die Kommunikation zwischen den Programmen und den Treibern +erfolgt über eine Datenstruktur, die der Treiber zur Verfügung +stellt. Dabei ist ein fester Kern dieser Datenstruktur vorgegeben, und muß +von allen Treibern, die diesen Standard erfüllen sollen, eingehalten +werden. Darüber hinaus sind Erweiterungen möglich. Anhand von +Versionsnummern kann dann das aufrufende Programm feststellen, +inwiefern Erweiterungen der Datenstruktur vorhanden sind. Alle +Datenstrukturen sind aufwärtskompatibel. +

+ +
    +
  1. Vorbemerkungen +
      +
    Alle Werte sind, sofern sie mehr als 1 Byte benötigen, immer in +der Reihenfolge MSB...LSB definiert. Die Beispielcodes sind in 68000er +Assembler formuliert. Es folgt die Beschreibung für ATARI ST. +
      +

  2. +
+ +

15.6.2 Definition der Treiberverkettung

+

Basis des GDPS ist der vom Betriebssystem nicht genutzte Vektor +0x41C. Dieser Vektor enthält normalerweise OL. Im GDPS zeigt der +Vektor auf den Header des ersten Devicetreibers in der Kette. Dieser +Header hat folgenden Aufbau (rAdr=relative Adresse, S=Size): +

+
     rAdr S  Bedeutung
+
+      OH  L  Pointer auf nächsten Treiberheader oder 0 im letzten Treiber
+             der Kette
+      4H  L  'GDPS' = 0x47445053 Magic als Kennung für das GDPS
+
+

Daraus folgt die Methode des Ein- und Ausketten eines Treibers. +

+ +
    +
  1. Einketten eines Treibers +
      +
    Der Treiber kopiert den in 0x41C stehenden Vektor in seinen +Header. Anschließend trägt er die Adresse seines Headers in 0x41C +ein. +
      +
    Assemblerbeispiel (ist im Supervisormodus auszuführen): +
      +

        len     header(pe),a0  * Adresse des GDPS-Headers
    +    clr.l   (a0)           * NEXT auf 0 initialisieren
    +    cmp.l   0x41C,a0       * = alter Wert
    +    beq     unten          * ja keine Endlosverkettung!
    +    move.l  0x41C,(a0)     * sonst NEXT eintragen
    +    move.l  a0,0x41C       * und Header in die Kette hängen
    +
    +

  2. +
  3. Ausketten eines Treibers +
      +
    Der Treiber sucht in der Kette den Pointer auf seinen Header. +Diesen ersetzt er durch den in seinem Header befindlichen Pointer. +
      +
    Assemblerbeispiel (ist im Supervisormodus auszuführen): +
      +

                   move.l  #0x41C,a0
    +               lea     header(pe),a1
    +   searchen:   cmp.l   (a0),a1
    +               beq     found
    +               move.l  (a0),a0
    +               bra     searchen
    +   found:      move.l  (a1),(a0)
    +
    +

  4. +
  5. Suchen eines Treibers +
      +
    Das Suchen nach einem Treiber sollte ebenfalls im Supervisormode +erfolgen. Da das Betriebssystem die Variable 0x41C beim Warmstrat +nicht auf 0 setzt, muß zu jedem gefunden Vektor MAGIC überprüft +werden. +
      +
    Es folgt eine Beispielsroutine in GFA-Basic Notation, die die +gefundenen und gültigen Vektoren in ein Integerarray schreibt: +
      +

       DIM vektor%(31)             ! Dahin kommen die Adressen der Treiber
    +   index%=0                    ! Zähler auf 0 initialisieren
    +   adr%=SLPEEK($41C)           ! Adresse des ersten Treibers
    +   WHILE adr%<>0 AND SLPEEK(adr%+4)=$47445053
    +                               ! Test: Adresse gültig und Magic OK?
    +      vektor%(index%)=adr%     ! wenn ja Adresse merken
    +      inc index%               ! Zähler um eins erhöhen
    +   WEND
    +   PRINT index%;" Treiber gefunden!"
    +
    +

  6. +
+ +

15.6.3 Datenstruktur

+
 rAdr S  Bedeutung
+  0H  L  Pointer auf nächsten Treiberheader oder 0 im letzen Treiber
+         der Kette
+  4H  L  'GDPS' = 0x47445053 Magic als Kennung für das GDPS
+  8H  W  100 = Versionsnummer Datenstrukturdefinition * 100
+  AH  W  Treibertyp (siehe 3.1)
+  CH  L  Pointer auf Treiberinfo, 0-terminierter String,
+         max. 32 Charakters
+ 10H  L  Pointer auf Programmierer/Copyright, 0-terminierter String,
+         max. 32 Charakters
+ ab 14H folgt die treiberspezifische Datenstruktur
+
+

15.6.4 Treibertypen

+

Es dürfen beliebig viele Treiber im Speicher sein, auch Treiber +gleichen Typs! +

+

Die Treibertypen sind zunächst in Gruppen unterteilt: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
GruppeTreibertypBedeutung
0000-0FFgraphische Eingabegeräte
1100-1FFgraphische Ausgabegeräte
2200-2FFdiverse Eingangsschnittstellen
3300-3FFdiverse Ausgangsschnittstellen
4400-4FFI/O-Schnittstellen
5500-5FFMassenspeicher
6-F600-FFFreserviert
10-FF1000-FFFF'private' Treiber, deren Datenstruktur nicht in den
  GDPS-Definitionen erfaßt sind
+
+ + +
+

15.6.4.1 Treibergruppe Scanner

+

Festlegung: Bei Bi-Level-Daten entspricht ein gesetztes Bit +einem 'vorhandenen` Pixel. Bei Multivalue-Daten entspricht 0 `nichts`, +mit steigendem Wert nimmt die betreffende Farbintensität bzw. +Helligkeit zu. +

+

ACHTUNG: Beim Kommandos aus der 10xH-Gruppe werden +Graustufenbilder invertiert! +

+
  14H  W  Scannerbeschreibung
+          Enthält dieses Word den Wert 0, so ist der Scanner/Treiber noch
+          nicht initialisiert, Kommando 105H ausführen
+          Bit 0: Bi-Level möglich
+              1: Dithern möglich
+              2: Multivalue möglich
+              3: Multivalue und Dithern möglich
+              4: Bi-Level Farbe möglich
+              5: Dithern Farbe möglich
+              6: Multivalue in Farbe möglich
+              7: Multivalue in Farbe und Dithern möglich
+              8: Komprimierung der Daten (siehe unten) möglich
+              9: Blockweise Rückgabe möglich
+             10: Einzelblatteinzug per separatel Kommando
+             11: Einzelblatteinzug automatisch
+             12: Prescan möglich
+             13: virtuelle Speicherverwaltung möglich
+                 (GDPS-Version >= 1.10)
+             14: reserviert (0)
+             15: reserviert (0)
+               Multivalue und Dithern: Sondermodus, immer 2 Bit/Pixel
+  16H  W  Zahl der Farben
+  18H  W  Mögliche Multi-Value-Bittiefen
+          Aufbau:  Bit 0 gesetzt: monochrom möglich
+                   Bit 1 gesetzt: 2 Graustufen möglich
+                   Bit 2 gesetzt: 4 Graustufen möglich
+                   Bit 3 gesetzt: 8 Graustufen möglich
+                   etc...
+  1AH  W  Scanner reservieren
+  1CH  W  Kommando an Scanner (0=Ready, 1-FFH reserviert!!!)
+  1EH  L  Pointer auf Kommandostruktur
+
+

Es wird von einem Scannertreiber mit eigener Bedienoberfläche +ausgegangen. Will ein Programm den Scannertreiber ansprechen, so +geschieht dies folgendermaßen: +

+
   a) Warten, bis Word 1AH = 0 (Scanner frei)
+   b) Scanner reservieren durch Eintrag eines Wortes in 1AH
+   c) Erstellen der Kommandostruktur
+   d) Eintragen des pointers auf die Kommandostruktur nach 1EH
+   e) Eintragen des Kommandos in 1CH
+   f) in einer EVENT-Schleife (!!) (Timer- oder Multi-Event) warten, bis
+      Kommando-Word vom Scannertreiber wieder auf 0 gesetzt ist.
+   g) Schritte ab c) beliebig oft wiederholen
+   h) Scanner freigeben (0 in 1AH eintragen)
+
+

Die vom aufrufenden Programm zur Verfügung zu stellende +Kommandostruktur hat drei Aufgaben: +

+
   a) Übergabe der kommandostruktur
+   b) Rückgabe einer Erfolgs- bzw. Fehlermeldung
+   c) Rückgabe der verwendeten Parameter
+
+

Aufbau der Kommandostruktur: +

+
   00H  W  Rückgabewert, wird vom aufrufenden Programm auf 0 initialisiert.
+           Der Scannertreiber trägt hier nach Abarbeitung des Kommandos
+           0xFFFF (=OK) oder eine positive Fehlernummer ein.
+           Arbeitet der Scanner im Blockmodus, wird nach den Blöcken ein
+           0xFFFE eingetragen, nach dem letzten Block ein 0xFFFF. Arbeitet
+           im Blockmodus UND in Farbe, so gibt es zwei Möglichkeiten:
+           a) der Scanner scannt die Farbauszüge einzeln, dann erfolgt die
+              übergabe wie oben, aber entsprechend der Zahl der Farben
+              mehrfach.
+           b) der Scanner scannt alle farben gleichzeitig, dann wird nach
+              den Blöcken 0xFFFD eingetragen. Der zurückgegebene Block
+              besteht dann aus 'Anzahl der Farben' gleichgroßen Bereichen.
+   02H  W  Erlaubte Scanmodi. Der Aufbau dieses Wortes ist wie 14H, ein
+           gesetztes Bit besagt, daß der Scannertreiber den entsprechenden
+           Modus benutzen darf.
+   04H  W  Erlaubte Bittiefen (Aufbau wie oben 18H).
+   06H  L  Pointer auf Speicher
+   0AH  L  Anzahl der Bytes in Speicher (Rückgabe: Anzahl der verwendeten
+           Bytes)
+   0EH  W  Bytes pro Scanline oder 0 (immer mod 2!)
+   10H  W  Anzahl Scanlines oder 0
+   12H  W  Breite des Image in 1/10 mm oder 0
+   14H  W  Höhe des Image in 1/10 mm oder 0
+   16H  W  Auflösung in Main-Scan-Richtung (x) in dpi oder 0
+   18H  W  Auflösung in Sub-Scan-Richtung (y) in dpi oder 0
+           (Bei Rückgabe: Auflösung = Auflösung * Zoomfaktor!)
+   1AH  W  Modulo-Wert für Scanlines (in Bytes, z.B. 2 = 2*n Bytes pro
+           Scanline)
+   1CH  W  x-Position des Image in 1/10 mm
+   1EH  W  y-Position des Image in 1/10 mm
+
+Seit GDPS-Version >= 1.10:
+   20H  L  Seriennummer des aufrufenden Programms
+   24H  W  ADD-Bits: Zusätzlich vom Programm benötigter Speicher (in Bits
+                     pro Pixel)
+   26H  L  Pointer auf 'Dchange_pointer' (Funktion der vS)
+   2AH  L  Pointer auf Dupdate (Funktion der vS)
+   2EH  W  v_handle LESEN (vS)
+   30H  W  v_handle SCHREIBEN (vS)
+   32H  W  virt_flag (1 = vS wird benutzt)
+
+

vS = virtuelle Speicherverwaltung +

+

Nach Abarbeitung eines Kommandos trägt der Scannertreiber die +TATSÄCHLICH BENUTZTEN WERTE in diese Datenstruktur ein. +

+

Soll die Bildgröße fest sein, so kann dies entweder mit den +Worten 0EH, 10H oder 12H, 14H, 1CH, 1EH definiert werden. Sind beide +Wertepaare vorbesetzt, wird die Vorgabe in Bytes benutzt. Falls der +Scanner nicht in der Lage ist, dieses Format einzuscannen, wird +gegebenenfalls auf passenden Werte verändert; Daher bei Rückgabe +prüfen!! +

+

Komprimierung: +

+

Bi-level und Dither-Daten sind IMMER so gepackt, daß 8 Pixel in +einem Byte vorliegen. Dabei wird das erste Pixel ins MSBit +eingetragen! +

+

Multivalue-Daten liegen entweder unkomprimiert vor, dann belegt +ein Pixel genau ein Byte. Dabei sind die Daten (bei weniger als 256 +Graustufen) immer zum MSBit hin formatiert, die LSBits sind ggf. +aufgefüllt (je nach Scanner mit 0 oder 1). In komprimierter Form +werden die Multivalue-Daten so gepackt, daß Byte-Grenzen nicht +überschritten werden, ggf. auftretende Leerbits sind (je nach +Scanner) mit 0 oder 1 gefüllt: +

+
                 +--+--+--+--+--+--+--+--+
+   2 Bit/ Pixel  |B1|B0|B1|B0|B1|B0|B1|B0|   -> 4 Pixel/Byte
+                 +--+--+--+--+--+--+--+--+
+
+                 +--+--+--+--+--+--+--+--+
+   3 Bit/ Pixel  |B2|B1|B0|--|B2|B1|B0|--|   -> 2 Pixel/Byte
+                 +--+--+--+--+--+--+--+--+
+
+                 +--+--+--+--+--+--+--+--+
+   4 Bit/ Pixel  |B3|B2|B1|B0|B3|B2|B1|B0|   -> 2 Pixel/Byte
+                 +--+--+--+--+--+--+--+--+
+
+                 +--+--+--+--+--+--+--+--+
+   5 Bit/ Pixel  |B4|B3|B2|B1|B0|--|--|--|   -> 1 Pixel/Byte
+                 +--+--+--+--+--+--+--+--+
+
+                 +--+--+--+--+--+--+--+--+
+   6 Bit/ Pixel  |B5|B4|B3|B2|B1|B0|--|--|   -> 1 Pixel/Byte
+                 +--+--+--+--+--+--+--+--+
+   etc.
+
+

Wird in der Kommandostruktur das Komprimierungsbit nicht +gesetzt, so werden die ggf. vom Scannertreiber entkomprimiert. Ist das +Bit jedoch gesetzt, muß es nach Abarbeitung des Kommandos getestet +werden, ob die Daten wirklich komprimiert sind. +

+

Festgelegte Kommandos: +

+
   100H: Scan
+           Der Benutzerdialog wird aufgerufen, ggf. wird ein Scanvorgang
+           vorgenommen.
+   101H: Continue
+           Dieses Kommando setzt im Blockmodus das Scannen fort.
+   102H: Scan without Dialog
+           Es wird ein Scanvorgang ohne weitere Benutzerintervention
+           veranlaßt. Es werden die gleichen vom Benutzer einstellbaren
+           Parameter benutzt wie beim vorhergehenden Scanvorgang.
+   103H: Next Sheet
+           Der Einzelblatteinzug zieht das nächste Blatt ein.
+   104H: Prescan
+           Führt einen Prescan mit fest eingestellten Parametern durch.
+   105H: Scanner/Treiber initialisieren
+           Holt Gerätebeschreibung vom Scanner
+
+

Die Kommandos 102H und 103H sind speziell für eine +automatisierte Schrifterkennung gedacht. +

+

Seit GDPS-Version 1.10 existieren neue Kommandos (wie oben, aber +statt 10xH wird 20xh benutzt). Werden diese Kommandos benutzt, kann +virtuell gearbeitet werden, falls virt_flag=1. Weiterhin werden +Graustufenbilder bei diesen Kommandos wie folgt geliefert: +

+
      0=schwarz
+    255=weiß
+
+

ACHTUNG: bei 20xH-Kommandos muß vom aufrufenden Programm die +erweiterte Kommandostruktur nach GDPS 1.10 übergeben werden!!! +

+

Fehlermeldungen im Rückgabe-Wert: +

+
   FFFEH: Block bereit, weitere Blöcke folgen.
+   FFFFH: Scanvorgang (ggf. für eine Farbe) abgeschlossen, letzter (bzw.
+          einziger) Datenblock liegt vor.
+      0H: Abwarten und Tee trinken (bzw. mittels EVENT-Schleife warten)
+      1H: Unbekanntes Kommando
+      2H: Scannerfehler
+      3H: Abbruch durch Benutzer
+      4H: Out of Paper (nur bei Einzelblatteinzug)
+      5H: Out of Memory: Der Benutzer hat ein zu großes Papierformat
+          benutzt.
+      6H: Scanner noch nicht initialisiert.
+
+

Die Fehlermeldungen werden dem Benutzer vom Treiber angezeigt. +Sie dienen dem aufrufenden Programm nur als Information. +

+

15.6.4.2 GDPS, virtuelle Speicherverwaltung

+
#define VOR              1
+#define ZURUECK         -1
+#define MITTE            0
+
+/********************************************************************/
+/*                        Scannerstrukturen                         */
+/********************************************************************/
+typedef struct                   /* Übergabestruktur für Scanner    */
+{
+   void  *next;                  /* Zeiger auf den nächsten Treiber */
+   char  kennung[4];             /* Magic GDPS als Treiberkennung   */
+   int   version;                /* Versionsnummer, derzeit < 200   */
+   int   typ;                    /* Treiberart, 0 für Scanner       */
+   char  *info;                  /* Zeiger auf Treiberinfo und die  */
+   char  *copyright;             /* Copyrightmeldung                */
+   int   gerbesch;               /* Gerätebeschreibungsflags        */
+   int   farben;                 /* Anzahl der Farben 0=SW          */
+   int   deep;                   /* mögliche Bittiefen              */
+   int   free;                   /* Flag ob Scanner frei ist        */
+   int   befehl;                 /* Kommando an Scanner             */
+   void  *command;               /* Zeiger auf die Kommandostruktur */
+} SCANHEADER;
+
+typedef struct                 /* Kommandostruktur für GDPI-Scanner */
+{
+   int   result;                 /* Ergebnis das Treiber meldet     */
+   int   modi;                   /* Erlaubte Scanmodi               */
+   int   tiefe;                  /* Tiefe des Bildes in Bit/Pixel   */
+   void  *vspeicher;             /* Dahin soll das Bild gehen       */
+   long  vmaxlen;                /* verfügbarer Speicher            */
+   int   bytebreite;             /* Breite einer Zeile in Bytes     */
+   int   hoehe;                  /* Hoehe des Bildes in Zeilen      */
+   int   mmbreite;               /* Breite und Höhe in 1/10 Milli-  */
+   int   mmhoehe;                /* metern                          */
+   int   xdpi;                   /* Auflösung in x und y-Richtung   */
+   int   ydpi;
+   int   modulo;                 /* 2=>Bild wird Wordbündig         */
+   int   start_x;                /* linke obere Ecke x in 1/10mm    */
+   int   start_y;                /* linke obere Ecke y in 1/10mm    */
+   long  ser_nr;                 /* Seriennummer                    */
+
+/****
+der nun folgende Teil ist nur beim Aufruf des Scanners mit
+den Befehlen der 0x2XX Serie definiert
+******/
+   int     add_bits;              /* Angabe, wieviele Bits zusätzlich*/
+                                  /* z.B. besitzt CRANACH Studio     */
+                                  /* zu jedem Bild 2 Masken. Wird    */
+                                  /* eine Bitmap gescant, so benötigt*/
+                                  /* das Programm nicht nur 1 BIT pro*/
+                                  /* Pixel, sonder drei Bit          */
+                                  /* Analog dazu müßten bei einem    */
+                                  /* Grautonbild 8 + 2 = 10 Pixel    */
+                                  /* berechnet werden. Sollte dieser */
+                                  /* Wert nicht beachtet werden, so  */
+                                  /* kann es nach dem Scannen passieren*/
+                                  /* daß CRANACH Studio das Fenster  */
+                                  /* nicht öffnen kann, da zwar für  */
+                                  /* das gescannte Bild Speicher vor-*/
+                                  /* handen ist, nicht aber für die  */
+                                  /* notwendigen Masken.             */
+                                  /* gebraucht werden, z.B. zwei     */
+                                  /* zusätzliche Bits für die Maske  */
+   void *Dchange_pointer;         /* Zeiger auf diese Funktion       */
+   void *Dupdate;                 /* Zeiger auf jene Funktion;       */
+   int  lesen;                    /* Lesebufferindex virtuell        */
+   int  schreiben;                /* Schreibbufferindex virtuell         */
+   int  virt_flag;                /* flag, ob virtuell gearbeitet wird   */
+} SCANCOM;
+SCANCOM scancom;
+
+void *Dchange_pointer(
+                        void *pointer,
+                         int v_handle,
+                         int richtung,
+                         long *max_vor,
+                         long *max_zurueck
+                       );
+
+
+void Dupdate(int v_handle);
+
+
+Alle tms Produkte arbeiten mit einer virtuellen Speicherverwaltung.
+Dies bedeutet, es muß auf nicht im RAM befindliche Speicherbereiche
+zugegriffen werden. Die in tms- Produkte implementierte virtuelle
+Speicherverwaltung wurde für die Belange von Bildern optimiert.
+
+Allg. vorgehensweise: Der Treiber übergibt in scancom.schreiben eine
+virtuelle Handle. Mit dieser Handle kann nun auf die virtuellen Daten
+zugegriffen werden. Die Daten werden automatisch von der Platte,
+wenn nötig, nachgeladen und gespeichert.
+
+Eine mögliche Anwendung wäre:
+
+UCHAR *real;
+long max_vor, max_zurueck;
+
+scancom->vspeicher zeigt auf den freien virtuellen Speicher.
+Dieser ist wie ein normaler Speicher zu betrachten,
+also z.B. freier Speicher von Adrr 16MB bis Adrr 50MB
+mit scancom->vspeicher = Adrr 30MB
+Da diese Adresse nicht wirklich existiert, muss der Pointer
+auf einen realen Speicher abgebildet werden, und die Daten auf der
+Platte geladen werden. das erledigt die Funktion Dchange_pointer.
+
+ real = (UCHAR*)Dchange_pointer(
+                                   scancom->vspeicher,
+                                   scancom->schreiben,
+                                   VOR,
+                                   &max_vor,
+                                   &max_zurueck
+                                 );
+
+real zeigt jetzt also auf einen RAM- Bereich.
+
+scancom->schreiben ist die vom Programm übergebene Speicherhandle
+
+VOR sagt der Speicherverwaltung, daß wir uns vor allem nach vorne
+im Speicher bewegen werden. Somit können die Plattenzugriffe optimiert
+werden.
+
+max_vor liefert zurück, wieviele Bytes ab real im Speicher nach vorne
+gelaufen werden darf.
+
+max_zurück liefert zurück, wieviele Bytes ab real im Speicher nach
+hinten gelaufen werden darf.
+
+Werden diese Grenzen erreicht, so muß Dchange_pointer erneut aufgerufen
+werden. Die Mindestlänge für max_vor und max_zurück:
+                    VOR           ZURÜCK                    MITTE
+max_vor:            32k             0k                       16k
+max_zurück:         0k              32k                      16k
+
+Der Ram Speicher ist in 6 Blöcke unterteilt, von denen jeder einen
+unterschiedlichen oder aber auch einen Überlappenden Teil des virtuellen
+Speichers abbilden kann. Um beim Überlappen von Blöcken zu gewährleisten,
+das nach einer Speicheränderung alle Blöcke den aktuellen Speicherinhalt
+wiedergeben, wird die Funktion Dupdate(scancom->schreiben) aufgerufen.
+Diese aktualisiert die anderen Blöcke. Dupdate ist aber nur nötig bevor
+auf einen anderen Block zugegriffen wird. Für einen Scannertreiber der nur
+den Block scancom->schreiben benutzt reicht es deshalb am Schluss des
+Scannens Dupdate(scancom->schreiben) aufzurufen.
+
+Beispiel löschen von 10Mb ab Adresse 32MB
+
+v_pointer=32Mb
+size=10Mb
+
+while(size>0)
+{
+        real=Dchange_pointer(
+                              v_pointer,
+                              scancom->schreiben,
+                              VOR,
+                              &max_vor,
+                              &max_zurueck);
+        if(max_vor<=size)
+        {
+                memset(real,0,max_vor);
+                size-=max_vor;
+                v_pointer+=max_vor;
+        }
+        else
+        {
+                memset(real,0,size);
+                size=0;
+                v_pointer+=size;
+        }
+}
+Dupdate(scancom->schreiben);  !!!!!!!!!!!!!
+
+
+
+***************************************************************************
+Alte Programme rufen den Scanner mit dem Befehl 0x100 (und nicht 0x200)
+auf. Diese Programme (z.B. tms CRANACH) nutzen noch keine virtuelle
+Speicherverwaltung. Daher ist die Structure SCANCOM ab der gekennzeichneten
+Stelle nicht definiert. Die Funktionen Dchange_pointer bzw. Dupdate
+sollten dann durch dummy_Funktionen im Treiber ersetzt werden.
+
+/********************************************************************/
+
+mögliche Anwendung als ACC.
+
+/********************************************************************/
+/*    main()                                                        */
+/*                                                                  */
+/*    Kernstück des Programms.                                      */
+/********************************************************************/
+
+int main( void )
+{
+        int work_in[12],work_out[58],dummy;
+        int buffer[20];
+
+   appl_id = appl_init();
+
+        /* öffnen eine eigenen Workstation */
+        handle=graf_handle(&dummy,&dummy,&dummy,&dummy);
+   for(dummy=0;dummy<10;work_in[dummy++]=1);
+        work_in[10]=2;
+        v_opnvwk(work_in,&handle,work_out);
+
+   if(!rsrc_load("SCANNER.RSC"))
+   {
+      form_alert(0,NO_RSC_FILE);
+      goto FOREVER;
+   }
+
+   if( appl_id != -1 )
+   {
+      if( !_app )
+      {
+         scanner_moeglichkeiten();
+         menu_id = menu_register( appl_id, "  SCANNER" );
+         event_loop();   /* hier wird auf den Aufruf des Treibers */
+                         /* durch das Programm gewartet, der      */
+                         /* Dialog wird geführt, das Bild gescannt*/
+                         /* und die Werte in der
+      }
+
+   }
+FOREVER: /* Initialisierung hat nicht geklappt */
+   while(1)
+        evnt_mesag((int*)buffer);
+}
+
+/********************************************************************/
+/* Scanner initialisieren                                         */
+/********************************************************************/
+
+void scanner_moeglichkeiten()
+{
+        long
+                **zeiger;
+        long
+                stack;
+
+/********** Zeiger auf GDPS verbiegen *******************************/
+
+        stack=Super(0);
+
+        zeiger = (long **)0x41c;
+
+        if(*(*zeiger+1)== 0x47445053l)
+                header.next = *zeiger;
+        else
+                header.next = NULL;
+
+        *zeiger = (void *)&header;
+
+        Super((void *)stack);
+
+/********************************************************************/
+
+        sprintf(header.kennung,"GDPS");
+        header.version          =100;
+        header.typ              =0;          /* scanner */
+        header.info             =info;
+        header.copyright        =copyright;
+        header.gerbesch         =1 | 2 | 4;  /* Gerätebeschreibungsflags */
+        header.farben           =1;          /* Anzahl der Farben 0=SW   */
+        header.deep             =1 | 16;     /* mögliche Bittiefen       */
+        header.free             =0;
+        header.befehl           =0;          /* Kommando an Scanner      */
+        header.command          =&command;
+
+}
+
+
+ +Home +ProtokolleProtokolle +Font-ProtokollFont-Protokoll +LTL-ProtokollLTL-Protokoll + + diff --git a/de/proto_ltl.html b/de/proto_ltl.html new file mode 100644 index 000000000..404b0240b --- /dev/null +++ b/de/proto_ltl.html @@ -0,0 +1,477 @@ + + + + + +Die Anleitung zum TOS: LTL-Protokoll + + + + + + + + + +Home +ProtokolleProtokolle +GDPS: Gerti's Driver Piping SystemGDPS: Gerti's Driver Piping System +OLGA-ProtokollOLGA-Protokoll + +
+ +

15.7 LTL-Protokoll

+

Bei den meisten Compilersprachen wird ein Programm zunächst +compiliert (d.h. vom Quelltext in den Maschinencode übersetzt) und +dann gelinkt (d.h. mit anderen Programmteilen und +Bibliotheksfunktionen zusammengefügt und als Programmdatei +abgespeichert) bevor es ausgeführt werden kann. Beim +Load-Time-Linking (kurz LTL) spart man sich den letzten Schritt +auf, bis das Programm ausgeführt werden soll. Erst dann fügt der +sogenannte Loader das Programm zusammen, ohne es jedoch als +Programmdatei abzuspeichern. Der Linkvorgang findet also im +Hauptspeicher, unmittelbar vor der Ausführung des Programms, statt. +

+

Dieser Text beschreibt ein Protokoll, über das eine Shell mit +einem Loader, also einem Program, das Load-Time-Linking implementiert, +kommunizieren kann. Dieses Protokoll wurde erstmals von der +Entwicklungsumgebung Chatwin und dem Oberon-System STJ-Oberon-2 +verwendet. Das Protokoll ist aber so gehalten, daß es prinzipiell +auch von anderen Shells und Loadern verwendet werden kann. +

+ +
+ +

15.7.1 Der OBNL-Cookie

+

Die Kommunikation zwischen Shell und Loader geschieht über +einen Cookie namens OBNL. Dieser zeigt auf eine Routine, über +die die Shell den Loader aufrufen kann. Folglich muß der Cookie vom +Loader angelegt werden. +

+

Die Routine, auf die der OBNL-Cookie zeigt, ist wie folgt +deklariert: +

+
+
int cdecl obnload ( OBNCOMM *com );
+
+
+

D.h. daß der Routine auf dem Stack ein Zeiger auf eine Struktur +OBNCOMM übergeben wird und daß die Routine einen 16-Bit-Wert +im Register D0 zurückliefert. +

+ +

15.7.2 Die OBNCOMM-Struktur

+

Die Struktur OBNCOMM hat folgenden Aufbau: +

+
+
typedef struct _obncomm
+{
+  int   type;
+  void *ptr;
+  int   chr;
+  void *env;
+} OBNCOMM;
+
+
+

Das Feld `type' enthält jeweils eine Nachrichtennummer. +In Abhängigkeit von dieser Nummer sind dann die anderen Einträge der +Struktur belegt. +

+

int ist eine vorzeichenbehaftete 16-Bit-Zahl, +void * ist ein Zeiger auf irgendwas, d.h. es ist +zunächst nicht genauer spezifiziert, auf welche Art von Daten der +Zeiger zeigt. +

+

15.7.3 Nachrichten der Shell an den Loader

+

Die Shell kann die folgenden Nachrichten an den Loader senden: +

+
+
+ + + + + + + + + + + + + + + + +
NachrichtNummer
CL_INIT0x6500
CL_COMMAND0x6501
CL_TIME0x6502
+
+ +
+
+

Nachrichten von der Shell an den Loader beginnen immer mit +CL_. +

+

Bitte beachten: Es handelt sich hierbei nicht um +AES-Nachrichten! Die Kommunikation geschieht über die Routine, auf die +der OBNL-Cookie zeigt. +

+

15.7.3.1 CL_INIT

+

Über die Nachricht CL_INIT teilt die Shell dem Loader +mit, daß sie das LTL-Protokoll unterstützt. Gleichzeitig übergibt +sie dem Loader die Adresse einer Funktion, über die der Loader +bestimmte Aktionen in der Shell auslösen kann. +

+

Die Funktion in der Shell hat die gleichen Parameter wie die +Funktion, auf die der OBNL-Cookie zeigt: +

+
+
int cdecl obnshell ( OBNCOMM *com );
+
+
+
+

Belegung der OBNCOMM-Struktur: +

+ + + + + + + + + + + + +
type CL_INIT +
  +
ptr Adresse der Funktion in der Shell +
  +
chr undefiniert +
  +
env undefiniert +
  + +
+ +

15.7.3.2 CL_COMMAND

+

Die Shell soll ein Kommando ausführen, das ein +Load-Time-Linking erfordert. Sie reicht daraufhin das komplette +Kommando an den Loader weiter. +

+
+

Belegung der OBNCOMM-Struktur: +

+ + + + + + + + + + + + +
type CL_COMMAND +
  +
ptr Zeiger auf einen nullterminierten String, der das gesamte +eingegebene Kommando (also inkl. Parameter) enthält. +
  +
chr undefiniert +
  +
env Zeiger auf das Environment. +
  + +
+ +

15.7.3.3 CL_TIME

+

Wenn längere Zeit keine Benutzereingaben vorliegen und die +Shell auch sonst nichts zu tun hat, so kann sie den Loader +benachrichtigen, damit dieser evtl. Arbeiten im Hintergrund erledigen +kann. +

+
+

Belegung der OBNCOMM-Struktur: +

+ + + + + + + + + + + + +
type CL_TIME +
  +
ptr undefiniert +
  +
chr undefiniert +
  +
env undefiniert +
  + +
+ +

15.7.4 Nachrichten des Loaders an die Shell

+

Der Loader kann folgende Nachrichten an die Shell schicken: +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
NachrichtNummer
LC_WRCHAR0x6503
LC_WRSTR0x6504
LC_OUTBUF0x6505
LC_CLOSEWIN0x6506
LC_OPENWIN0x6507
+
+ +
+
+

Nachrichten von dem Loader an die Shell beginnen immer mit +LC_. +

+

Bitte beachten: Es handelt sich hierbei nicht um +AES-Nachrichten! Die Kommunikation geschieht über die Routine, die die Shell +dem Loader bei CL_INIT mitgeteilt hat. +

+

15.7.4.1 LC_WRCHAR

+

Der Loader schickt der Shell ein Zeichen, das in der Console +ausgegeben werden soll. +

+
+

Belegung der OBNCOMM-Struktur: +

+ + + + + + + + + + + + +
type LC_WRCHAR +
  +
ptr undefiniert +
  +
chr das auszugebende Zeichen +
  +
env undefiniert +
  + +
+ +

15.7.4.2 LC_WRSTR

+

Der Loader schickt der Shell einen nullterminierten String, der +in der Console ausgegeben werden soll. +

+
+

Belegung der OBNCOMM-Struktur: +

+ + + + + + + + + + + + +
type LC_WRSTR +
  +
ptr Zeiger auf den auszugebenden String +
  +
chr undefiniert +
  +
env undefiniert +
  + +
+ +

15.7.4.3 LC_OUTBUF

+

Der Loader weist die Shell an, evtl. noch gepufferte Zeichen +jetzt in der Console auszugeben. +

+
+

Belegung der OBNCOMM-Struktur: +

+ + + + + + + + + + + + +
type LC_OUTBUF +
  +
ptr undefiniert +
  +
chr undefiniert +
  +
env undefiniert +
  + +
+ +

15.7.4.4 LC_CLOSEWIN

+

Der Loader weist die Shell an, alle evtl. gerade offenen Fenster +zu schließen. Dieser Aufruf wird beim Start eines GEM-Moduls unter +SingleTOS benötigt. +

+
+

Belegung der OBNCOMM-Struktur: +

+ + + + + + + + + + + + +
type LC_CLOSEWIN +
  +
ptr undefiniert +
  +
chr undefiniert +
  +
env undefiniert +
  + +
+ +

15.7.4.5 LC_OPENWIN

+

Der Loader weist die Shell an, alle zuvor bei +LC_CLOSEWIN geschlossenen Fenster wieder zu öffnen. +

+
+

Belegung der OBNCOMM-Struktur: +

+ + + + + + + + + + + + +
type LC_OPENWIN +
  +
ptr undefiniert +
  +
chr undefiniert +
  +
env undefiniert +
  + +
+ +

15.7.5 Beispiel: Chatwin und STJ-Oberon-2

+

Als Beispiel soll hier kurz aufgeführt werden, wie Chatwin +(Shell) und STJ-Oberon-2 (Loader) das LTL-Protokoll implementieren: +

+
    +
  • Der Oberon-Loader richtet den OBNL-Cookie ein und +startet dann Chatwin nach. +
      +

  • +
  • Chatwin erkennt am Vorhandensein des Cookies, daß LTL +gewünscht ist und meldet sich mit dem Aufruf CL_INIT beim +Loader an. Dabei übergibt Chatwin einen Zeiger auf eine Funktion, +über die der Loader wiederum Aktionen in Chatwin auslösen kann. +
      +

  • +
  • Wann immer Chatwin nun angewiesen wird, eine Datei mit der +Extension *.OBJ zu starten, übergibt er diese Datei und die +evtl. übergebenen Parameter mittels der Nachricht CL_COMMAND +an den Loader. +
      +
    Der Loader muß nun das Programm starten. Handelt es sich um ein +TOS-Programm, so kann er die Ausgaben dieses Programms über die +Nachrichten LC_WRCHAR und LC_WRSTR in das Console-Fenster +von Chatwin ausgeben lassen. Handelt es sich um ein GEM-Programm, +so kann der Loader Chatwin unter SingleTOS dazu auffordern, alle seine +Fenster zu schließen (Nachricht LC_CLOSEWIN), bevor das +Programm gestartet wird. +
      +
    Anmerkung: Chatwin erkennt anhand der Extension, ob für +eine Datei ein Load-Time-Linking durchzuführen ist. In älteren +Versionen ist die Extension *.OBJ fest vorgegeben, ab Chatwin +3.04 kann die Extension in der Environmentvariablen $LTLEXT +angegeben werden. Dadurch ist Chatwin auch für andere Sprachen +gerüstet, die nicht *.OBJ als Extension für die Objektfiles +verwenden. +
      +

  • +
  • Wenn längere Zeit keine Benutzereingaben und auch keine +sonstigen Aufgaben anliegen, gibt Chatwin Zeit an den Loader ab, indem +er die Nachricht CL_TIME schickt. Der Loader kann dadurch +bestimmte Aufgaben im Hintergrund erledigen. +
      +

  • +
  • Für das Programmende gibt es kein spezielles Protokoll: Wenn +Chatwin beendet wird, beendet sich auch der Loader. +
      +

  • +
+ +
+ +Home +ProtokolleProtokolle +GDPS: Gerti's Driver Piping SystemGDPS: Gerti's Driver Piping System +OLGA-ProtokollOLGA-Protokoll + + diff --git a/de/proto_olga.html b/de/proto_olga.html new file mode 100644 index 000000000..cc9971eb6 --- /dev/null +++ b/de/proto_olga.html @@ -0,0 +1,2127 @@ + + + + + +Die Anleitung zum TOS: OLGA-Protokoll + + + + + + + + + +Home +ProtokolleProtokolle +LTL-ProtokollLTL-Protokoll +SE-ProtokollSE-Protokoll + +
+ +

15.8 OLGA-Protokoll

+ + +

Das OLGA-Protokoll (Object Linking for GEM-Applications) +wurde von Thomas Much entwickelt, und ermöglicht Object +Linking auch unter GEM. +

+

Da dieses Konzept vielleicht nicht allen Lesern bekannt ist, +zunächst ein mögliches Anwendungsbeispiel: Stellen Sie sich vor, +Sie benutzen Ihre Textverarbeitung und möchten ein Dokument durch +eine Grafik etwas auflockern. Nachdem Sie die Grafik im Text plaziert +haben, entscheiden Sie sich, diese noch geringfügig zu verändern. +Normalerweise wechseln Sie dazu in das Grafikprogramm, nehmen dort die +nötigen Änderungen vor, wechseln zurück in die Textverarbeitung, +verwerfen die alte Grafik, importieren und plazieren die neue. Würden +beide Applikationen (d.h. Grafikprogramm und Textverarbeitung) das +OLGA-Protokoll unterstützen, könnte die Lösung dieser Aufgabe +jedoch wie folgt aussehen: Sie wechseln in das Grafikprogramm, +modifizieren dort die Grafik und nach dem Abspeichern sind Sie fertig! +Die Textverarbeitung erkennt automatisch, daß die Grafik +verändert wurde, und liest diese lebstständig ein! +

+

Das obige Beispiel setzt dabei ein Multitasking-Betriebssystem +wie MagiC oder MultiTOS voraus. Und in der Tat: Single-TOS-Systeme +werden von OLGA nicht (mehr) unterstützt. Wer sich näher mit dem +OLGA-Protokoll beschäftigen möchte, sollte die folgenden Punkte +beachten: +

+ + +

OLGA arbeitet dokumentenzentriert, d.h. das Protokoll +ist darauf vorbereitet, daß eine Applikation mehrere Dokumente (evtl. +sogar mit komplett verschiedenen Datentypen) verwalten kann. Zur Steuerung +des Object-Linkings wird ein sogenannter OLGA-Manager (kurz: +Manager) eingesetzt. Die Kommunikation zwischen den Applikationen wird +komplett über diesen Manager abgewickelt, vom dem es übrigens immer +nur einen im System geben kann. +

+

Das Bild zeigt eine einfach OLGA-Verbindung +

+

+

Das eigentliche Object-Linking wird bei OLGA durch sogenannte +Links realisiert: dies sind Referenzen des Clients auf +Datenobjekte, oder genauer: Dateinamen mit absolutem Pfad. +Wird nun vom Server ein Objekt geändert, auf das ein Link besteht, so +wird der Client (vom Manager) davon unterrichtet, und kann das +geänderte Objekt neu darstellen. +

+

From Rev 1.2 (1996-11-20) onwards, extra functions were added +and the OLGA architecture model now looks like this: +

+

+

The above illustration shows the distribution of services +between the OLGA-Manager and the applications using it (i.e. Client or +Server). During linking, InplaceDrawing and Notification, the correct +balance of communication between Manager and application for the +embedding is the sole responsibility of the Client application. +

+

Finally, the Info files are co-ordinated by the Manager but then +operate directly between Server and Client applications. Schematically +communications are handled something like this: +

+

+

Querverweis: AV-Protokoll   Drag&Drop-Protokoll +

+

15.8.1 OLGA-Initialisierung

+

Initialisierung und Terminierung bei OLGA +

+

Das OLGA-Protokoll entspricht dem OLE-Protokoll, welches Object +Embedding mit OEP (Object Exchange Protocol) und Objekt Linking mit +OLGA ermöglicht. Da es sehr sinnvoll sein kann, beide Varianten in +einer Applikation zu unterstützen, werde beide Protokolle (d.h. +OLGA und OEP) mit denselben Nachrichten evtl. gleichzeitig (!) +initialisiert. Die notwendigen Routinen um sich an- bzw. abzumelden +lauten: +

+
    +
  • OLE_EXIT     Aus dem Protokoll ausklinken. +
  • +
  • OLE_INIT     Applikation beim Manager anmelden. +
  • +
  • OLE_NEW      Manager wurde nachgestartet. +
  • +
  • OLGA_INIT    Bestätigung für Anmeldung per OLE_INIT. +
  • +
+ +

Wie bereits erwähnt erfolgt die Kommunikation zwischen den +OLGA-Applikationen über einen Manager, dessen AES-ID für den +Nachrichtenaustausch ermittelt werden muss. Das Kochrezept hierzu +lautet: +

+

Fall 1: Die Applikation benötigt OLE (d.h. OEP und +OLGA) +

+ + + + + + + + + + + + + +
(a) Den Manager per appl_find ("OLEMANGR") suchen. War die +Suche erfolgreich, so ist man bereits fertig. +
  + + +
(b) Ansonsten sollte man die Environmentvariable OLEMANAGER +inspizieren, die einen kompletten Zugriffspfad auf den Manager +enthalten kann. Aus diesem Pfad extrahiert man dann zunächst den +eigentlichen Programmnamen für appl_find, und geht dann wie unter (a) +beschrieben vor. Wenn auch dies nicht zum Erfolg führt, sollte man +das durch OLEMANAGER spezifizierte Programm per shel_write +nachstarten. +
  + +
(c) Wenn alle bisherigen Anstrengungen nicht zum gewünschten +Ergebnis geführt haben, gibt es offenbar keinen OLE-Manager, +und man muss sich evtl. mit dem reinen OLGA-Protokoll begnügen. In diesem +Fall führt man analog zu (a) ein appl_find ("OLGA ") +und ein appl_- find ("OEP_SERV") aus; evtl. müssen +nämlich nun zwei Manager unterstützt werden! +
  + + + + +
(d) Sollte auch die letzte Aktion keinen Erfolg gebracht haben, so +sollten noch die Environmentvariablen OLGAMANAGER und OEPMANAGER (wie +unter (b)) ausgewertet werden. +
  + +
+ +

Fall 2: Die Applikation benötigt nur OLGA +

+
+

In diesem Fall geht man wie unter dem ersten Punkt beschrieben +vor, allerdings ändert sich die Reihenfolge der Aktionen zu +(c),(d),(a) und (b). Natürlich brauchen OEP_SERV und OEPMANAGER in +diesem Fall nicht abgefragt zu werden, da es unwahrscheinlich +ist, dass ein OEP-Server das OLGA-Protokoll versteht. +

+
+

Querverweis: OLGA-Protokoll   AV-Protokoll   +Drag&Drop-Protokoll +

+

15.8.2 OLGA-Client

+

Die folgenden Nachrichten können von einem OLGA-Client +verschickt bzw. empfangen werden: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OLGA_CLOSEDOC Schließen eines Dokumentes anzeigen. +
OLGA_GETINFO Indexnummer für eine Info-Datei ermitteln. +
OLGA_LINK Einbindung einer Datei in ein Dokument anzeigen. +
OLGA_LINKBROKEN Referenz auf ein Objekt steht nicht mehr zur Verfügung. +
OLGA_LINKRENAMED Referenz auf ein Objekt wurde aktualisiert. +
OLGA_OPENDOC Dokument beim Manager anmelden. +
OLGA_RENAMELINK Referenz auf ein Objekt aktualisieren. +
OLGA_START Server für einen Client nachstarten. +
OLGA_UPDATED Server hat eine Datei verändert. +
OLGA_UNLINK Überwachung einer Datei beenden. + +
+ +

Achtung: An dieser Stelle sei darauf hingewiesen, daß +im Hinblick auf zukünftige Betriebssystem-Versionen zur Kommunikation +zwischen verschiedenen Programmen benutzte oder über Zeiger +zugewiesene Speicherbereiche global sein müssen (Mxalloc-Funktion mit +Global-Flag). Andernfalls wird es beim Einsatz auf Rechnern mit PMMU +(z.B. Atari-TT oder Falcon) zu Speicherschutzverletzungen kommen. +

+

Querverweis: minimale Anforderungen   OLGA-Protokoll   OLGA-Server +

+

15.8.3 OLGA-Server

+

Die folgenden Nachrichten können von einem OLGA-Server +verschickt bzw. empfangen werden: +

+ + + + + + + + + + + + +
OLGA_BREAKLINK Link auf ein Objekt aufheben. +
OLGA_INFO Antwort auf eine OLGA_GETINFO-Nachricht. +
OLGA_RENAME Namensänderung eines Objektes mitteilen. +
OLGA_UPDATE Änderung an einem Objekt mitteilen. + +
+ +

Achtung: An dieser Stelle sei darauf hingewiesen, daß +im Hinblick auf zukünftige Betriebssystem-Versionen zur Kommunikation +zwischen verschiedenen Programmen benutzte oder über Zeiger +zugewiesene Speicherbereiche global sein müssen (Mxalloc-Funktion mit +Global-Flag). Andernfalls wird es beim Einsatz auf Rechnern mit PMMU +(z.B. Atari-TT oder Falcon) zu Speicherschutzverletzungen kommen. +

+

Querverweis: minimale Anforderungen   OLGA-Protokoll   OLGA-Client +

+

15.8.4 OLGA_BREAKLINK

+ + + + + + + + + + + + + + + +
Name: »OLGA_BREAKLINK« - Link auf ein Objekt aufheben. +
  +
Nummer: 0x1244 +
  +
Beschreibung: Diese Nachricht wird vom Server an den Manager geschickt wenn +er eine Datei löscht, oder anderweitig für den Client unbrauchbar +macht. +
  +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
Word 0Nachrichtennummer (0x1244)
Word 1AES-Kennung des eigenen Programms
Word 20
Word 3+4Zeiger auf den absoluten Dateinamen
Word 50
Word 60
Word 70
+
+ +
Hinweis: Der Manager informiert anschließend alle +Clients, die einen Link auf diese Datei gesetzt hatten. +
  +
Der Server erhält anschließend eine Antwort vom Manager, damit +er sicher sein kann, das seine Absicht verstanden worden ist. +
  +
Gruppe: OLGA-Server +
  +
Querverweis: OLGA_INFO   OLGA_RENAME   OLGA_UPDATE +
  + +
+ +

15.8.4.1 OLGA_BREAKLINK, Antwort auf

+

Diese Nachricht erhält der Server als Antwort auf eine +verschickte OLGA_BREAKLINK-Message: +

+
Word 0   = OLGA_ACK (0x1239)
+Word 1   = apID
+Word 2   = 0
+Word 3+4 = exakt dieselben Werte von OLGA_BREAKLINK
+Word 5   = 0
+Word 6   = 0
+Word 7   = OLGA_BREAKLINK
+
+

15.8.5 OLGA_INFO

+ + + + + + + + + + + + + + + +
Name: »OLGA_INFO« - Antwort auf eine OLGA_GETINFO-Message. +
  +
Nummer: 0x1248 +
  +
Beschreibung: Diese Nachricht ist als Antwort auf OLGA_GETINFO zu verstehen, +und wird vom Server direkt an den Client geschickt. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
Word 0Nachrichtennummer (0x1248)
Word 1AES-Kennung des eigenen Programms
Word 20
Word 3+4Zeiger auf absoluten Info-Dateinamen
Word 5Index-Nummer der Info-Datei
Word 60
Word 70
+
+ +
Hinweis: Vor dem Verschicken der Nachricht muss der +Server evtl. die zugehörige Info-Datei aufbauen, sofern diese nicht +bereits vorhanden ist. Ein Client darf sich jedoch nicht auf +das Eintreffen dieser Antwort verlassen, denn der Server könnte ja +inzwischen terminiert sein; außerdem darf er nur lesend auf +die Datei zugreifen. +
  +
Sobald der Client die Info-Datei wieder geschlossen hat, schickt +er eine Antwort an den Server, damit dieser die Datei evtl. wieder +löschen kann. +
  +
Gruppe: OLGA-Server +
  +
Querverweis: OLGA_BREAKLINK   OLGA_RENAME   OLGA_UPDATE +
  + +
+ +

15.8.5.1 OLGA_INFO, Antwort auf

+

Diese Nachricht erhält der Server als Antwort auf eine +verschickte OLGA_INFO-Message: +

+
Word 0   = OLGA_ACK (0x1239)
+Word 1   = apID
+Word 2   = 0
+Word 3+4 = exakt dieselben Werte von OLGA_INFO
+Word 5   = Index-Nummer der Info-Datei
+Word 6   = 0
+Word 7   = OLGA_INFO
+
+

15.8.6 OLGA_RENAME

+ + + + + + + + + + + + + + + +
Name: »OLGA_RENAME« - Namensänderung eines Objektes mitteilen. +
  +
Nummer: 0x123a +
  +
Beschreibung: Diese Nachricht wird vom Server an den Manager geschickt, falls +der Benutzer eine Datei im Server umbenannt oder verschoben hat. Es +gilt +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
Word 0Nachrichtennummer (0x123a)
Word 1AES-Kennung des eigenen Programms
Word 20
Word 3+4Zeiger auf alten absoluten Dateinamen
Word 5+6Zeiger auf neuen absoluten Dateinamen
Word 70
+
+ +
Hinweis: Es liegt im Ermessen des Servers, ob er nach +dem Befehl 'Speichern als...' diese Nachricht verschickt. Sinnvoll +wäre dies auf jedenfall, wenn der Server die neue Pfadangabe bzw. den +neuen Dateinamen für das Dokument übernimmt. Nach Möglichkeit +sollten Links zwar immer nur für Dateien auf nicht +wechselbaren Medien bestehen, in der Praxis dürfte dies aber wohl +kaum durchzuhalten sein. Falls der Inhalt der Datei verändert wurde, +muss zusätzlich noch die Nachricht OLGA_UPDATE verschickt werden. +
  +
Der Server erhält anschließend eine Antwort, auf die er z.B. +mit der Freigabe des alten Speicherplatzes reagieren kann. Die +Bestätigung bedeutet übrigens nur, daß der Manager das Umbenennen +weitergemeldet hat; reagiert ein Client nicht darauf, so ist der +entsprechende Link tot, d.h. er kann nicht weiter überwacht werden! +
  +
Gruppe: OLGA-Server +
  +
Querverweis: OLGA_BREAKLINK   OLGA_INFO   OLGA_UPDATE +
  + +
+ +

15.8.6.1 OLGA_RENAME, Antwort auf

+

Diese Nachricht erhält der Server als Antwort auf eine +verschickte OLGA_RENAME-Message: +

+
Word 0   = OLGA_ACK (0x1239)
+Word 1   = apID
+Word 2   = 0
+Word 3+4 = exakt dieselben Werte von OLGA_RENAME
+Word 5+6 = exakt dieselben Werte von OLGA_RENAME
+Word 7   = OLGA_RENAME
+
+

15.8.7 OLGA_UPDATE

+ + + + + + + + + + + + + + + +
Name: »OLGA_UPDATE« - Änderung an einem Objekt mitteilen. +
  +
Nummer: 0x1238 +
  +
Beschreibung: Diese Nachricht muss vom Server an den Manager geschickt +werden, wenn er eine Datei abgespeichert hat. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
Word 0Nachrichtennummer (0x1238)
Word 1AES-Kennung des eigenen Programms
Word 20
Word 3+4Zeiger auf Dateinamen incl. absolutem
 Pfad
Word 50, oder eine Server-Interne (eindeutige)
 Index-Nummer, falls eine Info-Datei zur
 Verfügung steht bzw. erzeugt werden kann
Word 60
Word 70
+
+ +
Hinweis: Die Bearbeitung erfolgt z.Zt. nicht +Case-Sensitiv, d.h. die Groß- bzw. Kleinschreibung des Dateinamens +wird ignoriert, damit das Linking nicht an unterschiedlichen +Benutzereingaben scheitert. Dies wird in späteren Versionen +(Stichwort: alternative Dateisysteme) allerdings nicht mehr der Fall sein. +
  +
Der Server erhält anschließend eine Antwort, auf die er z.B. +mit der Freigabe des für den Dateinamen reservierten Speichers +reagieren kann. +
  +
Gruppe: OLGA-Server +
  +
Querverweis: OLGA_BREAKLINK   OLGA_INFO   OLGA_RENAME +
  + +
+ +

15.8.7.1 OLGA_UPDATE, Antwort auf

+

Diese Nachricht erhält der Server als Antwort auf eine +verschickte OLGA_UPDATE-Message: +

+
Word 0   = OLGA_ACK (0x1239)
+Word 1   = apID
+Word 2   = 0
+Word 3+4 = exakt dieselben Werte von OLGA_UPDATE
+Word 5   = 0
+Word 6   = 0
+Word 7   = OLGA_UPDATE
+
+

15.8.8 OLGA_CLOSEDOC

+ + + + + + + + + + + + + + + +
Name: »OLGA_CLOSEDOC« - Schließen eines Dokumentes anzeigen. +
  +
Nummer: 0x123c +
  +
Beschreibung: Diese Nachricht sollte vom Client an den OLGA-Manager geschickt +werden, wenn ein Dokument geschlossen wird. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
Word 0Nachrichtennummer (0x123c)
Word 1AES-Kennung des eigenen Programms
Word 20
Word 30
Word 40
Word 5Gruppenkennung des Dokumentes
Word 60
Word 70
+
+ +
Hinweis: Der Manager kann dann alle Links mit der +entsprechenden Gruppennummer löschen. Dies könnte zwar auch mit +einzelnen OLGA_UNLINK-Aufrufen realisiert werden, jedoch können so +die Manager-Internen-Strukturen einfacher freigegeben werden. +
  +
Die Nachricht darf beim Programmende nicht verwendet +werden, da durch OLE_EXIT bereits alle nötigen Aktionen vorgenommen +werden. Als Antwort erhält der Client eine einfache Bestätigung. +
  +
Gruppe: OLGA-Client +
  +
Querverweis: OLGA_GETINFO   OLGA_LINK   OLGA_LINKBROKEN   OLGA_OPENDOC   +OLGA_LINKRENAMED   OLGA_START   OLGA_UPDATED   OLGA_UNLINK +
  + +
+ +

15.8.8.1 OLGA_CLOSEDOC, Antwort auf

+

Diese Nachricht erhält ein Client als Antwort auf eine +verschickte OLGA_CLOSEDOC-Message: +

+
Word 0   = OLGA_ACK (0x1239)
+Word 1   = apID
+Word 2   = 0
+Word 3   = 0
+Word 4   = 0
+Word 5   = Gruppenkennung des Dokumentes
+Word 6   = 0
+Word 7   = OLGA_CLOSEDOC
+
+

15.8.9 OLGA_GETINFO

+ + + + + + + + + + + + + + + +
Name: »OLGA_GETINFO« - Indexnummer für eine Info-Datei ermitteln. +
  +
Nummer: 0x1247 +
  +
Beschreibung: Mit dieser Nachricht kann ein Client direkt beim Server eine +Index-Nummer für eine Info-Datei erfragen, wenn dieser eine solche +bei OLGA_UPDATE bekanntgegeben hat. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
Word 0Nachrichtennummer (0x1247)
Word 1AES-Kennung des eigenen Programms
Word 20
Word 30
Word 40
Word 5Index-Nummer der Info-Datei
Word 60
Word 70
+
+ +
Hinweis: Nach dem Empfang dieser Nachricht kann der +Server die entsprechende Datei aufbauen, sofern sie noch nicht +vorhanden ist. Zu beachten ist außerdem, daß die übergebene +Index-Nummer ungültig sein kann, und dann vom Server +ignoriert werden muss. +
  +
Gruppe: OLGA-Client +
  +
Querverweis: OLGA_CLOSEDOC   OLGA_LINK   OLGA_LINKBROKEN   OLGA_OPENDOC   +OLGA_LINKRENAMED   OLGA_RENAMELINK   OLGA_START   OLGA_UPDATED   +OLGA_UNLINK +
  + +
+ +

15.8.10 OLGA_LINK

+ + + + + + + + + + + + + + + +
Name: »OLGA_LINK« - Einbindung einer Datei in ein Dokument +anzeigen. +
  +
Nummer: 0x123d +
  +
Beschreibung: Diese Nachricht muss vom Client an den Manager geschickt +werden, wenn er eine Datei in eines seiner Dokumente eingebunden hat. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
Word 0Nachrichtennummer (0x123d)
Word 1AES-Kennung des eigenen Programms
Word 20
Word 3+4Zeiger auf einen absoluten Dateinamen
 der überwacht werden soll.
Word 5Gruppenkennung des Dokumentes
Word 60
Word 70
+
+ +
Hinweis: Wenn die angegebene Datei von einem OLGA-Server +verändert wird (oder eine AV_PATH_UPDATE-Message von einem Programm +empfangen wird, welches kein Server ist), erhält der Client eine +entsprechende OLGA_UPDATED-Nachricht. +
  +
Als Bestätigung erhalt der Client vom Manager eine +entsprechende Antwort. +
  +
Gruppe: OLGA-Client +
  +
Querverweis: OLGA_CLOSEDOC   OLGA_GETINFO   OLGA_LINKBROKEN   +OLGA_LINKRENAMED   OLGA_OPENDOC   OLGA_RENAMELINK   OLGA_START   +OLGA_UPDATED   OLGA_UNLINK +
  + +
+ +

15.8.10.1 OLGA_LINK, Antwort auf

+

Diese Nachricht erhält ein Client als Antwort auf eine +verschickte OLGA_LINK-Message: +

+
Word 0    = OLGA_ACK (0x1239)
+Word 1    = apID
+Word 2    = 0
+Word 3+4  = exakt dieselben Werte von OLGA_LINK
+Word 5    = Gruppenkennung des Dokumentes
+Word 6    = Fehler bei Wert 0, sonst Ok
+Word 7    = OLGA_LINK
+
+

15.8.11 OLGA_LINKBROKEN

+ + + + + + + + + + + + + + + +
Name: »OLGA_LINKBROKEN« - Referenz auf ein Objekt steht nicht mehr +zur Verfügung. +
  +
Nummer: 0x1245 +
  +
Beschreibung: Diese Nachricht erhält der Client vom Manager, wenn ihm eine +Datei nicht mehr zur Verfügung steht (z.B. weil sie gelöscht wurde). +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
Word 0Nachrichtennummer (0x1245)
Word 1AES-Kennung des eigenen Programms
Word 20
Word 3+4Zeiger auf alten absoluten Dateinamen
Word 5Gruppenkennung des Dokumentes
Word 60
Word 70
+
+ +
Hinweis: Der Client könnte daraufhin den Benutzer +informieren, oder auch per Dateiauswahl eine andere Datei auswählen lassen. +Außerdem sollte er den jetzt ungültigen Link mit einer +OLGA_UNLINK-Nachricht auflösen lassen. +
  +
Gruppe: OLGA-Client +
  +
Querverweis: OLGA_CLOSEDOC   OLGA_GETINFO   OLGA_LINK   OLGA_LINKRENAMED   +OLGA_OPENDOC   OLGA_RENAMELINK   OLGA_START   OLGA_UPDATED   +OLGA_UNLINK +
  + +
+ +

15.8.12 OLGA_LINKRENAMED

+ + + + + + + + + + + + + + + +
Name: »OLGA_LINKRENAMED« - Referenz auf ein Objekt wurde +aktualisiert. +
  +
Nummer: 0x1241 +
  +
Beschreibung: Diese Nachricht muss vom Client als Antwort auf eine +OLGA_RENAMELINK-Message an den Manager geschickt werden. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
Word 0Nachrichtennummer (0x1241)
Word 1AES-Kennung des eigenen Programms
Word 20
Word 3+4Zeiger auf alten absoluten Dateinamen
Word 5+6Zeiger auf neuen absoluten Dateinamen
Word 7Gruppenkennung des Dokumentes
+
+ +
Hinweis: Unterbleibt diese Antwort, so ist der +entsprechende Link tot, d.h. er kann nicht mehr überwacht +werden, da im Manager ja noch der alte Name gespeichert ist. +
  +
Gruppe: OLGA-Client +
  +
Querverweis: OLGA_CLOSEDOC   OLGA_GETINFO   OLGA_LINK   OLGA_LINKBROKEN   +OLGA_OPENDOC   OLGA_RENAMELINK   OLGA_START   OLGA_UPDATED   +OLGA_UNLINK +
  + +
+ +

15.8.13 OLGA_OPENDOC

+ + + + + + + + + + + + + + + +
Name: »OLGA_OPENDOC« - Dokument beim Manager anmelden. +
  +
Nummer: 0x123b +
  +
Beschreibung: Diese Nachricht kann vom Client an den Manager geschickt +werden, wenn ein Dokument geöffnet worden ist. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
Word 0Nachrichtennummer (0x123b)
Word 1AES-Kennung des eigenen Programms
Word 20
Word 30
Word 40
Word 5Gruppenkennung des Clients
Word 60
Word 70
+
+ +
Hinweis: Diese Nachricht dient z.Zt. nur zu +Informationszwecken; die benötigten internen Strukturen werden vom +Manager ansonsten beim Empfang der ersten OLGA_LINK Message angelegt. +Die Gruppenkennung ist eine innerhalb des Clients eindeutige, und von +diesem frei wählbare Zahl, mit der die Links innerhalb des Clients +den Dokumenten zugeordnet werden können; sie sollte nach Möglichkeit +stets angegeben werden. +
  +
Gruppe: OLGA-Client +
  +
Querverweis: OLGA_CLOSEDOC   OLGA_GETINFO   OLGA_LINK   OLGA_LINKBROKEN   +OLGA_LINKRENAMED   OLGA_RENAMELINK   OLGA_START   OLGA_UPDATED   +OLGA_UNLINK +
  + +
+ +

15.8.14 OLGA_RENAMELINK

+ + + + + + + + + + + + + + + +
Name: »OLGA_RENAMELINK« - Referenz auf ein Objekt aktualisieren. +
  +
Nummer: 0x1240 +
  +
Beschreibung: Diese Nachricht erhält der Client vom Manager, wenn der Server +eine Datei (auf die ein Link gesetzt ist) umbenannt oder verschoben +hat. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
Word 0Nachrichtennummer (0x1240)
Word 1AES-Kennung des eigenen Programms
Word 20
Word 3+4Zeiger auf alten absoluten Dateinamen
Word 5+6Zeiger auf neuen absoluten Dateinamen
Word 7Gruppenkennung des Dokumentes
+
+ +
Hinweis: Diese Nachricht soll den Client nur anweisen, +seine interne Referenz zu aktualisieren; das Dokument muss +nicht neu gezeichnet werden. Der Zeiger auf den neuen Namen +ist übrigens solange gültig, wie der Link besteht. +
  +
Als Antwort auf diese Nachricht muss der Client eine +OLGA_LINKRENAMED-Message an den Manager schicken, damit dieser seine +Referenz aktualisieren, und unnötigen Speicherplatz freigeben kann. +
  +
Gruppe: OLGA-Client +
  +
Querverweis: OLGA_CLOSEDOC   OLGA_GETINFO   OLGA_LINK   OLGA_LINKBROKEN   +OLGA_LINKRENAMED   OLGA_OPENDOC   OLGA_START   OLGA_UPDATED   +OLGA_UNLINK +
  + +
+ +

15.8.15 OLGA_START

+ + + + + + + + + + + + + + + +
Name: »OLGA_START« - Server für einen Client nachstarten. +
  +
Nummer: 0x1246 +
  +
Beschreibung: Mit dieser Nachricht kann ein Client einen für sich passenden +Server nachstarten lassen. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
Word 0Nachrichtennummer (0x1246)
Word 1AES-Kennung des eigenen Programms
Word 20
Word 3Konstanten
 0x0001 = OLS_TYPE
 0x0002 = OLS_EXTENSION
 0x0003 = OLS_NAME
Word 4+5Angaben über zu startendes Programm
 bzw. Programmtyp (von Word[3] abhängig)
Word 6+7Zeiger auf die Kommandozeile, oder NULL
+
+ +
Hinweis: Um das Programm zu starten wird (bei OLS_TYPE und +OLS_EXTENSION) die Konfigurations-Datei 'olga.inf' ausgewertet. Zunächst +wird der darin gefundene Server im Speicher gesucht, und bei Erfolg +mit VA_START aufgerufen. Anderenfalls wird das Programm in einer +Multitaskingumgebung wie MagiC oder MultiTOS per shel_write +nachgestartet. +
  +
Als Bestätigung erhält man eine einfache Antwort, sowie eine +weitere Nachricht, um die Kommandozeile leichter freigeben zu können +(falls diese nicht NULL war). +
  +
Gruppe: OLGA-Client +
  +
Querverweis: OLGA_CLOSEDOC   OLGA_GETINFO   OLGA_LINK   OLGA_LINKBROKEN   +OLGA_LINKRENAMED   OLGA_OPENDOC   OLGA_RENAMELINK   OLGA_UPDATED   +OLGA_UNLINK +
  + +
+ +

15.8.15.1 OLGA_START, Antwort auf

+

Diese Nachricht erhält der Client als Antwort auf eine +verschickte OLGA_START-Message: +

+
Word 0   = OLGA_ACK (0x1239)
+Word 1   = apID
+Word 2   = 0
+Word 3   = OLS-Konstante von OLGA_START
+Word 4+5 = exakt dieselben Werte von OLGA_START
+Word 6   = Fehler (bei Wert 0), sonst ok
+Word 7   = OLGA_START
+
+

15.8.15.2 OLGA_START, Antwort2 auf

+

Diese Nachricht erhält der Client als Antwort auf eine +verschickte OLGA_START-Message: +

+
Word 0   = OLGA_ACK (0x1239)
+Word 1   = apID
+Word 2   = 0
+Word 3   = 0 (!)
+Word 4+5 = exakt dieselben Werte von OLGA_START [6]+[7]
+Word 6   = Fehler (bei Wert 0), sonst ok
+Word 7   = OLGA_START
+
+

15.8.15.3 OLS_TYPE

+

OLS_TYPE (0x0001): Word[4] = 0. In Word[5] steht ein +XAcc-Programmtyp. +

+

15.8.15.4 OLS_EXTENSION

+

OLS_EXTENSION (0x0002): In Word[4,5] steht eine +Extension (z.B. ".GEM"). +

+

15.8.15.5 OLS_NAME

+

OLS_NAME (0x0003): In Word[4,5] steht ein Zeiger auf den +absoluten Dateinamen der zu startenden Applikation. +

+

15.8.16 OLGA_UPDATED

+ + + + + + + + + + + + + + + +
Name: »OLGA_UPDATED« - Server hat eine Datei verändert. +
  +
Nummer: 0x123f +
  +
Beschreibung: Diese Nachricht erhält der Client vom Manager, wenn der Server +eine Datei, auf die ein Link gesetzt ist, verän- dert hat. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
Word 0Nachrichtennummer (0x123f)
Word 1AES-Kennung des eigenen Programms
Word 20
Word 3+4Zeiger auf absoluten Dateinamen
Word 50 oder eine Index-Nummer, falls eine
 Info-Datei angefordert werden kann
Word 6AES-Kennung des Servers
Word 7Gruppenkennung des Dokumentes
+
+ +
Hinweis: Wenn der Client diese Nachricht empfängt, +sollte er also das zugehörige Dokument neu anzeigen. Der Zeiger ist +übrigens solange gültig, wie der Link besteht. +
  +
Die Kennung des Servers (Word 6) ist garantiert gesetzt, falls +Word 5 einen Wert ungleich 0 besitzt. An diese ID (d.h. direkt +an den Server) kann dann eine OLGA_GETINFO Nachricht geschickt werden. +
  +
Gruppe: OLGA-Client +
  +
Querverweis: OLGA_CLOSEDOC   OLGA_GETINFO   OLGA_LINK   OLGA_LINKBROKEN   +OLGA_LINKRENAMED   OLGA_OPENDOC   OLGA_RENAMELINK   OLGA_START   +OLGA_UNLINK +
  + +
+ +

15.8.17 OLGA_UNLINK

+ + + + + + + + + + + + + + + +
Name: »OLGA_UNLINK« - Überwachung einer Datei beenden. +
  +
Nummer: 0x123e +
  +
Beschreibung: Diese Nachricht muss vom Client an den Manager geschickt +werden, wenn die Überwachung einer bestimmten Datei ein- gestellt +werden soll. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
Word 0Nachrichtennummer (0x123e)
Word 1AES-Kennung des eigenen Programms
Word 20
Word 3+4Zeiger auf einen absoluten Dateinamen,
 der nicht mehr überwacht
 werden soll.
Word 5Gruppenkennung des Dokumentes
Word 60
Word 70
+
+ +
Hinweis: Falls das Dokument geschlossen wird, sollte +stattdessen OLGA_CLOSEDOC verwendet werden. Wenn der Client +terminiert, werden per OLE_EXIT alle entsprechenden Links automatisch +gelöscht. +
  +
Der angegebene Dateiname muss exakt mit der bei +OLGA_LINK übergebenen Zeichenkette übereinstimmen. Als Bestätigung +erhält der Client eine passende Antwort. +
  +
Gruppe: OLGA-Client +
  +
Querverweis: OLGA_CLOSEDOC   OLGA_GETINFO   OLGA_LINK   OLGA_LINKBROKEN   +OLGA_LINKRENAMED   OLGA_OPENDOC   OLGA_RENAMELINK   OLGA_START   +OLGA_UPDATED +
  + +
+ +

15.8.17.1 OLGA_UNLINK, Antwort auf

+

Diese Nachricht erhält ein Client als Antwort auf eine +verschickte OLGA_UNLINK-Message: +

+
Word 0    = OLGA_ACK (0x1239)
+Word 1    = apID
+Word 2    = 0
+Word 3+4  = exakt dieselben Werte von OLGA_UNLINK
+Word 5    = Gruppenkennung des Dokumentes
+Word 6    = Fehler bei Wert 0, sonst Ok
+Word 7    = OLGA_UNLINK
+
+

15.8.18 Server minimal

+

Ein OLGA-Server muss wenigstens folgendes tun: +

+ + +

15.8.19 Client minimal

+

Ein OLGA-Client muss wenigstens folgendes tun: +

+ + +

15.8.20 OLE_EXIT

+ + + + + + + + + + + + + + + +
Name: »OLE_EXIT« - Aus dem Protokoll ausklinken. +
  +
Nummer: 0x4951 +
  +
Beschreibung: Diese Nachricht sollte bei Programmende an den Manager +geschickt werden. +
  +

+
+ + + + + + + + + + + + + + + + +
ParameterBedeutung
Word 0Nachrichtennummer (0x4951)
Word 1AES-Kennung des eigenen Programms
Word 2-70
+
+ +
Hinweis: Die Nachricht wird außerdem vom Manager an die +Applikationen geschickt, wenn dieser terminiert. Wenn sich ein OLGA-Client +beim Manager abmeldet, werden automatisch alle zugehörigen Links und +Documents gelöscht. +
  +
Gruppe: OLGA-Initialisierung +
  +
Querverweis: OLE_INIT   OLE_NEW   OLGA_INIT +
  + +
+ +

15.8.21 OLE_INIT

+ + + + + + + + + + + + + + + +
Name: »OLE_INIT« - Applikation beim Manager anmelden. +
  +
Nummer: 0x4950 +
  +
Beschreibung: Diese Nachricht muss an den OLGA-Manager geschickt werden, und +sorgt dafür, daß die betreffende Applikation dem Manager bekannt +wird. +
  + +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
Word 0Nachrichtennummer (0x4950)
Word 1AES-Kennung des eigenen Programms
Word 20
Word 3Bitmap für OLGA
 0x0001 = OL_SERVER
 0x0002 = OL_CLIENT
 0x1000 = OL_PIPES
Word 4maximale von der Applikation verstan-
 dene Stufe des Protokolls (z.Zt. 0)
Word 5nur für OEP: Bitmap, OL_OEP gesetzt
Word 6nur für OEP: reserviert
Word 7XAcc-Programmtyp (oder 0) mit fol-
 gender Bedeutung:
  
 "WP" = Textverarbeitung
 "DP" = Desktop Publishing
 "ED" = Text-Editor
 "DB" = Datenbank
 "SS" = Tabellenkalkulation
 "RG" = Rastergrafikprogramm
 "VG" = Vektorgrafikprogramm
 "GG" = allgemeines Grafikprogramm
 "MU" = Musikanwendung
 "CD" = Computer Aided Design
 "DC" = Datenkommunikation
 "DT" = Desktop
 "PE" = Programmierumgebung
+
+ +
Hinweis: Wenn ein Protokoll von der Applikation nicht +unterstützt wird, sind die Wörter 3 und 4 bzw. 5 und 6 auszunullen. +Je nach Protokollauswahl erhält man dann vom Manager eine OEP_CONFIG +und/oder eine OLGA_INIT-Message; es ist dann nach den Beschreibungen +des jeweiligen Protokolls fortzufahren. +
  +
Gruppe: OLGA-Initialisierung +
  +
Querverweis: OLE_EXIT   OLE_NEW   OLGA_INIT +
  + +
+ +

15.8.22 OLE_NEW

+ + + + + + + + + + + + + + + +
Name: »OLE_NEW« - Manager wurde nachgestartet. +
  +
Nummer: 0x4952 +
  +
Beschreibung: Diese Nachricht wird vom Manager an alle erreichbaren Applikationen +verschickt, wenn er nachgestartet worden ist. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
Word 0Nachrichtennummer (0x4952)
Word 1AES-Kennung des eigenen Programms
Word 20
Word 3Bitmap
  
 0x1000 = OL_PIPES
 0x2000 = OL_START
 0x4000 = OL_MANAGER
Word 4max. Stufe des OLGA-Protokolls
Word 5nur für OEP: OL_OEP (0x001) gesetzt,
 falls der Manager OEP beherrscht
Word 6nur für OEP: reserviert (0)
Word 7Versionsnummer des Managers (BCD)
+
+ +
Nach Empfang und Auswertung dieser Message sollte eine +Applikation die Nachricht OLE_INIT verschicken, um sich beim Manager +anzumelden. Achtung: Die Werte in dieser Nachricht ersetzen +nicht die Rückgabe von OEP_CONFIG bzw. von OLGA_INIT, sie dienen +nur zu Informationszwecken. +
  +
Gruppe: OLGA-Initialisierung +
  +
Querverweis: OLE_EXIT   OLE_INIT   OLGA_INIT +
  + +
+ +

15.8.23 OLGA_INIT

+ + + + + + + + + + + + + + + +
Name: »OLGA_INIT« - Bestätigung für Anmeldung per OLE_INIT. +
  +
Nummer: 0x1236 +
  +
Beschreibung: Diese Nachricht wird als Antwort auf eine OLE_INIT-Message +verschickt. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
Word 0Nachrichtennummer (0x1236)
Word 1AES-Kennung des eigenen Programms
Word 20
Word 3Bitmap (OL_MANAGER gesetzt)
  
 0x1000 = OL_PIPES
 0x2000 = OL_START
 0x4000 = OL_MANAGER
Word 4Stufe des verwendeten Protokolls
Word 50
Word 60
Word 70 = Fehler, sonst: alles ok
+
+ +
Hinweis: Applikationen sollten den OLGA-Mechanismus erst +verwenden, nachdem sie diese Nachricht erhalten haben, und diese +keinen Fehler signalisiert hat. +
  +
Ausnahme: Bei Programmen, die bereits während der +Startphase Dokumente öffnen, kann es sinnvoll sein, auch ohne +Empfang dieser Nachricht das Protokoll zu benutzen; allerdings sollten +bei der Applikation dann keine Fehler auftreten, falls sich der +Manager doch nicht meldet. +
  +
Gruppe: OLGA-Initialisierung +
  +
Querverweis: OLE_EXIT   OLE_INIT   OLE_NEW +
  + +
+ +

15.8.24 OLGA-Info-Dateiformat

+

Das OLGA-Protokoll ermöglicht den Austausch von speziellen +Informationen zwischen Client und Server durch sogenannte +Info-Dateien. Diese Dateien beinhalten zwei Arten von +Datenstrukturen: +

+ + +

Die Info-Dateien selbst sind dabei folgendermaßen aufgebaut: +

+
InfHeader
+BlockHeader 1
+Daten 1
+BlockHeader 2
+Daten 2
+...
+...
+BlockHeader n-1
+Daten n-1
+BlockHeader n (id=0)
+
+

Das Dateiende (bzw. Block n) wird durch eine ID mit dem Wert 0 +gekennzeichnet. Einige Block-ID's sind bereits fest definiert. Im +einzelnen: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDBedeutung
'AUTH'Autor: Die Codierung entspricht dabei 'REM'
 (s.u.). Allerdings sollte man sich auf eine
 einzige Zeile beschränken.
  
'DATE'Datum der letzten Änderung als DOSTIME-Struktur.
'KEYW'Stichworte: Die Codierung entspricht dabei 'REM'
 (s.u.). Innerhalb der Zeilen liegen die Stich-
 worte durch Kommata getrennt vor.
  
'REM 'Kommentar: Einzelne Zeilen sind null-terminiert,
 das Ende wird über die Länge erkannt. Somit kön-
 nen auch Leerzeilen verschickt werden.
  
0x00000000Dateiende: Die Komponente length der OLGABlockHeader
 Struktur sollte also den Wert 0 besitzen.
+
+ +

Achtung: Damit ist natürlich noch überhaupt +nicht festgelegt, welche Blöcke (und in welcher Reihenfolge) +tatsächlich gespeichert werden. Unbekannte Blöcke müssen +daher ignoriert (d.h. überlesen) werden. Neue Block-ID's können frei +definiert werden; damit es aber nicht zu Kollisionen mit bereits +bestehenden ID's kommt, sollten Programmierer besser vorher mit dem +OLGA-Entwickler Kontakt aufnehmen. +

+

Querverweis: OLGA-Protokoll   OLGA-Client   OLGA-Server +

+

15.8.25 OLGAInfHeader

+
typedef struct
+{
+    LONG magic;    /* Kennung: 'OLGA'                   */
+    WORD version;  /* Versionsnummer (z.Zt. 0x0100)     */
+    WORD skip;     /* Anzahl der folgenden Headerbytes, */
+                   /* die überlesen werden müssen.      */
+} OLGAInfHeader;
+
+

15.8.26 OLGABlockHeader

+
typedef struct
+{
+    LONG id;       /* Block-ID */
+    LONG length;   /* Anzahl der folgenden Datenbytes */
+} OLGABlockHeader;
+
+

15.8.27 Much, Thomas

+

Thomas Much +
Gerwigstraße 46 +
D-76131 Karlsruhe Fax: (0721) 622821 +
E-Mail: Thomas.Much@stud.uni-karlsruhe.de (Internet) +
http://www.uni-karlsruhe.de/ Thomas.Much (WorldWideWeb) +

+

15.8.28 OL_SERVER

+

OL_SERVER (0x0001): +
Die Applikation ist ein OLGA-Server. +

+

15.8.29 OL_CLIENT

+

OL_CLIENT (0x0002): +
Die Applikation ist ein OLGA-Client. +

+

15.8.30 OL_PEER

+

OL_PEER (0x0003): +
Die Applikation ist ein Client und Server. +

+

15.8.31 OL_PIPES

+

OL_PIPES (0x1000): +
Die Applikation möchte nicht über Zeiger, sondern über +MultiTOS-kompatible Drag&Drop- Pipes kommunizieren. +

+

Der Manager informiert dann, ob er diese Art der Kommunikation +versteht bzw. ob sie auf dem aktuellen System möglich ist. Z.Zt. +wird diese Form jedoch noch nicht unterstützt. +

+

15.8.32 OL_START

+

OL_START (0x2000): +
Der Manager kann OLGA_START ausführen. +

+

15.8.33 OL_MANAGER

+

OL_MANAGER (0x4000): +
Die Applikation ist ein OLGA-Manager. +

+

15.8.34 OL_OEP

+

OL_OEP (0x0001): +
Die Applikation versteht OEP. +

+
+ +Home +ProtokolleProtokolle +LTL-ProtokollLTL-Protokoll +SE-ProtokollSE-Protokoll + + diff --git a/de/proto_seproto.html b/de/proto_seproto.html new file mode 100644 index 000000000..d5f9ad374 --- /dev/null +++ b/de/proto_seproto.html @@ -0,0 +1,1630 @@ + + + + + +Die Anleitung zum TOS: SE-Protokoll + + + + + + + + + +Home +ProtokolleProtokolle +OLGA-ProtokollOLGA-Protokoll +System Services Protocol (SSP)System Services Protocol (SSP) + +
+ +

15.9 SE-Protokoll

+

Sinn des SE-Protokolls ist die Kommunikation zwischen Shells zur +Programmentwicklung und Editoren, daher auch der Name: +Shell-Editor-Protokoll. +

+

Dieses Protokoll dient dazu, unter Multitasking-Systemen die +Shell vom Editor aus zur Compilierung und ähnlichen Aktionen zu +veranlassen, und um von der Shell Fehlermeldungen und/oder +Fehlerdateien an den Editor zurückzugeben. +

+

Kommandos bzw. Nachrichten von der Shell an den Editor beginnen mit +SE_, Nachrichten vom Editor an die Shell beginnen mit ES_. +

+

Die aktuelle Versionsnummer des Protokolls ist 1.05. +

+ +
+

15.9.1 Kontaktaufnahme

+

Die Kontaktaufnahme läuft wie folgt ab: +

+

Die Shell verschickt nach dem Start die Nachricht +SE_INIT. Als Antwort erhält sie darauf die Nachricht +ES_OK. Aus den Bitfeldern in den beiden Nachrichten kann die Shell +nun ableiten, welche Kommandos sie an den Editor schicken kann und +welche Kommandos vom Editor zu erwarten sind. Wenn die Shell nicht +mehr am SE-Protokoll teilnehmen will (z.B. weil sie beendet wird), +dann schickt sie die Nachricht SE_QUIT an den Editor. +

+

Der Editor verschickt nach dem Start die Nachricht +ES_INIT. Als Antwort erhält sie darauf die Nachricht +SE_OK. Aus den Bitfeldern in den beiden Nachrichten kann der Editor +nun ableiten, welche Kommandos er an die Shell schicken kann und +welche Kommandos von der Shell zu erwarten sind. Wenn der Editor nicht +mehr am SE-Protokoll teilnehmen will (z.B. weil er beendet wird), dann +schickt er die Nachricht ES_QUIT an die Shell. +

+

Bleibt die Frage, an wen Shell und Editor diese Nachrichten schicken +sollen. Das SE-Protokoll ist sinnvoll am ehesten unter einem +Multitasking-System einsetzbar, dort wird normalerweise die +AES-Funktion appl_search() zur Verfügung stehen. Shell und +Editor sollten also einfach ihre jeweilige Init-Nachricht an alle +Prozesse (außer an Systemprozesse) schicken. +

+

Andere Möglichkeiten: +

+
    +
  • Wenn die Shell den Namen ihres Editors kennt, kann sie sich +natürlich auch darauf beschränken, SE_INIT nur an diesen zu +schicken. +
      +

  • +
  • Wenn die Funktion appl_search() nicht zur Verfügung steht, +bietet sich das XAcc-Protokoll zur Kontaktaufnahme an: Shell und +Editor sollten ihre Init-Nachrichten dann einfach an jeden Prozeß +schicken, der sich per XAcc anmeldet. Das XAcc-Protokoll sieht +außerdem noch eine maschinenlesbare Kennung des Programmtyps (XDSC) +vor, so daß man u.U. sogar erkennen kann, ob es sich bei dem +Kommunikationspartner um eine Shell (Kennung `PE' für Programming +Environment) oder um einen Editor (Kennung `ED' für Text +Editor) handelt. +
      +

  • +
+ +

15.9.2 Anmerkungen

+

Wenn im folgenden von einer Nachricht die Rede ist, dann +ist damit eine AES-Nachricht gemeint, die aus 8 Worten (Integers) +besteht und mit der AES-Funktion appl_write() verschickt +wird. Das erste Wort enthält jeweils die Nummer der Nachricht, das +zweite die Applikations-ID des Absenders, das dritte ist immer Null. +Die Belegung der anderen Worte ist von der jeweiligen Nachricht +abhängig. Worte, für die keine Belegung angegeben wird, sind auf +Null zu setzen. +

+

Bitte beachten: Da die Zählung bei 0 beginnt, ist mit +Wort 3 im folgenden das vierte Wort gemeint! +

+

Zur Verdeutlichung nochmals in C: +

+
+
 int msg[8];
+
+ msg[0] = SE_ACK;   /* Nachricht                         */
+ msg[1] = gl_apid;  /* ID des Absenders                  */
+ msg[2] = 0;        /* 0, d.h. keine Überlänge           */
+ msg[3] = TRUE;     /* dies ist "Wort 3"                 */
+ msg[4] = msg[5] = msg[6] = msg[7] = 0; /* Rest auf Null */
+ appl_write (editor, 16, msg);          /* abschicken    */
+
+
+
+

Wenn in einer Nachricht ein Zeiger (d.h. eine Adresse) enthalten +ist, dann wird das obere Wort der Adresse im ersten und das untere +Wort im zweiten der angegebenen Worte übergeben. +

+

Bei den Zeigern auf Speicherbereiche ist vom jeweiligen Absender +der Nachricht darauf zu achten, daß diese Speicherbereiche vom +Empfänger auch lesbar sind (Memory Protection!). Dafür sind diese +als Readable zu allozieren! Das geschieht über den +Gemdos-Aufruf Mxalloc(). +

+
+

Bei einigen Nachrichten können Zeilen- und Spaltennummern für eine +Cursorposition übergeben werden. Da es unterschiedliche Auffassungen +darüber gibt, ob Zeilen und/oder Spalten ab Null oder ab Eins +gezählt werden, wird empfohlen, diese Angaben vor der Übernahme zu +überprüfen und ggfs. zu korrigieren. Wenn der Editor seine Zeilen +also ab Eins zählt, dann sollte ihn die Zeilennummer Null nicht aus +der Fassung bringen, sondern er sollte sie wie Zeile Eins behandeln. +

+

15.9.3 Nachrichten der Shell an den Editor

+

Die Shell kann folgende Nachrichten bzw. Kommandos an den Editor +senden: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NachrichtNummer
SE_INIT0x4200
SE_OK0x4201
SE_ACK0x4202
SE_OPEN0x4203
SE_ERROR0x4204
SE_ERRFILE0x4205
SE_PROJECT0x4206
SE_QUIT0x4207
SE_TERMINATE0x4208
SE_CLOSE0x4209
SE_MENU0x420A
+
+ +

15.9.3.1 SE_INIT

+

Die Shell fragt an, ob ein Editor das SE-Protokoll versteht. +

+
+

Aufbau der Nachricht +

+ + + + + + + + + +
Wort 3: Ein Bitset, welche Nachrichten die Shell versendet: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NachrichtBitHex-Wert
SE_INIT00x0001
SE_OK10x0002
SE_ACK20x0004
SE_OPEN30x0008
SE_ERROR40x0010
SE_ERRFILE50x0020
SE_PROJECT60x0040
SE_QUIT70x0080
SE_TERMINATE80x0100
SE_CLOSE90x0200
SE_MENU100x0400
+
+ +
Wort 4+5: Ein Bitset, welche Editorkommandos verstanden werden +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NachrichtBitHex-Wert
ES_INIT00x0001
ES_OK10x0002
ES_ACK20x0004
ES_COMPILE30x0008
ES_MAKE40x0010
ES_MAKEALL50x0020
ES_LINK60x0040
ES_EXEC70x0080
ES_MAKEEXEC80x0100
ES_PROJECT90x0200
ES_QUIT100x0400
ES_SHLCTRL110x0800
+
+ +
Hinweis: Wort 4 und 5 bilden zusammen ein Langwort. Da +für die bisher definierten Nachrichten aber nur 12 Bits benötigt werden, +ist Wort 4 normalerweise Null. +
  +
Wort 6: Unterstützte Versionsnummer des Protokolls als BCD-Zahl, also +0x0105 (hexadezimal) für Version 1.05 +
  + +
+ +
+

Antwort +

+

Der Editor antwortet mit der Nachricht ES_OK. +

+
+

siehe auch: ES_OK, SE_QUIT +

+

15.9.3.2 SE_OK

+

Die Shell sagt dem Editor, daß sie das Protokoll versteht. +

+
+

Aufbau der Nachricht +

+ + + + + + + + + + + + +
Wort 3: Ein Bitset, welche Nachrichten die Shell versendet: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NachrichtBitHex-Wert
SE_INIT00x0001
SE_OK10x0002
SE_ACK20x0004
SE_OPEN30x0008
SE_ERROR40x0010
SE_ERRFILE50x0020
SE_PROJECT60x0040
SE_QUIT70x0080
SE_TERMINATE80x0100
SE_CLOSE90x0200
SE_MENU100x0400
+
+ +
Wort 4+5: Ein Bitset, welche Editorkommandos verstanden werden: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NachrichtBitHex-Wert
ES_INIT00x0001
ES_OK10x0002
ES_ACK20x0004
ES_COMPILE30x0008
ES_MAKE40x0010
ES_MAKEALL50x0020
ES_LINK60x0040
ES_EXEC70x0080
ES_MAKEEXEC80x0100
ES_PROJECT90x0200
ES_QUIT100x0400
ES_SHLCTRL110x0800
+
+ +
Hinweis: Wort 4 und 5 bilden zusammen ein Langwort. Da +für die bisher definierten Nachrichten aber nur 12 Bits benötigt werden, +ist Wort 4 normalerweise Null. +
  +
Wort 6: Unterstützte Versionsnummer des Protokolls als BCD-Zahl, also +0x0105 (hexadezimal) für Version 1.05 +
  +
Wort 7: Die ApId des Programmes, dessen Nachricht beantwortet wird +
  + +
+ +
+

Antwort +

+

Keine. SE_OK ist bereits die Antwort der Shell auf die +Nachricht ES_INIT. +

+

15.9.3.3 SE_ACK

+

Die Shell bestätigt den Empfang eines Editorkommandos und gibt +zurück, ob das Kommando ausgeführt wird. +

+
+

Aufbau der Nachricht +

+ + + +
Wort 3: TRUE : Kommando wird verstanden und ausgeführt, +
FALSE: Das Kommando wird nicht verstanden +
  +
Ein SE_ACK mit TRUE sagt nichts darüber aus, ob +das Kommando erfolgreich ausgeführt wurde. Es sagt nur, daß die +Shell das Kommando versteht und ausführen wird! +
  + +
+ +
+

Antwort +

+

Keine (SE_ACK ist bereits die Antwort auf eine +Nachricht). +

+

15.9.3.4 SE_OPEN

+

Die Shell sagt dem Editor, daß er einen Text öffnen soll. +

+
+

Aufbau der Nachricht +

+ + + + + + + + + +
Wort 3+4: Ein Zeiger auf den Filenamen des zu öffnenden Files +
  +
Wort 5+6: Zeile, in die der Cursor positioniert werden soll +
  +
Wort 7: Spalte, in die der Cursor positioniert werden soll +
  + +
+ +
+

Antwort +

+

Als Antwort erhält die Shell ein ES_ACK. +

+
+

Hinweise: Die Angabe einer Zeilen- und Spaltennummer ist +erst ab Protokollversion 1.02 vorgesehen. Programme, die noch ältere +Protokollversionen verwenden, sollten aber eigentlich die Worte 5-7 +auf Null gesetzt haben. Will man ganz sicher gehen, muß man ggfs. die +bei SE_INIT bzw. SE_OK übergebene Versionsnummer der +Shell abfragen. +

+

Wenn die Shell keine Positionsangabe machen kann oder will, +sollte sie Zeile und Spalte auf Null setzen. +

+

15.9.3.5 SE_ERROR

+

Es ist ein Fehler beim Compilieren aufgetreten. +

+
+

Aufbau der Nachricht +

+ + + +
Wort 3+4: Ein Zeiger auf eine Infostruktur, die wie folgt aufgebaut ist: +
  + +
+ + +
    typedef struct
+    {
+      char *errFile; /* Zeiger auf den Namen der compilierten Datei */
+      char *errMess; /* Zeiger auf die Fehlermeldung                */
+      int errNum;    /* Die Fehlernummer                            */
+      long errLine;  /* Die fehlerhafte Zeile                       */
+      int errRow;    /* Die Spalte mit dem Fehler (oder 0)          */
+    } ERRINFO;
+
+
+

Antwort +

+

Mit ES_ACK bestätigt der Editor die Meldung. +

+
+

Hinweis: Wenn die Shell keine Positionsangabe machen +kann oder will, sollte sie Zeile und Spalte auf Null setzen. +

+

15.9.3.6 SE_ERRFILE

+

Es sind Fehler aufgetreten. Die Fehlermeldungen stehen in einem +Errorfile, welches in der Message spezifiziert wird. +

+
+

Aufbau der Nachricht +

+ + + + + + +
Wort 3+4: Ein Zeiger auf den Filenamen des Errorfiles mit den +Fehlermeldungen +
  +
Wort 5+6: Ein Zeiger auf den Namen des compilierten Textes +
  + +
+ +
+

Antwort +

+

Mit ES_ACK bestätigt der Editor die Meldung. +

+

15.9.3.7 SE_PROJECT

+

Die Shell teilt dem Editor mit, daß das Projekt geändert +wurde. Der Filename des aktuellen Projektfiles wird als Parameter +übergeben. Wird NULL übergeben, sollte das aktuelle Projekt +abgemeldet werden. +

+

Eine vernünftige Reaktion des Editors wäre es in dem Fall, +ebenfalls das Projekt zu wechseln, sofern er dies unterstützt. +

+
+

Aufbau der Nachricht +

+ + + +
Wort 3+4: Ein Zeiger auf den Namen des Projektfiles oder NULL. +
  + +
+ +
+

Antwort +

+

Der Editor bestätigt mit ES_ACK. +

+
+

Hinweis: Den Namen des Projektfiles auf NULL zu +setzen, ist erst ab Protokollversion 1.01 vorgesehen. Die Shell sollte +daher vorher überprüfen, ob der Editor mindestens Protokollversion +1.01 unterstützt. +

+

15.9.3.8 SE_QUIT

+

Die Shell teilt dem Editor mit, daß sie jetzt beendet wird. Der +Editor sollte in dem Fall die Shell als Kommunikationspartner +vergessen. +

+
+

Aufbau der Nachricht +

+
+
keine Parameter
+
+

+
  +

+ +
+
+
+

Antwort +

+

Es wird keine Antwort erwartet! +

+

15.9.3.9 SE_TERMINATE

+

Die Shell teilt dem Editor mit, daß dieser sich beenden soll. +Der Editor sollte in dem Fall sich selbst beenden und seinen ganz +normalen Terminierungsprozeß durchlaufen (und dabei auch ein +ES_QUIT verschicken!). Der Grund für so eine Meldung der +Shell könnte zum Beispiel zu wenig Speicher zum Compilieren sein. +

+
+

Aufbau der Nachricht +

+
+
keine Parameter
+
+

+
  +

+ +
+
+
+

Antwort +

+

Mit ES_ACK bestätigt der Editor die Meldung. +

+

15.9.3.10 SE_CLOSE

+

Die Shell teilt dem Editor mit, daß dieser bestimmte Texte +sichern bzw. schließen soll. Beim Schließen von geänderten Texten +sollte der Editor vorher nachfragen. +

+
+

Aufbau der Nachricht +

+ + + + + + +
Wort 3+4: Ein Zeiger auf den Namen einer Datei oder eine Dateimaske. +*.* steht für alle Textfenster (entspricht also dem +SE_CLOSE der Protokollversion 1.00). +
  +
Wort 5: 0 = nur sichern +
1 = sichern und schließen +
2 = schließen ohne Sichern (ab Version 1.04) +
  + +
+ +
+

Antwort +

+

Mit ES_ACK bestätigt der Editor die Meldung. +

+
+

Hinweis: In der Protokollversion 1.00 waren für +SE_CLOSE noch keine Parameter vorgesehen. Editoren, die nur +Version 1.00 unterstützen, werden daher die Dateimasken und das Flag +ignorieren und alle Texte sichern. +

+

15.9.3.11 SE_MENU

+

Die Shell teilt dem Editor mit, was er für die einzelnen +Programme in sein Menü eintragen soll. Der Editor kann somit für die +Menüpunkte, die eine Aktion in der Shell auslösen, die gleichen +Texte wie die Shell verwenden. +

+
+

Aufbau der Nachricht +

+ + + +
Wort 3+4: Ein Zeiger auf eine Infostruktur, die wie folgt aufgebaut ist: +
  + +
+ + +
  typedef struct
+  {
+    char *compStr;      /* Text für den Menüpunkt "Compiler"       */
+    char *makeStr;      /* Text für den Menüpunkt "Makefile"       */
+    char *makeAllStr;   /* Text für den Menüpunkt "Make all"       */
+    char *linkStr;      /* Text für den Menüpunkt "Linker"         */
+    char *execStr;      /* Text für den Menüpunkt "Execute"        */
+    char *makeExecStr;  /* Text für den Menüpunkt "Make & Execute" */
+    char *progName;     /* Name der Shell (ab Version 1.04)        */
+    char *shellCtrlStr; /* Text für den Menüpunkt "Shell Control"  */
+                        /* (ab Version 1.05)                       */
+  } SEMENUINFO;
+
+
+

Antwort +

+

Mit ES_ACK bestätigt der Editor die Meldung. +

+
+

Hinweise: Die Texte sind allesamt optional und können +auch NULL sein, wenn die Shell keinen entsprechenden +Menüpunkt hat. Dies bedeutet jedoch nicht, daß die Shell nicht über +diese Funktionalität verfügt. Der Editor sollte daher für alle +Texte ggfs. Defaulttexte einsetzen. +

+

Diese Nachricht existiert erst ab Protokollversion 1.02. Es +genügt aber der Test, ob das entsprechende Bit in ES_INIT +bzw. ES_OK gesetzt ist. +

+

Beim Zugriff auf progName und shellCtrlStr muß +darauf geachtet werden, daß der Kommunikationspartner diese auch +schon unterstützt (Protokollversion testen)! +

+

15.9.4 Nachrichten des Editors an die Shell

+

Der Editor kann folgende Nachrichten bzw. Kommandos an die Shell +senden: +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NachrichtNummer
ES_INIT0x4240
ES_OK0x4241
ES_ACK0x4242
ES_COMPILE0x4243
ES_MAKE0x4244
ES_MAKEALL0x4245
ES_LINK0x4246
ES_EXEC0x4247
ES_MAKEEXEC0x4248
ES_PROJECT0x4249
ES_QUIT0x424A
ES_SHLCTRL0x424B
+
+ +
+

15.9.4.1 ES_INIT

+

Ein Editor fragt an, ob eine Shell das SE-Protokoll versteht. +

+
+

Aufbau der Nachricht +

+ + + + + + + + + +
Wort 3: Ein Bitset, welche Shellnachrichten verstanden werden: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NachrichtBitHex-Wert
SE_INIT00x0001
SE_OK10x0002
SE_ACK20x0004
SE_OPEN30x0008
SE_ERROR40x0010
SE_ERRFILE50x0020
SE_PROJECT60x0040
SE_QUIT70x0080
SE_TERMINATE80x0100
SE_CLOSE90x0200
SE_MENU100x0400
+
+ +
Wort 4+5: Ein Bitset, welche Editorkommandos versendet werden: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NachrichtBitHex-Wert
ES_INIT00x0001
ES_OK10x0002
ES_ACK20x0004
ES_COMPILE30x0008
ES_MAKE40x0010
ES_MAKEALL50x0020
ES_LINK60x0040
ES_EXEC70x0080
ES_MAKEEXEC80x0100
ES_PROJECT90x0200
ES_QUIT100x0400
ES_SHLCTRL110x0800
+
+ +
Hinweis: Wort 4 und 5 bilden zusammen ein Langwort. Da +für die bisher definierten Nachrichten aber nur 12 Bits benötigt werden, +ist Wort 4 normalerweise Null. +
  +
Wort 6: Unterstützte Versionsnummer des Protokolls als BCD-Zahl, also +0x0105 (hexadezimal) für Version 1.05 +
  + +
+ +
+

Antwort +

+

Als Antwort erhält der Editor SE_OK von der Shell. +

+

15.9.4.2 ES_OK

+

Der Editor beantwortet die Anfrage der Shell nach dem Protokoll. +

+
+

Aufbau der Nachricht +

+ + + + + + + + + + + + +
Wort 3: Ein Bitset, welche Shellnachrichten verstanden werden: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NachrichtBitHex-Wert
SE_INIT00x0001
SE_OK10x0002
SE_ACK20x0004
SE_OPEN30x0008
SE_ERROR40x0010
SE_ERRFILE50x0020
SE_PROJECT60x0040
SE_QUIT70x0080
SE_TERMINATE80x0100
SE_CLOSE90x0200
SE_MENU100x0400
+
+ +
Wort 4+5: Ein Bitset, welche Editorkommandos versendet werden: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NachrichtBitHex-Wert
ES_INIT00x0001
ES_OK10x0002
ES_ACK20x0004
ES_COMPILE30x0008
ES_MAKE40x0010
ES_MAKEALL50x0020
ES_LINK60x0040
ES_EXEC70x0080
ES_MAKEEXEC80x0100
ES_PROJECT90x0200
ES_QUIT100x0400
ES_SHLCTRL110x0800
+
+ +
Hinweis: Wort 4 und 5 bilden zusammen ein Langwort. Da +für die bisher definierten Nachrichten aber nur 12 Bits benötigt werden, +ist Wort 4 normalerweise Null. +
  +
Wort 6: Unterstützte Versionsnummer des Protokolls als BCD-Zahl, also +0x0105 (hexadezimal) für Version 1.05 +
  +
Wort 7: Die ApId des Programmes, dessen Nachricht beantwortet wird +
  + +
+ +
+

Antwort +

+

Keine. ES_OK ist bereits die Antwort des Editors auf die +Nachricht SE_INIT. +

+

15.9.4.3 ES_ACK

+

Der Editor bestätigt den Empfang des Kommandos. +

+
+

Aufbau der Nachricht +

+ + + +
Wort 3: TRUE : Kommando wird verstanden und ausgeführt, +
FALSE: Das Kommando wird nicht verstanden +
  +
Ein ES_ACK mit TRUE sagt nichts darüber aus, ob +das Kommando erfolgreich ausgeführt wurde. Es sagt nur, daß der +Editor das Kommando versteht und ausführen wird! +
  + +
+ +
+

Antwort +

+

Keine (ES_ACK ist bereits die Antwort auf eine +Nachricht). +

+

15.9.4.4 ES_COMPILE

+

Der Editor sagt der Shell, daß sie ein File übersetzen soll. +Ein Zeiger auf den Dateinamen kann in der Nachricht übergeben werden. +

+
+

Aufbau der Nachricht +

+ + + +
Wort 3+4: Zeiger auf den Namen der zu compilierenden Datei oder +NULL. +
  + +
+ +
+

Antwort +

+

Diese Nachricht muß mit SE_ACK bestätigt werden. +

+
+

Hinweis: Den Namen der zu compilierenden Datei auf +NULL zu setzen, ist erst ab Protokollversion 1.03 vorgesehen. +Der Editor sollte daher vorher überprüfen, ob die Shell mindestens +Protokollversion 1.03 unterstützt. +

+

15.9.4.5 ES_MAKE

+

Der Editor sagt der Shell, daß sie ein Make ausführen soll. +Ein Filename kann in der Nachricht übergeben werden, muß aber nicht +gesetzt sein und muß von der Shell auch nicht beachtet werden! +

+
+

Aufbau der Nachricht +

+ + + +
Wort 3+4: Zeiger auf den Namen des Makefiles (oder NULL) +
  + +
+ +
+

Antwort +

+

Die Shell bestätigt mit SE_ACK. +

+

15.9.4.6 ES_MAKEALL

+

Der Editor sagt der Shell, daß ein komplettes Make All +ausgeführt werden soll. Ein Filename für das Makefile kann (muß +aber nicht) in der Nachricht übergeben werden. +

+
+

Aufbau der Nachricht +

+ + + +
Wort 3+4: Zeiger auf den Namen des Makefiles (oder NULL) +
  + +
+ +
+

Antwort +

+

Die Shell bestätigt mit SE_ACK. +

+

15.9.4.7 ES_LINK

+

Der Editor sagt der Shell, daß das Programm gelinkt werden +soll. Ein Filename kann in der Nachricht übergeben werden, muß aber +nicht unbedingt von der Shell beachtet werden! +

+
+

Aufbau der Nachricht +

+ + + +
Wort 3+4: Zeiger auf den Namen der Source, die gelinkt werden soll (oder +NULL) +
  + +
+ +
+

Antwort +

+

Die Shell bestätigt mit SE_ACK. +

+

15.9.4.8 ES_EXEC

+

Der Editor sagt der Shell, daß das Programm zu der Source +ausgeführt werden soll. Ein Filename kann übergeben werden, muß von +der Shell aber nicht beachtet werden. +

+
+

Aufbau der Nachricht +

+ + + +
Wort 3+4: Zeiger auf den Namen des auszuführenden Files (oder NULL). +
  +
Bei einer Sourcedatei ist diese ggf. noch zu compilieren +und/oder zu linken +
  + +
+ +
+

Antwort +

+

Die Shell bestätigt mit SE_ACK. +

+

15.9.4.9 ES_MAKEEXEC

+

Die Shell soll ein Make ausführen und danach das Programm +ausführen. Ein Filename für das Makefile kann (muß aber nicht) in +der Nachricht übergeben werden. +

+
+

Aufbau der Nachricht +

+ + + +
Wort 3+4: Zeiger auf den Namen des Makefiles (oder NULL) +
  + +
+ +
+

Antwort +

+

Die Shell bestätigt mit SE_ACK. +

+

15.9.4.10 ES_PROJECT

+

Der Editor teilt der Shell mit, daß das Projekt +geändert/gewechselt wurde. Der Filename des Projektfiles wird als +Parameter in der Nachricht übergeben. Wird NULL übergeben, +sollte das aktuelle Projekt abgemeldet werden. +

+

Eine vernünftige Reaktion der Shell wäre in dem Fall, +ebenfalls das Projekt zu wechseln, sofern sie dies unterstützt. +

+
+

Aufbau der Nachricht +

+ + + +
Wort 3+4: Zeiger auf den Namen des Projektfiles oder NULL +
  + +
+ +
+

Antwort +

+

Die Shell bestätigt mit SE_ACK. +

+
+

Hinweis: Den Namen des Projektfiles auf NULL zu +setzen, ist erst ab Protokollversion 1.01 vorgesehen. Der Editor +sollte daher vorher überprüfen, ob die Shell mindestens +Protokollversion 1.01 unterstützt. +

+

15.9.4.11 ES_QUIT

+

Der Editor teilt der Shell mit, daß er jetzt beendet wird. Die +Shell sollte in dem Fall den Editor als Kommunikationspartner +vergessen. +

+
+

Aufbau der Nachricht +

+
+
keine Parameter
+
+

+
  +

+ +
+
+
+

Antwort +

+

Es wird keine Antwort erwartet! +

+

15.9.4.12 ES_SHLCTRL

+

Nachricht des Editors zur Kontrolle der Shell. +

+
+

Aufbau der Nachricht +

+ + + + + + +
Wort 3+4: Zeiger auf den Namen des obersten Fensters des Editors oder +NULL +
  +
Wort 5: Steuer-Flags: +
Bit 0: Shell soll sich toppen (Menü/Fenster) +
  + +
+ +
+

Antwort +

+

Die Shell bestätigt mit SE_ACK. +

+
+

Hinweis: Diese Nachricht existiert erst ab +Protokollversion 1.05. Die übrigen Bits von Wort 5 sind für +zukünftige Erweiterungen reserviert. +

+

15.9.5 History

+

Version 1.05 vom 23.12.1997 +

+ + +
+

Version 1.04 vom 08.01.1997 +

+ + +
+

Version 1.03 vom 19.11.1996 +

+
    +
  • bei ES_COMPILE kann der Zeiger auf den Dateinamen jetzt +auch NULL sein. +
      +

  • +
+ +
+

Version 1.02 vom 13.08.1996 +

+
    +
  • neue Nachricht SE_MENU +
      +

  • +
  • bei SE_OPEN kann nun auch eine Zeile und eine Spalte +angegeben werden +
      +

  • +
+ +
+

Version 1.01 vom 30.01.1996 +

+ + +
+

Version 1.00 vom 17.01.1994 +

+
    +
  • erste öffentliche Version +
      +

  • +
+ +

15.9.6 Autoren und Programme

+

Das SE-Protokoll wurde von Dirk Steins und Frank Storm +entwickelt, die Erweiterungen zu den neueren Protokollversionen +stammen von Christian Felsch und Dirk Haun. +

+

Die Zahl der Programme, die das SE-Protokoll unterstützen, ist leider +noch nicht allzu groß: +

+
    +
  • Editoren: +
      +

      +
    • Clix von Steffen Engels +
        +

    • +
    • Everest von Oliver Schmidt (ab Version 3.5) +
        +

    • +
    • Fred von Dirk Steins +
        +

    • +
    • qed von Christian Felsch (ab Version 3.3, ab Version 3.70 wird +zudem Protokollversion 1.01 unterstützt) +
        +

    • +
    + +

  • +
  • Shells: +
      +

      +
    • Chatwin von Dirk Haun (ab Version 3.04 wird das SE-Protokoll +komplett unterstützt, ältere Versionen unterstützen nur die +wichtigsten Nachrichten) +
        +

    • +
    • Shell zum Megamax Modula-2 von Thomas Tempelmann und Dirk +Steins +
        +

    • +
    • PC-Shell von Frank Schramm (ab Version 3.01) +
        +

    • +
    + +

  • +
  • Sonstiges: +
      +

      +
    • SE-Lib von Manfred Rosenboom und Dirk Haun +
        +
      Dieser Bibliothek liegt auch der SE-Evaluator, eine Art Debugger +für das SE-Protokoll, bei. +
        +

    • +
    + +

  • +
+ +

Es bleibt zu hoffen, daß weitere Editoren und Shells dieses +nützliche Protokoll unterstützen werden. Dieser Text trägt dabei +hoffentlich etwas zur Verbreitung bei … +

+
+

Dirk Haun, 22. November 2024 +

+
+ +Home +ProtokolleProtokolle +OLGA-ProtokollOLGA-Protokoll +System Services Protocol (SSP)System Services Protocol (SSP) + + diff --git a/de/proto_ssp.html b/de/proto_ssp.html new file mode 100644 index 000000000..a2fa17c03 --- /dev/null +++ b/de/proto_ssp.html @@ -0,0 +1,2284 @@ + + + + + +Die Anleitung zum TOS: System Services Protocol (SSP) + + + + + + + + + +Home +ProtokolleProtokolle +SE-ProtokollSE-Protokoll +View protocolView protocol + +
+ +

15.10 System Services Protocol (SSP)

+

The purpose of the System Services Protocol (SSP) is described +in 'What is SSP?' +

+

Planning phase +

+

+

Idea: Joakim Högberg +
Server Code and this Specification: Olaf Piesche +

+

CCurrently involved in specification, planning and future first +implementations: +

+

Joakim Högberg (AtarICQ) +
Lonny Pursell (AtarIRC) +
Olaf Piesche(Smurf) +
Odd Skancke (TextView) +
Jo Even Skarstein (TaskBar) +
Ralph Lowinski (GuiTar) +
Rafal Kawecki (WAP-Browser, ArchView) +
Dan Ackermann (mICQ, AtarICQ-Overlay) +
Jan Krivanek (Atack) (aMail, aFTP) +
Erik Häll (MyMail) +
Martin Elsässer (ACSPro) +
Denis Huguet FalcAmp +

+

Emailed people (got the spec, waiting for reply): +

+

Joachim Fornallaz (GEMSetup) +

+

News +

+

UPDATED to V0.9: Nov. 17th, 2000 (see changes!) +

+

Dec. 9th, 4:39pm +
Martin Elsässer has announced interest to implement SSP in +ACSPro. That means that all applications constructed with ACSPro could +support basic SSP functionality from the start! +

+

Nov. 17th, 1:46pm +
AES message definitions added. Basically the protocol is ready. +

+

Just decided that the Server will feature 2 different debug +modes. Because it will take a short while until we have implemented +the protocol, it might be difficult to find out if the protocol is +implemented correctly in terms of how SPAs and SRAs react to different +messages. The standard debug mode will feature output and logging of +incoming and sent messages and their parameters, but this doesn't show +the reaction of SPAs and SRAs to different messages, if the protocol +implementation in these applications is not finished. This will be +solved by the Server providing an extended debug mode in which it can +simulate both SRAs and SPAs, additionally to the logging. +

+

SPA programers: you'll get a dialog window in which you can send +different service requests directly from the Server, as if another +application requested a service (SRA simulation). +

+

SRA programmers: You'll have display in the same dialog window +showing different requests coming in, and the Server will simulate +being an SPA and sending back acknowledgement (SPA simulation) +including simulation of Service Initialization and DRS delays. +

+

The debug modes will not be available in the first official +release version, to keep the Server code small and efficient. +

+

About this spec +

+

Welcome to the online SSP specs ;) +

+

I want to ask everybody involved to tell me if you send the +specs to somebody else, so that we can keep track of things and I can +send updates to everybody. +

+

Target for V1.0 is an as complete as possible spec of Send +File, Display Message, Send Message, Status Display, Context Popup, +Compress File and Display Information Services. +

+

These are the services that will be primarily used by the +currently involved applications. +

+

Changes to the spec will be listed on the 'SSP changes' page. +

+

Everybody involved is encouraged to come up with suggestions, +improvement, criticism and anything else you can come up with. There +are 2 reasons for not specifying SSP alone and releasing it then. One +is, this way we have a broad base of applications supporting the +protocol at release time already, which will increase the acceptance +of it on the side of the users, and hence also on the side of +developers. The other reason, just as, if not more important, is that +this way not only ideas of one or two persons flow into the project, +but of a variety of developers working on all different kinds of +software. That'll make SSP more versatile and flexible and make it +take several different points of view into account. Read SSP changes +for everything else ;) +

+

15.10.1 SSP changes

+

Specification changes as of Nov. 17th, 2000 +

+
    +
  • Updated spec version number to V0.9 +
      +

  • +
  • Little tweaks here and there +
      +

  • +
  • Added constant definitions for the AES messages. SSP +reserves messages from 4719 to 4749 (currently using the first 6) for +future use. With this, the protocol is practically ready for +implementation! +
      +
    Update to 1.0 will be done as soon as I start implementing the +server (in about a week I hope), and if no more suggestions for +changes are made. +
      +

  • +
+ +

Specification changes as of Nov. 9th, 2000 +

+
    +
  • Updated spec version number to V0.85 +
      +

  • +
  • Added instructions on how to implement SSP as a SPA and SRA, +including some short sample code. +
      +

  • +
+ +

Specification changes as of Nov. 7th, 2000 +

+
    +
  • updated spec version number to V0.8 +
      +

  • +
  • Added the first constant definitions including a short explanation of the +determintation of services on Server side as reaction to SSP_SRASR and +its data identification. +
      +

  • +
  • Updated the services with necessary value of dataID for using +specific services. +
      +

  • +
+ +

Specification changes as of Nov. 6th, 2000 +

+
    +
  • Updated spec version number to V0.77 +
      +

  • +
  • Added spec of server registration +
      +

  • +
  • Updated Status Display Service with possibility to remove the +status icon (e.g. when exiting the SRA). Shame, I didn't think of that +when I specified it... +
      +

  • +
  • Added message directions in the message +descriptionsServer", to make more clear who sends which message, +and where to +
      +

  • +
+ +

Specification changes as of Nov. 4th, 2000 +

+
    +
  • Updated spec version to 0.75 +
      +

  • +
  • Added what is SSP? section as an introduction. +
      +

  • +
  • Changed Timeouts and Errors - the pipeline scheme showed me +something I didn't see before (that's pretty sad...): the SRA can't +know if services are Immediate or Delayed Response. Hence, timeouts +will have to be handeled completely by the server. This shows how good +it is to have a thorough plan before implementing something like +this... +
      +

  • +
  • Added SSP message pipeline scheme to make the way it works more +transparent ;) +
      +

  • +
  • Changed Context Popup Service spec to including mouse +parameters into the SSP_SRASR and SSP_SSIR messages +
      +

  • +
  • Added Information Display Service in conjunction with Status Display Service. SPAs +providing Status Display should also be able to request Information +Display. Updated the Software list concerning this. +
      +

  • +
+ +

Specification changes as of Nov. 3rd, 2000 +

+
    +
  • Introduced this website and wrote some new stuff into 'about +this spec' on the mainpage +
      +

  • +
  • Added no-write-rule to general rules concerning shared memory +handling +
      +

  • +
  • Added list of prospective SSP implementing software with +possible services for each of the apps +
      +

  • +
  • SSP_SRASR: changed and updated data type spec for SRA service +request +
      +

  • +
  • Added handling of folder names to the send file, upload file +and compress file service specs in Services, SSP_SENDFILE, +SSP_UPLOADFILE, and SSP_COMPRESSFILE, see the service implementation +notes. +
      +

  • +
  • Decided to implement SSP into a text editor shared/static +library under development by Olaf, added the lib to implementing +software list +
      +

  • +
  • Moved Jo Even, Odd and Ralph to the involved developers list ;) +
      +

  • +
+ +

15.10.2 What is SSP?

+

SSP is an approach to make functionality of different +applications useable throughout the whole system. All applications are +targeted, although networking applications will probably benefit most +quickly. SSP is a Client-Server architecture. The SSP-Server +(background application) has globally registered applications +providing different services (service providing applications or SPAs). +Service Requesting Applications (SRAs) can use the SPA's services +for their own documents. +

+

Example: +

+
    +
  • User opens popup by right clicking into an image in Smurf +
  • +
  • User chooses 'System Services' in the popup and another popup +
  • +
  • with all possible services opens (provided by the SSP-Server) +
  • +
  • User chooses 'Send file' and another popup with registered Send +File Service applications opens (provided by SSP-Server) +
  • +
  • User chooses for example AtarICQ +
  • +
  • Smurf sends Service Initialization Request (SIR) for Send File +and chosen SPA (AtarICQ) to SSP-Server +
  • +
  • SSP-Server, if necessary, starts AtarICQ and sends Send File +SIR along with request for list of possible recipients +
  • +
  • AtarICQ sends list of online users to SSP-Server +
  • +
  • SSP-Server opens popup with possible recipients +
  • +
  • User chooses one +
  • +
  • Server sends Service Use Request (SUR) for Send File service to +SPA (aICQ) +
  • +
  • aICQ opens connection to recipient and sends image file +
  • +
  • aICQ confirms the Server with SPA Service Acknowledge (SPASA) +
  • +
  • Server confirms Smurf with Server Service Acknowledge (SSA) +
  • +
+ +

Possible services and registered applications are held in +different configuration files on the Server side. When new +applications want to be registered, it can be done at the first +communication between the SSP-Server and the application, or pre-use, +by the application installer or config program. The first possibility +is for convenience to the user, because simply copying and using a new +version of a program would not corrupt the registration with the +SSP-Server, since the application would register itself with the +Server at startup. Registering with the SSP-Server consists of a short +communication in which the program path and name of the SPA and the +provided services are sent to the Server. The Server could runtime +(when services are requested by the SRA) check for the existence of +registered SPAs, which will prevent errors upon service +initialization. +

+ +

What is the SSP-Server? +

+

The SSP-Server is an application running in the background that +manages all communication between SRAs and SPAs. All services are +hardwired into the Server. This system has been chosen for several +reasons: +

+
    +
  • The Server can perform error checking, correction and +prevention, which takes workload off the developers of implementing +SPAs and SRAs +
      +

  • +
  • The Server can perform user interaction (choice of service, +choice of SPA, user parameter input) without the SPAs and SRAs having +to hassle with it. +
      +

  • +
  • Appearance of the user interactive parts (popups, dialogs for +parameter input, etc.) is consistent +
      +

  • +
  • Hardwiring the services prevents messy implementation and +introduction of new services +
      +

  • +
  • The Server can combine different services into one, for example +Compress File Service and Send File or Upload File Service to Compress +and Send or Compress and Upload, without the SRAs and the SPAs having +to know about it. +
      +

  • +
  • The protocol can be extended in many cases (e.g. with global +contacts, see 5.) without interfering with any previous +implementations and specifications. +
      +

  • +
+ +

The Server may install a cookie to indicate its presence. This +might make it possible to have the Server run without menu_register, +which would keep it more or less completely invisible to the user. +This will prevent accidental termination of the Server (by +[Control]-clicking on its desk-menu entry) and make it work more as an +integral part of the system. +

+

The SPAs have to register with the Server. Currently, the best +way to do this seems to be at 2 different points: +

+

a. At the SPA's first time installation +
b. At every startup of the SPA +

+

b is for convenience and reliability reasons. Sending a small +registration information block to the Server at any SPA startup makes +it possible, for example, to simply copy a new version of an SPA over +an old one. If the new version supports new services, the Server will +find out about this on the SPA's startup and can automatically update +its configuration files, without the user having to mess with +anything. +

+

The user will have the possibility to switch single SPAs for +certain services on and off, for example for the Status Display +Service (see sspServices.txt). Registration protocol still has to be +specified. +

+

15.10.3 SSP messages

+

Messages are currently undefined. Free AES message numbers +have to be found and the SSP messages defined. +

+ +
    +
  1. Service Requesting Application Service Request +
      + +

    #define SSP_SRASR 0x126F
    +SRA -> Server
    +
    +AES message-buffer:
    +
    +  [0]    = SSP_SRASR
    +  [1]    = appl_id        - Application ID of SRA
    +  [2][3] = (long)dataLen  - LONG that gives length of data in the
    +                            shm-block
    +  [4]    = dataID         - Data identification (SSP_TEXT,
    +                            SSP_FILENAME ...)
    +  [5]    = shmID          - ID number for shared memory file
    +  Filename for shm-file is u:/shm/[applid]_data[id].ssp
    +
    +  For example, if Smurf has appl_id 25, is sending a file and
    +  chose id 0: u:/shm/25_data0.ssp
    +
    +
    The shm-block contains data to be transferred: +
      + + + + + + + + + + + + +
    SSP_COMPRESSFILE: Complete Filepath, including name and extension +
      +
    SSP_SENDFILE: Complete Filepath, including name and extension +
      +
    SSP_UPLOADFILE: Complete Filepath, including name and extension +
      +
    SSP_SENDMSG: Complete text message to be sent +
      + +
    + +
    [4] is important to the Server. Since the SRA doesn't have any +influence on the selection of services by the user, the SRA has to +tell the Server what the shared memory block contains, so that the Server can +decide which services apply to the data, how these services are to be +handled and what to send to the SPA, especially when combining +services. +
      +
    This is all the SRA has to do. The Server will open +popups/dialog windows for choosing possible services and service +providing applications - open shared memory file with Fcreate and Fcntl, +Fclose - send SRASR message to SSP-Server +
      +

  2. +
  3. Server Service Initialization Request +
      + +

    #define SSP_SSIR 0x1270
    +Server -> SPA
    +
    +AES message-buffer:
    +
    +  [0] = SSP_SSIR
    +  [1] = requestID - ID of Server request (SSP_RECIPIENTS,
    +                                          SSP_COMPRESSFORMAT...)
    +  [2] = sessionID - ID of SSP session
    +  Filename for shm-file is u:/shm/[applID]_init[sessionID].ssp
    +
    +
    For example, if aICQ is to send a file to another user, [1] will +contain SSP_RECIPIENTS. aICQ is then to open an shm-file with the name +built by the above conventions: u:/shm/32_init0.ssp (given aICQs +appl_id is 32), containing a list of recipients (nicknames) +separated by CRLF terminated by NULL. requestID will only +contain values for possible services for the SPA, as transmitted to +the Server upon SSP initialization (e.g. aICQ will only receive +SSP_RECIPIENTS for SSP_SENDFILE and SSP_SENDMSG). The SPA has to +respond with SSP_SPASI. +
      +

  4. +
  5. Service Providing Application Service Initialization +
      + +

    #define SSP_SPASI 0x1271
    +SPA -> Server
    +
    +AES message-buffer:
    +
    +  [0] = SSP_SPASI
    +  [1] = sessionID - ID of SSP session as given in SSP_SSIR
    +
    +
    The Server holds the status of each session and can hence +determine by the sessionID the name of the shm-file to open +and the type of data that it contains. +
      +
    In the SSP_SENDFILE / SSP_RECIPIENTS case, the Server will +retrieve the list of recipients from the file and open a popup/dialog, +listing them. After the user picks a recipient, the SPA will receive +SSP_SSUR: +
      +

  6. +
  7. Server Service Use Request +
      + +

    #define SSP_SSUR 0x1272
    +Server -> SPA
    +
    +AES message-buffer:
    +
    +  [0]    = SSP_SSUR
    +  [1]    = serviceID    - ID of service (e.g. SSP_SENDFILE)
    +  [2]    = sessionID    - ID of SSP session as given in SSP_SSIR
    +  [3][4] = (long)initID - ID of picked initialization datum
    +  [5]    = shmID1       - ID 1 for shm-block
    +  [5]    = shmID2       - ID 2 for shm-block
    +  [7]    = sspPar1
    +  [8]    = sspPar2
    +
    +
    The SPA can then open the file u:/shm/[shmID1]_data[shmID2].ssp +(e.g. 25_data0.ssp) and retrieve the data, initID is the +number of the initialization datum chosen by the user, for a ICQ +sendfile it would be the number of the recipient out of the list it +transmitted in SSP_SPASI. 1 would be the first recipient, n the n-th. +
      +
    The shm file contains: +
      + + + + + + + + + + + + +
    SSP_COMPRESSFILE: Complete filepath, including name and extension +
      +
    SSP_SENDFILE: Complete filepath, including name and extension +
      +
    SSP_UPLOADFILE: Complete filepath, including name and extension +
      +
    SSP_SENDMSG: Complete text message to be sent +
      + +
    + +
    sspPar1 and sspPar2 are parameters set by the +Server that indicate what to do. For SSP_SENDFILE, both are unused. +For SSP_COMPRESSFILE sspPar1 would be the ID of a shared memory file +(u:/shm/cffile[ssPar1].ssp) that contains the filename to pack the +archive to. +
      +
    For SSP_UPLOADFILE sspPar1 would be the ID of a shared +memory file u:/shm/uplfile[sspPar1].ssp) that contains the directory +name to upload the file to on the chosen Server (initID). +
      +
    The SPA is to copy or use the data contained in the +shm-block as quickly as possible, and then send SSP_SPASA back to the +Server. After that, the service should be performed (see also +Immediate Response and Delayed Response services!) +
      +

  8. +
  9. Service Providing Application Service Acknowledge +
      + +

    #define SSP_SPASA 0x1273
    +SPA -> Server
    +
    +AES message-buffer:
    +
    +  [0] = SSP_SPASA
    +  [1] = sessionID - ID of SSP session as given in SSP_SSIR
    +
    +
    This acknowledges performing the service and closes the current +session. Finally, the Server will send SSP_SSA to the SRA, after +receiving SSP_SPASA: +
      +

  10. +
  11. Server Service Acknowledge +
      + +

    #define SSP_SSA 0x1274
    +Server -> SRA
    +
    +AES message-buffer:
    +
    +  [0] = SSP_SSA
    +  [1] = dataID  - ID of data shm file as given in SSP_SRASR
    +
    +
    This indicates that the service is performing or has been +performed, and the SRA can close and delete the shared memory file +u:/shm/[appl_id]_data[dataID].ssp (e.g. 25_data0.ssp) using Fdelete. +
      +

  12. +
+ +

15.10.4 Services

+

The services are not directly requested by the SRA, but +determined by the Server, from the data identification provided by the +SRA in messagebuf[4] when sending SSP_SRASR. +

+
    + +
  • SSP_SENDFILE - Send File Service +
      +
    Interactive IRS +
      +
    Used to make a networking application send a file to a +destination (user). +
      +
    Upon sending of the SSP_SRASR message from the SRA to the +Server, the shared memory block will contain a NULL-terminated filename for +the file to be sent. dataID has to be SSP_FILENAME. +
      +
    The Server will request SSP_RECIPIENTS from the SPA with +SSP_SSIR. The SPA then has to provide a shared memory block that +contains a list of possible recipients separated by CRLF terminated by +NULL with the SSP_SPASI message. The Server will open a list of the +recipients for the user to choose from. +
      +
    The SPA will then receive a SSP_SSUR message containing the +number of the recipient from the list in ssp_par1 +(messagebuf[6]). The shared memory block will contain the NULL- +terminated filename of the file to be sent. +
      +
    The SPA concludingly has to send SSP_SPASA to the Server, to +close the session. +
      +
    The Server will send SSP_SSA to the SRA, indicating the service +is in progress and the shared memory file can be closed and deleted by +the SRA. +
      +
    Notes: +
    Synchronization of the global contacts and the local contacts of +the SPA can be done at this point. +
    Folders: if a directory name instead of a filename is passed, the +SPA should try to send the complete file folder, including all +subdirectories and all files inside. +
      + +

  • +
  • SSP_STATUSDISPLAY - Status Display Service +
      +
    Invisible IRS +
      +
    Used to make any application (preferably those with permanent +screen displays, for example TaskBar or MultiStrip or any Desktop) +display status icons of other applications. Also see the Context Popup +Service, which applications providing this service should implement to +be able to request a popup menu in context to the current status from +the SDS requesting app. +
      +
    Upon sending of the SSP_SRASR message, the SRA's shared memory block +will contain icon data. +
    A dataLen (messagebuf[2]/[3]) value of 0 (zero) +removes the icon from the status display. This has to be done before +exiting the SPA! +
    dataID has to be SSP_STATUSICON. +
      +
    The Server will send SSP_SSIR with SSP_SDS as requestID, +indicating use of the Status Display Service with the application id +of the SRA in msgbuf[6] for distinguishing different SRAs on the SPAs +side (e.g. to maintain consistent status icon positions in the +display). +
    SSP_SSIR will be sent to all registered SPAs providing this +service, that are switched on for SDS by the user. If +requestID (messagebuf[1]) is SSP_ENDSDS, the SPA has to remove +the icon referring to the status of the application with the +appl_id sent. +
      +
    The SPA will answer with SSP_SPASI without any further +parameters. +
      +
    The Server will then send SSP_SSUR containing the application ID +of the SRA in msgbuf[6]. The shared memory file will contain the icon data +(16x16) to display. If requestID in SSP_SSIR was SSP_ENDSDS, +the shm-block contains no data! The SPA has then to remove the status +icon of the SRA. +
      +
    The SPA will answer with SSP_SPASA +
      +
    The Server will send SSP_SSA to the SRA, to indicate the status +display has been updated, and the shm-file can be deleted. +
      +
    Notes: +
    Upon registration of the SPAs with the Server, the Server will +check if any not formerly registered apps providing the Status Display +Service have registered. If so, a list of these SPAs will be presented +to the user, with the possibility to turn the status display for +single applications on and off. This makes it possible for the user to +choose where the status icons are to be displayed. SPAs that are +switched off for status display will not receive SSP_SSIR messages +from the Server. +
      + +

  • +
  • SSP_DISPLAYMESSAGE - Display Message Service +
      +
    Invisible IRS +
      +
    Used to make an application display a text message from another +application in one of their own windows. For example, messages +received in iconified aICQ windows can be sent to be displayed in +visible aIRC windows and vice versa. +
      +
    Upon sending of SSP_SRASR by the SRA, the shared memory block will +contain the text to display. dataID has to be SSP_TEXT. +
      +
    The Server will send SSP_SSIR with the application ID of the SRA +in msgbuf[6] to the SPA +
      +
    The SPA will answer with SSP_SPASI +
      +
    The Server will send SSP_SSUR containing the application ID of +the SRA in msgbuf[6]. The shared memory block will contain the text to +display. +
      +
    The SPA will display the text and answer with SSP_SPASA. It is +up to the SPA to choose one or more of its windows to display the text +in. +
      +
    The Server will send SSP_SSA to the SRA. +
      +
    Notes: +
    Other than with the send message service, the text message is only +to be displayed by the SPA, not sent over network connections +to other users. +
      + +

  • +
  • SSP_SENDMESSAGE - Send Message Service +
      +
    Interactive IRS +
      +
    Used to make a (network) application post a message from another +application in one of their own windows to a certain destination. For +example, a text block selected in an editor can be sent to an online +user in aICQ or to a channel or chat in aIRC, or as an email by any +email client. +
      +
    Upon sending of SSP_SRASR by the SRA, the shared memory block will +contain the text to post. dataID has to be SSP_TEXT. +
      +
    The Server will send SSP_SSIR requesting SSP_RECIPIENTS to the +SPA. +
      +
    The SPA will answer with SSP_SPASI providing a list of possible +destinations in shared memory (e.g. online users in aICQ or open +channels/chats in aIRC) separated by CRLF terminated by NULL. The +Server will open a list with possible destinations for the user to +choose from. +
      +
    The SPA will then receive a SSP_SSUR message containing the +number of the recipient from the list in ssp_par1 +(messagebuf[6]). The shared memory block will contain a NULL- +terminated string that is the message to send. +
      +
    The SPA will post the text to the chosen destination and answer +with SSP_SPASA. +
      +
    The Server will send SSP_SSA to the SRA. +
      +
    Notes: +
    Synchronization of global and local contacts can be done at this +point. The Server might be able to determine if the recipients are +email addresses (maybe by the SPAs registration information) and +provide a possibility to type in a new recipient for the user. +
      + +

  • +
  • SSP_UPLOADFILE - Upload File Service +
      +
    Interactive IRS +
      +
    Used to make a networking application (ftp client or similar) +upload a file to a destination (Server/directory). +
      +
    Upon sending of the SSP_SRASR message from the SRA to the +Server, the shared memory block will contain a NULL-terminated filename for +the file to be uploaded. dataID has to be SSP_FILENAME. +
      +
    The Server will request SSP_RECIPIENTS from the SPA with +SSP_SSIR. The SPA then has to provide a shared memory block that +contains a list of possible destination Servers (from the favorites) +and a list of directories (from the favorites) with the SSP_SPASI +message: +
    server|user|pass|directory|directory[CRLF] +
    server|user|pass|directory|directory|directory[CRLF] +
    server|user|pass|directory[NULL] +
      +
    The Server will open a list of the destination Servers and +directories for the user to choose from, and/or provide a text edit +field for typing in Server, directory and login/password. +
      +
    The SPA will then receive a SSP_SSUR message, the shared memory +block will contain the NULL-terminated filename of the file to be sent +followed by the NULL-terminated Server name, NULL- terminated +directory. +
      +
    The SPA concludingly has to send SSP_SPASA to the Server, to +close the session. The Server will send SSP_SSA to the SRA, indicating +the service is in progress and the shared memory file can be closed +and deleted by the SRA. +
      +
    Notes: +
    The ftp servers, directories and user/pass combinations will be +held in global contacts as well, at some point. The SPA will still +send the local favorites, and the global contacts can be synchronized +with the local contacts by the Server at this point. Newly entered +contacts can be integrated into the global contacts. +
      +
    Folders: if a directory name instead of a filename is passed, +the SPA should try to upload the complete file folder, including all +subdirectories and all files inside. +
      + +

  • +
  • SSP_COMPRESSFILE - Compress File Service Interactive +DRS +
      +
    Used to make an archiver application compress a file +
      +
    Upon sending of the SSP_SRASR message from the SRA to the +Server, the shared memory block will contain a NULL-terminated filename for +the file to be compressed. dataID has to be SSP_FILENAME. +
      +
    The Server will request SSP_FORMATS from the SPA with SSP_SSIR. +The SPA then has to provide a shared memory block that contains a list +of possible compression formats (for TwoInOne e.g. LZH and ZIP, GuiTar +TAR, GZ, TGZ) with a SSP_SPASI message. The Server will open a list of +the formats for the user to choose from. The SPA can also provide one +format in different versions, e.g. for compression levels ZIP low, +medium and high compression. +
      +
    The SPA will then receive a SSP_SSUR message containing the +number of the format from the list in ssp_par1 +(messagebuf[6]). The shared memory block [shmID]_data.ssp will contain +the NULL- terminated filename of the file to be sent. Additionally, +the destination directory and filename for the archive will be +provided in a shm-block with the name [archiver- +appl_id]cmpname[sessionID].ssp, for example 25cmpname0.ssp, if the +archiver has appl_id 25. +
      +
    After finishing (!!) compression of the file, the SPA will send +SSP_SPASA. +
      +
    The Server will send SSP_SSA to the SRA, indicating the finished +compression of the file. +
      +
    Notes: +
    This service is a DRS, the acknowledge message is sent by the SPA +after finished compression of the file. This is because this service +can be combined with others (Send file or Upload file), so the archive +file might have to be used for the second service. +
      +
    Folders: if a directory name instead of a filename is passed, +the SPA should try to compress the complete file folder, including all +subdirectories and all files inside, incorpoating the directory +structure of the compression source into the compressed archive. +
      + +

  • +
  • SSP_CONTEXT - Context Popup Service Interactive IRS +
      +
    Used to make an app display a context menu in context of the +current status displayed with the Status Display Service at a certain +position on screen, and react on the user's choice from the popup. +
      +
    This service will be requested by the application that +provides the Status Display Service SPA will in this case also be SRA +and SRA also SPA. +
      +
    Upon sending of the SSP_SRASR message from the SRA (the SDS +providing application) to the Server, there will be no shared memory +block. dataID has to be SSP_CONTEXT. messagebuf[6] and [7] have to +contain the X- and Y-position of the mouse click, messagebuf[8] the +mouse button vector as returned from evnt_button or evnt_multi. +messagebuf[9] has to contain the application ID of the application +that the status icon refers to. The appl_id for every icon is +sent with the Status Display Service. dataID has to be +SSP_CONTEXTREQUEST. +
      +
    The Server will request SSP_POPUP from the SPA with SSP_SSIR. +
      +
    The SPA has to answer with an SSP_SPASI message. No parameters +(except requestID and sessionID) will be of any +meaning in either of the messages. +
      +
    The SPA will then receive a SSP_SSUR message containing the X- +position of the mouse click in messagebuf[6] and the Y-position in +messagebuf[7]. Both coordinates are screen coordinates with 0/0 in the +upper left corner. messagebuf[8] will contain the mouse button vector, +stating which button(s) have been pressed, as usually returned by the +AES evnt_xx functions. The SPA will then display its context popup, +preferably in context to the current status displayed with the Status +Display Service. +
      +
    After the user has chosen a popup entry, the SPA will send +SSP_SPASA. +
      +
    The SRA (the Status Display Service providing application) will +receive SSP_SSA. +
      +
    Notes: +
    When receiving the SSP_SSIR message, the application providing the +CPS (and hence requesting SDS) service, should open the context popup +as quickly as possible, to provide responsivity and reasonable user +feedback. +
      +
    The context popup should be in context to the current status +display, for example if aICQs context popup is opened, one menu entry +for connecting or disconnecting to an ICQ Server should be used, +saying 'Connect' if aICQ is disconnected, and 'Disconnect' if it is +already connected. Other possibilities would be to provide the other +user status modes (Online, Invisible, Do not disturb, etc.) in the +context popup for quick access, or an entry 'bring to top', that tops +all aICQ windows. Since the context popup is actually displayed and +handled by the application that uses the SDS, submenus and +hierarchical popups are possible and encouraged. Try to keep it +functional and easy to use, without overloading the context menus with +options. The application does not need to be fully operateable only by +the context menu, it's rather a way to make options that are +status-dependent or are frequently used accessible quickly and easily. +
      + +

  • +
  • SSP_DISPLAYINFO - Display Information Service Interactive +IRS +
      +
    Used to make an app send information (will mostly be used in +context of the current status displayed with the Status Display +Service) in the form of ASCII text. Can be used, for example, if a +BubbleGEM event on a Status Icon occurs in TaskBar, to make the +application requesting the status display send extended information +about the current status for TaskBar to display. +
      +
    This service will probably most commonly be requested by the +application that provides the Status Display Service SPA will in this +case also be SRA and SRA also SPA. +
      +
    Another possibility would be PS-Control-like applications, that +show system information about running processes (CPU and memory usage, +etc.). These could then also display information about the +application's current status. N.AES could use this service to display +the current status of the applications when switching apps with +[Alternate]+[Tab]. +
      +
    Upon sending of the SSP_SRASR message from the SRA (the SDS +providing application) to the Server, the shared memory block has to be a +buffer with space for the maximum size of displayable information and +read and write access rights. +
    dataID has to be SSP_INFOBUF. +
      +
    The Server will request SSP_INFO from the SPA with SSP_SSIR. +
    The SPA is to prepare the information to display (consider current +status). +
      +
    The SPA has to answer with an SSP_SPASI message. No params +(except requestID, sessionID) have any meaning. +
      +
    The SPA will then receive a SSP_SSUR message. +
    messagebuf[7] will contain the maximum length of +information. The SPA is then to copy the information to display +into the existing shared memory block provided with SSP_SSIR. The +SPA doesn't need to create its own shm-block. +
      +
    The SPA will send SSP_SPASA after copying the string to shm +and freeing temporary memory. +
      +
    The SRA (e.g. the Status Display Service providing application) +will receive SSP_SSA. This indicates that the information is now in +the shared memory file provided at SSP_SRASR and can be displayed, and +the shm-file deleted. +
      +
    Notes: +
    Careful with the shared memory on this one! The SRA has to +create the shared memory file as read/write! Otherwise the SPA +might not be able to copy the information text to it, if the operating +system supports access rights for shared memory! +
      +
    Delays for the information display (e.g. showing the display +after the mouse has been over the status icon for more than 2 seconds +or so) will be handled by the SRA. +
      +
    The information display should be in context to the current +status display, for example displaying the current user status mode +(Online, Invisible, Do not disturb, etc.) +
      +
    Only display vital information, try not to overload the bubble. +Use the information to display more details about what the current +status icon means, things like that. +
      +

  • +
+ +

15.10.5 SSP Server registration

+

Messages are currently undefined. Free AES message numbers +have to be found and the SSP messages defined. +

+

All SPAs have to register with the Server at installation and at +every startup of the application. Here's how it works: +

+ +
    +
  1. Service Providing Application Server registration +
      +
    #define SSP_SPASREG +
      +
    First initial message from the SPA to the Server. +
      +
    AES message-buffer: +
      +

      [0] = SSP_SPASREG
    +  [1] = appl_id           - Application ID of SPA
    +  [2][3] = (long)services - Long bit vector for supported services
    +                            (see below)
    +
    +
    Put your application ID into messagebuf[1]. messagebuf[2]/[3] is +a 32bit LONG value that describes the services provided by the +application, composed as follows: +
      +
    #define SSP_PSENDFILE        0x01
    +#define SSP_PSTATUSDISPLAY   0x02
    +#define SSP_PDISPLAYMESSAGE  0x04
    +#define SSP_PSENDMESSAGE     0x08
    +#define SSP_PUPLOADFILE      0x10
    +#define SSP_PCOMPRESSFILE    0x20
    +#define SSP_PCONTEXTPOPUP    0x40
    +#define SSP_PDISPLAYINFO     0x80
    +
    +
    Bringing the values together composes a bit-vector that tells +the Server which services are provided. Response to this message is +SSP_SREG. +
      +

  2. +
  3. SSP Server Registration +
      +
    #define SSP_SREG +
      +
    AES message-buffer: +
      +

      +[0] = SSP_SREG [1] = shmID - ID of shared memory block +
        +

      +
    + +
    shmID is identification for a shared memory block +provided by the Server with this message. +
      +
    For example, if Smurf has appl_id 25, the registration +shared memory block is: u:/shm/25_reg.ssp +
      +
    This shm-block provides 4096 bytes of space and is read/write. +Copy the full path and name of your application into this memory +block, terminate with CRLF and append the long application name of +your app (like used in menu_register) and terminate with NULL again. +Example: d:\apps\misc\my_application.app[CRLF]My +Application[NULL] +
      +
    For the special case that your application has changed the long +app name in a new version, terminate the application name with CRLF +instead of NULL and append other possible old application names, then +terminate with NULL: +
      +
    d:\apps\misc\my_application.app[CRLF]My old application[CRLF]My +newer Application [CRLF]My current Application[NULL] +
      +
    Respond to the Server with SSP_SPARF. +
      +

  4. +
  5. SSP Service Providing Application Registration Finish +
      +
    #define SSP_SPARF +
      +
    AES message-buffer: +
      +

      [0] = SSP_SPARF
    +  [1] = appl_id           - Application ID of SPA
    +  [2] = version as BCD    - Version ID of SPA
    +
    +
    Upon sending this message, the shm-block provided with SSP_SREG +must contain the full path and name of your application. +
      +
    The version ID is a binary coded decimal. For example, for +Version 1.0 of your program pass 0x0100. Version 1.01 would be 0x0101, +12.10 would be 0x1210. The version number in combination with the long +application name will provide pretty safe identifications of +applications for the Server, which will make automatic registration +and configuration update possible. +
      +
    This message closes the registration session. The Server will +take the sent data into its configuration and update existing +configurations for this application with the new one. +
      +

  6. +
+ +

15.10.6 General Rules

+
    +
  • All fixed message parameters are sent in the AES +message-buffer, data and extended parameters are sent in a shared memory +block. +
      +

  • +
  • There is no direct communication between SRA and SPA, the +Server handles all messages for purposes of error checking and +extending messages and parameters with Server-handled components (e.g. +providing GEM object structures for popups and similar) +
      +

  • +
  • SPAs should provide services with as litle output as possible. +For example when aICQ is started by the SSP-Server with a Send File +SIR, the contact list window should stay closed and only a file +transfer window be opened (maybe configurable) +
      +

  • +
  • Error-messages concerning protocol issues should be posted by +the SRA, so that the service use can be provided as completely as +possible on the SRA side without having to handle dialogs and messages +from the SPA. Timeouts on the SRAs side should depend on the service. +We will provide suggestions for error handling, timeouts and other +special cases in the final documentation. Error-messages concerning +performing the service should be posted by the SPA (e.g. file transfer +errors in aICQ). +
      +

  • +
  • The SPA is never to change data in the shared memory +blocks unless this is explicitly specified for the particular +service! Keep in mind it's shared, so every change the SPA does +might apply to the SRA as well. For the current services it is +absolutely necessary that the SPA does not write to the shared memory +blocks. Exceptions from this rule so far: Display Information Service. +
      +

  • +
+ +

Why shared memory? +

+

Using shared memory for the data and parameter transfer between +SPA, Server and SRA has several reasons. There is an ongoing fight +about whether to use globally allocated memory blocks (Mxalloc) or +shared memory for data transfer. Reasons that speak for shared memory +are the following: +

+
    +
  • Shared memory is generally considered 'cleaner' than global +memory blocks, and it's more or less the standard way to transfer data +in memory between applications in Un*x operating systems. +
      +

  • +
  • Using global memory blocks would mean that the SRA would have +to either hold all possibly transferrable data in global blocks (not +really an option), or, upon requesting a service, would have to +allocate a new global block of the size of the data, copy the data to +transfer there and free the memory block again after the service was +performed. Handling shared memory is easier, since it only consists of +an Fcreate and an Fcntl call. +
      +

  • +
  • Shared memory can be declared as read-only. I'm not sure if +this is currently implemented in MiNT, but the word goes that it will +be. That means, that there will be a general protection by the +operating system on the SRA's side against SPAs accidentally writing +into their memory blocks. +
      +

  • +
  • If we have an elegant mechanism like that which also works with +MiNT and MagiC, why not use it? +
      +

  • +
+ +

15.10.7 Timeouts and error handling

+

There will be no SRA-side timeouts. Timing out will be handled +completely on the Server side, because a) the SRA doesn't know about +Immediate or Delayed Response Services, and b) depending on the SPA +that might have to be started first, startup time may screw up SRA- +side timeouts. Besides that, it takes even more work off the SRA's +back ;) +

+

Timing out between SSP_SRASR and SSP_SSA will be done by the +SSP- Server, with consideration of startup times and IRS/DRS cases. +The amount of time before a service times out will have to be +determined once the first Server implementations and protocol +implementations on application side are done. Approximately 3 to 5 +seconds after possible startup of the SPA should be sufficient for +IRS. +

+

The Server will check all errors it can (nonexisting or empty +shm- files, etc.). If an error during a session occurs, the Server +will send SSP_SSA to the SRA to make sure the shm-file gets closed, +and then report the error in an alert box. Timeout for delayed +response services will depend on the type of service and on +Server-side determinations. For example, If the SPA knows an error +occured, it can send an error-message instead of SSP_SPASA. Still, in +case of a crash of the SPA, a timeout has to be implemented. +

+

Compress File Service timeouts can be done with consideration of +the time between size changes of the archive file, opened and closed +files or memory usage of the SPA. If none of the above changes, at +some point it's safe to say that some error occured during performing +the service (probably a crash of the SPA). In this case the Server +could try to terminate what's left of the SPA, close shared memory files, +clean up and close the communication session and start the whole thing +over (Server-side retry). If that doesn't work, the Server will send +SSP_SSA to the SRA to acknowledge and make sure the SRA frees +temporary memory and closes shared memory files, and then display an +error-message. +

+

15.10.8 SSP message pipeline

+

+

Every arrow is one AES message. This makes clear that there +are only 2 messages (send one, receive one) to handle for the SRA, and +only 4 (send 2, receive 2) for the SPA. The majority of the work is +done by the SSP-Server. The communication is a request-response +scheme, where every message has a response from the messages' +recipient. +

+

15.10.9 Defines (SSP)

+

Provided Services for Server registration +

+
#define SSP_PSENDFILE        0x01
+#define SSP_PSTATUSDISPLAY   0x02
+#define SSP_PDISPLAYMESSAGE  0x04
+#define SSP_PSENDMESSAGE     0x08
+#define SSP_PUPLOADFILE      0x10
+#define SSP_PCOMPRESSFILE    0x20
+#define SSP_PCONTEXTPOPUP    0x40
+#define SSP_PDISPLAYINFO     0x80
+
+

Services for Service Requesting Application Service Request +

+

Same as when registering to the Server. +

+
#define SSP_SENDFILE        0x01
+#define SSP_STATUSDISPLAY   0x02
+#define SSP_DISPLAYMESSAGE  0x04
+#define SSP_SENDMESSAGE     0x08
+#define SSP_UPLOADFILE      0x10
+#define SSP_COMPRESSFILE    0x20
+#define SSP_CONTEXTPOPUP    0x40
+#define SSP_DISPLAYINFO     0x80
+
+ +

Data identification for Service Requesting Application +Service Request +

+

messagebuf[4], identifies the type of data for the Server to +determine possible services. +

+

#define SSP_TEXT 0x01 +
The shared memory block contains NULL-terminated ASCII text. Possible +services will be: SSP_DISPLAYMESSAGE, SSP_SENDMESSAGE (sends or +displays the text directly) +
SSP_SENDFILE, SSP_UPLOADFILE, SSP_COMPRESSFILE and combinations +(sends, uploads or compresses Text as file) +

+

#define SSP_FILENAME 0x02 +
The shared memory block contains Null-terminated file path and +-name. Possible services will be: SSP_SENDFILE, SSP_UPLOADFILE, +SSP_COMPRESSFILE and combinations (sends, uploads or compresses file) +

+

#define SSP_STATUSICON 0x04 +
The shared memory block contains Icon data. Possible Service: +SSP_STATUSDISPLAY +
This service will be started and performed without user +interaction. The server will, when receiving SSP_SRASR with +SSP_STATUSICON as dataID, send a request for SSP_STATUSDISPLAY to the +SPA. +

+

#define SSP_INFOBUF 0x08 +
The shared memory block contains nothing but has to be a buffer +with space for the maximum length of displayable information +(determined by the SRA) and have read and write access rights.. +Possible Service: +
SSP_DISPLAYINFO +

+

#define SSP_CONTEXTREQUEST 0x10 +
No shared memory block has to be created. This dataID indicates +use of the Context Popup Service. Possible Service: +
SSP_CONTEXT +

+

This makes clear that the SRA usually does not request a +specific service. It provides a certain type of data to the Server +(and thus to the SPA), and the Server determines which services can be +used with this type of data. In case of SSP_CONTEXT, SSP_INFOBUF and +SSP_STATUSICON there is only one possible service. The Status Display, +Display Information and Context Popup Services are usually used in +conjunction. +

+

SRA-side definition of a data-type has the advantage that new +services can be introduced and immediately used with a new Server +release, without changes in the SRA. Also, the Server will provide the +popup menus for choosing SPA and service in context to the data +identification. For SSP_FILENAME for example, the popups could look +like this: +

+
+ + + + + + + + + + + + + + + + + + + + +
System Services ->Send File
 Upload File
 Compress File
 Compress & Send
 Compress & Upload
+
+ +

While for SSP_TEXT it could be like this: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
System Services ->Send as message
 Send as File
 Upload as File
 Compress as File
 Compress & Send as File
 Compress & Upload as File
+
+ +

AES message definitions +

+

We reserve the messages 4719 (0x126F) to 4739 (0x128D), messages +after 0x1274 for future use. +

+
#define SSP_SRASR  0x126F
+#define SSP_SSIR   0x1270
+#define SSP_SPASI  0x1271
+#define SSP_SSUR   0x1272
+#define SSP_SPASA  0x1273
+#define SSP_SSA    0x1274
+
+

15.10.10 How to implement an SRA

+

Here's a step-by-step instruction on how to implement SSP as a +Service Requesting application. All code provided here is also +available as sample code in the archive in the file SRAtools.c +(SRAtools.gfa for GFABasic, SRAtools.s for assembler). Use and modify +as necessary :) +

+

The data identification +

+

An important thing is that the SRA does not really request or +distinguish between specific services. The SRA rather determines a +dataID depending on the user action, and the type of object the user +action leading to the use of system services was performed on, and +sends this dataID to the Server. The Server will then figure out which +services can be used with the provided data. This makes it possible to +implement new services into the SSP-Server using the same data-types +without changing the SRAs. +

+

Communication Session +

+

A second concept that should be understood is the use of +sessions. A session between an SRA and the Server is started with the +SSP_SRASR message, and ended when the SRA receives SSP_SSA. The Server +can handle multiple sessions for one SRA and multiple SRAs at a time +(up to 32 sessions per SRA at a time, and 32 different SRAs at a time, +that's 1024 parallel SRA sessions, meaning the use of 1024 service +requests at a time, max). +

+

Every session is usually bound to a certain shared memory block that +contains the data necessary for the session. One SRA session always +refers to one service request. For this, it is necessary also that the +SRA can distinguish between different sessions. Every session has an +ID number, which also makes up the last characters of the shared +memory filename (shmID passed in SSP_SRASR). +

+

Multiple sessions from your application at a time can occur for +example like this: +

+
    +
  • AtarIRC as SRA of Status Display Service sends SSP_SRASR with +dataID SSP_STATUSICON to change the status display, due to starting a +dcc download from a user +
      +

  • +
  • Before the Server acknowledges with SSP_SSA, the user starts a +dcc send to another user; a second SSP_SRASR message is sent, opening +a second session and hence providing a second shared memory block and +the corresponding file in u:/shm/ +
      +

  • +
+ +

To implement this, a simple 32-bit bit-vector can be used to +determine if a session is active or not. Each bit represents a +possible session. Before starting a session (before sending +SSP_SRASR), check the bits from 0 to 31. If a bit is not set, another +session can be opened. Set the bit and use the index of the bit as the +session ID (shmID). This code uses the global 32-bit integer +sessionVector as the indicator for active sessions, and returns the +next inactive session number, or -1, if all possible 32 sessions are +active: +

+
long sessionVector;
+
+int determineSessionID(void){
+
+  int idCounter, noMoreSessions=1;
+
+  for(idCounter=0; idCounter
+    if( (sessionVector&(1<&ltidCounter)==0 ){
+
+      sessionVector |= (1<<idCounter);
+      noMoreSessions = 0;
+      break;
+    }
+  }
+  if(noMoreSessions) return(-1);
+  else return (idCounter);
+
+}
+
+

1. Finding the Server +

+

The SRA has to find the Server's appl_id in order to +send messages. Do this at program startup and store the application id +of the Server for later use. This is done basically the same way it is +in OLGA: +

+
    +
  • Read environment variable SSP_SERVERNAME to retrieve the Server +application name +
      +

  • +
  • Use appl_find to determine the Server's appl_id +
      +

  • +
  • If the Server can't be found: +
      +

      +
    • Read environment variable SSP_SERVERPATH to retrieve the Server +application's path and filename +
        +

    • +
    • Start Server with shel_write +
        +

    • +
    • Read environment variable SSP_SERVERNAME to retrieve the Server +application name +
        +

    • +
    • Use appl_find to determine the Server's appl_id +
        +

    • +
    • If the Server application is not in the specified path or if +starting fails: +
        +

        +
      • output an understandable error message to the user, possibly +referring to a chapter in your application's documentation +
          +

      • +
      • continue starting your application, not using SSP SSP is an +addition to the system, unavailability should not interfer with your +application's usual behaviour, except your application explicitly +requires SSP to work (complete applications of different kinds that +basically consist of an SSP SRA client are possible). +
          +

      • +
      + +

    • +
    + +

  • +
+ +

2. Using a service +

+

2.1 Determining the data-type +

+

To use a service, the SSP_SRASR AES message has to be sent to +the Server. Before sending the message, determine the data-type used. +For example, if a block has been selected in an editor and the user +wants to use SSP by right clicking and choosing System Services from +the context menu, or from the editor's menu bar, the data-type +(referred to as dataID) is SSP_TEXT. If for example an image file or +MP3 is to be handled via SSP, the data-type should be SSP_FILENAME. +

+

For the Status Display Service, the data-type has to be +SSP_STATUSICON. This service should be initialized automatically, +without user interaction, after the Server has been started, at +program startup. See also 'Data identification' for SSP_SRASR for +short explanations of the data-types and the corresponding data in the +shared memory block. +

+

2.2 Requesting a service +

+

2.2.1 Creating shared memory file +

+

Data is sent in a shared memory file. Whether one has to be +created or not depends on the dataID (thus on the service type). There +is a unique ID for every shm-file used for each service request, and +the name of the file is built by the following conventions: +u:/shm/[appl_id]_data[shmID].ssp For example if Smurf with +appl_id 25 is sending a file and chose ID 0: +u:/shm/25_data0.ssp +

+

The shared memory ID is vital to the Server, because it is used +to distinguish between different service requests and SRA +communication sessions that are 'alive' at the same time. A session is +'alive' between the sending of SSP_SRASR and receiving SSP_SSA. For +example, the user could make your application request Send File +Service, while you haven't gotten the SSP_SSA response for the +SSP_STATUSICON request. This would make you open a second session, and +a second shared memory file, while the session for the status display +is still alive. +

+

There are two different ways to handle this: 1. Wait until the +SSP_SSA response for one request has come in before sending the second +request +

+

2. Keep track of sent requests and received responses. Make an +array, the index being the number of the request sent (which can be +the shmID as well), and set the array value to 1 if a request +has been sent. If SSP_SSA comes in, set the referring array value to +0. Use only indices (shmIDs) if the array value is 0. +

+

The second way is recommended. +

+

After you have built the name for the shared memory file, use +Fcreate to create the file. Read/Write access rights have to be set +correctly, depending on the request type! +

+

Then, bind the memory block that contains the data (text, +filename, icon data, etc., depending on dataID) to the file using +Fcntl. Close the file with Fclose. The following code calls the above +routine detemineSessionID, uses the returned ID to build the filename +and creates the file. The function openSession takes two +parameters: access describes the access rights to the +memory block, and *memPtr is a pointer to the memory block to +share. buildFilename takes a determined session ID as parameter, +builds a filename from it and returns a pointer to the static string +containing the filename. buildFileName assumes appl_id being +the SRA's (your) application ID available as a global variable! +

+
int openSession(int access, void *memPtr)
+{
+  int fHandle;
+  int sessionID = determineSessionID();
+  char *filename = buildFileName(sessionID);
+
+  fHandle = Fcreate(filename, access);
+  Fcntl(fHandle, memPtr, SHMSETBLK);
+
+  return(sessionID);
+}
+
+char *buildFilename(int sessionID)
+{
+  static char filename[256] = "u:/shm/";
+  char tmpstring[4];
+
+  strcat(&filename, itoa(appl_id, tmpstring, 10));
+  strcat(&filename, "_data");
+  strcat(&filename, itoa(sessionID, tmpstring, 10));
+  strcat(&filename, ".ssp");
+
+  return(&filename);
+}
+
+

The return value of openSession is the new sessionID +which can be used to pass to the Server in the service request. The +filename could also be stored, but that's not really necessary because +the Server passes the shmID that it received from the SRA back +to it, in the SSP_SSA acknowledge message, so the filename can be +built again to delete the file. +

+

2.2.2 Sending a Service Request +

+

Send an SSP_SRASR message to the Server, filling the AES +message- buffer with the following values: +

+
    [0] = SSP_SRASR
+    [1] = appl_id
+    [2][3] = (long)dataLen
+    [4] = dataID
+    [5] = shmID
+
+

appl_id (messagebuf[1]) +
This is your appl_id. Make sure to fill this correctly, +because the Server will distinguish different SRA-communication +sessions by the application IDs of the SRAs. +

+

dataLen (messagebuf[2]/[3]) +
The length of the data to transfer (32 bit!). For example the +length of the string to send if dataID is SSP_TEXT or SSP_FILENAME, or +the length of the icon data in the SSP_STATUSICON case. +
messagebuf[2] holds the upper 16 bits, [3] the lower 16 bits: +
messagebuf[2] = (int)(dataLen>>16); +
messagebuf[3] = (int)(dataLen&0xFFFF); +

+

dataID (messagebuf[3]) +
The identification value of the data you determined, for the +Server to find out which services can be possibly used. +

+

shmID (messagebuf[4]) +
The identification number for the shared memory block (your session ID). +This is absolutely necessary for the Server to distinguish different +sessions with one SRA. +

+

If the Server is in debug mode (environment variable +SSP_SERVERDEBUG is defined), it will print out all information +received from the SRA in an understandable form into a window, and +write it to a logfile sspdebug.log in the same directory the Server +application is in. It will post error-messages and possible +suggestions on how to fix the error in both the window and the log +file. +

+

3. Closing a session on SSP_SSA +

+

When your application receives SSP_SSA, this means that a +service has been performed (DRS), or has been started to be performed +(IRS). +

+

messagebuf[1] will contain the shmID you passed to the +Server in SSP_SRASR. This makes it possible for you to find out which +session the response is for. Build a filename like in 2.2.1 (or store +the filename when sending SSP_SRASR) and delete the shared memory file, free +all temporary memory you have possibly allocated for the service +request, and you're done. The following code uses the above function +buildFilename and the sessionID from messagebuf[1] as a +parameter to build a filename, delete the shm-file, and clear the bit +of the session in the global sessionVector variable: +

+
int closeSession(int sessionID){
+
+  char *fileName = buildFilename(sessionID);
+  return Fdelete(fileName);
+  sessionVector &= ~(1-sessionID);
+
+}
+
+

Don't forget to free temporary memory that you might have +allocated to compose the data. You could also store the memory pointer +for each session in an array of pointers and implement the Mfree/free +into the closeSession function. NULL pointers in the array could +indicate that no temporary buffer was allocated (e.g. when you share +your internal buffers for filenames, text or other data, directly). +This could be done by adding a parameter tmpFlag to the +openSession function that indicates if memPtr is a temporary +buffer. openSession could then automatically insert memPtr or +NULL at the appropriate position in a global array, one entry for +every session, with sessionID as the index. closeSession could then +get the pointer from the array at the index of its parameter +sessionID and perform Mfree on the pointer, if it's not NULL. +This would automate and connect the processes of opening and closing +sessions internally, creating and deleting shared memory files, and freeing +possible temporary buffers. +

+

4. The different dataIDs and their impact on sessions +

+

4.1 SSP_STATUSICON request and the Status Display +Service +

+

The dataIDs have an influence on how a session and service is +handled internally. For SSP_TEXT and SSP_FILENAME, you don't have to +worry about it, just go by the above scheme. For SSP_STATUSICON +however, there is a twist. The status icon will be displayed by all +applications that are switched on for Status Display Service. The +service is invisible, meaning it won't be triggered by a user action +rather than automatically, on program startup and anytime the status +of your program changes. When that happens, and you want to display a +different status icon, you have to send another request with +SSP_STATUSICON as dataID. All 'on' applications for Status Display +Service will then update the icon they display for your application's +status. +

+

When you exit your application and have sent a service request +with SSP_STATUSICON, you have to inform the Server that your status +icon is to be removed from all displaying applications! Implement a +service request with the dataID SSP_ENDSDS into the exit code of your +application. The Server will then inform all applications that display +your status icon that the icon has to be removed. +

+

A nice idea would be to display the download status of internet +applications in the status icon, by making the icon a 16 pixel high or +wide progress bar. Update the status icon every time enough data has +been downloaded to fill another pixel line of the progress bar, and +there you go. Memory could be saved, if necessary, by updating the +icon data dynamically instead of including a separate icon for every +progress bar phase. +

+

4.2 Requesting SSP_STATUSICON will make your SRA an SPA +

+

Applications that provide Status Display Service will usually be +able to request the SSP_DISPLAYINFO and SSP_CONTEXTPOPUP services. +This means that if you request service with SSP_STATUSICON as dataID, +you will probably receive a request for SSP_DISPLAYINFO or +SSP_CONTEXTPOPUP at some point! Look at How to implement an SPA on how +to provide the Display Information and Context Popup services. +

+

4.3 The icon data +

+

The icon data has to be put into the shm-block as follows: +

+
  mono_icon1 monomask1
+  [16col_icon1 16colmask1]
+  [256col_icon1 256colmask1]
+  [CRLF]
+  [mono_icon2 monomask2]
+  [16col_icon2 16colmask2]
+  [256col_icon2 256colmask2]
+  NULL
+
+

Entries in [] are optional. That means the SRA has to send at +least one monochrome status icon and its mask. The application +providing the status display will pick the icon best for the current +screen colour depth. The mask data directly follows the icon data +without any separation! The spaces above are just for readability. All +mask data is 1 bit, as provided by the GEM ICNBLK and CICNBLK +structures. The xx_icon2 data blocks are optional second icons +for animation. The SPA will read, if provided, both icon data blocks +for the current screen mode and switch in 1 second intervals between +the 2 icon blocks. This is useful to make status changes noticeable. +To make the 'blinking' animation stop, send another service request +with SSP_STATUSICON and only the xx_icon1 icon data. Blinking +should be done for no longer than 8 seconds, after that the second +status display request should be performed by your application to +switch to a static icon. The data should be in the regular screen +format, meaning you should incorporate possible status icons in your +application's resource file, and copy the raw graphics data from the +icon objects into the memory block that will be shared, one after +another, and terminate with a NULL byte. The icons must have 16x16 +pixel dimensions. A good approach would be to have the status icons in +every available colour depth in the above format ready in each a +memory block, to be able to request the service without having to copy +around icon data. That makes the interactions between SRA and SPA +quicker and saves the hassle of building memory blocks before every +request. Memory saving is not really an issue here, as one icon in all +3 colour depths uses just 512 bytes, so even keeping 20 different +icons in all 3 colour depths, and their 2-phase animated pendants, in +memory, would only cost 30 kBytes. This can be reduced to 20 kBytes by +just keeping the 2-phase versions in memory and inserting NULL or CRLF +at the middle position to switch between animated and static versions. +Usually it will be less, because 256-colour icons will rarely be +needed at 16x16 pixels size. And, which application really has 20 +different statii? +

+

5. Guidelines for implementing SPAs +

+
    +
  • Make your icons for the Status Display Service distinguishable +(so people can see it is this specific application's status icon) and +recognizeable (so the user doesn't have to wonder 'what the heck is +that supposed to be?'). +
      +

  • +
  • Use status icons intelligent and carefully. There is no point +in displaying a different status for an operation that only takes 1/10 +second. +
      +

  • +
  • The SSP protocol is rather easy to implement on SRA side. Try +to make the implementation as transparent to the user as possible, +without the user noticing much of the different applications and +processes involved. +
      +

  • +
  • Request invisible services like Status Display really +invisible, without any direct output to or input from the user. +
      +

  • +
  • After implementing SSP, switch the server into debug mode and +try requesting different services with different data types. If +everything works and the server outputs no error or warning messages, +your implementation is OK. +
      +

  • +
  • Remember, the user doesn't care much about how it works, only +that it works. +
      +

  • +
+ +

15.10.11 How to implement an SPA

+

Here's a step-by-step instruction on how to implement SSP as a +Service providing application. All code provided here is also +available as sample code in the archive in the file SPAtools.c +(SPAtools.gfa for GFABasic, SPAtools.s for assembler). Use and modify +as necessary :) +

+

Communication Session +

+

Make sure you understand the concept of SSP SPA-sessions. A +session between an SPA and the Server is started with the SSP_SSIR +message, and ended when the SPA sends SSP_SPASA. For every SPA there +will only be one session at a time. Multiple service requests by SRAs +will be queued, and sent one after another. This might be changed in +future implementations because of not being able to perform another +service while a session is active, which is a drawback in case of +Delayed Response services. +

+

1. Receiving Service Initialization Request and determining +the information type +

+

The SPA (your application) will receive the SSP_SSIR message to +indicate use of a service your application provides. The Server knows +the services provided by your application from the Server +registration, so you will only receive requests for services you +actually provide. The message-buffer with SSP_SSIR: +

+
  [0] = SSP_SSIR
+  [1] = serviceID
+  [1] = requestID
+  [2] = sessionID
+
+

serviceID (messagebuf[1]) is the requested service. This +in conjunction with requestID will give your application an +idea as of which information to provide. +

+

requestID (messagebuf[2]) is an identification that +tells you which information to provide to the Server. For example, if +Send File Service has been requested by the user, you will receive +SSP_RECIPIENTS as requestID. Build a list of possible +recipients (depending on the type of your application) separated by +CRLF, terminated by NULL. If your application is an IRC Client for +example, provide a list of online users that can currently be seen in +open channels. For an email Client, provide a list of email addresses +from your favorites. Provide only users that can be actually reached +at the time; in IRC or ICQ, for example, provide only online users. +For a SSP_DISPLAYMESSAGE service as serviceID, if your +application is an IRC Client, say, provide a list of open channels and +open chats. +

+

sessionID is used to distinguish between multiple +sessions. For now, this will always be 0. +

+

2. Initializing the service and providing information +

+

2.1 Creating a shared memory file +

+

The information the Server has requested is sent by your +application in a shared memory file. Whether one has to be created or not +depends on the serviceID. There is a unique name for every +shm-file used for each service request, the name of the file is built +by the following conventions: +
u:/shm/[applID]_init[sessionID].ssp +
For example, if your application has appl_id 25 and +sessionID is 0: +
u:/shm/25_init0.ssp +

+

After you have built the name for the shared memory file, use +Fcreate to create the file. Read/Write access rights have to be set +correctly, depending on the request type! +
Then, bind the memory block that contains the requested +information (list of recipients, etc., depending on requestID +and serviceID) to the file using Fcntl. The following code +will build the filename and open an initialization data shared memory +file when calling createShmFile: +

+
    int createShmFile(int access, void *memPtr, int sessionID){
+
+      int fHandle;
+      char *filename = buildInitFilename(sessionID);
+
+      fHandle = Fcreate(filename, access);
+      Fcntl(fHandle, memPtr, SHMSETBLK);
+
+      return(fHandle);
+
+    }
+
+    char *buildInitFilename(int sessionID){
+
+      static char filename[256] = "u:/shm/";
+      char tmpstring[4];
+
+      strcat(&filename, itoa(appl_id, tmpstring, 10));
+      strcat(&filename, "_init");
+      strcat(&filename, itoa(sessionID, tmpstring, 10));
+      strcat(&filename, ".ssp");
+
+      return(&filename);
+
+    }
+
+

2.2.2 Sending Service Initialization +

+

Send an SSP_SPASI message to the Server, filling the AES +message- buffer with the following values: +

+
    [0] = SSP_SPASI
+    [1] = sessionID
+
+

sessionID(messagebuf[1]) +
The session ID sent to you with SSP_SSIR. +

+

3. Receiving Service Use Request +

+

When your application receives SSP_SSUR, this means that a +service should be performed now. +

+

messagebuf[1] will contain the serviceID also received +in SSP_SSIR. This makes it possible for you to keep initializing and +performing services separate from one another. The serviceID +will be the same throughout one session. +

+

messagebuf[2] will contain the same sessionID as in +SSP_SSIR. +

+

messagebuf[3]/[4] will build a LONG that is the number of the +information part of all the parts you provided in SSP_SPASI. For +example, if you have sent 10 recipients for a Send File Service +request, and this LONG is 0, the first recipient in the list is to +receive the file. +

+

messagebuf[5] and messagebuf[6] contain 2 different ID numbers +for a shared memory file, shmID1 and shmID2. Build a filename +like this: +
u:/shm/[shmID1]_data[shmID2].ssp For example, if shmID1 is +25 and shmID2 is 0: u:/shm/25_data0.ssp +
This is the file that contains the data necessary to perform the +service. The contents of the shared memory block depend on +serviceID: +

+

SSP_SENDFILE, SSP_UPLOADFILE, SSP_COMPRESSFILE: the shm-block +will contain a NULL-terminated file path and name. +

+

SSP_SENDMSG, SSP_DISPLAYMSG: the shm-block will contain a NULL- +terminated string to display or send. +

+

SSP_DISPLAYINFO: the shm-block will be an empty buffer with +space for information about your current status with read/write access +rights. Copy NULL-terminated text information into the shm-block. The +maximum length will be in shmPar1 (messagebuf[7])! +

+

SSP_CONTEXT: no shared memory file will exist. Don't try to open +it ;) +

+

SSP_STATUSDISPLAY: the shm-block will contain icon data. +

+

The following code will build the filename, open the data shared +memory file and return a pointer to the shm-block when calling +openDataShm. The parameter access should be either FO_READ or +FO_WRITE, depending on what the serviceID is: +

+
    void *openDataShm(int shmId1, int shmId2, int access){
+
+      int fHandle;
+      char *filename = buildDataFilename(shmId1, shmId2);
+
+      fHandle = Fopen(filename, access);
+      Fcntl(fHandle, memPtr, SHMGETBLK);
+
+      return(fHandle);
+
+    }
+
+    char *buildDataFilename(int shmId1, int shmId2){
+
+      static char filename[256] = "u:/shm/";
+      char tmpstring[4];
+
+      strcat(&filename, itoa(shmId1, tmpstring, 10));
+      strcat(&filename, "_init");
+      strcat(&filename, itoa(shmId2, tmpstring, 10));
+      strcat(&filename, ".ssp");
+
+      return(&filename);
+
+    }
+
+

Remember to close the shared memory file as soon as you don't need to +read from or write to it any more (before acknowledging the Server) +with Fclose! Delete the initialization shm-file when receiving +SSP_SSUR and free temporary memory, if any! +

+

4. Performing the Service and acknowledging +

+

4.1 Performing the Service +

+

Depending on the parameters sent in SSP_SSUR you can determine +what to do. Ultimately the way your application performs certain +services is up to you, and also depends on the type of your +application. See 'Guidelines for performing services' for a general +direction to go to. +

+

4.2 Acknowledging +

+

Acknowledging a service is done by sending SSP_SPASA to the +Server. When you do this depends on your application and on the type +of service (IRS or DRS). With Immediate Response Services, you should +start performing the service (e.g. open a connection to a user and +start sending a file) and acknowledge before the service is actually +finished. +

+

With Delayed Response Services (e.g. the Compress File Service) +acknowledging should not be done before the service is completely +performed (e.g. the files are compressed). +

+

5. Guidelines for performing services +

+

5.1 Send File Service +

+

For online Clients like IRC and ICQ: +
When receiving SSP_SSIR with SSP_RECIPIENTS, only provide online +users that a file can actually be sent to in the recipients list. +After opening a connection and starting to send the file, acknowledge +immediately. +

+

For email and news Clients: +
In the recipient information, provide recipients from your +favorites. Encode the file into an attachment, and open an email +editor window for typing in text. Make sure the received attachment +and the typed email go out together. +

+

5.2 Send Message Service +

+

For online Clients like IRC and ICQ: +
For SSP_RECIPIENTS, provide a list only of open chats or chat +channels. Receive the message and post it to the user. Acknowledge +immediately. +

+

For email and news Clients: +
Receive the message and put it into an email as text. +Configurably, post an alert box to provide the possibility to edit the +message and add attachments for the user. Only open the email editor +window if the user answers this question with 'Yes'. Acknowledge as +soon as the user has answered the question. If this security request +is turned off, send immediately. +

+

5.2 Display Message Service +

+

For online Clients like IRC and ICQ: +
You will not receive SSP_RECIPIENTS. This service can be triggered +with user interaction as well as automatically. Decide in which window +of your application to display the message. Prefer topped, +uniconified, unshaded, visible windows. Do not send the text message +over network connections. +

+

For email and news Clients, text editors and similar: +
You will not receive SSP_RECIPIENTS. Insert the text message into +the currently top open email editor window. If none is open, open one +with no recipient and insert the message there. +

+

5.3 Upload File Service +

+

For FTP Clients: +
Provide a list of recipients in shm as described here. Retrieve +the Server and directory name from the shm-block provided with +SSP_SSUR, and upload the file. Acknowledge after opening the +connection and starting to upload. +

+

5.4 Status Display Service +

+

Retrieve the icon data, copy it into your own buffers. Display +new icon. Acknowledge. +

+

5.5 Display Information Service +

+

Copy information text, NULL terminated, to the shm-block +provided. Acknowledge. +

+

5.6 Context Popup Service +

+

Retrieve coordinates for the context popup from the +message-buffer. Open context popup in context to the current status +icon from the Status Display Service. Make frequently used and status +dependend options available in the context popup. Make all information +available in the context popup also available directly by your +application! The context popup is never to supersede generally +available options! +

+

5.7 Compress File Service +

+

Provide different archive types and compression levels after +receiving SSP_FORMATS. Use the format number contained in +sspPar1 at SSP_SSUR. If sspPar1 is -1, use default +format and compression level. Retrieve file or folder names to +compress. Archive files to provided archive name and -path. +Acknowledge after compression and archiving is finished. +

+

5.8 General +

+
    +
  • Try to make performing services transparent to the user. When +started from the Server (your commandline will be 'SSP_START'), don't +open any unnecessary windows, try to restrict the screen output to +what is necessary for performing the service. If you're started with +'SSP_START' in your commandline, wait 3 seconds after performing your +service, and then exit. Chances are that queued requests will come +through in this time, and if not, chances are the user doesn't need +your application anymore for now ;) +
    Exit without any screen output and user input, unless it's +absolutely inevitable! +
      +

  • +
  • After implementing SSP, switch the Server into debug mode and +try requesting your provided services with different applications. If +everything works and the Server outputs no error or warning messages, +your implementation is OK. +
      +

  • +
  • Remember, the user doesn't care much about how it works, only +that it works. +
      +

  • +
+ +

15.10.12 List of prospective SSP-implementing software to date

+

AtarICQ +

+

SRA: Status Display, Display Message, Send Message +
SPA: Context Popup, Display Information, Send File, Display +Message, Send Message +

+

AtarIRC +

+

SRA: Status Display, Display Message, Send Message +
SPA: Context Popup, Display Information, Send File, Display +Message, Send Message +

+

EditorLib +

+

SRA: Display Message, Send Message, Send (text as) File, Upload +(text as) File, Compress File +
SPA: Display Message +

+

GuiTar +

+

SRA: Send File, Upload File +
SPA: Compress File +

+

Smurf +

+

SRA: Send File, Upload File, Compress File +

+

TaskBar +

+

SRA: Context Popup, Display Information +
SPA: Status Display +

+

TextView +

+

SRA: Display Message, Send Message, Send (text as) File, Upload +(text as) File, Compress File, Send File +
SPA: Display Message +

+

ACSPro +

+

SRA: Display Message, Send Message, Send (text as) File, Upload +(text as) File, +
SPA: Display Message +
All applications built with ACSPro could provide SSP support +generated by ACSPro. +

+

FalcAmp +

+

SRA: Display Message, Send File, Upload File, Compress File +

+

15.10.13 Glossary

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SRA Service Requesting Application. This means the application that +sends SSP_SRASR to the Server to request use of a service. +
  + +
SPA Service Providing Application. This means the application that +receives SSP_SSIR from the Server to indicate that an SRA has +requested a service. All SPAs have to register with the SSP-Server. +
  + +
Service is a certain part of an applications functionality or +capability that can be provided to, and used by, other applications +using SSP. Generalized types of services are hardwired into the +SSP-Server. See SSP services. +
  + +
IRS Immediate Response Service. This means a service that requires +virtually immediate response to SSP_SSUR from the Server, with +SSP_SPASA. +
  + +
DRS Delayed Response Service. This means a service that requires +response to SSP_SSUR from the Server with SSP_SPASA not after +performing the service has started, but after performing the service +has been completed (e.g. compressing files). +
  + +
Invisible Service This means a service that is usually triggered automatically by +the SRA without requiring user interaction. See Status Display Service. +
  + +
Interactive Service This means a service that is usually triggered by the SRA from +a user action. See Send File Service. +
  + +
Server Registration All SPAs have to register with the SSP-Server before they can +provide and perform any services. Registration should be done once on +program installation and every time the SPA starts up. See SSP Server registration. +
  + +
Server or SSP-Server Application running in the background +that receives and sends messages from and to SPAs and SRAs. All +communication between SPAs and SRAs has the SSP-Server as mediator. +
See What is the SSP-Server? +
  + +
Message in these documents refers to an AES message received by +evnt_mesag (or evnt_multi, respectively). The communication in SSP is +based on AES messages. +
See SSP messages. +
  + +
Server debug mode If the environment variable SSP_SERVERDEBUG is defined (!) the +Server will log all activity (service requests, message-buffers, +shared memory addresses and -files, etc.) to sspdebug.log in the Server +application directory, and output the same information in a window, +including suggestions on how to fix possible bugs. +
  + +
+ +
+ +Home +ProtokolleProtokolle +SE-ProtokollSE-Protokoll +View protocolView protocol + + diff --git a/de/proto_view.html b/de/proto_view.html new file mode 100644 index 000000000..da9bc0054 --- /dev/null +++ b/de/proto_view.html @@ -0,0 +1,594 @@ + + + + + +Die Anleitung zum TOS: View protocol + + + + + + + + + +Home +ProtokolleProtokolle +System Services Protocol (SSP)System Services Protocol (SSP) +Virtual-Screen-ProtokollVirtual-Screen-Protokoll + +
+ +

15.11 View protocol

+ +

The View protocol was developed by Peter Seitz and +Dieter Fiebelkorn to make it possible for a GEM application +to display files (using an external viewer) without being forced to +implement a viewer for the various file formats itself, and to provide +a uniform method of communication between the application and the +viewer (so that the application can use any viewer, rather than just +one particular viewer). +

+

There are already several applications that can be used as +viewers. They are GEM-View(Dieter Fiebelkorn), +1st-View/1st-Guide (Guido Vollbending), and ShowImage +(Peter Seitz). When installed as desk accessories, these applications can +be instructed (by other applications) to view files. +

+

This experimental version of the View protocol is implemented in +GEM- View and ShowImage. IT IS STRONGLY RECOMMENDED +THAT ALL PROGRAMMERS USE AND EXPERIMENT WITH THIS PROTOCOL! We hope +that eventually it will become a standard. Suggestions and comments +are welcome; please send them to Peter Seitz at one of the following +addresses: +

+
  Peter Seitz, Robert-Koch-Str.6, 63225 Langen, GERMANY
+  E-Mail (Internet): seitz(at)rbg.informatik.th-darmstadt.de
+                  or seitz(at))isa.informatik.th-darmstadt.de
+
+

This protocol should be quite easy to implement for both the +writers of viewers and the writers of applications. It should provide +substantial benefits for the user as well, since he will be able to +use his favourite viewer with all applications. +

+

–Peter Seitz +

+

In the following dicussion, 'viewer' refers to the desk +accessory or application that is used to display the file(s) and +'application' always refers to the program that requests the services +of the viewer. +

+ +
+

15.11.1 The purpose(s) of the View protocol

+

The View protocol was developed to allow an application to: +

+
    +
  • Determine if a viewer is already in memory (without knowing the +name of the viewer). If no viewer is available, the application can +start the viewer itself (if the name is available). +
      +

  • +
  • Determine what type of files can be displayed by the available +viewer. +
      +

  • +
  • View files in various formats (using the viewer) and receive +feedback from the viewer (using a uniform message protocol). +
      +

  • +
+ +

15.11.2 Using the View protocol

+

It is very easy for the user to use the facilities of the View +protocol. If there is a view-accessory (GEM-View, ShowImage) +that supports the View protocol, and the application supports the View +protocol, nothing needs to be done. If there is no resident view- +accessory (or the desired viewer does not support the View protocol) +then the user should install an environmental variable called 'View' +with the full pathname of the desired viewer as its value. The way +that this can be done is described in 'Who is the viewer?'. +

+

15.11.3 Implementing the View protocol

+

The View protocol is based on parts of the XAcc protocol, so a +programmer planning to implement the View protocol should obtain a +copy of the XAcc protocol (xacc_mt.txt). +

+

15.11.3.1 Who is the viewer?

+

First, an application should determine if there is a viewer that +the user prefers. It does this by (in this order) looking for an +environmental variable called 'View', looking for a cookie in the +cookie jar called 'View', and then looking for an environmental +variable called 'SHSHOW' (which is used by the MultiTOS desktop, too). +All these names are case-sensitive. +

+

The value of each one of these variables is the full pathname of +the viewer. +

+

The programmer can determine if one of the viewers is in memory +(as a desk accessory, usually, but it is possible for the viewer to be +an application under a multitasking operating system) using the +appl_find system call. +

+

To use the appl_find system call, the path and the extension +have to be removed from the name of the viewer and must be padded with +spaces to a length of eight characters. If this is not done, the +appl_find call will fail. It should be noted that appl_find is +case-sensitive, so normally the value MUST be all upper case. It would +not be wise to convert the name to upper case, however, as +case-sensitive file systems may be used under MiNT or MagiC. +

+

If the viewer has not yet sent its XAcc-identification (the +ACC_ID message), the application does this now. This may be the case +if the main application does not support the XAcc protocol. +

+

If no viewer is found, the application should check the extended +name (introduced in version two of the XAcc protocol) of all +applications and accessories that have sent XAcc-identification +messages for the string '2View' (this is the application type +'viewer') or the string 'NView' (this is the generic type 'viewer'). +If either of these strings is found, then the application/accessory in +question supports the View protocol and may be used as a viewer. As in +the case of the environment variables, the case of '2View' and 'NView' +is significant. +

+

If there is no viewer in memory but one of these environmental +variables (or the cookie) was found, the application can try to load +the viewer itself (using the pathname given in the variable). Please +note that wildcards may be used in the extension of the viewer (a +view-accessory could be named 'XXX.ACC' or 'XXX.ACX'). If the 'View' +environmental variable was found, the viewer may be started as an +accessory as well using Chameleon or MultiTOS. As a consequence of +this, the viewer specified in the 'View' environmental variable must +be able to run as both an application or an accessory. If the viewer +cannot run as an accessory, it should be specified using the 'SHSHOW' +environmental variable. +

+

Normally the user should use one of the enironmental variables +('View' or 'SHSHOW'). These should be placed in the desktop +environment, as all applications started by the desktop will inherit +its environment. This can be done with special programs (ENVIRON.PRG, +JCNBOOT.PRG) or, if MiNT is installed, by placing the following line in +MINT.CNF: +

+

setenv View C:\GEM_VIEW\GEMVIEW.APP +

+

and/or +

+

setenv SHSHOW C:\GEM_VIEW\GEMSHOW.PRG +

+

Using MagiC the environment can be set by putting a '#_ENV' - +line in the MAGX.INF file, like the following: +

+

#_ENV View=F:\SHOW_IMG\SHOW_IMG.PRG +

+

The cookie should no longer be used. +

+

15.11.3.2 What kinds of files can be displayed?

+

The XAcc Extended name of the viewer should contain an entry of +the form 'X.ext' for every supported file format, where 'ext' +may be one of the following: +

+
  X.ART      - Art-Director
+  X.ASC      - ASCII
+    Paragraphs end with carriage return, and lines may end
+    with a linefeed.
+  X.B&W      - Imagelab image
+  X.BLK      - GFA bit-block
+    There is a three-WORD header: width minus one, height
+    minus one, planes.
+  X.BMP      - OS/2 bitmap, MS-Windows bitmap
+  X.CFN      - Calamus font
+  X.CRG      - Calamus raster
+  X.CTX      - Calamus text
+  X.CVG      - Calamus vector
+  X.DOC      - 1stWord document
+  X.DOO      - Doodle Mono
+  X.ESM      - Enhanced Simplex
+  X.FNT      - GDOS font (and nothing else!)
+  X.GEM      - GEM-metafile
+  X.GIF      - GIF image
+  X.GVW      - GEM-View internal format
+    Used by GEM-View internally and should not be in this
+    list! (Hi, Dieter!)
+  //X.HEX    - Hex-Dump
+    This is obsolete.  It is now called 'XDump'
+  X.IFF      - IFF-file
+    The .IFF format in general! This should be present if any
+    IFF-filetypes are supported.
+  X.IFF.ILBM - IFF InterLeavedBitMap
+  X.IFF.type - Other IFF-filetypes
+  X.IMC      - Signum!2 image
+  X.IMG      - GEM-image, XIMG
+  X.JPG      - JPEG image
+  X.MAC      - MacPaint image
+  X.NEO      - Neochrome image
+  X.OUT      - The GEM 'OUT' file format
+    SEE:  v_alpha_text
+  X.PAC      - STAD image
+  X.PC[123]  - Degas compressed Image
+  X.PCX      - PC Paintbrush
+  X.P[BGP]M  - Portable Bitmap
+  X.PIC      - Screen-dump (current resolution)
+  X.PI[123]  - Degas uncompressed image
+  X.RLE      - MS-Windows bitmap
+  X.RSC      - GEM Resource file
+  X.RTF      - Rich Text Format
+  X.SDO      - Signum!2 document
+  X.SDK      - Signum!3 document
+  X.SNP      - Becker Snap-shot
+    This has a three-WORD header: width, height, planes.
+  X.SP[CU]   - Spectrum 512 image
+  X.SUN      - Sun raster file
+  X.TGA      - Targa image
+  X.TIF      - TIFF image
+  X.TN[123Y] - Tiny image
+  X.TXT      - ASCII
+    Lines end with a carriage return and a linefeed.  It would
+    be nice if a single linefeed (Unix) or a single CR (Macintosh)
+    would also be accepted.
+  X.XBM      - X-Bitmap file
+
+  XDump      - Hex-dump
+    This is not an extension, but means that the viewer is
+    able to show files as hexadecimal dumps.
+
+

Note: [abc] means one of the characters 'a', 'b', or 'c' +and not the string '[abc]'. +

+

All other entries starting with 'X.' are reserved for future +versions! If you would like to add other formats, please contact Peter +Seitz. It would be wise if the entries are unique. +

+

I recommend the support of X.IMG, X.GEM and X.OUT, as these +are the standard formats for GEM data-exchanges! +

+

It should be noted that the file formats listed here that an +application supports could be a clue as to which file formats the +application will accept using the Drag&Drop protocol. +

+

15.11.3.3 How can I tell the viewer what is to be shown?

+

Because of the XAcc2 protocol, the application knows which +message- groups are supported and these messages may be used for +communication if the application has the data already in memory (and +not within a file). +

+

Use the VIEW_xxx messages (discussed below) when the data to be viewed is +contained in a file. With these messages the application has extensive +control over what is happening. These messages may be used if, and +only if, the strings '2View' or 'NView' are found in the +viewer's Extended XAcc name. This should normally be the case, though. +

+

This may be a problem if the viewer has been started by the +application. In this case I would suggest to try to send the messages +and see what happens. If the viewer does not support them, no reaction +is given (as unknown messages should be ignored!). Otherwise, the +viewer will send a response. +

+

The viewer is strongly recommended to support the +VA_START message! Of course this has to be tested in its protostatus +(if possible, see above). +

+

There is no explicit support of the Drag&Drop protocol, as +it was mainly a MiNT-specific extension (though it is included in +MultiTOS and later in MagiC), but programs running under MiNT should +understand this protocol! +

+

All other protocols, of course, may be used to communicate with +the viewer (as long as they provide some method to determine whether +or not they are supported). +

+

Please keep in mind that pointers to strings in AES +messages have to point to global-readable memory (if running in an +environment with memory protection)! +

+

15.11.3.4 What does the viewer do?

+

When the viewer is started, it should check the command line for +a list of filenames to view. To be consistent with the direction that +the Atari is moving, the viewer should support the ARGV argument- +passing scheme developed by Atari. +

+

The viewer should support the XAcc protocol, and answer XAcc +protocol messages. +

+

The viewer should use the [Alternate] + [X] key combination to +send data using the XAcc protocol messages. +

+

If the viewer receives the VA_START message, it should determine +the type of the file and whether or not the type is supported by +itself. The viewer does not have to send a reply to this message. If a +reply is needed, the application should send the message to the viewer +using the VIEW_FILE message. +

+

15.11.4 The VIEW_XXX messages

+

This is a description of the View protocol messages. In contrast +to to the VA_START and XAcc messages, these messages provide more +refined control of what happens to the viewed file. +

+

Please remember that these messages may be used if, and +only if, the strings '2View' or 'NView' are found in the +viewer's Extended XAcc name as described above. +

+

In general, there are four messages; VIEW_FILE, which may be +sent to the viewer, and VIEW_FAILED, VIEW_OPEN and VIEW_CLOSED that +are used to inform the application of what has happened to its file. +

+

The viewer is expected to answer every VIEW_FILE message it +receives. At the very least, it should send a +VIEW_FAILED(VIEWERR_ERROR) message (see below). However, if the viewer +does not send an answer and the application expects one, the +application should recover by using a timeout value (ten seconds +should be sufficient). +

+

It is possible for the viewer to send other messages (for +example AV_ACCWINDOPEN) before answering the VIEW_FILE message! +

+

Note: All strings are NULL-terminated (as in the 'C' +programming language). +

+

15.11.4.1 View a file

+

The VIEW_FILE message is used by the application to inform the +viewer that a file is to be displayed. +

+
msg[0]   = VIEW_FILE
+msg[3/4] = filename // Must be global-readable (due to MiNT's memory
+                    // protection)!
+msg[5/6] = 0        // Reserved!
+msg[7]   = 0        // Zero = new file, see below!
+
+

Notes about filename(9.10.1993):: +

+
    +
  • If filename ends with a slash/backslash, or +filename is a directory, the file-selector should be opened +with filename as the current path. +
      +

  • +
  • If the terminating byte (0) of filename is followed by +another string starting with an 'X' (0x58), this string gives the file +type that filename should be displayed as (using the strings +from 'What kinds of files can be displayed?' as a guide) if possible. +This could be used to show hex-dumps ('XDump'). +
      +

  • +
+ +

This message is always answered by the viewer: +

+

If the file could not be displayed, respond with the VIEW_FAILED +message: +

+
retmsg[0]   = VIEW_FAILED
+retmsg[3/4] = msg[3/4]  // Filename (same pointer!)
+retmsg[5]   = errcode   // See below.
+retmsg[6]   = 0         // Reserved!
+retmsg[7]   = msg[7]    // 0 or window identification.
+
+

filename should always be the pointer received +in VIEW_FILE, as only this way can the sender recognize which file was +meant in case msg[7] is zero (and - of course - no new memory has to +be allocated. +

+

The errcode variable may be a GEMDOS error-code (<0) +or one of the following: +

+
VIEWERR_ERROR   - The error is unspecified
+VIEWERR_SIZE    - The file is too large, or the wrong size
+VIEWERR_COLOR   - Unsupported resolution or color
+VIEWERR_WID     - Wrong window identification
+VIEWERR_MEM     - Not enough memory
+
+

It is expected that the viewer informs the user about the error +(by printing a message or displaying an alert box), since it will know +what the problem is much better than the application. +

+

If the file has been displayed, but no further +communication is possible, the viewer sends the VIEW_OPEN message: +

+
retmsg[0]   = VIEW_OPEN
+retmsg[3/4] = msg[3/4]          // Filename (the recieved pointer)
+retmsg[5]   = viewprot_version  // Currently 0
+retmsg[6]   = 0                 // Reserved!
+retmsg[7]   = 0                 // 0 = no further communication!
+
+

If the file has been displayed, and further communication is possible, the +viewer sends the VIEW_OPEN message: +

+
retmsg[0]   = VIEW_OPEN
+retmsg[3/4] = msg[3/4]          // Filename (the recieved pointer)
+retmsg[5]   = viewprot_version  // Currently 0
+retmsg[6]   = 0                 // Reserved!
+retmsg[7]   = wid               // Window ID (non-zero!)
+
+

The window identification wid refers to the AES +identification of the window the file is being displayed in. This +seems to be a unique number representing the file, which is used in +further communication as an identifier. +

+

The currently defined viewprot_version is 0. +

+

15.11.4.2 Further communication

+

Once a file is displayed (in a window) and the viewer has +returned a non-zero window identification in msg[7], both the +application and the viewer may send each other messages refering to +this file/window. +

+

The 'msg[7]' variable will always contain the (non-zero) +window identification as an identifier! As this is supposed to be +unique, the 'msg[3/4]' variable should not be used to identify +the file (if the 'msg[7]' variable is not zero). +

+

If the viewer receives a wrong window identification, it replies +by sending a VIEW_FAILED message: +

+
retmsg[0]   = VIEW_FAILED
+retmsg[3/4] = msg[3/4]
+retmsg[5]   = VIEWERR_WID
+retmsg[6]   = 0
+retmsg[7]   = msg[7]    // The wrong window identification.
+
+

The application receiving this message must not use this +window identification again, since the case may be that the viewer +simply did not send VIEW_CLOSED(wid). +

+

The application can perform some operations on the file being +viewed: +

+
    +
  • The window should be closed (and the memory used by the file +freed): +
      +

    msg[0]   = VIEW_FILE
    +msg[3/4] = NULL         // Remove File
    +msg[5/6] = 0
    +msg[7]   = wid          // This (obviously) cannot be 0.
    +
    +

  • +
  • If the application knows that the file has been changed, or +wants another file to be displayed in the same window, it can send the +following message: +
      +

    msg[0]   = VIEW_FILE
    +msg[3/4] = filename     // This may be different.
    +msg[5/6] = 0
    +msg[7]   = wid          // The identification of the window.
    +
    +
    On the other side, the viewer should inform the application of +what is happening to its file: +
      +

  • +
  • If the window is closed (the user closed it or the viewer +received AC_CLOSE or VIEW_FILE(NULL, wid)), then the viewer should send +the following message: +
      +

    msg[0]   = VIEW_CLOSED
    +msg[3/4] = filename     // This may be NULL and should be ignored!
    +msg[5/6] = 0
    +msg[7]   = wid
    +
    +
    The filename should be the one from the VIEW_FILE message, +otherwise it may be NULL, as no new global memory should be allocated. +
      +

  • +
  • If the window was closed due to an error, the VIEW_FAILED message +may be sent instead: +
      +

    msg[0]   = VIEW_FAILED
    +msg[3/4] = filename     // This may be NULL and should be ignored!
    +msg[5]   = errcode      // See above.
    +msg[6]   = 0
    +msg[7]   = wid
    +
    +
    If the viewer does not have the ability to store the +identification of the application, it may not inform the application +when a window was closed without a message from the application. This +is very easy to implement, but may lead to unexpected results. Please +send your experiences to Peter Seitz (the addresses he can be +contacted at are shown above). +
      +

  • +
+ +

15.11.4.3 View data from memory

+

In Version 1.04 of the View protocol a new message (VIEW_DATA) has +been added, which is used to view data that has already been read into +memory. +

+

To indicate the support of this new message, the string +'XViewData' must be within the viewer's Extended XAcc name. +

+
msg[0]   = VIEW_DATA
+msg[3/4] = data     // Pointer to data, incl. header (see below)
+msg[5/6] = length   // Total length of header + data
+msg[7]   = wid      // Same as with VIEW_FILE (see above)
+
+

where data points to: +

+
LONG  type;         // eg '.IMG'
+WORD  head_length;  // Offset to beginning of data, word alligned!
+CHAR[]  name;       // 0-terminated name of variable length
+
+

If the type is 0, the viewer should try to figure it out +itself. Other possible value for type are all file-types +listed in 'What kinds of files can be displayed?' but without the 'X' +at the beginning (e.g. 'Dump' means that starting at 'data + +head_length', 'length - head_length' bytes should be +displayed as a hex-dump). +

+

Please note that: +

+
    +
  • data has to point to an even adress, +
  • +
  • data has to point to global readable memory, +
  • +
  • head_length is even, +
  • +
  • the data of the file is found at data + +head_length and is in the same form, as it would be in a file +of type type. +
  • +
+ +

The viewer receiving VIEW_DATA answers the same way as VIEW_FILE, +but filename (= msg[3/4]) should be set to the value of +data. The application must not free the memory pointed +to by data before receiving the answer from the viewer; in +case of a timeout it should ask the user what to do. +

+

15.11.5 The View protocol messages

+ + + + + + + + + + + + + + +

At last, the definitions for the messages: +

+
+#define VIEW_FILE    0x5600
+#define VIEW_FAILED  0x5601
+#define VIEW_OPEN    0x5602
+#define VIEW_CLOSED  0x5603
+#define VIEW_DATA    0x5604
+#define VIEW_GETMFDB 0x5610
+#define VIEW_SETMFDB 0x5611
+#define VIEW_MFDB    0x5612
+
+#define VIEWERR_ERROR 0
+#define VIEWERR_SIZE  1
+#define VIEWERR_COLOR 2
+#define VIEWERR_WID   3
+#define VIEWERR_MEM   4
+
+// 0x56xx = 'V' as in 'View'!
+
+

All other message values ranging from 0x5600 to 0x56FF are +reserved for future extensions of the View protocol and should be +ignored for now. +

+
+ +Home +ProtokolleProtokolle +System Services Protocol (SSP)System Services Protocol (SSP) +Virtual-Screen-ProtokollVirtual-Screen-Protokoll + + diff --git a/de/proto_vscreen.html b/de/proto_vscreen.html new file mode 100644 index 000000000..2c2368ce0 --- /dev/null +++ b/de/proto_vscreen.html @@ -0,0 +1,101 @@ + + + + + +Die Anleitung zum TOS: Virtual-Screen-Protokoll + + + + + + + + + +Home +ProtokolleProtokolle +View protocolView protocol +XAccXAcc + +
+ +

15.12 Virtual-Screen-Protokoll

+ +

Ein echtes Problem bei Benutzung einer Großbildschirm-Emulation +ist, daß Dialog- und Alertboxen oft außerhalb des sichtbaren +Bildschirmausschnitts erscheinen. Daran können auch Programme wie +BigScreen nichts ändern. Als Lösung bietet sich eine +Möglichkeit an, mit der man sich darüber informieren kann, welcher +Teil des Bildschirms zur Zeit sichtbar ist. +

+

Dazu wird der Cookie-Jar benutzt, der genau für solche Zwecke +vorgesehen ist. In unserem Fall heißt der Cookie VSCR, was für +Virtual-Screen steht. Er zeigt auf eine Struktur, die insbesondere +Informationen über den dargestellten Bildschirmausschnitt enthält. +Anwendungsprogramme können diese Information beispielsweise dazu +benutzen, um Dialogboxen auf dem tatsächlich sichtbaren Teil des +Bildschirms zu zentrieren. Die Struktur ist wie folgt definiert: +

+ +
typedef struct
+{
+  int32_t cookie;   /* muß 'VSCR' sein                       */
+  int32_t product;  /* Analog zur XBRA-Kennung               */
+  int16_t version;  /* Version des VSCR-Protokolls           */
+  int16_t x,y,w,h;  /* Sichtbarer Ausschnitt des Bildschirms */
+} INFOVSCR;
+
+

Zur Beschreibung der einzelnen Komponenten: +cookie muß den Wert $56534352 ('VSCR') haben. Sinn der Sache +ist, daß ein Großbildschirm-Simulator die Informationsstruktur auf +'ungültig' setzen kann, ohne erst den Cookie entfernen zu müssen. +BigScreen beispielsweise kann je nach gewählter Auflösung +aktiv oder inaktiv sein und benutzt diesen Mechanismus, um beim +Auflösungswechsel die Struktur ein- oder auszuschalten. +

+

In product kann ein Großbildschirm-Simulator eine +eigene Kennung eintragen. Die vier Bytes sollten genauso wie bei einer +XBRA-Kennung aus vier druckbaren Zeichen (ASCII-Code 32 bis 126) +bestehen. +

+
+ + + + + + + + + + + + + + + + + + + + +
ProgrammKennung
BigScreenBIGS
BlowUP030BLOW
LaceScanLEmu
NOVA VDIIMNE
+
+ +

Die Komponente version kennzeichnet die Version des +VSCR-Protokolls und soll es erlauben, später einmal die Struktur um +neue Felder zu ergänzen. x, y, w und h schließlich +geben Position, Breite und Höhe des sichtbaren Ausschnitts an. Das +Protokoll ist absichtlich so ausgelegt, daß es auch von anderen +Simulatoren benutzt und bei Bedarf erweitert werden kann. +

+
+ +Home +ProtokolleProtokolle +View protocolView protocol +XAccXAcc + + diff --git a/de/proto_xacc.html b/de/proto_xacc.html new file mode 100644 index 000000000..5fd9542e0 --- /dev/null +++ b/de/proto_xacc.html @@ -0,0 +1,1439 @@ + + + + + +Die Anleitung zum TOS: XAcc + + + + + + + + + +Home +ProtokolleProtokolle +Virtual-Screen-ProtokollVirtual-Screen-Protokoll +xFSL-SchnittstellexFSL-Schnittstelle + +
+ +

15.13 XAcc

+

The XAcc protocol was originally designed for non-multitasking +versions of GEM to allow data exchange between the main application +and any number of accessories. Since the AES did not provide a +function to find the application IDs (apIDs) of other applications +without knowing their names, XAcc had to rely on the undocumented +feature that the main application always has the apID 0. Therefore +XAcc in its present (1) form does not work in a multitasking +environment. However, AES 4.0 provides the new function +appl_search, which allows any application to find the apIDs of all +other applications running concurrently. This makes it possible to +design a modified XAcc that does not use any 'dirty tricks'. This +document contains a proposal for such a modified XAcc; the changes +with respect to the previous definition are small and modifying an +existing XAcc-based application should be a matter of minutes. Since +single-tasking TOS will still be with us for a while, applications are +encouraged to implement both 'traditional' and 'modern' XAcc, +depending on the version number of the AES. +

+ +
+

15.13.1 Purpose of XAcc

+

The GEM AES functions appl_write and appl_read can be used to +exchange data between GEM applications running concurrently. In +practice however, some problems need to be solved to make good use of +these two functions: +

+
    +
  • There are no standard messages for exchanging data. Their +definition is the main goal of XAcc. +
      +

  • +
  • appl_write needs the receiver's application identifier (apID). +The only way to get this (before AES 4.0) is to call appl_find, +which needs the receiver's name. Thus communication is only possible +if the sender knows the receiver's name. +
    This problem is solved in AES 4.0 by the introduction of the +function appl_search. +
      +

  • +
  • The main application does not know when an accessory is +activated or deactivated. This would often be useful, for example if +the main application changes system variables that could affect the +accessory's behaviour. If the main application were informed before +the accessory gains control, it could reset those to their old values +and change them back after the accessory is finished. +
    Another advantage would be that after an accessory has been +called, the main application could check if something has been written +to the clipboard (1) or if other changes to the environment have +been made. +
      +
    With multitasking GEM, the situation has changed in several +important ways. The possibility of using several 'main' applications +in parallel makes it even more undesirable to let them directly +manipulate system variables and the like; nevertheless there will +probably always remain some purposes that require such methods. On the +other hand, at least for applications using windows (the preferred +method to get the most out of a multitasking system) it is now +possible to detect changes of the active application by interpreting +the new AES messages WM_ONTOP and WM_UNTOPPED. Therefore it is not +considered necessary for XAcc to provide additional means to achieve +this. +
      +

  • +
+ +

The communications protocol described in this document solves +all these problems. It was designed for two distinct purposes: +

+
    +
  • Exchanging data of standard types between programs that have no +information about each other. +
      +

  • +
  • Exchanging data between specific applications known to each +other. The standard protocol ensures that program combinations from +different vendors do not interfere with each other. +
      +

  • +
+ +

A potential problem caused by this protocol should be mentioned +at this point: for single-tasking GEM versions, it relies on the +currently undocumented fact that the main application's apID is always +zero. Without this assumption there is no way to exchange data without +using appl_find. Although this fact is not documented, it holds for +all single-tasking versions of GEM in existence until now, both for +MS-DOS and the Atari ST (this information was confirmed by Digital +Research Germany). Of course the main application's apID may be +different in future versions, although there is no reason to change +the current behaviour for single-tasking systems. For AES 4.0 (and +later) the above assumption is not needed anyway, so no compatibility +problems are to be expected in the future. +

+

A further requirement is that all programs not using this +protocol must ignore its messages. This should not be a serious +problem, as all GEM applications should ignore messages they do not +understand. At the time of writing no programs are known to violate +this rule. +

+

15.13.2 Classic XAcc

+

The "classic" XAcc protocoll was finally defined on +November 28, 1992. All known XAcc applications implement the protocol +this way. +

+ +
+

15.13.2.1 XAcc message groups

+

[Note: The "levels" used in previous XAcc versions +have been replaced by this new concept. Compatibility issues are +discussed in a special section at the end of this document.] +

+

Both main applications and accessories can have widely different +needs for communication with other programs. Therefore XAcc defines +several groups of related messages (1) that deal with a certain +range of data types. The message groups always indicate the messages +understood by a program, not the messages it might send to other ones. +If a program supports a certain message group, it must correctly +respond to all corresponding messages, whether it can actually use the +supplied data or not. +

+

In addition to XAcc message groups, there are the so-called +"basic messages", which must be supported by any +XAcc-aware program, and program-specific so-called "special +messages". +

+

The basic messages deal solely with identification, but no real +data exchange. They are already sufficient for programs that either do +not exchange data with others at all or use only special messages to +communicate with a number of other specific programs. +

+ + + + + + +
Message group 1 specifies the exchange of ASCII-format character data. +
  +
Message group 2 deals with the exchange of drawings and pictures using the GEM +metafile format and the GEM bit-image file format. +
  + +
+ +

Future extensions might include sound or spreadsheet data. In +addition, a message group could be defined to handle command +interchange between applications, e.g. for a "Drag&Drop" +protocol (2). +

+

15.13.2.2 XAcc messages

+

There are two kinds of XAcc messages: standard messages, which +must be understood by every participating program, and special +messages intended for communications between specific program +combinations. The standard messages have numbers ranging from 0x400 to +0x7ff, special messages start from 0x800. The latter ones may only be +sent after the receiver has been identified and is known to understand +them. The following description is only concerned with standard +messages. In addition to XAcc standard messages, the AES messages +normally sent by the screen manager may be used. The most useful ones are +AC_OPEN and MN_SELECTED; the latter one requires a knowledge of the +receiver and therefore belongs to the special messages. +

+ +
+
15.13.2.2.1 Basic XAcc messages
+ + + + + +
ACC_ID    = 0x400
+ACC_OPEN  = 0x401
+ACC_CLOSE = 0x402
+ACC_ACC   = 0x403
+ACC_EXIT  = 0x404
+
+

These messages provide XAcc initialization and organization. +This is the only part of XAcc which has to be implemented in a +different way for single- and multi-tasking GEM versions. Note that +the procedure described for 'multitasking' actually only depends on +the existence of appl_search and hence on an AES version number >= +4.0. If some future single-tasking AES supports appl_search, the +'multitasking' initialization should be used. Multitasking AES +versions with a version number < 4.0 should never exist; to be on +the safe side, applications should not attempt to use XAcc if such a +situation is detected (1). +

+ +
+
15.13.2.2.1.1 Single-tasking GEM versions
+

The communication between the main application and the +accessories is initiated in the following way: +

+ +
    +
  1. When a main application is started (or terminated), all desk +accessories receive an AC_CLOSE message from the AES screen manager. In +response they must send an identification to the main application +according to the following format: +
      +

         msg[0]:  ACC_ID (0x400)
    +     msg[1]:  sender's apID
    +     msg[2]:  length of the message - 16, giving 0
    +     msg[3]:  program version number and message groups
    +     msg[4] and msg[5]:   pointer to sender's name
    +     msg[6]:  menu number (menu_id) as returned by menu_register
    +     msg[7]:  reserved (see ACC_ACC)
    +
    +
    The low byte of msg[3] contains a bitmap indicating which +message groups are understood by the sender. Bit zero is set for +message group 1, bit one for message group 2, and so on. This is +independent of the message types which the sender might itself send to +others. The sender of a message must ensure that it is understood by +the receiver. The high byte is used to indicate a program version +number using an arbitrary encoding scheme. +
      +
    The pointer to the sender's name is stored in a +machine-dependent format. The name itself is a character string +following C conventions, i.e. a string of characters terminated by a +zero byte. To avoid name conflicts, long names are preferred to short +abbreviations. The name must be available at the given address at any +time, it may not be removed after initialization. As the version +number is stored in msg[3], it should not occur again in the name. +(1) +
      +
    Accessories using more than one menu entry must issue one ACC_ID +message for each entry used. Accessories without a menu entry must use a +number of -1. +
      +
    Since msg[1] and msg[2] have the same meaning for all message +types, they are no longer mentioned from now on. +
      +

  2. +
  3. In response to an ACC_ID message the main application sends an +identification back to the accessory. The format is identical, except +that there is no menu number and thus msg[6] can be used for any other +purpose if neccessary. The same applies to msg[7]. +
      +

  4. +
  5. In addition to the ACC_ID message, the main application informs +all previously registered accessories about the new one by sending +them the message +
      +

         msg[0]:  ACC_ACC (0x403)
    +     msg[3]:  program version number and message groups
    +     msg[4] and msg[5]:   pointer to accessory's name
    +     msg[6]:  accessory's menu number (menu_id)
    +     msg[7]:  accessory's apID
    +
    +

  6. +
  7. A desk accessory receiving the ACC_ACC message from the main +application sends an ACC_ID message to the thereby registered +accessory, identical to the one previously sent to the main +application. +
      +

  8. +
  9. When an accessory is activated by receiving an AC_OPEN message, +it sends the following message to the main application: +
    msg[0]: ACC_OPEN +
    Just before the accessory returns control to another program, it +sends the message +
    msg[0]: ACC_CLOSE +
    When receiving ACC_OPEN, the main application restores all system +variables it has changed to their original values (if possible and +neccessary). After receiving ACC_CLOSE, it may set them again to any +desired value. +
      +
    Accessories should change system variables only after sending +ACC_OPEN and restore them before ACC_CLOSE. +
      +
    There have been some problems with the implementation of +ACC_OPEN and ACC_CLOSE that should be mentioned. The system was +designed with window-less accessories in mind, i.e. accessories that +only display a dialog box. For these accessories, the above procedure +is well-defined. Accessories that use windows however have no way to +find out if they have been activated or deactivated, because they do +not receive a message to indicate this (starting from AES 4.0, this +problem is solved). Therefore such accessories must be careful with +ACC_OPEN and ACC_CLOSE. The most important thing is to guarantee that +ACC_OPEN and ACC_CLOSE always occur in pairs, and that in between no other +program gains control. How exactly this is implemented depends on the +specific application. Sometimes the best implementation is not to use +ACC_OPEN and ACC_CLOSE at all. +
      +

  10. +
+ +

After initialization is completed, all participating programs +know the identity of all other ones, either by receiving an ACC_ID +message or by receiving an ACC_ACC message. The main application is +always informed about accessory activities. If in addition it proves +neccessary to inform one accessory about the activation of another +one, this can be accomplished by sending special messages (starting +from 0x800). +

+
15.13.2.2.1.2 Multitasking GEM versions
+

The initialization procedure is much simpler in this case. Any +application, i.e. both 'standard' applications and accessories, uses +appl_search to detect all currently running AES processes when it is +started. To each application or accessory (i.e. everything but system +processes) it sends an ACC_ID message: +

+
  msg[0]:  ACC_ID (0x400)
+  msg[1]:  sender's apID
+  msg[2]:  length of the message - 16, giving 0
+  msg[3]:  program version number and message groups
+  msg[4] and msg[5]:  pointer to sender's name
+  msg[6]:  menu number (menu_id) as returned by menu_register
+  msg[7]:  reserved
+
+

The low byte of msg[3] contains a bitmap indicating which +message groups are understood by the sender. Bit zero is set for +message group 1, bit one for message group 2, and so on. This is +independent of the message types which the sender might itself send to +others. The sender of a message must ensure that it is understood by +the receiver. The high byte is used to indicate a program version +number using an arbitrary encoding scheme. +

+

The pointer to the sender's name is stored in a +processor-dependent format. The name itself is a string of characters +terminated by two zero bytes. To avoid name conflicts, long names are +preferred to short abbreviations. The name must be available at the +given address at any time, it may not be removed after initialization. +It must also reside in globally accessible memory. As the version +number is stored in msg[3], it should not occur again in the name. +(1) +

+

Applications using more than one menu entry must issue one +ACC_ID message for each entry used. Accessories without a menu entry +must use a number of -1. +

+

When receiving an ACC_ID message, an application replies by +sending a message of the same format to the original sender, the only +difference being that ACC_ACC is used instead of ACC_ID. Applications +with several menu entries must again send one message for each entry. +

+

The messages ACC_OPEN and ACC_CLOSE are not used in multitasking +systems. +

+

Note: The only difference between ACC_ID and ACC_ACC for +multitasking systems is that an application receiving ACC_ID sends +ACC_ACC as a reply, whereas no reply is sent on receiving ACC_ACC. This +prevents applications from sending ACC_ID to each other indefinitely. +Obviously the name ACC_ACC has lost its original meaning and probably +should be changed. But since the symbolic names do not influence the +actual behaviour of any program, this is not really important at all. +

+

Since in a multitasking environment every participating +application can terminate, some means must be provided to tell other +applications about this. Therefore the message ACC_EXIT has been added +to the list of level 0 messages. Before terminating, any application +sends +

+
  msg[0]:  ACC_EXIT (0x404)
+  msg[1]:  sender's apID
+  msg[2]:  length of the message - 16, giving 0
+
+

to all applications that have ever registered themselves by +sending ACC_ID or ACC_ACC. +

+
15.13.2.2.2 Extended names
+

Experience with XAcc has shown that it would often be useful to +have more information about an application than specified with ACC_ID +messages. For example it is sometimes useful to check for a special +feature that is not unique to a single program, but to several similar +ones. This was the motivation for the introduction of "extended +names". +

+

An "extended name" is a character string of the +format: +

+

'name'\0XDSC\0'string'\0'string'\0...'string'\0\0 +

+

i.e. a "standard" name followed by the string +"XDSC" (for "eXtended +DeSCription"), followed by a list of strings +containing additional information. The end of the list is marked by an +additional zero byte. +

+

Each information string indicates by its first byte what kind of +information it contains. Currently the following types are defined: +

+ + + + + + + + + + + + +
'1' - application type (human-readable) +
  +
The text following this byte (an ASCII-1, 0x31) should roughly +specify the type of application, e.g. "word processor" or +"spreadsheet". The purpose is for applications to present +this information to the user to let him/her decide where data should +go. This is not the place for advertising hype; a word processor +should call itself "word processor" and not "document +editing and design system". +
  +
It should be clear that the text should be understandable for +end users, especially it should be in the language used for the user +interface. +
  + + + + + + + + + + + + + + +
'2' - application type (machine-readable) +
  +
Currently defined are: +
"WP" - Word processor +
"DP" - DTP +
"ED" - Text editor +
"DB" - Database +
"SS" - Spreadsheet +
"RG" - Raster graphics application +
"VG" - Vector graphics application +
"GG" - General graphics application +
"MU" - Music application +
"CD" - CAD +
"DC" - Data communication +
"DT" - Desktop +
"PE" - Programming environment +
  + +
'X' - extended features This string is used to indicate special +communication capabilities of an application. It can be used to give +more specific information than just the message groups understood. +Since this information is meant to be used by other applications +rather than end users, short abbreviations are sufficient. +
  +
'N' - generic name Often several related, but not completely +identical, applications have different names. Marketing requirements +may even dictate changes of the "official" brand names, +making them unsuitable for a "technical" identification. In +such cases a "generic" name for all these programs can be +specified, which is mainly used by other programs wishing to use +special messages. +
  + +
+ +

The "normal" name should be the "official" +name of the program, just as it is used on the package, in the manual, +and in similar places. It should be presentable to the user to let +him/her decide where to send data. +

+

Example: The address database "That's Address" +identifies itself with the extended name (in C syntax) +

+

"That's Address\0XDSC\01database\02DB\0XMM\0XSU\0", +

+

indicating that it is a database with features "MM" +and "SU". The first one indicates a special mail merge mode, +the second one the possibility of retrieving data by sending the key +via ACC_TEXT. (Further information on this program can be obtained +from its manual.) +

+
15.13.2.2.3 Message group 1
+ + + +
ACC_ACK  = 0x500
+ACC_TEXT = 0x501
+ACC_KEY  = 0x502
+
+ +
    +
  1. Transmitting text data: +
      +

         msg[0]:  ACC_TEXT (0x501)
    +     msg[4] and msg[5]:   pointer to text
    +
    +
    The text may contain all printable ASCII characters (code >= +32) and the following control codes: +
      +
    0x09 TAB (may be interpreted as a space by the receiver) +
    0x0A LF (usually ignored by receiver) +
    0x0D CR (used to mark an end-of-line (or end-of paragraph) +
      +
    Other control codes may only be used if the receiver is known to +understand them. The text is terminated by a zero byte. After the text +has been interpreted completely, the receiver acknowledges by sending +
      +
         msg[0]:  ACC_ACK (0x500)
    +     msg[3]:  0 if the text was simply ignored
    +              1 if it was used in some sensible way
    +
    +
    The sender of a text message may not change the text nor send +any other text messages to the same receiver until is has received the +acknowledgement. +
      +
    The sender must make sure that the memory used to store the text +is globally accessible. +
      +
    The receiver should normally interpret the text as if it were +typed from the keyboard. A word processor would for example insert it +into the currently edited document (this implies using CR as an +end-of- paragraph mark), a command line interpreter would interpret +the text as a command (which implies using CR as an end-of-line mark). +
      +

  2. +
  3. Simulation of a key press: +
      +

         msg[0]:  ACC_KEY (0x502)
    +     msg[3]:  scancode of the simulated key and corresponding
    +              ASCII-code (as returned by evnt_keybd)
    +     msg[4]:  state of the SHIFT keys (as returned by Kbshift)
    +
    +
    This message should be regarded identical to a keyboard +event(1). It can be used to send control commands to a receiver +which might have been issued from the keyboard. Of course this +requires a knowledge of the receiver, as no standard keyboard command +sets exist. It should be noted that the receiver is free to use only +the ASCII-code or only the scan code, or both of them. +
      +
    This message is acknowledged after its interpretation with: +
      +
         msg[0]:  ACC_ACK (0x500)
    +     msg[3]:  0 if ACC_KEY was ignored or a given command was not
    +              understood, 1 if some action was taken.
    +
    +

  4. +
+ +

To prevent a deadlock if a program does not properly acknowledge +a message, the sender should have some way to recover. An accessory +could for example stop waiting for an acknowledgement after the next +AC_OPEN, a main application might time out after a sufficiently long +period. +

+
15.13.2.2.4 Message group 2
+ + +
ACC_META = 0x503
+ACC_IMG  = 0x504
+
+

These message are used to exchange drawings and pictures. Only +the file formats defined in the GEM documentation are used; they +are sufficient to meet most requirements, and any GEM application +should be able to handle them anyway. +

+ +
    +
  1. Sending a metafile: +
      +

         msg[0]:  ACC_META (0x503)
    +     msg[3]:  1 for the final part, 0 otherwise
    +     msg[4] and msg[5]:   pointer to data
    +     msg[6] and msg[7]:   length of data (32 bit longword)
    +
    +
    The metafile data is sent in the same format as it would be +stored on disk. As metafiles can become quite large, and often +accessories in particular do not have sufficient memory free to store +them, a file can be sent in several pieces. The receiver has to take +care of assembling all parts to restore the original data, if +neccessary by writing the parts to a file. The last part of a file is +marked by msg[3]=1. The sender may send no other data between the +parts of a file. msg[6] and msg[7] contain the length of the part +being sent, not the total length. +
      +
    The receiver acknowledges each part as described for group 1. As +for text messages, the sender must make sure that the data to be +transferred is stored in globally accessible memory. +
      +

  2. +
  3. Sending a bit image file: +
      +
    msg[0]: ACC_IMG (0x504) +
      +
    otherwise identical to 1. +
      +

  4. +
+ +

15.13.2.3 Compatibility considerations

+

There are two major changes with respect to the original(1) +XAcc definition: +

+ +
    +
  1. "Levels" have been replaced by "message +groups" +
      +
    The motivation for this change was that the classification +according to exchangeable data types was not really a hierarchical +one; there is no reason why a programm accepting graphics should also +be able to understand text. The new scheme makes no such arbitrary +assumptions. +
      +
    There is only one situation in which a possible incompatibility +could occur: an application following the "old" convention +encounters a "new" application and one of them indicates 2 +in the level/message group byte. This would be interprets as +"graphics only" by one and as "graphics and text" +by the other. Since the number of level-2 applications was always +extremely small (in fact, the author(2) knows only of a single +one), this should be no problem in practice. +
      +

  2. +
  3. Extended names have been introduced +
      +
    This could lead to a problem in the extremely unlikely case of +an "old" application using a name string which is +accidentally followed by "XDSC". +
      +

  4. +
+ +

In any case it is expected that most applications will be +converted to the new rules soon, if only to support MultiTOS. +

+

15.13.3 Extended XAcc

+

This chapter describes developments of the XAcc protocol after +"Classic XAcc" (11/28/92). Last changes have been made on +June 15, 1995. +

+

Seit der letzten offiziellen Dokumentationen zum +XAcc-Protokoll haben sich einige Erweiterungen ergeben, die nun +zusammengefaßt worden sind. Einige der Erweiterungen sind aus +speziellen Formen des Datenaustauschs zwischen der Textverarbeitung +That's Write und der Adreßverwaltung That's Address bzw. dessen +Nachfolger no|Address hervorgegangen. Trotzdem sind diese +Erweiterungen auch beliebigen anderen Applikationen zugänglich und +die Verwendung dieser Applikationsnamen in der folgenden Dokumentation +hat nur beispielhaften Charakter (That's Address = TA und That's Write += TW). Bei den Erweiterungen handelt es sich um: +

+
    +
  • MailMerge-Protokoll +
      +
    Der eigentliche Seriendruck (MailMerge) des TW wird über dieses +Protokoll abgehandelt. +
      +

  • +
  • Remote-Mailmerge-Protokoll +
      +
    Ermöglicht es einer Applikation, von sich aus einen Seriendruck +im TW zu initiieren. +
      +

  • +
  • Inquiry-Protokoll +
      +
    Dient der Ermittlung von Informationen über den Aufbau einer +Datenbank. +
      +

  • +
  • Request/Reply-Protokoll +
      +
    Dient dem allgemeinen Datenaustausch zwischen Applikationen. +
      +

  • +
+ + +
+

15.13.3.1 MailMerge-Protokoll

+

Dieses Protokoll arbeitet aus historischen Gründen mit +ACC_TEXT- Messages. Das TW schickt dem TA zuerst eine ACC_TEXT -Messages mit +einem String, der mit "#I" beginnt und nach dem 'I' den SDF- +Formatstring beinhaltet, der dem TA sagt, welche Teile eines +Adreßdatensatzes übertragen werden sollen. +

+

Beispiel: "#IA1,A2,A3,A4,T1" (die ersten 4 +Adreßfelder und die 1. Telefonnr.). +

+

Bei erfolgreichem Empfang dieser Nachricht wird dem TW eine +ACC_TEXT- Message mit dem String "0" zurückgesendet, +ansonsten ein Leerstring ". +

+

Nun kann TW beginnen, die einzelnen Adreßdaten mittels der +ACC_TEXT- Message "#N" anzufordern. Bei Empfang einer solchen +Nachricht schickt TA für jedes Adreßfeld einer Adresse eine +ACC_TEXT-Message und zum Abschluß eines Datensatzes einen Leerstring +". +

+

15.13.3.2 Remote-Mailmerge-Protokoll

+

Für dieses Protokoll gibt es zwei neue XAcc-message Typen, +nämlich: +

+ + +
#define ACC_FORCESDF        0x520
+#define ACC_GETSDF          0x521
+
+

TA sendet dem TW ein ACC_FORCESDF, wenn eine Adresse oder eine +Adreßliste an das TW geschickt werden soll. Im Falle, daß es sich +nur um eine Adresse handelt, steht in msg[4]+[5] ein Pointer auf das +Suchwort der Adresse, bei einer Adreßliste steht in msg[4]+[5] ein +Pointer auf "#L". Die ACC_FORCESDF-message muß mit einem +ACC_ACK bestätigt werden (msg[3]==1 -> OK und msg[3]==0 -> +ERROR). +

+

Wenn TW ein "#L" bekommst, dann fährt TW ein ganz +normales MailMerge- Protokoll (eingangs erklärt). Wenn TW ein +Suchwort bekommt (max. 20 Zeichen lang), dann fordert TW beim TA diese +Adresse mittels ACC_GETSDF an. Die ACC_GETSDF-message muß in +msg[4]+[5] einen Pointer auf einen Buffer haben, in dem zuerst das +Suchwort mit abschließendem '\0' steht und dann der XDF-Formatstring +steht (Bsp.: "JÖRG\0A1,A2,A3\0"). +

+

Wenn TA die ACC_GETSDF-message verstehen kann, dann schickt es +ein ACC_ACK mit msg[3]==1, ansonsten ein ACC_ACK mit msg[3]==0. +Anschließend bekommt TW die Daten dieser einen Adresse wie beim +normalen MailMerge- Protokoll. +

+

TW muß in seinem XDSC-String ein "XRM" zu stehen +haben, damit TA von sich aus ein Remote-Mailmerge-Protokoll startet. +

+

TA hat jetzt folgende XDSC-Features (Bsp. ACC): +

+
const char ta2Ident[] = "That's Address ACC\0XDSC\0"
+                        "1Adressverwaltung\0"
+                        "2DB\0"
+                        "XMM\0XSU\0XDI\0XRM\0NnoAddress ACC\0";
+
+ + + + + + + + + + + + +
XMM MailMerge +
  +
XSU Suchwortübergabe (optional mit anschließendem '?') +
  +
XDI Inquiry-Protokoll +
  +
XRM Remote-MailMerge +
  + +
+ +

15.13.3.3 Inquiry-Protokoll

+ + + +

Im Prinzip läuft das ganze Inquiry-Protokoll in 2 Stufen ab. +Zuerst werden die Daten der verfügbaren Datenbanken ermittelt, und +anschließend (zeitlich voneinander völlig unabhängig) werden die +einzelnen Felder einer ausgewählten Datenbank erfragt. +

+

Also Part 1 (am Beispiel von TA und TW): +

+
            TA                  |                   TW
+--------------------------------+------------------------------------
+                            ACC_GETDSI
+            <----------------------------------------
+
+                            ACC_DSINFO
+            ---------------------------------------->
+
+                            ACC_ACK
+            <----------------------------------------
+
+    {
+                            ACC_FILEINFO
+            ---------------------------------------->
+
+                            ACC_ACK
+            <----------------------------------------
+
+    }   /* <n> mal, wobei <n> bei ACC_DSINFO übertragen wurde */
+
+

Erklärung der einzelnen Protokollelemente: +

+ + + + + + + + + +
ACC_GETDSI +
  +
Hiermit wird das Inquiry-Protokoll initiiert. Diese Message +enthält einen Pointer auf eine Variable des Typs Xacc_Dsi_Request, in +dem codiert wird, welche Felder welchen Typs gewünscht sind. +
  +
        msg[0]            = ACC_GETDSI (0x510)
+        msg[1]            = application id
+        msg[4] und msg[5] = Pointer auf die gewünschten Feld-Typen
+                            (siehe XACC.H)
+
+
ACC_DSINFO +
  +
Auf ein ACC_GETDSI antwortet die angefragte Applikation mit +dieser Message. Hierbei wird ein Pointer auf eine Variable des Typs +Xacc_Dsinfo, wenn die Anfrage beantwortet werden kann, oder ein +NULL-Pointer, wenn die Anfrage nicht beantwortet werden kann, der +anfragenden Applikation übergeben. +
  +
        msg[0]            = ACC_DSINFO (0x511)
+        msg[4] und msg[5] = Pointer auf Xacc_Dsinfo Struktur
+                            (siehe XACC.H) oder NULL
+
+
Die anfragende Applikation beantwortet alle Replys seinerseits +mit einer ACC_ACK= Message: ACC_ACK: +
  +
        msg[0]            = ACC_ACK
+        msg[3]            = 1     wenn alles OK ist
+                          = 0     wenn ein Fehler aufgetreten ist
+                                  (Abbruch des Protokolls)
+
+
ACC_FILEINFO +
  +
Wenn die ACC_DSINFO Message von der anfragenden Applikation +bestätigt wurde, so wird für jede verfügbare Datei eine +ACC_FILEINFO-Message mit einem Pointer auf eine Variable des Typs +Xacc_File_Info, oder ein NULL-Pointer bei einem Fehler, an die +anfragende Applikation gesendet. +
  +
Jede dieser Messages muß, wie oben erwähnt, mit einer ACC_ACK +von der anfragenden Applikation bestätigt werden. +
  +
        msg[0]            = ACC_FILEINFO (0x512)
+        msg[4] und msg[5] = Pointer auf Xacc_File_Info Struktur
+                            (siehe XACC.H) oder NULL
+
+ +
+ + + +

Wenn dieser erste Teil des Inquiry-Protokolls erfolgreich +beendet wurde, dann kann die anfragende Applikation dem Anwender die +Liste der verfügbaren Datenbanken und deren Information 'auf die Nase +knallen' und ihn eine Auswahl treffen lassen. +

+

Tut der Anwender dies, so läuft der 2. Part des +Inquiry-Protokolls los (wieder am Beispiel von TA und TW): +

+
            TA                  |                   TW
+--------------------------------+------------------------------------
+                            ACC_GETFIELDS
+            <----------------------------------------
+
+    {
+                            ACC_FIELDINFO
+            ---------------------------------------->
+
+                            ACC_ACK
+            <----------------------------------------
+
+    }   /* <n> mal, wobei <n> bei ACC_FILEINFO übertragen wurde */
+
+

Erklärung der einzelnen Protokollelemente: +

+ + + + + + +
ACC_GETFIELDS +
  +
Hiermit wird von der anfragenden Applikation eine Datenbank +ausgewählt (die entsprechende Datenbank-ID hat sie ja bei der +ACC_FILEINFO Message in der Struktur Xacc_File_Info empfangen) und +gibt der angefragten Applikation bekannt, daß nun die einzelnen +Feldinformationen übertragen werden sollen. +
  +
        msg[0]            = ACC_GETFIELDS (0x513)
+        msg[1]            = application id
+        msg[3]            = ID der gewünschte Datenbank
+
+
ACC_FIELDINFO +
  +
Wenn die ACC_GETFIELDS Message von der anfragenden Applikation +bestätigt wurde, so wird für jedes Feld eine ACC_FIELDINFO Message +mit einem Pointer auf eine Variable des Typs Xacc_Field_Info, oder ein +NULL-Pointer bei einem Fehler, an die anfragende Applikation gesendet. +
  +
Jede dieser Messages muß, wie oben erwähnt, mit einer ACC_ACK +von der anfragenden Applikation bestätigt werden. +
  +
        msg[0]            = ACC_FIELDINFO (0x514)
+        msg[4] und msg[5] = Pointer auf Xacc_Field_Info Struktur
+                            (siehe XACC.H) oder NULL
+
+ +
+ +

In That's / no| Address wurden im Moment die Feldtypen FT_CHAR, +FT_DATE und FT_TIME implementiert. +

+

15.13.3.4 Request/Reply-Protokoll

+

Es werden zwei weitere Message-Typen eingeführt, um einen +allgemeinen Datenaustausch zu ermöglichen: +

+ + +
#define ACC_REQUEST     0x480
+#define ACC_REPLY       0x481
+
+ + + + + + +
ACC_REQUEST +
  +
Mittels dieser Nachricht fordert man bei einer anderen +Applikation einen Dienst an. Der Aufbau dieser Nachricht ist +folgendermaßen: +
  +
      msg[0]:     ACC_REQUEST (0x480)
+      msg[1]:     Application-ID des Senders
+      msg[2]:     0
+      msg[3]:     Das high-Byte ist frei für Applikationsspezifische
+                  Informationen und im low-Byte ist der Typ der
+                  Daten codiert, die mit dieser Nachricht verschickt
+                  werden:
+                  0x01  String, d.h. msg[4]+msg[5] ist
+                        ein Pointer auf den String
+                  0x02  Env-String, d.h
+                        msg[4]+msg[5] ist ein Pointer
+                        auf den Env-String (mehrere durch
+                        '\0' getrennte Strings mit
+                        abschließenden doppelten '\0'-Bytes)
+                  0x03  binär-Daten, d.h.
+                        msg[4]+msg[5] ist ein Pointer auf
+                        die binär-Daten. In diesem Fall muß der
+                        Empfänger natürlich über die Struktur
+                        Bescheid wissen! (lokale Typunterscheidung
+                        ist z.B. mittels des high-Bytes möglich)
+                  0x04  code, d.h. msg[4] bis msg[7]
+                        enthalten direkt die Daten (sinnvoll bei
+                        Übertragung von Datenmengen bis 8 Byte)
+      msg[4,5]:   Pointer auf die Daten (außer Typ 0x04)
+      msg[6,7]:   Länge des Datenbereichs incl. eventueller
+                  '\0'-Bytes (außer Typ 0x04)
+
+
Es existieren zwei verschiedene Möglichkeiten, diese Nachricht +zu beantworten: +
  +
    +
  • ACC_ACK mit msg[3]=0, wenn die empfangende Applikation diese +Nachricht nicht bearbeiten kann +
      +

  • +
  • ACC_REPLY, wenn die Nachricht bearbeitet werden konnte und eine +Antwort zurückgeschickt wird +
      +

  • +
+ +
ACC_REPLY +
  +
Mittels dieser Nachricht wird eine ACC_REQUEST Anforderung +erfolgreich beantwortet. Der Aufbau dieser Nachricht ist +folgendermaßen: +
  +
            msg[0]:     ACC_REPLY (0x481)
+            msg[1]:
+                .
+                .       siehe ACC_REQUEST!
+                .
+            msg[7]:
+
+ +
+ +

Applikationen, die oben beschriebene Protokollelemente +unterstützen, müssen in ihrer XDSC-Beschreibung das Extended-Feature +"RQ" enthalten haben. +

+

15.13.4 Example: no|Link's XAcc protocol

+

Das no|Link-Accessory wurde für die Ansteuerung von +Infrarotgeräten konzipiert und beinhaltet eine +XAcc-Kommunikationsschicht für die Ansteuerung durch spezielle +Applikationen. Zum momentanen Zeitpunkt wird das Media-Link-Interface +von Catch Computer unterstützt. Eine weitere Anpassung an das +no|Remote-Interface von no|Software ist in Arbeit. +

+

Das no|Link-Accessory verwaltet alle Informationen, die zur +Ansteuerung der verwendeten Infrarot- oder sonstiger Hardware +benötigt werden. Jedem hardwareabhängigen Code (z.B einem +Infrarotsignal) wird ein Befehl zugeordnet, und für jedes Gerät +(z.B. Videorekorder) existiert eine Liste solcher Befehle. +

+

Will nun z.B. eine Applikation für die Fernbedienung eines +Videorekorders ein Infrarotsignal für die Play-Taste senden, so +schickt es no|Link eine XAcc-Nachricht, in der das Kommando +<senden>, das Gerät <VIDEOREKORDER> und der Befehl +<PLAY> codiert sind. +

+

Damit eine Applikation mit no|Link vollständig kommunizieren +kann, muß diese das Request/Reply-Protokoll unterstützen, was als +Extended- Feature in der XDSC-Beschreibung durch ein "RQ" +bekannt gemacht wird. Nur so ist es möglich, die Liste der +eingetragenen Geräte von no|Link erhalten zu können. +

+

Wenn die Applikation auch Codes vom Accessory empfangen können +will (nur mit entsprechender Hardware möglich), so muß als +Extended-Feature in der XDSC-Beschreibung zusätzlich ein +"RR" (Remote Receive) enthalten sein. Alle Applikationen, +die mit noLink arbeiten wollen, müssen den XAcc-Level 1 +unterstützen. +

+

Als Application-Type enthält das no|Link-Accessory im XDSC +"\2RC" (Remote Control). +

+

Die vollständige XAcc-Identifikation von no|Link lautet zur +Zeit folgendermaßen (in C-Syntax): +

+
    char xaccNoLinkIdent[] =    "Infrarot Manager\0"
+                                "XDSC\0"
+                                "1Fernsteuerschnittstelle\0"
+                                "2RC\0"
+                                "XRQ\0"
+                                "NnoRci\0";
+
+

Eine denkbare XAcc-Identifikation für eine +no|Link-Applikation könnte so aussehen: +

+
    char xaccIdentstring[] =    "VideoControl\0"
+                                "XDSC\0"
+                                "1Video Fernbedienung\0"
+                                "XRQ\0"
+                                "Nno|Video ACC\0";
+
+

Die Kommunikation zwischen Applikation und dem no|Link-Accessory +findet hauptsächlich über ACC_TEXT Messages statt. +

+

Das Accessory versteht zur Zeit folgende Befehle, die als String +mittels einer ACC_TEXT Message versendet werden müssen (<X> := +<Gerät>:<Befehl>): +

+ + + + + + + + + + + + +
"S <X>" Senden eines Befehls, z.B: "S VIDEO:PLAY". +
  +
"P <X>" Präparieren eines Befehls, z.B: "P VIDEO:PLAY". +Hierbei wird der Infrarot-Hardware der Code für diesen Befehl +mitgeteilt, aber noch nicht abgeschickt. +
  +
"S" Senden des zuletzt präparierten Befehls. +
  +
"T <X>" Test der Existenz eines Befehls. +
  +
Insbesondere bei der Neuinstallation einer Fernsteuerungs- +Applikation sollten alle Geräte und Befehle, die diese Applikation +verwendet, dem Accessory mitgeteilt werden! +
  +
Wenn no|Link den mitgelieferten Befehl nicht kennt, so wird der +Benutzer aufgefordert, die nötige "Lernprozedur" zu +tätigen bzw. dem neuen Befehl einen schon vorhandenen zuzuweisen. +
  +
Es sollte in jeder Fernsteuerungsapplikation eine Funktion +geben, die es dem Benutzer ermöglicht, alle unterstützten Befehle zu +"testen" - am besten über einen +"Anmelden"-Button. +
  + +
+ +

Die Testfunktion ist die einzige, die u.U. eine Interaktion mit +dem Benutzer führt. Alle anderen vollführen keine Ausgabe. +

+

Als Antwort erhält die Applikation eine ACC_ACK-Message, bei +der in msg[3] der Erfolg der Behandlung des Befehls vermerkt ist: +

+ + + + + + +
1 Operation war erfolgreich +
  +
0 Gerät/Befehl ist nicht vorhanden bzw. Fehler bei der +Bearbeitung +
  + +
+ +

Geräte- und Befehlsnamen dürfen maximal 32 Zeichen lang sein +und dürfen KEINEN ':' enthalten. Es wird nicht zwischen Groß- und +Kleinschreibung unterschieden. +

+

Eine Applikation kann vom Accessory eine Liste der eingetragenen +Geräte anfordern. Hierfür muß die Applikation das neue XAcc- +Request/Reply-Protokoll verstehen (siehe oben bzw. XACC.H). +

+

Um die Liste anzufordern, wird von der Applikation ein ACC_REQUEST an +das Accessory geschickt, wobei diese Nachricht folgendermaßen +aufgebaut sein muß: +

+
    msg[0] = ACC_REQUEST (0x480)
+    msg[1] = apid
+    msg[2] = 0
+    msg[3] = 0x04       /* Datentyp: Code */
+    msg[4] = 'D'        /* 'D' steht für "devices" */
+    msg[5] = 0
+    msg[6] = 0
+    msg[7] = 0
+
+

Als Antwort erhält die Applikation, wenn ein Fehler auftrat +eine ACC_ACK- Message mit msg[3] == 0, oder bei Erfolg eine ACC_REPLY- +Message: +

+
    msg[0] = ACC_REPLY (0x481)
+    msg[1] = apid von no|Link
+    msg[2] = 0
+    msg[3] = 0x02       /* Datentyp: Environment-String */
+    msg[4]+msg[5] = Pointer auf einen global zugreifbaren
+                    Speicher, in dem die Liste der Geräte
+                    in folgendem Format steht:
+                    "DEVICEINFOS:\0Gerät1\0Gerät2\0"
+    msg[6]+msg[7] = long-value, der die Größe des Buffers
+                    angibt (inkl. der abschließenden zwei
+                    NULL-Bytes)
+
+
+

Der Empfang einer ACC_REPLY-Message muß abschließend mit einer +ACC_ACK- Message bestätigt werden, damit das no|Link-Accessory seine +Resourcen wieder freigeben kann! +

+

15.13.5 XACC.H

+ + + + +
/*==================================================================*/
+/*                                                                  */
+/*                XAcc definitions (PureC syntax)                   */
+/*                                                                  */
+/*==================================================================*/
+
+#ifndef __XACC__
+# define __XACC__
+
+/*--------------------------------------------------------------------
+    XAcc message types
+--------------------------------------------------------------------*/
+/* Level 0 */
+# define ACC_ID             0x400
+# define ACC_OPEN           0x401
+# define ACC_CLOSE          0x402
+# define ACC_ACC            0x403
+# define ACC_EXIT           0x404
+
+/* Level 1 */
+# define ACC_ACK            0x500
+# define ACC_TEXT           0x501
+# define ACC_KEY            0x502
+
+/* Level 2 */
+# define ACC_META           0x503
+# define ACC_IMG            0x504
+
+/*
+ * extended XACC Message-Types:
+ * Diese Messages sind relativ "unabhängig" vom XACC-Level der
+ * Applikationen, d.h. sie sollten nur verwendet werden,
+ * wenn der Kommunikationspartner in seiner XDSC-Beschreibung
+ * über das ensprechende Extended-Feature verfügt!
+ */
+
+/* Reuest/Reply Protokoll: (Extended-Feature "RQ")      */
+/*        ACC_ACK Messages sind Teil des Protokolls und */
+/*        müssen deshalb verstanden werden!             */
+# define ACC_REQUEST        0x480
+# define ACC_REPLY          0x481
+
+/* Inquiry Protokoll: (Extended-Feature "DI")           */
+/*        ACC_ACK Messages sind Teil des Protokolls und */
+/*        müssen deshalb verstanden werden!             */
+#define ACC_GETDSI          0x510
+#define ACC_DSINFO          0x511
+#define ACC_FILEINFO        0x512
+#define ACC_GETFIELDS       0x513
+#define ACC_FIELDINFO       0x514
+
+/* Remote MailMerge Protokoll: (Extended-Feature "RM")  */
+/*        ACC_ACK Messages sind Teil des Protokolls und */
+/*        müssen deshalb verstanden werden!             */
+#define ACC_FORCESDF        0x520
+#define ACC_GETSDF          0x521
+
+
+/*--------------------------------------------------------------------
+    definitions for the Request/Reply protocol
+--------------------------------------------------------------------*/
+/* Datentypen des Request/Reply: */
+#define RQREP_TYPE_STRING   1
+#define RQREP_TYPE_ENVSTR   2
+#define RQREP_TYPE_BIN      3
+#define RQREP_TYPE_CODE     4
+
+
+/*--------------------------------------------------------------------
+    definitions for the Inquiry protocol
+--------------------------------------------------------------------*/
+#define DSI_VERSION         0x0100
+
+
+/* field data-types:
+ *    values lower than 128 are 'human readable types' and
+ *    values greater/equal 128 are 'machine readable types'
+ */
+#define FT_CHAR        0x00  /* string                                */
+#define FT_DATE        0x02  /* string in _IDT format.                */
+                             /* dflt: DD.MM.YY if no _IDT available   */
+                             /* For more about _IDT see MINT          */
+#define FT_TIME        0x03  /* string: HH:MM:SS                      */
+
+#define FT_BYTE        0x80  /* 2  byte HEX-string                    */
+#define FT_UBYTE       0x81  /* 2  byte HEX-string                    */
+#define FT_SHORT       0x82  /* 4  byte HEX-string                    */
+#define FT_USHORT      0x83  /* 4  byte HEX-string                    */
+#define FT_LONG        0x84  /* 8  byte HEX-string                    */
+#define FT_ULONG       0x85  /* 8  byte HEX-string                    */
+#define FT_FLOAT       0x86  /* 8  byte HEX-string                    */
+#define FT_DOUBLE      0x87  /* 20 byte HEX-string                    */
+#define FT_ENUM        0x88  /* 4  byte HEX-string                    */
+#define FT_BOOL        0x89  /* string: "T" or "F"                    */
+#define FT_BITFLD      0x8A  /* at 8 Bit aligned HEX-string           */
+#define FT_TIME_T      0x90  /* 8  byte HEX-string (time_t, see UNIX) */
+
+
+typedef struct {
+    int     version;
+    char    field_types[32]; /* max. count of 256 fieldtypes are      */
+                             /* available (see definements above)     */
+                             /* Each bit in this field represents a   */
+                             /* valid field-type, where type 0 is     */
+                             /* the lowest bit of the first character */
+                             /* and type 255 the highest bit of the   */
+                             /* last character                        */
+} Xacc_Dsi_Request;
+
+typedef struct {
+    int     db_anz;          /* count of available data bases         */
+} Xacc_Dsinfo;
+
+typedef struct {
+    long    db_id;           /* ID of the data base                   */
+    char    fname[32];       /* Filename of the data base. if you     */
+                             /* are using a GEMDOS or DOS filesystem  */
+                             /* it must have a <8.3> format.          */
+    char    title[32];       /* A max. 32 byte long description of    */
+                             /* the data base.                        */
+    time_t  crea_time;       /* The creation date/time of the data    */
+                             /* base file.                            */
+    time_t  mod_time;        /* The last modification date/time of    */
+                             /* the data base structure.              */
+    int     n_fields;        /* The number of fields that are         */
+                             /* available corresponding to the        */
+                             /* requested field typs given by the     */
+                             /* ACC_GETDSI message                    */
+} Xacc_File_Info;
+
+typedef struct {
+    int     fld_size;        /* the count of bits into the field      */
+    int     n_fields;        /* The count of field elements           */
+    int     elem_size;       /* The length of one field element       */
+    char    field_buff[0];   /* from here the list of the <n_fields>  */
+                             /* elements follows in this format:      */
+                             /* 2 byte <bitno> and <elem_size> byte   */
+                             /* description.                          */
+                             /* e.g. (<elem_size>=10):                */
+                             /*    "\0\1private\0\0\0"                */
+                             /*    "\0\2sex\0\0\0\0\0\0\0"            */
+                             /*    "\0\4dealer\0\0\0\0"               */
+                             /* The value "06" identifies the 2nd     */
+                             /* and the 3rd element.                  */
+                             /* NOTE that you can't use sizeof()      */
+                             /* because of this declaration.          */
+} Bitfld_Info;
+
+typedef struct {
+    int     n_enums;         /* The count of enum-elements            */
+    int     elem_size;       /* The length of one enum element        */
+    char    enum_buff[0];    /* from here the list of the <n_enums>   */
+                             /* elements follows in this format:      */
+                             /* 2 byte <id> and <elem_size> byte      */
+                             /* description.                          */
+                             /* e.g. (<elem_size>=10):                */
+                             /*    "\0Aprivate\0\0\0"                 */
+                             /*    "\0Bsex\0\0\0\0\0\0\0"             */
+                             /*    "\0Edealer\0\0\0\0"                */
+                             /* The value "0042" identifies the 2nd   */
+                             /* element.                              */
+                             /* NOTE that you can't use sizeof()      */
+                             /* because of this declaration.          */
+} Enum_Info;
+
+typedef union {
+    ulong        n_elems;      /* for types like char,uchar this is     */
+                               /* the length of the field               */
+    Enum_Info    *enum_info;   /* enum is a special type, which needs   */
+                               /* more description than the length!     */
+    Bitfld_Info  *bitfld_info; /* a bitfield like used in TA2 for the   */
+                               /* info-flags                            */
+} Type_Desc;
+
+typedef struct {
+    char         id[8];      /* The export-identifier of the corres-  */
+                             /* ponding field, i.e. "A1" for the      */
+                             /* first address field of Clever or TA2  */
+    char         name[16];   /* A short description                   */
+    char         desc[32];   /* A long description                    */
+    int          type;       /* The data type. Must be one of the     */
+                             /* constants defined at the top of this  */
+                             /* file                                  */
+    Type_Desc    t_desc;     /* This union contains either the length */
+                             /* of the field or a pointer to a info-  */
+                             /* struct if the type is a special one   */
+                             /* like enum or other user-defined types */
+} Xacc_Field_Info;
+
+
+#endif    /* #ifndef __XACC__ */
+
+
+ +Home +ProtokolleProtokolle +Virtual-Screen-ProtokollVirtual-Screen-Protokoll +xFSL-SchnittstellexFSL-Schnittstelle + + diff --git a/de/proto_xfsl.html b/de/proto_xfsl.html new file mode 100644 index 000000000..593fa811d --- /dev/null +++ b/de/proto_xfsl.html @@ -0,0 +1,2758 @@ + + + + + +Die Anleitung zum TOS: xFSL-Schnittstelle + + + + + + + + + +Home +ProtokolleProtokolle +XAccXAcc +XSSI-ProtokollXSSI-Protokoll + +
+ +

15.14 xFSL-Schnittstelle

+

Spätestens seit der Einführung von Vektorfonts erfreut sich +das GDOS, das jahrelang auf dem Atari ein Schattendasein führte, +steigender Beliebtheit. Immer mehr Programme bieten die Möglichkeit, +für die Ausgabe (und teilweise auch für die Eingabe) einen anderen +Font als den Systemfont zu verwenden. +

+

Um nun einen Font auswählen zu können, benötigt man einen +Fontselektor. Und damit nicht jeder Programmierer sein eigenes +Süppchen kocht und im Sinne einer einheitlichen Bedienung entstand +der Wunsch nach einer Systemerweiterung, die einen Fontselektor +— ähnlich wie einen Fileselektor — für alle Programme +zur Verfügung stellt. +

+

Das erste derartige Programm war der UFSL von Michael Thänitz. +Er stellt über einen Cookie Routinen zum Aufruf eines Fontselektors +zur Verfügung. Diese Schnittstelle wird bereits von einer Reihe von +Programmen verwendet und es gibt auch bereits weitere Fontselektoren, +die über diese Schnittstelle aufgerufen werden können. +

+

Zwar läßt sich nun über die UFSL–Schnittstelle ein +Fontselektor aufrufen, doch hat diese Schnittstelle bereits eine Reihe +von — zum Teil inkompatiblen — Änderungen und +Erweiterungen hinter sich. Daher gehen die meisten Programme heute +davon aus, daß sie nur die ursprüngliche einfache UFSL-Schnittstelle +zur Verfügung haben. Im Endeffekt bleiben also die Erweiterungen +ungenutzt und wenn in einem Programm dann doch einmal ein etwas +leistungsfähigerer Fontselektor benötigt wird, dann geht man doch +wieder dazu über, extra für das Programm einen neuen Fontselektor zu +schreiben. Etwas überspitzt formuliert wird hier also die Idee eines +externen Fontselektors ad absurdum geführt … +

+

Durch den Wildwuchs an der UFSL-Schnittstelle erschien es +sinnvoller, einen klaren Trennstrich zu ziehen und eine komplett neue +Schnittstelle zu entwickeln, die dann auch über einen neuen Cookie +angeboten wird. +

+

Dieser Text beschreibt diese neue Schnittstelle, über die nicht +nur einfach ein Fontselektor aufgerufen, sondern auch in vielfältiger +Weise Einfluß auf diesen genommen werden kann. +

+ +
+

15.14.1 Die xFSL–Schnittstelle

+

Über die xFSL–Schnittstelle hat der Aufrufer (d.h. das +Programm, das den Fontselektor aufruft) wesentlich mehr Einfluß auf +den Fontselektor, sein Verhalten und auf die zur Auswahl angebotenen +Fonts. +

+

Bei der Konzeption der neuen Schnittstelle wurde versucht, auf +die Möglichkeiten der verschiedenen Programmiersprachen Rücksicht zu +nehmen (z.B. Vermeidung von Zeigern auf Funktionen) und gleichzeitig +für mögliche Erweiterungen der Schnittstelle gerüstet zu sein. +

+

Die Anpassung eines Programms an die xFSL–Schnittstelle +sollte eine Sache von wenigen Minuten sein, zumal Beispielaufrufe in +verschiedenen Programmiersprachen mitgeliefert werden. Die Umsetzung +spezieller Wünsche ist natürlich u.U. etwas aufwendiger, sollte aber +auch kein unlösbares Problem darstellen. +

+

Es folgt die Beschreibung des xFSL–Cookies sowie der +verschiedenen xFSL–Aufrufe und Parameter … +

+ +
+

15.14.1.1 Der xFSL–Cookie

+ +

Wenn ein Fontselektor installiert ist, der die +xFSL–Schnittstelle unterstützt, dann existiert ein Cookie +xFSL, dessen Wert ein Zeiger auf die folgende Struktur +ist: +

+
+
typedef struct
+{
+ unsigned long xfsl;       /* Magic 'xFSL'              */
+ unsigned int  revision;   /* Schnittstellen-Revision   */
+ unsigned long product;    /* Kennung des Fontselektors */
+ unsigned int  version;    /* Version des Fontselektors */
+ xFSL_INPUT    xfsl_input; /* einfacher Aufruf          */
+ xFSL_INIT     xfsl_init;  /* Init-Aufruf               */
+ xFSL_EVENT    xfsl_event; /* Event-Aufruf              */
+ xFSL_EXIT     xfsl_exit;  /* Exit-Aufruf               */
+ xFSL_INFO     xfsl_info;  /* Info-Aufruf               */
+} xFSL;
+
+
+

Die Komponenten der Struktur im einzelnen: +

+ + + + + + + + + + + + + + + + + + + + + +
(xfsl Hier steht, nur zur Sicherheit, nochmals die +ASCII–Zeichenfolge xFSL (entspricht hexadezimal +$7846534C). +
  +
revision Dies ist die Revisionsnummer der xFSL–Schnittstelle, sie +enthält z.Z. den Wert 4. Sollte die Schnittstelle erweitert werden, +so werden dort entsprechend höhere Werte zu finden sein. +
  +
product Hier findet sich eine Kennung für den tatsächlich +installierten Fontselektor. Diese Angabe ist jedoch nur als +zusätzliche Information gedacht und sollte von Anwendungsprogrammen, +die den Fontselektor aufrufen wollen, nicht ausgewertet +werden! +
  +
Bisher verwendete Kennungen: +
  +

+
+ + + + + + + + + + + + + + + + +
KennungFontselektor
CLVNCalvino
FSELFontSel
HUGOHuGo!
+
+ +
Die Kennung (wie auch die folgende Versionsnummer) wurde nur +für Programme eingeführt, die eine Information über den +installierten Fontselektor ausgeben wollen (z.B. das Programm +SysInfo). +
  +
version Die Versionsnummer des installierten Fontselektors als +BCD–Zahl (z.B. hexadezimal $100 für Version 1.00). Hier gelten +sinngemäß die Anmerkungen zum Feld `product'. +
  +
xfsl_input Dies ist der Einsprungpunkt für einen vereinfachten Aufruf des +Fontselektors. Der Fontselektor erscheint dann immer als modaler +Dialog und die meisten zusätzlichen Features der +xFSL–Schnittstelle können nicht angesprochen werden. +
  +
xfsl_init, xfsl_event, xfsl_exit Diese drei Funktionen bilden zusammen den erweiterten +Fontselektor–Aufruf. Hierüber können alle neuen Features +angesprochen werden. Die Vorgehensweise entspricht dem Darstellen +eines GEM-Dialogs: +
  + +
    +
  1. Fontselektor darstellen (xfsl_init) +
      +

  2. +
  3. Eventbehandlung in einer Schleife, bis OK oder +Abbruch angewählt wurde (xfsl_event) +
      +

  4. +
  5. Fontselektor vom Bildschirm entfernen (xfsl_exit +
      +

  6. +
+ +
xfsl_info Über diese Aufruf können einige der Features des +installierten Fontselektors abgefragt werden, z.B. +Drag&Drop–Unterstützung. +
  + +
+ +

15.14.1.2 Der vereinfachte Aufruf (xfsl_input)

+ +

xfsl_input ist der Einsprungpunkt für einen +vereinfachten Aufruf. Der Fontselektor kann darüber nur als modaler +Dialog aufgerufen werden. Außerdem kann eine Überschrift angegeben +und eingeschränkt werden, welche Arten von Fonts der Selektor zur +Auswahl stellen soll. +

+
+
int xfsl_input (int           vdihandle,
+                unsigned int  fontflags,
+                const char   *headline,
+                int          *id,
+                int          *size
+               );
+
+
+

Die Parameter im einzelnen: +

+ + + + + + + + + + + + + + + +
vdihandle Hier übergeben Sie das Handle einer von Ihrem Programm bereits +geöffneten virtuellen VDI–Workstation (wenn Sie in Ihrem +Programm einen Font einstellen wollen, müssen Sie ja ohnehin eine +solche VDI-Workstation öffnen). Der Fontselektor übernimmt dann +den auf dieser Workstation gerade eingestellten Font als aktuellen +Font (vorausgesetzt, er wird durch die Fontflags überhaupt zur +Auswahl gestellt). +
  +
Statt eines gültigen Handles können Sie aber auch einfach eine +Null übergeben, dann wird der Fontselektor den Font anzeigen, den Sie +in den Parametern `id' und `size' übergeben. +
  +
Wenn Sie ein VDI–Workstation–Handle übergeben, +wird der ausgewählte Font auf dieser Workstation auch gleich +eingestellt. +
  +
fontflags Über die Fontflags können Sie festlegen, welche Fonts +überhaupt zur Auswahl gestellt werden. +
  +
headline Hier können Sie eine Überschrift angeben, die dann im +Fontselektor erscheint. Fehlt die Überschrift (Übergabe von 0L), +dann wird ein Defaulttext (Fontauswahl o.ä.) eingesetzt. +
  +
id In dieser Variablen wird die ID des ausgewählten Zeichensatzes +zurückgeliefert (natürlich nur, wenn auch wirklich ein Zeichensatz +ausgewählt wurde). Dieser Zeichensatz kann nun direkt mit der +VDI-Funktion vst_font() eingestellt werden. +
  +
Wenn Sie in `vdihandle' eine Null übergeben, wird der +Fontselektor den in `id' angegebenen Font anzeigen. +
  +
size In dieser Variablen wird die Größe des ausgewählten Fonts in +Punkt zurückgegeben (auch nur, wenn wirklich ein neuer Zeichensatz +ausgewählt wurde). Wenn es sich um einen Bitmapfont handelt, kann +diese Größe mit der VDI–Funktion vst_point eingestellt +werden. Für Vektorfonts sollte die Funktion vst_arbpt aufgerufen +werden. +
  +
Wenn Sie in `vdihandle' eine Null übergeben, wird der +Fontselektor den in `id' angegebenen Font in der in +`size' angegebenen Größe anzeigen. +
  + +
+ +
+

Rückgaben +

+

xfsl_input liefert eine negative Zahl zurück, wenn ein +Fehler aufgetreten ist. Eine 0 wird zurückgegeben, wenn +Abbruch angewählt wurde. Wird eine 1 zurück geliefert, dann +wurde ein neuer Font ausgewählt. +

+

Die Rückgabewerte sind für alle xFSL–Funktionen gleich +und aufwärtskompatibel zu den Rückgabewerten des UFSL. +

+

15.14.1.3 Der erweiterte Aufruf

+

Der erweiterte xFSL–Aufruf besteht aus drei einzelnen +Funktionsaufrufen: +

+ + + + + + + + + +
xfsl_init Stellt den Fontselektor auf dem Bildschirm dar. Außerdem +werden hier die Parameter übergeben. +
  +
xfsl_event Diese Funktion wird solange immer wieder aufgerufen, bis im +Fontselektor ein Font ausgewählt, oder Abbruch angewählt +wurde. +
  +
xfsl_exit Entfernt den Fontselektor wieder vom Bildschirm. +
  + +
+ +
+

In C kann das dann beispielsweise so ausssehen: +

+
+
xhandle = xfsl->xfsl_init (vdihandle, &xpar);
+if (xhandle >= 0)
+{
+  do
+  {
+    ret = xfsl->xfsl_event (xhandle, 0L);
+    if (ret == xFS_HELP)
+      ...;  /* Hilfefunktion aufrufen */
+    else if (ret == xFS_POPUP)
+      ...;  /* Popup behandeln        */
+    else if (ret == xFS_EVENT)
+      ...;  /* AES-Event bearbeiten   */
+  } while ((ret != xFS_OK) && (ret != xFS_STOP));
+  xfsl->xfsl_exit (xhandle);
+}
+
+
+

Diese Dreiteilung hat u.a. den Vorteil, daß zur +Bearbeitung der Ereignisse (Hilfe–Button, Popup, +AES–Events) keine Zeiger auf Funktionen übergeben werden +müssen (was in einigen Programmiersprachen nur schwer zu realisieren +ist). Auch läßt sich die Schnittstelle so leicht um weitere +Ereignisse erweitern, falls dies einmal nötig sein sollte. +

+
15.14.1.3.1 xfsl_init
+

Dieser Aufruf bringt nicht nur den Fontselektor auf den +Bildschirm, er bestimmt auch, welche Fonts angezeigt werden sollen, ob +ein User–Popup verwendet wird und einiges mehr. +

+
+
int xsfl_init (int       vdihandle,
+               xFSL_PAR *xpar
+              );
+
+
+

Die beiden Parameter bedeuten: +

+ + + + + + +
vdihandle Hier übergeben Sie, wie schon beim vereinfachten Aufruf, das +Handle einer von Ihrem Programm bereits geöffneten virtuellen +VDI–Workstation oder einfach eine Null. +
  +
Wenn Sie ein gültiges Workstation–Handle übergeben, wird +der Fontselektor den auf dieser Workstation aktuellen Font übernehmen +und anzeigen — sofern er duch die Fontflags (in der +xFSL_PAR–Struktur) überhaupt zur Auswahl gestellt wird. +Ist dies nicht der Fall, wird der Fontselektor einen Font aus den zur +Verfügung stehenden auswählen und anzeigen. +
  +
Übergeben Sie als Workstation–Handle eine Null, dann wird +der Font aus der PFONTINFO–Struktur (auf die ein Zeiger +in der xFSL_PAR–Struktur zeigt) übernommen und +angezeigt. +
  +
Wenn Sie ein VDI–Workstation–Handle übergeben, wird +der ausgewählte Font auf dieser Workstation auch gleich eingestellt. +
  +
xpar Dies ist ein Zeiger (d.h. die Adresse) auf eine +xFSL_PAR–Struktur, die alle weiteren Angaben für den +Fontselektor enthält. +
  +
Wegen der Vielzahl der Möglichkeiten wurde dieser Struktur ein +eigener Abschnitt gewidmet. +
  + +
+ +

Für die Returncodes der Funktion gilt wieder: Ein negativer +Rückgabewert deutet auf einen Fehler hin. Positive Werte haben hier +eine etwas abweichende Bedeutung: Eine 0 heißt, der Fontselektor +wurde (erfolgreich) als modaler Dialog geöffnet. Andere positive +Werte entsprechen dem Fensterhandle des geöffneten Fontselektors. +Somit können Sie das Fenster des Fontselektors beispielsweise bei +einem AV–Server anmelden. +

+

Im Erfolgsfalle (Rückgabe größer oder gleich 0) sollten Sie +sich das Handle in einer Variablen merken, da es für die folgenden +Aufrufe (xfsl_event und xfsl_exit) noch benötigt +wird. +

+

Hinweis: Wenn der Fontselektor als Fenster dargestellt +werden sollte, xfsl_init aber den Fehler xFS_NO_WINDOW +liefert (kein Fenster mehr frei), dann sollte möglichst versucht +werden, den Fontselektor wenigstens als Dialog darzustellen +(Kontrollflag CC_WINDOW löschen und nochmals +xfsl_init aufrufen). +

+

Merke: Der Anwender will einen Fontselektor, keine +Fehlermeldung. +

+
15.14.1.3.2 xfsl_event
+

Wenn der Fontselektor initialisiert und auf den Bildschirm +gebracht wurde, übernimmt xfsl_event die Hauptarbeit. +

+
+
int xfsl_event (int    xhandle,
+                EVENT *event
+               );
+
+
+

Die beiden Parameter bedeuten: +

+ + + + + + +
xhandle Das Handle des Fontselektors, wie es von xfsl_init +geliefert wurde. +
  +
event Zeiger auf eine EVENT–Struktur, wie sie von Pure +C verwendet wird. In dieser Struktur liefert der Fontselektor +AES–Events zurück, die er nicht selbst bearbeiten konnte. +Außerdem können Sie über die Eingabeparameter dem Fontselektor auch +mitteilen, über welche Ereignisse sie überhaupt unterrichtet werden +wollen. +
  +
Der Zeiger kann aber auch einfach Null sein, wenn Sie keine +(weiteren) Events auswerten wollen. Soll der Fontselektor als +Fensterdialog betrieben werden und der Aufrufer (d.h. Ihr Programm) +hat noch weitere Fenster offen, dann müssen Sie aber zumindest die +Redraw–Meldungen auswerten! +
  +
Beispiel: Wenn Sie in `ev_mflags' das Flag +MU_MESAG setzen, wird der Fontselektor alle eintreffenden +AES–Nachrichten, die er nicht selbst bearbeiten kann, an den +Aufrufer zurückliefern. +
  +
Hinweis: Es ist natürlich auch möglich, +Timer–Events zu bekommen. Diese sollten aber sparsam eingesetzt +werden und nicht zu kurz sein, da der Fontselektor dazu jedesmal erst +seine eigene Event–Schleife verlassen muß. 250 ms mögen als +— unverbindliche — untere Grenze gelten. +
  + +
+ +

Die möglichen Rückgabewerte von xfsl_event: +

+ + + + + + + + + + + + + + + + + + +
xFS_STOP Im Fontselektor wurde der Button Abbruch oder (so +vorhanden) der Closer des Fensterdialogs angewählt. +
  +
Wenn das Kontrollflag CC_CLOSER gesetzt ist und der +Closer angeklickt wurde, enthält die +PFONTINFO–Struktur, auf die der Zeiger in der +xFSL_PAR–Struktur zeigt, aber trotzdem Angaben darüber, +welcher Font zuletzt im Fontselektor angewählt worden war. Anders +wäre diese Information sonst ja nicht zu erhalten. +
  +
xFS_OK Es wurde ein Font ausgewählt und OK angewählt. Welcher +Font ausgewählt wurde, beschreibt die +PFONTINFO–Struktur, auf die der Zeiger in der +xFSL_PAR–Struktur zeigt. Wenn bei xfsl_init ein +gültiges VDI–Handle übergeben wurde, dann wird der +ausgewählte Font auch gleich auf dieser VDI–Workstation +eingestellt. +
  +
xFS_HELP Der Hilfe–Button wurde angewählt (kann natürlich nur +auftreten, wenn Sie ihn haben einblenden lassen). Es liegt nun am +Aufrufer, wie er darauf reagiert. Im Normalfall wird man wohl eine +Hilfe geben, z.B. indem man eine Hilfsseite anzeigt oder anzeigen +läßt. +
  +
xFS_EVENT Ein AES–Event ist aufgetreten, den der Fontselektor +nicht bearbeiten konnte (z.B. eine Redraw–Meldung für ein +anderes Fenster). Welcher Event es genau war, können Sie dem Feld +`ev_mwich' der EVENT–Struktur entnehmen. +
  +
Accessories sollten bei Eintreffen der Nachricht +AC_CLOSE den Aufruf von xfsl_exit nicht vergessen! +Gleiches gilt analog für die Nachricht AP_TERM. +
  +
xFS_POPUP Am User–Popup (sofern vorhanden) wurde ein Veränderung +vorgenommen. Bei dem Popup–Eintrag, der geändert wurde, ist im +Element `fontflags' das Bit FF_CHANGED gesetzt. Der +Popup–Eintrag, der jetzt angewählt wurde und bei Rückkehr in +den Fontselektor (beim nächsten xfsl_event–Aufruf) der +aktuelle des Popups sein wird, steht im Element `sel_entry'. +
  +
Sie haben jetzt noch die Möglichkeit, Änderungen an den +Popup–Einträgen vorzunehmen, beispielsweise die Fontflags zu +ändern oder den geänderten Font in alle anderen Popup-Einträge zu +übernehmen (auf diese Weise ist es auch möglich, das Popup für +eine andere Information zu verwenden, die mit den ausgewählten Fonts +nichts zu tun hat). Die Texte und die Anzahl der Popup-Einträge +dürfen aber nicht verändert werden! +
  +
andere Werte: Andere positive Werte sollten ignoriert werden. Es ist +möglich, daß die Schnittstelle um weitere Rückgabewerte +(Ereignisse) erweitert wird. +
  +
Negative Werte zeigen einen Fehler an, der Fontselektor sollte +dann abgebrochen werden. Dazu muß aber unbedingt noch +xfsl_exit aufgerufen werden! +
  + +
+ +
15.14.1.3.3 xfsl_exit
+

Mit dem xfsl_exit–Aufruf wird der Fontselektor +wieder vom Bildschirm entfernt: +

+
+
void xfsl_exit (int xhandle);
+
+
+

Dabei ist `xhandle' wieder das Handle des Fontselektors, +wie es von xfsl_init geliefert wurde. +

+

xfsl_exit muß immer dann aufgerufen werden, wenn die +Behandlung des Fontselektors beendet werden soll. Sei es dadurch, daß +ein Font ausgewählt oder Abbruch angewählt wurde, oder daß +xfsl_event einen Fehler meldete. Wenn schon der +xfsl_init–Aufruf fehlgeschlagen ist, darf +xfsl_exit nicht aufgerufen werden (logisch, da man ja auch +kein gültiges Handle hat). +

+

Der Aufruf von xfsl_exit sollte auch bei Eintreffen der +Nachrichten AC_CLOSE und AP_TERM nicht vergessen werden! +

+
15.14.1.3.4 Der Info–Aufruf (xfsl_info)
+ +

Über diesen Aufruf können einige der Features des +installierten Fontselektors abgefragt werden: +

+
+
long xfsl_info (void);
+
+
+

Wenn der Rückgabewert positiv ist, dann stehen die folgenden +Flags für vorhandene Features (negative Rückgabewerte sind, wie +üblich, Fehlermeldungen): +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameWertBedeutung
XF_SIZE0x0001Größenänderung möglich
XF_COLOR0x0002Farbänderung möglich
XF_ATTR0x0004Attributänderung möglich
XF_WIDTH0x0008Breitenänderung möglich
XF_KERN0x0010Kerningänderung möglich
XF_SKEW0x0020Neigungsänderung möglich
XF_ALIGN0x0040Änderung der Ausrichtung möglich
XF_ROTATION0x0080Textrotation möglich
XF_FIX310x0100fix31-Unterstützung
XF_POPUP0x0200Popup-Unterstützung
XF_DRAGDROP0x0400Drag&Drop-Unterstützung
XF_MAPPING0x0800beherrscht Mapping
+
+ +

Weitere Features des Fontselektors lassen sich indirekt über +das Element `control' der xFSL_PAR–Struktur +abfragen: Bei einem erfolgreichen xfsl_init–Aufruf +werden diejenigen Kontrollflags gelöscht, die der Fontselektor nicht +kennt. +

+
15.14.1.3.5 Die VDI–Workstation
+

Bei den Aufrufen xfsl_input und xfsl_init kann +jeweils das Handle einer vom Aufrufer bereits geöffneten virtuellen +VDI–Workstation übergeben werden. Davon, ob man tatsächlich +ein Handle einer Workstation oder einfach eine Null übergibt, hängt +das weitere Verhalten des Fontselektors ab: +

+

Übergibt man ein gültiges Handle, so wird der Fontselektor +versuchen, den auf der entsprechenden Workstation gerade aktuellen +Font zu ermitteln und diesen dann — sofern er zu den +übergebenen Fontflags paßt — auch einstellen und zur Auswahl +anbieten. Paßt der aktuelle Font nicht zu den Fontflags (wenn z.B. +nur Vektorfonts angeboten werden sollen, der aktuelle Font aber ein +Bitmapfont ist), so wird der Fontselektor einen Font aus den +tatsächlich angebotenen auswählen und als aktuellen Font +präsentieren. +

+

Wählt der Anwender nun einen Font aus und beendet den +Fontselektor mit OK, so wird dieser Font auch gleich auf der +übergebenen Workstation eingestellt, so daß das aufrufende Programm +dies nicht mehr übernehmen muß. +

+

Dabei gilt es zu beachten, daß der Fontselektor ebenfalls eine +eigene VDI–Workstation öffnet und diese intern und zur +Auswahl der Fonts verwendet. U.a. wird er für diese Workstation auch +vst_load_fonts() aufrufen (sofern ein GDOS installiert ist). +Dies kann zu unerwarteten Resultaten führen, wenn auf der +übergebenen Workstation noch kein vst_load_fonts() aufgerufen +wurde und der Anwender im Fontselektor einen Font auswählt, der erst +nach einem vst_load_fonts()–Aufruf zur Verfügung steht! +

+
+

Statt eines Workstation–Handles kann man aber auch einfach +eine Null übergeben. Der Fontselektor wird den aktuellen Font dann +aus den übergebenen Parametern (beim xfsl_input–Aufruf) +bzw. aus der xFSL_PAR–Struktur (beim +xfsl_init–Aufruf) ermitteln. +

+

Der ausgewählte Font wird dann (logischerweise) auch nur in den +Parametern bzw. der xFSL_PAR–Struktur zurückgegeben und +der Aufrufer muß ihn dann selbst einstellen. +

+
15.14.1.3.6 Die xFSL_PAR-Struktur
+ +

Über diese Struktur haben Sie weitgehenden Einfluß auf das +Verhalten des Fontselektors und die Art der dargestellten Fonts. Daher +fällt die Beschreibung der Möglichkeiten auch etwas länger aus +… +

+
+
typedef struct
+{
+ int            par_size;    /* Größe der xFSL_PAR-Struktur   */
+ int            pfi_size;    /* Größe der PFONTINFO-Struktur  */
+ unsigned long  control;     /* Kontrollflags                 */
+ const char    *headline;    /* Überschrift oder 0L           */
+ const char    *example;     /* Beispieltext oder 0L          */
+ const char    *helptext;    /* Text des Hilfe-Buttons od. 0L */
+ PFONTINFO     *font;        /* Zeiger auf Fontinfo-Struktur  */
+ unsigned int   fontflags;   /* erlaubte Fontarten            */
+ const char    *poptext;     /* Text vor dem Popup oder 0L    */
+ int            num_entries; /* Anzahl der Einträge (0..n)    */
+ int            sel_entry;   /* Selektierter Eintrag (0..n-1) */
+ xFSL_PENTRY   *popup;       /* Zeiger auf ein Popup oder 0L  */
+ char          *helpinfo;    /* Zeiger auf Hilfedatei/-seite  */
+} xFSL_PAR;
+
+
+

Trotz der Vielzahl der Einträge ist eigentlich alles ganz +einfach, zumal Sie Felder, die Sie nicht benötigen oder deren +Bedeutung Ihnen noch nicht klar ist, einfach mit Null ausfüllen +können, worauf der Fontselektor dann sinnvolle Defaultwerte annehmen +wird. +

+

Die Felder im einzelnen: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
par_size Dieses Feld darf nicht auf Null gesetzt werden, hier wird die +Größe der xFSL_PAR–Struktur in Bytes eingetragen, +weshalb man in C einfach schreiben kann +
  +
+
xpar.par_size=sizeof(xFSL_PAR);
+
+
+
Die Größe der Struktur beträgt z.Z. 42 Bytes. Sollte die +Struktur erweitert werden, kann der Fontselektor an der Größenangabe +erkennen, ob er es mit einer neuen oder einer alten Struktur zu tun +hat. +
  +
pfi_size Auch dieses Feld darf nicht Null sein, hier muß die Größe +der PFONTINFO–Struktur eingetragen werden, also +
  +
+
xpar.pfi_size=sizeof(PFONTINFO);
+
+
+
Die aktuelle Größe der PFONTINFO–Struktur +beträgt 38 Bytes und könnte ebenfalls in Zukunft erweitert werden. +
  +
control Dies sind die sogenannten Kontrollflags, über die das +Verhalten des Fontselektors beeinflußt werden kann (z.B. ob er als +Fenster oder als Dialog erscheinen soll). +
  +
Diesen Flags wurde ein eigener Abschnitt gewidmet. +
  +
headline Dies ist, wie schon vom einfachen Aufruf her bekannt, ein +Zeiger auf eine Überschrift für den Fontselektor. Fehlt diese (d.h. +`headline' enthält Null), dann wird der Fontselektor eine +Default–Überschrift einsetzen. +
  +
Die Länge der Überschrift sollte sich in dem noch vom UFSL +vorgegebenen Rahmen (34 Zeichen) bewegen, der Fontselektor wird +längere Überschriften aber ggfs. kürzen. +
  +
example Ein Zeiger auf einen Beispieltext. Der Fontselektor zeigt für +den jeweils eingestellten Font ein Schriftbeispiel an, dessen Text +hiermit vorgegeben werden kann. Fehlt dieser Text (d.h. +`example' enthält Null), wird der Fontselektor einen +Defaulttext anzeigen (z.B. den Namen des jeweiligen Zeichensatzes). +
  +
helptext Dies ist der Text für einen Button, der links unten im +Fontselektor eingeblendet werden kann. Im Normalfall wird man dort +einen Button mit der Aufschrift Hilfe oder Help +einblenden wollen, um dem Anwender die Funktion des Fontselektors zu +erklären, und wofür der ausgewählte Font verwendet wird. +
  +
Fehlt dieser Text (d.h. `helptext' enthält Null), wird +auch kein Hilfe-Button eingeblendet. Dann wird xfsl_event auch +nicht den Rückgabewert xFS_HELP liefern. +
  +
Man sollte einen kurzen Text wählen (etwa 8 Zeichen), der +Fontselektor wird längere Texte aber ggfs. kürzen. +
  +
font Dies ist ein Zeiger auf eine Struktur (PFONTINFO), die +einen Font beschreibt. Die Struktur wird sowohl zur Übergabe von +Werten an den Fontselektor als auch zur Rückgabe des ausgewählten +Fonts verwendet. +
  +
Auch dieser Struktur ist ein eigener Abschnitt gewidmet. +
  +
fontflags Dies sind wieder die vom einfachen Aufruf bekannten Fontflags, +mit denen Sie die zur Auswahl gestellten Fonts beeinflußen können. +
  +
poptext, num_entries, sel_entry, popup: Mit diesen vier Parametern können Sie ein zusätzliches Popup +in den Fontselektor einblenden lassen. Wegen der vielfältigen +Möglichkeiten gibt's dafür auch wieder einen eigenen Abschnitt. +
  +
Wollen Sie kein Popup, so setzen Sie diese vier Werte einfach +auf Null. +
  +
helpinfo Dies ist ein reiner Ausgabeparameter: Wenn der +Hilfe–Button angewählt wurde (sofern vorhanden, siehe +`helptext'), dann steht hier ein Zeiger auf einen Dateinamen +einer Hilfedatei und den Namen einer Seite, die angezeigt werden kann. +Der Dateiname wird ohne Pfad und Extension angegeben, der Seitenname +folgt direkt dahinter, durch ein Komma getrennt. +
  +
+Der String darf nur gelesen, aber nicht verändert werden! +
  +
+
Wenn Sie bei xFS_HELP nicht selbst eine Hilfe anzeigen +wollen, dann können Sie mit diesen Informationen ein Hilfesystem +(z.B. ST–Guide) aufrufen. +
  +
Beispiel: xfsl_event gibt xFS_HELP +zurück, in `helpinfo' findet sich ein Zeiger auf den String +
  +
+
toll,Der tollste Fontselektor aller Zeiten
+
+
+
Daraus läßt sich dann folgender Aufruf für ST-Guide +erstellen: +
  +
+
*:\toll.hyp Der tollste Fontselektor aller Zeiten
+
+
+
Man hängt also an den Dateinamen die Extension für das +jeweilige Hilfesystem an und übergibt den Teil nach dem ersten Komma +als Seitenname. +
  + +
+ +
+

Um es nochmals zu betonen: Felder, die sie nicht benötigen oder +noch nicht verstehen, können Sie zunächst einfach auf Null setzen. +Ausnahmen sind nur +

+
    +
  • `par_size', die Größe der +xFSL_PAR–Struktur selbst +
      +

  • +
  • `pfi_size', die Größe der +PFONTINFO–Struktur +
      +

  • +
  • `font', der Zeiger auf die +PFONTINFO–Struktur +
      +

  • +
+ +
15.14.1.3.7 Die Kontrollflags
+

Über die Kontrollflags kann das Verhalten des Fontselektors +beeinflußt werden. +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameWertBedeutung
CC_WINDOW0x0001Fontselektor als Fenster
CC_APPMODAL0x0002Fontselektor ist applikationsmodal
CC_FIX310x0004alle Größenangaben in 1/65536 Punkt
CC_FAKESTYLE0x0008Schnitte simulieren (nur Bitmapfonts)
CC_CLOSER0x0010Fenster mit Closer, kein OK-Button
CC_NOSIZE0x0100Größe nicht ändern
CC_NOCOLOR0x0200Farbe nicht ändern
CC_NOATTR0x0400Attribute nicht ändern
CC_NOWIDTH0x0800Breite nicht ändern
CC_NOKERN0x1000Kerning nicht ändern
CC_NOSKEW0x2000Skewing nicht ändern
CC_NOALIGN0x4000Ausrichtung nicht ändern
CC_NOROTATION0x8000Textrotation nicht ändern
CC_DFLTSIZE0x10000Schriftgröße "Default"
CC_INVSTYLE0x20000Attribut "Invers"
+
+ +

Die Funktion der einzelnen Flags sollte sich schon aus den Namen +und den Kurzbeschreibungen ergeben. Hier noch einige Anmerkungen: +

+
    +
  • CC_APPMODAL +
    Applikationsmodal heißt, daß das Programm in einen Modus +versetzt wird, in dem nur noch der Fontselektor bearbeitet werden +kann. Im wesentlichen bedeutet das, daß der Fontselektor alle +WM_TOPPEDNachrichten für andere Fenster des +aufrufenden Programms abfängt und nicht weiterleitet, sondern +sich stattdessen selbst zum obersten Fenster macht. Damit soll dem +Anwender signalisiert werden, daß er zuerst den Fontselektor +bearbeiten soll, bevor er eine andere Aktion im Programm auslösen +kann. +
      +
    Der Aufrufer sollte in diesem Modus natürlich darauf +verzichten, eigene Fenster selbst mit wind_set(WF_TOP) zum +obersten Fenster zu machen. +
      +

  • +
  • CC_FAKESTYLE +
    Dies ist eine Spezialität, die z.Z. nur Calvino anbietet: Bei +denjenigen Bitmapfonts, bei denen keine leichten, kursiven bzw. fetten +Schnitte vorliegen, werden die jeweils fehlenden Schnitte mit der +VDI–Funktion vst_effects() simuliert. +
      +

  • +
  • CC_CLOSER +
    Wenn dieses Flag und CC_WINDOW gesetzt sind, wird der +Fontselektor mit einem Closer versehen, während der OK– und der +Abbruch–Button versteckt werden. Gedacht ist dies für die +Fälle, in denen der Fontselektor als reiner +Drag&Drop–Selektor eingesetzt werden soll. +
      +

  • +
  • CC_NO... +
    Über diese Flags kann bestimmt werden, welche Einstellungen nicht +verändert werden sollen. Beispielsweise könnte ein Programm +verhindern wollen, daß die Größe eines Zeichensatzes geändert +wird, während eine Änderung des Fonts selbst ermöglicht werden +soll. Dann muß der Aufrufer nur das Flag CC_NOSIZE setzen. +
      +
    Beachten Sie aber, daß Sie trotz gesetztem +CC_NO...–Flag immer einen gültigen Wert übergeben +müssen. Die Bedeutung dieser Flags ist also, daß die vorgegebenen +Werte nicht verändert werden können und nicht, daß die Werte nicht +von Interesse sind. +
      +

  • +
+ +

Bitte beachten: Nicht alle Fontselektoren unterstützen +auch alle Kontrollflags! Wenn ein Fontselektor ein Flag nicht +unterstützt, so wird er es einfach ignorieren. Bei einem +erfolgreichen(!) xfsl_init-Aufruf wird der Fontselektor +diejenigen Flags im Element `control' der +xFSL_PAR-Struktur löschen, die er nicht versteht. +

+
15.14.1.3.8 Die PFONTINFO-Struktur
+ +

Diese Struktur beschreibt einen Font. Sie enthält nach dem +Aufruf des Fontselektors den ausgewählten Font. Zudem werden diese +Angaben vom Fontselektor schon beim Aufruf ausgewertet (und der so +beschriebene Font angezeigt), wenn als VDI–Handle eine Null +übergeben wird. +

+
+
typedef struct
+{
+ int          fontid;     /* ID des Fonts                  */
+ int          fonttype;   /* Typ des Fonts                 */
+ char        *fontname;   /* Name des Fonts                */
+ union fsize  fontsize;   /* Fontgröße in pt oder fix31    */
+ union fsize  fontwidth;  /* Breite in pt oder fix31       */
+ char         trackkern;  /* Track-Kerning                 */
+ char         pairkern;   /* Paar-Kerning                  */
+ int          fontattr;   /* Attribute                     */
+ int          fontskew;   /* Neigung                       */
+ int          fontcol;    /* Farbe                         */
+ int          backcol;    /* Text-Hintergrundfarbe         */
+ int          halign;     /* horizontale Textausrichtung   */
+ int          valign;     /* vertikale Textausrichtung     */
+ int          rotation;   /* Textrotation in 1/10 Grad     */
+ int          validtype;  /* Typ (V_CHAR_...) oder Mapping */
+ int         *validchars; /* benötigte Zeichen oder 0L     */
+} PFONTINFO;
+
+
+

Die Elemente im einzelnen: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
fontid Die ID des Fonts, wie sie auch von der VDI–Funktion +vqt_name() zurückgegegeben wird. Die Font–ID ist eine +Zahl ungleich Null (kann also auch negativ sein). +
  + + + + +
fonttype Der Typ des Fonts, wie er ab Speedo 5 bzw. NVDI 3 verwendet +wird: +
  + +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameWertFontart
BITMAP_FONT0x0001Pixel
SPEEDO_FONT0x0002Speedo
TT_FONT0x0004TrueType
PFB_FONT0x0008Type 1 (Postscript)
+
+ +
Diese Angaben sind z.Z. nur zur Information, aber ohne Bedeutung +für den Fontselektor. Allerdings wird es künftig möglich sein, +einen Font nicht nur anhand seiner ID, sondern auch anhand seines +Namens zu setzen, wobei dann noch zusätzlich der Fonttyp benötigt +wird. +
  +
Der Fonttyp ist aber auch von Interesse, wenn man die Größe +des Fonts ändern will: Bei Bitmapfonts geschieht dies mit der +VDI–Funktion vst_point(), bei allen anderen Typen +(Vektorfonts) mit der Funktion vst_arbpt(). +
  +
fontname Der Name des Fonts, wie er von vqt_name() geliefert +wurde (möglicherweise wurden mehrfache Leerzeichen entfernt). +
  +
Der Aufrufer muß selbst genügend Platz für den Fontnamen zur +Verfügung stellen, also für 32 Zeichen und ein Nullbyte! Wenn Sie +den Fontnamen nicht benötigen, können Sie den Zeiger auch einfach +auf Null setzen. +
  +
fontsize Die Größe des Fonts in Punkt (pt) oder 1/65536 Punkt (Typ +fix31): +
  +
+
union fsize
+{
+ int   size;    /* Fontgröße in Punkt         */
+ fix31 size31;  /* Fontgröße in 1/65536 Punkt */
+};
+
+
+
Welche der beiden Angaben gültig ist, wird global über das +Kontrollflag CC_FIX31 geregelt. +
  +
fontwidth Breite des Fonts in Punkt (pt) oder 1/65536 Punkt (Typ +fix31): +
  +
+
union fsize
+{
+ int   size;    /* Fontgröße in Punkt         */
+ fix31 size31;  /* Fontgröße in 1/65536 Punkt */
+};
+
+
+
Welche der beiden Angaben gültig ist, wird global über das +Kontrollflag CC_FIX31 geregelt. +
  +
Die Breite kann mit den VDI–Funktionen vst_width() +in Punkt und mit vst_setsize() in fix31 eingestellt +werden. +
  + +
trackkern Dieser Parameter gibt die Art des Track–Kernings für +vst_kern() an. Gültige Werte sind: +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
WertKerning
0kein Kerning
1normales Kerning
2enges Kerning
3sehr enges Kerning
+
+ +
pairkern Mit diesem Parameter kann das Pair–Kerning aus– (0) +oder eingeschaltet (1) werden, vgl. vst_kern(). +
  +
fontattr Dies sind die Fontattribute (Texteffekte), wie sie auch von der +VDI–Funktion vst_effects() verwendet werden. +
  +
Calvino verwendet dieses Feld nur dann, wenn das Kontrollflag +CC_FAKESTYLE gesetzt ist. +
  +
fontskew Die Neigung des Fonts in 1/10 Grad, vgl. vst_skew(). +
  +
fontcol Die Farbe des Fonts. Es werden die VDI–Farben verwendet, +d.h. 0 = Weiß, 1 = Schwarz, usw., vgl. vst_color(). +
  +
backcol Die Hintergrundfarbe des Textes. Es werden die +VDI–Farben verwendet, d.h. 0 = Weiß, 1 = Schwarz, usw. Das +Setzen einer Text–Hintergrundfarbe wird vom VDI nicht direkt +unterstützt, es obliegt daher dem Aufrufer, ob und wie dieser +Parameter verwendet wird. +
  + + +
halign Hierüber kann die horizontale Textausrichtung angegeben +werden: Der Text soll linksbündig, rechtsbündig oder zentriert +ausgegeben werden. +
  + + + +

+
+ + + + + + + + + + + + + + + + + + + + +
NameWertAusrichtung
THA_LEFT0linksbündig
THA_CENTER1zentriert
THA_RIGHT2rechtsbündig
+
+ +
Diese Werte entsprechen dem Parameter für die horizontale +Ausrichtung beim VDI–Aufruf vst_alignment(). +
  +
valign Hierüber kann die vertikale Textausrichtung angegeben werden: +Der Text soll an der Oberkante oder der Unterkante ausgerichtet oder +(vertikal) zentriert ausgegeben werden. +
  + + + +

+
+ + + + + + + + + + + + + + + + + + + + +
NameWertAusrichtung
TVA_BOTTOM0an der Text-Unterkante
TVA_CENTER1vertikal zentriert
TVA_TOP2an der Text-Oberkante
+
+ +
Diese Werte entsprechen absichtlich nicht dem Parameter +zur vertikalen Ausrichtung bei vst_alignment()! Die dort +verwendeten Werte (Zeichenunterkante, +Zeichenzellenunterkante) sind für den normalen Anwender wenig +intuitiv und sollten daher nicht Teil des User–Interfaces sein +(was sie bei der Auswahl im Fontselektor aber wären). Die Ausrichtung +muß daher vom aufrufenden Programm in die richtigen Werte +konvertiert werden. +
  + + +
rotation Textrotation in 1/10 Grad, wie sie auch von der +VDI–Funktion vst_rotation() verwendet wird. +
  + +
+ +
+

Fehlen noch die beiden Parameter `validtype' und +`validchars': +

+

Manchmal ist es wichtig, sicherzustellen, daß der Font +bestimmte Zeichen enthält. Dafür gibt es zwei Möglichkeiten: +

+

Wenn `validchars' Null ist, kann man mit +`validtype' eine der folgenden vier Gruppen von Zeichen +auswählen: +

+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameWert Bereich Kommentar
V_CHAR_IND-1-"egal"
V_CHAR_ASC-232-126alle druckbaren ASCII-Zeichen
V_CHAR_PRT-332-255alle druckbaren Zeichen
V_CHAR_ALL-40-255wirklich alle Zeichen
+
+ +

Diese vier Gruppen dürften die häufigsten Anwendungsfälle +abdecken. +

+

Wenn sowohl `validtype' als auch `validchars' +Null sind, wird der Fontselektor dies wie V_CHAR_IND +behandeln, ebenso bei anderen ungültigen Werten in +`validtype'. +

+
+

Wenn die vier Gruppen einmal nicht ausreichen, so kann man +stattdessen über `validtype' und `validchars' auch +genauer angeben, welche Zeichen benötigt werden: +

+ + + + + + + +
validtype enthält dann einen Wert für das vom GDOS zu verwendende +Mapping (vgl. vst_charmap()). +
  +
Die freie Wahl des Mappings steht nur mit einem entsprechenden +GDOS (SpeedoGDOS oder NVDI ab Version 3) zur Verfügung. Z.Z. sind +folgende Mappings definiert: +
  + + +

+
+ + + + + + + + + + + + + + + +
NameWertBedeutung
MAP_DIRECT0"direktes Mapping"
MAP_ASCII1ASCII-Mapping (Default)
+
+ +
Wenn das GDOS kein Mapping beherrscht, wird der Fontselektor nur +MAP_ASCII akzeptieren, alle anderen Mappings werden dann +ignoriert und ein Test auf Vorhandensein bestimmter Zeichen wird +nicht durchgeführt. +
  +
validchars ist ein Zeiger auf ein Array von Integers (Words), über das +angegeben werden kann, welche Zeichen der Font unbedingt enthalten +soll. +
  +
Das Array besteht aus einer Folge von +Von–Bis–Paaren: +
  +
    +
  • zwei aufeinanderfolgende Werte geben einen Bereich +(von–bis) an +
      +

  • +
  • einzelne Zeichen werden durch Verdopplung angegeben +
      +

  • +
  • das Ende der Liste wird durch ein Von–Bis–Paar +angegeben, bei dem `bis' kleiner ist als `von' +
      +

  • +
+ +
Beispiel: Es sollen nur Fonts angeboten werden, die alle +druckbaren ASCII–Zeichen sowie die deutschen Umlaute enthalten. +
  +
+xFSL_PAR xpar; +
int chars[] = { ' ', ' ', /* ASCII 32..126 */ +
'ä','ä', 'ö','ö', 'ü','ü', +
'Ä','Ä', 'Ö','Ö', 'Ü','Ü', 'ß','ß', +
1,0 /* Ende der Liste */ +
}; +
+
xpar.font->validtype=MAP_ASCII; +
xpar.font->validchars=chars; +
  +
+ +
+ +

Zukünftige GDOSse werden wahrscheinlich weitere Mappings +unterstützen (BICS, Unicode, …). Durch die verwendete +Codierung wird der Fontselektor auch diese korrekt beherrschen: Das in +`validtype' übergebene Mapping wird einfach eingestellt und +dann das Vorhandensein der Zeichen aus `validchars' +abgetestet. +

+

Anmerkung: Die diversen Möglichkeiten mit den +Parametern `validtype' und `validchars' sollten +sparsam und mit Bedacht verwendet werden, da das notwendige Testen der +Zeichen je nach GDOS recht lange dauern kann. +

+
15.14.1.3.9 Das User-Popup
+

Für das benutzerdefinierte Popup (kurz User-Popup) existieren +die folgenden Felder in der xFSL_PAR–Struktur: +

+ + + + + + + + + + + + +
poptext Zeiger auf einen Text, der vor dem Popup erscheinen soll oder +0L. Dem Fontselektor steht es frei, diesen Text zu ignorieren. +
  +
num_entries Anzahl Einträge (d.h. Zeilen) im Popup. Steht hier eine Null, +so wird kein Popup angezeigt. Es sollten nicht mehr als 16 Einträge +verwendet werden, auch wenn einzelne Fontselektoren u.U. auch mehr +Einträge unterstützen. +
  +
sel_entry Der selektierte Eintrag im Popup (gezählt wird ab 0). Der +Fontselektor legt hier die Nummer des angewählten Popup-Eintrags ab +und liest den Wert bei jedem Aufruf von xfsl_event wieder neu +aus. Somit können Sie den Fontselektor z.B. auch zwingen, statt dem +angewählten Eintrag Nummer 3 den mit der Nummer 5 zu aktivieren (bei +xFS_POPUP meldet der Fontselektor nur, welcher Eintrag +angewählt wurde, aktiviert wird dieser erst beim Rücksprung in den +Fontselektor). +
  +
popup Dies ist ein Zeiger auf ein Array von +xFSL_PENTRY-Elementen. An der angegebenen Adresse müssen +genau so viele Elemente stehen, wie in `num_entries' angegeben +wurden. +
  + +
+ + +

Ein Eintrag im Popup ist wie folgt aufgebaut: +

+
+
typedef struct
+{
+ char         *entry;      /* Text des Popup-Eintrags       */
+ PFONTINFO    *fontinfo;   /* Zeiger auf Fontinfo-Struktur  */
+ unsigned int  fontflags;  /* erlaubte Fontarten            */
+ long          funcflags;  /* Funktionsflags, nur für HuGo! */
+} xFSL_PENTRY;
+
+
+

Die Bedeutung der Elemente dieser Struktur sollte nach den +vorangegangenen Ausführungen klar sein. Die Funktionsflags +entsprechen den Kontrollflags, bis auf die Flags, die das globale +Verhalten des Fontselektors beeinflußen (CC_WINDOW etc.). +Diese werden hier ignoriert. +

+

Wichtig: Der Zeiger auf die +PFONTINFO–Struktur darf nicht Null sein! +

+

Wenn der Text eines Eintrags mit einem `-' beginnt, wird +der entsprechende Eintrag disabled (in heller Schrift und nicht +anwählbar) dargestellt. Dies ist in erster Linie für Trennlinien +zwischen den Einträgen gedacht. +

+
+

Verwendung +

+

Im Prinzip kann man drei Einsatzgebiete für das User-Popup +sehen: +

+ +
    +
  1. Jeder Popup-Eintrag stellt den Font für einen bestimmten +Programmteil ein. Beispielsweise könnte man in einem bestimmten +Fenster eines Programms nur nicht–proportionale Fonts zulassen +wollen, in einem anderen keine Vektorfonts, in einem dritten alle +Fonts. +
      +

  2. +
  3. Jeder Eintrag stellt eine gewisse Gruppe von Fonts zur +Verfügung. Braucht man beispielsweise oft Vektorfonts, könnte ein +Popup mit den Einträgen nur Vektorfonts und alle Fonts +konstruiert werden. +
      +

  4. +
  5. Das Popup kann aber auch für etwas ganz anderes verwendet +werden. Man könnte hier noch eine Information unterbringen, die zwar +nichts mit Fonts, aber mit dem Fenster zu tun hat, für das man einen +Font einstellen will. Beispielsweise könnte für ein +Consolen–Fenster die Art, wie inverse Zeichen darzustellen sind, +in Form eines Popups mit den Einträgen invers, fett, +unterstrichen zur Auswahl angeboten werden. +
      +
    Will man das Popup so zweckentfremden, so muß man bei der +Meldung xFS_POPUP den geänderten Font (der sich am gesetzten +FF_CHANGED–Flag erkennen läßt) in alle anderen +Popup-Einträge übertragen, da sich sonst der im Fontselektor +angezeigte Font ändern würde! +
      +

  6. +
+ +

15.14.1.4 Die Fontflags

+

Über die Fontflags können die zur Auswahl gestellten Fonts +eingeschränkt werden: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameWertBedeutung
FF_SYSTEM0x0001Systemfont (zusätzlich) anzeigen
FF_MONOSPACED0x0002monospaced Fonts anzeigen
FF_PROPORTIONAL0x0004proportionale Fonts anzeigen
FF_BITMAP0x0008Bitmapfonts anzeigen
FF_SPD0x0010Speedofonts anzeigen
FF_TTF0x0020TrueType-Fonts anzeigen
FF_PFB0x0040Type-1-Fonts anzeigen
FF_CFN0x0080Calamusfonts anzeigen (n.i.)
FF_VECTOR0x00F0alle Vektorfonts anzeigen
FF_ALL0x00FEalle Fonts anzeigen
FF_CHANGED0x8000Änderung erfolgt (nur im Popup)
+
+ +

Die Werte sind so gewählt, daß die einzelnen Flags miteinander +verodert werden können. Setzt man für die Fontflags also +beispielsweise FF_MONOSPACED|FF_VECTOR ein, so werden nur +unproportionale Vektorfonts zur Auswahl gestellt. +

+

Zudem gilt: +

+
    +
  • FF_SYSTEM hat Vorrang, d.h. wenn dieses Flag gesetzt +ist, wird der Systemfont auf jeden Fall mit zur Auswahl gestellt. +
      +

  • +
  • Wenn FF_SYSTEM nicht gesetzt ist, wird der Systemfont +genau dann zur Auswahl gestellt, wenn seine Eigenschaften den +gesetzten Flags entsprechen. +
      +

  • +
  • Wenn weder FF_MONOSPACED noch FF_PROPORTIONAL +gesetzt sind, werden die Fontflags so behandelt, als seien beide Flags +gesetzt. +
      +
    Dies gilt analog für FF_VECTOR und FF_BITMAP. +
      +

  • +
  • Wenn FF_VECTOR gesetzt wird, werden automatisch alle +Vektorfont–Formate angeboten. Eine feinere Unterteilung ist aber +auf Wunsch durch die Flags FF_SPD, …, FF_CFN +möglich. +
      +
    Bitte beachten: Calamus–Fonts (und somit das Flag +FF_CFN) werden z.Z. noch von keinem GDOS unterstützt! +
      +

  • +
  • Das Flag FF_CHANGED wird nur dazu verwendet, um im +User–Popup die Einstellungen zu markieren, die sich geändert +haben. Der Fontselektor setzt dieses Flag nur, wertet es aber selbst +nicht aus. +
      +

  • +
+ +

15.14.1.5 xFSL Returncodes

+

Alle xFSL–Aufrufe liefern einheitliche Returncodes +(Rückgabewerte) zurück. Dabei steht eine negative Zahl für einen +Fehler, eine positive Zahl (oder Null) bedeutet Erfolg bzw. ein +Ereignis. +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameWertBedeutung
xFS_PARERROR-9Parameterfehler, z.B. Aufruf nach Rev. 3
xFS_LOADERROR-8Fehler beim Nachladen des xFSL-Moduls
xFS_RES_ERROR-7Auflösung zu klein (mind. 640x400 Punkte)
xFS_NO_HANDLE-6Kein VDI-Handle frei
xFS_NO_WINDOW-5Kein Fenster(handle) frei
xFS_NO_FONTS-4Keine Fonts geladen
xFS_NO_FONTSIZE-3Fontgröße nicht identifizierbar
xFS_ACTIVE-2Fontselektor ist bereits aktiv
xFS_ERROR-1allgemeiner Fehler (Speichermangel o.ä.)
xFS_STOP0<Abbruch> gewählt
xFS_OK1<Ok> gewählt
xFS_HELP2Hilfe-Button angewählt
xFS_EVENT3AES-Event aufgetreten
xFS_POPUP4Änderung am User-Popup
+
+ +

Diese Werte wurden aufwärtskompatibel zum Fontselektor UFSL +gewählt (dieser kennt die Returncodes -4, -3, -2, -1, 0 und 1). +

+

Darüber hinaus können auch Gemdos-Fehlermeldungen (Werte +kleiner oder gleich -32) auftreten, insbesondere kann +xfsl_init auch den Wert EINVFN (-32) liefern, wenn der +Fontselektor den erweiterten Aufruf nicht unterstützt. +

+

Beim Aufruf xfsl_init entsprechen positive +Rückgabewerte dem Fensterhandle des Fontselektors (0 bedeutet, daß +der Fontselektor als modaler Dialog geöffnet wurde). +

+

Es ist möglich, daß die Liste der Returncodes in Zukunft um +weitere Fehler (Werte kleiner -9) oder Ereignisse (Werte größer 4) +erweitert wird. Dies sollte beim Programmentwurf berücksichtigt +werden: Bei unbekannten Fehlern sollte abgebrochen, unbekannte +Ereignisse sollten ignoriert werden. +

+

15.14.1.6 Die Pure-C-Event-Struktur

+ +

Die GEM–Bibliothek von Pure C verwendet eine spezielle +Struktur, in der die Parameter der AES-Funktion +evnt_multi() zusammengefaßt sind. Diese Struktur wird auch +von xfsl_event verwendet. +

+
+
typedef struct /* Special type for EventMulti */
+{
+ /* Eingabeparameter */
+ int ev_mflags,
+     ev_mbclicks, ev_bmask, ev_mbstate,
+     ev_mm1flags, ev_mm1x, ev_mm1y, ev_mm1width, ev_mm1height,
+     ev_mm2flags, ev_mm2x, ev_mm2y, ev_mm2width, ev_mm2height,
+     ev_mtlocount, ev_mthicount;
+
+ /* Ausgabeparameter */
+ int ev_mwich,
+     ev_mmox, ev_mmoy, ev_mmobutton, ev_mmokstate,
+     ev_mkreturn, ev_mbreturn;
+
+ /* Message-Buffer */
+ int ev_mmgpbuf[8];
+} EVENT;
+
+
+

Die Elemente der Struktur entsprechen denen des +evnt_multi()–Aufrufs. Auch die Reihenfolge der Parameter +ist — bis auf wenige Ausnahmen — identisch. Das Feld +`ev_mwich' enthält die aufgetretenen Events in der gleichen +Kodierung wie `ev_mflags'. +

+

15.14.2 xFSL Tips und Hinweise

+

In den folgenden Abschnitten soll versucht werden, noch einige +Tips und Hinweise zur xFSL–Schnittstelle zu geben. +

+

15.14.2.1 Ein einfacher Aufruf

+

Angesichts der Vielzahl der Parameter und Einstellmöglichkeiten +erscheint folgender Hinweis angebracht: +

+
+Keine Panik! +
+

Ein xFSL–Aufruf ist einfacher als es zunächst scheint. +Insbesondere kann hier die Strategie der schrittweisen +Verfeinerung angewendet werden, da man (fast) alle Parameter +zunächst einmal auf Null setzen kann. +

+

Ein möglichst einfacher xFSL–Aufruf kann z.B. so +aussehen: +

+
+
#include <stdio.h>
+#include <aes.h>
+#include <vdi.h>
+#include <xfsl.h>
+
+void call_xfsl (void)
+{
+  int xhandle, xret;
+  xFSL_PAR xpar;
+  PFONTINFO pfont;
+  xFSL *xfsl;
+
+  memset (&xpar, 0, sizeof (xFSL_PAR));
+  memset (&pfont, 0, sizeof (PFONTINFO));
+
+  xpar.par_size = sizeof (xFSL_PAR);
+  xpar.pfi_size = sizeof (PFONTINFO);
+  xpar.font = &pfont;
+  xpar.font->fontcol = BLACK;
+
+  if (get_cookie ('xFSL', &xfsl))
+  {
+    xhandle = xfsl->xfsl_init (0, &xpar);
+    if (xhandle >= 0)
+    {
+     do
+       xret = xfsl->xfsl_event (xhandle, 0L);
+     while (xret > xFS_OK);
+     xfsl->xfsl_exit (xhandle);
+     if (xret == xFS_STOP)
+       printf ("Abbruch\n");
+     else if (xret == xFS_OK)
+       printf ("Font mit ID %d ausgewählt\n", xpar.font->fontid);
+     else if (xret < 0)
+       printf ("Fehler %d\n", xret);
+   }
+   else
+     printf ("Fehler %d\n", xhandle);
+  }
+  else
+    printf ("Cookie nicht gefunden!\n");
+}
+
+
+

Mit den beiden memset–Aufrufen werden alle +Elemente der Strukturen xFSL_PAR und PFONTINFO auf +Null gesetzt. Anschließend werden einige unbedingt nötige Werte +eingetragen: +

+
    +
  • die Größen der beiden Strukturen xFSL_PAR und +PFONTINFO +
      +

  • +
  • die Adresse der PFONTINFO–Struktur wird in der +xFSL_PAR–Struktur eingetragen +
      +

  • +
  • die Schriftfarbe wird auf schwarz gesetzt (dies könnte man +auch weglassen, aber normalerweise wird man ja in schwarzer Schrift +auf weißem Grund schreiben wollen) +
      +

  • +
+ +

Mehr ist an Vorbereitungen nicht nötig, es folgt nun der +eigentliche Aufruf. Zunächst wird der xFSL–Cookie gesucht. Im +Erfolgsfall wird nun der Fontselektor initialisiert, indem die +xFSL_PAR–Struktur übergeben wird. War dieser Aufruf +erfolgreich (`xhandle' ist größer oder gleich Null), so +befindet sich der Fontselektor bereits auf dem Bildschirm. In der +Hauptschleife wird nun gewartet, bis der Fontselektor entweder mit +xFS_STOP oder xFS_OK vom Anwender beendet wird oder +bis ein Fehler auftritt (andere positive Rückgabewerte werden hier +einfach ignoriert). Mit dem Aufruf von xfsl_exit wird der +Fontselektor wieder vom Bildschirm entfernt und anschließend der +Rückgabewert ausgewertet. +

+

Das war doch gar nicht so kompliziert, oder? Von hier aus +können Sie nun mit den diversen Parametern und Flags weiter +experimentieren. +

+

15.14.2.2 Fragen und Antworten

+

Wie kann ich feststellen, welche Features der Fontselektor +bietet? +

+

Direkt kann dies für einige Features über die Funktion +xfsl_info geschehen. Indirekt können weitere Features über +das Feld `control' in der xFSL_PAR–Struktur +abgefragt werden: Nach einem erfolgreichen +xfsl_init–Aufruf wird der Fontselektor diejenigen +Kontrollflags löschen, die er nicht versteht. +

+
+

Wie soll sich mein Programm verhalten, wenn es feststellt, +daß der Fontselektor das gewünschte Feature nicht unterstützt? +

+

Wenn überhaupt ein Fontselektor installiert ist, sollte dieser +auch auf jeden Fall verwendet werden. Je nachdem, wie wichtig das +vermißte Feature ist, könnte sich Ihr Programm nach Alternativen +umsehen (z.B. über das Font-Protokoll) oder versuchen, das fehlende +Feature zu kompensieren. +

+

Auch hier gilt wieder: Der Anwender wollte einen Fontselektor, +keine Fehlermeldung. Wenn das fehlende Feature nur schwer zu +kompensieren ist, dann sollten Sie den Anwender einmalig(!) mit einem +entsprechenden Hinweis informieren, aber trotzdem den Fontselektor +aufrufen. Auch wenn die Auswahl dann nicht mit dem gewünschten +Komfort geschehen kann, ist dies für den Anwender immer noch weniger +frustrierend, als überhaupt keinen Font auswählen zu können. +

+

Einige Beispiele: Sollte über das Popup der Font für +bestimmte Fenster des Programms eingestellt werden, so sollte er bei +fehlendem Popup für das oberste Fenster des Programms übernommen +werden. Unterstützt der Fontselektor das Sperren der +Größenänderung nicht, so sollte die zurückgelieferte Größe +einfach ignoriert werden und — wenn sie von der gewünschten +Größe abweicht — der Anwender durch einen Hinweis davon in +Kenntnis gesetzt werden. +

+

Man sollte sich übrigens nicht darauf verlassen, daß der +Fontselektor beim nächsten Aufruf noch der gleiche ist bzw. die +gleichen Features unterstützt! Die Fontselektoren, die mit einem +Overlay (XFSL.OVL) arbeiten können durch einfaches Umkopieren +des Overlays jederzeit ohne Reset ausgewechselt werden. +

+
+

Was hat es mit diesem Mapping auf sich? +

+

Vektorfonts enthalten meist wesentlich mehr als die üblichen +256 Zeichen, noch dazu normalerweise nicht in der gewohnten +ASCII–Codierung (beispielsweise könnte das Leerzeichen auf +Position 0 statt auf 32 liegen). Daher werden die entsprechenden +Zeichen aus dem Font auf die normalen 256 Zeichen +gemappt (d.h. abgebildet), so daß sich das Leerzeichen wie +gewohnt an Position 32 befindet, unabhängig davon, welche Position es +innerhalb des Fonts hat. Dieses bezeichnet man als ASCII–Mapping. +

+

Per Default ist das ASCII–Mapping aktiv. Dadurch kann man +aber die Zeichen, die außerhalb des ASCII–Zeichensatzes liegen, +nicht ansprechen. Als zweites Mapping steht daher das direkte +Mapping zur Verfügung. Hier hat man nun Zugriff auf alle +Zeichen eines Fonts. Allerdings muß man dazu auch wissen, um welche +Art von Font es sich handelt und wieviele Zeichen der Font enthält: +Speedofonts haben meist 564 Zeichen, TrueType–Fonts können +(theoretisch) bis zu 65536 Zeichen enthalten. Diese Information +erhält man nach dem Umschalten auf das direkte Mapping mit der +VDI–Funktion vqt_fontinfo(): +

+
 int minADE, maxADE;
+
+ vst_charmap(handle,0);
+ vqt_fontinfo(handle,&minADE,&maxADE,dumarray,&dummy,dumarray);
+
+

In `minADE' erhält man den kleinsten, in +`maxADE' den größten gültigen Zeichenindex. +

+

Das direkte Mapping ist für normale Anwendungen nur +eingeschränkt brauchbar. Im Gegensatz zum ASCII–Mapping, das ein +einheitliches Mapping für alle Arten von Fonts darstellt, muß man +hier nämlich ganz genau wissen, um welche Art von Font es sich +handelt. So haben z.B. die Speedo–Symbolfonts eine andere +Codierung als die normalen Speedofonts. D.h. daß man an +Position 64 eines solchen Symbolfonts nicht das gleiche Zeichen +vorfinden wird wie bei einem normalen Speedofont. +

+

Andere Mappings als ASCII sind daher z.Z. für den Großteil der +Programme uninteressant. Künftige GDOSse werden aber möglicherweise +noch andere einheitliche Mappings (z.B. Unicode oder BICS) anbieten, +bei denen man sich dann wieder darauf verlassen kann, daß an einer +bestimmten Position auch immer das gleiche Zeichen liegt (ähnlich wie +beim ASCII–Mapping, nur eben auch bei Positionen größer 255). +

+
+

15.14.2.3 xFLS Programmiertechnische Hinweise

+

Die Beschreibung der xFSL–Schnittstelle in diesem Text +erfolgt in Pure C. In den folgenden Abschnitten werden die Datentypen und +Besonderheiten von Pure C näher beschrieben, damit xFSL–Aufrufe +auch aus anderen Programmiersprachen und C–Dialekten gelingen. +

+
15.14.2.3.1 Datentypen
+

In diesem Text werden die folgenden Datentypen verwendet: +

+
+
 Name            Größe
+----------------------------------------
+ int             16 Bit mit Vorzeichen
+ unsigned int    16 Bit ohne Vorzeichen
+ long            32 Bit mit Vorzeichen
+ unsigned long   32 Bit ohne Vorzeichen
+
+
+

Der Datentyp char ist ein (ASCII–)Zeichen und wird +hier nur als Zeigertyp verwendet, d.h. als Zeiger auf einen +C–String (eine Folge von Zeichen, die mit einem Nullbyte +abgeschloßen sind). +

+
+ +

Union +

+

Eine Union entspricht einem varianten Record in Pascal. Es +handelt sich um eine Struktur, deren einzelne Elemente +übereinander liegen, d.h. denselben Speicherbereich belegen. +Welches Element gerade gültig ist, ergibt sich aus dem Kontext bzw. +bleibt dem Programmierer überlassen. +

+

Beispiel: In der Struktur PFONTINFO wird für +die Größenangabe eine Union `fsize' verwendet: +

+
+
union fsize
+{
+ int   size;    /* Fontgröße in Punkt         */
+ fix31 size31;  /* Fontgröße in 1/65536 Punkt */
+};
+
+
+

Der Speicherbedarf dieser Union beträgt vier Bytes, da der Typ +fix31 vier Bytes groß ist. Man könnte nun dem Element +`size31' eine Größenangabe in 1/65536 Punkt zuweisen und +dann den Wert in ganzen Punkt aus dem Element `size' auslesen +— dies ist aber nicht empfehlenswert, da bei der Umrechnung +fix31 nach pt immer gerundet werden sollte, s.u. +

+
+ +

fix31 +

+

Der Datentyp fix31 ist eine Festkommazahl, bei dem die +oberen 16 Bit den vorzeichenbehafteten Vorkomma-Anteil darstellen und +die unteren 16 Bit den vorzeichenlosen Nachkomma-Anteil. Er wird +ausschließlich für Größenangaben von Fonts verwendet, die damit +auf 1/65536 Punkt genau angegeben werden können. +

+

Bei der Umrechnung von fix31 nach pt darf man das Runden +nicht vergessen. Zitat aus dem NVDI–Guide: +

+

Man darf nie, nie, niemals den Nachkommateil einfach +abschneiden! +

+
15.14.2.3.2 xFSL Parameterübergabe
+

Die Übergabe der Parameter bei allen xFSL–Aufrufen +geschieht über den Stack nach C–Konvention. D.h. daß der beim +Aufruf am weitesten rechts stehende Parameter zuerst auf den Stack +gelegt wird und der am weitesten links stehende Parameter zum Schluß, +d.h. beim Einsprung in den Fontselektor, obenauf liegt. +

+
15.14.2.3.3 Pure C und `cdecl'
+ +

Pure C übergibt die Parameter an Funktionen normalerweise in +Registern. Für eine Übergabe über den Stack muß entweder das +Schlüsselwort cdecl verwendet werden (wie im +Includefile XFSL.H geschehen) oder der Compilerschalter +-H gesetzt werden. +

+

Das Schlüsselwort cdecl ist eine +Pure–C–spezifische Erweiterung und wird daher bei +gesetztem Compilerschalter -A (ANSI-Konformität) +angemahnt. +

+

15.14.3 Revisions–History

+

Revision 4 +

+
    +
  • Aufgrund eines kleinen Designfehlers in den älteren +Revisionen, der die Erweiterbarkeit der Schnittstelle einschränkte, +ist Revision 4 nicht kompatibel zu älteren Revisionen. Dies +sollte in der Praxis kein Problem darstellen, da der Fontselektor +Aufrufe nach dem alten Schema mit einem Fehler quittieren wird. Die +alte Revision 3 wird im Laufe der Zeit verschwinden. +
      +

  • +
  • neue Parameter in der PFONTINFO–Struktur: +
      +

      +
    • Text–Hintergrundfarbe (`backcol') +
        +

    • +
    • Textausrichtung (`halign' und `valign') +
        +

    • +
    • Textrotation (`rotation') +
        +

    • +
    • Angabe von Zeichen, die der ausgewählte Font unbedingt +enthalten soll (`validtype' und `validchars') +
        +

    • +
    + +

  • +
  • die PFONTINFO–Struktur wird auch bei Rückgabe +xFS_STOP mit den Werten des zuletzt im Fontselektor +ausgewählten Fonts gefüllt +
      +

  • +
  • Codierung der Fontflags geändert (feinere Unterscheidung der +Vektorformate) +
      +

  • +
+ +
+

Revision 3 +

+
    +
  • die erste öffentlich verfügbare Schnittstellen–Revision +
      +

  • +
+ +
+

ältere Revisionen +

+
    +
  • ältere Revisionen können getrost ignoriert werden, da diese +niemals in einem für eine größere Öffentlichkeit verfügbaren +Programm in Erscheinung getreten sind +
      +

  • +
+ +

15.14.4 Programmübersicht

+

Es folgt eine Übersicht über alle z.Z. erhältlichen +Fontselektoren, die über eine UFSL– oder eine +xFSL–Schnittstelle (oder beides) verfügen. +

+

Desweiteren folgt eine Liste von Programmen, die einen +Fontselektor mit einer der beiden Schnittstellen verwenden. +

+

15.14.4.1 Fontselektor–Übersicht

+

Eine kleine Übersicht über die existierenden Fontselektoren: +

+
+
+
UFSL
+
+

von Michael Thänitz +
Dies ist der Prototyp aller externen Fontselektoren. Die letzte +veröffentliche Version ist 0.97, danach hat Michael leider die +Entwicklung eingestellt. Dankenswerterweise hat er aber die Quelltexte +veröffentlicht. +
  +

+ +
+
FontSel
+
+

von Holger Weets und Christoph Zwerschke +
Ein kleiner, aber auch etwas spartanischer Fontselektor von Holger +Weets, der seit der Version 1.02 von Christoph Zwerschke +weiterentwickelt wird. Ab der Version 1.02 wird auch die +xFSL-Schnittstelle unterstützt. +
  +

+

+ + +
xUFSL
+
+

von Stefan Rogel +
Der xUFSL bietet gegenüber den bisher genannten Fontselektoren +viele zusätzliche Features. Da diese über die existierende +UFSL-Schnittstelle nicht angesprochen werden konnten, hat Stefan die +Schnittstelle erweitert. Das Design der ersten Version war, vorsichtig +ausgedrückt, umstritten. Letzte veröffentlichte Version: +1.05. Nachfolger des xUFSL ist … +
  +

+ +
+
HuGo
+
+

von Stefan Rogel +
HuGo! ist der an die xFSL–Schnittstelle angepaßte +Nachfolger des xUFSL (die UFSL-Schnittstelle wird ebenfalls noch +unterstützt, nicht aber die speziellen Erweiterungen des xUFSL an der +UFSL–Schnittstelle). Die Namensänderung wurde vollzogen, um +Verwechslungen zu vermeiden. +
  +

+ +
+
Calvino
+
+

von Dirk Haun +
Zusammen mit HuGo! der erste Fontselektor mit +xFSL–Schnittstelle. Auch Calvino unterstützt noch die einfache +UFSL–Schnittstelle. +
  +

+ +
+
FONT_SEL und FONT_PAL
+
+

von Christian Grunenberg +
Diese beiden Programme arbeiten auf Drag&Drop–Basis, sie +unterstützen also weder die UFSL– noch die +xFSL–Schnittstelle, dafür aber das Font–Protokoll. +FONT_SEL ist ein Fontselektor, FONT_PAL eine +Fontpalette (mit integriertem Fontselektor). +
  +

+ +
+
+

15.14.4.2 Programme, die einen Fontselektor unterstützen

+

Folgende Programme unterstützen einen externen Fontselektor +(Stand 16.08.1998, alle Angaben und E-Mail-Adressen ohne Gewähr): +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ProgramCategoryAuthorUFSLxFSL
800XL-DeejayLaufwerksemulatorKolja Koischwitz+
APP_ListSystemutilityRalf Zimmermann+
BelliniGrafikprogrammIngo Dehne+
BibelSTBibel-SoftwareReinhard Bartel+
Cat2MausMausTauschHarald Sommerfeldt+
ChatwinShellDirk Haun @ LB+F+F
CyPressTextverarbeitungRene Bartholomay+F
DB-PointNewsreaderMichael Heng+
Disk CakeDiskutilityChristoph Zwerschke++
EgaleDateiutilityDavid Reitter++
EverestEditorOliver Schmidt+
Face ValueApp.Builder/LibVegard Hofsoy-+
FlohFilelisten-Util.Heiko Schaefer+
GEMARBackupSteffen Engel+
GEM-FontviewerZeichensatz-AnzeigeReinhard Bartel++
GEM-PlanTabellenverwaltungReiner Rosin+F
HitchcockSystemutilityThorsten Pohlmann+
IdeaListASCII-DruckprogrammChristoph Bartholme+
ImaginFunktionsplotterReinhard Maier+
JediGAL-AssemblerRalf Zimmermann+
KandinskyZeichenprogrammUlrich Rossgoderer+
MagiC!ConfMagiC-UtilityChristian Ratsch+
MasterBrowseDateiviewerMichel Forget+
MenuInfoSystemutilityDirk Hagedorn+F
OkamiNewsreaderWolfram Rösler+
Photo LineBildverarbeitungGerhard Huber+
QEDEditorChristian Felsch+
RoadRunnerAutofahrtplanungAndreas Schrell+F
SaugUtilityditoFrank Rüger+
SchecksBusinessoftwareChristian Lehmann+
ST-GuideHypertextHolger Weets+
STJ-OberonProgrammierspracheStephan Junker++
TexelTabellenkalkulationThomas Much++
UpToCASECASE-ToolMichael Nolte+
VESALLernprogrammPeter Klasen+
Zeig's mirDateiviewerReiner Rosin++F
+
+ +

(+: unterstützt, F: als Fensterdialog; E-Mail-Adressen: +MausNet) +

+
+ +

15.14.5 Die UFSL–Schnittstelle

+

Der Vollständigkeit halber folgt hier noch die +Original–Beschreibung von Michael Thänitz zur ursprünglichen +UFSL-Schnittstelle: +

+

Programmierschnittstelle: +
+

+

UFSL ist eine Fontauswahlbox für den Autoordner. Sie bietet dem +Programmierer eine einfache Programmierschnittstelle über einen +Cookie. +

+

Der Cookie lautet: UFSL. +
Der Cookie liefert einen Zeiger auf folgende Struktur: +

+
 typedef struct
+ {
+  unsigned long  id;      /* UFSL ID (UFSL)       */
+  unsigned int   version; /* Version (BCD-Format) */
+  int dialtyp;            /* 0=Dialog, 1=Fenster  */
+  int cdecl (*font_selinit)(void);
+  int cdecl (*font_selinput)(
+              int vdihandle,
+              int dummy,
+              char *text,    /* eigener Text, max. 34 Zeichen      */
+              int ftype,     /* 1=nur monospaced Fonts, 0=alles    */
+              int *fretid,   /* eingestellte FontId                */
+              int *fretsize  /* eingestellte Fontgröße             */
+              );
+  OBJECT *helpbutton;           /* Typ: BOXTEXT                    */
+  void cdecl (*helpfunc)(void); /* Benutzerdefinierte Helpfkt.     */
+
+  /**** ab Version 0.91 ********************************************/
+  char *examplestr;            /* Beispieltext für Fontdarstellung */
+
+  /**** ab Version 0.96 ********************************************/
+  void cdecl (*msgfunc)(int event, int msgbuf[]);/* Redrawfunktion */
+
+  /**** ab Version 0.97 ********************************************/
+  int cdecl (*fontsel_exinput)(
+              int vdihandle,
+              int ftype,     /* 1=nur monospaced Fonts, 0=alles    */
+              char *text,    /* eigener Text, max. 34 Zeichen      */
+              int *fretid,   /* eingestellte FontId                */
+              int *fretsize  /* eingestellte Fontgröße             */
+              );
+ } UFSL;
+
+

Aufruf: +

+
UFSL *ufsl;
+ufsl=(UFSL *)get_cookie('UFSL');
+ufsl->helpfunc= my_helpfunc;   /* Hilfefunktion oder NULL */
+ufsl->msgfunc = my_msghandler; /* Redrawfunktion oder NULL,
+                                  Dialtyp beachten */
+ufsl->fontsel_input(vdihandle,"Bitte Font auswählen",0,&id,&size);
+oder
+ufsl->fontsel_input(vdihandle,NULL,0,&id,&size);
+
+

Returncodes: +

+
 1 : Alles OK, Werte gültig.
+ 0 : Abbruch gewählt.
+-1 : Out of memory.
+-2 : Unzulässiger Mehrfachaufruf.
+-3 : Fontgröße konnte nicht identifiziert werden.
+-4 : Anzahl Fonts muß größer null sein.
+
+

Sonderfunktionen: +

+
void cdecl (*helpfunc)(void); /* Benutzerdefinierte Helpfkt.     */
+
+

UFSL kann eine benutzerdefinierbare Hilfefunktion über den +ebenfalls optionalen Hilfebutton aufrufen. helpfunc() +benötigt keine Parameter und liefert auch keinen Wert zurück. +

+
void cdecl (*msgfunc)(int event, int msgbuf[]); /* Redrawfunktion */
+
+

Bei Verwendung von UFSL als Fensterdialog ist es notwendig eine +Redrawfunktion zur Verfügung zu stellen. Sie schickt die anfallenden +Events an das aufrufende Programm zurück, damit nach Verschieben des +Dialogs die Hintergrundfenster restauriert werden können. +msgfunc() liefert als ersten Parameter das Ergebnis von +evnt_multi() und als zweiten Parameter die MsgPipe. Ein +Returncode wird nicht benötigt. Das Anwenderprogramm muß die +nötigen Routinen zur Fensterbehandlung zur Verfügung stellen. +wind_update(..._UPDATE) wird von UFSL nicht gesetzt, obliegt +also dem rufenden Anwenderprogramm. Prinzipbedingt (?) ist die +Memoryprotection von MTOS auszuschalten. +

+

Grundsätzlich gilt es zu überlegen, ob tatsächlich alle +Events entsprechend beantwortet werden sollen. Ein WM_TOPPED, +das andere eigene Fenster nach vorn bringt, sollte wohl nicht +beantwortet werden, da UFSL naturgemäß nur applikationsmodal sein +kann, da UFSL ja in einem eigenen form_do() sprich +evnt_multi() kreist. +

+

15.14.6 Hinweise für Autoren anderer Fontselektoren

+

Autoren anderer Fontselektoren sind dazu eingeladen, sich der +xFSL–Schnittstelle anzuschließen. Im Prinzip kann jeder +Fontselektor, der als TSR konzipiert ist, mit der +xFSL–Schnittstelle ausgerüstet werden. +

+

Damit keine Mißverständnisse entstehen: Die +Overlay–Technik und die Reentranz, wie sie Calvino und HuGo! +bieten, sind nicht Teil der eigentlichen Schnittstelle und müssen von +anderen Fontselektoren daher auch nicht unterstützt werden. +Allerdings ist auch die Schnittstelle zwischen dem residenten Teil +(Shell) und dem nachgeladenen Teil (Overlay) genormt und +kann daher auch von anderen Fontselektoren verwendet werden. Eine +Beschreibung dieser internen Schnittstelle ist auf Anfrage +erhältlich, siehe Kontaktadressen. +

+

Da bereits eine Reihe von Programmen die alte +UFSL–Schnittstelle unterstützen, erscheint es ratsam, auch in +neuen Fontselektoren diese Schnittstelle noch zur Verfügung zu +stellen. Jedoch zeigt ein kurzer Blick auf diese Programme, daß sie +fast ausschließlich den Fontselektor als modalen Dialog aufrufen. Die +Empfehlung lautet daher, eine minimale UFSL–Unterstützung +einzubauen (nur als modaler Dialog) und dafür die +xFSL–Schnittstelle möglichst weitgehend zu implementieren, da +zu erwarten steht, daß gerade die — nun endlich genormten +— Erweiterungen gegenüber der UFSL-Schnittstelle von den +Programmen verwendet werden sollen. +

+

Ein Fontselektor sollte möglichst die folgenden zusätzlichen +Features bieten: +

+
    +
  • Größenänderung möglich +
    Insbesondere ist damit gemeint, daß nicht nur eine Größe +ausgewählt, sondern bei Vektorfonts auch die Zwischengrößen +eingestellt werden können. +
      +

  • +
  • fix31–Unterstützung +
    Für einige Anwendungen reicht die Einstellung der Fontgröße in +Punkt nicht aus, daher sollte auch eine Einstellung in 1/65536 Punkt +möglich sein. +
      +

  • +
  • User–Popup +
    Durch das zusätzliche Popup wird der Fontselektor flexibler +einsetzbar. +
      +

  • +
  • Drag&Drop–Unterstützung +
    Neben dem traditionellen Aufruf über den Cookie kommen +Lösungen auf Drag&Drop–Basis immer mehr in Mode. Wenn der +Fontselektor von sich aus schon Drag&Drop unterstützt, läßt er +sich leicht durch ein kleines Frontend-Programm in einen +vollwertigen Drag&Drop–Selektor verwandeln. +
      +

  • +
+ +

Folgende Konventionen wurden für einen xFSL–Fontselektor +vereinbart: +

+
    +
  • Wenn der Fontselektor über einen Closer verfügt, so wird +dieser als Abbruch interpretiert, d.h. es wird xFS_STOP +zurückgegeben. Ist das Kontrollflag CC_CLOSER gesetzt, wird +der gerade aktuelle Font aber trotzdem zurückgegeben (in der +PFONTINFO–Struktur in xFSL_PAR). +
      +

  • +
  • Wenn der erweiterte Aufruf (xfsl_init, +xfsl_event und xfsl_exit) nicht unterstützt wird, +muß zumindest eine Dummy–Funktion für xfsl_init +installiert werden, die immer -32 (Gemdos–Fehlermeldung +EINVFN, ungültige Funktionsnummer) zurückgibt. +
      +
    Es wird aber dringend empfohlen, den erweiterten Aufruf +anzubieten, da dieser am häufigsten verwendet wird. +
      +

  • +
  • Es ist legal, daß der Fontselektor beim erweiterten Aufruf nur +als modaler Dialog erscheint. Bei gesetztem CC_WINDOW sollte +xfsl_init dann aber xFS_NO_WINDOW zurückgeben, damit +sich der Aufrufer darauf einstellen kann. +
      +

  • +
+ +
+ +Home +ProtokolleProtokolle +XAccXAcc +XSSI-ProtokollXSSI-Protokoll + + diff --git a/de/protocols.html b/de/protocols.html new file mode 100644 index 000000000..47cb36923 --- /dev/null +++ b/de/protocols.html @@ -0,0 +1,51 @@ + + + + + +Die Anleitung zum TOS: Protokolle + + + + + + + + + +Home +Inhaltsverzeichnis +Detecting the presence of TosBox, Steem and PaCifiSTDetecting the presence of TosBox, Steem and PaCifiST +AV-ProtokollAV-Protokoll + +
+ +

15 Protokolle

+ +
+
+ +Home +Inhaltsverzeichnis +Detecting the presence of TosBox, Steem and PaCifiSTDetecting the presence of TosBox, Steem and PaCifiST +AV-ProtokollAV-Protokoll + + diff --git a/de/references.html b/de/references.html new file mode 100644 index 000000000..3501a184a --- /dev/null +++ b/de/references.html @@ -0,0 +1,72 @@ + + + + + +Die Anleitung zum TOS: Angabe der Quellen + + + + + + + + + +Home +Inhaltsverzeichnis +Literatur zum TOS-BetriebssystemLiteratur zum TOS-Betriebssystem +Der PMMU-FunktionshandlerDer PMMU-Funktionshandler + +
+ +

E Angabe der Quellen

+

Die in diesem Hypertext zusammengetragenen Informationen stammen +aus verschiedenen Quellen, und zwar +

+
    +
  • Atari Profibuch ST-STE-TT +
  • +
  • Dokumentationen zu +
      +
    • MagiC +
    • +
    • MagiC Mac +
    • +
    • MiNT +
    • +
    • NVDI +
    • +
    + +
  • +
  • ST-Computer und ST-Magazin +
  • +
  • Vom Anfänger zum GEM-Profi +
  • +
  • den Gruppen ATARI.EXP, ATARI.PROG, GEM.GER, GEMINI und +MINT/MTOS des Mausnetzes, sowie einer Vielzahl weiterer Quellen. +
  • +
+ + +

In diesem Zusammenhang gilt mein Dank all jenen, die mir weitere +Informationen und Bug-Reports haben zukommen lassen. +

+

Ein ganz besonderer Dank von Rolf Kotzian geht an Volker +Ritzhaupt und Oliver Buchmann (Application Systems +Heidelberg), die mir den Zugang zu den MagiC-, MagiC Mac- und +NVDI-Quellen ermöglichten, sowie an Thomas Tempelmann für +die Unterstützung bei MagiC-Mac-Spezifikas. +

+

Querverweis: Literatur +

+
+ +Home +Inhaltsverzeichnis +Literatur zum TOS-BetriebssystemLiteratur zum TOS-Betriebssystem +Der PMMU-FunktionshandlerDer PMMU-Funktionshandler + + diff --git a/de/rsrc.html b/de/rsrc.html new file mode 100644 index 000000000..30d1c58ec --- /dev/null +++ b/de/rsrc.html @@ -0,0 +1,1127 @@ + + + + + +Die Anleitung zum TOS: Resourcefunktionen + + + + + + + + + +Home +AESAES +Eigenschaft-FunktionenEigenschaft-Funktionen +ShellfunktionenShellfunktionen + +
+ +

8.21 Resourcefunktionen

+

Diese Bibliothek enthält Funktionen, um die Resourcen eines +GEM-Programms (Menüzeilen, Dialogboxen, Icons etc.) in den Speicher +zu laden, und die Adressen der relevanten Objekte zu bestimmen. Für +diesen Zweck stehen die folgenden Routinen zur Verfügung: +

+ + + + + + + + + + + + + + + + + + + + + +
rsrc_free Resourcespeicher freigeben +
rsrc_gaddr Adresse einer Datenstruktur ermitteln +
rsrc_load Resourcedatei laden +
rsrc_obfix Zeichen- in Pixelkoordinaten wandeln +
rsrc_rcfix Zeichen- in Pixelkoordinaten wandeln +
rsrc_saddr Adresse einer Datenstruktur speichern +
sys_recalc_cicon_colours + +
+ +

Hinweis: Die Auslagerung in eine Resource-Datei hat den +unschätzbaren Vorteil, das optische Erscheinungsbild (und +insbesondere die Sprache) leicht ändern zu können, ohne am +Programm selbst Modifizierungen vornehmen zu müssen. +

+

Querverweis: AES   Style-Guidelines +

+

8.21.1 rsrc_free

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Resource free« - gibt den Speicher einer Resourcedatei +wieder frei. +
  +
AES-Nummer: 111 +
  +
Deklaration: int16_t rsrc_free ( void ); +
  +
Beschreibung: Die Funktion gibt den durch eine Resourcedatei belegten +Speicherplatz wieder frei. +
  +
Hinweis: Man sollte auf keinen Fall vergessen, diese +Funktion am Ende eines Programms aufzurufen. +
  +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Resourceorganisation +
  +
Querverweis: Binding   rsrc_load +
  + +
+ +

8.21.1.1 Bindings für rsrc_free

+ + + + + + + + + +
C: int16_t rsrc_free ( void ); +
  +
Umsetzung: +
  +
int16_t rsrc_free (void)
+{
+   return ( crys_if(111) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]111 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.21.2 rsrc_gaddr

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Resource get Address« - ermittelt die Adresse eines Objekts +in einem Resourceset. +
  +
AES-Nummer: 112 +
  +
Deklaration: int16_t rsrc_gaddr ( int16_t re_gtype, int16_t re_gindex, void +*gaddr ); +
  +
Beschreibung: Die Funktion ermittelt die Anfangsadressen verschiedener +Objektstrukturen von im Speicher geladenen Resourcefiles. Es gilt: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
re_gtypeTyp der gesuchten Struktur
 R_TREE 0  = Objektbaum
 R_OBJECT 1  = OBJECT
 R_TEDINFO 2  = TEDINFO
 R_ICONBLK 3  = ICONBLK
 R_BITBLK 4  = BITBLK
 R_STRING 5  = String
 R_IMAGEDATA 6  = imagedata
 R_OBSPEC 7  = ob_spec
 R_TEPTEXT 8  = te_ptext
 R_TEPTMPLT 9  = te_ptmplt
 R_TEPVALID 10 = te_pvalid
 R_IBPMASK 11 = ib_pmask
 R_IBPDATA 12 = ib_pdata
 R_IBPTEXT 13 = ib_ptext
 R_BIPDATA 14 = bi_pdata
 R_FRSTR 15 = ad_frstr
 R_FRIMG 16 = ad_frimg
re_gindexIndex der gesuchten Struktur
gaddrAdresse der gewünschten Struktur
+
+ +
Hinweis: Wenn beispielsweise der Textzeiger innerhalb +einer TEDINFO-Struktur gesucht werden soll, so muß nicht die Nummer +des zugehörigen Objektes, sondern die Nummer der TEDINFO-Struktur +übergeben werden. Für andere Codierungen gilt i.w. das gleiche. +
  +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Resourceorganisation +
  +
Querverweis: Binding   rsrc_load +
  + +
+ +

8.21.2.1 Bindings für rsrc_gaddr

+ + + + + + + + + +
C: int16_t rsrc_gaddr ( int16_t re_gtype, int16_t re_gindex, void +*gaddr ); +
  +
Umsetzung: +
  +
int16_t rsrc_gaddr (int16_t re_gtype, int16_t re_gindex,
+                    void *gaddr)
+{
+   int_in[0]  = re_gtype;
+   int_in[1]  = re_gindex;
+   control[4] = 1;
+
+   crys_if (112);
+
+   control[4] = 0;
+   *gaddr = addr_out[0];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]112 # Opcode der Funktion
control+2control[1]2 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]1 # Einträge in addr_out
int_inint_in[0]re_gtype
int_in+2int_in[1]re_gindex
int_outint_out[0]Return-Wert
addr_outaddr_out[0]gaddr
+
+ + +
+ +

8.21.3 rsrc_load

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Resource load« - lädt eine Resourcedatei in den Speicher. +
  +
AES-Nummer: 110 +
  +
Deklaration: int16_t rsrc_load ( CONST int8_t *re_lpfname ); +
  +
Beschreibung: Die Funktion dient zum Laden und Initialisieren einer +Resource-Datei. Der Parameter re_lpfname enthält dabei den +Dateinamen der Resourcedatei. +
  +
Hinweis: Die Datei wird in allen Verzeichnissen gesucht, +die dem AES bekannt sind. +
  +
Ab PC-GEM Version 2.0 wird übrigens bei Objektbäumen, die als +Wurzel eine Box besitzen (z.B. bei allen Dialogboxen) das Flag SHADOWED im +Objektstatus gesetzt. Das bedeutet, daß alle Dialogboxen statt umrahmt mit +einem Schatten gezeichnet werden. Dies liegt in den +Rechtsstreitigkeiten zwischen Apple und Digital +Research begründet. Allerdings kann das SHADOWED Bit (nach dem +rsrc_load) zur Laufzeit zurückgesetzt und das normale OUTLINED Bit +gesetzt werden. +
  +
Achtung: Eine Umwandlung von Bit-Images und Icons vom +Standardformat in das geräteabhängige Format geschieht an dieser +Stelle nicht. Dies muss ggfs. vom Programmierer selbst +übernommen werden. +
  +
MagiC seit Version 3 und Geneva können Resourcen im sogenannten +Interface-Format laden. Bei anderen AESen wird diese Möglichkeit durch appl_getinfo +(Opcode 2) angezeigt. +
  +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Verfügbar: In allen AES Versionen. +
  +
Gruppe: Resourceorganisation +
  +
Querverweis: Binding   rsrc_free   shel_find   vr_trnfm +
  + +
+ +

8.21.3.1 Bindings für rsrc_load

+ + + + + + + + + +
C: int16_t rsrc_load ( CONST int8_t *re_lpfname ); +
  +
Umsetzung: +
  +
int16_t rsrc_load (CONST int8_t *re_lpfname)
+{
+   addr_in[0] = re_lpfname;
+   return ( crys_if(110) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]110 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]re_lpfname
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.21.4 rsrc_obfix

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Resource Object fix« - wandelt Zeichensatz- in +Pixel-Koordinaten um. +
  +
AES-Nummer: 114 +
  +
Deklaration: int16_t rsrc_obfix ( OBJECT *re_otree, int16_t re_oobject ); +
  +
Beschreibung: Die Funktion konvertiert die Größe und Position eines +Objektes von einer Zeichendarstellung in die Pixeldarstellung. Es +gilt: +
  +

+
+ + + + + + + + + + + + +
ParameterBedeutung
re_otreeAdresse des Objektbaumes
re_oobjectNummer des Objektes
+
+ +
Hinweis: Ein Aufruf dieser Funktion ist immer dann +notwendig, wenn Objekte zur Laufzeit erzeugt werden, oder nicht per +rsrc_load geladen werden. +
  +
Die Konvertierung erfolgt, indem das untere Byte der +Koordinatenangabe mit der Größe eines Zeichens aus dem +Systemzeichensatz multipliziert, und darauf das (vorzeichenbehaftete) +obere Byte addiert wird. Ein Sonderfall: Bei einer Breite von +genau 80 Zeichen wird die Breite des Bildschirms eingesetzt; dies wird +z.B. beim Hintergrundobjekt des Menübaums benutzt. +
  +
Ergebnis: Als Ergebnis wird immer der Wert 1 zurückgegeben. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Resourceorganisation +
  +
Querverweis: Binding   rsrc_load   rsrc_rcfix +
  + +
+ +

8.21.4.1 Bindings für rsrc_obfix

+ + + + + + + + + +
C: int16_t rsrc_obfix ( OBJECT *re_otree, int16_t re_oobject ); +
  +
Umsetzung: +
  +
int16_t rsrc_obfix (OBJECT *re_otree, int16_t re_oobject)
+{
+   int_in[0]  = re_oobject;
+   addr_in[0] = re_otree;
+
+   return ( crys_if(114) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]114 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]re_oobject
addr_inaddr_in[0]re_otree
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.21.5 rsrc_rcfix

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Resource Object Fix« - wandelt Zeichenkoordinaten in +Pixelkoordinaten +
  +
AES-Nummer: 115 +
  +
Deklaration: int16_t rsrc_rcfix ( RSHDR *rc_header ); +
  +
Beschreibung: Diese in MagiC und MultiTOS vorhandene Funktion paßt von der +Applikation bereits in den Speicher geladene Resourcedaten an. Dabei +werden die Koordinaten von Zeichen- in Pixelkoordinaten gewandelt. +
  +
Falls die Applikation vor dem Aufruf dieser Funktion bereits +eine RSC-Datei geladen hat, so muß diese vorher mit rsrc_free +freigegeben werden. Das gleiche gilt beim Beenden der Applikation. +
  +
Der Vorteil dieser Funktion besteht darin, daß die +Resource-Datei des Programms in den Programmcode eingebunden werden +kann. Es reicht dann aus, einfach rsrc_rcfix aufzurufen, und ein Laden +via rsrc_load kann entfallen. +
  + + + +
rc_header: Adresse des RSC-Headers im Speicher; hinter diesem müssen die +RSC-Daten liegen. + +
+ +
Ergebnis: z.Zt. unbekannt. +
  +
Verfügbar: Nur verfügbar in MagiC und AES Versions 4.0 und größer. Das +Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 4) festgestellt +werden. +
  +
Gruppe: Resourceorganisation +
  +
Querverweis: Binding   rsrc_load   rsrc_obfix +
  + +
+ +

8.21.5.1 Bindings für rsrc_rcfix

+ + + + + + + + + +
C: int16_t rsrc_rcfix ( RSHDR *rc_header ); +
  +
Umsetzung: +
  +
int16_t rsrc_rcfix ( RSHDR *rc_header )
+{
+   addr_in[0] = rc_header;
+   return ( crys_if(115) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]115 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]rc_header
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.21.6 rsrc_saddr

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Resource store Address« - speichert die Adresse eines +Objektes. +
  +
AES-Nummer: 113 +
  +
Deklaration: int16_t rsrc_saddr ( int16_t re_stype, int16_t re_sindex, void +*saddr ); +
  +
Beschreibung: Die Funktion speichert die Anfangsadresse einer Datenstruktur +im Speicher. Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
re_stype Typ der Struktur +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
R_TREE0=Objektbaum
R_OBJECT1=Individual OBJECT
R_TEDINFO2=TEDINFO Struktur
R_ICONBLK3=ICONBLK Struktur
R_BITBLK4=BITBLK Struktur
R_STRING5=Free string data
R_IMAGEDATA6=Free image data
R_OBSPEC7=ob_spec Feld in OBJECT
R_TEPTEXT8=te_ptext in TEDINFO
R_TEPTMPLT9=te_ptmplt in TEDINFO
R_TEPVALID10=te_pvalid in TEDINFO
R_IBPMASK11=ib_pmask in ICONBLK
R_IBPDATA12=ib_pdata in ICONBLK
R_IBPTEXT13=ib_ptext in ICONBLK
R_BIPDATA14=ib_pdata in BITBLK
R_FRSTR15=ad_frstr free string
R_FRIMG16=ad_frimg free image
+
+ +
re_sindex Position innerhalb der Datenstruktur +
saddr abzuspeichernde Adresse + +
+ +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Resourceorganisation +
  +
Querverweis: Binding   rsrc_gaddr   OBJECT +
  + +
+ +

8.21.6.1 Bindings für rsrc_saddr

+ + + + + + + + + +
C: int16_t rsrc_saddr ( int16_t re_stype, int16_t re_sindex, void +*saddr ); +
  +
Umsetzung: +
  +
int16_t rsrc_saddr (int16_t re_stype, int16_t re_sindex,
+                    void *saddr)
+{
+   int_in[0]  = re_stype;
+   int_in[1]  = re_sindex;
+   addr_in[0] = saddr;
+
+   return ( crys_if(113) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]113 # Opcode der Funktion
control+2control[1]2 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]re_stype
int_in+2int_in[1]re_sindex
addr_inaddr_in[0]saddr
int_outint_out[0]Return-Wert
+
+ + +
+ +
+ +Home +AESAES +Eigenschaft-FunktionenEigenschaft-Funktionen +ShellfunktionenShellfunktionen + + diff --git a/de/scancode.html b/de/scancode.html new file mode 100644 index 000000000..cbefdba85 --- /dev/null +++ b/de/scancode.html @@ -0,0 +1,851 @@ + + + + + +Die Anleitung zum TOS: Der Scan-Code + + + + + + + + + +Home +Inhaltsverzeichnis +ASCII-TabelleASCII-Tabelle +EntwicklungssystemeEntwicklungssysteme + +
+ +

B Der Scan-Code

+

Da nicht jede Taste auf der Tastatur des Atari einen ASCII-Code +besitzt, ist es in einigen wenigen Fällen notwendig, direkt den +jeweiligen Scancode abzufragen. Normalerweise sollte dies jedoch +nur bei Sondertasten wie etwa den Cursor- oder Funktionstasten +notwendig sein. Die folgende Tabelle gibt eine Übersicht über +wichtige Scan-Codes: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ScancodeDeutschlandUSAStandard-VDI-Code
1ESC  
2111
3222
4333
5444
6555
7666
8777
9888
10999
11000
12ß--
13,==
14Backspace  
15TAB  
16QQQ
17WWW
18EEE
19RRR
20TTT
21ZYY
22UUU
23III
24OOO
25PPP
26Ü[[
27+]]
28Return  
29Control  
30AAA
31SSS
32DDD
33FFF
34GGG
35HHH
36JJJ
37KKK
38LLL
39Ö;;
40Ä''
41#``
42Shift links  
43 \\
44YZZ
45XXX
46CCC
47VVV
48BBB
49NNN
50MMM
51,,,
52...
53-//
54Shift rechts  
55nicht vorh.nicht vorh.PRINT SCREEN
56Alternate  
57Leertaste  
58CapsLock  
59F1  
60F2  
61F3  
62F4  
63F5  
64F6  
65F7  
66F8  
67F9  
68F10  
69   
70   
71ClrHome  
72Pfeil hoch  
73nicht vorhandennicht vorh.PAGE UP
74- (Ziffernblock)  
75<–  
76Alt Gr beim Milan  
77–>  
78+ (Ziffernblock)  
79nicht vorhandennicht vorh.END
80Pfeil runter  
81nicht vorhandennicht vorh.PAGE DOWN
82Insert  
83Delete  
84Shift-F1Shift-F1F11
85Shift-F2Shift-F2F12
86Shift-F3Shift-F3F13
87Shift-F4Shift-F4F14
88Shift-F5Shift-F5F15
89Shift-F6Shift-F6F16
90Shift-F7Shift-F7F17
91Shift-F8Shift-F8F18
92Shift-F9Shift-F9F19
93Shift-F10Shift-F10F20
94nicht vorhandennicht vorh.F21
95nicht vorhandendto.F22
96<dto.F23
97Undo F24
98Help F25
99( (Ziffernblock) F26
100) (Ziffernblock) F27
101/ (Ziffernblock) F28
102* (Ziffernblock) F29
1037 (Ziffernblock) F30
1048 (Ziffernblock) F31
1059 (Ziffernblock) F32
1064 (Ziffernblock) F33
1075 (Ziffernblock) F34
1086 (Ziffernblock) F35
1091 (Ziffernblock) F36
1102 (Ziffernblock) F37
1113 (Ziffernblock) F38
1120 (Ziffernblock) F39
113. (Ziffernblock) F40
114Enter CTRL PRINT SCREEN
115nicht vorhandennicht vorh.CTRL <–
116dto.dto.CTRL –>
117dto.dto.CTRL END
118dto.dto.CTRL PAGE DOWN
119dto.dto.CTRL HOME
120ALT 1 ALT 1
121ALT 2 ALT 2
122ALT 3 ALT 3
123ALT 4 ALT 4
124ALT 5 ALT 5
125ALT 6 ALT 6
126ALT 7 ALT 7
127ALT 8 ALT 8
128ALT 9 ALT 9
129ALT 0 ALT 0
130ALT ßALT-ALT -
131ALT 'ALT=ALT =
132nicht vorhandennicht vorh.CTRL PAGE UP
+
+ + + +

Hinweis: Ein kleines Problem ist die länderunabhänige +Auswertung der Scancodes, denn schließlich sollten Programme auch im +Ausland korrekt funktionieren. Hier kann der +Normalized-Key-Code-Converter (NKCC) von Harald +Siegmund empfohlen werden, der genau diese Aufgabe übernimmt. +

+

Querverweis: ASCII-Tabelle   Keytbl +

+
+ +Home +Inhaltsverzeichnis +ASCII-TabelleASCII-Tabelle +EntwicklungssystemeEntwicklungssysteme + + diff --git a/de/scrp.html b/de/scrp.html new file mode 100644 index 000000000..699600e79 --- /dev/null +++ b/de/scrp.html @@ -0,0 +1,660 @@ + + + + + +Die Anleitung zum TOS: Klemmbrett-Funktionen + + + + + + + + + +Home +AESAES +GrafikfunktionenGrafikfunktionen +ListboxenListboxen + +
+ +

8.14 Klemmbrett-Funktionen

+

Diese Bibliothek stellt Funktionen zur Verfügung, die einen +standardisierten Datenaustausch zwischen verschiedenen Programmen +ermöglichen. Für diesen Zweck sind die folgenden Routinen vorhanden: +

+ + + + + + + + + + + + +
scrp_clear Dateien im Klemmbrett löschen. +
scrp_read Pfad des Klemmbrettes ermitteln. +
scrp_write Pfad des Klemmbrettes setzen. +
x_scrp_get Pfad des Klemmbrettes ermitteln. + +
+ +

Hinweis: Neben diesen Funktionen sind beim +Datenaustausch über das Klemmbrett noch weitere Einzelheiten zu +beachten. +

+

Querverweis: Nachrichten   SC_CHANGED   SH_WDRAW   +Style-Guidelines +

+

8.14.1 scrp_clear

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Scrap clear« - Inhalt des Clipboards löschen +
  +
AES-Nummer: 82 +
  +
Deklaration: int16_t scrp_clear ( void ); +
  +
Beschreibung_ Die Funktion löscht alle Dateien im aktuellen Klemmbrett. +
  +
Achtung: Entgegen den üblichen Konventionen werden +wirklich alle Dateien, und nicht nur solche auf die die Maske +"scrap.*" paßt, gelöscht. +
  +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Verfügbar: Die Funktion steht nur unter PC-GEM, KAOS 1.4.2 und MagiC +(jeweils) zur Verfügung, Nicht vorhanden in ViewMAX. +
  +
Gruppe: Zwischenspeicher +
  +
Querverweis: Binding   Datenaustausch per Klemmbrett +
  + +
+ +

8.14.1.1 Bindings für scrp_clear

+ + + + + + + + + +
C: int16_t scrp_clear ( void ); +
  +
Umsetzung: +
  +
int16_t scrp_clear (void)
+{
+   return ( crys_if(82) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]82 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.14.2 scrp_read

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Scrap read« - ermittelt den Pfadnamen des Klemmbrettes. +
  +
AES-Nummer: 80 +
  +
Deklaration: int16_t scrp_read ( int8_t *sc_rpscrap ); +
  +
Beschreibung: Die Funktion ermittelt das aktuelle Verzeichnis, welches für +die Zwischenablage (Klemmbrett) benutzt wird. +
  +
Hinweis: Das Klemmbrett-Verzeichnis befindet sich nach +dem Aufruf der Funktion im Parameter sc_rpscrap. Man sollte +auf eine ausreichende Größe dieses aufnehmenden Puffers achten. +
  +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Zitat Mike Fulton, Atari Computer: +
»The scrp_read() function is defined as possibly returning an +error code of zero. However, this function currently always returns a +value of 1. Since this may change in future versions of GEM AES, +applications should handle the case of the error code even if the +programmer does not expect to see it.« +
  +
Ab PC-GEM Version 2.0 werden jedoch die folgenden Werte +zurückgeliefert: -1, falls noch kein Pfad gesetzt ist, Rückgabewerte +>= 0 sind als Bitvektor aufzufassen, der über gefundene Dateitypen +informieren soll. Es gilt die folgende Belegung: +
  + + + + + + +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SCRAP_CSV0x0001=scrap.csv
SCRAP_TXT0x0002=scrap.txt
SCRAP_GEM0x0004=scrap.gem
SCRAP_IMG0x0008=scrap.img
SCRAP_DCA0x0010=scrap.dca
 0x0020=scrap.dif (siehe Hinweis)
SCRAP_USR0x8000=scrap.usr
+
+ +
Alle anderen Bits sind für zukünftige Zwecke reserviert. +
  +
Hinweis: Laut der Doku zu PC-GEM ist scrap.usr in Bit +5 kodiert. Der AES-Quelltext sagt aber Bit 15. Die Library aus dem +Buch "Vom Anfänger zum GEM-Profi" belegt Bit 5 mit +DIF-Dateien. Die Erweiterung ist inoffiziell und funktioniert nur wenn +diese Library für die Erstellung benutzt wird. +
  +
Verfügbar: All AES versions, not present in ViewMAX. +
  +
Gruppe: Zwischenspeicher +
  +
Querverweis: Binding   scrp_write   Datenaustausch per Klemmbrett +
  + +
+ +

8.14.2.1 Bindings für scrp_read

+ + + + + + + + + +
C: int16_t scrp_read ( int8_t *sc_rpscrap ); +
  +
Umsetzung: +
  +
int16_t scrp_read (int8_t *sc_rpscrap)
+{
+   addr_in[0] = sc_rpscrap;
+   return ( crys_if(80) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]80 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]sc_rpscrap
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.14.3 scrp_write

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Scrap write« - setzt den Pfad für das Klemmbrett. +
  +
AES-Nummer: 81 +
  +
Deklaration: int16_t scrp_write ( int8_t *sc_wpscrap ); +
  +
Beschreibung: Die Funktion setzt das Verzeichnis, welches für die +Zwischenablage (Klemmbrett) benutzt werden soll. +
  +
Hinweis: Der Name des neuen Pfades wird im Parameter +sc_wpscrap übergeben. Das Klemmbrett sollte den Namen CLIPBRD +tragen, und sich auf dem jeweiligen Bootlaufwerk befinden. +
  +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Verfügbar: All AES versions, not present in ViewMAX. +
  +
Gruppe: Zwischenspeicher +
  +
Querverweis: Binding   scrp_read   Datenaustausch per Klemmbrett +
  + +
+ +

8.14.3.1 Bindings für scrp_write

+ + + + + + + + + +
C: int16_t scrp_write ( int8_t *sc_wpscrap ); +
  +
Umsetzung: +
  +
int16_t scrp_write (int8_t *sc_wpscrap)
+{
+   addr_in[0] = sc_wpscrap;
+   return ( crys_if(81) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]81 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]sc_wpscrap
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.14.4 x_scrp_get

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Scrap read« - ermittelt den Pfadnamen des Klemmbrettes. +
  +
AES-Nummer: 29024 +
  +
Deklaration: int16_t x_scrp_get( int8_t *path, int16_t delete ); +
  +
Beschreibung: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
path Pointer to a string which will receive the complete path of the +clipboard folder, with a \ at the end. +
delete If set, remove all files in the clipboard that match +"SCRAP.*". + +
+ +
This function does the chore of determining where the clipboard +directory is and, optionally, removing any SCRAP files that are +already there. +
  +
If the clipboard directory is either unset or points to a bad +location, then path will be set to either C:\CLIPBRD\ or, if +there is no C: drive, A:\CLIPBRD\. If no CLIPBRD folder exists, then +it is created by the function. +
  +
Beispiel: +
  +
int16_t fhand;
+int8_t path[120], text[]="Hi there!";
+
+if( x_scrp_get( path, 1 ) )
+{
+  strcat( path, "SCRAP.TXT" );
+  if( (fhand = Fcreate( path, 0 )) > 0 )
+  {
+    Fwrite( fhand, sizeof(text), text );
+    Fclose(fhand);
+  }
+}
+
+
Ergebnis: 0 = Fehler +
1 = Erfolgreich +
  +
Verfügbar: Die Funktion steht nur unter Geneva seit Release 004 zur +Verfügung. +
  +
Gruppe: Zwischenspeicher +
  +
Querverweis: Binding   scrp_write   scrp_read   Datenaustausch per Klemmbrett +
  + +
+ +

8.14.4.1 Bindings für x_scrp_get

+ + + + + + + + + +
C: int16_t x_scrp_get( int8_t *path, int16_t delete ); +
  +
Umsetzung: +
  +
int16_t x_scrp_get( int8_t *path, int16_t delete )
+{
+   int_in[0] = delete;
+
+   addr_in[0] = path;
+
+   crys_if(29024);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]29024 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]delete
addr_inaddr_in[0]path
int_outint_out[0]Return-Wert
+
+ + +
+ +
+ +Home +AESAES +GrafikfunktionenGrafikfunktionen +ListboxenListboxen + + diff --git a/de/shel.html b/de/shel.html new file mode 100644 index 000000000..b15b63d0d --- /dev/null +++ b/de/shel.html @@ -0,0 +1,2600 @@ + + + + + +Die Anleitung zum TOS: Shellfunktionen + + + + + + + + + +Home +AESAES +ResourcefunktionenResourcefunktionen +Erweiterte GrafikfunktionenErweiterte Grafikfunktionen + +
+ +

8.22 Shellfunktionen

+

Diese Bibliothek enthält Funktionen um Informationen aus der +Programmumgebung zu lesen bzw. in diese zu schreiben; außerdem kann +hierüber der Start anderer GEM-Programme übernommen werden. +Insgesamt stehen die folgenden Routinen zur Verfügung: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
shel_envrn Environment-Variable abfragen +
shel_find Datei suchen +
shel_get Aus dem Environment-Puffer lesen +
shel_help Ausgabe von Hilfetexten +
shel_put In den Environment-Puffer schreiben +
shel_rdef Abfragen des Default-Programms +
shel_read Kommandozeilenparameter lesen +
shel_wdef Setzen des Default-Programms +
shel_write Applikation starten +
x_shel_get Liest die Informationen aus der GENEVA.CNF +
x_shel_put Schreibt Informationen in die GENEVA.CNF + +
+ +

Hinweis: Eine besondere Beachtung hat dabei shel_write +verdient, welches ab AES-Version 4.0 (bzw. MagiC 3) viele weitere +nützliche Dinge wie ein Herunterfahren des Systems (Shut-Down), +Auflösungswechsel, AES-Broadcasting usw. zur Verfügung stellt. +

+

Querverweis: AES   Style-Guidelines +

+

8.22.1 shel_envrn

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Shell environment« - ermittelt den Wert von +Environmentvariablen. +
  +
AES-Nummer: 125 +
  +
Deklaration: int16_t shel_envrn ( int8_t **sh_epvalue, int8_t *sh_eparm ); +
  +
Beschreibung: Die Funktion ermittelt den Wert einer beliebigen +Environmentvariablen des AES. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
sh_epvalue enthält nach dem Aufruf den Wert der entsprechenen Variablen +
sh_eparm Name der Environment-Variablen + +
+ +
Hinweis: Um das AES-Environment zu ändern sollte man +sich in den exec_os-Vektor einklinken, über den auch das GEM +gestartet wird. In der aufgerufenen Routine liegt (analog zu einem +Programm) der Basepage-Zeiger auf dem Stack. In diese Basepage kann +dann einfach ein Zeiger auf das neue Environment eingetragen werden. +Aber Achtung: In AES-Versionen kleiner als 1.4 werden nur die +ersten 50 Bytes übernommen. +
  +
Noch ein Tip: Wenn der für 'PATH=' zurückgelieferte +Zeiger auf ein Nullbyte verweist, sollte man ihn um den Wert 1 +erhöhen, um an das richtige Ergebnis zu gelangen. +
  +
Ergebnis: Die Funktion liefert als Ergebnis immer 1. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Shell-Kommunikation +
  +
Querverweis: Binding +
  + +
+ +

8.22.1.1 Bindings für shel_envrn

+ + + + + + + + + +
C: int16_t shel_envrn ( int8_t **sh_epvalue, int8_t *sh_eparm ); +
  +
Umsetzung: +
  +
int16_t shel_envrn (int8_t **sh_epvalue, int8_t *sh_eparm)
+{
+   addr_in[0] = sh_epvalue;
+   addr_in[1] = sh_eparm;
+
+   return ( crys_if(125) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]125 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]sh_epvalue
addr_inaddr_in[1]sh_eparm
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.22.2 shel_find

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Shell find« - sucht Dateien. +
  +
AES-Nummer: 124 +
  +
Deklaration: int16_t shel_find ( int8_t *sh_fpbuff ); +
  +
Beschreibung: Die Funktion sucht eine Datei in bestimmten Verzeichnissen. Der +Parameter sh_fpbuff enthält den Namen der gesuchten Datei. +Nach dem Aufruf der Funktion wird hier der Zugriffspfad auf die Datei +abgelegt. +
  +
Hinweis: Die Datei wird in den folgenden Verzeichnissen +gesucht: +
  +
    +
  • im aktuellen Verzeichnis +
  • +
  • im Wurzelverzeichnis +
  • +
  • in allen Verzeichnissen, die in der Variable PATH des +AES-Environments angegeben sind +
  • +
  • in dem Pfad, in welchem sich das Programm z.Zt. befindet (ab +TOS-Version 1.04) +
  • +
+ +
Die Funktion wird auch von rsrc_load benutzt, um die +Resource-Datei zu lokalisieren. +
  +
Ergebnis: Ein Rückgabewert von Null signalisiert, daß die angegebene +Datei nicht gefunden wurde. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Shell-Kommunikation +
  +
Querverweis: Binding   shel_envrn +
  + +
+ +

8.22.2.1 Bindings für shel_find

+ + + + + + + + + +
C: int16_t shel_find ( int8_t *sh_fpbuff ); +
  +
Umsetzung: +
  +
int16_t shel_find (int8_t *sh_fpbuff)
+{
+   addr_in[0] = sh_fpbuff;
+   return ( crys_if(124) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]124 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]sh_fpbuff
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.22.3 shel_get

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Shell get« - liest den GEM-Environment-Puffer. +
  +
AES-Nummer: 122 +
  +
Deklaration: int16_t shel_get ( int8_t *sh_gaddr, uint16_t sh_glen ); +
  +
Beschreibung: Die Funktion dient zum Lesen von Zeichen aus dem internen +Environment-Speicher des AES. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
sh_gaddr Adresse des Zielspeichers +
sh_glen Anzahl der zu lesenden Bytes oder Wert -1, um die Länge des +Speichers zu ermitteln. + +
+ +
Hinweis: Das Desktop nutzt diesen Speicher zur +Aufbewahrung der DESKTOP.INF bzw. NEWDESK.INF Datei. Das Format dieser +Dateien ist allerdings nicht offiziell dokumentiert. Eine +aktuelle Beschreibung findet sich jedoch in newdesk.hyp. +
  +
Unter MagiC werden beim Start des AES alle Daten in den +Puffer kopiert, die nach der Zeile #_CTR in MAGX.INF liegen. Die +zulässige Länge des Puffers liegt seit MagiC 3 zwischen 4192 und +65534 Bytes. Das Vorhandensein der zusätzlichen Features kann per +appl_getinfo (Opcode 6) abgefragt werden. +
  +
Ergebnis: Ein Rückgabewert von Null signalisiert einen Fehler. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Shell-Kommunikation +
  +
Querverweis: Binding   shel_put +
  + +
+ +

8.22.3.1 Bindings für shel_get

+ + + + + + + + + +
C: int16_t shel_get ( int8_t *sh_gaddr, uint16_t sh_glen ); +
  +
Umsetzung: +
  +
int16_t shel_get (int8_t *sh_gaddr, uint16_t sh_glen)
+{
+   int_in[0]  = sh_glen;
+   addr_in[0] = sh_gaddr;
+
+   return ( crys_if(122) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]122 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]sh_glen
addr_inaddr_in[0]sh_gaddr
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.22.4 shel_help

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: Ausgabe von Hilfetexten. +
  +
AES-Nummer: 128 +
  +
Deklaration: int16_t shel_help ( int16_t sh_hmode, int8_t *sh_hfile, int8_t +*sh_hkey); +
  +
Beschreibung: Die Funktion dient zur Ausgabe von Hilfetexten (Online-Hilfe) +über einen Help-Server. +
  + + + + + + + + + + + + +
Parameter Bedeutung +
  + +
sh_hmode Hierfür ist im Moment immer SHP_HELP(=0) zu übergeben. +
  +
sh_hfile Name der Hilfedatei. +
  +
Wird sie inklusive einer Extension übergeben, so wird anhand +dieser Extension der entsprechende Server in der Liste der Helpserver +aufgesucht. +
  +
Hat die übergebene Datei keine Extension, so wird automatisch +die des ersten in der CNF-Datei definierten Helpservers angehängt. +
  +
sh_hkey Schlüsselwort, zu welchem ein Hilfetext ausgegeben werden +soll, oder NULL. +
  + +
+ +
Bei einem Aufruf von shel_help mit einer Datei, welche eine +Extension hat, prüft N.AES, ob ein Helpserver für diese Extension +(mittels 'helpserver') definiert wurde. Wird ein passender Server +gefunden, so wird geprüft, ob dieser bereits aktiv ist (als Accessory +oder auch als nebenläufig gestartete Anwendung). Ist dies der Fall, +so wird dem Server die Mitteilung VA_START mit den bei +sh_hfile und sh_hkey angegebenen Argumenten als +Kommandozeile zugesendet. +
  +
Ist der Server nicht aktiv, so wird er automatisch gestartet, +wenn bei seiner Definition mit Hilfe von 'helpserver' ein Pfad für +ihn angegeben wurde. Als Kommandozeile wird ihm dabei die bei +sh_hfile und sh_hkey angegebenen Argumente übergeben. +
  +
Ergebnis: Ein Rückgabewert von Null signalisiert einen Fehler. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 65) +festgestellt werden. +
  +
Neben N.AES gibt es eine TSR welches diese Funktion auf anderen +Systemen zur Verfügung stellt. +
  +
Gruppe: Shell-Kommunikation +
  +
Querverweis: Binding +
  + +
+ +

8.22.4.1 Bindings für shel_help

+ + + + + + + + + +
C: int16_t shel_help ( int16_t sh_hmode, int8_t *sh_hfile, int8_t +*sh_hkey); +
  +
Umsetzung: +
  +
int16_t shel_help ( int16_t sh_hmode, int8_t *sh_hfile,
+                    int8_t *sh_hkey)
+{
+   int_in[0] = sh_hmode;
+   addr_in[0] = sh_hfile;
+   addr_in[1] = sh_hkey;
+
+   crys_if(128);
+
+   return = int_out[0];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]128 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]sh_hmode
addr_inaddr_in[0]sh_hfile
addr_1n+4addr_in[1]sh_hkey
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.22.5 shel_put

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Shell put« - schreibt in den GEM-Environment-Puffer. +
  +
AES-Nummer: 123 +
  +
Deklaration: int16_t shel_put ( int8_t *sh_paddr, uint16_t sh_plen ); +
  +
Beschreibung: Die Funktion schreibt in den Environment-Speicher des AES. Es +gilt: +
  +

+
+ + + + + + + + + + + + +
ParameterBedeutung
sh_paddrAdresse des Quellpuffers
sh_plenAnzahl der zu schreibenden Zeichen
+
+ +
Hinweis: Das Desktop nutzt diesen Speicher zur +Aufbewahrung der DESKTOP.INF bzw. NEWDESK.INF Datei. Das Format dieser +Dateien ist allerdings nicht offiziell dokumentiert. Eine +aktuelle Beschreibung findet sich jedoch in newdesk.hyp. +
  +
Die zulässige Länge des Puffers liegt seit MagiC 3 zwischen +4192 und 65534 Bytes, während sie in ganz alten TOS-Versionen noch +bei 1024 Bytes lag. +
  +
Prior to AES version 4.0 this function would only copy as many +bytes as would fit into the current buffer. As of version 4.0, the AES +will dynamically allocate more memory as needed (up to 32767 bytes) +for the shell buffer. +
  +
Ergebnis: Ein Rückgabewert von Null signalisiert einen Fehler. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Shell-Kommunikation +
  +
Querverweis: Binding   shel_get   shel_envrn   shel_find +
  + +
+ +

8.22.5.1 Bindings für shel_put

+ + + + + + + + + +
C: int16_t shel_put ( int8_t *sh_paddr, uint16_t sh_plen ); +
  +
Umsetzung: +
  +
int16_t shel_put (int8_t *sh_paddr, uint16_t sh_plen)
+{
+   int_in[0]  = sh_plen;
+   addr_in[0] = sh_paddr;
+
+   return ( crys_if(123) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]123 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]sh_plen
addr_inaddr_in[0]sh_paddr
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.22.6 shel_rdef

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Shell read default« - Default Programm abfragen +
  +
AES-Nummer: 126 +
  +
Deklaration: void shel_rdef ( int8_t *lpcmd, int8_t *lpdir ); +
  +
Beschreibung: Die Funktion erlaubt es, das Programm zu erfragen, welches nach +Beendigung des aktuellen gestartet wird (i.d.R. der Desktop). +
  + + + + + + + + + +
Parameter Bedeutung +
  +
lpcmd Zeiger auf einen ausreichend dimensionierten String für den +Namen der Applikation. +
  +
lpdir Zeiger auf einen ausreichend dimensionierten String für den +Pfad der Applikation. +
  + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Das Binding von N.AES sieht einen Rückgabewert vor. Im +Erfolgsfall liefert es 1, bei einem Fehler 0. +
  +
Verfügbar: Unter PC-GEM steht die Funktion ab Version 2.0 zur Verfügung. +Ansonsten in KAOS 1.4.2, MagiC und N.AES. Das Vorhandensein dieser +Funktion kann per appl_getinfo (Opcode 5) festgestellt werden. +
  +
Gruppe: Shell-Kommunikation +
  +
Querverweis: Binding   shel_wdef   MagiC +
  + +
+ +

8.22.6.1 Bindings für shel_rdef

+ + + + + + + + + +
C: void shel_rdef ( int8_t *lpcmd, int8_t *lpdir ); +
  +
Umsetzung: +
  +
void shel_rdef (int8_t *lpcmd, int8_t *lpdir)
+{
+   addr_in[0] = lpcmd;
+   addr_in[1] = lpdir;
+
+   crys_if(126);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]126 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]lpcmd
addr_in+4addr_in[1]lpdir
+
+ + +
+ +

8.22.7 shel_read

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Shell read« - liest die Kommandozeilen-Parameter der +Applikation. +
  +
AES-Nummer: 120 +
  +
Deklaration: int16_t shel_read ( int8_t *sh_rpcmd, int8_t *sh_rptail ); +
  +
Beschreibung: Die Funktion ermittelt den Namen und die Kommandozeile, mit der +eine Applikation gestartet wurde. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
sh_rpcmd vollständiger Pfadname mit Programmname +
sh_rptail Kommandozeile (gemäß Pexec, also nullterminiert und mit +Längenangaben im ersten Byte) + +
+ +
Hinweis: Die Funktion arbeitet nur dann korrekt, wenn +die Applikation per shel_write gestartet worden ist. Daher sollte man +im Zweifelsfall auf die Werte der Basepage zurückgreifen. +
  +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Shell-Kommunikation +
  +
Querverweis: Binding   shel_write   Pexec +
  + +
+ +

8.22.7.1 Bindings für shel_read

+ + + + + + + + + +
C: int16_t shel_read ( int8_t *sh_rpcmd, int8_t *sh_rptail ); +
  +
Umsetzung: +
  +
int16_t shel_read (int8_t *sh_rpcmd, int8_t *sh_rptail)
+{
+   addr_in[0] = sh_rpcmd;
+   addr_in[1] = sh_rptail;
+
+   return ( crys_if(120) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]120 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]sh_rpcmd
addr_in+4addr_in[1]sh_rptail
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.22.8 shel_wdef

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Shell write default« - Default Programm setzen +
  +
AES-Nummer: 127 +
  +
Deklaration: void shel_wdef( int8_t *lpcmd, int8_t *lpdir ); +
  +
Beschreibung: Die Funktion erlaubt es, die Applikation festzulegen, welche +als Default-Programm anzusehen ist (normalerweise der Desktop). +
  +
Hinweis zu MagiC: Sind die Parameter lpcmd und +lpdir Leerstrings, so wird MAGXDESK wieder installiert. Ein +alternatives Desktop macht zum Programmstart einfach ein shel_write, +und beendet sich dann per Pterm0 es bekommt von MagiC eine +Kommandozeile (SHELTAIL), die per shel_read ermittelt werden kann. +Gibt die Shell einen negativen Fehlercode zurück, so wird MAGXDESK +aktiviert. +
  +
Hinweis zu N.AES: Sind die Parameter lpcmd +und/oder lpdir Leerstrings oder NULL, wird die in N_AES.CNF +angegebene 'shell' Applikation gestartet. +
+
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Das Binding von N.AES sieht einen Rückgabewert vor. Dieser ist +hier immer 1. +
  +
Verfügbar: Unter PC-GEM steht die Funktion ab Version 2.0 zur Verfügung. +Ansonsten in KAOS 1.4.2, MagiC und N.AES. Das Vorhandensein dieser +Funktion kann per appl_getinfo (Opcode 5) festgestellt werden. +
  +
Gruppe: Shell-Kommunikation +
  +
Querverweis: Binding   shel_rdef   MagiC +
  + +
+ +

8.22.8.1 Bindings für shel_wdef

+ + + + + + + + + +
C: void shel_wdef( int8_t *lpcmd, int8_t *lpdir ); +
  +
Umsetzung: +
  +
int16_t shel_wdef(int8_t *lpcmd, int8_t *lpdir)
+{
+   addr_in[0] = lpcmd;
+   addr_in[1] = lpdir;
+
+   crys_if(127);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]127 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]lpcmd
addr_in+4addr_in[1]lpdir
+
+ + +
+ +

8.22.9 shel_write

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Shell write« - startet eine andere Applikation. +
  +
AES-Nummer: 121 +
  +
Deklaration: int16_t shel_write ( int16_t sh_wdoex, int16_t sh_wisgr, +int16_t sh_wiscr, int8_t *sh_wpcmd, int8_t *sh_wptail ); +
  +
Beschreibung: Die Funktion ermöglicht das Starten eines anderen Programms. +Ab AES-Version 4.0 wurde diese Funktion stark erweitert. So lassen +sich nun auch Aufgaben wie ein Herunterfahren des Systems (Shutdown), +ein Auflösungswechsel, AES-Broadcasting und andere Dinge realisieren. +
  +
Der Parameter sh_wdoex bestimmt die auszuführende +Aktion, die restlichen Parameter sind im wesentlichen von +sh_wdoex abhängig. Es gilt: +
  + + + + + + + + + + + + + + + + + + +
sh_wdoex Bedeutung +
    +
0 Applikation starten +
Der Wert des Parameters sh_wisgr (Starten im Grafikmodus, +ja oder nein) wird automatisch vom AES gesetzt, indem die +File-Extension mit den Inhalten der AES-Environmentvariablen GEMEXT, +TOSEXT und ACCEXT verglichen wird. +
1 Applikation im GEM/TOS Modus starten +
Der Parameter sh_wisgr legt dabei den Modus fest, in dem +das Programm gestartet werden soll. Es gilt: + + + + + + +
sh_wisgr = 0: als TOS-Programm starten +
sh_wisgr = 1: als GEM-Programm starten + +
+ +
2 reserviert +
3 Accessorie starten +
Ein Programm soll als Accessorie gestartet werden. + +
+ +
In den Parametern sh_wpcmd und sh_wptail sind +dabei der Name des zu startenden Programms bzw. ein Zeiger auf die +Kommandozeile zu übergeben. Als Default-Verzeichnis wird dabei das +Verzeichnis gewählt, in dem sich das zu startende Programm befindet +(Ausnahme: erweiterter Modus mit gesetztem Bit-10, s.u.). +
  +
Die Funktion liefert die AES-ID des gestarteten Prozesses +zurück. Ein Wert von 0 zeigt in diesem Zusammenhang einen Fehler an. +Über den Parameter sh_wiscr kann spezifiziert werden, ob +Parameter per ARGV an das gestartete Programm übergeben +werden sollen. Es gilt: +
  +
sh_wiscr = 0: ARGV-Verfahren nicht benutzen +
sh_wiscr = 1: ARGV-Verfahren benutzen +
  + +
Unter MagiC kann hingegen angegeben werden, ob ein Programm im +Single-Modus (oder parallel) gestartet werden soll. Es gilt: +
  +
sh_wiscr = 100: Programm parallel ausführen +
Die neue Applikation erbt alle Standardpfade und -dateien von der +aktuellen Applikation. Ein Fehlercode wird nur dann zurückgeliefert, +falls bereits beim Einrichten ein Speicherplatzmangel aufgetreten ist; +eine Benachrichtung beim Beenden der neuen Applikation +(Death-of-Child) existiert nicht (*). +
  + +
sh_wiscr = 101: Programm im Single-Modus ausführen +
Dieser Modus entspricht sh_wiscr mit dem Wert 1, mit der +Ausnahme, daß vor Aufruf des Programms alle Applikationen außer +denjenigen mit ID-0 und ID-1 (SCRENMGR) eingefroren werden. Die +Programme werden nach Beendigung des Programms wieder aufgetaut, wenn +dieses nicht seinerseits einen neuen shel_write-Aufruf mit Singlemode +Charakter ausgeführt hat. Das genaue Kochrezept für den +Single-Modus lautet: +
  +
    +
  • sicherstellen, daß man die Applikation mit ID-0 ist +
  • +
  • Pfade und Laufwerk für das neue Programm setzen +
  • +
  • shel_write (TRUE, sh_wisgr, 101, sh_wpcmd, sh_wptail) +
  • +
  • wichtige Einstellungen in Datei/Shell-Puffer sichern +
  • +
  • appl_exit, v_clsvwk, Pterm0 ausführen +
  • +
+ +
Beachtet werden sollte noch, daß ab MagiC 2 im Single-Modus +die aktuellen Pfade des Aufrufers an den Parent und damit an das neue +Programm übergeben werden. Die Pfade des Aufrufers sind anschließend +zerstört, was aber unkritisch ist, da dieser auf den shel_write i.a. +ein Pterm folgen läßt (*). +
  +
Im erweiterten Modus, kann über spezielle Bits des +Parameters sh_wdoex das Starten von Programmen weiter +spezifiziert werden. Das Low-Byte bleibt dabei unangetastet, und für +das High-Byte gilt: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
sh_wdoex BitBedeutung
8Wert von Psetlimit ist gültig
9Wert von Prenice ist gültig
10Default-Verzeichnis ist gültig
11Environment-String ist gültig
12Benutzer-ID ist gültig
13Group-ID ist gültig
14reserviert
15reserviert (siehe XSHD_FLAGS)
+
+ +
In diesem erweiterten Modus wird der Parameter sh_wpcmd +als Zeiger auf eine SHELW-Struktur aufgefaßt. Jedem der o.g. Bits ist +dabei ein Element dieser Struktur zugewiesen, der gültig ist, wenn +das entsprechende Bit gesetzt ist. Die Menge der Werte ist +folgendermaßen belegt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Element Bedeutung +
    +
[0] Zeiger auf den Namen des Programms. Muss immer gesetzt werden. +
[1] Wert von Psetlimit (Bit-8) +
[2] Wert von Prenice (Bit-9) +
[3] Zeiger auf das Default-Verzeichnis. +
Ein Nullzeiger bedeutet in diesem Zusammenhang, daß als +Default-Verzeichnis dasjenige gewählt wird, indem sich das zu +startende Programm befindet. (Bit-10) +
[4] Zeiger auf das Environment der Applikation (Bit-11) +
[5] Neue User-ID für die Applikation (Bit-12) +
[6] Neue Group-ID für die Applikation (Bit-13) + +
+ +
Hinweis: Die Elemente [1],[2] und [3] werden bis MagiC +3 ignoriert; Element [1] wird jedoch ab MagiC 4 unterstützt. Das +Default-Verzeichnis wird unter MagiC viel einfacher gesetzt, denn das +neue Programm erbt alle Pfade auf allen Laufwerken vom aufrufenden +Programm. +
Bei Geneva wird nur Bit 8 beachtet. +
  +
Hinweis: In MagiC 6 haben die Felder mit der Benutzer-ID +und der Gruppen-ID eine andere Bedeutung. +
  +
In neueren AES-Versionen stehen darüber hinaus die +folgenden Modi zur Verfügung. +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
sh_wdoex Bedeutung +
  +
    +
  + +
4 Shutdown-Modus setzen +
Dieses Kommando versetzt das System in Abhängigkeit des +Parameters sh_wiscr in den Normal bzw. Shutdown Modus. Es +gilt: +
  + + + + + + + + + + + + + + + + + + + + + +
sh_wiscr Bedeutung +
    +
-1 Das AES startet ein kleines Programm mit verschiedenen Shutdown +Optionen. Seit MyAES 0.96. + +
 0 Shutdown Sequenz abbrechen +
Ein begonnener Shutdown kann nur von dem Prozess beendet werden, +der diese Sequenz auch gestartet hat. + +
 1 Partieller Shutdown +
Mit Ausnahme des Aufrufers werden alle Applikationen vom AES +daraufhin überprüft, ob sie die Meldung AP_TERM verstehen. Wenn dies +der Fall ist, schickt das AES die Meldungen AP_TERM bzw. AC_CLOSE an +die Programme bzw. Accessories. Der Aufrufer erhält keine dieser +Meldungen. + +
 2 Vollständiger Shutdown +
Mit Ausnahme des Aufrufers werden alle Applikationen und +Accessories vom AES daraufhin überprüft, ob sie die Meldung AP_TERM +verstehen. Wenn dies der Fall ist, schickt das AES die Meldungen +AP_TERM bzw. AC_CLOSE an die Programme bzw. Accessories. Accessories +erhalten die AP_TERM Nachricht zusätzlich nach Erhalt der AC_CLOSE +Message. Der Aufrufer erhält keine dieser Meldungen. +
 3 Kaltstart +
Seit MyAES 0.96. + +
+ +
In N.AES gibt es einen erweiterten Aufruf: +
shel_write(4, shutart, 0, &ignorant, NULL); +
  +
ignorant ist hierbei ein Integer, dessen Adresse als +vierter Parameter des shel_write-Aufrufs übergeben wird. Im +Fehlerfall ist der Rückgabewert der Funktion shel_write wie bisher 0, +zusätzlich wird jedoch in ignorant die Applikations-ID (apid) +der Applikation hinterlegt, die AP_TERM nicht verstanden hat bzw. -1, +wenn bereits ein Shutdown läuft oder -2, wenn ungültige Parameter +übergeben wurden. +
  + +
5 Auflösungswechsel +
Die Applikation fordert das AES auf, die Auflösung zu +wechseln. Falls das AES dem Wechsel zustimmt, versucht es, das +System herunterzufahren (Shutdown). Die aktiven Applikationen können +sich nun entweder beenden, oder durch eine AP_TFAIL Nachricht dem AES +mitteilen, daß sie hierzu nicht in der Lage sind. Die Parameter +sh_wisgr und sh_wiscr sind dabei voneinander +abhängig. Es gilt: +
  + + + + + + + + + + + + + + + +
sh_wiscr Bedeutung +
    +
0 Der Parameter sh_wisgr ist die ID des physikalischen +Gerätes, auf dem der Open-Workstation Aufruf des VDI ausgeführt +wird. Die aktuelle physikalische Gerätenummer kann wie üblich per +Getrez() + 2 ermittelt werden; es stehen folgende Werte zur +Verfügung: +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
2=ST-Low(320*200)
3=ST-Medium(640*200)
4=ST-High(640*400)
6=TT-Medium(640*480)
8=TT-High(1280*960)
9=TT-Low(320*480)
+
+ +
1 Der Parameter sh_wisgr ist das int16_t für den +Video-Modus des Falcon. +
>2 für zukünftige Zwecke reserviert + +
+ +
In N.AES gibt es einen erweiterten Aufruf: +
shel_write(5, vmode, falconflag, &ignorant, NULL); +
Da ein Auflösungswechsel intern zunächst immer einen +vollständigen Shutdown startet, kann es auch hier geschehen, daß +nicht alle Anwendungen AP_TERM verstehen und der Auflösungswechsel +somit frühzeitig fehlschlägt. Analog zur obigen Modus-4-Erweiterung +wird auch hier die Applikations-ID eines Verständnislosen in +ignorant hinterlegt, eine -1, wenn bereits ein Shutdown läuft +oder -2, wenn fehlerhafte Parameter (z.B. unerlaubte Auflösungen) +übergeben wurden. +
  +
6 unbekannt +
  + + +
7 AES-Broadcasting +
Die Applikation möchte eine Nachricht an alle anderen im System +vorhandenen Applikationen schicken. Als Empfänger ausgenommen sind +nur das AES, der Screen-Manager, sowie der Absender der Nachricht +selbst. +
  +
Der Parameter sh_wpcmd ist ein Zeiger auf einen 16 Bytes +großen Nachrichtenpuffer, der die zu sendenden Daten enthält. +
  + + +
8 Manipulation des AES-Environments +
Dieses Kommando erlaubt die Modifikation des AES-Environments. Der +Parameter sh_wisgr beschreibt die gewünschte Aktion. Es gilt: +
  + + + + + + + + + + + + + + + +
sh_wisgr Bedeutung +
    +
0 Größe des Environment-Puffers erfragen. Diese wird +als Funktionsergebnis zurückgeliefert. +
1 Einfügen/Entfernen von Strings. Der Parameter +sh_wpcmd ist ein Zeiger auf den Environment-String. Die Syntax +zum Einfügen bzw. Entfernen lautet 'NEW=STRING\0' bzw. 'NEW=\0'. +
2 Inhalt des Environment-Puffers kopieren. Der Parameter +sh_wpcmd ist ein Zeiger auf den aufnehmenden Puffer, der eine +Größe von sh_wiscr Bytes besitzt. Die Funktion liefert die +Anzahl der Bytes zurück, die nicht kopiert werden konnten. + +
+ +
9 Unterstützte Nachrichten anzeigen +
Die Applikation teilt dem AES mit, welche (neuen) Nachrichten +verstanden werden. Dies geschieht über gesetzte Bits des Parameters +sh_wisgr. +
  + + + + + + + +
Bit 0: AP_TERM +
Bit 1: NM_INHIBIT_HIDE (since XaAES 2005-01-16) +
Schützt eine Application davor versteckt zu werden. Nützlich +für Desktop Utillity wie Taskbar oder StartMe Up. + +
+ +
Alle anderen Bits (2-15) sind z.Zt. nicht definiert. +
  +
10 Nachricht an AES senden +
Die Applikation will eine Nachricht an das AES schicken. Der +Parameter sh_wpcmd ist ein Zeiger auf den 16 Bytes großen +Nachrichtenpuffer. +
  +
+
Geneva
+
+

A program can cause a windowed dialog to scroll by sending a +WM_ARROWED message to Geneva. Example: +
  +

int16_t msg[8];
+
+msg[0] = WM_ARROWED;
+msg[3] = window_handle;
+msg[4] = WA_UPPAGE;
+shel_write( SWM_AESMSG, 0, 0,
+            (int8_t *)msg, 0L );
+
+

+ +
+
N.AES
+
+

N.AES kann insgesamt beendet werden und so zu einer Textshell +zurückkehren, aus der heraus es gestartet wurde. +
  +

/*
+ * Auslösen eines Systemshutdowns nach
+ * erfolgreichem Abschluss eines
+ * "normalen" Shutdowns:
+ */
+
+#define AP_AESTERM    52
+
+void TerminateNAES(void)
+{
+    int     msg[8];
+    msg[0] = AP_AESTERM;
+    shel_write(SWM_AESMSG, 0, 0, (char *)msg, NULL);
+}
+
+

+ +
+
+ +
20 Neuen Thread erzeugen +
Mit diesem Opcode kann die Applikation einen neuen Thread +erzeugen. Dabei gilt: +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
sh_wisgr + + + + + + + + + +
0 = Starte Programm im VT52 Fenster der Applikation, falls eines +geöffnet ist. +
1 = öffne kein neues Fenster +
2 = öffne neues VT52-Fenster + +
+ +
sh_wiscr 0 +
sh_wpcmd Zeiger auf THREADINFO-Struktur +
sh_wptail Parameter vom Typ (void *) für die Thread-Funktion. + +
+ +
Bei einem erfolgreichen Aufruf wird als Ergebnis die +Applikations-ID des neuen Threads zurückgeliefert (*). +
  + +
21 Thread beenden +
Mit diesem Opcode kann sich ein Thread selbst beenden. Dazu setzt +man die Parameter sh_wisgr sh_wiscr und +sh_wptail auf die Werte 0 bzw. NULL; über sh_wpcmd +kann ein zurückzuliefernder Fehlercode angegeben werden. +
  +
Normalerweise ist ein Ausführen dieser Funktion nicht +notwendig, da sich der Thread automatisch mit dem Ende seiner Prozedur +(d.h. mit dem CPU-Befehl RTS) selbst beendet. Wichtig: Wenn +der Thread einen Pexec-Aufruf durchgeführt hat, so muss zuerst der +laufende Prozess per Pterm beendet werden, bevor sich der Thread +beenden kann (*). +
  +
22 Thread terminieren +
Mit diesem Opcode kann ein Thread auch vom Hauptprogramm beendet +werden. Dazu übergibt man im Parameter sh_wiscr die +Applikations-ID des Thread, und setzt die übrigen Parameter auf den +Wert 0 bzw. NULL. +
  +
Normalerweise ist diese Funktion nicht notwendig, da mit dem +Beenden des Hauptprogramms automatisch auch alle zugehörigen Threads +beendet werden. Die Funktion wurde erfolgreich ausgeführt, wenn als +Ergebnis der Wert 1 zurückgeliefert wird. Zu beachten ist jedoch, +daß für den Fall, daß der Thread inzwischen ein Pexec ausgeführt +hat, nur dieses Programm per Pterm (EBREAK) beendet wird; der Thread +selbst ist erst dann beendet, wenn der Aufrufer ein THR_EXIT empfangen +hat (*). +
  + +
224 Run an application (Geneva since Release 004) +
Run an application, letting Geneva determine the type. This is +identical to mode 0, except that the XSHD_FLAGS bit of sw_doex +can also be set (see below). +
  + +
225 Run an application (Geneva since Release 004) +
This is identical to mode 1, except that the XSHD_FLAGS bit of +sw_doex can also be set. +
  + +
227 Run a desk accessory. (Geneva since Release 004) +
This is identical to mode 3, except that the XSHD_FLAGS bit of +sw_doex can also be set. +
  +
When XSHD_FLAGS (1<<15) is added to the sw_doex, +this means that the last longword of the SHWRCMD passed in the +sh_wpcmd parameter contains the Geneva program flags to use +when executing the application. +
It is strongly recommended that a program using XSHD_FLAGS inquire +the current flags for the application and only change the ones it +needs to change, rather than making most of the flags zero or some +other random value. See the x_appl_flags section, below, for an +example. +
  + +
+ +
Hinweis: Ab MagiC 3 stehen die folgenden Besonderheiten +zur Verfügung: +
  +
    +
  • Wird in sh_wptail eine Zeichenkette übergeben, die mit +dem Wert 255 beginnt und mit '\0' abgeschlossen ist, wird die +tatsächliche Länge der Kommandozeile vom AES bestimmt und in ganzer +Länge ans DOS weitergereicht. Das DOS konstruiert hieraus einen +ARGV-Parameter im Environment. Ist die Kommandozeile kürzer als 127 +Bytes, wird sie über Basepage und per shel_read übergeben, ansonsten +besteht sie nur aus dem Byte mit dem Wert 127. +
      +

  • +
  • Wird in sh_wptail eine Zeichenkette übergeben, die mit +dem Wert 254 beginnt, erwartet das AES dahinter die Zeichenkette +"ARGV=irgendwas" und eine durch '\0' getrennte und durch +"\0\0" abgeschlossene Liste von Parametern. Diese wird +vollständig dem DOS übergeben, das daraus einen ARGV-Parameter +konstruiert. Ist die Kommandozeile kürzer als 127 Bytes, wird sie +über Basepage und per shel_read übergeben, wobei die Nullbytes durch +Leerstellen ersetzt werden, ansonsten besteht sie nur aus dem Byte mit +dem Wert 127. +
      +

  • +
+ +
Das Vorhandensein der zusätzlichen Features kann per appl_getinfo +(Opcode 10) erfragt werden. +
  +
Die mit (*) gekennzeichneten Opcodes von shel_write stehen z.Zt. +nur in MagiC zur Verfügung. +
  + +
Achtung: Startet man einen neuen AES-Prozeß unter +Single-TOS mit shel_write wird dieser aber erst nach Beendigung des +eigenen Prozesses gestartet. +
  +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Verfügbar: In allen AES Versionen. +
  +
Gruppe: Shell-Kommunikation +
  +
Querverweis: Binding   Shutdown Mechanismus   Threads in MagiC +
  + +
+ +

8.22.9.1 Bindings für shel_write

+ + + + + + + + + +
C: int16_t shel_write ( int16_t sh_wdoex, int16_t sh_wisgr, +int16_t sh_wiscr, int8_t *sh_wpcmd, int8_t *sh_wptail ); +
  +
Umsetzung: +
  +
int16_t shel_write (int16_t sh_wdoex, int16_t sh_wisgr,
+                    int16_t sh_wiscr, int8_t *sh_wpcmd,
+                    int8_t *sh_wptail)
+{
+   int_in[0]  = sh_wdoex;
+   int_in[1]  = sh_wisgr;
+   int_in[2]  = sh_wiscr;
+   addr_in[0] = sh_wpcmd;
+   addr_in[1] = sh_wptail;
+
+   return ( crys_if(121) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]121 # Opcode der Funktion
control+2control[1]3 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]sh_wdoex
int_in+2int_in[1]sh_wisgr
int_in+4int_in[2]sh_wiscr
addr_inaddr_in[0]sh_wpcmd
addr_in+4addr_in[1]sh_wptail
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.22.10 x_shel_get

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Shell get« - Read information from GENEVA.CNF. +
  +
AES-Nummer: 29057 +
  +
Deklaration: int16_t x_shel_get ( int16_t mode, int16_t length, int8_t *buf +); +
  +
Beschreibung: +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
    +
mode + + + + + + + + + + + + + + + + +
-1 Re-read Geneva's settings +
 0 Open GENEVA.CNF +
 1 Read a line +
 2 Close GENEVA.CNF + +
+ +
length Number of bytes to read into buf. +
buf Product string (mode 0) or buffer to read length bytes +of data into (mode 1). + +
+ +
This function will cause Geneva to either re-read all of its own +internal settings, or read the settings from an outside program's +portion of GENEVA.CNF. +
  +
When mode is X_SHLOADSAVE (-1), Geneva will re-read all of its +internal settings. The length and buf parameters are not used in this +mode. The Task Manager's "Load Settings" option uses this. +
  +
In order to read its own settings, a program must begin by using +mode X_SHOPEN (0) to open GENEVA.CNF. The name passed in buf can +contain any character (including uppercase and punctuation) except the +[ or ] characters. The length parameter is not used in this mode. +
  +
If the X_SHOPEN was successful, the program can then make +repeated calls using the X_SHACCESS (1) mode. Here, length specifies +the maximum number of bytes to read into the string buffer buf. The +x_sscanf function is very helpful for retreiving formatted data that +has been read with x_shel_get. +
  +
If an error occurs at any time during the open or read phases +(or if the program's section of GENEVA.CNF ends), the file is +automatically closed. If a program wants to end the reading sooner, it +must use mode X_SHCLOSE (2) to close the file. Otherwise, any future +attempts to read from the file will fail. +
  +
Example: +
  +
int sh_error( int err )
+{
+  switch(err) {
+     case -2:
+       Cconws( "Disk error" );
+     return 1;
+     case -1:
+       Cconws( "GENEVA.CNF is already in use by another program" );
+     return 1;
+     case 0:
+       Cconws( "Read failed unexpectedly" );
+     return 1;
+     default:
+     return 0;
+  }
+}
+
+main() {
+  char buffer[100];
+  int version, number1, number2;
+
+  if( !sh_error( x_shel_get(X_SHOPEN,0,"My Program") ) )
+     if( !sh_error( x_shel_get(X_SHACCESS,sizeof(buffer),buffer) ) )
+     {
+       x_sscanf( buffer, "%v", &version );
+       if( version != 0x200 ) {
+          Cconws( "Not compatible with version 2.0!" );
+          x_shel_get( X_SHCLOSE, 0, 0L );
+          return;
+       }
+       if( !sh_error( x_shel_get(X_SHACCESS,sizeof(buffer),
+          buffer) ) )
+       x_sscanf( buffer, "%x %d", number1, number2 );
+       x_shel_get( X_SHCLOSE, 0, 0L );
+     }
+}
+
+
Ergebnis: +
  + + + + + + + + + + + + + + + +
-3 Incorrect GENEVA.CNF version (mode -1) +
-2 Disk error +
-1 Already in use (mode 0) +
 0 End of data or string not found +
 1 Kein Fehler + +
+ +
Verfügbar: Die Funktion steht nur unter Geneva zur Verfügung. +
  +
Gruppe: Shell-Kommunikation +
  +
Querverweis: Binding +
  + +
+ +

8.22.10.1 Bindings für x_shel_get

+ + + + + + + + + +
C: int16_t x_shel_get ( int16_t mode, int16_t length, int8_t *buf +); +
  +
Umsetzung: +
  +
int16_t x_shel_get ( int16_t mode, int16_t length, int8_t *buf
+)
+{
+   int_in[0] = mode;
+   int_in[1] = length;
+   addr_in[0] = buf;
+
+   crys_if(29057);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]29057 # Opcode der Funktion
control+2control[1]2 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]getset
int_in+2int_in[1]length
addr_inaddr_in[0]buf
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.22.11 x_shel_put

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Shell put« - Save a program's own settings, or Geneva's +settings, to GENEVA.CNF. +
  +
AES-Nummer: 29058 +
  +
Deklaration: int16_t x_shel_put ( int16_t mode, int8_t *buf ); +
  +
Beschreibung: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
    +
mode + + + + + + + + + + + + +
-1 Save Geneva's settings +
 0 Write a line +
 1 Read a line +
 2 Close GENEVA.CNF + +
+ +
buf Null-terminated string to write + +
+ +
When mode is X_SHLOADSAVE (-1), Geneva will save all of its +internal settings. The length and buf parameters are not used in this +mode. +
  +
The Task Manager's Save Settings option uses this. +
  +
In order to save its own settings, a program must begin by using +mode X_SHOPEN (0) to open GENEVA.CNF. The name passed in buf can +contain any character (including uppercase and punctuation) except the +[ or ] characterli The length parameter is not used in this mode. +
  +
If the X_SHOPEN was successful, the program can then make +repeated calls using the X_SHACCESS (1) mode. Here, buf points to a +null-terminated string to write. The string should be no more than 80 +characters of readable text, and must not include the [ or ] +characters. If the firss character of the string is a semi-colon +";", it will be treated as a comment when read by +x_shel_get. The x_sprintf function is very helpful for formatting data +for x_shel_put; +
  +
If an error occurs at any time during the open or write phases +the file is automatically closed. If no errors occur, the program must +use mode X_SHCLOSE (2) to close the file. Otherwise, any future +attempts to write to the file will fail. +
  +
Ergebnis: +
  + + + + + + + + + + + + +
-2 Disk error +
-1 Already in use (mode 0) +
 0 File not open or incorrect mode +
 1 Kein Fehler + +
+ +
Verfügbar: Die Funktion steht nur unter Geneva zur Verfügung. +
  +
Gruppe: Shell-Kommunikation +
  +
Querverweis: Binding +
  + +
+ +

8.22.11.1 Bindings für x_shel_put

+ + + + + + + + + +
C: int16_t x_shel_put ( int16_t mode, int8_t *buf ); +
  +
Umsetzung: +
  +
int16_t x_shel_put ( int16_t mode, int8_t *buf )
+{
+   int_in[0] = mode;
+   addr_in[0] = buf;
+
+   crys_if(29058);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]29058 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]getset
addr_inaddr_in[0]buf
int_outint_out[0]Return-Wert
+
+ + +
+ +
+ +Home +AESAES +ResourcefunktionenResourcefunktionen +Erweiterte GrafikfunktionenErweiterte Grafikfunktionen + + diff --git a/de/tc_vdi.html b/de/tc_vdi.html new file mode 100644 index 000000000..c7dbf91b3 --- /dev/null +++ b/de/tc_vdi.html @@ -0,0 +1,2492 @@ + + + + + +Die Anleitung zum TOS: TC-VDI-Funktionen + + + + + + + + + +Home +VDIVDI +RasterfunktionenRasterfunktionen +VDI-FunktionslisteVDI-Funktionsliste + +
+ +

7.12 TC-VDI-Funktionen

+

This library contains a multitude of functions to manage true +color on the MATRIX graphic boards. In all, the following routines are +available in TC-VDI 0.7: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
vq_calibrate Farbkalibrierung testen. +
vq_colors Gets a palette sequence. +
vq_pixcol Gets pixel. +
vq_pixrgb Gets pixel rgb color. +
vrf_rgb Gets fill color values. +
vrl_rgb Gets line color values. +
vrt_rgb Gets text color values. +
vrun_parallel Parallelogram color runs. +
vrun_rect Rectangle color runs. +
vrun_triangle Triangle color runs. +
vs_calibrate Farbkalibration setzen. +
vs_colors Sets a palette sequence. +
vs_pixcol Sets pixel through soft palette. +
vs_pixrgb Sets pixel rgb color. +
vsf_rgb Sets fill color values. +
vsl_rgb Sets line color values. +
vst_rgb Sets text color values. + +
+ +

Querverweis: MATRIX-XBIOS-Erweiterung +

+

7.12.1 vq_colors

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Colors« - RGB Wert einer Farbe ermitteln. +
  +
VDI-Nummer: 65 +
  +
Deklaration: void vq_colors ( int16_t handle, int16_t from, int16_t to, +int16_t set_flag, int16_t *rgb ); +
  +
Beschreibung: Die Funktion ermittelt die RGB-Werte ab dem Farbindex +from zu Farbindex to. Die resultierenden Werte werden +in rgb_table abgelegt. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Nur verfügbar auf MATRIX Karte im TC Modus. +
  +
Gruppe: TC-VDI-Funktionen +
  +
Querverweis: Binding   vs_colors +
  + +
+ +

7.12.2 Bindings für vq_colors

+ + + + + + + + + +
C: void vq_colors ( int16_t handle, int16_t from, int16_t to, +int16_t set_flag, int16_t *rgb ); +
  +
Umsetzung: +
  +
void vq_colors (int16_t handle, int16_t from, int16_t to, int16_t set_flag,
+                int16_t *rgb)
+{
+   intin[0]    = from;
+   intin[1]    = to;
+   intin[2]    = set_flag;
+   intin[3..4] = rgb_table;
+
+   contrl[0] = 65;
+   contrl[1] = 0;
+   contrl[3] = 5;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]65 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]5 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]from
intin+2intin[1]to
intin+4intin[2]set_flag
intin+6intin[3..4]rgb_table
+
+ + +
+ +

7.12.3 vq_pixcol

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Pixel Color Index« - ermittelt die Farbindex eines +Pixels. +
  +
VDI-Nummer: 58 +
  +
Deklaration: void vq_pixcol ( int16_t handle, int16_t x, int16_t y, int16_t +*phys_ix, int16_t *vdi_ix ); +
  +
Beschreibung: Die Funktion ermittelt die eingestellten Farbindex eines Pixels +zu einem bestimmten Punkt. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
x x-Koordinate +
y y-Koordinate +
phys_ix] Farbindex +
vdi_ix VDI-Farbindex + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Nur verfügbar auf MATRIX Karte im TC Modus. +
  +
Gruppe: TC-VDI-Funktionen +
  +
Querverweis: Binding   vs_pixcol +
  + +
+ +

7.12.4 Bindings für vq_pixcol

+ + + + + + + + + +
C: void vq_pixcol ( int16_t handle, int16_t x, int16_t y, int16_t +*phys_ix, int16_t *vdi_ix ); +
  +
Umsetzung: +
  +
void vq_pixcol (int16_t handle, int16_t x, int16_t y, int16_t *phys_ix, int16_t *vdi_ix)
+{
+   ptsin[0] = x;
+   ptsin[1] = y;
+
+   contrl[0] = 58;
+   contrl[1] = 1;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *phys_ix = intout[0];
+   *vdi_ix  = intout[1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]58 # Opcode der Funktion
contrl+2contrl[1]1 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]2 # Einträge in intout
contrl+12contrl[6]handle
ptsinptsin[0]x
ptsin+2ptsin[1]y
intoutintout[0]phys_ix
intout+2intout[1]vdi_ix
+
+ + +
+ +

7.12.5 vq_pixrgb

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Pixel Color Representation« - ermittelt die +Intensität eines Pixels. +
  +
VDI-Nummer: 60 +
  +
Deklaration: void vq_pixrgb ( int16_t handle, int16_t x, int16_t y, int16_t +*rgb ); +
  +
Beschreibung: Die Funktion ermittelt die eingestellten Farbintensitäten +eines Pixels zu einem bestimmten Punkt. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
x x-Koordinate +
y y-Koordinate +
rgb[0] Rotanteil   (in Promille, 0-1000) +
rgb[1] Grünanteil  (in Promille, 0-1000) +
rgb[2] Blaunanteil (in Promille, 0-1000) + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Nur verfügbar auf MATRIX Karte im TC Modus. +
  +
Gruppe: TC-VDI-Funktionen +
  +
Querverweis: Binding   vs_pixrgb +
  + +
+ +

7.12.6 Bindings für vq_pixrgb

+ + + + + + + + + +
C: void vq_pixrgb ( int16_t handle, int16_t x, int16_t y, int16_t +*rgb ); +
  +
Umsetzung: +
  +
void vq_pixrgb (int16_t handle, int16_t x, int16_t y, int16_t *rgb)
+{
+   ptsin[0] = x;
+   ptsin[1] = y;
+
+   contrl[0] = 60;
+   contrl[1] = 1;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   rgb[0] = intout[0];
+   rgb[1] = intout[1];
+   rgb[2] = intout[2];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]60 # Opcode der Funktion
contrl+2contrl[1]1 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]3 # Einträge in intout
contrl+12contrl[6]handle
ptsinptsin[0]x
ptsin+2ptsin[1]y
intoutintout[0..2]rgb[0..2]
+
+ + +
+ +

7.12.7 vrf_rgb

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Fill Color Representation« - ermittelt die +Intensität der Füllfarbe. +
  +
VDI-Nummer: 54 +
  +
Deklaration: void vrf_rgb ( int16_t handle, int16_t *rgb ); +
  +
Beschreibung: Die Funktion ermittelt die eingestellten Farbintensitäten der +Füllfarbe. Es gilt: +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
rgb[0] Rotanteil   (in Promille, 0-1000) +
rgb[1] Grünanteil  (in Promille, 0-1000) +
rgb[2] Blaunanteil (in Promille, 0-1000) + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Nur verfügbar auf MATRIX Karte im TC Modus. +
  +
Gruppe: TC-VDI-Funktionen +
  +
Querverweis: Binding   vrl_rgb   vrt_rgb   vsf_rgb   vsl_rgb   vst_rgb +
  + +
+ +

7.12.8 Bindings für vrf_rgb

+ + + + + + + + + +
C: void vrf_rgb ( int16_t handle, int16_t *rgb ); +
  +
Umsetzung: +
  +
void vrf_rgb (int16_t handle, int16_t *rgb)
+{
+   contrl[0] = 54;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   rgb[0] = intout[0];
+   rgb[1] = intout[1];
+   rgb[2] = intout[2];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]54 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]3 # Einträge in intout
contrl+12contrl[6]handle
intoutintout[0..2]rgb[0..2]
+
+ + +
+ +

7.12.9 vrl_rgb

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Polyline Color Representation« - ermittelt die +Intensität der Linienfarbe. +
  +
VDI-Nummer: 56 +
  +
Deklaration: void vrl_rgb ( int16_t handle, int16_t *rgb ); +
  +
Beschreibung: Die Funktion ermittelt die eingestellten Farbintensitäten der +Linienfarbe. Es gilt: +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
rgb[0] Rotanteil   (in Promille, 0-1000) +
rgb[1] Grünanteil  (in Promille, 0-1000) +
rgb[2] Blaunanteil (in Promille, 0-1000) + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Nur verfügbar auf MATRIX Karte im TC Modus. +
  +
Gruppe: TC-VDI-Funktionen +
  +
Querverweis: Binding   vrf_rgb   vrt_rgb   vsf_rgb   vsl_rgb   vst_rgb +
  + +
+ +

7.12.10 Bindings für vrl_rgb

+ + + + + + + + + +
C: void vrl_rgb ( int16_t handle, int16_t *rgb ); +
  +
Umsetzung: +
  +
void vrl_rgb (int16_t handle, int16_t *rgb)
+{
+   contrl[0] = 56;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   rgb[0] = intout[0];
+   rgb[1] = intout[1];
+   rgb[2] = intout[2];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]56 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]3 # Einträge in intout
contrl+12contrl[6]handle
intoutintout[0..2]rgb[0..2]
+
+ + +
+ +

7.12.11 vrt_rgb

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Graphic Text Color Representation« - ermittelt die +Intensität der Textfarbe. +
  +
VDI-Nummer: 55 +
  +
Deklaration: void vrt_rgb ( int16_t handle, int16_t *rgb ); +
  +
Beschreibung: Die Funktion ermittelt die eingestellten Farbintensitäten der +Textfarbe. Es gilt: +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
rgb[0] Rotanteil   (in Promille, 0-1000) +
rgb[1] Grünanteil  (in Promille, 0-1000) +
rgb[2] Blaunanteil (in Promille, 0-1000) + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Nur verfügbar auf MATRIX Karte im TC Modus. +
  +
Gruppe: TC-VDI-Funktionen +
  +
Querverweis: Binding   vrf_rgb   vrl_rgb   vsf_rgb   vsl_rgb   vst_rgb +
  + +
+ +

7.12.12 Bindings für vrt_rgb

+ + + + + + + + + +
C: void vrt_rgb ( int16_t handle, int16_t *rgb ); +
  +
Umsetzung: +
  +
void vrt_rgb (int16_t handle, int16_t *rgb)
+{
+   contrl[0] = 55;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   rgb[0] = intout[0];
+   rgb[1] = intout[1];
+   rgb[2] = intout[2];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]55 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]3 # Einträge in intout
contrl+12contrl[6]handle
intoutintout[0..2]rgb[0..2]
+
+ + +
+ +

7.12.13 vrun_parallel

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Parallelogram Color Run« - Parallelogram color run. +
  +
VDI-Nummer: 62 +
  +
Deklaration: void vrun_parallel ( int16_t handle, int16_t *pts, int16_t +*rgbs ); +
  +
Beschreibung: Zur Definition des Parallelogramms sind nur drei Punkte +erforderlich. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
pts[0] x-Koordinate +
pts[1] y-Koordinate des Eckpunktes +
pts[2] x-Koordinate +
pts[3] y-Koordinate eines zweiten Punktes +
pts[4] x-Koordinate +
pts[5] y-Koordinate eines dritten Punktes +
rgbs RGB-Farbintensität, für jeden Punkt + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Nur verfügbar auf MATRIX Karte im TC Modus. +
  +
Gruppe: TC-VDI-Funktionen +
  +
Querverweis: Binding   vrun_rect   vrun_triangle +
  + +
+ +

7.12.14 Bindings für vrun_parallel

+ + + + + + + + + +
C: void vrun_parallel ( int16_t handle, int16_t *pts, int16_t +*rgbs ); +
  +
Umsetzung: +
  +
void vrun_parallel (int16_t handle, int16_t *pts, int16_t *rgbs)
+{
+   ptsin[0..5] = pts[0..5];
+
+   intin[0..11] = rgbs[0..11];
+
+   contrl[0] = 62;
+   contrl[1] = 3;
+   contrl[3] = 12;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]62 # Opcode der Funktion
contrl+2contrl[1]3 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]12 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0..11]rgbs[0..11]
ptsinptsin[0..5]pts[0..5]
+
+ + +
+ +

7.12.15 vrun_rect

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Rectangle Color Run« - Rectangle color run. +
  +
VDI-Nummer: 61 +
  +
Deklaration: void vrun_rect ( int16_t handle, int16_t *pts, int16_t *rgbs ); +
  +
Beschreibung: Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
pts[0] x-Koordinate +
pts[1] y-Koordinate des Eckpunktes +
pts[2] x-Koordinate +
pts[3] y-Koordinate der diagonal gegenüber liegenden Ecke +
rgbs RGB-Farbintensität, für jeden Punkt + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Nur verfügbar auf MATRIX Karte im TC Modus. +
  +
Gruppe: TC-VDI-Funktionen +
  +
Querverweis: Binding   vrun_parallel   vrun_triangle +
  + +
+ +

7.12.16 Bindings für vrun_rect

+ + + + + + + + + +
C: void vrun_rect ( int16_t handle, int16_t *pts, int16_t *rgbs ); +
  +
Umsetzung: +
  +
void vrun_rect (int16_t handle, int16_t *pts, int16_t *rgbs)
+{
+   ptsin[0..3] = pts[0..3];
+
+   intin[0..11] = rgbs[0..11];
+
+   contrl[0] = 61;
+   contrl[1] = 2;
+   contrl[3] = 12;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]61 # Opcode der Funktion
contrl+2contrl[1]2 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]12 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0..11]rgbs[0..11]
ptsinptsin[0..3]pts[0..3]
+
+ + +
+ +

7.12.17 vrun_triangle

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Triangle Color Run« - Triangle color run. +
  +
VDI-Nummer: 63 +
  +
Deklaration: void vrun_triangle ( int16_t handle, int16_t *pts, int16_t +*rgbs ); +
  +
Beschreibung: Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
pts[0] x-Koordinate +
pts[1] y-Koordinate des Eckpunktes +
pts[2] x-Koordinate +
pts[3] y-Koordinate des zweiten Eckpunktes +
pts[4] x-Koordinate +
pts[5] y-Koordinate des dritten Eckpunktes +
rgbs RGB-Farbintensität, für jeden Eckpunkt + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Nur verfügbar auf MATRIX Karte im TC Modus. +
  +
Gruppe: TC-VDI-Funktionen +
  +
Querverweis: Binding   vrun_parallel   vrun_rect +
  + +
+ +

7.12.18 Bindings für vrun_triangle

+ + + + + + + + + +
C: void vrun_triangle ( int16_t handle, int16_t *pts, int16_t +*rgbs ); +
  +
Umsetzung: +
  +
void vrun_triangle (int16_t handle, int16_t *pts, int16_t *rgbs)
+{
+   ptsin[0..5] = pts[0..5];
+
+   intin[0..8] = rgbs[0..8];
+
+   contrl[0] = 63;
+   contrl[1] = 3;
+   contrl[3] = 9;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]63 # Opcode der Funktion
contrl+2contrl[1]3 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]9 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0..8]rgbs[0..8]
ptsinptsin[0..5]pts[0..5]
+
+ + +
+ +

7.12.19 vs_colors

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Colors« - RGB Wert einer Farbe setzen. +
  +
VDI-Nummer: 64 +
  +
Deklaration: void vs_colors ( int16_t handle, int16_t from, int16_t to, +int16_t *rgb_table ); +
  +
Beschreibung: Die Funktion setzt die RGB-Werte ab dem Farbindex from +zu Farbindex to. Die Farbwerte sind in rgb_table +abgelegt. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Nur verfügbar auf MATRIX Karte im TC Modus. +
  +
Gruppe: TC-VDI-Funktionen +
  +
Querverweis: Binding   vq_colors +
  + +
+ +

7.12.20 Bindings für vs_colors

+ + + + + + + + + +
C: void vs_colors ( int16_t handle, int16_t from, int16_t to, +int16_t *rgb_table ); +
  +
Umsetzung: +
  +
void vs_colors (int16_t handle, int16_t from, int16_t to, int16_t *rgb_table)
+{
+   intin[0]    = from;
+   intin[1]    = to;
+   intin[2..3] = rgb_table;
+
+   contrl[0] = 64;
+   contrl[1] = 0;
+   contrl[3] = 4;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]64 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]4 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]from
intin+2intin[1]to
intin+4intin[2..3]rgb_table
+
+ + +
+ +

7.12.21 vs_pixcol

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Pixel Color Index« - setzt die Farbindex eines Pixels. +
  +
VDI-Nummer: 57 +
  +
Deklaration: void vs_pixcol ( int16_t handle, int16_t x, int16_t y, int16_t +vdi_ix ); +
  +
Beschreibung: Die Funktion wählt die Pixel-Farbindex zu einem bestimmten +Punkt. Es gilt: +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
x x-Koordinate +
y y-Koordinate +
vdi_ix gewünschte Farbindex + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Nur verfügbar auf MATRIX Karte im TC Modus. +
  +
Gruppe: TC-VDI-Funktionen +
  +
Querverweis: Binding   vq_pixcol +
  + +
+ +

7.12.22 Bindings für vs_pixcol

+ + + + + + + + + +
C: void vs_pixcol ( int16_t handle, int16_t x, int16_t y, int16_t +vdi_ix ); +
  +
Umsetzung: +
  +
void vs_pixcol (int16_t handle, int16_t x, int16_t y, int16_t vdi_ix)
+{
+   ptsin[0] = x;
+   ptsin[1] = y;
+
+   intin[0] = vdi_ix;
+
+   contrl[0] = 57;
+   contrl[1] = 1;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]57 # Opcode der Funktion
contrl+2contrl[1]1 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]vdi_ix
ptsinptsin[0]x
ptsin+2ptsin[1]y
+
+ + +
+ +

7.12.23 vs_pixrgb

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Pixel RGB Color Values« - setzt die Farbintensität +eines Pixels. +
  +
VDI-Nummer: 59 +
  +
Deklaration: void vs_pixrgb ( int16_t handle, int16_t x, int16_t y, int16_t +*rgb ); +
  +
Beschreibung: Die Funktion wählt die Pixel-Farbintensität zu einem +bestimmten Punkt. Es gilt: +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
x x-Koordinate +
y y-Koordinate +
rgb gewünschte Farbintensität + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Nur verfügbar auf MATRIX Karte im TC Modus. +
  +
Gruppe: TC-VDI-Funktionen +
  +
Querverweis: Binding   vq_pixrgb +
  + +
+ +

7.12.24 Bindings für vs_pixrgb

+ + + + + + + + + +
C: void vs_pixrgb ( int16_t handle, int16_t x, int16_t y, int16_t +*rgb ); +
  +
Umsetzung: +
  +
void vs_pixrgb (int16_t handle, int16_t x, int16_t y, int16_t *rgb)
+{
+   ptsin[0] = x;
+   ptsin[1] = y;
+
+   intin[0] = *rgb++;
+   intin[1] = *rgb++;
+   intin[2] = *rgb;
+
+   contrl[0] = 59;
+   contrl[1] = 1;
+   contrl[3] = 3;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]59 # Opcode der Funktion
contrl+2contrl[1]1 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]3 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]rgb[0]
intin+2intin[1]rgb[1]
intin+4intin[2]rgb[2]
ptsinptsin[0]x
ptsin+2ptsin[1]y
+
+ + +
+ +

7.12.25 vsf_rgb

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set fill RGB Color Values« - bestimmt die Farbintensität +mit der ein Polygon ausgefüllt wird. +
  +
VDI-Nummer: 51 +
  +
Deklaration: void vsf_rgb ( int16_t handle, int16_t *rgb ); +
  +
Beschreibung: Die Funktion legt die Füllfarbintensität für Polygone fest. +Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
rgb gewünschte Farbintensität + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Nur verfügbar auf MATRIX Karte im TC Modus. +
  +
Gruppe: TC-VDI-Funktionen +
  +
Querverweis: Binding   vrf_rgb   vrl_rgb   vrt_rgb   vsl_rgb   vst_rgb +
  + +
+ +

7.12.26 Bindings für vsf_rgb

+ + + + + + + + + +
C: void vsf_rgb ( int16_t handle, int16_t *rgb ); +
  +
Umsetzung: +
  +
void vsf_rgb (int16_t handle, int16_t *rgb)
+{
+   intin[0] = *rgb++;
+   intin[1] = *rgb++;
+   intin[2] = *rgb;
+
+   contrl[0] = 51;
+   contrl[1] = 0;
+   contrl[3] = 3;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]51 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]3 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]rgb[0]
intin+2intin[1]rgb[1]
intin+4intin[2]rgb[2]
+
+ + +
+ +

7.12.27 vsl_rgb

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Polyline RGB Color Values« - setzt die +Linienfarbintensität. +
  +
VDI-Nummer: 53 +
  +
Deklaration: void vsl_rgb ( int16_t handle, int16_t *rgb ); +
  +
Beschreibung: Die Funktion wählt die Linien-Farbintensität. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
rgb gewünschte Linienfarbintensität + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Nur verfügbar auf MATRIX Karte im TC Modus. +
  +
Gruppe: TC-VDI-Funktionen +
  +
Querverweis: Binding   vrf_rgb   vrl_rgb   vrt_rgb   vsf_rgb   vst_rgb +
  + +
+ +

7.12.28 Bindings für vsl_rgb

+ + + + + + + + + +
C: void vsl_rgb ( int16_t handle, int16_t *rgb ); +
  +
Umsetzung: +
  +
void vsl_rgb (int16_t handle, int16_t *rgb)
+{
+   intin[0] = *rgb++;
+   intin[1] = *rgb++;
+   intin[2] = *rgb;
+
+   contrl[0] = 53;
+   contrl[1] = 0;
+   contrl[3] = 3;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]53 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]3 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]rgb[0]
intin+2intin[1]rgb[1]
intin+4intin[2]rgb[2]
+
+ + +
+ +

7.12.29 vst_rgb

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Graphic Text RGB Color Values« - bestimmt die +Farbintensität der Textausgaben. +
  +
VDI-Nummer: 52 +
  +
Deklaration: void vst_rgb ( int16_t handle, int16_t *rgb ); +
  +
Beschreibung: Die Funktion setzt die Text-Farbintensität. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
rgb gewünschte Textfarbintensität + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Nur verfügbar auf MATRIX Karte im TC Modus. +
  +
Gruppe: TC-VDI-Funktionen +
  +
Querverweis: Binding   vrf_rgb   vrl_rgb   vrt_rgb   vsf_rgb   vsl_rgb +
  + +
+ +

7.12.30 Bindings für vst_rgb

+ + + + + + + + + +
C: void vst_rgb ( int16_t handle, int16_t *rgb ); +
  +
Umsetzung: +
  +
void vst_rgb (int16_t handle, int16_t *rgb)
+{
+   intin[0] = *rgb++;
+   intin[1] = *rgb++;
+   intin[2] = *rgb;
+
+   contrl[0] = 52;
+   contrl[1] = 0;
+   contrl[3] = 3;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]52 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]3 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]rgb[0]
intin+2intin[1]rgb[1]
intin+4intin[2]rgb[2]
+
+ + +
+ +
+ +Home +VDIVDI +RasterfunktionenRasterfunktionen +VDI-FunktionslisteVDI-Funktionsliste + + diff --git a/de/tekbios.html b/de/tekbios.html new file mode 100644 index 000000000..8b7a838bc --- /dev/null +++ b/de/tekbios.html @@ -0,0 +1,53 @@ + + + + + +Die Anleitung zum TOS: TekBios + + + + + + + + + +Home +GEMDOSGEMDOS +PowerDOSPowerDOS +GEMDOS-FunktionslisteGEMDOS-Funktionsliste + +
+ +

5.22 TekBios

+ + + + + + + + + + + +

Das TekBios ist eine GEMDOS-Erweiterung, die den einfachen +Zugang zu einem TEK 4/8 Board oder kompatiblen Board schafft. Das +TekBios benutzt die Nummern 100 bis 114. +

+

Bei dem TEK 4/8 handelt sich um ein Transputer-Board für den +ISA-Bus. Das Board kann mit einen Prozessor vom Typ T414 oder T800 von +Inmos bestückt werden. Vorgestellt wurde es in der Zeitschrift c't +10/1987 - 12/1987. Für den Betrieb am Atari wird noch das +Universal-Businterface aus der c't 7/1987 benötigt. +

+
+ +Home +GEMDOSGEMDOS +PowerDOSPowerDOS +GEMDOS-FunktionslisteGEMDOS-Funktionsliste + + diff --git a/de/the_system_vectors.html b/de/the_system_vectors.html new file mode 100644 index 000000000..dd2a2a946 --- /dev/null +++ b/de/the_system_vectors.html @@ -0,0 +1,679 @@ + + + + + +Die Anleitung zum TOS: Die Systemvektoren + + + + + + + + + +Home +BIOSBIOS +Die SystemvariablenDie Systemvariablen +BIOS FehlermeldungenBIOS Fehlermeldungen + +
+ +

3.5 Die Systemvektoren

+

Da die Systemvariablen und -vektoren die unterste Schicht des +Betriebssystems darstellen, sollten Anwenderprogramme nur wenn +unbedingt notwendig auf diese zugreifen. Konkret: +

+
    +
  • keine Systemvariablen verändern, die nicht verändert werden +dürfen. +
  • +
  • keine Systemvariablen benutzen, wenn statt dessen auch eine +Funktion des Betriebssystems aufgerufen werden könnte (Beispiel: +Mfpint). +
  • +
+ +

Die folgende Liste enthält alle Systemvektoren des TOS: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Vektor Beschreibung +
  + + + +
LONG $000 Reset: SSP +
Diese und die folgenden Speicherzellen enthalten eine Spiegelung +der ersten acht Bytes des ROMs. Bei einem Reset wird der hier liegende +Wert in den Supervisor-Stack-Pointer geladen (allerdings kein +sinnvoller; der 'richtige' Stack wird erst später vom BIOS +installiert). +
  + + + +
LONG $004 Reset: PC +
Bei einem Reset wird der hier vorgefundene Wert in den +Program-Counter (PC) geladen. Man findet hier also die Adresse, die +bei einem Reset angesprungen wird. +
  + + + +
LONG $008 Busfehler +
Exception-Vektor 2: zwei Bömbchen +
Busfehler treten auf, wenn man versucht, auf Speicherbereiche +zuzugreifen, auf die kein Zugriff erlaubt ist. Das können im +Supervisor-Modus eigentlich nur nicht-existierende Speicherbereiche +sein. Im User-Modus kann es auch beim Zugriff auf Hardware-Register +oder Bereiche unterhalb von $800 passieren. +
  +
Im Normallfall zeigt dieser Vektor auf die TOS-Routine zur +Anzeige von Bömbchen (in diesem Fall genau zwei). +
  + + + +
LONG $00c Adreßfehler +
Exception-Vektor 3: drei Bömbchen +
68000 und 68010 können nur byteweise auf ungerade Adressen +zugreifen. Diese Exception wird ausgelöst, wenn man dennoch einen +Wort- oder Langwort-Zugriff versucht (auch Programmzähler oder +Stack-Pointer dürfen keine ungeraden Adressen enthalten). +
  + + + +
LONG $010 Illegaler Befehl +
Exception-Vektor 4: vier Bömbchen +
Es wurde versucht, einen illegalen Befehl auszuführen. Dieser +Vektor wird von vielen Debuggern zur Verwendung für Break-Points +geändert. +
  + + + +
LONG $014 Division durch Null +
Exception-Vektor 5: kein Bömbchen +
Bei einem DIV-Befehl wurde durch 0 geteilt. Dieser Vektor zeigt im +Normalfall auf einen RTE-Befehl; daher gibt es auch keine Bömbchen. +
  + + + +
LONG $018 CHK-Befehl +
Exception-Vektor 6: Es wurde eine Exception durch einen CHK-Befehl +erzeugt. +
  + + + +
LONG $01c Befehl TRAPV +
Exception-Vektor 7: Es wurde eine Exception durch einen +TRAPV-Befehl erzeugt. +
  + + + +
LONG $020 Privilegverletzung +
Exception-Vektor 8: +
Es wurde versucht, einen Befehl auszuführen, der nur im +Supervisor-Modus erlaubt ist. Beim Atari-TT testet das BIOS, ob es +sich bei dem betreffenden Befehl um einen 'move sr,...' gehandelt hat: +dieser Befehl ist im Gegensatz zum 68000er nur im Supervisor-Modus +erlaubt. In einem solchen Fall setzt das BIOS statt dessen den +Befehl 'move ccr,...' ein und versucht, das Programm weiterlaufen zu +lassen. +
  + + + +
LONG $024 Trace +
Exception-Vektor 9: Ist das Trace-Bit im Statusregister gesetzt, +wird nach jeder Instruktion die hier angegebene Adresse angesprungen. +
  + + + +
LONG $028 Line-A-Vektor +
Exception-Vektor 10: Es wurde versucht eine Instruktion +auszuführen, die in den obersten vier Bits den Wert '$A' enthält. +Zur Zeit wird dieser Vektor für die sogenannten Line-A-Routinen +benutzt. +
  + + +
LONG $02c Line-F-Vektor +
Exception-Vektor 11: Es wurde versucht, eine Instruktion +auszuführen, die in den obersten vier Bits den Wert '$F' enthält. +Wird bis TOS 1.04 vom GEM benutzt, und ist eigentlich für die +Programmierung einer Floating-Point-Unit (FPU) gedacht. +
  +
LONG $030 reserviert +
  +
    : Exception-Vektoren 12-23 +
  +
LONG $05C reserviert +
  + + +
LONG $060 Spurious Interrupt +
Exception-Vektor 24: Tritt auf, wenn ein Interrupt ausgelöst +wurde, die Ursache dafür aber nicht feststellbar war. +
  + + +
LONG $064 Autovektor-Interrupt, Level 1 +
Unbenutzt. +
  + + +
LONG $068 Autovektor-Interrupt, Level 2 +
Zeigt auf den Handler für Horizontal-Blanks. +
  + + +
LONG $06c Autovektor-Interrupt, Level 3 +
Unbenutzt. +
  + + +
LONG $070 Autovektor-Interrupt, Level 4 +
Zeigt auf den Handler für Vertical-Blanks. +
  + + +
LONG $074 Autovektor-Interrupt, Level 5 +
Unbenutzt. +
  + + +
LONG $078 Autovektor-Interrupt, Level 6 +
Zeigt auf Handler für MFP-Interrupts. +
  + + +
LONG $07c Autovektor-Interrupt, Level 7 +
Unbenutzt. +
  + + +
LONG $080 TRAP#0 +
Exception-Vektor 32 +
Vektor für den Befehl 'TRAP #0'. Da vom Betriebssystem nicht +benutzt, gibt es Bömbchen. +
  + + + + +
LONG $084 TRAP#1 +
Exception-Vektor 33 +
Vektor für den Befehl 'TRAP #1'. Zeigt auf den Dispatcher für +die GEMDOS-Funktionen. +
  + + + + +
LONG $088 TRAP#2 +
Exception-Vektor 34 +
Vektor für den Befehl 'TRAP #2'. +
In Abhänigkeit vom Wert in d0 werden unterschiedliche Systemfunktionen +angesprungen: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
dezhexName
-2 vq_gdos
-1 Adresse des VDI dispatcher
1150x73VDI
2000xc8AES
2010xc9_appl_yield
182190x472bG+PLUS, ist der Wert ungleich 0x472b dann ist es installiert
+
+ +
LONG $08c - LONG $0b0 TRAP#3 - TRAP#12 +
Exception-Vektoren 35-44. Entsprechend viele Bömbchen, da sie vom +Betriebssystem z.Zt. nicht benutzt werden. Allerdings gibt es externe +Erweiterungen die diese Traps benutzen: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
LONG $08c TRAP#3 +
Exception-Vektor 35 +
Wird nur vom Omega-Color-CAD benutzt, sonst ohne funktion. +
  + + + +
LONG $090 TRAP#4 +
Exception-Vektor 36 +
Der MS-DOS Emulator SuperCharger benutzt den Trap #4 für sein +Toolbox. +
  + + + + +
LONG $094 TRAP#5 +
Exception-Vektor 37 +
Is used by Wind-XES. It is a modular accessory/control panel that +lets you load in .WNX ("winks") applications which run +concurrently under its environment. +
MidiShare ein Multi-Tasking und Realzeit System für +Midianwendungen, nutzt auch diesen Trap (auch Trap #6). +
  + + +
LONG $098 TRAP#6 +
Exception-Vektor 38 +
MidiShare ein Multi-Tasking und Realzeit System für +Midianwendungen, nutzt diesen Trap (auch Trap #5. +
  + + + +
LONG $0a0 TRAP#8 +
Exception-Vektor 40 +
Cubase MROS von Steinberg nutzt diesen Trap. +
  + + +
LONG $0a4 TRAP#9 +
Exception-Vektor 41 +
Cubase MROS von Steinberg nutzt diesen Trap. +
  + + + +
LONG $0a8 TRAP#10 +
Exception-Vektor 42 +
Wird vom TapeBIOS benutzt. Dies dient zum ansteuern eines +Bandlaufwerk am ASCI-Bus des Ataris. +
Cubase MROS von Steinberg nutzt diesen Trap auch. +
  + +
+ + + + + +
LONG $0b4 TRAP#13 +
Exception-Vektor 45: Vektor für den Befehl 'TRAP #13'. Zeigt auf +den Dispatcher für die BIOS-Funktionen. +
  + + + + +
LONG $0b8 TRAP#14 +
Exception-Vektor 46: Vektor für den Befehl 'TRAP #14'. Zeigt auf +den Dispatcher für die XBIOS-Funktionen. +
  + + +
LONG $0bc TRAP#15 +
Vom Betriebssystem nicht benutzt. NVDI und dessen Druckmonitor +verwenden diesen Vektor. +
  +
LONG $0c0 reserviert +
  +
    : Exception-Vektoren 48-63. +
  +
LONG $0fc reserviert +
  + + + +
LONG $100 BUSY-Interrupt +
ST-MFP-Interrupt 0. Wird durch parallele Schnittstelle ausgelöst. +Normalerweise nicht benutzt. +
  + + + +
LONG $104 DCD-Interrupt +
ST-MFP-Interrupt 1. Wird durch die serielle Schnittstelle (Carrier +detect) ausgelöst. Normalerweise unbenutzt. +
  + + + +
LONG $108 CTS-Interrupt +
ST-MFP-Interrupt 2. Wird durch die serielle Schnittstelle (Clear +to send) ausgelöst. Normalerweise unbenutzt. +
  + + +
LONG $10c GPU Done +
ST-MFP-Interrupt 3. Kann vom Blitter benutzt werden, um den +Abschluß einer Operation anzuzeigen. Normalerweise unbenutzt. +
  + + +
LONG $110 Baudratengenerator +
ST-MFP-Interrupt 4. Normalerweise nicht benutzt. +
  + + + +
LONG $114 200Hz System Timer +
ST-MFP-Interrupt 5. Zeigt auf den Systemtimer-Interrupt und darf +auf keinen Fall verändert werden (wird für Timing-Schleifen im TOS +benötigt). +
  + + + + + + +
LONG $118 IKBD/MIDI +
ST-MFP-Interrupt 6. Zeigt auf den Handler für IKBD- und +MIDI-Interrupts. +
  + + + + +
LONG $11c FDC/ACSI +
ST-MFP-Interrupt 7. Normalerweise unbelegt. +
  + + +
LONG $120 Display Enable Signal +
ST-MFP-Interrupt 8. Normalerweise gesperrt. +
  + + +
LONG $124 RS232 Sendefehler +
ST-MFP-Interrupt 9. Wird bei Übertragungsfehlern beim Senden von +Daten über die serielle Schnittstelle ausgelöst. +
  + + +
LONG $128 RS232 Sendepuffer leer +
ST-MFP-Interrupt 10. Wird ausgelöst, wenn der Sendevorgang eines +einzelnen Bytes abgeschlossen ist. +
  + + +
LONG $12c RS232 Empfangsfehler +
ST-MFP-Interrupt 11. Tritt bei Empfangsfehlern auf. +
  + + +
LONG $130 RS232 Empfangspuffer voll +
ST-MFP-Interrupt 12. Ein komplettes Zeichen ist von der seriellen +Schnittstelle empfangen worden. +
  +
LONG $134 unbenutzt +
ST-MFP-Interrupt 13. Unbenutzt +
  + + +
LONG $138 Ring Indicator +
ST-MFP-Interrupt 14. Wird ausgelöst, wenn die serielle +Schnittstelle einen ankommenden Anruf bemerkt (z.B. bei Verwendung von +Modems). Da dieser Interrupt so leicht auszulösen ist wird er gerne +in Debuggern als Break-Signal eingesetzt. +
  + + +
LONG $13c Monochrom Monitor Detect +
ST-MFP-Interrupt 15. Unbenutzt. +
  + + + +
LONG $140 TT-MFP-Interrupts +
  +
    : 16 Interruptvektoren für den zweiten MFP im Atari-TT. +
  +
LONG $17c TT-MFP-Interrupts +
  + + + +
LONG $180 TT-SCC-Interrupts +
  +
    : Platz für die Interruptvektoren des SCC-Bausteins im Atari-TT. +
  +
LONG $1bc TT-SCC-Interrupts +
  + +
+ +

Querverweis: +
Reset-Vektor   Systemvariablen   Exceptions unter MagiC Mac +

+
+ +Home +BIOSBIOS +Die SystemvariablenDie Systemvariablen +BIOS FehlermeldungenBIOS Fehlermeldungen + + diff --git a/de/tos_about.html b/de/tos_about.html new file mode 100644 index 000000000..ab27c61dc --- /dev/null +++ b/de/tos_about.html @@ -0,0 +1,63 @@ + + + + + +Die Anleitung zum TOS: Das Betriebssystem TOS + + + + + + + + + +Home +TOSTOS +TOSTOS +GEMGEM + +
+ +

2.1 Das Betriebssystem TOS

+

Das Betriebssystem TOS (The Operating +System) läßt sich in verschiedene Bereiche unterteilen. Die +Kommunikation mit den Benutzern wird über das GEM realisiert, welches +ein komfortables User-Interface zur Verfügung stellt, und sich aus +AES und VDI Funktionen zusammensetzt. +

+

Darüber hinaus stehen viele weitere Routinen zur Verfügung, +die sich einer der folgenden Kategorien zuteilen lassen: +

+ + +

Das TOS gibt es bereits seit dem Jahre 1985. Es wurde im Laufe +der Zeit von Atari weiterentwickelt und steht für verschiedene +Rechnermodelle (ST, STE, Mega-ST, TT, Falcon, ...) zur Verfügung. +Darüber hinaus gibt es von Fremdanbietern weitgehend TOS-kompatible +Systeme. Erwähnenswert sind in diesem Zusammenhang vor allem MagiC +und Geneva. Wührend MagiC vor allem in Deutschland eine große +Bedeutung gewonnen hat, scheint sich Geneva in den USA einer gewissen +Beliebtheit zu erfreuen. Dank MagiC Mac, einer Implementierung von +MagiC auf die Hardware des Apple (Power) Macintosh, laufen +TOS-Programme mittlerweile auch auf Computern der Firma Apple. +

+

Querverweise: TOS Liste +

+
+ +Home +TOSTOS +TOSTOS +GEMGEM + + diff --git a/de/tos_main.html b/de/tos_main.html new file mode 100644 index 000000000..95bc32425 --- /dev/null +++ b/de/tos_main.html @@ -0,0 +1,38 @@ + + + + + +Die Anleitung zum TOS: TOS + + + + + + + + + +Home +Inhaltsverzeichnis +The GNU General Public LicenceThe GNU General Public Licence +Das Betriebssystem TOSDas Betriebssystem TOS + +
+ +

2 TOS

+ +
+
+ +Home +Inhaltsverzeichnis +The GNU General Public LicenceThe GNU General Public Licence +Das Betriebssystem TOSDas Betriebssystem TOS + + diff --git a/de/tos_vers.html b/de/tos_vers.html new file mode 100644 index 000000000..b07cdd999 --- /dev/null +++ b/de/tos_vers.html @@ -0,0 +1,470 @@ + + + + + +Die Anleitung zum TOS: TOS Liste + + + + + + + + + +Home +Inhaltsverzeichnis +vmem_sizevmem_size +XHDI - eXtended HardDisk Interface (Version 1.30)XHDI - eXtended HardDisk Interface (Version 1.30) + +
+ +

G TOS Liste

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VersionDatumNameSpracheArtGEMDOSAESBemerkung
0.00 Das BootenglischROM   
1.0020.06.1985MushroomdeutschRAM 1.01(1)
1.0020.11.1985 deutschRAM0.131.20 
1.0020.11.1985 franz.RAM0.131.20 
1.0006.02.1986AltesdeutschRAM0.131.20 
1.0006.02.1986AltesdeutschROM0.131.20 
1.0222.04.1987BlitterdeutschROM0.131.20 
1.02 KAOS 1.2.xdeutschROM0.15 (2)
1.0418.05.1988Beta-TestenglischRAM0.151.30 
1.0408.08.1988DeveloperdeutschRAM0.151.04 
1.0422.02.1989RainbowdeutschROM0.151.40 
1.0406.04.1989RainbowdeutschROM0.151.40 
1.0406.04.1989KAOS 1.4.2deutschROM0.161.41(2)
1.0406.04.1989KAOS 1.4.3 (08.06.1994)deutschROM0.161.41(2)
1.0619.06.1989STEdeutschROM0.151.40 
1.6211.01.1990STEdeutschROM0.171.40 
2.01  deutschROM0.19  
2.0505.12.1990 deutschROM0.193.10 
2.0614.11.1991 deutschROM0.203.20 
2.0610.03.1992 deutschROM 3.20STBook
2.0729.02.1992 englischROM  Sparrow
2.9526.04.1996 englischROM0.203.20Tos2Win
3.0023.05.1989TTOSUSROM   
3.0001.03.1990TTOSROM   
3.0109.08.1990TTOSdeutschROM 3.00 
3.0129.08.1990TTOSdeutschROM0.193.00 
3.0505.12.1990TTOSdeutschROM0.193.10 
3.0624.09.1991TTOSdeutschROM0.203.20 
4.00  multiROM0.30  
4.0121.10.1992 multiROM0.303.31 
4.0226.01.1993 multiROM0.303.40 
4.03  multiROM0.303.40 
4.0408.03.1993 multiROM0.303.40 
4.06 MilanTOSmultiFlash0.31  
4.0710.05.1999MilanTOSmultiFlash   
4.0808.07.1999MilanTOSmultiFlash0.32  
4.0815.06.2001MilanTOSmultiFlash0.333.42 
4.0820.08.2001MilanTOSmultiFlash0.333.42 
4.0806.10.2002MilanTOSmultiFlash0.333.43 
4.0809.03.2003MilanTOSmultiFlash0.333.43 
7.0x  multiFlash(3)
+
+ + +
    +
  1. Die GEMDOS Version soll hier den Wert 11010000 (0xD0) haben. +
    Hierbei taucht das Problem auf, wie der Wert interpretiert wird. +Binär- oder BCD-Codiert? Die Liste entspricht der BCD-Codierung. +
  2. +
  3. Veränderte Version von Andreas Kromke +
  4. +
  5. TOS 7.0x is eine veränderte Version für den Falcon +Beschleuniger CENTurbo II. +
  6. +
+ +
+ +Home +Inhaltsverzeichnis +vmem_sizevmem_size +XHDI - eXtended HardDisk Interface (Version 1.30)XHDI - eXtended HardDisk Interface (Version 1.30) + + diff --git a/de/typedefs.html b/de/typedefs.html new file mode 100644 index 000000000..bb8e22229 --- /dev/null +++ b/de/typedefs.html @@ -0,0 +1,208 @@ + + + + + +Die Anleitung zum TOS: Typdefinitionen + + + + + + + + + +Home +Inhaltsverzeichnis +XHDI-FunktionenXHDI-Funktionen +AESVARSAESVARS + +
+ +

I Typdefinitionen

+

In diesem Hypertext finden sich Verweise auf die folgenden +Datentypen: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AESVARSAPPLRECORDARHEADERBASEPAGEBCB
BCONMAPBITBLKBPBCD_DISC_INFOCD_TOC_ENTRY
CICONCICONBLKCPXINFOdev_descrDEVDRV
DISKINFODITHER_MODEDOSTIMEDOSVARSDRV_INFO
DSPBLOCKDTAEVNTfcookieFILEPTR
FILESYSfix31FNTS_ITEMFONT_HDRfs_descr
GEM_MUPBGRECTHDFUNCSHNDL_OBJICONBLK
IORECKBDVBASEKEYTABLBOX_ITEMLINE
ltcharsMAPTABMCBMDMEDIA_SIZE
MEDIA_TYPEMENUMETA_DRVINFOMETA_INFO_1META_INFO_2
META_HEADERMFDBMFORMMN_SETMOUSE
MPBMRETSmutimbufOBJECTOHEADER
OSHEADEROVERPATCHPARMBLKPBDEFPD
PDLG_SUBPHploadinfoPOPINFOPRN_ENTRY
PRN_MODEPRN_TRAYPRN_SETTINGSPRN_SWITCHPUN_INFO
pxyarrayRGB_LISTRSHDRSCANXSCREEN
SET_ITEMsgttybSHELTAILSLCT_ITEMSWINFO
tcharstimevaltimezoneTEDINFOTHREADINFO
USERBLKUTXT_FNwinsizeXAESMSGXATTR
XCPBXDO_INFXFNT_INFOXFSL_FILTERXSHW_COMMAND
XTEDxkey   
+
+ + +
+
+ +Home +Inhaltsverzeichnis +XHDI-FunktionenXHDI-Funktionen +AESVARSAESVARS + + diff --git a/de/udo_hm.gif b/de/udo_hm.gif new file mode 100644 index 0000000000000000000000000000000000000000..d119c0419e0e1f061177b3b7f4a4165f5ce507ba GIT binary patch literal 928 zcmc(e&uhMrFES}HR)b(6A-3Yu!J>MFQL6tgboqAu7Y4`i}U9Qa2B4p9vlqEX2x zIv@rcXt1P`t2Q-H&7^|FAGB1erb4dRMFmY0H6cfmCIECXPSCg|O7cJ^+r)t;4C4^h zfFYVqWT69Muz{93QBBjP<_Q-gNc=%drBWY9<=Wi4n#~C-=H@Cj+XP*yH`&!{6Gt7P zaac%==(Hd+ypRG%OzMq=fHnHRK{LV!Z literal 0 HcmV?d00001 diff --git a/de/udo_lf.gif b/de/udo_lf.gif new file mode 100644 index 0000000000000000000000000000000000000000..2519705959b048f4438ad8c5fc678a117213d9ad GIT binary patch literal 930 zcmc(e&x_7+5XXl$t((h}rzm>1CnXo=LdYYvmKC-nZAx2AO1UXHD3{%B?O|J|k+N7D zB|l1jT(xCo+E&kD^AAY5IdB}W`Ti3=w`peHzvlZreqwn4fr+-X<*!KAi%ie7OwE+4 zA~HO~GBiV~>5=Z~mageivleNdW@(xxwW^Wosg|m#0#Zt(c#5TH3I*6egT*q_QatrM z!Xh+6ik8Yf+`=_nN(D{xFbmT#DN)R-hgztH3L04r@em8q5Li(S7@|>$EP4=w4K!FR zOBt$~XYT4Qx*dq^QvP~TLM+6R04H%+P$tXG? z1{-Lwq>`&PHBZf?g2W%RRH~*zuGmEdO%pXCN0KH0bTLlQxFt&RKqlM7fhG*&5Y>Po znoVS(17fg&mO4>Q)28ML7b8ggK})4lA4lcd+`F312`lF2DmB{#U8y(O)oK$*9ieep zNR8;aNu#5H8)!ZUu0(ivg6e<0Jw;sqLT_+NHVkebdA)G-&bqv~urfEX&|B{epIccw z`DwDft+V)Ht@C+y=iXb((`O%lx!W3>y!d^r`*m*U(#xAa_bnZp-qpSR*553yP9C~4 zbL#5TXWyQT+}qT;|9hyvbY{oK8=L2UEI&WJb^P$hes}f3kw6w

8)l|q8yQrXPq9)`>(gc7m#t9m?L`fdVWScn9gkc<_ z8Zbn&i7a$L3^veGC#q@M)I8y01c^UrsZ{FYs9c+SSF<@`#oSz_W}BcZ^(MPoZQ`gS zG!6@?5nVTFbQEv{&F8?C2oFzC{jb+w#Pu&o>zZt8?HpO2Kh*soOXIJW7hYUFx%J@O z$iU*^nfCUHXz%_qJkwn|Gxv9Wa-^?kZ2rRd!_TAFd&UOOKKj)gH~V`ZKYcy*_4$p# zON$$)_TGEDuw(i`>*dCeW8Klqd!}d4-(8(Oac6bkmg7I)-#_}S^KItc+Q%!Kr#f$1 b>wTwJ&J9f5?ri(M^5o+0wNJN(cFBQ%Dm{$5 literal 0 HcmV?d00001 diff --git a/de/udo_nolf.gif b/de/udo_nolf.gif new file mode 100644 index 0000000000000000000000000000000000000000..9e67089a59c21bdafac4ad1b8fb56bb6b8353f21 GIT binary patch literal 931 zcmc(ezi-ZQ5XaAtCwUS?u$0)0wbW@UDiS2^^RyF#_|e637*&`II`~l?Ff?&Zn;@Ea zQbQN9vpkVQV$cXN2!nw^B*yc)??2(QUGDDv>%QOd?%08ma|1FUe?_uhWO}A$YNk{b zk>MGZp&3$5k91GBbWN9(8y|thggV)z=~?X5RFP?(SsOlpuu8U z%23rjb60mMf6!8yxv86!T~yFib5&QtJ))R(F&A~g9(f>>ZQ{T`B5;Umzz~f}M$rK= z*g%6Nm0Y!{d1@vVB>teKQZ*HF#V#snny3jmk~9IJi*bU+Em4vOGT9~$G+`Krs0Iwt zY$6LC5Q7c0)QM`EHZ@PU7(wC>S}K+LI4alX-qmbQSTQ$Oso5szO1;UhR+~8L2#v!+ zYDCvf8XX1PK=V0pCBnlKRR8PkE#mqYq&qV*yp7EPA>xcjJhn~#OZR(!bfARab&g|fZ=Zmw`Hzw}wJOBRL>C3IjrP1M+ zQxA4LeY-Hy+O=h2`ogj0vHJ(FwC8(odRtc}es+)l_;7b~>-Wa9+Xg?bOuhSZXzpt7 S)AHKa*GrQxeto_!GWriuXoLj- literal 0 HcmV?d00001 diff --git a/de/udo_norg.gif b/de/udo_norg.gif new file mode 100644 index 0000000000000000000000000000000000000000..eeb9dd20189adb60541399f453d069d4c0f6dfda GIT binary patch literal 930 zcmc(ey=#}!Lvn&E*TU>p^M7;|)AY!Tq zz6>r7RYY{PORbp>rMN2SKTv#`;wR5P;cp8`zHfP+)6=IqN9J16lHVd(FETyTGBs1G zipcN`%g_v|rboJ`Te_x8&03^+nx$!))T&0Rr&_9}3P>rD;whG*DHLD>4HnBxOYzk6 z2#e4NDOxJ`a0}OPDHSx$!z@h0q(m{R9%`W)DrjUi#6v7ZLtsTUV2DN~vgkn!Hqc

xndU;G)>fm97&o0(8V}GJde>`>Q zS$DBDF&nG5_O47WbPjL4J2==e*wY(ao*S)w98C1y&i@^Mes-yIzI*@AwioAyyKX<& znBM;5!=sZ|w#?uC{Btzi+5dLu=&Su-7P~XE@2_fm{o%}odt2MT_I-Wb{h(2rH*vuuSnL5OwY7T&6KJl zGCadFG()QCk?!f1uIW;<7HOVlX__Xrs*&ocma3@&Qc9$Filt}@1=v7?#WK@UJoP-n zA~ZsZmdZWc!Zln<1x@oX3)3(uQOv4`TBwE!8d(kT5DU=|SWyiaqEU$~dJuyRG*~Q4 z8LFCR?&>b(4_YcSH+7S;iwc@*uIehdM-;Oz=AtgxBM)SU&s-{A&*hK|R6Ez`6k|qFjF;399B}(!@Cfme;CJf^c)qo+I zO=O`1Vz7ahI#Es2rsfG3BS`!~OQljDN9EewyPC}jE9T}ZHQNMTsW;ixY7<8tp>bG9 zjp({bqoaTuXg&w7M0j|D>VLgn5!b&U19P%vV0V9c;rQ$id3k1SdGW)Y)2;Ex{ew#r zcRR!9Vr^#M>apRYrv@)?ZcN_WKK1DK$jp=b54*dTuJ>E^@xjowcfDJ!{a@!t&#sEZZH=_wp~aola!TRoIJ-RYe3{&l|J@yRnsj$Ua?TmFhEAq-d$!!!2CHrBu)~53?{0lM=kJsGyP65D&2s4S^NafFT-{$f5@^*g%8D zvXr5!dFHO}QvRT&GILWmDZ8kksphJ#f_p?U>tZhIf<5v;Cfme;e?;IA)qo)ym5ibT zVz7Y*ODef)Q}fhJDoFf6OQmWmI|L&AqGHoUmeUu2Qp2(3N_VU9C28)Daqo zh17_yn>0EKxPj(#;7WvtC#e3{8!h7c7f$rwmsbDK#M>7q?|hf#iyt~0t9Q3;+B`ck z*IiuLzI)4Z?`voM;hqCC=X)E&AD;|N9v&K8c{RRxaBOAt*4f$Ep*xpO56*Sgo^74F z(Kqn>*O!G0kN02x^zQ1^%R}9peb>H?Oy8S6HS^Q|jKuTfdvAYk&%f?HIyStt@4@`q TrKjh*>#Muozxi>!)snG)DDQx) literal 0 HcmV?d00001 diff --git a/de/udo_up.gif b/de/udo_up.gif new file mode 100644 index 0000000000000000000000000000000000000000..88440735cf37e2561281711ebee7e8dc4075c39c GIT binary patch literal 927 zcmc(e&x_7+5XZ+swp_NfwHvY}H$^*}Na+!ImXZU7y*+HxwjAu9Y!2EY$Bj13L2YsH zY}(NN2cD#-aqy$KOWMD{alGd9Px#!XnR)-3@3(vY-0>5=aT%AtB3UmoJ<~EZQ>u!{ z@C?h)45_9^x~E&Zrc2FQq;*KjEnG|j^-Ov9u^F{>VGp&BY^WHrP?EJQon2S{0XJwq2d+eTc!KJGy~9OZ|3YWvf$SLBH}iJ=^vVx;bM4ce-ukW4v14=dhk73# zjq1YI%;R5!)yb<@*6uFe9IPHZvvK?R((mEZ$pcT$Zohl=(f2Rjn7)2_?$Wb8-Pwr? zTd%*oJi79A(4YP@>>Rm2wbq~NU+kaq&7aFl+uh9xpWS&+=RbFL?S4Pl_`dM%;n?!< J#okdl`48Mef+PR{ literal 0 HcmV?d00001 diff --git a/de/vdi_attribute.html b/de/vdi_attribute.html new file mode 100644 index 000000000..07531ea5f --- /dev/null +++ b/de/vdi_attribute.html @@ -0,0 +1,10144 @@ + + + + + +Die Anleitung zum TOS: Attributfunktionen + + + + + + + + + +Home +VDIVDI +VDI-BindingsVDI-Bindings +AusgabefunktionenAusgabefunktionen + +


+ +

7.4 Attributfunktionen

+

Diese Bibliothek enthält Funktionen, die das Einstellen +bestimmter Attribute ermöglichen. Dabei stehen die folgenden +Kategorien zur Verfügung: +

+ + +

Hinweis: Die eingestellten Attribute gelten dabei für +eine einzelne Workstation, und behalten ihre Gültigkeit, bis das +Programm terminiert, oder die Attribute anders eingestellt werden. +

+

Querverweis: Workstations des VDI   Style-Guidelines +

+

7.4.1 Bitmap-Attribute

+ + + + + + + +
vsr_bg_color Hintergrundfarbe setzen +
vsr_fg_color Vordergrundfarbe setzen + +
+ +

Hinweis: Die eingestellten Attribute gelten dabei für +eine einzelne Workstation, und behalten ihre Gültigkeit, bis das +Programm terminiert, oder die Attribute anders eingestellt werden. +

+

Querverweis: +
Workstations des VDI   Style-Guidelines   Grundlagen des VDI +

+

7.4.2 Fülltyp-Attribute

+ +

Diese Gruppe von Funktionen ermöglicht es, verschiedene +Attribute zum Füllen von Flächen zu manipulieren. Zu diesem Zweck +stehen die folgenden Routinen zur Verfügung: +

+ + + + + + + + + + + + + + + + + + + + + + + + +
vsf_bg_color Hintergrundfarbe setzen +
vsf_color Füllfarbe auswählen. +
vsf_fg_color Vordergrundfarbe setzen +
vsf_interior Auswahl des Fülltyps. +
vsf_perimeter Rahmen zeichnen oder nicht. +
vsf_style Füllmuster auswählen. +
vsf_udpat Eigenes Füllmuster definieren. +
vsf_xperimeter Sets fill parameter visibility + +
+ +

Die eingestellten Attribute gelten dabei für eine einzelne +Workstation, und behalten ihre Gültigkeit, bis das Programm +terminiert, oder die Attribute anders eingestellt werden. +

+

Querverweis: +
Workstations des VDI   Fülltyp und Musterindex   Style-Guidelines   Grundlagen des VDI +

+

7.4.3 Linien-Attribute

+ +

Diese Gruppe von Funktionen ermöglicht es, verschiedene +Attribute zum Zeichnen von Linien zu manipulieren. Zu diesem Zweck +stehen die folgenden Routinen zur Verfügung: +

+ + + + + + + + + + + + + + + + + + + + + + + + +
v_bez_qual Qualität der Bezier-Spline-Erzeugung setzen. +
vsl_bg_color Hintergrundfarbe setzen +
vsl_color Linienfarbe auswählen. +
vsl_ends Linienenden definieren. +
vsl_fg_color Vordergrundfarbe setzen +
vsl_type Liniendarstellung einstellen. +
vsl_udsty Eigene Liniendarstellung definieren. +
vsl_width Linienbreite definieren. + +
+ +

Die eingestellten Attribute gelten dabei für eine einzelne +Workstation, und behalten ihre Gültigkeit, bis das Programm +terminiert, oder die Attribute anders eingestellt werden. +

+

Querverweis: +
Workstations des VDI   Style-Guidelines +

+

7.4.4 Markierungs-Attribute

+ +

Diese Gruppe von Funktionen ermöglicht es, verschiedene +Attribute zum Zeichnen von Markierungen zu manipulieren. Zu diesem +Zweck stehen die folgenden Routinen zur Verfügung: +

+ + + + + + + + + + + + + + + +
vsm_bg_color Hintergrundfarbe setzen +
vsm_color Markierungsfarbe festlegen. +
vsm_fg_color Vordergrundfarbe setzen +
vsm_height Markierungsgröße festlegen. +
vsm_type Markierungstyp auswählen. + +
+ +

Hinweis: Die eingestellten Attribute gelten dabei für +eine einzelne Workstation, und behalten ihre Gültigkeit, bis das +Programm terminiert, oder die Attribute anders eingestellt werden. +

+

Querverweis: Workstations des VDI   Style-Guidelines +

+

7.4.5 Text-Attribute

+ +

Diese Gruppe von Funktionen ermöglicht es, verschiedene +Attribute des Text-Handlings zu manipulieren. Zu diesem Zweck stehen +die folgenden Routinen zur Verfügung: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
v_topbot Textgröße festlegen. +
vst_alignment Horizontale und vertikale Ausrichtung eines Texts bestimmen. +
vst_arbpt Setzen der Zeichenzellenhöhe in Punkten. +
vst_arbpt32 Setzen der Zeichenzellenhöhe in Punkten (fix31). +
vst_bg_color Hintergrundfarbe setzen +
vst_charmap Wahl der Zeichensatzindizierung (Atari/Bitstream). +
vst_color Farbe für Textausgaben festlegen. +
vst_effects Texteffekte auswählen. +
vst_error Setzen der GDOS Fehlerbehandlung. +
vst_fg_color Vordergrundfarbe setzen +
vst_font Zeichensatz auswählen. +
vst_height Textgröße festlegen. +
vst_kern Setzen des Kerning-Modus. +
vst_map_mode Wahl der Zeichensatzindizierung (Atari/Bitstream/Unicode). +
vst_name Zeichensatz suchen und einstellen. +
vst_point Größe der Zeichenzelle festlegen. +
vst_rotation Drehung der Textausgabe. +
vst_scratch Bestimmen der Größe des Scratch-Buffers. +
vst_setsize Setzen der Zeichenzellenbreite in Punkten. +
vst_setsize32 Setzen der Zeichenzellenbreite in Punkten (fix31). +
vst_skew Setzen des Neigungsgrades für Kursivschrift. +
vst_track_offset Offset für Track-Kerning einstellen. +
vst_width Zeichenbreite in Pixeln setzen. + +
+ +

Hinweis: Die eingestellten Attribute gelten dabei für +eine einzelne Workstation, und behalten ihre Gültigkeit, bis das +Programm terminiert, oder die Attribute anders eingestellt werden. +

+

Querverweis: Workstations des VDI   Style-Guidelines +

+

7.4.6 übergeordnete Attribute

+ +

Diese Gruppe von Funktionen ermöglicht die Festlegung des +Schreibmodus sowie der Intenstität einer Farbe; sie umfaßt die +folgenden Routinen: +

+ + + + + + + + + + + + + + + + + + + + + + + + +
v_ps_halftone Sets PostScript halftoning type +
v_setrgb Farbe festlegen. +
v_setrgbi Farbe festlegen. +
vs_bkcolor Setzen der Hintergrundfarbe +
vs_color Farbintensität einer Farbe festlegen. +
vs_color2 Farbintensität und Farbe für Attribute festlegen. +
vs_grayoverride Fine-tunes grey level +
vswr_mode Schreibmodus auswählen. + +
+ +

Hinweis: Die eingestellten Attribute gelten dabei für +eine einzelne Workstation, und behalten ihre Gültigkeit, bis das +Programm terminiert, oder die Attribute anders eingestellt werden. +

+

Querverweis: Workstations des VDI   Style-Guidelines +

+

7.4.6.1 vsr_bg_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Background Color« - Hintergrundfarbe setzen +
  +
VDI-Nummer: 201 (Unterfunktion 4) +
  +
Deklaration: int16_t vsr_bg_color ( int16_t handle, int32_t color_space, +COLOR_ENTRY *fg_color ); +
  +
Beschreibung: Diese Funktionen setzen die Hintergrundfarbe für Bitmaps. +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
color_space Farbraum (z.Zt. nur 0 für eingestellten Farbraum oder +CSPACE_RGB) +
fg_color COLOR_ENTRY der Hintergrundfarbe + +
+ +
Ergebnis: -1 = falsche Unterfunktionsnummer +
 0 = Funktion nicht vorhanden +
 1 = alles in Ordnung +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Bitmap-Attribute +
  +
Querverweis: Binding +
  + +
+ +

7.4.6.2 Bindings für vsr_bg_color

+ + + + + + + + + +
C: int16_t vsr_bg_color ( int16_t handle, int32_t color_space, +COLOR_ENTRY *fg_color ); +
  +
Umsetzung: +
  +
int16_t vsr_bg_color( int16_t handle, int32_t color_space,
+                      COLOR_ENTRY *fg_color )
+{
+   intin[0..1] = color_space;
+   intin[2..5] = fg_color;
+
+   contrl[0] = 201;
+   contrl[1] = 0;
+   contrl[3] = 6;
+   contrl[5] = 4;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]201 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]6 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]4
contrl+12contrl[6]handle
intinintin[0..1]color_space
intin+4intin[2..5]fg_color
intoutintout[0]Return-Wert
+
+ + +
+ +

7.4.6.3 vsr_fg_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Foreground Color« - Vordergrundfarbe setzen +
  +
VDI-Nummer: 200 (Unterfunktion 4) +
  +
Deklaration: int16_t vsr_fg_color ( int16_t handle, int32_t color_space, +COLOR_ENTRY *fg_color ); +
  +
Beschreibung: Diese Funktionen setzen die Vordergrundfarbe für Bitmaps. +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
color_space Farbraum (z.Zt. nur 0 für eingestellten Farbraum oder +CSPACE_RGB) +
fg_color COLOR_ENTRY der Vordergrundfarbe + +
+ +
Ergebnis: -1 = falsche Unterfunktionsnummer +
 0 = Funktion nicht vorhanden +
 1 = alles in Ordnung +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Bitmap-Attribute +
  +
Querverweis: Binding +
  + +
+ +

7.4.6.4 Bindings für vsr_fg_color

+ + + + + + + + + +
C: int16_t vsr_fg_color ( int16_t handle, int32_t color_space, +COLOR_ENTRY *fg_color ); +
  +
Umsetzung: +
  +
int16_t vsr_fg_color( int16_t handle, int32_t color_space,
+                      COLOR_ENTRY *fg_color )
+{
+   intin[0..1] = color_space;
+   intin[2..5] = fg_color;
+
+   contrl[0] = 200;
+   contrl[1] = 0;
+   contrl[3] = 6;
+   contrl[5] = 4;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]200 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]6 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]4
contrl+12contrl[6]handle
intinintin[0..1]color_space
intin+4intin[2..5]fg_color
intoutintout[0]Return-Wert
+
+ + +
+ + +

7.4.6.5 Grafische Übersicht von Fülltyp und Musterindex

+

Die folgende Abbildung zeigt die möglichen Kombinationen von +Fülltyp und Musterindex. Die erste Ziffer gibt dabei den Fülltyp, +die zweite den Index des Musters an. +

+

+

Hinweis: Ein Fülltyp mit dem Wert 1, gefolgt von einem +beliebigen Musterindex, entspricht immer dem Fülltyp 2 mit +Musterindex 8. Der Index 1 ist bei Mustern vom Typ 2 immer das Muster +mit der geringsten Intensität auf dem jeweiligen Ausgabegerät, und +darüber hinaus auch immer monochrom. +

+

Querverweis: vsf_interior   vsf_style +

+

7.4.6.6 Beschreibung der VDI-Schreibmodi

+ +

Replace: In diesem Modus überschreibt das VDI den +Hintergrund mit der Vordergrundfarbe, falls das entsprechende Bit +gesetzt ist, bzw. mit der Farbe Weiß, wenn das entsprechende Bit den +Wert 0 besitzt. Die logische Verknüpfung lautet: +

+

Neu := (Vordergrund AND Maske) OR (Hintergrund AND NOT Maske) +

+

Übertragen auf das Arbeiten mit Bleistift und Papier kann man +sich dies wie folgt vorstellen: zunächst malt man eine Figur auf +weißes Papier, schneidet sie aus, und klebt sie dann auf die Grafik. +

+ +

Transparent: In diesem Modus werden alle Bits der zu +zeichnenden Form die den Wert 0 besitzen (also nicht gesetzt sind) vom +VDI ignoriert. Es werden also nur die Bits ausgegeben, die gesetzt +sind. Die logische Verknüpfung lautet in diesem Fall: +

+

Neu := (Vordergrund AND Maske) OR (Farbe AND NOT Maske) +

+

Auch hier wieder der Vergleich beim Arbeiten mit Papier und +Bleistift: Dieser Modus entspricht dem Replace-Modus, nur daß nicht +auf normales Papier, sondern auf eine durchsichtige (transparente) +Folie gezeichnet wird. +

+ +

XOR: In diesem Modus werden die Bits des Hintergrundes +und der zu zeichnenden Figur mit einem Exklusiv-ODER verknüpft, wobei +eine interessante und nützliche Eigenschaft auftritt: +

+

Wird die Figur nämlich ein zweites Mal in diesem Modus +gezeichnet, so ist sie plötzlich wieder verschwunden. Begründung: +Die XOR-Verknüpfung eines Bits mit sich selbst ergibt immer den +inversen Wert. Deshalb läßt sich dieser Modus hervorragend für +einfache Animationen wie eine Gummibox einsetzen; das Kochrezept +lautet: +

+ + + + + + + + + + + + +
1. Objekt einmal ausgeben +
2. Objekt erneut ausgeben (es ist nun wieder verschwunden) +
3. Objekt in der Größe oder Position verändern. +
4. Zurück zu Schritt 1. + +
+ +

Die logische Verknüpfung lautet: Neu := (Maske XOR Farbe) +

+

Im allgemeinen läßt sich über diesen Modus nur aussagen, daß +aus der Farbe Schwarz die Farbe Weiß wird, und umgekehrt; alles +andere ist nicht fest definiert. +

+ +

Reverse Transparent: In diesem Modus werden nur die +Pixel berücksichtigt, die im zu zeichnenden Bild auf den Wert 0 +gesetzt sind. Die logische Verknüpfung lautet in diesem Fall: +

+

Neu := (Farbe AND Maske) OR (Vordergrund AND NOT Maske) +

+

Auch dieser Modus bietet interessante Einsatzmöglichkeiten; so +kann er z.B. mit dem Transparent-Modus gemeinsam angewendet werden, um +Text mit einer zusätzlichen Hintergrundfarbe erscheinen zu lassen. +

+

Die folgende Abbildung soll die unterschiedlichen +VDI-Schreibmodi noch einmal verdeutlichen: +

+

+

Querverweis: vswr_mode +

+

7.4.6.7 vsf_bg_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Background Color« - Hintergrundfarbe setzen +
  +
VDI-Nummer: 201 (Unterfunktion 1) +
  +
Deklaration: int16_t vsf_bg_color ( int16_t handle, int32_t color_space, +COLOR_ENTRY *fg_color ); +
  +
Beschreibung: Diese Funktione setzt die Hintergrundfarbe für Objekte. +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
color_space Farbraum (z.Zt. nur 0 für eingestellten Farbraum oder +CSPACE_RGB) +
fg_color COLOR_ENTRY der Hintergrundfarbe + +
+ +
Ergebnis: -1 = falsche Unterfunktionsnummer +
 0 = Funktion nicht vorhanden +
 1 = alles in Ordnung +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Fülltyp-Attribute +
  +
Querverweis: Binding +
  + +
+ +

7.4.6.8 Bindings für vsf_bg_color

+ + + + + + + + + +
C: int16_t vsf_bg_color ( int16_t handle, int32_t color_space, +COLOR_ENTRY *fg_color ); +
  +
Umsetzung: +
  +
int16_t vsf_bg_color( int16_t handle, int32_t color_space,
+                      COLOR_ENTRY *fg_color )
+{
+   intin[0..1] = color_space;
+   intin[2..5] = fg_color;
+
+   contrl[0] = 201;
+   contrl[1] = 0;
+   contrl[3] = 6;
+   contrl[5] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]201 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]6 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]1
contrl+12contrl[6]handle
intinintin[0..1]color_space
intin+4intin[2..5]fg_color
intoutintout[0]Return-Wert
+
+ + +
+ +

7.4.6.9 vsf_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Fill Color Index« - bestimmt die Farbe mit der ein +Polygon ausgefüllt wird. +
  +
VDI-Nummer: 25 +
  +
Deklaration: int16_t vsf_color ( int16_t handle, int16_t color_index ); +
  +
Beschreibung: Die Funktion legt die Füllfarbe für Polygone fest. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
color_index gewünschte Farbe + +
+ +
Hinweis: Die Farbindizes 0 und 1 sind immer verfügbar; +alle weiteren hängen vom jeweiligen Ausgabegerät ab. Ein ungültiger +Farbindex wird durch den Wert 1 ersetzt. Der Farbindex hat keine +Auswirkung auf mehrfarbige Muster; er sollte in diesem Fall auf 1 +gesetzt werden. +
  +
Ergebnis: Die Funktion liefert die tatsächlich eingestellte Farbe +zurück. +
  +
Verfügbar: Supported by all drivers. +
  +
Gruppe: Fülltyp-Attribute +
  +
Querverweis: Binding   v_fillarea   v_contourfill   vr_recfl v_bar   +v_pieslice   v_circle   v_ellipse   v_ellpie   v_rfbox   vsf_udpat +
  + +
+ +

7.4.6.10 Bindings für vsf_color

+ + + + + + + + + +
C: int16_t vsf_color ( int16_t handle, int16_t color_index ); +
  +
Umsetzung: +
  +
int16_t vsf_color (int16_t handle, int16_t color_index)
+{
+   intin[0] = color_index;
+
+   contrl[0] = 25;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]25 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]color_index
intoutintout[0]Return-Wert
+
+ + +
+ +

7.4.6.11 vsf_fg_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Foreground Color« - Vordergrundfarbe setzen +
  +
VDI-Nummer: 200 (Unterfunktion 1) +
  +
Deklaration: int16_t vsf_fg_color ( int16_t handle, int32_t color_space, +COLOR_ENTRY *fg_color ); +
  +
Beschreibung: Diese Funktionen setzen die Vordergrundfarbe für gefüllte +Objekt. +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
color_space Farbraum (z.Zt. nur 0 für eingestellten Farbraum oder +CSPACE_RGB) +
fg_color COLOR_ENTRY der Vordergrundfarbe + +
+ +
Ergebnis: -1 = falsche Unterfunktionsnummer +
 0 = Funktion nicht vorhanden +
 1 = alles in Ordnung +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Fülltyp-Attribute +
  +
Querverweis: Binding +
  + +
+ +

7.4.6.12 Bindings für vsf_fg_color

+ + + + + + + + + +
C: int16_t vsf_fg_color ( int16_t handle, int32_t color_space, +COLOR_ENTRY *fg_color ); +
  +
Umsetzung: +
  +
int16_t vsf_fg_color( int16_t handle, int32_t color_space,
+                      COLOR_ENTRY *fg_color )
+{
+   intin[0..1] = color_space;
+   intin[2..5] = fg_color;
+
+   contrl[0] = 200;
+   contrl[1] = 0;
+   contrl[3] = 6;
+   contrl[5] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]200 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]6 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]1
contrl+12contrl[6]handle
intinintin[0..1]color_space
intin+4intin[2..5]fg_color
intoutintout[0]Return-Wert
+
+ + +
+ +

7.4.6.13 vsf_interior

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Fill Interior Style« - bestimmt den Füllmustertyp. +
  +
VDI-Nummer: 23 +
  +
Deklaration: int16_t vsf_interior ( int16_t handle, int16_t style ); +
  +
Beschreibung: Die Funktion bestimmt den Fülltyp. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
style gewünschter Fülltyp + + + + + + + + + + + + + + + +
0 = leer +
1 = deckend +
2 = gemustert +
3 = schraffiert +
4 = frei definierbar + +
+ + +
+ +
Hinweis: Bei Übergabe eines ungültigen Typs wird der +Fülltyp leer angenommen. +
  +
Ergebnis: Die Funktion liefert den tatsächlich ausgewählten Fülltyp +zurück. +
  +
Verfügbar: Supported by all drivers. +
  +
Gruppe: Fülltyp-Attribute +
  +
Querverweis: Binding   v_fillarea   v_contourfill   vr_recfl   v_bar   +v_pieslice   v_circle   v_ellipse   v_ellpie   v_rfbox   vsf_style   +vsf_udpat +
  + +
+ +

7.4.6.14 Bindings für vsf_interior

+ + + + + + + + + +
C: int16_t vsf_interior ( int16_t handle, int16_t style ); +
  +
Umsetzung: +
  +
int16_t vsf_interior (int16_t handle, int16_t style)
+{
+   intin[0] = style;
+
+   contrl[0] = 23;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]23 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]style
intoutintout[0]Return-Wert
+
+ + +
+ +

7.4.6.15 vsf_perimeter

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Fill Perimeter Visibility« - bestimmt, ob eine Umrandung +um Füllbereiche gezeichnet wird. +
  +
VDI-Nummer: 104 +
  +
Deklaration: int16_t vsf_perimeter ( int16_t handle, int16_t per_vis ); +
  +
Beschreibung: Die Funktion schaltet die automatische Umrahmung der +Füllfläche ein oder aus. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
per_vis gewünschter Modus + + + + + + +
   0 = keine Umrahmung +
<> 0 = Umrahmung + +
+ + +
+ +
Hinweis: Der Rand wird bei aktivierter Umrahmung +(default) in der aktuellen Füllfarbe und als durchgehende Linie +gezeichnet. +
  +
Ergebnis: Die Funktion liefert den tatsächlich eingestellten Modus +zurück. +
  +
Verfügbar: Supported by all drivers. +
  +
Gruppe: Fülltyp-Attribute +
  +
Querverweis: Binding   vsf_xperimeter   v_fillarea   v_contourfill   vr_recflv_bar   v_pieslice   v_circle   v_ellipse   v_ellpie   v_rfbox +
  + +
+ +

7.4.6.16 Bindings für vsf_perimeter

+ + + + + + + + + +
C: int16_t vsf_perimeter ( int16_t handle, int16_t per_vis ); +
  +
Umsetzung: +
  +
int16_t vsf_perimeter (int16_t handle, int16_t per_vis)
+{
+   intin[0] = per_vis;
+
+   contrl[0] = 104;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]104 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]per_vis
intoutintout[0]Return-Wert
+
+ + +
+ +

7.4.6.17 vsf_style

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Fill Style Index« - bestimmt das Füllmuster. +
  +
VDI-Nummer: 24 +
  +
Deklaration: int16_t vsf_style ( int16_t handle, int16_t style_index ); +
  +
Beschreibung: Die Funktion bestimmt das Füllmuster. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
style_index Index des Musters + +
+ +
Hinweis: Die Funktion hat nur dann einen Sinn, wenn als +Fülltyp nicht leer, deckend oder frei definierbar gewählt +wurde. Nicht verfügbare Indizes werden durch den Musterindex 1 +ersetzt. +
  +
Ergebnis: Die Funktion liefert das tatsächlich eingestellte Füllmuster. +
  +
Verfügbar: Supported by all drivers. +
  +
Gruppe: Fülltyp-Attribute +
  +
Querverweis: Binding   v_fillarea   v_contourfill   vr_recfl   v_bar   +v_pieslice   v_circle   v_ellipse   v_ellpie   v_rfbox   vsf_interior +
  + +
+ +

7.4.6.18 Bindings für vsf_style

+ + + + + + + + + +
C: int16_t vsf_style ( int16_t handle, int16_t style_index ); +
  +
Umsetzung: +
  +
int16_t vsf_style (int16_t handle, int16_t style_index)
+{
+   intin[0] = style_index;
+
+   contrl[0] = 24;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]24 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]style_index
intoutintout[0]Return-Wert
+
+ + +
+ +

7.4.6.19 vsf_udpat

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set User Defined Fill Pattern« - definiert ein neues +Füllmuster. +
  +
VDI-Nummer: 112 +
  +
Deklaration: void vsf_udpat ( int16_t handle, int16_t *pfill_pat, int16_t +planes ); +
  +
Beschreibung: Die Funktion definiert ein neues Füllmüster. Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
pfill_pat Zeiger auf ein Feld mit planes Zeilen zu je 16 +Einträgen. +
planes Anzahl der Farbebenen + +
+ +
Hinweis: Jede Zeile gibt das Füllmuster für eine +Farbebene wieder. Der erste Eintrag in einer Zeile entspricht dabei +der ersten Zeile des Musters usw. +
  +
Mehrfarbige Muster werden im Standardformat übergeben und +müssen die gleiche Ebenenanzahl haben wie der Bildschirm. Die +Ausnahme von dieser Regel sind die Direct RGB-Modi (mehr als 8 Ebenen +mit direkter RGB-Zuordnung) wie True-Color. Hier wird das Muster immer +als True-Color Muster mit 32-Bit-Pixeln (xRGB) übergeben. +
  +
Bei Mehrfarbmustern sollte man die Füllfarbe auf 1 setzen und +als Schreibmodus REPLACE anwählen. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all drivers. +
  +
Gruppe: Fülltyp-Attribute +
  +
Querverweis: Binding   vsf_interior +
  + +
+ +

7.4.6.20 Bindings für vsf_udpat

+ + + + + + + + + +
C: void vsf_udpat ( int16_t handle, int16_t *pfill_pat, int16_t +planes ); +
  +
Umsetzung: +
  +
void vsf_udpat (int16_t handle, int16_t *pfill_pat,
+                int16_t planes)
+{
+   intin[0..16n-1] = pfill_pat[0..16n-1];
+
+   contrl[0] = 112;
+   contrl[1] = 0;
+   contrl[3] = planes * 16;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]112 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]16*n # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]pfill_pat[0]
.........
.........
intin+32n-2intin[16n-1]pfill_pat[16n-1]
+
+ + +
+ +

7.4.6.21 vsf_xperimeter

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Fill Perimeter Visibility« - bestimmt, ob eine Umrandung +um Füllbereiche gezeichnet wird. +
  +
VDI-Nummer: 104 +
  +
Deklaration: int16_t vsf_xperimeter ( int16_t handle, int16_t on_off, +int16_t f_or_l ); +
  +
Beschreibung: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
on_off gewünschter Modus + + + + + + + + + +
   0 = Turn perimeter outlining off +
   1 = Turn perimeter outlining on +
  -1 = Do not change perimeter outlining + +
+ +
f_or_l Linientyp analog zu vsl_type + + + + + + +
  0 = Use normal fill color for perimeter +
  1 = Use line style attributes for perimeter + +
+ + +
+ +
Ergebnis: Die Funktion liefert den tatsächlich eingestellten Modus +zurück. +
  +
Verfügbar: GEM/3 Release 3.1 +
  +
Gruppe: Fülltyp-Attribute +
  +
Querverweis: Binding   vsf_perimeter   v_fillarea   v_contourfill   vr_recflv_bar   v_pieslice   v_circle   v_ellipse   v_ellpie   v_rfbox +
  + +
+ +

7.4.6.22 Bindings für vsf_xperimeter

+ + + + + + + + + +
C: int16_t vsf_xperimeter ( int16_t handle, int16_t on_off, +int16_t f_or_l ); +
  +
Umsetzung: +
  +
int16_t vsf_xperimeter (int16_t handle, int16_t on_off,
+                        int16_t f_or_l )
+{
+   intin[0] = on_off;
+   intin[1] = f_or_l;
+
+   contrl[0] = 104;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]104 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]2 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]on_off
intin+2intin[1]f_or_l
intoutintout[0]Return-Wert
+
+ + +
+ +

7.4.6.23 vsl_bg_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Background Color« - Hintergrundfarbe setzen +
  +
VDI-Nummer: 201 (Unterfunktion 2) +
  +
Deklaration: int16_t vsl_bg_color ( int16_t handle, int32_t color_space, +COLOR_ENTRY *fg_color ); +
  +
Beschreibung: Diese Funktionen setzen die Hintergrundfarbe für Linien. +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
color_space Farbraum (z.Zt. nur 0 für eingestellten Farbraum oder +CSPACE_RGB) +
fg_color COLOR_ENTRY der Hintergrundfarbe + +
+ +
Ergebnis: -1 = falsche Unterfunktionsnummer +
 0 = Funktion nicht vorhanden +
 1 = alles in Ordnung +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Linien-Attribute +
  +
Querverweis: Binding +
  + +
+ +

7.4.6.24 Bindings für vsl_bg_color

+ + + + + + + + + +
C: int16_t vsl_bg_color ( int16_t handle, int32_t color_space, +COLOR_ENTRY *fg_color ); +
  +
Umsetzung: +
  +
int16_t vsl_bg_color( int16_t handle, int32_t color_space,
+                      COLOR_ENTRY *fg_color )
+{
+   intin[0..1] = color_space;
+   intin[2..5] = fg_color;
+
+   contrl[0] = 201;
+   contrl[1] = 0;
+   contrl[3] = 6;
+   contrl[5] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]201 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]6 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]2
contrl+12contrl[6]handle
intinintin[0..1]color_space
intin+4intin[2..5]fg_color
intoutintout[0]Return-Wert
+
+ + +
+ +

7.4.6.25 vsl_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Polyline Color Index« - setzt die Linienfarbe. +
  +
VDI-Nummer: 17 +
  +
Deklaration: int16_t vsl_color ( int16_t handle, int16_t color_index ); +
  +
Beschreibung: Die Funktion wählt die Linien-Farbe. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
color_index Linienfarbe + +
+ +
Hinweis: Die Farb-Indizes 0 und 1 sind auf allen +Geräten verfügbar; alle anderen Werte hängen vom jeweiligen +Ausgabegerät ab. +
  +
Bei ungültigem Index wird die Linienfarbe auf den Wert 1 +gesetzt. +
  +
Ergebnis: Die Funktion liefert die tatsächlich gesetzte Linienfarbe. +
  +
Verfügbar: Vorhanden bei allen Treibern. +
  +
Gruppe: Linien-Attribute +
  +
Querverweis: Binding   v_pline   v_arc   v_ellarc   v_rbox +
  + +
+ +

7.4.6.26 Bindings für vsl_color

+ + + + + + + + + +
C: int16_t vsl_color ( int16_t handle, int16_t color_index ); +
  +
Umsetzung: +
  +
int16_t vsl_color (int16_t handle, int16_t color_index)
+{
+   intin[0] = color_index;
+
+   contrl[0] = 17;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]17 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]color_index
intoutintout[0]Return-Wert
+
+ + +
+ +

7.4.6.27 vsl_ends

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Polyline End Styles« - setzt die Form der Linienenden. +
  +
VDI-Nummer: 108 +
  +
Deklaration: void vsl_ends ( int16_t handle, int16_t beg_style, int16_t +end_style ); +
  +
Beschreibung: Die Funktion legt das Aussehen der Linien-Enden fest. Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung Symbole +
    +
handle Kennung der Workstation +
beg_style Anfang der Linie +
+

+ + + + + + + + + +
0 = eckig +
1 = Pfeilform +
2 = abgerundet + +
+ +
end_style Ende der Linie (analog) + +
+ +
Hinweis: Standardmäßig besitzen alle Linien einen +eckigen Abschluß. Das Ende der Linie ist bei der Pfeilspitze die +Spitze selbst, bei den abgerundeten Ecken jedoch das Zentrum des +Halbkreises, welches das Ende darstellt. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all devices. +
  +
Gruppe: Linien-Attribute +
  +
Querverweis: Binding   v_pline   v_arc   v_ellarc   v_rbox +
  + +
+ +

7.4.6.28 Bindings für vsl_ends

+ + + + + + + + + +
C: void vsl_ends ( int16_t handle, int16_t beg_style, int16_t +end_style ); +
  +
Umsetzung: +
  +
void vsl_ends (int16_t handle, int16_t beg_style,
+               int16_t end_style)
+{
+   intin[0] = beg_style;
+   intin[1] = end_style;
+
+   contrl[0] = 108;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]108 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]2 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]beg_style
intin+2intin[1]end_style
+
+ + +
+ +

7.4.6.29 vsl_fg_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Foreground Color« - Vordergrundfarbe setzen +
  +
VDI-Nummer: 200 (Unterfunktion 2) +
  +
Deklaration: int16_t vsl_fg_color ( int16_t handle, int32_t color_space, +COLOR_ENTRY *fg_color ); +
  +
Beschreibung: Diese Funktionen setzen die Vordergrundfarbe für Linien. +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
color_space Farbraum (z.Zt. nur 0 für eingestellten Farbraum oder +CSPACE_RGB) +
fg_color COLOR_ENTRY der Vordergrundfarbe + +
+ +
Ergebnis: -1 = falsche Unterfunktionsnummer +
 0 = Funktion nicht vorhanden +
 1 = alles in Ordnung +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Linien-Attribute +
  +
Querverweis: Binding +
  + +
+ +

7.4.6.30 Bindings für vsl_fg_color

+ + + + + + + + + +
C: int16_t vsl_fg_color ( int16_t handle, int32_t color_space, +COLOR_ENTRY *fg_color ); +
  +
Umsetzung: +
  +
int16_t vsl_fg_color( int16_t handle, int32_t color_space,
+                      COLOR_ENTRY *fg_color )
+{
+   intin[0..1] = color_space;
+   intin[2..5] = fg_color;
+
+   contrl[0] = 200;
+   contrl[1] = 0;
+   contrl[3] = 6;
+   contrl[5] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]200 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]6 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]2
contrl+12contrl[6]handle
intinintin[0..1]color_space
intin+4intin[2..5]fg_color
intoutintout[0]Return-Wert
+
+ + +
+ +

7.4.6.31 vsl_type

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Polyline Type« - setzt den Linientyp. +
  +
VDI-Nummer: 15 +
  +
Deklaration: int16_t vsl_type ( int16_t handle, int16_t style ); +
  +
Beschreibung: Die Funktion wählt die Liniendarstellung aus. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
style Stil der Linie + + + + + + + + + + + + + + + + + + + + + +
1 = durchgezogen +
2 = langer Strich +
3 = punktiert +
4 = Strich, Punkt +
5 = Strich +
6 = Strich, Punkt, Punkt +
7 = frei definierbar, vsl_udsty + +
+ + +
+ +
Hinweis: Linienstile ab dem Wert 8 sind vom jeweiligen +Ausgabegerät abhängig. Ist ein gewählter Stil nicht verfügbar, so +wird der Linienstil 'durchgezogen' gewählt. +
  +
Über die Funktion vq_extnd können die vorhandenen Linientypen +ermittelt werden. +
  +
Ergebnis: Die Funktion liefert den tatsächlich eingestellten Linientyp. +
  +
Verfügbar: Supported by all devices. +
  +
Gruppe: Linien-Attribute +
  +
Querverweis: Binding   v_pline   v_arc   v_ellarc   v_rbox   vsl_udsty +
  + +
+ +

7.4.6.32 Bindings für vsl_type

+ + + + + + + + + +
C: int16_t vsl_type ( int16_t handle, int16_t style ); +
  +
Umsetzung: +
  +
int16_t vsl_type (int16_t handle, int16_t style)
+{
+   intin[0] = style;
+
+   contrl[0] = 15;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]15 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]style
intin+2intin[1]Return-Wert
+
+ + +
+ +

7.4.6.33 vsl_udsty

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set User defined Line Style Pattern« - setzt den frei +definierten Linientyp. +
  +
VDI-Nummer: 113 +
  +
Deklaration: void vsl_udsty ( int16_t handle, int16_t pattern ); +
  +
Beschreibung: Die Funktion legt den frei-definierbaren Linientyp von vsl_type +fest. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
pattern Linienmuster + +
+ +
Hinweis: Das Bit-15 des Parameters pattern legt +den ersten Punkt der Linie fest. Der Standardwert ist eine komplett +durchgezogene Linie. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all devices. +
  +
Gruppe: Linien-Attribute +
  +
Querverweis: Binding   vsl_type +
  + +
+ +

7.4.6.34 Bindings für vsl_udsty

+ + + + + + + + + +
C: void vsl_udsty ( int16_t handle, int16_t pattern ); +
  +
Umsetzung: +
  +
void vsl_udsty (int16_t handle, int16_t pattern)
+{
+   intin[0] = pattern;
+
+   contrl[0] = 113;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]113 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]pattern
+
+ + +
+ +

7.4.6.35 vsl_width

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Polyline Width« - setzt die Linienbreite. +
  +
VDI-Nummer: 16 +
  +
Deklaration: int16_t vsl_width ( int16_t handle, int16_t width ); +
  +
Beschreibung: Die Funktion setzt die Linienbreite. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
width Linienbreite (ungerade) + +
+ +
Hinweis: Die Breite der Linie bezieht sich immer auf +Koordinaten in x-Richtung. Die tatsächlich gesetzte Breite ist +kleiner oder gleich der gewählten Breite. Die Funktion ist +nicht auf allen Ausgabegeräten verfügbar. +
  +
Linien die breiter als 1 Pixel sind werden von den meisten +Treibern nur ohne Muster gezeichnet. +
  +
Ergebnis: Die Funktion liefert die tatsächlich eingestellte +Strichstärke. +
  +
Verfügbar: Supported by all devices. +
  +
Gruppe: Linien-Attribute +
  +
Querverweis: Binding   v_pline   v_arc   v_ellarc   v_rbox +
  + +
+ +

7.4.6.36 Bindings für vsl_width

+ + + + + + + + + +
C: int16_t vsl_width ( int16_t handle, int16_t width ); +
  +
Umsetzung: +
  +
int16_t vsl_width (int16_t handle, int16_t width)
+{
+   ptsin[0] = width;
+   ptsin[1] = 0;
+
+   contrl[0] = 16;
+   contrl[1] = 1;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( ptsout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]16 # Opcode der Funktion
contrl+2contrl[1]1 # Einträge in ptsin
contrl+4contrl[2]1 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
ptsinptsin[0]width
ptsin+2ptsin[1]0
ptsoutptsout[0]Return-Wert
ptsout+2ptsout[1]0
+
+ + +
+ +

7.4.6.37 v_bez_qual

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Bezier quality« - Qualität der Bezier-Spline-Erzeugung +setzen. +
  +
VDI-Nummer: 5 (Escape 99, Opcode 32) +
  +
Deklaration: int16_t v_bez_qual ( int16_t handle, int16_t qual, int16_t +*set_qual ); +
  +
Beschreibung: Die Funktion setzt einen neuen Faktor, der die Qualität und +Geschwindigkeit bestimmt, mit der Bezier-Splines gezeichnet werden. Es +gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
qual gewünschte Qualität in Prozent +
set_qual eingestellte Qualität in Prozent (Steht bei GEM/3 Release +3.1 nicht zur Verfügung). + +
+ +
Hinweis: Die Qualität der Beziers kann wie üblich in +Prozent (d.h. von 0 bis 100) eingestellt werden. +
  +
Ergebnis: Die Funktion liefert set_qual als Returnwert zurück. +
  +
Verfügbar: ab GEM/3 Release 3.1, ab SpeedoGDOS 4.00 und ab NVDI 2.10. +
  +
Gruppe: Linien-Attribute +
  +
Querverweis: Binding   v_bez_on   v_bez_off   v_bez   v_bez_fill   +v_set_app_buff +
  + +
+ +

7.4.6.38 Bindings für v_bez_qual

+ + + + + + + + + +
C: int16_t v_bez_qual ( int16_t handle, int16_t qual, int16_t +*set_qual ); +
  +
Für GEM/3 Release 3.1 gilt: +
int16_t v_bez_qual ( int16_t handle, int16_t qual ); +
  +
Umsetzung: +
  +
int16_t v_bez_qual (int16_t handle, int16_t qual,
+                    int16_t *set_qual)
+{
+   intin[0] = 32;
+   intin[1] = 1;
+   intin[2] = qual;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 3;
+   contrl[5] = 99;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *set_qual = intout[0];
+
+   return intout[0];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]3 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]99 Unterfunktion
contrl+12contrl[6]handle
intinintin[0]32
intin+2intin[1]1
intin+4intin[2]qual
intoutintout[0]set_qual
+
+ + +
+ +

7.4.6.39 vsm_bg_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Background Color« - Hintergrundfarbe setzen +
  +
VDI-Nummer: 201 (Unterfunktion 3) +
  +
Deklaration: int16_t vsm_bg_color ( int16_t handle, int32_t color_space, +COLOR_ENTRY *fg_color ); +
  +
Beschreibung: Diese Funktionen setzen die Hintergrundfarbe für Marker. +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
color_space Farbraum (z.Zt. nur 0 für eingestellten Farbraum oder +CSPACE_RGB) +
fg_color COLOR_ENTRY der Hintergrundfarbe + +
+ +
Ergebnis: -1 = falsche Unterfunktionsnummer +
 0 = Funktion nicht vorhanden +
 1 = alles in Ordnung +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Markierungs-Attribute +
  +
Querverweis: Binding +
  + +
+ +

7.4.6.40 Bindings für vsm_bg_color

+ + + + + + + + + +
C: int16_t vsm_bg_color ( int16_t handle, int32_t color_space, +COLOR_ENTRY *fg_color ); +
  +
Umsetzung: +
  +
int16_t vsm_bg_color( int16_t handle, int32_t color_space,
+                      COLOR_ENTRY *fg_color )
+{
+   intin[0..1] = color_space;
+   intin[2..5] = fg_color;
+
+   contrl[0] = 201;
+   contrl[1] = 0;
+   contrl[3] = 6;
+   contrl[5] = 3;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]201 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]6 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]3
contrl+12contrl[6]handle
intinintin[0..1]color_space
intin+4intin[2..5]fg_color
intoutintout[0]Return-Wert
+
+ + +
+ +

7.4.6.41 vsm_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Polymarker Color Index« - bestimmt die Farbe von +Markierungspunkten. +
  +
VDI-Nummer: 20 +
  +
Deklaration: int16_t vsm_color ( int16_t handle, int16_t color_index ); +
  +
Beschreibung: Die Funktion bestimmt die Farbe der Marker. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
color_index gewünschte Farbe + +
+ +
Hinweis: Die Farb-Indizes 0 und 1 sind immer verfügbar, +alle weiteren hängen vom jeweiligen Ausgabegerät ab. Ein ungültiger +Farbindex wird durch den Wert 1 ersetzt. +
  +
Ergebnis: Die Funktion liefert den tatsächlich gewählten Farbindex. +
  +
Verfügbar: Supported by all devices. +
  +
Gruppe: Markierungs-Attribute +
  +
Querverweis: Binding   v_pmarker +
  + +
+ +

7.4.6.42 Bindings für vsm_color

+ + + + + + + + + +
C: int16_t vsm_color ( int16_t handle, int16_t color_index ); +
  +
Umsetzung: +
  +
int16_t vsm_color (int16_t handle, int16_t color_index)
+{
+   intin[0] = color_index;
+
+   contrl[0] = 20;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]20 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]color_index
intoutintout[0]Return-Wert
+
+ + +
+ +

7.4.6.43 vsm_fg_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Foreground Color« - Vordergrundfarbe setzen +
  +
VDI-Nummer: 200 (Unterfunktion 3) +
  +
Deklaration: int16_t vsm_fg_color ( int16_t handle, int32_t color_space, +COLOR_ENTRY *fg_color ); +
  +
Beschreibung: Diese Funktionen setzen die Vordergrundfarbe für Marker. +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
color_space Farbraum (z.Zt. nur 0 für eingestellten Farbraum oder +CSPACE_RGB) +
fg_color COLOR_ENTRY der Vordergrundfarbe + +
+ +
Ergebnis: -1 = falsche Unterfunktionsnummer +
 0 = Funktion nicht vorhanden +
 1 = alles in Ordnung +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Markierungs-Attribute +
  +
Querverweis: Binding +
  + +
+ +

7.4.6.44 Bindings für vsm_fg_color

+ + + + + + + + + +
C: int16_t vsm_fg_color ( int16_t handle, int32_t color_space, +COLOR_ENTRY *fg_color ); +
  +
Umsetzung: +
  +
int16_t vsm_fg_color( int16_t handle, int32_t color_space,
+                      COLOR_ENTRY *fg_color )
+{
+   intin[0..1] = color_space;
+   intin[2..5] = fg_color;
+
+   contrl[0] = 200;
+   contrl[1] = 0;
+   contrl[3] = 6;
+   contrl[5] = 3;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]200 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]6 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]3
contrl+12contrl[6]handle
intinintin[0..1]color_space
intin+4intin[2..5]fg_color
intoutintout[0]Return-Wert
+
+ + +
+ +

7.4.6.45 vsm_height

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Polymarker Height« - bestimmt die Höhe von +Markierungspunkten. +
  +
VDI-Nummer: 19 +
  +
Deklaration: int16_t vsm_height ( int16_t handle, int16_t height ); +
  +
Beschreibung: Die Funktion setzt die Höher der Marker. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
height Höhe der Marker bzgl. y-Richtung + +
+ +
Die Anzahl der verfügbaren Höhen kann beim Öffnen der +virtuellen Workstation per v_opnvwk ermittelt werden. +
  +
Hinweis: Die Breite der Marker wird automatisch +angepaßt. Bei einer ungültigen Höhe wird vom VDI die nächst +passende gewählt. Der Punkt kann in seiner Größe nicht +verändert werden. +
  +
Ergebnis: Die Funktion liefert die tatsächlich gewählte Größe. +
  +
Verfügbar: Supported by all devices. +
  +
Gruppe: Markierungs-Attribute +
  +
Querverweis: Binding   v_pmarker +
  + +
+ +

7.4.6.46 Bindings für vsm_height

+ + + + + + + + + +
C: int16_t vsm_height ( int16_t handle, int16_t height ); +
  +
Umsetzung: +
  +
int16_t vsm_height (int16_t handle, int16_t height)
+{
+   ptsin[0] = 0;
+   ptsin[1] = height;
+
+   contrl[0] = 19;
+   contrl[1] = 1;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( ptsout[1] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]19 # Opcode der Funktion
contrl+2contrl[1]1 # Einträge in ptsin
contrl+4contrl[2]1 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
ptsinptsin[0]0
ptsin+2ptsin[1]height
ptsoutptsout[0]set_height_x
ptsout+2ptsout[1]Return-Wert
+
+ +
Hinweis: Die Komponente set_height_x beschreibt +die ausgewählte Markerhöhe bzgl. der x-Richtung; in PC-GEM wird +stets der Wert 0 geliefert. +
  + +
+ +

7.4.6.47 vsm_type

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Polymarker Type« - bestimmt die Art der +Markierungspunkte +
  +
VDI-Nummer: 18 +
  +
Deklaration: int16_t vsm_type ( int16_t handle, int16_t typ ); +
  +
Beschreibung: Die Funktion bestimmt das Aussehen der Marker. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung Symbole +
    +
handle Kennung der Workstation +
typ Typ des Markers +

+ + + + + + + + + + + + + + + + + + +
1 = Punkt (feste Größe) +
2 = Plus +
3 = Stern +
4 = Quadrat +
5 = Andreaskreuz +
6 = Raute + +
+ + +
+ +
Hinweis: Bei Übergabe einer ungültigen Nummer wird der +dritte Typ gewählt. Der Punkt kann in seiner Größe nicht +verändert werden. Auf bestimmten Geräten können weitere +Marker-Typen existieren. +
  +
Ergebnis: Die Funktion liefert die tatsächlich ausgewählte Markierung. +
  +
Verfügbar: Supported by all devices. +
  +
Gruppe: Markierungs-Attribute +
  +
Querverweis: Binding   v_pmarker   vsm_height +
  + +
+ +

7.4.6.48 Bindings für vsm_type

+ + + + + + + + + +
C: int16_t vsm_type ( int16_t handle, int16_t typ ); +
  +
Umsetzung: +
  +
int16_t vsm_type (int16_t handle, int16_t typ)
+{
+   intin[0] = typ;
+
+   contrl[0] = 18;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]18 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]type
intoutintout[0]Return-Wert
+
+ + +
+ +

7.4.6.49 vst_alignment

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Graphic Text Alignment« - bestimmt die Ausrichtung für +Textausgaben. +
  +
VDI-Nummer: 39 +
  +
Deklaration: void vst_alignment ( int16_t handle, int16_t hor_in, int16_t +vert_in, int16_t *hor_out, int16_t *vert_out ); +
  +
Beschreibung: Die Funktion bestimmt die horizontale und vertikale Ausrichtung +eines Textes. +
  +
Beispiel: +
  +

+
Der Funktion werden folgende Parameter übergeben: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
hor_in horizontale Ausrichtung + + + + + + + + + +
0 = linksbündig (default) +
1 = zentriert +
2 = rechtsbündig + +
+ +
vert_in vertikale Ausrichtung + + + + + + + + + + + + + + + + + + +
0 = Basislinie (default) +
1 = Halblinie +
2 = Zeichenoberkante +
3 = Zeichenzellenunterkante +
4 = Zeichenunterkante +
5 = Zeichenzellenoberkante + +
+ +
hor_out ausgewählte horizontale Ausrichtung +
vert_out ausgewählte vertikale Ausrichtung + +
+ +
Hinweis: Standardeinstellung ist der linke Rand der +Basislinie. Bei falscher Eingabe für die horizontale Ausrichtung wird der +Text linksjustiert. Eine fehlerhafte Angabe der vertikalen Ausrichtung +bewirkt Ausrichtung an der Basislinie. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all drivers. +
  +
Gruppe: Text-Attribute +
  +
Querverweis: Binding   v_gtext   v_justified +
  + +
+ +

7.4.6.50 Bindings für vst_alignment

+ + + + + + + + + +
C: void vst_alignment ( int16_t handle, int16_t hor_in, int16_t +vert_in, int16_t *hor_out, int16_t *vert_out ); +
  +
Umsetzung: +
  +
void vst_alignment (int16_t handle, int16_t hor_in,
+                    int16_t vert_in, int16_t *hor_out,
+                    int16_t *vert_out)
+{
+   intin[0] = hor_in;
+   intin[1] = vert_in;
+
+   contrl[0] = 39;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *hor_out  = intout[0];
+   *vert_out = intout[1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]39 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]2 # Einträge in intin
contrl+8contrl[4]2 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]hor_in
intin+2intin[1]vert_in
intoutintout[0]hor_out
intout+2intout[1]vert_out
+
+ + +
+ +

7.4.6.51 vst_arbpt

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set character cell height by arbitrary points« - Setzen der +Zeichenzellenhöhe in Punkten. +
  +
VDI-Nummer: 246 +
  +
Deklaration: int16_t vst_arbpt ( int16_t handle, int16_t point, int16_t +*chwd, int16_t *chht, int16_t *cellwd, int16_t *cellht ); +
  +
Beschreibung: Die Funktion setzt die aktuelle Zeichenhöhe in Printerpunkten. +Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
point gewünschte Zeichenhöhe +
chwd resultierende Zeichenbreite +
chht resultierende Zeichenhöhe +
cellwd resultierende Zeichenzellenbreite +
cellht resultierende Zeichenzellenhöhe + +
+ +
Hinweis: Im Gegensatz zu vst_point erlaubt die Funktion +die Skalierung in jeder Punktgröße, unabhängig davon, +welche Angaben in EXTEND.SYS stehen. +
  +
Wenn man negative Werte einstellt, werden die Zeichen an der +x-Achse gespiegelt. Bei den zurückgelieferten Zeichenbreiten handelt +es sich um gerundete Werte, die man nicht ohne weiteres zur +Breitenberechnung benutzen kann. +
  +
Ergebnis: Die Funktion liefert die gesetzte Zeichenhöhe in Punkten +zurück. +
  +
Verfügbar: Beim FSM-GDOS und SpeedoGDOS ab Version 4.00 +
  +
Gruppe: Text-Attribute +
  +
Querverweis: Binding   vst_arbpt32   vst_point   vst_setsize   SpeedoGDOS   +NVDI +
  + +
+ +

7.4.6.52 Bindings für vst_arbpt

+ + + + + + + + + +
C: int16_t vst_arbpt ( int16_t handle, int16_t point, int16_t +*chwd, int16_t *chht, int16_t *cellwd, int16_t *cellht ); +
  +
Umsetzung: +
  +
int16_t vst_arbpt (int16_t handle, int16_t point,
+                   int16_t *chwd, int16_t *chht,
+                   int16_t *cellwd, int16_t *cellht)
+{
+   intin[0] = point;
+
+   contrl[0] = 246;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *chwd   = ptsout[0];
+   *chht   = ptsout[1];
+   *cellwd = ptsout[2];
+   *cellht = ptsout[3];
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]246 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]2 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]point
ptsoutptsout[0]chwd
ptsout+2ptsout[1]chht
ptsout+4ptsout[2]cellwd
ptsout+6ptsout[3]cellht
intoutintout[0]Return-Wert
+
+ + +
+ +

7.4.6.53 vst_arbpt32

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set character cell height by arbitrary points« - Setzen der +Zeichenzellenhöhe in Punkten. +
  +
VDI-Nummer: 246 +
  +
Deklaration: fix31 vst_arbpt32 ( int16_t handle, fix31 point, int16_t *chwd, +int16_t *chht, int16_t *cellwd, int16_t *cellht ); +
  +
Beschreibung: Die Funktion setzt die aktuelle Zeichenhöhe in Printerpunkten. +Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
point gewünschte Zeichenhöhe +
chwd resultierende Zeichenbreite +
chht resultierende Zeichenhöhe +
cellwd resultierende Zeichenzellenbreite +
cellht resultierende Zeichenzellenhöhe + +
+ +
Hinweis: Im Gegensatz zu vst_point erlaubt die Funktion +die Skalierung in jeder Punktgröße, unabhängig davon, +welche Angaben in EXTEND.SYS stehen. +
  +
Wenn man negative Werte einstellt, werden die Zeichen an der +x-Achse gespiegelt. Bei den zurückgelieferten Zeichenbreiten handelt +es sich um gerundete Werte, die man nicht ohne weiteres zur +Breitenberechnung benutzen kann. +
  +
Ergebnis: Die Funktion liefert die gesetzte Zeichenhöhe in 1/65536 +Punkten zurück. +
  +
Aus der SpeedoGDOS Dokumentation geht das nicht hervor. Es ist +möglich das hier nur die Zeichenhöhe in Punkte zurückgeliefert +wird. +
  +
Verfügbar: Beim FSM-GDOS, SpeedoGDOS ab Version 4.00 und ab NVDI 3.00. In +der Doku zu NVDI 3.00 wird die Funktion fälschlicherweise vst_arbpt +genannt. +
  +
Gruppe: Text-Attribute +
  +
Querverweis: Binding   vst_point   vst_setsize   SpeedoGDOS   NVDI +
  + +
+ +

7.4.6.54 Bindings für vst_arbpt32

+ + + + + + + + + +
C: fix31 vst_arbpt32 ( int16_t handle, fix31 point, int16_t *chwd, +int16_t *chht, int16_t *cellwd, int16_t *cellht ); +
  +
Umsetzung: +
  +
fix31 vst_arbpt32 (int16_t handle, fix31 point,
+                   int16_t *chwd, int16_t *chht,
+                   int16_t *cellwd, int16_t *cellht)
+{
+   intin[0..1] = point;
+
+   contrl[0] = 246;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *chwd   = ptsout[0];
+   *chht   = ptsout[1];
+   *cellwd = ptsout[2];
+   *cellht = ptsout[3];
+
+   return ( intout[0..1] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]246 Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]2 # Einträge in ptsout
contrl+6contrl[3]2 # Einträge in intin
contrl+8contrl[4]2 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0..1]point
intoutintout[0..1]Return-Wert
ptsoutptsout[0]chwd
ptsout+2ptsout[1]chht
ptsout+4ptsout[2]cellwe
ptsout+6ptsout[3]cellht
+
+ + +
+ +

7.4.6.55 vst_bg_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Background Color« - Hintergrundfarbe setzen +
  +
VDI-Nummer: 201 (Unterfunktion 0) +
  +
Deklaration: int16_t vst_bg_color ( int16_t handle, int32_t color_space, +COLOR_ENTRY *fg_color ); +
  +
Beschreibung: Diese Funktionen setzen die Hintergrundfarbe für Text. +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
color_space Farbraum (z.Zt. nur 0 für eingestellten Farbraum oder +CSPACE_RGB) +
fg_color COLOR_ENTRY der Hintergrundfarbe + +
+ +
Ergebnis: -1 = falsche Unterfunktionsnummer +
 0 = Funktion nicht vorhanden +
 1 = alles in Ordnung +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Text-Attribute +
  +
Querverweis: Binding +
  + +
+ +

7.4.6.56 Bindings für vst_bg_color

+ + + + + + + + + +
C: int16_t vst_bg_color ( int16_t handle, int32_t color_space, +COLOR_ENTRY *fg_color ); +
  +
Umsetzung: +
  +
int16_t vst_bg_color( int16_t handle, int32_t color_space,
+                      COLOR_ENTRY *fg_color )
+{
+   intin[0..1] = color_space;
+   intin[2..5] = fg_color;
+
+   contrl[0] = 201;
+   contrl[1] = 0;
+   contrl[3] = 6;
+   contrl[5] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]201 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]6 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]0
contrl+12contrl[6]handle
intinintin[0..1]color_space
intin+4intin[2..5]fg_color
intoutintout[0]Return-Wert
+
+ + +
+ +

7.4.6.57 vst_charmap

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set character mapping mode« - wählt die Art der +Zeichensatzindizierung +
  +
VDI-Nummer: 236 +
  +
Deklaration: void vst_charmap ( int16_t handle, int16_t mode ); +
  +
Beschreibung: Die Funktion legt die Art der Zeichensatzindizierung fest. Es +gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
mode Art der Indizierung + + + + + + +
0 = direktes Mapping, d.h. keine Umsetzung des Zeichen-Index +
1 = Zeichen-Index wird als ASCII-Wert interpretiert + +
+ + +
+ +
Für SpeedoGDOS gilt: +
  + + + +
mode Art der Indizierung + + + + + + +
0 = Atari characters +
1 = Bitstream + +
+ + +
+ +
Hinweis: Durch Umschalten auf direktes Mapping ändert +sich die Anzahl der vorhandenen Zeichen pro Font von 256 auf die +tatsächlich verfügbare Zahl an Zeichen. +
  +
Ab NVDI 4.00 gibt es einer erweiterte Version: vst_map_mode +
  +
Ergebnis: Die Funktion liefert kein Ergebnis zurück +
  +
Verfügbar: SpeedoGDOS 4.0, NVDI 3.00 +
  +
Gruppe: Text-Attribute +
  +
Querverweis: Binding   vst_map_mode   vqt_fontinfo   ASCII-Tabelle +
  + +
+ +

7.4.6.58 Bindings für vst_charmap

+ + + + + + + + + +
C: void vst_charmap ( int16_t handle, int16_t mode ); +
  +
Umsetzung: +
  +
void vst_charmap (int16_t handle, int16_t mode)
+{
+   intin[0] = mode;
+
+   contrl[0] = 236;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]236 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]mode
+
+ + +
+ +

7.4.6.59 vst_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Graphic Text Color Index« - bestimmt die Farbe der +Textausgaben. +
  +
VDI-Nummer: 22 +
  +
Deklaration: int16_t vst_color ( int16_t handle, int16_t color_index ); +
  +
Beschreibung: Die Funktion setzt die Text-Farbe. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
color_index gewünschte Textfarbe + +
+ +
Hinweis: Die Farb-Indizes 0 und 1 sind immer verfügbar; +alle weiteren sind vom verwendeten Ausgabegerät abhängig. Bei Angabe +eines ungültigen Indexes wird der Wert 1 angenommen. +
  +
Ergebnis: Die Funktion liefert die tatsächlich eingestellte Farbe. +
  +
Verfügbar: Supported by all drivers. +
  +
Gruppe: Text-Attribute +
  +
Querverweis: Binding   v_gtext   v_justified +
  + +
+ +

7.4.6.60 Bindings für vst_color

+ + + + + + + + + +
C: int16_t vst_color ( int16_t handle, int16_t color_index ); +
  +
Umsetzung: +
  +
int16_t vst_color (int16_t handle, int16_t color_index)
+{
+   intin[0] = color_index;
+
+   contrl[0] = 22;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]22 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]color_index
intoutintout[0]Return-Wert
+
+ + +
+ +

7.4.6.61 vst_effects

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Graphic Text Special Effects« - legt Spezialeffekte für +Textausgaben fest. +
  +
VDI-Nummer: 106 +
  +
Deklaration: int16_t vst_effects ( int16_t handle, int16_t effect ); +
  +
Beschreibung: Die Funktion legt verschiedene Texteffekte fest. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
effect Texteffekt in Bit-Darstellung + + + + + + + + + + + + + + + + + + + + + +
0x00 = normal +
0x01 = fett +
0x02 = hell +
0x04 = kursiv +
0x08 = unterstrichen +
0x10 = hohl +
0x20 = schattiert + +
+ + +
+ +
Hinweis: Die Texteffekte können durch eine +Oder-Verknüpfung auch gemischt werden; nicht verfügbare Effekte +werden nicht gesetzt. +
  +
Ergebnis: Die Funktion liefert den ausgewählten Texteffekt. +
  +
Verfügbar: Supported by all drivers. +
  +
Gruppe: Text-Attribute +
  +
Querverweis: Binding   v_gtext   v_justified +
  + +
+ +

7.4.6.62 Bindings für vst_effects

+ + + + + + + + + +
C: int16_t vst_effects ( int16_t handle, int16_t effect ); +
  +
Umsetzung: +
  +
int16_t vst_effects (int16_t handle, int16_t effect)
+{
+   intin[0] = effect;
+
+   contrl[0] = 106;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]106 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]effect
intoutintout[0]Return-Wert
+
+ + +
+ +

7.4.6.63 vst_error

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Outline Font error mode« - Setzen der GDOS +Fehlerbehandlung. +
  +
VDI-Nummer: 245 +
  +
Deklaration: void vst_error ( int16_t handle, int16_t mode, int16_t +*errorvar ); +
  +
Beschreibung: Die Funktion bestimmt die Art der GDOS-Fehlerbehandlung. Es +gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
mode Art der Fehlerbehandlung + + + + + + +
0 = Ausgabe in globale Variable +
1 = Ausgabe auf Bildschirm (default) + +
+ +
errorvar Adresse der Fehlervariablen, die mit Null initialisiert sein +sollte. Folgende Fehlercodes gelten für SpeedoGDOS 4.xx: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
1 = Out of system memory (Misc cache) +
2 = Error opening font file +
3 = Error reading font file +
4 = Error while writiing out cache buffer +
5 = Font scaler error +
6 = (not implemented +
7 = Not enough memory for scratch buffer +
8 = Out of system memory (character cache) +
255 = Misc Speedo Error + +
+ +
Bei SpeedoGDOS 5.0 scheint sich die Bedeutung geändert zu +haben: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
1 = Nicht ausreichend Fontdaten geladen +
3 = Unzulässige Font-Spezifikationen angefordert +
4 = Fontformat-Fehler (Sehr häufig ein kundenspezifischer Font, +der nur für ein bestimmtes Programm lizensiert ist.) +
5 = Requested specs not compatible with output module +
7 = Rules requested; not supported +
8 = Modus nicht verfügbar +
10 = Font nicht angegeben +
11 = Squeezing/Clipping requested but not supported +
12 = Zeichen-Daten nicht verfügbar +
13 = Track-Kerning Daten nicht verfügbar +
14 = Paar-Kerning Daten nicht verfügbar + +
+ +
NVDI >= 3.01 benutzt die Fehler-Nummern von SpeedoGDOS 5.0, +wenn Speedo-Fonts bearbeitet werden. Ausserdem werden diverse +Fehler-Nummern >= 0x1000 berichtet, wenn TrueType-Fonts bearbeitet +werden: + + + +
+ + +
+ +
Hinweis: Die Fehlervariable errorvar sollte vor +dem Aufruf der folgenden GDOS-Funktionen abgefragt werden: +
  +
v_gtext            v_ftext
+v_justified        vst_point
+vst_height         vst_font
+vst_arbpt          vqt_advance
+vst_setsize        vqt_fontinfo
+vqt_name           vqt_width
+vqt_extent         vqt_f_extent
+v_opnwk            v_opnvwk
+vst_load_fonts     vst_unload_fonts
+
+
Ergebnis: Diese Funktion liefert kein Ergebnis. +
  +
Verfügbar: Beim FSM-GDOS, Font-GDOS, SpeedoGDOS ab Version 4.00, und NVDI +ab Version 3.01. +
  +
Gruppe: Text-Attribute +
  +
Querverweis: Binding   GDOS   SpeedoGDOS +
  + +
+ +

7.4.6.64 Bindings für vst_error

+ + + + + + + + + +
C: void vst_error ( int16_t handle, int16_t mode, int16_t +*errorvar ); +
  +
Umsetzung: +
  +
void vst_error ( int16_t handle, int16_t mode,
+                 int16_t *errorvar )
+{
+   intin[0] = mode;
+   intin[1..2] = errorvar;
+
+   contrl[0] = 245;
+   contrl[1] = 0;
+   contrl[3] = 3;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]245 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]1 # Einträge in ptsout
contrl+6contrl[3]3 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]mode
intin+2intin[1..2]errorvar
+
+ + +
+ +

7.4.6.65 vst_fg_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Foreground Color« - Vordergrundfarbe setzen +
  +
VDI-Nummer: 200 (Unterfunktion 0) +
  +
Deklaration: int16_t vst_fg_color ( int16_t handle, int32_t color_space, +COLOR_ENTRY *fg_color ); +
  +
Beschreibung: Diese Funktionen setzen die Vordergrundfarbe für Text. +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
color_space Farbraum (z.Zt. nur 0 für eingestellten Farbraum oder +CSPACE_RGB) +
fg_color COLOR_ENTRY der Vordergrundfarbe + +
+ +
Ergebnis: -1 = falsche Unterfunktionsnummer +
 0 = Funktion nicht vorhanden +
 1 = alles in Ordnung +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Text-Attribute +
  +
Querverweis: Binding +
  + +
+ +

7.4.6.66 Bindings für vst_fg_color

+ + + + + + + + + +
C: int16_t vst_fg_color ( int16_t handle, int32_t color_space, +COLOR_ENTRY *fg_color ); +
  +
Umsetzung: +
  +
int16_t vst_fg_color( int16_t handle, int32_t color_space,
+                      COLOR_ENTRY *fg_color )
+{
+   intin[0..1] = color_space;
+   intin[2..5] = fg_color;
+
+   contrl[0] = 200;
+   contrl[1] = 0;
+   contrl[3] = 6;
+   contrl[5] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]200 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]6 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]0
contrl+12contrl[6]handle
intinintin[0..1]color_space
intin+4intin[2..5]fg_color
intoutintout[0]Return-Wert
+
+ + +
+ +

7.4.6.67 vst_font

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Text Face« - wählt einen Zeichensatz für die +Textausgabe. +
  +
VDI-Nummer: 21 +
  +
Deklaration: int16_t vst_font ( int16_t handle, int16_t font ); +
  +
Beschreibung: Die Funktion wählt einen Zeichensatz für nachfolgende +Textausgaben aus. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
font Index des Zeichensatzes + +
+ +
Hinweis: Die Namen und Indizes der Zeichensätze können +über die Funktion vqt_name ermittelt werden. Ob Zeichensätze +unterstützt werden, hängt vom jeweiligen Ausgabegerät ab. +
  +
Sollte der Zeichensatz font nicht vorhanden sein, wird +auf den Systemzeichensatz umgeschaltet. +
  +
Ergebnis: Die Funktion liefert die Nummer des tatsächlich gewählten +Zeichensatzes. +
  +
Verfügbar: Supported by all drivers. +
  +
Gruppe: Text-Attribute +
  +
Querverweis: Binding   vst_load_fonts   vqt_name   v_gtext v_justified +
  + +
+ +

7.4.6.68 Bindings für vst_font

+ + + + + + + + + +
C: int16_t vst_font ( int16_t handle, int16_t font ); +
  +
Umsetzung: +
  +
int16_t vst_font (int16_t handle, int16_t font)
+{
+   intin[0] = font;
+
+   contrl[0] = 21;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]21 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]font
intoutintout[0]Return-Wert
+
+ + +
+ +

7.4.6.69 vst_height

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Character Height, absolute Mode« - bestimmt die +Zeichenhöhe bei Textausgaben. +
  +
VDI-Nummer: 12 +
  +
Deklaration: void vst_height ( int16_t handle, int16_t height, int16_t +*char_width, int16_t *char_height, int16_t *cell_width, int16_t +*cell_height ); +
  +
Beschreibung: Die Funktion legt die absolute Zeichenhöhe bei Textausgaben +fest. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
height Zeichenhöhe +
char_width gewählte Zeichenbreite +
char_height gewählte Zeichenhöhe +
cell_width Zeichenzellenbreite +
cell_height Zeichenzellenhöhe + +
+ +
Hinweis: Falls die gewünschte Zeichenhöhe nicht +verfügbar ist, wird automatisch die nächstkleinere gewählt. Bei +Proportionalfonts enthalten die Ausgabeparameter die Breite des +breitesten Zeichens im Zeichensatz. +
  +
Die meisten Bildschirmtreiber können bei dieser Funktion +vorhandene Zeichensätze beliebig verkleinern, oder auf das doppelte +vergrößern. Dies gilt insbesondere für den im ROM implementierten +Bildschirmtreiber. +
  +
Bei Vektorfonts stellen die ausgegebenen Breiten von +char_width und cell_width gerundete Werte dar. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all drivers. +
  +
Gruppe: Text-Attribute +
  +
Querverweis: Binding   v_gtext   v_justified   vst_point +
  + +
+ +

7.4.6.70 Bindings für vst_height

+ + + + + + + + + +
C: void vst_height ( int16_t handle, int16_t height, int16_t +*char_width, int16_t *char_height, int16_t *cell_width, int16_t +*cell_height ); +
  +
Umsetzung: +
  +
void vst_height (int16_t handle, int16_t height,
+                 int16_t *char_width, int16_t *char_height,
+                 int16_t *cell_width, int16_t *cell_height)
+{
+   ptsin[0] = 0;
+   ptsin[1] = height;
+
+   contrl[0] = 12;
+   contrl[1] = 1;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *char_width  = ptsout[0];
+   *char_height = ptsout[1];
+   *cell_width  = ptsout[2];
+   *cell_height = ptsout[3];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]12 # Opcode der Funktion
contrl+2contrl[1]1 # Einträge in ptsin
contrl+4contrl[2]2 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
ptsinptsin[0]0
ptsin+2ptsin[1]height
ptsoutptsout[0]char_width
ptsout+2ptsout[1]char_height
ptsout+4ptsout[2]cell_width
ptsout+6ptsout[3]cell_height
+
+ + +
+ +

7.4.6.71 vst_kern

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set kerning mode« - Kerning Modus setzen +
  +
VDI-Nummer: 237 +
  +
Deklaration: void vst_kern ( int16_t handle, int16_t tmode, int16_t pmode, +int16_t *tracks, int16_t *pairs ); +
  +
Beschreibung: Die Funktion erlaubt das Setzen des gewünschten Kerning-Modus. +Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
tmode Track-Kerning + + + + + + + + + + + + +
0 = kein Kerning +
1 = normales Kerning +
2 = enges Kerning +
3 = sehr enges Kerning + +
+ +
pmode Pair-Kerning + + + + + + +
0 = ausschalten +
1 = einschalten + +
+ +
tracks gesetzter Track-Kerning Modus +
pairs Anzahl der Kerning-Paare im Zeichensatz + +
+ +
Hinweis: Informationen für Track-Kerning sind in den +meisten Speedo-Fonts enthalten. TrueType-Fonts bieten normalerweise +kein Track-Kerning; anders ist dies jedoch bei den neuen TrueType-GX-Fonts. +
  +
Unter NVDI kann per vst_track_offset ein selbstdefiniertes +Track-Kerning eingestellt werden. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Verfügbar: ab SpeedoGDOS 4.00 und ab NVDI 3.00 +
  +
Gruppe: Text-Attribute +
  +
Querverweis: Binding   vqt_pairkern   vqt_trackkern   vst_track_offset +
  + +
+ +

7.4.6.72 Bindings für vst_kern

+ + + + + + + + + +
C: void vst_kern ( int16_t handle, int16_t tmode, int16_t pmode, +int16_t *tracks, int16_t *pairs ); +
  +
Umsetzung: +
  +
void vst_kern (int16_t handle, int16_t tmode, int16_t pmode,
+               int16_t *tracks, int16_t *pairs)
+{
+   intin[0] = tmode;
+   intin[1] = pmode;
+
+   contrl[0] = 237;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *tracks = intout[0];
+   *pairs  = intout[1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]237 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]2 # Einträge in intin
contrl+8contrl[4]2 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]tmode
intin+2intin[1]pmode
intoutintout[0]tracks
intout+2intout[1]pairs
+
+ + +
+ +

7.4.6.73 vst_map_mode

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set character mapping mode« - wählt die Art der +Zeichensatzindizierung +
  +
VDI-Nummer: 236 +
  +
Deklaration: int16_t vst_map_mode ( int16_t handle, int16_t mode ); +
  +
Beschreibung: Die Funktion legt die Art der Zeichensatzindizierung fest. Es +gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
mode Art der Indizierung + + + + + + + + + +
0 = direktes Mapping, d.h. keine Umsetzung des Zeichen-Index +
1 = ASCII-Wert +
2 = Unicode + +
+ + +
+ +
Hinweis: Durch Umschalten auf direktes Mapping ändert +sich die Anzahl der vorhandenen Zeichen pro Font von 256 auf die +tatsächlich verfügbare Zahl an Zeichen. +
  +
Wenn man Unicode anwählt und feststellen möchte, ob ein +bestimmtes Zeichen im eingestellten Font existiert, kann man vqt_width +für dieses Zeichen aufrufen. Sollte vqt_width als Index -1 +zurückliefern, existiert das Zeichen nicht. Alternativ zu vqt_width +kann man auch vqt_char_index aufrufen und den fraglichen Unicode in +einen direkten Index wandeln lassen. +
  +
Ergebnis: Die Funktion liefert das ausgewählte Mapping. +
  +
Verfügbar: NVDI 4.0 +
  +
Gruppe: Text-Attribute +
  +
Querverweis: Binding   vst_charmap   vqt_fontinfo   ASCII-Tabelle +
  + +
+ +

7.4.6.74 Bindings für vst_map_mode

+ + + + + + + + + +
C: int16_t vst_map_mode ( int16_t handle, int16_t mode ); +
  +
Umsetzung: +
  +
int16_t vst_map_mode (int16_t handle, int16_t mode)
+{
+   intin[0] = mode;
+   intin[1] = 1;       /* Mapping zurückliefern */
+
+   contrl[0] = 236;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[5] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]236 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]2 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]mode
intin+2intin[1]1
intoutintout[0]Return-Wert
+
+ + +
+ +

7.4.6.75 vst_name

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set text face by name« - Zeichensatz suchen und einstellen +
  +
VDI-Nummer: 230 (Opcode 0) +
  +
Deklaration: int16_t vst_name ( int16_t handle, int16_t font_format, int8_t +*font_name, int8_t *ret_name ); +
  +
Beschreibung: Die Funktion sucht einen Zeichensatz, und stellt ihn ein. Es +gilt: +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
font_format gewünschtes Zeichensatz-Format + + + + + + + + + + + + +
1 = Bitmap-Font +
2 = Speedo +
4 = TrueType +
8 = Type-1 + +
+ +
font_name gewünschter Zeichensatz-Name +
ret_name Name des eingestellten Fonts + +
+ +
Hinweis: Fehlende oder überschüssige Leerzeichen +werden bei der Suche ignoriert. Wenn in den angegebenen Formaten kein +Zeichensatz des gesuchten Namens vorhanden ist, wird der System-Font +gesetzt. +
  +
Ergebnis: Die Funktion liefert die ID des eingestellten Zeichensatzes +zurück. +
  +
Verfügbar: Die Funktion steht unter NVDI ab Version 3.02 zur Verfügung. +
  +
Gruppe: Text-Attribute +
  +
Querverweis: Binding   vqt_name   vqt_xfntinfo +
  + +
+ +

7.4.6.76 Bindings für vst_name

+ + + + + + + + + +
C: int16_t vst_name ( int16_t handle, int16_t font_format, int8_t +*font_name, int8_t *ret_name ); +
  +
Umsetzung: +
  +
int16_t vst_name (int16_t handle, int16_t font_format,
+                  int8_t *font_name, int8_t *ret_name)
+{
+   intin[0] = font_format;
+   intin[1..n] = font_name[0..n-1];
+
+   contrl[0] = 230;
+   contrl[1] = 0;
+   contrl[3] = n;
+   contrl[5] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   ret_name[0..m-1] = intout[1..m];
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]230 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]n # Einträge in intin
contrl+8contrl[4]m # Einträge in intout
contrl+10contrl[5]0 Unterfunktion
contrl+12contrl[6]handle
intinintin[0]font_format
intin+2intin[1..n]font_name[0..n-1]
intoutintout[0]Return-Wert
intout+2intout[1..m]ret_name[0..m-1]
+
+ + +
+ +

7.4.6.77 vst_point

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Character Height, Points Mode« - bestimmt die +Zeichenzellengröße bei Textausgaben. +
  +
VDI-Nummer: 107 +
  +
Deklaration: int16_t vst_point ( int16_t handle, int16_t point, int16_t +*char_width, int16_t *char_height, int16_t *cell_width, int16_t +*cell_height ); +
  +
Beschreibung: Die Funktion setzt die Zeichenzellengröße, d.h. den Abstand +zweier Basislinien. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
point Zeichenzellenhöhe +
char_width gewählte Zeichenbreite +
char_height gewählte Zeichenhöhe +
cell_width gewählte Zeichenzellenbreite +
cell_height gewählte Zeichenzellenhöhe + +
+ +
Der Abstand wird in Point gemessen. Hierunter versteht man 1/72 +Zoll oder ca. 0.353mm. +
  +
Hinweis: Falls die gewünschte Zeichenhöhe nicht +verfügbar ist, wird die nächstkleinere gewählt. Bei proportionalen +Zeichensätzen werden für Breite/Höhe die maximal möglichen Werte +zurückgeliefert. +
  +
Bei Vektorfonts kann man mit dieser Funktion nur die +vordefinierten Höhen anwählen (in der Regel sind das +8,9,10,11,12,14,18,24,36, und 48 pt). +
  +
Achtung: Der Bildschirmtreiber im ROM kann vorhandene +Zeichensätze auf die jeweils doppelte Größe skalieren, so daß es +nicht ohne weiteres möglich ist, zwischen skalierten und +tatsächlich vorhandenen Fonts zu unterscheiden. Man kann sich hier +mit einer Routine behelfen, die alle vorhandenen Punktgrößen +ermittelt, da vst_point bei Angabe einer falschen Größe die +nächstkleinere und vorhandene Größe wählt. Wenn man auf diese Art +und Weise feststellt, daß alle Punktgrößen vorhanden sind, +liegt offensichtlich ein Vektorfont vor. +
  +
Ergebnis: Die Funktion liefert die Zeichenzellenhöhe in Point. +
  +
Verfügbar: Supported by all drivers. +
  +
Gruppe: Text-Attribute +
  +
Querverweis: Binding   v_gtext   v_justified   vst_height +
  + +
+ +

7.4.6.78 Bindings für vst_point

+ + + + + + + + + +
C: int16_t vst_point ( int16_t handle, int16_t point, int16_t +*char_width, int16_t *char_height, int16_t *cell_width, int16_t +*cell_height ); +
  +
Umsetzung: +
  +
int16_t vst_point (int16_t handle, int16_t point,
+                   int16_t *char_width, int16_t *char_height,
+                   int16_t *cell_width, int16_t *cell_height)
+{
+   intin[0] = point;
+
+   contrl[0] = 107;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *char_width  = ptsout[0];
+   *char_height = ptsout[1];
+   *cell_width  = ptsout[2];
+   *cell_height = ptsout[3];
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]107 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]2 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]point
intoutintout[0]Return-Wert
ptsoutptsout[0]char_width
ptsout+2ptsout[1]char_height
ptsout+4ptsout[2]cell_width
ptsout+6ptsout[3]cell_height
+
+ + +
+ +

7.4.6.79 vst_rotation

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Character Baseline Vector« - Bestimmt die Ausrichtung +der Basislinie für Textausgaben. +
  +
VDI-Nummer: 13 +
  +
Deklaration: int16_t vst_rotation ( int16_t handle, int16_t angle ); +
  +
Beschreibung: Die Funktion legt die Ausrichtung der Basislinie für Textausgaben +fest. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
angle gewünschte Ausrichtung der Basislinie + +
+ +
Hinweis: Der Winkel wird in 1/10 Grad angegeben. Für +Bitmapfonts ist die Rotation nur in 90-Grad-Schritten möglich; bei +Vektorfonts stufenlos. Auf einigen Geräten ist diese Funktion +nicht verfügbar. +
  +
Ergebnis: Die Funktion liefert den tatsächlich gewählten Winkel. +
  +
Verfügbar: Supported by all drivers. For specific character rotation +abilities, check the values returned in vq_extnd(). +
  +
Gruppe: Text-Attribute +
  +
Querverweis: Binding   v_gtext   v_justified +
  + +
+ +

7.4.6.80 Bindings für vst_rotation

+ + + + + + + + + +
C: int16_t vst_rotation ( int16_t handle, int16_t angle ); +
  +
Umsetzung: +
  +
int16_t vst_rotation (int16_t handle, int16_t angle)
+{
+   intin[0] = angle;
+
+   contrl[0] = 13;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]13 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]angle
intoutintout[0]Return-Wert
+
+ + +
+ +

7.4.6.81 vst_scratch

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set scratch buffer allocation mode« - Scratch-Buffers +
  +
VDI-Nummer: 244 +
  +
Deklaration: void vst_scratch ( int16_t handle, int16_t mode ); +
  +
Beschreibung: Die Funktion legt die Art fest, mit der der Scratch-Buffers +angelegt werden soll. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
mode Art des Buffers + + + + + + + + + +
0 = Berücksichtigung von Bitmap- und Vektorfonts (default) +
1 = Größe richtet sich nach den Bitmap-Fonts. Auf Texteffekte +für Vektorfonts sollte verzichtet werden. +
2 = keinen Scratch-Buffer anlegen, und auf Texteffekte verzichten + +
+ + +
+ +
Hinweis: Der Scratch-Buffer dient der Generierung von +Texteffekten. Da Vektor-Zeichensätze frei skalierbar sind, kann dem +Scratch-Buffer keine eindeutige Größe zugeordnet werden. +
  +
Ergebnis: Diese Funktion liefert kein Ergebnis. +
  +
Verfügbar: Beim FSM-GDOS und SpeedoGDOS ab Version 4.00. +
  +
Gruppe: Text-Attribute +
  +
Querverweis: Binding   GDOS   SpeedoGDOS   vst_effects +
  + +
+ +

7.4.6.82 Bindings für vst_scratch

+ + + + + + + + + +
C: void vst_scratch ( int16_t handle, int16_t mode ); +
  +
Umsetzung: +
  +
void vst_scratch ( int16_t handle, int16_t mode );
+{
+   intin[0] = mode;
+
+   contrl[0] = 244;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]244 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]1 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]mode
+
+ + +
+ +

7.4.6.83 vst_setsize

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set character cell width by arbitrary points« - Setzen der +Zeichenzellenbreite in Punkten. +
  +
VDI-Nummer: 252 +
  +
Deklaration: int16_t vst_setsize ( int16_t handle, int16_t point, int16_t +*chwd, int16_t *chht, int16_t *cellwd, int16_t *cellht ); +
  +
Beschreibung: Die Funktion setzt die Zeichenbreite in Pixel. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
point gewünschte Zeichenbreite +
chwd resultierende Zeichenbreite +
chht resultierende Zeichenhöhe +
cellwd resultierende Zeichenzellenbreite +
cellht resultierende Zeichenzellenhöhe + +
+ +
Hinweis: Durch einen Aufruf von vst_point, vst_arbpt +oder vst_height wird die durch den Funktionsaufruf gesetzte Breite +wieder aufgehoben, und die vom jeweiligen Zeichen verlangte Breite +eingestellt. Bei negativen Breiten werden die Zeichen an der y-Achse +gespiegelt. +
  +
Ergebnis: Die Funktion liefert die gesetzte Zeichenzellenbreite in +Punkten zurück. +
  +
Verfügbar: Beim FSM-GDOS und SpeedoGDOS ab Version 4.00. +
  +
Gruppe: Text-Attribute +
  +
Querverweis: Binding   vst_setsize32   vst_point   vst_height   vst_arbpt +
  + +
+ +

7.4.6.84 Bindings für vst_setsize

+ + + + + + + + + +
C: int16_t vst_setsize ( int16_t handle, int16_t point, int16_t +*chwd, int16_t *chht, int16_t *cellwd, int16_t *cellht ); +
  +
Umsetzung: +
  +
int16_t vst_setsize (int16_t handle, int16_t point,
+                     int16_t *chwd, int16_t *chht,
+                     int16_t *cellwd, int16_t *cellht)
+{
+   intin[0] = point;
+
+   contrl[0] = 252;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *chwd   = ptsout[0];
+   *chht   = ptsout[1];
+   *cellwd = ptsout[2];
+   *cellht = ptsout[3];
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]252 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]2 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]point
intoutintout[0]Return-Wert
ptsoutptsout[0]chwd
ptsout+2ptsout[1]chht
ptsout+4ptsout[2]cellwd
ptsout+6ptsout[3]cellht
+
+ + +
+ +

7.4.6.85 vst_setsize32

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set character cell width in arbitrary points« - Setzen der +Zeichenzellenbreite in Punkten. +
  +
VDI-Nummer: 252 +
  +
Deklaration: fix31 vst_setsize32 ( int16_t handle, fix31 point, int16_t +*chwd, int16_t *chht, int16_t *cellwd, int16_t *cellht ); +
  +
Beschreibung: Die Funktion setzt die Zeichenbreite in 1/65536 Punkten. Es +gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
point gewünschte Zeichenbreite +
chwd resultierende Zeichenbreite +
chht resultierende Zeichenhöhe +
cellwd resultierende Zeichenzellenbreite +
cellht resultierende Zeichenzellenhöhe + +
+ +
Hinweis: Durch einen Aufruf von vst_point, vst_arbpt +oder vst_height wird die durch den Funktionsaufruf gesetzte Breite +wieder aufgehoben, und die vom jeweiligen Zeichen verlangte Breite +eingestellt. Bei negativen Breiten werden die Zeichen an der y-Achse +gespiegelt. +
  +
Ergebnis: Die Funktion liefert die gesetzte Zeichenzellenbreite in +1/65536 Punkten zurück. +
  +
Verfügbar: ab SpeedoGDOS 4.00 und ab NVDI 3.00. In der Doku zu NVDI 3.00 +wird die Funktion fälschlicherweise vst_setsize genannt. +
  +
Gruppe: Text-Attribute +
  +
Querverweis: Binding   vst_point   vst_height   vst_arbpt +
  + +
+ +

7.4.6.86 Bindings für vst_setsize32

+ + + + + + + + + +
C: fix31 vst_setsize32 ( int16_t handle, fix31 point, int16_t +*chwd, int16_t *chht, int16_t *cellwd, int16_t *cellht ); +
  +
Umsetzung: +
  +
fix31 vst_setsize32 (int16_t handle, fix31 point,
+                     int16_t *chwd, int16_t *chht,
+                     int16_t *cellwd, int16_t *cellht)
+{
+   intin[0..1] = point;
+
+   contrl[0] = 252;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *chwd   = ptsout[0];
+   *chht   = ptsout[1];
+   *cellwd = ptsout[2];
+   *cellht = ptsout[3];
+
+   return ( intout[0..1] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]252 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]2 # Einträge in ptsout
contrl+6contrl[3]2 # Einträge in intin
contrl+8contrl[4]2 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0..1]point
intoutintout[0..1]Return-Wert
ptsoutptsout[0]chwd
ptsout+2ptsout[1]chht
ptsout+4ptsout[2]cellwd
ptsout+6ptsout[3]cellht
+
+ + +
+ +

7.4.6.87 vst_skew

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set outline font skew« - Setzen des Neigungsgrades für +kursive Schrift. +
  +
VDI-Nummer: 253 +
  +
Deklaration: int16_t vst_skew ( int16_t handle, int16_t skew ); +
  +
Beschreibung: Die Funktion setzt den Neigungsgrad für Kursivschrift. Es +gilt: +
  + + + + + + + + + +
Parameter Bedeutung +
  +
handle Kennung der Workstation +
  +
skew gewünschter Winkel +
  + +
+ +
Hinweis: Der Winkel wird in zehntel Grad angegeben und +darf zwischen -90° und +90° variieren. Wie überall im VDI sind auch +hier die Winkel entgegen dem Uhrzeigersinn gerichtet. Positive Winkel +führen zu einer Neigung nach links, wogegen negative Winkel Zeichen +nach rechts neigen. +
  +
Diese Funktion kann eigentlich nur als nette Spielerei angesehen +werden, da die erzeugten Zeichen grundsätzlich schlechter aussehen, +als ein richtiger Italic Zeichensatz. +
  +
Ergebnis: Die Funktion liefert den gesetzten Neigungsgrad zurück. +
  +
Verfügbar: Beim FSM-GDOS, SpeedoGDOS ab Version 4.00 und ab NVDI 3.00. +
  +
Gruppe: Text-Attribute +
  +
Querverweis: Binding   vst_effects   SpeedoGDOS   NVDI +
  + +
+ +

7.4.6.88 Bindings für vst_skew

+ + + + + + + + + +
C: int16_t vst_skew ( int16_t handle, int16_t skew ); +
  +
Umsetzung: +
  +
int16_t vst_skew (int16_t handle, int16_t skew)
+{
+   intin[0] = skew;
+
+   contrl[0] = 253;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]253 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]skew
intoutintout[0]Return-Wert
+
+ + +
+ +

7.4.6.89 vst_track_offset

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set track-kerning offset« - Offset für Trackkerning setzen +
  +
VDI-Nummer: 237 (Opcode 255) +
  +
Deklaration: void vst_track_offset ( int16_t handle, fix31 offset, int16_t +pairmode, int16_t *tracks, int16_t *pairs ); +
  +
Beschreibung: Die Funktion ermöglicht es, ein selbstdefiniertes +Track-Kerning einzustellen. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
offset gewünschter Abstand +
pairmode Pair-Kerning + + + + + + +
0 = ausschalten +
1 = einschalten + +
+ +
tracks gesetzter Track-Kerning Modus +
pairs Anzahl der Kerning-Paare im Zeichensatz + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Die Funktion steht unter NVDI ab Version 3.00 zur Verfügung. +
  +
Gruppe: Text-Attribute +
  +
Querverweis: Binding   vqt_pairkern   vqt_trackkern   vst_kern +
  + +
+ +

7.4.6.90 Bindings für vst_track_offset

+ + + + + + + + + +
C: void vst_track_offset ( int16_t handle, fix31 offset, int16_t +pairmode, int16_t *tracks, int16_t *pairs ); +
  +
Umsetzung: +
  +
void vst_track_offset (int16_t handle, fix31 offset,
+                       int16_t pairmode, int16_t *tracks,
+                       int16_t *pairs)
+{
+   intin[0] = 255;
+   intin[1] = pairmode;
+   intin[2..3] = offset;
+
+   contrl[0] = 237;
+   contrl[1] = 0;
+   contrl[3] = 4;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *tracks = intout[0];
+   *pairs  = intout[1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]237 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]4 # Einträge in intin
contrl+8contrl[4]2 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]255
intin+2intin[1]pairmode
intin+4intin[2..3]offset
intoutintout[0]tracks
intout+2intout[1]pairs
+
+ + +
+ +

7.4.6.91 vst_width

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set character width (absolute mode)« - Zeichenbreite in +Pixeln setzen +
  +
VDI-Nummer: 231 +
  +
Deklaration: void vst_width ( int16_t handle, int16_t width, int16_t +*char_width, int16_t *char_height, int16_t *cell_width, int16_t +*cell_height ); +
  +
Beschreibung: Die Funktion setzt die Zeichenbreite in Pixeln. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
width gewünschte Zeichenbreite +
char_width ausgewählte Zeichenbreite +
char_height ausgewählte Zeichenhöhe +
cell_width ausgewählte Zeichenzellenbreite +
cell_height ausgewählte Zeichenzellenhöhe + +
+ +
Hinweis: Durch den nächsten Aufruf von vst_height, +vst_point oder vst_arbpt32 wird die gesetzte Breite wieder +zurückgesetzt. Zum Einstellen des Breiten-Höhen Verhältnisses ist +vst_setsize32 besser geeignet, da diese Funktion eine feinere +Einstellung ermöglicht. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: ab SpeedoGDOS 4.20 und ab NVDI 3.00 +
  +
Gruppe: Text-Attribute +
  +
Querverweis: Binding   vst_arbpt   vst_height   vst_point   vst_setsize +
  + +
+ +

7.4.6.92 Bindings für vst_width

+ + + + + + + + + +
C: void vst_width ( int16_t handle, int16_t width, int16_t +*char_width, int16_t *char_height, int16_t *cell_width, int16_t +*cell_height ); +
  +
Umsetzung: +
  +
void vst_width (int16_t handle, int16_t width,
+                int16_t *char_width, int16_t *char_height,
+                int16_t *cell_width, int16_t *cell_height)
+{
+   ptsin[0] = width;
+
+   contrl[0] = 231;
+   contrl[1] = 1;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *char_width  = ptsout[0];
+   *char_height = ptsout[1];
+   *cell_width  = ptsout[2];
+   *cell_height = ptsout[3];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]231 # Opcode der Funktion
contrl+2contrl[1]1 # Einträge in ptsin
contrl+4contrl[2]2 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
ptsinptsin[0]width
ptsoutptsout[0]char_width
ptsout+2ptsout[1]char_height
ptsout+4ptsout[2]cell_width
ptsout+6ptsout[3]cell_height
+
+ + +
+ +

7.4.6.93 v_topbot

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Character Height, absolute Mode« - bestimmt die +Zeichenhöhe bei Textausgaben. +
  +
VDI-Nummer: 5 (Escape 18501) +
  +
Deklaration: void v_topbot ( int16_t handle, int16_t height, int16_t +*char_width, int16_t *char_height, int16_t *cell_width, int16_t +*cell_height ); +
  +
Beschreibung: This call is an alternative to vst_height. It uses top to +bottom distance for text scaling, instead of top to baseline distance. +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
height Zeichenhöhe +
char_width gewählte Zeichenbreite +
char_height gewählte Zeichenhöhe +
cell_width Zeichenzellenbreite +
cell_height Zeichenzellenhöhe + +
+ +
Hinweis: Falls die gewünschte Zeichenhöhe nicht +verfügbar ist, wird automatisch die nächstkleinere gewählt. Bei +Proportionalfonts enthalten die Ausgabeparameter die Breite des +breitesten Zeichens im Zeichensatz. +
  +
Die meisten Bildschirmtreiber können bei dieser Funktion +vorhandene Zeichensätze beliebig verkleinern, oder auf das doppelte +vergrößern. Dies gilt insbesondere für den im ROM implementierten +Bildschirmtreiber. +
  +
Bei Vektorfonts stellen die ausgegebenen Breiten von +char_width und cell_width gerundete Werte dar. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: GEM/3 Release 3.1 +
  +
Gruppe: Text-Attribute +
  +
Querverweis: Binding   v_gtext   v_justified   vst_point   vst_height +
  + +
+ +

7.4.6.94 Bindings für v_topbot

+ + + + + + + + + +
C: void v_topbot ( int16_t handle, int16_t height, int16_t +*char_width, int16_t *char_height, int16_t *cell_width, int16_t +*cell_height ); +
  +
Umsetzung: +
  +
void v_topbot (int16_t handle, int16_t height,
+               int16_t *char_width, int16_t *char_height,
+               int16_t *cell_width, int16_t *cell_height)
+{
+   ptsin[0] = 0;
+   ptsin[1] = height;
+
+   contrl[0] = 5;
+   contrl[1] = 1;
+   contrl[3] = 0;
+   contrl[5] = 18501;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *char_width  = ptsout[0];
+   *char_height = ptsout[1];
+   *cell_width  = ptsout[2];
+   *cell_height = ptsout[3];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]1 # Einträge in ptsin
contrl+4contrl[2]4 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]18501
contrl+12contrl[6]handle
ptsinptsin[0]0
ptsin+2ptsin[1]height
ptsoutptsout[0]char_width
ptsout+2ptsout[1]char_height
ptsout+4ptsout[2]cell_width
ptsout+6ptsout[3]cell_height
+
+ + +
+ +

7.4.6.95 vswr_mode

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set writing Mode« - bestimmt den Schreibmodus fast aller +Grafikfunktionen. +
  +
VDI-Nummer: 32 +
  +
Deklaration: int16_t vswr_mode ( int16_t handle, int16_t mode ); +
  +
Beschreibung: Die Funktion bestimmt, auf welche Art Quellpixel und Zielpixel +verknüpft werden, um die resultierenden Farbwerte zu ermitteln. Es +gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
mode Schreibmodus + + + + + + + + + + + + +
1 = Replace +
2 = Transparent +
3 = XOR +
4 = Reverse Transparent + +
+ + +
+ +
Hinweis: Der normale Schreibmodus ist der Replace-Modus. +Die Anzahl der verfügbaren Modi kann über die Funktion vq_extnd +ermittelt werden; bei Übergabe eines nicht vorhandenen Modus wird der +Replace-Modus benutzt. +
  +
Ergebnis: Die Funktion liefert den tatsächlich eingestellten +Schreibmodus. +
  +
Verfügbar: Supported by all devices. +
  +
Gruppe: übergeordnete Attribute +
  +
Querverweis: Binding   v_pline   v_pmarker   v_gtext   v_fillarea   +v_contourfill   vr_recfl   v_bar   v_arc   v_pieslice   v_circle   +v_ellarc   v_ellpie   v_ellipse   v_rbox   v_rfbox   v_justified   +Beschreibung der VDI-Schreibmodi +
  + +
+ +

7.4.6.96 Bindings für vswr_mode

+ + + + + + + + + +
C: int16_t vswr_mode ( int16_t handle, int16_t mode ); +
  +
Umsetzung: +
  +
int16_t vswr_mode (int16_t handle, int16_t mode)
+{
+   intin[0] = mode;
+
+   contrl[0] = 32;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]32 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]mode
intoutintout[0]Return-Wert
+
+ + +
+ +

7.4.6.97 vs_bkcolor

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set background color« - Setzen der Hintergrundfarbe. +
  +
VDI-Nummer: 5 (Escape 102) +
  +
Deklaration: void vs_bkcolor ( int16_t handle, int16_t color ); +
  +
Beschreibung: This call sets the background color for the device associated +with handle, usually a camera device. +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
color Background color index + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Verfügbar: GEM/3 Release 3.1 +
  +
Gruppe: übergeordnete Attribute +
  +
Querverweis: Binding +
  + +
+ +

7.4.6.98 Bindings für vs_bkcolor

+ + + + + + + + + +
C: void vs_bkcolor ( int16_t handle, int16_t color ); +
  +
Umsetzung: +
  +
void vs_bkcolor (int16_t handle, int16_t color)
+{
+   intin[0] = color;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 102;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]102
contrl+12contrl[6]handle
intinintin[0]color
+
+ + +
+ +

7.4.6.99 vs_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Color Representation« - legt die Farbintensität fest. +
  +
VDI-Nummer: 14 +
  +
Deklaration: void vs_color ( int16_t handle, int16_t index, int16_t *rgb_in +); +
  +
Beschreibung: Die Funktion wählt die Farbintensität zu den einzelnen +Farbregistern. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
index Farbnummer +
rgb_in[0] Rotanteil in Promille +
rgb_in[1] Grünanteil in Promille +
rgb_in[2] Blauanteil in Promille + +
+ +
Da nicht jedes Ausgabegerät über 1000 mögliche +Farbabstufungen verfügen muß, können für verschiedene +Eingabeintensitäten der RGB-Farben, die tatsächlich eingestellten +Intensitäten gleich sein. +
  +
Hinweis: Die Funktion kann nur benutzt werden, falls +eine Lookup-Table Unterstützung vorhanden ist. Sollte eine ungültige +Farbnummer übergeben werden, wird der nächste erreichbare Wert +angenommen. +
  +
Bei Geräten mit einer CLUT (Grafiksysteme bis 8 Planes d.h. 256 +Farben) wirken sich die Einstellungen sofort auf alle Punkte aus, die +bisher auf dem Bildschirm mit dem Farbindex index gezeichnet +wurden. +
  +
Wichtig: Aus diesem Grund sollten die ersten 16 +Farbnummern nicht verändert werden, da diese vom AES benutzt werden. +
  +
Bei mehr als 256 gleichzeitig darstellbaren Farben benutzen +Grafiksysteme in der Regel keine CLUT sondern eine direkte +RGB-Zuordnung pro Pixel. Die einzelnen Pixel enthalten dann statt +eines Farbindex einen direkten RGB-Wert (z.B. je 8 Bit für R,G und B +und 8 Bit Overlay). Bei einer solchen Organisation stellt das VDI pro +Workstation 256 lokale Farbstifte und eine Pseudopalette zur +Verfügung, für die man mit vs_color() die Farbwerte setzen kann. +Eine Änderung wirkt sich also erst dann aus, wenn man wieder mit dem +Farbstift zeichnet und wirkt sich immer nur auf die mit handle +bezeichnete Workstation aus. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all devices. +
  +
Gruppe: übergeordnete Attribute +
  +
Querverweis: Binding   v_pline   v_pmarker   v_gtext   v_fillarea   +v_cellarray   v_contourfill   vr_recfl   v_bar   v_arc   v_pieslice   +v_circle   v_ellarc   v_ellpie   v_ellipse   v_rbox   v_rfbox   +v_justified   vq_color   vq_scrninfo +
  + +
+ +

7.4.6.100 Bindings für vs_color

+ + + + + + + + + +
C: void vs_color ( int16_t handle, int16_t index, int16_t *rgb_in +); +
  +
Umsetzung: +
  +
void vs_color (int16_t handle, int16_t index, int16_t *rgb_in)
+{
+   int16_t i;
+
+   intin[0] = index;
+
+   for (i=1; i<4; i++)
+      intin[i] = *rgb_in++;
+
+   contrl[0] = 14;
+   contrl[1] = 0;
+   contrl[3] = 4;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]14 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]4 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]index
intin+2intin[1..3]rgb_in[0..2]
+
+ + +
+ +

7.4.6.101 vs_color2

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Color Representation-2« - Farbintensität und Farbe für +Attribute festlegen. +
  +
VDI-Nummer: 138 (Opcode 0,1,2) +
  +
Deklaration: void vs_color2 ( int16_t handle, int16_t *rgb, int16_t index ); +
  +
Beschreibung: Die Funktion legt die Farbintensität und Farbe für bestimmte +Attributfunktionen fest. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
rgb[0] Rotanteil in Promille +
rgb[1] Grünanteil in Promille +
rgb[2] Blauanteil in Promille +
index Farbnummer + +
+ +
Hinweis: Die Funktion steht direkt nur unter +PC-GEM zur Verfügung. Sie kann jedoch auf dem Atari nachgebildet +werden, was von einigen Applikationen (z.B. Kandinsky und GEM) auch +tatsächlich gemacht wird. +
  +
Sie arbeitet ähnlich wie vs_color, mit dem Unterschied, daß +bei einem Opcode von +
  + + + + + + + + + +
0 die Textfarbe, +
1 die Füllfarbe, +
2 die Linienfarbe + +
+ +
geändert wird, und somit die entsprechenden Aufrufe von +vsl_color etc. nicht mehr notwendig sind. Ob der Name der Funktion +(vs_color2) wirklich stimmt, kann mangels Dokumentation leider +nicht mit Sicherheit gesagt werden. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Verfügbar: Obige Aussage kann nicht bestätigt werden. Es ist zu vermuten +das hier eigentlich die Funktion v_setrgb gemeint. Allerdings ist die +Übergabe der Parameter etwas anderst. +
  +
Gruppe: übergeordnete Attribute +
  +
Querverweis: Binding   v_setrgb   vs_color vswr_mode +
  + +
+ +

7.4.6.102 Bindings für vs_color2

+ + + + + + + + + +
C: void vs_color2 ( int16_t handle, int16_t *rgb, int16_t index ); +
  +
Umsetzung: +
  +
void vs_color2 (int16_t handle, int16_t *rgb, int16_t index)
+{
+   int16_t i;
+
+   for (i=0; i<3; i++)
+      intin[i] = *rgb;
+
+   intin[3] = index;
+
+   contrl[0] = 138;
+   contrl[1] = 0;
+   contrl[3] = 4;
+   contrl[5] = opcode;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]138 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]4 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]opcode
contrl+12contrl[6]handle
intinintin[0..2]rgb
intin+6intin[3]index
+
+ + +
+ +

7.4.6.103 vs_grayoverride

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Override gray level« +
  +
VDI-Nummer: 133 +
  +
Deklaration: void vs_grayoverride ( int16_t handle, int16_t grayval ); +
  +
Beschreibung: This call overrides the grey level specified with the vsf_style +call patterns 2,1 through 2,8. The application should specify the +closest index in the normal fill pattern set and follow it with a +vs_grayoverride call to "fine-tune" that gray level one +devices that support such fine tuning. This call is currently +implemented in the PostScript driver. +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
grayval Gray value in tenths of a percent +
   0  white +
1000  black + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Verfügbar: GEM/3 Release 3.1 +
  +
Gruppe: übergeordnete Attribute +
  +
Querverweis: Binding +
  + +
+ +

7.4.6.104 Bindings für vs_grayoverride

+ + + + + + + + + +
C: void vs_grayoverride ( int16_t handle, int16_t grayval ); +
  +
Umsetzung: +
  +
void vs_grayoverride (int16_t handle, int16_t grayval)
+{
+   intin[0] = grayval;
+
+   contrl[0] = 133;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]133 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]grayval
+
+ + +
+ +

7.4.6.105 v_ps_halftone

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »PostScript halftoning« - Set PostScript halftoning. +
  +
VDI-Nummer: 5 (Escape 32) +
  +
Deklaration: void v_ps_halftone( int16_t handle, int16_t index, int16_t +angle, int16_t frequency ); +
  +
Beschreibung: The call v_ps_halftone controls the parameters for PostScript +halftoning. It provides direct access to analogous PostScript language +parameters. It is implemented only for the PostScript driver. +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
index Halftone type +
0: Dot screen +
1: Line screen +
2: Ellipse screen +
3: Custom (user-defined) +
angle Hallftone screen angle +
frequency Hallftone screen frequency + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: GEM/3 Release 3.1 +
  +
Gruppe: übergeordnete Attribute +
  +
Querverweis: Binding +
  + +
+ +

7.4.6.106 Bindings für v_ps_halftone

+ + + + + + + + + +
C: void v_ps_halftone( int16_t handle, int16_t index, int16_t +angle, int16_t frequency ); +
  +
Umsetzung: +
  +
void v_ps_halftone( int16_t handle, int16_t index,
+                    int16_t angle, int16_t frequency )
+{
+   intin[0] = index;
+   intin[1] = angle;
+   intin[2] = frequency;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 3;
+   contrl[5] = 32;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]3 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]32
contrl+12contrl[6]handle
intinintin[0]index
intin+2intin[1]angle
intin+4intin[2]frequency
+
+ + +
+ +

7.4.6.107 v_setrgb

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Color Representation« - legt die Farbintensität fest. +
  +
VDI-Nummer: 138 +
  +
Deklaration: void v_setrgb( int16_t handle, int16_t type, int16_t r, int16_t +g, int16_t b ); +
  +
Beschreibung: Die Funktion wählt die Farbintensität zu den einzelnen +Farbregistern. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
type 0: Textfarbe +
1: Füllfarbe +
2: Linienfarbe +
3: Markerfarbe +
r Rotanteil in Promille +
g Grünanteil in Promille +
b Blauanteil in Promille + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: ab NVDI 5.00 +
  +
Es handelt sich dabei angeblich um eine alte GEM/3-Funktion. +Allerdings konnte solch eine Funktion bis jetzt nicht gefunden werden. +
  +
Gruppe: übergeordnete Attribute +
  +
Querverweis: Binding +
  + +
+ +

7.4.6.108 Bindings für v_setrgb

+ + + + + + + + + +
C: void v_setrgb( int16_t handle, int16_t type, int16_t r, int16_t +g, int16_t b ); +
  +
Umsetzung: +
  +
void v_setrgb( int16_t handle, int16_t type, int16_t r,
+               int16_t g, int16_t b )
+{
+   intin[0] = r;
+   intin[1] = g;
+   intin[2] = b;
+
+   contrl[0] = 138;
+   contrl[1] = 0;
+   contrl[3] = 3;
+   contrl[5] = type;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]138 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]3 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]type
contrl+12contrl[6]handle
intinintin[0]r
intin+2intin[1]g
intin+4intin[2]b
+
+ + +
+ +

7.4.6.109 v_setrgbi

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Color Representation« - legt die Farbintensität fest. +
  +
VDI-Nummer: 5 (Escape 18500) +
  +
Deklaration: void v_setrgbi( int16_t handle, int16_t primtype, int16_t r, +int16_t g, int16_t b, int16_t i ); +
  +
Beschreibung: This call overrides a previously set color specification with +an RGB triple (color devices) or intensity (monochrome devices). This +call is currently implemented only for the PostScript driver. +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
primtype Primitive type: +
17: line +
20: marker +
22: text +
25: fill +
r Rotanteil in Promille +
g Grünanteil in Promille +
b Blauanteil in Promille +
i Intensity + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: GEM/3 Release 3.1 +
  +
Gruppe: übergeordnete Attribute +
  +
Querverweis: Binding   v_setrgb +
  + +
+ +

7.4.6.110 Bindings für v_setrgbi

+ + + + + + + + + +
C: void v_setrgbi( int16_t handle, int16_t primtype, int16_t r, +int16_t g, int16_t b, int16_t i ); +
  +
Umsetzung: +
  +
void v_setrgbi( int16_t handle, int16_t primtype,
+                int16_t r, int16_t g, int16_t b, int16_t i )
+{
+   intin[0] = primtype;
+   intin[1] = r;
+   intin[2] = g;
+   intin[3] = b;
+   intin[4] = i;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 5;
+   contrl[5] = 18500;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]5 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]18500 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]primtype
intin+2intin[1]r
intin+4intin[2]g
intin+6intin[3]b
intin+8intin[4]i
+
+ + +
+ +
+ +Home +VDIVDI +VDI-BindingsVDI-Bindings +AusgabefunktionenAusgabefunktionen + + diff --git a/de/vdi_bindings.html b/de/vdi_bindings.html new file mode 100644 index 000000000..3fc247fe4 --- /dev/null +++ b/de/vdi_bindings.html @@ -0,0 +1,235 @@ + + + + + +Die Anleitung zum TOS: VDI-Bindings + + + + + + + + + +Home +VDIVDI +Grundlagen des VDIGrundlagen des VDI +AttributfunktionenAttributfunktionen + +
+ +

7.3 VDI-Bindings

+ +

Das VDI wird über ein einziges Unterprogramm aufgerufen, dem 5 +Parameter übergeben werden; es handelt sich dabei um Adressen +verschiedener Arrays, die zur Ein-/Ausgabe-Kommunikation benutzt +werden. Um eine VDI-Funktion aufzurufen, muß der folgende +Parameterblock mit den Adressen der unten beschriebenen Arrays bestückt +werden: +

+ + +
typedef struct
+{
+   int16_t  *contrl;    /* Zeiger auf contrl-Array */
+   int16_t  *intin;     /* Zeiger auf intin-Array  */
+   int16_t  *ptsin;     /* Zeiger auf ptsin-Array  */
+   int16_t  *intout;    /* Zeiger auf intout-Array */
+   int16_t  *ptsout;    /* Zeiger auf ptsout-Array */
+} VDIPB;
+
+

Die Adresse dieses Parameterblocks muß dann im Register d1 +vermerkt, und zusätzlich Register d0.w mit dem Wert 0x73 (115) +gefüllt werden. Durch einen TRAP#2 Systemaufruf kann dann das VDI +direkt aufgerufen werden. Für den Pure-Assembler +könnte das z.B. so aussehen: +

+
        .EXPORT vdi         ; Funktion exportieren
+
+        .IMPORT contrl      ; contrl-Feld importieren
+        .IMPORT intin       ; intin-Feld  importieren
+        .IMPORT ptsin       ; ptsin-Feld  importieren
+        .IMPORT intout      ; intout-Feld importieren
+        .IMPORT ptsout      ; ptsout-Feld importieren
+
+        .DATA               ; Beginn des Daten-Segments
+
+pblock: .DC.L contrl        ; Adresse des contrl-Arrays
+        .DC.L intin         ; Adresse des intin-Arrays
+        .DC.L ptsin         ; Adresse des ptsin-Arrays
+        .DC.L intout        ; Adresse des intout-Arrays
+        .DC.L ptsout        ; Adresse des ptsout-Arrays
+
+        .CODE               ; Beginn des Code-Segments
+
+ +
vdi:     MOVE.L #pblock,D1  ; Adresse des Parameterblocks
+         MOVE.W #$73,D0     ; Opcode des VDI
+         TRAP   #2          ; GEM aufrufen
+         RTS                ; raus hier
+
+       .END                 ; Ende des Moduls
+
+

Darüber, welche Register verändert werden dürfen, gibt es +keine klaren Informationen. Tatsache ist jedoch, daß die +entsprechenden Routinen im ROM alle Register retten. +

+

Im Gegensatz zum GEMDOS kennt das VDI leider keinen +dokumentierten Rückgabewert für 'unbekannte Funktionsnummer'. Daher +muss man sich im Zweifelsfall wie folgt behelfen: +

+
    +
  • Viele Eigenschaften eines Treibers können bereits über die +Funktion vq_extnd ermittelt werden. +
      +

  • +
  • Ansonsten sollte man den entsprechenden VDI-Aufruf einfach +ausprobieren, und die Rückgabewerte analysieren. Viele Funktionen +liefern nämlich als Resultat den eingestellten Wert zurück. Darüber +hinaus kann man auch noch die Felder contrl[2] und contrl[4] (s.u.) +untersuchen, und kontrollieren, ob sie die korrekten Zahlen enthalten. +
      +

  • +
+ +

Nun zu den einzelnen Arrays. Über jedes Feld können bestimmte +Ein- bzw. Ausgaben getätigt werden; es gilt: +

+ + + + + + + + + + + + + + + + +
int16_t contrl[12] Über dieses Feld werden die Funktionsnummer, die Anzahl der +Eingaben, die Kennung der Workstation sowie funktionsabhängige +Parameter übergeben. Eingaben an das VDI werden dabei wie folgt +eingetragen: +
  + + + + + + + + + + + + + + + + + + +
contrl[0] = Funktionsnummer +
contrl[1] = Anzahl der Werte im ptsin-Array +
contrl[3] = Anzahl der Werte im intin-Array +
contrl[5] = Unterfunktionsnummer +
contrl[6] = Kennung der Workstation +
contrl[7..n] = abhängig von der Funktion + +
+ +
Ausgaben des VDI werden über die folgenden Felder gemacht: +
  + + + + + + + + + +
contrl[2] = Anzahl der Werte im ptsout-Array +
contrl[4] = Anzahl der Werte im intout-Array +
contrl[6] = Kennung der Workstation + +
+ + +
int16_t ptsin[1024]   +
  + +
int16_t ptsout[256] Diese beiden Felder werden benutzt, um Paare von Koordinaten +oder Maße in Pixeln (wie z.B. die Breite einer Linie, oder die Höhe +eines Zeichens) zu übergeben. Die Größe dieser Felder hängt von +der aufgerufenen Funktion ab. +
  + +
int16_t intin[1024]   +
  + +
int16_t intout[512] Diese Felder werden benötigt, um Werte wie den Index eines +Zeichens oder einer Farbe zu übergeben. Die Größe dieser Felder +hängt von der aufgerufenen Funktion ab. +
  + +
+ +

Bei der Übergabe von Strings an das VDI sind einige +Besonderheiten zu beachten: Diese werden grundsätzlich über die +Felder intin und intout übergeben, wobei pro Zeichen ein Wort benutzt +wird. Das hat den Vorteil, daß auch andere Codierungen als ASCII +genutzt, und mehr als 256 Zeichen eines Zeichensatzes verwendet werden +können. +

+

Die Bindings arbeiten i.d.R. mit normalen C-Strings, und wandeln +sie für das VDI um. Dabei wird die Länge des Strings in contrl[3] +bzw. contrl[4] vermerkt, wobei kein abschließendes Null-Byte oder +-wort vorhanden ist. Um z.B. eine in intout liegende Zeichenkette in +einen C-String zu verwandeln, müssen contrl[4] Elemente kopiert +(dabei die oberen 8 Bit abschneiden !) und anschließend ein Null-Byte +angehängt werden. +

+

Achtung: Wenn das Betriebssystem Threads unterstützt, +muss unbedingt darauf geachtet werden, eine Multithread-sichere +Bibliothek zu verwenden. +

+

Querverweis: C-String nach VDI-String   VDI-String nach C-String   AES-Bindings +

+

7.3.1 Wandel VDI-String nach C-String

+
VOID vdi_str_to_c( UWORD *src, UBYTE *des, int16_t len )
+{
+   while ( len > 0 )
+   {
+      *des++ = (UBYTE)*src++;  /* nur Low-Byte kopieren */
+      len--;
+   }
+   *des++ = 0;  /* Ende des Strings */
+}
+
+

7.3.2 Wandel C-String nach VDI-String

+
int16_t c_str_to_vdi( UBYTE *src, UWORD *des )
+{
+   int16_t  len;
+
+   while (( *des++ = *src++ ) != 0 )
+      len++;
+   return (len); /* Stringlänge ohne Null-Byte */
+}
+
+
+ +Home +VDIVDI +Grundlagen des VDIGrundlagen des VDI +AttributfunktionenAttributfunktionen + + diff --git a/de/vdi_colortable.html b/de/vdi_colortable.html new file mode 100644 index 000000000..7c85e447b --- /dev/null +++ b/de/vdi_colortable.html @@ -0,0 +1,3212 @@ + + + + + +Die Anleitung zum TOS: Farbtabellenfunktionen + + + + + + + + + +Home +VDIVDI +EscapefunktionenEscapefunktionen +KontrollfunktionenKontrollfunktionen + +
+ +

7.9 Farbtabellenfunktionen

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
v_color2nearest Ähnlichsten Farbwert suchen +
v_color2value Farbwert in Pixelwert wandeln +
v_create_ctab Farbtabelle erzeugen +
v_create_itab Referenz auf inverse Farbtabelle erzeugen +
v_ctab_idx2value Pixelwert zurückliefern +
v_ctab_idx2vdi Farbtabellenindex in VDI-Index wandeln +
v_ctab_vdi2idx VDI-Index in Farbtabellenindex wandeln +
v_delete_ctab Farbtabelle löschen +
v_delete_itab Referenz auf inverse Farbtabelle löschen +
v_get_ctab_id eindeutige Kennung für neue Farbtabelle liefern +
v_value2color Pixelwert in Farbwert wandeln +
vq_ctab Farbtabelle erfragen +
vq_ctab_entry Farbeintrag erfragen +
vq_ctab_id Kennung der Farbtabelle erfragen +
vq_dflt_ctab Systemfarbtabelle zurückliefern +
vq_px_format Eingestellte Pixelformat und Farbraum ermitteln +
vs_ctab Setzen einer Farbtabelle +
vs_ctab_entry Farbwert in der Farbtabelle setzen +
vs_dflt_ctab Systemfarbtabelle setzen + +
+ +

Querverweis: Workstations des VDI   Style-Guidelines +

+

7.9.1 v_color2nearest

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Nearest Color Entry« +
  +
VDI-Nummer: 204 (Unterfunktion 2) +
  +
Deklaration: int32_t v_color2nearest( int16_t handle, int32_t color_space, +COLOR_ENTRY *color, COLOR_ENTRY *nearest_color ); +
  +
Beschreibung: Diese Funktion liefert den ähnlichsten Farbwert für den +gewünschten COLOR_ENTRY zurück. +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
color_space Farbraum (z.Zt. nur 0 für eingestellten Farbraum oder +CSPACE_RGB) +
color COLOR_ENTRY der Farbe +
nearest_color COLOR_ENTRY der Farbe + +
+ +
Ergebnis: Die Funktion liefert den Farbwert und den Farbraum der +ähnlichsten Farbe zurück. +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Farbtabellenfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.9.2 Bindings für v_color2nearest

+ + + + + + + + + +
C: int32_t v_color2nearest( int16_t handle, int32_t color_space, +COLOR_ENTRY *color, COLOR_ENTRY *nearest_color ); +
  +
Umsetzung: +
  +
int32_t v_color2nearest( int16_t handle, int32_t color_space,
+                         COLOR_ENTRY *color,
+                         COLOR_ENTRY *nearest_color )
+{
+   intin[0..1] = color_space;
+   intin[2..5] = color;
+
+   contrl[0] = 204;
+   contrl[1] = 0;
+   contrl[3] = 6;
+   contrl[5] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   nearest_color = intout[2..5];
+
+   return ( (int32_t) intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]204 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]6 # Einträge in intin
contrl+8contrl[4]6 # Einträge in intout
contrl+10contrl[5]2 # Sub-Opcode
contrl+12contrl[6]handle
intinintin[0..1]color_space
intin+4intin[2..5]color
intoutintout[0..1]Rückgabewert
intout+4intout[2..5]nearest_color
+
+ + +
+ +

7.9.3 v_color2value

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Translate Color Entry To Pixel Value« +
  +
VDI-Nummer: 204 (Unterfunktion 0) +
  +
Deklaration: uint32_t v_color2value( int16_t handle, int32_t color_space, +COLOR_ENTRY *color ); +
  +
Beschreibung: Diese Funktion liefert für einen Farbwert den Pixelwert +zurück. +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
color_space Farbraum (z.Zt.nur 0 für eingestellten Farbraum oder +CSPACE_RGB) +
color COLOR_ENTRY der Farbe + +
+ +
Ergebnis: Der Pixelwert +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Farbtabellenfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.9.4 Bindings für v_color2value

+ + + + + + + + + +
C: uint32_t v_color2value( int16_t handle, int32_t color_space, +COLOR_ENTRY *color ); +
  +
Umsetzung: +
  +
uint32_t v_color2value( int16_t handle, int32_t color_space,
+                        COLOR_ENTRY *color )
+{
+   intin[0..1] = color_space;
+   intin[2..5] = color;
+
+   contrl[0] = 204;
+   contrl[1] = 0;
+   contrl[3] = 6;
+   contrl[5] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( (uint32_t) intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]204 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]6 # Einträge in intin
contrl+8contrl[4]2 # Einträge in intout
contrl+10contrl[5]0 # Sub-Opcode
contrl+12contrl[6]handle
intinintin[0..1]color_space
intin+4intin[2..5]color
intoutintout[0..1]Rückgabewert
+
+ + +
+ +

7.9.5 v_create_ctab

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Create Color Table« - Farbtabelle erzeugen +
  +
VDI-Nummer: 206 (Unterfunktion 8) +
  +
Deklaration: COLOR_TAB *v_create_ctab( int16_t handle, int32_t color_space, +uint32_t px_format ); +
  +
Beschreibung: Diese Funktion legt eine Farbtabelle im Farbraum +color_space für eine Bitmap mit px_format & +PX_BITS Bits an. Die Farbtabelle ist mit den Standardfarben für +diese Bittiefe initialisiert. Die Applikation kann die Farbtabelle +beschreiben und die Farbeinträge ändern. Wenn die Farben geändert +werden muß aber über v_get_ctab_id eine neue Kennung angefordert +werden und im Strukturelement <map_id> eingetragen werden. +Andernfalls würde mit Fehlfarben ausgegeben werden. +
  +
Die Farbtabelle kann nach Gebrauch mit v_delete_ctab freigegeben +werden. +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
color_space Farbraum (z.Zt.nur 0 für eingestellten Farbraum oder +CSPACE_RGB) +
px_format Pixelformat (nur die unteren 8 Bit werden ausgewertet, d.h. +Bits pro Pixel) + +
+ +
Ergebnis: Die Funktion liefert den Zeiger auf die Farbtabelle zurück. +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Farbtabellenfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.9.6 Bindings für v_create_ctab

+ + + + + + + + + +
C: COLOR_TAB *v_create_ctab( int16_t handle, int32_t color_space, +uint32_t px_format ); +
  +
Umsetzung: +
  +
COLOR_TAB *v_create_ctab( int16_t handle, int32_t color_space,
+                          uint32_t px_format )
+{
+   intin[0..1] = color_space;
+   intin[2..3] = px_format;
+
+   contrl[0] = 206;
+   contrl[1] = 0;
+   contrl[3] = 4;
+   contrl[5] = 8;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( (uint32_t) intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]206 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]4 # Einträge in intin
contrl+8contrl[4]2 # Einträge in intout
contrl+10contrl[5]8 # Sub-Opcode
contrl+12contrl[6]handle
intinintin[0..1]color_space
intin+4intin[2..3]px_format
intoutintout[0..1]Rückgabewert
+
+ + +
+ +

7.9.7 v_create_itab

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Create Inverse Color Table Reference« - Referenz auf inverse +Farbtabelle erzeugen +
  +
VDI-Nummer: 208 (Unterfunktion 0) +
  +
Deklaration: ITAB_REF v_create_itab( int16_t handle, COLOR_TAB *ctab, +int16_t bits ); +
  +
Beschreibung: Diese Funktion legt eine inverse Farbtabelle der übergebenen +Farbtabelle an und liefert eine Referenz darauf zurück. Programme +müssen diese Funktion nur dann aufrufen, wenn sie Bitmaps, die Ziel +einer vr_transfer_bits-Operation sind, selber verwalten (wenn die +Offscreen-Bitmap vom VDI erzeugt wird, d.h durch v_opnbm oder +v_open_bm, erledigt das VDI das automatisch). Siehe auch +Beschreibung von vr_transfer_bits. +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
ctab Zeiger auf Farbtabelle +
bits bevorzugte Auflösung der inversen Farbtabelle (3-5) + +
+ +
Ergebnis: Die Funktion liefert die Referenz auf eine inverse Farbtabelle +zurück. +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Farbtabellenfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.9.8 Bindings für v_create_itab

+ + + + + + + + + +
C: ITAB_REF v_create_itab( int16_t handle, COLOR_TAB *ctab, +int16_t bits ); +
  +
Umsetzung: +
  +
ITAB_REF v_create_itab( int16_t handle, COLOR_TAB *ctab,
+                        int16_t bits )
+{
+   intin[0..1] = ctab;
+   intin[2] = bits;
+   intin[3] = 0;
+   intin[4] = 0;
+
+   contrl[0] = 208;
+   contrl[1] = 0;
+   contrl[3] = 5;
+   contrl[5] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( (uint32_t) intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]208 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]5 # Einträge in intin
contrl+8contrl[4]2 # Einträge in intout
contrl+10contrl[5]0 # Sub-Opcode
contrl+12contrl[6]handle
intinintin[0..1]ctab
intin+4intin[2]bits
intin+6intin[3]0
intin+8intin[4]0
intoutintout[0..1]Rückgabewert
+
+ + +
+ +

7.9.9 v_ctab_idx2value

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Color Table Value« - Pixelwert zurückliefern +
  +
VDI-Nummer: 206 (Unterfunktion 5) +
  +
Deklaration: uint32_t v_ctab_idx2value( int16_t handle, int16_t index ); +
  +
Beschreibung: Diese Funktion liefert für einen Eintrag in der Farbtabelle +den Pixelwert zurück. Wenn der übergebene index größer als +die Anzahl der Farbstifte ist, wird der Pixelwert der Farbe Schwarz +zurückgeliefert. +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
index Farbtabellenindex + +
+ +
Ergebnis: Die Funktion liefert den Pixelwert zurück. +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Farbtabellenfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.9.10 Bindings für v_ctab_idx2value

+ + + + + + + + + +
C: uint32_t v_ctab_idx2value( int16_t handle, int16_t index ); +
  +
Umsetzung: +
  +
uint32_t v_ctab_idx2value( int16_t handle, int16_t index )
+{
+   intin[0] = index;
+
+   contrl[0] = 206
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 5;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( (uint32_t) intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]206 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]2 # Einträge in intout
contrl+10contrl[5]5 # Sub-Opcode
contrl+12contrl[6]handle
intinintin[0]index
intoutintout[0..1]Rückgabewert
+
+ + +
+ +

7.9.11 v_ctab_idx2vdi

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Translate Color Table Index To Vdi Color Index« - +Farbtabellenindex in VDI-Index wandeln +
  +
VDI-Nummer: 206 (Unterfunktion 3) +
  +
Deklaration: int16_t v_ctab_idx2vdi( int16_t handle, int16_t index ); +
  +
Beschreibung: Diese Funktion konvertiert den Farbtabellenindex in einen +VDI-Farbindex. +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
index Index für die Farbtabelle + +
+ +
Für Auflösungen bis zu 256 Farben ist index der Index +für den COLOR_ENTRY in der aktuellen Farbtabelle und gleichzeitig +auch der tatsächliche Pixelwert, der in der Bitmap eingetragen wird. +Bei Grafikformaten mit mehr als 256 Farben bezeichnet index +weiterhin den Eintrag in der Farbtabelle; der Pixelwert wird aber vom +VDI als direkter RGB-Wert in der Bitmap ausgegeben. +
  +
Ergebnis: Die Funktion liefert alter VDI-Farbindex für vsl_color oder +ähnliche Funktionen +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Farbtabellenfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.9.12 Bindings für v_ctab_idx2vdi

+ + + + + + + + + +
C: int16_t v_ctab_idx2vdi( int16_t handle, int16_t index ); +
  +
Umsetzung: +
  +
int16_t v_ctab_idx2vdi( int16_t handle, int16_t index )
+{
+   intin[0] = index;
+
+   contrl[0] = 206
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 3;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]206 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]3 # Sub-Opcode
contrl+12contrl[6]handle
intinintin[0]index
intoutintout[0]Rückgabewert
+
+ + +
+ +

7.9.13 v_ctab_vdi2idx

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Translate Vdi Color Index To Color Table Index« - +VDI-Index in Farbtabellenindex wandeln +
  +
VDI-Nummer: 206 (Unterfunktion 4) +
  +
Deklaration: int16_t v_ctab_vdi2idx( int16_t handle, int16_t vdi_index ); +
  +
Beschreibung: Diese Funktion konvertiert den VDI-Farbindex in einen +Farbtabellenindex. +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
vdi_index Index für die Farbtabelle + +
+ +
Für Auflösungen bis zu 256 Farben ist index der Index +für den COLOR_ENTRY in der aktuellen Farbtabelle und gleichzeitig +auch der tatsächliche Pixelwert, der in der Bitmap eingetragen wird. +Bei Grafikformaten mit mehr als 256 Farben bezeichnet index +weiterhin den Eintrag in der Farbtabelle; der Pixelwert wird aber vom +VDI als direkter RGB-Wert in der Bitmap ausgegeben. +
  +
Ergebnis: Die Funktion liefert den Index für die Farbtabelle zurück. +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Farbtabellenfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.9.14 Bindings für v_ctab_vdi2idx

+ + + + + + + + + +
C: int16_t v_ctab_vdi2idx( int16_t handle, int16_t vdi_index ); +
  +
Umsetzung: +
  +
int16_t v_ctab_vdi2idx( int16_t handle, int16_t vdi_index )
+{
+   intin[0] = vdi_index;
+
+   contrl[0] = 206
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 4;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]206 Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]4
contrl+12contrl[6]handle
intinintin[0]vdi_index
intoutintout[0]Rückgabewert
+
+ + +
+ +

7.9.15 v_delete_ctab

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Delete Color Table« - Farbtabelle löschen +
  +
VDI-Nummer: 206 (Unterfunktion 9) +
  +
Deklaration: int16_t v_delete_ctab( int16_t handle, COLOR_TAB *ctab ); +
  +
Beschreibung: Diese Funktion gibt eine mit v_create_ctab erzeugte Farbtabelle +wieder frei. +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
ctab Zeiger auf Farbtabelle + +
+ +
Ergebnis: 0: Fehler +
1: alles in Ordnung +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Farbtabellenfunktionen +
  +
Querverweis: Binding   v_create_ctab +
  + +
+ +

7.9.16 Bindings für v_delete_ctab

+ + + + + + + + + +
C: int16_t v_delete_ctab( int16_t handle, COLOR_TAB *ctab ); +
  +
Umsetzung: +
  +
int16_t v_delete_ctab( int16_t handle, COLOR_TAB *ctab )
+{
+   intin[0..1] = ctab;
+
+   contrl[0] = 206
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[5] = 9;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]206 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]2 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]9 # Sub-Opcode
contrl+12contrl[6]handle
intinintin[0..1]ctab
intoutintout[0]Rückgabewert
+
+ + +
+ +

7.9.17 v_delete_itab

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Delete Inverse Color Table Reference« - Referenz auf inverse +Farbtabelle löschen +
  +
VDI-Nummer: 208 (Unterfunktion 1) +
  +
Deklaration: int16_t v_delete_itab( int16_t handle, ITAB_REF *itab ); +
  +
Beschreibung: Diese Funktion gibt den Speicher für eine inverse Farbtabelle +frei. +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
itab Referenz auf inverse Farbtabelle + +
+ +
Ergebnis: 0: Fehler +
1: alles in Ordnung +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Farbtabellenfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.9.18 Bindings für v_delete_itab

+ + + + + + + + + +
C: int16_t v_delete_itab( int16_t handle, ITAB_REF *itab ); +
  +
Umsetzung: +
  +
int16_t  v_delete_itab( int16_t handle, ITAB_REF *itab )
+{
+   intin[0..1] = itab;
+
+   contrl[0] = 208;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[5] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]208 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]2 # Einträge in intin
contrl+8contrl[4]2 # Einträge in intout
contrl+10contrl[5]1 # Sub-Opcode
contrl+12contrl[6]handle
intinintin[0..1]itab
intoutintout[0]Rückgabewert
+
+ + +
+ +

7.9.19 v_get_ctab_id

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Get Unique Color Table Id« - eindeutige Kennung für neue +Farbtabelle liefern +
  +
VDI-Nummer: 206 (Unterfunktion 6) +
  +
Deklaration: int32_t v_get_ctab_id( int16_t handle ); +
  +
Beschreibung: Wenn ein Programm eine eigene Farbtabelle aufbaut, muß vom VDI +eine eindeutige Kennung angefordert werden, damit unterschiedliche +Tabellen auch unterschiedliche Kennungen haben. GET UNIQUE COLOR TABLE +ID; liefert für diesen Fall eine Kennung zurück. +
  + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation + +
+ +
Ergebnis: Die Funktion liefert ein eindeutige Kennung für eine neue +Farbtabelle zurück. +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Farbtabellenfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.9.20 Bindings für v_get_ctab_id

+ + + + + + + + + +
C: int32_t v_get_ctab_id( int16_t handle ); +
  +
Umsetzung: +
  +
int32_t v_get_ctab_id( int16_t handle )
+{
+   contrl[0] = 206
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 6;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( (int32_t) intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]206 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]2 # Einträge in intout
contrl+10contrl[5]6 # Sub-Opcode
contrl+12contrl[6]handle
intoutintout[0..1]Rückgabewert
+
+ + +
+ +

7.9.21 v_value2color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Translate Pixel Value To Color Entry« +
  +
VDI-Nummer: 204 (Unterfunktion 1) +
  +
Deklaration: int32_t v_value2color( int16_t handle, uint32_t value, +COLOR_ENTRY *color ); +
  +
Beschreibung: Diese Funktion liefert die Farbe eines Pixelwertes zurück. +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
value Pixelwert +
color COLOR_ENTRY der Farbe + +
+ +
Ergebnis: Die Funktion liefert den Farbwert und den eingestellten +Farbraum zurück. +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Farbtabellenfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.9.22 Bindings für v_value2color

+ + + + + + + + + +
C: int32_t v_value2color( int16_t handle, uint32_t value, +COLOR_ENTRY *color ); +
  +
Umsetzung: +
  +
int32_t v_value2color( int16_t handle, uint32_t value,
+                       COLOR_ENTRY *color )
+{
+   intin[0..1] = value;
+
+   contrl[0] = 204;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[5] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   color = intout[2..5];
+
+   return ( (int32_t) intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]204 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]2 # Einträge in intin
contrl+8contrl[4]6 # Einträge in intout
contrl+10contrl[5]1 # Sub-Opcode
contrl+12contrl[6]handle
intinintin[0..1]value
intoutintout[0..1]Rückgabewert
intout+4intout[2..5]color
+
+ + +
+ +

7.9.23 vq_ctab

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Current Color Table« - Farbtabelle erfragen +
  +
VDI-Nummer: 206 (Unterfunktion 0) +
  +
Deklaration: int16_t vq_ctab( int16_t handle, int32_t ctab_length, COLOR_TAB +*ctab ); +
  +
Beschreibung: Diese Funktion kopiert die aktuelle Farbtabelle, die das VDI +unter dem übergebenen handle verwaltet, in den Bereich auf +den ctab zeigt. Sollte die Farbtabelle länger als +ctab_length sein, wird kein Wert in intout zurückgeliefert, +contrl[4] ist dann 0. Eine Farbtabelle enthält maximal 256 Einträge +(da das VDI maximal 256 Farbstifte unterstützt können es nicht +mehr sein) und daher ergibt sich die Maximallänge aus der Größe des +Header plus 256 * sizeof( COLOR_ENTRY ). +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
ctab_length Länge des Speicherbereichs, auf den ctab zeigt. +
ctab Farbtabellen + +
+ +
Ergebnis: Die Funktion liefert 0 oder 1 für Fehler oder alles in Ordnug. +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Farbtabellenfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.9.24 Bindings für vq_ctab

+ + + + + + + + + +
C: int16_t vq_ctab( int16_t handle, int32_t ctab_length, COLOR_TAB +*ctab ); +
  +
Umsetzung: +
  +
int16_t vq_ctab( int16_t handle, int32_t ctab_length,
+                 COLOR_TAB *ctab )
+{
+   intin[0..1] = ctab_length;
+
+         intout zeigt auf ctab
+
+   contrl[0] = 206;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[5] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   if ( contrl[4] )
+     return( 1 );                   /* alles in Ordnung */
+   else
+     return( 0 );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]206 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]2 # Einträge in intin
contrl+8contrl[4]n # Einträge in intout
contrl+10contrl[5]0 # Sub-Opcode
contrl+12contrl[6]handle
intinintin[0..1]ctab_length
intoutintout[0..n]ctab
+
+ + +
+ +

7.9.25 vq_ctab_entry

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Color Table Entry« - Farbteintrag erfragen +
  +
VDI-Nummer: 206 (Unterfunktion 1) +
  +
Deklaration: int32_t vq_ctab_entry( int16_t handle, int16_t index, +COLOR_ENTRY *color ); +
  +
Beschreibung: Diese Funktion liefert den Farbraum und die Farbe eines +Farbtabelleneintrags zurück. +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
index Farbtabellenindex +
color Farbeintrag + +
+ +
Ergebnis: Die Funktion liefert Farbraum zurück. +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Farbtabellenfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.9.26 Bindings für vq_ctab_entry

+ + + + + + + + + +
C: int32_t vq_ctab_entry( int16_t handle, int16_t index, +COLOR_ENTRY *color ); +
  +
Umsetzung: +
  +
int32_t vq_ctab_entry( int16_t handle, int16_t index,
+                       COLOR_ENTRY *color )
+{
+   intin[0] = index;
+
+   contrl[0] = 206;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   color = intout[2..5];
+
+   return( ( int32_t ) intout [0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]206 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]6 # Einträge in intout
contrl+10contrl[5]1 # Sub-Opcode
contrl+12contrl[6]handle
intinintin[0]index
intoutintout[0..1]Returnwert
intout+4intout[2..5]color
+
+ + +
+ +

7.9.27 vq_ctab_id

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Current Color Table Id« - Kennung der Farbtabelle +erfragen +
  +
VDI-Nummer: 206 (Unterfunktion 2) +
  +
Deklaration: int32_t vq_ctab_id( int16_t handle ); +
  +
Beschreibung: Diese Funktion liefert die Kennung der aktuellen Farbtabelle +für handle zurück. Ein Programm kann anhand dieser Kennung +feststellen, ob die Farbtabelle des Gerätes, das es benutzt, +verändert worden ist. +
  + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation + +
+ +
Ergebnis: Die Funktion liefert die Kennung der aktuellen Farbtabelle +zurück. +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Farbtabellenfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.9.28 Bindings für vq_ctab_id

+ + + + + + + + + +
C: int32_t vq_ctab_id( int16_t handle ); +
  +
Umsetzung: +
  +
int32_t vq_ctab_id( int16_t handle )
+{
+   contrl[0] = 206;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return( ( int32_t ) intout [0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]206 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]2 # Einträge in intout
contrl+10contrl[5]2 # Sub-Opcode
contrl+12contrl[6]handle
intoutintout[0..1]Returnwert
+
+ + +
+ +

7.9.29 vq_dflt_ctab

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Default Color Table« - Systemfarbtabelle +zurückliefern +
  +
VDI-Nummer: 206 (Unterfunktion 7) +
  +
Deklaration: int16_t vq_dflt_ctab( int16_t handle, int32_t ctab_length, +COLOR_TAB *ctab ); +
  +
Beschreibung: Diese Funktion kopiert die bevorzugte Systemfarbtabelle für +die eingestellte Farbanzahl in den Bereich auf den ctab; +zeigt. Sollte die Farbtabelle länger als ctab_length sein, +wird kein Wert in intout zurückgeliefert, contrl[4] ist dann 0. Eine +Farbtabelle enthält maximal 256 Einträge (da das VDI maximal 256 +Farbstifte untersützt können es nicht mehr sein) und daher ergibt +sich die Maximallänge aus der Größe des Header plus 256 * sizeof( +COLOR_ENTRY ). +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
ctab_length Länge des Speicherbereichs, auf den ctab zeigt +
ctab Speicherbreich in den die Farbtabelle kopiert wird. + +
+ +
Ergebnis: Die Funktion liefert 0 oder 1 für Fehler oder alles in Ordnug. +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Farbtabellenfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.9.30 Bindings für vq_dflt_ctab

+ + + + + + + + + +
C: int16_t vq_dflt_ctab( int16_t handle, int32_t ctab_length, +COLOR_TAB *ctab ); +
  +
Umsetzung: +
  +
int16_t vq_dflt_ctab( int16_t handle, int32_t ctab_length,
+                      COLOR_TAB *ctab )
+{
+   intin[0..1] = ctab_length;
+
+   intout zeigt auf ctab
+
+   contrl[0] = 206;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[5] = 7;
+   contrl[6] = handle;
+
+   vdi ();
+
+   if ( contrl[4] )
+     return( 1 );                   /* alles in Ordnung */
+   else
+     return( 0 );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]206 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]2 # Einträge in intin
contrl+8contrl[4]n # Einträge in intout
contrl+10contrl[5]7 # Sub-Opcode
contrl+12contrl[6]handle
intinintin[0]ctab_length
intoutintout[0..n]ctab
+
+ + +
+ +

7.9.31 vq_px_format

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire pixel format and colour space« +
  +
VDI-Nummer: 204 (Unterfunktion 3) +
  +
Deklaration: int32_t vq_px_format( int16_t handle, uint32_t *px_format ); +
  +
Beschreibung: Diese Funktion liefert das eingestellte Pixelformat und den +eingestellten Farbraum zurück. +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
px_format Enthält nach dem Aufruf das eingestellte Pixelformat. + +
+ +
Ergebnis: Die Funktion liefert den Farbraum. +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Farbtabellenfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.9.32 Bindings für vq_px_format

+ + + + + + + + + +
C: int32_t vq_px_format( int16_t handle, uint32_t *px_format ); +
  +
Umsetzung: +
  +
int32_t  vq_px_format( int16_t handle, uint32_t *px_format )
+{
+   contrl[0] = 204;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 3;
+   contrl[6] = handle;
+
+   vdi ();
+
+   px_format = intout[2..3];
+
+   return ( (int32_t) intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]204 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]4 # Einträge in intout
contrl+10contrl[5]3 # Sub-Opcode
contrl+12contrl[6]handle
intoutintout[0..1]Rückgabewert
intout+4intout[2..3]px_format
+
+ + +
+ +

7.9.33 vs_ctab

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Color Table« +
  +
VDI-Nummer: 205 (Unterfunktion 0) +
  +
Deklaration: int16_t vs_ctab( int16_t handle, COLOR_TAB *ctab ); +
  +
Beschreibung: Die Funktion kopiert die Farbtabelle, setzt bei vorhandener +CLUT die Farben in der Hardware und liefert die Anzahl der gesetzten +Farbeinträge zurück. Wenn irgendwie möglich, sollten Programme die +Farben des Bildschirms nicht verändern! +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
ctab Farbtabelle + +
+ +
Ergebnis: Die Funktion liefert die Anzahl der gesetzten Einträge +zurück. +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Farbtabellenfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.9.34 Bindings für vs_ctab

+ + + + + + + + + +
C: int16_t vs_ctab( int16_t handle, COLOR_TAB *ctab ); +
  +
Umsetzung: +
  +
int16_t vs_ctab( int16_t handle, COLOR_TAB *ctab )
+{
+   contrl[0] = 205;
+   contrl[1] = 0;
+   contrl[3] = ctab->length / 2;  /* Länge der Tabelle / 2 */
+   contrl[5] = 0;
+   contrl[6] = handle;
+
+   intin zeigt auf ctab
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]205 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]n # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]0 # Sub-Opcode
contrl+12contrl[6]handle
intinintindurch ctab ersetzen
intoutintout[0]Rückgabewert
+
+ + +
+ +

7.9.35 vs_ctab_entry

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Color Table Entry« +
  +
VDI-Nummer: 205 (Unterfunktion 1) +
  +
Deklaration: int16_t vs_ctab_entry( int16_t handle, int16_t index, int32_t +color_space, COLOR_ENTRY *color ); +
  +
Beschreibung: Diese Funktion setzt einen Farbwert in der Farbtabelle, d.h. +bei Modi mit bis zu 256 Farben wird ein CLUT-Eintrag verändert. Wenn +irgendwie möglich, sollten Programme die Farben des Bildschirms nicht +verändern! +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
index Farbtabellenindex +
color_space Farbraum (z.Zt. nur 0 für eingestellten Farbraum oder +CSPACE_RGB) +
color Farbtabelle + +
+ +
Ergebnis: Die Funktion liefert die Anzahl der gesetzten Einträge +zurück. +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Farbtabellenfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.9.36 Bindings für vs_ctab_entry

+ + + + + + + + + +
C: int16_t vs_ctab_entry( int16_t handle, int16_t index, int32_t +color_space, COLOR_ENTRY *color ); +
  +
Umsetzung: +
  +
int16_t vs_ctab_entry( int16_t handle, int16_t index,
+                       int32_t color_space,
+                       COLOR_ENTRY *color )
+{
+   intin[0] = index;
+   intin[1..2] = color_space;
+   intin[3..6] = color;
+
+
+   contrl[0] = 205;
+   contrl[1] = 0;
+   contrl[3] = 7;
+   contrl[5] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]205 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]7 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]1 # Sub-Opcode
contrl+12contrl[6]handle
intinintin[0]index
intin+2intin[1..2]color_space
intin+6intin[3..6]color
intoutintout[0]Rückgabewert
+
+ + +
+ +

7.9.37 vs_dflt_ctab

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Default Color Table« - Systemfarbtabelle setzen +
  +
VDI-Nummer: 205 (Unterfunktion 2) +
  +
Deklaration: int16_t vs_dflt_ctab( int16_t handle ); +
  +
Beschreibung: Die Funktion stellt die Systemfarbtabelle für die aktuelle +Bittiefe ein. +
  + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation + +
+ +
Ergebnis: Die Funktion liefert die Anzahl der gesetzten Einträge +zurück. +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Farbtabellenfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.9.38 Bindings für vs_dflt_ctab

+ + + + + + + + + +
C: int16_t vs_dflt_ctab( int16_t handle ); +
  +
Umsetzung: +
  +
int16_t vs_dflt_ctab( int16_t handle )
+{
+   contrl[0] = 205;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]205 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]2 # Sub-Opcode
contrl+12contrl[6]handle
intoutintout[0]Rückgabewert
+
+ + +
+ +
+ +Home +VDIVDI +EscapefunktionenEscapefunktionen +KontrollfunktionenKontrollfunktionen + + diff --git a/de/vdi_control.html b/de/vdi_control.html new file mode 100644 index 000000000..c60d4693d --- /dev/null +++ b/de/vdi_control.html @@ -0,0 +1,5953 @@ + + + + + +Die Anleitung zum TOS: Kontrollfunktionen + + + + + + + + + +Home +VDIVDI +FarbtabellenfunktionenFarbtabellenfunktionen +RasterfunktionenRasterfunktionen + +
+ +

7.10 Kontrollfunktionen

+

Diese Bibliothek enthält Funktionen, um Arbeitsgeräte zu +öffnen oder zu schließen und Zeichensätze zu laden. Darüber hinaus +kann über diese Funktionen die Bezier-Spline Rrzeugung manipuliert, +und die Verwaltung des Vektorzeichen-Caches gesteuert werden. +

+

Insgesamt stehen die folgenden Routinen zur Verfügung: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
v_bez_on Bezier-Spline-Erzeugung einschalten. +
v_bez_off Bezier-Spline-Erzeugung ausschalten. +
• v_clr_cachedir z.Zt. keine Informationen bekannt. +
v_clrwk Reinitialisierung einer Arbeitsstation. +
v_clsbm Offscreen-Bitmap schließen. +
v_clsvwk Virtuelle Arbeitstation abmelden. +
v_clswk Physikalische Arbeitstation abmelden. +
• v_def_cachedir z.Zt. keine Informationen bekannt. +
• v_delete_cache z.Zt. keine Informationen bekannt. +
• v_fgetoutline z.Zt. keine Informationen bekannt. +
v_flushcache Vektorzeichen-Cache löschen. +
• v_get_cachedir z.Zt. keine Informationen bekannt. +
v_get_outline Outline eines Zeichens berechnen, erweiterte Version. +
v_getoutline Outline eines Zeichens berechnen. +
v_killoutline Speicher zur Outline-Generierung freigeben. +
v_loadcache Vektorzeichen-Cache laden. +
v_open_bm Moderne Variante zum öffnen von Offscreen-Bitmap +
v_opnbm Offscreen-Bitmap öffnen. +
v_opnprn Druckertreiber öffnen +
v_opnvwk Virtuelle Arbeitstation anmelden. +
v_opnwk Physikalische Arbeitstation anmelden. +
v_pat_rotate   +
v_resize_bm Größe einer Offscreenbitmap verändern +
v_savecache Vektorzeichen-Cache speichern. +
v_set_app_buff Speicher für Bezier-Spline-Erzeugung reservieren. +
• v_set_cachedir z.Zt. keine Informationen bekannt. +
v_updwk Gepufferte Befehle einer Workstation ausführen. +
• vs_backmap z.Zt. keine Informationen bekannt. +
vs_clip Clipping setzen oder aufheben. +
• vs_outmode z.Zt. keine Informationen bekannt. +
• vs_use_fonts z.Zt. keine Informationen bekannt. +
vst_ex_load_fonts Zusätzliche Zeichensätze laden. +
vst_load_fonts Zusätzliche Zeichensätze laden. +
vst_unload_fonts Zeichensätze entfernen. + +
+ +

Querverweis: Workstations des VDI   Style-Guidelines +

+

7.10.1 v_bez_off

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Disable Bezier capabilities« - schaltet die Bezier-Spline +Erzeugung aus. +
  +
VDI-Nummer: 11 (Unterfunktion 13) +
  +
Deklaration: void v_bez_off ( int16_t handle ); +
  +
Beschreibung: Die Funktion deaktiviert die Bezier-Spline-Erzeugung des GDOS +auf der Workstation mit der Kennung handle. +
  +
Hinweis: Obwohl mittels handle eine spezielle +Workstation spezifiziert wird, gilt die Deaktivierung für +alle Arbeitsstationen. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: ab GEM/3 Release 3.1, ab SpeedoGDOS 4.00 und ab NVDI 2.10 +
  +
Gruppe: Kontrollfunktionen +
  +
Querverweis: Binding   v_bez_on   v_bez   v_bez_fill   v_bez_qual   +v_set_app_buff +
  + +
+ +

7.10.2 Bindings für v_bez_off

+ + + + + + + + + +
C: void v_bez_off ( int16_t handle ); +
  +
Umsetzung: +
  +
void v_bez_off (int16_t handle)
+{
+   contrl[0] = 11;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 13;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]11 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]13 # Unterfunktion
contrl+12contrl[6]handle
+
+ + +
+ +

7.10.3 v_bez_on

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Enable Bezier capabilities« - schaltet die Bezier-Spline +Erzeugung ein. +
  +
VDI-Nummer: 11 (Unterfunktion 13) +
  +
Deklaration: int16_t v_bez_on ( int16_t handle ); +
  +
Beschreibung: Die Funktion aktiviert die Bezier-Spline-Erzeugung des GDOS auf +der Workstation mit der Kennung handle. +
  +
Hinweis: Obwohl mittels handle eine spezielle +Workstation spezifiziert wird, gilt die Aktivierung für alle +Arbeitsstationen. +
  +
Diese Funktion ist aus Kompatibilitätsgründen vorhanden. Sie +sorgt dafür, daß Aufrufe von v_pline ohne die Unterfunktionsnummer +13 als Aufrufe von v_bez und Aufrufe von v_fillarea ohne die +Unterfunktionsnummer als Aufrufe von v_bez_fill aufgefaßt werden. Die +Funktion wird normalerweise nur verwendet, um festzustellen, ob +Beziers vorhanden sind. +
  +
Ergebnis: Die Funktion liefert einen Wert von 0 (keine Beziers) bis 7 +(maximale Qualität), der ein ungefähres Maß für die +Kurvenqualität darstellt. Normalerweise kann man von diesem Wert nur +ableiten, ob Beziers vorhanden sind. +
  +
Verfügbar: ab GEM/3 Release 3.1, ab SpeedoGDOS 4.00 und ab NVDI 2.10 +
  +
Gruppe: Kontrollfunktionen +
  +
Querverweis: Binding   v_bez_off   v_bez   v_bez_fill   v_bez_qual   +v_set_app_buff +
  + +
+ +

7.10.4 Bindings für v_bez_on

+ + + + + + + + + +
C: int16_t v_bez_on ( int16_t handle ); +
  +
Umsetzung: +
  +
int16_t v_bez_on (int16_t handle)
+{
+   contrl[0] = 11;
+   contrl[1] = 1;
+   contrl[3] = 0;
+   contrl[5] = 13;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]11 # Opcode der Funktion
contrl+2contrl[1]1 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]13 # Unterfunktion
contrl+12contrl[6]handle
intoutintout[0]Return-Wert
+
+ + +
+ +

7.10.5 v_clrwk

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Clear Workstation« - löscht das Arbeitsgerät +
  +
VDI-Nummer: 3 +
  +
Deklaration: void v_clrwk ( int16_t handle ); +
  +
Beschreibung: Die Funktion versetzt das Arbeitsgerät mit der Kennung +handle in einen genau definierten Anfangszustand. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + +
Gerät Wirkung des Aufrufs +
    +
Bildschirm Der Bildschirm wird gelöscht, und auf die ausgewählte +Hintergrundfarbe gesetzt. +
Plotter Löscht den Puffer des Plotters. +
Drucker Löscht den Puffer des Druckers, und führt zusätzlich einen +Seitenvorschub aus. +
Metafile Speichert den Opcode. +
Kamera Löscht die Ausgabe, und setzt die Hintergrundfarbe. + +
+ +
Hinweis: Durch einen v_opnwk-Aufruf wird das jeweilige +Gerät (z.B. der Bildschirm) automatisch gelöscht. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all drivers. +
  +
Gruppe: Kontrollfunktionen +
  +
Querverweis: Binding   v_form_adv +
  + +
+ +

7.10.6 Bindings für v_clrwk

+ + + + + + + + + +
C: void v_clrwk ( int16_t handle ); +
  +
Umsetzung: +
  +
void v_clrwk (int16_t handle)
+{
+   contrl[0] = 3;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]3 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
+
+ + +
+ +

7.10.7 v_clsbm

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Close Bitmap« - schließt eine Offscreen Bitmap +
  +
VDI-Nummer: 101 (Unterfunktion 1) +
  +
Deklaration: void v_clsbm ( int16_t handle ); +
  +
Beschreibung: Die Funktion v_clsbm() schließt die mit handle +bezeichnete Bitmap. Wenn Speicher beim v_opnbm vom VDI alloziert +wurde, gibt sie diesen Speicher wieder frei. +
  +
Ergebnis: Die Funktion hat kein direktes Funktionsergebnis. +
  +
Verfügbar: ab EdDI-Version 1.00 +
  +
Gruppe: Kontrollfunktionen +
  +
Querverweis: Binding   NVDI   Off-Screen-Bitmaps   v_opnbm +
  + +
+ +

7.10.8 Bindings für v_clsbm

+ + + + + + + + + +
C: void v_clsbm ( int16_t handle ); +
  +
Umsetzung: +
  +
void v_clsbm (int16_t handle)
+{
+   contrl[0] = 101;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]101 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]1 # Unterfunktion
contrl+12contrl[6]handle
+
+ + +
+ +

7.10.9 v_clsvwk

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Close virtual Screen Workstation« - schließt eine +Bildschirm-Workstation. +
  +
VDI-Nummer: 101 +
  +
Deklaration: void v_clsvwk ( int16_t handle ); +
  +
Beschreibung: Die Funktion schließt die Workstation mit der Kennung +handle, die vorher per v_opnvwk geöffnet worden ist. +
  +
Hinweis: Diese Funktion darf nicht benutzt werden, wenn +beim Öffnen der Workstation ein Fehler aufgetreten ist. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all drivers. +
  +
Gruppe: Kontrollfunktionen +
  +
Querverweis: Binding   v_opnvwk   v_clswk +
  + +
+ +

7.10.10 Bindings für v_clsvwk

+ + + + + + + + + +
C: void v_clsvwk ( int16_t handle ); +
  +
Umsetzung: +
  +
void v_clsvwk (int16_t handle)
+{
+   contrl[0] = 101;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]101 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
+
+ + +
+ +

7.10.11 v_clswk

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Close Workstation« - schließt ein geöffnetes +Ein-/Ausgabegerät +
  +
VDI-Nummer: 2 +
  +
Deklaration: void v_clswk ( int16_t handle ); +
  +
Beschreibung: Die Funktion schließt das Gerät mit der Kennung +handle, welches zuvor durch einen v_opnwk Aufruf geöffnet +worden ist. +
  +
Folgende Auswirkungen hat der Funktionsaufruf auf die +verschiedenen Gerätetypen: +
  + + + + + + + + + + + + + + + + + + + + + +
Gerät Wirkung des Aufrufs +
    +
Bildschirm Umschaltung in den Alpha-Modus +
Plotter Update +
Drucker Update, falls nicht geschehen +
Metafile Datei wird geschlossen +
Kamera Update + +
+ +
Hinweis: Vor dem Aufruf dieser Funktion sollte darauf +geachtet werden, daß alle virtuellen Workstations auf dem +entsprechenden Gerät geschlossen sind. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Available only with some form of GDOS. +
  +
Gruppe: Kontrollfunktionen +
  +
Querverweis: Binding   GDOS   v_opnwk   v_opnvwk   v_clsvwk +
  + +
+ +

7.10.12 Bindings für v_clswk

+ + + + + + + + + +
C: void v_clswk ( int16_t handle ); +
  +
Umsetzung: +
  +
void v_clswk (int16_t handle)
+{
+   contrl[0] = 2;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]2 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
+
+ + +
+ +

7.10.13 v_flushcache

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name:»Flush Outline cache« - Vektorzeichen Cache löschen. +
  +
VDI-Nummer: 251 +
  +
Deklaration: int16_t v_flushcache ( int16_t handle ); +
  +
Beschreibung: Die Funktion löscht den Inhalt des Vektorzeichen-Caches, der +Bitmaps von Vektorzeichen enthält. +
  +
Der Parameter handle bezeichnet die Kennung der +entsprechenden Workstation. +
  +
Ergebnis: Die Funktion liefert im Fehlerfall den Wert -1, anderenfalls +den Wert 0. +
  +
Verfügbar: FSMGDOS, ab SpeedoGDOS 4.00 und ab NVDI 3.00, ein Binding wird +allerdings bei NVDI nicht angegeben. +
  +
Gruppe: Kontrollfunktionen +
  +
Querverweis: Binding   v_loadcache   v_savecache   vqt_cachesize +
  + +
+ +

7.10.14 Bindings für v_flushcache

+ + + + + + + + + +
C: int16_t v_flushcache ( int16_t handle ); +
  +
Umsetzung: +
  +
int16_t v_flushcache ( int16_t handle );
+{
+   contrl[0] = 251;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]251 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+12contrl[6]handle
intoutintout[0]Returnwert
+
+ + +
+ +

7.10.15 v_getoutline

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Get character outline« - Outline eines Zeichens berechnen. +
  +
VDI-Nummer: 243 +
  +
Deklaration: void v_getoutline ( int16_t handle, int16_t ch, int16_t +*xyarray, int8_t *bezarray, int16_t maxpts, int16_t *count ); +
  +
Beschreibung: Die Funktion erzeugt das Outline, welches zu einem bestimmten +Zeichen gehört. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
ch Zeichen, dessen Outline berechnet werden soll +
xyarray Puffer für die Koordinaten +
bezarray Puffer für Punktinformationen +
maxpts maximal auszugebende Punktzahl +
count Anzahl der auszugebenden Punkte + +
+ +
Hinweis: Die gelieferten Werte können direkt an die +Ausgabefunktion für Bezier-Splines (v_bez, v_bez_fill) weitergereicht +werden. +
  +
Wenn man die Informationen dieser Funktion z.B. als Vektorgrafik +benutzen möchte, so empfiehlt es sich, vor dem Aufruf eine große +Texthöhe einzustellen. Andernfalls ist die Qualität des +zurückgelieferten Beziers recht mager, da von der internen +Darstellung in 1/65536 Pixeln auf Pixel gerundet wird, d.h. 16 Bit +fallen weg. Die Texthöhe sollte sich an der Rasterauflösung des +Fonts orientieren, die auch von der Funktion vqt_fontheader +zurückgeliefert wird. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: ab SpeedoGDOS 4.00 und an NVDI 3.00 +
  +
Gruppe: Kontrollfunktionen +
  +
Querverweis: Binding   v_get_outline   v_killoutline   SpeedoGDOS   NVDI   +fix31 +
  + +
+ +

7.10.16 Bindings für v_getoutline

+ + + + + + + + + +
C: void v_getoutline ( int16_t handle, int16_t ch, int16_t +*xyarray, int8_t *bezarray, int16_t maxpts, int16_t *count ); +
  +
Umsetzung: +
  +
void v_getoutline (int16_t handle, int16_t ch,
+                   int16_t *xyarray, int8_t *bezarray,
+                   int16_t maxpts, int16_t *count)
+{
+   intin[0] = ch;
+   intin[1] = maxpts;
+   intin[2..3] = xyarray;
+   intin[4..5] = bezarray;
+
+   contrl[0] = 243;
+   contrl[1] = 0;
+   contrl[3] = 6;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *count = intout[0];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]243 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]6 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]ch
intin+2intin[1]maxpts
intin+4intin[2..3]xyarray
intin+8intin[4..5]bezarray
intoutintout[0]count
+
+ + +
+ +

7.10.17 v_get_outline

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Get character outline« - Outline eines Zeichens berechnen. +
  +
VDI-Nummer: 243 (Unterfunktion 1) +
  +
Deklaration: int16_t v_get_outline ( int16_t handle, uint16_t index, +uint16_t x_offset, uint16_t y_offset, int16_t *xyarray, uint8_t +*bezarray, int16_t max_pts ); +
  +
Beschreibung: Die Funktion erzeugt das Outline, welches zu einem bestimmten +Zeichen gehört. +
  +
Die Funktion +
  +
    +
  • funktioniert für jedes Fontformat gleich +
  • +
  • akzepziert Offsets für x- und y-Koordinaten +
  • +
  • funktioniert auch bei Rotation +
  • +
  • beachtet die vertikale Ausrichtung +
  • +
  • beachtet die horizontale Ausrichtung +
  • +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
index Zeichen-Index +
x_offset wird zu allen x-Koordinaten im xyarray addiert +
y_offset wird zu allen y-Koordinaten im xyarray addiert +
xyarray Puffer für die Koordinaten +
bezarray Puffer für Punktinformationen +
max_pts Maximale auszugebende Punktanzahl + +
+ +
Hinweis: Die gelieferten Werte können direkt an die +Ausgabefunktion für Bezier-Splines (v_bez, v_bez_fill) weitergereicht +werden. +
  +
Hinweis: Bisher sah es bei v_getoutline (alte Speedo-Funktion) +so aus, daß die Funktion bei Rotation überhaupt nicht funktionerte. +Die Ausrichtung wurde ebenfalls nicht beachtet. Bei Speedo-Fonts entsprach +die y-Koordinate 0 der obersten im Buchstaben benutzten Koordinate +(befand sich also abhängig vom Buchstaben irgendwo innerhalb der +Zeichenzelle), während bei Postscript und TrueType die y-Koordinate 0 +immer der Zeichenzellenoberkante entsprach. +
  +
Ergebnis: Die Funktion liefert als Ergebnis die Anzahl der ausgegebenen +Punkte zurück. +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Kontrollfunktionen +
  +
Querverweis: Binding   v_getoutline   v_killoutline   SpeedoGDOS   NVDI   +fix31 +
  + +
+ +

7.10.18 Bindings für v_get_outline

+ + + + + + + + + +
C: int16_t v_get_outline ( int16_t handle, uint16_t index, +uint16_t x_offset, uint16_t y_offset, int16_t *xyarray, uint8_t +*bezarray, int16_t max_pts ); +
  +
Umsetzung: +
  +
int16_t v_get_outline ( int16_t handle, uint16_t index,
+                        uint16_t x_offset, uint16_t y_offset,
+                        int16_t *xyarray, uint8_t *bezarayr,
+                        int16_t max_pts )
+{
+   intin[0] = index;
+   intin[1] = max_pts;
+   intin[2..3] = xyarray;
+   intin[4..5] = bezarray;
+   intin[6] = x_offset;
+   intin[7] = y_offset;
+
+   contrl[0] = 243;
+   contrl[1] = 0;
+   contrl[3] = 8;
+   contrl[5] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]243 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]8 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]1 # Sub-Opcode
contrl+12contrl[6]handle
intinintin[0]ch
intin+2intin[1]maxpts
intin+4intin[2..3]xyarray
intin+8intin[4..5]bezarray
intin+12intin[6]x_offset
intin+14intin[7]y_offset
intoutintout[0]Return-Wert
+
+ + +
+ +

7.10.19 v_killoutline

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Kill FSM outline« - Speicher zur Outline-Generierung +freigeben. +
  +
VDI-Nummer: 242 +
  +
Deklaration: void v_killoutline ( int16_t handle, fsm_component_t *component +); +
  +
Beschreibung: Die Funktion gibt den Speicher zur Erzeugung von Outlines frei. +Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
component Adresse eines per v_getoutline generierten Outlines + +
+ +
Hinweis: Die Funktion sollte stets aufgerufen werden, +sobald ein Outline nicht mehr benötigt wird. Anderenfalls läuft man +Gefahr, keinen freien Speicher mehr zu besitzen. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: in FSMGDOS , ab SpeedoGDOS 4.00 nicht mehr notwendig. +
  +
Gruppe: Kontrollfunktionen +
  +
Querverweis: GDOS   SpeedoGDOS   v_getoutline +
  + +
+ +

7.10.20 v_loadcache

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Load Outline cache« - Vektorzeichen-Cache laden. +
  +
VDI-Nummer: 250 +
  +
Deklaration: int16_t v_loadcache ( int16_t handle, int8_t *filename, int16_t +mode ); +
  +
Beschreibung: Die Funktion füllt den Vektorzeichen-Cache mit dem Inhalt +einer Datei. Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
filename Name der Datei +
mode Füll-Modus + + + + + + +
0 = Datei an aktuellen Cache hängen +
1 = aktuellen Cache löschen, und Datei komplett in den Cache laden + +
+ + +
+ +
Ergebnis: Die Funktion liefert im Fehlerfall den Wert -1, anderenfalls +den Wert 0. +
  +
Verfügbar: FSMGDOS, ab SpeedoGDOS 4.00 +
  +
Gruppe: Kontrollfunktionen +
  +
Querverweis: Binding   v_flushcache   v_savecache   vqt_cachesize +
  + +
+ +

7.10.21 Bindings für v_loadcache

+ + + + + + + + + +
C: int16_t v_loadcache ( int16_t handle, int8_t *filename, int16_t +mode ); +
  +
Umsetzung: +
  +
int16_t v_loadcache ( int16_t handle, int8_t *filename,
+                      int16_t mode )
+{
+   intin[0] = mode;
+   intin[1..n] = filename;
+
+   contrl[0] = 250;
+   contrl[1] = 0;
+   contrl[3] = 1+n;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]250 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1+n # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]mode
intin+2intin[1..n]filename
intoutintout[0]Rückgabewert
+
+ + +
+ +

7.10.22 v_load_cache

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Load Outline cache« - Vektorzeichen-Cache laden. +
  +
VDI-Nummer: 226 (Subcode 7) +
  +
Deklaration: int16_t v_load_cache ( int16_t handle, int8_t *filename, +int16_t mode ); +
  +
Beschreibung: Die Funktion füllt den Vektorzeichen-Cache mit dem Inhalt +einer Datei. Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
filename Name der Datei +
mode Füll-Modus + + + + + + +
0 = Datei an aktuellen Cache hängen +
1 = aktuellen Cache löschen, und Datei komplett in den Cache laden + +
+ + +
+ +
Ergebnis: Die Funktion liefert im Fehlerfall den Wert -1, anderenfalls +den Wert 0. +
  +
Verfügbar: Ab SpeedoGDOS 5.1 +
  +
Gruppe: Kontrollfunktionen +
  +
Querverweis: Binding   v_flushcache   v_savecache   v_loadcache   +vqt_cachesize +
  + +
+ +

7.10.23 Bindings für v_load_cache

+ + + + + + + + + +
C: int16_t v_load_cache ( int16_t handle, int8_t *filename, +int16_t mode ); +
  +
Umsetzung: +
  +
int16_t v_load_cache ( int16_t handle, int8_t *filename,
+                      int16_t mode )
+{
+   intin[0] = mode;
+   intin[1..n] = filename;
+
+   contrl[0] = 226;
+   contrl[1] = 0;
+   contrl[3] = 1+n;
+   contrl[5] = 7;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]226 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1+n # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]7 # Sub-Opcode
contrl+12contrl[6]handle
intinintin[0]mode
intin+2intin[1..n]filename
intoutintout[0]Rückgabewert
+
+ + +
+ +

7.10.24 v_open_bm

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Open Bitmap« - öffnet eine Offscreen Bitmap +
  +
VDI-Nummer: 100 (Unterfunktion 3) +
  +
Deklaration: int16_t v_open_bm ( int16_t base_handle, GCBITMAP *bitmap, +int16_t color_flags, int16_t unit_flags, int16_t pixel_width, int16_t +pixel_height ); +
  +
Beschreibung: Die Funktion v_open_bm dient zur Erzeugung von +Offscreen-Bitmaps. Man kann ihr entweder die Größe eines Bitmap +angeben, die Sie allozieren soll, oder ihr eine Bitmap übergeben. Die +Bitmap wird im gleichen Format wie die des Bildschirms verwaltet, +wodurch schnelles Kopieren zwischen beiden möglich ist. +
  +
v_open_bm ist die moderne Variante von v_opnbm und arbeitet mit +derselben Bitmap- und Pixelformatbeschreibung wie vr_transfer_bits. +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
base_handle graf_handle() +
bitmap Zeiger auf GCBITMAP oder 0. +
Wenn GCBITMAP 0 ist, wird die GCBITMAP des Handles +base_handle benutzt. Die Einträge in der Bitmap werden wie +folgt ausgewertet: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Eintrag Funktion +
addr Adresse der Bitmap oder 0 (VDI fordert den Speicher an und +trägt die Adresse nachher hier ein) +
width Breite einer Zeile in Bytes, wenn addr gültig ist +
bits Bittiefe, korrespondiert mit px_format +
px_format Pixelformat oder 0 (Pixelformat wird von base_handle +übernommen) wenn alle folgenden Koordinaten auf 0 gesetzt sind und +das VDI den Speicher anfordert [<addr> ist 0], werden die +Ausmaße von base_handle übernommen +
xmin minimale diskrete x-Koordinate der Bitmap (in der Regel 0) +
ymin minimale diskrete y-Koordinate der Bitmap (in der Regel 0) +
xmax maximale diskrete x-Koordinate der Bitmap + 1 (in der Regel die +Breite) +
ymax maximale diskrete y-Koordinate der Bitmap + 1 (in der Regel die +Höhe) +
ctab wird ignoriert +
itab wird ignoriert +
reserved0 muß 0 sein! +
reserved1 muß 0 sein! + +
+ +
color_flags Behandlung der Farbtabellen +
Wenn das unterste Bit von color_flags gesetzt ist, +benutzt die Bitmap die gleiche Farbtabelle wie base_handle. +Ist das Bit gelöscht, wird für die Bitmap eine eigene Farbtabelle +und eine eigene inverse Farbtabelle angelegt (wodurch für manche +Programme die Behandlung von Bildschirm-Caches oder Hintergrundpuffern +deutlich einfacher werden sollte). Farbveränderungen auf dem +Bildschirm ändern dann nicht die Farbeinträge der Bitmap. Von +color_flags wird z.Zt. nur das unterste Bit benutzt. Alle +anderen Bits müssen 0 sein. +
Hinweise: Wenn Bitmap und Bildschirm die gleiche Farbtabelle +benutzen, dürfen die Farben nur über das Handle des Bildschirms +(also base_handle) verändert werden, da andernfalls die +Farben nicht in der Hardware (CLUT) eingetragen werden. +
unit_flags Maßeinheit der Pixelausmaße +
pixel_width Pixelbreite oder 0 +
pixel_height Pixelhöhe oder 0 + +
+ +
Zusätzlich wird in pixel_width und pixel_height +die Pixelgröße übergeben, damit die Fonts richtig skaliert werden +können. Falls einer der beiden Einträge 0 ist, werden sie von +base_handle übernommen. Die Größenangaben werden abhängig +von unit_flags interpretiert: +
  +
-1: Angaben in dpi +
 0: Angaben in Mikrometern +
 1: Angaben in 1/10 Mikrometern +
 2: Angaben in 1/100 Mikrometern +
 3: Angaben in 1/1000 Mikrometern +
  +
Da <ctab> ignoriert wird, wird für die Bitmap die der +Bittiefe entsprechende Systemfarbtabelle im Farbraum CSPACE_RGB (RGB) +angelegt. Für mögliche spätere Erweiterungen in diesem Bereich ist +die Variable <zero>, die daher jetzt auf 0 gesetzt werden muß. +
  +
Ergebnis: Wenn die Funktion erfolgreich ist, wird ein von 0 verschiedenes +Handle zurückgeliefert. Wenn das VDI den Speicher für die Bitmap +angefordert hat und beim Aufruf eine leere (oder nur teilweise +gefüllte) GCBITMAP-Struktur übergeben wurde, ist die Struktur nach +dem Aufruf vollständig initialisiert. Programme dürfen weder die +Farbtabelle noch die inverse Farbtabelle der Struktur durch direkten +Zugriff ändern. Alle Veränderungen müssen durch die Farbfunktionen +unter dem zurückgelieferten Handle erfolgen. +
  +
Verfügbar: ab EdDi-Version 1.20 +
  +
Gruppe: Kontrollfunktionen +
  +
Querverweis: Binding   NVDI   Off-Screen-Bitmaps   v_clsbm +
  + +
+ +

7.10.25 Bindings für v_open_bm

+ + + + + + + + + +
C: int16_t v_open_bm ( int16_t base_handle, GCBITMAP *bitmap, +int16_t color_flags, int16_t unit_flags, int16_t pixel_width, int16_t +pixel_height ); +
  +
Umsetzung: +
  +
int16_t v_open_bm ( int16_t base_handle, GCBITMAP *bitmap,
+                    int16_t color_flags, int16_t unit_flags,
+                    int16_t pixel_width, int16_t pixel_height )
+{
+   intin[0] = color_flags;
+   intin[1] = unit_flags;
+   intin[2] = pixel_width;
+   intin[3] = pixel_height;
+
+   contrl[0] = 100;
+   contrl[1] = 0;
+   contrl[3] = 4;
+   contrl[5] = 3;
+   contrl[6] = base_handle;
+   contrl[7..8] = bitmap;
+
+   vdi ();
+
+   return ( contrl[6] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]100 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]4 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]3 # Unterfunktion
contrl+12contrl[6]base_handle
contrl+14contrl[7..8]bitmap
intinintin[0]color_flags
intin+2intin[1]unit_flags
intin+4intin[2]pixel_width
intin+6intin[3]pixel_height
intoutintout[0]1
+
+ + +
+ +

7.10.26 v_opnbm

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Open Bitmap« - öffnet eine Offscreen Bitmap +
  +
VDI-Nummer: 100 (Unterfunktion 1) +
  +
Deklaration: void v_opnbm ( int16_t *work_in, MFDB *bitmap, int16_t *handle, +int16_t *work_out ); +
  +
Beschreibung: Die Funktion v_opnbm dient zur Erzeugung von Offscreen-Bitmaps. +Man kann ihr entweder die Größe eines Bitmap angeben, die Sie +allozieren soll, oder ihr eine Bitmap übergeben. Die Bitmap wird im +gleichen Format wie die des Bildschirms verwaltet, wodurch schnelles +Kopieren zwischen beiden möglich ist. +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle graf_handle +
work_in[0..10] Wie bei v_opnwk/v_opnvwk definiert +
work_in[11] Breite -1 (z.B. 1279) +
work_in[12] Höhe -1 (z.B. 959) +
work_in[13] Breite eines Pixels in Mikrometern +
work_in[14] Höhe eines Pixels in Mikrometern +
work_in[15..19] Reserviert, sollte 0 enthalten + +
+ +
Die Funktion steht ab EdDI-Version 1.00 zur Verfügung. Ab +EdDI 1.1 kann v_opnbm mit zusätzlichen Parametern in +work_in[15..19] aufgerufen werden. Es wird dann versucht, eine +Bitmap in dem durch diese Parameter beschriebenen Format zu öffnen. +Sollte für das angegebene Format kein Treiber vorhanden sein, kann +die Bitmap nicht erzeugt werden. Es gilt: +
  + + + + + + + + + + + + +
work_in[15..16] Anzahl der darstellbaren Farben +
work_in[17] Anzahl der Planes +
work_in[18] Pixelformat +
work_in[19] Bitreihenfolge + +
+ +
Pixelformat und Bitreihenfolge werden bei vq_scrninfo genauer +beschrieben. Mit den folgenden Parametern kann z.B. eine +Offscreen-Bitmap mit 256 Farben und Interleaved Planes erzeugt werden: +
  +
work_in[15..16] = 256;  /* 256 Farben             */
+work_in[17] = 8;        /* 8 Farbebenen           */
+work_in[18] = 0;        /* Interleaved Planes     */
+work_in[19] = 1;        /* normale Bitreihenfolge */
+
+
Achtung: Der Eintrag work_in[11] sollte bei +Addition von 1 ohne Rest durch 16 teilbar sein. Andernfalls rundet der +VDI Treiber auf den nächsthöheren ohne Rest teilbaren Wert. +
  +
Wird für Pixelbreite und -Höhe 0 angegeben, so werden die +Werte des Bildschirms benutzt. Nach erfolgreichem Aufruf enthält der +Parameter handle die Kennung der erzeugten Bitmap. +
  +
Hinweis: Die Benutzung von Offscreen-Bitmaps bietet sich +auch dann an, wenn man Effekte wie starkes Flackern vermeiden möchte. +In diesem Fall baut man Teile der Grafik in der Bitmap auf und +überträgt die Bitmap mit vrt_cpyfm oder vro_cpyfm auf den +Bildschirm. +
  +
Ergebnis: Informationen werden über das work_out Array bzw. den +Memory-Form-Definiton-Block (MFDB) nach außen gereicht: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
work_out[0..1] wie bei v_opnwk/v_opnvwk definiert +
work_out[2] 0 +
work_out[3..38] wie bei v_opnwk/v_opnvwk definiert +
work_out[39] 0 (keine Hardw.-Palette vorh., da Bitmap) +
work_out[39..56] wie bei v_opnwk/v_opnvwk definiert +
bitmap Zeiger auf einen MFDB + +
+ +
Falls bitmap->fd_addr gleich NULL ist, so wird anhand der +Größenangaben in work_in Speicher für die Bitmap +angefordert (die Bitmap wird im Gegensatz zu v_opnvwk gelöscht). +
  +
Um eine Bitmap im gerätespezifischen Format zu öffnen, muß +bitmap->fd_nplanes eine Null oder die Ebenenanzahl des +Schirms enthalten (work_out[4] bei vq_extnd). Ist +bitmap->fd_nplanes 1, wird eine monochrome Bitmap angelegt. +
  +
Die Einträge des MFDB (fd_addr, fd_w, fd_h, fd_wdwidth, +fd_stand, fd_nplanes) werden vom VDI-Treiber gesetzt und an die +aufrufende Applikation zurückgegeben. Wenn nicht genügend Speicher +vorhanden ist, wird der Inhalt des MFDBs nicht verändert; ein +Null-Handle wird zurückgegeben. +
  +
Wenn bitmap->fd_addr ungleich NULL ist, wird dieser +Eintrag als Zeiger auf eine Bitmap interpretiert. Wenn die Bitmap im +Standardformat vorliegt, wird sie ins gerätespezifische Format +umgewandelt. Liegt sie schon im gerätespezifischen Format vor, so +wird sie nicht umgewandelt. Falls die Auflösung der Bitmap (d.h. die +Anzahl der Farben und Planes) nicht unterstützt wird, gibt v_opnbm +ein Null-Handle zurück. +
  +
Verfügbar: Die Funktion steht ab EdDI-Version 1.00 zur Verfügung. Ab +EdDI 1.1 kann v_opnbm mit zusätzlichen Parametern aufgerufen +werden. +
  +
Gruppe: Kontrollfunktionen +
  +
Querverweis: Binding   NVDI   Off-Screen-Bitmaps   v_clsbm +
  + +
+ +

7.10.27 Bindings für v_opnbm

+ + + + + + + + + +
C: void v_opnbm ( int16_t *work_in, MFDB *bitmap, int16_t *handle, +int16_t *work_out ); +
  +
Umsetzung: +
  +
void v_opnbm (int16_t *work_in, MFDB *bitmap, int16_t *handle,
+              int16_t *work_out)
+{
+   intin[0..19] = work_in[0..19];
+
+   contrl[0] = 100;
+   contrl[1] = 0;
+   contrl[3] = 20;
+   contrl[5] = 1;
+   contrl[6] = handle;
+   contrl[7..8] = bitmap;
+
+   vdi ();
+
+   *handle = contrl[6];
+   work_out[0..44]  = intout[0..44];
+   work_out[45..56] = ptsout[0..11];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]100 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]6 # Einträge in ptsout
contrl+6contrl[3]20 # Einträge in intin
contrl+8contrl[4]45 # Einträge in intout
contrl+10contrl[5]1 # Unterfunktion
contrl+12contrl[6]handle
contrl+14contrl[7..8]bitmap
intinintin[0..19]work_in[0..19]
intoutintout[0..44]work_out[0..44]
ptsoutptsout[0..11]work_out[45..56]
+
+ + +
+ +

7.10.28 v_opnprn

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Open printer driver« +
  +
VDI-Nummer: 1 +
  +
Deklaration: int16_t v_opnprn( int16_t base_handle, PRN_SETTINGS *settings, +int16_t *work_out ); +
  +
Beschreibung: Die Funktion öffnet einen Druckertreiber. +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
base_handle graf_handle +
settings Zeiger auf eine Struktur vom Typ PRN_SETTINGS. +
work_out Zeiger auf ein int16_t work_out[57]. + +
+ +
Ergebnis: VDI-Handle oder 0 (Fehler) +
  +
Verfügbar: Die Übergabe von PRN_SETTINGS ist ab NVDI 4.1x (27.11.96) möglich. +Das Binding taucht erstmal in NVDI 5.00 auf. +
  +
Gruppe: Kontrollfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.10.29 Bindings für v_opnprn

+ + + + + + + + + +
C: int16_t v_opnprn( int16_t base_handle, PRN_SETTINGS *settings, +int16_t *work_out ); +
  +
Umsetzung: +
  +
int16_t v_opnprn( int16_t base_handle, PRN_SETTINGS *settings,
+                  int16_t *work_out )
+{
+  int16   work_in[16];
+  int16   i;
+
+  vdi_pb.intin = (int *) work_in;
+  vdi_pb.intout = (int *) work_out;
+  vdi_pb.ptsout = (int *) work_out + 45;
+
+  /* Treibernummer */
+  work_in[0] = settings->driver_id;
+  for ( i = 1; i < 10; i++ )
+    work_in[i] = 1;
+  /* Rasterkoordinaten benutzen */
+  work_in[10] = 2;
+  /* Seitenformat aus settings benutzen */
+  work_in[11] = (int16) settings->size_id;
+  /* Ausgabekanal aus settings benutzen */
+  *(int8 **) &work_in[12] = settings->device;
+  /* Druckereinstellung */
+  *(PRN_SETTINGS **) &work_in[14] = settings;
+
+  contrl[0] = 1;                   /* Funktionsnummer */
+  contrl[1] = 0;
+  contrl[3] = 16;              /* erweiterte Parameteranzahl */
+  contrl[6] = base_handle;
+
+  vdi( &vdi_pb );                  /* Treiber öffnen */
+
+  vdi_pb.intin = (int *) intin;    /* Zeiger zurücksetzen */
+  vdi_pb.intout = (int *) intout;
+  vdi_pb.ptsout = (int *) ptsout;
+
+  return( contrl[6] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]1 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]6 # Einträge in ptsout
contrl+6contrl[3]16 # Einträge in intin
contrl+8contrl[4]45 # Einträge in intout
contrl+10contrl[5]1 # Unterfunktion
contrl+12contrl[6]base_handle
intinintin[0..19]work_in[0..15]
intoutintout[0..44]work_out[0..44]
ptsoutptsout[0..11]work_out[45..56]
+
+ + +
+ +

7.10.30 v_opnvwk

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Open virtual Screen Workstation« - öffnet eine +Bildschirm-Workstation +
  +
VDI-Nummer: 100 +
  +
Deklaration: void v_opnvwk ( int16_t *work_in, int16_t *handle, int16_t +*work_out ); +
  +
Beschreibung: Die Funktion öffnet ein virtuelles Arbeitsgerät, auf einem +bereits geöffneten physikalischen Gerät. Nach dem Aufruf enthält +der Parameter handle die Kennung des virtuellen Gerätes bzw. +den Wert Null im Fehlerfall. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
work_in Zeiger auf ein Integerfeld mit den genaueren Spezifikationen +des zu ladenden Gerätetreibers +
work_in[0] Nummer des Gerätetreibers wie im ASSIGN.SYS File angegeben. Für den +Bildschirm gilt: + + + + + + +
1 = aktuelle Auflösung +
x = 2 + Getrez()   + +
+ +
work_in[1] Linientyp +
work_in[2] Linienfarbe +
work_in[3] Markertyp +
work_in[4] Markerfarbe +
work_in[5] Zeichensatznummer +
work_in[6] Textfarbe +
work_in[7] Fülltyp +
work_in[8] Füllmuster-Index +
work_in[9] Füllmusterfarbe +
work_in[10] welche Koordinaten sollen benutzt werden: + + + + + + +
0 = NDC-Koordinaten +
2 = RC-Koordinaten + +
+ +
work_in[11] Seitenformat + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
0 = Voreinstellung benutzen +
1 = DIN A3 +
2 = DIN A4 +
3 = DIN A5 +
4 = DIN B5 +
16 = Letter Size +
17 = Half Size +
18 = Legal Size +
19 = Double Size +
20 = Broad Sheet Size + +
+ +
work_in[12]   +
+   +
work_in[13] Zeiger auf einen GEMDOS-Dateinamen in C-Konvention +(null-terminiert), oder NULL +
work_in[14] reserviert, sollte 0 sein +
work_in[15] reserviert, sollte 0 sein +
work_out Zeiger auf ein Integerfeld, das genauere Informationen über +den geladenen Gerätetreiber enthält +
work_out[0] Anzahl der maximal ansprechbaren Rastereinheiten in der +Horizontalen +
work_out[1] Anzahl der maximal ansprechbaren Rastereinheiten in der +Vertikalen +
work_out[2] Skalierungsflag: + + + + + + +
0 = Gerät kann exakt skalieren +
1 = Gerät kann nicht exakt skalieren + +
+ +
work_out[3] Breite einer Rastereinheit in Mikrometern +
work_out[4] Höhe einer Rastereinheit in Mikrometern +
work_out[5] Anzahl der Zeichensatzhöhen oder Null, falls die Höhe +kontinuierlich verändert werden kann +
work_out[6] Anzahl der Linientypen +
work_out[7] Anzahl der Linienbreiten oder Null, falls die Strichstärke +kontinuierlich verändert werden kann +
work_out[8] Anzahl der Markertypen +
work_out[9] Anzahl der Markergrößen oder Null, falls die Größe +kontinuierlich verändert werden kann +
work_out[10] Anzahl der Zeichensätze +
work_out[11] Anzahl der Füllmuster +
work_out[12] Anzahl der Schraffurarten +
work_out[13] Anzahl der vordefinierten Farben +
work_out[14] Anzahl der verfügbaren Grafikgrundfunktionen (GENERAL DRAWING +PRIMITIV, GDP) +
work_out[15] Liste der auf dem Gerät verfügbaren GDP's. Sind es +weniger als zehn wird die Liste durch -1 beendet. Das VDI unterstützt +folgende GDP's: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
1 = v_bar +
2 = v_arc +
3 = v_pieslice +
4 = v_circle +
5 = v_ellipse +
6 = v_ellarc +
7 = v_ellpie +
8 = v_rbox +
9 = v_rfbox +
10 = v_justified + +
+ +
:   +
work_out[24]   +
work_out[25] Liste aller Attribute der GDP's: + + + + + + + + + + + + + + + +
0 = Linie +
1 = Marker +
2 = Text +
3 = Füllbereich +
4 = kein Attribut + +
+ +
:   +
work_out[34]   +
work_out[35] das Gerät ist farbtüchtig (1) oder nicht (0) +
work_out[36] das Gerät kann Text rotieren (1) oder nicht (0) +
work_out[37] das Gerät kann eine Fülloperation ausführen (1) oder nicht +(0) +
work_out[38] das Gerät unterstützt CELL ARRAY (1) oder nicht (0) +
work_out[39] Anzahl der verfügbaren Farben oder + + + + + + +
0 = mehr als 32767 Farben verfügbar +
2 = monochrom + +
+ +
work_out[40] Grafik-Cursor-Kontrolle + + + + + + + + + +
0 = keine +
1 = nur die Tastatur +
2 = Tastatur und andere Geräte + +
+ +
work_out[41] Eingabegerät für variierende Eingaben + + + + + + + + + +
0 = keine +
1 = nur die Tastatur +
2 = anderes Gerät + +
+ +
work_out[42] Auswahltasten + + + + + + + + + +
0 = keine +
1 = Funktionstasten auf der Tastatur +
2 = zusätzliches Tastenfeld + +
+ +
work_out[43] alphanumerische Eingabe + + + + + + +
0 = keine +
1 = Tastatur + +
+ +
work_out[44] Gerätetyp: + + + + + + + + + + + + + + + +
0 = reines Ausgabegerät +
1 = reines Eingabegerät +
2 = Ein/Ausgabegerät +
3 = reserviert +
4 = Metafile Ausgabe + +
+ +
work_out[45] kleinste Buchstabenbreite +
work_out[46] kleinste Buchstabenhöhe +
work_out[47] größte Buchstabenbreite +
work_out[48] größte Buchstabenhöhe +
work_out[49] kleinste darstellbare Linienbreite +
work_out[50] immer Null +
work_out[51] größte Linienbreite +
work_out[52] immer Null +
work_out[53] kleinste darstellbare Markerbreite +
work_out[54] kleinste darstellbare Markerhöhe +
work_out[55] größte Markerbreite +
work_out[56] größte Markerhöhe + +
+ +
Hinweis: Das VDI besitzt leider keinen Mechanismus, um +bei mehreren virtuellen Workstations die Eingabegeräte zu verwalten. +Dies muß deshalb von der Applikation übernommen werden, die die +physikalische Workstation des Bildschirms geöffnet hat. +
  +
Wichtig: Die Kennung der aktuellen +physikalischen Bildschirm-Workstation muß beim AES per +graf_handle erfragt werden. +
  + + +
Achtung: In den TOS-Versionen 1.00, 1.04, 1.06, 1.62 und +2.05 gibt es einen Fehler bei der Verwaltung der virtuellen +Workstations. Dies kann sich darin äußern daß Kennungen +mehrfach vergeben werden, und deshalb u.U. +Workstation-Attribute verstellt werden. Dieser Fehler tritt genau dann +auf, wenn in der internen Workstationliste des Bildschirmtreibers +Lücken entstehen. Abhilfe: das Patch-Programm VDIFIX +in den AUTO-Ordner legen. +
Der Fehler tritt auch bei TOS 2.06 und vor dem dem 31.05.1990 +erstellten TOS 3.00 auf. Leider ist für diese TOS-Versionen kein +Patch verfügbar. +
  +
Ergebnis: Die Funktion liefert kein direktes Funktionsergebnis. +
  +
Verfügbar: Supported by all drivers. +
  +
Gruppe: Kontrollfunktionen +
  +
Querverweis: Binding   v_opnwk   v_clsvwk   graf_handle +
  + +
+ +

7.10.31 Bindings für v_opnvwk

+ + + + + + + + + +
C: void v_opnvwk ( int16_t *work_in, int16_t *handle, int16_t +*work_out ); +
  +
Umsetzung: +
  +
void v_opnvwk (int16_t *work_in, int16_t *handle,
+               int16_t *work_out)
+{
+   intin[0..10] = work_in[0..10]
+
+   contrl[0] = 100;
+   contrl[1] = 0;
+   contrl[3] = 11;
+   contrl[6] = *handle;
+
+   vdi ();
+
+   *handle = contrl[6];
+   work_out[0..44]  = intout[0..44];
+   work_out[45..56] = ptsout[0..11];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]100 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]6 # Einträge in ptsout
contrl+6contrl[3]11 # Einträge in intin
contrl+8contrl[4]45 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0..10]work_in[0..10]
intoutintout[0..44]work_out[0..44]
ptsoutptsout[0..11]work_out[45..56]
+
+ + +
+ +

7.10.32 v_opnwk

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Open Workstation« - initialisiert einen Gerätetreiber für +ein bestimmtes Ein/Ausgabegerät +
  +
VDI-Nummer: 1 +
  +
Deklaration: void v_opnwk ( int16_t *work_in, int16_t *handle, int16_t +*work_out ); +
  +
Beschreibung: Die Funktion lädt einen Gerätetreiber. Dazu muß sich jedoch +das GDOS im Speicher befinden und der Gerätetreiber muß im +ASSIGN.SYS File aufgezählt sein. Falls alles geklappt hat, erhält +man in handle eine positive Gerätekennung und Null im +Fehlerfall. +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
work_in Zeiger auf ein Integerfeld mit den genaueren Spezifikationen +des zu ladenden Gerätetreibers +
work_in[0] Nummer des Gerätetreibers wie im ASSIGN.SYS File angegeben. Für den +Bildschirm gilt: + + + + + + +
1 = aktuelle Auflösung +
x = 2 + Getrez()   + +
+ +
work_in[1] Linientyp +
work_in[2] Linienfarbe +
work_in[3] Markertyp +
work_in[4] Markerfarbe +
work_in[5] Zeichensatznummer +
work_in[6] Textfarbe +
work_in[7] Fülltyp +
work_in[8] Füllmuster-Index +
work_in[9] Füllmusterfarbe +
work_in[10] welche Koordinaten sollen benutzt werden: + + + + + + +
0 = NDC-Koordinaten +
2 = RC-Koordinaten + +
+ +
work_in[11] Seitenformat + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
0 = Voreinstellung benutzen +
1 = DIN A3 +
2 = DIN A4 +
3 = DIN A5 +
4 = DIN B5 +
16 = Letter Size +
17 = Half Size +
18 = Legal Size +
19 = Double Size +
20 = Broad Sheet Size + +
+ +
work_in[12]   +
+   +
work_in[13] Zeiger auf einen GEMDOS-Dateinamen in C-Konvention +(null-terminiert), oder NULL +
work_in[14] reserviert, sollte 0 sein +
work_in[15] reserviert, sollte 0 sein +
work_out Zeiger auf ein Integerfeld, das genauere Informationen über +den geladenen Gerätetreiber enthält +
work_out[0] Anzahl der maximal ansprechbaren Rastereinheiten in der +Horizontalen +
work_out[1] Anzahl der maximal ansprechbaren Rastereinheiten in der +Vertikalen +
work_out[2] Skalierungsflag: + + + + + + +
0 = Gerät kann exakt skalieren +
1 = Gerät kann nicht exakt skalieren + +
+ +
work_out[3] Breite einer Rastereinheit in Mikrometern +
work_out[4] Höhe einer Rastereinheit in Mikrometern +
work_out[5] Anzahl der Zeichensatzhöhen oder Null, falls die Höhe +kontinuierlich verändert werden kann +
work_out[6] Anzahl der Linientypen +
work_out[7] Anzahl der Linienbreiten oder Null, falls die Strichstärke +kontinuierlich verändert werden kann +
work_out[8] Anzahl der Markertypen +
work_out[9] Anzahl der Markergrößen oder Null, falls die Größe +kontinuierlich verändert werden kann +
work_out[10] Anzahl der Zeichensätze +
work_out[11] Anzahl der Füllmuster +
work_out[12] Anzahl der Schraffurarten +
work_out[13] Anzahl der vordefinierten Farben +
work_out[14] Anzahl der verfügbaren Grafikgrundfunktionen (GENERAL DRAWING +PRIMITIV, GDP). Besitzt den Wert 11, wenn 'Escapement Text' (erst ab +PC-GEM/3) verfügbar ist. +
work_out[15] Liste der auf dem Gerät verfügbaren GDP's. Sind es +weniger als zehn wird die Liste durch -1 beendet. Das VDI unterstützt +folgende GDP's: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
1 = v_bar +
2 = v_arc +
3 = v_pieslice +
4 = v_circle +
5 = v_ellipse +
6 = v_ellarc +
7 = v_ellpie +
8 = v_rbox +
9 = v_rfbox +
10 = v_justified +
11 = v_etext + +
+ +
work_out[24] Besitzt den Wert 11, wenn 'Escapement Text' verfügbar ist, und +ansonsten den Wert 10. (ab PC-GEM/3). +
work_out[25] Liste aller Attribute der GDP's: + + + + + + + + + + + + + + + +
0 = Linie +
1 = Marker +
2 = Text +
3 = Füllbereich +
4 = kein Attribut + +
+ +
work_out[34]   +
work_out[35] das Gerät ist farbtüchtig (1) oder nicht (0) +
work_out[36] das Gerät kann Text rotieren (1) oder nicht (0) +
work_out[37] das Gerät kann eine Fülloperation ausführen (1) oder nicht +(0) +
work_out[38] das Gerät unterstützt CELL ARRAY (1) oder nicht (0) +
work_out[39] Anzahl der verfügbaren Farben oder + + + + + + +
0 = mehr als 32767 Farben verfügbar +
2 = monochrom + +
+ +
work_out[40] Grafik-Cursor-Kontrolle + + + + + + + + + +
0 = keine +
1 = nur die Tastatur +
2 = Tastatur und andere Geräte + +
+ +
work_out[41] Eingabegerät für variierende Eingaben + + + + + + + + + +
0 = keine +
1 = nur die Tastatur +
2 = anderes Gerät + +
+ +
work_out[42] Auswahltasten + + + + + + + + + +
0 = keine +
1 = Funktionstasten auf der Tastatur +
2 = zusätzliches Tastenfeld + +
+ +
work_out[43] alphanumerische Eingabe + + + + + + +
0 = keine +
1 = Tastatur + +
+ +
work_out[44] Gerätetyp: + + + + + + + + + + + + + + + + + + +
-1 = Ausgabegerät kann im Querformat ausgeben (ab PC-GEM/3) +
0 = reines Ausgabegerät +
1 = reines Eingabegerät +
2 = Ein/Ausgabegerät +
3 = reserviert +
4 = Metafile Ausgabe + +
+ +
work_out[45] kleinste Buchstabenbreite +
work_out[46] kleinste Buchstabenhöhe +
work_out[47] größte Buchstabenbreite +
work_out[48] größte Buchstabenhöhe +
work_out[49] kleinste darstellbare Linienbreite +
work_out[50] immer Null +
work_out[51] größte Linienbreite +
work_out[52] immer Null +
work_out[53] kleinste darstellbare Markerbreite +
work_out[54] kleinste darstellbare Markerhöhe +
work_out[55] größte Markerbreite +
work_out[56] größte Markerhöhe + +
+ +
Hinweis: Die Komponenten work_in[11] bis +work_in[15] sind nur unter NVDI sinnvoll, und erlauben es, das +Seitenformat für Drucker- und Bit-Image Treiber, sowie den +Ausgabekanal zu setzen. Bei einem Metafile-Treiber wirkt sich die +Einstellung des Seitenformates nicht aus; hier wird lediglich +der Dateiname übernommen. Um zu überprüfen, ob das Seiten- bzw. +Papierformat tatsächlich eingestellt werden konnte, sollte auf die +Funktion vq_extnd zurückgegriffen werden. +
  +
Die in den Elementen work_out[0,1] zurückgelieferten +Werte beschreiben den tatsächlich bedruckbaren Bereich; die +nicht bedruckbaren Bereiche können per vq_extnd ermittelt +werden. +
  +
Die hier angegebene Belegung der work_in und +work_out Arrays ist übrigens nicht mehr vollständig +kompatibel zum PC-GEM, da ab GEM/3 teilweise erhebliche Änderungen bzw. Erweiterungen +vorgenommen wurden, die auf dem Atari nicht (oder in anderer Weise) +übernommen wurden. +
  +
Achtung: Bei Druckertreibern, und speziell bei den Atari +Seitendruckern gibt es einige Besonderheiten zu beachten. +
  +
Ergebnis: Die Funktion liefert kein direktes Funktionsergebnis. +
  +
Verfügbar: Available only with some form of GDOS. +
  +
Gruppe: Kontrollfunktionen +
  +
Querverweis: Binding   GDOS   v_clswk   v_opnvwk +
  + +
+ +

7.10.33 Bindings für v_opnwk

+ + + + + + + + + + + + +
C: void v_opnwk ( int16_t *work_in, int16_t *handle, int16_t +*work_out ); +
  +
Umsetzung: +
  +
void v_opnwk (int16_t *work_in, int16_t *handle,
+              int16_t *work_out)
+{
+   intin[0..15] = work_in[0..15];
+
+   contrl[0] = 1;
+   contrl[1] = 0;
+   contrl[3] = 16;
+   contrl[6] = 0;
+
+   vdi ();
+
+   *handle = contrl[6];
+   work_out[0..44]  = intout[0..44];
+   work_out[45..56] = ptsout[0..11];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]1 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]6 # Einträge in ptsout
contrl+6contrl[3]16 # Einträge in intin
contrl+8contrl[4]45 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0..15]work_in[0..15]
intoutintout[0..44]work_out[0..44]
ptsoutptsout[0..11]work_out[45..56]
+
+ + +
Hinweis: Das angegebene Binding gilt für den Einsatz +unter NVDI. Bei Druckertreibern gilt es einige Besonderheiten zu +beachten; zunächst kann bei Matrix-Druckern die maximale +Auflösung angegeben werden. Dies geht wie folgt: +
  + + + + + + + + + +
ptsin[0] = maximale Auflösung in x-Richtung +
ptsin[1] = maximale Auflösung in y-Richtung +
contrl[1] = 1 + +
+ +
Darüber hinaus kann für die Atari-Seitendrucker die +Adresse des internen Puffers ermittelt werden: +
  + + + + + + +
contrl[0] = High-Word +
contrl[1] = Low-Word der Pufferadresse + +
+ +
Querverweis: v_opnwk   GDOS   GDOS-Treiber +
  + +
+ +

7.10.34 Änderungen in PC-GEM

+

Ab PC-GEM/3 wurde das work_in-Feld bei v_opnwk erweitert, um +noch zur Laufzeit einige Einstellungen für den Treiber vornehmen zu +können. Die folgenden Informationen sind jedoch nicht +kompatibel zum Atari-GEM bzw. zu NVDI. Es gilt: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Element Bedeutung +
    +
work_in[11] Im niederwertigen Byte wird die Ausgabe genauer spezifiziert. +Es gilt: + + + + + + + + + + + + + + + +
0 = Datei +
1 = serieller Port +
2 = paralleler Port +
3 = gerätespezifisch (direkt) +
255 = Default-Schnittstelle + +
+ +
Im höherwertigen Byte wird die Seitengröße angegeben. Es +gilt: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
0 = Letter Size ( 8.50 * 11.00 Zoll) +
5 = Half Size ( 8.50 * 5.50 Zoll) +
10 = B5 Size (18.20 * 25.00 cm) +
20 = Letter Size ( 8.50 * 11.00 Zoll) +
30 = A4 Size (21.00 * 29.70 cm) +
40 = Legal Size ( 8.50 * 14.00 Zoll) +
50 = Double Size (11.00 * 17.00 Zoll) +
55 = Broad Sheet (14.00 * 11.00 Zoll) +
255 = Benutzerspezifiziert (work_in[101,102]) + +
+ +
work_in[12] Ausgabeport bzw. Dateiname +
...   +
...   +
work_in[100]   +
work_in[101] Seitenbreite in 1/100 Zoll +
work_in[102] Seitenhöhe in 1/100 Zoll +
work_out[14] Hat den Wert 11, wenn Escapement-Text verfügbar ist. +
work_out[24] Hat den Wert 11, wenn Escapement-Text der einzig verfügbare +Text auf dem Ausgabegerät ist, und anderenfalls den Wert 10. +
work_out[44] Ein Wert von -1 bedeutet, daß das Ausgabegerät im Querformat +ausgeben kann, ohne daß die Applikation selbst die Grafik drehen +muss. Das OUTPUT-Programm von PC-GEM übernimmt das Drehen +allerdings selbst, da diese Möglichkeit in älteren GEM-Versionen +noch nicht zur Verfügung stand. + +
+ +

Hinweis: Besitzt work_in[11] den Wert 1 oder 2, so muß +work_in[12] auf die Port-Nummer gestellt werden (LPT1 = 0, LPT2 = 1, +COM1 = 0, etc.). Besitzt work_in[11] hingegen den Wert 0, so muß sich +ab work_in[12] der Name der Datei befinden, in die geschrieben werden +soll; dieser wird Zeichen für Zeichen (16-Bit-Worte !) geschrieben, +und muss mit dem Wert Null enden. +

+

Querverweis: Kontrollfunktionen   v_opnwk +

+

7.10.35 v_pat_rotate

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pattern rotation« +
  +
VDI-Nummer: 134 +
  +
Deklaration: void v_pat_rotate( int16_t handle, int16_t angle) +
  +
Beschreibung: This call specifies pattern rotation angle. It is implemented +only in printer drivers and is restricted to multiples of 90 degree. +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation. +
angle Angle in tenths of a degree + +
+ +
Ergebnis: Die Funktionliefert keine Ergebnis. +
  +
Verfügbar: GEM/3 Releas 3.1 +
  +
Gruppe: Kontrollfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.10.36 Bindings für v_pat_rotate

+ + + + + + + + + +
C: void v_pat_rotate( int16_t handle, int16_t angle ); +
  +
Umsetzung: +
  +
void v_pat_rotate( int16_t handle, int16_t angle )
+{
+   intin[0] = angle;
+
+   contrl[0] = 134;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]134 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]angle
+
+ + +
+ +

7.10.37 v_resize_bm

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Resize Bitmap« - Größe einer Offscreenbitmap verändern +
  +
VDI-Nummer: 100 (Unterfunktion 2) +
  +
Deklaration: int16_t v_resize_bm( int16_t handle, int16_t width, int16_t +height, int32_t byte_width, uint16_t *addr ); +
  +
Beschreibung: Mit dieser Funktion kann die Größe einer Offscreenbitmap +verändert werden. RESIZE BITMAP kann auch ein eigener Speicherbereich +übergeben werden, für den dann folgende Punkte eingehalten werden +müssen: +
  +
Der Speicherbereich muß auf einer 16-Byte-Grenze beginnen +
  +
Vor und hinter dem Speicherbereich müssen mindestens 16 Bytes +frei sein, die dem Aufrufer gehören, da einige Grafikfunktionen +abhängig vom Ausgabebereich einige Bytes vor oder der hinter der +Bitmap lesen und evtl. sogar beschreiben (dabei ändert sich dann +allerdings nicht der Inhalt dieser Speicherbereiche; es werden dann +nur maskierte Daten unverändert zurückgeschrieben). +
  +
Wer das nicht beachtet, wird u.U. mit Speicherschießern +gesegnet. Wir empfehlen daher die Speicheranforderung NVDI zu +überlassen! +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Handle von v_opnbm oder v_open_bm. +
width neue Breite in Pixeln +
height neue Höhe in Pixeln +
byte_width Breite einer Zeile in Bytes (nur wenn addr gültig ist) +
addr Zeiger auf eigenen Speicherbereich oder 0L + +
+ +
Ergebnis: Wenn das Funktionsresultat 0 ist, konnte die neue Bitmap nicht +aufgebaut werden. Da die alte Bitmap in diesem Fall bereits +freigegeben worden ist, kann versucht werden, eine kleinere Bitmap +anzulegen, oder die Bitmap muß; mit v_clsbm geschlossen werden. +
  +
Verfügbar: ab EdDI-Version 1.20 +
  +
Gruppe: Kontrollfunktionen +
  +
Querverweis: Binding   NVDI   Off-Screen-Bitmaps +
  + +
+ +

7.10.38 Bindings für v_resize_bm

+ + + + + + + + + +
C: int16_t v_resize_bm( int16_t handle, int16_t width, int16_t +height, int32_t byte_width, uint16_t *addr ); +
  +
Umsetzung: +
  +
int16_t v_resize_bm( int16_t handle, int16_t width,
+                     int16_t height, int32_t byte_width,
+                     uint16_t *addr )
+{
+   intin[0] = width;
+   intin[1] = height;
+   intin[2..3] = byte_width;
+   intin[4..5] = addr;
+
+   contrl[0] = 100;
+   contrl[1] = 0;
+   contrl[3] = 6;
+   contrl[5] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]100 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]6 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]2 # Unterfunktion
contrl+12contrl[6]handle
intinintin[0]width
intin+2intin[1]height
intin+4intin[2..3]byte_width
intin+8intin[4..5]addr
intoutintout[0]Return-Wert
+
+ + +
+ +

7.10.39 v_savecache

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Save Outline cache to disk« - speichert den Inhalt des +Vektorzeichen-Caches. +
  +
VDI-Nummer: 249 +
  +
Deklaration: int16_t v_savecache ( int16_t handle, int8_t *filename ); +
  +
Beschreibung: Die Funktion speichert den Inhalt des Vektorzeichen-Caches in +einer Datei ab. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
filename Name der Datei + +
+ +
Hinweis: Die Datei wird im aktuellen Verzeichnis +abgelegt. +
  +
Ergebnis: Die Funktion liefert im Fehlerfall den Wert -1, anderenfalls +den Wert 0. +
  +
Verfügbar: FSMGDOS, ab SpeedoGDOS 4.00 +
  +
Gruppe: Kontrollfunktionen +
  +
Querverweis: Binding   v_flushcache   v_loadcache   vqt_cachesize +
  + +
+ +

7.10.40 Bindings für v_savecache

+ + + + + + + + + +
C: int16_t v_savecache ( int16_t handle, int8_t *filename ); +
  +
Umsetzung: +
  +
int16_t v_savecache ( int16_t handle, int8_t *filename )
+{
+   intin[0..n] = filename;      /* In 16-Bit Worte */
+
+   contrl[0] = 249;
+   contrl[1] = 0;
+   contrl[3] = n;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]249 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]n # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0..n]filename
intoutintout[0]Return-Wert
+
+ + +
+ +

7.10.41 v_save_cache

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Save Outline cache to disk« - speichert den Inhalt des +Vektorzeichen-Caches. +
  +
VDI-Nummer: 226 (Subcode 6) +
  +
Deklaration: int16_t v_save_cache ( int16_t handle, int8_t *filename ); +
  +
Beschreibung: Die Funktion speichert den Inhalt des Vektorzeichen-Caches in +einer Datei ab. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
filename Name der Datei + +
+ +
Hinweis: Die Datei wird im aktuellen Verzeichnis +abgelegt. +
  +
Ergebnis: Die Funktion liefert im Fehlerfall den Wert -1, anderenfalls +den Wert 0. +
  +
Verfügbar: Ab SpeedoGDOS 5.1 +
  +
Gruppe: Kontrollfunktionen +
  +
Querverweis: Binding   v_flushcache   v_loadcache   v_savecache   +vqt_cachesize +
  + +
+ +

7.10.42 Bindings für v_save_cache

+ + + + + + + + + +
C: int16_t v_save_cache ( int16_t handle, int8_t *filename ); +
  +
Umsetzung: +
  +
int16_t v_save_cache ( int16_t handle, int8_t *filename )
+{
+   intin[0..n] = filename;      /* In 16-Bit Worte */
+
+   contrl[0] = 226;
+   contrl[1] = 0;
+   contrl[3] = n;
+   contrl[5] = 6;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]226 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]n # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]6 # Sub-Opcode
contrl+12contrl[6]handle
intinintin[0..n]filename
intoutintout[0]Return-Wert
+
+ + +
+ +

7.10.43 v_set_app_buff

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Reserve Bezier workspace« - Speicher für +Bezier-Spline-Erzeugung reservieren. +
  +
VDI-Nummer: -1 +
  +
Deklaration: void v_set_app_buff ( int16_t handle, int16_t **address, +int16_t nparagraphs ); +
  +
Beschreibung: Die Funktion legt den Puffer für die Bezier-Spline Erzeugung +fest. Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
adress Adresse des Puffers +
nparagraphs Größe des Puffers in 16-Byte Blöcken + +
+ +
Hinweis: Werden Bezier-Funktionen aufgerufen, so werden +in diesem Puffer die Spline-Daten abgelegt. Vor Programmende sollte +man mit dieser Funktion einen Null-Zeiger als Puffer mit Größe 0 +setzen. +
  +
Wenn diese Funktion von der Applikation nicht aufgerufen wird, +legt GDOS einen eigenen Puffer von ca. 8 Kbyte an. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: FONTGDOS, FSMGDOS, ab GEM/3 Release 3.1, ab SpeedoGDOS 4.00 und +ab NVDI 2.10. Die Funktion taucht in der Doku (Papierform) zu NVDI +2.10 auf. Bei allen restlichen Beschreibungen nicht mehr. +
  +
Gruppe: Kontrollfunktionen +
  +
Querverweis: Binding   v_bez_on   v_bez_off   v_bez   v_bez_fill   v_bez_qualGDOS   SpeedoGDOS +
  + +
+ +

7.10.44 Bindings für v_set_app_buff

+ + + + + + + + + +
C: void v_set_app_buff ( int16_t handle, int16_t **address, +int16_t nparagraphs ); +
  +
Umsetzung: +
  +
void v_set_app_buff ( int16_t handle, int16_t **address,
+                      int16_t nparagraphs )
+{
+   intin[0..1] = address;
+   intin[2] = nparagraphs;
+
+   contrl[0] = -1;
+   contrl[1] = 0;
+   contrl[3] = 3;
+   contrl[5] = 6;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]-1 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]3 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]6 # Unterfunktion
contrl+12contrl[6]handle
intinintin[0..1]address
intin+4intin[2]nparagraphs
+
+ + +
+ +

7.10.45 v_updwk

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Update Workstation« - gepufferte Ausgabekommandos ausführen +
  +
VDI-Nummer: 4 +
  +
Deklaration: void v_updwk ( int16_t handle ); +
  +
Beschreibung: Die Funktion veranlaßt das Ausgabegerät mit der Kennung +handle, alle gepufferten Kommandos auszuführen. +
  +
Hinweis: Auf dem Bildschirm oder bei Offscreen-Bitmaps +wird diese Funktion nicht benötigt, da hier alle Grafikkommandos +sofort ausgeführt werden. Bei einem Drucker wird kein Seitenvorschub +ausgeführt, bei einem Metafile wird nur der Opcode in den Puffer +geschrieben. +
  +
Vor der Druckausgabe sollte die Funktion übrigens einmalig +aufgerufen werden, um den Drucker zu initialisieren. Einige +Besonderheiten gibt es bei Druckertreibern und speziell den +Atari-SLM-Laserdruckern zu beachten. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all printer, metafile, plotter, and camera devices +when using any form of GDOS. +
  +
Gruppe: Kontrollfunktionen +
  +
Querverweis: Binding   v_opnwk   v_output_window +
  + +
+ +

7.10.46 Bindings für v_updwk

+ + + + + + + + + + + + +
C: void v_updwk ( int16_t handle ); +
  +
Umsetzung: +
  +
void v_updwk (int16_t handle)
+{
+   contrl[0] = 4;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]4 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
+
+ + +
Hinweis: Bei Druckertreibern kann statt der aktuellen +Seite auch ein eigener Puffer ausgegeben werden. Dies geht wie +folgt: +
  +
intin[0]  = High-Word
+intin[1]  = Low-Word der Pufferadresse
+contrl[0] = 4;
+contrl[1] = 1; /* Puffer nicht löschen */
+contrl[3] = 2;
+contrl[6] = handle;
+vdi ();
+
+
Bei Laserdruckern der Atari-SLM-Reihe läßt sich darüber +hinaus der Status des Ausgabegerätes ermitteln. Es gilt: +
  + + + + + + + + + + + + + + + + + + +
intout[0] Bedeutung +
    +
0 kein Fehler. +
2 Drucker nicht bereit. +
3 Toner leer. +
5 kein Papier vorhanden. + +
+ +
Querverweis: v_updwk   Kontrollfunktionen   GDOS   GDOS-Treiber +
  + +
+ +

7.10.47 vs_clip

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set clipping Rectangle« - setzt Begrenzungsrechteck. +
  +
VDI-Nummer: 129 +
  +
Deklaration: void vs_clip ( int16_t handle, int16_t clip_flag, int16_t +*pxyarray ); +
  +
Beschreibung: Die Funktion begrenzt alle grafischen Ausgaben auf einen +bestimmten Bereich. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
clip_flag + + + + + + +
0 = Clipping ausschalten +
1 = Clipping einschalten + +
+ +
pxyarray[0] x-Koordinate +
pxyarray[1] y-Koordinate des Eckpunktes +
pxyarray[2] x-Koordinate +
pxyarray[3] y-Koordinate der diagonal gegenüberliegenden Ecke + +
+ +
Hinweis: Das Clipping sollte aus Sicherheitsgründen immer +eingeschaltet werden, da die Ausgaberoutinen beim Überschreiten der +Bildschirmgrenzen sehr schnell große Speicherbereiche überschreiben, +was zu unerfreulichen Abtürzen und Datenmüll führen kann. +
  +
Wenn der Arbeitsbereich den ganzen Bildschirm einbeziehen soll, +ist es ratsam, bei vs_clip() die bei v_opnvwk() erhaltenen +Bildschirmausmaße einzustellen. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all drivers. +
  +
Gruppe: Kontrollfunktionen +
  +
Querverweis: Binding   Clipping +
  + +
+ +

7.10.48 Bindings für vs_clip

+ + + + + + + + + +
C: void vs_clip ( int16_t handle, int16_t clip_flag, int16_t +*pxyarray ); +
  +
Umsetzung: +
  +
void vs_clip (int16_t handle, int16_t clip_flag,
+              int16_t *pxyarray)
+{
+   intin[0] = clip_flag;
+   ptsin[0..3] = pxyarray[0..3];
+
+   contrl[0] = 129;
+   contrl[1] = 2;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]129 # Opcode der Funktion
contrl+2contrl[1]2 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]clip_flag
ptsinptsin[0..3]pxyarray[0..3]
+
+ + +
+ +

7.10.49 vst_ex_load_fonts

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Load Fonts« - Zeichensätze laden +
  +
VDI-Nummer: 119 +
  +
Deklaration: int16_t vst_ex_load_fonts ( int16_t handle, int16_t select, +int16_t font_max, int16_t font_free ); +
  +
Beschreibung: This function is an extension of the existing vst_load_fonts +call, with two additional input arguments to provide control over font +paging memory. The current defaults in units of paragraphs are: +
  +
                  font_max     font_free
+for screens:     5120 (80K)         0
+for printers:      32767       640 (10K)
+
+
The GDOS attempts to allocate font_max paragraphs or all +of available menory (whichever is smaller) less font_free +paragraphs, and use this amount for font paging. +
  +
Depending on your needs, you can use either version of this +call. Note that both version use the same opcode. +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
select reserviert, sollte 0 sein +
font_max Maximum number of paragraphs to allocate +
font_free Minimum number of paragraphs to leave free + +
+ +
Ergebnis: Als Ergebnis erhält man die Anzahl der geladenen +Zeichensätze. +
  +
Verfügbar: GEM/3 Release 3.1 +
  +
Gruppe: Kontrollfunktionen +
  +
Querverweis: Binding   vst_unload_fonts   vst_font   vqt_name   ASSIGN.SYS-Datei   +GDOS +
  + +
+ +

7.10.50 Bindings für vst_ex_load_fonts

+ + + + + + + + + +
C: int16_t vst_ex_load_fonts ( int16_t handle, int16_t select, +int16_t font_max, int16_t font_free ); +
  +
Umsetzung: +
  +
int16_t vst_ex_load_fonts ( int16_t handle, int16_t select,
+                            int16_t font_max,
+                            int16_t font_free )
+{
+   intin[0] = select;
+   intin[1] = font_max;
+   intin[2] = font_free;
+
+   contrl[0] = 119;
+   contrl[1] = 0;
+   contrl[3] = 3;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]119 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]3 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]select
intin+2intin[1]font_max
intin+4intin[2]font_free
intoutintout[0]Return-Wert
+
+ + +
+ +

7.10.51 vst_load_fonts

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Load Fonts« - Zeichensätze laden +
  +
VDI-Nummer: 119 +
  +
Deklaration: int16_t vst_load_fonts ( int16_t handle, int16_t select ); +
  +
Beschreibung: Die Funktion lädt eine Reihe weiterer Zeichensätze für die +Workstation mit der Kennung handle, die in der ASSIGN.SYS +Datei angegeben sein muss. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
select reserviert, sollte 0 sein + +
+ +
Hinweis: Diese Funktion darf nur aufgerufen werden, +falls ein GDOS installiert ist. +
  +
Ergebnis: Als Ergebnis erhält man die Anzahl der geladenen +Zeichensätze. +
  +
Verfügbar: Available with any form of GDOS. +
  +
Gruppe: Kontrollfunktionen +
  +
Querverweis: Binding   vst_unload_fonts   vst_font   vqt_name   ASSIGN.SYS-Datei   +GDOS +
  + +
+ +

7.10.52 Bindings für vst_load_fonts

+ + + + + + + + + +
C: int16_t vst_load_fonts ( int16_t handle, int16_t select ); +
  +
Umsetzung: +
  +
int16_t vst_load_fonts (int16_t handle, int16_t select)
+{
+   intin[0] = select;
+
+   contrl[0] = 119;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]119 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]select
intoutintout[0]Return-Wert
+
+ + +
+ +

7.10.53 vst_unload_fonts

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Unload Fonts« - löscht geladene Zeichensätze +
  +
VDI-Nummer: 120 +
  +
Deklaration: void vst_unload_fonts ( int16_t handle, int16_t select ); +
  +
Beschreibung: Die Funktion entfernt alle Zeichensätze, die vorher durch +einen vst_load_fonts Aufruf geladen worden sind. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
select reserviert, sollte 0 sein + +
+ +
Hinweis: System- und Vektorzeichensätze bleiben von +dieser Funktion unberührt. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Available with any form of GDOS. +
  +
Gruppe: Kontrollfunktionen +
  +
Querverweis: Binding   GDOS   vst_load_fonts +
  + +
+ +

7.10.54 Bindings für vst_unload_fonts

+ + + + + + + + + +
C: void vst_unload_fonts ( int16_t handle, int16_t select ); +
  +
Umsetzung: +
  +
void vst_unload_fonts (int16_t handle, int16_t select)
+{
+   intin[0] = select;
+
+   contrl[0] = 120;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]120 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]select
+
+ + +
+ +
+ +Home +VDIVDI +FarbtabellenfunktionenFarbtabellenfunktionen +RasterfunktionenRasterfunktionen + + diff --git a/de/vdi_escape.html b/de/vdi_escape.html new file mode 100644 index 000000000..42472d87d --- /dev/null +++ b/de/vdi_escape.html @@ -0,0 +1,14629 @@ + + + + + +Die Anleitung zum TOS: Escapefunktionen + + + + + + + + + +Home +VDIVDI +EingabefunktionenEingabefunktionen +FarbtabellenfunktionenFarbtabellenfunktionen + +
+ +

7.8 Escapefunktionen

+

Diese Bibliothek enthält Funktionen, um spezielle Eigenschaften +eines Grafikgerätes gezielt auszunutzen. Zu diesem Zweck stehen die +folgenden Funktionsgruppen zur Verfügung: +

+ + +

Querverweis: Workstations des VDI   Style-Guidelines +

+

7.8.1 Grafikspezial-Funktionen

+

Diese Bibliothek enthält Funktionen um Informationen auf einem +Drucker auszugeben, zur Steuerung der Farbkalibration uvm. Insgesamt +stehen die folgenden Routinen zur Verfügung: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
v_bit_image Bildinformationen auf Drucker ausgeben. +
v_clear_disp_list Druckpuffer löschen. +
v_copies Anzahl der Kopien festlegen. +
v_dspcur Grafikcursor versetzen. +
v_form_adv Seitenvorschub auf Drucker durchführen. +
v_hardcopy Hardcopy auf Drucker ausgeben. +
v_orient Ausgabeformat einstellen. +
v_output_window Bildschirmbereich auf Drucker ausgeben. +
v_page_size Seitenformat festlegen. +
v_rmcur Letzten Grafikcursor löschen. +
v_tray Schacht für Papiereinzug/ausgabe wählen. +
v_xbit_image Bildinformationen auf Drucker ausgeben. +
vq_bit_image Informationen über v_bit_image ermitteln. +
vq_calibrate Farbkalibrierung testen. +
vq_driver_info Informationen über einen Druckertreiber ermitteln. +
vq_driver_name Gets name of a driver. +
vq_image_type Typ einer Bitmap-Datei ermitteln. +
vq_margins Druckerränder erfragen. +
vq_page_name Name und Größe eines Seitenformats ermitteln. +
vq_prn_scaling Skalierung des Druckertreibers ermitteln +
vq_scan Druckerparameter ermitteln. +
vq_tabstatus Verfügbarkeit eines Grafiktabletts, Maus, usw. abfragen. +
vq_tray_names Namen von Papiereinzug/auswurf ermitteln. +
vs_calibrate Farbkalibration setzen. +
vs_crop Sets cropping rectangle on a document. +
vs_document_info Dokumentangaben für Druckmonitor setzen +
vs_load_disp_list Druckpuffer laden. +
vs_page_info Sets document specifications for print monitor +
vs_palette Auswahl der Farbpalette. +
vs_save_disp_list Druckpuffer speichern. + +
+ +

Querverweis: Workstations des VDI   Style-Guidelines +

+

7.8.1.1 vq_bit_image

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire v_bit_image info« - Informationen über v_bit_image +ermitteln. +
  +
VDI-Nummer: 5 (Escape 2102) +
  +
Deklaration: int16_t vq_bit_image( int16_t handle, int16_t *ver, int16_t +*maximg, int16_t *form ); +
  +
Beschreibung: Die Funktion ermittelt die v_bit_image-Versionsnummer und +unterstützte Dateiformate. Es gilt: +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
ver Versionsnummer des v_bit_image +
maximg Maximale Anzahl der Bilder pro Seite +
form Unterstützte Formaten + + + + + + + + + +
Bit 0 & 1: + + + + + + + + + + + + +
00: Monochrom IMG +
01: Reserviert +
10: Reserviert +
11: Reserviert + +
+ +
Bit 2 & 3: + + + + + + + + + + + + +
00: Unbekannte TGA +
01: TGA, Bildtyp 2 unkomprimiert +
10: Reserviert +
11: Reserviert + +
+ +
Bit 4..15: Reserviert + +
+ + +
+ +
Ergebnis: 0: Funktion existiert nicht +
  +
Verfügbar: Treiber von Thierry Rodolfo +
  +
Gruppe: Grafikspezial-Funktionen +
  +
Querverweis: Binding v_bit_image vq_driver_info vq_image_type +
  + +
+ +

7.8.1.2 Bindings für vq_bit_image

+ + + + + + + + + +
C: int16_t vq_bit_image( int16_t handle, int16_t *ver, int16_t +*maximg, int16_t *form ); +
  +
Umsetzung: +
  +
int16_t  vq_bit_image( int16_t handle, int16_t *ver,
+                  int16_t *maximg, int16_t *form )
+{
+   intout[0] = 0;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 2102;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *ver    = intout[1];
+   *maximg = intout[2];
+   *form   = intout[3];
+
+  return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]4 # Einträge in intout
contrl+10contrl[5]2102 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intoutintout[0]Return-Wert
intout+2intout[1]ver
intout+4intout[2]maximg
intout+6intout[3]form
+
+ + +
+ +

7.8.1.3 vq_calibrate

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire calibration« - Farbkalibration testen. +
  +
VDI-Nummer: 5 (Escape 77) +
  +
Deklaration: int16_t vq_calibrate ( int16_t handle, int16_t *flag ); +
  +
Beschreibung: Die Funktion überprüft, ob Funktionen zur Kalibrierung +vorhanden sind, und ob diese eingeschaltet ist. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
flag Kalibration + + + + + + +
0 = ausgeschaltet +
1 = eingeschaltet + +
+ + +
+ +
Hinweis zu TC-VDI: Syntax is vq_calibrate(handle) and +the function returns intout[0] instead of contrl[4] which is always +set to 1. +
  +
Ergebnis: Die Funktion liefert den Wert 1, wenn Funktionen zur +Kalibrierung vorhanden sind, anderenfalls den Wert 0. +
  +
Verfügbar: NVDI (depends on the driver), MATRIX TC-VDI +
  +
Gruppe: Grafikspezial-Funktionen +
  +
Querverweis: Binding   vs_calibrate +
  + +
+ +

7.8.1.4 Bindings für vq_calibrate

+ + + + + + + + + +
C: int16_t vq_calibrate ( int16_t handle, int16_t *flag ); +
  +
Umsetzung: +
  +
int16_t vq_calibrate (int16_t handle, int16_t *flag)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 77;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *flag = intout[0];
+   return (  contrl[4] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]n # Einträge in intout
contrl+10contrl[5]77 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intoutintout[0]flag
+
+ +
Hinweis: n gibt die Anzahl der Einträge im intout-Feld +an. Falls contrl[4] den Wert 0 enthält, wird eine Kalibrierung +nicht unterstützt. +
  + +
+ +

7.8.1.5 vq_driver_info

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Driver Info« - ermittelt Informationen über einen +Druckertreiber. +
  +
VDI-Nummer: 5 (Escape 2101) +
  +
Deklaration: int16_t vq_driver_info ( int16_t handle, int16_t *lib, int16_t +*drv, int16_t *plane, int16_t *attr, int8_t *name ); +
  +
Beschreibung: Die Funktion ermittelt Informationen über einen +Druckertreiber. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
lib Versionsnummer der Bibliothek +
drv Versionsnummer der Treiber +
plane Anzahl der Planes +
+
+ + + + + + + + + + + + + + + +
1-Monochrom
3-CMY
4-CMYK
+
+ +
attr Attribute + + + + + + + + + + + + + + + + + + +
Bit 0: Vierfarbdruck wird unterstützt +
Bit 1: Negative wird unterstützt +
Bit 2: Mirror wird unterstützt +
Bit 3 & 4: Multiple copies +
+
+ + + + + + + + + + + + + + + + + + + + +
1-No
2-Hardware
3-Software
4-Reserviert
+
+ +
Bit 5: Landscape wird unterstützt +
Bit 6..15: Reserviert + +
+ +
name Name der Treiber als maximal 27 Zeichen lange Zeichenkette (26 ++ NULL) + +
+ +
Hinweis: This function allows to determine if the new +vq_margin and vq_bit_image functions (Escape >= 2100) are +available. +
  +
Ergebnis: 0: Funktion existiert nicht. +
  +
Verfügbar: Treiber von Thierry Rodolfo +
  +
Gruppe: Grafikspezial-Funktionen +
  +
Querverweis: Binding   vq_margin   vq_bit_image +
  + +
+ +

7.8.1.6 Bindings für vq_driver_info

+ + + + + + + + + +
C: int16_t vq_driver_info ( int16_t handle, int16_t *lib, int16_t +*drv, int16_t *plane, int16_t *attr, int8_t *name ); +
  +
Umsetzung: +
  +
int16_t vq_driver_info (int16_t handle, int16_t *lib, int16_t *drv,
+                  int16_t *plane, int16_t *attr, int8_t *name)
+{
+   int16_t tmp;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 2101;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *lib   = intout[1];
+   *drv   = intout[2];
+   *plane = intout[3];
+   *attr  = intout[4];
+   for (tmp = 0; tmp < 26; tmp++)
+     name[tmp] = intout[tmp+5];
+   name[26] = 0;
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]32 # Einträge in intout
contrl+10contrl[5]2101 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intoutintout[0]Return-Wert
intout+2intout[1]lib
intout+4intout[2]drv
intout+6intout[3]plane
intout+8intout[4]attr
intout+10intout[5..31]name[0..26]
+
+ + +
+ +

7.8.1.7 vq_driver_name

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Driver Name« - ermittelt den Namen eines Treiber. +
  +
VDI-Nummer: 5 (Escape 2108) +
  +
Deklaration: int16_t vq_driver_name ( int16_t handle, int8_t *name ); +
  +
Beschreibung: Die Funktion ermittelt den Namen eines Treiber. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
name Name der Treiber als maximal 27 Zeichen lange Zeichenkette (26 ++ NULL) + +
+ +
Ergebnis: 0: Funktion existiert nicht. +
  +
Verfügbar: Treiber von Thierry Rodolfo +
  +
Gruppe: Grafikspezial-Funktionen +
  +
Querverweis: Binding   vq_driver_info +
  + +
+ +

7.8.1.8 Bindings für vq_driver_name

+ + + + + + + + + +
C: int16_t vq_driver_name ( int16_t handle, int8_t *name ); +
  +
Umsetzung: +
  +
int16_t vq_driver_name (int16_t handle, int8_t *name)
+{
+   int16_t tmp;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 2108;
+   contrl[6] = handle;
+
+   vdi ();
+
+   for (tmp = 0; tmp < 26; tmp++)
+     name[tmp] = intout[tmp];
+   name[26] = 0;
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]27 # Einträge in intout
contrl+10contrl[5]2108 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intoutintout[0..26]name
+
+ + +
+ +

7.8.1.9 vq_image_type

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Image Type« - Typ einer Bitmap-Datei ermitteln. +
  +
VDI-Nummer: 5 (Escape 2105) +
  +
Deklaration: int16_t vq_image_type ( int16_t handle, int8_t *filename, +BIT_IMAGE *image ) +
  +
Beschreibung: The call vq_image_type obtains the image type of the file whose +full pathname is specified by filename, and writes information +into the structure pointed to by image if its type is +supported by v_bit_image. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
filename Zeiger auf Datei-Namen +
image Zeiger auf BIT_IMAGE-Struktur + +
+ +
Note: Currently the returned type is based on the file +extension. +
  +
Ergebnis: Die Funktion kann folgende Rückgabewerte liefern: +
  + + + + + + + + + +
0 : Unbekannt +
1 : IMG +
2 : TGA + +
+ +
Verfügbar: Treiber von Thierry Rodolfo. +
  +
Gruppe: Grafikspezial-Funktionen +
  +
Querverweis: Binding   v_bit_image   vq_bit_image   vq_driver_info +
  + +
+ +

7.8.1.10 Bindings für vq_image_type

+ + + + + + + + + +
C: int16_t vq_image_type ( int16_t handle, int8_t *filename, +BIT_IMAGE *image ) +
  +
Umsetzung: +
  +
int16_t vq_image_type ( int16_t handle,
+   int8_t *filename, BIT_IMAGE *image )
+{
+   int16_t tmp;
+
+   ptsin[0..1] = image;
+
+   tmp = 0;
+   while (intin[tmp++] = *filename++)
+      ;
+   intin[tmp++] = 0;
+
+   contrl[0] = 5;
+   contrl[1] = 1;
+   contrl[3] = tmp;
+   contrl[5] = 2105;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[1] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]1 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]n+1 # Einträge in intin
contrl+8contrl[4]2 # Einträge in intout
contrl+10contrl[5]2105 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intinintin[0..n]filename with NULL-byte
ptsinptsin[0..1]image
intoutintout[0]Verfügbar
intout+2intout[1]Return-Wert
+
+ +
Hinweis: Falls intout[0] den Wert 0 enthält, steht die +Funktion nicht zur Verfügung. +
  + +
+ +

7.8.1.11 vq_margins

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Printer Margins« - Druckerränder erfragen. +
  +
VDI-Nummer: 5 (Escape 2100) +
  +
Deklaration: int16_t vq_margins( int16_t handle, int16_t *top_margin, +int16_t *bottom_margin, int16_t *left_margin, int16_t *right_margin, +int16_t *hdpi, int16_t *vdpi ); +
  +
Beschreibung: Die Funktion ermittelt die Druckerränder. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
top_margin oberer Rand in Pixeln +
bottom_margin unterer Rand in Pixeln +
left_margin linker Rand in Pixeln +
right_margin rechter Rand in Pixeln +
hdpi horizontale dpi-Auflösung +
vdpi vertikale dpi-Auflösung + +
+ +
Ergebnis: 0: Funktion existiert nicht +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Grafikspezial-Funktionen +
  +
Querverweis: Binding +
  + +
+ +

7.8.1.12 Bindings für vq_margins

+ + + + + + + + + +
C: int16_t vq_margins( int16_t handle, int16_t *top_margin, +int16_t *bottom_margin, int16_t *left_margin, int16_t *right_margin, +int16_t *hdpi, int16_t *vdpi ); +
  +
Umsetzung: +
  +
int16_t  vq_margins( int16_t handle, int16_t *top_margin,
+                  int16_t *bottom_margin, int16_t *left_margin,
+                  int16_t *right_margin, int16_t *hdpi,
+                  int16_t *vdpi )
+{
+   intout[0] = 0;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 2100;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *top_margin    = intout[1];
+   *bottom_margin = intout[2];
+   *left_margin   = intout[3];
+   *right_margin  = intout[4];
+   *hdpi          = intout[5];
+   *vdpi          = intout[6];
+
+  return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]7 # Einträge in intout
contrl+10contrl[5]2100 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intoutintout[0]Return-Wert
intout+2intout[1]top_margin
intout+4intout[2]bottom_margin
intout+6intout[3]left_margin
intout+8intout[4]right_margin
intout+10intout[5]hdpi
intout+12intout[6]vdpi
+
+ + +
+ +

7.8.1.13 vq_page_name

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Page Name« - Namen und Größe eines Seitenformats +ermitteln. +
  +
VDI-Nummer: 5 (Escape 38) +
  +
Deklaration: int16_t vq_page_name ( int16_t handle, int16_t page_id, int8_t +*page_name, int32_t *page_width, int32_t *page_height ) +
  +
Beschreibung: Die Funktion ermittelt den Namen und die physikalische Größes +eines Seitenformates. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
page_id Papierformat +
page_name Zeiger auf Papiernamen oder NULL +
page_width Papierbreite in 1/1000mm +
page_height Papierhöhe in 1/1000mm + +
+ +
Hinweis: Die Angaben der Papiergröße umfassen dabei +auch die nicht bedruckbaren Ränder. +
  +
Ergebnis: Die Funktion liefert das aktuelle Papierformat zurück. Ein +Wert von -1 bedeutet, daß das angegebene Seitenformat dem Treiber +nicht bekannt ist; in diesem Fall werden keine Werte in +page_width bzw. page_height zurückgeliefert. +
  +
Verfügbar: Die Funktion ist nur vorhanden, falls contrl[4] einen Wert +ungleich 0 enthält. +
  +
Gruppe: Grafikspezial-Funktionen +
  +
Querverweis: Binding   v_opnwk   vq_extnd +
  + +
+ +

7.8.1.14 Bindings für vq_page_name

+ + + + + + + + + +
C: int16_t vq_page_name ( int16_t handle, int16_t page_id, int8_t +*page_name, int32_t *page_width, int32_t *page_height ) +
  +
Umsetzung: +
  +
int16_t vq_page_name ( int16_t handle, int16_t page_id,
+   int8_t *page_name, int32_t *page_width,
+   int32_t *page_height )
+{
+   intin[0] = page_id;
+   intin[1..2] = page_name;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 3;
+   contrl[5] = 38;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *page_width  = intout[1..2];
+   *page_height = intout[3..4];
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]3 # Einträge in intin
contrl+8contrl[4]5 # Einträge in intout
contrl+10contrl[5]38 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intinintin[0]page_id
intin+2intin[1..2]page_name
intoutintout[0]Return-Wert
intout+2intout[1..2]page_width
intout+6intout[3..4]page_height
+
+ +
Hinweis: Falls contrl[4] den Wert 0 enthält, steht die +Funktion nicht zur Verfügung. +
  + +
+ +

7.8.1.15 vq_prn_scaling

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Printer Scaling« - Skalierung des Druckertreibers +ermitteln. +
  +
VDI-Nummer: 5 (Escape 39) +
  +
Deklaration: fixed vq_prn_scaling( int16_t handle ); +
  +
Beschreibung: Diese Funktion liefert zurück, ob der Druckertreiber die in +den PRN_SETTINGS übergebene Skalierung beachtet. Falls der Treiber +die Funktion nicht unterstützt (also ein alter Treiber), liefert das +Binding -1 für die Skalierung zurück. Falls es sich um einen neuen +Treiber handelt, der die Funktion unterstützt aber nicht skaliert, so +liefert dieser -1 zurück. +
  +
Falls der Treiber die Skalierung durchführt, wird die +eingestellte Skalierung zurückgeliefert (0x10000L entspricht 100 %). +
  + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation + +
+ +
Ergebnis: -1 falls alter Treiber oder es wird nicht skaliert, sonst +eingestellte Skalierung (0x10000L entspricht 100%). +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Grafikspezial-Funktionen +
  +
Querverweis: Binding +
  + +
+ +

7.8.1.16 Bindings für vq_prn_scaling

+ + + + + + + + + +
C: fixed vq_prn_scaling( int16_t handle ); +
  +
Umsetzung: +
  +
fixed vq_prn_scaling( int16_t handle )
+{
+   intin[0] = -1;
+   intin[1] = -1;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 3;
+   contrl[5] = 39;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( *(fixed *) intout );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]3 # Einträge in intin
contrl+8contrl[4]2 # Einträge in intout
contrl+10contrl[5]39 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]-1
intin+2intin[1]-1
intoutintout[0..1]Return-Wert
+
+ +
Hinweis: Falls contrl[4] den Wert 0 enthält, steht die +Funktion nicht zur Verfügung. +
  + +
+ +

7.8.1.17 vq_scan

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Printer Scan« - Abfrage der Druckerparameter +
  +
VDI-Nummer: 5 (Escape 24) +
  +
Deklaration: void vq_scan ( int16_t handle, int16_t *g_slice, int16_t +*g_page, int16_t *a_slice, int16_t *a_page, int16_t *div_fac ); +
  +
Beschreibung: Die Funktion erlaubt die Abfrage verschiedener, +druckerspezifischer Parameter. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
g_slice Anzahl der Scheiben, in die der Drucker eine Seite unterteilt +
g_page Pixelhöhe einer Scheibe +
a_slice Höhe einer Textzeile in Pixeln +
a_page Textzeilen pro Seite +
div_fac Faktor, durch den die anderen Werte ggfs. noch geteilt werden +müssen + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all printer drivers. +
  +
Gruppe: Grafikspezial-Funktionen +
  +
Querverweis: Binding +
  + +
+ +

7.8.1.18 Bindings für vq_scan

+ + + + + + + + + +
C: void vq_scan ( int16_t handle, int16_t *g_slice, int16_t +*g_page, int16_t *a_slice, int16_t *a_page, int16_t *div_fac ); +
  +
Umsetzung: +
  +
void vq_scan (int16_t handle, int16_t *g_slice,
+              int16_t *g_page, int16_t *a_slice,
+              int16_t *a_page, int16_t *div_fac)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 24;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *g_slice = intout[0];
+   *g_page  = intout[1];
+   *a_slice = intout[2];
+   *a_page  = intout[3];
+   *div_fac = intout[4];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]5 # Einträge in intout
contrl+10contrl[5]24 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intoutintout[0]g_slice
intout+2intout[1]g_page
intout+4intout[2]a_slice
intout+6intout[3]a_page
intout+8intout[4]div_fac
+
+ + +
+ +

7.8.1.19 vq_tabstatus

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Tablet Status« - ermittelt die Verfügbarkeit einer +Eingabeeinheit. +
  +
VDI-Nummer: 5 (Escape 16) +
  +
Deklaration: int16_t vq_tabstatus ( int16_t handle ); +
  +
Beschreibung: Die Funktion überprüft auf der Workstation mit der Kennung +handle die Verfügbarkeit eines Grafik-Tabletts, einer Maus, +eines Joysticks oder eines ähnlichen Gerätes. +
  +
Ergebnis: Die Funktion liefert den Wert 1, falls ein entsprechendes +Gerät verfügbar ist, bzw. den Wert 0, falls dies nicht der Fall ist. +
  +
Verfügbar: Supported by all screen drivers. +
  +
Gruppe: Grafikspezial-Funktionen +
  +
Querverweis: Binding +
  + +
+ +

7.8.1.20 Bindings für vq_tabstatus

+ + + + + + + + + +
C: int16_t vq_tabstatus ( int16_t handle ); +
  +
Umsetzung: +
  +
int16_t vq_tabstatus (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 16;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]16 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intoutintout[0]Return-Wert
+
+ + +
+ +

7.8.1.21 vq_tray_names

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Tray Names« - Namen des Papiereinzugs bzw. Auswurfs +ermitteln. +
  +
VDI-Nummer: 5 (Escape 36) +
  +
Deklaration: void vq_tray_names ( int16_t handle, int8_t *input_name, int8_t +*output_name, int16_t *input, int16_t *output ); +
  +
Beschreibung: Die Funktion ermittelt den Namen des aktuellen Papiereinzugs +bzw. -auswurfs. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
input_name Zeiger auf den Einzugs-Namen +
output_name Zeiger auf den Auswurfs-Namen +
input Papiereinzug +
output Papierauswurf + +
+ +
Hinweis: Falls es sich bei den Parametern +input_name oder output_name um Null-Zeiger handelt, +werden die entsprechenden Werte nicht zurückgeliefert. +
  +
Ergebnis: Die Funktion liefert kein direktes Ergebnis zurück. +
  +
Verfügbar: Die Funktion ist nur vorhanden, falls contrl[4] einen Wert +ungleich 0 enthält. +
  +
Gruppe: Grafikspezial-Funktionen +
  +
Querverweis: Binding   v_tray   v_copies   v_orient +
  + +
+ +

7.8.1.22 Bindings für vq_tray_names

+ + + + + + + + + +
C: void vq_tray_names ( int16_t handle, int8_t *input_name, int8_t +*output_name, int16_t *input, int16_t *output ); +
  +
Umsetzung: +
  +
void vq_tray_names ( int16_t handle, int8_t *input_name,
+                     int8_t *output_name, int16_t *input,
+                     int16_t *output )
+{
+   intin[0..1] = input_name;
+   intin[2..3] = output_name;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 4;
+   contrl[5] = 36;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *input  = intout[0];
+   *output = intout[1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]4 # Einträge in intin
contrl+8contrl[4]2 # Einträge in intout
contrl+10contrl[5]36 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intinintin[0..1]input_name
intin+4intin[2..3]output_name
intoutintout[0]input
intout+2intout[1]output
+
+ +
Hinweis: Falls contrl[4] den Wert 0 enthält, steht die +Funktion nicht zur Verfügung. +
  + +
+ +

7.8.1.23 vs_calibrate

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set calibration« - Farbkalibration setzen +
  +
VDI-Nummer: 5 (Escape 76) +
  +
Deklaration: int16_t vs_calibrate ( int16_t handle, int16_t flag, int16_t +*rgb ); +
  +
Beschreibung: Die Funktion ermöglicht das Ein- bzw. Ausschalten der +Farbkalibration oder das Übergeben einer Kalibrationstabelle. Es +gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
flag Kalibration + + + + + + +
0 = ausschalten +
1 = einschalten + +
+ +
rgb Zeiger auf Kalibrationstabelle oder NULL + +
+ +
Hinweis: Eine Kalibrationstabelle besteht aus 1001 +RGB-Einträgen, die für den Wertebereich 0 bis 1000 Promille jedem +Eingabewert einen korrigierten Promille-Wert zuordnet. Bevor man diese +Funktion aufruft, sollte man mit vq_calibrate feststellen, ob sie +überhaupt vorhanden ist. +
  +
Die Farbkalibration ist im gesamten System für den mit +handle bezeichneten Treiber gültig. Daher sollte sie nicht +von einzelnen Anwendungen, sondern nur durch ein CPX-Modul oder +Accessory eingestellt werden. +
  +
Hinweis zu TC-VDI: Syntax is vs_calibrate(handle, rgb, +flag) however intin entries are assigned to the same values in both +cases. +
  +
Ergebnis: Die Funktion liefert den Wert 0, wenn die Kalibration +ausgeschaltet bzw. den Wert 1, wenn diese eingeschaltet ist. +
  +
Verfügbar: NVDI (depends on the driver), MATRIX TC-VDI. +
  +
Gruppe: Grafikspezial-Funktionen +
  +
Querverweis: Binding   vq_calibrate +
  + +
+ +

7.8.1.24 Bindings für vs_calibrate

+ + + + + + + + + +
C: int16_t vs_calibrate ( int16_t handle, int16_t flag, int16_t +*rgb ); +
  +
Umsetzung: +
  +
int16_t vs_calibrate (int16_t handle, int16_t flag,
+                      int16_t *rgb)
+{
+   intin[0..1] = rgb;
+   intin[2] = flag;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 3;
+   contrl[5] = 76;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]3 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]76 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intinintin[0..1]rgb
intin+4intin[2]flag
intoutintout[0]Return-Wert
+
+ + +
+ +

7.8.1.25 vs_crop

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set crop marks« - Sets a cropping rectangle on a document. +
  +
VDI-Nummer: 5 (Escape 2104) +
  +
Deklaration: int16_t vs_crop ( int16_t handle, int16_t ltx1, int16_t lty1, +int16_t ltx2, int16_t lty2, int16_t ltlen, int16_t ltoffset ); +
  +
Beschreibung: The call vs_crop sets a cropping rectangle to print cutting +lines on a document. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
ltx1 X-coordinate, and +
lty1 Y-coordinate of top left corner point +
ltx2 X-coordinate, and +
lty2 Y-coordinate of bottom right corner point +
ltlen Length of the cutting lines +
ltoffset Position of cutting lines relative to coordinates + +
+ +
Ergebnis: 0: Function does not exist. +
  +
Verfügbar: Available with new drivers from Thierry Rodolfo. +
  +
Gruppe: Grafikspezial-Funktionen +
  +
Querverweis: Binding +
  + +
+ +

7.8.1.26 Bindings für vs_crop

+ + + + + + + + + +
C: int16_t vs_crop ( int16_t handle, int16_t ltx1, int16_t lty1, +int16_t ltx2, int16_t lty2, int16_t ltlen, int16_t ltoffset ); +
  +
Umsetzung: +
  +
int16_t vs_crop (int16_t handle, int16_t ltx1, int16_t lty1,
+            int16_t ltx2, int16_t lty2, int16_t ltlen, int16_t ltoffset)
+{
+   intin[0] = ltx1;
+   intin[1] = lty1;
+   intin[2] = ltx2;
+   intin[3] = lty2;
+   intin[4] = ltlen;
+   intin[5] = ltoffset;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 6;
+   contrl[5] = 2104;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]6 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]2104 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intinintin[0]ltx1
intin+2intin[1]lty1
intin+4intin[2]ltx2
intin+6intin[3]lty2
intin+8intin[4]ltlen
intin+10intin[5]ltoffset
intoutintout[0]Return-Wert
+
+ + +
+ +

7.8.1.27 vs_document_info

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Document Info« - Dokumentangaben für Druckmonitor +setzen. +
  +
VDI-Nummer: 5 (Escape 2103) +
  +
Deklaration: int16_t vs_document_info( int16_t handle, int16_t type, void +*s, int16_t wchar ); +
  +
Beschreibung: Mit dieser Funktion übergibt ein Programm verschiedene Angaben +über ein Dokument, die der Druckmonitor beim Ausdruck anzeigt. +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
type + + + + + + + + + + + + + + + +
0 = Name der Applikation +
1 = Name des Dokuments +
2 = Name des Urhebers/Bearbeiters +
3 = Kommentar +
4 = Dateiname des Dokuments + +
+ +
s Zeiger auf den String +
wchar 0: 8 Bit pro Zeichen +
1: 16 Bit pro Zeichen + +
+ +
Ergebnis: 0: Funktion nicht vorhanden +
1: alles in Ordnung +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Grafikspezial-Funktionen +
  +
Querverweis: Binding +
  + +
+ +

7.8.1.28 Bindings für vs_document_info

+ + + + + + + + + +
C: int16_t vs_document_info( int16_t handle, int16_t type, void +*s, int16_t wchar ); +
  +
Umsetzung: +
  +
int16_t  vs_document_info( int16_t handle, int16_t type,
+                           void *s, int16_t wchar )
+{
+   intin[0] = type;
+   intin[1..n-1] = s
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = n;
+   contrl[5] = 2103;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]n # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]2103 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intinintin[0]type
intin+2intin[1..n-1]s
intoutintout[0]Return-Wert
+
+ + +
+ +

7.8.1.29 vs_load_disp_list

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Load display list« - Druckerpufferliste laden. +
  +
VDI-Nummer: 5 (Escape 2107) +
  +
Deklaration: int16_t vs_load_disp_list ( int16_t handle, int8_t *name ); +
  +
Beschreibung: Die Funktion füllt die Druckerpufferliste mit dem Inhalt einer +Datei. It can be used to load master documents for example and +provides huge time savings during printing. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
name Zeiger auf den Dateinamen + +
+ +
Ergebnis: Der Rückgabewert der Funktion ist z.Zt. nicht bekannt. +
  +
Verfügbar: Die Funktion ist nur vorhanden, falls intout[0] einen Wert +ungleich 0 enthült. +
  +
Gruppe: Grafikspezial-Funktionen +
  +
Querverweis: Binding   v_clear_disp_list   vs_save_disp_list +
  + +
+ +

7.8.1.30 Bindings für vs_load_disp_list

+ + + + + + + + + +
C: int16_t vs_load_disp_list ( int16_t handle, int8_t *name ); +
  +
Umsetzung: +
  +
int16_t vs_load_disp_list ( int16_t handle, int8_t *name )
+{
+   intin[0..1] = name;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[5] = 2107;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[1] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]2 # Einträge in intin
contrl+8contrl[4]2 # Einträge in intout
contrl+10contrl[5]2107 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intinintin[0..1]name
intoutintout[0]Verfügbar
intout+2intout[1]Return-Wert
+
+ +
Hinweis: Falls intout[0] den Wert 0 enthält, steht die +Funktion nicht zur Verfügung. +
  + +
+ +

7.8.1.31 vs_page_info

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Page Info« - Dokumentangaben für Druckmonitor setzen. +
  +
VDI-Nummer: 5 (Escape 2103) +
  +
Deklaration: int16_t vs_page_info( int16_t handle, int16_t type, int8_t *s +); +
  +
Beschreibung: Mit dieser Funktion übergibt ein Programm verschiedene Angaben +über ein Dokument, die der Druckmonitor beim Ausdruck anzeigt. +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
type + + + + + + + + + + + + + + + +
0 = Name der Applikation +
1 = Name des Dokuments +
2 = Name des Urhebers/Bearbeiters +
3 = Kommentar +
4 = Dateiname des Dokuments + +
+ +
s Zeiger auf den String (8 Bit pro Zeichen), die Zeichen für +Zeichen in 16-Bit-Enträge von intin geschrieben wird, einschließlich +des NULL-Byte. + +
+ +
Ergebnis: 0: Funktion nicht vorhanden +
1: alles in Ordnung +
  +
Verfügbar: Treiber von Thierry Rodolfo +
  +
Gruppe: Grafikspezial-Funktionen +
  +
Querverweis: Binding   vs_document_info +
  + +
+ +

7.8.1.32 Bindings für vs_page_info

+ + + + + + + + + +
C: int16_t vs_page_info( int16_t handle, int16_t type, int8_t *s +); +
  +
Umsetzung: +
  +
int16_t  vs_page_info( int16_t handle, int16_t type,
+                           int8_t *s )
+{
+   intin[0] = type;
+   intin[1..n-1] = s;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = n;
+   contrl[5] = 2103;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]n # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]2103 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intinintin[0]type
intin+2intin[1..n-1]s
intoutintout[0]Return-Wert
+
+ + +
+ +

7.8.1.33 vs_palette

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Select Palette« - wählt eine Farbpalette aus. +
  +
VDI-Nummer: 5 (Escape 60) +
  +
Deklaration: int16_t vs_palette ( int16_t handle, int16_t palette ); +
  +
Beschreibung: Die Funktion ermöglicht die Auswahl der Farbpalette auf einer +IBM-CGA-Grafikkarte in mittlerer Auflösung. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
palette Farbpalette + + + + + + +
0 = Rot, Grün, Blau +
1 = Cyan, Magenta, Weiß + +
+ + +
+ +
Ergebnis: Die Funktion liefert die ausgewählte Palette zurück. +
  +
Verfügbar: This call was originally designed for use on IBM CGAbased +computers. Its usefulness and availability are not guaranteed under +any driver so it should thus be avoided. +
  +
Gruppe: Grafikspezial-Funktionen +
  +
Querverweis: Binding +
  + +
+ +

7.8.1.34 Bindings für vs_palette

+ + + + + + + + + +
C: int16_t vs_palette ( int16_t handle, int16_t palette ); +
  +
Umsetzung: +
  +
int16_t vs_palette (int16_t handle, int16_t palette)
+{
+   intin[0] = palette;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 60;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]60 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intinintin[0]palette
intoutintout[0]Return-Wert
+
+ + +
+ +

7.8.1.35 vs_save_disp_list

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Save display list« - speichert die Druckerpufferliste. +
  +
VDI-Nummer: 5 (Escape 2106) +
  +
Deklaration: int16_t vs_save_disp_list ( int16_t handle, int8_t *name ); +
  +
Beschreibung: Die Funktion speichert die Druckerpufferliste in einer Datei +ab. It can be used to save master documents for example and provides +huge time savings during printing. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
name Zeiger auf den Dateinamen + +
+ +
Ergebnis: Der Rückgabewert der Funktion ist z.Zt. nicht bekannt. +
  +
Verfügbar: Die Funktion ist nur vorhanden, falls intout[0] einen Wert +ungleich 0 enthült. +
  +
Gruppe: Grafikspezial-Funktionen +
  +
Querverweis: Binding   v_clear_disp_list   vs_load_disp_list +
  + +
+ +

7.8.1.36 Bindings für vs_save_disp_list

+ + + + + + + + + +
C: int16_t vs_save_disp_list ( int16_t handle, int8_t *name ); +
  +
Umsetzung: +
  +
int16_t vs_save_disp_list ( int16_t handle, int8_t *name )
+{
+   intin[0..1] = name;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[5] = 2106;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[1] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]2 # Einträge in intin
contrl+8contrl[4]2 # Einträge in intout
contrl+10contrl[5]2106 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intinintin[0..1]name
intoutintout[0]Verfügbar
intout+2intout[1]Return-Wert
+
+ +
Hinweis: Falls intout[0] den Wert 0 enthält, steht die +Funktion nicht zur Verfügung. +
  + +
+ +

7.8.1.37 v_bit_image

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Output Bit Image File« - gibt ein Bit-Imagefile auf dem +Drucker aus. +
  +
VDI-Nummer: 5 (Escape 23) +
  +
Deklaration: void v_bit_image ( int16_t handle, CONST int8_t *filename, +int16_t aspect, int16_t x_scale, int16_t y_scale, int16_t h_align, +int16_t v_align, int16_t *xyarray ); +
  +
Beschreibung: Die Funktion erlaubt die Ausgabe der in einer Bit-Image (IMG) +Datei gespeicherten Bild-Information. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
filename Zeiger auf Datei-Namen +
aspect Abbildungsmaßstab + + + + + + +
0 = wird ignoriert +
1 = Pixel werden berücksichtigt + +
+ +
x_scale Skalierung der x-Achse +
y_scale Skalierung der y-Achse, dabei gilt jeweils: + + + + + + +
0 = rational (exakter) +
1 = ganzzahlig + +
+ +
h_align horizontale Ausrichtung + + + + + + + + + +
0 = linksbündig +
1 = zentriert +
2 = rechtsbündig + +
+ +
v_align vertikale Ausrichtung + + + + + + + + + +
0 = oben +
1 = zentriert +
2 = unten + +
+ +
xyarray[0] x-Koordinate +
xyarray[1] y-Koordinate der oberen linken Ecke +
xyarray[2] x-Koordinate +
xyarray[3] y-Koordinate der unteren rechten Ecke des Ausgaberechteckes. + +
+ +
Hinweis: Wird in aspect der Abbildungsmaßstab +berücksichtigt, so erscheinen Kreise als Kreise, Quadrate als +Quadrate etc. Das Bild wird auf dem Ausgabegerät dann entsprechend +gedehnt. Dies kann u.U. schlecht aussehen, wenn z.B. feine Punktraster +gedehnt oder gestaucht werden. Wird das Verhältnis ignoriert, so +können aus Kreisen auch Ellipsen werden. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all printer, metafile, and memory drivers. +
  +
Gruppe: Grafikspezial-Funktionen +
  +
Querverweis: Binding   v_xbit_image   GDOS   XIMG-Format +
  + +
+ +

7.8.1.38 Bindings für v_bit_image

+ + + + + + + + + +
C: void v_bit_image ( int16_t handle, CONST int8_t *filename, +int16_t aspect, int16_t x_scale, int16_t y_scale, int16_t h_align, +int16_t v_align, int16_t *xyarray ); +
  +
Umsetzung: +
  +
void v_bit_image (int16_t handle, CONST int8_t *filename,
+                  int16_t aspect, int16_t x_scale,
+                  int16_t y_scale, int16_t h_align,
+                  int16_t v_align, int16_t *xyarray)
+{
+   int16_t tmp;
+
+   ptsin[0..3] = xyarray[0..3];
+   intin[0] = aspect;
+   intin[1] = x_scale;
+   intin[2] = y_scale;
+   intin[3] = h_align;
+   intin[4] = v_align;
+
+   tmp = 5;
+   while (intin[tmp++] = *filename++)
+      ;
+
+   contrl[0] = 5;
+   contrl[1] = 2;
+   contrl[3] = --tmp;
+   contrl[5] = 23;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]2 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]n+5 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]23 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intinintin[0]aspect
intin+2intin[1]x_scale
intin+4intin[2]y_scale
intin+6intin[3]h_align
intin+8intin[4]v_align
intin+10intin[5..n+4]filename[0..n-1]
ptsinptsin[0..3]xyarray[0..3]
+
+ + +
+ +

7.8.1.39 v_clear_disp_list

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Clear Display List« - löscht die Druckerpufferliste. +
  +
VDI-Nummer: 5 (Escape 22) +
  +
Deklaration: void v_clear_disp_list ( int16_t handle ); +
  +
Beschreibung: Die Funktion löscht auf der Workstation mit der Kennung +handle den Druckerpuffer. +
  +
Hinweis: Ein Seitenvorschub wird dabei nicht +durchgeführt. Die Funktion sollte z.B. dann aufgerufen werden, wenn +der Benutzer die Grafikausgaben vor dem Ausdruck abbrechen +möchte. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all printer, metafile, and memory drivers. +
  +
Gruppe: Grafikspezial-Funktionen +
  +
Querverweis: Binding   GDOS   v_clrwk +
  + +
+ +

7.8.1.40 Bindings für v_clear_disp_list

+ + + + + + + + + +
C: void v_clear_disp_list ( int16_t handle ); +
  +
Umsetzung: +
  +
void v_clear_disp_list (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 22;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]22 # Escape/Sub-Opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.1.41 v_copies

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Number of Copies« - Anzahl der Kopien einer Druckseite +festlegen. +
  +
VDI-Nummer: 5 (Escape 28) +
  +
Deklaration: int16_t v_copies ( int16_t handle, int16_t count ); +
  +
Beschreibung: Die Funktion legt die Anzahl der Kopien einer zu druckenden +Seite fest. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
count Anzahl der Kopien (1 = normal) bzw. -1 um die eingestellte +Anzahl der Kopien zu ermitteln + +
+ +
Hinweis: Es werden alle Seiten bis zum Schließen des +Arbeitsgerätes in der spezifizierten Anzahl ausgegeben. +
  +
Ergebnis: Die Funktion liefert die Anzahl der eingestellten Kopien +zurück. +
  +
Verfügbar: GEM/3 Release 3.1 und ansonsten nur, falls contrl[4] einen +Wert ungleich 0 enthält. +
  +
Gruppe: Grafikspezial-Funktionen +
  +
Querverweis: Binding   v_orient   v_tray +
  + +
+ +

7.8.1.42 Bindings für v_copies

+ + + + + + + + + +
C: int16_t v_copies ( int16_t handle, int16_t count ); +
  +
Umsetzung: +
  +
int16_t v_copies ( int16_t handle, int16_t count )
+{
+   intin[0] = count;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 28;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]28 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intinintin[0]count
intoutintout[0]Return-Wert
+
+ +
Hinweis: Falls contrl[4] den Wert 0 enthält, steht die +Funktion nicht zur Verfügung. +
  + +
+ +

7.8.1.43 v_dspcur

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Place Graphic Cursor at Location« - positioniert den +Grafikcursor an die angegebene Position. +
  +
VDI-Nummer: 5 (Escape 18) +
  +
Deklaration: void v_dspcur ( int16_t handle, int16_t x, int16_t y ); +
  +
Beschreibung: Die Funktion setzt den Grafikcursor an eine bestimmte Position. +Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
x neue x-Koordinate +
y neue y-Koordinate + +
+ +
Hinweis: Die Funktion ist nur auf Geräten verfügbar, +die Positionseingaben zulassen, also z.B. Maus, Joystick oder +Trackball. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all screen drivers. +
  +
Gruppe: Grafikspezial-Funktionen +
  +
Querverweis: Binding +
  + +
+ +

7.8.1.44 Bindings für v_dspcur

+ + + + + + + + + +
C: void v_dspcur ( int16_t handle, int16_t x, int16_t y ); +
  +
Umsetzung: +
  +
void v_dspcur (int16_t handle, int16_t x, int16_t y)
+{
+   ptsin[0] = x;
+   ptsin[1] = y;
+
+   contrl[0] = 5;
+   contrl[1] = 1;
+   contrl[3] = 0;
+   contrl[5] = 18;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]1 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]18 # Escape/Sub-Oopcode
contrl+12contrl[6]handle
ptsinptsin[0]x
ptsin+2ptsin[1]y
+
+ + +
+ +

7.8.1.45 v_form_adv

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Form Advance« - erzeugt einen Seitenvorschub. +
  +
VDI-Nummer: 5 (Escape 20) +
  +
Deklaration: void v_form_adv ( int16_t handle ); +
  +
Beschreibung: Die Funktion erzeugt auf der Workstation mit der Kennung +handle einen Seitenvorschub. +
  +
Hinweis: Der Datenpuffer wird dabei nicht +gelöscht; bei einem Metafile wird ein entsprechender Eintrag +vorgenommen. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all drivers. +
  +
Gruppe: Grafikspezial-Funktionen +
  +
Querverweis: Binding   v_clrwk +
  + +
+ +

7.8.1.46 Bindings für v_form_adv

+ + + + + + + + + +
C: void v_form_adv ( int16_t handle ); +
  +
Umsetzung: +
  +
void v_form_adv (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 20;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]20 # Escape/Sub-Opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.1.47 v_hardcopy

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Hardcopy« - führt eine Hardcopy des Bildschirms durch. +
  +
VDI-Nummer: 5 (Escape 17) +
  +
Deklaration: void v_hardcopy ( int16_t handle ); +
  +
Beschreibung: Die Funktion erstellt eine Hardcopy von der Workstation mit der +Kennung handle auf einem Drucker, oder einem ähnlichen +Gerät. +
  +
Hinweis: Dies ist eine Funktion des Bildschirmtreibers, +der dazu auf das XBIOS zugreift. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by screen drivers running under ST compatible +resolutions. +
  +
Gruppe: Grafikspezial-Funktionen +
  +
Querverweis: Binding +
  + +
+ +

7.8.1.48 Bindings für v_hardcopy

+ + + + + + + + + +
C: void v_hardcopy ( int16_t handle ); +
  +
Umsetzung: +
  +
void v_hardcopy (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 17;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]17 # Escape/Sub-Opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.1.49 v_orient

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Orientation for Output« - Ausgabeformat festlegen. +
  +
VDI-Nummer: 5 (Escape 27) +
  +
Deklaration: int16_t v_orient ( int16_t handle, int16_t orientation ); +
  +
Beschreibung: Die Funktion legt das Ausgabeformat für ein Gerät fest. Es +gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
orientation Format + + + + + + + + + +
-1 = aktuelles Format ermitteln +
0 = Hochformat (Portrait) +
1 = Querformat (Landscape) + +
+ + +
+ +
Hinweis: Die gewünschte Einstellung muss vorgenommen +werden, bevor irgendwelche Ausgaben getätigt werden. +
  +
Falls nicht genügend Speicherplatz zur Verfügung steht um die +Orientierung zu verändern, liefert die Funktion den Wert -1 zurück; +in diesem Fall muß die Drucker-Workstation per v_clswk geschlossen +werden. +
  +
Ergebnis: Die Funktion liefert das eingestellte Ausgabeformat zurück, +bzw. im Fehlerfall den Wert -1. +
  +
Verfügbar: GEM/3 Release 3.1 und ansonsten nur, falls contrl[4] einen +Wert ungleich 0 enthält. +
  +
Gruppe: Grafikspezial-Funktionen +
  +
Querverweis: Binding   v_copies   v_tray +
  + +
+ +

7.8.1.50 Bindings für v_orient

+ + + + + + + + + +
C: int16_t v_orient ( int16_t handle, int16_t orientation ); +
  +
Umsetzung: +
  +
int16_t v_orient ( int16_t handle, int16_t orientation )
+{
+   intin[0] = orientation;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 27;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]27 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intinintin[0]orientation
intoutintout[0]Return-Wert
+
+ +
Hinweis: Falls contrl[4] den Wert 0 enthält, steht die +Funktion nicht zur Verfügung. +
  + +
+ +

7.8.1.51 v_output_window

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Output Window« - gibt den Fensterinhalt auf dem Drucker aus. +
  +
VDI-Nummer: 5 (Escape 21) +
  +
Deklaration: void v_output_window ( int16_t handle, int16_t *xyarray ); +
  +
Beschreibung: Die Funktion erlaubt es, eine einzige Abbildung auf mehrere +Blätter verteilt zu drucken. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
xyarray[0] x-Koordinate +
xyarray[1] y-Koordinate einer Ecke des Ausgaberechteckes +
xyarray[2] x-Koordinate +
xyarray[3] y-Koordinate der diagonal gegenüber liegenden Ecke + +
+ +
Hinweis: Der Unterschied zu v_updwk besteht darin, daß +ein Ausschnitt aus dem Koordinatensystem des Druckers gewählt werden +kann. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all printer and metafile drivers under any type of +GDOS. +
  +
Gruppe: Grafikspezial-Funktionen +
  +
Querverweis: Binding   v_updwk +
  + +
+ +

7.8.1.52 Bindings für v_output_window

+ + + + + + + + + +
C: void v_output_window ( int16_t handle, int16_t *xyarray ); +
  +
Umsetzung: +
  +
void v_output_window (int16_t handle, int16_t *xyarray)
+{
+   ptsin[0..3] = xyarray[0..3];
+
+   contrl[0] = 5;
+   contrl[1] = 2;
+   contrl[3] = 0;
+   contrl[5] = 21;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]2 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]21 # Escape/Sub-Opcode
contrl+12contrl[6]handle
ptsinptsin[0..3]xyarray[0..3]
+
+ + +
+ +

7.8.1.53 v_page_size

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Page Size« - legt das Seitenformat fest. +
  +
VDI-Nummer: 5 (Escape 37) +
  +
Deklaration: int16_t v_page_size ( int16_t handle, int16_t page_id ); +
  +
Beschreibung: Die Funktion ermöglicht es, daß Seitenformat für ein +Ausgabegerät festzulegen. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
page_id gewünschtes Papierformat + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
0 = Voreinstellung benutzen +
1 = DIN-A3 +
2 = DIN-A4 +
3 = DIN-A5 +
4 = DIN-B5 +
16 = Letter Size +
17 = Half Size +
18 = Legal Size +
19 = Double Size +
20 = Broad Sheet Size + +
+ + +
+ +
Hinweis: Falls das gewünschte Format nicht existiert +wird das Standard-Format benutzt. +
  +
Ergebnis: Die Funktion liefert das eingestellte Papierformat zurück. Bei +einem Rückgabewert von -1 muss die Workstation geschlossen werden, da +nicht genügend freier Speicher vorhanden ist. +
  +
Verfügbar: Die Funktion ist nur vorhanden, falls contrl[4] einen Wert +ungleich 0 enthält. +
  +
Gruppe: Grafikspezial-Funktionen +
  +
Querverweis: Binding   v_opnwk   vq_extnd +
  + +
+ +

7.8.1.54 Bindings für v_page_size

+ + + + + + + + + +
C: int16_t v_page_size ( int16_t handle, int16_t page_id ); +
  +
Umsetzung: +
  +
int16_t v_page_size ( int16_t handle, int16_t page_id )
+{
+   intin[0] = page_id;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 37;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]37 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intinintin[0]page_id
intoutintout[0]Return-Wert
+
+ +
Hinweis: Falls contrl[4] den Wert 0 enthält, steht die +Funktion nicht zur Verfügung. +
  + +
+ +

7.8.1.55 v_rmcur

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Remove last Graphic Cursor« - entfernt den Grafikcursor. +
  +
VDI-Nummer: 5 (Escape 19) +
  +
Deklaration: void v_rmcur ( int16_t handle ); +
  +
Beschreibung: Die Funktion entfernt auf der Workstation mit der Kennung +handle den zuletzt dargestellen Grafikcursor. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all screen drivers. +
  +
Gruppe: Grafikspezial-Funktionen +
  +
Querverweis: Binding +
  + +
+ +

7.8.1.56 Bindings für v_rmcur

+ + + + + + + + + +
C: void v_rmcur ( int16_t handle ); +
  +
Umsetzung: +
  +
void v_rmcur (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 19;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]19 # Escape/Sub-Opcode
contrl+12contrl[6]handle
+
+ + +
+ + +

7.8.1.57 v_tray

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Input and Output Tray« - Einzugsschacht des Druckers +festlegen. +
  +
VDI-Nummer: 5 (Escape 29) +
  +
Deklaration: void v_tray ( int16_t handle, int16_t input, int16_t output, +int16_t *set_input, int16_t *set_output ); +
  +
Beschreibung: Die Funktion bestimmt den Druckerschacht für den Papiereinzug +bzw. die Papierausgabe. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
input Papiereinzug + + + + + + + + + + + + +
-1 = manueller Einzug +
0 = Standardeinzug +
1 = erster optionaler Schacht +
n = n-ter optionaler Schacht + +
+ +
output Papierausgabe + + + + + + + + + +
0 = Standard-Auswurf +
1 = zweiter optionaler Schacht +
n = n-ter optionaler Schacht + +
+ +
set_input tatsächlich gesetzter Einzug +
set_output tatsächlich gesetzter Auswurf + +
+ +
Hinweis: Sollte der angegebene Schacht nicht vorhanden +sein, wird die Standardeinstellung benutzt. Die Namen der Einzüge und +Papierauswürfe können per vq_tray_names ermittelt werden. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Verfügbar: GEM/3 Release 3.1 und ansonsten nur, falls contrl[4] einen +Wert ungleich 0 enthält. In NVDI wird diese Funktion v_trays genannt. +In GEM/3 wird diese Funktion v_tray genannt, und hat nur 1 +Parameter. +
  +
Gruppe: Grafikspezial-Funktionen +
  +
Querverweis: Binding   vq_tray_names   v_copies   v_orient +
  + +
+ +

7.8.1.58 Bindings für v_tray

+ + + + + + + + + +
C: void v_tray ( int16_t handle, int16_t input, int16_t output, +int16_t *set_input, int16_t *set_output ); +
  +
Umsetzung: +
  +
void v_tray ( int16_t handle, int16_t input, int16_t output,
+               int16_t *set_input, int16_t *set_output )
+{
+   intin[0] = input;
+   intin[1] = output;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[5] = 29;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *set_input  = intout[0];
+   *set_output = intout[1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]2 # Einträge in intin
contrl+8contrl[4]2 # Einträge in intout
contrl+10contrl[5]29 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intinintin[0]input
intin+2intin[1]output
intoutintout[0]set_input
intout+2intout[1]set_output
+
+ + +
+ +

7.8.1.59 v_xbit_image

+ + + + + + + + + + + + + + + +
VDI-Nummer: 5 (Escape 101) +
  +
Deklaration: void v_xbit_image(int16_t handle, const char *filename, int16_t +aspect, int16_t x_scale, int16_t y_scale, int16_t h_align, int16_t +v_align, int16_t rotation, int16_t foreground, int16_t background, +int16_t xy[]) +
  +
Beschreibung: The call v_xbit_image draws an image from a disk file onto the +current device - with rotation and colouring. +
  +
Passed #ptsin=2, #intin=8 + length of filename. +
  +
INTIN holds: +
  +
    +
  • 0 to ignore aspect ratio, 1 to preserve it +
  • +
  • X axis scaling: 0 = fractional, 1 = integer +
  • +
  • Y axis scaling: 0 = fractional, 1 = integer +
  • +
  • Horizontal alignment: 0=left 1=centre 2=right +
  • +
  • Vertical alignment: 0=top 1=centre 2=bottom +
  • +
  • Rotation angle, 0 - 3600 in 1/10th degrees +
  • +
  • Foreground colour if drawing a monochrome image on a colour +device +
  • +
  • Background colour +
  • +
  • Filename, one character per word +
  • +
+ +
Verfügbar: GEM/3 and later +
  +
Gruppe: Grafikspezial-Funktionen +
  + +
+ +

7.8.2 Grafiktablett-Funktionen

+

Diese Bibliothek enthält Funktionen, um ein Grafiktablett +optimal ansprechen zu können. Zu diesem Zweck stehen die folgenden +Routinen zur Verfügung: +

+ + + + + + + + + + + + + + + +
vq_tdimensions Ausmaße des Grafiktabletts in 1/10-Zoll. +
vt_alignment Koordinatensystem des Grafiktabletts ausrichten. +
vt_axis Auflösung des Grafiktabletts einstellen. +
vt_origin Koordinatenursprung für Grafiktablett setzen. +
vt_resolution Auflösung des Grafiktabletts einstellen. + +
+ +

Querverweis: Workstations des VDI   Style-Guidelines +

+

7.8.2.1 vq_tdimensions

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »return tablet x and y dimensions« - Ausmaße des +Grafiktabletts in 1/10-Zoll. +
  +
VDI-Nummer: 5 (Escape 84) +
  +
Deklaration: void vq_tdimensions ( int16_t handle, int16_t *xdimension, +int16_t *ydimension ); +
  +
Beschreibung: Die Funktion liefert die Ausmaße eines Grafiktabletts in 1/10 +Zoll. Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
xdimension Breite in 1/10 Zoll +
ydimension Höhe in 1/10 Zoll + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all tablet drivers. +
  +
Gruppe: Grafiktablett-Funktionen +
  +
Querverweis: Binding   GDOS   vq_tabstatus   vt_alignment   vt_resolution   +vt_axis   vt_origin +
  + +
+ +

7.8.2.2 Bindings für vq_tdimensions

+ + + + + + + + + +
C: void vq_tdimensions ( int16_t handle, int16_t *xdimension, +int16_t *ydimension ); +
  +
Umsetzung: +
  +
void vq_tdimensions (int16_t handle, int16_t *xdimension,
+                     int16_t *ydimension)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 84;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *xdimension = intout[0];
+   *ydimension = intout[1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]2 # Einträge in intout
contrl+10contrl[5]84 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intoutintout[0]xdimension
intout+2intout[1]ydimension
+
+ + +
+ +

7.8.2.3 vt_alignment

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »set tablet alignment« - Koordinatensystem des Grafiktabletts +ausrichten. +
  +
VDI-Nummer: 5 (Escape 85) +
  +
Deklaration: void vt_alignment ( int16_t handle, int16_t dx, int16_t dy ); +
  +
Beschreibung: Die Funktion dient der Ausrichtung des Koordinatensystems innerhalb +eines Ausschnitts des Grafiktabletts. Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
dx x-Offset vom Ursprung +
dy y-Offset vom Ursprung + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all tablet drivers. +
  +
Gruppe: Grafiktablett-Funktionen +
  +
Querverweis: Binding   GDOS   vq_tabstatus   vq_tdimensions   vt_resolutionvt_axis   vt_origin +
  + +
+ +

7.8.2.4 Bindings für vt_alignment

+ + + + + + + + + +
C: void vt_alignment ( int16_t handle, int16_t dx, int16_t dy ); +
  +
Umsetzung: +
  +
void vt_alignment (int16_t handle, int16_t dx, int16_t dy)
+{
+   intin[0] = dx;
+   intin[1] = dy;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[5] = 85;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]2 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]85 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intinintin[0]dx
intin+2intin[1]dy
+
+ + +
+ +

7.8.2.5 vt_axis

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »set tablet axis resolution in lines« - Auflösung des +Grafiktabletts einstellen in Zeilen. +
  +
VDI-Nummer: 5 (Escape 82) +
  +
Deklaration: void vt_axis ( int16_t handle, int16_t xres, int16_t yres, +int16_t *xset, int16_t *yset ); +
  +
Beschreibung: Die Funktion setzt die horizontale und vertikale Auflösung des +Grafiktabletts. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
xres gewünschte Auflösung +
yres in Zeilen +
xset tatsächliche Auflösung +
yset in Zeilen + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all tablet drivers. +
  +
Gruppe: Grafiktablett-Funktionen +
  +
Querverweis: Binding   GDOS   vq_tabstatus   vt_alignment   vt_resolution   +vt_origin   vq_tdimensions +
  + +
+ +

7.8.2.6 Bindings für vt_axis

+ + + + + + + + + +
C: void vt_axis ( int16_t handle, int16_t xres, int16_t yres, +int16_t *xset, int16_t *yset ); +
  +
Umsetzung: +
  +
void vt_axis (int16_t handle, int16_t xres, int16_t yres,
+              int16_t *xset, int16_t *yset)
+{
+   intin[0] = xres;
+   intin[1] = yres;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[5] = 82;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *xset = intout[0];
+   *yset = intout[1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]2 # Einträge in intin
contrl+8contrl[4]2 # Einträge in intout
contrl+10contrl[5]82 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intinintin[0]xres
intin+2intin[1]yres
intoutintout[0]xset
intout+2intout[1]yset
+
+ + +
+ +

7.8.2.7 vt_origin

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »set tablet x and y origin« - Koordinatenursprung für +Grafiktablett setzen. +
  +
VDI-Nummer: 5 (Escape 83) +
  +
Deklaration: void vt_origin ( int16_t handle, int16_t xorigin, int16_t +yorigin ); +
  +
Beschreibung: Die Funktion setzt den Ursprung des Koordinatensystems. Es +gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
xorigin x-Koordinate +
yorigin y-Koordinate der linken, oberen Ecke + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all tablet drivers. +
  +
Gruppe: Grafiktablett-Funktionen +
  +
Querverweis: Binding   GDOS   vq_tabstatus   vt_alignment   vt_resolution   +vt_axis   vq_tdimensions +
  + +
+ +

7.8.2.8 Bindings für vt_origin

+ + + + + + + + + +
C: void vt_origin ( int16_t handle, int16_t xorigin, int16_t +yorigin ); +
  +
Umsetzung: +
  +
void vt_origin (int16_t handle, int16_t xorigin,
+                int16_t yorigin)
+{
+   intin[0] = xorigin;
+   intin[1] = yorigin;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[5] = 83;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]2 # Einträge in intin
contrl+8contrl[4]2 # Einträge in intout
contrl+10contrl[5]83 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intinintin[0]xorigin
intin+2intin[1]yorigin
+
+ + +
+ +

7.8.2.9 vt_resolution

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »set tablet axis resolution in lines/inch« - Auflösung des +Grafiktabletts einstellen in Zeilen pro Inch. +
  +
VDI-Nummer: 5 (Escape 81) +
  +
Deklaration: void vt_resolution ( int16_t handle, int16_t xres, int16_t +yres, int16_t *xset, int16_t *yset ); +
  +
Beschreibung: Die Funktion setzt die horizontale und vertikale Auflösung des +Grafiktabletts. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
xres Auflösung in Zeilen +
yres pro Zoll (lpi) +
xset tatsächlich gesetzte +
yset Auflösung + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all tablet drivers. +
  +
Gruppe: Grafiktablett-Funktionen +
  +
Querverweis: Binding   GDOS   vq_tabstatus   vt_alignment   vt_axis   +vt_origin   vq_tdimensions +
  + +
+ +

7.8.2.10 Bindings für vt_resolution

+ + + + + + + + + +
C: void vt_resolution ( int16_t handle, int16_t xres, int16_t +yres, int16_t *xset, int16_t *yset ); +
  +
Umsetzung: +
  +
void vt_resolution (int16_t handle, int16_t xres, int16_t yres,
+                    int16_t *xset, int16_t *yset)
+{
+   intin[0] = xres;
+   intin[1] = yres;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[5] = 81;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *xset = intout[0];
+   *yset = intout[1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]2 # Einträge in intin
contrl+8contrl[4]2 # Einträge in intout
contrl+10contrl[5]81 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intinintin[0]xres
intin+2intin[1]yres
intoutintout[0]xset
intout+2intout[1]yset
+
+ + +
+ +

7.8.3 Metafile-Funktionen

+

Diese Bibliothek enthält Funktionen, die beim Erzeugen eines +Metafiles unentbehrlich sind. Insgesamt stehen die folgenden Routinen +zur Verfügung: +

+ + + + + + + + + + + + + + + +
v_meta_extents Dimensionen eines Metafiles berechnen. +
v_write_meta Grafik-Primitive im Metafile ablegen. +
vm_coords Neues Koordinatensystem für Metafile. +
vm_filename Metafile umbenennen. +
vm_pagesize Physikalische Seitengröße für Metafile. + +
+ +

Hinweis: Der Hauptzweck eines Metafiles liegt im +standardisierten Datenaustausch zwischen verschiedenen GEM-Systemen. +

+

Querverweis: +
Metafile-Format   Workstations des VDI   Style-Guidelines   +Grundlagen des VDI +

+

7.8.3.1 vm_coords

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »VDI meta file coordinates« - Eigenes Koordinatensystem +für Metafiles. +
  +
VDI-Nummer: 5 (Escape 99, Opcode 1) +
  +
Deklaration: void vm_coords ( int16_t handle, int16_t llx, int16_t lly, +int16_t urx, int16_t ury ); +
  +
Beschreibung: Die Funktion setzt das benutzte Koordinatensystem für die +Seite. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
llx x-Koordinaten +
lly y-Koordinaten (links unten) +
urx x-Koordinaten +
ury y-Koordinaten (rechts oben) + +
+ +
Hinweis: Bei dieser Funktion muss beachtet werden, in +welchem Koordinatentyp (NDC oder RC) die Metadatei geöffnet wurde, +und ggfs. müssen die y-Werte angepaßt werden. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all metafile drivers. +
  +
Gruppe: Metafile-Funktionen +
  +
Querverweis: Binding   v_write_meta   Metafile-Format   Sub-Opcodes +
  + +
+ +

7.8.3.2 Bindings für vm_coords

+ + + + + + + + + +
C: void vm_coords ( int16_t handle, int16_t llx, int16_t lly, +int16_t urx, int16_t ury ); +
  +
Umsetzung: +
  +
void vm_coords (int16_t handle, int16_t llx, int16_t lly,
+                int16_t urx, int16_t ury)
+{
+   intin[0] = 1;
+   intin[1] = llx;
+   intin[2] = lly;
+   intin[3] = urx;
+   intin[4] = ury;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 5;
+   contrl[5] = 99;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]5 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]99
contrl+12contrl[6]handle
intinintin[0]1 # Unter-Opcode
intin+2intin[1]llx
intin+4intin[2]lly
intin+6intin[3]urx
intin+8intin[4]ury
+
+ + +
+ +

7.8.3.3 vm_filename

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Change GEM VDI File Name« - ändert den Namen eines +Metafiles. +
  +
VDI-Nummer: 5 (Escape 100) +
  +
Deklaration: void vm_filename ( int16_t handle, CONST int8_t *filename ); +
  +
Beschreibung: Die Funktion benennt ein Metafile von GEMFILE.GEM in einen +anderen Namen unter Beibehaltung der Extension GEM um. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
filename neuer Name des Metafile + +
+ +
Hinweis: Der Parameter filename kann auch einen +Pfadnamen mit Laufwerksbezeichnung beinhalten. Sollte die Funktion +nicht sofort nach Aufruf von v_opnwk aufgerufen werden, so bleibt der +Funktionsaufruf wirkungslos. Ein eventuell geöffnetes Metafile wird +geschlossen. +
  +
Da ältere Metafile-Treiber (im Gegensatz zum NVDI-Treiber) das +Ursprungsfile "GEMFILE.GEM", welches im aktuellen +Verzeichnis angelegt wird, evtl. nicht löschen, sollte dies von der +Applikation selbst übernommen werden. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all metafile drivers. +
  +
Gruppe: Metafile-Funktionen +
  +
Querverweis: Binding   GDOS   v_opnwk   Metafile-Format   Sub-Opcodes +
  + +
+ +

7.8.3.4 Bindings für vm_filename

+ + + + + + + + + +
C: void vm_filename ( int16_t handle, CONST int8_t *filename ); +
  +
Umsetzung: +
  +
void vm_filename (int16_t handle, CONST int8_t *filename)
+{
+   int16_t *tmp;
+
+   tmp = intin;
+   while (*tmp++ = *filename++)
+      ;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = ((int16_t) (tmp-intin)-1);
+   contrl[5] = 100;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]n # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]100 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intinintin[0..n-1]filename[0..n-1]
+
+ + +
+ +

7.8.3.5 vm_pagesize

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »VDI page size« - legt die physikalische Seitengröße für +Metafiles fest. +
  +
VDI-Nummer: 5 (Escape 99, Opcode 0) +
  +
Deklaration: void vm_pagesize ( int16_t handle, int16_t pgwidth, int16_t +pgheight ); +
  +
Beschreibung: Die Funktion setzt die Seitengröße in 1/10mm. Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
pgwidth Breite in 1/10 mm +
pgheight Höhe in 1/10 mm + +
+ +
Hinweis: Da Breite und Höhe einer Seite getrennt +eingestellt werden, ist es auch möglich, Grafiken im Querformat zu +erstellen (Breite größer als die Höhe). +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all metafile drivers. +
  +
Gruppe: Metafile-Funktionen +
  +
Querverweis: Binding   v_write_meta   Metafile-Format   Sub-Opcodes +
  + +
+ +

7.8.3.6 Bindings für vm_pagesize

+ + + + + + + + + +
C: void vm_pagesize ( int16_t handle, int16_t pgwidth, int16_t +pgheight ); +
  +
Umsetzung: +
  +
void vm_pagesize (int16_t handle, int16_t pgwidth,
+                  int16_t pgheight)
+{
+   intin[0] = 0;
+   intin[1] = pgwidth;
+   intin[2] = pgheight;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 3;
+   contrl[5] = 99;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]3 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]99
contrl+12contrl[6]handle
intinintin[0]0 # Unter-Opcode
intin+2intin[1]pgwidth
intin+4intin[2]pgheight
+
+ + +
+ +

7.8.3.7 v_meta_extents

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Update Metafile Extents« - aktualisiert das Metafile. +
  +
VDI-Nummer: 5 (Escape 98) +
  +
Deklaration: void v_meta_extents ( int16_t handle, int16_t min_x, int16_t +min_y, int16_t max_x, int16_t max_y ); +
  +
Beschreibung: Die Funktion erneuert die Größen-Informationen im Kopf eines +Metafile. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
min_x minimaler x-Wert +
min_y minimaler y-Wert des kleinsten umgebenden Rechteckes (obere +linke Ecke) +
max_x maximaler x-Wert +
max_y maximaler y-Wert des kleinsten umgebenden Rechteckes (untere +rechte Ecke) + +
+ +
Hinweis: Die Größen-Information kann man benutzen, um +schnell die minimalen oder maximalen Ausmaße aller im Metafile +abgespeicherten Primitiven zu ermitteln. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all metafile drivers. +
  +
Gruppe: Metafile-Funktionen +
  +
Querverweis: Binding   GDOS   vm_filename   v_write_meta   Metafile-Format +
  + +
+ +

7.8.3.8 Bindings für v_meta_extents

+ + + + + + + + + +
C: void v_meta_extents ( int16_t handle, int16_t min_x, int16_t +min_y, int16_t max_x, int16_t max_y ); +
  +
Umsetzung: +
  +
void v_meta_extents (int16_t handle, int16_t min_x,
+                     int16_t min_y, int16_t max_x,
+                     int16_t max_y)
+{
+   ptsin[0] = min_x;
+   ptsin[1] = min_y;
+   ptsin[2] = max_x;
+   ptsin[3] = max_y;
+
+   contrl[0] = 5;
+   contrl[1] = 2;
+   contrl[3] = 0;
+   contrl[5] = 98;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]2 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]98 # Escape/Sub-Opcode
contrl+12contrl[6]handle
ptsinptsin[0]min_x
ptsin+2ptsin[1]min_y
ptsin+4ptsin[2]max_x
ptsin+6ptsin[3]max_y
+
+ + +
+ +

7.8.3.9 v_write_meta

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Write Metafile Item« - schreibt ein Objekt in ein Metafile. +
  +
VDI-Nummer: 5 (Escape 99) +
  +
Deklaration: void v_write_meta ( int16_t handle, int16_t num_intin, int16_t +*a_intin, int16_t num_ptsin, int16_t *a_ptsin ); +
  +
Beschreibung: Die Funktion erlaubt es, die in ein Metafile geschriebenen +Parameter mit einem Opcode als benutzerdefinierte Gegenstände zu +markieren. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
num_intin Anzahl der Werte im Intin-Array +
num_ptsin Anzahl der Werte im Ptsin-Array +
a_intin[0] Sub-Opcode (benutzerdefiniert) +
a_intin[1]   +
:   +
:   +
a_intin[num_intin-1] benutzerdefinierte Information +
a_ptsin[0]   +
:   +
:   +
a_ptsin[num_ptsin-1] benutzerdefinierte Information + +
+ +
Hinweis: Die Nummern 0 bis 100 sind reserviert, +d.h. als Sub-Opcodes kommen Nummern ab 101 in Frage. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
a_intinBedeutung
10Start group
11End group
49Set no line style
50Set attribute shadow on
51Set attribute shadow off
80Start draw area type primitive
81End draw area type primitive
+
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all metafile drivers. +
  +
Gruppe: Metafile-Funktionen +
  +
Querverweis: Binding   GDOS   v_meta_extents   Metafile-Format   Sub-Opcodes +
  + +
+ +

7.8.3.10 Bindings für v_write_meta

+ + + + + + + + + +
C: void v_write_meta ( int16_t handle, int16_t num_intin, int16_t +*a_intin, int16_t num_ptsin, int16_t *a_ptsin ); +
  +
Umsetzung: +
  +
void v_write_meta (int16_t handle, int16_t num_intin,
+                   int16_t *a_intin, int16_t num_ptsin,
+                   int16_t *a_ptsin)
+{
+   intin[0..num_intin-1] = a_intin[0..num_intin-1];
+   ptsin[0..num_ptsin-1] = a_ptsin[0..num_ptsin-1];
+
+   contrl[0] = 5;
+   contrl[1] = num_ptsin;
+   contrl[3] = num_intin;
+   contrl[5] = 99;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]num_ptsin # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]num_intin # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]99 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intinintin[0]benutzerdef. Sub-Opcode
intin+2intin[1..n]benutzerdef. Information
ptsinptsin[0..m]benutzerdef. Information
+
+ + +
+ +

7.8.4 Polaroid-Funktionen

+

Diese Bibliothek enthält Funktionen um eine Polaroid-Kamera +ansprechen zu können. Zu diesem Zweck stehen die folgenden Routinen +zur Verfügung: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
vqp_error Fehlercodes des Polaroid-Treibers abfragen. +
vqp_filmname Namen aus einer Filmnummer ermitteln. +
vqp_films Verfügbare Filmtypen ermitteln. +
vqp_state Status des Polaroid-Treibers ermitteln. +
vsc_expose Preview-Möglichkeit für Kamera ein-/ausschalten. +
vsp_film Filmtyp und Belichtungszeit festlegen. +
vsp_message Fehlermeldungen des Polaroid-Treibers unterdrücken oder +zulassen. +
vsp_save Einstellung des Polaroid-Treibers sichern. +
vsp_state Polaroid-Treiber neu einstellen. + +
+ +

Hinweis: Treiber für die Polaroid-Palette sind zum +jetzigen Zeitpunkt nicht existent. Die Funktionen vsp_film, +vqp_filmname und vsc_expose wurden mit PC-GEM Version 2.0 eingeführt, +und ersetzen die anderen 6 Routinen aus GEM 1.x. +

+

Querverweis: Workstations des VDI   Style-Guidelines +

+

7.8.4.1 vqp_error

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Polaroid Error Inquire« - liefert die Nummer eines +aufgetretenen Fehlers. +
  +
VDI-Nummer: 5 (Escape 96) +
  +
Deklaration: int16_t vqp_error ( int16_t handle ); +
  +
Beschreibung: Die Funktion ermittelt den zuletzt aufgetretenen Fehler im +Zusammenhang mit der Polaroid-Kamera für die Kennung handle. +
  +
Ergebnis: Die Funktion liefert: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Wert Bedeutung +
    +
0 kein Fehler +
1 Verschluß offen +
2 kein Port ausgewählt +
3 Palette am gewählten Port nicht verfügbar +
4 Verbindung unterbrochen +
5 Operationssystem erlaubt keine Speicherzuteilung +
6 Pufferspeicher reicht nicht aus +
7 Speicher nicht frei +
8 Gerätetreiber-File fehlt +
9 Gerätetreiber-File hat falsches Format +
10 Film zu Ende + +
+ +
Verfügbar: Ab PC-GEM Version 2.0 steht diese Funktion nicht mehr zur +Verfügung. +
  +
Gruppe: Polaroid-Funktionen +
  +
Querverweis: Binding   GDOS +
  + +
+ +

7.8.4.2 Bindings für vqp_error

+ + + + + + + + + +
C: int16_t vqp_error ( int16_t handle ); +
  +
Umsetzung: +
  +
int16_t vqp_error ( int16_t handle );
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 96;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]96 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intoutintout[0]Return-Wert
+
+ + +
+ +

7.8.4.3 vqp_filmname

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire camera film name« - ermittelt den Namen zu einer +bestimmten Filmnummer +
  +
VDI-Nummer: 5 (Escape 92) +
  +
Deklaration: int16_t vqp_filmname ( int16_t handle, int16_t index, int8_t +*name ); +
  +
Beschreibung: Die Funktion liefert zu einer Filmnummer den entsprechenden +Namen. Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
index Nummer des Filmtyps +
name Name des Films (null-terminiert) + +
+ +
Hinweis: Bei einer falschen Filmnummer erhält man einen +Nullstring als Ergebnis. +
  +
Ergebnis: Die Funktion liefert den Wert 0, wenn eine falsche Filmnummer +übergeben worden ist. +
  +
Verfügbar: Die Funktion steht erst ab PC-GEM Version 2.0 zur +Verfügung. +
  +
Gruppe: Polaroid-Funktionen +
  +
Querverweis: Binding   GDOS +
  + +
+ +

7.8.4.4 Bindings für vqp_filmname

+ + + + + + + + + +
C: int16_t vqp_filmname ( int16_t handle, int16_t index, int8_t +*name ); +
  +
Umsetzung: +
  +
int16_t vqp_filmname (int16_t handle, int16_t index,
+                      int8_t *name)
+{
+   int16_t tmp;
+
+   intin[0] = index;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 92;
+   contrl[6] = handle;
+
+   vdi ();
+
+   for (tmp = 0; tmp < contrl[4]; tmp++)
+      name[tmp] = intout[tmp];
+
+   return ( contrl[4] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]status # Einträge in intout
contrl+10contrl[5]92 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intinintin[0]index
intoutintout[0..24]name[0..24]
+
+ + +
+ +

7.8.4.5 vqp_films

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Polaroid Film Types« - ermittelt Informationen über +einen Film. +
  +
VDI-Nummer: 5 (Escape 91) +
  +
Deklaration: void vqp_films ( int16_t handle, int8_t *film_names ); +
  +
Beschreibung: Die Funktion ermittelt Informationen über einen Film. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
film_names Name, Hersteller und Empfindlichkeit des Films + +
+ +
Hinweis: Der Parameter film_names sollte auf +einen 126 Bytes großen Puffer zeigen, in welchem 5 Einträge zu je 25 +Zeichen abgelegt werden. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Ab PC-GEM Version 2.0 steht diese Funktion nicht mehr zur +Verfügung. +
  +
Gruppe: Polaroid-Funktionen +
  +
Querverweis: GDOS +
  + +
+ +

7.8.4.6 vqp_state

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Polaroid Driver State« - ermittelt den +Gerätezustand des Polaroidbildrecorders. +
  +
Deklaration: void vqp_state ( int16_t handle, int16_t *port, int8_t +*film_name, int16_t *lightness, int16_t *interlace, int16_t *planes, +int16_t *indexes ); +
  +
Beschreibung: Die Funktion ermittelt den Zustand eines +Polaroid-Bildrekorders. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
port Nummer des Ports (0 erster Port) +
film_name Nummer des Filmnamen (0 bis 4) +
lightness Helligkeit (-3 bis 3, wobei eine Stufe einer Drittel Blende +entspricht) +
interlace Bild wird mit (1) oder ohne (0) Zeilensprung abgetastet +
planes Farbanzahl = 2^planes, wobei planes zwischen 1 und 4 liegt +
indexes Festlegung der Farben der Farbpalette. Es wird ein +Speicherplatz von 16 Bytes benötigt. Jede Farbe wird durch eine Zahl +(für die Zeilen der Farbmatrix) und einen Buchstaben von A bis H +(für die Spalten der Farbmatrix) gekennzeichnet. + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Ab PC-GEM Version 2.0 steht diese Funktion nicht mehr zur +Verfügung. +
  +
Gruppe: Polaroid-Funktionen +
  +
Querverweis: GDOS   vsp_state   vsp_save   vsp_message   vqp_films +
  + +
+ +

7.8.4.7 vsc_expose

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Disable or Enable Film Exposure for Frame Preview« - +Ein-/Ausschalten des Previews einer Kamera. +
  +
VDI-Nummer: 5 (Escape 93) +
  +
Deklaration: void vsc_expose ( int16_t handle, int16_t state ); +
  +
Beschreibung: Die Funktion erlaubt es, die Belichtung bei Kameras mit +Preview-Möglichkeit abzuschalten. Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
state Belichtung +
state Belichtung +
+
+ + + + + + + + +
0 =abschalten
<> 0 =einschalten
+
+ + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Diese Funktion steht erst ab PC-GEM Version 2.0 zur Verfügung. +
  +
Gruppe: Polaroid-Funktionen +
  +
Querverweis: Binding   GDOS   vsp_save   vqp_state   vsp_state   vqp_filmsvsp_message +
  + +
+ +

7.8.4.8 Bindings für vsc_expose

+ + + + + + + + + +
C: void vsc_expose ( int16_t handle, int16_t state ); +
  +
Umsetzung: +
  +
void vsc_expose (int16_t handle, int16_t state)
+{
+   intin[0] = state;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 93;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]93 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intinintin[0]state
+
+ + +
+ +

7.8.4.9 vsp_film

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »set camera film type and exposure time« - Filmtyp und +Belichtungszeit festlegen. +
  +
VDI-Nummer: 5 (Escape 91) +
  +
Deklaration: void vsp_film ( int16_t handle, int16_t index, int16_t +lightness ); +
  +
Beschreibung: Die Funktion legt den Filmtyp und die Belichtungszeit fest. Es +gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
index Nummer des Filmtyps +
lightness Belichtungszeit + + + + + + + + + +
-3 = halbe +
0 = normale +
3 = doppelte + +
+ + +
+ +
Hinweis: Mit steigendem Wert des Parameters +lightness wird die Blendenzahl um ein Drittel erhöht. Die +gültigen Indizes für index können per vqp_filmname +ermittelt werden. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Die Funktion steht erst ab PC-GEM Version 2.0 zur Verfügung. +
  +
Gruppe: Polaroid-Funktionen +
  +
Querverweis: Binding   GDOS +
  + +
+ +

7.8.4.10 Bindings für vsp_film

+ + + + + + + + + +
C: void vsp_film ( int16_t handle, int16_t index, int16_t +lightness ); +
  +
Umsetzung: +
  +
void vsp_film (int16_t handle, int16_t index,
+               int16_t lightness)
+{
+   intin[0] = index;
+   intin[1] = lightenss;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[5] = 91;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]2 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]91 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intinintin[0]index
intin+2intin[1]lightness
+
+ + +
+ +

7.8.4.11 vsp_message

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Suppress Polaroid Message« - unterdrückt Fehlermeldungen +des Polaroidbildrecorders. +
  +
Deklaration: void vsp_message ( int16_t handle ); +
  +
Beschreibung: Die Funktion unterdrückt Fehlermeldungen des +Polaroid-Bildrekorders mit der Kennung handle. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Die Funktion steht erst ab PC-GEM Version 2.0 zur Verfügung. +
  +
Gruppe: Polaroid-Funktionen +
  +
Querverweis: GDOS   vqp_error +
  + +
+ +

7.8.4.12 vsp_save

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Save Polaroid Driver State« - speichert den Gerätestatus +des Polaroidbildrecorders. +
  +
Deklaration: void vsp_save ( int16_t handle ); +
  +
Beschreibung: Die Funktion speichert den Status eines Polaroid-Bildrekorders +mit der Kennung handle. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Ab PC-GEM Version 2.0 steht diese Funktion nicht mehr zur +Verfügung. +
  +
Gruppe: Polaroid-Funktionen +
  +
Querverweis: GDOS   vqp_state   vsp_state   vsp_message   vqp_films   +vsc_expose +
  + +
+ +

7.8.4.13 vsp_state

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Set Polaroid Driver State« - setzt den Ausgabezustand des +Polaroidrecorders. +
  +
Deklaration: void vsp_state ( int16_t handle, int16_t port, int16_t +film_num, int16_t lightness, int16_t interlace, int16_t planes, +int16_t *indexes ); +
  +
Beschreibung: Die Funktion setzt den Ausgabezustand eines +Polaroid-Bildrekorders. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
port Nummer des Ports (0 erster Port) +
film_num Nummer des Filmnamen (0 bis 4) +
lightness Helligkeit (-3 bis 3, wobei eine Stufe einer Drittel Blende +entspricht) +
interlace Bild wird mit (1) oder ohne (0) Zeilensprung abgetastet +
planes Farbanzahl = 2^planes, wobei planes zwischen 1 und 4 liegt +
indexes Festlegung der Farben der Farbpalette. Es wird ein +Speicherplatz von 16 Bytes benötigt. Jede Farbe wird durch eine Zahl +(für die Zeilen der Farbmatrix) und einen Buchstaben von A bis H +(für die Spalten der Farbmatrix) gekennzeichnet. + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Ab PC-GEM Version 2.0 steht diese Funktion nicht mehr zur +Verfügung. +
  +
Gruppe: Polaroid-Funktionen +
  +
Querverweis: GDOS   vsc_expose   vqp_state   vsp_save   vsp_message   +vqp_films +
  + +
+ +

7.8.5 Sound-Funktionen

+

This library contains functions for audio playback through +supported sound system; the following routines are available for this +purpose: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
vmid_load Loads a MIDI file +
vmid_play Plays a MIDI file +
vmid_unload Releases memory occupied by a MIDI file +
vqspl_position_d2d Gets current position when playing through D2D +
vqspl_position_dma Gets current position when playing through DMA +
vqspl_status_d2d Gets current D2D status +
vqspl_status_dma Gets current DMA status +
vqspl_time_left_d2d Gets remaining time when playing through D2D +
vspl_load_d2d Loads an audio file for playing through D2D +
vspl_load_sample Loads a sample for DMA playback +
vspl_make_d2d Continues D2D playback +
vspl_pause_d2d Suspends D2D playback +
vspl_pause_dma Suspends DMA playback +
vspl_play Plays an audio file +
vspl_play_d2d Starts playback of an audio file through D2D +
vspl_play_dma Plays a sample through DMA +
vspl_stop_d2d Stops D2D playback +
vspl_stop_dma Stops DMA playback +
vspl_unload_d2d Releases memory allocated for the D2D playback +
vspl_unload_sample Releases memory occupied by a sample +
vsspl_monitor_off Disables monitoring +
vsspl_monitor_on Enables monitoring + +
+ +

Note: Currently the unit of time for the start +position and for the returned remaining time is unknown. The +purpose of monitoring is also unknown. +

+

Querverweis: Workstations des VDI   Style-Guidelines +

+

7.8.5.1 vmid_load

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Load Midifile« - Loads a MIDI file +
  +
VDI-Nummer: 5 (4000) +
  +
Deklaration: int16_t vmid_load( int16_t handle, int8_t *fname, uint32_t +position ); +
  +
Beschreibung: The call vmid_load loads the MIDI file fname from the +position position into memory. +
  +
Ergebnis: An error has arisen only if the value 0 is returned. +
  +
Verfügbar: SpeedoGDOS mit MIDI-Sound-Treiber. +
  +
Gruppe: Sound-Funktionen +
  +
Querverweis: Binding   vmid_play   vmid_unload +
  + +
+ +
7.8.5.1.1 Bindings für vmid_load
+ + + + + + + + + +
C: int16_t vmid_load( int16_t handle, int8_t *fname, uint32_t +position ); +
  +
Umsetzung: +
  +
int16_t vmid_load(int16_t handle, int8_t *fname, uint32_t position)
+{
+   int16_t tmp;
+
+   intin[0..1] = position;
+
+   tmp = 2;
+   while (intin[tmp++] = *fname++)
+      ;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = --tmp;
+   contrl[5] = 4000;
+   contrl[6] = handle;
+
+   vdi();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]n # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]4000 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0..1]position
intin+4intin[2..n-1]fname
intoutintout[0]Return-Wert
+
+ + +
+ +

7.8.5.2 vmid_play

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Play Midifile« - Replay a MIDI file +
  +
VDI-Nummer: 5 (4002) +
  +
Deklaration: void vmid_play( int16_t handle ); +
  +
Beschreibung: The call vmid_play starts the playback of a MIDI file loaded +previously with vmid_load. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: SpeedoGDOS mit MIDI-Sound-Treiber. +
  +
Gruppe: Sound-Funktionen +
  +
Querverweis: Binding   vmid_load   vmid_unload +
  + +
+ +
7.8.5.2.1 Bindings für vmid_play
+ + + + + + + + + +
C: void vmid_play( int16_t handle ); +
  +
Umsetzung: +
  +
void vmid_play(int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 4002;
+   contrl[6] = handle;
+
+   vdi();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]4002 # Escape/Sub-opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.5.3 vmid_unload

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Unload Midifile« - Unload a MIDI file +
  +
VDI-Nummer: 5 (4001) +
  +
Deklaration: void vmid_unload( int16_t handle ); +
  +
Beschreibung: The call vmid_unload releases the memory allocated for MIDI +playback. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: SpeedoGDOS mit MIDI-Sound-Treiber. +
  +
Gruppe: Sound-Funktionen +
  +
Querverweis: Binding   vmid_load   vmid_play +
  + +
+ +
7.8.5.3.1 Bindings für vmid_unload
+ + + + + + + + + +
C: void vmid_unload( int16_t handle ); +
  +
Umsetzung: +
  +
void vmid_unload(int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 4001;
+   contrl[6] = handle;
+
+   vdi();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]4001 # Escape/Sub-opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.5.4 vqspl_position_d2d

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire D2D position« - Gets the current D2D playback +position +
  +
VDI-Nummer: 5 (3017) +
  +
Deklaration: uint32_t vqspl_position_d2d( int16_t handle ); +
  +
Beschreibung: The call vqspl_position_d2d returns the current position of the +audio file being played through D2D. +
  +
Ergebnis: Die Funktion liefert die aktuelle Position. +
  +
Verfügbar: SpeedoGDOS mit Sound-Treiber. +
  +
Gruppe: Sound-Funktionen +
  +
Querverweis: Binding   vqspl_status_d2d   vqspl_time_left_d2d   vspl_load_d2dvspl_make_d2d   vspl_pause_d2d   vspl_play_d2d   vspl_stop_d2d   +vspl_unload_d2d +
  + +
+ +
7.8.5.4.1 Bindings für vqspl_position_d2d
+ + + + + + + + + +
C: uint32_t vqspl_position_d2d( int16_t handle ); +
  +
Umsetzung: +
  +
uint32_t vqspl_position_d2d(int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 3017;
+   contrl[6] = handle;
+
+   vdi();
+
+   return intout[0..1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]2 # Einträge in intout
contrl+10contrl[5]3017 # Escape/Sub-opcode
contrl+12contrl[6]handle
intoutintout[0..1]Return-Wert
+
+ + +
+ +

7.8.5.5 vqspl_position_dma

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire DMA position« - Gets the DMA position +
  +
VDI-Nummer: 5 (3006) +
  +
Deklaration: uint32_t vqspl_position_dma( int16_t handle, int16_t id ); +
  +
Beschreibung: The call vqspl_position_dma obtains the current sample DMA +position for the sample identified by id. +
  +
Ergebnis: This function returns the sample DMA position. +
  +
Verfügbar: SpeedoGDOS mit Sound-Treiber. +
  +
Gruppe: Sound-Funktionen +
  +
Querverweis: Binding   vqspl_status_dma   vspl_load_sample   vspl_pause_dma   +vspl_play_dma   vspl_stop_dma   vspl_unload_sample +
  + +
+ +
7.8.5.5.1 Bindings für vqspl_position_dma
+ + + + + + + + + +
C: uint32_t vqspl_position_dma( int16_t handle, int16_t id ); +
  +
Umsetzung: +
  +
uint32_t vqspl_position_dma(int16_t handle, int16_t id)
+{
+   intin[0] = id;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 3006;
+   contrl[6] = handle;
+
+   vdi();
+
+   return ( intout[0..1] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]2 # Einträge in intout
contrl+10contrl[5]3006 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]id
intoutintout[0..1]Return-Werte
+
+ + +
+ +

7.8.5.6 vqspl_status_d2d

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire D2D status« - Gets the current status of the D2D +audio system +
  +
VDI-Nummer: 5 (3016) +
  +
Deklaration: int16_t vqspl_status_d2d( int16_t handle ); +
  +
Beschreibung: The call vqspl_status_d2d returns the current status of the D2D +audio system. +
  +
Ergebnis: Die Funktion liefert die aktuelle Status. If nonzero, the D2D +audio system is ready to process the next audio data from disk through +a call to vspl_make_d2d. +
  +
Verfügbar: SpeedoGDOS mit Sound-Treiber. +
  +
Gruppe: Sound-Funktionen +
  +
Querverweis: Binding   vqspl_position_d2d   vqspl_time_left_d2d   +vspl_load_d2d   vspl_make_d2d   vspl_pause_d2d   vspl_play_d2d   +vspl_stop_d2d   vspl_unload_d2d +
  + +
+ +
7.8.5.6.1 Bindings für vqspl_status_d2d
+ + + + + + + + + +
C: int16_t vqspl_status_d2d( int16_t handle ); +
  +
Umsetzung: +
  +
int16_t vqspl_status_d2d(int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 3016;
+   contrl[6] = handle;
+
+   vdi();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]3016 # Escape/Sub-opcode
contrl+12contrl[6]handle
intoutintout[0]Return-Wert
+
+ + +
+ +

7.8.5.7 vqspl_status_dma

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire DMA status« - Gets the current DMA status +
  +
VDI-Nummer: 5 (3005) +
  +
Deklaration: int16_t vqspl_status_dma( int16_t handle, int16_t id ); +
  +
Beschreibung: The call vqspl_status_dma obtains the current sample DMA status +for the sample identified by id. +
  +
Ergebnis: This function returns the sample DMA status (sound currently +playing if bit 0 = 1). +
  +
Verfügbar: SpeedoGDOS mit Sound-Treiber. +
  +
Gruppe: Sound-Funktionen +
  +
Querverweis: Binding   vqspl_position_dma   vspl_load_sample   vspl_pause_dmavspl_play_dma   vspl_stop_dma   vspl_unload_sample +
  + +
+ +
7.8.5.7.1 Bindings für vqspl_status_dma
+ + + + + + + + + +
C: int16_t vqspl_status_dma( int16_t handle, int16_t id ); +
  +
Umsetzung: +
  +
int16_t vqspl_status_dma(int16_t handle, int16_t id)
+{
+   intin[0] = id;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 3005;
+   contrl[6] = handle;
+
+   vdi();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]3005 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]id
intoutintout[0]Return-Wert
+
+ + +
+ +

7.8.5.8 vqspl_time_left_d2d

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »vqspl_time_left_d2d« - Gets the D2D remaining playing time +
  +
VDI-Nummer: 5 (3018) +
  +
Deklaration: int16_t vqspl_time_left_d2( int16_t handle ); +
  +
Beschreibung: The call vqspl_time_left_d2d returns the remaining playing time +on the D2D audio system. +
  +
Ergebnis: This function returns the remaining playing time. +
  +
Verfügbar: SpeedoGDOS mit Sound-Treiber. +
  +
Gruppe: Sound-Funktionen +
  +
Querverweis: Binding   vqspl_position_d2d   vqspl_status_d2d   vspl_load_d2dvspl_make_d2d   vspl_pause_d2d   vspl_play_d2d   vspl_stop_d2d   +vspl_unload_d2d +
  + +
+ +
7.8.5.8.1 Bindings für vqspl_time_left_d2d
+ + + + + + + + + +
C: int16_t vqspl_time_left_d2d( int16_t handle ); +
  +
Umsetzung: +
  +
int16_t vqspl_time_left_d2d(int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 3018;
+   contrl[6] = handle;
+
+   vdi();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]3018 # Escape/Sub-opcode
contrl+12contrl[6]handle
intoutintout[0]Return-Wert
+
+ + +
+ +

7.8.5.9 vspl_load_d2d

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Prepare D2D playback« - Loads an audio file +
  +
VDI-Nummer: 5 (3011) +
  +
Deklaration: int16_t vspl_load_d2d( int16_t handle, int8_t *fname, uint32_t +position ); +
  +
Beschreibung: The call vspl_load_d2d loads the file fname from the +position position into memory for D2D playback. +
  +
Ergebnis: An error has arisen only if the value 0 is returned. +
  +
Verfügbar: SpeedoGDOS mit Sound-Treiber. +
  +
Gruppe: Sound-Funktionen +
  +
Querverweis: Binding   vqspl_position_d2d   vqspl_status_d2d   +vqspl_time_left_d2d   vspl_make_d2d   vspl_pause_d2d   vspl_play_d2d   +vspl_stop_d2d   vspl_unload_d2d +
  + +
+ +
7.8.5.9.1 Bindings für vspl_load_d2d
+ + + + + + + + + +
C: int16_t vspl_load_d2d( int16_t handle, int8_t *fname, uint32_t +position ); +
  +
Umsetzung: +
  +
int16_t vspl_load_d2d(int16_t handle, int8_t *fname, uint32_t position)
+{
+   int16_t tmp;
+
+   intin[0..1] = position;
+
+   tmp = 2;
+   while (intin[tmp++] = *fname++)
+      ;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = --tmp;
+   contrl[5] = 3011;
+   contrl[6] = handle;
+
+   vdi();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]n # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]3011 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0..1]position
intin+4intin[2..n-1]fname
intoutintout[0]Return-Wert
+
+ + +
+ +

7.8.5.10 vspl_load_sample

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Load sample« - Loads an audio file +
  +
VDI-Nummer: 5 (3001) +
  +
Deklaration: int16_t vspl_load_sample( int16_t handle, int8_t *fname, +uint32_t position ); +
  +
Beschreibung: The call vspl_load_sample loads the file fname from the +position position into memory. Multiple samples can be loaded +into a single workstation, each sample is identified by an index. +
  +
Ergebnis: This function returns the corresponding sample index. +
  +
Verfügbar: SpeedoGDOS mit Sound-Treiber. +
  +
Gruppe: Sound-Funktionen +
  +
Querverweis: Binding   vqspl_position_dma   vqspl_status_dma   vspl_pause_dmavspl_play_dma   vspl_stop_dma   vspl_unload_sample +
  + +
+ +
7.8.5.10.1 Bindings für vspl_load_sample
+ + + + + + + + + +
C: int16_t vspl_load_sample( int16_t handle, int8_t *fname, +uint32_t position ); +
  +
Umsetzung: +
  +
int16_t vspl_load_sample(int16_t handle, int8_t *fname, uint32_t position)
+{
+   int16_t tmp;
+
+   intin[0..1] = position;
+
+   tmp = 2;
+   while (intin[tmp++] = *fname++)
+      ;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = --tmp;
+   contrl[5] = 3001;
+   contrl[6] = handle;
+
+   vdi();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]n # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]3001 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0..1]position
intin+4intin[2..n-1]fname
intoutintout[0]Return-Wert
+
+ + +
+ +

7.8.5.11 vspl_make_d2d

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Make D2D playback« - Continues D2D playback +
  +
VDI-Nummer: 5 (3020) +
  +
Deklaration: void vspl_make_d2d( int16_t handle ); +
  +
Beschreibung: The call vspl_make_d2d continues the D2D playback of the file +previously started with vspl_play_d2d. +
  +
The D2D status should be checked regularly with vqspl_status_d2d +in order to call vspl_make_d2d whenever the system is ready. +
  +
During this loop, buffoper(-1) has the bit 0 set to 1 throughout +the playback. buffoper(-1) returns a value with bit 0 set to 0 at the +end of the playback. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: SpeedoGDOS mit Sound-Treiber. +
  +
Gruppe: Sound-Funktionen +
  +
Querverweis: Binding   vqspl_position_d2d   vqspl_status_d2d   +vqspl_time_left_d2d   vspl_load_d2d   vspl_pause_d2d   vspl_play_d2d   +vspl_stop_d2d   vspl_unload_d2d +
  + +
+ +
7.8.5.11.1 Bindings für vspl_make_d2d
+ + + + + + + + + +
C: void vspl_make_d2d( int16_t handle ); +
  +
Umsetzung: +
  +
void vspl_make_d2d(int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 3020;
+   contrl[6] = handle;
+
+   vdi();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]3020 # Escape/Sub-opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.5.12 vspl_pause_d2d

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pause D2D playback« - Suspends the D2D audio playback +
  +
VDI-Nummer: 5 (3014) +
  +
Deklaration: void vspl_pause_d2d( int16_t handle ); +
  +
Beschreibung: The call vspl_pause_d2d suspends the D2D playback of the file +previously loaded with vspl_load_d2d. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: SpeedoGDOS mit Sound-Treiber. +
  +
Gruppe: Sound-Funktionen +
  +
Querverweis: Binding   vqspl_position_d2d   vqspl_status_d2d   +vqspl_time_left_d2d   vspl_load_d2d   vspl_make_d2d   vspl_play_d2d   +vspl_stop_d2d   vspl_unload_d2d +
  + +
+ +
7.8.5.12.1 Bindings für vspl_pause_d2d
+ + + + + + + + + +
C: void vspl_pause_d2d( int16_t handle ); +
  +
Umsetzung: +
  +
void vspl_pause_d2d(int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 3014;
+   contrl[6] = handle;
+
+   vdi();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]3014 # Escape/Sub-opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.5.13 vspl_pause_dma

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pause DMA playback« - Suspends the DMA playback of a sample +
  +
VDI-Nummer: 5 (3007) +
  +
Deklaration: void vspl_pause_dma( int16_t handle, int16_t id ); +
  +
Beschreibung: The call vspl_pause_dma suspends the playback of the sample +identified by id. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: SpeedoGDOS mit Sound-Treiber. +
  +
Gruppe: Sound-Funktionen +
  +
Querverweis: Binding   vqspl_position_dma   vqspl_status_dma   +vspl_load_sample   vspl_play_dma   vspl_stop_dma   vspl_unload_sample +
  + +
+ +
7.8.5.13.1 Bindings für vspl_pause_dma
+ + + + + + + + + +
C: void vspl_pause_dma( int16_t handle, int16_t id ); +
  +
Umsetzung: +
  +
void vspl_pause_dma(int16_t handle, int16_t id)
+{
+   intin[0] = id;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 3007;
+   contrl[6] = handle;
+
+   vdi();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]3007 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]id
+
+ + +
+ +

7.8.5.14 vspl_play

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Play sample« - Plays an audio file +
  +
VDI-Nummer: 5 (3000) +
  +
Deklaration: void vspl_play( int16_t handle, int8_t *fname, uint32_t +position ); +
  +
Beschreibung: The call vspl_play starts the playback of the file +fname from the position position. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: SpeedoGDOS mit Sound-Treiber. +
  +
Gruppe: Sound-Funktionen +
  +
Querverweis: Binding +
  + +
+ +
7.8.5.14.1 Bindings für vspl_play
+ + + + + + + + + +
C: void vspl_play( int16_t handle, int8_t *fname, uint32_t +position ); +
  +
Umsetzung: +
  +
void vspl_play(int16_t handle, int8_t *fname, uint32_t position)
+{
+   int16_t tmp;
+
+   intin[0..1] = position;
+
+   tmp = 2;
+   while (intin[tmp++] = *fname++)
+      ;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = --tmp;
+   contrl[5] = 3000;
+   contrl[6] = handle;
+
+   vdi();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]n # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]3000 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0..1]position
intin+4intin[2..n-1]fname
+
+ + +
+ +

7.8.5.15 vspl_play_d2d

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Start D2D playback« - Plays an audio file through the D2D +sound system +
  +
VDI-Nummer: 5 (3013) +
  +
Deklaration: void vspl_play_d2d( int16_t handle ); +
  +
Beschreibung: The call vspl_play_d2d starts the playback of the file +previously loaded with vspl_load_d2d. +
  +
After calling this function, the D2D status should be checked +regularly with vqspl_status_d2d in order to call vspl_make_d2d +whenever the system is ready. +
  +
During this loop, buffoper(-1) has the bit 0 set to 1 throughout +the playback. buffoper(-1) returns a value with bit 0 set to 0 at the +end of the playback. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: SpeedoGDOS mit Sound-Treiber. +
  +
Gruppe: Sound-Funktionen +
  +
Querverweis: Binding   vqspl_position_d2d   vqspl_status_d2d   +vqspl_time_left_d2d   vspl_load_d2d   vspl_make_d2d   vspl_pause_d2d   +vspl_stop_d2d   vspl_unload_d2d +
  + +
+ +
7.8.5.15.1 Bindings für vspl_play_d2d
+ + + + + + + + + +
C: void vspl_play_d2d( int16_t handle ); +
  +
Umsetzung: +
  +
void vspl_play_d2d(int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 3013;
+   contrl[6] = handle;
+
+   vdi();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]3013 # Escape/Sub-opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.5.16 vspl_play_dma

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Start DMA playback« - Plays a sample through the DMA sound +system +
  +
VDI-Nummer: 5 (3003) +
  +
Deklaration: void vspl_play_dma( int16_t handle, int16_t id ); +
  +
Beschreibung: The call vspl_play_dma starts the playback of the sample +identified by id. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: SpeedoGDOS mit Sound-Treiber. +
  +
Gruppe: Sound-Funktionen +
  +
Querverweis: Binding   vqspl_position_dma   vqspl_status_dma   +vspl_load_sample   vspl_pause_dma   vspl_stop_dma   vspl_unload_sample +
  + +
+ +
7.8.5.16.1 Bindings für vspl_play_dma
+ + + + + + + + + +
C: void vspl_play_dma( int16_t handle, int16_t id ); +
  +
Umsetzung: +
  +
void vspl_play_dma(int16_t handle, int16_t id)
+{
+   intin[0] = id;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 3003;
+   contrl[6] = handle;
+
+   vdi();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]3003 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]id
+
+ + +
+ +

7.8.5.17 vspl_stop_d2d

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Stop D2D playback« - Stops the D2D audio playback +
  +
VDI-Nummer: 5 (3015) +
  +
Deklaration: void vspl_stop_d2d( int16_t handle ); +
  +
Beschreibung: The call vsp_stop_d2d stops the D2D playback of the file +previously loaded with vspl_load_d2d. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: SpeedoGDOS mit Sound-Treiber. +
  +
Gruppe: Sound-Funktionen +
  +
Querverweis: Binding   vqspl_position_d2d   vqspl_status_d2d   +vqspl_time_left_d2d   vspl_load_d2d   vspl_make_d2d   vspl_pause_d2d   +vspl_play_d2d   vspl_unload_d2d +
  + +
+ +
7.8.5.17.1 Bindings für vspl_stop_d2d
+ + + + + + + + + +
C: void vspl_stop_d2d( int16_t handle ); +
  +
Umsetzung: +
  +
void vspl_stop_d2d(int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 3015;
+   contrl[6] = handle;
+
+   vdi();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]3015 # Escape/Sub-opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.5.18 vspl_stop_dma

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Stop DMA playback« - Stops the DMA playback of a sample +
  +
VDI-Nummer: 5 (3004) +
  +
Deklaration: void vspl_stop_dma( int16_t handle, int16_t id ); +
  +
Beschreibung: The call vspl_stop_dma stops the playback of the sample +identified by id. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: SpeedoGDOS mit Sound-Treiber. +
  +
Gruppe: Sound-Funktionen +
  +
Querverweis: Binding   vqspl_position_dma   vqspl_status_dma   +vspl_load_sample   vspl_pause_dma   vspl_play_dma   vspl_unload_sample +
  + +
+ +
7.8.5.18.1 Bindings für vspl_stop_dma
+ + + + + + + + + +
C: void vspl_stop_dma( int16_t handle, int16_t id ); +
  +
Umsetzung: +
  +
void vspl_stop_dma(int16_t handle, int16_t id)
+{
+   intin[0] = id;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 3004;
+   contrl[6] = handle;
+
+   vdi();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]3004 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]id
+
+ + +
+ +

7.8.5.19 vspl_unload_d2d

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Unload D2D sample« - Unload an audio file +
  +
VDI-Nummer: 5 (3012) +
  +
Deklaration: void vspl_unload_d2d( int16_t handle ); +
  +
Beschreibung: The call vspl_unload_d2d releases the memory allocated with +vspl_load_d2d for MIDI playback. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: SpeedoGDOS mit Sound-Treiber. +
  +
Gruppe: Sound-Funktionen +
  +
Querverweis: Binding   vqspl_position_d2d   vqspl_status_d2d   +vqspl_time_left_d2d   vspl_load_d2d   vspl_make_d2d   vspl_pause_d2d   +vspl_play_d2d   vspl_stop_d2d +
  + +
+ +
7.8.5.19.1 Bindings für vspl_unload_d2d
+ + + + + + + + + +
C: void vspl_unload_d2d( int16_t handle ); +
  +
Umsetzung: +
  +
void vspl_unload_d2d(int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 3012;
+   contrl[6] = handle;
+
+   vdi();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]3012 # Escape/Sub-opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.5.20 vspl_unload_sample

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Unload sample« - Unloads a sample +
  +
VDI-Nummer: 5 (3002) +
  +
Deklaration: void vspl_unload_sample( int16_t handle, int16_t id ); +
  +
Beschreibung: The call vspl_unload_sample unloads the sample identified by +id. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: SpeedoGDOS mit Sound-Treiber. +
  +
Gruppe: Sound-Funktionen +
  +
Querverweis: Binding   vqspl_position_dma   vqspl_status_dma   +vspl_load_sample   vspl_pause_dma   vspl_play_dma   vspl_stop_dma +
  + +
+ +
7.8.5.20.1 Bindings für vspl_unload_sample
+ + + + + + + + + +
C: void vspl_unload_sample( int16_t handle, int16_t id ); +
  +
Umsetzung: +
  +
void vspl_unload_sample(int16_t handle, int16_t id)
+{
+   intin[0] = id;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 3002;
+   contrl[6] = handle;
+
+   vdi();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]3002 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]id
+
+ + +
+ +

7.8.5.21 vsspl_monitor_off

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Monitor off« - Disables monitoring of the sound system +
  +
VDI-Nummer: 5 (3031) +
  +
Deklaration: void vsspl_monitor_off( int16_t handle ); +
  +
Beschreibung: The call vsspl_monitor_off disables the monitoring of the sound +system. +
  +
Note: What the monitoring actually does is currently +unknown. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: SpeedoGDOS mit Sound-Treiber. +
  +
Gruppe: Sound-Funktionen +
  +
Querverweis: Binding   vsspl_monitor_on +
  + +
+ +
7.8.5.21.1 Bindings für vsspl_monitor_off
+ + + + + + + + + +
C: void vsspl_monitor_off( int16_t handle ); +
  +
Umsetzung: +
  +
void vsspl_monitor_off(int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 3031;
+   contrl[6] = handle;
+
+   vdi();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]3031 # Escape/Sub-opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.5.22 vsspl_monitor_on

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Monitor on« - Enables monitoring +
  +
VDI-Nummer: 5 (3030) +
  +
Deklaration: void vsspl_monitor_on( int16_t handle ); +
  +
Beschreibung: The call vsspl_monitor_on enables the monitoring of the sound +system. +
  +
Note: What the monitoring actually does is currently +unknown. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: SpeedoGDOS mit Sound-Treiber. +
  +
Gruppe: Sound-Funktionen +
  +
Querverweis: Binding   vsspl_monitor_off +
  + +
+ +
7.8.5.22.1 Bindings für vsspl_monitor_on
+ + + + + + + + + +
C: void vsspl_monitor_on( int16_t handle ); +
  +
Umsetzung: +
  +
void vsspl_monitor_on(int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 3030;
+   contrl[6] = handle;
+
+   vdi();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]3030 # Escape/Sub-opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.6 Spezialfunktionen

+

Diese Bibliothek enthält Funktionen für sehr spezielle Zwecke, +die sich nicht einer der übrigen Gruppen für Escapefunktionen +zuordnen lassen. Es stehen die folgenden Routinen zur Verfüggung: +

+ + + + + + + + + + + + + + + +
v_escape2000 Spezialfunktion für ATARI-Page-Printer. +
v_fontinit Eigenen Systemzeichensatz auswählen. +
v_offset Abstand zum linken Bildschirmrand festlegen. +
v_sound Ton generieren. +
vs_mute Ein-/Ausschalten der Tonerzeugung. + +
+ +

Querverweis: Workstations des VDI   Style-Guidelines +

+

7.8.6.1 v_escape2000

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Escape 2000« - Spezialfunktion für ATARI-Page-Printer. +
  +
VDI-Nummer: 5 (Escape 2000) +
  +
Deklaration: void v_escape2000 ( int16_t handle, int16_t times ); +
  +
Beschreibung: Die Funktion druckt beliebig viele Kopien der laufenden Seite. +Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
times Anzahl der zusätzlich zu druckenden Kopien + +
+ +
Hinweis: Die Funktion arbeitet nur in Zusammenhang mit +den Atari-SLM-Laserdruckern; deshalb sollte besser auf die Funktion +v_copies zurückgegriffen werden. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported only with some laser printer drivers (for instance +the Atari laser printer driver) under some form of GDOS. +
  +
Gruppe: Spezialfunktionen +
  +
Querverweis: Binding   GDOS +
  + +
+ +

7.8.6.2 Bindings für v_escape2000

+ + + + + + + + + +
C: void v_escape2000 ( int16_t handle, int16_t times ); +
  +
Umsetzung: +
  +
void v_escape2000 (int16_t handle, int16_t times)
+{
+   intin[0] = times;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 2000;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]2000 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intinintin[0]times
+
+ + +
+ +

7.8.6.3 v_fontinit

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Init System Font« - initialisiert einen Zeichensatz. +
  +
VDI-Nummer: 5 (Escape 102) +
  +
Deklaration: void v_fontinit ( int16_t handle, int16_t fh_high, int16_t +fh_low ); +
  +
Beschreibung: Die Funktion installiert einen angegebenen Zeichensatz als +Systemzeichensatz. Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
fh_high Adresse des Zeichensatzkopfes (high) +
fh_low Adresse des Zeichensatzkopfes (low) + +
+ +
Hinweis: Die Funktion ist in keiner offiziellen +Dokumentation beschrieben - Benutzung auf eigene Gefahr. Eigene +Versuche ergaben, daß die Zeichenbreite konstant acht Pixel und der +Zeichensatz im Motorola-Format vorliegen muß. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: All TOS versions; ROM-Bildschirmtreiber +
  +
Gruppe: Spezialfunktionen +
  +
Querverweis: Binding   Header bei Bitmap GDOS-Fonts +
  + +
+ +

7.8.6.4 Bindings für v_fontinit

+ + + + + + + + + +
C: void v_fontinit ( int16_t handle, int16_t fh_high, int16_t +fh_low ); +
  +
Umsetzung: +
  +
void v_fontinit (int16_t handle, int16_t fh_high,
+                 int16_t fh_low)
+{
+   intin[0] = fh_high;
+   intin[1] = fh_low;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[5] = 102;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]2 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]102 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intinintin[0]fh_high
intin+2intin[1]fh_low
+
+ +
Hinweis: In den Feldern intin[0..1] wird dabei der +Zeiger auf den Zeichensatzkopf abgelegt. +
  + +
+ +

7.8.6.5 v_offset

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Line Offset« - setzt den linken Rand. +
  +
VDI-Nummer: 5 (Escape 101) +
  +
Deklaration: void v_offset ( int16_t handle, int16_t offset ); +
  +
Beschreibung: Die Funktion setzt den Offset in Rasterzeilen zum Beginn des +logischen Bildschirms. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
offset Anzahl der Rasterzeilen unterhalb der oberen Bildschirmkante, +von der ab der logische Bildschirm beginnen soll + +
+ +
Hinweis: Diese Funktion ist in keiner +offiziellen Dokumentation beschrieben - Benutzung auf eigene +Gefahr. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: ROM-Bildschirmtreiber +
  +
Gruppe: Spezialfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.8.6.6 Bindings für v_offset

+ + + + + + + + + +
C: void v_offset ( int16_t handle, int16_t offset ); +
  +
Umsetzung: +
  +
void v_offset (int16_t handle, int16_t offset)
+{
+   intin[0] = offset;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 101;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]101 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intinintin[0]offset
+
+ + +
+ +

7.8.6.7 v_sound

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »generate specified tone« - Ton generieren. +
  +
VDI-Nummer: 5 (Escape 61) +
  +
Deklaration: void v_sound ( int16_t handle, int16_t frequency, int16_t +duration ); +
  +
Beschreibung: Die Funktion erzeugt einen Ton einer bestimmten Länge und +Frequenz. Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
frequency Tonhöhe in Hertz +
duration Tonlänge in Timer-Ticks + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Die Funktion steht nur unter PC-GEM ab Version 2.0 zur +Verfügung. +
  +
Gruppe: Spezialfunktionen +
  +
Querverweis: Binding   GDOS   vs_mute +
  + +
+ +

7.8.6.8 Bindings für v_sound

+ + + + + + + + + +
C: void v_sound ( int16_t handle, int16_t frequency, int16_t +duration ); +
  +
Umsetzung: +
  +
void v_sound (int16_t handle, int16_t frequency,
+              int16_t duration)
+{
+   intin[0] = frequency;
+   intin[1] = duration;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[5] = 61;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]2 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]61 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intinintin[0]frequency
intin+2intin[1]duration
+
+ + +
+ +

7.8.6.9 vs_mute

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »set/clear tone muting flag« - Ein-/Ausschalten der +Tonerzeugung. +
  +
VDI-Nummer: 5 (Escape 62) +
  +
Deklaration: int16_t vs_mute ( int16_t handle, int16_t action ); +
  +
Beschreibung: Die Funktion setzt bzw. löscht das Tonflag, oder liefert +dessen Status zurück. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
action gewünschte Aktion + + + + + + + + + +
-1 = Status abfragen +
 0 = Tonerzeugung ein +
 1 = Tonerzeugung aus + +
+ + +
+ +
Hinweis: +
  +
Ergebnis: Die Funktion liefert den Status der Tonerzeugung. +
  +
Verfügbar: Die Funktion steht nur unter PC-GEM ab Version 2.0 zur +Verfügung. +
  +
Gruppe: Spezialfunktionen +
  +
Querverweis: Binding   GDOS   v_sound +
  + +
+ +

7.8.6.10 Bindings für vs_mute

+ + + + + + + + + +
C: int16_t vs_mute ( int16_t handle, int16_t action ); +
  +
Umsetzung: +
  +
int16_t vs_mute (int16_t handle, int16_t action)
+{
+   intin[0] = action;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 62;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]62 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intinintin[0]action
intoutintout[0]Return-Wert
+
+ + +
+ +

7.8.7 Text-Funktionen

+

Diese Bibliothek enthält Funktionen zur Ansteuerung des +alphanumerischen Bildschirms; zu diesem Zweck stehen die folgenden +Routinen zur Verfügung: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
v_alpha_text Ausgabe von Text im Textmodus. +
v_curdown Textcursor eine Zeile nach unten bewegen. +
v_curhome Textcursor in die linke obere Ecke bewegen. +
v_curleft Textcursor eine Spalte nach links bewegen. +
v_curright Textcursor eine Spalte nach rechts bewegen. +
v_curtext Text ab Textcursorposition ausgeben. +
v_curup Textcursor eine Zeile nach oben bewegen. +
v_eeol Bildschirm ab Textcursor bis Zeilenende löschen. +
v_eeos Bildschirm ab Textcursor bis Bildschirmende löschen. +
v_enter_cur Textmodus einschalten. +
v_exit_cur Textmodus verlassen. +
v_rvoff Inverse Darstellung abschalten. +
v_rvon Inverse Darstellung einschalten. +
vq_chcells Zeilen und Spalten des Textbildschirms ermitteln. +
vq_curaddress Zeile und Spalte des Textcursors ermitteln. +
vs_curaddress Textcursor in Reihe und Spalte positionieren. + +
+ +

Querverweis: Workstations des VDI   Style-Guidelines +

+

7.8.7.1 vq_chcells

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Addressable Alpha Character Cells« - ermittelt die +Anzahl der Reihen und Spalten einer Arbeitsstation. +
  +
VDI-Nummer: 5 (Escape 1) +
  +
Deklaration: void vq_chcells ( int16_t handle, int16_t *rows, int16_t +*columns ); +
  +
Beschreibung: Die Funktion ermittelt die Anzahl der Zeilen und Spalten, die +mit dem Alpha-Cursor angesprochen werden können. Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
rows Anzahl der Zeilen +
columns Anzahl der Spalten + +
+ +
Hinweis: Ein Wert von 0 in den Parametern rows +bzw. columns bedeutet, daß keine Adressierung möglich ist. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all screen and printer drivers. +
  +
Gruppe: Text-Funktionen +
  +
Querverweis: Binding   v_enter_cur +
  + +
+ +

7.8.7.2 Bindings für vq_chcells

+ + + + + + + + + +
C: void vq_chcells ( int16_t handle, int16_t *rows, int16_t +*columns ); +
  +
Umsetzung: +
  +
void vq_chcells (int16_t handle, int16_t *rows,
+                 int16_t *columns)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *rows    = intout[0];
+   *columns = intout[1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]2 # Einträge in intout
contrl+10contrl[5]1 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intoutintout[0]rows
intout+2intout[1]columns
+
+ + +
+ +

7.8.7.3 vq_curaddress

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Current Alpha Cursor Address« - ermittelt die +aktuelle Alphacursorposition. +
  +
VDI-Nummer: 5 (Escape 15) +
  +
Deklaration: void vq_curaddress ( int16_t handle, int16_t *row, int16_t +*column ); +
  +
Beschreibung: Die Funktion ermittelt die aktuelle Position des Alpha-Cursors. +Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
row aktuelle Zeile +
column aktuelle Spalte + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all screen drivers. +
  +
Gruppe: Text-Funktionen +
  +
Querverweis: Binding   v_enter_cur +
  + +
+ +

7.8.7.4 Bindings für vq_curaddress

+ + + + + + + + + +
C: void vq_curaddress ( int16_t handle, int16_t *row, int16_t +*column ); +
  +
Umsetzung: +
  +
void vq_curaddress (int16_t handle, int16_t *row,
+                    int16_t *column)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 15;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *row    = intout[0];
+   *column = intout[1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]2 # Einträge in intout
contrl+10contrl[5]15 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intoutintout[0]row
intout+2intout[1]column
+
+ + +
+ +

7.8.7.5 v_alpha_text

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Output Alpha Text« - Ausgabe von Text im Textmodus +
  +
VDI-Nummer: 5 (Escape 25) +
  +
Deklaration: void v_alpha_text ( int16_t handle, int8_t *string ); +
  +
Beschreibung: Die Funktion gibt einen Text an der aktuellen Position des +Druckkopfes aus. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
string Adresse der Zeichenkette + +
+ +
Hinweis: Die Ausgabe erfolgt nicht im +Grafik-Modus. Wichtige Steuerfunktionen sind für alle Druckertypen +genormt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Code Bedeutung +
    +
DC2 0 Fettschrift ein +
DC2 1 Fettschrift aus +
DC2 2 Kursiv ein +
DC2 3 Kursiv aus +
DC2 4 Unterstrichen ein +
DC2 5 Unterstrichen aus +
DC2 6 Superscript ein +
DC2 7 Superscript aus +
DC2 8 Subscript ein +
DC2 9 Subscript aus +
DC2 A Briefqualität-Modus ein +
DC2 B Briefqualität-Modus aus +
DC2 C Breitschrift ein +
DC2 D Breitschrift aus +
DC2 E helle Schrift ein +
DC2 F helle Schrift aus +
DC2 G   +
:   +
:   +
DC2 V reserviert, wird ignoriert +
DC2 W Pica-Schrift (10 cpi) +
DC2 X Elite-Schrift (12 cpi) +
DC2 Y komprimierter Druck +
DC2 Z Proportionalschrift + +
+ +
Darüber hinaus wird auch ein Seitenvorschub (Formfeed) mit dem +ASCII-Wert 12 unterstützt. Unter PC-GEM können auch Grafiken +berücksichtigt werden; die Syntax lautet in diesem Fall: +
  +
(ESC)(ESC)GEM,x,y,w,h,C:\pathname\filename.img +
  +
Die Parameter x,y,w und h sind dabei in Zeicheneinheiten relativ +zur aktuellen Cursorposition anzugeben. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all printer and metafile drivers. +
  +
Gruppe: Text-Funktionen +
  +
Querverweis: Binding   OUT-Dateiformat +
  + +
+ +

7.8.7.6 Bindings für v_alpha_text

+ + + + + + + + + +
C: void v_alpha_text ( int16_t handle, int8_t *string ); +
  +
Umsetzung: +
  +
void v_alpha_text (int16_t handle, int8_t *string)
+{
+   int16_t *tmp;
+
+   tmp = intin;
+   while (*tmp++ = *string++)
+      ;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = ((int16_t) (tmp-intin)-1);
+   contrl[5] = 25;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]n # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]25 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intinintin[0..n-1]string[0..n-1]
+
+ + +
+ +

7.8.7.7 v_curaddress

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Direct Alpha Cursor Address« - setzt den Alphacursor an die +angegebene Position. +
  +
VDI-Nummer: 5 (Escape 11) +
  +
Deklaration: void v_curaddress ( int16_t handle, int16_t row, int16_t column +); +
  +
Beschreibung: Die Funktion bewegt den Alphacursor zu einer bestimmten Spalte +und Zeile. Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
row Zeile für Cursor (1..m) +
column Spalte für Cursor (1..n) + +
+ +
Hinweis: Falls Adressen oberhalb der Maximalgrenze +angegeben werden, nimmt die Funktion den am nächsten liegenden Wert +an. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all screen drivers. +
  +
Gruppe: Text-Funktionen +
  +
Querverweis: Binding   v_enter_cur +
  + +
+ +

7.8.7.8 Bindings für v_curaddress

+ + + + + + + + + +
C: void v_curaddress ( int16_t handle, int16_t row, int16_t column +); +
void vs_curaddress ( int16_t handle, int16_t row, int16_t column +); +
  +
Umsetzung: +
  +
void v_curaddress  (int16_t handle, int16_t row, int16_t column)
+void vs_curaddress (int16_t handle, int16_t row, int16_t column)
+{
+   intin[0] = row;
+   intin[1] = column;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[5] = 11;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]2 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]11 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intinintin[0]row
intin+2intin[1]column
+
+ + +
+ +

7.8.7.9 v_curdown

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Alpha Cursor down« - bewegt den Alphacursor um eine Zeile +nach unten. +
  +
VDI-Nummer: 5 (Escape 5) +
  +
Deklaration: void v_curdown ( int16_t handle ); +
  +
Beschreibung: Die Funktion bewegt den Alphacursor auf der Workstation mit der +Kennung handle eine Zeile nach unten. +
  +
Hinweis: Befindet sich der Cursor bereits in der +untersten Zeile, so hat die Funktion keine Auswirkung. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all screen drivers. +
  +
Gruppe: Text-Funktionen +
  +
Querverweis: Binding   v_enter_cur +
  + +
+ +

7.8.7.10 Bindings für v_curdown

+ + + + + + + + + +
C: void v_curdown ( int16_t handle ); +
  +
Umsetzung: +
  +
void v_curdown (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 5;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]5 # Escape/Sub-Opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.7.11 v_curhome

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Home Alpha Cursor« - bewegt den Alphacursor in die linke +obere Ecke. +
  +
VDI-Nummer: 5 (Escape 8) +
  +
Deklaration: void v_curhome ( int16_t handle ); +
  +
Beschreibung: Die Funktion bewegt den Alphacursor auf der Workstation mit der +Kennung handle in die 'Home' Stellung. +
  +
Hinweis: Unter der Home-Stellung versteht man +normalerweise die Position oben links auf dem Bildschirm. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all screen drivers. +
  +
Gruppe: Text-Funktionen +
  +
Querverweis: Binding   v_enter_cur +
  + +
+ +

7.8.7.12 Bindings für v_curhome

+ + + + + + + + + +
C: void v_curhome ( int16_t handle ); +
  +
Umsetzung: +
  +
void v_curhome (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 8;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]8 # Escape/Sub-Opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.7.13 v_curleft

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Alpha Cursor left« - bewegt den Alphacursor um ein Zeichen +nach links. +
  +
VDI-Nummer: 5 (Escape 7) +
  +
Deklaration: void v_curleft ( int16_t handle ); +
  +
Beschreibung: Die Funktion bewegt den Alphacursor auf der Workstation mit der +Kennung handle eine Spalte nach links. +
  +
Hinweis: Befindet sich der Cursor bereits in der +linkesten Spalte, so hat die Funktion keine Auswirkung. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all screen drivers. +
  +
Gruppe: Text-Funktionen +
  +
Querverweis: Binding   v_enter_cur +
  + +
+ +

7.8.7.14 Bindings für v_curleft

+ + + + + + + + + +
C: void v_curleft ( int16_t handle ); +
  +
Umsetzung: +
  +
void v_curleft (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 7;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]7 # Escape/Sub-Opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.7.15 v_curright

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Alpha Cursor right« - bewegt den Alphacursor um ein Zeichen +nach rechts. +
  +
VDI-Nummer: 5 (Escape 6) +
  +
Deklaration: void v_curright ( int16_t handle ); +
  +
Beschreibung: Die Funktion bewegt den Alphacursor auf der Workstation mit der +Kennung handle eine Spalte nach rechts. +
  +
Hinweis: Befindet sich der Cursor bereits in der +rechtesten Spalte, so hat die Funktion keine Auswirkung. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all screen drivers. +
  +
Gruppe: Text-Funktionen +
  +
Querverweis: Binding   v_enter_cur +
  + +
+ +

7.8.7.16 Bindings für v_curright

+ + + + + + + + + +
C: void v_curright ( int16_t handle ); +
  +
Umsetzung: +
  +
void v_curright (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 6;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]6 # Escape/Sub-Opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.7.17 v_curtext

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Output Cursor Addressable Alpha Text« - gibt einen Text ab +dem Alphacursor aus. +
  +
VDI-Nummer: 5 (Escape 12) +
  +
Deklaration: void v_curtext ( int16_t handle, int8_t *string ); +
  +
Beschreibung: Die Funktion gibt einen Text an der aktuellen Cursorposition +aus. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
string Adresse der Zeichenkette + +
+ +
Der Cursor wird bei der Ausgabe für jedes Zeichen um eine +Stelle weitergerückt (Alpha-Modus). +
  +
Hinweis: Textausgabe kann über diese Funktion +schneller als über das GEMDOS erfolgen. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all screen drivers. +
  +
Gruppe: Text-Funktionen +
  +
Querverweis: Binding   v_enter_cur   v_curup   v_curdown   v_curright   +v_curleft   v_curhome   vs_curaddress +
  + +
+ +

7.8.7.18 Bindings für v_curtext

+ + + + + + + + + +
C: void v_curtext ( int16_t handle, int8_t *string ); +
  +
Umsetzung: +
  +
void v_curtext (int16_t handle, int8_t *string)
+{
+   int16_t *tmp;
+
+   tmp = intin;
+   while (*tmp++ = *string++)
+      ;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = ((int16_t) (tmp-intin)-1);
+   contrl[5] = 12;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]n # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]12 # Escape/Sub-Opcode
contrl+12contrl[6]handle
intinintin[0..n-1]string[0..n-1]
+
+ + +
+ +

7.8.7.19 v_curup

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Alpha Cursor up« - bewegt den Alphacursor um eine Zeile nach +oben. +
  +
VDI-Nummer: 5 (Escape 4) +
  +
Deklaration: void v_curup ( int16_t handle ); +
  +
Beschreibung: Die Funktion bewegt den Alphacursor auf der Workstation mit der +Kennung handle eine Zeile nach oben. +
  +
Hinweis: Befindet sich der Cursor bereits in der +obersten Zeile, so hat die Funktion keine Auswirkung. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all screen drivers. +
  +
Gruppe: Text-Funktionen +
  +
Querverweis: Binding   v_enter_cur +
  + +
+ +

7.8.7.20 Bindings für v_curup

+ + + + + + + + + +
C: void v_curup ( int16_t handle ); +
  +
Umsetzung: +
  +
void v_curup (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 4;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]4 # Escape/Sub-Opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.7.21 v_eeol

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Erase to End of Alpha Text Line« - löscht die Zeile ab dem +Alphacursor. +
  +
VDI-Nummer: 5 (Escape 10) +
  +
Deklaration: void v_eeol ( int16_t handle ); +
  +
Beschreibung: Die Funktion löscht auf der Workstation mit der Kennung +handle die aktuelle Zeile ab der aktuellen Cursorposition. +
  +
Hinweis: Die Position des Cursors bleibt dabei +unverändert. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all screen drivers. +
  +
Gruppe: Text-Funktionen +
  +
Querverweis: Binding   v_enter_cur +
  + +
+ +

7.8.7.22 Bindings für v_eeol

+ + + + + + + + + +
C: void v_eeol ( int16_t handle ); +
  +
Umsetzung: +
  +
void v_eeol (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 10;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]10 # Escape/Sub-Opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.7.23 v_eeos

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Erase to End of Alpha Screen« - löscht den Bildschirm ab +dem Alphacursor. +
  +
VDI-Nummer: 5 (Escape 9) +
  +
Deklaration: void v_eeos ( int16_t handle ); +
  +
Beschreibung: Die Funktion löscht auf der Workstation mit der Kennnung +handle den alphanumerischen Bildschirm ab der aktuellen +Cursorposition. +
  +
Hinweis: Die Position des Cursors wird dabei nicht +verändert. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all screen drivers. +
  +
Gruppe: Text-Funktionen +
  +
Querverweis: Binding   v_enter_cur +
  + +
+ +

7.8.7.24 Bindings für v_eeos

+ + + + + + + + + +
C: void v_eeos ( int16_t handle ); +
  +
Umsetzung: +
  +
void v_eeos (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 9;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]9 # Escape/Sub-Opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.7.25 v_enter_cur

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Enter Alpha Mode« - schaltet den Textmodus ein. +
  +
VDI-Nummer: 5 (Escape 3) +
  +
Deklaration: void v_enter_cur ( int16_t handle ); +
  +
Beschreibung: Die Funktion verläßt auf der Workstation mit der Kennung +handle den Grafik-Modus, falls dieser nicht identisch mit dem +Alpha-Modus ist. +
  +
Hinweis: Darüber hinaus wird der Alpha-Cursor in die +obere linke Zeichenzelle gesetzt, und der Alpha-Bildschirm gelöscht. +Bei einem Metafile wird ein entsprechender Eintrag vorgenommen. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all screen drivers. +
  +
Gruppe: Text-Funktionen +
  +
Querverweis: Binding   v_exit_cur +
  + +
+ +

7.8.7.26 Bindings für v_enter_cur

+ + + + + + + + + +
C: void v_enter_cur ( int16_t handle ); +
  +
Umsetzung: +
  +
void v_enter_cur (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 3;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]3 # Escape/Sub-Opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.7.27 v_exit_cur

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Exit Alpha Mode« - schaltet den Textmodus ab. +
  +
VDI-Nummer: 5 (Escape 2) +
  +
Deklaration: void v_exit_cur ( int16_t handle ); +
  +
Beschreibung: Die Funktion schaltet auf der Workstation mit der Kennung +handle den Alphamodus aus, sofern Alpha- und Grafikmodus +unterschiedlich sind. +
  +
Der Alpha-Modus ist der normale Textmodus ohne Grafik, wie er +z.B. vom Desktop für die Anzeige von Dateien benutzt wird. +
  +
Hinweis: Die Funktion bewirkt außerdem, daß der +Grafikbildschirm gelöscht wird; bei einem Metafile wird ein +entsprechender Eintrag vorgenommen. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all screen drivers. +
  +
Gruppe: Text-Funktionen +
  +
Querverweis: Binding   v_enter_cur +
  + +
+ +

7.8.7.28 Bindings für v_exit_cur

+ + + + + + + + + +
C: void v_exit_cur ( int16_t handle ); +
  +
Umsetzung: +
  +
void v_exit_cur (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]2 # Escape/Sub-Opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.7.29 v_rvoff

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Reverse Video off« - schaltet den Invertiermodus ab. +
  +
VDI-Nummer: 5 (Escape 14) +
  +
Deklaration: void v_rvoff ( int16_t handle ); +
  +
Beschreibung: Die Funktion schaltet auf der Workstation mit der Kennung +handle die inverse Alpha-Textdarstellung aus. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all screen drivers. +
  +
Gruppe: Text-Funktionen +
  +
Querverweis: Binding   v_enter_cur   v_rvon +
  + +
+ +

7.8.7.30 Bindings für v_rvoff

+ + + + + + + + + +
C: void v_rvoff ( int16_t handle ); +
  +
Umsetzung: +
  +
void v_rvoff (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 14;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]14 # Escape/Sub-Opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.7.31 v_rvon

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Reverse Video on« - schaltet den Invertiermodus ein. +
  +
VDI-Nummer: 5 (Escape 13) +
  +
Deklaration: void v_rvon ( int16_t handle ); +
  +
Beschreibung: Die Funktion aktiviert auf der Workstation mit der Kennung +handle die inverse Alpha-Textdarstellung. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all screen drivers. +
  +
Gruppe: Text-Funktionen +
  +
Querverweis: Binding   v_enter_cur   v_rvoff +
  + +
+ +

7.8.7.32 Bindings für v_rvon

+ + + + + + + + + +
C: void v_rvon ( int16_t handle ); +
  +
Umsetzung: +
  +
void v_rvon (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 13;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]5 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]13 # Escape/Sub-Opcode
contrl+12contrl[6]handle
+
+ + +
+ +
+ +Home +VDIVDI +EingabefunktionenEingabefunktionen +FarbtabellenfunktionenFarbtabellenfunktionen + + diff --git a/de/vdi_functions.html b/de/vdi_functions.html new file mode 100644 index 000000000..764d6bb7e --- /dev/null +++ b/de/vdi_functions.html @@ -0,0 +1,1726 @@ + + + + + +Die Anleitung zum TOS: VDI-Funktionsliste + + + + + + + + + +Home +VDIVDI +TC-VDI-FunktionenTC-VDI-Funktionen +VDI-StrukturenVDI-Strukturen + +
+ +

7.13 VDI-Funktionsliste

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
decNamevorhanden
-2vq_gdosTOS
-1,8 GEM/4
-1,7 GEM/4
-1,6v_set_app_buffSpeedoGDOS
-1,5 GEM/3
-1,4v_get_driver_infoGEM/3
-1,3 GEM/3
-1,2 GEM/3
-1,1 GEM/2
1v_opnwkTOS
1v_opnprnNVDI
2v_clswkTOS
3v_clrwkTOS
4v_updwkTOS
5,1vq_chcellsTOS
5,2v_exit_curTOS
5,3v_enter_curTOS
5,4v_curupTOS
5,5v_curdownTOS
5,6v_currightTOS
5,7v_curleftTOS
5,8v_curhomeTOS
5,9v_eeosTOS
5,10v_eeolTOS
5,11vs_curaddressTOS
5,12v_curtextTOS
5,13v_rvonTOS
5,14v_rvoffTOS
5,15vq_curaddressTOS
5,16vq_tabstatusTOS
5,17v_hardcopyTOS
5,18v_dspcurTOS
5,19v_rmcurTOS
5,20v_form_advGDOS
5,21v_output_windowGDOS
5,22v_clear_disp_listGDOS
5,23v_bit_imageGDOS
5,24vq_scanGDOS
5,25v_alpha_textTOS
5,27v_orientNVDI
5,28v_copiesNVDI
5,29v_trayNVDI
5,32v_ps_halftoneGEM/3
5,36vq_tray_namesNVDI
5,37v_page_sizeNVDI
5,38vq_page_nameNVDI
5,39vq_prn_scalingNVDI 5.00
5,60vs_palettePC-GEM
5,61v_soundPC-GEM
5,62vs_mutePC-GEM
5,76vs_calibrateNVDI, MATRIX TC-VDI
5,77vq_calibrateNVDI, MATRIX TC-VDI
5,81vt_resolution?
5,82vt_axis
5,83vt_origin
5,84vq_tdimensions
5,85vt_alignment
5,91vqp_films
5,92vqp_state
5,93vsp_state
5,94vsp_save
5,95vsp_message
5,96vqp_error
5,98v_meta_extents
5,99v_write_meta
5,99,0vm_pagesize
5,99,1vm_coords
5,99,32,1v_bez_qualNVDI 2.10
5,100vm_filenameTOS
5,101v_offsetTOS
5,101v_xbit_imageGEM/3
5,102v_fontinitTOS
5,102vs_bkcolorGEM/3
5,2000v_escape2000
5,2100vq_margins
5,2101vq_driver_infoTreiber von Thierry Rodolfo
5,2102vq_bit_imageTreiber von Thierry Rodolfo
5,2103vs_document_infoNVDI 5.00
5,2103vs_page_infoTreiber von Thierry Rodolfo
5,2104vs_cropTreiber von Thierry Rodolfo
5,2105vq_image_typeTreiber von Thierry Rodolfo
5,2106vs_save_disp_listTreiber von Thierry Rodolfo
5,2107vs_load_disp_listTreiber von Thierry Rodolfo
5,2108vq_driver_nameTreiber von Thierry Rodolfo
5,3000vspl_playTreiber von Thierry Rodolfo
5,3001vspl_load_sampleTreiber von Thierry Rodolfo
5,3002vspl_unload_sampleTreiber von Thierry Rodolfo
5,3003vspl_play_dmaTreiber von Thierry Rodolfo
5,3004vspl_stop_dmaTreiber von Thierry Rodolfo
5,3005vqspl_status_dmaTreiber von Thierry Rodolfo
5,3006vqspl_position_dmaTreiber von Thierry Rodolfo
5,3007vspl_pause_dmaTreiber von Thierry Rodolfo
5,3011vspl_load_d2dTreiber von Thierry Rodolfo
5,3012vspl_unload_d2dTreiber von Thierry Rodolfo
5,3013vspl_play_d2dTreiber von Thierry Rodolfo
5,3014vspl_pause_d2dTreiber von Thierry Rodolfo
5,3015vspl_stop_d2dTreiber von Thierry Rodolfo
5,3016vqspl_status_d2dTreiber von Thierry Rodolfo
5,3017vqspl_position_d2dTreiber von Thierry Rodolfo
5,3018vqspl_time_left_d2dTreiber von Thierry Rodolfo
5,3020vspl_make_d2dTreiber von Thierry Rodolfo
5,3030vsspl_monitor_onTreiber von Thierry Rodolfo
5,3031vsspl_monitor_offTreiber von Thierry Rodolfo
5,4000vmid_loadTreiber von Thierry Rodolfo
5,4001vmid_unloadTreiber von Thierry Rodolfo
5,4002vmid_playTreiber von Thierry Rodolfo
5,18500v_setrgbiGEM/3
5,18501v_topbotGEM/3
6,0v_plineTOS
6,13v_bezNVDI 2.10
7v_pmarkerTOS
8v_gtextTOS
8v_gtext_unicode
9,0v_fillareaTOS
9,13v_bez_fillNVDI 2.10
10v_cellarrayTOS
11,1v_barTOS
11,2v_arcTOS
11,3v_piesliceTOS
11,4v_circleTOS
11,5v_ellipseTOS
11,6v_ellarcTOS
11,7v_ellpieTOS
11,8v_rboxTOS
11,9v_rfboxTOS
11,10v_justifiedTOS
11,11v_etextGEM/3
11,13v_bez_offNVDI 2.10
11,13v_bez_onNVDI 2.10
12vst_heightTOS
13vst_rotationTOS
14vs_colorTOS
15vsl_typeTOS
16vsl_widthTOS
17vsl_colorTOS
18vsm_typeTOS
19vsm_heightTOS
20vsm_colorTOS
21vst_fontTOS
22vst_colorTOS
23vsf_interiorTOS
24vsf_styleTOS
25vsf_colorTOS
26vq_colorTOS
27vq_cellarrayTOS
28vrq_locatorTOS
28vsm_locatorTOS
29vrq_valuatorTOS
29vsm_valuatorTOS
30vrq_choiceTOS
30vsm_choiceTOS
31vrq_stringTOS
31vsm_stringTOS
32vswr_modeTOS
33vsin_modeTOS
35vql_attributesTOS
36vqm_attributesTOS
37vqf_attributesTOS
38vqt_attributesTOS
39vst_alignmentTOS
51vsf_rgbMATRIX TC-VDI
52vst_rgbMATRIX TC-VDI
53vsl_rgbMATRIX TC-VDI
54vrf_rgbMATRIX TC-VDI
55vrt_rgbMATRIX TC-VDI
56vrl_rgbMATRIX TC-VDI
57vs_pixcolMATRIX TC-VDI
58vq_pixcolMATRIX TC-VDI
59vs_pixrgbMATRIX TC-VDI
60vq_pixrgbMATRIX TC-VDI
61vrun_rectMATRIX TC-VDI
62vrun_parallelMATRIX TC-VDI
63vrun_triangleMATRIX TC-VDI
64vs_colorsMATRIX TC-VDI
65vq_colorsMATRIX TC-VDI
100,0v_opnvwkTOS
100,1v_opnbmab EdDI 1.00
100,2v_resize_bmab EdDI 1.20
100,3v_open_bmab EdDI 1.20
101,0v_clsvwkTOS
101,1v_clsbmab EdDI 1.00
102,0vq_extndTOS
102,1vq_scrninfoab EdDI 1.00
103v_contourfillTOS
104vsf_perimeterTOS
104vsf_xperimeterGEM/3 Relase 3.1
105v_get_pixelTOS
106vst_effectsTOS
107vst_pointTOS
108vsl_endsTOS
109vro_cpyfmTOS
110vr_trnfmTOS
111vsc_formTOS
112vsf_udpatTOS
113vsl_udstyTOS
114vr_recflTOS
115vqin_modeTOS
116vqt_extentTOS
117vqt_widthTOS
118vex_timvTOS
119vst_load_fontsGDOS
119vst_ex_load_fontsGEM/3
120vst_unload_fontsGDOS
121vrt_cpyfmTOS
122v_show_cTOS
123v_hide_cTOS
124vq_mouseTOS
125vex_butvTOS
126vex_motvTOS
127vex_curvTOS
128vq_key_sTOS
129vs_clipTOS
130vqt_nameTOS
130,1vqt_ext_nameNVDI 3.00
131vqt_fontinfoTOS
132vqt_justifiedPC-GEM
133vs_grayoverrideGEM/3
134vex_wheelvMilan
134v_pat_rotateGEM/3
135 GEM/4
136 GEM/4: Based on v_pline() but takes extra integer parameters.
137 GEM/4: Based on v_fillarea() but takes extra integer parameters.
138v_setrgbNVDI 5.00
142 GEM/4: Takes an integer parameter
143 GEM/4: Takes an integer parameter that is at most 100
170vr_transfer_bitsNVDI 5.00
171,0vr_clip_rects_by_dstNVDI 5.02
171,1vr_clip_rects_by_srcNVDI 5.02
171,2vr_clip_rects32_by_dstNVDI 5.02
171,3vr_clip_rects32_by_srcNVDI 5.02
180v_create_driver_infoNVDI 5.00
181v_delete_driver_infoNVDI 5.00
182,0v_read_default_settingsNVDI 5.00
182,1v_write_default_settingsNVDI 5.00
190vqt_char_indexNVDI 4.00
200,0vst_fg_colorNVDI 5.00
200,1vsf_fg_colorNVDI 5.00
200,2vsl_fg_colorNVDI 5.00
200,3vsm_fg_colorNVDI 5.00
200,4vsr_fg_colorNVDI 5.00
201,0vst_bg_colorNVDI 5.00
201,1vsf_bg_colorNVDI 5.00
201,2vsl_bg_colorNVDI 5.00
201,3vsm_bg_colorNVDI 5.00
201,4vsr_bg_colorNVDI 5.00
202,0vqt_fg_colorNVDI 5.00
202,1vqf_fg_colorNVDI 5.00
202,2vql_fg_colorNVDI 5.00
202,3vqm_fg_colorNVDI 5.00
202,4vqr_fg_colorNVDI 5.00
203,0vqt_bg_colorNVDI 5.00
203,1vqf_bg_colorNVDI 5.00
203,2vql_bg_colorNVDI 5.00
203,3vqm_bg_colorNVDI 5.00
203,4vqr_bg_colorNVDI 5.00
204,0v_color2valueNVDI 5.00
204,1v_value2colorNVDI 5.00
204,2v_color2nearestNVDI 5.00
204,3vq_px_formatNVDI 5.00
205,0vs_ctabNVDI 5.00
205,1vs_ctab_entryNVDI 5.00
205,2vs_dflt_ctabNVDI 5.00
206,0vq_ctabNVDI 5.00
206,1vq_ctab_entryNVDI 5.00
206,2vq_ctab_idNVDI 5.00
206,3v_ctab_idx2vdiNVDI 5.00
206,4v_ctab_vdi2idxNVDI 5.00
206,5v_ctab_idx2valueNVDI 5.00
206,6v_get_ctab_idNVDI 5.00
206,7vq_dflt_ctabNVDI 5.00
206,8v_create_ctabNVDI 5.00
206,9v_delete_ctabNVDI 5.00
207,0vs_hilite_colorNVDI 5.00
207,1vs_min_colorNVDI 5.00
207,2vs_max_colorNVDI 5.00
207,3vs_weight_colorNVDI 5.00
208,0v_create_itabNVDI 5.00
208,1v_delete_itabNVDI 5.00
209,0vq_hilite_colorNVDI 5.00
209,1vq_min_colorNVDI 5.00
209,2vq_max_colorNVDI 5.00
209,3vq_weight_colorNVDI 5.00
224,100vs_backmapSpeedoGDOS 5.1
224,101vs_outmodeSpeedoGDOS 5.1
224,105vs_use_fontsSpeedoGDOS 5.1
225vqt_drv_availSpeedoGDOS 5.1
226,1v_set_cachedirSpeedoGDOS 5.1
226,2v_get_cachedirSpeedoGDOS 5.1
226,3v_def_cachedirSpeedoGDOS 5.1
226,4v_clr_cachedirSpeedoGDOS 5.1
226,5v_delete_cacheSpeedoGDOS 5.1
226,6v_save_cacheSpeedoGDOS 5.1
226,7v_load_cacheSpeedoGDOS 5.1
229vqt_xfntinfoNVDI 3.02
230,0vst_nameNVDI 3.02
230,100vqt_name_and_idNVDI 3.02
231vst_widthNVDI 3.00
232vqt_fontheaderNVDI 3.00
233v_mono_ftextSpeedoGDOS 5.1
234vqt_trackkernNVDI 3.00
235vqt_pairkernNVDI 3.00
236vst_charmapNVDI 3.00
236vst_map_modeNVDI 4.00
237vst_kernNVDI 3.00
237vst_track_offsetNVDI 3.00
238vq_ptsinsz
239v_getbitmap_infoNVDI 3.00
240,0vqt_f_extentNVDI 3.00
240,4200vqt_real_extentNVDI 3.00
240,4200vqt_real_extent_unicodeNVDI
240vqt_f_extent16
241v_ftextNVDI 3.00
241v_ftext_offsetNVDI 3.00
241v_ftext16
241v_ftext_offset16
242v_killoutlineFSM
243v_getoutlineNVDI 3.00
243,1v_get_outlineNVDI 5.00
243,31v_fgetoutlineSpeedoGDOS 5.0d
244vst_scratch
245vst_errorSpeedoGDOS 4.00
246vst_arbptSpeedoGDOS 4.00
246vst_arbpt32NVDI 3.00
247vqt_advanceSpeedoGDOS 4.00
247vqt_advance32NVDI 3.00
248vqt_devinfoSpeedoGDOS 4.00
248,0vq_devinfoNVDI 3.00
248,4242vq_ext_devinfoNVDI 3.00
249v_savecache
250v_loadcache
251v_flushcacheNVDI
252vst_setsizeSpeedoGDOS 4.00
252vst_setsize32NVDI 3.00
253vst_skewNVDI 3.00
254vqt_get_tableSpeedoGDOS 4.00
255vqt_cachesizeSpeedoGDOS 4.00
255,100vqt_cacheinfoSpeedoGDOS 5.1
+
+ +
+ +Home +VDIVDI +TC-VDI-FunktionenTC-VDI-Funktionen +VDI-StrukturenVDI-Strukturen + + diff --git a/de/vdi_input.html b/de/vdi_input.html new file mode 100644 index 000000000..e93dc6082 --- /dev/null +++ b/de/vdi_input.html @@ -0,0 +1,3542 @@ + + + + + +Die Anleitung zum TOS: Eingabefunktionen + + + + + + + + + +Home +VDIVDI +AuskunftsfunktionenAuskunftsfunktionen +EscapefunktionenEscapefunktionen + +
+ +

7.7 Eingabefunktionen

+

Die Eingabefunktionen ermöglichen es einem Programm, unter +Berücksichtigung der Eingabemodi, Tastatur und Maus abzufragen. +Außerdem bieten sie Routinen zum einklinken in Timer- und +Maus-Interrupts. Es stehen die folgenden Funktionen zur Verfügung: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
v_hide_c Grafikcursor abschalten. +
v_show_c Grafikcursor darstellen. +
vex_butv Serviceroutine für Maustasteninterrupt verlegen. +
vex_curv Mauszeiger selbst zeichnen. +
vex_motv Serviceroutine für Mausbewegungsinterrupt verlegen. +
vex_timv Serviceroutine des Timerinterrupts verlegen. +
vex_wheelv Serviceroutine für Mausradereignisse. +
vq_key_s Tastaturstatus abfragen. +
vq_mouse Position des Grafikcursors ermitteln. +
vrq_choice Tastendruck abwarten (REQUEST). +
vrq_locator Position des Grafikcursor ermitteln (REQUEST). +
vrq_string String von Tastatur einlesen (REQUEST). +
vrq_valuator Überwachung von Eingabegeräten (REQUEST). +
vsc_form Grafikcursor definieren. +
vsin_mode Umschalten zwischen REQUEST- und SAMPLE-Modus. +
vsm_choice Ermittelt die zuletzt gedrückte Taste (SAMPLE). +
vsm_locator Position des Grafikcursor ermitteln (SAMPLE). +
vsm_string String von Tastatur einlesen (SAMPLE). +
vsm_valuator Ermittlung des Status von Eingabegeräten (SAMPLE). + +
+ +

Hinweis: Diese Funktionen sind in erster Linie für den +Besitzer der physikalischen Workstation, d.h. für das AES +gedacht. Programme sollten (sofern es keine zwingenden Gründe für +ein anderes Vorgehen gibt) Maus- und Tastaturereignisse immer durch +die Ereignisfunktionen des AES abfragen, da anderenfalls für +andere Applikationen bestimmte Eingaben abgefangen werden. +

+

Querverweis: Workstations des VDI   Style-Guidelines +

+

7.7.1 vex_butv

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Exchange Button Change Vector« - stellt den Interruptvektor +für einen Maustastendruck um. +
  +
VDI-Nummer: 125 +
  +
Deklaration: void vex_butv ( int16_t handle, int16_t (*pusrcode)(), int16_t +(**psavcode)() ); +
  +
Beschreibung: Die Funktion erlaubt es, eine eigene Routine in den +Maustasten-Vektor zu hängen. Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
pusrcode Adresse der neuen Routine +
psavcode Adresse der alten Routine + +
+ +
Die neue Routine muß alle veränderten Register +wiederherstellen und die alte Maustasten-Status Routine aufrufen. +
  +
Hinweis: Die Eingabefunktionen des VDI arbeiten nur auf +der physikalischen Workstation, die im Normalfall von den AES +benutzt wird. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all screen drivers. +
  +
Gruppe: Eingabefunktionen +
  +
Querverweis: Binding   vex_timv   vex_motv   vex_curv +
  + +
+ +

7.7.2 Bindings für vex_butv

+ + + + + + + + + +
C: void vex_butv ( int16_t handle, int16_t (*pusrcode)(), int16_t +(**psavcode)() ); +
  +
Umsetzung: +
  +
void vex_butv (int16_t handle, int16_t (*pusrcode)(),
+               int16_t (**psavcode)())
+{
+   contrl[0] = 125;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+   contrl[7..8] = pusrcode;
+
+   vdi ();
+
+   *psavcode = contrl[9..10];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]125 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
contrl+14contrl[7,8]pusrcode
contrl+18contrl[9,10]psavcode
+
+ + +
+ +

7.7.3 vex_curv

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Exchange Cursor Change Vector« - stellt den Interruptvector +für Cursorbewegungen um. +
  +
VDI-Nummer: 127 +
  +
Deklaration: void vex_curv ( int16_t handle, int16_t (*pusrcode)(), int16_t +(**psavcode)() ); +
  +
Beschreibung: Die Funktion erlaubt es, eine eigene Routine in den +Cursor-Change-Vektor zu hängen. Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
pusrcode Adresse der neuen Routine +
psavcode Adresse der alten Routine + +
+ +
Der Aufruf dieser Routine erfolgt, nachdem die über vex_motv +eingetragene Routine aufgerufen und die Mauszeiger-Koordinaten, die +man in d0.w und d1.w erhält, geclippt wurden. Alle veränderten +Register müssen wiederhergestellt werden. Anschließend sollte die +alte Routine aufgerufen werden. +
  +
Hinweis: Die Eingabefunktionen des VDI arbeiten nur auf +der physikalischen Workstation, die im Normalfall von den AES +benutzt wird. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all screen drivers. +
  +
Gruppe: Eingabefunktionen +
  +
Querverweis: Binding   vex_timv   vex_butv   vex_motv +
  + +
+ +

7.7.4 Bindings für vex_curv

+ + + + + + + + + +
C: void vex_curv ( int16_t handle, int16_t (*pusrcode)(), int16_t +(**psavcode)() ); +
  +
Umsetzung: +
  +
void vex_curv (int16_t handle, int16_t (*pusrcode)(),
+               int16_t (**psavcode)())
+{
+   contrl[0] = 127;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+   contrl[7..8] = pusrcode;
+
+   vdi ();
+
+   *psavcode = contrl[9..10];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]127 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
contrl+14contrl[7..8]pusrcode
contrl+18contrl[9..10]psavcode
+
+ + +
+ +

7.7.5 vex_motv

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Exchange Mouse Movement Vector« - stellt den Interruptvektor +für Mausbewegungen um. +
  +
VDI-Nummer: 126 +
  +
Deklaration: void vex_motv ( int16_t handle, int16_t (*pusrcode)(), int16_t +(**psavcode)() ); +
  +
Beschreibung: Die Funktion erlaubt es, eine eigene Routine in den +Maus-Movement-Vektor zu hängen. Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
pusrcode Adresse der neuen Routine +
psavcode Adresse der alten Routine + +
+ +
Die neue Routine muß alle veränderten Register +wiederherstellen und die alte Maus-Movement Routine aufrufen. +
  +
Hinweis: Die Eingabefunktionen des VDI arbeiten nur auf +der physikalischen Workstation, die im Normalfall von den AES +benutzt wird. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all screen drivers. +
  +
Gruppe: Eingabefunktionen +
  +
Querverweis: Binding   vex_timv   vex_butv   vex_curv +
  + +
+ +

7.7.6 Bindings für vex_motv

+ + + + + + + + + +
C: void vex_motv ( int16_t handle, int16_t (*pusrcode)(), int16_t +(**psavcode)() ); +
  +
Umsetzung: +
  +
void vex_motv (int16_t handle, int16_t (*pusrcode)(),
+               int16_t (**psavcode)())
+{
+   contrl[0] = 126;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+   contrl[7..8] = pusrcode;
+
+   vdi ();
+
+   *psavcode = contrl[9..10];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]126 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
contrl+14contrl[7..8]pusrcode
contrl+18contrl[9..10]psavcode
+
+ + +
+ +

7.7.7 vex_timv

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Exchange Timer Interrupt Vector« - stellt den +Interruptvektor für den Zeitgeber um. +
  +
VDI-Nummer: 118 +
  +
Deklaration: void vex_timv ( int16_t handle, int16_t (*tim_addr)(), int16_t +(**otim_addr)(), int16_t *tim_conv ); +
  +
Beschreibung: Die Funktion ermöglicht es, eine eigene Routine in den +Timer-Interrupt zu hängen. Es gilt: +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
tim_addr Adresse der neuen Routine +
otim_addr Adresse der alten Routine +
tim_conv Intervall des Interrupts (msec). + +
+ +
Die neue Routine muß an ihrem Ende alle veränderten Register +restaurieren und die alte Timerinterrupt-Routine anspringen. +
  +
Hinweis: Die Eingabefunktionen des VDI arbeiten nur auf +der physikalischen Workstation, die im Normalfall von den AES +benutzt wird. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all screen drivers. +
  +
Gruppe: Eingabefunktionen +
  +
Querverweis: Binding   vex_butv   vex_motv   vex_curv +
  + +
+ +

7.7.8 Bindings für vex_timv

+ + + + + + + + + +
C: void vex_timv ( int16_t handle, int16_t (*tim_addr)(), int16_t +(**otim_addr)(), int16_t *tim_conv ); +
  +
Umsetzung: +
  +
void vex_timv (int16_t handle, int16_t (*tim_addr)(),
+               int16_t (**otim_addr)(), int16_t *tim_conv)
+{
+   contrl[0] = 118;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+   contrl[7..8] = tim_addr;
+
+   vdi ();
+
+   *otim_addr = contrl[9..10];
+   *tim_conv  = intout[0];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]118 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+12contrl[6]handle
contrl+14contrl[7..8]tim_addr
contrl+18contrl[9..10]otim_addr
intoutintout[0]tim_conv
+
+ + +
+ +

7.7.9 vex_wheelv

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Exchange wheel interrupt vector« - stellt den +Interruptvektor für die Mausradbewegung um. +
  +
VDI-Nummer: 134 +
  +
Deklaration: void vex_wheelv ( int16_t handle, void *new, void **old ); +
  +
Beschreibung: The call vex_wheelv installs a routine which is called by the +VDI every time a mouse wheel event occurs. d0.w contain the +wheel_number, d1.w contain the wheel_amount of the wheel from the +mouse. The subroutine must save and restore modified registers and +call the old interrupt routine. +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
new Adresse der neuen Routine +
old Adresse der alten Routine + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Seit dem MilanTOS 4.08 Release 5.10.2002, not yet documented, +internals may still change. +
  +
Gruppe: Eingabefunktionen +
  +
Querverweis: Binding   vex_butv   vex_motv   vex_curv   vex_timv +
  + +
+ +

7.7.10 Bindings für vex_wheelv

+ + + + + + + + + +
C: void vex_wheelv ( int16_t handle, void *new, void **old ); +
  +
Umsetzung: +
  +
void vex_wheelv ( int16_t handle, void *new, void **old )
+{
+   contrl[0] = 134;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+   contrl[7..8] = new;
+
+   vdi ();
+
+   *old = contrl[9..10];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]134 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
contrl+14contrl[7..8]new
contrl+18contrl[9..10]old
+
+ + +
+ +

7.7.11 vq_key_s

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Sample Keyboard State Information« - ermittelt den Status +der Kontrolltasten. +
  +
VDI-Nummer: 128 +
  +
Deklaration: void vq_key_s ( int16_t handle, int16_t *pstatus ); +
  +
Beschreibung: Die Funktion überprüft den Status der Tastatur. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
pstatus Status der Tastatur als Bitvektor: + + + + + + + + + + + + +
Shift-rechts = 0x0001 +
Shift-links = 0x0002 +
Control = 0x0004 +
Alternate = 0x0008 + +
+ + +
+ +
In GEM-Programmen sollten die AES Event-Funktionen verwendet +werden, um nur die für die eigene Applikation bestimmten +Informationen über den Tastaturstatus zu erhalten. +
  +
Hinweis: Die Eingabefunktionen des VDI arbeiten nur auf +der physikalischen Workstation, die im Normalfall von den +AES benutzt wird. Deshalb sollte man besser auf graf_mkstate oder +die Eventfunktionen zurückgreifen. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all Atari computers. +
  +
Gruppe: Eingabefunktionen +
  +
Querverweis: Binding   evnt_button +
  + +
+ +

7.7.12 Bindings für vq_key_s

+ + + + + + + + + +
C: void vq_key_s ( int16_t handle, int16_t *pstatus ); +
  +
Umsetzung: +
  +
void vq_key_s (int16_t handle, int16_t *pstatus)
+{
+   contrl[0] = 128;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *pstatus = intout[0];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]128 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+12contrl[6]handle
intoutintout[0]pstatus
+
+ + +
+ +

7.7.13 vq_mouse

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Sample Mouse Button State« - ermittelt Position und Status +der Maustasten. +
  +
VDI-Nummer: 124 +
  +
Deklaration: void vq_mouse ( int16_t handle, int16_t *pstatus, int16_t *x, +int16_t *y ); +
  +
Beschreibung: Die Funktion ermittelt die Position und den Status der +Maustasten. Es gilt: +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
pstatus Status der Maustasten + + + + + + +
Bit-0 = linke Taste +
Bit-1 = Taste rechts daneben (etc.) + +
+ +
x x-Koordinate +
y y-Koordinate des Grafikcursors + +
+ +
In GEM-Programmen sollte die AES-Funktion graf_mkstate verwendet +werden, um nur die für die eigene Applikation bestimmten +Informationen über Position und Status der Maustastenstatus zu +erhalten. +
  +
Hinweis: Die Eingabefunktionen des VDI arbeiten nur auf +der physikalischen Workstation, die im Normalfall von den +AES benutzt wird. Deshalb sollte man besser auf graf_mkstate oder die +Eventfunktionen zurückgreifen. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all screen drivers. +
  +
Gruppe: Eingabefunktionen +
  +
Querverweis: Binding   graf_mkstate +
  + +
+ +

7.7.14 Bindings für vq_mouse

+ + + + + + + + + +
C: void vq_mouse ( int16_t handle, int16_t *pstatus, int16_t *x, +int16_t *y ); +
  +
Umsetzung: +
  +
void vq_mouse (int16_t handle, int16_t *pstatus, int16_t *x,
+               int16_t *y)
+{
+   contrl[0] = 124;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *pstatus = intout[0];
+   *x = ptsout[0];
+   *y = ptsout[1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]124 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]1 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+12contrl[6]handle
intoutintout[0]pstatus
ptsoutptsout[0]x
ptsout+2ptsout[1]y
+
+ + +
+ +

7.7.15 vrq_choice

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Input Choice, Request Mode« - liefert den Status der +Funktionstasten, wenn eine gedrückt wurde. +
  +
VDI-Nummer: 30 +
  +
Deklaration: void vrq_choice ( int16_t handle, int16_t ch_in, int16_t +*ch_out ); +
  +
Beschreibung: Die Funktion ermittelt die Betätigung einer Auswahltaste (z.B. +Funktionstaste). Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
ch_in initialisierende Auswahltaste +
ch_out ausgewählte Taste bzw. Codenummer + +
+ +
Die Anzahl der Funktionstasten ist abhängig vom jeweiligen +Gerät. Falls eine andere Taste gedrückt wird, wird die entsprechende +Codenummer zurückgeliefert. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Die Funktion ist zwar im ROM implementiert, scheint aber in +keiner Weise zu funktionieren. Die Funktion wird nicht von +allen Gerätetreibern unterstützt. +
  +
Die Eingabefunktionen des VDI arbeiten nur auf der +physikalischen Workstation, die im Normalfall von den AES +benutzt wird. +
  +
Gruppe: Eingabefunktionen +
  +
Querverweis: Binding   vsm_choice   vsin_mode +
  + +
+ +

7.7.16 Bindings für vrq_choice

+ + + + + + + + + +
C: void vrq_choice ( int16_t handle, int16_t ch_in, int16_t +*ch_out ); +
  +
Umsetzung: +
  +
void vrq_choice (int16_t handle, int16_t ch_in,
+                 int16_t *ch_out)
+{
+   intin[0] = ch_in;
+
+   contrl[0] = 30;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *ch_out = intout[0];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]30 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]ch_in
intoutintout[0]ch_out
+
+ + +
+ +

7.7.17 vrq_locator

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Input Locator, Request Mode« - ermittel die Mausposition, +wenn eine Taste gedrückt wurde. +
  +
VDI-Nummer: 28 +
  +
Deklaration: void vrq_locator ( int16_t handle, int16_t x, int16_t y, +int16_t *xout, int16_t *yout, int16_t *term ); +
  +
Beschreibung: Die Funktion ermittelt bzw. setzt die Position des +Grafik-Cursors. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
x x-Koordinate +
y y-Koordinate des Grafikcursors +
xout x-Koordinate +
yout y-Koordinate des Grafikcursors bei der Rückgabe +
term im Low-Byte wird der Code der Abbruch-Taste eingetragen. Dies +ist normalerweise der ASCII-Code. Spezielle Werte wie z.B. die +Maustasten erhalten jedoch Werte ab 32 und können so nicht direkt von +Tasten der Tastatur unterschieden werden. + +
+ +
Das Ergebnis erhält der Benutzer erst, wenn eine Taste +gedrückt wird. Der Grafikcursor wird stets an der angegebenen +Position in der aktuellen Form auf dem Bildschirm sichtbar. Zu +beachten ist, daß jede beliebige Taste (also auch die Maustasten) +gedrückt werden darf. +
  +
Normalerweise erfolgt eine Bewegung des Grafikcursors in großen +Schritten, wenn die Cursortasten gedrückt werden, bzw. in kleinen +Schritten, wenn diese in Verbindung mit der Shift-Taste gedrückt +werden. Auf dem Atari wird jedoch zusätzlich die Alternate-Taste +benötigt. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Die Funktion wird nicht von allen Gerätetreibern unterstützt. +Die Eingabefunktionen des VDI arbeiten nur auf der +physikalischen Workstation, die im Normalfall von den AES +benutzt wird. +
  +
Gruppe: Eingabefunktionen +
  +
Querverweis: Binding   vsm_locator   vsin_mode +
  + +
+ +

7.7.18 Bindings für vrq_locator

+ + + + + + + + + +
C: void vrq_locator ( int16_t handle, int16_t x, int16_t y, +int16_t *xout, int16_t *yout, int16_t *term ); +
  +
Umsetzung: +
  +
void vrq_locator (int16_t handle, int16_t x, int16_t y,
+                  int16_t *xout, int16_t *yout, int16_t *term)
+{
+   ptsin[0] = x;
+   ptsin[1] = y;
+
+   contrl[0] = 28;
+   contrl[1] = 1;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *xout = ptsout[0];
+   *yout = ptsout[1];
+   *term = intout[0];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]28 # Opcode der Funktion
contrl+2contrl[1]1 # Einträge in ptsin
contrl+4contrl[2]1 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+12contrl[6]handle
ptsinptsin[0]x
ptsin+2ptsin[1]y
intoutintout[0]term
ptsoutptsout[0]xout
ptsout+2ptsout[1]yout
+
+ + +
+ +

7.7.19 vrq_string

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Input String, Request Mode« - liest einen String im +REQUEST-Modus ein. +
  +
VDI-Nummer: 31 +
  +
Deklaration: void vrq_string ( int16_t handle, int16_t max_length, int16_t +echo_mode, int16_t *echo_xy, int8_t *string ); +
  +
Beschreibung: Die Funktion liest einen String von der Tastatur ein, wobei +optional ein Echo auf dem Bildschirm erfolgen kann. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
max_length maximale Länge des Strings +
echo_mode Modus + + + + + + +
0 = kein Echo +
1 = Echo benutzen + +
+ +
echo_xy[0] x-Koordinate +
echo_xy[1] y-Koordinate für den Startpunkt der Echoausgabe +
string Adresse der Zeichenkette + +
+ +
Die Echoausgabe ist nicht auf allen Geräten verfübar; im Falle +eines Echos werden die Text-Attribute jedoch berücksichtigt. +
  +
Ist max_length negativ, so wird der Absolutbetrag als +Länge betrachtet, und statt der ASCII-Codes werden Scan-Codes +übergeben. +
  +
Hinweis: Die Eingabefunktionen des VDI arbeiten nur auf +der physikalischen Workstation, die im Normalfall von den AES +benutzt wird. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: This call is not guaranteed to be available with any driver and +its use should therefore be restricted. +
  +
Gruppe: Eingabefunktionen +
  +
Querverweis: Binding   vswr_mode   vs_color   vst_alignment   vst_height   +vst_point   vst_rotation   vst_font   vst_color   vst_effects   +vsm_string +
  + +
+ +

7.7.20 Bindings für vrq_string

+ + + + + + + + + +
C: void vrq_string ( int16_t handle, int16_t max_length, int16_t +echo_mode, int16_t *echo_xy, int8_t *string ); +
  +
Umsetzung: +
  +
void vrq_string (int16_t handle, int16_t max_length,
+                 int16_t echo_mode, int16_t *echo_xy,
+                 int8_t *string)
+{
+   int16_t tmp;
+
+   intin[0] = max_length;
+   intin[1] = echo_mode;
+   ptsin[0..1] = echo_xy[0..1];
+
+   contrl[0] = 31;
+   contrl[1] = 1;
+   contrl[3] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   for (tmp = 0; tmp < contrl[4]; tmp++)
+      *string++ = intout[tmp];
+
+   *string = 0;
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]31 # Opcode der Funktion
contrl+2contrl[1]1 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]2 # Einträge in intin
contrl+8contrl[4]n # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]max_length
intin+2intin[1]echo_mode
ptsinptsin[0..1]echo_xy[0..1]
intoutintout[0..n-1]string[0..n-1]
+
+ + +
+ +

7.7.21 vrq_valuator

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Input Valuator, Request Mode« - stellt Wertveränderungen im +REQUEST-Modus fest. +
  +
VDI-Nummer: 29 +
  +
Deklaration: void vrq_valuator ( int16_t handle, int16_t valuator_in, +int16_t *valuator_out, int16_t *terminator ); +
  +
Beschreibung: Die Funktion ermittelt eine Wertveränderung, die sich aus +verschiedenen Tastenbetätigungen ergibt. Es gilt: +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
valuator_in Anfangswert +
valuator_out Ausgabewert +
terminator betätigte Taste + +
+ +
Es werden immer Werte zwischen 1 und 100 zurückgegeben. +Typische Tasten für Wertveränderung sind Cursor-hoch bzw. +Cursor-runter. Hier erhält man folgende Wertveränderung zum jeweils +aktuellen Wert: +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
TastendruckWert
Cursor hoch+ 10
Cursor runter- 10
Shift + Cursor hoch+ 01
Shift + Cursor runter- 01
+
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Die Funktion wird nicht von allen Gerätetreibern (auch +nicht dem im ROM) unterstützt. Die Eingabefunktionen des VDI arbeiten +nur auf der physikalischen Workstation, die im Normalfall von +den AES benutzt wird. +
  +
Gruppe: Eingabefunktionen +
  +
Querverweis: Binding   vsm_valuator   vsin_mode +
  + +
+ +

7.7.22 Bindings für vrq_valuator

+ + + + + + + + + +
C: void vrq_valuator ( int16_t handle, int16_t valuator_in, +int16_t *valuator_out, int16_t *terminator ); +
  +
Umsetzung: +
  +
void vrq_valuator (int16_t handle, int16_t valuator_in,
+                   int16_t *valuator_out, int16_t *terminator)
+{
+   intin[0] = valuator_in;
+
+   contrl[0] = 29;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *valuator_out = intout[0];
+   *terminator   = intout[1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]29 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]2 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]valuator_in
intoutintout[0]valuator_out
intout+2intout[1]terminator
+
+ + +
+ +

7.7.23 vsc_form

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Mouse Form« - setzt die Mauszeigerform. +
  +
VDI-Nummer: 111 +
  +
Deklaration: void vsc_form ( int16_t handle, int16_t *pcur_form ); +
  +
Beschreibung: Die Funktion erlaubt die Definition der Form des Mauszeigers. +Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
pcur_form[0] x-Koordinate +
pcur_form[1] y-Koordinate des Hot-Spot +
pcur_form[2] reserviert, sollte 1 sein +
pcur_form[3] Farbindex der Hintergrundmaske +
pcur_form[4] Farbindex der Vordergrundmaske +
pcur_form[05..20] Definition der Hintergrundmaske +
pcur_form[21..36] Definition der Vordergrundmaske + +
+ +
Jede Maske wird als Feld mit 16 Wörtern zu je 16 Bit +festgelegt. Bit-15 des ersten Wortes ist hierbei die obere linke Ecke +der Maske, und Bit 0 von Wort 16 ist ist die rechte untere Ecke. +
  + +
Unter dem Hot-Spot versteht man die exakte Position des +Grafikcursors. Bei einem Pfeil würde dies der Pfeilspitze, bei einem +Kreuz der Mitte entsprechen. Die Koordinaten werden relativ zur oberen +linken Ecke der Maske angegeben. +
  +
Zum Setzen der Mausform sollte in GEM-Programmen unbedingt die +AES-Funktion graf_mouse verwendet werden. Andernfalls wird die +Mausform-Verwaltung des AES nachhaltig verwirrt. +
  +
Hinweis: Die Eingabefunktionen des VDI arbeiten nur auf +der physikalischen Workstation, die im Normalfall von den +AES benutzt wird. Deshalb sollte man besser auf graf_mouse +zurückgreifen. +
  +
Unter NVDI ist es auch möglich, die aktuelle Form der Maus zu +ermitteln (vgl. Binding). +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all screen drivers. +
  +
Gruppe: Eingabefunktionen +
  +
Querverweis: Binding   graf_mouse   MFORM +
  + +
+ +

7.7.24 Bindings für vsc_form

+ + + + + + + + + +
C: void vsc_form ( int16_t handle, int16_t *pcur_form ); +
  +
Umsetzung: +
  +
void vsc_form (int16_t handle, int16_t *pcur_form)
+{
+   intin[0..36] = pcur_form[0..36];
+
+   contrl[0] = 111;
+   contrl[1] = 0;
+   contrl[3] = 37;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]111 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]37 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0..36]pcur_form[0..36]
+
+ +
Hinweis: Unter NVDI ist auch möglich, die aktuelle +Mausform zu ermitteln. Die dazu nötigen Belegungen der +Ein-/Ausgabefelder lauten wie folgt: +
  + + + + + + + + + + + + + + + + + + + + + +
contrl[0] = 111; +
contrl[1] = 0; +
contrl[2] = 0; +
contrl[3] = 0; +
contrl[4] = 37; +
contrl[6] = handle; +
intout[0..36] = pcur_form[0..36]; + +
+ + +
+ +

7.7.25 vsin_mode

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Input Mode« - setzt den Eingabemodus +
  +
VDI-Nummer: 33 +
  +
Deklaration: int16_t vsin_mode ( int16_t handle, int16_t dev_type, int16_t +mode ); +
  +
Beschreibung: Die Funktion setzt den Eingabemodus auf Request oder Sample. Es +gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
dev_type Art des Eingabegeräts + + + + + + + + + + + + +
1 = Positionseingabe (Maus) +
2 = wertändernde Einheiten (Cursor) +
3 = auswählende Einheiten (Funktionstasten) +
4 = alphanumerische Geräte (Tastatur) + +
+ +
mode gewünschter Modus + + + + + + +
1 = Request +
2 = Sample + +
+ + +
+ +
Im Request-Modus wartet das Eingabegerät auf eine Eingabe, im +Sample-Modus wird lediglich der Zustand oder die Position der +Eingabeeinheit zurückgegeben. +
  +
Hinweis: Die Eingabefunktionen des VDI arbeiten nur auf +der physikalischen Workstation, die im Normalfall von den AES +benutzt wird. +
  +
Ergebnis: Die Funktion liefert den ausgewählten Eingabemodus zurück. +
  +
Verfügbar: Supported in ROM by all Atari computers. +
  +
Gruppe: Eingabefunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.7.26 Bindings für vsin_mode

+ + + + + + + + + +
C: int16_t vsin_mode ( int16_t handle, int16_t dev_type, int16_t +mode ); +
  +
Umsetzung: +
  +
int16_t vsin_mode (int16_t handle, int16_t dev_type,
+                  int16_t mode)
+{
+   intin[0] = dev_type;
+   intin[1] = mode;
+
+   contrl[0] = 33;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   /* Vorsicht: Nicht alle Bindings liefern einen
+      Return-Wert !!! */
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]33 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]2 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]dev_type
intin+2intin[1]mode
intoutintout[0]Return-Wert
+
+ + +
+ +

7.7.27 vsm_choice

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Input choice, Sample Mode« - ermittelt welche Funktionstaste +zuletzt gedrückt wurde. +
  +
VDI-Nummer: 30 +
  +
Deklaration: int16_t vsm_choice ( int16_t handle, int16_t *choice ); +
  +
Beschreibung: Die Funktion ermittelt die Nummer der zuletzt betätigten +Auswahltaste. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
choice betätigte Auswahltaste oder 0, falls keine solche gedrückt +worden ist + +
+ +
Die Anzahl der Funktionstasten ist vom jeweiligen Gerät +abhängig. Falls eine andere Taste betätigt worden ist, wird die +zugehörige Codenummer zurückgeliefert. +
  +
Ergebnis: Die Funktion liefert den Auswahlstatus (0 = keine Taste +betätigt, 1 = Taste betätigt) zurück. +
  +
Verfügbar: Die Funktion ist zwar im ROM implementiert, scheint aber nicht +richtig zu funktionieren. Die Funktion wird nicht von allen +Gerätetreibern unterstützt. Die Eingabefunktionen des VDI arbeiten +nur auf der physikalischen Workstation, die im Normalfall von +den AES benutzt wird. +
  +
Gruppe: Eingabefunktionen +
  +
Querverweis: Binding   vrq_choice   vsin_mode +
  + +
+ +

7.7.28 Bindings für vsm_choice

+ + + + + + + + + +
C: int16_t vsm_choice ( int16_t handle, int16_t *choice ); +
  +
Umsetzung: +
  +
int16_t vsm_choice ( int16_t handle, int16_t *choice )
+{
+   contrl[0] = 30;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *choice = intout[0];
+   return ( contrl[4] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]30 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]status # Einträge in intout
contrl+12contrl[6]handle
intoutintout[0]choice
+
+ + +
+ +

7.7.29 vsm_locator

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Input Locator, Sample Mode« - bestimmt die Position des +Grafikcursors. +
  +
VDI-Nummer: 28 +
  +
Deklaration: int16_t vsm_locator ( int16_t handle, int16_t x, int16_t y, +int16_t *xout, int16_t *yout, int16_t *term ); +
  +
Beschreibung: Die Funktion setzt bzw. ermittelt die Position des +Grafikcursors. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Position Bedeutung +
    +
handle Kennung der Workstation +
x x-Koordinate +
y y-Koordinate des Grafikcursors +
xout x-Koordinate +
yout y-Koordinate des Grafikcursors bei Rückgabe +
term im Low-Byte wird der Code der Abbruch-Taste eingegeben. +Spezielle Tasten (Maustasten etc.) erhalten Werte ab 32 aufwärts, und +können daher nicht direkt von Tasten der Tastatur unterschieden +werden. + +
+ +
Der Grafikcursor wird durch diese Funktion nicht +sichtbar; Tastenbetätigungen oder Cursorbewegungen werden nur dann +gemeldet, wenn diese tatsächlich erfolgt sind. +
  +
Hinweis: Die Eingabefunktionen des VDI arbeiten nur auf +der physikalischen Workstation, die im Normalfall von den AES +benutzt wird. +
  +
Ergebnis: Die Funktion liefert kodiert Informationen darüber, ob sich +die Position verändert hat (Bit 0 gesetzt) und ob eine Taste +gedrückt wurde (Bit 1 gesetzt). +
  +
Verfügbar: Die Funktion wird nicht von allen Gerätetreibern unterstützt. +
  +
Gruppe: Eingabefunktionen +
  +
Querverweis: Binding   vrq_locator   vsin_mode +
  + +
+ +

7.7.30 Bindings für vsm_locator

+ + + + + + + + + +
C: int16_t vsm_locator ( int16_t handle, int16_t x, int16_t y, +int16_t *xout, int16_t *yout, int16_t *term ); +
  +
Umsetzung: +
  +
int16_t vsm_locator (int16_t handle, int16_t x, int16_t y,
+                     int16_t *xout, int16_t *yout,
+                     int16_t *term)
+{
+   ptsin[0] = x;
+   ptsin[1] = y;
+
+   contrl[0] = 28;
+   contrl[1] = 1;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *xout = ptsout[0];
+   *yout = ptsout[1];
+   *term = intout[0];
+
+   return ( (contrl[4] << 1) | (contrl[2]) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]28 # Opcode der Funktion
contrl+2contrl[1]1 # Einträge in ptsin
contrl+4contrl[2]0 oder 1 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 oder 1 # Einträge in intout
contrl+12contrl[6]handle
ptsinptsin[0]x
ptsin+2ptsin[1]y
intoutintout[0]term
ptsoutptsout[0]xout
ptsout+2ptsout[1]yout
+
+ + +
+ +

7.7.31 vsm_string

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Input String, Sample Mode« - liest einen String im +SAMPLE-Modus ein. +
  +
VDI-Nummer: 31 +
  +
Deklaration: int16_t vsm_string ( int16_t handle, int16_t max_length, +int16_t echo_mode, int16_t *echo_xy, int8_t *string ); +
  +
Beschreibung: Die Funktion gibt einen String von der Tastatur zurück. Es +gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
max_length maximale Länge des Strings +
echo_mode Modus + + + + + + +
0 = kein Echo +
1 = Echo benutzen + +
+ +
echo_xy[0] x-Koordinate +
echo_xy[1] y-Koordinate für den Startpunkt der Echoausgabe +
string Adresse der Zeichenkette + +
+ +
Die Echoausgabe ist nicht auf allen Geräten verfübar; im Falle +eines Echos werden die Text-Attribute jedoch berücksichtigt. +
  +
Ist max_length negativ, so wird der Absolut-Betrag als +Länge benutzt und statt der ASCII-Codes werden Scan-Codes übergeben. +
  +
Die Eingabe der Zeichenkette wird abgebrochen durch: +
  +
    +
  • Return +
  • +
  • erreichen der maximalen Eingabelänge +
  • +
  • nicht verfügbare Datenwerte +
  • +
+ +
Falls die Zeichenkette grundsätzlich mit Return abgeschlossen +werden soll, ist der Request-Modus per vrq_string zu wählen. +
  +
Hinweis: Die Eingabefunktionen des VDI arbeiten nur auf +der physikalischen Workstation, die im Normalfall von den AES +benutzt wird. +
  +
Ergebnis: Die Funktion liefert entweder die Anzahl der gelesen Zeichen +oder Null, falls die Eingabe durch eine ungültige Taste abgebrochen +wurde. Der eingegebene Text steht in string. +
  +
Verfügbar: Die Funktion wird nicht von allen Gerätetreibern unterstützt. +
  +
Gruppe: Eingabefunktionen +
  +
Querverweis: Binding   vswr_mode   vs_color   vst_alignment   vst_height   +vst_point   vst_rotation   vst_font   vst_color   vst_effects   +vrq_string +
  + +
+ +

7.7.32 Bindings für vsm_string

+ + + + + + + + + +
C: int16_t vsm_string ( int16_t handle, int16_t max_length, +int16_t echo_mode, int16_t *echo_xy, int8_t *string ); +
  +
Umsetzung: +
  +
int16_t vsm_string (int16_t handle, int16_t max_length,
+                    int16_t echo_mode, int16_t *echo_xy,
+                    int8_t *string)
+{
+   int16_t tmp;
+
+   intin[0] = max_length;
+   intin[1] = echo_mode;
+   ptsin[0..1] = echo_xy[0..1];
+
+   contrl[0] = 31;
+   contrl[1] = 1;
+   contrl[3] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   for (tmp = 0; tmp < contrl[4]; tmp++)
+      *string++ = intout[tmp];
+
+   *string = 0;
+   return ( contrl[4] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]31 # Opcode der Funktion
contrl+2contrl[1]1 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]2 # Einträge in intin
contrl+8contrl[4]max_length # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]max_length
intin+2intin[1]echo_mode
ptsinptsin[0..1]echo_xy[0..1]
intoutintout[0..n-1]string[0..n-1]
+
+ + +
+ +

7.7.33 vsm_valuator

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Input Valuator, Sample Mode« - stellt Wertveränderungen im +SAMPLE-Modus fest. +
  +
VDI-Nummer: 29 +
  +
Deklaration: void vsm_valuator ( int16_t handle, int16_t val_in, int16_t +*val_out, int16_t *term, int16_t *status ); +
  +
Beschreibung: Die Funktion ermittelt Wertveränderungen im Sample-Modus. Es +gilt: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
val_in Anfangswert +
val_out Ausgabewert +
term ASCII-Code der gedrückten Taste +
status Auswertung + + + + + + + + + +
0 = keine Veränderung +
1 = Wert verändert +
2 = Taste betätigt + +
+ + +
+ +
Es werden Werte zwischen 1 und 100 zurückgegeben, falls ein +entsprechendes Ereignis aufgetreten ist; anderenfalls wird kein Wert +zurückgeliefert. +
  +
Hinweis: Die Funktion wird nicht von allen +Gerätetreibern (auch nicht dem im ROM) unterstützt. Die +Eingabefunktionen des VDI arbeiten nur auf der physikalischen +Workstation, die im Normalfall von den AES benutzt wird. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Die Funktion wird nicht von allen Gerätetreibern unterstützt. +
  +
Gruppe: Eingabefunktionen +
  +
Querverweis: Binding   vrq_valuator   vsin_mode +
  + +
+ +

7.7.34 Bindings für vsm_valuator

+ + + + + + + + + +
C: void vsm_valuator ( int16_t handle, int16_t val_in, int16_t +*val_out, int16_t *term, int16_t *status ); +
  +
Umsetzung: +
  +
void vsm_valuator (int16_t handle, int16_t val_in,
+                   int16_t *val_out, int16_t *term,
+                   int16_t *status)
+{
+   intin[0] = val_in;
+
+   contrl[0] = 29;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *val_out = intout[0];
+   *term    = intout[1];
+   *status  = contrl[4];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]29 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]status # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]val_in
intoutintout[0]val_out
intout+2intout[1]term
+
+ + +
+ +

7.7.35 v_hide_c

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Hide Cursor« - schaltet den Grafikcursor aus. +
  +
VDI-Nummer: 123 +
  +
Deklaration: void v_hide_c ( int16_t handle ); +
  +
Beschreibung: Die Funktion schaltet den Grafikcursor auf dem Gerät mit der +Kennung handle aus. +
  +
Zum Ein-/Ausschalten der Maus sollte in GEM-Programmen unbedingt +die AES-Funktion graf_mouse verwendet werden. +
  +
Hinweis: Die Eingabefunktionen des VDI arbeiten nur auf +der physikalischen Workstation, die im Normalfall von den +AES benutzt wird. Deshalb sollte man besser auf graf_mouse +zurückgreifen. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all screen drivers. +
  +
Gruppe: Eingabefunktionen +
  +
Querverweis: Binding   v_show_c +
  + +
+ +

7.7.36 Bindings für v_hide_c

+ + + + + + + + + +
C: void v_hide_c ( int16_t handle ); +
  +
Umsetzung: +
  +
void v_hide_c (int16_t handle)
+{
+   contrl[0] = 123;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]123 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
+
+ + +
+ +

7.7.37 v_show_c

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Show Cursor« - schaltet den Grafikcursor ein. +
  +
VDI-Nummer: 122 +
  +
Deklaration: void v_show_c ( int16_t handle, int16_t reset ); +
  +
Beschreibung: Die Funktion zeigt den Grafikcursor, bzw. storniert einen +Aufruf der Funktion v_hide_c. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
reset Flag + + + + + + +
  0 = Anzahl der Hide-Cursor-Aufrufe ignorieren +
<>0 = normale Anwendung, d.h. ein Hide-Cursor-Aufruf wird storniert + +
+ + +
+ +
Zum Ein-/Ausschalten der Maus sollte in GEM Programmen unbedingt +die AES-Funktion graf_mouse verwendet werden. +
  +
Hinweis: Die Eingabefunktionen des VDI arbeiten nur +auf der physikalischen Workstation, die im Normalfall von den +AES benutzt wird. Deshalb sollte man besser auf graf_mouse +zurückgreifen. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all screen drivers. +
  +
Gruppe: Eingabefunktionen +
  +
Querverweis: Binding   v_hide_c   graf_mouse +
  + +
+ +

7.7.38 Bindings für v_show_c

+ + + + + + + + + +
C: void v_show_c ( int16_t handle, int16_t reset ); +
  +
Umsetzung: +
  +
void v_show_c (int16_t handle, int16_t reset)
+{
+   intin[0] = reset;
+
+   contrl[0] = 122;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]122 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]reset
+
+ + +
+ +
+ +Home +VDIVDI +AuskunftsfunktionenAuskunftsfunktionen +EscapefunktionenEscapefunktionen + + diff --git a/de/vdi_inquire.html b/de/vdi_inquire.html new file mode 100644 index 000000000..7594d011e --- /dev/null +++ b/de/vdi_inquire.html @@ -0,0 +1,10344 @@ + + + + + +Die Anleitung zum TOS: Auskunftsfunktionen + + + + + + + + + +Home +VDIVDI +AusgabefunktionenAusgabefunktionen +EingabefunktionenEingabefunktionen + +
+ +

7.6 Auskunftsfunktionen

+

Diese Bibliothek enthält Funktionen um eine Vielzahl von +gesetzten Attributen abfragen zu können. Zu diesem Zweck stehen die +folgenden Routinen zur Verfügung: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
vq_cellarray Abfrage der Belegung einer Farbauswahltabelle. +
vq_color Farbintensitäten ermitteln. +
vq_devinfo Status eines Ausgabegerätes erfragen. +
vq_ext_devinfo Informationen über einen Treiber ermitteln. +
vq_extnd Zusätzliche Informationen über die Konfiguration einer +Arbeitsstation ermitteln. +
vq_ptsinsz Interne Funktion von GDOS. +
vq_scrninfo Informationen über Bildschirmformat ermitteln. +
vqf_attributes Füllattribute ermitteln. +
vqf_bg_color Objekt Hintergrundfarbe ermitteln +
vqf_fg_color Objekt Vordergrundfarbe ermitteln +
vqin_mode Eingabemodus eines Eingabegeräts abfragen. +
vql_attributes Linienattribute ermitteln. +
vql_bg_color Linien Hintergrundfarbe ermitteln +
vql_fg_color Linen Vordergrundfarbe ermitteln +
vqm_attributes Markierungsattribute ermitteln. +
vqm_bg_color Marker Hintergrundfarbe ermitteln +
vqm_fg_color Marker Vordergrundfarbe ermitteln +
vqr_bg_color Bitmap Hintergrundfarbe ermitteln +
vqr_fg_color Bitmap Vordergrundfarbe ermitteln +
vqt_advance Position für nächstes Vektor-Zeichen ermitteln. +
vqt_advance32 Position für nächstes Vektor-Zeichen ermitteln (fix31). +
vqt_attributes Textattribute ermitteln. +
• vqt_cacheinfo z.Zt. keine Informationen bekannt. +
vqt_cachesize Ermitteln der Größe des Vektorzeichen-Caches. +
vqt_char_index Index-Konvertierung bzgl. eines Mappings. +
vqt_devinfo Status eines Ausgabegerätes erfragen. +
• vqt_drv_avail z.Zt. keine Informationen bekannt. +
vqt_ext_name Erweiterte Funktion für das Ermitteln von +Zeichensatzinformationen. +
vqt_extent Dimensionen eines Textrechtecks berechnen. +
vqt_f_extent Dimensionen eines Textrechtecks für Vektorfonts berechnen. +
• vqt_f_extent16 z.Zt. keine Informationen bekannt. +
vqt_bg_color Text Hintergrundfarbe ermitteln +
vqt_fg_color Text Vordergrundfarbe ermitteln +
vqt_fontheader Informationen über einen Zeichensatz ermitteln. +
vqt_fontinfo Informationen über einen Zeichensatz ermitteln. +
vqt_get_table Adresse der Zeichentransformationstabellen erfragen. +
vqt_justified Offsets von einem Ausrichtungspunkt erfragen. +
vqt_name Namen und Index eines Zeichensatzes ermitteln. +
vqt_name_and_id Zeichensatz-ID und Namen suchen. +
vqt_pairkern Korrekturfaktor für Abstände bei Pair-Kerning erfragen. +
vqt_real_extent Ermitteln des einen Text umgebenden Rechteckes. +
vqt_trackkern Korrekturfaktor für Fonts mit Track-Kerning erfragen. +
vqt_width Dimensionen einer Zeichenzelle berechnen. +
vqt_xfntinfo Informationen über einen Zeichensatz ermitteln. +
v_create_driver_info Informationen über einen Treiber ermitteln. +
v_delete_driver_info Informationen über einen Treiber löschen. +
v_get_driver_info Informationen über einen Treiber ermitteln. +
v_getbitmap_info Informationen über Vektorzeichen ermitteln. +
v_read_default_settings Ermitteln der Default Druckereinstellungen. +
v_write_default_settings Setzen der Default Druckereinstellungen. + +
+ +

Hinweis: Neben allgemeinen Attributen können über die +hier angegebenen Funktionen vor allem sehr ausführliche Informationen +zum Text-Handling ermittelt werden. +

+

Querverweis: Workstations des VDI   Style-Guidelines +

+

7.6.1 vqf_attributes

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Current Fill Area Attributes« - ermittelt die +Attribute zum Ausfüllen von Flächen. +
  +
VDI-Nummer: 37 +
  +
Deklaration: void vqf_attributes ( int16_t handle, int16_t *attrib ); +
  +
Beschreibung: Die Funktion ermittelt die aktuellen Füll-Attribute. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
attrib[0] Füllmuster +
attrib[1] Index der Füllfarbe +
attrib[2] Index des Füllmusters +
attrib[3] Schreibmodus +
attrib[4] Status für Umrahmung +
+
+ + + + + + + + +
0 =unsichtbar
<> 0 =sichtbar
+
+ + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all devices. +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding   vswr_mode   vs_color   vsf_interior   vsf_style   +vsf_color   vsf_perimeter +
  + +
+ +

7.6.2 Bindings für vqf_attributes

+ + + + + + + + + +
C: void vqf_attributes ( int16_t handle, int16_t *attrib ); +
  +
Umsetzung: +
  +
void vqf_attributes (int16_t handle, int16_t *attrib)
+{
+   contrl[0] = 37;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   attrib[0..4] = intout[0..4];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]37 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]5 # Einträge in intout
contrl+12contrl[6]handle
intoutintout[0..4]attrib[0..4]
+
+ + +
+ +

7.6.3 vqf_bg_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Background Color« - Objekt Hintergrundfarbe +ermitteln +
  +
VDI-Nummer: 203 (Unterfunktion 1) +
  +
Deklaration: int32_t vqf_bg_color( int16_t handle, COLOR_ENTRY *bg_color ); +
  +
Beschreibung: Diese Funktionen ermittelt die Hintergrundfarbe für Objekte. +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
bg_color COLOR_ENTRY der Hintergrundfarbe + +
+ +
Ergebnis: Eingestellter Farbraum (z.Zt. nur CSPACE_RGB) oder -1 (falsche +Unterfunktionsnummer). +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.6.4 Bindings für vqf_bg_color

+ + + + + + + + + +
C: int32_t vqf_bg_color( int16_t handle, COLOR_ENTRY *bg_color ); +
  +
Umsetzung: +
  +
int32_t vqf_bg_color( int16_t handle, COLOR_ENTRY *bg_color )
+{
+   contrl[0] = 203;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   bg_color = intout [2..5];
+   return ( int32_t intout [0]  );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]203 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]6 # Einträge in intout
contrl+10contrl[5]1 # Sub-opcode
contrl+12contrl[6]handle
intoutintout[0..1]color_space
intout+4intout[2..5]bg_color
+
+ + +
+ +

7.6.5 vqf_fg_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Foreground Color« - Objekt Vordergrundfarbe +ermitteln +
  +
VDI-Nummer: 202 (Unterfunktion 1) +
  +
Deklaration: int32_t vqf_fg_color( int16_t handle, COLOR_ENTRY *fg_color ); +
  +
Beschreibung: Diese Funktionen ermittelt die Vordergrundfarbe für Objekte. +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
fg_color COLOR_ENTRY der Vordergrundfarbe + +
+ +
Ergebnis: Eingestellter Farbraum (z.Zt. nur CSPACE_RGB) oder -1 (falsche +Unterfunktionsnummer). +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.6.6 Bindings für vqf_fg_color

+ + + + + + + + + +
C: int32_t vqf_fg_color( int16_t handle, COLOR_ENTRY *fg_color ); +
  +
Umsetzung: +
  +
int32_t vqf_fg_color( int16_t handle, COLOR_ENTRY *fg_color )
+{
+   contrl[0] = 202;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   fg_color = intout [2..5];
+   return ( int32_t intout [0]  );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]202 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]6 # Einträge in intout
contrl+10contrl[5]1 # Sub-opcode
contrl+12contrl[6]handle
intoutintout[0..1]color_space
intout+4intout[2..5]fg_color
+
+ + +
+ +

7.6.7 vqin_mode

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Input Mode« - ermittelt den Eingabemodus. +
  +
VDI-Nummer: 115 +
  +
Deklaration: void vqin_mode ( int16_t handle, int16_t dev_type, int16_t +*input_mode ); +
  +
Beschreibung: Die Funktion ermittelt den Eingabemodus für ein bestimmtes +Gerät. Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
dev_type Art des Eingabegeräts + + + + + + + + + + + + +
1 = Positionseingabe (Maus) +
2 = wertändernde Einheiten (Cursor) +
3 = auswählende Einheiten (Funktionstasten) +
4 = alphanumerische Geräte (Tastatur) + +
+ +
input_mode Eingabe-Modus + + + + + + +
1 = Request +
2 = Sample + +
+ + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all Atari computers. +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding   vsin_mode   vrq_locator   vsm_locator   vrq_valuator   +vsm_valuator   vrq_choice   vsm_choice   vrq_string   vsm_string +
  + +
+ +

7.6.8 Bindings für vqin_mode

+ + + + + + + + + +
C: void vqin_mode ( int16_t handle, int16_t dev_type, int16_t +*input_mode ); +
  +
Umsetzung: +
  +
void vqin_mode (int16_t handle, int16_t dev_type,
+                int16_t *input_mode)
+{
+   intin[0] = dev_type;
+
+   contrl[0] = 115;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *input_mode = intout[0];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]115 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]dev_type
intoutintout[0]input_mode
+
+ + +
+ +

7.6.9 vql_attributes

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Current Polyline Attributes« - ermittelt die +Attribute für das Zeichnen von Linien. +
  +
VDI-Nummer: 35 +
  +
Deklaration: void vql_attributes ( int16_t handle, int16_t *attrib ); +
  +
Beschreibung: Die Funktion ermittelt die aktuellen Linien-Attribute. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
attrib[0] Linientyp +
attrib[1] Index der Linienfarbe +
attrib[2] Schreibmodus +
attrib[3] Linienbreite bzgl. der x-Achse +
attrib[4] Anfangsform der Linie +
attrib[5] Endform der Linie + +
+ +
Hinweis: Die hier gemachten Angaben (insbesondere +attrib[4,5]) gelten für die NVDI-Implementation. +
  +
Ergebnis: Die Funktion liefert kein Ergebis. +
  +
Verfügbar: Supported by all drivers. +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding   vswr_mode   vs_color   vsl_type   vsl_width   +vsl_color   vsl_ends +
  + +
+ +

7.6.10 Bindings für vql_attributes

+ + + + + + + + + +
C: void vql_attributes ( int16_t handle, int16_t *attrib ); +
  +
Umsetzung: +
  +
void vql_attributes (int16_t handle, int16_t *attrib)
+{
+   contrl[0] = 35;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   attrib[0..2] = intout[0..2];
+   attrib[3]    = ptsout[0];
+   attrib[4..5] = intout[3..4];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]35 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]1 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]5 # Einträge in intout
contrl+12contrl[6]handle
intoutintout[0..4]attrib[0..2, 4..5]
ptsoutptsout[0]attrib[3]
ptsout+2ptsout[1]0
+
+ + +
+ +

7.6.11 vql_bg_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Background Color« - Linien Hintergrundfarbe +ermitteln +
  +
VDI-Nummer: 203 (Unterfunktion 2) +
  +
Deklaration: int32_t vql_bg_color( int16_t handle, COLOR_ENTRY *bg_color ); +
  +
Beschreibung: Diese Funktionen ermittelt die Hintergrundfarbe für Linien. +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
bg_color COLOR_ENTRY der Hintergrundfarbe + +
+ +
Ergebnis: Eingestellter Farbraum (z.Zt. nur CSPACE_RGB) oder -1 (falsche +Unterfunktionsnummer). +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.6.12 Bindings für vql_bg_color

+ + + + + + + + + +
C: int32_t vql_bg_color( int16_t handle, COLOR_ENTRY *bg_color ); +
  +
Umsetzung: +
  +
int32_t vql_bg_color( int16_t handle, COLOR_ENTRY *bg_color )
+{
+   contrl[0] = 203;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   bg_color = intout [2..5];
+   return ( int32_t intout [0]  );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]203 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]6 # Einträge in intout
contrl+10contrl[5]2 # Sub-opcode
contrl+12contrl[6]handle
intoutintout[0..1]color_space
intout+4intout[2..5]bg_color
+
+ + +
+ +

7.6.13 vql_fg_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Foreground Color« - Linien Vordergrundfarbe +ermitteln +
  +
VDI-Nummer: 202 (Unterfunktion 2) +
  +
Deklaration: int32_t vql_fg_color( int16_t handle, COLOR_ENTRY *fg_color ); +
  +
Beschreibung: Diese Funktionen ermittelt die Vordergrundfarbe für Linien. +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
fg_color COLOR_ENTRY der Vordergrundfarbe + +
+ +
Ergebnis: Eingestellter Farbraum (z.Zt. nur CSPACE_RGB) oder -1 (falsche +Unterfunktionsnummer). +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.6.14 Bindings für vql_fg_color

+ + + + + + + + + +
C: int32_t vql_fg_color( int16_t handle, COLOR_ENTRY *fg_color ); +
  +
Umsetzung: +
  +
int32_t vql_fg_color( int16_t handle, COLOR_ENTRY *fg_color )
+{
+   contrl[0] = 202;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   fg_color = intout [2..5];
+   return ( int32_t intout [0]  );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]202 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]6 # Einträge in intout
contrl+10contrl[5]2 # Sub-opcode
contrl+12contrl[6]handle
intoutintout[0..1]color_space
intout+4intout[2..5]fg_color
+
+ + +
+ +

7.6.15 vqm_attributes

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Current Polymarker Attributes« - ermittelt die +Attribute für das Zeichnen von Markierungen. +
  +
VDI-Nummer: 36 +
  +
Deklaration: void vqm_attributes ( int16_t handle, int16_t *attrib ); +
  +
Beschreibung: Die Funktion ermittelt die aktuellen Marker-Attribute. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
attrib[0] aktueller Markertyp +
Das ATARI-VDI gibt fehlerhafterweise den Typ mit eins niedriger +zurück (0 für DOT etc.) EmuTOS hält sich an diesen bekannten +Fehler. +
attrib[1] Index der Markerfarbe +
attrib[2] Schreibmodus +
attrib[3] Höhe des Markers +
attrib[4] Breite des Markers + +
+ +
Hinweis: Die hier gemachten Angaben gelten für die +Implementation in NVDI. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all drivers. +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding   vswr_mode   vs_color   vsm_type   vsm_height   +vsm_color +
  + +
+ +

7.6.16 Bindings für vqm_attributes

+ + + + + + + + + +
C: void vqm_attributes ( int16_t handle, int16_t *attrib ); +
  +
Umsetzung: +
  +
void vqm_attributes (int16_t handle, int16_t *attrib)
+{
+   contrl[0] = 36;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   attrib[0..2] = intout[0..2];
+   attrib[3]    = ptsout[1];
+   attrib[4]    = ptsout[0];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]36 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]1 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]3 # Einträge in intout
contrl+12contrl[6]handle
intoutintout[0..2]attrib[0..2]
ptsoutptsout[0]attrib[4]
ptsout+2ptsout[1]attrib[3]
+
+ + +
+ +

7.6.17 vqm_bg_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Background Color« - Marker Hintergrundfarbe +ermitteln +
  +
VDI-Nummer: 203 (Unterfunktion 3) +
  +
Deklaration: int32_t vqm_bg_color( int16_t handle, COLOR_ENTRY *bg_color ); +
  +
Beschreibung: Diese Funktionen ermittelt die Hintergrundfarbe für Marker. +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
bg_color COLOR_ENTRY der Hintergrundfarbe + +
+ +
Ergebnis: Eingestellter Farbraum (z.Zt. nur CSPACE_RGB) oder -1 (falsche +Unterfunktionsnummer). +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.6.18 Bindings für vqm_bg_color

+ + + + + + + + + +
C: int32_t vqm_bg_color( int16_t handle, COLOR_ENTRY *bg_color ); +
  +
Umsetzung: +
  +
int32_t vqm_bg_color( int16_t handle, COLOR_ENTRY *bg_color )
+{
+   contrl[0] = 203;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 3;
+   contrl[6] = handle;
+
+   vdi ();
+
+   bg_color = intout [2..5];
+   return ( int32_t intout [0]  );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]203 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]6 # Einträge in intout
contrl+10contrl[5]3 # Sub-opcode
contrl+12contrl[6]handle
intoutintout[0..1]color_space
intout+4intout[2..5]bg_color
+
+ + +
+ +

7.6.19 vqm_fg_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Foreground Color« - Marker Vordergrundfarbe +ermitteln +
  +
VDI-Nummer: 202 (Unterfunktion 3) +
  +
Deklaration: int32_t vqm_fg_color( int16_t handle, COLOR_ENTRY *fg_color ); +
  +
Beschreibung: Diese Funktionen ermittelt die Vordergrundfarbe für Marker. +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
fg_color COLOR_ENTRY der Vordergrundfarbe + +
+ +
Ergebnis: Eingestellter Farbraum (z.Zt. nur CSPACE_RGB) oder -1 (falsche +Unterfunktionsnummer). +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.6.20 Bindings für vqm_fg_color

+ + + + + + + + + +
C: int32_t vqm_fg_color( int16_t handle, COLOR_ENTRY *fg_color ); +
  +
Umsetzung: +
  +
int32_t vqm_fg_color( int16_t handle, COLOR_ENTRY *fg_color )
+{
+   contrl[0] = 202;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 3;
+   contrl[6] = handle;
+
+   vdi ();
+
+   fg_color = intout [2..5];
+   return ( int32_t intout [0]  );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]202 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]6 # Einträge in intout
contrl+10contrl[5]3 # Sub-opcode
contrl+12contrl[6]handle
intoutintout[0..1]color_space
intout+4intout[2..5]fg_color
+
+ + +
+ +

7.6.21 vqr_bg_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Background Color« - Bitmap Hintergrundfarbe +ermitteln +
  +
VDI-Nummer: 203 (Unterfunktion 4) +
  +
Deklaration: int32_t vqr_bg_color( int16_t handle, COLOR_ENTRY *bg_color ); +
  +
Beschreibung: Diese Funktionen ermittelt die Hintergrundfarbe für Bitmaps. +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
bg_color COLOR_ENTRY der Hintergrundfarbe + +
+ +
Ergebnis: Eingestellter Farbraum (z.Zt. nur CSPACE_RGB) oder -1 (falsche +Unterfunktionsnummer). +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.6.22 Bindings für vqr_bg_color

+ + + + + + + + + +
C: int32_t vqr_bg_color( int16_t handle, COLOR_ENTRY *bg_color ); +
  +
Umsetzung: +
  +
int32_t vqr_bg_color( int16_t handle, COLOR_ENTRY *bg_color )
+{
+   contrl[0] = 203;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 4;
+   contrl[6] = handle;
+
+   vdi ();
+
+   bg_color = intout [2..5];
+   return ( int32_t intout [0]  );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]203 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]6 # Einträge in intout
contrl+10contrl[5]4 # Sub-opcode
contrl+12contrl[6]handle
intoutintout[0..1]color_space
intout+4intout[2..5]bg_color
+
+ + +
+ +

7.6.23 vqr_fg_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Foreground Color« - Bitmap Vordergrundfarbe +ermitteln +
  +
VDI-Nummer: 202 (Unterfunktion 4) +
  +
Deklaration: int32_t vqr_fg_color( int16_t handle, COLOR_ENTRY *fg_color ); +
  +
Beschreibung: Diese Funktionen ermittelt die Vordergrundfarbe für Bitmap. +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
fg_color COLOR_ENTRY der Vordergrundfarbe + +
+ +
Ergebnis: Eingestellter Farbraum (z.Zt. nur CSPACE_RGB) oder -1 (falsche +Unterfunktionsnummer). +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.6.24 Bindings für vqr_fg_color

+ + + + + + + + + +
C: int32_t vqr_fg_color( int16_t handle, COLOR_ENTRY *fg_color ); +
  +
Umsetzung: +
  +
int32_t vqr_fg_color( int16_t handle, COLOR_ENTRY *fg_color )
+{
+   contrl[0] = 202;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 4;
+   contrl[6] = handle;
+
+   vdi ();
+
+   fg_color = intout [2..5];
+   return ( int32_t intout [0]  );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]202 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]6 # Einträge in intout
contrl+10contrl[5]4 # Sub-opcode
contrl+12contrl[6]handle
intoutintout[0..1]color_space
intout+4intout[2..5]fg_color
+
+ + +
+ +

7.6.25 vqt_advance

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Outline text advance placement vector« - Position +für nächstes Vektor-Zeichen ermitteln. +
  +
VDI-Nummer: 247 +
  +
Deklaration: void vqt_advance ( int16_t handle, int16_t ch, int16_t +*x_advance, int16_t *y_advance, int16_t *remx, int16_t *remy ); +
  +
Beschreibung: Die Funktion berechnet Offsets, um das nächste Zeichen eines +Strings an die richtige Position schreiben zu können. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
ch interessierendes Zeichen +
x_advance x-Abstand in Pixeln +
y_advance y-Abstand in Pixeln +
remx x-Nachkommarest (mod 16384) +
remy y-Nachkommarest (mod 16384) + +
+ +
Hinweis: Die Funktion wird inbesondere dann benötigt, +wenn der Winkel für Textrotationen ein anderer als 0, 90, 180 oder +270 Grad ist. +
  +
Bei den gelieferten Werten handelt es sich nur um den Abstand, +der für die Positionierung des nächsten Zeichens benutzt wird, d.h. +x_advance beinhaltet keine Zeichenüberhänge. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: FSMGDOS, ab SpeedoGDOS 4.00 und ab NVDI 3.00. +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding   vqt_advance   vst_rotation   SpeedoGDOS   NVDI +
  + +
+ +

7.6.26 Bindings für vqt_advance

+ + + + + + + + + +
C: void vqt_advance ( int16_t handle, int16_t ch, int16_t +*x_advance, int16_t *y_advance, int16_t *remx, int16_t *remy ); +
  +
Umsetzung: +
  +
void vqt_advance ( int16_t handle, int16_t ch,
+                   int16_t *x_advance, int16_t *y_advance,
+                   int16_t *remx, int16_t *remy );
+{
+   intin[0] = ch;
+
+   contrl[0] = 247;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   x_advance = ptsout[0];
+   y_advance = ptsout[1];
+   remx      = ptsout[2];
+   remy      = ptsout[3];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]247 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]4 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]ch
ptsoutptsout[0]x_advance
ptsout+2ptsout[1]y_advance
ptsout+4ptsout[2]remx
ptsout+6ptsout[3]remy
+
+ +
Es handelt sich bei x_advance und y_advance nur um den Abstand, +der für die Positionierung des nächsten Zeichens benutzt wird, d.h. +x_advance beinhaltet keine Zeichenüberhänge. +
  + +
+ +

7.6.27 vqt_advance32

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Outline text advance placement vector« - Position +für nächstes Vektor-Zeichen ermitteln. +
  +
VDI-Nummer: 247 +
  +
Deklaration: void vqt_advance32 ( int16_t handle, int16_t ch, fix31 +*x_advance, fix31 *y_advance ); +
  +
Beschreibung: Die Funktion berechnet Offsets, um das nächste Zeichen eines +Strings an die richtige Position schreiben zu können. Es gilt: +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
ch interessierendes Zeichen +
x_advance x-Abstand in 1/65536 Pixeln +
y_advance y-Abstand in 1/65536 Pixeln + +
+ +
Hinweis: Die Funktion wird inbesondere dann benötigt, +wenn der Winkel für Textrotationen ein anderer als 0, 90, 180 oder +270 Grad ist. +
  +
Bei den gelieferten Werten handelt es sich nur um den Abstand, +der für die Positionierung des nächsten Zeichens benutzt wird, d.h. +x_advance beinhaltet keine Zeichenüberhänge. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: ab SpeedoGDOS 4.00 und ab NVDI 3.00. In der Doku zu NVDI 3.00 +wird die Funktion fälschlicherweise vqt_advance genannt. +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding   vst_rotation   SpeedoGDOS   NVDI +
  + +
+ +

7.6.28 Bindings für vqt_advance32

+ + + + + + + + + +
C: void vqt_advance32 ( int16_t handle, int16_t ch, fix31 +*x_advance, fix31 *y_advance ); +
  +
Umsetzung: +
  +
void vqt_advance32 (int16_t handle, int16_t ch,
+                   fix31 *x_advance, fix31 *y_advance)
+{
+   intin[0] = ch;
+
+   contrl[0] = 247;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *x_advance = ptsout[4..5];
+   *y_advance = ptsout[6..7];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]247 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]4 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]ch
ptsout+8ptsout[4..5]x_advance
ptsout+12ptsout[6..7]y_advance
+
+ +
Es handelt sich bei x_advance und y_advance nur um den Abstand, +der für die Positionierung des nächsten Zeichens benutzt wird, d.h. +x_advance beinhaltet keine Zeichenüberhänge. +
  + +
+ +

7.6.29 vqt_attributes

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Current Graphic Text Attributes« - ermittelt die +Attribute für das Schreiben von Texten. +
  +
VDI-Nummer: 38 +
  +
Deklaration: void vqt_attributes ( int16_t handle, int16_t *attrib ); +
  +
Beschreibung: Die Funktion ermittelt die aktuellen Text-Attribute. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
attrib[0] Zeichensatznummer +
attrib[1] Textfarbe +
attrib[2] Drehwinkel des Texts (in 1/10 Grad) +
attrib[3] horizontale Ausrichtung + + + + + + + + + +
0 = linksbündig +
1 = zentriert +
2 = rechtsbündig + +
+ +
attrib[4] vertikale Ausrichtung + + + + + + + + + + + + + + + + + + +
0 = Baseline +
1 = Half line +
2 = Ascent line +
3 = Bottom line +
4 = Descent line +
5 = Top line + +
+ +
attrib[5] Schreibmodus +
Das ATARI-VDI gibt fehlerhafterweise den Schreibmodus mit eins +niedriger zurück (0 für REPLACE etc.) EmuTOS hält sich an diesen +bekannten Fehler. +
attrib[6] Breite eines Zeichens +
attrib[7] Höhe eines Zeichens +
attrib[8] Zeichenzellenbreite +
attrib[9] Zeichenzellenhöhe + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all drivers. +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding   vswr_mode   vs_color   vst_height   vst_point   +vst_rotation   vst_font   vst_color   vst_effects   vst_alignment +
  + +
+ +

7.6.30 Bindings für vqt_attributes

+ + + + + + + + + +
C: void vqt_attributes ( int16_t handle, int16_t *attrib ); +
  +
Umsetzung: +
  +
void vqt_attributes (int16_t handle, int16_t *attrib)
+{
+   contrl[0] = 38;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   attrib[0..5] = intout[0..5];
+   attrib[6..9] = ptsout[0..3];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]38 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]2 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]6 # Einträge in intout
contrl+12contrl[6]handle
intoutintout[0..5]attrib[0..5]
ptsoutptsout[0..3]attrib[6..9]
+
+ +
Hinweis: Das Atari-VDI gibt fälschlicherweise in +intout[5] den Schreibmodus-1 zurück; mit NVDI geschieht das nur mit +eingeschalteter Fehlerkompatibilität. +
  + +
+ +

7.6.31 vqt_bg_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Background Color« - Text Hintergrundfarbe ermitteln +
  +
VDI-Nummer: 203 (Unterfunktion 0) +
  +
Deklaration: int32_t vqt_bg_color( int16_t handle, COLOR_ENTRY *bg_color ); +
  +
Beschreibung: Diese Funktionen ermittelt die Hintergrundfarbe für Text. +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
bg_color COLOR_ENTRY der Hintergrundfarbe + +
+ +
Ergebnis: Eingestellter Farbraum (z.Zt. nur CSPACE_RGB) oder -1 (falsche +Unterfunktionsnummer). +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.6.32 Bindings für vqt_bg_color

+ + + + + + + + + +
C: int32_t vqt_bg_color( int16_t handle, COLOR_ENTRY *bg_color ); +
  +
Umsetzung: +
  +
int32_t vqt_bg_color( int16_t handle, COLOR_ENTRY *bg_color )
+{
+   contrl[0] = 203;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   bg_color = intout [2..5];
+   return ( int32_t intout [0]  );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]203 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]6 # Einträge in intout
contrl+10contrl[5]0 # Sub-opcode
contrl+12contrl[6]handle
intoutintout[0..1]color_space
intout+4intout[2..5]bg_color
+
+ + +
+ +

7.6.33 vqt_cachesize

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Get Outline cache size« - Ermitteln der Größe des +Vektorzeichen-Caches. +
  +
VDI-Nummer: 255 +
  +
Deklaration: void vqt_cachesize ( int16_t handle, int16_t which_cache, +int32_t *size ); +
  +
Beschreibung: Die Funktion ermittelt die Größe des Vektorzeichen-Caches. Es +gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
which_cache Cache + + + + + + +
0 = Bitmap-Cache +
1 = Cache für Datenstruktur + +
+ +
size Größe des jeweiligen Caches + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: FSMGDOS, ab SpeedoGDOS 4.00 +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding   v_loadcache   v_savecache   v_flushcache +
  + +
+ +

7.6.34 Bindings für vqt_cachesize

+ + + + + + + + + +
C: void vqt_cachesize ( int16_t handle, int16_t which_cache, +int32_t *size ); +
  +
Umsetzung: +
  +
void vqt_cachesize ( int16_t handle, int16_t which_cache,
+                     int32_t *size );
+{
+   intin[0] = which_cache;
+
+   contrl[0] = 255;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *size = intout[0..1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]255 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]2 # Einträge in intout
contrl+12contrl[6]handle
intoutintout[0]Returnwert
+
+ + +
+ +

7.6.35 vqt_char_index

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Character Index« - Konvertiert einen Index bzgl. +eines bestimmten Mappings. +
  +
VDI-Nummer: 190 (Opcode 0) +
  +
Deklaration: uint16_t vqt_char_index ( int16_t handle, uint16_t scr_index, +int16_t src_mode, int16_t dst_mode ); +
  +
Beschreibung: Die Funktion konvertiert einen übergebenen Index anhand eines +gewünschen Mappings. Es gilt: +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
src_index zu konvertierender Index +
src_mode Art des Quell-Mappings + + + + + + + + + +
0 = scr_index als direkter Index +
1 = scr_index als ASCII-Index +
2 = scr_index als Unicode-Index + +
+ +
dst_mode Art des Ziel-Mappings + + + + + + + + + +
0 = direkter Index +
1 = ASCII-Index +
2 = Unicode-Index + +
+ + +
+ +
Hinweis: Soll ein Index vom ASCII-Format ausgehend oder +ins ASCII-Format gewandelt werden, dann wird nur der Bereich von Index +32 bis 255 beachtet. Die Steuerzeichen von 0 bis 31 werden +nicht gewandelt, d.h. der Aufruf von vqt_char_index (handle, +10, 1, 0) liefert als Ergebnis den Wert 0xffff. +
  +
Um z.B. zu überprüfen, ob der eingestellte Font ein Zeichen +mit Unicode 0x201e (quotedblbase, 99er Anführungszeichen unten) +enthält, sollte die folgende Funktion aufgerufen werden: +
  +
int16_t is_char_available (int16_t handle, uint16_t unicode)
+{
+   uint16_t dindex;
+
+   /* Unicode <unicode> in direkten Index wandeln */
+   dindex = vqt_char_index (handle, unicode, 2, 0);
+
+   if (dindex == 0xffff)
+      return (FALSE);
+   else
+      return (TRUE);
+}
+
+
Ergebnis: Die Funktion liefert den konvertierten Index zurück, bzw. den +Wert 0xffff, falls eine Konvertierung nicht möglich war. +
  +
Verfügbar: ab NVDI Version 4.00 +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding   vst_charmap +
  + +
+ +

7.6.36 Bindings für vqt_char_index

+ + + + + + + + + +
C: uint16_t vqt_char_index ( int16_t handle, uint16_t scr_index, +int16_t src_mode, int16_t dst_mode ); +
  +
Umsetzung: +
  +
uint16_t vqt_char_index ( int16_t handle, uint16_t scr_index,
+                          int16_t scr_mode, int16_t dst_mode )
+{
+   intin[0] = scr_index;
+   intin[1] = src_mode;
+   intin[2] = dst_mode;
+
+   contrl[0] = 190;
+   contrl[1] = 0;
+   contrl[3] = 3;
+   contrl[5] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]190 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]3 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]0
contrl+12contrl[6]handle
intinintin[0]scr_index
intin+2intin[1]scr_mode
intin+4intin[2]dst_mode
intoutintout[0]Return-Wert
+
+ + +
+ +

7.6.37 vqt_devinfo

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire device status info« - Status des Ausgabegeräts +erfragen. +
  +
VDI-Nummer: 248 +
  +
Deklaration: void vqt_devinfo ( int16_t handle, int16_t device, int16_t +*devexits, int8_t *devname ); +
  +
Beschreibung: Die Funktion überprüft, ob ein Treiber für ein bestimmtes +Ausgabegerät installiert worden ist. Es gilt: +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
device VDI-Gerätenummer (0..99) +
devexits + + + + + + + + + +
-1 = Es ist ein Fehler aufgetreten. +
 0 = Gerät nicht installiert +
 1 = Gerät installiert + +
+ +
devname Treibername + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Nur mit FONTGDOS, FSM oder SpeedoGDOS. +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding   vq_devinfo   vq_ext_devinfo   GDOS   SpeedoGDOS   +NVDI +
  + +
+ +

7.6.38 Bindings für vqt_devinfo

+ + + + + + + + + +
C: void vqt_devinfo ( int16_t handle, int16_t device, int16_t +*devexits, int8_t *devname ); +
  +
Umsetzung: +
  +
void vqt_devinfo ( int16_t handle, int16_t device,
+                   int16_t *devexits, int8_t *devname )
+{
+   intin[0] = device;
+
+   contrl[0] = 248;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *devexits = ptsout[0];
+   p = contrl[4];
+   dev_name[0..p-1]    = intout[0..p-1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]248 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]1 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]p # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]device
intoutintout[0..p-1]devname[0..p-1]
ptsoutptsout[0]devexits
+
+ + +
+ +

7.6.39 vqt_extent

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Text Extent« - ermittelt die Länge eines Strings. +
  +
VDI-Nummer: 116 +
  +
Deklaration: void vqt_extent ( int16_t handle, int8_t *string, int16_t +*extent ); +
  +
Beschreibung: Die Funktion ermittelt die Ausmaße eines minimalen Rechteckes, +das einen Text unter Beachtung der Textattribute voll umgibt. +
  +
Beispiel: +
  +

+
Der Funktion werden folgende Parameter übergeben: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
string Adresse der Zeichenkette +
extent[0] x-Koordinate +
extent[1] y-Koordinate der unteren linken Ecke +
extent[2] x-Koordinate +
extent[3] y-Koordinate der unteren rechten Ecke +
extent[4] x-Koordinate +
extent[5] y-Koordinate der oberen rechten Ecke +
extent[6] x-Koordinate +
extent[7] y-Koordinate der oberen linken Ecke + +
+ +
Hinweis: Bei Vektorfonts addiert diese Funktion nur die +Schrittweiten, ohne Pair- oder Track-Kerning und Zeichenüberhänge zu +beachten. Aus diesem Grund sollte ggfs. auf die Funktion +vqt_real_extent zurückgegriffen werden. +
  +
In alten GEM-Versionen arbeitet die Funktion übrigens nicht +korrekt, falls die Zeichenkette Umlaute enthält, da alte +GEM-Versionen mit diesen noch nicht umgehen konnten. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all drivers. +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding   vst_height   vst_point   vst_rotation   vst_font   +vst_effects   vqt_f_extent   vqt_real_extent +
  + +
+ +

7.6.40 Bindings für vqt_extent

+ + + + + + + + + +
C: void vqt_extent ( int16_t handle, int8_t *string, int16_t +*extent ); +
  +
Umsetzung: +
  +
void vqt_extent (int16_t handle, int8_t *string,
+                 int16_t *extent)
+{
+   int16_t *tmp;
+
+   tmp = intin;
+   while (*tmp++ = *string++)
+      ;
+
+   contrl[0] = 116;
+   contrl[1] = 0;
+   contrl[3] = (int16_t) ((tmp-intin)-1);
+   contrl[6] = handle;
+
+   vdi ();
+
+   extent[0..7] = ptsout[0..7];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]116 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]4 # Einträge in ptsout
contrl+6contrl[3]n # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0..n-1]string[0..n-1]
ptsoutptsout[0..7]extent[0..7]
+
+ + +
+ +

7.6.41 vqt_ext_name

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Face Name and Index« - Informationen über einen +Zeichensatz ermitteln. +
  +
VDI-Nummer: 130 (Unterfunktion 1) +
  +
Deklaration: int16_t vqt_ext_name ( int16_t handle, int16_t index, int8_t +*name, uint16_t *font_format, uint16_t *flags ); +
  +
Beschreibung: Die Funktion ermittelt Informationen über einen Zeichensatz. +Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
index Nummer des Zeichensatzes +
name[0..31] Name des Zeichensatzes +
name[32] Flag + + + + + + +
0 = Bitmap-Font +
1 = Vektorfont + +
+ +
font_format Format des Zeichensatzes + + + + + + + + + + + + +
Bit-0 = Bitmap +
Bit-1 = Speedo +
Bit-2 = TrueType +
Bit-3 = Type-1 + +
+ +
flags Art des Zeichensatzes + + + + + + +
Bit-0 + + + + + + +
= 0 (Font ist proportional) +
= 1 (Font ist monospaced) + +
+ +
Bit-4 seit NVDI 4.1 (27.11.1996) + + + + + + +
= 0 (Font ist kein Symbolfont) +
= 1 (Font ist ein Symbolfont) + +
+ + +
+ + +
+ +
Hinweis: Ein Font wird als Symbolfont +eingestuft, wenn er im Bereich 'A'-'Z' und 'a'-'z' nicht vollständig +ist, oder wenn er laut der PANOSE Klassifizierung pictorial +ist. Das entsprechende Flag ist daher nur als Anhaltspunkt zu +betrachten (bei einem kyrillischen TrueType-Font wäre es z.B. auch +gesetzt), und signalisiert, daß die Zeichenbelegung im ASCII-Mapping +(vst_charmap) nicht der normalen Atari-Belegung entspricht. +
  +
Ergebnis: Die Funktion liefert die ID des Zeichensatzes zurück. +
  +
Verfügbar: ab NVDI 3.00 +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding   vst_load_fonts   vst_font   vqt_xfntinfo +
  + +
+ +

7.6.42 Bindings für vqt_ext_name

+ + + + + + + + + +
C: int16_t vqt_ext_name ( int16_t handle, int16_t index, int8_t +*name, uint16_t *font_format, uint16_t *flags ); +
  +
Umsetzung: +
  +
int16_t vqt_ext_name (int16_t handle, int16_t index,
+                      int8_t *name, uint16_t *font_format,
+                      uint16_t *flags)
+{
+   intin[0] = index;
+   intin[1] = 0;         /* reserviert */
+
+   contrl[0] = 130;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[5] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   name[0..31]  = intout[1..32];
+   name[32]     = intout[33];
+   *flags       = (intout[34] >> 8) & 0xff;
+   *font_format = intout[34] & 0xff;
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]130 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]2 # Einträge in intin
contrl+8contrl[4]35 # Einträge in intout
contrl+10contrl[5]1 # Sub-Opcode
contrl+12contrl[6]handle
intinintin[0]index
intin+2intin[1]0
intoutintout[0]Return-Wert
intout+2intout[1..16]name[0..31]
intout+64intout[33]name[32]
intout+66intout[34]flags/font_format
+
+ +
Hinweis: Im High-Byte von intout[34] wird flags +zurückgeliefert; im Low-Byte von intout[34] font_format. +
  +
Um festzustellen, was für einen Font man vor sich hat, muß man +die Anzahl der Einträge in intout (contrl[4]) beachten. Ist contrl[4] +33, so sind keine zusätzlichen Informationen vorhanden und demzufolge +muß es sich um einen Bitmapfont handeln. Ist contrl[4] == 34, +wird nur zusätzlich in intout[33] (name[32]) mitgeteilt, ob es sich +um einen Vektorfont handelt. Nur wenn contrl[4] == 35 ist, +kann man mit intout[34] (flags) den Fonttyp genauer feststellen und +sofort erkennen, ob der Font äquidistant (monospaced) ist. +
  +
intout[34] wird nur zurückgeliefert, wenn contrl[3] > 1 und +contrl[5] = 1! +
  + +
+ +

7.6.43 vqt_fg_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Foreground Color« - Text Vordergrundfarbe ermitteln +
  +
VDI-Nummer: 202 (Unterfunktion 0) +
  +
Deklaration: int32_t vqt_fg_color( int16_t handle, COLOR_ENTRY *fg_color ); +
  +
Beschreibung: Diese Funktionen ermittelt die Vordergrundfarbe für Text. +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
fg_color COLOR_ENTRY der Vordergrundfarbe + +
+ +
Ergebnis: Eingestellter Farbraum (z.Zt. nur CSPACE_RGB) oder -1 (falsche +Unterfunktionsnummer). +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.6.44 Bindings für vqt_fg_color

+ + + + + + + + + +
C: int32_t vqt_fg_color( int16_t handle, COLOR_ENTRY *fg_color ); +
  +
Umsetzung: +
  +
int32_t vqt_fg_color( int16_t handle, COLOR_ENTRY *fg_color )
+{
+   contrl[0] = 202;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   fg_color = intout [2..5];
+   return ( int32_t intout [0]  );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]202 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]6 # Einträge in intout
contrl+10contrl[5]0 # Sub-Opcode
contrl+12contrl[6]handle
intoutintout[0..1]color_space
intout+4intout[2..5]fg_color
+
+ + +
+ +

7.6.45 vqt_fontheader

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Speedo header information« - Informationen über +einen Zeichensatz ermitteln +
  +
VDI-Nummer: 232 +
  +
Deklaration: void vqt_fontheader ( int16_t handle, int8_t *buffer, int8_t +*tdf_name ); +
  +
Beschreibung: Die Funktion kopiert den Header des eingestellten Speedo-Fonts +in einen Puffer, und liefert wenn möglich einen Zeiger auf die +zugehörige TDF-Datei. Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
buffer aufnehmender Puffer +
tdf_name aufnehmender Zugriffspfad auf die entsprechende TDF-Datei + +
+ +
Hinweis: Der aufnehmende Puffer sollte eine Größe von +ca. 1 Kbyte besitzen, da die Länge des Speedo-Fontheaders vom +jeweiligen Zeichensatz und möglichen Formaterweiterungen abhängt. +
  +
Für andere Zeichensatzformate (Beispiel: TrueType) wird +versucht, den Header nachzubilden. +
  +
Es sollte beachtet werden, daß für jeden Aufruf dieser +Funktion mehrfach auf die Festplatte zugegriffen werden muß; - bei +vielen installierten Zeichensätzen kann dies einige Sekunden dauern. +Daher sollte man den häufigen Aufruf der Funktion vermeiden, oder +wichtige Angaben selbst speichern, und beim Programmstart laden. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: ab SpeedoGDOS 4.00 und ab NVDI 3.00 +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding   vqt_fontinfo   Aufbau des Fontheaders +
  + +
+ +

7.6.46 Bindings für vqt_fontheader

+ + + + + + + + + +
C: void vqt_fontheader ( int16_t handle, int8_t *buffer, int8_t +*tdf_name ); +
  +
Umsetzung: +
  +
void vqt_fontheader (int16_t handle, int8_t *buffer,
+                     int8_t *tdf_name)
+{
+   intin[0..1] = buffer;
+
+   contrl[0] = 232;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   tdf_name[0..n-1] = intout[0..n-1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]232 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]2 # Einträge in intin
contrl+8contrl[4]n # Einträge in intout
contrl+12contrl[6]handle
intinintin[0..1]buffer
intoutintout[0..n-1]tdf_name[0..n-1]
+
+ + +
+ +

7.6.47 vqt_fontinfo

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Current Face Information« - ermittelt Informationen +über Zeichensätze. +
  +
VDI-Nummer: 131 +
  +
Deklaration: void vqt_fontinfo ( int16_t handle, int16_t *minADE, int16_t +*maxADE, int16_t *distances, int16_t *maxwidth, int16_t *effects ); +
  +
Beschreibung: Die Funktion informiert über den aktuellen Zeichensatz. +
  +

+
Der Funktion werden folgende Parameter übergeben: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
minADE niedrigster ASCII-Wert +
maxADE höchster ASCII-Wert +
distances[0] Abstand der untere Kante der Zeichenzelle zur Basislinie +(y-Achse) +
distances[1] Abstand der unteren Zeichengrenze zur Basislinie (y-Achse) +
distances[2] Abstand der Halblinie zur Basislinie +
distances[3] Abstand der oberen Zeichengrenze zur Basislinie (y-Achse) +
distances[4] Abstand der oberen Zeichenzelle zur Basislinie (y-Achse) +
max_width maximale Zeichenzellenbreite ohne Texteffekte +
effects[0] Betrag, um den die Zeichenbreite bei den aktuellen Texteffekten +zunimmt +
effects[1] linker Offsetwert (bzgl. x-Achse) +
effects[2] rechter Offsetwert (bzgl. x-Achse) + +
+ +
Hinweis: Die aktuellen Text-Effekte werden beachtet. Bei +kursiver Schrift wird die Neigung als rechter und linker Offset-Wert +bedacht. Der rechte Offsetwert ist der horizontale Abstand der +Zeichenposition (linkes Basislinienende) zum Lotfußpunkt des Lotes +auf die Basislinie durch die obere rechte Ecke; analog ist der linke +Offsetwert der Abstand der Zeichenposition zum Lotfußpunkt des Lotes +auf die Basislinie durch die untere linke Ecke. +
  +
Die Komponenten minADE und maxADE stehen für +das erste bzw. letzte Zeichen des Zeichensatzes. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all drivers. +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding   vst_effects   ASCII-Tabelle +
  + +
+ +

7.6.48 Bindings für vqt_fontinfo

+ + + + + + + + + +
C: void vqt_fontinfo ( int16_t handle, int16_t *minADE, int16_t +*maxADE, int16_t *distances, int16_t *maxwidth, int16_t *effects ); +
  +
Umsetzung: +
  +
void vqt_fontinfo (int16_t handle, int16_t *minADE,
+                   int16_t *maxADE, int16_t *distances,
+                   int16_t *maxwidth, int16_t *effects)
+{
+   contrl[0] = 131;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *minADE    = intout[0];
+   *maxADE    = intout[1];
+   *max_width = ptsout[0];
+
+   distances[0] = ptsout[1];
+   distances[1] = ptsout[3];
+   distances[2] = ptsout[5];
+   distances[3] = ptsout[7];
+   distances[4] = ptsout[9];
+
+   effects[0] = ptsout[2];
+   effects[1] = ptsout[4];
+   effects[2] = ptsout[6];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]131 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]5 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]2 # Einträge in intout
contrl+12contrl[6]handle
intoutintout[0]minADE
intout+2intout[1]maxADE
ptsoutptsout[0]maxwidth
ptsout+2ptsout[1]distances[0]
ptsout+4ptsout[2]effects[0]
ptsout+6ptsout[3]distances[1]
ptsout+8ptsout[4]effects[1]
ptsout+10ptsout[5]distances[2]
ptsout+12ptsout[6]effects[2]
ptsout+14ptsout[7]distances[3]
ptsout+16ptsout[8]0
ptsout+18ptsout[9]distances[4]
+
+ + +
+ +

7.6.49 vqt_f_extent

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Outline-Font Text Extent« - ermittelt die Länge +eines Strings im Vektor-Zeichensatz. +
  +
VDI-Nummer: 240 +
  +
Deklaration: void vqt_f_extent ( int16_t handle, int8_t *string, int16_t +*extent ); +
  +
Beschreibung: Die Funktion addiert die Zeichenweiten eines Strings. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
string Adresse der Zeichenkette +
extent[0] x-Koordinate +
extent[1] y-Koordinate der unteren linken Ecke +
extent[2] x-Koordinate +
extent[3] y-Koordinate der unteren rechten Ecke +
extent[4] x-Koordinate +
extent[5] y-Koordinate der oberen rechten Ecke +
extent[6] x-Koordinate +
extent[7] y-Koordinate der oberen linken Ecke + +
+ +
Hinweis: Im Gegensatz zu vqt_extent beachtet die +Funktion auch etwaige Kerning-Werte. +
  +
Achtung: Diese Funktion liefert nicht das den +Text umgebende Rechteck. Sie addiert nur die Schrittweiten und +beachtet auch nicht linke oder rechte Zeichenüberhänge. Sie ist im +Prinzip nur zur Cursor-Positionierung gedacht. Wer aber mit dieser +Funktion die Größe eines neuzuzeichnenden Bildbereiches ermitteln +möchte, muß links und rechts sicherheitshalber die Breite des +größten Zeichens hinzuaddieren (und die Neigung beachten). +
  +
Vorsicht: Aus Kompatibilitätsgründen verhält sich +diese Funktion bei 90, 180 und 270 Grad genauso unsinnig wie das alte +vqt_extent - der Bezugspunkt wird geändert! +
  +
Ab NVDI-3 empfiehlt sich stattdessen die Verwendung von +vqt_real_extent. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Verfügbar: ab SpeedoGDOS 4.00 und ab NVDI 3.00 +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding   vqt_extent   SpeedoGDOS   NVDI +
  + +
+ +

7.6.50 Bindings für vqt_f_extent

+ + + + + + + + + +
C: void vqt_f_extent ( int16_t handle, int8_t *string, int16_t +*extent ); +
  +
Umsetzung: +
  +
void vqt_f_extent (int16_t handle, int8_t *string,
+                   int16_t *extent)
+{
+   intin[0..n-1] = string[0..n-1];
+
+   contrl[0] = 240;
+   contrl[1] = 0;
+   contrl[3] = n;
+   contrl[6] = handle;
+
+   vdi ();
+
+   extent[0..7] = ptsout[0..7];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]240 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]4 # Einträge in ptsout
contrl+6contrl[3]n # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0..n-1]string[0..n-1]
ptsoutptsout[0..7]extent[0..7]
+
+ + +
+ +

7.6.51 vqt_get_table

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Get Character Mapping Table« - Adresse der +Zeichentransformationstabellen erfragen. +
  +
VDI-Nummer: 254 +
  +
Deklaration: void vqt_get_table ( int16_t handle, int32_t *map ); +
  +
Beschreibung: Die Funktion ermittelt die Adresse der +Zeichentransformationstabellen. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
map Adresse an der die Zeichenbelegungstabelle zufinden ist. Die +Tabelle besteht aus sieben Feldern. Jedes hat eine Größe von 224 +int16_t für die ASCII Zeichen 32-255. +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PositionTabelle
1Master mapping
2Bitstream International Character Set
3Bitstream International Symbol Set
4Bitstream Dingbats Set
5PostScript Text Set
6PostScript Symbol Set
7PostScript Dingbats Set
+
+ + +
+ +
Hinweis: Diese Informationen sind nützlich, da +Vektorfonts auch Zeichen enthalten können, die im normalen +Atari-Zeichensatz nicht enthalten sind. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: ab SpeedoGDOS 4.00 +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding   GDOS   SpeedoGDOS   v_gtext +
  + +
+ +

7.6.52 Bindings für vqt_get_table

+ + + + + + + + + +
C: void vqt_get_table ( int16_t handle, int32_t *map ); +
  +
Umsetzung: +
  +
void vqt_get_table ( int16_t handle, int32_t *map )
+{
+   contrl[0] = 254;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   map = intout[0..1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]254 Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]2 # Einträge in intout
contrl+12contrl[6]handle
intoutintout[0..1]map
+
+ + +
+ +

7.6.53 vqt_justified

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire justified graphics text« - Offsets von einem +Ausrichtungspunkt erfragen. +
  +
VDI-Nummer: 132 +
  +
Deklaration: void vqt_justified ( int16_t handle, int16_t x, int16_t y, +int8_t *string, int16_t length, int16_t word_space, int16_t +char_space, int16_t *offsets ); +
  +
Beschreibung: Die Funktion ermittelt für jedes Zeichen eines Strings die x- +und y-Offsets von einem gegebenen Ausrichtungspunkt. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
x x-Koordinate +
y y-Koordinate des Punktes für die Textausrichtung +
string Zeiger auf die Zeichenkette +
length Textlänge in Pixeln (bzgl. x-Achse) +
word_space Wortzwischenräume + + + + + + +
   0 = nicht dehnen +
<> 0 = dehnen + +
+ +
char_space Zeichenzwischenräume + + + + + + +
   0 = nicht dehnen +
<> 0 = dehnen + +
+ +
offsets enthält für jedes Zeichen im String den x- und y-Offset + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Verfügbar: PC-GEM ab Version 2.0 +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.6.54 Bindings für vqt_justified

+ + + + + + + + + +
C: void vqt_justified ( int16_t handle, int16_t x, int16_t y, +int8_t *string, int16_t length, int16_t word_space, int16_t +char_space, int16_t *offsets ); +
  +
Umsetzung: +
  +
void vqt_justified (int16_t handle, int16_t x, int16_t y,
+                    int8_t *string, int16_t length,
+                    int16_t word_space, int16_t char_space,
+                    int16_t *offsets)
+{
+   int16_t i;
+
+   intin[0] = word_space;
+   intin[1] = char_space;
+
+   ptsin[0] = x;
+   ptsin[1] = y;
+   ptsin[2] = length;
+   ptsin[3] = 0;
+
+   i = 0;
+   while (string[i++])
+      ;
+
+   contrl[0] = 132;
+   contrl[1] = 2;
+   contrl[3] = i;
+   contrl[6] = handle;
+   pooff = offsets;
+
+   vdi ();
+
+   pooff = ptsout;
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]132 # Opcode der Funktion
contrl+2contrl[1]2 # Einträge in ptsin
contrl+4contrl[2]n # Einträge in ptsout
contrl+6contrl[3]2+n # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]word_space
intin+2intin[1]char_space
intin+4intin[2]string[0..n+1]
ptsinptsin[0]x
ptsin+2ptsin[1]y
ptsin+4ptsin[2]length
ptsin+6ptsin[3]0
ptsoutptsout[...]offsets[...]
+
+ + +
+ +

7.6.55 vqt_name

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Face Name and Index« - ermittelt den Namen und +Kurzbeschreibung eines Zeichensatzes. +
  +
VDI-Nummer: 130 +
  +
Deklaration: int16_t vqt_name ( int16_t handle, int16_t element_num, int8_t +*name ); +
  +
Beschreibung: Die Funktion ermittelt den Namen und ID eines Zeichensatzes. Es +gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
element_num Nummer des Zeichensatzes +
name Name des Zeichensatzes als maximal 32 Zeichen lange +Zeichenkette + +
+ +
Hinweis: Das Element name[32] enthält den Wert +0, falls es sich um einen Pixelfont handelt, und den Wert 1, falls es +sich um einen Vektorfont handelt. (ab SpeedoGDOS 4.0) +
  +
In GEM/5, this function returns nothing for font index 0 or 1; +for other indices, the font scaler is used to return data. A good test +for a GEM/5 VDI would be to do a vqt_name on font 1, and see if it +returned any values - if it did not, GEM/5 is running. +
  +
Ab NVDI-3 gibt es eine erweiterte Form dieser Funktion. +
  +
Ergebnis: Die Funktion liefert die ID des Zeichensatzes zurück. +
  +
Verfügbar: in allen TOS Version, ab SpeedoGDOS 4.0 in erweiterte Version +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding   vst_load_fonts   vst_name   vst_font   vqt_xfntinfo +
  + +
+ +

7.6.56 Bindings für vqt_name

+ + + + + + + + + +
C: int16_t vqt_name ( int16_t handle, int16_t element_num, int8_t +*name ); +
  +
Umsetzung: +
  +
int16_t vqt_name (int16_t handle, int16_t element_num,
+                  int8_t *name)
+{
+   int16_t tmp;
+
+   intin[0] = element_num;
+
+   contrl[0] = 130;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   for (tmp = 0; tmp < 32; tmp++)
+      name[tmp] = intout[tmp+1];
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]130 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]33 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]element_num
intoutintout[0]Return-Wert
intout+2intout[1..32]name[0..31]
+
+ + +
+ +

7.6.57 vqt_name_and_id

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire face name and ID by name« - Font ID und Namen suchen +
  +
VDI-Nummer: 230 (Unterfunktion 100) +
  +
Deklaration: int16_t vqt_name_and_id ( int16_t handle, int16_t font_format, +int8_t *font_name, int8_t *ret_name ); +
  +
Beschreibung: Die Funktion sucht einen Zeichensatz mit einem bestimmten Namen +und Format. Es gilt: +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
font_format gewünschtes Zeichensatz-Format + + + + + + + + + + + + +
1 = Bitmap-Font +
2 = Speedo +
4 = TrueType +
8 = Type-1 + +
+ +
font_name gewünschter Zeichensatz-Name +
ret_name Name des gefundenen Zeichensatzes + +
+ +
Hinweis: Fehlende oder überschüssige Leerzeichen +werden bei der Suche ignoriert. +
  +
Ergebnis: Die Funktion liefert die ID des Zeichensatzes, bzw. den Wert 0, +wenn kein entsprechender Font auffindbar ist. +
  +
Verfügbar: ab NVDI Version 3.02 +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding   vst_name +
  + +
+ +

7.6.58 Bindings für vqt_name_and_id

+ + + + + + + + + +
C: int16_t vqt_name_and_id ( int16_t handle, int16_t font_format, +int8_t *font_name, int8_t *ret_name ); +
  +
Umsetzung: +
  +
int16_t vqt_name_and_id (int16_t handle, int16_t font_format,
+                         int8_t *font_name, int8_t *ret_name)
+{
+   intin[0] = font_format;
+   intin[1..n] = font_name[0..n-1];
+
+   contrl[0] = 230;
+   contrl[1] = 0;
+   contrl[3] = n;
+   contrl[5] = 100;
+   contrl[6] = handle;
+
+   vdi ();
+
+   ret_name[0..m-1] = intout[1..m];
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]230 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]n # Einträge in intin
contrl+8contrl[4]m # Einträge in intout
contrl+10contrl[5]100 # Sub-Opcode
contrl+12contrl[6]handle
intinintin[0]font_format
intin+2intin[1..n]font_name[0..n-1]
intoutintout[0]Return-Wert
intout+2intout[1..m]ret_name[0..m-1]
+
+ + +
+ +

7.6.59 vqt_pairkern

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire pair kerning information« - Korrekturfaktor für +Zeichen mit Pair-Kerning ermitteln +
  +
VDI-Nummer: 235 +
  +
Deklaration: void vqt_pairkern ( int16_t handle, int16_t ch1, int16_t ch2, +fix31 *x, fix31 *y ); +
  +
Beschreibung: Die Funktion ermittelt den Korrekturfaktor für zwei Zeichen im +Falle des Pair-Kernings. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
ch1 erstes Zeichen +
ch2 zweites Zeichen +
x x-Korrekturfaktor +
y y-Korrekturfaktor + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Verfügbar: ab SpeedoGDOS 4.0 und ab NVDI 3.00 +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding   vqt_trackkern   SpeedoGDOS   NVDI   Kerning   +Track-Kerning   Pair-Kerning +
  + +
+ +

7.6.60 Bindings für vqt_pairkern

+ + + + + + + + + +
C: void vqt_pairkern ( int16_t handle, int16_t ch1, int16_t ch2, +fix31 *x, fix31 *y ); +
  +
Umsetzung: +
  +
void vqt_pairkern (int16_t handle, int16_t ch1, int16_t ch2,
+                   fix31 *x, fix31 *y)
+{
+   intin[0] = ch1;
+   intin[1] = ch2;
+
+   contrl[0] = 235;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *x = intout[0..1];
+   *y = intout[2..3];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]235 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]2 # Einträge in intin
contrl+8contrl[4]4 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]ch1
intin+2intin[1]ch2
intoutintout[0..1]x
intout+4intout[2..3]y
+
+ + +
+ +

7.6.61 vqt_real_extent

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire real outline font text extent« - Ermitteln des einen +Text umgebenden Rechteckes. +
  +
VDI-Nummer: 240 (Unterfunktion 4200) +
  +
Deklaration: void vqt_real_extent ( int16_t handle, int16_t x, int16_t y, +int8_t *string, int16_t *extent ); +
  +
Beschreibung: Die Funktion ermittelt ein minimales Rechteck, daß einen Text +unter Beachtung der Textattribute voll umgibt. +
  +
Beispiel: +
  +

+
Der Funktion werden folgende Parameter übergeben: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
handleKennung der Workstation
xx-Koordinate
yy-Koordinate
stringgewünschte Zeichenkette
extent[0]x-Koordinate
extent[1]y-Koordinate der linken, unteren Ecke
extent[2]x-Koordinate
extent[3]y-Koordinate der rechten, unteren Ecke
extent[4]x-Koordinate
extent[5]y-Koordinate der rechten, oberen Ecke
extent[6]x-Koordinate
extent[7]y-Koordinate der linken, oberen Ecke
+
+ +
Hinweis: Die Funktion beachtet sämtliche Texteffekte, +Rotation, Schrägstellung, Pair-Kerning, Track-Kerning, +Zeichenüberhänge, horizontale und vertikale Ausrichtung. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: ab NVDI Version 3.00 +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding   vqt_extent   vqt_f_extent +
  + +
+ +

7.6.62 Bindings für vqt_real_extent

+ + + + + + + + + +
C: void vqt_real_extent ( int16_t handle, int16_t x, int16_t y, +int8_t *string, int16_t *extent ); +
  +
Umsetzung: +
  +
void vqt_real_extent (int16_t handle, int16_t x, int16_t y,
+                      int8_t *string, int16_t *extent)
+{
+   intin[0..n-1] = string[0..n-1];
+   ptsin[0] = x;
+   ptsin[1] = y;
+
+   contrl[0] = 240;
+   contrl[1] = 1;
+   contrl[3] = n;
+   contrl[5] = 4200;
+   contrl[6] = handle;
+
+   vdi ();
+
+   extent[0..7] = ptsout[0..7];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]240 # Opcode der Funktion
contrl+2contrl[1]1 # Einträge in ptsin
contrl+4contrl[2]4 # Einträge in ptsout
contrl+6contrl[3]n # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]4200 # Sub-Opcode
contrl+12contrl[6]handle
intinintin[0..n-1]string[0..n-1]
ptsinptsin[0]x
ptsin+2ptsin[1]y
ptsoutptsout[0..7]extent[0..7]
+
+ + +
+ +

7.6.63 vqt_trackkern

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire track kerning information« - Korrekturfaktor für +Zeichensätze mit Track-Kerning ermitteln +
  +
VDI-Nummer: 234 +
  +
Deklaration: void vqt_trackkern ( int16_t handle, fix31 *x, fix31 *y ); +
  +
Beschreibung: Die Funktion liefert den Korrekturfaktor für Zeichensätze mit +Track-Kerning. Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
x x-Korrekturfaktor +
y y-Korrekturfaktor + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Verfügbar: ab SpeedoGDOS 4.0 und ab NVDI 3.00 +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding   GDOS   SpeedoGDOS   vqt_pairkern +
  + +
+ +

7.6.64 Bindings für vqt_trackkern

+ + + + + + + + + +
C: void vqt_trackkern ( int16_t handle, fix31 *x, fix31 *y ); +
  +
Umsetzung: +
  +
void vqt_trackkern (int16_t handle, fix31 *x, fix31 *y)
+{
+   contrl[0] = 234;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *x = intout[0..1];
+   *y = intout[2..3];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]234 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]4 # Einträge in intout
contrl+12contrl[6]handle
intoutintout[0..1]x
intout+4intout[2..3]y
+
+ + +
+ +

7.6.65 vqt_width

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Character Cell Width« - ermittelt die Breite einer +Zeichenzelle. +
  +
VDI-Nummer: 117 +
  +
Deklaration: int16_t vqt_width ( int16_t handle, int8_t character, int16_t +*cell_width, int16_t *left_delta, int16_t *right_delta ); +
  +
Beschreibung: Die Funktion ermittelt die horizontalen Ausmaße eines Zeichens +des akuellen Zeichensatzes sowie der Zeichenzelle. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
character Zeichennummer +
cell_width Zeichenzellenbreite (bzgl. x-Achse) +
left_delta Abstand des linken Zeichenzellenrands zum linken Zeichenrand +bzgl. der x-Achse +
right_delta Abstand des rechten Zeichenzellenrands zum rechten Zeichenrand +bzgl. der y-Achse + +
+ +
Hinweis: Texteffekte und Drehungen werden von der +Funktion nicht beachtet. +
  +
Wendet man die Funktion auf einen Vektorfont an, wird für das +Zeichen character die gerundete Schrittweite zurückgegeben. +Diese Schrittweite kann nur im Zusammenhang mit v_gtext +benutzt werden. Versucht man diese Schrittweiten auf v_ftext +anzuwenden, wird man falsche Zeichenpositionen berechnen. +
  +

+
Um festzustellen, ob ein Font äquidistant (monospaced) oder +proportional ist, sollten nicht alle Zeichenpaare über vqt_width +verglichen, sondern zuerst überprüft werden, ob vqt_name() hierüber +Informationen zurückgibt. +
  +
Die Werte in left_delta und right_delta +entsprechen exakt den Positionen in der Horizontal-Offset-Table. Fehlt +diese Angabe im Zeichensatzkopf (was bei den meisten Bitmap-Fonts der +Fall ist), so erhält man als Ergebnis eine Null. +
  +
Ergebnis: Die Funktion liefert den Wert -1, falls die Ausmaße aus +irgendeinem Grund nicht berechnet werden konnten. +
  +
Verfügbar: Supported by all drivers. +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding   vst_effects +
  + +
+ +

7.6.66 Bindings für vqt_width

+ + + + + + + + + +
C: int16_t vqt_width ( int16_t handle, int8_t character, int16_t +*cell_width, int16_t *left_delta, int16_t *right_delta ); +
  +
Umsetzung: +
  +
int16_t vqt_width (int16_t handle, int8_t character,
+                   int16_t *cell_width, int16_t *left_delta,
+                   int16_t *right_delta)
+{
+   intin[0] = character;
+
+   contrl[0] = 117;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *cell_width  = ptsout[0];
+   *left_delta  = ptsout[2];
+   *right_delta = ptsout[4];
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]117 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]3 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]character
intoutintout[0]Return-Wert
ptsoutptsout[0]cell_width
ptsout+2ptsout[1]0
ptsout+4pstout[2]left_delta
ptsout+6ptsout[3]0
ptsout+8ptsout[4]right_delta
ptsout+10ptsout[5]0
+
+ + +
+ +

7.6.67 vqt_xfntinfo

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire extended font information« - Informationen über +einen Zeichensatz ermitteln. +
  +
VDI-Nummer: 229 (Opcode 0) +
  +
Deklaration: int16_t vqt_xfntinfo ( int16_t handle, int16_t flags, int16_t +id, int16_t index, XFNT_INFO *info ); +
  +
Beschreibung: Die Funktion ermittelt bestimmte Informationen über einen +Zeichensatz. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
flags gewünschte Information als Bitvektor + + + + + + + + + + + + + + + + + + + + + + + + +
Bit-0 = vollständiger Zeichensatzname +
Bit-1 = Name der Zeichensatzfamilie +
Bit-2 = Stil des Zeichensatzes +
Bit-3 = Dateiname des Zeichensates +
Bit-4 = zweiter optionaler Dateiname +
Bit-5 = dritter optionaler Dateiname +
Bit-8 = Höhen ohne Vergrößerung in pt +
Bit-9 = Höhen für doppelte Vergrößerung in pt + +
+ +
id ID des Zeichensatzes, oder 0 für den eingestellten Zeichensatz +
index Index des Zeichensatzes oder 0, wenn die ID bereits benutzt +wird +
info Adresse der Informations-Struktur + +
+ +
Hinweis: Wenn ein von 0 verschiedener Index übergeben +wird, sucht die Funktion den entsprechenden Zeichensatz, und liefert +die gewünschten Informationen. Ist index = 0 wird der +Zeichensatz mit der ID id gesucht; sollte id ebenfalls +0 sein, so werden Informationen über den z.Zt. eingestellten Font +zurückgegeben. +
  +
Bit 8 und 9 von flags unterscheiden sich in der Funktion +nur bei Bitmap-Fonts. Ist Bit 8 gesetzt, werden die Höhen geliefert, +die ohne Vergrößerung vorhanden sind. Wenn Bit 9 gesetzt ist, werden +die Höhen geliefert, bei denen vergrößert wird. +
  +
Damit die gewünschten Informationen abgelegt werden können, +muß die Größe der aufnehmenden Struktur in der Komponente +size eingetragen werden. +
  +
Ergebnis: Das Funktionsergebnis ist z.Zt. unbekannt. +
  +
Verfügbar: ab NVDI 3.02 +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding   vqt_name +
  + +
+ +

7.6.68 Bindings für vqt_xfntinfo

+ + + + + + + + + +
C: int16_t vqt_xfntinfo ( int16_t handle, int16_t flags, int16_t +id, int16_t index, XFNT_INFO *info ); +
  +
Umsetzung: +
  +
int16_t vqt_xfntinfo (int16_t handle, int16_t flags,
+                      int16_t id, int16_t index,
+                      XFNT_INFO *info)
+{
+   intin[0] = flags;
+   intin[1] = id;
+   intin[2] = index;
+   intin[3..4] = info;
+
+   contrl[0] = 229;
+   contrl[1] = 0;
+   contrl[3] = 5;
+   contrl[5] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[1] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]229 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]5 # Einträge in intin
contrl+8contrl[4]3 # Einträge in intout
contrl+10contrl[5]0
contrl+12contrl[6]handle
intinintin[0]flags
intin+2intin[1]id
intin+4intin[2]index
intin+6intin[3..4]info
intoutintout[0]font_format
intout+2intout[1]font_id
intout+4intout[2]index
+
+ + +
+ +

7.6.69 vq_cellarray

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Cell Array« - ermittelt Informationen über eine +dargestellte Farbtabelle. +
  +
VDI-Nummer: 27 +
  +
Deklaration: void vq_cellarray ( int16_t handle, int16_t *pxyarray, int16_t +row_length, int16_t num_rows, int16_t *el_used, int16_t *rows_used, +int16_t *status, int16_t *colarray ); +
  +
Beschreibung: Die Funktion gibt Auskunft über die Definition des +Cell-Arrays. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
pxyarray[0] x-Koordinate +
pxyarray[1] y-Koordinate der oberen linken Ecke +
pxyarray[2] x-Koordinate +
pxyarray[3] y-Koordinate der unteren rechten Ecke +
row_length Zeilenlänge im Farbindex-Array +
num_rows Anzahl der Zeilen im Farbindex-Array +
el_used Anzahl der Spalten +
rows_used Anzahl der benutzten Spalten im Farbindex-Array +
status + + + + + + +
0 = keine Fehler +
1 = der Farbwert konnte für einige Pixel nicht bestimmt werden + +
+ +
colarray Farbindex-Array, das zeilenweise die Farbinformationen enthält +bzw. -1, falls der Farbindex für den angegebenen Bereich nicht +ermittelt werden konnte + +
+ +
Hinweis: Die Funktion ist nicht auf allen +Geräten verfügbar. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Not supported by any known drivers. +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding   v_cellarray +
  + +
+ +

7.6.70 Bindings für vq_cellarray

+ + + + + + + + + +
C: void vq_cellarray ( int16_t handle, int16_t *pxyarray, int16_t +row_length, int16_t num_rows, int16_t *el_used, int16_t *rows_used, +int16_t *status, int16_t *colarray ); +
  +
Umsetzung: +
  +
void vq_cellarray (int16_t handle, int16_t *pxyarray,
+                   int16_t row_length, int16_t num_rows,
+                   int16_t *el_used, int16_t *rows_used,
+                   int16_t *status, int16_t *colarray)
+{
+   ptsin[0..3] = pxarray[0..3];
+
+   contrl[0] = 27;
+   contrl[1] = 2;
+   contrl[3] = 0;
+   contrl[6] = handle;
+   contrl[7] = row_length;
+   contrl[8] = num_rows;
+
+   vdi ();
+
+   *el_used   = contrl[9];
+   *rows_used = contrl[10];
+   *status    = contrl[11];
+
+   colarray[0..n-1] = intout[0..n-1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]27 # Opcode der Funktion
contrl+2contrl[1]2 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]n # Einträge in intout
contrl+12contrl[6]handle
contrl+14contrl[7]row_length
contrl+16contrl[8]num_rows
contrl+18contrl[9]el_used
contrl+20contrl[10]rows_used
contrl+22contrl[11]status
ptsinptsin[0..3]pxyarray[0..3]
intoutintout[0..n-1]colarray[0..n-1]
+
+ + +
+ +

7.6.71 vq_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Color Representation« - ermittelt die Intensität +einer Farbe. +
  +
VDI-Nummer: 26 +
  +
Deklaration: int16_t vq_color ( int16_t handle, int16_t color_index, int16_t +set_flag, int16_t *rgb ); +
  +
Beschreibung: Die Funktion ermittelt die eingestellten Farbintensitäten der +Farbpalette. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
color_index zu erfragendes Farbregister +
set_flag Flag für Farbintensität + + + + + + +
0 = gesetzte Intensität +
1 = tatsächliche Intensität + +
+ +
rgb_in[0] Rotanteil   (in Promille, 0-1000) +
rgb_in[1] Grünanteil  (in Promille, 0-1000) +
rgb_in[2] Blaunanteil (in Promille, 0-1000) + +
+ +
Hinweis: Gesetzte und tatsächliche Farbintensität +können bei Systemen mit einer CLUT voneinander abweichen, wenn die +Anzahl der möglichen Farbabstufungen zu klein ist. +
  +
Beispiel: Verfügt ein Monitor nur über zwei +Intensitäten, so teilt sich der Bereich in die Teilbereiche 0..500 +und 501..1000. Die tatsächliche Intensität kann aber nur 0 +oder 1000 sein; egal welche Zahl aus dem Bereich von 501 bis 1000 +gewählt wird, es wird immer die Intensität 1000 gesetzt. Daher kann +z.B. die gesetzte Intensität den Wert 623 und die tatsächliche den +Wert 1000 haben. +
  +
Bei Direct-RGB (keine CLUT) wird meistens die tatsächlich +eingestellte Intensität auch als die vom Anwender übergebene +Intensität zurückgeliefert, da die Anzahl der Abstufungen +ausreichend groß ist. +
  +
Ergebnis: Die Funktion liefert -1, wenn der Farbindex außerhalb der +Grenzen ist. +
  +
Verfügbar: Alle Treiber. +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding   vs_color   vs_color2 +
  + +
+ +

7.6.72 Bindings für vq_color

+ + + + + + + + + +
C: int16_t vq_color ( int16_t handle, int16_t color_index, int16_t +set_flag, int16_t *rgb ); +
  +
Umsetzung: +
  +
int16_t vq_color (int16_t handle, int16_t color_index,
+               int16_t set_flag, int16_t *rgb)
+{
+   intin[0] = color_index;
+   intin[1] = set_flag;
+
+   contrl[0] = 26;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   rgb[0] = intout[1];
+   rgb[1] = intout[2];
+   rgb[2] = intout[3];
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]26 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]2 # Einträge in intin
contrl+8contrl[4]4 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]color_index
intin+2intin[1]set_flag
intoutintout[0]Return-Wert
intout+2intout[1..3]rgb[0..2]
+
+ + +
+ +

7.6.73 vq_devinfo

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire device status info« - Status des Ausgabegeräts +erfragen. +
  +
VDI-Nummer: 248 +
  +
Deklaration: void vq_devinfo ( int16_t handle, int16_t device, int16_t +*dev_open, int8_t *file_name, int8_t *device_name ); +
  +
Beschreibung: Die Funktion überprüft, ob ein Treiber für ein bestimmtes +Ausgabegerät installiert worden ist. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
device VDI-Gerätenummer (0..99) +
dev_open Treiber + + + + + + +
0 = noch nicht geöffnet +
1 = bereits geöffnet + +
+ +
file_name Dateiname des Treibers +
device_name Klartextname des Treibers + +
+ +
Hinweis: Wenn der Dateiname leer ist, ist der Treiber +nicht vorhanden. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: ab NVDI 3.00 +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding   vq_ext_devinfo   vqt_devinfo   GDOS   SpeedoGDOS   +NVDI +
  + +
+ +

7.6.74 Bindings für vq_devinfo

+ + + + + + + + + +
C: void vq_devinfo ( int16_t handle, int16_t device, int16_t +*dev_open, int8_t *file_name, int8_t *device_name ); +
  +
Umsetzung: +
  +
void vq_devinfo (int16_t handle, int16_t device,
+                 int16_t *dev_open, int8_t *file_name,
+                 int8_t *device_name)
+{
+   intin[0] = device;
+
+   contrl[0] = 248;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *dev_open = ptsout[0];
+   dev_name[0..p]    = ptsout[1..p-1];
+   file_name[0..i-1] = intout[0..i-1]
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]248 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]p # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]i # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]device
intoutintout[0..i-1]file_name[0..i-1]
ptsoutptsout[0]dev_open
ptsout+2ptsout[1..p-1]device_name[0..p-2]
+
+ + +
+ +

7.6.75 vq_extnd

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Extended Inquire Funktion« - ermittelt Informationen über +eine Arbeitsstation. +
  +
VDI-Nummer: 102 +
  +
Deklaration: void vq_extnd ( int16_t handle, int16_t owflag, int16_t +*work_out ); +
  +
Beschreibung: Die Funktion ermittelt Angaben über die Fähigkeiten einer +Workstation. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
owflag Typ der Informationen + + + + + + +
0 = Informationen analog v_opnwk +
1 = erweiterte Informationen + +
+ +
work_out[0] genaue Spezifikation des Bildschirms + + + + + + + + + + + + + + + +
0 = kein Bildschirm +
1 = getrennte Grafik/Textbildschirme mit getrennten Kontrollern +
2 = gemeinsame Grafik/Textbildschirme mit getrennten Kontrollern +
3 = getrennte Grafik/Textbildschirme mit gemeinsamen Kontroller +
4 = gemeinsamer Grafik/Textbildschirm mit gemeinsamen Kontroller + +
+ +
work_out[1] Anzahl der verfügbaren Hintergrundfarben +
work_out[2] Bitvektor der verfügbaren Texteffekte +
work_out[3] Vergrößerungsflag + + + + + + +
0 = Gerät unterstützt vergrößern nicht +
1 = Gerät unterstützt vergrößern + +
+ +
work_out[4] Anzahl der Farbebenen +
work_out[5] Lookup-Table Unterstützung (0 = nicht möglich, 1 = möglich) +
work_out[6] Anzahl der möglichen 16x16 Rasteroperationen pro Sekunde +
work_out[7] falls Eins, so unterstützt das Gerät die v_contourfill +Funktion. +
work_out[8] Textrotationsflag + + + + + + + + + +
0 = nicht möglich +
1 = in 90 Grad Schritten möglich +
2 = kontinuierliche Drehung möglich + +
+ +
work_out[9] Anzahl der unterstützten Schreibmodi +
work_out[10] welche Eingabemodi stehen zur Verfügung + + + + + + + + + +
0 = keine +
1 = Request Modus +
2 = Request und Sample Modus + +
+ +
work_out[11] Textausrichtung wird + + + + + + +
0 = nicht unterstützt +
1 = unterstützt + +
+ +
work_out[12] Farbstiftwechsel wird + + + + + + +
0 = nicht unterstützt +
1 = unterstützt + +
+ +
work_out[13] Wechsel des Farbbandes wird am Ausgabegerät + + + + + + + + + +
0 = nicht unterstützt +
1 = zeilenweise unterstützt +
2 = zeilen- und spaltenweise unterstützt + +
+ +
work_out[14] Höchstzahl von Koordinatenpaare für v_pline, v_pmarker, +v_fillarea. Ein Wert von -1 steht für unbegrenzt. +
work_out[15] maximale Größe des int_in Feldes (-1 unbegenzt) +
work_out[16] Zahl der verfügbaren Maustasten +
work_out[17] versch. Linientypen werden für breite Linien + + + + + + +
0 = nicht unterstützt +
1 = unterstützt + +
+ +
work_out[18] Anzahl der verfügbaren Schreibmodi für breite Linien. +
work_out[19] Clipping aus (0) oder an (1). Nur auf PC-GEM ab Version 2.0 +und NVDI. +
work_out[20] + + + + + + + + + + + + +
0 = keine genaueren Pixelgrößen in den folgenden Feldern +
1 = Pixelausmaße in 1/10 Mikrometer +
2 = Pixelausmaße in 1/100 Mikrometer +
3 = Pixelausmaße in 1/1000 Mikrometer + +
+ +
work_out[21] Pixelbreite in Einheiten aus work_out[20] +
work_out[22] Pixelhöhe in Einheiten aus work_out[20] +
work_out[23] horizontale Auflösung in dpi +
work_out[24] vertikale Auflösung in dpi +
work_out[25] Flag um anzuzeigen, ob Bit-Image-Dateien auf Druckern vom +Treiber gedreht werden können (nur ab PC-GEM/3): + + + + + + +
0 = nein +
1 = Drehung in 0,90,180,270 Grad möglich. + +
+ +
work_out[26] + +
work_out[27] Adresse des Bildschirmpuffers (1/4 des Bildschirmbereichs) der +bei AES-Funktionen benutzt wird (nur ab PC-GEM/3). +
work_out[28] Bezier-Flag + + + +
Bit-1 = keine Beziers (0) bzw. Beziers (1) + +
+ +
Diese Information steht nur ab PC-GEM/3 sowie unter NVDI zur +Verfügung. +
work_out[30] Rasterflags + + + + + + + + + +
Bit-0 = 1 Bei vro_cpyfm und vrt_cpyfm können Raster skaliert werden. +
Bit-1 = 1 Neue Rasterfunktionen vorhanden, ab NVDI 5.00 +
Bit-2 = 1 Neue vr_clip_rects_xxx-Clipfunktionen vorhanden, ab NVDI +5.02 + +
+ +
work_out[32] + + + +
Bit-0 = 1 Treiber unterstützt Funktionen zur Farbverwaltungen (NVDI +5.xx) + +
+ +
work_out[40] nicht bedruckbarer linker Rand in Pixeln. +
work_out[41] nicht bedruckbarer oberer Rand in Pixeln. +
work_out[42] nicht bedruckbarer rechter Rand in Pixeln. +
work_out[43] nicht bedruckbarer unterer Rand in Pixeln. +
work_out[44] Papier- bzw. Seitenformat +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
0 =Voreinstellung benutzen
1 =DIN A3
2 =DIN A4
3 =DIN A5
4 =DIN B5
16 =Letter Size
17 =Half Size
18 =Legal Size
19 =Double Size
20 =Broad Sheet Size
+
+ +
work_out[45] obere, linke x-Koordinate +
work_out[46] obere, linke y-Koordinate des Clip-Rechtecks +
work_out[47] untere, rechte x-Koordinate +
work_out[48] untere, rechte y-Koordinate des Clipping-Rechtecks +
work_out[49]   +
:   +
:   +
work_out[56] reserviert, enthält 0 + +
+ +
Hinweis: Die hier angegebene Belegung des +work_out Arrays gilt für den Fall, daß die erweiterten +Informationen (owflag = 1) ermittelt werden sollen. Die +Informationen in den Feldern 21-24 und 40-43 sind nur dann gültig, +wenn work_out[20] einen Wert ungleich 0 enthält. +
  +
Die nicht bedruckbaren Ränder werden normalerweise nur bei +Druckertreibern zurückgeliefert. Sie ermöglichen es einer +Applikation, Dokumente zu zentrieren oder dem Benutzer ein +zutreffendes Bild der ausgedruckten Seite zu liefern, indem die +Ränder im Dokument angezeigt werden. (der bei v_opnwk in +work_out[0/1] zurückgelieferte Bereich ist der bedruckbare +Bereich). +
  +
Wenn genauere Pixelgrößen zurückgeliefert werden, sollte man +diese besonders beim Drucken zur Positionsberechnung der einzelnen +Grafikobjekte benutzen, denn die Benutzung der Werte von v_opnwk in +work_out[3..4] kann im schlimmsten Fall auf einem DIN-A4 Blatt +zu einer Ungenauigkeit von insgesamt 2 bis 3 mm führen. +
  +
Ergebnis: Die Funktion liefert kein direktes Funktionsergebnis. +
  +
Verfügbar: Supported by all drivers. +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding   v_contourfill   vswr_mode   v_pline   v_pmarker   +v_fillarea   v_opnwk +
  + +
+ +

7.6.76 Bindings für vq_extnd

+ + + + + + + + + +
C: void vq_extnd ( int16_t handle, int16_t owflag, int16_t +*work_out ); +
  +
Umsetzung: +
  +
void vq_extnd (int16_t handle, int16_t owflag,
+               int16_t *work_out)
+{
+   intin[0] = owflag;
+
+   contrl[0] = 102;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   work_out[0..44]  = intout[0..44];
+   work_out[45..56] = ptsout[0..11];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]102 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]6 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]45 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]owflag
intoutintout[0..44]work_out[0..44]
ptsoutptsout[0..11]work_out[45..56]
+
+ + +
+ +

7.6.77 vq_ext_devinfo

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire extended device status info« - Informationen über +einen Treiber ermitteln. +
  +
VDI-Nummer: 248 (Unterfunktion 4242) +
  +
Deklaration: int16_t vq_ext_devinfo ( int16_t handle, int16_t device, +int16_t *dev_exists, int8_t *file_path, int8_t *file_name, int8_t +*name ); +
  +
Beschreibung: Die Funktion ermittelt Informationen über einen GDOS-Treiber. +Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
device VDI-Gerätenummer (0..99) +
dev_exists Treiber +
+
+ + + + + + + + +
0 =nicht vorhanden
<>0 =vorhanden
+
+ +
file_path Datei-Pfad +
file_name Dateiname +
name Klartextname des Treibers + +
+ +
Ergebnis: Die Funktion liefert als Ergebnis den Wert 0, wenn der Treiber +noch nicht geöffnet worden ist. +
  +
Verfügbar: ab NVDI Version 3.00 +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding   vq_devinfo   vq_devinfo   GDOS   SpeedoGDOS   NVDI +
  + +
+ +

7.6.78 Bindings für vq_ext_devinfo

+ + + + + + + + + +
C: int16_t vq_ext_devinfo ( int16_t handle, int16_t device, +int16_t *dev_exists, int8_t *file_path, int8_t *file_name, int8_t +*name ); +
  +
Umsetzung: +
  +
int16_t vq_ext_devinfo (int16_t handle, int16_t device,
+                        int16_t *dev_exists, int8_t *file_path,
+                        int8_t *file_name, int8_t *name)
+{
+   intin[0] = device;
+   intin[1..2] = file_path;
+   intin[3..4] = file_name;
+   intin[5..6] = name;
+
+   contrl[0] = 248;
+   contrl[1] = 0;
+   contrl[3] = 7;
+   contrl[5] = 4242;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *dev_exists = intout[0];
+   return ( intout[1] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]248 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]7 # Einträge in intin
contrl+8contrl[4]2 # Einträge in intout
contrl+10contrl[5]4242 # Sub-Opcode
contrl+12contrl[6]handle
intinintin[0]device
intin+2intin[1..2]file_path
intin+6intin[3..4]file_name
intin+10intin[5..6]name
intoutintout[0]dev_exists
intout+2intout[1]Return-Wert
+
+ + +
+ +

7.6.79 vq_ptsinsz

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: +
  +
VDI-Nummer: 238 +
  +
Deklaration: void vq_ptsinsz ( void ); +
  +
Beschreibung: Einige GDOSe fragen den Treiber mit dieser Funktion wie groß +dessen PTSIN Feld ist. +
  +
Ergebnis: Größe des PTSIN Feld. +
  +
Verfügbar: Verschiedene GDOS +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.6.80 Bindings für vq_ptsinsz

+ + + +
+ +

7.6.81 vq_scrninfo

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Screen Information« - liefert genauere Angaben über +das Bildschirmformat +
  +
VDI-Nummer: 102 (Unterfunktion 1, Opcode 2) +
  +
Deklaration: void vq_scrninfo ( int16_t handle, int16_t *work_out ); +
  +
Beschreibung: Die Funktion vq_scrninfo liefert genauere Angaben über das +vorhandene Bildschirmformat. Diese Informationen sind in erster Linie +interessant für Programme, die +
  +
    +
  • schnell Raster aufbauen (auch in TrueColor) und diese mit +vro_cpyfm() auf den Schirm kopieren möchten. +
  • +
  • Raster speichern (z.B. XIMGs). +
  • +
  • Raster anzeigen. +
  • +
+ +
Ergebnis: Alle Informationen werden über das work_out Array nach +außen gereicht: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
work_out[0]: Formatangabe: + + + + + + + + + + + + +
0: Interleaved planes, wortweise +
1: Standardformat (komplette Planes) +
2: Packed Pixels +
-1: unbekanntes Format; nicht direkt beschreibbar + +
+ +
work_out[1]: Verfügbarkeit einer CLUT: + + + + + + + + + +
0: keine CLUT (z.B. TTM 194) +
1: Hardware-CLUT +
2: Software-CLUT (HiColor oder TrueColor) + +
+ +
work_out[2]: Anzahl der Ebenen (Bits) pro Pixel +
work_out[3]:   +
work_out[4]: Farbanzahl oder 0L (mehr als 2*10^31 Farben) +
work_out[5]: Breite einer Zeile in Bytes (ab EdDI 1.1) +
work_out[6]: + +
work_out[7]: Adresse der Bitmap (erst ab EdDI Version 1.1 verfügbar). +
work_out[8]: Anzahl der Bits für die Rot-Intensität +
work_out[9]: Anzahl der Bits für die Grün-Intensität +
work_out[10]: Anzahl der Bits für die Blau-Intensität +
work_out[11]: Anzahl der Bits für den Alpha-Channel oder ähnliches +
work_out[12]: Anzahl der Bits für Genlock +
work_out[13]: Anzahl der nicht benutzen Bits +
work_out[14]: Bitorganisation (erst ab EdDI 1.1) +
Bei 2-256 Farben: + + + +
Bit-0 = normale Bitreihenfolge + +
+ +
Bei 32768 Farben (16 Planes): + + + + + + + + + +
Bit-0 = normale Bitreihenfolge, d.h. 1 Overlay-Bit, 5 Rot-Bits, 5 +Grün-Bits, 5 Blau-Bits +
Bit-1 = Falcon-Format, d.h. 5 Rot-Bits, 5 Grün-Bits, 1 Overlay-Bit, 5 +Blau-Bits +
Bit-7 = Intel-Modell (Bytes vertauscht) z.B. Crazy Dots + +
+ +
Bei 65536 Farben (16 Planes): + + + + + + +
Bit-0 = normale Bitreihenfolge, d.h. 5 Rot-Bits, 6 Grün-Bits und 5 +Blau-Bits +
Bit-7 = Intel-Modell (Bytes vertauscht) z.B. Crazy Dots 2 + +
+ +
Bei 16,7 Mio. Farben (24 Planes): + + + + + + +
Bit-0 = normale Bitreihenfolge, d.h. 8 Rot-Bits, 8 Grün-Bits und 8 +Blau-Bits +
Bit-7 = Intel-Modell (Bytes vertauscht) + +
+ +
Bei 16,7 Mio. Farben (32 Planes): + + + + + + +
Bit-0 = normale Bitreihenfolge, d.h. 8 Overlay-Bits, 8 Rot-Bits, 8 +Grün-Bits und 8 Blau-Bits. +
Bit-7 = Intel-Modell (Bytes vertauscht) + +
+ + +
+ +
Falls eine Hardware-CLUT (work_out[1] == 1) vorhanden +ist: +
  + + + +
work_out[16..271]: Pixelwert des zugehörigen VDI-Farbindexes + +
+ +
Falls HiColor, TrueColor oder ähnliches vorhanden ist: +
  + + + + + + + + + + + + + + + + + + + + + +
work_out[16..31]: Zuordnung von Bitnummer im Pixel zum Bit der Rotintensität +
work_out[32..47]: Zuordnung von Bitnummer im Pixel zum Bit der Grünintensität +
work_out[48..63]: Zuordnung von Bitnummer im Pixel zum Bit der Blauintensität +
work_out[64..79]: Zuordnung der Bitnummer für Alpha-Channel +
work_out[80..95]: Zuordnung der Bitnummer für Genlock +
work_out[96..127]: unbenutzte Bits +
work_out[128..271]: reserviert (0) + +
+ +
Verfügbar: ab EdDI-Version 1.00. +
  +
Gruppe: Auskunftsfunktionen +
  +
Achtung: Das bei NVDI 2.5x beiliegende Enhancer.prg, das diesen Aufruf +für Rechner ohne NVDI simuliert, kopiert manchmal 273 Werte. Es +sollte deshalb darauf geachtet werden, daß work_out 273 Werte fassen +kann. +
  +
Querverweis: Binding   Beispiel-Belegung   XIMG-Format   Rasterformate   NVDI   Bitmapformat bei Druckertreibern +
  + +
+ +

7.6.82 Bindings für vq_scrninfo

+ + + + + + + + + +
C: void vq_scrninfo ( int16_t handle, int16_t *work_out ); +
  +
Umsetzung: +
  +
void vq_scrninfo (int16_t handle, int16_t *work_out)
+{
+   intin[0] = 2;
+
+   contrl[0] = 102;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   work_out[0..272] = intout[0..272];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]102 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]272 # Einträge in intout
contrl+10contrl[5]1 # Sub-Opcode
contrl+12contrl[6]handle
intinintin[0]2 # Opcode
intoutintout[0..272]work_out[0..272]
+
+ + +
+ +

7.6.83 Beispiele zu vq_scrninfo

+

Die folgende Liste enthält Beispiele für das von vq_scrninfo +belegte work_out-Array für verschiedene Bildschirmauflösungen: +

+

In 256 Farben auf dem Falcon würden folgende Ausgaben +erfolgen: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
work_outWertBedeutung
00Interleaved Planes, wortweise
11Hardware-CLUT vorhanden
288 Bit pro Pixel
3/4256256 verschiedene Farben gleichzeitig möglich
5xxxxBitmapbreite in Bytes (erst ab EdDI 1.1)
6/7xxxxLBitmapadresse (erst ab EdDI 1.1)
866 Bits für die Rot-Intensität
966 Bits für die Grün-Intensität
1066 Bits für die Blau-Intensität
110kein Bit für Alpha-Channel
120kein Bit für Genlock
130kein unbenutzes Bit
141normale Bitreihenfolge (erst ab EdDI 1.1)
   
160Pixelwert für VDI-Farbindex 0
17255Pixelwert für VDI-Farbindex 1
182Pixelwert für VDI-Farbindex 2
...... 
27115Pixelwert für VDI-Farbindex 255
+
+ +

In HiColor auf dem Falcon würden folgende Ausgaben +erfolgen: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
work_outWertBedeutung
02Packed Pixels
12HiColor bzw. TrueColor
21616 Bit pro Pixel
3/43276832768 verschiedene Farben gleichzeitig möglich
5xxxxBitmapbreite in Bytes (erst ab "EdDI 1.1)
6/7xxxxLBitmapadresse (erst ab EdDI 1.1)
855 Bits für die Rot-Intensität
955 Bits für die Grün-Intensität
1055 Bits für die Blau-Intensität
110kein Bit für Alpha-Channel
121ein Bit für Genlock
130kein unbenutzes Bit
142Falcon 15-Bit-Format mit 1 Overlay-Bit (EdDI 1.1)
   
1611Bit 0 der Rot-Intensität (niederwertigstes Bit)
  befindet sich in Bit 11 des Pixels
1712Bit 1 befindet sich in Bit 12 des Pixels
1813...
1914...
2015Bit 4 der Rot-Intensität (höchstwertigstes Bit)
  befindet sich in Bit 15 des Pixels
21..31-1Bits werden nicht für Rot-Intensität benutzt
   
   
326Bit 0 der Grün-Intensität (niederwertigstes Bit)
befindet sich in Bit 6 des Pixels
337Bit 1 befindet sich in Bit 7 des Pixels
348...
359...
3610Bit 4 der Grün-Intensität (höchstwertigstes Bit)
befindet sich in Bit 10 des Pixels
37..37-1Bits werden nicht für Grün-Intensität benutzt
   
   
480Bit 0 der Blau-Intensität (niederwertigstes Bit)
  befindet sich in Bit 0 des Pixels
491Bit 1 befindet sich in Bit 1 des Pixels
502...
513...
524Bit 4 der Blau-Intensität (höchstwertigstes Bit)
  befindet sich in Bit 4 des Pixels
53..63-1Bits werden nicht für Blau-Intensität benutzt
   
   
64..79-1kein Alpha-Channel
   
   
805Bit für Genlock
81..95-1nicht für Genlock benutzt
   
   
96..127-1keine unbenutzten Bits
+
+ +

In HiColor auf einer VGA-Grafikkarte würden folgende +Ausgaben erfolgen: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
work_outWertBedeutung
02Packed Pixels
12HiColor bzw. TrueColor
21616 Bit pro Pixel
3/43276832768 verschiedene Farben gleichzeitig möglich
5xxxxBitmapbreite in Bytes (erst ab EdDI 1.1)
6/7xxxxLBitmapadresse (erst ab EdDI 1.1)
855 Bits für die Rot-Intensität
955 Bits für die Grün-Intensität
1055 Bits für die Blau-Intensität
110kein Bit für Alpha-Channel
120kein Bit für Genlock
131ein unbenutzes Bit
1412915 Bit in Intel-Darstellung
  (gggbbbbb-xrrrrrgg;erst ab EdDI 1.1)
   
162Bit 0 der Rot-Intensität (niederwertigstes Bit)
  befindet sich in Bit 2 des Pixels
173Bit 1 befindet sich in Bit 3 des Pixels
184...
195...
206Bit 4 der Rot-Intensität (höchstwertigstes Bit)
  befindet sich in Bit 6 des Pixels
21..31-1Bits werden nicht für Rot-Intensität benutzt
   
   
3213Bit 0 der Grün-Intensität (niederwertigstes Bit)
befindet sich in Bit 13 des Pixels
3314Bit 1 befindet sich in Bit 14 des Pixels
3415...
350...
361Bit 4 der Grün-Intensität (höchstwertigstes Bit)
  befindet sich in Bit 1 des Pixels
37..37-1Bits werden nicht für Grün-Intensität benutzt
   
   
488Bit 0 der Blau-Intensität (niederwertigstes Bit)
befindet sich in Bit 8 des Pixels
499Bit 1 befindet sich in Bit 9 des Pixels
5010...
5111...
5212Bit 4 der Blau-Intensität (höchstwertigstes Bit)
  befindet sich in Bit 12 des Pixels
53..63-1Bits werden nicht für Blau-Intensität benutzt
   
   
64..79-1kein Alpha-Channel
   
   
80..95-1nicht für Genlock benutzt
   
   
967unbenutztes Bit
97..127-1keine unbenutzten Bits
+
+ +

Querverweis: vq_scrninfo   Rasterformate   NVDI +

+

7.6.84 v_create_driver_info

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: Informationen über einen Treiber ermitteln. +
  +
VDI-Nummer: 180 +
  +
Deklaration: DRV_INFO *v_create_driver_info( int16_t handle, int16_t +driver_id ); +
  +
Beschreibung: Die Funktion liefert Informationen über Gerätetreiber. +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
driver_id Nummer des Gerätetreibers + +
+ +
Ergebnis: Die Funktion liefert einen Zeiger auf ein DRV_INFO Struktur +oder 0L. +
  +
Verfügbar: NVDI 5 +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.6.85 Bindings für v_create_driver_info

+ + + + + + + + + +
C: DRV_INFO *v_create_driver_info( int16_t handle, int16_t +driver_id ); +
  +
Umsetzung: +
  +
DRV_INFO *v_create_driver_info( int16_t handle,
+                                int16_t driver_id )
+{
+  int16_t save_conf;
+
+  intin[0] = driver_id;
+
+  contrl[0] = 180;
+  contrl[1] = 0;
+  contrl[3] = 1;
+  contrl[5] = 0;
+  contrl[6] = handle;
+
+  contrl[2] = 0;
+  contrl[4] = 0;
+
+  save_conf = disable_nvdi_errors();
+  vdi ();
+  enable_nvdi_errors( save_conf );
+
+  if ( contrl[4] >= 2 )
+    return(*(DRV_INFO **) &intout[0] );
+
+  return( 0L );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]180 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]2 # Einträge in intout
contrl+10contrl[5]0
contrl+12contrl[6]handle
intinintin[0]driver_id
intoutintout[0..1]Return-Wert
+
+ + +
+ +

7.6.86 v_delete_driver_info

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: Informationen über einen Treiber verwerfen. +
  +
VDI-Nummer: 181 +
  +
Deklaration: int16_t v_delete_driver_info( int16_t handle, DRV_INFO +*drv_info ); +
  +
Beschreibung: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
drv_info Zeiger auf die Struktur von v_create_driver_info. + +
+ +
Ergebnis: Unbekannt. +
  +
Verfügbar: NVDI 5 +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding   v_create_driver_info +
  + +
+ +

7.6.87 Bindings für v_delete_driver_info

+ + + + + + + + + +
C: int16_t v_delete_driver_info( int16_t handle, DRV_INFO +*drv_info ); +
  +
Umsetzung: +
  +
int16_t v_delete_driver_info( int16_t handle,
+                              DRV_INFO *drv_info )
+{
+  *(DRV_INFO **) &intin[0] = drv_info;
+
+  contrl[0] = 181;
+  contrl[1] = 0;
+  contrl[3] = 2;
+  contrl[5] = 0;
+  contrl[6] = handle;
+
+  vdi ();
+
+  return( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]181 Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]2 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]0
contrl+12contrl[6]handle
intinintin[0..1]drv_info
+
+ + +
+ +

7.6.88 v_getbitmap_info

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Get character bitmap information« - Informationen über ein +Vektorzeichen ermitteln +
  +
VDI-Nummer: 239 +
  +
Deklaration: void v_getbitmap_info ( int16_t handle, int16_t ch, fix31 +*advx, fix31 *advy, fix31 *xoff, fix31 *yoff, int16_t *width, int16_t +*height, int16_t **bitmap ); +
  +
Beschreibung: Die Funktion liefert Informationen über ein Zeichen eines +Vektorzeichensatzes. +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
ch gewünschtes Zeichen +
advx x-Position +
advy y-Position für darauffolgendes Zeichen +
xoff x-Offset +
yoff y-Offset innerhalb der Pixel-Darstellung +
width Breite +
height Höhe der Pixeldarstellung +
bitmap Zeiger auf die Bitmap des Zeichens + +
+ +
Hinweis: Um auch ohne NVDI nachvollziehbare Ausgaben zu +bekommen, sollten die Texteffekte ausgeschaltet sein. Da der Zeiger +auf die Bitmap in der Regel in den Zeichencache verweist, sollte man +sich die Bitmap direkt nach dem Aufruf kopieren (Tip: +AES-Kontextswitch durch wind_update verhindern!) - andernfalls könnte +der Zeiger schon wieder ungültig sein. +
  +
Außerdem sollte man v_getbitmap_info nicht für enorm große +Zeichen (z.B. 300 pt und mehr) aufrufen, da diese je nach +Cache-Größe evtl. nicht mehr komplett aufgebaut werden können. Die +Bitmap enthält in diesem Fall nur einen Teil des Zeichens. +
  +
Man sollte diese Funktion nicht mißbrauchen, um eine eigene +Textausgabe zu bauen - es lohnt sich nicht und Pair-Kerning wäre auch +nicht möglich. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Verfügbar: ab SpeedoGDOS 4.00 und ab NVDI 3.00 +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding   vst_effects   SpeedoGDOS   NVDI +
  + +
+ +

7.6.89 Bindings für v_getbitmap_info

+ + + + + + + + + +
C: void v_getbitmap_info ( int16_t handle, int16_t ch, fix31 +*advx, fix31 *advy, fix31 *xoff, fix31 *yoff, int16_t *width, int16_t +*height, int16_t **bitmap ); +
  +
Umsetzung: +
  +
void v_getbitmap_info (int16_t handle, int16_t ch, fix31 *advx,
+                       fix31 *advy, fix31 *xoff, fix31 *yoff,
+                       int16_t *width, int16_t *height,
+                       int16_t **bitmap)
+{
+   intin[0] = ch;
+
+   contrl[0] = 239;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *width  = intout[0];
+   *height = intout[1];
+   *advx   = intout[2..3];
+   *advy   = intout[4..5];
+   *xoff   = intout[6..7];
+   *yoff   = intout[8..9];
+   *bitmap = intout[10..11];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]239 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]12 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]ch
intoutintout[0]width
intout+2intout[1]height
intout+4intout[2..3]advx
intout+8intout[4..5]advy
intout+12intout[6..7]xoff
intout+16intout[8..9]yoff
intout+20intout[10..11]bitmap
+
+ + +
+ +

7.6.90 v_get_driver_info

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire extended device status info« - Informationen über +einen Treiber ermitteln. +
  +
VDI-Nummer: -1 (Unterfunktion 4) +
  +
Deklaration: void v_get_driver_info ( int16_t device_id, int16_t +info_select, int8_t *info_string ); +
  +
Beschreibung: Die Funktion liefert Informationen Gerätetreiber und +Zeichensätze. +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
device_id Nummer des Gerätetreibers +
info_select Je nach wert von info_select bekommt man in +info_string bestimmte Informationen. + + + + + + + + + + + + + + + + + + + + + +
info_select info_string +
    +
1 Dateiname des Treiber +
2 Bezeichnung des Gerätes +
3 Zusatzinformationen, falls vorhanden +
4 Zeichensatzdateien des Gerätes +
5 Patchadresse des Treibers (z.B. Drucker-Port-Nummer) + +
+ + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Verfügbar: GEM/3 +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.6.91 Bindings für v_get_driver_info

+ + + + + + + + + +
C: void v_get_driver_info ( int16_t device_id, int16_t +info_select, int8_t *info_string ); +
  +
Umsetzung: +
  +
void v_get_driver_info ( int16_t device_id,
+                         int16_t info_select,
+                         int8_t *info_string )
+{
+   intin[0] = device_id;
+   intin[1] = info_select;
+
+   contrl[0] = -1;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[5] = 4;
+   contrl[6] = 0;
+
+   vdi ();
+
+   if ( info_select != 5 )
+   {
+      bptr = (int8_t *) intout ;
+      for ( ii = 0; ii < contrl[ 4 ]; ii ++ )
+         *info_string++ = *bptr++ ;
+      *info_string = 0 ;
+   }
+   else
+      *(int16_t *)info_string = intout[ 0 ] ;
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]-1 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]2 # Einträge in intin
contrl+8contrl[4]n # Einträge in intout
contrl+10contrl[5]4 # Sub-Opcode
contrl+12contrl[6]0
intinintin[0]device_id
intin+2intin[1]info_select
intoutintout[0..n-1]info_string
+
+ + +
+ +

7.6.92 v_read_default_settings

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: Ermitteln der Default Druckereinstellungen. +
  +
VDI-Nummer: 182 (Unterfunktion 0) +
  +
Deklaration: int16_t v_read_default_settings( int16_t handle, PRN_SETTINGS +*settings ); +
  +
Beschreibung: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
settings Zeiger auf eine Struktur vom Typ PRN_SETTINGS. + +
+ +
Ergebnis: Im Fehlerfall 0. +
  +
Verfügbar: NVDI 5 +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding   v_write_default_settings +
  + +
+ +

7.6.93 Bindings für v_read_default_settings

+ + + + + + + + + +
C: int16_t v_read_default_settings( int16_t handle, PRN_SETTINGS +*settings ); +
  +
Umsetzung: +
  +
int16_t v_read_default_settings( int16_t handle,
+                                 PRN_SETTINGS *settings )
+{
+  int16_t save_conf;
+
+  *(PRN_SETTINGS **) &intin[0] = settings;
+
+  contrl[0] = 182;
+  contrl[1] = 0;
+  contrl[3] = 2;
+  contrl[5] = 0;                 /* Unterfunktion 0 */
+  contrl[6] = handle;
+
+  contrl[2] = 0;
+  contrl[4] = 0;
+
+  save_conf = disable_nvdi_errors();
+  vdi ();
+  enable_nvdi_errors( save_conf );
+
+  if ( contrl[4] >= 1 )
+    return( intout[0] );
+
+  return( 0 );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]182 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]2 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]0 # Sub-Opcode
contrl+12contrl[6]handle
intinintin[0..1]settings
+
+ + +
+ +

7.6.94 v_write_default_settings

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: Setzen der Default Druckereinstellungen. +
  +
VDI-Nummer: 182 (Unterfunktion 1) +
  +
Deklaration: int16_t v_write_default_settings( int16_t handle, PRN_SETTINGS +*settings ); +
  +
Beschreibung: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
settings Zeiger auf eine Struktur vom Typ PRN_SETTINGS. + +
+ +
Ergebnis: Im Fehlerfall 0. +
  +
Verfügbar: NVDI 5 +
  +
Gruppe: Auskunftsfunktionen +
  +
Querverweis: Binding   v_read_default_settings +
  + +
+ +

7.6.95 Bindings für v_write_default_settings

+ + + + + + + + + +
C: int16_t v_write_default_settings( int16_t handle, PRN_SETTINGS +*settings ); +
  +
Umsetzung: +
  +
int16_t v_write_default_settings( int16_t handle,
+                                  PRN_SETTINGS *settings )
+{
+  int16_t save_conf;
+
+  *(PRN_SETTINGS **) &intin[0] = settings;
+
+  contrl[0] = 182;
+  contrl[1] = 0;
+  contrl[3] = 2;
+  contrl[5] = 1;                  /* Unterfunktion 1 */
+  contrl[6] = handle;
+
+  contrl[2] = 0;
+  contrl[4] = 0;
+
+  save_conf = disable_nvdi_errors();
+  vdi ();
+  enable_nvdi_errors( save_conf );
+
+  if ( contrl[4] >= 1 )
+    return( intout[0] );
+
+  return( 0 );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]182 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]2 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]1 # Sub-Opcode
contrl+12contrl[6]handle
intinintin[0..1]settings
+
+ + +
+ +

7.6.96 Aufbau des Fontheaders

+

Der von vqt_fontheader gelieferte Zeichensatz-Kopf ist +folgendermaßen aufgebaut: +

+
FH_FMVER    0      /* U   "D4.0" CR LF NULL NULL  8 bytes          */
+FH_FNTSZ    8      /* U   Font size (bytes) 4 bytes                */
+FH_FBFSZ   12      /* U   Min font buffer size (bytes) 4 bytes     */
+FH_CBFSZ   16      /* U   Min char buffer size (bytes) 2 bytes     */
+FH_HEDSZ   18      /* U   Header size (bytes) 2 bytes              */
+FH_FNTID   20      /* U   Source Font ID  2 bytes                  */
+FH_SFVNR   22      /* U   Source Font Version Number  2 bytes      */
+FH_FNTNM   24      /* U   Source Font full name  70 bytes          */
+FH_MDATE   94      /* U   Manufacturing Date  10 bytes             */
+FH_LAYNM  104      /* U   Layout (character set) Name  70 bytes    */
+FH_CPYRT  174      /* U   Copyright Notice  78 bytes               */
+FH_NCHRL  252      /* U   Number of Chars in Layout  2 bytes       */
+FH_NCHRF  254      /* U   Total Number of Chars in Font  2 bytes   */
+FH_FCHRF  256      /* U   Index of first char in Font  2 bytes     */
+FH_NKTKS  258      /* U   Number of kerning tracks in font 2 bytes */
+FH_NKPRS  260      /* U   Number of kerning pairs in font 2 bytes  */
+FH_FLAGS  262      /* U   Font flags 1 byte:                       */
+                   /*       Bit 0: Extended Mode if set,           */
+                                   Compact mode (default) if clear */
+                   /*       Bit 1: not used                        */
+                   /*       Bit 2: not used                        */
+                   /*       Bit 3: not used                        */
+                   /*       Bit 4: not used                        */
+                   /*       Bit 5: not used                        */
+                   /*       Bit 6: not used                        */
+                   /*       Bit 7: not used                        */
+
+FH_CLFGS  263      /* U   Classification flags 1 byte:             */
+                   /*       Bit 0: Italic                          */
+                   /*       Bit 1: Monospace                       */
+                   /*       Bit 2: Serif                           */
+                   /*       Bit 3: Display                         */
+                   /*       Bit 4: reserved                        */
+                   /*       Bit 5: reserved                        */
+                   /*       Bit 6: reserved                        */
+                   /*       Bit 7: reserved                        */
+
+FH_FAMCL  264      /* U   Family Classification 1 byte:            */
+                   /*       0:  Don't care                         */
+                   /*       1:  Serif                              */
+                   /*       2:  Sans serif                         */
+                   /*       3:  Monospace                          */
+                   /*       4:  Script or calligraphic             */
+                   /*       5:  Decorative                         */
+                   /*       6-255: not used                        */
+
+FH_FRMCL  265      /* U   Font form Classification 1 byte:         */
+                   /*       Bits 0-3 (width type):                 */
+                   /*         0-3:   reserved                      */
+                   /*         4:     Condensed                     */
+                   /*         5:     reserved for 3/4 condensed    */
+                   /*         6:     Semi-condensed                */
+                   /*         7:     reserved for 1/4 condensed    */
+                   /*         8:     Normal                        */
+                   /*         9:     reserved for 3/4 expanded     */
+                   /*        10:     Semi-expanded                 */
+                   /*        11:     reserved for 1/4 expanded     */
+                   /*        12:     Expanded                      */
+                   /*        13-15:  reserved                      */
+                   /*       Bits 4-7 (Weight):                     */
+                   /*         0:   reserved                        */
+                   /*         1:   Thin                            */
+                   /*         2:   Ultralight                      */
+                   /*         3:   Extralight                      */
+                   /*         4:   Light                           */
+                   /*         5:   Book                            */
+                   /*         6:   Normal                          */
+                   /*         7:   Medium                          */
+                   /*         8:   Semibold                        */
+                   /*         9:   Demibold                        */
+                   /*         10:  Bold                            */
+                   /*         11:  Extrabold                       */
+                   /*         12:  Ultrabold                       */
+                   /*         13:  Heavy                           */
+                   /*         14:  Black                           */
+                   /*         15-16: reserved                      */
+
+FH_SFNTN  266      /* U   Short Font Name  32 bytes                */
+FH_SFACN  298      /* U   Short Face Name  16 bytes                */
+FH_FNTFM  314      /* U   Font form 14 bytes                       */
+FH_ITANG  328      /* U   Italic angle 2 bytes (1/256th deg)       */
+FH_ORUPM  330      /* U   Number of ORUs per em  2 bytes           */
+FH_WDWTH  332      /* U   Width of Wordspace  2 bytes              */
+FH_EMWTH  334      /* U   Width of em-space  2 bytes               */
+FH_ENWTH  336      /* U   Width of en-space  2 bytes               */
+FH_TNWTH  338      /* U   Width of thin-space  2 bytes             */
+FH_FGWTH  340      /* U   Width of figure-space  2 bytes           */
+FH_FXMIN  342      /* U   Font-wide min X value  2 bytes           */
+FH_FYMIN  344      /* U   Font-wide min Y value  2 bytes           */
+FH_FXMAX  346      /* U   Font-wide max X value  2 bytes           */
+FH_FYMAX  348      /* U   Font-wide max Y value  2 bytes           */
+FH_ULPOS  350      /* U   Underline position 2 bytes               */
+FH_ULTHK  352      /* U   Underline thickness 2 bytes              */
+FH_SMCTR  354      /* U   Small caps transformation 6 bytes        */
+FH_DPSTR  360      /* U   Display sups transformation 6 bytes      */
+FH_FNSTR  366      /* U   Footnote sups transformation 6 bytes     */
+FH_ALSTR  372      /* U   Alpha sups transformation 6 bytes        */
+FH_CMITR  378      /* U   Chemical infs transformation 6 bytes     */
+FH_SNMTR  384      /* U   Small nums transformation 6 bytes        */
+FH_SDNTR  390      /* U   Small denoms transformation 6 bytes      */
+FH_MNMTR  396      /* U   Medium nums transformation 6 bytes       */
+FH_MDNTR  402      /* U   Medium denoms transformation 6 bytes     */
+FH_LNMTR  408      /* U   Large nums transformation 6 bytes        */
+FH_LDNTR  414      /* U   Large denoms transformation 6 bytes      */
+                   /*     Transformation data format:              */
+                   /*       Y position 2 bytes                     */
+                   /*       X scale 2 bytes (1/4096ths)            */
+                   /*       Y scale 2 bytes (1/4096ths)            */
+
+SIZE_FW FH_LDNTR + 6   /* size of nominal font header              */
+EXP_FH_METRES SIZE_FW  /* offset to expansion field metric
+                          resolution (optional)                    */
+
+

Querverweis: vqt_fontheader   Header bei Bitmap GDOS-Fonts   Vektorfonts +

+

7.6.97 disable_nvdi_errors

+
int16_t disable_nvdi_errors ( void )
+{
+  int16_t save_conf;
+  NVDI_STRUC *p;
+
+  if ( get_cookie( 'NVDI', p ) )
+  {
+    save_conf = p->nvdi_config;
+    p->nvdi_config |= 2;
+    p->nvdi_config &= 0xFFBF;
+
+    return save_conf;
+  }
+
+  return 0;
+}
+
+

7.6.98 enable_nvdi_errors

+
void enable_nvdi_errors ( int16_t save_conf )
+{
+  NVDI_STRUC *p;
+
+  if ( get_cookie( 'NVDI', p ) )
+    p->nvdi_config = save_conf;
+
+  return;
+}
+
+
+ +Home +VDIVDI +AusgabefunktionenAusgabefunktionen +EingabefunktionenEingabefunktionen + + diff --git a/de/vdi_main.html b/de/vdi_main.html new file mode 100644 index 000000000..41cb474de --- /dev/null +++ b/de/vdi_main.html @@ -0,0 +1,50 @@ + + + + + +Die Anleitung zum TOS: VDI + + + + + + + + + +Home +Inhaltsverzeichnis +SeedfillSeedfill +Das VDIDas VDI + +
+ +

7 VDI

+ +
+
+ +Home +Inhaltsverzeichnis +SeedfillSeedfill +Das VDIDas VDI + + diff --git a/de/vdi_output.html b/de/vdi_output.html new file mode 100644 index 000000000..a26cbcc3c --- /dev/null +++ b/de/vdi_output.html @@ -0,0 +1,4561 @@ + + + + + +Die Anleitung zum TOS: Ausgabefunktionen + + + + + + + + + +Home +VDIVDI +AttributfunktionenAttributfunktionen +AuskunftsfunktionenAuskunftsfunktionen + +
+ +

7.5 Ausgabefunktionen

+

Diese Bibliothek enthält eine Vielzahl von Funktionen, um +Ausgaben unterschiedlicher Art auf einem Ausgabegerät vornehmen zu +können. Insgesamt stehen die folgenden Routinen zur Verfügung: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
v_arc Kreisbogen zeichnen. +
v_bar Ausgefülltes Rechteck zeichnen. +
v_bez Bezier-Spline zeichnen. +
v_bez_fill Bezier-Spline zeichnen und füllen. +
v_cellarray Farbauswahltabelle darstellen. +
v_circle Ausgefüllten Kreis zeichnen. +
v_contourfill Fläche bis zu bestimmten Begrenzungen ausfüllen. +
v_ellarc Ellipsenbogen zeichnen. +
v_ellipse Ausgefüllte Ellipse zeichnen. +
v_ellpie Ausgefülltes Ellipsensegment zeichnen. +
v_etext Text grafisch ausgeben. +
v_fillarea Angegebene Fläche ausfüllen. +
v_ftext Text mittels Vektor-Font ausgeben. +
• v_ftext16 z.Zt. keine Informationen bekannt. +
v_ftext_offset Text mittels Vektor-Font ausgeben. +
• v_ftext_offset16 z.Zt. keine Informationen bekannt. +
v_gtext Text grafisch ausgeben. +
v_justified Ausgerichteten Text ausgeben. +
• v_mono_ftext z.Zt. keine Informationen bekannt. +
v_pieslice Ausgefülltes Kreissegment zeichnen. +
v_pline Linienzug zeichnen. +
v_pmarker Markierung zeichnen. +
v_rbox Abgerundetes Rechteck zeichnen. +
v_rfbox Ausgefülltes, abgerundetes Rechteck zeichnen. +
vr_recfl Rechteck ausfüllen. + +
+ +

Hinweis: Über die Attributfunktionen ist es darüber +hinaus möglich, die Art der Ausgabe weiter zu spezifizieren. +

+

Querverweis: Workstations des VDI   Style-Guidelines +

+

7.5.1 vr_recfl

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Fill Rectangle« - füllt ein Rechteck. +
  +
VDI-Nummer: 114 +
  +
Deklaration: void vr_recfl ( int16_t handle, int16_t *pxyarray ); +
  +
Beschreibung: Die Funktion füllt eine rechteckige Fläche aus. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
pxyarray[0] x-Koordinate +
pxyarray[1] y-Koordinate des Eckpunktes +
pxyarray[2] x-Koordinate +
pxyarray[3] y-Koordinate der diagonal gegenüber liegenden Ecke + +
+ +
Hinweis: Die Fülltyp-Attribute werden beim Zeichnen +beachtet. Hiervon ausgenommen ist lediglich die Einstellung der +Umrahmung. +
  +
Die Funktion ist nicht auf allen Ausgabegeräten +verfügbar; daher sollte im Zweifelsfall besser auf die v_bar Routine +zurückgegriffen werden. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all drivers. +
  +
Gruppe: Ausgabefunktionen +
  +
Querverweis: Binding   v_fillarea   vswr_mode   vs_color   vsf_interior   +vsf_style   vsf_color   vsf_udpat   vsf_perimeter +
  + +
+ +

7.5.2 Bindings für vr_recfl

+ + + + + + + + + +
C: void vr_recfl ( int16_t handle, int16_t *pxyarray ); +
  +
Umsetzung: +
  +
void vr_recfl (int16_t handle, int16_t *pxyarray)
+{
+   ptsin[0..3] = pxyarray[0..3];
+
+   contrl[0] = 114;
+   contrl[1] = 2;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]114 # Opcode der Funktion
contrl+2contrl[1]2 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
ptsinptsin[0..3]pxyarray[0..3]
+
+ + +
+ +

7.5.3 v_arc

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Arc« - zeichnet einen Kreisbogen. +
  +
VDI-Nummer: 11 (GDP 2) +
  +
Deklaration: void v_arc ( int16_t handle, int16_t x, int16_t y, int16_t +radius, int16_t begang, int16_t endang ); +
  +
Beschreibung: Die Funktion zeichnet einen Kreisbogen. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
x x-Koordinate +
y y-Koordinate des Mittelpunktes +
radius Radius bzgl. der x-Achse +
begang Startwinkel +
endang Endwinkel + +
+ +
Hinweis: Die Linien-Attribute, der Schreibmodus sowie +die tatsächliche Pixelgröße werden beim Zeichnen berücksichtigt. +Die Angabe des Radius bezieht sich auf die x-Achse. Der Winkel wird in +1/10 Grad, und entgegen dem Uhrzeigersinn angegeben: +
  +
             900
+            |
+            |
+            |
+   ---------+---------
+1800        |        0
+            |
+            |
+             2700
+
+
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all drivers. This function composes one of the 10 +VDI GDP's (Generalized Drawing Primitives). Although all current +drivers support all GDP's, their availability is not guaranteed and +may vary. To check for a particular GDP refer to the table returned by +v_opnvwk() or v_opnwk(). +
  +
Gruppe: Ausgabefunktionen +
  +
Querverweis: Binding   vs_color   vswr_mode   vsl_type   vsl_width   +vsl_color   vsl_ends   vsl_udsty +
  + +
+ +

7.5.4 Bindings für v_arc

+ + + + + + + + + +
C: void v_arc ( int16_t handle, int16_t x, int16_t y, int16_t +radius, int16_t begang, int16_t endang ); +
  +
Umsetzung: +
  +
void v_arc (int16_t handle, int16_t x, int16_t y,
+            int16_t radius, int16_t begang, int16_t endang)
+{
+   ptsin[0] = x;
+   ptsin[1] = y;
+   ptsin[2] = ptsin[3] = ptsin[4] = ptsin[5] = 0;
+   ptsin[6] = radius;
+   ptsin[7] = 0;
+
+   intin[0] = begang;
+   intin[1] = endgang;
+
+   contrl[0] = 11;
+   contrl[1] = 4;
+   contrl[3] = 2;
+   contrl[5] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]11 # Opcode der Funktion
contrl+2contrl[1]4 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]2 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]2 GDP-Nummer
contrl+12contrl[6]handle
intinintin[0]begang
intin+2intin[1]endgang
ptsinptsin[0]x
ptsin+2ptsin[1]y
ptsin+4ptsin[2..5]0
ptsin+12ptsin[6]radius
ptsin+14ptsin[7]0
+
+ + +
+ +

7.5.5 v_bar

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Bar« - zeichnet ein ausgefülltes Rechteck. +
  +
VDI-Nummer: 11 (GDP 1) +
  +
Deklaration: void v_bar ( int16_t handle, int16_t *pxyarray ); +
  +
Beschreibung: Die Funktion zeichnet ein ausgefülltes Rechteck. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
pxyarray[0] x-Koordinate +
pxyarray[1] y-Koordinate des Eckpunktes +
pxyarray[2] x-Koordinate +
pxyarray[3] y-Koordinate der diagonal gegenüber liegenden Ecke + +
+ +
Hinweis: Die Funktion kann z.B. für das Zeichnen von +Balkendiagrammen benutzt werden. Die Fülltyp-Attribute sowie der +Schreibmodus werden beachtet. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all drivers. This function composes one of the 10 +VDI GDP's (Generalized Drawing Primitives). Although all current +drivers support all GDP's, their availability is not guaranteed and +may vary. To check for a particular GDP refer to the table returned by +v_opnvwk() or v_opnwk(). +
  +
Gruppe: Ausgabefunktionen +
  +
Querverweis: Binding   vswr_mode   vs_color   vsf_interior   vsf_style   +vsf_color   vsf_udpat   vsf_perimeter +
  + +
+ +

7.5.6 Bindings für v_bar

+ + + + + + + + + +
C: void v_bar ( int16_t handle, int16_t *pxyarray ); +
  +
Umsetzung: +
  +
void v_bar (int16_t handle, int16_t *pxyarray)
+{
+   ptsin[0..3] = pxyarray[0..3];
+   contrl[0] = 11;
+   contrl[1] = 2;
+   contrl[3] = 0;
+   contrl[5] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]11 # Opcode der Funktion
contrl+2contrl[1]2 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]1 GDP-Nummer
contrl+12contrl[6]handle
ptsinptsin[0..3]pxyarray[0..3]
+
+ + +
+ +

7.5.7 v_bez

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Output Bezier« - Bezier-Spline zeichnen. +
  +
VDI-Nummer: 6 (Unterfunktion 13) +
  +
Deklaration: void v_bez ( int16_t handle, int16_t count, int16_t *xyarr, +int8_t *bezarr, int16_t *extent, int16_t *totpts, int16_t *totmoves ); +
  +
Beschreibung: Die Funktion zeichnet einen Bezier-Spline. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
count Anzahl der Stützstellen +
xyarr Koordinaten +
bezarr Punkttypen als Bitvektor + + + + + + + + + +
Bit-0 = Startpunkt eines 4-Punkte Beziersegments (2 Ankerpunkte und +zwei Richtungspunkte). +
Bit-1 = 'Jump point'. Dieser Punkt und der vorhergehende werden nicht +verbunden. Nützlich um Enklaven oder Exklaven zu zeichnen. +
Bit-2..7 = undefiniert + +
+ +
extent Koordinaten des umschließenden Rechteckes +
totpts Anzahl der Punkte im Polygon +
totmoves Anzahl der Züge im Polygon + +
+ +
Hinweis: Der Endpunkt eines Beziersegments kann auch der +Startpunkt des nächsten Beziers sein - er kann aber kein 'jump point' +sein. Ist im bezarr Bit 0 gelöscht, verhält sich die +Bezierfunktion wie v_pline mit der Erweiterung, über den 'jump point' +Enklaven oder Exklaven zeichnen zu können. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: ab GEM/3 Release 3.1, ab SpeedoGDOS 4.00 und ab NVDI 2.10 +
  +
Gruppe: Ausgabefunktionen +
  +
Querverweis: Binding   v_bez_on   v_bez_off   v_bez_fill   v_bez_qual   +v_set_app_buff +
  + +
+ +

7.5.8 Bindings für v_bez

+ + + + + + + + + +
C: void v_bez ( int16_t handle, int16_t count, int16_t *xyarr, +int8_t *bezarr, int16_t *extent, int16_t *totpts, int16_t *totmoves ); +
  +
Umsetzung: +
  +
void v_bez (int16_t handle, int16_t count, int16_t *xyarr,
+            int8_t *bezarr, int16_t *extent, int16_t *totpts,
+            int16_t *totmoves)
+{
+   ptsin[0..2n-1] = xyarr[0..2n-1];
+   intin[0..(n+1)/2-1] = bezarr[0..n-1]
+
+   contrl[0] = 6;
+   contrl[1] = n;
+   contrl[3] = (n+1)/2;
+   contrl[5] = 13;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *totpts   = intout[0];
+   *totmoves = intout[1];
+   extent[0..3] = ptsout[0..3];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]6 # Opcode der Funktion
contrl+2contrl[1]n # Einträge in ptsin
contrl+4contrl[2]2 # Einträge in ptsout
contrl+6contrl[3](n+1)/2 # Einträge in intin
contrl+8contrl[4]6 # Einträge in intout
contrl+10contrl[5]13 Unterfunktion
contrl+12contrl[6]handle
intinintin[0..(n+1)/2-1)]bezarr[0..n-1]
ptsinptsin[0..2n-1]xyarr[0..2n-1]
intoutintout[0]totpts
intout+2intout[1]totmoves
intout+4intout[2..5]reserviert
ptsoutptsout[0..3]extent[0..3]
+
+ +
Hinweis: Die im Array bezarr übergebenen +Punkttypen müssen vom C-Binding vertauscht werden, da diese Funktion +leider diesbezüglich kompatibel zum PC-GEM ist. bezarr[0] +wird ins Low-Byte von intin[0] und bezarr[1] ins High-Byte von +intin[0] geschrieben. +
  + +
+ +

7.5.9 v_bez_fill

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Output filled Bezier« - Bezier-Spline zeichnen und füllen. +
  +
VDI-Nummer: 9 (Unterfunktion 13) +
  +
Deklaration: void v_bez_fill ( int16_t handle, int16_t count, int16_t +*xyarr, int8_t *bezarr, int16_t *extent, int16_t *totpts, int16_t +*totmoves ); +
  +
Beschreibung: Die Funktion zeichnet einen Bezier-Spline und füllt diesen +anschließend aus. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
count Anzahl der Stützstellen +
xyarr[0..2n-1] Koordinaten +
bezarr Punkttypen als Bitvektor + + + + + + + + + +
Bit-0 Startpunkt eines 4-Punkte Beziersegments (2 Anker- und zwei +Richtungspunkte) +
Bit-1 'Jump point'. Dieser Punkt und der vorhergehende werden nicht +verbunden. Dies ist nützlich um Enklaven, oder Exklaven zu zeichnen. +
Bit-2..7 undefiniert. + +
+ +
extent[0..3] Koordinaten des umschließenden Rechtecks +
totpts Anzahl der Punkte im Polygon +
totmoves Anzahl der Züge im Polygon + +
+ +
Hinweis: Ist im bezarr Bit-0 gelöscht, verhält +sich die Funktion wie v_fillarea mit der Erweiterung, über den 'Jump +point' Enklaven oder Exklaven zeichnen zu können. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: ab GEM/3 Release 3.1, ab SpeedoGDOS 4.00 und ab NVDI 2.10 +
  +
Gruppe: Ausgabefunktionen +
  +
Querverweis: Binding   v_bez_on   v_bez_off   v_bez   v_bez_qual   +v_set_app_buff   v_fillarea +
  + +
+ +

7.5.10 Bindings für v_bez_fill

+ + + + + + + + + +
C: void v_bez_fill ( int16_t handle, int16_t count, int16_t +*xyarr, int8_t *bezarr, int16_t *extent, int16_t *totpts, int16_t +*totmoves ); +
  +
Umsetzung: +
  +
void v_bez_fill (int16_t handle, int16_t count, int16_t *xyarr,
+                 int8_t *bezarr, int16_t *extent,
+                 int16_t *totpts, int16_t *totmoves)
+{
+   ptsin[0..2n-1] = xyarr[0..2n-1];
+   intin[0..(n+1)/2-1] = bezarr[0..n-1];
+
+   contrl[0] = 9;
+   contrl[1] = n;
+   contrl[3] = (n+1)/2;
+   contrl[5] = 13;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *totpts   = intout[0];
+   *totmoves = intout[1];
+   extent[0..3] = ptsout[0..3];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]9 # Opcode der Funktion
contrl+2contrl[1]n # Einträge in ptsin
contrl+4contrl[2]2 # Einträge in ptsout
contrl+6contrl[3](n+1)/2 # Einträge in intin
contrl+8contrl[4]6 # Einträge in intout
contrl+10contrl[5]13 # Unterfunktion
contrl+12contrl[6]handle
intinintin[0..(n+1)/2-1]bezarr[0..n-1]
ptsinptsin[0..2n-1]xyarr[0..2n-1]
intoutintout[0]totpts
intout+2intout[1]totmoves
intout+4intout[2..5]reserviert
ptsoutptsout[0..3]extent[0..3]
+
+ +
Hinweis: Die im Array bezarr übergebenen +Punkttypen müssen vom C-Binding vertauscht werden, da diese Funktion +leider diesbezüglich kompatibel zum PC-GEM ist. bezarr[0] +wird ins Low-Byte von intin[0] und bezarr[1] ins High-Byte von +intin[0] geschrieben. +
  + +
+ +

7.5.11 v_cellarray

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Cell Array« - Farbaufbau des Bildschirms in Koordinaten. +
  +
VDI-Nummer: 10 +
  +
Deklaration: void v_cellarray ( int16_t handle, int16_t *pxyarray, int16_t +row_length, int16_t el_used, int16_t num_rows, int16_t wrt_mode, +int16_t *colarray ); +
  +
Beschreibung: Die Funktion ermöglicht es, den Farbaufbau des Bildschirms +nicht von den gezeichneten Objekten abhängig zu machen, sondern von +den Koordinaten des Bildschirms. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
pxyarray Koordinaten des Begrenzungsrechtecks +
row_length Zeilenlänge im Farbindex-Array +
el_used Anzahl der Spalten +
num_rows Anzahl der Zeilen +
wrt_mode Schreibmodus +
colarray Farbindexarray, enthält die Farbinformation für das ganze +Rechteck (zeilenweise) + +
+ +
Hinweis: Das Ausgabegerät wird in eine Anzahl von +Zellen unterteilt, wobei jeder Zelle eine Farbe zugeordnet wird. +Erfolgt nun eine Ausgabe in der entsprechenden Zelle, so erfolgt diese +in der, der Zelle zugeordneten Farbe. Die Funktion ist nicht +auf allen Ausgabegeräten verfügbar. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Not supported by any current drivers. +
  +
This function is not guaranteed available in any driver and +should therefore be avoided unless you are sure the driver you are +utilizing understands it. +
  +
Gruppe: Ausgabefunktionen +
  +
Querverweis: Binding   vswr_mode +
  + +
+ +

7.5.12 Bindings für v_cellarray

+ + + + + + + + + +
C: void v_cellarray ( int16_t handle, int16_t *pxyarray, int16_t +row_length, int16_t el_used, int16_t num_rows, int16_t wrt_mode, +int16_t *colarray ); +
  +
Umsetzung: +
  +
void v_cellarray (int16_t handle, int16_t *pxyarray,
+                  int16_t row_length, int16_t el_used,
+                  int16_t num_rows,  int16_t wrt_mode,
+                  int16_t *colarray)
+{
+   int16_t n;
+
+   n = row_length * num_rows;
+
+   intin[0..n-1] = colarray[0..n-1];
+   ptsin[0..3] = pxyarray[0..3];
+
+   contrl[0]  = 10;
+   contrl[1]  = 2;
+   contrl[3]  = n;
+   contrl[6]  = handle;
+   contrl[7]  = row_length;
+   contrl[8]  = el_used;
+   contrl[9]  = num_rows;
+   contrl[10] = wrt_mode;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]10 # Opcode der Funktion
contrl+2contrl[1]2 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]n # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
contrl+14contrl[7]row_length
contrl+16contrl[8]el_used
contrl+18contrl[9]num_rows
contrl+20contrl[10]wrt_mode
intinintin[0..n-1]colarray[0..n-1]
ptsinptsin[0..3]pxyarray[0..3]
+
+ +
Hinweis: n ist hier die #Zeilen * #Spalten der +Zellenaufteilung. +
  + +
+ +

7.5.13 v_circle

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Circle« - zeichnet eine Kreisfläche. +
  +
VDI-Nummer: 11 (GDP 4) +
  +
Deklaration: void v_circle ( int16_t handle, int16_t x, int16_t y, int16_t +radius ); +
  +
Beschreibung: Die Funktion zeichnet eine Kreisfläche. Es gilt: +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
x x-Koordinate +
y y-Koordinate für den Mittelpunkt +
radius Radius bzgl. der x-Achse + +
+ +
Hinweis: Die Fülltyp-Attribute, der Schreibmodus sowie +das Pixelgrößenverhältnis werden beachtet. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all drivers. This function composes one of the 10 +VDI GDP's (Generalized Drawing Primitives). Although all current +drivers support all GDP's, their availability is not guaranteed and +may vary. To check for a particular GDP refer to the table returned by +v_opnvwk() or v_opnwk(). +
  +
Gruppe: Ausgabefunktionen +
  +
Querverweis: Binding   vswr_mode   vs_color   vsf_interior   vsf_style   +vsf_color   vsf_udpat   vsf_perimeter +
  + +
+ +

7.5.14 Bindings für v_circle

+ + + + + + + + + +
C: void v_circle ( int16_t handle, int16_t x, int16_t y, int16_t +radius ); +
  +
Umsetzung: +
  +
void v_circle (int16_t handle, int16_t x, int16_t y,
+               int16_t radius)
+{
+   ptsin[0]  = x;
+   ptsin[1]  = y;
+   ptsin[2]  = 0;
+   ptsin[3]  = 0;
+   ptsin[4]  = radius;
+   ptsin[5]  = 0;
+
+   contrl[0] = 11;
+   contrl[1] = 3;
+   contrl[3] = 0;
+   contrl[5] = 4;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]11 # Opcode der Funktion
contrl+2contrl[1]3 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]4 GDP-Nummer
contrl+12contrl[6]handle
ptsinptsin[0]x
ptsin+2ptsin[1]y
ptsin+4ptsin[2..3]0
ptsin+8ptsin[4]radius
ptsin+10ptsin[5]0
+
+ + +
+ +

7.5.15 v_contourfill

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Countour fill« - füllt eine Fläche. +
  +
VDI-Nummer: 103 +
  +
Deklaration: void v_contourfill ( int16_t handle, int16_t x, int16_t y, +int16_t index ); +
  +
Beschreibung: Die Funktion füllt, abhängig vom Startpunkt, eine bestimmte +Fläche aus. Es gilt: +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
x x-Koordinate +
y y-Koordinate des Startpunktes +
index Farbindex + +
+ +
Hinweis: Die Füllfläche wird durch den Bildschirmrand, +oder durch eine definierte Farbe begrenzt. +
  +
Die aktuellen Fülltyp-Attribute werden beim Zeichnen beachtet. +Ist der Parameter index negativ, so wird gefüllt, bis ein +andersfarbiges Pixel angetroffen wird. +
  +
Ergebnis: Die Funktion liefert kein direktes Funktionsergebnis. +
  +
Verfügbar: Die Funktion ist nicht auf allen Ausgabegeräten +verfügbar, deshalb sollte per vq_extnd nachgefragt werden. +
  +
Gruppe: Ausgabefunktionen +
  +
Querverweis: Binding   vswr_mode   vs_color   vsf_interior   vsf_style   +vsf_color   vsf_udpat   vsf_perimeter +
  + +
+ +

7.5.16 Bindings für v_contourfill

+ + + + + + + + + +
C: void v_contourfill ( int16_t handle, int16_t x, int16_t y, +int16_t index ); +
  +
Umsetzung: +
  +
void v_contourfill (int16_t handle, int16_t x, int16_t y,
+                    int16_t index)
+{
+   intin[0]  = index;
+   ptsin[0]  = x;
+   ptsin[1]  = y;
+   contrl[0] = 103;
+   contrl[1] = 1;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]103 # Opcode der Funktion
contrl+2contrl[1]1 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0]index
ptsinptsin[0]x
ptsin+2ptsin[1]y
+
+ + +
+ +

7.5.17 v_ellarc

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Elliptical Arc« - zeichnet einen Ellipsenbogen. +
  +
VDI-Nummer: 11 (GDP 6) +
  +
Deklaration: void v_ellarc ( int16_t handle, int16_t x, int16_t y, int16_t +xradius, int16_t yradius, int16_t begang, int16_t endang ); +
  +
Beschreibung: Die Funktion zeichnet einen Ausschnitt eines Ellipsenbogens. Es +gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
x x-Koordinate +
y y-Koordinate für den Mittelpunkt +
xradius Radius in x-Achse +
yradius Radius in y-Achse +
begang Startwinkel +
endang Endwinkel + +
+ +
Hinweis: Die Linien-Attribute und der Schreibmodus +werden beim Zeichnen beachtet, das Pixelgrößenverhältnis jedoch +ignoriert. Der Winkel wird in 1/10 Grad und entgegen dem Uhrzeigersinn +angegeben: +
  +
             900
+            |
+            |
+            |
+   ---------+---------
+1800        |        0
+            |
+            |
+             2700
+
+
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all drivers. This function composes one of the 10 +VDI GDP's (Generalized Drawing Primitives). Although all current +drivers support all GDP's, their availability is not guaranteed and +may vary. To check for a particular GDP refer to the table returned by +v_opnvwk or v_opnwk. +
  +
Gruppe: Ausgabefunktionen +
  +
Querverweis: Binding   vs_color   vswr_mode   vsl_type   vsl_width   +vsl_color   vsl_ends   vsl_udsty +
  + +
+ +

7.5.18 Bindings für v_ellarc

+ + + + + + + + + +
C: void v_ellarc ( int16_t handle, int16_t x, int16_t y, int16_t +xradius, int16_t yradius, int16_t begang, int16_t endang ); +
  +
Umsetzung: +
  +
void v_ellarc (int16_t handle, int16_t x, int16_t y,
+               int16_t xradius, int16_t yradius,
+               int16_t begang, int16_t endang)
+{
+   ptsin[0]  = x;
+   ptsin[1]  = y;
+   ptsin[2]  = xradius;
+   ptsin[3]  = yradius;
+
+   intin[0] = begang;
+   intin[1] = endang;
+
+   contrl[0] = 11;
+   contrl[1] = 2;
+   contrl[3] = 2;
+   contrl[5] = 6;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]11 # Opcode der Funktion
contrl+2contrl[1]2 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]2 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]6 GDP-Nummer
contrl+12contrl[6]handle
intinintin[0]begang
intin+2intin[1]endang
ptsinptsin[0]x
ptsin+2ptsin[1]y
ptsin+4ptsin[2]xradius
ptsin+6ptsin[3]yradius
+
+ + +
+ +

7.5.19 v_ellipse

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Ellipse« - zeichnet eine Ellipsenfläche. +
  +
VDI-Nummer: 11 (GDP 5) +
  +
Deklaration: void v_ellipse ( int16_t handle, int16_t x, int16_t y, int16_t +xradius, int16_t yradius ); +
  +
Beschreibung: Die Funktion zeichnet eine Ellipsenfläche. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
x x-Koordinate +
y y-Koordinate für den Mittelpunkt +
xradius Radius in x-Richtung +
yradius Radius in y-Richtung + +
+ +
Hinweis: Die Fülltyp-Attribute und der Schreibmodus +werden berücksichtigt, das Pixelgrößenverhältnis jedoch ignoriert. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all drivers. This function composes one of the 10 +VDI GDP's (Generalized Drawing Primitives). Although all current +drivers support all GDP's, their availability is not guaranteed and +may vary. To check for a particular GDP refer to the table returned by +v_opnvwk or v_opnwk. +
  +
Gruppe: Ausgabefunktionen +
  +
Querverweis: Binding   vswr_mode   vs_color   vsf_interior   vsf_style   +vsf_color   vsf_udpat   vsf_perimeter +
  + +
+ +

7.5.20 Bindings für v_ellipse

+ + + + + + + + + +
C: void v_ellipse ( int16_t handle, int16_t x, int16_t y, int16_t +xradius, int16_t yradius ); +
  +
Umsetzung: +
  +
void v_ellipse (int16_t handle, int16_t x, int16_t y,
+                int16_t xradius, int16_t yradius)
+{
+   ptsin[0]  = x;
+   ptsin[1]  = y;
+   ptsin[2]  = xradius;
+   ptsin[3]  = yradius;
+
+   contrl[0] = 11;
+   contrl[1] = 2;
+   contrl[3] = 0;
+   contrl[5] = 5;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]11 # Opcode der Funktion
contrl+2contrl[1]2 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]5 GDP-Nummer
contrl+12contrl[6]handle
ptsinptsin[0]x
ptsin+2ptsin[1]y
ptsin+4ptsin[2]xradius
ptsin+6ptsin[3]yradius
+
+ + +
+ +

7.5.21 v_ellpie

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Elliptical Pie« - zeichnet eine Ellipsenbogenfläche. +
  +
VDI-Nummer: 11 (GDP 7) +
  +
Deklaration: void v_ellpie ( int16_t handle, int16_t x, int16_t y, int16_t +xradius, int16_t yradius, int16_t begang, int16_t endang ); +
  +
Beschreibung: Die Funktion zeichnet einen Ausschnitt einer Ellipsenfläche, +wie er auch für Tortengrafiken benutzt wird. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
x x-Koordinate +
y y-Koordinate für den Mittelpunkt +
xradius Radius in x-Richtung +
yradius Radius in y-Richtung +
begang Startwinkel +
endang Endwinkel + +
+ +
Hinweis: Die Fülltyp-Attribute und der Schreibmodus +werden berücksichtigt; das Pixelgrößenverhältnis wird ignoriert. +Der Winkel wird in 1/10 Grad und entgegen dem Uhrzeigersinn angegeben: +
  +
             900
+            |
+            |
+            |
+   ---------+---------
+1800        |        0
+            |
+            |
+             2700
+
+
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all drivers. This function composes one of the 10 +VDI GDP's (Generalized Drawing Primitives). Although all current +drivers support all GDP's, their availability is not guaranteed and +may vary. To check for a particular GDP refer to the table returned by +v_opnvwk or v_opnwk. +
  +
Gruppe: Ausgabefunktionen +
  +
Querverweis: Binding   vswr_mode   vs_color   vsf_interior   vsf_style   +vsf_color   vsf_udpat   vsf_perimeter +
  + +
+ +

7.5.22 Bindings für v_ellpie

+ + + + + + + + + +
C: void v_ellpie ( int16_t handle, int16_t x, int16_t y, int16_t +xradius, int16_t yradius, int16_t begang, int16_t endang ); +
  +
Umsetzung: +
  +
void v_ellpie (int16_t handle, int16_t x, int16_t y,
+               int16_t xradius, int16_t yradius,
+               int16_t begang, int16_t endang)
+{
+   ptsin[0]  = x;
+   ptsin[1]  = y;
+   ptsin[2]  = xradius;
+   ptsin[3]  = yradius;
+
+   intin[0] = begang;
+   intin[1] = endang;
+
+   contrl[0] = 11;
+   contrl[1] = 2;
+   contrl[3] = 2;
+   contrl[5] = 7;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]11 Opcode der Funktion
contrl+2contrl[1]2 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]2 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]7 GDP-Nummer
contrl+12contrl[6]handle
intinintin[0]begang
intin+2intin[1]endang
ptsinptsin[0]x
ptsin+2ptsin[1]y
ptsin+4ptsin[2]xradius
ptsin+6ptsin[3]yradius
+
+ + +
+ +

7.5.23 v_etext

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »?« - Text grafisch ausgaben +
  +
VDI-Nummer: 11 (GDP 11) +
  +
Deklaration: void v_etext( int16_t handle, int16_t x, int16_t y, const char +*string, int16_t *offsets); +
  +
Beschreibung: This function writes each character of a text string relative +to the specified starting position. It is typically used to override +the driver's default method of justification. This function applies to +printers and plotters only. +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
count Anzahl der Punkte +
x x-coordinate of starting position +
y y-coordinate of starting position +
string Address of null-terminated text string +
offsets Address of int16_t array of position offsets +
Each offset is an x,y pair of signed integers that +indicate the position of the next character in the string relative to +the starting position. The first offset pair affects the position of +the first character in the string. Some driver ignore the y +component of each pair, in which case y is assumed to equal +zero. + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: GEM/3 Release 3.1 +
  +
Gruppe: Ausgabefunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.5.24 Bindings für v_etext

+ + + + + + + + + +
C: void v_etext( int16_t handle, int16_t x, int16_t y, int16_t +*string, int16_t *offsets); +
  +
Umsetzung: +
  +
void v_etext( int16_t handle, int16_t x, int16_t y,
+              int16_t *string, int16_t *offsets)
+{
+   ptsin[0]  = x;
+   ptsin[1]  = y;
+   ptsin[2]  = offsets[0];
+   ptsin[3]  = offsets[2];
+   .
+   .
+   ptsin[2n+1]  = offsets[2n-1];
+
+   i = 0;
+   while (intin[i++] = *string++)
+      ;
+
+   contrl[0] = 11;
+   contrl[1] = length og string + 1 ;
+   contrl[3] = length of string;
+   contrl[4] = 11;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]11 # Opcode der Funktion
contrl+2contrl[1]n + 1 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]n # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]11
contrl+12contrl[6]handle
intinintin[0..n-1]string[0..n-1]
ptsinptsin[0]x
ptsin+2ptsin[1]y
ptsin+4ptsin[2..2n+1]offsets[0..2n-1]
+
+ + +
+ +

7.5.25 v_fillarea

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Filled Area« - füllt eine Fläche. +
  +
VDI-Nummer: 9 +
  +
Deklaration: void v_fillarea ( int16_t handle, int16_t count, int16_t +*pxyarray ); +
  +
Beschreibung: Die Funktion füllt eine Fläche aus, die von einem Polygonzug +umgeben ist. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
count Anzahl der Punkte +
pxyarray[0] x-Koordinate +
pxyarray[1] y-Koordinate des ersten Punktes +
...   +
...   +
pxyarray[2*count-2] x-Koordinate +
pxyarray[2*count-1] y-Koordinate des letzten Punktes + +
+ +
Hinweis: Sollte das Ausgabegerät keine Möglichkeit zum +Ausfüllen bieten, wird die Fläche nur mit der aktuellen Füllfarbe +umgeben. Es müssen mindestens drei Koordinatenpaare +übergeben werden. Offene Polygonzüge werden von der Funktion +automatisch geschlossen. Ein einzelnes Koordinatenpaar wird nur dann +als Punkt gezeichnet, wenn die automatische Umrandung der Füllfläche +per vsf_perimeter eingeschaltet worden ist. +
  +
Die aktuellen Fülltyp-Attribute werden beachtet. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all drivers. +
  +
Gruppe: Ausgabefunktionen +
  +
Querverweis: Binding   vswr_mode   vs_color   vsf_interior   vsf_style   +vsf_color   vsf_udpat   vsf_perimeter +
  + +
+ +

7.5.26 Bindings für v_fillarea

+ + + + + + + + + +
C: void v_fillarea ( int16_t handle, int16_t count, int16_t +*pxyarray ); +
  +
Umsetzung: +
  +
void v_fillarea (int16_t handle, int16_t count,
+                 int16_t *pxyarray)
+{
+   ptsin[0..2*count-1]  = pxyarray[0..2*count-1];
+   contrl[0] = 9;
+   contrl[1] = count;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]9 # Opcode der Funktion
contrl+2contrl[1]n # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
ptsinptsin[0..2n-1]pxyarray[0..2n-1]
+
+ +
Hinweis: Dabei gilt n = count. +
  + +
+ +

7.5.27 v_ftext

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Output Outlined Text« - gibt einen Text per Vektorfont aus. +
  +
VDI-Nummer: 241 +
  +
Deklaration: void v_ftext ( int16_t handle, int16_t x, int16_t y, int8_t +*string ); +
  +
Beschreibung: Die Funktion gibt einen Text auf einer Workstation aus. Es +gilt: +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
x x-Koordinate +
y y-Koordinate des Textes +
string Adresse der Zeichenkette + +
+ +
Hinweis: Die Funktion beachtet im Gegensatz zu v_gtext +auch die eingestellten Kerning-Attribute, und rechnet intern mit einer +Genauigkeit von 1/65536 Pixeln, wodurch eine bessere Positionierung +der Zeichen gewährleistet ist. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: FSMGDOS, ab SpeedoGDOS 4.00 und ab NVDI 3.00 +
  +
Gruppe: Ausgabefunktionen +
  +
Querverweis: Binding   v_gtext   v_ftext_offset   SpeedoGDOS   NVDI   fix31 +
  + +
+ +

7.5.28 Bindings für v_ftext

+ + + + + + + + + +
C: void v_ftext ( int16_t handle, int16_t x, int16_t y, int8_t +*string ); +
  +
Umsetzung: +
  +
void v_ftext (int16_t handle, int16_t x, int16_t y,
+              int8_t *string)
+{
+   int16_t i;
+
+   ptsin[0]  = x;
+   ptsin[1]  = y;
+
+   i = 0;
+   while (intin[i++] = *string++)
+      ;
+
+   contrl[0] = 241;
+   contrl[1] = 1;
+   contrl[3] = strlen(string);
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]241 # Opcode der Funktion
contrl+2contrl[1]1 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]n # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0..n-1]string[0..n-1]
ptsinptsin[0]x
ptsin+2ptsin[1]y
+
+ +
Hinweis: Dabei gilt n = strlen (string); +
  + +
+ +

7.5.29 v_ftext_offset

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Output Outlined Text with Offsets« - gibt einen Text aus. +
  +
VDI-Nummer: 241 +
  +
Deklaration: void v_ftext_offset ( int16_t handle, int16_t x, int16_t y, +int8_t *string, int16_t *offset ); +
  +
Beschreibung: Die Funktion gibt eine Zeichenkette auf einer Workstation aus. +Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
x x-Koordinate +
y y-Koordinate für die Textausgabe +
string Adresse der Zeichenkette +
offset[0] x-Offset +
offset[1] y-Offset des ersten Zeichens +
...   +
...   +
offset[2n-2] x-Offset des letzten Zeichens +
offset[2n-1] y-Offset des letzten Zeichens + +
+ +
Der Parameter offset erlaubt es, eigene Offsets anstelle +der vom System berechneten Zeichen-Werte zu benutzen; dies ermöglicht +eine wesentlich größere Kontrolle für das Setzen der Zeichen auf +dem Ausgabegerät. +
  +
Hinweis: Die Text-Attribute sowie die Einstellungen des +Kernings werden beachtet. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Verfügbar: ab SpeedoGDOS 4.00 und NVDI 3.00 +
  +
Gruppe: Ausgabefunktionen +
  +
Querverweis: Binding   v_gtext   v_ftext   SpeedoGDOS   NVDI +
  + +
+ +

7.5.30 Bindings für v_ftext_offset

+ + + + + + + + + +
C: void v_ftext_offset ( int16_t handle, int16_t x, int16_t y, +int8_t *string, int16_t *offset ); +
  +
Umsetzung: +
  +
void v_ftext_offset (int16_t handle, int16_t x, int16_t y,
+                     int8_t *string, int16_t *offset)
+{
+   ptsin[0]  = x;
+   ptsin[1]  = y;
+   ptsin[2]  = offset[0];
+   ptsin[3]  = offset[1];
+   ptsin[4..2*n+1] = offset[2..(2*n)-1]
+
+   intin[0..n-1] = string[0..n-1];
+
+   contrl[0] = 241;
+   contrl[1] = 1+n;
+   contrl[3] = n;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]241 # Opcode der Funktion
contrl+2contrl[1]1+n # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]n # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0..n-1]string[0..n-1]
ptsinptsin[0]x
ptsin+2ptsin[1]y
ptsin+4ptsin[2]offset[0] # x-Offset erstes Zeichen
ptsin+6ptsin[3]offset[1] # y-Offset erstes Zeichen
ptsin+8ptsin[4..2n+1]offset[2..2n-1] # dto. für Rest
+
+ +
Hinweis: Dabei gilt n = strlen(string); +
  + +
+ +

7.5.31 v_gtext

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Graphic Text« - gibt einen Text aus. +
  +
VDI-Nummer: 8 +
  +
Deklaration: void v_gtext ( int16_t handle, int16_t x, int16_t y, int8_t +*string ); +
  +
Beschreibung: Die Funktion gibt einen Text auf einer Workstation aus. Es +gilt: +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
x x-Koordinate +
y y-Koordinate des Textes +
string Adresse der Zeichenkette + +
+ +
Hinweis: Die Geschwindigkeit der Ausgabe läßt sich +beschleunigen, wenn folgende Punkte beachtet werden: +
  +
    +
  • auf Bytegrenzen justiert ausgeben. +
  • +
  • möglichst kein Clipping benutzen. +
  • +
  • bei nichtproportionalen, acht Pixel breiten Zeichensätzen im +Replace-Modus und ohne Clipping, sonst im Transparent-Modus ausgeben. +
  • +
+ +
Die Text-Attribute und der Schreibmodus werden beachtet. Ist ein +Vektorfont eingestellt, so wird weder Pair- noch Track-Kerning +beachtet; daher sollte ggfs. besser auf die v_ftext-Funktion +zurückgegriffen werden. Die Zeichenpositionierung erfolgt außerdem +pixelweise, d.h. vqt_width() liefert hierfür die passenden +Schrittgrößen. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all drivers. +
  +
Gruppe: Ausgabefunktionen +
  +
Querverweis: Binding   vswr_mode   vs_color   vst_alignment   vst_height   +vst_point   vst_rotation   vst_font   vst_color   vst_effects   +v_ftext +
  + +
+ +

7.5.32 Bindings für v_gtext

+ + + + + + + + + +
C: void v_gtext ( int16_t handle, int16_t x, int16_t y, int8_t +*string ); +
  +
Umsetzung: +
  +
void v_gtext (int16_t handle, int16_t x, int16_t y,
+              int8_t *string)
+{
+   int16_t i;
+
+   ptsin[0]  = x;
+   ptsin[1]  = y;
+
+   i = 0;
+   while (intin[i++] = *string++)
+      ;
+
+   contrl[0] = 8;
+   contrl[1] = 1;
+   contrl[3] = -i;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]8 # Opcode der Funktion
contrl+2contrl[1]1 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]n # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
intinintin[0..n-1]string[0..n-1]
ptsinptsin[0]x
ptsin+2ptsin[1]y
+
+ + +
+ +

7.5.33 v_justified

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Justified Graphics Text« - Positionierter Graphiktext. +
  +
VDI-Nummer: 11 (GDP 10) +
  +
Deklaration: void v_justified ( int16_t handle, int16_t x, int16_t y, int8_t +*string, int16_t length, int16_t word_space, int16_t char_space, +[int16_t *char_width] ); +
  +
Beschreibung: Die Funktion gibt einen String auf einer Workstation aus. Es +gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
x x-Koordinate +
y y-Koordinate des Punktes für die Textausrichtung +
string Adresse der Zeichenkette +
length Länge des Textes bzgl. der x-Achse +
word_space Wortzwischenräume + + + + + + +
  0 = keine Dehnung der Zwischenräume +
<>0 = Dehnung der Zwischenräume + +
+ +
char_space Zeichenzwischenräume + + + + + + +
  0 = keine Dehnung der Zwischenräume +
<>0 = Dehnung der Zwischenräume + +
+ + +
+ +
Der Text wird links und rechts bezogen auf den Startpunkt und +die Länge justiert. Um den Text auf die erforderliche Länge zu +bringen, hat man die Wahl zwischen Dehnung der Wort- und/oder +Zeichenzwischenräume. +
  +
Hinweis: Die Text-Attribute und der Schreibmodus werden +berücksichtigt. Im Zeichensatz fehlende Zeichen werden durch ein +Ersatzsymbol (z.B. das Fragezeichen) ersetzt. +
  +
Bei Vektorfonts bezieht sich die Längenangabe auf die Summation +der Zeichenbreiten - Überhänge nach links und rechts werden nicht +berücksichtigt. +
  +
Ab GEM/3 wurde die Funktion erheblich verändert. Der Parameter +char_width wurde neu aufgenommen. Er gibt die Anzahl der Pixel +jedes Buchstabens der ausgegebenen Zeichenkette zurück. Dabei habe +sich auch die Parameter word_space und char_space wie +folgt geändert: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
word_space Wortzwischenräume + + + + + + + + + + + + +
0x0000 = keine Dehnung der Zwischenräume, keine Ausgabeinformationen +
0x0001 = Dehnung der Zwischenräume, keine Ausgabeinformationen +
0x8000 = keine Dehnung der Zwischenräume, Ausgabeinformationen +(char_space) werden zurückgegeben +
0x8001 = Dehnung der Zwischenräume, Ausgabeinformationen +(char_space) werden zurückgegeben + +
+ +
char_space Zeichenzwischenräume + + + + + + +
0x0000 = keine Dehnung der Zwischenräume +
0x0001 = Dehnung der Zwischenräume + +
+ + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all drivers. This function composes one of the 10 +VDI GDP's (Generalized Drawing Primitives). Although all current +drivers support all GDP's, their availability is not guaranteed and +may vary. To check for a particular GDP refer to the table returned by +v_opnvwk or v_opnwk. +
  +
Gruppe: Ausgabefunktionen +
  +
Querverweis: Binding   vswr_mode   vs_color   vst_alignment   vst_height   +vst_point   vst_rotation   vst_font   vst_color   vst_effects +
  + +
+ +

7.5.34 Bindings für v_justified

+ + + + + + + + + +
C: void v_justified ( int16_t handle, int16_t x, int16_t y, int8_t +*string, int16_t length, int16_t word_space, int16_t char_space, +[int16_t *char_width] ); +
  +
Umsetzung: +
  +
void v_justified (int16_t handle, int16_t x, int16_t y,
+                  int8_t *string, int16_t length,
+                  int16_t word_space, int16_t char_space,
+                  [int16_t *char_width] )
+{
+   int16_t *tmp;
+
+   ptsin[0]  = x;
+   ptsin[1]  = y;
+   ptsin[2]  = length;
+   ptsin[3]  = 0;
+
+   intin[0] = word_space;
+   intin[1] = char_space;
+
+   tmp = &(intin[2]);
+   while (*tmp++ = *string++)
+      ;
+
+   contrl[0] = 11;
+   contrl[1] = 2;
+   contrl[3] = (int16_t) (tmp-&(intin))-1;
+
+   contrl[4] = 0;  /* if word_space equals 0x0000 or 0x0001 */
+   contrl[4] = n;  /* if word_space equals 0x8000 or 0x8001 */
+
+   contrl[5] = 10;
+   contrl[6] = handle;
+
+   vdi ();
+
+   /* if word_space equals 0x8000 or 0x8001 */
+   char_with[0..n-1] = intout[0..n-1];
+
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]11 # Opcode der Funktion
contrl+2contrl[1]2 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]n+2 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout;
          if word_space 0x0000 or 0x0001
contrl+8contrl[4]n # Einträge in intout;
          if word_space 0x8000 or 0x8001
contrl+10contrl[5]10 GDP-Nummer
contrl+12contrl[6]handle
intinintin[0]word_space
intin+2intin[1]char_space
intin+4intin[2..n+1]string[0..n-1]
ptsinptsin[0]x
ptsin+2ptsin[1]y
ptsin+4ptsin[2]length
ptsin+6ptsin[3]0
intoutintout[0..n-1]char_with[0..n-1]
          if word_space 0x8000 or 0x8001
+
+ + +
+ +

7.5.35 v_pieslice

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pie-Slice« - zeichnet ein "Tortenstück". +
  +
VDI-Nummer: 11 (GDP 3) +
  +
Deklaration: void v_pieslice ( int16_t handle, int16_t x, int16_t y, int16_t +radius, int16_t begang, int16_t endang ); +
  +
Beschreibung: Die Funktion zeichnet einen Ausschnitt einer Kreisfläche, wie +er z.B. in Tortengrafiken benutzt wird. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
x x-Koordinate +
y y-Koordinate für den Mittelpunkt +
radius Radius bzgl. der x-Achse +
begang Startwinkel +
endang Endwinkel + +
+ +
Hinweis: Die Fülltyp-Attribute, der Schreibmodus sowie +das Pixelgrößenverhältnis werden beachtet. Der Winkel wird in 1/10 +Grad und entgegen dem Uhrzeigersinn angegeben: +
  +
             900
+            |
+            |
+            |
+   ---------+---------
+1800        |        0
+            |
+            |
+             2700
+
+
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all drivers. This function composes one of the 10 +VDI GDP's (Generalized Drawing Primitives). Although all current +drivers support all GDP's, their availability is not guaranteed and +may vary. To check for a particular GDP refer to the table returned by +v_opnvwk or v_opnwk. +
  +
Gruppe: Ausgabefunktionen +
  +
Querverweis: Binding   vswr_mode   vs_color   vsf_interior   vsf_style   +vsf_color   vsf_udpat   vsf_perimeter +
  + +
+ +

7.5.36 Bindings für v_pieslice

+ + + + + + + + + +
C: void v_pieslice ( int16_t handle, int16_t x, int16_t y, int16_t +radius, int16_t begang, int16_t endang ); +
  +
Umsetzung: +
  +
void v_pieslice (int16_t handle, int16_t x, int16_t y,
+                 int16_t radius, int16_t begang,
+                 int16_t endang)
+{
+   ptsin[0] = x;
+   ptsin[1] = y;
+   ptsin[2] = ptsin[3] = ptsin[4] = ptsin[5] = 0;
+   ptsin[6] = radius;
+   ptsin[7] = 0;
+
+   intin[0] = begang;
+   intin[1] = endang;
+
+   contrl[0] = 11;
+   contrl[1] = 4;
+   contrl[3] = 2;
+   contrl[5] = 3;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]11 # Opcode der Funktion
contrl+2contrl[1]4 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]2 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]3 GDP-Nummer
contrl+12contrl[6]handle
intinintin[0]begang
intin+2intin[1]endang
ptsinptsin[0]x
ptsin+2ptsin[1]y
ptsin+4ptsin[2..5]0
ptsin+12ptsin[6]radius
ptsin+14ptsin[7]0
+
+ + +
+ +

7.5.37 v_pline

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Polyline« - Linienzug zeichnen +
  +
VDI-Nummer: 6 +
  +
Deklaration: void v_pline ( int16_t handle, int16_t count, int16_t *pxyarray +); +
  +
Beschreibung: Die Funktion zeichnet einen Polygonzug. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
count Anzahl der Punkte +
pxyarray[0] x-Koordinate +
pxyarray[1] y-Koordinate des ersten Punktes +
...   +
...   +
pxyarray[2*count-2] x-Koordinate +
pxyarray[2*count-1] y-Koordinate des letzten Punktes + +
+ +
Die Linienattribute und die Einstellung des Schreibmodus werden +beim Zeichnen beachtet. +
  +
Hinweis: Der Startpunkt wird durch das erste +Koordinatenpaar bestimmt. Danach werden alle Punkte durch eine Linie +verbunden. Einzelne Punkte können durch ein einzelnes Koordinatenpaar +nicht gezeichnet werden, jedoch durch eine Linie der Länge +Null, d.h. zwei gleiche Koordinatenpaare. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all drivers. +
  +
Gruppe: Ausgabefunktionen +
  +
Querverweis: Binding   vs_color   vswr_mode   vsl_type   vsl_width   +vsl_color   vsl_ends   vsl_udsty +
  + +
+ +

7.5.38 Bindings für v_pline

+ + + + + + + + + +
C: void v_pline ( int16_t handle, int16_t count, int16_t *pxyarray +); +
  +
Umsetzung: +
  +
void v_pline (int16_t handle, int16_t count, int16_t *pxyarray)
+{
+   ptsin[0..2*count-1] = pxyarray[0..2*count-1];
+
+   contrl[0] = 6;
+   contrl[1] = count;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]6 # Opcode der Funktion
contrl+2contrl[1]count # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
ptsinptsin[0..2n-1]pxyarray[0..2n-1]
+
+ +
Hinweis: Dabei gilt n = count. +
  + +
+ +

7.5.39 v_pmarker

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Polymarker« - zeichnet Marker. +
  +
VDI-Nummer: 7 +
  +
Deklaration: void v_pmarker ( int16_t handle, int16_t count, int16_t +*pxyarray ); +
  +
Beschreibung: Die Funktion zeichnet Marker an bestimmten Positionen. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
count Anzahl der Marker +
pxyarray[0] x-Koordinate +
pxyarray[1] y-Koordinate des ersten Markers +
...   +
...   +
pxyarray[2*count-2] x-Koordinate +
pxyarray[2*count-1] y-Koordinate des letzten Markers + +
+ +
Hinweis: Die Marker-Attribute und der eingestellte +Schreibmodus werden beachtet. Angewendet werden die Marker z.B. vom +Programm XACT bei der grafischen Darstellung von Statistiken. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all drivers. +
  +
Gruppe: Ausgabefunktionen +
  +
Querverweis: Binding   vs_color   vswr_mode   vsm_type   vsm_height   +vsm_color   pxyarray +
  + +
+ +

7.5.40 Bindings für v_pmarker

+ + + + + + + + + +
C: void v_pmarker ( int16_t handle, int16_t count, int16_t +*pxyarray ); +
  +
Umsetzung: +
  +
void v_pmarker (int16_t handle, int16_t count,
+                int16_t *pxyarray)
+{
+   ptsin[0..2*count-1] = pxyarray[0..2*count-1];
+
+   contrl[0] = 7;
+   contrl[1] = count;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]7 # Opcode der Funktion
contrl+2contrl[1]count # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
ptsinptsin[0..2n-1]pxyarray[0..2n-1]
+
+ +
Hinweis: Dabei gilt n = count. +
  + +
+ +

7.5.41 v_rbox

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Rounded Rectangle« - zeichnet ein Rechteck mit abgerundeten +Ecken +
  +
VDI-Nummer: 11 (GDP 8) +
  +
Deklaration: void v_rbox ( int16_t handle, int16_t *pxyarray ); +
  +
Beschreibung: Die Funktion zeichnet ein Rechteck mit abgerundeten Ecken. Es +gilt: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
pxyarray[0] x-Koordinate +
pxyarray[1] y-Koordinate des Eckpunktes +
pxyarray[2] x-Koordinate +
pxyarray[3] y-Koordinate der diagonal gegenüber liegenden Ecke + +
+ +
Hinweis: Die Linien-Attribute, der Schreibmodus sowie +das Pixelgrößenverhältnis werden berücksichtigt. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all drivers. This function composes one of the 10 +VDI GDP's (Generalized Drawing Primitives). Although all current +drivers support all GDP's, their availability is not guaranteed and +may vary. To check for a particular GDP refer to the table returned by +v_opnvwk or v_opnwk. +
  +
Gruppe: Ausgabefunktionen +
  +
Querverweis: Binding   vs_color   vswr_mode   vsl_type   vsl_width   +vsl_color   vsl_ends   vsl_udsty +
  + +
+ +

7.5.42 Bindings für v_rbox

+ + + + + + + + + +
C: void v_rbox ( int16_t handle, int16_t *pxyarray ); +
  +
Umsetzung: +
  +
void v_rbox (int16_t handle, int16_t *pxyarray)
+{
+   ptsin[0..3] = pxyarray[0..3];
+
+   contrl[0] = 11;
+   contrl[1] = 2;
+   contrl[3] = 0;
+   contrl[5] = 8;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]11 # Opcode der Funktion
contrl+2contrl[1]2 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]8 GDP-Nummer
contrl+12contrl[6]handle
ptsinptsin[0..3]pxyarray[0..3]
+
+ + +
+ +

7.5.43 v_rfbox

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Filled rounded Rectangle« - zeichnet eine Rechtecksfläche +mit gerundeten Ecken. +
  +
VDI-Nummer: 11 (GDP 9) +
  +
Deklaration: void v_rfbox ( int16_t handle, int16_t *pxyarray ); +
  +
Beschreibung: Die Funktion zeichnet ein ausgefülltes Rechteck mit +abgerundeten Ecken. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
pxyarray[0] x-Koordinate +
pxyarray[1] y-Koordinate des Eckpunktes +
pxyarray[2] x-Koordinate +
pxyarray[3] y-Koordinate der diagonal gegenüber liegenden Ecke + +
+ +
Hinweis: Die Fülltyp-Attribute, der Schreibmodus sowie +das Pixelgrößenverhältnis werden berücksichtigt. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all drivers. This function composes one of the 10 +VDI GDP's (Generalized Drawing Primitives). Although all current +drivers support all GDP's, their availability is not guaranteed and +may vary. To check for a particular GDP refer to the table returned by +v_opnvwk or v_opnwk. +
  +
Gruppe: Ausgabefunktionen +
  +
Querverweis: Binding   vswr_mode   vs_color   vsf_interior   vsf_style   +vsf_color   vsf_udpat   vsf_perimeter   v_rbox +
  + +
+ +

7.5.44 Bindings für v_rfbox

+ + + + + + + + + +
C: void v_rfbox ( int16_t handle, int16_t *pxyarray ); +
  +
Umsetzung: +
  +
void v_rfbox (int16_t handle, int16_t *pxyarray)
+{
+   ptsin[0..3] = pxyarray[0..3];
+
+   contrl[0] = 11;
+   contrl[1] = 2;
+   contrl[3] = 0;
+   contrl[5] = 9;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]11 # Opcode der Funktion
contrl+2contrl[1]2 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]9 GDP-Nummer
contrl+12contrl[6]handle
ptsinptsin[0..3]pxyarray[0..3]
+
+ + +
+ +
+ +Home +VDIVDI +AttributfunktionenAttributfunktionen +AuskunftsfunktionenAuskunftsfunktionen + + diff --git a/de/vdi_raster.html b/de/vdi_raster.html new file mode 100644 index 000000000..3900f4076 --- /dev/null +++ b/de/vdi_raster.html @@ -0,0 +1,3884 @@ + + + + + +Die Anleitung zum TOS: Rasterfunktionen + + + + + + + + + +Home +VDIVDI +KontrollfunktionenKontrollfunktionen +TC-VDI-FunktionenTC-VDI-Funktionen + +
+ +

7.11 Rasterfunktionen

+

Diese Bibliothek enthält Funktionen, um rechteckige Blöcke von +Bits im Speicher zu manipulieren. Für diesen Zweck stehen die +folgenden Routinen zur Verfügung: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
v_get_pixel Pixelstatus ermitteln (gesetzt oder gelöscht). +
vq_hilite_color Hervorhebungsfarbe ermitteln. +
vq_max_color maximalen Farbwert für eine additive Rasteroperation +ermitteln. +
vq_min_color minimalen Farbwert für eine subtraktive Rasteroperation +ermitteln. +
vq_weight_color Gewichtung für die Blend-Funktion ermitteln. +
vr_clip_rects_by_dst Zielrechteck mit einem Clipping-Rechteck schneiden. +
vr_clip_rects_by_src Quellrechteck mit einem Clipping-Rechteck schneiden. +
vr_clip_rects32_by_dst Zielrechteck mit einem Clipping-Rechteck schneiden. +
vr_clip_rects32_by_src Quellrechteck mit einem Clipping-Rechteck schneiden. +
vr_transfer_bits Verknüpft zweier Bitmaps +
vr_trnfm Raster in gerätespezifische Formate transformieren. +
vro_cpyfm Bildschirmbereich pixelweise kopieren (opaque). +
vrt_cpyfm Bildschirmbereich pixelweise kopieren (transparent). +
vs_hilite_color Hervorhebungsfarbe setzen. +
vs_max_color maximalen Farbwert für eine additive Rasteroperation setzen. +
vs_min_color minimalen Farbwert für eine subtraktive Rasteroperation +setzen. +
vs_weight_color Gewichtung für die Blend-Funktion setzen. + +
+ +

Hinweis: Mit diesen Funktionen ist es insbesondere +möglich, einen Bildschirmbereich in einen anderen zu kopieren oder zu +verschieben; auf diese Weise läßt sich z.B. ein sauberes Scrolling +in GEM-Programmen realisieren. +

+

Querverweis: Rasterformate   Off-Screen-Bitmaps   Workstations +des VDI +

+

7.11.1 v_get_pixel

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Get Pixel« - liefert den Farbwert eines Pixels. +
  +
VDI-Nummer: 105 +
  +
Deklaration: void v_get_pixel ( int16_t handle, int16_t x, int16_t y, +int16_t *pel, int16_t *index ); +
  +
Beschreibung: Die Funktion ermittelt den Pixelwert und den Farbindex eines +Pixels bei Auflösungen bis zu 256 Farben (8 Planes). Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
x x-Koordinate +
y y-Koordinate des Pixels +
pel Wert des Pixels +
index Farbindex des Pixels + +
+ +
Hinweis: Unter dem Farbindex versteht man die Nummer, +die man bei den Attributfunktionen des VDI angeben kann. Der Pixelwert +gibt hingegen den tatsächlichen Inhalt des Bildspeichers wieder. +
  +
Bei HiColor (15- oder 16-Bit) enthält pel den Pixelwert +und index ist (meistens) -1, da er nicht einwandfrei +zuzuordnen ist. Bei TrueColor enthält pel das Low-Word des +Pixelwerts und index das High-Word. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all screen drivers. +
  +
Gruppe: Rasterfunktionen +
  +
Querverweis: Binding   Rasterformate +
  + +
+ +

7.11.2 Bindings für v_get_pixel

+ + + + + + + + + +
C: void v_get_pixel ( int16_t handle, int16_t x, int16_t y, +int16_t *pel, int16_t *index ); +
  +
Umsetzung: +
  +
void v_get_pixel (int16_t handle, int16_t x, int16_t y,
+                  int16_t *pel, int16_t *index)
+{
+   ptsin[0]  = x;
+   ptsin[1]  = y;
+   contrl[0] = 105;
+   contrl[1] = 1;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *pel   = intout[0];
+   *index = intout[1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]105 # Opcode der Funktion
contrl+2contrl[1]1 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]2 # Einträge in intout
contrl+12contrl[6]handle
ptsinptsin[0]x
ptsin+2ptsin[1]y
intoutintout[0]pel
intout+2intout[1]index
+
+ + +
+ +

7.11.3 vq_hilite_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Hilite Color« - Hervorhebungsfarbe ermitteln. +
  +
VDI-Nummer: 209 (Unterfunktion 0) +
  +
Deklaration: int32_t vq_hilite_color( int16_t handle, COLOR_ENTRY +*hilite_color ); +
  +
Beschreibung: Diese Funktion erfragt die Hervorhebungsfarbe. +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
hilite_color COLOR_ENTRY der Hervorhebungsfarbe. + +
+ +
Ergebnis: eingestellter Farbraum +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Rasterfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.11.4 Bindings für vq_hilite_color

+ + + + + + + + + +
C: int32_t vq_hilite_color( int16_t handle, COLOR_ENTRY +*hilite_color ); +
  +
Umsetzung: +
  +
int32_t vq_hilite_color( int16_t handle,
+                         COLOR_ENTRY *hilite_color )
+{
+   contrl[0] = 209;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   hilite_color = intout[2..5];
+
+   return ( intout[0..1] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]209 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]6 # Einträge in intout
contrl+10contrl[5]0 # Sub-Opcode
contrl+12contrl[6]handle
intoutintout[0..1]Rückgabewert
intout+4intout[2..5]hilite_color
+
+ + +
+ +

7.11.5 vq_max_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Maximum Color« - +
  +
VDI-Nummer: 209 (Unterfunktion 2) +
  +
Deklaration: int32_t vq_max_color( int16_t handle, COLOR_ENTRY *max_color ); +
  +
Beschreibung: Diese Funktion erfragt den maximalen Farbwert für eine +additive Rasteroperation. +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
max_color COLOR_ENTRY des maximalen Farbwerts für T_ADD. + +
+ +
Ergebnis: eingestellter Farbraum +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Rasterfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.11.6 Bindings für vq_max_color

+ + + + + + + + + +
C: int32_t vq_max_color( int16_t handle, COLOR_ENTRY *max_color ); +
  +
Umsetzung: +
  +
int32_t vq_max_color( int16_t handle, COLOR_ENTRY *max_color )
+{
+   contrl[0] = 209;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   max_color = intout[2..5];
+   return ( intout[0..1] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]209 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]6 # Einträge in intout
contrl+10contrl[5]2 # Sub-Opcode
contrl+12contrl[6]handle
intoutintout[0..1]Rückgabewert
intout+4intout[2..5]max_color
+
+ + +
+ +

7.11.7 vq_min_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Minimum Color« - +
  +
VDI-Nummer: 209 (Unterfunktion 1) +
  +
Deklaration: int32_t vq_min_color( int16_t handle, COLOR_ENTRY *min_color ); +
  +
Beschreibung: Diese Funktion erfragt den minimalen Farbwert für die +Subtraktionsfunktion (T_SUB). +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
min_color COLOR_ENTRY des minimalen Farbwerts für T_SUB. + +
+ +
Ergebnis: eingestellter Farbraum +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Rasterfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.11.8 Bindings für vq_min_color

+ + + + + + + + + +
C: int32_t vq_min_color( int16_t handle, COLOR_ENTRY *min_color ); +
  +
Umsetzung: +
  +
int32_t vq_min_color( int16_t handle, COLOR_ENTRY *min_color )
+{
+   contrl[0] = 209;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   min_color = intout[2..5];
+   return ( intout[0..1] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]209 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]6 # Einträge in intout
contrl+10contrl[5]1 # Sub-Opcode
contrl+12contrl[6]handle
intoutintout[0..1]Rückgabewert
intout+4intout[2..5]min_color
+
+ + +
+ +

7.11.9 vq_weight_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Weight Color« - +
  +
VDI-Nummer: 209 (Unterfunktion 3) +
  +
Deklaration: int32_t vq_weight_color( int16_t handle, COLOR_ENTRY +*weight_color ); +
  +
Beschreibung: Diese Funktion erfragt die Gewichtung für die Blendfunktion +(T_BLEND). +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
weight_color COLOR_ENTRY der Gewichtung für T_BLEND + +
+ +
Ergebnis: eingestellter Farbraum +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Rasterfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.11.10 Bindings für vq_weight_color

+ + + + + + + + + +
C: int32_t vq_weight_color( int16_t handle, COLOR_ENTRY +*weight_color ); +
  +
Umsetzung: +
  +
int32_t vq_weight_color( int16_t handle,
+                         COLOR_ENTRY *weight_color )
+{
+   contrl[0] = 209;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 3;
+   contrl[6] = handle;
+
+   vdi ();
+
+   weight_color = intout[2..5];
+   return ( intout[0..1] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]209 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]6 # Einträge in intout
contrl+10contrl[5]3 # Sub-Opcode
contrl+12contrl[6]handle
intoutintout[0..1]Rückgabewert
intout+4intout[2..5]weight_color
+
+ + +
+ +

7.11.11 vr_clip_rects32_by_dst

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Clip Rects By Destination Rectangle« +
  +
VDI-Nummer: 171 (Unterfunktion 2) +
  +
Deklaration: int16_t vr_clip_rects32_by_dst ( int16_t handle, RECT32 +*dst_clip_rect, RECT32 *src_rect, RECT16 *dst_rect, RECT32 +*clipped_src_rect, RECT32 *clipped_dst_rect ); +
  +
Beschreibung: Zielrechteck mit einem Clipping-Rechteck schneiden und das +Quellrechteck anpassen. +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
dst_clip_rect Clipping-Rechteck für das Ziel (kontinuierliche Koordinaten) +
src_rect Quellrechteck (kontinuierliche Koordinaten) +
dst_rect Zielrechteck (kontinuierliche Koordinaten) +
clipped_src_rect geschnittenes Quellrechteck (kontinuierliche Koordinaten) +
clipped_dst_rect geschnittenes Zielrechteck (kontinuierliche Koordinaten) + +
+ +
Ergebnis: 0: kein Schnitt der Rechtecke +
1: alles in Ordnung +
  +
Verfügbar: ab NVDI 5.02 +
  +
Wenn der Treiber die neuen Clipfunktionen anbietet, ist bei den +erweiterten Parametern von vq_extnd in work_out[30] Bit 2 gesetzt. +
  +
Gruppe: Rasterfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.11.12 Bindings für vr_clip_rects32_by_dst

+ + + + + + + + + +
C: int16_t vr_clip_rects32_by_dst ( int16_t handle, RECT32 +*dst_clip_rect, RECT32 *src_rect, RECT16 *dst_rect, RECT32 +*clipped_src_rect, RECT32 *clipped_dst_rect ); +
  +
Umsetzung: +
  +
int16_t vr_clip_rects32_by_dst ( int16_t handle,
+                                 RECT32 *dst_clip_rect,
+                                 RECT32 *src_rect,
+                                 RECT16 *dst_rect,
+                                 RECT32 *clipped_src_rect,
+                                 RECT32 *clipped_dst_rect )
+{
+   ptsin[0..7] = dst_clip_rect;
+   ptsin[8..15] = src_rect;
+   ptsin[16..23] = dst_rect;
+
+   contrl[0] = 171;
+   contrl[1] = 12;
+   contrl[3] = 0;
+   contrl[5] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   clipped_src_rect = ptsout[0..7];
+   clipped_dst_rect = ptsout[8..15];
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]171 # Opcode der Funktion
contrl+2contrl[1]12 # Einträge in ptsin
contrl+4contrl[2]8 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]2 # Sub-Opcode
contrl+12contrl[6]handle
ptsinptsin[0..7]dst_clip_rect
ptsin+16ptsin[8..15]src_rect
ptsin+32ptsin[16..23]dst_rect
ptsoutptsout[0..7]clipped_src_rect
ptsout+16ptsout[8..15]clipped_dst_rect
intoutintout[0]Rückgabewert
+
+ + +
+ +

7.11.13 vr_clip_rects32_by_src

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Clip Rects By Source Rectangle« +
  +
VDI-Nummer: 171 (Unterfunktion 3) +
  +
Deklaration: int16_t vr_clip_rects32_by_src ( int16_t handle, RECT32 +*src_clip_rect, RECT32 *src_rect, RECT16 *dst_rect, RECT32 +*clipped_src_rect, RECT32 *clipped_dst_rect ); +
  +
Beschreibung: Quellrechteck mit einem Clipping-Rechteck schneiden und das +Zielrechteck anpassen (die Funktion berücksichtigt das +Rundungsverhalten von vr_transfer_bits). +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
src_clip_rect Clipping-Rechteck für das Quelle (kontinuierliche Koordinaten) +
src_rect Quellrechteck (kontinuierliche Koordinaten) +
dst_rect Zielrechteck (kontinuierliche Koordinaten) +
clipped_src_rect geschnittenes Quellrechteck (kontinuierliche Koordinaten) +
clipped_dst_rect geschnittenes Zielrechteck (kontinuierliche Koordinaten) + +
+ +
Ergebnis: 0: kein Schnitt der Rechtecke +
1: alles in Ordnung +
  +
Verfügbar: ab NVDI 5.02 +
  +
Wenn der Treiber die neuen Clipfunktionen anbietet, ist bei den +erweiterten Parametern von vq_extnd in work_out[30] Bit 2 gesetzt. +
  +
Gruppe: Rasterfunktionen +
  +
Querverweis: Binding   vr_transfer_bits +
  + +
+ +

7.11.14 Bindings für vr_clip_rects32_by_src

+ + + + + + + + + +
C: int16_t vr_clip_rects32_by_src ( int16_t handle, RECT32 +*src_clip_rect, RECT32 *src_rect, RECT16 *dst_rect, RECT32 +*clipped_src_rect, RECT32 *clipped_dst_rect ); +
  +
Umsetzung: +
  +
int16_t vr_clip_rects32_by_src ( int16_t handle,
+                                 RECT32 *src_clip_rect,
+                                 RECT32 *src_rect,
+                                 RECT16 *dst_rect,
+                                 RECT32 *clipped_src_rect,
+                                 RECT32 *clipped_dst_rect )
+{
+   ptsin[0..7] = src_clip_rect;
+   ptsin[8..15] = src_rect;
+   ptsin[16..23] = dst_rect;
+
+   contrl[0] = 171;
+   contrl[1] = 12;
+   contrl[3] = 0;
+   contrl[5] = 3;
+   contrl[6] = handle;
+
+   vdi ();
+
+   clipped_src_rect = ptsout[0..7];
+   clipped_dst_rect = ptsout[8..15];
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]171 # Opcode der Funktion
contrl+2contrl[1]12 # Einträge in ptsin
contrl+4contrl[2]8 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]3 # Sub-Opcode
contrl+12contrl[6]handle
ptsinptsin[0..7]src_clip_rect
ptsin+16ptsin[8..15]src_rect
ptsin+32ptsin[16..23]dst_rect
ptsoutptsout[0..7]clipped_src_rect
ptsout+16ptsout[8..15]clipped_dst_rect
intoutintout[0]Rückgabewert
+
+ + +
+ +

7.11.15 vr_clip_rects_by_dst

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Clip Rects By Destination Rectangle« +
  +
VDI-Nummer: 171 (Unterfunktion 0) +
  +
Deklaration: int16_t vr_clip_rects_by_dst ( int16_t handle, RECT16 +*dst_clip_rect, RECT16 *src_rect, RECT16 *dst_rect, RECT16 +*clipped_src_rect, RECT16 *clipped_dst_rect ); +
  +
Beschreibung: Zielrechteck mit einem Clipping-Rechteck schneiden und das +Quellrechteck anpassen. +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
dst_clip_rect Clipping-Rechteck für das Ziel (diskrete Koordinaten) +
src_rect Quellrechteck (diskrete Koordinaten) +
dst_rect Zielrechteck (diskrete Koordinaten) +
clipped_src_rect geschnittenes Quellrechteck (diskrete Koordinaten) +
clipped_dst_rect geschnittenes Zielrechteck (diskrete Koordinaten) + +
+ +
Ergebnis: 0: kein Schnitt der Rechtecke +
1: alles in Ordnung +
  +
Verfügbar: ab NVDI 5.02 +
  +
Wenn der Treiber die neuen Clipfunktionen anbietet, ist bei den +erweiterten Parametern von vq_extnd in work_out[30] Bit 2 gesetzt. +
  +
Gruppe: Rasterfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.11.16 Bindings für vr_clip_rects_by_dst

+ + + + + + + + + +
C: int16_t vr_clip_rects_by_dst ( int16_t handle, RECT16 +*dst_clip_rect, RECT16 *src_rect, RECT16 *dst_rect, RECT16 +*clipped_src_rect, RECT16 *clipped_dst_rect ); +
  +
Umsetzung: +
  +
int16_t vr_clip_rects_by_dst ( int16_t handle,
+                               RECT16 *dst_clip_rect,
+                               RECT16 *src_rect,
+                               RECT16 *dst_rect,
+                               RECT16 *clipped_src_rect,
+                               RECT16 *clipped_dst_rect )
+{
+   ptsin[0..3] = dst_clip_rect;
+   ptsin[4..7] = src_rect;
+   ptsin[8..11] = dst_rect;
+
+   contrl[0] = 171;
+   contrl[1] = 6;
+   contrl[3] = 0;
+   contrl[5] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   clipped_src_rect = ptsout[0..3];
+   clipped_dst_rect = ptsout[4..7];
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]171 # Opcode der Funktion
contrl+2contrl[1]6 # Einträge in ptsin
contrl+4contrl[2]4 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]0 # Sub-Opcode
contrl+12contrl[6]handle
ptsinptsin[0..3]dst_clip_rect
ptsin+8ptsin[4..7]src_rect
ptsin+16ptsin[8..11]dst_rect
ptsoutptsout[0..3]clipped_src_rect
ptsout+8ptsout[4..7]clipped_dst_rect
intoutintout[0]Rückgabewert
+
+ + +
+ +

7.11.17 vr_clip_rects_by_src

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Clip Rects By Source Rectangle« +
  +
VDI-Nummer: 171 (Unterfunktion 1) +
  +
Deklaration: int16_t vr_clip_rects_by_src ( int16_t handle, RECT16 +*src_clip_rect, RECT16 *src_rect, RECT16 *dst_rect, RECT16 +*clipped_src_rect, RECT16 *clipped_dst_rect ); +
  +
Beschreibung: Quellrechteck mit einem Clipping-Rechteck schneiden und das +Zielrechteck anpassen (die Funktion berücksichtigt das +Rundungsverhalten von vr_transfer_bits). +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
src_clip_rect Clipping-Rechteck für das Quelle (diskrete Koordinaten) +
src_rect Quellrechteck (diskrete Koordinaten) +
dst_rect Zielrechteck (diskrete Koordinaten) +
clipped_src_rect geschnittenes Quellrechteck (diskrete Koordinaten) +
clipped_dst_rect geschnittenes Zielrechteck (diskrete Koordinaten) + +
+ +
Ergebnis: 0: kein Schnitt der Rechtecke +
1: alles in Ordnung +
  +
Verfügbar: ab NVDI 5.02 +
  +
Wenn der Treiber die neuen Clipfunktionen anbietet, ist bei den +erweiterten Parametern von vq_extnd in work_out[30] Bit 2 gesetzt. +
  +
Gruppe: Rasterfunktionen +
  +
Querverweis: Binding   vr_transfer_bits +
  + +
+ +

7.11.18 Bindings für vr_clip_rects_by_src

+ + + + + + + + + +
C: int16_t vr_clip_rects_by_src ( int16_t handle, RECT16 +*src_clip_rect, RECT16 *src_rect, RECT16 *dst_rect, RECT16 +*clipped_src_rect, RECT16 *clipped_dst_rect ); +
  +
Umsetzung: +
  +
int16_t vr_clip_rects_by_src ( int16_t handle,
+                               RECT16 *src_clip_rect,
+                               RECT16 *src_rect,
+                               RECT16 *dst_rect,
+                               RECT16 *clipped_src_rect,
+                               RECT16 *clipped_dst_rect )
+{
+   ptsin[0..3] = src_clip_rect;
+   ptsin[4..7] = src_rect;
+   ptsin[8..11] = dst_rect;
+
+   contrl[0] = 171;
+   contrl[1] = 6;
+   contrl[3] = 0;
+   contrl[5] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   clipped_src_rect = ptsout[0..3];
+   clipped_dst_rect = ptsout[4..7];
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]171 # Opcode der Funktion
contrl+2contrl[1]6 # Einträge in ptsin
contrl+4contrl[2]4 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]1 # Sub-Opcode
contrl+12contrl[6]handle
ptsinptsin[0..3]src_clip_rect
ptsin+8ptsin[4..7]src_rect
ptsin+16ptsin[8..11]dst_rect
ptsoutptsout[0..3]clipped_src_rect
ptsout+8ptsout[4..7]clipped_dst_rect
intoutintout[0]Rückgabewert
+
+ + +
+ +

7.11.19 vr_transfer_bits

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Transfer Bitmap« - Verknüpft zweier Bitmaps +
  +
VDI-Nummer: 170 (Unterfunktion 0) +
  +
Deklaration: void vr_transfer_bits( int16_t handle, GCBITMAP *src_bm, +GCBITMAP *dst_bm, RECT16 *src_rect, RECT16 *dst_rect, int16_t mode ); +
  +
Beschreibung: The call vr_transfer_bit combines two bitmaps, using scaling if +required. +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
src_bm Quellbitmap +
dst_bm Zielbitmap +
src_rect Quellrechteck +
dst_rect Zielrechteck +
mode Modus der Transferfunktion + +
+ +
Die Funktion TRANSFER BITMAP verknüpft die Quellbitmap +src_bm mit der Zielbitmap dst_bm, wobei mode +die Transferfunktion angibt. Das Quellrechteck wird in +src_rect und das Zielrechteck in dst_rect übergeben. +Die Koordinaten werden dabei (wie bei allen anderen VDI-Funktionen) +als diskrete Werte angegeben. +
  +
Wenn das Quell- und das Zielrechteck nicht die gleichen Ausmaße +haben, skaliert TRANSFER BITMAP die Quellbitmap. Bei Verkleinerungen +werden die Bitmapdaten interpoliert, wenn die Quelle direkte Farbwerte +enthält (16 oder 32 Bit) oder wenn die Ausgabe mit Dithern erfolgt. +
  +
Falls die Quell- und die Zielbitmap nicht das gleiche +Pixelformat oder die gleiche Farbtiefe haben, werden die Quelldaten +automatisch in das Zielformat umgesetzt (die Quellbitmap bleibt dabei +natürlich unverändert). +
  +
Wenn src_bm oder dst_bm 0 ist, wird als Quelle +bzw. Ziel der Operation die Bitmap der Workstationhandle +benutzt. Bei Ausgaben auf dem Bildschirm sollte ein Programm auf jeden +Fall 0 fürdst_bm übergeben und nicht versuchen, eine eigene +Bitmapbeschreibung aufzubauen. Clipping erfolgt nur für die +Zielbitmap (und das nur, wenn die Zielbitmap die Bitmap der +Workstation ist). +
  +
Transfermodi +
  +
In der folgenden Liste sind die Konstanten für die in +mode übergebenen Transfermodi definiert. In den Kommentaren +ist dabei die Art der Operation in symbolischer Schreibweise +aufgeführt (src ist das Quellpixel, dst ist das Zielpixel, bg_col ist +der Pixelwert der Hintergrundfarbe, hilite_col ist der Pixelwert der +Farbe für Hervorhebungen): +
  +
/* logische Transfermodi */
+/* dst = src; */
+#define T_LOGIC_COPY         0
+
+/* dst = src OR dst; */
+#define T_LOGIC_OR           1
+
+/* dst = src XOR dst; */
+#define T_LOGIC_XOR          2
+
+/* dst = src AND dst; */
+#define T_LOGIC_AND          3
+
+/* dst = ( NOT src ); */
+#define T_LOGIC_NOT_COPY     4
+
+/* dst = ( NOT src ) OR dst; */
+#define T_LOGIC_NOT_OR       5
+
+/* dst = ( NOT src ) XOR dst; */
+#define T_LOGIC_NOT_XOR      6
+
+/* dst = ( NOT src ) AND dst; */
+#define T_LOGIC_NOT_AND      7
+
+
+/* Zeichenmodi */
+/* dst = src; */
+#define T_REPLACE            32
+
+/* if ( src != bg_col ) dst = src; */
+#define T_TRANSPARENT        33
+
+/* if ( src != bg_col )            */
+/* {                               */
+/*    if ( dst == bg_col )         */
+/*       dst = hilite_col;         */
+/*    else if ( dst == hilite_col )*/
+/*       dst = bg_col;             */
+/* }                               */
+#define T_HILITE             34
+
+/* if ( src == bg_col ) dst = src; */
+#define T_REVERS_TRANSPARENT 35
+
+
Hinweis: Bei den arithmetischen Transfermodi werden Quelle und +Ziel nicht anhand ihres Pixelwerts verknüpft, sondern ihre (RGB-) +Farbwerte werden je nach Verknüpfung addiert oder subtrahiert, ... +
  +
In der symbolischen Beschreibung ist RGB( x ) der RGB-Farbwert +eines Pixels und PIXELWERT( rgb ) ist der Pixelwert eines +RGB-Farbwerts. MAX( rgb_a, rgb_b ) liefert die maximalen Komponenten +zweier RGB- Farbwerte; MIN( rgb_a, rgb_b ) liefert dementsprechend die +minimalen Komponenten zurück. <max_rgb> ist ein maximaler +RGB-Farbwert, <min_rgb> ist ein minimaler RGB-Farbwert. +<Gewichtung> ist ein Wert zwischen 0 und 1.0, der die Mischung +von Quell- und Zielfarbe angibt. +
  +
/* arithmetische Transfermodi */
+/* Quell- und Zielfarbe mischen     */
+/* rgb = RGB( src ) * Gewichtung ); */
+/* rgb += RGB( dst ) * (1-Gewichtung));*/
+/* dst = PIXELWERT( rgb );          */
+#define T_BLEND     64
+
+/* Quell- und Zielfarbe addieren    */
+/* rgb = RGB( src ) + RGB( dst )    */
+/* if ( rgb > max_rgb )             */
+/*    rgb = max_rgb;                */
+/* dst = PIXELWERT( rgb );          */
+#define T_ADD       65
+
+/* Quell- und Zielfarbe addieren,   */
+/* überlauf nicht abfangen          */
+/* rgb = RGB( src ) + RGB( dst )    */
+/* dst = PIXELWERT( rgb );          */
+#define T_ADD_OVER  66
+
+/* Quell- von Zielfarbe subtrahieren   */
+/* rgb = RGB( dst ) - RGB( src )    */
+/* if ( rgb < min_rgb )             */
+/*    rgb = min_rgb;                */
+/* dst = PIXELWERT( rgb );          */
+#define T_SUB       67
+
+/* maximale RGB-Komponenten         */
+/* rgb = MAX(RGB( dst ), RGB( src ))*/
+/* dst = PIXELWERT( rgb );          */
+#define T_MAX       69
+
+/* Quell- von Zielfarbe subtrahieren,  */
+/* überlauf nicht abfangen          */
+/* rgb = RGB( dst ) - RGB( src )    */
+/* dst = PIXELWERT( rgb );          */
+#define T_SUB_OVER  70
+
+/* minimale RGB-Komponenten         */
+/* rgb = MIN(RGB( dst ), RGB( src ))*/
+/* dst = PIXELWERT( rgb );          */
+#define T_MIN       71
+
+
Für alle Transfermodi kann man außerdem durch Addition einer +der beiden folgenden Konstanten die Art der Verknüpfung beeinflussen. +
  +
#define T_COLORIZE     16    /* Quelle einfärben */
+#define T_DITHER_MODE  128   /* Quelldaten dithern */
+
+
Dithern +
  +
<T_DITHER_MODE> führt dazu, daß eine +Fehlerverteilungsfunktion benutzt wird, wenn die Zielbitmap 256 oder +weniger Farben hat (außerdem wird bei Verkleinerungen in diesem Fall +interpoliert, damit die Details in der Verkleinerung nicht vollkommen +verloren gehen). +
  +
Falls die Quell- und Zielpalette gleich sind (oder die +Quellpalette eine Untermenge der Systemfarbpalette ist), verwendet +NVDI intern (automatisch) eine schnellere Transferfunktion ohne +Dither. +
  +
Einfärbung +
  +
    +
  • Wenn ein logischer Modus mit <T_COLORIZE> aufgerufen +wird, erfolgt die Art der Einfärbung abhängig vom Modus: +
      +

    T_LOGIC_COPY
    +
    +Blende bei allen gesetzen Bits im Farbwert die
    +Hintergrundfarbe ein und bei allen gelöschten Bits
    +die Vordergrundfarbe:
    +rgb = (( NOT RGB( src )) & RGB( fg_col )) OR
    +      ( RGB( src ) AND RGB( bg_col ));
    +dst = PIXELWERT( rgb );
    +
    +T_LOGIC_NOT_COPY
    +
    +Blende bei allen gesetzen Bits im Farbwert die
    +Vordergrundfarbe ein und bei allen gelöschten Bits die
    +Hintergrundfarbe:
    +rgb = ( RGB( src ) & RGB( fg_col )) OR
    +      ((( NOT RGB( src )) AND RGB( bg_col ));
    +dst = PIXELWERT( rgb );
    +
    +T_LOGIC_OR
    +
    +überall dort, wo Quellbits gesetzt sind, wird beim Ziel
    +( src AND fg_col) eingeblendet:
    +dst = ( src AND fg_col ) OR (( NOT src ) AND dst );
    +
    +T_LOGIC_NOT_OR
    +
    +überall dort, wo Quellbits gelöscht sind, wird beim Ziel
    +((NOT src ) AND fg_col) eingeblendet:
    +dst = (( NOT src ) AND fg_col ) OR ( src AND dst );
    +
    +T_LOGIC_XOR
    +T_LOGIC_NOT_XOR
    +
    +Die XOR-Verknüpfung ignoriert die Einfärbung.
    +
    +T_LOGIC_AND
    +
    +überall dort, wo Quellbits gelöscht sind, wird beim Ziel
    +((NOT src ) AND bg_col) eingeblendet:
    +dst = ((NOT src ) AND bg_col ) OR ( src AND dst );
    +
    +T_LOGIC_NOT_AND
    +
    +überall dort, wo Quellbits gesetzt sind, wird beim Ziel
    +( src AND bg_col) eingeblendet:
    +dst = ( src AND bg_col ) OR ((NOT src ) AND dst );
    +
    +

  • +
  • Bei den Modi T_REPLACE, T_TRANSPARENT, T_HILITE und +T_REVERS_TRANSPARENT wirkt die Einfärbung nicht binär auf die Farb- +oder Pixelwerte, sondern die Farbwerte werden skaliert. Das folgende +Beispiel zeigt, wie ein Farbwert eingefärbt wird; <bg_col>, +<fg_col>, <src> und <dst> sind RGB-Farbwerte +(zwischen 0 und 65535): +
      +

    red_range = bg_col.red - fg_col.red;
    +green_range = bg_col.green - fg_col.green;
    +blue_range = bg_col.blue - fg_col.blue;
    +
    +dst.red = fg_col.red + ( src_color.red * red_range / 65535 );
    +dst.green = fg_col.green + ( src_color.green * green_range / 65535 );
    +dst.blue = fg_col.blue + ( src_color.blue * blue_range / 65535 );
    +
    +
    Hinweis: Momentan wird die Einfärbung in den Modi T_REPLACE, +T_TRANSPARENT, T_HILITE und T_REVERS_TRANSPARENT nur für Quellbitmaps +mit bis zu 256 Farben unterstützt. Für Quellbitmaps mit 16 oder 32 +Bit wird in diesen Modi zur Zeit keine Einfärbung unterstützt. +
      +

  • +
  • Die arithmetischen Transfermodi unterstützen keine +Einfärbung. +
      +

  • +
+ +
Bitmaps +
  +
Statt eines antiquierten MFDBs erwartet diese Funktion eine +GCBITMAP-Struktur, um die Bitmaps zu beschreiben. +
  +
Wenn <ctab> 0L ist, wird die der Bittiefe entsprechende +Systemfarbtabelle für den Aufruf benutzt (wenn die Bitmap mehr als 8 +Bit pro Pixel hat, d.h. direkte Farbwerte benutzt, kann <ctab> +ebenfalls auf 0L gesetzt werden). +
  +
Quellbitmaps benötigen keine inverse Farbtabelle, hier kann +<itab> auf 0L gesetzt werden. Bei einer selbst verwalteten +Zielbitmap muß man vom VDI eine Referenz auf eine inverse Farbtabelle +anfordern (und irgendwann später auch wieder freigeben). +
  +
Vereinfachte Sonderfälle +
  +
Damit Bitmaps im Format des Bildschirms auch ohne Anforderung +einer Farbtabelle und einer Referenz auf eine inverse Farbtabelle +ähnlich unkompliziert wie bei vro_cpyfm kopiert werden können, gibt +es einige vereinfachte Sonderfälle bei vr_transfer_bits: +
  +
    +
  • Wenn die Quelle keine Farbtabelle hat (0L), wird die +Farbtabelle des Geräts genommen, wenn dieses die gleiche Bittiefe +hat. Ist das nicht der Fall, wird die Systemfarbtabelle für die +Bittiefe der Quelle benutzt. +
      +

  • +
  • Wenn das Ziel keine (inverse) Farbtabelle hat (0L), wird die +(inverse) Farbtabelle des Geräts genommen, wenn dieses die gleiche +Bittiefe hat. Ist das nicht der Fall, wird die Systemfarbtabelle für +die Bittiefe des Ziels benutzt und für den Aufruf wird extra intern +eine inverse Farbtabelle aufgebaut. D.h. Zielbitmaps sollten, wenn sie +keine inverse Farbtabelle haben, unbedingt die gleiche Bittiefe wie +das zum VDI-Handle gehörende Gerät haben. +
      +

  • +
+ +
Hinweis: Es empfiehlt sich, für Bitmaps außerhalb des +Bildschirms mit v_open_bm oder v_opnbm eine Bitmap vom VDI erzeugen +zu lassen, da man sich in diesem Fall nicht um die Verwaltung von +Farbtabellen und inversen Farbtabellen kümmern muß. +
  +
Pixelformate +
  +
Um Bitmaps zwischen verschiedenen Bittiefen und Pixelformaten +wandeln zu können, benötigt TRANSFER BITMAP eine Beschreibung des +Pixelformats, die im Strukturelement <px_format> enthalten ist. +Der Aufbau dieses Bitvektors wird in der folgenden Liste beschrieben; +für Programmierer dürften aber vor allem die vordefinierten Formate +interessant sein: +
  +
/* Konstanten für Pixelformate */
+/* Pixel besteht aus einer benutzten Komponente:
+   Farbindex */
+#define  PX_1COMP    0x01000000L
+/* Pixel besteht aus drei benutzten Komponenten,
+   z.B. RGB */
+#define  PX_3COMP    0x03000000L
+/* Pixel besteht aus vier benutzten Komponenten,
+   z.B. CMYK */
+#define  PX_4COMP    0x04000000L
+/* Pixel wird in umgekehrter Bytereihenfolge ausgegeben */
+#define  PX_REVERSED 0x00800000L
+/* unbenutzte Bits liegen vor den benutzen
+   (im Motorola-Format betrachtet) */
+#define  PX_xFIRST   0x00400000L
+/* K liegt vor CMY (im Motorola-Format betrachtet) */
+#define  PX_kFIRST   0x00200000L
+/* Alphakanal liegen vor den Farbbits
+   (im Motorola-Format betrachtet) */
+#define  PX_aFIRST   0x00100000L
+/* Bits sind aufeinanderfolgend abgelegt */
+#define  PX_PACKED   0x00020000L
+/* Bits sind auf mehrere Ebenen verteilt
+   (Reihenfolge: 0, 1, ..., n) */
+#define  PX_PLANES   0x00010000L
+/* Bits sind auf mehrere Worte verteilt
+   (Reihenfolge: 0, 1, ..., n) */
+#define  PX_IPLANES  0x00000000L
+/* 1 Bit des Pixels wird benutzt */
+#define  PX_USES1    0x00000100L
+/* 2 Bit des Pixels werden benutzt */
+#define  PX_USES2    0x00000200L
+/* 3 Bit des Pixels werden benutzt */
+#define  PX_USES3    0x00000300L
+/* 4 Bit des Pixels werden benutzt */
+#define  PX_USES4    0x00000400L
+/* 8 Bit des Pixels werden benutzt */
+#define  PX_USES8    0x00000800L
+/* 15 Bit des Pixels werden benutzt */
+#define  PX_USES15   0x00000f00L
+/* 16 Bit des Pixels werden benutzt */
+#define  PX_USES16   0x00001000L
+/* 24 Bit des Pixels werden benutzt */
+#define  PX_USES24   0x00001800L
+/* 32 Bit des Pixels werden benutzt */
+#define  PX_USES32   0x00002000L
+/* 48 Bit des Pixels werden benutzt */
+#define  PX_USES48   0x00003000L
+/* Pixel besteht aus 1 Bit */
+#define  PX_1BIT     0x00000001L
+/* Pixel besteht aus 2 Bit */
+#define  PX_2BIT     0x00000002L
+/* Pixel besteht aus 3 Bit */
+#define  PX_3BIT     0x00000003L
+/* Pixel besteht aus 4 Bit */
+#define  PX_4BIT     0x00000004L
+/* Pixel besteht aus 8 Bit */
+#define  PX_8BIT     0x00000008L
+/* Pixel besteht aus 16 Bit */
+#define  PX_16BIT    0x00000010L
+/* Pixel besteht aus 24 Bit */
+#define  PX_24BIT    0x00000018L
+/* Pixel besteht aus 32 Bit */
+#define  PX_32BIT    0x00000020L
+/* Pixel besteht aus 48 Bit */
+#define  PX_48BIT    0x00000030L
+/* Maske für Anzahl der Pixelkomponenten */
+#define  PX_CMPNTS   0x0f000000L
+/* Maske für diverse Flags */
+#define  PX_FLAGS    0x00f00000L
+/* Maske für Pixelformat */
+#define  PX_PACKING  0x00030000L
+/* Maske für Anzahl der benutzten Bits */
+#define  PX_USED     0x00003f00L
+/* Maske für Anzahl der Bits pro Pixel */
+#define  PX_BITS     0x0000003fL
+
+/* Pixelformate für ATARI-Grafik */
+#define  PX_ATARI1   ( PX_PACKED + PX_1COMP + PX_USES1 + PX_1BIT )
+#define  PX_ATARI2   ( PX_IPLANES + PX_1COMP + PX_USES2 + PX_2BIT )
+#define  PX_ATARI4   ( PX_IPLANES + PX_1COMP + PX_USES4 + PX_4BIT )
+#define  PX_ATARI8   ( PX_IPLANES + PX_1COMP + PX_USES8 + PX_8BIT )
+#define  PX_FALCON15 ( PX_PACKED + PX_3COMP + PX_USES16 + PX_16BIT )
+
+/* Pixelformate für Mac */
+#define  PX_MAC1     ( PX_PACKED + PX_1COMP + PX_USES1 + PX_1BIT )
+#define  PX_MAC4     ( PX_PACKED + PX_1COMP + PX_USES4 + PX_4BIT )
+#define  PX_MAC8     ( PX_PACKED + PX_1COMP + PX_USES8 + PX_8BIT )
+#define  PX_MAC15    ( PX_xFIRST + PX_PACKED + PX_3COMP + PX_USES15 + PX_16BIT )
+#define  PX_MAC32    ( PX_xFIRST + PX_PACKED + PX_3COMP + PX_USES24 + PX_32BIT )
+
+/* Pixelformate für Grafikkarten */
+#define  PX_VGA1     ( PX_PACKED + PX_1COMP + PX_USES1 + PX_1BIT )
+#define  PX_VGA4     ( PX_PLANES + PX_1COMP + PX_USES4 + PX_4BIT )
+#define  PX_VGA8     ( PX_PACKED + PX_1COMP + PX_USES8 + PX_8BIT )
+#define  PX_VGA15    ( PX_REVERSED + PX_xFIRST + PX_PACKED + PX_3COMP + PX_USES15 + PX_16BIT )
+#define  PX_VGA16    ( PX_REVERSED + PX_PACKED + PX_3COMP + PX_USES16 + PX_16BIT )
+#define  PX_VGA24    ( PX_REVERSED + PX_PACKED + PX_3COMP + PX_USES24 + PX_24BIT )
+#define  PX_VGA32    ( PX_REVERSED + PX_xFIRST + PX_PACKED + PX_3COMP + PX_USES24 + PX_32BIT )
+#define  PX_MATRIX16 ( PX_PACKED + PX_3COMP + PX_USES16 + PX_16BIT )
+#define  PX_NOVA32   ( PX_PACKED + PX_3COMP + PX_USES24 + PX_32BIT )
+
+/* Pixelformate für Drucker */
+#define  PX_PRN1     ( PX_PACKED + PX_1COMP + PX_USES1 + PX_1BIT )
+#define  PX_PRN8     ( PX_PACKED + PX_1COMP + PX_USES8 + PX_8BIT )
+#define  PX_PRN32    ( PX_xFIRST + PX_PACKED + PX_3COMP + PX_USES24 + PX_32BIT )
+
+/* bevorzugte (schnelle) Pixelformate für Bitmaps */
+#define  PX_PREF1    ( PX_PACKED + PX_1COMP + PX_USES1 + PX_1BIT )
+#define  PX_PREF2    ( PX_PACKED + PX_1COMP + PX_USES2 + PX_2BIT )
+#define  PX_PREF4    ( PX_PACKED + PX_1COMP + PX_USES4 + PX_4BIT )
+#define  PX_PREF8    ( PX_PACKED + PX_1COMP + PX_USES8 + PX_8BIT )
+#define  PX_PREF15   ( PX_xFIRST + PX_PACKED + PX_3COMP + PX_USES15 + PX_16BIT )
+#define  PX_PREF32   ( PX_xFIRST + PX_PACKED + PX_3COMP + PX_USES24 + PX_32BIT )
+
+
Für Programme, die selber Bitmaps erzeugen (oder laden) und +anschließend auf dem Bildschirm ausgeben wollen, sind besonders die +zuletzte angegeben Formate PX_PREFx zu empfehlen, da sie bei einem +anderen Pixelformat des Bildschirms mit geringerem Aufwand als einige +andere Formate gewandelt werden können. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: ab NVDI 5.00 +
  +
Wenn der Treiber die neuen Rasterfunktionen anbietet, ist bei +den erweiterten Parametern von vq_extnd in work_out[30] Bit 1 gesetzt. +
  +
Gruppe: Rasterfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.11.20 Bindings für vr_transfer_bits

+ + + + + + + + + +
C: void vr_transfer_bits( int16_t handle, GCBITMAP *src_bm, +GCBITMAP *dst_bm, RECT16 *src_rect, RECT16 *dst_rect, int16_t mode ); +
  +
Umsetzung: +
  +
void vr_transfer_bits( int16_t handle, GCBITMAP *src_bm,
+                       GCBITMAP *dst_bm, RECT16 *src_rect,
+                       RECT16 *dst_rect, int16_t mode )
+{
+   intin[o] = mode;
+   intin[1] = 0;
+   intin[2] = 0;
+   intin[3] = 0;
+
+   ptsin[0..3] = src_rect;
+   ptsin[4..7] = dst_rect;
+
+   contrl[0] = 170;
+   contrl[1] = 4;
+   contrl[3] = 4;
+   contrl[5] = 0;
+   contrl[6] = handle;
+   contrl[7..8] = src_bm;
+   contrl[9..10] = dst_bm;
+   contrl[11..12] = 0;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]170 # Opcode der Funktion
contrl+2contrl[1]4 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]4 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+10contrl[5]0 # Sub-Opcode
contrl+12contrl[6]handle
contrl+14contrl[7..8]src_bm
contrl+18contrl[9..10]dst_bm
contrl+22contrl[11..12]0
intinintin[0]mode
intin+2intin[1]0
intin+4intin[2]0
ptsinptsin[0..3]src_rect
ptsin+8ptsin[4..7]dst_rect
+
+ + +
+ +

7.11.21 vr_trnfm

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Transform Form« - wandelt ein Rasterbild um. +
  +
VDI-Nummer: 110 +
  +
Deklaration: void vr_trnfm ( int16_t handle, MFDB *psrcMFDB, MFDB +*pdesMFDB ); +
  +
Beschreibung: Die Funktion transformiert ein Raster vom Standardformat in das +gerätespezifische Format oder umgekehrt. Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
psrcMFDB Zeiger auf MFDB des Quellrasters +
pdesMFDB Zeiger auf MFDB des Zielrasters + +
+ +
Beim Standardformat handelt es sich um ein +plattformunabhängiges Datenformat, welches daher zum Austausch von +Dateien zwischen verschiedenen GEM-Systemen benutzt werden kann. +
  +
Hinweis: Man kann dem VDI die Arbeit erleichtern, indem +in Quell/Ziel-MFDB unterschiedliche Rasteradressen angegeben werden; +anderenfalls kann eine Transformation durchaus mehrere Minuten in +Anspruch nehmen. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all drivers. +
  +
Gruppe: Rasterfunktionen +
  +
Querverweis: Binding   vro_cpyfm   vrt_cpyfm   Rasterformate +
  + +
+ +

7.11.22 Bindings für vr_trnfm

+ + + + + + + + + +
C: void vr_trnfm ( int16_t handle, MFDB *psrcMFDB, MFDB *pdesMFDB +); +
  +
Umsetzung: +
  +
void vr_trnfm (int16_t handle, MFDB *psrcMFDB, MFDB *pdesMFDB)
+{
+   iptr (psrcMFDB);
+   iptr_2 (pdesMFDB);
+
+   contrl[0] = 110;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]110 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]0 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
contrl+14contrl[7,8]psrcMFDB
contrl+18contrl[9,10]pdesMFDB
+
+ + +
+ +

7.11.23 vro_cpyfm

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Copy Raster, Opaque« - kopiert einen Speicherbereich. +
  +
VDI-Nummer: 109 +
  +
Deklaration: void vro_cpyfm ( int16_t handle, int16_t vr_mode, int16_t +*pxyarray, MFDB *psrcMFDB, MFDB *pdesMFDB ); +
  +
Beschreibung: Die Funktion kopiert einen Quellspeicherbereich an ein Ziel und +verknüpft dabei die Quelle und das Ziel durch die in vr_mode +decodierte logische Verknüpfung. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
vr_mode eine von 16 logischen Verknüpfungen zwischen den Pixeln des +Quell- und Zielraster +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ALL_WHITE0D := 0
S_AND_D1D := S AND D
S_AND_NOTD2D := S AND (NOT D)
S_ONLY3D := S
NOTS_AND_D4D := (NOT S) AND D
D_ONLY5D := D
S_XOR_D6D := S XOR D
S_OR_D7D := S OR D
NOT_SORD8D := NOT (S OR D)
NOT_SXORD9D := NOT (S XOR D)
D_INVERT10D := NOT D
NOT_D11D := S OR (NOT D)
S_OR_NOTD12D := NOT S
NOTS_OR_D13D := (NOT S) OR D
NOT_SANDD14D := NOT (S AND D)
ALL_BLACK15D := 1
+
+ +
  MATRIX TC-VDI: One pixel treated as unit (long value) +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
S_ADD_D16D := S + D
S_ADDS_D17D := MIN ( S + D, 1...1 )
S_SUB_D18D := S - D
S_SUBS_D19D := MAX ( S + D, 0...0 )
S_MAX_D20D := MAX ( S, D )
S_MIN_D21D := MIN ( S, D )
+
+ +
  MATRIX TC-VDI: Pixels components calc'd separate +(a,R,G,B). S_xyz == CS_xyz for bpp up to 8. +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CS_ADD_D22D := S + D
CS_ADDS_D23D := MIN ( S + D, 1...1 )
CS_SUB_D24D := S - D
CS_SUBS_D25D := MAX ( S + D, 0...0 )
CS_MAX_D26D := MAX ( S, D )
CS_MIN_D27D := MIN ( S, D )
+
+ +
pxyarray[0] x-Koordinate +
pxyarray[1] y-Koordinate eines Eckpunktes des Quellrasters +
pxyarray[2] x-Koordinate +
pxyarray[3] y-Koordinate des diagonal gegenüberliegenden Eckpunktes des +Quellrasters +
pxyarray[4] x-Koordinate +
pxyarray[5] y-Koordinate eines Eckpunktes des Zielrasters +
pxyarray[6] x-Koordinate +
pxyarray[7] y-Koordinate des diagonal gegenüberliegenden Eckpunktes des +Zielrasters +
psrcMFDB Zeiger auf den MFDB der Quelle +
pdesMFDB Zeiger auf den MFDB des Ziels + +
+ +
Hinweis: Falls die Größen beider Raster nicht +übereinstimmen, wird die Größe des Quellrasters benutzt. Die +Adresse des Zielrasters dient in diesem Fall lediglich als Zeiger. +Stimmen die Adressen von Quell- und Zielbereich überein (und sind +diese ungleich 0), und überlappen sich die beiden Bereiche, so wird +das Quellrechteck nicht verändert bis das Zielrechteck fertig kopiert +ist. +
  +
Normalerweise ignoriert die Funktion die Breite und Höhe des +Zielrasters und geht von den Maßen des Quellrasters aus. Wenn ein +Raster skaliert werden soll, muss daher das oberste Bit im +Verknüpfungsmodus gesetzt werden (vr_mode|0x8000). Die +Funktion beachtet dann unterschiedliche Ausmaße und skaliert das +Raster. Ob der jeweilige Treiber Raster skalieren kann, sollte per +vq_extnd (work_out[30]) ermittelt werden; das oberste Bit im +Verknüpfungsmodus darf nur gesetzt werden, wenn der Treiber über +diese Fähigkeit verfügt. +
  +
Wichtig: Raster im Standardformat können und +dürfen nicht kopiert werden, da man im allgemeinen keine +Informationen über das gerätespezifische Format hat. Daher sollte +ggfs. die Funktion vr_trnfm benutzt werden. +
  +
Hinweis zu NVDI: In älteren Druckertreibern hat diese +Funktion leider einen Fehler, der dazu führt, daß Bitmaps, die nur +eine Zeile hoch sind, evtl. nicht ausgegeben werden. Aus diesem Grund +sollte die übergebene Bitmap mindestens zwei Zeilen hoch sein. +
  +
Hinweis zu TC-VDI: vr_mode from 16 to 27 are +supported only by MATRIX graphic boards. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all screen drivers. +
  +
Gruppe: Rasterfunktionen +
  +
Querverweis: Binding   vrt_cpyfm   vr_trnfm   Rasterformate +
  + +
+ +

7.11.24 Bindings für vro_cpyfm

+ + + + + + + + + +
C: void vro_cpyfm ( int16_t handle, int16_t vr_mode, int16_t +*pxyarray, MFDB *psrcMFDB, MFDB *pdesMFDB ); +
  +
Umsetzung: +
  +
void vro_cpyfm (int16_t handle, int16_t vr_mode,
+                int16_t *pxyarray, MFDB *psrcMFDB,
+                MFDB *pdesMFDB)
+{
+   intin[0]    = vr_mode;
+   ptsin[0..7] = pxyarray[0..7];
+   iptr (psrcMFDB);
+   iptr2 (pdesMFDB);
+
+   contrl[0] = 109;
+   contrl[1] = 4;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]109 # Opcode der Funktion
contrl+2contrl[1]4 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]1 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
contrl+14contrl[7,8]psrcMFDB
contrl+18contrl[9,10]pdesMFDB
intinintin[0]vr_mode
ptsinptsin[0..7]pxyarray[0..7]
+
+ + +
+ +

7.11.25 vrt_cpyfm

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Copy Raster, Transparent« - kopiert ein Monochromraster auf +ein Farbraster. +
  +
VDI-Nummer: 121 +
  +
Deklaration: void vrt_cpyfm ( int16_t handle, int16_t vr_mode, int16_t +*pxyarray, MFDB *psrcMFDB, MFDB *pdesMFDB, int16_t *color_index ); +
  +
Beschreibung: Die Funktion kopiert ein monochromes, rechteckiges Raster unter +Beachtung der Schreibmodi auf ein anderes (auch farbiges) rechteckiges +Raster. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
vr_mode Schreibmodus + + + + + + + + + + + + +
1 = Replace +
2 = Transparent +
3 = XOR +
4 = Reverse Transparent + +
+ +
pxyarray[0] x-Koordinate +
pxyarray[1] y-Koordinate des Eckpunktes des Quellrasters +
pxyarray[2] x-Koordinate +
pxyarray[3] y-Koordinate der diagonal gegenüber liegenden Ecke des +Quellrasters +
pxyarray[4] x-Koordinate +
pxyarray[5] y-Koordinate des Eckpunktes des Zielrasters +
pxyarray[6] x-Koordinate +
pxyarray[7] y-Koordinate der diagonal gegenüber liegenden Ecke des +Zielrasters +
psrcMFDB Zeiger auf den MFDB der Quelle +
pdesMFDB Zeiger auf den MFDB des Ziels +
color_index[0] Farbnummer der Farbe, die als gesetzt interpretiert werden soll +
color_index[1] Farbnummer der Farbe, die als nicht gesetzt interpretiert +werden soll + +
+ +
Hinweis: Sollten die Größen beider Raster nicht +übereinstimmen, so werden die Größe des Quellrasters und die obere +linke Ecke des Zielrasters als Startpunkt benutzt. Der Bildschirm darf +niemals als Quellraster angegeben werden. +
  +
Normalerweise ignoriert die Funktion die Breite und Höhe des +Zielrasters und geht von den Maßen des Quellrasters aus. Wenn ein +Raster skaliert werden soll, muss daher das oberste Bit im +Schreibmodus gesetzt werden (vr_mode|0x8000). Die Funktion +beachtet dann unterschiedliche Ausmaße und skaliert das Raster. Ob +der jeweilige Treiber Raster skalieren kann, sollte per vq_extnd +(work_out[30]) ermittelt werden; das oberste Bit im Schreibmodus +darf nur gesetzt werden, wenn der Treiber über diese Fähigkeit +verfügt. +
  +
Achtung: In älteren NVDI-Druckertreibern hat diese +Funktion leider einen Fehler, der dazu führt, daß Bitmaps, die nur +eine Zeile hoch sind, evtl. nicht ausgegeben werden. Aus diesem Grund +sollte die übergebene Bitmap mindestens zwei Zeilen hoch sein. +
  +
Note for TC-VDI: TC-VDI has two new modes: +
1 - Copy multi color raster to screen +
Copy psrcMFDB (8bpp, packed pixels) to pdesMFDB (8 +or 32bpp, device-specific format). Convert VDI color numbers to pixel +values, in 32bpp expand pixel through the software palette. +
Valid modes are: REPLACE, color_index is not used, and +TRANSPARENT, color_index[0] is the transparent color (source +pixels with this color are not copied, destination is unchanged). +
Others modes have no action. +
  +
2 - Expand packed 24bpp raster to screen +
Copy psrcMFDB (24bpp, packed pixels) to pdesMFDB +(32bpp, device-specific format). Expand 24bpp source to 32bpp +destination. +
Valid mode is REPLACE, color_index is not used. +
Others modes have no action. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Supported by all screen drivers. +
  +
Gruppe: Rasterfunktionen +
  +
Querverweis: Binding   vro_cpyfm   vswr_mode   Rasterformate +
  + +
+ +

7.11.26 Bindings für vrt_cpyfm

+ + + + + + + + + +
C: void vrt_cpyfm ( int16_t handle, int16_t vr_mode, int16_t +*pxyarray, MFDB *psrcMFDB, MFDB *pdesMFDB, int16_t *color_index ); +
  +
Umsetzung: +
  +
void vrt_cpyfm (int16_t handle, int16_t vr_mode,
+                int16_t *pxyarray,MFDB *psrcMFDB,
+                MFDB *pdesMFDB, int16_t *color_index)
+{
+   intin[0]    = vr_mode;
+   intin[1]    = *color_index++;
+   intin[2]    = *color_index;
+   ptsin[0..7] = pxyarray[0..7];
+
+   iptr (psrcMFDB);
+   iptr_2 (pdesMFDB);
+
+   contrl[0] = 121;
+   contrl[1] = 4;
+   contrl[3] = 3;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]121 # Opcode der Funktion
contrl+2contrl[1]4 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]3 # Einträge in intin
contrl+8contrl[4]0 # Einträge in intout
contrl+12contrl[6]handle
contrl+14contrl[7,8]psrcMFDB
contrl+18contrl[9,10]pdesMFDB
intinintin[0]vr_mode
intin+2intin[1..2]color_index[0..1]
ptsinptsin[0..7]pxyarray[0..7]
+
+ + +
+ +

7.11.27 vs_hilite_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Hilite Color« - setzt die Hervorhebungsfarbe. +
  +
VDI-Nummer: 207 (Unterfunktion 0) +
  +
Deklaration: int16_t vs_hilite_color( int16_t handle, int32_t color_space, +COLOR_ENTRY *hilite_color ); +
  +
Beschreibung: Diese Funktion setzt die Hervorhebungsfarbe. +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
color_space Farbraum (z.Zt.nur 0 für eingestellten Farbraum oder +CSPACE_RGB) +
hilite_color COLOR_ENTRY der Hervorhebungsfarbe + +
+ +
Ergebnis: -1 = falsche Unterfunktionsnummer +
 0 = Funktion nicht vorhanden +
 1 = alles in Ordnung +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Rasterfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.11.28 Bindings für vs_hilite_color

+ + + + + + + + + +
C: int16_t vs_hilite_color( int16_t handle, int32_t color_space, +COLOR_ENTRY *hilite_color ); +
  +
Umsetzung: +
  +
int16_t vs_hilite_color( int16_t handle, int32_t color_space,
+                         COLOR_ENTRY *hilite_color )
+{
+   intin[0..1]    = color_space;
+   intin[2..5]    = hilite_color;
+
+   contrl[0] = 207;
+   contrl[1] = 0;
+   contrl[3] = 6;
+   contrl[5] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]207 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]6 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]0 # Sub-Opcode
contrl+12contrl[6]handle
intinintin[0..1]color_space
intin+4intin[2..5]hilite_color
intoutintout[0]Rückgabewert
+
+ + +
+ +

7.11.29 vs_max_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Maximum Color« - maximalen Farbwert für eine additive +Rasteroperation. +
  +
VDI-Nummer: 207 (Unterfunktion 2) +
  +
Deklaration: int16_t vs_max_color( int16_t handle, int32_t color_space, +COLOR_ENTRY *max_color ); +
  +
Beschreibung: Diese Funktion setzt den maximalen Farbwert für eine additive +Rasteroperation. +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
color_space Farbraum (z.Zt.nur 0 für eingestellten Farbraum oder +CSPACE_RGB) +
max_color COLOR_ENTRY des maximalen Farbwerts für T_SUB. + +
+ +
Ergebnis: -1 = falsche Unterfunktionsnummer +
 0 = Funktion nicht vorhanden +
 1 = alles in Ordnung +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Rasterfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.11.30 Bindings für vs_max_color

+ + + + + + + + + +
C: int16_t vs_max_color( int16_t handle, int32_t color_space, +COLOR_ENTRY *max_color ); +
  +
Umsetzung: +
  +
int16_t vs_max_color( int16_t handle, int32_t color_space,
+                      COLOR_ENTRY *max_color )
+{
+   intin[0..1]    = color_space;
+   intin[2..5]    = max_color;
+
+   contrl[0] = 207;
+   contrl[1] = 0;
+   contrl[3] = 6;
+   contrl[5] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]207 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]6 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]2 # Sub-Opcode
contrl+12contrl[6]handle
intinintin[0..1]color_space
intin+4intin[2..5]max_color
intoutintout[0]Rückgabewert
+
+ + +
+ +

7.11.31 vs_min_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Minimum Color« - minimalen Farbwert für eine +subtraktive Rasteroperation. +
  +
VDI-Nummer: 207 (Unterfunktion 1) +
  +
Deklaration: int16_t vs_min_color( int16_t handle, int32_t color_space, +COLOR_ENTRY *min_color ); +
  +
Beschreibung: Diese Funktion setzt den minimalen Farbwert für eine +subtraktive Rasteroperation. +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
color_space Farbraum (z.Zt.nur 0 für eingestellten Farbraum oder +CSPACE_RGB) +
min_color COLOR_ENTRY des minimalen Farbwerts für T_SUB. + +
+ +
Ergebnis: -1 = falsche Unterfunktionsnummer +
 0 = Funktion nicht vorhanden +
 1 = alles in Ordnung +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Rasterfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.11.32 Bindings für vs_min_color

+ + + + + + + + + +
C: int16_t vs_min_color( int16_t handle, int32_t color_space, +COLOR_ENTRY *min_color ); +
  +
Umsetzung: +
  +
int16_t vs_min_color( int16_t handle, int32_t color_space,
+                      COLOR_ENTRY *min_color )
+{
+   intin[0..1]    = color_space;
+   intin[2..5]    = min_color;
+
+   contrl[0] = 207;
+   contrl[1] = 0;
+   contrl[3] = 6;
+   contrl[5] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]207 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]6 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]1 # Sub-Opcode
contrl+12contrl[6]handle
intinintin[0..1]color_space
intin+4intin[2..5]min_color
intoutintout[0]Rückgabewert
+
+ + +
+ +

7.11.33 vs_weight_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Weight Color« - Gewichtung für die Blend-Funktion. +
  +
VDI-Nummer: 207 (Unterfunktion 3) +
  +
Deklaration: int16_t vs_weight_color( int16_t handle, int32_t color_space, +COLOR_ENTRY *weight_color ); +
  +
Beschreibung: Diese Funktion setzt die Gewichtung für die Blend-Funktion. +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung der Workstation +
color_space Farbraum (z.Zt.nur 0 für eingestellten Farbraum oder +CSPACE_RGB) +
weight_color COLOR_ENTRY der Gewichtung für T_SUB. + +
+ +
Ergebnis: -1 = falsche Unterfunktionsnummer +
 0 = Funktion nicht vorhanden +
 1 = alles in Ordnung +
  +
Verfügbar: ab NVDI 5.00 +
  +
Gruppe: Rasterfunktionen +
  +
Querverweis: Binding +
  + +
+ +

7.11.34 Bindings für vs_weight_color

+ + + + + + + + + +
C: int16_t vs_weight_color( int16_t handle, int32_t color_space, +COLOR_ENTRY *weight_color ); +
  +
Umsetzung: +
  +
int16_t vs_weight_color( int16_t handle, int32_t color_space,
+                         COLOR_ENTRY *weight_color )
+{
+   intin[0..1]    = color_space;
+   intin[2..5]    = weight_color;
+
+   contrl[0] = 207;
+   contrl[1] = 0;
+   contrl[3] = 6;
+   contrl[5] = 3;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
contrlcontrl[0]207 # Opcode der Funktion
contrl+2contrl[1]0 # Einträge in ptsin
contrl+4contrl[2]0 # Einträge in ptsout
contrl+6contrl[3]6 # Einträge in intin
contrl+8contrl[4]1 # Einträge in intout
contrl+10contrl[5]3 # Sub-Opcode
contrl+12contrl[6]handle
intinintin[0..1]color_space
intin+4intin[2..5]weight_color
intoutintout[0]Rückgabewert
+
+ + +
+ +
+ +Home +VDIVDI +KontrollfunktionenKontrollfunktionen +TC-VDI-FunktionenTC-VDI-Funktionen + + diff --git a/de/vdi_structures.html b/de/vdi_structures.html new file mode 100644 index 000000000..334890b6e --- /dev/null +++ b/de/vdi_structures.html @@ -0,0 +1,497 @@ + + + + + +Die Anleitung zum TOS: VDI-Strukturen + + + + + + + + + +Home +VDIVDI +VDI-FunktionslisteVDI-Funktionsliste +AESAES + +
+ +

7.14 VDI-Strukturen

+ +
+

7.14.1 VDIPB

+
typedef struct
+{
+   int16_t  *contrl;    /* Zeiger auf contrl-Array */
+   int16_t  *intin;     /* Zeiger auf intin-Array  */
+   int16_t  *ptsin;     /* Zeiger auf ptsin-Array  */
+   int16_t  *intout;    /* Zeiger auf intout-Array */
+   int16_t  *ptsout;    /* Zeiger auf ptsout-Array */
+} VDIPB;
+
+

7.14.2 BIT_IMAGE

+
typedef struct
+{
+   int16_t   nbplanes;
+   int16_t   width;
+   int16_t   height;
+} BIT_IMAGE;
+
+

7.14.3 COLOR_ENTRY

+

Die Union COLOR_ENTRY enthält den Farbtabelleneintrag. +Zukünftig sind auch andere Farbräume als RGB möglich: +

+
typedef union
+{
+   COLOR_RGB   rgb;
+   COLOR_CMYK  cmyk;
+} COLOR_ENTRY;
+
+

7.14.4 COLOR_RGB

+
typedef struct
+{
+   uint16   reserved;     /* auf 0 oder den Index des Eintrags setzen */
+   uint16   red;          /* Rot:  0<->65535 */
+   uint16   green;        /* Grün: 0<->65535 */
+   uint16   blue;         /* Blau: 0<->65535 */
+} COLOR_RGB;
+
+

Falls in einem Programm die Farbdaten bereits in einem +vernünftigen Format (z.B. 8 Bit pro Kanal) vorliegen, kann man sich +eine Umwandlung mit Multiplikation und Division ersparen. Die Shift- +und OR-Funktion des Prozessors erledigt das dann schneller und +eleganter. +

+

Beispiel: Der Farbwert sei durch die Byte-Variablen r, g, b +beschrieben. Die korrekte Umsetzung auf das 16-Bit-Format der +COLOR_RGB-Struktur erfolgt dann so: +

+
COLOR_RGB color;
+
+color.reserved = 0;
+
+color.red = r;
+color.red |= (color.red << 8);
+
+color.green = g;
+color.green |= (color.green << 8);
+
+color.blue = b;
+color.blue |= (color.blue << 8);
+
+

Das Strukturelement reserved sollte auf 0 gesetzt werden +oder (beim Aufbau einer Farbtabelle) den Index des Eintrags enthalten. +In jedem Fall müssen aber die oberen 8 Bits von reserved auf +0 gesetzt werden, da sie von den Farbroutinen ggf. für Flags +verwendet werden. +

+

7.14.5 COLOR_TAB

+
typedef struct                    /* Farbtabelle                     */
+{
+   int32 magic;                   /* 'ctab'                          */
+   int32 length;
+   int32 format;                  /* Format (0)                      */
+   int32 reserved;                /* reserviert, auf 0 setzen        */
+   int32 map_id;                  /* Kennung der Farbtabelle         */
+   int32 color_space;             /* Farbraum (z.Zt. nur CSPACE_RGB) */
+   int32 flags;                   /* VDI-interne Flags, auf 0 setzen */
+   int32 no_colors;               /* Anzahl der Farbeintäge          */
+   int32 reserved1;               /* reserviert, auf 0 setzen        */
+   int32 reserved2;               /* reserviert, auf 0 setzen        */
+   int32 reserved3;               /* reserviert, auf 0 setzen        */
+   int32 reserved4;               /* reserviert, auf 0 setzen        */
+   COLOR_ENTRY colors[];
+} COLOR_TAB;
+
+

7.14.6 fix31

+

Der Datentyp fix31 entspricht dem Typ LONG, und wird in +Zusammenhang mit Vektorfonts benötigt, wo mit Positonen und +Schrittweiten in 1/65536 gerechnet wird. Dabei entspricht die Weite +eines Pixels dem Wert 65536. Die oberen 16 Bit repräsentieren den +Vorkommaanteil und die unteren 16 Bit die +Nachkommastellen. +

+

Beispiele: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
hex.dez. 
$00010000655361.0 Pixel
$0001c0001146881.75 Pixel
$fffec000-81920-1.25 Pixel
$fffe4000-114688-1.75 Pixel
+
+ +

Wichtig: Der Nachkommateil darf niemals +abgeschnitten werden! +

+

Um Schrittweiten aufzusummieren (z.B. von vqt_advance) und dann +die Pixelposition für die korrekte Positionierung des Cursors zu +berechnen, sollte man wie folgt vorgehen: +

+
int16_t fix31_to_pixel( fix31 a )
+{
+   int16_t b;
+
+   b = (int16_t) (( a + 32768L ) >> 16 ); /* runden !! */
+   return( b );                           /* Pixelwert zurückgeben */
+}
+
+

Querverweis: GDOS   NVDI   SpeedoGDOS +

+

7.14.7 FONT_HDR

+ +

Die folgende Struktur beschreibt den Datei-Header für einen +Bitmap Zeichensatz im Digital Research Standardformat. In +diesem Format wird der Font als breites, monochromes Rasterbild +organisiert; die Breite des Rasters ist die Summe aller +Zeichenbreiten, die Rasterhöhe entspricht der Höhe eines einzelnen +Zeichens. Daraus folgt: Der linke Rand eines Zeichens muss +nicht unbedingt auf eine Bytegrenze fallen; nur am Ende jeder +Rasterzeile wird soweit mit Null-Bits aufgefüllt, bis der nächste +Zeilenbeginn wieder auf eine Wortgrenze fällt. +

+
typedef struct font_hdr
+{
+   int16_t     font_id;        /* Zeichensatz-Nummer                    */
+   int16_t     point;          /* Größe in Punkten                      */
+   int8_t      name[32];       /* Name des Zeichensatzes                */
+   uint16_t    first_ade;      /* erstes Zeichen im Zeichensatz         */
+   uint16_t    last_ade;       /* letztes Zeichen im Zeichensatz        */
+   uint16_t    top;            /* Abstand: Topline     <-> Baseline     */
+   uint16_t    ascent;         /* Abstand: Ascentline  <-> Baseline     */
+   uint16_t    half;           /* Abstand: Halfline    <-> Baseline     */
+   uint16_t    descent;        /* Abstand: Descentline <-> Baseline     */
+   uint16_t    bottom;         /* Abstand: Bottomline  <-> Baseline     */
+   uint16_t    max_char_width; /* größte Zeichenbreite                  */
+   uint16_t    max_cell_width; /* größte Zeichenzellenbreite            */
+   uint16_t    left_offset;    /* linker Offset für Kursivschrift       */
+   uint16_t    right_offset;   /* rechter Offset für Kursivschrift      */
+   uint16_t    thicken;        /* Verbreiterungsfaktor für Fettschrift  */
+   uint16_t    ul_size;        /* Dicke der Unterstreichung             */
+   uint16_t    lighten;        /* Maske für helle Schrift (0x5555)      */
+   uint16_t    skew;           /* Maske für Kursivschrift (0x5555)      */
+   uint16_t    flags;          /* verschiedene Flags:
+                                  gesetzt falls System-Font
+                                  Bit-1: gesetzt falls Horizontal
+                                         Offset-Table benutzt wird
+                                  Bit-2: gesetzt falls Motorola-Format
+                                  Bit-3: gesetzt falls nicht proport.   */
+   uint8_t    *hor_table;      /* Zeiger auf Horizontal-Offset-Table    */
+   uint16_t    *off_table;     /* Zeiger auf Character-Offset-Table     */
+   uint16_t    *dat_table;     /* Zeiger auf Fontimage                  */
+   uint16_t    form_width;     /* Breite des Zeichensatz-Image          */
+   uint16_t    form_height;    /* Höhe des Zeichensatz-Image            */
+   font_hdr *next_font;        /* Zeiger auf nächsten Font-Header       */
+} FONT_HDR;
+
+

Hinweis: Da das GEM ursprünglich auf dem PC +entwickelt wurde, liegen alle Daten normalerweise im +Intel-Format vor, so daß auf Maschinen mit +Motorola-Prozessoren bei allen Wörtern oberes und unteres Byte +vertauscht werden müssen. Achtung: Um das Motorola/Intel-Flag +(Bit-2 der Komponente flags) abfragen zu können, muss +eigentlich schon bekannt sein, in welchem Format der Zeichensatz +vorliegt. Die Lösung des Problems: Davon ausgehen, dass Bit-10 der +Flags niemals benutzt sein wird, und testen, ob Bit-2 im 67-ten Byte +des Headers gesetzt ist (denn dann liegt der Zeichensatz im +Motorola-Format vor). +

+ +

Die Character-Offset-Table besitzt Einträge von +16-Bit-Werten, die den horizontalen Pixeloffset für jedes Zeichen +innerhalb des Fontrasters angibt. Als Index muss man also den +ASCII-Code abzüglich des ASCII-Codes des ersten Zeichens im +Zeichensatz benutzen (Komponente first_ade). Die Breite eines +Zeichens ergibt sich aus der Differenz zum Offsetwert des +nächsthöheren Zeichens; damit diese Formel auch für das letzte +Zeichen funktioniert, enthält die Tabelle übrigens stets einen +Eintrag mehr, als Zeichen verfügbar sind. +

+ +

Die Horizontal-Offset-Table enthält positive oder +negative Offsetwerte die vor der Ausgabe eines Zeichens auf die +x-Position addiert werden; sie wird allerdings nur bei wenigen +Zeichensätzen unterstützt. +

+

Last but not least sei darauf hingewiesen, daß sich eine +normale Anwendung niemals mit diesem Format befassen muß; lediglich +für Entwickler von Zeichensatzeditoren oder GDOS-Versionen sind diese +Informationen wichtig. +

+

Querverweis: +
GDOS   NVDI   SpeedoGDOS   Vektorfonts   vst_alignment   +vst_load_fonts   vst_unload_fonts   vqt_fontheader +

+

7.14.8 GCBITMAP

+
/*
+ * öffentliche Bitmapbeschreibung (Struktur
+ * mit Versionsheader)
+ */
+typedef struct _gcbitmap
+{
+   LONG       magic;      /* Strukturkennung 'cbtm' */
+   LONG       length;     /* Strukturlänge */
+   LONG       format;     /* Strukturformat (0) */
+   LONG       reserved;   /* reserviert (0) */
+   BYTE       *addr;      /* Adresse der Bitmap */
+   LONG       width;      /* Breite einer Zeile in Bytes */
+   LONG       bits;       /* Bittiefe */
+   ULONG      px_format;  /* Pixelformat */
+   LONG       xmin;       /* minimale diskrete
+                             x-Koordinate der Bitmap */
+   LONG       ymin;       /* minimale diskrete
+                             y-Koordinate der Bitmap */
+   LONG       xmax;       /* maximale diskrete
+                             x-Koordinate der Bitmap + 1 */
+   LONG       ymax;       /* maximale diskrete
+                             y-Koordinate der Bitmap + 1 */
+   CTAB_REF   ctab;       /* Verweis auf die Farbtabelle
+                             oder 0L */
+   ITAB_REF   itab;       /* Verweis auf die inverse Farbtabelle
+                             oder 0L */
+   LONG       reserved0;  /* reserviert
+                             (muß auf 0 gesetzt werden) */
+   LONG       reserved1;  /* reserviert
+                             (muß auf 0 gesetzt werden) */
+} GCBITMAP;
+
+

Querverweis: NVDI   v_open_bm   vr_transfer_bits +

+

7.14.9 MFDB

+

Der Memory Form Definition Block ist eine Datenstruktur, die vom +VDI für die Rasteroperationen benutzt wird, um die Ziel- und +Quellspeicherbereiche zu beschreiben. +

+

C-Deklaration: +

+
typedef struct mfdb
+{
+   VOID *fd_addr;                /* Zeiger auf den Beginn des   */
+                                 /* Speicherbereichs, z. B.     */
+                                 /* Bildspeicherbasisadresse    */
+   WORD  fd_w;                   /* Blockbreite in Pixeln       */
+   WORD  fd_h;                   /* Höhe des Blocks in Pixeln   */
+   WORD  fd_wdwidth;             /* Blockbreite in Integern     */
+   WORD  fd_stand;               /* 0 = geräteabhängiges Format */
+                                 /* 1 = Standardformat          */
+   WORD  fd_nplanes;             /* Anzahl der Farbebenen       */
+   WORD  fd_r1, fd_r2, fd_r3;    /* reserviert                  */
+} MFDB;
+
+

Hinweis: Wenn die Komponente fd_addr eine 0 +enthält, muß der Rest des MFDBs nicht ausgefüllt werden. Die +Rasteroperationen vrt_cpyfm und vro_cpyfm beziehen sich dann +automatisch auf den Bildschirm (oder im Fall eines Druckertreibers auf +die Druckerbitmap). Die reservierten Worte fd_r1, +fd_r2 und fd_r3 sollten hinsichtlich zukünftiger +Erweiterungen auf 0 gesetzt werden! +

+

Querverweis: Rasterformate   Rasterfunktionen +

+

7.14.10 POINT16

+
typedef struct                     /* Punkt für 16-Bit-Koordinaten */
+{
+   int16 x;
+   int16 y;
+} POINT16;
+
+

7.14.11 POINT32

+
typedef struct                     /* Punkt für 32-Bit-Koordinaten */
+{
+   int32 x;
+   int32 y;
+} POINT32;
+
+

7.14.12 pxyarray

+

wird im VDI benutzt um verschiedene grafische Objekte anhand von +mehreren Koordinatenpaaren (x,y) darzustellen. Beispiele für die +Anwendung des pxyarrays sind die Darstellung von Rechtecken. +

+
+ + + + + + + + + + + + + + + + +
pxyarray[0]x-Koordinate des oberen linken Eckpunktes
pxyarray[1]y-Koordinate des oberen linken Eckpunktes
pxyarray[2]x-Koordinate des unteren rechten Eckpunktes
pxyarray[3]y-Koordinate des unteren rechten Eckpunktes
+
+ +

oder allgemein von n Punktepaaren +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
pxyarray[0]x-Koordinate des ersten Punktepaares
pxyarray[1]y-Koordinate des ersten Punktepaares
pxyarray[2]x-Koordinate des zweiten Punktepaares
pxyarray[3]y-Koordinate des zweiten Punktepaares
: 
: 
: 
pxyarray[2*n - 2]x-Koordinate des n-ten Punktepaares
pxyarray[2*n - 1]y-Koordinate des n-ten Punktepaares
+
+ +

Querverweis: VDI   VDI-Bindings +

+

7.14.13 RECT16

+
typedef struct                 /* Rechteck für 16-Bit-Koordinaten */
+{
+   int16 x1;
+   int16 y1;
+   int16 x2;
+   int16 y2;
+} RECT16;
+
+

7.14.14 RECT32

+
typedef struct                 /* Rechteck für 32-Bit-Koordinaten */
+{
+   int32 x1;
+   int32 y1;
+   int32 x2;
+   int32 y2;
+} RECT32;
+
+

7.14.15 XFNT_INFO

+

Diese Struktur ist wie folgt definiert: +

+
typedef struct
+{
+   int32_t  size;            /* Länge der Struktur (vor Aufruf setzen!)  */
+   int16_t  format;          /* Fontformat                               */
+   int16_t  id;              /* Font-ID                                  */
+   int16_t  index;           /* Index                                    */
+   int8_t  font_name[50];    /* vollständiger Fontname                   */
+   int8_t  family_name[50];  /* Name der Fontfamilie                     */
+   int8_t  style_name[50];   /* Name des Fontstils                       */
+   int8_t  file_name1[200];  /* Name der 1. Fontdatei                    */
+   int8_t  file_name2[200];  /* Name der optionalen 2. Fontdatei         */
+   int8_t  file_name3[200];  /* Name der optionalen 3. Fontdatei         */
+   int16_t  pt_cnt;          /* Anzahl der Punkthöhen für vst_point      */
+   int16_t  pt_sizes[64];    /* verfügbare Punkthöhen                    */
+} XFNT_INFO;
+
+

Hinweis: Damit die Informationen in die Struktur +eingetragen werden, muß die Größe der Struktur in die Komponente +size eingetragen werden. +

+

Für die Komponente format gilt: +

+
+ + + + + + + + + + + + + + + + + + + + +
1=Bitmap-Font
2=Speedo-Font
4=TrueType-Font
8=Type 1-Font
+
+ +

Alle Zeichenketten sind null-terminierte Strings im C-Format. +Strukturelemente die nicht angefordert wurden, haben keinen +definierten Inhalt. +

+

Querverweis: GEM   NVDI   vqt_xfntinfo +

+
+ +Home +VDIVDI +VDI-FunktionslisteVDI-Funktionsliste +AESAES + + diff --git a/de/vidix_xbios_extension.html b/de/vidix_xbios_extension.html new file mode 100644 index 000000000..ae1b069c2 --- /dev/null +++ b/de/vidix_xbios_extension.html @@ -0,0 +1,1389 @@ + + + + + +Die Anleitung zum TOS: VIDIX-XBIOS-Erweiterung + + + + + + + + + +Home +XBIOSXBIOS +TastaturfunktionenTastaturfunktionen +XBIOS-FunktionslisteXBIOS-Funktionsliste + +
+ +

4.22 VIDIX-XBIOS-Erweiterung

+

VIDIX (VIDeo Interface for *niX) is a +programming interface for Unix-like operating systems that allows +direct access to the framebuffer of a video card. VIDIX integration +inside TOS (for CT60/CTPCI/Firebee) was added on January 24, 2007. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
vdxConfigPlayback      Prepare BES (BackEnd Scaler). +
vdxDestroy             Quit driver. +
vdxGetCapability       Get capability. +
vdxGetGrKeys           Get graphic keys. +
vdxGetVersion          Get version. +
vdxInit                Initialize driver. +
vdxPlaybackCopyFrame   Copy frame with DMA. +
vdxPlaybackFrameSelect Prepare frame. +
vdxPlaybackGetDeint    Get interlacing. +
vdxPlaybackGetEq       Get color correction. +
vdxPlaybackOff         Deactivate BES (BackEnd Scaler). +
vdxPlaybackOn          Activate BES (BackEnd Scaler). +
vdxPlaybackSetDeint    Set interlacing. +
vdxPlaybackSetEq       Set color correction. +
vdxProbe               Probe the board. +
vdxQueryDMAStatus      Get DMA status. +
vdxQueryFourcc         Request fourcc. +
vdxSetGrKeys           Set graphic keys. + +
+ +

4.22.1 vdxConfigPlayback

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »vdxConfigPlayback« - Prepare BES (BackEnd Scaler). +
  +
Xbiosnummer: 406 (0x0196) +
  +
Deklaration: int32_t vdxConfigPlayback ( vidix_playback_t *info ); +
  +
Beschreibung: Driver should prepare BES on this call. +
  +
APP pass to driver the following info: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Field Meaning +
vidix_playback_t.fourcc Contains fourcc of movie. +
vidix_playback_t.capability Currently contains a copy of vidix_capability_t.flags. +
vidix_playback_t.blend_factor Currently unused. +
vidix_playback_t.src x,y,w,h fields contain original movie size (in pixels) x and y +often are nulls. +
vidix_playback_t.src.pitch y, u, v fields contain source pitches for each Y,U,V plane in +bytes (For packed fourcc only Y value is used). They are hints for +driver to use same destinition pitches as in source memory (to speed +up memcpy process). Note: when source pitches are unknown or variable +these field will be filled into 0. +
vidix_playback_t.dest x,y,w,h fields contains destination rectangle on the screen in +pixels. +
vidix_playback_t.num_frames Maximal # of frames which can be used by APP. (Currently 10). + +
+ +
Driver should fill following fields: +
  + + + + + + + + + + + + + + + + + + + + + +
Field Meaning +
vidix_playback_t.num_frames Real # of frames which will be used by driver. (Should be less +or equal to app's num_frames). +
vidix_playback_t.dest.pitch y, u, v fields should contain alignment for each Y,U,V plane in +bytes. (For packed fourcc only Y value is used). +
vidix_playback_t.frame_size Driver should tell to app which size of source frame (src.w and +src.h) should use APP (according to pitches and offsets). +
vidix_playback_t.offsets Offsets from begin of BES memory for each frame. +
vidix_playback_t.offset y, u, v fields should contain offset for each Y,U,V plane +within frame. (For packed fourcc only Y value is used). +
vidix_playback_t.dga_addr Address of BES memory. + +
+ +
Also see this picture: +
  +
    VIDEO MEMORY layout:
+     +-----------  It's begin of video memory     End of video memory--------------+
+     |                                                                             |
+     v                                                                             v
+     [      RGB memory                         |         YUV memory    |  UNDEF    ]
+                                               ^
+                                               |
+                                               +---- begin of BES memory
+    BES MEMORY layout:
+     +-------- begin of BES memory
+     |
+     v
+     [ | |                      |       |       |
+       ^ ^                      ^       ^       ^
+       | |                      |       |       + BEGIN of second frame
+       | |                      |       + BEGIN of V plane
+       | |                      + BEGIN of U plane
+       | +------- BEGIN of Y plane
+       |
+       +--------- BEGIN of first frame
+
+
This means that in general case: +
offset of frame != offset of BES +
offset of Y plane != offset of first frame +
  +
But often: vidix_playback_t.offsets[0] = vidix_playback_t.offset.y = 0; +
  +
Formula: (For Y plane) copy source to: vidix_playback_t.dga_addr + +vidix_playback_t.offsets[i] + vidix_playback_t.offset.y +
  +
Ergebnis: Driver should return 0. +
  +
Verfügbar: CT60/CTPCI hardware acceleration board and FireBee. +
  +
Gruppe: VIDIX-XBIOS-Erweiterung +
  +
Querverweis: Binding   vdxPlaybackCopyFrame   vdxPlaybackFrameSelect   +vdxQueryDMAStatus   vdxQueryFourcc +
  + +
+ +

4.22.1.1 Bindings für vdxConfigPlayback

+ + + + + + +
C: int32_t vdxConfigPlayback ( vidix_playback_t *info ); +
  +
Assembler: +
  +
pea       info         ; Offset 2
+move.w    #406,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.22.2 vdxDestroy

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »vdxDestroy« - Destroy driver. +
  +
Xbiosnummer: 403 (0x0193) +
  +
Deklaration: void vdxDestroy ( void ); +
  +
Beschreibung: Quit the VIDIX driver. +
  +
Achtung: Diese Funktion ist optional. +
  +
Ergebnis: Nothing. +
  +
Verfügbar: CT60/CTPCI hardware acceleration board and FireBee. +
  +
Gruppe: VIDIX-XBIOS-Erweiterung +
  +
Querverweis: Binding   vdxInit +
  + +
+ +

4.22.2.1 Bindings für vdxDestroy

+ + + + + + +
C: void vdxDestroy ( void ); +
  +
Assembler: +
  +
move.w    #403,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

4.22.3 vdxGetCapability

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »vdxGetCapability« - Get capability. +
  +
Xbiosnummer: 404 (0x0194) +
  +
Deklaration: int32_t vdxGetCapability ( vidix_capability_t *to ); +
  +
Beschreibung: Driver should return capability with filled +vidix_capability_t.type field. +
  +
Ergebnis: Driver should return 0. +
  +
Verfügbar: CT60/CTPCI hardware acceleration board and FireBee. +
  +
Gruppe: VIDIX-XBIOS-Erweiterung +
  +
Querverweis: Binding   vdxGetVersion   vdxProbe +
  + +
+ +

4.22.3.1 Bindings für vdxGetCapability

+ + + + + + +
C: int32_t vdxGetCapability ( vidix_capability_t *to ); +
  +
Assembler: +
  +
pea       to           ; Offset 2
+move.w    #404,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.22.4 vdxGetGrKeys

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »vdxGetGrKeys« - Get graphic keys. +
  +
Xbiosnummer: 410 (0x019a) +
  +
Deklaration: int32_t vdxGetGrKeys ( vidix_grkey_t *grkey ); +
  +
Beschreibung: This interface should be tuned but introduced for overlapped +playback and video effects (TYPE_FX). +
  +
Achtung: Diese Funktion ist optional. +
  +
Ergebnis: Driver should return 0. +
  +
Verfügbar: CT60/CTPCI hardware acceleration board and FireBee. +
  +
Gruppe: VIDIX-XBIOS-Erweiterung +
  +
Querverweis: Binding   vdxSetGrKeys +
  + +
+ +

4.22.4.1 Bindings für vdxGetGrKeys

+ + + + + + +
C: int32_t vdxGetGrKeys ( vidix_grkey_t *grkey ); +
  +
Assembler: +
  +
pea       grkey        ; Offset 2
+move.w    #410,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.22.5 vdxGetVersion

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Get Version« - Get version. +
  +
Xbiosnummer: 400 (0x0190) +
  +
Deklaration: unsigned vdxGetVersion ( void ); +
  +
Beschreibung: Get the version. +
  +
Ergebnis: Version. +
  +
Verfügbar: CT60/CTPCI hardware acceleration board and FireBee. +
  +
Gruppe: VIDIX-XBIOS-Erweiterung +
  +
Querverweis: Binding   vdxGetCapability   vdxProbe +
  + +
+ +

4.22.5.1 Bindings für vdxGetVersion

+ + + + + + +
C: unsigned vdxGetVersion ( void ); +
  +
Assembler: +
  +
move.w    #400,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

4.22.6 vdxInit

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »vdxInit« - Initialize driver. +
  +
Xbiosnummer: 402 (0x0192) +
  +
Deklaration: int32_t vdxInit ( void ); +
  +
Beschreibung: Initialize the VIDIX driver. +
  +
Achtung: Diese Funktion ist optional. +
  +
Ergebnis: Driver should return 0. +
  +
Verfügbar: CT60/CTPCI hardware acceleration board and FireBee. +
  +
Gruppe: VIDIX-XBIOS-Erweiterung +
  +
Querverweis: Binding   vdxDestroy +
  + +
+ +

4.22.6.1 Bindings für vdxInit

+ + + + + + +
C: int32_t vdxInit ( void ); +
  +
Assembler: +
  +
move.w    #402,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

4.22.7 vdxPlaybackCopyFrame

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »vdxPlaybackCopyFrame« - Copy frame with DMA. +
  +
Xbiosnummer: 416 (0x01a0) +
  +
Deklaration: int32_t vdxPlaybackCopyFrame ( vidix_dma_t *dmai ); +
  +
Beschreibung: Function for copy frame with the DMA. +
  +
Achtung: Diese Funktion ist optional. +
  +
Ergebnis: Driver should return 0 else EINVAL, ERANGE, ENOMEM, E2BIG or +ENOSYS. +
  +
Verfügbar: CT60/CTPCI hardware acceleration board and FireBee. +
  +
Gruppe: VIDIX-XBIOS-Erweiterung +
  +
Querverweis: Binding   vdxConfigPlayback   vdxPlaybackFrameSelect   +vdxQueryDMAStatus   vdxQueryFourcc +
  + +
+ +

4.22.7.1 Bindings für vdxPlaybackCopyFrame

+ + + + + + +
C: int32_t vdxPlaybackCopyFrame ( vidix_dma_t *dmai ); +
  +
Assembler: +
  +
pea       dmai         ; Offset 2
+move.w    #416,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.22.8 vdxPlaybackFrameSelect

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »vdxPlaybackFrameSelect« - Prepare frame. +
  +
Xbiosnummer: 409 (0x0199) +
  +
Deklaration: int32_t vdxPlaybackFrameSelect ( uint32_t frame ); +
  +
Beschreibung: Driver should prepare and activate corresponded frame. This +function is used only for double and triple buffering and never used +for single buffering playback. +
  +
Achtung: Diese Funktion ist optional. +
  +
Ergebnis: Driver should return 0. +
  +
Verfügbar: CT60/CTPCI hardware acceleration board and FireBee. +
  +
Gruppe: VIDIX-XBIOS-Erweiterung +
  +
Querverweis: Binding   vdxConfigPlayback   vdxPlaybackCopyFrame   +vdxQueryDMAStatus   vdxQueryFourcc +
  + +
+ +

4.22.8.1 Bindings für vdxPlaybackFrameSelect

+ + + + + + +
C: int32_t vdxPlaybackFrameSelect ( uint32_t frame ); +
  +
Assembler: +
  +
move.l    frame,-(sp)  ; Offset 2
+move.w    #409,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.22.9 vdxPlaybackGetDeint

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »vdxPlaybackGetDeint« - Get interlacing. +
  +
Xbiosnummer: 414 (0x019e) +
  +
Deklaration: int32_t vdxPlaybackGetDeint ( vidix_deinterlace_t *info ); +
  +
Beschreibung: Function for get interlacing. +
  +
Achtung: Diese Funktion ist optional. +
  +
Ergebnis: Driver should return 0. +
  +
Verfügbar: CT60/CTPCI hardware acceleration board and FireBee. +
  +
Gruppe: VIDIX-XBIOS-Erweiterung +
  +
Querverweis: Binding   vdxPlaybackSetDeint +
  + +
+ +

4.22.9.1 Bindings für vdxPlaybackGetDeint

+ + + + + + +
C: int32_t vdxPlaybackGetDeint ( vidix_deinterlace_t *info ); +
  +
Assembler: +
  +
pea       info         ; Offset 2
+move.w    #414,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.22.10 vdxPlaybackGetEq

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »vdxPlaybackGetEq« - Get color correction. +
  +
Xbiosnummer: 412 (0x019c) +
  +
Deklaration: int32_t vdxPlaybackGetEq ( vidix_video_eq_t *eq ); +
  +
Beschreibung: Function for get color correction. +
  +
Achtung: Diese Funktion ist optional. +
  +
Ergebnis: Driver should return 0. +
  +
Verfügbar: CT60/CTPCI hardware acceleration board and FireBee. +
  +
Gruppe: VIDIX-XBIOS-Erweiterung +
  +
Querverweis: Binding   vdxPlaybackSetEq +
  + +
+ +

4.22.10.1 Bindings für vdxPlaybackGetEq

+ + + + + + +
C: int32_t vdxPlaybackGetEq ( vidix_video_eq_t *eq ); +
  +
Assembler: +
  +
pea       eq           ; Offset 2
+move.w    #412,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.22.11 vdxPlaybackOff

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »vdxPlaybackOff« - Deactivate BES. +
  +
Xbiosnummer: 408 (0x0198) +
  +
Deklaration: int32_t vdxPlaybackOff ( void ); +
  +
Beschreibung: Driver should deactivate BES on this call. +
  +
Ergebnis: Driver should return 0. +
  +
Verfügbar: CT60/CTPCI hardware acceleration board and FireBee. +
  +
Gruppe: VIDIX-XBIOS-Erweiterung +
  +
Querverweis: Binding   vdxPlaybackOn +
  + +
+ +

4.22.11.1 Bindings für vdxPlaybackOff

+ + + + + + +
C: int32_t vdxPlaybackOff ( void ); +
  +
Assembler: +
  +
move.w    #408,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

4.22.12 vdxPlaybackOn

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »vdxPlaybackOn« - Activate BES. +
  +
Xbiosnummer: 407 (0x0197) +
  +
Deklaration: int32_t vdxPlaybackOn ( void ); +
  +
Beschreibung: Driver should activate BES on this call. +
  +
Ergebnis: Driver should return 0. +
  +
Verfügbar: CT60/CTPCI hardware acceleration board and FireBee. +
  +
Gruppe: VIDIX-XBIOS-Erweiterung +
  +
Querverweis: Binding   vdxPlaybackOff +
  + +
+ +

4.22.12.1 Bindings für vdxPlaybackOn

+ + + + + + +
C: int32_t vdxPlaybackOn ( void ); +
  +
Assembler: +
  +
move.w    #407,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

4.22.13 vdxPlaybackSetDeint

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »vdxPlaybackSetDeint« - Set interlacing. +
  +
Xbiosnummer: 415 (0x019f) +
  +
Deklaration: int32_t vdxPlaybackSetDeint ( vidix_deinterlace_t *info ); +
  +
Beschreibung: Function for set interlacing. +
  +
Achtung: Diese Funktion ist optional. +
  +
Ergebnis: Driver should return 0. +
  +
Verfügbar: CT60/CTPCI hardware acceleration board and FireBee. +
  +
Gruppe: VIDIX-XBIOS-Erweiterung +
  +
Querverweis: Binding   vdxPlaybackGetDeint +
  + +
+ +

4.22.13.1 Bindings für vdxPlaybackSetDeint

+ + + + + + +
C: int32_t vdxPlaybackSetDeint ( vidix_deinterlace_t *info ); +
  +
Assembler: +
  +
pea       info         ; Offset 2
+move.w    #415,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.22.14 vdxPlaybackSetEq

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »vdxPlaybackSetEq« - Set color correction. +
  +
Xbiosnummer: 413 (0x019d) +
  +
Deklaration: int32_t vdxPlaybackSetEq ( vidix_video_eq_t *eq ); +
  +
Beschreibung: Function for set color correction. +
  +
Achtung: Diese Funktion ist optional. +
  +
Ergebnis: Driver should return 0. +
  +
Verfügbar: CT60/CTPCI hardware acceleration board and FireBee. +
  +
Gruppe: VIDIX-XBIOS-Erweiterung +
  +
Querverweis: Binding vdxPlaybackGetEq +
  + +
+ +

4.22.14.1 Bindings für vdxPlaybackSetEq

+ + + + + + +
C: int32_t vdxPlaybackSetEq ( vidix_video_eq_t *eq ); +
  +
Assembler: +
  +
pea       eq           ; Offset 2
+move.w    #413,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.22.15 vdxProbe

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »vdxProbe« - Probe the board. +
  +
Xbiosnummer: 401 (0x0191) +
  +
Deklaration: int32_t vdxProbe ( int32_t verbose, int32_t force ); +
  +
Beschreibung: Probe the board. verbose and force are unused +for the Atari driver. +
  +
Ergebnis: Driver should return 0 if it can handle something else ENXIO. +
  +
Verfügbar: CT60/CTPCI hardware acceleration board and FireBee. +
  +
Gruppe: VIDIX-XBIOS-Erweiterung +
  +
Querverweis: Binding   vdxGetCapability   vdxGetVersion +
  + +
+ +

4.22.15.1 Bindings für vdxProbe

+ + + + + + +
C: int32_t vdxProbe ( int32_t verbose, int32_t force ); +
  +
Assembler: +
  +
move.l    force,-(sp)  ; Offset 6
+move.l    verbose,-(sp); Offset 2
+move.w    #401,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+lea       10(sp),sp    ; Stack korrigieren
+
+ +
+ +

4.22.16 vdxQueryDMAStatus

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »vdxQueryDMAStatus« - Get DMA status. +
  +
Xbiosnummer: 417 (0x01a1) +
  +
Deklaration: int32_t vdxQueryDMAStatus ( void ); +
  +
Beschreibung: Function for get the status of the DMA after a +vdxPlaybackCopyFrame(). +
  +
Achtung: Diese Funktion ist optional. +
  +
Ergebnis: Driver should return 0 or 1 if busy, else ENOSYS. +
  +
Verfügbar: CT60/CTPCI hardware acceleration board and FireBee. +
  +
Gruppe: VIDIX-XBIOS-Erweiterung +
  +
Querverweis: Binding   vdxConfigPlayback   vdxPlaybackCopyFrame   +vdxPlaybackFrameSelect   vdxQueryFourcc +
  + +
+ +

4.22.16.1 Bindings für vdxQueryDMAStatus

+ + + + + + +
C: int32_t vdxQueryDMAStatus ( void ); +
  +
Assembler: +
  +
move.w    #417,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

4.22.17 vdxQueryFourcc

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »vdxQueryFourcc« - Request fourcc. +
  +
Xbiosnummer: 405 (0x0195) +
  +
Deklaration: int32_t vdxQueryFourcc ( vidix_fourcc_t *to ); +
  +
Beschreibung: Select requested fourcc, width and heigth. Driver should answer +- can it configure video memory for a given fourcc or not. +
  +
Ergebnis: Driver should return 0 else ENOSYS. +
  +
Verfügbar: CT60/CTPCI hardware acceleration board and FireBee. +
  +
Gruppe: VIDIX-XBIOS-Erweiterung +
  +
Querverweis: Binding   vdxConfigPlayback   vdxPlaybackCopyFrame   +vdxPlaybackFrameSelect   vdxQueryDMAStatus +
  + +
+ +

4.22.17.1 Bindings für vdxQueryFourcc

+ + + + + + +
C: int32_t vdxQueryFourcc ( vidix_fourcc_t *to ); +
  +
Assembler: +
  +
pea       to           ; Offset 2
+move.w    #405,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.22.18 vdxSetGrKeys

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »vdxSetGrKeys« - Set graphic keys. +
  +
Xbiosnummer: 411 (0x019b) +
  +
Deklaration: int32_t vdxSetGrKeys ( const vidix_grkey_t *grkey ); +
  +
Beschreibung: This interface should be tuned but introduced for overlapped +playback and video effects (TYPE_FX). +
  +
Achtung: Diese Funktion ist optional. +
  +
Ergebnis: Driver should return 0. +
  +
Verfügbar: CT60/CTPCI hardware acceleration board and FireBee. +
  +
Gruppe: VIDIX-XBIOS-Erweiterung +
  +
Querverweis: Binding   vdxGetGrKeys +
  + +
+ +

4.22.18.1 Bindings für vdxSetGrKeys

+ + + + + + +
C: int32_t vdxSetGrKeys ( const vidix_grkey_t *grkey ); +
  +
Assembler: +
  +
pea       grkey        ; Offset 2
+move.w    #411,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +
+ +Home +XBIOSXBIOS +TastaturfunktionenTastaturfunktionen +XBIOS-FunktionslisteXBIOS-Funktionsliste + + diff --git a/de/wdlg.html b/de/wdlg.html new file mode 100644 index 000000000..1a542b557 --- /dev/null +++ b/de/wdlg.html @@ -0,0 +1,2566 @@ + + + + + +Die Anleitung zum TOS: Fensterdialoge + + + + + + + + + +Home +AESAES +EreignisverwaltungEreignisverwaltung +FensterverwaltungFensterverwaltung + +
+ +

8.8 Fensterdialoge

+

Die folgenden Funktionen wurden mit MagiC 4 eingeführt und +erlauben die einfache Konstruktion von Dialogboxen in Fenstern: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
wdlg_close Fensterdialog schließen. +
wdlg_create Fensterdialog erstellen. +
wdlg_delete Fensterdialog schließen. +
wdlg_evnt Auswerten der Dialog-Events. +
wdlg_get_edit Aktuelles Edit-Feld ermitteln. +
wdlg_get_handle Fenster-Kennung eines Dialogs ermitteln. +
wdlg_get_tree Objektbaum des Fensters ermitteln. +
wdlg_get_udata Userdaten ermitteln. +
wdlg_open Fensterdialog öffnen. +
wdlg_redraw Zeichnet ein Objekt in einem Fensterdialog. +
wdlg_set_edit Edit-Feld im Dialog aktivieren. +
wdlg_set_iconify Fensterdialog ikonifizieren. +
wdlg_set_size Größe eines Dialogs verändern. +
wdlg_set_tree Neuen Objektbaum im Dialog verankern. +
wdlg_set_uniconify Fensterdialog unikonifizieren. + +
+ +

Hinweis: Die Existenz dieser Funktionen kann per appl_getinfo +(Opcode 7) festgestellt werden. +

+

Querverweis: Fensterverwaltung   Style-Guidelines   WDIALOG +

+

8.8.1 wdlg_close

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »WindowDialog Close« - Fensterdialog schließen. +
  +
AES-Nummer: 162 +
  +
Deklaration: int16_t wdlg_close ( DIALOG *dialog, int16_t *x, int16_t *y ); +
  +
Beschreibung: Die Funktion schließt den Fensterdialog dialog. +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
dialog Zeiger auf Verwaltungsstruktur +
x Zeiger auf eine Variable in der die letzte x-Koordinate des +Dialogs zurückgeliefert wird. +
y Zeiger auf eine Variable in der die letzte y-Koordinate des +Dialogs zurückgeliefert wird. + +
+ +
Hinweis: Alte WDIALOG-Versionen liefern nicht die +Fensterkoordinaten zurück. In diesem Fall trägt das Binding -1 ein, +so daß der Dialog beim nächsten Aufruf automatisch zentriert wird. +
  +
Ergebnis: Die Funktion liefert stets den Wert 1 zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Fensterdialoge +
  +
Querverweis: Binding   wdlg_open +
  + +
+ +

8.8.1.1 Bindings für wdlg_close

+ + + + + + + + + +
C: int16_t wdlg_close ( DIALOG *dialog, int16_t *x, int16_t *y ); +
  +
Umsetzung: +
  +
int16_t wdlg_close ( DIALOG *dialog, int16_t *x, int16_t *y )
+{
+  int_out[1] = -1;
+  int_out[2] = -1;
+
+  addr_in[0] = dialog;
+  crys_if (162);
+
+  *x = int_out[1];
+  *y = int_out[2];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]162 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]3 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]dialog
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.8.2 wdlg_create

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »WindowDialog Create« - Fensterdialog erstellen. +
  +
AES-Nummer: 160 +
  +
Deklaration: DIALOG *wdlg_create ( HNDL_OBJ handle_exit, OBJECT *tree, void +*user_data, int16_t code, void *data, int16_t flags ); +
  +
Beschreibung: Die Funktion fordert Speicherplatz für eine Dialogstruktur an, +und initialisiert diese. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle_exit Zeiger auf eine Service-Funktion +
tree Zeiger auf den Objektbaum +
user_data Zeiger auf Benutzerinformationen +
code wird in handle_exit über die Komponente clicks übergeben +
data wird in handle_exit über die Komponente data übergeben +
flags verschiedene Flags +
1 = Hintergrundbedienung zulassen + +
+ +
Ergebnis: Die Funktion liefert einen Zeiger auf die erstellte +Dialogstruktur zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Fensterdialoge +
  +
Querverweis: Binding   wdlg_open   wdlg_close +
  + +
+ +

8.8.2.1 Bindings für wdlg_create

+ + + + + + + + + +
C: DIALOG *wdlg_create ( HNDL_OBJ handle_exit, OBJECT *tree, void +*user_data, int16_t code, void *data, int16_t flags ); +
  +
Umsetzung: +
  +
DIALOG *wdlg_create ( HNDL_OBJ handle_exit, OBJECT *tree,
+                      void *user_data, int16_t code,
+                      void *data, int16_t flags )
+{
+   addr_in[0] = handle_exit;
+   addr_in[1] = tree;
+   addr_in[2] = user_data;
+   addr_in[3] = data;
+
+   int_in[0] = code
+   int_in[1] = flags;
+
+   crys_if (160);
+
+   return ( addr_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]160 # Opcode der Funktion
control+2control[1]2 # Einträge in int_in
control+4control[2]0 # Einträge in int_out
control+6control[3]4 # Einträge in addr_in
control+8control[4]1 # Einträge in addr_out
addr_inaddr_in[0]handle_exit
addr_in+4addr_in[1]tree
addr_in+8addr_in[2]user_data
addr_in+12addr_in[3]data
int_inint_in[0]code
int_in+2int_in[1]flags
addr_outaddr_out[0]Return-Wert
+
+ + +
+ +

8.8.3 wdlg_delete

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »WindowDialog Delete« - Fensterdialog schließen. +
  +
AES-Nummer: 163 +
  +
Deklaration: int16_t wdlg_delete ( DIALOG *dialog ); +
  +
Beschreibung: Die Funktion gibt den Speicherplatz für einen Fensterdialog +wieder frei. Es gilt: +
  +

+
+ + + + + + + + +
ParameterBedeutung
dialogZeiger auf den Dialog
+
+ +
Ergebnis: Die Funktion liefert stets den Wert 1 zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Fensterdialoge +
  +
Querverweis: Binding   wdlg_close +
  + +
+ +

8.8.3.1 Bindings für wdlg_delete

+ + + + + + + + + +
C: int16_t wdlg_delete ( DIALOG *dialog ); +
  +
Umsetzung: +
  +
int16_t wdlg_delete ( DIALOG *dialog )
+{
+   addr_in[0] = dialog;
+   crys_if (163);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]163 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]dialog
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.8.4 wdlg_evnt

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »WindowDialog Event« - Dialogbearbeitung. +
  +
AES-Nummer: 166 +
  +
Deklaration: int16_t wdlg_evnt ( DIALOG *dialog, EVNT *events ); +
  +
Beschreibung: Die Funktion dient zur Auswertung bzw. Bearbeitung von +Ereignissen eines Fensterdialogs. Es gilt: +
  +

+
+ + + + + + + + + + + + +
ParameterBedeutung
dialogZeiger auf den Dialog
eventsZeiger auf EVNT-Struktur
+
+ +
Hinweis: Diese Funktion muß im Event-Loop aufgerufen +werden. Im Bitvektor mwhich der EVNT-Struktur werden die +Ereignis-Bits gelöscht, die sich auf den Fensterdialog beziehen. Nach +dem Aufruf dieser Funktion kann die EVNT-Struktur von der +Applikation zur Auswertung der für sie bestimmten Events benutzt +werden. +
  +
Falls die Funktion den Wert 0 zurückliefert, muß der Dialog +(per wdlg_close geschlossen werden. +
  +
Achtung: Das Iconifying wird nicht von dieser +Funktion unterstützt. Wird der Iconifier bei wdlg_open als +Fensterelement angemeldet muß daher dieses Ereignis selbst +ausgewertet und behandelt werden. Das gleiche gilt, wenn man den Sizer +als Element anmeldet. +
  +
Ergebnis: Die Funktion liefert den Wert 1 zurück, wenn kein Fehler +aufgetreten ist. Bei einem Rückgabewert von 0 muß der Dialog +geschlossen werden. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Fensterdialoge +
  +
Querverweis: Binding   wdlg_open   wdlg_close +
  + +
+ +

8.8.4.1 Bindings für wdlg_evnt

+ + + + + + + + + +
C: int16_t wdlg_evnt ( DIALOG *dialog, EVNT *events ); +
  +
Umsetzung: +
  +
int16_t wdlg_evnt ( DIALOG *dialog, EVNT *events )
+{
+   addr_in[0] = dialog;
+   addr_in[1] = events;
+
+   crys_if (166);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]166 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]dialog
addr_in+4addr_in[1]events
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.8.5 wdlg_get_edit

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »WindowDialog GetEdit« - aktuelles Editfeld ermitteln. +
  +
AES-Nummer: 164 (Unterfunktion 1) +
  +
Deklaration: int16_t wdlg_get_edit ( DIALOG *dialog, int16_t *cursor ); +
  +
Beschreibung: Die Funktion ermittelt die Nummer des aktuellen Editobjektes. +Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
dialog Zeiger auf den Dialog +
cursor Index des Zeichens + +
+ +
Achtung: In alten WDIALOG-Versionen wird der Parameter +cursor nicht zurückgeliefert; das Binding in WDIAL_A.S (vgl. +original MagiC Dokumentation) sorgt dafür, daß in diesem Fall der +Wert -1 eingetragen wird. +
  +
Ergebnis: Die Funktion liefert die Nummer des aktuellen Editobjektes +zurück. Ein Wert von 0 bedeutet, daß momentan kein Editobjekt aktiv +ist. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Fensterdialoge +
  +
Querverweis: Binding   wdlg_open   wdlg_close +
  + +
+ +

8.8.5.1 Bindings für wdlg_get_edit

+ + + + + + + + + +
C: int16_t wdlg_get_edit ( DIALOG *dialog, int16_t *cursor ); +
  +
Umsetzung: +
  +
int16_t wdlg_get_edit ( DIALOG *dialog, int16_t *cursor )
+{
+   addr_in[0] = dialog;
+
+   int_in[0] = 1;
+
+   int_out[1] = -1;
+
+   crys_if (164);
+
+   *cursor = int_out[1];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]164 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]2 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]dialog
int_inint_in[0]1 # Unterfunktion
int_outint_out[0]Return-Wert
int_out+2int_out[1]cursor
+
+ + +
+ +

8.8.6 wdlg_get_handle

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »WindowDialog Get Window Handle« - Fensterkennung eines +Dialogs ermitteln. +
  +
AES-Nummer: 164 (Unterfunktion 3) +
  +
Deklaration: int16_t wdlg_get_handle ( DIALOG *dialog ); +
  +
Beschreibung: Die Funktion ermittelt die Fensterkennung (Window-Handle) eines +Fensterdialogs. Es gilt: +
  +

+
+ + + + + + + + +
ParameterBedeutung
dialogZeiger auf den Dialog
+
+ +
Ergebnis: Die Funktion liefert die AES-Fensterkennung des Dialogs +zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Fensterdialoge +
  +
Querverweis: Binding   wind_find +
  + +
+ +

8.8.6.1 Bindings für wdlg_get_handle

+ + + + + + + + + +
C: int16_t wdlg_get_handle ( DIALOG *dialog ); +
  +
Umsetzung: +
  +
int16_t wdlg_get_handle ( DIALOG *dialog )
+{
+   addr_in[0] = dialog;
+   int_in[0] = 3;
+   crys_if (164);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]164 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]dialog
int_inint_in[0]3 # Unterfunktion
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.8.7 wdlg_get_tree

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »WindowDialog GetTree« - Objektbaum des Fensters ermitteln. +
  +
AES-Nummer: 164 (Unterfunktion 0) +
  +
Deklaration: int16_t wdlg_get_tree ( DIALOG *dialog, OBJECT **tree, GRECT *r +); +
  +
Beschreibung: Die Funktion ermittelt die Adresse des im Fenster angezeigten +Objektbaumes. Es gilt: +
  +

+
+ + + + + + + + + + + + + + + + +
ParameterBedeutung
dialogZeiger auf den Dialog
treeZeiger auf den Zeiger des Objektbaums
rZeiger auf die Rechtecksbeschreibung
+
+ +
Hinweis: Darüber hinaus liefert die Funktion die +Größe der Arbeitsfläche des Fensters zurück. Sofern die +Dialoggröße nicht mit wdlg_set_size verändert wurde, +entspricht die Arbeitsfläche des Fensters dem GRECT des +Wurzelobjektes. +
  +
Ergebnis: Die Funktion liefert stets den Wert 1 zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Fensterdialoge +
  +
Querverweis: Binding   wdlg_get_handle +
  + +
+ +

8.8.7.1 Bindings für wdlg_get_tree

+ + + + + + + + + +
C: int16_t wdlg_get_tree ( DIALOG *dialog, OBJECT **tree, GRECT *r +); +
  +
Umsetzung: +
  +
int16_t wdlg_get_tree ( DIALOG *dialog, OBJECT **tree,
+                        GRECT *r )
+{
+   addr_in[0] = dialog;
+   addr_in[1] = tree;
+   addr_in[2] = r;
+
+   int_in[0] = 0;
+   crys_if (164);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]164 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]3 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]dialog
addr_in+4addr_in[1]tree
addr_in+8addr_in[2]r
int_inint_in[0]0 # Unterfunktion
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.8.8 wdlg_get_udata

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »WindowDialog Get User Data« - ermittelt die Userdaten eines +Fensterdialogs. +
  +
AES-Nummer: 164 (Unterfunktion 2) +
  +
Deklaration: void *wdlg_get_udata ( DIALOG *dialog ); +
  +
Beschreibung: Die Funktion ermittelt die Userdaten eines Dialogs. Es gilt: +
  +

+
+ + + + + + + + +
ParameterBedeutung
dialogZeiger auf den Dialog
+
+ +
Hinweis: Die Funktion liefert die Variable +user_data zurück, die beim Aufruf von wdlg_create übergeben +worden ist. +
  +
Ergebnis: Die Funktion liefert einen Zeiger auf die Userdaten zurück, +d.h. einen Zeiger auf die Variable user_data, die beim Aufruf +von wdlg_create übergeben wurde. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Fensterdialoge +
  +
Querverweis: Binding   wdlg_get_handle +
  + +
+ +

8.8.8.1 Bindings für wdlg_get_udata

+ + + + + + + + + +
C: void *wdlg_get_udata ( DIALOG *dialog ); +
  +
Umsetzung: +
  +
void *wdlg_get_udata ( DIALOG *dialog )
+{
+   addr_in[0] = dialog;
+   int_in[0] = 2;
+   crys_if (164);
+
+   return ( addr_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]164 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]0 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]1 # Einträge in addr_out
addr_inaddr_in[0]dialog
int_inint_in[0]2 # Unterfunktion
addr_outaddr_out[0]Return-Wert
+
+ + +
+ +

8.8.9 wdlg_open

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »WindowDialog Open« - öffnet einen Fensterdialog. +
  +
AES-Nummer: 161 +
  +
Deklaration: int16_t wdlg_open ( DIALOG *dialog, int8_t *title, int16_t +kind, int16_t x, int16_t y, int16_t code, void *data ); +
  +
Beschreibung: Die Funktion öffnet einen Fensterdialog auf dem Bildschirm. Es +gilt: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
dialogZeiger auf den Dialog
titleFenstername oder NULL
kindKomponenten des Fensters (NAME/MOVER/CLOSER)
xx-Koordinate
yy-Koordinate des Dialogs
codewird handle_exit in der Komponente clicks übergeben
datawird handle_exit in der Komponente data übergeben
+
+ +
Hinweis: Bevor die Funktion zum Aufrufer zurückkehrt, +wird noch die Serviceroutine handle_exit mit der +Funktionsnummer HNDL_OPEN aufgerufen. Bei Koordinaten von (-1,-1) wird +der Dialog zentriert dargestellt. +
  +
Ergebnis: Die Funktion liefert die Fensterkennung des Dialogs zurück, +bzw. im Fehlerfall den Wert 0. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Fensterdialoge +
  +
Querverweis: Binding   wdlg_close   wdlg_delete +
  + +
+ +

8.8.9.1 Bindings für wdlg_open

+ + + + + + + + + +
C: int16_t wdlg_open ( DIALOG *dialog, int8_t *title, int16_t +kind, int16_t x, int16_t y, int16_t code, void *data ); +
  +
Umsetzung: +
  +
int16_t wdlg_open ( DIALOG *dialog, int8_t *title,
+                    int16_t kind, int16_t x,
+                    int16_t y, int16_t code, void *data )
+{
+   addr_in[0] = dialog;
+   addr_in[1] = title;
+   addr_in[2] = data;
+
+   int_in[0] = kind;
+   int_in[1] = x;
+   int_in[2] = y;
+   int_in[3] = code;
+
+   crys_if (161);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]161 # Opcode der Funktion
control+2control[1]4 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]3 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]dialog
addr_in+4addr_in[1]title
addr_in+8addr_in[2]data
int_inint_in[0]kind
int_in+2int_in[1]x
int_in+4int_in[2]y
int_in+6int_in[3]code
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.8.10 wdlg_redraw

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »WindowDialog Redraw« - Objekt in einem Dialog zeichnen. +
  +
AES-Nummer: 167 +
  +
Deklaration: void wdlg_redraw ( DIALOG *dialog, GRECT *rect, int16_t obj, +int16_t depth ); +
  +
Beschreibung: Die Funktion zeichnet ein Objekt in einem Dialog, unter +Beachtung der Rechteckliste des Fensters. Es gilt: +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
dialogZeiger auf den Dialog
rectZeiger auf das begrenzende Rechteck
objNummer des Startobjektes
depthAnzahl der zu zeichnenden Ebenen
+
+ +
Hinweis: Um ein Objekt innerhalb des Dialogs zu +zeichnen, sollte immer diese Funktion und nicht objc_draw +verwendet werden. Vor Anwendung der Funktion ist wie üblich ein +Aufruf von wind_update nötig. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Fensterdialoge +
  +
Querverweis: Binding   objc_draw   WM_REDRAW +
  + +
+ +

8.8.10.1 Bindings für wdlg_redraw

+ + + + + + + + + +
C: void wdlg_redraw ( DIALOG *dialog, GRECT *rect, int16_t obj, +int16_t depth ); +
  +
Umsetzung: +
  +
void wdlg_redraw ( DIALOG *dialog, GRECT *rect, int16_t obj,
+                   int16_t depth )
+{
+   addr_in[0] = dialog;
+   addr_in[1] = rect;
+
+   int_in[0] = obj;
+   int_in[1] = depth;
+   crys_if (167);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]167 # Opcode der Funktion
control+2control[1]2 # Einträge in int_in
control+4control[2]0 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]dialog
addr_in+4addr_in[1]rect
int_inint_in[0]obj
int_in+2int_in[1]depth
+
+ + +
+ +

8.8.11 wdlg_set_edit

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »WindowDialog Set Edit Object« - Editfeld im Dialog +aktivieren. +
  +
AES-Nummer: 165 (Unterfunktion 0) +
  +
Deklaration: int16_t wdlg_set_edit ( DIALOG *dialog, int16_t obj ); +
  +
Beschreibung: Die Funktion aktiviert ein Editfeld eines Fensterdialogs. Es +gilt: +
  +

+
+ + + + + + + + + + + + +
ParameterBedeutung
dialogZeiger auf den Dialog
objNummer des neuen Edit-Objekts bzw. 0, falls keins aktiv sein soll
+
+ +
Hinweis: Aktivieren bedeutet in diesem Zusammenhang, +daß der Cursor im angegebenen Objekt gezeichnet, und in einem evtl. +vorher aktiven Objekt gelöscht wird. +
  +
Ergebnis: Die Funktion liefert die Nummer des aktuellen Editobjekts +zurück. Ein Wert von 0 bedeutet, daß kein solches aktiv ist. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Fensterdialoge +
  +
Querverweis: Binding   wdlg_open   wdlg_close +
  + +
+ +

8.8.11.1 Bindings für wdlg_set_edit

+ + + + + + + + + +
C: int16_t wdlg_set_edit ( DIALOG *dialog, int16_t obj ); +
  +
Umsetzung: +
  +
int16_t wdlg_set_edit ( DIALOG *dialog, int16_t obj )
+{
+   addr_in[0] = dialog;
+
+   int_in[0] = 0;
+   int_in[1] = obj;
+
+   crys_if (165);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]165 # Opcode der Funktion
control+2control[1]2 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]dialog
int_inint_in[0]0 # Unterfunktion
int_in+2int_in[1]obj
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.8.12 wdlg_set_iconify

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »WindowDialog Iconify« - Fensterdialog ikonifizieren. +
  +
AES-Nummer: 165 (Unterfunktion 3) +
  +
Deklaration: int16_t wdlg_set_iconify ( DIALOG *dialog, GRECT *g, int8_t +*title, OBJECT *tree, int16_t obj ); +
  +
Beschreibung: Die Funktion ermöglicht das Ikonifizieren eines +Fensterdialogs. Es gilt: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
dialogZeiger auf den Dialog
gneue Position des Fensters
titleneuer Fenstertitel, oder NULL
treeneuer Fensterbaum, oder NULL
objzu zentrierendes Objekt, oder -1
+
+ +
Hinweis: Die neue Position des Fensters wird man +normalerweise von der Nachricht WM_ICONIFY übernehmen; es ist aber +auch möglich durch Koordinaten von -1,-1,-1,-1 diese direkt von MagiC +ermitteln zu lassen. +
  +
Die Funktion ändert die Position und Größe des +Wurzelobjektes. Da man i.a. für ikonifizierte Fenster einen anderen +Objektbaum anzeigen möchte, kann dieser im Parameter tree +angegeben werden. Der Objektbaum besteht normalerweise nur aus einem +Wurzelobjekt (G_BOX) und einem anzuzeigenden Icon vom Typ G_ICON oder +G_CICON. Soll das Icon im Fenster zentriert dargestellt werden, so +übergibt man dessen Objektnummer im Parameter obj. +
  +
Beim Setzen eines neuen Fenstertitels ist zu beachten, dass der +Aufrufer bei einem späteren Unikonify den alten Titel selbst +restaurieren muss. +
  +
Ergebnis: Die Funktion liefert stets den Wert 1 zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. Diese Funktion ist erst ab WDIALOG 1.05 +vorhanden. Wenn sie nicht vorhanden ist, enthält intout[0] eine 0. +
  +
Gruppe: Fensterdialoge +
  +
Querverweis: Binding   wdlg_set_uniconify +
  + +
+ +

8.8.12.1 Bindings für wdlg_set_iconify

+ + + + + + + + + +
C: int16_t wdlg_set_iconify ( DIALOG *dialog, GRECT *g, int8_t +*title, OBJECT *tree, int16_t obj ); +
  +
Umsetzung: +
  +
int16_t wdlg_set_iconify ( DIALOG *dialog, GRECT *g,
+                           int8_t *title,
+                           OBJECT *tree, int16_t obj )
+{
+   addr_in[0] = dialog;
+   addr_in[1] = g;
+   addr_in[2] = title;
+   addr_in[3] = tree;
+
+   int_in[0] = 3;
+   int_in[1] = obj;
+
+   crys_if (165);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]165 # Opcode der Funktion
control+2control[1]2 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]4 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]dialog
addr_in+4addr_in[1]g
addr_in+8addr_in[2]title
addr_in+12addr_in[3]tree
int_inint_in[0]3 # Unterfunktion
int_in+2int_in[1]obj
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.8.13 wdlg_set_size

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »WindowDialog Set Size« - Größe eines Dialogs verändern. +
  +
AES-Nummer: 165 (Unterfunktion 2) +
  +
Deklaration: int16_t wdlg_set_size ( DIALOG *dialog, GRECT *new_size ); +
  +
Beschreibung: Die Funktion ermöglicht es, die Größe eines Fensterdialogs +zu verändern. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
dialog Zeiger auf den Dialog +
new_size neue Position und Größe der Arbeitsfläche des Fensters + +
+ +
Hinweis: Die Funktion ändert weder Position noch +Größe des Wurzelobjektes. Soll dieses verschoben oder vergrößert +werden, so müssen die Objektausmaße vor dem Aufruf der +Funktion geändert werden. +
  +
Achtung: Die Buttons müssen sich immer vollständig +innerhalb der Arbeitsfläche des Fensters befinden, da form_button die +Rechteckliste nicht beachtet. Der normale Anwendungsfall für +diese Funktion sind vergrößerbare Dialoge, die ein Sizer-Objekt in +der rechten unteren Ecke enthalten. +
  +
Ergebnis: Die Funktion liefert stets den Wert 1 zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Fensterdialoge +
  +
Querverweis: Binding   wdlg_open   wdlg_close +
  + +
+ +

8.8.13.1 Bindings für wdlg_set_size

+ + + + + + + + + +
C: int16_t wdlg_set_size ( DIALOG *dialog, GRECT *new_size ); +
  +
Umsetzung: +
  +
int16_t wdlg_set_size ( DIALOG *dialog, GRECT *new_size )
+{
+   addr_in[0] = dialog;
+   addr_in[1] = new_size;
+
+   int_in[0] = 2;
+   crys_if (165);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]165 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]dialog
addr_in+4addr_in[1]new_size
int_inint_in[0]2 # Unterfunktion
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.8.14 wdlg_set_tree

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »WindowDialog Set Tree« - neuen Objektbaum im Dialog +verankern. +
  +
AES-Nummer: 165 (Unterfunktion 1) +
  +
Deklaration: int16_t wdlg_set_tree ( DIALOG *dialog, OBJECT *new_tree ); +
  +
Beschreibung: Die Funktion verankert einen neuen Objektbaum in einem Dialog. +Es gilt: +
  +

+
+ + + + + + + + + + + + +
ParameterBedeutung
dialogZeiger auf den Dialog
new_treeNeuer Objektbaum
+
+ +
Hinweis: Falls das neue Wurzelobjekt eine andere Größe +hat, wird die Fenstergröße automatisch angepaßt; der Fensterinhalt +wird in jedem Fall aktualisiert. +
  +
Ergebnis: Die Funktion liefert stets den Wert 1 zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. +
  +
Gruppe: Fensterdialoge +
  +
Querverweis: Binding   wdlg_open   wdlg_close +
  + +
+ +

8.8.14.1 Bindings für wdlg_set_tree

+ + + + + + + + + +
C: int16_t wdlg_set_tree ( DIALOG *dialog, OBJECT *new_tree ); +
  +
Umsetzung: +
  +
int16_t wdlg_set_tree ( DIALOG *dialog, OBJECT *new_tree )
+{
+   addr_in[0] = dialog;
+   addr_in[1] = new_tree;
+
+   int_in[0] = 1;
+   crys_if (165);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]165 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]2 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]dialog
addr_in+4addr_in[1]new_tree
int_inint_in[0]1 # Unterfunktion
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.8.15 wdlg_set_uniconify

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »WindowDialog Uniconify« - Fensterdialog unikonifizieren. +
  +
AES-Nummer: 165 (Unterfunktion 4) +
  +
Deklaration: int16_t wdlg_set_uniconify ( DIALOG *dialog, GRECT *g, int8_t +*title, OBJECT *tree ); +
  +
Beschreibung: Die Funktion ermöglicht das Unikonifizieren eines +Fensterdialogs. Es gilt: +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
dialogZeiger auf den Dialog
gneue Position des Fensters
titleneuer Fenstertitel, oder NULL
treeneuer Fensterbaum, oder NULL
+
+ +
Hinweis: Die neue Position des Fensters wird man +normalerweise von der Nachricht WM_UNICONIFY übernehmen. +
  +
Die Funktion ändert die Position und Größe des +Wurzelobjektes. Da man i.a. für ikonifizierte Fenster einen anderen +Objektbaum angezeigt hatte, kann der ursprüngliche Baum im Parameter +tree angegeben und damit zurückgesetzt werden. Über den +Parameter title kann der alte Fenstertitel gesetzt werden, der +vor dem Ikonify gültig war. +
  +
Ergebnis: Die Funktion liefert stets den Wert 1 zurück. +
  +
Verfügbar: Das Vorhandensein dieser Funktion kann per appl_getinfo (Opcode 7) +festgestellt werden. Diese Funktion ist erst ab WDIALOG 1.05 +vorhanden. Wenn sie nicht vorhanden ist, enthält intout[0] eine 0. +
  +
Gruppe: Fensterdialoge +
  +
Querverweis: Binding   wdlg_set_iconify +
  + +
+ +

8.8.15.1 Bindings für wdlg_set_uniconify

+ + + + + + + + + +
C: int16_t wdlg_set_uniconify ( DIALOG *dialog, GRECT *g, int8_t +*title, OBJECT *tree ); +
  +
Umsetzung: +
  +
int16_t wdlg_set_uniconify ( DIALOG *dialog, GRECT *g,
+                             int8_t *title, OBJECT *tree )
+{
+   addr_in[0] = dialog;
+   addr_in[1] = g;
+   addr_in[2] = title;
+   addr_in[3] = tree;
+
+   int_in[0] = 4;
+
+   crys_if (165);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]165 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]4 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]dialog
addr_in+4addr_in[1]g
addr_in+8addr_in[2]title
addr_in+12addr_in[3]tree
int_inint_in[0]4 # Unterfunktion
int_outint_out[0]Return-Wert
+
+ + +
+ +
+ +Home +AESAES +EreignisverwaltungEreignisverwaltung +FensterverwaltungFensterverwaltung + + diff --git a/de/wind.html b/de/wind.html new file mode 100644 index 000000000..8ec7fa20f --- /dev/null +++ b/de/wind.html @@ -0,0 +1,6658 @@ + + + + + +Die Anleitung zum TOS: Fensterverwaltung + + + + + + + + + +Home +AESAES +FensterdialogeFensterdialoge +FileselektorenFileselektoren + +
+ +

8.9 Fensterverwaltung

+

Diese Bibliothek stellt Funktionen zur Verfügung um Fenster zu +erzeugen, zu öffnen, zu schließen und vieles mehr. Insgesamt stehen +die folgenden Routinen zur Verfügung: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
sys_set_winframe_manager Installieren eines neuen Fensterrahmen-Manager +
wind_apfind Applikation-ID anhand einer Fensterpositionsangabe ermitteln. +
wind_calc Fensterdimensionen berechnen. +
wind_close Fenster schließen. +
wind_create Fenster erzeugen. +
wind_delete Fenster löschen. +
wind_draw Fensterelemente neu Zeichnen. +
wind_find Fensterhandle anhand einer Positionsangabe ermitteln. +
wind_get Eigenschaften eines Fensters ermitteln. +
wind_new Alle Fenster löschen. +
wind_open Fenster öffnen. +
wind_set Eigenschaften eines Fensters verändern. +
wind_update Bildschirmoperationen sperren oder freigeben. +
wind_xget Eigenschaften eines Fensters ermitteln, erweiterte Version. +
wind_xset Eigenschaften eines Fensters verändern, erweiterte Version. +
x_wdial_change Zeichnet ein Objekt in einem Fensterdialog neu. +
x_wdial_draw Fenster mit eine Dialog neu zeichnen. +
x_wind_calc Fensterdimensionen berechnen, erweiterte Version. +
x_wind_create Meldet ein neues Fenster an, erweiterte Version. +
x_wind_tree Change window gadgets + +
+ +

Hinweis: Unter MagiC sollte eine einzelne Applikation +nicht mehr als 16 Fenster benutzen, da sonst der Nachrichtenpuffer des +Systems überlaufen kann, und evtl. Redraws nicht mehr ausgeführt +werden können. +

+

Querverweis: +
Komponenten eines Fensters   Style-Guidelines   Fensterdialoge   +Übersicht der wind_get/set Unterfunktionen   wind_get und wind_set mode von Geneva +

+

8.9.1 wind_apfind

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Find Window owner« - sucht Applikation-ID des Besitzers des +Fensters zu einem bestimmten Punkt. +
  +
AES-Nummer: 119 (0x0077) +
  +
Deklaration: int16_t wind_apfind ( int16_t wi_fmx, int16_t wi_fmy ); +
  +
Beschreibung: Die Funktion ermittelt die Applikation-ID des Besitzers des +Fensters, welches sich an einer bestimmten Position befindet. Es gilt: +
  +

+
+ + + + + + + + + + + + +
ParameterBedeutung
wi_fmxx-Koordinate
wi_fmyy-Koordinate
+
+ +
Ergebnis: Die Funktion liefert die entsprechende Applikation-ID zurück. +Der Wert 0 steht dabei für den Desktop, -1 bedeutet, dass sich kein +Fenster an der angegebenen Position befindet. +
  +
Verfügbar: MultiGEM II. +
  +
Gruppe: Fensterverwaltung +
  +
Querverweis: Binding   wind_find   wind_get +
  + +
+ +

8.9.1.1 Bindings für wind_apfind

+ + + + + + + + + +
C: int16_t wind_apfind ( int16_t wi_fmx, int16_t wi_fmy ); +
  +
Umsetzung: +
  +
int16_t wind_apfind (int16_t wi_fmx, int16_t wi_fmy)
+{
+   int_in[0]  = wi_fmx;
+   int_in[1]  = wi_fmy;
+
+   return ( crys_if(119) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]119 # Opcode der Funktion
control+2control[1]2 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]wi_fmx
int_in+2int_in[1]wi_fmy
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.9.2 wind_calc

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Window Calculation« - berechnet die Grenzen oder den +gesamten Platzbedarf eines Fensters. +
  +
AES-Nummer: 108 +
  +
Deklaration: int16_t wind_calc ( int16_t wi_ctype, int16_t wi_ckind, int16_t +wi_cinx, int16_t wi_ciny, int16_t wi_cinw, int16_t wi_cinh, int16_t +*coutx, int16_t *couty, int16_t *coutw, int16_t *couth ); +
  +
Beschreibung: Die Funktion berechnet für ein Fenster die Größe des +Randbereichs aus den Koordinaten des Arbeitsbereichs oder umgekehrt. +Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
wi_ctype 0 = WC_BORDER berechnet die Koordinaten des Randbereichs aus +den Koordinaten des Arbeitsbereichs in den Parametern wi_cinx, +wi_ciny, wi_cinw und wi_cinh. +
1 = WC_WORK berechnet die Koordinaten des Arbeitsbereichs aus den +Koordinaten des Randbereichs in den Parametern wi_cinx, +wi_ciny, wi_cinw und wi_cinh. +
wi_ckind ein Integerparameter der alle Komponenten des Fenster beeinhaltet, +Format wie in wind_create +
wi_cinx x-Koordinate +
wi_ciny y-Koordinate +
wi_cinw Breite +
wi_cinh Höhe des Fensters (bereits bekannt) +
coutx x-Koordinate +
couty y-Koordinate +
coutw Breite +
couth Höhe der berechneten Komponente + +
+ +
Hinweis: Man sollte niemals davon ausgehen, daß die +Elemente eines Fensters eine bestimmte Größe oder Position besitzen, +sondern immer diese Funktion benutzen. +
  + +
WINX-Erweiterung: Vorraussetzung: appl_getinfo (Opcode 22360) +
Setzt man Bit 15 in wi_ctype (z.B. durch Addition der +Konstanten WC_WIN (=$8000)) und übergibt in wi_ckind statt +Fensterelementen die Kennung eines Fensters, ist es möglich die +Ausmaße des Fensters exakter zu bestimmen, da die Funktion die +aktuellen Eigenschaften des Fenster berücksichtigen kann (z.B. eine +Toolbar). Außerdem führt die Funktion eine Autokorrektur des +Strukturbereichs durch, die auch von Funktionen wie wind_open, +wind_set( WF_CURRXYWH) vorgenommen wird, falls dies notwendig ist und vom +AES unterstützt wird. +
  +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Fensterverwaltung +
  +
Querverweis: Binding   wind_create   Probleme bei Toolbars +
  + +
+ +

8.9.2.1 Bindings für wind_calc

+ + + + + + + + + +
C: int16_t wind_calc ( int16_t wi_ctype, int16_t wi_ckind, int16_t +wi_cinx, int16_t wi_ciny, int16_t wi_cinw, int16_t wi_cinh, int16_t +*coutx, int16_t *couty, int16_t *coutw, int16_t *couth ); +
  +
Umsetzung: +
  +
int16_t wind_calc (int16_t wi_ctype, int16_t wi_ckind,
+                   int16_t wi_cinx, int16_t wi_ciny,
+                   int16_t wi_cinw, int16_t wi_cinh,
+                   int16_t *coutx, int16_t *couty,
+                   int16_t *coutw, int16_t *couth)
+{
+   int_in[0]  = wi_ctype;
+   int_in[1]  = wi_ckind;
+   int_in[2]  = wi_cinx;
+   int_in[3]  = wi_ciny;
+   int_in[4]  = wi_cinw;
+   int_in[5]  = wi_cinh;
+
+   crys_if (108);
+
+   *coutx = int_out[1];
+   *couty = int_out[2];
+   *coutw = int_out[3];
+   *couth = int_out[4];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]108 # Opcode der Funktion
control+2control[1]6 # Einträge in int_in
control+4control[2]5 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]wi_ctype
int_in+2int_in[1]wi_ckind
int_in+4int_in[2]wi_cinx
int_in+6int_in[3]wi_ciny
int_in+8int_in[4]wi_cinw
int_in+10int_in[5]wi_cinh
int_outint_out[0]Return-Wert
int_out+2int_out[1]coutx
int_out+4int_out[2]couty
int_out+6int_out[3]coutw
int_out+8int_out[4]couth
+
+ + +
+ +

8.9.3 wind_close

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Close Window« - schließt ein Fenster. +
  +
AES-Nummer: 102 +
  +
Deklaration: int16_t wind_close ( int16_t wi_clhandle ); +
  +
Beschreibung: Die Funktion schließt das Fenster mit der Kennung +wi_clhandle. +
  +
Hinweis: Endgültig gelöscht wird das Fenster erst +durch einen Aufruf von wind_delete. +
  +
Ergebnis: Ein Fehler ist nur dann aufgeteten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Fensterverwaltung +
  +
Querverweis: Binding   wind_open   wind_delete +
  + +
+ +

8.9.3.1 Bindings für wind_close

+ + + + + + + + + +
C: int16_t wind_close ( int16_t wi_clhandle ); +
  +
Umsetzung: +
  +
int16_t wind_close (int16_t wi_clhandle)
+{
+   int_in[0]  = wi_clhandle;
+   return ( crys_if(102) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]102 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]wi_clhandle
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.9.4 wind_create

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Window create« - meldet ein neues Fenster an. +
  +
AES-Nummer: 100 +
  +
Deklaration: int16_t wind_create ( int16_t wi_crkind, int16_t wi_crwx, +int16_t wi_crwy, int16_t wi_crww, int16_t wi_crwh ); +
  +
Beschreibung: Die Funktion versucht beim AES ein neues Fenster anzumelden und +legt dabei gleichzeitig sein Aussehen und die maximale Größe fest. +
  +
wi_crwx, wi_crwy, wi_crww, wi_crwh legen die maximale Ausdehnung +des Fensters fest. +
  +
wi_crkind beschreibt die Komponenten als Bitvektor: +
  + + + + + + + + + + + + + + + + + +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KomponenteWertBedeutung
NAME0x0001Titelzeile
CLOSER0x0002Schließbox
FULLER0x0004Volle-Größe-Box
MOVER0x0008Fenster kann bewegt werden
INFO0x0010Infozeile
SIZER0x0020Größenverstellungsbox
UPARROW0x0040Pfeil nach oben
DNARROW0x0080Pfeil nach unten
VSLIDE0x0100vertikaler Slider
LFARROW0x0200Pfeil nach links
RTARROW0x0400Pfeil nach rechts
HSLIDE0x0800horizontaler Slider
HOTCLOSEBOX0x1000Close-Box mit Auto-Repeat
MENUBAR0x1000Menuzeile (XaAES)
BACKDROP0x2000Hintergrund-Box
ICONIFIER0x4000Iconify-Button
BORDER0x8000border sizing
+
+ +
Hinweis: Die Hotclose-Box steht erst ab PC-GEM bzw. +MagiC (jeweils) ab Version 2.0 zur Verfügung. Nicht benötigte +Fensterränder (z.B. Rand unten) werden ab AES-Version 4.x bzw. MagiC +3 weggelassen; dadurch stehen einige Pixel mehr an nutzbarer Fläche +zur Verfügung. +
  +
MENUBAR steht nur in XaAES zur Verfügung. Es reserviert Platz +für eine Menuzeile im Fenster. Die Menüzeile muß mit wind_set +angemeldet werden. +
  +
Setting BORDER will make XaAES allow for window border sizing +without the SIZER gadget being used. +
  +
Das Vorhandensein neuerer Komponenten wie beispielsweise dem +Iconify-Button, sollte am besten per appl_getinfo (Opcode 11) erfragt +werden. +
  +
Ergebnis: Die Funktion liefert ein nicht negatives Handle, falls das +AES noch ein freies Windowhandle zur Verfügung hat. Ein +Rückgabewert kleiner Null signalisiert einen Fehler oder keine +weiteren Handles mehr. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Fensterverwaltung +
  +
Querverweis: Binding   wind_delete +
  + +
+ +

8.9.4.1 Bindings für wind_create

+ + + + + + + + + +
C: int16_t wind_create ( int16_t wi_crkind, int16_t wi_crwx, +int16_t wi_crwy, int16_t wi_crww, int16_t wi_crwh ); +
  +
Umsetzung: +
  +
int16_t wind_create (int16_t wi_crkind, int16_t wi_crwx,
+                     int16_t wi_crwy, int16_t wi_crww,
+                     int16_t wi_crwh)
+{
+   int_in[0]  = wi_crkind;
+   int_in[1]  = wi_crwx;
+   int_in[2]  = wi_crwy;
+   int_in[3]  = wi_crww;
+   int_in[4]  = wi_crwh;
+
+   return ( crys_if(100) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]100 # Opcode der Funktion
control+2control[1]5 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]wi_crkind
int_in+2int_in[1]wi_crwx
int_in+4int_in[2]wi_crwy
int_in+6int_in[3]wi_crww
int_in+8int_in[4]wi_crwh
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.9.5 wind_delete

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Delete Window« - löscht ein Fenster +
  +
AES-Nummer: 103 +
  +
Deklaration: int16_t wind_delete ( int16_t wi_dhandle ); +
  +
Beschreibung: Die Funktion löscht das Fenster mit der Kennung +wi_dhandle und gibt das entsprechende Windowhandle wieder +frei. +
  +
Ergebnis: Ein Fehler ist nur dann aufgeteten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Fensterverwaltung +
  +
Querverweis: Binding   wind_create   wind_close +
  + +
+ +

8.9.5.1 Bindings für wind_delete

+ + + + + + + + + +
C: int16_t wind_delete ( int16_t wi_dhandle ); +
  +
Umsetzung: +
  +
int16_t wind_delete (int16_t wi_dhandle)
+{
+   int_in[0] = wi_dhandle;
+   return ( crys_if(103) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]103 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]wi_dhandle
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.9.6 wind_draw

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Draw Window« - Zeichnet die Fensterelemente. +
  +
AES-Nummer: 99 +
  +
Deklaration: int16_t wind_draw ( int16_t wi_dhandle, int16_t wi_dstartob ); +
  +
Beschreibung: Zeichnen der Non-Client-Area (Fensterelemente) eines Fensters +mit der Kennung wi_dhandle unter Berücksichtigung der +Rechteckliste. +
  + + + + + + + + + +
Parameter Bedeutung +
  +
wi_dhandle Handle des Fensters, das neu gezeichnet werden soll. +
  +
wi_dstartob Index des Objekts, bei dem mit dem Zeichnen begonnen werden +soll. +
  + +
+ +
Anmerkung +
Diese Funktion steht nur unter N.AES zur Verfügung und ist für +"normale" Anwendungen relativ uninteressant, sie wird +vornehmlich vom internen Screenmanager zum Zeichnen der Fensterobjekte +verwendet. +
  +
Ergebnis: Ein Fehler ist nur dann aufgeteten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Verfügbar: Das Vorhandensein der Funktion ist über appl_getinfo (Opcode 65) +nachprüfbar. +
  +
Gruppe: Fensterverwaltung +
  +
Querverweis: Binding +
  + +
+ +

8.9.6.1 Bindings für wind_draw

+ + + + + + + + + +
C: int16_t wind_draw ( int16_t wi_dhandle, int16_t wi_dstartob ); +
  +
Umsetzung: +
  +
int16_t wind_draw ( int16_t wi_dhandle, int16_t wi_dstartob );
+{
+   int_in[0] = wi_dhandle;
+   int_in[1] = wi_dstartob;
+   return ( crys_if(99) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]99 # Opcode der Funktion
control+2control[1]2 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]wi_dhandle
int_in+2int_in[1]wi_dstartob
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.9.7 wind_find

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Find Window« - sucht ein Fenster zu einem bestimmten Punkt. +
  +
AES-Nummer: 106 +
  +
Deklaration: int16_t wind_find ( int16_t wi_fmx, int16_t wi_fmy ); +
  +
Beschreibung: Die Funktion ermittelt die Kennung des Fensters, welches sich +an einer bestimmten Position befindet. Es gilt: +
  +

+
+ + + + + + + + + + + + +
ParameterBedeutung
wi_fmxx-Koordinate
wi_fmyy-Koordinate
+
+ +
Ergebnis: Die Funktion liefert die entsprechende Fensterkennung zurück. +Der Wert 0 steht dabei für den Desktop, -1 bedeutet, daß sich kein +Fenster an der angegebenen Position befindet. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Fensterverwaltung +
  +
Querverweis: Binding   wind_get +
  + +
+ +

8.9.7.1 Bindings für wind_find

+ + + + + + + + + +
C: int16_t wind_find ( int16_t wi_fmx, int16_t wi_fmy ); +
  +
Umsetzung: +
  +
int16_t wind_find (int16_t wi_fmx, int16_t wi_fmy)
+{
+   int_in[0]  = wi_fmx;
+   int_in[1]  = wi_fmy;
+
+   return ( crys_if(106) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]106 # Opcode der Funktion
control+2control[1]2 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]wi_fmx
int_in+2int_in[1]wi_fmy
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.9.8 wind_get

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Get Window« - ermittelt die Parameter eines Fensters. +
  +
AES-Nummer: 104 +
  +
Deklaration: int16_t wind_get ( int16_t wi_ghandle, int16_t wi_gfield, +int16_t *wi_gw1, int16_t *wi_gw2, int16_t *wi_gw3, int16_t *wi_gw3 ); +
  +
Beschreibung: Die Funktion liefert abhängig von den übergebenen Parametern +verschiedene Informationen über das Fenster mit der Kennung +wi_ghandle. Es gilt für wi_gfield. +
  +
Zusammenfassung aller Unterfunktionen +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
WF_BEVENT (24) erfragt den Status des Bitvektors, der per wind_set (..., +WF_BEVENT, ...) gesetzt wurde, und schreibt ihn in den Parameter +wi_gw1. +
Achtung: Das Vorhandensein dieses Features sollte per +appl_getinfo (Opcode 11) ermittelt werden. +
  + +
WF_BITMAP (233) Get bitmap content of the window if MyAES +"windows_backup" option is set to true, any windows of any +application can be read. +
MyAES 0.96 Funktion +
  + +
WF_BOTTOM (25) erfragt das Handle des untersten Fensters, und schreibt dieses +in den Parameter wi_gw1. Achtung: Das Vorhandensein +dieses Features sollte per appl_getinfo (Opcode 11) ermittelt werden. +
  + +
WF_CURRXYWH (5) berechnet die Gesamtgröße des Fenster und schreibt sie in die +weiteren Parameter wi_gw1, wi_gw2, wi_gw3 und +wi_gw4. +
  + +
WF_DCOLOR (19) liefert die Fensterfarben zurück, und zwar wie folgt: +
  + + + + + + + + + +
wi_gw1 = Fensterelement +
wi_gw2 = Farbe bei aktivem Fenster +
wi_gw3 = Farbe bei inaktivem Fenster + +
+ +
Achtung: Das Vorhandensein dieses Features sollte per +appl_getinfo (Opcode 11) ermittelt werden. +
  +
Ab MagiC 4 und XaAES v 0.943 können darüber hinaus für jedes +einzelne Fensterelement 3D-Flags abgefragt werden. Der Aufruf lautet +dabei: wind_get (0, WF_DCOLOR, ...) Es gilt: +
  + + + + + + + + + + + + +
wi_gw1 = Fensterelement +
wi_gw2 = Farbe im aktiven Zustand +
wi_gw3 = Farbe im inaktiven Zustand +
wi_gw4 = 3D-Flags + +
+ +
Die 3D-Flags werden dabei als Bitvektor beschrieben; es gilt: +
  + + + + + + + + + + + + + + + +
Bit-0 = Effekt "3D im Vordergrund" +
Bit-1 = Effekt "3D im Hintergrund" +
Bit-2 = Effekt "selektierbar im Vordergrund" +
Bit-3 = dto. im Hintergrund +
Bit-8+n = Maskenbit für Bit n + +
+ +
Dieses Feature kann z.Zt. noch nicht über appl_getinfo +ermittelt werden. +
  + +
WF_DDELAY (22362) Verzögerungswerte +
  + + + + + + + + + + + + +
wi_gw1 = Startverzögerung beim Klick auf Scrollpfeil +
wi_gw2 = Kontinuierliche Verzögerung beim Klick auf Scrollpfeil +
wi_gw3 = Kontinuierliche Verzögerung beim Klick auf Closer +
wi_gw4 = Kontinuierliche Verzögerung beim Klick auf Fuller + +
+ +
Alle Werte werden in Millisekunden zurückgegeben. +
  +
Achtung: Das Vorhandensein dieses Features sollte per +appl_getinfo (Opcode 22360) ermittelt werden. +
  + +
WF_FIRSTXYWH (11) berechnet die Koordinaten des ersten Rechtecks in der +Rechtecksliste und schreibt sie in die weiteren Parameter +wi_gw1, wi_gw2, wi_gw3 und wi_gw4. +
  + +
WF_FTOOLBAR (31) ermittelt das erste Rechteck aus der Rechteckliste einer +Toolbar. Es gilt: +
  + + + + + + + + + + + + +
wi_gw1 = x-Koordinate +
wi_gw2 = y-Koordinate +
wi_gw3 = Breite +
wi_gw4 = Höhe des Rechteckes + +
+ + +
WF_FULLXYWH (7) berechnet die maximale Gesamtgröße des Fensters und schreibt +sie in die weiteren Parameter wi_gw1, wi_gw2, +wi_gw3 und wi_gw4. +
  + +
WF_HSLIDE (8) berechnet die Position des horizontalen Sliders und schreibt +sie in den weiteren Parameter wi_gw1 (0 ganz links, bis 1000 +ganz rechts). +
  + +
WF_HSLSIZE (15) berechnet die Größe des horizontalen Sliders relativ zur +Gesamtbreite und schreibt sie in den zusätzlichen Parameter +wi_gw1 (-1 kleinste Größe, 1 klein bis 1000 Gesamtbreite). +
  + +
WF_ICONIFY (26) liefert folgende Werte zurück: +
  + + + + + + + + + +
wi_gw1 = Fenster ist ikonifziert (1) oder nicht (0) +
wi_gw2 = Breite des Fensters +
wi_gw3 = Höhe des Fensters + +
+ +
Achtung: Das Vorhandensein dieses Features sollte per +appl_getinfo (Opcode 11) ermittelt werden. +
  + +
WF_INFO (3) Ermittelt den aktuellen Text der Infozeile des Fensters mit dem +Handle wi_ghandle und kopiert diesen in den Buffer, dessen Adresse in +intin[2] (Highword) und intin[3] (Lowword) übergeben wurde. +
  +
Besitzt das Fenster keinen Infozeile, so ist der Rückgabewert +der Funktion gleich 0; der übergebene Buffer bleibt unverändert. +
  +
Da eine Infozeile maximal 128 (N.AES) oder 200 (XaAES) Zeichen +lang sein kann, sollte der übergebene Buffer genug Platz bieten, um +einen String dieser Länge aufzunehmen. +
  +
Steht nur unter N.AES und XaAES zur Verfügung. +
  + +
WF_INFOXYWH (104) Ermittelt die Position des INFO-Fensterelements. +
  +
Verfügbar ab MagiC 6.10 +
  + +
WF_KIND (1) ermittelt die aktuellen Komponenten des Fensters, und schreibt sie +in den Parameter wi_gw1. +
  + +
WF_MENU (33) liefert die Adresse der OBJECT-Struktur der Menüzeile im +Fenster zurück. Dabei enthält wi_gw1 das High-Word, und +wi_gw2 das Low-Word der Adresse oder NULL. +
  + +
WF_MINXYWH (103) Fragt die Minimalgröße des Fensters ab. +
  +
Verfügbar ab MagiC 6 +
  + +
WF_NAME (2) Ermittelt den aktuellen Fenstertitel des Fensters mit dem +Handle wi_ghandle und kopiert diesen in den Buffer, dessen Adresse in +intin[2] (Highword) und intin[3] (Lowword) übergeben wurde. +
  +
Besitzt das Fenster keinen Titel, so ist der Rückgabewert der +Funktion gleich 0; der übergebene Buffer bleibt unverändert. +
  +
Da ein Fenstertitel maximal 128 (N.AES) oder 200 (XaAES) Zeichen +lang sein kann, sollte der übergebene Buffer genug Platz bieten, um +einen String dieser Länge aufzunehmen. +
  +
Steht nur unter MagiC (ab V6.0), N.AES und XaAES zur Verfügung. +
  + +
WF_NEWDESK (14) die Funktion liefert folgende Werte zurück: +
  + + + + + + + + + +
wi_gw1 = Hi-Word der Desktop-Adresse +
wi_gw2 = Lo-Word der Desktop-Adresse +
wi_gw3 = Index des ersten Objektes + +
+ +
Hinweis: Unter der Desktop-Adresse ist hierbei die +Adresse des aktiven Desktop-Hintergrundes zu verstehen. Die Ausgabe in +wi_gw3 steht nur unter MagiC zur Verfügung. +
Achtung: Das Vorhandensein dieses Features sollte per +appl_getinfo (Opcode 11) ermittelt werden. Ist auch in KAOS 1.4.2 und ab +MagiC 1 vorhanden. +
  + +
WF_NEXTXYWH (12) berechnet die Koordinaten des nächsten Rechtecks in der +Rechtecksliste und schreibt sie in die weiteren Parameter +wi_gw1, wi_gw2, wi_gw3 und wi_gw4. +
  + +
WF_NTOOLBAR (32) ermittelt das nächste Rechteck aus der Rechteckliste einer +Toolbar. Es gilt: +
  + + + + + + + + + + + + +
wi_gw1 = x-Koordinate +
wi_gw2 = y-Koordinate +
wi_gw3 = Breite +
wi_gw4 = Höhe des Rechteckes + +
+ + +
WF_OPTS (41) Liefert die Einstellungen, welches per wind_set ( WF_OPTS ) +gemacht wurden. +
  +
Das Vorhandensein dieses Features sollte per appl_getinfo (Opcode 11) +ermittelt werden. +
  + +
WF_M_OWNER (101) liefert folgende Werte zurück: +
  + + + +
wi_gw1 = Applikations-ID des Besitzers + +
+ +
Nur ab KAOS 1.4.2 (hieß dort noch WF_OWNER) und in MagiC +vorhanden. +
  + +
WF_OWNER (20) liefert folgende Werte zurück: +
  + + + + + + + + + + + + +
wi_gw1 = Applikations-ID des Besitzers +
wi_gw2 = Fenster ist geöffnet (1) bzw. geschlossen (0) +
wi_gw3 = Kennung des darüberliegenden +
wi_gw4 = Kennung des darunterliegenden Fensters + +
+ +
Achtung: Das Vorhandensein dieses Features sollte per +appl_getinfo (Opcode 11) ermittelt werden. +
  + +
WF_PREVXYWH (6) berechnet die Gesamtgröße des vorherigen Fensters und +schreibt sie in die weiteren Paramter wi_gw1, wi_gw2, +wi_gw3 und wi_gw4. +
  + +
WF_SCREEN (17) liefert die Adresse und Länge des internen Buffers, in dem das +AES den Hintergrund von Dropdownmenüs und Alertboxen +zwischenspeichert und schreibt sie in die weiteren Parameter +wi_gw1 Highword der Adresse, wi_gw2 Lowword der +Adresse, wi_gw3 Highword der Länge und wi_gw4 Lowword +der Länge. +
  +
Bei TOS 1.02 wird für Länge 0 zurückgeliefert (obwohl der +Puffer 8000 Bytes faßt). +
  + +
WF_SHADE (22365) Liefert den Shade-Zustand des Fensters. +
  + + + +
wi_gw1 = Aktueller Shade-Zustand. +
1: eingeklappt +
0: ausgeklappt + +
+ +
Achtung: Das Vorhandensein dieses Features sollte per +appl_getinfo (Opcode 22360) ermittelt werden. +
  + +
WF_TOOLBAR (30) liefert die Adresse der OBJECT-Struktur der Toolbar zurück. +Dabei enthält wi_gw1 das High-Word, und wi_gw2 das +Low-Word der Adresse. +
  + +
WF_TOP (10) liefert die folgenden Werte zurück: +
  + + + + + + + + + + + + + + + +
wi_gw1 = Kennung des obersten Fensters +
Ab AES 3.3   +
wi_gw2 = Applikations-ID des Besitzers +
wi_gw3 = Kennung des nächsten Fensters +
wi_gw4 = Spezialfall für MagiC 2.0 und XaAES + +
+ +
Wenn kein Fenster geöffnet ist, enthält wi_gw1 den +Wert 0. +
+
  +
Achtung: MagiC 2.0 muß als oberstes Fensterhandle eine +negative Zahl (-2) liefern, falls das Programm einer anderen +Applikation gehört, sonst laufen eine Reihe alter Programme nicht. In +MagiC 2.0 wird das tatsächliche Handle in wi_gw4 +zurückgeliefert. Ab MagiC 3 trifft dies nicht mehr zu, d.h. das +Handle wird wie bisher üblich, in wi_gw1 übergeben. +
  +
XaAES liefert in wi_gw4 die Applikations-ID des +Besitzers des nächsten Fensters. +
  + +
WF_USER_POINTER (230) Liefert den Benutzer Wert eines Fenster +
wi_gw1 and wi_gw2 are the 2 values already set by +user with wind_set. +
MyAES Funktion +
  + +
WF_UNICONIFY (27) ermittelt die ursprünglichen Ausmaße eines ikonifizierten +Fensters. +
  + + + + + + + + + + + + +
wi_gw1 = x-Position +
wi_gw2 = y-Position +
wi_gw3 = Breite +
wi_gw4 = Höhe des Fensters + +
+ +
Achtung: Das Vorhandensein dieses Features sollte per +appl_getinfo (Opcode 11) ermittelt werden. +
  + +
WF_VSLIDE (9) berechnet die Position des vertikalen Sliders und schreibt sie +in den weiteren Parameter wi_gw1 (0 ganz oben, bis 1000 ganz +unten). +
  + +
WF_VSLSIZE (16) berechnet die Höhe des vertikalen Sliders relativ zur +Gesamthöhe und schreibt sie in den zusätzlichen Parameter +wi_gw1 (-1 kleinste Höhe, 1 klein bis 1000 Gesamthöhe). +
  + +
WF_WIDGETS (200) Ermittelt die aktuellen Positionen der Sliderobjekte +(W_UPARROW, W_DNARROW, etc.) des Fensters mit dem Handle +wi_ghandle. In den Parametern wi_gw1 und +wi_gw2 werden die vertikal Elemente des typs rightwidgets, in +den Parametern wi_gw3 und wi_gw4 die horizontal +Elemente des typs bottomwidgets geschrieben. wi_gw1 ist das +oberste Element, wi_gw2 das unterste Element des +Vertikalsliders. wi_gw3 ist das linkeste Element, +wi_gw4 das rechteste Element des Horizontalsliders. +
  +
Achtung: Das Vorhandensein dieses Features sollte per +appl_getinfo (Opcode 11) ermittelt werden. +
  + + +
WF_M_WINDLIST (102) Liefert in wi_gw1 (High) und wi_gw2 (Low) einen +Zeiger auf eine durch 0 abgeschlossene Tabelle der geöffneten Fenster +(erstes Element = oberstes Fenster, d.h. auf die Liste ihrer Handles +als Integer-Werte. Negative Handles gehören zu eingefrorenen +Applikationen. Auf keinen Fall darf über den Zeiger schreibend +zugegriffen werden. +
  +
Nur in KAOS ab 1.4.2 (WF_WINDLIST) und MagiC vorhanden. +
  + +
WF_WINX (22360) Liefert Informationen zur installierten WINX-Version (ab WINX +2.1). +
  + + + + + + + + + + + + +
wi_gw1 = Version + + + + + + + + + + + + +
Bit [15..12] Beta-Kennung +
Bit [11.. 8] Major (momentan 2) +
Bit [ 7.. 4] Minor (momentan 3) +
Bit [ 3.. 0] Interne Kennung + +
+ +
wi_gw2 = Erstellungsdatum im GEMDOS-Format +
wi_gw3 = Zeiger (Low) auf die WINX-Externals (bzw. NULL) +
wi_gw4 = Zeiger (High) auf die WINX-Externals (bzw. NULL) + +
+ + +
WF_WINXCFG (22361) Liefert die globalen und lokalen Schalter der aufrufenden +Applikation (Bit n entspricht jeweils Schalter n+1). +
  + + + + + + + + + + + + +
wi_gw1 = Bitmaske der von der aktuellen WINX-Version unterstützten +globalen Schalter (Bit gesetzt bedeutet, Schalter vorhanden). +
wi_gw2 = Schalterstellung der globalen Schalter (Bit gesetzt bedeutet, +Schalter eingeschaltet). +
wi_gw3 = Bitmaske der von der aktuellen WINX-Version unterstützten +lokalen Schalter der aktuellen Applikation (Bit gesetzt bedeutet, +Schalter vorhanden). +
wi_gw4 = Schalterstellung der lokalen Schalter der aktuellen Applikation +(Bit gesetzt bedeutet, Schalter eingeschaltet). + +
+ +
Normalerweise sollten Applikationen darauf verzichten diese +Informationen abzufragen. +
  +
Achtung: Das Vorhandensein dieses Features sollte per +appl_getinfo (Opcode 22360) ermittelt werden. +
  + +
WF_WORKXYWH (4) berechnet die Koordinaten des Arbeitsbereichs des Fensters und +schreibt sie in die weiteren Parameter wi_gw1, wi_gw2, +wi_gw3 und wi_gw4. +
  + +
XA (0x5841) Wird als Ergebins 'XA' (0x5841) geliefert so ist XaAES +installiert und man erhält in wi_gw1 die Versionsnummer +(0x0964 für Version V0.964). wi_ghandle muß auf Null gesetzt +werden. +
  + +
+ +
Hinweis: Die Parameter wi_gw1, wi_gw2, wi_gw3 und wi_gw4 +sind dabei reine Ausgabe-Parameter. +
  +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Verfügbar: In allen AES Versionen. +
  +
Gruppe: Fensterverwaltung +
  +
Querverweis: Binding   wind_set   Unterfunktionsübersicht +
  + +
+ +

8.9.8.1 Bindings für wind_get

+ + + + + + + + + +
C: int16_t wind_get ( int16_t wi_ghandle, int16_t wi_gfield, +int16_t *wi_gw1, int16_t *wi_gw2, int16_t *wi_gw3, int16_t *wi_gw3 ); +
  +
Umsetzung: +
  +
int16_t wind_get ( int16_t wi_ghandle, int16_t wi_gfield,
+                   int16_t *wi_gw1, int16_t *wi_gw2,
+                   int16_t *wi_gw3, int16_t *wi_gw3)
+{
+   int_in[0]  = wi_ghandle;
+   int_in[1]  = wi_gfield;
+
+   crys_if (104);
+
+   *wi_gw1 = int_out[1];
+   *wi_gw2 = int_out[2];
+   *wi_gw3 = int_out[3];
+   *wi_gw4 = int_out[4];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]104 # Opcode der Funktion
control+2control[1]2 # Einträge in int_in
control+4control[2]5 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]wi_ghandle
int_in+2int_in[1]wi_gfield
int_outint_out[0]Return-Wert
int_out+2int_out[1]wi_gw1
int_out+4int_out[2]wi_gw2
int_out+6int_out[3]wi_gw3
int_out+8int_out[4]wi_gw4
+
+ + +
+ +

8.9.9 wind_new

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »New Window« - schließt alle Fenster. +
  +
AES-Nummer: 109 +
  +
Deklaration: void wind_new ( void ); +
  +
Beschreibung: Die Funktion schließt und löscht alle Fenster, und +setzt die mit wind_update gemachten Blockierungen zurück. +
  +
Hinweis zu MagiC: Hier wird die Funktion als aufwendige, +globale und umfassende Aufräumfunktion für eine Applikation +ausgeführt, und löscht auch nur noch deren Updateanforderungen, +Fenster, Menüs usw. Andere Applikationen werden auf keinen Fall +beeinträchtigt. +
  +
Ergebnis: Die Funktion hat kein Ergebnis. +
  +
Verfügbar: Seit AES Version 1.4 +
  +
Gruppe: Fensterverwaltung +
  +
Querverweis: Binding   wind_create   wind_close   wind_update +
  + +
+ +

8.9.9.1 Bindings für wind_new

+ + + + + + + + + +
C: void wind_new ( void ); +
  +
Umsetzung: +
  +
void wind_new (void)
+{
+   crys_if (109);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]109 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]0 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
+
+ + +
+ +

8.9.10 wind_open

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Open Window« - öffnet ein Fenster. +
  +
AES-Nummer: 101 +
  +
Deklaration: int16_t wind_open ( int16_t wi_ohandle, int16_t wi_owx, int16_t +wi_owy, int16_t wi_oww, int16_t wi_owh ); +
  +
Beschreibung: Die Funktion stellt ein Fenster auf dem Bildschirm dar. Es +gilt: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
wi_ohandleKennung des zu öffnenden Fensters
wi_owxx-Koordinate
wi_owyy-Koordinate
wi_owwBreite
wi_owhHöhe des Fensters
+
+ +
Hinweis: Das Fenster muß vorher per wind_create erzeugt +worden sein. Die Komponenten Titelzeile, Infozeile und Slider müssen +bereits vorher durch einen wind_set Aufruf gesetzt worden sein. +
  +
Bei Angabe der Koordinaten -1,-1,-1,-1 wird das Fenster ab MagiC +3 an die nächste freie Position für ikonifizierbare Fenster gelegt. +
  +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgeliefert wird. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Fensterverwaltung +
  +
Querverweis: Binding   wind_create   wind_close   wind_set +
  + +
+ +

8.9.10.1 Bindings für wind_open

+ + + + + + + + + +
C: int16_t wind_open ( int16_t wi_ohandle, int16_t wi_owx, int16_t +wi_owy, int16_t wi_oww, int16_t wi_owh ); +
  +
Umsetzung: +
  +
int16_t wind_open (int16_t wi_ohandle, int16_t wi_owx,
+                   int16_t wi_owy, int16_t wi_oww,
+                   int16_t wi_owh)
+{
+   int_in[0]  = wi_ohandle;
+   int_in[1]  = wi_owx;
+   int_in[2]  = wi_owy;
+   int_in[3]  = wi_oww;
+   int_in[4]  = wi_owh;
+
+   return ( crys_if(101) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]101 # Opcode der Funktion
control+2control[1]5 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]wi_ohandle
int_in+2int_in[1]wi_owx
int_in+4int_in[2]wi_owy
int_in+6int_in[3]wi_oww
int_in+8int_in[4]wi_owh
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.9.11 wind_set

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Window« - verändert einzelne Parameter eines Fensters. +
  +
AES-Nummer: 105 +
  +
Deklaration: int16_t wind_set ( int16_t wi_shandle, int16_t wi_sfield, +int16_t wi_sw1, int16_t wi_sw2, int16_t wi_sw3, int16_t wi_sw4 ); +
  +
Beschreibung: Die Funktion verändert, abhängig von den übergebenen +Parametern, verschiedene Eigenschaften des Fensters mit der Kennung +wi_shandle. Es gilt für wi_sfield. +
  +
Zusammenfassung aller Unterfunktionen +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
WF_BEVENT (24) erlaubt es, eine WM_TOPPED Message beim Anklicken eines +Fensters zu verhindern (z.B. um Dauerfunktionen in nicht getoppten +Fenstern zu ermöglichen). wi_sw1 ist ein Bitvektor bei dem +bisher lediglich Bit-0 eine Bedeutung besitzt. Andere Werte als 1 sind +also nicht erlaubt. Der Aufruf wäre dann: +wind_set(wi_shandle, WF_BEVENT, 0x0001, 0, 0, 0). +
Achtung: Das Vorhandensein dieses Features sollte per +appl_getinfo (Opcode 11) ermittelt werden. +
  + +
WF_BOTTOM (25) ermöglicht es, das (geöffnete!) Fenster mit der Kennung +wi_shandle in den Hintergrund zu legen, und zwar per +wind_set(wi_shandle, WF_BOTTOM, 0, 0, 0, 0). +
Achtung: Das Vorhandensein dieses Features sollte per +appl_getinfo (Opcode 11) ermittelt werden. +
  + +
WF_BOTTOMALL (22368) Stellt alle Fenster der Applikation wi_sw1 nach hinten. +
  + + + +
wi_sw1 = Kennung der Applikation + +
+ +
Übergibt man in wi_shandle ein Fensterkennung ungleich +DESKWINDOW, dann wird wi_shandle zusätzlich ganz nach hinten +gestellt (ansonsten wird die Reihenfolge der Fenster untereinander +nicht geändert). wi_shandle muß offen sein und der +Applikation wi_sw1 gehören. +
  +
Es ist nicht garantiert, daß eine Applikation WF_BOTTOMALL auf +die Fenster einer anderen Applikation anwenden kann (vorallem in einer +Multitasking-Umgebung). In diesem Fall wird 0 zurückgegeben. +
  +
Achtung: Das Vorhandensein dieses Features sollte per +appl_getinfo (Opcode 22360) ermittelt werden. +
  + +
WF_COLOR (18) verändert die Farbe eines Fensterelements. Dazu wird in +wi_sw1 die Nummer des Elements angegeben: +
+
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Element Beschreibung +
    + +
W_BOTTOMER (20) Backdrop-Button + +
W_BOX (0) Wurzelobjekt des Fensters + +
W_CLOSER (2) Schließbox + +
W_DATA (6) Elternobjekt der restlichen Elemente + +
W_DNARROW (11) Pfeil nach unten + +
W_FULLER (4) Zoombox + +
W_HBAR (14) Elternobjekt der vertikalen Sliderelemente + +
W_HELEV (18) Horizontaler Slider + +
W_HSLIDE (17) Hintergrund des horiz. Sliders + +
W_INFO (5) Infozeile + +
W_LFARROW (15) Pfeil nach links + +
W_NAME (3) Move-Balken + +
W_RTARROW (16) Pfeil nach rechts + +
W_SIZER (8) Size-Box + +
W_SMALLER (19) Iconifier-Button + +
W_TITLE (1) Elternobjekt der Schließ- und Zoombox, sowie des Names + +
W_UPARROW (10) Pfeil nach oben + +
W_VBAR (9) Elternobjekt der vertikalen Sliderelemente + +
W_VELEV (13) Vertikaler Slider + +
W_VSLIDE (12) Hintergrund des vert. Sliders + +
W_WORK (7) Arbeitsfläche + +
+ +
Im Parameter wi_sw2 wird die Farbe für den Objekttyp +des Fensterelements übergeben, falls das Fenster getoppt ist, in +wi_sw3 falls es nicht aktiv ist. Ein Wert von -1 behält die +aktuelle Farbeinstellung bei. +
Achtung: Das Vorhandensein dieses Features sollte per +appl_getinfo (Opcode 11) ermittelt werden. +
  + +
WF_CURRXYWH (5) setzt die Fenstergröße aus wi_sw1, wi_sw2, +wi_sw3 und wi_sw4 fest. +
  +
XaAES is compatible with all other AES's, except from the +following points: +
  + +
    +
  1. If x, y, w and h all have a value of -1. +
      +

  2. +
  3. x and y values of -1 are 'legal', i.e, one cannot use -1 to use +any old x value. Ofcourse, x and y coordinates are checked to be +inside the rootwindow (not X when noleft = false). +
      +

  4. +
  5. When h have a value of 0, the window is infact shaded. This is +a thing N.AES does with MiNTSetter, altho I'm not sure this is +correct. The application is sent a WM_SHADED. On the next +wind_set(handle, WF_CURRXYWH,...) where the h coordinate is not equal +to the window's shaded height, the window is unshaded. While the +window is shaded via this method, shift-clicks on the window title to +shade a window is ignored. +
      +

  6. +
+ +
XaAES since 2004-09-22, there is an extend version. +
  + +
WF_DCOLOR (19) setzt die Standard-Farben für die Fensterelemente. Der +Parameter wi_shandle wird ignoriert, und für die übrigen +Parameter gilt: +
  + + + + + + + + + +
wi_sw1 = Fensterelement +
wi_sw2 = Farbe für aktive Fenster +
wi_sw3 = Farbe für inaktive Fenster + +
+ +
Achtung: Das Vorhandensein dieses Features sollte per +appl_getinfo (Opcode 11) ermittelt werden. Beim Verändern der Komponente +W_FULLER werden automatisch W_SMALLER und W_BOTTOMER mit verändert; +dies macht es notwendig, zuerst den Fuller, und dann die übrigen +Komponenten zu setzen. +
  +
Ab MagiC 4 ist es möglich, für jedes einzelne Fensterelement +3D-Flags festzulegen. Dabei gilt: +
  + + + + + + + + + + + + +
wi_sw1 = Fensterelement +
wi_sw2 = Farbe im aktiven Zustand +
wi_sw3 = Farbe im inaktiven Zustand +
wi_sw4 = 3D-Flags + +
+ +
Der Parameter wi_shandle muß dabei den Wert 0 annehmen; +die 3D-Flags werden als Bitvektor beschrieben; es gilt: +
  + + + + + + + + + + + + + + + +
Bit-0 = Effekt "3D im Vordergrund" +
Bit-1 = Effekt "3D im Hintergrund" +
Bit-2 = Effekt "selektierbar im Vordergrund" +
Bit-3 = dto. im Hintergrund +
Bit-8+n = Maskenbit für Bit n + +
+ +
Es werden also nur Bits verändert, wenn das zugehörige +Maskenbit gesetzt ist. Dieses Feature kann z.Zt. noch nicht +über appl_getinfo ermittelt werden. +
  + +
WF_DDELAY (22362) Verzögerungswerte setzen +
  + + + + + + + + + + + + +
wi_sw1 = Startverzögerung beim Klick auf Scrollpfeil +
wi_sw2 = Kontinuierliche Verzögerung beim Klick auf Scrollpfeil +
wi_sw3 = Kontinuierliche Verzögerung beim Klick auf Closer +
wi_sw4 = Kontinuierliche Verzögerung beim Klick auf Fuller + +
+ +
Die Verzögerungswerte dienen zum Bremsen von Aktionen, falls +diese zu schnell ausgeführt werden (z.B. wegen neuer Hardware). +
  +
Achtung: Das Vorhandensein dieses Features sollte per +appl_getinfo (Opcode 22360) ermittelt werden. +
  + +
WF_FULLSCREEN (235) Switch fullscreen - normal window mode. The fullscreen mode is +without any widget. +
Hit the key ESC escape from fullscreen mode. +
MyAES 0.96 feature +
  + +
WF_FULLXYWH (7) If either wi_sw1, wi_sw2, wi_sw3 or +wi_sw4 have a value of -1, that coordinate is not changed. If +ALL coordinates have a value of -1, the window is actually moved to +the current FULLXYWH coordinates, making the current window position +the new PREVXYWH position. XaAES since 2004-09-22, there is an extend +version. +
  + +
WF_HSLIDE (8) setzt den horizontalen Slider auf die neue Position +wi_sw1 (0 ganz links, bis 1000 ganz rechts). +
  + +
WF_HSLSIZE (15) setzt die Größe des horizontalen Sliders relativ zur +Gesamtbreite auf den Wert wi_sw1 (-1 kleinste Größe, 1 klein +bis 1000 Gesamtbreite). +
  + +
WF_ICONIFY (26) das Fenster wird ikonifiziert. Die Parameter wi_sw1 bis +wi_sw4 geben Position und Größe des Fensters im +ikonifizierten Zustand an; diese Werte erhält man vom AES beim +Eintreffen einer WM_ICONIFY Message. +
Tip: Um ein bereits erzeugtes, aber noch nicht +geöffnetes Fenster zu ikonifizieren, übergibt man als Koordinaten +(-1,-1,-1,-1). Das Fenster kann dann per wind_open(handle,-1,-1,-1,-1) +auf den Bildschirm gebracht werden. Ab MagiC 4 und XaAES v0.943 +funktioniert dies auch, wenn das Fenster bereits geöffnet ist. +
Achtung: Das Vorhandensein dieses Features sollte per +appl_getinfo (Opcode 11) erfragt werden. +
  + + +
WF_IGNORE (13) Ist in alten AES-Version benutzt. Funktion unbekannt. +
  + +
WF_INFO (3) schreibt den String, auf den wi_sw1 und wi_sw2 +zeigt, in die Infozeile. GEM benutzt dabei nur den Zeiger und legt +keine Kopie an. +
  +
Unter GEM ist die Länge auf 80 Zeichen beschränkt. Bei N.AES +sind es maximal 128 bei XaAES maximal 200. +
  + +
WF_KIND (1) legt wi_sw1 als neue Fensterkomponenten fest, Format +wie bei wind_create. (MagiC seit Version 6.00 (1998.01.26), MyAES seit +2022.12.27) +
  + + +
WF_M_BACKDROP (100) Damit kann ein Fenster wi_sw1 auf einen Schlag nach +unten gebracht werden, ohne die Reihenfolge der anderen Fenster zu +verändern. In KAOS 1.4.2 hieß der Parameter noch WF_BACKDROP. +
  + +
WF_MENU (33) Es kann eine Menüzeile in ein Fenster eingehängt werden. +Wurde das Fenster nicht mit der Komponente MENUBAR erzeugt, dann wird +der Aufruf ignoriert. In wi_sw1 und wi_sw2 wird die +Adresse des Baums übergeben. +
Beim anklicken erhält man eine erweiterte MN_SELECTED Nachricht. +
nur XaAES +
  + +
WF_NAME (2) schreibt den String, auf den wi_sw1 und wi_sw2 +zeigt, in die Titelzeile. GEM benutzt dabei nur den Zeiger und legt +keine Kopie an. +
  +
Unter GEM ist die Länge auf 80 Zeichen beschränkt. Bei N.AES +sind es maximal 128 bei XaAES maximal 200. +
  + +
WF_NEWDESK (14) legt den Objektbaum, auf den wi_sw1 und wi_sw2 +zeigt, mit dem Startobjekt wi_sw3 als neues Desktop fest. +Durch Übergabe eines Nullzeigers kann wieder der Standardhintergrund +gesetzt werden. +
  + +
WF_OPTIONS (234) Change window behavior +
  + + + + + + +
wi_sw1 = +
 1: request automatic close when application focus is lost and +restore it when is back +
+
wi_sw2 = remove/add option: +
1: add option +
0: remove option + +
+ +
MyAES feature +
  + +
WF_OPTS (41) wi_handle is a window handle or -1. If handle is a +legal window handle, the options will only apply to that window. If +'handle' is -1, the settings will apply to all windows the application +creates AFTER this call. +
  +
wi_sw1 is 0 to clear the selected bits or 1 to set the +selected bits. +
  +
wi_sw2 Currently available options are as follows; +
  + + + + + + + + + + + + + + + + + + + +
WO0_WHEEL (0x0001) Setting this bit will enable extended mouse wheel support, and +go into WHL_AROWWHEEL mode causing XaAES to send extended WM_ARROWED +messages to the application when the mouse wheel turns. Read section +"XaAES and wheel mouse handling." for details. + +
WO0_FULLREDRAW (0x0002) Setting this bit will make XaAES send WM_REDRAW messages to +cover the whole work-area of the window when it is FULLED. Default +behaviour is to only send WM_REDRAW messages for the areas that need +it, blitting the already visible parts. This can also be configured +via xaaes.cnf, see the app_options argument 'naesff'. + +
WO0_NOBLITW (0x0004) Setting this bit will make XaAES send WM_REDRAW messages to +cover the whole work-area of the window when its WIDTH changes. This +is handy for apps like HighWire, Textprocessors ,etc, that need to +reformat when window width changes. Default behaviour is to send +WM_REDRAW messages for the areas that need it. + +
WO0_NOBLITH (0x0008) Setting this bit will make XaAES send WM_REDRAW messages to +cover the whole work-area of the window when its HEIGHT changes. +Default behaviour is to send WM_REDRAW messages for the areas that +need it. + +
WO0_SENDREPOS (0x0010) Setting this bit will make XaAES send a WM_REPOSED (38) message +when a windows X/WIDTH and/or Y/HEIGHT coordinate pair changes. Such +changes happen when the user resizes the window using upper/left +borders. Default behaviour is to first send a WM_MOVED followed by a +WM_SIZED message under these conditions, because older apps dont +evaluate the WIDTH/HEIGHT in WM_MOVED messages. So, dudes, set this +bit and use WM_REPOSED! + +
WO0_WCOWORK (0x0020) Setting this bit will enable Window Coordinate Orientation WORK +mode. + +
+ +
wi_sw3 and wi_sw4 are currently undefined and +must be cleared. +
  +
Features sollte per appl_getinfo (Opcode 11) erfragt werden. +
  + +
WF_PREVXYWH (6) If eitherwi_sw1, wi_sw2, wi_sw3 or +wi_sw4 have a value of -1, that coordinate is not changed. If +ALL coordinates have a value of -1, the window is actually moved to +the current PREVXYWH coordinates, making the current window position +the new PREVXYWH position. +
XaAES since 2004-09-22, there is an extend version. +
  + +
WF_SHADE (22365) Setzt den Shade-Zustand des Fensters +
  + + + +
wi_sw1 = Zu aktivierender Shade-Zustand  1: eingeklappt +
 0: ausgeklappt +
-1: Zustand umschalten + +
+ +
Beim Einklappen wird eine WM_SHADED-Nachricht versandt. Beim +Ausklappen WM_UNSHADED und ein WM_REDRAW über den kompletten +Ausgabebereichs des Fensters. Setzt man den Zustand vor dem Öffnen +des Fensters, dann wird er beim Öffnen beachtet. Das Schließen eines +Fenster setzt es automatisch auf ausgeklappt. +
  +
Achtung: Das Vorhandensein dieses Features sollte per +appl_getinfo (Opcode 22360) ermittelt werden. +
  + +
WF_STACK (22366) Stellt das Fenster wi_shandle im Fensterstapel unter +das Fenster wi_sw1 ohne die Bildschirmposition selbst zu +ändern. +
  + + + +
wi_sw1 = offenes Fenster/DESKWINDOW (0)/NOWINDOW (-1) + +
+ +
Ist wi_shandle geschlossen, wird der +Positionierungswunsch gespeichert und beim Öffnen des Fensters mit +wind_open berücksichtigt. wi_sw1 wird erst bei der +eigentlichen Positionierung ausgewertet. Ist (wi_sw1 == +DESKWINDOW), wird das Fenster nach ganz hinten gestellt (entspricht +WF_BOTTOM). Ist (wi_sw1 == NOWINDOW) oder wi_sw1 nicht +offen, dann wird das Fenster wi_shandle ganz nach vorne +gestellt (entspricht WF_TOP). +
  +
Achtung: Das Vorhandensein dieses Features sollte per +appl_getinfo (Opcode 22360) ermittelt werden. +
  + +
WF_TOOLBAR (30) befestigt eine Toolbar an einem Fenster, ändert oder entfernt +diese. Es gilt: +
  + + + + + + +
wi_sw1 = High-Word +
wi_sw2 = Low-Word der Adresse der Toolbar. + +
+ +
Um eine Toolbar zu entfernen, müssen die Parameter +wi_sw1 und wi_sw2 auf NULL gesetzt werden. +
  +
XaAES ab v0.942 kennt Toolbars. Hiefür gibt es zusätzliche +Parameter: +
  + + + + + + +
wi_sw3 = Startobjekt ab dem gezeichnet wird. +
wi_sw4 = Nummer des Editobjekt, in das der Cursor gesetzt wird. + +
+ +
Beim betätigen eines Toolbarobjekt erhält man die Nachricht +WM_TOOLBAR, falls ein Toolbarobjekt angeklickt wurde. +
  + +
WF_TOP (10) das Fenster mit dem Handle wi_shandle wird zum neuen +oberen Fenster. Ab MagiC 4 und XaAES v0.943 kann durch wind_set (-1, +WF_TOP, id, ...) das Menü und der Desktophintergrund auf die +Applikation mit der Kennung id umgeschaltet werden; ein Wert von -1 +für id steht dabei für die aktuelle Applikation. +
  + +
WF_TOPALL (22367) Holt alle Fenster der Applikation wi_sw1 nach vorne. +
  + + + +
wi_sw1 = Kennung der Applikation + +
+ +
Übergibt man in wi_shandle ein Fensterkennung ungleich +DESKWINDOW (0), dann wird wi_shandle zusätzlich ganz nach +vorne gestellt (ansonsten wird die Reihenfolge der Fenster +untereinander nicht geändert). wi_shandle muß offen sein und +der Applikation wi_sw1 gehören. +
  +
Es ist nicht garantiert, daß eine Applikation WF_TOPALL auf die +Fenster einer anderen Applikation anwenden kann (vorallem in einer +Multitasking-Umgebung). In diesem Fall wird 0 zurückgegeben. +
  +
Achtung: Das Vorhandensein dieses Features sollte per +appl_getinfo (Opcode 22360) ermittelt werden. +
  + +
WF_UNICONIFY (27) das Fenster wird unikonifiziert. +
Achtung: Das Vorhandensein dieses Features sollte per +appl_getinfo (Opcode 11) erfragt werden. +
  + +
WF_UNICONIFYXYWH (28) das Fenster wird unikonifiziert. Die Parameter wi_sw1 +bis wi_sw4 geben Position und Größe des Fensters im +unikonifizierten Zustand an. Dieser Opcode ist dann besonders +nützlich, wenn ein Fenster bereits im ikonifizierten Zustand +geöffnet worden ist. +
  + +
WF_USER_POINTER (230) Link a user value to the windows. +
wi_sw1 and wi_sw2 are the 2 value you can transmit +it could be used as 32 bits pointer but any value can be provided. +
MyAES feature +
  + +
WF_VSLIDE (9) setzt den vertikalen Slider auf die neue Position +wi_sw1 (0 ganz oben bis 1000 ganz unten). +
  + +
WF_VSLSIZE (16) setzt die Höhe des vertikalen Sliders relativ zur Gesamthöhe +auf den Wert wi_sw1 (-1 kleinste Höhe, 1 klein bis 1000 +Gesamthöhe). +
  + +
WF_WCOLOR z.Zt. keine Informationen bekannt. +
  + +
WF_WHEEL (40) Setzt für ein Fenster (wi_shandle= Fensterkennung) +oder alle Applikationen (wi_shandle= 0) die WA_WHEEL +Nachricht. Ist wi_sw1 = 1 dann sendet XaAES eine spezielle +WM_ARROWED (WA_WHEEL) Nachricht. Bei wi_sw1 = 1 kommt die +normalen Nachricht. +
ab XaAES v0.960 +
  + +
WF_WIDGETS (200) Setzt die aktuellen Positionen der Sliderobjekte (W_UPARROW, +W_DNARROW, etc.) des Fensters mit dem Handle wi_shandle. In +den Parametern wi_sw1 und wi_sw2 werden die vertikal +Elemente des typs rightwidgets, in den Parametern wi_sw3 und +wi_sw4 die horizontal Elemente des typs bottomwidgets +übergeben. wi_sw1 ist das oberste Element, wi_sw2 das +unterste Element des Vertikalsliders. wi_sw3 ist das linkeste +Element, wi_sw4 das rechteste Element des Horizontalsliders. +
  + +
WF_APPICON (201) Setzt ein Icon neben den Schliessknopf. (N.AES 3.0, never +released) +
  + +
WF_WIND_ATTACH (231) attach a window to another, using it if you close the mother +window other windows linked will be closed. wi_sw1 the window +to attach. +
MyAES feature +
  + +
WF_WINXCFG (22361) Setzt die globalen und lokalen Schalter der aufrufenden +Applikation, falls dies möglich ist. +
  + + + + + + + + + + + + +
wi_sw1 = Maske der bei diesem Aufruf zu verändernden globalen Schalter +(Bit gesetzt bedeutet, Schalter übernehmen). +
wi_sw2 = Neue Schalterstellung der globalen Schalter (Bit gesetzt +bedeutet, Schalter eingeschaltet). +
wi_sw3 = Maske der bei diesem Aufruf zu verändernden lokalen Schalter +(Bit gesetzt bedeutet, Schalter übernehmen). +
wi_sw4 = Neue Schalterstellung der lokalen Schalter (Bit gesetzt +bedeutet, Schalter eingeschaltet). + +
+ +
Welche Schalter tatsächlich verändert wurden, kann man nur +durch einen Aufruf von wind_get( WF_WINXCFG) ermitteln. ACHTUNG: Diese +Funktion sollte nur von Konfigurationsprogrammen aufgerufen werden, +die wissen was sie tun (z.B. WINX.CPX). +
  +
Achtung: Das Vorhandensein dieses Features sollte per +appl_getinfo (Opcode 22360) ermittelt werden. +
  + +
+ +
Hinweis: Die Parameter wi_sw1, wi_sw2, wi_sw3 und wi_sw4 +sind dabei von der über den Parameter wi_sfield übergebenen +Funktionsnummer abhängig. +
  +
Bei der Angabe des Fensternamens sollte man aus ästhetischen +Gründen vor und hinter der Zeichenkette immer ein Leerzeichen +lassen, da sonst das Muster im Fensternamen direkt am ersten und am +letzten Buchstaben hängt. +
  +
Achtung: Die hier angegebenen Opcodes sind nicht +mehr vollständig zum PC-GEM kompatibel, da die Entwicklung dort in +eine andere Richtung ging. +
  +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Verfügbar: In allen AES Versionen. +
  +
Gruppe: Fensterverwaltung +
  +
Querverweis: Binding   wind_get   wind_create   OBJECT   Unterfunktionsübersicht +
  + +
+ +

8.9.11.1 wind_set und PC-GEM

+

Ab PC-GEM Version 2.0 gilt: +

+ +

WF_ATTRB (18): setzt den Fenster-Attributvektor. Es +gilt: wi_sw1 = 0 (bzw. 1): Fenster ist oberstes Fenster bzw. nicht; +ansonsten keine weiteren Informationen bekannt. +

+ +

WF_SIZETOP (19): Fenster zum aktiven Fenster machen, +ohne die Reihenfolge der anderen Fenster zu verändern. Gleichzeitig +können die Position und Größe des Fensters neu festgelegt werden: +

+ + + + + + + + + + + + +
wi_sw1 = X-Position, und +
wi_sw2 = Y-Position +
wi_sw3 = Breite, und +
wi_sw4 = Höhe des Fensters + +
+ +

8.9.11.2 Bindings für wind_set

+ + + + + + + + + +
C: int16_t wind_set ( int16_t wi_shandle, int16_t wi_sfield, +int16_t wi_sw1, int16_t wi_sw2, int16_t wi_sw3, int16_t wi_sw4 ); +
  +
Umsetzung: +
  +
int16_t wind_set ( int16_t wi_shandle, int16_t wi_sfield,
+                   int16_t wi_sw1, int16_t wi_sw2,
+                   int16_t wi_sw3, int16_t wi_sw4 )
+{
+   int_in[0]  = wi_shandle;
+   int_in[1]  = wi_sfield;
+   int_in[2]  = wi_sw1;
+   int_in[3]  = wi_sw2;
+   int_in[4]  = wi_sw3;
+   int_in[5]  = wi_sw4;
+
+   return ( crys_if(105) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]105 # Opcode der Funktion
control+2control[1]6 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]wi_shandle
int_in+2int_in[1]wi_sfield
int_in+4int_in[2]wi_sw1
int_in+6int_in[3]wi_sw2
int_in+8int_in[4]wi_sw3
int_in+10int_in[5]wi_sw4
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.9.11.3 WF_TOPMOST, wind_set

+ +

A class of windows that will always 'float' ontop of classical +windows. One key feature of windows in any WF_TOPMOST state is that they +do not disturb current keyboard focus, and can be used to issue +important messages, status raports, etc., without demanding user +interaction. +

+

wind_set (wi_shandle, WF_TOPMOST, wi_sw1,...) +

+

WF_TOPMOST (232) +

+ + + +
wi_sw1 = + + + + + + + + + +
0 = Remove topmost state on the corresponding window. +
1 = Set topmost state on the corresponding window. +
2 = Set topmost state and link window visibility to the owner's +focus. That is, when owner is untopped the window disappears, when +owner regains focus, the window automatically reappears. + +
+ + +
+ +

Some common characteristics of windows with any WF_TOPMOST state +set; +

+ +
    +
  1. Changing the WF_TOPMOST state can be done on open windows, but it +is prefer not if possible. +
  2. +
  3. Windows which have TOPMOST state 1 or 2 never get keyboard +focus. +
  4. +
  5. Windows which have TOPMOST state 1 or 2 never get WM_TOPPED or +WM_UNTOPPED AES messages. +
  6. +
+ +

State 1: +
Setting state 1 will make the corresponding window 'float' ontop +of all other classical windows. State 1 windows will stay ontop until +closed by the user or the application itself. +

+

State 2: +
Setting state 1 will make the corresponding window act like +windows with state 1 set, with one important exception; The window is +linked to the window owner's focus status. This means that when the +application that owns the window looses focus, state 2 windows are +automatically made unvisible by the AES. When the application +regains focus, the window is automatically made visible again. This is +done automatically, and no application handling is necessary. +

+

8.9.12 wind_update

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Update Window« - bestimmt das Neuzeichnen eines Fensters. +
  +
AES-Nummer: 107 +
  +
Deklaration: int16_t wind_update ( int16_t wi_ubegend ); +
  +
Beschreibung: Die Funktion signalisiert dem AES, daß die Benutzerapplikation +gerade den Bildschirm neu aufbaut. Das AES schränkt daraufhin seine +eigenen grafischen "Tätigkeiten", wie z. B. das +Herunterklappen von Dropdownmenüs, ein. +
  + + + + + + + + + + + + + + + + + + +
wi_ubegend Bedeutung +
    +
END_UPDATE (0) Bildschirmaufbau ist abgeschlossen. +
BEG_UPDATE (1) Aufbau beginnt, Rechtecklisten werden eingefroren. +
END_MCTRL (2) Applikation gibt Mauskontrolle ab +
BEG_MCTRL (3) die Applikation möchte die alleinige Kontrolle über die Maus +haben. + +
+ +
MagiC implementiert den 'check and set mode' von AES +4.00 Der Aufruf erfolgt in diesem Fall per wind_update +(BEG_UPDATE|0x100) bzw. wind_update (BEG_MCTRL|0x100). Dabei wird die +Update-Kontrolle nur noch übernommen, falls keine andere Applikation +die Kontrolle hat bzw. die eigene Applikation besitzt. +
  +
Das Vorhandensein dieses Features kann per appl_getinfo (Opcode 11) +abgefragt werden. +
  +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Fensterverwaltung +
  +
Querverweis: Binding +
  + +
+ +

8.9.12.1 Bindings für wind_update

+ + + + + + + + + +
C: int16_t wind_update ( int16_t wi_ubegend ); +
  +
Umsetzung: +
  +
int16_t wind_update (int16_t wi_ubegend)
+{
+   int_in[0] = wi_ubegend;
+   return ( crys_if(107) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]107 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]wi_ubegend
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.9.13 wind_xget

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Get Window« - ermittelt die Parameter eines Fensters. +
  +
AES-Nummer: 104 +
  +
Deklaration: int16_t wind_xget ( int16_t wi_ghandle, int16_t wi_gfield, +int16_t *wi_gw1, int16_t *wi_gw2, int16_t *wi_gw3, int16_t *wi_gw4, +int16_t *wo_gw1, int16_t *wo_gw2, int16_t *wo_gw3, int16_t *wo_gw4 ); +
  +
Beschreibung: Die Funktion liefert abhängig von den übergebenen Parametern +verschiedene Informationen über das Fenster mit der Kennung +wi_ghandle. Es gilt für wi_gfield. +
  +
Zusammenfassung aller Unterfunktionen +
  + + + + + + + + + + +
WF_CALCF2W (42) +
This mode will take an arbitrary FULL area, and return the +corresponding WORK area. +
  +
Das Vorhandensein dieses Features sollte per appl_getinfo (Opcode 11) +ermittelt werden. +
  + +
WF_CALCW2F (43) +
This mode will take an arbitrary WORK area, and return the +resulting FULL area of the window in question. +
  +
Das Vorhandensein dieses Features sollte per appl_getinfo (Opcode 11) +ermittelt werden. +
  + +
WF_FIRSTAREAXYWH (13) +
wi_gw1, wi_gw2, wi_gw3 und wi_gw4 +is a clipping area, and the AES may optimize the list of rectangles +returned by WF_FIRSTAREAXYWH and WF_NEXTXYWH. +
  +
Das Vorhandensein dieses Features sollte per appl_getinfo (Opcode 11) +ermittelt werden. +
  + +
+ +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Verfügbar: XaAES seit 2004-12-14 +
  +
Gruppe: Fensterverwaltung +
  +
Querverweis: Binding   wind_get   wind_set   Unterfunktionsübersicht +
  + +
+ +

8.9.13.1 Bindings für wind_xget

+ + + + + + + + + +
C: int16_t wind_xget ( int16_t wi_ghandle, int16_t wi_gfield, +int16_t *wi_gw1, int16_t *wi_gw2, int16_t *wi_gw3, int16_t *wi_gw4, +int16_t *wo_sw1, int16_t *wo_sw2, int16_t *wo_sw3, int16_t *wo_sw4 ); +
  +
Umsetzung: +
  +
int16_t wind_xget ( int16_t wi_ghandle, int16_t wi_gfield,
+                    int16_t *wi_gw1, int16_t *wi_gw2,
+                    int16_t *wi_gw3, int16_t *wi_gw4,
+                    int16_t *wo_sw1, int16_t *wo_sw2,
+                    int16_t *wo_sw3, int16_t *wo_sw4 );
+{
+   int_in[0]  = wi_ghandle;
+   int_in[1]  = wi_gfield;
+   int_in[2]  = *wi_sw1;
+   int_in[3]  = *wi_sw2;
+   int_in[4]  = *wi_sw3;
+   int_in[5]  = *wi_sw4;
+
+   crys_if (104);
+
+   *wo_gw1 = int_out[1];
+   *wo_gw2 = int_out[2];
+   *wo_gw3 = int_out[3];
+   *wo_gw4 = int_out[4];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]104 # Opcode der Funktion
control+2control[1]6 # Einträge in int_in
control+4control[2]5 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]wi_ghandle
int_in+2int_in[1]wi_gfield
int_in+4int_in[2]wi_gw1
int_in+6int_in[3]wi_gw2
int_in+8int_in[4]wi_gw3
int_in+10int_in[5]wi_gw4
int_outint_out[0]Return-Wert
int_out+2int_out[1]wo_gw1
int_out+4int_out[2]wo_gw2
int_out+6int_out[3]wo_gw3
int_out+8int_out[4]wo_gw4
+
+ + +
+ +

8.9.14 wind_xset

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Window« - verändert einzelne Parameter eines Fensters. +
  +
AES-Nummer: 105 +
  +
Deklaration: int16_t wind_xset ( int16_t wi_shandle, int16_t wi_sfield, +int16_t wi_sw1, int16_t wi_sw2, int16_t wi_sw3, int16_t wi_sw4, +int16_t *wo_sw1, int16_t *wo_sw2, int16_t *wo_sw3, int16_t *wo_sw4 ); +
  +
Beschreibung: Die Funktion verändert, abhängig von den übergebenen +Parametern, verschiedene Eigenschaften des Fensters mit der Kennung +wi_shandle. Es gilt für wi_sfield. +
  +
Zusammenfassung aller Unterfunktionen +
  + + + + + + + + + + +
WF_CURRXYWH (5) +
setzt die Fenstergröße aus wi_sw1, wi_sw2, +wi_sw3 und wi_sw4 fest. +
  +
XaAES is compatible with all other AES's, except from the +following points: +
  + +
    +
  1. If x, y, w and h all have a value of -1, XaAES ignores the +call, but fills in any return values when needed. +
      +

  2. +
  3. x and y values of -1 are 'legal', i.e, one cannot use -1 to use +any old x value. Ofcourse, x and y coordinates are checked to be +inside the rootwindow (not X when noleft = false). +
      +

  4. +
  5. When h have a value of 0, the window is infact shaded. This is +a thing N.AES does with MiNTSetter, altho I'm not sure this is +correct. The application is sent a WM_SHADED. On the next +wind_set(handle, WF_CURRXYWH,...) where the h coordinate is not equal +to the window's shaded height, the window is unshaded. While the +window is shaded via this method, shift-clicks on the window title to +shade a window is ignored. +
      +

  6. +
+ +
XaAES since 2004-09-22, there is an short version. +
  + +
WF_FULLXYWH (7) +
If either wi_sw1, wi_sw2, wi_sw3 or +wi_sw4 have a value of -1, that coordinate is not changed. If +ALL coordinates have a value of -1, the window is actually moved to +the current FULLXYWH coordinates, making the current window position +the new PREVXYWH position. +
  + +
    +
  1. XaAES returns the resulting FULLXYWH, which the window will be +moved to on the next use of the FULLED gadget or... +
  2. +
  3. When all coordinates passed have a value of -1, XaAES return +the CURRXYWH of the new position the window was moved to, removing the +need for a wind_get(handle, WF_CURRXYWH,...) call. +
  4. +
+ +
XaAES since 2004-09-22, there is an short version. +
  + +
WF_PREVXYWH (6) +
If eitherwi_sw1, wi_sw2, wi_sw3 or +wi_sw4 have a value of -1, that coordinate is not changed. If +ALL coordinates have a value of -1, the window is actually moved to +the current PREVXYWH coordinates, making the current window position +the new PREVXYWH position. +
  + +
    +
  1. XaAES returns the resulting PREVXYWH, which the window will be +moved to on the next use of the FULLED gadget or... +
  2. +
  3. When all coordinates passed have a value of -1, XaAES return +the CURRXYWH of the new position the window was moved to, removing the +need for a wind_get(handle, WF_CURRXYWH,...) call. +
  4. +
+ +
XaAES since 2004-09-22, there is an short version. +
  + +
+ +
Hinweis: Die Parameter wi_sw1, wi_sw2, wi_sw3 und wi_sw4 +sind dabei von der über den Parameter wi_sfield übergebenen +Funktionsnummer abhängig. +
  +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Verfügbar: All AES versions. +
  +
Gruppe: Fensterverwaltung +
  +
Querverweis: Binding   wind_get   wind_create   OBJECT   Unterfunktionsübersicht +
  + +
+ +

8.9.14.1 Bindings für wind_xset

+ + + + + + + + + +
C: int16_t wind_xset ( int16_t wi_shandle, int16_t wi_sfield, +int16_t wi_sw1, int16_t wi_sw2, int16_t wi_sw3, int16_t wi_sw4, +int16_t *wo_sw1, int16_t *wo_sw2, int16_t *wo_sw3, int16_t *wo_sw4 ); +
  +
Binding: +
  +
int16_t wind_xset ( int16_t wi_shandle, int16_t wi_sfield,
+                    int16_t wi_sw1, int16_t wi_sw2,
+                    int16_t wi_sw3, int16_t wi_sw4,
+                    int16_t *wo_sw1, int16_t *wo_sw2,
+                    int16_t *wo_sw3, int16_t *wo_sw4 );
+{
+   int_in[0]  = wi_shandle;
+   int_in[1]  = wi_sfield;
+   int_in[2]  = wi_sw1;
+   int_in[3]  = wi_sw2;
+   int_in[4]  = wi_sw3;
+   int_in[5]  = wi_sw4;
+
+   crys_if(105);
+
+   *wo_sw1 = int_out[1];
+   *wo_sw1 = int_out[2];
+   *wo_sw1 = int_out[3];
+   *wo_sw1 = int_out[4];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]105 # Opcode der Funktion
control+2control[1]6 # Einträge in int_in
control+4control[2]5 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]wi_shandle
int_in+2int_in[1]wi_sfield
int_in+4int_in[2]wi_sw1
int_in+6int_in[3]wi_sw2
int_in+8int_in[4]wi_sw3
int_in+10int_in[5]wi_sw4
int_outint_out[0]Return-Wert
int_out+2int_out[1]wo_sw1
int_out+4int_out[2]wo_sw2
int_out+6int_out[3]wo_sw3
int_out+8int_out[4]wo_sw4
+
+ + +
+ +

8.9.15 x_wdial_change

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Redraw object« - Redraw one object within a window dialog, +showing a new state. +
  +
AES-Nummer: 29009 +
  +
Deklaration: int16_t x_wdial_change( int16_t handle, int16_t object, int16_t +newstate ); +
  +
Beschreibung: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Handle of the window having the dialog +
object Object whose state is changing +
newstate The object's new ob_state + +
+ +
This function will redraw an object in a dialog contained within +a window, showing its new state. This is commonly used to show an exit +button being selected or another button becoming disabled. The dialog +must have previously been set using the wind_set option X_WF_DIALOG. +
  +
Ergebnis: 0 = An error occurred +
  +
An error code is returned if either the handle specified is not +a valid window handle, if the window does not belong to the +application making the x_wdial_draw call, if the window does not +contain a dialog, or if the window is not currently open. +
  +
Verfügbar: Die Funktion steht nur unter Geneva zur Verfügung. +
  +
Gruppe: Fensterverwaltung +
  +
Querverweis: Binding +
  + +
+ +

8.9.15.1 Bindings für x_wdial_change

+ + + + + + + + + +
C: int16_t x_wdial_change( int16_t handle, int16_t object, int16_t +newstate ); +
  +
Umsetzung: +
  +
int16_t x_wdial_change( int16_t handle, int16_t object,
+int16_t newstate )
+{
+   int_in[0] = handle;
+   int_in[1] = object;
+   int_in[2] = newstate;
+
+   crys_if(29009);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]29009 # Opcode der Funktion
control+2control[1]3 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]handle
int_in+2int_in[1]object
int_in+4int_in[2]newstate
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.9.16 x_wdial_draw

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Redraw dialog« - Fenster mit eine Dialog neu zeichnen +
  +
AES-Nummer: 29008 +
  +
Deklaration: int16_t x_wdial_draw( int16_t handle, int16_t start, int16_t +depth ); +
  +
Beschreibung: +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
handle Kennung des Fensters, welches einen Dialog hat +
edit_obj Object being edited +
start First object to draw +
depth Level to draw until: +
+
+ + + + + + + + + + + + + + + + + + + + +
0=Draw just the object
1=Draw object and its immediate children
...  
8=Draw all levels of children
+
+ + +
+ +
This function will redraw a dialog contained within a window. +The dialog must have previously been set using the wind_set option +X_WF_DIALOG. +
  +
The dialog is redrawn, starting at start, continuing for depth +levels, taking into account any other windows which may overlap the +one being drawn. +
  +
Ergebnis: 0 = An error occurred +
  +
An error code is returned if either the handle specified is not +a valid window handle, if the window does not belong to the +application making the x_wdial_draw call, if the window does not +contain a dialog, or if the window is not currently open. +
  +
Verfügbar: Die Funktion steht nur unter Geneva zur Verfügung. +
  +
Gruppe: Fensterverwaltung +
  +
Querverweis: Binding +
  + +
+ +

8.9.16.1 Bindings für x_wdial_draw

+ + + + + + + + + +
C: int16_t x_wdial_draw( int16_t handle, int16_t start, int16_t +depth ); +
  +
Umsetzung: +
  +
int16_t x_wdial_draw( int16_t handle, int16_t start, int16_t
+depth )
+{
+   int_in[0] = handle;
+   int_in[1] = start;
+   int_in[2] = depth;
+
+   crys_if(29008);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]29008 # Opcode der Funktion
control+2control[1]3 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]handle
int_in+2int_in[1]start
int_in+4int_in[2]depth
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.9.17 x_wind_calc

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Window Calculation« - berechnet die Grenzen oder den +gesamten Platzbedarf eines Fensters, erweiterte Version. +
  +
AES-Nummer: 29012 +
  +
Deklaration: int16_t x_wind_calc ( int16_t wi_ctype, int16_t wi_ckind, +int16_t wi_xkind, int16_t wi_cinx, int16_t wi_ciny, int16_t wi_cinw, +int16_t wi_cinh, int16_t *coutx, int16_t *couty, int16_t *coutw, +int16_t *couth ); +
  +
Beschreibung: +
  + + + + + + + + + +
Parameter Bedeutung +
    +
wi_xkind Extended window type: +
+
+ + + + + + + + + + + + + + + + + + + + +
ElementValueMeaning
X_MENU0x0001 
X_HSPLIT0x0002 
X_VSPLIT0x0004 
+
+ + +
+ +
All other parameter see wind_calc. +
  +
If you wish to use new or extended functions such as the X_MENU +or split window attributes, then x_wind_create must be used to create +these windows. +
  +
Ergebnis: Ein Fehler ist nur dann aufgetreten, wenn als Ergebnis 0 +zurückgegeben wird. +
  +
Verfügbar: Die Funktion steht nur unter Geneva zur Verfügung. +
  +
Gruppe: Fensterverwaltung +
  +
Querverweis: Binding   x_wind_create +
  + +
+ +

8.9.17.1 Bindings für x_wind_calc

+ + + + + + + + + +
C: int16_t x_wind_calc ( int16_t wi_ctype, int16_t wi_ckind, +int16_t wi_xkind, int16_t wi_cinx, int16_t wi_ciny, int16_t wi_cinw, +int16_t wi_cinh, int16_t *coutx, int16_t *couty, int16_t *coutw, +int16_t *couth ); +
  +
Umsetzung: +
  +
int16_t x_wind_calc ( int16_t wi_ctype, int16_t wi_ckind,
+int16_t wi_xkind, int16_t wi_cinx, int16_t wi_ciny, int16_t
+wi_cinw, int16_t wi_cinh, int16_t *coutx, int16_t *couty,
+int16_t *coutw, int16_t *couth )
+{
+   int_in[0]  = wi_ctype;
+   int_in[1]  = wi_ckind;
+   int_in[2]  = wi_xkind;
+   int_in[3]  = wi_cinx;
+   int_in[4]  = wi_ciny;
+   int_in[5]  = wi_cinw;
+   int_in[6]  = wi_cinh;
+
+   crys_if(29012);
+
+   *coutx = int_out[1];
+   *couty = int_out[2];
+   *coutw = int_out[3];
+   *couth = int_out[4];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]29012 # Opcode der Funktion
control+2control[1]7 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]wi_ctype
int_in+2int_in[1]wi_ckind
int_in+4int_in[2]wi_xkind
int_in+6int_in[3]wi_cinx
int_in+8int_in[4]wi_ciny
int_in+10int_in[5]wi_cinw
int_in+12int_in[6]wi_cinh
int_outint_out[0]Return-Wert
int_out+2int_out[1]coutx
int_out+4int_out[2]couty
int_out+6int_out[3]coutw
int_out+8int_out[4]couth
+
+ + +
+ +

8.9.18 x_wind_create

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Window create« - meldet ein neues Fenster an, erweiterte +Version +
  +
AES-Nummer: 29011 +
  +
Deklaration: int16_t x_wind_create ( int16_t wi_crkind, int16_t wi_xkind, +int16_t wi_crwx, int16_t wi_crwy, int16_t wi_crww, int16_t wi_crwh ); +
  +
Beschreibung: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
wi_crkind Fenster Komponenten (wie wind_create) +
wi_xkind Extended window type: + + + +
+
+ + + + + + + + + + + + + + + + + + + + +
KomponenteWertBedeutung
X_MENU0x0001 
X_HSPLIT0x0002 
X_VSPLIT0x0004 
+
+ +
wi_crwx Window x-coordinate +
wi_crwy Window y-coordinate +
wi_crww Window width +
wi_crwh Window height + +
+ +
If you wish to use new or extended functions such as the X_MENU +or split window attributes, then x_wind_create must be used to create +these windows. +
  +
Ergebnis: 0 = An error occurred +
  +
Verfügbar: Die Funktion steht nur unter Geneva zur Verfügung. +
  +
Gruppe: Fensterverwaltung +
  +
Querverweis: Binding   wind_delete +
  + +
+ +

8.9.18.1 Bindings für x_wind_create

+ + + + + + + + + +
C: int16_t x_wind_create ( int16_t wi_crkind, int16_t wi_xkind, +int16_t wi_crwx, int16_t wi_crwy, int16_t wi_crww, int16_t wi_crwh ); +
  +
Umsetzung: +
  +
int16_t x_wind_create ( int16_t wi_crkind, int16_t wi_xkind,
+int16_t wi_crwx, int16_t wi_crwy, int16_t wi_crww, int16_t
+wi_crwh )
+{
+   int_in[0]  = wi_crkind;
+   int_in[1]  = wi_xkind;
+   int_in[2]  = wi_crwx;
+   int_in[3]  = wi_crwy;
+   int_in[4]  = wi_crww;
+   int_in[5]  = wi_crwh;
+
+   crys_if(29011);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]29011 # Opcode der Funktion
control+2control[1]6 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]wi_crkind
int_in+2int_in[1]wi_xkind
int_in+4int_in[2]wi_crwx
int_in+6int_in[3]wi_crwy
int_in+8int_in[4]wi_crww
int_in+10int_in[5]wi_crwh
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.9.19 x_wind_tree

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Window gadgets« - Change window gadgets +
  +
AES-Nummer: 29010 +
  +
Deklaration: int16_t x_wind_tree( int16_t mode, WIND_TREE *wtree ); +
  +
Beschreibung: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
mode + + + +
+
+ + + + + + + + + + + + + + + + + + + + +
modeValueMeaning
X_WT_GETCNT0  Get count and flag
X_WT_READ1  Copy window tree
X_WT_SET2  Set new tree
+
+ +
wtree Pointer to a WIND_TREE structure + +
+ +
This function alters the way in which Geneva draws and processes +the gadgets of a particular window. This allows a program to take +control over how gadgets react to the mouse, and also to add new +gadgets. +
  +
The gadgets that make up a window are really just another OBJECT +tree. This function allows you to modify it by (optionally) reading +the current tree into a block of your program's memory. Geneva can +then be informed that the modified tree (or, for that matter, any +OBJECT tree) should be used for the window gadgets. +
  +
Note: This function will only affect windows which have +already been created. +
  +
If all you need to do in your program is to change the fill +patterns or colors of a gadget, it is better to use wind_set( WF_COLOR +) to accomplish this task, if possible. +
  +
Mode 0, X_WT_GETCNT (get count & flags) +
This mode must be used prior to mode 1. It sets the count element +of the structure pointed to by wtree to contain the number of OBJECTS +that make up the bendow's tree. The tree element is unchanged. +beginning of section top of page +
  +
Mode 1, X_WT_READ (Read the current tree into the program's +memory) +
This mode copies count OBJECTS of the window's current tree into +the array of OBJECTS pointed to by the tree element. The area of +memory MUST be large enough to hold count elements. +
  +
Note that any objects in the resulting tree which have the +HIDETREE ob_flag set are inactive, and their sizes and locations may +be inaccurate. +
  +
If the tree which was being copied was the default OBJECT tree +used by Geneva, then the ob_spec fields of the second (WGMOVE) and +seventh (WGINFO) OBJECTS in the resulting copy will be zero. If this +tree is then set (using mode 2, below), and the X_WTFL_RESIZE bit is +on, then the programmer MUST modify these ob_spec's to point to +TEDINFO structures! Otherwise, Geneva will attempt to set the title +and info text in bad memory locations. beginning of section top of +page +
  +
Mode 2, X_WT_SET (Set count, flags, and tree address) +
This mode changes the attributes. If count is not less than zero, +the window's OBJECT tree and count of objects will be set. The tree +element must point to a static area of memory containing an OBJECT +tree. The flags are always set, regardless of count. +
  +
The following bits are defined in the flags element. By default, +they are all set (turned on) for any window that is created. Undefined +bits are reserved for future use and should not be modified. +
  +
    +
  • Flags bit 0, X_WTFL_RESIZE +
      +
    When set, the window's gadgets are automatically resized +whenever the window's size is changed. If this bit is on, the ordering +of the OBJECTs which make up the window's tree MUST not change. +However, more objects can be appended to the end of the tree. When +this bit is off, Geneva will never change the sizes, positions, flags, +colors, or text of any object in the tree. +
      +

  • +
  • Flags bit 1, X_WTFL_CLICKS +
      +
    When set, the window responds normally to mouse clicks on the +gadgets by moving the window, dragging the scroll bars, etc. When this +bit is off, any mouse clicks (or keyboard equivalents for these +actions) will be returned as either a WM_ARROWED message to indicate +which arrow/scroll bar gadget was chosen, or an X_WM_SELECTED message +for any other gadget. In this case, the program is responsible for +taking an appropriate action. The Task Manager uses this bit in its +"Keyboard..." dialog. +
      +

  • +
  • Flags bit 2, X_WTFL_SLIDERS +
      +
    When set, the sliders of a windowed dialog and info bar of a +window will act normally. When it is off, the sliders for a windowed +dialog will never change (even if the dialog is moved by the +application), and clicking on the info left/right arrows will do +nothing. The Task Manager uses this bit in its "Keyboard..." +dialog. +
      +

  • +
+ +
Example: +
  +
/* Get the tree for a window, and change the appearence of
+the up and down arrows */
+TEDINFO info_ted, mover_ted;
+OBJECT *tree
+WIND_TREE wt;
+int16_t handle;
+
+/* Create a window */
+if( (handle = wind_create( UPARROW|DNARROW|VSLIDE, 20, 20,
+   200, 200 )) != 0 )
+{
+  /* Get the current count and flags */
+  wt.handle = handle;
+  x_wind_tree( X_WT_GETCNT, &wt );
+  /* Now allocate enough memory to hold the entire tree */
+  if( (tree = Malloc( wt.count*sizeof(OBJECT) )) != 0 )
+  {
+     /* And get the tree */
+     wt.tree = tree;
+     x_wind_tree( X_WT_READ, &wt );
+     /* Now, we *must* set these two TEDINFO's. The
+        contents of theTEDINFO's is not important
+        because the info and mover bars  are not used */
+     tree[WGMOVE].ob_spec.tedinfo = &mover_ted;
+     tree[WGINFO].ob_spec.tedinfo = &info_ted;
+     /* Modify the arrows. The up arrow will now be a
+        '^' character, and the down arrow will be a 'v' */
+     tree[WGUP].ob_spec.bfobspec.character = '^';
+     tree[WGDOWN].ob_spec.bfobspec.character = 'v';
+     x_wind_tree( X_WT_SET, &wt );
+     /* All done! The window can be opened now, but don't
+        forget to Mfree(tree) later on when it's closed. */
+  }
+}
+
+
Ergebnis: 0 = An error occurred +
  +
Verfügbar: Die Funktion steht nur unter Geneva zur Verfügung. +
  +
Gruppe: Fensterverwaltung +
  +
Querverweis: Binding +
  + +
+ +

8.9.19.1 Bindings für x_wind_tree

+ + + + + + + + + +
C: int16_t x_wind_tree( int16_t mode, WIND_TREE *wtree ); +
  +
Umsetzung: +
  +
int16_t x_wind_tree( int16_t mode, WIND_TREE *wtree )
+{
+   int_in[0] = mode;
+   addr_in[0] = wtree;
+
+   crys_if(29010);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]29010 # Opcode der Funktion
control+2control[1]1 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]mode
addr_inaddr_in[0]wtree
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.9.20 Die Komponenten eines Fensters

+ +

Die folgende Abbildung zeigt das Fenster eines +GEM-Texteditors, und beschreibt die wichtigsten Komponenten dieses +Fensters. +

+

+

Querverweis: wind_create   Fensterverwaltung +

+

8.9.21 Übersicht der wind_get/set Unterfunktionen

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Unterfunktiondezhexgetxgetsetxset
WF_KIND10x0001x x 
WF_NAME20x0002x x 
WF_INFO30x0003x x 
WF_WORKXYWH40x0004x   
WF_CURRXYWH50x0005x xx
WF_PREVXYWH60x0006x xx
WF_FULLXYWH70x0007x xx
WF_HSLIDE80x0008x x 
WF_VSLIDE90x0009x x 
WF_TOP100x000Ax x 
WF_FIRSTXYWH110x000Bx   
WF_NEXTXYWH120x000Cx   
WF_IGNORE130x000D  x 
WF_FIRSTAREAXYWH130x000D x  
WF_NEWDESK140x000Ex x 
WF_HSLSIZE150x000Fx x 
WF_VSLSIZE160x0010x x 
WF_SCREEN170x0011x   
WF_COLOR180x0012  x 
WF_ATTRB180x0012  x 
WF_DCOLOR190x0013x x 
WF_SIZETOP190x0013  x 
WF_OWNER200x0014x   
WF_TOPAP (only X/GEM)200x0014    
WF_BEVENT240x0018x x 
WF_BOTTOM250x0019x x 
WF_ICONIFY260x001Ax x 
WF_UNICONIFY270x001Bx x 
WF_UNICONIFYXYWH280x001C  x 
WF_TOOLBAR300x001Ex x 
WF_FTOOLBAR310x001Fx   
WF_NTOOLBAR320x0020x   
WF_MENU330x0021x x 
WF_WHEEL400x0028x x 
WF_OPTS410x0029x x 
WF_CALCF2W420x002A x  
WF_CALCW2F430x002B x  
WF_CALCF2U440x002C    
WF_CALCU2F450x002D    
WF_MAXWORKXYWH460x002E    
WF_M_BACKDROP1000x0064x   
WF_M_OWNER1010x0065x   
WF_M_WINDLIST1020x0066x   
WF_MINXYWH1030x0067x   
WF_INFOXYWH1040x0068x   
WF_WIDGETS2000x00C8x x 
WF_APPICON2010x00C9  x 
WF_USER_POINTER2300x00E6x x 
WF_WIND_ATTACH2310x00E7  x 
WF_TOPMOST2320x00E8  x 
WF_BITMAP2330x00E9x   
WF_OPTIONS2340x00EA  x 
WF_FULLSCREEN2350x00EB  x 
WF_OBFLAG10010x03E9x x 
WF_OBTYPE10020x03EAx   
WF_OBSPEC10030x03EBx x 
X_WF_MENU43520x1100x x 
X_WF_DIALOG46080x1200x x 
X_WF_DIALWID48640x1300x x 
X_WF_DIALHT51200x1400x x 
X_WF_DFLTDESK53760x1500x x 
X_WF_MINMAX56320x1600x x 
X_WF_HSPLIT58880x1700x x 
X_WF_VSPLIT61440x1800x x 
X_WF_SPLMIN64000x1900x x 
X_WF_HSLIDE266560x1A00x x 
X_WF_VSLIDE269120x1B00x x 
X_WF_HSLSIZE271680x1C00x x 
X_WF_VSLSIZE274240x1D00x x 
X_WF_DIALFLGS76800x1E00x x 
X_WF_OBJHAND79360x1F00x x 
X_WF_DIALEDIT81920x2000x x 
X_WF_DCOLSTAT84480x2100x x 
WF_WINX223600x5758x   
WF_WINXCFG223610x5759x x 
WF_DDELAY223620x575Ax x 
WF_SHADE223650x575Dx x 
WF_STACK223660x575E  x 
WF_TOPALL223670x575F  x 
WF_BOTTOMALL223680x5760  x 
XA225930x5841x   
+
+ +

8.9.22 wind_get und wind_set mode von Geneva

+

In all cases, the wind_get function can be used to retrieve the +following information for a particular window. wind_set can be used to +set the values. +

+
+
+
+
X_WF_MENU (0x1100)
+
+

+
+
  +
Setting this attribute causes a menu bar to appear below the +window's name and information bars. The wi_sw1 parameter +should have the high-WORD of the address of the object tree containing +the menu. wi_sw2 contains the low-WORD of the address. If a +NULL pointer is passed, the menu bar will be blank. +
  +
Example: +
  +

int handle;
+OBJECT *menu;
+
+handle = x_wind_create( MOVER, X_MENU, 20, 20, 200, 200 );
+if( handle>0 ) {
+  wind_set( handle, X_WF_MENU, menu );
+  wind_open( handle, 20, 20, 200, 200 );
+}
+
+
+
+

+ + +
X_WF_DIALOG (0x1200)
+
+

+
This option allows a program to create dialog boxes within +windows. It is generally used in conjunction with the X_MU_DIALOG +event type. +
  +
The wi_sw1 parameter should have the high-WORD of the +address of the object tree containing the dialog. wi_sw2 +contains the low- WORD of the address. If a NULL address is passed, +there will be no dialog associated with the window, and it will +receive events normally. +
  +
If the window does not have horizontal or vertical sliders, then +the size of the root object of the dialog will automatically be sized +to fit the entire working area of the window. If the window has +sliders, then the dialog will automatically scroll and update as the +user operates them. No action is necessary on the part of the program. +
  +
If the window is open when this call occurs, the entire dialog +is always redrawn and the sliders, if present, are updated. All slider +updates can be turned off by clearing the X_WTFL_SLIDERS attribute for +the window, by way of the x_wind_tree function. +
  +
Refer to the section describing shel_write for information on +how to cause a windowed dialog to scroll by sending a message to +Geneva. +
  +
Example: +
  +

int handle;
+OBJECT dial = { -1, -1, -1, G_BOX, 0, 0,
+                0x021131L, 0, 0, 1000, 1000 };
+                                 /* a large, filled rectangle */
+
+
+handle = wind_create( MOVER|SIZER|CLOSER|UPARROW|DNARROW|\
+              VSLIDE|LFARROW|RTARROW|HSLIDE, 20, 20, 200, 200 );
+
+if( handle>0 ) {
+  wind_set( handle, X_WF_DIALOG, &dial );
+  wind_set( handle, X_WF_DIALHT, 10 );  /* vert. scroll jump  */
+  wind_set( handle, X_WF_DIALWID, 10 ); /* horiz. scroll jump */
+  wind_open( handle, 20, 20, 200, 200 );
+}
+
+
+
+

+ + +
X_WF_DIALWID (0x1300)
+
+

+
+
  +
This option is used in conjunction with the X_WF_DIALOG option. +It controls the interval at which scrolling by the user occurs. For +instance, a value of 10 will cause the left and right scroll arrows to +scroll the dialog within the window by 10 pixels at a time. The +default value is 1. +
  +
Since, by default, Geneva will use a blit operation to move most +of a windowed dialog's contents when scrolling, unpredictable redraw +errors can occur when redrawing the unblitted area of a dialog if the +dialog uses a patterned fill and X_WF_DIALWID is not a multiple of 16 +pixels. +
  +

+
+

+ + +
X_WF_DIALHT (0x1400)
+
+

+
This option is used in conjunction with the X_WF_DIALOG option. It +controls the interval at which scrolling by the user occurs. For +instance, a value of 10 will cause the up and down scroll arrows to +scroll the dialog within the window by 10 pixels at a time. The +default value is 1. +
  +
Since, by default, Geneva will use a blit operation to move most +of a windowed dialog's contents when scrolling, unpredictable redraw +errors can occur when redrawing the unblitted area of a dialog if the +dialog uses a patterned fill and X_WF_DIALWID is not a multiple of 16 +pixels. +
  +

+
+

+ + +
X_WF_DFLTDESK (0x1500)
+
+

+
This option allows a program to redefine the default desktop, so +that it will be something other than the normal grey pattern. The +wi_sw1 parameter should have the high-WORD of the address of +the object tree containing the new object tree. wi_sw2 +contains the low-WORD of the address. If a NULL address is passed, the +built-in default (gray pattern) desktop will become the new default. +The wi_sw3 parameter must contain the total number of objects +in the object tree which contains the new desktop. +
  +
If the application which has changed the default desktop +terminates, the default grey pattern is resumed automatically. +
  +

+
+

+ + +
X_WF_MINMAX (0x1600)
+
+

+
This option allows a program to change the minimum and maximum +sizes to which the user can resize a particular window. +
  +
By default, Geneva calculates a minimum window size that is +large enough to contain all of the window gadgets without overlapping. +The maximum size always defaults to the working area of the entire +desktop. +
  +
The wi_sw1 and wi_sw2 parameters are the minimum +window width and height, respectively, and wi_sw3 and +wi_sw4 are the maximum width and height of the window. Passing +a value of -1 in any of these parameters in a call to wind_set will +cause no change to occur in that one value. +
  +

+
+

+ + +
X_WF_HSPLIT (0x1700)
+
+

+
This option reflects the location of the horizontal split bar of a +window. +
  +
The wi_sw1 parameter is the new location of the bar, in +pixels. If the value is zero, the bar will be all the way to the left +edge; if it is -1 (which is the default) it will be all the way to the +right. +
  +
Return value from wind_get: +
  + + + + + + + + + +
wi_gw1 = Split bar position +
wi_gw2 = Size, in pixels, of the upper window region +
wi_gw3 = Size of the lower window region + +
+ +
Note: The value returned by wind_get may not be equal to +the value supplied to wind_set if the user has either changed the size +of the window, or if the value was too large or not large enough to +exceed the minimum bar position. See the function x_wind_create and +the X_WF_SPLMIN option, below, for more information. +
  +

+
+ +
X_WF_VSPLIT (0x1800)
+
+

+
This option reflects the location of the vertical split bar of a +window. +
  +
The wi_sw1 parameter is the new location of the bar, in +pixels. If the value is zero, the bar will be at the very top; if it +is -1 (which is the default) it will be at the very bottom. +
  +
Return value from wind_get: +
  + + + + + + + + + +
wi_gw1 = Split bar position +
wi_gw2 = Size, in pixels, of the left window region +
wi_gw3 = Size of the right window region + +
+ +
Note that the value returned to wind_get may not be equal to the +value supplied by wind_set if the user has either changed the size of +the window, or if the value was too large or not large enough to +exceed the minimum bar position. See the function x_wind_create and +the X_WF_SPLMIN option, below, for more information. +
  +

+
+ +
X_WF_SPLMIN (0x1900)
+
+

+
This option controls the minimum sizes of the areas defined by the +horizontal and vertical split bars. +
  + + + + + + + + + + + + +
wi_sw1 = Minimum width of region to left of horizontal split +
wi_sw2 = Minimum width of region to right of horizontal split +
wi_sw3 = Minimum height of region above vertical split +
wi_sw4 = Minimum height of region below vertical split + +
+ +
When the user drags a split bar, these values are checked. He +will not be able to drag the bar if the window is too small to fit two +regions having these sizes. When a wind_set call is made to set the +position of one of the split bars, they will be 'snapped' to one edge +or the other if the position is less than 1/2 of the minimum distance +away from the edge. Furthermore, when the window is made smaller, the +positions of the split bars are automatically changed so as to satisfy +these minimum values. For this reason, a program should never assume +that they have not changed. +
  +
Passing a value of -1 in any of these parameters in a call to +wind_set will cause no change to occur in that one value. +
  +

+
+ +
X_WF_HSLIDE2 (0x1A00)
+
+

+
This option gets or sets the position of the second horizontal +slider (which appears to the right of a horizontal split bar) in a +manner identical to WF_HSLIDE. +
  +

+
+

+ + +
X_WF_VSLIDE2 (0x1B00)
+
+

+
This option gets or sets the position of the second vertical +slider (which appears below a vertical split bar) in a manner +identical to WF_VSLIDE. +
  +

+
+

+ + +
X_WF_HSLSIZE2 (0x1C00)
+
+

+
This option gets or sets the size of the second horizontal slider +(which appears to the right of a horizontal split bar) in a manner +identical to WF_HSLSIZE. +
  +

+
+

+ + +
X_WF_VSLSIZE2 (0x1D00)
+
+

+
This option gets or sets the size of the second vertical slider +(which appears below a vertical split bar) in a manner identical to +WF_VSLSIZE. +
  +

+
+
+
+
+

+ + +
X_WF_DIALFLGS (0x1E00)
+
+

+
This option gets/sets flags related to the way dialogs within +windows are processed. Currently, only the following three bits are +used. All other bits are reserved for future use: +
  +

+
X_WD_ACTIVE (bit 0)
+
+

+
When this bit is off, no mouse or keyboard events will be +processed. This is a good way to temporarily lock a windowed dialog +while presenting the user with a sub-dialog that asks for other input +(like the 'Find' option in the Task Manager's 'Flags' dialog.) This +attribute defaults to On. +
  +

+ +
+
X_WD_BLITSCRL (bit 1)
+
+

+
If this flag is set, which it is by default, a windowed dialog +will be scrolled in real time by way of a blit operation. Care should +be taken when displaying object trees which use fill patterns, because +if the X_WF_DIALWID or X_WF_DIALHT are not an even increment of 16, +the fill pattern may not match up correctly when the user scrolls the +window. If this flag is off, the entire dialog will be redrawn every +time its position changes. In this case, the scroll increment does not +matter. +
  +

+ +
+
X_WD_KEYS (bit 2) (since Release 004)
+
+

+
When set, any keypresses that would otherwise be processed as part +of the dialog are instead passed through to the application. +
  +
An example is when NeoDesk is run with the desktop in a window. +Normally, things like [Shift]-[C] would be treated like a keypress in +a dialog without any editable field and ignored. When this bit is set, +the keypress will instead go to the application. +
  +

+ +
+
+
+
+ +
X_WF_OBJHAND (0x1F00) (since Release 003)
+
+

+
When an application wants to intercept some or all of the button +events that would otherwise be interpreted by Geneva to mean that a +window widget has been clicked on, this wind_set mode can be used to +provide Geneva with the address of a routine which instructs Geneva to +either ignore the event, or to process it as normal. This allows the +programmer to redefine the operation of window widgets, and to define +his own actions for new widgets which have been added with the +x_wind_tree function. +
  +
The routine is passed the handle of the window containing the +object and the index of the object within the window's object tree. If +the user routine returns a 0, then Geneva will generate an X_WM_OBJECT +message and send it to the application. If the routine returns a 1, +then Geneva will process the action as a normal event and act +accordingly. +
  +
IMPORTANT: The application's object handler routine must not use +any AES functions. +
  +
The following example declares an object handler which allows +the action of the vertical scroll bar to be redefined: +
  +

       /* change this to "int cdecl objhand..." for Pure C */
+       int objhand( int handle, int obj )
+       {  /* handle parameter is not used */
+         if( obj==WGVSMLSL ) /* this is the vertical slider */
+           return 0;
+         return 1;           /* otherwise, process as normal */
+       }
+
+       main()
+       {
+        int handle, message[8];
+
+         handle = wind_create( NAME|MOVER|VSLIDE|UPARROW|DNARROW,
+             50, 50, 150, 150 );
+
+         if( handle > 0 )
+         {
+           wind_set( handle, X_WF_OBJHAND, &objhand );
+           wind_open( handle, 50, 50, 150, 150 );
+         }
+
+         ...
+
+         evnt_mesag( message );
+
+         switch( message[0] )
+         {
+
+           case X_WM_OBJECT:
+             if( message[3]==handle && message[4]==WGVSMLSL )
+                /* do something new with the slider */
+         }
+       }
+
+
If wind_set( X_WF_OBJHAND ) is passed a NULL pointer instead of +a pointer to a function, object handling is discontinued for that +window. +
  +
Note that in order for Geneva to determine that the mouse has +been clicked on an object in a window's tree structure, it must be of +type EXIT or TOUCHEXIT. Geneva's default window widgets already have +these attributes set correctly. +
  +
wind_get can also be used to get a pointer to the current object +handler routine. A NULL pointer means that there is no object handler +defined. +
  +
+
+

+ + +
X_WF_DIALEDIT (0x2000) (since Release 003)
+
+

+
When a windowed dialog has been defined with wind_set mode +X_WF_DIALOG, these two options can be used to get or set the index of +the object which currently has the edit cursor. This can be helpful +when an application changes the contents of a text field while the +dialog is still displayed, or when it needs to hide the object that +currently has the edit cursor. +
  +
wind_get( X_WF_DIALEDIT ) will return the index of the object +which currently has the edit cursor in the wi_gw1 parameter, +and the position of the edit cursor within the object's text in the +wi_gw2 parameter. +
  +
wind_set( X_WF_DIALEDIT ) changes the object (wi_sw1) +and the edit index (wi_sw2). If the object is 0, then the edit +cursor will simply be turned off; otherwise it will be moved to the +new object. If the index is 0, the cursor will be positioned before +the leftmost character in the field; if it is a number > 0, it will +be further to the right. If the index is -1, then the cursor will be +automatically moved to the rightmost position. +
  +

+
+

+ + +
X_WF_DCOLSTAT (0x2100) (since Release 004)
+
+

+
This mode gets or sets a window widget's default colours and +ob_state value. Unlike WF_DCOLOR, this option gives full control over +all of Geneva's extended window widgets. +
  +
For wind_set, the wi_sw1 parameter contains the index of +the window widget to change, taken from the list of WGCLOSE through +WGSIZE, as outlined in xwind.h. wi_sw2 contains the colour for +the widget when the window is on top, wi_sw3 is for an +untopped window. wi_sw4 contains the ob_state WORD of the +object. If any of these values is set to -1, then no change occurs. +
  +
For wind_get, the wi_sw1 parameter must be a pointer to +a WORD containing the index of the widget being inquired about, the +same way WF_COLOR and WFDCOLOR work. +
  +
Example: Turn the 3D attribute on for the mover bar +
  +

      int top, untop, state, gadget;
+
+      gadget = WGMOVE;
+      wind_get( 0, X_WF_DCOLSTAT, &gadget, &top, &untop, &state );
+      state |= X_MAGIC|X_DRAW3D;
+      wind_set( 0, X_WF_DCOLSTAT, gadget, -1, -1, state );
+
+

+ +
+
+
+ +Home +AESAES +FensterdialogeFensterdialoge +FileselektorenFileselektoren + + diff --git a/de/xaaes.html b/de/xaaes.html new file mode 100644 index 000000000..3a06a405e --- /dev/null +++ b/de/xaaes.html @@ -0,0 +1,38 @@ + + + + + +Die Anleitung zum TOS: XaAES + + + + + + + + + +Home +Inhaltsverzeichnis +Die N.AES-KonfigurationsdateiDie N.AES-Konfigurationsdatei +Toolbar-Support unter XaAESToolbar-Support unter XaAES + +
+ +

13 XaAES

+ +
+
+ +Home +Inhaltsverzeichnis +Die N.AES-KonfigurationsdateiDie N.AES-Konfigurationsdatei +Toolbar-Support unter XaAESToolbar-Support unter XaAES + + diff --git a/de/xaaes_functions.html b/de/xaaes_functions.html new file mode 100644 index 000000000..95339fcbc --- /dev/null +++ b/de/xaaes_functions.html @@ -0,0 +1,665 @@ + + + + + +Die Anleitung zum TOS: Veraltete XaAES-Funktionen + + + + + + + + + + +Home +XaAESXaAES +Toolbar-Support unter XaAESToolbar-Support unter XaAES +EmulatorenEmulatoren + +
+ +

13.2 Veraltete XaAES-Funktionen

+ + + + +

The following XaAES functions were only available in early +versions and they are now deprecated, including objc_data which is +newer but never fully implemented. +

+

Opcodes 250, 253 and 254 are assigned to button_click, shutdown +and objc_setscroll but it looks like they were never used. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
appl_pipe Get handle of the communication pipe +
• button_click No information available +
client_exit Close the communication pipe of a client +
new_client Open a communication pipe for a new client +
• objc_data Get/set data in object trees +
• objc_setscroll No information available +
rregen Regenerate rectangle list (debug) +
• shutdown No information available +
wredraw Redraw window (debug) + +
+ +

See also: XaAES +

+

13.2.1 appl_pipe

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Application pipe« - Obtains the application pipe handle. +
  +
AES-Nummer: 260 +
  +
Deklaration: int16_t appl_pipe ( void ); +
  +
Beschreibung: The call appl_pipe gets the file handle of the client reply +pipe. This value is also available in global[12] after calling +appl_init. +
  +
Hinweis: This function is deprecated. XaAES doesn't +rely anymore on pipes to exchange AES messages. +
  +
Ergebnis: The function returns the file handle of the client reply pipe, +or 0 if the pipe is not open. +
  +
Verfügbar: Up to XaAES v0.963. +
  +
Gruppe: XaAES-Funktionen +
  +
Querverweis: Binding   client_exit   new_client +
  + +
+ +

13.2.1.1 Bindings für appl_pipe

+ + + + + + + + + +
C: int16_t appl_pipe ( void ); +
  +
Umsetzung: +
  +
int16_t appl_pipe (void)
+{
+   return ( crys_if(260) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]260 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_outint_out[0]Return-Wert
+
+ + +
+ +

13.2.2 client_exit

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Client exit« - Unregisters an AES client. +
  +
AES-Nummer: 252 +
  +
Deklaration: void client_exit ( void ); +
  +
Beschreibung: The call client_exit closes the client's reply pipe in response +to a XA_CLIENT_EXIT message. client_exit releases all resources belonging to +the client (windows, pending messages, menu bar, custom desktop...). +
  +
Applications should NEVER send this message to the XaAES +kernel, it is used internally to pass crucial information from the +client pid trap handler to the XaAES kernel. +
  +
The XA_CLIENT_EXIT message is only sent from XaAES itself when a client +calls appl_exit. +
  +
Hinweis: This function is deprecated. XaAES doesn't +rely anymore on pipes to exchange AES messages. +
  +
Ergebnis: The function does not return a value. +
  +
Verfügbar: Up to XaAES v0.963. +
  +
Gruppe: XaAES-Funktionen +
  +
Querverweis: Binding   appl_pipe   new_client +
  + +
+ +

13.2.2.1 Bindings für client_exit

+ + + + + + + + + +
C: void client_exit ( void ); +
  +
Umsetzung: +
  +
void client_exit (void)
+{
+   crys_if (252);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]252 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]0 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
+
+ + +
+ +

13.2.3 new_client

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »New client« - Registers a new AES client. +
  +
AES-Nummer: 251 +
  +
Deklaration: void new_client ( void ); +
  +
Beschreibung: The call new_client opens the client's communication pipe in +response to a XA_NEW_CLIENT message. Applications should NEVER send this +message to the XaAES kernel, it is used internally to pass crucial +information from the client pid trap handler to the XaAES kernel. +
  +
The XA_NEW_CLIENT message is only sent from XaAES itself through +/pipe/XaAES.cmd when a client calls appl_init. This triggers the +creation of a bi-directional command/reply pipe (/pipe/XaClnt.pid, +where pid is the process ID) that allows internal communication +between the client and the AES server. +
  +
Hinweis: This function is deprecated. XaAES doesn't +rely anymore on pipes to exchange AES messages. +
  +
Ergebnis: The function does not return a value. +
  +
Verfügbar: Up to XaAES v0.963. +
  +
Gruppe: XaAES-Funktionen +
  +
Querverweis: Binding   appl_pipe   client_exit +
  + +
+ +

13.2.3.1 Bindings für new_client

+ + + + + + + + + +
C: void new_client ( void ); +
  +
Umsetzung: +
  +
void new_client (void)
+{
+   crys_if(251);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]251 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]0 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
+
+ + +
+ +

13.2.4 rregen

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Redraw regenerate« - Regenerates rectangle list for a +window. +
  +
AES-Nummer: 255 +
  +
Deklaration: void rregen ( XA_WINDOW *w ); +
  +
Beschreibung: The call rregen regenerates the rectangle list for the +specified window. +
  +
w is a pointer to an internal structure that describes +the window. +
  +
Hinweis: This function is for internal use only and +allows to call the Rectangle List Generator for debugging purposes. +rregen is deprecated. +
  +
Ergebnis: The function does not return a result. +
  +
Verfügbar: Up to XaAES v0.920. +
  +
Gruppe: XaAES-Funktionen +
  +
Querverweis: Binding   wredraw +
  + +
+ +

13.2.4.1 Bindings für rregen

+ + + + + + + + + +
C: void rregen ( XA_WINDOW *w ); +
  +
Umsetzung: +
  +
void rregen (XA_WINDOWS *w)
+{
+   addr_in[0] = w;
+
+   return ( crys_if(255) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]255 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]0 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]w
+
+ + +
+ +

13.2.5 wredraw

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Window redraw« - Redraws a window. +
  +
AES-Nummer: 256 +
  +
Deklaration: void wredraw ( XA_WINDOW *w ); +
  +
Beschreibung: The call wredraw redraws a window. +
  +
w specifies a pointer to an internal structure. +
  +
Hinweis: This function is for internal use only and +allows to redraw a whole window by calling a more generic function +that takes two extra parameters (a user-defined value for debugging +purposes, and a clipping rectangle). wredraw is deprecated. +
  +
Ergebnis: The function does not return a result. +
  +
Verfügbar: Up to XaAES v0.920. +
  +
Gruppe: XaAES-Funktionen +
  +
Querverweis: Binding   rregen +
  + +
+ +

13.2.5.1 Bindings für wredraw

+ + + + + + + + + +
C: void wredraw ( XA_WINDOW *w ); +
  +
Umsetzung: +
  +
void wredraw (XA_WINDOW *w)
+{
+   addr_in[0] = w;
+
+   return ( crys_if(256) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]256 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]0 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]w
+
+ + +
+ +
+ +Home +XaAESXaAES +Toolbar-Support unter XaAESToolbar-Support unter XaAES +EmulatorenEmulatoren + + diff --git a/de/xaaes_toolbar.html b/de/xaaes_toolbar.html new file mode 100644 index 000000000..5a62bc444 --- /dev/null +++ b/de/xaaes_toolbar.html @@ -0,0 +1,43 @@ + + + + + +Die Anleitung zum TOS: Toolbar-Support unter XaAES + + + + + + + + + +Home +XaAESXaAES +XaAESXaAES +Veraltete XaAES-FunktionenVeraltete XaAES-Funktionen + +
+ +

13.1 Toolbar-Support unter XaAES

+

Seit Version 0.942 besitzt XaAES auch den Toolbar-Support wie in +AES > 4.1. Es besteht aber nicht die Beschränkung das alle +Elemente den Status TOUCHEXIT besitzen müssen. Für XaAES sind es +ganz normale Dialoge. +

+

Falls die Toolbar neu gezeichnet werden muß reicht es einmal +WF_TOOLBAR mit den entsprechenden Parameter aufzurufen. XaAES erkennt +das die Toolbar schon vorhanden ist und zeichnet diese neu. +

+

Quervweise: Toolbar-Support   WF_TOOLBAR   WM_TOOLBAR +

+
+ +Home +XaAESXaAES +XaAESXaAES +Veraltete XaAES-FunktionenVeraltete XaAES-Funktionen + + diff --git a/de/xbios_about.html b/de/xbios_about.html new file mode 100644 index 000000000..d865d4ef4 --- /dev/null +++ b/de/xbios_about.html @@ -0,0 +1,90 @@ + + + + + +Die Anleitung zum TOS: Das XBIOS + + + + + + + + + +Home +XBIOSXBIOS +XBIOSXBIOS +MetaDOSMetaDOS + +
+ +

4.1 Das XBIOS

+

Diese Funktionen ermöglichen den geordneten Zugriff auf die +verschiedenen Spezial-Chips im Atari. Sie werden über den 680X0-Trap +#14 aufgerufen und sollten nur verwendet werden, wenn keine Routinen +einer höheren Ebene (GEMDOS, BIOS) zur Verfügung stehen, die statt +dessen benutzt werden könnten. Das XBIOS läßt sich in folgende +Funktionsgruppen einteilen: +

+ + +

Das XBIOS ist in MagiC reentrant. Das heißt, diese Funktionen +können (solange der jeweilge Supervisor-Stack nicht überläuft...) +auch aus Interrupts mehrfach aufgerufen werden. +

+ + +

Das XBIOS nimmt seine Parameter auf dem Stack entgegen; dabei +wird das letzte Argument aus der Parameterliste als erstes auf dem +Stack abgelegt. Funktionsergebnisse werden im Prozessorregister d0 +zurückgeliefert. Nur die Register d3-d7 und a3-a7 werden gerettet, +alle anderen können durch den Aufruf verändert werden. +

+

Querverweis: MetaDOS   Funktionsliste +

+
+ +Home +XBIOSXBIOS +XBIOSXBIOS +MetaDOSMetaDOS + + diff --git a/de/xbios_datetime.html b/de/xbios_datetime.html new file mode 100644 index 000000000..83c9898ec --- /dev/null +++ b/de/xbios_datetime.html @@ -0,0 +1,659 @@ + + + + + +Die Anleitung zum TOS: Datum, Uhrzeit und Zeitgeber + + + + + + + + + +Home +XBIOSXBIOS +CT60-XBIOS-ErweiterungCT60-XBIOS-Erweiterung +DruckerfunktionenDruckerfunktionen + +
+ +

4.9 Datum, Uhrzeit und Zeitgeber

+ + + + + + + + + + + + +
Gettime Datum und Uhrzeit ermitteln. +
NVMaccess Konfiguration des NVM der Echtzeituhr. +
Settime Datum und Uhrzeit einstellen. +
Xbtimer Systemzeitgeber initialisieren. + +
+ +

4.9.1 Gettime

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »get time« - Zeit ermitteln. +
  +
Xbiosnummer: 23 +
  +
Deklaration: uint32_t Gettime( void ); +
  +
Beschreibung: Die XBIOS-Routine Gettime ermittelt Datum und Uhrzeit aus der +Hardware-Uhr des Rechners. +
  +
Ergebnis: Die Funktion liefert Datum und Uhrzeit, welche wie folgt +codiert sind: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
BitBeschreibung
0-4Sekunden in Einheiten von 2 (0-29)
5-10Minuten (0-59)
11-15Stunden (0-23)
16-20Tag im Monat (1-31)
21-24Monat (1-12)
25-31Jahr (0-119, 0 steht für 1980)
+
+ +
Verfügbar: Alle TOS Versionen. +
  +
Gruppe: Datum, Uhrzeit und Zeitgeber +
  +
Querverweis: Binding   Settime +
  + +
+ +

4.9.1.1 Bindings für Gettime

+ + + + + + +
C: #include <tos.h> +
  +
uint32_t Gettime( void ); +
  +
Assembler: +
  +
move.w    #23,-(sp)    ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

4.9.2 NVMaccess

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »NVMacess« - Konfiguration des "non volatile +memory" der Echtzeituhr. +
  +
Xbiosnummer: 46 +
  +
Deklaration: int16_t NVMaccess( int16_t op, int16_t start, int16_t count, +int8_t *buffer ); +
  +
Beschreibung: Die XBIOS-Routine NVMaccess ermöglicht die Konfiguration des +NVM der Echtzeituhr. Diese verfügt über 50 Bytes nicht-flüchtiges +RAM, wobei die letzten zwei Bytes als Prüfsumme verwendet werden. Es +gilt: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
op0 = NVM auslesen und Prüfsumme checken
 1 = NVM beschreiben, Prüfsumme checken
     und neu setzen
 2 = NVM initialisieren und Prüfsumme setzen
  
startStartbyte
countAnzahl der zu übertragenden Bytes
bufferPuffer aus bzw. in den geschrieben wird
+
+ +
Ergebnis: Die Funktion liefert den Wert 0, wenn kein Fehler aufgetreten +ist. Ein Wert von -5 bedeutet, daß die Argumente nicht im erlaubten +Bereich waren. Ein Rückgabewert von -12 kennzeichnet eine nicht +konsistente Prüfsumme. +
  +
Verfügbar: Atari TT (TOS 3.xx) und Falcon (TOS 4.xx) +
  +
Gruppe: Datum, Uhrzeit und Zeitgeber +
  +
Querverweis Binding   Belegung des NVM +
  + +
+ +

4.9.2.1 Bindings für NVMaccess

+ + + + + + +
C: #include <tos.h> +
  +
int16_t NVMaccess( int16_t op, int16_t start, int16_t count, +int8_t *buffer ); +
  +
Assembler: +
  +
pea       buffer       ; Offset 8
+move.w    count,-(sp)  ; Offset 6
+move.w    start,-(sp)  ; Offset 4
+move.w    op,-(sp)     ; Offset 2
+move.w    #46,-(sp)    ; Offset 0
+trap      #14          ; XBIOS aufrufen
+lea       $C(sp),sp    ; Stack korrigieren
+
+ +
+ +

4.9.3 Settime

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »set time« - Zeit einstellen. +
  +
Xbiosnummer: 22 +
  +
Deklaration: void Settime( uint32_t time ); +
  +
Beschreibung: Die XBIOS-Routine Settime stellt Datum und Uhrzeit neu ein. +Der 32-Bit Parameter time wird wie folgt aufgesplittet: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
timeBedeutung
0-4Sekunden in Einheiten von 2 (0-29)
5-10Minuten (0-59)
11-15Stunden (0-23)
16-20Tag im Monat (1-31)
21-24Monat (1-12)
25-31Jahr (1980 subtrahieren)
+
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Alle TOS Versionen. +
  +
Gruppe: Datum, Uhrzeit und Zeitgeber +
  +
Querverweis: Binding   Gettime +
  + +
+ +

4.9.3.1 Bindings für Settime

+ + + + + + +
C: #include <tos.h> +
  +
void Settime( uint32_t time ); +
  +
Assembler: +
  +
move.l    time,-(sp)   ; Offset 2
+move.w    #22,-(sp)    ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.9.4 Xbtimer

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »timer init« - initialisiert die Zeitgeber im MFP-Chip. +
  +
Xbiosnummer: 31 +
  +
Deklaration: void Xbtimer( int16_t timer, int16_t control, int16_t data, +void(*vector)( ) ); +
  +
Beschreibung: Die XBIOS-Routine Xbtimer initialisiert einen von vier +Zeitgebern (A-D) im Multifunktionsperipheriechip 68901. Es gilt: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
timerNummer des Timers:
 0 = A (für eigene Programme nutzbar)
 1 = B (Horizontal Blank Interrupt)
 2 = C (Systemtimer (200 Hz))
 3 = D (Generator für die Baudraten)
  
controlWert für entsprechende Timer-Register
dataWert für entsprechende Timer-Register
vectorZeiger auf Interrupt-Routine
+
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Alle TOS Versionen. +
  +
Gruppe: Datum, Uhrzeit und Zeitgeber +
  +
Querverweis: Binding +
  + +
+ +

4.9.4.1 Bindings für Xbtimer

+ + + + + + +
C: #include <tos.h> +
  +
void Xbtimer( int16_t timer, int16_t control, int16_t data, +void(*vector)( ) ); +
  +
Assembler: +
  +
pea       vector        ; Offset 8
+move.w    data,-(sp)    ; Offset 6
+move.w    control,-(sp) ; Offset 4
+move.w    timer,-(sp)   ; Offset 2
+move.w    #31,-(sp)     ; Offset 0
+trap      #14           ; XBIOS aufrufen
+lea       $C(sp),sp     ; Stack korrigieren
+
+ +
+ +

4.9.5 Die Belegung des NVM der Echtzeit-Uhr

+ +

Die Echtzeit-Uhr im Atari-TT und Falcon030 verfügt über 50 +Bytes nichtflüchtiges RAM, welches von Programmen zu +Konfigurationszwecken benutzt werden kann. Es gilt folgende Belegung: +

+
typedef struct
+{
+  unsigned int bootpref;
+  char reserved[4];
+  unsigned char language;
+  unsigned char keyboard;
+  unsigned char datetime;
+  char separator;
+  unsigned char bootdelay;
+  char reserved2[3];
+  unsigned int vmode;
+  unsigned char scsi;
+} NVM;
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
bootpref Bootpräferenz: +
0x00 = keine Präferenz +
0x08 = MagiC +
0x10 = Linux +
0x20 = NetBSD +
0x40 = UNIX wird gebootet +
0x80 = TOS wird gebootet +
  +
language Landessprache: +
0 = Englisch +
1 = Deutsch +
2 = Französisch +
3 = reserviert +
4 = Spanisch +
5 = Italienisch +
  +
keyboard Layout der Tastatur: +
0 = USA +
1 = Deutschland +
2 = Frankreich +
3 = England +
4 = Spanien +
5 = Italien +
6 = Schweden +
7 = (französische) Schweiz +
8 = (deutsche) Schweiz +
  +
datetime Formatierung des Datum: +
  + + + + + + +
Bit 0..3 0 = Format "MM-DD-YY" (Monat, Tag, Jahr) +
1 = Format "DD-MM-YY" (Tag, Monat, Jahr) +
2 = Format "YY-MM-DD" (Jahr, Monat, Tag) +
3 = Format "YY-DD-MM" (Jahr, Tag, Monat) +
+
Bit 4..7 0 = 12-Stunden Darstellung +
1 = 24-Stunden Darstellung + +
+ +
separator ASCII-Wert des Zeichens, das als Trenner für die Datumsangaben +dienen soll. +
  +
bootdelay Bootverzögerung +
  +
vmode Videomode +
+
  +
scsi +
  + + + + + + + + + +
Bit 0..2 SCSI-ID (0-7) +
Bit 3..6 0, reserviert +
Bit 7 Flag für Bus-Arbitration. +
Es gilt: +
0 = Arbitration ein +
1 = Arbitration aus +
+ +
+ + +
+ +

Alle weiteren Bytes sind z.Zt. nicht dokumentiert. Wie man +sieht, läßt sich insbesondere die SCSI-ID von TT oder Falcon über +das NVM festlegen. +

+ +

Beim Milan hat das NVM eine größe von 224 Bytes. +

+

Die folgende Struktur gilt nur für TOS 4.08 (2003-03-09) und +Bootblock 1.02! +

+
typedef struct
+{
+  unsigned int bootpref;
+  char reserved[4];
+  unsigned char language;
+  unsigned char keyboard;
+  unsigned char datetime;
+  char separator;
+  unsigned char bootdelay;
+  unsigned char ide_drives;
+  unsigned char scsi_drives;
+  char reserved2;
+  unsigned int vmode;
+  unsigned char scsi;
+  char reserved3[31];
+  unsigned char memory;
+  char INT1_2;
+  char INT3_4;
+  char reserved4[173];
+} NVM_Milan;
+
+ + + +
memory +
  + + + + + + +
Bit 0..1 0 = 16MB ST-RAM +
1 =  4MB ST-RAM +
2 =  2MB ST-RAM +
Bit 2 ROMPORT-Emulation +
+ +
+ + +
+ +

Querverweis: NVMaccess   XHDI-Spezifikation +

+
+ +Home +XBIOSXBIOS +CT60-XBIOS-ErweiterungCT60-XBIOS-Erweiterung +DruckerfunktionenDruckerfunktionen + + diff --git a/de/xbios_dhs.html b/de/xbios_dhs.html new file mode 100644 index 000000000..63e2243a0 --- /dev/null +++ b/de/xbios_dhs.html @@ -0,0 +1,568 @@ + + + + + +Die Anleitung zum TOS: Hatari-DHS-XBIOS-Erweiterung + + + + + + + + + +Home +XBIOSXBIOS +DSP-ProgrammierungDSP-Programmierung +InterruptfunktionenInterruptfunktionen + +
+ +

4.12 Hatari-DHS-XBIOS-Erweiterung

+

Some specific patches by DHS are applied to the Hatari sources +for Mac OS X to enhance the debug and trace functions. These features +are of great help for demo hacking in overscan since ordinary debug +tools is very hard to use in such conditions. +

+

Binaries and patches are available on DHS website. +

+ + + + + + + + + + + + + + + + + + + + + +
CounterRead  Stop a cycle counter. +
CounterStart Start or restart a cycle counter. +
CPUFreq      Set Hatari CPU frequency. +
Debug        Debug output to console. +
DebugUI      Enter Hatari debug UI. +
HatariOption Change emulator options. +
Registers    Dump all registers to console. + +
+ +

4.12.1 CounterRead

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Stop counter« - Read a cycle counter. +
  +
Xbiosnummer: 252 (0x00fc) +
  +
Deklaration: Bindings für CounterRead +
  +
Beschreibung: Stop a cycle counter. +
  +
The id argument to the call can provide an identifier +for the current timer and several counters can be activated +simulaneously. Valid values are between 0 and 255. +
  +
Ergebnis: None. +
  +
Verfügbar: Hatari for Mac OS X with specific patches by DHS. +
  +
Gruppe: Hatari-DHS-XBIOS-Erweiterung +
  +
Querverweis: Binding +
  + +
+ +

4.12.1.1 Bindings für CounterRead

+ + + + + + +
C: void xbios ( 252, int16_t id ); +
  +
Assembler: +
  +
move.w    id,-(sp)        ; Offset 2
+move.w    #252,-(sp)      ; Offset 0
+trap      #14             ; XBIOS aufrufen
+addq.l    #4,sp           ; Stack korrigieren
+
+ +
+ +

4.12.2 CounterStart

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Start counter« - Start or restart a cycle counter. +
  +
Xbiosnummer: 253 (0x00fd) +
  +
Deklaration: Bindings für CounterStart +
  +
Beschreibung: Start a new cycle counter or restart an existing one. +
  +
Count the number of cycles between two successive calls to XBIOS +functions. +
  +
The id argument to the call can provide an identifier +for the current timer and several counters can be activated +simulaneously. Valid values are between 0 and 255. +
  +
Ergebnis: None. +
  +
Verfügbar: Hatari for Mac OS X with specific patches by DHS. +
  +
Gruppe: Hatari-DHS-XBIOS-Erweiterung +
  +
Querverweis: Binding +
  + +
+ +

4.12.2.1 Bindings für CounterStart

+ + + + + + +
C: void xbios ( 253, int16_t id ); +
  +
Assembler: +
  +
move.w    id,-(sp)        ; Offset 2
+move.w    #253,-(sp)      ; Offset 0
+trap      #14             ; XBIOS aufrufen
+addq.l    #4,sp           ; Stack korrigieren
+
+ +
+ +

4.12.3 CPUFreq

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Frequency« - Set Hatari CPU frequency. +
  +
Xbiosnummer: 249 (0x00f9) +
  +
Deklaration: Bindings für CPUFreq +
  +
Beschreibung: Set Hatari CPU frequency. +
  +
Maximum frequency is 511 MHz. The frequency can be set +up to 128 MHz in the SDL and the OSX GUI. +
  +
Ergebnis: None. +
  +
Verfügbar: Hatari for Mac OS X with specific patches by DHS. +
  +
Gruppe: Hatari-DHS-XBIOS-Erweiterung +
  +
Querverweis: Binding +
  + +
+ +

4.12.3.1 Bindings für CPUFreq

+ + + + + + +
C: void xbios ( 249, int16_t frequency ); +
  +
Assembler: +
  +
move.w    frequency,-(sp) ; Offset 2
+move.w    #249,-(sp)      ; Offset 0
+trap      #14             ; XBIOS aufrufen
+addq.l    #4,sp           ; Stack korrigieren
+
+ +
+ +

4.12.4 Debug

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Debug output to console« - Dump memory area to Hatari +console. +
  +
Xbiosnummer: 254 (0x00fe) +
  +
Deklaration: Bindings für Debug +
  +
Beschreibung: Memory dump. +
  +
Hatari can dump the content of a memory area to the console. +This is useful for debugging. +
  +
memptr and length specifiy the start address and +length of the area. +
  +
Ergebnis: None. +
  +
Verfügbar: Hatari for Mac OS X with specific patches by DHS. +
  +
Gruppe: Hatari-DHS-XBIOS-Erweiterung +
  +
Querverweis: Binding +
  + +
+ +

4.12.4.1 Bindings für Debug

+ + + + + + +
C: void xbios ( 254, int32_t memptr, int32_t length ); +
  +
Assembler: +
  +
move.l    length,-(sp)    ; Offset 6
+move.l    memptr,-(sp)    ; Offset 2
+move.w    #254,-(sp)      ; Offset 0
+trap      #14             ; XBIOS aufrufen
+lea       10(sp),sp       ; Stack korrigieren
+
+ +
+ +

4.12.5 DebugUI

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Enter Debug UI« - Enter Hatari Debug UI. +
  +
Xbiosnummer: 251 (0x00fb) +
  +
Deklaration: Bindings für DebugUI +
  +
Beschreibung: Debugger with instruction stepping. +
  +
Step through the code from the OSX console. By calling XBIOS, +Hatari will enter the debugger. A new command i will then step +the emulator one (1) instruction and then return to the debugger. +
  +
Ergebnis: None. +
  +
Verfügbar: Hatari for Mac OS X with specific patches by DHS. +
  +
Gruppe: Hatari-DHS-XBIOS-Erweiterung +
  +
Querverweis: Binding +
  + +
+ +

4.12.5.1 Bindings für DebugUI

+ + + + + + +
C: void xbios ( 251 ); +
  +
Assembler: +
  +
move.w    #251,-(sp)      ; Offset 0
+trap      #14             ; XBIOS aufrufen
+addq.l    #2,sp           ; Stack korrigieren
+
+ +
+ +

4.12.6 HatariOption

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Change options« - Change emulator options. +
  +
Xbiosnummer: 255 +
  +
Deklaration: Bindings für HatariOption +
  +
Beschreibung: This function changes the given option. The following +apply: +
  + + + + + + + + + + + + + + + + + + +
Option Meaning +
    +
1 Reset the normal ST speed (disable Fast Forward). +
2 Set Hatari into max speed mode (enable Fast Forward). Useful +for assembling, packing and so on. +
3 Enable debugger. +
4 Disable debugger. + +
+ +
Ergebnis: The function returns 0, or -1 if the specified option is out of +range. +
  +
Verfügbar: Hatari for Mac OS X with specific patches by DHS. +
  +
Gruppe: Hatari-DHS-XBIOS-Erweiterung +
  +
Querverweis: Binding +
  + +
+ +

4.12.6.1 Bindings für HatariOption

+ + + + + + +
C: int32_t xbios ( 255, int16_t option ); +
  +
Assembler: +
  +
move.w    option,-(sp)    ; Offset 2
+move.w    #255,-(sp)      ; Offset 0
+trap      #14             ; XBIOS aufrufen
+addq.l    #4,sp           ; Stack korrigieren
+
+ +
+ +

4.12.7 Registers

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dump Registers« - Dump all registers to console. +
  +
Xbiosnummer: 250 (0x00fa) +
  +
Deklaration: Bindings für Registers +
  +
Beschreibung: Dump all registers to console. +
  +
Hatari can dump the CPU data+address registers to the console. +This is useful for debugging. +
  +
Ergebnis: None. +
  +
Verfügbar: Hatari for Mac OS X with specific patches by DHS. +
  +
Gruppe: Hatari-DHS-XBIOS-Erweiterung +
  +
Querverweis: Binding +
  + +
+ +

4.12.7.1 Bindings für Registers

+ + + + + + +
C: void xbios ( 250 ); +
  +
Assembler: +
  +
move.w    #250,-(sp)      ; Offset 0
+trap      #14             ; XBIOS aufrufen
+addq.l    #2,sp           ; Stack korrigieren
+
+ +
+ +
+ +Home +XBIOSXBIOS +DSP-ProgrammierungDSP-Programmierung +InterruptfunktionenInterruptfunktionen + + diff --git a/de/xbios_drive.html b/de/xbios_drive.html new file mode 100644 index 000000000..a0aaefb7e --- /dev/null +++ b/de/xbios_drive.html @@ -0,0 +1,2530 @@ + + + + + +Die Anleitung zum TOS: Laufwerksfunktionen + + + + + + + + + +Home +XBIOSXBIOS +InterruptfunktionenInterruptfunktionen +MATRIX-XBIOS-ErweiterungMATRIX-XBIOS-Erweiterung + +
+ +

4.14 Laufwerksfunktionen

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DMAread Sektoren von Festplatte lesen. +
DMAwrite Sektoren auf Festplate schreiben. +
Flopfmt Spur auf einer Diskette formatieren. +
Floprate Seekrate und Timeout der Floppy setzen. +
Floprd Einzelne Sektoren lesen. +
Flopver Sektoren einer Diskette überprüfen. +
Flopwr Einzelne Sektoren schreiben. + +
Metaclose Gibt ein MetaDOS Gerät wieder frei. +
Metadiscinfo Ermittelt aktuelle Status-Informationen. +
Metagettoc Liefert das Inhaltsverzeichnis eines Gerätes. +
Metainit Informationen über MetaDOS Version ermitteln. +
Metaioctl Schickt GEMDOS-Opcodes an ein MetaDOS Gerät. +
Metaopen Initialisiert ein MetaDOS Gerät. +
Metaread Liest Daten von einem MetaDOS Gerät. +
Metaseek Seeks to a physical address. +
Metasetsongtime Startet eine Audio-Wiedergabe. +
Metastartaudio Startet eine Audio-Wiedergabe. +
Metastatus Ermittelt den Status eines MetaDOS Gerätes. +
Metastopaudio Beendet eine Audio-Wiedergabe. +
Metawrite Schreibt Daten auf ein MetaDOS Gerät. +
Protobt Bootsektor für Diskette im Speicher generieren. + +
+ +

Querverweis: GEMDOS-Dateifunktionen   GEMDOS-Verzeichnisfunktionen +

+

4.14.1 DMAread

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »DMA read« - liest einzelne Sektoren von einer DMA-Einheit. +
  +
Xbiosnummer: 42 +
  +
Deklaration: int16_t DMAread( int32_t sector, int16_t count, void *buffer, +int16_t devno ); +
  +
Beschreibung: Die XBIOS-Routine DMAread liest einzelne oder mehrere Sektoren +von einem ACSI- oder SCSI Gerät. Es gilt: +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
sector erste Sektornummer +
count Anzahl der Sektoren +
buffer Anfangsadresse im Speicher +
devno Gerätenummer. Es gilt: +
+
+ + + + + + + + + + + + +
0..7:ACSI-Geräte
8..15:SCSI-Geräte (TOS 2.06 und ab 3.00)
16IDE-Geräte (TOS 2.06 und ab 3.06)
+
+ +
Alle anderen Werte sind für zukünftige Erweiterungen +reserviert. + +
+ +
Hinweis: In vielen Fällen ist es sinnvoller, statt +dieser Funktion Rwabs zu verwenden. Der angegebene Speicherbereich +muß für die jeweilige Hardware beschreibbar sein (Stichwort: +Fast-RAM-Buffer). SCSI-Geräte werden von dieser Funktion nicht per +DMA, sondern per Handshake betrieben. +
  +
Ergebnis: Die Funktion liefert als Ergebnis eine 0, wenn kein Fehler +passiert ist, ansonsten einen Fehlercode. +
  +
Verfügbar: Diese Funktion steht erst ab TOS 2.00 zur Verfügung. +
  +
Gruppe: Laufwerksfunktionen +
  +
Querverweis: Binding   DMAwrite   Floprd   Flopwr   Rwabs +
  + +
+ +

4.14.1.1 Bindings für DMAread

+ + + + + + +
C: #include <tos.h> +
  +
int16_t DMAread( int32_t sector, int16_t count, void *buffer, +int16_t devno ); +
  +
Assembler: +
  +
move.w    devno,-(sp)  ; Offset 12
+pea       buffer       ; Offset  8
+move.w    count,-(sp)  ; Offset  6
+move.l    sector,-(sp) ; Offset  2
+move.w    #42,-(sp)    ; Offset  0
+trap      #14          ; XBIOS aufrufen
+lea       $E(sp),sp    ; Stack korrigieren
+
+ +
+ +

4.14.2 DMAwrite

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »DMA write« - schreibt einzelne Sektoren auf eine +DMA-Einheit. +
  +
Xbiosnummer: 43 +
  +
Deklaration: int16_t DMAwrite( int32_t sector, int16_t count, void *buffer, +int16_t devno ); +
  +
Beschreibung: Die XBIOS-Routine DMAwrite schreibt einzelne oder mehrere +Sektoren auf ein ACSI- oder SCSI-Gerät. Es gilt: +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
sector erste Sektornummer +
count Anzahl der Sektoren +
buffer Anfangsadresse im Speicher +
devno Gerätenummer. Es gilt: +
+
+ + + + + + + + + + + + +
0..7:ACSI-Geräte
8..15:SCSI-Geräte (TOS 2.06 und ab 3.00)
16IDE-Geräte (TOS 2.06 und ab 3.06)
+
+ +
Alle anderen Werte sind für zukünftige Erweiterungen +reserviert. + +
+ +
Hinweis: In vielen Fällen ist es sinnvoller, statt +dieser Funktion Rwabs zu verwenden. Der angegebene Speicherbereich +muß für die jeweilige Hardware lesbar sein (Stichwort: +Fast-RAM-Buffer). SCSI-Geräte werden von dieser Funktion nicht per +DMA, sondern per Handshake betrieben. +
  +
Ergebnis: Die Funktion liefert als Ergebnis eine 0, wenn kein Fehler +passiert ist, ansonsten einen Fehlercode. +
  +
Verfügbar: Diese Funktion steht erst ab TOS 2.00 zur Verfügung. +
  +
Gruppe: Laufwerksfunktionen +
  +
Querverweis: Binding   DMAread   Floprd   Flopwr   Rwabs +
  + +
+ +

4.14.2.1 Bindings für DMAwrite

+ + + + + + +
C: #include <tos.h> +
  +
int16_t DMAwrite( int32_t sector, int16_t count, void *buffer, +int16_t devno ); +
  +
Assembler: +
  +
move.w    devno,-(sp)  ; Offset 12
+pea       buffer       ; Offset  8
+move.w    count,-(sp)  ; Offset  6
+move.l    sector,-(sp) ; Offset  2
+move.w    #43,-(sp)    ; Offset  0
+trap      #14          ; XBIOS aufrufen
+lea       $E(sp),sp    ; Stack korrigieren
+
+ +
+ +

4.14.3 Flopfmt

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Floppy format« - formatiert einzelne Spuren auf einer +Diskette. +
  +
Xbiosnummer: 10 +
  +
Deklaration: int16_t Flopfmt( void *buf, int32_t filler, int16_t devno, +int16_t spt, int16_t trackno, int16_t sideno, int16_t interlv, int32_t +magic, int16_t virgin ); +
  +
Beschreibung: Die XBIOS-Routine Flopfmt formatiert eine oder mehrere Spuren +auf einer Diskette. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
  +
buf Zeiger auf einen Bereich, in dem die Daten für die Spur +gespeichert werden können. +
  +
filler bei allen TOS-Versionen < 1.02 unbenutzt, und auf 0 zu +setzen. Ab dem Blitter-TOS gilt: wenn interlv = -1 ist, so ist +filler als Zeiger auf eine Tabelle von Sektornummern anzusehen +(16Bit-Worte). Dadurch ergibt sich die Möglichkeit, die Reihenfolge +der Sektoren auf der Spur frei zu wählen. +
  +
devno 0 = Laufwerk-A, 1 = Laufwerk-B +
  +
spt Sektoren pro Spur (normal: 9). Falls der Cookie _FDC gesetzt +ist, sind auch Werte von 18 (High-Density) bzw. 36 +(Extra-High-Density) Sektoren erlaubt. Die Umschaltung der +verschiedenen Schreibverfahren findet bei 13 (HD) bzw. 26 (ED) statt. +
  +
trackno Nummer der Spur (0..79) +
  +
sideno 0: Seite-1 +
1: Seite-2 (bei doppelseitigen Disketten) +
  +
interlv bestimmt, wie viele physikalische Sektoren jeweils zwischen +zwei logischen Sektoren liegen (normal: 1) +
  +
magic 0x87654321, sonst wird nicht formatiert. +
  +
virgin Bitmuster, welches beim Formatieren in jeden Sektor geschrieben +wird (normal: 0xe5e5). Die oberen vier Bits dürfen nicht gesetzt +werden, da dies sonst vom Controller als Kommando interpretiert +würde. +
  + +
+ +
Hinweis: Ab dem Blitter-TOS erlaubt es das Desktop, eine +Liste von Sektornummern zu übergeben, um Spuren derart zu +spiralisieren, daß beim Spurwechsel möglichst wenig Zeit mit dem +Warten auf den nächsten Sektor verloren wird. +
  +
Bei einem normalen Format (9 Sektoren pro Spur) muss der über +den Parameter buf angegebene Speicherbereich eine Größe von +mindestens 8 Kbyte besitzen; in anderen Fällen muss der Puffer evtl. +noch vergrößert werden. +
  +
Ergebnis: Die Funktion liefert als Ergebnis eine 0, wenn kein Fehler +passiert ist. Im Fehlerfall wird eine durch 0 abgeschlossene Liste der +fehlerhaften Sektoren in den Puffer geschrieben. +
  +
Verfügbar: Alle TOS Versionen. +
  +
Gruppe: Laufwerksfunktionen +
  +
Querverweis: Binding   Flopwr +
  + +
+ +

4.14.3.1 Bindings für Flopfmt

+ + + + + + + + + +
C: #include <tos.h> +
  +
int16_t Flopfmt( void *buf, int32_t filler, int16_t devno, +int16_t spt, int16_t trackno, int16_t sideno, int16_t interlv, int32_t +magic, int16_t virgin ); +
  +
Assembler: +
  +
move.w    virgin,-(sp)  ; Offset 24
+move.l    magic,-(sp)   ; Offset 20
+move.w    interlv,-(sp) ; Offset 18
+move.w    sideno,-(sp)  ; Offset 16
+move.w    trackno,-(sp) ; Offset 14
+move.w    spt,-(sp)     ; Offset 12
+move.w    devno,-(sp)   ; Offset 10
+move.l    filler,-(sp)  ; Offset  6
+pea       buf           ; Offset  2
+move.w    #10,-(sp)     ; Offset  0
+trap      #14           ; XBIOS aufrufen
+lea       $1A(sp),sp    ; Stack korrigieren
+
+
GFA-Basic +Fehler%=Xbios(10,L:buf%,L:filler%,W:devno%,W:spt%,W:trackno%,W:sideno%,W:interlv%,L:magic%,W:virgin%) +
  + +
+ +

4.14.4 Floprate

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Floppy rate« - liest oder setzt die seek rate eines +Floppylaufwerks. +
  +
Xbiosnummer: 41 +
  +
Deklaration: int16_t Floprate( int16_t devno, int16_t newrate ); +
  +
Beschreibung: Die XBIOS-Routine Floprate liefert bzw. setzt die aktuelle +Seekrate. Es gilt: +
  + + + + + + + + + +
Parameter Bedeutung +
  +
devno Laufwerksnummer +
  +

+
+ + + + + + + + + + +
0=Laufwerk-A
1=Laufwerk-B usw.
+
+ +
newrate +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
-1=Seekrate nicht verändern
0=Rate von 6ms
1=Rate von 12ms
2=Rate von 2ms
3=Rate von 3ms
+
+ + +
+ + + +
Hinweis: Ab MagiC 3 kann darüberhinaus per Floprate +(-1, newrate) der Timeout für die Floppy eingestellt werden; +ein Wert von 300 bedeutet 1,5 Sekunden (dies ist der Wert, der beim +Booten per Default eingestellt ist). +
  +
Bei älteren ROM-TOS-Versionen muß man die vorher +undokumentierten Systemvariablen verwenden: +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
TOS-VersionLaufwerk ALaufwerk B
RAM-TOS0x6ca0x6ce
1.000xa080xa0c
1.020xa4e0xa52
+
+ +
Zum portablen Setzen kann man die folgende Beispielroutine nutzen. +
  +
Das MilanTOS 4.08 (2003.09.03) macht nichts mit den Werten und +liefert immer null zurück. +
  +
Ergebnis: Die Funktion liefert die vorherige Seekrate als Ergebnis. +
  +
Verfügbar: Die Funktion steht erst ab TOS 1.04 zur Verfügung. +
  +
Gruppe: Laufwerksfunktionen +
  +
Querverweis: Binding   Flopwr   Floprd   Flopver   Flopfmt +
  + +
+ +

4.14.4.1 Bindings für Floprate

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Floprate( int16_t devno, int16_t newrate ); +
  +
Assembler: +
  +
move.w    newrate,-(sp) ; Offset 4
+move.w    devno,-(sp)   ; Offset 2
+move.w    #41,-(sp)     ; Offset 0
+trap      #14           ; XBIOS aufrufen
+addq.l    #6,sp         ; Stack korrigieren
+
+ +
+ +

4.14.4.2 Seekrate für alle TOS-Versionen

+
/* Portables Setzen der Floppy-Seekrate für alle TOS-Versionen
+   (außer RAM-TOS 1.00).
+   Parameter: genau wie bei XBIOS-Funktion "Floprate()" */
+
+int16_t SeekRate ( int16_t devno, int16_t newrate )
+{
+  int32_t stack;
+  int16_t version;
+  OSHEADER *sys;
+
+  /* Zeiger auf OS-Header holen */
+  stack = Super (0L);
+  sys = *((OSHEADER **) 0x4f2);
+  version = sys->os_version;
+  Super ((void *)stack);
+
+  /* bei neuem TOS einfach "Floprate()" aufrufen */
+  if ( version >= 0x0104 )
+    return Floprate ( devno, newrate );
+  else
+  {
+    /* sonst Zeiger auf interne GEMDOS-Variablen
+       berechnen */
+    int16_t *sk, merk;
+
+    if ( version == 0x0102 )
+      sk = (int16_t *) 0x0a4e;
+    else
+      sk = (int16_t *) 0x0a08;
+
+    /* Laufwerk B: 2 int16_t dahinter */
+    if ( devno ) sk = &(sk[2]);
+
+    merk = *sk;
+    /* Wert nur bei ungleich -1 eintragen */
+    if ( newrate != -1 ) *sk = newrate;
+
+    /* alten Wert immer zurückliefern */
+    return merk;
+  }
+}
+
+

4.14.5 Floprd

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Floppy read« - liest einzelne Sektoren von einer +Platteneinheit. +
  +
Xbiosnummer: 8 +
  +
Deklaration: int16_t Floprd( void *buf, int32_t filler, int16_t devno, +int16_t sectno, int16_t trackno, int16_t sideno, int16_t count ); +
  +
Beschreibung: Die XBIOS-Routine Floprd liest einen oder mehrere physikalische +Sektoren von einer Diskette. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
buf Zeiger auf Speicherbereich für die eingelesenen Sektoren +
filler unbenutzt +
devno Laufwerk (0 = Laufwerk-A usw.) +
sectno Startsektor (normal zwischen 1 und 9) +
trackno Tracknummer (normal zwischen 0 und 79) +
sideno Seite der Diskette (0 oder 1) +
count Anzahl der zu lesenden Sektoren + +
+ +
Ergebnis: Die Funktion liefert als Ergebnis eine 0, wenn kein Fehler +passiert ist, ansonsten einen Fehlercode. +
  +
Verfügbar: Alle TOS Versionen. +
  +
Gruppe: Laufwerksfunktionen +
  +
Querverweis: Binding   DMAread   DMAwrite   Flopwr   Rwabs +
  + +
+ +

4.14.5.1 Bindings für Floprd

+ + + + + + + + + +
C: #include <tos.h> +
  +
int16_t Floprd( void *buf, int32_t filler, int16_t devno, +int16_t sectno, int16_t trackno, int16_t sideno, int16_t count ); +
  +
Assembler: +
  +
move.w    count,-(sp)   ; Offset 18
+move.w    sideno,-(sp)  ; Offset 16
+move.w    trackno,-(sp) ; Offset 14
+move.w    sectno,-(sp)  ; Offset 12
+move.w    devno,-(sp)   ; Offset 10
+move.l    filler,-(sp)  ; Offset  6
+pea       buf           ; Offset  2
+move.w    #8,-(sp)      ; Offset  0
+trap      #14           ; XBIOS aufrufen
+lea       $14(sp),sp    ; Stack korrigieren
+
+
GFA-Basic +Fehler%=Xbios(8,L:buf%,L:filler%,W:devno%,W:sectno%,W:trackno%,W:sideno%,W:count%) +
  + +
+ +

4.14.6 Flopver

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Floppy verify« - überprüft Disketten. +
  +
Xbiosnummer: 19 +
  +
Deklaration: int16_t Flopver( void *buf, int32_t filler, int16_t devno, +int16_ sectno, int16_t trackno, int16_t sideno, int16_t count ); +
  +
Beschreibung: Die XBIOS-Routine Flopver überprüft, ob eine Reihe von +Sektoren fehlerfrei von einem Disketten-Laufwerk gelesen werden kann. +Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
buf Zeiger auf einen 1024 Byte großen Speicherbereich, in den die +zu verifizierenden Sektoren eingelesen werden können. +
filler unbenutzt (sollte auf 0 gesetzt werden) +
devno Laufwerk +
+
+ + + + + + + + + + +
0=Laufwerk-A
1=Laufwerk-B
+
+ +
sectno Startsektor (normal zwischen 1 und 9) +
trackno Tracknummer (normal zwischen 0 und 79) +
sideno Seite der Diskette (0 oder 1) +
count Anzahl der zu überprüfenden Sektoren + +
+ +
Hinweis: Nach dem Aufruf findet man im Parameter +buf eine durch Null abgeschlossene Liste von 16-Bit Worten mit +den Nummern der defekten Sektoren. Die Funktion vergleicht also +keine Sektoren mit einem Speicherbereich; stattdessen liest +sie die Sektoren in den immer selben Puffer ein. Dabei wird nur +überprüft, ob die Sektoren korrekt gelesen werden können, oder ob +beim Lesen Lesefehler auftreten. +
  +
Ergebnis: Die Funktion liefert als Ergebnis den Wert 0, wenn die im +Parameter buf abgelegte Liste gültig ist und anderenfalls +einen Wert ungleich Null. +
  +
Verfügbar: Alle TOS Versionen. +
  +
Gruppe: Laufwerksfunktionen +
  +
Querverweis: Binding +
  + +
+ +

4.14.6.1 Bindings für Flopver

+ + + + + + + + + +
C: #include <tos.h> +
  +
int16_t Flopver( void *buf, int32_t filler, int16_t devno, +int16_ sectno, int16_t trackno, int16_t sideno, int16_t count ); +
  +
Assembler: +
  +
move.w    count,-(sp)    ; Offset 18
+move.w    sideno,-(sp)   ; Offset 16
+move.w    trackno,-(sp)  ; Offset 14
+move.w    sectno,-(sp)   ; Offset 12
+move.w    devno,-(sp)    ; Offset 10
+move.l    filler,-(sp)   ; Offset  6
+pea       buf            ; Offset  2
+move.w    #19,-(sp)      ; Offset  0
+trap      #14            ; XBIOS aufrufen
+lea       $14(sp),sp     ; Stack korrigieren
+
+
GFA-Basic +Fehler%=Xbios(19,L:buf%,L:filler%,W:devno%,W:sectno,W:trackno%,W:sideno%,W:count%) +
  + +
+ +

4.14.7 Flopwr

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Floppy write« - schreibt einzelne Sektoren auf eine +Platteneinheit. +
  +
Xbiosnummer: 9 +
  +
Deklaration: int16_t Flopwr( VOID *buf, int32_t filler, int16_t devno, +int16_t sectno, int16_t trackno, int16_t sideno, int16_t count ); +
  +
Beschreibung: Die XBIOS-Routine Flopwr schreibt einen oder mehrere +physikalische Sektoren auf eine Diskette. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
buf Zeiger auf Speicherbereich mit den zu schreibenden Sektoren +
filler unbenutzt +
devno Laufwerk (0=Laufwerk-A, 1=Laufwerk-B) +
sectno Startsektor (normal zwischen 1 und 9) +
trackno Tracknummer (normal zwischen 0 und 79) +
sideno Seite der Diskette (0 oder 1) +
count Anzahl der zu schreibenden Sektoren + +
+ +
Ergebnis: Die Funktion liefert als Ergebnis eine 0, wenn kein Fehler +passiert ist, ansonsten einen Fehlercode. +
  +
Verfügbar: Alle TOS Versionen. +
  +
Gruppe: Laufwerksfunktionen +
  +
Querverweis: Binding   DMAread   DMAwrite   Floprd +
  + +
+ +

4.14.7.1 Bindings für Flopwr

+ + + + + + + + + +
C: #include <tos.h> +
  +
int16_t Flopwr( VOID *buf, int32_t filler, int16_t devno, +int16_t sectno, int16_t trackno, int16_t sideno, int16_t count ); +
  +
Assembler: +
  +
move.w    count,-(sp)    ; Offset 18
+move.w    sideno,-(sp)   ; Offset 16
+move.w    trackno,-(sp)  ; Offset 14
+move.w    sectno,-(sp)   ; Offset 12
+move.w    devno,-(sp)    ; Offset 10
+move.l    filler,-(sp)   ; Offset  6
+pea       buf            ; Offset  2
+move.w    #9,-(sp)       ; Offset  0
+trap      #14            ; XBIOS aufrufen
+lea       $14(sp),sp     ; Stack korrigieren
+
+
GFA-Basic +Fehler%=Xbios(9,L:buf%,L:filler%,W:devno%,W:sectno%,W:trackno%,W:sideno,W:count%) +
  + +
+ +

4.14.8 Metaclose

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Metaclose« - gibt ein MetaDOS-Gerät wieder frei. +
  +
Xbiosnummer: 50 +
  +
Deklaration: int32_t Metaclose( int16_t drive ); +
  +
Beschreibung: Die Funktion gibt das Laufwerk drive wieder frei. +
  +
Ergebnis: Die Funktion liefert als Ergebnis einen Wert vom Typ int32_t +zurück. +
  +
Verfügbar: Diese Funktion steht nur bei installiertem MetaDOS zur +Verfügung. +
  +
Gruppe: Laufwerksfunktionen +
  +
Querverweis: Binding   Metaopen +
  + +
+ +

4.14.8.1 Bindings für Metaclose

+ + + + + + +
C: int32_t Metaclose( int16_t drive ); +
  +
Assembler: +
  +
move.w    drive,-(sp)  ; Offset 2
+move.w    #50,-(sp)    ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.14.9 Metadiscinfo

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Metadiscinfo« - ermittelt aktuelle Status-Informationen. +
  +
Xbiosnummer: 63 +
  +
Deklaration: int32_t Metadiscinfo( int16_t drive, CD_DISC_INFO *p ); +
  +
Beschreibung: Die Funktion ermittelt Informationen über den Status eines +MetaDOS-Gerätes. Es gilt: +
  +

+
+ + + + + + + + + + + + +
ParameterBedeutung
drivegewünschtes Laufwerk
pAdresse des aufnehmenden Puffers
+
+ +
Hinweis: Die Positionsangaben innerhalb der Struktur +sind im BCD-MSF-Format codiert. Die Komponente index wird von +alten BOS-Treibern nicht gesetzt, und die Komponente disctype +ist bei SCSI-CD-ROMs nicht gesetzt. +
  +
Ergebnis: Die Funktion liefert als Ergebnis einen Wert vom Typ int32_t +zurück. +
  +
Verfügbar: Diese Funktion steht nur bei installiertem MetaDOS zur +Verfügung. +
  +
Gruppe: Laufwerksfunktionen +
  +
Querverweis: Binding   Metastatus +
  + +
+ +

4.14.9.1 Bindings für Metadiscinfo

+ + + + + + +
C: int32_t Metadiscinfo( int16_t drive, CD_DISC_INFO *p ); +
  +
Assembler: +
  +
pea       p            ; Offset 4
+move.w    drive,-(sp)  ; Offset 2
+move.w    #63,-(sp)    ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #8,sp        ; Stack korrigieren
+
+ +
+ +

4.14.10 Metagettoc

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Metagettoc« - liefert das Inhaltsverzeichnis eines Gerätes. +
  +
Xbiosnummer: 62 +
  +
Deklaration: int32_t Metagettoc( int16_t drive, int16_t flag, CD_TOC_ENTRY +*buffer ); +
  +
Beschreibung: Die Funktion liefert das Inhaltsverzeichnis eines Laufwerks zurück. Es +gilt: +
  +

+
+ + + + + + + + + + + + + + + + +
ParameterBedeutung
drivegewünschtes Laufwerk
flagreserviert für CDAR504
bufferPuffer zur Aufnahme des Verzeichnisses
+
+ +
Hinweis: Der aufnehmende Puffer sollte Platz für 128 +Einträge bieten. Jeder Eintrag besteht aus einer Tracknummer und +MSF-Adresse (jeweils im BCD-Format). Für die Tracknummer gilt dabei: +
0 = Record hat keine Bedeutung +
0x01...0x99 = Tracknummer in BCD-Codierung +
0xa0 = erster Track bei programmierter Reihenfolge +
0xa2 = Ende der CD. +
  +
Ergebnis: Die Funktion liefert als Ergebnis einen Wert vom Typ int32_t +zurück. +
  +
Verfügbar: Diese Funktion steht nur bei installiertem MetaDOS zur +Verfügung. +
  +
Gruppe: Laufwerksfunktionen +
  +
Querverweis: Binding   Metaread   Metawrite +
  + +
+ +

4.14.10.1 Bindings für Metagettoc

+ + + + + + +
C: int32_t Metagettoc( int16_t drive, int16_t flag, CD_TOC_ENTRY +*buffer ); +
  +
Assembler: +
  +
pea       buffer       ; Offset 6
+move.w    flag,-(sp)   ; Offset 4
+move.w    drive,-(sp)  ; Offset 2
+move.w    #62,-(sp)    ; Offset 0
+trap      #14          ; XBIOS aufrufen
+lea       $A(sp),sp    ; Stack korrigieren
+
+ +
+ +

4.14.11 Metainit

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Metainit« - Informationen über die installierte Version von +MetaDOS ermitteln. +
  +
Xbiosnummer: 48 +
  +
Deklaration: void Metainit( META_INFO_1 *buffer ); +
  +
Beschreibung: Die XBIOS-Routine Metainit ermittelt Informationen über die +aktuell installierte Version von MetaDOS, und der ihr bekannten +Geräte. +
  +
Es bietet sich folgendes Verfahren an: +
  +
    +
  • Inhalt der META_INFO_1 Struktur komplett löschen +
  • +
  • Funktion Metainit aufrufen +
  • +
  • Testen, ob die Komponente version noch einen Nullzeiger +enthält (dann ist kein MetaDOS installiert). +
  • +
+ +
Ergebnis: Die Funktion liefert kein direktes Ergebnis. +
  +
Verfügbar: Diese Funktion steht nur bei installiertem MetaDOS zur +Verfügung. +
  +
Gruppe: Laufwerksfunktionen +
  +
Querverweis: Binding +
  + +
+ +

4.14.11.1 Bindings für Metainit

+ + + + + + +
C: void Metainit( META_INFO_1 *buffer ); +
  +
Assembler: +
  +
pea       buffer       ; Offset 2
+move.w    #48,-(sp)    ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.14.12 Metaioctl

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Metaioctl« - schickt GEMDOS-Opcodes an ein MetaDOS Gerät. +
  +
Xbiosnummer: 55 +
  +
Deklaration: int32_t Metaioctl( int16_t drive, int32_t magic, int16_t +opcode, void *buffer ); +
  +
Beschreibung: Die Funktion erlaubt es, Opcodes der GEMDOS-Routinen Dcntl +bzw. Fcntl an ein MetaDOS Gerät abzusetzen. Es gilt: +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
drivegewünschtes Laufwerk
magicmuss Wert 'FCTL' besitzen
opcodeabzusetzender Opcode
bufferabhängig vom Opcode
+
+ +
Hinweis: Die Liste der CD-ROM Kommandos ist eine Aufstellung aller bekannten +Opcodes, die bei der Arbeit mit CD-ROMs anfallen können. +
  +
Ergebnis: Die Funktion liefert im Fehlerfall einen der folgenden Werte +zurück: +
  + + + + + + +
EINVFN: der angegebene Opcode wird nicht unterstützt. +
  +
EUNCMD: die Funktion selbst (!) wird nicht unterstützt. +
  + +
+ +
Verfügbar: Diese Funktion steht nur bei installiertem MetaDOS zur +Verfügung. +
  +
Gruppe: Laufwerksfunktionen +
  +
Querverweis: Binding   Dcntl   Fcntl +
  + +
+ +

4.14.12.1 Bindings für Metaioctl

+ + + + + + +
C: int32_t Metaioctl( int16_t drive, int32_t magic, int16_t +opcode, void *buffer ); +
  +
Assembler: +
  +
pea       buffer       ; Offset 10
+move.w    opcode,-(sp) ; Offset  8
+move.l    magic,-(sp)  ; Offset  4
+move.w    drive,-(sp)  ; Offset  2
+move.w    #55,-(sp)    ; Offset  0
+trap      #14          ; XBIOS aufrufen
+lea       $E(sp),sp    ; Stack korrigieren
+
+ +
+ +

4.14.13 Metaopen

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Metaopen« - initialisiert ein MetaDOS-Gerät. +
  +
Xbiosnummer: 49 +
  +
Deklaration: int32_t Metaopen( int16_t drive, META_DRVINFO *buffer ); +
  +
Beschreibung: Die Funktion initialisiert ein MetaDOS-Gerät. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
drive gewünschtes Laufwerk +
buffer Puffer zur Aufnahme des Namens des Treibers + +
+ +
Hinweis: Falls der Treibername mit 'CD' beginnt, darf +man davon ausgehen, daß es sich um einen CD-ROM-Treiber handelt. +
  +
Ergebnis: Die Funktion liefert als Ergebnis einen Wert 0 wenn alles OK +oder eine negative Fehlernummer. +
  +
Verfügbar: Diese Funktion steht nur bei installiertem MetaDOS zur +Verfügung. +
  +
Gruppe: Laufwerksfunktionen +
  +
Querverweis: Binding   Metaclose +
  + +
+ +

4.14.13.1 Bindings für Metaopen

+ + + + + + +
C: int32_t Metaopen( int16_t drive, META_DRVINFO *buffer ); +
  +
Assembler: +
  +
pea       buffer       ; Offset 4
+move.w    drive,-(sp)  ; Offset 2
+move.w    #49,-(sp)    ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #8,sp        ; Stack korrigieren
+
+ +
+ +

4.14.14 Metaread

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Metaread« - liest Daten von einem MetaDOS-Gerät. +
  +
Xbiosnummer: 51 +
  +
Deklaration: int32_t Metaread( int16_t drive, void *buffer, int32_t blockno, +int16_t count ); +
  +
Beschreibung: Die Funktion liest Daten von einem MetaDOS-Gerät. Es gilt: +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
drive gewünschtes Laufwerk +
buffer Puffer zur Aufnahme der Daten +
blockno Nummer des Startblocks +
count Anzahl der zu lesenden Blöcke + +
+ +
Hinweis: Die Blockgröße beträgt bei CD-ROMs 2048 +Bytes; dies kann jedoch leider nicht gezielt abgefragt werden. +Aufgrund einer Begrenzung in Atari's BOS-Treibern können maximal 63 +Blöcke an einem Stück gelesen werden. +
  +
Ergebnis: Die Funktion liefert als Ergebnis einen Wert vom Typ int32_t +zurück. +
  +
Verfügbar: Diese Funktion steht nur bei installiertem MetaDOS zur +Verfügung. +
  +
Gruppe: Laufwerksfunktionen +
  +
Querverweis: Binding   Metawrite +
  + +
+ +

4.14.14.1 Bindings für Metaread

+ + + + + + +
C: int32_t Metaread( int16_t drive, void *buffer, int32_t blockno, +int16_t count ); +
  +
Assembler: +
  +
move.w    count,-(sp)   ; Offset 10
+move.l    blockno,-(sp) ; Offset  8
+pea       buffer        ; Offset  4
+move.w    drive,-(sp)   ; Offset  2
+move.w    #51,-(sp)     ; Offset  0
+trap      #14           ; XBIOS aufrufen
+lea       $E(sp),sp     ; Stack korrigieren
+
+ +
+ +

4.14.15 Metaseek

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Metaseek« - Seeks to a physical address. +
  +
Xbiosnummer: 53 +
  +
Binding: int32_t Metaseek( int16_t drive, int32_t blockno ); +
  +
Beschreibung: The function will seek the physical unit to a physical address. +The function call will return once the seek has been completed or on +an error condition. The following apply: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
drive gewünschtes Laufwerk +
blockno Block number to seek to + +
+ +
Ergebnis: Die Funktion liefert als Ergebnis einen Wert vom Typ int32_t +zurück. +
  +
Verfügbar: Diese Funktion steht nur bei installiertem MetaDOS zur +Verfügung. +
  +
Gruppe: Laufwerksfunktionen +
  +
Querverweis: Binding   Metaread   Metawrite +
  + +
+ +

4.14.15.1 Bindings für Metaseek

+ + + + + + +
C: int32_t Metaseek( int16_t drive, int32_t blockno ); +
  +
Assembler: +
  +
move.l    blockno,-(sp)    ; Offset 4
+move.w    drive            ; Offset 2
+move.w    #53,-(sp)        ; Offset 0
+trap      #14              ; XBIOS aufrufen
+addq.l    #8,sp            ; Stack korrigieren
+
+ +
+ +

4.14.16 Metasetsongtime

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Metasetsongtime« - startet eine Audio-Wiedergabe. +
  +
Xbiosnummer: 61 +
  +
Binding: Bindings für Metasetsongtime +
  +
Beschreibung: Die Funktion startet eine Audio-Wiedergabe. Es gilt: +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
drive gewünschtes Laufwerk +
repeat Repeat +
+
+ + + + + + + + + + +
0=ohne Wiederholung
1=mit Wiederholung
+
+ +
starttime BCD-Anfangszeit in MSF-Codierung +
endtime BCD-Endzeit in MSF-Codierung + +
+ +
Hinweis: Der Repeat-Modus wird anscheinend nur von +CDARGEN.BOS und auch nur für das Atari-CDAR504 unterstützt. +
  +
Ergebnis: Die Funktion liefert als Ergebnis einen Wert vom Typ int32_t +zurück. +
  +
Verfügbar: Diese Funktion steht nur bei installiertem MetaDOS zur +Verfügung. +
  +
Gruppe: Laufwerksfunktionen +
  +
Querverweis: Binding   Metastartaudio   Metastopaudio +
  + +
+ +

4.14.16.1 Bindings für Metasetsongtime

+ + + + + + +
C: int32_t Metasetsongtime( int16_t drive, int16_t repeat, int32_t +starttime, int32_t endtime ); +
  +
Assembler: +
  +
move.l    endtime,-(sp)    ; Offset 10
+move.l    starttime,-(sp)  ; Offset  6
+move.w    repeat           ; Offset  4
+move.w    drive            ; Offset  2
+move.w    #61,-(sp)        ; Offset  0
+trap      #14              ; XBIOS aufrufen
+lea       $E(sp),sp        ; Stack korrigieren
+
+ +
+ +

4.14.17 Metastartaudio

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Metastartaudio« - startet eine Audio-Wiedergabe. +
  +
Xbiosnummer: 59 +
  +
Binding: int32_t Metastartaudio( int16_t drive, int16_t flag, uint8_t +*bytearray); +
  +
Beschreibung: Die Funktion startet eine Audio-Wiedergabe. Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
drive gewünschtes Laufwerk +
flag Modus +
bytearray abhängig vom Parameter flag + +
+ +
Hinweis: Auf SCSI-Geräten existiert nur ein Modus (flag += 0). In diesem Fall übergibt man in bytearray[0] die Anzahl +der Lieder, und in bytearray[1] die Nummer des ersten Liedes. +
  +
Ergebnis: Die Funktion liefert als Ergebnis einen Wert vom Typ int32_t +zurück. +
  +
Verfügbar: Diese Funktion steht nur bei installiertem MetaDOS zur +Verfügung. +
  +
Gruppe: Laufwerksfunktionen +
  +
Querverweis: Binding   Metasetsongtime   Metastopaudio +
  + +
+ +

4.14.17.1 Bindings für Metastartaudio

+ + + + + + +
C: int32_t Metastartaudio( int16_t drive, int16_t flag, uint8_t +*bytearray); +
  +
Assembler: +
  +
pea       bytearray    ; Offset 6
+move.w    flag,-(sp)   ; Offset 4
+move.w    drive,-(sp)  ; Offset 2
+move.w    #59,-(sp)    ; Offset 0
+trap      #14          ; XBIOS aufrufen
+lea       $A(sp),sp    ; Stack korrigieren
+
+ +
+ +

4.14.18 Metastatus

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Metastatus« - ermittelt den Status eines MetaDOS Gerätes. +
  +
Xbiosnummer: 54 +
  +
Deklaration: int32_t Metastatus( int16_t drive, void *buffer ); +
  +
Beschreibung: Die Funktion ermittelt den Status eines MetaDOS Gerätes. Es +gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
drive gewünschtes Laufwerk +
buffer abhängig von der Implementierung des BOS-Treibers + +
+ +
Achtung: Diese Funktion ist optional. Sie steht nur bei +installiertem MetaDOS zur Verfügung. +
  +
Ergebnis: Die Funktion liefert als Ergebnis einen 32-Bit Wert zurück, +der wie folgt codiert ist: +
  + + + + + + +
High-Word: +
  +

+
+ + + + + + + + + + +
0x0000=alles ok
0xffff=Fehler aufgetreten
+
+ +
Low-Word : +
  +

+
+ + + + + + + + + + + + + + + + +
Bit-15(Fehler)
Bit-07(Timeout)
Bit-02(Medienwechsel)
Bit-01(Busy)
+
+ + +
+ +
Alle anderen Bits des Low-Words sind z.Zt. reserviert. +
  +
Verfügbar: Diese Funktion steht nur bei installiertem MetaDOS zur +Verfügung. +
  +
Gruppe: Laufwerksfunktionen +
  +
Querverweis: Binding   Metadiscinfo +
  + +
+ +

4.14.18.1 Bindings für Metastatus

+ + + + + + +
C: int32_t Metastatus( int16_t drive, void *buffer ); +
  +
Assembler: +
  +
pea       buffer       ; Offset 4
+move.w    drive,-(sp)  ; Offset 2
+move.w    #54,-(sp)    ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #8,sp        ; Stack korrigieren
+
+ +
+ +

4.14.19 Metastopaudio

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Metastopaudio« - beendet eine Audio-Wiedergabe. +
  +
Xbiosnummer: 60 +
  +
Deklaration: int32_t Metastopaudio( int16_t drive ); +
  +
Beschreibung: Die Funktion beendet die Audio-Wiedergabe für das Laufwerk +drive. +
  +
Ergebnis: Die Funktion liefert als Ergebnis einen Wert vom Typ int32_t +zurück. +
  +
Verfügbar: Diese Funktion steht nur bei installiertem MetaDOS zur +Verfügung. +
  +
Gruppe: Laufwerksfunktionen +
  +
Querverweis: Binding   Metastartaudio   Metasetsongtime +
  + +
+ +

4.14.19.1 Bindings für Metastopaudio

+ + + + + + +
C: int32_t Metastopaudio( int16_t drive ); +
  +
Assembler: +
  +
move.w    drive,-(sp)  ; Offset 2
+move.w    #60,-(sp)    ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.14.20 Metawrite

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Metawrite« - schreibt Daten auf ein MetaDOS-Gerät. +
  +
Xbiosnummer: 52 +
  +
Deklaration: int32_t Metawrite( int16_t drive, void *buffer, int32_t +blockno, int16_t count ); +
  +
Beschreibung: Die Funktion schreibt Daten auf ein MetaDOS-Gerät. Es gilt: +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
drive gewünschtes Laufwerk +
buffer Adresse des Datenpuffers +
blockno Nummer des Startblocks +
count Anzahl der zu schreibenden Blöcke + +
+ +
Hinweis: Bei einem CD-ROM hat diese Funktion natürlich +keine Wirkung. +
  +
Ergebnis: Die Funktion liefert als Ergebnis einen Wert vom Typ int32_t +zurück. +
  +
Verfügbar: Diese Funktion steht nur bei installiertem MetaDOS zur +Verfügung. +
  +
Gruppe: Laufwerksfunktionen +
  +
Querverweis: Binding   Metaread +
  + +
+ +

4.14.20.1 Bindings für Metawrite

+ + + + + + +
C: int32_t Metawrite( int16_t drive, void *buffer, int32_t +blockno, int16_t count ); +
  +
Assembler: +
  +
move.w    count,-(sp)   ; Offset 10
+move.l    blockno,-(sp) ; Offset  8
+pea       buffer        ; Offset  4
+move.w    drive,-(sp)   ; Offset  2
+move.w    #52,-(sp)     ; Offset  0
+trap      #14           ; XBIOS aufrufen
+lea       $E(sp),sp     ; Stack korrigieren
+
+ +
+ +

4.14.21 Protobt

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »prototype boot sector« - Standard-Boot-Sektor. +
  +
Xbiosnummer: 18 +
  +
Deklaration: void Protobt( void *buf, int32_t serialno, int16_t disktype, +int16_t execflag ); +
  +
Beschreibung: Die XBIOS-Routine Protobt legt einen Boot-Sektor auf einer +Diskette an. Das Argument buf verweist auf einen 512 Byte +großen Puffer mit dem Inhalt des Boot-Sektors. Der Parameter +serialno dient dazu, eine Seriennummer im Bootsektor +abzuspeichern. Wenn die Variable serialno größer als +0x01000000 ist, dann wird eine Zufallszahl abgelegt. Mit +disktype wird eine der folgenden Diskettenarten ausgewählt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
disktype Bedeutung +
    +
  -1 nicht verändern +
   0 40 Spuren, einseitig    (180 Kbyte) +
   1 40 Spuren, doppelseitig (360 Kbyte) +
   2 80 Spuren, einseitig    (360 Kbyte) +
   3 80 Spuren, doppelseitig (720 Kbyte) +
   4 High-Density (1,44 Mbyte) +
Wird nur unterstützt, wenn im Cookie _FDC der Wert für +HD-Unterstützung eingetragen ist. +
   5 Extra-High-Density (2,88 Mbyte) +
Wird nur unterstützt, wenn im Cookie _FDC der Wert für +ED-Unterstützung eingetragen ist. + +
+ +
Der Parameter execflag legt schließlich fest, ob die +Informationen im Boot-Sektor als Programm ausgeführt werden können. +Es gilt: +
  + + + + + + + + + + + + + + + +
execflag Bedeutung +
    +
-1 Bootsektor nicht verändern +
 0 Bootsektor nicht ausführen +
 1 Bootsektor ausführbar + +
+ +
Hinweis: Damit Disketten auch auf MSDOS-Systemen gelesen +werden können, müssen in die ersten 3 Bytes des Bootsektors die +Werte 0xE9, 0x00 und 0x4E oder 0xEB, 0x34 und 0x90 eingetragen werden; +auf diese Art und Weise behandelte Disketten sind unter TOS dann +allerdings nicht mehr bootbar. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Alle TOS Versionen. +
  +
Gruppe: Laufwerksfunktionen +
  +
Querverweis: Binding   Flopfmt +
  + +
+ +

4.14.21.1 Bindings für Protobt

+ + + + + + + + + +
C: #include <tos.h> +
  +
void Protobt( void *buf, int32_t serialno, int16_t disktype, +int16_t execflag ); +
  +
Assembler: +
  +
move.w    execflag,-(sp)  ; Offset 12
+move.w    disktype,-(sp)  ; Offset 10
+move.l    serialno,-(sp)  ; Offset  6
+pea       buf             ; Offset  2
+move.w    #18,-(sp)       ; Offset  0
+trap      #14             ; XBIOS aufrufen
+lea       $E(sp),sp       ; Stack korrigieren
+
+
GFA-Basic Fehler%=Xbios(18,L:buf%,L:serialno%,W:disktype%,W:execflag%) +
  + +
+ +
+ +Home +XBIOSXBIOS +InterruptfunktionenInterruptfunktionen +MATRIX-XBIOS-ErweiterungMATRIX-XBIOS-Erweiterung + + diff --git a/de/xbios_dsp56001.html b/de/xbios_dsp56001.html new file mode 100644 index 000000000..44eaa6cdf --- /dev/null +++ b/de/xbios_dsp56001.html @@ -0,0 +1,2632 @@ + + + + + +Die Anleitung zum TOS: DSP-Programmierung + + + + + + + + + +Home +XBIOSXBIOS +DruckerfunktionenDruckerfunktionen +Hatari-DHS-XBIOS-ErweiterungHatari-DHS-XBIOS-Erweiterung + +
+ +

4.11 DSP-Programmierung

+

Auf dem Falcon stehen die folgenden Routinen zur Programmierung +des digitalen Signalprozessors DSP-56001 zur Verfügung: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dsp_Available Freien Speicher ermitteln. +
Dsp_BlkBytes Byteweiser Datentransfer. +
Dsp_BlkHandShake Datentransfer mit Handshake. +
Dsp_BlkUnpacked Transfer von DSP-Worten (max. 4 Byte Länge). +
Dsp_BlkWords Wortweiser Datentransfer. +
Dsp_DoBlock Datentransfer zum DSP. +
Dsp_ExecBoot Bootprogramm für DSP laden. +
Dsp_ExecProg DSP-Programm starten. +
Dsp_FlushSubroutines Unterprogramme löschen. +
Dsp_GetProgAbility Identifikation erfragen. +
Dsp_GetWordSize Länge von DSP-Worten ermitteln. +
Dsp_Hf0 Bit 3 des HSR setzen bzw. löschen. +
Dsp_Hf1 Bit 4 des HSR setzen bzw. löschen. +
Dsp_Hf2 Bit 3 des HCR ermitteln. +
Dsp_Hf3 Bit 4 des HCR ermitteln. +
Dsp_HStat Wert des ISR-Registers ermitteln. +
Dsp_InqSubrAbility Unterprogrammkennung ermitteln. +
Dsp_InStream Datentransfer zum DSP via Interrupt. +
Dsp_IOStream Datentransfer vom und zum DSP via Interrupt. +
Dsp_LoadProg DSP-Programm laden und starten. +
Dsp_LoadSubroutine Unterprogramm installieren. +
Dsp_Lock Verfügbarkeit des DSP ermitteln. +
Dsp_LodToBinary LOD- in Binärformat konvertieren. +
Dsp_MultBlocks Datentransfer vom und zum DSP. +
Dsp_OutStream Datentransfer vom DSP via Interrupt. +
Dsp_RemoveInterrupts Übertragungsroutinen entfernen. +
Dsp_RequestUniqueAbility Identifikation erteilen. +
Dsp_Reserve Speicher reservieren. +
Dsp_RunSubroutine Unterprogramm ausführen. +
Dsp_SetVectors Eigene Übertragungsroutinen installieren. +
Dsp_TriggerHC Host Command ausführen. +
Dsp_Unlock DSP freigeben. + +
+ +

Querverweis: Schnittstellenprogrammierung +

+

4.11.1 Dsp_Available

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_Available« - Ermitteln des freien x und y Speichers +
  +
Xbiosnummer: 106 +
  +
Deklaration: void Dsp_Available( int32_t *xavailable, int32_t *yavailable ); +
  +
Beschreibung: Die Funktion Dsp_Available ermittelt den freien X- und +Y-Speicher. Freier Speicher beginnt stets an der physikalischen +Adresse 0. Die unteren 64 Worte sind für Interrupt-Vektoren +reserviert. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Verfügbar: Die Funktion ist nur auf Computern mit dem Signalprozessor +DSP56001 verfügbar. +
  +
Gruppe: DSP-Programmierung +
  +
Querverweis: Binding   Dsp_Lock   Dsp_Unlock   Dsp_Reserve   Dsp_LoadProg   +Dsp_ExecProg   Dsp_ExecBoot +
  + +
+ +

4.11.1.1 Bindings für Dsp_Available

+ + + + + + +
C: #include <tos.h> +
  +
void Dsp_Available( int32_t *xavailable, int32_t *yavailable ); +
  +
Assembler: +
  +
pea       yavailable   ; Offset 6
+pea       xavailable   ; Offset 2
+move.w    #106,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+lea       $A(sp),sp    ; Stack korrigieren
+
+ +
+ +

4.11.2 Dsp_BlkBytes

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_BlkBytes« - byteweiser Datentransfer zum DSP +
  +
Xbiosnummer: 124 +
  +
Deklaration: void Dsp_BlkBytes( void *data_in, int32_t size_in, void +*data_out, int32_t size_out ); +
  +
Beschreibung: Die Funktion kopiert size_in vorzeichenlose Bytes aus +dem Puffer data_in zum DSP. Nachdem alle Daten übertragen +wurden, wartet die Prozedur bis die Daten verarbeitet wurden. Dann +werden size_out 8-Bit-DSP-Worte in den Puffer data_out +zurückkopiert, unabhängig davon, wie viel Daten wirklich vorliegen. +Sollen keine Daten gesendet werden, muß man size_in auf Null +setzen. Gleiches gilt für das Empfangen, in diesem Fall wird +size_out Null zugewiesen. size_in und size_out +sind auf 64 KByte begrenzt. Daten werden nur ausgetauscht, wenn der +DSP-Prozeß dazu bereit ist. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Verfügbar: Die Funktion ist nur auf Computern mit dem Signalprozessor +DSP56001 verfügbar. +
  +
Gruppe: DSP-Programmierung +
  +
Querverweis: Binding   Dsp_DoBlock   Dsp_BlkUnpacked   Dsp_BlkHandShake   +Dsp_BlkWords   Dsp_InStream   Dsp_OutStream   Dsp_IOStream   +Dsp_GetWordSize   Dsp_MultBlocks +
  + +
+ +

4.11.2.1 Bindings für Dsp_BlkBytes

+ + + + + + +
C: #include <tos.h> +
  +
void Dsp_BlkBytes( void *data_in, int32_t size_in, void +*data_out, int32_t size_out ); +
  +
Assembler: +
  +
move.l    size_out,-(sp)  ; Offset 14
+pea       data_out        ; Offset 10
+move.l    size_in,-(sp)   ; Offset  6
+pea       data_in         ; Offset  2
+move.w    #124,-(sp)      ; Offset  0
+trap      #14             ; XBIOS aufrufen
+lea       $12(sp),sp      ; Stack korrigieren
+
+ +
+ +

4.11.3 Dsp_BlkHandShake

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »DspBlkHandShake« - Datentransfer zum DSP mit Handshake +
  +
Xbiosnummer: 97 +
  +
Deklaration: void Dsp_BlkHandShake( int8_t *data_in, int32_t size_in, int8_t +*data_out, int32_t size_out ); +
  +
Beschreibung: Die Funktion kopiert size_in DSP-Worte aus dem Puffer +data_in zum DSP. Nachdem alle Daten übertragen wurden, wartet +die Funktion bis die Daten verarbeitet wurden. Dann werden +size_out DSP-Worte in den Puffer data_out +zurückkopiert, unabhängig davon, wieviel Daten wirklich vorliegen. +Sollen keine Daten gesendet werden, muß man size_in auf Null +setzen. Gleiches gilt für das Empfangen, in diesem Fall wird +size_out Null zugewiesen. size_in und size_out +sind auf 64 KByte begrenzt. Daten werden nur ausgetauscht, wenn der +DSP-Prozeß dazu bereit ist. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Verfügbar: Die Funktion ist nur auf Computern mit dem Signalprozessor +DSP56001 verfügbar. +
  +
Gruppe: DSP-Programmierung +
  +
Querverweis: Binding   Dsp_DoBlock   Dsp_BlkUnpacked   Dsp_BlkWords   +Dsp_BlkBytes   Dsp_InStream   Dsp_OutStream   Dsp_IOStream   +Dsp_GetWordSize   Dsp_MultBlocks +
  + +
+ +

4.11.3.1 Bindings für Dsp_BlkHandShake

+ + + + + + +
C: #include <tos.h> +
  +
void Dsp_BlkHandShake( int8_t *data_in, int32_t size_in, int8_t +*data_out, int32_t size_out ); +
  +
Assembler: +
  +
move.l    size_out,-(sp)  ; Offset 14
+pea       data_out        ; Offset 10
+move.l    size_in,-(sp)   ; Offset  6
+pea       data_in         ; Offset  2
+move.w    #97,-(sp)       ; Offset  0
+trap      #14             ; XBIOS aufrufen
+lea       $12(sp),sp      ; Stack korrigieren
+
+ +
+ +

4.11.4 Dsp_BlkUnpacked

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_BlkUnpacked« - Datentransfer von maximal 4 Bytes langen +DSP-Worten +
  +
Xbiosnummer: 98 +
  +
Deklaration: void Dsp_BlkUnpacked( int32_t *data_in, int32_t size_in, +int32_t *data_out, int32_t size_out ); +
  +
Beschreibung: Diese Funktion arbeitet nur mit DSP-Worten, die höchstens 4 +Byte lang sind. Die Länge der DSP-Worte kann mit Dsp_GetWordSize +bestimmt werden. data_in und data_out sind +LONG-Felder. size_in und size_out beziehen sich auf +die Größe der Felder in Langworten. Je nach DSP-Wortlänge werden +nur die unteren Bytes LONGs übertragen. Die Funktion kopiert +size_in DSP-Worte aus dem Puffer data_in zum DSP. +Nachdem alle Daten übertragen wurden, wartet die Funktion bis die +Daten verarbeitet wurden. Dann werden size_out DSP-Worte in +den Puffer data_out zurückkopiert, unabhängig davon, wieviel Daten +wirklich vorliegen. Sollen keine Daten gesendet werden, muß man +size_in auf Null setzen. Gleiches gilt für das Empfangen, in +diesem Fall wird size_out Null zugewiesen. size_in und +size_out sind auf 64 KByte begrenzt. +
Es wird nicht garantiert, daß die höherwertigen Bytes der +empfangenen LONGs Null sind, wenn die DSP-Wortlänge kleiner als 4 +ist. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Verfügbar: Die Funktion ist nur auf Computern mit dem Signalprozessor +DSP56001 verfügbar. +
  +
Gruppe: DSP-Programmierung +
  +
Querverweis: Binding   Dsp_DoBlock   Dsp_BlkHandShake   Dsp_BlkWords   +Dsp_BlkBytes   Dsp_InStream   Dsp_OutStream   Dsp_IOStream   +Dsp_GetWordSize   Dsp_MultBlocks +
  + +
+ +

4.11.4.1 Bindings für Dsp_BlkUnpacked

+ + + + + + +
C: #include <tos.h> +
  +
void Dsp_BlkUnpacked( int32_t *data_in, int32_t size_in, int32_t +*data_out, int32_t size_out ); +
  +
Assembler: +
  +
move.l    size_out,-(sp)  ; Offset 14
+pea       data_out        ; Offset 10
+move.l    size_in,-(sp)   ; Offset  6
+pea       data_in         ; Offset  2
+move.w    #98,-(sp)       ; Offset  0
+trap      #14             ; XBIOS aufrufen
+lea       $12(sp),sp      ; Stack korrigieren
+
+ +
+ +

4.11.5 Dsp_BlkWords

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_BlkWords« - wortweiser Datentransfer zum DSP +
  +
Xbiosnummer: 123 +
  +
Deklaration: void Dsp_BlkWords( void *data_in, int32_t size_in, void +*data_out, int32_T size_out ); +
  +
Beschreibung: Die Funktion kopiert size_in vorzeichenbehaftete +16-Bit-Worte aus dem Puffer data_in zum DSP. Die Worte werden +vor der Übertragung vorzeichenrichtig auf DSP-Wortbreite erweitert. +Nachdem alle Daten übertragen wurden, wartet die Funktion bis die +Daten verarbeitet wurden. Dann werden size_out +16-Bit-DSP-Worte in den Puffer data_out zurückkopiert, +unabhängig davon, wieviel Daten wirklich vorliegen. Sollen keine +Daten gesendet werden, muß man size_in auf Null setzen. +Gleiches gilt für das Empfangen, in diesem Fall wird size_out +Null zugewiesen. size_in und size_out sind auf 64 +KByte begrenzt. Daten werden nur ausgetauscht, wenn der DSP-Prozeß +dazu bereit ist. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Verfügbar: Die Funktion ist nur auf Computern mit dem Signalprozessor +DSP56001 verfügbar. +
  +
Gruppe: DSP-Programmierung +
  +
Querverweis: Binding   Dsp_DoBlock   Dsp_BlkUnpacked   Dsp_BlkHandShake   +Dsp_BlkBytes   Dsp_InStream   Dsp_OutStream   Dsp_IOStream   +Dsp_GetWordSize   Dsp_MultBlocks +
  + +
+ +

4.11.5.1 Bindings für Dsp_BlkWords

+ + + + + + +
C: #include <tos.h> +
  +
void Dsp_BlkWords( void *data_in, int32_t size_in, void +*data_out, int32_T size_out ); +
  +
Assembler: +
  +
move.l    size_out,-(sp)  ; Offset 14
+pea       data_out        ; Offset 10
+move.l    size_in,-(sp)   ; Offset  6
+pea       data_in         ; Offset  2
+move.w    #123,-(sp)      ; Offset  0
+trap      #14             ; XBIOS aufrufen
+lea       $12(sp),sp      ; Stack korrigieren
+
+ +
+ +

4.11.6 Dsp_DoBlock

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_DoBlock« - Datentransfer zum DSP +
  +
Xbiosnummer: 96 +
  +
Deklaration: void Dsp_DoBlock( int8_t *data_in, int32_t size_in, int8_t +*data_out, int32_t size_out ); +
  +
Beschreibung: Die Funktion kopiert size_in DSP-Worte aus dem Puffer +data_in zum DSP. Nachdem alle Daten übertragen wurden, wartet +die Funktion bis die Daten verarbeitet wurden. Dann werden +size_out DSP-Worte in den Puffer data_out +zurückkopiert, unabhängig davon, wieviel Daten wirklich vorliegen. +Sollen keine Daten gesendet werden, muß man size_in auf Null +setzen. Gleiches gilt für das Empfangen, in diesem Fall wird +size_out Null zugewiesen. size_in und size_out +sind auf 64 KByte begrenzt. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Verfügbar: Die Funktion ist nur auf Computern mit dem Signalprozessor +DSP56001 verfügbar. +
  +
Gruppe: DSP-Programmierung +
  +
Querverweis: Binding   Dsp_BlkHandShake   Dsp_BlkUnpacked   Dsp_BlkWords   +Dsp_BlkBytes   Dsp_InStream   Dsp_OutStream   Dsp_IOStream   +Dsp_GetWordSize   Dsp_MultBlocks +
  + +
+ +

4.11.6.1 Bindings für Dsp_DoBlock

+ + + + + + +
C: #include <tos.h> +
  +
void Dsp_DoBlock( int8_t *data_in, int32_t size_in, int8_t +*data_out, int32_t size_out ); +
  +
Assembler: +
  +
move.l    size_out,-(sp)  ; Offset 14
+pea       data_out        ; Offset 10
+move.l    size_in,-(sp)   ; Offset  6
+pea       data_in         ; Offset  2
+move.w    #96,-(sp)       ; Offset  0
+trap      #14             ; XBIOS aufrufen
+lea       $12(sp),sp      ; Stack korrigieren
+
+ +
+ +

4.11.7 Dsp_ExecBoot

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_ExecBoot« - Bootprogramm für DSP laden +
  +
Xbiosnummer: 110 +
  +
Deklaration: void Dsp_ExecBoot( int8_t *codeptr, int32_t codesize, int16_t +ability ); +
  +
Beschreibung: Die Funktion Dsp_ExecBoot lädt ein Boot-Programm in die 512 +Worte des internen DSP-Speichers. Vor dem Laden wird ein Reset auf dem +DSP ausgeführt. Das DSP-Programm muß im Binär-Format vorliegen. Der +Parameter codeptr zeigt auf den Programmstart. Die Länge des +Programms wird durch den Parameter codesize bestimmt. +ability identifiziert das Programm. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Verfügbar: Die Funktion ist nur auf Computern mit dem Signalprozessor +DSP56001 verfügbar. +
  +
Gruppe: DSP-Programmierung +
  +
Querverweis: Binding   Dsp_Lock   Dsp_Unlock   Dsp_Available   Dsp_Reserve   +Dsp_LoadProg   Dsp_ExecProg   Dsp_LodToBinary +
  + +
+ +

4.11.7.1 Bindings für Dsp_ExecBoot

+ + + + + + +
C: #include <tos.h> +
  +
void Dsp_ExecBoot( int8_t *codeptr, int32_t codesize, int16_t +ability ); +
  +
Assembler: +
  +
move.w    ability,-(sp)  ; Offset 10
+move.l    codesize,-(sp) ; Offset  6
+pea       codeptr        ; Offset  2
+move.w    #110,-(sp)     ; Offset  0
+trap      #14            ; XBIOS aufrufen
+lea       $C(sp),sp      ; Stack korrigieren
+
+ +
+ +

4.11.8 Dsp_ExecProg

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_ExecProg« - DSP Programm starten +
  +
Xbiosnummer: 109 +
  +
Deklaration: void Dsp_ExecProg( int8_t *codeptr, int32_t codesize, int16_t +ability ); +
  +
Beschreibung: Die Funktion Dsp_ExecProg startet das im Binär-Format an der +Stelle codeptr vorliegende DSP-Programm der Länge codesize. +Seine Größe darf den durch Dsp_Reserve reservierten Speicher nicht +überschreiten. Der Parameter ability identifiziert das +Programm. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Verfügbar: Die Funktion ist nur auf Computern mit dem Signalprozessor +DSP56001 verfügbar. +
  +
Gruppe: DSP-Programmierung +
  +
Querverweis: Binding   Dsp_Lock   Dsp_Unlock   Dsp_Available   Dsp_Reserve   +Dsp_LoadProg   Dsp_ExecBoot   Dsp_LodToBinary +
  + +
+ +

4.11.8.1 Bindings für Dsp_ExecProg

+ + + + + + +
C: #include <tos.h> +
  +
void Dsp_ExecProg( int8_t *codeptr, int32_t codesize, int16_t +ability ); +
  +
Assembler: +
  +
move.w    ability,-(sp)  ; Offset 10
+move.l    codesize,-(sp) ; Offset  6
+pea       codeptr        ; Offset  2
+move.w    #109,-(sp)     ; Offset  0
+trap      #14            ; XBIOS aufrufen
+lea       $C(sp),sp      ; Stack korrigieren
+
+ +
+ +

4.11.9 Dsp_FlushSubroutines

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_FlushSubroutines« - Unterprogramme aus dem Speicher des +DSP entfernen +
  +
Xbiosnummer: 115 +
  +
Deklaration: void Dsp_FlushSubroutines( void ); +
  +
Beschreibung: Die Funktion Dsp_FlushSubroutines entfernt alle Unterprogramme +aus dem DSP-Speicher und erhöht somit den verfügbaren freien +Speicher. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Verfügbar: Die Funktion ist nur auf Computern mit dem Signalprozessor +DSP56001 verfügbar. +
  +
Gruppe: DSP-Programmierung +
  +
Querverweis: Binding   Dsp_LoadSubroutine   Dsp_InqSubrAbility   +Dsp_RunSubroutine +
  + +
+ +

4.11.9.1 Bindings für Dsp_FlushSubroutines

+ + + + + + +
C: #include <tos.h> +
  +
void Dsp_FlushSubroutines( void ); +
  +
Assembler: +
  +
move.w    #115,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

4.11.10 Dsp_GetProgAbility

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_GetProgAbility« - Identifikation eines Prozesses +ermitteln +
  +
Xbiosnummer: 114 +
  +
Deklaration: int16_t Dsp_GetProgAbility( void ); +
  +
Beschreibung: Die Funktion Dsp_GetProgAbility erteilt einem DSP-Prozeß eine +Identifikation, mittels derer man feststellen kann, ob der zum Prozeß +gehörige Code bereits im DSP vorhanden ist. +
  +
Ergebnis: Die Funktion liefert die für den Prozess gültige Kennung +zurück. +
  +
Verfügbar: Die Funktion ist nur auf Computern mit dem Signalprozessor +DSP56001 verfügbar. +
  +
Gruppe: DSP-Programmierung +
  +
Querverweis: Binding   Dsp_RequestUniqueAbility +
  + +
+ +

4.11.10.1 Bindings für Dsp_GetProgAbility

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Dsp_GetProgAbility( void ); +
  +
Assembler: +
  +
move.w    #114,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

4.11.11 Dsp_GetWordSize

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_GetWordSize« - Länge eines DSP Wortes ermitteln +
  +
Xbiosnummer: 103 +
  +
Deklaration: int16_t Dsp_GetWordSize( void ); +
  +
Beschreibung: Die Funktion Dsp_GetWordSize ermittelt die Größe in Byte, die +ein DSP-Wort lang ist. Diese Funktion ist notwendig, um die Puffer +für die Datenübertragung ausreichend zu dimensionieren. +
  +
Ergebnis: Die Funktion liefert die Größe eines DSP-Wortes zurück. +
  +
Verfügbar: Die Funktion ist nur auf Computern mit dem Signalprozessor +DSP56001 verfügbar. +
  +
Gruppe: DSP-Programmierung +
  +
Querverweis: Binding   Dsp_DoBlock   Dsp_BlkUnpacked   Dsp_BlkHandShake   +Dsp_BlkWords   Dsp_BlkBytes   Dsp_InStream   Dsp_IOStream   +Dsp_OutStream   Dsp_MultBlocks +
  + +
+ +

4.11.11.1 Bindings für Dsp_GetWordSize

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Dsp_GetWordSize( void ); +
  +
Assembler: +
  +
move.w    #103,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

4.11.12 Dsp_Hf0

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_Hf0« - Bit 3 des HSR setzen bzw. löschen +
  +
Xbiosnummer: 119 +
  +
Deklaration: int16_t Dsp_Hf0( int16_t flag ); +
  +
Beschreibung: Die Funktion Dsp_Hf0 ermittelt bzw. setzt den Wert des Bits 3 +des HSR. Der Parameter flag hat die folgende Bedeutung: +
  +

+
+ + + + + + + + + + + + + + + + +
flagBedeutung
 0Bit 3 des HSR löschen
 1Bit 3 des HSR setzen
-1Bit 3 des HSR unverändert lassen
+
+ +
Ergebnis: Die Funktion liefert den Wert von Bit-3 des HSR zurück. +
  +
Verfügbar: Die Funktion ist nur auf Computern mit dem Signalprozessor +DSP56001 verfügbar. +
  +
Gruppe: DSP-Programmierung +
  +
Querverweis: Binding   Dsp_Hf1   Dsp_Hf2   Dsp_Hf3   Dsp_HStat +
  + +
+ +

4.11.12.1 Bindings für Dsp_Hf0

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Dsp_Hf0( int16_t flag ); +
  +
Assembler: +
  +
move.w    flag,-(sp)   ; Offset 2
+move.w    #119,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.11.13 Dsp_Hf1

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_Hf1« - Bit 4 des HSR setzen bzw. löschen +
  +
Xbiosnummer: 120 +
  +
Deklaration: int16_t Dsp_Hf1( int16_t flag ); +
  +
Beschreibung: Die Funktion Dsp_Hf1 ermittelt bzw. setzt den Wert des Bits 4 +des HSR. Der Parameter flag hat die folgende Bedeutung: +
  +

+
+ + + + + + + + + + + + + + + + +
flagBedeutung
 0Bit 4 des HSR löschen
 1Bit 4 des HSR setzen
-1Bit 4 des HSR unverändert lassen
+
+ +
Ergebnis: Die Funktion liefert den Wert von Bit-4 des HSR zurück. +
  +
Verfügbar: Die Funktion ist nur auf Computern mit dem Signalprozessor +DSP56001 verfügbar. +
  +
Gruppe: DSP-Programmierung +
  +
Querverweis: Binding   Dsp_Hf0   Dsp_Hf2   Dsp_Hf3   Dsp_HStat +
  + +
+ +

4.11.13.1 Bindings für Dsp_Hf1

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Dsp_Hf1( int16_t flag ); +
  +
Assembler: +
  +
move.w    flag,-(sp)   ; Offset 2
+move.w    #120,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.11.14 Dsp_Hf2

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_Hf2« - Bit 3 des HCR ermitteln +
  +
Xbiosnummer: 121 +
  +
Deklaration: int16_t Dsp_Hf2( void ); +
  +
Beschreibung: Die Funktion Dsp_Hf2 ermittelt den Wert des Bits 3 des HCR. +
  +
Ergebnis: Die Funktion liefert den Wert von Bit-3 des HCR zurück. +
  +
Verfügbar: Die Funktion ist nur auf Computern mit dem Signalprozessor +DSP56001 verfügbar. +
  +
Gruppe: DSP-Programmierung +
  +
Querverweis: Binding   Dsp_Hf0   Dsp_Hf1   Dsp_Hf3   Dsp_HStat +
  + +
+ +

4.11.14.1 Bindings für Dsp_Hf2

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Dsp_Hf2( void ); +
  +
Assembler: +
  +
move.w    #121,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

4.11.15 Dsp_Hf3

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_Hf3« - Bit 4 des HCR ermitteln +
  +
Xbiosnummer: 122 +
  +
Deklaration: int16_t Dsp_Hf3( void ); +
  +
Beschreibung: Die Funktion Dsp_Hf3 ermittelt den Wert des Bits 4 des HCR. +
  +
Ergebnis: Die Funktion liefert den Wert von Bit-4 des HCR zurück. +
  +
Verfügbar: Die Funktion ist nur auf Computern mit dem Signalprozessor +DSP56001 verfügbar. +
  +
Gruppe: DSP-Programmierung +
  +
Querverweis: Binding   Dsp_Hf0   Dsp_Hf1   Dsp_Hf2   Dsp_HStat +
  + +
+ +

4.11.15.1 Bindings für Dsp_Hf3

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Dsp_Hf3( void ); +
  +
Assembler: +
  +
move.w    #122,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

4.11.16 Dsp_HStat

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_HStat« - Wert des ISR Registers ermitteln +
  +
Xbiosnummer: 125 +
  +
Deklaration: int8_t Dsp_HStat( void ); +
  +
Beschreibung: Die Funktion Dsp_HStat ermittelt den Wert des ISR-Registers. +Somit kann man feststellen, ob Daten empfangen oder gesendet werden +können. +
  +
Ergebnis: Die Funktion liefert den Wert des ISR-Registers zurück. +
  +
Verfügbar: Die Funktion ist nur auf Computern mit dem Signalprozessor +DSP56001 verfügbar. +
  +
Gruppe: DSP-Programmierung +
  +
Querverweis: Binding   Dsp_Hf0   Dsp_Hf1   Dsp_Hf2   Dsp_Hf3 +
  + +
+ +

4.11.16.1 Bindings für Dsp_HStat

+ + + + + + +
C: #include <tos.h> +
  +
int8_t Dsp_HStat( void ); +
  +
Assembler: +
  +
move.w    #125,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

4.11.17 Dsp_InqSubrAbility

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_InqSubrAbility« - Ermitteln der Kennung eines +Unterprogramms +
  +
Xbiosnummer: 117 +
  +
Deklaration: int16_t Dsp_InqSubrAbility( int16_t ability ); +
  +
Beschreibung: Die Funktion Dsp_InqSubrAbility bestimmt die Kennung des +Unterprogramms mit der Funktionalität abilitiy. +
  +
Ergebnis: Die Funktion liefert die Kennung des Unterprogramms zurück. +Ein Rückgabewert von Null bedeutet, daß sich das entsprechende +Unterprogramm nicht im DSP-Speicher befindet; in diesem Fall muß das +Unterprogramm über Dsp_LoadSubroutine installiert werden. +
  +
Verfügbar: Die Funktion ist nur auf Computern mit dem Signalprozessor +DSP56001 verfügbar. +
  +
Gruppe: DSP-Programmierung +
  +
Querverweis: Binding   Dsp_RunSubroutine   Dsp_FlushSubroutines   +Dsp_LoadSubroutine +
  + +
+ +

4.11.17.1 Bindings für Dsp_InqSubrAbility

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Dsp_InqSubrAbility( int16_t ability ); +
  +
Assembler: +
  +
move.w    ability,-(sp)  ; Offset 2
+move.w    #117,-(sp)     ; Offset 0
+trap      #14            ; XBIOS aufrufen
+addq.l    #4,sp          ; Stack korrigieren
+
+ +
+ +

4.11.18 Dsp_InStream

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_InStream« - Datentransfer zum DSP via Interrupt +
  +
Xbiosnummer: 99 +
  +
Deklaration: void Dsp_InStream( int8_t *data_in, int32_t block_size, int32_t +num_blocks, int32_t *blocks_done ); +
  +
Beschreibung: Die Funktion kopiert mittels DSP-Interruptbehandlung +num_blocks Datenblöcke mit einer Größe von +block_size DSP-Worten aus dem Puffer data_in zum DSP. +Bei jedem Interrupt wird ein Block übertragen, unabhängig davon, ob +der DSP empfangsbereit ist. Gleichzeitig wird der Zähler +blocks_done, der die Anzahl der übertragenen Blöcke +wiedergibt, inkrementiert. Da die Daten per Interrupt übertragen +werden, muß die Prozedur nicht warten. Über blocks_done kann +das Programm im weiteren Verlauf feststellen, ob die Übertragung +beendet ist. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Verfügbar: Die Funktion ist nur auf Computern mit dem Signalprozessor +DSP56001 verfügbar. +
  +
Gruppe: DSP-Programmierung +
  +
Querverweis: Binding   Dsp_DoBlock   Dsp_BlkUnpacked   Dsp_BlkHandShake   +Dsp_BlkWords   Dsp_BlkBytes   Dsp_OutStream   Dsp_IOStream   +Dsp_GetWordSize   Dsp_SetVectors   Dsp_RemoveInterrupts   +Dsp_MultBlocks +
  + +
+ +

4.11.18.1 Bindings für Dsp_InStream

+ + + + + + +
C: #include <tos.h> +
  +
void Dsp_InStream( int8_t *data_in, int32_t block_size, int32_t +num_blocks, int32_t *blocks_done ); +
  +
Assembler: +
  +
pea       blocks_done       ; Offset 14
+move.l    num_blocks,-(sp)  ; Offset 10
+move.l    block_size,-(sp)  ; Offset  6
+pea       data_in           ; Offset  2
+move.w    #99,-(sp)         ; Offset  0
+trap      #14               ; XBIOS aufrufen
+lea       $12(sp),sp        ; Stack korrigieren
+
+ +
+ +

4.11.19 Dsp_IOStream

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_IOStream« - Datentransfer vom und zum DSP via Interrupt +
  +
Xbiosnummer: 101 +
  +
Deklaration: void Dsp_IOStream( int8_t *data_in, int8_t *data_out, int32_t +block_insize, int32_t block_outsize, int32_t num_blocks, int32_t +*blocks_done ); +
  +
Beschreibung: Die Funktion sendet und empfängt gleichzeitig mittels +DSP-Interruptbehandlung num_blocks Datenblöcke mit einer +Größe von block_insize bzw. block_outsize DSP-Worten +vom DSP. Die gesendeten Daten werden dem Puffer data_in +entnommen, die empfangenen Daten werden im Puffer data_out +abgelegt. Bei jedem Interrupt wird ein Block gesendet und einer +empfangen (eine Ausnahme bilden der erste und der letzte Interrupt). +Gleichzeitig wird der Zähler blocks_done, der die Anzahl der +übertragenen Blöcke wiedergibt, inkrementiert. Da die Daten per +Interrupt übertragen werden, muß die Funktion nicht warten. Über +blocks_done kann das Programm im weiteren Verlauf feststellen, +ob die Übertragung beendet ist. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Verfügbar: Die Funktion ist nur auf Computern mit dem Signalprozessor +DSP56001 verfügbar. +
  +
Gruppe: DSP-Programmierung +
  +
Querverweis: Binding   Dsp_DoBlock   Dsp_BlkUnpacked   Dsp_BlkHandShake   +Dsp_BlkWords   Dsp_BlkBytes   Dsp_InStream   Dsp_OutStream   +Dsp_GetWordSize   Dsp_SetVectors   Dsp_RemoveInterrupts   +Dsp_MultBlocks +
  + +
+ +

4.11.19.1 Bindings für Dsp_IOStream

+ + + + + + +
C: #include <tos.h> +
  +
void Dsp_IOStream( int8_t *data_in, int8_t *data_out, int32_t +block_insize, int32_t block_outsize, int32_t num_blocks, int32_t +*blocks_done ); +
  +
Assembler: +
  +
pea       blocks_done          ; Offset 22
+move.l    num_blocks,-(sp)     ; Offset 18
+move.l    block_outsize,-(sp)  ; Offset 14
+move.l    block_insize,-(sp)   ; Offset 10
+pea       data_out             ; Offset  6
+pea       data_in              ; Offset  2
+move.w    #101,-(sp)           ; Offset  0
+trap      #14                  ; XBIOS aufrufen
+lea       $1A(sp),sp           ; Stack korrigieren
+
+ +
+ +

4.11.20 Dsp_LoadProg

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_LoadProg« - DSP Programm laden und starten +
  +
Xbiosnummer: 108 +
  +
Deklaration: int16_t Dsp_LoadProg( int8_t *file, int16_t ability, int8_t +*buffer ); +
  +
Beschreibung: Die Funktion Dsp_LoadProg lädt das DSP-Programm mit dem Namen +file. Das Programm muß im .LOD-Format vorliegen und darf den +durch Dsp_Reserve reservierten Speicher nicht überschreiten. Der +Parameter ability identifiziert das Programm. buffer +zeigt auf einen Speicherbereich, in dem das generierte Programm +zwischengespeichert werden kann. Die Größe des Speicherbereichs +berechnet sich nach der Formel +
  +
DSP-Wortgröße *
+( Anzahl der Programm- und Datenworte in der .LOD-Datei +
+( DSP-Wortgröße * Anzahl der Blöcke in der .LOD-Datei ))
+
+
Danach wird das Programm ausgeführt. +
  +
Ergebnis: Die Funktion liefert im positiven Fall den Wert 0, und im +Fehlerfall den Wert -1 zurück. +
  +
Verfügbar: Die Funktion ist nur auf Computern mit dem Signalprozessor +DSP56001 verfügbar. +
  +
Gruppe: DSP-Programmierung +
  +
Querverweis: Binding   Dsp_Lock   Dsp_Unlock   Dsp_Available   Dsp_Reserve   +Dsp_ExecProg   Dsp_ExecBoot   Dsp_LodToBinary +
  + +
+ +

4.11.20.1 Bindings für Dsp_LoadProg

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Dsp_LoadProg( int8_t *file, int16_t ability, int8_t +*buffer ); +
  +
Assembler: +
  +
pea       buffer         ; Offset 8
+move.w    ability,-(sp)  ; Offset 6
+pea       file           ; Offset 2
+move.w    #108,-(sp)     ; Offset 0
+trap      #14            ; XBIOS aufrufen
+lea       $C(sp),sp      ; Stack korrigieren
+
+ +
+ +

4.11.21 Dsp_LoadSubroutine

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_LoadSubroutine« - Unterprogramm im Speicher des DSP +installieren +
  +
Xbiosnummer: 116 +
  +
Deklaration: int16_t Dsp_LoadSubroutine( int8_t *codeptr, int32_t codesize, +int16_t ability ); +
  +
Beschreibung: Die Funktion Dsp_LoadSubroutine installiert das +DSP-Unterprogramm aus dem Puffer codeptr im DSP-Speicher. Das +Unterprogramm ist codesize DSP-Worte lang und hat die +Identifikation ability. Das Unterprogramm bleibt solange +resident im DSP-Speicher bis kein Platz mehr für neue Unterprogramme +ist und es verdrängt wird oder die Funktion Dsp_FlushSubroutines aufgerufen wird. +
  +
Ergebnis: Die Funktion liefert im Fehlerfall den Wert 0 zurück. Ein +positiver Wert kennzeichnet das Unterprogramm, das per +Dsp_RunSubroutine aufgerufen werden kann. +
  +
Verfügbar: Die Funktion ist nur auf Computern mit dem Signalprozessor +DSP56001 verfügbar. +
  +
Gruppe: DSP-Programmierung +
  +
Querverweis: Binding   Dsp_RunSubroutine   Dsp_FlushSubroutines   +Dsp_InqSubrAbility +
  + +
+ +

4.11.21.1 Bindings für Dsp_LoadSubroutine

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Dsp_LoadSubroutine( int8_t *codeptr, int32_t codesize, +int16_t ability ); +
  +
Assembler: +
  +
move.w    ability,-(sp)   ; Offset 10
+move.l    codesize,-(sp)  ; Offset  6
+pea       codeptr         ; Offset  2
+move.w    #116,-(sp)      ; Offset  0
+trap      #14             ; XBIOS aufrufen
+lea       $C(sp),sp       ; Stack korrigieren
+
+ +
+ +

4.11.22 Dsp_Lock

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_Lock« - Verfügbarkeit des DSP ermitteln +
  +
Xbiosnummer: 104 +
  +
Deklaration: int16_t Dsp_Lock( void ); +
  +
Beschreibung: Die Funktion Dsp_Lock ermittelt, ob der DSP für Anwendungen +verfügbar ist und nicht durch jemand anders blockiert wird. +
  +
Ergebnis: Die Funktion liefert den Wert -1, wenn der DSP bereits durch +einen anderen Prozess benutzt wird. Ein Rückgabewert von Null +kennzeichnet hingegen die Verfügbarkeit des DSP und blockiert diesen +gleichzeitig für andere, bis ein Aufruf von Dsp_Unlock erfolgt. +
  +
Verfügbar: Die Funktion ist nur auf Computern mit dem Signalprozessor +DSP56001 verfügbar. +
  +
Gruppe: DSP-Programmierung +
  +
Querverweis: Binding   Dsp_Unlock   Dsp_Available   Dsp_Reserve   +Dsp_LoadProg   Dsp_ExecProg   Dsp_ExecBoot +
  + +
+ +

4.11.22.1 Bindings für Dsp_Lock

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Dsp_Lock( void ); +
  +
Assembler: +
  +
move.w    #104,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

4.11.23 Dsp_LodToBinary

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_LodToBinary« - Konvertierung einer Datei vom LOD in das +Binärformat +
  +
Xbiosnummer: 111 +
  +
Deklaration: int32_t Dsp_LodToBinary( int8_t *file, int8_t *codeptr ); +
  +
Beschreibung: Die Funktion Dsp_LodToBinary konvertiert den Inhalt der +.LOD-Datei mit dem Namen file ins Binärformat. Das so +erzeugte DSP-Programm wird an der Adresse codeptr abgelegt. Dieser +Speicherbereich muß ausreichend groß dimensioniert sein. Danach kann +das Programm mit Dsp_ExecProg oder Dsp_ExecBoot ausgeführt werden. +
  +
Ergebnis: Die Funktion liefert im positiven Fall die Länge des Programms +in DSP-Worten, oder im Fehlerfall einen negativen Wert zurück. +
  +
Verfügbar: Die Funktion ist nur auf Computern mit dem Signalprozessor +DSP56001 verfügbar. +
  +
Gruppe: DSP-Programmierung +
  +
Querverweis: Binding   Dsp_Lock   Dsp_Unlock   Dsp_Available   Dsp_Reserve   +Dsp_LoadProg   Dsp_ExecBoot   Dsp_ExecProg +
  + +
+ +

4.11.23.1 Bindings für Dsp_LodToBinary

+ + + + + + +
C: #include <tos.h> +
  +
int32_t Dsp_LodToBinary( int8_t *file, int8_t *codeptr ); +
  +
Assembler: +
  +
pea       codeptr      ; Offset 6
+pea       file         ; Offset 2
+move.w    #111,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+lea       $A(sp),sp    ; Stack korrigieren
+
+ +
+ +

4.11.24 Dsp_MultBlocks

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_MultBlocks« - Datentransfer vom und zum DSP +
  +
Xbiosnummer: 127 +
  +
Deklaration: void Dsp_MultBlocks( int32_t numsend, int32_t numreceive, +DSPBLOCK *sendblocks, DSPBLOCK *receiveblocks ); +
  +
Beschreibung: Die Funktion Dsp_MultBlocks sendet und empfängt Daten vom DSP. +numsend ist die Anzahl der zu sendenden und numreceive +die Anzahl der zu empfangenden Blöcke. sendblocks und +receiveblocks sind Zeiger auf Strukturen, die die Puffer und +Blöcke beschreiben. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Verfügbar: Die Funktion ist nur auf Computern mit dem Signalprozessor +DSP56001 verfügbar. +
  +
Gruppe: DSP-Programmierung +
  +
Querverweis: Binding   Dsp_DoBlock   Dsp_BlkUnpacked   Dsp_BlkHandShake   +Dsp_BlkWords   Dsp_InStream   Dsp_OutStream   Dsp_IOStream   +Dsp_GetWordSize   Dsp_BlkBytes +
  + +
+ +

4.11.24.1 Bindings für Dsp_MultBlocks

+ + + + + + +
C: #include <tos.h> +
  +
void Dsp_MultBlocks( int32_t numsend, int32_t numreceive, +DSPBLOCK *sendblocks, DSPBLOCK *receiveblocks ); +
  +
Assembler: +
  +
pea       receiveblocks     ; Offset 14
+pea       sendblocks        ; Offset 10
+move.l    numreceive,-(sp)  ; Offset  6
+move.l    numsend,-(sp)     ; Offset  2
+move.w    #127,-(sp)        ; Offset  0
+trap      #14               ; XBIOS aufrufen
+lea       $12(sp),sp        ; Stack korrigieren
+
+ +
+ +

4.11.25 Dsp_OutStream

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_OutStream« - Datentransfer vom DSP via Interrupt +
  +
Xbiosnummer: 100 +
  +
Deklaration: void Dsp_OutStream( int8_t *data_out, int32_t block_size, +int32_t num_blocks, int32_t *blocks_done ); +
  +
Beschreibung: Die Funktion kopiert mittels DSP-Interruptbehandlung +num_blocks Datenblöcke mit einer Größe von +block_size DSP-Worten vom DSP in dem Puffer data_out. +Bei jedem Interrupt wird ein Block übertragen. Gleichzeitig wird der +Zähler blocks_done, der die Anzahl der übertragenen Blöcke +wiedergibt, inkrementiert. Da die Daten per Interrupt übertragen +werden, muß die Funktion nicht warten. Über blocks_done kann +das Programm im weiteren Verlauf feststellen, ob die Übertragung +beendet ist. +
  +
Hinweis: Die Funktion ist nur auf Computern mit dem +Signalprozessor DSP56001 verfügbar. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Verfügbar: Die Funktion ist nur auf Computern mit dem Signalprozessor +DSP56001 verfügbar. +
  +
Gruppe: DSP-Programmierung +
  +
Querverweis: Binding   Dsp_DoBlock   Dsp_BlkUnpacked   Dsp_BlkHandShake   +Dsp_BlkWords   Dsp_BlkBytes   Dsp_InStream   Dsp_IOStream   +Dsp_GetWordSize   Dsp_SetVectors   Dsp_RemoveInterrupts   +Dsp_MultBlocks +
  + +
+ +

4.11.25.1 Bindings für Dsp_OutStream

+ + + + + + +
C: #include <tos.h> +
  +
void Dsp_OutStream( int8_t *data_out, int32_t block_size, +int32_t num_blocks, int32_t *blocks_done ); +
  +
Assembler: +
  +
pea       blocks_done       ; Offset 14
+move.l    num_blocks,-(sp)  ; Offset 10
+move.l    block_size,-(sp)  ; Offset  6
+pea       data_out          ; Offset  2
+move.w    #100,-(sp)        ; Offset  0
+trap      #14               ; XBIOS aufrufen
+lea       $12(sp),sp        ; Stack korrigieren
+
+ +
+ +

4.11.26 Dsp_RemoveInterrupts

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_RemoveInterrupts« - Generierung von DSP Interrupts +unterbinden +
  +
Xbiosnummer: 102 +
  +
Deklaration: void Dsp_RemoveInterrupts( int16_t mask ); +
  +
Beschreibung: Die Funktion Dsp_RemoveInterrupts unterbindet die Generierung +von DSP-Interrupts. Der Parameter mask bestimmt, welche +Interrupts betroffen sind: +
  + + + + + + + + + + + + +
mask Bedeutung +
  +
1 Keine Interrupts zum Senden von Daten durch den DSP +
  +
2 Keine Interrupts zum Empfangen von Daten durch den DSP +
  +
3 Keine Interrupts zum Senden oder Empfangen von Daten durch den +DSP +
  + +
+ +
Die Funktion entfernt ebenfalls Routinen, die mit Dsp_SetVectors +installiert wurden. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Verfügbar: Die Funktion ist nur auf Computern mit dem Signalprozessor +DSP56001 verfügbar. +
  +
Gruppe: DSP-Programmierung +
  +
Querverweis: Binding   Dsp_InStream   Dsp_OutStream   Dsp_IOStream   +Dsp_SetVectors +
  + +
+ +

4.11.26.1 Bindings für Dsp_RemoveInterrupts

+ + + + + + +
C: #include <tos.h> +
  +
void Dsp_RemoveInterrupts( int16_t mask ); +
  +
Assembler: +
  +
move.w    mask,-(sp)   ; Offset 2
+move.w    #102,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.11.27 Dsp_RequestUniqueAbility

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_RequestUniqueAbility« - Identifikation für Prozess +erzeugen +
  +
Xbiosnummer: 113 +
  +
Deklaration: int16_t Dsp_RequestUniqueAbility( void ); +
  +
Beschreibung: Die Funktion Dsp_RequestUniqueAbility erteilt einem DSP-Prozeß +eine für die gesamte Systemlaufzeit eindeutige Identifikation, +mittels derer man feststellen kann, ob der zum Prozeß gehörige Code +resident im DSP vorhanden ist. +
  +
Ergebnis: Die Funktion liefert die für den Prozess erzeugte Kennung +zurück. +
  +
Verfügbar: Die Funktion ist nur auf Computern mit dem Signalprozessor +DSP56001 verfügbar. +
  +
Gruppe: DSP-Programmierung +
  +
Querverweis: Binding   Dsp_GetProgAbility +
  + +
+ +

4.11.27.1 Bindings für Dsp_RequestUniqueAbility

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Dsp_RequestUniqueAbility( void ); +
  +
Assembler: +
  +
move.w    #113,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

4.11.28 Dsp_Reserve

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_Reserve« - Speicher reservieren +
  +
Xbiosnummer: 107 +
  +
Deklaration: int16_t Dsp_Reserve( int32_t xreserve, int32_t yreserve ); +
  +
Beschreibung: Die Funktion Dsp_Reserve reserviert xreserve Worte +X-Speicher und yreserve Worte Y-Speicher. Die +Speicheranforderung darf den verfügbaren Speicher auf keinen Fall +übertreffen. Diese Funktion ist notwendig, damit DSP-Prozesse nicht +durch DSP-Unterprogramme überschrieben werden. Die Reservierung +bleibt bis zum nächsten Aufruf von Dsp_Reserve bestehen. +
  +
Ergebnis: Die Funktion liefert im positiven Fall den Wert 0, und im +Fehlerfall den Wert -1 zurück. +
  +
Verfügbar: Die Funktion ist nur auf Computern mit dem Signalprozessor +DSP56001 verfügbar. +
  +
Gruppe: DSP-Programmierung +
  +
Querverweis: Binding   Dsp_Lock   Dsp_Unlock   Dsp_Available   Dsp_LoadProg   +Dsp_ExecProg   Dsp_ExecBoot +
  + +
+ +

4.11.28.1 Bindings für Dsp_Reserve

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Dsp_Reserve( int32_t xreserve, int32_t yreserve ); +
  +
Assembler: +
  +
move.l    yreserve,-(sp)  ; Offset 6
+move.l    xreserve,-(sp)  ; Offset 2
+move.w    #107,-(sp)      ; Offset 0
+trap      #14             ; XBIOS aufrufen
+lea       $A(sp),sp       ; Stack korrigieren
+
+ +
+ +

4.11.29 Dsp_RunSubroutine

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »DspRunSubroutine« - Unterprogramm ausführen +
  +
Xbiosnummer: 118 +
  +
Deklaration: int16_t Dsp_RunSubroutine( int16_t handle ); +
  +
Beschreibung: Die Funktion Dsp_RunSubroutine führt das Unterprogramm mit der +Kennung handle aus. Die Kennung für ein Unterprogramm findet +man mittels Dsp_InqSubrAbility oder Dsp_LoadSubroutine heraus. +
  +
Ergebnis: Die Funktion liefert im positiven Fall den Wert 0, und im +Fehlerfall eine negative Zahl zurück. +
  +
Verfügbar: Die Funktion ist nur auf Computern mit dem Signalprozessor +DSP56001 verfügbar. +
  +
Gruppe: DSP-Programmierung +
  +
Querverweis: Binding   Dsp_InqSubrAbility   Dsp_FlushSubroutines   +Dsp_LoadSubroutine +
  + +
+ +

4.11.29.1 Bindings für Dsp_RunSubroutine

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Dsp_RunSubroutine( int16_t handle ); +
  +
Assembler: +
  +
move.w    handle,-(sp)  ; Offset 2
+move.w    #118,-(sp)    ; Offset 0
+trap      #14           ; XBIOS aufrufen
+addq.l    #4,sp         ; Stack korrigieren
+
+ +
+ +

4.11.30 Dsp_SetVectors

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_SetVectors« - Installation einer eigenen +Übertragungsroutine +
  +
Xbiosnummer: 126 +
  +
Deklaration: void Dsp_SetVectors( void (*receiver)(), int32_t +(*transmitter)() ); +
  +
Beschreibung: Die Funktion Dsp_SetVectors installiert Routinen, die +aufgerufen werden, wenn der DSP über einen Interrupt Daten +übertragen will. receiver ist ein Zeiger auf eine Routine, +die aufgerufen wird, nachdem der DSP Daten verschickt hat, und +transmitter ein Zeiger auf eine Routine, die aufgerufen wird, +bevor der DSP Daten empfängt. Die Empfangsroutine receiver +erhält als Parameter auf dem Stack einen LONG, der vom DSP gesendet +wurde. Die Senderoutine transmitter übergibt einen LONG an +den DSP in Register D0. Dieser muß ungleich Null sein, damit er, d.h. +dessen niederwertigen drei Bytes an den DSP übertragen wird. Beide +Routinen werden mit dem Assemblerbefehl RTS abgeschlossen. +
  +
Wird für receiver oder transmitter 0 übergeben, so +wird der entsprechende Interrupt gesperrt. Um eine Routine wieder zu +entfernen, muß man Dsp_RemoveInterrupts aufrufen. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Verfügbar: Die Funktion ist nur auf Computern mit dem Signalprozessor +DSP56001 verfügbar. +
  +
Gruppe: DSP-Programmierung +
  +
Querverweis: Binding   Dsp_InStream   Dsp_OutStream   Dsp_IOStream   +Dsp_RemoveInterrupts +
  + +
+ +

4.11.30.1 Bindings für Dsp_SetVectors

+ + + + + + +
C: #include <tos.h> +
  +
void Dsp_SetVectors( void (*receiver)(), int32_t +(*transmitter)() ); +
  +
Assembler: +
  +
pea       transmitter  ; Offset 6
+pea       receiver     ; Offset 2
+move.w    #126,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+lea       $A(sp),sp    ; Stack korrigieren
+
+ +
+ +

4.11.31 Dsp_TriggerHC

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_TriggerHC« - Host Kommando ausführen +
  +
Xbiosnummer: 112 +
  +
Deklaration: void Dsp_TriggerHC( int16_t vector ); +
  +
Beschreibung: Die Funktion Dsp_TriggerHC führt Vector vector aus. +Nur die zwei Vektoren $13 und $14 stehen DSP-Programmen zur freien +Verfügung. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Verfügbar: Die Funktion ist nur auf Computern mit dem Signalprozessor +DSP56001 verfügbar. +
  +
Gruppe: DSP-Programmierung +
  +
Querverweis: Binding +
  + +
+ +

4.11.31.1 Bindings für Dsp_TriggerHC

+ + + + + + +
C: #include <tos.h> +
  +
void Dsp_TriggerHC( int16_t vector ); +
  +
Assembler: +
  +
move.w    vector,-(sp)  ; Offset 2
+move.w    #112,-(sp)    ; Offset 0
+trap      #14           ; XBIOS aufrufen
+addq.l    #4,sp         ; Stack korrigieren
+
+ +
+ +

4.11.32 Dsp_Unlock

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_Unlock« - DSP für andere Prozesse freigeben +
  +
Xbiosnummer: 105 +
  +
Deklaration: void Dsp_Unlock( void ); +
  +
Beschreibung: Die Funktion Dsp_Unlock gibt den DSP für andere Prozesse frei. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis zurück. +
  +
Gruppe: DSP-Programmierung +
  +
Verfügbar: Die Funktion ist nur auf Computern mit dem Signalprozessor +DSP56001 verfügbar. +
  +
Querverweis: Binding   Dsp_Lock   Dsp_Available   Dsp_Reserve   Dsp_LoadProgDsp_ExecProg   Dsp_ExecBoot +
  + +
+ +

4.11.32.1 Bindings für Dsp_Unlock

+ + + + + + +
C: #include <tos.h> +
  +
void Dsp_Unlock( void ); +
  +
Assembler: +
  +
move.w    #105,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +
+ +Home +XBIOSXBIOS +DruckerfunktionenDruckerfunktionen +Hatari-DHS-XBIOS-ErweiterungHatari-DHS-XBIOS-Erweiterung + + diff --git a/de/xbios_errors.html b/de/xbios_errors.html new file mode 100644 index 000000000..977bb2ead --- /dev/null +++ b/de/xbios_errors.html @@ -0,0 +1,36 @@ + + + + + +Die Anleitung zum TOS: XBIOS Fehlermeldungen + + + + + + + + + +Home +XBIOSXBIOS +MetaDOSMetaDOS +xbios-Trapxbios-Trap + +
+ +

4.3 XBIOS Fehlermeldungen

+

Fehler werden von XBIOS (wie BIOS) als negative Werte +gemeldet. Die Fehlermeldungen sind in BIOS Fehlermeldungen +aufgelistet. +

+
+ +Home +XBIOSXBIOS +MetaDOSMetaDOS +xbios-Trapxbios-Trap + + diff --git a/de/xbios_functions.html b/de/xbios_functions.html new file mode 100644 index 000000000..500240576 --- /dev/null +++ b/de/xbios_functions.html @@ -0,0 +1,1966 @@ + + + + + +Die Anleitung zum TOS: XBIOS-Funktionsliste + + + + + + + + + +Home +XBIOSXBIOS +VIDIX-XBIOS-ErweiterungVIDIX-XBIOS-Erweiterung +XBIOS StrukturenXBIOS Strukturen + +
+ +

4.23 XBIOS-Funktionsliste

+

Die folgende Liste ist eine Übersicht der XBIOS-Routinen, +geordnet nach Funktionsnummern: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
dezhexFunktionsnameTOSSonstiges
   00x00Initmouse1.00
   10x01Ssbrk1.00
   20x02Physbase1.00
   30x03Logbase1.00
   40x04Getrez1.00
   50x05Setscreen1.00
   50x05VsetScreen4.00
   60x06Setpalette1.00
   70x07Setcolor1.00
   80x08FloprdTOS
   90x09Flopwr1.00
  100x0AFlopfmt1.00
110x0BDbmsg Atari Debugger
  120x0CMidiws1.00
  130x0DMfpint1.00
  140x0EIorec1.00
  150x0FRsconf1.00
  160x10Keytbl1.00
  170x11Random1.00
  180x12Protobt1.00
  190x13Flopver1.00
  200x14Scrdmp1.00
  210x15Cursconf1.00
  220x16Settime1.00
  230x17Gettime1.00
  240x18Bioskeys1.00
  250x19Ikbdws1.00
  260x1AJdisint1.00
  270x1BJenabint1.00
  280x1CGiaccess1.00
  290x1DOffgibit1.00
  300x1EOngibit1.00
  310x1FXbtimer1.00
  320x20Dosound1.00
  330x21Setprt1.00
  340x22Kbdvbase1.00
  350x23Kbrate1.00
  360x24Prtblk1.00
  370x25Vsync1.00
  380x26Supexec1.00
  390x27Puntaes1.00
  410x29Floprate1.04
  420x2ADMAread3.00
  430x2BDMAwrite3.00
  430x2BJanus Janus
  440x2CBconmap2.00
  460x2ENVMaccess3.00
470x2FWaketime2.06, ST-Book
  480x30Metainit MetaDOS
  490x31Metaopen MetaDOS
  500x32Metaclose MetaDOS
  510x33Metaread MetaDOS
  520x34Metawrite MetaDOS
530x35Metaseek MetaDOS
  540x36Metastatus MetaDOS
  550x37Metaioctl MetaDOS
560x38   MetaDOS
570x39   MetaDOS
580x3A   MetaDOS
  590x3BMetastartaudio MetaDOS
  600x3CMetastopaudio MetaDOS
  610x3DMetasetsongtime MetaDOS
  620x3EMetagettoc MetaDOS
  630x3FMetadiscinfo MetaDOS
  640x40Blitmode1.02
650x41Vread CENTScreen
660x42Vwrite CENTScreen
670x43Vattrib CENTScreen
680x44Vcreate CENTScreen
690x45Vdelete CENTScreen
700x46Vfirst CENTScreen
710x47Vnext CENTScreen
720x48Vvalid CENTScreen
730x49Vload CENTScreen
740x4AVsave CENTScreen
750x4BVopen CENTScreen
760x4CVclose CENTScreen
770x4DVscroll CENTScreen
780x4EVoffset CENTScreen
790x4FVseek CENTScreen
  800x50EsetShiftTOS
800x50Vlock CENTScreen
  810x51EgetShiftTOS
810x51SetMon CENTScreen
  820x52EsetBankTOS
820x52MultiMon CENTScreen
  830x53EsetColorTOS
830x53SizeComp CENTScreen
  840x54EsetPaletteTOS
840x54Vsize CENTScreen
840x54Oscanis OverScan (alt; neu 0x1068)
  850x55EgetPaletteTOS
850x55Oscantab OverScan (alt; neu 0x1069)
  860x56EsetGrayTOS
860x56Oscanphy OverScan (alt; neu 0x106A)
  870x57EsetSmearTOS
870x57Oscanscr OverScan (alt; neu 0x106B)
  880x58VsetModeFalcon-TOS
880x58Oscanvb OverScan (old; new 0x106C)
  890x59mon_type / VgetMonitorFalcon-TOS
890x59Oscanpatch OverScan (alt; neu 0x106D)
  900x5AVsetSyncFalcon-TOS
900x5AOscanswitch OverScan (alt; neu 0x106E)
  910x5BVgetSizeFalcon-TOS
  920x5CVsetVarsFalcon-TOS
  930x5DVsetRGBFalcon-TOS
  940x5EVgetRGBFalcon-TOS
950x5FValidMode / VcheckModeFalcon-TOS, MilanTOS
  960x60Dsp_DoBlockFalcon-TOS
  970x61Dsp_BlkHandShakeFalcon-TOS
  980x62Dsp_BlkUnpackedFalcon-TOS
  990x63Dsp_InStreamFalcon-TOS
1000x64Init_Screen xVT52; ST-Computer 1988-04
 1000x64Dsp_OutStreamFalcon-TOS
 1010x65Dsp_IOStreamFalcon-TOS
 1020x66Dsp_RemoveInterruptsFalcon-TOS
 1030x67Dsp_GetWordSizeFalcon-TOS
 1040x68Dsp_LockFalcon-TOS
 1050x69Dsp_UnlockFalcon-TOS
 1060x6ADsp_AvailableFalcon-TOS
 1070x6BDsp_ReserveFalcon-TOS
 1080x6CDsp_LoadProgFalcon-TOS
 1090x6DDsp_ExecProgFalcon-TOS
 1100x6EDsp_ExecBootFalcon-TOS
 1110x6FDsp_LodToBinaryFalcon-TOS
 1120x70Dsp_TriggerHCFalcon-TOS
 1130x71Dsp_RequestUniqueAbilityFalcon-TOS
 1140x72Dsp_GetProgAbilityFalcon-TOS
 1150x73Dsp_FlushSubroutinesFalcon-TOS
 1160x74Dsp_LoadSubroutineFalcon-TOS
 1170x75Dsp_InqSubrAbilityFalcon-TOS
 1180x76Dsp_RunSubroutineFalcon-TOS
 1190x77Dsp_Hf0Falcon-TOS
 1200x78Dsp_Hf1Falcon-TOS
 1210x79Dsp_Hf2Falcon-TOS
 1220x7ADsp_Hf3Falcon-TOS
 1230x7BDsp_BlkWordsFalcon-TOS
 1240x7CDsp_BlkBytesFalcon-TOS
 1250x7DDsp_HStatFalcon-TOS
 1260x7EDsp_SetVectorsFalcon-TOS
 1270x7FDsp_MultBlocksFalcon-TOS
 1280x80locksndFalcon-TOS
 1290x81unlocksndFalcon-TOS
 1300x82soundcmdFalcon-TOS
 1300x82NSoundcmdMilanBlaster
 1310x83setbufferFalcon-TOS
 1320x84setmodeFalcon-TOS
 1330x85settracksFalcon-TOS
 1340x86setmontracksFalcon-TOS
 1350x87setinterruptFalcon-TOS
 1360x88buffoperFalcon-TOS
 1370x89dsptristateFalcon-TOS
 1380x8AgpioFalcon-TOS
 1390x8BdevconnectFalcon-TOS
 1400x8CsndstatusFalcon-TOS
 1410x8DbuffptrFalcon-TOS
 1500x96VsetMaskTOS
 1590xBFVideoCtrlMilan
 1600xA0CacheCtrlMilan
 1610xA1WdgCtrlMilan
 1620xA2ExtRsConfMilan
 1650xA5WavePlaySAM
 1940xC2GetScreenDescriptor Crazy-Dots
 1950xC3ResetScreen Crazy-Dots
 1960xC4GetNumberofPModes Crazy-Dots
 1970xC5GetPMode Crazy-Dots
 1980xC6ReadMode Crazy-Dots
 1990xC7CopyModeToActiveMode Crazy-Dots
 2000xC8ActiveModeNumber Crazy-Dots
 2010xC9GetActiveModeDesc Crazy-Dots
 2020xCAGetRegisterbase Crazy-Dots
 2030xCBGetFeatures Crazy-Dots
 2040xCCGetActiveFeatures Crazy-Dots
 2490xF9CPUFreqnur in Hatari DHS Version
 2500xFARegistersnur in Hatari DHS Version
 2510xFBDebugUInur in Hatari DHS Version
 2520xFCCounterReadnur in Hatari DHS Version
 2530xFDCounterStartnur in Hatari DHS Version
 2540xFEDebugnur in Hatari DHS Version
 2550xFFHatariOptionnur in Hatari DHS Version
 2990x12BInstall PCI Bios ct60
 3000x12Cfind_pci_devicePCI-BIOS V2.00
 3010x12Dfind_pci_classcodePCI-BIOS V2.00
 3020x12Eread_config_bytePCI-BIOS
 3030x12Fread_config_wordPCI-BIOS
 3040x130read_config_longwordPCI-BIOS
 3050x131fast_read_config_bytePCI-BIOS
 3060x132fast_read_config_wordPCI-BIOS
 3070x133fast_read_config_longwordPCI-BIOS
 3080x134write_config_bytePCI-BIOS
 3090x135write_config_wordPCI-BIOS
 3100x136write_config_longwordPCI-BIOS
 3110x137hook_interruptPCI-BIOS
 3120x138unhook_interruptPCI-BIOS
 3130x139special_cyclePCI-BIOS
 3140x13Aget_routingPCI-BIOS
 3150x13Bset_interruptPCI-BIOS
 3160x13Cget_resourcePCI-BIOS
 3170x13Dget_card_usedPCI-BIOS
 3180x13Eset_card_usedPCI-BIOS
 3190x13Fread_mem_bytePCI-BIOS
 3200x140read_mem_wordPCI-BIOS
 3210x141read_mem_longwordPCI-BIOS
 3220x142fast_read_mem_bytePCI-BIOS
 3230x143fast_read_mem_wordPCI-BIOS
 3240x144fast_read_mem_longwordPCI-BIOS
 3250x145write_mem_bytePCI-BIOS
 3260x146write_mem_wordPCI-BIOS
 3270x147write_mem_longwordPCI-BIOS
 3280x148read_io_bytePCI-BIOS
 3290x149read_io_wordPCI-BIOS
 3300x14Aread_io_longwordPCI-BIOS
 3310x14Bfast_read_io_bytePCI-BIOS
 3320x14Cfast_read_io_wordPCI-BIOS
 3330x14Dfast_read_io_longwordPCI-BIOS
 3340x14Ewrite_io_bytePCI-BIOS
 3350x14Fwrite_io_wordPCI-BIOS
 3360x150write_io_longwordPCI-BIOS
 3370x151get_machine_idPCI-BIOS
 3380x152get_pagesizePCI-BIOS
 3390x153virt_to_busPCI-BIOS
 3400x154bus_to_virtPCI-BIOS
 3410x155virt_to_physPCI-BIOS
 3420x156phys_to_virtPCI-BIOS
 3500x15EDma_setbuffer ct60
 3510x15FDma_buffoper ct60
 3520x160Read_mailbox ct60
 3530x161Write_mailbox ct60
 4000x190vdxGetVersion ct60
 4010x191vdxProbe ct60
 4020x192vdxInit ct60
 4030x193vdxDestroy ct60
 4040x194vdxGetCapability ct60
 4050x195vdxQueryFourcc ct60
 4060x196vdxConfigPlayback ct60
 4070x197vdxPlaybackOn ct60
 4080x198vdxPlaybackOff ct60
 4090x199vdxPlaybackFrameSelect ct60
 4100x19AvdxGetGrKeys ct60
 4110x19BvdxSetGrKeys ct60
 4120x19CvdxPlaybackGetEq ct60
 4130x19DvdxPlaybackSetEq ct60
 4140x19EvdxPlaybackGetDeint ct60
 4150x19FvdxPlaybackSetDeint ct60
 4160x1A0vdxPlaybackCopyFrame ct60
 4170x1A1vdxQueryDMAStatus ct60
 4200x1A4InitVideo ct60
 5000x1F4StarTrack SWE
 5550x22BTrapper Trapper
31780x0c6as. ct60_read_core_temperature ct60
31790x0c6bs. ct60_rw_parameter ct60
31800x0c6cs. ct60_cache ct60
31810x0c6ds. ct60_flush_cache ct60
31820x0c6es. ct60_vmalloc ct60
42000x1068Oscanis OverScan
42010x1069Oscantab OverScan
42020x106AOscanphy OverScan
42030x106BOscanscr OverScan
42040x106COscanvb OverScan
42050x106DOscanpatch OverScan
42060x106EOscanswitch OverScan
172260x434ACJar Cookie Jar Manager
310000x7918CHECKinst MATRIX MatGraph - TCxx
310010x7919GETscreen MATRIX MatGraph - TCxx
310020x791AGETboard MATRIX MatGraph - TCxx
320000x7D00xbios(32000) MATRIX MatScreen - Cxx
320010x7D01xbios(32001) MATRIX MatScreen - Cxx
320020x7D02xbios(32002) MATRIX MatScreen - Cxx
506980xC60Act60_read_core_temperature ct60
506990xC60Bct60_rw_parameter ct60
507000xC60Cct60_cache ct60
507010xC60Dct60_flush_cache ct60
507020xC60Ect60_vmalloc ct60
 0x53435349SCSIBios SCSIBios
+
+ +

Querverweis: XBIOS   GEMDOS-Funktionsliste   BIOS-Funktionsliste +

+
+ +Home +XBIOSXBIOS +VIDIX-XBIOS-ErweiterungVIDIX-XBIOS-Erweiterung +XBIOS StrukturenXBIOS Strukturen + + diff --git a/de/xbios_interface.html b/de/xbios_interface.html new file mode 100644 index 000000000..a8e21e8f2 --- /dev/null +++ b/de/xbios_interface.html @@ -0,0 +1,1674 @@ + + + + + +Die Anleitung zum TOS: Schnittstellenprogrammierung + + + + + + + + + +Home +XBIOSXBIOS +PCI-BIOSPCI-BIOS +SoundroutinenSoundroutinen + +
+ +

4.18 Schnittstellenprogrammierung

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Bconmap Auswählen einer seriellen Schnittstelle. +
Dosound Soundgenerator programmieren. +
ExtRsConf Konfiguration der RS232/RS485-Schnittstelle +
Giaccess Register des GI-Soundchips lesen und schreiben. +
Ikbdws Programmierung des Tastatur-Chips. +
Iorec Interruptpuffer für RS232, Tastatur-Chip und +MIDI-Schnittstelle abfragen. +
Kbdvbase Puffer und Interruptvektoren für Maus-, MIDI- und +Tastaturschnittstelle abfragen. +
Mfpint Programmierung des Multifunktionsperipherie-Chips. +
Midiws Strings lesen und schreiben auf MIDI-Schnittstelle. +
Offgibit Bit im Port A-Register des GI-Chips löschen. +
Ongibit Bit im Port A-Register des GI-Chips setzen. +
Rsconf Konfiguration der RS232-Schnittstelle. + +
+ +

Querverweis: Interruptfunktionen +

+

4.18.1 Bconmap

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Select serial port« - wählt eine Default-Schnittstelle aus. +
  +
Xbiosnummer: 44 +
  +
Deklaration: int32_t Bconmap( int16_t devno ); +
  +
Beschreibung: Die XBIOS-Routine Bconmap wählt eine der seriellen +Schnittstellen für die Biosausgabe aus. Darüber hinaus kann ein +Zeiger auf die BCONMAP-Struktur abgefragt werden, über die man die +maximale BIOS Gerätenummer abfragen und außerdem neue +Gerätetreiber installieren kann. devno kann die folgenden +Werte annehmen: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
devnoBedeutung
-402device / RSVF-list remove (HSMODA)
-401Eintrag anhängen (HSMODA)
-400ausgewählten Eintrag überschreiben (HSMODA)
-2Zeiger auf BCONMAP-Struktur liefern
-1nur aktuellen Kanal abfragen
0Test, ob Bconmap vorhanden ist
6ST-kompatibler RS232-Port (U:\dev\modem1)
7SCC Kanal B (U:\dev\modem2)
8TTMFP RS232-Port (U:\dev\serial1)
9SCC Kanal A (U:\dev\serial2)
>10eigene Treiber
+
+ +
Die Funktion beeinflußt sowohl die BIOS-Vektortabelle in den +Systemvariablen, als auch das Verhalten der Funktionen Rsconf und Iorec. +
  +
Note: In TOS 4.04, und wenn kein TT-MFP vorhanden ist, +wird SCC Kanal A als Device #8 bereitgestellt. +
  +
HSMODA +
Diese Funktionen sind nur vorhanden falls das Paket HSMODA +installiert ist. +
  +
int32_t Bconmap((int16_t)-400, (int16_t)dev_nr, +(int32_t)ptr_to_6_longs) +
Die Konstante MAPT_OVE wird als -400 definiert. Diese Funktion +dient dem Überschreiben bereits existierender MAPTAB-Einträge. +dev_nr ist eine Gerätenummer ab 6 aufwärts, die in der +MAPTAB bereits existieren muß, andernfalls wird der Fehlercode -15 +EUNDEV zurückgegeben. ptr_to_6_longs zeigt auf eine Struktur, +die einem MAPTAB-Eintrag entspricht. Diese Struktur wird auf den +entsprechenden Platz in der MAPTAB kopiert. Ist das angesprochende +Gerät das aktuell per Bconmap für AUX eingestellte, so werden die +eben eingehängten Routinen auch nach xco* und in die aktuellen Rsconf +und Iorec-Zellen kopiert. Diese Funktion dient nur zum Einhängen +MagiC-freundlicher Routinen. Als Erfolgsmeldung wird die Gerätenummer +zurückgegeben, auf die der Eintrag erfolgte, also dev_nr. +
  +
Um Geräte auf den BIOS-Nummern zu installieren, die fest zu +einem Computer gehören, ist immer MAPT_OVE zu benutzen. Für den ST +betrifft das z.B. #6, beim MegaSTE #6 bis #8 und beim TT #6 bis #9. +
  +
int32_t Bconmap((int16_t)-401, (int32_t)ptr_to_6_longs) +
Die Konstante MAPT_APP wird als -401 definiert. Diese Funktion +dient dem Anfügen eines Kanals an die MAPTAB oder dem Beschreiben +eines leeren Kanals. ptr_to_6_longs zeigt auf eine Struktur, +die einem MAPTAB-Eintrag entspricht. Rückmeldung ist entweder die von +dieser Funktion für den Eintrag gewählte Kanalnummer, oder der +Fehlercode -12 EGENRL, falls kein Platz für eine +MAPTAB-Vergrößerung ist. Hier kann es nicht vorkommen, das die +Vektoren sofort nach xco* übertragen werden, da ein bisher nicht +vorhandener oder belegter Kanal nicht als AUX eingestellt sein kann. +
  +
MAPT_APP sucht sich den ersten freien Kanal hinter den fest zum +Computer gehörenden BIOS-Nummern und kann deshalb nur zum +Installieren zusätzlicher Geräte benutzt werden. +
  +
int32_t Bconmap((int16_t)-402, (int16_t)dev_nr, +(int32_t)ptr_to_listentry) +
Die Konstante MAPT_DEL wird als -402 definiert. Diese Funktion +dient zum Löschen eines Gerätes aus der MAPTAB und zum Aushängen +einer RSVF-Liste aus der RSVF-Verkettung. +
  +
dev_nr ist entweder die BIOS-Kanalnummer des aus der +MAPTAB zu entfernenden Gerätes oder -1 für Nichtstun. Der +entsprechende MAPTAB-Eintrag wird freigeben indem spezielle +Dummy-Routinenzeiger eingetragen werden, die auf den Assemblerbefehl +RTS zeigen. Der Iorec-Zeiger-Eintrag wird auf 0 gesetzt. Ist der +gelöschte Kanal auch als BIOS-AUX-Device eingestellt gewesen, so wird +BIOS-AUX auf Nummer 6 umgestellt, auch wenn gerade Nummer 6 gelöscht +wurde. +
  +
ptr_to_listentry ist entweder der Zeiger auf die auszuhängende +RSVF-Liste oder 0 für Nichtstun. Der Zeiger muß auf den Anfang einer +Liste verweisen, die daraufhin komplett entfernt wird, auch wenn sie +mehr als ein Schnittstellenobjekt und End- oder Verkettungsobjekt +enthält. +
  +
Im Erfolgsfall gibt MAPT_DEL 1 zurück, im Fehlerfall -1. +
  +
Ergebnis: Bconmap liefert die alte Einstellung. Falls devno gleich +-2 ist liefert die Funktion einen Zeiger auf BCONMAP zurück. +
  +
Verfügbar: Laut Atari sollte man seine TOS-Version folgendermaßen auf das +Vorhandensein von Bconmap testen: +
  +
WORD has_bconmap ( VOID )
+{
+   return (0L == Bconmap (0));
+}
+
+
Gruppe: Schnittstellenprogrammierung +
  +
Querverweis: Binding   Bconout   Bconin   Bcostat   Bconstat   Iorec   Rsconf +
  + +
+ +

4.18.1.1 Bindings für Bconmap

+ + + + + + +
C: #include <tos.h> +
  +
int32_t Bconmap( int16_t devno ); +
  +
Assembler: +
  +
move.w    devno,-(sp)  ; Offset 2
+move.w    #44,-(sp)    ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.18.2 Dosound

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dosound« - programmiert den Sound-Generator. +
  +
Xbiosnummer: 32 +
  +
Deklaration: void *Dosound( const int8_t *buf ); +
  +
Beschreibung: Die XBIOS-Routine Dosound startet einen Prozeß zur Steuerung +des Soundgenerators. Der Puffer buf enthält Befehle für die +Programmierung des Sound-Generators. Die folgenden Befehle werden +unterstützt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Befehl Bedeutung +
    +
0x0x byte Byte in Register x des Soundchips schreiben +
0x80 byte Bytes in temporäres Register laden +
0x81 byte1 Nummer des Soundregisters, in das der Wert des temporären +Registers übertragen werden soll. +
     byte2 wird zum temporären Register addiert. +
     byte3 Wert des temporären Registers, bei dem die Schleife +abgebrochen wird. +
0x82 byte Anzahl der Jiffies (20 ms), die bis zum nächsten Kommando +vergehen sollen. Enhält byte den Wert 0, so wird vollständig +abgebrochen. +
...   +
0xff byte   + +
+ +
Ergebnis: Die Funktion liefert den momentan abgespielten Sound-Puffer. +
  +
Verfügbar: Alle TOS Versionen. +
  +
Gruppe: Schnittstellenprogrammierung +
  +
Querverweis: Binding +
  + +
+ +

4.18.2.1 Bindings für Dosound

+ + + + + + +
C: #include <tos.h> +
  +
void Dosound( const int8_t *buf ); +
  +
Assembler: +
  +
pea       buf          ; Offset 2
+move.w    #32,-(sp)    ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+move.l    d0,a0
+
+ +
+ +

4.18.3 ExtRsConf

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »RS-232/RS485 configuration« - konfiguriert die +RS-232/RS485-Schnittstelle. +
  +
Xbiosnummer: 162 +
  +
Deklaration: int32_t Xbios( 162, int16_t command, int16_t device, int32_t +param ); +
  +
Beschreibung: Die XBIOS-Routine ExtRsConf konfiguriert die serielle +Schnittstelle +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
command0x0000 - return 0 to check that ExtRsConf
          is present
 0x0001 - set port driver mode:
          param = 0 -> RS232
          param = 1 -> RS422
          param = 2 -> RS485
  
deviceBIOS device (6 = MFP serial, ...)
  
params.o.
+
+ +
Hinweis: Die Funktion ist für die Hardware des Milans +2.1. Die Version gibt es allerdings nur als Spezialversion und ist +nicht frei verfügbar. +
  +
Ergebnis: E_OK (0) - OK +
EUNCMD (-3) - unknown command +
ERROR (-1) - general error +
EUNDEV (-15) - unknown device +
  +
Verfügbar: Die Funktion ist ab dem MilanTOS mit dem Datum 9.6.2002 +vorhanden. +
  +
Gruppe: Schnittstellenprogrammierung +
  +
Querverweis: Binding +
  + +
+ +

4.18.3.1 Bindings für ExtRsConf

+ + + + + + +
C: #include <tos.h> +
  +
int32_t Xbios( 162, int16_t command, int16_t device, int32_t +param ); +
  +
Assembler: +
  +
move.l    param,-(sp)     ; Offset  6
+move.w    device,-(sp)    ; Offset  4
+move.w    command,-(sp)   ; Offset  2
+move.w    #162,-(sp)      ; Offset  0
+trap      #14             ; XBIOS aufrufen
+lea       10(sp),sp       ; Stack korrigieren
+
+ +
+ +

4.18.4 Giaccess

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »access GI sound chip« - ermöglicht den Zugriff auf die +Register des GI-Sound-Chips. +
  +
Xbiosnummer: 28 +
  +
Deklaration: int8_t Giaccess( int16_t data, int16_t regno ); +
  +
Beschreibung: Die XBIOS-Routine Giaccess liest bzw. setzt Register im +GI-Soundchip. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
data wird beim Schreibzugriff in das durch regno angegebene +Register geschrieben. +
regno Nummer des gewünschten Registers (0..15). Beim Schreibzugriff +wird zusätzlich Bit-7 gesetzt. + +
+ +
Ergebnis: Die Funktion liefert als Ergebnis den Inhalt des angegebenen +Registers. +
  +
Verfügbar: Alle TOS Versionen. +
  +
Gruppe: Schnittstellenprogrammierung +
  +
Querverweis: Binding +
  + +
+ +

4.18.4.1 Bindings für Giaccess

+ + + + + + +
C: #include <tos.h> +
  +
int8_t Giaccess( int16_t data, int16_t regno ); +
  +
Assembler: +
  +
move.w    regno,-(sp)  ; Offset 4
+move.w    data,-(sp)   ; Offset 2
+move.w    #28,-(sp)    ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.18.5 Ikbdws

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »write string to keyboard« - programmiert den Tastatur-Chip. +
  +
Xbiosnummer: 25 +
  +
Deklaration: void Ikbdws( int16_t count, const int8_t *ptr ); +
  +
Beschreibung: Die XBIOS-Routine Ikbdws übergibt einen String an die +intelligente Tastatur. Es gilt: +
  +

+
+ + + + + + + + + + + + +
ParameterBedeutung
countAnzahl der auszugebenden Bytes - 1
ptrZeiger auf die Bytes im Speicher
+
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Alle TOS Versionen. +
  +
Gruppe: Schnittstellenprogrammierung +
  +
Querverweis: Binding +
  + +
+ +

4.18.5.1 Bindings für Ikbdws

+ + + + + + +
C: #include <tos.h> +
  +
void Ikbdws( int16_t count, const int8_t *ptr ); +
  +
Assembler: +
  +
pea       ptr          ; Offset 4
+move.w    count,-(sp)  ; Offset 2
+move.w    #25,-(sp)    ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #8,sp        ; Stack korrigieren
+
+ +
+ +

4.18.6 Iorec

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »input output record« - Adresse des Ein-/Ausgabepuffers +ermitteln. +
  +
Xbiosnummer: 14 +
  +
Deklaration: IOREC *Iorec( int16_t dev ); +
  +
Beschreibung: Die XBIOS-Routine Iorec liefert die Adresse des +Ein-/Ausgabe-Puffers eines seriellen Gerätes. Der Parameter +dev kann folgende Werte annehmen: +
  +

+
+ + + + + + + + + + + + + + + + +
devBedeutung
0RS-232
1Tastatur
2MIDI-Port
+
+ +
Ergebnis: Die Funktion liefert als Ergebnis einen Zeiger auf die Struktur +IOREC. +
  +
Verfügbar: Alle TOS Versionen. +
  +
Gruppe: Schnittstellenprogrammierung +
  +
Querverweis: Binding   Bconmap +
  + +
+ +

4.18.6.1 Bindings für Iorec

+ + + + + + +
C: #include <tos.h> +
  +
IOREC *Iorec( int16_t dev ); +
  +
Assembler: +
  +
move.w    dev,-(sp)    ; Offset 2
+move.w    #14,-(sp)    ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.18.7 Kbdvbase

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »keyboard vectors« - liefert einen Zeiger auf die +Tastatur-Interruptvektoren. +
  +
Xbiosnummer: 34 +
  +
Deklaration: KBDVBASE *Kbdvbase( void ); +
  +
Beschreibung: Die XBIOS-Routine Kbdvbase liefert einen Zeiger auf eine KBDVBASE +Struktur. +
  +
Hinweis: Bevor einer der in der Struktur angegebenen +Vektoren verändert wird, muß sichergestellt sein, daß nicht gerade +ein Paket verschickt wird (Komponente drvstat = 0). +Anschließend sollten alle Interrupts gesperrt, und dann getestet +werden ob wirklich kein Paket mehr unterwegs ist. +
  +
Ergebnis: Die Funktion liefert einen Zeiger auf eine KBDVBASE Struktur +zurück. +
  +
Verfügbar: Alle TOS Versionen. +
  +
Gruppe: Schnittstellenprogrammierung +
  +
Querverweis: Binding +
  + +
+ +

4.18.7.1 Bindings für Kbdvbase

+ + + + + + +
C: #include <tos.h> +
  +
KBDVBASE *Kbdvbase( void ); +
  +
Assembler: +
  +
move.w    #34,-(sp)    ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

4.18.8 Mfpint

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »init MFP interrupt« - Interrupt initialisieren. +
  +
Xbiosnummer: 13 +
  +
Deklaration: void Mfpint( int16_t number, int16_t (*vector)() ); +
  +
Beschreibung: Die XBIOS-Routine Mfpint initialisiert den +Multifunktions-Interrupt für die angeschlossenen Peripherie-Geräte. +Damit können Hardware-Interrupts abgefangen werden. Das Argument +vector gibt die Interrupt-Service-Routine an. Im Parameter +number wird die Nummer des Interrupt von 0 bis 15 angegeben: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
numberBeschreibung
0I/O-Port Bit 0 Busy par. Schnittstelle
1RS-232 DCD
2RS-232 CTS
3Blitter
4Timer D, RS232-232 Baud-Generator
5Timer C, 200-Hz System-Uhr
6Tastatur und MIDI
7FDC und DMA
8Timer B Zeilenrücklauf
9RS-232 Sendefehler
10RS-232 Sendepuffer leer
11RS-232 Empfangspuffer voll
12RS-232 Puffer voll
13Timer A
14RS-232 RI
15Monochrom-Monitor Detect
+
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Alle TOS Versionen. +
  +
Gruppe: Schnittstellenprogrammierung +
  +
Querverweis: Binding   Jdisint   Jenabint +
  + +
+ +

4.18.8.1 Bindings für Mfpint

+ + + + + + +
C: #include <tos.h> +
  +
void Mfpint( int16_t number, int16_t (*vector)() ); +
  +
Assembler: +
  +
pea       vector       ; Offset 4
+move.w    number,-(sp) ; Offset 2
+move.w    #13,-(sp)    ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #8,sp        ; Stack korrigieren
+
+ +
+ +

4.18.9 Midiws

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Midi write string« - gibt eine Zeichenfolge über die +Midi-Schnittstelle aus. +
  +
Xbiosnummer: 12 +
  +
Deklaration: void Midiws( int16_t cnt, void *ptr ); +
  +
Beschreibung: Die XBIOS-Routine Midiws gibt einen String über die +Midi-Schnittstelle aus. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
cnt Anzahl der auszugebenden Bytes - 1 +
ptr Zeiger auf Bytefolge + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Alle TOS Versionen. +
  +
Gruppe: Schnittstellenprogrammierung +
  +
Querverweis: Binding +
  + +
+ +

4.18.9.1 Bindings für Midiws

+ + + + + + +
C: #include <tos.h> +
  +
void Midiws( int16_t cnt, void *ptr ); +
  +
Assembler: +
  +
pea       ptr          ; Offset 4
+move.w    cnt,-(sp)    ; Offset 2
+move.w    #12,-(sp)    ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #8,sp        ; Stack korrigieren
+
+ +
+ +

4.18.10 Offgibit

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »GI bit off« - löscht ein Bit im Register A des Soundchips. +
  +
Xbiosnummer: 29 +
  +
Deklaration: void Offgibit( int16_t bitno ); +
  +
Beschreibung: Die XBIOS-Routine Offgibit löscht ein Bit im Register A des +Soundchips GI. bitno gibt den Wert an, mit dem das Register +verUNDet werden soll. Die Bits in diesem Register haben folgende +Bedeutung: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Bit Beschreibung +
    +
 0 Floppy Sideselect +
 1 Drive Select A +
 2 Drive Select B +
 3 RS-232 RTS +
 4 RS-232 DTR +
 5 Centronics Strobe +
 6 PIN 3 Monitor Buchse +
 7 unbenutzt +
ab TOS030 des TT jedoch Modem 4 (1) oder LAN (0) + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Alle TOS Versionen. +
  +
Gruppe: Schnittstellenprogrammierung +
  +
Querverweis: Binding   Ongibit +
  + +
+ +

4.18.10.1 Bindings für Offgibit

+ + + + + + +
C: #include <tos.h> +
  +
void Offgibit( int16_t bitno ); +
  +
Assembler: +
  +
move.w    bitno,-(sp)  ; Offset 2
+move.w    #29,-(sp)    ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.18.11 Ongibit

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »GI bit on« - setzt ein Bit im Register A des Soundchips. +
  +
Xbiosnummer: 30 +
  +
Deklaration: void Ongibit( int16_t bitno ); +
  +
Beschreibung: Die XBIOS-Routine Ongibit setzt ein Bit im Register A des +Soundchips GI. bitno gibt den Wert an, mit dem das Register +verODERt werden soll. Die Bits in diesem Register haben folgende +Bedeutung: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Bit Beschreibung +
    +
 0 Floppy Sideselect +
 1 Drive Select A +
 2 Drive Select B +
 3 RS-232 RTS +
 4 RS-232 DTR +
 5 Centronics Strobe +
 6 PIN 3 Monitor Buchse +
 7 unbenutzt +
ab TOS030 des TT jedoch Modem 4 (1) oder LAN (0) + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Alle TOS Versionen. +
  +
Gruppe: Schnittstellenprogrammierung +
  +
Querverweis: Binding   Offgibit +
  + +
+ +

4.18.11.1 Bindings für Ongibit

+ + + + + + +
C: #include <tos.h> +
  +
void Ongibit( int16_t bitno ); +
  +
Assembler: +
  +
move.w    bitno,-(sp)  ; Offset 2
+move.w    #30,-(sp)    ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.18.12 Rsconf

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »RS-232 configuration« - konfiguriert die +RS-232-Schnittstelle. +
  +
Xbiosnummer: 15 +
  +
Deklaration: int32_t Rsconf( int16_t baud, int16_t ctr, int16_t ucr, int16_t +rsr, int16_t tsr, int16_t scr ); +
  +
Beschreibung: Die XBIOS-Routine Rsconf konfiguriert die serielle +Schnittstelle. Da auf unterschiedlichen Rechnern unterschiedliche +Hardwarebausteine zum Einsatz kommen können, muß die Funktion +vorsichtig eingesetzt werden, d.h: +
  +
    +
  • aktuelle Einstellungen sollten mit Hilfe von Rsconf +(-1,-1,-1,-1,-1,-1) abgefragt werden +
  • +
  • nur die notwendigen Bits manipulieren +
  • +
  • anschließend die neuen Werte setzen +
  • +
+ +
Aufgrund der Möglichkeit unterschiedliche Bausteine zum Einsatz +kommen zu lassen, wurden die benutzbaren Werte folgendermaßen +eingeschränkt: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterEinschränkung
ucrBit 1: Art der Parität
        0 = ungerade
        1 = gerade
  
     2: Parität
        0 = nein
        1 = ja
  
   3+4: Anzahl der Stopbits
        0 = ungültig
        1 = 1 Stopbit
        2 = 1,5 Stopbits
        3 = 2 Stopbits
  
   5+6: Wortlänge
        0 = 8 Bits
        1 = 7 Bits
        2 = 6 Bits
        3 = 5 Bits
  
rsrnicht anwendbar
tsrBit-3: (1 = Break)
scrnicht anwendbar
+
+ +
Technisch nicht möglich Werte müssen daher ignoriert werden. +Ansonsten gilt folgende Belegung: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
baudBaudrate
 -1: nicht verändern
  0: 19200 Baud
  1: 9600 Baud
  2: 4800 Baud
  3: 3600 Baud
  4: 2400 Baud
  5: 2000 Baud
  6: 1800 Baud
  7: 1200 Baud
  8: 600 Baud
  9: 300 Baud
 10: 200 Baud
 11: 150 Baud
 12: 134 Baud
 13: 110 Baud
 14: 75 Baud
 15: 50 Baud
  
ctrArt der Flußkontrolle
 -1: nicht verändern
  0: keine Flußkontrolle
  1: XON/XOFF (Control-S, Control-Q)
  2: RTS/CTS
  3: RTS/CTS und XON/XOFF
  
ucrneuer Wert für Register, oder -1
tsrneuer Wert für Register, oder -1
rsrneuer Wert für Register, oder -1
scrneuer Wert für Register, oder -1
+
+ +
Hinweis: Ab TOS 1.04 kann die zuletzt eingestellte +Baudrate per Rsconf (-2,-1,-1,-1,-1) abgefragt werden. Man sollte sich +niemals darauf verlassen, daß alle Einstellungen tatsächlich wie +gewünscht vorgenommen werden konnten, und deshalb den Rückgabewert +der Funktion beachten. +
  +
Ergebnis: Die Funktion liefert in gepackter Form die Werte der Register +ucr, rsr, scr, tsr und zwar wie folgt: +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
Bits0..7:scr-Register
Bits8..15:tsr-Register
Bits16..23:rsr-Register
Bits24..31:ucr-Register
+
+ +
Verfügbar: Alle TOS Versionen. +
  +
Gruppe: Schnittstellenprogrammierung +
  +
Querverweis: Binding   Bconmap +
  + +
+ +

4.18.12.1 Bindings für Rsconf

+ + + + + + +
C: #include <tos.h> +
  +
int32_t Rsconf( int16_t baud, int16_t ctr, int16_t ucr, int16_t +rsr, int16_t tsr, int16_t scr ); +
  +
Assembler: +
  +
move.w    scr,-(sp)    ; Offset 12
+move.w    tsr,-(sp)    ; Offset 10
+move.w    rsr,-(sp)    ; Offset  8
+move.w    ucr,-(sp)    ; Offset  6
+move.w    ctr,-(sp)    ; Offset  4
+move.w    baud,-(sp)   ; Offset  2
+move.w    #15,-(sp)    ; Offset  0
+trap      #14          ; XBIOS aufrufen
+lea       $E(sp),sp    ; Stack korrigieren
+
+ +
+ +
+ +Home +XBIOSXBIOS +PCI-BIOSPCI-BIOS +SoundroutinenSoundroutinen + + diff --git a/de/xbios_interrupt.html b/de/xbios_interrupt.html new file mode 100644 index 000000000..eaa0a2542 --- /dev/null +++ b/de/xbios_interrupt.html @@ -0,0 +1,329 @@ + + + + + +Die Anleitung zum TOS: Interruptfunktionen + + + + + + + + + +Home +XBIOSXBIOS +Hatari-DHS-XBIOS-ErweiterungHatari-DHS-XBIOS-Erweiterung +LaufwerksfunktionenLaufwerksfunktionen + +
+ +

4.13 Interruptfunktionen

+ + + + + + +
Jdisint Interrupts sperren. +
Jenabint Interrupts freigeben. + +
+ +

Querverweis: Schnittstellenprogrammierung +

+

4.13.1 Jdisint

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »disable interrupt« - Unterbrechungen des multifunktionalen +Peripheriebausteins sperren. +
  +
Xbiosnummer: 26 +
  +
Deklaration: void Jdisint( int16_t number ); +
  +
Beschreibung: Die XBIOS-Routine Jdisint sperrt eine bestimmte Art von +Interrupt, die mit number angegeben wird, am +Multifunktionsperipheriebaustein. Der Parameter number bezieht +sich auf folgende Interrupts: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
numberBeschreibung
 0I/O-Port Bit 0 Busy par. Schnittstelle
 1RS-232 DCD
 2RS-232 CTS
 3Blitter
 4Timer D, RS232-232 Baud-Generator
 5Timer C, 200-Hz System-Uhr
 6Tastatur und MIDI
 7FDC und DMA
 8Timer B Zeilenrücklauf
 9RS-232 Sendefehler
10RS-232 Sendepuffer leer
11RS-232 Empfangspuffer voll
12RS-232 Puffer voll
13Timer A
14RS-232 RI
15Monochrom-Monitor Detect
+
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Alle TOS Versionen. +
  +
Gruppe: Interruptfunktionen +
  +
Querverweis: Binding   Jenabint   Mfpint +
  + +
+ +

4.13.1.1 Bindings für Jdisint

+ + + + + + +
C: #include <tos.h> +
  +
void Jdisint( int16_t number ); +
  +
Assembler: +
  +
move.w    number,-(sp)  ; Offset 2
+move.w    #26,-(sp)     ; Offset 0
+trap      #14           ; XBIOS aufrufen
+addq.l    #4,sp         ; Stack korrigieren
+
+ +
+ +

4.13.2 Jenabint

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »enable interrupt« - Unterbrechungen des multifunktionalen +Peripheriebausteins freigeben. +
  +
Xbiosnummer: 27 +
  +
Deklaration: void Jenabint( int16_t number ); +
  +
Beschreibung: Die XBIOS-Routine Jenabint gibt eine bestimmte Art von +Interrupt, die mit number angegeben wird, am +Multifunktionsperipheriebaustein wieder frei. Der Parameter +number bezieht sich auf folgende Interrupts: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
numberBeschreibung
 0I/O-Port Bit 0 Busy par. Schnittstelle
 1RS-232 DCD
 2RS-232 CTS
 3Blitter
 4Timer D, RS232-232 Baud-Generator
 5Timer C, 200-Hz System-Uhr
 6Tastatur und MIDI
 7FDC und DMA
 8Timer B Zeilenrücklauf
 9RS-232 Sendefehler
10RS-232 Sendepuffer leer
11RS-232 Empfangspuffer voll
12RS-232 Puffer voll
13Timer A
14RS-232 RI
15Monochrom-Monitor Detect
+
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Alle TOS Versionen +
  +
Gruppe: Interruptfunktionen +
  +
Querverweis: Binding   Jdisint   Mfpint +
  + +
+ +

4.13.2.1 Bindings für Jenabint

+ + + + + + +
C: #include <tos.h> +
  +
void Jenabint( int16_t number ); +
  +
Assembler: +
  +
move.w    number,-(sp)  ; Offset 2
+move.w    #27,-(sp)     ; Offset 0
+trap      #14           ; XBIOS aufrufen
+addq.l    #4,sp         ; Stack korrigieren
+
+ +
+ +
+ +Home +XBIOSXBIOS +Hatari-DHS-XBIOS-ErweiterungHatari-DHS-XBIOS-Erweiterung +LaufwerksfunktionenLaufwerksfunktionen + + diff --git a/de/xbios_keyboard.html b/de/xbios_keyboard.html new file mode 100644 index 000000000..dc634be23 --- /dev/null +++ b/de/xbios_keyboard.html @@ -0,0 +1,318 @@ + + + + + +Die Anleitung zum TOS: Tastaturfunktionen + + + + + + + + + +Home +XBIOSXBIOS +SpezialbefehleSpezialbefehle +VIDIX-XBIOS-ErweiterungVIDIX-XBIOS-Erweiterung + +
+ +

4.21 Tastaturfunktionen

+ + + + + + + + + +
Bioskeys Bios-Tabelle für Tastaturcodes zurücksetzen. +
Kbrate Auto-Repeat der Tastatur ändern oder ermitteln. +
Keytbl Neue Tabelle für Tastaturcodes vorgeben. + +
+ +

Querverweis: ASCII-Tabelle   Scan-Code Tabelle +

+

4.21.1 Bioskeys

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Bios standard keys« - Tastatur reinitialisieren. +
  +
Xbiosnummer: 24 +
  +
Deklaration: void Bioskeys( void ); +
  +
Beschreibung: Bioskeys ist eine XBIOS-Routine zur Re-Initialisierung der +Tastatur-Codes. Dies ist meist nur dann nötig, wenn die Tastatur mit +Hilfe der Funktion Keytbl umprogrammiert wurde. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Seit KAOS 1.4.2 und MagiC liefert die Funktion einen Zeiger auf +die Struktur: KEYBDPARMS +
  +
Verfügbar: Alle TOS Versionen +
  +
Gruppe: Tastaturfunktionen +
  +
Querverweis: Binding   Keytbl   Sconfig +
  + +
+ +

4.21.1.1 Bindings für Bioskeys

+ + + + + + +
C: #include <tos.h> +
  +
void Bioskeys( void ); +
  +
Assembler: +
  +
move.w    #24,-(sp)    ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

4.21.2 Kbrate

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »keyboard rate« - legt die Autorepeat-Rate der Tastatur fest. +
  +
Xbiosnummer: 35 +
  +
Deklaration: int16_t Kbrate( int16_t initial, int16_t repeat ); +
  +
Beschreibung: Die XBIOS-Routine Kbrate ermittelt oder ändert die aktuelle +Auto-Repeat-Geschwindigkeit der Tastatur. Es gilt: +
  + + + + + + + + + +
Parameter Bedeutung +
  +
initial Ansprechzeit bis zur ersten Wiederholung (in 20ms). Ein Wert +von -1 bedeutet keine Veränderung. +
  +
repeat Wiederholungsgeschwindigkeit in 20ms. Ein Wert von -1 bedeutet +in diesem Zusammenhang keine Veränderung. +
  + +
+ +
Ergebnis: Die Funktion liefert als Ergebnis die Einstellung des +Auto-Repeat-Modus, und zwar wie folgt: +
  +

+
+ + + + + + + + +
Bits 0..7 :bisheriger repeat-Wert
Bits 8..15:bisheriger initial-Wert
+
+ +
Verfügbar: Alle TOS Versionen. +
  +
Gruppe: Tastaturfunktionen +
  +
Querverweis: Binding +
  + +
+ +

4.21.2.1 Bindings für Kbrate

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Kbrate( int16_t initial, int16_t repeat ); +
  +
Assembler: +
  +
move.w    repeat,-(sp)  ; Offset 4
+move.w    initial,-(sp) ; Offset 2
+move.w    #35,-(sp)     ; Offset 0
+trap      #14           ; XBIOS aufrufen
+addq.l    #6,sp         ; Stack korrigieren
+
+ +
+ +

4.21.3 Keytbl

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »key table« - definiert die Umsetzungstabelle der Tastatur +von Scan-Codes in Tastatur-Codes. +
  +
Xbiosnummer: 16 +
  +
Deklaration: KEYTAB *Keytbl( void *unshift, void *shift, void *capslock ); +
  +
Beschreibung: Keytbl ist eine XBIOS-Funktion mit deren Hilfe eine neue +Tastatur-Tabelle für die Umsetzung von Scan-Codes in Tastatur-Codes +vorgenommen werden kann. Es gilt: +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
unshift Zeiger auf unshift-Tabelle, oder -1 +
shift Zeiger auf shift-Tabelle, oder -1 +
capslock Zeiger auf capslock-Tabelle, oder -1 + +
+ +
Hinweis: Ein Code wird umgerechnet, indem der Scancode +der betreffenden Taste als Index in die Tabelle (von ASCII-Zeichen) +verwendet wird. Jede der Tabellen besitzt Platz für 128 Einträge, +obwohl Tastenkombinationen mit höherem Scancode existieren. +
  +
Ergebnis: Die Funktion liefert als Ergebnis einen Zeiger auf die Struktur +KEYTAB. +
  +
Verfügbar: Alle TOS Versionen. +
  +
Gruppe: Tastaturfunktionen +
  +
Querverweis: Binding   Bioskeys   ASCII-Tabelle   Scan-Codes +
  + +
+ +

4.21.3.1 Bindings für Keytbl

+ + + + + + +
C: #include <tos.h> +
  +
KEYTAB *Keytbl( void *unshift, void *shift, void *capslock ); +
  +
Assembler: +
  +
pea       capslock     ; Offset 10
+pea       shift        ; Offset  6
+pea       unshift      ; Offset  2
+move.w    #16,-(sp)    ; Offset  0
+trap      #14          ; XBIOS aufrufen
+lea       $E(sp),sp    ; Stack korrigieren
+
+ +
+ +
+ +Home +XBIOSXBIOS +SpezialbefehleSpezialbefehle +VIDIX-XBIOS-ErweiterungVIDIX-XBIOS-Erweiterung + + diff --git a/de/xbios_main.html b/de/xbios_main.html new file mode 100644 index 000000000..686bdfb24 --- /dev/null +++ b/de/xbios_main.html @@ -0,0 +1,60 @@ + + + + + +Die Anleitung zum TOS: XBIOS + + + + + + + + + +Home +Inhaltsverzeichnis +BIOS StrukturenBIOS Strukturen +Das XBIOSDas XBIOS + +
+ +

4 XBIOS

+ +
+
+ +Home +Inhaltsverzeichnis +BIOS StrukturenBIOS Strukturen +Das XBIOSDas XBIOS + + diff --git a/de/xbios_metados.html b/de/xbios_metados.html new file mode 100644 index 000000000..a3ae9ac93 --- /dev/null +++ b/de/xbios_metados.html @@ -0,0 +1,41 @@ + + + + + +Die Anleitung zum TOS: MetaDOS + + + + + + + + + +Home +XBIOSXBIOS +Das XBIOSDas XBIOS +XBIOS FehlermeldungenXBIOS Fehlermeldungen + +
+ +

4.2 MetaDOS

+

MetaDOS ist eine Betriebssystemerweiterung von Atari, die das +XBIOS um ein Treiberkonzept für blockorientierte +Geräte erweitert. MetaDOS erlaubt daher die Installation passender +Treiber, und stellt neue XBIOS-Laufwerksfunktionen zur +Verfügung. +

+

Die Kommunikation mit dem GEMDOS wird dabei durch +spezielle logische Gerätetreiber realisiert. +

+
+ +Home +XBIOSXBIOS +Das XBIOSDas XBIOS +XBIOS FehlermeldungenXBIOS Fehlermeldungen + + diff --git a/de/xbios_overscan.html b/de/xbios_overscan.html new file mode 100644 index 000000000..42fb1b3ba --- /dev/null +++ b/de/xbios_overscan.html @@ -0,0 +1,723 @@ + + + + + +Die Anleitung zum TOS: OverScan-XBIOS-Erweiterungen + + + + + + + + + +Home +XBIOSXBIOS +MATRIX-XBIOS-ErweiterungMATRIX-XBIOS-Erweiterung +PCI-BIOSPCI-BIOS + +
+ +

4.16 OverScan-XBIOS-Erweiterungen

+ + + + + + + + + + + + + + + + + + + + + +
Oscanis Liefert die Versionsnummer von OverScan. +
Oscanpatch Patchbereich von Overscan ermitteln. +
Oscanphy Umschalten des Physbase-Emulators. +
Oscanscr Umschalten des Setscreen-Aufrufes. +
Oscanswitch Aktuellen Modus umschalten oder abfragen. +
Oscantab Zeiger auf Datenstruktur einer Auflösung ermitteln. +
Oscanvb Schaltet die VB-Randtest-Routine, sowie einige Tests im +IKBD-Interrupt ein oder aus. + +
+ +

Hinweis: Diese Funktionen stehen nur zur Verfügung, +wenn der Cookie 'OVER' vorhanden ist und seit der Version 1.8 von +AutoSwitch-OverScan ST. +

+

4.16.1 Oscanis

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Oscanis« - Versionsnummer von OverScan ermitteln. +
  +
Xbiosnummer: 4200 (alt: 84) +
  +
Deklaration: int16_t Oscanis( void ); +
  +
Beschreibung: Die Funktion liefert die (hexa-dezimale) Versionsnummer von +OverScan. Ein Wert von 0x300 entspricht dabei der Version 3.0. +
  +
Da diese Funktion auf einem nicht-dokumentierten Feature +basiert, sollte zur Ermittlung der Versionsnummer nach Möglichkeit +auf den OVER-Cookie zurückgegriffen werden. +
  +
Ergebnis: Die Funktion liefert (normalerweise) den Wert 4200 zurück, +wenn OverScan nicht installiert ist, ansonsten dessen Versionsnummer. +
  +
Verfügbar: Wenn der Cookie 'OVER' vorhanden ist und seit der Version 1.8. +
  +
Gruppe: OverScan-XBIOS-Funktionen +
  +
Querverweis: Binding   Oscanpatch   Oscanphy   Oscanscr   Oscanswitch   +Oscantab   Oscanvb +
  + +
+ +

4.16.1.1 Bindings für Oscanis

+ + + + + + +
C: int16_t Oscanis( void ); +
  +
Assembler: +
  +
move.w    #4200,-(sp)  ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

4.16.2 Oscanpatch

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Oscanpatch« - Patchbereich von OverScan ermitteln. +
  +
Xbiosnummer: 4205 (alt: 89) +
  +
Deklaration: OVERPATCH *Oscanpatch( void ); +
  +
Beschreibung: Die Funktion liefert einen Zeiger auf den Patchbereich von +OverScan. +
  +
Ergebnis: Die Funktion gibt einen Zeiger auf den OverScan-Patchbereich +zurück. +
  +
Verfügbar: Wenn der Cookie 'OVER' vorhanden ist und seit der Version 1.8. +
  +
Gruppe: OverScan-XBIOS-Funktionen +
  +
Querverweis: Binding   Oscanis   Oscanphy   Oscanscr   Oscanswitch   OscantabOscanvb +
  + +
+ +

4.16.2.1 Bindings für Oscanpatch

+ + + + + + +
C: OVERPATCH *Oscanpatch( void ); +
  +
Assembler: +
  +
move.w    #4205,-(sp)  ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

4.16.3 Oscanphy

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Oscanphy« - Umschalten des Physbase-Emulators. +
  +
Xbiosnummer: 4202 (alt:86) +
  +
Deklaration: int16_t Oscanphy( int16_t mode ); +
  +
Beschreibung: Die Funktion erlaubt es, den Physbase-Emulator umzuschalten. Es +gilt: +
  + + + + + + +
Parameter Bedeutung +
  +
mode +
  +

+
+ + + + + + + + + + + + + + + +
-1=Status abfragen
0=Emulator ausschalten
1=Emulator einschalten (Default)
+
+ + +
+ +
Wenn der Emulator eingeschaltet ist, wird bei Aufruf von Physbase +der Wert von Logbase zurückgegeben. Vor Beenden des Programms muß +der Physbase-Emulator unbedingt wieder eingeschaltet werden. +
  +
Ergebnis: Die Funktion liefert beim mode -1 den aktuellen Status +des Emulators zurück. +
  +
Verfügbar: Wenn der Cookie 'OVER' vorhanden ist und seit der Version 1.8. +
  +
Gruppe: OverScan-XBIOS-Funktionen +
  +
Querverweis: Binding   Oscanis   Oscanpatch   Oscanscr   Oscanswitch   +Oscantab   Oscanvb +
  + +
+ +

4.16.3.1 Bindings für Oscanphy

+ + + + + + +
C: int16_t Oscanphy( int16_t mode ); +
  +
Assembler: +
  +
move.w    mode,-(sp)   ; Offset 2
+move.w    #4202,-(sp)  ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.16.4 Oscanscr

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Oscanscr« - Umschalten des Setscreen-Aufrufes. +
  +
Xbiosnummer: 4203 (alt: 87) +
  +
Deklaration: int16_t Oscanscr( int16_t mode ); +
  +
Beschreibung: Die Funktion ermöglicht es, den Setscreen-Aufruf umzuschalten. +Es gilt: +
  + + + + + + +
Parameter Bedeutung +
  +
mode +
  +

+
+ + + + + + + + + + + + + + + +
-1=Status abfragen
0=Setscreen zulässig
1=Setscreen nicht zulässig (Default)
+
+ + +
+ +
Normalerweise ist unter OverScan ein Verlegen des Bildschirms +oder ein Wechsel der Auflösung nicht möglich. Wenn man den +Bildschirmspeicher mit Setscreen verlegen will, darf man den Offset +zwischen Logbase und Physbase nicht zerstören. +
Wichtig: Vor dem Beenden des Programms muß der +Setscreen-Aufruf wieder gesperrt werden. +
  +
Ergebnis: Die Funktion liefert die aktuelle Einstellung zurück. +
  +
Verfügbar: Wenn der Cookie 'OVER' vorhanden ist und seit der Version 1.8. +
  +
Gruppe: OverScan-XBIOS-Funktionen +
  +
Querverweis: Binding   Oscanis   Oscanpatch   Oscanphy   Oscanswitch   +Oscantab   Oscanvb +
  + +
+ +

4.16.4.1 Bindings für Oscanscr

+ + + + + + +
C: int16_t Oscanscr( int16_t mode ); +
  +
Assembler: +
  +
move.w    mode,-(sp)   ; Offset 2
+move.w    #4203,-(sp)  ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.16.5 Oscanswitch

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Oscanswitch« - aktuellen Modus umschalten oder abfragen. +
  +
Xbiosnummer: 4206 (alt: 90) +
  +
Deklaration: int16_t Oscanswitch( int16_t mode ); +
  +
Beschreibung: Die Funktion schaltet zwischen dem Normalmodus und dem +OverScan-Modus um. Es gilt: +
  + + + + + + +
Parameter Bedeutung +
  +
mode +
  +

+
+ + + + + + + + + + + + + + + +
-1=Status abfragen
0=Normalmodus
1=OverScan-Modus
+
+ + +
+ +
Dabei wird nicht nur die Hardware umgeschaltet, sondern auch +alle internen GEM-Variablen gepatcht und der Bildschirm umkopiert. +
  +
Ergebnis: Die Funktion liefert die jeweils aktuelle Einstellung zurück. +
  +
Verfügbar: Wenn der Cookie 'OVER' vorhanden ist und seit der Version 1.8. +
  +
Gruppe: OverScan-XBIOS-Funktionen +
  +
Querverweis: Binding   Oscanis   Oscanpatch   Oscanphy   Oscanscr   OscantabOscanvb +
  + +
+ +

4.16.5.1 Bindings für Oscanswitch

+ + + + + + +
C: int16_t Oscanswitch( int16_t mode ); +
  +
Assembler: +
  +
move.w    mode,-(sp)   ; Offset 2
+move.w    #4206,-(sp)  ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.16.6 Oscantab

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Oscantab« - Zeiger auf die Datenstruktur einer Auflösung +ermitteln. +
  +
Xbiosnummer: 4201 (alt: 85) +
  +
Deklaration: SCREEN *Oscantab( int16_t res ); +
  +
Beschreibung: Die Funktion liefert einen Zeiger auf eine Struktur zur +Beschreibung des Bildschirms zurück. Es gilt: +
  + + + + + + +
Parameter Bedeutung +
  +
res +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
-1=aktuelle Einstellung
0=niedrige Auflösung
1=mittlere Auflösung
2=hohe Auflösung
+
+ + +
+ +
Die Datenstruktur der aktuellen Einstellung wird bei jedem +Aufruf der Funktion aktualisiert. +
  +
Ergebnis: Die Funktion liefert einen Zeiger auf die entsprechende +Struktur zur Beschreibung des Bildschirms zurück. +
  +
Verfügbar: Wenn der Cookie 'OVER' vorhanden ist und seit der Version 1.8. +
  +
Gruppe: OverScan-XBIOS-Funktionen +
  +
Querverweis: Binding   Oscanis   Oscanpatch   Oscanphy   Oscanscr   +Oscanswitch   Oscanvb +
  + +
+ +

4.16.6.1 Bindings für Oscantab

+ + + + + + +
C: SCREEN *Oscantab( int16_t res ); +
  +
Assembler: +
  +
move.w    res,-(sp)    ; Offset 2
+move.w    #4201,-(sp)  ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.16.7 Oscanvb

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Oscanvb« - VB Randtest-Routine und Tests im IKBD Interrupt +ein- oder ausschalten. +
  +
Xbiosnummer: 4204 (alt: 88) +
  +
Deklaration: int16_t Oscanvb( int16_t mode ); +
  +
Beschreibung: Die Funktion erlaubt es, die VB-Randtest-Routine sowie den Test +auf Shift/Shift/Clear im IKBD-Interrupt auszuschalten. Es gilt: +
  + + + + + + +
Parameter Bedeutung +
  +
mode +
  +

+
+ + + + + + + + + + + + + + + +
-1=Status abfragen
0=Tests ausschalten
1=Tests einschalten (Default)
+
+ + +
+ +
Die Tests benötigen zwar nur ca. 1-2% Rechenzeit, für +zeitkritische Animationen und MIDI-Routinen könnte dies aber zuviel +sein. Wichtig: Vor dem Beenden des Programms müssen die Tests +unbedingt wieder eingeschaltet werden. +
  +
Ergebnis: Die Funktion liefert die jeweils aktuelle Einstellung zurück. +
  +
Verfügbar: Wenn der Cookie 'OVER' vorhanden ist und seit der Version 1.8. +
  +
Gruppe: OverScan-XBIOS-Funktionen +
  +
Querverweis: Binding   Oscanis   Oscanpatch   Oscanphy   Oscanscr   +Oscanswitch   Oscantab +
  + +
+ +

4.16.7.1 Bindings für Oscanvb

+ + + + + + +
C: int16_t Oscanvb( int16_t mode ); +
  +
Assembler: +
  +
move.w    mode,-(sp)   ; Offset 2
+move.w    #4204,-(sp)  ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +
+ +Home +XBIOSXBIOS +MATRIX-XBIOS-ErweiterungMATRIX-XBIOS-Erweiterung +PCI-BIOSPCI-BIOS + + diff --git a/de/xbios_printer.html b/de/xbios_printer.html new file mode 100644 index 000000000..b71ab1a8f --- /dev/null +++ b/de/xbios_printer.html @@ -0,0 +1,314 @@ + + + + + +Die Anleitung zum TOS: Druckerfunktionen + + + + + + + + + +Home +XBIOSXBIOS +Datum, Uhrzeit und ZeitgeberDatum, Uhrzeit und Zeitgeber +DSP-ProgrammierungDSP-Programmierung + +
+ +

4.10 Druckerfunktionen

+ + + + + + + + + +
Prtblk Hardcopy-Funktion mit Parameterblock. +
Scrdmp Bildschirminhalt ausdrucken. +
Setprt Druckereinstellung ermitteln oder ändern. + +
+ +

Querverweis: Bildschirmfunktionen   GDOS-Treiber +

+

4.10.1 Prtblk

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »print screen dump« - Hardcopy-Ausdruck. +
  +
Xbiosnummer: 36 +
  +
Deklaration: int16_t Prtblk( PBDEF *par ); +
  +
Beschreibung: Die XBIOS-Routine Prtblk druckt einen bestimmten Bereich im +Speicher aus. Der Zeiger par dient der Beschreibung der +Struktur des Bildschirmaufbaus. +
  +
Der Druckvorgang kann durch die Tastenkombination Alternate/Help +abgebrochen werden. +
  +
Hinweis: Vor dem Aufruf dieser Funktion sollte die +Systemvariable prt_cnt auf 1 gesetzt werden, damit überhaupt etwas +passiert. Nach Rückkehr der Funktion sollte die Variable auf -1 +zurückgesetzt werden. +
  +
Achtung: Ab MagiC 3 ist diese Funktion nur noch als +Dummy-Routine vorhanden; ggfs. ist durch ein externes Programm die +gewünschte Funktionalität wieder herzustellen. +
  +
Ergebnis: Die Funktion liefert als Ergebnis eine 0, wenn der Ausdruck +erfolgreich war, ansonsten einen von 0 verschiedenen Wert. +
  +
Verfügbar: Alle TOS Versionen. +
  +
Gruppe: Druckerfunktionen +
  +
Querverweis: Binding   HARDCOPY   MagiC +
  + +
+ +

4.10.1.1 Bindings für Prtblk

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Prtblk( PBDEF *par ); +
  +
Assembler: +
  +
pea       par          ; Offset 2
+move.w    #36,-(sp)    ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.10.2 Scrdmp

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »screen dump« - druckt den Bildschirminhalt aus. +
  +
Xbiosnummer: 20 +
  +
Deklaration: void Scrdmp( void ); +
  +
Beschreibung: Die XBIOS-Routine Scrdmp druckt den Inhalt des Bildschirms als +Hardcopy aus. +
  +
Der Druckvorgang kann durch die Tastenkombination Alternate/Help +abgebrochen werden. +
  +
Hinweis: Die Funktion springt über den Systemvektor +scr_dump, und funktioniert leider nicht auf allen verfügbaren +Druckern. +
  +
Achtung: Ab MagiC 3 ist diese Funktion nur noch als +Dummy-Routine vorhanden; ggfs. ist durch ein externes Programm die +gewünschte Funktionalität wieder herzustellen. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Alle TOS Versionen. +
  +
Gruppe: Druckerfunktionen +
  +
Querverweis: Binding   HARDCOPY   MagiC +
  + +
+ +

4.10.2.1 Bindings für Scrdmp

+ + + + + + +
C: #include <tos.h> +
  +
void Scrdmp( void ); +
  +
Assembler: +
  +
move.w    #20,-(sp)    ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

4.10.3 Setprt

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Setprinter« - initialisiert den Drucker. +
  +
Xbiosnummer: 33 +
  +
Deklaration: int16_t Setprt( int16_t config ); +
  +
Beschreibung: Die XBIOS-Routine Setprt setzt bzw. liest die aktuelle +Einstellung des Druckers. Folgende Bits können im Parameter +config angegeben werden: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
BitBedeutung
0Matrix- oder Typenraddrucker
1monochrom oder farbig
2Epson-, oder Atari-Drucker
3Schönschrift oder Konzeptschrift
4Centronics oder RS232
5Endlospapier oder Einzelblatt
+
+ +
Bei config = -1 wird die aktuelle Konfiguration +zurückgegeben. Alle weiteren Bits sind für zukünftige Zwecke +reserviert. +
  +
Hinweis: Die durch diese Funktion gemachten +Einstellungen werden leider von fast allen Betriebssystemteilen +ignoriert. In eigenen Programmen sollte zumindest die Wahl der +Schnittstelle sowie der Papierart ausgewertet werden. +
  +
Ergebnis: Die Funktion liefert als Ergebnis die alte Konfiguration. +
  +
Verfügbar: Alle TOS Versionen. +
  +
Gruppe: Druckerfunktionen +
  +
Querverweis: Binding +
  + +
+ +

4.10.3.1 Bindings für Setprt

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Setprt( int16_t config ); +
  +
Assembler: +
  +
move.w    config,-(sp)  ; Offset 2
+move.w    #33,-(sp)     ; Offset 0
+trap      #14           ; XBIOS aufrufen
+addq.l    #4,sp         ; Stack korrigieren
+
+ +
+ +
+ +Home +XBIOSXBIOS +Datum, Uhrzeit und ZeitgeberDatum, Uhrzeit und Zeitgeber +DSP-ProgrammierungDSP-Programmierung + + diff --git a/de/xbios_sound.html b/de/xbios_sound.html new file mode 100644 index 000000000..d91546b13 --- /dev/null +++ b/de/xbios_sound.html @@ -0,0 +1,9717 @@ + + + + + +Die Anleitung zum TOS: Soundroutinen + + + + + + + + + +Home +XBIOSXBIOS +SchnittstellenprogrammierungSchnittstellenprogrammierung +SpezialbefehleSpezialbefehle + +
+ +

4.19 Soundroutinen

+

Auf dem Falcon stehen die folgenden Routinen zur +Soundprogrammierung zur Verfügung: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
buffoper Aufnahme-/Wiedergabemodus setzen. +
buffptr Aufnahme-/Wiedergabeposition ermitteln. +
devconnect Audio-Subsystem-Komponenten verbinden. +
dsptristate Externe DSP-Hardware koordinieren. +
gpio Über externe DSP-Buchse kommunizieren. +
locksnd Soundsystem für andere Anwendungen sperren. +
setbuffer Aufnahme-/Wiedergabepuffer setzen. +
setinterrupt Interrupt am Ende einer Aufnahme/Wiedergabe festlegen. +
setmode Aufnahme-/Wiedergabemodus wählen. +
setmontracks Wiedergabespur für internen Lautsprecher festlegen. +
settracks Spurenanzahl festlegen. +
sndstatus Status des A/D- und D/A-Wandlers ermitteln. +
soundcmd Parameter des A/D- und D/A-Wandlers setzen/ermitteln. +
StarTrack XBIOS-Erweiterumg der StarTrack-Karte. +
unlocksnd Soundsystem für andere Anwendungen freigeben. +
WavePlay Abspielen eines Samples. + +
+ +

Hinweis: Die Verfügbarkeit dieser Routinen auf anderen +Rechnersystemen kann über den McSn-Cookie oder den _SND-Cookie ermittelt +werden. +

+

4.19.1 buffoper

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »buffoper« - Setzen des Aufnahme bzw. Wiedergabemodus +
  +
Xbiosnummer: 136 +
  +
Deklaration: int32_t buffoper( int16_t mode ); +
  +
Beschreibung: Die XBIOS-Routine buffoper legt den Aufnahme- und +Wiedergabemodus fest. +
  +
Wird für mode der Wert -1 übergeben, wird die aktuelle +Einstellung ermittelt. Sonst wird mode wie folgt kodiert: +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
BitOperation
0Wiedergabe
1Wiedergabewiederholung
2Aufnahme
3Aufnahmewiederholung
+
+ +
Gesetzte Bits schalten eine Operation ein, gelöschte Bits aus. +
  +
Ergebnis: Im Erfolgsfall liefert die Funktion den Wert 0. Wurde für +mode -1 übergeben, erhält man die aktuelle Einstellung, +deren Kodierung der des Parameters mode entspricht. +
  +
Verfügbar: Die Funktion ist nur auf Computern der Falcon-Serie verfügbar +oder bei erweiterten XBiosroutinen (_SND). +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding   buffptr   devconnect   dsptristate   gpio   locksnd   +setbuffer   setinterrupt   setmontracks   setmode   settracks   +sndstatus   soundcmd   unlocksnd +
  + +
+ +

4.19.1.1 Bindings für buffoper

+ + + + + + +
C: #include <tos.h> +
  +
int32_t buffoper( int16_t mode ); +
  +
Assembler: +
  +
move.w    mode,-(sp)   ; Offset 2
+move.w    #136,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.19.2 buffptr

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »buffptr« - Ermitteln der Aufnahme bzw. Wiedergabeposition +
  +
Xbiosnummer: 141 +
  +
Deklaration: int32_t buffptr( int32_t *ptr ); +
  +
Beschreibung: Die XBIOS-Routine buffptr ermittelt die aktuelle Wiedergabe- +und Aufnahmepositionen in den entsprechenden Puffern. +
  +
ptr zeigt auf einen mindestens 4 Langworte großen +Puffer. In diesen werden die Positionszeiger angelegt. Der erste +int32_t des Puffer enthält einen Zeiger auf die aktuelle +Wiedergabeposition und der zweite int32_t einen Zeiger auf die +aktuelle Aufnahmeposition. +
  +
Ergebnis: Im Erfolgsfall liefert die Funktion den Wert 0. +
  +
Verfügbar: Die Funktion ist nur auf Computern der Falcon-Serie verfügbar +oder bei erweiterten XBiosroutinen (_SND). +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding   buffoper   devconnect   dsptristate   gpio   locksnd   +setbuffer   setinterrupt   setmontracks   setmode   settracks   +sndstatus   soundcmd   unlocksnd +
  + +
+ +

4.19.2.1 Bindings für buffptr

+ + + + + + +
C: #include <tos.h> +
  +
int32_t buffptr( int32_t *ptr ); +
  +
Assembler: +
  +
pea       ptr          ; Offset 2
+move.w    #141,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.19.3 devconnect

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »devconnect« - Verbinden der Audiosubsystem-Komponenten +
  +
Xbiosnummer: 139 +
  +
Deklaration: int32_t devconnect( int16_t src, int16_t dst, int16_t srcclk, +int16_t prescale, int16_t protocol ); +
  +
Beschreibung: Die XBIOS-Routine devconnect verbindet Komponenten des +Audio-Subsystems. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
srcQuellkomponente:
 0 DMA-Ausgabe
 1 DSP-Ausgabe
 2 Externer Eingabekanal
 3 A/D-Wandler - Mikrophon
  
dstBitvektor der Zielkomponenten:
 Bit 0 DMA-Eingabe
 Bit 1 DSP-Eingabe
 Bit 2 Externer Ausgabekanal
 Bit 3 D/A-Wandler - Lautsprecher
  
srcclkTakt für die Quellkomponente:
 0 Interner 25,175 MHz Takt
 1 Externer Takt
    Für MilanBlaster ist Externer Takt
    24,576 MHz wenn gpio(1, 0) & 0x1l == 1l und
    22,5792 MHz wenn gpio(1, 0) & 0x1l == 0l
    ist!
 2 Interner 32 MHz Takt
  
prescaleTaktvorteiler. Die Sample-Rate ergibt
 sich aus dem Takt geteilt durch 256
 und geteilt durch Vorteiler + 1. Die
 Werte für den Vorteiler rangieren
 von 0 bis 11.
 Wird für den Vorteiler 0 übergeben,
 wird in den STE-Kompatibilitätsmodus
 geschaltet.
  
protocolWird 0 übergeben, findet eine Über-
 tragung mit Handshaking statt, bei
 1 erfolgt kein Handshaking.
+
+ +
Ergebnis: Die Funktion liefert im positiven Fall den Wert 0 zurück. +
In TOS 4.04 liefert die Funktion den Wert 0 wenn der +src-Parameter ungültig ist, und einen zufälligen Wert sonst. +
  +
Verfügbar: Die Funktion ist nur auf Computern der Falcon-Serie verfügbar +oder bei erweiterten XBiosroutinen (_SND). +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding   buffoper   buffptr   dsptristate   gpio   locksnd   +setbuffer   setinterrupt   setmontracks   setmode   settracks   +sndstatus   soundcmd   unlocksnd +
  + +
+ +

4.19.3.1 Bindings für devconnect

+ + + + + + +
C: #include <tos.h> +
  +
int32_t devconnect( int16_t src, int16_t dst, int16_t srcclk, +int16_t prescale, int16_t protocol ); +
  +
Assembler: +
  +
move.w    protocol,-(sp)  ; Offset 10
+move.w    prescale,-(sp)  ; Offset  8
+move.w    srcclk,-(sp)    ; Offset  6
+move.w    dst,-(sp)       ; Offset  4
+move.w    src,-(sp)       ; Offset  2
+move.w    #139,-(sp)      ; Offset  0
+trap      #14             ; XBIOS aufrufen
+lea       $C(sp),sp       ; Stack korrigieren
+
+ +
+ +

4.19.4 dsptristate

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »dsptristate« - Externe DSP Hardware koordinieren +
  +
Xbiosnummer: 137 +
  +
Deklaration: int32_t dsptristate( int16_t dspxmit, int16_t dsprec ); +
  +
Beschreibung: Die XBIOS-Routine dsptristate koppelt Leitungen vom Multiplexer +ab, wenn externe Hardware am SSI-Port des DSP angeschlossen wird. +
  + + + + + + + + + +
Parameter Bedeutung +
  +
dspxmit Der Wert 0 koppelt den Multiplexer von der entsprechenden +Leitung ab, 1 erlaubt die Verbindung +
  +
dsprec Der Wert 0 koppelt den Multiplexer von der entsprechenden +Leitung ab, 1 erlaubt die Verbindung +
  + +
+ +
Ergebnis: Die Funktion liefert im positiven Fall den Wert 0 zurück. +
  +
Verfügbar: Die Funktion ist nur auf Computern der Falcon-Serie verfügbar. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding   buffoper   buffptr   devconnect   gpio   locksnd   +setbuffer   setinterrupt   setmontracks   setmode   settracks   +sndstatus   soundcmd   unlocksnd +
  + +
+ +

4.19.4.1 Bindings für dsptristate

+ + + + + + +
C: #include <tos.h> +
  +
int32_t dsptristate( int16_t dspxmit, int16_t dsprec ); +
  +
Assembler: +
  +
move.w    dsprec,-(sp)   ; Offset 4
+move.w    dspxmit,-(sp)  ; Offset 2
+move.w    #137,-(sp)     ; Offset 0
+trap      #14            ; XBIOS aufrufen
+addq.l    #6,sp          ; Stack korrigieren
+
+ +
+ +

4.19.5 gpio

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »gpio« - Kommunikation über externe DSP-Buchse +
  +
Xbiosnummer: 138 +
  +
Deklaration: int32_t gpio( int16_t mode, int16_t data ); +
  +
Beschreibung: Die XBIOS-Routine gpio dient der Kommunikation über die +externen DSP-Buchse. +
  + + + + + + + + + + + + +
mode Bedeutung +
  +
0 Setzen der Ein-/Ausgaberichtung. Die unteren drei Bits von +data repräsentieren die Mehrzweckleitungen. Ein gesetztes Bit +steht für eine Ausgabe- und ein gelöschtes für eine Eingabeleitung. +
  +
1 Lesen der Mehrzweckleitungen. Den Status der Leitungen erhält +man als Funktionsresultat. +
  +
2 Schreiben auf den Mehrzweckleitungen Der Parameter data +enthält den neuen Status der Mehrzweckleitungen. +
  + +
+ +
Ergebnis: Im Erfolgsfall liefert die Funktion den Wert 0. Hatte der +Parameter mode den Wert 1, so erhält man den Status der +Mehrzweckleitungen. +
  +
Verfügbar: Die Funktion ist nur auf Computern der Falcon-Serie verfügbar +oder bei erweiterten XBiosroutinen (_SND). +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding   buffoper   buffptr   devconnect   dsptristate   +locksnd   setbuffer   setinterrupt   setmontracks   setmode   +settracks   sndstatus   soundcmd   unlocksnd +
  + +
+ +

4.19.5.1 Bindings für gpio

+ + + + + + +
C: #include <tos.h> +
  +
int32_t gpio( int16_t mode, int16_t data ); +
  +
Assembler: +
  +
move.w    data,-(sp)   ; Offset 4
+move.w    mode,-(sp)   ; Offset 2
+move.w    #138,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.19.6 locksnd

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »locksnd« - Soundsystem für andere Anwendungen sperren +
  +
Xbiosnummer: 128 +
  +
Deklaration: int32_t locksnd( void ); +
  +
Beschreibung: Die XBIOS-Routine locksnd sperrt das Soundsystem für andere +Anwendungen. +
  +
Ergebnis: Die Funktion liefert im positiven Fall den Wert 1 zurück. Ist +das Soundsystem bereits vergeben, so wird ein negativer Wert +zurückgeliefert. +
  +
Verfügbar: Die Funktion ist nur auf Computern der Falcon-Serie verfügbar +oder bei erweiterten XBiosroutinen (_SND). +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding   buffoper   buffptr   devconnect   dsptristate   gpio   +setbuffer   setinterrupt   setmontracks   setmode   settracks   +sndstatus   soundcmd   unlocksnd +
  + +
+ +

4.19.6.1 Bindings für locksnd

+ + + + + + +
C: #include <tos.h> +
  +
int32_t locksnd( void ); +
  +
Assembler: +
  +
move.w    #128,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

4.19.7 setbuffer

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »setbuffer« - Setzen des Aufnahme und Wiedergabepuffers +
  +
Xbiosnummer: 131 +
  +
Deklaration: int32_t setbuffer( int16_t reg, void *begaddr, void *endaddr ); +
  +
Beschreibung: Die XBIOS-Routine setbuffer setzt den Puffer für die +Wiedergabe- (reg = 0) bzw. Aufnahmedaten (reg = 1). +Der Parameter begaddr zeigt auf den Anfang des Puffers und +endaddr auf das letzte Byte + 1 des Puffers. +
  +
Hinweis: Der Speicher muß mit der Gemdos Funktion +Mxalloc(size, 0) angefordert werden. +
  +
Ergebnis: Die Funktion liefert im positiven Fall den Wert 0 zurück. +
  +
Verfügbar: Die Funktion ist nur auf Computern der Falcon-Serie verfügbar +oder bei erweiterten XBiosroutinen (_SND). +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding   buffoper   buffptr   devconnect   dsptristate   gpio   +locksnd   setinterrupt   setmontracks   setmode   settracks   +sndstatus   soundcmd   unlocksnd +
  + +
+ +

4.19.7.1 Bindings für setbuffer

+ + + + + + +
C: #include <tos.h> +
  +
int32_t setbuffer( int16_t reg, void *begaddr, void *endaddr ); +
  +
Assembler: +
  +
pea       endaddr      ; Offset 8
+pea       begaddr      ; Offset 4
+move.w    reg,-(sp)    ; Offset 2
+move.w    #131,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+lea       $C(sp),sp    ; Stack korrigieren
+
+ +
+ +

4.19.8 setinterrupt

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »setinterrupt« - Interrupt am Ende einer Aufnahme bzw. einer +Wiedergabe festlegen +
  +
Xbiosnummer: 135 +
  +
Deklaration: int32_t setinterrupt( int16_t src_inter, int16_t cause ); +
  +
Beschreibung: Die XBIOS-Routine setinterrupt bestimmt, welcher Interrupt nach +dem Aufnehmen bzw. Abspielen ausgelöst werden soll. +
  + + + + + + + + + + + + +
src_inter Bedeutung +
    +
0 Timer-A-Interrupt +
1 MFP-Interrupt 7 + +
+ + + + + + + + + + + + + + + + + + + +
cause Bedeutung +
    +
0 Kein Interrupt +
1 Interrupt nach dem Abspielen +
2 Interrupt nach dem Aufnehmen +
3 Interrupt nach Aufnehmen und Abspielen + +
+ +
Ergebnis: Die Funktion liefert im positiven Fall den Wert 0 zurück. +
  +
Verfügbar: Die Funktion ist nur auf Computern der Falcon-Serie verfügbar +oder bei erweiterten XBiosroutinen (_SND). +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding   buffoper   buffptr   devconnect   dsptristate   gpio   +locksnd   setbuffer   setmontracks   setmode   settracks   sndstatus   +soundcmd   unlocksnd +
  + +
+ +

4.19.8.1 Bindings für setinterrupt

+ + + + + + +
C: #include <tos.h> +
  +
int32_t setinterrupt( int16_t src_inter, int16_t cause ); +
  +
Assembler: +
  +
move.w    cause,-(sp)      ; Offset 4
+move.w    src_inter,-(sp)  ; Offset 2
+move.w    #135,-(sp)       ; Offset 0
+trap      #14              ; XBIOS aufrufen
+addq.l    #6,sp            ; Stack korrigieren
+
+ +
+ +

4.19.9 setmode

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »setmode« - Modus für Aufnahme bzw. Wiedergabe wählen +
  +
Xbiosnummer: 132 +
  +
Deklaration: int32_t setmode( int16_t mode ); +
  +
Beschreibung: Die XBIOS-Routine setmode gibt die Art des Aufnahme- und +Wiedergabemodus an: +
  +

+
+ + + + + + + + + + + + + + + + +
modeBedeutung
0 8 Bit Stereo
116 Bit Stereo
2 8 Bit Mono
+
+ +
Ist Bit 5 im '_SND' Cookie gesetzt stehen evtl. noch weitere +modi zur Verfügung, die getrennt in low und high byte von +mode den Wiedergabe und Aufnahme modus einstellen. Wird für +mode der Wert -1 übergeben, wird die aktuelle Einstellung +ohne Änderung zurückgegeben. +
  +
0x0003 16 Bit Mono Wiedergabe +
0x0004 24 Bit Stereo Wiedergabe +
0x0005 32 Bit Stereo Wiedergabe +
0x0006 24 Bit Mono Wiedergabe +
0x0007 32 Bit Mono Wiedergabe +
+
  +
0x0000 16 Bit Stereo Aufnahme +
0x0100  8 Bit Stereo Aufnahme +
0x0200  8 Bit Mono Aufnahme +
0x0300 16 Bit Mono Aufnahme +
0x0400 24 Bit Stereo Aufnahme +
0x0500 32 Bit Stereo Aufnahme +
0x0600 24 Bit Mono Aufnahme +
0x0700 32 Bit Mono Aufnahme +
+
  +
Ergebnis: Die Funktion liefert im positiven Fall den Wert 0 zurück. +
  +
Verfügbar: Die Funktion ist nur auf Computern der Falcon-Serie verfügbar +oder bei erweiterten XBiosroutinen (_SND). +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding   buffoper   buffptr   devconnect   dsptristate   gpio   +locksnd   setbuffer   setinterrupt   setmontracks   settracks   +sndstatus   soundcmd   unlocksnd +
  + +
+ +

4.19.9.1 Bindings für setmode

+ + + + + + +
C: #include <tos.h> +
  +
int32_t setmode( int16_t mode ); +
  +
Assembler: +
  +
move.w    mode,-(sp)   ; Offset 2
+move.w    #132,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.19.10 setmontracks

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »setmontracks« - Wiedergabespur für internen Lautsprecher +festlegen +
  +
Xbiosnummer: 134 +
  +
Deklaration: int32_t setmontracks( int16_t montrack ); +
  +
Beschreibung: Die XBIOS-Routine setmontracks legt fest, daß die Ausgabe +einer bestimmten Spur über den internen Lautsprecher erfolgen soll. +Dieser kann jeweils nur eine Spur wiedergeben. +
  +
montrack bestimmt eine der vier möglichen Spuren. Diese +sind von 0 bis 3 durchnumeriert. +
  +
Ergebnis: Die Funktion liefert im positiven Fall den Wert 0 zurück. +
  +
Verfügbar: Die Funktion ist nur auf Computern der Falcon-Serie verfügbar +oder bei erweiterten XBiosroutinen (_SND). +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding   buffoper   buffptr   devconnect   dsptristate   gpio   +locksnd   setbuffer   setinterrupt   setmode   settracks   sndstatus   +soundcmd   unlocksnd +
  + +
+ +

4.19.10.1 Bindings für setmontracks

+ + + + + + +
C: #include <tos.h> +
  +
int32_t setmontracks( int16_t montrack ); +
  +
Assembler: +
  +
move.w    montrack,-(sp)  ; Offset 2
+move.w    #134,-(sp)      ; Offset 0
+trap      #14             ; XBIOS aufrufen
+addq.l    #4,sp           ; Stack korrigieren
+
+ +
+ +

4.19.11 settracks

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »settracks« - Anzahl der Spuren festlegen +
  +
Xbiosnummer: 133 +
  +
Deklaration: int32_t settracks( int16_t playtracks, int16_t rectracks ); +
  +
Beschreibung: Die XBIOS-Routine settracks setzt die Anzahl der Aufnahme- +(rectracks) und Wiedergabespuren (playtracks). Es +stehen maximal je 4 Spuren zur Verfügung. Als Argument wird die +Anzahl - 1 übergeben! +
  +
Ergebnis: Die Funktion liefert im positiven Fall den Wert 0 zurück. +
  +
Verfügbar: Die Funktion ist nur auf Computern der Falcon-Serie verfügbar. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding   buffoper   buffptr   devconnect   dsptristate   gpio   +locksnd   setbuffer   setinterrupt   setmontracks   setmode   +sndstatus   soundcmd   unlocksnd +
  + +
+ +

4.19.11.1 Bindings für settracks

+ + + + + + +
C: #include <tos.h> +
  +
int32_t settracks( int16_t playtracks, int16_t rectracks ); +
  +
Assembler: +
  +
move.w    rectracks,-(sp)   ; Offset 4
+move.w    playtracks,-(sp)  ; Offset 2
+move.w    #133,-(sp)        ; Offset 0
+trap      #14               ; XBIOS aufrufen
+addq.l    #6,sp             ; Stack korrigieren
+
+ +
+ +

4.19.12 sndstatus

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »sndstatus« - Status des A/D und D/A Wandlers ermitteln +
  +
Xbiosnummer: 140 +
  +
Deklaration: int16_t sndstatus( int16_t reset ); +
  +
Beschreibung: Die XBIOS-Routine sndstatus ermittelt den aktuellen Status des +A/D- und D/A-Wandlers. Sie kann diesen ebenfalls neu initialisieren. +
  +
Hat reset den Wert 1 wird der A/D- und D/A-Wandler neu +initialisiert (unter anderem werden die Überlaufbits gelöscht). +Andernfalls wird der aktuelle Status ermittelt. +
  +
Ist Bit 5 im '_SND' Cookie gesetzt stehen noch weitere +Statusabfragen zur Verfügung. +
  +
reset  Funktion
+        return
+
+ 2     Bittiefen abfragen.
+        Bit  0 gesetzt: 8Bit
+        Bit  1 gesetzt: 16Bit
+        Bit  2 gesetzt: 24Bit
+        Bit  3 gesetzt: 32Bit
+
+ 3     Für MasterMix-Ausgang vorhandene Eingänge erfragen.
+        Bit  0 gesetzt: A/D-Wandler (ADC-InMix bypass)
+        Bit  1 gesetzt: D/A-Wandler (DAC/Multiplexer)
+        Bit  2 gesetzt: Mic
+        Bit  3 gesetzt: FM-Generator
+        Bit  4 gesetzt: Line
+        Bit  5 gesetzt: CD
+        Bit  6 gesetzt: TV
+        Bit  7 gesetzt: Aux1
+
+ 4     Für A/D-Wandler vorhandene Eingänge erfragen.
+        Bit  0 gesetzt: Mic rechts
+        Bit  1 gesetzt: Mic links
+        Bit  2 gesetzt: FM-Generator rechts
+        Bit  3 gesetzt: FM-Generator links
+        Bit  4 gesetzt: Line rechts
+        Bit  5 gesetzt: Line links
+        Bit  6 gesetzt: CD rechts
+        Bit  7 gesetzt: CD links
+        Bit  8 gesetzt: TV rechts
+        Bit  9 gesetzt: TV links
+        Bit 10 gesetzt: Aux1 rechts
+        Bit 11 gesetzt: Aux1 links
+        Bit 12 gesetzt: Mixer rechts (MasterMix)
+        Bit 13 gesetzt: Mixer links (MasterMix)
+
+        Bit 16 gesetzt: D/A-Wandler rechts
+        Bit 17 gesetzt: D/A-Wandler links
+
+ 5     Duplexbetrieb erfragen.
+        Bit  0 gesetzt: Aufnahme/Wiedergabe gleichzeitig
+                        möglich
+
+ 8     8 Bit Sampleformate erfragen
+ 9     16 Bit Sampleformate erfragen
+10     24 Bit Sampleformate erfragen
+11     32 Bit Sampleformate erfragen
+        Bit  0 gesetzt: signed
+        Bit  1 gesetzt: unsigned
+        Bit  2 gesetzt: Motorola bigendian wenn > 8Bit
+        Bit  3 gesetzt: Intel littleendian wenn > 8Bit
+
+0x8900 Wert der Falcon 030 Register 0xff8900 und 0xff8901
+       abfragen.
+        %0000 xxxx 00xx 00xx
+              ||||   ||   ||
+              ||||   ||   ||>Playback enable
+              ||||   ||   |>Playback repeat
+              ||||   ||>Record enable
+              ||||   |>Record repeat
+              ||||>MFP-15 Int at Playback end
+              |||>MFP-15 Int at Record end
+              ||>Timer A Int at Playback end
+              |>Timer A Int at Record end
+
+0x8902 Wert der Falcon 030 Register 0xff8902, 0xff8904
+       und 0xff8906 abfragen.
+        ret = Frame Base Address
+
+0x890e Wert der Falcon 030 Register 0xff890e, 0xff8910
+       und 0xff8912 abfragen.
+        ret = Frame End Address
+
+0x8920 Wert der Falcon 030 Register 0xff8920 und
+       0xff8921 abfragen.
+        %00xx 00xx xx00 00xx
+           ||   || ||     ||
+           ||   || ||     ||>00 = 6258 Hz
+           ||   || ||     ||>01 = 12517 Hz
+           ||   || ||     ||>10 = 25033 Hz
+           ||   || ||     ||>11 = 50066 Hz
+           ||   || ||>00 = 8-bit Stereo
+           ||   || ||>01 = 16-bit Stereo
+           ||   || ||>10 = 8-bit Mono
+           ||   || ||>11 = 16-bit Mono
+           ||   ||>Play Tracks
+           ||>Monitor Track
+
+
Ergebnis: Liegt kein Fehler vor erhält man als Ergebnis den Wert Null. +Ansonsten stellt das Resultat einen Bitvektor dar, der sich wie folgt +entschlüsselt: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
BitsBedeutung
0-31  Ungültiges Kontrollfeld
  2  Ungültiges Syncformat
  3  Ungültiger Takt
4Linker Überlauf
5Rechter Überlauf
+
+ +
Verfügbar: Die Funktion ist nur auf Computern der Falcon-Serie verfügbar +oder bei erweiterten XBiosroutinen (_SND). +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding   buffoper   buffptr   devconnect   dsptristate   gpio   +locksnd   setbuffer   setinterrupt   setmontracks   setmode   +settracks   soundcmd   unlocksnd +
  + +
+ +

4.19.12.1 Bindings für sndstatus

+ + + + + + +
C: #include <tos.h> +
  +
int32_t sndstatus( int16_t reset ); +
  +
Assembler: +
  +
move.w    reset,-(sp)  ; Offset 2
+move.w    #140,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.19.13 soundcmd

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »soundcmd« - Parameter des A/D und D/A-Wandlers setzen bzw. +ermitteln +
  +
Xbiosnummer: 130 +
  +
Deklaration: int32_t soundcmd( int16_t mode, int16_t data ); +
int32_t NSoundcmd( int16_t mode, int16_t data, int32_t data2); +
  +
Beschreibung: Die XBIOS-Routine soundcmd setzt bzw. ermittelt die Parameter +des A/D- und D/A-Wandlers. Der Parameter mode bestimmt das +Kommando und data die vorzunehmende Einstellung. +
  + + + + + + + + + + + + + + + + + + + + + + + + +
mode Bedeutung +
  +
0 Abschwächung des linken Ausgabekanals um 1,5 Db Einheiten: +
data = Einheiten << 4; +
  +
1 Abschwächung des rechten Ausgabekanals um 1,5 Db Einheiten: +
data = Einheiten << 4; +
  +
2 Verstärkung des linken Eingabekanals um 1,5 Db Einheiten: +
data = Einheiten << 4; +
  +
3 Verstärkung des rechten Eingabekanals um 1,5 Db Einheiten: +
data = Einheiten << 4; +
  +
4 Eingabequellen des 16-Bit-Hardwareaddierers. Bit 0 von +data repräsentiert den A/D-Wandler und Bit 1 den Multiplexer +
  +
Ist Bit 5 im _SND Cookie gesetzt stehen noch weitere (Master) +Eingänge zur Verfügung. Die Eingänge werden eingeschaltet sowie das +entsprechende Bit auf 1 gesetzt und Bit 14 in data gesetzt +ist. +
  +
Bit 2 von data repräsentiert den Mikrofon Eingang. +
Bit 3 von data repräsentiert den FM-Generator. +
      (FrequenzModulator, OPLx/Wavetable) +
Bit 4 von data repräsentiert den Line Eingang. +
Bit 5 von data repräsentiert den CD Eingang. +
Bit 6 von data repräsentiert den TV Eingang. +
Bit 7 von data repräsentiert den Aux1 Eingang. +
  +
5 Eingabequellen des A/D-Wandlers. Bit 0 steht für den rechten +und Bit 1 für den linken Kanal. Ist ein Bit gesetzt, wird werden die +Daten dem Soundchip entnommen, sonst dem Mikrophon. +
  +
Ist Bit 5 im '_SND' Cookie gesetzt stehen evtl. noch weitere +(A/D-Wandler) Eingänge zur Verfügung. Die Eingänge werden +eingeschaltet sowie das entsprechende Bit auf 0 gesetzt und Bit 14 von +data auf 1 gesetzt ist. +
  +
Bit  2 ist der rechte FM-Generator +
Bit  3 ist der linke FM-Generator +
Bit  4 ist der rechte Line Eingang +
Bit  5 ist der linke Line Eingang +
Bit  6 ist der rechte CD Eingang +
Bit  7 ist der linke CD Eingang +
Bit  8 ist der rechte TV Eingang +
Bit  9 ist der linke TV Eingang +
Bit 10 ist der rechte Aux1 Eingang +
Bit 11 ist der linke Aux1 Eingang +
Bit 12 ist der rechte Mixer Ausgang +
Bit 13 ist der linke Mixer Ausgang +
+
  +
Ist Bit 14 von data auf 1 gesetzt, werden weitere +Eingänge des A/D-Wandlers in data2 erwartet. +
  +
Bit 16 ist der rechte D/A-Wandler Ausgang. +
Bit 17 ist der linke D/A-Wandler Ausgang. +
  +
6 Kompatibilität zum STE-Soundsystem. data wird als +Vorteiler genommen, falls der mittels devconnect eingestellte +Vorteiler gleich Null ist: +
  +

+
+ + + + + + + + + + + + + + + + +
0Vorteiler ist 1280 (6.25 MHz)
1Vorteiler ist 640 (12.5 MHz)
2Vorteiler ist 320 (25 MHz)
3Vorteiler ist 160 (50 MHz)
+
+ + +
+ +
Zusätzliche mode Kommandos wenn Bit 5 im '_SND' Cookie +gesetzt ist. +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 7 Direkteingabe der Samplefrequenz. data wird als +unsigned short interpretiert und kann dann einen Wertebereich von 0 +bis 65534 Hz. einnehmen. +
Ist auch vorhanden, wenn der Cookie McSn gesetzt ist. +
  +
 8 Setzen des 8Bit Sampleformat +
  +
 9 Setzen des 16Bit Sampleformat +
  +
10 Setzen des 24Bit Sampleformat +
  +
11 Setzen des 32Bit Sampleformat +
  +
Folgende Bits stehen zZ. zur Verfügung: +
Bit 0 = signed +
Bit 1 = unsigned +
Bit 2 = Motorola bigendian wenn > 8Bit +
Bit 3 = Intel littleendian wenn > 8Bit +
  +
12 Verstärkung des linken Master Ausgabekanals. +
data = 0 - 255; +
  +
13 Verstärkung des rechten Master Ausgabekanals. +
data = 0 - 255; +
  +
14 Verstärkung des linken Mic Eingabekanals. +
data = 0 - 255; +
  +
15 Verstärkung des rechten Mic Eingabekanals. +
data = 0 - 255; +
  +
16 Verstärkung des linken FM-Generator Eingabekanals. +
data = 0 - 255; +
  +
17 Verstärkung des rechten FM-Generator Eingabekanals. +
data = 0 - 255; +
  +
18 Verstärkung des linken Line Eingabekanals. +
data = 0 - 255; +
  +
19 Verstärkung des rechten Line Eingabekanals. +
data = 0 - 255; +
  +
20 Verstärkung des linken CD Eingabekanals. +
data = 0 - 255; +
  +
21 Verstärkung des rechten CD Eingabekanals. +
data = 0 - 255; +
  +
22 Verstärkung des linken TV Eingabekanals. +
data = 0 - 255; +
  +
23 Verstärkung des rechten TV Eingabekanals. +
data = 0 - 255; +
  +
24 Verstärkung des linken Aux1 Eingabekanals. +
data = 0 - 255; +
  +
25 Verstärkung des rechten Aux1 Eingabekanals. +
data = 0 - 255; +
  + +
+ +
Wird für den Parameter data der Wert -1 übergeben, so +bleibt die Einstellung unverändert. +
  +
NSoundcmd ist eine erweiterte Version von soundcmd +
  +
Ergebnis: Die Funktion liefert die aktuelle Einstellung zurück. +
  +
Verfügbar: Die Funktion ist nur auf Computern der Falcon-Serie verfügbar +oder bei erweiterten XBiosroutinen (_SND). +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding   buffoper   buffptr   devconnect   dsptristate   gpio   +setbuffer   setinterrupt   setmontracks   setmode   settracks   +sndstatus   unlocksnd   locksnd +
  + +
+ +

4.19.13.1 Bindings für soundcmd

+ + + + + + +
C: #include <tos.h> +
  +
int32_t soundcmd( int16_t mode, int16_t data ); +
int32_t NSoundcmd( int16_t mode, int16_t data, int32_t data2); +
  +
Assembler: +
  +
move.w    data,-(sp)   ; Offset 4
+move.w    mode,-(sp)   ; Offset 2
+move.w    #130,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.19.14 StarTrack

+ + + + + + + + + + + + + + + + + + + + + +
Name: »StarTrack« - XBIOS-Erweiterung der StarTrack-Karte +
  +
Xbiosnummer: 500 +
  +
Binding: Bei den einzelnen Unterfunktionen. +
  +
Beschreibung: neue XBIOS-Aufrufe für die Startrack-Soundkarte +
  +
Alle Funktionen gehen über XBIOS-Aufruf 500 (xbs=500) und +teilen sich dann in die verschiedenen Unterfunktionsaufrufe auf. +
  + + + + + + + + + +
play-mode: vergleichbar mit DMA-play beim Falcon +
rec-mode: vergleichbar mit DMA-rec beim Falcon +
bypass-mode: die Ausgänge sind mit den Eingängen verbunden. + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  1 installed Cookie XBIOS-Treiber +
 10 cardslot +
 11 cardsel Soundkarte auswählen +
 12 cardmagic Soundkarten-magic auslesen +
13 cardadr Soundkarten-Adressen +
20 digana Digital/Analogeingang +
21 digcom Digitalquelle +
22 dspmode DSP routing No/Input/Output +
23 sclock Samplerate +
24 highsrate High sampling +
25 bypass Bypass/sample playback +
26 recmode Aufnahme-Modus +
27 playmode Wiedergabe-Modus +
28 mode24 Matrix-Datengröße (16/24Bit) +
30 digmode digitaloutput consumer/professional +
31 scmsmode Clear SCMS +
32 mycopybit eigener SCMS-Kopierschutz no/one/all +
33 emphasis De-emphasis +
40 digsrate Samplerate-erkennung vom digitalinput +
41 digcode Digitalinput-Aufnahmeart-Code +
42 errorcode Digitalinput-Fehlercode +
43 cblmode Matrix auf CBL-Mode umstellen +
44 cblread Auslesen der Channel Status-Bytes +
45 recstat recfifo-status +
46 playstat playfifo-status +
50 volad Volume-controller für input +
51 volda Volume-controller für output +
52 readsmp Sample lesen +
53 writesmp Sample schreiben +
54 intact interrupt-freigabe für FIFO +
55 dspintact interrupt-freigabe für DSP +
60 sysreset record-FIFO löschen, Offset-Abgleich & Kickstart für D/A +Reset für A/D, D/A,Volume-Controller, Digital SP/DIF-Chips +
61 dspreset Reset für DSP +
70 dspmemory DSP-Memorymodus +
71 clkdivide DSP-Taktteiler +
72 pathset DSP-Verbindungen +
73 dsp_hostcommand DSP-Hostkommando starten +
74 dspclear liest DSP-Empfangsbuffer aus +
100 mix mixt 2,4,6 oder 8 Stereokanäle (=4,8,12 oder 16 Tracks) zu +einem Stereokanal zusammen +
101 dspmix mixt bzw. verzahnt Stereokanäle (4,8 oder 16 Tracks) zu +Falcon-kompatiblen 128Bit-Wörtern +
110 monitor record & play-bypass +
111 recwait Warten auf autorecord-schwellwert +
112 memrec memory-record ohne Interrupt +
113 memplay memory-play ohne Interrupt +
114 recplay memory record&play ohne Interrupt +
115 hardrec HD-record ohne Interrupt +
116 hardplay HD-play ohne Interrupt +
117 hrecplay HD record&play ohne Interrupt +
120 init_peak peakwert-ausgabe im Interrupt +
121 init_imemrec memory-record im Interrupt +
122 init_imemplay memory-play im Interrupt +
123 init_implaymix memory-play & record-mix im Interrupt +
124 init_hrec HD-record im Interrupt +
125 init_hplay HD-play im Interrupt +
126 init_ihplaymix HD-play & record-mix im Interrupt +
130 init_mrecpeak memory-rec & peakausgabe im Interrupt +
131 init_mplaypeak memory-play & peakausgabe im Interrupt +
132 init_mrppeak memory play & record-mix & peakausgabe im Interrupt +
133 init_hrecpeak HD-rec & peakausgabe im Interrupt +
134 init_hplaypeak HD-play & peakausgabe im Interrupt +
135 init_hrppeak HD play & record-mix & peakausgabe im Interrupt +
140 init_xmemrec memory-record im HalfBuffer-System +
141 init_xmemplay memory-play im HalfBuffer-System +
142 init_xmixplay memory-play & mischen mit record im HalfBuffer-System +
143 init_xmemrec4 memory-record im HalfBuffer-System von 4 Kanälen +(analog/digital) +
144 init_xmemplay4 memory-play im HalfBuffer-System von 4 Kanälen +(analog/digital) +
150 peakshake Peakwert-Handshake (=neuen Wert generieren) +
200 read_rlow low-register lesen +
201 read_rhi high-register lesen +
202 read_rdsp dsp-register lesen +
203 read_raes aes-register lesen +
204 read_rint interrupt-register lesen +
210 wr_rlow low-register schreiben +
211 wr_rhi high-register schreiben +
212 wr_rdsp dsp-register schreiben +
213 wr_raes aes-register schreiben +
214 wr_rint interrupt-register schreiben +
220 read_dpath1 dsp dpath1-register lesen +
221 read_dpath2 dsp dpath2-register lesen +
222 read_dport dsp dport-register lesen +
223 read_dconv dsp dconv-register lesen +
224 read_dpdat dsp dpdat-register lesen +
225 read_dclk dsp dclk-register lesen +
230 wr_dpath1 dsp dpath1-register schreiben +
231 wr_dpath2 dsp dpath2-register schreiben +
232 wr_dport dsp dport-register schreiben +
233 wr_dconv dsp dconv-register schreiben +
234 wr_dpdat dsp dpdat-register schreiben +
235 wr_dclk dsp dclk-register schreiben +
300 fastcut Speicherbereich löschen im samplemem +
301 peaksuch peakwert-suche im samplemem +
302 zerono nullstellen-suche im samplemem +
303 fading sample-fading im samplemem + +
+ +
Ergebnis: Bei den einzelnen Unterfunktionen. +
  +
Verfügbar: Die Funktion ist nur auf Computern mit der entsprechenden +Karten und deren Treiber verfügbar. +
  +
Gruppe: Soundroutinen +
  + +
+ +

4.19.15 installed

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »installed« - Cookie XBIOS-Treiber +
  +
Xbiosnummer: 500, 1 +
  +
Deklaration: int32_t xbios ( 500, 1 ); +
  +
Beschreibung: +
  +
Ergebnis: Ist der Wert 0x71273800, dann ist der XBIOS-Treiber +installiert. +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.15.1 Bindings für installed

+ + + + + + +
C: int32_t xbios ( 500, 1 ); +
  +
Assembler: +
  +
move.w    #1,-(sp)     ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.19.16 cardslot

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »cardslot« - +
  +
Xbiosnummer: 500, 10 +
  +
Deklaration: int32_t xbios ( 500, 10 ); +
  +
Beschreibung: +
  +
Ergebnis: Anzahl der installierten Soundkarten (1-8) +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.16.1 Bindings für cardslot

+ + + + + + +
C: int32_t xbios ( 500, 10 ); +
  +
Assembler: +
  +
move.w    #10,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.19.17 cardsel

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »cardsel« - Soundkarte auswählen +
  +
Xbiosnummer: 500, 11 +
  +
Deklaration: int32_t xbios ( 500, 11, int16_t csel ); +
  +
Beschreibung: csel ausgewählte Soundkarte (1-8) +
  +
Wichtig: +
Alle weiteren Funktionsaufrufe beziehen sich auf die hier +selektierte Soundkarte! +
  +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.17.1 Bindings für cardsel

+ + + + + + +
C: int32_t xbios ( 500, 11, int16_t csel ); +
  +
Assembler: +
  +
move.w    csel,-(sp)   ; Offset 4
+move.w    #11,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.19.18 cardmagic

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »cardmagic« - Soundkarten-magic auslesen +
  +
Xbiosnummer: 500, 12 +
  +
Deklaration: int32_t xbios ( 500, 12); +
  +
Beschreibung: +
  +
Ergebnis: +
  + + + + + + + + + + + + + + + + + + +
bit 0 = 1 zweiter Volume-Controller für Ausgang vorhanden +
bit 1 = 1 XLR-Erweiterung vorhanden +
bit 2 = 1 digitale Schnittstellen (SP/DIF) vorhanden +
bit 3 = 1 96kHz-Highsampling möglich +
bit 4 = 1 A/D und D/A-Wandler vorhanden +
bit 5 = 1 DSP56002 vorhanden + +
+ +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.18.1 Bindings für cardmagic

+ + + + + + +
C: int32_t xbios ( 500, 12); +
  +
Assembler: +
  +
move.w    #12,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.19.19 cardadr

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »cardadr« - Soundkarten-Adressen +
  +
Xbiosnummer: 500, 13 +
  +
Deklaration: int32_t xbios ( 500, 13 ); +
  +
Beschreibung: +
  +
Ergebnis: zeigt auf eine Adresse ab der verschiedene Soundkarten-Adressen +abgelegt sind (siehe auch Register-Beschreibung): +
  + + + + + + + + + + + + +
int32_t sample Adresse Sample lesen/schreiben +
int32_t recstat Adresse recordfifo-status +
int32_t playstat Adresse playfifo-status +
int32_t dsp Adresse dsp-Host + +
+ +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.19.1 Bindings für cardadr

+ + + + + + +
C: int32_t xbios ( 500, 13 ); +
  +
Assembler: +
  +
move.w    #13,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.19.20 digana

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »digana« - Digital/Analogeingang +
  +
Xbiosnummer: 500, 20 +
  +
Deklaration: int32_t xbios ( 500, 20, int16_t input ); +
  +
Beschreibung: input: Wahl des Eingangs +
0 - digitalinput +
1 - analoginput +
+
  +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.20.1 Bindings für digana

+ + + + + + +
C: int32_t xbios ( 500, 20, int16_t input ); +
  +
Assembler: +
  +
move.w    input,-(sp)  ; Offset 4
+move.w    #20,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.19.21 digcom

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »digcom« - Digitalquelle +
  +
Xbiosnummer: 500, 21 +
  +
Deklaration: int32_t xbios ( 500, 21, int16_t dq ); +
  +
Beschreibung: dq: Wahl der Digitalquelle +
0 - opto (TOSLINK) +
1 - cinch +
2 - XLR (AES/EBU) +
+
  +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.21.1 Bindings für digcom

+ + + + + + +
C: int32_t xbios ( 500, 21, int16_t dq ); +
  +
Assembler: +
  +
move.w    dq,-(sp)     ; Offset 4
+move.w    #21,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.19.22 dspmode

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »dspmode« - dsprouting no/input/output +
  +
Xbiosnummer: 500, 22 +
  +
Deklaration: int32_t xbios ( 500, 22, int16_t dspmode ); +
  +
Beschreibung: dspmode: Wahl der Einbindung des DSP-output +
0 - dspoff - DSP-output nicht im Signalweg +
1 - dsp_to_rec - DSP-output im record-Signalweg +
2 - dsp_to_play - DSP-output im play-Signalweg +
+
  +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.22.1 Bindings für dspmode

+ + + + + + +
C: int32_t xbios ( 500, 22, int16_t dspmode ); +
  +
Assembler: +
  +
move.w    playstat,-(sp) ; Offset 4
+move.w    #22,-(sp)      ; Offset 2
+move.w    #500,-(sp)     ; Offset 0
+trap      #14            ; XBIOS aufrufen
+addq.l    #6,sp          ; Stack korrigieren
+
+ +
+ +

4.19.23 sclock

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »sclock« - Samplerate +
  +
Xbiosnummer: 500, 23 +
  +
Deklaration: int32_t xbios ( 500, 23, int16_t srate ); +
  +
Beschreibung: srate: Wahl der Einbindung des DSP-output +
0 - digital_pll - input-clock am Digitaleingang benutzen +
1 - 32kHz +
2 - 44.1kHz +
3 - 48kHz +
4 - 8kHz +
5 - 11kHz +
6 - 16kHz +
7 - 16.5kHz +
8 - 22kHz +
9 - 22kHz +
10 - 24kHz +
11 - 33kHz +
12 - ext/768 +
13 - ext/512 +
14 - ext/384 +
15 - ext/256 +
+
  +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.23.1 Bindings für sclock

+ + + + + + +
C: int32_t xbios ( 500, 23, int16_t srate ); +
  +
Assembler: +
  +
move.w    srate,-(sp)  ; Offset 4
+move.w    #23,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.19.24 highsrate

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »highsrate« - highsampling +
  +
Xbiosnummer: 500, 24 +
  +
Deklaration: int32_t xbios ( 500, 24, int16_t hs ); +
  +
Beschreibung: hs: high-sampling mit 96kHz +
0 - kein highsampling +
1 - highsampling wählen +
+
  +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.24.1 Bindings für highsrate

+ + + + + + +
C: int32_t xbios ( 500, 24, int16_t hs ); +
  +
Assembler: +
  +
move.w    hs,-(sp)     ; Offset 4
+move.w    #24,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.19.25 bypass

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »bypass« - bypass/sampleplay +
  +
Xbiosnummer: 500, 25 +
  +
Deklaration: int32_t xbios ( 500, 25, int16_t bypass ); +
  +
Beschreibung: bypass: Ausgangsquelle +
0 - bypass - Ausgänge sind mit dem Eingang verbunden +
1 - play - Ausgänge erhalten ihre Daten von der play-hardware +
+
  +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.25.1 Bindings für bypass

+ + + + + + +
C: int32_t xbios ( 500, 25, int16_t bypass ); +
  +
Assembler: +
  +
move.w    bypass,-(sp) ; Offset 4
+move.w    #25,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.19.26 recmode

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »recmode« - Aufnahme-Modus +
  +
Xbiosnummer: 500, 26 +
  +
Deklaration: int32_t xbios ( 500, 26, int16_t mrec ); +
  +
Beschreibung: mrec: Aufnahmeart +
0 - normal - 2 Kanal-Aufnahme im 64Bit-Mode +
1 - four - 4 Kanal-Aufnahme im 64Bit-Mode über A/D und Digital-In +
2 - eight - 8 Kanal-Aufnhame im 128Bit-Mode +
+
  +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.26.1 Bindings für recmode

+ + + + + + +
C: int32_t xbios ( 500, 26, int16_t mrec ); +
  +
Assembler: +
  +
move.w    mrec,-(sp)   ; Offset 4
+move.w    #26,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.19.27 playmode

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »playmode« - Wiedergabe-Modus +
  +
Xbiosnummer: 500, 27 +
  +
Deklaration: int32_t xbios ( 500, 27, int16_t mplay ); +
  +
Beschreibung: mplay: Wiedergabeart +
0 - normal - 2 Kanal-Wiedergabe im 64Bit-Mode +
1 - four - 4 Kanal-Wiedergabe im 64Bit-Mode über D/A und +Digital-Out +
2 - eight - 8 Kanal-Wiedergabe im 128Bit-Mode +
3 - sixteen - 16 Kanal-Wiedergabe im 128Bit-Mode +
+
  +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.27.1 Bindings für playmode

+ + + + + + +
C: int32_t xbios ( 500, 27, int16_t mplay ); +
  +
Assembler: +
  +
move.w    mplay,-(sp)  ; Offset 4
+move.w    #27,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.19.28 mode24

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »mode24« - Matrix-Datengröße (16/24Bit) +
  +
Xbiosnummer: 500, 28 +
  +
Deklaration: int32_t xbios ( 500, 28, int16_t mode24 ); +
  +
Beschreibung: mode24: Matrix-Datenart +
0 - normal - 16Bit-Datenübertragung +
1 - extended - 24Bit-Datenübertragung +
+
  +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.28.1 Bindings für mode24

+ + + + + + +
C: int32_t xbios ( 500, 28, int16_t mode24 ); +
  +
Assembler: +
  +
move.w    mode24,-(sp) ; Offset 4
+move.w    #28,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #8,sp        ; Stack korrigieren
+
+ +
+ +

4.19.29 digmode

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »digmode« - digitaloutput consumer/professional +
  +
Xbiosnummer: 500, 30 +
  +
Deklaration: int32_t xbios ( 500, 30, int16_t digmode ); +
  +
Beschreibung: digmode: Wahl des SP/DIF-Outputformat +
0 - consumer - Ausgabe im Consumer-Format (HIFI-Geräte) +
1 - professional - Ausgabe im Professional-Format (Studiogeräte) +
+
  +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.29.1 Bindings für digmode

+ + + + + + +
C: int32_t xbios ( 500, 30, int16_t digmode ); +
  +
Assembler: +
  +
move.w    digmode,-(sp) ; Offset 4
+move.w    #30,-(sp)     ; Offset 2
+move.w    #500,-(sp)    ; Offset 0
+trap      #14           ; XBIOS aufrufen
+addq.l    #6,sp         ; Stack korrigieren
+
+ +
+ +

4.19.30 scmsmode

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »scmsmode« - clear SCMS +
  +
Xbiosnummer: 500, 31 +
  +
Deklaration: int32_t xbios ( 500, 31, int16_t scmsmode ); +
  +
Beschreibung: scmsmode: Kopierschutz +
0 - bypass - digitale Eingangsdaten unverändert zum Ausgang +leiten +
1 - clear - SCMS-Kopierschutz vollständig entfernen +
+
  +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.30.1 Bindings für scmsmode

+ + + + + + +
C: int32_t xbios ( 500, 31, int16_t scmsmode ); +
  +
Assembler: +
  +
move.w    scmsmode,-(sp) ; Offset 4
+move.w    #31,-(sp)      ; Offset 2
+move.w    #500,-(sp)     ; Offset 0
+trap      #14            ; XBIOS aufrufen
+addq.l    #6,sp          ; Stack korrigieren
+
+ +
+ +

4.19.31 mycopybit

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »mycopybit« - eigener SCMS-Kopierschutz no/one/all +
  +
Xbiosnummer: 500, 32 +
  +
Deklaration: int32_t xbios ( 500, 32, int16_t myscms ); +
  +
Beschreibung: myscms: Kopierschutz für digitalausgang im play-mode +(für Eigenaufnahmen) +
0 - no - kein kopieren möglich +
1 - one - einmal kopieren möglich +
2 - all - kein Kopierschutz, freies kopieren möglich +
+
  +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.31.1 Bindings für mycopybit

+ + + + + + +
C: int32_t xbios ( 500, 32, int16_t myscms ); +
  +
Assembler: +
  +
move.w    myscms,-(sp) ; Offset 4
+move.w    #32,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.19.32 emphasis

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »emphasis« - de-emphasis +
  +
Xbiosnummer: 500, 33 +
  +
Deklaration: int32_t xbios ( 500, 33, int16_t emph ); +
  +
Beschreibung: emph: De-Emphasis(Höhenabsenkung), wirkt auf +Digitalausgang (im play-mode) und Analogausgang +
0 - normal - keine Höhenabsenkung +
1 - de-emphasis - Höhenabsenkung +
+
  +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.32.1 Bindings für emphasis

+ + + + + + +
C: int32_t xbios ( 500, 33, int16_t emph ); +
  +
Assembler: +
  +
move.w    emph,-(sp)   ; Offset 4
+move.w    #33,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.19.33 digsrate

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »digsrate« - samplerate-erkennung vom digitalinput +
  +
Xbiosnummer: 500, 40 +
  +
Deklaration: int32_t xbios ( 500, 40 ); +
  +
Beschreibung: +
  +
Ergebnis: 0 -> ungültig +
1 -> 32kHz +
2 -> 44.1kHz +
3 -> 48kHz +
+
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.33.1 Bindings für digsrate

+ + + + + + +
C: int32_t xbios ( 500, 40 ); +
  +
Assembler: +
  +
move.w    #40,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.19.34 digcode

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »digcode« - Digitalinput-Aufnahmeart-Code +
  +
Xbiosnummer: 500, 41 +
  +
Deklaration: int32_t xbios ( 500, 41 ); +
  +
Beschreibung: +
  +
Ergebnis: +
  + + + + + + + + + + + + +
bit 0 0 = professional +
1 = consumer +
bit 1 0 = data +
1 = audio +
bit 2 0 = no copy-prohibit = SCMS not active +
1 = copy prohibit=SCMS active +
bit 3 0 = no emphasis +
1 = emphasis active + +
+ +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.34.1 Bindings für digcode

+ + + + + + +
C: int32_t xbios ( 500, 41 ); +
  +
Assembler: +
  +
move.w    #41,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.19.35 errorcode

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »errorcode« - Digitalinput-Fehlercode +
  +
Xbiosnummer: 500, 42 +
  +
Deklaration: int32_t xbios ( 500, 42 ); +
  +
Beschreibung: +
  +
Ergebnis: 0 -> no error +
1 -> validity bit high +
2 -> confidence flag +
3 -> slipped sample +
4 -> CRC-error +
5 -> parity error +
6 -> biphase coding error +
7 -> no lock +
+
  +
Siehe dazu auch das CS8412-Manual von Crystal +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.35.1 Bindings für errorcode

+ + + + + + +
C: int32_t xbios ( 500, 42 ); +
  +
Assembler: +
  +
move.w    #42,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.19.36 cblmode

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »cblmode« - Matrix auf CBL-Mode umstellen +
  +
Xbiosnummer: 500, 43 +
  +
Deklaration: int32_t xbios ( 500, 43, int16_t cblmode ); +
  +
Beschreibung: cblmode: Channel Status-Block Readmodus +
0 - normal - kein cbl-modus, Matrix transportiert sounddaten +
1 - cblread - cbl-modus, Matrix transportiert statutbits vom +digital-input +
+
  +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.36.1 Bindings für cblmode

+ + + + + + +
C: int32_t xbios ( 500, 43, int16_t cblmode ); +
  +
Assembler: +
  +
move.w    cblmode,-(sp) ; Offset 4
+move.w    #43,-(sp)     ; Offset 2
+move.w    #500,-(sp)    ; Offset 0
+trap      #14           ; XBIOS aufrufen
+addq.l    #6,sp         ; Stack korrigieren
+
+ +
+ +

4.19.37 cblread

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »cblread« - Auslesen der Channel Status-Bytes +
  +
Xbiosnummer: 500, 44 +
  +
Deklaration: int32_t xbios ( 500, 44 ); +
  +
Beschreibung: +
  +
Ergebnis: zeigt auf eine Adresse ab der die 24 Statusbytes abgelegt sind: +
  +
int8_t cbl0 : Channel Statusbyte 0 : Bit 7 -> +Channel-Statusbit 0 +
int8_t cbl0 : Channel Statusbyte 0 : Bit 6 -> Channel-Statusbit +1 +
int8_t cbl0 : Channel Statusbyte 0 : Bit 5 -> Channel-Statusbit +2 +
int8_t cbl0 : Channel Statusbyte 0 : Bit 4 -> Channel-Statusbit +3 +
int8_t cbl0 : Channel Statusbyte 0 : Bit 3 -> Channel-Statusbit +4 +
int8_t cbl0 : Channel Statusbyte 0 : Bit 2 -> Channel-Statusbit +5 +
int8_t cbl0 : Channel Statusbyte 0 : Bit 1 -> Channel-Statusbit +6 +
int8_t cbl0 : Channel Statusbyte 0 : Bit 0 -> Channel-Statusbit +7 +
... int8_t cbl23 : Channel Statusbyte 23 +
+
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.37.1 Bindings für cblread

+ + + + + + +
C: int32_t xbios ( 500, 44 ); +
  +
Assembler: +
  +
move.w    #44,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.19.38 recstat

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »recstat« - recfifo-status +
  +
Xbiosnummer: 500, 45 +
  +
Deklaration: int32_t xbios ( 500, 45 ); +
  +
Beschreibung: +
  +
Ergebnis: +
  + + + + + + + + + +
bit 0 0 = FIFO leer +
1 = FIFO nicht leer +
bit 1 0 = FIFO mehr als halb gefüllt,löst Interrupt aus +
1 = FIFO weniger/bis halb gefüllt +
bit 2 0 = FIFO voll +
1 = FIFO nicht voll + +
+ +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.38.1 Bindings für recstat

+ + + + + + +
C: int32_t xbios ( 500, 45 ); +
  +
Assembler: +
  +
move.w    #45,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.19.39 playstat

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »playstat« - playfifo-status +
  +
Xbiosnummer: 500, 46 +
  +
Deklaration: int32_t xbios ( 500, 46 ); +
  +
Beschreibung: +
  +
Ergebnis: +
  + + + + + + + + + +
bit 0 0 = FIFO leer +
1 = FIFO nicht leer +
bit 1 0 = FIFO mehr als halb gefüllt +
1 = FIFO weniger/bis halb gefüllt,löst Interrupt aus +
bit 2 0 = FIFO voll +
1 = FIFO nicht voll + +
+ +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.39.1 Bindings für playstat

+ + + + + + +
C: int32_t xbios ( 500, 46 ); +
  +
Assembler: +
  +
move.w    #46,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.19.40 volad

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »volad« - volume-controller für input +
  +
Xbiosnummer: 500, 50 +
  +
Deklaration: int32_t xbios ( 500, 50, int16_t lvol, int16_t rvol ); +
  +
Beschreibung: lvol: Lautstärke linker Kanal in 0.5dB-Schritten +(0-255) +
rvol: Lautstärke rechter Kanal in 0.5dB-Schritten (0-255) +
  +
Die Volume-Controller können im Bereich von -96 bis +32dB +regeln: +
  +

+
+ + + + + + + + + + + + + + + + +
WertdB
0-96
1920
255+31.5
+
+ +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.40.1 Bindings für volad

+ + + + + + +
C: int32_t xbios ( 500, 50, int16_t lvol, int16_t rvol ); +
  +
Assembler: +
  +
move.w    rvol,-(sp)   ; Offset 6
+move.w    lvol,-(sp)   ; Offset 4
+move.w    #50,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #8,sp        ; Stack korrigieren
+
+ +
+ +

4.19.41 volda

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »volda« - volume-controller für output +
  +
Xbiosnummer: 500, 51 +
  +
Deklaration: int32_t xbios ( 500, 51, int16_t lvol, int16_t rvol ); +
  +
Beschreibung: lvol: Lautstärke linker Kanal in 0.5dB-Schritten +(0-255) +
rvol: Lautstärke rechter Kanal in 0.5dB-Schritten (0-255) +
  +
Die Volume-Controller können im Bereich von -96 bis +32dB +regeln: +
  +

+
+ + + + + + + + + + + + + + + + +
WertdB
0-96
1920
255+31.5
+
+ +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.41.1 Bindings für volda

+ + + + + + +
C: int32_t xbios ( 500, 51, int16_t lvol, int16_t rvol ); +
  +
Assembler: +
  +
move.w    rvol,-(sp)   ; Offset 6
+move.w    lvol,-(sp)   ; Offset 4
+move.w    #51,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #8,sp        ; Stack korrigieren
+
+ +
+ +

4.19.42 readsmp

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »readsmp« - sample lesen ? +
  +
Xbiosnummer: 500, 52 +
  +
Deklaration: int32_t xbios ( 500, 52 ); +
  +
Beschreibung: +
  +
Ergebnis: Adresse Rückgabewerte, -1=Fehler +
int16_t 0 links +
int16_t 2 rechts +
+
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.42.1 Bindings für readsmp

+ + + + + + +
C: int32_t xbios ( 500, 52 ); +
  +
Assembler: +
  +
move.w    #52,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.19.43 writesmp

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »writesmp« - sample schreiben ? +
  +
Xbiosnummer: 500, 53 +
  +
Deklaration: int32_t xbios ( 500, 53, int16_t left, int16_t right ); +
  +
Beschreibung: left : Samplewert links +
right: Samplewert rechts +
  +
Ergebnis: 0 - kein Fehler +
  +
Gruppe: Soundroutinen +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Querverweis: Binding +
  + +
+ +

4.19.43.1 Bindings für writesmp

+ + + + + + +
C: int32_t xbios ( 500, 53, int16_t left, int16_t right ); +
  +
Assembler: +
  +
move.w    right,-(sp)  ; Offset 6
+move.w    left,-(sp)   ; Offset 4
+move.w    #53,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #8,sp        ; Stack korrigieren
+
+ +
+ +

4.19.44 intact

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »intact« - interrupt-freigabe für FIFO +
  +
Xbiosnummer: 500, 54 +
  +
Deklaration: int32_t xbios ( 500, 54, int16_t int ); +
  +
Beschreibung: int: +
  + + + + + + +
bit 0 0 = play stoppen +
1 = play starten +
bit 1 0 = rec stoppen +
1 = rec starten + +
+ +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.44.1 Bindings für intact

+ + + + + + +
C: int32_t xbios ( 500, 54, int16_t int ); +
  +
Assembler: +
  +
move.w    int,-(sp)    ; Offset 4
+move.w    #54,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.19.45 dspintact

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »dspintact« - interrupt-freigabe für DSP +
  +
Xbiosnummer: 500, 55 +
  +
Deklaration: int32_t xbios ( 500, 55, int16_t dint ); +
  +
Beschreibung: dint: +
  + + + + + + +
bit 0 0 = dspreceive stoppen +
1 = dspreceive starten +
bit 1 0 = dsptransmit stoppen +
1 = dsptransmit starten + +
+ +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.45.1 Bindings für dspintact

+ + + + + + +
C: int32_t xbios ( 500, 55, int16_t dint ); +
  +
Assembler: +
  +
move.w    dint,-(sp)   ; Offset 4
+move.w    #55,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.19.46 sysreset

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »sysreset« - record-FIFO löschen +
  +
Xbiosnummer: 500, 60 +
  +
Deklaration: int32_t xbios ( 500, 60 ); +
  +
Beschreibung: Record-FIFO löschen, Offset-Abgleich & Kickstart für D/A, +Reset für A/D, D/A, Volume-Controller, Digital SP/DIF-Chips +
  +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.46.1 Bindings für sysreset

+ + + + + + +
C: int32_t xbios ( 500, 60 ); +
  +
Assembler: +
  +
move.w    #60,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.19.47 dspreset

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »dspreset« - reset für DSP +
  +
Xbiosnummer: 500, 61 +
  +
Deklaration: int32_t xbios ( 500, 61 ); +
  +
Beschreibung: +
  +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.47.1 Bindings für dspreset

+ + + + + + +
C: int32_t xbios ( 500, 61 ); +
  +
Assembler: +
  +
move.w    #61,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.19.48 dspmemory

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »dspmemory« - DSP-Memorymodus +
  +
Xbiosnummer: 500, 70 +
  +
Deklaration: int32_t xbios ( 500, 70, int16_t dspmem ); +
  +
Beschreibung: dspmem: DSP-Memorymodus +
0 - normal - 32Kx24Bit Falconkompatibler Modus +
1 - big - 128Kx24Bit erweiterter Modus +
+
  +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.48.1 Bindings für dspmemory

+ + + + + + +
C: int32_t xbios ( 500, 70, int16_t dspmem ); +
  +
Assembler: +
  +
move.w    dspmem,-(sp) ; Offset 4
+move.w    #70,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.19.49 clkdivide

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »clkdivide« - DSP-Taktteiler +
  +
Xbiosnummer: 500, 71 +
  +
Deklaration: int32_t xbios ( 500, 71, int16_t clkdiv ); +
  +
Beschreibung: clkdiv: DSP-Taktteilungsfaktor +
+
  +
Takt von CKOUT des DSP (bei 25.175 MHz DSP-Takt)
+Input -> ICLK_Output/Wandler_Vorteiler -> Samplerate
+clkdiv        -> Output        -> Samplerate
+----------------------------------------------------
+0000=CKOUT/1  -> 25.175MHz/512 -> 49170 Hz
+0001=CKOUT/2  -> 12.587MHz/256 -> 49170 Hz
+0010=CKOUT/2  -> 12.587MHz/256 -> 49170 Hz
+0011=CKOUT/3  ->  8.392MHz/256 -> 32780 Hz
+0100=CKOUT/4  ->  6.294MHz/256 -> 24585 Hz
+0101=CKOUT/5  ->  5.035MHz/256 -> 19668 Hz
+0110=CKOUT/6  ->  4.196MHz/256 -> 16390 Hz
+0111=CKOUT/7  ->  3.596MHz/256 -> 14049 Hz
+1000=CKOUT/8  ->  3.147MHz/256 -> 12292 Hz
+1001=CKOUT/9  ->  2.797MHz/256 -> 10927 Hz
+1010=CKOUT/10 ->  2.518MHz/256 ->  9833 Hz
+1011=CKOUT/11 ->  2.289MHz/256 ->  8940 Hz
+1100=CKOUT/12 ->  2.098MHz/256 ->  8195 Hz
+1101=CKOUT/13 ->  1.937MHz/256 ->  7565 Hz
+1110=CKOUT/14 ->  1.798MHz/256 ->  7024 Hz
+1111=CKOUT/15 ->  1.678MHz/256 ->  6556 Hz
+
+Takt von CKOUT des DSP (bei 66.00 MHz DSP-Takt)
+Input -> ICLK_Output/Wandler_Vorteiler -> Samplerate
+clkdiv        -> Output        -> Samplerate
+----------------------------------------------------
+0000=CKOUT/1  -> 66.000MHz/768 ->  85938 Hz
+0001=CKOUT/2  -> 33.000MHz/512 ->  64453 Hz
+0010=CKOUT/2  -> 33.000MHz/512 ->  64453 Hz
+0011=CKOUT/3  -> 22.000MHz/512 ->  42969 Hz
+0100=CKOUT/4  -> 16.500MHz/512 ->  32227 Hz
+0101=CKOUT/5  -> 13.200MHz/512 ->  25781 Hz
+0110=CKOUT/6  -> 11.000MHz/512 ->  21484 Hz
+0111=CKOUT/7  ->  9.428MHz/512 ->  18415 Hz
+1000=CKOUT/8  ->  8.250MHz/512 ->  16113 Hz
+1001=CKOUT/9  ->  7.333MHz/512 ->  14323 Hz
+1010=CKOUT/10 ->  6.600MHz/512 ->  12891 Hz
+1011=CKOUT/11 ->  6.000MHz/512 ->  11719 Hz
+1100=CKOUT/12 ->  5.500MHz/512 ->  10742 Hz
+1101=CKOUT/13 ->  5.077MHz/512 ->   9916 Hz
+1110=CKOUT/14 ->  4.714MHz/512 ->   9208 Hz
+1111=CKOUT/15 ->  4.400MHz/512 ->   8594 Hz
+
+
Weitere Taktraten sind möglich (Wandler_Vorteiler /256, /384, +/512 und /768 sind nutzbar, also insg. 64 neue Taktraten durch +CLKDIV!) +
  +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.49.1 Bindings für clkdivide

+ + + + + + +
C: int32_t xbios ( 500, 71, int16_t clkdiv ); +
  +
Assembler: +
  +
move.w    clkdiv,-(sp) ; Offset 4
+move.w    #71,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.19.50 pathset

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »pathset« - DSP-Verbindungen +
  +
Xbiosnummer: 500, 72 +
  +
Deklaration: int32_t xbios ( 500, 72, int16_t path ); +
  +
Beschreibung: path: DSP-Verbindungen +
Bit 0 - Verbindung Matrix mit SC0 des DSP (0 = getrennt, 1 = +verbunden) +
Bit 1 - Verbindung Matrix mit SC1 des DSP (0 = getrennt, 1 = +verbunden) +
Bit 2 - Verbindung Matrix mit SC2 des DSP (0 = getrennt, 1 = +verbunden) +
Bit 3 - Verbindung Matrix mit SRD des DSP (0= getrennt, 1 = +verbunden) +
+
  +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.50.1 Bindings für pathset

+ + + + + + +
C: int32_t xbios ( 500, 72, int16_t path ); +
  +
Assembler: +
  +
move.w    path,-(sp)   ; Offset 4
+move.w    #72,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.19.51 dsp_hostcommand

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »dsp_hostcommand« - DSP-Hostkommando starten +
  +
Xbiosnummer: 500, 73 +
  +
Deklaration: int32_t xbios ( 500, 73, int16_t command ); +
  +
Beschreibung: command: DSP-Kommandonummer +
 0 - DSP-Hostkommando (DSP-Adresse $0024,default) +
... +
11 - DSP-Hostkommando (DSP-Adresse $003A) +
14 - DSP-Hostkommando (DSP-Adresse $0040) +
... +
45 - DSP-Hostkommando (DSP-Adresse $007E) +
+
  +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.51.1 Bindings für dsp_hostcommand

+ + + + + + +
C: int32_t xbios ( 500, 73, int16_t command ); +
  +
Assembler: +
  +
move.w    command,-(sp) ; Offset 4
+move.w    #73,-(sp)     ; Offset 2
+move.w    #500,-(sp)    ; Offset 0
+trap      #14           ; XBIOS aufrufen
+addq.l    #6,sp         ; Stack korrigieren
+
+ +
+ +

4.19.52 dspclear

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »dspclear« - liest DSP-Empfangsbuffer aus +
  +
Xbiosnummer: 500, 74 +
  +
Deklaration: int32_t xbios ( 500, 74 ); +
  +
Beschreibung: +
  +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.52.1 Bindings für dspclear

+ + + + + + +
C: int32_t xbios ( 500, 74 ); +
  +
Assembler: +
  +
move.w    #74,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.19.53 mix

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »mix« - mixt 2,4,6 oder 8 Stereokanäle +
  +
Xbiosnummer: 500, 100 +
  +
Deklaration: int32_t xbios ( 500, 100, int16_t channels, int32_t startadr, +int32_t len, int32_t zieladr, int32_t voltab ); +
  +
Beschreibung: Mixt 2, 4, 6 oder 8 Stereokanäle (=4, 8, 12 oder 16 Tracks) zu +einem Stereokanal zusammen +
  + + + + + + + + + + + + + + + +
channels Anzahl der Tracks (4, 8, 12 oder 16) +
startradr Startadresse der zu mischenden Tracks +
len Länge eines Stereotracks +
zieladr Startadresse für den gemischten Stereotrack +
voltab Pointer auf Track-Volume-Wertetabelle +
int8_t VOL-STEREOTRACK1 +
int8_t VOL-STEREOTRACK2 usw. +
... +
int8_t VOL-STEREOTRACK8 +
+ +
+ +
Die zu mischenden Tracks stehen im Speicher als Stereospuren +hintereinander Die Volwert-Tabelle beinhaltet die Lautstärken für +die einzelnen Kanäle im Bereich 0-200: +
  0 = mute +
 50 = halbe Lautstärke +
100 = original Lautstärke +
200 = doppelte Lautstärke +
+
  +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.53.1 Bindings für mix

+ + + + + + +
C: int32_t xbios ( 500, 100, int16_t channels, int32_t startadr, +int32_t len, int32_t zieladr, int32_t voltab ); +
  +
Assembler: +
  +
move.l    voltab,-(sp)     ; Offset 18
+move.l    zieladr,-(sp)    ; Offset 14
+move.l    len,-(sp)        ; Offset 10
+move.l    startdar,-(sp)   ; Offset 6
+move.w    channels,-(sp)   ; Offset 4
+move.w    #100,-(sp)       ; Offset 2
+move.w    #500,-(sp)       ; Offset 0
+trap      #14              ; XBIOS aufrufen
+lea       22(sp),sp        ; Stack korrigieren
+
+ +
+ +

4.19.54 dspmix

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »dspmix« - mixt bzw. verzahnt Stereokanäle +
  +
Xbiosnummer: 500, 101 +
  +
Deklaration: int32_t xbios ( 500, 101, int16_t channels, int32_t startadr, +int32_t len, int32_t zieladr ); +
  +
Beschreibung: Mixt bzw. verzahnt Stereokanäle (4, 8 oder 16 Tracks) zu +Falcon-kompatiblen 128Bit-Wörtern +
  + + + + + + + + + + + + +
channels 4, 8 oder 16 Tracks +
startradr Startadresse der zu mischenden Tracks +
len Länge eines Stereotracks +
zieladr Startadresse für den gemischten Stereotrack + +
+ +
Die zu mischenden Tracks stehen im Speicher als Stereospuren +hintereinander Die Volwert-Tabelle beinhaltet die Lautstärken für +die einzelnen Kanäle im Bereich 0-200: +
  0 = mute +
 50 = halbe Lautstärke +
100 = original Lautstärke +
200 = doppelte Lautstärke +
+
  +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.54.1 Bindings für dspmix

+ + + + + + +
C: int32_t xbios ( 500, 101, int16_t channels, int32_t startadr, +int32_t len, int32_t zieladr ); +
  +
Assembler: +
  +
move.l    zieladr,-(sp)    ; Offset 14
+move.l    len,-(sp)        ; Offset 10
+move.l    startdar,-(sp)   ; Offset 6
+move.w    channels,-(sp)   ; Offset 4
+move.w    #101,-(sp)       ; Offset 2
+move.w    #500,-(sp)       ; Offset 0
+trap      #14              ; XBIOS aufrufen
+lea       18(sp),sp        ; Stack korrigieren
+
+ +
+ +

4.19.55 monitor

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »monitor« - Record & play-bypass +
  +
Xbiosnummer: 500, 110 +
  +
Deklaration: int32_t xbios ( 500, 110 ); +
  +
Beschreibung: +
  +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.55.1 Bindings für monitor

+ + + + + + +
C: int32_t xbios ( 500, 110 ); +
  +
Assembler: +
  +
move.w    #110,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.19.56 recwait

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »recwait« - warten auf autorecord-schwellwert +
  +
Xbiosnummer: 500, 111 +
  +
Deklaration: int32_t xbios ( 500, 111, int16_t treshold ); +
  +
Beschreibung: treshold: Schwellwert (0-32767) +
  +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.56.1 Bindings für recwait

+ + + + + + +
C: int32_t xbios ( 500, 111, int16_t treshold ); +
  +
Assembler: +
  +
move.w    treshold,-(sp)  ; Offset 4
+move.w    #111,-(sp)      ; Offset 2
+move.w    #500,-(sp)      ; Offset 0
+trap      #14             ; XBIOS aufrufen
+addq.l    #6,sp           ; Stack korrigieren
+
+ +
+ +

4.19.57 memrec

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »memrec« - memory-record ohne Interrupt +
  +
Xbiosnummer: 500, 112 +
  +
Deklaration: int32_t xbios ( 500, 112, int32_t startadr, int32_t endadr ); +
  +
Beschreibung: startradr: Aufnahme-Startadresse +
endadr: Aufnahme-Endadresse +
  +
Achtung: Ton geht weg, fehlerhaft! +
  +
Ergebnis: letzte Aufnahme-Speicherposition +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.57.1 Bindings für memrec

+ + + + + + +
C: int32_t xbios ( 500, 112, int32_t startadr, int32_t endadr ); +
  +
Assembler: +
  +
move.l    endadr,-(sp)    ; Offset 8
+move.l    startadr,-(sp)  ; Offset 4
+move.w    #112,-(sp)      ; Offset 2
+move.w    #500,-(sp)      ; Offset 0
+trap      #14             ; XBIOS aufrufen
+lea       12(sp),sp       ; Stack korrigieren
+
+ +
+ +

4.19.58 memplay

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »memplay« - memory-play ohne Interrupt +
  +
Xbiosnummer: 500, 113 +
  +
Deklaration: int32_t xbios ( 500, 113, int32_t startadr, int32_t endadr, +int16_t step, int16_t mode, int16_t midi ); +
  +
Beschreibung: +
  + + + + + + + + + + + + + + + +
startradr Play-Startadresse +
endadr Play-Endadresse (spielt rückwärts wenn endadr<startadr) +
step Geschwindigkeit der Wiedergabe (0..x) +
0 = normal +
1 = doppelte +
2 = dreifache usw... +
mode bit 0 -> loop +
bit 1 -> crossplay +
bit 2 -> MIDI +
midi MIDI-Note, bei der die Wiedergabe starten soll wird nur +angegeben, wenn modebit2 gesetzt ist! + +
+ +
Achtung: MIDI nicht getestet! +
  +
Ergebnis: Adresse Rückgabewerte , -1=Fehler +
int32_t 0 memposition +
int32_t 4 loops (1=einmal gespielt, 2=zweimal usw.) +
Je crossplay = zwei loops (für vorwärts & rückwärts) +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.58.1 Bindings für memplay

+ + + + + + +
C: int32_t xbios ( 500, 113, int32_t startadr, int32_t endadr, +int16_t step, int16_t mode, int16_t midi ); +
  +
Assembler: +
  +
move.w    midi,-(sp)      ; Offset 16
+move.w    mode,-(sp)      ; Offset 14
+move.w    step,-(sp)      ; Offset 12
+move.l    endadr,-(sp)    ; Offset 8
+move.l    startadr,-(sp)  ; Offset 4
+move.w    #113,-(sp)      ; Offset 2
+move.w    #500,-(sp)      ; Offset 0
+trap      #14             ; XBIOS aufrufen
+lea       18(sp),sp       ; Stack korrigieren
+
+ +
+ +

4.19.59 recplay

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »recplay« - memory record&play ohne Interrupt +
  +
Xbiosnummer: 500, 114 +
  +
Deklaration: int32_t xbios ( 500, 114 ); +
  +
Beschreibung: Keine Infos! +
  +
Ergebnis: +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.59.1 Bindings für recplay

+

Unbekannt! +

+ + + + + + +
C: int32_t xbios ( 500, 114 ); +
  +
Assembler: +
  +
move.w    #114,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.19.60 hardrec

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »hardrec« - HD-record ohne Interrupt +
  +
Xbiosnummer: 500, 115 +
  +
Deklaration: int32_t xbios ( 500, 115, int32_t startadr, int32_t len, +int32_t sectors, int16_t handle ); +
  +
Beschreibung: +
  + + + + + + + + + + + + +
startadr Aufnahmebuffer-Startadresse +
len Aufnahmebuffer-Länge bzw. sektoren +
sectors Anzahl der Aufnahmesektoren (bestimmt durch len) +
handle Handle der Aufnahmedatei + +
+ +
Achtung: Aussetzer wegen zu kleinem FIFO! +
  +
Ergebnis: Anzahl komplett geschriebener Sektoren, -1 = Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.60.1 Bindings für hardrec

+ + + + + + +
C: int32_t xbios ( 500, 115, int32_t startadr, int32_t len, +int32_t sectors, int16_t handle ); +
  +
Assembler: +
  +
move.w    handle,-(sp)    ; Offset 18
+move.l    sectors,-(sp)   ; Offset 14
+move.l    len,-(sp)       ; Offset 10
+move.l    startadr,-(sp)  ; Offset 6
+move.w    #115,-(sp)      ; Offset 4
+move.w    #500,-(sp)      ; Offset 0
+trap      #14             ; XBIOS aufrufen
+lea       20(sp),sp       ; Stack korrigieren
+
+ +
+ +

4.19.61 hardplay

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »hardplay« - HD-play ohne Interrupt +
  +
Xbiosnummer: 500, 116 +
  +
Deklaration: int32_t xbios ( 500, 116, int32_t startadr, int32_t len, +int32_t sectors, int32_t seek, int16_t handle, int16_t step, int16_t +mode, int16_t midi ); +
  +
Beschreibung: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
startadr Playbuffer-Startadresse +
len Playbuffer-Länge (spielt rückwärts wenn negativ) +
sectors Anzahl der sektoren +
seek Datei-Startposition +
handle Handle der Playdatei +
step Geschwindigkeit der Wiedergabe (0..x) +
0 = normal +
1 = doppelte +
2 = dreifache usw... +
mode bit 0 -> loop +
bit 1 -> crossplay +
bit 2 -> MIDI +
bit 3 -> break +
midi MIDI-Note, bei der die Wiedergabe starten soll wird nur +angegeben, wenn mode) bit2 gesetzt ist! + +
+ +
Achtung: Aussetzer wegen zu kleinem FIFO! +
Kein Rückwärts-play derzeit! +
  +
Ergebnis: Adresse Rückgabewerte , -1 = Fehler +
int32_t 0 abgespielte sektoren +
int32_t 4 loops (1 = einmal gespielt, 2 = zweimal usw.) +
Je crossplay = zwei loops (für vorwärts & rückwärts) +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.61.1 Bindings für hardplay

+ + + + + + +
C: int32_t xbios ( 500, 116, int32_t startadr, int32_t len, +int32_t sectors, int32_t seek, int16_t handle, int16_t step, int16_t +mode, int16_t midi ); +
  +
Assembler: +
  +
move.w    midi,-(sp)      ; Offset 26
+move.w    mode,-(sp)      ; Offset 24
+move.w    step,-(sp)      ; Offset 22
+move.w    handle,-(sp)    ; Offset 20
+move.l    seek,-(sp)      ; Offset 16
+move.l    sectors,-(sp)   ; Offset 12
+move.l    len,-(sp)       ; Offset 8
+move.l    startadr,-(sp)  ; Offset 4
+move.w    #116,-(sp)      ; Offset 2
+move.w    #500,-(sp)      ; Offset 0
+trap      #14             ; XBIOS aufrufen
+lea       28(sp),sp       ; Stack korrigieren
+
+ +
+ +

4.19.62 hrecplay

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »hrecplay« - HD record&play ohne Interrupt +
  +
Xbiosnummer: 500, 117 +
  +
Binding: Bindings für hrecplay +
  +
Beschreibung: +
  +
Ergebnis: +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.62.1 Bindings für hrecplay

+

Binding unbekannt! +

+ + + + + + +
C: int32_t xbios ( 500, 117 ); +
  +
Assembler: +
  +
move.w    #117,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.19.63 init_peak

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »init_peak « - peakwert-ausgabe im Interrupt +
  +
Xbiosnummer: 500, 120 +
  +
Binding: Bindings für init_peak +
  +
Beschreibung: +
  +
Ergebnis: Adresse Rückgabewerte, -1=Fehler +
int32_t 0 peakwert +
int32_t 8 break (1 = neuer wert zum auslesen bereit. Nach dem +auslesen müssen peakwert und break gelöscht werden!) +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.63.1 Bindings für init_peak

+ + + + + + +
C: int32_t xbios ( 500, 120 ); +
  +
Assembler: +
  +
move.w    #120,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.19.64 init_imemrec

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »init_imemrec« - memory-record im Interrupt +
  +
Xbiosnummer: 500, 121 +
  +
Deklaration: int32_t xbios ( 500, 121, int16_t select, int32_t startadr, +int32_t endadr ); +
  +
Beschreibung: +
  + + + + + + + + + +
select Aufnahmeart +
0 = Aufnahme mit 16Bit über FIFO +
2 = Aufnahme mit 24Bit über FIFO +
startadr Aufnahme-Startadresse +
endadr Aufnahme-Endadresse + +
+ +
Ergebnis: Adresse Rückgabewerte, -1 = Fehler +
int32_t 0 memposition +
int32_t 8 break +
int32_t 12 fehler +
int32_t 24 zählerposition +
+
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.64.1 Bindings für init_imemrec

+ + + + + + +
C: int32_t xbios ( 500, 121, int16_t select, int32_t startadr, +int32_t endadr ); +
  +
Assembler: +
  +
move.l    endadr,-(sp)   ; Offset 10
+move.l    startadr,-(sp) ; Offset 6
+move.w    select,-(sp)   ; Offset 4
+move.w    #121,-(sp)     ; Offset 2
+move.w    #500,-(sp)     ; Offset 0
+trap      #14            ; XBIOS aufrufen
+lea       14(sp),sp      ; Stack korrigieren
+
+ +
+ +

4.19.65 init_imemplay

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »init_imemplay« - memory-play im Interrupt +
  +
Xbiosnummer: 500, 122 +
  +
Deklaration: int32_t xbios ( 500, 122, int16_t select, int32_t startadr, +int32_t endadr, int32_t counter, int16_t step, int16_t mode, int16_t +midi ); +
  +
Beschreibung: +
  + + + + + + + + + + + + + + + + + + + + + +
select Abspielart +
0 = Wiedergabe mit 16Bit über FIFO +
1 = Wiedergabe mit 16Bit über DSP +
2 = Wiedergabe mit 24Bit über FIFO +
startadr Play-Startadresse +
endadr Play-Endadresse +
counter Zähler-Startwert +
step Geschwindigkeit der Wiedergabe +
0 = normal +
1 = doppelte +
2 = dreifache usw... +
mode bit 0 -> loop +
bit 1 -> crossplay (nicht bei select = 2) +
bit 2 -> midi +
midi Midinote, bei der die Wiedergabe starten soll wird nur +angegeben, wenn modebit2 gesetzt ist! + +
+ +
Ergebnis: Adresse Rückgabewerte, -1 = Fehler +
int32_t 0 memposition +
int32_t 8 break +
int32_t 12 fehler +
int32_t 24 zählerposition +
int32_t 28 loops +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.65.1 Bindings für init_imemplay

+ + + + + + +
C: int32_t xbios ( 500, 122, int16_t select, int32_t startadr, +int32_t endadr, int32_t counter, int16_t step, int16_t mode, int16_t +midi ); +
  +
Assembler: +
  +
move.w    midi,-(sp)      ; Offset 22
+move.w    mode,-(sp)      ; Offset 20
+move.w    step,-(sp)      ; Offset 18
+move.l    counter,-(sp)   ; Offset 14
+move.l    endadr,-(sp)    ; Offset 10
+move.l    startadr,-(sp)  ; Offset 6
+move.w    select,-(sp)    ; Offset 4
+move.w    #122,-(sp)      ; Offset 2
+move.w    #500,-(sp)      ; Offset 0
+trap      #14             ; XBIOS aufrufen
+lea       24(sp),sp       ; Stack korrigieren
+
+ +
+ +

4.19.66 init_implaymix

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »init_implaymix« - memory-play & record-mix im Interrupt +
  +
Xbiosnummer: 500, 123 +
  +
Deklaration: int32_t xbios ( 500, 123, int16_t select, int32_t startadr, +int32_t endadr, int32_t counter, int16_t step, int16_t mode, int16_t +midi ); +
  +
Beschreibung: +
  + + + + + + + + + + + + + + + + + + + + + +
select Abspielart +
0 = Wiedergabe mit 16Bit über FIFO +
startadr Play-Startadresse +
endadr Play-Endadresse +
counter Zähler-Startwert +
step Geschwindigkeit der Wiedergabe +
0 = normal +
1 = doppelte +
2 = dreifache usw... +
mode bit 0 -> loop +
bit 1 -> crossplay (nicht bei select = 2) +
bit 2 -> MIDI +
midi Midinote, bei der die Wiedergabe starten soll wird nur +angegeben, wenn mode bit2 gesetzt ist! + +
+ +
Ergebnis: Adresse Rückgabewerte, -1 = Fehler +
int32_t 0 memposition +
int32_t 8 break +
int32_t 12 Fehler +
int32_t 24 Zählerposition +
int32_t 28 loops +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.66.1 Bindings für init_implaymix

+ + + + + + +
C: int32_t xbios ( 500, 123, int16_t select, int32_t startadr, +int32_t endadr, int32_t counter, int16_t step, int16_t mode, int16_t +midi ); +
  +
Assembler: +
  +
move.w    midi,-(sp)      ; Offset 22
+move.w    mode,-(sp)      ; Offset 20
+move.w    step,-(sp)      ; Offset 18
+move.l    counter,-(sp)   ; Offset 14
+move.l    endadr,-(sp)    ; Offset 10
+move.l    startadr,-(sp)  ; Offset 6
+move.w    select,-(sp)    ; Offset 4
+move.w    #122,-(sp)      ; Offset 2
+move.w    #500,-(sp)      ; Offset 0
+trap      #14             ; XBIOS aufrufen
+lea       24(sp),sp       ; Stack korrigieren
+
+ +
+ +

4.19.67 init_hrec

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »init_hrec« - HD-record im Interrupt +
  +
Xbiosnummer: 500, 124 +
  +
Deklaration: int32_t xbios ( 500, 124, int32_t startadr, int32_t len, +int32_t sectors, int16_t handle, int16_t fileart ); +
  +
Beschreibung: +
  + + + + + + + + + + + + + + + +
startadr Aufnahmebuffer-Startadresse +
len Aufnahmebuffer-Länge +
sectors Anzahl der Aufnahmesektoren +
handle Handle der Aufnahmedatei +
fileart 3 = WAV-Datei anlegen + +
+ +
Geht nicht! +
  +
Ergebnis: Adresse Rückgabewerte +
int32_t 0 memposition +
int32_t 4 Anzahl aufgenommene sektoren +
int32_t 8 break +
int32_t 12 Fehler +
+
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.67.1 Bindings für init_hrec

+ + + + + + +
C: int32_t xbios ( 500, 124, int32_t startadr, int32_t len, +int32_t sectors, int16_t handle, int16_t fileart ); +
  +
Assembler: +
  +
move.w    fileart,-(sp)   ; Offset 18
+move.w    handle,-(sp)    ; Offset 16
+move.l    sectors,-(sp)   ; Offset 12
+move.l    len,-(sp)       ; Offset 8
+move.l    startadr,-(sp)  ; Offset 4
+move.w    #124,-(sp)      ; Offset 2
+move.w    #500,-(sp)      ; Offset 0
+trap      #14             ; XBIOS aufrufen
+lea       20(sp),sp       ; Stack korrigieren
+
+ +
+ +

4.19.68 init_hplay

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »init_hplay« - HD-play im Interrupt +
  +
Xbiosnummer: 500, 125 +
  +
Deklaration: int32_t xbios ( 500, 125, int32_t startadr, int32_t len, +int32_t sectors, int32_t seek, int16_t handle, int16_t fileart, +int16_t step, int16_t mode, int16_t midi ); +
  +
Beschreibung: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
startadr Playbuffer-Startadresse +
len Playbuffer-Länge +
sectors Anzahl der sektoren +
seek Datei-Startposition +
handle Handle der Playdatei +
fileart 3 = WAV-Datei +
step Geschwindigkeit der Wiedergabe +
mode bit 0 -> loop +
bit 1 -> crossplay +
bit 2 -> MIDI +
bit 3 -> break +
+
midi Midinote, bei der die Wiedergabe starten soll wird nur +angegeben, wenn modebit2 gesetzt ist! + +
+ +
Stürzt ab! +
  +
Ergebnis: Adresse Rückgabewerte +
int32_t 0 memposition +
int32_t 4 Anzahl abgespielte sektoren +
int32_t 8 break +
int32_t 12 Fehler +
int32_t 28 Anzahl loops +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.68.1 Bindings für init_hplay

+ + + + + + +
C: int32_t xbios ( 500, 125, int32_t startadr, int32_t len, +int32_t sectors, int32_t seek, int16_t handle, int16_t fileart, +int16_t step, int16_t mode, int16_t midi ); +
  +
Assembler: +
  +
move.w    midi,-(sp)      ; Offset 28
+move.w    mode,-(sp)      ; Offset 26
+move.w    step,-(sp)      ; Offset 24
+move.w    fileart,-(sp)   ; Offset 22
+move.w    handle,-(sp)    ; Offset 20
+move.l    seek,-(sp)      ; Offset 16
+move.l    sectors,-(sp)   ; Offset 12
+move.l    len,-(sp)       ; Offset 8
+move.l    startadr,-(sp)  ; Offset 4
+move.w    #125,-(sp)      ; Offset 2
+move.w    #500,-(sp)      ; Offset 0
+trap      #14             ; XBIOS aufrufen
+lea       30(sp),sp       ; Stack korrigieren
+
+ +
+ +

4.19.69 init_ihplaymix

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »init_ihplaymix« - HD-play & record-mix im Interrupt +
  +
Xbiosnummer: 500, 126 +
  +
Binding: Bindings für init_ihplaymix +
  +
Beschreibung: +
  +
Ergebnis: +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.69.1 Bindings für init_ihplaymix

+

Unbekannt! +

+ + + + + + +
C: int32_t xbios ( 500, 126 ); +
  +
Assembler: +
  +
move.w    #126,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.19.70 init_mrecpeak

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »init_mrecpeak« - memory-rec & peakausgabe im Interrupt +
  +
Xbiosnummer: 500, 130 +
  +
Deklaration: int32_t xbios ( 500, 130, int16_t select, int32_t startadr, +int32_t endadr ); +
  +
Beschreibung: +
  + + + + + + + + + +
select Aufnahmeart +
0 = Aufnahme mit 16Bit über FIFO +
1 = Aufnahme mit 16Bit über DSP +
+
startadr Aufnahme-Startadresse +
endadr Aufnahme-Endadresse + +
+ +
Ergebnis: Adresse Rückgabewerte +
int32_t 0 memposition +
int32_t 8 break +
int32_t 12 Fehler +
int32_t 16 peakwert +
int32_t 24 Zählerposition +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.70.1 Bindings für init_mrecpeak

+ + + + + + +
C: int32_t xbios ( 500, 130, int16_t select, int32_t startadr, +int32_t endadr ); +
  +
Assembler: +
  +
move.l    enddadr,-(sp)   ; Offset 10
+move.l    startadr,-(sp)  ; Offset 6
+move.w    select,-(sp)    ; Offset 4
+move.w    #130,-(sp)      ; Offset 2
+move.w    #500,-(sp)      ; Offset 0
+trap      #14             ; XBIOS aufrufen
+lea       14(sp),sp       ; Stack korrigieren
+
+ +
+ +

4.19.71 init_mplaypeak

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: init_mplaypeak»« - memory-play & peakausgabe im Interrupt +
  +
Xbiosnummer: 500, 131 +
  +
Binding: Bindings für init_mplaypeak +
  +
Beschreibung: +
  +
Ergebnis: +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.71.1 Bindings für init_mplaypeak

+

Unbekannt! +

+ + + + + + +
C: int32_t xbios ( 500, 131 ); +
  +
Assembler: +
  +
move.w    #131,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.19.72 init_mrppeak

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »init_mrppeak« - memory play & record-mix & +peakausgabe im Interrupt +
  +
Xbiosnummer: 500, 132 +
  +
Binding: Bindings für init_mrppeak +
  +
Beschreibung: +
  +
Ergebnis: +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.72.1 Bindings für init_mrppeak

+

Unbekannt! +

+ + + + + + +
C: int32_t xbios ( 500, 132 ); +
  +
Assembler: +
  +
move.w    #132,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.19.73 init_hrecpeak

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »init_hrecpeak« - HD-rec & peakausgabe im Interrupt +
  +
Xbiosnummer: 500, 133 +
  +
Deklaration: int32_tG xbios ( 500, 133, int32_t startadr, int32_t len, +int32_t sectors, int16_t handle, int16_t fileart ); +
  +
Beschreibung: +
  + + + + + + + + + + + + + + + +
startadr Aufnahmebuffer-Startadresse +
len Aufnahmebuffer-Länge +
sectors Anzahl der Aufnahmesektoren +
handle Handle der Aufnahmedatei +
fileart 3 = WAV-Datei anlegen + +
+ +
Aussetzer wegen zu kleinem FIFO! +
  +
Ergebnis: Adresse Rückgabewerte +
int32_t 0 memposition +
int32_t 4 Anzahl aufgenommene sektoren +
int32_t 8 break +
int32_t 12 Fehler +
int32_t 16 peakwert +
+
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.73.1 Bindings für init_hrecpeak

+ + + + + + +
C: int32_tG xbios ( 500, 133, int32_t startadr, int32_t len, +int32_t sectors, int16_t handle, int16_t fileart ); +
  +
Assembler: +
  +
move.w    fileart,-(sp)   ; Offset 18
+move.w    handle,-(sp)    ; Offset 16
+move.l    sectors,-(sp)   ; Offset 12
+move.l    len,-(sp)       ; Offset 8
+move.l    startadr,-(sp)  ; Offset 4
+move.w    #133,-(sp)      ; Offset 2
+move.w    #500,-(sp)      ; Offset 0
+trap      #14             ; XBIOS aufrufen
+lea       20(sp),sp       ; Stack korrigieren
+
+ +
+ +

4.19.74 init_hplaypeak

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »init_hplaypeak« - HD-play & peakausgabe im Interrupt +
  +
Xbiosnummer: 500, 134 +
  +
Binding: Bindings für init_hplaypeak +
  +
Beschreibung: +
  +
Ergebnis: +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.74.1 Bindings für init_hplaypeak

+

Unbekannt! +

+ + + + + + +
C: int32_t xbios ( 500, 134 ); +
  +
Assembler: +
  +
move.w    #134,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.19.75 init_hrppeak

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »init_hrppeak« - HD play & record-mix & peakausgabe +im Interrupt +
  +
Xbiosnummer: 500, 135 +
  +
Deklaration: int32_t xbios ( 500, 135 ); +
  +
Beschreibung: +
  +
Ergebnis: +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.75.1 Bindings für init_hrppeak

+

Unbekannt! +

+ + + + + + +
C: int32_t xbios ( 500, 135 ); +
  +
Assembler: +
  +
move.w    #135,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.19.76 init_xmemrec

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »init_xmemrec« - memory-record im HalfBuffer-System +
  +
Xbiosnummer: 500, 140 +
  +
Deklaration: int32_t xbios ( 500, 140, int16_t select, int32_t startadr1, +int32_t startadr2, int32_t len, int32_t endcount, int16_t fileart, +int32_t peakbuf ); +
  +
Beschreibung: +
  + + + + + + + + + + + + + + + + + + + + + +
select Aufnahmeart +
0 = Aufnahme mit 16Bit über FIFO +
1 = Aufnahme mit 16Bit über DSP +
2 = 8-Kanal-Aufnahme mit 16Bit über FIFO +
startadr1 Aufnahme-Startadresse Buffer1 +
startadr2 Aufnahme-Startadresse Buffer2 +
len Blocklänge der Buffer +
endcount Aufnahmelänge bzw. Zählerende (in Byte) +
fileart 3 = WAV-Datei anlegen +
peakbuf Adresse Zwischenspeicher für Peakwerte + +
+ +
Momentan wird bei select = 2 nur 1 Stereokanal abgespeichert! +
  +
Ergebnis: Adresse Rückgabewerte +
int32_t 0 memposition +
int32_t 4 memflag +
int32_t 8 break +
int32_t 12 fehler (nicht bei select=1) +
int32_t 16 peakwert (nur bei select=0) +
int32_t 20 peakbuffer-position (nur bei select=0) +
int32_t 24 zählerposition +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.76.1 Bindings für init_xmemrec

+ + + + + + +
C: int32_t xbios ( 500, 140, int16_t select, int32_t startadr1, +int32_t startadr2, int32_t len, int32_t endcount, int16_t fileart, +int32_t peakbuf ); +
  +
Assembler: +
  +
move.l    peakbuf,-(sp)    ; Offset 24
+move.w    fileart,-(sp)    ; Offset 22
+move.l    endcount,-(sp)   ; Offset 18
+move.l    len,-(sp)        ; Offset 14
+move.l    startadr2,-(sp)  ; Offset 10
+move.l    startadr1,-(sp)  ; Offset 6
+move.w    select,-(sp)     ; Offset 4
+move.w    #140,-(sp)       ; Offset 2
+move.w    #500,-(sp)       ; Offset 0
+trap      #14              ; XBIOS aufrufen
+lea       28(sp),sp        ; Stack korrigieren
+
+ +
+ +

4.19.77 init_xmemplay

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »init_xmemplay« - memory-play im HalfBuffer-System +
  +
Xbiosnummer: 500, 141 +
  +
Deklaration: int32_t xbios ( 500, 141, int16_t select, int32_t startadr1, +int32_t startadr2, int32_t len, int32_t counter, int32_t endcount, +int16_t fileart, int16_t step, int16_t mode, int16_t midi ); +
  +
Beschreibung: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
select Abspielart +
0 = Wiedergabe mit 16Bit über FIFO +
1 = Wiedergabe mit 16Bit über DSP +
2 = 8-Kanal-Wiedergabe mit 16Bit über FIFO +
3 = 16-Kanal-Wiedergabe mit 16Bit über FIFO +
startadr1 Play-Startadresse Buffer 1 +
startadr2 Play-Startadresse Buffer 2 +
len Blocklänge der Buffer +
counter Zähler-Startwert +
endcount Wiedergabelänge bzw. Zählerende (in Byte) +
fileart 3 = WAV-Datei anlegen +
step Geschwindigkeit der Wiedergabe +
mode bit 0 -> loop +
bit 1 -> crossplay +
bit 2 -> MIDI +
bit 3 -> break +
midi Midinote, bei der die Wiedergabe starten soll wird nur +angegeben, wenn mode bit2 gesetzt ist! + +
+ +
Ergebnis: Adresse Rückgabewerte +
int32_t 0 memposition +
int32_t 4 memflag +
int32_t 8 break +
int32_t 12 Fehler (nicht bei select = 1) +
int32_t 16 peakwert (nur bei select = 0) +
int32_t 24 zählerposition +
int32_t 40 lastblock +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.77.1 Bindings für init_xmemplay

+ + + + + + +
C: int32_t xbios ( 500, 141, int16_t select, int32_t startadr1, +int32_t startadr2, int32_t len, int32_t counter, int32_t endcount, +int16_t fileart, int16_t step, int16_t mode, int16_t midi ); +
  +
Assembler: +
  +
move.w    midi,-(sp)       ; Offset 32
+move.w    mode,-(sp)       ; Offset 30
+move.w    step,-(sp)       ; Offset 28
+move.w    fileart,-(sp)    ; Offset 26
+move.l    endcount,-(sp)   ; Offset 22
+move.l    counter,-(sp)    ; Offset 18
+move.l    len,-(sp)        ; Offset 14
+move.l    startadr2,-(sp)  ; Offset 10
+move.l    startadr1,-(sp)  ; Offset 6
+move.w    select,-(sp)     ; Offset 4
+move.w    #141,-(sp)       ; Offset 2
+move.w    #500,-(sp)       ; Offset 0
+trap      #14              ; XBIOS aufrufen
+lea       34(sp),sp        ; Stack korrigieren
+
+ +
+ +

4.19.78 init_xmixplay

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »init_xmixplay« - memory-play & mischen mit record im +HalfBuffer-System +
  +
Xbiosnummer: 500, 142 +
  +
Deklaration: int32_t xbios ( 500, 142 ); +
  +
Beschreibung: +
  +
Ergebnis: +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.78.1 Bindings für init_xmixplay

+

Unbekannt! +

+ + + + + + +
C: int32_t xbios ( 500, 142 ); +
  +
Assembler: +
  +
move.w    #142,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.19.79 init_xmemrec4

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »init_xmemrec4« - memory-record im HalfBuffer-System von 4 +Kanälen (analog/digital) +
  +
Xbiosnummer: 500, 143 +
  +
Deklaration: int32_t xbios ( 500, 143, int32_t startadr1, int32_t startadr2, +int32_t dstartadr1, int32_t dstartadr2, int32_t len, int32_t endcount, +int16_t fileart, int32_t peakbuf, int32_t dpeakbuf ); +
  +
Beschreibung: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
startadr1 FIFO Aufnahme-Startadresse Buffer 1 +
startadr2 FIFO Aufnahme-Startadresse Buffer 2 +
dstartadr1 DSP Aufnahme-Startadresse Buffer 1 +
dstartadr2 DSP Aufnahme-Startadresse Buffer 2 +
len länge der Buffer +
endcount Aufnahmelänge bzw. Zählerende (in Byte) +
fileart 3 = WAV-Datei anlegen +
peakbuf FIFO Adresse Zwischenspeicher für Peakwerte +
dpeakbuf DSP Adresse Zwischenspeicher für Peakwerte + +
+ +
Ergebnis: Adresse Rückgabewerte +
int32_t 0 memposition FIFO +
int32_t 4 memflag FIFO +
int32_t 8 break FIFO +
int32_t 12 fehler FIFO +
int32_t 16 peakwert FIFO +
int32_t 24 zählerposition FIFO +
  +
int32_t 32 memposition DSP +
int32_t 36 memflag DSP +
int32_t 40 break dsp +
int32_t 44 fehler DSP +
int32_t 48 peakwert DSP +
int32_t 56 zählerposition DSP +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.79.1 Bindings für init_xmemrec4

+ + + + + + +
C: int32_t xbios ( 500, 143, int32_t startadr1, int32_t startadr2, +int32_t dstartadr1, int32_t dstartadr2, int32_t len, int32_t endcount, +int16_t fileart, int32_t peakbuf, int32_t dpeakbuf ); +
  +
Assembler: +
  +
move.l    dpeakpuf,-(sp)    ; Offset 34
+move.l    peakpuf,-(sp)     ; Offset 30
+move.w    fileart,-(sp)     ; Offset 28
+move.l    endcount,-(sp)    ; Offset 24
+move.l    len,-(sp)         ; Offset 20
+move.l    dstartadr2,-(sp)  ; Offset 16
+move.l    dstartadr1,-(sp)  ; Offset 12
+move.l    startadr2,-(sp)   ; Offset 8
+move.l    startadr1,-(sp)   ; Offset 4
+move.w    #143,-(sp)        ; Offset 2
+move.w    #500,-(sp)        ; Offset 0
+trap      #14               ; XBIOS aufrufen
+lea       38(sp),sp         ; Stack korrigieren
+
+ +
+ +

4.19.80 init_xmemplay4

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »init_xmemplay4« - memory-play im HalfBuffer-System von 4 +Kanälen (analog/digital) +
  +
Xbiosnummer: 500, 144 +
  +
Deklaration: int32_t xbios ( 500, 144, int32_t startadr1, int32_t startadr2, +int32_t dstartadr1, int32_t dstartadr2, int32_t len, int32_t counter, +int32_t endcount, int16_t fileart, int16_t step, int16_t mode, int16_t +midi ); +
  +
Beschreibung: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
startadr1 FIFO Play-Startadresse Buffer 1 +
startadr2 FIFO Play-Startadresse Buffer 2 +
dstartadr1 DSP Play-Startadresse Buffer 1 +
dstartadr2 DSP Play-Startadresse Buffer 2 +
dendadr2 länge der Buffer +
counter Zähler-Startwert +
endcount Wiedergabelänge bzw. Zählerende (in Byte) +
fileart 3 = WAV-Datei anlegen +
step Geschwindigkeit der Wiedergabe +
mode bit 0 -> loop +
bit 1 -> crossplay +
bit 2 -> MIDI +
bit 3 -> break +
midi Midinote, bei der die Wiedergabe starten soll wird nur +angegeben, wenn mode bit2 gesetzt ist! + +
+ +
Ergebnis: Adresse Rückgabewerte +
int32_t 0 memposition +
int32_t 4 memflag +
int32_t 8 break +
int32_t 12 fehler +
int32_t 16 peakwert +
int32_t 24 zählerposition +
+
  +
int32_t 32 memposition DSP +
int32_t 36 memflag DSP +
int32_t 40 break DSP +
int32_t 44 fehler DSP +
int32_t 48 peakwert DSP +
int32_t 56 zählerposition DSP +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.80.1 Bindings für init_xmemplay4

+ + + + + + +
C: int32_t xbios ( 500, 144, int32_t startadr1, int32_t startadr2, +int32_t dstartadr1, int32_t dstartadr2, int32_t len, int32_t counter, +int32_t endcount, int16_t fileart, int16_t step, int16_t mode, int16_t +midi ); +
  +
Assembler: +
  +
move.w    midi,-(sp)        ; Offset 38
+move.w    mode,-(sp)        ; Offset 36
+move.w    step,-(sp)        ; Offset 34
+move.w    fileart,-(sp)     ; Offset 32
+move.l    endcount,-(sp)    ; Offset 28
+move.l    counter,-(sp)     ; Offset 24
+move.l    len,-(sp)         ; Offset 20
+move.l    dstartadr2,-(sp)  ; Offset 16
+move.l    dstartadr1,-(sp)  ; Offset 12
+move.l    startadr2,-(sp)   ; Offset 8
+move.l    startadr1,-(sp)   ; Offset 4
+move.w    #144,-(sp)        ; Offset 2
+move.w    #500,-(sp)        ; Offset 0
+trap      #14               ; XBIOS aufrufen
+lea       40(sp),sp         ; Stack korrigieren
+
+ +
+ +

4.19.81 peakshake

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »peakshake« - Peakwert-Handshake (= neuen Wert generieren) +
  +
Xbiosnummer: 500, 150 +
  +
Deklaration: int32_t xbios ( 500, 150 ); +
  +
Beschreibung: +
  +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.81.1 Bindings für peakshake

+ + + + + + +
C: int32_t xbios ( 500, 150 ); +
  +
Assembler: +
  +
move.w    #150,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.19.82 read_rlow

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »read_rlow« - low-register lesen +
  +
Xbiosnummer: 500, 200 +
  +
Deklaration: int32_t xbios ( 500, 200 ); +
  +
Beschreibung: +
  +
Ergebnis: bit 0 -> SWAES +
bit 1 -> SWDIGIN +
bit 2 -> TAKT0 +
bit 3 -> TAKT1 +
bit 4 -> EXTAKT +
bit 5 -> EXTEX +
bit 6 -> EXTTF +
bit 7 -> EXTTW +
  +
Gruppe: Soundroutinen +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Querverweis: Binding +
  + +
+ +

4.19.82.1 Bindings für read_rlow

+ + + + + + +
C: int32_t xbios ( 500, 200 ); +
  +
Assembler: +
  +
move.w    #200,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.19.83 read_rhi

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »read_rhi« - high-register lesen +
  +
Xbiosnummer: 500, 201 +
  +
Deklaration: int32_t xbios ( 500, 201 ); +
  +
Beschreibung: +
  +
Ergebnis: bit 0 -> SWPROT +
bit 1 -> SWRES-FIFO +
bit 2 -> MATRIX-OUT +
bit 3 -> PREEMPH +
bit 4 -> SWSUBFR +
bit 5 -> GENERA +
bit 6 -> CATEG0 +
bit 7 -> CATEG1 +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.83.1 Bindings für read_rhi

+ + + + + + +
C: int32_t xbios ( 500, 201 ); +
  +
Assembler: +
  +
move.w    #201,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.19.84 read_rdsp

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »read_rdsp« - dsp-register lesen +
  +
Xbiosnummer: 500, 202 +
  +
Deklaration: int32_t xbios ( 500, 202 ); +
  +
Beschreibung: +
  +
Ergebnis: bit 0 -> MATI0/REC4 +
bit 1 -> MATI1/PLAY4 +
bit 2 -> VOLCS1 +
bit 3 -> VOLCLK +
bit 4 -> VOLDATAI +
bit 5 -> VOLCS2 +
bit 7 -> AESFREQ +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.84.1 Bindings für read_rdsp

+ + + + + + +
C: int32_t xbios ( 500, 202 ); +
  +
Assembler: +
  +
move.w    #202,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.19.85 read_raes

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »read_raes« - aes-register lesen +
  +
Xbiosnummer: 500, 203 +
  +
Deklaration: int32_t xbios ( 500, 203 ); +
  +
Beschreibung: +
  +
Ergebnis: bit 0 -> SWPROF +
bit 1 -> SWCOPY/PCH16 +
bit 2 -> DIGMODE:SWMAL2/DIG24 +
bit 3 -> PLAY128 +
bit 4 -> REC128 +
bit 7 -> SPEBU +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.85.1 Bindings für read_raes

+ + + + + + +
C: int32_t xbios ( 500, 203 ); +
  +
Assembler: +
  +
move.w    #203,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.19.86 read_rint

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »read_rint« - interrupt-register lesen +
  +
Xbiosnummer: 500, 204 +
  +
Binding: Bindings für read_rint +
  +
Beschreibung: +
  +
Ergebnis: bit 0 -> PLAY-INT +
bit 1 -> REC-INT +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.86.1 Bindings für read_rint

+ + + + + + +
C: int32_t xbios ( 500, 204 ); +
  +
Assembler: +
  +
move.w    #204,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.19.87 wr_rlow

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »wr_rlow« - low-register schreiben +
  +
Xbiosnummer: 500, 210 +
  +
Deklaration: int32_t xbios ( 500, 210, int16_t value ); +
  +
Beschreibung: +
  + + + +
value bit 0 -> SWAES +
bit 1 -> SWDIGIN +
bit 2 -> TAKT0 +
bit 3 -> TAKT1 +
bit 4 -> EXTAKT +
bit 5 -> EXTEX +
bit 6 -> EXTTF +
bit 7 -> EXTTW + +
+ +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.87.1 Bindings für wr_rlow

+ + + + + + +
C: int32_t xbios ( 500, 210, int16_t value ); +
  +
Assembler: +
  +
move.w    value,-(sp)  ; Offset 4
+move.w    #210,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.19.88 wr_rhi

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »wr_rhi« - high-register schreiben +
  +
Xbiosnummer: 500, 211 +
  +
Deklaration: int32_t xbios ( 500, 211, int16_t value ); +
  +
Beschreibung: +
  + + + +
value bit 0 -> SWPROT +
bit 1 -> SWRES-FIFO +
bit 2 -> MATRIX-OUT +
bit 3 -> PREEMPH +
bit 4 -> SWSUBFR +
bit 5 -> GENERA +
bit 6 -> CATEG0 +
bit 7 -> CATEG1 + +
+ +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.88.1 Bindings für wr_rhi

+ + + + + + +
C: int32_t xbios ( 500, 211, int16_t value ); +
  +
Assembler: +
  +
move.w    value,-(sp)  ; Offset 4
+move.w    #211,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.19.89 wr_rdsp

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »wr_rdsp« - dsp-register schreiben +
  +
Xbiosnummer: 500, 212 +
  +
Deklaration: int32_t xbios ( 500, 212, int16_t value ); +
  +
Beschreibung: +
  + + + +
value bit 0 -> MATI0/REC4 +
bit 1 -> MATI1/PLAY4 +
bit 2 -> VOLCS1 +
bit 3 -> VOLCLK +
bit 4 -> VOLDATAI +
bit 5 -> VOLCS2 +
bit 7 -> AESFREQ + +
+ +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.89.1 Bindings für wr_rdsp

+ + + + + + +
C: int32_t xbios ( 500, 212, int16_t value ); +
  +
Assembler: +
  +
move.w    value,-(sp)  ; Offset 4
+move.w    #212,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.19.90 wr_raes

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »wr_raes« - aes-register schreiben +
  +
Xbiosnummer: 500, 213 +
  +
Deklaration: int32_t xbios ( 500, 213, int16_t value ); +
  +
Beschreibung: +
  + + + +
value bit 0 -> SWPROF +
bit 1 -> SWCOPY/PCH16 +
bit 2 -> DIGMODE:SWMAL2/DIG24 +
bit 3 -> PLAY128 +
bit 4 -> REC128 +
bit 7 -> SPEBU + +
+ +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.90.1 Bindings für wr_raes

+ + + + + + +
C: int32_t xbios ( 500, 213, int16_t value ); +
  +
Assembler: +
  +
move.w    value,-(sp)  ; Offset 4
+move.w    #213,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.19.91 wr_rint

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »wr_rint« - interrupt-register schreiben +
  +
Xbiosnummer: 500, 214 +
  +
Deklaration: int32_t xbios ( 500, 214, int16_t value ); +
  +
Beschreibung: +
  + + + +
value bit 0 -> PLAY-INT +
bit 1 -> REC-INT + +
+ +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.91.1 Bindings für wr_rint

+ + + + + + +
C: int32_t xbios ( 500, 214, int16_t value ); +
  +
Assembler: +
  +
move.w    value,-(sp)  ; Offset 4
+move.w    #214,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.19.92 read_dpath1

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »read_dpath1« - DSP dpath1-register lesen +
  +
Xbiosnummer: 500, 220 +
  +
Deklaration: int32_t xbios ( 500, 220 ); +
  +
Beschreibung: +
  +
Ergebnis: bit 0 -> SW0PATH +
bit 1 -> SC1PATH +
bit 2 -> SC2PATH +
bit 3 -> DSPRES +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.92.1 Bindings für read_dpath1

+ + + + + + +
C: int32_t xbios ( 500, 220 ); +
  +
Assembler: +
  +
move.w    #220,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.19.93 read_dpath2

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »read_dpath2« - dsp dpath2-register lesen +
  +
Xbiosnummer: 500, 221 +
  +
Deklaration: int32_t xbios ( 500, 221 ); +
  +
Beschreibung: +
  +
Ergebnis: bit0 -> SRDPATH +
bit1 -> STDPATH0 +
bit2 -> STDPATH1 +
bit3 -> CONVMAST +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.93.1 Bindings für read_dpath2

+ + + + + + +
C: int32_t xbios ( 500, 221 ); +
  +
Assembler: +
  +
move.w    #221,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.19.94 read_dport

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »read_dport« - dsp dport-register lesen +
  +
Xbiosnummer: 500, 222 +
  +
Deklaration: int32_t xbios ( 500, 222 ); +
  +
Beschreibung: +
  +
Ergebnis: bit 0 -> GPIO0 +
bit 1 -> GPIO1 +
bit 2 -> GPIO2 +
bit 3 -> GPIODIR0 +
+
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.94.1 Bindings für read_dport

+ + + + + + +
C: int32_t xbios ( 500, 222 ); +
  +
Assembler: +
  +
move.w    #222,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.19.95 read_dconv

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »read_dconv« - dsp dconv-register lesen +
  +
Xbiosnummer: 500, 223 +
  +
Deklaration: int32_t xbios ( 500, 223 ); +
  +
Beschreibung: +
  +
Ergebnis: bit 0 -> GPIODIR1 +
bit 1 -> GPIODIR2 +
bit 2 -> CMAST0 +
bit 3 -> CMAST1 +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.95.1 Bindings für read_dconv

+ + + + + + +
C: int32_t xbios ( 500, 223 ); +
  +
Assembler: +
  +
move.w    #223,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.19.96 read_dpdat

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »read_dpdat« - dsp dpdat-register lesen +
  +
Xbiosnummer: 500, 224 +
  +
Deklaration: int32_t xbios ( 500, 224 ); +
  +
Beschreibung: +
  +
Ergebnis: bit 0 -> PDAT0 +
bit 1 -> PDAT1 +
Bit 2 -> MEMART +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.96.1 Bindings für read_dpdat

+ + + + + + +
C: int32_t xbios ( 500, 224 ); +
  +
Assembler: +
  +
move.w    #224,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.19.97 read_dclk

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »read_dclk« - dsp dclk-register lesen +
  +
Xbiosnummer: 500, 225 +
  +
Deklaration: int32_t xbios ( 500, 225 ); +
  +
Beschreibung: +
  +
Ergebnis: bit 0-3 -> CDIV +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.97.1 Bindings für read_dclk

+ + + + + + +
C: int32_t xbios ( 500, 225 ); +
  +
Assembler: +
  +
move.w    #225,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.19.98 wr_dpath1

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »wr_dpath1« - dsp dpath1-register schreiben +
  +
Xbiosnummer: 500, 230 +
  +
Deklaration: int32_t xbios ( 500, 230, int16_t value ); +
  +
Beschreibung: +
  + + + +
value bit 0 -> SW0PATH +
bit 1 -> SC1PATH +
bit 2 -> SC2PATH +
bit 3 -> DSPRES + +
+ +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.98.1 Bindings für wr_dpath1

+ + + + + + +
C: int32_t xbios ( 500, 230, int16_t value ); +
  +
Assembler: +
  +
move.w    value,-(sp)  ; Offset 4
+move.w    #230,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.19.99 wr_dpath2

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »wr_dpath2« - dsp dpath2-register schreiben +
  +
Xbiosnummer: 500, 231 +
  +
Deklaration: int32_t xbios ( 500, 231, int16_t value ); +
  +
Beschreibung: +
  + + + +
value bit 0 -> SRDPATH +
bit 1 -> STDPATH0 +
bit 2 -> STDPATH1 +
bit 3 -> CONVMAST + +
+ +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.99.1 Bindings für wr_dpath2

+ + + + + + +
C: int32_t xbios ( 500, 231, int16_t value ); +
  +
Assembler: +
  +
move.w    value,-(sp)  ; Offset 4
+move.w    #231,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.19.100 wr_dport

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »wr_dport« - dsp dport-register schreiben +
  +
Xbiosnummer: 500, 232 +
  +
Deklaration: int32_t xbios ( 500, 232, int16_t wert ); +
  +
Beschreibung: +
  + + + +
wert bit 0 -> GPIO0 +
bit 1 -> GPIO1 +
bit 2 -> GPIO2 +
bit 3 -> GPIODIR0 + +
+ +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.100.1 Bindings für wr_dport

+ + + + + + +
C: int32_t xbios ( 500, 232, int16_t wert ); +
  +
Assembler: +
  +
move.w    wert,-(sp)   ; Offset 4
+move.w    #232,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.19.101 wr_dconv

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »wr_dconv« - dsp dconv-register schreiben +
  +
Xbiosnummer: 500, 233 +
  +
Deklaration: int32_t xbios ( 500, 233, int16_t value ); +
  +
Beschreibung: +
  + + + +
value bit 0 -> GPIODIR1 +
bit 1 -> GPIODIR2 +
bit 2 -> CMAST0 +
bit 3 -> CMAST1 + +
+ +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.101.1 Bindings für wr_dconv

+ + + + + + +
C: int32_t xbios ( 500, 233, int16_t value ); +
  +
Assembler: +
  +
move.w    value,-(sp)  ; Offset 4
+move.w    #233,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.19.102 wr_dpdat

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »wr_dpdat« - dsp dpdat-register schreiben +
  +
Xbiosnummer: 500, 234 +
  +
Deklaration: int32_t xbios ( 500, 234, int16_t value ); +
  +
Beschreibung: +
  + + + +
value bit 0 -> PDAT0 +
bit 1 -> PDAT1 +
Bit 2 -> MEMART + +
+ +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.102.1 Bindings für wr_dpdat

+ + + + + + +
C: int32_t xbios ( 500, 234, int16_t value ); +
  +
Assembler: +
  +
move.w    value,-(sp)  ; Offset 4
+move.w    #234,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.19.103 wr_dclk

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »wr_dclk« - dsp dclk-register schreiben +
  +
Xbiosnummer: 500, 235 +
  +
Deklaration: int32_t xbios ( 500, 235, int16_t wert ); +
  +
Beschreibung: wert: bit0-3 -> CDIV +
  +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.103.1 Bindings für wr_dclk

+ + + + + + +
C: int32_t xbios ( 500, 235, int16_t wert ); +
  +
Assembler: +
  +
move.w    wert,-(sp)   ; Offset 4
+move.w    #235,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.19.104 fastcut

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »fastcut« - speicherbereich löschen im samplemem +
  +
Xbiosnummer: 500, 300 +
  +
Deklaration: int32_t xbios ( 500, 300, int32_t anfmem, int32_t endmem ); +
  +
Beschreibung: +
  + + + + + + +
anfmem Anfangsadresse +
endmem Endadresse (erster ungültiger Wert) + +
+ +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.104.1 Bindings für fastcut

+ + + + + + +
C: int32_t xbios ( 500, 300, int32_t anfmem, int32_t endmem ); +
  +
Assembler: +
  +
move.l    endmem,-(sp)  ; Offset 8
+move.l    anfmem,-(sp)  ; Offset 4
+move.w    #300,-(sp)    ; Offset 2
+move.w    #500,-(sp)    ; Offset 0
+trap      #14           ; XBIOS aufrufen
+lea       12(sp),sp     ; Stack korrigieren
+
+ +
+ +

4.19.105 peaksuch

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »peaksuch« - +
  +
Xbiosnummer: 500, 301 +
  +
Deklaration: int32_t xbios ( 500, 301, int32_t anfmem, int32_t endmem ); +
  +
Beschreibung: +
  + + + + + + +
anfmem Anfangsadresse +
endmem Endadresse (erster ungültiger Wert) + +
+ +
Ergebnis: Zeiger auf Wertetabelle +
int16_t rpos; maximalwert positive Halbwelle rechts +
int16_t rneg; maximalwert negative Halbwelle rechts +
int16_t lpos; maximalwert positive Halbwelle links +
int16_t lneg; maximalwert negative Halbwelle links +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.105.1 Bindings für peaksuch

+ + + + + + +
C: int32_t xbios ( 500, 301, int32_t anfmem, int32_t endmem ); +
  +
Assembler: +
  +
move.l    endmem,-(sp)  ; Offset 8
+move.l    anfmem,-(sp)  ; Offset 4
+move.w    #301,-(sp)    ; Offset 2
+move.w    #500,-(sp)    ; Offset 0
+trap      #14           ; XBIOS aufrufen
+lea       12(sp),sp     ; Stack korrigieren
+
+ +
+ +

4.19.106 zerono

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »zerono« - nullstellen-suche im samplemem +
  +
Xbiosnummer: 500, 302 +
  +
Deklaration: int32_t xbios ( 500, 302, int32_t anfmem, int32_t endmem, +int16_t side, int16_t znvorweg ); +
  +
Beschreibung: +
  + + + + + + + + + + + + +
anfmem Anfangsadresse +
endmem Endadresse (erster ungültiger Wert) +
side Suchrichtung (= 0 :vorwärts , <> 0 :rückwärts) +
znvorweg Was ist das ??????????????????????????????????? + +
+ +
Ergebnis: Adresse der Fundstelle +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.106.1 Bindings für zerono

+ + + + + + +
C: int32_t xbios ( 500, 302, int32_t anfmem, int32_t endmem, +int16_t side, int16_t znvorweg ); +
  +
Assembler: +
  +
move.w    znvorweg,-(sp)  ; Offset 14
+move.w    side,-(sp)      ; Offset 12
+move.l    endmem,-(sp)    ; Offset 8
+move.l    anfmem,-(sp)    ; Offset 4
+move.w    #302,-(sp)      ; Offset 2
+move.w    #500,-(sp)      ; Offset 0
+trap      #14             ; XBIOS aufrufen
+lea       16(sp),sp       ; Stack korrigieren
+
+ +
+ +

4.19.107 fading

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »fading« - sample-fading im samplemem +
  +
Xbiosnummer: 500, 303 +
  +
Deklaration: int32_t xbios ( 500, 303, int32_t data, int32_t werte, int32_t +anfmem, int32_t endmem ); +
  +
Beschreibung: +
  + + + + + + + + + + + + +
data Pointer auf Faderkurvenwertes +
werte Anzahl der Faderwerte +
anfmem Anfangsadresse +
endmem Endadresse (erster ungültiger Wert) + +
+ +
Ergebnis: 0 - kein Fehler +
  +
Verfügbar: Diese Funktionen stehen nur zur Verfügung, wenn der Treiber +der Startrack Soundkarte gestartet wurde. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.107.1 Bindings für fading

+ + + + + + +
C: int32_t xbios ( 500, 303, int32_t data, int32_t werte, int32_t +anfmem, int32_t endmem ); +
  +
Assembler: +
  +
move.l    endmem,-(sp)  ; Offset 162
+move.l    anfmem,-(sp)  ; Offset 12
+move.l    werte,-(sp)   ; Offset 8
+move.l    data,-(sp)    ; Offset 4
+move.w    #303,-(sp)    ; Offset 2
+move.w    #500,-(sp)    ; Offset 0
+trap      #14           ; XBIOS aufrufen
+lea       20(sp),sp     ; Stack korrigieren
+
+ +
+ +

4.19.108 unlocksnd

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »unlocksnd« - Soundsystem für andere Anwendungen freigeben +
  +
Xbiosnummer: 129 +
  +
Deklaration: int32_t unlocksnd( void ); +
  +
Beschreibung: Die XBIOS-Routine unlocksnd gibt das Soundsystem für andere +Anwendungen frei, nachdem es zuvor gesperrt wurde. +
  +
Ergebnis: Die Funktion liefert im positiven Fall den Wert 0 zurück. War +das Soundsystem bereits verfügbar, so wird ein negativer Wert +zurückgeliefert. +
  +
Verfügbar: Die Funktion ist nur auf Computern der Falcon-Serie verfügbar +oder bei erweiterten XBiosroutinen (_SND). +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding   buffoper   buffptr   devconnect   dsptristate   gpio   +setbuffer   setinterrupt   setmontracks   setmode   settracks   +sndstatus   soundcmd   locksnd +
  + +
+ +

4.19.108.1 Bindings für unlocksnd

+ + + + + + +
C: #include <tos.h> +
  +
int32_t unlocksnd( void ); +
  +
Assembler: +
  +
move.w    #129,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

4.19.109 WavePlay

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »WavePlay« - Abspielen eines Samples +
  +
Xbiosnummer: 165 +
  +
Deklaration: int32_t WavePlay( int16_t flags, int32_t rate, int32_t sptr, +int32_t slen ); +
  +
Beschreibung: Die XBIOS-Routine WavePlay startet das abspielen eines Samples. +
  +
flags ist ein Bitvektor für die Beschreibung des +Samples bzw. auszuführenden Funktion: +
  +
Bit 0 gesetzt: Sample ist Mono. +
Bit 1 gesetzt: Sample ist 16Bit. +
  +
Ist Bit 5 im '_SND' Cookie gesetzt. +
  +
Bit 4 gesetzt: Sample ist, wenn 16Bit, Intelformat. +
Bit 5 gesetzt: Sample ist ohne Vorzeichen. +
Bit 6 gesetzt: Sampleformat ist so wie es von MilanBlaster +aufgenommen wurde. +
  +
Bit 8 gesetzt: siehe Beschreibung im Atari Compendium Band I, +XBIOS 4.110-4.112. Wird vom MilanBlaster-XBios nicht unterstützt. +
  +
rate ist die Samplefrequenz in Hz. +
  +
sptr ist die Startadresse des Samples. (kann bei +MilanBlaster auch im TT-Ram liegen) +
  +
slen ist die länge des Samples in Byte. +
  +
Ergebnis: Im Erfolgsfall liefert die Funktion den Wert 0, die Wiedergabe +wurde dann gestartet und kann durch buffoper(0) jederzeit unterbrochen +werden. Das Ende des Samples wurde erreicht wenn buffoper(-1) Bit 0 +gelöscht ist. +
  +
Verfügbar: Die Funktion ist verfügbar wenn Bit 5 im '_SND' Cookie +gesetzt oder der 'SAM\0' Cookie vorhanden ist. +
  +
Gruppe: Soundroutinen +
  +
Querverweis: Binding +
  + +
+ +

4.19.109.1 Bindings für WavePlay

+ + + + + + +
C: int32_t WavePlay( int16_t flags, int32_t rate, int32_t sptr, +int32_t slen ); +
  +
Assembler: +
  +
move.l    slen,-(sp)   ; Offset 12
+pea       sptr         ; Offset 8
+move.l    rate,-(sp)   ; Offset 4
+move.w    flags,-(sp)  ; Offset 2
+move.w    #165,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+lea       16(sp),sp    ; Stack korrigieren
+
+ +
+ +
+ +Home +XBIOSXBIOS +SchnittstellenprogrammierungSchnittstellenprogrammierung +SpezialbefehleSpezialbefehle + + diff --git a/de/xbios_special.html b/de/xbios_special.html new file mode 100644 index 000000000..f40ffd540 --- /dev/null +++ b/de/xbios_special.html @@ -0,0 +1,1192 @@ + + + + + +Die Anleitung zum TOS: Spezialbefehle + + + + + + + + + +Home +XBIOSXBIOS +SoundroutinenSoundroutinen +TastaturfunktionenTastaturfunktionen + +
+ +

4.20 Spezialbefehle

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Blitmode Blitterkonfiguration ändern oder ermitteln. +
CacheCtrl CPU Cacheverwaltung +
CJar Erzeugen, Abfragen und Löschen von Cookies +
Dbmsg Debugmeldungen ausgeben +
Janus Funktion des "Janus" Emulator +
Puntaes AES im ROM abschalten. +
Random Zufallszahlengenerator +
Ssbrk Speicherplatz reservieren (nur intern verwendet). +
Supexec Unterprogramm im Supervisor-Modus starten. +
Trapper Einklinken in Systemfunktionen. +
WdgCtrl Einstellen des Hardware-Watchdog + +
+ +

Querverweis: Schnittstellenprogrammierung +

+

4.20.1 Blitmode

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »blitter mode« - Blitter-Chip konfigurieren. +
  +
Xbiosnummer: 64 +
  +
Deklaration: int16_t Blitmode( int16_t mode ); +
  +
Beschreibung: Blitmode ist eine XBIOS-Routine um den Blitter einzuschalten +oder seine Existenz festzustellen. Wenn im Parameter mode der +Wert -1 angegeben wird, dann erhält man den Status des Blitter-Chips. +Bei allen anderen Werten wird der Blitter konfiguriert: +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
BitBeschreibung
00 = Blitter aus
 1 = Blitter ein
1-14reserviert
15muss immer 0 sein
+
+ +
Hinweis: Lt. Atari darf die Funktion ohne +Versionsabfrage benutzt werden (obwohl sie beispielsweise im TOS 1.0 +nicht vorhanden ist). Ermöglicht wird dies durch einen Seiteneffekt +im Dispatcher des XBIOS. Besser ist es allerdings, sich nicht darauf zu verlassen, +da der entsprechende Trap ja von anderen Programmen verbogen werden +kann, und dann evtl. nicht der richtige Return-Wert zurückgeliefert +wird. +
  +
Ergebnis: Die Funktion liefert als Ergebnis durch gesetzte Bits +Eigenschaften des Blitters-Chips: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
BitBedeutung
00: Blitter aus
 1: Blitter an
  
10: Blitter nicht vorhanden
 1: Blitter vorhanden
  
15immer 0
+
+ +
Alle weiteren Bits sind reserviert. +
  +
Verfügbar: Offiziell ist diese Funktion erst ab TOS-Version 1.02 +vorhanden. +
  +
Gruppe: Spezialbefehle +
  +
Querverweis: Binding +
  + +
+ +

4.20.1.1 Bindings für Blitmode

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Blitmode( int16_t mode ); +
  +
Assembler: +
  +
move.w    mode,-(sp)   ; Offset 2
+move.w    #64,-(sp)    ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.20.2 CacheCtrl

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »CacheCtrl« - CPU Cacheverwaltung +
  +
Xbiosnummer: 160 +
  +
Deklaration: int32_t CacheCtrl( int16_t OpCode, int16_t Param ); +
  +
Beschreibung: Die XBIOS-Routine CacheCtrl dient zur Verwaltung der CPU-Caches +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OpCodeBeschreibung
0Liefert 0 zurück, wenn die Funktion vorhanden ist.
1Zurückschreiben des Datencaches
2Zurückschreiben des Befehlscaches
3Zurückschreiben des Daten- und Befehlscaches
4Abfrage, ob Datencache aktiv ist
5Aktivieren/Deaktivieren des Datencaches
  Param= 0, ausschalten
  Param= 1, einschalten
  Zurückschreiben des Caches falls notwendig
6Abrage, ob Befehlscache aktiv ist
7Aktivieren/Deaktivieren des Befehlscaches
  Param= 0, ausschalten
  Param= 1, einschalten
  Zurückschreiben des Caches falls notwendig
+
+ +
Bemerkung: +
Im CT60 XBIOS hat der OpCode 5/7 dieselbe Funktionalität: +
mode: 0 = deaktivieren aller Caches. +
      1 = aktivieren aller Caches. +
Betroffen sind die folgenden Caches: Data Cache, Store Buffer, +Branch Cache, Instruction Cache. +
  +
Ergebnis: Im Erfolgsfall liefert die Funktion den Wert 0 oder EBADRQ, +wenn für OpCode ein Wert größer sieben übergeben wird. +
  +
Als Alternative steht auch der Treiber "CPU Cache Control +Driver v1.10" von Robert Federle und Thomas Tempelmann für +andere Rechner zur Verfügung. +
  +
Verfügbar Die Funktion ist auf dem Milan seit TOS 4.06 verfügbar. Im +CT60 XBIOS ab Version v0.98a. +
  +
Gruppe: Spezialbefehle +
  +
Querverweis: Binding +
  + +
+ +

4.20.2.1 Bindings für CacheCtrl

+ + + + + + +
C: int32_t CacheCtrl( int16_t OpCode, int16_t Param ); +
  +
Assembler: +
  +
move.w    Param,-(sp)  ; Offset 4
+move.w    OpCode,-(sp) ; Offset 2
+move.w    #160,-(sp)   ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.20.3 CJar

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »CJar« - Erzeugen, Abfragen und Löschen von Cookies +
  +
Xbiosnummer: 17226 (0x434A) +
  +
Deklaration: int32_t CJar( int16_t mode, int32_t cookie, int32_t *value ); +
  +
Beschreibung: Die XBIOS-Routine CJar dient auf komfortable Weise zum +Erzeugen, Abfragen und Löschen von Cookies. +
  + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
mode Modus 0: +
Ermittelt den Wert des Kekses und legt in an der angegebenen +Adresse ab. Übergibt man für value einen Nullzeiger, so wird +lediglich die Existenz des Kekses überprüft. +
Bei erfolgreicher Ermittlung des Kekses, liefert der Aufruf 0x6172 +(="CJar_OK") zurück, sonst einen anderen Wert. +
Modus 1: +
Erzeugt einen neuen Keks (cookie). Value zeigt auf +einen Wert, der in den Jar eingetragen wird. WICHTIG! Es wird nicht +value eingetragen, sondern der Wert auf den 'value' weist! Bei +Übergabe eines NULL-Pointers wird 0 als Kekswert eingetragen. +Existiert der Keks bereits, so wird sein alter Inhalt überschrieben! +
Die Funktion liefert "CJar_OK" bei erfolgreicher +Eintragung. -1 wird für den Fall geliefert, daß der Cookie-Jar voll +ist. +
Modus 2: +
Entfernt den Keks cookie aus dem Jar. Der Wert von +value ist egal. Liefert bei erfolgreicher Entfernung +"CJar_OK", sonst einen anderen Wert. +
Ist nur Verfügbar, wenn die Systemerweiterung Liberty (Cookie +'Lity') installiert ist. +
cookie Cookiebezeichnung +
value Adresse des Puffers, in dem die Daten abgelegt werden sollen. + +
+ +
Ergebnis: Im Erfolgsfall liefert die Funktion den Wert CJar_OK (0x6172) +zurück. +
  +
Verfügbar Die Funktion ist verfügbar, wenn der Cookie 'CJar' ($434A6172) +vorhanden ist. Dieser wird von JARxxx (Cookie Jar Manager) oder +Liberty erzeugt. +
  +
Gruppe: Spezialbefehle +
  +
Querverweis: Binding   Cookie Funktionen +
  + +
+ +

4.20.3.1 Bindings für CJar

+ + + + + + +
C: int32_t CJar( int16_t mode, int32_t cookie, int32_t *value ); +
  +
Assembler: +
  +
pea       value          ; Offset 8
+move.l    cookie,-(sp)   ; Offset 4
+move.w    mode,-(sp)     ; Offset 2
+move.w    #17226,-(sp)   ; Offset 0
+trap      #14            ; XBIOS aufrufen
+lea       12(sp),sp      ; Stack korrigieren
+
+ +
+ +

4.20.4 Dbmsg

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dbmsg« - +
  +
Xbiosnummer: 11 +
  +
Deklaration: void Dbmsg( int16_t rsrvd, int16_t msg_num, int32_t msg_arg ) +
  +
Beschreibung: Dbmsg() erlaubt es, spezielle Debuggingkommandos an einen +residenten Debugger zu schicken. +
  +
srsrvd ist zur Zeit reserviert und sollte immer den Wert +5 haben. +
  +
msg_num ist die Nachrichtennummer, die an den +Debugginghost geschickt wird. Werte von 0x0000 bis 0xEFFF werden für +applikationsspezifische Nachrichten benutzt. Werte von 0xF000 bis +0xFFFF werden für spezielle Debuggingnachrichten benutzt. Wenn +msg_num im Bereich der für die Applikation reservierten Werte +liegt, werden der Wert und der int32_t aus msg_arg angezeigt +und die Applikation wird angehalten. Wenn msg_num zwischen +0xF001 und 0xF0FF inklusive liegt, wird msg_arg als ein Zeiger +auf einen String, der vom Debugger ausgegeben werden soll, +interpretiert und das Debuggen untrerbrochen. Die Länge des Strings +wird im unteren Byte von msg_num angegeben. +
  +
Wenn msg_num den Wert DB_NULLSTRING (0xF000) hat, wird +der String bis zur abschließenden 0 ausgegeben. +
  +
Wenn msg_num den Wert DB_COMMAND (0xF100) hat, wird +msg_arg als ein Zeiger auf eine Zeichenkette mit einem +Debugger Kommando interpretiert. Das Format des Kommandos hängt von +dem bneutzten Debugger ab. Eine Anwendung bei Verwendung des Atari +Debuggers ist die Ausgabe eines Strings, ohne das Debuggen zu beenden: +
  +
Dbmsg( 5, DB_COMMAND, "echo 'Debugging Message';g" ); +
  +
Der Atari Debugger bis zur Version 3 kennt nur den Wert +DB_COMMAND (0xF100) für msg_num. Normalerweise ist es kein +Problem, ein Programm mit Debugging Messages ohne Debugger laufen zu +lassen, aus der endgültigen Version sollten diese Anweisungen +allerdings entfernt werden. +
  +
Ergebnis: +
  +
Verfügbar: Wenn ein Debugger geladen ist, der diese Funktion unterstützt. +Der einzige Debugger, der zur Zeit diese Funktion unterstützt, ist +der Atari Debugger. +
  +
Gruppe: Spezialbefehle +
  +
Querverweis: Binding +
  + +
+ +

4.20.4.1 Bindings für Dbmsg

+ + + + + + +
C: #include <tos.h> +
  +
void Dbmsg( int16_t rsrvd, int16_t msg_num, int32_t msg_arg ) +
  +
Assembler: +
  +
move.l    msg_arg,-(sp)  ; Offset 6
+move.w    msg_num,-(sp)  ; Offset 4
+move.w    srsrvd,-(sp)   ; Offset 2
+move.w    #11,-(sp)      ; Offset 0
+trap      #14            ; XBIOS aufrufen
+lea       10(sp),sp      ; Stack korrigieren
+
+ +
+ +

4.20.5 Janus

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Janus« - +
  +
Xbiosnummer: 43 +
  +
Deklaration: void Janus( int16_t mode ) +
  +
Beschreibung: Diese Funktion stellt der Hardware-Emulator Janus zur +Verfügung. Laut einem Artikel in der ST-Computer 1996-04, S. 44 kann +man damit folgendes erzielt werden. +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
modeBeschreibung
-1Ermitteln der aktiven parallele Schnittstelle
1Umschaltung auf die erste parallele Schnittstelle
2Umschaltung auf die zweite parallele Schnittstelle
256Verlassen von Janus
+
+ +
Hinweis: Alle Angabe ohne Gewähr, da der Artikel nicht +sehr ausführlich ist. +
  +
Ergebnis: Unbekannt bzw. siehe oben. +
  +
Verfügbar: Nur unter dem Hardware-Emulator Janus. +
  +
Gruppe: Spezialbefehle +
  +
Querverweis: Binding +
  + +
+ +

4.20.5.1 Bindings für Janus

+ + + + + + +
C: #include <tos.h> +
  +
void Janus( int16_t mode ) +
  +
Assembler: +
  +
move.w    mode,-(sp)    ; Offset 2
+move.w    #43,-(sp)     ; Offset 0
+trap      #14           ; XBIOS aufrufen
+addq.l    #4,sp         ; Stack korrigieren
+
+ +
+ +

4.20.6 Puntaes

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »punt AES« - AES abschalten. +
  +
Xbiosnummer: 39 +
  +
Deklaration: void Puntaes( void ); +
  +
Beschreibung: Die XBIOS-Routine Puntaes schaltet das AES-Betriebssystem +ab. Das AES wird nur gestart, wenn "os_magic" im OSHEADER +auf die korrekte magische Zahl (0x87654321) zeigt. Puntaes setzt +dieses Flag (sofern möglich) zurück und boote dann das System neu. +
  +
Hinweis: Ab MagiC 4.00 wurde diese Funktion verändert +und besitzt verschiedene Unterfunktionen. Zum Aufruf muss zusätzlich +der Wert 'AnKr' übergeben werden. Bei einer falschen Funktionsnummer +wird EINVFN zurückgeliefert. +
  +
int32_t Puntaes ( 'AnKr', subfn, ... ) +
+
  +
    +
  • int32_t Puntaes ( 'AnKr', 0 ) +
    System beenden und zurück zum MacOS bzw. Windows +
      +

  • +
  • int32_t Puntaes ( 'AnKr', 1, int16_t keycode ) +
    Wandle folgenden Alt-Tastencode in ASCII u. +
      +

  • +
  • int32_t Puntaes ( 'AnKr', 2 ) +
    Neustart (warm_boot, nur für Atari) +
      +

  • +
  • int32_t Puntaes ( 'AnKr', 3 ) +
    Kaltstart (cold_boot, nur für Atari) +
      +

  • +
  • int32_t Puntaes ( 'AnKr', 4, int32_t key ) seit 12.04.1998 +
    Ermittle Cookie +
    Liefert den Zeiger des Cookies key oder 0L wenn er nicht +vorhanden ist. +
      +

  • +
  • int32_t Puntaes ( 'AnKr', 5 ) +
    Date2str: initialisiert die interne Variable datemode von MagiC +und liefert einen Zeiger auf die interne Funktion date2str. +
      +
    void date2str ( int8_t *s, int16_t date ); +
    DOS-Datum in eine Zeichenkette umwandeln. +
      +

  • +
  • int32_t Puntaes ( 'AnKr', 6, vtsys *pointer ) +
    VT52 anmelden, alten Vektor zurückgeben. Ist pointer -1 +dann wird nur der alte Vektor zurückgeliefert, bei 0 wird er +gelöscht. +
      +

  • +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Verfügbar: Alle TOS Versionen. +
  +
Gruppe: Spezialbefehle +
  +
Querverweis: Binding   Cookie Funktionen +
  + +
+ +

4.20.6.1 Bindings für Puntaes

+ + + + + + +
C: #include <tos.h> +
  +
void Puntaes( void ); +
  +
Assembler: +
  +
move.w    #39,-(sp)    ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

4.20.7 Random

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »random generator« - Zufallsgenerator. +
  +
Xbiosnummer: 17 +
  +
Deklaration: int32_t Random( void ); +
  +
Beschreibung: Die XBIOS-Routine Random liefert (basierend auf einem +Zeitgeber des Rechners) eine 24-Bit-Zufallszahl zurück. +
  +
Hinweis: Es handelt sich bei dieser Funktion +nicht um einen Hardware-Zufallszahlengenerator, sondern um +eine Software-Version, die den folgenden Algorithmus benutzt: +
  +
X = (X * 3.1415926...) + 1
+
+
Zurückgeliefert wird der um 8 Bits nach rechts verschobene Wert +X. Das Verhalten für die gesamte Zahl ist übrigens recht gut, die +Abfrage einzelner Bits im Sinne einer verminderten Zufälligkeit +jedoch nicht ratsam. +
  +
Ergebnis: Die Funktion liefert als Ergebnis eine 24-Bit-Zufallszahl. +
  +
Verfügbar: Alle TOS Versionen. +
  +
Gruppe: Spezialbefehle +
  +
Querverweis: Binding +
  + +
+ +

4.20.7.1 Bindings für Random

+ + + + + + +
C: #include <tos.h> +
  +
int32_t Random( void ); +
  +
Assembler: +
  +
move.w    #17,-(sp)    ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

4.20.8 Ssbrk

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »set memory break point« - Speicherplatz reservieren. +
  +
Xbiosnummer: 1 +
  +
Deklaration: void *Ssbrk( int16_t count ); +
  +
Beschreibung: Die XBIOS-Routine Ssbrk reserviert Speicherplatz. Die Anzahl +der Bytes muß dabei in count übergeben werden. Diese +Funktion muß vor der Initialisierung des GEMDOS aufgerufen werden, +und sollte daher in Anwenderprogrammen nicht verwendet werden. +In allen Atari-ROM-Versionen ist diese Funktion lediglich als +Dummy-Routine implementiert. +
  +
Ergebnis: Die Funktion liefert die Anfangsadresse des allozierten +Speicherbereiches zurück. +
  +
Verfügbar: Alle TOS Versionen. +
  +
Gruppe: Spezialbefehle +
  +
Querverweis: Binding +
  + +
+ +

4.20.8.1 Bindings für Ssbrk

+ + + + + + +
C: #include <tos.h> +
  +
void *Ssbrk( int16_t count ); +
  +
Assembler: +
  +
move.w    count,-(sp)  ; Offset 2
+move.w    #1,-(sp)     ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.20.9 Supexec

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »supervisor execute« - führt Routine im Supervisor-Modus +aus. +
  +
Xbiosnummer: 38 +
  +
Deklaration: int32_t Supexec( int32_t (*func)( ) ); +
  +
Beschreibung: Die XBIOS-Routine Supexec führt die Routine unter +func im Supervisor-Modus aus. +
  +
Ergebnis: Die Funktion liefert den Return-Wert der aufgerufenen Funktion +zurück. +
  +
Verfügbar: Alle TOS Versionen. +
  +
Gruppe: Spezialbefehle +
  +
Querverweis: Binding   Super +
  + +
+ +

4.20.9.1 Bindings für Supexec

+ + + + + + +
C: #include <tos.h> +
  +
int32_t Supexec( int32_t (*func)( ) ); +
  +
Assembler: +
  +
pea       func         ; Offset 2
+move.w    #38,-(sp)    ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #6,sp        ; Stack korrigieren
+
+ +
+ +

4.20.10 Trapper

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Trapper« - Hook into system functions. +
  +
Xbiosnummer: 555 +
  +
Deklaration: int32_t xbios( 555, int16_t layer, int16_t install, int16_t +opcode, void *function ); +
  +
Beschreibung: Mit Hilfe von Trapper können sich andere Programme effektiv +und einfach vor und hinter Systemaufrufe hängen, diese sogar ganz +ersetzen, oder dem System neue Systemaufrufe hinzufügen. +
  +
Bei Trapper handelt sich es um ein externes Programm! +
  +
Mehr Information in der dortigen Anleitung. +
  +
Ergebnis: +
  +
Gruppe: Spezialbefehle +
  +
Verfügbar: Die Funktion ist nur auf Computern vorhanden bei denen das +Programm Trapper installiert ist. +
  +
Querverweis: Binding +
  + +
+ +

4.20.10.1 Bindings für Trapper

+ + + + + + +
C: #include <tos.h> +
  +
int32_t xbios( 555, int16_t layer, int16_t install, int16_t +opcode, void *function ); +
  +
Assembler: +
  +
pea (a2)                  ; TOS does not save A2 in traps
+move.l    function,-(sp)  ; Offset 8
+move.w    opcode,-(sp)    ; Offset 6
+move.w    install,-(sp)   ; Offset 4
+move.w    layer,-(sp)     ; Offset 2
+move.w    #555,-(sp)      ; Offset 0
+trap      #14             ; XBIOS aufrufen
+lea       12(sp),sp       ; Stack korrigieren
+move.l    (sp)+,a2        ; restore A2
+
+ +
+ +

4.20.11 WdgCtrl

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »WdgCtrl« - Einstellen des Hardware-Watchdog +
  +
Xbiosnummer: 161 +
  +
Binding: int32_t WdgCtrl ( int16_t OpCode ); +
  +
Beschreibung: Diese Funktion de- oder aktiviert den Hardware-Watchdog. +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
Parameterwert
OpCode0x0000 - return 0 to check that WdgCtrl is present
 0x1234 - enable watchdog
 0xdead - disable watchdog
 0x4242 - re-trigger watchdog
+
+ +
Hinweis: Die Funktion ist für die Hardware des Milans +2.1. Die Version gibt es allerdings nur als Spezialversion und ist +nicht frei verfügbar. +
  +
Ergebnis: +
  + + + + + + + + + +
E_OK (0) - OK +
EUNDEV (-15) - Watchdog nicht vorhanden +
EBADRQ (-5) - OpCode nicht implementiert + +
+ +
Verfügbar: Die Funktion ist ab dem MilanTOS mit dem Datum 2002-06-09 +vorhanden. +
  +
Gruppe: Spezialbefehle +
  +
Querverweis: Binding +
  + +
+ +

4.20.11.1 Bindings für WdgCtrl

+ + + + + + +
C: int32_t WdgCtrl ( int16_t OpCode ); +
  +
Assembler: +
  +
pea (a2)                  ; TOS does not save A2 in traps
+move.w    OpCode,-(sp)    ; Offset 2
+move.w    #161,-(sp)      ; Offset 0
+trap      #14             ; XBIOS aufrufen
+lea       4(sp),sp        ; Stack korrigieren
+move.l    (sp)+,a2        ; restore A2
+
+ +
+ +
+ +Home +XBIOSXBIOS +SoundroutinenSoundroutinen +TastaturfunktionenTastaturfunktionen + + diff --git a/de/xbios_structures.html b/de/xbios_structures.html new file mode 100644 index 000000000..805c84dbf --- /dev/null +++ b/de/xbios_structures.html @@ -0,0 +1,1039 @@ + + + + + +Die Anleitung zum TOS: XBIOS Strukturen + + + + + + + + + +Home +XBIOSXBIOS +XBIOS-FunktionslisteXBIOS-Funktionsliste +GEMDOSGEMDOS + +
+ +

4.24 XBIOS Strukturen

+ +
+

4.24.1 BCONMAP

+
typedef struct
+{
+   MAPTAB  *maptab;     /* Liste der seriellen Schnittstellen         */
+   int16_t  maptabsize; /* Anzahl der Schnittstellentreiber           */
+
+   /* Undokumentiertes, bei TOS und MagiC so: */
+   int16_t  auxnr;      /* aktuell auf AUX eingestellte Kanalnummer   */
+   int32_t  rscon;      /* Zeiger auf aktuell eingestellte Rsconf-
+                           Funktion */
+   int32_t  iorec;      /* Zeiger auf IOREC des aktuellen Kanals      */
+} BCONMAP;
+
+Querverweis: Bconmap
+
+

4.24.2 CD_DISC_INFO

+

Diese Struktur ist wie folgt definiert: +

+
typedef struct
+{
+   uint8_t  disctype;         /* 0: audio, 1: data */
+   uint8_t  firsttrack, lasttrack, curtrack;
+   uint8_t  relposz, relposm, relposs, relposf;
+   uint8_t  absposz, absposm, absposs, absposf;
+   uint8_t  endposz, endposm, endposs, endposf;
+   uint8_t  index, res[3];
+   uint32_t reserved[123];
+} CD_DISC_INFO;
+
+

Querverweis: Metadiscinfo +

+

4.24.3 CD_TOC_ENTRY

+

Die Struktur CD_TOC_ENTRY ist wie folgt definiert: +

+
typedef struct
+{
+   uint8_t trackno;
+   uint8_t minute;
+   uint8_t second;
+   uint8_t frame;
+} CD_TOC_ENTRY;
+
+

Querverweis: CD-ROM Opcodes für Fcntl +

+

4.24.4 DSPBLOCK

+

Diese Struktur ist wie folgt definiert: +

+
typedef struct
+{
+   int16_t  blocktype;  /* Typ der Daten im Puffer: */
+                        /*   0 : LongInt            */
+                        /*   1 : Integer            */
+                        /*   2 : Byte               */
+   int32_t  blocksize;  /* Puffergröße              */
+   void    *blockaddr;  /* Zeiger auf den Puffer    */
+} DSPBLOCK;
+
+
+

Querverweis: Dsp_MultBlocks   DSP-Programmierung +

+

4.24.5 IOREC

+

Diese Struktur ist wie folgt definiert: +

+
typedef struct
+{
+   void    *ibuf;        /* Zeiger auf den Buffer   */
+   int16_t ibufsiz;      /* Größe des Buffers       */
+   int16_t ibufhd;       /* nächste Schreibposition */
+   int16_t ibuftl;       /* nächste Leseposition    */
+   int16_t ibuflow;      /* Marke für Xon           */
+   int16_t ibufhi;       /* Marke für Xoff          */
+} IOREC;
+
+

Hinweis: Für die serielle Schnittstelle schließt sich +direkt ein entsprechender Puffer für die Ausgabe an. Die beiden +letzten Zeiger werden nur für die serielle Schnittstelle im XON/XOFF +bzw. RTS/CTS-Betrieb genutzt. +

+

Fällt nämlich der Pegel unter die untere 'Wassermarke', so +wird der Sender aufgefordert weitere Zeichen zu senden; übersteigt er +hingegen die obere 'Wassermarke' so wird ihm signalisiert, keine +Zeichen mehr zu schicken. +

+

Querverweis: Iorec +

+

4.24.6 KEYBDPARMS

+
typedef struct
+{
+  KEYTAB *keytblx;           /* Adresse der 6 Tabellen       */
+  int8_t  *kbshift;          /* Adresse des Shiftstatus      */
+  int8_t  *altgr_status;     /* Adresse des AltGr- Status    */
+  void    (*handle_key)();   /* Adresse der Tastaturroutine  */
+  int8_t  *keyrepeat;        /* Adresse der Wdh.daten        */
+} KEYBDPARMS;
+
+

- keytblx ist auch über Keytbl zu ermitteln +

+

- kbshift ist auch über den TOS- Header ermittelbar. +

+

- Das Flag altgr_status darf nur $00 oder $ff sein! +
Die Tastaturbelegung unter AltGr ist so gewählt, daß die +akzentuierten Zeichen stets in der Nähe der zugehörigen Grundzeichen +liegen. Einige der Tasten (Cursortasten, Leertaste usw.) haben unter +AltGr ihre normale Funktion, alle anderen liefern im Lobyte das ASCII- +Zeichen und im High- byte immer $5f, was ein ungültiger Scancode ist. +Die Belegung ist an eine Standard- MF2 Tastatur angepaßt. +
Gedacht ist diese Erweiterung für einen Treiber für eine MF2 +Tastatur, der selbst das AltGr- Flag kontrolliert und dem TOS- Treiber +lediglich Scancodes liefert. +
Um nicht nur die AltGr-Tabellen, sondern auch die Standardtabellen +an die MF2- Tastatur anpassen zu können, enthält das BIOS die ersten +drei Tastaturtabellen zusätzlich auch in MF2- Ausführung. Um das TOS +auf MF2 umzuschalten, schaltet man das KAOS- Konfigurationsbit 9 ein. +Der nächste XBIOS-Aufruf Bioskeys setzt dann je nach diesem Bit die +Atari- oder die MF2- Tabellen. Die AltGr- Tabellen ohne SHIFT und mit +CapsLock werden dabei immer als identisch gesetzt. +
Um die zusätzlichen Tastaturebenen auch auf der Originaltastatur +verfügbar zu machen, kann man mit ALT-CapsLock das AltGr-Flag +toggeln. +

+

In MagiC ist dieses Umschalten nicht mehr vorhanden! +

+

Querverweis: Bioskeys   Keytbl   Sconfig +

+

4.24.7 KBDVBASE

+

Diese Struktur ist wie folgt definiert: +

+
typedef struct
+{
+   void   (*kb_midivec)();   /* MIDI Interrupt-Vektor    */
+   void   (*kb_vkbderr)();   /* Tastatur Fehler-Vektor   */
+   void   (*kb_vmiderr)();   /* MIDI Fehler-Vektor       */
+   void   (*kb_statvec)();   /* Tastatur-Status          */
+   void   (*kb_mousevec)();  /* Tastatur-Maus-Status     */
+   void   (*kb_clockvec)();  /* Tastatur-Zeitgeber       */
+   void   (*kb_joyvec)();    /* Tastatur-Joystick-Status */
+   void   (*kb_midisys)();   /* System-Midi-Vektor       */
+   void   (*kb_kbdsys)();    /* Tastatur-Vektor          */
+   int8_t drvstat;           /* Tastatur-Treiberstatus   */
+} KBDVBASE;
+
+

Hinweis: Bei den Komponenten kb_clockvec und +kb_joyvec ist zu beachten, daß die Adresse des Paketes im +Register A0 und auf dem Stack übergeben wird; die Routinen sollten +außerdem mit einem RTS abgeschlossen sein, und nach Möglichkeit +nicht länger als 1ms laufen. +

+

Die Komponente drvstat enthält einen Wert ungleich +Null, wenn der IKBD gerade eine Paket verschickt. +

+

Querverweis: Kbdvbase +

+

4.24.8 KEYTAB

+
typedef struct
+{
+   int8_t *unshift;       /* Tabelle 'normale' Tastendrücke */
+   int8_t *shift;         /* Tabelle Shift-Tastendrücke     */
+   int8_t *capslock;      /* Tabelle Capslock-Tastendrücke  */
+   int8_t *altunshift;    /* ab TOS 4.00, undokumentiert!   */
+   int8_t *altshift;      /* ab TOS 4.00, undokumentiert!   */
+   int8_t *altcapslock;   /* ab TOS 4.00, undokumentiert!   */
+   int8_t *altgr;         /* ab TOS 4.06, undokumentiert!   */
+} KEYTAB;
+
+

Ab KAOS 1.4.2 und MagiC sind altunshift, +altshift und altcapslock vorhanden. +

+

Querverweis: Keytbl +

+

4.24.9 MAPTAB

+
typedef struct
+{
+   int16_t  (*Bconstat)(void);
+   int32_t  (*Bconin)(void);
+   int32_t  (*Bcostat)(void);
+   void     (*Bconout)(int16_t dev, int16_t c);
+   uint32_t (*Rsconf)(int16_t baud, int16_t ctr, int16_t ucr, int16_t rsr, int16_t tsr, int16_t scr);
+   IOREC    *iorec;
+} MAPTAB;
+
+

Querverweis: Bconmap   BCONMAP +

+

4.24.10 META_DRVINFO

+
typedef struct
+{
+   int8_t  *mdr_name;
+   int32_t  reserved[3];
+} META_DRVINFO;
+
+

Querverweis: Laufwerksfunktionen   Metaopen +

+

4.24.11 META_INFO_1

+
typedef struct
+{
+   uint32_t    drivemap;  /* Bits für MetaDOS Laufwerke.   */
+                          /*   (Bit-0 = Laufwerk-A, usw.)  */
+   int8_t      *version;  /* Name und Version von MetaDOS  */
+   int32_t     reserved;  /* reserviert                    */
+   META_INFO_2 *info;     /* Zeiger auf zweite Struktur    */
+} META_INFO_1;
+
+

Hinweis: Die Komponente info ist erst ab MetaDOS +V2.30 vorhanden! +

+

Querverweis: Metainit +

+

4.24.12 META_INFO_2

+
typedef struct
+{
+   /* Versionsnummer (0x230 = '02.30') */
+   uint16_t     mi_version;
+   /* Magic Konstante '_MET' */
+   int32_t      mi_magic;
+   /* Zuordnung GEMDOS->MetaDOS */
+   const int8_t *mi_log2phys;
+} META_INFO_2;
+
+

Hinweis: Diese Struktur existiert erst ab MetaDOS Version +2.30. Der Parameter mi_log2phys ist ein Zeiger auf ein Feld, +das zu jedem GEMDOS-Gerät den dazugehörigen MetaDOS +Laufwerksbuchstaben oder Null enthält. Mit Hilfe dieser Information +kann man also feststellen, welcher MetaDOS Laufwerksbuchstabe zu +welchem GEMDOS-Laufwerk gehört. +

+

Querverweis: Metainit   META_INFO_1 +

+

4.24.13 MOD_DESC

+
typedef struct
+{
+   int8_t  Name[34];   /* beschreibender Text     */
+   int32_t colors;
+   int16_t xres,yres;
+   int32_t fileptr;    /* Zeiger in die Modedatei */
+} MOD_DESC;
+
+

Querverweis: Crazy-Dots-XBIOS-Erweiterung +

+

4.24.14 MOUSE

+
typedef struct
+{
+   int8_t  topmode;  /* 0: Y=0 am unteren Rand,    */
+                     /* 1: Y=1 am oberen Rand      */
+   int8_t  buttons;  /* analog IKBD                */
+   int8_t  x_scale;  /* zusätzliche Parameter, vom */
+   int8_t  y_scale;  /* gewählten Modus abhängig.  */
+   int16_t x_max;    /* maximale X-Position        */
+   int16_t y_max;    /* maximale Y-Position        */
+   int16_t x_start;  /* Anfangsposition X          */
+   int16_t y_start;  /* Anfangsposition Y          */
+} MOUSE;
+
+

Hinweis: Die Komponenten x_max und folgende sind +nur im absoluten Modus verfügbar. +

+

Querverweis: GEM   Initmouse   VDI +

+

4.24.15 OVERPATCH

+
typedef struct
+{
+   int16_t low_w  ,mid_w  ,high_w;   /* Breite in Pixeln                */
+   int16_t low_h  ,mid_h  ,high_h;   /* Höhe   in Pixeln                */
+   int32_t low_off,mid_off,high_off; /* Offset Bildspeicher<>Logbase    */
+   int32_t mono_add,color_add;       /* Zusätzlicher Speicherbedarf     */
+   int8_t  clear_scan;               /* Scancode  der Clear-Funktion    */
+   int8_t  clear_shift;              /* Shiftcode der Clear-Funktion    */
+   int8_t  setup_shift;              /* Shiftcode für Setup (Maske)     */
+   int8_t  invert_shift;             /* Shiftcode zum Invert. des Modus */
+   int8_t  abort_shift;              /* Shiftcode zum Abbrechen         */
+} OVERPATCH;
+
+

Querverweis: Oscanpatch   OverScan-XBIOS-Erweiterungen +

+

4.24.16 PBDEF

+
typedef struct
+{
+   void    *pb_scrptr;  /* Zeiger auf Bildschirmanfang     */
+   int16_t  pb_offset;  /* dazu zu addierender Offset      */
+   int16_t  pb_width;   /* Bildschirmbreite in Punkten     */
+   int16_t  pb_height;  /* Bildschirmhöhe in Punkten       */
+   int16_t  pb_left;    /* Linker Rand in Punkten          */
+   int16_t  pb_right;   /* Rechter Rand in Punkten         */
+   int16_t  pb_screz;   /* Auflösung                       */
+   int16_t  pb_prrez;   /* Druckertyp (Atari/Epson)        */
+   void    *pb_colptr;  /* Zeiger auf Farbpalette          */
+   int16_t  pb_prtype;  /* 0: Atari Matrix monochrom
+                           1: Atari Matrix farbig
+                           2: Atari Typenrad monochrom
+                           3: Epson Matrix monochrom       */
+   int16_t  pb_prport;  /* Schnittstelle Centronics/RS-232 */
+   void    *pb_mask;    /* Zeiger auf Halbtonmaske         */
+} PBDEF;
+
+

Hinweis: Es muß darauf geachtet werden, daß die Summe +der Komponenten pb_width, pb_left und pb_right +genau die tatsächliche Bildschirmbreite ergibt. +

+

Querverweis: Prtblk   XBIOS +

+

4.24.17 PCI_RSC_DESC

+
typedef struct
+{
+  uint16_t next;      /* Länge dieser Struktur in Bytes, dient zur      */
+                      /* Ermittlung des nächsten Deskiptors             */
+  uint16_t flags;     /* Resourcen-Typ und verschiedene andere Flags    */
+  uint32_t start;     /* Startadresse der Resource im PCI Adreßbereich, */
+                      /* ist die Resource nicht direkt ansprechbar,     */
+                      /* so ist die Adresse 0                           */
+  uint32_t length;    /* Länge der Resource                             */
+  uint32_t offset;    /* Offset von der physikalischen CPU-Adresse      */
+                      /* zur PCI-Adresse                                */
+  uint32_t dmaoffset; /* Offset für DMA-Transfers vom/zum Hauptspeicher */
+} PCI_RSC_DESC;
+
+

Um den Deskriptor der nächsten Resource des PCI-Gerätes zu +ermitteln, muß man zur Startadresse des aktuellen Deskriptors das +Feld next addieren. Das Feld start gibt den Beginn der entsprechenden +Resource im PCI-Adreßbereich an. Falls diese Resource nicht direkt +ansprechbar sein sollte, so steht in diesem Feld die Adresse 0. Über +length kann man schließlich die Länge dieser Resource bestimmen. Der +PCI-Adreßbereich ist im allgemeinen nicht mit der von der CPU aus +gesehenen Adresse gleichzusetzen. Der Adreß-Offset, der zur +PCI-Adresse zu addieren ist, um die physikalische Adresse für die CPU +zu ermitteln, ist im Feld offset abgelegt.Der Eintrag dmaoffset gibt +schließlich den Offset an, der zur PCI-Adresse addiert werden muß, +wenn es sich um DMA-Transfers handelt. +

+

Die Flags im Resource-Deskriptor +

+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RSC_ROM0x2000This is an expansion ROM (must be Memory, not IO)
RSC_IO0x4000kennzeichnet einen I/O-Bereich, bei
  gelöschten Bit handelt es sich um
  einen memory-Bereich
RSC_LAST0x8000letzte Resource für dieses PCI-Gerät
FLG_8BIT0x01008 Bit Zugriffe werden unterstützt
FLG_16BIT0x020016 Bit Zugriffe werden unterstützt
FLG_32BIT0x040032 Bit Zugriffe werden unterstützt
FLG_ENDMASK0x000Fkennzeichnet das Byte Ordering:
  0: Motorola (big endian)
  1: Intel (little endian), address swapped
  2: Intel (little endian), lane swapped
  3..14: reserviert
  15: unbekannt, Zugriff nur über BIOS möglich
+
+ +

The start field contains the start address on the PCI +bus of the resource. If the resource is not directly accessible, the +start address is 0. +

+

The length field contains its length. +

+

The offset field contains the offset from physical CPU +to PCI address for the resource - ie. the value that must be added to +the PCI address to get the physical address in CPU address space. +

+

The dmaoffset gives the offset that a PCI bus master +must add to a CPU memory address to access that address in main memory +over the PCI BUS. +

+

What are all these byte orders? +

+

The PCI-bus is defined as a little endian byte ordering bus. The +most significant byte of a multi-byte number is located at the lowest +address occupied by this number. +

+

The 68xxx-series CPUs are big endian. PCI-bus and CPU are +connected together by a host bridge which does some kind of format +conversion. The PCI-BIOS knows about the format conversion performed +by the host bridge. The PCI-BIOS does not know about any format +conversion done (internally) by PCI devices. The driver has to know +its device's properties and capabilities. +

+

The table shows what 68xxx data byte (top row) is connected to +what PCI-bus data byte (lower right) by what 68xxx-access and format +conversion (left column): +

+
                  68xxx-CPU data bus bits
+                  D31..24  D23..16  D15..8   D7..0
+----------------------------------------------------
+big endian
+32-bit-access +0  D31..24  D23..16  D15..8   D7..0
+16-bit-access +0  D15..8   D7..0
+16-bit-access +2                    D31..24  D23..16
+ 8-bit-access +0  D7..0
+ 8-bit-access +1           D15..8
+ 8-bit-access +2                    D23..16
+ 8-bit-access +3                             D31..24
+----------------------------------------------------
+little endian, lane swapped
+32-bit-access +0  D0..7    D15..8   D23..16  D31..24
+16-bit-access +0  D0..7    D15..8
+16-bit-access +2                    D23..16  D31..24
+ 8-bit-access +0  D0..7
+ 8-bit-access +1           D15..8
+ 8-bit-access +2                    D23..16
+ 8-bit-access +3                             D31..24
+----------------------------------------------------
+little endian, address swapped
+32-bit-access +0  D31..24  D23..16  D15..8   D7..0
+16-bit-access +0  D31..24  D23..16
+16-bit-access +2                    D15..8   D7..0
+ 8-bit-access +0  D31..24
+ 8-bit-access +1           D23..16
+ 8-bit-access +2                    D15..8
+ 8-bit-access +3                             D7..0
+
+
    +
  • "Big endian" makes the PCI-bus appear as a big endian +resource from the viewpoint of the 68xxx processor. It requires +dynamic route changes in the host bridge and seems not to be +implemented by any host bridge. +
      +

  • +
  • "Little endian, lane swapped" is the easy way to make +8 bit per pixel modes work in the frame buffer of a PCI-device (VGA +controller) which does not have its own format conversion. This mode +is used in PCI-Macintoshs and for memory and IO accesses in the Milan. +In this mode, the address needs no modifications. 8-bit accesses work +normal, on 16 and 32 bit accesses endian conversion must be performed +on the the read or written data (ror.w #8,d0 for 16 bit, ror.w +#8,d0:swap d0:ror.w #8,d0 for 32 bit). +
      +

  • +
  • "Little endian, address swapped" is the way to go if +accesses to 32 bit registers or 32 bit per pixel frame buffers have +top priority. In this mode, 32 bit accesses work without +modifications. On 16 bit accesses, the address needs to be XOR'd with +a value of 2, on 8-bit accesses the address is XOR'd with a value of +3. The data read or written is in correct format. +
      +

  • +
+ +

Querverweis: get_resource +

+

4.24.18 PMODE

+
typedef struct  {
+   int8_t  name[34];
+   int16_t mode_id;       /* lfd. Nr.                             */
+   int16_t xres,yres;     /* Breite/Höhe in Pixeln                */
+   int16_t fx,fy;         /* Breite/Höhe gesamt                   */
+   int32_t colors;        /* Anzahl gleichzeitiger Farben         */
+   int16_t org;           /* Organisation des Speichers           */
+   int16_t fh10,fv10;     /* Zeilenfreq.*10, Bildfreq*10          */
+   int16_t aspect100;     /* 100*PixelBreite/PixelHöhe            */
+   int16_t disp_scan100;
+   int32_t clk;           /* Dotclock in Hz                       */
+   /*
+   * Register des Grafikcontrollers
+   */
+   int16_t Clock;         /* Frequenznummer, muß vorm Schreiben in */
+                          /* das Clock-Register über die IcsLut
+                             umgesetzt werden (s. u.)              */
+   int8_t  misc_out;
+   int8_t  ts[10];        /* Timing Sequencer Regs.                */
+   int8_t  crtc[35];      /* CRT-Controller Regs.                  */
+   int8_t  gdc[10];       /* Graphics Display Controller           */
+   int8_t  atc[24];       /* Attribute Controller                  */
+   int8_t  reserved[18];
+} PMODE;
+
+static int8_t IcsLut[32] = { 0,16,8,24,4,20,12,28,2,18,10,26,6,22,14,
+               30,1,17,9,25,5,21,13,29,3,19,11,27,7,23,15,31 };
+
+

Querverweis: Crazy-Dots-XBIOS-Erweiterung   ReadMode   +GetActiveModeDesc +

+

4.24.19 SCRCLIPMEMBLK

+
typedef struct _scrclipblk
+{
+  int32_t size;        /* size of structure            */
+  int32_t blk_status;  /* status bits of blk           */
+  int32_t blk_clip_on; /* clipping flag 1:on, 0:off    */
+  int32_t blk_x;       /* x pos in total screen        */
+  int32_t blk_y;       /* y pos in in total screen     */
+  int32_t blk_w;       /* width                        */
+  int32_t blk_h;       /* height                       */
+} SCRCLIPMEMBLK;
+
+

Querverweise: Setscreen, ct60 +

+

4.24.20 SCRCOPYMEMBLK

+
typedef struct _scrcopyblk
+{
+  int32_t size;                 /* size of structure            */
+  int32_t blk_status;           /* status bits of blk           */
+  int32_t blk_src_x;            /* x pos source in total screen */
+  int32_t blk_src_y;            /* y pos source in total screen */
+  int32_t blk_dst_x;            /* x pos dest in total screen   */
+  int32_t blk_dst_y;            /* y pos dest in total screen   */
+  int32_t blk_w;                /* width                        */
+  int32_t blk_h;                /* height                       */
+  int32_t blk_op;               /* mode operation               */
+} SCRCOPYMEMBLK;
+
+

Querverweise: Setscreen, ct60 +

+

4.24.21 SCREEN

+
typedef struct
+{
+   int8_t   xbra_id[4];       /* XBRA-Id: 'CDOT'                      */
+   int8_t   version[4];       /* z.B.: '1.10'                         */
+   int8_t  *sm194_addr;       /* Zeiger auf Großbildschirmspeicher    */
+   int8_t  *sm124_addr;       /* Zeiger auf SM124 Bildspeicher.       */
+   LINEA   *line_A;           /* Zeiger auf LINE_A Block.             */
+   int16_t  scrn_width;       /* Bildschirmweite                      */
+   int16_t  scrn_height;      /* Bildschirmhöhe                       */
+   int16_t  scrn_byte_width;  /* Bildschirmweite in Bytes             */
+   int16_t  scrn_planes;      /* Bildschirmfarbebenen                 */
+   int16_t  PhysMode;         /* Modusmummer                          */
+   int16_t  VirtMode;         /* x/16 u. y/16 in je einem Byte cod.   */
+   PMODE   *ModStruct;        /* Zeiger auf akt. Grafikmodus (s.u.)   */
+   int16_t  grau;/* Flag für den VDI-Treiber (Darstellung: Grau/Farbe)*/
+   int16_t  BiosText;         /* Flag für den VDI-Treiber             */
+   int16_t  CurText;          /* Flag für den VDI-Treiber             */
+   int16_t  BlitMode;         /*           "                          */
+} SCREEN;
+
+

Querverweis: Crazy-Dots-XBIOS-Erweiterung +

+

4.24.22 SCREENINFO

+ + + + + + + + + + +
/* scrFlags */
+ #define SCRINFO_OK 1
+
+/* scrClut */
+ #define NO_CLUT    0
+ #define HARD_CLUT  1
+ #define SOFT_CLUT  2
+
+/* scrFormat */
+ #define INTERLEAVE_PLANES  0
+ #define STANDARD_PLANES    1
+ #define PACKEDPIX_PLANES   2
+
+/* bitFlags */
+ #define STANDARD_BITS  1
+ #define FALCON_BITS    2
+ #define INTEL_BITS     8
+
+typedef struct screeninfo
+{
+  int32_t size;        /* Size of structur           */
+  int32_t devID;       /* Device ID number           */
+  int8_t  name[64];    /* Friendly name of Screen    */
+  int32_t scrFlags;    /* Some flags                 */
+  int32_t frameadr;    /* Adress of framebuffer      */
+  int32_t scrHeight;   /* Visible X res              */
+  int32_t scrWidth;    /* Visible Y res              */
+  int32_t virtHeight;  /* Virtual X res              */
+  int32_t virtWidth;   /* Virtual Y res              */
+  int32_t scrPlanes;   /* color Planes               */
+  int32_t scrColors;   /* # of colors                */
+  int32_t lineWrap;    /* # of bytes to next line    */
+  int32_t planeWarp;   /* # of bytes to next plane   */
+  int32_t scrFormat;   /* Screen format              */
+  int32_t scrClut;     /* Type of clut               */
+  int32_t redBits;     /* Mask of Red Bits           */
+  int32_t greenBits;   /* Mask of Green Bits         */
+  int32_t blueBits;    /* Mask of Blue Bits          */
+  int32_t alphaBits;   /* Mask of Alpha Bits         */
+  int32_t genlockBits; /* Mask of Genlock Bits       */
+  int32_t unusedBits;  /* Mask of unused Bits        */
+  int32_t bitFlags;    /* Bits organisation flags    */
+  int32_t maxmem;      /* Max. memory in this mode   */
+  int32_t pagemem;     /* Needed memory for one page */
+  int32_t max_x;       /* Max. possible width        */
+  int32_t max_y;       /* Max. possible heigth       */
+}SCREENINFO;
+
+

Querverweise: Setscreen, Milan   Setscreen, ct60 +

+

4.24.23 SCREEN, OverScan

+
typedef struct
+{
+   int16_t width;             /* Breite in Pixel                     */
+   int16_t height;            /* Höhe   in Pixel                     */
+   int16_t bytes_per_line;    /* Bytes pro Bildschirmzeile           */
+   int32_t length_of_screen;  /* Länge des Bildspeichers in Bytes    */
+   int32_t physbase_offset;   /* Offset Start-Bildspeicher<>Physbase */
+   int32_t logbase_offset;    /* Offset Start-Bildspeicher<>Logbase  */
+} SCREEN;
+
+

Querverweis: OverScan-XBIOS-Funktionen   Oscantab +

+

4.24.24 SCRFILLMEMBLK

+
/* operations */
+ #define BLK_CLEAR        0
+ #define BLK_AND          1
+ #define BLK_ANDREVERSE   2
+ #define BLK_COPY         3
+ #define BLK_ANDINVERTED  4
+ #define BLK_NOOP         5
+ #define BLK_XOR          6
+ #define BLK_OR           7
+ #define BLK_XNOR         8
+ #define BLK_EQUIV        9
+ #define BLK_INVERT       10
+ #define BLK_ORREVERSE    11
+ #define BLK_COPYINVERTED 12
+ #define BLK_ORINVERTED   13
+ #define BLK_NAND         14
+ #define BLK_SET          15
+
+typedef struct _scrsetblk
+{
+  int32_t size;                  /* size of structure           */
+  int32_t blk_status;            /* status bits of blk          */
+  int32_t blk_op;                /* mode operation              */
+  int32_t blk_color;             /* background fill color       */
+  int32_t blk_x;                 /* x pos in total screen       */
+  int32_t blk_y;                 /* y pos in total screen       */
+  int32_t blk_w;                 /* width                       */
+  int32_t blk_h;                 /* height                      */
+  int32_t blk_unused;
+} SCRFILLMEMBLK;
+
+

Querverweise: Setscreen, ct60 +

+

4.24.25 SCRLINEMEMBLK

+
typedef struct _scrlineblk
+{
+  int32_t size;        /* size of structure            */
+  int32_t blk_status;  /* status bits of blk           */
+  int32_t blk_fgcolor; /* foreground fill color        */
+  int32_t blk_bgcolor; /* background fill color        */
+  int32_t blk_x1;      /* x1 pos dest in total screen  */
+  int32_t blk_y1;      /* y1 pos dest in total screen  */
+  int32_t blk_x2;      /* x2 pos dest in total screen  */
+  int32_t blk_y2;      /* y2 pos dest in total screen  */
+  int32_t blk_op;      /* mode operation               */
+  int32_t blk_pattern; /* pattern (-1: solid line)     */
+} SCRLINEMEMBLK;
+
+

Querverweise: Setscreen, ct60 +

+

4.24.26 SCRMEMBLK

+ + + +
+ #define BLK_ERR      0
+ #define BLK_OK       1
+ #define BLK_CLEARED  2
+
+typedef struct _scrblk
+{
+  int32_t size;              /* Size of strukture                  */
+  int32_t blk_status;        /* Status bits of blk                 */
+  int32_t blk_start;         /* Start adress                       */
+  int32_t blk_len;           /* Length of memblk                   */
+  int32_t blk_x;             /* X pos in total screen              */
+  int32_t blk_y;             /* Y pos in total screen              */
+  int32_t blk_w;             /* Width                              */
+  int32_t blk_h;             /* Height                             */
+  int32_t blk_wrap;          /* Width in bytes, from: 2000-01-13   */
+} SCRMEMBLK;
+
+

Querverweise: Setscreen, Milan   Setscreen, ct60 +

+

4.24.27 SCRTEXTUREMEMBLK

+
typedef struct _scrtextureblk
+{
+  long size;                /* size of structure             */
+  long blk_status;          /* status bits of blk            */
+  long blk_src_x;           /* x pos source                  */
+  long blk_src_y;           /* y pos source                  */
+  long blk_dst_x;           /* x pos dest in total screen    */
+  long blk_dst_y;           /* y pos dest in total screen    */
+  long blk_w;               /* width                         */
+  long blk_h;               /* height                        */
+  long blk_op;              /* mode operation                */
+  long blk_src_tex;         /* source texture address        */
+  long blk_w_tex;           /* width texture                 */
+  long blk_h_tex;           /* height texture                */
+}SCRTEXTUREMEMBLK;
+
+

Querverweise: Setscreen, ct60 +

+

4.24.28 VDO_MODE

+
/* mode code xxxx xxxF SOPV 8NNN */
+typedef struct
+{
+   uint16_t Plan:3;           /* Bit 0-2: NNN (Anzahl Planes)       */
+   uint16_t _80Col:1;         /* Bit 3: Flag 80 Spalten (8)         */
+   uint16_t VGA:1;            /* Bit 4: Flag VGA (V)                */
+   uint16_t Pal:1;            /* Bit 5: Flag Pal (P)                */
+   uint16_t Overscan:1;       /* Bit 6: Flag overscan (O)           */
+   uint16_t STComp:1;         /* Bit 7: Flag ST compatible (S)      */
+   uint16_t Vertical:1;       /* Bit 8: Flag Vertical (F)           */
+   uint16_t NRJStart:1;       /* Bit 9: Energy Star                 */
+   uint16_t Eco:1;            /* Bit 10: Eenrgiesparmodus           */
+   uint16_t Virtual:1;        /* Bit 11: virtueller Bildschirm      */
+   uint16_t ExtClock:1;       /* Bit 12: externe Uhr 32/36MHz (CT2) */
+   uint16_t ExtClockEnable:1; /* Bit 13: externen Uhr testen        */
+   uint16_t StandardResol:1;  /* Bit 14: Standardauflösung          */
+   uint16_t DefaultMode:1;    /* Bit 15: default Videomode          */
+} VDO_MODE;
+
+

Querverweise: VDO_PARAM +

+

4.24.29 VDO_PARAM

+
typedef struct
+{
+   int16_t V_Hdl;        /* Handle                                  */
+   VDO_MODE V_mode;      /* Videomodus wie beim Falcon              */
+   int16_t  V_physw;     /* Breite des physikalischen Bildschirms   */
+   int16_t  V_physh;     /* Höhe des physikalischen Bildschirms     */
+   int16_t  V_plan;      /* Anzahl Planes                           */
+   int16_t  V_logw;      /* Breite des virtuellen Bildschirms       */
+   int16_t  V_logh;      /* Höhe des virtuellen Bildschirms         */
+   int16_t  V_eco;       /* Delay in Sekunden vor Shutdown          */
+   int16_t  V_eco2;      /* Delay in Sekunden zwischen Shutdown     */
+                         /* und Energie Star Modus                  */
+   int8_t   V_name[33];  /* Name des Videomodus (max. 32 Bytes)     */
+                         /* mit 0 abgeschlossen.                    */
+   int8_t   Reserved;    /* reserviert für zukünftige Erweiterungen */
+   int32_t  V_length;    /* Puffergröße                             */
+} VDO_PARAM;
+
+

Querverweise: Vread +

+

4.24.30 vidix_capability_t

+
typedef struct vidix_capability_s
+{
+   char    name[64];    /* Driver name */
+   char    author[64];  /* Author name */
+#define TYPE_OUTPUT      0x00000000    /* Is a video playback device */
+#define TYPE_CAPTURE     0x00000001    /* Is a capture device */
+#define TYPE_CODEC       0x00000002    /* Device supports hw (de)coding */
+#define TYPE_FX          0x00000004    /* Is a video effects device */
+   int    type;         /* Device type, see below */
+   unsigned reserved0[4];
+   int    maxwidth;
+   int    maxheight;
+   int    minwidth;
+   int    minheight;
+   int    maxframerate; /* -1 if unlimited */
+#define FLAG_NONE        0x00000000 /* No flags defined */
+#define FLAG_DMA         0x00000001 /* Card can use DMA */
+#define FLAG_EQ_DMA      0x00000002 /* Card can use DMA only if src pitch == dest pitch */
+#define FLAG_UPSCALER    0x00000010 /* Card supports hw upscaling */
+#define FLAG_DOWNSCALER  0x00000020 /* Card supports hw downscaling */
+#define FLAG_SUBPIC      0x00001000 /* Card supports DVD subpictures */
+#define FLAG_EQUALIZER   0x00002000 /* Card supports equalizer */
+   unsigned flags;      /* Feature flags, see above */
+   unsigned short vendor_id;
+   unsigned short device_id;
+   unsigned reserved1[4];
+}vidix_capability_t;
+
+

Querverweis: VIDIX-XBIOS-Erweiterung +

+

4.24.31 vidix_deinterlace_t

+
typedef struct vidix_deinterlace_s
+{
+#define CFG_NON_INTERLACED        0x00000000 /* stream is not interlaced */
+#define CFG_INTERLACED            0x00000001 /* stream is interlaced */
+#define CFG_EVEN_ODD_INTERLACING  0x00000002 /* first frame contains even fields but second - odd */
+#define CFG_ODD_EVEN_INTERLACING  0x00000004 /* first frame contains odd fields but second - even */
+#define CFG_UNIQUE_INTERLACING    0x00000008 /* field deinterlace_pattern is valid */
+#define CFG_UNKNOWN_INTERLACING   0x0000000f /* unknown deinterlacing - use adaptive if it's possible */
+   unsigned    flags;               /* driver -> app */
+   unsigned    deinterlace_pattern; /* driver -> app: deinterlace pattern if flag CFG_UNIQUE_INTERLACING is set */
+}vidix_deinterlace_t;
+
+

Querverweis: VIDIX-XBIOS-Erweiterung +

+

4.24.32 vidix_dma_t

+
typedef struct vidix_dma_s
+{
+   void *src;               /* app -> driver: Virtual address of source */
+   unsigned dest_offset;    /* app -> driver: Destination offset within of video memory */
+   unsigned size;           /* app -> driver: Size of transaction */
+#define BM_DMA_NOSYNC      0
+#define BM_DMA_SYNC        1 /* wait previous dma transfer completion */
+#define BM_DMA_FIXED_BUFFS 2 /* app uses buffers witch are fixed in memory */
+#define BM_DMA_BLOCK       4 /* block until the transfer is complete */
+   unsigned flags;          /* app -> driver */
+   unsigned idx;            /* app -> driver: index of the src buffer */
+   unsigned src_incr;       /* app -> driver: if src_incr & dest_incr are */
+   unsigned dest_incr;      /*                different, else 0 */
+   void *internal[VID_PLAY_MAXFRAMES];    /* for internal use by driver */
+}vidix_dma_t;
+
+

Querverweis: VIDIX-XBIOS-Erweiterung +

+

4.24.33 vidix_fourcc_t

+
typedef struct vidix_fourcc_s
+{
+   unsigned fourcc; /* input: requested fourcc */
+   unsigned srcw;   /* input: hint: width of source */
+   unsigned srch;   /* input: hint: height of source */
+#define VID_DEPTH_NONE             0x0000
+#define VID_DEPTH_1BPP             0x0001
+#define VID_DEPTH_2BPP             0x0002
+#define VID_DEPTH_4BPP             0x0004
+#define VID_DEPTH_8BPP             0x0008
+#define VID_DEPTH_12BPP            0x0010
+#define VID_DEPTH_15BPP            0x0020
+#define VID_DEPTH_16BPP            0x0040
+#define VID_DEPTH_24BPP            0x0080
+#define VID_DEPTH_32BPP            0x0100
+   unsigned depth; /* output: screen depth for given fourcc */
+#define VID_CAP_NONE               0x0000
+#define VID_CAP_EXPAND             0x0001 /* if overlay can be bigger than source */
+#define VID_CAP_SHRINK             0x0002 /* if overlay can be smaller than source */
+#define VID_CAP_BLEND              0x0004 /* if overlay can be blended with framebuffer */
+#define VID_CAP_COLORKEY           0x0008 /* if overlay can be restricted to a colorkey */
+#define VID_CAP_ALPHAKEY           0x0010 /* if overlay can be restricted to an alpha channel */
+#define VID_CAP_COLORKEY_ISRANGE   0x0020 /* if the colorkey can be a range */
+#define VID_CAP_ALPHAKEY_ISRANGE   0x0040 /* if the alphakey can be a range */
+#define VID_CAP_COLORKEY_ISMAIN    0x0080 /* colorkey is checked against framebuffer */
+#define VID_CAP_COLORKEY_ISOVERLAY 0x0100 /* colorkey is checked against overlay */
+#define VID_CAP_ALPHAKEY_ISMAIN    0x0200 /* alphakey is checked against framebuffer */
+#define VID_CAP_ALPHAKEY_ISOVERLAY 0x0400 /* alphakey is checked against overlay */
+   unsigned flags; /* output: capability */
+}vidix_fourcc_t;
+
+

Querverweis: VIDIX-XBIOS-Erweiterung +

+

4.24.34 vidix_grkey_t

+
typedef struct vidix_grkey_s
+{
+   vidix_ckey_t    ckey;      /* driver -> app: color key */
+   vidix_vkey_t    vkey;      /* driver -> app: video key */
+#define KEYS_PUT    0
+#define KEYS_AND    1
+#define KEYS_OR     2
+#define KEYS_XOR    3
+   unsigned    key_op;        /* driver -> app: keys operations */
+}vidix_grkey_t;
+
+

Querverweis: VIDIX-XBIOS-Erweiterung +

+

4.24.35 vidix_playback_t

+
typedef struct vidix_playback_s
+{
+   unsigned fourcc;           /* app -> driver: movies's fourcc */
+   unsigned capability;       /* app -> driver: what capability to use */
+   unsigned blend_factor;     /* app -> driver: blending factor */
+   vidix_rect_t src;          /* app -> driver: original movie size */
+   vidix_rect_t dest;         /* app -> driver: destinition movie size. driver->app dest_pitch */
+#define VID_PLAY_INTERLEAVED_UV 0x00000001    /* driver -> app: interleaved UV planes */
+#define INTERLEAVING_UV         0x00001000    /* UVUVUVUVUV used by Matrox G200 */
+#define INTERLEAVING_VU         0x00001001    /* VUVUVUVUVU */
+   int        flags;
+   /* memory model */
+   unsigned frame_size;       /* driver -> app: destinition frame size */
+   unsigned num_frames;       /* app -> driver: after call: driver -> app */
+#define VID_PLAY_MAXFRAMES 64 /* reasonable limitation for decoding ahead */
+   unsigned offsets[VID_PLAY_MAXFRAMES];    /* driver -> app */
+   vidix_yuv_t    offset;     /* driver -> app: relative offsets within frame for yuv planes */
+   void    *dga_addr;         /* driver -> app: linear address */
+}vidix_playback_t;
+
+

Querverweis: VIDIX-XBIOS-Erweiterung +

+

4.24.36 vidix_video_eq_t

+
typedef struct vidix_video_eq_s
+{
+#define VEQ_CAP_NONE            0x00000000UL
+#define VEQ_CAP_BRIGHTNESS      0x00000001UL
+#define VEQ_CAP_CONTRAST        0x00000002UL
+#define VEQ_CAP_SATURATION      0x00000004UL
+#define VEQ_CAP_HUE             0x00000008UL
+#define VEQ_CAP_RGB_INTENSITY   0x00000010UL
+   int        cap;             /* should contain capability of equalizer */
+   /* end-user app can have presets like: cold-normal-hot picture and so on */
+   int        brightness;      /* -1000 : +1000 */
+   int        contrast;        /* -1000 : +1000 */
+   int        saturation;      /* -1000 : +1000 */
+   int        hue;             /* -1000 : +1000 */
+   int        red_intensity;   /* -1000 : +1000 */
+   int        green_intensity; /* -1000 : +1000 */
+   int        blue_intensity;  /* -1000 : +1000 */
+#define VEQ_FLG_ITU_R_BT_601    0x00000000 /* ITU-R BT.601 colour space (default) */
+#define VEQ_FLG_ITU_R_BT_709    0x00000001 /* ITU-R BT.709 colour space */
+#define VEQ_FLG_ITU_MASK        0x0000000f
+   int        flags;           /* currently specifies ITU YCrCb color space to use */
+}vidix_video_eq_t;
+
+

Querverweis: VIDIX-XBIOS-Erweiterung +

+

4.24.37 VPOS

+
typedef struct
+{
+   int16_t x;
+   int16_t y;
+} VPOS;
+
+

Querverweise: Vseek +

+
+ +Home +XBIOSXBIOS +XBIOS-FunktionslisteXBIOS-Funktionsliste +GEMDOSGEMDOS + + diff --git a/de/xbios_trap.html b/de/xbios_trap.html new file mode 100644 index 000000000..8efc99a86 --- /dev/null +++ b/de/xbios_trap.html @@ -0,0 +1,63 @@ + + + + + +Die Anleitung zum TOS: xbios-Trap + + + + + + + + + +Home +XBIOSXBIOS +XBIOS FehlermeldungenXBIOS Fehlermeldungen +BildschirmfunktionenBildschirmfunktionen + +
+ +

4.4 xbios-Trap

+ + + + + + + + + + + + + + + + +
Name: »xbios« - XBios-Trap ausführen. Peripheriebausteins sperren. +
  +
Deklaration: int32_t xbios( void ... ); +
  +
Beschreibung: Die Routine xbios führt einen TRAP #14 durch. Die übergebenen +Parameter hängen von der jeweiligen XBIOS- Funktion ab. +
  +
Ergebnis: Die Funktion liefert als Ergebnis einen Wert vom Datentyp +int32_t. +
  +
Querverweis bios   gemdos   XBIOS   Dispatcher +
  + +
+ +
+ +Home +XBIOSXBIOS +XBIOS FehlermeldungenXBIOS Fehlermeldungen +BildschirmfunktionenBildschirmfunktionen + + diff --git a/de/xbra_main.html b/de/xbra_main.html new file mode 100644 index 000000000..81ca3b305 --- /dev/null +++ b/de/xbra_main.html @@ -0,0 +1,74 @@ + + + + + +Die Anleitung zum TOS: XBRA-Verfahren + + + + + + + + + +Home +BIOSBIOS +VT-52-TerminalVT-52-Terminal +BSIM-BIOS-ErweiterungenBSIM-BIOS-Erweiterungen + +
+ +

3.9 XBRA-Verfahren

+ +

Das XBRA-Verfahren ("eXtended BRAner") geht auf eine +Idee von Moshe Braner zurück, und sollte von allen Programmen +benutzt werden, die Vektoren verbiegen. +

+

Das Prinzip besteht darin, daß jedes vektorverbiegende Programm +direkt vor seiner eigenen Einsprungadresse (also genau vor der Adresse +auf die der Vektor gesetzt wurde), die folgende Struktur plaziert: +

+ +
typedef struct
+{
+    int8_t  xb_magic[4];   /* "XBRA" = 0x58425241       */
+    int8_t  xb_id[4];      /* ID aus vier ASCII-Zeichen */
+    int32_t xb_oldvec;     /* alter Wert des Vektors    */
+} XBRA;
+
+

Die Komponente xb_magic erlaubt eine sichere Erkennung +der XBRA-Struktur; xb_id ist die ID des jeweiligen Programms, +welches den Vektor verbiegt. +

+

Mit Hilfe dieses Verfahrens ist es für ein Programm leicht +möglich festzustellen, ob es schon installiert ist (das geht +allerdings auch über den Cookie-Jar), und sich wieder aus der +Vektorkette zu entfernen. Wichtig ist jedoch, daß sich alle +(!) Programme an dieses Verfahren halten, da sonst die Vektorkette +unterbrochen wird. +

+

Hinweis zu MagiC: Programme, die sich in irgendwelche +Systemvektoren hängen, sollten sich auch in den etv_term-Vektor +einklinken. Falls das Programm abnormal beendet wird, springt das +Betriebssystem zunächst über den etv_term-Vektor. Bei dieser +Gelegenheit kann man sich dann in Ruhe aus allen veränderten Vektoren +zurückziehen; da MagiC für jede Applikation einen eigenen +etv_term-Vektor verwendet, kann es dabei nicht zu Kollisionen kommen. +

+

Das XBRA-Verfahren hat sich im laufe der Zeit durchgesetzt, so +daß es mittlerweile als schlechter Programmierstil gilt, wenn man es +nicht benutzt. +

+

Querverweis: Cookie-Jar   Cookie- und XBRA-Liste   Reset-Vektor +

+
+ +Home +BIOSBIOS +VT-52-TerminalVT-52-Terminal +BSIM-BIOS-ErweiterungenBSIM-BIOS-Erweiterungen + + diff --git a/de/xcontrol.html b/de/xcontrol.html new file mode 100644 index 000000000..11baf6122 --- /dev/null +++ b/de/xcontrol.html @@ -0,0 +1,2404 @@ + + + + + +Die Anleitung zum TOS: Das XCONTROL + + + + + + + + + +Home +XCONTROLXCONTROL +XCONTROLXCONTROL +ProgrammierrichtlinenProgrammierrichtlinen + +
+ +

9.1 Das XCONTROL

+

XControl ist ein modulares (erweiterbares) Kontrollfeld, das von +Atari zuerst mit den Computern der TT und Mega-STE Serie ausgeliefert +wurde. +

+

+

Die einzelnen Module sind Dateien mit der Namenserweiterung +'.CPX' (Control-Panel eXtension), und XControl selbst kann als +Steuerungsprogramm für diese Module angesehen werden. +

+

Wichtig: XControl sollte nur als Tool für +Konfigurationsdialoge angesehen werden, und nicht für andere +Zwecke mißbraucht werden. +

+

Die Kommunikation zwischen XControl und seinen Modulen erfolgt +über zwei Strukturen, die mit XCPB und CPXINFO bezeichnet werden. +Über erstere werden einige Flags sowie eine ganze Reihe von +Hilfsfunktionen zugänglich gemacht. +

+ +

Beim Start lädt XControl alle verfügbaren CPX-Header; sofern +im Header ein entsprechendes Flag gesetzt ist, werden alle CPX-Dateien +einmal zum initialisieren aufgerufen. Für jedes einzelne Modul kann +angegeben werden, ob es resident geladen werden soll (dies kann auch +über das mitgelieferte Konfigurations-CPX verändert werden). +Darüber hinaus ist es möglich, CPX-Module zu schreiben, die nur +bestimmte Werte setzen. Man spricht in diesem Zusammenhang von +'Set-Only'-Modulen, die nur beim Booten bzw. erneuten Laden der +CPX-Module durch XControl aufgerufen werden, und bei der +Initialisierung einfach einen Nullzeiger zurückliefern. +

+ +

Sobald ein CPX-Modul vom Anwender ausgewählt wird, lädt +XControl dieses in den Speicher, und ruft die Funktion cpx_init auf. +Anschließend wird noch cpx_call aufgerufen, wobei im wesentlichen nun +das Modul selbst die Steuerung übernimmt. +

+ + + + +

Man unterscheidet zwischen Form-CPX und Event-CPX. +Erstere sind relativ einfach zu programmieren, bieten jedoch nur eine +eingeschränkte Flexibilität. Letztere sind flexibler, da sie die +AES-Events direkt auswerten. Alle mit XControl 1.0 ausgelieferten +CPX-Module sind Form-CPX Dateien, woraus geschlossen werden kann, daß +Form-CPX in den meisten Fällen ausreichen. +

+ +

Für die Dateinamen von CPX-Modulen gilt die folgende +Terminologie: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SuffixBedeutung
*.CPStandard-CPX ohne Header
*.CPXStandard-CPX, fertig zum Gebrauch
*.CPZinaktive CPX (von XControl deaktiviert)
*.HDRHeader für die CPX-Datei
*_R.CPXresidente CPX-Datei
*_S.CPXSet-Only CPX-Datei
+
+ + + +

Der Aufbau einer CPX-Datei ist einem normalen Programm sehr +ähnlich. Sie besteht aus einem 512 Byte großen Header und dem +übrigen Dateiinhalt, bei dem es sich fast um eine normale +GEMDOS-Programmdatei handelt. Der Header ist dabei wie folgt +definiert: +

+ +
typedef struct
+{
+    uint16_t magic;                 /* Magic-Konstante = 100   */
+
+    struct
+    {
+        unsigned reserved : 13;  /* reserviert              */
+        unsigned resident :  1;  /* RAM-resident            */
+        unsigned bootinit :  1;  /* Boot-Initialisierung    */
+        unsigned setonly  :  1;  /* Set-Only                */
+
+    } flags;
+
+    int32_t  cpx_id;                /* eindeutige CPX-ID       */
+    uint16_t cpx_version;           /* CPX-Versionsnummer      */
+    int8_t   i_text[14];            /* Icontext                */
+    uint16_t sm_icon[48];           /* Bitmap (32*24 Pixel)    */
+    uint16_t i_color;               /* Iconfarbe               */
+    int8_t   title_text[18];        /* Name des CPX            */
+    uint16_t t_color;               /* Textfarbe               */
+    int8_t   buffer[64];            /* nicht-flüchtiger Puffer */
+    int8_t   reserved[306];         /* reserviert              */
+
+} CPXHEAD;
+
+

Zum Header noch einige Anmerkungen: +

+
    +
  • die erste Funktion im TEXT-Segment muß die +Initialisierungsroutine für die CPX sein +
  • +
  • zur Konstruktion eines CPX-Headers gibt es mehrere Toolkits +
  • +
  • Header und gelinkte Programmdatei können in den meisten +UNIX-ähnlichen Shells (z.B. der Mupfel aus Gemini) mit dem Kommando +'cat' zusammengefügt werden. +
  • +
  • bei der CPX-Entwicklung ist es sehr praktisch, daß man +XControl auch als Programm starten kann (Suffix ändern !). Dies +erlaubt es, ohne permanentes Neu-Booten des Rechners zu arbeiten. +
  • +
  • CPX-ID und -Versionsnummer sorgen dafür, daß jede CPX nur ein +einziges mal (und auch nur die neueste Version) erscheint. +
  • +
+ +

Bei der Programmierung eines CPX-Moduls sind einige Feinheiten +zu beachten. Da ein solches Modul (mit Ausnahme von 64 Byte) über +keinen nichtvergänglichen Speicher verfügt, ist nichts erlaubt, was +Speicher in irgendeiner Form fest reserviert. Insbesondere gehen +Variableninhalte mit dem Verlassen der CPX in aller Regel verloren ! +Daher sollte man: +

+
    +
  • Resourcen statisch einbinden +
  • +
  • Speicheranforderungen nur kurzzeitig erlauben +
  • +
  • virtuelle VDI-Workstations nicht dauerhaft anlegen +
  • +
+ +

Bei der Programmierung eines CPX-Moduls kann auf Funktionen der +beiden folgenden Kategorien zurückgegriffen werden: +

+ + + +

Hinweis: Als Alternative zu XCONTROL, welches von Atari +nicht mehr weiterentwickelt wird, bieten sich verschiedene Programme +an. Besonders empfehlenswert ist dabei COPS (COntrol Panel +Server, mit dessen Hilfe sich nicht nur beliebig viele CPX-Module +gleichzeitig öffnen lassen, sondern das auch Kontrollfelder mit +größerer Arbeitsfläche als XCONTROL erlaubt. +

+

9.1.1 CPX-Programmierrichtlinien

+ +

Bei der Programmierung eines CPX-Moduls sollte man tunlichst die +folgenden Regeln beachten: +

+
    +
  • reservierter Speicher ist möglichst schnell wieder freizugeben +
  • +
  • XControl-Funktionen sind immer auszunutzen, wenn dies möglich +ist +
  • +
  • die Benutzerschnittstelle ist einfach und in Anlehnung an die +anderen CPX-Module zu gestalten +
  • +
  • grafische Elemente sind Menükommandos vorzuziehen +
  • +
  • 'OK' und 'Abbruch' sind (wenn möglich) immer zu implementieren +
  • +
  • Popup-Menüs sind als Text mit schattiertem Rechteck +darzustellen +
  • +
  • AC_CLOSE (Verlassen des Hauptprogramms) wird als 'Abbruch' +gewertet +
  • +
  • WM_CLOSE (Schließen des XControl-Fensters) wird als 'OK' +gewertet +
  • +
  • 'Save'/'Sichern' ist als 'OK' ohne Verlassen des Dialogs zu +werten +
  • +
  • das Wurzelobjekt der CPX hat immer eine Größe von 256*176 +Pixeln. Ausnahme: Unter COPS darf der Objektbaum eine Größe +von bis zu 512*384 Pixeln besitzen. +
  • +
  • Interrupt-Vektoren dürfen nicht verändert werden +
  • +
  • Xform_do darf nicht mit Funktionen für Event-CPX vermischt +werden +
  • +
  • reservierter Speicher darf beim Verlassen der CPX nicht +vergessen werden, da es sonst zu einer Fragmentierung des Speichers +kommt +
  • +
  • bereits von anderen CPX verwandte ID's dürfen nicht benutzt +werden +
  • +
  • geöffnete Dateien müssen wieder geschlossen werden +
  • +
  • geöffnete VDI-Workstations sind auf jedenfall wieder zu +schließen (spätestens bei einer AC_CLOSE bzw. WM_CLOSE Meldung), wenn +sie nicht mehr benötigt werden +
  • +
+ +

9.1.2 CPX-Funktionen

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cpx_button Maustasten-Ereignis +
cpx_call Aktivierungsroutine +
cpx_close Close-Ereignis +
cpx_draw Redraw-Ereignis +
cpx_hook Preemption Hook +
cpx_init Initialisierung +
cpx_m1 Mausrechteck-Ereignis +
cpx_m2 Mausrechteck-Ereignis +
cpx_key Keyboard-Ereignis +
cpx_timer Timer-Ereignis +
cpx_wmove Fensterverschiebung + +
+ +

9.1.2.1 cpx_button

+ + + + + + + + + + + + + + + + + + +
Name: »cpx_button« - Ereignis für die Maustasten +
  +
Deklaration: VOID cdecl (*cpx_button) (MRETS *mrets, int16_t nclicks, +int16_t *event); +
  +
Beschreibung: Die Funktion wird bei einem aufgetretenen Maustastenereignis +aufgerufen. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
mrets Maus-Parameter zum Event +
nclicks Anzahl der Mausklicks +
event auf den Wert 1 setzen, falls das CPX verlassen werden soll + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Gruppe: CPX-Funktionen +
  +
Querverweis: cpx_key   cpx_timer +
  + +
+ +

9.1.2.2 cpx_call

+ + + + + + + + + + + + + + + + + + +
Name: »cpx_call« - Aufruf des CPX Moduls +
  +
Deklaration: int16_t cdecl (*cpx_call) ( GRECT *work ); +
  +
int16_t cdecl (*cpx_call) ( GRECT *work, DIALOG *dialog ); +
  +
Beschreibung: Die Funktion wird aufgerufen, wenn der Anwender das +entsprechende Modul ausgewählt hat. Es gilt: +
  + + + + + + + + + +
Parameter Bedeutung +
work Rechteck mit den Koordinaten des XControl-Fensters +
dialog Zeiger auf einen Fensterdialog + +
+ +
Hinweis: Die zweite Aufrufform steht nur unter COPS zur +Verfügung. Der Parameter dialog enthält in diesem Fall einen +Zeiger auf die Fensterdialogstruktur. Der Dialog wird von COPS nach +dem cpx_init mit Hilfe von wdlg_create und wdlg_open geöffnet. Der +Parameter work und der Objektbaum liegen bis zum ersten Aufruf +von Xform_do bzw. bis zur Rückkehr aus der Funktion cpx_call +außerhalb des sichtbaren Bildschirms. +
  +
Ergebnis: Die Funktion liefert einen der folgenden Werte zurück: +
  +

+
+ + + + + + + + + + +
0=Ende der Bearbeitung
<> 0=CPX soll weiterbearbeitet werden
+
+ +
Gruppe: CPX-Funktionen +
  +
Querverweis: XCONTROL +
  + +
+ +

9.1.2.3 cpx_close

+ + + + + + + + + + + + + + + + + + +
Name: »cpx_close« - Ereignis zum Schließen des Fensters +
  +
Deklaration: VOID cdecl (*cpx_close) (int16_t flag); +
  +
Beschreibung: Die Funktion sorgt für das Schließen des CPX-Moduls. Es gilt: +
  + + + + + + +
Parameter Bedeutung +
flag Grund des Schließens +
+
+ + + + + + + + + + +
0=AC_CLOSE Message
<> 0=WM_CLOSE Message
+
+ + +
+ +
Hinweis: Die Funktion wird bei jeder AC_CLOSE bzw. +WM_CLOSE Nachricht aufgerufen. Die CPX sollte dann sofort allen +reservierten Speicher freigeben. Die Funktion muss bei jeder Event-CPX +implementiert sein. AC_CLOSE ist als 'Abbruch', WM_CLOSE als 'Ok' zu +werten. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Gruppe: CPX-Funktionen +
  +
Querverweis: cpx_init   XCONTROL +
  + +
+ +

9.1.2.4 cpx_draw

+ + + + + + + + + + + + + + + + + + +
Name: »cpx_draw« - Ereignis zum Neuzeichnen des CPX-Fensters +
  +
Deklaration: VOID cdecl (*cpx_draw) (GRECT *clip); +
  +
Beschreibung: Die Funktion sorgt für das Neuzeichnen von Teilen des +CPX-Fensters. Es gilt: +
  + + + + + + +
Parameter Bedeutung +
clip neu zu zeichnender Bereich, der auch als übergabe-Parameter +für GetFirstRect benötigt wird. + +
+ +
Hinweis: Die nötige Rechteckliste muss per GetFirstRect +und GetNextRect ermittelt werden. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Gruppe: CPX-Funktionen +
  +
Querverweis: cpx_wmove   GetFirstRect   GetNextRect +
  + +
+ +

9.1.2.5 cpx_hook

+ + + + + + + + + + + + + + + + + + +
Name: »cpx_hook« - Preemption Hook +
  +
Definiton int16_t cdecl (*cpx_hook) (int16_t event, int16_t *msg, MRETS +*mrets, int16_t *key, int16_t *nclicks); +
  +
Beschreibung: Die Funktion wird sofort nach evnt_multi aufgerufen, also noch +bevor XControl das Event bearbeitet. Es gilt: +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
event aufgetretene Events +
msg Ereignispuffer +
mrets Mausparameter +
key Tastendruck +
nclicks Anzahl der Mausklicks + +
+ +
Ergebnis: Die Funktion liefert einen der folgenden Werte zurück: +
  +

+
+ + + + + + + + + + +
0=Event-Bearbeitung fortsetzen
<> 0=Event-Bearbeitung abbrechen
+
+ +
Gruppe: CPX-Funktionen +
  +
Querverweis: cpx_button   cpx_draw   cpx_key   cpx_m1   cpx_m2   cpx_timer   +cpx_wmove +
  + +
+ +

9.1.2.6 cpx_init

+ + + + + + + + + + + + + + + + + + +
Name: »cpx_init« - Initialisierung der CPX +
  +
Deklaration: CPXINFO * cdecl cpx_init (XCPB *xcpb); +
  +
CPXINFO * cdecl cpx_init (XCPB *xcpb, int32_t magic, int32_t +version ); +
  +
Beschreibung: Die Funktion sorgt für die Initialisierung der CPX. Es gilt: +
  +

+
+ + + + + + + + +
ParameterBedeutung
xcpbZeiger auf die XCPB-Struktur von XControl
+
+ +
Hinweis: Die Funktion muss am Beginn des Textsegments +der CPX-Datei stehen, und wird während der XControl-Initialisierung +sowie beim Aktivieren der CPX aufgerufen. +
  +
Mit Hilfe der zweiten Aufrufform kann anhand der Parameter +magic und version festgestellt werden, ob die CPX +unter XCONTROL oder COPS läuft. Es bietet sich die folgende Routine an: +
  + +
int16_t is_COPS ( int32_t magic, int32_t version )
+{
+   if ((magic == 'COPS') && (version >= 0x10000L))
+      return (TRUE);      /* COPS */
+   else return (FALSE);   /* XCONTROL */
+}
+
+
Falls COPS erkannt wurde, kann die CPX einen bis zu 512*384 +Pixel großen Objektbaum zeichnen und bei der Funktion Xform_do +übergeben. +
  +
Ergebnis: Die Funktion liefert einen der folgenden Werte zurück: +
  +

+
+ + + + + + + + + + +
NULL:'Set Only'-CPX
sonst:Zeiger auf die CPXINFO-Struktur der CPX
+
+ +
Gruppe: CPX-Funktionen +
  +
Querverweis: cpx_close   XCONTROL +
  + +
+ +

9.1.2.7 cpx_m1

+ + + + + + + + + + + + + + + + + + +
Name: »cpx_m1« - Ereignis für ein Mausrechteck +
  +
Deklaration: VOID cdecl (*cpx_m1) (MRETS *mrets, int16_t *event); +
  +
Beschreibung: Die Funktion wird aufgerufen, wenn der Mauszeiger einen +bestimmten Bereich betritt oder verläßt. Es gilt: +
  + + + + + + + + + +
Parameter Bedeutung +
mrets Parameter der Maus +
event auf den Wert 1 setzen, wenn die CPX verlassen werden soll + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Gruppe: CPX-Funktionen +
  +
Querverweis: cpx_m2   XCONTROL +
  + +
+ +

9.1.2.8 cpx_m2

+ + + + + + + + + + + + + + + + + + +
Name: »cpx_m2« - Ereignis für ein Mausrechteck +
  +
Deklaration: VOID cdecl (*cpx_m2) (MRETS *mrets, int16_t *event); +
  +
Beschreibung: Die Funktion wird aufgerufen, wenn der Mauszeiger einen +bestimmten Bereich betritt oder verläßt. Es gilt: +
  + + + + + + + + + +
Parameter Bedeutung +
mrets Parameter der Maus +
event auf den Wert 1 setzen, wenn die CPX verlassen werden soll + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Gruppe: CPX-Funktionen +
  +
Querverweis: cpx_m1   XCONTROL +
  + +
+ +

9.1.2.9 cpx_key

+ + + + + + + + + + + + + + + + + + +
Name: »cpx_key« - Ereignis für einen Tastendruck +
  +
Deklaration: VOID cdecl (*cpx_key) (int16_t kstate, int16_t key, int16_t +*event); +
  +
Beschreibung: Die Funktion wird aufgerufen, wenn ein Keyboard-Event +aufgetreten ist. Es gilt: +
  + + + + + + + + + + + + +
Parameter Bedeutung +
kstate Status der Umschalttasten (Alternate, Control, Shift, etc.) +
key auslösende Taste +
+
+ + + + + + + + +
Highbyte :Scan-Code der Taste
Lowbyte :ASCII-Code der Taste
+
+ +
event auf den Wert 1 setzen, wenn die CPX verlassen werden soll + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Gruppe: CPX-Funktionen +
  +
Querverweis: cpx_button   cpx_timer +
  + +
+ +

9.1.2.10 cpx_timer

+ + + + + + + + + + + + + + + + + + +
Name: »cpx_timer« - Timer Ereignis +
  +
Deklaration: VOID cdecl (*cpx_timer) (int16_t *event); +
  +
Beschreibung: Die Funktion wird aufgerufen, wenn ein Timer-Event aufgetreten +ist. Es gilt: +
  + + + + + + +
Parameter Bedeutung +
  +
event auf den Wert 1 setzen, wenn die CPX verlassen werden soll +
  + +
+ +
Hinweis: Timer-Events werden von Form-CPX nicht +unterstützt. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Gruppe: CPX-Funktionen +
  +
Querverweis: cpx_button   cpx_key   XCONTROL +
  + +
+ +

9.1.2.11 cpx_wmove

+ + + + + + + + + + + + + + + + + + +
Name: »cpx_wmove« - Verschiebung des XControl-Fensters +
  +
Deklaration: VOID cdecl (*cpx_wmove) (GRECT *work); +
  +
Beschreibung: Die Funktion wird aufgerufen, wenn der Anwender das +Xcontrol-Fenster bewegt. Es gilt: +
  +

+
+ + + + + + + + +
ParameterBedeutung
workneue Koordinaten des XControl-Fensters
+
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Gruppe: CPX-Funktionen +
  +
Querverweis: cpx_draw   XCONTROL +
  + +
+ +

9.1.3 XCONTROL-Funktionen

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CPX_Save Defaults sichern +
Get_Buffer Zwischenspeicher ermitteln +
getcookie Cookie-Variablen abfragen +
GetFirstRect Behandlung der Rechteckliste +
GetNextRect Behandlung der Rechteckliste +
MFsave Mausform sichern/wiederherstellen +
Popup Popup-Menü +
rsh_fix Objektbaum-Umwandlung +
rsh_obfix Umwandlung eines Objektes +
Set_Evnt_Mask Eventmaske setzen +
Sl_arrow Slider-Arrow +
Sl_dragx Sliderdrag-Bewegung +
Sl_dragy Sliderdrag-Bewegung +
Sl_size Slidergröße +
Sl_x Positionierung eines Sliders +
Sl_y Positionierung eines Sliders +
Xform_do Formular-Verwaltung +
XGen_Alert Alarmbox + +
+ +

9.1.3.1 CPX_Save

+ + + + + + + + + + + + + + + + + + +
Name: »CPX_Save« - Defaults sichern +
  +
Deklaration: int16_t cdecl (*CPX_Save) (VOID *ptr, int32_t num); +
  +
Beschreibung: Die Funktion erlaubt das Speichern von Defaulteinstellungen +einer CPX. Es gilt: +
  +

+
+ + + + + + + + + + + + +
ParameterBedeutung
ptrAdresse der zu speichernden Daten
numAnzahl der zu speichernden Bytes
+
+ +
Hinweis: XControl speichert die Einstellungen im DATA +Segment der CPX. Daher müssen Entwickler selbst für ausreichend +freien Speicherplatz im DATA-Segment sorgen. Dies geschieht über das +Datenfeld 'SAVE_VARS' in CPXSTART.S. +
  +
Ergebnis: Die Funktion liefert einen der folgenden Werte zurück: +
  +

+
+ + + + + + + + + + +
0:Fehler aufgetreten
<> 0:kein Fehler aufgetreten
+
+ +
Gruppe: XCONTROL-Funktionen +
  +
Querverweis: XCONTROL +
  + +
+ +

9.1.3.2 Get_Buffer

+ + + + + + + + + + + + + + + + + + +
Name: »Get_Buffer« - Zwischenspeicher ermitteln +
  +
Deklaration: VOID cdecl (*Get_Buffer) (VOID); +
  +
Beschreibung: Die Funktion ermittelt die Adresse eines 64 Byte großen, +residenten Speicherbereiches. +
  +
Hinweis: In diesem Speicher kann die CPX Inhalte von +Write-Only-Registern sichern, falls TOS keine Funktion zur Abfrage +bietet (Beispiel: Fensterfarben). Es sei noch einmal darauf +hingewiesen, daß jeder andere Speicher einer CPX flüchtig ist ! +
  +
Ergebnis: Die Funktion liefert einen Zeiger auf den Speicherbereich +zurück. +
  +
Gruppe: XCONTROL-Funktionen +
  +
Querverweis: XCONTROL +
  + +
+ +

9.1.3.3 getcookie

+ + + + + + + + + + + + + + + + + + +
Name: »getcookie« - Cookievariablen abfragen +
  +
Deklaration: int16_t cdecl (*getcookie) (int32_t cookie, int32_t *p_value); +
  +
Beschreibung: Die Funktion sucht einen Cookie, und ermittelt seinen Wert. Es +gilt: +
  + + + + + + + + + +
Parameter Bedeutung +
cookie Cookie-Variable +
p_value Adresse einer Variablen die den Wert aufnehmen soll, oder NULL, +falls der Wert nicht von Interesse ist. + +
+ +
Ergebnis: Die Funktion liefert einen der folgenden Werte zurück: +
  +

+
+ + + + + + + + + + +
0:Cookie nicht gefunden
<>0:Cookie gefunden
+
+ +
Gruppe: XCONTROL-Funktionen +
  +
Querverweis: Cookie-Jar +
  + +
+ +

9.1.3.4 GetFirstRect

+ + + + + + + + + + + + + + + + + + +
Name: »GetFirstRect« - Rechteckliste abfragen +
  +
Deklaration: GRECT * cdecl (*GetFirstRect) (GRECT *prect); +
  +
Beschreibung: Die Funktion ermittelt das erste Rechteck der Rechteckliste. Es +gilt: +
  +

+
+ + + + + + + + +
ParameterBedeutung
prectzu aktualisierender Bereich
+
+ +
Hinweis: Die Funktion wird zum Neuzeichnen von +Fensterbereichen nach einer WM_REDRAW Message benötigt; der +Objektbaum wird jedoch von XControl selbst verwaltet. +
  +
Ergebnis: Die Funktion liefert einen der folgenden Werte zurück: +
  +

+
+ + + + + + + + + + +
NULL:keine weiteren Ausschnitte vorhanden
sonst:wiederherzustellender Ausschnitt
+
+ +
Gruppe: XCONTROL-Funktionen +
  +
Querverweis: GetNextRect   XCONTROL +
  + +
+ +

9.1.3.5 GetNextRect

+ + + + + + + + + + + + + + + + + + +
Name: »GetNextRect« - Rechteckliste abfragen +
  +
Deklaration: GRECT * cdecl (*GetNextRect) (VOID); +
  +
Beschreibung: Die Funktion ermittelt das nächste Rechteck der Rechteckliste. +
  +
Hinweis: Die Funktion wird zum Neuzeichnen von +Fensterbereichen nach einer WM_REDRAW Message benötigt; der +Objektbaum wird jedoch von XControl selbst verwaltet. +
  +
Ergebnis: Die Funktion liefert einen der folgenden Werte zurück: +
  +

+
+ + + + + + + + + + +
NULL:keine weiteren Ausschnitte vorhanden
sonst:wiederherzustellender Ausschnitt
+
+ +
Gruppe: XCONTROL-Funktionen +
  +
Querverweis: GetFirstRect   XCONTROL +
  + +
+ +

9.1.3.6 MFsave

+ + + + + + + + + + + + + + + + + + +
Name: »MFsave« - Mausform sichern oder wiederherstellen +
  +
Deklaration: VOID cdecl (*MFsave) (int16_t saveit, MFORM *mf); +
  +
Beschreibung: Die Funktion sichert oder restauriert die Form des Mauszeigers. +Es gilt: +
  + + + + + + + + + +
Parameter Bedeutung +
savit +
+
+ + + + + + + + + + +
0=Mausform wiederherstellen
1=Mausform sichern
+
+ +
mf Speicherbereich zur Sicherung der Mausform + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Gruppe: XCONTROL-Funktionen +
  +
Querverweis: graf_mouse   XCONTROL +
  + +
+ +

9.1.3.7 Popup

+ + + + + + + + + + + + + + + + + + +
Name: »Popup« - Verwaltung eines Popup-Menüs +
  +
Deklaration: int16_t cdecl (*Popup) (int8_t *items[], int16_t num_items, +int16_t default_item, int16_t font_size, GRECT *button, GRECT *world); +
  +
Beschreibung: Die Funktion ermöglicht die komplette Verwaltung eines +Popup-Menüs. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
items Array mit Zeichenketten für die einzelnen Einträge. Jeder +Eintrag muss die gleiche Länge besitzen, sowie vorne mindestens zwei +und am Ende mindestens ein Leerzeichen aufweisen. +
num_items Anzahl der Einträge +
default_item Default-Eintrag (Zählung beginnt bei 0), oder der Wert -1 +
font_size Zeichengröße: 8*16 oder 8*8-Font. Als Parameter sind +die gleichen Werte wie in der TEDINFO-Struktur zu verwenden. Laut +Atari wird z.Zt. nur der große Zeichensatz verwendet. +
button Rechteck des Buttons, zu dem das Popup gehört. +
world Rechteck des Hintergrund-Objekbaumes (i.d.R. der Objektbaum der +CPX) + +
+ +
Hinweis: Bei zu vielen Einträgen (ab fünf) wird das +Popup automatisch gescrollt; die Bearbeitung blockiert alle anderen +Aktionen. +
  +
Ergebnis: Die Funktion liefert den gewählten Eintrag des Popups zurück, +oder den Wert -1, wenn kein Element des Popups ausgewählt worden ist. +
  +
Gruppe: XCONTROL-Funktionen +
  +
Querverweis: Xform_do   XCONTROL +
  + +
+ +

9.1.3.8 rsh_fix

+ + + + + + + + + + + + + + + + + + +
Name: »rsh_fix« - Umwandlung eines Objektbaumes +
  +
Deklaration: VOID cdecl (*rsh_fix) (int16_t num_objs, int16_t num_frstr, +int16_t num_frimg, int16_t num_tree, OBJECT *rs_object, TEDINFO +*rs_tedinfo, int8_t *rs_string[], ICONBLK *rs_iconblk, BITBLK +*rs_bitblk, int32_t *rs_frstr, int32_t *rs_frimg, int32_t *rs_trindex, +struct foobar *rs_imdope); +
  +
Beschreibung: Die Funktion wandelt einen Objektbaum auf Basis von 8*16 Pixel +großen Zeichen. Es gilt: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
num_objsGesamtzahl der Objekte
num_frstrGesamtzahl der Strings
num_frimgGesamtzahl der Images
num_treeGesamtzahl der Objektbäume
rs_object 
rs_tedinfo 
rs_string 
rs_iconblk 
rs_bitblk 
rs_frstr 
rs_frimg 
tr_trindex 
rs_imdope 
+
+ +
Hinweis: Die CPX hat somit unter allen Auflösungen die +gleiche Pixelgröße. Bei der Arbeit mit einem RCS sollte man daher +ebenfalls einen Grafikmodus mit 8*16 Pixel großen Zeichen wählen. +
  +
Die Koordinaten-Umwandlung darf natürlich nur ein einziges Mal +stattfinden - XControl stellt dazu in der XCPB-Struktur das Flag +'SkipRshFix' zur Verfügung. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Gruppe: XCONTROL-Funktionen +
  +
Querverweis: rsh_obfix   XCONTROL +
  + +
+ +

9.1.3.9 rsh_obfix

+ + + + + + + + + + + + + + + + + + +
Name: »rsh_obfix« - Umwandlung eines Objektes +
  +
Deklaration: VOID cdecl (*rsh_obfix) (OBJECT *tree, int16_t curob); +
  +
Beschreibung: Die Funktion konvertiert die Größe und Position eines +Objektes von einer Zeichendarstellung in die Pixeldarstellung. Es +gilt: +
  +

+
+ + + + + + + + + + + + +
ParameterBedeutung
treeAdresse des Objektbaumes
curobzu konvertierendes Objekt
+
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Gruppe: XCONTROL-Funktionen +
  +
Querverweis: rsh_fix   rsrc_obfix   XCONTROL +
  + +
+ +

9.1.3.10 Set_Evnt_Mask

+ + + + + + + + + + + + + + + + + + +
Name: »Set_Evnt_Mask« - Festlegen der Ereignis Maske +
  +
Deklaration: VOID cdecl (*Set_Evnt_Mask) (int16_t mask, MOBLK *m1, MOBLK +*m2, int32_t time); +
  +
Beschreibung: Die Funktion legt fest, auf welche Ereignisse die CPX reagieren +soll. Es gilt: +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
maskerlaubte Events (analog evnt_multi)
m1Mausrechteck und -richtung
m2Mausrechteck und -richtung
timeZeit in Millisekunden für Timer-Event
+
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Gruppe: XCONTROL-Funktionen +
  +
Querverweis: XCONTROL +
  + +
+ +

9.1.3.11 Sl_arrow

+ + + + + + + + + + + + + + + + + + +
Name: »Sl_arrow« - Behandlung des Sliderarrows +
  +
Deklaration: VOID cdecl (*Sl_arrow) (OBJECT *tree, int16_t base, int16_t +slider, int16_t obj, int16_t inc, int16_t min, int16_t max, int16_t +*value, int16_t direction, VOID (*foo) (VOID)); +
  +
Beschreibung: Die Funktion ist aufzurufen, sobald der Pfeil eines Sliders +angeklickt wird. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
tree Adresse des Objektbaumes +
base Basisobjekt +
slider Slider (Child des Basisobjektes) +
obj Pfeil der angeklickt wurde +
inc Anzahl der Einheiten die addiert bzw. subtrahiert werden sollen +
min Minimalwert der angenommen werden kann +
max Maximalwert der angenommen werden kann +
value Adresse für aktuellen Wert +
direction Richtung +
+
+ + + + + + + + + + +
0=vertikal
1=horizontal
+
+ +
foo Adresse einer Funktion (analog zu Sl_x, bzw. Sl_y). + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Gruppe: XCONTROL-Funktionen +
  +
Querverweis: Sl_dragx   Sl_dragy   XCONTROL +
  + +
+ +

9.1.3.12 Sl_dragx

+ + + + + + + + + + + + + + + + + + +
Name: »Sl_dragx« - Draggen eines Sliders +
  +
Deklaration: VOID cdecl (*Sl_dragx) (OBJECT *tree, int16_t base, int16_t +slider, int16_t min, int16_t max, int16_t *value, VOID (*foo) (VOID)); +
  +
Beschreibung: Die Funktion verwaltet die Bewegung des horizontalen Sliders. +Es gilt: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
treeAdresse des Objektbaumes
baseBasisobjekt
sliderSlider (Child des Basisobjektes)
minMinimalwert der angenommen werden kann
maxMaximalwert der angenommen werden kann
valueAdresse für aktuellen Wert
fooAdresse einer Funktion analog zu Sl_x
+
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Gruppe: XCONTROL-Funktionen +
  +
Querverweis: Sl_dragy   XCONTROL +
  + +
+ +

9.1.3.13 Sl_dragy

+ + + + + + + + + + + + + + + + + + +
Name: »Sl_dragy« - Draggen eines Sliders +
  +
Deklaration: VOID cdecl (*Sl_dragy) (OBJECT *tree, int16_t base, int16_t +slider, int16_t min, int16_t max, int16_t *value, VOID (*foo) (VOID)); +
  +
Beschreibung: Die Funktion verwaltet die Bewegung des horizontalen Sliders. +Es gilt: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
treeAdresse des Objektbaumes
baseBasisobjekt
sliderSlider (Child des Basisobjektes)
minMinimalwert der angenommen werden kann
maxMaximalwert der angenommen werden kann
valueAdresse für aktuellen Wert
fooAdresse einer Funktion analog zu Sl_y
+
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Gruppe: XCONTROL-Funktionen +
  +
Querverweis: Sl_dragx   XCONTROL +
  + +
+ +

9.1.3.14 Sl_size

+ + + + + + + + + + + + + + + + + + +
Name: »Sl_size« - Größe des Sliders festlegen +
  +
Deklaration: VOID cdecl (*Sl_size) (OBJECT *tree, int16_t base, int16_t +slider, int16_t num_items, int16_t visible, int16_t direction, int16_t +min_size); +
  +
Beschreibung: Die Funktion stellt die Größe des Sliders ein. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
tree Adresse des Objektbaumes +
base Basisobjekt +
slider Slider (Child des Basisobjektes) +
num_items Anzahl der vorhandenen Elemente +
visible Anzahl der sichtbaren Elemente +
direction Richtung +
+
+ + + + + + + + + + +
0=vertical
1=horizontal
+
+ +
min_size Minimalgröße des Sliders in Pixeln + +
+ +
Hinweis: Die Funktion wird benötigt, um die Relation +der dargestellten Datenmenge zur vorhandenen zu erhalten. +
  +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Gruppe: XCONTROL-Funktionen +
  +
Querverweis: Sl_dragx   Sl_dragy   Sl_x   Sl_y   XCONTROL +
  + +
+ +

9.1.3.15 Sl_x

+ + + + + + + + + + + + + + + + + + +
Name: »Sl_x« - Positionierung eines Sliders +
  +
Deklaration: VOID cdecl (*Sl_x) (OBJECT *tree, int16_t base, int16_t slider, +int16_t value, int16_t min, int16_t max, VOID (*foo) (VOID)); +
  +
Beschreibung: Die Funktion positioniert den Slider innerhalb eines +Basisobjektes in horizontaler Richtung. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
tree Adresse des Objektbaumes +
base Basisobjekt +
slider Slider (Child des Basisobjektes) +
value neuer Wert, den der Slider repräsentieren soll +
min Minimalwert den value annehmen darf +
max Maximalwert den value annehmen darf +
foo Adresse einer Funktion (oder NULL), die gleichzeitig mit der +Slider-Neupositionierung aufgerufen wird; so lassen sich die +Sliderbewegungen ausnutzen, um auch die angezeigten Werte zu erneuern. + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Gruppe: XCONTROL-Funktionen +
  +
Querverweis: Sl_y   XCONTROL +
  + +
+ +

9.1.3.16 Sl_y

+ + + + + + + + + + + + + + + + + + +
Name: »Sl_y« - Positionierung eines Sliders +
  +
Deklaration: VOID cdecl (*Sl_y) (OBJECT *tree, int16_t base, int16_t slider, +int16_t value, int16_t min, int16_t max, VOID (*foo) (VOID)); +
  +
Beschreibung: Die Funktion positioniert den Slider innerhalb eines +Basisobjektes in vertikaler Richtung. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
tree Adresse des Objektbaumes +
base Basisobjekt +
slider Slider (Child des Basisobjektes) +
value neuer Wert, den der Slider repräsentieren soll +
min Minimalwert den value annehmen darf +
max Maximalwert den value annehmen darf +
foo Adresse einer Funktion (oder NULL), die gleichzeitig mit der +Slider-Neupositionierung aufgerufen wird; so lassen sich die +Sliderbewegungen ausnutzen, um auch die angezeigten Werte zu erneuern. + +
+ +
Ergebnis: Die Funktion liefert kein Ergebnis. +
  +
Gruppe: XCONTROL-Funktionen +
  +
Querverweis: Sl_x   XCONTROL +
  + +
+ +

9.1.3.17 Xform_do

+ + + + + + + + + + + + + + + + + + +
Name: »Xform_do« - Verwaltung eines Formulars +
  +
Deklaration: int16_t cdecl (*Xform_do) (OBJECT *tree, int16_t startob, +int16_t *puntmsg); +
  +
Beschreibung: Die Funktion übernimmt die Verwaltung eines Formulars, sowie +(in geringem Umfang) die Bearbeitung von AES Nachrichten. Es gilt: +
  +

+
+ + + + + + + + + + + + + + + + +
ParameterBedeutung
treeAdresse des Objektbaumes
startobStartobjekt
puntmsgMitteilungs-Puffer
+
+ +
Hinweis: Unter COPS kann die CPX einen bis zu 512*384 +Pixel großen Objektbaum zeichnen und an diese Funktion übergeben. +
  +
Ergebnis: Die Funktion liefert einen der folgenden Werte zurück: +
  + + + +
-1: puntmsg enthält eine Nachricht, die auszuwerten ist: +
  + + + + + + + + + + + + + + + +
WM_REDRAW: die CPX muß solche Objekte selbst neuzeichnen, die nicht zum +Objektbaum gehören. Die Rechteckliste kann über die Funktionen +GetFirstRect und GetNextRect ermittelt werden. +
  +
AC_CLOSE: +
  +
WM_CLOSE: Die CPX wurde beendet; reservierter Speicher ist sofort +freizugeben. AC_CLOSE ist als 'Abbruch', WM_CLOSE als 'Ok' zu werten. +
  +
CT_KEY: spezielle Nachricht, die das Auswerten von Tastendrücken +erlaubt, sofern diese keine Auswirkungen auf EDIT-Felder haben +können. +
  +

+
+ + + + + + + + + + + + +
puntmsg[3]Highbyte:Scan-Code der Taste
puntmsg[3]Lowbyte:ASCII-Code der Taste
+
+ +
sonst: Nummer des angeklickten Objektes (ein Doppelklick wird im oberen Bit +gekennzeichnet). +
  + +
+ + +
+ +
Gruppe: XCONTROL-Funktionen +
  +
Querverweis: form_do   form_xdo   Rechteckliste eines Fensters +
  + +
+ +

9.1.3.18 XGen_Alert

+ + + + + + + + + + + + + + + + + + +
Name: »XGen_Alert« - Anzeigen einer Alarmbox +
  +
Deklaration: int16_t cdecl (*XGen_Alert) (int16_t id); +
  +
Beschreibung: Die Funktion ermöglicht das Anzeigen einer einfachen Alarmbox. +Es gilt: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
ParameterBedeutung
idArt der Meldung
  0 = "Voreinstellungen sichern?"
  1 = "Fehler bei Speicheranforderung!"
  2 = "Fehler beim Schreiben/Lesen von Dateien"
  3 = "Datei nicht gefunden"
+
+ +
Hinweis: Weitere Alarmboxen müssen selbst definiert +werden. Hierzu bietet sich form_alert jedoch nicht an, da es +die Alarmbox bezüglich der vollen Bildschirmfläche und nicht +bezüglich des XControl-Fensters zentriert. +
  +
Ergebnis: Die Funktion liefert einen der folgenden Werte zurück: +
  + + + + + + +
   0 : Abbruch bzw. Cancel wurde angeklickt. +
<> 0 : Ok wurde angeklickt (falls eine Alarmbox nur einen Button hat, +so ist es der Ok-Button) + +
+ +
Gruppe: XCONTROL-Funktionen +
  +
Querverweis: form_alert   XCONTROL +
  + +
+ +
+ +Home +XCONTROLXCONTROL +XCONTROLXCONTROL +ProgrammierrichtlinenProgrammierrichtlinen + + diff --git a/de/xcontrol_main.html b/de/xcontrol_main.html new file mode 100644 index 000000000..292927a2b --- /dev/null +++ b/de/xcontrol_main.html @@ -0,0 +1,37 @@ + + + + + +Die Anleitung zum TOS: XCONTROL + + + + + + + + + +Home +Inhaltsverzeichnis +AES-StrukturenAES-Strukturen +Das XCONTROLDas XCONTROL + +
+ +

9 XCONTROL

+ +
+
+ +Home +Inhaltsverzeichnis +AES-StrukturenAES-Strukturen +Das XCONTROLDas XCONTROL + + diff --git a/de/xgrf.html b/de/xgrf.html new file mode 100644 index 000000000..84ba8be42 --- /dev/null +++ b/de/xgrf.html @@ -0,0 +1,694 @@ + + + + + +Die Anleitung zum TOS: Erweiterte Grafikfunktionen + + + + + + + + + +Home +AESAES +ShellfunktionenShellfunktionen +Erweiterte ShellfunktionenErweiterte Shellfunktionen + +
+ +

8.23 Erweiterte Grafikfunktionen

+

Diese Bibliothek enthält Funktionen um sich bewegende +(ausdehnende bzw. zusammenziehende) Rechtecke zu animieren; für +diesen Zweck gibt es die folgenden Routinen: +

+ + + + + + + + + + + + +
xgrf_2box Animation sich bewegender Rechtecke +
xgrf_color Verändert die Farbe der Fensterelements +
xgrf_dtimage Setzt den Desktop-Hintergrundes +
xgrf_stepcalc Parameter-Berechnung für Rechteck-Animation + +
+ +

Hinweis: xgrf_2box und xgrf_stepcalc sind in +erster Linie als Ersatz für die Funktionen graf_growbox und +graf_shrinkbox zu verstehen, die in PC-GEM dem Rechtsstreit zwischen +Apple und Digital Research zum Opfer gefallen sind. +

+

Querverweis: graf_growbox   graf_shrinkbox   Style-Guidelines +

+

8.23.1 xgrf_2box

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Animate Rectangles« - zeichnet eine Menge sich bewegender +Rechtecke. +
  +
AES-Nummer: 131 +
  +
Deklaration: int16_t xgrf_2box ( int16_t cx, int16_t cy, int16_t w, int16_t +h, int16_t corners, int16_t cnt, int16_t xstep, int16_t ystep, int16_t +doubled ); +
  +
Beschreibung: Die Funktion zeichnet eine Reihe von Rechtecken, die sich über +den Bildschirm bewegen. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
cx Anfangsposition in x-Richtung +
cy Anfangsposition in y-Richtung +
w Breite der Anfangsposition +
h Höhe der Anfangsposition +
corners Zeichnung + + + + + + +
0 = ganze Rechtecke zeichnen +
1 = nur die Ecken zeichnen + +
+ +
cnt Anzahl der Einzelschritte +
xstep Schrittweite in x-Richtung +
ystep Schrittweite in y-Richtung +
doubled Schrittweite + + + + + + +
0 = normale Schrittweite +
1 = Schrittweite verdoppeln + +
+ + +
+ +
Hinweis: Die Funktion ist ein Ersatz für die in PC-GEM +(aufgrund des Rechtstreits zwischen Apple und Digital +Research) gestrichenen Funktionen der FORM und GRAF Bibliotheken. +
  +
Ergebnis: Der Rückgabewert der Funktion ist z.Zt. unbekannt. +
  +
Verfügbar: Die Funktion ist nur ab PC-GEM 2.0, ab KAOS 1.4.2 und MagiC +vorhanden. +
  +
Gruppe: X-Grafikfunktionen +
  +
Querverweis: Binding   xgrf_stepcalc   MagiC +
  + +
+ +

8.23.2 Bindings für xgrf_2box

+ + + + + + + + + +
C: int16_t xgrf_2box ( int16_t cx, int16_t cy, int16_t w, int16_t +h, int16_t corners, int16_t cnt, int16_t xstep, int16_t ystep, int16_t +doubled ); +
  +
Umsetzung: +
  +
int16_t xgrf_2box ( int16_t cx, int16_t cy, int16_t w,
+                    int16_t h, int16_t corners, int16_t cnt,
+                    int16_t xstep, int16_t ystep,
+                    int16_t doubled )
+{
+   int_in[0] = cnt;
+   int_in[1] = xstep;
+   int_in[2] = ystep;
+   int_in[3] = doubled;
+   int_in[4] = corners;
+   int_in[5] = cx;
+   int_in[6] = cy;
+   int_in[7] = w;
+   int_in[8] = h;
+
+   return ( crys_if(131) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]131 # Opcode der Funktion
control+2control[1]9 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]cnt
int_in+2int_in[1]xstep
int_in+4int_in[2]ystep
int_in+6int_in[3]doubled
int_in+8int_in[4]corners
int_in+10int_in[5]cx
int_in+12int_in[6]cy
int_in+14int_in[7]w
int_in+16int_in[8]h
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.23.3 xgrf_stepcalc

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Stepcalc for XGraf« - Parameterberechnung für die Animation +von Rechtecken. +
  +
AES-Nummer: 130 +
  +
Deklaration: int16_t xgrf_stepcalc ( int16_t orgw, int16_t orgh, int16_t xc, +int16_t yc, int16_t w, int16_t h, int16_t *pcx, int16_t *pcy, int16_t +*pcnt, int16_t *pxstep, int16_t *pystep ); +
  +
Beschreibung: Die Funktion berechnet alle Parameter für einen Aufruf von +xgrf_2box. Es gilt: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
orgw anfängliche Breite +
orgh anfängliche Höhe +
xc Endposition in x-Richtung +
yc Endposition in y-Richtung +
w Breite der Endgröße +
h Höhe der Endgröße +
pcx zentrierte Position nach Ablauf des Vorgangs in x-Richtung +
pcy dto. für y-Richtung +
pcnt Anzahl der Einzelschritte +
pxstep Schrittweite in x-Richtung +
pystep Schrittweite in y-Richtung + +
+ +
Hinweis: Aus Anfangsgröße, Endgröße und Endposition +des Rechtecks werden Endposition, Anzahl der Schritte sowie Größe +der Schritte bestimmt. +
  +
Ergebnis: Der Rückgabewert der Funktion ist z.Zt. unbekannt. +
  +
Verfügbar: Die Funktion ist nur ab PC-GEM 2.0, ab KAOS 1.4.2 und MagiC +vorhanden. +
  +
Gruppe: X-Grafikfunktionen +
  +
Querverweis: Binding   xgrf_2box   MagiC +
  + +
+ +

8.23.4 Bindings für xgrf_stepcalc

+ + + + + + + + + +
C: int16_t xgrf_stepcalc ( int16_t orgw, int16_t orgh, int16_t xc, +int16_t yc, int16_t w, int16_t h, int16_t *pcx, int16_t *pcy, int16_t +*pcnt, int16_t *pxstep, int16_t *pystep ); +
  +
Umsetzung: +
  +
int16_t xgrf_stepcalc ( int16_t orgw, int16_t orgh,
+                        int16_t xc, int16_t yc,
+                        int16_t w, int16_t h,
+                        int16_t *pcx, int16_t *pcy,
+                        int16_t *pcnt,
+                        int16_t *pxstep, int16_t *pystep )
+{
+   int_in[0] = orgw;
+   int_in[1] = orgh;
+   int_in[2] = xc;
+   int_in[3] = yc;
+   int_in[4] = w;
+   int_in[5] = h;
+
+   crys_if (130);
+
+   *pcx    = int_out[1];
+   *pcy    = int_out[2];
+   *pcnt   = int_out[3];
+   *pxstep = int_out[4];
+   *pystep = int_out[5];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]130 # Opcode der Funktion
control+2control[1]6 # Einträge in int_in
control+4control[2]6 # Einträge in int_out
control+6control[3]0 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
int_inint_in[0]orgw
int_in+2int_in[1]orgh
int_in+4int_in[2]xc
int_in+6int_in[3]yc
int_in+8int_in[4]w
int_in+10int_in[5]h
int_outint_out[0]Return-Wert
int_out+2int_out[1]pcx
int_out+4int_out[2]pcy
int_out+6int_out[3]pcnt
int_out+8int_out[4]pxstep
int_out+10int_out[5]pystep
+
+ + +
+ +

8.23.5 xgrf_color

+ + + + + + + + + + + + + + + + + + +
Name: »« - Set color category for various window elements. +
  +
Opcode: 132 +
  +
Syntax: int16_t xgrf_color ( int16_t color, int16_t fgclr, int16_t +bkclr, int16_t style, int16_t pattern ); +
  +
Description: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CC_NAME (8) Window title bar selected. +
  +
CC_SLIDER (9) +
  +
CC_DESKTOP (10) +
  +
CC_BUTTON (11) +
  +
CC_INFO (12) Info bar. +
  +
CC_ALERT (13) +
  +
CC_SLCTDNAME (14) Window title bar normal. +
  +
CC_3DSHADE (16) +
  +
CC_RADIO (17) +
  +
CC_CHECK (18) +
  +
CC_NAMETEXT (19) Text of active titlebar. +
  +
CC_NNAMETEXT (20) Text of inactive titlebar. +
  +
CC_INFOTEXT (21) Text of info bar. +
  + +
+ +
Availability: The function is available only as of ViewMAX/2. +
  +
Group: Extended graphics library +
  + +
+ +

8.23.6 xgrf_dtimage

+ + + + + + + + + + + + + + + + + + +
Name: »« - Set desktop image +
  +
Opcode: 133 +
  +
Syntax: int16_t xgrf_dtimage ( MFDB *image ); +
  +
Description: +
  +
Availability: The function is available only as of ViewMAX/3. +
  +
Group: Extended graphics library +
  + +
+ +
+ +Home +AESAES +ShellfunktionenShellfunktionen +Erweiterte ShellfunktionenErweiterte Shellfunktionen + + diff --git a/de/xhdi.html b/de/xhdi.html new file mode 100644 index 000000000..89e5bade6 --- /dev/null +++ b/de/xhdi.html @@ -0,0 +1,93 @@ + + + + + +Die Anleitung zum TOS: XHDI - eXtended HardDisk Interface (Version 1.30) + + + + + + + + + +Home +Inhaltsverzeichnis +TOS ListeTOS Liste +XHDI-CookieXHDI-Cookie + +
+ +

H XHDI - eXtended HardDisk Interface (Version 1.30)

+ +

Wie unschwer am Namen zu erkennen ist, soll die +XHDI-Spezifikation die Möglichkeiten der Kommunikation mit Treibern +für blockorientierte Massenspeicher verbessern. Ausgangspunkt war die +Überlegung, einige zusätzliche Eigenschaften, die viele Treiber +bereits haben, über eine dokumentierte Schnittstelle nach außen zu +führen. Dies sollte speziell Virtual-Memory-Programmen die +Möglichkeit geben, Wechselplatten zu verriegeln (wer wollte schon, +daß die Swap-Partition während des Swappens entfernt werden kann). +

+

Mit fortschreitender Diskussion hat sich herausgestellt, daß +auch die durch die PUN_INFO-Struktur bereitgestellten Informationen +nicht immer ausreichen und daher über die XHDI-Spezifikation +erweitert werden sollten. Gründe: +

+
    +
  • die PUN_INFO-Struktur hat nur Platz für 16 Geräte, obwohl das +BIOS (und einige GEMDOS-Aufsätze) 32 Geräte erlauben. +
      +

  • +
  • eine Installation mehrerer AHDI-kompatibler Treiber im System +ist nicht möglich. +
      +

  • +
  • die Atari-Definition von Gerätenummern geht davon aus, daß +immer nur LUN 0 eines ACSI- oder SCSI-Targets benutzt wird. +
      +

  • +
+ +

Der Sinn und Zweck der XHDI-Spezifikation sieht damit so +aus: +

+
    +
  • flexiblerer und umfassenderer Zugang zu den Informationen über +die einzelnen Geräte. +
      +

  • +
  • Unterstützung erweiterter Treiberfunktionen wie Stop/Start +oder Verriegeln/Entriegeln. +
      +

  • +
+ +

Nicht Sinn der Sache ist, völlig neue Anforderungen an Treiber +festzulegen. Die XHDI-Spezifikation soll sich nach Möglichkeit auf +einfache Weise in bestehende Treiber integrieren lassen. +

+

Querverweis: +
XHDI-Cookie   XHDI-Terminologie   Partitiontypen   Arbitration   +XHDI-Funktionen   SCSI-Spezifikation +

+ +
+
+ +Home +Inhaltsverzeichnis +TOS ListeTOS Liste +XHDI-CookieXHDI-Cookie + + diff --git a/de/xhdi_arbitration.html b/de/xhdi_arbitration.html new file mode 100644 index 000000000..d393e46f7 --- /dev/null +++ b/de/xhdi_arbitration.html @@ -0,0 +1,74 @@ + + + + + +Die Anleitung zum TOS: Arbitration + + + + + + + + + +Home +XHDI - eXtended HardDisk Interface (Version 1.30)XHDI - eXtended HardDisk Interface (Version 1.30) +XHDI-TerminologieXHDI-Terminologie +Empfohlene PartitiontypenEmpfohlene Partitiontypen + +
+ +

H.3 Arbitration

+

Für Gerätetreiber, die den SCSI-Bus arbitrierend betreiben +wollen, muß für den Rechner eine eigene Gerätekennung vergeben +werden. Diese sollte natürlich einheitlich und nicht auf der +Festplatte gespeichert sein. Atari hat dafür Byte 16 im NVM des Atari +TT und Falcon reserviert. Die Bitbelegung ist: +

+ + + + + + +
Bit 0..2: Gerätenummer +
Bit 7: Arbitration an (1) oder aus (0) + +
+ +

Die Abfrage der Gerätenummer könnte zum Beispiel wie folgt +geschehen: +

+
WORD arbitration_id (VOID)
+{
+   LONG ret = EINVFN;
+   UBYTE nvmdata = 0;
+   OSHEADER *Sys;
+   LONG oldstack = Super(0L);
+   Sys = *_sysbase;
+   Super((VOID *)oldstack);
+
+   host_id = -1;   /* no arbitration by default */
+
+   if (Sys->os_version >= 0x300)
+      ret = NVMaccess (0, 16, (WORD) sizeof (nvmdata), &nvmdata);
+
+   if (ret == E_OK && (nvmdata & 0x80))
+      host_id = nvmdata & 7;
+
+   return host_id;
+}
+
+

Querverweis: XHDI-Spezifikation   SCSI-Spezifikation   GEMDOS   BIOS +

+
+ +Home +XHDI - eXtended HardDisk Interface (Version 1.30)XHDI - eXtended HardDisk Interface (Version 1.30) +XHDI-TerminologieXHDI-Terminologie +Empfohlene PartitiontypenEmpfohlene Partitiontypen + + diff --git a/de/xhdi_cookie.html b/de/xhdi_cookie.html new file mode 100644 index 000000000..d078049c8 --- /dev/null +++ b/de/xhdi_cookie.html @@ -0,0 +1,76 @@ + + + + + +Die Anleitung zum TOS: XHDI-Cookie + + + + + + + + + +Home +XHDI - eXtended HardDisk Interface (Version 1.30)XHDI - eXtended HardDisk Interface (Version 1.30) +XHDI - eXtended HardDisk Interface (Version 1.30)XHDI - eXtended HardDisk Interface (Version 1.30) +XHDI-TerminologieXHDI-Terminologie + +
+ +

H.1 XHDI-Cookie

+

Cookie-Kennung: "XHDI". Der Parameter zeigt auf die +Adresse einer Routine, die massenspeicherbezogene Funktionen zur +Verfügung stellt. Zur Absicherung steht vor der Routine die +Long-Konstante $27011992. +

+

Der Wert des Cookies kann sich im laufenden Betrieb ändern (wg. +Zweitinstallation). Daher ggfs. (z. B. in Accessories) den Cookie +jedesmal NEU abfragen! +

+

Installation mehrerer Programme im XHDI-Cookie: +

+ + + + + + + + + + + + +
(1) Bei der Installation feststellen, ob der Cookie schon gesetzt +ist. Falls ja, müssen folgende zusätzliche Aufrufkonventionen +berücksichtigt werden: +
  +
(2) Bei XHGetVersion() zunächst durch den alten Vektor springen +und dann das Minimun der dort erhaltenen und der eigenen +Versionsnummer zurückliefern. +
  +
(3) Bei XHDrvMap() zunächst den alten Vektor durchspringen und +anschließend die eigenen Drive-Bits hineinodern. +
  +
(4) Bei den anderen Funktionen: wenn es das eigene Gerät ist, +normal verfahren. Ansonsten: keinen Fehler melden, sondern durch den +alten Vektor springen. +
  + +
+ +

Querverweis: XHDI-Spezifikation   GEMDOS   BIOS   Cookie-Jar   +SCSI-Spezifikation +

+
+ +Home +XHDI - eXtended HardDisk Interface (Version 1.30)XHDI - eXtended HardDisk Interface (Version 1.30) +XHDI - eXtended HardDisk Interface (Version 1.30)XHDI - eXtended HardDisk Interface (Version 1.30) +XHDI-TerminologieXHDI-Terminologie + + diff --git a/de/xhdi_functions.html b/de/xhdi_functions.html new file mode 100644 index 000000000..99c2fc169 --- /dev/null +++ b/de/xhdi_functions.html @@ -0,0 +1,1663 @@ + + + + + +Die Anleitung zum TOS: XHDI-Funktionen + + + + + + + + + +Home +XHDI - eXtended HardDisk Interface (Version 1.30)XHDI - eXtended HardDisk Interface (Version 1.30) +Empfohlene PartitiontypenEmpfohlene Partitiontypen +TypdefinitionenTypdefinitionen + +
+ +

H.5 XHDI-Funktionen

+

Alle Funktionen müssen im Supervisor-Modus aufgerufen werden. +Das Verhalten für Aufrufe im User-Modus ist undefiniert. Bis auf D0 +werden keine Prozessorregister verändert. Undefinierte Opcodes +führen zur Fehlermeldung EINVFN. +

+

Einige der Funktionsaufrufe - insbesondere XHReadWrite() - +können zum Aufruf von BIOS- oder XBIOS-Routinen im Betriebssystem +und damit zur Aktivierung des Critical Error Handler führen. Im +Zweifel muß der CEH also vom Aufrufer abgeschaltet werden. +

+ +

Für alle Funktionen seien folgende Return-Werte definiert: +

+

TOS-Fehlernummern: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
0:OK (OK)
-1:unspezifizierter Fehler (ERROR)
-2:Gerät nicht bereit (EDRVNR)
-15:ungültige Device/Targetnummer (EUNDEV)
-32:falsche Funktionsnummer (EINVFN)
-36:Gerät ist zur Zeit 'reserved' (EACCDN)
-46:BIOS-Device wird vom Treiber nicht bedient (EDRIVE)
+
+ +

SCSI-Fehlernummern (Bereich von -200..-455) +

+ + + +
(-200 - N): SCSI-Errorcode N (der `Additional Sense Code' aus Byte 12 des +`Extended Sense Format', siehe Anhang B in `draft proposed American +National Standard for information systems - Revision 11a - SCSI-3 +Primary Commands, 28 March 1997'). +
  + +
+ +

IDE-Fehlernummern (Bereich von -456..-711) +

+ + + +
(-456 - N): IDE-Errorcode N (Wert des IDE-Fehlerregisters). +
  + +
+ +

Hinweis: SCSI-Fehlercodes können logischerweise nur bei +ACSI-/SCSI-Geräten auftreten. Für Platten am IDE-Interface des +ST-Book oder Falcon030 (oder Maschinen, bei denen ein derartiges +Interface nachgerüstet worden ist), kann auch optional folgende +Zuordnung benutzt werden: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Bit im IDE-   
FehlerregisterBedeutungSCSI-FehlerXHDI-Fehler
1Track 0 not found$06-206
0DAM not found$13-219
4ID-Field not found$12-218
7Bad block mark$10-216
6Uncorrectable error$11-217
2Command aborted$20-232
5Media Change$28-240
3Media Change requested$5A-290
+
+ +

(Es empfiehlt sich, die einzelnen Bits in der angegebenen +Reihenfolge zu testen). +

+

Bei andersartigen Geräten, wie zum Beispiel Diskettenlaufwerken +an der Floppy-Controller-Schnittstelle, können auch andere, hier noch +nicht spezifizierte Error-Codes zurückgeliefert werden. +

+

Für die Parameterübergabe gilt die GEMDOS-Übergabe-Konvention. Alle +Parameter werden auf dem Stack abgelegt (zuletzt, also an der +niedrigsten Adresse, der Opcode als 16-Bit-Wert). Das 32 Bit große +Ergebnis wird in D0 zurückgeliefert. +

+

Immer dann, wenn dokumentiert ist, daß der Aufrufer Nullzeiger +übergeben darf, bedeutet die Übergabe eines Nullzeigers, daß der +Aufrufer sich für den zurückzuliefernden Wert nicht interessiert. +Treibersoftware muß also solche Zeiger vor einer Dereferenzierung +immer überprüfen. +

+

Querverweis: XHDI-Spezifikation   SCSI-Spezifikation   BIOS +

+

H.5.1 XHGetVersion

+ + + + + + + + + + + + + + + + + + + + + +
Name: »XHGetVersion« - Protokollversion erfragen +
  +
Opcode: 0 +
  +
Deklaration: UWORD XHGetVersion ( VOID ); +
  +
Beschreibung: Die Funktion liefert die Protokollversion zurück. +Formatbeispiel: $0119 ist Version 1.19 (identisch mit +GEMDOS-Sversion(), nur sind die beiden Bytes NICHT verdreht). +
  +
Ergebnis: Der Rückgabewert beschreibt die Versionsnummer des +XHDI-Protokolls. Dabei enthält das High-Byte die Versionsnummer und +das Low-Byte die Revision. +
  +
Gruppe: XHDI-Funktionen +
  +
Querverweis: Arbitration   _drvbits   Partitiontypen   Systemvariablen   XHDI-Cookie   +XHDI-Funktionen   XHDI-Terminologie +
  + +
+ +

H.5.2 XHInqTarget

+ + + + + + + + + + + + + + + + + + + + + +
Name: »XHInqTarget« - Informationen über ein Gerät liefern +
  +
Opcode: 1 +
  +
Deklaration: LONG XHInqTarget ( UWORD major, UWORD minor, ULONG *blocksize, +ULONG *device_flags, BYTE *product_name ); +
  +
Beschreibung: Liefert Informationen über das durch major und +minor spezifizierte Gerät (in (device_flags: ein +Attributvektor). Mit XHReserve() vorgenommene Reservierungen werden +dabei berücksichtigt. +
  +
Ergebnis: +
  + + + + + + + + + + + + + + + + + + +
Bit Bedeutung +
    +
block_size Blockgröße auf dem Gerät (für XHReadWrite() sehr wichtig). +Normalerweise 512. + + + + + + + +
device_flags (Bit gesetzt -> Fähigkeit verfügbar): + + + + + + + + + + + + + + + + + + + + + +
0 Gerät kann gestoppt werden (XH_TARGET_STOPPABLE (0x00000001L)) +
1 Gerät hat wechselbare Medien (XH_TARGET_REMOVABLE +(0x00000002L)) +
2 Auswurf des Geräts kann verriegelt werden (XH_TARGET_LOCKABLE +(0x00000004L)) +
3 Medium kann per Kommando ausgeworfen werden +(XH_TARGET_EJECTABLE (0x00000008L)) +
29 Auswurf des Geräts ist vom Treiber blockiert worden +(XH_TARGET_LOCKED (0x20000000L), ab XHDI 1.25). +
30 Gerät ist vom Treiber gestoppt worden (XH_TARGET_STOPPED +(0x40000000L), ab XHDI 1.25). +
31 Gerät ist zur Zeit blockiert (XH_TARGET_RESERVED +(0x80000000L)). + +
+ +
Alle weiteren Bits sind reserviert und sollten vom Treiber auf +Null gesetzt werden. +
product_name Produktbezeichnung des Geräts (max. 33 Zeichen inkl. +Leerzeichen). Falls die Information nicht verfügbar ist, wird eine +Zeichenkette der Länge Null zurückgeliefert. +
Anmerkung: + + + + + + +
- für blocksize, device_flags und product_name dürfen auch +Nullzeiger übergeben werden. +
- für IDE-Geräte wird bei product_name gegebenenfalls auf 32 +Zeichen gekürzt. Siehe auch die neue Funktion XHInqTarget2. + +
+ + +
+ +
Gruppe: XHDI-Funktionen +
  +
Querverweis: Arbitration   _drvbits   Partitiontypen   Systemvariablen   XHDI-Cookie   +XHDI-Funktionen   XHDI-Terminologie +
  + +
+ +

H.5.3 XHReserve

+ + + + + + + + + + + + + + + + + + + + + +
Name: »XHReserve« - Gerät reservieren bzw. wieder freigeben +
  +
Opcode: 2 +
  +
Deklaration: LONG XHReserve ( UWORD major, UWORD minor, UWORD do_reserve, +UWORD key ); +
  +
Beschreibung: Reserviert ein Gerät bzw. gibt es wieder frei. Auf reservierte +Geräte kann nur bei Angabe des korrekten Schlüssels per XHLock(), +XHStop() oder XHEject() zugegriffen werden. +
  +
Sinn: man möchte nicht, daß man eine Wechselplatte per CPX-Modul +entriegeln kann, nachdem sie gerade von einer virtuellen +Speicherverwaltung verriegelt worden ist. Dies sollte nur die +Speicherverwaltung selbst machen können. +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
do_reserve + + + + + + +
(1) Reservieren +
(0) wieder freigeben + +
+ +
key nur beim Freigeben benutzt + +
+ +
Ergebnis: Beim Reservieren des Geräts wird im Erfolgsfall ein 16-Bit +Schlüssel zurückgeliefert. Dieser Schlüssel muß bei allen weiteren +Zugriffen auf das Gerät angegeben sowie beim Wieder-Freigeben +angegeben werden. +
  +
Gruppe: XHDI-Funktionen +
  +
Querverweis: Arbitration   _drvbits   Partitiontypen   Systemvariablen   XHDI-Cookie   +XHDI-Funktionen   XHDI-Terminologie +
  + +
+ +

H.5.4 XHLock

+ + + + + + + + + + + + + + + + + + + + + +
Name: »XHLock« - Auswurfknopf verriegeln bzw. entriegeln +
  +
Opcode: 3 +
  +
Deklaration: LONG XHLock ( UWORD major, UWORD minor, UWORD do_lock, UWORD +key ); +
  +
Beschreibung: Verriegelt bzw. entriegelt den Auswurfknopf eines Geräts. Der +Treiber hat sich darum zu kümmern, ob dieser Befehl an das Gerät +weitergeleitet wird oder nicht (falls das Medium nicht verriegelbar +ist). +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
do_lock + + + + + + +
(1) Verriegeln +
(0) Entriegeln + +
+ +
key Falls Gerät reserviert, sonst Null übergeben. + +
+ +
Ergebnis: Welchen Code man im Fehlerfall zurückerhält, ist undefiniert. +Mehr Informationen werden allerdings auch nicht benötigt, da man ja +mit XHInqTarget() vorher gezielt auf diese Fähigkeit abtesten kann. +
  +
Gruppe: XHDI-Funktionen +
  +
Querverweis: Arbitration   _drvbits   Partitiontypen   Systemvariablen   XHDI-Cookie   +XHDI-Funktionen   XHDI-Terminologie +
  + +
+ +

H.5.5 XHStop

+ + + + + + + + + + + + + + + + + + + + + +
Name: »XHStop« - Gerät stoppen bzw. wieder starten +
  +
Opcode: 4 +
  +
Deklaration: LONG XHStop ( UWORD major, UWORD minor, UWORD do_stop, UWORD +key ); +
  +
Beschreibung: Gerät wird gestoppt (geparkt) bzw. gestartet (entparkt). +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
do_stop + + + + + + +
(1) Stoppen +
(0) Starten + +
+ +
key Falls Gerät reserviert, sonst Null übergeben. + +
+ +
Anmerkung: Bei etwaigen Zugriffen auf das gestoppte Gerät +sollte der Treiber selbst für das Wiederhochfahren sorgen. +
  +
Ergebnis: Welchen Code man im Fehlerfall zurückerhält, ist undefiniert. +Mehr Informationen werden allerdings auch nicht benötigt, da man ja +mit XHInqTarget() vorher gezielt auf diese Fähigkeit abtesten kann. +
  +
Gruppe: XHDI-Funktionen +
  +
Querverweis: Arbitration   _drvbits   Partitiontypen   Systemvariablen   XHDI-Cookie   +XHDI-Funktionen   XHDI-Terminologie +
  + +
+ +

H.5.6 XHEject

+ + + + + + + + + + + + + + + + + + + + + +
Name: »XHEject« - Medium auswerfen bzw. wieder einziehen +
  +
Opcode: 5 +
  +
Deklaration: LONG XHEject ( UWORD major, UWORD minor, UWORD do_eject, UWORD +key ); +
  +
Beschreibung: Medium wird ausgeworfen oder eingezogen. +
  + + + + + + + + + + + + +
Parameter Bedeutung +
    +
do_eject + + + + + + +
(1) Medium auswerfen +
(0) Medium einziehen + +
+ +
key Falls Gerät reserviert, sonst Null übergeben. + +
+ +
Ergebnis: Welchen Code man im Fehlerfall zurückerhält, ist undefiniert. +Mehr Informationen werden allerdings auch nicht benötigt, da man ja +mit XHInqTarget() vorher gezielt auf diese Fähigkeit abtesten kann. +
  +
Gruppe: XHDI-Funktionen +
  +
Querverweis: Arbitration   _drvbits   Partitiontypen   Systemvariablen   XHDI-Cookie   +XHDI-Funktionen   XHDI-Terminologie +
  + +
+ +

H.5.7 XHDrvMap

+ + + + + + + + + + + + + + + + + + + + + +
Name: »XHDrvMap« - Bitvektor mit BIOS XHDI-Gerätenummern liefern +
  +
Opcode: 6 +
  +
Deklaration: ULONG XHDrvMap ( VOID ); +
  +
Beschreibung: Die Funktion liefert einen Bitvektor mit den über das +XHDI-Protokoll unterstützten BIOS-Gerätenummern (wie etwa bei +Drvmap()). +
  +
Ergebnis: Der Rückgabewert ist der entsprechende Bitvektor. +
  +
Gruppe: XHDI-Funktionen +
  +
Querverweis: Arbitration   _drvbits   Partitiontypen   Systemvariablen   XHDI-Cookie   +XHDI-Funktionen   XHDI-Terminologie +
  + +
+ +

H.5.8 XHInqDev

+ + + + + + + + + + + + + + + + + + + + + +
Name: »XHInqDev« - Major, Minor Device Number, Startsektor und +Bios-Parameter-Block (BPB) eines BIOS-Geräts ermitteln +
  +
Opcode: 7 +
  +
Deklaration: LONG XHInqDev ( UWORD bios_device, UWORD *major, UWORD *minor, +ULONG *start_sector, BPB *bpb ); +
  +
Beschreibung: Liefert Major Device Number, Minor Device Number, Startsektor +und BPB eines BIOS-Geräts (im Gegensatz zu Getbpb() wird dadurch +der Media-Change-Status des Geräts NICHT zurückgesetzt). +
  +
Anmerkung: es wird ein Zeiger auf eine vom Aufrufer +bereitgestellte BPB-Struktur übergeben, die vom XHDI-Treiber +gefüllt wird. +
  +
Ergebnis: E_OK, EDRVNR (Gerät kann zur Zeit nicht angesprochen werden, +zum Beispiel Medium nicht eingelegt), EDRIVE (falsche Gerätenummer) +oder eine andere Fehlernummer. Bei EDRVNR darf man sich darauf +verlassen, daß major und minor korrekt zurückgeliefert werden. +
  +
Ein start_sector mit Wert $FFFFFFFF soll auf eine Partition +hinweisen, die zur Zeit vom Treiber nicht bedient wird (zum Beispiel, +wenn ein Wechselmedium mit 'zu wenig' Partitionen eingelegt ist). +
  +
Der zurückgelieferte BPB ist ungültig, wenn das Element +recsiz Null ist. +
  +
Hinweis: ein Dateisystem ist durch major- und minor +Gerätenummer sowie Startsektor (mit der obigen Einschränkung) exakt +spezifiziert. Über die Art des Dateisystems (FAT oder etwas anderes) +ist damit nichts ausgesagt! +
  +
Anmerkung: für major, minor, start_sector und bpb dürfen auch +Nullzeiger übergeben werden. +
  +
Gruppe: XHDI-Funktionen +
  +
Querverweis: Arbitration   _drvbits   Partitiontypen   Systemvariablen   XHDI-Cookie   +XHDI-Funktionen   XHDI-Terminologie +
  + +
+ +

H.5.9 XHInqDriver

+ + + + + + + + + + + + + + + + + + + + + +
Name: »XHInqDriver« - Informationen über den Treiber erfragen +
  +
Opcode: 8 +
  +
Deklaration: LONG XHInqDriver ( UWORD bios_device, BYTE *name, BYTE +*version, BYTE *company, UWORD *ahdi_version, UWORD *maxIPL ); +
  +
Beschreibung: Die Funktion liefert Informationen über den Treiber, der das +angesprochene Gerät bedient. +
  +
Ergebnis: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
name Zeichenkette mit Treibernamen (max. 17 Zeichen). +
version Zeichenkette mit Versionsnummer (max. 7 Zeichen). +
company Zeichenkette mit Namen des Herstellers (max. 17 Zeichen). +
ahdi_version AHDI-Versionslevel (wie PUN_INFO-Struktur). +
maxIPL: Höchster IPL, unter dem der Treiber für das angegebene Gerät +arbeitsfähig ist (Normalwert für Treiber, die ihr Timing per _hz_200 +erledigen: 5). + +
+ + + + +
Anmerkung: für name, version, company, ahdi_version und maxIPL dürfen +auch Nullzeiger übergeben werden. + +
+ +
Gruppe: XHDI-Funktionen +
  +
Querverweis: Arbitration   _drvbits   Partitiontypen   Systemvariablen   XHDI-Cookie   +XHDI-Funktionen   XHDI-Terminologie +
  + +
+ +

H.5.10 XHNewCookie

+ + + + + + + + + + + + + + + + + + + + + +
Name: »XHNewCookie« - zusätzlichen XHDI Handler installieren +
  +
Opcode: 9 +
  +
Deklaration: LONG XHNewCookie ( ULONG newcookie ); +
  +
Beschreibung: Installiert einen zusätzlichen XHDI-Handler. Vorteil: der +XHDI-Cookie zeigt nach wie vor auf die gleiche Adresse. Wer diese +Funktion unterstützt muß also folgendes tun: +
  + + + + + + +
1. Falls dies der erste Aufruf dieser Art ist: anschließend so +vorgehen, als hätte der XHDI-Cookie bei der Installation bereits +auf newcookie gezeigt. +
2. Falls nicht: Funktion an 'nächsten' Handler weiterleiten. + +
+ +
Wer eine Mehrfachinstallation vornehmen möchte, sollte so +vorgehen: +
  + + + + + + +
1. Testen, ob XHNewCookie() zum Erfolg führt. +
2. Anderenfalls den Cookie `per Hand' versetzen. + +
+ +
Achtung: Diese Funktion ist optional, daher darf ein +Aufruf mit EINVFN beantwortet werden. +
  +
Ergebnis: XHDI-Fehlercodes +
  +
Gruppe: XHDI-Funktionen +
  +
Querverweis: Arbitration   _drvbits   Partitiontypen   Systemvariablen   XHDI-Cookie   +XHDI-Funktionen   XHDI-Terminologie +
  + +
+ +

H.5.11 XHReadWrite

+ + + + + + + + + + + + + + + + + + + + + +
Name: »XHReadWrite« - physikalische Blocknummern lesen/schreiben +
  +
Opcode: 10 +
  +
Deklaration: LONG XHReadWrite ( UWORD major, UWORD minor, UWORD rwflag, +ULONG recno, UWORD count, VOID *buf ); +
  +
Beschreibung: Äquivalent zur BIOS-Funktion Rwabs() zum Lesen bzw. +Schreiben physikalischer Blocknummern. +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
rwflag + + + + + + +
Bits 0..2: wie in den AHDI-Release-Notes (3.00, 18. April 1990) +beschrieben. +
Bit 3: (physikalischer Modus) wird ignoriert. + +
+ +
Alle weiteren Bits sind reserviert und auf Null zu setzen. +
recno Sektornummer +
count Anzahl der Blöcke +
buf Zeiger auf Puffer + +
+ +
Ergebnis: XHDI-Fehlercodes +
  +
Gruppe: XHDI-Funktionen +
  +
Querverweis: Arbitration   _drvbits   Partitiontypen   Systemvariablen   XHDI-Cookie   +XHDI-Funktionen   XHDI-Terminologie +
  + +
+ +

H.5.12 XHInqTarget2

+ + + + + + + + + + + + + + + + + + + + + +
Name: »XHInqTarget2« - Informationen über Gerät liefern +
  +
Opcode: 11 +
  +
Deklaration: LONG XHInqTarget2 ( UWORD major, UWORD minor, ULONG *blocksize, +ULONG *device_flags, BYTE *product_name, UWORD stringlen ); +
  +
Beschreibung: Liefert Informationen über das durch major und +minor spezifizierte Gerät (in device_flags: ein +Attributvektor, in product_name: optional die +Produktbezeichnung des Geräts). Mit XHReserve () vorgenommene +Reservierungen werden dabei berücksichtigt. +
  +
Die Funktion steht erst ab XHDI-Version 1.01 zur Verfügung. +
  +
Ergebnis: +
  + + + + + + + + + + + + + + + + + + +
Parameter Bedeutung +
    +
block_size Blockgröße auf dem Gerät (für XHReadWrite() sehr wichtig). +Normalerweise 512. +
device_flags (Bit gesetzt -> Fähigkeit verfügbar): + + + + + + + + + + + + + + + + + + + + + +
Bit 0: Gerät kann gestoppt werden (XH_TARGET_STOPPABLE) +
Bit 1: Gerät hat wechselbare Medien (XH_TARGET_REMOVABLE) +
Bit 2: Auswurf des Geräts kann verriegelt werden (XH_TARGET_LOCKABLE) +
Bit 3: Medium kann per Kommando ausgeworfen werden +(XH_TARGET_EJECTABLE) +
Bit 29: Auswurf des Geräts ist vom Treiber blockiert worden +(XH_TARGET_LOCKED, ab XHDI 1.25) +
Bit 30: Gerät ist vom Treiber gestoppt worden (XH_TARGET_STOPPED, ab +XHDI 1.25) +
Bit 31: Geräte ist zur Zeit blockiert (XH_TARGET_RESERVED) + +
+ +
Alle weiteren Bits sind reserviert und sollten vom Treiber auf +Null gesetzt werden. +
product_name Produktbezeichnung des Geräts (max. stringlen Zeichen +inkl. Leerzeichen). Falls die Information nicht verfügbar ist, wird +eine Zeichenkette der Länge Null zurückgeliefert. +
stringlen Länge der product_name übergebenen Zeichenkette. + +
+ + + + +
Anmerkung: für blocksize, device_flags und product_name dürfen auch +Nullzeiger übergeben werden. Produktbezeichnungen von IDE-Geräten +können bis zu 40 Zeichen lang sein. + +
+ +
Gruppe: XHDI-Funktionen +
  +
Querverweis: Arbitration   _drvbits   Partitiontypen   Systemvariablen   XHDI-Cookie   +XHDI-Funktionen   XHDI-Terminologie +
  + +
+ +

H.5.13 XHInqDev2

+ + + + + + + + + + + + + + + + + + + + + +
Name: »XHInqDev2« - Major, Minor Device Number, Startsektor und +Bios-Parameter-Block (BPB) eines Geräts erfragen +
  +
Opcode: 12 +
  +
Deklaration: LONG XHInqDev2 ( UWORD bios_device, UWORD *major, UWORD *minor, +ULONG *start_sector, BPB *bpb, ULONG *blocks, BYTE *partid ); +
  +
Beschreibung: Liefert Major Device Number, Minor Device Number, Startsektor, +BPB (im Gegensatz zu Getbpb() wird dadurch der Media-Change-Status +des Geräts NICHT zurückgesetzt), Länge und Partitionkennung +(maximal drei Zeichen zzgl. terminierender Null) eines BIOS-Geräts. +
  +
Anmerkung: es wird ein Zeiger auf eine vom Aufrufer +bereitgestellte BPB-Struktur übergeben, die vom XHDI-Treiber +gefüllt wird. +
  +
Die Funktion steht erst ab XHDI-Version 1.10 zur Verfügung. +
  +
Ergebnis: E_OK, EDRVNR (Gerät kann zur Zeit nicht angesprochen werden, +zum Beispiel Medium nicht eingelegt), EDRIVE (falsche Gerätenummer) +oder eine andere Fehlernummer. Bei EDRVNR darf man sich darauf +verlassen, daß major und minor korrekt zurückgeliefert werden. +
  +
Ein start_sector mit Wert $FFFFFFFF soll auf eine Partition +hinweisen, die zur Zeit vom Treiber nicht bedient wird (zum Beispiel, +wenn ein Wechselmedium mit 'zu wenig' Partitionen eingelegt ist). +
  +
Der zurückgelieferte BPB ist ungültig, wenn das Element +recsiz Null ist. +
  +
Wenn die Partitionkennung nicht verfügbar ist (keine +Atari-Partitionierung oder überhaupt keine Partitionierung, +beispielsweise bei normal formatierten Disketten in +SCSI-Diskettenlaufwerken), wird als Partitionkennung eine leere +Zeichenkette zurückgegeben. +
  +
Bei MSDOS-kompatibel partitionierten Medien wird ab +XHDI-Version 1.20 die ein Byte lange Partitionkennung wie folgt in +partid abgelegt: partid[0] = '\0' (Nullbyte), partid[1] = 'D' (für +DOS), partid[2] = Kennung. +
  +
Hinweis: ein Dateisystem ist durch major- und minor- +Gerätenummer sowie Startsektor (mit der obigen Einschränkung) exakt +spezifiziert. Über die Art des Dateisystems (FAT oder etwas anderes) +ist damit nichts ausgesagt! +
  + + + +
Anmerkung: für major, minor, start_sector, bpb, blocks und partid dürfen +auch Nullzeiger übergeben werden. + +
+ +
Gruppe: XHDI-Funktionen +
  +
Querverweis: Arbitration   _drvbits   Partitiontypen   Systemvariablen   XHDI-Cookie   +XHDI-Funktionen   XHDI-Terminologie +
  + +
+ +

H.5.14 XHDriverSpecial

+ + + + + + + + + + + + + + + + + + + + + +
Name: »XHDriverSpecial« - treiberspezifische Erweiterungen nutzen +
  +
Opcode: 13 +
  +
Deklaration: LONG XHDriverSpecial ( ULONG key1, ULONG key2, UWORD subopcode, +VOID *data ); +
  +
Beschreibung: Dieser Opcode kann für treiberspezifische Erweiterungen +benutzt werden. Auf welche Art und Weise die Daten in +subopcode und data interpretiert werden, hängt +ausschließlich vom betroffenen Treiber ab. key1 und +key2 dienen zur Identifikation des anzusprechenden Treibers: +
  +
key1 sollte dabei aus vier druckbaren ASCII-Zeichen bestehen, key2 aus +einem möglichst willkürlich gewählten Longwert (etwa dem Datum der +Definition im BCD-Format). +
  +
Achtung: Diese Funktion ist optional, daher darf ein +Aufruf mit EINVFN beantwortet werden. +
  +
Ergebnis: XHDI-Fehlercodes +
  +
Gruppe: XHDI-Funktionen +
  +
Querverweis: Arbitration   _drvbits   Partitiontypen   Systemvariablen   XHDI-Cookie   +XHDI-Funktionen   XHDI-Terminologie +
  + +
+ +

H.5.15 XHGetCapacity

+ + + + + + + + + + + + + + + + + + + + + +
Name: »XHGetCapacity« - Anzahl der adressierbaren Sektoren und +deren Größe ermitteln +
  +
Opcode: 14 +
  +
Deklaration: LONG XHGetCapacity ( UWORD major, UWORD minor, ULONG *blocks, +ULONG *blocksize ); +
  +
Beschreibung: Diese Funktion liefert in blocks die Anzahl der +adressierbaren Sektoren auf dem Medium und in blocksize ihre +Größe zurück (Vorsicht: je nach verwendeter Hardware kann die +Ausführung dieser Funktion mehrere Sekunden dauern!). +
  +
Achtung: Diese Funktion ist optional, daher darf ein +Aufruf mit EINVFN beantwortet werden. +
  +
Ergebnis: XHDI-Fehlercodes +
  +
Gruppe: XHDI-Funktionen +
  +
Querverweis: Arbitration   _drvbits   Partitiontypen   Systemvariablen   XHDI-Cookie   +XHDI-Funktionen   XHDI-Terminologie +
  + +
+ +

H.5.16 XHMediumChanged

+ + + + + + + + + + + + + + + + + + + + + +
Name: »XHMediumChanged« - Treiber über Mediumwechsel informieren +
  +
Opcode: 15 +
  +
Deklaration: LONG XHMediumChanged ( UWORD major, UWORD minor ); +
  +
Beschreibung: Diese Funktion informiert den Treiber darüber, daß das Medium +in dem angegebenen Gerät gewechselt worden ist. Der Treiber sollte +daraufhin so vorgehen, als habe das Gerät selbst einen Medienwechsel +gemeldet. +
  +
Achtung: Diese Funktion ist optional, daher darf ein +Aufruf mit EINVFN beantwortet werden. +
  +
Ergebnis: OK wird nur dann zurückgeliefert, wenn die Information richtig +verarbeitet wurde (also alle logischen Laufwerke auf dem Gerät +entweder deaktiviert sind oder benutzt werden können). +
  +
Gruppe: XHDI-Funktionen +
  +
Querverweis: Arbitration   _drvbits   Partitiontypen   Systemvariablen   XHDI-Cookie   +XHDI-Funktionen   XHDI-Terminologie +
  + +
+ +

H.5.17 XHMiNTInfo

+ + + + + + + + + + + + + + + + + + + + + +
Name: »XHMiNTInfo« - MiNT spezifische Informationen setzen bzw. +abfragen +
  +
Opcode: 16 +
  +
Deklaration: LONG XHMiNTInfo ( UWORD opcode, VOID *data ); +
  +
Beschreibung: Diese Funktion setzt MiNT-spezifische Informationen bzw. fragt +diese ab. +
  +
Folgende Opcodes sind definiert (unbekannte Opcodes werden mit +EINVFN quittiert, E_OK wird genau dann zurückgeliefert, wenn die +verlangte Funktion korrekt ausgeführt werden konnte): +
  + +
XH_MI_SETKERINFO (0) [struct kerinfo *data] +
  +
Übermittelt in data dem Treiber einen Zeiger auf die +MiNT-Kernel-Info-Struktur. Der Treiber kann diese benutzen, um +beispielsweise direkt Kernelfunktionen aufzurufen. +
  + +
XH_MI_GETKERINFO (1) [struct kerinfo **data] +
  +
Erfragt beim Treiber die eventuell schon bekannte Adresse der +MiNT-Kernel-Info-Struktur. Der Zeiger auf die Struktur wird in die in +data angegebene Adresse geschrieben (wenn kein Treiber bekannt +ist, wird ein Nullzeiger zurückgeliefert). +
  +
Achtung: Diese Funktion ist optional, daher darf ein +Aufruf mit EINVFN beantwortet werden. +
  +
Ergebnis: XHDI-Fehlercodes +
  +
Gruppe: XHDI-Funktionen +
  +
Querverweis: Arbitration   _drvbits   Partitiontypen   Systemvariablen   XHDI-Cookie   +XHDI-Funktionen   XHDI-Terminologie +
  + +
+ +

H.5.18 XHDOSLimits

+ + + + + + + + + + + + + + + + + + + + + +
Name: »XHDOSLimits« - interne Limits von DOS erfragen/setzen +
  +
Opcode: 17 +
  +
Deklaration: LONG XHDOSLimits ( UWORD which, ULONG limit ); +
  +
Beschreibung: Diese Funktion erfragt beim Treiber die interne Limits des +laufenden DOS bzw. setzt sie. Sie kann zum Beispiel von einem +FAT-Dateisystemtreiber benutzt werden, um den Harddisktreiber +mitzuteilen, daß sich einige Limits geändert haben. which +gibt an, welches Limit erfragt wird, limit gibt den neuen Wert +an (Null steht für: nicht ändern). +
  +
Ab XHDI-Version 1.30 muß ein XHDI-Treiber bei seiner +Initialisierung versuchen, die Limits von einem vorhandenen Treiber zu +übernehmen. Wird während des Betriebs ein Limit gesetzt, dann muß +der Aufruf anschließend an andere Treiber weitergereicht werden. +
  + + + + + + + + + +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
whichBedeutung
XH_DL_SECSIZ (0)maximale Sektorgröße auf BIOS-Ebene
XH_DL_MINFAT (1)minimale Anzahl von FATs
XH_DL_MAXFAT (2)maximale Anzahl von FATs
XH_DL_MINSPC (3)Sektoren/Cluster minimal
XH_DL_MAXSPC (4)Sektoren/Cluster maximal
XH_DL_CLUSTS (5)maximale Clusterzahl einer 16-Bit-FAT
XH_DL_MAXSEC (6)maximale Zahl von Sektoren
XH_DL_DRIVES (7)maximale Zahl der vom DOS unterstützen BIOS-Laufwerke
XH_DL_CLSIZB (8)maximale Clustergröße
+
+ +
- Ab XHDI-Version 1.30 - +
  + + + + + + + + + + + + + + + + +
XH_DL_RDLEN (9) max. (bpb->rdlen * bpb->recsiz / 32) +
XH_DL_CLUSTS12 (12) maximale Clusterzahl einer 12-Bit-FAT +
XH_DL_CLUSTS32 (13) maximale Clusterzahl einer 32-Bit-FAT +
XH_DL_BFLAGS (14) unterstützte Bits in bpb->bflags + +
+ +
Achtung: Diese Funktion ist optional, daher darf ein +Aufruf mit EINVFN beantwortet werden. +
  +
Ergebnis: Die Funktion liefert den Wert des bisherigen Limits. +
  +
Gruppe: XHDI-Funktionen +
  +
Querverweis: Arbitration   _drvbits   Partitiontypen   Systemvariablen   XHDI-Cookie   +XHDI-Funktionen   XHDI-Terminologie +
  + +
+ +

H.5.19 XHLastAccess

+ + + + + + + + + + + + + + + + + + + + + +
Name: »XHLastAccess« - Anzahl der Millisekunden seit dem letzten +Zugriff ermitteln +
  +
Opcode: 18 +
  +
Deklaration: LONG XHLastAccess ( UWORD major, UWORD minor, ULONG *ms ); +
  +
Beschreibung: Liefert in ms zurück, wieviele Millisekunden seit dem +letzten erfolgreichen Lese- oder Schreibzugriff auf das Gerät +vergangen sind. +
  +
Diese Funktion steht erst ab XHDI-Version 1.25 zur Verfügung. +
  +
Ergebnis: XHDI-Fehlercodes +
  +
Gruppe: XHDI-Funktionen +
  +
Querverweis: Arbitration   _drvbits   Partitiontypen   Systemvariablen   XHDI-Cookie   +XHDI-Funktionen   XHDI-Terminologie +
  + +
+ +

H.5.20 XHReaccess

+ + + + + + + + + + + + + + + + + + + + + +
Name: »XHReaccess« - Gerät auf Mediachange überprüfen +
  +
Opcode: 19 +
  +
Deklaration: LONG XHReaccess ( UWORD major, UWORD minor ); +
  +
Beschreibung: Ein Aufruf dieser Funktion veranlaßt den Treiber, das +angegebene Gerät auf einen Mediachange zu überprüfen und +gegebenenfalls die Partitioninformationen entsprechend zu +aktualisieren. Die Funktion entspricht im wesentlichen +XHMediumChanged(), nur daß der Treiber selbst das Gerät befragt, ob +ein Medienwechsel stattgefunden hat. +
  +
Diese Funktion steht erst ab XHDI-Version 1.25 zur Verfügung. +
  +
Ergebnis: XHDI-Fehlercodes +
  +
Gruppe: XHDI-Funktionen +
  +
Querverweis: Arbitration   _drvbits   Partitiontypen   Systemvariablen   XHDI-Cookie   +XHDI-Funktionen   XHDI-Terminologie +
  + +
+ +
+ +Home +XHDI - eXtended HardDisk Interface (Version 1.30)XHDI - eXtended HardDisk Interface (Version 1.30) +Empfohlene PartitiontypenEmpfohlene Partitiontypen +TypdefinitionenTypdefinitionen + + diff --git a/de/xhdi_partition_types.html b/de/xhdi_partition_types.html new file mode 100644 index 000000000..e1a4d032b --- /dev/null +++ b/de/xhdi_partition_types.html @@ -0,0 +1,143 @@ + + + + + +Die Anleitung zum TOS: Empfohlene Partitiontypen + + + + + + + + + +Home +XHDI - eXtended HardDisk Interface (Version 1.30)XHDI - eXtended HardDisk Interface (Version 1.30) +ArbitrationArbitration +XHDI-FunktionenXHDI-Funktionen + +
+ +

H.4 Empfohlene Partitiontypen

+ + +
+ + + + + + + + + + + + + + + + +
TypBedeutung
BGMGEMDOS-Partition > 16 MB
GEMGEMDOS-Partition < 16 MB
RAWPartitiontyp-RAW
+
+ +

Folgende Typen können optional unterstützt (zum Beispiel +anhand einer konfigurierbaren Liste von Kennungen) werden. +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypBedeutung
F32TOS-kompatible FAT32-Partition
LNXLinux-Ext2-Partition, sollte ggfs. wie RAW behandelt werden
MACMac-HFS-Partition, sollte ggfs wie RAW behandelt werden.
MIXMinix-Partition, sollte ggfs wie RAW behandelt werden.
QWAQDOS-Partition, sollte ggfs wie RAW behandelt werden.
SWPSwap-Partition, sollte ggfs wie RAW behandelt werden.
UNXASV (Atari Systen V R4), sollte ggfs wie RAW behandelt werden.
+
+ +

Querverweis: XHDI-Spezifikation   GEMDOS   BIOS +

+

H.4.1 Partitiontyp RAW

+

XHDI-1.10-kompatible Treiber müssen zusätzlich zu GEM und +BGM den dritten Partitiontyp RAW unterstützen. Für Partitionen +dieses Typs müssen folgende Eigenschaften unterstützt werden: +

+ + + + + + + + + + + + +
(1) Die Partitionlänge ist beliebig (im Rahmen der +32-Bit-Sektornummern). +
  +
(2) Die Partition ist als BIOS-Gerät ansprechbar; Getbpb() +liefert einen Nullzeiger (damit GEMDOS keinen Zugriff versucht, +zusätzlich wird auch der Media-Change-Status für das BIOS-Gerät +zurückgesetzt). +
  +
(3) Es kann per Rwabs() (nicht nur im physikalischen Modus) und +XHReadWrite() auf die Partition zugegriffen werden. Dabei wird die +physikalische Blockgröße des Mediums benutzt (siehe XHInqTarget()). +
  +
(4) XHInqDev2() liefert im Gegensatz zu XHInqDev() auch die Länge und +den Typ der Partition zurück. +
  + +
+ +

Diese Erweiterungen sollen die Programmierung zuverlässiger +Filesystemtreiber für MiNT (siehe zum Beispiel das Minix-FS) +erleichtern. +

+

Querverweis: XHDI-Spezifikation   GEMDOS   BIOS +

+
+ +Home +XHDI - eXtended HardDisk Interface (Version 1.30)XHDI - eXtended HardDisk Interface (Version 1.30) +ArbitrationArbitration +XHDI-FunktionenXHDI-Funktionen + + diff --git a/de/xhdi_terminology.html b/de/xhdi_terminology.html new file mode 100644 index 000000000..d38485e09 --- /dev/null +++ b/de/xhdi_terminology.html @@ -0,0 +1,105 @@ + + + + + +Die Anleitung zum TOS: XHDI-Terminologie + + + + + + + + + +Home +XHDI - eXtended HardDisk Interface (Version 1.30)XHDI - eXtended HardDisk Interface (Version 1.30) +XHDI-CookieXHDI-Cookie +ArbitrationArbitration + +
+ +

H.2 XHDI-Terminologie

+

Folgende Datentypen seien vereinbart: +

+
UWORD:  16 Bit, unsigned
+LONG:   32 Bit, signed
+ULONG:  32 Bit, unsigned
+char *: 32 Bit, Zeiger auf eine nullterminierte Zeichenkette
+
+ + + + + + + + + + +
major: Major Device Number +
  + + + + + + + + + + + + + + + + + + + + + + + + +
0..7: Platten am ACSI-Bus mit Atari-kompatiblen Befehlssatz +
8..15: Platten am SCSI-Bus +
16..17: Platten an der primären IDE-Schnittstelle +
18..19: Platten an der sekundären IDE-Schnittstelle +
20..23: Weitere IDE-Platten +
24..63: Erweiterungen lt. PUN_INFO-Struktur (Feld: pun[]) +
64: Gerät am Floppycontroller +
65..255: weitere eigene Erweiterungen jenseits dem, was AHDI abdeckt + +
+ + +
minor: Minor Device Number (für 'major' 0..15: LUN des ACSI- oder +SCSI-Geräts), maximal 255. +
  +
key: Entweder ein 16-Bit-Schlüssel, ermittelt von XHReserve(), oder +0, wenn das Gerät nicht reserviert wurde oder der Schlüssel nicht +bekannt ist. +
  + +
+ +

Notation: +

+

Numerische Werte sind, wenn nicht anders angegeben, dezimal +dargestellt. Hexadezimale Angaben (Basis 16) sind durch ein +Dollarzeichen (`$') markiert. +

+

Querverweis: XHDI-Spezifikation   GEMDOS   BIOS   SCSI-Spezifikation +

+
+ +Home +XHDI - eXtended HardDisk Interface (Version 1.30)XHDI - eXtended HardDisk Interface (Version 1.30) +XHDI-CookieXHDI-Cookie +ArbitrationArbitration + + diff --git a/de/xshl.html b/de/xshl.html new file mode 100644 index 000000000..57f4bf385 --- /dev/null +++ b/de/xshl.html @@ -0,0 +1,285 @@ + + + + + +Die Anleitung zum TOS: Erweiterte Shellfunktionen + + + + + + + + + +Home +AESAES +Erweiterte GrafikfunktionenErweiterte Grafikfunktionen +ZeichensatzauswahlZeichensatzauswahl + +
+ +

8.24 Erweiterte Shellfunktionen

+

Diese Bibliothek enthält spezielle Funktionen, welche nur unter +FreeGEM zur Verfügung stehen. +

+ + + + + + +
xshl_getshell Gets the name of the desktop +
xshl_setshell Sets the name of the desktop + +
+ +

Querverweis: AES +

+

8.24.1 xshl_getshell

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Shell get« - Get the name of the desktop program to use. +
  +
AES-Nummer: 1030 +
  +
Deklaration: int16_t xshel_getshell ( int8_t *shell ); +
  +
Beschreibung: The call xshl_getshell serves to get the name of the desktop +program. shell specifies the buffer to receive the shell +filename. +
  +
Verfügbar: This call is a compile-time option in recent FreeGEM versions. +To check for this feature, use appl_init(xbuf) and check that bit 4 of +xbuf.abilities is set (ABLE_XSHL). +
  +
Gruppe: Erweiterte Shellfunktionen +
  +
Querverweis: Binding   xshl_setshell +
  + +
+ +

8.24.1.1 Bindings für xshl_getshell

+ + + + + + + + + +
C: int16_t xshl_getshell ( int8_t *shell ); +
  +
Umsetzung: +
  +
int16_t xshl_getshell (int8_t *shell )
+{
+   addr_in[0] = shell;
+
+   return ( crys_if(1030) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]1030 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]shell
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.24.2 xshl_setshell

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Shell set« - Set the name of the desktop program to use. +
  +
AES-Nummer: 1031 +
  +
Deklaration: int16_t xshel_setshell ( int8_t *shell ); +
  +
Beschreibung: The call xshl_setshell serves to set the name of the desktop +program. shell specifies the name of the shell (no path, it +must always be in \GEMAPPS\GEMSYS). +
  +
Note: A normal GEM program is not suitable for use as a +shell, since when it terminates it will be immediately re-run. +
  +
Ergebnis: This function returns 0 if the desktop program was set, or 1 if +the name was too long (more than 15 characters). +
  +
Verfügbar: This call is a compile-time option in recent FreeGEM versions. +To check for this feature, use appl_init(xbuf) and check that bit 4 of +xbuf.abilities is set (ABLE_XSHL). +
  +
Gruppe: Erweiterte Shellfunktionen +
  +
Querverweis: Binding   xshl_getshell +
  + +
+ +

8.24.2.1 Bindings für xshl_setshell

+ + + + + + + + + +
C: int16_t xshl_setshell ( int8_t *shell ); +
  +
Umsetzung: +
  +
int16_t xshl_setshell (int8_t *shell )
+{
+   addr_in[0] = shell;
+
+   return ( crys_if(1031) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdresseFeldelementBelegung
controlcontrol[0]1031 # Opcode der Funktion
control+2control[1]0 # Einträge in int_in
control+4control[2]1 # Einträge in int_out
control+6control[3]1 # Einträge in addr_in
control+8control[4]0 # Einträge in addr_out
addr_inaddr_in[0]shell
int_outint_out[0]Return-Wert
+
+ + +
+ +
+ +Home +AESAES +Erweiterte GrafikfunktionenErweiterte Grafikfunktionen +ZeichensatzauswahlZeichensatzauswahl + + diff --git a/en/AESVARS.html b/en/AESVARS.html new file mode 100644 index 000000000..bbbcc4cf3 --- /dev/null +++ b/en/AESVARS.html @@ -0,0 +1,61 @@ + + + + + +The documentation for TOS: AESVARS + + + + + + + + + +Home +Type definitionsType definitions +Type definitionsType definitions +Archive header (ARHEADER)Archive header (ARHEADER) + +
+ +

I.1 AESVARS

+
typedef struct
+{
+     int32_t magic;                 /* Has to be 0x87654321       */
+     void *membot;                  /* End of the AES variables   */
+     void *aes_start;               /* Start address              */
+     int32_t magic2;                /* Is 'MAGX' or 'KAOS'        */
+     int32_t date;                  /* Creation date              */
+     void (*chgres)(int16_t res, int16_t txt);  /* Change resolution */
+     int32_t (**shel_vector)(void); /* Resident desktop           */
+     int8_t *aes_bootdrv;           /* Booting will be from here  */
+     int16_t *vdi_device;           /* Driver used by AES         */
+     void *reservd1;                /* Reserved                   */
+     void *reservd2;                /* Reserved                   */
+     void *reservd3;                /* Reserved                   */
+     int16_t version;               /* Version (0x0201 is V2.1)   */
+     int16_t release;               /* 0=alpha..3=release         */
+} AESVARS;
+
+

Note: These variables are READ-ONLY! +

+

The first three variables are also present under TOS, and can +be obtained there from the operating system header. The +vdi_device component is superfluous as of MagiC 2.0 as one +gets the device number in a MultiTOS-compatible way with appl_getinfo +(opcode 2). The routine for changing the resolution (chgres) +expects in register d2 an optional Falcon-mode (as int16_t). +

+

See also: MagiC's cookie   DOMagixAESVars +

+
+ +Home +Type definitionsType definitions +Type definitionsType definitions +Archive header (ARHEADER)Archive header (ARHEADER) + + diff --git a/en/ARHEADER.html b/en/ARHEADER.html new file mode 100644 index 000000000..7392723b5 --- /dev/null +++ b/en/ARHEADER.html @@ -0,0 +1,52 @@ + + + + + +The documentation for TOS: Archive header (ARHEADER) + + + + + + + + + +Home +Type definitionsType definitions +AESVARSAESVARS +Buffer Control Block (BCB)Buffer Control Block (BCB) + +
+ +

I.2 Archive header (ARHEADER)

+ +
typedef struct
+{
+  int8_t  a_fname[14];  /* Filename                  */
+  int32_t a_modti;      /* Time of last access       */
+  int8_t  a_userid;     /* Unused                    */
+  int8_t  a_gid;        /* Unused                    */
+  int16_t a_fimode;     /* File mode                 */
+  int32_t a_fsize;      /* File length               */
+  int16_t reserved;     /* Reserved                  */
+} ARHEADER;
+
+

Note: An archive file in Digital Research format +consists of a file- header, any number of files (each prefaced with an +ARHEADER structure) as well as an end-identifier. The file-header here +consists only of the WORD 0xff65, the end of the archive file is +identified by the value 0x0000. +

+

See also: OHEADER +

+
+ +Home +Type definitionsType definitions +AESVARSAESVARS +Buffer Control Block (BCB)Buffer Control Block (BCB) + + diff --git a/en/About_the_BIOS.html b/en/About_the_BIOS.html new file mode 100644 index 000000000..95056a483 --- /dev/null +++ b/en/About_the_BIOS.html @@ -0,0 +1,1335 @@ + + + + + +The documentation for TOS: About the BIOS + + + + + + + + + +Home +BIOSBIOS +BIOSBIOS +The input/output channels of the BIOSThe input/output channels of the BIOS + +
+ +

3.1 About the BIOS

+ +

The BIOS (BasicInput/Output +System) functions represent the lowest level interface between +the Atari's operating system and hardware, and are called via the +680X0 Trap #13. Preferably, these functions should not be used by +application programs, as substantially more powerful functions on a +higher level are available to provide better alternatives. Altogether +the following functions are available: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Bconin Read a character from a device +
Bconout Send a character to a peripheral unit +
Bconstat Get input status of a peripheral unit +
Bcostat Get status of a standard output device +
Drvmap Get information about attached devices +
Getbpb Get address to the bios parameter block of a unit +
Getmpb Speicherparameterblock ermitteln. +
Kbshift Fetch/set status of the shift keys +
Mediach Ask if the media has been changed +
Rwabs Direct read/write operation on a unit +
Setexc Set an get interrupt vector +
Tickcal Get time difference between two timer calls + +
+ +

The BIOS is reentrant in MagiC. This means that these +functions can be also called up repeatedly from interrupts (as long as +the relevant supervisor stack does not overflow...). +

+

Note: +

+
    +
  • The <saveptr_area> of the BIOS is still present (for +reasons of compatibility), but it is not used by the system. +
      +

  • +
  • The stack checks of Turbo C/Pure-C will fail for routines that +are executed in supervisor-mode (under TOS this could happen until +now only for USERDEF routines in the AES, that are also executed in +supervisor-mode). +
      +

  • +
+ +

If you hook your own routines into the BIOS, then make sure +that you construct them to be fully reentrant. Make no assumptions +about the contents of the <saveptr_area>! +

+ + +

The BIOS receives its parameters from the stack; for this the +last argument from the parameter list is stored as the first on the +stack. Function results are returned in the processor register d0. +Only registers d3-d7 and a3-a7 are saved, all others may be altered by +the call. +

+

See also: GEMDOS   XBIOS   Reset vector   VT-52 terminal +

+

3.1.1 bios-trap

+ + + + + + + + + + + + + + + + +
Name: »Bios« - Execute bios-trap +
  +
Syntax: LONG bios ( VOID, ... ); +
  +
Description: The routine bios executes a TRAP #13 exception. The parameters +passed depend on the particular BIOS function in each case. +
  +
Return value: The function returns a value of the data type LONG. +
  +
See also: gemdos   xbios   BIOS   Dispatcher +
  + +
+ +

3.1.2 Bconin

+ + + + + + + + + + + + + + + + + + + + + +
Name: Bios console input +
  +
Opcode: 2 +
  +
Syntax: int32_t Bconin ( int16_t dev ); +
  +
Description: The BIOS routine Bconin reads in a character from a +peripheral device. The following devices can be specified for +dev: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
devMeaning
0prn: (Printer/Parallel port)
1aux: (aux device, the RS-232 port)
2con: (Console)
3MIDI port
4Keyboard port
5Screen
6ST compatible RS232 port (Modem 1)
7SCC channel B (Modem 2)
8TTMFP serial port (Modem 3)
9SCC channel A (Modem 4)
+
+ +
Note that the device numbers from 6 up are only available from +the TOS030 of the Atari-TT. A wrong declaration for dev can +lead to a system crash. +
  +
Return value: The function returns the read-in character as an ASCII value in +the bits 0..7. When reading from the console, the bits 16 to 23 +contain the scan-code of the relevant key. If, in addition, the +corresponding bit of the system variable conterm is set, then the bits +24 to 31 contain the current value of Kbshift. +
  +
Availability: All TOS versions. +
  +
See also: Binding   Bconout   Keytbl   Bconmap +
  + +
+ +

3.1.2.1 Bindings for Bconin

+ + + + + + +
C: int32_t Bconin ( int16_t dev ); +
  +
Assembler: +
  +
move.w    dev,-(sp)    ; Offset 2
+move.w    #2,-(sp)     ; Offset 0
+trap      #13          ; Call BIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

3.1.3 Bconout

+ + + + + + + + + + + + + + + + + + + + + +
Name: Bios console output +
  +
Opcode: 3 +
  +
Syntax: VOID Bconout ( int16_t dev, int16_t c ); +
  +
Description: The BIOS routine Bconout writes the character c to +the peripheral device dev. The following devices can be specified for +dev: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
devMeaning
0prn: (Printer/Parallel port)
1aux: (Aux device, the RS-232 port)
2con: (Console, VT-52 terminal)
3MIDI port
4Keyboard port
5Screen
6ST compatible RS-232 port (Modem 1)
7SCC channel B (Modem 2)
8TTMFP serial port (Modem 3)
9SCC channel A (Modem 4)
+
+ +
Note that the device numbers from 6 up are only available from +the TOS030 of the Atari-TT. +
  +
Note: The function only returns when the character has +actually been output by the relevant device. A wrong declaration for +dev can lead to a system crash. All codes from 0x00 to 0xFF +for the character c are interpreted as printable characters. +Output via (5) is, incidentally, faster than via (2), as the VT-52 +sequences do not have to be evaluated. +
  +
Return value: The function does not return a result. +
  +
Availability: All TOS versions. +
  +
See also: Binding   Bconin   Bconstat   Bconmap +
  + +
+ +

3.1.3.1 Bindings for Bconout

+ + + + + + +
C: VOID Bconout ( int16_t dev, int16_t c ); +
  +
Assembler: +
  +
move.w    c,-(sp)      ; Offset 4
+move.w    dev,-(sp)    ; Offset 2
+move.w    #3,-(sp)     ; Offset 0
+trap      #13          ; Call BIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

3.1.4 Bconstat

+ + + + + + + + + + + + + + + + + + + + + +
Name: Bios console status +
  +
Opcode: 1 +
  +
Syntax: int16_t Bconstat ( int16_t dev ); +
  +
Description: The BIOS routine Bconstat establishes the input status of a +standard peripheral device dev. The following devices can be specified +for dev: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
devMeaning
0prn: (Printer/Parallel port)
1aux: (Aux device, the RS-232 port)
2con: (Console)
3MIDI port
4Keyboard port
5Screen
6ST compatible RS-232 port (Modem 1)
7SCC channel B (Modem 2)
8TTMFP serial port (Modem 3)
9SCC channel A (Modem 4)
+
+ +
Note that the device numbers from 6 up are only available from +the TOS030 of the Atari-TT. A wrong declaration for dev can +lead to a system crash. +
  +
Return value: The function returns -1 when there are characters waiting in +the buffer, and 0 if this is not the case. +
  +
Availability: All TOS versions. +
  +
See also: Binding   Bconin   Bconout   Bconmap +
  + +
+ +

3.1.4.1 Bindings for Bconstat

+ + + + + + +
C: int16_t Bconstat ( int16_t dev ); +
  +
Assembler: +
  +
move.w    dev,-(sp)    ; Offset 2
+move.w    #1,-(sp)     ; Offset 0
+trap      #13          ; Call BIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

3.1.5 Bcostat

+ + + + + + + + + + + + + + + + + + + + + +
Name: Bios output status +
  +
Opcode: 8 +
  +
Syntax: int32_t Bcostat ( int16_t dev ); +
  +
Description: The BIOS routine Bcostat establishes the status of a standard +output device dev. The following devices can be specified for +dev on the Atari: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
devMeaning
0prn: (Printer/Parallel port)
1aux: (Aux device, the RS-232 port)
2con: (Console)
3Keyboard port
4MIDI port
5Screen
6ST compatible RS-232 port (Modem 1)
7SCC channel B (Modem 2)
8TTMFP serial port (Modem 3)
9SCC channel A (Modem 4)
+
+ +
Note that the device numbers from 6 up are only available from +the TOS030 of the Atari-TT. +
  +
Note: According to Atari, the swap between the MIDI port (4) +and the intelligent keyboard (3) compared to other BIOS functions +has been retained from a bug in TOS 1.0 for reasons of +compatibility. +
  +
Return value: The function returns the status of the output device, namely -1 +if characters could be written, and 0 if the buffer is full. +
  +
Availability: All TOS versions. +
  +
See also: Binding   Bconout   Bconmap +
  + +
+ +

3.1.5.1 Bindings for Bcostat

+ + + + + + +
C: int32_t Bcostat ( int16_t dev ); +
  +
Assembler: +
  +
move.w    dev,-(sp)    ; Offset 2
+move.w    #8,-(sp)     ; Offset 0
+trap      #13          ; Call BIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

3.1.6 Drvmap

+ + + + + + + + + + + + + + + + + + + + + +
Name: drive map +
  +
Opcode: 10 +
  +
Syntax: int32_t Drvmap ( VOID ); +
  +
Description: The BIOS routine Drvmap establishes the mounted drives. For +each mounted drive one bit is set. Valid are: +
  + + + + + + +
Bit 0: Drive A +
Bit 1: Drive B etc. (max 32 devices possible) + +
+ +
Note: The function returns the contents of the system +variable _drvbits. To determine which drives are recognized by GEMDOS, +you have to use the function Dsetdrv. +
  +
Return value: The function returns a bit-vector for the connected (mounted) +drives. +
  +
Availability: All TOS versions. +
  +
See also: Binding   Dsetdrv +
  + +
+ +

3.1.6.1 Bindings for Drvmap

+ + + + + + + + + +
C: int32_t Drvmap ( VOID ); +
  +
Assembler: +
  +
move.w    #$A,-(sp)     ; Offset 0
+trap      #13           ; Call BIOS
+addq.l    #2,sp         ; Correct stack
+
+
GFA-Basic: Fehler%=Bios(10) +
  + +
+ +

3.1.7 Getbpb

+ + + + + + + + + + + + + + + + + + + + + +
Name: Get Bios parameter block +
  +
Opcode: 7 +
  +
Syntax: BPB *Getbpb ( int16_t dev ); +
  +
Description: The BIOS routine Getbpb establishes the BIOS parameter +block of the device dev, which is coded as follows: +
  +

+
+ + + + + + + + + + + + + + + + +
devMeaning
0Drive A
1Drive B
2Drive C
+
+ +
Any further drives follow in a similar way. By calling this +function the media-change status in the BIOS is reset. +
  +
Return value: The function returns the address of the BIOS parameter block. +
  +
Availability: All TOS versions. +
  +
See also: Binding   Getmpb +
  + +
+ +

3.1.7.1 Bindings for Getbpb

+ + + + + + + + + +
C: BPB *Getbpb ( int16_t dev ); +
  +
Assembler: +
  +
move.w    dev,-(sp)    ; Offset 2
+move.w    #7,-(sp)     ; Offset 0
+trap      #13          ; Call BIOS
+addq.l    #4,sp        ; Correct stack
+
+
GFA-Basic: Fehler%=Bios(7,W:dev%) +
  + +
+ +

3.1.8 Getmpb

+ + + + + + + + + + + + + + + + + + + + + +
Name: Get memory parameter block +
  +
Opcode: 0 +
  +
Syntax: VOID Getmpb ( MPB *ptr ); +
  +
Description: The BIOS routine Getmpb serves for initialising the memory +management and is called at bootup by GEMDOS to create the original +TPA. After this, Getmbp may not be used any more. +
  +
Return value: This function does not return a result. +
  +
Availability: All TOS versions. +
  +
See also: Binding   Getbpb   Program launch and TPA +
  + +
+ +

3.1.8.1 Bindings for Getmpb

+ + + + + + +
C: VOID Getmpb ( MPB *ptr ); +
  +
Assembler: +
  +
pea       ptr          ; Offset 2
+move.w    #0,-(sp)     ; Offset 0
+trap      #13          ; Call BIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

3.1.9 Kbshift

+ + + + + + + + + + + + + + + + + + + + + +
Name: Keyboard shift status of the 'special' keys. +
  +
Opcode: 11 +
  +
Syntax: int32_t Kbshift ( int16_t mode ); +
  +
Description: The BIOS routine Kbshift establishes or alters the current +state of the keyboard 'special' keys. If mode is negative, +then only the state is established. If mode is 0 or greater +than 0, then the corresponding status will be set. +
The individual bits are defined as follows: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
BitMeaning
0Right shift key
1Left shift key
2Control key
3ALT key
4Caps-lock
5Right mouse button
6Left mouse button
7Alt Gr since TOS 4.06 (Milan)
+
+ +
Note: The function simply inquires an internal system +variable of the BIOS, whose address can be calculated via _sysbase +if required. +
For TOS 1.0 this system variable is at address 0xE1B. +
  +
Return value: The function returns the set keyboard status. +
  +
Availability: All TOS versions. +
  +
See also: Binding +
  + +
+ +

3.1.10 Bindings for Kbshift

+ + + + + + +
C: int32_t Kbshift ( int16_t mode ); +
  +
Assembler: +
  +
move.w    mode,-(sp)   ; Offset 2
+move.w    #$B,-(sp)    ; Offset 0
+trap      #13          ; Call BIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

3.1.11 Mediach

+ + + + + + + + + + + + + + + + + + + + + +
Name: Media change +
  +
Opcode: 9 +
  +
Syntax: int32_t Mediach ( int16_t dev ); +
  +
Description: The BIOS routine Mediach establishes whether the data-carrier +'medium' on the device dev has been changed since the last +disk operation of the particular drive. Valid are: +
  +

+
+ + + + + + + + + + + + + + + +
dev= 0(Drive A)
 = 1(Drive B)
 = 2(Drive C, similarly for other drives)
+
+ +
Note: One should never assume that a device's medium +cannot be exchanged (removable disk catridge, CD-ROM, floppy drive, +floptical ...). The recognition of a floppy disk change usually only +works reliably if the floppy is not write-protected. In addition one +should note that during formatting a floppy different serial numbers +will be asssigned. +
  +
Return value: The function returns an integer-value with the following +meaning: +
  +

+
+ + + + + + + + + + + + + + + + +
ValueMeaning
0Media definitely has not changed.
1Media might have changed.
2Media definitely has changed.
+
+ +
Availability: All TOS versions. +
  +
See also: Binding   Flopfmt   Protobt +
  + +
+ +

3.1.11.1 Bindings for Mediach

+ + + + + + + + + +
C: int32_t Mediach ( int16_t dev ); +
  +
Assembler: +
  +
move.w    dev,-(sp)    ; Offset 2
+move.w    #9,-(sp)     ; Offset 0
+trap      #13          ; Call BIOS
+addq.l    #4,sp        ; Correct stack
+
+
GFA-Basic: Fehler%=Bios(9,W:dev%) +
  + +
+ +

3.1.12 Rwabs

+ + + + + + + + + + + + + + + + + + + + + +
Name: Read/write absolute +
  +
Opcode: 4 +
  +
Syntax: int32_t Rwabs ( int16_t rwflag, VOID *buff, int16_t cnt, +int16_t recnr, int16_t dev, int32_t lrecno ); +
  +
Description: The BIOS routine Rwabs reads or writes data directly resp. +from or to the drive that was specified with dev. The +parameter rwflag is a bit-vector that specifies the type of +operation. Valid are: +
  + + + + + + + + + + + + + + + +
rwflag-bit Meaning +
  +
0 0 = Read +
1 = Write +
  +
1 0 = Pay regard to media change +
1 = Do not read of affect media-change status +
  +
2 0 = In case of error, start a retry +
1 = Do not start a retry +
For this, a hard disk driver that is compatible with AHDI 3.0 is +required. +
  +
3 0 = Normal mode +
1 = Physical mode (1) +
For this, a hard disk driver that is compatible with AHDI 3.0 is +required. +
  + +
+ +
cnt sectors from buffer buff will be +transferred. In recnr the starting sector on the drive will be +specified. lrecno will be used only if recnr has the +value -1, and an AHDI 3.0-compatible hard disk driver is available. +
  +
Return value: The function returns 0 if the access was successful, otherwise +a negative number. +
  +
Availability: All TOS versions. +
  +
See also: Binding +
  + +
+ +

3.1.12.1 Bindings for Rwabs

+ + + + + + + + + +
C: int32_t Rwabs ( int16_t rwflag, VOID *buff, int16_t cnt, +int16_t recnr, int16_t dev, int32_t lrecno ); +
  +
Assembler: +
  +
move.l    lrecno,-(sp)  ; Offset 14
+move.w    dev,-(sp)     ; Offset 12
+move.w    recnr,-(sp)   ; Offset 10
+move.w    cnt,-(sp)     ; Offset  8
+pea       buff          ; Offset  4
+move.w    rwflag,-(sp)  ; Offset  2
+move.w    #4,-(sp)      ; Offset  0
+trap      #13           ; Call BIOS
+lea       $12(sp),sp    ; Correct stack
+
+
GFA-Basic: +Fehler%=Bios(4,W:rwflag%,L:buff%,W:cnt%,W:recnr%,W:dev%,L:lrecno%) +
  + +
+ +

3.1.13 Setexc

+ + + + + + + + + + + + + + + + + + + + + +
Name: Set exception vector +
  +
Opcode: 5 +
  +
Syntax: int32_t Setexc ( int16_t number, VOID (*vec)() ); +
  +
Description: The BIOS routine Setexc sets or reads the contents of +exception vectors. Valid are: +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
numberNumber of the vector
vecNew address (or -1)
+
+ +
Note: Ifvec is -1L, then the vector's previous +value is returned. +
  +
The number of the exception vector to be set is, by the way, +identical to the address to be set divided by 4. +
  +
Return value: The function returns the previous (or current) value of the +vector. +
  +
Availability: All TOS versions. +
  +
See also: Binding   System Vectors   System variables +
  + +
+ +

3.1.13.1 Bindings for Setexc

+ + + + + + +
C: int32_t Setexc ( int16_t number, VOID (*vec)() ); +
  +
Assembler: +
  +
pea       exchdlr      ; Offset 4
+move.w    number,-(sp) ; Offset 2
+move.w    #5,-(sp)     ; Offset 0
+trap      #13          ; Call BIOS
+addq.l    #8,sp        ; Correct stack
+
+ +
+ +

3.1.14 Tickcal

+ + + + + + + + + + + + + + + + + + + + + +
Name: Tick calculation +
  +
Opcode: 6 +
  +
Syntax: int32_t Tickcal ( void ); +
  +
Description: The BIOS routine Tickcal returns the number of milliseconds +that have elapsed between two calls of the system timer. +
  +
Note: For this the function accesses the _timr_ms system +variable. +
  +
Return value: Number of corresonding milliseconds +
  +
Availability: All TOS versions. +
  +
See also: Binding   System variables +
  + +
+ +

3.1.14.1 Bindings for Tickcal

+ + + + + + +
C: LONG Tickcal ( VOID ); +
  +
Assembler: +
  +
move.w    #6,-(sp)     ; Offset 0
+trap      #13          ; Call BIOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +
+ +Home +BIOSBIOS +BIOSBIOS +The input/output channels of the BIOSThe input/output channels of the BIOS + + diff --git a/en/About_the_VDI.html b/en/About_the_VDI.html new file mode 100644 index 000000000..1fc3da637 --- /dev/null +++ b/en/About_the_VDI.html @@ -0,0 +1,77 @@ + + + + + +The documentation for TOS: About the VDI + + + + + + + + + +Home +VDIVDI +VDIVDI +VDI fundamentalsVDI fundamentals + +
+ +

7.1 About the VDI

+

The VDI (Virtual Device Interface) is +a part of GEM, and can be looked at in the first instance as a +standardized graphics system. From the point of view of the programmer +the VDI can be seen as a very comprehensive device-independent +graphics library whose output format is portable across several +platforms. The VDI can be divided into the following function +groups: +

+ + +

Since the original VDI in Atari's TOS suffers from several +weaknesses and, above all, is not particularly fast, many users have +found NVDI to be the replacement for the normal VDI. +

+

Some functions of the VDI require the GDOS extension that was +meant to be part of the operating system originally, but had to be +offloaded by Atari due to lack of memory space in the ROMs of the +first STs. Hence it (or its later replacements such as FSM-GDOS, +SpeedoGDOS, NVDI, ...) have to be loaded from (floppy or hard) disk. +

+

With consistent use of the VDI routines every programmer can +ensure that their programs will run cleanly on various computer +variants and in almost all resolutions. +

+

See also: VDI fundamentals   Bindings of the VDI   AES +

+
+ +Home +VDIVDI +VDIVDI +VDI fundamentalsVDI fundamentals + + diff --git a/en/BCB.html b/en/BCB.html new file mode 100644 index 000000000..46c1b7ea6 --- /dev/null +++ b/en/BCB.html @@ -0,0 +1,41 @@ + + + + + +The documentation for TOS: Buffer Control Block (BCB) + + + + + + + + + +Home +Type definitionsType definitions +Archive header (ARHEADER)Archive header (ARHEADER) +CPXINFOCPXINFO + +
+ +

I.3 Buffer Control Block (BCB)

+ +
typedef struct _bcb
+{
+  struct _bcb   *b_link;          /* Next BCB              */
+  int16_t       b_negl;           /* Initialize to -1      */
+  int16_t       b_private[5];     /* Unknown               */
+  void          *b_buf;           /* Actual buffer         */
+} BCB;
+
+
+ +Home +Type definitionsType definitions +Archive header (ARHEADER)Archive header (ARHEADER) +CPXINFOCPXINFO + + diff --git a/en/BSIM-BIOS-Extension.html b/en/BSIM-BIOS-Extension.html new file mode 100644 index 000000000..619a14f0d --- /dev/null +++ b/en/BSIM-BIOS-Extension.html @@ -0,0 +1,626 @@ + + + + + +The documentation for TOS: BSIM-BIOS-Extension + + + + + + + + + +Home +BIOSBIOS +XBRA procedureXBRA procedure +BIOS function listBIOS function list + +
+ +

3.10 BSIM-BIOS-Extension

+ +

The basic idea of the Drive-B-Simulator is to read a floppy disk +into memory and operate it as a RAM-disk. The 'write disk' function +writes the RAM-disk back to the disk. A 'swap mode' allows the program +to work with applications that stubbornly access drive A. +

+ + + + + + + + + + + + + + + + + + + + + +
bsim_id Check if BSIM is available +
drv_change Swap drives +
drvprotec Get/set software write-protection for drives +
dstate Get details about the drive +
kill_disk Remove disk from memory +
load_disk Load disk into memory +
save_disk Save to disk + +
+ +

Note: Drive-B-Simulator uses the same XBRA ID as BlitSim +('BSIM'). +

+

Configuration file: +

+

The config file BSTAT.INF is an array of 18 bytes. The following +apply: +

+ + + + + + + + + + + + +
Offset Meaning +
0..15 Write lock status (0 or 1) for each drive, from byte 0=A to +byte 15=P +
16 Load disk at startup (0 or 1) +
17 Swap drives at startup (0 or 1) + +
+ +

Warning Calls to this BIOS extension must be avoided +because Drive-B-Simulator uses undocumented TOS features and +hard-coded addresses which prevent it from working under EmuTOS. +

+

Presented in the german magazine TOS 3/1992. +

+

3.10.1 bsim_id

+ + + + + + + + + + + + + + + + + + + + + +
Name: »BSIM id« - Check if BSIM is available +
  +
Opcode: 300 (0x012c) +
  +
Syntax: See 'Bindings for bsim_id' +
  +
Description: The BIOS routine bsim_id checks if BSIM is available. +
  +
Return value: The function returns 0x4253494D ('BSIM') if BSIM is +available. +
  +
Availability: Drive-B-Simulator. +
  +
See also: Binding +
  + +
+ +

3.10.1.1 Bindings for bsim_id

+ + + + + + +
Assembler: +
  +
move.w    #$12C,-(sp)   ; Offset 0
+trap      #13           ; Call BIOS
+addq.l    #2,sp         ; Correct stack
+
+
GFA-Basic: Fehler%=Bios(300) +
  + +
+ +

3.10.2 drv_change

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Drive change« - Swap drives +
  +
Opcode: 304 (0x0130) +
  +
Syntax: See 'Bindings for drv_change' +
  +
Description: The BIOS routine drv_change allows to swap drives. The +data argument is as follows: +
  + + + + + + + + + +
0: Normal +
1: Swapped +
-1: Status + +
+ +
Return value: The function can return the following results in D0: +
  + + + + + + +
0: Normal +
1: Swapped + +
+ +
Availability: Drive-B-Simulator. +
  +
See also: Binding +
  + +
+ +

3.10.2.1 Bindings for drv_change

+ + + + + + +
Assembler: +
  +
move.w    #data,-(sp)   ; Offset 2
+move.w    #$130,-(sp)   ; Offset 0
+trap      #13           ; Call BIOS
+addq.l    #4,sp         ; Correct stack
+
+
GFA-Basic: Fehler%=Bios(304,W:data%) +
  + +
+ +

3.10.3 drvprotec

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Drive protection« - Write lock settings +
  +
Opcode: 305 (0x0131) +
  +
Syntax: See 'Bindings for drvprotec' +
  +
Description: The BIOS routine drvprotec gets or sets the write-protected +drive status. The prtdrv argument is a bit-vector for the +protected drives (bit 0=A, bit 1=B...), or -1 to inquire the current +status. +
  +
Return value: The function returns a bit-vector for the protected drives. +
  +
Availability: Drive-B-Simulator. +
  +
See also: Binding +
  + +
+ +

3.10.3.1 Bindings for drvprotec

+ + + + + + +
Assembler: +
  +
move.l    #prtdrv,-(sp) ; Offset 2
+move.w    #$131,-(sp)   ; Offset 0
+trap      #13           ; Call BIOS
+addq.l    #6,sp         ; Correct stack
+
+
GFA-Basic: Fehler%=Bios(305,L:prtdrv%) +
  + +
+ +

3.10.4 dstate

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Drive status« - Get RAM-disk details +
  +
Opcode: 306 (0x0132) +
  +
Syntax: See 'Bindings for dstate' +
  +
Description: The BIOS routine dstate copies details of the RAM-disk into +the buffer pointed to by pointer. The structure is as follows: +
  + + + + + + + + + + + + + + + + + + + + + +
Offset Description +
    +
0 (long) Memory start address of the disk +
4 (long) Disk size +
8 (short) Sides +
10 (short) Tracks +
12 (short) Sectors + +
+ +
Return value: The function returns 0 in DO on success, or -1 if there is no +disk in memory. +
  +
Availability: Drive-B-Simulator. +
  +
See also: Binding +
  + +
+ +

3.10.4.1 Bindings for dstate

+ + + + + + +
Assembler: +
  +
pea       pointer(pc)   ; Offset 2
+move.w    #$132,-(sp)   ; Offset 0
+trap      #13           ; Call BIOS
+addq.l    #6,sp         ; Correct stack
+
+
GFA-Basic: Fehler%=Bios(306,L:pointer%) +
  + +
+ +

3.10.5 kill_disk

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Kill disk« - Remove disk from memory +
  +
Opcode: 302 (0x012e) +
  +
Syntax: See 'Bindings for kill_disk' +
  +
Description: The BIOS routine kill_disk removes the disk from memory. +
  +
Return value: The function can return the following results in D0: +
  + + + + + + +
E_OK: No error has arisen +
-1: Wrong magic value + +
+ +
Availability: Drive-B-Simulator. +
  +
See also: Binding +
  + +
+ +

3.10.5.1 Bindings for kill_disk

+ + + + + + +
Assembler: +
  +
move.l    #magic,-(sp)  ; Offset 2, magic:$87654321
+move.w    #$12E,-(sp)   ; Offset 0
+trap      #13           ; Call BIOS
+addq.l    #6,sp         ; Correct stack
+
+
GFA-Basic: Fehler%=Bios(302,L:magic%) +
  + +
+ +

3.10.6 load_disk

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Load disk« - Load a disk into memory +
  +
Opcode: 301 (0x012d) +
  +
Syntax: See 'Bindings for load_disk' +
  +
Description: The BIOS routine loads the disk into memory. +
  +
Return value: The function can return the following results in D0: +
  + + + + + + + + + + + + + + + +
E_OK: No error has arisen +
-1: Not enough memory +
-2: A disk is already in memory +
-3: Disk error +
-4: Wrong magic value + +
+ +
Availability: Drive-B-Simulator. +
  +
See also: Binding +
  + +
+ +

3.10.6.1 Bindings for load_disk

+ + + + + + +
Assembler: +
  +
move.l    #magic,-(sp)  ; Offset 2, magic:$12345678
+move.w    #$12D,-(sp)   ; Offset 0
+trap      #13           ; Call BIOS
+addq.l    #6,sp         ; Correct stack
+
+
GFA-Basic: Fehler%=Bios(301,L:magic%) +
  + +
+ +

3.10.7 save_disk

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Save disk« - Save RAM-disk to disk +
  +
Opcode: 303 (0x012f) +
  +
Syntax: See 'Bindings for save_disk' +
  +
Description: The BIOS routine save_disk saves data from memory to the +disk. +
  +
Return value: The function can return the following results in D0: +
  + + + + + + + + + + + + +
E_OK: No error has arisen +
-1: Wrong magic value +
-2: No disk in memory +
-4: Write error + +
+ +
Availability: Drive-B-Simulator. +
  +
See also: Binding +
  + +
+ +

3.10.7.1 Bindings for save_disk

+ + + + + + +
Assembler: +
  +
move.l    #magic,-(sp)  ; Offset 2, magic:$ABCD0123
+move.w    #$12F,-(sp)   ; Offset 0
+trap      #13           ; Call BIOS
+addq.l    #6,sp         ; Correct stack
+
+
GFA-Basic: Fehler%=Bios(303,L:magic%) +
  + +
+ +
+ +Home +BIOSBIOS +XBRA procedureXBRA procedure +BIOS function listBIOS function list + + diff --git a/en/CENTScreen_XBIOS_extension.html b/en/CENTScreen_XBIOS_extension.html new file mode 100644 index 000000000..19c4635dd --- /dev/null +++ b/en/CENTScreen_XBIOS_extension.html @@ -0,0 +1,1598 @@ + + + + + +The documentation for TOS: CENTScreen XBIOS extension + + + + + + + + + +Home +XBIOSXBIOS +Screen functionsScreen functions +Crazy-Dots XBIOS extensionCrazy-Dots XBIOS extension + +
+ +

4.6 CENTScreen XBIOS extension

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MultiMon Multisynchro mode. +
SetMon Sets the monitor type. +
SizeComp Vgetsize compatibility. +
Vattrib Alters attribute of a video mode. +
Vclose Shutdown +
Vcreate Adds a video mode. +
Vdelete Deletes a video mode. +
Vfirst Finds the first video mode. +
Vload Loads VIDEO.DAT. +
Vlock Locks the virtual screen. +
Vnext Next video mode. +
Voffset Gets position of the virtual screen. +
Vopen Wakes up the screen. +
Vread Obtains the current video mode. +
Vsave Saves VIDEO.DAT. +
Vscroll Chooses the method of scrolling. +
Vseek Sets the position of the virtual screen. +
Vsize Returns the size of the screen. +
Vvalid Validates a video mode. +
Vwrite Changes the screen resolution. + +
+ +

Note: +
These functions are only available under CENTScreen; they +are not routines of the operating system. +

+

4.6.1 MultiMon

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »MultiMon« - Multisynchro mode +
  +
Opcode: 82 +
  +
Syntax: int16_t MultiMon( int16_t Cmd ); +
  +
Description: You can authorise the switch between RGB and VGA. +
  +

+
+ + + + + + + + + + + + + + + + +
CmdDescription
0Forbid the switch.
>0Authorize the switch.
-1The current mode.
+
+ +
Return value: The old mode. +
  +
Availability: CENTScreen +
  +
Group: CENTScreen XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.6.1.1 Bindings for MultiMon

+ + + + + + +
C: +
  +
int16_t MultiMon( int16_t Cmd ); +
  +
Assembler: +
  +
move.w    #Cmd,-(sp)  ; Offset 2
+move.w    #82,-(sp)   ; Offset 0
+trap      #14         ; Call XBIOS
+addq.l    #4,sp       ; Correct stack
+
+ +
+ +

4.6.2 SetMon

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »SetMon« - Set the monitor type. +
  +
Opcode: 81 +
  +
Syntax: int16_t SetMon( int16_t MontType ); +
  +
Description: Set the monitor type. +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
MontTypeNew type of monitor
0SM124 SM124 (prehistoric screen of the ST)
1RGB (TV-like screen, ideal to make one blind...)
2VGA (a real monitor to work with!)
3TV (worst RGB, makes all users blind...)
+
+ +
Return value: The type of screen. +
  +
Availability: CENTScreen +
  +
Group: CENTScreen XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.6.2.1 Bindings for SetMon

+ + + + + + +
C: #include <tos.h> +
  +
int16_t SetMon( int16_t MontType ); +
  +
Assembler: +
  +
move.w    #MontType,-(sp) ; Offset 2
+move.w    #81,-(sp)       ; Offset 0
+trap      #14             ; Call XBIOS
+addq.l    #4,sp           ; Correct stack
+
+ +
+ +

4.6.3 SizeComp

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »SizeComp« - Vgetsize compatibility +
  +
Opcode: 83 +
  +
Syntax: int16_t SizeComp( int16_t Cmd ); +
  +
Description: Vgetsize compatibility. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
CmdDescription
0Return the real size of the original screen.
 Put the height bit to 1 to return the extended
 size of the video mode.
>0Return the extended size.
-1The current mode.
+
+ +
Return value: The old mode. +
  +
Availability: CENTScreen +
  +
Group: CENTScreen XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.6.3.1 Bindings for SizeComp

+ + + + + + +
C: #include <tos.h> +
  +
int16_t SizeComp( int16_t Cmd ); +
  +
Assembler: +
  +
move.w    #Cmd,-(sp)  ; Offset 2
+move.w    #83,-(sp)   ; Offset 0
+trap      #14         ; Call XBIOS
+addq.l    #4,sp       ; Correct stack
+
+ +
+ +

4.6.4 Vattrib

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Vattrib« - Changes the attiributes of a video mode +
  +
Opcode: 67 +
  +
Syntax: void Vattrib( VDO_PARAM *InParam, VDO_PARAM *OutParam ); +
  +
Description: This function allows you to change the parmeters of original +video modes. It is possible to change only the set, eco, eco2 and virt +flags, the virtual screen size and the screen saver waiting period. +
  +
As the flag_set flag can be set only once for each resolution +type, this function handles the previous mode deactivation. Of course, +it is only useful for the former functions. +
  +
Return value: The OutParam is filled with the prameters really set. +
  +
Availability: CENTScreen +
  +
Group: CENTScreen XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.6.4.1 Bindings for Vattrib

+ + + + + + +
C: #include <tos.h> +
  +
void Vattrib( VDO_PARAM *InParam, VDO_PARAM *OutParam ); +
  +
Assembler: +
  +
move.l    #OutParam,-(sp) ; Offset 6
+move.l    #InParam,-(sp)  ; Offset 2
+move.w    #67,-(sp)       ; Offset 0
+trap      #14             ; Call XBIOS
+lea       10(sp),sp       ; Correct stack
+
+ +
+ +

4.6.5 Vclose

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Vclose« - Shut down +
  +
Opcode: 76 +
  +
Syntax: int16_t Vclose( void ); +
  +
Description: Shut down +
  +
Return value:  0 : No error. +
-1 : Improbable. +
  +
Availability: CENTScreen +
  +
Group: CENTScreen XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.6.5.1 Bindings for Vclose

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Vclose( void ); +
  +
Assembler: +
  +
move.w    #76,-(sp)    ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

4.6.6 Vcreate

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Vcreate« - Add a video mode +
  +
Opcode: 68 +
  +
Syntax: void Vcreate( VDO_PARAM *InParam, VDO_PARAM *OutParam ); +
  +
Description: It take directly the videl parameters and affect a new handle +on it with your parameters. +
  +
It use by CENTvidel. +
  +
Return value: The OutParam is filled with the prameters really set. +
  +
Availability: CENTScreen +
  +
Group: CENTScreen XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.6.6.1 Bindings for Vcreate

+ + + + + + +
C: #include <tos.h> +
  +
void Vcreate( VDO_PARAM *InParam, VDO_PARAM *OutParam ); +
  +
Assembler: +
  +
move.l    #OutParam,-(sp) ; Offset 6
+move.l    #InParam,-(sp)  ; Offset 2
+move.w    #68,-(sp)       ; Offset 0
+trap      #14             ; Call XBIOS
+lea       10(sp),sp       ; Correct stack
+
+ +
+ +

4.6.7 Vdelete

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Vdelete« - Delete a video mode +
  +
Opcode: 69 +
  +
Syntax: int16_t Vdelete( int16_t Handle); +
  +
Description: Doesn't move the handles but compresses the internal data. The +handles may change after a save-load sequence. +
  +
Return value:  0: No error +
-1: Bad handle +
  +
Availability: CENTScreen +
  +
Group: CENTScreen XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.6.7.1 Bindings for Vdelete

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Vdelete( int16_t Handle); +
  +
Assembler: +
  +
move.w    #Handle,-(sp)   ; Offset 2
+move.w    #69,-(sp)       ; Offset 0
+trap      #14             ; Call XBIOS
+addq.l    #4,sp           ; Correct stack
+
+ +
+ +

4.6.8 Vfirst

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Vfirst« - Search the first video mode +
  +
Opcode: 70 +
  +
Syntax: int16_t Vfirst( VDO_PARAM *Mask, VDO_PARAM *Mode ); +
  +
Description: Finds the first video mode. +
  +
Return value:  0: The out-array is full +
-1: No mode match +
  +
Availability: CENTScreen +
  +
Group: CENTScreen XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.6.8.1 Bindings for Vfirst

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Vfirst( VDO_PARAM *Mask, VDO_PARAM *Mode ); +
  +
Assembler: +
  +
move.l    #Mode,-(sp)    ; Offset 6
+move.l    #Mask,-(sp)    ; Offset 2
+move.w    #70,-(sp)      ; Offset 0
+trap      #14            ; Call XBIOS
+lea       10(sp),sp      ; Correct stack
+
+ +
+ +

4.6.9 Vload

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Vload« - Load VIDEO.DAT file +
  +
Opcode: 73 +
  +
Syntax: int16_t Vload( void ); +
  +
Description: Load the VIDEO.DAT file. +
  +
Return value:  0 : No error. +
-1 : File not found. +
  +
Availability: CENTScreen +
  +
Group: CENTScreen XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.6.9.1 Bindings for Vload

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Vload( void ); +
  +
Assembler: +
  +
move.w    #73,-(sp)    ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

4.6.10 Vlock

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Vlock« - Lock the virtual screen +
  +
Opcode: 80 +
  +
Syntax: int16_t Vlock( int16_t cmd ); +
  +
Description: Locks the virtual screen. +
  +

+
+ + + + + + + + + + + + +
cmdDescription
0The mouse can move the virtual screen
1The mouse can not move the virtual screen
+
+ +
Return value: The old configuration. +
  +
Availability: CENTScreen +
  +
Group: CENTScreen XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.6.10.1 Bindings for Vlock

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Vlock( int16_t cmd ); +
  +
Assembler: +
  +
move.w    #cmd,-(sp)   ; Offset 2
+move.w    #80,-(sp)    ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.6.11 Vnext

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Vnext« - Next video mode +
  +
Opcode: 71 +
  +
Syntax: int16_t Vnext( VDO_PARAM *Mask, VDO_PARAM *Mode ); +
  +
Description: Next video mode +
  +
Return value:  0: The out-array is full +
-1: No mode match +
  +
Availability: CENTScreen +
  +
Group: CENTScreen XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.6.11.1 Bindings for Vnext

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Vnext( VDO_PARAM *Mask, VDO_PARAM *Mode ); +
  +
Assembler: +
  +
move.l    #Mode,-(sp)    ; Offset 6
+move.l    #Mask,-(sp)    ; Offset 2
+move.w    #71,-(sp)      ; Offset 0
+trap      #14            ; Call XBIOS
+lea       10(sp),sp      ; Correct stack
+
+ +
+ +

4.6.12 Voffset

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Voffset« - Position of the virtual screen +
  +
Opcode: 78 +
  +
Syntax: int16_t Voffset( void ); +
  +
Description: Returns the position of the virtual screen in relation to the +top left corner of the physical screen. +
  +
Return value: Holds the current position with x in the high word and y in the +low word. +
  +
Availability: CENTScreen +
  +
Group: CENTScreen XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.6.12.1 Bindings for Voffset

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Voffset( void ); +
  +
Assembler: +
  +
move.w    #78,-(sp)   ; Offset 0
+trap      #14         ; Call XBIOS
+addq.l    #2,sp       ; Correct stack
+
+ +
+ +

4.6.13 Vopen

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Vopen« - Wake up the screen +
  +
Opcode: 75 +
  +
Syntax: int16_t Vopen( void ); +
  +
Description: Wake up the screen. +
  +
Return value:  0 : No error. +
-1 : Improbable. +
  +
Availability: CENTScreen +
  +
Group: CENTScreen XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.6.13.1 Bindings for Vopen

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Vopen( void ); +
  +
Assembler: +
  +
move.w    #75,-(sp)    ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

4.6.14 Vread

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Vread« - Obtain the current video mode +
  +
Opcode: 65 +
  +
Syntax: void Vread( VDO_PARAM *Result ); +
  +
Description: With one call you can know all the information about the installed +video mode. +
  +
Return value: Result is filled. +
  +
Availability: CENTScreen +
  +
Group: CENTScreen XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.6.14.1 Bindings for Vread

+ + + + + + +
C: #include <tos.h> +
  +
void Vread( VDO_PARAM *Result ); +
  +
Assembler: +
  +
move.l    #Result,-(sp) ; Offset 2
+move.w    #65,-(sp)     ; Offset 0
+trap      #14           ; Call XBIOS
+addq.l    #4,sp         ; Correct stack
+
+ +
+ +

4.6.15 Vsave

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Vsave« - Save a VIDEO.DAT file +
  +
Opcode: 74 +
  +
Syntax: int16_t Vsave( void ); +
  +
Description: Save a VIDEO.DAT file. +
  +
Return value:  0 : No error. +
-1 : Save impossible. +
  +
Availability: CENTScreen +
  +
Group: CENTScreen XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.6.15.1 Bindings for Vsave

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Vsave( void ); +
  +
Assembler: +
  +
move.w    #74,-(sp)    ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

4.6.16 Vscroll

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Vscroll« - Choose the method of scrolling +
  +
Opcode: 77 +
  +
Syntax: int16_t Vscroll( int16_t ScrollMode ); +
  +
Description: Choose the method of scrolling. +
  +

+
+ + + + + + + + + + + + + + + + +
ScrollModeNew method to use
0Edge scrolling (default method)
1Proportionnal scrolling
2Focus scrolling
+
+ +
Return value: The old method. +
  +
Availability: CENTScreen +
  +
Group: CENTScreen XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.6.16.1 Bindings for Vscroll

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Vscroll( int16_t ScrollMode ); +
  +
Assembler: +
  +
move.w    #ScrollMode,-(sp) ; Offset 2
+move.w    #77,-(sp)         ; Offset 0
+trap      #14               ; Call XBIOS
+addq.l    #4,sp             ; Correct stack
+
+ +
+ +

4.6.17 Vseek

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Vseek« - Set the position of the virtual screen +
  +
Opcode: 78 +
  +
Syntax: VPOS Vseek( int16_t x, int16_t y ); +
  +
Description: Sets the position of the virtual screen in relation to the top +left corner of the physical screen. +
  +
Return value: Holds the current position with x in the high word and y in the +low word. +
  +
Availability: CENTScreen +
  +
Group: CENTScreen XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.6.17.1 Bindings for Vseek

+ + + + + + +
C: #include <tos.h> +
  +
VPOS Vseek( int16_t x, int16_t y ); +
  +
Assembler: +
  +
move.w    #78,-(sp)   ; Offset 0
+trap      #14         ; Call XBIOS
+addq.l    #2,sp       ; Correct stack
+
+ +
+ +

4.6.18 Vsize

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Vsize« - Return the size of the screen +
  +
Opcode: 84 +
  +
Syntax: Bindings for Vsize +
  +
Description: This function allows you to know the size of a screen with +input parameters. +
  +
If you put -1 for handle, the current handle is taken by default +as a reference. +
  +
The function reads only the logical parameter (not if -1) and +the virtual flag (not if -1). +
  +
Parameters: +
Long: in-array +
  +
Return value: D0 hold the size in bytes. +
0 for error (bad parameters ?!) +
  +
Availability: CENTScreen +
  +
Group: CENTScreen XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.6.18.1 Bindings for Vsize

+ + + + + + +
C: +
  +
????? +
  +
Assembler: +
  +
move.l    #Mode,-(sp) ; Offset 2
+move.w    #84,-(sp)   ; Offset 0
+trap      #14         ; Call XBIOS
+addq.l    #6,sp       ; Correct stack
+
+ +
+ +

4.6.19 Vvalid

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Vvalid« - Validate a video mode +
  +
Opcode: 72 +
  +
Syntax: int16_t Vvalid( int16_t Handle ); +
  +
Description: Validate a video mode. +
  +
Return value:  0: If the mode exists +
-1: No mode for this handle +
  +
Availability: CENTScreen +
  +
Group: CENTScreen XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.6.19.1 Bindings for Vvalid

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Vvalid( int16_t Handle ); +
  +
Assembler: +
  +
move.w    #Handle,-(sp)  ; Offset 2
+move.w    #72,-(sp)      ; Offset 0
+trap      #14            ; Call XBIOS
+addq.l    #4,sp          ; Correct stack
+
+ +
+ +

4.6.20 Vwrite

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Vwrite« - Change the screen resolution. +
  +
Opcode: 66 +
  +
Syntax: int16_t Vwrite( int16_t InitVDI, VDO_PARAM *InParam, VDO_PARAM +*OutParam ); +
  +
Description: It is possible to use the VDI in order to use the graph +functions immediately. It allows to reallocate the needed screen for +the chosen video mode. +
  +
With InParam, you can send the new desired resolution: +
  +
    +
  • handle <>-1: This is the handle of a known video mode +(for instance when restoring the initial screen). It is possible to +give the virtual screen size by setting a value different than -1, +otherwise it will use the setting of the default video mode. +
      +

  • +
  • handle = -1: you MUST specify the resolution and you MAY +specify the virtual screen size. The function looks for a video mode +able to accept the requested resolution and, if needed, add an +over-width (virtual screen). +
      +

  • +
+ +
Once the resolution is passed in argument to the function, the +output array contains the mode actually passed (useful to validate the +mode). +
  +
In case of failure (not enough memory for the VDI screen, +invalid handle, or requested resolution too small), the current mode +is returned for information in the output array, in addition an error +message is provided. +
  +
Return value: After the call, OutParam contains the real resolution +made. +
  +
If an error occurs, the actual resolution is returned with -1. +
  +
Availability: CENTScreen +
  +
Group: CENTScreen XBIOS extension +
  +
See Also: Binding +
  + +
+ +

4.6.20.1 Bindings for Vwrite

+ + + + + + +
C: +
  +
int16_t Vwrite( int16_t InitVDI, VDO_PARAM *InParam, VDO_PARAM +*OutParam ); +
  +
Assembler: +
  +
move.l   #OutParam,-(sp) ; Offset 6
+move.l   #InParam,-(sp)  ; Offset 2
+move.w   #66,-(sp)       ; Offset 0
+trap     #14             ; Call XBIOS
+lea      10(sp),sp       ; Correct stack
+
+ +
+ +
+ +Home +XBIOSXBIOS +Screen functionsScreen functions +Crazy-Dots XBIOS extensionCrazy-Dots XBIOS extension + + diff --git a/en/CPXINFO.html b/en/CPXINFO.html new file mode 100644 index 000000000..a8a325629 --- /dev/null +++ b/en/CPXINFO.html @@ -0,0 +1,48 @@ + + + + + +The documentation for TOS: CPXINFO + + + + + + + + + +Home +Type definitionsType definitions +Buffer Control Block (BCB)Buffer Control Block (BCB) +FlpDrvInfoFlpDrvInfo + +
+ +

I.4 CPXINFO

+
typedef struct
+{
+    int16_t cdecl (*cpx_call)();
+    void cdecl    (*cpx_draw)();
+    void cdecl    (*cpx_wmove)();
+    void cdecl    (*cpx_timer)();
+    void cdecl    (*cpx_key)();
+    void cdecl    (*cpx_button)();
+    void cdecl    (*cpx_m1)();
+    void cdecl    (*cpx_m2)();
+    int16_t cdecl (*cpx_hook)();
+    void cdecl    (*cpx_close)();
+} CPXINFO;
+
+

See also: XCONTROL   cpx_init +

+
+ +Home +Type definitionsType definitions +Buffer Control Block (BCB)Buffer Control Block (BCB) +FlpDrvInfoFlpDrvInfo + + diff --git a/en/FlpDrvInfo.html b/en/FlpDrvInfo.html new file mode 100644 index 000000000..e3a5c7dff --- /dev/null +++ b/en/FlpDrvInfo.html @@ -0,0 +1,47 @@ + + + + + +The documentation for TOS: FlpDrvInfo + + + + + + + + + +Home +Type definitionsType definitions +CPXINFOCPXINFO +GEM_MUPBGEM_MUPB + +
+ +

I.5 FlpDrvInfo

+

This structure plays a role in connection with MagiC Mac, and is +defined as follows: +

+
typedef struct
+{
+   BOOLEAN  inserted;    /* True: disk is inserted and available */
+                         /* to GEMDOS/BIOS functions             */
+   BOOLEAN  highDensity; /* True: HD disk inserted, false: no or */
+                         /* DD disk inserted                     */
+   int16_t  res1;        /* Reserved                             */
+   int32_t  res2;        /* Reserved                             */
+} FlpDrvInfo;
+
+

See also: The MagiC Mac cookie +

+
+ +Home +Type definitionsType definitions +CPXINFOCPXINFO +GEM_MUPBGEM_MUPB + + diff --git a/en/GEM_MUPB.html b/en/GEM_MUPB.html new file mode 100644 index 000000000..e7024456c --- /dev/null +++ b/en/GEM_MUPB.html @@ -0,0 +1,44 @@ + + + + + +The documentation for TOS: GEM_MUPB + + + + + + + + + +Home +Type definitionsType definitions +FlpDrvInfoFlpDrvInfo +GRECTGRECT + +
+ +

I.6 GEM_MUPB

+

This structure describes the 'GEM memory usage parameter +block', which is defined as follows: +

+
typdef struct
+{
+   int32_t gm_magic;  /* Magical value, has to be 0x87654321 */
+   void *gm_end;      /* End of the memory required by GEM   */
+   void *gm_init;     /* Start address of GEM                */
+} GEM_MUPB;
+
+

See also: _sysbase   OSHEADER   System variables   System vectors +

+
+ +Home +Type definitionsType definitions +FlpDrvInfoFlpDrvInfo +GRECTGRECT + + diff --git a/en/GRECT.html b/en/GRECT.html new file mode 100644 index 000000000..23b3ac2ed --- /dev/null +++ b/en/GRECT.html @@ -0,0 +1,42 @@ + + + + + +The documentation for TOS: GRECT + + + + + + + + + +Home +Type definitionsType definitions +GEM_MUPBGEM_MUPB +HDFUNCSHDFUNCS + +
+ +

I.7 GRECT

+
typedef struct
+{
+   int16_t x;   /* X-coordinate */
+   int16_t y;   /* Y-coordinate */
+   int16_t w;   /* Width        */
+   int16_t h;   /* Height       */
+} GRECT;
+
+

See also: About the AES   GEM   About the VDI +

+
+ +Home +Type definitionsType definitions +GEM_MUPBGEM_MUPB +HDFUNCSHDFUNCS + + diff --git a/en/HDFUNCS.html b/en/HDFUNCS.html new file mode 100644 index 000000000..ed5808c96 --- /dev/null +++ b/en/HDFUNCS.html @@ -0,0 +1,52 @@ + + + + + +The documentation for TOS: HDFUNCS + + + + + + + + + +Home +Type definitionsType definitions +GRECTGRECT +MacVersionMacVersion + +
+ +

I.8 HDFUNCS

+
typedef struct
+{
+    int32_t dma_begin ( void);
+    int32_t dma_end   ( void );
+    int32_t dma_wait  ( d0 = int32_t ticks_200hz );
+    int32_t ncr_begin ( void );
+    int32_t ncr_end   ( void );
+    int32_t ncr_wait  ( d0 = int32_t ticks_200hz );
+} HDFUNCS;
+
+

Note: Directly before the structure (2 bytes before) +lies an int16_t, which specifies the table length in int32_ts (in this +case 6). All 6 pointers lie in the system variables area and may be +altered in case of need. The internal functions for the floppy drive +also jump via the 6 pointers. +
Important: The pointer hddrv_functions in the +MagX cookie may not be altered. +

+

See also: Background-DMA in MagiC +

+
+ +Home +Type definitionsType definitions +GRECTGRECT +MacVersionMacVersion + + diff --git a/en/MD.html b/en/MD.html new file mode 100644 index 000000000..ca811f4ca --- /dev/null +++ b/en/MD.html @@ -0,0 +1,77 @@ + + + + + +The documentation for TOS: Memory Descriptor (MD) in TOS + + + + + + + + + +Home +Type definitionsType definitions +Memory-Control-Block (MCB) in MagiCMemory-Control-Block (MCB) in MagiC +MRETSMRETS + +
+ +

I.11 Memory Descriptor (MD) in TOS

+ + +
typedef struct md
+{
+    struct md *m_link;      /* Pointer to next MD         */
+    int32_t      m_start;   /* Start address of the block */
+    int32_t      m_length;  /* Length of the block        */
+    BASEPAGE  *m_own;       /* Pointer to the basepage    */
+} MD;
+
+

Note: The component m_own here points to the +basepage of the process to which the memory block belongs. +

+

These structures are administered in the internal memory +management of TOS (but not of MagiC!). These descriptors, +as far as they are used, hang in three memory lists, namely for free +blocks, occupied blocks and for the next block to be occupied +(mem_rover). With the mem_rover concept one attempts to achieve that +consecutive Malloc calls reserve consecutive memory if possible (this +has been described as an error already elsewhere). This is intended to +reduce memory segmentation. +

+

This idea is unusable if several programs are running +simultaneously and call Mallocs alternately, however. The concept +implemented by Atari has the advantage that it is not sensitive to +programs that run amuck, since the MDs lie is system memory, far away +from user memory. A known disadvantage of the described concept is +that only a very restricted number of Malloc calls are possible, since +every call swallows an MD of the limited system memory; this is also +massively burdened by opened folders and files. A further disadvantage +of the TOS memory management: If a program overspills a memory +block, i.e. writes past its end, then this generally passes completely +unnoticed. +

+

Specially in multitasking systems the danger of an overwritten +memory block is very much higher than in TOS. Furthermore, the +number of memory blocks required, as well as those for folders (each +program has its own files and standard directories) is appreciably +higher. For these resons MagiC has a completely different concept; in +that there is only one memory list whose pointers point to the first +MCB. +

+

See also: About the GEMDOS   MCB   MPB   Memory management   +themd +

+
+ +Home +Type definitionsType definitions +Memory-Control-Block (MCB) in MagiCMemory-Control-Block (MCB) in MagiC +MRETSMRETS + + diff --git a/en/MRETS.html b/en/MRETS.html new file mode 100644 index 000000000..0a726cc61 --- /dev/null +++ b/en/MRETS.html @@ -0,0 +1,42 @@ + + + + + +The documentation for TOS: MRETS + + + + + + + + + +Home +Type definitionsType definitions +Memory Descriptor (MD) in TOSMemory Descriptor (MD) in TOS +OHEADEROHEADER + +
+ +

I.12 MRETS

+
typedef struct
+{
+    int16_t x;
+    int16_t y;
+    int16_t buttons;
+    int16_t kstate;
+} MRETS;
+
+

See also: cpx_button   cpx_m1   cpx_m2   XCONTROL +

+
+ +Home +Type definitionsType definitions +Memory Descriptor (MD) in TOSMemory Descriptor (MD) in TOS +OHEADEROHEADER + + diff --git a/en/MacVersion.html b/en/MacVersion.html new file mode 100644 index 000000000..15ecdf6e1 --- /dev/null +++ b/en/MacVersion.html @@ -0,0 +1,49 @@ + + + + + +The documentation for TOS: MacVersion + + + + + + + + + +Home +Type definitionsType definitions +HDFUNCSHDFUNCS +Memory-Control-Block (MCB) in MagiCMemory-Control-Block (MCB) in MagiC + +
+ +

I.9 MacVersion

+

This structure plays a role in connection with MagiC Mac, and is +defined as follows: +

+
typedef struct /* 'vers' resource definition, see Inside Mac docs */
+{
+   int8_t vm;       /* First part of version number in BCD */
+   int8_t vn;       /* Second and third part of version    */
+                    /* number in BCD                       */
+   int8_t  vt;      /* Development: 0x20, alpha: 0x40,     */
+                    /* beta: 0x60, release: 0x80           */
+   int8_t  vd;      /* Stage of pre-release version        */
+   int16_t region;  /* Region code                         */
+   int8_t  str[];   /* Two version strings                 */
+} MacVersion;
+
+

See also: The MagiC Mac cookie +

+
+ +Home +Type definitionsType definitions +HDFUNCSHDFUNCS +Memory-Control-Block (MCB) in MagiCMemory-Control-Block (MCB) in MagiC + + diff --git a/en/OHEADER.html b/en/OHEADER.html new file mode 100644 index 000000000..2ddd2a68d --- /dev/null +++ b/en/OHEADER.html @@ -0,0 +1,47 @@ + + + + + +The documentation for TOS: OHEADER + + + + + + + + + +Home +Type definitionsType definitions +MRETSMRETS +OSHEADEROSHEADER + +
+ +

I.13 OHEADER

+

This structure describes the header of an object file in +Digital Research format: +

+
typedef struct
+{
+   int16_t magic;         /* Magical value: 0x601a      */
+   int32_t tsize;         /* Size of the TEXT segment   */
+   int32_t dsize;         /* Size of the DATA segment   */
+   int32_t bsize;         /* Size of the BSS            */
+   int32_t ssize;         /* Size of the symbol table   */
+   int8_t reserved[10];   /* Reserved, set to zero      */
+} OHEADER;
+
+

See also: ARHEADER   BASEPAGE +

+
+ +Home +Type definitionsType definitions +MRETSMRETS +OSHEADEROSHEADER + + diff --git a/en/OSHEADER.html b/en/OSHEADER.html new file mode 100644 index 000000000..60a7c0ab8 --- /dev/null +++ b/en/OSHEADER.html @@ -0,0 +1,127 @@ + + + + + +The documentation for TOS: OSHEADER + + + + + + + + + +Home +Type definitionsType definitions +OHEADEROHEADER +PrintDescPrintDesc + +
+ +

I.14 OSHEADER

+ + + +
typedef struct _osheader
+{
+    uint16_t    os_entry;       /* BRAnch instruction to Reset-handler  */
+    uint16_t    os_version;     /* TOS version number                   */
+    void       *reseth;         /* Pointer to Reset-handler             */
+    struct _osheader *os_beg;   /* Base address of the operating system */
+    void       *os_end;         /* First byte not used by the OS        */
+    int32_t     os_rsvl;        /* Reserved                             */
+    GEM_MUPB   *os_magic;       /* GEM memory-usage parameter block     */
+    int32_t     os_date;        /* TOS date (English !) in BCD format   */
+    uint16_t    os_conf;        /* Various configuration bits           */
+    uint16_t    os_dosdate;     /* TOS date in GEMDOS format            */
+
+    /* The following components are available only as of TOS Version
+       1.02 (Blitter-TOS)               */
+    int8_t    **p_root;         /* Base address of the GEMDOS pool      */
+    int8_t    **pkbshift;       /* Pointer to BIOS Kbshift variable
+                                   (for TOS 1.00 see Kbshift)           */
+    BASEPAGE  **p_run;          /* Address of the variables containing
+                                   a pointer to the current GEMDOS
+                                   process.                             */
+    int8_t     *p_rsv2;         /* Reserved                             */
+                                /* If EmuTOS is present, then 'ETOS'    */
+} OSHEADER;
+
+

The structure also appears under the name SYSHDR. +

+ + + + + + + + + +
os_conf The component os_conf contains the so-called NTSC/PAL +flag in its lowest bit; if this bit is set, then the machine has a PAL +video system, if cleared NTSC. The remaining bits contain a country +identifier, which can serve to denote the language used for menus etc. +for instance. The folowing assignments apply: +
  +

+
+ + + + + + + + + + + + +
ValueCountry
0 to 126see the define by the _AKP cookie
127All countries are supported.
+
+ +
Warning: To obtain the language in use, one should fall +back not to the OSHEADER if possible, but use the _AKP +cookie or the function appl_getinfo (opcode 3). +
  +
p_root With older TOS versions the address of p_root is 0x56FA +(0x7E0A in spanish TOS). +
  +
p_run +
  +
BASEPAGE **GetRun (void)
+{
+  int32_t savessp = Super (0L);
+  OSHEADER *O = *((OSHEADER **)(0x4f2L);
+  Super ((void *) savessp );
+
+  O = O->os_beg;  /* wegen eines Fehlers in alter AHDI-Version */
+
+  if (O->os_version < 0x102)
+  {
+    if ((O->os_conf >> 1) == 4)      /* PAL-Modus wegshiften */
+      return ((BASEPAGE **)0x873c);  /* Spanish TOS 1.0   */
+    else
+      return ((BASEPAGE **)0x602c);
+  }
+  else
+    return O->p_run;
+}
+
+ +
+ +

See also: Kbshift   _sysbase   System variables   System vectors +

+
+ +Home +Type definitionsType definitions +OHEADEROHEADER +PrintDescPrintDesc + + diff --git a/en/PCI_BIOS.html b/en/PCI_BIOS.html new file mode 100644 index 000000000..538c9c7a0 --- /dev/null +++ b/en/PCI_BIOS.html @@ -0,0 +1,4160 @@ + + + + + +The documentation for TOS: PCI-BIOS + + + + + + + + + +Home +XBIOSXBIOS +OverScan XBIOS extensionOverScan XBIOS extension +Interface programmingInterface programming + +
+ +

4.17 PCI-BIOS

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
bus_to_virt Convert PCI bus to virtual address +
fast_read_config_byte Read configuration byte fast +
fast_read_config_longword Read configuration longword fast +
fast_read_config_word Read configuration word fast +
fast_read_io_byte Read IO byte fast +
fast_read_io_longword Read IO longword fast +
fast_read_io_word Read IO word fast +
fast_read_mem_byte Read memory byte fast +
fast_read_mem_longword Read memory longword fast +
fast_read_mem_word Read memory word fast +
find_pci_classcode Find PCI class code +
find_pci_device Find PCI device +
get_card_used Get card used flag +
get_machine_id Get machine ID +
get_pagesize Get pagesize +
get_resource Get resource Data +
get_routing Get interrupt routing options +
hook_interrupt Hook interrupt vector +
phys_to_virt Convert physical CPU to virtual address +
read_config_byte Read configuration byte +
read_config_longword Read configuration longword +
read_config_word Read configuration word +
read_io_byte Read IO byte +
read_io_longword Read IO longword +
read_io_word Read IO word +
read_mem_byte Read memory byte +
read_mem_longword Read memory longword +
read_mem_word Read memory word +
set_card_used Set card used flag +
set_interrupt Set hardware interrupt +
special_cycle Generates special cycle +
unhook_interrupt Unhook interrupt vector +
virt_to_bus Convert virtual to PCI bus address +
virt_to_phys Convert virtual to physical CPU address +
write_config_byte Write configuration byte +
write_config_longword Write configuration longword +
write_config_word Write configuration word +
write_io_byte Write IO byte +
write_io_longword Write IO longword +
write_io_word Write IO word +
write_mem_byte Write memory byte +
write_mem_longword Write memory longword +
write_mem_word Write memory word + +
+ +

See also: PCI-BIOS Error codes   Cookie _PCI   Cookie XPCI +

+

4.17.1 bus_to_virt

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Bus to virtual« - Convert PCI bus to virtual address +
  +
Opcode: 340 +
  +
Syntax: int32_t bus_to_virt (int32_t handle, uint32_t address, uint32_t +*pointer); +
  +
Description: This function converts from PCI bus addresses to virtual +addresses (as the CPU uses them). This is necessary since the memory +may be mapped non-linear by the PMMU even when not using virtual +memory (it is on the MILAN). +
  +
It is required that a resource (ie. a region of memory or IO +space on a PCI card) is mapped contiguously, so that a simple offset +can be used when copying to/from memory on a PCI card. +
  +
This function might be limited to TOS or TOS-like +operating systems. If an operating system uses a different memory +layout, it may need to provide its own functions which drivers can +use. +
  +
When using this function, the driver does not need to care about +DMA offsets at all. +
  + + + + + + + + + +
handle Device handle +
  +
address PCI bus address +
  +
pointer Pointer to mem-struct for results +
  + +
+ +
Note: This function is the reverse of virt_to_bus. It +might be slow, so the driver should avoid using it if it can determine +the address by other means. +
  +
Return value: PCI-BIOS Error codes. If successful, mem-struct is filled as follows: +
  + + + + + + +
uint32_t CPU (virtual) address +
uint32_t length of contiguous mapped area + +
+ +
Availability: PCI-BIOS +
  +
Group: PCI-BIOS +
  +
See also: Binding   get_pagesize   phys_to_virt   virt_to_bus   +virt_to_phys +
  + +
+ +

4.17.1.1 Bindings for bus_to_virt

+ + + + + + +
C: #include <tos.h> +
  +
int32_t bus_to_virt (int32_t handle, uint32_t address, uint32_t +*pointer); +
  +
Assembler: +
  +
pea       pointer       ; Offset 10
+move.l    address,-(sp) ; Offset 6
+move.l    handle,-(sp)  ; Offset 2
+move.w    #340,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+lea       14(sp),sp     ; Correct stack
+
+ +
+ +

4.17.2 fast_read_config_byte

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Read configuration byte fast« +
  +
Opcode: 305 +
  +
Syntax: int8_t fast_read_config_byte (int32_t handle, uint8_t reg); +
  +
Description: This function reads data from the PCI configuration space of a +given card. It does only minimal error checking and is meant to be +used only when access to configuration space is needed in interrupt +handlers. +
  + + + + + + +
handle device handle +
  +
reg Register number (0,1,2,... for byte access) +
  + +
+ +
Return value: +
  +
Availability: PCI-BIOS 2.0 +
  +
Group: PCI-BIOS +
  +
See also: Binding   read_config_byte   read_config_word   +fast_read_config_word   read_config_longword   +fast_read_config_longword +
  + +
+ +

4.17.2.1 Bindings for fast_read_config_byte

+ + + + + + +
C: #include <tos.h> +
  +
int8_t fast_read_config_byte (int32_t handle, uint8_t reg); +
  +
Assembler: +
  +
move.w    reg,-(sp)     ; Offset 6
+move.l    handle,-(sp)  ; Offset 2
+move.w    #305,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+addq.l    #8,sp         ; Correct stack
+
+ +
+ +

4.17.3 fast_read_config_longword

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Read configuration longword fast« +
  +
Opcode: 307 +
  +
Syntax: int32_t fast_read_config_longword (int32_t handle, uint8_t +reg); +
  +
Description: This function reads data from the PCI configuration space of a +given card. It does only minimal error checking and is meant to be +used only when access to configuration space is needed in interrupt +handlers. +
  + + + + + + +
handle Device handle +
  +
reg Register number (0,4,8,... for longword access) +
  + +
+ +
Return value: +
  +
Availability: PCI-BIOS +
  +
Group: PCI-BIOS +
  +
See also: Binding   read_config_byte   fast_read_config_byte   +read_config_word   fast_read_config_word   read_config_longword +
  + +
+ +

4.17.3.1 Bindings for fast_read_config_longword

+ + + + + + +
C: #include <tos.h> +
  +
int32_t fast_read_config_longword (int32_t handle, uint8_t reg); +
  +
Assembler: +
  +
move.w    reg,-(sp)     ; Offset 6
+move.l    handle,-(sp)  ; Offset 2
+move.w    #307,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+addq.l    #8,sp         ; Correct stack
+
+ +
+ +

4.17.4 fast_read_config_word

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Read configuration word fast« +
  +
Opcode: 306 +
  +
Syntax: int16_t fast_read_config_word (int32_t handle, uint8_t reg); +
  +
Description: This function reads data from the PCI configuration space of a +given card. It does only minimal error checking and is meant to be +used only when access to configuration space is needed in interrupt +handlers. +
  + + + + + + +
handle Device handle +
  +
reg Register number (0,2,4,... for Word access) +
  + +
+ +
Return value: +
  +
Availability: PCI-BIOS +
  +
Group: PCI-BIOS +
  +
See also: Binding   read_config_byte   fast_read_config_byte   +read_config_word   read_config_longword   fast_read_config_longword +
  + +
+ +

4.17.4.1 Bindings for fast_read_config_word

+ + + + + + +
C: #include <tos.h> +
  +
int16_t fast_read_config_word (int32_t handle, uint8_t reg); +
  +
Assembler: +
  +
move.w    reg,-(sp)     ; Offset 6
+move.l    handle,-(sp)  ; Offset 2
+move.w    #306,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+addq.l    #8,sp         ; Correct stack
+
+ +
+ +

4.17.5 fast_read_io_byte

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Read IO byte fast« +
  +
Opcode: 331 +
  +
Syntax: uint8_t fast_read_io_byte (int32_t handle, uint32_t offset); +
  +
Description: This function is alternative for the normal IO read function. +It returns the read value in D0 and returns no error code, which makes +it easier to use in C. +
  + + + + + + +
handle Device handle +
  +
offset Address to access (in PCI IO address space) +
  + +
+ +
Return value: Read data. +
  +
Availability: PCI-BIOS +
  +
Group: PCI-BIOS +
  +
See also: Binding   read_io_byte   read_io_word   fast_read_io_word   +read_io_longword   fast_read_io_longword +
  + +
+ +

4.17.5.1 Bindings for fast_read_io_byte

+ + + + + + +
C: #include <tos.h> +
  +
uint8_t fast_read_io_byte (int32_t handle, uint32_t offset); +
  +
Assembler: +
  +
move.l    offset,-(sp)  ; Offset 6
+move.l    handle,-(sp)  ; Offset 2
+move.w    #331,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+lea       10(sp),sp     ; Correct stack
+
+ +
+ +

4.17.6 fast_read_io_longword

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Read IO longword fast« +
  +
Opcode: 333 +
  +
Syntax: uint32_t fast_read_io_longword (int32_t handle, uint32_t +offset); +
  +
Description: This function is alternative for the normal IO read function. +It returns the read value in D0 and returns no error code, which makes +it easier to use in C. +
  + + + + + + +
handle Device handle +
  +
offset Address to access (in PCI IO address space) +
  + +
+ +
Return value: Read data. +
  +
Availability: PCI-BIOS +
  +
Group: PCI-BIOS +
  +
See also: Binding   read_io_byte   fast_read_io_byte   read_io_word   +fast_read_io_word   read_io_longword +
  + +
+ +

4.17.6.1 Bindings for fast_read_io_longword

+ + + + + + +
C: #include <tos.h> +
  +
uint32_t fast_read_io_longword (int32_t handle, uint32_t +offset); +
  +
Assembler: +
  +
move.l    offset,-(sp)  ; Offset 6
+move.l    handle,-(sp)  ; Offset 2
+move.w    #333,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+lea       10(sp),sp     ; Correct stack
+
+ +
+ +

4.17.7 fast_read_io_word

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Read IO word fast« +
  +
Opcode: 332 +
  +
Syntax: uint16_t fast_read_io_word (int32_t handle, uint32_t offset); +
  +
Description: This function is alternative for the normal IO read function. +It returns the read value in D0 and returns no error code, which makes +it easier to use in C. +
  + + + + + + +
handle Device handle +
  +
offset Address to access (in PCI IO address space) +
  + +
+ +
Return value: Read data. +
  +
Availability: PCI-BIOS +
  +
Group: PCI-BIOS +
  +
See also: Binding   read_io_byte   fast_read_io_byte   read_io_word   +read_io_longword   fast_read_io_longword +
  + +
+ +

4.17.7.1 Bindings for fast_read_io_word

+ + + + + + +
C: #include <tos.h> +
  +
uint16_t fast_read_io_word (int32_t handle, uint32_t offset); +
  +
Assembler: +
  +
move.l    offset,-(sp)  ; Offset 6
+move.l    handle,-(sp)  ; Offset 2
+move.w    #332,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+lea       10(sp),sp     ; Correct stack
+
+ +
+ +

4.17.8 fast_read_mem_byte

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Read memory byte fast« +
  +
Opcode: 322 +
  +
Syntax: uint8_t fast_read_mem_byte (int32_t handle, uint32_t offset); +
  +
Description: This function is alternative for the normal memory read +function. It returns the read value in D0 and returns no error code, +which makes it easier to use in C. +
  + + + + + + +
handle Device handle +
  +
offset Address to access (in PCI memory address space) +
  + +
+ +
Return value: Read data. +
  +
Availability: PCI-BIOS +
  +
Group: PCI-BIOS +
  +
See also: Binding   read_mem_byte   read_mem_word   fast_read_mem_word   +read_mem_longword   fast_read_mem_longword +
  + +
+ +

4.17.8.1 Bindings for fast_read_mem_byte

+ + + + + + +
C: #include <tos.h> +
  +
uint8_t fast_read_mem_byte (int32_t handle, uint32_t offset); +
  +
Assembler: +
  +
move.l    offset,-(sp)  ; Offset 6
+move.l    handle,-(sp)  ; Offset 2
+move.w    #322,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+lea       10(sp),sp     ; Correct stack
+
+ +
+ +

4.17.9 fast_read_mem_longword

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Read memory longword fast« +
  +
Opcode: 324 +
  +
Syntax: uint32_t fast_read_mem_longword (int32_t handle, uint32_t +offset); +
  +
Description: This function is alternative for the normal memory read +function. It returns the read value in D0 and returns no error code, +which makes it easier to use in C. +
  + + + + + + +
handle Device handle +
  +
offset Address to access (in PCI memory address space) +
  + +
+ +
Return value: Read data. +
  +
Availability: PCI-BIOS +
  +
Group: PCI-BIOS +
  +
See also: Binding   read_mem_byte   fast_read_mem_byte   read_mem_word   +fast_read_mem_word   read_mem_longword +
  + +
+ +

4.17.9.1 Bindings for fast_read_mem_longword

+ + + + + + +
C: #include <tos.h> +
  +
uint32_t fast_read_mem_longword (int32_t handle, uint32_t +offset); +
  +
Assembler: +
  +
move.l    offset,-(sp)  ; Offset 6
+move.l    handle,-(sp)  ; Offset 2
+move.w    #324,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+lea       10(sp),sp     ; Correct stack
+
+ +
+ +

4.17.10 fast_read_mem_word

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Read memory word fast« +
  +
Opcode: 323 +
  +
Syntax: uint16_t fast_read_mem_word (int32_t handle, uint32_t offset); +
  +
Description: This function is alternative for the normal memory read +function. It returns the read value in D0 and returns no error code, +which makes it easier to use in C. +
  + + + + + + +
handle Device handle +
  +
offset Address to access (in PCI memory address space) +
  + +
+ +
Return value: Read data. +
  +
Availability: PCI-BIOS +
  +
Group: PCI-BIOS +
  +
See also: Binding   read_mem_byte   fast_read_mem_byte   read_mem_word   +read_mem_longword   fast_read_mem_longword +
  + +
+ +

4.17.10.1 Bindings for fast_read_mem_word

+ + + + + + +
C: #include <tos.h> +
  +
uint16_t fast_read_mem_word (int32_t handle, uint32_t offset); +
  +
Assembler: +
  +
move.l    offset,-(sp)  ; Offset 6
+move.l    handle,-(sp)  ; Offset 2
+move.w    #323,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+lea       10(sp),sp     ; Correct stack
+
+ +
+ +

4.17.11 find_pci_classcode

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »find_pci_classcode« - Returns a device handle for a device +that matches the given class code. +
  +
Opcode: 301 +
  +
Syntax: int32_t find_pci_classcode( int32_t classcode, int16_t index ); +
  +
Description: This functions returns a device handle for a device that +matches the given class code. +
  +
A driver can query multiple devices with the same class code by +starting with index = 0,1,2,... and calling this function until +PCI_DEVICE_NOT_FOUND is returned. +
  + + + + + + + + + +
    +
  +
classcode class code in bits 23..0 +
+
  +
Bit 23 ..16 Base class (0 - $FF) +
Bit 15 .. 8 Sub class (0 - $FF) +
Bit 7 .. 0 Programming Interface (0 - $FF) +
  +
Mask in bits 26..24 +
Bit 26: (0: compare base class, 1: ignore it) +
Bit 25: (0: compare sub class, 1: ignore it) +
Bit 24: (0: compare Progr. Interface, 1: ignore it) +
  +
index index of card (0 - number of cards with these IDs) +
  + +
+ +
Return value: Device handle for a device or PCI_DEVICE_NOT_FOUND. +
  +
Availability: PCI-BIOS V2.00 +
  +
Group: PCI-BIOS +
  +
See also: Binding   find_pci_device +
  + +
+ +

4.17.11.1 Bindings for find_pci_classcode

+ + + + + + +
C: #include <tos.h> +
  +
int32_t find_pci_classcode( int32_t classcode, int16_t index ); +
  +
Assembler: +
  +
move.w    index,-(sp)       ; Offset 6
+move.l    classcode,-(sp)   ; Offset 2
+move.w    #301,-(sp)        ; Offset 0
+trap      #14               ; Call XBIOS
+addq.l    #8,sp             ; Correct stack
+
+ +
+ +

4.17.12 find_pci_device

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »find_pci_device« - Returns a device handle for a device that +matches the given device and vendor ID. +
  +
Opcode: 300 +
  +
Syntax: int32_t find_pci_device( int32_t id, int16_t index); +
  +
Description: This functions returns a device handle for a device that +matches the given device and vendor ID. A driver can query multiple +devices with the same device and vendor ID by starting with index = +0,1,2,... and calling this function until PCI_DEVICE_NOT_FOUND is +returned. +
  +
As a special case, Vendor ID $FFFF can be used to query all +cards found in the system, the specified Device ID is ignored in that +case. +
  + + + + + + + + + +
    +
  +
id Device ID in bits 31..16 (0 - $FFFF) +
Vendor ID in bits 15..0 (0 - $FFFE) +
  +
index Index of card (0 - number of cards with these IDs) +
  + +
+ +
Return value: Device handle for a device or PCI_DEVICE_NOT_FOUND. +
  +
Availability: PCI-BIOS V2.00 +
  +
Group: PCI-BIOS +
  +
See also: Binding   find_pci_classcode +
  + +
+ +

4.17.12.1 Bindings for find_pci_device

+ + + + + + +
C: #include <tos.h> +
  +
int32_t find_pci_device( int32_t id, int16_t index); +
  +
Assembler: +
  +
move.w    index,-(sp)  ; Offset 6
+move.l    id,-(sp)     ; Offset 2
+move.w    #300,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #8,sp        ; Correct stack
+
+ +
+ +

4.17.13 get_card_used

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Get card used flag« +
  +
Opcode: 317 +
  +
Syntax: int32_t get_card_used (int32_t handle, uint32_t *address); +
  +
Description: This function is used to manage which card is in use by which +driver. A driver can provide a means by which a call-back function can +be called from another driver to deactivate this driver. This is +necessary for the first driver to unhook from interrupt chains etc., +before the new driver can take over. +
  +
The returned status is either 0 (the card is free), 1 (the card +is in use), 2 (the card is in use, but the driver can be uninstalled) +or 3 (the card is in use, but can be taken over without further +actions). +
  +
Case 3 means that the driver which brought the card to this +state may not hook into interrupt chains or other system resources +which need to be unhooked when another driver takes over the card. +
  +
If the return code is 2, the call-back function entry of the +driver is returned in the memory pointer to by address. +
  + + + + + + +
handle Device handle +
  +
address Pointer to longword where call-back address is stored +
  + +
+ +
Call-back handlers: Call-back functions are invoked by +calling the call-back entry point, they return with RTS. Call-back +functions may only modify those registers which are used to pass +arguments or results. Call-back functions must be called in supervisor +mode with at least 1024 bytes stack available. The call-back function +number is passed in D0.L. If the driver supports call-back functions, +the following functions are mandatory: +
  + + + + + + + + + +
Call-back Description +
Get Driver ID (0) call_back0: +
Input: D0.L = call-back function number, ie. 0 +
Output: D0.L = driver ID (same as the driver's XBRA ID) +
Try to remove driver (1) call_back1: +
Input: D0.L = call-back function number, ie. 1 +
Output: D0.L = result code: 0=success (card is free), 1=can't +uninstall + +
+ +
Return value: PCI-BIOS Error codes +
  +
Availability: PCI-BIOS +
  +
Group: PCI-BIOS +
  +
See also: Binding   set_card_used +
  + +
+ +

4.17.13.1 Bindings for get_card_used

+ + + + + + +
C: #include <tos.h> +
  +
int32_t get_card_used (int32_t handle, uint32_t *address); +
  +
Assembler: +
  +
pea       address       ; Offset 6
+move.l    handle,-(sp)  ; Offset 2
+move.w    #317,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+lea       10(sp),sp     ; Correct stack
+
+ +
+ +

4.17.14 get_machine_id

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Get Machine ID« +
  +
Opcode: 337 +
  +
Syntax: int32_t get_machine_id ( void ); +
  +
Description: This function can be used to get a unique machine ID for the +computer the driver is running on. +
  +
Return value: Machine ID, or 0 (no ID available), PCI-BIOS error-codes +
  +
Positive, non-zero values are machine IDs. They contain a +manufacturer code in bit 24..31 and a unique serial number which is +set by the manufacturer during production in bit 0..23. +
  +
The following manufacturer codes are defined: +
  +

+
+ + + + + + + + + + + + + + + + +
0Medusa/Hades
1Milan
2PAK/Panther 2
3ARAnyM
+
+ +
Availability: PCI-BIOS +
  +
Group: PCI-BIOS +
  +
See also: Binding +
  + +
+ +

4.17.14.1 Bindings for get_machine_id

+ + + + + + +
C: #include <tos.h> +
  +
int32_t get_machine_id ( void ); +
  +
Assembler: +
  +
move.w    #337,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+addq.l    #2,sp         ; Correct stack
+
+ +
+ +

4.17.15 get_pagesize

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Get Pagesize« +
  +
Opcode: 338 +
  +
Syntax: int32_t get_pagesize ( void ); +
  +
Description: This function can be used to get the active pagesize. +
  +
Return value: Active pagesize, or 0 (paging is not active), PCI-BIOS +error-codes +
  +
Availability: PCI-BIOS +
  +
Group: PCI-BIOS +
  +
See also: Binding +
  + +
+ +

4.17.15.1 Bindings for get_pagesize

+ + + + + + +
C: #include <tos.h> +
  +
int32_t get_pagesize ( void ); +
  +
Assembler: +
  +
move.w    #338,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+addq.l    #2,sp         ; Correct stack
+
+ +
+ +

4.17.16 get_resource

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Get Resource Data« +
  +
Opcode: 316 +
  +
Syntax: int32_t get_resource ( int32_t handle ); +
  +
Description: +
  + + + +
handle Device handle +
  + +
+ +
Return value: Pointer to array of resource descriptors or PCI-BIOS +error-codes. +
  +
Availability: PCI-BIOS +
  +
Group: PCI-BIOS +
  +
See also: Binding +
  + +
+ +

4.17.16.1 Bindings for get_resource

+ + + + + + +
C: #include <tos.h> +
  +
int32_t get_resource ( int32_t handle ); +
  +
Assembler: +
  +
move.l    handle,-(sp)  ; Offset 2
+move.w    #316,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+addq.l    #6,sp         ; Correct stack
+
+ +
+ +

4.17.17 get_routing

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Get Interrupt Routing Options« +
  +
Opcode: 314 +
  +
Syntax: int32_t get_routing ( int32_t handle ); +
  +
Description: To be defined. Not for use by device drivers. +
  +
Return value: PCI-BIOS error-codes +
  +
Availability: PCI-BIOS +
  +
Group: PCI-BIOS +
  +
See also: Binding +
  + +
+ +

4.17.17.1 Bindings for get_routing

+ + + + + + +
C: #include <tos.h> +
  +
int32_t get_routing ( int32_t handle ); +
  +
Assembler: +
  +
move.l    handle,-(sp)    ; Offset 2
+move.w    #314,-(sp)      ; Offset 0
+trap      #14             ; Call XBIOS
+addq.l    #6,sp           ; Correct stack
+
+ +
+ +

4.17.18 hook_interrupt

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Hook Interrupt Vector« +
  +
Opcode: 311 +
  +
Syntax: int32_t hook_interrupt (int32_t handle, uint32_t *routine, +uint32_t *parameter); +
  +
Description: This function hooks the driver into the interrupt chain to +which a specific interrupt on the given card is routed. The interrupt +is enabled on the system level, however, it is the drivers +responsibility to enable the interrupt on the card as needed. +
  +
The driver should first hook into the interrupt chain, and then +enable the interrupt on the card, in order not to cause spurious +interrupts. +
  + + + + + + + + + +
handle Device handle +
  +
routine Pointer to interrupt handler +
  +
parameter Parameter for interrupt handler +
  +
The parameter is passed to the interrupt handler unmodified - +its meaning is totally driver dependent. +
  + +
+ +
Return value: PCI-BIOS Error codes +
  +
Availability: PCI-BIOS +
  +
Group: PCI-BIOS +
  +
See also: Binding   unhook_interrupt +
  + +
+ +

4.17.18.1 Bindings for hook_interrupt

+ + + + + + +
C: #include <tos.h> +
  +
int32_t hook_interrupt (int32_t handle, uint32_t *routine, +uint32_t *parameter); +
  +
Assembler: +
  +
move.l    parameter,-(sp) ; Offset 10
+move.l    routine,-(sp)   ; Offset 6
+move.l    handle,-(sp)    ; Offset 2
+move.w    #311,-(sp)      ; Offset 0
+trap      #14             ; Call XBIOS
+lea       14(sp),sp       ; Correct stack
+
+ +
+ +

4.17.19 phys_to_virt

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Physical to virtual« - Convert physical CPU to virtual +address +
  +
Opcode: 342 +
  +
Syntax: int32_t phys_to_virt (uint32_t address, uint32_t *pointer); +
  +
Description: This function converts from physical CPU addresses to virtual +addresses. This is necessary since the memory may be mapped non-linear +by the PMMU even when not using virtual memory (it is on the MILAN). +
  +
It does not depend on a special device, thus it does not get a +device handle. +
  +
This function might be limited to TOS or TOS-like +operating systems. If an operating system uses a different memory +layout, it may need to provide its own functions which drivers can +use. +
  +
When using this function, the driver does not need to care about +DMA offsets at all. +
  + + + + + + +
address Physical CPU address +
  +
pointer Pointer to mem-struct for results +
  + +
+ +
Note: This function is the reverse of virt_to_phys. It +might be slow, so the driver should avoid using it if it can determine +the address by other means. +
  +
Return value: PCI-BIOS Error codes. If successful, mem-struct is filled as follows: +
  + + + + + + +
uint32_t CPU (virtual) address +
uint32_t length of contiguous mapped area + +
+ +
Availability: PCI-BIOS +
  +
Group: PCI-BIOS +
  +
See also: Binding   bus_to_virt   get_pagesize   virt_to_bus   +virt_to_phys +
  + +
+ +

4.17.19.1 Bindings for phys_to_virt

+ + + + + + +
C: #include <tos.h> +
  +
int32_t phys_to_virt (uint32_t address, uint32_t *pointer); +
  +
Assembler: +
  +
pea       pointer       ; Offset 6
+move.l    address,-(sp) ; Offset 2
+move.w    #342,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+lea       10(sp),sp     ; Correct stack
+
+ +
+ +

4.17.20 read_config_byte

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Read configuration byte« +
  +
Opcode: 302 +
  +
Syntax: int32_t read_config_byte (int32_t handle, uint8_t reg, uint8_t +*address); +
  +
Description: This function read data from the PCI configuration space of a +given card. +
  + + + + + + + + + +
handle Device handle +
  +
reg Register number (0,1,2,... for Byte access) +
  +
address Pointer to space for read data +
  + +
+ +
Return value: PCI-BIOS Error codes +
  +
Availability: PCI-BIOS +
  +
Group: PCI-BIOS +
  +
See also: Binding   fast_read_config_byte   read_config_word   +fast_read_config_word   read_config_longword   +fast_read_config_longword +
  + +
+ +

4.17.20.1 Bindings for read_config_byte

+ + + + + + +
C: #include <tos.h> +
  +
int32_t fast_read_config_byte (int32_t handle, uint8_t reg, +uint8_t *address); +
  +
Assembler: +
  +
pea       address       ; Offset 8
+move.w    reg,-(sp)     ; Offset 6
+move.l    handle,-(sp)  ; Offset 2
+move.w    #302,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+lea       12(sp),sp     ; Correct stack
+
+ +
+ +

4.17.21 read_config_longword

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Read configuration longword« +
  +
Opcode: 304 +
  +
Syntax: int32_t read_config_longword (int32_t handle, uint8_t reg, +uint32_t *address); +
  +
Description: This function read data from the PCI configuration space of a +given card. +
  + + + + + + + + + +
handle Device handle +
  +
reg Register number (0,4,8,... for Longword access) +
  +
address Pointer to space for read data +
  + +
+ +
Return value: PCI-BIOS Error codes +
  +
Availability: PCI-BIOS +
  +
Group: PCI-BIOS +
  +
See also: Binding   read_config_byte   fast_read_config_byte   +read_config_word   fast_read_config_word   fast_read_config_longword +
  + +
+ +

4.17.21.1 Bindings for read_config_longword

+ + + + + + +
C: #include <tos.h> +
  +
int32_t read_config_longword (int32_t handle, uint8_t reg, +uint32_t *address); +
  +
Assembler: +
  +
pea       address       ; Offset 8
+move.w    reg,-(sp)     ; Offset 6
+move.l    handle,-(sp)  ; Offset 2
+move.w    #304,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+lea       12(sp),sp     ; Correct stack
+
+ +
+ +

4.17.22 read_config_word

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Read configuration word« +
  +
Opcode: 303 +
  +
Syntax: int32_t read_config_word (int32_t handle, uint8_t reg, uint16_t +*address); +
  +
Description: This function read data from the PCI configuration space of a +given card. +
  + + + + + + + + + +
handle Device handle of the selected PCI device +
  +
reg Address of the configuration register +
  +
address Pointer to space for read data +
  + +
+ +
Return value: PCI-BIOS Error codes +
  +
Availability: PCI-BIOS +
  +
Group: PCI-BIOS +
  +
See also: Binding   read_config_byte   fast_read_config_byte   +fast_read_config_word   read_config_longword   +fast_read_config_longword +
  + +
+ +

4.17.22.1 Bindings for read_config_word

+ + + + + + +
C: #include <tos.h> +
  +
int32_t read_config_word (int32_t handle, uint8_t reg, uint16_t +*address); +
  +
Assembler: +
  +
pea       address       ; Offset 8
+move.w    reg,-(sp)     ; Offset 6
+move.l    handle,-(sp)  ; Offset 2
+move.w    #303,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+lea       12(sp),sp     ; Correct stack
+
+ +
+ +

4.17.23 read_io_byte

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Read IO byte« +
  +
Opcode: 328 +
  +
Syntax: int32_t read_io_byte (int32_t handle, uint32_t offset, uint8_t +*address); +
  +
Description: This function reads 8-bit values from a IO region. +
  + + + + + + + + + +
handle Device handle +
  +
offset Address to access (in PCI IO address space) +
  +
address Pointer to data in memory +
  + +
+ +
Return value: PCI-BIOS Error codes +
  +
Availability: PCI-BIOS +
  +
Group: PCI-BIOS +
  +
See also: Binding   fast_read_io_byte   read_io_word   fast_read_io_word   +read_io_longword   fast_read_io_longword +
  + +
+ +

4.17.23.1 Bindings for read_io_byte

+ + + + + + +
C: #include <tos.h> +
  +
int32_t read_io_byte (int32_t handle, uint32_t offset, uint8_t +*address); +
  +
Assembler: +
  +
pea       address       ; Offset 10
+move.l    offset,-(sp)  ; Offset 6
+move.l    handle,-(sp)  ; Offset 2
+move.w    #328,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+lea       14(sp),sp     ; Correct stack
+
+ +
+ +

4.17.24 read_io_longword

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Read IO longword« +
  +
Opcode: 330 +
  +
Syntax: int32_t read_io_longword (int32_t handle, uint32_t offset, +uint32_t *address); +
  +
Description: This function reads 32-bit values from a IO region and take +care of the byte ordering - ie. the data and address are converted as +if Motorola byte ordering was in use. +
  + + + + + + + + + +
handle Device handle +
  +
offset Address to access (in PCI IO address space) +
  +
address Pointer to data in memory +
  + +
+ +
Return value: PCI-BIOS Error codes. +
  +
Availability: PCI-BIOS +
  +
Group: PCI-BIOS +
  +
See also: Binding   read_io_byte   fast_read_io_byte   read_io_word   +fast_read_io_word   fast_read_io_longword +
  + +
+ +

4.17.24.1 Bindings for read_io_longword

+ + + + + + +
C: #include <tos.h> +
  +
int32_t read_io_longword (int32_t handle, uint32_t offset, +uint32_t *address); +
  +
Assembler: +
  +
pea       address       ; Offset 10
+move.l    offset,-(sp)  ; Offset 6
+move.l    handle,-(sp)  ; Offset 2
+move.w    #330,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+lea       14(sp),sp     ; Correct stack
+
+ +
+ +

4.17.25 read_io_word

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Read IO word« +
  +
Opcode: 329 +
  +
Syntax: int32_t read_io_word (int32_t handle, uint32_t offset, uint16_t +*address); +
  +
Description: This function reads 16-bit values from a IO region and take +care of the byte ordering - ie. the data and address are converted as +if Motorola byte ordering was in use. +
  + + + + + + + + + +
handle Device handle +
  +
offset Address to access (in PCI IO address space) +
  +
address Pointer to data in memory +
  + +
+ +
Return value: PCI-BIOS Error codes. +
  +
Availability: PCI-BIOS +
  +
Group: PCI-BIOS +
  +
See also: Binding   read_io_byte   fast_read_io_byte   fast_read_io_word   +read_io_longword   fast_read_io_longword +
  + +
+ +

4.17.25.1 Bindings for read_io_word

+ + + + + + +
C: #include <tos.h> +
  +
int32_t read_io_word (int32_t handle, uint32_t offset, uint16_t +*address); +
  +
Assembler: +
  +
pea       address       ; Offset 10
+move.l    offset,-(sp)  ; Offset 6
+move.l    handle,-(sp)  ; Offset 2
+move.w    #329,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+lea       14(sp),sp     ; Correct stack
+
+ +
+ +

4.17.26 read_mem_byte

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Read memory byte« +
  +
Opcode: 319 +
  +
Syntax: int32_t read_mem_byte (int32_t handle, uint32_t offset, uint8_t +*address); +
  +
Description: This function reads 8-bit values from a memory region. A driver +can use this function for access to registers and small buffers. For +larger amounts of data, the driver can choose to use his own copy +routines. +
  + + + + + + + + + +
handle Device handle +
  +
offset Address to access (in PCI memory address space) +
  +
address Pointer to data in memory +
  + +
+ +
Return value: PCI-BIOS Error codes. If successful, read data at buffer pointed to by +address. +
  +
Availability: PCI-BIOS +
  +
Group: PCI-BIOS +
  +
See also: Binding   fast_read_mem_byte   read_mem_word   +fast_read_mem_word   read_mem_longword   fast_read_mem_longword +
  + +
+ +

4.17.26.1 Bindings for read_mem_byte

+ + + + + + +
C: #include <tos.h> +
  +
int32_t read_mem_byte (int32_t handle, uint32_t offset, uint8_t +*address); +
  +
Assembler: +
  +
pea       address       ; Offset 10
+move.l    offset,-(sp)  ; Offset 6
+move.l    handle,-(sp)  ; Offset 2
+move.w    #319,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+lea       14(sp),sp     ; Correct stack
+
+ +
+ +

4.17.27 read_mem_longword

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Read memory longword« +
  +
Opcode: 321 +
  +
Syntax: int32_t read_mem_longword (int32_t handle, uint32_t offset, +uint32_t *address); +
  +
Description: This function reads 32-bit values from a memory region and take +care of the byte ordering - ie. the data and address are converted as +if Motorola byte ordering was in use. A driver can use this function +for access to registers and small buffers. For larger amounts of data, +the driver can choose to use his own copy routines, provided it knows +the byte order in use. +
  + + + + + + + + + +
handle Device handle +
  +
offset Address to access (in PCI memory address space) +
  +
address Pointer to data in memory +
  + +
+ +
Return value: PCI-BIOS Error codes. If successful, read data at buffer pointed to by +address. +
  +
Availability: PCI-BIOS +
  +
Group: PCI-BIOS +
  +
See also: Binding   read_mem_byte   fast_read_mem_byte   read_mem_word   +fast_read_mem_word   fast_read_mem_longword +
  + +
+ +

4.17.27.1 Bindings for read_mem_longword

+ + + + + + +
C: #include <tos.h> +
  +
int32_t read_mem_longword (int32_t handle, uint32_t offset, +uint32_t *address); +
  +
Assembler: +
  +
pea       address       ; Offset 10
+move.l    offset,-(sp)  ; Offset 6
+move.l    handle,-(sp)  ; Offset 2
+move.w    #321,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+lea       14(sp),sp     ; Correct stack
+
+ +
+ +

4.17.28 read_mem_word

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Read memory word« +
  +
Opcode: 320 +
  +
Syntax: int32_t read_mem_word (int32_t handle, uint32_t offset, +uint16_t *address); +
  +
Description: This function reads 16-bit values from a memory region and take +care of the byte ordering - ie. the data and address are converted as +if Motorola byte ordering was in use. A driver can use this function +for access to registers and small buffers. For larger amounts of data, +the driver can choose to use his own copy routines, provided it knows +the byte order in use. +
  + + + + + + + + + +
handle Device handle +
  +
offset Address to access (in PCI memory address space) +
  +
address Pointer to data in memory +
  + +
+ +
Return value: PCI-BIOS Error codes. If successful, read data at buffer pointed to by +address. +
  +
Availability: PCI-BIOS +
  +
Group: PCI-BIOS +
  +
See also: Binding   read_mem_byte   fast_read_mem_byte   +fast_read_mem_word   read_mem_longword   fast_read_mem_longword +
  + +
+ +

4.17.28.1 Bindings for read_mem_word

+ + + + + + +
C: #include <tos.h> +
  +
int32_t read_mem_word (int32_t handle, uint32_t offset, uint16_t +*address); +
  +
Assembler: +
  +
pea       address       ; Offset 10
+move.l    offset,-(sp)  ; Offset 6
+move.l    handle,-(sp)  ; Offset 2
+move.w    #320,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+lea       14(sp),sp     ; Correct stack
+
+ +
+ +

4.17.29 set_card_used

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set card used flag« +
  +
Opcode: 318 +
  +
Syntax: int32_t set_card_used (int32_t handle, uint32_t *callback); +
  +
Description: This function is used to manage which card is in use by which +driver. A driver can provide a means by which a call-back function can +be called from another driver to deactivate this driver. This is +necessary for the first driver to unhook from interrupt chains etc., +before the new driver can take over. +
  +
If the call-back entry is 0L, 1L or 3L, the card status is set +to that value. Only a driver which 'owns' the card may use this. If +any other value is passed, it is assumed to be a pointer to the +drivers call back entry point, and the card status is set to 2 (in +use, can be uninstalled). +
  + + + + + + +
handle Device handle +
  +
callback Address of call-back entry (not pointer to address!) or 0L, 1L +or 3L +
  + +
+ +
Call-back handlers: Call-back functions are invoked by +calling the call-back entry point, they return with RTS. Call-back +functions may only modify those registers which are used to pass +arguments or results. Call-back functions must be called in supervisor +mode with at least 1024 bytes stack available. The call-back function +number is passed in D0.L. If the driver supports call-back functions, +the following functions are mandatory: +
  + + + + + + + + + +
Call-back Description +
Get Driver ID (0) call_back0: +
Input: D0.L = call-back function number, ie. 0 +
Output: D0.L = driver ID (same as the driver's XBRA ID) +
Try to remove driver (1) call_back1: +
Input: D0.L = call-back function number, ie. 1 +
Output: D0.L = result code: 0=success (card is free), 1=can't +uninstall + +
+ +
Return value: PCI-BIOS Error codes +
  +
Availability: PCI-BIOS +
  +
Group: PCI-BIOS +
  +
See also: Binding   get_card_used +
  + +
+ +

4.17.29.1 Bindings for set_card_used

+ + + + + + +
C: #include <tos.h> +
  +
int32_t set_card_used (int32_t handle, uint32_t *callback); +
  +
Assembler: +
  +
pea       callback      ; Offset 6
+move.l    handle,-(sp)  ; Offset 2
+move.w    #318,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+lea       10(sp),sp     ; Correct stack
+
+ +
+ +

4.17.30 set_interrupt

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Hardware Interrupt« +
  +
Opcode: 315 +
  +
Syntax: int32_t set_interrupt ( int32_t handle ); +
  +
Description: To be defined. Not for use by device drivers. +
  +
Return value: PCI-BIOS Error codes +
  +
Availability: PCI-BIOS +
  +
Group: PCI-BIOS +
  +
See also: Binding +
  + +
+ +

4.17.30.1 Bindings for set_interrupt

+ + + + + + +
C: #include <tos.h> +
  +
int32_t set_interrupt ( int32_t handle ); +
  +
Assembler: +
  +
move.l    handle,-(sp)    ; Offset 2
+move.w    #315,-(sp)      ; Offset 0
+trap      #14             ; Call XBIOS
+addq.l    #6,sp           ; Correct stack
+
+ +
+ +

4.17.31 special_cycle

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Generates special cycle« +
  +
Opcode: 313 +
  +
Syntax: int32_t special_cycle ( unit8_t bus, uint32_t data ); +
  +
Description: This function generates a special cycle on the PCI bus. +
  + + + + + + +
handle Bus number +
  +
data Cspecial cycle data +
  + +
+ +
Return value: PCI-BIOS Error codes +
  +
Availability: PCI-BIOS +
  +
Group: PCI-BIOS +
  +
See also: Binding +
  + +
+ +

4.17.31.1 Bindings for special_cycle

+ + + + + + +
C: #include <tos.h> +
  +
int32_t special_cycle ( unit8_t bus, uint32_t data ); +
  +
Assembler: +
  +
move.l    data,-(sp)    ; Offset 4
+move.w    bus,-(sp)     ; Offset 2
+move.w    #313,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+addq.l    #8,sp         ; Correct stack
+
+ +
+ +

4.17.32 unhook_interrupt

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: » « +
  +
Opcode: 312 +
  +
Syntax: int32_t unhook_interrupt (int32_t handle); +
  +
Description: This function removes the driver from the interrupt chain to +which a specific interrupt on the given card is routed. The driver +must turn off interrupt generation on the card before calling this +function. +
  + + + +
handle Device handle +
  + +
+ +
Return value: PCI-BIOS Error codes +
  +
Availability: PCI-BIOS +
  +
Group: PCI-BIOS +
  +
See also: Binding   hook_interrupt +
  + +
+ +

4.17.32.1 Bindings for unhook_interrupt

+ + + + + + +
C: #include <tos.h> +
  +
int32_t unhook_interrupt (int32_t handle); +
  +
Assembler: +
  +
move.l    handle,-(sp)  ; Offset 2
+move.w    #312,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+addq.l    #6,sp         ; Correct stack
+
+ +
+ +

4.17.33 virt_to_bus

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Virtual to bus« - Convert virtual to PCI bus address +
  +
Opcode: 339 +
  +
Syntax: int32_t virt_to_bus (int32_t handle, uint32_t address, uint32_t +*pointer); +
  +
Description: This function converts from virtual addresses (as the CPU uses +them) to PCI bus addresses. This is necessary since the memory may be +mapped non-linear by the PMMU even when not using virtual memory (it +is on the MILAN). +
  +
It is required that a resource (ie. a region of memory or IO +space on a PCI card) is mapped contiguously, so that a simple offset +can be used when copying to/from memory on a PCI card. +
  +
This function might be limited to TOS or TOS-like +operating systems. If an operating system uses a different memory +layout, it may need to provide its own functions which drivers can +use. +
  +
When using this function, the driver does not need to care about +DMA offsets at all. +
  + + + + + + + + + +
handle Device handle +
  +
address Address in virtual CPU space +
  +
pointer Pointer to mem-struct for results +
  + +
+ +
Return value: PCI-BIOS Error codes. If successful, mem-struct is filled as follows: +
  + + + + + + +
uint32_t PCI bus address +
uint32_t length of contiguous mapped area, 0 if no DMA is possible at +this address + +
+ +
Availability: PCI-BIOS +
  +
Group: PCI-BIOS +
  +
See also: Binding   bus_to_virt   get_pagesize   phys_to_virt   +virt_to_phys +
  + +
+ +

4.17.33.1 Bindings for virt_to_bus

+ + + + + + +
C: #include <tos.h> +
  +
int32_t virt_to_bus (int32_t handle, uint32_t address, uint32_t +*pointer); +
  +
Assembler: +
  +
pea       pointer       ; Offset 10
+move.l    address,-(sp) ; Offset 6
+move.l    handle,-(sp)  ; Offset 2
+move.w    #339,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+lea       14(sp),sp     ; Correct stack
+
+ +
+ +

4.17.34 virt_to_phys

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Virtual to physical« - Convert virtual to physical CPU +address +
  +
Opcode: 341 +
  +
Syntax: int32_t virt_to_phys (uint32_t address, uint32_t *pointer); +
  +
Description: This function converts from virtual addresses to physical CPU +addresses. This is necessary since the memory may be mapped non-linear +by the PMMU even when not using virtual memory (it is on the MILAN). +
  +
It does not depend on a special device, thus it does not get a +device handle. +
  +
This function might be limited to TOS or TOS-like +operating systems. If an operating system uses a different memory +layout, it may need to provide its own functions which drivers can +use. +
  +
When using this function, the driver does not need to care about +DMA offsets at all. +
  + + + + + + +
address Address in virtual CPU space +
  +
pointer Pointer to mem-struct for results +
  + +
+ +
Return value: PCI-BIOS Error codes. If successful, mem-struct is filled as follows: +
  + + + + + + +
uint32_t physical CPU address +
uint32_t length of contiguous mapped area, 0 if not mapped + +
+ +
Availability: PCI-BIOS +
  +
Group: PCI-BIOS +
  +
See also: Binding   bus_to_virt   get_pagesize   phys_to_virt   +virt_to_bus +
  + +
+ +

4.17.34.1 Bindings for virt_to_phys

+ + + + + + +
C: #include <tos.h> +
  +
int32_t virt_to_phys (uint32_t address, uint32_t *pointer); +
  +
Assembler: +
  +
pea       pointer       ; Offset 6
+move.l    address,-(sp) ; Offset 2
+move.w    #341,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+lea       10(sp),sp     ; Correct stack
+
+ +
+ +

4.17.35 write_config_byte

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Write configuration byte« +
  +
Opcode: 308 +
  +
Syntax: int32_t write_config_byte (int32_t handle, uint8_t reg, uint8_t +val); +
  +
Description: This function writes data to the PCI configuration space of a +given card. +
  +
The data is in little endian format, as described in the PCI +specification. +
  + + + + + + + + + +
handle Device handle +
  +
reg Register number (0,1,2,... for byte access) +
  +
val Data to write (8 bits) +
  + +
+ +
Return value: +
  +
Availability: PCI-BIOS +
  +
Group: PCI-BIOS +
  +
See also: Binding   write_config_word   write_config_longword   +read_config_byte   read_config_word   read_config_longword +
  + +
+ +

4.17.35.1 Bindings for write_config_byte

+ + + + + + +
C: #include <tos.h> +
  +
int32_t write_config_byte (int32_t handle, uint8_t reg, uint8_t +val); +
  +
Assembler: +
  +
move.w    val,-(sp)     ; Offset 8
+move.w    reg,-(sp)     ; Offset 6
+move.l    handle,-(sp)  ; Offset 2
+move.w    #308,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+lea       10(sp),sp     ; Correct stack
+
+ +
+ +

4.17.36 write_config_longword

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Write configuration longword« +
  +
Opcode: 310 +
  +
Syntax: int32_t write_config_longword (int32_t handle, uint8_t reg, +uint32_t val); +
  +
Description: This function writes data to the PCI configuration space of a +given card. +
  +
The data is in little endian format, as described in the PCI +specification. +
  + + + + + + + + + +
handle Device handle +
  +
reg Register number (0,4,8,... for Longword access) +
  +
val Data to write (32 bits) +
  + +
+ +
Return value: +
  +
Availability: PCI-BIOS +
  +
Group: PCI-BIOS +
  +
See also: Binding   write_config_byte   write_config_word   +read_config_byte   read_config_word   read_config_longword +
  + +
+ +

4.17.36.1 Bindings for write_config_longword

+ + + + + + +
C: #include <tos.h> +
  +
int32_t write_config_longword (int32_t handle, uint8_t reg, +uint32_t val); +
  +
Assembler: +
  +
move.l    val,-(sp)     ; Offset 8
+move.w    reg,-(sp)     ; Offset 6
+move.l    handle,-(sp)  ; Offset 2
+move.w    #310,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+lea       12(sp),sp     ; Stack korrigieren
+
+ +
+ +

4.17.37 write_config_word

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Write configuration word« +
  +
Opcode: 309 +
  +
Syntax: int32_t write_config_word (int32_t handle, uint8_t reg, +uint16_t val); +
  +
Description: This function writes data to the PCI configuration space of a +given card. +
  +
The data is in little endian format, as described in the PCI +specification. +
  + + + + + + + + + +
handle Device handle +
  +
reg Register number (0,2,4,... for Word access) +
  +
val Data to write (16 bits) +
  + +
+ +
Return value: +
  +
Availability: PCI-BIOS +
  +
Group: PCI-BIOS +
  +
See also: Binding   write_config_byte   write_config_longword   +read_config_byte   read_config_word   read_config_longword +
  + +
+ +

4.17.37.1 Bindings for write_config_word

+ + + + + + +
C: #include <tos.h> +
  +
int32_t write_config_word (int32_t handle, uint8_t reg, uint16_t +val); +
  +
Assembler: +
  +
move.w    val,-(sp)     ; Offset 8
+move.w    reg,-(sp)     ; Offset 6
+move.l    handle,-(sp)  ; Offset 2
+move.w    #309,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+lea       10(sp),sp     ; Correct stack
+
+ +
+ +

4.17.38 write_io_byte

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Write IO byte« +
  +
Opcode: 334 +
  +
Syntax: int32_t write_io_byte (int32_t handle, uint32_t offset, uint8_t +val); +
  +
Description: This function writes 8-bit values to a IO region. +
  + + + + + + + + + +
handle Device handle +
  +
offset Address to access (in PCI IO address space) +
  +
val Data to write (8 bits) +
  + +
+ +
Return value: PCI-BIOS Error codes +
  +
Availability: PCI-BIOS +
  +
Group: PCI-BIOS +
  +
See also: Binding   write_io_word   write_io_longword   read_io_byte   +read_io_word   read_io_longword +
  + +
+ +

4.17.38.1 Bindings for write_io_byte

+ + + + + + +
C: #include <tos.h> +
  +
int32_t write_io_byte (int32_t handle, uint32_t offset, uint8_t +val); +
  +
Assembler: +
  +
move.w    val,-(sp)     ; Offset 10
+move.l    offset,-(sp)  ; Offset 6
+move.l    handle,-(sp)  ; Offset 2
+move.w    #334,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+lea       12(sp),sp     ; Correct stack
+
+ +
+ +

4.17.39 write_io_longword

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Write IO longword« +
  +
Opcode: 336 +
  +
Syntax: int32_t write_io_longword (int32_t handle, uint32_t offset, +uint32_t val); +
  +
Description: This function writes 32-bit values to a IO region and take care +of the byte ordering - ie. the data and address are converted as if +Motorola byte ordering was in use. +
  + + + + + + + + + +
handle Device handle +
  +
offset Address to access (in PCI IO address space) +
  +
val Data to write (32 bits) +
  + +
+ +
Return value: PCI-BIOS Error codes +
  +
Availability: PCI-BIOS +
  +
Group: PCI-BIOS +
  +
See also: Binding   write_io_byte   write_io_word   read_io_byte   +read_io_word   read_io_longword +
  + +
+ +

4.17.39.1 Bindings for write_io_longword

+ + + + + + +
C: #include <tos.h> +
  +
int32_t write_io_longword (int32_t handle, uint32_t offset, +uint32_t val); +
  +
Assembler: +
  +
move.l    val,-(sp)     ; Offset 10
+move.l    offset,-(sp)  ; Offset 6
+move.l    handle,-(sp)  ; Offset 2
+move.w    #336,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+lea       14(sp),sp     ; Correct stack
+
+ +
+ +

4.17.40 write_io_word

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Write IO word« +
  +
Opcode: 335 +
  +
Syntax: int32_t write_io_word (int32_t handle, uint32_t offset, +uint16_t val); +
  +
Description: This function writes 16-bit values to a IO region and take care +of the byte ordering - ie. the data and address are converted as if +Motorola byte ordering was in use. +
  + + + + + + + + + +
handle Device handle +
  +
offset Address to access (in PCI IO address space) +
  +
val Data to write (16 bits) +
  + +
+ +
Return value: PCI-BIOS Error codes +
  +
Availability: PCI-BIOS +
  +
Group: PCI-BIOS +
  +
See also: Binding   write_io_byte   write_io_longword   read_io_byte   +read_io_word   read_io_longword +
  + +
+ +

4.17.40.1 Bindings for write_io_word

+ + + + + + +
C: #include <tos.h> +
  +
int32_t write_io_word (int32_t handle, uint32_t offset, uint16_t +val); +
  +
Assembler: +
  +
move.w    val,-(sp)     ; Offset 10
+move.l    offset,-(sp)  ; Offset 6
+move.l    handle,-(sp)  ; Offset 2
+move.w    #335,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+lea       12(sp),sp     ; Correct stack
+
+ +
+ +

4.17.41 write_mem_byte

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Write memory byte« +
  +
Opcode: 325 +
  +
Syntax: int32_t write_mem_byte (int32_t handle, uint32_t offset, +uint8_t val); +
  +
Description: This function writes 8-bit values to a memory region. A driver +can use this function for access to registers and small buffers. For +larger amounts of data, the driver can choose to use his own copy +routines. +
  + + + + + + + + + +
handle Device handle +
  +
offset Address to access (in PCI memory address space) +
  +
val Data to write (8 bits) +
  + +
+ +
Return value: PCI-BIOS Error codes +
  +
Availability: PCI-BIOS +
  +
Group: PCI-BIOS +
  +
See also: Binding   write_mem_word   write_mem_longword   read_mem_byte   +read_mem_word   read_mem_longword +
  + +
+ +

4.17.41.1 Bindings for write_mem_byte

+ + + + + + +
C: #include <tos.h> +
  +
int32_t write_mem_byte (int32_t handle, uint32_t offset, uint8_t +val); +
  +
Assembler: +
  +
move.w    val,-(sp)     ; Offset 10
+move.l    offset,-(sp)  ; Offset 6
+move.l    handle,-(sp)  ; Offset 2
+move.w    #325,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+lea       12(sp),sp     ; Correct stack
+
+ +
+ +

4.17.42 write_mem_longword

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Write memory longword« +
  +
Opcode: 327 +
  +
Syntax: int32_t write_mem_longword (int32_t handle, uint32_t offset, +uint32_t val); +
  +
Description: This function writes 32-bit values to a memory region and take +care of the byte ordering - ie. the data and address are converted as +if Motorola byte ordering was in use. A driver can use this function +for access to registers and small buffers. For larger amounts of data, +the driver can choose to use his own copy routines, provided it knows +the byte order in use. +
  + + + + + + + + + +
handle Device handle +
  +
offset Address to access (in PCI memory address space) +
  +
val Data to write (32 bits) +
  + +
+ +
Return value: PCI-BIOS Error codes +
  +
Availability: PCI-BIOS +
  +
Group: PCI-BIOS +
  +
See also: Binding   write_mem_byte   write_mem_word   read_mem_byte   +read_mem_word   read_mem_longword +
  + +
+ +

4.17.42.1 Bindings for write_mem_longword

+ + + + + + +
C: #include <tos.h> +
  +
int32_t write_mem_longword (int32_t handle, uint32_t offset, +uint32_t val); +
  +
Assembler: +
  +
move.l    val,-(sp)     ; Offset 10
+move.l    offset,-(sp)  ; Offset 6
+move.l    handle,-(sp)  ; Offset 2
+move.w    #327,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+lea       14(sp),sp     ; Correct stack
+
+ +
+ +

4.17.43 write_mem_word

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Write memory word« +
  +
Opcode: 326 +
  +
Syntax: int32_t write_mem_word (int32_t handle, uint32_t offset, +uint16_t val); +
  +
Description: This function writes 16-bit values to a memory region and take +care of the byte ordering - ie. the data and address are converted as +if Motorola byte ordering was in use. A driver can use this function +for access to registers and small buffers. For larger amounts of data, +the driver can choose to use his own copy routines, provided it knows +the byte order in use. +
  + + + + + + + + + +
handle Device handle +
  +
offset Address to access (in PCI memory address space) +
  +
val Data to write (16 bits) +
  + +
+ +
Return value: PCI-BIOS Error codes +
  +
Availability: PCI-BIOS +
  +
Group: PCI-BIOS +
  +
See also: Binding   write_mem_byte   write_mem_longword   read_mem_byte   +read_mem_word   read_mem_longword +
  + +
+ +

4.17.43.1 Bindings for write_mem_word

+ + + + + + +
C: #include <tos.h> +
  +
int32_t write_mem_word (int32_t handle, uint32_t offset, +uint16_t val); +
  +
Assembler: +
  +
move.w    val,-(sp)     ; Offset 10
+move.l    offset,-(sp)  ; Offset 6
+move.l    handle,-(sp)  ; Offset 2
+move.w    #326,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+lea       12(sp),sp     ; Correct stack
+
+ +
+ +

4.17.44 PCI-BIOS Error codes

+

The following error codes can be returned by the PCI BIOS +functions: +

+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
0x00000000PCI_SUCCESSFUL
0xFFFFFFFEPCI_FUNC_NOT_SUPPORTED
0xFFFFFFFDPCI_BAD_VENDOR_ID
0xFFFFFFFCPCI_DEVICE_NOT_FOUND
0xFFFFFFFBPCI_BAD_REGISTER_NUMBER
0xFFFFFFFAPCI_SET_FAILED
0xFFFFFFF9PCI_BUFFER_TOO_SMALL
0xFFFFFFF8PCI_GENERAL_ERROR
0xFFFFFFF7PCI_BAD_HANDLE
+
+ +

The following error codes are not returned by PCI BIOS functions +directly, but are reserved for use by a library which uses these +routines. +

+ + +
+ + + + + + + + +
0xFFFFF001PCI_BIOS_NOT_INSTALLED
0xFFFFF000PCI_BIOS_WRONG_VERSION
+
+ +
+ +Home +XBIOSXBIOS +OverScan XBIOS extensionOverScan XBIOS extension +Interface programmingInterface programming + + diff --git a/en/PrintDesc.html b/en/PrintDesc.html new file mode 100644 index 000000000..53d640d17 --- /dev/null +++ b/en/PrintDesc.html @@ -0,0 +1,45 @@ + + + + + +The documentation for TOS: PrintDesc + + + + + + + + + +Home +Type definitionsType definitions +OSHEADEROSHEADER +RGB_LISTRGB_LIST + +
+ +

I.15 PrintDesc

+

This structure plays a role in connection with MagiC Mac, and is +defined as follows: +

+
typedef struct
+{
+    THPrint     printHdl;       /* Printer-configuration for NVDI */
+    PrSetupProc doPrintSetup;   /* ditto                          */
+    VoidProcPtr saveSetup;      /* ditto                          */
+    int32_t     reserved[7];    /* Reserved                       */
+} PrintDesc;
+
+

See also: The MagiC Mac cookie +

+
+ +Home +Type definitionsType definitions +OSHEADEROSHEADER +RGB_LISTRGB_LIST + + diff --git a/en/RGB_LIST.html b/en/RGB_LIST.html new file mode 100644 index 000000000..bfde97a51 --- /dev/null +++ b/en/RGB_LIST.html @@ -0,0 +1,41 @@ + + + + + +The documentation for TOS: RGB_LIST + + + + + + + + + +Home +Type definitionsType definitions +PrintDescPrintDesc +THREADINFOTHREADINFO + +
+ +

I.16 RGB_LIST

+
typedef struct
+{
+    uint16_t red;     /* Red proportion in parts per thousand   */
+    uint16_t green;   /* Green proportion in parts per thousand */
+    uint16_t blue;    /* Blue proportion in parts per thousand  */
+} RGB_LIST;
+
+

See also: XIMG format +

+
+ +Home +Type definitionsType definitions +PrintDescPrintDesc +THREADINFOTHREADINFO + + diff --git a/en/Screen_functions.html b/en/Screen_functions.html new file mode 100644 index 000000000..64f590590 --- /dev/null +++ b/en/Screen_functions.html @@ -0,0 +1,3235 @@ + + + + + +The documentation for TOS: Screen functions + + + + + + + + + +Home +XBIOSXBIOS +xbios-trapxbios-trap +CENTScreen XBIOS extensionCENTScreen XBIOS extension + +
+ +

4.5 Screen functions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Cursconf Changes or gets cursor display. +
EgetPalette Reads colour palette. +
EgetShift Reads shift mode register. +
EsetBank Sets colour table. +
EsetColor Sets colour table entry. +
EsetGray Sets colour interpretation. +
EsetPalette Loads colour palette. +
EsetShift Sets shift mode register. +
EsetSmear Sets colour smear. +
Getrez Gets resolution. +
Initmouse Initializes mouse pointer. +
Logbase Gets address of the logical screen memory. +
mon_type Gets monitor type. +
Physbase Gets address of the physical screen memory. +
Setcolor Sets colour. +
Setpalette Selects colour palette. +
Setscreen Sets the current screen resolution and base addresses. +
ValidMode Validates a mode code. +
VgetRGB Gets RGB-value of a colour. +
VsetScreen Sets the screen resolution and base addresses. +
VgetSize Gets size of the screen buffer. +
VsetMask Sets transparency for True-Color. +
VsetMode Sets video hardware register. +
VsetRGB Sets RGB-value of a colour. +
VsetSync Sets type of synchronisation for external video. +
Vsync Gets vertical synchronisation signal. + +
+ +

4.5.1 Cursconf

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »cursor configuration« - Sets the working of the VT52 cursor +
  +
Opcode: 21 +
  +
Syntax: int16_t Cursconf( int16_t func, int16_t rate ); +
  +
Description: The XBIOS routine Cursconf alters the appearance and, if +desired, the blink rate of the cursor. The parameter func can +take the following values: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
func Meaning +
    +
 0 Switch cursor off (hide it) +
 1 Switch cursor on +
 2 Enable cursor blink +
 3 Disable cursor blink +
 4 The blink rate of the cursors will be set to the value +rate +
 5 Returns the current blink rate + +
+ +
Note: The parameter rate should be used in steps +of the screen repetition frequency. +
  +
Return value: The function only returns a defined result, namely the blink +rate, if the number 5 was passed in the parameter func. +
  +
Availability: All TOS versions. +
  +
Group: Screen functions +
  +
See also: Binding +
  + +
+ +

4.5.1.1 Bindings for Cursconf

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Cursconf( int16_t func, int16_t rate ); +
  +
Assembler: +
  +
move.w    rate,-(sp)   ; Offset 4
+move.w    func,-(sp)   ; Offset 2
+move.w    #21,-(sp)    ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.5.2 EgetPalette

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Get look up table registers« - Reads several entries from +the colour table into a specified buffer. +
  +
Opcode: 85 +
  +
Syntax: void EgetPalette( int16_t colorNum, int16_t count, int16_t +*palettePtr ); +
  +
Description: The XBIOS routine EgetPalette reads out a contiguous region +from the TT colour registers. +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
colorNum First colour register to be read out +
count Number of colour registers to be read out +
palettePtr Pointer to the colour palette to be transferred (this must be +even) + +
+ +
Return value: The function does not return a result. +
  +
Availability: The function is available only in the TOS of the Atari TT. +
  +
Group: Screen functions +
  +
See also: Binding   EsetPalette +
  + +
+ +

4.5.2.1 Bindings for EgetPalette

+ + + + + + +
C: #include <tos.h> +
  +
void EgetPalette( int16_t colorNum, int16_t count, int16_t +*palettePtr ); +
  +
Assembler: +
  +
pea       palettePtr      ; Offset 6
+move.w    count,-(sp)     ; Offset 4
+move.w    colorNum,-(sp)  ; Offset 2
+move.w    #85,-(sp)       ; Offset 0
+trap      #14             ; Call XBIOS
+lea       $A(sp),sp       ; Correct stack
+
+ +
+ +

4.5.3 EgetShift

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Get current shift mode value« - Reads the shift mode +register (the current mode of the video shifter). +
  +
Opcode: 81 +
  +
Syntax: int16_t EgetShift( void ); +
  +
Description: The XBIOS routine EgetShift reads out the shift mode register +and returns the contents of the register. +
  +
Return value: The function returns the value of the register, with the +following assignments: +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
BitMeaning
0..3Number of the colour register bank
8..10Mode, according to Getrez
12Hyper-mono (c.f. EsetGray)
15Smear mode (c.f. EsetSmear)
+
+ +
Availability: The function is available only in the TOS of the Atari TT. +
  +
Group: Screen functions +
  +
See also: Binding   EsetShift +
  + +
+ +

4.5.3.1 Bindings for EgetShift

+ + + + + + +
C: #include <tos.h> +
  +
int16_t EgetShift( void ); +
  +
Assembler: +
  +
move.w    #81,-(sp)    ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

4.5.4 EsetBank

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set color look up bank« - Sets the bank for the colour table +from the 16 available. +
  +
Opcode: 82 +
  +
Syntax: int16_t EsetBank( int16_t bankNum ); +
  +
Description: The XBIOS routine EsetBank sets the bank number for the colour +table of the TT to the value bankNum. The permitted value of +bankNum lies between 0 and 15. If bankNum is negative, +the current setting will not be altered. +
  +
Return value: The function returns the previous setting. +
  +
Availability: The function is available only in the TOS of the Atari TT. +
  +
Group: Screen functions +
  +
See also: Binding +
  + +
+ +

4.5.4.1 Bindings for EsetBank

+ + + + + + +
C: #include <tos.h> +
  +
int16_t EsetBank( int16_t bankNum ); +
  +
Assembler: +
  +
move.w    bankNum,-(sp)  ; Offset 2
+move.w    #82,-(sp)      ; Offset 0
+trap      #14            ; Call XBIOS
+addq.l    #4,sp          ; Correct stack
+
+ +
+ +

4.5.5 EsetColor

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set color entry« - Writes an entry into the colour table for +an individual colour. +
  +
Opcode: 83 +
  +
Syntax: int16_t EsetColor( int16_t colorNum, int16_t color ); +
  +
Description: The XBIOS routine EsetColor sets the colour entry +colorNum (0..255) in the colour table to the value +color; a negative value does not alter the entry. +
  +
Return value: The function returns the previous setting. +
  +
Availability: The function is available only in the TOS of the Atari TT. +
  +
Group: Screen functions +
  +
See also: Binding   Setcolor +
  + +
+ +

4.5.5.1 Bindings for EsetColor

+ + + + + + +
C: #include <tos.h> +
  +
int16_t EsetColor( int16_t colorNum, int16_t color ); +
  +
Assembler: +
  +
move.w    color,-(sp)     ; Offset 4
+move.w    colorNum,-(sp)  ; Offset 2
+move.w    #83,-(sp)       ; Offset 0
+trap      #14             ; Call XBIOS
+addq.l    #6,sp           ; Correct stack
+
+ +
+ +

4.5.6 EsetGray

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set/clear gray mode« - Switches on or off the colour +interpretation in the video shifter. +
  +
Opcode: 86 +
  +
Syntax: int16_t EsetGray( int16_t switch ); +
  +
Description: The XBIOS routine EsetGray switches on (1) or off (0) the +colour interpretation in the colour table as a greytone. A negative +value returns the grey bit of the video shifter but does not alter the +setting. +
  +
In greytone mode one can select from a palette of 256 greytones +(0-255) instead of 4096 colours (RGB 0-15). +
  +
Return value: The function returns the previous value of the video shifter's +grey bit. +
  +
Availability: The function is available only in the TOS of the Atari TT +(when the high word of the '_VDO' cookie has the value of 2). +
  +
Group: Screen functions +
  +
See also: Binding +
  + +
+ +

4.5.6.1 Bindings for EsetGray

+ + + + + + +
C: #include <tos.h> +
  +
int16_t EsetGray( int16_t switch ); +
  +
Assembler: +
  +
move.w    switch,-(sp) ; Offset 2
+move.w    #86,-(sp)    ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.5.7 EsetPalette

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set palette registers« - Sets several entries in the colour +table from the specified buffer. +
  +
Opcode: 84 +
  +
Syntax: void EsetPalette( int16_t colorNum, int16_t count, int16_t +*palettePtr ); +
  +
Description: The XBIOS routine EsetPalette sets count colour +entries from colorNum on in the colour table to the values in +array palettePtr. +
  +
Return value: The function has no return. +
  +
Availability: The function is available only in the TOS of the Atari TT. +
  +
Group: Screen functions +
  +
See also: Binding   EgetPalette +
  + +
+ +

4.5.7.1 Bindings for EsetPalette

+ + + + + + +
C: #include <tos.h> +
  +
void EsetPalette( int16_t colorNum, int16_t count, int16_t +*palettePtr ); +
  +
Assembler: +
  +
pea       palettePtr      ; Offset 6
+move.w    count,-(sp)     ; Offset 4
+move.w    colorNum,-(sp)  ; Offset 2
+move.w    #84,-(sp)       ; Offset 0
+trap      #14             ; Call XBIOS
+lea       $A(sp),sp       ; Correct stack
+
+ +
+ +

4.5.8 EsetShift

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set shift mode register« - Sets the shift mode registers of +the video shifter. +
  +
Opcode: 80 +
  +
Syntax: int16_t EsetShift( int16_t shftMode ); +
  +
Description: The XBIOS routine EsetShift writes to the shift mode register +of the TT the value shftMode. shftMode is a bit array with the +following assignments: +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
BitMeaning
0..3Number of the colour register bank
8..10Mode according to Getrez
12Hyper-mono (c.f. EsetGray)
15Smear mode (c.f. EsetSmear)
+
+ +
Return value: The function returns the previous value of the register. +
  +
Availability: The function is available only in the TOS of the Atari TT. +
  +
Group: Screen functions +
  +
See also: Binding   EgetShift +
  + +
+ +

4.5.8.1 Bindings for EsetShift

+ + + + + + +
C: #include <tos.h> +
  +
int16_t EsetShift( int16_t shftMode ); +
  +
Assembler: +
  +
move.w    shftMode,-(sp)  ; Offset 2
+move.w    #80,-(sp)       ; Offset 0
+trap      #14             ; Call XBIOS
+addq.l    #4,sp           ; Correct stack
+
+ +
+ +

4.5.9 EsetSmear

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set/clear video smear mode« - Switches on (1) or off (0) the +smear mode of the video shifter. +
  +
Opcode: 87 +
  +
Syntax: int16_t EsetSmear( int16_t switch ); +
  +
Description: The XBIOS routine EsetSmear permits switching of the smear +mode of the TT video shifter. In smear mode, the last displayed pixel +colour is drawn in each case instead of the background colour (colour +0). +
  +

+
+ + + + + + + + + + + + + + + + +
switchMeaning
<0Obtain existing value
0Smear mode off
>0Smear mode on
+
+ +
Return value: The function returns the existing setting. +
  +
Availability: The function is available only in the TOS of the Atari TT. +
  +
Group: Screen functions +
  +
See also: Binding +
  + +
+ +

4.5.9.1 Bindings for EsetSmear

+ + + + + + +
C: #include <tos.h> +
  +
int16_t EsetSmear( int16_t switch ); +
  +
Assembler: +
  +
move.w    switch,-(sp)  ; Offset 2
+move.w    #87,-(sp)     ; Offset 0
+trap      #14           ; Call XBIOS
+addq.l    #4,sp         ; Correct stack
+
+ +
+ +

4.5.10 Getrez

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »get resolution« - Return current screen resolution code. +
  +
Opcode: 4 +
  +
Syntax: int16_t Getrez( void ); +
  +
Description: The XBIOS routine Getrez obtains the current resolution of the +screen. +
  +
Return value: The function returns the following values: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueMeaning
0 320*200 (4 planes)
1 640*200 (2 planes)
2 640*400 (one plane)
4 640*480 (4 planes, TT only)
61280*960 (one plane, TT only)
7 320*480 (8 planes, TT only)
+
+ +
All other values are reserved for future extensions. +
  +
Note: For the sake of clean programming this function +should not be used, as it is very dependent on the hardware; +particularly when graphics cards are in use, it has practically no +meaning. Instead, the screen resolution should be obtained via the +VDI function (v_opnvwk). +
  +
Availability: All TOS versions. +
  +
Group: Screen functions +
  +
See also: Binding   v_opnvwk +
  + +
+ +

4.5.10.1 Bindings for Getrez

+ + + + + + +
C: #include <portab.h> +
#include <tos.h> +
  +
int16_t Getrez( void ); +
  +
Assembler: +
  +
move.w    #4,-(sp)     ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

4.5.11 Initmouse

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »initialize mouse« - Initializes the mouse handler. +
  +
Opcode: 0 +
  +
Syntax: void Initmouse( int16_t type, MOUSE *par, void (*mousevec)() ); +
  +
Description: Initmouse is a XBIOS routine for low-level initialization of +the mouse. The parameter type sets the working mode of the +mouse. The following apply: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
typeMeaning
0Disable mouse
1Enable mouse in relative mode
2Enable mouse in absolute mode
3Unused
4Enable mouse in key-code mode
+
+ +
The bytes from 4 to 11 of the parameter par are only +used when the mouse is to work in absolute mode. With mousevec +you can set a new mouse interrupt vector. The vector will reset if you +disable the mouse (type=0). +
  +
Return value: The function return -1 if it OK or 0 if no error has occurred. +
  +
Availability: All TOS versions. +
  +
Group: Screen functions +
  +
See also: Binding   MOUSE +
  + +
+ +

4.5.11.1 Bindings for Initmouse

+ + + + + + +
C: #include <tos.h> +
  +
void Initmouse( int16_t type, MOUSE *par, void (*mousevec)() ); +
  +
Assembler: +
  +
pea       mousevec     ; Offset 8
+pea       par          ; Offset 4
+move.w    type,-(sp)   ; Offset 2
+move.w    #0,-(sp)     ; Offset 0
+trap      #14          ; Call XBIOS
+lea       12(sp),sp    ; Correct stack
+
+ +
+ +

4.5.12 Logbase

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »logical screen RAM base« - Returns a pointer to the logical +start address of the video memory. +
  +
Opcode: 3 +
  +
Syntax: void *Logbase( void ); +
  +
Description: The XBIOS routine Logbase obtains the logical start address of +the RAM region currently being used for the video memory. +
  +
Return value: The function returns the start address of the logical screen +memory. +
  +
Availability: All TOS versions. +
  +
Group: Screen functions +
  +
See also: Binding   Physbase   Setscreen +
  + +
+ +

4.5.12.1 Bindings for Logbase

+ + + + + + +
C: #include <tos.h> +
  +
void *Logbase( void ); +
  +
Assembler: +
  +
move.w    #3,-(sp)     ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

4.5.13 mon_type

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »mon_type« - Identify the monitor type. +
  +
Opcode: 89 +
  +
Syntax: int16_t mon_type( void ); +
  +
Description: The XBIOS function mon_type identifies the type of monitor +connected, based on pin 18(M1) and 19(M0) of the video port. A 0-bit +means ground at the corresponding pin, a 1-bit means no connection. +
  +
Return value: The function returns the type of monitor connected. The +following applies: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueMeaningPin
0ST monochrome monitorM1:0 M0:0
1ST colour monitorM1:0 M0:1
2VGA monitorM1:1 M0:0
3TV devicetM1:1 M0:1
4LCD 
5DVI 
+
+ +
Value four and five only available with ct60 and Radeon driver. +
  +
Availability: The function is only available on computers of the Falcon +series. +
  +
Group: Screen functions +
  +
See also: Binding   VsetSync   VsetMode   VgetSize   VgetRGB   VsetRGB   +VsetMask +
  + +
+ +

4.5.13.1 Bindings for mon_type

+ + + + + + +
C: +
  +
int16_t mon_type( void ); +
  +
Assembler: +
  +
move.w    #89,-(sp)    ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

4.5.14 Physbase

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »physical screen ram base« - Returns the physical start +address of the video memory. +
  +
Opcode: 2 +
  +
Syntax: void *Physbase( void ); +
  +
Description: The XBIOS routine Physbase returns the physical start address +of the RAM region currently being used for the video memory. +
  +
Return value: The function Physbase returns the start address of the physical +screen memory. +
  +
Availability: All TOS versions. +
  +
Group: Screen functions +
  +
See also: Binding   Logbase   Setscreen +
  + +
+ +

4.5.14.1 Bindings for Physbase

+ + + + + + +
C: #include <tos.h> +
  +
void *Physbase( void ); +
  +
Assembler: +
  +
move.w    #2,-(sp)     ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

4.5.15 Setcolor

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Setcolor« - Sets one of 16 colours. +
  +
Opcode: 7 +
  +
Syntax: int16_t Setcolor( int16_t colornum, int16_t color ); +
  +
Description: The XBIOS routine Setcolor obtains the value of a colour +register or sets this to a new value. The following apply: +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
colornumNumber of the colour register (0..15)
colorNew colour value (-1 = don't alter)
+
+ +
Return value: The function returns the old value of the colour register. +
  +
Availability: All TOS versions. +
  +
Group: Screen functions +
  +
See also: Binding   Setpalette +
  + +
+ +

4.5.15.1 Bindings for Setcolor

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Setcolor( int16_t colornum, int16_t color ); +
  +
Assembler: +
  +
move.w    color,-(sp)    ; Offset 4
+move.w    colornum,-(sp) ; Offset 2
+move.w    #7,-(sp)       ; Offset 0
+trap      #14            ; Call XBIOS
+addq.l    #6,sp          ; Correct stack
+
+ +
+ +

4.5.16 Setpalette

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »set palette« - Selects 16 colours. +
  +
Opcode: 6 +
  +
Syntax: void Setpalette( void *pallptr ); +
  +
Description: The XBIOS routine Setpalette permits the passing of a new +colour palette to the video hardware. +
  +
The parameter pallptr points to a table of sixteen +16-bit words that contain the new palette. The lowest 12-bits are used +here for the RGB values. pallptr must point to an even +address. +
  +
As the function's data are not processed immediately, one has to +ensure that the pointer pallptr still points to something +sensible in the next vertical blank. +
  +
Note: It is better to make use of the corresponding +functions of the VDI. +
  +
Return value: The function does not return a value. +
  +
Availability: All TOS versions. +
  +
Group: Screen functions +
  +
See also: Binding +
  + +
+ +

4.5.16.1 Bindings for Setpalette

+ + + + + + +
C: #include <tos.h> +
  +
void Setpalette( void *pallptr ); +
  +
Assembler: +
  +
pea       pallptr      ; Offset 2
+move.w    #6,-(sp)     ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.5.17 Setscreen

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »set screen« - Initializes the screen. +
  +
Opcode: 5 +
  +
Syntax: void Setscreen( void *laddr, void *paddr, int16_t rez ); +
  +
Description: The XBIOS routine Setscreen serves to alter the screen +resolution and screen memory addresses. The following apply: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
laddrAddress of the logical screen memory
paddrAddress of the physical screen memory
rez0 = ST Low
   1 = ST Medium
   2 = ST High
+
+ +
A value of -1 here means that the corresponding address or +resolution will not be altered. +
  +
Note: One should always check whether possible changes +were really performed successfully. During resolution changes the +VT52 emulator is automatically initialized. +
  +
Under some circumstances there is an extended version of this +function (VsetScreen). +
  +
Return value: The function does not return a result. +
  +
Availability: All TOS versions. +
  +
Group: Screen functions +
  +
See also: Binding   Physbase   Logbase   Getrez +
  + +
+ +

4.5.17.1 Bindings for Setscreen

+ + + + + + +
C: #include <tos.h> +
  +
void Setscreen( void *laddr, void *paddr, int16_t rez ); +
  +
Assembler: +
  +
move.w    rez,-(sp)    ; Offset 10
+move.l    paddr,-(sp)  ; Offset  6
+move.l    laddr,-(sp)  ; Offset  2
+move.w    #5,-(sp)     ; Offset  0
+trap      #14          ; Call XBIOS
+lea       $C(sp),sp    ; Correct stack
+
+ +
+ +

4.5.18 Setscreen, Milan

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »set screen« - Initializes the screen. +
  +
Opcode: 5 +
  +
Syntax: void Setscreen( void *par1, void *par2, int16_t rez, int16_t +command ); +
  +
Description: This XBIOS routine corresponds to the Setscreen function with +additional parameters, and serves for altering the screen resolution +and screen memory addresses. +
  + +

+
+ + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
par1Depending on function - see below
par2Depending on function - see below
rezalways 0x4D49 (MI_MAGIC)
commandCommand
+
+ +
The following values are defined for command: +
  +
+
+
CMD_GETMODE (0)
+
+

Getting current mode +
  +
int32_t mode; +
Setscreen(-1, &mode, MI_MAGIC, CMD_GETMODE); +
  +

+

+ + +
CMD_SETMODE (1)
+
+

Set new graphic mode +
  +
int32_t mode=0x1023 /* 800*608*16 */ +
Setscreen(-1, mode, MI_MAGIC, CMD_SETMODE) +
  +
BIOS and VDI will be initialised. Not the AES. +
  +

+

+ + +
CMD_GETINFO (2)
+
+

Get screen info structure for mode +
  +

SCREENINFO si;
+/* Structure size has to be set         */
+si.size=sizeof(SCREENINFO);
+/* ID of the mode or 0 for current mode */
+si.devID=0x1023;
+/* status of the operation              */
+si.scrFlags=0;
+Setscreen(-1, &si, MI_MAGIC, CMD_GETINFO);
+if(si.scrFlags & SCRINFO_OK)
+  puts("OK");
+else
+  puts("Error");
+
+
+

+ + +
CMD_ALLOCPAGE (3)
+
+

Allocate 2nd screenpage +
  +

int32_t adr=0;      /* Frame address or -1 */
+Setscreen(&adr, mode, MI_MAGIC, CMD_ALLOCPAGE);
+if(adr)
+  puts("OK");
+else
+  puts("Error");
+
+
This only allocates one page. A further call will only return +the frame address. +
  +
+

+ + +
CMD_FREEPAGE (4)
+
+

Release 2nd screenpage +
  +
Setscreen(-1, -1, MI_MAGIC, CMD_FREEPAGE) +
  +
The graphics card memory will be released again. If the second +page had still been active the call will switch back to the first page +with Logbase and Physbase set. +
  +

+

+ + +
CMD_FLIPPAGE (5)
+
+

Switch to 2nd screenpage +
  +
Setscreen(-1, -1, MI_MAGIC, CMD_FLIPPAGE) +
  +
Will switch to the second screenpage. Logbase and Physbase will +be set. +
  +

+

+ + +
CMD_ALLOCMEM (6)
+
+

Allocate memory on the graphics card +
  +

SCRMEMBLK blk;
+
+blk.size=sizeof(SCRMEMBLK);
+/* alloc a block of 200 lines*/
+blk.blk_y=200;
+
+Setscreen(-1, &blk, MI_MAGIC, CMD_ALLOCMEM);
+if(blk.blk_start)
+  puts("OK");
+else
+  puts("Out of memory");
+
+
The width of the block is currently always the width of the +virtual screen. For the hardware functions this block will be like a +screen (0,0,blk_w,blk_h), the coordinates start in the top left corner +(0,0). It will be internally recalculated. +
  +
+

+ + +
CMD_FREEMEM (7)
+
+

Release graphics card memory +
  +
Setscreen(-1, &blk, MI_MAGIC, CMD_FREEMEM) +
blk of the block to be released. +
  +

+

+ + +
CMD_SETADR (8)
+
+

Set screen to fixed address +
  +

/* logical address or -1  */
+int32_t logbase=blk.blk_start;
+/* physical address or -1 */
+int32_t physbase=blk.blk_start;
+
+Setscreen(logbase, physbase, MI_MAGIC, CMD_SETADR);
+
+
+
+
+

+ + +
CMD_ENUMMODES (9)
+
+

Requests all available modes, since 13.01.2000 +
  +

int32_t cdecl enumfunc(SCREENINFO *inf,int32_t flag)
+{
+  printf("%s\n",inf->name);
+  return ENUMMODE_CONT;
+}
+
+Setscreen(-1, &enumfunc, MI_MAGIC, CMD_ENUMMODES);
+
+
The function "enumfunc" will be called once for every +available mode. ENUMMODE_EXIT (0) will cancel CMD_ENUMMODES. +ENUMMODE_CONT (1) will continue. The parameters are handed over to the +stack using the C standard. +
  +

+ +
+
CMD_TESTMODE (10)
+
+

This function only exist inside the ct60 with internal TOS +Radeon driver. +
  +

+ +
+
+
Return value: Return value undefined. +
  +
Availability: The function is available from the MilanTOS 4.08 onwards. +
  +
Group: Screen functions +
  +
See also: Setscreen   VsetScreen   Setscreen, ct60 +
  + +
+ +

4.5.19 Setscreen, ct60

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »set screen« - Initializes the screen +
  +
Opcode: 5 +
  +
Syntax: void Setscreen( void *par1, void *par2, int16_t rez, int16_t +command ); +
  +
Description: This XBIOS routine corresponds to the Setscreen function with +additional parameters, and serves for altering the screen resolution +and screen memory addresses. +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
par1Depending on function - see below
par2Depending on function - see below
rezAlways 0x564E ('VN' for VsetScreen New)
commandCommand
+
+ +
The following values are defined for command: +
  +
+
CMD_GETMODE (0)
+
+

Getting current mode +
  +
int32_t mode; +
Setscreen(-1,&mode,0x564E,CMD_GETMODE); +
  +

+ +
+
CMD_SETMODE (1)
+
+

Set new graphic mode +
  +
int32_t mode=0x1023 /* 800*608*16 */ +
Setscreen(-1,mode,0x564E,CMD_SETMODE) +
  +
This function is identical to VsetScreen(0, 0, 3, modecode); +
BIOS and VDI will be initialised. Not the AES. +
  +

+ +
+
CMD_GETINFO (2)
+
+

Get screen info structure for mode +
  +

SCREENINFO si;
+/* Structure size has to be set         */
+si.size=sizeof(SCREENINFO);
+/* ID of the mode or 0 for current mode */
+si.devID=0x1023;
+/* status of the operation              */
+si.scrFlags=0;
+Setscreen(-1,&si,0x564E,CMD_GETINFO);
+if(si.scrFlags & SCRINFO_OK)
+  puts("OK");
+else
+  puts("Error");
+
+

+ +
+
CMD_ALLOCPAGE (3)
+
+

Allocate screenpage +
  +

/* Frame address or -1 */
+int32_t adr=0;
+Setscreen(&adr,mode,0x564E,CMD_ALLOCPAGE);
+if(adr)
+  puts("OK");
+else
+  puts("Error");
+
+
This only allocates one page. A further call will only return +the frame address. +
  +

+ +
+
CMD_FREEPAGE (4)
+
+

Release screenpage +
  +
Setscreen(-1,-1,0x564E,CMD_FREEPAGE) +
  +
The graphics card memory will be released again. If the second +page had still been active the call will switch back to the first page +with Logbase and Physbase set. +
  +

+ +
+
CMD_FLIPPAGE (5)
+
+

Switch to screenpage +
  +
Setscreen(-1,-1,0x564E,CMD_FLIPPAGE) +
  +
Will switch to the second screenpage. Logbase and Physbase will +be set. +
  +

+ +
+
CMD_ALLOCMEM (6)
+
+

Allocate memory on the graphics card +
  +

SCRMEMBLK blk;
+
+blk.size=sizeof(SCRMEMBLK);
+/* alloc a block of 200 lines*/
+blk.blk_y=200;
+
+Setscreen(-1,&blk,0x564E,CMD_ALLOCMEM);
+if(blk.blk_start)
+  puts("OK");
+else
+  puts("Out of memory");
+
+
The width of the block is currently always the width of the +virtual screen. For the hardware functions this block will be like a +screen (0,0,blk_w,blk_h), the coordinates start in the top left corner +(0,0). It will be internally recalculated. +
  +

+ +
+
CMD_FREEMEM (7)
+
+

Release graphics card memory +
  +
Setscreen(-1,&blk,0x564E,CMD_FREEMEM) +
blk of the block to be released. +
  +

+ +
+
CMD_SETADR (8)
+
+

Set screen to fixed address +
  +

/* logical address or -1  */
+int32_t logbase=blk.blk_start;
+/* physical address or -1 */
+int32_t physbase=blk.blk_start;
+
+Setscreen(logbase,physbase,0x564E,CMD_SETADR);
+
+

+ +
+
CMD_ENUMMODES (9)
+
+

Requests all available modes +
  +

int32_t cdecl enumfunc(SCREENINFO *inf,int32_t flag)
+{
+  printf("%s\n",inf->name);
+  return ENUMMODE_CONT;
+}
+
+Setscreen(-1,&enumfunc,0x564E,CMD_ENUMMODES);
+
+
The function "enumfunc" will be called once for every +available mode. ENUMMODE_EXIT (0) will cancel CMD_ENUMMODES. +ENUMMODE_CONT (1) will continue. The parameters are handed over to the +stack using the C standard. +
  +
+

+ + +
CMD_TESTMODE (10)
+
+

Test a graphic mode +
  +

/* 800*600*16M */
+int32_t modecode=VESA_600+HORFLAG2+VGA+COL80+BPS32;
+Setscreen(-1,modecode,0x564E,CMD_TESTMODE);
+
+
Only the BIOS is initialised, and a screen test arrives with +colored wide lines. +
  +
This function not exist inside the MilanTOS. +
  +
+

+ + +
CMD_COPYPAGE (11)
+
+

Copy screenpage +
  +

VsetScreen(-1,0,0x564E,CMD_COPYPAGE);
+Copy first screenpage to second screenpage
+VsetScreen(-1,1,0x564E,CMD_COPYPAGE);
+Copy second screenpage to first screenpage
+
+
This function not exist inside the MilanTOS. +
  +
+

+ + +
CMD_FILLMEM (12)
+
+

Fill memory on the graphics card +
  +

SCRFILLMEMBLK blk;
+blk.size=sizeof(SCRFILLMEMBLK);
+blk.blk_op = BLK_COPY;
+blk.blk_color = 0x112233;  /* background fill color */
+
+VsetScreen(-1,&blk,0x564E,CMD_SETMEM);
+if(blk.blk_status == BLK_OK)
+  puts("OK");
+
+
Fill a block with a color with the GPU at (blk_x, blk_y), size +is blk_w, blk_h. +
Note that this structure has the same size and same entry the the +structure SCRMEMBLK for the entry for size, blk_status, blk_x, blk_y, +blk_y, blk_w and blk_h for use the allocated structure with a cast. +
  +
This function exists since the version 0x0101 of the video XBIOS +and is not inside the MilanTOS. +
  +
+

+ + +
CMD_COPYMEM (13)
+
+

Copy memory on the graphics card +
  +

SCRCOPYMEMBLK blk;
+blk.size=sizeof(SCRCOPYMEMBLK);
+
+VsetScreen(-1,&blk,0x564E,CMD_COPYMEM);
+if(blk.blk_status == BLK_OK)
+  puts("OK");
+
+
Copy a block with the GPU at (blk_src_x, blk_src_y) to +(blk_dst_x, blk_dst_y), size is blk_w, blk_h. +
Note that this structure has the same size and same entry the the +structure SCRMEMBLK for the entry for size, blk_status, blk_x, blk_y, +blk_y, blk_w and blk_h for use the allocated structure with a cast +when blk_x is blk_dst_x and blk_y is blk_dst_y. +
  +
This function exists since the version 0x0101 of the video XBIOS +and is not inside the MilanTOS. +
  +
+

+ + +
CMD_TEXTUREMEM (14)
+
+

Put texture in memory on the graphics card +
  +

SCRTEXTUREMEMBLK blk;
+blk.size=sizeof(SCRTEXTUREMEMBLK);
+
+VsetScreen(-1,&blk,0x564E,CMD_TEXTUREMEM);
+if(blk.blk_status == BLK_OK)
+  puts("OK");
+
+
Copy a 65K texture from CPU local area to a 65K screen or an +ARGB texture to a 32M screen pixel format multiple times (best results +are with little source texture and big screen for destination). +
  +
This function need a texture support inside the TOS. +
This function exists since the version 0x0101 of the video XBIOS +and is not inside the MilanTOS. +
  +
+

+ + +
CMD_GETVERSION (15)
+
+

+
  +

/* if the function is not implemented, 0x0100 is the first release */
+long version = 0x0100;
+VsetScreen(-1,&version,0x564E,CMD_GETVERSION);
+
+
Return the version of the video XBIOS. +
  +
This function exists since the version 0x0101 of the video XBIOS +and is not inside the MilanTOS. +
  +
+

+ + +
CMD_LINEMEM (16)
+
+

Draw line on the graphics card +
  +

SCRLINEMEMBLK blk;
+blk.size=sizeof(SCRLINEMEMBLK);
+blk.blk_fbcolor = 0x112233;  /* foreground fill color */
+blk.blk_bgcolor = 0;  /* background fill color */
+blk.blk_pattern = 0xffffffff;  /* solid line */
+
+VsetScreen(-1,&blk,0x564E,CMD_LINEMEM);
+if(blk.blk_status == BLK_OK)
+  puts("OK");
+
+
Draw a line with colors with the GPU at (blk_x1, blk_y1) to +(blk_x2, blk_y2). +
  +
This function exists since the version 0x0101 of the video XBIOS +and is not inside the MilanTOS. +
  +
+

+ + +
CMD_CLIPMEM (17)
+
+

Set clipping rectangle on the graphic card +
  +

SCRCLIPMEMBLK blk;
+blk.size=sizeof(SCRCLIPMEMBLK);
+blk.blk_clip_on = 1; /* clipping flag 1:on,
+                                      0:off */
+
+VsetScreen(-1,&blk,0x564E,CMD_CLIPMEM);
+if(blk.blk_status == BLK_OK)
+  puts("OK");
+
+
Enable or diable clipping rectange at (blk_x, blk_y), size is +blk_w, blk_h. +
  +
This function exists since the version 0x0101 of the video XBIOS +and is not inside the MilanTOS. +
  +
+

+ + +
CMD_SYNCMEM (18)
+
+

Wait an empty GPU fifo for sync the drawing engine with the +memory. +
  +

VsetScreen(-1,-1,0x564E,CMD_SYNCMEM);
+
+
This function exists since the version 0x0101 of the video XBIOS +and is not inside the MilanTOS. +
  +
+

+ + +
CMD_BLANK (19)
+
+

Blank / unblank screen. +
  +

int32_t blank = 1; /* (0): unblank
+                      (1): blank normal
+                      (2): VSYNC suspend
+                      (3): HSYNC suspend
+                      (4): powerdown */
+VsetScreen(-1,blank,0x564E,CMD_BLANK);
+
+
This function exists since the version 0x0101 of the video XBIOS +and is not inside the MilanTOS. +
  +

+ +
+
+
Return value: Nothing (or current modecode in TOS mode) +
  +
Availability: Only valid with internal TOS Radeon driver (PCI.HEX) for the +ct60 (2007-01-24). +
  +
Group: Screen functions +
  +
See Also: Setscreen   VsetScreen   Setscreen, Milan +
  + +
+ +

4.5.20 ValidMode

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Name: «ValidMode» - Validates a mode code. +
  +
Opcode: 95 +
  +
Syntax: int16_t ValidMode( int16_t mode ); +
  +
Description: The XBIOS function ValidMode returns a valid version of the +specified mode code, depending on the monitor that is connected. The +bits of the parameter mode have the following meaning: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
BitMeaning
0-2Number of colour planes:
 0 = 1 plane 2 colours
 1 = 2 planes 4 colours
 2 = 4 planes 16 colours
 3 = 8 planes 256 colours
 4 = 16 planes 65536 colours
  
3Set: Image width at least 640 pixels (80 columns)
 Cleared: Image width 320 pixels (40 columns)
  
4Set: VGA mode
 Cleared: TV mode (also Atari SC monitors)
  
5Set: PAL mode
 Cleared: NTSC mode
  
6Set: Overscan active (not valid for VGA)
7Set: ST-compatible graphics
8Set: Interlace mode (on colour monitor or
 double-line mode (on VGA monitor) active
+
+ +
Note: This function is not officially documented and +some development tools may also call it Validmode or VcheckMode. +
  +
Return value: The function returns a valid mode code. +
  +
Availability: The function is only available on computers of the Falcon +series, Milan and CT60. +
  +
Group: Screen functions +
  +
See also: Binding   mon_type   VsetSync   VgetSize VgetRGB   VsetRGB   +VsetMask   VsetMode +
  + +
+ +

4.5.20.1 Bindings for ValidMode

+ + + + + + +
C: int16_t ValidMode( int16_t mode ); +
  +
Assembler: +
  +
move.w    mode,-(sp)    ; Offset 2
+move.w    #95,-(sp)     ; Offset 0
+trap      #14           ; Call XBIOS
+addq.l    #4,sp         ; Correct stack
+
+ +
+ +

4.5.21 VgetRGB

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »VgetRGB« - Obtain the RGB values of a colour palette. +
  +
Opcode: 94 +
  +
Syntax: void VgetRGB( int16_t index, int16_t count, int32_t *array ); +
  +
Description: The XBIOS function VgetRGB obtains the RGB values for +count colours starting from the colour index index. +The resulting values are stored in array. +
  +
Note: One should not try to backup more color than +supported by the video mode. +
  +
Return value: The function does not return a result. +
  +
Availability: The function is only available on computers of the Falcon +series. +
  +
Group: Screen functions +
  +
See Also: Binding   mon_type   VsetMode   VsetSync   VgetSize   VsetRGB   +VsetMask +
  + +
+ +

4.5.21.1 Bindings for VgetRGB

+ + + + + + +
C: #include <tos.h> +
  +
void VgetRGB( int16_t index, int16_t count, int32_t *array ); +
  +
Assembler: +
  +
move.l    array,-(sp)  ; Offset 6
+move.w    count,-(sp)  ; Offset 4
+move.w    index,-(sp)  ; Offset 2
+move.w    #94,-(sp)    ; Offset 0
+trap      #14          ; Call XBIOS
+lea       $A(sp),sp    ; Correct stack
+
+ +
+ +

4.5.22 VsetScreen

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »set screen« - initializes the screen. +
  +
Opcode: 5 +
  +
Syntax: void VsetScreen( void *laddr, void *paddr, int16_t rez, int16_t +mode ); +
  +
Description: The XBIOS routine VsetScreen corresponds to the Setscreen +function with an additional parameter, and serves for altering the +current screen resolution and screen memory addresses. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
laddrAddress of the logical screen memory
paddrAddress of the physical screen memory
rez0 = ST Low
   1 = ST Medium
   2 = ST High
   3 = Resolution used, from mode
modemodecode (see VsetMode)
+
+ +
A value of -1 here means that the corresponding address or +resolution will not be altered. +
  +
Note: One should always check whether possible changes +were really performed successfully. During resolution changes the +VT52 emulator is automatically initialized. +
  +
The additional parameter mode is only available if the +cookie '_VDO' has the value 0x00030000 or greater. +
  +
For the TOS of the Milan there is an additional function for +Setscreen, entsprechendes gilt auch für den ct60. +
  +
Return value: The function does not return a result. +
  +
Availability: The function is only available on computers of the Falcon +series. +
  +
Group: Screen functions +
  +
See also: Binding +
  + +
+ +

4.5.22.1 Bindings for VsetScreen

+ + + + + + +
C: #include <tos.h> +
  +
void VsetScreen( void *laddr, void *paddr, int16_t rez, int16_t +mode ); +
  +
Assembler: +
  +
move.w    mode,-(sp)   ; Offset 12
+move.w    rez,-(sp)    ; Offset 10
+move.l    paddr,-(sp)  ; Offset  6
+move.l    laddr,-(sp)  ; Offset  2
+move.w    #5,-(sp)     ; Offset  0
+trap      #14          ; Call XBIOS
+lea       14(sp),sp    ; Correct stack
+
+ +
+ +

4.5.23 VgetSize

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »VgetSize« - Return the size of the screen buffer. +
  +
Opcode: 91 +
  +
Syntax: int32_t VgetSize( int16_t mode ); +
  +
Description: The XBIOS function VgetSize returns the size of the screen +buffer in bytes for the graphic mode mode. +
  +
Return value: The function returns the size of the screen buffer in bytes. +
  +
Availability: The function is only available on computers of the Falcon +series. +
  +
Group: Screen functions +
  +
See also: Binding   mon_type   VsetMode   VsetSync   VgetRGB   VsetRGB   +VsetMask +
  + +
+ +

4.5.23.1 Bindings for VgetSize

+ + + + + + +
C: #include <tos.h> +
  +
int32_t VgetSize( int16_t mode ); +
  +
Assembler: +
  +
move.w    mode,-(sp)    ; Offset 2
+move.w    #91,-(sp)     ; Offset 0
+trap      #14           ; Call XBIOS
+addq.l    #4,sp         ; Correct stack
+
+ +
+ +

4.5.24 VsetMask

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »VsetMask« - Set transparency for TrueColor. +
  +
Opcode: 150 +
  +
Syntax: void VsetMask( int32_t ormask, int32_t andmask, int16_t overlay +); +
  +
Description: The XBIOS function VsetMask sets masks that are used to modify +the colours set by the VDI function vs_color. vs_color obtains for +its parameter an RGB value. This is ORd bitwise with ormask +and ANDed with andmask. Thus colours may appear as transparent +in TrueColor mode. If overlay is non-zero a switch is made +into the overlay mode, or if zero switched back out of it. +
  +
Return value: The function does not return a result. +
  +
Availability: The function is only available on computers of the Falcon +series. +
  +
Group: Screen functions +
  +
See also: Binding   mon_type   VsetMode   VsetSync   VgetSize   VgetRGB   +VsetRGB +
  + +
+ +

4.5.24.1 Bindings for VsetMask

+ + + + + + +
C: #include <tos.h> +
  +
void VsetMask( int32_t ormask, int32_t andmask, int16_t overlay +); +
  +
Assembler: +
  +
move.w    overlay,-(sp) ; Offset 10
+move.l    andmask,-(sp) ; Offset 6
+move.l    ormask,-(sp)  ; Offset 2
+move.w    #150,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+lea       12(sp),sp     ; Correct stack
+
+ +
+ +

4.5.25 VsetMode

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »VsetMode« - Set video hardware registers. +
  +
Opcode: 88 +
  +
Syntax: int16_t VsetMode( int16_t mode ); +
  +
Description: The XBIOS function VsetMode programs the video hardware +register of the Falcon computer. The bits of the parameter +mode have the following meaning: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
BitMeaning
0-2Number of colour planes:
 0 = 1 plane 2 colours
 1 = 2 planes 4 colours
 2 = 4 planes 16 colours
 3 = 8 planes 256 colours
 4 = 16 planes 65536 colours
  
3Set: Image width at least 640 pixels (80 columns)
 Cleared: Image width 320 pixels (40 columns)
  
4Set: VGA mode
 Cleared: TV mode (also Atari SC monitors)
  
5Set: PAL mode
 Cleared: NTSC mode
  
6Set: Overscan active (not valid for VGA)
7Set: ST-compatible graphics
8Set: Interlace mode (on colour monitor or
 double-line mode (on VGA monitor) active
+
+ + +
If VM_INQUIRE (-1) is passed as mode one will get the +current resolution without changing anything. +
  +
Note: There is no check of the correctness of the coding +for the connected monitor. +
  +
Return value: The function returns the old contents of the video hardware +register. +
  +
Availability: The function is only available on computers of the Falcon +series. +
  +
Group: Screen functions +
  +
See also: Binding   mon_type   VsetSync   VgetSize VgetRGB   VsetRGB   +VsetMask +
  + +
+ +

4.5.25.1 Bindings for VsetMode

+ + + + + + +
C: #include <tos.h> +
  +
int16_t VsetMode( int16_t mode ); +
  +
Assembler: +
  +
move.w    mode,-(sp)    ; Offset 2
+move.w    #88,-(sp)     ; Offset 0
+trap      #14           ; Call XBIOS
+addq.l    #4,sp         ; Correct stack
+
+ +
+ +

4.5.26 VsetRGB

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »VsetRGB« - Set the RGB value of a colour. +
  +
Opcode: 93 +
  +
Syntax: void VsetRGB( int16_t index, int16_t count, int32_t *array ); +
  +
Description: The XBIOS function VsetRGB sets the RGB values for +count palette entries starting from the palette index +index. The colour values are stored in array. +
  +
Note: One should not try to restore more colors than +supported by the video mode. +
  +
Return value: The function does not return a result. +
  +
Availability: The function is only available on computers of the Falcon +series. +
  +
Group: Screen functions +
  +
See also: Binding   mon_type   VsetMode   VsetSync   VgetSize   VgetRGB   +VsetMask +
  + +
+ +

4.5.26.1 Bindings for VsetRGB

+ + + + + + +
C: #include <tos.h> +
  +
void VsetRGB( int16_t index, int16_t count, int32_t *array ); +
  +
Assembler: +
  +
move.l    array,-(sp)  ; Offset 6
+move.w    count,-(sp)  ; Offset 4
+move.w    index,-(sp)  ; Offset 2
+move.w    #93,-(sp)    ; Offset 0
+trap      #14          ; Call XBIOS
+lea       $A(sp),sp    ; Correct stack
+
+ +
+ +

4.5.27 VsetSync

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »VsetSync« - Sets the type of external synchronisation. +
  +
Opcode: 90 +
  +
Syntax: void VsetSync( int16_t flag ); +
  +
Description: The XBIOS function VsetSync determines how the video is to be +synchronized. The parameter flag is coded as follows: +
  +

+
+ + + + + + + + + + + + + + + + +
BitMeaning for set bits
0Use external clock
1Use external vertical sync
2Use external horizontal sync
+
+ +
Return value: The function does not return a result. +
  +
Availability: The function is only available on computers of the Falcon +series. +
  +
Group: Screen functions +
  +
See also: Binding   mon_type   VsetMode   VgetSize   VgetRGB   VsetRGB   +VsetMask +
  + +
+ +

4.5.27.1 Bindings for VsetSync

+ + + + + + +
C: #include <tos.h> +
  +
void VsetSync( int16_t flag ); +
  +
Assembler: +
  +
move.w    flag,-(sp)   ; Offset 2
+move.w    #90,-(sp)    ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.5.28 Vsync

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »vertical sync« - Hold process until next vertical sync +signal. +
  +
Opcode: 37 +
  +
Syntax: void Vsync( void ); +
  +
Description: The XBIOS routine Vsync holds up program execution until the +next screen refresh (vertical blank interrupt). This makes it possible +to synchronize screen operations with the operating system. +
  +
Note: For time-critical operations (scrolling) it is +better to have recourse directly to the line counter in the Shifter. +
  +
Return value: The function does not return a result. +
  +
Availability: All TOS versions. +
  +
Group: Screen functions +
  +
See also: Binding +
  + +
+ +

4.5.28.1 Bindings for Vsync

+ + + + + + +
C: #include <tos.h> +
  +
void Vsync( void ); +
  +
Assembler: +
  +
move.w    #37,-(sp)    ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

4.5.29 Constants for the Falcon's video hardware

+

To simplify programming of the video hardware register of the +Falcon with the function VsetMode, the following constants are defined +in the header file tos.h, which can be combined with | : +

+
    #define VERTFLAG  0x0100  /* Activate interlace                */
+    #define STMODES   0x0080  /* ST-compatible graphics            */
+    #define OVERSCAN  0x0040  /* Activate overscan                 */
+    #define PAL       0x0020  /* PAL mode                          */
+    #define FALC_VGA  0x0010  /* VGA mode                          */
+    #define TV        0x0000  /* TV mode                           */
+
+    #define COL80     0x0008  /* Picture width at least 640 pixels */
+                                                      (80 columns) */
+    #define COL40     0x0000  /* Picture width 320 pixels (40 col.)*/
+
+    #define BPS16     4       /* 16 colour planes: 65536 colours   */
+    #define BPS8      3       /*  8 colour planes:   256 colours   */
+    #define BPS4      2       /*  4 colour planes:    16 colours   */
+    #define BPS2      1       /*  2 colour planes:     4 colours   */
+    #define BPS1      0       /*  1 colour plane:      2 colours   */
+
+

With the following constant the number of colour planes can be +masked out: +

+
    #define NUMCOLS   7       /* if (( mode & NUMCOLS ) == 0 ) */
+                              /*   puts( "monochrome mode" );  */
+
+
+ +Home +XBIOSXBIOS +xbios-trapxbios-trap +CENTScreen XBIOS extensionCENTScreen XBIOS extension + + diff --git a/en/THREADINFO.html b/en/THREADINFO.html new file mode 100644 index 000000000..54df47e89 --- /dev/null +++ b/en/THREADINFO.html @@ -0,0 +1,59 @@ + + + + + +The documentation for TOS: THREADINFO + + + + + + + + + +Home +Type definitionsType definitions +RGB_LISTRGB_LIST +XCPBXCPB + +
+ +

I.17 THREADINFO

+
typedef struct
+{
+   int32_t cdecl (*proc)(void *par);
+   void          *user_stack;
+   uint32_t      stacksize;
+   int16_t       mode;
+   int32_t       res1;
+} THREADINFO;
+
+

Note: If the component user_stack is NULL, then +the system will create the stack itself. When the thread terminates, +the system will release the stack again automatically. The component +stacksize must always be specified so that the system can set +the stack pointer of the thread to the end of the stack. The +supervisior-stack is set by the operating system, so that its size +cannot be influenced. +

+

The components mode and res1 are reserved for +future purposes, so they should be set to the value 0 or 0L. In +Solaris 2.x, for instance, one can arrest the thread up to the final +start with them. The started thread executes the function +proc, which is passed as a parameter to the component +par (on the stack). The CPU registers d0-d2 and a0-a2 may be +altered by the function. +

+

See also: Threads in MagiC   shel_write   Sample code +

+
+ +Home +Type definitionsType definitions +RGB_LISTRGB_LIST +XCPBXCPB + + diff --git a/en/VDI_fundamentals.html b/en/VDI_fundamentals.html new file mode 100644 index 000000000..dadd20951 --- /dev/null +++ b/en/VDI_fundamentals.html @@ -0,0 +1,4363 @@ + + + + + +The documentation for TOS: VDI fundamentals + + + + + + + + + +Home +VDIVDI +About the VDIAbout the VDI +VDI bindingsVDI bindings + +
+ +

7.2 VDI fundamentals

+ +

The VDI (Virtual Device Interface) +forms the lower half of GEM; it is so to speak the basis of all AES +functions. +

+

Even if one normally regards the VDI primarily as providing +functions for graphics output, its tasks also extend to inputs +(such as with the mouse or graphics tablet, for instance). Hence +the VDI is an operating system layer for addressing (in the widest +sense) graphics- oriented output and input devices. This +section describes the items: +

+ + +

As the word 'virtual' already indicates, nearly all function +calls can be applied to any available output device (screen, printer, +plotter, slide maker, imagesetter etc.). So it makes no difference +whether one wants to draw circles or output text: this can be realized +with the same operating system functions in each case. +

+ +

The roots of the VDI lie in the CP/M-GSX system, which arose +at the start of the eighties from the requirement for a portable +graphics interface for the then-dominant CP/M systems. Similarities in +the functions and designations to the GKS (Graphical +Kern System) are hence by no means accidental but were +fully intented by the Digital Research developers. +

+

The VDI complies with the ANSI standard X3H3.6CG-VDI. +

+

See also: Style guidelines +

+

7.2.1 Clipping

+

Clipping is a procedure that is really only made possible by the +use of a windowed operating system. For this one uses a clipping +rectangle which specifies to which part of the screen all graphic +outputs of the relevant workstation are to be restricted; everything +that protrudes outside the specified image section will be omitted in +the screen output. +

+

A low efficency but easily programmed window output routine +would simply set one clipping rectangle for each partial rectangle of +the window and then repeat all screen outputs required for building up +the window contents. If you take the trouble to first make plausibi- +lity checks whether the object to be drawn is actually going to be +visible, you can naturally save a considerable amount of time. +

+

Note: Like so much else in life, clipping too is not +available for free. If you want to achieve optimum speed for screen +build-ups, you should switch off the clipping rectangle as often as +possible. +

+

See also: VDI fundamentals   Style guidelines   vs_clip +

+

7.2.2 About the GDOS

+ + + + + + +

Several functions of the VDI can only be used properly after +the installation of a GDOS from the AUTO folder. Basically a GDOS +(Graphics Device Operating System) +allows the loading of various device drivers and fonts, and then to +use them. +

+

The GDOS itself is completely independent of the device used. +Only the post-loaded drivers that realize the VDI functions on the +correspon- ding device are device-specific. With detailed knowledge of +the driver format it is possible to use any - even exotic - output +devices as a VDI output device. +

+

With resident GDOS the number of available VDI functions +increases, while all other functions remain fully functional or +contain extended output capabilities. However this is not the case the +other way round, functions that require GDOS lead to a crash of the +computer if GDOS is not resident. +

+ +

The family tree of the GDOS family

+ +

Therefore it is important to know in some cases whether a +complete GDOS is installed at all. Atari has documented the +following procedure for this purpose: The trap-dispatcher alters the +input value -2 for register d0 only when a GDOS is installed. Many +compilers make the function vq_gdos available, which returns a +value of 0 when no GDOS is installed. This functions is based +essentially on the following code: +

+
vq_gdos:      move.w   #-2,d0
+              trap     #2
+              cmp.w    #-2,d0
+              sne      d0
+              ext.w    d0
+              rts
+
+

Important note: vq_gdos only returns the information +whether a GDOS is present, or not. Nothing is said about which +GDOS is loaded or which capabilities the GDOS offers. So with the aid +of this function it is not possible, for instance, to +differentiate between AMC-GDOS and SpeedoGDOS or NVDI. +

+ +

Attention: The GEM versions of the Dutch software house +"ABC" (ABC-GEM 2.x) will crash at this call! +

+ + +

Alternatively there is also vq_vgdos (_vq_gdos): +

+
vq_vgdos:     move.w   #-2,d0
+              trap     #2
+              rts
+
+ + + + + + +

As return one receives: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameValueGDOS Type
GDOS_NONE-2GDOS not installed.
-Any other value.GDOS 1.0 or 1.2
GDOS_ATARI0x0007E88AGDOS 1.1 from Atari Corp.
GDOS_AMC0x0007E864AMC-GDOS from Arnd Beissner
GDOS_AMCLIGHT0x0007E8BAGEMINI-special GDOS from Arnd Beissner
-0x3e5d0957ttf-gdos from Trevor Blight
GDOS_FNT0x5F464E54 ('_FNT')FONTGDOS
GDOS_FSM0x5F46534D ('_FSM')FSMGDOS
-0x66564449 ('fVDI')fVDI
+
+ +

The current (and more efficient) versions of GDOS are SpeedoGDOS and +NVDI (as of Version 3.0), that, amid other things, permit handling +vector fonts in TrueType, Type-1 or Speedo format. NVDI is also +available in a special Macintosh version (NVDIMac), and +permits any program that can ouput via GDOS (in conjunction with MagiC +Mac) to make its output on Apple printers and in a network as well. +

+

See also: ASSIGN.SYS file   VDI fundamentals   Style guidelines +

+

7.2.3 The make-up of the ASSIGN.SYS file

+

The declaration of fonts and drivers in the ASSIGN.SYS file is +made according to the following scheme: +

+
<Device number> <Option> <Name of the driver> <Comment>
+
+

Example: +

+
; ASSIGN.SYS file
+path = C:\gemsys
+
+01p screen.sys    ; Screen driver (ROM)
+monaco10.fnt      ; Font (10 point)
+monaco12.fnt      ; Font (12 point)
+monaco18.fnt      ; Font (18 point)
+monaco24.fnt      ; Font (24 point)
+
+21r laserjet.sys  ; HP Laserjet   (resident)
+22r necp.sys      ; NEC Pinwriter (resident)
+
+31 meta.sys       ; Metafile drivers
+81 t_office.sys   ; Tele-Office
+
+

The variable path sets the directory in which drivers +and fonts will be looked for by GDOS. Comments are always preceded by +a semi- colon. +

+

Under Option one can add a flag for each driver that +specifies some further particulars; the following apply: +

+ + + + + + + + + + + + + + + + + + +
Option Meaning +
    +
'p' If NVDI is active, then the matching NVDI screen driver is +loaded automatically; otherwise the driver of the Atari VDI that is +present in ROM will be used +
'r' The driver will be loaded on booting the system, and remains +permanently in memory +
'r ' The specified font will be loaded on booting the +system, and remains resident in memory +
's ' Incorporates the specified font as the system font. +
Note: In this way the real system fonts may be replaced; +the new font must have the same size and number of characters as the +old font. + +
+ +

Warning: If there is no letter after a device +identifier, then the driver will be loaded on demand, and later +removed from the system again. Only bitmap (pixel) fonts but +no vector fonts can be declared in the ASSIGN.SYS file. +

+ +

Incidentally, as of PC-GEM/3 the file ASSIGN.SYS no longer +exists. There the drivers of the devices as well as fonts that are to +be installed are simply copied to the folder \GEMAPPS\GEMSYS or to the +folder \GEMAPPS\FONTS. +

+

See also: GDOS drivers   VDI fundamentals +

+

7.2.4 GDOS drivers

+ + + +

A GDOS driver is essentially a normal program file without a +startup code, which contains a dispatcher for the incoming VDI +calls as a first routine. All drivers must be declared in the +ASSIGN.SYS file that is evaluated by GDOS at the start. +

+

The following list shows the most important drivers with their +respective device numbers: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Screen driver (01-10) +
Plotter driver (11-20) +
Printer driver (21-30) +
Metafile driver (31-40) +
Camera driver (41-50) +
Tablet driver (51-60) +
Memory driver (61-70) +
Fax driver (81-90) +
Bit-Image driver (91-100) +
Multimedia driver (101-110) +
Sound driver (111-120) +
Load and draw Bit-Image driver (121-130) + +
+ +

For implementing the dispatcher one should respect the +following: +

+
    +
  • The address of the VDI parameter block is passed in register +D1 +
  • +
  • The function itself is terminated with an RTS statement +
  • +
+ +

A GDOS driver always operates in a raster-coordinate system; the +conversion of values in the ptsin and ptsout fields is taken on by the +GDOS. In addition one should bear in mind that not all functions reach +the actual driver in exactly the same form as they were sent, since +they are partially pre-processed by the GDOS. +

+

See also: GDOS   VDI fundamentals   Bindings of the VDI +

+

7.2.4.1 Screen drivers

+ + +

The TOS screen driver can be replaced by a custom driver, +which has to be post-loaded by the GDOS. +

+

Such drivers exist already for various graphics cards (e.g. +NVDI- ET4000 for graphics cards with the Tseng ET-4000 chip). +

+

When acquiring an alternative screen driver, one should ensure +that the driver supports all relevant functions of the VDI, and +also has no problems with GEM fonts. +

+

See also: GDOS drivers   Minimum range of functions +

+

7.2.4.2 Minimum range of functions for screen drivers

+

The following list describes the range of functions that a +screen driver should offer as a minimum; this comes from a +specification from the Atari GEM Programmer's Guide. +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OpcodeSubcodeFunction
1v_opnwk
2v_clswk
3v_clrwk
4v_updwk
5Escape functions:
1vq_chcells
2v_exit_cur
3v_enter_cur
4v_curup
5v_curdown
6v_curright
7v_curleft
8v_curhome
9v_eeos
10v_eeol
11v_curaddress
12v_curtext
15vq_curaddress
18v_dspcur
19v_rmcur
6v_pline
7v_pmarker
8v_gtext
9v_fillarea
11Output functions:
1v_bar
2v_arc
3v_pieslice
4v_circle
5v_ellipse
6v_ellarc
7v_ellpie
8v_rbox
9v_rfbox
10v_justified
12vst_height
14vs_color
15vsl_type
17vsl_color
18vsm_type
20vsm_color
21vst_font
22vst_color
23vsf_interior
24vsf_style
25vsf_color
26vq_color
28vrq_locator
31vrq_string
32vswr_mode
33vsin_mode
35vql_attributes
36vqm_attributes
37vqf_attributes
38vqt_attributes
39vst_alignment
100v_opnvwk
101v_clsvwk
102vq_extnd
104vsf_perimeter
106vst_effects
107vst_point
108vsl_ends
109vro_cpyfm
110vr_trnfm
111vsc_form
112vsf_udpat
113vsl_udsty
114vr_recfl
115vqin_mode
116vqt_extent
117vqt_width
118vex_timv
121vrt_cpyfm
122v_show_c
123v_hide_c
124vq_mouse
125vex_butv
126vex_motv
127vex_curv
128vq_key_s
129vs_clip
130vqt_name
131vqt_fontinfo
+
+ +

7.2.4.3 Bit-image drivers

+ + +

With the aid of a bit-image driver, all applications that can +output via GDOS can print directly to a file. +

+

With NVDI drivers, one can set the page format and the name of +the bit-image file for v_opnwk. The filename can also be passed with +the help of vq_extnd: +

+
contrl[1]   = 4;
+ptsin[2]    = 1157;
+ptsin[3..4] = Pointer to the filename (BYTE *);
+ptsin[5..6] = Pointer to the error variable (int16_t *);
+ptsin[7]    = 0;
+
+

Note: One can certainly argue about the sense or +nonsense of this feature, since vq_extnd is actually a pure +information function! +

+

See lso: GDOS drivers   ASSIGN.SYS file +

+

7.2.4.4 Printer drivers

+ + +

The selection of printer drivers for GDOS is at present almost +inexhaustible; the only bottleneck seems to be for some colour +printers. +

+

When working with printer drivers one should note that not all +drivers are completely identical functionally. So when using, say, a +laser printer there are not only extra functions, but some of the +existing ones may be partly extended as well. +

+

For NVDI printer drivers one can set the page format and the +GEMDOS output device for v_opnwk. For outputting (colour) images one +should use the vrt_cpyfm or vro_cpyfm functions. They can be addressed +in NVDI for printer drivers (and IMG, etc.) exactly like the +functions of the screen driver. The only difference is that rasters +cannot be moved within a printer bitmap (source and destination MFDB +with fd_addr == 0L), as the printer bitmap generally consists of +several slices that are handled sequentially. But this difference +presents no restrictions, since copying within the device bitmap makes +no sense for printer output! +

+

If necessary, the printer driver buffers the bitmap in the +display list should insufficient memory be available; there is +therefore no need to hold the bitmap in memory with v_updwk until +output. +

+

If the bitmap has to be scaled, the program should not itself +enlarge the bitmap if possible, but leave this work to +vrt_cpyfm/vro_cpyfm. This improves the output quality, less data has +to be buffered on the hard drive, and the printout is speeded up. +Whether the driver is capable of scaling can be established with the +vq_extnd call. +

+

When outputting colour images in 8-colour mode, rasters should +be treated before dithering with a correction function. Recommended is +a gamma correction with an exponent of 0.3 to 0.4, so that the image +does not appear completely dull and oversaturated. In TrueColor mode +the driver performs colour correction, black separation and other +quality improvements itself - bitmaps here should be sent without +previous correction and without rasterising to the driver. +

+

See also: GDOS drivers   Bitmap format for printer drivers   +Minimum range of function +

+

7.2.4.5 Minimum range of functions for printer drivers

+

The following list describes the range of functions that a +printer driver should offer as a minimum; this comes from a +specification from the Atari GEM Programmer's Guide. +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OpcodeSubcodeFunction
1v_opnwk
2v_clswk
3v_clrwk
4v_updwk
5Escape functions:
1vq_chcells
20v_form_adv
21v_output_window
22v_clear_disp_list
23v_bit_image
6v_pline
7v_pmarker
8v_gtext
9v_fillarea
11Output functions:
1v_bar
2v_arc
3v_pieslice
4v_circle
5v_ellipse
6v_ellarc
7v_ellpie
8v_rbox
9v_rfbox
10v_justified
12vst_height
15vsl_type
17vsl_color
18vsm_type
20vsm_color
21vst_font
22vst_color
23vsf_interior
24vsf_style
25vsf_color
26vq_color
32vswr_mode
35vql_attributes
36vqm_attributes
37vqf_attributes
38vqt_attributes
39vst_alignment
102vq_extnd
104vsf_perimeter
106vst_effects
107vst_point
108vsl_ends
112vsf_udpat
116vqt_extent
117vqt_width
129vs_clip
130vqt_name
131vqt_fontinfo
+
+ +

7.2.4.6 Bitmap format for printer drivers

+ +

Just as for the screen, vq_scrninfo returns the format of the +bitmap for printers as well. As a rule, there are only 3 different +formats here: +

+
    +
  • Monochrome bitmap, if the driver has 2 colours. +
  • +
  • Three sequential planes, if the driver has 8 colours. +
  • +
  • Packed pixels with 32 bits, if the driver runs in TrueColor +mode. +
  • +
+ +

As formats (1) and (3) will be self-explanatory, we only need to +deal with format (2) here: For 8 colours, a coloured bitmap consists +of 3 complete planes lying sequentially in memory. So the +device-specific raster format corrresponds to the standard format. The +allocation of the VDI colour index to pixel values follows the +standard arrangement that applies to all VDI drivers. +

+

See also: Printer drivers   Raster formats   vro_cpyfm   +vrt_cpyfm +

+

7.2.4.7 Fax drivers

+ + +

A fax driver is, in principle, nothing more than a simple +printer driver. With the help of such a driver, all applications that +output via GDOS can send faxes directly. +

+

For a fax driver one can specify neither a page format nor a +GEMDOS device. One should also not attempt to alter the size of the +bitmap. +

+

See also: GDOS drivers   ASSIGN.SYS file +

+

7.2.4.8 Tablet drivers

+ + +

As no drivers for graphics tablets exist at present, it is not +possible to give further information here. +

+

See also: GDOS drivers   ASSIGN.SYS file +

+

7.2.4.9 Camera drivers

+ + +

As no drivers for the Polaroid palette exist at present, +it is not possible to give further information here. +

+

See also: GDOS drivers   Minimum range of functions +

+

7.2.4.10 Minimum range of functions for camera drivers

+

The following list describes the range of functions that a +camera driver should offer as a minimum; this comes from a +specification from Digital Research for PC-GEM 2.0: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OpcodeSubcodeFunction
1v_opnwk
2v_clswk
3v_clrwk
4v_updwk
5Escape functions:
1vq_chcells
23v_bit_image
91vsp_film
92vqp_filmname
6v_pline
11Output functions:
1v_bar
2v_arc
3v_pieslice
4v_circle
5v_ellipse
6v_ellarc
7v_ellpie
8v_rbox
9v_rfbox
10v_justified
12vst_height
13vst_rotation
14vs_color
15vsl_type
16vsl_width
17vsl_color
18vsm_type
19vsm_height
20vsm_color
21vst_font
22vst_color
23vsf_interior
24vsf_style
25vsf_color
26vq_color
32vswr_mode
35vql_attributes
36vqm_attributes
37vqf_attributes
38vqt_attributes
39vst_alignment
102vq_extnd
104vsf_perimeter
106vst_effects
107vst_point
108vsl_ends
112vsf_udpat
113vsl_udsty
116vqt_extent
117vqt_width
119vst_load_fonts
120vst_unload_fonts
129vs_clip
130vqt_name
131vqt_fontinfo
+
+ +

7.2.4.11 Memory drivers

+ + +

A memory driver is, in principle, a screen driver for which the +output does not end up in the screen memory, but in another part of +the memory, and which can then be processed further there. +

+

The drivers available at present only support a monochrome +bitmap, and have a logical resolution of 300dpi. Unfortunately the +aspect ratio does not usually correspond to the current resolution of +the screen, which has the result that circles, for instance, will be +represented as ellipses. +

+

The resolution of the bitmap may be set with v_opnwk, by writing +the value 1 in ptsin[0..1] for width-1 or height-1 as well as in +contrl[1]. After calling the function, the address of the bitmap is +returned in contrl[0..1]. In addition it is also possible to set the +bitmap size with vq_extnd. In that case it is also possible to pass a +custom buffer; for this one sets contrl[3] to the value 3 and passes +in intin[1..2] a pointer to the buffer. +

+

Due to greater flexibility, one should give preference to +off-screen bitmaps over memory drivers. +

+

See also: GDOS drivers   ASSIGN.SYS file +

+

7.2.4.12 Metafile drivers

+ + +

A metafile driver saves all calls directed to it in a GEM +metafile which lies in the current directory of the application and +has the name GEMFILE.GEM by default. +

+

If one wishes to alter the name, then directly after v_opnwk +call the function vm_filename, which can be passed a complete filename +with the desired path and name. +

+

So that other programs can depict a metafile sensibly, one +should call the functions v_meta_extents, vm_pagesize and vm_coords. +

+

See also: +
v_meta_extents   vm_pagesize   vm_coords   GDOS drivers   Minimum range of functions +

+

7.2.4.13 Minimum range of functions for metafile drivers

+

The following list describes the range of functions that a +metafile driver should offer as a minimum; this comes from a +specification from the Atari GEM Programmer's Guide. +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OpcodeSubcodeFunction
1v_opnwk
2v_clswk
3v_clrwk
4v_updwk
5Escape functions:
1vq_chcells
2v_exit_cur
3v_enter_cur
20v_form_adv
21v_output_window
22v_clear_disp_list
23v_bit_image
98v_meta_extents
99v_write_meta
100vm_filename
6v_pline
7v_pmarker
8v_gtext
9v_fillarea
11Output functions:
1v_bar
2v_arc
3v_pieslice
4v_circle
5v_ellipse
6v_ellarc
7v_ellpie
8v_rbox
9v_rfbox
10v_justified
12vst_height
13vst_rotation
14vs_color
15vsl_type
16vsl_width
17vsl_color
18vsm_type
19vsm_height
20vsm_color
21vst_font
22vst_color
23vsf_interior
24vsf_style
25vsf_color
26vq_color
32vswr_mode
35vql_attributes
36vqm_attributes
37vqf_attributes
38vqt_attributes
39vst_alignment
102vq_extnd
103v_contourfill
104vsf_perimeter
106vst_effects
107vst_point
108vsl_ends
112vsf_udpat
113vsl_udsty
114vr_recfl
117vqt_width
129vs_clip
131vqt_fontinfo
+
+ +

7.2.4.14 Plotter drivers

+ + +

After a long drought, GDOS plotter drivers too have become +available. So, for instance, the program DATA is supplied with +an HPGL driver, and also the PD disk number 458 of the magazine +ST-Computer you will find such a driver. +

+

More detailed information about plotter drivers is not available +at present. +

+

See also: GDOS drivers   Minimum range of functions +

+

7.2.4.15 Minimum range of functions for plotter drivers

+

The following list describes the range of functions that a +plotter driver should offer as a minimum; this comes from a +specification from the Atari GEM Programmer's Guide. +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OpcodeSubcodeFunction
1v_opnwk
2v_clswk
3v_clrwk
4v_updwk
5Escape functions:
1vq_chcells
6v_pline
7v_pmarker
8v_gtext
9v_fillarea
11Output functions:
1v_bar
2v_arc
3v_pieslice
4v_circle
5v_ellipse
6v_ellarc
7v_ellpie
8v_rbox
9v_rfbox
10v_justified
12vst_height
15vsl_type
17vsl_color
18vsm_type
20vsm_color
21vst_font
22vst_color
23vsf_interior
24vsf_style
25vsf_color
35vql_attributes
36vqm_attributes
37vqf_attributes
38vqt_attributes
39vst_alignment
102vq_extnd
104vsf_perimeter
107vst_point
108vsl_ends
116vqt_extent
117vqt_width
130vqt_name
131vqt_fontinfo
+
+ +

7.2.5 VDI coordinate systems

+

The VDI distinguishes two different types of coordinate +systems: +

+
    + + + +
  • Raster coordinates (RC): When using this system one can +use the exact coordinate system native to the output device. For a +screen this corresponds to the available horizontal and vertical +pixels. The point of origin lies in the top left corner. +
    The main advantage of raster coordinates is the absolutely exact +positioning, which alone enables precise work with screen rasters +(windows etc). +
      + + + + +

  • +
  • Normalized coordinates (NDC): This system always has a +maximum resolution of 32768*32768 points. When a device driver is +called the VDI will automatically recalculate to the device's +physical coordinate system. The origin lies in the bottom left +corner. For working with the NDC system a GDOS has to have been +installed - the screen driver in ROM can not handle NDC +coordinates. +
      +

  • +
+ +

The following illustration makes the difference between RC and +NDC coordinates particularly clear: +

+

+

Note: In practice the NDC system is seldom used. +Programs that have to offer exact dimensioning (desktop publishing, +scientific graphics) must in any case use internally their own - finer +- coordinate representation. +

+

The use of the NDC system would mean that the coordinates would +have to be converted twice (once from the internal representation in +NDC coordinates, then to raster coordinates), which would lead to +superfluous speed losses and rounding errors. +

+

See also: VDI fundamentals   Style guidelines +

+

7.2.6 Metafile format

+

Metafiles are nothing more than saved VDI commands, which are +used in object-oriented programs such as GEMDRAW or +Kandinsky. The main purpose here is a standardized data +exchange between different GEM applications. A metafile starts with +a header that describes the charactersitics of the graphic contained +in it, and is constructed as follows: +

+ +
typedef struct
+{
+   int16_t id;           /* Always has the value 0xffff          */
+   int16_t headlen;      /* Length of the header                 */
+   int16_t version;      /* Version number                       */
+   int16_t transform;    /* NDC or RC coordinate system          */
+   int16_t extents[4];   /* Max. size of the graphic (optional)  */
+   int16_t pagesize[2];  /* Page size in 1/10 mm     (optional)  */
+   int16_t coords[4];    /* Coordinate system        (optional)  */
+   int16_t bit_image;    /* Bit-image present (1) or not (0)     */
+   int16_t reserved[9];  /* Reserved                             */
+} META_HEADER;
+
+

Note: The component bit_image of the header +specifies whether a bit- image file is present in the metafile file. +Actually no metafile contains a pixel graphic; if, for instance, one +draws in GEMPAINT an image named 'test', then the program +creates besides a file 'test.img' another file 'test.gem'; the latter +contains just one VDI command (v_bit_image), and the component +bit_image then has the value 1. +

+

When reading a metafile, no fixed length is used; instead, an +appli- cation first reads the two first words (and with that the +length) of the header. Subsequently the rest of the header is read. +This is followed by any number of entries in the form: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
WordContentsAssignment
0contrl[0]VDI command number
1contrl[1]Number of values in ptsin
2contrl[3]Number of values in intin
3contrl[5]Subfunction number
from 4ptsin[]Allocation of the ptsin field
thenintin[]Allocation of the intin field
+
+ +

The end of a metafile is indicated by the value -1 (for +contrl[0]). +

+

Important: Metafiles are always stored in the Intel +format (low-high). Hence to handle metafiles on a 680X0 system, +the lower- and higher- valued byte have to be swapped for each word as +it is read. +

+ + + + + + + + + + + + + + + + + + + + + + +

With the component pagesize one can obtain data about +page-width and height. If one wants to create metafiles, then these +two values should be assigned standard sizes. The following standard +sizes are supported by most GEM programs: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
LabelInchCentimeter
Letter8,50 * 11,0021,59 * 27,94
Legal8,50 * 14,0021,59 * 35,56
Half8,50 * 5,5021,59 * 13,97
Ledger11,00 * 17,0027,94 * 43,18
DIN A311,69 * 16,5429,70 * 42,00
DIN A48,07 * 11,6921,00 * 29,70
DIN A55,85 * 8,2714,80 * 21,00
DIN B57,17 * 9,8418,20 * 25,00
Wide14,00 * 11,0035,56 * 27,94
+
+ +

The values for pagesize[0] (width) and +pagesize[1] (height) result from the centimeter values +multiplied by 100. +

+

See also: +
Metafile drivers   Metafile functions   Sub-opcodes   XIMG format   OUT file format +

+

7.2.6.1 Metafile sub-opcodes

+

The GEM metafile format can be extended by user-defined +sub-opcodes to almost any extent without giving rise to +incompatibilities. One should merely pay attention to the following +two points: +

+
    +
  • As the numbers from 0 to 100 are reserved for the operating +system, only sub-opcodes numbers from 101 on are available. +
      +

  • +
  • Each developer should make sure that any opcode planned by him +is not already in use elsewhere, to ensure frictionless data +exchanges. +
      +

  • +
+ +

The following list contains a description of the opcodes defined +and known at present: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Code Name Description +
    + + +
  10 GEM_START_GROUP Defines the start of a group, i.e. of a set of associated +objects + + +
  11 GEM_END_GROUP Marks the end of a group, i.e. of a set of associated objects + +
  32 GEM_BEZ_QUAL See v_bez_qual +
  34 ??? No information available at present + + +
  49 GEM_NO_LINE_STYLE Any kind of line style should be switched off + + +
  50 GEM_START_SHADOW Says that the following VDI commands up to GEM_END_SHADOW +should be used to draw a shadow for the first object after +GEM_END_SHADOW + + +
  51 GEM_END_SHADOW Marks the end of a sequence of commands that are used for +drawing an object shadow, and are introduced by GEM_START_SHADOW + + + + +
  80 GEM_START_FILL   +
  81 GEM_END_FILL All commands lying between these two codes are used to draw a +filled area with or without a surround +
Example: Stepwise drawing of a polygon area with shadow +and surround: +
    +
  • GEM_START_FILL +
  • +
  • GEM_START_SHADOW +
  • +
  • Set fill attribute for shadow +
  • +
  • v_fillarea displaced by dx and dy +
  • +
  • GEM_END_SHADOW +
  • +
  • Set fill attribute for the area +
  • +
  • v_fillarea +
  • +
  • Set line attribute for the surround +
  • +
  • v_pline +
  • +
  • GEM_END_FILL +
  • +
+ + + +
 101 VM_VER_APP Gives information about the name and the version number of an +application that created a metafile; the following apply: + + + + + + + + + + + + + + + + + + +
intin[0] = VM_VER_APP +
intin[1] = Version number +
intin[2] = Name of the application that +
: created the metafile +
:   +
intin[n]   + +
+ +
Note: The name of the application should always be given +without the suffix, as this can be different on various GEM +systems + + +
 102 GEM_COLOR No information available at present +
 103 ??? No information available at present +
 107 ??? No information available at present +
 111 ??? No information available at present + + +
 170 GEM_START_BGIF Starts text output with a BGI vector font; the following apply: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
intin[0] = GEM_START_BGIF +
intin[1] = Non-proportional (value 0) +
intin[2] = Name, e.g. EURO +
: ==> intin[2] = 69 +
:   +
intin[10]   +
intin[11] = Text with terminating NULL +
:   +
:   +
ptsin[0] = X-coordinate, +
ptsin[1] = Y-coordinate of the text in 1/10 mm +
ptsin[2] = Character width +
ptsin[3] = Character height in 1/10 mm +
ptsin[4] = Rotation in 1/10 degree + +
+ +
Up to GEM_END_BGIF follow the v_pline commands that are required +for depicting the text if a program cannot interpret these +sub-opcodes. + + +
 171 GEM_END_BGIF Marks the end of text output with a BGI vector font + + +
 190 GEM_WIND Sets the position, zoom step and format of a window; the +following apply: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
intin[0] = GEM_WIND +
intin[1] = X-position +
intin[2] = Y-position +
intin[3] = Width +
intin[4] = Height of the window in pixels +
intin[5] = X-position, +
intin[6] = Y-position of the slider (pixel) +
intin[7] = Zoom step in percent +
intin[8] = Format (0 = portrait, 1 = landsc.) + +
+ + + +
 191 GEM_GRID Permits permanent saving of raster settings of a window; the +following apply: + + + + + + + + + + + + + + + + + + + + + + + + +
intin[0] = GEM_GRID +
intin[1] = Raster inactive (for value 0) +
intin[2] = Don't draw raster (for 0) +
intin[3] = Raster width in 1/10 mm +
intin[4] = Raster height in 1/10 mm +
intin[5] = Guideline spacing (horizontal) +
intin[6] = Guideline spacing (vertical) in 1/10mm +
intin[7] = Guidelines (0) or dots (1) + +
+ + + +
 192 GEM_ALIGN Describes the reference object; the following apply: + + + + + + + + + + + + + + + + + + +
intin[0] = GEM_ALIGN +
intin[1] = Don't draw reference object (0) +
intin[2] = X-coordinate, +
intin[3] = Y-coordinate of the reference object in 1/10 mm +
intin[4] = Width +
intin[5] = Height of the object in 1/10 mm + +
+ + + +
 193 GEM_START_GREY Specifies a grey-tone as fill area; shades in the region of +0..255 (white..black) are possible for this. The following apply: + + + + + + +
intin[0] = GEM_START_GREY +
intin[1] = Grey-tone (0..255) + +
+ +
The following commands up to GEM_END_GREY set a user-defined +pattern with the corresponding grey-tone; they only serve for programs +that can't cope with these opcodes. + + +
 194 GEM_END_GREY Marks the end of a user-defined grey-tone pattern + + +
 195 GEM_START_BEZIER Defines a Bezier stroke; the following apply: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
intin[0] = GEM_START_BEZIER +
intin[1] = Recursion depth (< 5) +
intin[2] = Attributes of the anchor points as bit-vector; set bits +here mean: +
: Bit-0 = Corner +
: Bit-1 = Displaced +
: Bit-2 = Visible +
: Bit-3 = Line instead of Bezier +
:   +
intin[2n+1]   +
ptsin[0] = Coordinates of the n Bezier stroke (each consists of 4 points) +
ptsin[4n-1]   + +
+ +
Up to GEM_END_BEZIER then follow v_pline calls which draw an +equivalent polygon strokes for programs that do not understand the +sub-opcode + + +
 196 GEM_END_BEZIER Marks the end of a Bezier stroke + + +
 197 GEM_START_JOIN Permits the saving of more coordinates than the metafile driver +allows. If an application finds this sub-opcode, then the ptsin +fields of the following VDI blocks up to GEM_END_JOIN will be +collected up in a large field. The following apply: + + + + + + +
intin[0] = GEM_START_JOIN +
intin[1] = Number of coordinate pairs + +
+ + + +
 198 GEM_END_JOIN Marks the end of a section defined by GEM_START_JOIN. +
 199 ??? No information available at present +
 201 ??? No information available at present +
 203 ??? No information available at present +
 230 ??? No information available at present + +
+ +

Note: When reading a metafile it is imperative that a +program should ignore unknown statements. +

+

See also: v_write_meta   Sample binding   Analysis of a metafile +

+

7.2.6.2 Analysis of a metafile

+

For understanding of the metafile format it can be useful to +view the contents of a metafile as plain text. The tools required for +this can be found in many mailboxes of the Mausnet. +

+

+

Example: The illustration above shows a window of the +graphics software GEM-Look, containing a vector graphic in +metafile format. +

+

The software permits, amongst other things, to have the contents +of a GEM metafile displayed in plain text, and even to work through +this in any desired steps. +

+

In addition one can specify via a dialog exactly which +information is to be paid regard to for the analysis, or to be output, +and in what format the output should appear. +

+

+

The plain text information will be displayed in a window, and +can be (fully or partly) transferred to other programs via the +clipboard. +

+

Due to the fact that all commands of the output window can also +be executed individually and in any desired order, it is very easy to +reproduce the commands saved in a metafile. +

+

See also: +
Sample analysis   Metafile format   Metafile sub-opcodes +

+

7.2.6.3 Binding of a metafile sub-opcode

+
/* The following code fragment permits the storing in a metafile the
+   name and the version number of the application that has created a
+   metafile... */
+
+GLOBAL void vm_ver_app( int16_t vdi_handle, int16_t version,
+       uint8_t *app_name)
+{
+    int16_t i;
+
+    contrl[0] = 5;
+    contrl[1] = 0;
+    contrl[3] = 2 + strlen (app_name);
+    contrl[5] = 99;                      /* v_write_meta */
+    contrl[6] = vdi_handle;
+
+    intin[0] = VM_VER_APP;
+    intin[1] = version;
+
+    i = 2;
+    while ((intin [i++] = (int16_t) (uint8_t)*app_name++) != 0)
+                ;
+
+    vdi ();
+} /* vm_ver_app */
+
+

See also: VDI bindings   Metafile format +

+

7.2.6.4 Sample analysis of a metafile

+
// This analysis was created by GEM-Look, the program for the
+// depiction and analysis of graphics in XIMG and metafile formats;
+// (c) 1994-1995 by Rolf Kotzian.
+//
+// It is not permitted to distribute parts of this analysis without
+// this header
+
+
+Analysis of: E:\C\GEISS\EXAMPLES\GEM_IMG\BEZIER.GEM
+
+Metafile ID            :     -1
+Length of the header   :     24
+GEM-Version            :    3.10
+NDC/RC Flag            :     RC
+Ausmaß minimales x     :  -2720    (Minimum dimension X)
+Ausmaß minimales y     :  -2136    (Minimum dimension Y)
+Ausmaß maximales x     :   2112    (Maximum dimension X)
+Ausmaß maximales y     :   1592    (Maximum dimension Y)
+Seiten-Breite          :  14.80 cm (Page width)
+Seiten-Höhe            :  21.00 cm (Page height)
+Koord.System linkes x  :  -3495    (Coordinate system left X)
+Koord.System linkes y  :   4960    (Coordinate system left Y)
+Koord.System rechtes x :   3495    (Coordinate system right X)
+Koord.System rechtes y :  -4960    (Coordinate system right Y)
+Bit-Image vorhanden?   :   nein    (Bit-image present?  :  No)
+
+
+***** Befehl #1 *****              (Command #1)
+
+vswr_mode (vdi_handle, mode)
+contrl[0] = 32
+contrl[1] = 0
+contrl[3] = 1
+contrl[5] = 100
+
+intin[0] = 1
+
+***** Befehl #2 *****              (Command #2)
+
+vsl_type (vdi_handle, style)
+contrl[0] = 15
+contrl[1] = 0
+contrl[3] = 1
+contrl[5] = 100
+
+intin[0] = 1
+
+***** Befehl #3 *****              (Command #3)
+
+vsl_width (vdi_handle, width)
+contrl[0] = 16
+contrl[1] = 1
+contrl[3] = 0
+contrl[5] = 100
+
+ptsin[0] = x = 1
+ptsin[1] = y = 1
+
+***** Befehl #4 *****              (Command #4)
+
+vsl_color (vdi_handle, index)
+contrl[0] = 17
+contrl[1] = 0
+contrl[3] = 1
+contrl[5] = 100
+
+intin[0] = 1
+
+***** Befehl #5 *****              (Command #5)
+
+vsl_ends (vdi_handle, beg_style, end_style)
+contrl[0] = 108
+contrl[1] = 0
+contrl[3] = 2
+contrl[5] = 100
+
+intin[0] = 0
+intin[1] = 0
+
+***** Befehl #6 *****              (Command #6)
+
+vsm_type (vdi_handle, symbol)
+contrl[0] = 18
+contrl[1] = 0
+contrl[3] = 1
+contrl[5] = 100
+
+intin[0] = 1
+
+***** Befehl #7 *****              (Command #7)
+
+vsm_height (vdi_handle, height)
+contrl[0] = 19
+contrl[1] = 1
+contrl[3] = 0
+contrl[5] = 100
+
+ptsin[0] = x = 1
+ptsin[1] = y = 1
+
+***** Befehl #8 *****              (Command #8)
+
+vsm_color (vdi_handle, index)
+contrl[0] = 20
+contrl[1] = 0
+contrl[3] = 1
+contrl[5] = 100
+
+intin[0] = 1
+
+***** Befehl #9 *****              (Command #9)
+
+vst_rotation (vdi_handle, angle)
+contrl[0] = 13
+contrl[1] = 0
+contrl[3] = 1
+contrl[5] = 100
+
+intin[0] = 0
+
+***** Befehl #10 *****              (Command #10)
+
+vst_font (vdi_handle, font)
+contrl[0] = 21
+contrl[1] = 0
+contrl[3] = 1
+contrl[5] = 100
+
+intin[0] = 1
+
+***** Befehl #11 *****              (Command #11)
+
+vst_color (vdi_handle, index)
+contrl[0] = 22
+contrl[1] = 0
+contrl[3] = 1
+contrl[5] = 100
+
+intin[0] = 1
+
+***** Befehl #12 *****              (Command #12)
+
+vst_alignment (vdi_handle, hor_in, vert_in, hor_out, vert_out)
+contrl[0] = 39
+contrl[1] = 0
+contrl[3] = 2
+contrl[5] = 100
+
+intin[0] = 0
+intin[1] = 0
+
+***** Befehl #13 *****              (Command #13)
+
+vst_effects (vdi_handle, effect)
+contrl[0] = 106
+contrl[1] = 0
+contrl[3] = 1
+contrl[5] = 100
+
+intin[0] = 0
+
+***** Befehl #14 *****              (Command #14)
+
+vst_point (vdi_handle, point, char_width, char_height, cell_width,
+           cell_height)
+
+contrl[0] = 107
+contrl[1] = 0
+contrl[3] = 1
+contrl[5] = 100
+
+intin[0] = 12
+
+***** Befehl #15 *****              (Command #15)
+
+vsf_interior (vdi_handle, style)
+contrl[0] = 23
+contrl[1] = 0
+contrl[3] = 1
+contrl[5] = 100
+
+intin[0] = 1
+
+***** Befehl #16 *****              (Command #16)
+
+vsf_style (vdi_handle, index)
+contrl[0] = 24
+contrl[1] = 0
+contrl[3] = 1
+contrl[5] = 100
+
+intin[0] = 1
+
+***** Befehl #17 *****              (Command #17)
+
+vsf_color (vdi_handle, index)
+contrl[0] = 25
+contrl[1] = 0
+contrl[3] = 1
+contrl[5] = 100
+
+intin[0] = 1
+
+***** Befehl #18 *****              (Command #18)
+
+vsf_perimeter (vdi_handle, per_vis)
+contrl[0] = 104
+contrl[1] = 0
+contrl[3] = 1
+contrl[5] = 100
+
+intin[0] = 1
+
+***** Befehl #19 *****              (Command #19)
+
+v_write_meta (vdi_handle, num_ints, ints, num_pts, pts)
+contrl[0] = 5
+contrl[1] = 0
+contrl[3] = 7
+contrl[5] = 99
+
+intin[0] = 34
+intin[1] = 3
+intin[2] = 1
+intin[3] = 42
+intin[4] = 42
+intin[5] = 42
+intin[6] = 42
+
+***** Befehl #20 *****              (Command #20)
+
+v_bez_on (vdi_handle)
+contrl[0] = 11
+contrl[1] = 1
+contrl[3] = 0
+contrl[5] = 13
+
+***** Befehl #21 *****              (Command #21)
+
+vsf_perimeter (vdi_handle, per_vis)
+contrl[0] = 104
+contrl[1] = 0
+contrl[3] = 2
+contrl[5] = 13
+
+intin[0] = 1
+intin[1] = 1
+
+***** Befehl #22 *****              (Command #22)
+
+vsf_color (vdi_handle, index)
+contrl[0] = 25
+contrl[1] = 0
+contrl[3] = 1
+contrl[5] = 13
+
+intin[0] = 2
+
+***** Befehl #23 *****              (Command #23)
+
+vsf_interior (vdi_handle, style)
+contrl[0] = 23
+contrl[1] = 0
+contrl[3] = 1
+contrl[5] = 13
+
+intin[0] = 0
+
+***** Befehl #24 *****              (Command #24)
+
+vsf_style (vdi_handle, index)
+contrl[0] = 24
+contrl[1] = 0
+contrl[3] = 1
+contrl[5] = 13
+
+intin[0] = 0
+
+***** Befehl #25 *****              (Command #25)
+
+vsl_color (vdi_handle, index)
+contrl[0] = 17
+contrl[1] = 0
+contrl[3] = 1
+contrl[5] = 13
+
+intin[0] = 3
+
+***** Befehl #26 *****              (Command #26)
+
+vsl_width (vdi_handle, width)
+contrl[0] = 16
+contrl[1] = 1
+contrl[3] = 0
+contrl[5] = 13
+
+ptsin[0] = x = 1
+ptsin[1] = y = 0
+
+***** Befehl #27 *****              (Command #27)
+
+vsf_perimeter (vdi_handle, per_vis)
+contrl[0] = 104
+contrl[1] = 0
+contrl[3] = 2
+contrl[5] = 13
+
+intin[0] = 1
+intin[1] = 1
+
+***** Befehl #28 *****              (Command #28)
+
+vsl_ends (vdi_handle, beg_style, end_style)
+contrl[0] = 108
+contrl[1] = 0
+contrl[3] = 2
+contrl[5] = 13
+
+intin[0] = 0
+intin[1] = 0
+
+***** Befehl #29 *****              (Command #29)
+
+v_bez (vdi_handle, count, xyarr, bezarr, minmax, npts, nmove)
+contrl[0] = 6
+contrl[1] = 17
+contrl[3] = 9
+contrl[5] = 13
+
+ptsin[0] = x = -2125
+ptsin[1] = y = 100
+ptsin[2] = x = -708
+ptsin[3] = y = -441
+ptsin[4] = x = 237
+ptsin[5] = y = 640
+ptsin[6] = x = 1654
+ptsin[7] = y = -981
+ptsin[8] = x = 237
+ptsin[9] = y = 640
+ptsin[10] = x = -1180
+ptsin[11] = y = 2261
+ptsin[12] = x = 2127
+ptsin[13] = y = 1723
+ptsin[14] = x = 2127
+ptsin[15] = y = 100
+ptsin[16] = x = 2127
+ptsin[17] = y = -1522
+ptsin[18] = x = -708
+ptsin[19] = y = 100
+ptsin[20] = x = 237
+ptsin[21] = y = -981
+ptsin[22] = x = 1182
+ptsin[23] = y = -2062
+ptsin[24] = x = -2124
+ptsin[25] = y = -2601
+ptsin[26] = x = -2597
+ptsin[27] = y = -1522
+ptsin[28] = x = -3070
+ptsin[29] = y = -441
+ptsin[30] = x = -1653
+ptsin[31] = y = -440
+ptsin[32] = x = -2125
+ptsin[33] = y = 100
+
+intin[0] = 2344
+intin[1] = 4112
+intin[2] = 4105
+intin[3] = 2320
+intin[4] = 4112
+intin[5] = 4105
+intin[6] = 2320
+intin[7] = 4112
+intin[8] = 12
+
+***** Befehl #30 *****              (Command #30)
+
+v_bez_off (vdi_handle)
+contrl[0] = 11
+contrl[1] = 0
+contrl[3] = 0
+contrl[5] = 13
+
+***** Befehl #31 *****              (Command #31)
+
+vsf_perimeter (vdi_handle, per_vis)
+contrl[0] = 104
+contrl[1] = 0
+contrl[3] = 2
+contrl[5] = 13
+
+intin[0] = 0
+intin[1] = 0
+
+
+// Ende der Analyse
+// GEM-Look, (c) 1994/95 by Rolf Kotzian
+
+

See also: Analysis of a metafile   VDI bindings +

+

7.2.6.5 Metafile version

+

The version number depends on which GEM system was used to +produce the metafile; it is described by the formula: +

+

100 * main version number + sub-version number. +

+

Example: The value 301 represents Version 3.1 +

+

7.2.7 NVDI

+ +

NVDI (NewVDI) is a VDI developed by the +Behne brothers which completely replaces the original from +Atari. Apart from its very high speed, it offers the possibility of +using vector fonts in the Speedo, and TrueType format (with a special +module also Type-1). NVDI is also available in a special Macintosh +version (NVDIMac), and enables any program that can output via +GDOS (in connection with MagiC Mac) to also output on Apple printers +and in networks. +

+

To establish which NVDI version one is using and what function +range it offers one has to look for the NVDI cookie 'NVDI', which +contains the version number in BCD format (e.g. 0x0410 for Version +4.10). +

+ +

If you want to use off-screen bitmaps, you should look for the 'EdDI' cookie (e.g. +with is_EdDI). The LONGword following the ID is the address of a +dispatcher, which is called up with the function number in register +d0.w. Pure-C conventions apply for the call, i.e. the registers +d0-d2/a0-a1 and the stack are used for parameter passing, d0-d2/a0-a1 +can be altered. The function 0 returns the EdDI version number in BCD +format (e.g. 0x0110 for Version 1.10). +

+

See also: +
Off-screen bitmaps   v_opnbm   v_clsbm   VDI fundamentals   +vq_scrninfo   GEM +

+

7.2.7.1 is_EdDI

+

Sample code for Pure-C: +

+
GLOBAL BOOLEAN is_EdDI ()
+{
+    int16_t (*func)(int16_t);
+
+    if (get_cookie ("EdDI", (LONG *) &func))
+        return ((*func)(0));
+
+    else return (FALSE);
+
+} /* is_EdDI */
+
+

7.2.8 Off-screen bitmaps

+

It can be very useful for many applications if drawing functions +can be applied not directly to the screen, but to an invisible screen. +Such a "hidden" screen is called an off-screen bitmap. +

+

For creation of off-screen bitmaps one uses the function +v_opnbm. This can have either the size of a bitmap specified that it +is to allocate, or it can be passed a bitmap. The bitmap is managed in +the same format as that of the screen, which makes fast copying +between the two possible. The function v_clsbm closes a bitmap created +with v_opnbm, and frees its memory if necessary. +

+

Raster operations between screen and off-screen bitmap should be +made basically in a device-specific format. If the destination of a +raster operation is specified as an off-screen bitmap with its MFDB +and if the handle belonging to this bitmap is used, then during +blitting the bitmap will be clipped according to the coordinates set +via vs_clip on this workstation. So for copying a raster from the +screen to an off-screen bitmap one should use the vdi_handle of this +bitmap. +

+

If, on the other hand, the bitmap is the source and the screen +the destination, then one should use the handle of the screen +workstation, as in that case the raster will be clipped according to +the screen coordinates. If one uses the handle of a bitmap returned by +v_opnbm, and fd_addr of a MFDB contains 0, then the data of +the bitmap will be used instead. +

+

See also: NVDI   GDOS   Style guidelines +

+

7.2.9 The OUT file format

+ +

The OUT format was developed by Digital Research and, +like the XIMG or metafile format permits data exchange between any GEM +applications. More exactly, it permits control characters for text +attributes to be written to a file with the suffix ".out", +which are then recognized and taken into account by the output driver. +

+

This makes the OUT format particularly well suited for +exchanging text files with attributes between various applications. +OUT files are nothing more than ASCII files, which use the control code +DC2 (ASCII value 18) for switching between text attributes; this is +followed by a letter that describes the switching on or off of the +attribute: +

+

Following control characters are defined: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CodeMeaning
DC2 0Bold on
DC2 1Bold off
DC2 2Italic on
DC2 3Italic off
DC2 4Underlined on
DC2 5Underlined off
DC2 6Superscript on
DC2 7Superscript off
DC2 8Subscript on
DC2 9Subscript off
DC2 ANLQ mode on
DC2 BNLQ mode off
DC2 CExpanded on
DC2 DExpanded off
DC2 ELight on
DC2 FLight off
DC2 G 
: 
: 
DC2 VReserved, is ignored
DC2 WPica font (10 cpi)
DC2 XElite font (12 cpi)
DC2 YCondensed print
DC2 ZProportional print
+
+ +

Note: Naturally one can also incorporate graphics in the +output file; the syntax in this case runs: +

+
(ESC)(ESC)GEM,x,y,w,h,C:\pathname\filename.img
+
+

The parameters x,y,w and h here are to be specified in character +units relative to the current cursor position. +

+

See also: GDOS drivers   v_alpha_text   XIMG format   Metafile format +

+

7.2.10 Raster formats

+

For working with screens the raster functions play a special role; they +are responsible for everything that has to do with movement or changes +of screen clipping. Example: Scrolling within a document or the +depiction of icons. +

+

Naturally, the raster functions can only perform their tasks +efficien- tly if the same format is used for internal depiction as +that used in video memory; otherwise the data would have to be +converted for each individual call of a raster function. However, the +internal structure of the video memory depends on the hardware of the +graphics system in use - quite apart from the fact that the video +memory need not necessarily be directly accessible to the processor. +

+

The number of bits per pixel required depends, naturally, on the +number of colours that can be displayed simultaneously; for monochrome +pixels 1 bit is sufficient, for 16 colours one already needs 4 bits. +Depending on the video hardware in use, these bits can, of course, be +arranged in completely different ways; one should not be surprised, +therefore, that various formats are available for this purpose: +

+ + +

Pixel-oriented format: In this case, all bits belonging +to a pixel are coded together in one or more bytes. In a system using +16 colours, therefore, two pixels would be saved together in one byte +in each case; for 256 colours, each pixel occupies one byte. +

+ + +

Plane-oriented format: In this case one treats the video +memory as a collections of monochrome (i.e. single-coloured) image +planes. To obtain the colour of a pixel, one combines the relevant +bits from the individual planes to a colour value. This says nothing, +of course, about how the individual planes are arranged in the video +memory. A simple solution (common in the PC domain) is to store one +plane after the other (sequentially) in video memory. +

+

So as not to be restricted to a given, hardware-dependent +format, the VDI differentiates between the device-depedent +format (which depends on the hardware), and the so-called +standard format. The standard format is the same for all +VDI systems, and can therefore be used any time one wants to import +raster graphics from outside into the system (example: depiction of +icons in a resource file). For conversion between the two fomats one +can make use of the vr_trnfm function. +

+ + + + +

The VDI standard format is defined as follows: +

+
    +
  • The format is plane-oriented. Each image plane occupies a +contiguous block of memory, and has the same number of image points. +
      +

  • +
  • The highest bit of a 16-bit WORD represents the furthest left +pixel +
      +

  • +
  • Sequential words in video memory form the individual lines. The +first WORD of such a line lies at the left image border; the first +line of the plane codes the topmost pixel line. +
      +

  • +
+ +

The following figure shows an example for the device-independent +standard format with 3 colour planes, where each small square +represents a pixel: +

+

+

Warning: In the monochrome graphics modes of the ST and +TT030, the device-dependent format happens to (!) correspond +to the device- independent one (i.e. the standard format). This does +not mean, of course, that one may therefore dispense with the use of +the vr_trnfm function. As one normally has no information about the +device-specific format, this reason alone forbids any direct +manipulation of the video memory. +

+ + + +

As a matter of principle, the VDI works in a colour register +oriented (colour lookup table or CLUT) manner. It starts off by +assuming that there is a maximum number of colours that may be +displayed simulta- neously, and that one can assign to these colour +registers a palette of certain (relatively freely selectable) tints. +As this feature is by no means self-evident, it can be inquired for +via vq_extnd. There follow two examples for graphics modes +without a colour lookup table: +

+
    +
  • The TT030 graphic mode 'TT-high': there are only two colour +registers and two tints (black and white), which may also not be +swapped. +
      +

  • +
  • With True-Color graphics cards such as the Crazy-Dots-II, an +'arbitrary' number of colours may be displayed simultaneously. +Normally 24 bits per pixel are used for this, so that some 16 million +colours are available. With such a large number of colours the idea of +colour registers is out of the question: The number of tints +principally displayable simultaneously far exceeds the typical number +of image points. +
      +

  • +
+ + + + +

There remains the question how the pixel values in video +memory are related to the VDI colour indices. Answer: +

+ + + + + + +
(a) On historical grounds, the start point is that for a pixel in +the VDI colour 0 (normally white) all bits are cleared, and for +black image points (VDI colour 1) all bits are set. This is logical +if only for the reason that by completely inverting all bits of the +pixel display, white and black are swapped. +
  +
(b) With the aid of the v_get_pixel function one can obtain both +the VDI colour index as well as the pixel value for a given image +coordinate. +
  + +
+ +

In addition, Atari and Digital Research have +documented the standard assignments for 4, 8 and 16 colour +palettes: +

+
    +
  • For four colours, the following apply: +
      +

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Pixel valueColour indexColourName
    000WhiteWHITE
    012RedRED
    103GreenGREEN
    111BlackBLACK
    +
    + +

  • +
  • For eight colours the following apply: +
      +

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Pixel valueColour indexColourName
    0000WhiteWHITE
    0012RedRED
    0103GreenGREEN
    0116YellowYELLOW
    1004BlueBLUE
    1017MagentaMAGENTA
    1105CyanCYAN
    1111BlackBLACK
    +
    + +

  • +
  • For 16 colours, the following apply: +
      +

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Pixel valueColour indexColourName
    00000WhiteWHITE
    00012RedRED
    00103GreenGREEN
    00116YellowYELLOW
    01004BlueBLUE
    01017MagentaMAGENTA
    01105CyanCYAN
    01118Light greyLWHITE
    10009Dark greyLBLACK
    100110Light redLRED
    101011Light greenLGREEN
    101114Light YellowLYELLOW
    110012Light BlueLBLUE
    110115Light MagentaLMAGENTA
    111013Light CyanLCYAN
    11111BlackBLACK
    +
    + +

  • +
+ +

Note: For other colour depths, no unambiguous +assignments exist. As there is also no general formula for a +conversion, one has to resort to the function v_get_pixel when +necessary. +

+

See also: AES object colours   Raster functions   vq_scrninfo +

+

7.2.11 SpeedoGDOS

+ +

SpeedoGDOS belongs to the youngest generation of the GDOS +family, and is currently available in Version 5.0c. Besides the +features of a 'normal' GDOS, it excels with the following +possibilities: +

+
    +
  • Support for vector fonts of the formats: +
      +
    • Speedo +
    • +
    • TrueType +
    • +
    • Type1 +
    • +
    + +
  • +
  • Possibilities for track/pair kerning. +
  • +
+ +

To check whether SpeedoGDOS is installed it is best to inquire +via the cookie jar. The program installs a cookie with the ID 'FSMC' in +the boot phase. +

+

See also: GDOS   NVDI   Style guidelines +

+

7.2.12 Details about vector fonts

+

When using the programs NVDI or SpeedoGDOS, high quality vector +fonts (in the formats Speedo, TrueType, and Type-1) are available also +under GEM. As in supporting these font technologies some subtleties +have to be taken note of, the following points are dealt with in this +section: +

+ + +

See also: vst_load_fonts   vst_unload_fonts +

+

7.2.12.1 Monospaced fonts

+

Some applications can only run with monospaced fonts or they can +run faster when they recognize that a font is monospaced. The +appropriate proceeding is the following one: +

+
    +
  • If an extended version of vqt_name exists (35 entries in +intout), you should check the monospace-bit in intout[34]. +
      +

  • +
  • If vqt_name only offers the information that it refers to a +vector font (34 entries in intout, intout[33] != 0), then for vector +fonts one should call vqt_fontheader, and check bit 1 of FH_CLFGS. +
      +

  • +
  • If the font is not a vector font and the first two points above +do not apply, the character widths have to be obtained individu- ally +with vqt_width and one should compare the character widths. +
      +

  • +
+ +

If you use v_ftext to display characters of a monospaced vector +font, the width of the string can not be calculated with the return +values of vqt_width or vst_height but width vqt_advance32, because +characters of a vector font can have fractional widths - even if the +font is monospaced - and v_ftext uses these fractional width to place +the characters. +

+

See also: Vector fonts   About the VDI   GDOS   Style guidelines   +fix31 +

+

7.2.12.2 Font index and ID

+ +

The index of a font is a number between 1 and the number +of available fonts. Depending on the number of installed fonts, a font +like "Swiss 721" has a different index (supposing that Swiss +721 is one of the installed fonts). +

+ +

The Font ID of a font is a fix number which is (with a +few exceptions) not depending on the number of installed fonts or the +used system - e.g. the id of "Swiss 721" is always 5003. +

+

Of course there are exceptions from this rule: Some TrueType and +Type 1 fonts do not have an id. In this case will try zo creates a +unique id based on the name. This id can depend on the ids of the +other installed fonts and therefore the same font might have another +id on another computer with other fonts. To avoid problems like +selecting the wrong font and to facilitate replacing not existing +fonts, you should save the id and the name of a font. +

+

See also: Vector fonts   About the VDI   GDOS   Style guidelines +

+

7.2.12.3 Size of vector fonts

+

Most screen drivers return a resolution of ≈ 91 dpi, +which also determines the size of vector fonts on-screen. As not every +screen works at 91 dpi, programs when displaying text should +not assume this fixed value, but instead respect the output of +v_opnwk, v_opnvwk, vq_extnd and v_opnbm. +

+

Otherwise, if the pixel sizes differ, display errors may occur. +For printouts the more exact pixel sizes of vq_extnd should be used, +so. +

+

7.2.12.4 Height and width of vector fonts

+

You can set the height and the width of a vector font with the +functions vst_arbpt32 and vst_setsize32 in 1/65536 pt (1 pt ≈ +1/72" ≈ 353µm). +

+

If the specified width or height is negative, the text is +mirrored on the corresponding axis. +

+

7.2.12.5 Kerning

+

Kerning is a process for manipulating spacing between characters +to achieve a more consistent (better) appearance of the typeface. One +can differentiate between two variants of kerning: +

+ + +
    +
  • Track kerning: This method uses a constant +offset for all characters of a font. Fonts that support track +kerning normally include several offsets so that one can choose +normal, tight or very tight kerning, for instance. +
      + + +

  • +
  • Pair kerning: This is based on the realisation that +one offset makes little sense for all characters of a font, +because in many cases one can obtain an appreciably better appearance +of the set type if the spacing for each pair of characters can be +set individually. Fonts that support pair kernning therefore +contain a table in which the optimum offset for each combination of +(more exactly: for the most important) character pairs are noted. +
      +

  • +
+ +

Note: Both track as well as pair kerning are switched +off after the opening of a workstation. So to achieve better text +depiction one should switch on pair kerning with vst_kern. +

+

See also: vst_kern   vqt_pairkern   vqt_trackkern   +vst_track_offset +

+

7.2.12.6 Positioning of vector text

+

When outputting vector fonts the VDI works internally with +resolution steps of 1/65536 of a pixel, to ensure precise character +positioning irrespective of the output device used and its actual +resolution. +

+

To output the bitmaps for individual characters, these +fixed-point values are converted to pixels by adding 32768 and then +dividing by 65536. +

+
    +
  • When track kerning is switched on, an offset that is obtained +from vqt_trackkern is added to each character position. +
      +

  • +
  • When pair kerning is switched on, an offset that is returned by +vqt_pairkern is added to each character position. +
      +

  • +
+ +

Warning: Pair/track kerning and the positioning in +1/65536 of a pixel will only be applied if v_ftext is called! With +v_gtext, vector fonts behave mostly like bitmap fonts and neither +kerning nor exact positio- ning are used. +

+

See also: Pair kerning   Track kerning   fix31 format +

+

7.2.12.7 Vector or bitmap font?

+

If the set font is a vector font, then vqt_name returns 34 +entries in intout and intout[33] contains a non-zero value. +

+

If, instead, intout[33] is zero (or if only 33 entries are +returned), then we are dealing with a bitmap font. +

+

7.2.13 VDI workstations

+

A workstation is a general term for an input or output +device; this can be a screen, a printer, a plotter, a camera, a +graphics tablet or one of many other devices. +

+

In order to be able to access a given VDI device one must +therefore first open the workstation. Depending on the state +of affairs, one will have returned either an error-message or the +workstation ID (handle) of the relevant device. +

+

A set of features belong to each workstation, which are +unalterable and give information about the capabilities of the device. +These include, amongst others, device type, coordinate system and +colour capability. Besides the data returned on opening the +workstation, an extended inquiry function permits obtaining further +data about a device. This allows applications to take optimum +advantage of the device capabilities (for instance by adapting their +screen structure to the number of displayable screen pixels). +

+

In addition to the unalterable features of a workstation, there +also some that can be changed; one speaks here about +attributes, which describe the current state of the +device. A good example is the line colour, which only has to be set +once (and not perhaps for each individual call of drawing functions). +The current attributes are saved by the VDI in internal structures +separately for each individual workstation; thus an application can +easily set different line colours for the screen and the printer, for +instance. The VDI recognizes from the workstation handle which output +device is meant. +

+

The following table shows some attributes with their +standard values: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeStandard valueSet by
Baseline angle0 degreesvst_rotation
ClippingSwitched offvs_clip
CursorHiddenv_show_c, v_hide_c
Input modeRequestvsin_mode
Fill pattern, freeManufacturer's logovsf_udpat
KerningSwitched offvst_kern
Line endsRectangularvsl_ends
Line pattern, freeContinuousvsl_udsty
Line widthNominal line widthvst_width
Marker sizeNominal marker sizevsm_height
Writing modeReplacevswr_mode
Text alignmentLeft, baselinevst_alignment
Text effectNormalvst_effects
PerimeterVisiblevsf_perimeter
Character heightNominal character heightvst_height
+
+ + + +

An exception applies to the screen, since this must be available +for several processes simultaneously. For this reason the VDI +offers so-called virtual workstations, which can only ever be used +together with an already opened physical screen workstation. +Each virtual workstation naturally has its own set of attributes, so +that the programs do not get in the way of each other during screen +output. +

+

Warning: Not all features of the physical screen +workstation are transferable to the virtual workstations. Keyboard and +mouse still can be used only by one program at a time. The input +functions may therefore be used only by the program that +opened the physical screen workstation (this is normally the AES). +

+

A final note: As the management of workstation attributes +requires memory space, which is requested dynamically as a rule, one +should never assume that the opening of a workstation will work! +

+

See also: GDOS drivers   v_opnwk   v_opnvwk   vq_extnd +

+

7.2.14 The XIMG format for pixel images

+

Pixel images are stored under GEM in a standard format, the +so-called bit-image (or XIMG) format. Graphics of this type are stored +in a compressed form, and always have the suffix '.IMG'. +

+

The main advantage of this format is based on the fact that it +is a GEM standard format, which is supported by almost all +applications. A bit-image file consists of a header as well as pure +pixel data. This header is defined in C-notation as follows: +

+ +
typedef struct
+{
+  int16_t version;         /* Version number (usually 1)                 */
+  int16_t headlen;         /* Length of header in 16-bit WORDs           */
+  int16_t planes;          /* Number of colour planes in graphic         */
+  int16_t pat_run;         /* Pattern length in bytes                    */
+  int16_t pix_width;       /* Pixel width of source device in 1/1000 mm  */
+  int16_t pix_height;      /* Pixel height of source device in 1/1000 mm */
+  int16_t sl_width;        /* Width of a scanline in pixels              */
+  int16_t sl_height;       /* Height of a scanline in pixels             */
+  int8_t  x_id[4];         /* Must be 'XIMG'                             */
+  int16_t color_model;     /* Colour model: 0=RGB, 1=CYM, 2=Pantone      */
+  RGB_LIST color_table[];  /* Colour table                               */
+} XIMG;
+
+

The whole header is arranged in the Motorola-68000 +format, so that on computers with an Intel CPU, WORDs and +LONGwords have to have the bytes swapped. The pure pixel data always +start at headlen * 2 and is stored compressed (as mentioned +above). +

+

The length of the patterns lies between 1 and 8, and with most +screens has a length of 2 bytes. Each scanline information is made up +of two components: +

+
    +
  • A repeated portion of the following structure (in C-notation): +
      +

    typedef struct
    +{
    +  int16_t sc_zero;    /* Always zero */
    +  int8_t  sc_ff;      /* Always 255  */
    +  int8_t  sc_cnt;     /* Number of coded image lines */
    +} SCANLINE;
    +
    +

  • +
  • The actual image information. This is stored in three different +categories line by line. +
      + + + + + + + + + + +
    (a) Single colour pixel sequences (solid runs) are stored +as a single byte, where the high order bit determines the status of +the point (i.e. 'on' or 'off'); the remaining 7 bits disclose how many +bytes have to be output (i.e. the length of the run). +
      + +
    (b) Pattern runs have 0 as the first byte, and the number +of pattern repetitions as the second. The pattern length is contained +in the header under pat_run. So the first two bytes are +followed by eactly as many bytes as are required to represent the +pattern. +
      +
    typedef struct
    +{
    +  int8_t pr_zero;        /* Always zero      */
    +  int8_t pr_cnt;         /* Number of bytes  */
    +  int8_t pr_data[...];   /* Pattern data     */
    +} PATTERNRUN;
    +
    + +
    c) Image data that is hard or impossible to shorten (bit +strings) is stored unchanged. Here the first byte is 0x80 and the +second contains the number of bytes. This is followed by the +corresponding bytes with uncompressed image data. +
      +
    typedef struct
    +{
    +  int8_t bs_first;       /* Always 0x80       */
    +  int8_t bs_cnt;         /* Number of bytes   */
    +  int8_t bs_data[...];   /* Image data        */
    +} BITSTRING;
    +
    + +
    + +

  • +
+ +

There follows in each case the image data for every coded colour +plane consecutively. One should ensure that one line is always coded +with the full number of bytes, even if the image is effectively +narrower. Thus up to seven bits of superfluous data may be present. +The pixel width of the image is given in the header under +sl_width. +

+

See also: Metafile-Format   v_bit_image   OUT file format +

+
+ +Home +VDIVDI +About the VDIAbout the VDI +VDI bindingsVDI bindings + + diff --git a/en/VT_52_terminal.html b/en/VT_52_terminal.html new file mode 100644 index 000000000..35b411ea2 --- /dev/null +++ b/en/VT_52_terminal.html @@ -0,0 +1,1226 @@ + + + + + +The documentation for TOS: VT-52 terminal + + + + + + + + + +Home +BIOSBIOS +Cookie jarCookie jar +XBRA procedureXBRA procedure + +
+ +

3.8 VT-52 terminal

+

The output functions of the GEMDOS or BIOS can emulate a VT52 +video terminal. All control sequences are prefaced by the ESC character +of the ASCII code, followed by further characters for the desired +function. That is why one also speaks about Escape sequences. +The ASCII code control sequences are available as well. +

+

The VT52 emulator has the following control sequences available: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CodeNameMeaning
BELBellSystemglocke.
BSBackspaceDelete character to left of cursor.
HTTabulatorHorizontal tabulator.
LFLine feedLine feed.
VTTabulatorVertical tabulator
FFFormfeedForm feed.
CRCarriage ReturnMove cursor to the start of the line.
ESC ACursor upMove cursor one line upwards.
ESC BCursor downMove cursor one line downwards.
ESC CCursor rightMove cursor one column to the right.
ESC DCursor leftMove cursor one column to the left.
ESC EClear screenClear screen and place cursor at top left corner.
ESC HCursor homeMove cursor to the upper left corner.
ESC ICursor up and insertMove cursor one line upwards and scroll.
ESC JClear to end of screenClear screen from cursor onwards.
ESC KClear to end of lineClear line from cursor onwards.
ESC LInsert lineInsert a line.
ESC MDelete lineRemove line.
ESC Y <y> <x>Set cursor positionPosition cursor.
ESC b <c>Foreground colorSet text color.
ESC c <c>Background colorSet background color.
ESC dClear to start of screenClear screen up to cursor.
ESC jSave cursor position"Remember" cursor.
ESC kRestore cursor positionRestore cursor.
ESC lClear lineClear current line.
ESC oClear to start of lineClear current line up to cursor.
ESC pReverse videoSwitch on inverse video text.
ESC qNormal videoSwitch off inverse video text.
ESC vWrap onEnable line wrap.
ESC wWrap offDisable line wrap.
   
ESC eCur_onShow cursor.
ESC fCur_offHide cursor.
 Blink_onSwitch on cursor blinking.
 Blink_offSwitch off cursor blinking.
 Set_blinkSet blink rate.
 Get_blinkInquire blink rate.
+
+ +

The VT52 emulation of TosWin2 adds the following extensions: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CodeNameMeaning
ESC 3 <c>ANSI foreground colorSet foreground color.
ESC 4 <c>ANSI background colorSet background color.
ESC FEnter graphics modeStart alternate character set.
ESC GExit graphics modeEnd alternate character set.
ESC R <cols,rows> CRSet window sizeSet window size.
ESC S <s> CRSet title barSet window title.
ESC ZIdentifySends response ESC / Z
ESC aDelete characterDelete character at cursorposition.
ESC hEnter insert modeEnter insert mode.
ESC iExit insert modeExit insert mode.
ESC uOriginal colorsReset colors to original colors.
ESC y <c>Set text effectsSet text effects.
ESC z <c>Clear text effectsClear text effects.
+
+ +

Note: Programs that use VT52 sequences for drawing the +screen should, of course, use all of the available area. However, as +this area can not be ascertained with GEMDOS, BIOS or XBIOS +functions, the following conventions apply: +

+

If the environment variables LINES (ROWS) and COLUMNS exist, +then they contain the maximum number of lines or columns respectively. +

+

In the following escape sequence entries, C macros are shown as +an example. As the call of the escape sequences results in an output +of the corresponding characters, the C example should be easily ported +to other languages. +

+

See also: ASCII table   Scancode table +

+

3.8.1 Bell

+ + + + + + + + + + + + +
Name: »Bell« - System bell or beep. +
  +
Declaration: #define Bell() Cconout('\a') +
  +
Description: Bell' makes the system bell or beep sound. +
  +
See also: Escape sequences   VT-52 terminal +
  + +
+ +

3.8.2 Blink_off

+ + + + + + + + + + + + +
Name: »Blink off« - Switch off cursor blinking. +
  +
Declaration: #define Blink_off() Cursconf ( 3, 0 ) +
  +
Description: 'Blink_off' is a function macro with which the blinking of the +cursor can be switched off. The XBIOS function Cursconf is used for +this. +
  +
See also: Escape sequences   VT-52 terminal +
  + +
+ +

3.8.3 Blink_on

+ + + + + + + + + + + + +
Name: »Blink on« - Switch on cursor blinking. +
  +
Declaration: #define Blink_on() Cursconf ( 2, 0 ) +
  +
Description: 'Blink_on' is a function macro with which the blinking of the +cursor can be switched on. The XBIOS function Cursconf is used for +this. +
  +
See also: Escape sequences   VT-52 terminal +
  + +
+ +

3.8.4 Clear_down

+ + + + + + + + + + + + +
Name: »Clear to end of screen« - Clear screen from the cursor +onwards. +
  +
Declaration: #define Clear_down() Cconws("\33J") +
  +
Description: With 'Clear to end of screen' one can clear the screen from the +cursor position onwards. +
  +
See also: Escape sequences   VT-52 terminal +
  + +
+ +

3.8.5 Clear_eol

+ + + + + + + + + + + + +
Name: »Clear to end of line« - Clear current line from the cursor +onwards. +
  +
Declaration: #define Clear_eol() Cconws("\33K") +
  +
Description: With 'Clear to end of line' one can clear the current line from +the cursor position onwards. +
  +
See also: Escape sequences   VT-52 terminal +
  + +
+ +

3.8.6 Clear_home

+ + + + + + + + + + + + +
Name: »Clear screen« - Clear the screen. +
  +
Declaration: #define Clear_home() Cconws("\33E") +
  +
Description: With 'Clear screen' the complete screen can be cleared and the +TOS-cursor positioned in the upper left corner of the screen. +
  +
See also: Escape sequences   VT-52 terminal +
  + +
+ +

3.8.7 Clear_line

+ + + + + + + + + + + + +
Name: »Clear line« - Clear the current line. +
  +
Declaration: #define Clear_line() Cconws("\33l") +
  +
Description: With 'Clear line' the current line can be cleared. The +following lines will not be moved up. The cursor will be placed at the +start of the line. +
  +
See also: Escape sequences   VT-52 terminal +
  + +
+ +

3.8.8 Clear_sol

+ + + + + + + + + + + + +
Name: »Clear to start of line« - Clear current line up to the +cursor. +
  +
Declaration: #define Clear_sol() Cconws("\33o") +
  +
Description: With 'Clear to start of line' the current line can be cleared +up to the cursor position. +
  +
See also: Escape sequences   VT-52 terminal +
  + +
+ +

3.8.9 Clear_up

+ + + + + + + + + + + + +
Name: »Clear to start of screen« - Clear screen up to the cursor. +
  +
Declaration: #define Clear_up() Cconws("\33d") +
  +
Description: With 'Clear to start of screen' the screen can be cleared up to +the cursor position. +
  +
See also: Escape sequences   VT-52 terminal +
  + +
+ +

3.8.10 Cur_down

+ + + + + + + + + + + + +
Name: »Cursor down« - Move cursor one line downwards. +
  +
Declaration: #define Cur_down() Cconws("\33B") +
  +
Description: With 'Cursor down' the TOS-cursor can be moved one line +downwards. If the cursor is already in the lowest line then nothing +happens. +
  +
See also: Escape sequences   VT-52 terminal +
  + +
+ +

3.8.11 Cur_home

+ + + + + + + + + + + + +
Name: »Cursor home« - Move cursor into the upper left corner. +
  +
Declaration: #define Cur_home() Cconws("\33H") +
  +
Description: With 'Cursor home' one can place the TOS-cursor in the upper +left corner of the screen. +
  +
See also: Escape sequences   VT-52 terminal +
  + +
+ +

3.8.12 Cur_left

+ + + + + + + + + + + + +
Name: »Cursor left« - Move cursor one column to the left. +
  +
Declaration: #define Cur_left() Cconws("\33D") +
  +
Description: With 'Cursor left' the TOS-cursor can be moved one column to +the left. If the cursor is already in the left-most column, then +nothing happens. +
  +
See also: Escape sequences   VT-52 terminal +
  + +
+ +

3.8.13 Cur_off

+ + + + + + + + + + + + +
Name: »Hide cursor« - Switch off cursor. +
  +
Declaration: #define Cur_off() Cursconf ( 0, 0 ) +
  +
Description: 'Cur_off' is a function macro, with which the cursor can be +switched off. The XBIOS function Cursconf is used for this. +
  +
See also: Escape sequences   VT-52 terminal +
  + +
+ +

3.8.14 Cur_on

+ + + + + + + + + + + + +
Name: »Show cursor« - Switch on cursor. +
  +
Declaration: #define Cur_on() Cursconf ( 1, 0 ) +
  +
Description: 'Cur_on' is a function macro, with which the cursor can be +switched on. The XBIOS function Cursconf is used for this. +
  +
See also: Escape sequences   VT-52 terminal +
  + +
+ +

3.8.15 Cur_right

+ + + + + + + + + + + + +
Name: »Cursor right« - Move cursor one column to the right. +
  +
Declaration: #define Cur_right() Cconws("\33C") +
  +
Description: With 'Cursor right' one can move the TOS-cursor by one +column to the right. If the cursor is already in the right-most +column, then nothing happens. +
  +
See also: Escape sequences   VT-52 terminal +
  + +
+ +

3.8.16 Cur_up

+ + + + + + + + + + + + +
Name: »Cursor up« - Move cursor one line upwards. +
  +
Declaration: #define Cur_up() Cconws("\33A") +
  +
Description: With 'Cursor up' the TOS-cursor can be moved one line +upwards. If the cursor is already in the top line, then nothing +happens. +
  +
See also: Escape sequences   VT-52 terminal +
  + +
+ +

3.8.17 Del_line

+ + + + + + + + + + + + +
Name: »Delete line« - Remove line. +
  +
Declaration: #define Del_line() Cconws("\33M") +
  +
Description: With 'Delete line' the current line can be deleted. The +following lines will be moved up, the cursor will be set at the start +of the line. +
  +
See also: Escape sequences   VT-52 terminal +
  + +
+ +

3.8.18 Escape sequences

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
C-sequenceValueCharacterEffect
\a0x07BELBell (System bell)
\b0x08BSBackspace
\f0x0CFFFormfeed (Page feed)
\n0x0ALFLinefeed (Newline)
\r0x0DCRCarriage return
\t0x09HTTabulator (horizontal)
\v0x0BVTTabulator (vertical)
+
+ +

See also: VT-52 terminal   GEMDOS   BIOS   XBIOS +

+

3.8.19 Get_blink

+ + + + + + + + + + + + +
Name: »Get blink rate« - Obtain cursor blink rate. +
  +
Declaration: #define Get_blink() Cursconf ( 5, 0 ) +
  +
Description: 'Get_blink' is a function macro with which the rate of the +cursor blink can be established. The XBIOS function Cursconf is used +for this. +
  +
See also: Escape sequences   VT-52 terminal +
  + +
+ +

3.8.20 Goto_pos

+ + + + + + + + + + + + +
Name: »Set cursor position« - Position the cursor. +
  +
Declaration: #define Goto_pos(x,y) (Cconws("\33Y"),Cconout(' +'+y),Cconout(' '+x)) +
  +
Description: With 'Set cursor position' one can position the cursor in the +x-th line and y-th column. Please note that the count starts at 32 +(the screen has coordinates (32,32) at the upper left of the screen). +That is why 32 (spaces) were added in the above macro, so that the +count can start at 0 when using the macro. +
  +
See also: Escape sequences   VT-52 terminal +
  + +
+ +

3.8.21 Ink

+ + + + + + + + + + + + +
Name: »Foreground color« - Set text color. +
  +
Declaration: #define Ink(c) (Cconws("\33b"),Cconout(c)) +
  +
Description: With 'Foreground color' one can set the text color. The number +of available colors depends on the current screen resolution. +
  +
See also: Escape sequences   VT-52 terminal +
  + +
+ +

3.8.22 Ins_line

+ + + + + + + + + + + + +
Name: »Insert line« - Insert a line. +
  +
Declaration: #define Ins_line() Cconws("\33L") +
  +
Description: With 'Insert line' one can insert a line at the cursor +position. The cursor will be set at the start of the new line. +
  +
See also: Escape sequences   VT-52 terminal +
  + +
+ +

3.8.23 Line_feed

+ + + + + + + + + + + + +
Name: »Line feed« - Line feed. +
  +
Declaration: #define Line_feed() Cconout('\n') +
  +
Description: 'Line feed' sets the cursor in the next line (line feed). +
  +
See also: Escape sequences   VT-52 terminal +
  + +
+ +

3.8.24 Load_pos

+ + + + + + + + + + + + +
Name: »Restore cursor position« - Restore cursor. +
  +
Declaration: #define Load_pos() Cconws("\33k") +
  +
Description: With 'Restore cursor position' the cursor can be placed again +at the position it occupied earlier when "marked" with 'Save +cursor position'. +
  +
See also: Escape sequences   VT-52 terminal   Save_pos +
  + +
+ +

3.8.25 Paper

+ + + + + + + + + + + + +
Name: »Background color« - Set background color. +
  +
Declaration: #define Paper(c) (Cconws("\33c"),Cconout(c)) +
  +
Description: With 'Background color' one can set the background color. The +number of available colors depends on the current screen resolution. +
  +
See also: Escape sequences   VT-52 terminal +
  + +
+ +

3.8.26 Return

+ + + + + + + + + + + + + +
Name: »Carriage Return« - Move cursor to the start of the line. +
  +
Declaration: #define Return() Cconout('\r') +
  +
Description: 'Return' sets the cursor to the start of the current line. +
  +
See also: Escape sequences   VT-52 terminal +
  + +
+ +

3.8.27 Rev_off

+ + + + + + + + + + + + +
Name: »Normal video« - Switch off inverse video. +
  +
Declaration: #define Rev_off() Cconws("\33q") +
  +
Description: With 'Normal video', inverse video for the text can can be +switched off again. +
  +
See also: Escape sequences   VT-52 terminal   Rev_on +
  + +
+ +

3.8.28 Rev_on

+ + + + + + + + + + + + +
Name: »Reverse video« - Switch on inverse video. +
  +
Declaration: #define Rev_on() Cconws("\33p") +
  +
Description: With 'Reverse video', one can switch on inverse video +(background and text colors swapped over). This mode can be switched +off again with 'Normal video'. +
  +
See also: Escape sequences   VT-52 terminal   Rev_off +
  + +
+ +

3.8.29 Save_pos

+ + + + + + + + + + + + +
Name: »Save cursor position« - "Remember" cursor +position. +
  +
Declaration: #define Save_pos() Cconws("\33j") +
  +
Description: With 'Save cursor position' the current cursor position can be +stored in an internal buffer. The stored cursor position can be +restored later with 'Restore cursor position'. +
  +
See also: Escape sequences   VT-52 terminal   Load_pos +
  + +
+ +

3.8.30 Scroll_up

+ + + + + + + + + + + + +
Name: »Cursor up and insert« - Move cursor one line upwards and +scroll. +
  +
Declaration: #define Scroll_up() Cconws("\33I") +
  +
Description: With 'Cursor up and insert' the TOS-cursor can be positioned +one line upwards. If the cursor is already in the top line, then the +screen contents are scrolled one line downwards and an empty line is +inserted. +
  +
See also: Escape sequences   VT-52 terminal +
  + +
+ +

3.8.31 Set_blink

+ + + + + + + + + + + + +
Name: »Set blink rate« - Set cursor blink rate. +
  +
Declaration: #define Set_blink( rate ) Cursconf ( 4, rate ) +
  +
Description: 'Set_blink' is a function macro with which the rate of the +cursor blink can be set. The XBIOS function Cursconf is used for +this. +
  +
See also: Escape sequences   VT-52 terminal +
  + +
+ +

3.8.32 Tab

+ + + + + + + + + + + + +
Name: »Tabulator« - Move cursor to next tabulator position. +
  +
Declaration: #define Tab() Cconout('\t') +
  +
Description: 'Tab' sets the cursor at the next tabulator position. +
  +
See also: Escape sequences   VT-52 terminal +
  + +
+ +

3.8.33 Wrap_off

+ + + + + + + + + + + + +
Name: »Wrap off« - Switch off line-wrapping. +
  +
Declaration: #define Wrap_off() Cconws("\33w") +
  +
Description: With 'Wrap off' one can switch off line-wrapping. +
  +
See also: Escape sequences   VT-52 terminal   Wrap_on +
  + +
+ +

3.8.34 Wrap_on

+ + + + + + + + + + + + +
Name: »Wrap on« - Switch on line-wrapping. +
  +
Declaration: #define Wrap_on() Cconws("\33v") +
  +
Description: With 'Wrap on' one can switch on line-wrapping. This has the +effect that when the end of a line is reached, the cursor will jump +automatically to the start of the next line. +
  +
See also: Escape sequences   VT-52 terminal   Wrap_off +
  + +
+ +
+ +Home +BIOSBIOS +Cookie jarCookie jar +XBRA procedureXBRA procedure + + diff --git a/en/XCPB.html b/en/XCPB.html new file mode 100644 index 000000000..6e949175e --- /dev/null +++ b/en/XCPB.html @@ -0,0 +1,92 @@ + + + + + +The documentation for TOS: XCPB + + + + + + + + + +Home +Type definitionsType definitions +THREADINFOTHREADINFO +IndexIndex + +
+ +

I.18 XCPB

+
typedef struct
+{
+    int16_t       handle;
+    int16_t       booting;
+    int16_t       reserved;
+    int16_t       SkipRshFix;
+    void          *reserve1;
+    void          *reserve2;
+    void cdecl    (*rsh_fix)      ( int num_objs, int num_frstr,
+                                    int num_frimg,
+                                    int num_tree, OBJECT *rs_object,
+                                    TEDINFO *rs_tedinfo,
+                                    char *rs_strings[],
+                                    ICONBLK *rs_iconblk, BITBLK *rs_bitblk,
+                                    long *rs_frstr, long *rs_frimg,
+                                    long *rs_trindex,
+                                    struct foobar *rs_imdope );
+    void cdecl    (*rsh_obfix)    ( OBJECT *tree, int curob );
+    int16_t cdecl (*Popup)        ( char *items[], int num_items,
+                                    int default_item,
+                                    int font_size, GRECT *button,
+                                    GRECT *world );
+    void cdecl    (*Sl_size)      ( OBJECT *tree, int base, int slider,
+                                    int num_items,
+                                    int visible, int direction,
+                                    int min_size );
+    void cdecl    (*Sl_x)         ( OBJECT *tree, int base, int slider,
+                                    int value,
+                                    int num_min, int num_max,
+                                    void (*foo)() );
+    void cdecl    (*Sl_y)         ( OBJECT *tree, int base, int slider,
+                                    int value, int num_min, int num_max,
+                                    void (*foo)() );
+    void cdecl    (*Sl_arrow)     ( OBJECT *tree, int base, int slider,
+                                    int obj, int inc, int min, int max,
+                                    int *numvar, int direction,
+                                    void (*foo)() );
+    void cdecl    (*Sl_dragx)     ( OBJECT *tree, int base, int slider,
+                                    int min, int max, int *numvar,
+                                    void (*foo)() );
+    void cdecl    (*Sl_dragy)     ( OBJECT *tree, int base, int slider,
+                                    int min, int max, int *numvar,
+                                    void (*foo)() );
+    int16_t cdecl (*Xform_do)     ( OBJECT *tree, int start_field,
+                                    int puntmsg[] );
+    GRECT * cdecl (*GetFirstRect) ( GRECT *prect );
+    GRECT * cdecl (*GetNextRect)  ( void );
+    void cdecl    (*Set_Evnt_Mask)( int mask, MOBLK *m1, MOBLK *m2,
+                                    long time );
+    int16_t cdecl (*XGen_Alert)   ( int id );
+    int16_t cdecl (*CPX_Save)     ( void *ptr, long num );
+    void * cdecl  (*Get_Buffer)   ( void );
+    int16_t cdecl (*getcookie)    ( long cookie, long *p_value );
+    int16_t       Country_Code;
+    void cdecl    (*MFsave)       ( int saveit, MFORM *mf );
+} XCPB;
+
+

See also: cpx_init   XCONTROL +

+ +
+ +Home +Type definitionsType definitions +THREADINFOTHREADINFO +IndexIndex + + diff --git a/en/aes_about.html b/en/aes_about.html new file mode 100644 index 000000000..554bb6a64 --- /dev/null +++ b/en/aes_about.html @@ -0,0 +1,146 @@ + + + + + +The documentation for TOS: About the AES + + + + + + + + + +Home +AESAES +AESAES +AES fundamentalsAES fundamentals + +
+ +

8.1 About the AES

+

The AES (Application Environment +Services) is that part of GEM that represents the direct +(graphical) interface to the user. The AES offers a set of calls +for applications to handle conveniently various concepts such as +screen windows, menu bars, dropdown or pop-up menus, dialog boxes etc. +The following utility libraries serve for this purpose: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Application library (appl_...) +
File-selector library (fsel_...) +
Print dialogs (pdlg_...) +
Editable object functions (edit_...) +
Event library (evnt_...) +
Window-dialogs (wdlg_...) +
Window library (wind_...) +
Extended file-selectors (fslx_...) +
Forms (form_...) +
• Geneva functions +
Graphics library (graf_...) +
List boxes (lbox_...) +
MagiC functions (sys_....) +
Menus (menu_...) +
Objects (objc_...) +
Process library (proc_...) +
Property library (prop_...) +
Resource (rsrc_...) +
Shell communication (shel_...) +
X-graphics function (xgrf_...) +
X-shell function (xshl_...) +
Font selection (fnts_...) +
Clipboard (scrp_...) + +
+ + +

The origins of the AES reach back to the year 1984, developed +by Digital Research originally for MS-DOS machines, and later +ported to the Apple Lisa (under CP/M 68k). Subsequently this version +was ported to the Atari-ST (under GEMDOS). +

+

In version 4.0 the AES was revised extensively, and now +offers many new and extended routines. With the function appl_getinfo +one can check easily whether (and which) new options are available. +

+

See also: AES fundamentals   Bindings of the AES   About the VDI +

+
+ +Home +AESAES +AESAES +AES fundamentalsAES fundamentals + + diff --git a/en/aes_functions.html b/en/aes_functions.html new file mode 100644 index 000000000..f6add6d3f --- /dev/null +++ b/en/aes_functions.html @@ -0,0 +1,1740 @@ + + + + + +The documentation for TOS: AES function list + + + + + + + + + +Home +AESAES +Font selectionFont selection +AES structuresAES structures + +
+ +

8.26 AES function list

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
dechexFunction namePresent in
0,00x00sys_set_getdispMagiC
0,10x00sys_set_getfnMagiC
0,20x00sys_set_setfnMagiC
0,30x00sys_set_appl_getinfoMagiC
0,40x00sys_set_editobMagiC
0,50x00sys_recalc_cicon_coloursMagiC
0,60x00sys_set_winframe_managerMagiC 6
100x0Aappl_initTOS
110x0Bappl_readTOS
120x0Cappl_writeTOS
130x0Dappl_findTOS
140x0Eappl_tplayTOS
150x0Fappl_trecordTOS
160x10appl_bvset???
170x11appl_yieldMagiC, N.AES
180x12appl_searchTOS
180x12appl_xbvgetGEM/4
180x12appl_xbvsetGEM/4
190x13appl_exitTOS
200x14evnt_keybdTOS
210x15evnt_buttonTOS
220x16evnt_mouseTOS
230x17evnt_mesagTOS
240x18evnt_timerTOS
250x19evnt_multiTOS
260x1Aevnt_dclickTOS
300x1Emenu_barTOS
310x1Fmenu_icheckTOS
320x20menu_ienableTOS
330x21menu_tnormalTOS
340x22menu_textTOS
350x23menu_registerTOS
360x24menu_unregisterMagiC
360x24menu_popupTOS
370x25menu_clickMagiC
370x25menu_attachTOS
380x26menu_istartTOS
380x26GEM/4: Manages events for menus
390x27menu_settingsTOS
400x28objc_addTOS
410x29objc_deleteTOS
420x2Aobjc_drawTOS
430x2Bobjc_findTOS
440x2Cobjc_offsetTOS
450x2Dobjc_orderTOS
460x2Eobjc_editTOS
460x2Eobjc_xeditMagiC
470x2Fobjc_changeTOS
480x30objc_sysvarTOS
490x31objc_xfindN.AES
500x32form_doTOS
500x32form_xdoMagiC
510x33form_dialTOS
510x33form_xdialMagiC
520x34form_alertTOS
530x35form_errorTOS
540x36form_centerTOS
550x37form_keybdTOS
560x38form_buttonTOS
570x39GEM/4: Based on form_do but takes extra parameter
580x3AGEM/4: Based on form_alert but takes extra parameter
600x3Cobjc_wdrawMagiC V5.10 (11.12.96) +
600x3Cproc_createGEM/XM
610x3Dobjc_wchangeMagiC V5.10 (11.12.96) +
610x3Dproc_runGEM/XM
620x3Egraf_wwatchboxMagiC V5.10 (11.12.96) +
620x3Eproc_deleteGEM/XM
630x3Fform_wbuttonMagiC V5.10 (11.12.96) +
630x3Fproc_infoGEM/XM
640x40form_wkeybdMagiC V5.10 (11.12.96) +
640x40proc_mallocGEM/XM
650x41objc_weditMagiC V5.10 (11.12.96) +
650x41proc_mfreeGEM/XM
660x42proc_switchGEM/XM
670x43proc_setblockGEM/XM
680x44proc_shrinkGEM/XM
680x44graf_vmemMyAES 0.97 (10.12.2017)
690x45graf_multirubberN.AES
700x46graf_rubberboxTOS
710x47graf_dragboxTOS
720x48graf_moveboxTOS
730x49graf_growboxTOS
740x4Agraf_shrinkboxTOS
750x4Bgraf_watchboxTOS
760x4Cgraf_slideboxTOS
770x4Dgraf_handleTOS
770x4Dgraf_xhandleKAOS 1.4
780x4Egraf_mouseTOS
790x4Fgraf_mkstateTOS
800x50scrp_readTOS
810x51scrp_writeTOS
820x52scrp_clearMagiC
900x5Afsel_inputTOS
910x5Bfsel_exinputTOS
910x5Bfsel_boxinputAs of BoxKite 1.71
910x5BGEM/4, GEM/5: Based on fsel_input but takes extra parameter
990x63wind_drawN.AES
1000x64wind_createTOS
1010x65wind_openTOS
1020x66wind_closeTOS
1030x67wind_deleteTOS
1040x68wind_getTOS
1050x69wind_setTOS
1060x6Awind_findTOS
1070x6Bwind_updateTOS
1080x6Cwind_calcTOS
1090x6Dwind_newTOS
1100x6Ersrc_loadTOS
1110x6Frsrc_freeTOS
1120x70rsrc_gaddrTOS
1130x71rsrc_saddrTOS
1140x72rsrc_obfixTOS
1150x73rsrc_rcfixMTOS
1150x73GEM/4, GEM/5: Based on rsrc_load, supports EMS
1160x74GEM/4, GEM/5: Manipulates resources in EMS
1190x77wind_apfindMultiGEM2
1200x78shel_readTOS
1210x79shel_writeTOS
1220x7Ashel_getTOS
1230x7Bshel_putTOS
1240x7Cshel_findTOS
1250x7Dshel_envrnTOS
1260x7Eshel_rdefPC-GEM, N.AES
1270x7Fshel_wdefPC-GEM, N.AES
1280x80shel_helpN.AES
1290x81appl_controlN.AES
1300x82appl_getinfoTOS
1300x82xgrf_stepcalcGEM/3
1310x83appl_getciconMyAES
1310x83xgrf_2boxGEM/3
1320x84xgrf_colorViewMAX
1330x85xgrf_dtimageViewMAX Panther
1350x87form_popupMagiC
1350x87xfrm_popupMagiC 5.03
1360x88form_xerrMagiC
1370x89appl_optionsXaAES
1400x8cobjc_dataXaAES
1600xA0wdlg_createWDialog
1610xA1wdlg_openWDialog
1620xA2wdlg_closeWDialog
1630xA3wdlg_deleteWDialog
164,00xA4wdlg_get_treeWDialog
164,10xA4wdlg_get_editWDialog
164,20xA4wdlg_get_udataWDialog
164,30xA4wdlg_get_handleWDialog
165,00xA5wdlg_set_editWDialog
165,10xA5wdlg_set_treeWDialog
165,20xA5wdlg_set_sizeWDialog
165,30xA5wdlg_set_iconifyWDialog
165,40xA5wdlg_set_uniconifyWDialog
1660xA6wdlg_evntWDialog
1670xA7wdlg_redrawWDialog
1700xAAlbox_createWDialog
1710xABlbox_updateWDialog
1720xAClbox_doWDialog
1730xADlbox_deleteWDialog
174,00xAElbox_cnt_itemsWDialog
174,10xAElbox_get_treeWDialog
174,20xAElbox_get_avisWDialog
174,30xAElbox_get_udataWDialog
174,40xAElbox_get_afirstWDialog
174,50xAElbox_get_slct_idxWDialog
174,60xAElbox_get_itemsWDialog
174,70xAElbox_get_itemWDialog
174,80xAElbox_get_slct_itemWDialog
174,90xAElbox_get_idxWDialog
174,100xAElbox_get_bvisWDialog
174,110xAElbox_get_bentriesWDialog
174,120xAElbox_get_bfirstWDialog
175,00xAFlbox_set_asldrWDialog
175,10xAFlbox_set_itemsWDialog
175,20xAFlbox_free_itemsWDialog
175,30xAFlbox_free_listWDialog
175,40xAFlbox_ascroll_toWDialog
175,50xAFlbox_set_bsldrWDialog
175,60xAFlbox_set_bentriesWDialog
175,70xAFlbox_bscroll_toWDialog
1800xB4fnts_createWDialog
1810xB5fnts_deleteWDialog
1820xB6fnts_openWDialog
1830xB7fnts_closeWDialog
184,00xB8fnts_get_no_stylesWDialog
184,10xB8fnts_get_styleWDialog
184,20xB8fnts_get_nameWDialog
184,30xB8fnts_get_infoWDialog
185,00xB9fnts_addWDialog
185,10xB9fnts_removeWDialog
185,20xB9fnts_updateWDialog
1860xBAfnts_evntWDialog
1870xBBfnts_doWDialog
1900xBEfslx_openMagiC
1910xBFfslx_closeMagiC
1920xC0fslx_getnxtfileMagiC
1930xC1fslx_evntMagiC
1940xC2fslx_doMagiC
1950xC3fslx_set_flagsMagiC
2000xC8pdlg_createWDialog
2010xC9pdlg_deleteWDialog
2020xCApdlg_openWDialog
2030xCBpdlg_closeWDialog
204,00xCCpdlg_get_setsizeWDialog
205,00xCDpdlg_add_printersWDialog
205,10xCDpdlg_remove_printersWDialog
205,20xCDpdlg_updateWDialog
205,30xCDpdlg_add_sub_dialogsWDialog
205,40xCDpdlg_remove_sub_dialogsWDialog
205,50xCDpdlg_new_settingsWDialog
205,60xCDpdlg_free_settingsWDialog
205,70xCDpdlg_dflt_settingsWDialog
205,80xCDpdlg_validate_settingsWDialog
205,90xCDpdlg_use_settingsWDialog
205,100xCDpdlg_save_default_settingsWDialog
2060xCEpdlg_evntWDialog
2070xCFpdlg_doWDialog
2100xD2edit_createMagiC 5.20
2110xD3edit_openMagiC 5.20
2120xD4edit_closeMagiC 5.20
2130xD5edit_deleteMagiC 5.20
2140xD6edit_cursorMagiC 5.20
2150xD7edit_evntMagiC 5.20
216,00xD8edit_get_bufMagiC 5.20
216,10xD8edit_get_formatMagiC 5.20
216,20xD8edit_get_colourMagiC 5.20
216,30xD8edit_get_fontMagiC 5.20
216,40xD8edit_get_cursorMagiC 5.20
216,50xD8edit_get_posMagiC 5.20
216,70xD8edit_get_dirtyMagiC 5.20
216,80xD8edit_get_selMagiC 5.20
216,90xD8edit_get_scrollinfoMagiC 5.20
217,00xD9edit_set_bufMagiC 5.20
217,10xD9edit_set_formatMagiC 5.20
217,20xD9edit_set_colourMagiC 5.20
217,30xD9edit_set_fontMagiC 5.20
217,40xD9edit_set_cursorMagiC 5.20
217,50xD9edit_set_posMagiC 5.20
217,60xD9edit_resizedMagiC 5.20
217,70xD9edit_set_dirtyMagiC 5.20
217,90xD9edit_scrollMagiC 5.20
2500xFAbutton_clickUp to XaAES v0.963
2510xFBnew_clientUp to XaAES v0.963
2520xFCclient_exitUp to XaAES v0.963
2530xFDshutdownUp to XaAES v0.963
2540xFEobjc_setscrollUp to XaAES v0.963
2550xFFrregenUp to XaAES v0.920
2560x100wredrawUp to XaAES v0.920
2600x104appl_pipeUp to XaAES v0.963
10100x3F2prop_getFreeGEM, 25.7.1999
10110x3F3prop_putFreeGEM, 25.7.1999
10120x3F4prop_delFreeGEM, 25.7.1999
10130x3F5prop_gui_getFreeGEM, 22.3.2000
10140x3F6prop_gui_setFreeGEM, 22.3.2000
10200x3FCxapp_getinfoFreeGEM, 8.8.1999
10300x406xshl_getshellFreeGEM, 3.12.1999
10310x407xshl_setshellFreeGEM, 3.12.1999
289280x7100x_appl_flagsGeneva
289290x7101x_appl_fontGeneva
289300x7102x_appl_sleepGeneva
289310x7103x_appl_termGeneva
289440x7110x_form_centerGeneva
289450x7111x_form_errorGeneva
289460x7112x_form_filenameGeneva
289470x7113x_form_mouseGeneva
289600x7120x_fsel_inputGeneva
289760x7130x_graf_blitGeneva
289770x7131x_graf_rubberboxGeneva
289780x7132x_graf_rast2rezGeneva 004
289920x7140x_objc_editGeneva
290080x7150x_wdial_drawGeneva
290090x7151x_wdial_changeGeneva
290100x7152x_wind_treeGeneva
290110x7153x_wind_createGeneva
290120x7154x_wind_calcGeneva
290240x7160x_scrp_getGeneva 004
290560x7180x_settingsGeneva
290570x7181x_shel_getGeneva
290580x7182x_shel_putGeneva
290590x7183x_sprintfGeneva
290600x7184x_sscanfGeneva
290610x7185x_helpGeneva
290620x7186x_mallocGeneva 004
290630x7187x_mfreeGeneva 004
290640x7188x_mshrinkGeneva 004
290650x7189x_reallocGeneva 004
+
+ +
+ +Home +AESAES +Font selectionFont selection +AES structuresAES structures + + diff --git a/en/aes_fundamentals.html b/en/aes_fundamentals.html new file mode 100644 index 000000000..c4dc63c1d --- /dev/null +++ b/en/aes_fundamentals.html @@ -0,0 +1,1739 @@ + + + + + +The documentation for TOS: AES fundamentals + + + + + + + + + +Home +AESAES +About the AESAbout the AES +Application libraryApplication library + +
+ +

8.2 AES fundamentals

+

The AES (Application Environment Services forms the highest level +of GEM. It deals with all those parts of GEM that go above +elementary graphic output and input functions. As the AES works +exclusively with VDI and GEMDOS calls, it is completely independent of the +graphic hardware, of input devices as well as of file-systems. +

+

The AES manages two types of user programs: Normal GEM +applications with file extensions '.PRG', '.APP' or '.GTP', and desk +accessories with file extensions '.ACC'. +

+

Unless you are using a multitasking operating system such as +MagiC, MiNT or MultiTOS, the AES can only run one application and +six desk accessories at a time. Desk accessories (with an '.ACC' +extension) allow quasi-multitasking even with plain TOS: They are +usually special GEM programs loaded (wholly or partially) at boot-up +from the root directory of the boot drive (normally C:\), which remain +in memory and can be called at any time from GEM (and some +TOS) programs by clicking on their entry in the first drop/pulldown +menu. In other words, desk accessories can be called and used while +another application is running and has its window(s) open, even with a +single-tasking operating system such as TOS. Note that this is not +real multi-tasking, as the main application is suspended while the +accessory is executing and only resumes when the accessory is exited. +

+

Unlike applications, desk accessories don't interact with the +user immediately; most just initialize themselves and enter a message +loop awaiting an AC_OPEN message. Some wait for timer events or +special messages from other applications. Once triggered, they usually +open a window where a user may interact with them. Under TOS, +accessories should not use a menu bar and should never exit after a +menu_register call. Loading of any resources should happen before the +accessory calls menu_register, and these resources should be embedded +in the desk accessory rather than being post-loaded, as on TOS +versions earlier than 2.06 memory allocated to a desk accessory is not +freed at a resolution change; thus memory allocated with rsrc_load is +lost to the system after a change of resolution with the early +TOS's. +

+

When a desk accessory is closed under TOS, it is sent an +AC_CLOSE message by the system. Following this it should perform any +required cleanups to release sytem resources and close files opened at +AC_OPEN (the AES closes the accessory's windows automatically). +Following this it should reenter the event loop and wait for a later +AC_OPEN message. +

+

The following points are covered in this section: +

+ + + + + + + +

For the AES too there have been some interesting +developments, as various programmers have meanwhile announced their +own AES clones; at present one can mention projects such as +N.AES and XaAES. Besides constant evolution one +may hope also for source texts of these GEM components. +

+

See also: Style guidelines +

+

8.2.1 Accessories

+ + +

8.2.1.1 Startup-code for accessories

+ +

To test whether an application was launched as a program or as a +desk accessory, one can proceed as follows: +

+
    +
  • If the register a0 has the value zero at program startup, then +we are dealing with a normal program launch. +
      +

  • +
  • Otherwise we are dealing with a desk accessory, and register a0 +contains a pointer to the (incompletely) filled BASEPAGE. The TPA has +already been shrunk appropriately (to the sum of basepage size and the +length of the three program segments), but a stack still has to be +created. +
      +

  • +
+ +

Note: With this information there is no problem in +creating the start- up code for a program in such a way that it +recognizes automatically how the application was launched, and to +continue the initialization appropriately. With most C compilers the +external variable _app in the startup code is initialized +automatically, which has the value 0 when the application was launched +as a desk accessory. This makes it possible to develop applications so +that they may be launched either as desk accessories or as normal +programs. +

+

See also: +
About the AES   Accessories in MagiC   Program launch and TPA +

+

8.2.1.2 Accessories in MagiC

+ +

Under MagiC, desk accessories are almost equal to programs. +Their windows are maintained at program changes. They may have menus +and desktop backgrounds, post-load programs, allocate memory, +open/close/ delete/copy files etc. +

+

As there is no longer any reason to close windows at program +changes, there is no AC_CLOSE message any more. The system does not +distinguish desk accessories from programs, apart from the fact that +they may not terminate themselves. As under GEM/2, accessories can +also deregister themselves in the menu, using the AES call +menu_unregister. +

+

In place of accessories, under MagiC it is more sensible to use +applications that simply register one menu bar with one menu, and lie +in the APP autostart folder. These applications can be loaded when +required, and also removed again afterwards. +

+

Note: As of MagiC 4, desk accessories can be loaded +also while the system is running (not just at boot-up). Furthermore +accessories can be unloaded by clicking on the corresponding accessory +entry in the first menu while the [Control] key is held down. One +disadvantage is that at present accessories may not perform Pexec with +mode 104. +

+

See also: +
About the AES   GEM   Startup-code for accessories   shel_write +

+

8.2.2 The desktop window

+ +

Of the available windows, the desktop or background window plays +a special role. It has the ID 0, occupies the whole screen area, is +always open and also cannot be closed. The working area is the +area below the menu bar. Only in this working area can other programs +output to the screen or open their own windows. +

+

Normally the working area of the desktop appears as a solid +green area (in colour resolutions) or as a grey raster pattern (in +monochrome operation). The screen-manager attends to the screen redraws all on +its own; with a call of wind_set, other application programs +can anchor any other object tree as a background. In that case too the +screen-manager looks after any required redraws of sections of the +image. Although this possibility is very alluring, there are several +reasons that point against the use of the desktop window; the +most important: +

+
    +
  • Even under a multitasking-capable GEM (MagiC or MultiTOS), +there can be only one screen background. This should be +reserved for the program that can make the most use of it - as a rule +this is the desktop or a desktop replacement such as the Gemini shell, +Thing or Jinnee for instance. +
      +

  • +
+ +

To sum up: If possible, the desktop background should +not be used in your own programs. +

+

See also: About the AES   wind_set   WF_NEWDESK +

+

8.2.3 Data exchange via the GEM clipboard

+ + +

To store files in the clipboard, one should proceed as follows: +

+
    +
  • Delete all clipboard files that match the mask 'scrap.*' and +'SCRAP.*'. Note: The mask 'SCRAP.*' must be allowed for +because old programs knew nothing of alternative and case-sensitive +file-systems. +
  • +
  • Save the data to be stored in one or several formats. +
  • +
  • Send the message SC_CHANGED to all applications in the +system and SH_WDRAW to the system shell. +
  • +
+ +

The filename is always 'scrap.', the extension (suffix) +depends on the selected format here; if possible one should +always support one of the following standard formats: +

+
+ + + + + + + + + + + + + + + + +
SuffixMeaning
gemVector graphics in metafile format
imgPixel images in XIMG format
txtASCII text file, each line terminated with CR/LF
+
+ +

In addition one can support one or more of the following formats +(the receiver then has the option of using the option with the +greatest amount of information): +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SuffixMeaning
ascASCII text file, each paragraph terminated with CR/LF
csvASCII file with comma-separated numbers
cvgCalamus vector graphic format
difExport file of spreadsheets
epsEncapsulated PostScript
1wpWordplus format
rtfMicrosoft Rich Text Format
texTeX
+
+ +

The receiving program should first check which of the available +files contains the most information, and then use this file. +

+

Important: Each of the files in the clipboard contains +the same information on principle, just in different formats. The text +processor Papyrus, for instance, imports 'scrap.rtf' only if +its own format 'scrap.pap' could not be found. +

+

It should be clear from the above explanation that only +one data object (though in different formats) can be present +in the clipboard at any time. +

+

Note: A few old programs, such as First Word and First +Word Plus, are promiscuous and the clipoards they create automatically +are scattered all over the place - usually the directory they are +launched from. Some other applications may then use this clipboard +rather than the 'official' one on the boot drive! +

+

See also: Clipboard functions   scrp_clear   Style guidelines +

+

8.2.4 The object structure

+

Although the data structure of the object tree is not a tree in +the sense of a binary tree, it nevertheless possesses within a pointer +the logical chaining of a tree, with predecessors and successors +(generally called 'parents' and 'children' respectively). The speci +fication of parents and children is made via indices to an array. +

+

The tree structure of the individual objects can be illustrated +best with a simple example: A menu is composed at first of the menu +bar. This in turn contains several title texts. The title texts +therefore are contained directly in the menu bar, and are both +children of the object 'menu bar', so they move on the same +hierarchical level. The object menu bar refers with ob_head to +the first menu title and with ob_tail to the last menu title. +In the first menu title the pointer ob_next serves for +addressing the next menu title. Thus the chaining shows the following +structure: +

+
      Menu bar:
+   +---------+---------+--------+
+   | ob_head | ob_tail | ...    |
+   |    o    |    o    |        |
+   +----|----+----|----+--------+
+        |         +-------------------------+
+        V                                   V
+   +---------+---------+--------+       +---------+---------+--------+
+   | ...     | ob_next | ...    |  ...  | ...     | ...     | ...    |
+   |         |    o    |        |       |         |         |        |
+   +---------+----|----+--------+       +---------+---------+--------+
+   1st menu title |                          n-th menu title
+                  +-----> 2nd menu title
+
+

The actions that may be performed with a given object is +specified in ob_flags. The state of an object is held in the +entry ob_state. The entry ob_type determines the +object type. +

+

For an exact definition some objects need an additional data +structure such as TEDINFO or BITBLK. In that case a pointer to this +additional structure will be stored in ob_spec. +

+

Summarising again the total setup of the data structure for +objects OBJECT: +

+
         +-------------+
+         |  ob_next    |   Index for the next object
+         +-------------+
+         |  ob_head    |   Index of the first child
+         +-------------+
+         |  ob_tail    |   Index of the last child
+         +-------------+
+         |  ob_type    |   Object type
+         +-------------+
+         |  ob_flags   |   Manipulation flags
+         +-------------+
+         |  ob_state   |   Object status
+         +-------------+
+         |  ob_spec    |   See under object type
+         +-------------+
+         |  ob_x       |   Relative X-coordiante to parent object
+         +-------------+
+         |  ob_y       |   Relative Y-coordinate to parent object
+         +-------------+
+         |  ob_width   |   Width of the object
+         +-------------+
+         |  ob_height  |   Height of the object
+         +-------------+
+
+

See also: +
AES object colours   Object types   Manipulation flags   Object status +

+

8.2.4.1 AES object types

+ +

The following types of object are available for selection: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Type Meaning +
  + +
G_BOX (20) Rectangular box with optional border; ob_spec contains +sundry information about border width, colour and similar matters +
  + +
G_TEXT (21) Formatted graphic text; ob_spec points to a TEDINFO +structure +
  + +
G_BOXTEXT (22) Rectangular box with formatted graphic text; ob_spec +points to a TEDINFO structure +
  + +
G_IMAGE (23) Monochrome image; ob_spec points to BITBLK structure +
  + + + +
G_USERDEF (24) User-defined function for drawing a customized object; +ob_spec points to a USERBLK structure. (Note: In some +libraries this is called G_PROGDEF for a programmer-defined function) +
  + +
G_IBOX (25) Transparent rectangle that can only be seen if the optional +border does not have zero width; ob_spec contains futher +information about the appearance +
  + +
G_BUTTON (26) Push-button text with border for option selection; +ob_spec points to a text string with the text that is to +appear in the button +
  +
New as of MagiC Version 3.0: +
If the object flag WHITEBAK is set, and bit 15 in object status = +0, then the button will contain an underscored character; for this, +(high byte & 0xf) of ob_state gives the desired position +of the underscore (with a suitable library one can make the +underscored character when pressed together with the [Alternate] key +select the button in the dialog of a running application) +
  +
On the other hand if bit 15 = 1 then we are dealing with a +special button (radio-button or checkbox) +
  +
Further specialties: WHITEBAK = 1, bit 15 = 1 and in +ob_state: +
  + + + + + + + + + +
Highbyte = -2 Group frames +
Highbyte = -1 Special button, no underscore +
Highbyte != -1,-2 Special button, with underscore + +
+ +
(Here again (high byte & 0xf) of ob_spec is the +underscore position). The presence of these features is best +established via the function appl_getinfo (opcode 13). +
  + +
G_BOXCHAR (27) Rectangle containing a character; in ob_spec both the +appearance of the border and the character are defined +
  + +
G_STRING (28) Character string; ob_spec points to the string +
  +
New as of MagiC Version 3.0: +
If the object flag WHITEBAK is set, and the high-byte of +ob_state != -1, then a character of the string will be +underscored; the underscore position is determined by (high byte & +0xf) of ob_state +
  +
With WHITEBAK flag set and high byte ofob_state= -1 the +complete string will be underscored. The presence of these features is +best established via the function appl_getinfo (opcode 13). +
  + +
G_FTEXT (29) Editable formatted graphic text; ob_spec points to a +TEDINFO structure +
  + +
G_FBOXTEXT (30) Rectangle with editable formatted graphic text; ob_spec +points to a TEDINFO structure +
  + +
G_ICON (31) Monochrome icon symbol with mask; ob_spec points to the +ICONBLK structure +
  + +
G_TITLE (32) Title of a drop-down menu; ob_spec points to the +string. +
  +
As of MagiC 2 one can also underscore one of the characters. +This is done as follows: +
  +
Set WHITEBAK in ob_state +
  + + + + + + +
(ob_state >> 8) & 0xf Position of the underscore +
(ob_state >> 8) & 0xf0 is 0 + +
+ + +
G_CICON (33) Colour icon (available as of AES V3.3); ob_spec +points to the CICONBLK structure +
  + +
G_CLRICN (33) Colour icon; ob_spec is a pointer to an ICONBLK +structure. Supported in the ViewMAX/3 beta and in FreeGEM. +
  + +
G_SWBUTTON (34) Cycle button (i.e. a button which alters its text cyclically +when clicked on); ob_spec points to a SWINFO structure. The +presence of this object type should be inquired with appl_getinfo (opcode +13). +
  + +
G_DTMFDB (34) For internal AES use only: desktop image. The +ob_spec is a far pointer to a MFDB structure. Supported in the +ViewMAX/3 beta and in FreeGEM. +
  + +
G_POPUP (35) Popup menu; ob_spec points to a POPINFO structure. If +the menu has more than 16 entries, then it can be scrolled. The +presence of this object type should be inquired with appl_getinfo (opcode +13). Note: G_POPUP looks like G_BUTTON but the character +string is not centred, so as to line up with the other character +strings in the menu if possible. +
  + +
G_WINTITLE (36) This object number is used internally by MagiC to depict window +titles. The construction of this object type may change at any time +and is therefore not documented. +
  + +
G_EDIT (37) As of MagiC 5.20 an editable object implemented in a shared +library is available; ob_spec points to the object. +Warning: This type is not yet supported by the +functions form_do, form_xdo, form_button, form_keybd, objc_edit, wdlg_evnt and wdlg_do +at present, i.e. the corresponding events need to be passed on to the +object (with edit_evnt). +
  + +
G_SHORTCUT (38) This type is treated in a similar way to G_STRING, but any +keyboard shortcut present is split off and output ranged right. The +presence of this object type should be inquired for with appl_getinfo +(opcode 13). +
  +
The introduction of proportional AES fonts required new +strategy for the alignment of menu entries. So as to align keyboard +shortcuts ranged right, objects of the type G_STRING inside a menu are +therefore split into commands and shortcuts. This strategy however +fails for menus that are managed by the program itself, e.g. within a +window or a popup menu. This new object type had to be introduced in +order to achieve usable alignment in that case too. +
  + +
G_SLIST (39) XaAES extended object - scrolling list. +
  + +
+ +

Note: For G_BOX, G_IBOX and G_BOXCHAR, the component +ob_spec of the OBJECT structure does not point to +another data structure, but contains further information for the +appearance of the object. The following apply: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Bits Meaning +
    +
24..31 Character to be depicted (only for G_BOXCHAR) +
16..23 + + + + + + + + + +
 0 = Border width +
 1..128 = Border lies 1..128 pixels at the inside of the object +
-1..-127 = Border lies 1..127 pixel at the outside of the object + +
+ +
12..15 Border colour (0..15) +
08..11 Text colour (0..15) +
7 Text transparent (0) or opaque (1) +
04..06 + + + + + + + + + + + + + + + + + + +
0 = Hollow +
1 = Increasing intensity +
2   +
.   +
.   +
7 = Solid area + +
+ +
00..03 Inner colour (0..15) + +
+ +

The high byte is used by the AES only for submenus. If the +highest bit of ob_type is 0x8000 and the bit SUBMENU in +ob_flags is set, then the bits 8..14 specify which submenu is +coupled with the menu entry. Hence each application can have a maximum +of 128 submenus. MagiC only reads the low byte from ob_type, +apart from the submenu handling. TOS reacts cleanly to unknown +object types (such as the purely MagiC types G_SWBUTTON etc.), i.e. +the objects are not drawn. +

+

See also: Object structure in AES   AES object colours +

+

8.2.4.2 AES object colours

+ +

The following table contains the predefined object colours. Of +course particulars depend on the selected screen resolution, as well +as any settings made by the user. +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NumberColourStandard RGB values
WHITE (00)White1000, 1000, 1000
BLACK (01)Black0, 0, 0
RED (02)Red1000, 0, 0
GREEN (03)Green0, 1000, 0
BLUE (04)Blue0, 0, 1000
CYAN (05)Cyan0, 1000, 1000
YELLOW (06)Yellow1000, 1000, 0
MAGENTA (07)Magenta1000, 0, 1000
DWHITE (08)Light grey752, 752, 752
DBLACK (09)Dark grey501, 501, 501
DRED (10)Dark red713, 0, 0
DGREEN (11)Dark green0, 713, 0
DBLUE (12)Dark blue0, 0, 713
DCYAN (13)Dark cyan0, 713, 713
DYELLOW (14)Dark yellow713, 713, 0
DMAGENTA (15)Dark magenta713, 0, 713
+
+ +

Note: These colours also correspond mostly to the icon +colours used under Windows and OS/2. With a suitable CPX module one +can set the correct RGB values for the frst 16 colours. +

+

See also: Object structure in AES   AES object types +

+

8.2.4.3 AES object flags

+ +

The manipulation flags of an object determine its properties. +The following options can be chosen: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Flag Meaning +
  +
NONE (0x0000) No properties. +
  + +
SELECTABLE (0x0001) The object is selectable by clicking on it with the mouse. +
  + +
DEFAULT (0x0002) If the user presses the [Return] or [Enter] key, this object +will be selected automatically and the dialog exited; the object will +have a thicker outline. This flag is permitted only once in each tree. +
  + +
EXIT (0x0004) Clicking on such an object and releasing the mouse button while +still over it will terminate the dialog (see also form_do). +
  + +
EDITABLE (0x0008) This object may be edited by the user by means of the keyboard. +
  + +
RBUTTON (0x0010) If several objects in an object tree have the property RBUTTON +(radio button, similar to those on a push-button radio), then only one +of these objects can be in a selected state at a time. These objects +should all be children of a parent object with the object type G_IBOX. +If another object of this group is selected, then the previously +selected object will be deselected automatically. +
  + +
LASTOB (0x0020) This flag tells the AES that this is the last object within +an object tree. +
  + +
TOUCHEXIT (0x0040) The dialog (see also form_do) will be exited as soon as the +mouse pointer lies above this object and the left mouse button is +pressed. +
  + + +
HIDETREE (0x0080) The object and its children will no longer be noticed by +objc_draw and objc_find as soon as this flag is set. Furthermore this +flag is also evaluated as of MagiC 5.20 by form_keybd, if objects for +keyboard shortcuts are searched for. Input to hidden objects is still +possible, however. To prevent this, the EDITABLE flag has to be +cleared. +
  + +
INDIRECT (0x0100) ob_spec now points to a further pointer that in turn +points to the actual value of ob_spec (see also OBJECT). In +this way the standard data structures such as TEDINFO etc. can be +extended in a simple way. +
  + +
FL3DIND (0x0200) Under MultiTOS this object creates a three-dimensional object +(under MagiC as of Version 3.0 only from 16-colour resolutions onwards +and when the 3D effect has not been switched off). In 3D operation +this will be interpreted as an indicator. As a rule, such objects are +buttons that display a status, e.g. radio-buttons. +
  + +
ESCCANCEL (0x0200) Pressing the [Esc] key corresponds to the selection of the +object with this flag. Therefore there may be only one default object +in a dialog. Only effective in ViewMAX/2 and later. +
  + +
FL3DBAK (0x0400) In 3D operation this object will be treated as an AES +background object, and drawn as such. It is recommended to allocate +the ROOT object with this flag in dialogs with 3D buttons. The same +applies for editable fields and text objects, as only in this way will +a consistent background colour be maintained. +
  +
See also (0x4000). +
  + +
BITBUTTON (0x0400) This flag was introduced with ViewMAX beta, but not used there. +Presumably a button with this flag contains a bitmap in place of a +text. Only effective in ViewMAX/2 and later. +
  + +
FL3DACT (0x0600) In 3D operation this object will be treated as an activator. As +a rule such objects are buttons with which one can exit dialogs or +trigger some action. +
  + +
SUBMENU (0x0800) This is used in MultiTOS and from MagiC 5.10 on to mark +submenus. menu_attach sets this bit in a menu entry to signify that a +submenu is attached to it. The high byte of ob_typethen +contains the submenu index (128..255) i.e. bit 15 of ob_type +is always set simultabeously with SUBMENU. +
  + +
SCROLLER (0x0800) Pressing the [PAGEUP] key corresponds to the selection of the +first object with this flag in the dialog; pressing the [PAGEDOWN] key +corresponds to the selection of the last object with this flag. Only +effective in ViewMAX/2 and later. +
  + +
FLAG3D (0x1000) An object with this flag will be drawn with a 3D border. From +ViewMAX/2 on every button will be drawn automatically with a 3D +border. The colour category (see USECOLOURCAT) will be used for this. +Only effective in ViewMAX/2 and later. +
  + +
USECOLOURCAT (0x2000) USECOLOURCAT (0x2000) The colour of the object is not a colour +index of the VDI, but an entry in a table with colours for +designated categories. This table has 16 entries. ViewMAX uses the +following categories: +
  + + + + + + + + + + + + + + + + + + + + + +
CC_NAME (8) Inactive title-bar +
CC_SLIDER (8) Scroll bar background +
CC_DESKTOP (10) The desktop +
CC_BUTTON (11) Buttons and other 3D widgets +
CC_INFO (12) Window information-line +
CC_ALERT (13) Alert boxes (not used in ViewMAX or FreeGEM) +
CC_SLCTDNAME (14) Active title-bar + +
+ +
Probably it is intended to let the categories 0 to 7 be defined +by the application, while 8 to 15 are reserved for the system. The +settings are stored in ViewMAX.INI (GEM.CFG in FreeGEM) and consist +of one foreground, one background, a fill-style and a fill index in +each case. Only effective in ViewMAX/2 and later. +
  +
FL3DBAK (0x4000) 3D background (sunken rather than raised). To check for this +feature, use appl_init and check that bit 3 of xbuf.abilities is set. +
  +
SUBMENU (0x8000) Not implemented in any known PC AES. +
  + +
+ +

See also: Object structure in AES   AES object types +

+

8.2.4.4 AES object stati

+ +

The object status determines how an object will be displayed +later on the screen. An object status can be of the following type: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Status Meaning +
  +
NORMAL (0x0000) Normal representation. +
  + +
SELECTED (0x0001) Inverse representation, i.e. the object is selected (except for +G_CICON, which will use its 'selected' image). +
  + +
CROSSED (0x0002) If the object type is BOX, the object will be drawn with a +white diagonal cross over it (usually this state can be seen only over +a selected or coloured object). See also below. +
  + +
CHECKED (0x0004) A checkmark tick will be displayed at the left edge of the +object. +
  + +
DISABLED (0x0008) The object will be displayed greyed out and is no longer +selectable. +
  + +
OUTLINED (0x0010) The object gets a border. +
  + +
SHADOWED (0x0020) A shadow is drawn under the object. +
  + +
WHITEBAK (0x0040) With PC-GEM this causes the icon mask not to be drawn with +the icon, which can speed up output is some circumstances. +
As of MagiC 3 this controls the underscoring of character strings. +This feature can be ascertained with appl_getinfo (opcode 13). +
  + +
DRAW3D (0x0080) An object is to be drawn with a 3D effect. This flag is of +interest only for PC-GEM, and will be ignored by the Atari AES +(and also in MagiC). +
  + +
HIGHLIGHTED (0x0100) An object with this status will be surrounded by a dashed line +that is drawn with MD_XOR. This status was introduced with ViewMAX +beta. +
  + +
UNHIGHLIGHTED (0x0200) An object with this status will be drawn with the surround +explicitly set by the status HIGHLIGHTED removed. For this one has to +proceed as follows: First the status HIGHLIGHTED must be cleared, then +the status UNHIGHLIGHTED set and following this the object must be +redrawn with the function objc_draw. A redraw of the object without +the status UNHIGHLIGHTED would not remove the surround, as it lies +outside the area that the object occupies. After the redraw the status +UNHIGHLIGHTED should be cleared again. This status was introduced with +ViewMAX beta. +
  + +
UNDERLINE (0x0f00) This opcode is available in MagiC from Version 2.0 onwards, and +sets the position and size of the underscore for objects of the type +G_STRING, G_TITLE and G_BUTTON. +
  + +
XSTATE (0xf000) This opcode is available in MagiC from Version 2.0 onwards, and +serves for switching for the various button types (G_STRING, G_TITLE and +G_BUTTON). +
  + +
+ +

In GEM/5, CROSSED makes the object draw in 3D: +

+
    +
  • If an object is both CROSSED and SELECTABLE, then it is drawn +as a checkbox. +
  • +
  • If it is CROSSED, SELECTABLE and an RBUTTON, it is drawn as a +radio button. +
  • +
  • If it is a button or a box and it is CROSSED, then it is drawn +as a raised 3D shape, similar to Motif. +
  • +
  • If a button is CROSSED and DEFAULT, a "Return key" +symbol appears on it (rather like NEXTSTEP). +
  • +
  • Boxes and text fields that are CROSSED and CHECKED appear +sunken. +
  • +
+ +

GEM/5 can be detected by calling vqt_name for font 1. If +nothing is returned, GEM/5 is running. +

+

Recent FreeGEM builds contain a system based on the GEM/5 +one, but extended and backwards-compatible. The DRAW3D state is used +instead of CROSSED: +

+
    +
  • If an object is both DRAW3D and SELECTABLE, then it is drawn as +a checkbox. +
  • +
  • If it is DRAW3D, SELECTABLE and an RBUTTON, it is drawn as a +radio button. +
  • +
  • If a button is DRAW3D and DEFAULT, a "Return key" +symbol will be on it. +
  • +
  • If an object with a 3D border has the WHITEBAK state, then the +3D border will not have a black edge. +
  • +
  • If a radio button or checkbox has the WHITEBAK state, then it +will be drawn with a white background rather than in the colour used +by 3D objects. +
  • +
+ +

To check for these abilities, use appl_init and check that bit 3 +of xbuf.abilities is set. +

+

See also: Object structure in AES   AES object types +

+

8.2.5 The quarter-screen buffer

+

The quarter-screen buffer is required by the screen-manager to save the +contents of the menu background when drop-down menus drop down. The +'QSB' (the usual abbreviation) is also used for the display of alert +boxes. Normally its size should depend on the number of colour planes +and the size of the system font, but not on the total size of +the screen. +

+

A good formula would be: +
  500(characters) * space of one character * colour planes +

+

In 'ST High' resolution this would give a value of exactly 8000 +(i.e. a quarter of the screen memory). Unfortunately in many cases the +AES is not so clever. The following table contains a summary of the +algorithm used by some GEM versions: +

+
+ + + + + + + + + + + + + + + + +
GEM versionMethod for setting the QSB
1.0 and 1.2Static, 8000 bytes
1.4Dynamic, a quarter of the screen memory
3.0Dynamic, half of the screen memory
+
+ +

Note: The GEM versions 1.0 and 1.2 (i.e. up to and +including TOS Version 1.02) are not prepared by this for +colour graphics cards - one of several reasons why even with the use +of a special VDI driver under these GEM versions one can +not make use of colour graphics cards. +

+

See also: GEM +

+

8.2.6 The rectangle-list of a window

+ +

To overcome the problem of windows that overlap each other, the +AES holds for each window a so-called rectangle-list; when +a window is partially obscured, GEM divides the visible portion of +that window into the least possible number of non-overlapping +rectangles, the details of which are then stored in the +rectangle-list. Thus the elements of this list form a record of the +currently completely visible working area of the corresponding window. +

+

To redraw a window (or its contents) one first inquires with the +function wind_get(WF_FIRSTXYWH) for the first rectangle of the above +mentioned list. Then one checks whether this rectangle overlaps with +the screen area to be redrawn; then and only then one can redraw this +area with the use of vs_clip. +

+

This method will be continued with all remaining elements of the +rectangle-list, until the height and the width of a rectangle +have the value zero. +

+

See also: Clipping   WM_REDRAW   wind_get   wind_update +

+

8.2.7 The screen-manager

+

The screen-manager is always active and supervises the position +of the mouse pointer when this leaves the working area of the window +of other applications. The areas in question are the frames of the +windows, the drop-down menus and the menu bar. +

+

When touching the menu area, the screen-manager automatically +ensures that the section of the screen occupied by the menu is saved +and later restored again (the quarter-screen buffer is used for this). +

+

Manipulation of the window controllers also do not lead to +permanent changes of the screen memory; the result of the interaction +with the screen-manager are the so-called message events, which inform +the relevant application about the user's actions. +

+ + +

Note: The ID of the screen-manager can, incidentally, be +found easily by a call of appl_find("SCRENMGR"). +

+

See also: About the AES   GEM   Messages +

+

8.2.8 Toolbar support

+ +

From AES version 4.1 onwards the operating system supports +so-called toolbars. A toolbar is an OBJECT tree that is positioned +below the information-line of a window (and above the working area) +which makes it possible to display buttons, icons etc. in a window. +

+

As already known from the window routines, the management of +toolbars is shared betwen the AES and the application. Here the +AES is responsible for the following actions: +

+
    +
  • Adaptation of the X- and Y-coordinates of the toolbar when the +window is moved or its size is changed. +
  • +
  • Ensuring that the window is configured to the size required by +the window components and the toolbar. +
  • +
  • Adjustment of the toolbar's width to the width of the window. +
  • +
  • Redraw of the toolbar on receipt of a WM_REDRAW message. +
  • +
  • Sending of AES messages when the user activates an object of +the toolbar. +
  • +
+ +

The application, on the other hand, must look after the +following: +

+
    +
  • Construction of an OBJECT tree for the toolbar (in particulat +one has to ensure that all selectable elements of the toolbox have the +status TOUCHEXIT). +
  • +
  • Adjustment of the width of a toolbar object if this depends on +the width of the window (may be required when changing the size of the +window). +
  • +
  • Handling of USERDEF objects. +
  • +
  • Redrawing all objects whose appearance is to be changed. In +this case it is imperative that the rectangle-list of the toolbar is +inquired for and/or taken into account. +
  • +
  • Problems that arise in connection with the screen resolution +have to be solved. Thus, for instance, the height of an icon in the ST +Medium resolution can differ from the height of the icon in the TT030 +Medium resolution. +
  • +
+ +

For supporting toolbars in your own programs, you should +respect the following points: +

+ + +

See also: +
WF_TOOLBAR   WF_FTOOLBAR   WF_NTOOLBAR   WM_TOOLBAR   wind_get   wind_set +

+

8.2.8.1 Redraw and updating of toolbars

+

For redraws of (parts of) the toolbar, one has to pay respect to +the rectangle-list as usual. As the previous wind_get opcodes WF_FIRSTXYWH +and WF_NEXTXYWH only respect the working area of a window, however, +two new parameters (WF_FTOOLBAR and WF_NTOOLBAR) were introduced, with whose +help the rectangle-list of a toolbar can be interrogated. +

+

A redraw of (parts of) the toolbar may be necessary in the +following situations: +

+
    +
  • The toolbar contains user-defined objects (USERDEF's). +
  • +
  • The status of an object in the toolbar was altered. The area to +be redrawn here consists of the size of the object plus the space +required for special effects (3D, shadowing, outlining etc.). +
  • +
+ +

Redraw is not necessary in the following cases, for +instance: +

+
    +
  • The relevant window is iconified. The application does not have +to take on any management of the toolbar; this is only required at the +restoration of the iconification, the so-called uniconify. +
  • +
  • The toolbar present in the window is to be replaced by another +one. In this case a call of wind_set with the opcode WF_TOOLBAR and +the address of the new OBJECT tree will suffice. +
  • +
  • The toolbar present in the window is to be removed. In this +case a call of wind_set with the opcode WF_TOOLBAR and NULL parameters +will suffice. +
  • +
+ +

See also: Rectangle-list of a window   Toolbar support +

+

8.2.8.2 Toolbars and the window-manager

+

For handling toolbars an application can have recourse to the +window- manager of the AES. In detail: +

+ +

For tacking on a toolbar to a window, it is sufficient +to call wind_set(handle, WF_TOOLBAR, ...) with the address of the +toolbar object tree. If this call is executed while the window is +open, then it is itself responsible for the correct calculation of the +height of the toolbar. +

+ +

To exchange a toolbar for another one, one can have +recourse to a call of wind_set(handle, WF_TOOLBAR, ...) with the +address of the new toolbar. If this call is executed while the window +is open, then it is itself responsible for the correct calculation of +the height of the (new) toolbar. +

+ +

To remove a toolbar from a window, it is necessary to +call wind_set(handle, WF_TOOLBAR, ...) with NULL parameters. If this +call is executed while the window is open, then it is itself +responsible for the correct calculation of the height of the toolbar. +

+

In addition the following points have to be taken into +consideration: +

+
    +
  • If a window is closed with wind_close, then any toolbar present +will not be removed. At a later reopening the toolbar will be +in place once more. +
  • +
  • If a window is removed with wind_delete, then its link to a +toolbar will be dissolved. +
  • +
  • To be able to recognize mouse-clicks on toolbar objects, these +have to possess the status TOUCHEXIT. When such an object is clicked +on, the AES creates a WM_TOOLBAR message which is sent to the +relevant application. +
  • +
+ +

See also: AES   GEM   Toolbar support +

+

8.2.8.3 Problems with wind_calc in toolbar windows

+ +

When applying the function wind_calc to windows that possess a +toolbar there are several problems to be taken into account: +

+

As this function is not passed a window ID (window +handle), the desired sizes cannot be calculated correctly when a +toolbar is present in the window. The reason for this is that, quite +simply, the AES in this case has no information about the +toolbar, and specially about its size. +

+

Hence the values returned by wind_calc in such cases have to be +further refined by the application. As the program can access the +relevant OBJECT tree (and with this also the height of the toolbar), +this should present no problems. In detail: +

+
    +
  • When ascertaining the border areas of the window, the +height of the toolbar must be added to the height returned by the +function. +
  • +
  • When ascertaining the working area of the window, the +height of the toolbar must be added to the Y-value (couty) +returned by the function. +
  • +
+ +

Note: Besides the height of the actual object, the +height of the toolbar should include also the space requirement for +special effects (3D, shadowing, etc.). +

+

See also: WF_FTOOLBAR   WF_NTOOLBAR   WM_TOOLBAR   objc_sysvar +

+

8.2.9 AES bindings

+ +

The AES is called via a single subprogram that is passed 6 +parameters; these are addresses of various arrays that are used for +input/output communications. To call an AES function, the following +parameter block must be populated with the addresses of the arrays +described below: +

+ + +
typedef struct
+{
+    int16_t *cb_pcontrol;  /* Pointer to control array */
+    int16_t *cb_pglobal;   /* Pointer to global array  */
+    int16_t *cb_pintin;    /* Pointer to int_in array  */
+    int16_t *cb_pintout;   /* Pointer to int_out array */
+    int16_t *cb_padrin;    /* Pointer to adr_in array  */
+    int16_t *cb_padrout;   /* Pointer to adr_out array */
+} AESPB;
+
+

The address of this parameter block (which lies on the stack) +must be entered in register d1, and subsequently register d0.w must be +filled with the magic value 0xc8 (200). With a TRAP #2 system call the +AES can then be called directly. For the +Pure-Assembler this could look like this, for +instance: +

+ +
                .EXPORT aes         ; Export function
+                .CODE               ; Start of the code-segment
+
+        aes:     MOVE.L 4(sp),d1    ; Address of the parameter blocks
+                 MOVE.W #200,d0     ; Opcode of the AES
+                 TRAP   #2          ; Call GEM
+                 RTS                ; And exit
+
+                .END                ; End of the module
+
+

There is no clear information available about which registers +may be altered. In fact, however, the corresponding routines in ROM +save all registers. +

+

Now to the individual arrays. With each field, designated input +or output functions can be performed. The following apply: +

+ + + + + + + + + + + + + + + + + + + +
int16_t control[5] With this field information about the called function and its +parameters can be determined. The following apply: + + + + + + + + + + + + + + + +
control[0] = Function number (opcode) +
control[1] = Number of elements in int_in array the function is being sent +
control[2] = Number of elements in int_out array the function is being +sent +
control[3] = Number of elements in addr_in array the function returns +
control[4] = Number of elements in addr_out array the function returns + +
+ +
There is no clear information about which elements must be set +before an AES call. It is required in each case for elements +[0],[1] and [3]. It seems less sensible for the elements [2] and [4] - +after all the AES functions know how many values they return in the +output fields. + + +
int16_t global[15] This field contains global data for the application and is used +partly by appl_init and partly by other AES functions, and is +filled automatically. The following apply: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
global[0] Version number of the AES + +
global[1] Number of applications that can run concurrently; with a value +of -1 there is no limit +
global[2] Unique ID number of the application +
global[3,4] Miscellaneous information that only has meanning for the +application, and can be set and read by it +
global[5,6] Pointer to a list of pointers to the object trees of the +application (is set by rsrc_load) +
global[7,8] Address of the memory reserved for the resource file. Only +documented by Digital Research and not by Atari. +
global[9] Length of the reserved memory. Only documented by Digital +Research and not by Atari. +
global[10] Number of colour planes. Only documented by Digital Research +and not by Atari. +
global[11,12] Reserved +
global[13] Maximum height of a character, which is used by the AES for +the vst_height call. This entry is only available as of AES Version +4.0, and also only documented by Atari. +
As of PC-GEM Version 2.0 this value is interpreted as a +bit-vector with the drives registered with the desktop (bit 15 = Drive +A:). +
global[14] Minimum height of a character, which is used by the AES for +the vst_height call. This entry is only available as of AES Version +4.0, and also only documented by Atari. +
As of PC-GEM Version 2.0 this value is interpreted as a +bit-vector that specifies which of the drives listed in global[13] can +be regarded as hard drives. + +
+ + +
int16_t int_in[16] All 16-bit-sized input parameters are passed with this field. + +
int16_t int_out[10] All 16-bit-sized return values are supplied by the AES via +this field. + +
int32_t addr_in[8] This field serves for the transmission of pointers (e.g. +pointers to character strings) to the AES functions. + +
int32_t addr_out[2] All 32-bit-sized return values are supplied by the AES via +this field. + +
+ +

Warning: If the operating system supports threads, then +it is imperative that a multithread-safe library is used. In +particular one must ensure that each thread receives its own +global field (see above). +

+

See also: Sample binding   VDI bindings   TOS list +

+

8.2.9.1 Sample binding for AES functions

+

The function 'crys_if' (crystal interface) looks after the +proper filling of the control arrays, and performs the actual AES +call. It is passed one WORD parameter in d0 containing the funtion's +opcode minus 10 multiplied by 4 (for faster table indexing); this +gives an index into a table in which the values for control[1], +control[2] and control[3] are entered for each individual AES +function. +

+ +
AESPB c;
+
+int16_t crys_if (int16_t opcode)
+{
+        int16_t i, *paesb;
+
+        control[0] = opcode;
+        paespb = &ctrl_cnts[ (opcode-10)*3 ];
+
+        for (i = 1; i < 4; i++)
+                control[i] = *paespb++;
+
+        aes (c);
+        return (int_out[0]);
+
+} /* crys_if */
+
+

The table used for this could be built up as follows, for +instance: +

+
.GLOBAL ctrl_cnts
+.DATA
+
+ctrl_cnts: .dc.b     0,  1,  0       ; appl_init
+           .dc.b     2,  1,  1       ; appl_read
+           .dc.b     2,  1,  1       ; appl_write
+            ...
+            ...
+            ...
+
+.END
+
+

A fuller version is given in The Atari Compendium pp. +6.39-41. Note that the rsrc_gaddr call must be special cased in a +library if you want to use the crys_if binding to call the AES. +

+

See also: AES bindings   GEM +

+
+ +Home +AESAES +About the AESAbout the AES +Application libraryApplication library + + diff --git a/en/aes_main.html b/en/aes_main.html new file mode 100644 index 000000000..cc873a6b5 --- /dev/null +++ b/en/aes_main.html @@ -0,0 +1,63 @@ + + + + + +The documentation for TOS: AES + + + + + + + + + +Home +Contents +VDI structuresVDI structures +About the AESAbout the AES + +
+ +

8 AES

+ +
+
+ +Home +Contents +VDI structuresVDI structures +About the AESAbout the AES + + diff --git a/en/aes_structures.html b/en/aes_structures.html new file mode 100644 index 000000000..44a58e22e --- /dev/null +++ b/en/aes_structures.html @@ -0,0 +1,2321 @@ + + + + + +The documentation for TOS: AES structures + + + + + + + + + +Home +AESAES +AES function listAES function list +XCONTROLXCONTROL + +
+ +

8.27 AES structures

+ +
+

8.27.1 AESPB

+
typedef struct
+{
+    int16_t *cb_pcontrol;  /* Pointer to control array */
+    int16_t *cb_pglobal;   /* Pointer to global array  */
+    int16_t *cb_pintin;    /* Pointer to int_in array  */
+    int16_t *cb_pintout;   /* Pointer to int_out array */
+    int16_t *cb_padrin;    /* Pointer to adr_in array  */
+    int16_t *cb_padrout;   /* Pointer to adr_out array */
+} AESPB;
+
+

8.27.2 ANI_MOUSE

+

Describes (animated) mouse shape +

+
typedef struct
+{
+   int16_t frames;      /* Number of frames in shape          */
+   int16_t delay;       /* 50Hz tics to pause between frames  */
+   MFORM form[32];      /* List of mouse forms                */
+} ANI_MOUSE;
+
+

See also: graf_mouse +

+

8.27.3 APPFLAGS

+

Describes application flags +

+
typedef struct
+{
+  unit8_t name[13];       /* Filename pattern to use these flags       */
+  unit8_t desc[17];       /* User-defined description of flags         */
+  APFLG flags;            /* Execution flags                           */
+  KEYCODE open_key;       /* Open application when this key is pressed */
+  KEYCODE reserve_key[3]; /* Application uses these keys, so don't let */
+                          /* Geneva process them                       */
+} APPFLAGS;
+
+

See also: x_appl_flags   APFLG   KEYCODE +

+

8.27.4 APFLG

+

Application bit flags +

+
typedef union
+{
+   struct
+   {
+     unsigned multitask    :1;  /* 1: Multitasking                       */
+     unsigned special_types:1;  /* 1: Use extended object types          */
+     unsigned round_buttons:1;  /* 1: Use rounded EXIT buttons           */
+     unsigned kbd_equivs   :1;  /* 1: Use auto keyboard equivs           */
+     unsigned undo_equivs  :1;  /* 1: Undraw when form_do exits          */
+     unsigned off_left     :1;  /* 1: Allow windows off left edge        */
+     unsigned exit_redraw  :1;  /* 1: Redraw everything at quit          */
+     unsigned AES40_msgs   :1;  /* 1: New messages for AES 4.0 OK        */
+     unsigned limit_handles:1;  /* 1: Limit window handles to 1-7        */
+     unsigned limit_memory :1;  /* 1: Limit Malloc's                     */
+     unsigned keep_deskmenu:1;  /* 1: Keep desktop/menu bar              */
+     unsigned clear_memory :1;  /* 1: Clear Malloc'd memory              */
+     unsigned maximize_wind:1;  /* 1: Omit unnecessary gadgets           */
+     unsigned optim_redraws:1;  /* 1: Optimize window redraws (rel 004)  */
+     unsigned unused       :2;  /* Reserved for future use               */
+     unsigned mem_limit    :16; /* Kb to limit memory allocation         */
+   } s;
+   unit32_t l;                  /* longword to access all bits           */
+} APFLG;
+
+

The multitask and limit_handles flags must not +be changed for a process which is already in memory. +

+

optim_redraws is present since release 004. +

+

See also: x_appl_flags   APPFLAGS +

+

8.27.5 APPLRECORD

+

This structure is defined as follows: +

+
typedef struct
+{
+    int32_t type;      /* Type of event                  */
+    int32_t what;      /* Exact description of the event */
+} APPLRECORD
+
+

For the components the following apply: +

+ + + + + + + + + + + + + + + + + + +
type Meaning what +
    +
0   Timer event Number of 20-millisecond ticks +
1   Button event (high-WORD) Status of mouse buttons (0 = not depressed, 1 = +depressed): + + + + + + +
Left button: 0x0001 +
Right button: 0x0002 + +
+ +
(low-WORD) Number of clicks. +
2   Mouse event X-coordinate (high-WORD), Y-coordinate (low-WORD) of hotspot +
3   Keyboard event + + + + + + + + + +
Bits 24-31 Scancode +
Bits 16-23 ASCII code +
Low-Word State of 'special' keys (0 = not depressed, 1 = depressed): + + + + + + + + + + + + +
Right [Shift]: 0x0001 +
Left [Shift]: 0x0002 +
[Control]: 0x0004 +
[Alternate]: 0x0008 + +
+ + +
+ + +
+ +

Note: Under PC-GEM each event occupies only 6 bytes, +as the component type of APPLRECORD is defined as a int16_t +there. +

+

See also: appl_tplay   appl_trecord +

+

8.27.6 The bit-block structure

+ +

A bit-image can always be used wherever a non-selectable icon +could be placed; the crucial difference is that no mask exists +for a bit-image. This structure is defined as follows: +

+
typedef struct
+{
+  int16_t  *bi_pdata;     /* Pointer to the graphics data  */
+  int16_t  bi_wb;         /* Width of the image in bytes   */
+  int16_t  bi_hl;         /* Height in lines               */
+  int16_t  bi_x;          /* X-position, and               */
+  int16_t  bi_y;          /* Y-position of top left corner */
+  int16_t  bi_color;      /* Colour                        */
+} BITBLK;
+
+

Note: The width of a bit-image (component bi_wb) +must always be divisible by 2. +

+

See also: OBJECT   AES object types +

+

8.27.7 CICON

+

This structure is defined as follows: +

+
typedef struct cicon_data
+{
+  int16_t num_planes;   /* Number of planes for the following data    */
+  int16_t *col_data;    /* Pointer to colour bitmap in standard form  */
+  int16_t *col_mask;    /* Pointer to individual colour plane mask    */
+  int16_t *sel_data;    /* Pointer to colour bitmap of selected icon  */
+  int16_t *sel_mask;    /* Pointer to individual plane mask of the icon */
+  struct cicon_data *next_res; /* Pointer to icon of other resolution */
+} CICON;
+
+

See also: CICONBLK   ICONBLK   OBJECT +

+

8.27.8 CICONBLK

+

This structure is defined as follows: +

+
typedef struct cicon_blk
+{
+   ICONBLK monoblk;    /* Default: monochrome icons            */
+   CICON   *mainlist;  /* Colour icons for various resolutions */
+} CICONBLK;
+
+

See also: OBJECT   AES object structure +

+

8.27.9 CLRCAT

+
typedef struct clrcat
+{
+  int16_t cc_foreground     /* Foreground colour    */
+  int16_t cc_background     /* Background colour    */
+  int16_t cc_style          /* Fill style           */
+  int16_t cc_pattern        /* Fill pattern         */
+} CLRCAT;
+
+

The CLRCAT is used internally by ViewMAX/2 and later to store +the colour categories. +

+

See also: X_BUF_V2 +

+

8.27.10 DIALOG

+
typedef void *DIALOG;
+
+

8.27.11 DITHER_MODE

+
typedef struct _dither_mode
+{
+   struct _dither_mode  *next;    /* Pointer to successor       */
+   int32_t       length;          /* Structure length           */
+   int32_t       format;          /* Data format                */
+   int32_t       reserved;        /* Reserved                   */
+   int32_t       dither_id;       /* Dither ID                  */
+   int32_t       color_modes;     /* Colour depths supported    */
+   int32_t       reserved1;       /* Reserved                   */
+   int32_t       reserved2;       /* Reserved                   */
+   int8_t        name[32];        /* Name of the dither process */
+} DITHER_MODE;
+
+

See also: Print dialogs   pdlg_add_printers +

+

8.27.12 DRV_ENTRY

+
typedef struct _drv_entry
+{
+   struct _drv_entry *next; /* Pointer to successor  */
+} DRV_ENTRY;
+
+

8.27.13 DRV_INFO

+
typedef struct
+{
+   int32_t     magic;           /* 'pdnf'                           */
+   int32_t     length;          /* Structure length                 */
+   int32_t     format;          /* Data format                      */
+   int32_t     reserved;        /* Reserved                         */
+   int16_t     driver_id;       /* Driver number for the VDI        */
+   int16_t     driver_type;     /* Driver type                      */
+   int32_t     reserved1;       /* Reserved                         */
+   int32_t     reserved2;       /* Reserved                         */
+   int32_t     reserved3;       /* Reserved                         */
+   PRN_ENTRY   *printers;       /* List of printers belonging to    */
+                                /* the driver                       */
+   DITHER_MODE *dither_modes;   /* List of dither processes         */
+                                /* supported by the driver          */
+   int32_t     reserved4;       /* Reserved                         */
+   int32_t     reserved5;       /* Reserved                         */
+   int32_t     reserved6;       /* Reserved                         */
+   int32_t     reserved7;       /* Reserved                         */
+   int32_t     reserved8;       /* Reserved                         */
+   int32_t     reserved9;       /* Reserved                         */
+   int8_t      device[128];     /* Printer driver output file       */
+} DRV_INFO;
+
+

See also: Print dialogs   pdlg_add_printers +

+

8.27.14 EVNT

+
typedef struct
+{
+    int16_t mwhich;         /* Type of events                     */
+    int16_t mx;             /* X-coordinate of the mouse pointer  */
+    int16_t my;             /* Y-coordinate of the mouse pointer  */
+    int16_t mbutton;        /* Pressed mouse button               */
+    int16_t kstate;         /* Status of 'special' keys (kbshift) */
+    int16_t key;            /* Scancode of pressed key            */
+    int16_t mclicks;        /* Number of mouse clicks             */
+    int16_t reserved[9];    /* Reserved                           */
+    int16_t msg[16];        /* Message buffer                     */
+} EVNT;
+
+

See also: fnts_evnt   fslx_evnt   wdlg_evnt +

+

8.27.15 FNTS_ITEM

+
typedef struct _fnts_item
+{
+  /* Pointer to next font, or 0L (end of list)  */
+  struct   _fnts_item  *next;
+  /* Pointer to display function for user fonts */
+  UTXT_FN  display;
+  /* Font ID, >= 65536 for user fonts */
+  int32_t  id;
+  /* Must be 0, as not a VDI font */
+  int16_t  index;
+  /* Flag for mono-spaced font */
+  int8_t   mono;
+  /* Flag for vector font */
+  int8_t   outline;
+  /* Number of predefined point sizes */
+  int16_t  npts;
+  /* Pointer to the complete name */
+  int8_t   *full_name;
+  /* Pointer to the family name */
+  int8_t   *family_name;
+  /* Pointer to the style name */
+  int8_t   *style_name;
+  /* Pointer to field with point sizes /
+  int8_t   *pts;
+  /* Reserved, must be 0 */
+  int32_t  reserved[4];
+} FNTS_ITEM;
+
+

See also: fnts_add   Font selection +

+

8.27.16 FNT_DIALOG

+
typedef void *FNT_DIALOG;
+
+

8.27.17 G_VECTORS

+ +
typedef struct G_vectors        /* Release 004 */
+{
+  int16_t used;
+  int16_t (*keypress)( int32_t *key );
+  int16_t (*app_switch)( int8_t *process_name, int16_t apid );
+  int16_t (*gen_event)(void);
+} G_VECTORS;
+
+ + + + + + + + + + + + + + + +
used: A bitmap of which vectors in the rest of the structure are used +by this version of Geneva. Currently this is 7, to indicate that the +first 3 vectors are used. +
  +
keypress: This function is called whenever Geneva receives a key from the +keyboard. The A0 register points to a longword containing the keycode +of the key which was pressed: +
  +
bits 31-24 23-16 15-8 7-0 +
shift scan code unused ASCII +
  +
This is just like the result of Bconin(2) with the result of +Kbshift(-1) stored in the high byte. +
  +
If the keypress function changes this longword to 0L, +then the keypress will be ignored. If the longword is changed to some +other value, then the new value will be processed. +
  +
If the keypress function returns a value >= 0, then +the application with that ID will receive a X_WM_VECKEY message during +its next event loop. +
  +
app_switch: This function is called whenever the user performs some action +that causes the topmost application to change, like selecting a name +from the Desk menu or topping another application's window. +
  +
When called, the A0 register points to a string in appl_find +format which is the name of the process that was switched to. The D0 +register contains the application ID of the process. +
  +
Under some circumstances, this function may be called even +though the "new" application is already the topmost one. It +is also possible for the "apid" in D0 to be -1, if Geneva is +in the process of shutting down. +
  +
If the app_switch function returns a value >= 0, then +the application with that ID will receive a X_WM_VECSW message during +its next event loop. +
  +
gen_event: This function is called continually by Geneva. It provides a +way for an application to have Geneva poll a certain condition and +generate an event if something occurs. +
  +
This can take the place of using evnt_multi with small timer +values in order to poll a condition, and is much more efficient. It +can be used in things like a corner clock to see when the time has +changed to a new minute. +
  +
If the gen_event function returns a value >= 0, then +the application with that ID will receive a X_WM_VECEVNT message +during its next event loop. +
  + +
+ +

Notes about using vectors: +

+
    +
  • A vector routine can change registers D0-D2/A0-A1. All others +must be preserved. +
      +

  • +
  • No vector routine can call the AES. The keypress and app_switch +vectors must not call GEMDOS functions. All other TOS services can be +used. +
      +

  • +
  • If a vector does not wish to generate an event, then it must +return a negative number, like -1. +
      +

  • +
  • A vector MUST follow the XBRA protocol. The only exception to +this is Geneva itself, which installs default vectors that do nothing +but return -1. +
      +

  • +
  • An application is responsible for removing itself from the +vector chain when it terminates. Failure to do so will most likely +cause a crash in the future. An application should use shel_write mode +9 to tell Geneva that it knows about the AP_TERM message and respond +to that message by removing itself from the list before quitting. +
      +

  • +
  • If your vector routine does not wish to generate an event, then +it should pass control through to the previous routine in the XBRA +chain. +
      +

  • +
  • If Geneva is running without MiNT, then the vector routines are +always called in supervisor mode. If running with MiNT, then the CPU +is in user mode. When MiNT is in memory protection mode, an +application which uses vectors must at least be in Readable mode, and +should most likely in Global mode. +
      +

  • +
+ +

See the files VECTEST.C and VECTESTS.S for an example. +

+

See also: Cookie, Gnva +

+

8.27.18 HNDL_OBJ

+
typedef int16_t (cdecl *HNDL_OBJ) ( void *dialog, EVNT *events,
+        int16_t obj, int16_t clicks, void *data );
+
+ + + + + + + + + + + + + + + + + + +
Parameter Meaning +
dialog Pointer to a dialog structure. One should not access the +structure directly; the wdlg_xx functions should be used! +
events If obj is an object number (>= 0), then +events points to the EVNT structure that was passed by +wdlg_evnt; otherwise events is basically 0L and can not be +used for addressing +
obj + + + + + + +
>=0: Object number +
<0: Function number: +
 -1 = HNDL_INIT    // Initialize dialog
+ -2 = HNDL_MESG    //
+ -3 = HNDL_CLSD    // Dialog window was closed
+ -5 = HNDL_OPEN    // Conclude dialog initialisation
+ -6 = HNDL_EDIT    // Check character for an edit field
+ -7 = HNDL_EDDN    // Character was set in edit field
+ -8 = HNDL_EDCH    // Edit field was changed
+ -9 = HNDL_MOVE    // Dialog was moved
+-10 = HNDL_TOPW    // Dialog window was topped
+-11 = HNDL_UNTP    // Dialog window is not active
+
+ +
+ +
Of these function numbers one only has to react to HNDL_CLSD; +all other events need only be paid attention to when needed +
clicks Number of mouse clicks (if obj is an object number). +
data If the parameter obj is a positive object number, then +the variable user_data from the wdlg_create function will be +passed here; otherwise the value depends on the corresponding function +number + +
+ +

Note: The function is called when an EXIT or TOUCHEXIT +object has been clicked on (in this case obj is a positive +object number) or when an event pertinent to the dialog has occurred +(in that case obj is negative and contains a corresponding +function number (see above)). +

+

The parameters are passed via the stack and the routine may +alter registers d0-d2/a0-a2. If the function is called with an unknown +function number in obj, or one of the above function numbers +is to be ignored, the value 1 must be returned. +

+

See also: Sample implementation   wdlg_create +

+

8.27.18.1 Example for HNDL_OBJ

+
/* The following code is an example for an implementation of the
+   handle_exit function, such as that used as a parameter for
+   wdlg_create, for instance. */
+
+int16_t cdecl handle_exit( void *dialog, EVNT *events, int16_t obj,
+                         int16_t clicks, void *data )
+{
+    /*
+     * Event or object number?
+     * All events except HNDL_CLSD are ignored in this example
+     */
+
+    if( obj < 0 )
+    {
+        if( obj == HNDL_CLSD )     /* Closer activated? */
+            return( 0 );            /* Finish */
+        if( obj == HNDL_EDIT )
+        {
+                 /* In window-dialogs it may be useful to ignore key
+                 combinations with [Control] in input fields, so that
+                 keyboard shortcuts such as [Ctrl]-[U], [Ctrl]-[W] or
+                 [Ctrl]-[Q] for instance may be evaluated in the event
+                 loops of a program. In that case a 0 should be
+                 returned after HNDL_EDIT so that the key is not
+                 evaluated by objc_edit.
+                 */
+        }
+    }
+    else
+    {                         /* An object has been selected */
+        switch( obj )         /* Initiate action (if needed) */
+        {
+            case ...
+              .
+              .
+              .
+            case MY_EXIT_OBJECT:    ..... return( 0 );  /* Finish */
+        }
+    }
+    return( 1 ); /* Continue */
+}
+
+

8.27.18.2 HNDL_INIT

+

data is the variable passed by wdlg_create. +

+

If handle_exit returns 0, wdlg_create does not create a +dialog structure (error). +

+

The variable code is passed in clicks. +

+

See also: HNDL_OBJ   wdlg_create +

+

8.27.18.3 HNDL_MESG

+

data is user_data. +

+

If handle_exit returns 0, the dialog will be closed - +wdlg_evnt returns 0. +

+

events points to the EVNT structure passed by wdlg_evnt. +

+

HNDL_MESG is only passed if a message code between 20 and 39 was +received that is not processed by other opcodes. Is required for +iconification, for instance. +

+

Warning: This opcode is only present from MagiC 4.5 of +18.4.96 +

+

See also: HNDL_OBJ   wdlg_create +

+

8.27.18.4 HNDL_OPEN

+

data is the variable passed by wdlg_open. +

+

The variable code is passed in clicks. +

+

See also: HNDL_OBJ   wdlg_create +

+

8.27.18.5 HNDL_CLSD

+

data is user_data. +

+

If handle_exit returns 0, the dialog will be closed - +wdlg_evnt returns 0. +

+

events points to the EVNT structure passed by wdlg_evnt. +

+

See also: HNDL_OBJ   wdlg_create +

+

8.27.18.6 HNDL_MOVE

+

data is user_data. +

+

If handle_exit returns 0, the dialog will be closed - +wdlg_evnt returns 0. +

+

events points to the EVNT structure passed by wdlg_evnt. +

+

See also: HNDL_OBJ   wdlg_create +

+

8.27.18.7 HNDL_TOPW

+

data is user_data. +

+

If handle_exit returns 0, the dialog will be closed - +wdlg_evnt returns 0. +

+

events points to the EVNT structure passed by wdlg_evnt. +

+

See also: HNDL_OBJ   wdlg_create +

+

8.27.18.8 HNDL_UNTP

+

data is user_data. +

+

If handle_exit returns 0, the dialog will be closed - +wdlg_evnt returns 0. +

+

events points to the EVNT structure passed by wdlg_evnt. +

+

See also: HNDL_OBJ   wdlg_create +

+

8.27.18.9 HNDL_EDIT

+

data points to a WORD with the key-code. +

+

If handle_exit returns 1, the key press will be +evaluated, if the return value is 0 it will be ignored. +

+

events points to the EVNT structure passed by wdlg_evnt. +

+

See also: HNDL_OBJ   wdlg_create +

+

8.27.18.10 HNDL_EDDN

+

data points to a WORD with the key-code. +

+

events points to the EVNT structure passed by wdlg_evnt. +

+

See also: HNDL_OBJ   wdlg_create +

+

8.27.18.11 HNDL_EDCH

+

data points to a WORD with the object number of the new +editable field. +

+

See also: HNDL_OBJ   wdlg_create +

+

8.27.19 ICONBLK

+
typedef struct
+{
+  uint16_t  *ib_pmask;    /* Pointer to the icon mask           */
+  uint16_t  *ib_pdata;    /* Pointer to the icon image          */
+  int8_t    *ib_ptext;    /* Pointer to the icon text           */
+  uint16_t  ib_char;      /* Character that is to appear in the
+                             icon, as well as the foreground
+                             and background colour of the Icon  */
+  uint16_t  ib_xchar;     /* X-coordinate of the character      */
+  uint16_t  ib_ychar;     /* Y-coordinate of the character      */
+  uint16_t  ib_xicon;     /* X-coordinate of the icon           */
+  uint16_t  ib_yicon;     /* Y-coordinate of the icon           */
+  uint16_t  ib_wicon;     /* Width of the icon                  */
+  uint16_t  ib_hicon;     /* Height of the icon                 */
+  int16_t   ib_xtext;     /* X-coordinate of the text           */
+  int16_t   ib_ytext;     /* Y-coordinate of the text           */
+  uint16_t  ib_wtext;     /* Width of the text                  */
+  uint16_t  ib_htext;     /* Height of the text                 */
+  uint16_t  ib_resvd;     /* Reserved                           */
+} ICONBLK;
+
+

Notes about individual components: +

+
    +
  • ib_pmask: Pointer to a field of 16-bit values in which +the bit-image of the icon mask is stored. The icon mask determines at +which positions the icon is to be drawn, and which pixels are to +remain transparent. This effect is achieved by first ANDing the icon +background with the bits of the mask and then ORing this with the icon +data. +
      +

  • +
  • ib_char: +
      +

    +

    + + + + + + + + + + + + + + + + +
    BitsMeaning
    15..12Foreground colour of the icon
    11..08Background colour of the icon
     7.. 0Character that is to appear in icon
    +
    + +

  • +
  • ib_resvd: Unused, though it is recorded by most RCS +(Resource Construction Set) programs when +writing to the resource file. +
      +

  • +
+ +

For a colour icon under PC-GEM the following applies: In a +colour icon, ib_pdata and ib_pmask point to MFDB +objects. Otherwise, they point to the lines of the bitmap. +

+

See also: CICONBLK   OBJECT +

+

8.27.20 KEYCODE

+

Keypress description +

+
typedef struct
+{
+  uint8_t shift;        /* bit 0: Right Shift key held */
+                        /* bit 1: Left Shift key held  */
+                        /* bit 2: Control key held     */
+                        /* bit 3: Alternate key held   */
+  uint8_t scan;         /* Scan code or zero           */
+  uint8_t ascii;        /* ASCII value or zero         */
+} KEYCODE;
+
+

ascii is compared first with the ASCII value of the key +which was pressed. If this fails, the scan code is compared. +Currently, the key will match if either bit 0 or bit 1 of +"shift" is set, and either [Shift] key is held by the user. +

+

See also: x_appl_flags   APPFLAGS   x_settings   SETTINGS +

+

8.27.21 LBOX_ITEM

+
typedef struct _lbox_item
+{
+   struct _lbox_item *next;  /* Pointer to the next entry in the list    */
+   int16_t  selected;        /* Specifies whether the object is selected */
+   int16_t  data1;           /* Data for the program...                  */
+   void     *data2;
+   void     *data3;
+} LBOX_ITEM;
+
+

However the structure can well look like the following example +with appropriate casting during the call: +

+
typedef struct
+{
+   void     *next;
+   int16_t   selected;
+
+   ... From here on to suit the application ...
+} LB_EXAMPLE;
+
+

One only has to ensure that as the first element a pointer to +the successor, and as the second element a WORD specifying whether the +corresponding entry is selected are present. +

+

See also: +
lbox_create   lbox_free_list   lbox_get_idx   lbox_get_item   +lbox_get_items +

+

8.27.22 LIST_BOX

+
typedef void *LIST_BOX;
+
+

8.27.23 MEDIA_SIZE

+

Description of a paper format. +

+
typedef struct _media_size
+{
+   struct _media_size *next;   /* Pointer to successor      */
+   int32_t       size_id;      /* Paper format size ID      */
+   int8_t        name[32];     /* Name of the paper format  */
+} MEDIA_SIZE;
+
+

See also: Print dialogs   pdlg_add_printers +

+

8.27.24 MEDIA_TYPE

+

Description of a paper type/print medium. +

+
typedef struct _media_type
+{
+   struct _media_type   *next;    /* Pointer to successor      */
+   int32_t              type_id;  /* Paper format type ID      */
+   int8_t               name[32]; /* Name of the paper format  */
+} MEDIA_TYPE;
+
+

See also: Print dialogs   pdlg_add_printers +

+

8.27.25 MENU

+
typedef struct
+{
+    OBJECT  *mn_tree;    /* The object tree of the menu                 */
+    int16_t mn_menu;     /* The parent object of the menu items         */
+    int16_t mn_item;     /* The starting menu item                      */
+    int16_t mn_scroll;   /* The scroll field status of the menu:        */
+                         /*  0  - The menu will not scroll              */
+                         /*  >0 - The menu will scroll (no scrollbar)   */
+                         /*  -1 - The menu will scroll (with scrollbar) */
+                         /*       (AES >= 4.1)                          */
+    int16_t mn_keystate; /* The [CTRL], [ALT], [SHIFT] key state at     */
+                         /* the time the mouse button was pressed       */
+} MENU;
+
+

See also: About the AES   menu_attach   menu_popup +

+

8.27.26 MFORM

+

The structure MFORM sets the appearance of the mouse pointer, +and is defined as follows: +

+
typedef struct mfstr
+{
+    int16_t  mf_xhot;       /* X-position hot-spot */
+    int16_t  mf_yhot;       /* Y-position hot-spot */
+    int16_t  mf_nplanes;    /* Number of planes    */
+    int16_t  mf_fg;         /* Mask colour         */
+    int16_t  mf_bg;         /* Pointer colour      */
+    int16_t  mf_mask[16];   /* Mask form           */
+    int16_t  mf_data[16];   /* Pointer form        */
+} MFORM;
+
+

See also: About the AES   graf_mouse +

+

8.27.27 MN_SET

+
typedef struct
+{
+    int32_t display;    /* Submenu display delay                  */
+    int32_t drag;       /* Submenu drag delay                     */
+    int32_t delay;      /* Single-click scroll delay              */
+    int32_t speed;      /* Continuous scroll delay                */
+    int16_t height;     /* Menu scroll height (in items)          */
+                        /* (applied when mn_scroll of MENU is >0) */
+} MN_SET;
+
+

The delay values are measured in milliseconds. +

+

See also: About the AES   menu_settings +

+

8.27.28 OBJECT

+
typedef struct
+{
+   int16_t    ob_next;   /* The next object               */
+   int16_t    ob_head;   /* First child                   */
+   int16_t    ob_tail;   /* Last child                    */
+   uint16_t   ob_type;   /* Object type                   */
+   uint16_t   ob_flags;  /* Manipulation flags            */
+   uint16_t   ob_state;  /* Object status                 */
+   void       *ob_spec;  /* More under object type        */
+   int16_t    ob_x;      /* X-coordinate of the object    */
+   int16_t    ob_y;      /* Y-coordinate of the object    */
+   int16_t    ob_width;  /* Width of the object           */
+   int16_t    ob_height; /* Height of the object          */
+} OBJECT;
+
+ + + + + + + + + + + + + + + + + + +
ob_next: Number of the following object of the same generation or - if +it is the last element of the generation - of the parent object +
ob_head: Number of the first child of the object, if none -1 +
ob_next: Number of the last child of the object, if none -1 +
ob_type: Object type of the AES +
ob_flags: Object flags of the AES +
ob_state: AES object stati + +
+ +

See also: AES object structure +

+

8.27.29 OB_PREFER

+

Extended object description +

+
typedef union
+{
+  struct                       /* Bitmapped flags                   */
+  {
+    unsigned outlined   :1;    /* Object is OUTLINED                */
+    unsigned shadowed   :1;    /* Object is SHADOWED                */
+    unsigned draw_3D    :1;    /* Object is draw in 3D              */
+    unsigned rounded    :1;    /* Object has round corners          */
+    unsigned atari_3D   :1;    /* Display the object using Atari                */
+                                                                                                                 /* AES 4 style 3D                    */
+    unsigned shadow_text:1;    /* Draw the text with a shadow                           */
+                                                                                                                         /* underneath it                     */
+    unsigned bold_shadow:1;    /* Text is bold (can be combined                 */
+                                                                                                                         /* with shadow_text)                 */
+    unsigned reserved   :9;    /* Reserved for future use           */
+    unsigned framecol   :4;    /* Color of frame                    */
+    unsigned textcol    :4;    /* Color of text                     */
+    unsigned textmode   :1;    /* 0: transparent, 1: replace        */
+    unsigned fillpattern:3;    /* Fill pattern index                */
+    unsigned interiorcol:4;    /* Color of interior                 */
+  } s;
+  uint32_t l;                  /* Longword for accessing all flags  */
+} OB_PREFER;
+
+

atari_3D, shadow_text and bold_shadow +present since Release 004. +

+

See also: x_appl_flags   APPFLAGS   x_settings   SETTINGS +

+

8.27.30 PARMBLK

+
typedef struct
+{
+   OBJECT   *pb_tree;        /* Pointer to the object tree         */
+   int16_t  pb_obj;          /* Index of the object                */
+   int16_t  pb_prevstate;    /* Previous object status             */
+   int16_t  pb_currstate;    /* New object status                  */
+   int16_t  pb_x;            /* X-position of the object           */
+   int16_t  pb_y;            /* Y-position of the object           */
+   int16_t  pb_w;            /* Width of the object                */
+   int16_t  pb_h;            /* Height of the object               */
+   int16_t  pb_xc;           /* X-position of the clipping region  */
+   int16_t  pb_yc;           /* Y-position of the clipping region  */
+   int16_t  pb_wc;           /* Width of the clipping region       */
+   int16_t  pb_hc;           /* Height of the clipping region      */
+   int32_t  pb_parm;         /* Parameter of USERBLK structure     */
+} PARMBLK;
+
+

Note: The object only needs to be redrawn if the old and +new states are identical; otherwise an 'update' of the object tree +suffices. Furthermore, the following points should be respected: +

+
    +
  • A private function must return to the AES in data register +d0 which aspects of the object status still have to be updated. With +this it is not absolutely necessary to program out the code for +inverting the object in a private output function. Generally one would +want to process some bits of the object status oneself, and leave +others to the AES. +
      +

  • +
  • The function receives the PARMBLK pointer on the stack, and +hence must be declared in Pure-C as 'cdecl'. +
      +

  • +
  • A complete redraw of the object is required only if the compo +nents pb_prevstate and pb_currstate are identical; +otherwise only the obects status has changed (for example by being +clicked on). +
      +

  • +
  • A private function is executed de facto as a sub-program of the +AES, hence one should take care with regard to stack usage. +Furthermore, one can of course make no further AES calls, +since the AES is not re-entrant. On the other hand, calls +of the VDI input functions are permitted here. +
      +

  • +
  • The component pb_parm serves to pass to one's private +function further information (such as a pointer to a string, perhaps). +
      +

  • +
  • One should not stray too far from the original appearance of +GEM. Rounded rectangles or italic texts certainly do not match the +normal appearance of a GEM application. +
      +

  • +
+ +

See also: About the AES   GEM   USERBLK +

+

8.27.31 PDLG_HNDL

+
typedef int32_t (cdecl *PDLG_HNDL)( struct _prn_settings *settings,
+                                 struct _pdlg_sub *sub,
+                                 int16_t exit_obj );
+
+

See also: Print dialogs   pdlg_add_sub_dialogs   PDLG_SUB +

+

8.27.32 PDLG_INIT

+
typedef int32_t (cdecl *PDLG_INIT) (struct _prn_settings *settings,
+                                 struct _pdlg_sub *sub );
+
+

See also: Print dialogs   pdlg_add_sub_dialogs   PDLG_SUB +

+

8.27.33 PDLG_RESET

+
typedef int32_t (cdecl *PDLG_RESET) ( struct _prn_settings *settings,
+                                   struct _pdlg_sub *sub );
+
+

See also: Print dialogs   pdlg_add_sub_dialogs   PDLG_SUB +

+

8.27.34 PDLG_SUB

+

Sub-dialog for setting device. +

+
typedef struct _pdlg_sub
+{
+   struct _pdlg_sub *next;      /* Pointer to successor in the list */
+   int32_t     length;          /* Structure length                 */
+   int32_t     format;          /* Data format                      */
+   int32_t     reserved;        /* Reserved                         */
+   void        *drivers;        /* Only for internal dialogs        */
+   int16_t     option_flags;    /* Flags                            */
+   int16_t     sub_id;          /* Sub-dialog ID                    */
+   DIALOG      *dialog;         /* Pointer to structure of window
+                                   dialog, or 0L                    */
+   OBJECT      *tree;           /* Pointer to assembled object tree */
+   int16_t     index_offset;    /* Index offset of the sub-dialog   */
+   int16_t     reserved1;       /* Reserved                         */
+   int32_t     reserved2;       /* Reserved                         */
+   int32_t     reserved3;       /* Reserved                         */
+   int32_t     reserved4;       /* Reserved                         */
+   PDLG_INIT   init_dlg;        /* Initialisation function          */
+   PDLG_HNDL   do_dlg;          /* Handling function                */
+   PDLG_RESET  reset_dlg;       /* Reset function                   */
+   int32_t     reserved5;       /* Reserved                         */
+   OBJECT      *sub_icon;       /* Pointer to icon for the list box */
+   OBJECT      *sub_tree;       /* Pointer to object tree of sub-dialog */
+   int32_t     reserved6;       /* Reserved                         */
+   int32_t     reserved7;       /* Reserved                         */
+   int32_t     private1;        /* Dialog's private information 1   */
+   int32_t     private2;        /* Dialog's private information 2   */
+   int32_t     private3;        /* Dialog's private information 3   */
+   int32_t     private4;        /* Dialog's private information 4   */
+} PDLG_SUB;
+
+

See also: Print dialogs   pdlg_add_sub_dialogs +

+

8.27.35 POPINFO

+
typedef struct
+{
+    OBJECT  *tree;     /* Popup menu               */
+    int16_t  obnum;    /* Current object of <tree> */
+} POPINFO;
+
+

Note: The component tree points to an object +tree which might serve as input for form_popup, for instance. This +means that the box should contain as object 0 a G_BOX or G_IBOX which +is covered completely by the other objects. Objects that are not +selectable should be assigned a DISABLED state, as in a dropdown menu. +

+

All selectable objects must have the state SELECTABLE. In +addition, for using with G_POPUP, all selectable objects must be of the +type G_STRING (or G_SHORTCUT) or G_BUTTON, and start with two spaces, +the latter due to the tick that is set automatically by form_button or +form_do! +

+

It is important that ob_x and ob_y of object 0 +of the menu is specified relative to the G_POPUP object, i.e. usually +they will both be 0. It is recommended that a shadow or a frame of +width -1 is specified. +

+

See also: MagiC   G_POPUP +

+

8.27.36 PRN_DIALOG

+
typedef void *PRN_DIALOG;
+
+

8.27.37 PRN_ENTRY

+
typedef struct _prn_entry
+{
+   /* Pointer to next device description*/
+   struct _prn_entry *next;
+   /* Structure length */
+   int32_t     length;
+   /* Data format */
+   int32_t     format;
+   /* Reserved */
+   int32_t     reserved;
+   /* Driver ID */
+   int16_t     driver_id;
+   /* Driver type */
+   int16_t     driver_type;
+   /* Printer ID */
+   int32_t     printer_id;
+   /* Printer capabilities */
+   int32_t     printer_capabilities;
+   /* Reserved  */
+   int32_t     reserved1;
+   /* Various flags  */
+   int32_t     flags;
+   /* Pointer to list of sub-dialogs for this printer */
+   struct _pdlg_sub  *sub_dialogs;
+   /* Initialize sub-dialog at printer change */
+   PRN_SWITCH  setup_panel;
+   /* Close sub-dialog at printer change */
+   PRN_SWITCH  close_panel;
+   /* List of available resolutions */
+   PRN_MODE    *modes;
+   /* List of available paper formats */
+   MEDIA_SIZE  *papers;
+   /* List of feed trays */
+   PRN_TRAY    *input_trays;
+   /* List of output trays */
+   PRN_TRAY    *output_trays;
+   /* Name of the printer */
+   int8_t      name[32];
+} PRN_ENTRY;
+
+

See also: Print dialogs   pdlg_add_printers +

+

8.27.38 PRN_MODE

+

Description of a print mode. +

+
typedef struct _prn_mode
+{
+   struct _prn_mode *next;         /* Pointer to the next print mode  */
+   int32_t     mode_id;            /* Mode ID (index within the file) */
+   int16_t     hdpi;               /* Horizontal resolution in dpi    */
+   int16_t     vdpi;               /* Vertical resolution in dpi      */
+   int32_t     mode_capabilities;  /* Mode capabilities               */
+   int32_t     color_capabilities; /* Colour capabilities             */
+   int32_t     dither_flags;       /* Flags specifying whether the
+                                      corresponding colour mode is
+                                      accessible with or without
+                                      dithering                       */
+   MEDIA_TYPE  *paper_types;       /* Suitable paper types            */
+   int32_t     reserved;           /* Reserved                        */
+   int8_t      name[32];           /* Mode name                       */
+} PRN_MODE;
+
+

See also: Print dialogs   pdlg_add_printers +

+

8.27.39 PRN_SETTINGS

+
typedef struct _prn_settings
+{
+   int32_t  magic;            /* 'pset'                              */
+   int32_t  length;           /* (+) Structure length                */
+   int32_t  format;           /* Structure type                      */
+   int32_t  reserved;         /* Reserved                            */
+   int32_t  page_flags;       /* (+) Flags, inc. even/odd pages:
+                                  0x0001 = Only pages with even number
+                                  0x0002 = Only pages with odd number*/
+   int16_t  first_page;       /* (+) First page to print (min. 1)    */
+   int16_t  last_page;        /* (+) Last page to print (max. 9999)  */
+   int16_t  no_copies;        /* (+) Number of copies                */
+   int16_t  orientation;      /* (+) Page orientation:
+                                  0x0000 =  Orientation unknown and
+                                            not adjustable
+                                  0x0001 = Output in portrait format
+                                  0x0002 = Output in landscape format*/
+   int32_t  scale;            /* (+) Scaling: 0x10000L = 100%        */
+   int16_t  driver_id;        /* (+) VDI device number               */
+   int16_t  driver_type;      /* Type of the selected driver         */
+   int32_t  driver_mode;      /* Flags, inc. for background printing */
+   int32_t  reserved1;        /* Reserved                            */
+   int32_t  reserved2;        /* Reserved                            */
+   int32_t  printer_id;       /* Printer ID number                   */
+   int32_t  mode_id;          /* Mode ID number                      */
+   int16_t  mode_hdpi;        /* Horizontal resolution in dpi        */
+   int16_t  mode_vdpi;        /* Vertical resolution in dpi          */
+   int32_t  quality_id;       /* Printing mode (hardware-dependent
+                                 quality, e.g. Microweave or Econofast)*/
+   int32_t  color_mode;       /* Colour mode                         */
+   int32_t  plane_flags;      /* Flags for colour planes to be output
+                                 (e.g. cyan only)                    */
+   int32_t  dither_mode;      /* Rasterizing (dithering) process     */
+   int32_t  dither_value;     /* Parameter for the dithering process */
+   int32_t  size_id;          /* Paper format                        */
+   int32_t  type_id;          /* Paper type (normal, glossy)         */
+   int32_t  input_id;         /* Paper feed tray                     */
+   int32_t  output_id;        /* Paper output tray                   */
+   int32_t  contrast;         /* Contrast:   0x10000L = normal       */
+   int32_t  brightness;       /* Brightness: 0x1000L  = normal       */
+   int32_t  reserved3;        /* Reserved                            */
+   int32_t  reserved4;        /* Reserved                            */
+   int32_t  reserved5;        /* Reserved                            */
+   int32_t  reserved6;        /* Reserved                            */
+   int32_t  reserved7;        /* Reserved                            */
+   int32_t  reserved8;        /* Reserved                            */
+   int8_t   device[128];      /* Filename for the printout           */
+   #ifdef __PRINTING__
+   TPrint   mac_settings;     /* Setting of the Mac printer driver   */
+   #else
+   struct
+   {
+      uint8_t inside[120];
+   } mac_settings;
+   #endif
+} PRN_SETTINGS;
+
+

Note: The structure elements marked with (+) can be read +out by the application. All other entries should not be +accessed. Data such as the printer resolution or number of colours +should not be taken from the setting structure, but inquired +for from the printer at the start of the printout (it would be +possible, for instance, that due to a memory shortage the printer +driver is forced to use a lower resolution compared to that entered in +PRN_SETTINGS). +

+

See also: Print dialogs   pdlg_open +

+

8.27.40 PRN_SWITCH

+
typedef int32_t (cdecl *PRN_SWITCH) ( struct _drv_entr *drivers,
+                                   struct _prn_settings *settings,
+                                   struct _prn_entry *old_printer,
+                                   struct _prn_entry *new_printer );
+
+

Note: The component old_printer can also be 0L! +

+

See also: Print dialogs   pdlg_add_printers +

+

8.27.41 PRN_TRAY

+

Description of a feed/output tray. +

+
typedef struct _prn_tray
+{
+   struct _prn_tray  *next;    /* Pointer to successor              */
+   int32_t           tray_id;  /* Number of the feed or output tray */
+   int8_t            name[32]; /* Name of the tray                  */
+} PRN_TRAY;
+
+

See also: Print dialogs   pdlg_add_printers +

+

8.27.42 RSHDR

+ + +
typedef struct
+{
+   uint16_t rsh_vrsn;      /* Null                              */
+   uint16_t rsh_object;    /* Position of the object field      */
+   uint16_t rsh_tedinfo;   /* Position of the TEDINFO structs   */
+   uint16_t rsh_iconblk;   /* Position of the ICONBLK structs   */
+   uint16_t rsh_bitblk;    /* Position of the BITBLK structs    */
+   uint16_t rsh_frstr;     /* Position of the free strings      */
+   uint16_t rsh_string;    /* Unused                            */
+   uint16_t rsh_imdata;    /* Position of image data            */
+   uint16_t rsh_frimg;     /* Position of the free images       */
+   uint16_t rsh_trindex;   /* Position of the object tree table */
+   uint16_t rsh_nobs;      /* Total number of objects           */
+   uint16_t rsh_ntree;     /* Total number of trees             */
+   uint16_t rsh_nted;      /* Total number of TEDINFO structs   */
+   uint16_t rsh_nib;       /* Total number of ICONBLK structs   */
+   uint16_t rsh_nbb;       /* Total number of BITBLK structs    */
+   uint16_t rsh_nstring;   /* Total number of strings           */
+   uint16_t rsh_nimages;   /* Total number of images            */
+   uint16_t rsh_rssize;    /* Total bytes in resource           */
+} RSHDR;
+
+

Note: All position specifications are to be understood +as relative to the start of the file. +

+

A word about the 'free strings': These include not just the +character strings containing the data for alert boxes etc., but also +all other strings that a program uses for its work. An example of this +would be the filename or a file to be read in, or an entry that is +altered with menu_text in a menu. +

+ +

This header is followed by the actual resource data. One should +note here that a resource file can have a total size of 64 kbyte +maximum, due to the use of 16-bit values as pointers. Files of +this format can be saved by all RCS (Resource +Construction Set) programs. +

+

Users of the programs Interface and RSM (Resource Master) can +also work with resource files > 64 kbyte. The operating system +MagiC as of version 3 also supports resource files larger than 64 +kbyte; loading of the resource is performed with rsrc_load as usual, +the rest is handled quite transparently by the system. +

+

See also: rsrc_rcfix   RSXHDR +

+

8.27.43 RSXHDR

+
typedef struct
+{
+  uint16_t rsh_vrsn;     /* Version number, should be 3 for new format  */
+  uint16_t rsh_extvrsn;  /* Not used,                                   */
+                         /* initialized to 'IN' for Interface,          */
+                         /* 'RM' for ResourceMaster,                    */
+                         /* 'OR' for ORCS,                              */
+  uint32_t rsh_object;   /* Offset to OBJECT structures from file start */
+  uint32_t rsh_tedinfo;  /* Offset to TEDINFO structures                */
+  uint32_t rsh_iconblk;  /* Offset to ICONBLK structures                */
+  uint32_t rsh_bitblk;   /* Offset to BITBLK structures                 */
+  uint32_t rsh_frstr;    /* Offset to string pointer table              */
+  uint32_t rsh_string;   /* Offset to string data                       */
+  uint32_t rsh_imdata;   /* Offset to image data                        */
+  uint32_t rsh_frimg;    /* Offset to image pointer table               */
+  uint32_t rsh_trindex;  /* Offset to tree pointer table                */
+  uint32_t rsh_nobs;     /* Number of OBJECTs in the file               */
+  uint32_t rsh_ntree;    /* Number of object trees in the file          */
+  uint32_t rsh_nted;     /* Number of TEDINFOs in the file              */
+  uint32_t rsh_nib;      /* Number of ICONBLKs in the file              */
+  uint32_t rsh_nbb;      /* Number of BITBLKs in the file               */
+  uint32_t rsh_nstring;  /* Number of free strings in the file          */
+  uint32_t rsh_nimages;  /* Number of free images in the file           */
+  uint32_t rsh_rssize;   /* In the newer format files this value can be
+                            used as an offset to the extension array    */
+} RSXHDR;
+
+

See also: rsrc_load   RSHDR +

+

8.27.44 SCANX

+
typedef struct
+{
+    int8_t   scancode;
+    int8_t   nclicks;
+    int16_t  objnr;
+} SCANX;
+
+

Note: The structure contains the assignment for the key +with the scancode scancode, which when pressed performs an +nclicks times mouse click on the object with the index +objnr. The end of the table is marked by a scancode of NULL. +

+

See also: About the AES   MagiC   XDO_INF   Scancode table +

+

8.27.45 SETTINGS

+

Describes Geneva's global settings +

+
typedef struct Settings
+{
+  int16_t version;                    /* Version SETTINGS is for, in BCD    */
+  int16_t struct_len;                 /* Total # of bytes in SETTINGS       */
+  int16_t boot_rez;                   /* ST/TT resolution at startup        */
+  int16_t falcon_rez;                 /* Falcon video mode at startup       */
+  union                               /* Preferences                        */
+  {
+    struct                            /* Bitmapped flags                    */
+    {
+      unsigned pulldown          :1;  /* use pulldown menus                 */
+      unsigned insert_mode       :1;  /* insert in dialog edits             */
+      unsigned long_titles       :1;  /* long underlines X_UNDERLINE        */
+      unsigned alerts_under_mouse:1;  /* alerts appear under mouse          */
+      unsigned fsel_1col         :1;  /* column in Item Selector            */
+      unsigned grow_shrink       :1;  /* 1: FMD_GROW/SHRINK on              */
+      unsigned tear_aways_topped :1;  /* 1: tear aways always usable        */
+      unsigned auto_update_shell :1;  /*                                    */
+      unsigned alert_mode_change :1;  /*                                    */
+      unsigned ignore_video_mode :1;  /*                                    */
+      unsigned no_alt_modal_equiv:1;  /* rel 004                            */
+      unsigned no_alt_modeless_eq:1;  /* rel 004                            */
+      unsigned preserve_palette  :1;  /* rel 004                            */
+      unsigned mouse_on_off      :1;  /* rel 004                            */
+      unsigned top_all_at_once   :1;  /* rel 005                            */
+      unsigned child_pexec_single:1;  /* rel 006                            */
+    } s;
+    uint16_t i;                       /* Word for accessing all flags       */
+  } flags;                            /* Preferences                        */
+  int16_t gadget_pause;               /* # of 50 Hz timer tics to wait      */
+  KEYCODE menu_start;                 /* Key to start menus                 */
+  KEYCODE app_switch;                 /* Key to toggle between apps         */
+  KEYCODE app_sleep;                  /*                                    */
+  KEYCODE ascii_table;                /* Key to open ASCII table            */
+  KEYCODE redraw_all;                 /* Key to redraw whole screen         */
+  KEYCODE wind_keys[13];              /* Keys for window events             */
+
+  OB_PREFER color_3D[4];              /* Colors for 3D objects              */
+  OB_PREFER color_root[4];            /* Colors for root objects            */
+  OB_PREFER color_exit[4];            /* Colors for EXIT objects            */
+  OB_PREFER color_other[4];           /* Colors for other objects           */
+
+  int8_t sort_type                    /* fsel sort type, 0(Name) - 4(None)  */
+  int8_t find_file[26]                /* fsel Search string                 */
+  int8_t fsel_path[10][35]            /* Item Selector paths                */
+  int8_t fsel_ext[10][6];             /* Item Selector extension strings    */
+
+  KEYCODE cycle_in_app;               /* rel 004                            */
+  KEYCODE iconify;                    /* rel 004                            */
+  KEYCODE alliconify;                 /* rel 004                            */
+  KEYCODE procman;                    /* rel 006                            */
+  KEYCODE unused[4];
+
+  int8_t  graymenu;                   /* rel 004                            */
+  int8_t  reserved;                   /* rel 004                            */
+
+  union                               /* rel 006                            */
+  {
+    struct
+    {
+      unsigned procman_details  :1;
+      unsigned reserved         :31;
+    } s;
+    unsigned int32_t l;
+  } flags2;
+
+} SETTINGS;
+
+

The color_xx arrays are indexed depending upon the +number of bitplanes in the current resolution: 1-plane=0, 2-planes=1, +4-planes=2, >4-planes=3. +

+

The wind_keys array is indexed using the following +constants: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
XS_UPPAGE0Index for up page key
XS_DNPAGE1Index for down page key
XS_UPLINE2Index for up line key
XS_DNLINE3Index for down line key
XS_LFPAGE4Index for page left key
XS_RTPAGE5Index for page right key
XS_LFLINE6Index for line left key
XS_RTLINE7Index for line right key
XS_CLOSE8Index for close box key
XS_CYCLE9Index for cycle window key
XS_FULL10Index for full window key
XS_LFINFO11Index for info left key
XS_RTINFO12Index for info right key
+
+ +

See also: x_settings   KEYCODE   OB_PREFER +

+

8.27.46 SET_ITEM

+
typedef int16_t (cdecl *SET_ITEM)( LIST_BOX *box, OBJECT *tree,
+                                struct _lbox_item *item,
+                                int16_t obj_index, void *user_data,
+                                GRECT *rect, int16_t first );
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
boxpoints to the list box structure
treepoints to the object tree of the dialog
itempoints to the LBOX_ITEM structure of the entry to be set
obj_indexis the number of the object to be set
user_datais the pointer passed by lbox_create
rectis the pointer to the GRECT for the object redraw or 0L
firstcontains the number of the first visible item for Slider B
+
+ +

For a list box that only contains text strings, <set> is +typically a function that copies a string pointed to by the LBOX_ITEM +structure into the object obj_index. +

+

rect is 0L when a redraw of the dialog box is executed +or when lbox_update has been called. rect is not 0L when the +user has selected or deselected an object, and points to the GRECT for +the redraw. +

+

The return value is the number of the start object for +objc_draw/wdlg_redraw. +

+

For entries in the list box that consist of several objects it +is sometimes sensible to reduce the redraw rectangle when selecting/ +deselecting an object, or to alter the start object, to prevent +unnecessary drawing operations and/or unnecessary flicker. In most +cases the list box routines call the function objc_draw/wdlg_redraw +after <set> to display the altered contents. +

+

first contains the number of the first visible item for +Slider B if the list box has two sliders. For a (vertical) list box +with text strings and two sliders, when calling lbox_create, for +instance, one enters the number of visible characters in +visible_b, the total string length in entries_b and +the index of the first visible character in first_b. If the +text is scrolled horizontally, <set> is called for all visible +strings and the affected parts of the screen are redrawn or moved. If +the list box has only one slider, first is always 0. +

+

See also: List boxes   lbox_create +

+

8.27.47 SHELTAIL

+
typedef struct
+{
+    int16_t dummy;       /* A NULL-WORD                 */
+    int32_t magic;       /* 'SHEL', if it's a shell     */
+    int16_t isfirst;     /* First call of the shell     */
+    int32_t lasterr;     /* Last error                  */
+    int16_t wasgr;       /* Program was a graphic-app.  */
+} SHELTAIL;
+
+

Note: This information is conveyed to an alternative +desktop by MagiC at program launch (can be obtained by shel_read). If +the shell returns a negative error code, then MAGXDESK will be +reactivated. +

+

If isfirst is set then the status is to be read from +something like DESKTOP.INF, if isfirst is not set then one +takes the temporary file or shell-buffer. +

+

lasterr is the return value of the program running +previously. If this was a GEM program then the error will already +have been displayed in an alert box. It is well known that the +LONGword is negative if the error occurred with Pexec itself; a +program return value always has the high-WORD 0. +

+

See also: About the AES   GEM   shel_wdef +

+

8.27.48 SHELW

+ +
typedef struct xshelw
+{
+    const char *newcmd;   /* command line */
+    int32_t psetlimit;    /* value for Psetlmit() */
+    int32_t prenice;      /* value for Prenice() */
+    const char *defdir;   /* default diretory */
+    char *env;            /* environment */
+    int16_t uid;          /* New child's UID */
+    int16_t gid;          /* New child's GID */
+} SHELW;
+
+

8.27.49 SLCT_ITEM

+
typedef void (cdecl *SLCT_ITEM)( LIST_BOX *box, OBJECT *tree,
+                                 struct _lbox_item *item,
+                                 void *user_data, int16_t obj_index,
+                                 int16_t last_state );
+
+

The following apply: +

+ + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
box points to the list box structure +
tree points to the object tree of the dialog +
item points to the LBOX_ITEM-structure of the selected entry +
user_data is the pointer passed by lbox_create +
obj_index is the number of the selected object. For a double-click the +top bit is set, similar to form_do. If it is 0, it signifies that no +object is assigned to this entry; it is not visible. Normally this is +only the case when one is scrolling and by selecting a new object the +(now no longer visible) selection has to be cleared. +
last_state is the previous status of the object. last_state can +also have the same value as item->selected. In that case +one can normally quit the function immediately. + +
+ +

See also: lbox_create +

+

8.27.50 SWINFO

+
typedef struct
+{
+    int8_t  *string;     /* Perhaps 'TOS|KAOS|MAG!X'            */
+    int16_t  num;        /* Index of current character string   */
+    int16_t  maxnum;     /* Maximum permitted num               */
+} SWINFO;
+
+

See also: About the AES   GEM   G_SWBUTTON +

+

8.27.51 TEDINFO

+

The TEDINFO structure is used to describe a text object more +exactly, and is defined as follows: +

+
typedef struct
+{
+    int8_t    *te_ptext;          /* Pointer to a string              */
+    int8_t    *te_ptmplt;         /* Pointer to the string template   */
+    int8_t    *te_pvalid;         /* Pointer to the validation string */
+    int16_t    te_font;           /* Font type                        */
+    int16_t    te_fontid;         /* GDOS Font ID                     */
+    int16_t    te_just;           /* Text alignment:
+                                      0 = Ranged left
+                                      1 = Ranged right
+                                      2 = Centred                     */
+    int16_t    te_color;          /* Colour                           */
+    int16_t    te_fontsize;       /* GDOS font size in points         */
+    int16_t    te_thickness;      /* Border width                     */
+    int16_t    te_txtlen;         /* Maximum length of the text       */
+    int16_t    te_tmplen;         /* Length of the string template    */
+} TEDINFO;
+
+

The following matters should be noted for this: +

+
    +
  • te_ptext: If the first character is an 'at' symbol (@), +then all following characters will be taken to be place holders, and +the string initially output will consist of space characters. Hence +the 'at' symbol may never be placed at the start of an editable field! +
      +

  • +
  • te_ptmplt: Template. This is used only for G_FTEXT and +G_FBOXTEXT, i.e. G_TEXT and G_BOXTEXT can have a NULL-pointer here. +During output, all '_' characters in the template will be replaced +successively with the characters in te_ptext, i.e. a mixed +character string will be formed. So in general the template will have +as many '_' characters as the length of the buffer for +te_ptext (without the terminating NULLbyte). The template can +also contain other characters, which will be displayed but cannot be +overwritten. +
      +

  • +
  • te_pvalid: String that contains for each character in +te_ptext validation characters that provide information about +the type of character permitted at the matching string position. The +following apply: +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Character Meaning +
        +
    1 - 9 Accept any digit from 0 to that number. This is handy for doing +octal ('7') or binary ('1') validation. +
    (Geneva) +
    9 Only digits 0..9 +
    A Only uppercase (capital) letters A..Z and space +
    a Only upper and lowercase letters and space +
    N Digits 0..9, uppercase letters A..Z, and space +
    n Digits 0..9, upper and lowercase letters, and space +
    F All characters valid for a GEMDOS filename, and '*', '?' and +':'. +
    f All characters valid for a GEMDOS filename, without '*', '?' +and ':'. +
    h Hexadecimal character (Geneva) +
    H Hexadecimal character; lowercase a..f keys are converted to +keys A..F in uppercase (Geneva) +
    P All characters valid for a GEMDOS pathname plus '\', ':', '?', +'*' +
    p Similar to 'P', but without the characters '?' and '*' +
    m All characters that are valid for a long filename; i.e. all +characters except control characters (ASCII < 32), and also without +':' and '\'. At present, this code is only supported by MagiC. +
    X All characters +
    x All characters, lowercase letters are converted to uppercase +(Geneva) + +
    + +

  • +
  • te_font: +
    3 = Standard monospaced system font +
    5 = Small monospaced system font +
      +
    For further information, see below. +
      +

  • +
  • te_fontid: +
    For further information, see below. +
      +

  • +
  • te_color: For the colour of the bounding rectangle, the +following assignments apply: +
      + + + + + + + + + + + + + + + + + + + + + +
    Bit Meaning +
        +
    12..15 Border colour (0..15) +
    08..11 Text colour (0..15) +
     7 Text (0 = transparent, 1 = opaque)) +
     4.. 6 Intensity + + + + + + + + + +
    0    = Hollow +
    1..6 = Increasing intensity +
    7    = Solid area + +
    + +
     0.. 3 Inner colour (0..15) + +
    + +

  • +
  • te_thickness: For the border frame, the following +values are valid: +
      +

    +

    + + + + + + + + + + + + + + + + +
    ValueMeaning
     0No border
     1.. 128Border lies 1 to 128 pixels within the object
    -1..-127Border lies 1 to 127 pixels outside of the object
    +
    + +

  • +
+ + + + +

Note: The components te_fontid and +te_fontsize were previously reserved. As of AES Version 4.1 +it is possible to use any GDOS fonts for TEDINFO objects. +

+

For this one should specify with the component te_font +the type of the font. The following apply: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
te_fontMeaning
0SpeedoGDOS font
1SpeedoGDOS font (monospaced)
2GDOS bitmap font
3Normal system font
5Small system font
+
+ +

To use values 0 and 1 of te_font, SpeedoGDOS or a +substitute (such as NVDI) has to be installed on the system. +

+

For values in the region 0..2 of te_font one can then +set with the components te_fontid or te_fontsize the +desired font and the desired point size. +

+

The simplest way to check the presence of the new possibilities +is to call appl_getinfo (opcode 13). +

+

See also: +
About the AES   GEM   OBJECT   XTED   Scrollable input fields +

+

8.27.52 USERBLK

+
typedef struct
+{
+   int16_t cdecl (*ub_code)(PARMBLK *parmblock);
+   int32_t ub_parm;
+} USERBLK;
+
+

Note: The function ub_code is called for each +call of objc_draw and objc_change for the corresponding object. The +component ub_parm can be looked on as an optional parameter. +

+

8.27.53 UTXT_FN

+

This function is declared as follows: +

+
typedef void (cdecl *UTXT_FN) (int16_t x, int16_t y, int16_t *clip_rect,
+                               int32_t id, int32_t pt, int32_t ratio,
+                               int8_t *string);
+
+

See also: About the AES   fnts_add   FNTS_ITEM   Font selection +

+

8.27.54 WIND_TREE

+
typedef struct WindTree
+{
+  int16_t handle;   /* Handle of window being modified  */
+  int16_t count;    /* Number of objects in window      */
+  int16_t flag;     /* Location to copy to/from         */
+  OBJECT *tree;
+} WIND_TREE;
+
+ + + + + + + + + +
Parameter Meaning +
flag + + + + + + + + + +
Bit 0: Auto resize (X_WTFL_RESIZE=1) +
Bit 1: Process clicks (X_WTFL_CLICKS=2) +
Bit 2: Resize sliders, info (X_WTFL_SLIDERS=4) + +
+ + +
+ +

See also: x_wind_tree +

+

8.27.55 WINFRAME_HANDLER

+

Passing structure for linking in +

+
typedef struct {
+  int16_t   version;                  /* Version number of structure  */
+  int32_t   wsizeof;                  /* Size of the WINDOW-structure */
+  int16_t   whshade;                  /* Height of the shaded window  */
+  void      (*wbm_create)( WININFO *w );
+  void      (*wbm_skind) ( WININFO *w );
+  void      (*wbm_ssize) ( WININFO *w );
+  void      (*wbm_sslid) ( WININFO *w, int16_t vertical );
+  void      (*wbm_sstr)  ( WININFO *w );
+  void      (*wbm_sattr) ( WININFO *w, int16_t chbits );
+  void      (*wbm_calc)  ( int16_t kind, int16_t *fg );
+  int16_t   (*wbm_obfind)( WININFO *w, int16_t x, int16_t y );
+} WINFRAME_HANDLER;
+
+

See also: +
sys_set_winframe_manager   WININFO   WINFRAME_SETTINGS +

+

8.27.56 WINFRAME_SETTINGS

+

Passing structure for global window settings +

+
typedef struct {
+  int16_t   flags;
+  int16_t   h_inw;
+  void      *finfo_inw;
+} WINFRAME_SETTINGS;
+
+

Bits of flags: +
#define NO_BDROP 1 +

+

See also: +
sys_set_winframe_manager   WINFRAME_HANDLER   WININFO +

+

8.27.57 WININFO

+

WINDOW-structure for MagiC-kernel +

+
typedef struct {
+  int16_t   state;
+  int16_t   attr;
+  void      *own;         /* (APPL *)                     */
+  int16_t   kind;         /* from wind_create()           */
+  char      *name;        /* Pointer to title line        */
+  char      *info;        /* Pointer to Info line         */
+  GRECT     curr;
+  GRECT     prev;
+  GRECT     full;
+  GRECT     work;
+  GRECT     overall;      /* Outline                      */
+  GRECT     unic;
+  GRECT     min;          /* Minimum size                 */
+  int16_t   oldheight;    /* Old height of shading        */
+  int16_t   hslide;       /* Horizontal slider position   */
+  int16_t   vslide;       /* Vertical slider position     */
+  int16_t   hslsize;      /* Horizontal slider size       */
+  int16_t   vslsize;      /* Vertical slider size         */
+  void      *wg;          /* Rectangle list               */
+  void      *nextwg;      /* Next rectangle of the list   */
+  int16_t   whdl;
+  OBJECT    tree[N_OBJS];
+  int16_t   is_sizer;
+  int16_t   is_info;
+  int16_t   is_rgtobjects;
+  int16_t   is_botobjects;
+  TEDINFO   ted_name;
+  TEDINFO   ted_info;
+} WININFO;
+
+

Bits of state: +
#define OPENED 1 +
#define COVERED 2 +
#define ACTIVE 4 +
#define LOCKED 8 +
#define ICONIFIED 32 +
#define SHADED 64 +

+

See also: +
sys_set_winframe_manager   WINFRAME_HANDLER   WINFRAME_SETTINGS +

+

8.27.58 XAESMSG

+

This structure is defined as follows: +

+
typedef struct
+{
+   int16_t  dst_apid;       /* ID of target application  */
+   int16_t  unique_flg;     /* Overwrite messages?       */
+   void     *attached_mem;  /* Pointer to memory block   */
+   int16_t  *msgbuf;        /* Message buffer            */
+} XAESMSG;
+
+

Note: The component unique_flg specifies if +kindred messages (i.e. those with the same message type msgbuf[0]) are +to be overwritten by the new message. +

+

If attached_mem is not NULL, it is used to specify a +memory block allocated with Malloc that contains the extended message +information. The length of this block is arbitrary and is of no +interest to the system - for instance it could be passed as the first +LONGword of the block, or in msgbuf [4,5]. The system +allocates the memory block to the destination application and passes +its address in msgbuf[6,7]. +

+

Important: The called application must assume that +msgbuf[6,7] are destroyed after a call of appl_write. The +system reserves the right to copy the contents of the memory block +elsewhere and to release the passed block. The caller may no +longer access the block after an appl_write call, and may on no +account release it! +

+

If appl_write returns an error code, then the block has +not been passed and still belongs to the calling application. +An error arises when: +

+
    +
  • The destination application is invalid (non-existant or frozen) +
      +

  • +
  • The message buffer of the destination application is full +
      +

  • +
  • The destination application is not a process (e.g. the SCRENMGR +and an attached memory block has been specified +
      +

  • +
+ +

See also: About the AES   appl_write   GEM +

+

8.27.59 XDO_INF

+
typedef struct
+{
+    SCANX *unsh;    /* Tables for non-[Shift] combinations   */
+    SCANX *shift;   /* Tables for [Shift] combinations       */
+    SCANX *ctrl;    /* Tables for [Control] combinations     */
+    SCANX *alt;     /* Tables for [Alternate] combinations   */
+    void  *resvd;   /* Reserved   */
+} XDO_INF;
+
+

Note: This structure contains pointers to tables that +assign to a scancode an object index of the dialog box. This makes it +simple to service dialogs completely via the keyboard. The parameter +resvd is reserved for future use, and must always be NULL. +

+

See also: +
About the AES   form_keybd   form_xdo   MagiC   Scancode table +

+

8.27.60 XFONTINFO

+

Describes font being used and window gadget borders +

+
typedef struct
+{
+   int16_t font_id;     /* VDI font ID#                                       */
+   int16_t point_size;  /* Point size of the font                             */
+   int16_t gadget_wid;  /* Width of border around a char in a window gadget   */
+   int16_t gadget_ht;   /* Height of border around a char in a window gadget  */
+} XFONTINFO;
+
+

gadget_wid and gadget_ht are added to the width +and height of the characters. These values should always be >= 0. +

+

See also: x_appl_font +

+

8.27.61 XFSL_FILTER

+
typedef int16_t (cdecl XFSL_FILTER) (int8_t *path, int8_t *name,
+      XATTR *xa);
+
+

See also: fslx_do   fslx_open +

+

8.27.62 XSHW_COMMAND

+
typedef struct
+{
+   int8_t  *command;
+   int32_t limit;
+   int32_t nice;
+   int8_t  *defdir;
+   int8_t  *env;
+} XSHW_COMMAND;
+
+

See also: shel_write +

+

8.27.63 XTED

+

This structure is required in connection with scroll-capable +editable text fields. +

+
typedef struct _xted
+{
+   int8_t  *xte_ptmplt;
+   int8_t  *xte_pvalid;
+   int16_t xte_vislen;
+   int16_t xte_scroll;
+} XTED;
+
+

See also: Scrollable input fields   TEDINFO +

+

8.27.64 X_BUF_V2

+ + + + + + + + +
typedef struct x_buf_v2
+{
+int16_t  buf_len   /* Length of the structure, including this WORD       */
+                   /* Future versions of this structure (X_BUF_V3 etc.)  */
+                   /* may be bigger                                      */
+int16_t  arch      /* 16 for 16-bit AES, 32 for hypothetical 32-bit AES  */
+CLRCAT   *cc       /* Address of an array of 16 CLRCAT structures -      */
+                   /* this is so that they can be read by a program; in  */
+                   /* ViewMAX, the colours could be set but not reread   */
+OBJECT   *w_active /* Address of an object tree (19 elements) used to    */
+                   /* draw window elements; included so a program can    */
+                   /* change symbols on window buttons                   */
+int8_t   *info     /* Address of a 0-terminated ASCII string (at most    */
+                   /* 40 characters, no newlines) describing the AES     */
+int32_t  abilities /* A bitmapped field describing what optional         */
+                   /* functions this AES provides:                       */
+/* ABLE_GETINFO  1    bit 0 : xapp_getinfo supported                     */
+/* ABLE_PROP     2    bit 1 : prop_get, prop_put and prop_del supported  */
+/* ABLE_WTREE    4    bit 2 : wind_get and wind_set can change glyphs    */
+/* ABLE_X3D      8    bit 3 : GEM/5 3D using DRAW3D                      */
+/* ABLE_XSHL    16    bit 4 : xshl_getshell & xshl_putshell              */
+/* ABLE_PROP2   32    bit 5 : prop_gui_get, prop_gui_set                 */
+/* ABLE_EMSDESK 64    bit 6 : xgrf_dtimage supports EMS                  */
+/* ABLE_XBVSET 128    bit 7 : Supports 32 disc drives                    */
+} X_BUF_V2;
+
+

An initialized X_BUF_V2 is one in which all members are 0 except +buf_len. This initialized buffer is then passed to appl_init. +On return, if arch is 0 then the structure was not filled in +by the AES; otherwise it was. The buf_len field may be +reduced if the AES was expecting an earlier version of the +structure (i.e. X_BUF_V1); this should not be a problem because the +structures are forward and backward compatible. +

+

See also: appl_init +

+
+ +Home +AESAES +AES function listAES function list +XCONTROLXCONTROL + + diff --git a/en/appendix.html b/en/appendix.html new file mode 100644 index 000000000..e8e0c2edb --- /dev/null +++ b/en/appendix.html @@ -0,0 +1,160 @@ + + + + + +The documentation for TOS: XSSI protocol + + + + + + + + + +Home +ProtocolsProtocols +xFSL interfacexFSL interface +ASCII tableASCII table + +
+ +

15.15 XSSI protocol

+ +

A major problem for the programmer of a screen saver is that +many applications know nothing about what is currently happening +before the user's eyes on the screen. Accordingly they continue to +output their information to the screen, even though actually it has +now been taken over by the screen saver. So that an application can be +certain of the state of the screen saver, and in some circumstances +may even influence it, there exists the so-called XSSI standard (where +XSSI stands for 'eXtended ScreenSaver +Interface'), which was suggested by Julian Reschke. +

+

The value of the XSSI cookie is a pointer to the following +structure: +

+
typedef struct
+{
+     LONG id;
+     WORD version;
+     WORD save_stat;
+     WORD prg_stat;
+     LONG vec_stat;
+} INFOXSSI;
+
+ + + + + + + + + + + + + + + +
id Each screen saver enters its XBRA identifier as id. +
  +

+
+ + + + + + + + + + + + +
idscreen saver
DAWNBefore Dawn
BBLSBUBBLES
+
+ +
version The version number of the XSSI protocol is entered in +version. 'Before Dawn' at present uses the version number +0x101. +
  +
save_stat An application can find out whether the saver is active at the +time with save_stat. A value of 0 means that the saver is not +active, a negative value means that it has kicked in. +
  +
prg_stat With prg_stat an application can inform 'Before Dawn' +how it is to behave. prg_stat can take the following values: +
  +
prg_stat = 0 Save normally +
prg_stat = 1 Never save +
prg_stat = -1 Save immediately +
  +
vec_stat vec_stat indicates which system vectors are monitored. +This value represents a bit-field. Its assignment is as follows: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
BitSystem vector
0Keyboard
1Mouse
2Joystick
3MIDI
4Modem 1
5Modem 2
6Serial 1
7LAN port or Serial 2
8-14Other vectors
15Window events
+
+ + +
+ + +
+ +Home +ProtocolsProtocols +xFSL interfacexFSL interface +ASCII tableASCII table + + diff --git a/en/appl.html b/en/appl.html new file mode 100644 index 000000000..8d85b56c4 --- /dev/null +++ b/en/appl.html @@ -0,0 +1,5269 @@ + + + + + +The documentation for TOS: Application library + + + + + + + + + +Home +AESAES +AES fundamentalsAES fundamentals +File-selector libraryFile-selector library + +
+ +

8.3 Application library

+

This library contains functions to initialize and terminate a +GEM application; in addition these routines permit communication with +other processes. In total, the following functions are available: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
appl_bvset Sets connected logical drives +
appl_control Targeted control of applications +
appl_exit Deregisters AES user program and releases ID +
appl_find Gets AES ID of another AES application +
appl_getinfo Gets system information +
appl_getinfo_str Gets extended system information +
appl_getcicon Get a CICON (Icon server) +
appl_init Registers AES application +
appl_options Sets or gets application options +
appl_read Reads AES messages +
appl_search Searches for applications in system +
appl_tplay Plays back AES events +
appl_trecord Records AES events +
appl_write Writes AES messages +
appl_xbvget Gets connected logical drives +
appl_xbvset Extended version for reporting connected drives +
appl_yield Forces AES process-switch +
_appl_yield Forces AES process-switch +
x_appl_flags Controls execution flags +
x_appl_font Changes font and window borders +
x_appl_sleep Puts application to sleep, or wakes it up +
x_appl_term Terminate an application and remove it from memory. + +
+ +

Note: Special attention is drawn here to appl_getinfo, +with whose help one can easily inquire about the properties of the +system at run-time. +

+

See also: Style guidelines +

+

8.3.1 appl_bvset

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Application bit-vector set« - Set the available logical +drives for the file-selector. +
  +
Opcode: 16 +
  +
Syntax: int16_t appl_bvset ( uint16_t bvdisk, uint16_t bvhard ); +
  +
Description: The call appl_bvset informs the GEM about the logical drives +that are present; required (amongst others) for the file-selector. The +following apply: +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
bvdiskBit-vector of the floppy disk drives present (bit 15 = Drive A: etc).
bvhardBit-vector of the hard drives present (bit 15 = Drive A: etc).
+
+ +
They are available to the application in global[13] and +global[14]. +
  +
In GEM/4 and GEM/5, use appl_xbvset to access drives +beyond P. +
  +
Return value: Not known at present. +
  +
Availability: The function is available only from PC-GEM Version 2.0 +onwards, KAOS 1.4.2 and MagiC. +
  +
Group: Application library +
  +
See also: Binding   appl_xbvset   Dsetdrv +
  + +
+ +

8.3.1.1 Bindings for appl_bvset

+ + + + + + + + + +
C: int16_t appl_bvset ( uint16_t bvdisk, uint16_t bvhard ); +
  +
Binding: +
  +
int16_t appl_bvset (uint16_t bvdisk, uint16_t bvhard)
+{
+   int_in[0]  = bvdisk;
+   int_in[1]  = bvhard;
+   return ( crys_if(16) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]16 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]bvdisk
int_in+2int_in[1]bvhard
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.3.2 appl_control

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Application control« - Targeted control of applications. +
  +
Opcode: 129 +
  +
Syntax: int16_t appl_control ( int16_t ap_cid, int16_t ap_cwhat, void +*ap_cout); +
  +
Description: The call appl_control can be used to control the activity of +applications. +
  + + + + + + + + + + + + +
Parameter Meaning +
  +
ap_cid The AES ID (apid) of the application you want to control. +
  +
ap_cwhat The type of control: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
0 to 9 Reserved for N.AES +
  + +
APC_TOPNEXT (0) OAESis internal mode +
  + +
APC_KILL (1) OAESis internal mode +
  + +
APC_SYSTEM (2) XaAES internal mode +
  + +
APC_HIDE (10) Hide (fade out) application; +
if ap_cid is -1, the active application will be hidden +
  + +
APC_SHOW (11) Show (fade in) application; +
if ap_cid is -1, all hidden applications are shown +
  + +
APC_TOP (12) Bring application to front (the application becomes the active +one) +
  + +
APC_HIDENOT (13) Hide all applications except the one referred to by +ap_cid (which becomes the active application) +
  +
If ap_cid is -1, all applications except the active one +will be hidden +
  + +
APC_INFO (14) Inquire the application parameters of application +ap_cid; if -1 is passed for ap_cid, then the +parameters of the current application will be returned +
  +
For ap_cout a pointer to an integer is to be passed +
  +
N.AES here deposits the application parameters in the form of a +bitmask: +
  + + + + + + + + + + +
APCI_HIDDEN (1) Bit 0 is set if the application is faded out +
  + +
APCI_HASMBAR (2) Bit 1 is set if the application posseses a menu bar +
  + +
APCI_HASDESK (4) Bit 2 is set if the application possesses its own desktop +
  + +
+ + +
APC_MENU (15) Returns address of the menu tree that the application +ap_cid last initialized. For this a pointer to an OBJECT +pointer is to be passed for ap_cout; the latter will be filled +by shel_write with the searched for menu tree address. +
  +
If -1 is passed for ap_cid, then the menu tree address +of the current application will be returned. If the value 0 is passed +for ap_cid then the address of the system menu managed +internally by shel_write will be returned. This is the menu box that pops +open when one selects the left-most menu title and which contains the +list of all applications and desk accessories initialized by shel_write. +
  +
If the application inquired for has not initialized a menu bar, +or no application with the identification ap_cid exists, then +a NULL pointer will be written to ap_cout +
  +
The return value of appl_control, mode APC_MENU is always the +value 1 +
  +
Note: If one uses this mode, one should be quite certain +what one is doing! Altering the returned menu tree can lead to +undefined system states. With active MiNT memory protection even a +read access to the menu tree can lead to a termination of the +application! +
  + + +
APC_WIDGETS (16) Inquires or sets the 'default' positions of the window objects. +ap_cout is a pointer to a MINWINOBJ(12)-sized (int16_t) +buffer, which must be filled completely with -1 for inquiring the +object order. The last WORD must be a 0. If an error-message is +returned, then the buffer is too small for all objects and should be +enlarged. In the buffer lie first of all the objects of the title-bar +from left to right, followed by the objects of the vertical slider +from top to bottom and then the objects of the horizontal slider from +left to right. The list is terminated with a NULL-word. For setting +the positions, the first objects have to be of the type topwidgets +(from left to right), followed by the objects of the type rightwidgets +(from top to bottom) and then the objects of the type bottomwidgets +(from left to right). If the objects are duplicated or set incorrectly +then an error will be reported. +
  + +
APC_APP_CONFIG (17) With this option you are able to inform to AES how you want +your application should be considered. +
ap_cout is a pointer to a string. At this time value +supported are: +
  +
    +
  • "app_debug=true" or "app_debug" : put the +application in debug mode +
  • +
  • "app_debug=false" : stop debug mode +
  • +
  • "app_topmost=true" or "app_topmost" : +Application windows will be always on top (compare to other classical +application) but without focus (can be usefull for tesk bar for +exemple) +
  • +
  • "app_topmost=false" : remove previous option +
  • +
  • "app_system" : application is a system application +(used in appl_search for type APP_SYSTEM) +
  • +
  • "app_texticon=opaque" : background icon text is +opaque +
  • +
  • "app_texticon=transparent" : background icon text is +transparent +
  • +
  • "app_signal_mesag=true": Request receive Unix Signal +when even message is waiting see APC_INFORM_MESAG as it do exactly the +same +
  • +
  • "app_signal_mesag=false": Request stop receive Unix +Signal when even message is waiting +
  • +
+ + +
APC_INFORM_MESAG (18) Request to AES to inform the application when there is a AES +message waiting with a Unix Signal. +
ap_cout : not used. +
When the application receive a message the AES send the Signal +SIGUSR2 (30) to the application, to manage the message should use +classical event_mesag or event_multi functions. Calling one time this +call request to AES to send Signal, calling a second time remove this +order. +
  + +
+ +
ap_cout Is filled by the AES dependent on ap_cwhat and only +has a meaning for APC_INFO, APC_MENU, APC_WIDGETS and APC_APP_CONFIG. +In other cases this parameter is ignored and passing of a NULL-pointer +is then possible. +
  + +
+ +
Note: Hidden application have a '*' placed in front of +their names in the applications menu, unless they did not have a +window open during hiding. If the latter is the case only the active +application is changed. +
  +
So the '*' in front of the name means: One or more windows of +this application are hidden. +
  +
Return value:  0 = An error has occurred +
>0 = No error has arisen +
  +
Availability: The presence of the function can be checked via appl_getinfo (opcode +65). +
  +
Group: Application library +
  +
See also: Binding   SM_M_SPECIAL +
  + +
+ +

8.3.2.1 Bindings for appl_control

+ + + + + + + + + +
C: int16_t appl_control ( int16_t ap_cid, int16_t ap_cwhat, void +*ap_cout); +
  +
Binding: +
  +
int16_t appl_control ( int16_t ap_cid, int16_t ap_cwhat,
+                       void *ap_cout);
+{
+   int_in[0]  = ap_cid;
+   int_in[1]  = ap_cwhat;
+   addr_in[0] = ap_cout;
+
+   return ( crys_if(129) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]129 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]ap_cid
int_in+2int_in[1]ap_cwhat
addr_inaddr_in[0]ap_cout
int_outint_out[0]ap_creturn
+
+ + +
+ +

8.3.3 appl_exit

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Application exit« - Deregister an application from the +AES. +
  +
Opcode: 19 +
  +
Syntax: int16_t appl_exit ( void ); +
  +
Description: The call appl_exit deregisters an applicatiion from the AES +again and releases its application ID. +
  +
Return value: An error has arisen only if a 0 is returned. +
  +
Availability: All AES versions. +
  +
Group: Application library +
  +
See also: Binding   appl_init +
  + +
+ +

8.3.3.1 Bindings for appl_exit

+ + + + + + + + + +
C: int16_t appl_exit ( void ); +
  +
Binding: +
  +
int16_t appl_exit (void)
+{
+   return ( crys_if(19) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]19 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_outint_out[0]Return value
+
+ + +
+ +

8.3.4 appl_find

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Application find« - Obtain the application ID number of an +AES application. +
  +
Opcode: 13 +
  +
Syntax: int16_t appl_find ( CONST int8_t *ap_fpname ); +
  +
Description: The call appl_find obtains the application identifier of +another application running in parallel. ap_fpname points to +the filename of the application whose identifier is to be found +(without an extension). +
  +
Important: It is imperative that the name is eight +characters long; if it shorter, it must be padded with blanks. The +name string must be NULL-terminated. +
  +
In MagiC and AES version 4.0 and above one can also obtain +the ID of the current application by passing a NULL-pointer. In +addition it is possible to recalculate the AES ID of an application +to the MiNT ID, and vice versa. This is done as follows: +
  + + + + + + + + + + + + + + + + + + +
High-Word Meaning +
of ap_fpname   +
    +
-1 The function expects in the low-word the MiNT ID of an +application and after the call returns the AES ID of this +application. +
-2 The function expects in the low-word the AES ID of an +application and after the call returns the MiNT ID of this +application. +
-3 The AES ID of the topped application is returned. The +low-word plays no effect here and can be 0. This is only available +under MyAES (since 0.94a), N.AES and XaAE. + +
+ +
Note: The function works correctly only if the relevant +program was launched with shel_write. One should also point +out that threads can not be found with this function. +
  +
For KAOS 1.4.2 and MagiC one can also obtain the name of an +application by passing the string "?\0\n", where +"n" represents the ap_id. If the function value returns 0, +the ap_id is invalid. Otherwise the return is 1, and the string will +be overwritten by the application's name. If two applications have the +same name, only the first will be found. +
  +
Some AES names are pre-defined: +
"SCRENMGR": Screen manager +
"        ": Integrated desktop +
"?AGI": appl_getinfo with AES versions < 4.00 is +present +
  +
Return value: A negative return value denotes that an error has arisen. +
  +
Availability: The presence of the additional features can be checked with +appl_getinfo (opcode 4). +
  +
Group: Application library +
  +
See also: Binding   appl_search   Screen-manager +
  + +
+ +

8.3.4.1 Bindings for appl_find

+ + + + + + + + + +
C: int16_t appl_find ( CONST int8_t *ap_fpname ); +
  +
Binding: +
  +
int16_t appl_find (CONST int8_t *ap_fpname)
+{
+   addr_in[0] = ap_fpname;
+   return ( crys_if(13) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]13 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]ap_fpname
int_outint_out[0]Return value
+
+ + +
+ + +

8.3.5 appl_getinfo

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Application get information« - Inquire information about +available function calls and properties of the AES. +
  +
Opcode: 130 +
  +
Syntax: int16_t appl_getinfo ( int16_t ap_gtype, int16_t *ap_gout1, +int16_t *ap_gout2, int16_t *ap_gout3, int16_t *ap_gout4 ); +
  +
Description: With the function appl_getinfo one can inquire certain +properties of the operating system at run-time. +
  +
ap_gtype determines the type of information that is to +be returned in shorts pointed to by ap_gout1..4. Details are +as follows: +
  + +
AES_LARGEFONT (0): Get AES regular font information +
  + + + + + + + + + +
ap_gout1: Font height (in points) +
ap_gout2: Font ID +
ap_gout3: Font type (0=system font, 1=outline font) + +
+ + +
AES_SMALLFONT (1): Get AES small font information +
  + + + + + + + + + +
ap_gout1: Font height (in points) +
ap_gout2: Font ID +
ap_gout3: Font type (0=system font, 1=outline font) + +
+ + + + + + + +
AES_SYSTEM (2): Colours +
  + + + + + + + + + + + + +
ap_gout1: VDI device number (device ID) +
ap_gout2: Number of colours supported by AES object library +
ap_gout3: Colour icons present (1) or not (0) +
ap_gout4: + + + + + + +
Bit 0: New resource file format (AES4) is supported +
Bit 1: Indicates that Interface resource file format (RSHDR:rsh_vrsn = +3) is supported + +
+ + +
+ + + + +
AES_LANGUAGE (3): AES language +
  + + + +
ap_gout1: +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
0-English
1-German
2-French
3-Reserved
4-Spanish
5-Italian
6-Swedish
+
+ + +
+ + + + +
AES_PROCESS (4): General AES environment info 1 +
  + + + + + + + + + + + + +
ap_gout1: Preemptive multitasking (1) or not (0) +
ap_gout2: appl_find converts MiNT/AES ID's (1) or not (0) +
ap_gout3: appl_search implemented (1) or not (0) +
ap_gout4: rsrc_rcfix implemented (1) or not (0) + +
+ + +
AES_PCGEM (5): General AES environment info 2 +
  + + + + + + + + + + + + +
ap_gout1: objc_xfind implemented (1) or not (0) +
ap_gout2: Reserved, always 0 +
ap_gout3: menu_click implemented (1) or not (0) +
ap_gout4: shel_rdef/shel_wdef implemented (1) + +
+ + +
AES_INQUIRE (6): General AES environment info 3 +
  + + + + + + + + + + + + +
ap_gout1: appl_read -1 is valid param. (1) or not (0) +
ap_gout2: shel_get -1 is valid param. (1) or not (0) +
ap_gout3: menu_bar -1 is valid param. (1) or not (0) +
ap_gout4: menu_bar 100 (MagiC) is valid param. (1) or not (0) + +
+ + +
7: Reserved for MagiC and other OS extensions; MultiTOS +sets all return values always to 0. In MagiC: +
  + + + + + + + + + + + + +
ap_gout1: + + + + + + + + + + + + + + + +
Bit 0: wdlg_xx functions implemented (1) +
Bit 1: lbox_xx functions implemented (1) +
Bit 2: fnts_xx functions implemented (1) +
Bit 3: fslx_xx functions implemented (1) +
Bit 4: pdlg_xx functions implemented (1) or not (0) in each case + +
+ +
ap_gout2: Reserved +
ap_gout3: Reserved +
ag_gout4: Reserved + +
+ + + + +
AES_MOUSE (8): Mouse support +
  + + + + + + + + + +
ap_gout1: graf_mouse modes (258-260) supported (1) or not (0) +
ap_gout2: Mouse form managed by the AES for each application (1) or +not (0) +
ap_gout3: Warning: Double assignment +
- Mouse-wheels support (XaAES) - If a driver is installed which uses +TORG 105, then this value is a bit-vector of the currently available +mouse-wheels + +
+ + +
AES_MENU (9): Menu support +
  + + + + + + + + + + + + +
ap_gout1: MultiTOS submenus supported (1) or not (0) +
ap_gout2: MultiTOS popups supported (1) or not (0) +
ap_gout3: MultiTOS scroll menus supported (1) or not (0) +
ap_gout4: Extended MN_SELECTED message (object tree info in msg[5..7]) +supported (1) or not (0) + +
+ + +
AES_SHELL (10): shel_write +
  + + + + + + + + + + + + +
ap_gout1: Modes supported + + + + + + +
Bit 0..7: Indicate highest legal value for (sh_wdoex & 0x00ff) +
Bit 8..15: Indicate which bits in (sh_wdoex & 0xFF00) are supported as +in MultiTOS + +
+ +
ap_gout2: + + + + + + +
1: shel_write (0) makes previous shel_write calls invalid (i.e. the +desktop becomes follower program) (TOS 1.04 and MagiC) +
0: Launches program (MultiTOS) + +
+ +
ap_gout3: + + + + + + +
1: shel_write (1) launches a program when the running one exits +(TOS 1.04 and MagiC) +
0: Launches program immediately (MultiTOS) + +
+ +
ap_gout4: ARGV style parameter passing via sh_wiscr supported (1) or not +(0) + +
+ + +
AES_WINDOW (11): window support +
  + + + + + + + + + + + + +
ap_gout1: Extended WF_ functions in wind_get/wind_set (0=not available, +1=available) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Bit 0: WF_TOP returns window below current one +
Bit 1: wind_get(WF_NEWDESK) supported +
Bit 2: wind_get/set(WF_COLOR) +
Bit 3: wind_get/set(WF_DCOLOR) +
Bit 4: wind_get(WF_OWNER) +
Bit 5: wind_get/set(WF_BEVENT) +
Bit 6: WF_BOTTOM +
Bit 7: WF_ICONIFY +
Bit 8: WF_UNICONIFY +
Bit 9: WF_WHEEL +
Bit 10: wind_get(WF_FIRSTAREAXYWH) +
Bit 11: wind_get/set(WF_OPTS) +
Bit 12: wind_get/set(WF_MENU) +
Bit 13: wind_get/set(WF_WORKXYWH) +
Bit 14: Supports wind_get(WF_CALCW2F/WF_CALCF2W) and wind_set(WO0_WCOWORK) +modes +
Bit 15: wind_set and wind_get can be called with the special handle -2. +Then, wind_set and wind_get invoked with this special handle report if the +mode is supported by the AES. + +
+ +
ap_gout2: + + + + + + +
Bit 0: wind_get/set (WF_WIDGETS), N.AES +
Bit 1..15: Reserved + +
+ +
ap_gout3: New widgets support: (0=supported, 1=not supported) + + + + + + + + + + + + + + + +
Bit 0: Iconifier +
Bit 1: Backdrop button (MagiC) +
Bit 2: [Shift]-click for backdrop +
Bit 3: 'Hot' close-box (GEM/3 and MagiC) +
Bit 4..15: Reserved, 0 + +
+ +
ap_gout4: wind_update 'Check and set' implemented (1) or not (0) + +
+ + +
AES_MESSAGE (12): Messages sent to applications +
  + + + + + + + + + +
ap_gout1: Bit field of extra messages supported (0=no, 1=yes) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Bit 0: WM_NEWTOP is meaningful +
Bit 1: WM_UNTOPPED is sent +
Bit 2: WM_ONTOP is sent +
Bit 3: AP_TERM is sent +
Bit 4: MultiTOS Shutdown and Resolution change messages supported +
Bit 5: CH_EXIT is sent +
Bit 6: WM_BOTTOMED is sent +
Bit 7: WM_ICONIFY is sent +
Bit 8: WM_UNICONIFY is sent +
Bit 9: WM_ALLICONIFY is sent +
Bit 10: WM_REPOSED is sent + +
+ +
ap_gout2: Reserved, all 0 +
ap_gout3: WM_ICONIFY returns coordinates (1) or not (0) + +
+ + +
AES_OBJECT (13): Object information +
  + + + + + + + + + + + + +
ap_gout1: 3D-objects via ob_flags implemented (1) or not (0) +
ap_gout2: 0 - objc_sysvar not present +
1 - MultiTOS 1.01 objc_sysvar present +
2 - Extended objc_sysvar present +
ap_gout3: Speedo and GDOS fonts permitted in TEDINFO (1) or not (0) +
ap_gout4: Reserved for MagiC and other extensions; MultiTOS always sets +all return values to 0. In MagiC and N.AES the following apply: + + + + + + + + + + + + +
Bit 0: G_SWBUTTON supported +
Bit 1: G_POPUP supported +
Bit 2: WHITEBAK controls underlines and buttons +
Bit 3: G_SHORTCUT supported + +
+ + +
+ + + + + + + +
AES_FORM (14): Forms (MagiC form_xdo and form_xdial) +
  + + + + + + + + + + + + +
ap_gout1: MagiC Flydials present (1) or not (0) +
ap_gout2: MagiC keyboard tables present (1) or not (0) +
ap_gout3: Last cursor position returned from obj_edit (1) or not (0) +
ap_gout4: Reserved, 0 + +
+ + +
AES_EXTENDED (64): Extended functions +
  + + + + + + + + + + + + +
ap_gout1: shel_write(10) with AP_AESTERM possible (1) or not (0) +
ap_gout2: Extended shel_write SHW_SHUTDOWN(4)/SHW_RESCHANGE(5) present (1) or +not (0) +
ap_gout3: appl_search: + + + + + + +
Bit 0: Long names present +
Bit 1: Mode APP_TASKINFO available + +
+ +
ap_gout4: form_error with all GEMDOS error-codes present (1) or not (0) + +
+ + +
AES_NAES (65): Additional N.AES functions +
  + + + + + + + + + + + + +
ap_gout1: appl_control present (1) or not (0) +
ap_gout2: Highest opcode for appl_control +
ap_gout3: shel_help present (1) or not (0) +
ap_gout4: wind_draw present (1) or not (0) + +
+ + + +
96: AES Version +
There is an extended mode since XaAES from 2004-12-18. +
  + + + + + + + + + + + + +
ap_gout1: Major version number (decimal) +
ap_gout2: Minor version number (decimal) +
ap_gout3: Development Status (Beta, alpha, etc.) +
This is a 16-bit integer where bits 0-7 (the low byte) is a value +indicating the development status of the AES, see below +(AES_DEVSTATUS_xxx) for meaning of different values. Bits 8-15 are +flags, see below (AES_FDEVSTATUS_xxx) for current definitions. +
+ + + +
AES_DEVSTATUS_ALPHA   0 +
AES_DEVSTATUS_BETA    1 +
AES_DEVSTATUS_RELEASE 2 +
+ +
AES_FDEVSTATUS_STABLE 0x100 +
ap_gout4: Target platform (m68k, etc.) +
This is a value indicating which platform the AES was built +for. See below (AES_ARCH_xxx) for meaning of different values. +
+ + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
LabelValueTarget platfrom
AES_ARCH_M68K0MC-68000
AES_ARCH_M680000MC-68000
AES_ARCH_M680101MC-68010
AES_ARCH_M680202MC-68020
AES_ARCH_M680303MC-68030
AES_ARCH_M680404MC-68040
AES_ARCH_M680605MC-68060
AES_ARCH_M68020606MC-68020-060
AES_ARCH_COLDFILRE7Coldfire
+
+ + +
+ +
Together (ap_gout1 & ap_gout2), these two +contain the decimal representation of the AES's version number. For +XaAES v0.992, ap_gout1 contains 0 (0x0000) and +ap_gout1 contains 992 (0x3e0). +
  + + +
97: Available WF_OPTS settings +
Since XaAES 2005-07-09 +
  + + + + + + + + + + + + +
ap_gout1: Available window options 0 - see wind_set/get(WF_OPTS, wopt0) +
ap_gout2: Available window options 1 - see wind_set/get(WF_OPTS, wopt1) +
ap_gout3: Available window options 2 - see wind_set/get(WF_OPTS, wopt2) +
ap_gout4: Reserved - always cleared + +
+ + + +
98: Available extended AES functions +
Since XaAES 2005-12-08 +
  + + + + + + + + + + + + +
ap_gout1: + + + + + + + + + + + + +
Bit 0: If set, the following MagiC 5.10-introduced functions exists: + + + + + + + + + + + + + + + + + + +
objc_wdraw +
objc_wchange +
objc_wedit +
graf_wwatchbox +
form_wbutton +
form_wkeybd + +
+ +
Bit 1: If set, appl_options() exists +
Bit 2: If set, objc_data() exists +
Bit 3..15: Not yet defined, always reads 0 + +
+ +
ap_gout2: Not yet defined, all bits reads 0 +
ap_gout3: Not yet defined, all bits reads 0 +
ap_gout4: Not yet defined, all bits reads 0 + +
+ + + +
99: Available application options +
The bitmasks returned here are identical to the bitmasks used to +modify the application options via appl_options(APL_OPTS). Needless to +say, this option is not available if bit 0 in ap_gout1 is +cleared after appl_getinfo(AES_FUNCTIONS). +
Since XaAES 2005-12-08 +
  + + + + + + + + + + + + +
ap_gout1: + + + + + + + + + +
Bit 0: If set, extended slider management is available. +
Bit 1: If set, extended objc_edit cursor management is present; see +more info about this below +
Bit 2..15: Not yet defined, always reads 0 + +
+ +
ap_gout2: Not yet defined, all bits read 0 +
ap_gout3: Not yet defined, all bits read 0 +
ap_gout4: Not yet defined, all bits read 0 + +
+ + +
AES_WINX (22360): Information about extensions in WINX +
This information type exists since WINX 2.3 +
  + + + + + + + + + + + + +
ap_gout1: Bit-vector for WF_ functions in wind_get/wind_set: + + + + + + + + + + + + + + + + + + + + + + + + +
Bit 0: WF_WINX +
Bit 1: WF_WINXCFG +
Bit 2: WF_DDELAY +
Bit 3: WF_SHADE +
Bit 4: WF_STACK +
Bit 5: WF_TOPALL +
Bit 6: WF_BOTTOMALL +
Bit 7: WF_KIND + +
+ +
ap_gout2: Bit-vector for AES messages: + + + + + + + + + +
Bit 0: Extended WM_ARROWED +
Bit 1: WM_SHADED message is sent +
Bit 2: WM_UNSHADED message is sent + +
+ +
ap_gout3: Bit-vector for extensions of AES functions + + + +
Bit 0: wind_calc permits WC_WIN modes + +
+ +
ap_gout4: Bit-vector for general information about the AES + + + +
Bit 0: DPAT writing desk background is supported directly by the +AES + +
+ + +
+ + +
22528: XaAES +
No longer supported as of 2004-12-18. Look to ap_gtype += 96 +
  + + + + + + + + + + + + +
ap_gout1: Major version number +
ap_gout2: Minor version number +
ap_gout3: Target platform this XaAES was compiled for +
ap_gout4: Status (beta, alpha, etc.) + +
+ +
Note: A problem with this function consists of +establishing just when it may be called. Although it ought to be +present as of AES version 4.0, MagiC 2.0 (and also MagiC 3.0) for +example show the version 3.99. For this reason many programmers define +the function appl_xgetinfo, in which a check is made whether +appl_getinfo is present in the current system environment. +
  +
Note: This function was backported to FreeGEM as +xapp_getinfo (opcode 1020) and exists if the ABLE_GETINFO bit is set +in the "abilities" bitmap. +
  +
Return value: A return value of 0 indicates an error; with a value of 1, no +error has arisen. +
  +
Availability: Available as of AES version 4.00. +
  +
Group: Application library +
  +
See also: Binding +
  + +
+ +

8.3.5.1 Bindings for appl_getinfo

+ + + + + + + + + +
C: int16_t appl_getinfo ( int16_t ap_gtype, int16_t *ap_gout1, +int16_t *ap_gout2, int16_t *ap_gout3, int16_t *ap_gout4 ); +
  +
Binding: +
  +
int16_t appl_getinfo (int16_t ap_gtype, int16_t *ap_gout1,
+                      int16_t *ap_gout2, int16_t *ap_gout3,
+                      int16_t *ap_gout4)
+{
+   int_in[0] = ap_gtype;
+
+   crys_if (130);
+
+   *ap_gout1 = int_out[1];
+   *ap_gout2 = int_out[2];
+   *ap_gout3 = int_out[3];
+   *ap_gout4 = int_out[4];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]130 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]5 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]ap_gtype
int_outint_out[0]Return value
int_out+2int_out[1]ap_gout1
int_out+4int_out[2]ap_gout2
int_out+6int_out[3]ap_gout3
int_out+8int_out[4]ap_gout4
+
+ + +
+ +

8.3.5.2 appl_xgetinfo

+ +
/* The following code tests whether appl_getinfo is available in the
+   current system environment, and if positive calls the aforesaid
+   function.
+
+   It is suggested that instead of appl_getinfo, only appl_xgetinfo
+   be used in your own programs. */
+
+
+GLOBAL int16_t appl_xgetinfo ( int16_t type, int16_t *out1, int16_t *out2,
+                            int16_t *out3, int16_t *out4 )
+{
+
+   BOOLEAN has_agi = FALSE;
+
+   has_agi = ((_GemParBlk.global[0] == 0x399 && (is_MagiC() >= 0x0200))
+             || (_GemParBlk.global[0] >= 0x400)
+             || (appl_find ("?AGI") >= 0));
+
+   if (has_agi)
+      return (appl_getinfo (type, out1, out2, out3, out4));
+   else
+      return (0);
+} /* appl_xgetinfo */
+
+

The query 'is_MagiC' is a function that evaluates the MagiC +cookie and returns the version number. This is necessary as MagiC 2 +already knows the function appl_getinfo, but does not as yet permit interro +gation with "?AGI". +

+

See also: Applications   GEM   Style guidelines +

+

8.3.6 appl_getinfo_str

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Application get information« - Inquire extended information +about available function calls and properties. +
  +
Opcode: 130 +
  +
Syntax: int16_t appl_getinfo_str ( int16_t ap_gtype, int16_t *ap_gout1, +int16_t *ap_gout2, int16_t *ap_gout3, int16_t *ap_gout4 ); +
  +
Description: The call appl_getinfo_str is an extended version of +appl_getinfo. Instead of the integer values, it returns character +strings. +
  +
ap_gtype determines the type of information that is to +be inquired for. Details are as follows: +
  +
96: AES Version +
  + + + + + + + + + + + + +
ap_gout1: This is a character string with a fixed length of 8 bytes, into +which the AES will write its unique AES ID. The AES ID is a +right-aligned, space padded string, and can be considered to be the +current AES's short name. For XaAES this string is filled with +"XaAES". This string is not NULL-terminated. +
ap_gout2: This is a character buffer that the application must ensure can +take up to 256 (255 + '0' termination) characters. The AES fills +its long name description into this buffer. Lines in here are +delimitted using CR (ASCII 13). For XaAES, this buffer contains the +following after the call: +
"XaAES Ain't the AES, a free MultiTasking AES for +FreeMiNT" +
ap_gout3: This is a character buffer that the application must ensure can +take up to 256 (255 + '0' termination) characters. The AES fills +this buffer with the following information where each element is +delimitted by the "|" (ASCII 0x7c) character. The string is +constructed as follows: +
+
"asci version|development status| architecture target| +build date & time| compiler used",0 +
+
Example string returned might be: +
"0.992|Alpha|m68k|Dec 17 2004 22:58:52|gcc 2.95.3",0 +
ap_gout4: Reserved, set to NULL. + +
+ +
Note: A problem with this function consists of +establishing just when it may be called. Although it ought to be +present as of AES version 4.0, MagiC 2.0 (and also MagiC 3.0) for +example show the version 3.99. For this reason many programmers define +the function appl_xgetinfo, in which a check is made whether +appl_getinfo is present in the current system environment. +
  +
Return value: A return value of 0 indicates an error; with a value of 1, no +error has arisen. +
  +
Availability: As of XaAES from 2004-12-18. +
  +
Group: Application library +
  +
See also: Binding   appl_getinfo +
  + +
+ +

8.3.6.1 Bindings for appl_getinfo_str

+ + + + + + + + + +
C: int16_t appl_getinfo_str ( int16_t ap_gtype, int16_t *ap_gout1, +int16_t *ap_gout2, int16_t *ap_gout3, int16_t *ap_gout4 ); +
  +
Binding: +
  +
int16_t appl_getinfo_str(int16_t ap_gtype, int16_t *ap_gout1,
+                         int16_t *ap_gout2, int16_t *ap_gout3,
+                         int16_t *ap_gout4)
+{
+   int_in[0] = ap_gtype;
+
+   addr_in[0] = (int32_t)ap_out1;
+   addr_in[1] = (int32_t)ap_out2;
+   addr_in[2] = (int32_t)ap_out3;
+   addr_in[3] = (int32_t)ap_out4;
+
+   crys_if (130);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]130 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]4 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]ap_gtype
addr_inaddr_in[0]ap_gout1
addr_in+4addr_in[1]ap_gout2
addr_in+8addr_in[2]ap_gout3
addr_in+12addr_in[3]ap_gout4
int_outint_out[0]Return value
+
+ + +
+ +

8.3.7 appl_getcicon

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Application get Cicon« +
  +
Opcode: 131 +
  +
Syntax: int16_t appl_getcicon(int16_t type,char *name,int16_t size, +int_16_t *cicon_width,int16_t *cicon_height, CICON **cicon_data); +
  +
Description: The goal of this function is to provide cicon server (24 bit +true color for MyAES or 32 picture) This function provide only CICON +data with bitmap and mask and not a full object icon. Data provide by +this function should be relocated and copy, AES not keep in memory +CICON block provided that should be copy. +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
type type&0xFF : kind of icon type: +
+ + + + + + + + + + + + + + + +
0 : Application icon +
1 : File extension icon +
2 : Reserved +
3 : Load PNG file as icon from specific path +
4 : Other icon (any other specific icon) + +
+ +
+
+
If type&0x100 = 0 cicon_data return a CICON block as need by +AES for display color icon else cicon_data return a simple bitmap +block in ARBG format with 8 bit transparency (this format is not +recognize by AES) +
name name of the cicon to load, some exemple: +
with type&0xFF: + + + + + + + + + + + + +
0 : name = "purec" +
1 : name = "html" +
3 : name = "C:\myprog\mypng\pngname.png" +
4 : name = "computer" + +
+ +
size Size of the cicon to load, there is 3 different case: + + + + + + + + + +
size > 0 is the size of the icon requested and should be a multiple of +16 +
size = 0 the default cicon size is requested and is set by aes +configuration +
size = -1 the return cicon can be of any size and can change from a cicon +to another + +
+ +
cicon_width cicon width return +
cicon_height cicon height return +
cicon_data Return block of type CICON + mask + icon bitmap if +type&0x100 = 0 else a bitmap 32 bit with alpha channel in the +format ARGB 8 bits per channel. +
+
Relocation of cicon_data, cicon_data provide CICON block + mask ++ bitmap +
+
+
num_planes : number of planes +
+
*col_data, *col_mask, *sel_data, *sel_mask: provide relative +position from the start of cicon_data and should be relocated +
+
+
As the block can be free by the AES you should copy the block +for your need, the size of the block to copy is: +
number_of_block = 0
+if(cicon_data->col_data) number_of_block++;
+if(cicon_data->col_mask) number_of_block++;
+if(cicon_data->sel_data) number_of_block++;
+if(cicon_data->sel_mask) number_of_block++;
+
+size = sizeof(CICON) + (cicon_data->num_planes * cicon_width * cicon_height * number_of_block)/8 + cicon_width*cicon_height;
+
+CICON *newcicon;
+newcicon = malloc(size);
+memcpy(newcicon,cicon_data);
+if(cicon_data->col_data) newcicon->col_data += newcicon;
+if(cicon_data->col_mask) newcicon->col_mask += newcicon;
+if(cicon_data->sel_data) newcicon->sel_data += newcicon;
+if(cicon_data->sel_mask) newcicon->sel_mask += newcicon;
+
+
+
+
In the case of 32 bits bitmap size of the block = cicon_width * +cicon_height * 4 + +
+ +
Return value: A return value of 0 indicates an error, with a value of 1 no +error has arisen. +
  +
Availability: Since MyAES 0.96 beta1 +
  +
Group: Application library +
  +
See also: Binding +
  + +
+ +

8.3.7.1 Bindings for appl_getcicon

+ + + + + + + + + +
C: int16_t appl_getcicon(int16_t type,char *name,int16_t size, +int_16_t *cicon_width,int16_t *cicon_height, CICON **cicon_data); +
  +
Binding: +
  +
int16_t appl_getcicon (int16_t type,const char *name,int16_t size,
+                        int16_t *cicon_width,int16_t *cicon_height
+                        CICON **cicon_data)
+{
+   int_in[0] = type;
+   int_in[1] = size;
+
+   addr_in[0] = name;
+
+   addr_out[0] = (void *)cicon_data;
+
+   crys_if (131);
+
+   *cicon_width = int_out[1];
+   *cicon_height = int_out[2];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]131 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]3 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]1 # Entry in addr_out
int_inint_in[0]type
int_in+2int_in[1]size
addr_inaddr_in[0]name
int_outint_out[0]Return value
int_out+2int_out[1]cicon_width
int_out+4int_out[2]cicon_height
addr_outaddr_out[0]cicon_data
+
+ + +
+ +

8.3.8 appl_init

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Application initialization« - Registers the application +under AES. +
  +
Opcode: 10 +
  +
Syntax: int16_t appl_init ( void ); +
int16_t appl_init ( X_BUF_V2 *xbuf ); +
  +
Description: The call appl_init registers the program with the AES, and +initializes the internal parameter passing fields. It should be the +first function called by any application that wants to use GEM calls. +As first prototyped, the function accepted no parameters; however all +'C' compilers use this call to set up internal information as well as +to update the application's global array. +
  +
The extra parameter to an X_BUF_V2 is an extension in the +FreeGEM AES. If addr_in[0] is set to 1 and an initialized X_BUF_V2 +structure is passed in, then on return its arch member will be +0 for DRI GEM or ViewMAX, and 16 or 32 for FreeGEM. +
  +
Note: The version number of the AES can be inquired +after this call via the global field (global[0]). +
  + +
To test whether a program has been started from the AUTO folder, +the following procedure is suggested: +
  +
    +
  • Write the value 0 in global[0] +
  • +
  • Call function appl_init +
  • +
  • Inspect global field (global[0]): If there is still a zero there, then the +AES is not yet ready for operation and the program was started from +the AUTO folder. +
  • +
+ +
Although this procedure is not documented officially, it is used +by the mouse accelerator MACCEL by Atari in this way. +
  +
KAOS-GEM 1.4.2 returns 'KA' in int_in[0] and 'OS' in +int_in[1]. +
  +
Return value: The function returns the ID of the application. In case of an +error the value -1 is returned. +
  +
Availability: All AES versions. +
  +
Group: Application library +
  +
See also: Binding   appl_find   appl_search   appl_exit +
  + +
+ +

8.3.8.1 Bindings for appl_init

+ + + + + + + + + +
C: int16_t appl_init ( void ); +
  +
Binding: +
  +
EXTERN AESPB c;
+
+int16_t appl_init (void)
+{
+   c.cb_pcontrol = control;
+   c.cb_pglobal  = global;
+   c.cb_pintin   = int_in;
+   c.cb_pintout  = int_out;
+   c.cb_padrin   = addr_in;
+   c.cb_padrout  = addr_out;
+
+   control[4] = 0;
+   crys_if (10);
+
+   return (int_out[0]);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]10 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_outint_out[0]Return value
+
+ + +
+ +

8.3.9 appl_options

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Application options« - Set or get application options. +
  +
Opcode: 137 +
  +
Syntax: int16_t appl_options(int16_t mode, int16_t aopts0, int16_t +aopts1, int16_t aopts2, int16_t aopt3, int16_t *out0, int16_t *out1, +int16_t *out2, int16_t *out3); +
  +
Description: The purpose of the appl_options function is to let application +set/get options available to it, such as the extended objc_edit mode. +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    + + +
mode Selects the mode. If mode is AOPT_CLEAR (0), then the selected +options found in aopt0 - aopt3 are cleared, disabling +them. If AOPT_SET (1), then the selected option bit is set, enabling +them. + + +
aopt0 The first group of 16 options which have the following meaning: + + + + + + +
Bit 0 - AO0_WF_SLIDER +
If this bit is set, blah, blah, yeah. +
Bit 1 - AO0_OBJC_EDIT +
If this options is enabled, objc_edit... blah + +
+ +
aopt1 The second group of 16 options, none of which is defined yet. +Always reads 0. +
aopt2 The third group of 16 options, none of which is defined yet. +Always reads 0. +
aopt3 The third group of 16 options, none of which is defined yet. +Always reads 0. +
out0 +
out1 +
out2 +
out3 + +
+ +
Return value: Return 1 = OK or 0 = error. +
  +
Availability: The presence of the function can be checked with appl_getinfo (opcode +98). +
  +
Group: Application library +
  +
See also: Binding +
  + +
+ +

8.3.9.1 Bindings for appl_options

+ + + + + + + + + +
C: int16_t appl_options(int16_t mode, int16_t aopts0, int16_t +aopts1, int16_t aopts2, int16_t aopt3, int16_t *out0, int16_t *out1, +int16_t *out2, int16_t *out3); +
  +
Binding: +
  +
int16_t appl_options(int16_t mode,
+                int16_t aopts0, int16_t aopts1,
+                int16_t aopts2, int16_t aopt3,
+                int16_t *out0, int16_t *out1,
+                int16_t *out2, int16_t *out3)
+{
+   int_in[0]  = mode;
+   int_in[1]  = aopts0;
+   int_in[2]  = aopts1;
+   int_in[3]  = aopts2;
+   int_in[4]  = aopts3;
+
+   crys_if(137);
+
+  *out0 = int_out[1];
+  *out1 = int_out[2];
+  *out2 = int_out[3];
+  *out3 = int_out[4];
+
+  return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]137 # Function opcode
control+2control[1]5 # Entry in int_in
control+4control[2]5 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]mode
int_in+2int_in[1]aopts0
int_in+4int_in[2]aopts1
int_in+6int_in[3]aopts2
int_in+8int_in[4]aopts3
int_outint_out[0]Return value
int_out+2int_out[1]out0
int_out+4int_out[2]out1
int_out+6int_out[3]out2
int_out+8int_out[4]out3
+
+ + +
+ +

8.3.10 appl_read

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Application read« - Receives a message from another +application. +
  +
Opcode: 11 +
  +
Syntax: int16_t appl_read ( int16_t ap_rid, int16_t ap_rlength, void +*ap_rpbuff ); +
  +
Description: The call appl_read aids inter-process communication between +processes running under the AES. It will halt the running +application until a sufficient number of bytes is available from the +message pipe. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
ap_rid ID of the application from whose event buffer the data should +be read +
ap_rlength Number of bytes to be read +
ap_rpbuff Address of the buffer in which the data is to be stored + +
+ +
The function waits if necessary until the demanded number of +bytes is actually available. In MagiC and MultiTOS the function has +been extended in such a way that it returns immediately with a +suitable message if no messages are waiting at present +(ap_rid: -1). +
  +
Note: appl_read works destructively, i.e. after the +readout the messages are removed from the message-pipe. This makes it +necessary to evaluate the read message in the same way as after a +evnt_multi call, say. +
  +
The presence of the extended features can be inquired with +appl_getinfo (opcode 6). +
  +
Return value: If a 0 is returned then an error has occurred, else a positive +number is returned. +
  +
Availability: All AES versions. +
  +
Group: Application library +
  +
See also: Binding   appl_init   appl_write   evnt_mesag   evnt_multi +
  + +
+ +

8.3.10.1 Bindings for appl_read

+ + + + + + + + + +
C: int16_t appl_read ( int16_t ap_rid, int16_t ap_rlength, void +*ap_rpbuff ); +
  +
Binding: +
  +
int16_t appl_read (int16_t ap_rid, int16_t ap_rlength,
+                   void *ap_rpbuff)
+{
+   int_in[0]  = ap_rid;
+   int_in[1]  = ap_rlength;
+   addr_in[0] = ap_rpbuff;
+
+   return ( crys_if(11) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]11 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]ap_rid
int_in+2int_in[1]ap_rlength
addr_inaddr_in[0]ap_rpbuff
int_outint_out[0]Return value
+
+ + +
+ +

8.3.11 appl_search

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Application search« - Search for applications in system. +
  +
Opcode: 18 +
  +
Syntax: int16_t appl_search ( int16_t ap_smode, int8_t *ap_sname, +int16_t *ap_stype, int16_t *ap_sid ); +
  +
Description: Depending on the parameters, the function appl_search searches +for filenames of various applications running in the system. The +following apply: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    + + + + +
ap_smode Search for: +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
APP_FIRST0First application
APP_NEXT1Next application
APP_DESK2System shell
APP_TASKINFO0x100Request task info,
  XaAES bit that may be added.
+
+ +
ap_sname Buffer that receives the name of the found application filename +(at least 9 bytes including a terminating NULL-byte) + + + + + + +
ap_stype Type of the process as bit-vector: +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
APP_SYSTEM0x001System process
APP_APPLICATION0x002Application
APP_ACCESSORY0x004Accessory
APP_SHELL0x008System shell
APP_AESSYS0x010AES system process, XaAES
APP_AESTHREAD0x020AES system thread, XaAES
APP_HIDDEN0x100Task is disabled,
  XaAES only for APP_TASKINFO
APP_FOCUS0x200Active application,
  XaAES only for APP_TASKINFO
+
+ +
ap_sid ID of the found application + +
+ +
It is possible to obtain the long name of the application if one +knows its application ID. +
  +
The long name is the one that was passed by the application at a +menu_register call and is also displayed in the menu bar. +
  +
If one knows the application ID apid of an application, +then its long name will be transferred to the buffer longname +by a following call of appl_search: +
  +
appl_search(-apid, &longname[0], &type, &pid) +
  +
type here is the bit-mask of the application type also +returned normally, pid the MiNT-pid (not: apid) of the +application. +
  +
So the first parameter to be passed is the negative value of the +application ID to obtain the long name of this application. This name +can be up to 32 characters long (31 characters plus terminating +NULL-byte), so one should reserve a correspondingly sized buffer for +longname. +
  +
APP_TASKINFO automatically returns the long name of an +application and is available only under XaAES. +
  +
With this routine one cannot find threads. +
  + + + +
Geneva has three extra modes: +
  +
    +
  • X_APS_CHEXIT (-1) +
    Retrieves the name, ID, and type of the last application to exit. +This makes it possible for a program which receives a CH_EXIT notice +to determine the name of the program which exited. Note that this +information is not buffered; this means that if one process terminates +and its parent does not make the appl_search call before a second one +does, the information will no longer reflect the first process which +terminated. +
      +

  • +
  • X_APS_CHILD0 (0x7100) +
    Retrieve the data concerning the child of the current application +which has the lowest application ID. (This is not necessarily the +first child application the parent ran.) +
      +

  • +
  • X_APS_CHILD (0x7101) +
    Retrieve the data for each additional child of the current +application. +
      +

  • +
+ +
Return value: The function returns the value 1 if no error has arisen, or the +value 0 if no further applications are present. +
  +
Availability: The presence of this function can be ascertained with appl_getinfo +(opcode 4). Ascertaining of the long name and task information can be +recognized by appl_getinfo (opcode 64). +
  +
Group: Application library +
  +
See also: Binding   appl_find   Broadcasting +
  + +
+ +

8.3.11.1 Bindings for appl_search

+ + + + + + + + + +
C: int16_t appl_search ( int16_t ap_smode, int8_t *ap_sname, +int16_t *ap_stype, int16_t *ap_sid ); +
  +
Binding: +
  +
int16_t appl_search (int16_t ap_smode, int8_t *ap_sname,
+                     int16_t *ap_stype, int16_t *ap_sid)
+{
+   int_in[0]  = ap_smode;
+   addr_in[0] = ap_sname;
+
+  crys_if(18);
+
+  *ap_stype = int_out[1];
+  *ap_sid   = int_out[2];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]18 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]3 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]ap_smode
addr_inaddr_in[0]ap_sname
int_outint_out[0]Return value
int_out+2int_out[1]ap_stype
int_out+4int_out[2]ap_sid
+
+ + +
+ +

8.3.12 appl_tplay

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Application play« - Play back AES events. +
  +
Opcode: 14 +
  +
Syntax: int16_t appl_tplay ( APPLRECORD *ap_tpmem, int16_t ap_tpnum, +int16_t ap_tpscale ); +
  +
Description: The call appl_tplay offers the possibility to play back user +actions recorded with appl_trecord. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
ap_tpmem Address of the buffer that contains the events to be replayed +
ap_tpnum Number of events to be executed +
ap_tpscale Speed factor for how fast AES will try to replay the +events (0..10000); a value of 100 = normal speed + +
+ +
Return value: The function always returns the value 1. +
  +
Availability: All AES versions. +
  +
Group: Application library +
  +
See also: Binding   appl_trecord +
  + +
+ +

8.3.12.1 Bindings for appl_tplay

+ + + + + + + + + +
C: int16_t appl_tplay ( APPLRECORD *ap_tpmem, int16_t ap_tpnum, +int16_t ap_tpscale ); +
  +
Binding: +
  +
int16_t appl_tplay (APPLRECORD *ap_tpmem, int16_t ap_tpnum,
+                    int16_t ap_tpscale)
+{
+   int_in[0]  = ap_tpnum;
+   int_in[1]  = ap_tpscale;
+   addr_in[0] = ap_tpmem;
+
+   return ( crys_if(14) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]14 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]ap_tpnum
int_in+2int_in[1]ap_tpscale
addr_inaddr_in[0]ap_tpmem
int_outint_out[0]Return value
+
+ + +
+ +

8.3.13 appl_trecord

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Application record« - Record AES events. +
  +
Opcode: 15 +
  +
Syntax: int16_t appl_trecord ( APPLRECORD *ap_tbuffer, int16_t +ap_trcount ); +
  +
Description: The call appl_trecord serves for recording user actions to be +able to play them back again later. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
ap_tbuffer Address of memory block in which the events are to be stored +
ap_trcount Number of events to be stored + +
+ +
Return value: The number of events actually recorded. +
  +
Availability: All AES versions. The function is only implemented properly +as of GEM Version 1.2. +
  +
Group: Application library +
  +
See also: Binding   appl_tplay +
  + +
+ +

8.3.13.1 Bindings for appl_trecord

+ + + + + + + + + +
C: int16_t appl_trecord ( APPLRECORD *ap_tbuffer, int16_t +ap_trcount ); +
  +
Binding: +
  +
int16_t appl_trecord (APPLRECORD *ap_tbuffer,
+                      int16_t ap_trcount)
+{
+   int_in[0]  = ap_trcount;
+   addr_in[0] = ap_tbuffer;
+
+   return ( crys_if(15) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]15 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]ap_trcount
addr_inaddr_in[0]ap_tbuffer
int_outint_out[0]Return value
+
+ + +
+ +

8.3.14 appl_write

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Application write« - Send AES message to another +application. +
  +
Opcode: 12 +
  +
Syntax: int16_t appl_write ( int16_t ap_wid, int16_t ap_wlength, void +*ap_wpbuff ); +
  +
Description: The call appl_write writes a number of bytes to a valid message +pipe. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
ap_wid ID of the application to which the message is to be sent +
ap_wlength Number of bytes to be sent +
ap_wpbuff Address of buffer containing the message to be transferred + +
+ +
Notes: With this function an application has the +possibility to send itself and receive a redraw message. As of MagiC +Version 4.0 the following applies: if the parameter ap_wid has +the value -2, then ap_wpbuff points to a XAESMSG structure. +
  +
As of AES version 1.40, desk accessories may send MN_SELECTED +messages to the desktop to trigger desktop functions. +
  +
As of AES version 4.00 one can send shel_write(7...) to +'broadcast' a message to all running processes apart from the AES +itself, the desktop and one's own application. +
  +
Return value: If a zero is returned then an error has arisen, else a positive +number is returned. +
  +
Availability: All AES versions. +
  +
Group: Application library +
  +
See also: Binding   appl_init   appl_read   appl_find   Messages +
  + +
+ +

8.3.14.1 Bindings for appl_write

+ + + + + + + + + +
C: int16_t appl_write ( int16_t ap_wid, int16_t ap_wlength, void +*ap_wpbuff ); +
  +
Binding: +
  +
int16_t appl_write (int16_t ap_wid, int16_t ap_wlength,
+                    void *ap_wpbuff)
+{
+   int_in[0]  = ap_wid;
+   int_in[1]  = ap_wlength;
+   addr_in[0] = ap_wpbuff;
+
+   return ( crys_if(12) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]12 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]ap_wid
int_in+2int_in[1]ap_wlength
addr_inaddr_in[0]ap_wpbuff
int_outint_out[0]Return value
+
+ + +
+ +

8.3.15 appl_xbvget

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Extended application bit-vector get« - Get the available +logical drives for the file-selector. +
  +
Opcode: 18 +
  +
Syntax: int16_t appl_xbvget ( uint32_t *bvdisk, uint32_t *bvhard ); +
  +
Description: The call appl_xbvget gets GEM the list of logical drives +that are present; it's needed, amongst others, for the file-selector, +and this extended version allows drives beyond P:. The following +apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
bvdisk Bit-vector of floppy drives present (bit 31 = Drive A: etc). +
bvhard Bit-vector of hard drives present (bit 31 = Drive A: etc). + +
+ +
Return value: The return value is always 1. +
  +
Availability: GEM/4, GEM/5 and FreeGEM. +
  +
The function to do this is present on FreeGEM if the ABLE_XBVSET +bit is set in the "abilities" bitmap. +
  +
Group: Application library +
  +
See also: Binding   appl_bvset   appl_xbvset +
  + +
+ +

8.3.15.1 Bindings for appl_xbvget

+ + + + + + + + + +
C: int16_t appl_xbvget ( uint32_t *bvdisk, uint32_t *bvhard ); +
  +
Binding: +
  +
int16_t appl_xbvget (uint32_t *bvdisk, uint32_t *bvhard)
+{
+   int_in[0]  = 0;
+
+   crys_if(18);
+
+   *bvdisk = int_out[1..2];
+   *bvhard = int_out[3..4];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]18 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]5 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]0
int_outint_out[0]Return value
int_out+2int_out[1..2]bvdisk
int_out+6int_out[3..4]bvhard
+
+ + +
+ +

8.3.16 appl_xbvset

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Extended application bit-vector set« - Set the available +logical drives for the file-selector. +
  +
Opcode: 18 +
  +
Syntax: int16_t appl_xbvset ( uint32_t bvdisk, uint32_t bvhard ); +
  +
Description: The call appl_xbvset informs GEM about the logical drives +that are present; it's needed, amongst others, for the file-selector, +and this extended version allows drives beyond P:. The following +apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
bvdisk Bit-vector of floppy drives present (bit 31 = Drive A: etc). +
bvhard Bit-vector of hard drives present (bit 31 = Drive A: etc). + +
+ +
Return value: Return value of the function is unknown at present. +
  +
Availability: GEM/4, GEM/5 and FreeGEM. +
  +
The function to do this is present on FreeGEM if the ABLE_XBVSET +bit is set in the "abilities" bitmap. +
  +
Group: Application library +
  +
See also: Binding   appl_bvset   appl_xbvget +
  + +
+ +

8.3.16.1 Bindings for appl_xbvset

+ + + + + + + + + +
C: int16_t appl_xbvset ( uint32_t bvdisk, uint32_t bvhard ); +
  +
Binding: +
  +
int16_t appl_xbvset (uint32_t bvdisk, uint32_t bvhard)
+{
+   int_in[0]  = 1;
+   addr_in[0] = bvdisk;
+   addr_in[1] = bvhard;
+
+   return ( crys_if(18) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]18 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]1
addr_inaddr_in[0]bvdisk
addr_in+4addr_in[1]bvhard
int_outint_out[0]Return value
+
+ + +
+ +

8.3.17 appl_yield

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Application yield« - Force AES process-switch. +
  +
Opcode: 17 +
  +
Syntax: int16_t appl_yield ( void ); +
  +
Description: With the aid of the function appl_yield one may force an AES +process change. +
  +
Note: This may be achieved in a similar way with a short +call of the function evnt_timer. +
  +
Return value: Return value of the function is unknown at present. +
  +
Availability: The function is available only under PC-GEM, Geneva, as well +as MagiC (in each case) as of Version 2.0, N.AES and XaAES. +
  +
Group: Application library +
  +
See also: Binding   evnt_timer   _appl_yield +
  + +
+ +

8.3.17.1 Bindings for appl_yield

+ + + + + + + + + +
C: int16_t appl_yield ( void ); +
  +
Binding: +
  +
int16_t appl_yield (void)
+{
+   return ( crys_if(17) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]17 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_outint_out[0]Return value
+
+ + +
+ +

8.3.18 _appl_yield

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Application yield« - Force AES process-switch. +
  +
Syntax: void _appl_yield ( void ); +
  +
Description: With the aid of the function _appl_yield one may force an +AES process change. +
  +
Note: This may be achieved in a similar way with a short +call of the function evnt_timer or appl_yield. +
  +
Return value: The function does not return a result. +
  +
Availability: The function is available TOS as of version 1.0, KAOS and MagiC +as of version 1.0. +
  +
Group: Application library +
  +
See also: Binding   evnt_timer   appl_yield +
  + +
+ +

8.3.18.1 Bindings for _appl_yield

+ + + + + + +
C: void _appl_yield ( void ); +
  +
Binding: +
  +
_appl_yield:    move.l  a2,-(sp)
+                move.w  #201,d0         ; _appl_yield()
+                trap    #2
+                movea.l (sp)+,a2
+                rts
+
+ +
+ +

8.3.19 x_appl_flags

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Control execution flags« - Get or set program flags +
  +
Opcode: 28928 +
  +
Syntax: int16_t x_appl_flags( int16_t getset, int16_t index, APPFLAGS +*flags ); +
  +
Description: The call x_appl_flags controls the execution flags that are +used when determining how an application gets run. It works in two +modes, globally and for a particular application. +
  + + + + + + + + + + + + + + + + + + +
Mode 0: Get by index +
Get the 'nth' block of global application flags. If index +is zero, the Default flags will be retrieved. If flags is not +NULL, the flags will be copied into the APPFLAGS structure pointed to by +the flags parameter. +
  +
Mode 1: Set by index +
Set the 'nth' block of global application flags. If flags +is not NULL, the flags will be copied from the APPFLAGS structure +pointed to by the flags parameter. If index is zero, +the Default flags will be set, in which case the name and +desc fields of the APPFLAGS are not altered. If index +is less than zero, a new APPFLAGS structure will be added to the end +of the global list, and it will be given the contents of +flags. +
  +
Mode 2: Delete by index +
Delete the 'nth' block of global application flags. The +index parameter must be a number greater than zero (since the +Default flags cannot be deleted.) The flags parameter is not +used in this mode. +
  +
Mode 3: Get by application ID +
Get the application flags for a particular process. index +must be a valid application ID. If flags is not NULL, the +flags will be copied into the APPFLAGS structure pointed to by the +flags parameter. +
  +
Mode 4: Set by application ID +
Set the application flags for a particular process. index +must be a valid application ID. If flags is not NULL, the +flags will be set for the application. +
  + +
Mode 5: (X_APF_SEARCH) (since Release 004) +
Use the APPFLAGS name element to search for the set of +flags that would be used by Geneva were it to run the application with +that name. Note that the name element is overwritten in the +process. The index parameter is not used. +
  +
Example: Get the flags for FOO.PRG and force it to run +in single-tasking mode: +
  +
APPFLAGS a;
+SHWRCMD shwrcmd;
+
+strcpy( a.name, "FOO.PRG" );
+x_appl_flags( X_APF_SEARCH, 0, &a );
+a.flags.s.multitask = 0;
+shwrcmd.name = "FOO.PRG";
+shwrcmd.app_flags = a.flags.l;
+shel_write( XSHD_FLAGS|XSHW_RUNANY, 0, 0,
+       (char *)&shwrcmd, "" );
+
+ +
+ +
Note: Changing the multitask attribute of an application +in this manner will have no effect, since this can only be changed +before the application is launched. +
  +
Descriptions of each of the available flags can be found in the +section of the manual describing the Task Manager's "Flags" +dialog. +
  +
Return value: 0 = Out of memory (mode 1) +
    Flags not found (all modes) +
  +
Availability: The function is available only under Geneva. +
  +
Group: Application library +
  +
See also: Binding +
  + +
+ +

8.3.19.1 Bindings for x_appl_flags

+ + + + + + + + + +
C: int16_t x_appl_flags( int16_t getset, int16_t index, APPFLAGS +*flags ); +
  +
Binding: +
  +
int16_t x_appl_flags( int16_t getset, int16_t index,
+                      APPFLAGS *flags )
+{
+   int_in[0]  = getset;
+   int_in[1]  = index;
+   addr_in[0] = flags;
+   return ( crys_if(28928) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]28928 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]getset
int_in+2int_in[1]index
addr_inaddr_in[0]flags
int_outint_out[0]Return value
+
+ + +
+ +

8.3.20 x_appl_font

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Change font and window borders« - (Geneva) +
  +
Opcode: 28929 +
  +
Syntax: int16_t x_appl_font( int16_t getset, int16_t zero, XFONTINFO +*info ); +
  +
Description: The call x_appl_font changes the characteristics of the large +font used by Geneva, and also the window widget borders. +
  +
This function gives one control over what font is used to display +characters in the menu bar, dialogs, etc. +
  +
When Geneva first runs, it checks to see if the font ID saved in +GENEVA.CNF is anything other than 1 (for a system font). If so, and +GDOS is present, it loads all available fonts, and uses the correct +font. If the particular font is not available, it reverts to the +system font. +
  +
Regardless of the font's availability, the closest point size to +the one specified is used. The window widgets will have a width which +is equal to the width of one character in the font, plus the value +specified by the user. A similar calculation is used for the widget +height. +
  +
When any element in the structure pointed to by info is +-2, the default value for that element (as though there had been no +GENEVA.CNF file when Geneva loaded) is used; in the case of a +getset value of zero (get), this default value is returned in +the info structure. +
  +
When getset is 1 and any element is -1, that element +will cause Geneva to ignore the setting, leaving the old value in +tact. +
  +
Setting these values will have no immediate effect. The +GENEVA.CNF file must be re-saved, and Geneva must be restarted before +a change can be noticed. +
  +
This example: +
  +
XFONTINFO info = { -2, -2, -2, -2 };
+x_appl_font( 0, 0, &info ); /* Get default values            */
+x_appl_font( 1, 0, &info ); /* Set to these values           */
+
+Is the same as:
+
+XFONTINFO info = { -2, -2, -2, -2 };
+x_appl_font( 1, 0, &info ); /* Set to default values         */
+
+Set it to something else:
+
+XFONTINFO info = { 1,       /* Select the system font        */
+                  10,       /* 10 point (8 x 16)             */
+                   5,       /* Widget width = 8 + 5 pixels   */
+                   4 };     /* Widget height = 16 + 4 pixels */
+x_appl_font( 1, 0, &info );
+
+
Cautions: +
  +
    +
  • Only Monospaced fonts should be used. +
      +

  • +
  • While Geneva will work properly with any size font, some +programs may not function properly with larger or smaller fonts. This +is especially true when it comes to fonts which are more than 8 pixels +wide. +
      +

  • +
+ +
The parameter zero is reserved for future expansion. +Must always be 0. +
  +
Return value: Return value of the function is unknown at present. +
  +
Availability: The function is available only under Geneva. +
  +
Group: Application library +
  +
See also: Binding +
  + +
+ +

8.3.20.1 Bindings for x_appl_font

+ + + + + + + + + +
C: int16_t x_appl_font( int16_t getset, int16_t zero, XFONTINFO +*info ); +
  +
Binding: +
  +
int16_t x_appl_font( int16_t getset, int16_t zero,
+                     XFONTINFO *info );
+{
+   int_in[0]  = getset;
+   int_in[1]  = zero;
+   addr_in[0] = info;
+   return ( crys_if(28929) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]28929 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]getset
int_in+2int_in[1]zero
addr_inaddr_in[0]info
int_outint_out[0]Return value
+
+ + +
+ +

8.3.21 x_appl_sleep

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Put application to sleep« - or wake it up +
  +
Opcode: 28930 +
  +
Syntax: int16_t x_appl_sleep( int16_t id, int16_t sleep ); +
  +
Description: The call x_appl_sleep searches for the application whose ID +(found by appl_find or appl_search) is id and either puts it +to sleep or wakes it up. While an application is asleep, its windows +are automatically closed, and it does not receive any events. +
  +

+
+ + + + + + + + + + + + + + + + +
ParameterMeaning
sleep0: Awaken application
  1: Put application to sleep
 -1: No change
+
+ +
The old state of wakefulness is always returned, unless an error +occurs. There are several situations where an error code will be +returned: +
  +
    +
  • There is no application with the ID specified. +
  • +
  • The application was the only program awake and the user tried +to put it to sleep. +
  • +
  • The application has a single-tasking child. +
  • +
+ +
If an application puts itself to sleep, it will not be able to +wake itself; this must be done by another application or by the user +from the Desk menu. +
  +
If an application which is asleep is about to be terminated for +any reason, it is first awakened, so that it can receive the AP_TERM +message. +
  +
Return value: -1: Application not found, or the state could not be changed +
  +

+
+ + + + + + + + +
bit 0 set:The application is multitasking
bit 1 set:The application is single-tasking
+
+ +
Availability: The function is available only under Geneva. +
  +
Group: Application library +
  +
See also: Binding +
  + +
+ +

8.3.21.1 Bindings for x_appl_sleep

+ + + + + + + + + +
C: int16_t x_appl_sleep( int16_t id, int16_t sleep ); +
  +
Binding: +
  +
int16_t x_appl_sleep( int16_t id, int16_t sleep );
+{
+   int_in[0]  = id;
+   int_in[1]  = sleep;
+   return ( crys_if(28930) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]28930 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]id
int_in+2int_in[1]sleep
int_outint_out[0]Return value
+
+ + +
+ +

8.3.22 x_appl_term

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Terminate application« - Terminate an application and remove +it from memory (Geneva). +
  +
Opcode: 28931 +
  +
Syntax: int16_t x_appl_term( int16_t apid, int16_t retrn, int16_t +set_me ); +
  +
Description: The call x_appl_term will cause an application to terminate. It +is similar to shel_write mode 4, except that it allows for just one +application to be terminated. +
  +
    +
  • apid is the application ID of the application to be +terminated. +
  • +
  • retrn is a value which is returned to the program which +launched the application; this should usually correspond to a GEMDOS +error number, or 0 for no error. +
  • +
  • The set_me parameter must always be non-zero. +
  • +
+ +
If the application to be terminated does not recognize the +AP_TERM message, the user will first be presented with an alert box +confirming that he wants to terminate. +
  +
Return value: 0 = The application was not found +
  +
Availability: The function is available only under Geneva. +
  +
Group: Application library +
  +
See also: Binding +
  + +
+ +

8.3.22.1 Bindings for x_appl_term

+ + + + + + + + + +
C: int16_t x_appl_term( int16_t apid, int16_t retrn, int16_t +set_me ); +
  +
Binding: +
  +
int16_t x_appl_term( int16_t apid, int16_t retrn,
+                     int16_t set_me )
+{
+   int_in[0]  = apid;
+   int_in[1]  = retrn;
+   int_in[2]  = set_me;
+   return ( crys_if(28931) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]28931 # Function opcode
control+2control[1]3 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]apid
int_in+2int_in[1]retrn
int_in+4int_in[2]set_me
int_outint_out[0]Return value
+
+ + +
+ +

8.3.23 xappl_getinfo

+ + + + + + + + + + + + +
Name: »Application get information« - Inquire information about +available function calls and properties of the AES. +
  +
Opcode: 1020 +
  +
Syntax: int16_t xappl_getinfo ( int16_t ap_gtype, int16_t *ap_gout1, +int16_t *ap_gout2, int16_t *ap_gout3, int16_t *ap_gout4 ); +
  +
Description: This is the GEM/3 equivalent of appl_getinfo() for the Atari. +It has a different name because internally it uses a different opcode +(130, which is used in the Atari AES, is already assigned to +xgrf_stepcalc() in GEM/3) +
  + +
+ +
+ +Home +AESAES +AES fundamentalsAES fundamentals +File-selector libraryFile-selector library + + diff --git a/en/ascii.html b/en/ascii.html new file mode 100644 index 000000000..c039ae8ca --- /dev/null +++ b/en/ascii.html @@ -0,0 +1,515 @@ + + + + + +The documentation for TOS: ASCII table + + + + + + + + + +Home +Contents +XSSI protocolXSSI protocol +The scancodeThe scancode + +
+ +

A ASCII table

+

The ASCII-code (American Standard Code +for Information Interchange) is a 7-bit code, +and thus comprises 128 characters. The eighth bit can either +be set to zero, or used for extensions (characters above 128 however +are no longer standardized) or for parity. In the latter case +it would make all (2n+1) bit-errors recognizable. +

+

The code is defined as follows: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexDecASCIIHexDecASCIIHexDecASCIIHexDecASCII
000NUL2032SPACE4064@6096'
011SOH2133!4165A6197a
022STX2234"4266B6298b
033ETX2335#4367C6399c
044EOT2436$4468D64100d
055ENQ2537%4569E65101e
066ACK2638&4670F66102f
077BEL2739'4771G67103g
088BS2840(4872H68104h
099HT2941)4973I69105i
0A10LF2A42*4A74J6A106j
0B11VT2B43+4B75K6B107k
0C12FF2C44,4C76L6C108l
0D13CR2D45-4D77M6D109m
0E14SO2E46.4E78N6E110n
0F15SI2F47/4F79O6F111o
1016DLE304805080P70112p
1117DC1314915181Q71113q
1218DC2325025282R72114r
1319DC3335135383S73115s
1420DC4345245484T74116t
1521NAK355355585U75117u
1622SYN365465686V76118v
1723ETB375575787W77119w
1824CAN385685888X78120x
1925EM395795989Y79121y
1A26SUB3A58:5A90Z7A122z
1B27ESC3B59;5B91[7B123{
1C28FS3C60<5C92\7C124|
1D29GS3D61=5D93]7D125}
1E30RS3E62>5E94^7E126~
1F31US3F63?5F95_7F127DEL()
+
+ +

Note: Further important codings are the BCD code, +EBCIDIC, UNICODE, as well as ISO-Latin (an 8-bit font with european +accented characters etc.). The characters between 32 and 127 of the +ASCII-code correspond to the definitions of the Atari system character +set. +

+

See also: Scancode table +

+
+ +Home +Contents +XSSI protocolXSSI protocol +The scancodeThe scancode + + diff --git a/en/bilder/gif/alert_bomb.gif b/en/bilder/gif/alert_bomb.gif new file mode 100644 index 0000000000000000000000000000000000000000..0a00bcec38393becbb3e5f63b88c27fbe76aaae4 GIT binary patch literal 309 zcmZ?wbh9u|RA5kG_{_lY9|#zL6p#U;fHaUefBt+e5C8>g86XsphOl&if2}dLese2d`;o*6JXdNI zl5*Nu{;+YfY^&@J>siR0y7iP|>yAt>o5+aphU@PI946Zw_tW+Jx%9E7fuTr=vsj}j zJBK6(dr)g!LT9%me>X>`#Uzm_Q#rbGgeK^9ESlOgzh%}^hPlgCg%@im8m^zZ%6Ycf zHpv}$?m?bV8VXu*TGPgoipNYX50J`ad*8l(j literal 0 HcmV?d00001 diff --git a/en/bilder/gif/alert_system.gif b/en/bilder/gif/alert_system.gif new file mode 100644 index 0000000000000000000000000000000000000000..06fab3d38630f0ca577b563bb5a0f470fcbf00dd GIT binary patch literal 268 zcmZ?wbh9u|RA5kG_{_lY9|#zL6p#U;fHaUefBt+e5C8>g86XsphOl&ife>f^7uab;HZmJ011 z3e8Ssy?yXbudG?F!H}#bimd4#~yx;NgiKHNdH2?rB Bb4>sM literal 0 HcmV?d00001 diff --git a/en/bilder/gif/aligment.gif b/en/bilder/gif/aligment.gif new file mode 100644 index 0000000000000000000000000000000000000000..0fae75acadc076b38dcbee2b5dc0aa6052070cdc GIT binary patch literal 3043 zcmaJ=c{o&k8y=}_MY4w)4TaDmV~a|%B(z9b-pOEw8MA1NQPv0{+4sG~Xsj87P?9Xe zSjrYs*3a0&AiMc^D}CPU`rh-$d4A`9o_jgxdXBEXj*2prd)G6-A^^Z-G69KNZ7c0){jJGs07b)a&_7}#JH>vsw^RhSRen*nBFX*Bm-~k@3$Gyzjm16q zzg9onJFR|EwygLJVffA0N5TFGi0;h#dtggKXglq1^zYYI_?NufgTJT%mV?(&SUetv z`{VeJ&HB~fGW@eyze!u6|828=&u!a@8(^_GTLcD*hhdx^IN@Pv7*K9&`?vlDHg+a} zgHxmG zl1VOBUjbbESz9OK7`BZ;iVm6+i>HShpYmNPo;0%>Ys$L$Xlm_2-b4!yDrAc;qo6xV zooq5ZUKe9O7IH8=*DXqBhYTNo`@a8N@yrM@+#uD+WEo41PPVfPNiJKQR?T%{@@OWy z&(4lkW#2W9bf(kU(jV*a98z3eT{1kAxu$|+_PF!1S-C6=*!S!2KAhF>qc2t8|L6e8 z7UIiqD*V+~5S}&QFGipbJO&;fwF;1oVdwQfmYFpeBv-7$8>CQsXE5MQr~S}VmH%W7 zg_M1)9|~QnVjm9E7Bow-(>wNZIN~aJY&i0oj?74ui78?v`i?om)=�aw`@Rvl|{q z4d-Z!gUkBC6AtH6Gp}Rba>ORxs?i^{b}@q4S!)KVLQ@5%;_ZxmIKioU+}3Q;m;Ja& zH`BeU*ls)zD;$wFiSCiI@+c4=m+@jET!zC7#a#z8jA7=n4~c#~<6aRlOrcaa*P5O% zQdWcSgn3Sc-JSf=>$0*Qi75#uZkCf4kdBpFC6=yaZZ0_|UMV+}LFaR+BUv6*D{_>k z%jJCznQBo}l!KnPYoo?-~;R`D%C2W-j z{lzS57T=H4!NI1nxC`kHXOp#iNnx!TYLucRP4#s~ySaP=Unh!z za;`LIgQtD~<@V-2u)%hr{UDb-96mqH*l*Xpl;Qyn+PGmq*M&7;juM>lm&%KCHvCE# zzj-_fD805DizJo%^{$gE96^E%PnxyncuV5w7uAQU4wI^*FG4YD^o(@RGCHZGd1WHj zPQi`-s;&7>VxFhk@_Ty=RPSKcYnlu6Dx|NVxty7-&YcY;i6Dt5*sR4Rt zDlTZy5cI}w3z|^nsCR?u@K6+U7!0HvI(ml%rfHkN-nx&4IBu+_u*n1@1`3?=>buy# z4AgtO5RN>1tu1ZuUE+nId)SlSAVI)I;k>Fn1vvMk{ri~vYLG0`p;mY)S%G-{zYh%Pw}q7$1HTr9R5>IJPr5b0Lt(aE+x>y@^PbWHUza@wT)L ze1`fPk`cwVD9&^tixUkJrBd`WjVRe)5$3v7J*{VfZHbqh$5%IQcb3Hnj zI@(}ja>FR_wVMR%OLK4t-tnBHB$9_YUJ${Qg(DRtZ>b|{%s<5NhCt*Xm_)Wqi&Lkc ziMAgRxUQRCu^#3C88DA364JODLqOHJ!=2I6owfh@M6OOAYZNA#y;oWc3jUI_gcpE} z7gO|g+eF-_5Jr|rJ_IQV3%Ok)yc)hx`89XI=^|3P36@V_1J8^fsIb~o9#X|aI5jD` zZ-Apkp-Kqj=nty6ymv!6Z;bDhM^4$-HSJrdm2<>E4tF6s+^M@p6;HOuWsFDJDhXfdrOE+9kiT@@0V&MXE9(hGa+KBpx| zV@)@L!uN0uGk%sD{|dADHzXesL(2m=R-hdUY6t!QmtvGsNQPdZdn0!h}bRB zcj|Y+EuQ;s5S->l)w<1ab_zuarzg5bbo@1p4gte@i9>osGq0nR`L-KZv)r7!s1}es zsEvAmafGWw=JyeUSi7+n@WG~wPm>!6O%ssSm9BT-?(A&U$r=7tiKm)BQldQ&a3^Ya zlYepE3;9Dx|zO0)~-lou?XBy?=`YF*e z!5@0#gLj_VV9opU#RP7fdqkx?sOECB+s0fP&l|d~@ye&fjrlC&H{-WkRyxZ!779Y& SOxhW*_VjN2;N@TksQ(wI_nW8y literal 0 HcmV?d00001 diff --git a/en/bilder/gif/atos.gif b/en/bilder/gif/atos.gif new file mode 100644 index 0000000000000000000000000000000000000000..492f4c91af5991e27953406129d06378bd7164ec GIT binary patch literal 5140 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 b1fMR0Q8oGsO+k?xt#+trHr-ew1poj$D#@`~ literal 0 HcmV?d00001 diff --git a/en/bilder/gif/cl_width.gif b/en/bilder/gif/cl_width.gif new file mode 100644 index 0000000000000000000000000000000000000000..c26be7986bafc3b6d3b1ee784bdcceae97717884 GIT binary patch literal 3771 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 NKB(n596AVT{2v%IiaY=S literal 0 HcmV?d00001 diff --git a/en/bilder/gif/disk.gif b/en/bilder/gif/disk.gif new file mode 100644 index 0000000000000000000000000000000000000000..14aab07efbf0fcb48d2e7df3ce92e756ac119078 GIT binary patch literal 1015 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 INe1Qr0=h`46aWAK literal 0 HcmV?d00001 diff --git a/en/bilder/gif/drv_udev.gif b/en/bilder/gif/drv_udev.gif new file mode 100644 index 0000000000000000000000000000000000000000..57ab9bba494ba21f5dc1d96a9733d2d2243a6561 GIT binary patch literal 2903 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 WEHsd>yrJRT^M(s=8yFcGbp8h)%Oi9E literal 0 HcmV?d00001 diff --git a/en/bilder/gif/email_gs.gif b/en/bilder/gif/email_gs.gif new file mode 100644 index 0000000000000000000000000000000000000000..4ed713fed5a7df5fb842d9e1e6d31815ca0457b4 GIT binary patch literal 1294 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 Nd2glR%t;F6zX1=(X?6er literal 0 HcmV?d00001 diff --git a/en/bilder/gif/extent_en.gif b/en/bilder/gif/extent_en.gif new file mode 100644 index 0000000000000000000000000000000000000000..abb294a1403361040cad9e368c73024cc4f273e0 GIT binary patch literal 3014 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 literal 0 HcmV?d00001 diff --git a/en/bilder/gif/f_select_en.gif b/en/bilder/gif/f_select_en.gif new file mode 100644 index 0000000000000000000000000000000000000000..a988f0c71fc7b5a9f7423fa012d5db1bbd46106d GIT binary patch literal 6007 zcmZuwcT^K^u#F875eukvY#?1RpmY^QI{r}UpwdDwij>ehp-U(9-a-$MLN7uHp(BCN z1Oy}?3P?xxZG7jvzutGw=45te?%aFlTP2kjl8;Q@pLl#?7XkqQ00RF0-vh<~7y^@% zllJ!Z_2B#eed@sj{sjXl1OkIVkPrxo)(1vVCqA2?7OZNf;CYgF#?O2#f@Q z0km2q6oQ07kVpuU1VI9{RuU9KfU=AD%VuR2i7T65X1kqyfAYm{P3Bcf=+`5 zfV{wR&}dLCXeHie>`Zw z|DeI^0B#9157e{?fh>VH00KcnAbt>t1_Z(m-qQd7EtmoGU=bW+IaO-%d*bPnM5s}m>dy;Q8Qfk~=Up|R(99U1Vy}#OC;(zZ7%ivIA(P+Rp&XzdyB&|`l=4J`;mQ13Y_vQw>6Vb+I7hlLve; z((TsD-6-|&eTyvf_99-S0j1=7sJtnn(2}cN>PM74F=a8-coVm1Gx&35#a1htcq=th z(}o(3@(5qH{~iWVY_ib(c&mh{u~Jm|ad7I7idKd&!HQBkTjAiQu7lNT5}zB&wd|pg zh)d;8v0cdsOlT6l-BbD#!^?-t#e7Se#wk&*Ut*rPZVa$C5nX`WhgBa(@kb2;nWy~C=izY1!iEeseTfsz}~ zC@WoEGZDF+fL2*awo8btSvi;3=k;*pG9L-D5L=R_;|8O?DnX5YFvTjZobh zET3UC?_GDGntlyFBUdvruHbDmG(Nn#J+7(3Wmaom)E7rI$t&NPyo=QM*zZKPzcShE zYQH;U=?YAhcX^$azdS=`aM)A+=v%rw7rDS_GZ&>)Fz`|jU;14L*GHr& zF*%OvdrQ4aF&_E&*Ya}PBN)v)1L!U8#?9Kmx~#p>Wu}^eSxbBCR*I)*&4E0}z^5cJ zo~c>?zVk=2z0O6e2UI##VL z*^9uOTNTp>YsZ=5VzxnL~X4N+yK?%tu zmTMQrd4z~U5%uZs&ls0n)jrk=UWc-bn2*)I+N?=V%8zWTAU98+xM(IPP7&)J>k0UK z#a$>8wkmtNV_Jh5`M%dM8#Vz|w-~Y) zI~#`*^+jC!M&Mg{f9Rd*?Dr%3M)!qN}x6uvpYQ zk@)py=6}3u_Es_go9v{$b@p6Px{CL*H_X@`b7XR%P9SwPKpVQpLkcZN-XkFE!(D1{i#N=ei39 zH9an>`%K-&A+nx*G%E6;&PAhldWNc$g)wM0y~NV@>@=mRHfr-!pQBs3jO_mUZp*>q zPq%&L+_?uj&G*DAc%TupOI9!HiFal{QX0OUj7Vv(I`=xZ=@^IgntIgq)kU} z7|LXx{qBL4=JnLlZN*xBZVl?hLyw{2oeImzlLmDxjwmf8Y>@u`t+fD z;_acdXhU^fhFQ9;oDkDU#)x6LzPGJ{t^qk`=F|ROSqARU1Ybro^fNQ#su?qzGx4p9 zW&$bRZbUzCfUfRbi#N{c?BVk#Vs0-s2tVKJtdqVK)_ZpucQIe^1a~LwO)hsFxXS5! z6zzu2Gg_AI9%-s^*lp`Z{?0nhS@NSF+H^L|F-(b5{dfIdd)v_rtB~Z_Fz_(F0cHFl zcJpvnej3|zw*Q0q^5Fu#FTAB%Zd0re@3?bp*nJ_|IXtv}`5}4lOJDk@+*y|u6ZP|> zL#s~rbJMAsMX%ty-k(xl8Vy^7Tn&tmQgU(RAWOP#7xDO5yIOMfDktNLn%;h@8fi>0 zYk@NaB3x=m59LDYvaYHe(F=|H8RTLm00bT;{~*Y);mWtDCh6psHWa% zJ#qfa@(V=(E(JbtFx>KI`^Pn(;UAXT-`*W{5q7Hw?mF&f+a7NW-IE6(hQ&|h%hUH? zK0e&MJo|U7`^r(hu6|b}!dsE+-R26}`{{?r&c9w>J&3cE9=WTi?&8~jU1I{{GZkuN zVkrVI@(t`(R1JAuOEz1>cqCYwL?!c^kJ-17-OjngpZ_rtb$cab5x_6`_~utfytW%F z)_q>dF3Z)g{EROftG=d%-|JA%c5S<~>;7Yw%F_HEGGl>IY#`I7pJS*`X7{ynJ{Ma{ zmnZZAQsOL6^@45;`47Hu5-tAtECnu`5-iUj%tP>%`V(AoH}E|nh|%5c*Rtzpa_}C; zl(_4Ao?y$Z{P82J%gN%mK8U~@!69O-9+&7pOptxolV7URd(NNLm;qkv1?{tju zjVKO3IUZJC%(`3@263}B)q#I;4OdSN-{=loV^&ev4A1Ac7}yK2caKPB4RczyZ#^BR zn-bFY!=$6we+3q4de)Bv6Vb~r%d*GP;vPDAHVR80tzG1SBt*~f2LORu!YMEK3SRk) zTkh|{#}Gj;upzBh5n+2?5BGwata$sCjh-t9kNoiTz(zTtqYK6ZPOHSUErota9>wmBch`(%tW21tzi1`iXfdNlyFTe8_m^ zm1ih=#gt+mAAu+}frtR96n(Y?Yu@O!I4|RbK*t_g(lexQSm>w~B33|SX)p17iCNl& zh`F`;oJ)`%GRR0j21kA^zJIkyCAn_j?N{w5;~k`ba;OzNv3)P0E>KNCFW@L8{eE7| zU1jAcws_W_C<1G&>qOFXg0sX{y8FJnTo^*KC!w89k^+RKp-K$ql#w|8cv%6vn{XC0 zy_9by@zK0VXH3J`^`*Y*BX@AG|E#zT@5kpN1;>!FN61trmF#Bg&-=(s0jbns6&a;- z8I#tZXW7y>dqTfyKciRWSb%#2Dyh4;95r-ywUq2zT)KpgH0K&vGQ@ z;vHoFaMnPq(cA0R4B?r)9tB}4X%C-AI3V-+1jCub^Dj&1RO&}5gei-s+IL_Qz2IzI zcz+(jgNvfX-LvHmBqFPcFbBprFkDJ$VN12&4fYZ&{GoiE1WyML zuU3N7Gubod_VZBWj6(WCh47qbdBq5U0y&k^%lbLf?y)ksTs>;;(n?VTLs}90Q!9LF z^=`s{gwQ)khbngG>qHct2MXtr;>(;rf{QOr&3|hUZ>ksffIW+(n$V+a?aN-eXI(lV zoi$XNZ@piv;o<(`B4nc zx9Lh)@D*LevI~d27d->&4mjYH0?9X-k-%u`@_s7Ed6(pgN*)=X6KRFyxq>q?rDZGe z=TJ50SIYya)grf^U1=yU9WUf>D0?zrc8GT}+^Xz6tGjssQ|m+T2E!jx<;(Y zsIR+}#)T|RPowaDKaDZZ52>Y;eoaO12^Qe>F%xX{VbbN2%ca@yq&0&&1^&8Y>$)2D zlCy9*Oox$=6V(n}al~(Z_fI!I>eKTSrl$0P|QzYPDjP0{UMG|l>C6y;8YL*iI zGf!>aC9q!MtC@Coezp zElAmpD5A*JJ{@oJS7{wT^w%!S+YMJLB;&t^(7Qf56uxqy^ z3s8TwmQq^qYHsl4jxgT5RH2%4eElfAT}oJ0M~s`c)tWscRPG-qQvTEo2PAiB-mNKIzM8n9p7R`VfX8s4wV;G?)jWfASJlXv@1}*`=dxo+vGh2CVcOw_GyMS2m^ z(g_txy-(C6wrXpWgwX{?otI9fyO7YEu%-z~e}Wjg^`m|_Yts~>&tkD{V28`WsCRq5 z*E#%?!KuoX;6_J|FDf+w@m_?^P1`n)FU%y&Ril9e=04NN0Z-ZP;Wg5P4Plaha6b|u zPU^Bow{Uq4OrCsAH6l26^mV4IvWWEJsXbwy{l<1Y%v`Ehx$yKqv)P&)w~UPL^bMIE z<@+}Detj5H4sf`OX!HpQ^+2SaUa=@)JQpWmA8Klz_9%+v$l63iaE&<^84eK=*+zfu zkx<&BA!#G08;Q@}H0oUFd%~p;5R?Ct>#!x&>d7fW%?I@bM{aQiZy$X``tMk{NF(iw3?yEaBkiP*+I$luYo7pm_?wVxL0Vo6VX$au3>eB3BwP?CTA z$jEfS(@H|U=w6)GhiTuXvauVFh8=%47>ba0r5l~ki~ng1xR76Ryf%0xL&eK}lxv?{ zZ7-^sA=qg5@l78-EUL>lf}Ec*(Eua42~(ts2A^wDK6z2ZBFhr`rc!LDhL#3xE%=O- zrYYX_13=W+wdpQ`@f*?U@o2B^g`aPVjrz=|g3fP0P}hLF8uxIElv1b35_+?9YL?o6 zGi~D@Pc;hhijWV>)&3gCO)zFRX-w`#g;#Ns=qjq{<@;ZG4dNes8?qm97}lAUo7++_ z-4P~SIPP1?@RTwdeBD<+sPXN-h>qli8NTw=%N4c3W2FB5Z@c!B8IcQo(alRg#RMAX z*&JpoYGxEPzq3jDipxhmT_0f(otIuGA9xS%PnJ(jPxTuQW@U6y!u5@sopl}T$NGZb z9u4MW0yi?a%Y)|L`3zY`CtCNbR7`Zosx6MAwd1kh)YqpCxTltXN+h^f`r+C>iY^?e zFB5^O#l3B;+PNfsWnmM$@ul+R)Rjd8{o5Vtn!Ckq{G*;1qVTTKesK9Df3IFHIraR0 zk5;*rT0TU|F<)$-NU=k2=uA0R-$I8*Y$f-**3)`g`0+TO3123O6V0pd$5!pE6Y8QH z$~0Y})@wzYx)`6aOBGb7pUVmBf)(-+zyIDTH7-Le_AR9R$mz#@5WO*3`{bGjCf8(U+N*!OUH&(H%Iu z(Z#Kk>l@3OTb#F>?}lx0J)U16{C>joN8#}wS@Nu=`XA-2KdOMOyyL3uy$#gyADHN8 xwRhV(zS|j!b_Mm@C1cx0!1i07o%fG-B!sqMzB^V~J2ovlcC$NlmoGtN{s&P2McDuV literal 0 HcmV?d00001 diff --git a/en/bilder/gif/fenster.gif b/en/bilder/gif/fenster.gif new file mode 100644 index 0000000000000000000000000000000000000000..3beb9f8044f0ca0e5f900d795c89a00990e77712 GIT binary patch literal 14749 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 literal 0 HcmV?d00001 diff --git a/en/bilder/gif/fenster_en.gif b/en/bilder/gif/fenster_en.gif new file mode 100644 index 0000000000000000000000000000000000000000..9f142cd090c617592d831a3505f752fe4d2a0df5 GIT binary patch literal 12551 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

dK|_Zt}Nw`%?3oy;>s^8t|URp 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 br^ON!iW1!K@2eRWzki_Tz0>SYKp^se`c?F9 literal 0 HcmV?d00001 diff --git a/en/bilder/gif/fontinfo.gif b/en/bilder/gif/fontinfo.gif new file mode 100644 index 0000000000000000000000000000000000000000..9b7ac27d776ecded1802f293942a83f6d416785e GIT binary patch literal 3090 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 S`PP&@bG@gTs>8;{qVZq+#jc?M literal 0 HcmV?d00001 diff --git a/en/bilder/gif/fontinfo_en.gif b/en/bilder/gif/fontinfo_en.gif new file mode 100644 index 0000000000000000000000000000000000000000..7e226ff6b2136083eb23d1998e575d5dc048634f GIT binary patch literal 3155 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 literal 0 HcmV?d00001 diff --git a/en/bilder/gif/frage.gif b/en/bilder/gif/frage.gif new file mode 100644 index 0000000000000000000000000000000000000000..dc485afd56a6649683e6c7ffd2114267aacd368e GIT binary patch literal 1001 zcmZ?wbh9u|)L>9!_|Cxa9|#zL6p#U;fHaUebLLD(N5?9lz$%7SUSV^fx49rsQ zF8;x~Aw{W~K(3C0OHpZZHc*^_iCGL?P!}l5sOy`Vmy%jsl2)3RU6PrfS6rH#mYA2W zkk(iP(+o3>fl=8hvm`gMAT7TrH?c$^DK!(Oqy%DL9s{!?)JCX?jsmh4kcE71i4|}Y znZ;0@3zP#nRS51>kYbQ73HPGJw9M?1#H5_mk`jb|1yubgsz4^mz)eDt0-Gu5otT?i zl!!1)64fw>G{_WDxG7LAASdbI2{|;A83lb)bMuQTaaskDMzsp61!R@5Z)yq9`#Gry z1Ef*i3R3_wLLBZ|m?+r0dU)ImR|wV0z$g@ulV4JjT7<9>EoDLFK^7uX7EBY!(fCpp zOdZ@hS?~P(qLj?M#FEs!;>zNZ)ZA1B9bh770ObXCj&lr*95Nmo794Em5Y~!0v0>ri zb~a{@IUXAq9qr~)bxK+BF@d2`+_~$`kBiC;6EzH{_53JIah#$a?$(oOxbVbe$>^|{ z6+z2R&Sg>Gcjx8h#pn7IG}%JCOq6|RI!xx$?FvvnvovgFSZ$Q>>d=nJ-FzymuBu&M zmR^|0qg|qNvsdBru2e2_&G7YBuaEUsZO?JurkMOnwtCyL`1Zt&Tyj1;)`o2Dd24o7 x$};2Ow5ijVxkmqdapjEjd_A_iKa4ZaPVtZaw<_xMi)%srhv)f9mpL$40{}jaU{L@7 literal 0 HcmV?d00001 diff --git a/en/bilder/gif/gdos_ahn.gif b/en/bilder/gif/gdos_ahn.gif new file mode 100644 index 0000000000000000000000000000000000000000..2744ce26764618f5c45a4130ce3298a007906782 GIT binary patch literal 2930 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 K&#MSCss0x>)n5|; literal 0 HcmV?d00001 diff --git a/en/bilder/gif/img2034.gif b/en/bilder/gif/img2034.gif new file mode 100644 index 0000000000000000000000000000000000000000..d600d058de991b654111a2558cedb39cf0bf9ae7 GIT binary patch literal 10196 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 literal 0 HcmV?d00001 diff --git a/en/bilder/gif/img2035.gif b/en/bilder/gif/img2035.gif new file mode 100644 index 0000000000000000000000000000000000000000..673e983231b839434a5342f77ecf38d75826794e GIT binary patch literal 7298 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 literal 0 HcmV?d00001 diff --git a/en/bilder/gif/img2036.gif b/en/bilder/gif/img2036.gif new file mode 100644 index 0000000000000000000000000000000000000000..eea858d691415eb1aedbc81d5fa3c8b814816a58 GIT binary patch literal 6948 zcmaKPbzD<#`#&ZKq9W3us7Oc&I2u$021rPcmKZP^q`L>B8L*9RHe!TyN!NfO-5{L? zUAnJ6pZa~C*X#G3KhAZZ>$=`?pVxh#0Lse>3mH3KGQ4z5L_{DEh<+V}UxVM_SNwJA z@9z%_3oHDUC?qQUPxux87@2^bh_28BrB&3qHJreZUzc3W(oQa>*1z&Zm#I|9&S0m16#r{w{aODl_|MAv3-sIc|5{mp_5Cf!^v2%a$qZs=>4meZXX|4sp5PEXrfsPlA6N%c1m7>sVm`3pGbDp9=ZWy=s>aB~&?^<* z%WcVjlckWRP*pfq1o~h#*H=|EQTk5C5G))UZyaS=cY}W z@(7-38ry|2tPW0aS0i^FkLB35qdOHGE?2&7g;mnGS^Ct@@Uhw_>BILGwu}hD<_k#g zN1T|z1Xkh*yfM-gM6gIUIQ_c3U<>6@2JCt4eVNjpXYy(IvAFhqtz@1-W_qntNUvai-tLfdVc20(r!Ih$J9gu!~|R>&<$;A4MASveyEz}fYsxIRpNM&NOsuxY^4TRkQLbKxh` zw%k|*o%g^P>qGFpd}3W6+UA;v(c;-|tG-uVQPl8ZaJW&zolsz21namZb0P)ym^obN zXc8422m_c$*KN|}X1yNPW=Zi^Kxu_~Rk>RDIm^~B=4nbH(^3(q;Va=$TGZw-5j=g5 z5lnaKH=tV8ggUddg{n|iG&}5s8BP3Co+AP#h-NFMYxcBEt;w$23T?Y_nx|qS)py@c zA=+v)BB8JgnHOXg4z8NN#gI~CJ$z)DtD96mQ*PG9hHgNMYHvjCDW7jOovevXSZ1rS zKSj+Q>6O+?Z&`n9C82EOaj;kJb7;E*&47Lnou#Y*N=Nu(zWQL!!-I zFMC1pULRM@j+4y&Zm#|Q=iQ0lTLA0D`-4mi{rmWr#JlBqDH_{@PXTwMDvif@cAqyZ z-Cp}P;!h`kI2NYEgv`y=N=trUe}AGVD&;3+Avq+3oXx7uD$jKSV$p{%so+;yoXM#_ zJet&BCMZ0bc7#WcRq1~wXBiB_HC1^#u$jA$zIVLt5gqg;TyJ%2Y8Ux=`C+<9@3Xst zbtWMd^loz>u;v9@#l&2b8z^g>MLcqX=WOjVf=qa3)g*GGYRc(8BO>D#p>E1Ppy)8X z04$H)A<&m*Sn%KC{buZ?Ui#w@eR?G9jgKKa_g^G2sHcZv6dNeTF6uuTx>RnZTXR3KlRQqB@npftmNJBvp(X7M$&8M+FlQ2m2 zs>hl0<<$;~vqtk4QNUNV&%>Ds_uU1LJz#+>m6_*exq{p1Slj-TEWDz?D=(ii$2iW1 znS`>=653V=1>v1{3(=MW7Y1bkYZ#-;P;`40Ul~+P!DP{&U4rHGMu3v%+|JK6DSll( zu4VP?1*?-H<2YWZw)kVL)CLXyN%RXB#&_##XfdlOY}gEGZW<^|wpa6$OEKjwW(2VC z+kmXc$g*)+zH9x^jW6>3@pGTc+JyuLH{`u3Gk%D>_lo#Zc*f6CK4iEdKIy>cs=5>- zT_%gurN5~sxE~kPWr;I98@9`RbDzWSH1YY}eI#G8N_jL?v8JQ~H8eW&tY)%vbgl@V zo@#`>e?y#>pWolYJBvx;xdJxa0r8b?{rQW!)+=2x@FLvIBc`c(QWV_A!;H1F&x3&H zT7swE&?xx2C?wGjp-gI&en2d{L7zR)Eg$cN1) zF2;vgZ12JCQq@m=C+hue%is%Ad4-Ig4SQe}AMISWN7p7LBo!RIf=wSJ*wM?YI>E!Y z#GV3Gt?*ASkD=cH;5?YeL*BAf87kr{uQ};uo`^cA_o*+w{SIv}?)x50lrZ`#YlQ2W zCqPNJ_?>V&EfDYsAmi7uq-*Q`_DL31sy|?xykWYzA?_f=_0#&b_cE$8y?{K8gH1IE zd)I?Uf_{jxL`B@B3d{6iarhhtOi<9cbDcMROr0L^kPHZiS-aYJZ#;?<(qkZSA7%Wc z*wH#A9mdbOhG$WY+xu1aZ+sKrw0nXsy?DyWPR|z(oy)hm-7Cwcc8ujtwNoBpAAbCb z>Vre4E#-H1Rj)0(C=c+8xO`5JVEWsN?A>CEv~K;JE;Wo;$&k?Ujqx*IM7g?4u?+X- zi?626!VJ`hZMmlyOE3xsmtVU_K=w7I%DurY z#z@xW==yHngS*bIQ~)})vCA@$L{(xaz@tb0NA3y~3b=R&ps1RZ^f04f2GQh3^23^d``P$7b8ByRB_vT}rNO$s(2# zCby3UTO{~PZVnjPy{^L^ggUpbvo%IN_`ax_Zk1W0@THofJnAQ5ez&Zt-xBuTt3*m` zyY^E0>~zx9r|SsU0(gyiQS$LfQFV>y*MWBJZPi}mFEt-GXA~w3&Y*I{!hR`(gN0W> zD82{ZI8k#i@}uKMWn4u@{h~+EG~budtLh=IJPOMNXxBKUJ-(z%@@k!*d~x@4Y#2cu zH=j2-h!GkVi3#hjF{$6e791BT@h1&X#_ch?#uaVx-Cn)b*NI4Ds0v86{iqw56-l&i#Py(gS6-u_59(H2y?rwclhU>h_aS#{31 zJ6U_g^zmX{#SaNdKM20Nph=aDnJP2TBh*;_Sl2t$_P_4#PsZnUW71bN?hm`4@ne;$s@yZ-C<}Xtgiqng@$2IV1gucWx^4amZ1nxL@hD`z#hTd?po5L z6n=2WMb39WpP#lnBn=%w69USA^=3ek%~-aw?&C1+!d{9WVhM3T`Wewn@e1*l{!hj0I6GR4D` zQk|5Enq(D7NOWF)z# zpVVcLOr~6%W?ZMuptVe6#c%w>|ziOA2rFPd+H$p?yNy7xNvfkNYGBNgRSe@^8{Q5Vo} z!MsVcLp$^7V2Njh8<|vS^n>~wi!F4aPDYdh1_|>CNXDdE`CO(?MUF>loW{;T!}~VO-Kr!fuTYgfJKi&^+Z^eQ zv|*|%@x-fEko>d5-ECq+?Qph!-# zn%%m5@SB?K`fTP?f6}-eU5oXswe><> zC#d8lEJ4XQ4nLkh1~^A;{_g{*L(z^i55bLPCc%1wazJa&5{_JHi;rdY)|TK%ly;~`mc z8bfpAcHZSi&+jvVILayveN0PoOPR&TZy^XRuUOuvtpzo(_4Rx~Oq^O_D}!Q-vw+<~ za_gg;o@5sR>%FlZrtVU-37YvbmMBZYwWgR?9y59em~nCsMzJv*cH`y;q8t=E^rYJfY|T@z zV0ThjRUNpN`__K7&A9$Wd4+?@<+L>Qd6Yew0Zo0h(UI|DE>g`Fiqg}z>SBznlwgBLCl=a(V z6V%!+1S%>m)OF?QnDY5)@CJwuLXH}>M0`J>mJm6l{Wxp4b;wO)_=0c~f9;3EcWRkC zKA^r(4dQOkJ8S?eZ&7Be5hH5+E2u#w+lS2y=Zye_q`93c{`&Lph4pvX>`vbB9*ZC7h8j$nDo!DPOxDy+85K{Z&v_>@ zPHWwq&h_!OPMa(k@W^kPZWfxxa<`W-&D0^LBa~+J6$fj%TgsYd;B%ABB`vW7DsfD+ zK0-4^`cf4veL`;Tg+AR)Ot`^dRc%?r&qpRTyWKr=7FUIoi3v=7gVOkP+Zj-r=zaEg zOeKz?!F~N_bN#8kGfaA15@Xt9wzVT;c#^?*ra6J8M+@V_x96OspMVnb7NVnObp+Wa zLq#1dik3o0g_~wpny8jvR{(L=x`Ke;6vY6D? zB9pc<9{awk~`KBQ+TH|_eoJiC18m)2D;cOJ+WM`C{ z;{3|V#Y}V5A``alrSB^2=B)0#$J6=M(t*`?zMZP#YwZ@R=JW2B>1*LNYc|U6c0bnw zY1W;TCru33#k|+uf4Vt0uSXZG`(l5632gW^F9l=Uf(X7F$nI7DeIudkfD^5yxLbYw z299#Fo9;(F)TSHH3dc$dOvg$_T_rY2g>Zs2kPdER_PYL{k;&?dc?arw9bErlF>BlL zR;~D4i@4+1?$%(^d}-f=vaUp<_e zp4;HywFj z9BAVi*GctGB?l)Y0GdW$wD9|qjP;=%EY3$?=I7PrsgJG^b|p3%0uMrWnhsX44Um%` zmbeP*_$;e!e-n#w&6?l+)U$(hc2&4-GkjFniaZ&)xfMQds%qGy_I1^FejPSwLTPxG z4?IKjnq+-Ei!3<9@_OprKhG}Rue`mE@Hy9>J+1dsELb?V8a!{oPpV5^wA!C{-Cq5W zaS=v*-cJ~=BV4@axfp&hh{N}e;m<(kFYpAOxycuNo(eM+XY+GLxQvf`UgX=6`W~~l zk1Z{}9+&`cJO32z|2b!{f;L=XoL5(Ov)pYqBBFTtj)>?QIq7rc+s{&=(kpT16KMDeo{Aq3ten@#a8E2m5N{JctE z`S4A+C?zZsP098t=NVWsZ_^p9hT+Z9jhfcr)J)U~@x8{NwF8Q!j>3w2jVyOVL30Wr z)74wEMGj4UW}*qZ8Wlc2eqQtD;~lOdJMIH`gGwf99KTklo+drh>Q)_L74#JOW-Gv8F&|ND~a8lJa>)l%*g;Q)EvB79V<2Mk4_Ri-(A4VR$J4R zt}Sf-ARHGxZ!de!!fKz<}^V0;RIp zNUEB`6K(Gbl^1~N4~;K{8sN&W3G338L(YNgZYMR_iiJBTl2349mWV;SRB1$(0w4@|f5AnC^?(O5+4QFCT4Gf~F zw9F7`038dIX0?tbhXF5340f!d>0QlL!Dq@|*R-WBm9M%g+TyMq&7>E5Yw5b>gw)Kr z7vvoqc;LVeGd&KwgCP6%YbTvnDvz{{^gTun7d+Ri+&+6Th1ME}fBpe5^21Aj4AP(9 zsx>88rF~fnn$dMyf+|HLjT2Q2MZn_3d3*wIsg7#b$Sv|o&0BP3>nzg!%tb5_S)Fws h*-tA)AU7kD$m9z$LPf1GHwyCWt%^zwpE47P{U6QroI3yj literal 0 HcmV?d00001 diff --git a/en/bilder/gif/img2037.gif b/en/bilder/gif/img2037.gif new file mode 100644 index 0000000000000000000000000000000000000000..292604cfd5daf527cd6ce99572c3cff6e61898fd GIT binary patch literal 4464 zcmaJ^XH-+!7KZ1DpreS=MWsszl@UbHQIuYk-Wf^)2|WoAdM62Ws38diNC+hqfk;AE zbbx>eA{{A;h(H7s>4a(zx2FW4vBnK{F;#y{$I#};0Y}!_;J)z@4MS?**~wV@GpM9 zH-3e(u%5c>=>vlSAb%_VW3s;14+Q_7tZ$$L)BiSE-}=7Goz?g8fw+RaonQcOXb=CV-q6dPu;u+L3&QQUe{f4#|eR_1|JKT#_qSZJQIV3c7* zyp*h0M;&i#&|K<-oyA73nL2-UUwtq^kd_fa^maWX7R!ug+KP`rhp9W9Y zgAU_oQM{D{4I#S0<~=;sFCS}_e7S9q0~u?L-BbWBZYjL#wK}VRLc@kK)gLYk?dWNg zb0r|IKIN?l27@~uK#i$-)YauKg5R+dQ?@b_^axW<#qg__9S0y0m-~)4ZoV5E(%VKF&U9Sp%{(7O)r~91LVsE-MpOwvc+65l( zt)(Nv&by%Y(XbDwca|}1ChLxov0T($gD5q;8DuYyhn(+J+0Q&w34{N#EYuZfn?a}ihLb#lXo+p{LkCq#5e zzuRJw)(AlnX<}rv0B8>5K7}j-4EG3uLoF2N24JN~_;{H`5;g_ASmsAXEs`tn*5LB$ z4yFy7TssVwwY@(@W>l#vbTRHfk_>jM{$o{-fp}yHvW@Bil*tk99!AR%+S9?9%%|7s zudsbavN+#Sn}!P7P)e{T#C#D=2$dn*&ZLc{El#>rQ(fcS-<+F;+JxDOUuB!X`Gs$OR7geFO?caR@_Cyk9jn|sXogo zSVQjyCVlwhf{Vdy{bg#;Lc`^2?@6u8GdR)bb~_am64yXrb&mj_0j2MSOxT0YL+Biz zSS5rVV3<`ah|+J`6zbJ?!^QAzw0q#Qm9~3Cp)2|759L)RT>89dxqj1?G)%)XbBP8D zV#>pv{W-l=9iq-xsaC})F2k)*HxwH3yp6rLt%Y+nY)k$)%@7sz#Y(t9SC;A$aIfGXkWXz?&-+ZpJ|I{IL+D^T{{!AZy zsI{e4Vcg(^@hYu&Q$gePD+@)1`myAun!(qQ)XQVj=Z#x7T^NaZ&s7PI0b5J7EM>2m zRlL*7cCj=47U&zBQQ+&xA-2ruVbP`I)sf3C*5Rk<6`wBps-IXB{7Hk-v=rv0wMco@ z%`5(Bbk8G3=#TSH64)MtYCgd9%O{78khdmV?#HJy&Ya-nYd9-tgt*Ra$H|P@QV~Ao z=cB1km`W8uH=vFje!${Qsl+S7ZuKf+_qp83t;%WeY z{iRbUJ8E z4~4C1*J)frrZG&!7gQ8yYWh-FcJdwzmulX6Vc@}m6BpB5(6t!$MOwzVX6o?k9R^ot zh20i8>C&Y;@Bb`oGTsyBj?xyo z?OJPNz^tykjP~{_Bs4dVEUI=bzTKbAATQjcP-R!5Pnlc>HIlm^v|h%ful1kKk870R zYy+X8y%e1EK+?^<;oco}Q{6EJ-}#6Vl00cC;A60RZK=-lPOEfPt~a*_O3}i*`Vco8q@Hm*h(pGBQnAW$r{O ztfc>{LB88!Nr}!e%X~2CP?0m<|71%VyJsMEg%Ye0=WCF~SHWY+uomlyGB2PDGW4Z& z%x&0ysjRhOu(l*LWTmI(bPIuWMl4K{EtKI#>w`9^F^d;M7O5tSJkC!_NrCM>_@JW2 z$~86NV+|DZL>@Qi8^>ty<)J%8cg)=}Seqd%mC^yKEVEz;k1=~U>MH6gOWm*WPA>D( z>eefr-*k-*vj>{yK3noj)3@ta2y}b2RB8L9;rTu9Il_m>RjyomFIrb6x6-ZKHYL~Wu2&V_ z_H_CdR)qwjFrpN6EOcL}khhi?VfmD4j$=#rv4;U>oh27JGIAm$f#>4&Uycl1$!_D$ z@Gv;uJVVbmfFFC{aR0X*+vC?pTKMaH4Tkimc6d|)Hpl(^Pxm;;g_*bBD)u}qE8Q<< zY1N^pRb9R+J9&aLtCKsgR<;E>C~JD@DZ}fc=l0_0kqfI#qGgN6!DRkQfm#9%I7U@;)#LqDh|HLt}58&na!MmJz-&B{8!! z*9|JBL=X^p;pM=&<*9Zr1&i1S_K7{o>R8Pw4{Mb(Ek5yT3&k;R&c-2Wvh6!Dm@iOA z=x*&t+{WNrgp(#hpx^lTsxQuA+5WQHE3v>3K9?`f4G&uwMzm`|;In}(EB3Qh8@rRg zv;r~5zO49ietylhV#RkR@Z-_L>QoU<)y5n6RcN|;3%W8LQ5WkFYT5jVan8l+9%D_u zvVn4$w2j)_TRo@TGEdSNKiugeJ-GybwM_w$u18=tKaM(ZY|<4wd7$55H` zqk(#7b}uBSY8CjjZquhN7OB1P5wt`6bLI!;IZcDG@sPcp=KOF)H|fvU3-ev$c`iE~ zukd_qJH1=&NZT+h{z7NA&YwAa<(iw{EG^`nf5d2D=uc*DcFsPPE|F6YU?xM6ueC*( zX#13s$gPs7N@aEBKSCGKzF86$+_OHA;Q$Lnq{zH;tLqKk(J&6FXnTmC`!AkEnoArl zS`8We1?Dqx?^?8G#>?klIS{-0IL5&oziwx;Jb&EgjHoH5KqNTFscQq$M zIy3lT^y%_+@LNRCPDY53Ry+m`=R?L*oa1%q@rgG>)z}gBodMQ5h}Yr>J0!w?6mCn8 z3gt(DbE5Ulk@4{T{~V+@KeB8lE{Un*VZV+nnnR}3Rnn|ba7|Q>mB@z&sC#rzygTX| zPr@U%gd#c$4Nur~O(3(!mW?LlyN6V>U-wZ>EGa}$*&T^FiIFjh&80W&+Y|IMeU?U$ z8ix}UkGPsb-D;7_ZKcko1Bnhmx%Y0t1Gl4e-2)=CL+1lxDdx!q>q*>j^B$>yEudM` zCI6EpRwGi*({o;$7XWRite#m(M=Pi3sl<}rrMzF0hfyyt!TqI1bQ7{6Pe;{DAgLC> z=uvS+H_4c{>8?%w$r-;y(Jd_{-F@5VlRmjA^wAAQd91{^y{yqm^r7U}@T3@SF$MAP z^MG@#!1N2K0P=dmL;jnWm_ZrqHHm7dj5A{y;aeHMa(HQusa>(o#LOh>G-TA(XR=Bp z83oxJ3S?cgPBjyN-jznhxW?4Dg+EmNU6Ep`2v0zZr|o8BWLjpkbKLW|lI_aja}up= zA%GOW?O#YSJ=d8yDi&qm1##p+_Y;42$7FxVhIZDc6v6>8paE1D@s{5!OxiQ}YQVEK zu{?Md9D!+6&BAsC#f)K2=!T$Fu|?L{VgYFfU9+fKY`il+{)v3S3v9(zoVG}&{1f>n z&JqtAaJ3Cw`G;_ML%8Ovxx7xe_nFus&D?J3+#?@xpLuXk1@d}8xp+h_k67L)NUGNw z>ijr&tP3}|Z8Xd*yEJ8uZ)(U>8q1po;rF=k1uFQ@6#OcOz&u84u?zo+gKt?N?L!%E zYdgR5UcP5g{x(N}(qpyyvb4jE1=Sz1eFC{Z3l{1}73>9Jd4mi2v4yf93w9SWgW0e) zqlNn0g~Hv15=WD)g9t+<1YHb44vSY@G*J*F7KjlA$w=cMB4RY|Wihcx8u=NdnTzpT zD22>`G?TYeg8)S<(nS%Yv7hKgHy7_+CKuUCkcLDv(Wo479I2f^(gTr(*^8_jF~&zj zh2JFqho0V7TG^4J4R&ONOb$B{^V;!sg@~R#K_s z#Jtnw*A_rko?pEh%Y4Okf%sY!rSJvOJ&tj%FOtZM_z#_j6ee z3S03;B8tpi>ZYoZA8fQt4UZVFP#P}L9jojllPbr{jp{0Kw<~=)NI`s|Gd3|P-Q^gy zI97V)$zuB^7`fanc3sV6c&BWT_by%_qE?*zWY}bAD7+gHAbT}*Ri^ruYRLuPY-)4JHT=hF9Kp36(Y4)+#A|vrrsfF* z-Cz^tW73zKDCz09Sau1#vJbR%i5l(?47Q7PaIyLx2tx+uyltkf9#Qit!SoE#yqsXE l|A0xZlXy${?F`lVDaFN>3JjrMd@b+ZMD$4-1k3=mSimf3fCZXC zHO!jBI$%Hx3dKO7VAfbPc!5TtArzW{Lc=T;5DEpMQ4oZJ7$^v4kpi_0G>QSC7z`8x z1{^^v3Pz(~2n91xFqjHh128}uumrR~4h#m^02*L{W|$?26@vqz(F`;iX6XZCK?Ff) zh=GP+mR!IBBpDEz!9X)$pdOF{wP+YZ!wfVGXRYfw3TB{Jlmj zU;pl#mHfLxmd$^+!m9miG|TnB-mzN$+QC}FUxh5Bzoc0^`OAX^{1+Nr2e2hz9?-Ok zK+J+0fIw6s5TOW!4g!G$xAgyi3o;-Ns;Yp&pl@|`b#`{PrKP2+s!B&k2Z=;VgI)yd zTR^bGh&}8A8WlOO!`XQxA9hvbwnZNi(t4>;nb#iAk8+&ss?6`i{(CDdlKJf-3a02*77PI$kV_|>hyS#-WTa*YbB1OEJMjA zRgNEeYRIGIPuk*6Yu8f7s_fsFSWMt@bz&Y6dlI#M%RbQkzAr@XY*-pa8VhX{YSvdw zg@vE8@|N-|pKME3o-M>Pm#xS+K6Da;hU$J}&i!cr!;14(o%&bcb!q?0T`f=bukS0Z zx#ApAx6eqh(Ntt z56BjuwN}bw{}LXm-}N!^)_9urol^!GmMPL7iBP!4YxaL*Z_3qw#z}CFeSI#tmuZ_W zm!(kCDkqpzSJTQzPjcVcROdM3555Lb^H$G%(oE;lTslt9+;lRCHMORQ zloYEwmefzDR_T>?4&$4QE8|7oX-}j&-a zcWlIIZrNgVhnM0v*|fKb`uW0#W$8f|W&G(^_Iy7UN3R`Ss+~K;w@lv@Ea+`I@OJ%GD_@APLx-3QX0?5K#knV)C(vu` zkek58_l)RjmG?;PY(KwHE!WzqZ|D%E|56WQE@i&^nb|b;B-`cBN`5N0{q+6lxof$< zj0LxT*WEe|M|9LGuWQ=oFOD;r`&;6jvDcS*-uV)Bu@GC=IY_PRS3r45h z?e2~xhbG^fPv^Pq)dfCn<|(ubw;ptdovb()ZZ|lL|;u^vGsL7{)=I1X(Rh~YE#YP`T zju?r_iy6s=BtOWd2DaVq8<_Qbn((#d+f36p%<`QhZD)?~`KhUJvd0I7&m^$3%knKwv^_THX-4luD?yHK z#m833?nY~tTs02r7SEGox^B-&_S&?rINwj*z>D_(qjt|7z4T(UQTR~rNx09fb|L%8 z!Q$*kUM<(>dD7o~{i0?cqtTVYW18tKZdos(|MY5g-ejJ*TDiCWX{h z;UZU1>>#sMjuMc_AH6O%HtKUYS9jxSK&MLM>9!*o90ZEB=TNoiEjL)5>bFR4eh zDR)te{DU^Q>R_&=FUNdO43yw(_$x{Gxub`N6>%=uUu?Dpgq^J7tk3VCa?j?L;DfjX zPr2B++)|A;YZ0=&RG6Qz^!pfpO`)q#+zS^=d+mVnx1z_1Wr@pdqvPX~8*a5VhVxHH zBgPN!ucKX+bM!_9d}vhlE$`m<-49FnSX;J9%U1c~Teras8d=HdEnQ}dS0JR!%InJ~ z7)QM&G+pbs@Y?O==jcVFo`_xF4w{`i{@~=NeIb|h_AESj@Ta=N6kaRIS1#?xrHxMP z_SfZxn|YXiHz3E`RNMX#`1UW`r2O(BT4rzH{K0bq+0xN^gLBBc>Re_Y)p_X&DU-#w zPo1Yq7K)@3%4}u6Q@f+L>lrr>y=Ln$DQnGKvKSMnQK%bR?h}@?Xg~>0>I3F3$6d{|nHFud)O-B1?T@6B5%%{ezKr_edggQo?9;yK z!#8#GjA2F7U`}HnhMeepZ=`vA{d1xU^GD{ulf`!%+imM_H_y)wgqwWIPPxkMdpMA7 zGkB>>=8sbZ)@0`A$IcF)rdO7a>{PYSXg(tbeJFn`KI=yK)q8js{+@a`_>14Ct(osl zTVmgTtqCpu9!RTna6FurfPTF8^^D4&Xac#g=S-rs$nF2+y|(KfJn_E3(`nXuK!0z2 zaO6nv;rfsaQQu<<0YxJ&N7a3I=3Gy7iFCek;*t*%sJ|h|Z+1=II!XS5mHe{_<4`R= z0!bQbUocv*jjDvWHK`Kn0MD)XR%xAyFWW0-ROBs9JVAqna4^!(3 zt`pWXzU}^&FA^Ib;cR==d`kp<*DO06?}*p*jKN|W*;=b9u|8ia6mlf zG+)Hf18r~$Z9MCj^erQ4fj^oqo)ms7X{8=@ofq4&2fHTjK=j6L*+1S9 z#||;E=iChu-LcyW$>L{|_tTVqW+a!3yC0NLg13^@+p)(WIWE%_ls%T8lzfzyB7G-C z@MQ8nnh#Al4m&D)X#SqJ`19DIII(#w$Cj-W>FW7mY5$+kP2s)I=Po;knk3z7cjPS; zX4Ydj4WG&RhUT(6-I_m{Cyq(6yeqpFt?!#^5Sz*{ymw(vPiQ{UFZzY*IwpL`M|LizINlc)ZlWpsh3%SZ@OH3VW)5%qpOKgS9O(%~so%N@3uBIx ziWyz=&)>{DS=JNA?4N6NUMY?xka!dRC=!nF=Xlm7{9~4IxIT%Ko^xA8L>8B?t>ha_^5N_hec$NA`)Hfnj2W_f47DF2Jhl|trAJ02Hv z6qZoRm&NBho>Y<RfdXVasv?O)_(MnrNJs?54N z(23ediP4J0-r1aIO2rXo#f@7yhF?wzM@}3}5A9?YoAeYXJ7%>ikgkf8(j;}NAyQF& z;>#WH*d5Y_VtO8)i0!!=CWHQ#a4L?!@-=Ion7t8|5VQ7rZ3iDihwYzs(G7H7hTpS9(iSd}NlY z&U!23sgeY!XQwi{IDL;@#hEo_Rp%|G{YSx z#VTj~9j{Ad3kKj-7D>DMnDrs5jA%8oq1m$t zvUmwunN-?KFOP4ilxm=Hks^fXZ_FDzw54X;8+#fW8K-!SCmP?KdevjzFl7E}grKx% I4?_8W0Dem`!TRD);BGsNDDQb0u|hf6t@-$?(W42!3h$yI0S+gcL@?CcyKB1#a#-;t+=1O z?Y-xm`<*-U-TlX2&t7Z&H*)v;82EfN_+q7rp{0_h3uiN0@ zU}$J4;#UHJf%sSW75}|5F?YhiB$tvnU|VAc3wtM9WAG~zbKqYs z;D77cVPL-gQ}NFX%d7tv@>`GqVC?=kBPQ`b?f$C$w)*^UtG}Cnqe!Kkj4gm5u(64a zIT-vO{HuTB|IziE>E+){|0w;7^O>Bnt+|u&f5^!GN%rsZZx*7zS^k9lw#4#3-rRpN z-+QKDZfoxZ`Tt7&yZle7KOw)RUMQG@e{J8!{67Q~|MdD-!*2?bzuo?o{nvKc{)gYc z8~=o2+x1T~N|@)`Pu{xjm7u zM4^vmobvi&8I(NKlPhTl64^|@rZHC04W;rpuP*4Q6)0tV@WsQI1s9IyNJs6+_p1ZP z3lww3(wSBtcUttil@syX$4c>)UeD}S&Zkbhq8a3M>(wZr^}(r78~79b`}Rv z$mQ10n2)IBXUgU}RG;8IXsfGO>v{NEE%dWM=af`IUdZm1w5iwY^pozL%pL%MKtgn7USuOM!7dNxU7$p zEG0aGK+G41JC@O>`$=|JyVEXQk$O~T9_O&dZhBU9?*bFNqBAf-6v{ai#j+KsQo=S+%NQ{_iK;oSAoQD+>HXT02bu# zv)QE2AuP3|I-k27-HpSjJqlibq`N<37$xBK;bC_wEGmE$LDMtEY$rS80 zVT8Dr#;mbHR`PES2AJ&b@$UWXK*q{#X5tnzS+>H3@s7F&(;1JNYY(g|5RXiIj`|o1 zVTF*@)#lA{ z)>JeM46c~9bsO03W_~r_-+sf`=CP@xl@&;K0AE%^N4TVVM1r<5y{(7sHh{G^^;xO( ziZol8Wvpz7;(3(Y_lyA2YoxRPcI5;W<^d=*y&#filSJ&MzC@{3peZm^YJT}pI;Ys{ zJE$?dXzxGUpr?;(6#*^#Cc_yf*PdlmmrQ zqspBIHu{=f^*I|h81jl>_#b{&-hEbUWBFlSN68kJO8w)dr6|J{&}pvm`P{^G+p=Sr z!!*S!%+!mw&+?-J1g)uS$}T=)e2kW1DOtK+(n2zA(+6O7%p3^Jux*7s@#%3MEk%1+ zib` zRJAcB@q=>D9}Dc200y!!+x8$~9v)IJ8>NvIl8TlU*s$aU~=^}%Rt1^dCMS`NGh^HiHy9jpU-9+Ag||F?R&StAd|>H!iR^1HCW4GZS#D^6^r^TfWIKW zHZc|&Jdk-y$Vd{`Fn)SUnD>rW3zr^ICqOmnc?M=w9_LbX(Bv>%)7yMJYB>?3$^D5A zPOSZ!9Qjlt^V+4%{&rXIyQ_vbQ$@Mc9d)K+io)n! zRL0YxV!anT$Pm)^9%j1q5Z%JrRJK~J?Ld&V(!ejX#3?FG+IX`9lauJm1VdxBJzF5T z;&`7!rdSt9h1XNhcw?$Id?+*A&{NrcHoj1I($>*3U}0MqhO)%pvym)r;{Z%IIA9?; z<8NpJeWHb3YYNos8JEO0P|fi7yPn@Y2d>6QG*3+s;KN3_I5F4eP6bthsP!knx%5{REX2D?C8G~ z!yq9o3?cdn!xA*6jJoLC%&X+_TQC_Sn91hXEUG8iTSp+Y(MZv|qriid(K)K81I~2& z4hqGKIE_>7wu+9X9hc)E>lr_lX5bT@&5k$`Fmgw*GWm_h_y;wvA&CxfkfY7EBw%#t&avtb!T`+cQZsy=c^HM<%`U|>0LC;dJ^(X>JKRca}gH(wY4_nP-`p8i^)+}WsJ;b zhEK8cFy9B_l=M48G3yPwT5_~HC`1Z z?T#d3aY4$gZW17m=3tbv7YUtS!{=@I!+;Ep)bGS-nuCTIjU#d**mAr7)ty<(k*#Cw zn%|il{x(yen^NNnG>>=KQvTG-&1UsJJgzgkg*E?BZ<{UZdh9ZtBPugq9(bpeqhW#I z5IAytkjeX%I^*~)@^)3pUZv0~!&RlGX+zs&Vj?7iHhsQ7i9 zOYuD7kkbDxugbtQ+ga_r(6)ot4b8TleDUEetS#Os5i3$C7t?UU|KjaNHYH6{>Rl>J zCja`Z;#oIu^O243?J$-+gmpH3{ehUhLo;I7Jnrs9k+x|o3U)FkbtL#U&olr3BfgbW>?spriW`qEwN_oo(p5*WRj_Y)cABq zYobH$La1bGYa8}AO`@XFp~ZkdJ{YuGn+dadQz>O61&OqzQ2@I446 zdC2F1Bkg@<={`f}^hbzibAa2fs^7`6H(96vsk>7UJv+6uHEP=b%*9W!+y8N$#k(Zw zy>s{N1dg9P);ztweTe~Ln10^_e46PgMWt=UdIH#_1E*^OXe@0i-}`c!`f@TTDQj~B za6nH&xwPE_3Qs&LgFkKso&$mxJIxL2fV?k)#b$J*wL&6HLP!%s>`)<33qrhm zLmYcv`Qz{fgob?94s}Zk^|3NZ*9_oBGnmWw21^$D#PS8iYX_>jhs6X2rW8ur^@gQO zduAtbM({yX9zgSF?0o@2B{R@6E2|=R|76l|0qO7^iLlx&oBAZVs=9FJ&G0A00d4Nw zg?tfKTFUDd5laOTriJR6y%8!_3UU`5_Pvac08maqNI||Eat5|^DZ5U{JDFtkDv)!b z%bABZ;v1>aD+z&!4edAY1?Mj!qot#O50rCooKi1B#MVFe7y4DsM0N$JngF5;?(65C z`EbO;nhMNc7qIQrMOvGCchg2+nMI2vXf71+4SbCuy<)+q`%D}X@yAxUylU(fj?jlr z<0nCE2h*CAxUpIfV+(0xpVmWn(Mgbet%z%qxMXgvs7c0mv*wR*zictc^8l^yq+_c2 zV(4exn6_g+eu=3VGX-mXaifd#tc?==AvuBrvnEQ&)SwjVj#aG@nzd5erUh!FQl4Y0j zq!2<=OC|jeq>{b5($~7P`+2gdld`VfBvg>;Uw%npkd1tH<&VC4zd*~`G@Hcbk;4Q9 z&FdIaKsfZdZJhaigvnL8@oc8AQZlx4+F#^WCFkK><|cIK_yeW-c_ma4=F6AxPje*L zbD{8}>@M+-*uacuFY;~X^3h@59$_Z)KLSZT?K8ft%*tiqrwgci1KbxH z_raq`g2}Cv7nn9z#60uvxX@VJ@-r7taSS;iZk;UwtBB^Z=*$vc#8Y73uhN2*owHq7 z+3)ja)j+wL7sFkg4WdF=Z6I%fFu^PAkjA~~ zoY@R{i37A`d_7a~I>jl(jBW=`hbqAXTlMfDw(veE5$Xm^NLJLC9pWKNIJAFu<-}i= zV?w>I5Xg*vWED}-9$xvrKop5*G5h=Su7q+dhLV-8Qi%ox>4l0T^h>`$DQc&JASL^b zNpM8G>K$6QRP{k=2uTP@U~ZwTF_A~%Bf)6(_Z2LSNS<(C%tttmxlcA*xHdchod6n%~|MY^7PbqBJQ6#&$0>ohRJ-5DodeJ5-#ML%(_=9nkh=`1{E z*FV(LM?btq$=o@yEApAHfk9!-Ft`fmZS|H1WVG&+?W0dLE(#B)>VK-|C)}h-Fhh_O z@wM)ekCL24J!_RUaxlp(j#C25<;q>5N}z3n(KRFlQBMSi$%Qo>xv(p06>gB!_U|?l zpe3}Ib1mO%nsu5PQeA6mJ#rZfZdR&m+5mkNmuXQaHah^=)$STjTMLah+O+X{Mc;_O zlvCHWEd2;dAw4bEF71#V(PH8w=O3E1J zm|39VkZ(ZhWdP8tw7u;x8%MNH7xc*aNDj7y-d2#2Hnn~2RAFLD9jMo7^2yEbV^97p z7})U+yNQRQzk4Us8kC3In_hp>SF{)ZjI6VnrTwX#30+-}zQDjYV7YEeS*1SHagX7s z9AhhsQd@Er4SDLBZjVt@pb0;3mQ8;gX4cTHUixiy*kJDvisiF*R=#H+SEJiQInmX@ zPrzcAxdH~@PER5QJhZ8HUB0?oOZ&2?_MUkAOTD5Box7 zJA0WM;Q#A0AW?7gjU-_hBRy#7tdToyl-Z@gWlajGH=q(QcC%4KyQ%gGU0f9AoV)(A zm%9hfGuR)#AqFswiJTl*Br>>UfLqPFjOq0~5GZ?r-y6tONXww&Osdgj4NDao^PU=8 zcvSwfxwF2Z-EFFm`NqUzv6<{lk6+$0pcu*S-S7m)52j(*3!4lt3R-DNy$L zY7*;ho#X)9Tj7K=ic+`uNl`{W$L^`eSZ}9N8{ZTbgIPt(SX4torq9#zO8_%-HigQb z(F0hym#Yx^>QS%9_95O=A~LPWy>_JuTO0#75t~6sL4v)ApM4~}U=v#; zEZF&NQ=k&t!g4X%MxhMb%TSjrF-fx+QCH4ZV{-hs3fkw3+8-J%@`VphzOrW-9gEu@KgEP^9e)|3n@b)(m*z7h@&L6hR^*f7|#kmZ_T3yW} zimY?oEMxHWxtyVIhGCPm@NNRK!Rz$uWZ^6juQqgZo}REzbX;ONV$>HuwR+E^7p8E( zS%K%*FOSE*f(-35lvPHJe8PcEGG|C)#ZjEd{7JP12QbpQGMQ(6qVHx!Z;}13G3=*M zP@Qm5B`=++$PZA4J0^|G!T@63yT8_ZgJyr#+;Av{b#xcaE0txsqR2a{2}pRbZ(PW_ z5g0iv?zQ2@)|X^cm)0UXp!5ALsU<99bC*(C!|cZ_?p#rZr3`3eLf@0^AVtl5)n)pJ zqKgb}?EC4VwHYtulAPHxqmXCI_|V=aDdpO8!L3H-)T)fRayV}}s-cjEiq>@fM1EUG zQ6ugREHJqq{h%!S@qw97H@EQGUc|eU6Srpxo|%EWP1(DQGj;W)tIW4`M3g-#{yWy! zBQhc@L*tHxCEMiu4e%v77c9?u{{2RkeL;eBVZ+WwQ0Muu2KZ$UpoR9Hu!?WX4=IwL z!?wjzlDpp?3|PT`)OkwLdRr}OU+ z4ALN%63_<>q8DJ{8hMmTDPlx`@W)Bs;d}JqG>_74#^TU^uu4vkvm>%ng7U`c^tP=1 zBD{8s0n1qgweK_%V9vTU^W@v+?d8bh-R`JcjC&X#K4W0wQn4^ZXMG69q~MglRLhg zj)x-2!KeYgp23q&&fTB>#aZ`9qfRYaYV=bNfbOQsVRc^Ame+N`9idjH#C38WHd`}U zCDA&kA9>4Vy7A3%&7e{D%yoaUzPNfG!nN7cDkEpP)Oc=xJj%M+jn`bV_kAh~bDDy( zSbK1&c>Yknb@Zt?vht+mgze)45^yp1(yLTf6prJ#LQDCQ=b+eq4i;wq6NJEU-BauU zc6Nek!K0cVZ%%ER=bOk6OLoOf%K=#S)iFHC&Vff_1?M>m?3kv6(dBmyW8ZkYg5MCd zhC}D^YVYe2s&bLck1N-Y@V&5Z>ZlxeCdJXQFxw z&JVmpG|8(B5cJ7$2s2^g;|;^n7C%7pl70HsjX&8YK&&@Y;E1oRnDVMJmuwocEh~Ud zd%owQtg0XO@VKkT7Yn^&+L)PbzNqM!nzPbPH>HjAochyLYkbt2DACH>86=w6JQz3} z5xMYu!D3t`tACeht{S?3 zBjGlqAy=a%t#33@Yh+`}%~eWo8BWM#IDW@GAoTskR0l0B_pqWFZ8wP|jf(fVA;iyn zqyald=%31hV2d!Br_j-;E|Jwl5{CQ zurU8{RSG4US6NT`K3FZBjowzT?{qs!)m|I`izHhLrN_;gCVrDuQBIlWp9|8c>3NxEAvb3Ezg z<8YS|HH(|wMuBJ&pZK-b#R%c+X*nk$_jw@I9|yZAOA!YD#NoK(c_qsh)5_LvcZa!q zlP}#i*SO|owl_0Hz)qt-TDXsMyM@pV-pkXo{v;_2kmAoo9U7JHB(>s4C7y_J-IFFM zQ9Mop;K0dpjUikR-3HtD+c|pnV^|Yqe>dWN@Fp#bP@Cv}%4UFO&P0D_Q1kVqvZKul z(&#t5?2ZOZ0k!j#6?61CKVb+jeKj>-L>D!t4?zGP^QVp(GjS$piAP6c#;!JLRWR8$ zP;6p#@+&DBmB>-Z+WabUwl!+VN1__ruLL@1nm134@2H0m-ucaEsl41$dEc+mMD~*!60VwAID`NF4kikvBoTs#(u{rtlSPH~KvlSa2EwCURcHJKGpIo$k+23~gay);>4fJy zO_tb%A+#qOH1iVV;<+Yv)Yb)_BP%D%+-!l2G7!y{e40{sESpcSb)~aBoXbLBVSHGP z+T8@TmS}Nt8?z3z(QeJD%9}6WT~_C`TBgn_GqG5|Li=?3cF?7Yhv!0ZC%3WP}Wm5c|oNnZh{N5k>|DEL#&SRjoM_%wpBgCK$}ECgC=s4 zx;h0qmzseYOG8xE*F`(`Vm-~R4DR|>Nu+wX&QiTBZ}TBH!ev%({N(F&3!4Gb?b+_q z&AAr*c=Dar?yk{&dqN07+M(K&-lvDWVDJlhcJHeBPk5fE?M`?Op6z=Nj=ODl2z}RYLUC~^_p_=rf>vIKnnb61 zP92>e9nx?5mbX5EWV}KKxM#+cNo*#Y&lp#{V1^+@mNw35nbaj@!I?NaXbGr7m%m)Z z$2@J-bFB)pg`l`it6PH1Z8Ky9jQI}9Mts-`2~&60O^;FGcS2y;i&CYJ?QEmcM4;)A=9a0SNA`a5ihO9E#mMKVwZMa~dz#{t)21)Z}i8=YL2 z7UW_NK)(uPw$O2ud(T!dZO1DyPSs#l>6KSl&&`$*pIv7tfMOfYL~>rQ`6@S?bS=rv zbVRyhlOd)h40|Pdm(EWIf9&g^Jm)moIBV7^tw>1@Egs5U@b1ruxu3jWm<6*3=i2Wl zlhUU~#_e%eFW>DsJW>DtX!2|iOz$j16@R*h-ZBx{D?_@6NP`Wz}{@$K_%*f`%>iOM( zh=TJ3T*L*TwYW0?Zs>A^xRkjq?iyhW@;jE<6^1PCSxR}%)n}aXS97uFHy=7L4LyLsU-jtDmtzhkK9Px4PS0K*v#G!}!n?&$7`L16jqkm#Qy z*zbOB07iiyjz17d{{KtaGd!k)@cpI82>dhdZf`Ft>#wML!+R`FuqVP1?Se(vxgxRH z-+cZ*`F~99DV_eM^hfI-%@bD;7^ElSw;0!-V&B_)D(t^heo*!zN&d%|`s-uCbP z3rq*;07k%Z$o1^zu!Ah(dY#vES|g70U5`9hFbjRp=<@cqrdQ43eR)U^pshRHMIh9C#mJ30M!2KVH4HoD#Y7s8uiiV2> z%B?4hs@|EE+BQZV?eV&2QGpta)9NuR8Lwu3*-cOxk(jKnEfu3`{Iazf4^~R0Cw^bu?H@8)BL+x#6)Siy31PPt<|qu04izAwM&PbRv!Pw!i}M+4wz*%f?USk^(oc8AR0?j zOht*ToN0y5vFQeK&)?xiDH=-AZxbO$w)KpjLT*Yv=+@I@8}3&DNy%4m^s#w$6UM9t zhOE|~4-IIaRE4#}KQ~kivvpbZKmR~pzL0GR{+QkfS~##;tTY9)ox0vaM^81mgw>YS zTHD9q{0pPrrj=b&TarruXeNnz^iVs6e8nO^Xnsbu8sgW&#y3&Yd9T?uX@V5`K(V{o zZqx6LgXJ~hg(tZO+=tWY@b^(l?Xc4L5aU$$>gEn-+C%corGWPgk#`WU5+bcts)Xj$ zgu?P(x~!%@b1zFf`p!p*!^-i#WW4vp>&mT9 z^jGzxBRk+nt<3i&4g_8Ud;xn`q8AkBv?SHrSM*=FZDn~(XghW9;t1-k@k zVNE+HcO-CVKLaK2WMA|pq;t*@>B@VjzDnH?doYet^l9R4UyT%fBQQrlm(W^Xa+Nr? zp3{Wocr4W3FRML-KqV^Hi~EyET3WATiJ~pRJkR{jRR|oRn`t(y8)8lGA~+0cG(`v` zy#8Hwk`qMc5k@4+J%>Mf;2>B+_Pqu6&dmGs;T`pX<#>aShNo4SAWI)kL|aJ;wI3su zY8{h}3F>hWks!6H78%}lRmu?sTWDO>znw_cqwtQ*Yn#@sC1p8K3~hCLEW24HSR}{y zxr?1-dMj)6ZAKW1@2Y~Qd6FMn=5i(bUbOKSPwB9_+-eQdTB+?zAsyCh2Z}ZHKRbr* z*Bk16BirZfEp4&?aej7)Bg8?>C{^JG51`zkqJZnT)2dhQmfA-;w36Tz&MlJ$<@Kua zY>H3YelvEl?DdHZ`B)4~>=m_bngRBSoCj@i;>G#J^WH#g?x}D%C}2)cC!@qMfa}oc zKIap5`k2s-7)NRNSEIZ>Xue_&dcaosNh)&!PI&{RXQ(`6J&g@i$BY$*krOg`H}Z5% zok#C1nj~D^@HWJyDsvl|#OtwJJESM^z!ii8v_;+@CX}gE|E1+db(ydv{9Sl;SLa2MBk*obzEhu_ z`X(Xd607B0^;zcvHg>&AZ+3ItX|jC!q4Y}_US*!J(ESQ07s?N}CVMs%f9S&qHbw^e~~RK$a$r9NQU z?$p=Kcik_J#-JC9rroLw?Blk1BNJY8C&ZfF*S4D=aWvQry*9f8?&gAI9OfY&s7?)F zT=QRWc{+qxp)uh~$;I=c#e_wDphlA58>k9r z+MWciRAvRUQZI2k_p38J$bk}^S}s^ho@n8&UerQ!M5ff)$Yg7wu{HaqAzkYltGA`w zW)lP7Jflt(d;hI^MoOfxR0W||%!NBK%jQQDvLE;S)^dEPviv@L*0Z=r zyB;W>2pXquNhx=A_`hrXc7C}b4EHiv90yjiate9q+Qy624db@&iKv$?fWf1KI(i;` zwD!r1-!9Urk|;{ouL{+Ji?vm9xh;l%dUJ*j0)a1Ot}Xhp4@f1yDePeNI)8L){4{v# zv9Xnx$z=f{%5zq5Y&u?N_E1XMMZXa-0Xo5&%5^r0$#MSYgay;Z1>{ud1%3lFvPqy17}#@)V+>$?LMP(E!)y z1N9d-RcZ5ys!iYXn-x|}{46=T%#i2P+ZcUe=o4DK1RA))nG~y0bK$iDWpf5L{sk;? zsy)YMc5>SK%Z@~2vEqTY3}_Q2*X9cytcjyd4hB9>PY$$NPnn&lZrnVWC9|liU-QMs z!gyw48z7&&+?aLI{qIkHCO*M2c^4iP2qn*$odpH8k4TSngzPsC-YHOiqhoYS%jsc+ z#&a-aZbZG8(R0UG$yvi%yh=kZLi6>2QY9sb;~<&|9B>P18W1jBz=6HAfwo137e@rC zz<_mCo|&y0rS=MP^SY~GeFj3%FjIKx>{Y-g=i5wS>WY#aYuC!bZsLj;?M6$Lm8>^!M<|-GrS=O1KiDd$TWPG zIqu>>2v3oe1h*sLg2)Ga^BoBf1Ucw+)M4CL`||MI8cLJDLakSCY<(Mj4vR z(AEejTEyEk#1p`X8cxu8YIH8=1xyO5(2`6q7lBaU?+o>QIa;%FSR<_%7kz?*@=I^%|tOyE#GDiBIO}ZL=t0ViJ|3o?r$_= zL&F^xm|Qm$LG{FVQ30qlV|@1Q5aLPh&CVMk)4pO(zUm6$gRpQjrYI}(P<3-<8FSzc zBxoeXkdW+~kCHn;hbTxLbQ2c!{d)sfN$}YZG-XXP(dIINDh8o$6VB}q$Aof=m)-8GI9#8?#O&w<;#B6Uh!KWRF^M&B2>* zQyd323G9W*+!yq=I}%%+A}ediWce_kTD;%9j!}COPZ!xyl+0V0z&(5$!zG0u!w2dn zm3Bsd9K9XWm7F0KQ9XJqW1d8`xM}n}*;z3qlsUB;Xd_*%{cR(uV$k)vQkuyaah5ag z!I&_DIpwB>5pFZ7UN<#}IbC@;={)7m*`&mCBWVpNqKksm5(nNV*+)7uV`KsUVl3lT zO~zE0_p~Z=<`g7zhAVOoooR6^bEzwH@k{s%WX4LZ$2~TH&~W-Mc!8DqP3RrYPNuVY__5e8Y3 zWM^hVMM&MOS%&OOWv;nJKlgcl_xy3*@A^a!5!BVFw@p2>+Cw`u$`JM*$A<>u4H6Wp1G0jysRiAWf8~9dZW;95~4H zZ%}3jWs-q7y551KF$hmrB*xLr747MQfVtX(5cg5L#SbRDt7{U>Wf!R94 zF_@ox(0=~DDTdO?J*9oEe>9Kl!(8Af*iSLwezEUuh6?wd$`1-7lJtLkxqm4$9f!bO z+)zIM*XnzFzts;4!-@+6$LzemGyJE3!2Ybe0}Kh?y|laNKd&qMA9?o%e^3EToJP)W z7z`Zs)A3)M^`p-){JB}XBu41}+N|BVJv%{tH#gKBM^_jI?uzz7W8f}ukThfa8UMl| zRyu%*_2kvE%%+E|TvC=DWm(O^$3*lD_%gFw!}%1Q-gQKewctQk!qVQB=XS;l=nyPB z6-2ud<E*=}}%{3r7 zDSfI01B$GhtXB9F2)#syDy)njv}8EPl$eh%#t;V!;EPc%e!Sq3MkU&e;Jd`KcO-u< z(g_3XW4mnJH>vcw>mt@qO+@UdNWL=@FGZung4pUXExm=FDOMD@Dr8299r`ZB@A2Gl zGIF3T(&EX&hvyFu7j)Iv*p9ZvzSJsxTH8W_WStF=#Y>{6h@sE|GrS*lVx(M{9-y|N z`eK&7=^iC=a~`vbQnXGd2tK2=(6Z)NwtGCrmSA~cYk%gL)erZX>r8DNxADC1z3rF^ zLB1=xH9!=Xc?c-5U8^JGilLx*_Wfh7-XBA8-x5b3WCnU$TR@sxZ66#(Tso*k+mC>8d^!}#KI+@42IZTHSHgI21uP|u2V7HS10N~2Imy9GR&xNv_|v;Ym&+`A

A{GULzU3k?VJS7wD0~Z#F4&RqYDALNy=F zgiF0gBNo6aAEQKsHb-NXuXz{UEAaE0^k1c1@XkOAZMCK1q7tU^HE#RP5J=b7W=aQs z@tfOFP+M*_Ha~Lu6=vQtx8YiSn&RiDjXtWB!L4qk3GL-=6)Ji8!s-Hc>)yEmEuD1r zCFJ?DB})_}{>zFwSbegKdQ*72am>_ed%4wZP90aTD)Vf9R+!jWyZp+!v2U)~dXuF? zeKB*vK%V^;Q#7I~ugMMD9-2XS7!YB-{z$yA-o{3{u&LF(?4idNh*d!8GRt7p{pK&7 zu|vv&Y=qCK!d%Jt&j8qvJIW zGJkHm2iL3q_3e6%mU`6jV0ZwZkXJ`}8qnC^$l%UNdT^uV5sHru=G5^-tPUs)7jvFD zyGXBw^EqBSAnjL(#2FR6XZI`OS}spmD-`M(n@30MR}L&v?XS)>^hMQ(rZ1Ly7g}0T zV$iSe$ldamJG;ag)H)}+={wzhmc2Yw=|rrsKrI=1u{^jcVwC@heZJDQkuaDbD8-t>{|d7Bra}XCxOnt%pld%XjT5VucX&6WL92 zZdNIn3KrbBrT2yq7MV>E&96zY*T1j^O`aVRKgz9FfxWEYd*KbA+3-yTCAPjyKTLtj zbccpxx>1HfK&}-N;W0lGEpn* zI?G$Yc6}PiL%dbxWY$nuM?{qt8wC=f@a`K!bfMMaJnl266JOOevUSmQb*hL145hQ`NjpU1{;G)EF@xvEn6}1&`S>#-} ziBD_BXoX$YTBme)S6f9LSJjJO$4P^8^cLl3zvkt}^Ikj?PMJHc7^-u?E)P)?e>Z(5 z!vyG1%E2EWc+D}}uyP?hg(fXE!{!P2ctl!d_x0(;{ufQj2tv VC!^9HH0#z64N%v@nVA8qe*@7dV!;3a literal 0 HcmV?d00001 diff --git a/en/bilder/gif/img2040_en.gif b/en/bilder/gif/img2040_en.gif new file mode 100644 index 0000000000000000000000000000000000000000..5581b59c810965e7cfced50cc789a2c4bd6363ac GIT binary patch literal 2940 zcmZuvc{o&U8$T_Uyp>9*k$BsLD2_2IX+@2tvL@>&rx3E1EsDw#lO!F6Y-8+$v5qA| zkwex}W9ik~5F+zd;-&LF$9G-dU*B_GXRf)Q`@Vno@AtbO{WE%66j}o$wqg!~a2$ug z@Bcm!;~>O&Jf54ITLrlP?^gj1_zMCUf)EHoAqXS-Km@}Oj6g67!59SNL=u4^1c49~ zLNExyiCPqfPy|9z2*n^2Ct5KW!Vm~UAq;~sVkCsa5RO1N3gH-_MF11f01GsOYMhuu z95A2(hA|k%iLnT{Kwt!g5e!Cff&~i0C<3D>jAAf~6Qn>bhQJsKV;GF#fFo#yaRkOu z7{_27Oa-g~7$6N;0$Lyk1_NvW4X{8nP6#4ma8Lxn5CkXmfw3S$Q3S;h6er{Y79feC z2!gFX_+*!lVu(R@G>-b4q!{bJfKMcL45E6AczA&p%7#QK_u`> z|Nkw>fIO(;0E0oFKp^1r`3(&X91h3G$cRKD?E}34Ol$=tibE?zx9vR;+88D(p=8rq zOoQ%h*hyuaF3D(#-U7P}R&}SpqRStQ+IFTit1W)x@jRQz4b1k$1DE`4o(dcq!zos; z2irIb)O!a{u5@tjVs&SpR#+)ZjdwO+>56C?Qp;W5FfVwXsN4EIx1a4`pqj8?Mmtw@ zuI`>~`&&l~j9)_(w)3(P@`meU-^z!%$C=Xt z7M3V9eNxYuOvGj93+Wf-exK^PwX!I2G@42i-T7d<7v)pTm+FX556Ca8cGA^A2YBl>)w&^7V3y8_Gqc(=K+8 z9&m-S*#^^BoKv&119q3JQ_bI7>g4rh%0`IP{v}^DYJP9zQ%zU-lyTXpJr&wJ#8l81 zwDuY&#-bR+Yh^x1@^e^_x!jr&*PrJ>pt`8l)LN4tWgseM)kiL zhuO)DO$&op*H8+04F*4zp4C)x|4@G(qAsIW8GYPYy>X~$3T;(o343Gd0fw+Otj{Wp z(mElX-aPA7!*QNhy_TOQ#LJni)U&)X{AOE^lTY|g`x|A2#}#DCDqeX8|LC!^jQUZ% z_Yct@T~|Vmlz%W^rK$1W%AWM|g9FE{a=^eo&o|Y34iBab8Bykbwt4=uR5{|Su>GcI z*bPP*-Sy)QRA0mPCmT~mo>@l`S{nu&N>|2Zf(2bt=ZO)_b@7R(*rL`!`k;Ai@ifLa8 z&qFm^S{6li6~{$8B}+Uh*&|sjvfViZk4{@%{)rXZC>Hjx_oFbcf48v3nsCTP?&j&7 z1CHo{yHL1|kZf~t1ud2)qLJ2EK;ABu{_W2G@N`jpX0HCvO==-Z+K!v<=A4@EV@Dp` zC$sssE0G&zN0B!=V8cxb&bpp~E!4E^iSQHUt2g>Q%pmnNh^DV8 zeRyfT&spZ*IVWE*M$YxC_kg1P=E2yIMKl^MlRoke?-j+N}Ieby$cCL}f z#ynbD(A(Hzt6c(G`$b!Buhh|I<2}ZlCr>Z$6o;$vS5_oAj=y%NP~Dfa@=|6=jK7iI zk7%|~REdqq?y)0AySg~xImvzk$9x}u?3!^|<|d=Pr=!<&#ohWIy@%|0#*}IjURsu@ z9PDgJQ!)*VD$CY1+HLHeS1>uR5qNAV_gom&Y+rqD&S}{^lla$tlWN{9e`N);BLTg+ zq;jTdu##Ch*R*J~FP|)wZ`hJo<1|5k#$Umj3W~5`OIt1w#I&t1RN_W!SIqKc>LzS;}~BvJVdK4Yq*aeWfiiHQe=2najGAUJj$}(*gjCHw7I;Tym?)@G;=0x zQ@-y~f&KYDJs~?zSW^E!WubiCb8+R`;gaocan=I|{_?(bHt3z7zO-Gu9fdhY_VBm8 zVqvRpS-9kNVPZ?tP|mHs%4Q+^m6qlm)%?mDr3AL(Q0rUEpX`hw)4|4L2JgHN{fdo9 zppk{97+r^|>f@Ib?!NP3WA4{qka)6Zom^?TNpESfgJY{yb{mWpKS|!=r|dm$(1q*$ zve)9U@8^?Ddhh&-U*A6)W4$eZZG2TD9Am1uX6iK_8rk|$!pq*DVKeQl(Qu@~C2}j) z^F6k&U0%prza_{}U7{CjJjL1HUu!U|@&oTMih&tpjM}m8`A)A+IQ9N(#O9}eREPyX zphfDce)U-Esb86?b zXZ(59!{0k8^=QEKuOGZ%+|ItCoAON{X%i%Z+r20pboZbPUj8bZZKwS8nuFz&*QJ^Y z6>f_=)bmXH+060`vBinRl%!AAw3j!pyH?M}j**z0`r=H)S`bsG{kdqJZ%Oh}WAe^} zf2+$Kd}Ho=S#f5eRAa=v8(u4j78iY{a<)4mX1$A}a!~A}>4~P6I$y6>JWU7jnt@k3 Wb}GqBQ&-Q{e0bOC*S2~!bof8bkG;_V literal 0 HcmV?d00001 diff --git a/en/bilder/gif/img2041.gif b/en/bilder/gif/img2041.gif new file mode 100644 index 0000000000000000000000000000000000000000..aea3207824bd4a5a8cee1590b4841e53c752b77f GIT binary patch literal 5497 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 c%_nBxb@5D_txd89&#~vuaps<1#6S^QJlmJo! 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 ST<32A54->DxpN0Y^#1_5g`%SX literal 0 HcmV?d00001 diff --git a/en/bilder/gif/img2042_en.gif b/en/bilder/gif/img2042_en.gif new file mode 100644 index 0000000000000000000000000000000000000000..9ea76cf38d3b6bc1c0c8cad5cf6658d246b15c0d GIT binary patch literal 8726 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 literal 0 HcmV?d00001 diff --git a/en/bilder/gif/img2044_en.gif b/en/bilder/gif/img2044_en.gif new file mode 100644 index 0000000000000000000000000000000000000000..f9be680c89b23ad18b1822e9358f62e99792d35e GIT binary patch literal 3260 zcmZuwc{o)28$WeRqHd8}QdH_rS#smpuA*zX)@UJ1wnB$wtZA}kzh%vG$2gd5Wvp4o zJ`~x)L87Fw6d4(7vWN5gj^FeA{`!5N=gc$jdEfW*emk6%}s%wXF?Wh9Dfr zA@KXZ2gEoCaVC>VBofQP`~N=W;DEm%fFTHhAQXZyP9KP17=jT9Mj;r3V4RagUF;244fdB6`q6LbSRfPO#%COW(3?yO$JN7+>XbZdjXz_UYtdTryq$8+wk<`6 zp4E}8c!UcoqMzH`@j(T_aDt*{4nUmk@q zxSmE<6pw`l!{dHa=iD{BDC!X+Q892=5tpiMFXk=A3d+)PhdZC7BEN3P){l4OsN;KYFl^gCFY@CpRN>-FOizH^1@+bUfKIYPDdx2-x&;h zEEuIh2u*hpnm;sZ)BPnoGkW)T!Q_7rzk8HQ-t&_3EI~3ME6v~Hq4C#5d6|_H_pfHO z9!XNrX~EX6*;(@{P-wd6NP`$#q2-fyYiYT{x~ zsV8)4RM@~fKBHCI@s9JoP;qwlvjj(WPIgwfXlPP7o1M<8#lFQ{Zy-^#CE zV&6>__FJ1QO8Ufu7Bv#uX~i*OlTIZVJ7kL9o1s7?zempBEp4~Vo32oFV;rsgY9Kxn zJ(Q3)qc=WNIm38e#(Sz}A&yW;S!6NOE0)=lE;<`oOS5&!^T|^6+*(S{yoP?Ca!smn ze#2@IXsNnUq-dP)7L@l~;yKCbpFJf>2V4ej*A?BmFoO1`YY(;OCHa=rizjP~l7Clo zD8|~oodnIC*(uh|Dp{4n)wzU%g?E?mqs5Us9Q!gm(sY$&+AjE$oQnSO{At^%;USqG zVJ1;7`XP8EVx~`shg$y8fkLG8@RC@bVXDI|C4N4~a7l$cvWl`)pcCV8X}E8N$^5Vk zb=rd-d2*`q^KH$|*{`1J#MQBT68(#;6c_61=d{U)s__`g)7goDyDyY#^GWNglSQN< zrHRs4M}Gd@y+-vZE{{OhX4x|@iUtMb28aWVeM0L^4G~iEF%b%{CVsRqqJ7&)u#2*G zbA_Pt#5Iz?NBlRf<)!6lnuR z2W9<(N8Pp&7l)m_sil<(b!UjDmG_?dynXy@Ik&+n-`3#a@$k%JyIvD@Z~eHrzH}Pp zxiRMeStMU(E0opbT=A7$kL0%3%8@mje%KSyzZdsbFfkgoOCFD^3U(pL%pM(Vy+_bX+R zr-UzlYt~J8t8-?3Y#|}1+1&UVxpH(!l=?vT^Nt?(PHY4wwUQ+XGs)g}QMpm>W+&FW zIPH{}5fQPA4bP)eOk__J+`J^!tmtUN`b~+8@9?HGS^U1M3n!KFRdKHjIB5r&th%vV zm%TV~b?%vsTCtq!=EODc2Lht~YT2FI1gG>+^=$2Jz4b9XM#-zcOq{8xx^~CrnwzS7 z>>9tosl?5^C)oMJ)xzDZ*^#G{cgT>mP1){p)nVNlX<0o(^)bUcpER5Z ziS0?l-)3sWPDo>^zBIf86oOxgD999r{!O^TRsUhF-J?%$Ex@pdz zy|v|J)c4usUud{-jf{Z3)y605(51d%)YH#=?@1j6FGFpi-~19hzjApjn>J*XWdxAL zt}uJAr!SRcS^8Pp`z))J81x3%gb;77uDg5r8?ge6SpkdP04E-lhXB~Fg+ZXixO+|5$0j5 z@6EB8HSHncXIQU`&($xaZUUj)n+4K4j#wp?2x!oU`c- z*9+6JvR+?|kOz$t6ZYZeQ;i!*q&KyzZtAhVhxz_MTcfU)xTNpN7D`@dHhM81Jh}2! za=fwCaLN7Of_!7i2rtZ>!0JkDX2~;F@eWrNUUb|CanLF5?6i=q2gxT93og?(clR^oJZe$~HJwkJ_1$e2^Wep9b;~&p%hJ7slI#kc;O zNGfeHO6hmPz?<6-3xgEye&R7PXSU-9Xm6ado5DtA5_xlXFe z_}4zygjNOG&CLG7Ol(o`Ppjb?a;lY59M2e#?d_;_Z8^8WIOmfVNwb=H(RV%tVy#Ij z7!X6f)}QXht7Xn>>jmmD8x5uvg#J`duAghZY?l z>U~~b?VQhNULGSWufBpSJ>&TN25)OszU7teAx#P=xHVa~_C&0pl8j2z0^dRlT5Z%g7YWCDDn$o(~KbjIYa9;!-{!{GN^l^+yAB#r<0a{p2m zl7Jz6arof>YxTXo-s%TMV6_v5AgsJT2JursZhh9(0fB_fTH00gpVx)_N8Yu;A5?(Q z4toraKtSMsI{s_3e)I)~KR0WYBnbUqo3%Q(X1Ci0hr@fJuy6tb>mTe-K=>jQGz8l( z_!l;b@Bu&(5cI*_XAvSh)y}$u^D<+ihKz&(4J=tGT``qqg5SyeuyTEu}Tn zPgG~?B}47`N6w#z>6M|`8v5XG ztjdpFZRy|%?D08n|G@GrvocRg`Z zob0geVNz~{MdfZ8oUnyUUzkMOMfnJY4dwmOO1CO{qWn-C#VC9RR5DKe>H_={r0b8t zgz``saC|PeTj7R&%>gh>aucoKz3J#n5od<%kX98Po3 z;UUt!Zc)3_kre8PuPI|}gk(b&<=rM2x$v@r#L{`$mtHpV?zk_Dj^1?qls_wnYyPd8gnKPvH;HTfW*c;%_85@pW4dwMV1JOm*;q%Hk_Dysd6O2-zaz>7uTaTijFY~&d+y& zEb%nAVY>=+tYhar?h_#ebh+2xs*-EAOw7N2w_wDqspm6vI^NGhNW4diIQ+n6v?2C7 zKNe&-9|~3{1k&!j3V9((`dT^#aG7KUe?aozP7Tb#SV*oMh&UG59{;9s)HCbJd$rGJ zKKIL1XHz!^zAU}dOYkawo@E!(ezrRj(0xG2dKwd_<37@o@)X{P^&SRivX^BJ{W*mT zla}NPndd#5@4z9&mE3??3&x+!>DNx{C<;@%jDnqE7@aRJANYEsOo#n9k(xjdyY)c% zUcG$*cGo-#N3QGkX|lsWlDm?i2-Z==1e6rff3K>$iVsHEYx7PH$EIUAwo{OqZA~Rm~}%c(#RDHh6Mgr4m{#X&)OO zKT!A$di2|;!pNXHIBAE9j-7>lX#WxUE_v@4`W7!!0x$La&QGh}GY7j|mg26#%Pq9R zJ0^>drz#vgrRzZPiM$DvQ?rWFmKrIEeex)A-_b_vB*S)Mt0Y_`L6o6-zBIKL#6Ga? zNbTw68LSaTn!~I-&X{d8=56*E4{Ln3kht?;BEbtBKE{8L$MwZE7szj$8hd`^P;7Ra zS^hEa=dX=b3FL6#ece4`4jkwC97bLKF=d(q^g_yw@l2kPmPN~z$PVj02UV@iLri-w z#^f-qRC_;EK0f1kgQ)4c*ZJ$stL#cW*ijyEmEi&LB^dUfGhHdHZRyo0rqzdr?MRBXY`7h5B)+kF?~vJdiXRdlX-9_*58KGH`hh3hUMZS(0c7V z7Gbr95bFf`+c(Jxy^Hsi0|3-f`6u>qm zZQzY1J#?%@VtV}A7@ZSxAt-qhPMkoZJ1B~cI7 zUMqxLxe#fR-=JHp7^?26eoh0V?wfUD^Ki7CMt23<7riTX&W%lNd2sb&@i=R*p_Zhb zTzN&2YuDK4pd&{cWPNULmsj}3iG^S-Nqr>ihqB1pH2TYe;A~wVs7cG zow~T0bM|Cwi}o#Y>P*N{BmLGFg;pN!kDG>$0GR~{$an@kxIR96o~^d^kFCHyrnStn z55A9_!D&L-zlrHod^dNQW!{6x$V_o;kROtcY0}@6(J+^CAW`|W$NSJvH8BO)~o^H U=RsMM&9i?JzYJ~`6#?k~4L`Fc_y7O^ literal 0 HcmV?d00001 diff --git a/en/bilder/gif/img2045_en.gif b/en/bilder/gif/img2045_en.gif new file mode 100644 index 0000000000000000000000000000000000000000..7e70f60bd32831608907d799e1f5159f46e9322b GIT binary patch literal 2891 zcmZuzc{Ejf8{VbJb(4r|N7?qy#MdR1P6Qt0SrM11fdXw5q%(nVF*Sb7=>UAf^i~=zz~8! z2nrz>gy2Li3PUIYp(uo65Q-D67z|+ugrN|IK^QR-!eIzUARL8o4A3Hg321-?nn5*A z%pndKPzS>p4CBOD1iV0C1cea{MsR`!3d1M@qbQ7GFp3kTKrM#A7z$$;jNyPIXoYbE z#!(o@U>r;ZtN|Dx4OjwNAO{8mYyb_gKr>DVB4Th*1i=slC-i}_AVN_D#Sj!Hc3W}>2^il7%Fehbhp9NM-^+=!9+E@GE} zyh9@+t3H}f+9chm@a2a%VVE@3SeV_AAgLcKZd~-LDM{9f=Fn7>(~@$4qcPpMn8Hfa z@|hlLDyFt&oQ(Koze&mK4zdsjbgtR=O&8@{hRGunKUz1# z^O5GKxxR7_1>3t~S@Tzaw+ z_b0S%4o1yoQ6<7=)Qv2|#qSGc26|*QX2yu`wGoTt4`0pl6>5!ki6%$&j)ijd%Z}ev zJ)Ju2rhNF#xT)&JfLFIPc`u+bmIfkyNz&$#6NwJ~F&)qLlH9K)e^57Kr@Dr7AHHW; zI>k=A`B82%-IrG|JtdIcH2&iD%G6}golUtfnPPdy(pe7<(`+(hHKt{KAL_|ZW#31% zr*dL#Or$93QZ)C}7xxDysTr{(lH)5fjh6Bzf0~q-SA)ybg9=+oGcKhgGzEw9xoNs- zb>|AZ;Qi?fE|0y1=wGwq{-O$8J$6LFlkv~+)9lhtdDB_fgpMdr=6kQTyth5!mGrWS zM4qe8nbpEwNppwKlMELsgxuX~kMHuV8R?|jRbOX`W!Ei_*n8exm&j#%S02JBv70Iw zgK^@v>(GsV5r=}LlRCfVz8hMcnJ?R*rM|3GlDgwmuh3%a-OM@G;Drfsr1Mu8&8E#^ zhwJaCu-bpN6t(~M(=V%SWq*wC{i=IklZubo8agKo>u$w zoZ$xCv!7fo?P`^lzS3jZFss<6N8K&Zs-5hqamORoDs($oBvxwSqhEXncTuD2vppvOGBUvut zS5nt%zUEJ%Ue-3R%owcvrpegv5v#+RjI!6wb`x{Y0EKw1wTf9UQAyfpgeoI+Z=JS z7auixul}u(dPjch@})*L-<%plH!S!<4_~h|OFiCGvdU?qEV|~F;5QG3fcQE|Mm461 ze3&_|e_Ld4lxfk(e$-ER z&Z6_-c-Q_bY9f02BZ~2?w7z%C4KEWP@g*r=wcWHaZXp%!jVCESm7___40e9uwUwxtI?aX%toZi|vL z^ipm2j`W~vB%p^53?ya#v*W-=Ew^`rYH2?VlJdczBoG3<809NdbNsX>x$-I+#@ncvbokgM}^-RpLg9RsM{BQ%GX=8XR^O@>W`)hEhkB@Y0MuwuDLcM``Dw`CB-Rj5qy&d5^$vLsX>77%#0m51kT&+}jLu~My3`DKB- zg75C)d)xT-ou9cieCf~Ritz~AsZH_r=PBRKn%-kt>DRO3 z^Xv?ENFl=B9~t>v?w6;`abWf0CfO>SgO?f-z)#+hkQ646uO9{vnQ<0KewE<8^{hL0W!MZeoc-QfeklNeRThJO*Y(sEtq&9R*}9APf225-Z>) zGK--)7bpjEsu0|%AjKeE67EHbX_?t2iAg!BB_#;`3aI)~RDn#Aft!RP1vXRAJ25x4 zC=p?pB&uN$X^<(Ra8saKKu*%Z6LM%KGYa~q=H?ew;d5wFqG&TFQdTgDga(ESM&cqw%FI zm^!$1vflamMJbtii6yCd#g)Y+skx~NI=~dp0LlyO97h-!Ib=LGEI8QAA*>bCA<%fZ zT|n7uN`-)9L$`!+)}0-KjgH+ihE6;)FD5%qQ1s<;nfXciB#WNsDwz{OkIyu6rW|`x z5u9*tntHs{AI>QWXM0&ZyY8&q^77IGXMlpM#+ z+86mks=uss+?K_9=B(*7>$T2t l|NQub!9X%fFMIQ*lyiR0)_lHE?~hzwA@3A-)zAGcgfixw3sBzufhb`@94*b+tdCCdzB%*YsHl(wsmDHqK+ZSBy;+%n%^R_7)&^1>xfi-LA87a0>jh zsIXmSS1^LWT|nMQun!!Hgm}WeePCcmxT_dA81aMrLye7H;t~W2bG!rgM8F)8Voo5) z4+!#aKR6rb$?uNeD*&t2!=qBj!qsR zB=Q$u?05ces2wHYpGv>A{;PS=&=CegIQ|kl`n%ZQ?H!dPKUKa{b|L}(<?nf;&< z2al@-rq6&HCaDMJE8w=vVP!x+KCu?dLmpPa7QEv?(OG|1i?UJfb9uq z+qnxoyeu|$USYk*xlcoR56RiKK7P;`c|gJ-Q?ER)86%|RKH6ITuq9sXa*VKkMSdGj z*0j*Jt>RG!;f!;8raq;hGeg~bZnTX;e3|oS=xz~%N>cYjJ)E3fdnLJ-X!6h?%Ya(g zUu1cZn^)`(^mU2tt`I(XulZ-?_6-GGK`DR{DvZ*e1w9PYp-8@#YdWq};!y7;!9C#4 zRA4*}+S6?lW2)sTYL9@@;-1RV8cj;;kDjPd>aCi zaytkbzM=NkkCVgFF7!*4V2*t~SL@rzJ(qlifufqPv!e^Y5=0~aP;JS>3`I*njFt*< zbM_s(HGMLSd2}Yju>0wNBZjAaMI76zpE8cU#-K~aoUicBix;FRi`ph|sS72C5B+83 zWE9aRmg25Y2H_pjqjQu0v?fVr+^9cwEai5WMqVnqT^F3Dlr6+a@f@(k=lTh_lZ?Yo z11BEDsCcTch2e@G@IxCZ?4VM2@?M*g(;ClIeBsfvFqWM#udQy=vI$=v)g1*WvoLRF~ z-cnY(>BCKYvNs2K=9-mO>`;z4qyKX=Qh!vMu)hnMZ7CEPi+^tZsmQrOrqQju6<~bz zoZ%$H?=-%rZgjCzZK${>J1B4db{g9_pz@|Bv6ASR*_^iAQ^)sF`Q}waDYrgji~Icj zCLj#8-&R-E!q- zUuV7*<;p($E(+>`u8CIL5@W>a#+{f*ve-I4nc~VgGL>#qPq)qS)k4llVBqUhiAe#P z9fdai>vKX4*YWd@m9EwFQK13%%xb2);0wm=3-{>H)NXBjej(bByx1z(;eYd`ny34+ z?hVCF(tsd-^J^|#JDEA^yF0*SJhBY3rv1Qk>(LyuZ)-idenDs>u%isOxvUnWef`_C zryEO^J(u-a@=qAwV>nl)KF9tU$*!{r&^_}VoFf7{QAP={BgHScdQ)`7U=unmunnt4zG9c5gT2 zs<1wPd{j-}*&A+#%fp8(1{+UpmByGKwm7U)(G1|{!`N4v3+@qoo`C(L0*Vz8>Yb@o zsrX{%I-w^##+$4m7Z=AtaRx3&wXA8B$1~rLU;Sg39%ZvU!5S$cu6?z29dIr&(%)tA z@ToQFs)0m!l)kl{LH;Ed%LCjvkRPLbPJ%Pa6@9s&TOV24#fVG3>I z#A)v|qL~4PkhciB9JcEP_P`RLd7g0^msSiq*9&YJ?NDl-egTOirw^E!C>!EBmmDb> zch{xWt0+b#vAFy1FA(pv`)T-8C*eNzIcSdStD$>L2`ja(iqmA)%f?Acj-!(+mF=!< zaA|CA_&M3u1L-CK=lXp1-Jh8km+O|+GA5;ImMUc5`7MA zK;R@s;?3@z#19+FT3%PzgQKR~hV}H|O?6AE2=(7ax9%|0A%Z!7-`rv)@ zIc)Zdl@diEe8f8G*eKP$S1lu7 zErMjZKk2VP6-9-AbmKa2o7{b?tf%5*EwW<(jmMY2&Qd^G%ME9%2$WK~hdhnt?fx1- zT{cuugtcLYrYclu)7V#5A0(|w!G9SwZ4TmQR7RB2Xq6wOKHjCaJ22u@seN{yaM1B# zN_{{5`WHdzevIg39MuMce|+~`taQ!3fhUo5kD;s&x8LnX+pr-$_*4K^T>|D$q`BcJ z_6_^>0-q*W_!sM7lwEn!U@Zy6XJP6;7O!PV0>Z_@aJ3>wl#ZrfRb}YOW6WBbWUEc5 zK81zPOoY({@Mb9U0Nk)l2KZ>r#Ysf+Ld)y!N~1<>--<4!R-GR>8^%E`c=L+<+?xAMI#%`88Eryi&`N30R{LyWfNIl;)6m4e zFtG5F#**J0Vy-(7^}GI9SZ+YzMRq;E_eqG}lWR)s!?K z4dql~{!w+Xuv$Tdf=TZcEBGj3eFG3yjf?kRGAd!rib`-Yxr}Ta_LabXRnc(CLCFb6m9VQC_4)$Z54F*pR zG3q0<{q4BR&Hn}mDX_aoMYLys+@Y}SjWZBMOxq9DP}XDkEMOaDP~V9vC10) z>jx7QH$BckOJ(u*nGo%@(S>@}EJkr_R<~i}<$C>>#`vw=q=wC6ZS4&yz0Eaf z{npCDg{`Ii>zhk~%ZtoFh5UfVmH-aAK07){H92UvC3^2*5O5;!z^Wm?dN9s3SU}cD zC^dMhGFX_`XMq{4IT0*A=r3s*@=7p7mUQJ0UVmbya6 z^iVg+P;tFbEmEMSdRYD+VJBq6fUD|yt-%KLu++YgI%b#&uYpl&u$g5zNiw{e5N@p( ze04Sam{5e%V6cm2gc#b;O)u;sJ;DYZE-(`g*YkH*kGxH zsUc|fsK>O(N|~qtQj}k7R4^+ls+@S?)uNYyi{M3)&u+ zwkPn$2+GEobKR*gFbDXUkWyoID%rms> zp$d=6mB=PKrcf_t_cUaSYSK9qOQFY94a9t0aVJ`0AFrO)dlo~ZV>1V_jMmtW;98KicNaUT6-kSo}8n=x0mg?&fQ;KwsM!Abv2?|8V&xt3EMfh4cC5a9}-cKP$ zr;z4g(N}ovI0@_XUQm+44LytSdT|oFa`{*T7nX#=A!L#dqhb%fR|KfSjb^pBraVvs z$;M;dAvoS!clp`T{k@4HQc?5Rm#n5Q)WnMT<71gkMCyH#fYsFJ#5+9?F zJAV|e+(3VZ+aa65CU^v literal 0 HcmV?d00001 diff --git a/en/bilder/gif/koords_en.gif b/en/bilder/gif/koords_en.gif new file mode 100644 index 0000000000000000000000000000000000000000..85a298f1e71866a2c195a6d56b083c5616ae739e GIT binary patch literal 3847 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 G^8WyhvX-X+ literal 0 HcmV?d00001 diff --git a/en/bilder/gif/linien.gif b/en/bilder/gif/linien.gif new file mode 100644 index 0000000000000000000000000000000000000000..333f6abe7bf82d46b8cdce463afee8df974cf07b GIT binary patch literal 959 zcmZ?wbh9u|3}sMe_|Cxa|NnmmAPL7n{(m6%|Lxnib8~aI0mUJB8xR1Q+mcd?7?`Ep zUHpS}LyA%}fm|I0m!i_-Y@j#;6SEk)pe|69QP(#!FD13OB&{?ryCgF|uedZfEio@$ zA+50prWs}$1EaE2W=U>hL0W!MZeoc-QfeklNeRThJO*Y(sEtq&9R*}9APf225-Z>) zGK--)7bpjEsu0|%AjKeE67EHbX_?t2iAg!BB_#;`3aI)~RDn#Aft!RP1vXRAJ25x4 zC=p?pB&uN$X^<(Ra8saKKu*%Z6LM%KGYa~q=H?ew;d5wFqG&TFQdTgDga(ESM&cqw%FI zm^!$1vflamMJbtii6yCd#g)Y+skx~NI=~dp0LlyO97`A&StL9*EI8QAA*>a1Vnd=M zgMh5p9FL7kP903TS$9rMR5;eJ;M^tSxoOGC$r{0{Voq*adV0D+@~JtVo0pxPZBhK{ z&dJTo&(C*g-o#Js?c`H^;vgcnP^{MFYD;n%k}xu ziKQv=Wu}=XYj17Ks}<_?-oEbc?uyT^?w;Ph{{H?3X6|Dg+cq4X&?fBdvS!CdrwNRV G4AuZBIZ^Kb literal 0 HcmV?d00001 diff --git a/en/bilder/gif/marker.gif b/en/bilder/gif/marker.gif new file mode 100644 index 0000000000000000000000000000000000000000..d184013ffc1621c95e47d988a3458bacac66e937 GIT binary patch literal 989 zcmZ?wbh9u|6k!Ns_|Cxa|NnmmAPL7n{(m6%|Lxnib8~aI0mUJB8xR1Q+mcd?7?`Ep zUHpS}LyA%}fm|I0m!i_-Y@j#;6SEk)pe|69QP(#!FD13OB&{?ryCgF|uedZfEio@$ zA+50prWs}$1EaE2W=U>hL0W!MZeoc-QfeklNeRThJO*Y(sEtq&9R*}9APf225-Z>) zGK--)7bpjEsu0|%AjKeE67EHbX_?t2iAg!BB_#;`3aI)~RDn#Aft!RP1vXRAJ25x4 zC=p?pB&uN$X^<(Ra8saKKu*%Z6LM%KGYa~q=H?ew;d5wFqG&TFQdTgDga(ESM&cqw%FI zm^!$1vflamMJbtii6yCd#g)Y+skx~NI=~dp0LlyO9ETVfIb=Kx7!EdbaI3|vn4sv~ z%qQ;D(^0VKFoT3~))^1MhNFE<_Dv!;C#twk77T2PIk{=+>FJv8W;~UJ4_v02*gmsa zDg4~APt%<1D`&_u$N83uLR(LMdFV4&HPLIX*H*2o3!Q`?sq75RKGPLn-&XrdG{<+d z-$gH-*+c?)5H0qt k;)}tZZZ%_e-HIP8PM=cN&3n3Pr~cDP3nEwXa4=W{03%IU#{d8T literal 0 HcmV?d00001 diff --git a/en/bilder/gif/meta_3.gif b/en/bilder/gif/meta_3.gif new file mode 100644 index 0000000000000000000000000000000000000000..875d8642945d0e93278ee16dc7c78f2191b73c90 GIT binary patch literal 6635 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 literal 0 HcmV?d00001 diff --git a/en/bilder/gif/muster.gif b/en/bilder/gif/muster.gif new file mode 100644 index 0000000000000000000000000000000000000000..173fd79b81ecd8e0dd202186fc8cbe81f15aaa33 GIT binary patch literal 12239 zcmaKS1yCH@)-Ev!8o>hu65QP_A-D&3LeN2jI|O%k5AN>nHZb_0GlLDzKyYVX&b#-V z`|e-${;t|xz1Lcw?5@>S-Md;!Mv{-$=*?4^r&lN_NF);F&-tJ6XO8?cMXs!@*x1-K z{fYl;H2pdLTsD0-bwGLcPD)%!m08Wf6!2%tL?Q0rY;5%>j`H*w!T$_0|A{_fRsh(V zm^wO{Ionz}0qkrYoo&pFY|Sam{2cxU|ILQ-gi;LPWMlNh%+A5a$cf^+Dd6uCr+?|$ zqCETXZ^eH{m?-{V$X|jul16U-Fg_#rZ@YhTe_4I|kJZ15|3VQ-IT)D%telL#TbnvL z{RdC+-}wKk`iqJ5AEy6G{a?;Eaz-|$4o3eWBmQr)f2IFo!T*Ql-;lp7G5s%h?td^p zd81%zW9Q)h|CRbz`oE?A4f#t7SHaZj&+@HJ|3g6X-(LSN_=|$@AGd!;|L<~H{ujUh z6#g5E^5m_uwVjibsl$I1|3_#2JO7v9e>&@L&|jwix6b;z?jJcaIXgQC6M(Ielc}wv zyQ7n-jVT4wpAJX)>sdg1i9~twl2p3pS8u>eTn4?7n%w@7*OaoE(zSVm5k#DpkdfN_ z;TVc9;iNKk1)~Xcs%3hkb%kRoY{tM$nffA72A|_TWVF6`GUrnO2AOO_$#lMS0)sxV zp>(!bIbSwQwy_Lcu2pXd1vZv1RDbIaCzETcSgN;}Ez=)ss$6OQu?ftQbG7-|?sm2h z9c!*$?f!WcjwRnxv)=EDMrklkbTTp&OL?cx)LLf}`y|o~CrxY33?=8wD?EgI!`@8E z=NyeJo%5ZTFwQXz;dUOxN|WOztg`*e7}n#B`ASjm+A5|$fzYr@=;|bD(oZs^%KeA) zV7W{^tg6%V^0-n#3AsR&(R#DJG3AFu03jf1O%{hN8AngZl+##tCK{anmjQpDTrSSrBoi&WSsiH0NtS;?KHiGAE zcJq8GWY0GuZw9Ypqqx@Hi~~kaLLor}sM;T63-@-F-MMIFGDE%)FHM<=XVVoVQk%7G zBt35m-AV@WkH*G-d$$M+n2#Gxiy`~WZ<=Ub)ta7UG~`Z_Am-j08)}2ISCs9-5J;8s z^R}ok)BZB;b*|rrS;^;!syVuR3l(!3b9WU0AR~t0oHkE(hFGoWd1>iRNyN=ohe9bR}Y+3E^H|_K_KdUeplYtz% zyQxjt{H4V+!oi149TWQp^;ws0l`W9>D>jxtWHU3ktg!>=jr^|n_4PA(%-2!^Fq|4I2qQ}V^d2^bs4}aFY0zNR~e@XZrOYKK{;K) z`Xo^)eak87?%i4?iaXM}LO#MQ*t7u&nhO|(A**usjUg0wJkPe$xf&3x|7%(3EAz$5 z>Q`o7ALCE;6ir2Kx9WsF(WvKEbwJ81NZqXroKae?fGwI z!N}29NaDhjGOVwv5}Cj^uQnKpor=P~xqts@7W#z_Ar&s!u#w<@{g$aMHX?c^4=48} zKI_vrkwSR+*kC$*&V9CsZ2s5yIUAB6x0S=tKN^z|77Ul1v#VJIj*@TkjpPq($2bpc z64a}V@Nsa&_#Nhv?(7bH>8jPz1W?g%jt)x~ok(V5o`Eo`Vu zlBO@9ei)I|q^?Vp_rhVqCeETc;z;iF0x>hD$$f%NCpF>~(F3&QsT}Ik^3kc~Ml8lm zXV_DR3aC_lv=r1fYJ!axupgb+}N*c&;9zCl-t(d1; z203YMR+}?17cQ(Cmh9Je!i374uTvn?5>ynFOCMPxPAfYdu5+G81S*l_1x`nMoaa+u zmr6^?&cvsm7tkq`%4z~HN^uz6>xw#n#v9Cmv>rR$y9hW)r&QZN5B;>_~qZAWtvNubI%1DE8_UUTK%`` zwRO&wwoz8P^g$YhGmTX!dJG1+;Y|h{C)KeS6-6k5TJAE9yvKspB1l@zmZpo^=qM(w z(KgL4vGHnuYAFsJBur}4Yc})Ar zqp7L3(q_-Ce5EA5nWvbH#VKgaU{r;my+U}=+NOQ!c&53&SEt$$JZ4xWN!WFO_xk6i z=fV?4%`VsrJ8yiU)y*}H+TFr^L`B&u##M9c0ymrCqt)7$!D1hx@rNHbgb?QyUq2Pj zZ;8OxwL6-{K`8hzU{Wq)Ae*=I!(&af-yICkuBDn8r`kKHV(tFOt()JhI_yb@$#vf1 za1bR&WC$s|dxEGhqLDC}@=*6R<;|F#cU??Ir2Z>f;&CaQgV5ZL$?RHpWLTdkrwH!V zclwo9Ap3i0vK7;M=Q- zci@U1`i;@^P6wn1+WM`nsxZf@l%x#~CC{ldCTG~~G9vNj797U>%{bp1@oAX5K5W7@ zKSCd7lG3=8mJRV?f2~XI+7#<^=NzCr}nqshB)K9wa#;US5 z{oooG1B0fMTkZ#8%+0qyUev^N9-1rNEw4OYwoG;&xr$EGPqbd?2JY5`V(-WTwqn@W}^Uxr#wQsy^+{t5iM9pu%5?d~4 zbEe1W`Cg~-BULrNKK3_=Jg!zF*_#Xnx|;FfguaGqKGf{e;1sW}W-kn_pQtarrA~jo z*7{k_C9^c__4>ru%Gi%^MDC6B&y)hcz-J#nYKcw!N^Y&qG0KPAnwnK0O=sx;9#*-SyR4X^F@UX+Ml-9 zGB1-tm~(^Edqe1+gwCETgs{}4mC{1%^|j4TsAo|_BXHGDQEOsVv{w#IK`cq>O4C`K7;Q5I9rntmzP1(bn$!V z;wjXz4=vVsoH3V+@z*1fS41H=eetY&kt}-=Tu4B)yK5XSdNk#p7Jmq_6(uOqCtoESM8jh( zOJl8XVr|lr(bD3Ch?CixgdE*d%w?SY@)LSF0e8W%cIc_L{HZ@=QvF9QxMdRfh!grt z*gF?fBheFh(bH@KMB~#^;{XY%qgq%A#!dcqM zUZaU_=utx!>BmIrg-g+_LvbmssR>INiD|+z^wCb}8QZ)WdI0+u{PEbtDIt5ApwUd2 zS-jI}`k;2)U|QCFk=tZT%yqoH7*V`Bl2}PbI{VNyegu%bOp}yWn%cXUal9*dgr0d` zn$}2^F`t$_S`u@@ANUC`F+?nJ8Ib5VnC`5~cq8+xZZHL%Ap^55{<}%iSYXnnYZCM9 zuhE>${>j&LVT!LXC8Q+kV=8T_y}K z%U2+4ioRq9koTsw_-$AgS6lHMa@vL@ES(I!lw2lzgTHhgkgXn;jUkYyHk9pfTPmKO zI`*vWw{}@?SWc)%v;qH5u_gZ}%Tc8sDNg$WFW;3v2mWee$WS59J+jE9($2PG$Z5q$ zsxK32Y%3Xgmp9T@dh*rb(|*1mae-)f9t*H|zRksDw8E7^i$_2hnwD=rpT8kc$$(Kg z$xyKOy-Zf1_&T*f{2JJPTOX_)I5n z=3V8sY^CE}3Ep%eQ$!`_e$&`;<$SgC4auH9BT9i0o_2 zEgQ!yOHM35=3@85Rrlkb-<4<76Q)Kiq3jlTS!imq9c-VM({B!7^LXBTxx4{n7&VPwxoNMFv=M!Iyo3XCS~>%Lb^ zeKbt6?4$#Jq5bsXy_N0tA2J6hA_tI`4d=rHI2C<389yfva!w9+K` z3JLaUQ4Zah43d-t@dgf|lnluX44EDdF+Lx*#|l}bm6#CpcYt)USxdQe1fil2p@k|< zTS>Sd26{#g-yp60!$?QGJ0zoo`W5vE{Pl)jU5r@l;HP4>h^U3WRPXpj3d|D%7U%(s zynrQ{z_Jct1q4`i53C^_s}mY)&>L&=8f(cMYwH-RgoKy7sx`}5b(4PXCAG2$2Ez<2R(W9f>ccSZFlY8S6w_d|{9YI;1&4zj7N*|}rsOfhg6OZGQ7+F(TAn#Zm zP_c1QNqJ6`fNOMf?7jAcjz%*mvM%^;e3+*7l3`|PJZ4QcAXo04+i5WqD3-Z%h9ydO zOlbBQQehSuNkN`9J5@3J22xUrJ}qoBCHhc!?Kt&dJ%<@Jr_-1V@YIxIp16*jl7)i$ zZjxNege9=SH<@!f%wXkC;Y#gqN@QT;PB6CcutzJ$Tbrg$t!cuC`T0!00%HKF{=)R( zxF|y#=jVD2Y;LxP1qQN33Wh~`;YD6%$`{b@JmOP%!QaRp7F}#wu)l!paAOxcKA9rG zCLpkh!i1L1gnrgi9%yOze&V#EfilXDrgGZ8X~`V1tV*_=O;+Ck1w?qSaN#Z&R4$oS z&Z%L}t-fr*eW_SRS1wQlUyySn*8x#@eq^&e365h%R+?b04% zeHR=0`+hqDb1kPc0Oq~HkPUUt-l1oiWyjfkVl(@re4AWkcR~n+(C0ix3eSZfE$ZNG zMOQ7E8x+4cgGU*_vGu`Vvb_f2uCC8oqR(WyZN>M8y_iS1aJi`<&UOlBU7_T*1K~cZ zoF*5`?tUfg1B>`M6I{?@!^3CC4S+WjW5Zlnk? zww(t+by(4=ABW6c22Fg6K=!0{jp|mq*aDeQ}Pw?Iy ze};HRkKjd~e)Tz$As3)kLYRmO{-}Z<5g%n7!Hsh+!6NNc=2uK1SH{IxKY5SRhR1%A zU;B$*2O3@n`(B6UT#sY+I_V9wc8vOvHb&(P(H%}K>)yPB3~phLr1*M`V0Jlaj%59L z*~hvmoV>=d8AXpQeH83rC+|b`>hXQqooIP0lo|XyvZq#Qh*$njA+oofb+ohlwsm!| zt9l@TsUNd)5J` z-4Bq}2lm~5(ed6p-Ch)i`!d7+z2k>7yFjYL$Av`XN%x;k(@$%k{GUF1PRIBAn^-V5 znMfefn~lCeJaiqV(61Yk(PV;_T%m0FBeB%N+2Uz4@R4vT&9XpZ&X3Y46znPm^s2?O z={))d_pPeC!@sx#V0dYcyDDMAF>M3diF;}xin?_L=}GzO6*NhfU?4tSe}GCa2eYnA zMPGx=N_G$?7h*ZqF={!=vx!-)%dLAmt1ab7zcCQ`be=x764Dp=#$5fLg9A1kyUJpA z&}_felS1t&GOlfAk{`*eLLi*Tr2;ZjWyOBbaY9-z#Q+v0y+~a3pzR;-Pz^Y*Z5R3- zNvicpZydHkS)w8D^>3Z_!Ig%?+4^@bN6=1RG;)J`x6>_9j#Q4pgU2NT+8sh}_~>`v$Vb0G zpfqKI5Jze6)IOu^P|>(NkfGFzz9!CR`LK$)I}vkyyltjVI(|ZpPJwz_PgQ{vYH}tG zwmpxNeo#we8uspGA?yV?m?$nd3EQxAtqYy_<2>kEHJHTZek*bA@5yMqon7V zG&44~?yi>U3*E~~Gu*8(Nq}Zzk~F#dz@?5&P?OI>sg85S*7b$f#7}z&VPU?H)0v?k;l#9|T7ZqFzO-?nTa`by zVzPEr7IbkVItsBk>mk*d0{4=lX(|=ElXsj&>SCe%STUYV6#p&lzN_qlo zM|l>;*jC@;9BGP~_QuOR?$OsSlC(VQ`>dEZBo^;}8 zLyj|j1^F#OoWq*G%UIAzoq*jqS|u4zr8-CFF!fKB?Fe1(cf!fh+FS;{CaoY^Tyq4k zSbVSUKYYr8Wx7pB6y7Rs=|>Z9r%~jXc8B1_6IpAzeH0L{{pE>h~-OaH4)w_@F*?!gb8@OvIoI~uW9u
ouF30n+T&B$q)X#bU`-!^av`&Md|xa%n?5Xz}duWa}HSu1o^H#9ql z-@j67nWfkhAQJHBwh0j(&xQZs>3sT;El4U+1+)L0>7`;#m{KAI-WWlDFZi_&S3&OE zgn^D7epU~I4kN-0UQr4MwooB8(l_c_1NiT!*ky&19!_bc?g5nmjR8u6GYRfO&>Jf! zy&U~Dx;D<_xL6btI9~sPU9 z=Ib>Fe=#~TruD8aB$d-bT25;!F5EE}w^7{L7Hfr-8(HA+kgJG|P%hc0lCsQKN8NQs{4w;=Qx?Vm%GWn&PX+ky{&Sl^35k!NnI^W-3Wez#VTN$r_JELP%P=Z+W z9!9ycz31C_66q-l88r}j+htVGS!MborUtZls&}%ozJ%Sf=hrRdO^Qt$9XCx+TQ+qy z3K*GuV4V4#p4f_z2Pkg|8m9PbG!G;I0DB&*3ks86n89q5KH&x^QsE#PxSkmm*p)*pSG*r8kuB24#T^pd`>D<#;kx z)Xs_PnsOqQTL%?rtyHZh?7N6Zx4G-$(MUkFXYQkk9qj3jks#;z#VIvmd%lEs=6vPJ z)58+%9LHF?7$HeR)(Cqc!Ys4TQVJ0&(VAYL6)3;Pv`H57G)5?AS>hXwfUAR@D@=v0 zbQYH9n}?jMoI9-yu9g?NQC(_+gx}$|DXTzEY+n@LWSNk7ejj1sNtVvfG9$lBol9%N z%vV9|o2+no88w-YI1t+z7DLJ%Fq?}VZB6i9ptfOknrqOkl7S43=_bX_PFg$m3{M!w z_}fIJcfQ@v6^zyC57#X>-Uu(G?)nwMbq|>Vi?_L)Oe z$cn8VtOX1DU~e%Rz091l+Dqc&aBmv|r)%aP*A#Kc63y7*%E=fEn>|afC*8&NxtWeT zI?gwbgo)=QPO;)R$8qX!2{zx#i|l7*uuAUNFM0IPW;=Zi-`ab%P(3=LW+v^&FY~pI$(-=FJyMJbAB@@4 zXGCu~F(v&ldeH!s>d0x#%$w)Ha< z^r19}iQQERcztPqI$*2IDCg9#ztqnG|3Y^!`XO*YB~hHIp#Mu^?~Q5?QEx6!yLhcT zi*kVko^_uD{IjIEQ1t}GJQ5X{K9?ySw%=f^|=`2b_5qbRGHrz`Su#U@mg!?*NJk2k&1ELAHwk0;+gkY64m&{ zxdN05X9GT|_I%`Nq4IR5QgMgENun(Bun!(M@i;(wIxtbfIPwPnYsEMa1*CwJ)DJe9 zGICPD?Ns)JC_e90f|JVI-z!I(OpC!4jv^I@22zO&mG|Hh_ju#aC8n{^XJ{ne(*YE3 zo+)7?qzZ(-p6ksFQ7IEw{(2ELg?*tI0;#1#yw;#nb%UoMIV-y_RaLQc%6Xh6&Jt$% z3ugryX9Wjmg}}4ITeBh;v!abLEyjEkf_%>9LSDFYDV%ekqdKak=WI!Yo2b{8Ed zHc4%@N@R7yOVoh4G5w!Z>sELrL4uX4F;g$W6^t!sC}0JN@r@q7`TVxiPwJXkZDCWw zis}M7P(t0LsH!h9Iv3yt3$WUYUTx}E%S0N@Uo^Cna!p?dR_e|z_Jc1WfpHT0L|fqa<3$kii8n1!3ztPvEA13eOh}Qws|=m5jQh{jaVz&^g${uA22E9lY)D?D>l!uc$}qRN z32P$9^_qjAJVp6;=+pz`gXLJ8Fcb;%hRksn1EDJ{W4hDAGZO-OPze}QB{9Cb z{I?D$Bnk?5W;Y7b)4S0B5GCbnAGLlTcZ4YHdZE8J2n80_5h_TDMH(z+8SGQ@95_R+ z2VrAim7b*qE(hv6?p69h$cgDH@`7zXvX@V9wb91#>czximf=kl$FcXsoiOD7f$*h) ze!CuQjCl<+T53mKk!Aebmc+M48^{ZqbyUfy`>uX1EX|TxZ!Wc4ow{)6}RLr*6TsC8VYy^?A04|NE$dt4UHs!Oo5c)=> zs9ShAs}=@ZHWNmKU$*Yv8aXSPhr~_3A2MMy0AJ22b%K~EdA6*n%xqlXONHygERe6! z<_{MW#;7}Q-opt+mO^O2$g;DIfJbvvMY;)uUO3M#DXO%GqM2v1?pozqAqgN%a>qH? z+>(U@XK361$ds$fj7q~I)@+xNV2^FiToY!V6uc5Hx%X4Va9Lrc&wKCHC9BD!SvqP$ z#w9$Eey8|oM;~Spk-h!n=v{KO;sx1u={&qfVn6+HmxlmgMv!W*L0gx-n^R;G1zU5O z|L_!MNmR5S@o347dQecbDG8%!{^S zxU}e~+TrxsbYR{?hITb4Tpog>0qwoJC*syi+lR$Y)^NqijwUm{t{vv=P2l$4*dwCJ z2O*84x@l$wLp_AkK(}nIXJCLV8oODM?^cR?`)2)yUE5ERO@0;~F@!^=E^W;RZ0vc= z<*oPUmR9SNEL($*Cw)x51>3wFv|gJ4cxCSeHzC#}kM%AORK={oP^0JO@Mq1oxwf23 zYIX=7vs={T*P_R0-CF>j1KjF;nqb)Y4f&S3Z*A@W;^K`WzVddYG>W3`s5>iYdY(CjLN!7Oz$?+}>I!Fi#Sp(Nh(7Y% zV8?dh*=1XR8b6JTg{uaj(77ky#bg1q1oP5-*uXjj(=N*8ebr?^r;7&olAb|*Hpsb^ z@lto;!hXkDkJlCWBF)K{&u;S4h4<3+cwQ9e$`f{JEU{P;aOL%CvAapIfNs%0gf@uW z1=;9$J>%r!C+Zdqy$Zd$2wYf<&Txrrc8t2}4wG_@MANly*9x4Rn>o|^9jawze3P)c z7<<7Ri>L`E(+)V8Q#K$O1HAEx5Xj1B`LS1 z#kXb6x8=jP6$`hOJGWI=x7BEOHH3Gyw0Cv9clB2>>paShQl3}$6PJ)vH0wKLhg=J* zbzrt9dF35_l;@1VZO1DBhva$n3$M$9p_o)kPAC^ z!**tnRZyqz`k#LqR;A>juY6#vRvXBNeqV3w81F4#M7-TDu?+@1>lTkB9+zA7P3@dDEI4QP&}0-2i;_WYzl|X{&}f*jxw2S=g8YV11kY-04lbD?Ee<;~m6(Lgunv!_(~IS1Mo_sn8q$s$tA*`* zqAww*?V(%Iaz`9JhGNB{-By44q{z|X4X4FeB(2i8*V1pmbP>ND4&s*ku(kj+5#4gz zG(A_TG#`z)&>c{JNYN&-0TjyleNWB^l?G!a+)mxs&Fyflj3{BGmx5_YV1 zux9A_{zAPuW2f-_HDYqM+72o5cz=6!c6^K!{rLogkHYW8J2wh{bcPm+0BnJ4ioiFr zd>_8JGQ+c_VSA=VlGLpdA3{G!UT6e$0O*Lr2%`sbLz&w`Uk8(U5K;c%>XW7n=ILt5 zj}T}xG1dj$q^^g*#~!7OfAcJA@{(Z9bol`S>EEqWaWJ-uvULO)e7|R#GnAG-b+hBSIasvUgi$y7JW(9Tp361Zb(n3fe}ZUpOiGB+(*wlgCZ?u~ zYSq-JtVGJtTZt%!WYUCOc9Y3rdH4Bd&)L8BJ?EP<&-Xmf@A>_H&-<-dL-70G12Kb;sZ=UoUta~h|MyYAfxi%7ggArW+z=CF|X8aufz<_Fu zDaMQ+%fSl{a|Ck~bBt#}FeV%(1QUu0<4Hj+7fDO=q#dzoVG{kTyA&fT?^ubt&C?%AEuOJs# zK$0*@82AWIg8{$`%E4$*3s!<3Koh#b4&VfWK_RdPFdz+`Knr-lV88}w#;=I4hBU-* z7;FrT1br|TBC5Maysx@_^GV$bd7E`x;cIn9^RDZ><6Cuh@JrAsB)z#H3oVK#~Vy$E%_Iau-mfnt^vNXnURY}&J zb7t%F-R_iR*C);1em8BET-J~}|G=AqNtroK=NE+!6FQgXHcOWU&UCMwjUGr`&O3() z{PS<+Z<4p)$}cl+E&6ra(UB5A%g1ulhKs`7fI?NgZ);u1YTM4I^1z-q>B*a4G=(|- z@O^GuYfpQP;qb|~o}9~kT&Hg=PmEn_qpp`&9o>;O>GIC{FdK=?z;3^*;zXyD)w4sT zyCMrFOSMlA26VNSPpWhDP0@NP7tbwebPo*dX}B%4AGs!_{J_nW3#tIi^f||0JUDMZ z*@f)dc&B4?4y!73x7YU2V>$5-LEk!Jy6YoP{hm;Dq)_XxxxUbUp$q%lW>BVRz~J)r zp+6dXbsS4JFP{=R((zS_$0Jc)=8220o5Uyaf~X5?1bZ~%1CzJPUii11Qf`i(vGwFs zpV*Mdt+Cf1dI=)Sii6sst3PSg`+w3Z(oUHb4LK8IS9DMv?^x0;4P4sZW^`oL`!dgj zS?!-aW8Ox0r%E=CA2K6Yp;wWe;A(frBwAdxTznea4c(CDIqYFqx`pEPjHs6BvhEC< z(AF_$kDXnXyUppz#$2~C)-jua;U)QR!i)B>aXpuY5AHsbUV78c)GbdFylwk6g^%p_-jGOXLD<-7ZwH@X!{IAED?*7|abd^%;1c>!Ey!=U*BF!6Sd~$Un@aCn`m8mY;M>={(zLLz zCS%^az6XmQ4EofvA@Hsy?%enzWr?m5V(MXTF--gDmo1V{tvlljwaMOB+~=v>QiZlp z_g;NB_gSFIYVPAhP3&F&8TWpx`MX0uTnktxo>pLcEowqz(6i(9-}*Zu28~#+erse@ zkw>Q=&U>k;bXe!z*PPr{n!F;Z;?-}RqAN)r3%-xOon>Jyd_s0LCe@a8XBcKI*H1Eg ze_FcQ>HS61_uT>QvnlHUR`tjo>qpx9+j?V|0FTB>7_Gi|LoR@_Whdxhx z{`O}@^(_BUVd!nU+Q@YAb!FUI{g#Fy%~Kbu$Ba5CJd!YUUMIcUMa`Vosllr@6)_oA#!jQeAvmQB@|MLVBR_j|osVj6reVoj{N mJio5iT1}m|j*w1Ba;lq?@>i_a8mXXFSvRk;d5WGMvi}FA)2+e) literal 0 HcmV?d00001 diff --git a/en/bilder/gif/olga_2.gif b/en/bilder/gif/olga_2.gif new file mode 100644 index 0000000000000000000000000000000000000000..4d6825cb2069d0ee0936341ab1d5344d3243aa5a GIT binary patch literal 4114 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 literal 0 HcmV?d00001 diff --git a/en/bilder/gif/olga_4.gif b/en/bilder/gif/olga_4.gif new file mode 100644 index 0000000000000000000000000000000000000000..2617e77d71d632ae4db8e0e90a16f7a64ce09e90 GIT binary patch literal 2714 zcmZuwdpuNm8$Z@o7PW7itmM+`Qc5m4Vxn}>MK;-`HIgCHDRPe_x7H=h)^>6IF8^1f|FD$fg%Kk5I8~*2tkcRNE9J4gv1e&09q6<1r1ox z4AmqxhdMBz7DWjZC8@C(yueTlM==7$NQwoHqBw@)IEoV}PEw?xmcUQ~M+pKYNZ<&q zD2bsYj*w^dB2DdNi3bI|1P#{#wgl#ZrcVeWf*XJ!90a+HAXW&X2)FeAzl99s zp^5_rL*J)QpF|>2ZEY=w!?CimQdCsj3cU#REg(`PA|a(@QJVQIN@~p($A;3Zy4ZiI zTc%l*W!L|yfO_;cl(Al3-(b#EI$WO9n4o1_=-60(kDsi6swwR-C$~A3c7Ck4k(1YY zcTbeGvSlK6nPri%h0#<|AjtcbWtnbSS@<{Gp5xKiRLSnlSt%)}{0rCfmonM56b7F= zd9YG?peFs7D(`&{q^7(3_{qgiQ4w>}Dzb+9d+VatXqUv>pB${eq0SDSw=W;&Z`gdQ zpTKiOEt%%$=C{^VxX0yKvz=DbwvKm}+SX<0I2cX#q0$T?~dt5B|%ZjVG1nAk=7G=!`I|ZKM!@iIY_?jW9PC|R>;)KJSX?HSblo+KYQco z!7Kb5-o~zGO7+H6dYx5^)nMk^omNy4X2(mo(oT9FiJ@g*P~ja=jW#u+yI$Muedukh zp108T`m30WjQFk6-;|h{3rRVN+K~!wvG(m!!%4sT2MzjJwTx&atju;7-8edC;db_z zzuiC>Sx?W4*z?^TRew2~>X8JKMfnlWE05#*Eu(ldeOYFjVu!4&i$iB~61xrE@7>`A zxaX#oSGeb8W_)qa&tV#R6y#qB@F*;DFvi%WDP)C5QH7b|x#DWw!gD2$GOBK5Jzm~3 z%y=$8UU-vdCr(O#p_b~IQ@i}qtKwGq!|9x6JO0@Um%=;6+)=-tw^c)truXhYyzTCN z;av%Bl07cX^nUPx$DevM)-EF~pPwE| za!Qq1q5eFRLD{!Y1tzn4A#ICFp0765$$p63*yG?M(6N;>Y~QzLva-!Q>c|KFaqDAf zCnGBTLbnRp#A(8kbyjx?nG2Qa9|Kn=3-+vmSGM56teY?s)UKx+;=+=>5gS zkSJkwUo?BZqdC^vYug=_kp=bS8NVm@29grIHAOCGR+WwFURq}|dVTKDrS~zc+y~t* zn;OJP5wj0+@rR~E0r&ftU8(K~+8mQPGWY&l=DR=0hLJBBGG;sP^TwMeIt$gUk7e`< zGQ^{ms=E{KCjO~fDHO3v1TzDIaFeOQs@>({{-7Vsre+RZ-Ti{k|4lp=^sv%Vk6y6N zN#X}#vgA9a_c!x&Nru5*2c5ia3sI@giz81uPM2OdU2w8U*S@N2y46|hNR~9c;kkVH z=|AkWvzD*;`T26`E0!Mz-+XrPx?K*x`FJM0IOQLaY^|IAh2PFhO74r4}gl!9z_-<%yO3T7%QX4f(8My87 zWur%P+YPR%%*GWn8n@PZ9IX$DXUToFP;Qw_$}ZB_?2@-d^rFG{rs0oD&$LV}j0~>W zyJkdxOvo8k=BqQW4l1~GX?)RX4esW2p{wO;4Zjs6%Mz;ELEkpzU;eaLkf=mUH75KF zY;GUV?$+XesoFl>n6}R?ZRc@0>oG6yE&4f4dNDzyet(ut`gPMy22XQ{Kf=e;i_L9& zcm<}y!{tec)hVM+TH}U5-E5(wo6ecwimPHz`ir8!_8HS#I`IyMzIx97IfWxS)2mpU zc8Lx$@)~`@Wy7TUG`91*j{aE_aBn{Gotb90)#P@c%@P$O8hMQ8VJ}PZp2UVCi12>w^Bb#ZrRTod*NpJcLZjbZhNKLjw6mMI5+IN zuC3`w*6U;U>7nZO=8aa)yrgT9lbO!^Wc%u=z|vYJPr}!=^X9SFk{ zF@c(AltW%TinJ?t@yqg{^SfWy7-<&_Cu2K=g^gtUZ5sFSWV`|U#L;1HRr`RBZ<1#3 zz&>_0Z&!y;0$WR9Fk9UcR^oqCo6&1iRrBzg?uFKSeUlEOHB#f6%g@KrO9s}4yj8~i zUsVhAf&)@!A55^?`Q_nbGQYYU$qQ}l=xe*B7cR5b=1NXM@oZH=+jI23G3YGb|SLyT=*_;%>DT%cLvC&#f1( zN&PExVqR}2T}0d&qZw-&ZHV+q>lj@y%)DeNx^%uqL!x{;ZLfTJSnJn;Et1D>ULNz+ z5B|QZUg2x4El;zlUHtHM<5|AJ^ZU1sd>;N>+!=9Ba!MZed9S8vEoHF_`*6B@ewP%x zf+aG%!5mE+;_B@1nby?jXl-3%CRxNDiihuVtDfSIKNm*dstEdhaMbElt{{Uen{VE? z-YVe|FKbt2piZ&JVs6dfN#WazqWELSIb9uG`9M!+{nvo?t=j!3s7m|9juv-F>zDW+PG zIW_f;!})&y{^p}c+t>G%m7fz6lXC3C^4I^78}^qU{YQQ@KyJWKw*P=^ueVIMyWD_} z>?Kc`HaF=eN2z*S$!ZIUGP2Zp8_Bc#B^c%sMW&)j`r`QpVp)13aazJOO$mmn(BYkk zEM7E8ix8?NM%NMaRYVc_1>ARt#O)FaQo-tq;LRm4y9vUPJJIR_hy)hmL--se2}k8& zF_fU6IG+PQ&IFIygF&mHQL-oy0U>>!%x{-kylVAO5X0si+BKeK_M*;lGDWv1MmO47vGTY!!%NOYNx(x_R6`0U z#)sfh5E_PTtt=rBjE;)h+S>Z_=g-fdKfizf{^re_g@uKgnVG4nsfmdR27`gYU|<*q zK~NLeKK|DhWXu*lIz1yZD?2AQFTbF$sJMhtT6U)VY(-^Nb45h2-QA zlpSmBFEvaRNa@+u3OikBLlIuyTe)Y|ICn>sn+`3mG~2C z-|8xEu|<44JC=?q8I&vLEsd?92nv>#A9fu0!s z=?&@5EG)A+MX(Fhe{)mHS=&H9F!b&NR~I++h~d5u%Q9N(RFa6WcfM+2ZTxIHHkTOd zN1Gjk?Q;}TqpgE)!8n3a>`@vc@W(7xLAhetrmS*CIPb~L68j^Wb_MyGeB3&>>-&5k zIIoxN6Nt6^@SEwvkO`4`FPWB%Rkgo>!m3auloK>9ya}J~Q!DX8iZgJw6_1u7X0YAK zPQ|XUE%;;C8J5=SHIn0^A4ZuKZe-!-5^f5<_tX5Vcdfnf5hfE~GO)ixUX~s<0l+Qz zx;c`LQFtFxR(_zK5oAsIr+O!rU^7%k_^h~VwMvFadda|)wXN2CH)oKwO>S06;M3bC z4^RZ(=*t~Y$fZMgC9{{ui&M*pcbEz2d63_Ve+9u882(hpq*(q`IaU)nu#AX_5kVMp zfI^4yVx+M)RB+;0t7xGC*da&(+CvB`T=CW(M^YLTXDhfMk7Hn_`!4#3w{ zIY6I?9KoXdswtO@V2S70$k=mL(9ckOQ3a#&8|Oa6NW|T#^NHfUu1kG@D;-jtNygm4$FotvGmqY~Vv7sle&E>{+F8}!Mlp$nd92jz4?n!7+UDSb;MfZbgmYos!S@$62 z7q(wB1PS6Zuh!&{D{2JikeTQI8iv?GVmc}o6Cad-G{vD*sTBlM9tmVdX#$F7>(dht zJyvg6EqbR5s<3msD!JB{qxx8I{F`F%jttQ&JtX%nL1zv-Q$((iC}(ZLyfE-{B6-KP zw`zZzO>wpx%hGi2qud+~{!t+MIRzmvaAKZ1&hQ&K!d zM!6cNi;@s|gEBHY^u)MeECH4v*Wr#AdK<-fV)Ay6u=dnZpA~ETxCC797L@o-K zF*0j2**G)%@k3=4MEDL7XBIM!Lnp$j#`O&pe@o#yHYCP>%1R~~!lyGbWq(sqgks9aaA!jf07savCFj!96jfF6#SuyYwBJ78vJ^I*|%CBJ#T)XS%i% zlf*;h)yHr;8yO;}s1Ei|#(>~IcLHU}Pv83g7+$*B9eZWr>Bqz$SGfW`@jV3q#}UD} z=cd22wZC59S#f!;@MU6&(?TGX3QHDl z6`eTRktPsgY$Yr4G(<=4mr%r#rNjePHtBbuz;P@r(MmxX)CTgW+QTxBY1x5Se?8?D z8%cKF`c+G%va{Q7Pw*p{EkM)>JZZizRYx0 zCh%(KTFi)SK$b!4UV#q^rmUMRv_3OX;86SziEi#mtz6j!s{Jr)jF}x09`L4Q6_R1Q z#_G2QCZ+>@w;h0t@(XmFGie-e&w>wWtRN(w`m=){??|X9VodGR`O;~~mPkAmWtD3| zI!Mb9ZDkvSyM089e?==2&Y;4zFAL#IN?n4Il$D+hGVC^Z1@DUsP1n1Ge2J%eum1hU zD*1D@QR`Ry;W7SX^>g_adz}jSJ=MU6p?v0Bn>itezA|_JwP`L)^6)iT@+ME{%hl#N zN?zEQ+Mn`8{LXs*Zz9f`2Ju;P5Tz$b=FO6n`BTLBvE?y=Tuvt8{W+`#WB(s_ z9>(hFew^-j(y}BzmT0j=P_!i@12E)Fm2@CFsgBbH*Br;e{XAvZjgX?oN--hA+=oVD z%9wC(^Vii-Xiiyn;(ieXz?FcD)q z%tDa&V~9Hyv1LL|+-xT%6cK{VuM;q@vf)?Riz{H{3}T{-oUB5643X&xkHlGo$WuD$ zn=X}&iz8wJd8l>UEN^4HaT;vRgIw4455=LD@K*^d^-19ys|A9p%eIy=X3fmWy)PRc<$j^398JbwC}KKFzZi z+jr5Cpa>~()Z_ptWXLe0TKR*eI+^CUpDd;cVos3rRE8>(OiuON#aiM{cr(r zRirnl$0+R#soqllTviby0_8r^lBZXAcvMrKt3(V{gzE{1JaQVJ3X(7?QLnO$W1?>^ zRgT+MInLA+uhyuTREP-6?W4es9QaziQCJ9~P2PX|rDumIOyME>n1~Azxvjs~m;xKH zyi|4f>W~p%ahOa;ZY1Og>6nf8?bT5ec2&m$0BAf{`O^5LH|eBrY`Nd}O6nViUu?1e zqmcfVx|jB+Uk%lLepF{!U7nE_<7Zp^L8{6gSFz=Q2E&*co2Xza`n^5s+nYjF>2$=X z{$J5_iN{dwY^@G+ALFxgpBPPt0*`q~5`hK-9yBhVUaG8UZEBM^t@7$jF9i;w2f*Kql>ghr0&L(orLkiOU74Gw$APWM9(yRTD*+L?e_ET- z@>~*WdI9}w)#A#7mDq^wchC1$rfLL~8WC~<5LY7nO9CO2qjA2ia`YApO6&gZ(X<+! zkl2=>*cOve*qE0t9+(l&MB8tKJGN%D|IBTnVUpPB{kWD$8N3hnxYo}j)*;xNz(p@Y zhlNCm?%C$6?G~eNgRajX8S~GY&3B$3?#$Ki5MA$7mFU`M+*R(?^?B;OLL2I>d zQQd1b-EW7x-#_mD__Ldr-)+TAU-9qxUL%x1Le__Sen0N{JKVjOocv?BlM)YrIs))H z7G4(jl7~s=5#wk;I)_CdV*7X)@x9pB9Q=J2YngTlq+v>D@d%0k9S;MN_)pO@hS~UR zHjr$HO=jZ(l1K~yq;h&q-d$Re5zL@sun+La7=DX_Ns-9bQUvZ1G0%B@_n4QQe)VUP z1D1evrsrgzHc&-r?X9F(bINuI?|ErfL zIexBz;HP_+n51s)<}RWkOpH{`JUEzrdNB9gVE)yu!NSvnC@Qr!4dA2LJjv;LwhKWx zgEd!&YL|!Veho2qtHhrpUQdsejVOPW)qs&rK^M7e$MA3;;y1b7$}8^BQjX+YxNcNTbI5N|Pxp@32} zHvtBKBik={0I6Kp#dj7DemMw#xttEz&?duNIgmQRPLB$?5RmivsUl++f4@WizDu#A zwVi4A0-m(R`?Fm<*kMhO4mVd+hjdh&!cV`3CTmFk#z^0Av9Bf%Do0%g{9R~|-v{OTunNd*eq1wci7 zCzw8gF2-564U3MIOFD9(X<0Z$7&1;WH>JTlc?4|&qR4?X#36GYbWjemqfZw%PN#?= zcM=diHloTdBivCg<ModSc+_e2X*qH<=vXE>%{Z9tu z#!Azq>@_9C!z$^WgGj#cLSTN2ti7G^I%G?Or!yw@a3DK2vX2+myLXHV`KOxf zwvk12We7p8Ef&PG8#^dLb5+i=HHT!Mj@-V`32t^0k9qtXO;C(@@4k-^uS-MrQXmbg zqo@dM#DR6m=_V{hoegbG!K%bVhFn;Y2|3WCa))6>27D{9ZR(wzkb9z8M4QJV zhz$c-JM$o1Aj+L`--ThcQ2#*b>^|80z99$H<03XxWG@5uh*63RK7FtI6h_JNTqyW^=LZtyiLsRC)Qsd zt5-eYA9w;UJ#qi~gp*8P>`J;PaQMM!^3tgFV{=@Um@8)BX)*1I>i4Ie;?HgxJ(G$= zVqk^Ldim5b*c#ZCs`FT%dj0hnxFujFxMo*Fby>I<&6|yLpVf&Ge{{~dD&A%(+&RO)rrmct*KA(M^VT<4!mc;LW~%cJi-0R>$0OhTl?uo@=c<04{yOH98X)q z`IbgllYrWFWGX8xHNV~8o&QPG-_YhdVPyizkOM0)J`LhX<^Zg~{v-;*px!de>sdA- zuhC-%-z{z~`x#O7ZHd<>Ctu-$lZXdr?OUVi2ZPG}sM@|Sv6t21kFQf&)plOHtfs*W zlOx-;UV+DxUdu6|(ICX~#N$RP24cS!5?cTM;ORr7Ps0)Gz4#|1&0oleg+%@f6zj3K zP3^S5@YU&)h)Zgq+kZChB|$%)S>ms=00ugo22A}qYPmnd`ro00sX<4)v^AJ;GK?4z z5lce!1+CikApiXaQT;)-h?m#ZAow1R`Z&S+eApJO#DX*Jf20UM@%|Tk+wMdVE%sV~ zd8GZ1-u?|s-oND@Y40XLi|tC*`=RMSN4j0ZLj6b9EZFMl99q&9t{oI``=^a6Qi0#D zE`)uQ;Ca+n~MuKYP65D>57dP zZ;ESp-(s4)$SOFeEz^^$_@x6cqv^$BDc(izlsc@bcE69xkq$RbW%;f3y>ENc7X8h#;FwxZ z|C_t5Zg)iG$Ft86<>|nL>seiCF@I$8;Gq6i0#4Kiy^LXKYNo%Qk)Wlr4yC-RW+OsI?>TAsjSnP*@7LxHk}|(Y zrzIP{3&n_BH`!`{%`Hc02lqj{Erdqp)cMr=ZdOF$fD@d@pC8+mu6$oU(f978sVZ5q z_MyC{PM?_8b1ukdpudui(IN6@3UQ^1H^$x+4%^8dOA`C>@;ZGTBkg@k*iNSMxB@01 zkiMH=GPTOxMk26QXL`r2jU&^t#~7DvUCxK^%U%s-lunBUQ1*36JL%uS;!W)5(nMTT zgdxl;RDC8+T|dEceRGO{5-^rZvm)$B*MkL}*Xa6K&83B8WoOMXYh|kTm3;Fj%QqfwO^)dRP6B3r`Xsr|Ve8-jqi>;rt4K{kxgbJD3 z0~|EUc8kI%xne09Y(&=U6+TKJpA@oWT}V^O452@l)KnT$61l^#?Pmp!Qqgt6 zHi!1_T9A0a6DEdF8^9JRg`9pJ$ z3QtvK>-ky;G@gP9fkWuO7d5j=U(zvAj11|=O2I6)mDD12E|+GZ%qeWvZ*jO8=KrN; zYw1R_;gz|YCq4889%GNC5_h@&9)o}-(`jjdqA9bY=<}95CXi1jt;S>|vm&ht9<1Gp zoLr$$k{_v^)EO(IZ#J;YQaGM2L{#@e>22H;7SqW5kIBaF39;rElR;L+SI|auMN9|* z=CS}B-W$TG`Xh3aY%Km;j#U90k~w9CC?0J~2xfAWjnivib>{T_6Ny2`D@qNRuBCCM z?;Rw1wowe$F4g=LV0wI$wMxdwBfRWZncOxXfho^X#{(WN2Ax+}8vg&5-tRTVcZPqM z^nL2+V|L!4`|r9ay)e(mt^aa&*7NPvmDAF=%y(9^x?)@aR_J_dcdTSBRa{y4LbUWG*sh)`bZHFb<1vs(f8zR3WHCZ3 zq9h!@j}#<`*?@OU%RbxB^0~?rIC1*v!ar~3B}5Z>u%6fQtxe|7!z5N&d(L9eTE6X+NV(qPmb~` z$KMKQ$*oa3VW&8-f2`Os=#10O&qONoaoYC1Wm}auUaIchoTC)?mbZ)q zOG+SeRrhx$$_^fwt$=*Y_<`O~X?7q$-7kllXX zm1!kIQcUVQmEk-4NA){4^55E;)%2C3FE{O>1LC(E??-)8YY~1K>i5g^9v0w*x;_oF z%}Gb}X$bxRQ6?*siTVC$nqQ3fF6`j1$4j>c2ChUz;Ki8iK5ix^ku{R^l3jYmcSU(x z{)2xl*Wfo&O~A81BrgAYwsGsqwIAl;D5>FlJ+l)+iR3NXjrax!jgXgy&*YI*=G+pK zVqqs+pCQ*u#5vPIY&|iHYy+uMWS*@b#!!MH^A=m&xLPfI6g%EN)Bw)tNC_eoJm;XETes&ORO)3ZFz<_W`u-p~5B$GG{6m4A3ml*el zccz%Vqx~e>UI;$S+0*1qr6;Z6StLzXr;vC%)<{PMEy< z?4fY0KHE*PPF-aTJC~C7!Mr=&V(Zy8%&WF%iRldYrkf=j#Z?#9^*#vXzNmrkt{UCs zBY+r90K_n_eG}$uZPbJJ*2-g^jWf0NU-CYxP@0C_Dh-NB-WGVz856 zvw!PL{{5TN5|8Jlpb3faEPy71XM7T_H78&RAfAy@{~Gw;vY!g#dGYNnpcnwUVd%uQ zaH+x6X!40cGOTc1VfJ~_1sdeefJLuJE;PcHbm)B=qz>>17WR&m04teUCp<&3ZVU=_Qr^_yEYy06Hub4e1$%Oaezw zP=N!gleeG(VMvvyt;Wfo5Y;ON%u^#Xbo6rUC>}*rXq!o?6C(}Su<-`$LV&hcj;>r< zF)!6~HnV#sYk4*Ek!l{ZIm-6IyE>?kySn&$CX@u)$?ibZi zJPq)z1jkkZEC(ZQ93sZS^c&Lom}MABnw46p7!80!L19+q?l+Yg4^o5~fD8i=^(#}% z1AY$D%chg}+C@kwfE7d4tu1Anxxl>xr5T2)cyf5uW=XL_bcspG-vPj`rOdOn6i;Tz zJCyR%tCKg=2-4uLp)xER5COK%5ZWR(X8;W8^m7X#bp~Q6Wp2lU70Iv}0k&hFabvlg zGS6txpg-(w&ababwKw6y@6*g2xS$0ERv;G16OjGnqUgA!PbScH9pgRha#bEOu47!z z4EuLlQ;}IvsK{&}B;S9KaKShf+s?!fGi5jlG3b2UPi7gq{(^eFn18*{Tc!@KUM`<0 zky!uWKuBK>?oZBv59mB4|9W5bdM$iIuSA2aO#L-<{*L@q{Tim>FjD~^W{z*vn{N<( z+sLoccpwf?7;Y4vZCrum3zbFhE& zvBc((n&zshXk77&JBd~IN|lV`R%Gg@t53fNRcATTkd;!I?1b` zOvfb?QrxXsc=e}_cq7G_(ydf*N!c4w3h%a|&$ncF&3jAOZ03HFtB ztn2M7A%Ew>x+E@NjlCRs_Od^px68tDH@@Q`3!!0G51d#Yzd8jNM1vI3v-@M9HD-c_ycmwqWrwO++G5#NnYNpm;sd=DO{`h!R!Bgt|kS?7SO*^a-8HRLC+(VV{}#{wLQ=0C-%#e7~7Fvc2B{zp#+guCq&HsJ?4Cnw_{YwLOPX`rlwfCxmL5IL&g^V++z;)TM&_XcicO`Ws z0?!oK#->X5XXb_DNT;AZ0Hi{Il7;`xeGjT!-j+Eh6*)5#eQL%@-lm6+EXcz4*=9uM zoHi3lf>HCsbIRj#%_Fb|)BKSYw3mr!v!HhViXtBD$eeq^CwnLf571-mDra&YmTYcd zBtt>*A$}C`1|JpRXMnvGpvETkqyxaWJ!NL!z*6W~5+KOEF_u)S|0C^M=gj18q7v1< zfkXR7ne&R7Q#p41GMRav@UQDDx8HkbR+4V(__O~O-2SH(cyR}7!Gn75z%D?Nh7<{j z8yy|y+0J4W+{%|*(_!@dFia0aQnrzc$9!7(Mc=wJ9i`;W2z&Dqm#ny@{ z8iqyzMw4#Wy#|DNz=ukp`C(b*n<{*JiCsc6o2{AGT|&lPjvr{L$rvcZx79?=)l9l%eZs`F#>EKm zPCfdQ(jGd)d<}@wn|{WflA-~k#Ak0tpS=xu8hao#27NB)^=%`riW;*8vm16jf{cTR z>msC2Mr?^l$ZHk6Zj>z(@fSh;eTv=iyW;b`8B~ zv2$_#)vdAe%OmH2i*vWN{yx9Bc6Lz6M146s2I;$Ur;Op0w@?Zm-cUlOOT)f>S;`Q3R2I=tI=L06#*icO zid=zx$-kjniXNQOtL7|Zhu&}{9m9-UdRTGo=wHG2R}ZNC}b8?kjl?9GeK$e(W(Ozg>-lVjsheuJ-$> zawI84i-&DeK+NvH?K{!3hYk5By?ZkEE>Dmzk%&Ptr;DWD(D&Uc40tnk>dib#!{!g{ z%r@HA2YacAIR$#S54NJ}In$7sXy`?qtO2jZj(}4A-C{*2CI5u~zQz9M`oWHA*DOOX$AF>62c-XkR;=>1y**wp>_l0*D%hJsr> z1Kl@)2J69|>lb6zZ{pgc^;Wp8Np$m9D$!Iq{5f#M#m+sy#{->3lR^)}kiE3`%wvG60s&C&Sd@fX$pAv;!rzhjrfjdLP^hGj5~J2ZWL^-n`)i*7p9QE z_4SLvLb#pWFAY3`iPzTm)UCS>sAEiY5`c}1{$Ip4BSBB@e-Yb4MSb~_@^V$J0tGo8 z^RsmqN(^IjD5}i=OKj!z5^`9Vdi(mfiS6J}_W91yVzNeop{|??MP;Hu$JtVjU7(V> zn7X%cug<(Px$u8bm%H-(#miT#uh+PTQ-i#ysiE&brUr){=Y~i4y!dp?>rm>A+R!su z^Hux9$Eo!mQ_n24yl!xu?EV+A_1c>4bRan%P*QU^MVr<6;Kr{|V=ZM;3ftk!E&MfQ z0)u6=1@%i+@^mvXEiUI%qOc-2D%ISZoTUTi`zv<`P#PW2J9Liam{k6it*WHWXZZU~Orw^RUrMTS+9t+Wmgbpv<$I zSFe2fk9{}N0#-|F;51pe$pofPVnbB)N2%87Q;vc+C9?qGfNx(Uj9lZ@-&(}J|5(h3 z=0&P}yHlK{db;k@*ZZr#Hon|_yY>Fj5>C+ZD}$fUgJ@MK;H23*DQHN&OT;_`#>Nwu z?Pt>nnwov~q+#I)4C&zaUjk*0hpf*?M?dvM$sS_(qAiXLuA{8EO{Hk*;CofJ(t*SW z(}jnhWY`3lJiaI_eWE-t$oP;tA}DpdFfvHy80TA7zzR9ft@K#cdQoLCRzG|H?x;YU zGQ&FXxlCZMpAGGK|HjObte2OpMGKl3R_TCY+M>NyBrjc5r?X!Tqb?<@}UoYp+AN@I{@h-V_I4oRQUZesg z6LJE))jfJ3ZTcMd)XHwFtz*3WDT!aXo;JP5Mm9BN?&$7zl|=c4qk8`NJ@xJq*Lit& z@4ah7s2)^Ww2kD-iPEWokW)@JlK1L#A}arduA)ZX-zu;jzUr-$EtAACaZg*7_ zzUv}yqHD?M-K3bE_ij&ZGcZ$Bt(JojT$nsjK3Bq6CRT}Lfe72$uS`ylz2`-V?)hDc z5Znk8xp?jUIm3I6Ug*Rm1FnXFX-kkEu9NUqyjNf>B&n+qPYl~S6{_Xv^ zPv(kUm5su3AV+8S_}6;+D5-tle?NYHaoPIwyDH${dqR^^6XP>v6~zfXW$uM7Ut*>p zf#hN7D@KrrPoIf+evGfvFRYlGsjwYa_`1O40#vkiXBvp+t34ktoGH_KBFH=hhauC( z@ry4J?IwqM32de~b>39p3v4pxURG|st#|7j{FVD!dNY)lJIK1A9mUjBIzq^!6e@Y! z+FSobBDZqAlM00|&Q4jX>lD}~9Fd%{pSEHO6_yV@|HTQB&O2LLcsTfl#^lDdY1DdQ z)QxnwqxaLDaXacxdMC14&M3~H#Ne>#|5L<$85UUS=pvv z>j_&$t=4Leck=zeHb}*UNQX_`wlTBvEdQBiZ&{m*hUl}Q%vXYk`r88iVAiMRV}Nom4#z*CB3*<*)= zmR!Xt^@Z~l$hXWLARFB{zDq8cJ|o#q&eq@$=D(pdA-%*?&Ewe1iL{9vwc7hg&V7u} zGh{+0_nWUSB3h*BX{l4lvK2%w6HXDxvh%zpuGh+yNvOL&^R(b|U1V_Xl*Crl#Mt9! zGSmD;euqz_E$vf$V0fvxN&&Ec^CXgLA#fu8s7yOI%ZM(ibuL27WPp>+a~ zL&gG3*e_mWF;NXGk$7WbhRQv*VFAG+-38zp9FQiHu_XPS(E;yupYMv{!ZNk*I9yUW zAK#_ff7LqwYpw$Dzat=l6h?+9hm6)Z{&+(!<)1Z zQ70^CZ=$1fK>m@?J`MFLu`?d&`o&{hc|lsXeM=4g03{<2^*KxS{siBSMND)=W}^W) z_$I%JR(J>R(W{2qp)gX$8L#e(@Zt=V3TGiwZ2#>$Xav4}R= zj;a@Ok^cYmKZfj27YJTJuH}TOxX||EDeUj^VzXV5C29O`KW3_~e#Bns_$55Bk{e_B znIHQ}OZx52NPS8&-$`c0jfY)X24cbX!E`=}ZaPZr&%DA58(}|oJ!+TDHrJs3TX}=E zY{;M8tE{kIB{i^zW&-CL<^K{@n z79AM~CJq{4<)qR-R52{&`qObCsh~h10~R0L`i8Zp$Me@Q;NJ@Xo-sqa#yI6Dsgn&j zxM9@(=|#7G7pnD^s)`e=*%^9t2CEBrns9w2r4Uof@zO=uf}^g^^&vo>TRQ0l3|NJp zzEcWmh)g3&ZG&3R%yCd3@VsIXOcIAo=ouxngP66De>ikWpG;d{K~1~Nhb_n{6r@Vh zcUuD8?cptpEW?c*6B39Ck>4M?O&|D;q&!8VGDswdbRUL7GDuU0Rc6JI)>A1em=`Fy zulLcW$l%{QuTP#xSN@6;u0fsh;h^7SE1!KOE50G6 zMMWH_h!Y1ir02OY#T2+(h#N<}4$QpFayrP1SOeVFz3h(nTNTpXI(e3ta`POx3Rga7 zKdEpEJn*j_R_y>4EnIQ9=Q4g50aD~a4phjHjr6D9bV=!07l!yR&g#uFfV{$!WYX1@TgoPKR(H7M`@FC z`%tXOo2{dJt9{LPd5OO+a~R^&@k`J%IqMtB=ad)V;y`h$KI`RPe&JL(HQ~&`YTtle zE{FXpBs|X!Mx8w&U0JwNQOKyc-Cq$^ZGFnbnO0qSG@$}HS~;Fsnc`4>I`m+&UzIPe zYEh-?igi`Kbah!?dEutBg?@Eab#={9b?u|-y3J~)bWMXvO_N_ub3#o+C?<|oqnKIK zy;;M`I~&UacIpTiN}n67J~zDS1Q7+2S(r>J1|VT$8NlUD3`D}-LmJG}!oV&}y#4)xo zPfRdB9I!X?YNI*ll9{!O01!v01AbyYv{iHcL_o6Isx%No#rE$K2nxnvhypYsCJMl$ z($7aT>yp_3Kl6MR0k~XUi}Ba#@WVpf?H9rhN&;b)`~#abULN z?wnoSmv8_-wX5R{#+A?m?PVbcS?_8PwMR#<+V^-?0}@Pt#$(oi-Gxm(EF2(62gT_C zj@F|j7I5-SRXq67=SGCQdL^tl~V&}^14h}b;9&SB1 z+|D{kqEjHPpR#B=8_0TrlL;fj0>e z`xA32w4C)PGo^r&*0=)lKLizsu1kE81Ft~B>rr`zx(Wc@EyXo~(6e*dXE{R?%hx{s zy2g{e{&`_*K%CfAc^WI(=(7vuvG!}U27s1MpL*8e0iU>bhAyzW*ZI*eESJyBoIQHL z5BRcoOzhB@MADcP|Mim#m>;J}aUQTe2WfI=@3tOSAjPQ>MS&CJDmSnKny}D&4bu** zLQa}F6VYVA>ZF7MyAn4F{3bI*hn=bN0@}ravl_MoqKFbNOp^n-GLgS}83q9UeZiO* z1K7?BW7vT2)v16dKq@f3%|#C%ypCf7I0hh0XbL+7h|_z;co;mfZ+oj5KLy}p0zo&X zj@FLZcK}h;zRlC}rIxbJ6j&F4b*YFk*+M%DYMKQ}OcPVFIaAJYS01!?WXo8EGUq6V zY)Hb^G|_wLNjrw+zEf8%iDUHN^LkD|!U67MEe~-#DKWV^R!&j{#sgfCLTLA-^canHFY(B0NlKK|enk2$cgRNT6od z_F$QjA%NqWH)M#@+eT2303NAb-2HU%&Y>;vPyY2frjJcMd@c&oU?bbnVkf$;4%u~_ zc+l{>J8lxWdk#VM#uacN@^%|W%gR7zWTq$i{`?*O*@)kF1vx;Zz&!!_ARi6P{e=;w z_v;IQvGM~JHGmN3VMNkHegI4?0+RkbDBjcOa}Ed#vvr~&gb#@E_C6OPM`H|9A`nf8 z2czReN|Z#)${yUG#)j^J1CQ=Leh_Be#IpWasSuWlfNT-4ti-b#9DY0p}gQH;v+YR{xi0>fEeeY&zy5+#%}C8W8WG3&J40ILqw=X zge*1LD{8Ds(i9c4j8wG9Sc(#jB}*w|UqYi4sWeh)pL>3<|8hS*Pv*fj=Umt4dVk(u zR~nxw`_(bE_XWmhEhw-SYrRzJL%l)CUHSEMf8SRZe|Ti@SniN~_1K#;MDSZBUvwQk zbQp-&z&!opon(Aht!bObnF4SV8uxijGjzfXSbPi4{@%1n516=6a>ZHpT| zOM7qJxr*V^1(ZpC0D&YSQb#75jsu%ZZ#T{W+IEk`@BqvEo%A0-T)wUEsF*6t0jUT2 zkl+JbQ283{$5z4>Impw&YH833zw7N4UTiq5OM=Q9PAia4+bF-+X2YtauJevZHQ8vz zoe-X-EmG7XO#wE$fuQ1^#{x_Lmb#I6&RR(vfTq87;Afj>ws>(`?=9SS@m{Xn`*p(x z0b##3c_Co`$+ne{>lL!GVr4q z*nef*^U7dp=WiD~guU(`?ato^1Uipa0)nj1x6gHSHUX!q2gS*Q9*U3oFrDm09!+}o znNv=g>i$p3F;eFoDpY*VBy#TF-ZaX7g8d00$Lx899Tjr6AybIQg+Q>8$J@HPx){ly zJ*(h|l$GT}N{E$6Ag_puppXIrLb4K>k{6LYvb?-kOC*t^Vv;2dx9$jBED;do6_eqi zA;o(|OG-_i#IRWs&9%bY?X$dR%bT~YO zl~ygboLkO93JVuot}uJTb44UwlVQJ}ETjmAP$1AURx2{(g3m=YFRwKyb5pz7)6yb^ zr^|v{2VerM!$B*VS1h=-4CTzqSYKEmJNBNRlXJ~BUEj=xiq#@NEIp5Nj2D$PNsLJ` zRSoS8lEnpMo&banKQWZN8<_;$a2LUmXjEDch!m0!ATfRA7_hXP>#W6aRs(a>)ayqP zHY<-8gSQD@@C|_iW!<*H)AhEmB39X&oOR@p{$(Pv5x}DZ zMZCoq`BtikpjgBv4or!>N8Tf9+(5m7j{nChsIs7Add2eK+FfF*WGr~aeQnN-$LAVJ z>*_JEXJ?v=b5F^&vu-=y$?p<;_r9K%FI&R5@zym~uw{=7Ok`q_n9gPTbKLRD*7jrC1TZb0&oB8_ zzV1dxEh;NpmFn!q+nle>*nsbNC%#b=$8bASmlbvz628vgMsyG2vksS59E>!+O#ZaXZ}p!z)g2uy=H;nIK;g+`BV=u zG2Jst(ImGJ#9*m5!TerFm=OOh#q+Vdj5}OScU4@NyE#g9RY(cnyDQ<_RB&`=N>fPm zqAs*JZ;S2-K1%7GTlH8R;y;+P-Xo%HIW9T*J~d%`F@3dhdnxc)L*-KckjVYnfaMXy zd@=UKk2&?o1Lk~5Nn~*TND`@cPQGl9)!Pb-?C%dW`<;7NV%k%z_>R=zb5y-|erubj z586vlWy~D<{V9ms{#zC~uP`BOpNq|K)o;T(qV+8c9XIn;KF4@Hxq{{F+uU)4k)f(8 z?%S)BaHL<1Pb2K`(anVDK#PsF`lf%sjy7GwD~@iS*b?=oVzPO0ZA8vrTtAS;W6Ij? zm59&5bYOYa=%;HOfow5n0$Lf{BNj=@P5SAZZbfz!*PDfw7e{&A83f+~Y&Pa2fEKw{ z!j1&QBy4M=8*e`ijCAdjeL)fa@~l=UZKzN2(7KRHYX!){IQ;ziLd1dSD0pcoTaBT1 z`jQD4P|1MRN$MyscBLS<2O;g8g)+ru3s6`&_x=)ieb!E61eAL@^kz-eIG-B8>a(8T zEKVP(6GpPG-3`aelgpke9Fc^!F@;c`9$34V1>>x1i#SjuD0nNF`*k6mRx5M&iWhw- zZF&LaGn6G_J)EmP&4BA{L9qaQ?p4a52wp2&dbd=ywBt&O*~s^E@Ku9wRryjG?Q}r1gy|vlXk1V7fT!xigPuOmiI;KTWDI}0?>xb` zg(daoD9Fqsga^Fsrs8tZ`BDLQc!XiQP|oC4N17r=pegY~*6Cx$X_nY@e_T$Mvv>Q` zsk{D9YPdT#5Q_yOgiNDdQ=CI)oXX@nrW)~OI$jwSleGhl_3qv}X!gU&`T@A%q=KTq z_>_Oxz*qX!ikm@FANsC1)j^3`4U9vsk*y>Dh| z_hP!ktSuq2{>pCpemo-b?5F*C{ENeq?VY7N3{nhVo*I3(^?;REl|1-t?_Cf8seAO( zCio{lk6YY$ozQe5rC{mzxM0n1K{|zlE;r#!&)jJ@ZOl4Y_6lLsk;Xs$_L!2_GM`gq zw@7|fripwfD%6tk_bt6aR_?cYaL|CR@5yZ$!9qvRes(0b10ardE#wcb967B=Bx`lI-?`)Xh!D z44AcMcErshYLSXV2uz`I_D<{lr%k*Ff~EAF2d6txqi-nMfqMq683?D7HbX7-XG5ct zWah&znRlHl-;0&6wOK}FW7@g~lvZdqMnC#o(&#zTbnIFA7)wjJG4_5=i;x@zYP@6q zIrEv+vj!iN>^-ty=0456>ArJ+9`__$gGE9U+z0|(Ta@@3gXh<80{^aYvW1H+N`ss& zWU&4s@L4Tzr#EEK@5JuPW)gD0%g zdG6?2mnYZNMRO&=CR!=;QmZ|+B1byQ?F_;#(&)l+2BY3cZw4v}>H zZ`mS$TRWE8MiK=&$H?85d(SKURW_r1t$!W8R2uGCJzsLNySTPqPhh<9*4P$8h-YYK zy?ylWMq1-H8%&{Cy68Ww>H7D8_G&Q-DOZubv@N)UAO@TL>3_bD$Mpxp=aJ2qw!tR0qSqu?4Nz7r9rG-d9v4}o~qRfK_^1~4} zmb@lwIa)11y;RQbiDM7HBD_fO`}2D%2O|M#$}3}vvNAVDu=Qn9t~uxHV4yr&eu21> zC(*WuNfz18*JqJYAQz?Lw!Oh}r^pl7 z2igs-AwWiuvSr2C=pHiA#KgUISN1do@EQB`Wlop;^OgB|0o;zE&|JG1p@NywSIy36cJ_7)}|KuPa z6|os(b5dNkNkh5+e0=8-j3D!ZfebH>F(d$QnO zlM`4fWJH5E24O{}i6s`Qb`~|pgZrH?Y69e|$)E!Tnsd>-x&phg5DMHQJlTAwdcHR! zpzO6tXj!E6&x|n(gD=WDFU72Mh+3)|@aNPE__@m`hB=vzGO#MeTOYea126KZ-8}m= zc)-%5vfrKCURI;J&zZxjnDUaF3HgJd77g^GEBG#p$GICMXh$CYd6a-kQc;7rth{wcvMInJb&z6-a|=)hDg{2K-$qSUV@NS;-aZ4 zNcL&*{B~&CPstpM#CTwxu?i=tu<{ruDeh~MBSTCFi`7g$z27!ehHz0JkzHZjX?qat+l)TAl-tH>%$TCH`9#FVQ)s3728XLRO_~R zm|NiGF7xWIkSl=P@>9|Rlx(Q5b`NaDgcr6N44Fx&ak4SS!yUjHdPHUbhZjyEL`b^L z`)@dp^UYF)(c!lmWD!vnfRv+(FdMjCsFJUI`wm^X?1(xJMEs(u{ie%4W8QAs6xyWg zo9veBpdj7>jc(Z-86?)YHp{+o6`@MhQow;b?=`01Y|I-sQDyH`r9qLcjpEVe#rV7L z9=flGSRK25x4iD|*JVww5*pup;fq1qABn_F5!jn-;D~`Jm(Z@;*Ba`937mkXwecVk zVJ(Xjv?&qjLn@ z{$XI`dqi#jUtqhy5Fl}1Ml}N$AI9@OmehW%==wPR0S6B5w{y?kVa$fzFc%kcB%Bx& zHypvs=-B?9$Bw@=^IUEE9eH^7{fBxky}zS+xAXeGK+Zg5M&LxBeSDPsNQPtOerK=4 zE_ycDu*{_P*bFM4_n&^6#1nOkCn~$1Oh_J3rQnGr;LCj5tG%G^EeXNW*w9D5X#m=` z0^=hv&<*$dy9~%j4UFV_ZAe{gM~hbJLV66?l?G-Mf<%(3KX&+59jvDZS`r_f(CKWECuZ*WpaFE@aW2*7ivgGW9UJu zvk?aVe7d7H;*3h3ho=)9Rq$|6KlFK+0~d}AlNS(py29@cyMsF+-FY&egbNKD`)Xy zn$%HEK#aG`mQy|&VZpSfoZ`%xXaQqMBM1XLQ-M0FPkZrMkMyWAa_bT4TYPL#(~u>Uhnian`+Yy~Vw%`jNO#`-~F~nlA1!&zyL3al-cg#P-z0x$hH9iAl%B zc!NDLDkFt%pJF@`!n_tIAMBX4ikkdtHg$T}RA0(eaAs(TeneQ+-o5%UB=6AucGF7j zP359foSCNJuIYxU=|h`Wy6d4FB+A*gcHMf{Im+bPm0&QkQHns1YBYm6; zAifMBBBPk-3kqTRi{eA=Qw0i%x9p-@uP5lxKpTdLB9-cBR=zGm@H^ucU{+pC0w@0l z%{(7DZ^CWvTdI>6mrT#UT9j=0+uxS(a_u>CKOJ@Lxv!YAw(JoYar&|`K6xEsndIRt-b<>e}(dvFs4GR~wJ@WHZ z(j-A%TtgoF{u@^gxY*|3Hk)W~bdfIZyXy(8PXl!^F4kn&7pJI$UuyH3-Ji6y_V-N? z3wd=h47vxizb0dDK{jmo{wkZw9G#Ii0i~2$ShPNB_kZcF2#;Vn1!K5YV z(rs2|*Nouas8$KsiOEyL3m<-gI4GSjI3(inemQAwhda|`T);Ew1&rLE!u~1&7?;0( z1eKg|GkjWUyX0j5@6Cn1FZVG}&c&`#q7Tme1KFBj@j=*s5D}o}*b%fIU?FBOX40_X zEYB`4$eU;0dl&gVOqsk8d*FlFW({XpEU#A#<+GZ+0a-HPk8xTZ8{Nspuh!3e7~ZfN zvEn42GcZ4fLzV3PwC0WCMxhAWo|Ie@zSITDztrCcKL`XYqEE11T`_<4478^~-mH$$ zcGfAE8SjLdlHtWuNZvRa^3T%efB!xMN^H=94ew*4PO^Dw*nGn5K+-3n!!H9VC~m)b zap@&4Wf5KBNk0_U^6x-}-R0^pFITR97T)(o6>>zV=8R1MEQQ?&AU5rTqML+gX|bXmN?I|%--Z*um`s_f;UzB z{3Yb@mq08kfsTsh`lwjnNTaAQ8fu@?_fXvXC^jmN&V7X3MMuTsx8umDa0&<6-iV6E zaewpoLljh~!w+2!G7dBM#YDs#16krBUDCH*cfso;AdXRLz*sR1UofV55U7$k7SBZo zg$r{q^>%`I47_(qLe}tesmo_a!ReVt{%1YF&`F-y-##zLz>{pSM8?X70^c8naXN4u z{>Omf`+aOQ*Qpf=poSm+dA<*svF~Lx6BWdML!$kOV~AGE!40 zGAd;jU6&u7lGmH5f2CLYA8Nb0_I~}tN3IlMH83(DFzRIF*0=50*dJk^wi-%*M&v)U zH8}Y14sT9gb%ja9zfxtf0r^Ku>sVDW$JBs^Lq`>Tx zrbaKbXR0XKA}3dHPt&gKK!h1frb5wT!<9o`xUE@qNev?Mbl=Mc(zpjBPK`C2RN^e#uupOT9}uKDg{PXX1#FO zP0K<_2GYV&vZ3)uilySawO1wgaA;Y(P9BOp^1|U8Lp!K?Po#3R-JZzNr%B7cs3>vaV6>$K-2wNPRh5^?{^?iF*)aP57(Pu3k4Qz5!vzv!@l z!C~Z0_4);0e`Jxx)QjAwZtck&L+v_D9dii{Z0LC+6+;#|B^%cko-dsq`0ZVgPU}bG zk zxPC+&A)wU#gVnA(2v;B(5E~Z;ERKL;zm5H%=Ev_a+xePnS8~NQhXAtjR3f<%<0D<$ zx9nP$?kHBUO~3o#MzCJ)!iRsU!Ns2kK3J)5&FlVJW3YZ(os;zpY?0a5U^KAac&2FI zSbSU7KG~WZo5m*t{==!exBqo+>}R4;a^Yc{+7i)!x=}K*^h3th-6dncr1l9M9*~UB z@I%Q7N+jF}i*Go9l8K{iPD_R3P5&r`1^1vn#NRn`;+I{C$cY$-c4b$iY^y5Z2!Dr9Vy_$UQ$7xEI{z- z4fW`RY!-fI^#;Opt4JQyDGl5uKA*|6@`)sMx1zH$zCEDHQ!KCkTG*qIACA%+ZuzDo zs)_MyB}c08vf~#Bm|P~WD4t;LTOgWdPq0dQ!rD>65GvIoWIM=j@=k9GS^=~{pJV<& z1g+3^no2Q{%nRcC6)x1F3P!6h=W61z#X_)pE;KCKok|b_F5eCMhvPF^lN5Nb) zrWligVmW6C`t)XrS@zW8$i0h0miV0y>16|90>(dw{rBTcG&Qh22P|1xZn*3^b-K1{ zvg~P5;ssc9^SQULGFWY#EwAsbL;Z79M8AydFC`R{RF)B#6%BKvPs_Y%d;xdg<%=3s zz4zK3Gj4q&;QAxtt&lUD*^Pc-6aQFBk zD6ubH25&pk7`)ojS)%)Cxr!^a2Pzm`)^QTAZ2VA7W-GdT@bpc}N? z(ibt;tVHw=63|rARne`Lel1jC;dR?S$(OIu9z;!5M+PX#xFDKqZt5+$IF{T@x-pgf z^+56LnB(zFqh&rCO%I*lJLZt!!0Wm7#|sAhO;nJ2EP*TTRqHOo^W%NWhpKs7SG`Qg zMrtX#r3ugD#`ALPT2l+}c#%2QBUc0e@jAae!C9e_-<)` z{L>*%iTU~O!)<-f1>%nXwwx2PXdQjNQMYz+VMN;E(ecQSoYYsxmYxT&R(=l>fnc{JjZ`C@; zeDwVewC?twr>xYYgUSZq0t7OJ5Cu=if~u4E8`@c={s(Il^UQ4R&N*<>nN|i#h&$l{ z?>nq!ZgOiz|DCzt1T2oidF%pm5-G=c_uO z?G0kr7p$g-f;5nyCU5`d$1i~Fv{)*!a!e9S!K(Yz9Paew3;X7o>2!W?T2cOFHEy!#+^8Unq#GdM4yx9^T48mkkv&G{tH7iq{qoO-QJjm0P zW^4ZrNBEB_CE+Dq1q@uh@pB7x`!@$WoR%U|&(FWCeyrjSie4hjVQ|l&30kJ3L|D!) zik7n1tm}zafxLe;Mn09n1Ei4s4zep2_rUGPKwpwtuMtZhZ zS+-6`w%%;Efn_!?Hj~?V=Js5}S|C+muO1FGWx(ed+^W{zQ`dvtX?k+`IcCfV0>Dj# z;VBghRW{^E66B9LI(RChi0+@l%#aB{Ht=X~QVPFP3vam{zu8fECsI1m~{sR@1~T5Ylu4*s1clNVlKpZxP77Z21I?ZZrlpJz?K8RFc3(A7*1h=@pGu_Hi^0 z%J^p%*iyD?gJ^rD^zwGI6p6M{6M<9#<*ljM^q5_u`NdWK=vExoguXo?7vN zBpk-pIYh<$Ek_*!P~b6#a7OiwtSjh#5Rc2aSevNu!)iu@fgH=Jv$S}OS5&RCc2J> zH&XQl;J}zm<0=+h->5U!_9p@R(4nVg@S%0ywUrz1G&5okqB8)r!|A%W>Bez*jOH(7 zUMwn_g$gO8g^`rFXE;nPW_O|4Nj4^dfjL#t5XLJ1T7EUVLg=-XPhuhHg@p-B*a(aC z!Pay28P3@Hv~*B~d<)NQ)x3ip$uO2dB><2i^Hv@ma>2lFU{H&Bqw}ds^Ew)aIs;N1y3o^woR49MqeMo4#+G4g&N53X3U~KQ7&xA)D6tznnv+C-gN!N-ZRUhM&h1UlUTm>Ue}plhdYVrvuT7q z)SIuBx-9maHy{qH?%BNFXJz35n*>SM@TCqa*P8K~3KDRF1Rk6> zL5R#m?a*yDC@+pYZvJ|1PwG>I8|kzM1#~2Y!kC`!1tVU=p1bVOn| z3H2=^`M_o4xd*5lXCB58Ikqk3sM;0e-A>fO*AHr!8}Ew1#qY(fFz|&TaW^C&Kt`RD zx_tfO_1&}`yB}&^e|v3{f*QRoa{8*sSf`MjnnyV1>eXMqGHTUV%d$KkW|49BQrD2d z6y$w=yC`;d2(zpDOLsH{8BVi#8G&NiXa`b|u?W=m@9t3A<25qs>+Q$feB#zx_h;R< zojslRm{8H2fIjX~0}iys<@)r*gE)t%Ap(MXl4WHa0Gm~k>cW_)R#5wZlwAP6OSl;& zxQRSEe)Q=M?nU??gIx3h|4e zrjHJWvXDFEY%?k)hw2y~C+s`V7%l}|Dl~(*ir&(?vs|RJaK!J_M}!tx^x_|`2ekz<0L1X|!XMm@aOKVIXUM~}$5BkwKSUiP z38e$Ig;TC0jC!3WY9r}g`&369-=H3bnR$z$f^zypC(J@jv@x5K-CNp=og?@-GwRjH z(afV^jJ`wIkypI3uXkHwv5+MW+G7c6wt?3wolK~Lij1f7EblJI+gxSPXIlkRDs0N& zfPnsJJ^tyJj|d&wkXr@6*_p#<2}$F}?@OK)!h}Ie)36;IawB;rTSoPDh*sfLW1L}Y z0BKKx{Q8@djO#x;S= zuGlVA5N;|Qhl)LdQVT*xHBa4WexZFHbZ1`9@}?Hz_^fe!ZQ@8*GR)m%_v|N~!9!<0 z!8#xGiR|z~Ctd=1midtT(h(Q2J8YkbK6aVl-YQi7fgz)edVip+#Hh%UxyKHF zI{6u-^48CZT~~$WaV7S66L0&_uK2Q{E;}9xFUWxE$(1||7s9#<5PcrBC&M>b`TA@K zk6-j*T-izyuzZI4eSB=?tVmE}9~ZQ9#=+6KJh1z$wx8wH1#c%N7~DB)L{)p-vd4@9 z752SK%7OLC@Z&)QSB+ps<1N!lDDh0IHA!^IlwGK-iol@;a|)$B1|vvSKkh9DP--1= zmfv^@OWZ9?F0u(AAtnA!1!zCPe?VKX2fDDvhg!u?`bCqOvfN8tiAhB*+p2hHCLw(IN8|=|ctr02bZ$KqRIt z|Er4hsHvyJB-q8Hr^9^mB+YrWU(}dgC-DJNrY|^}`4wTo#ScArmr0T@*CMag%e%nBDHg23=@FE)00#h_b{pSk3oxhbhFpTK(w_ z<$iZ7q91Uf3Ubv@$yTaA^+%WJUrg9rE5|>-IUbh6rT1S51>d?Ju+Qon_U9(BJfHvJIl0?A{6wr`6 z8R-JJ190}C^SCl^IIO@16z(m!-*oQnQYv)H4)kV2A3|cTghN{RXd^OwVjs^%&QDjI zg2`2|!Z(^T1r`|wlqhlz9nVL{QfT?7l5Ir6e?vSEP+=)Do8SD=>E!N4Z{d`~+YTzy z_ecE((j6a+A@0}6*}3`O_jUO3nT|F&ancc6Uw!J zhn`CRQT?&_e7S+apMIrJ);cMTO$qR2bTqlH)gkQ-KaYZA5?6}w-`ugnw8XfCGyi|? z*lDgO;eY3jHPFmc3y2yw|C1urnH;Ui6^IIW)D;lj(bL;^#;$E}XqcAW|NO;&7TcuC zr_(bxZ#Op0E-uyF?@cA|?S4G5wl?tUB=da{u!FSuF%UJJjT~LNPn%Bng3(=0uLY7$VPxsS>pDE>R2qNa4BrKMQul^q>LATJYyR; zqc|ng{yC;O?aWnu+o|`jc*-Y(Up#uSwaTpXtnul3xTQJND)lKK!}NA$ZfA}4-L6MJ zw@$d{oLR+Z*lB-Rd-JSj)W0je>Es3RxzWduIUE3`#iGEHvo#{^WA&_T0hQ8IA}ANF e(vraw(Es$n@_K6P#R6gFQ=B_|62Z2kvae+4N3 literal 0 HcmV?d00001 diff --git a/en/bilder/gif/raster.gif b/en/bilder/gif/raster.gif new file mode 100644 index 0000000000000000000000000000000000000000..36d13ebf650cb25a4247fc8a483fb83387d7175d GIT binary patch literal 7270 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 literal 0 HcmV?d00001 diff --git a/en/bilder/gif/sspicon_.gif b/en/bilder/gif/sspicon_.gif new file mode 100644 index 0000000000000000000000000000000000000000..3f51b52e0bab527bc626be1432669408bd3479be GIT binary patch literal 2723 zcmb`G`#;kQ1AxDq@%?T#W}BJYY;)g+p@cf+GIvLA;VpHB+=|l(Ipyul3}X@AdV(43PWcwpFDlOxcvB3`Y+E{R%Hu|^Rfl$?A$}??94+c zq=wfd=?spH;WdfJPbBSfaQv|GNw&BootqCi%rUXC)27f&ELp0WTD~D+Z$53trJs>5 zE@_*XY3;HvY`6lRN(T>wsKy@y6BD82WH3G+jEx1OqM##3KyPnw_inYA7=!e5$5Uy^ zB9XC$g(i`>vAHS8$@!*Gyjx$FKYdzUQi6{;3K|*eL~<;=y?B=@K^sf5uP5Wk!S(H} zki_^c#rJ)#E+Y@daV#?sr~Y6@0-5L%$-2U#f{e^xMb?1O3sOVfAL@Jg z*V^pz{HLwYZ{EKhni?suuGsp%{eEM8<@M^uw@)9wegsh+j9)o85ig@)z>X zp3cY5A9vsDUV6MFotMtc&NMYQZU1+>rM0ELp}wrV%+}e;+{Q#tUzb3DA|ih3?(UKe zXMA4FuPpreYWeX~$9-2OE1EB*9u8rz&tLAjdiJod`MuiMlC0>3d*>%_oQ_Nhv zT@bp5MSIyP{61cG`BY$wfHPK=@~!{;+T?9JQ~l4k@|Wr|?wn6uY527yA*4O$xThV{ zkG=O@b$b7W%+-#|U$0~-dae|nI68Z|poO2B#rsuWU;Ok^erkNocH@6e?)RuoO;p@# z=LPQ%cCcd_8RkU(#61|Mg@ib+E*KCrBayD~c=p!T{T&_oJYL#~6Qd&|;_KI+JbALb zyeyN+=H}+4Qt9;c^wiYU#Kgq#@NiF0Pfbltb#--RWu>;ZHjzjq5D0iYUPD6zgTbIs zC=djJ|2Nbv1ni$C^B?{5gcGCyV33}txTY@)!qdY&#S46f>*+5tYL=dZ-p)N}-{IAq z5nc77JZ9Pi4ZSZVuyF?-#OOGtzLv*7Z1nrhnZUh*Z7|ivC#`guQ;n+1K-F)({OjI0Qqr<)&>mN ze8$JQYiH`-=XHq`@6&$2d;8<#3rz|YweU_Ar1$|S!6zgMT}H9K`dN=dfDigHD53b}+jT_>;2IucAy~@vH}d zs8_53Ykab6yqMcegZz_$$~*uY2)$Kl?+>hH1&pvQQhbZFcoDZvA0VL zAy{F^Q0@qH`tw?6zPO;O{&f!D4TD(X*$);*y}j`q>(lB6vg(%@DhMrCRHqzwIRh_!Wz@VhN^iP75+W(A)S(NwzPnpV^C`&S$XZbz;v_PE{U9MdmgE0#AX)0j8pTf)s{L za-~J+*_^YgE^ceExZ1!+(Y;>J7|~mb+A0`uime%=p1WquV&VCXmHVBdPAA-Yssg~h zG9rembyTedgm@XXP)P?S=E2~IhpMdNm=B|d73}0O^YObbNaJE@vdH*SIN1px-W<+E z=(BD6J}+lAcR3^EIBPT%?lDRm7p7db?&)|Uvi>83FSMa2$bm-v6!G$onT_}NcS!pV zT_?4{k{dX>*;oOE>91lZ;{{E`JFB|0;D=UGjuNCCIQbBh%=$yx0xN6>dW3ewo{lfdLM}jcSVgWG+nqEmTn_8q)fI4W84JKf zvLO|G1V1rJ6|=n-LVm^)DvDsR<+z+(B*|cw5d|4Y;p-&H0gzjJ4)J#{I-I3+p41Dd zO8|!sHM!GpJC#YH#BhPV+41XZNQF4I`TzISNa9jkcBn73u=W`9& zw@-O8$c^rs(`H`LPaGiegvS7dN@B-MMgl{i|#Sng`hQ!gLeI_&yiciFYK?7}hl(gYWC$60>8MyQ+)& z1-op@4}TGZ+J{U6tyNnO@QEF-bOK!ikY2n<{PbHl)~nl)2~?Mu{L7Nw3n254x_B!= z=Tc#slQPpNF+SFQfI+j)Gc-5XEO|IS_qnvqpT|#cC|3>)fX#XUh9ng(4^=MDMN5o- z){s58BqucMYr~LBO)eOC8G=pW<8BvKT3$G+dZ^VU;Y#@sGnp##ui+D}#kuVTcb=Q5 zgA=B|wyh=wJ=Mr1`*SU5ez`sVQJvpaVr0%P~S z{QG|I@jayM=LZAOcnJQZo|%5)u>poskt@pOOQ!lc4uXt!wvG@hIgojxPy(Rc2e}`o z!t$nk;ke@TY+glKo>y=T?z|B3!ZYv(za%;UnJq0Wgk% zb!C8vt!+pu*cPzZb$dK$A^rfekkp`M2u9!_|Cxa9|#zL6p#U;fHaUebLLD(N5?9lz$%7SUSV^fx49rsQ zF8;x~Aw{W~K(3C0OHpZZHc*^_iCGL?P!}l5sOy`Vmy%jsl2)3RU6PrfS6rH#mYA2W zkk(iP(+o3>fl=8hvm`gMAT7TrH?c$^DK!(Oqy%DL9s{!?)JCX?jsmh4kcE71i4|}Y znZ;0@3zP#nRS51>kYbQ73HPGJw9M?1#H5_mk`jb|1yubgsz4^mz)eDt0-Gu5otT?i zl!!1)64fw>G{_WDxG7LAASdbI2{|;A83lb)bMuQTaaskDMzsp61!R@5Z)yq9`#Gry z1Ef*i3R3_wLLBZ|m?+r0dU)ImR|wV0z$g@ulV4JjT7<9>EoDLFK^7uX7EBY!(fCpp zOdZ@hS?~P(qLj?M#FEs!;>zNZ)ZA1B9bh770ObXCj%N&v95Nmo794Em5Y~!0v0>ri zb{=MrIUW<0jyNL=zdh@3mSJA#s?yhN zY1|R(E}fWk(d=B7Nyd%+Q>;%P;Rq>lU7qDVd){ipErD0Kx<9r2z5Mm;Qj^?%xtGOe Xc~kowKhJwrx#Q#G6O)U1I2fz}q-$_y literal 0 HcmV?d00001 diff --git a/en/bilder/gif/taskman.gif b/en/bilder/gif/taskman.gif new file mode 100644 index 0000000000000000000000000000000000000000..d02b136d58d16578f73cfda144deedddec413bef GIT binary patch literal 13646 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 f!`ZsYcV4U=)`#}?74QE8s5C4W literal 0 HcmV?d00001 diff --git a/en/bilder/gif/taskman_en.gif b/en/bilder/gif/taskman_en.gif new file mode 100644 index 0000000000000000000000000000000000000000..05e622a8f87e08006def2b61e10342aa14f2ffea GIT binary patch literal 13004 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 literal 0 HcmV?d00001 diff --git a/en/bilder/gif/tpa.gif b/en/bilder/gif/tpa.gif new file mode 100644 index 0000000000000000000000000000000000000000..d0f5df223db3e20334c3c515be27e1008278a336 GIT binary patch literal 3072 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 literal 0 HcmV?d00001 diff --git a/en/bilder/gif/tpa_en.gif b/en/bilder/gif/tpa_en.gif new file mode 100644 index 0000000000000000000000000000000000000000..6caf984d1559e5364b53587ff97a01145e5b51ee GIT binary patch literal 3131 zcmZuwc{o&k8$RChzDlWNYrGT^*;-CSN}GfdWl1!I972{5SyC^uZ;2d2p}|;6V;hux zKTP&z8p<}Z6q9(Z=lhNCy1u`@-*uh2<~h&v+|PaA&+lB;(ojBWafhP=T7n=P$06|h zzX!xP2yr@{e*gacV(|XIPcb;)F9=`=LLdl*AdKAyA{d5X1cFfr#vmAHClMGz5C}mb z1cMNqU5mmHia;m|p%{eX>{bkhFa*L-2*V(ZJrcrU2uC0sg>VeeVgs|G0TyTm)i`?& z`+xyeFpR-4&K`?^7YK}?FoMAd&SrtaFp9t^3Zoc|;%ri&7DHeRg)t1qaKI6?!Z-rs zD2!t;4yFRu01S`@ECDT$1A_rJfCgBg8D|S($Kap{f*}ab)(6Id2t^STLr|P87q9?H z3`H;u!Em4+kOH*`jv_dQ;6NVm1JDHBzz(1vkN^q+YXAmF1D2o^@Bo7WHh>0LINLdP z8pPmWD2lU<1p2^O5MdaK;lNiQ7q9?H6vt2;_z0W^1^`~592gDM0xN+ZfF|e$b^uO5 zFi;3s128}ubOKs{2N(>n0W{8D5xW|sK@1KKHU^9Y`oLHaVVl>8?d#^g*~!fnvTfen z3cGgGXtwK{-mzOZ?O-oqQz08^lQerLn>^USo6z7ofGq*@fF>3MO@JE!K@yvLce|X#a@~BnID=iAC zElJsR>Ps^vla_kUf4hiwVOB@FW~>acr7*i4(tCrvm^v!c6L>S(j?vO-*PFYmT4sUp z1L&&d#{7-r1h2$J@4?tLV44q(=VM zHd_&N9&3n`xRMvHLit7uSMd-HFa2p-AFIEMUtY+4x-b4xlIV_AS&PBP@_ie*Wggdi z?jNbbjh|Fcc|4fL3Q{$GRIJj*dtI0~sr_Zi!}&gH=2Cl# z)W0*;ZBlaYPJ8(>II~NJD?8onJ5x9{OkDn47EJU>UT310?kY}x_1~=_{Vjmc$o5;H z5Rzr_jF%YSZxy{wNc<`11rMQr5}sy>s^`x$)9xIJ?6wSFZPS#{P#WqdMxMG+XBG8v zo$FxO#WLx;F|J~_(x2-eYaWWZmc~CGsc*E^I_?@VL^9lzOd5|je;8trVEFv-gpe z%X#kQ_OQ&T79`= z*~#)(u$dE&DSwm=vE{gJv5x6rj4Gw)SEwt;Y~p9SxX4I{fiTgbDfoEap4VFMWHNe6 z53LkFCgv2mdHt2>In_-fku6;`1a*?WI64UmJ}$@)+TXO*75BRR*5#efLLTMm_UW&| zsqv+ZjW$7%o=h)on_&-f5IxURg3D|u@cX_+`<*qJ%Y9LTBGlKhL0*d?Sza4TUP=DF z3mIurH+#p!|F9Q$PilO2s`!O!(rQPtf5Pg}Ln$G_=`02B)sgqHDa+sYn|NnUy-i6- zo=)}fGq*TfESftz6y@YQPdANP{+;;j(Vdm1(T$J2UaF2%tHHkg>okd}BM*Q3)S6}U zl%y3N4!hr=uSeW&Q^n*A^PCooT<7CDV@H(tjPp0-5L7HJYi@BS_#`>9md;yf=^9BF ze&sydnSDSd+eLY_3qQ4ZVOxV95q7g^v*gVy*R#JaW?-g=w~z`%6?QvgIj?szC>KSM zx!|HzVkY73heI`E#tX6g2M?V5C}wgU(JhP-;HazE>NOuGUv0Twrre;lJfmuR)k;XK zyJ58>D#T?bDr1B9RD;;{5IyhhwSQ_gT_CWc|DsEboXV=&EiN0aA~sUrJxMw}b=}kY zLx%RjZ2oI%Sga0*b)~x2J{?lP3+?lg6$UDY^wR?3=no`I?;N@kUByyyNfU1mZur=c z=M-z=m=PKil zw92npnvX}JwNg@X+ZIuZx?wtLL|T(JrgJnjK$szUEEw0q#eSw%T1hyq7+^rsdwBH$1<Ag|lfp;bA2TmqG&yD6 zVw+qZW~ov8vV_XW_xawcKl6aB_e5bY$>ZX^wV_EW%YggwcvtpfKv~DbhlRe>tCruV zwyAk29rp{&*)`DLTj}FSkv$ifBs^McSWs-Bd+-I%t)jzq8H;?0XLn8{oa>iFcjI_0ynB%KtXpJ(y)mC7^4&6XjyASaVx$f7G)LWUN9nNw8M93u>wIRB{k`Vn zMSb>N+^3^HygWbc`_pGcc36{9{K>BD$YcG#de%d=D>p>AeYaF3aCH4vsU+JN>6-N4 zB>Y?D;m&_kwlry}Xt7#IByDvNX$-jWGdqDLC&53a8L!ZD&u#BFUh2uSyH@lgA%zr; zeYQPQ3kBr8Mn?n8!->3G3QJZ)T~xTW$8bjJt3TqhwToITe!I+6oGEY!;+9cn`6@M+ z6F&sS%#3k!tGrvUJ?@gje{BJE^`tp`BS>aV=vXS_uWdBQI@~_v%A*U8&O8L?2V9n# z5li*3z%HiZka< z-qV)QtCv-i=3q>9>Bq~yJ)t@td3Jfqh&gUfAr&3HOrSLpJ`=ZYxS8H)yZwABpqp~ZfI%Y@l`vL8g60$(?m$=34*|R5}ZVXZoXwW0Z}997p%(B zDS^3s_urc5{v-?tr{{lKYWw;4NLiip4S}i>?*>m=Now4Qf2+^$Gz+9S4e*pWU6e5U zs$p+BAe8B;2Qh_Y~{Ha-cSwcG(t{@&jT zwOe0456Y-rO8MMl`swH2^J}g?wXxp!N-X$86yjA{Wv?yU?VV$_ty3p%MgBtk+B3|? z=UcRBu5s;D%v5x3O2^EL_ZYKDwTL-+Z`cc_zev9+B|cEy?X7^TUD9b|{Wz~ME_~AY zv%Y-U+)3K9h5oN@HPQC(Q}RB3-uUX*cM1n;R$-sPv(&Y2-O80d+QwozzCIUKxyIDR NSLo(nI5;5H{{XH8NofE8 literal 0 HcmV?d00001 diff --git a/en/bilder/gif/wr_modi.gif b/en/bilder/gif/wr_modi.gif new file mode 100644 index 0000000000000000000000000000000000000000..0bbed1d0b74dc2a13e7928be92088251dc9ba5d4 GIT binary patch literal 5558 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 S{*JSIM3V&iL%6s=C;tZv;EYND literal 0 HcmV?d00001 diff --git a/en/bilder/gif/xcontrol_en.gif b/en/bilder/gif/xcontrol_en.gif new file mode 100644 index 0000000000000000000000000000000000000000..01522fb0acf6c3171ea5848a83d68d2de95e9d37 GIT binary patch literal 3947 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 + + + + +The documentation for TOS: The input/output channels of the BIOS + + + + + + + + + +Home +BIOSBIOS +About the BIOSAbout the BIOS +Hooking into the reset vectorHooking into the reset vector + +


+ +

3.2 The input/output channels of the BIOS

+

The following table is a summary of the channels which are known +to the BIOS. One should note that further channels can be installed +via Bconmap. +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ChannelNameMeaning
0PRTParallel port
1AUXSerial port
2CONConsole (with VT-52-sequences)
3MIDIMIDI-port
4IKBDIntelligent Keyboard processor
5RAWCONConsole (without control characters)
6——ST-compatible serial (Modem-1)
7——SCC Channel-B (Modem-2)
8——TT-MFP (Serial-1)
9——SCC Channel-A (Serial-2)
+
+ +

Note: Output via Channel-5 (RAWCON) can be +appreciably faster than via Channel-2 (CON), as the control +sequences do not have to be evaluated. A further advantage arising +from this is a greater supply of characters. +

+

See also: +
Bconin   Bconout   Bconstat   Bcostat   Directory U:\DEV +

+
+ +Home +BIOSBIOS +About the BIOSAbout the BIOS +Hooking into the reset vectorHooking into the reset vector + + diff --git a/en/bios_cookiejar.html b/en/bios_cookiejar.html new file mode 100644 index 000000000..a2f9afb2a --- /dev/null +++ b/en/bios_cookiejar.html @@ -0,0 +1,10619 @@ + + + + + +The documentation for TOS: Cookie jar + + + + + + + + + +Home +BIOSBIOS +BIOS error-messagesBIOS error-messages +VT-52 terminalVT-52 terminal + +
+ +

3.7 Cookie jar

+

The cookie jar was introduced with TOS 1.06 and represents a +generalisation of the system variables. One is dealing here with a table of +individual cookies that are defined as follows: +

+
typedef struct
+{
+    BYTE cookie_id[4];   /* Identification code */
+    LONG cookie_value;   /* Value of the cookie */
+} COOKIE;
+
+

To be able to work with or use cookies, one first inspects the +contents of the system variables _p_cookies (0x5a0L). If one finds +a NULL-pointer there, it means that no cookie jar has been installed in +memory as yet. When using the MiNTLibs of GCC, one should use the +functions made available there! +

+

Any other value is a pointer to a table of pairs of 32-bit +values (the so-called cookie jar) which may be used for a targeted +search of the jar for given cookies. +

+ +

When choosing a cookie name it is imperative to pay +attention to the following points: +

+
    +
  • Identifiers starting with '_' are reserved for Atari +
  • +
  • The cookie-ID should consist of four ASCII characters +
  • +
  • It should be possible to determine from the cookie-ID which +program created it +
  • +
+ + + + + +

The end of the cookie jar is identified by a NULL-cookie +(Hex: 0x00000000), whose value contains the maximum number of entries +in the jar. +

+ +

To place a cookie, one searches via _p_cookies for the +NULL-cookie and checks whether there is still room for another entry. +If that is the case, the new cookie is placed at the position of the +NULL-cookie, which in turn is moved back by one position. Otherwise +one has to allocate memory for a larger table, copy the old cookie jar +there and adapt the system variable _p_cookies accordingly. +

+ +

To delete a cookie, one first must search for it, and +then copy all following cookies (including the NULL-cookie) by one +position forward. +

+

Tip: Source texts for the most important functions for +working with the cookie jar can be found in the ST-Computer +magazine (issues 12/1990, 01/1991). +

+

See also: Cookie and XBRA list   BIOS   Sample code +

+

3.7.1 Sample code

+
/* 'get_cookie':  Inquires the value of a cookie.
+                  The parameters passed for this are the ID of the
+                  cookie to be found, as well as a pointer to the
+                  found value.
+
+                  The routine returns the value FALSE if the
+                  specified cookie does not exist... */
+
+typedef struct
+{
+    LONG id;             /* Identification code */
+    LONG value;          /* Value of the cookie */
+} COOKJAR;
+
+
+WORD get_cookie( LONG cookie, void *value )
+{
+  static WORD use_ssystem = -1;
+  COOKJAR *cookiejar;
+  LONG    val = -1l;
+  WORD    i=0;
+
+  if( use_ssystem < 0 )
+    use_ssystem = (Ssystem(S_INQUIRE, 0l, 0)==E_OK);
+
+  if(use_ssystem)
+  {
+    if( Ssystem(S_GETCOOKIE, cookie, (LONG)&val)==E_OK )
+    {
+      if( value!=NULL )
+        *(LONG *)value = val;
+      return TRUE;
+    }
+  }
+  else
+  {
+    /* Get pointer to cookie jar */
+    cookiejar = (COOKJAR *)(Setexc(0x05A0/4,(const void (*)(void))-1));
+    if( cookiejar )
+    {
+      for( i=0 ; cookiejar[i].id ; i++ )
+        if( cookiejar[i].id==cookie )
+        {
+          if( value )
+            *(LONG *)value = cookiejar[i].value;
+          return TRUE;
+        }
+    }
+  }
+
+  return FALSE;
+}
+
+

3.7.2 Cookie and XBRA list

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CXNameAuthorDescription
 x3DMNSven Kopacz3D-Menu
xx3RDBOle PahlThird Button
 x60HzJean-Pierre Rasquon60Hz resident
 x8*8Rainer SeitelFont switching for GEM-programs
 xA2svHarald SiegmundTrapsave
 xAB40GE-Soft68882.PRG
 xACCSSteffen EngelACC.PRG
xxAFntHayo SchmidtAES Font loader
 xAgK0Marcel WaldvogelAusGuck RAMdisk
xxAHVRAlexander Herzlinger, OverScan GbRVRAM
  ALHP Alman HP DeskJet screen-dumper
xxALICSven KopaczAlice
 xALRMTorsten LangDriver for DIGIFON TDS3000
xxAmANSven KopaczA-MAN
 xAMC1Arnd BeißnerMonitor Switchbox
 xAMC2Arnd BeißnerPC keyboard driver Software
x AMCGArnd BeißnerAMC-GDOS
 xANSeBorek LupomeskyANSI emulation
x APGMAndreas PietschSysGem
 xARAeARAnyMARAnyM ethernet card emulation
 xARTSMassimo FarinaScreen-Artist screensaver
xxasGTHarald Siegmund, adequate systemsWacom Graphics Tablet Driver
 xASumHolger Nassenstein, MW-electronicASUNLENK
  AVmw Virus warning program
 xAVOJOliver JoppichOliver Joppich's Anti Virus program
 xAVSVAlexander BartonAV-Server
 xBASHEdgar RöderBourne Again Shell
xxBBD2Michael MaaßenBastel Bus Driver V2.xx
x BCKWC. DupuydaubyBackWard
x BGEMThomas MuchBubbleGEM
x BGHDThomas MuchBubbleGEM Help-Daemon
 xBHdlSteffen RichterBadHandle
x BHLPThomas MuchBubbleGEM config-cookie
xxBIGSJulian Reschke, SciLab GmbHBig Screen
 xBIOCTiemann BjörnPirosca
  BLNK Screen Blanker
xxBLOWGeorg Acher, Michael EberlBlowup030
xxBScnRoland SkuplikBACKSCAN
 xBSIMMarcel WaldvogelBlitter Simulator
 xBSTEMatthias AndräBigSTE
 xBUG1Markus FritzeBugaboo Debugger
 xC24PCybercube Research LimitedCyRel 24Bit-Patch
x CACHRobert FederleCache Control
x CALDWalter HermannComputer Aided Loudspeaker Desgin
x CASEJulian ReschkeCasing type, Gemini
 xCatSHayo SchmidtCatStick
x CaTTCybercube Research Ltd, Toronto, CanadaCyRel Cattamaran
 xCB2KClaus BrodClaus Brod GEMDOS 2k-bug patch
 xCBCEClaus BrodClaus Brod Critical Error handler patch
 xCBDFClaus BrodClaus Brod Dabbel Feature
 xCBHDClaus BrodClaus Brod HD Driver
 xCBHYClaus BrodClaus Brod Hyper Format
 xCBITGuido SawadeC'T Bus Interface Driver
x CBTSAndre FelbrichCrazy Bits Tabletttreiber System
 xCCDACCDTempus Word
 xcdMCGuenther LeisCDROM.XFS
 xCDOT Crazy-Dots graphic driver
x ceciCENTEKCecile disk drive driver
  CFIX Console Fix
  CFsl Compo FSel
xxCHAMKarsten IsakovicChameleon
 xCHBT Changes
xxCHN1 Changes
  CHNG Changes
 xCHTWDirk HaunChatwin
x CICNRoger JordanC-ICON
 xCISYIngo CiechowskiCISYSTEM
 xCJARVolker JanzenCookie.prg
x CJar JarXXX Program
 xck01Arnd BeissnerCookie library
xxCKBDPascal FellerichComposed Character Deluxe Keyboard Driver
 xCKJRJulian ReschkeCreate Cookie Jar Program
xxCLCKSieghard SchäferMega-ST Hardware clock TSR Utilities
 xCLK1Dieter JankowskiMEGA ST Clock Utility
  CLOK CLOK for GMT settings (?)
x CM16Cybercube Research LimitedCyReL's M16 versatile installation program
  CNTSDavid Godec, Sacha Hnatiuk, CENTEKCentScreen
 xCOLOMeinolf SchneiderColos mono-colour converter
 xCPSLPatrick Dubbrow, Jürgen HeindelCapsLock display
 xCRACProtarProtar HD Driver
xxCRITThomas Schröter, Fast Electronic GmbHCrypt-It
xxCSMDCybercube Research LimitedCyReL's Serial Mouse Manager
x CT40 CT60 68040 falcon acceleration card by Rodolphe Czuba
xxCT60Didier MequignonCT60 68060 falcon acceleration card by Rodolphe Czuba
x CTCHEdgar RöderMaster-module catch.mmx
 xCtCpJean-Pierre RasquinCapsLock Display
 xCTSFLars Erik OsterudCTS Bug Fix
x cVDICybercube Research LimitedCyReL's M-16-1280 VDI driver
  CWCo Compo FSel
x DATE Led Panel Date
xxDATLDelirium Arts A. Freude & P. Scherer GbRTwiLight
  DAWN Before Dawn
xxDBFXJulian ReschkeDiablo Emulator patch fix for MiNT
  DCdd Double-Click Software Data Diet
 xDCF7Sven KopaczDCF77
x DCSD Calamus screen driver
xxDECDMarkus FichtenbauerDECDriver cookie
xxDEPINorbert MarschalleckDeskPic
x DHSTThomas MuchDocument History protocol
  DIG2Emmanuel JaccardDigiplay
 xDJBXRoland SkuplikDeskJet-Init BIOS extension
  DKEYBrainstormDead Key
  DNTR DNT RAMdisk
x DPATMartin OsiekaDesktop Patterns
 xDPRSWilfried CordesPrinter buffer
 xDRIVStefan HintzDrive Edit
 xDRRHDietmar RabichWodan Keyboard Layout program
 xDselSven KopaczDsel - System kernel for file-selector
 xDSSODavid von StettenSokrates keyboard driver
x DYDLDimitri JunkerDIR_LWR
 xDYJADimitri JunkerCCONRS.PRG
 xDYJDDimitri JunkerDosound_MPC
 xDYJTDimitri JunkerToBig
x DYNLRobert FederleDynamic Link Library driver
x DYWLDimitri JunkerWIN_LNK
x DYwlDimitri JunkerWIN_LNK
x F117 Speeder SST
  EBPO EB Modeleur Universel Modeler
xxEdDISven & Wilfried Behne, BELAEdDI
 xEDFXHansi Richstein, Kaktus GbREDPBFIX.PRG
  EGON EGON! CD-ROM Driver
 xEMNPJiri LamacMNP emulator
  ENV$ Desktop environment manager
xxENVNVolker JanzenEnviron.prg - sets GEM environment
x ENVRPascal FellerichEnvironment manager
xxEProRoger BurrowsExtendos Pro CD-ROM driver
 xETMM. NickEntmauser (De-mouser)
x EURO Euro-character
x EUSB Ethernet USB API exported by inet4
 xEXRAMarcel WaldvogelExtra RAM Speeder Card software
  EXTD TOS Filename Extender
x FaKEGuido FlohrFakeMiNT
 xFALTRichard KurzFaltoff Screen() MEGA STE bugfixer
x FAX!Ingo LinkweilerSTarFax
 xFAXRJulian F. Reschke, TKR GmbHFaxRedirector
 xFHFXThomas BinderF030HFIX - Falcon GEMDOS handle fix
x FIX2Uwe SeimetFIX24 68030 -> 24 bits
xxFLTPPatrick DubbrowFlyTop
 xFLXDAlex EsserFlexdisk
 xfMSXJ. Jørgen von BargenfreeMSX emulators
xxFOseHayo SchmidtFont-selector
  Fose Font-selector
  FrmD Form_do_it
x FSEL(Standardcookie)Extended File-Selector (e.g. Selectric™,Freedom™)
xxFSERFranz SirlFast Serial interface routines
x FSMC Advanced GDOS
 xFSmpMartin PatzelFile-selector
xxfVDIJohan KlockarsfVDI
x FxOP Tele Office
 xF_3DRalf TrinlerFocus 3D
 xGABIMichael SchwingenGabrielle Serial Port Typewriter emulator
  GBel GemBell
x GCOMThomas MuchGEM Component Object Model
x GDEVEdgar RöderGNU-C Device driver
 xGEHCGE-SoftHypercache Turbo
 xGEHDGE-SoftHard Disk driver
  GEMB GE Soft HD driver
 xGENVJulian ReschkeGEM Environment setter
 xGfixThomas BinderGamefix for Falcon030
xxGI30Andreas BärGandhi
 xGIGARoland AlderGiga Box ST Driver
 xgk5" Gerd KnopsDriver for 5.25" HIGH-density third drive
 xgkCOGerd KnopsCalamus Thingy
 xGLASUland TäffnerFree drive-space display
xxGLBLVolker JanzenGEMLABEL system extension
xxGMNIStefan Eissing & Gereon SteffensGemini
x GMTC Timezone CPX
 xGNUCEdgar Röder, Jwahar BammiGNU-C library
x GnvaGribnif SoftwareGeneva multi-tasking AES
x GOBJThomas MuchObjectGEM PurePascal library
 xGOffLaurenz PrüßnerGrow/Shrink-boxes off
x GSNDRichard KurzGEM Sound
 xGSP1Steven van RossenGEM Spooler
  GSXB Generic sound XBIOS
 xGULMJwahar BammiGulam shell
 xHABOJulian ReschkeHaboo Harddisk Cache
  hadeMedusaHades
 xHAMMIngomar Otter & Hybrid ArtsMelody Maker software
xxHBFSHarald BeckerBoxKite File-Selector
 xHcP6Michael SchwingenNEC P6 Hardcopy driver
  HDDR HD Driver
x HDEXUwe SeimetHDDriver's-own interface
 xHDEYBorek LupomeskyHard Disc Eye
xxHDJRDieter Jankowski, J. Reschke, Hard&SoftHushi HD interface driver
 xHDLDJean-Pierre Rasquin'HD-LED'
 xHDPRRoland ScholzHD Protect
xxHDRCTorsten LangAUDIODRV
  HDST Eickmann HD Driver
 xHDSWOliver ScheelHigh Density Switcher
xxHFIXPatrick DubbrowHandle bug-fix
 xhFRBSteffen EngelBIOS driver for Rwabs-transfers
 xHIDSOliver ScheelHigh Density disk driver
 xHMDUThomas UhlHM2 System Memory Dump
 xHMOCAndreas AlichHänisch Modula Object Cache
 xHMRDThomas UhlHänisch Modula Run-time Debugger
 xHMRSThomas UhlHM2 Run-time System
 xHPHCMartin WunderliHP Deskjet Hardcopy
 xHPLJRobert FederleHP-Laserjet-Emulator V1.04
 xHSCDJulian ReschkeMiNT CD-ROM driver
x HSNDRichard KurzCrazySounds
 xHSndRichard KurzCrazySounds
  HWAM Cookie Jar creator program
 xIBMPLars Erik OsterudNorwegian->IBM Printer converter
xxICFSDirk HaunIconify Server
x ICST INETCUST cookie
 xIDSKStefan BeckerIcon Desk
 xIMACWilfried CordesBootsector guardian
  IMNE Imagine graphics card
x INSJOliver GroegerCookie Jar installer/extendor program
x INXRDietmar Püttmann/Dietmar RabichIndex generator
xxiPRNPeter MisseliPRN
 xIRSBIlja RateiczakSEGA Shuttered spectacles
 xiTMARobert WeissMFP Timer A interrupt handler
 xJAM1Pascal FellerichButler James
x JAM1vhf ComputerJanus Emulator
xxJB2GJohn McLoudBios2Gdos
xxJCLKPetr StehlikClocky multi-utility
 xJCNBJens C. NeffeJCN boot-selector
 xJCNCJens C. NeffeJCN multi-accessory
 xJCNHJens C. NeffeHardcopy program
 xJCNTJens C. NeffeCocteau word processor
xxJFTPJan-Hinrich FesselSCSI driver for generic tape devices
  JINX Jinx
 xJMLBJohn McLoudMcBoot
xxJMLSJohn McLoudJML Snapshot
 xJSHDJürgen StessunHyper-Density control program
 xJUSTRobert Irrgang, Trillian Computer AGJustify
x J_ScJohn McLoudSECURE.PRG
x KAOSAndreas KromkeKAOS TOS 1.4
 xKbEvMichael SeyfriedMM2 Keyboard-handling module
x KEYTThomas MuchKEYTAB
  KGTF Tos Fix
 xKIDIRobert IrrgangRAMdisk
 xKLMEAndreas KromkeCMD
 xKREGJulian F. ReschkeKill Registers
 xKyMpEric SmithKeyboard Macro & Remapping utility
x KyWtManfred LippertKeyWatch
xxLaceUlf Ronald AnderssonLaceScan
 xLACYOliver MichalakLAZy-Shell-III
 xLALALaurenz PrüßnerAlbolala BellHook sample player
 xlancTorsten LangMiNT-Net ethernet driver for AMD LANCE
 xLASBKlaus Garms, DMCLaserbrain
xxLAWCRobert FederleLook-Ahead Write Cache
x LDGMOlivier Landemarre && Dominique BereziatGEM Dynamical Libraries (LDG)
xxLEDPChristoph ZwerschkeLED Panel
xxLEmuUlf Ronald AnderssonLaceScan command-keys
x LityChristian KrügerLiberty
 xLLCRLogilexLogilex 1st Lock
xxLMusUlf Ronald AnderssonLaceScan mouse accelerators
xxLOGBUwe Holtkamp, Jürgen HoltkampLogbuch (Logbook)
 xLoSeMarkus KohmSER-LOG
 xLP/2Laurenz PrüßnerMalloc/2 GEMDOS vector
 xLPCDLaurenz PrüßnerCarrier Detector
 xLPJMLaurenz PrüßnerJoy Mouse
xxLTMFOliver ScheelLet 'em Fly
 xM16sCybercube Research LimitedCyRel M16-1280 graphics card
 xM16XCybercube Research LimitedCyReL M16 XBIOS emulator
xxmaccKen Badertscher, Atari CorporationMaccel 3
x MADDUwe SeimetADDMEM for TT030
x MADNRobert FederleNEX-output
 xMaesOlivier LandemarreMyAES
x MagCDirk SteinsMagic Dials configuration program
x MAGNMichael SchwingenMAGNUM card
x MagXSven&Wilfried Behne, Andreas KromkeMagiC
 xMASTNaumann&RöderMaster
x MaTC Matrix True Colour graphics card
x MbArManfred LippertMenuBar
xxMBRDMichael MaaßenBlit_RD: Ramdisk
  MCL_ MiNT control
x McSn MacSound
 xMCSPF. AschwandenUnimplemented integer instruction and floating point handler
x MCWR Microwire DMA sound interface
xxMDIAHelmut NeukirchenMulti-Dialog
 xMDRKSteffen EngelMegaDark
x MDSaBill PennerMedical Design Software's serial fix
  MFAC Multi-accessory
 xMFFMMarkus HaeblerMarcus' file-selector for MiNT
 xMFIXThomas BinderMONOFIX.PRG
x MFMV From Magic installed
xxMFNTHayo SchmidtFontloader
xxMGEMPascal MerleMultiGEM
x MgMcTempelmann, Kromke, Behne, ASHMagiC Mac
x MgMxAndreas KromkeMagiC Mac X
x MgPCFranz Schmerbeck, Andreas KromkeMagiC PC
x MgSnDidier MequignonMagiC Mac Sound driver
 xMID3Lars Erik OsterudMIDINET3
 xMIMAOliver ScheelMIDI Manager
xxMiNTEric Smith, Atari CorporationMint/MultiTOS
xxMIPSMichael MaaßenSPOOL120.PRG - Printer spooler
 xMJAFMartin JahrAUTOFONT
 xMKHCMarcus KraftHardcopy fix
x MkJrThomas SchallarCookie Jar creator program
 xMM2XThomas TempelmannMegamax Modula
xxMMACEmanuel MoecklinMagic Mouse Accelerator
 xMMUTOliver ScheelMidi Maze ][ utility
 xMM_2Markus FritzeMidimaze 2
 xMN3DManfred LippertMenus and submenus in 3D-look
x MNAMStandardcookieMachine Name cookie
 xMOAFMartin OsiekaARROWFIX
xxMOGRMartin OsiekaGEMRAM
x MPROThomas KuennethMagic Pro Config CPX
 xMRAMRainer SeitelMore RAM
 xMSPDLars Erik OsterudMouse Speeder
xxMSPOEmanuel MoecklinMagic Spooler
  mstx Mouse tricks
 XMTCI MATRIX MatGraph - TCxx
xxMTftMarkus KohmTrapper
xxMUPFGereon SteffensMupfel
x MWHLArmin DiederingMWheel
  MZTR TRASH
xxMZVTMichael ZuhlDriver videotext decoder from Print-Technik
 XM_IN MATRIX MatGraph - Cxx
 xN203Noud v. KruysbergenMulti-accessory
x nAESJens Hiescher, Rainer Mannigel, Woller SystemeN.AES, the AES for MiNT
xxNAH3Noud van KruysbergenN_ALTHLP snapshot utility
 xNBELRobert IrrgangSOUND.PRG
 xNBLLVolker JanzenNEWBELL.PRG
xxNCLNOliver ScheelNiceLine
 xne2kTorsten Langne2000.xif
 xNERVLaurenz Prüßner/ST-MagazinNo etv_critic_alert
 xNETSPAM's SoftwarePAM Novell Netware
x NEXBRobert FederleNEX-Buffer
x NEXKRobert FederleNEX-Toolkit
x NFMTAndreas KunzINFOMAT
  NFnt Neodesk Font Loader
 xNKCCHarald SiegmundNKCC - Normalized Key Code Converter
  NLdr Neodesk Loader
 xNMGESimon GleissnerNo More amc-Gdos Errors
 xNO7PLars Erik OsterudNorwegian->7 bit printer converter
  noCF noSystem
 xNOR5Lars Erik OsterudNorwegian keyboard driver
  NOVA NOVA graphics card
 xNSC1Noud v. KruysbergenN_Syscom accessory
x Nspd Nemesis
x nTASSteffen EngelTAS-instructions
  NTK4 NTK4 Falcon MOD player
 xnTOSRainer MannigelMilanBlaster
  NUL> System startup utility
xxNVDISven&Wilfried Behne, BELANewVDI
x OBNLStephan Junker, Dirk HaunLoad-Time Linking protocol
xxOFLSHans-Jürgen Richstein (Standardcookie)Check Open Files
xxOPMMMartin MertensOpen Helper
  OSBL Screen Blaster
  OSTT OverScan TT
x OTOS oTOSis - TOS emulator for Linux/68k
 xOV24 OverScan hardcopy driver for 24 pins
 xoVDIOdd SkanckeoVDI
 xOVDJKarsten Isakovic, OverScan GbROverscan hardcopy driver for HP-DeskJet
 xOVEPKarsten Isakovic, OverScan GbROverScan hardcopy driver for 9 pins
xxOVERKarsten Isakovic, OverScan GbRAutoSwitch OverScan hardware driver
 xOVEXKarsten Isakovic, OverScan GbROverScan Exception patch
 xOVFSKarsten Isakovic, OverScan GbROverScan File-Selector patch
 xOVIMKarsten Isakovic, OverScan GbROverScan hardcopy driver
 xOVLSKarsten Isakovic, OverScan GbROverScan DMC Laserbrain patch
 xOVRDKarsten Isakovic, OverScan GbROverScan RAMDisk
 xOVUTKarsten Isakovic, OverScan GbROverScan screen blanker
 xOVWIKarsten Isakovic, OverScan GbROverScan Window-size patch
 xPAMNPAM's SoftwarePAM Network Driver
 xPAULPascal FellerichPaula 2, Amiga MODfile player
xxPBUGEmanuel MoecklinPeaceBug
 xPDEBDimitri JunkerPureDebuggger
 xPDebDimitri JunkerPureDebuggger
xxPDOSChris LathamPowerDOS
 xPDRZPatrick DubbrowLockGetrez
 xPFIXJulian Reschke, SciLab GmbHPTSINFIX Fix
 xPinpJens SchmidtParallel input port driver
 xPKSHPahlen & Krauß SoftwarePKS-Shell
x PMMUAlexander Herzlinger (Standardcookie)PMMU reprogrammed
 xPOISBernhard Artz/Gregor Tielsch/ShiftPoison!
  POWM PowerMouse
 xPRCSPeter RohdeCopySTar
 xPRDSPeter RohdePeter Rohde Disk Speeder
 xPRMDMarkus KohmMIDIPRT
  PRN! WandelSZ
 xPRNßMichal Bernards/ST-MagazinWandelSZ
 xPRO5Lars Erik OsterudResident virus check/kill/protect program
 xPROBMarkus und Michael MeurerProfibase
 xPROTMeinolf SchneiderProtos screen utility
 xPRTDRobert FederlePrint to Disk V1.10
 xPRTOPeter RohdeST Tools
 xPRTRProtarProtar HD driver
 xprtrKonrad HinsenAtari->IBM printer converter
  PSND ProSound driver
 xPSSGThomas MuchPaint Shop hardcopy vector
xxPTOSAlexander HerzlingerROMRAM: Copy TOS to TT-RAM
 xQIKMGereon SteffensQuick Mouse
 xQMACWilfried CordesQuick Mouse driver Accessory
 xQMCPWilfried CordesChemplot Quick Mouse driver
  QST2 Quick ST 2
  QST3 Quick ST 3
 xQUANBernd BlankQuanTOS multi-utility
 xRAILOtmar BirnRail Manager
  RaSn Rational Sounds
 xRESGJörg HahneRESET GUARD
xxRFLXKarsten Isakovic, OverScan GbRAutoSwitch driver for Reflex graphics card
 xRFUSMichael BernardsRufus terminal program
 xRGUSDaniel HollisArgus
 xRINGJulian ReschkeTelephone-bell detector
 xROMDAndreas KromkeMagiC DOS driver for the ROM module
 xROT8Thomas FürhölterRotate
 xRPITArpad BeszedesTIMEFIX
 xRREGReiner WiechertRestore Register
 xRSLTVolker Brodel, GengTECGengTEC VGA monochrome/16-colour driver
x RSpdStephan SkrodzkiRS_SPEED (Serial fix)
xxRSVEHarun ScheutzowRSVE patch
x RSVFHarun ScheutzowRS232 Version Fast (HSMODEM)
 xRTKCRobert TolksdorfKeyclick
 xRTOBRobert TolksdorfOptobell
xxRWINKarsten IsakovicRootWindow
  SAM System Audio Manager
 xSBKMStefan BrückRing recognition in modem routines
 xSBTEStefan BrückTerminalpProgram
 xSBTSStefan BrückTrap Spy
 xSCAHJulian Reschke, Hard&SoftSpeed Cache
xxSCKM MagXNet (SOCKET.DEV)
x SCPN Screen Blaster 3 screen enhancer
 xSCRDRobert FederleScreen to Disk
 xSCRNEdgar RöderScreen scroll
 xSCRSUrs ThürmannScreen blanker
xxSCRWUwe SeimetScreen Watch
x SCSI SCSI drive interface
  SCSV Line Art Screensaver
 xSDCHSven Kopacz2C - Second Chance
 xSDESMarkus und Michael MeurerSoftdesk
 xSDskGerhard HölscherSoftdisk
 xSDWNMarcel WaldvogelScreenDown
 xSELCMichael HaydnC-Lab file-selector
 xSENVAndreas GroßSet Environment
xxSFA^Sevo StilleFontloader system
 xSFIXAllan Pratt, Atari CorporationSerial port fix
  SFMN SafeMenu
 xShLkJean-Pierre RasquinShift Lock
 xshlpJörg Westheideshelhelp
xxSKEYOle PahlSpecialKeys
 xSLCTStefan Radermacher & Oliver ScheelSelectric™ enhanced file-selector
xxSLifMichael SchwingenSoundLifter
x SLIPSven KopaczSocket library
xxSM00STAGE MicrosystemsSOTA Printer Spooler
xxSM01STAGE MicrosystemsReProK office management DUO
xxSM02STAGE MicrosystemsReProK International EM-NET II
x SMALM. Nick, H. Schmidt (Standardcookie)Small AES icon fonts
 xSMAUMarcel WaldvogelSet-Maus accessory
 xSMonKarsten Isakovic, OverScan GbRSysMon
xxSMTTKarsten Isakovic, OverScan GbRSM-124 emulator
 xSNAPKonrad HinsenThat's Snap accessory
 xSOFSMarkus und Michael MeurerSoftscreen
 xSOSWMarkus und Michael MeurerSoftswitch
xxSpcEChristian GrunenbergSpace
 xSPCKRobert IrrgangRAMdisk for SPC Modula
 xSPEEStefan HintzMouse Speeder
 xSPEKStefan Hintz, Wilhelm ElektronikSpektrum graphics cards
xxSPEXStefan Eissing, SciLab GmbhSteve's Printing Exzessory
xxspMRMartin RoggePrinter- and file-spooler
xxSpolAndreas MandelFlexible printer spooler
 xSPRGBernd Blank  STARTER.ACC
x SR17 Speeder SST Cockpit
  SSND Petra
 xST-CMatthias AndräCache program
 xST17Daniel HollisST-68017
 xSTATLaurenz PrüßnerStaTOS
x STEMThomas GöttschSTEmulator
xxSTEWJohn McLoudStewart
  STFA Sound driver for Atari
x StIcJohn McLoudStewart Icon-server
  STiK ST Internet Kit
 xSTMSMartin Backschat & Peter MelzerST Magazin Screendump
x strk StarTrack XBIOS extension
x STRXMartin SperberSAT-Trax antenna driver
x SupV SuperVidel driver
x SVARBrad PickeringShows MacMiNT
  SVGA Super VGA emulator
xxSWAPUwe Seimet, Maxon ComputerOutside
xxSwTmMatthias WallmannShow Time clock
xxSYMBRobert FederleSymbol driver
  SYNL Dynamic Link Library driver
 xSYNTMarcel WaldvogelSyntex
 xSysEMartin DürrschnabelSystem Editor
 xSysoHecker + Knobbe Computersysteme GbRST Sysop
 xSYSTSven KopaczSystime
 xSZ_MNickel SzebrowskiDynamic Mouse speeder
x S_DRPeter HilbringCD-ROM SCSI driver
 xT206Harun ScheutzowPATCHX06.PRG
x T2GMThomas BinderTOS2GEM
x TALKGadgetsMegaTalk
  TAPE TapeBIOS
 xTASSMarkus FritzeTurbo Assembler
 xTCFSBorland MünchenTurbo C File-Selector
xxTCRBRalf BiedermannTurbo Cache
 xTenvMarkus BankEnvironment set program for Terminal
 xTFIXKarsten Isakovic, Atari CorporationTOS 1.04 fix
xxTHNXDirk HaunThinx
xxTHRMOle PahlTemperature-data evaluation
 xTHSTJiri LamacTurboHST
 xTIM3Lars Erik OsterudTime driver
 xTIM5Lars Erik OsterudTime driver plus Screen Blanker
x TIME Led Panel Time
xxTK40 MC68040 ToolKit
 xTL3DTorsten LangThird floppy
 xTLWVTorsten LangSTGAWVBL
xxTmonThomas Tempelmann & Johannes HillTempleMon
  TMONThomas Tempelmann & Johannes HillTempleMon
x tmsWTMSTMS Wacom-Treiber
 xTOpWLaurenz PrüßnerTop Manager Watcher
 xTOUCSteffen EngelTouch
 xTPatLaurenz PrüßnerTOS Patch
 xTPGMJörg WestheideTraPatch
 xTRAKJulian F. ReschkeTrack Speed
xxTraPJörg WestheideTraPatch
 xTrppManfred LippertTrapper
 xTRUEChristoph ZwerschkeTrueDisk
 xTSENJürgen KriegeTSE Net
xxTSWPMatthias BeckerTonySoft Write Protection
x TTTFMarcel WaldvogelThirty Two to Twenty Four
x TUBSAndreas AlichTUBS - The Ultimate Boot Selector
 xTWFSKonrad HinsenThat's Write File-Selector Accessory
xxTyp1Frank KnobbeDaisywheel accessory
x UFSLMichael ThänitzExtended Universal Font Selector
  UIS3 Universal Item Selector 3
 xUKB1Uwe KoloskaFastload
 xUKB3Uwe KoloskaFastload plus MIDI Through
 xUN*XMichael SchwingenUnixname (/->\ converter)
 xUSCKUwe SeimetCHECKIT
xxUSHDUwe SeimetDiskus HD driver
x UsNmCarsten TolkmitUser-Name cookie
x USPKUwe SeimetHard Disk Auto-Parker
xxUSRSUwe SeimetROMSPEED
x USSCUwe SeimetSCSI Driver for Hatari and ARAnyM
  UTRK Ultimate Tracker
 xVBLFThomas BinderVBLFIX.PRG
xxVDIp VDI performance logger
x VDLY Videlity
 xVECSStephan GerleVecshow
  VeiL Turbo Veille
xxVFIXKarsten IsakovicVDIFix
xxVFNTHarald SommerfeldtVdiFont
xxVGASChristoph ZwerschkeVGA Simulator
x VI-2Francois GaleaVidel Inside
  View View protocol
 xVIRACarsten Frischkorn, GalacticVirus Alarm
x VMEMRobert FederleVirtual Memory
 xVPCHRobert IrrgangVDIPATCH.PRG
x VRAMAlexander Herzlinger, OverScan GbRVirtual memory management for the TT030
 xVREPCarsten Frischkorn, GalacticVector Guard
 xVScoArnfried GriesertVirus Scope
x VSCRJulian F. Reschke (Standardcookie)Structure of Virtual Screens
 xVSTMFocke FrentzenMIDI Transfer
 xvT52Cybercube Research LimitedCyRel VT52 emulator
 xVTFXThomas BinderVT52FIX.PRG
 xVXCKMartin H. SmithVoxClock
x WaHWWalter HermannHIGH_WAY
  WARP Warp 9
x WaSAWalter HermannSATELLIT
  WBrd Bird's Wing
 xwdlgBehne & Behne GbRWindow-dialog library (wdialog)
xxWDOGRobert FederleWatchdog
xxWEGADietmar RabichWEGA libraries
x WfNaManfred LippertInquiry of window title via wind_get(WF_NAME)
xxWFSLGert KramerWindow File-Selector
xxWICOSven KopaczWinCom
 xWinKJörg WestheideWinKeys
x WINXMartin OsiekaWINX
 xWINZClaus BrodLuftschloß/Winz RAMdisk
xxWPROChristoph ConradWrite Protect
 xWRAPRichard KurzWrapMouse
x WrApRichard KurzWrapMouse
x XALT AlberTT GFX card driver
 xXBTNTassilo NitzMouse routine in 'XBOOT'
xxXDskThomas SchallarX-DISK RAMdisk
  XFRB Extended Fast-RAM Buffer
xxXFS1Edgar RöderMaster-module for extended TOS file-system
x xFSLDirk Haun, Stefan RogelExtended Font Selector
x XgemEric RebouxWindframe Xgem
x XHDIDiverse (Standardcookie)XHDI driver
 xXKBDAlex EsserExtended Keyboard
  XMMU TK40's interface for PMMU setting
  XMuz Ultra Player
 xxNetDaniel RoeddingxNet-ST
  XPCI XBIOS functions for PCI-BIOS
xxxRmtMarkus GutschkeXREMOTE
x XSDDStephan BauckeExtended Serial Device Driver
  XSNDThomas HuthDigi-Sound
x XSSI Extended Screen Saver Information
x XTOSLoïc SébaldExtend TOS
x xUAG MegaVision300
  xUFC Extended Universal Font Selector configuration program
 xXWinKonrad HinsenExtended Windows module
  zCAC 680x0 Cache Control CPX
xxzDCFRalf ZimmermannDCF-time receiver
 x_5MSVincent RivièrePointer to 200 Hz system timer interrupt vector
  _AFM Audio Fun Machine
x _AKPAtari CorporationKeyboard/Language configuration
x _CF_Didier MequignonColdFire CPU
x _CPUAtari CorporationCentral Processor Unit type
 x_DOSAtari CorporationGEMDOS entry-point (in GEMDOS 0.30)
x _FDCAtari Corporation (Standardcookie)Disk drive type
x _FLKAtari Corporation (Standardcookie)File Locking extension
x _FPUAtari CorporationFloating Point Unit type
  _FRB Fast-RAM Buffer
 x_FSRAtari CorporationPatch program for Serial port (TOS 4.00->4.04)
x _IDTAtari CorporationInternational Date/Time format
x _INFAtari CorporationSTEFIX Program
x _INUMartin OsiekaFormat for numbers
x _ISO specifies the real keyboard/font nationality
  _JPD Falcon030 JPEG Decoder by Brainstorm
x _MCF ColdFire features
x _MCHAtari CorporationMachine type
 x_METAtari CorporationMetaDOS
x _MILMichael SchwingenMilan computer
x _NETAtari CorporationGEMDOS Network support
xx_OOLAllan Pratt, Atari CorporationPool Fix
x _PCIMarkus FichtenbauerPCI-BIOS
  _PKT Packet driver cookie
  _PWR Power management unit
x _SLMAtari CorporationSLM driver
x _SNDAtari CorporationSound hardware
x _SWIAtari CorporationConfiguration Switches
x _T2W TOS2WIN emulator
x _T30Andreas KromkeKAOS TOS
x _USB USB core API driver
x _VDIMichael SchwingenMilan VDI
x _VDOAtari CorporationVideo hardware
x __NF Native features proposal
  ΣFSC Falcon Screen
+
+ +

3.7.2.1 Cookie, 3DMN

+

3D-Menu +

+

Sets the 3D flags for all menu bars. +

+

Modifies vectors 45 (BIOS) and 34 (AES). +

+

3.7.2.2 Cookie, 3RDB

+

Third Button +

+

Driver for 3-button mouse on the TT mouse port (on other +computers with a small modification), such as the GI-6000, for +instance. +

+

Hooks into the joyvec. +

+

Status: Freeware +

+

3.7.2.3 Cookie, 60Hz

+

60Hz resident +

+

Switches 200 times per second to 60Hz. (Various games will then +run at 60 Hz on a 50Hz computer). +

+

Status: Freeware. +

+

Redirects the 200Hz system clock. +

+

3.7.2.4 Cookie, 8*8

+

Change font for GEM program +

+

3.7.2.5 Cookie, A2sv

+

Trapsave +

+

Ensures that the four trap-handlers do not change any CPU +registers (except the return register D0). +

+

Copyright status: Public Domain. TRAPSAVE.LZH. +

+

Vectors modified: GEMDOS-trap, GEM-trap, BIOS-trap, XBIOS-trap. +

+

3.7.2.6 Cookie, AB40

+

The AfterBurner 040 FPU-Emulation is installed. +

+

Vectors modified: Line-F ($2c), Branch or Set on Unordered +Condition ($c0), Inexact Result ($c4), Divide by Zero ($c8), Underflow +($cc), Operand Error ($d0), Overflow ($d4), Signaling NAN ($d8), +Unimplemented data type ($dc) +

+

3.7.2.7 Cookie, ACCS

+

ACCS.PRG +

+

Accessories are loaded from the folder \ACCS. +

+

Modifies GEMDOS (Fsfirst('\*.ACC')) twice, then unhooks. +

+

3.7.2.8 Cookie, AFnt

+

AES Font Loader +

+

AUTO-folder TSR. Loads new IBM and SMALL fonts for the AES +and adapts the rsrc routines of the AES. Cookie contains a pointer +that permits access to the data structure. +

+

Modifies TRAP #1, #2 (AES/VDI) and #13. +

+

Status: Freeware up to v0.9. +

+

3.7.2.9 Cookie, AgK0

+

AusGuck RAMdisk +

+

3.7.2.10 Cookie, AHVR

+

VRAM +

+

Virtual memory management for the TT030. +

+

Modifies hdv_rw, hdv_bpb, buserror, ikbdsys... +

+

3.7.2.11 Cookie, ALHP

+

Alman HP DeskJet screen dumper +

+

3.7.2.12 Cookie, ALIC

+

Alice +

+

Makes all applications iconify-capable. An operating system +capable of iconification is a prerequisite. +

+

Modifies vectors 45 (BIOS) and 34 (AES). +

+

3.7.2.13 Cookie, ALRM

+

Driver software for controling the DIGIFON TDS3000 +receiving station. Contains it own RS232 routines as well as a +task-switcher, which also operates in SV-mode. +

+

3.7.2.14 Cookie, AmAN

+

A-MAN +

+

Modifies vector 45 (BIOS) and 34 (AES) and can return the +MENU_ID of the installed desk accessories as well as supplementary window +information under all operating systems. +

+

3.7.2.15 Cookie, AMC1

+

Software for monitor switch-box from Hard&Soft. +

+

3.7.2.16 Cookie, AMC2

+

Driver software for PC keyboard interface from Hard&Soft. +

+

3.7.2.17 Cookie, AMCG

+

AMC-GDOS ist ein GDOS, welches im Wesentlichen den gleichen +Funktionsumfang wie das Atari-GDOS hat und wurde zusammen mit diesem +vertrieben. +

+

3.7.2.18 Cookie, ANSe

+

ANSI emulation +

+

Modifies Bconout vector. +

+

3.7.2.19 Cookie, APGM

+

SysGem (add-on to SysInfo) +

+

Displays data for the computer it is running on. +

+

Status: Shareware. +

+

3.7.2.20 Cookie, ARAe

+

nfeth.xif +

+

Atari part of the MiNTNet netword card emulation for ARAnyM. +Hooks auto-vector interrupt #3. +

+

3.7.2.21 Cookie, ARTS

+

ARTSEVNT.PRG +

+

'TT-Artist' screensaver resident part, by Cybercube Research +& Massimo Farina. +

+

3.7.2.22 Cookie, asGT

+

Wacom Graphics Tablet Driver - (As cookie-ID for all +graphics tablet drivers that correspond to the ASGARD standard). +

+

Driver with mouse emulation and mouse status buffering for Wacom +graphics tablets of the UD series (Wacom II-S and Wacom IV emulation). +

+

Copyright status: Commercial ware. +

+

Source: as - adequate systems GmbH. +

+

Modifies vectors: 200 Hz system clock ($114), XBIOS-trap, +KBDVBASE.mousevec. +

+

3.7.2.23 Cookie, ASum

+

ASUMLENK +

+

Redirects screen output of AUTO-folder programs to the printer. +

+

Modifies TRAP #1 and #13. +

+

3.7.2.24 Cookie, AVmw

+

Virus Warning Program +

+

3.7.2.25 Cookie, AVOJ

+

Anti-Virus-Programm +

+

3.7.2.26 Cookie, AVSV

+

AV-Server +

+

Modifies vector 34 (AES). +

+

Implements missing AV-protocol functions for MAGXDESK. https://alex.barton.de/computer/atari/download/ +

+

3.7.2.27 Cookie, BASH

+

Bourne-Again Shell of the FSF +

+

Redirected: shell_p. +

+

3.7.2.28 Cookie, BBD2

+

Bastel Bus Driver V2.xx +

+

Allows access to a measuring- and control-bus via the BIOS. +

+

Modifies: prv_lst, prv_lsto, xconstat0, xconin0, xcostat0, +xconout0, TRAP #13 (BIOS). +

+

3.7.2.29 Cookie, BCKW

+

BackWard +

+

The ST emulator for the FALCON030. +

+

3.7.2.30 Cookie, BGEM

+

This is created as from Native BubbleGEM 05 in addition +to the cookie BHLP, and points to a structure with version +specifications etc. +

+

Status: Freeware. +

+

3.7.2.31 Cookie, BGHD

+

Contains configuration flags for the BubbleGEM +Help-Daemon. +

+

Status: Freeware. +

+

3.7.2.32 Cookie, BHdl

+

BadHandle 1/92 +

+

Remedies the "invalid handle" error in various +programs in connection with GDOS. +

+

Redirected: TRAP #2 (VDI/AES). +

+

3.7.2.33 Cookie, BHLP

+

Configuration flags for BubbleGEM are contained in this +cookie. +

+

Status: Freeware. +

+

3.7.2.34 Cookie, BIGS

+

BigScreen 2 +

+

This is the new BigScreen for ST, STe and TT. +

+

Modifies TRAP #2, XBIOS and VBlank. +

+

3.7.2.35 Cookie, BIOC

+

Pirosca +

+

Resident printer spooler with hardcopy utility. +

+

3.7.2.36 Cookie, BLNK

+

Screenblanker +

+

3.7.2.37 Cookie, BLOW

+

Blowup030 +

+

3.7.2.38 Cookie, BScn

+

BACKSCAN - ST-Low-Screen-Copy +

+

BACKSCAN installiert sich in diversen Systemvektoren uns setzt +einen Cookie. +

+

Der Cookie 'BScn' enthält als Wert einen Zeiger auf folgende +Struktur: +

+
Offset    Size      Inhalt
+ +0       int8_t    Versionsnummer (current: 2)
+ +1       int8_t    Releasenummer  (current: 3)
+ +2       int8_t    Backscan-Switch; =0 Routine aktiv, !=0 disabled
+ +3       int8_t    Reserviert, NICHT VERÄNDERN!!!
+ +4       int16_t   Anzahl der Zeilen pro 5ms, Obergrenzwert aus dem ACC
+                    nicht überschreiten! max. 200, aber wohl nur auf einem
+                    060er
+ +6       int32_t   Adresse einer Testroutine, die einen relativen
+                    Testwert in D0.l zurückliefert; der Wert gibt an,
+                    wieviel 'Zeit' der CPU zwischen zwei Kopiervorgängen
+                    verbleibt. ACHTUNG! Der Wert schwankt
+
+

3.7.2.39 Cookie, BSIM

+

BLiTSIM +

+

A "BLiTTER Simulator". It simply reports after a +Blitmode inquiry that a blitter is installed and active. +

+

Hooks into TRAP #14. +

+

3.7.2.40 Cookie, BSTE

+

BigSTE +

+

From the magazin ST-Computer 1/1992 +

+

3.7.2.41 Cookie, BUG1

+

Bugaboo - debugger +

+

3.7.2.42 Cookie, C24P

+

XBRA-ID of the CyReL 24-bit patch program +

+

This program modifies the XBIOS vector and converts the +TrueColor pixel formats aRGB to RGBa. +

+

3.7.2.43 Cookie, CACH

+

Cache Control +

+

AUTO-folder TSR. The cookie points to a table with functions for +managing the CPU caches, starting from the 68020 up to the 68060. +

+

Cache Control is Freeware. +

+

3.7.2.44 Cookie, CALD

+

This is used at run-time by HIGH_END (Computer Aided +Loudspeaker Design from Version 4.5 onwards) to, among other +things, exchange messages with modules. +

+

The program is Shareware. +

+

3.7.2.45 Cookie, CASE

+

Casing type (Gemini) +

+

This cookie determines which housing shape Gemini displays in +the welcome dialog at startup: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
0:520
1:1040, Falcon
2:Mega ST
3:Stacy
4:TT, MegaSTE
5:ST-Book
6:Tower
+
+ +

Other values are reserved +

+

The cookie is set by CASETOWR, which is included in the Gemini +distribution. +

+

3.7.2.46 Cookie, CatS

+

CatStick - Desk accessory +

+

Incorporates a joystick as an input medium for the 'Maustausch' +front-end 'CAT'. +

+

While CAT is running the IKBD vectors mousevec and joyvec are +modified. +

+

Status: Freeware. +

+

3.7.2.47 Cookie, CaTT

+

CyReL Dashboard, CyReL CaTTamaran GIOS +

+

Cookie of the CyReL CaTTamaran TT030 accelerator module. Points +to the entry address of the CyReL CaTTamaran GIOS (General I/O System, +see CyReL CaTTamaran Developer's Documentation). +

+

Cybercube Research Limited, 126 Grenadier Crescent, Thornhill, +Ontario, L4J 7V7, Canada. +

+

3.7.2.48 Cookie, CB2K

+

Patch for remedying the 2kB Gemdos bug +

+

3.7.2.49 Cookie, CBCE

+

Modified Critical Error handler +

+

3.7.2.50 Cookie, CBDF

+

Dabbel Feature +

+

Redirection of drive accesses. +

+

3.7.2.51 Cookie, CBHD

+

Hard disk driver +

+

3.7.2.52 Cookie, CBHY

+

Keyboard driver in 'Hyperformat' +

+

3.7.2.53 Cookie, CBIT

+

"c't bus" interface driver +

+

3.7.2.54 Cookie, CBTS

+

Crazy Bits Tabletttreiber System +

+
typedef struct
+{
+  int16_t x;
+  int16_t y;
+  int16_t t;
+  int16_t pressue;
+  int16_t winkel;
+  int16_t res1;
+  int32_t res2;
+  int16_t mac;
+  int16_t mac_w;
+} CBTS;
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
x X-Koordinate des Siftes/Lupe im CBTS-Screen absolut (0=linker +Rand; 2^15-1=rechter Rand; -1=alle Daten bis res1 ungültig, Medium +außerhalb der CBTS-Fläche) +
  +
y Y-Koordinate des Siftes/Lupe im CBTS-Screen absolut (0=oberer +Rand; 2^15-1=unterer Rand) +
  +
t Tastenstatus: 0=Keine Taste 1=Links 2=Rechts 3=Beide +
  +
pressue Andruck: 0 (min) - 63 (max); -1=Daten ungültig +
  +
winkel Winkel des Stiftes 0 (senkrecht) - 90 (waagerecht); -1=Daten +ungültig +
  +
res1 Reserviert (muß 0 sein) +
  +
res2 Reserviert (muß 0 sein) +
  +
mac Absolute Nr. des angeklicktes Makrofeldes (0=links oben, +1=rechs daneben usw.; -1 kein Makrofeld angeklickt) +
  +
mac_w Anzahl der Makros pro Zeile. Dadurch kann zusammen mit +mac die genaue Position des Makrofeldes bestimmt werden. Z.B. +Spalte 3, Zeile 5. Dies ist wichtig, wenn man in eigenen Applikationen +bestimmten Feldern eine Funktion zuweisen möchte und diese Funktion +bei allen Tabletts an der selben Stelle liegen soll. (Denn +verschiedene Tabletts haben unterschiedliche Größen und damit auch +verschieden viele Makros pro Zeile, wodurch sich mac +verschiebt! +
  + +
+ +

3.7.2.55 Cookie, CCDA

+

Tempus Word 2.0 +

+

3.7.2.56 Cookie, cdMC

+

CDROM.XFS > V0.6 +

+

File system for CD-ROMs under MiNT/MultiTOS > V0.4. +

+

Modifies vector: hdv_mediach. +

+

Status: Freeware. +

+

3.7.2.57 Cookie, CDOT

+

Crazy-Dots graphic driver +

+

3.7.2.58 Cookie, ceci

+

Cecile disk drive driver +

+

3.7.2.59 Cookie, CFIX

+

Console Fix +

+

3.7.2.60 Cookie, CFsl

+

Compo FSel +

+

3.7.2.61 Cookie, CHAM

+

Chameleon +

+

Accessory for loading/removing desk accessories while computer +is running. +

+

3.7.2.62 Cookie, CHBT

+

Changes +

+

3.7.2.63 Cookie, CHN1

+

Changes +

+

3.7.2.64 Cookie, CHNG

+

Changes +

+

3.7.2.65 Cookie, CHTW

+

Chatwin +

+

Universal development environment. +

+

Modifies the xconout vectors #2 and #5 (output redirection). +Older versions also modify the Timer A vector. +

+

Status: Freeware +

+

3.7.2.66 Cookie, CICN

+

C-ICON +

+

The program enables loading and use of resources with colour +icons. +

+

3.7.2.67 Cookie, CISY

+

CISYSTEM (Ciechowsky Computer Innovations). +

+

3.7.2.68 Cookie, CJar

+

JarXXX program +

+

Increases the size of the cookie jar to hold the number of +cookies specified in the 3-digit number entered to replace 'XXX'. +

+

3.7.2.69 Cookie, CJAR

+

COOKIE.PRG +

+

Sets the cookie-jar at 40 entries. +

+

Modified: Reset vector. +

+

Status: Freeware. +

+

3.7.2.70 Cookie, ck01

+

Reset handler for cookie library +

+

Installs a reset handler which clears the cookie jar on reboot. +

+

3.7.2.71 Cookie, CKBD

+

COMPOSE - Character Deluxe Keyboard Driver +

+

Running on all ST-compatible computers, this is an extended, +flexible keyboard driver for Atari computers that permits creation of +any of the characters not found on the keyboard. +

+

Features: Creation of non-keyboard characters by three different +methods, interchangeable tables. +

+

Modifies IKBDSYS and, if necessary, the resvector, kcl_hook and +bell_hook. +

+

Status: Freeware. +

+

3.7.2.72 Cookie, CKJR

+

Installs an empty cookie jar (ST-Magazin +3/1990). +

+

Modifies the reset vector. +

+

3.7.2.73 Cookie, CLCK

+

Two AUTO-folder TSR utilities for Mega ST hardware clock +or online display of the keyboard processor clock on computers without +a hardware clock. +

+

Modified: the IKBD system vector ikbdsys wg. Hotkey. +

+

In addition there is one cookie and one VBL entry. +

+

3.7.2.74 Cookie, CLK1

+

Utility for MEGA ST hardware clock +

+

3.7.2.75 Cookie, CLOK

+

CLOCK for GMT settings (?) +

+

3.7.2.76 Cookie, CM16

+

This cookie is placed by CM16_VIP.PRG (the CyReL M16 +Versatile Installation Program) if one or more CyReL M16-1280 +TrueColor graphics card(s) is/are installed in the system. The cookie +then points to the start of the M16 STRUCTure (see X M16s). If the +lowest value bit of the pointer is set (so it points to an odd +address), then the M16 STRUCTure is currently being processed or +altered by another program. The LST must be checked before +every access and set with a READ/MODIFY/WRITE instruction. After +processing the M16 STRUCTure the MSB is reset again. +

+

3.7.2.77 Cookie, CNTS

+

CentScreen +

+

3.7.2.78 Cookie, COLO

+

Colos +

+

Mono -> colour converter. +

+

Distributor: ASH. +

+

3.7.2.79 Cookie, CPSL

+

CapsLock display (as of V2.0), by Jürgen Heindel and +Patrick Dubbrow. +

+

The Mega ST keyboard has already been prepared for a LED that +shows the status of the CapsLock key. It can also be built in easily +in ST/STE/TT machines. The program installs a VBLANK routine. +

+

3.7.2.80 Cookie, CRAC

+

Protar hard disk driver +

+

3.7.2.81 Cookie, CRIT

+

CRYPT-IT +

+

Personal data protection for Atari ST/TT. +

+

Modifies the three hdv_ vectors. +

+

3.7.2.82 Cookie, CSMD

+

CyReL Serial Mouse Manager +

+

The cookie points to a parameter block in the resident mouse +driver which is loaded as an AUTO-folder program. The driver hooks +into the keyboard, mouse, 200Hz and reset vectors. Together with the +associated desk accessory, the following mice can be used on any +serial port of the Atari (ST/MegaST/STe/MegaSTE/TT030/Falcon030): +Microsoft mouse- compatible input devices (Muse, PenMouse, +TouchScreen), Mouse System Corporation-compatible devices, +Summagraphics MM Digitizer and Summagraphics BitPad II Digitizer as +well as compatible tablets. +

+

3.7.2.83 Cookie, CT40

+

CT40 present +

+

3.7.2.84 Cookie, CT60

+

CT60 present +

+
typedef struct
+{
+  unit16_t trigger_temp;
+  unit16_t daystop;
+  unit16_t timestop;
+  unit16_t speed_fan;
+  unsigned long cpu_frequency;        /* in MHz * 10 */
+  unit16_t beep;
+} CT60_COOKIE;
+
+

3.7.2.85 Cookie, CTCH

+

Master-module catch.mmx +

+

Interception of ^C, ^\ and ^Z, timeouts for programs. +

+

3.7.2.86 Cookie, CtCp

+

Control Caps V1.4 +

+

CapsLock display and special functions with CTRL-ALT key +combinations. +

+

Modifies IKBD, evt_term, 1 VBL slot (if all occupied, modifies +last slot with XBRA. +

+

Status: Freeware. +

+

3.7.2.87 Cookie, CTSF

+

CTSFIX.PRG +

+

CTS-bug fix. +

+

3.7.2.88 Cookie, cVDI

+

This descriptor is used by the CyReL M16-1280 VDI +driver. It is placed in the VDI-trap. The cookie points to a +parameter block in the VDI driver containing information +about the current resolution, mode, Line-A configuration and other +matters. +

+

3.7.2.89 Cookie, CWCo

+

Compo FSel +

+

3.7.2.90 Cookie, DATE

+

Led Panel Date +

+

The "DATE" cookie contains a pointer to a WORD-sized +variable with the current date in Tgetdate format. +

+

3.7.2.91 Cookie, DATL

+

TwiLight - The Screensaver +

+

Modifies TRAP #1, TRAP #2, 200 Hz system timer, IKBD/MIDI, +Resvector, midivec (Kbdvbase), mousevec (Kbdvbase), joyvec (Kbdvbase). +

+

Distribution: DDT Digital Desktop GmbH. Delirium Arts Alvar +Freude & Peter Scherer GbR. +

+

3.7.2.92 Cookie, DAWN

+

Before Dawn +

+

Screensaver. +

+

3.7.2.93 Cookie, DBFX

+

Patch program that allows the use of the Diablo emulator +under MiNT 0.96 (and newer). It is no longer required from Diablo +Version 1.6 on. +

+

Modifies the BIOS output routines for the printer. +

+

Status: Freeware. +

+

3.7.2.94 Cookie, DCdd

+

Double-Click Software's Data Diet +

+

3.7.2.95 Cookie, DCF7

+

DCF77 decodes the signals of a joystick-port radio clock +receiver. An accessory provides a freely configurable clock in the +menu bar. +

+

Modifies Kbdvbase->joyvec. +

+

Status: Freeware. +

+

3.7.2.96 Cookie, DCSD

+

Calamus screen driver +

+
struct DCSD_cookie
+{
+  int16_t version;
+  void    CDECL (*init)(void);
+  void    CDECL (*exit)(void);
+  int32_t CDECL (*active)(void);
+  void*   CDECL (*getbase)(void);
+  void    CDECL (*gettlt)(uint8_t tlt[256]);
+  void    CDECL (*blit_from_screen)(struct DCSD_BLITARGS *args);
+  void    CDECL (*blit_to_screen)(struct DCSD_BLITARGS *args);
+  int32_t CDECL (*custom)(int32_t par);      /* Customer function */
+};
+
+

3.7.2.97 Cookie, DECD

+

DECDriver +

+

Resident hardware driver for DEC Ethernet cards on the PCI-bus +with complete PCI-interrupt handling. Runs only on computers with a +PCI-bus (Hades,...); PCI-BIOS (_PCI) is a prerequisite. +

+

Modifies TT-MFP interrupt vectors, depending on how many, and in +which PCI slots, the network cards have been plugged - this info is +offered by the PCI-BIOS. +

+

Copyright: Shareware. +

+

3.7.2.98 Cookie, DEPI

+

DeskPic (ACC and TSR program) +

+

Install an image as a desktop and program background. +

+

Modifies vectors: VDI (number 114, recfill, will be +evaluated), BIOS (for the purpose of reinstalling the VDI-trap, say +after the launch of TOS/TTP applications). +

+

3.7.2.99 Cookie, DHST

+

Document History protocol +

+

Contains in the low WORD of the cookie value the AES ID of +the Document History server. The Document History protocol is +available as of StartMeUp! 7.01. +

+

Status: Freeware. +

+

3.7.2.100 Cookie, DIG2

+

Digiplay by Emmanuel Jaccard +

+

3.7.2.101 Cookie, DJBX

+

The DeskJet-Init BIOS extension initializes the DJ +automatically if the printer is switched on after the computer. +

+

Hooks into the BIOS-trap. +

+

3.7.2.102 Cookie, DKEY

+

Dead Key from Brainstorm +

+

3.7.2.103 Cookie, DNTR

+

DNT RAMdisk +

+

3.7.2.104 Cookie, DPAT

+

Desktop Patterns +

+

3.7.2.105 Cookie, DPRS

+

Printer buffer +

+

Status: PD. +

+

3.7.2.106 Cookie, DRIV

+

Drive-Edit +

+

Modifies the three hard disk vectors. +

+

3.7.2.107 Cookie, DRRH

+

Wodan +

+

Desk accessory for keyboard layout assignment. +

+

3.7.2.108 Cookie, Dsel

+

Dsel +

+

System kernel for a file-selector. +

+

Modifies vectors 45 (BIOS) and 34 (AES). +

+

3.7.2.109 Cookie, DSSO

+

SOKRATES +

+

Keyboard driver. +

+

Modifies the IKBD vector. +

+

3.7.2.110 Cookie, DYDL

+

DIR_LWR +

+

Supplementary program for patching égale. +

+

3.7.2.111 Cookie, DYJA

+

CCONRS.PRG installs a new CCONRS routine with correction +capabilities (cursor keys, Delete, Backspace,...) and history buffer. +

+

The GEMDOS vector is modified. +

+

The program is Freeware. +

+

3.7.2.112 Cookie, DYJD

+

Dosound +

+

Replaces Dosound, Cconout and Crawio. This is mainly useful on +systems that do not support this routine, such as a PC with MagiC PC +(MPC), for instance. +

+

GEMDOS and BIOS vectors are modified. +

+

3.7.2.113 Cookie, DYJT

+

To_Big +

+

This program manipulates the Dfree routine of the operating +system. This is necessary on systems with partitions >2GB (4GB) and +programs that otherwise do not support that. +

+

The GEMDOS vector is modified. +

+

3.7.2.114 Cookie, DYNL

+

Identifier of the Dynamic Link Library driver, with +which the dynamic linking of programs is supported on the Atari. +

+

Status: Freeware. +

+

User source: Not yet released. +

+

Uses vectors: TRAP #9. +

+

Warning: Still in development at time of writing! +

+

3.7.2.115 Cookie, DYwl

+ +

WIN_LNK +

+

This program makes possible for MagiC PC to use Windows +connections as full-blown links. +

+

3.7.2.116 Cookie, EADC

+

Easydisc +

+

Flexible and reset-proof RAMdisk with many extras. +

+

3.7.2.117 Cookie, EBPO

+

EB Modeleur +

+

Universal modeller. +

+

3.7.2.118 Cookie, EdDI

+

EdDI by Sven&Wilfried Behne, BELA +

+

NVDI (and also the ENHANCER for the ATARI-VDI) will place an +'EdDI' cookie in the cookie jar containing a dispatcher address in the +cookie's value. The dispatcher uses Turbo C/Pure C calling conventions +(register d0 contains the opcode; registers d1-d2/a0-a1 and the stack +may be used for additional parameters). +

+

Till now only opcode 0 is implemented. This opcode returns the +'EdDI' version number. +

+

Version 1.00 (return value is $100) supports v_opnbm, v_clsbm +and vq_scrninfo. +

+

From Version 1.10 on, v_opnbm, vq_scrninfo have additional +parameters. +

+

Version 1.20 supports v_open_bm and v_resize_bm. +

+

3.7.2.119 Cookie, EDFX

+

EDPBFIX.PRG +

+

Patch program for use of MS-DOS ED floppy disks (1 sector per +cluster) under TOS. +

+

Status: Freeware. +

+

3.7.2.120 Cookie, EGON

+

EGON! +

+

CD-ROM Driver. +

+

3.7.2.121 Cookie, EMNP

+

MNP emulator +

+

Software that emulates MNP (without compression). +

+

3.7.2.122 Cookie, ENV$

+

Desktop environment manager +

+

3.7.2.123 Cookie, ENVN

+

Environ.prg +

+

Sets the GEM environment. +

+

Redirected: exec_os, reset vector. +

+

Status: Freeware. +

+

3.7.2.124 Cookie, ENVR

+

Program for setting the desktop environment +

+

3.7.2.125 Cookie, EPro

+

Extendos Pro CD-ROM Driver +

+

Hooks into GEMDOS-, XBIOS-trap, hdv_bpb, hdv_rw, hdv_mediach. +

+

3.7.2.126 Cookie, F117

+

From the spedder SST. +

+

Points to 64K ST-RAM-Only Disk "Stealth Buffer". +

+

Currently used a lot bey SST. +

+

3.7.2.127 Cookie, ETM

+

Demouser +

+

3.7.2.128 Cookie, EURO

+

Euro character +

+

The cookie has the folowing bit makeup: +

+

00000000 00000000 000000rs cccccccc +

+ + + + + + + + + + + + +
c - Bit 0..7: Position of the Euro character used by the system +
  +
s - Bit 8: Flag whether the Euro character is present in the system font +(1) or not (0) +
  +
r - Bit 9: Flag whether the Euro character is to be substituted by the +text "EUR" (1) or not (0), if it is not contained in the +system font +
  +
0 - Bit 10..31: Reserved +
  + +
+ +

3.7.2.129 Cookie, EUSB

+

Ethernet USB API +

+

The cookie points to a structure over which communication with +external USB ethernet drivers takes place. +

+

3.7.2.130 Cookie, EXRA

+

ExtraRAM management for the FAFST accelerator card +

+

Manufacture and distribution: F. Aschwanden. +

+

Modifies vectors: GEMDOS, BIOS, XBIOS. +

+

3.7.2.131 Cookie, EXTD

+

TOS Filename Extender +

+

3.7.2.132 Cookie, FaKE

+

FakeMiNT +

+

Installs a MiNT cookie on non-MiNT systems. +

+

Modifies no vectors. +

+

Available from: http://stud.uni-sb.de/ gufl0000/atari. +

+

Licensing: GNU General Public License. +

+

3.7.2.133 Cookie, FALT

+

FALTOFF +

+

Fix-program for a bug problem with Setscreen on MegaSTE's. +

+

ST-Computer 1/1992, Page 165 +

+

Status: PD. +

+

3.7.2.134 Cookie, FAX!

+

This cookie is used for sending faxes with the program +STarFax: +

+

Bit 0...7: Number of ready fax pages +
Bit 8..31: Reserved +

+

3.7.2.135 Cookie, FAXR

+

Fax Redirector +

+

Serves for the automatic diversion of GDOS printer output to the +FAX device number. +

+

Modifies TRAP #2, but is normally invisible (as the trap is +subse- quently modified by the AES. +

+

Freely available for Tele-Office users from TKR. +

+

3.7.2.136 Cookie, FHFX

+

F030HFIX.PRG - (Falcon030 GEMDOS Handle Fix) +

+

Corrects an error in the Falcon's GEMDOS which leads to all file +functions not being able to manage negative device handles (-3 to -1) +(which is why GFA-Basic can no longer print). +

+

Modified vectors: TRAP #1. +

+

3.7.2.137 Cookie, FIX2

+

FIX24 +

+

Limits 68030 addressing to 24 bit; published in +ST-Computer. +

+

3.7.2.138 Cookie, FLTP

+

FlyTop +

+

Permits assignment of the position at which flying dialog boxes +will appear. +

+

Modifies TRAP #2 and, at reinstallation of the cookie jar, +resvector. Creates a VSCR cookie. +

+

ST-Magazin 1/92. +

+

3.7.2.139 Cookie, FLXD

+

Flexdisk (Version 1.4) +

+

3.7.2.140 Cookie, fMSX

+

fMSX.PRG +

+

Port of the freeMSX-emulator to GEM. +

+

Modifies vectors: Kbdvbase()->kb_kbdsys. +

+

Status: Freeware. +

+

3.7.2.141 Cookie, Fose

+

Font selector +

+

3.7.2.142 Cookie, FOse

+

Font selector (ACC or PRG) +

+

Accompanied by add-on program FOSEINST.PRG. +

+

ST-Computer disk PD 430, PD-pool 2239. +

+

3.7.2.143 Cookie, FrmD

+

Form_do_it +

+

3.7.2.144 Cookie, FSEL

+

Extended File-Selector +

+

The presence of this cookie signals that the AES call +'fsel_exinput' may be made (is set by some file-selectors). +

+

3.7.2.145 Cookie, FSER

+

Fast_Ser +

+

Routines for fast servicing of the serial interface(s). +

+

Modifies MAPTAP as well as SCC vectors. +

+

Status: Freeware. +

+
typedef struct
+{
+    uint16_t version;
+    unsigned unused:15;
+    unsigned baud_table_flag:1;        //* bit 0 in one WORD */
+    BASPAG *mem_blk;
+} FSER_INFO;
+
+

3.7.2.146 Cookie, FSMC

+

Vector-font GDOS +

+

The cookie is created by a vector-font-capable GDOS (e.g. +SpeedoGDOS or NVDI), and points to the following +structure: +

+
typedef struct
+{
+   int8_t  magic[4];
+   int16_t version;   /* Version number (0x400 for 4.00) */
+   int16_t quality;
+} SPEEDO;
+
+

Note: In the never officially available FSM GDOS +the element magic has the value '_FSM'; '_FNT' represents +FONTGDOS, '_SPD' SpeedoGDOS and 'TTFG' +ttf-gdos by Trevor Blight. +

+

3.7.2.147 Cookie, FSmp

+

Martin Patzel File Selector +

+

3.7.2.148 Cookie, fVDI

+

Shows presence of fVDI. +

+

3.7.2.149 Cookie, FxOP

+

Fax driver from Tele Office +

+

3.7.2.150 Cookie, F_3D

+

Focus 3D graphics program +

+

The cookie points to a structure over which communication with +external modules of Focus 3D takes place. +

+

3.7.2.151 Cookie, GABI

+

Gabriele 9009 IFD1 emulator +

+

Driver for typewriter on the serial port (improved version, +original appeared somewhere in ST-Computer). +

+

Uses TRAP #13 and MFP Int #12. +

+

3.7.2.152 Cookie, GBel

+

GemBell +

+

3.7.2.153 Cookie, GCOM

+

GEM Component Object Model +

+

This cookie indicates the availability of the GCOM extension. +The value of the cookie is a pointer to the service routines. GCOM is +at present not yet publicly available (Thomas Much). +

+

Status: GCOM will be Freeware. +

+

3.7.2.154 Cookie, GDEV

+

GNU-C Device driver +

+

The cookie's value is a pointer to a chained list of device +records (a more exact description is available on request) that are +entered by programs at launch into a corresponding internal list. +Together they then form a collection of device drivers which +correspond to the /dev directory of Unix. +

+

(Presently available: /dev/tty, /dev/tty1, /dev/mouse, +/dev/null, /dev/lp; further drivers are planned). +

+

3.7.2.155 Cookie, GEHC

+

Hot key driver for Hypercache Turbo+ +

+

Modifies ikbdsys. +

+

3.7.2.156 Cookie, GEHD

+

Hard disk driver +

+

3.7.2.157 Cookie, GEMB

+

GE Soft HD Driver +

+

3.7.2.158 Cookie, GENV

+

GEM Environment setter +

+

Source: ST-Magazin 6/1990. +

+

3.7.2.159 Cookie, Gfix

+

Gamefix for Falcon030 and programs created by it +

+

Intercepts the Srealloc call for activated old screen address, +though the routine lies in an officially no longer accessible region +of memory. +

+

Redirected vectors: TRAP #1. +

+

Status: Appeared in ST-Computer 11/93. +

+

3.7.2.160 Cookie, GI30

+

Gandhi - Outputs the information available from +exceptions +

+

The cookie points to a configuration structure. +

+

Modifies the following vectors: 2-9, 11, 13, 48-54, 56-58. +

+

Status: Freeware. +

+

3.7.2.161 Cookie, GIGA

+

GIGA-BOX ST driver +

+

3.7.2.162 Cookie, gk5"

+

Driver software for 5.25" high density third drive +

+

Modifies hdv_rw, hdv_bpb, hdv_mediach, etv_critic. +

+

3.7.2.163 Cookie, gkCO

+

Calamus interface module (gkCO) +

+

Affects mouse button routine (via VDI: vex_butv), and mouse +movement (via VDI: vex_motv). +

+

3.7.2.164 Cookie, GLAS

+

Free drive-space display +

+

Desk accessory for showing free space available on GEMDOS +drives. +

+

Hooks into hdw_rw and TRAP #1. +

+

3.7.2.165 Cookie, GLBL

+

GLBX_EXT.PRG - GEMLABEL system extension +

+

Modified: Reset vector, GEMDOS-trap. +

+

Status: Freeware. +

+

3.7.2.166 Cookie, GMNI

+

GEMINI - The shareware desktop (cookie only in old +versions) +

+

3.7.2.167 Cookie, GMTC

+

Timezone CPX +

+
3322 2222 2222 1111 1111 1100 0000 0000
+1098 7654 3210 9876 5432 1098 7654 3210
+---------------------------------------
+rrrr rrrr rrrr rrrs mmmm mmmm mmmm mmmm
+
+r - Reserved (Info about which town was clicked on in the CPX)
+s - 1 for summertime, 0 for wintertime
+m - Difference to GMT in minutes in wintertime
+
+

3.7.2.168 Cookie, GNUC

+

GNU-C library +

+

Modified: all traps from Buserror to Tracetrap, +kbd_vecs->ikbdsys, VBL, etv_term, etv_timer, resvector. +

+

3.7.2.169 Cookie, Gnva

+

Geneva multi-tasking AES +

+

This cookie either contains a pointer to the G_COOKIE structure +or it contains zero. If it contains zero, this means that Geneva was +previously installed, but is no longer. +

+
typedef struct
+{
+  int16_t ver;
+  int8_t *process_name;
+  int16_t apid;
+  int16_t (**aes_funcs)();
+  int16_t (**xaes_funcs)();
+  struct G_vectors *vectors;    /* Release 004 */
+} G_COOKIE;
+
+ + + + + + + + + + + + + + + +
ver Geneva version, 0x0102 means 1.02 +
  +
process_name Points to the name of the process currently using Geneva; this +is in appl_find format +
  +
apid Application ID of the process +
  +
aes_funcs Internal table of AES functions +
  +
xaes_funcs Internal table of extended functions +
  + +
+ +

Note: The function tables are subject to change in +future versions. +

+

3.7.2.170 Cookie, GOBJ

+

Was used by the ObjectGEM PurePascal library up to +Version 1.20. As of Version 1.50 the cookie is no longer created. +

+

3.7.2.171 Cookie, GOff

+

Grow-/shrink-boxes Off-switch +

+

Modifies: TRAP #2. +

+

3.7.2.172 Cookie, GSND

+

GEM Sound +

+

3.7.2.173 Cookie, GSP1

+

GEM Spooler +

+

3.7.2.174 Cookie, GSXB

+

Generic sound XBIOS +

+

3.7.2.175 Cookie, GULM

+

Guläm command shell +

+

Modifies: _shell_p. +

+

3.7.2.176 Cookie, HABO

+

HaBoo 1.8 - Hard disk cache (first published in +ST-Magazin 6/1988). +

+

Note: It is no longer supported, requests are pointless. +Use TOS 1.04 (or newer) with CACHENNN.PRG or similar instead! +

+

3.7.2.177 Cookie, hade

+

Hades computer +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Bitavailable hardware
0ROM port
1VME nus
2SCSI card
3Atari DMA
4 - 11Reserved
12 - 15Reserved for video hardware
 12 = ET4000 at ISA bus
 13 = graphic card at VME bus
 14 = PCI bus graphic card
16 - 31Machinen version (at moment 0)
+
+ +

3.7.2.178 Cookie, HAMM

+

Software for 'Melody Maker' +

+

Modifies various timer vectors. +

+

3.7.2.179 Cookie, HBFS

+

BoxKite - Resident File-Selector +

+

Modifies TRAP #2 and #13. The value of the cookie is the entry +address of the TRAP #2 handler. +

+

Status: Freeware. +

+

3.7.2.180 Cookie, HcP6

+

NEC P6 Hardcopy in two sizes, works with Hyperscreen. +

+

Takes over hardcopy vector ($502). +

+

3.7.2.181 Cookie, HDDR

+

HD Driver +

+

3.7.2.182 Cookie, HDEX

+

HD Driver's-own interface +

+

3.7.2.183 Cookie, HDEY

+

Hard Disc Eye +

+

Lights drive A:'s LED whenever a hard drive is accessed. +

+

Modifies hdv_rw. +

+

3.7.2.184 Cookie, HDJR

+

HuSHI +

+

Hard & Soft Harddisk-Interface (hard disk driver). +

+

3.7.2.185 Cookie, HDLD

+

'HD-LED' Drive A: +

+

Uses the normal drive activity LED as HD-LED. +

+

Modifies hdv_rw. +

+

Status: Public Domain, dissassembled and errors removed. +

+

3.7.2.186 Cookie, HDPR

+

HDPROTEC +

+

Write- and read-protect program. +

+

3.7.2.187 Cookie, HDRC

+

AUDIODRV +

+

Driver for a hard disk recording system that is connected at the +ACSI port. +

+

Redirected vectors: 200Hz timer, hdv_bpb, hdv_rw, hdv_boot, +hdv_mediach. +

+

3.7.2.188 Cookie, HDST

+

Eickmann HD Driver +

+

3.7.2.189 Cookie, HDSW

+

HDSWITCH.PRG - High Density Switcher (at present V1.1) +

+

Configuration for high density floppy drives. +

+

[LSHIFT][ALT][HELP] changes the mode (auto, forced HD, forced +DD). +

+

Modifies scr_dump. +

+

3.7.2.190 Cookie, HFIX

+

Handle-Fix +

+

Ensures that the device number desired by the Atari GDOS +versions is passed for v_opnvwk. +

+

Published in ST-Magazin 4/92. +

+

3.7.2.191 Cookie, hFRB

+

BIOS driver for Rwabs transfers into/out of Fast-RAM +

+

Intercepts Rwabs, and redirects all accesses to Fast-RAM through +the FRB. Required for PAK with Fast-RAM. +

+

Status: PD. +

+

3.7.2.192 Cookie, HIDS

+

HIGHDENS.PRG - High density disk driver (at present +V2.0) +

+

With circuit modifications of the MAXON-HD solution for using +high density floppies on computers not originally fitted with them, +this driver allows (almost) imperceptible High Density floppy +handling, particularly with 5 1/4" drives and/or two drives. +

+

Modifies etv_critic, hdv_bpb, hdv_rw, XBIOS. Requires 1xVBI. +

+

3.7.2.193 Cookie, HMDU

+

Memory dump for PMD of the Hänisch Modula2 system +

+

Affects exception vectors 2-8. +

+

3.7.2.194 Cookie, HMOC

+

Object cache for Hänisch-Modula +

+

3.7.2.195 Cookie, HMRD

+

Run-time Debugger of Hänisch-Modula +

+

The following vectors are modified: TRAP #0, 3-12, 15; exception +vectors 2-8, VBL-interrupt. +

+

3.7.2.196 Cookie, HMRS

+

Run-time System of Hänisch-Modula2 +

+

Affects exception vectors 2-8. +

+

3.7.2.197 Cookie, HPHC

+

Hardcopy for HP DeskJet +

+

Modifies hardcopy vector. +

+

3.7.2.198 Cookie, HPLJ

+

HP LaserJet emulator V1.04 +

+

This desk accessory converts the printer control-codes of an HP +LaserJet printer that are output via a GEMDOS or BIOS function into +a raster graphic. +

+

Uses vectors: TRAP #1, TRAP #13. +

+

3.7.2.199 Cookie, HSCD

+

MiNT CD-ROM driver +

+

Affects mediachange vector. +

+

Commercial product from Hard & Soft. +

+

3.7.2.200 Cookie, HSND

+ +

CrazySounds +

+

Assigns sound sample outputs to operating system actions, +key-presses etc. +

+

Vectors: GEMDOS; BIOS; AES/VDI; IKBD/MIDI; mouse (KBDVECS.mousevec); bell_hook; +kcl_hook; bus errors; address errors; illegal commands; ST-MFP I13 +(Timer A). +

+

Distribution by MAXON Computer GmbH. +

+

3.7.2.201 Cookie, HWAM

+

Cookie Jar creator program +

+

3.7.2.202 Cookie, IBMP

+

IBMPRINT.PRG +

+

Converts Norwegian characters to IBM standard printer +characters. +

+

3.7.2.203 Cookie, ICFS

+

ICFS - Iconify-Server +

+

Assigns positions for iconified windows for programs that want +to offer iconifying also under old TOS versions and MagiC 2.0. The +XBRA ID is used under MagiC as of Version 3, which is persuaded by the +redirection of TRAP #2 to use ICFS. +

+

3.7.2.204 Cookie, ICST

+

INETCUST cookie +

+

3.7.2.205 Cookie, IDSK

+

ICON-Desk +

+

Source: ST-Digital. +

+

3.7.2.206 Cookie, IMAC

+

Bootsector guardian +

+

Status: PD. +

+

3.7.2.207 Cookie, IMNE

+

Imagine graphics card +

+

3.7.2.208 Cookie, INSJ

+

Insjar +

+

This installs a cookie jar or extends an already existing one. +The five standard cookies are installed. _CPU and _FPU are filled +with values corresponding to the installed hardware. If a 68030 board is +present, then _longframe is set accordingly. +

+

3.7.2.209 Cookie, INXR

+

Index generator +

+

3.7.2.210 Cookie, iPRN

+

iPRN - Interrupt-using BIOS handler for device PRN +

+

Speeds up print output with programs that print via GEMDOS or +BIOS, as well as screen dumps via Alternate-Help. Eliminates the +wasted minute waiting for a timeout when printer is not switched on, +as well as the rubbish byte at a reset. +

+

The cookie contains a pointer to configuration variables. +

+

Modifies the BIOS-trap, prv-lsto, prv-lst, xcostat0, xconout0 +and resvector (all with XBRA). Activates and uses MFP interrupt I0. +

+

Status: Freeware up to 0.99, after this Shareware. +

+

3.7.2.211 Cookie, IRSB

+

VBL_BRIX.PRG +

+

This modifies the autovector interrupt, Level 4, to allow +switching the shuttering action of SEGA 3D spectacles (German: +'Brille') during the VBL. +

+

Status: Shareware. +

+

3.7.2.212 Cookie, iTMA

+

MFP Timer A interrupt handler +

+

Interrupt-controlled floppy disk operations (read/write/format). +

+

Installed by E-Copy as of 2.0, E-Backup as of 2.0, Kobold as of +3.0. +

+

3.7.2.213 Cookie, JAM1

+

'Butler James' +

+

Redirected vectors: hdv_rw, hdv_bpb, TRAP #1, Trap #14 +

+

Available from: Various mailboxes, or direct from the author +Pascal Fellerich (see ST-Magazin 2/90). +

+

3.7.2.214 Cookie, JANU

+

The Atari emluator Janus form vhf Computer is present. +

+

3.7.2.215 Cookie, JB2G

+

BIOS2Gdos +

+

This is a program that outputs all text and HP-PCL output over +Bconout(0) via GDOS. +

+

The cookie points to an internal structure to configure the TSR +program with a CPX. +

+

Redirected vectors: Xconstat[0], Xconout[0]. +

+

Status: Shareware. +

+

3.7.2.216 Cookie, JCLK

+

Clocky multi-utility +

+

3.7.2.217 Cookie, JCNB

+

JCNBOOT - Mouse-operable boot selector (Auto, ACC, +setups) +

+

3.7.2.218 Cookie, JCNC

+

Control field (little multi-ACC) +

+

Redirected: etv_term, $114, mousevec, kbdsys and perhaps in +future clockvec. +

+

3.7.2.219 Cookie, JCNH

+

Hardcopy program +

+

Redirected: $100. +

+

3.7.2.220 Cookie, JCNT

+

COCTEAU (may still be changed) +

+

Text processing program by Jens C. Neffe. +

+

Redirected: etv_term. +

+

3.7.2.221 Cookie, JFTP

+

SCSI driver for generic tape devices +

+

Compatible to Paul Moreaus' "Tape-Driver", in basic +functions also to Alan Houriane's "Kopie". Driver for MiNT. +

+

Affects vectors: BIOS is extended for versions < 2.0. +Current version: 1.4. +

+

Distribution: Shareware/Beta-Releases. Versions > 2.0 +possibly with MultiTOS. +

+

3.7.2.222 Cookie, JINX

+

Jinx +

+

3.7.2.223 Cookie, JMLB

+

McBoot bootselector +

+

Modifies vectors: resvector, exec_os. +

+

Status: Shareware +

+

Frey key: +

+
general key
+no street
+no town
+1554446552
+
+

3.7.2.224 Cookie, JMLS

+

JML_SNAP +

+

This is a screen snapshot program for all resolutions in +2/4/16/256 colours in palette mode as well as 15/16/24/32-bit in +direct-colour mode. The cookie points to a programmer interface. +

+

Redirected vectors: scr_dump. +

+

3.7.2.225 Cookie, JSHD

+

Hyper-Density control program +

+

Source: ST-Computer 7/1989. +

+

3.7.2.226 Cookie, JUST

+

Justify +

+

Registers all program- and their file-calls and saves these. +This information can then be evaluated. +

+

Redirected: GEMDOS-trap. +

+

3.7.2.227 Cookie, J_Sc

+

SECURE.PRG +

+

This makes a pointer available that is used by JML-Snapshot. +SECURE is a part of the JML-Snapshot package, but is Freeware. +

+

3.7.2.228 Cookie, KAOS

+

KAOS is an operating system modification +

+

As of Version 1.4 it creates this cookie. The LONGword contains +the creation date in packed BCD format: +

+

0x22121989L corresponds to "22.12.1989" +

+

3.7.2.229 Cookie, KbEv

+

Keyboard-Event handling module for Megamax Modula2 +

+

3.7.2.230 Cookie, KEYT

+

KEYTAB - Keyboard remapping program +

+

The cookie points to a structure with conversion routines for +various character-set tables (Atari, ANSI, Mac, PC). +

+

Status: Freeware. +

+

3.7.2.231 Cookie, KGTF

+

Tos Fix +

+

3.7.2.232 Cookie, KIDI

+

RAMdisk by Robert Irrgang +

+

3.7.2.233 Cookie, KLME

+

CMD is the extremely compact command line interpreter for TOS, +KAOS and MagiC. +

+

The executable can be named: +
+

+

- MCMD for MagiC +
- KCMD for KAOS +
- CMD for TOS +
+

+

Modified: etv_term +

+

3.7.2.234 Cookie, KREG

+

Kill Registers +

+

Hangs in the GEMDOS-trap and destroys the registers +a0/a1/a2/d1/d2. +

+

Status: Freeware, killregs.zoo +

+

3.7.2.235 Cookie, KyMp

+

Keyboard Macro & Remapping utility +

+

Redirected vectors: kbdvbase->ikbdsys and etv_timer). +

+

Status: Public Domain. +

+

3.7.2.236 Cookie, KyWt

+

KeyWatch +

+

This supervises all keyboard inputs made while the Control and +Alternate keys are being held down. Furthermore KeyWatch offers other +programs the possibility of linking into these key presses. This makes +cross-program shortcuts possible. +

+

3.7.2.237 Cookie, Lace

+

LaceScan +

+

LaceScan is a package that allows an ordinary ST to display a +much larger screen area (i.e. more pixels) than that ordinarily used +by each of the three original resolutions, and also to emulate some +larger resolutions than even this enlarged screen can display +physically. +

+

3.7.2.238 Cookie, LACY

+

LAZy-Shell-III +

+

Modifies TRAP #1, TRAP #13, GEMDOS. +

+

'Special' disk from MAXON Computer GmbH. +

+

3.7.2.239 Cookie, LALA

+

ALBOLALA! +

+

Module for the playing of samples via bell_hook +(ST-Magazin 1/92). +

+

3.7.2.240 Cookie, lanc

+

MiNT-Net ethernet driver for AMD LANCE +

+

lance.xif, pamintrn.xif, rieblmst.xif, rieblmst_fast.xif, +rieblspc.xif, rieblspc_fast.xif, rieblste.xif, riebltt.xif - these are +a part of the Ethernet driver of the MiNT-Net package for AMD +LANCE-based Ethernet cards (PAMsNet, Riebl). +

+

Affects vectors: int2 (HBI), int4 (VBI), int5. +

+

3.7.2.241 Cookie, LASB

+

Laserbrain - Epson emulator for Atari SLM Laser printers +

+

Affects BIOS-trap, GEMDOS-trap, hardcopy vector. +

+

3.7.2.242 Cookie, LAWC

+

Look-Ahead Write Cache V1.10 +

+

This cache utility employs the look-ahead process for the +reading of sectors and a write-cache for writing. +

+

Used vectors: hdv_rw. +

+

3.7.2.243 Cookie, LDGM

+

GEM Dynamical Libraries (LDG) +

+

3.7.2.244 Cookie, LEDP

+

LED Panel +

+

Displays hard disk accesses and optionally other things like +date and time on the screen. +

+

Modified via XBRA: hdv_rw. +

+

Status: Version 2.4 (31.1.94), PD. +

+

3.7.2.245 Cookie, LEmu

+

LaceScan command-keys emulator +

+

3.7.2.246 Cookie, Lity

+

Liberty +

+

3.7.2.247 Cookie, LLCR

+

1st_lock +

+

Affects: hdv vectors. +

+

3.7.2.248 Cookie, LMus

+

LaceScan mouse accelerator +

+

3.7.2.249 Cookie, LOGB

+

Logbuch (Logbook) +

+

Launches programs by means of a program history in a popup. +

+

Hangs in the GEM-trap and waits for shel_write calls. +

+

Status: Freeware. +

+
typedef struct
+{
+   int16_t numln;
+   int16_t reserved1;
+   int16_t reserved2;
+   int16_t reserved3;
+   int16_t reserved4;
+   int16_t reserved5;
+   int16_t reserved6;
+   int8_t  **lnptr;
+} HISTREC;
+
+

lnptr points to a field of maximum numln +NULL-terminated strings that contain the program names with full path. +If there are fewer than numln entries, the list ends with an +empty string. +

+

3.7.2.250 Cookie, LoSe

+

SER-LOG - Logs output from and to the modem. +

+

Alters xconin and xconout for AUX. +

+

3.7.2.251 Cookie, LPCD

+

Carrier Detector +

+

3.7.2.252 Cookie, LPJM

+

Joy Mouse +

+

Source: ST-Magazin 7/89. +

+

3.7.2.253 Cookie, LP/2

+

Modifies Malloc/2, GEMDOS vector +

+

Introduced in ST-Magazin 3/91. +

+

3.7.2.254 Cookie, LTMF

+

LETEMFLY.PRG or LET_LGHT.PRG - Let 'em Fly! +

+

Replaces/extends almost all form_xxxx routines of the AES. +Thanks to this many dialogs are now: a) flight-capable, b) operable +via the keyboard and c) provided with additional functions for +editable fields. Furthermore, the cookie jar will now offer a flying +routine for non-form_do dialogs. +

+

Modifies: TRAP #2 (AES/VDI), TRAP #13 (BIOS). +

+

Status: Freeware. +

+

3.7.2.255 Cookie, M16s

+

Designates the start of the CyReL M16 STRUCTure, a +resident data block that contains the I/O vectors and hardware +addresses of the CyReL M16-1280 TrueColor graphics cards (max. 4 per +system). If the CyReL GIOS (General IO System) is installed, this XBRA ID +is also initialized in the BIOS, XBIOS and GEMDOS vectors. +

+

3.7.2.256 Cookie, M16X

+

CyReL M16 XBIOS emulator +

+

This is entered in the XBIOS vector. +

+

3.7.2.257 Cookie, macc

+

MACCEL 3.3 +

+

The cookie has a different (non-printable) value (namely +$00AA006E). +

+

Modifies MFP rec. buffer full, mousevec, ikbdsys. +

+

3.7.2.258 Cookie, MADD

+

ADDMEM +

+

Allows use of the TT-RAM despite 24-bit addressing. +

+

Published in ST-Computer. +

+

3.7.2.259 Cookie, MADN

+

NEX-output - AUTO-folder TSR +

+

The cookie contains the address of a function that is +responsible for the transmission of data, including control codes, via +the serial port or to the console respectively. +

+

NEX-output is contained only in the NEX package and so is +subject to the same status. +

+

Source for NEX (Shareware) and queries regarding NEX: Franz +Blaha. +

+

3.7.2.260 Cookie, Maes

+

From MyAES, which replace the AES. +

+

3.7.2.261 Cookie, MagC

+

Configuration of the MagicDials for CAT and CatPutz and +other Magic programs that support this cookie. One can configure the +flight capability, operation from the keyboard, the appearance of +alert boxes etc. +

+

3.7.2.262 Cookie, MAGN

+

This cookie is created if the MAGNUM card has FastRAM +installed. +

+
struct
+{
+  uint16_t version;   /* Version number - currently 1 */
+  uint32_t fr_start;  /* Start address of FastRAM     */
+  uint32_t fr_len;    /* Length of FastRAM            */
+} MAGN_cookie;
+
+

This information can be used by hard disk drivers, for instance, +to transfer data directly via DMA to this memory block. Other programs +should ignore this cookie and allocate their memory cleanly with +Mxalloc. +

+

3.7.2.263 Cookie, MagX

+ + +

MagiC operating system +

+

The cookie is installed by the alternative operating system MagiC, +and points to the following structure: +

+
typedef struct
+{
+   int32_t   config_status;
+   DOSVARS  *dosvars;
+   AESVARS  *aesvars;
+   void     *res1;
+   void     *hddrv_functions;
+   int32_t   status_bits;
+} MAGX_COOKIE;
+
+

Note: The elements res1 and +hddrv_functions are available only since MagiC 3, +status_bits only since the version of 24.05.1995. +

+

Warning: The version number of MagiC, which contains +the presence of this extended cookie, can, stupidly, not be queried +via AESVARS, as this pointer to the variables of the AES is still +NULL at boot-time. Luckily one can access the pointer also via the +TOS system-header (because this pointer is always valid); this can +be performed via DOMagixAESVars. +

+

See also: MgMc   MgMx   MgPC +

+

3.7.2.264 Cookie, MAST

+

Master +

+

Modified: Bus error, TRAP #1, TRAP #13, etv_critic, etv_term, +_shell_p, resvector (old_resvalid lies directly before the 'XBRA'). +

+

3.7.2.265 Cookie, MaTC

+

Matrix True Colour graphics card +

+
typedef struct
+{
+  int16_t version, release;
+  int8_t *date;
+
+  SCREENparameter *scr_par;
+  BOARDparameter  *brd_par;
+  TCXXtables      *tables;
+  E2Pparameter    *e2p_par;
+} TCXXparameterBlock;
+
+

3.7.2.266 Cookie, MbAr

+

As long as MenuBar is installed, one can use +menu_bar(-2/-3) to inquire the tree address of an application's menu +bar. menu_bar(-2) returns the high WORD and menu_bar(-3) the low WORD. +

+

3.7.2.267 Cookie, MBRD

+

Blit_RD - A RAMdisk that uses the blitter (if present) +

+

Modifies the three hdv_... vectors. +

+

3.7.2.268 Cookie, MCL_

+

MiNT control +

+

3.7.2.269 Cookie, McSn

+

MacSound +

+

Falcon-compatible sound routines +

+

The cookie shows the availability of Falcon-compatible +"XBIOS" sound routines on a Mac. +

+

3.7.2.270 Cookie, MCSP

+

Unimplemented Integer Instruction and Floating Point Handler +

+

Use the Line-F Vector. +

+

3.7.2.271 Cookie, MCWR

+

Microwire DMA sound interface +

+

The value of the MCWR cookie is used as values for the MICROWIRE +interface. +

+

The highest byte represents the total sound volume. The +following byte represents the volume of the left channel. The byte +after this represents the volume of the right channel. The last byte +is divided into two nibbles: The higher value nibble represents the +strength of bass frequencies, the lower value one the strength of the +treble frequencies. +

+

The value of the MCWR cookie represents the following structure, +expressed in 'C': +

+
typedef struct
+{
+  unsigned volume: 8;
+  unsigned left:   8;
+  unsigned right:  8;
+  unsigned bass:   4;
+  unsigned treble: 4;
+} MCWR;
+
+

3.7.2.272 Cookie, MDIA

+

Multi-Dialog - Moves any dialog to a window +

+

The cookie jar contains pointers to various sets of information. +

+

Modifies: TRAP #2 (AES), TRAP #13 (BIOS) and etv_term +(GEMDOS vector #258). +

+

Status: Freeware +

+

3.7.2.273 Cookie, MDRK

+

MegaDark - Screensaver for the MegaVision300 graphics +card +

+

Modifies one slot in the vbl-queue, ikbdsys and InitMouse +

+

Source: Sang Support mailbox. +

+

3.7.2.274 Cookie, MDSa

+

Medical Design Software's serial fix +

+

3.7.2.275 Cookie, MFAC

+

Multi-accessory +

+

3.7.2.276 Cookie, MFFM

+

Mfsfm - Marcus' file-selector for MiNT +

+

Modified vectors: GEM/VDI-trap, BIOS-trap. +

+

Status: Shareware. +

+

3.7.2.277 Cookie, MFIX

+

MONOFIX.PRG for Falcon 030 +

+

If an SM124/44/46 monitor is connected, this sets the system +variable $44c to the correct value 2 (Maccel then saves correctly) and +changes the palette size in the VDI work_out field also to 2. With +this some older programs will work again which previously believed +they could not run in ST-high. +

+

Modified vectors: TRAP #2. +

+

3.7.2.278 Cookie, MFMV

+

From Magic installed +

+

3.7.2.279 Cookie, MFNT

+

Font-loader accessory or program, with add-on program +MFNTINST.PRG +

+

Source: PD-Pool diskette 2240. +

+

3.7.2.280 Cookie, MGEM

+

MultiGEM +

+

Source: Maxon GmbH. +

+

3.7.2.281 Cookie, MgMc

+ +

MagiC Mac operating system +

+

The cookie is created by the alternative operating system +MagiC Mac, a port of MagiC to the hardware of the Apple (Power) +Macintosh, and points to a MgMc cookie structure. +

+

See also: MagX   MgMx   MgPC +

+

3.7.2.282 Cookie, MgMx

+

MagiC Mac X +

+

Set by a port of the MagiC alternative operating system for +Macintosh computers running OS X. +

+

See also: MagX   MgMc   MgPC +

+

3.7.2.283 Cookie, MgPC

+

MagiC PC +

+

Set by a port of the MagiC alternative operating system for +Microsoft Windows. +

+

See also: MagX   MgMc   MgMx +

+

3.7.2.284 Cookie, MgSn

+

MagiC Mac Sound driver +

+

Emulation of Falcon's XBIOS. There is no matrix like the one +in the Falcon in the MacOS system. Nevertheless it's possible to: +

+
    +
  • Play samples in 8/16-bit mono and stereo (with/without D2D) +
  • +
  • Record 16-bit samples in stereo like the Falcon (with/without +D2D) +
  • +
  • Select the input source (the current input source when MagiC +Mac is started or the number one) +
  • +
  • Connect or remove the audio source to the audio output +
  • +
  • Set the level output on the two channels +
  • +
  • Set the gain input on the two channels +
  • +
  • Emulation on the selection of tracks (1 to 4) +
  • +
  • FFDI external clock selection compatible +
  • +
  • Extended functions added, like the GSXB/MilanBlaster drivers, +for example. It's possible to choose the true frequency. Bit 5 of the +_SND cookie is set. However, 24/32-bit and the mixer are not +supported, and only Motorola format is supported. +
  • +
  • This driver can run on the Hades! The output is from the YAMAHA +chip or the MV16/PSOUND card. In this case audio input functions are +removed. The Timer A of the MFP2 is used. +
  • +
  • This driver can run on Aranym! The driver uses SDL calls inside +Aranym. Recording isn't possible. +
  • +
+ +

3.7.2.285 Cookie, MID3

+

MIDINET3.PRG - Resident MidiNet terminal (for use with +MiniBBS) +

+

3.7.2.286 Cookie, MIMA

+

MIDIMAN.PRG/ACC - MIDI manager (at present V1.0ß) +

+

A MIDI utility which permits exchange of SysEx data, contains a +MIDI monitor, a MIDI keyboard, a MIDI filter and naturally a MIDI thru. +

+

Modifies: midisys, hooks out of: midivec, requires: 1xVBI. +

+

3.7.2.287 Cookie, MiNT

+ +

MiNT (MiNT is now TOS) +

+

The cookie is created by the GEMDOS extension MiNT, a powerful +kernel that is also used under MultiTOS. The value of the cookie +consists of a main/sub version number in the high/low byte of the low +WORD resp. So a value of 0x00000113L represents the version 1.19. +

+

3.7.2.288 Cookie, MIPS

+

SPOOL120.PRG - 120KB printer spooler with hardware +interrupt +

+

Modifies: 1290: prv_lst, xconin0, xcostat0, xconout0, BusyInt. +

+

3.7.2.289 Cookie, MJAF

+

AUTOFONT +

+

3.7.2.290 Cookie, MKHC

+

Hardcopy fix +

+

Source: ST-Computer 12/1989. +

+

3.7.2.291 Cookie, MkJr

+

The cookie identifies a Make Cookie Jar AUTO-folder +program which installs a cookie jar on all machines (apart from STE, +Falcon030 or TT030, which already have a cookie jar natively). +

+

The four system cookies are created, where the _CPU cookie +distingui- shes (cleanly) the processor types 68000, 68010, 68020 and +68030, though the other cookies are assigned fixed values +(corresponding to a [Mega] ST[F[M]]). +

+

3.7.2.292 Cookie, MM2X

+

Megamax Modula low-level module, with which Modula +procedures can be installed without employing Assembler for intercepting +any desired processor exception (TRAP instructions, bus-error, etc.). +

+

3.7.2.293 Cookie, MMAC

+

MM_ACCEL.PRG - MagicMouse +

+

Mouse accelerator (6th order polynomial). +

+

Vectors that are modified: mouse_vec, resvector. +

+

Status: Freeware. +

+

3.7.2.294 Cookie, MMUT

+

MM2_UTIL.PRG - Midi-Maze ][ utility +

+

With the Midi-Maze ][ utility the ring-test is configured +somewhat more comfortably. Furthermore, due to a MIDI Thru it is +possible to leave Midi-Maze without the ring collapsing. +

+

Modifies: midivec. +

+

Status: Freeware. +

+

3.7.2.295 Cookie, MM_2

+

Midimaze 2 +

+

Status: Shareware. +

+

3.7.2.296 Cookie, MN3D

+

MENU3D.PRG - Menus and submenus in 3D-look +

+

When MENU3D.PRG is launched, all menu lines and submenus +initialized in the future will appear in 3D-look, as long as the +system supports 3D-look. +

+

Uses TRAP #2/AES-VDI. +

+

3.7.2.297 Cookie, MNAM

+ + +

Machine Name +

+

The cookie points to a null-terminated ASCII string (maximum 24 +characters plus NULL-byte), which describes the type of the computer +hardware (e.g. "ATARI TT030"). When setting the name, please +keep it short! +

+

3.7.2.298 Cookie, MOAF

+

ARROWFIX - Fix program for GEM 3.2 (TOS 2.06, 3.06) +

+

Corrects errors in WM_ARROWED messages of GEM 3.2. +

+

Modifies BIOS- and GEM-trap, if the GEM cannot be +patched. +

+

3.7.2.299 Cookie, MOGR

+

GEMRAM - Installs GEM in RAM +

+

Modifies _sysbase, _exec_os and as a result all vectors of +GEM. On successful installation it enters this cookie in the cookie +jar. If a new jar has to be created, a reset routine for +deinstallation is incorporated. +

+

3.7.2.300 Cookie, MPRO

+

MagicPro config CPX +

+

Contains pointers to configuration data of programs that use +Magic Professional >= 1.00. Exact format available on request. +

+

3.7.2.301 Cookie, MRAM

+

More RAM - Enlarges the free memory +

+

3.7.2.302 Cookie, MSPD

+

MSPEED.PRG - 'Very small and simple mouse speeder' +

+

3.7.2.303 Cookie, MSPO

+

MS_SPOOL.PRG - Magic Spooler +

+

Printer spooler, print to file, swap to disk. +

+

Modified vectors: BIOS, busy_int, hz_200, resvector, prv_lsto, +prv_lst, vbl_slot. +

+

Status: Freeware. +

+

3.7.2.304 Cookie, mstx

+

Mouse Tricks +

+

3.7.2.305 Cookie, MTCI

+

MATRIX MatGraph - TCxx +

+

The program tcxxinfo.tos from the MATRIX graphic card installs +some XBIOS functions. +

+

See also: MATRIX +

+

3.7.2.306 Cookie, MTft

+

Trapper - AUTO-folder TSR +

+

Installs a function table for the BIOS, XBIOS, GEMDOS and +(not yet to date) AES which the TSRs can use to hook themelves in. +

+

The cookie contains a pointer that enables accesses to various +data structures and various functions. +

+

Modifies TRAP #1, #13, #14 and (not yet) #2. +

+

Status: Version 1.0 is Freeware. +

+

3.7.2.307 Cookie, MUPF

+

Mupfel - Unix-like shell, up to Version 1.2x +

+

3.7.2.308 Cookie, MWHL

+

MWheel +

+

3.7.2.309 Cookie, MZTR

+

TRASH +

+

3.7.2.310 Cookie, MZVT

+

VT_DRIVE.PRG +

+

VT_DRIVE.PRG stellt einen Treiber für den Videotext-Decoder von +Print- Technik (neuere Version zum Anschluß an den ROM-Port) zur +Verfügung. +

+

Der Treiber stelle eine neue BIOS Funktion zur Verfügung mit +deren hilfe der Decoder angesteuert werden kann. +

+

Vectors modified: BIOS-trap +

+

3.7.2.311 Cookie, M_IN

+

MATRIX MatGraph - Cxx +

+

The program cxx_info.tos from the MATRIX graphic card install +some XBIOS function. +

+

See also: MATRIX +

+

3.7.2.312 Cookie, N203

+

Multipurpose accessory +

+

Modifies vectors: Timer C, GEMDOS, BIOS, XBIOS, hardcopy, +hdv_rw, hdv_bpb, hdv_mediach, keyboard, mouse, Vblank. +

+

3.7.2.313 Cookie, nAES

+ +

N.AES - the AES for MiNT +

+

This cookie is created by the AES-replacement N.AES and +points to the structure N_AESINFO. +

+

3.7.2.314 Cookie, NAH3

+

The N_ALTHLP snapshot utility is installed. +

+

Vectors modified: scr_dump ($502) +

+

3.7.2.315 Cookie, NBEL

+

SOUND.PRG +

+

Hooks itself into bell_hook and outputs a DMA sound. +

+

3.7.2.316 Cookie, NBLL

+

NEWBELL.PRG +

+

Sets a new system bell sound. +

+

Modified: bell_hook, reset vector. +

+

Status: Freeware. +

+

3.7.2.317 Cookie, NCLN

+

Niceline +

+

With this resident program nearly all applications attain the +better- looking seperation lines known from Gemini in their menus. +

+

Modifies TRAP #2 and TRAP #13. +

+

3.7.2.318 Cookie, ne2k

+

ne2000.xif- Driver for PCI NE2000 cards +

+

Sets up the PCI-BIOS (at present low level). +

+

Vectors: Hooks into the interrupt chain of the PCI-BIOS. +

+

Status: Commercial. +

+

3.7.2.319 Cookie, NERV

+

No etv_critic_alert +

+

Disables the etv_critic alert box on drives A: and B: after +multiple attempts. +

+

3.7.2.320 Cookie, NETS

+

Driver software for PAM Novell netware +

+

3.7.2.321 Cookie, NEXB

+

NEX-BUFFER +

+

This reserves a block of memory of a fixed size and links it via +a cookie structure. +

+

No vectors are modified. +

+

Status: NEX-BUFFER is a component of 'Maustausch-Externals' NEX +(Shareware) and is only available with this package, i.e. NEX-BUFFER +may not be distributed separately. +

+

3.7.2.322 Cookie, NEXK

+

NEX-Toolkit - AUTO-folder TSR +

+

Installs a cookie pointing to a functions table with permanently +needed functions for the Maustausch program NEX. +

+

Status: NEX-Toolkit is only contained in the NEX package and so +is subject to the same status. +

+

3.7.2.323 Cookie, NFMT

+

INFOMAT +

+

This displays cookie and system infos and creates/enlarges a +cookie jar on request. The cookie contains information about the +program that installed it and the type of action undertaken. +

+

Status: Freeware. +

+

3.7.2.324 Cookie, NFnt

+

Neodesk Font-loader +

+

3.7.2.325 Cookie, NKCC

+

Normalized Key Code Converter - Keyboard and event +manager +

+

Library for binding in to Pure-C or Turbo-C programs. Converts +key codes into an appreciably more comfortable format that is +independent of the TOS version (country language!). All possible key +combinations are recognized. Furthermore a deadkey mechanism (e.g. e +and ' become é) and direct ASCII input (Alternate + number block) are +built in. +

+

Modifies vectors: 200 Hz system clock ($114), GEM-trap, VDI x_butv. +

+

Copyright status: Public Domain. +

+

3.7.2.326 Cookie, NLdr

+

Neodesk Loader +

+

3.7.2.327 Cookie, NMGE

+

No More amc-Gdos Errors +

+

Hooks into TRAP #2. +

+

3.7.2.328 Cookie, NO7P

+

NO7PRINT.PRG - Converts Norwegian characters for 7-bit +printers +

+

3.7.2.329 Cookie, noCF

+

noSystem +

+

3.7.2.330 Cookie, NOR5

+

NORKEY5.PRG - Norwegian keyboard-driver with lots of +extra stuff +

+

3.7.2.331 Cookie, NOVA

+

NOVA graphics card +

+

3.7.2.332 Cookie, NSC1

+

N_SYSCOM 1.1 +

+

A desk accessory that displays all GEMDOS, XBIOS, BIOS and +GEM calls on the screen. +

+

3.7.2.333 Cookie, Nspd

+

Cookie from the Nemesis Falcon accelerator +

+

The information for this cookie can contain one of three +different values: +

+
  0  Nemesis Off
+  1  Nemesis Lo
+  2  Nemesis Hi
+
+

3.7.2.334 Cookie, nTAS

+

Indicates that no TAS instructions are to be executed +(due to an error in `HyperCache'). Is respected by GEMAR. +

+

3.7.2.335 Cookie, NTK4

+

NTK4 - Falcon MOD player +

+

3.7.2.336 Cookie, nTOS

+

MilanBlaster +

+

Uses TRAP #14/XBIOS and TTMFP/SCSI DMAC. +

+

3.7.2.337 Cookie, NUL>

+

System startup utility +

+

3.7.2.338 Cookie, NVDI

+ +

NVDI - Fast replacement of the VDI +

+

The cookie is installed by the 'screen speeder' NVDI, and points to +the following structure: +

+ +
typedef struct
+{
+  uint16_t nvdi_version;      /* Version in BCD format          */
+                              /* (e.g. 0x400 for 4.00)          */
+  uint32_t nvdi_date;         /* Date in BCD format             */
+                              /* (0x18061990 for 18.06.1990)    */
+  struct
+  {
+     unsigned           : 9;  /* Reserved                       */
+     unsigned alert     : 1;  /* Error-messages on/off          */
+     unsigned           : 1;  /* Reserved                       */
+     unsigned linea     : 1;  /* LINE-A                         */
+     unsigned mouse     : 1;  /* Dynamic mouse                  */
+     unsigned gemdos    : 1;  /* (Fast) GEMDOS character output */
+     unsigned error     : 1;  /* Error compatibility            */
+     unsigned gdos      : 1;  /* GDOS                           */
+  } nvdi_config;
+} NVDI_STRUC;
+
+

Modifies GEM, GEMDOS, BIOS, XBIOS and the LINE-A vector. +

+

3.7.2.339 Cookie, OBNL

+

Load-Time Linking (abbr. "LTL") protocol +

+

With this cookie one can transact a protocol for load-time +linking betweeen a shell and a loader. It was used for the first time +by STJ-Oberon-2 and the shell Chatwin. +

+

Documentation: Archive LTLPROTO.LZH +

+

3.7.2.340 Cookie, OFLS

+

Check Open Files +

+

This is used for logging how many files remain open on which +drive. It is implemented by the PD program 'CHECK_OFLS'. +

+

Documentation: See manual and ST-Magazin 11/1991. +

+

3.7.2.341 Cookie, OPMM

+

Open Helper +

+

The program assists at a 'Fopen' call when the path is +incorrect. On demand an attempt is made to convert '/' to '\' +(UNIX-mode) and a path-name table is used. In addition the pathname +can be output to the printer/screen/MIDI port. +

+

Modifies the GEMDOS vector and for TOS <1.06 the reset +vector. +

+

Status: PD +

+

3.7.2.342 Cookie, OSBL

+

Screen Blaster +

+

3.7.2.343 Cookie, OSTT

+

OverScan TT030 +

+

3.7.2.344 Cookie, OTOS

+

oTOSis - TOS emulator for Linux/68K +

+

The value contains the version number. +

+

3.7.2.345 Cookie, OV24

+

OverScan hardcopy driver for 24-pin printers +

+

3.7.2.346 Cookie, oVDI

+

oVDI - Alternative driver for the NOVA-VDI +

+

Status: not yet published +

+

3.7.2.347 Cookie, OVDJ

+

OVER_DJT - Overscan hardcopy driver for HP-DeskJet as of +V 2.0 +

+

© Patrick Dubbrow +

+

3.7.2.348 Cookie, OVEP

+

Overscan hardcopy driver for 9-pin printers +

+

3.7.2.349 Cookie, OVER

+ +

Driver for AutoSwitch OverScan hardware +

+

The cookie contains as a value the (hexadecimal) version number +of the OverScan driver. A value of 0x300 represents Version 3.0, for +instance. +

+

Modifies GEM, GEMDOS, BIOS, XBIOS, LINEA, ikbdsys, ipl_4, +VBL and reset vectors. +

+

3.7.2.350 Cookie, OVEX

+

OVER_EXC - OverScan Exception patch +

+

3.7.2.351 Cookie, OVFS

+

OVER_FSB - OverScan File-selector patch +

+

3.7.2.352 Cookie, OVIM

+

OVER_24N - Overscan hardcopy driver for 24-pin printers +as of V 2.0 +

+

© Patrick Dubbrow +

+

3.7.2.353 Cookie, OVLS

+

OVER_LSB - Overscan patch for DMC Laserbrain laser +printer +

+

3.7.2.354 Cookie, OVRD

+

OVER_RAM - OverScan RAMDisk (iV) +

+

3.7.2.355 Cookie, OVUT

+

OVERUTIL - Overscan screensaver, desktop clock (mouse +speeder iV) +

+

3.7.2.356 Cookie, OVWI

+

OVER_WIN - OverScan Window-size patch +

+

3.7.2.357 Cookie, PAMN

+

Driver software for PAM's-Net network +

+

3.7.2.358 Cookie, PAUL

+

Paula 2 - Amiga-style MODfile-player +

+

Paula plays the so-called 'modfiles' using the STE/TT PCM sound +chip. These modfiles, also called 'modules', originate from the Amiga +which has a special four-channel PCM soundchip called 'Paula'. +

+

Paula uses the IO7 interrupt of the 68901-MFP. Of course the +'XBRA' protocol is used; its magic is 'PAUL'. +

+

3.7.2.359 Cookie, PBUG

+

PEACEBUG.PRG +

+

Background debugger, integrated MC680x0 disassembler/Assembler, +reset-proof, reset-resident, fully symbolic, comfortable interface. +

+

Vectors that may be modified: All exception vectors, hz_200, +keyboard, ring_indicator, etc_critic, resvector. +

+

Status: Shareware. +

+

3.7.2.360 Cookie, PDEB

+ +

PureDebug +

+

Modifies the system vectors: 2-10, 13, 14, 24, 33, 34, 45, 46, +48-54, 257 and 258. In the version patched by Dimitri Junker, XBRA is +used for this (in the single-monitor version (PD_1.PRG) with the ID +'PDeb' and in the two-monitor version (PD_2.PRG) with the ID 'PDEB'). +

+

Source: The patch program lies in the Maus B3, or available from +http://www.dimitri-junker.de/software/ +

+

Status: Freeware. +

+

The PureDebugger itself is no longer available and was last +distributed by ASH. +

+

3.7.2.361 Cookie, PDOS

+

PowerDOS is a pre-emptive multitasking kernel that +replaces GemDOS and fixes all the bugs! Extremely efficient kernel +based on OS-9 and Unix. Features shared memory, semaphores, queues, +signals, pipes, pseudo TTY's, loadable file systems, loadable device +drivers. Doesn't block other processes during disk I/O like some other +kernels do. Compatible with all Atari ST/STe/MSTe/TT/Falcon030. +Loadable network file system available (commercial) for RS232, MIDI, +and LAN. +

+

Modifies vectors: TRAP #1, TRAP #13, Trap #14, MFP (all). +

+

Status: Shareware. +

+

3.7.2.362 Cookie, PDRZ

+

LockGetrez +

+

Mini-hack for specifying a desired return value of the XBIOS +function Getrez. Convinces some uncleanly programmed applications. +

+

3.7.2.363 Cookie, PFIX

+

PTSINFIX +

+

Remedies an error in the VDI of TOS 3.01). +

+

3.7.2.364 Cookie, Pinp

+

Driver for inputs from the parallel port +

+

This driver lets the port of another computer look like a +printer, using a cable in which Strobe and Busy are crossed over) and +permits reading from this port with the BIOS routines. +

+

Modified vectors: $100, $51E, $53E, $55E and $57E. +

+

3.7.2.365 Cookie, PKSH

+

PKS-Shell +

+

Modifies _shell_p. +

+

3.7.2.366 Cookie, PMMU

+

Paged Memory Management Unit reprogrammer +

+

The cookie is created by programs such as Outside or +VRAM, that make use of a PMMU present in the system. The value +of the cookie is either a NULL-pointer, or represents the entry +address of a function handler that enables some MMU-oriented +manipulations. A NULL-pointer simply signals the use of the PMMU, +which can be a sign for other programs not to install +themselves. +

+

3.7.2.367 Cookie, POIS

+

Poison! +

+

At each floppy disk change the program automatically compares in +the background the boot sector with a virus list that is integrated in +Poison! +

+

Hooks into TRAP #13. +

+

3.7.2.368 Cookie, POWM

+

PowerMouse +

+

3.7.2.369 Cookie, PRCS

+

CopySTar v4.0 +

+

Copying program (as of Version 4.0). +

+

3.7.2.370 Cookie, PRDS

+

Peter Rohde's Disk Speeder v1.1 +

+

Hard disk cache. +

+

3.7.2.371 Cookie, PRMD

+

MIDIPRT - Current version 0.9 +

+

Redirects the BIOS output of the parallel port to the MIDI +port. A receiving program on the destination computer then outputs the +received data on the printer. +

+

Uses the xbcon... vectors. +

+

3.7.2.372 Cookie, PRN!

+

WandelSZ +

+

Hooks into the BIOS and converts the 'ß' of the ST to the +MS-DOS 'ß'. +

+

3.7.2.373 Cookie, PRNß

+

WandelSZ +

+

Hooks into the BIOS and converts the 'ß' of the ST to the +MS-DOS 'ß'. +

+

3.7.2.374 Cookie, PRO5

+

PROTECT5.PRG +

+

Resident virus check/kill/protect program. +

+

3.7.2.375 Cookie, PROB

+

Profibase +

+

Poolware database with various special functions, in particular +programmability. +

+

Modifies vectors: TRAP #2, etv_critic, etv_term. +

+

Distribution: PD-Pool, LogicBase Software GbR. +

+

3.7.2.376 Cookie, PROT

+

Protos +

+

Screen utility. +

+

Distribution: Application Systems Heidelberg +

+

3.7.2.377 Cookie, PRTD

+

Print To Disk V1.10 +

+

Redirects the GEMDOS and BIOS outputs for the printer to a +file. +

+

Uses vectors: TRAP #1, TRAP #13. +

+

3.7.2.378 Cookie, PRTO

+

ST-Tools v1.0 +

+

3.7.2.379 Cookie, prtr

+

Printer driver for adapting the Atari character set to IBM +printers +

+

Modifies BIOS-trap. +

+

3.7.2.380 Cookie, PRTR

+

Protar driver for interchangeable media hard drives +

+

3.7.2.381 Cookie, PSND

+

ProSound driver +

+

3.7.2.382 Cookie, PSSG

+

Paint Shop +

+

Modifies hardcopy vector. +

+

3.7.2.383 Cookie, PTOS

+

ROMRAM +

+

Copies TOS to TT-RAM, and so accelerates execution and +permits modifications without having to change the ROMs. +

+

Depending on the set options, ROMRAM hooks into the hdv_rw and +the reset vector. Planned: Bus error and ikbdsys. +

+

3.7.2.384 Cookie, QIKM

+

Quick Mouse - Revised version of the mouse speeder from +c't. +

+

3.7.2.385 Cookie, QMAC

+

Quick mouse driver desk accessory +

+

Status: PD. +

+

3.7.2.386 Cookie, QMCP

+

Quick mouse driver in CHEMPLOT +

+

3.7.2.387 Cookie, QST2

+

Quick ST 2 +

+

3.7.2.388 Cookie, QST3

+

Quick ST 3 +

+

3.7.2.389 Cookie, QUAN

+

QUANTOS - Multi-utility (RAMdisk, spooler, hardcopy) +

+

Modifies: TRAP #1, TRAP #13, MFP parallel port, MFP Timer C, MFP +keyboard/MIDI ACIA, etv_term, hdv_bpb, hdv_rw, hdv_mediach, exec_os, +dump_vec. +

+

3.7.2.390 Cookie, RAIL

+

RAIL_MAN - Model railway control +

+

Modifies TRAP #1, MFP CTS and MFP receive buffer full interrupt. +

+

3.7.2.391 Cookie, RaSn

+

Rational Sounds +

+

3.7.2.392 Cookie, RESG

+

RESET GUARD +

+

This is a pogram for monitoring the reset vector +("resvector"). +

+

Modifies only the VBL vector. +

+

Status: The program belongs to the BOOT-TOOLS and is Public +Domain. +

+

3.7.2.393 Cookie, RFLX

+

AutoSwitch driver for the REFLEX graphic card from +Overscan GdR +

+

Modifies GEM, GEMDOS, BIOS, XBIOS, LINEA, IPL_4, VBL and +RESET vectors. +

+

3.7.2.394 Cookie, RFUS

+

RUFUS - Shareware terminal program +

+

3.7.2.395 Cookie, RGUS

+

Argus-XBRA - Shows track/sector addresses +

+

Modifies hdv_rw and Floprd. +

+

3.7.2.396 Cookie, RING

+

Telephone bell detector +

+

3.7.2.397 Cookie, ROMD

+

MagiC DOS driver for the ROM module +

+

Use the GEMDOS trap +

+

3.7.2.398 Cookie, ROT8

+

Rotate +

+

3.7.2.399 Cookie, RPIT

+

TIMEFIX - fixes GEMDOS time/date globals and IKBD (for +TOS 1.04) +

+

Useful for Cubase users +

+

https://bitbucket.org/rpins/timefix/ +

+

http://www.atarimania.com/utility-atari-st-timefix_37921.html +

+

Status: Freeware +

+

3.7.2.400 Cookie, RREG

+

Restore Register - Saves and restores a0/a1/a2/d1/d2 +registers +

+

Hooks into GEMDOS, BIOS, XBIOS and etv_term vector. +

+

Status: Freeware +

+

3.7.2.401 Cookie, RSLT

+

Driver software for the GengTEC-VGA in monochrome and +16-colour modes +

+

Modifies XBIOS, VBL and GEM vectors. +

+

3.7.2.402 Cookie, RSpd

+

RS_Speed +

+

RS_Speed offers on normal ST's - i.e. 260, 520, 520+, 1040 (also +STE), Mega ST (but not STE) - additional Baud rates for the serial +port. These Baud rates comprise 38400, 57600 and 115200 Baud. The +cookie is set by the accompanying software. +

+

3.7.2.403 Cookie, RSVE

+

RSVE_SET.PRG patch +

+

Information: This cookie is created to signal the presence of +the RSVE Baud rate extension. RSVE converts 110 Bd->38400, 134 +Bd->57600, 150 Bd->115200. At present the value of the cookie is +0. If <>0, this is a pointer to a not yet specified data +structure. +

+

Also hooks into TRAP #13 and TRAP #14. +

+

Source: The RSVE construction plan is so-to-speak PD and can be +found in various mail-boxes. +

+

3.7.2.404 Cookie, RSVF

+

DRVIN.PRG - RS-232 Version Fast (HSMODEM) +

+

This cookie contains pointers to chained lists holding the +properties of the communication ports (e.g. RS-232) that are usable +for data communications etc. The cookie is installed by DRVIN.PRG. The +lists are created by the port drivers. A detailed description is given +in RSVF_COO.TXT, which is contained in the HSMODA* package. +

+

Status: Freeware. +

+

3.7.2.405 Cookie, RTKC

+

Keyclick +

+

Modifies ikbd_sys, AES, VDI, GEMDOS and XBIOS vectors. +

+

3.7.2.406 Cookie, RTOB

+

OptoBell - Alters the presentation of ASCII-BEL +

+

Source: ST-Computer. +

+

Modifies BIOS-trap. +

+

3.7.2.407 Cookie, RWIN

+

RootWin - Loads a new desktop background +

+

Modifies VDI- and BIOS-trap. +

+

3.7.2.408 Cookie, SAM

+

System Audio Manager +

+

3.7.2.409 Cookie, SBKM

+

RING recognition in modem routines +

+

3.7.2.410 Cookie, SBTE

+

Terminal program +

+

3.7.2.411 Cookie, SBTS

+

Trap Spy +

+

3.7.2.412 Cookie, SCAH

+

Speed Cache - Hard disk cache for TOS-versions prior +to 1.04 +

+

Modifies the BIOS hard disk vectors. +

+

3.7.2.413 Cookie, SCKM

+

MagXNet (SOCKET.DEV) +

+

3.7.2.414 Cookie, SCPN

+

Screen Blaster 3 screen enhancer +

+

3.7.2.415 Cookie, SCRD

+

Screen To Disk V1.10 +

+

Redirects GEMDOS and BIOS output for the console additionally +to a file. +

+

Uses vectors: TRAP #1, TRAP #13. +

+

Archive name: SCR2DISK.LZH. +

+

3.7.2.416 Cookie, SCRN

+

Master-module screen.mmx - Setting of screen scrolling +regions +

+

3.7.2.417 Cookie, SCRS

+

Screen blanker +

+

3.7.2.418 Cookie, SCRW

+

SCREENWATCH.PRG - Warning tone at 'dirty' screen +accesses +

+

3.7.2.419 Cookie, SCSI

+

SCSIDRV interface +

+

3.7.2.420 Cookie, SCSV

+

Line Art Screensaver +

+

3.7.2.421 Cookie, SDCH

+

2C - Second Chance +

+

Changes file deletions with Fdelete to Frename in the folder +named -TRASH- in the root directory (if present). +

+

Modifies vector 33 GEMDOS. +

+

Status: Freeware. +

+

3.7.2.422 Cookie, SDES

+

Softdesk +

+

Desktop utility for installation of a custom desktop background, +a new window design, animated system mouse shapes etc. +

+

Modifies vectors: TRAP #2, TRAP #13. +

+

Distribution: LogicBase Software GbR. +

+

3.7.2.423 Cookie, SDsk

+

Softdisk - Reset-proof, boot-capable RAMdisk +

+

Modifies hdv_bpb, hdv_rw and hdv_mediach. +

+

3.7.2.424 Cookie, SDWN

+

ScreenDown - Retains screen memory in ST-RAM +

+

Modifies vectors: XBIOS. +

+

Status: Public Domain. +

+

3.7.2.425 Cookie, SELC

+

File-selector from C-Lab +

+

3.7.2.426 Cookie, SENV

+

Set Environment +

+

3.7.2.427 Cookie, SFA^

+

FONT_BLK.PRG (resident AUTO-folder part), +FONTLOAD.ACC, FONTLOAD.PRG, FONTLOAD.CPX +

+

Loading programs for the 8*16 ST system fonts. +

+

3.7.2.428 Cookie, SFIX

+

Serial Port Fix +

+

Patch program for the serial port (TOS 2.05, TOS 3.01 and TOS 3.05). +

+

3.7.2.429 Cookie, SFMN

+

SafeMenu +

+

3.7.2.430 Cookie, ShLk

+

Shift Lock +

+

With ALT+right-Shift one can switch ShiftLock on/off. +

+

Modifies IKBD. +

+

Status: Freeware. +

+

3.7.2.431 Cookie, shlp

+

shelhelp +

+

This is a TSR that makes the N.AES function shel_help available +also under other systems. This provides a simple way to select one of +the available viewers for a given type of Help-file format and so +achieve a uniform online help. +

+

Hooks only into TraPatch internal XBRA-list. +

+

Status: Freeware +

+

3.7.2.432 Cookie, SKEY

+

SpecialKeys - Driver for a DTP special keyboard on the +MIDI port +

+

Modifies midivec, occupies one VBL-slot. +

+

Status: Commercial product. +

+

3.7.2.433 Cookie, SLCT

+

Selectric™ - Enhanced file-selector +

+

Modifies TRAP #2 and #13. +

+

Status: Shareware. +

+

3.7.2.434 Cookie, SLif

+

SoundLifter +

+

Input switching for Falcon, belongs to SoundLifter hardware. +

+

Modifies XBIOS-trap. +

+

3.7.2.435 Cookie, SLIP

+

SLIP +

+

Socket/UDP/TCP/IP/SLIP implementation for MagiC. Makes the most +important network commands available. +

+

3.7.2.436 Cookie, SM00

+

SOTA - Printer spooler +

+

3.7.2.437 Cookie, SM01

+

ReProK - Office management DUO (see Cookie, SM02) +

+

3.7.2.438 Cookie, SM02

+

ReProK international EM-NET II - Database server for the +PAMs network +

+

This server consists of two components: PAMSERVE.PRG +(AUTO-folder) and PAMSERVE.ACC. +

+

PAMSERVE.PRG installs a new reset vector ($426 resvalid and $42a +resvector) with the XBRA-ID SM02 as well as a cookie SM02 for +communication with the accessory. +

+

3.7.2.439 Cookie, SMAL

+

Small AES icon fonts +

+

Holds in the lower-value WORD the height of the AES icon font +(SMALL) in pixels (as used by vst_height). The higher-value WORD +optionally holds the height of the IBM font. Is to be set by every +program that alters the size of the SMALL font (e.g AESFONT by H. +Schmidt). More detailed definition in RUBY (M. Nick). +

+

3.7.2.440 Cookie, SMAU

+

Set Maus accessory +

+

3.7.2.441 Cookie, SMon

+

SysMon - The system monitor +

+

Modifies GEM, GEMDOS, BIOS, XBIOS, LINEA, RTX (TRAP #4 & 5), VBL, IKBDSYS. +

+

3.7.2.442 Cookie, SMTT

+

SM-124 emulator +

+

Modifies AES-, GEMDOS-, BIOS- and XBIOS-trap as well as +the exec_os vector. +

+

3.7.2.443 Cookie, SNAP

+

That's-Snap desk accessory +

+

Modifies hardcopy vector. +

+

3.7.2.444 Cookie, SOFS

+

Softscreen - Virtual large screen with preview function +

+

Modifies vectors: Line-A, VBL, TRAP #1. TRAP #2, TRAP #13, +IKBD/MIDI, scr_dump, mousevec. +

+

Distribution: LogicBase Software GbR. +

+

3.7.2.445 Cookie, SOSW

+

Softswitch +

+

Multi-switcher with many multitasking possibilities, virtual +large screen etc. +

+

Modifies vectors: Line-A, VBL, TRAP #1, TRAP #2, TRAP #13, TRAP +#14, Busy-interrupt, Timer A, Timer C, Timer D, ikbdsys, midivec, +mousevec, BUTTON CHANGE VECTOR, MOUSE MOVEMENT VECTOR, CURSOR CHANGE +VECTOR. +

+

Distribution: LogicBase Software GbR. +

+

3.7.2.446 Cookie, SpcE

+

Space +

+

Set by AUTO-folder program SPACERES.PRG, which is an alternative +and XControl-compatible multitasking control field. +

+

Modifies TRAP #2 (GEM) and Trap #13 (BIOS). +

+

Status: Shareware. +

+

3.7.2.447 Cookie, SPCK

+

RAMdisk for SPC-Modula +

+

3.7.2.448 Cookie, SPEE

+

Mouse Speeder +

+

Status: PD. +

+

3.7.2.449 Cookie, SPEK

+

Driver for the 'Spektrum' graphics cards +

+

Modifies timer-interrupt and mouse routine. +

+

3.7.2.450 Cookie, SPEX

+

Steve's Printing Exzessory 2.0 +

+

Printer spooler for ST/STE and TT. +

+

Modifies BIOS-trap, BIOS output vectors and BUSY-interrupt. +

+

3.7.2.451 Cookie, spMR

+

Printer- and file-spooler +

+

3.7.2.452 Cookie, Spol

+

SPOOL.PRG - Flexible printer spooler +

+

Hooks (on demand) into TRAP #1, #13, MFP-Parallel Port +Interrupt, prt_stat, prt_vec and in the VBL-Queue (and, if the cookie +jar has to be created, also in the Reset vector). +

+

Status: Shareware. +

+

3.7.2.453 Cookie, SPRG

+

STARTER.ACC +

+

Launches programs by function key presses under old desktop +versions. +

+

Uses temporarily TRAP #1 and TRAP #2. +

+

3.7.2.454 Cookie, SR17

+

Pointer to the base of the SST cockpit. +

+

3.7.2.455 Cookie, SSND

+

PETRA +

+

PETRA installs a cookie (SSND) which is used by PAULA to tell +PETRA what to play with which sample frequency. +

+

PETRA changes some vectors using XBRA. The identification used +is SSND. +

+

PETRA uses Timer A to do the sample output. The keyboard +interrupt routine is changed to allow sample outputs while the mouse +is moved. +

+

Keyclick & Bell are possible, but PETRA turns them off. Use +the control panel to turn them on again. +

+

3.7.2.456 Cookie, ST-C

+

ST-Cache - Caching program +

+

Modifies hdv_rw and hdv_mediach. +

+

3.7.2.457 Cookie, ST17

+

ST-68017 +

+

This emulates a part (30.5) of the 68020 instructions on a +68000. +

+

Modifies the exception vectors 3 and 4. +

+

3.7.2.458 Cookie, STAT

+

STaTOS +

+

Statistical evaluation of BIOS-, XBIOS- and GEMDOS-calls. +

+

Source: Appeared in ST-Magazin. +

+

3.7.2.459 Cookie, STEM

+

STEmulator +

+

3.7.2.460 Cookie, STEW

+

Stewart +

+

A Shareware program that furnishes MagiC (as of v3.00) with some +optical features of MacOs 8 (Copland) (e.g. rotating grow/shrink- +boxes, grey menus) +

+

Modifies vector: TRAP #2 +

+

3.7.2.461 Cookie, STFA

+

Sound driver for Atari +

+

3.7.2.462 Cookie, StIc

+

Stewart Icon-server +

+

In conjunction with Stewart, in place of the MagiC logo a +(colour) icon appears in the menu bar - a different one for each +installed application. +

+

3.7.2.463 Cookie, STiK

+

ST Internet Kit +

+

3.7.2.464 Cookie, STMS

+

Screendump utility +

+

Source: ST-Magazin 2/1990. +

+

Modifies the hardcopy vector. +

+

3.7.2.465 Cookie, strk

+

StarTrack XBIOS extension +

+

3.7.2.466 Cookie, STRX

+

SAT-Trax +

+

Driver for controlling antenna positioning in a satellite +observation program. +

+

3.7.2.467 Cookie, SupV

+

SuperVidel is present. +

+

3.7.2.468 Cookie, SVAR

+

Shows MacMiNT +

+

Indicates that the computer is running under MacMiNT (i.e. that +no access to system variables apart from p_cookies is possible). +

+

3.7.2.469 Cookie, SVGA

+

Super VGA emulator +

+

3.7.2.470 Cookie, SWAP

+

OUTSIDE.PRG - Virtual memory management for TT +

+

3.7.2.471 Cookie, SwTm

+

Show Time - The ultimate informative clock +

+

Runs in all Atari resolutions. Shows the time, free RAM (also +with MagiC), the date, CapsLock-/DCF status etc. +

+

Hotkeys for clock-switching with Turbo cards or Mega STEs. +CapsLock LED. With INF file, display and Turbo on/off-switchable, +movable. +

+

The cookie points to a data structure with which ShowTime can be +swiched on/off. +

+

Modifies vectors: GEMDOS-trap, VDI/AES-trap, IKBD. +

+

Copyright status: Freeware/Postcardware. +

+

3.7.2.472 Cookie, SYMB

+

Resident Symbol Driver (1.23) +

+

Redirects the GEMDOS-routines Pexec, Pterm, Pterm0 and Mfree to +its own routines. At each Pexec call a check is made if the program to +be launched contains a symbol table. If so, then first the symbol +table and then the program will be loaded, where the symbols will be +adapted with the corresponding values from the TEXT-, DATA- and +BSS-segments. Calls of Pterm, Pterm0 or Mfree (Chameleon) ensure that +the table is removed from memory again. The cookie points to a chained +list of symbol tables, with whose aid symbolic debugging of +memory-resident programs is possible (for instance in connection with +TempleMon as of V2.02). +

+

Modifies vectors: TRAP #1. +

+

Status: Freeware. +

+

3.7.2.473 Cookie, SYNL

+

Dynamic Link Library driver +

+

3.7.2.474 Cookie, SYNT

+

Syntex - Optical character recognition, Marvin AG +

+

Keyboard simulation: TOS 1.0: BIOS; non-TOS 1.0: +xconstat and xconin of console; joystick. +

+

3.7.2.475 Cookie, SysE

+

System Editor - Manages and inserts alterations into the +operating system +

+

3.7.2.476 Cookie, Syso

+

ST Sysop - PC-Net compatible mailbox for Atari +

+

Modifies various exception vectors, BIOS vectors and one entry +of the VBL-queue. +

+

3.7.2.477 Cookie, SYST

+

Systime - Utilization display in the menu bar +

+

Modifies vector 256 (etv_timer). +

+

Status: Freeware +

+

3.7.2.478 Cookie, SZ_M

+

Dynamic Mouse speeder +

+

Source: NICKEL@MAFIA.ZER, +/usergroups-lokal/st/file-system@MAFIA.ZER +

+

Modified: mousevec (XBIOS 34 Kbdvbase). +

+

3.7.2.479 Cookie, S_DR

+

CD-ROM SCSI driver +

+

3.7.2.480 Cookie, T206

+

PATCHX06.PRG +

+

Corrects errors in the Disk-BIOS of TOS 2.06/3.06 and +enables correct ED handling with Getbpb. +

+

Modifies hdv_bpb, hdv_rw, hdv_mediach. +

+

Status: Public Domain. +

+

3.7.2.481 Cookie, T2GM

+

TOS2GEM +

+

3.7.2.482 Cookie, TALK

+

MegaTalk +

+

Die Gadgets MegaTalk ist eine Karte für den Megabus und besitzt +zwei serielle Schnittstellen. Sie sind kompatible mit den des +Macintosh Puls und können vom Spectre 128/GCR genutzt werden. Im +Atarimodus können sie als normale Schnittstellen genutzt werden. +

+

Der Cookie TALK zeigt auf folgenden Struktur: +
+

+
struct
+{
+  int16_t  version;     /* Driver version number in TOS format (0x0100 = 1.0) */
+  int32_t *p_txbint;    /* Pointer Port B transmit interrupt handler    */
+  int32_t *p_exbint;    /* Pointer Port B ext/status interrupt handler  */
+  int32_t *p_rxbint;    /* Pointer Port B receive interrupt handler     */
+  int32_t *p_specb;     /* Pointer Port B special interrupt handler     */
+  int32_t *p_txaint;    /* Pointer Port A transmit interrupt handler    */
+  int32_t *p_exaint;    /* Pointer Port A ext/status interrupt handler  */
+  int32_t *p_rxaint;    /* Pointer Port A receive interrupt handler     */
+  int32_t *p_speca;     /* Pointer Port A special interrupt handler     */
+  int32_t *p_ahighin;   /* Pointer Port A high speed input routine      */
+  int32_t *p_bhighin;   /* Pointer Port B high speed input routine      */
+  int32_t *p_ahighout;  /* Pointer Port A high speed output routine     */
+  int32_t *p_bhighout;  /* Pointer Port B high speed output routine     */
+  int32_t  highbuf;     /* High speed I/O buffer address                */
+  int16_t  highlen;     /* High speed I/O buffer lenght                 */
+  int8_t   ack;         /* Optional transmitter ACK Byte                */
+  int8_t   res;         /* Unused/reserved                              */
+  int32_t  p_baudrate;  /* Pointer to baud rate table                   */
+}
+
+

3.7.2.483 Cookie, TAPE

+

Tape-BIOS +

+

3.7.2.484 Cookie, TASS

+

Turbo-Assembler +

+

3.7.2.485 Cookie, TCFS

+

Turbo-C File-Selector as desk accessory +

+

Modifies the GEM-trap. +

+

3.7.2.486 Cookie, TCRB

+

Turbo Cache - Hard disk cache +

+

Hooks into hdv_bpb, hdv_mediach, hdv_rw and TRAP #13. +

+

3.7.2.487 Cookie, Tenv

+

Belongs to terminal program TRAPIDO +

+

Sets enviroment from the AUTO-folder. +

+

Modifies exec_os. +

+

3.7.2.488 Cookie, TFIX

+

XBRA-version of the TOS 1.04 fix program from Atari +

+

Modifies XBIOS, LINEF and RESET vectors. +

+

3.7.2.489 Cookie, THNX

+

THINX (Shell) +

+

Character filter for print output. The program is being +developed further under the name Chatwin (see CHTW). +

+

Modifies the BIOS vector. +

+

3.7.2.490 Cookie, THRM

+

Evaluates Temperature data via the ST's printer port +

+

Modifies den MFP Busy interrupt vector. The original value of +the vector is not contained in the XBRA structure. +

+

Status: Freeware. +

+

3.7.2.491 Cookie, THST

+

TurboHST - Enhanced serial driver with special options +for USR HST modems +

+

Modifies MFP vectors: Mfp: Timer C, ACIAs, RS cts, RS s.err, RS +s.buf, RS r.err, RS r.buf. +

+

3.7.2.492 Cookie, TIM3

+

TIMEDRV3.PRG - Corner clock and active disk +drive/direction display +

+

3.7.2.493 Cookie, TIM5

+

TIMEDRV5.PRG - Same as TIMEDRV3.PRG but with screen protector +

+

3.7.2.494 Cookie, TIME

+

Led Panel Time +

+

The "TIME"-cookie contains a pointer to a WORD-sized +variable with the current time in the Tgettime format. +

+

3.7.2.495 Cookie, TK40

+

MC68040 ToolKit +

+

3.7.2.496 Cookie, TL3D

+

BIOS-driver for addressing a third floppy drive. Also +supports 40-track disks (5.25") in an 80-track drive without +special hardware switching. +

+

Modifies vectors: XBIOS. +

+

3.7.2.497 Cookie, TLWV

+

STGAWVBL +

+

Retrofits the missing WVBL-routine for the MEGA4000 adapter in +NVDI. +

+

Modifies vectors: XBIOS. +

+

3.7.2.498 Cookie, Tmon

+ +

Templemon - Indispensable debugger +

+

3.7.2.499 Cookie, tmsW

+

TMS Wacom-Treiber +

+
typedef struct
+{
+  int8_t pressure;       /* Aktueller Andruck */
+  int8_t driver_running; /* Flag ob Wacom_Treiber läuft */
+  int8_t limit;          /* Schwelle für Emulation der linken Maustaste */
+  int8_t pen;            /* Flag ob pressure Mode eingeschaltet oder nicht */
+  int8_t lmb;            /* Flag ob Emulation der linken Maustaste eingeschaltet */
+} COOKIE_WACOM;
+
+

In pressure steht der aktuelle Andruck. Er bewegt sich +zwischen MIN_PRESS(=0) und MAX_PRESS(=60). Falls der Stift außerhalb +der Tablettreichweite ist steht dort NO_PRESS(=-64). +

+

driver_running ist 1, wenn der Wacom-Tabletttreiber +aktiv ist. 0 wenn sonst. +

+

limit ist die Andruckschwelle ab der bei eingeschalteter +linker Maustasten-emulation ein Klick mit der linkem Maustaste +simuliert wird. +

+

In der Variablen pen steht ob der Drucksensitive Modus +aktiviert ist (PRESSURE_MODE='1') oder nicht (STANDARD_MODE='0'). +

+

lmb ist 1, wenn die linke Maustastenemulation +eingeschaltet ist. 0 wenn sonst. +

+

ACHTUNG: COOKIE_WACOM ist eine read-only Struktur => +niemals hineinschreiben! +

+

3.7.2.500 Cookie, TOpW

+

Top Manager Watcher +

+

Modifies etv_critic. +

+

3.7.2.501 Cookie, TOUC

+

Touch +

+

This sets the filedate of a modified file to the current system +date (so date corresponds to last modified, instead of created). +

+

Intercepts Fopen, Fclose, Fwrite from GEMDOS. +

+

Source: Included in the Shareware tape-streamer software +`GEMAR'. +

+

3.7.2.502 Cookie, TPat

+

TOS Patch for vr_trnfm +

+

Corrects the int-overflow error in the vr_trnfm routine of +TOS. +

+

Modifies VDI/AES- and BIOS-traps. +

+

3.7.2.503 Cookie, TPGM

+

TraPatch - See TraP +

+

(Only used in TraPatch-internal XBRA-list). +

+

3.7.2.504 Cookie, TRAK

+

Track-Speed - Simple mouse speeder +

+

Hooks into mouse vector. +

+

3.7.2.505 Cookie, TraP

+

TraPatch +

+

This enables hooking into individual operating system calls, so +that it is no longer necessary to hook into a trap and through this +slow down other OS calls. Internal XBRA chains are used for which the +XBRA IDs of this list are valid! +

+

Modifies vectors: GEMDOS, GEM, (X)BIOS. +

+

Copyright: Freeware +

+

3.7.2.506 Cookie, Trpp

+

Trapper is a program that greatly simplifies the +developent of system extensions for programmers. +

+

Trapper hooks itself into the BIOS, XBIOS, GEMDOS, VDI and AES. As interface to Trapper +the XBIOS function number 555 was chosen. +

+

3.7.2.507 Cookie, TRUE

+

TrueDisk - A fast, resident RAMdisk, Version 2.2 +(2.1.94) +

+

Modified via XBRA: hdv_bpb, hdv_rw, hdv_mediach. +

+

Status: PD. +

+

3.7.2.508 Cookie, TSEN

+

TSE Net - Network from Inotec +

+

3.7.2.509 Cookie, TSWP

+

TonySoft Write Protection +

+

Protects logical drives from write accesses, and hooks into the +hdv_rw vector for this. +

+

3.7.2.510 Cookie, TTTF

+

TT2TF - "Thirty-Two to Twenty-Four" +

+

With this the TT is adjusted to a 24-bit address bus, so that +TEMPUS, for instance, can run on it. The cookie points to a routine +with which one can switch between a 24- and 32-bit address bus. +

+

3.7.2.511 Cookie, TUBS

+

TUBS - The Ultimate Boot Selector +

+

3.7.2.512 Cookie, TWFS

+

That's Write File-Selector accessory +

+

Modifies TRAP #2. +

+

3.7.2.513 Cookie, Typ1

+

Daisywheel printer - Desk accessory +

+

Hooks into PRN-OUT, PRN-OUTSTAT and VBL vector. +

+

3.7.2.514 Cookie, UFSL

+

Extended Universal Font Selector +

+

See also: The UFSL interface. +

+

3.7.2.515 Cookie, UIS3

+

Universal Item Selector 3. +

+

3.7.2.516 Cookie, UKB1

+

Fastload +

+

3.7.2.517 Cookie, UKB3

+

Fastload & MIDI Through +

+

3.7.2.518 Cookie, UN*X

+

Unixname +

+

Converts UNIX filenames for all GEMDOS calls to a +GEMDOS-conforming format (at present only '/' to '\'). +

+

Occupies TRAP #1. +

+

3.7.2.519 Cookie, USCK

+

CHECKIT +

+

Checks various system vectors and the VBL-queue after every +program termination (i.e. also after a crash). If a vector points to a +memory block that lies within the terminating program, then this +vector will be deleted (VBL) or hooked out of (XBRA) or placed on an +RTE (if no XBRA). +

+

3.7.2.520 Cookie, USHD

+

HDDRIVER.PRG - Diskus hard disk driver as of Version 2.5 +

+

3.7.2.521 Cookie, UsNm

+

User-Name cookie - Makes the user name available as a +cookie +

+

3.7.2.522 Cookie, USPK

+

AUTOPARK.PRG +

+

Program for the AUTO-folder to support the AUTOPARK accessory in +versions < 4.0. AUTOPARK parks hard drives automatically after a +given time has pased since the last access. An XHDI-compatible hard +disk driver is required. +

+

(AUTOPARK is a part of the HDDRIVER hard disk software.) +

+

3.7.2.523 Cookie, USRS

+

ROMSPEED +

+

On 68030-machines moves the contents of the ROMs to RAM. +

+

Source: Contained in the 'Outside' package. If necessary it is +also created by Outside. +

+

3.7.2.524 Cookie, USSC

+

NF_SCSI - SCSI Driver for Hatari and ARAnyM +

+

3.7.2.525 Cookie, UTRK

+

Ultimate Tracker +

+

3.7.2.526 Cookie, VBLF

+

VBLFIX.PRG for Falcon030 +

+

Corrects the VBL-interrupt on SM124/44/46 monitors that is +triggered too frequently (result: too fast cursor blinking, Maccel +saves too early or possibly even more). +

+

Modified vectors: VBL vector (0x70). +

+

3.7.2.527 Cookie, VDIp

+

VDI performance logger +

+

3.7.2.528 Cookie, VDLY

+

Videlity - Resolution enhancer for Falcon030 +

+

Videlity allows vastly increased resolution desktops on (S)VGA +monitors. It was designed to provide access to the high resolution +TrueColor VGA modes which Nemesis makes possible. +

+

3.7.2.529 Cookie, VECS

+

Vecshow - Displays system vectors +

+

Modifies: Bus-error. +

+

3.7.2.530 Cookie, VeiL

+

Turbo Veille +

+

3.7.2.531 Cookie, VFIX

+

VDI-Fix +

+

Patch to remove the handle problem described in +ST-Magazin 1/90 in the VDI of TOS 1.0, TOS 1.04, TOS 1.06, TOS +1.62 and TOS 2.05. +

+

Modifies the TRAP #2 vector. +

+

3.7.2.532 Cookie, VFNT

+

VdiFont.PRG +

+

Allows replacing the AES or application font by any desired +GDOS font. +

+

Modifies vectors: VDI (TRAP #2), v_opnwk, v_opnvwk and +vst_load_fonts. +

+

Copyright: Freeware. +

+

3.7.2.533 Cookie, VGAS

+

VGA Simulator +

+

This simulates the five lower screen resolutions (VGA +resolutions) on the Atari TT030 in the TT-high resolution. +

+

Modified via XBRA: BIOS-, XBIOS- and GEM-trap, but +depending on requirement also more. +

+

Status: Version 1.08 (30.1.94), Shareware. +

+

3.7.2.534 Cookie, VI-2

+

Videl Inside +

+

3.7.2.535 Cookie, View

+

View protocol +

+

3.7.2.536 Cookie, VIRA

+

VIRUS Alarm +

+

A resident program that checks inserted floppy disks for +executable boot sectors. +

+

Modifies vector: hdv_bpb. +

+

3.7.2.537 Cookie, VMEM

+

VMEM.PRG - Provides virtual memory for every Atari +computer +

+

Naturally it does not emulate an MMU, but thanks to the function +interface one can manage a "manually" controled virtual +memory, which in addition really works on every computer. The cookie +value is the address of the function handler. +

+

All routines (Pure-C source) are freely available. Archive +VMEM11.ZIP. +

+

3.7.2.538 Cookie, VPCH

+

VDIPATCH.PRG +

+

This hooks itself into TRAP #2, intercepts the VDI +raster-copy calls and looks to see if LogBase or PhysBase is entered +in fd_addr. If so, it will be replaced by NULL. +

+

3.7.2.539 Cookie, VRAM

+

VRAM - Virtual memory management for TT030 +

+

3.7.2.540 Cookie, VREP

+

Vector Guard - Reset-proof resident program that +supervises system vectors +

+

Modifies vector: resvector. +

+

3.7.2.541 Cookie, VSco

+

Virus Scope +

+

Source: Maxon PD-Disk 227. +

+

3.7.2.542 Cookie, VSCR

+ + +

Virtual Screen structure +

+

The cookie contains a pointer to a structure that makes +information available about the visible portion of the screen. +

+

3.7.2.543 Cookie, VSTM

+

Transfer (via MIDI) +

+

Status: PD. +

+

3.7.2.544 Cookie, vT52

+

Identifies the CyReL VT52 emulator for the CyReL +M16-1280 TrueColor graphics cards. +

+

Uses one VBL slot and entered in constat vector. +

+

3.7.2.545 Cookie, VTFX

+

VT52FIX.PRG for Falcon030 +

+

Corrects the errors in the VT52 emulator of the Falcon TOS +(faulty Esc-sequences and scrolling). +

+

Modified vectors: xconout for CON and RAWCON. +

+

3.7.2.546 Cookie, VXCK

+

VoxClock - Talking clock for DMA-sound +

+

Modifies GEMDOS Timer vector, DMA active interrupt and IKBD +clock- packet handler. +

+

3.7.2.547 Cookie, WaHW

+

Created and used by HIGH_WAY.ACC +

+

Status: Shareware. +

+

3.7.2.548 Cookie, WARP

+

Warp 9 accelerator +

+

3.7.2.549 Cookie, WaSA

+

SATELLIT +

+

This is a multi-ACC that uses this cookie ID for communication. +

+

Status: Shareware +

+

3.7.2.550 Cookie, WBrd

+

Bird's Wing +

+

3.7.2.551 Cookie, wdlg

+

WDIALOG.PRG - Window dialog library for standard-TOS +(compatible to MagiC 4.0) +

+

Modifies: TRAP #2 (VDI/AES), TRAP #13 +

+

Status: Freeware. +

+

3.7.2.552 Cookie, WDOG

+

Watchdog (1.21) +

+

In connection with the "Resident Symbol Driver" this +utility allows profiling on a time basis, so one can establish which +function of a program swallows the most computation time. However, to +be able to subdivide the code in functions, a symbol table has to be +present. The cookie jar is required to be able to contro the functions +of the memory-resident program with the control desk accessory. +

+

Modifies vectors: MFP-interrupt 13 (Timer A). +

+

3.7.2.553 Cookie, WEGA

+

This is used by the WEGA libraries (dialog boxes etc.). +

+

3.7.2.554 Cookie, WfNa

+

WFNAME.PRG +

+

This extends MagiC by a special function which allows other +programs to inquire the window title of any window. +

+

For programmers: +

+
    +
  • As long as WFNAME.PRG is installed, one can inquire window titles +of any desired window with wind_get(WF_NAME). +
      +

  • +
  • WFNAME.PRG can be recognized by a 'WfNa' cookie. A query +whether wind_get(WF_NAME) is possible should therefore be made as +follows: +
      +
    'WfNa'-cookie present OR +
    'AmAN'-cookie present OR +
    MagiC >= 6.0 present. +
      +

  • +
+ +

3.7.2.555 Cookie, WFSL

+

WFSEL - Window File-SeLector +

+

Modifies AES-trap and BIOS-trap. +

+

Status: Shareware. +

+

3.7.2.556 Cookie, WICO

+

WINCOM - The Window Commander (only for MagiC as of +V2.0) +

+

This offers the MagiC popup functions from hotkeys, also +real-time functions for windows, windows operable from the keyboard, +ACCs can be called from the keyboard. +

+

Modifies vectors 33 (GEMDOS), 34 (AES), 256 (etv_timer), 258 +(etv_term), Kbdvbase->ikbdsys and Kbdvbase->mousevec. +

+

Status: Shareware. +

+

3.7.2.557 Cookie, WinK

+

WinKeys +

+

This makes system-wide control of windows available (close, move, +backdrop, un-/all-/iconify, full, scrolling, size) via Control+number- +keypad shortcuts. TraPatch is a prerequisite! +

+

Modifies vectors: evnt_multi, wind_set (TraPatch!). +

+

Status: Freeware. +

+

3.7.2.558 Cookie, WINX

+

WINX +

+

3.7.2.559 Cookie, WINZ

+

Luftschloß/WINZ RAMdisk (from the book +Scheibenkleister) +

+

3.7.2.560 Cookie, WPRO

+

Write Protect - Software-moderated write-protection for +any logical drives +

+

Modified: hdv_rw. +

+

3.7.2.561 Cookie, WRAP

+ +

WM.PRG - WrapMouse +

+

Driver for serial MS-DOS mice, joystick mouse, mouse speeder and +wrapper. +

+

Modifies vectors: ST-MFP I12 ($130); TT-MFP I12 ($170); SCC +vectors at $190, $198, $1b0 and $1b8; mouse (KBDVECS.mousevec); +GEMDOS. +

+

Status: Version 1.0 is/was distributed by TOS-Magazin. +Version 1.5 is/was Shareware (originally DM 30.-). +

+

3.7.2.562 Cookie, XALT

+

AlberTT GFX card driver +

+

3.7.2.563 Cookie, XBTN

+

Mouse speeder routine from XBOOT +

+

3.7.2.564 Cookie, XDsk

+

The cookie identifies the X-Disk (reset-proof RAMdisk +with all kinds of baubles and tomfoolery). The value contains a +bit-vector which specifies all devices that are controlled by the +X-Disk (similar to the system variable _drvbits). +

+

3.7.2.565 Cookie, XFRB

+ + +

Extended Fast-RAM Buffer +

+

The cookie is created by the hard disk driver HDDRIVER, amongst +others, and points to the following structure: +

+
typedef struct xfrb
+{
+   int16_t version;   /* Version number in BCD format */
+   int8_t  *xflock;   /* Semaphore                    */
+   int8_t  *buffer;   /* Buffer address               */
+   int32_t size;      /* Buffer size                  */
+   xfrb    *next;     /* Pointer to next XFRB         */
+} XFRB;
+
+

3.7.2.566 Cookie, XFS1

+

Master-module xfs.mmx - Extended file-system for TOS +

+

Modifies GEMDOS-trap. +

+

3.7.2.567 Cookie, xFSL

+

Extended Font-Selector +

+

The cookie signals the presence of a system-wide font-selector +with extended functionality (compared to UFSL). First used by the +font- selectors Calvino (Freeware from Dirk Haun) and HuGo! (Freeware +from Stefan Rogel). The description of the interface is included in +both font-selector packages. +

+

3.7.2.568 Cookie, Xgem

+

Windframe Xgem manager for MagiC 6 +

+

3.7.2.569 Cookie, XHDI

+

XHDI - eXtended Hard Disk Interface driver +

+

The cookie points to the address of a function that makes +mass-storage oriented functions available. +

+

See also: XHDI cookie   XHDI specification +

+

3.7.2.570 Cookie, XKBD

+

Extended Keyboard - current version +

+

Originally published in ST-Computer 6/1988. +

+

3.7.2.571 Cookie, XMMU

+

TK40's interface for PMMU setting +

+

3.7.2.572 Cookie, XMuz

+

Ultra Player +

+

3.7.2.573 Cookie, xNet

+

xNet-ST - Low-cost network +

+

3.7.2.574 Cookie, XPCI

+

XBIOS functions for PCI-BIOS +

+

See also: PCI-BIOS   Cookie _PCI +

+

3.7.2.575 Cookie, xRmt

+

xRemote.prg, xRMaster.prg, xRemAcc.acc +

+

Remote maintenance via modem. +

+

Modifies vectors: TRAP #2, TRAP #3, TRAP #13, Kbdvbase-ikbdsys, +hz200 ($114.w)... +

+

3.7.2.576 Cookie, XSDD

+

Extended Serial Device Driver +

+

Introduction +

+

As is generally known, the ability of TOS to service the +serial ports is very restricted: +

+
    +
  • The operation of various control lines (e.g. DCD, DTR, RI etc.) +is only possible with direct accesses to the hardware +
  • +
  • Only the Baud rates offered by Rsconf can be set, even if the +hardware allows more +
  • +
  • The access to one port by several programs cannot be +coordinated +
  • +
  • As BIOS has to transfers each character individually, the I/O +performance is not very high +
  • +
+ +

During the development of a serial driver for MiNT, which was to +remedy these weaknesses, the idea arose to make the extended functio- +nality available under pure TOS as well. This is the first +suggestion how this could look. Essentially, the low-level routines of +the MiNT driver are made accessible from the outside via a cookie. +Conceivably it would be possible also to completely divorce the two +levels and to sit the MiNT driver on top of a separate TOS driver. +

+ +

The XSDD protocol +

+

The XSDD protocol supports devices 6 up to <maptabsize+5> +inclusive managed via Bconmap (provided the underlying TOS makes +them available) as well as the device 1 (AUX). Operations on AUX +always refer to the Bconmap device active at the time XSDD is called. +In future it is possible for technical reasons that AUX will only be +supported if the underlying TOS has no Bconmap. +

+

The driver installs a cookie "XSDD". The cookie points +to the jump-in point of the XSDD driver. Immediately before the +routine (that is at offset -4 before the address from the cookie) +there is, for the sake of safety, once more the LONG constant +"XSDD". +

+

Call: The function that is to be performed is specified by an +opcode (WORD). This opcode is the first argument for each call. If an +invalid code is specified, then EINVFN is returned. +

+

The passing of all parameters follows the GEMDOS convention, +i.e. on the stack. The return value will lie in d0. Apart from d0 no +registers are altered. Calling XSDD must be exclusively in +supervisor mode. +

+

At the time of writing the functions listed below are foreseen +(the opcodes have still to be allocated). For the parameter types the +following convention applies: +

+
BYTE:  8-Bit  character
+WORD:  16-Bit signed integer
+UWORD: 16-Bit unsigned integer
+LONG:  32-Bit signed integer
+
+
+
WORD XSVersion(void)
+
+

+
Returns the version number of the protocol implemented by the XSDD +driver, major-version in the high byte, minor version in the low byte +(example: 0x0102 corresponds to Version 1.2). This number is not meant +to reflect the version of the driver program, but only that of the +implemented protocol. +
  +
Return value: +
Protocol version. +
  +

+ +
+
WORD XSDriverInfo(BYTE *info, LONG *product, WORD *version)
+
+

+
This call returns an info-string, a product identifier, as well as +the version of the relevant driver program. info here must +point to a buffer at least 80 bytes long in which the NULL- terminated +info-string will be entered (the string may contain the author and the +name of the driver, for instance). In the LONG to which +product points the product ID will be entered, and in the WORD +to which version points, the driver version. +
  +
Return value: +
0 +
  +

+ +
+
WORD XSDevName(WORD device, BYTE *name)
+
+

+
Obtains the name of the port belonging to the BIOS device (e.g. +"Modem1"). name must point to an array at least 9 +bytes long, in which the NULL-terminated name will be entered. +
  +
Return value: +
0 on success +
EUNDEV - Invalid device +
  +

+ +
+
WORD XSReserve(WORD device)
+
+

+
Reserve device. This is an "advisory" locking, i.e. +depends on every program inquiring about the lock and voluntarily +forgoing any further accesses if the device has been allocated +already. Every program has to perform this call before any kind of +access to the device is made. If the device was still free, then it +will be reserved after the call. If it was reserved already, an +error-code will be returned; in that case there should be no further +accesses to the device. +
  +
Return value: +
0 - The device is now reserved +
EACCDN - The device was reserved already +
EUNDEV - Invalid device +
  +

+ +
+
WORD XSRelease(WORD device)
+
+

+
Release device again. This call may be made only if a +successful XSReserve was perfomed (with return value 0). +
  +
If an XSCtlSig routine was initialized on the device, then it +will be released automatically. +
  +
Return value: +
0 on success +
EACCDN - If the device was not reserved +
EUNDEV - Invalid device +
  +

+ +
+
LONG XSCapMap(WORD device)
+
+

+
Inquires various attributes of the driver and device. If no error +occurs, a bit-vector will be returned. The following bits are defined +at present: +
  +

  #define XS_BREAK  0x01   /* Device can send
+                              Break */
+  #define XS_RTSCTS 0x02   /* Device understands
+                              RTS/CTS handshaking */
+  #define XS_TANDEM 0x04   /* Device understands
+                              XON/XOFF handshaking */
+  #define XS_IOBAUD 0x08   /* Device understands various
+                              I- and O- Baud rates */
+
+  #define XS_BIOSRW 0x8000 /* Driver uses
+                              BIOS for read/write */
+
+
All other bits are reserved and should be ignored for the time +being. +
  +
Return value: +
>=0 (LONG!) - Available attributes +
EUNDEV - Invalid device +
  +

+ +
+
LONG XSIBaud(WORD device, LONG baudrate)
+
+

+
Set/inquire the input Baud rate (more exactly: bps) of the +specified device. The Baud rate is given uncoded in plain text (so for +instance 38400L corresponds to 38400 bps). If -1L is specified, the +Baud rate is not altered (only inquired). If a Baud rate is requested +that is not available on the device, then the next lower available +rate will be set and returned. +
  +
Most devices do not support separate Baud rates for input and +output. In that case an XSIBaud call changes the output Baud rate at +the same time (this can be inquired for with XSCapMap). +
  +
Return value: +
>0 - Set Baud rate +
EUNDEV - Invalid device +
  +
Anmerkung: Durch die Rückgabe der nächst niedrigen +verfügbaren Baudrate kann der Aufrufer alle für dieses Device +verfügbaren Baudraten durch "Abklappern" von oben nach +unten ermitteln. +
  +

+ +
+
LONG XSOBaud(WORD device, LONG baudrate)
+
+

+
Set/inquire the output Baud rate (more exactly: bps) of the +specified device. Functioning is otherwise similar to XSIBaud. +
  +
Most devices do not support separate Baud rates for input and +output. In that case an XSOBaud call changes the input Baud rate at +the same time (this can be inquired for with XSCapMap). +
  +
Return value: +
>0 - Set Baud rate +
EUNDEV - Invalid device +
  +

+ +
+
WORD XSBreak(WORD device, WORD on)
+
+

+
Set/clear a BREAK on the device. If on in non-zero, BREAK +will be set, else cleared. If the device does not understand BREAK, +the call will be ignored. +
  +
Return value: +
0 on success +
EUNDEV - Invalid device +
  +

+ +
+
LONG XSSetFlags(WORD device, UWORD flags)
+
+

+
Set transmission parameters. Attempts to make settings that are +not possible on the device (i.e. those reported by XSCapMap as not +available) are ignored. flags contains the setting in the +following coding (corresponds to those of TIOCGFLAGS-Fcntl of MiNT): +
  +
Mask: TF_STOPBITS 0x0003 +
Werte: +
0x0000 Invalid +
0x0001 1 stop-bit +
0x0002 1.5 stop-bit +
0x0003 2 stop-bit +
  +
Mask: TF_CHARBITS 0x000C +
Werte: +
0x0000 8 bits per character +
0x0004 7 bits per character +
0x0008 6 bits per character +
0x000C 5 bits per character +
  +
Mask: TF_PARITY 0xc000 +
Werte: +
0x0000 No parity +
0x4000 Even parity +
0x8000 Odd parity +
0xc000 Invalid +
  +
Further bits: +
T_TANDEM 0x1000 XON/XOFF Handshake +
T_RTSCTS 0x2000 RTS/CTS Handshake +
  +
All remaining bits are reserved and should be 0. +
  +
Return value: +
>=0 (LONG!) - The flags set before the call +
ERANGE - Invalid parameter were found +
EUNDEV - Invalid device +
  +

+ +
+
LONG XSGetFlags(WORD device)
+
+

+
Inquire transmission parameters. +
  +
Return value: +
>=0 (LONG!) - Set parameters (coding see XSSetFlags). +
EUNDEV - Invalid device +
  +

+ +
+
LONG XSCtlMap(WORD device)
+
+

+
Inquire control lines available on the device. If no error arises, +a bit-vector is returned in which the relevant bit is 1 for available +control lines, and 0 for those not available. The following bits are +defined: +
  +

  #define TIOCM_LE  0x01        /* line enable */
+  #define TIOCM_DTR 0x02        /* data terminal ready */
+  #define TIOCM_RTS 0x04        /* ready to send */
+  #define TIOCM_CTS 0x08        /* clear to send */
+  #define TIOCM_CAR 0x10        /* carrier detect */
+  #define TIOCM_RNG 0x20        /* ring */
+  #define TIOCM_DSR 0x40        /* data set ready */
+
+
All other bits are reserved and should be ignored until further +notice. +
  +
Return value: +
>=0 (LONG!) - Available control lines +
EUNDEV - Invalid device +
  +
Note: The values may still be changed in order to adapt +them to the (hopefully soon determined) definitions of the +corresponding MiNT Fcntl. +
  +

+ +
+
LONG XSGetCtl(WORD device)
+
+

+
Inquire status of the control lines (DCD, RI etc.). If no error +arises, a bit-vector is returned (coding as in XSCtlMap). The bits are +1 if the corresponding line is active, else 0. +
  +
Return value: +
>=0 (LONG!) - Status of the control lines +
EUNDEV - Invalid device +
  +

+ +
+
WORD XSSetCtl(WORD device, UWORD ctl)
+
+

+
Set control lines. Coding again as in XSCtlMap. Some lines (e.g. +CTS) are read-only and hence cannot be affected (that should be clear +from the context). Attempts to affect these, and those lines that are +not supported by the device (i.e. those reported by XSCapMap as not +available) are ignored. +
  +
Return value: +
0 bei Erfolg +
EUNDEV - Ungültiges Device +
  +

+ +
+
WORD XSOnCtl(WORD device, UWORD on_mask)
+
+

+
Activate the control lines whose bit is set in on_mask, +without affecting the others. Otherwise the same conditions apply as +for XSSetCtl. +
  +
Return value: +
0 on success +
EUNDEV - Invalid device +
  +

+ +
+
WORD XSOffCtl(WORD device, UWORD off_mask)
+
+

+
Deactivate the control lines whose bit is set in off_mask, +without affecting the others. Otherwise the same conditions apply as +for XSSetCtl. +
  +
Return value: +
0 on success +
EUNDEV - Invalid device +
  +

+ +
+
LONG XSInStat(WORD device)
+
+

+
Obtain the number of characters that are currently available on +the device for reading. The returned value need not be exact. It only +guarantees that the next read access can read at least that many +bytes, but it could be more. +
  +
Return value: +
>=0 - Number of available characters +
EUNDEV - Invalid device +
  +

+ +
+
LONG XSOutStat(WORD device)
+
+

+
Obtain the number of characters that are currently available on +the device for writing. The returned value need not be exact. It only +guarantees that the next write access can output at least that many +bytes, but it could be more. +
  +
Return value: +
>=0 - Number of characters that can be output +
EUNDEV - Invalid device +
  +

+ +
+
LONG XSRead(WORD device, LONG count, BYTE *buffer)
+
+

+
Read a maximum of count characters from the memory block +speci- fied in buffer. If that many characters are not +available at the time, XSRead returns immediately (non-blocking). +
  +
Return value: +
>=0 - Number of characters that were read +
EUNDEV - Ungültiges Device +
Weitere (negative) TOS-Fehlernummern bei I/O-fehlern +
  +

+ +
+
LONG XSWrite(WORD device, LONG count, BYTE *buffer)
+
+

+
Write count characters from the memory block specified in +buffer to the device. If that many characters could not be +written at the time, XSWrite returns immediately (non-blocking). +
  +
Return value: +
>=0 - Number of characters that were written +
EUNDEV - Invalid device +
Further (negative) TOS error-messages at I/O-errors +
  +

+ +
+
WORD XSFlush(WORD device, WORD mode)
+
+

+
Discard characters remaining in the driver's buffer. mode +speci- fies more exactly what is to be discarded: +
0: Discard characters that have been received but not yet read out +
1: Discard characters that have been written but not yet sent +
2: Discard all characters still buffered +
  +
If the operation is not possible on the device, the call is +ignored. +
  +
Return value: +
0 on success +
ERANGE - If mode is not 0, 1 or 2 +
EUNDEV - Invalid device +
  +

+ +
+
WORD XSInSig(WORD device, void (*func)(WORD device))
+
+

+
Directs the driver to start up the function specified by +func as soon as a new character has arrived from the device. +For this the routine is passed the device number on the stack. The +speci- fied routine is most probably called from within an interrupt. +Accordingly it may not alter any registers and should be as short as +possible. The routine is called just once, thereafter XSInSig is +deactivated again automatically. If an XSInSig was already active +before the call, the new one will not be installed and EACCDN will be +returned. +
  +
If a NULL-pointer is passed for func, a previously set +XSInSig will be annulled. +
  +
XSInSig need not be available on every device; in that case +EINVFN will be returned. +
  +
Return value: +
0 - on success +
EINVFN - Device does not support XSInSig +
EACCDN - There is already an XSInSig active +
EUNDEV - Invalid device +
  +
Note: This function is intended mainly for +implementation in MiNT drivers and should not be used by application +programs. +
  +

+ +
+
WORD XSOutSig(WORD device, void (*func)(WORD device))
+
+

+
Directs the driver to start up the function specified by +func as soon as a new character can be output to the device. +The functionality is otherwise similar to XSInSig. +
  +
If a NULL-pointer is passed for func, a previously set +XSOutSig will be annulled. +
  +
XSOutSig need not be available on every device; in that case +EINVFN will be returned. +
  +
Return value: +
0 - on success +
EINVFN - Device does not support XSOutSig +
EACCDN - There is already an XSOutSig active +
EUNDEV - Invalid device +
  +
Note: This function is intended mainly for +implementation in MiNT drivers and should not be used by application +programs. +
  +

+ +
+
LONG XSCtlSig(WORD device, UWORD ctl_mask, void (*func)(WORD device, UWORD ctl))
+
+

+
Directs the driver to start up the function specified by +func as soon as the state of a control line specified in +ctl_mask has altered (coding as stated in XSCtlMap). For this +the routine is passed on the stack the device number and a bit-vector +in which the bit of the triggered control line is set. The specified +routine is most probably called from within an interrupt. Accordingly +it may not alter any registers and should be as short as possible. The +routine is called just once, thereafter XSCtlSig is deactivated again +automatically. +
  +
If an XSCtlSig was already active before the call, the new one +will not be installed and EACCDN will be returned. +
  +
If a NULL-pointer is passed for func, a previously set +XSCtlSig will be annulled. +
  +
XSCtlSig need not be available on every device; in that case +EINVFN will be returned. Equally it need not be available for all of +the available control lines. If there are control lines specified in +ctl_mask that are not supported by XSCtlSig, they will be +ignored. Which lines are actually reacted to can be seen from the +return value. +
  +
As soon as a device is released with XSRelease, any XCtlSig +still installed on it will be deinstalled automatically. +
  +
Return value: +
>0 (LONG!) - Mask with the control lines actually taken into +account +
EINVFN - Device does not support XSCtlSig +
EACCDN - There is already an XSCtlSig active +
EUNDEV - Invalid device +
  +
Note: This function can be used, for instance, to +oversee effi- ciently the RI or DCD lines (one installs a routine in +which the program sets a flag and then interrogates this +periodically). WARNING: A program using this function may not forget +on any account to annul the XSCtlSig before termination. +
  +

+ +
+
+

3.7.2.577 Cookie, XSND

+

Digi-Sound - Digital sound generation via the operating +system on every ST/E and TT030 +

+

Hooks into XBIOS and etv_term. +

+

3.7.2.578 Cookie, XSSI

+

Extended Screen Saver Information +

+

See also: XSSI protocol +

+

3.7.2.579 Cookie, XTOS

+

Extend TOS +

+

3.7.2.580 Cookie, xUAG

+

From the graphiccard MegaVision300. +

+

3.7.2.581 Cookie, xUFC

+

Extended Universal Font-Selector Configuration program +

+

3.7.2.582 Cookie, XWin

+

Extended-Windows module +

+

3.7.2.583 Cookie, zCAC

+

680x0 Cache Control CPX +

+

3.7.2.584 Cookie, zDCF

+

DCF_TIME receiver +

+

The program decodes the signals of a DCF77 radio receiver in the +background. +

+

Uses vectors: TRAP #1, TRAP #14, joyvec (Kbdvbase), Resetvector +(if the cookie jar is installed anew). +

+

Status: Freeware +

+

3.7.2.585 Cookie, _5MS

+

On Atari hardware, the 200 Hz system timer is implemented with +the MFP Timer C. Its interrupt vector is located at address 0x114. +

+

On non-Atari hardware, the 200 Hz system timer is implemented +differently, and may use a different interrupt vector. In this case, +the _5MS cookie is set with the address of that vector. Then it can be +used by FreeMiNT to hook the system timer on non-Atari hardware. +

+

3.7.2.586 Cookie, _AFM

+

Audio Fun Machine +

+

3.7.2.587 Cookie, _AKP

+

Keyboard layout and language of country configuration +

+

The cookie provides information about the language of the +country and the keyboard layout of the system. The bits 0-7 provide +info about the layout of the keyboard. These are: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
0=USA
1=Germany
2=France
3=England
4=Spain
5=Italy
6=Sweden
7=(French) Switzerland
8=(German) Switzerland
9=Turkey
10=Finland
11=Norway
12=Denmark
13=Saudi Arabia
14=Holland
15=CSSR
16=Hungary
17=Poland
18=Lituania
19=Russia
20=Estonia
21=Bialorus
22=Ukraina
23=Slovakia
24=Romania
25=Bulgaria
26=Slovenia
27=Croatia
28=Serbia
29=Montenegro
30=Macedonia
31=Greece
32=Latvia
33=Israel
34=South Africa
35=Portugal
36=Belgium
37=Japan
38=China
39=Korea
40=Vietnam
41=India
42=Iran
43=Mongolia
44=Nepal
45=Laos
46=Kambodja
47=Indonesia
48=Bangladesh
+
+ +

The bits 8-15 identify the language of the country. These are: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
0=USA
1=Germany
2=France
3=England
4=Spain
5=Italy
6=Sweden
7=(French) Switzerland
8=(German) Switzerland
9=Turkey
10=Finland
11=Norway
12=Denmark
13=Saudi Arabia
14=Holland
15=CSSR
16=Hungary
17=Poland
18=Lituania
19=Russia
20=Estonia
21=Bialorus
22=Ukraina
23=Slovakia
24=Romania
25=Bulgaria
26=Slovenia
27=Croatia
28=Serbia
29=Montenegro
30=Macedonia
31=Greece
32=Latvia
33=Israel
34=South Africa
35=Portugal
36=Belgium
37=Japan
38=China
39=Korea
40=Vietnam
41=India
42=Iran
43=Mongolia
44=Nepal
45=Laos
46=Kambodja
47=Indonesia
48=Bangladesh
+
+ +

The upper WORD is reserved for future use. +

+

3.7.2.588 Cookie, _CF_

+

ColdFire CPU +

+

3.7.2.589 Cookie, _CPU

+ + + +

Processor type +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
0=MC-68000
10=MC-68010
20=MC-68020
30=MC-68030
40=MC-68040
60=MC-68060
+
+ +

3.7.2.590 Cookie, _DOS

+

GEMDOS entry point (in GEMDOS 0.30). +

+

3.7.2.591 Cookie, _FDC

+ + + +

Floppy disk controller +

+

The cookie is normally installed by the driver software for floppy +disk controllers of higher write-densities. The upper byte provides +information about the type of highest write-density in the system. +This can be: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
0=Normal floppy interface(e.g. 720 kbyte disk)
1=High Density(HD - 1,44 MByte)
2=Extra High Density(ED - 2,88 MByte)
>2=Reserved 
+
+ +

The remaining three bytes provide information about who has set +the cookie. +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
$000000No information
$415443»ATC«, Atari Corporation
$445031»DP1«, Dreampark Development, apparently an American
 manufacturer of HD add-ons
$4D6163»Mac«, MagiC Mac or MagiC Mac X
$4D494C»MIL«, MilanTOS
+
+ +

This assignment does not apply on the Hades. Here the int32_t +value contains »hade«. +

+

3.7.2.592 Cookie, _FLK

+ +

File locking +

+

The cookie is set if the installed GEMDOS has provisions for file +locking extensions. The value of the cookie is the version number of +the extension. +

+

3.7.2.593 Cookie, _FPU

+ + + + +

Type of the FPU +

+

The upper WORD describes the type of the FPU in use: +

+ + + + + + + + + + + + +
Bit 0: SFP-004 or compatible FPU-card (68881 as a peripheral +component), if set. +
  +
Bit 1..2: 68881 or 68882 as co-processor. This can be: +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
0=Neither/nor
1=Exact type unknown
2=68881
3=68882
+
+ +
Bit 3: FPU in MC-68040 +
  +
Bit 4: FPU in MC-68060 +
  + +
+ +

The lower WORD is reserved for information about software +support via the Line-F trap, and is at present not yet in use. +According to Atari, a non-zero value indicates that Line-F support is +present. +

+

3.7.2.594 Cookie, _FRB

+ +

Fast-RAM buffer +

+

The cookie points to a 64 kbyte size buffer in ST-RAM that can +be used by an Atari TT for ACSI-DMA transfers (the Fast-RAM of the TT +can not be used for this). +

+

Device drivers for the ACSI port may use this buffer as +temporary storage for transfers into the Fast-RAM; access is +coordinated via the system variable flock. +

+

If this cookie is not present, then the computer either has no +Fast-RAM, or no ACSI port. +

+

3.7.2.595 Cookie, ΣFSC

+

Falcon Screen +

+

3.7.2.596 Cookie, _FSR

+

FLCNSER 1.0 - Patch program for an error in the TOS +routines for the serial ports (required for TOS 4.00...TOS 4.04) +

+

3.7.2.597 Cookie, _IDT

+

Formating of date and time +

+

The cookie provides information about the formatting of date and +time within the system. The bits 0-7 contain the ASCII value of the +character that is to serve as a separator for the date; if 0, then +"/" will be used. +

+

The bits 8-11 describe the formatting of the date. This can be: +

+

0 = Format "MM-DD-YY"  (month, day, year) +
1 = Format "DD-MM-YY"  (day, month, year) +
2 = Format "YY-MM-DD"  (year, month, day) +
3 = Format "YY-DD-MM"  (year, day, month) +

+

In the bits 12-15 the time format is coded. This can be: +

+

0 = 12-hour display +
1 = 24-hour display +

+

The upper WORD is reserved for future use. +

+

3.7.2.598 Cookie, _INF

+ + +

STEFIX patch programm +

+

The cookie is created by the patch programm STEFIX, which +remedies some errors in the TOS 1.06 desktop. In the modified +version with XBRA by Karsten Isakovic. +

+

3.7.2.599 Cookie, _INU

+

Format for numbers +

+

3.7.2.600 Cookie, _ISO

+

Specifies the real keyboard/font nationality +

+

0 = default/undefined 1 = ISO-8859-1 (Latin-1) Western European +
2 = ISO-8859-2 (Latin-2) Central European +
3 = ISO-8859-3 (Latin-3) Southern European +
x = ISO-8859-x +

+

3.7.2.601 Cookie, _JPD

+

JPEG Decoder with DSP support +

+

The cookie indicates the availability of a JPEG decoder from the +firms Brainstorm/Atari, which makes use of the potentialities of the +Digital Signal Processor (DSP) in the Falcon030. +

+

3.7.2.602 Cookie, _MCF

+

ColdFire features +

+
typedef struct {
+  int8_t magic[3];           /* Magic number 0x4d4346 (MCF), identifies this struct */
+  uint8_t  version;          /* This struct version                                 */
+  int8_t   device_name[16];  /* Device identification number, null terminated       */
+  int8_t   core;             /* ColdFire core version number                        */
+  int8_t   revision;         /* Processor revision number                           */
+  uint32_t units;            /* Bit mask. b0: MAC, b1: DIV, b2: EMAC, b3: FPU, b4: MMU */
+  int8_t   isa;              /* Instruction-Set Architecture (ISA) revision level   */
+  int8_t   debug;            /* Debug module revision                               */
+  int16_t  sysbus_frequency; /* System bus frequency in Mhz                         */
+} MCF_COOKIE;
+
+

Values defined taken from ColdFire Family Programmer's Reference +Manual (CFPRM). Section 1.10 Hardware Configuration Information. +

+ + + + + + + + + + + + + + + +
device_name Is the "device identification number" as specified in +the different families reference manuals, in sections describing the +registers SDID, CIR, DEVICEID or JTAGID (depending on the CF family). +For example: MCF5474, MCF5485, MCF54455, etc ... +
  +
core ColdFire core version +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
unknown-1
MCF_V11
MCF_V22
MCF_V33
MCF_V44
MCF_V55
+
+ +
units Bit mask for units, set when present +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
unknown0
MCF_UNITS_MAC1
MCF_UNITS_DIV2
MCF_UNITS_EMAC4
MCF_UNITS_FPU8
MCF_UNITS_MMU16
+
+ +
isa Instruction-Set Architecture (ISA) revision level +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
unknown-1
MCF_ISA_A0
MCF_ISA_B1
MCF_ISA_C2
MCF_ISA_A_PLUS8
+
+ +
debug Debug module revision number +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
unknown-1
MCF_DEBUG_A0
MCF_DEBUG_B1
MCF_DEBUG_C2
MCF_DEBUG_D3
MCF_DEBUG_E4
MCF_DEBUG_B_PLUS9
MCF_DEBUG_D_PLUS11
MCF_DEBUG_D_PLUS_PST15
+
+ + +
+ +

3.7.2.603 Cookie, _MCH

+ + + +

Machine type +

+

The upper WORD describes the computer family, the lower serves +for finer distinctions. +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HighLowType
0x00000x0000Atari ST (260 ST,520 ST,1040 ST,Mega ST,...)
0x00000x4D34Medusa T40 without SCSI
0x00010x0000Atari STE (1040 STE, ST Book, STylus/STPad)
0x00010x0010Mega STE
0x00010x0100Sparrow (Falcon pre-production machine)
0x00020x0000Atari TT or Hades
0x00020x4D34Medusa T40 with SCSI
0x00030x0000Atari-Falcon030
0x00040x0000Milan
0x00050x0000ARAnyM >=v0.8.5beta
+
+ +

The lower WORD serves for finer distinctions, and is defined +only for the STE models at present. This can be: +

+

0x001 = ST Book or STylus +
0x002 = ST Book +
0x003 = STylus +
0x008 = STE with IDE hardware +
+

+

If the value is -1, then it's a case of non-ST-compatible +hardware. In that case all hardware accesses should be avoided. +

+

3.7.2.604 Cookie, _MET

+

MetaDOS +

+

The cookie is only present when the operating system extension +MetaDOS (since Version 2.2) is installed. +

+

3.7.2.605 Cookie, _MIL

+

Milan computer +

+

3.7.2.606 Cookie, _NET

+ +

Network extensions for GEMDOS +

+

The cookie serves as a flag for possible network extensions. The +value is a pointer to two LONG values. The first contains a provider +identifier for the network, the second the version number allocated by +the manufacturer. +

+ +
struct netinfo
+{
+  int32_t publisher_id;      /* Special code for publisher to assigned */
+                             /* by ATARI (USA)                         */
+                             /* Usually a four-byte ASCII string       */
+  int32_t version;           /* Version number of the network          */
+};
+
+

As a provider-ID, there are till now: +
+

+
+ + + + + + + + + + + + +
Application Design Software"A&D\0"
Pams Software"PAMS"
Itos Software"ITOS"
+
+ +

3.7.2.607 Cookie, _OOL

+ + +

POOLFIX3 patch program +

+

The cookie is created by the patch program POOLFIX3, which +remedies some errors in GEMDOS Version 0.15. +

+

3.7.2.608 Cookie, _PCI

+

PCI-BIOS +

+

Makes available functions for configuration and initialization +of PCI-cards via a jump table (for all ATARI-compatibles with +PCI-bus). +

+

Vectors: No modified vectors. +

+

Copyright: Freeware +

+

See also: PCI-BIOS   Cookie XPCI +

+

3.7.2.609 Cookie, _PKT

+

Packet Driver +

+

3.7.2.610 Cookie, _PWR

+

Power management unit +

+

3.7.2.611 Cookie, _SLM

+ +

Diablo driver for SLM laser printer +

+

The cookie is set by the Diablo driver (since version 1.4) of +the SLM laser printer. The value of the cookie points to an +undocumented structure. +

+

3.7.2.612 Cookie, _SND

+ + +

Sound hardware +

+

Bit table that describes the available sound options. These are: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Bit 0=Sound chip
Bit 1=Stereo DMA sound (as with STE and TT)
Bit 2=CODEC
Bit 3=Digital signal processor (DSP)
Bit 4=Multiplexer connection matrix
Bit 5=Extended XBIOS routines (Milan, GSXB)
+
+ +

All other bits are reserved for future purposes. +

+

The MilanBlaster XBIOS sets the bits No. 2 and No. 5 +(0x00000024l). +

+

3.7.2.613 Cookie, _SWI

+ +

DIP configuration switches +

+

The upper 24 bits are not assigned at present. For the lower 8 +bits the following applies: +

+

Bit 6 = 720 kbyte or 1.44 Mbyte floppy disk drive +
Bit 7 = Stereo or mono system +

+

The remaning lower 8 bits are also not assigned at present. +

+

3.7.2.614 Cookie, _T2W

+

TOS2WIN emulator +

+

3.7.2.615 Cookie, _T30

+

KAOS TOS +

+

3.7.2.616 Cookie, _USB

+

USB core API driver +

+

3.7.2.617 Cookie, _VDI

+

Milan VDI +

+
typedef struct
+{
+   int16_t Version;   /* versionnumber (0x100 for 1.00) */
+   int32_t Subcookie;
+   int32_t Driverflags;
+   int32_t Dispatcheraddress;
+} _VDI_Structure;
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DriverflagsBitnumber
HARD_SOLIDRECT0
HARD_PATTERNRECT1
HARD_SOLIDHLINE2
HARD_PATTERNHLINE3
HARD_SOLIDVLINE4
HARD_PATTERNVLINE5
HARD_BITBLT6
HARD_TBITBLT7
HARD_SOLIDABLINE8
HARD_PATTERNABLINE9
HARD_QUICKTXT16
HARD_QUICKBIOS17
+
+ +

Dispatcher Function: +

+
+ + + + + + + + + + + + + + + +
DRIVER_ACCEL1Graphic accelerator
DRIVER_DEVICE2graphic device routines
DRIVER_BIOS3BIOS/XBIOS routines
+
+ +

Graphic accelerator Function: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DRAW_SOLIDRECT$00010000Füllt einen Rechteckbereich mit einer Farbe
DRAW_PATTERNRECT$00020000Füllt einen Rechteckbereich mit einem monochromen Pattern
DRAW_SOLIDHLINE$00030000 
DRAW_PATTERNHLINE$00040000 
DRAW_SOLIDVLINE$00050000 
DRAW_PATTERNVLINE$00060000 
DRAW_BITBLT$00070000 
DRAW_TBITBLT$00080000 
DRAW_SOLIDABLINE$00090000 
DRAW_PATTERNABLINE$000A0000 
DRAW_QUICKTXT$00100000 
DRAW_QUICKBIOS$00110000 
+
+ +

DRAW_SOLIDRECT +
Call: a0 = solidrectdata, a1: Structur from LineA +

+

DRAW_PATTERNRECT +
Call: a0 = patternrectdata, a1: Structur from LineA +

+

Graphic device routines: +

+
+ + + + + + + + + + + + + + + +
DEVICE_GETDEVICELIST$00010000 
DEVICE_GETDEVICE$00020000 
DEVICE_SETDEVICE$00030000 
+
+ +

BIOS/XBIOS Funktionen +

+
+ + + + + +
BIOS_PHYSBASE$00010000Returns physical screen address
+
+ +

3.7.2.618 Cookie, _VDO

+ + +

Video hardware +

+

The upper WORD is used the coarse classification. This can be: +

+ + + + + + + + + + + + + + + + + + +
-1 = Non-ST-compatible hardware; in this case all hardware accesses +must be avoided +
 0 = Atari ST (260 ST, 520 ST, 1040 ST, Mega ST, ...) +
 1 = Atari STE (1040 STE, Mega STE, ST Book) +
 2 = Atari TT +
 3 = Atari Falcon030 +
 4 = Milan + +
+ +

The lower WORD is reserved for finer differences. +

+

3.7.2.619 Cookie, __NF

+

Native features proposal +

+
+ +Home +BIOSBIOS +BIOS error-messagesBIOS error-messages +VT-52 terminalVT-52 terminal + + diff --git a/en/bios_errors.html b/en/bios_errors.html new file mode 100644 index 000000000..d6b619eb1 --- /dev/null +++ b/en/bios_errors.html @@ -0,0 +1,159 @@ + + + + + +The documentation for TOS: BIOS error-messages + + + + + + + + + +Home +BIOSBIOS +The system vectorsThe system vectors +Cookie jarCookie jar + +
+ +

3.6 BIOS error-messages

+

Errors are reported by the BIOS and XBIOS as negative values. +The following list contains all known error-messages: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
No. Name Meaning +
    +
   0 E_OK OK. No error has arisen + +
  -1 ERROR Generic error (not specified precisely) + +
  -2 EDRVNR Addressed device/drive not ready + +
  -3 EUNCMD The specified command is unknown + +
  -4 E_CRC Error when reading a sector / CRC error + +
  -5 EBADRQ Bad request / The device cannot execute the command + +
  -6 E_SEEK Drive couldn't reach the specified track + +
  -7 EMEDIA Read error (medium has a wrong boot sector) + +
  -8 ESECNF Sector was not found + +
  -9 EPAPER Printer is not ready / Out of paper + +
 -10 EWRITF Error during a write operation + +
 -11 EREADF Error during a read operation + +
 -12 EGENRL General error + +
 -13 EWRPRO Medium is write-protected + +
 -14 E_CHNG Medium was changed after a write operation + +
 -15 EUNDEV Device is not known to the operating system + +
 -16 EBADSF Bad sectors detected during formatting + +
 -17 EOTHER Another floppy disk must be inserted. This error only appears +if Drive B: is accessed without it being connected. In such a case the +user is asked to insert a floppy disk into the first drive. + +
 -18 EINSERT MetaDOS error: Insert medium + +
 -19 EDVNRSP MetaDOS error: Device does not reply + +
-128 SNDNOTLOCK Falcon XBIOS: Sound-system not reserved + +
-129 SNDLOCKED Falcon XBIOS: Sound-system already reserved + +
+ +

See also: Error-messages in MagiC   GEMDOS error-messages +

+
+ +Home +BIOSBIOS +The system vectorsThe system vectors +Cookie jarCookie jar + + diff --git a/en/bios_functions.html b/en/bios_functions.html new file mode 100644 index 000000000..34e975bdd --- /dev/null +++ b/en/bios_functions.html @@ -0,0 +1,300 @@ + + + + + +The documentation for TOS: BIOS function list + + + + + + + + + +Home +BIOSBIOS +BSIM-BIOS-ExtensionBSIM-BIOS-Extension +BIOS StructuresBIOS Structures + +
+ +

3.11 BIOS function list

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
dechexName of functionexist in
00x00GetmpbTOS
10x01BconstatTOS
20x02BconinTOS
30x03BconoutTOS
40x04RwabsTOS
50x05SetexcTOS
60x06TickcalTOS
70x07GetbpbTOS
80x08BcostatTOS
90x09MediachTOS
100x0ADrvmapTOS
110x0BKbshiftTOS
120x0CMessageLantech LAN from Lantech Systems
120x0CWrite_ASCxVT52; ST-Computer 1988-04
120x0CLrwabs?, no information
160x10ScResetDOLMEN, SCSI function
170x11??DIAB630?
170x11date_timePC GEMDOS, internal BIOS function
    EmuTOS until version 0.7
170x11ScGetDOLMEN, SCSI function
180x12ScSelectDOLMEN, SCSI function
190x13ScCmdDOLMEN, SCSI function
200x14ScCompleteDOLMEN, SCSI function
210x15ScReadDOLMEN, SCSI function
220x16ScWriteDOLMEN, SCSI function
230x17ScReadDmaDOLMEN, SCSI function
240x18ScWriteDmaDOLMEN, SCSI function
250x19ScReadBackDOLMEN, SCSI function
260x1AScWriteBackDOLMEN, SCSI function
270x1BScStatDOLMEN, SCSI function
280x1CScSelAtnDOLMEN, SCSI function
290x1DScMsgInDOLMEN, SCSI function
300x1EscMsgOutDOLMEN, SCSI function
320x20AtaResetDOLMEN, IDE function
1210x79VT_DRVVideotext-Decoder (Print-Technik)
1320x84BforceST-Computer 1991-07, Page 78 ff.
3000x12cbsim_idDrive B Simulator
3010x12dload_diskDrive B Simulator
3020x12ekill_diskDrive B Simulator
3030x12fsave_diskDrive B Simulator
3040x130drv_changeDrive B Simulator
3050x131drvprotecDrive B Simulator
3060x132dstateDrive B Simulator
+
+ +
+ +Home +BIOSBIOS +BSIM-BIOS-ExtensionBSIM-BIOS-Extension +BIOS StructuresBIOS Structures + + diff --git a/en/bios_main.html b/en/bios_main.html new file mode 100644 index 000000000..f5ac7c636 --- /dev/null +++ b/en/bios_main.html @@ -0,0 +1,48 @@ + + + + + +The documentation for TOS: BIOS + + + + + + + + + +Home +Contents +GEMGEM +About the BIOSAbout the BIOS + +
+ +

3 BIOS

+ +
+
+ +Home +Contents +GEMGEM +About the BIOSAbout the BIOS + + diff --git a/en/bios_resvector.html b/en/bios_resvector.html new file mode 100644 index 000000000..9ca80dc9c --- /dev/null +++ b/en/bios_resvector.html @@ -0,0 +1,78 @@ + + + + + +The documentation for TOS: Hooking into the reset vector + + + + + + + + + +Home +BIOSBIOS +The input/output channels of the BIOSThe input/output channels of the BIOS +The system variablesThe system variables + +
+ +

3.3 Hooking into the reset vector

+

The recipe for hooking your own routines into the reset-vector +runs as follows: +

+
    +
  • Set the system variable resvalid to the value 0x31415926, as +therwise resvector will be completely ignored by the BIOS ignore. +
      +

  • +
  • Write the address of your own function in the resvector vector. +
      +

  • +
  • Jump back from the function via jmp(a6). +
      +

  • +
+ +

Important: A jump back from the installed function via rts +is not possible, since no stack has been initialised yet at +this time. In practice one could proceed as follows, for instance: +

+
RESMAGIC    equ       $31415926
+_resvalid   equ       $426
+_resvector  equ       $42a
+            .text
+install:    move.l    _resvalid,oldvalid
+            move.l    #RESMAGIC,resvalid
+            move.l    _resvector,oldreset
+            move.l    #newreset,_resvector
+            rts
+
+            dc.b      "XBRARESV"
+oldreset:   dc.l      0
+
+newreset:   move.l    oldreset,_resvector
+            move.l    oldvalid,_resvalid
+            jmp       (a6)
+
+            .bss
+oldvalid:   .ds.l     1
+
+

Warning: So that multiple programs may install +themselves, a clean de-installation must follow the handling of the +function. +

+

See also: System variables   System vectors   XBRA procedure +

+
+ +Home +BIOSBIOS +The input/output channels of the BIOSThe input/output channels of the BIOS +The system variablesThe system variables + + diff --git a/en/bios_structures.html b/en/bios_structures.html new file mode 100644 index 000000000..c5be0e4da --- /dev/null +++ b/en/bios_structures.html @@ -0,0 +1,222 @@ + + + + + +The documentation for TOS: BIOS Structures + + + + + + + + + +Home +BIOSBIOS +BIOS function listBIOS function list +XBIOSXBIOS + +
+ +

3.12 BIOS Structures

+ +
+

3.12.1 BPB

+
typedef struct
+{
+  WORD   recsiz;       /* Bytes per sector                     */
+  WORD   clsiz;        /* Sectors per cluster                  */
+  WORD   clsizb;       /* Bytes per cluster                    */
+  WORD   rdlen;        /* Directory length                     */
+  WORD   fsiz;         /* Length of the FAT in sectors         */
+  WORD   fatrec;       /* Start of the 2nd FAT                 */
+  WORD   datrec;       /* 1st free sector                      */
+  WORD   numcl;        /* Total numbr of clusters              */
+  WORD   bflags;       /* Flags as bit-vector                  */
+                       /* Bit 0: 0 (12-Bit-FAT), 1 16-Bit-FAT  */
+                       /* Bit 1: 0 (two FATs), 1 (one FAT)     */
+                       /*        only available since TOS 2.06 */
+} BPB ;
+
+

See also: Getbpb +

+

3.12.2 MD

+
typedef struct
+{
+     MD *m_link;         /* Next MD (or NULL)          */
+     long m_start;       /* saddr of block             */
+     long m_length;      /* # bytes in block           */
+     PD *m_own;          /* Owner's process descriptor */
+} MD;
+
+
+

See also: BIOS   Getmpb   MPB +

+

3.12.3 MPB

+
typedef struct
+{
+    MD *mp_mfl;      /* Memory free list      */
+    MD *mp_mal;      /* Memory allocated list */
+    MD *mp_rover;    /* Roving ptr            */
+} MPB;
+
+
+

See also: BIOS   Getmpb +

+

3.12.4 patternrectdata

+
struct patternrectdata
+{
+  int16_t x1, y1;
+  int16_t x2, y2;
+  int32_t fg_color;
+  int32_t bg_color;
+  int16_t mode;
+  int32_t *pattern;
+  int32_t *patternmask;
+}
+
+

See also: _VDI +

+

3.12.5 PUN_INFO

+
typedef struct
+{
+    WORD puns;               /* Number of devices               */
+    BYTE pun[16];            /* Various flags                   */
+    LONG part_start[16];     /* Partition starts                */
+    LONG P_cookie;           /* Must be "AHDI"                  */
+    LONG *P_cookptr;         /* Points to the previous element  */
+    UWORD P_version;         /* Version number (>= 0x0300)      */
+    UWORD P_max_sector;      /* Maximum sector size             */
+    LONG  reserved[16];      /* Reserved                        */
+} PUN_INFO;
+
+ + + + + + + + + + + + + + + + + + + + + +
puns Contains the number of hard drives found by the hard disk +driver. With two dummy entries (0xFF) for drive A and B. +
  +
pun +
  + + + + + + + + + + + + + + + + + + +
Bit 0..2: Device number of the hard drive. +
  +
Bit 3: With the bit set, this is a device on the SCSI port (otherwise +ACSI): Though this bit is not yet officially documented, it can be +used without reservation. +
  +
Bit 4: Falcon IDE +
  +
Bit 5: USB +
  +
Bit 6: Removable media +
  +
Bit 7: If this bit is set, then the BIOS device is not controlled by +the hard disk driver (applies e.g. for the two floppy disk drives on +device numbers 0 and 1). +
  + +
+ +
part_start Contains for each (supported) device number the number of the +start sector on the corresponding hard drive. Again two dummy entries +(0L) for drive A and B. +
  +
P_cookie Magic value; always "AHDI" +
  +
P_cookptr Should always point to the previous structure element. +
  +
P_version Version number e.g. 0x0300 +
  +
P_max_sector Describes the largest occurring block size for BIOS sectors. +
  + +
+ +

Example of how one obtains the address of the structure: +

+
PUN_INFO *GetPunPtr (void)
+{
+  PUN_INFO *P;
+  int32_t oldstack;
+
+  oldstack = Super (0L);
+  P = *((PUN_INFO **)(0x516L));
+  Super ((void *)oldstack);
+
+  if (P)
+    if (P->P_cookptr == &(P->P_cookie)) /* Cookie ok? */
+      if (P->P_version >= 0x300)
+        return P;
+
+  return 0L;
+}
+
+

See also: XHDI specification   pun_ptr +

+

3.12.6 solidrectdata

+
struct solidrectdata
+{
+  int16_t x1, y1;
+  int16_t x2, y2;
+  int32_t fg_color;
+  int32_t bg_color;
+  int16_t mode;
+}
+
+

See also: _VDI +

+
+ +Home +BIOSBIOS +BIOS function listBIOS function list +XBIOSXBIOS + + diff --git a/en/bios_sysvars.html b/en/bios_sysvars.html new file mode 100644 index 000000000..89d737f31 --- /dev/null +++ b/en/bios_sysvars.html @@ -0,0 +1,1220 @@ + + + + + +The documentation for TOS: The system variables + + + + + + + + + +Home +BIOSBIOS +Hooking into the reset vectorHooking into the reset vector +The system vectorsThe system vectors + +
+ +

3.4 The system variables

+

As the system variables and vectors represent the lowest level +of the operating system, application programs should access these only +when absolutely necessary. Explicitly: +

+
    +
  • Do not alter any system variables that may not be altered. +
  • +
  • Do not use any system variables if a function of the operating +system could be called instead (Example: Mfpint). +
  • +
+ +

The following list contains all the TOS system variables: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Variable     Address Description +
  + + + +
_autopath    LONG 0x4ca Pointer to the access path for the AUTO-folder (unused and not +officially documented). +
  + + + +
_bootdev     WORD 0x446 Normally contains the number of the drive that was used for +booting. In addition, this variable is also used during booting to +select the boot-drive (but usually this only works when no hard disk +driver is booted). So if one sets the variable to 1, has no +boot-capable hard drive connected and executes a reset, booting will +be from drive B! +
  + + + + +
_bufl        LONG 0x4b2 Two pointers to GEMDOS buffer lists. +
  + + + +
_cmdload     WORD 0x482 If this register is non-0, an attempt is made to start the +program COMMAND.PRG instead of GEM. The register may be set by a +program in an executable bootsector. +
  + + +
_dskbufp     LONG 0x4c6 Pointer to a 1024-byte buffer for reading and writing to floppy +disks or hard drives (e.g. at boot-attempts). The pointer is also used +by the VDI. +
  + + + +
_drvbits     LONG 0x4c2 Bit-table for the mounted drives of the BIOS. Valid are: +
  +
Bit-0 = Drive A +
Bit-1 = Drive B +
Bit-2 = Drive C (etc.) +
  +
In TOS 1.00 the variable is not cleared at a reset. Therefore +custom drivers should clear the bits they have entered at a reset; +otherwise it could happen that drive identifiers suddenly +"disappear". +
  + + +
_frclock     LONG 0x466 Similar to _vbclock, with the difference that the count is not +halted by vblsem. +
  + + + + + +
_fverify     WORD 0x444 Determines whether the BIOS should perform a Verify via Rwabs +when writing to floppy disks, or not. Valid are: +
  +
0 = No Verify +
  +
Normally the Verify is switched on. +
  + + +
_hz_200      LONG 0x4ba Number of 200-Hz interrupts till now. +
  + + + + +
_longframe   WORD 0x59e If this flag is not null, then a CPU with long +stackframes (i.e. not a 68000 type) is installed. This value is +of interest, for instance, if a routine is to be hooked into an +exception vector, and the values to be examined are passed on the +stack. If this variable has the value 0 than one will find the +parameters at offset 6, otherwise at offset 8. +
  + + +
_md          LONG 0x49e Not officially documented, and probably also unused. +
  + + +
_membot      LONG 0x432 Lower end of the free ST-compatible memory region under GEMDOS +(i.e. the start of the original TPA). The variable is used by the +BIOS function Getmpb. +
  + + +
_memtop      LONG 0x436 Similar to _membot the end of the free ST-compatible memory +region. +
  + + + +
_nflops      WORD 0x4a6 Number of mounted floppy disk drives. +
  + + +
_p_cookies   LONG 0x5a0 Pointer to the cookie jar. +
  + + +
_prtabt      WORD 0x4f0 Flag for aborting the printing process due to a timeout. It is +unused, however. +
  + + +
_shell_p     LONG 0x4f6 This pointer is not used by the ROM, i.e. programs that use it +themselves have to clear it in the case of a reset and at a program +termination. Normally _shell_p is set by UNIX-like shells, and points +to a routine that handles a command line. The address of the character +string is passed on the stack (4(sp)), the return of the operation +will lie in register D0. +
  + + +
_sysbase     LONG 0x4f2 Points to a OSHEADER structure. +
  + + +
_timr_ms     WORD 0x442 Time in milliseconds that normally passes between two ticks of +the system timer. This value is also returned by the BIOS function +Tickcal. +
  + + + +
_v_bas_ad    LONG 0x44e Pointer to the start address of the logical screen memory, +which on an ST has to be aligned at a 256-byte boundary. With an STE +and TT this is a 2- or 8-byte boundary respectively. This value is +returned by Logbase. +
  + + + +
_vbl_list    LONG 0x4ce List of the initial vertical blank routines. One should always +access only via _vblqueue. +
  + + + +
_vbclock     LONG 0x462 Number of vertical blanks processed since the last reset. +
  + + +
_vblqueue    LONG 0x456 Pointer to the list of pointers to the deferred vertical blank +handlers. +
  + + +
bell_hook    LONG 0x5ac Pointer to a routine for the output of the ping-sound (system +bell). The BIOS looks after the querying of the flag automatically +in con_term and calls this routine only when the bell should really be +sounded. The routine is called in supervisor-mode and terminated via +RTS; it may alter the registers D0-D2 and A0-A2. BIOS calls from +"within" the routine are permitted (from TOS 1.06 on, +from KAOS 1.4.2 on). +
  + + +
colorptr     LONG 0x45a Pointer to a colour palette, which is loaded into the ST +hardware colour registers (from address 0xffff8240 onwards) at the +next vertical blank. This prevens an unattractive flickering on the +screen. If there is a null in colorptr, then nothing happns. After the +transfer of the colour values the pointer is cleared. +
  + + +
con_state    LONG 0x4a8 Internal pointer for screen output routines (not officially +documented). +
  + + + +
conterm      BYTE 0x484 Attribute bits for the BIOS device "CON:". Valid +are: +
  + + + + + + + + + + + + +
Bit-0 = Key-click on/off +
Bit-1 = Key-repeat on/off +
Bit-2 = Bell at ouput of CTRL-G +
Bit-3 = Cause Bconin to return the current value of Kbshift in the bits +24..31. + +
+ + + +
criticret    LONG 0x48a Officially undocumented, and probably also unused. +
  + + +
defshiftmd   BYTE 0x44a Default colour graphic resolution. Switches the computer to +colour operation (after a reset, by changing of the plugs or by +switching on) into the specified resolution. +
  + + + +
end_os       LONG 0x4fa Pointer to the first byte not used by TOS-internal variables +(i.e. the first byte of free memory). +
  + + +
etv_critic   LONG 0x404 Logical GEMDOS vector 257. Should always be set only via +Setexc. +
  + + +
etv_term     LONG 0x408 Logical GEMDOS vector 258. Should always be set via Setexc. +Programs that hook into any system vectors should also hook into +this vector. If the program is terminated in an abnormal +manner, the operating system jumps first via this vector, so that one +can withdraw cleanly from all changed vectors. As MagiC uses its +own etv_term vector for each application, collisions can +not arise there. +
  + + +
etv_timer    LONG 0x400 Logical GEMDOS vector 256. Should always be set via Setexc. +
  + + +
etv_xtra     LONG 0x40c Reserved for the logical vectors 259-263 of GEMDOS, and +presently unused. +
  + + +
exec_os      LONG 0x4fe Pointer to the first byte of the text segment of the +shell-program. +
  + + + +
flock        WORD 0x43e If there is a non-zero value here, then you must not +access the DMA chip. So DMA device drivers must first inquire whether +the DMA chip has been blocked and set flock themselves when they start +work. +
  + + + +
hdv_boot     LONG 0x47a Vector to the routine for loading the boot sector. This routine +is used by the BIOS to establish whether a boot-sector is present +and establish whether there is a boot sector and if so, whether it is +executable. +
  + + + +
hdv_bpb      LONG 0x472 Vector to routine that establishes the BPB of a BIOS drive. +The device number is passed on the stack (4(sp)). +
  + + +
hdv_init     LONG 0x46a Vector to the initialisation routines for the floppy disk +drives. It is read out before reading the boot sectors, and hence can +be altered only by reset-resident programs or ROM-modules. The tasks +include: +
  +
    +
  • Initialisation of the diskette drives (_nflops is set +accordingly). +
  • +
  • Transfer of seekrate to the internal variables of the BIOS. +
  • +
+ + + + +
hdv_mediach  LONG 0x47e Vector to routine for establishing the media-change status of a +BIOS drive. The BIOS device number is passed on the stack (4(sp)). +
  + + +
hdv_rw       LONG 0x476 Vector to the routine for reading and writing of blocks to +BIOS drives. The same parameters are passed on the stack as for +Rwabs (starting with 4(sp); rwflag). +
  + + + +
kcl_hook     LONG 0x5b0 Pointer to a routine for the output of the key-click sound. The +BIOS itself serves for the inquiry of the flag in con_term and calls +this routine only when the sound is to be issued. The routine is +called in supervisor mode, terminated via RTS, and may alter the +registers D0-D2 and A0-A2; it should not take up too much time. (From +TOS 1.06 on, from KAOS 1.4.2 on) +
  + + +
memcntrl     BYTE 0x424 Contains the lowest four bits of the memory control register +(0xffff8001) +
Some known values are: +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
Memory sizeValue
128 K0
512 K4
256 K (2 banks)0
1 MB5
+
+ + + +
memval2      LONG 0x43a Should hold the magical value 0x237698aa after a successful +cold start. If both memval2 as well as memvalid have the required +value and from TOS 1.02 on memval3 as well), then at the next reset +only a warm start will be initiated. +
  + + +
memval3      LONG 0x51a See also memval and memval2. In this case the magical value is +0x5555aaaa. (From TOS 1.02 on) +
  + + +
memvalid     LONG 0x420 Should contain the magical value 0x752019f3. +
  + + +
nvbls        WORD 0x454 Number of entries that _vblqueue points to. Identical with the +maximum number of coresidentally installable vertical blank routines +(default value: 8). +
  + + + + +
palmode      WORD 0x448 Tells the Atari the television mode. The following apply: +
  +
0 = NTSC mode (60 Hz) +
1 = PAL mode  (50 Hz) +
  +
In practice this system variable is ignored. A change of the +picture repetition frequency is only possible via the corresponding +hardware registers. +
  + + +
phystop      LONG 0x42e Pointer to the first byte above the physical end of the +ST-compatible RAM region (physical top of ST-compatible RAM) +
  + + + +
prt_cnt      WORD 0x4ee Counter for the Alternate-Help key-presses. Valid are: +
  + + + + + + + + + +
-1 = Normal status +
 0 = Start hardcopy +
>0 = Cancel hardcopy and reset value to -1 + +
+ +
This variable also has to be set before a call of Prtblk. +
  + + +
prv_aux      LONG 0x512 Pointer to a routine for output to the serial port (likewise +for hardcopy routine). The characer to be output lies in 6(sp). +
  + + +
prv_auxo     LONG 0x50e Pointer to a routine for establishing the status of the serial +ports (likewise for hardcopy function). +
  + + +
prv_lst      LONG 0x50a Pointer to a routine for output to the parallel port (likewise +for hardcopy routine). The character to be output lies in 6(sp). +
  + + +
prv_lsto     LONG 0x506 Pointer to a routine for establishing the status of the +parallel port (likewise for hardcopy routine). +
  + + +
pun_ptr      LONG 0x516 After successful installation of an AHDI- compatible hard disk +driver this points to a PUN_INFO structure. +
  + + + +
ramtop       LONG 0x5a4 Pointer to the end of the Fast-RAM in Atari TT (not officially +documented). +
  + + +
ramvalid     LONG 0x5a8 Magic value that shows whether ramtop holds a sensible value. +Must be 0x1357bd13. Not officially documented. +
  + + +
resvalid     LONG 0x426 If this address at a reset contains the magic value 0x31415926, +then the system will jump through resvector. +
  + + +
resvector    LONG 0x42a This is used during system initialisation. Contains the vector +for a reset, provided resvalid contains the correct value. At the time +of the call the hardware registers are not yet set, and the +stack-pointer too has not been initialised yet. +
  + + +
sav_context  LONG 0x4ae Should actually be a pointer to the memory region into which +parts of the stack are saved during exceptions. Actually however it is +not used by TOS, and one therefore has to access the variables +directly at the address 0x380. +
  + + +
sav_row      WORD 0x4ac Internal buffer for temporary saving the cursor row position +when using an Esc-Y VT-52 sequence (not officially documented). +
  + + +
savptr       LONG 0x4a2 Pointer to temporary buffer to which internal registers of +BIOS and XBIOS are saved. +
  + + + +
scr_dump     LONG 0x502 Pointer to the hardcopy routine. Is used by the XBIOS function +Scrdmp. +
  + + +
screenpt     LONG 0x45e Pointer to the start address of the video memory. It is +transferred to the relevant hardware registers (returned by Physbase) +and to _v_bas_ad (returned by Logbase) during every vertical blank +(until cleared). As the value is not cleared after setting +automatically, one should be careful with its usage and perhaps use +Setscreen instead. +
  + + + +
seekrate     WORD 0x440 Seek rate for the two floppy drives. Valid are: +
  +
0 =  6 ms +
1 = 12 ms +
2 =  2 ms +
3 =  3 ms +
+
  +
The variable is read out straight after system start by the +BIOS, and ignored afterwards. For altering the seek rate that is +used actually, one has to use the XBIOS function Floprate. +
  + + +
sshiftmd     BYTE 0x44c Copy of the mode register of the shifter. Valid are: +
  +
0 =  320 * 200 (four planes) +
1 =  640 * 200 (two planes) +
2 =  640 * 400 (one planes) +
3 =  640 * 480 (four planes, TT only) +
4 = 1280 * 960 (one planes, TT only) +
5 =  320 * 480 (eight planes, TT only) +
  +
All other values are reserved for future extensions. +
  + + +
swv_vec      LONG 0x46e Pointer to the routine that reacts to the connection of a black +and white or colour monitor (at the start it points to the normal reset +routine). +
  + + + +
the_env      LONG 0x4be Pointer to the default environment strings (unused). +
  + + + +
themd        MD   0x48e Pointer to the MD structure of the GEMDOS. This is set once +only during initialisation of the system, and must not be altered (and +it would be if using Getmpb!). +
  + + +
trp14ret     LONG 0x486 Officially not documented, and probably also unused. +
  + + +
vblsem       WORD 0x452 A value of 1 here means that the vertical blank handler is +active. +
  + + +
xconin       LONG 0x53e Eight vectors for Bconin routines. (From TOS 1.02 on) +
  + + +
xconout      LONG 0x57e Eight vectors for Bconout routines. (From TOS 1.02 on) +
  + + +
xconstat     LONG 0x51e Eight vectors for Bconstat routines. (From TOS 1.02 on) +
  + + +
xcostat      LONG 0x55e Eight vectors for Bcostat routines. (From TOS 1.02 on) +
  + +
+ +

See also: +
Reset vector   The System Vectors   Program launch and TPA +
System variables, sorted numerically +

+

3.4.1 System variables, sorted numerically

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VariableSizeAddress
0x400LONGetv_timer
0x404LONGetv_critic
0x408LONGetv_term
0x40cLONGetv_xtra
0x420LONGmemvalid
0x424BYTEmemcntrl
0x426LONGresvalid
0x42aLONGresvector
0x42eLONGphystop
0x432LONG_membot
0x436LONG_memtop
0x43aLONGmemval2
0x43eWORDflock
0x440WORDseekrate
0x442WORD_timr_ms
0x444WORD_fverify
0x446WORD_bootdev
0x448WORDpalmode
0x44aBYTEdefshiftmd
0x44cBYTEsshiftmd
0x44eLONG_v_bas_ad
0x452WORDvblsem
0x454WORDnvbls
0x456LONG_vblqueue
0x45aLONGcolorptr
0x45eLONGscreenpt
0x462LONG_vbclock
0x466LONG_frclock
0x46aLONGhdv_init
0x46eLONGswv_vec
0x472LONGhdv_bpb
0x476LONGhdv_rw
0x47aLONGhdv_boot
0x47eLONGhdv_mediach
0x482WORD_cmdload
0x484BYTEconterm
0x486LONGtrp14ret
0x48aLONGcriticret
0x48eMDthemd
0x49eLONG_md
0x4a2LONGsavptr
0x4a6WORD_nflops
0x4a8LONGcon_state
0x4acWORDsav_row
0x4aeLONGsav_context
0x4b2LONG_bufl
0x4baLONG_hz_200
0x4beLONGthe_env
0x4c2LONG_drvbits
0x4c6LONG_dskbufp
0x4caLONG_autopath
0x4ceLONG_vbl_list
0x4eeWORDprt_cnt
0x4f0WORD_prtabt
0x4f2LONG_sysbase
0x4f6LONG_shell_p
0x4faLONGend_os
0x4feLONGexec_os
0x502LONGscr_dump
0x506LONGprv_lsto
0x50aLONGprv_lst
0x50eLONGprv_auxo
0x512LONGprv_aux
0x516LONGpun_ptr
0x51aLONGmemval3
0x51eLONGxconstat
0x53eLONGxconin
0x55eLONGxcostat
0x57eLONGxconout
0x59eWORD_longframe
0x5a0LONG_p_cookies
0x5a4LONGramtop
0x5a8LONGramvalid
0x5acLONGbell_hook
0x5b0LONGkcl_hook
+
+ +

See also: System variables +

+
+ +Home +BIOSBIOS +Hooking into the reset vectorHooking into the reset vector +The system vectorsThe system vectors + + diff --git a/en/c_task_royal.html b/en/c_task_royal.html new file mode 100644 index 000000000..0b33fbcca --- /dev/null +++ b/en/c_task_royal.html @@ -0,0 +1,66 @@ + + + + + +The documentation for TOS: C'Task Royal + + + + + + + + + +Home +GEMDOSGEMDOS +ARGV procedureARGV procedure +NAP BioNet100NAP BioNet100 + +
+ +

5.19 C'Task Royal

+ + + + + + + + + + + + + + + + + + + + + + + + +

C'Task Royal eine Sammlung von Routinen an, die es ermöglichen, +C- oder Assemblerprogramme mit Multitasking-Fähigkeiten auszustatten. +Dazu muß der Programmierer sein Programm in mehrere Prozesse +aufteilen, die dann gleichzeitig ablaufen. +

+

More information: +
ST Computer 12/1986 +
ST Computer 08/1987 +
+

+
+ +Home +GEMDOSGEMDOS +ARGV procedureARGV procedure +NAP BioNet100NAP BioNet100 + + diff --git a/en/contact.html b/en/contact.html new file mode 100644 index 000000000..4bb3883bf --- /dev/null +++ b/en/contact.html @@ -0,0 +1,39 @@ + + + + + +The documentation for TOS: Contact + + + + + + + + + +Home +IntroductionIntroduction +IntroductionIntroduction +Old foreword by Rolf KotzianOld foreword by Rolf Kotzian + +
+ +

1.1 Contact

+

If you find an error, please let me know this. +

+

+

+

This hypertext is now released under The GNU General Public +Licence. +

+
+ +Home +IntroductionIntroduction +IntroductionIntroduction +Old foreword by Rolf KotzianOld foreword by Rolf Kotzian + + diff --git a/en/crazydots.html b/en/crazydots.html new file mode 100644 index 000000000..b8627f350 --- /dev/null +++ b/en/crazydots.html @@ -0,0 +1,857 @@ + + + + + +The documentation for TOS: Crazy-Dots XBIOS extension + + + + + + + + + +Home +XBIOSXBIOS +CENTScreen XBIOS extensionCENTScreen XBIOS extension +CT60 XBIOS extensionCT60 XBIOS extension + +
+ +

4.7 Crazy-Dots XBIOS extension

+ + +

Note: +
These functions are only available under Crazy-Dots; they +are not routines of the operating system. +

+

4.7.1 GetScreenDescriptor

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »GetScreenDescriptor« - +
  +
Opcode: 194 +
  +
Syntax: See Bindings for GetScreenDescriptor +
  +
Description: +
  +
Return value: 194L = XBIOS call is not installed (no Crazy-Dots software +installed). +
  +
Availability: This function is only available if the driver for the +Crazy-Dots graphics card has been launched. +
  +
Group: Crazy-Dots XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.7.1.1 Bindings for GetScreenDescriptor

+ + + + + + +
C: SCREEN xbios( 194 ); +
  +
Assembler: +
  +
move.w    #194,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.7.2 ResetScreen

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »ResetScreen« - +
  +
Opcode: 195 +
  +
Syntax: See Bindings for ResetScreen +
  +
Description: Re-initializes the graphics controller with the data held in +"Screen->ModStruct" - as a rule, therefore, the current +resolution. Serves well as an "emergency brake" for failed +attempts when you have tried to alter the registers, for instance. +
  +
Return value: None +
  +
Availability: This function is only available if the driver for the +Crazy-Dots graphics card has been launched. +
  +
Group: Crazy-Dots XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.7.2.1 Bindings for ResetScreen

+ + + + + + +
C: void xbios( 195 ); +
  +
Assembler: +
  +
move.w    #195,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.7.3 GetNumberofPModes

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »GetNumberofPModes« - +
  +
Opcode: 196 +
  +
Syntax: See Bindings for GetNumberOfPModes +
  +
Description: Obtain number of available physical resolutions. +
  +
Return value: Number of available physical resolutions. +
  +
Availability: This function is only available if the driver for the +Crazy-Dots graphics card has been launched. +
  +
Group: Crazy-Dots XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.7.3.1 Bindings for GetNumberOfPModes

+ + + + + + +
C: int32_t xbios( 196 ); +
  +
Assembler: +
  +
move.w    #196,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.7.4 GetPMode

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »GetPMode« - +
  +
Opcode: 197 +
  +
Syntax: See Bindings for GetPMode +
  +
Description: n: Number of the modes (0 <= n <= +GetNumberofPModes) +
  +
Return value: Pointer to a MOD_DESC structure. +
  +
Availability: This function is only available if the driver for the +Crazy-Dots graphics card has been launched. +
  +
Group: Crazy-Dots XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.7.4.1 Bindings for GetPMode

+ + + + + + +
C: MOD_DESC xbios( 197, int16_t n); +
  +
Assembler: +
  +
move.w    n,-(sp)      ; Offset 2
+move.w    #197,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.7.5 ReadMode

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »ReadMode« - +
  +
Opcode: 198 +
  +
Syntax: See Bindings for ReadMode +
  +
Description: Lists the graphics mode described by (MOD_DESC *) GetPMode in a +buffer (PMODE structure). +
  +
n: Number of the modes (0 <= n <= +GetNumberofPModes) +
  +
Return value: Pointer to a PMODE structure. +
  +
Availability: This function is only available if the driver for the +Crazy-Dots graphics card has been launched. +
  +
Gruppe: Crazy-Dots XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.7.5.1 Bindings for ReadMode

+ + + + + + +
C: PMODE xbios( 198, int16_t n ); +
  +
Assembler: +
  +
move.w    n,-(sp)      ; Offset 2
+move.w    #198,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.7.6 CopyModeToActiveMode

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »CopyModeToActiveMode« - +
  +
Opcode: 199 +
  +
Syntax: See Bindings for CopyModeToActiveMode +
  +
Description: Makes the mode loaded with ReadMode the active mode. Afterwards +it still has to be loaded with ResetScreen into the video controller. +
  +
Return value: None. +
  +
Availability: This function is only available if the driver for the +Crazy-Dots graphics card has been launched. +
  +
Gruppe: Crazy-Dots XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.7.6.1 Bindings for CopyModeToActiveMode

+ + + + + + +
C: void xbios( 199 ); +
  +
Assembler: +
  +
move.w    #199,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.7.7 ActiveModeNumber

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »ActiveModeNumber« - +
  +
Opcode: 200 +
  +
Syntax: See Bindings for ActiveModeNumber +
  +
Description: +
  +
Return value: Number of the current video mode. +
  +
Availability: This function is only available if the driver for the +Crazy-Dots graphics card has been launched. +
  +
Gruppe: Crazy-Dots XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.7.7.1 Bindings for ActiveModeNumber

+ + + + + + +
C: int16_t xbios( 200 ); +
  +
Assembler: +
  +
move.w    #200,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.7.8 GetActiveModeDesc

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »GetActiveModeDesc« - +
  +
Opcode: 201 +
  +
Syntax: See Bindings for GetActiveModeDesc +
  +
Description: +
  +
Return value: Pointer to the PMODE structure of the current graphics mode. +
  +
Availability: This function is only available if the driver for the +Crazy-Dots graphics card has been launched. +
  +
Gruppe: Crazy-Dots XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.7.8.1 Bindings for GetActiveModeDesc

+ + + + + + +
C: PMODE xbios( 201 ); +
  +
Assembler: +
  +
move.w    #201,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.7.9 GetRegisterbase

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »GetRegisterbase« - +
  +
Opcode: 202 +
  +
Syntax: See Bindings for GetRegisterbase +
  +
Description: +
  +
Return value: Base address of the Crazy-Dots registers. +
  +
Availability: This function is only available if the driver for the +Crazy-Dots graphics card has been launched. +
  +
Group: Crazy-Dots XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.7.9.1 Bindings for GetRegisterbase

+ + + + + + +
C: int32_t xbios( 202 ); +
  +
Assembler: +
  +
move.w    #202,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.7.10 GetFeatures

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »GetFeatures« - +
  +
Opcode: 203 +
  +
Syntax: Bindings for GetFeatures +
  +
Description: Returns information about installed Crazy-Dots extensions. +
  +
Return value: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
BitInstalled extension
0ECL interface (pixel clock to 140 MHz, monochrome)
1Genlock interface
212-bit pixels (4096 colours)
316-bit pixels (65536 colours)
424-bit pixels (TrueColor)
532-bit pixels (TrueColor + 8-bit overlay)
64-bit pixels (nibble mode, pixel clock to
  160 MHz, colour)
7-31Reserved
+
+ +
Availability: This function is only available if the driver for the +Crazy-Dots graphics card has been launched. +
  +
Group: Crazy-Dots XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.7.10.1 Bindings for GetFeatures

+ + + + + + +
C: int32_t xbios( 203 ); +
  +
Assembler: +
  +
move.w    #203,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.7.11 GetActiveFeatures

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »GetActiveFeatures« - +
  +
Opcode: 204 +
  +
Syntax: See Bindings for GetActiveFeatures +
  +
Description: Returns information about installed and active Crazy-Dots +extensions. +
  +
Return value: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
BitInstalled extension
0ECL interface (pixel clock to 140 MHz, monochrome)
1Genlock interface
212-bit pixels (4096 colours)
316-bit pixels (65536 colours)
424-bit pixels (TrueColor)
532-bit pixels (TrueColor + 8-bit overlay)
64-bit pixels (nibble mode, pixel clock to
  160 MHz, colour)
7-31Reserved
+
+ +
Availability: This function is only available if the driver for the +Crazy-Dots graphics card has been launched. +
  +
Group: Crazy-Dots XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.7.11.1 Bindings for GetActiveFeatures

+ + + + + + +
C: int32_t xbios( 204 ); +
  +
Assembler: +
  +
move.w    #204,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +
+ +Home +XBIOSXBIOS +CENTScreen XBIOS extensionCENTScreen XBIOS extension +CT60 XBIOS extensionCT60 XBIOS extension + + diff --git a/en/ct60.html b/en/ct60.html new file mode 100644 index 000000000..a05879bd5 --- /dev/null +++ b/en/ct60.html @@ -0,0 +1,595 @@ + + + + + +The documentation for TOS: CT60 XBIOS extension + + + + + + + + + +Home +XBIOSXBIOS +Crazy-Dots XBIOS extensionCrazy-Dots XBIOS extension +Date, Time and TimerDate, Time and Timer + +
+ +

4.8 CT60 XBIOS extension

+ + + + + + + + + + + + + + + +
ct60_cache Activate/deactivate the 68060 caches. +
ct60_flush_cache Flush 68060 Caches. +
ct60_read_core_temperature Read the temperature of the 68060. +
ct60_rw_parameter Read or write a parameter in flash Eprom. +
ct60_vmalloc Memory allocation (Radeon driver). + +
+ +

4.8.1 ct60_cache

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »ct60_cache« - Activate/deactivate the 68060 caches. +
  +
Opcode: 50700 (0xc60c) +
  +
Syntax: int32_t ct60_cache( int16_t cache_mode ); +
  +
Description: This XBIOS function is used to set or remove the 68060 caches +inside the patched version of General.cpx. +
  + + + + + + + + + +
Parameter Meaning +
    +
cache_mode  1 = Set the caches to on +
 0 = Remove the caches +
-1 = No change + +
+ +
Important: +
Please use the CacheCtrl function. +
  +
Return value: Returns CACR. +
  +
Availability: TOS 4.04 patched for CT60 hardware acceleration board +
  +
Group: CT60 XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.8.1.1 Bindings for ct60_cache

+ + + + + + +
C: int32_t ct60_cache( int16_t cache_mode ); +
  +
Assembler: +
  +
move.w    cache_mode,-(sp); Offset 2
+move.w    #$c60c,-(sp)    ; Offset 0
+trap      #14             ; call XBIOS
+addq.l    #4,sp           ; correct stack
+
+ +
+ +

4.8.2 ct60_flush_cache

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »ct60_flush_cache« - Flush 68060 Caches. +
  +
Opcode: 50701 (0xc60d) +
  +
Syntax: int32_t ct60_flush_cache( void ); +
  +
Description: This XBIOS function is used to flush the instruction and data +caches inside the patched version of Xcontrol. +
  +
Important: +
Please use the CacheCtrl function. +
  +
Return value: E_OK (0) +
  +
Availability: TOS 4.04 patched for CT60 hardware acceleration board +
  +
Group: CT60 XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.8.2.1 Bindings for ct60_flush_cache

+ + + + + + +
C: int32_t ct60_flush_cache( void ); +
  +
Assembler: +
  +
move.w    #$c60d,-(sp)    ; Offset 0
+trap      #14             ; call XBIOS
+addq.l    #2,sp           ; correct stack
+
+ +
+ +

4.8.3 ct60_read_core_temperature

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »ct60_read_core_temperature« - Read the 68060 temperature. +
  +
Opcode: 50698 (0xc60a) +
  +
Syntax: int32_t ct60_read_core_temperature( int16_t type_deg ); +
  +
Description: This XBIOS function reads the 68060 temperature. +
  + + + +
type_deg: CT60_CELCIUS    0 +
CT60_FARENHEIT  1 + +
+ +
Return value: The value or ERROR (-1) if there is a read error. +
  +
Availability: TOS 4.04 patched for CT60 hardware acceleration board. +
  +
Group: CT60 XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.8.3.1 Bindings for ct60_read_core_temperature

+ + + + + + +
C: int32_t ct60_read_core_temperature( int16_t type_deg ); +
  +
Assembler: +
  +
move.w    type_deg,-(sp)  ; Offset 2
+move.w    #$c60a,-(sp)    ; Offset 0
+trap      #14             ; call XBIOS
+addq.l    #4,sp           ; correct stack
+
+ +
+ +

4.8.4 ct60_rw_parameter

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »ct60_rw_parameter« -Read or change a parameter inside the +flash eprom. +
  +
Opcode: 50699 (0xc60b) +
  +
Syntax: int32_t ct60_rw_parameter( int16_t mode, int32_t type_param, +int32_t value ); +
  +
Description: This XBIOS function reads or changes a parameter inside the +flash eprom. The function returns the value. +
  + + + + + + +
mode CT60_MODE_READ (0) +
The value is read. +
  +
CT60_MODE_WRITE (1) +
The value is write. +
  +
type_param CT60_PARAM_TOSRAM (0) +
If the value is set to 1, the TOS is copied inside the SDRAM +during boot (PMMU used and cookie PMMU created). If the value is set +to 0, the TOS in flash eprom is used. +
  +
CT60_BLITTER_SPEED (1) +
If the value is set to 0, the blitter runs a 8/10 MHz. If the +value is set to 1, the blitter runs a 16/20 MHz. +
  +
CT60_CACHE_DELAY (2) +
If the bit 0 of the value is cleared, the Pexec function is normal +(flushes cache). +
If the bit 0 of the value is set, the caches are disabled for 5 +seconds when a program is started under TOS with the Pexec +function. +
If the bit 1 of the value is set, there are an Fread test and +maybe a copyback alert if the code begin by $601A. With this alert you +can remove the cache during 5 seconds. +
If the bit 1 of the value is cleared, there is no copyback alert. +
  +
CT60_BOOT_ORDER (3) +
New boot +
If the value is set to 0, TOS boots from SCSI drives (0-7) +before IDE drives (0-1). +
If the value is set to 1, TOS boots from IDE drives (0-1) +before SCSI drives (0-7). +
If the value is set to 2, TOS boots from SCSI drives (7-0) +before IDE drives (1-0). +
If the value is set to 3, TOS boots from IDE drives (1-0) +before SCSI drives (7-0). +
+
  +
Old boot +
If the value is set to 4, TOS boots from SCSI drives (0-7) +before IDE drives (0-1). +
If the value is set to 5, TOS boots from IDE drives (0-1) +before SCSI drives (0-7). +
If the value is set to 6, TOS boots from SCSI drives (7-0) +before IDE drives (1-0). +
If the value is set to 7, TOS boots from IDE drives (1-0) +before SCSI drives (7-0). +
+
  +
CT60_CPU_FPU (4) +
If the bit 0 of the value is cleared, the FPU is disabled. +
  +
CT60_BOOT_LOG (5) +
If the bit 0 is cleared, the stdout output of the AUTO folder +files is writed inside a boot.log on the boot drive. +
  +
CT60_VMODE (6) +
Boot extended modecode for CTPCI graphic card: F030 modecode + +extended bits: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HORFLAG0x200for double width
HORFLAG20x400for width increased
VESA_6000x800for SVGA 600
VESA_7680x1000for SVGA 768
VERTFLAG20x2000for double height
BPS325for True Color
+
+ +
CT60_SAVE_NVRAM_1 (7) +
CT60_SAVE_NVRAM_2 (8) +
CT60_SAVE_NVRAM_3 (9) +
Reserved for TOS NVM backup, do not use. +
  +
CT60_PARAM_OFFSET_TLV (10) +
value contains a signed offset in points. A point is equal +to 2.8 °C. +
  +
CT60_ABE_CODE (11) +
CT60_SDR_CODE (12) +
Reserved for save ABE/SDR versions, do not use. +
  +
CT60_CLOCK (13) +
CTPCM boot clock frequency in KHz (65000-110000) +
WARNING, if you increase frequency !!! +
  +
CT60_PARAM_CTPCI (14) +
If the bit 0 of the value is cleared, the TOS boot on the native +F030 IDE port. +
If the bit 0 of the value is set, the TOS boot n the CTPCI IDE +port who replaces the F030 at the same address. +
If the bit 1 of the value is cleared, the VDI not use the CTPCI +PLX DMA (slower for vro_cpyfm). +
If the bit 1 of the value is set, the VDI use the CTPCI PLX DMA +(faster for vro_cpyfm). +
  + +
+ +
Return value: The value or return: +
  + + + + + + + + + +
EBADRQ (-5) if the parameter is >=15. +
EWRITF (-10) for a write fault. +
EUNDEV (-15) if the flash device is not found. + +
+ +
Availability: TOS 4.04 patched for CT60 hardware acceleration board. +
  +
Group: CT60 XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.8.4.1 Bindings for ct60_rw_parameter

+ + + + + + +
C: int32_t ct60_rw_parameter( int16_t mode, int32_t type_param, +int32_t value ); +
  +
Assembler: +
  +
move.l    value,-(sp)     ; Offset 8
+move.l    type_param,-(sp); Offset 4
+move.w    mode,-(sp)      ; Offset 2
+move.w    #$c60b,-(sp)    ; Offset 0
+trap      #14             ; call XBIOS
+lea       12(sp),sp       ; correct stack
+
+ +
+ +

4.8.5 ct60_vmalloc

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »ct60_vmalloc« - Memory allocation (Radeon driver). +
  +
Opcode: 50702 (0xc60e) +
  +
Syntax: int32_t ct60_vmalloc( int16_t mode, int32_t value ) +
  +
Description: This function is used to allocate memory inside the offscreen +area. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
mode 
0value <=> malloc size, return address or null
 if memory full
 value = -1 => return bytes free ct60_vmalloc(0, -1L).
1value <=> address of previous malloc to free.
2null value for init. (normally never used excepted
 by radeon.sys or VsetScreen)
+
+ +
Return value: Returns address or null if memory full. +
  +
Attention! +
In all descriptions the return value is defined as int32_t. In +reality the value can be higher. Therefore a uint32_t is better. +
  +
Availability: Only valid with internal TOS Radeon driver (PCI.HEX). TOS +4.04 patched for CT60 hardware acceleration board (2007-01-24). +
Is also present if the Cookie SupV is there. +
  +
Group: CT60 XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.8.5.1 Bindings for ct60_vmalloc

+ + + + + + +
C: int32_t ct60_vmalloc( int16_t mode, int32_t value ); +
  +
Assembler: +
  +
move.l    value,-(sp)     ; Offset 4
+move.w    mode,-(sp)      ; Offset 2
+move.w    #$c60e,-(sp)    ; Offset 0
+trap      #14             ; call XBIOS
+addq.l    #8,sp           ; correct stack
+
+ +
+ +
+ +Home +XBIOSXBIOS +Crazy-Dots XBIOS extensionCrazy-Dots XBIOS extension +Date, Time and TimerDate, Time and Timer + + diff --git a/en/develop.html b/en/develop.html new file mode 100644 index 000000000..44ef84e66 --- /dev/null +++ b/en/develop.html @@ -0,0 +1,239 @@ + + + + + +The documentation for TOS: Development systems + + + + + + + + + +Home +Contents +The scancodeThe scancode +Literature for the TOS operating systemLiterature for the TOS operating system + +
+ +

C Development systems

+

The following list is a lineup of all programming languages and +development systems for TOS-compatible operating systems that I +know about. No claim is made for completeness. +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeNameManufacturer/Distributor
Application Builder• ACSproMaxon Computer GmbH
APL• APL.68000MicroAPL
Assembler• DevpacHiSoft, R.O.M. Software
 • Devpac-DSPHiSoft
 • DSPditCrac, TSCC
 • Easy RiderAndreas Borchard, Osnabrück
 • PureApplication Systems
 • TurboAssFreeware, Markus Fritze
Basic• GFA-BasicGFA, Richter Distributor
 • HiSoft-BasicHiSoft
 • Omikron-BasicOmikron
C• GNUFreely available (GNU licence)
 • LatticeHiSoft, R.O.M. Software
 • Mark Williams CMark Williams Company
 • PureApplication Systems
 • SozobonFreeware, Jerry Geiger
C++• GNUFreely available (GNU licence)
Fortran77+• Fortran for GEMProspero, Plünnecke
 • Fortran for TTProspero, Plünnecke
Functional languages• ClispFreeware, Michael Stoll
 • GoferMarc P. Jones
Modula-2• Hänisch-ModulaModular Systems, Würzburg
 • LPR-ModulaTechnische Uni München
 • MegamaxThomas Tempelmann
 • Modula-2/68Ana-Systems Inc.
 • TDI-ModulaModula/2 Soft
Oberon• STJ-Oberon-2Stephan Junker
Pascal• Maxon-PascalMaxon Computer GmbH
 • Pascal XSCNumerik Software GmbH
 • Pure PascalApplication Systems
 • ST-PascalCCD, Walluf
RCS• Interfaceno|Software
 • ORCSFreeware, Thorsten Otto
 • ResourceMasterArmin Diedering
+
+ +

See also: Literature   Appendix +

+
+ +Home +Contents +The scancodeThe scancode +Literature for the TOS operating systemLiterature for the TOS operating system + + diff --git a/en/edit.html b/en/edit.html new file mode 100644 index 000000000..03c74c08a --- /dev/null +++ b/en/edit.html @@ -0,0 +1,4479 @@ + + + + + +The documentation for TOS: Editable object functions + + + + + + + + + +Home +AESAES +Print dialogsPrint dialogs +Event libraryEvent library + +
+ +

8.6 Editable object functions

+

This library makes functions available to undertake editing +operations on an editable object. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
edit_close Closes editable object +
edit_create Creates a new editable object +
edit_cursor Switches edit cursor on/off +
edit_delete Removes editable object +
edit_evnt Processes editable object +
edit_get_buf Examines settings: Text buffer +
edit_get_colour Examines settings: Colours +
edit_get_cursor Examines settings: Absolute cursor position +
edit_get_dirty Examines settings: Dirty flag +
edit_get_font Examines settings: Font +
edit_get_format Examines settings: Formating +
edit_get_pos Examines settings: Position +
edit_get_scrollinfo Examines settings: Scroll information +
edit_get_sel Examines settings: Selected region +
edit_open Opens editable object +
edit_resized Alters settings: Object size +
edit_scroll Alters settings: Scroll positions +
edit_set_buf Alters settings: Text buffer +
edit_set_colour Alters settings: Colours +
edit_set_cursor Alters settings: Absolute positioning of cursor +
edit_set_dirty Alters settings: Dirty flag +
edit_set_font Alters settings: Font +
edit_set_format Alters settings: Formating +
edit_set_pos   + +
+ +

Hint: The editable object is available from MagiC 5.20 +onwards. As it is implemented as part of the shared library (SLB or +SharedLib), one only needs to open the library with: +

+

Slbopen("EDITOBJC.SLB", NULL, 0L, &slb, +&slbexec); +

+

The library installs a new AES object-type G_EDIT. +

+

See also: Using G_EDIT objects   AES   GEM   Object functions +

+

8.6.1 edit_close

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Edit Object Close« - Close editable object +
  +
Opcode: 212 +
  +
Syntax: void edit_close ( OBJECT *tree, int16_t obj ); +
  +
Description: The call edit_close closes size-dependent management structures +of an object and releases the memory used. The descriptor itself, +though, will be preserved. Text management is now no longer possible. +The following apply: +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
treeRSC-tree of object
objObject index
+
+ +
Return value: The function does not return a result. +
  +
Availability: As of MagiC 5.20 by means of a shared library. +
  +
Group: Editable object functions +
  +
See also: Binding +
  + +
+ +

8.6.1.1 Bindings for edit_close

+ + + + + + + + + +
C: void edit_close ( OBJECT *tree, int16_t obj ); +
  +
Binding: +
  +
void edit_close ( OBJECT *tree, int16_t obj )
+{
+   int_in[0] = obj;
+
+   addr_in[0] = tree;
+
+   return ( crys_if(212) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]212 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]obj
addr_inaddr_in[0]tree
+
+ + +
+ +

8.6.2 edit_create

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Edit Object Create« - Create editable object +
  +
Opcode: 210 +
  +
Syntax: void *edit_create ( void ) +
  +
Description: The call edit_create creates a corresponding descriptor (memory +is reserved), but the editor will not be opened yet. One can now alter +several settings with one of the edit_set_xxx functions. The default +settings are: +
  +
System font, 10 pt +
Black on white +
No line wrap +
Tabulator width 64 pixels +
  +
Return value: Returns a descriptor for any further actions, or NULL if an +error has occurred (not enough memory). The descriptor must be entered +as ob_spec into the object. +
  +
Availability: As of MagiC 5.20 by means of a shared library. +
  +
Group: Editable object functions +
  +
See also: Binding +
  + +
+ +

8.6.2.1 Bindings for edit_create

+ + + + + + + + + +
C: void *edit_create ( void ) +
  +
Binding: +
  +
void *edit_create ( void )
+{
+    crys_if(210);
+
+    return ( addr_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]210 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]1 # Entry in addr_out
addr_outaddr_out[0]Return value
+
+ + +
+ +

8.6.3 edit_cursor

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Edit object cursor« - Edit cursor on/off. +
  +
Opcode: 214 +
  +
Syntax: int16_t edit_cursor ( OBJECT *tree, int16_t obj, int16_t whdl, +int16_t show ); +
  +
Description: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
tree RSC-tree of object +
obj Object index +
whdl Window handle or -1 +
show The cursor is switched on (show == 1), switched off (show == 0) +or examined (show == -1). + +
+ +
The call can be nested. +
  +
Return value: Return value is the cursor-off counter. +
  +
Availability: As of MagiC 5.20 by means of a shared library. +
  +
Group: Editable object functions +
  +
See also: Binding +
  + +
+ +

8.6.3.1 Bindings for edit_cursor

+ + + + + + + + + +
C: int16_t edit_cursor ( OBJECT *tree, int16_t obj, int16_t whdl, +int16_t show ); +
  +
Binding: +
  +
int16_t edit_cursor ( OBJECT *tree, int16_t obj, int16_t whdl,
+                   int16_t show )
+{
+   addr_in[0] = tree;
+
+   int_in[0]  = obj;
+   int_in[1]  = whdl;
+   int_in[2]  = show;
+
+   crys_if( 214 );
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]214 # Function opcode
control+2control[1]3 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]obj
int_in+2int_in[1]whdl
int_in+2int_in[2]show
addr_inaddr_in[0]tree
int_outint_out[0]Return value
+
+ + +
+ +

8.6.4 edit_delete

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Edit Object Delete« - Remove editable object +
  +
Opcode: 213 +
  +
Syntax: void edit_delete ( void *editinfo ); +
  +
Description: The call edit_delete releases the descriptor editinfo. +If the object is to be used further then the object type has to be +placed back on G_BOX. +
  +
Return value: The function does not return a result. +
  +
Availability: As of MagiC 5.20 by means of a shared library. +
  +
Group: Editable object functions +
  +
See also: Binding +
  + +
+ +

8.6.4.1 Bindings for edit_delete

+ + + + + + + + + +
C: void edit_delete ( void *editinfo ); +
  +
Binding: +
  +
void edit_delete ( void *editinfo )
+{
+   addr_in[0] = editinfo;
+
+   crys_if( 213 );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]213 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]editinfo
+
+ + +
+ +

8.6.5 edit_evnt

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Edit object event« - Process editable object +
  +
Opcode: 215 +
  +
Syntax: int16_t edit_evnt ( OBJECT *tree, int16_t obj, int16_t whdl, +EVNT *events, int32_t *errcode ); +
  +
Description: The call edit_evnt causes events, i.e. mouse clicks and key +presses, to be forwarded to the editable object and processed by it if +appropriate. When an event has been processed, the corresponding bit +in the EVENT structure is cleared. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
tree RSC-tree of object +
obj Object index +
whdl Window handle or -1 +
events EVENT structure as for wdlg_evnt, fnts_evnt; the events are +processed by the dialog if they are intended for the associated window +
errcode Error code (-200 = text buffer full) + +
+ +
Return value: The function returns the value 0 in case of error. The exact +error-code in this case is stored in the variable errcode. +
  +
Availability: As of MagiC 5.20 by means of a shared library. +
  +
Group: Editable object functions +
  +
See also: Binding   Keyboard codes +
  + +
+ +

8.6.5.1 Bindings for edit_evnt

+ + + + + + + + + +
C: int16_t edit_evnt ( OBJECT *tree, int16_t obj, int16_t whdl, +EVNT *events, int32_t *errcode ); +
  +
Binding: +
  +
int16_t edit_evnt ( OBJECT *tree, int16_t obj, int16_t whdl,
+                 EVNT *events, int32_t *errcode )
+{
+   int_in[0]  = obj;
+   int_in[1]  = whdl;
+
+   addr_in[0] = tree;
+   addr_in[1] = events;
+
+   int_out[1] = 0;          /* für alte SLB */
+   int_out[2] = 0;          /* für alte SLB */
+
+   crys_if( 215 )
+
+   *errcode = int_out[1..2];
+
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]215 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]3 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]obj
int_in+2int_in[1]whdl
addr_inaddr_in[0]tree
addr_in+4addr_in[1]events
int_outint_out[0]Return value
int_out+2int_out[1..2]errcode
+
+ + +
+ +

The error-code errcode is present only as of Version 7 +of the SLB; the binding in MT_AES ensures that old SLB versions always +return NULLs. Vice versa, the new SLB versions recognize via contrl[2] +whether an error-code was requested. +

+

8.6.6 edit_get_buf

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Edit Object Get Buffer« - Examine settings: Text buffer +
  +
Opcode: 216 (sub-opcode 0) +
  +
Syntax: int16_t edit_get_buf ( OBJECT *tree, int16_t obj, int8_t **buf, +int32_t *buflen, int32_t *txtlen ); +
  +
Description: The call edit_get_buf obtains the settings of the text buffer. +The following apply: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
treeRSC-tree of object
objObject index
bufAddress of buffer
buflenBuffer length
txtlenCurrent text length without EOS
+
+ +
Return value: 0 for error, else 1 +
  +
Availability: As of MagiC 5.20 by means of a shared library. +
  +
Group: Editable object functions +
  +
See also: Binding +
  + +
+ +

8.6.6.1 Bindings for edit_get_buf

+ + + + + + + + + +
C: int16_t edit_get_buf ( OBJECT *tree, int16_t obj, int8_t **buf, +int32_t *buflen, int32_t *txtlen ); +
  +
Binding: +
  +
int16_t edit_get_buf ( OBJECT *tree, int16_t obj,
+                       int8_t **buf,
+                       int32_t *buflen, int32_t *txtlen )
+{
+   int_in[0]  = obj;
+   int_in[1]  = 0;      /* Sub-opcode for function */
+
+   addr_in[0] = tree;
+
+   crys_if( 216 );
+
+   *buflen = int_out[1..2];
+   *txtlen = int_out[3..4];
+
+   *buf = addr_out[0];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]216 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]5 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]1 # Entry in addr_out
int_inint_in[0]obj
int_in+2int_in[1]0 # Sub-opcode
addr_inaddr_in[0]tree
int_outint_out[0]Return value
int_out+2int_out[1..2]buflen
int_out+6int_out[3..4]txtlen
addr_outaddr_out[0]buf
+
+ + +
+ +

8.6.7 edit_get_colour

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Edit Object Get Colour« - Examine settings: Colours +
  +
Opcode: 216 (sub-opcode 2) +
  +
Syntax: int16_t edit_get_colour ( OBJECT *tree, int16_t obj, int16_t +*tcolour, int16_t *bcolour ); +
  +
Description: The call edit_get_colour obtains the colour of an object. The +following apply: +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
treeRSC-tree of object
objObject index
tcolourText colour
bcolourBackground colour
+
+ +
Return value: The function returns the value 1 on successful execution, else +the value 0 in case of error. +
  +
Availability: As of MagiC 5.20 by means of a shared library. +
  +
Group: Editable object functions +
  +
See also: Binding +
  + +
+ +

8.6.7.1 Bindings for edit_get_colour

+ + + + + + + + + +
C: int16_t edit_get_colour ( OBJECT *tree, int16_t obj, int16_t +*tcolour, int16_t *bcolour ); +
  +
Binding: +
  +
int16_t edit_get_colour ( OBJECT *tree, int16_t obj,
+                          int16_t *tcolour, int16_t  *bcolour )
+{
+   int_in[0]  = obj;
+   int_in[1]  = 2;      /* Sub-opcode for function */
+
+   addr_in[0] = tree;
+
+   crys_if( 216 );
+
+   *tcolour = int_out[1];
+   *bcolour = int_out[2];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]216 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]3 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]obj
int_in+2int_in[1]2 # Sub-opcode
addr_inaddr_in[0]tree
int_outint_out[0]Return value
int_out+2int_out[1]tcolour
int_out+4int_out[2]bcolour
+
+ + +
+ +

8.6.8 edit_get_cursor

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Edit Object Get Cursor« - Examine settings: Absolute cursor +position +
  +
Opcode: 216 (sub-opcode 4) +
  +
Syntax: int16_t edit_get_cursor ( OBJECT *tree, int16_t obj, int8_t +**cursorpos ); +
  +
Description: The call edit_get_cursor obtains the absolute position of the +cursor in the text of an editable object. The following apply: +
  +

+
+ + + + + + + + + + + + + + + + +
ParameterMeaning
treeRSC-tree of object
objObject index
cursorposCursor position in text
+
+ +
Return value: 0 for error, else 1 +
  +
Availability: As of MagiC 5.20 by means of a shared library. +
  +
Group: Editable object functions +
  +
See also: Binding +
  + +
+ +

8.6.8.1 Bindings for edit_get_cursor

+ + + + + + + + + +
C: int16_t edit_get_cursor ( OBJECT *tree, int16_t obj, int8_t +**cursorpos ); +
  +
Binding: +
  +
int16_t edit_get_cursor ( OBJECT *tree, int16_t obj,
+                          int8_t **cursorpos )
+{
+   int_in[0]  = obj;
+   int_in[1]  = 4;      /* Sub-opcode for function */
+
+   addr_in[0] = tree;
+
+   crys_if( 216 );
+
+   *cursorpos = addr_out[0];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]216 # Function Opcode
control+2control[1]2 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]1 # Entry in addr_out
int_inint_in[0]obj
int_in+2int_in[1]4 # Sub-opcode
addr_inaddr_in[0]tree
int_outint_out[0]Return value
addr_outaddr_out[0]cursorpos
+
+ + +
+ +

8.6.9 edit_get_dirty

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Edit Object Get Dirtyflag« - Examine settings: Dirty flag +
  +
Opcode: 216 (sub-opcode 7) +
  +
Syntax: int16_t edit_get_dirty ( OBJECT *tree, int16_t obj ); +
  +
Description: The call edit_get_dirty lets one ascertain whether the text was +altered in the meantime. The flag can be cleared again with +edit_set_dirty or edit_set_buf. The following apply: +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
treeRSC-tree of object
objObject index
+
+ +
Return value: The function returns the value 1 if the text was changed else +0. +
  +
Availability: As of MagiC 5.20 by means of a shared library. +
  +
Group: Editable object functions +
  +
See also: Binding +
  + +
+ +

8.6.9.1 Bindings for edit_get_dirty

+ + + + + + + + + +
C: int16_t edit_get_dirty ( OBJECT *tree, int16_t obj ); +
  +
Binding: +
  +
int16_t edit_get_dirty ( OBJECT *tree, int16_t obj )
+{
+   int_in[0]  = obj;
+   int_in[1]  = 7;      /* Sub-opcode for function */
+
+   addr_in[0] = tree;
+
+   crys_if( 216 );
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]216 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]obj
int_in+2int_in[1]7 # Sub-opcode
addr_inaddr_in[0]tree
int_outint_out[0]Return value
+
+ + +
+ +

8.6.10 edit_get_font

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Edit Object Get Font« - Examine settings: Font +
  +
Opcode: 216 (sub-opcode 3) +
  +
Syntax: int16_t edit_get_font ( OBJECT *tree, int16_t obj, int16_t +*fontID, int16_t *fontH, int16_t *fontPix, int16_t *mono ); +
  +
Description: The call edit_get_font obtains information about the ID, size +and type of font used in an editable object. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
tree RSC-tree of object +
obj Object index +
fontID Font ID +
fontH Height for vst_point +
fontPix 0=points, 1=pixels +
(available as of version 8 (3.5.98) of the SLB) +
mono Flag for equidistant font + +
+ +
Return value: The function returns the value 1 on successful execution, else +the value 0 in case of error. +
  +
Availability: As of MagiC 5.20 by means of a shared library. +
  +
Group: Editable object functions +
  +
See also: Binding +
  + +
+ +

8.6.10.1 Bindings for edit_get_font

+ + + + + + + + + +
C: int16_t edit_get_font ( OBJECT *tree, int16_t obj, int16_t +*fontID, int16_t *fontH, int16_t *fontPix, int16_t *mono ); +
  +
Binding: +
  +
int16_t edit_get_font ( OBJECT *tree, int16_t obj,
+                        int16_t *fontID, int16_t *fontH,
+                        int16_t *fontPix, int16_t *mono )
+{
+   int_in[0]  = obj;
+   int_in[1]  = 3;      /* Sub-opcode for function */
+
+   addr_in[0] = tree;
+
+   int_out[4] = 0;      /* for old SLB         */
+
+   crys_if( 216 );
+
+   *fontID  = int_out[1];
+   *fontH   = int_out[2];
+   *mono    = int_out[3];
+   *fontPix = int_out[4];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]216 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]5 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]obj
int_in+2int_in[1]3 # Sub-opcode
addr_inaddr_in[0]tree
int_outint_out[0]Return value
int_out+2int_out[1]fontID
int_out+4int_out[2]fontH
int_out+6int_out[3]mono
int_out+8int_out[4]fontPix
+
+ + +
+ +

8.6.11 edit_get_format

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Edit Object Get Format« - Examine settings: Formating +
  +
Opcode: 216 (sub-opcode 1) +
  +
Syntax: int16_t edit_get_format ( OBJECT *tree, int16_t obj, int16_t +*tabwidth, int16_t *autowrap ); +
  +
Description: The call edit_get_format obtains information about the +formatting of text in an editable object. The following apply: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
tree RSC-tree of object +
obj Object index +
tabwidth Tabulator width +
autowrap > 0: Pixel width for auto line wrap (generally == object +width) +
= 0: No wrapping, but horiz. scrolling + +
+ +
Return value: 0 for error, else 1 +
  +
Availability: As of MagiC 5.20 by means of a shared library. +
  +
Group: Editable object functions +
  +
See also: Binding +
  + +
+ +

8.6.11.1 Bindings for edit_get_format

+ + + + + + + + + +
C: int16_t edit_get_format ( OBJECT *tree, int16_t obj, int16_t +*tabwidth, int16_t *autowrap ); +
  +
Binding: +
  +
int16_t edit_get_format ( OBJECT *tree, int16_t obj,
+                          int16_t *tabwidth,
+                          int16_t *autowrap )
+{
+   int_in[0]  = obj;
+   int_in[1]  = 1;      /* Sub-opcode für Funktion */
+
+   addr_in[0] = tree;
+
+   crys_if( 216 );
+
+   *tabwidth  = int_out[1];
+   *autowrap  = int_out[2];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]216 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]3 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]obj
int_in+2int_in[1]1 # Sub-opcode
addr_inaddr_in[0]tree
int_outint_out[0]Return value
int_out+2int_out[1]tabwidth
int_out+4int_out[2]autowrap
+
+ + +
+ +

8.6.12 edit_get_pos

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Edit Object Get ?« - Obtain important information about an +editable object.? +
  +
Opcode: 216 (sub-opcode 5) +
  +
Syntax: void edit_get_pos ( OBJECT *tree, int16_t obj, int16_t +*xscroll, int32_t *yscroll, int8_t **cyscroll, int8_t **cursorpos, +int16_t *cx, int16_t *cy ); +
  +
Description: Exactly what the function edit_get_pos does is not known, as it +only turns up in the binding mt_edit.c. From the parameters it seems +to obtain information about cursor position and scrolling functions in +an editable object. The following apply: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
treeRSC-tree of object
objObject index
xscroll 
yscroll 
cyscroll 
cursorpos 
cx 
cy 
+
+ +
Return value: The function does not return a result. +
  +
Availability: As of MagiC 5.20 by means of a shared library. +
  +
Group: Editable object functions +
  +
See also: Binding +
  + +
+ +

8.6.12.1 Bindings for edit_get_pos

+ + + + + + + + + +
C: void edit_get_pos ( OBJECT *tree, int16_t obj, int16_t +*xscroll, int32_t *yscroll, int8_t **cyscroll, int8_t **cursorpos, +int16_t *cx, int16_t *cy ); +
  +
Binding: +
  +
void edit_get_pos ( OBJECT *tree, int16_t obj,
+                    int16_t *xscroll, int32_t *yscroll,
+                    int8_t **cyscroll, int8_t **cursorpos,
+                    int16_t *cx, int16_t *cy )
+{
+   int_in[0]  = obj;
+   int_in[1]  = 5;      /* Sub-opcode for function */
+
+   addr_in[0] = tree;
+
+   crys_if( 216 );
+
+   *xscroll = int_out[1];
+   *yscroll = int_out[2..3];
+   *cx      = int_out[4];
+   *cy      = int_out[5];
+
+   *cyscroll  = addr_out[0];
+   *cursorpos = addr_out[1];
+
+   return;
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]216 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]6 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]2 # Entry in addr_out
int_inint_in[0]obj
int_in+2int_in[1]5 # Sub-opcode
addr_inaddr_in[0]tree
int_outint_out[0]undefined
int_out+2int_out[1]xscroll
int_out+4int_out[2..3]yscroll
int_out+8int_out[4]cx
int_out+10int_out[5]cy
addr_outaddr_out[0]cyscroll
addr_out+4addr_out[1]cursorpos
+
+ + +
+ +

8.6.13 edit_get_scrollinfo

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Edit Object Get Scrollinformation« - Examine settings: +Scroll information +
  +
Opcode: 216 (sub-opcode 9) +
  +
Syntax: void edit_get_scrollinfo ( OBJECT *tree, int16_t obj, int32_t +*nlines, int32_t *yscroll, int16_t *yvis, int16_t *yval, int16_t +*ncols, int16_t *xscroll, int16_t *xvis ); +
  +
Description: The call edit_get_scrollinfo obtains information about +scrollable text capabilities in an editable object. The following +apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
tree RSC-tree of object +
obj Object index +
nlines Number of lines in text +
yscroll First visible line +
yvis Number of max. visible lines +
yval Number of currently visible lines +
ncols Number of columns, or -1 (unknown) +
xscroll Horizontal scroll offset in pixels +
xvis Number of visible columns (in pixels) + +
+ +
This information is required in order to set the horizontal and +vertical scroll bars. As the editable object would have to make a +vq_extend for each individual line, actually at each alteration of a +line, the number of columns is currently not defined and the call +returns -1. +
MGEDIT here simply assumes a fixed width, in the same way as other +programs e.g. VIEW.PRG and PC.PRG do as well. yval is always +smaller or equal to yvis. If the text has fewer lines that +yvis, then yval is always smaller. +
  +
Return value: The function does not return a result. +
  +
Availability: As of MagiC 5.20 by means of a shared library. +
  +
Group: Editable object functions +
  +
See also: Binding +
  + +
+ +

8.6.13.1 Bindings for edit_get_scrollinfo

+ + + + + + + + + +
C: void edit_get_scrollinfo ( OBJECT *tree, int16_t obj, int32_t +*nlines, int32_t *yscroll, int16_t *yvis, int16_t *yval, int16_t +*ncols, int16_t *xscroll, int16_t *xvis ); +
  +
Binding: +
  +
void edit_get_scrollinfo ( OBJECT *tree, int16_t obj,
+                           int32_t *nlines, int32_t *yscroll,
+                           int16_t *yvis, int16_t *yval,
+                           int16_t *ncols, int16_t *xscroll,
+                           int16_t *xvis )
+{
+   int_in[0]  = obj;
+   int_in[1]  = 9;      /* Sub-opcode for function */
+
+   addr_in[0] = tree;
+
+   crys_if( 216 );
+
+   *nlines   = int_out[1..2];
+   *yscroll  = int_out[3..4];
+   *yvis     = int_out[5];
+   *yval     = int_out[6];
+   *ncols    = int_out[7];
+   *xscroll  = int_out[8];
+   *xvis     = int_out[9];
+
+   return;
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]216 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]10 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]obj
int_in+2int_in[1]9 # Sub-opcode
addr_inaddr_in[0]tree
int_outint_out[0]undefined
int_out+2int_out[1..2]nlines
int_out+6int_out[3..4]yscroll
int_out+10int_out[5]yvis
int_out+11int_out[6]yval
int_out+12int_out[7]ncols
int_out+13int_out[8]xscroll
int_out+14int_out[9]xvis
+
+ +
In mt_edit.c is control[2] set with 6 (?). +
  + +
+ +

8.6.14 edit_get_sel

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Edit Object Get Selection« - Examine settings: Selected +region +
  +
Opcode: 216 (sub-opcode 8) +
  +
Syntax: void edit_get_sel ( OBJECT *tree, int16_t obj, int8_t **bsel, +int8_t **esel ); +
  +
Description: The call edit_get_sel obtains information about a selected +region in an editable object. The following apply: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
tree RSC-tree of object +
obj Object index +
bsel Start of selected region +
esel After the end of the selected region + +
+ +
If no region is selected then bsel == NULL. +
  +
Return value: The function returns the value 1 on successful execution, else +the value 0 in case of error. +
  +
Availability: As of MagiC 5.20 by means of a shared library. +
  +
Group: Editable object functions +
  +
See also: Binding +
  + +
+ +

8.6.14.1 Bindings for edit_get_sel

+ + + + + + + + + +
C: void edit_get_sel ( OBJECT *tree, int16_t obj, int8_t **bsel, +int8_t **esel ); +
  +
Binding: +
  +
void edit_get_sel ( OBJECT *tree, int16_t obj,
+                    int8_t **bsel, int8_t **esel )
+{
+   int_in[0]  = obj;
+   int_in[1]  = 8;      /* Sub-opcode for function */
+
+   addr_in[0] = tree;
+
+   crys_if( 216 );
+
+   *bsel  = addr_out[0];
+   *esel  = addr_out[1];
+
+   return;
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]216 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]2 # Entry in addr_out
int_inint_in[0]obj
int_in+2int_in[1]8 # Sub-opcode
addr_inaddr_in[0]tree
addr_outaddr_out[0]bsel
addr_out+4addr_out[1]esel
+
+ +
In the original documentation this function is defined with an +int16_t return value; however in mt_edit.c this is given as void. +
  + +
+ +

8.6.15 edit_open

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Edit Object Open« - Open editable object +
  +
Opcode: 211 +
  +
Syntax: int16_t edit_open ( OBJECT *tree, int16_t obj ); +
  +
Description: The call edit_open opens an editable object. The following +apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
tree RSC-tree of object +
obj Object index + +
+ +
The number of lines and columns of text visible for the object +size is calculated, and corresponding pointers are created. Memory is +then requested for it. +
  +
Return value: The function returns the value 1 on successfull execution, else +the value 0 in case of error. +
  +
Availability: As of MagiC 5.20 by means of a shared library. +
  +
Group: Editable object functions +
  +
See also: Binding +
  + +
+ +

8.6.15.1 Bindings for edit_open

+ + + + + + + + + +
C: int16_t edit_open ( OBJECT *tree, int16_t obj ); +
  +
Binding: +
  +
int16_t edit_open ( OBJECT *tree, int16_t obj )
+{
+   int_in[0]  = obj;
+
+   addr_in[0] = tree;
+
+   crys_if( 211 );
+
+   return ( int_out [0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]211 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]obj
addr_inaddr_in[0]tree
int_outint_out[0]Return value
+
+ + +
+ +

8.6.16 edit_resized

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Edit Object Resized« - Alter settings: Object size +
  +
Opcode: 217 (sub-opcode 6) +
  +
Syntax: int16_t edit_resized ( OBJECT *tree, int16_t obj, int16_t +*oldrh, int16_t *newrh ); +
  +
Description: The call edit_resized alters the height of an editable object. +The following apply: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
tree RSC-tree of object +
obj Object index +
oldrh Old net height of object +
newrh New net height of object + +
+ +
For changes of the object size the editable object must release +and reserve memory. Thus it is possible that in extreme circumstances +the operation fails due to a shortage of memory. In that case the +return value is 0. So that the calling program can execute a correct +redraw, the previous and new actual height is returned. In fact it +means here the number of visible lines multiplied by the line height, +i.e. the object height without the unused bottom white border. +
  +
Return value: 1 (OK) or 0 (error) +
  +
Availability: As of MagiC 5.20 by means of a shared library. +
  +
Group: Editable object functions +
  +
See also: Binding +
  + +
+ +

8.6.16.1 Bindings for edit_resized

+ + + + + + + + + +
C: int16_t edit_resized ( OBJECT *tree, int16_t obj, int16_t +*oldrh, int16_t *newrh ); +
  +
Binding: +
  +
int16_t edit_resized ( OBJECT *tree, int16_t obj,
+                       int16_t *oldrh, int16_t *newrh )
+{
+   int_in[0]  = obj;
+   int_in[1]  = 6;      /* Sub-opcode for function */
+
+   addr_in[0] = tree;
+
+   crys_if( 217 );
+
+   *oldrh = int_out[1];
+   *newrh = int_out[2];
+
+   return ( int_out [0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]217 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]3 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]obj
int_in+2int_in[1]6 # Sub-opcode
addr_inaddr_in[0]tree
int_outint_out[0]Return value
int_out+2int_out[1]oldrh
int_out+4int_out[4]newrh
+
+ + +
+ +

8.6.17 edit_scroll

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Edit Object Scroll« - Alter settings: Scroll positions +
  +
Opcode: 217 (sub-opcode 9) +
  +
Syntax: int16_t edit_scroll ( OBJECT *tree, int16_t obj, int16_t whdl, +int32_t yscroll, int16_t xscroll ); +
  +
Description: The call edit_scroll is used for altering the scroll position +in an editable object. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
tree RSC-tree of object +
obj Object index +
whdl Window handle or -1 +
yscroll Vertical scroll offset in lines +
xscroll Horizontal scroll offset in pixels + +
+ +
With this one scrolls horizontally and vertically absolutely. +This call is required when a scroll bar or arrow has been clicked on. +The window handle is required so that the rectangle list is taken into +consideration during scrolling. +
  +
An error-code will be returned if the number of lines has been +exceeded. +
  +
Return value: 1 (OK) or 0 (Error) +
  +
Availability: As of MagiC 5.20 by means of a shared library. +
  +
Group: Editable object functions +
  +
See also: Binding +
  + +
+ +

8.6.17.1 Bindings for edit_scroll

+ + + + + + + + + +
C: int16_t edit_scroll ( OBJECT *tree, int16_t obj, int16_t whdl, +int32_t yscroll, int16_t xscroll ); +
  +
Binding: +
  +
int16_t edit_scroll ( OBJECT *tree, int16_t obj, int16_t whdl,
+                      int32_t yscroll, int16_t xscroll )
+{
+   int_in[0]    = obj;
+   int_in[1]    = 9;      /* Sub-opcode for function */
+   int_in[2]    = whdl;
+   int_in[3..4] = yscroll;
+   int_in[5]    = xscroll;
+
+   addr_in[0] = tree;
+
+   crys_if( 217 );
+
+   return ( int_out [0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]217 # Function opcode
control+2control[1]6 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]obj
int_in+2int_in[1]9 # Sub-opcode
int_in+4int_in[2]whdl
int_in+6int_in[3..4]yscroll
int_in+10int_in[5]xscroll
addr_inaddr_in[0]tree
int_outint_out[0]Return value
+
+ + +
+ +

8.6.18 edit_set_buf

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Edit Object Set Buffer« - Alter settings: Text buffer +
  +
Opcode: 217 (sub-opcode 0) +
  +
Syntax: void edit_set_buf ( OBJECT *tree, int16_t obj, int8_t *buf, +int32_t buflen ); +
  +
Description: The call edit_set_buf is used to alter the settings of the text +buffer for an editable object. The following apply: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
tree Object tree +
obj Object index +
buf Text buffer. The text is present in DOS format with CR/LF as +line-end identifier and is terminated by a Nullbyte. +
buflen Length of text buffer inclusive of closing Nullbyte. + +
+ +
The buffer is allocated to the text object, the number of lines +are determined. The cursor is set to the start of the text. This call +clears the Dirty flag. +
  +
Return value: The function does not return a result. +
  +
Availability: As of MagiC 5.20 by means of a shared library. +
  +
Group: Editable object functions +
  +
See also: Binding +
  + +
+ +

8.6.18.1 Bindings for edit_set_buf

+ + + + + + + + + +
C: void edit_set_buf ( OBJECT *tree, int16_t obj, int8_t *buf, +int32_t buflen ); +
  +
Binding: +
  +
void edit_set_buf ( OBJECT *tree, int16_t obj, int8_t *buf,
+                    int32_t buflen )
+{
+   int_in[0]    = obj;
+   int_in[1]    = 0;      /* Sub-opcode for function */
+   int_in[2..3] = buflen;
+
+   addr_in[0] = tree;
+   addr_in[1] = buf;
+
+   crys_if( 217 );
+
+   return;
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]217 # Function opcode
control+2control[1]4 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]obj
int_in+2int_in[1]0 # Sub-opcode
int_in+4int_in[2..3]buflen
addr_inaddr_in[0]tree
addr_in+4addr_in[1]buf
+
+ + +
+ +

8.6.19 edit_set_colour

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Edit Object Set Colour« - Alter settings: Colours +
  +
Opcode: 217 (sub-opcode 2) +
  +
Syntax: void edit_set_colour ( OBJECT *tree, int16_t obj, int16_t +tcolour, int16_t bcolour ); +
  +
Description: The call edit_set_colour is used to alter the colours in an +editable object. The following apply: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
tree Object tree +
obj Object index +
tcolour Text colour +
bcolour Background colour + +
+ +
If one of the two attributes is to remain unchanged then -1 can +be passed. +
  +
If the editable object was opened previously, then one should +generally trigger a redraw when changing one of the attributes. +
  +
Return value: The function does not return a result. +
  +
Availability: As of MagiC 5.20 by means of a shared library. +
  +
Group: Editable object functions +
  +
See also: Binding +
  + +
+ +

8.6.19.1 Bindings for edit_set_colour

+ + + + + + + + + +
C: void edit_set_colour ( OBJECT *tree, int16_t obj, int16_t +tcolour, int16_t bcolour ); +
  +
Binding: +
  +
void edit_set_colour ( OBJECT *tree, int16_t obj,
+                       int16_t tcolour, int16_t bcolour )
+{
+   int_in[0]  = obj;
+   int_in[1]  = 2;      /* Sub-opcode for function */
+   int_in[2]  = tcolour;
+   int_in[3]  = bcolour;
+
+   addr_in[0] = tree;
+
+   crys_if( 217 );
+
+   return;
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]217 # Function opcode
control+2control[1]4 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]obj
int_in+2int_in[1]2 # Sub-opcode
int_in+4int_in[2]tcolour
int_in+6int_in[3]bcolour
addr_inaddr_in[0]tree
+
+ + +
+ +

8.6.20 edit_set_cursor

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Edit Object Set Cursor« - Alter settings: Absolute +positioning of cursor +
  +
Opcode: 217 (sub-opcode 4) +
  +
Syntax: void edit_set_cursor ( OBJECT *tree, int16_t obj, int8_t +*cursorpos ); +
  +
Description: The call edit_set_cursor sets the absolute position of the +cursor in an editable object. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
tree Object tree +
obj Object index +
cursorpos Absolute cursor position + +
+ +
Return value: The function does not return a result. +
  +
Availability: As of MagiC 5.20 by means of a shared library. +
  +
Group: Editable object functions +
  +
See also: Binding +
  + +
+ +

8.6.20.1 Bindings for edit_set_cursor

+ + + + + + + + + +
C: void edit_set_cursor ( OBJECT *tree, int16_t obj, int8_t +*cursorpos ); +
  +
Binding: +
  +
void edit_set_cursor ( OBJECT *tree, int16_t obj,
+                       int8_t *cursorpos )
+{
+   int_in[0]  = obj;
+   int_in[1]  = 4;      /* Sub-opcode for function */
+
+   addr_in[0] = tree;
+   addr_in[1] = cursorpos;
+
+   crys_if( 217 );
+
+   return;
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]217 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]obj
int_in+2int_in[1]4 # Sub-opcode
addr_inaddr_in[0]tree
addr_in+4addr_in[1]cursorpos
+
+ + +
+ +

8.6.21 edit_set_dirty

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Edit Object Set Dirtyflag« - Alter settings: Dirty flag +
  +
Opcode: 217 (sub-opcode 7) +
  +
Syntax: void edit_set_dirty ( OBJECT *tree, int16_t obj, int16_t dirty +); +
  +
Description: The call edit_set_dirty changes the settings of the Dirty flag +for an editable object. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
tree RSC-tree of object +
obj Object number +
dirty 0 = clear, or 1 = set + +
+ +
With this one can clear the Dirty flag when the text has been +saved. +
  +
Return value: The function does not return a result. +
  +
Availability: As of MagiC 5.20 by means of a shared library. +
  +
Group: Editable object functions +
  +
See also: Binding +
  + +
+ +

8.6.21.1 Bindings for edit_set_dirty

+ + + + + + + + + +
C: void edit_set_dirty ( OBJECT *tree, int16_t obj, int16_t dirty +); +
  +
Binding: +
  +
void edit_set_dirty ( OBJECT *tree, int16_t obj,
+                      int16_t dirty )
+{
+   int_in[0]  = obj;
+   int_in[1]  = 7;      /* Sub-opcode for function */
+   int_in[2]  = dirty;
+
+   addr_in[0] = tree;
+
+   crys_if( 217 );
+
+   return;
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]217 # Function opcode
control+2control[1]3 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]obj
int_in+2int_in[1]7 # Sub-opcode
int_in+4int_in[4]dirty
addr_inaddr_in[0]tree
+
+ + +
+ +

8.6.22 edit_set_font

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Edit Object Set Font« - Alter settings: Font +
  +
Opcode: 217 (sub-opcode 3) +
  +
Syntax: void edit_set_font ( OBJECT *tree, int16_t obj, int16_t fontID, +int16_t fontH, int16_t fontPix, int16_t mono ); +
  +
Description: The call edit_set_font sets the ID, size and type of font used +in an editable object. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
tree Object tree +
obj Object index +
fontID Font ID +
fontH Character height in "points" +
fontPix 0=points, 1=pixels (from 3.5.98 on) +
mono 'Equidistant' flag + +
+ +
If the editable object was opened previously, then one should +generally trigger a redraw when changing the font. +
  +
The mono flag is required to give the editable object +the possibility to handle equidistant fonts (mono == 1) appreciably +faster that proportional fonts (mono == 0). +
  +
fontPix is only available from version 8 of the SLB +onwards. Older versions always assume fontPix=0, i.e. exclusively use +vst_point() for setting the character height. The SLB recognises from +contrl[1] whether fontPix was passed. If not then 0 will be +asumed. +
  +
Return value: The function does not return a result. +
  +
Availability: As of MagiC 5.20 by means of a shared library. +
  +
Group: Editable object functions +
  +
See also: Binding +
  + +
+ +

8.6.22.1 Bindings for edit_set_font

+ + + + + + + + + +
C: void edit_set_font ( OBJECT *tree, int16_t obj, int16_t fontID, +int16_t fontH, int16_t fontPix, int16_t mono ); +
  +
Binding: +
  +
void edit_set_font ( OBJECT *tree, int16_t obj,
+                     int16_t fontID, int16_t fontH,
+                     int16_t fontPix, int16_t mono )
+{
+   int_in[0]  = obj;
+   int_in[1]  = 3;      /* Sub-opcode for function */
+   int_in[2]  = fontID;
+   int_in[3]  = fontH;
+   int_in[4]  = mono;
+   int_in[5]  = fontPix;
+
+   addr_in[0] = tree;
+
+   crys_if( 217 );
+
+   return;
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]217 # Function opcode
control+2control[1]6 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]obj
int_in+2int_in[1]3 # Sub-opcode
int_in+4int_in[2]fontID
int_in+6int_in[3]fontH
int_in+8int_in[4]mono
int_in+10int_in[5]fontPix
addr_inaddr_in[0]tree
+
+ + +
+ +

8.6.23 edit_set_format

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Edit Object Set Format« - Alter settings: Formating +
  +
Opcode: 217 (sub-opcode 1) +
  +
Syntax: void edit_set_format ( OBJECT *tree, int16_t obj, int16_t +tabwidth, int16_t autowrap ); +
  +
Description: The call edit_set_format sets the formatting of text in an +editable object. The following apply: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
tree Object tree +
obj Object index +
tabwidth 1 or tabulator width in pixels +
autowrap  -1: Do not change +
> 0: Pixel width for auto line wrap +
     (generally == object width) +
= 0: No wrapping, but horiz. scrolling + +
+ +
If one of the two attributes is to remain unchanged then -1 can +be passed. +
  +
If the editable object was opened previously then one should +generally trigger a redraw when changing one of the attributes. From +version 9 of the SLB the number of lines is recalculated when the +autowrap setting is altered. In older versions this only +happens with edit_set_buf. +
  +
Return value: The function does not return a result. +
  +
Availability: As of MagiC 5.20 by means of a shared library. +
  +
Group: Editable object functions +
  +
See also: Binding +
  + +
+ +

8.6.23.1 Bindings for edit_set_format

+ + + + + + + + + +
C: void edit_set_format ( OBJECT *tree, int16_t obj, int16_t +tabwidth, int16_t autowrap ); +
  +
Binding: +
  +
void edit_set_format ( OBJECT *tree, int16_t obj,
+                       int16_t tabwidth, int16_t autowrap )
+{
+   int_in[0]  = obj;
+   int_in[1]  = 1;      /* Sub-opcode for function */
+   int_in[2]  = tabwidth;
+   int_in[3]  = autowrap;
+
+   addr_in[0] = tree;
+
+   crys_if( 217 );
+
+   return;
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]217 # Function opcode
control+2control[1]4 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]obj
int_in+2int_in[1]1 # Sub-opcode
int_in+4int_in[2]tabwidth
int_in+6int_in[3]autowrap
addr_inaddr_in[0]tree
+
+ + +
+ +

8.6.24 edit_set_pos

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Edit object set ?« - Set important information ? of an +editable object. +
  +
Opcode: 217 (sub-opcode 5) +
  +
Syntax: void edit_set_pos ( OBJECT *tree, int16_t obj, int16_t xscroll, +int32_t yscroll, int8_t *cyscroll, int8_t *cursorpos, int16_t cx, +int16_t cy ); +
  +
Description: Exactly what the function edit_set_pos does is not known, as it +only turns up in the binding mt_edit.c. From the parameters it seems +to allow the setting of the cursor position and scrolling functions in +an editable object. The following apply: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
treeRSC-tree of object
objObject index
xscroll 
yscroll 
cyscroll 
cursorpos 
cx 
cy 
+
+ +
Return value: The function does not return a result. +
  +
Availability: As of MagiC 5.20 by means of a shared library. +
  +
Group: Editable object functions +
  +
See also: Binding +
  + +
+ +

8.6.24.1 Bindings for edit_set_pos

+ + + + + + + + + +
C: void edit_set_pos ( OBJECT *tree, int16_t obj, int16_t xscroll, +int32_t yscroll, int8_t *cyscroll, int8_t *cursorpos, int16_t cx, +int16_t cy ); +
  +
Binding: +
  +
void edit_set_pos ( OBJECT *tree, int16_t obj,
+                    int16_t xscroll, int32_t yscroll,
+                    int8_t *cyscroll, int8_t *cursorpos,
+                    int16_t cx, int16_t cy )
+{
+   int_in[0]    = obj;
+   int_in[1]    = 5;      /* Sub-opcode for function */
+   int_in[2]    = xscroll;
+   int_in[3..4] = yscroll;
+   int_in[5]    = cx;
+   int_in[6]    = cy;
+
+   addr_in[0] = tree;
+   addr_in[1] = cyscroll;
+   addr_in[2] = cursorpos;
+
+   crys_if( 217 );
+
+   return;
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]217 # Function opcode
control+2control[1]7 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]3 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]obj
int_in+2int_in[1]5 # Sub-opcode
int_in+4int_in[2]xscroll
int_in+6int_in[3..4]yscroll
int_in+10int_in[5]cx
int_in+12int_in[6]cy
addr_inaddr_in[0]tree
addr_in+4addr_in[1]cyscroll
addr_in+8addr_in[2]cursorpos
+
+ + +
+ +

8.6.25 Using G_EDIT objects

+ +
    +
  • In the RSC file a white G_BOX, without border, is included +
  • +
  • In the program the SharedLib is loaded +
  • +
  • For each G_EDIT object: +
      +
    • Create text buffer. +
    • +
    • Create editable object with edit_create. +
    • +
    • Alter object type in G_EDIT and place ob_spec on the +editable object. +
    • +
    • Allocate the text buffer with edit_set_buf. +
    • +
    • If necessary alter the settings of the editable object with +edit_set_xxx. +
    • +
    • Open editable object with edit_open. +
    • +
    • Only then draw the tree with objc_draw. +
    • +
    + +
  • +
  • In order to pass keyboard codes and mouse clicks to the +editable object, one has to call edit_evnt. The syntax is fully +analogous to wdlg_evnt, fslx_evnt and fnts_evnt. +
  • +
  • When closing, the edit field must be closed with edit_close, +after which the memory reserved for the edit field is released again +with edit_delete. No further objc_draw may be performed! If necessary, +set the object type on G_BOX once more. +
  • +
+ +

See also: Keyboard codes for G_EDIT +

+

8.6.26 Keyboard codes for G_EDIT

+

These keyboard codes are evaluated by G_EDIT: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CursorCorresponding cursor movements
Ctrl-Cursor-up/downScrolling
Ctrl-Cursor-left/rightMove cursor word by word
Shift-Cursor-left/rightCursor to start/end of line
EscNothing (yet)
InsertNothing (yet)
Shift-InsertNothing (yet)
BackspaceDelete character left of cursor
DeleteDelete character right of cursor
Ctrl-DeleteNothing (yet)
HomeCursor to start of text
Ende (MF-2) and
Ende (Mac) and
Shift-Clr/HomeEnd of text
PgUp (Mac) and
Shift-Cursor-upCursor one page up
PgUp (Mac) and
Shift-Cursor-downCursor one page down
^ASelect all (from 27.1.98 on)
^CCopy block to clipboard (leave it in text)
^XCut block to clipboard (delete it from text)
^VInsert clipboard contents at cursor position
+
+ +
+ +Home +AESAES +Print dialogsPrint dialogs +Event libraryEvent library + + diff --git a/en/emulators.html b/en/emulators.html new file mode 100644 index 000000000..7d79d14ff --- /dev/null +++ b/en/emulators.html @@ -0,0 +1,41 @@ + + + + + +The documentation for TOS: Emulators + + + + + + + + + +Home +Contents +XaAES deprecated functionsXaAES deprecated functions +MagiC Mac specificsMagiC Mac specifics + +
+ +

14 Emulators

+ +
+
+ +Home +Contents +XaAES deprecated functionsXaAES deprecated functions +MagiC Mac specificsMagiC Mac specifics + + diff --git a/en/emulators_magicmac.html b/en/emulators_magicmac.html new file mode 100644 index 000000000..41594d026 --- /dev/null +++ b/en/emulators_magicmac.html @@ -0,0 +1,1310 @@ + + + + + +The documentation for TOS: MagiC Mac specifics + + + + + + + + + +Home +EmulatorsEmulators +EmulatorsEmulators +MagiC PC interfaceMagiC PC interface + +
+ +

14.1 MagiC Mac specifics

+

MagiC Mac is an implementation of MagiC known on the Atari +platform for the hardware of the Apple (Power-) Macintosh computers. +This section describes the following points: +

+ + +

Those having questions or missing some features for the +Atari-Mac interface should first approach the author of the MagiC Mac +kernel before tinkering with the internals, since any changes may no +longer work in the next MagiC Mac version. +

+

See also: About the GEMDOS   About the BIOS   XBIOS   GEM +

+

14.1.1 General remarks about MagiC Mac

+

The core of the 'emulation' of the Atari environment on the +Macintosh lies in the reprogramming of the PMMU. Both Atari as well as +Macintosh programs assume that they will find certain variables (the +so-called system variables) in the lowest 2 kB of the address space. However, +when an Atari program is running it expects other values there than, +say, the Mac operating system. The so-called kernel of MagiC Mac +makes sure that - depending on whether a Mac or an Atari routine is +running at the time - suitable system variables are present in that +lower address space. This is done with appropriate programming of the +PMMU, a coprocessor for memory management. +

+

So there are two MMU modes: The Mac- and the Atari-mode. +By means of two routines one can switch back and forth between them. +Starting from taking the Mac-mode as the normal mode, the following +changes occur when switching to the Atari-mode: +

+
    +
  • A memory block that was allocated somewhere on the Macintosh +heap is inserted from address $0 into the Atari address space. This +block is between 4 and 32 kB long and is guaranteed to hold only the +exception vector table and the documented system variables. +
      +

  • +
  • Address space from $00FF8000 to $00FFFFFF (and correspondingly +$FFFF8000 to $FFFFFFFF) is blanked out. On the Atari this is the I/O +address space, which is not normally available on the Macintosh (which +at most has RAM there). +
      +
    So that programs do not erroneously address this space as RAM, +if the Macintosh has some there, this blanking out leads to a bus +error at each access. It is however possible that special +Atari-compatible hardware has been installed in the Macintosh, +whereupon this hardware then blends in this address space at the +relevant positions. This means: A program that recognizes that +it is running under MagiC on the Mac should not automatically +assume that no Atari hardware is present in the I/O area, but should +continue to check with a test access (by diversion of the bus error +vector) whether access to the module is possible. +
      +

  • +
  • RAM that belongs neither to the TPA of MagiC, nor to the +MagiC OS or the kernel data and routines is not present in the Atari +address space, i.e. accesses outside the area specially reserved for +Atari programs lead to a bus error. This protects other Macintosh +applications better from faulty Atari programs. This protection +however works only with 68k machines, not with +PowerPCs! +
      +

  • +
+ +

See also: Program launch and TPA +

+

14.1.2 MagiC Mac and Power-Macs

+

MagiC Mac naturally also runs on the new PCI machines from +Apple (Power Macintosh 7600, 8200, 8500 and 9500). When using this +hardware the following points should be borne in mind: +

+
    +
  • The address areas not used by MagiC, but present in the Mac +address space, can not be blanked out and so also not +protected from access. This means that accesses outside the TPA and +the program and heap area of MagiC Mac will not have bus +errors reported, as is the case with 68k computers. +
      +

  • +
  • With the PowerMac models since mid-1995 the upper address area +is used for PCI cards and/or ROM. So on accessing the Atari I/O area +in $FFFF8000 - $FFFFFFFF one gets no bus errors but only +undefined data. Unfortunately this cannot be changed. It is +recommended therefore that programs access the I/O area only in the +range $00FF8000 - $00FFFFFF, to either check for the presence of +component modules (by making an access to them and checking whether +this leads to a bus error), or work with the hardware extension +McSTout in case it is also made available for the PCI-Macs. +Programs can recognize these circumstances by the state of bit 5 in +Cookie.flags1. +
      +

  • +
+ +

See also: Program launch and TPA +

+

14.1.3 Cookies under MagiC Mac

+

MagiC Mac naturally also supports the cookie jar, and creates +the following cookies: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Cookie Meaning in MagiC Mac +
    +
_CPU Contains the value 20, 30 or 40. On 68000 machines MM does not +run; on PowerPC machines a 68020 will be indicated +
_FDC $014D6163 - The last 3 bytes result in the text 'Mac' +
_FPU The usual values; with a 68040 there will only be an 8 here if +the associated FPU software is installed as well +
_MCH No Atari-compatible hardware present (-1) +
_SND 0 +
_VDO No Atari-compatible video hardware present (-1) +
MagX Same as in MagiC +
MgMc Points to a MgMcCookie structure +
MNAM Pointer to NULL-terminated string with the name of the +computer; this only serves as information for the user +
PMMU NULL; shows that the MMU is engaged and may not be used by +other programs + +
+ +

See also: Cookie and XBRA list +

+

14.1.4 Filesystems under MagiC Mac

+

MagiC Mac, just like MagiC, permits the incorporation of +alternative filesystems. At present the following systems are +supported: +

+
    +
  • FAT filesystems according to TOS conventions: This +allows floppy disks as well as hard disks in the usual Atari format to +be accessed with all TOS functions (GEMDOS, but also e.g. Rwabs). +
      +

  • +
  • Mac filesystems: As these do not have a FAT, access to +these drives is only possible via GEMDOS, but not via BIOS. +
      +

  • +
+ +

The Mac filesystem under MagiC Mac: +

+

As the GEMDOS functions are mapped directly to the Mac +filesystem functions for the most part, all file formats usable under +MacOS can be used under MagiC Mac as well, i.e. once one can 'mount' +a drive on the Mac, it is (or its folder contents are) also +installable under MM. Thanks to this one can also use CD-ROMs or +network drives without any further drivers in MagiC Mac as a rule. +MagiC Mac also allows the Mac- typical ejection of a floppy disk, for +instance. +

+

See also: MagiC's XFS-concept   Dpathconf +

+

14.1.5 Restrictions of MagiC Mac

+

MagiC Mac does not implement all functions that MagiC +offers for Ataris. AES, VDI and GEMDOS are implemented completely, but there are +restrictions with BIOS and BIOS. However it is possible to restore +some of the functionalities with add-ons such as McSTout or a +sound driver. +

+
    +Unimplemented or ignored functions with BIOS: +
    Initmouse, Mfpint, Ikbdws, Jdisint, Jenabint, Giaccess, Offgibit, Ongibit, +Xbtimer, Dosound. +
      +

    +
+ +

Additionally there are restrictions with some functions, +mainly in connection with the filesystem and the devices: +

+
    +
  • The MIDI workstation is not usable at present unless the +hardware extension McSTout with MIDI option is installed. It +may also be that MIDI will be realized in the future via one of the +serial ports of the Mac, so all that one can say is: Whether MIDI can +be used must be established by the user - a program cannot recognize +that by itself in practice. The same applies for Midiws. +
      +

  • +
  • The IKBD workstation is not present +
      +

  • +
  • If Getbpb returns 0 it may be that a Mac-formatted floppy disk +is in the drive, which nevertheless can be accessed with the +file functions via drive A: +
      +

  • +
  • If a Mac-formatted disk is in the floppy drive, then Rwabs +will return an error ('Drive not ready'); the files on the disk can, +if necessary, be accessed nevertheless with the GEMDOS file +functions +
      +

  • +
  • Drvmap also returns set bits for the drives that are Mac- +formatted and so are only addressable via GEMDOS and not with Rwabs +
      +

  • +
  • Getrez always returns 2 (ST-High), so is unusable +
      +

  • +
  • Setscreen can only alter the physical address if the user has +launched MagiC Mac in ST-resolution emulation mode (e.g. ST-High). To +recognize whether this is the case one should first attempt to alter +the address with Setscreen and then check with Physbase whether the address +let itself be altered. +
      +

  • +
  • Floprd, Flopwr, snd Flopver do not work if Mac-formatted disks +are inserted (implemented only as of MM 1.2.2). The bad sector list of +Flopver reports in case of error all sectors of the track as defective, +as the exact track can not be ascertained. +
      +

  • +
  • Flopfmt can format floppy disks as of MM 1.2.2, but only with +80 tracks, 2 sides and depending on the inserted disk, 9 or 18 sectors +per track. With the MgMc cookie one can check what kind of disk (DD or HD) +is in the drive. Don't be surprised: The Mac only offers a +function to format all tracks at once. Hence this is solved +with MM in such a way that a Flopfmt call for track 0 (or 79, depending +on where one starts) will format the whole disk and a Flopfmt call for +the remaining tracks will do nothing, so that the function returns +immediately with an error-code 0. In the case of a formatting problem, +an error is reported for all tracks. As a result the disk to be +formatted must be completely in order. +
      +

  • +
  • Rsconf: The MPF-specific parameters are ignored +
      +

  • +
  • Puntaes knows several modes, MagiC Mac is terminated if +necessary +
      +

  • +
+ +

See also: About the GEMDOS   About the BIOS   XBIOS   GEM +

+

14.1.6 Exceptions under MagiC Mac

+

As on a real Atari, an Atari program running under MagiC Mac +can use the exception vectors, namely divert them. Actually the +program may use only the exception vectors between $0 and $400 for +this, not those to which the VBR points (because that points +elsewhere!). Those who do not adhere to this may run into difficulties +with later versions of MagiC Mac. Programs that use the PMMU, e.g. +OUTSIDE can not run under MagiC Mac. +

+

The following Atari interrupts are simulated by the kernel +at present: +

+
    +
  • $070: Autovector interupt Level 4 (VBL) +
      +

  • +
  • $114: MFP interrupt 5 (200 Hz system timer) +
      +

  • +
  • $118: MFP interrupt 6 (IKBD). Actually only the event of key +presses and mouse movements is simulated here, i.e. the interrupt +handler obtains the specific type of the event in some other way than +on the Atari. +
      +

  • +
+ +

Due to the Mac hardware, however, the interrupts may appear with +different priorities; consequently the interrupt mask of the +SR has other values to that on an Atari in some circumstances. The +vector at $400 (etv_timer) will also be jumped to by the MagiC OS, of +course, as a subroutine of the interrupt handler for MFP interrupt 5, +in just the same way as on an original Atari. +

+

Likewise a program that would like to experience mouse or +keyboard events can use the BIOS function Kbdvbase to hook itself +into the event vectors in exactly the same way as on the Atari. +

+

Another important note about interrupts: So that the +keyboard, mouse and timer work properly on a Mac, the interrupt mask +(in CPU register SR) must always be zero. On an Atari, on the other +hand, it normally stands at three. Programs containing code such as +MOVE #$2300,SR for instance, would put a Macintosh into a sleep +state, which only a reset can remedy. Those who want to alter the +interrupt mask only occasionally should do it this way (works equally +well on an Atari and Mac): +

+
  MOVE SR,-(a7)    ; Store old SR
+  ORI  #$0700,SR   ; Block all interrupts for a critical access
+  ...
+  MOVE (a7)+,SR    ; At end, restore old SR
+
+

Those who definitely want to return the computer to its basic +state should not use MOVE #$2300,SR but better MOVE #$2000,SR. +On the Atari the SR will then be increased to $2300 just before the +HBL interrupt routine. In this way the same code achieves te same +result on both machines. +

+

If interrupt or other asynchronous routines are installed by +means of MacOS functions and then these functions are to switch from +the Mac- mode to the Atari-mode, then several things need to be +heeded, which are described in greater detail below: +

+
    +
  • Setting of a semaphore (see intrLock/intrUnlock) +
      +

  • +
  • Query whether an Atari-mode switch is even possible at the time +(see atariModePossible) +
      +

  • +
  • Deinstallation of the routine at the termination of MagiC Mac +(see macAppSwitch) +
      +

  • +
  • Before switching into the Atari-mode one must ensure that the +stack pointer (SP) lies within the Atari address space, since +otherwise a double bus error arises and the CPU will come to a +standstill +
      +
    Note: First: It may be that the call of the routine by +the MacOS occurs at a time when another Mac application is running, in +which case the current stack is not that of MagiC Mac. +Second: With the 68k machines, in Atari-mode only the address space of +the 2 TPAs, the lowest 32 kB, if necessary the I/O area as well as the +area of the MagiC Mac application is visible; other memory of MacOS +and other Mac applications is blanked out, and only bus errors will +arise if access is attempted. To sum up: To make sure that the +SP lies in the Atari address space when switching into the Atari MMU +mode, one must previously reserve a stack area for this and then use +that. To ensure that the stack is large enough (1-2 kB are clearly +not enough!) one should heed the cookie value minStackSize! +
      +

  • +
  • Always switch to supervisor-mode before 'modeAtari' is called +(else it won't run under virtual memory). The following code is +suggested for this: +
      +

                 clr     d0
    +             move    sr,d0
    +             btst    #13,d0
    +             bne     ok1
    +             moveq   #8,d0        ;   Enter supervisor-mode
    +             dc.w    $A08D        ;   _DebugUtil
    +       ok1:
    +             move    d0,-(a7)     ;   Save the old mode
    +
    +             ; Here now modeAtari ... Call modeMac etc.
    +
    +             move.w  (a7)+,sr     ;   Restore old mode
    +
    +

  • +
  • Mac subroutines may only alter the registers d0-d2/a0/a1 as a +rule, though not (as often usual on the Atari), a2! +
      +

  • +
+ +

See also: Program launch and TPA   Reset-vector   System variables +

+

14.1.7 Clean programming

+

Even if the specific implementation of MagiC Mac is not of interest +to every Atari programmer, there are some basic rules that one should +adhere to on the Atari level to be as certain as possible that the +programs can run also under MagiC Mac. Here the following points can +be mentioned, amongst others: +

+ + + + + + +
    +
  • Self-modifying code +
    When code (also applies for XBRA vectors) is altered, it is +imperative that the CPU cache is purged. Although by testing one can +ascertain whether this is not necessary on a 68020 with its small +cache, one can never be certain: On the Mac there is a 68k emulator +for the PowerPC machines that simulates a 68020, which, first, has a +larger cache than a real 68020 (inclusive of a data cache which is +otherwise present only with the 68030), and second also compiles the +code into PowerPC code. +
      +
    If the code of an Atari program is then changed, the emulator +can only recognize this is a command for cache purging is executed. +Equally, a cache purge is necessay as a rule with the 68040/60 CPUs! +Here is the code with which the whole cache is purged in such cases: +
      + + + + + + + + + + + + +
    Processor Code +
        +
    68020/30 +
          MOVE  CACR,D
    +      ORI.W #$0808,D0
    +      MOVE  D0,CACR
    +
    +
    or also like this: +
          DC.W  $4E7A,$0002,$0040,$0808,$4E7B,$0002
    +
    +
    68040/60 +
          NOP
    +      CPUSHA DC/IC
    +
    +
    or: +
          DC.W   $4E71,$F4F8
    +
    + +
    + +
    The processor type should be obtained for this by inspection of +the _CPU cookie. +
      +

  • +
  • Blocking interrupts +
    If the interrupts have to be bloked for a short time, then +never set the SR afterwards to the fixed value $2300, but save +the old SR if possible before the blocking (say onto the stack) and +then load it back again afterwards. If it is imperative that a reset +of the SR is to take place irrerspective of the old SR, then set the +interrupt mask to zero and not to three, so for instance MOVE +#$2000,SR instead of MOVE #$2300,SR. The Atari operating system then +automatically looks after converting the mask value to 3, while the +mask remains on 0 for the Mac; because otherwise nothing works any +more. +
      +

  • +
  • Hardware accesses +
    Before programming certain hardware registers directly (e.g. the +Centronics port for printing), one should check the _MCH cookie. If +its value is $FFFFFFFF (dec. -1), then it means that no Atari +hardware is present (so that the program is running on the Macintosh, +for instance) and therefore one shouldn't even try to access the +hardware since there may well be RAM there, which of course may +not be altered by such accesses. +
      +

  • +
  • Supervisor-mode +
    Since multitasking operating systems such as MultiTOS and MagiC +have came into use, no program should arbitrarily change the +supervisor stack pointer, say to obtain a larger stack, as this could +lead to incalculable system crashes (on the PCI Macs, for instance, a +very large supervisor stack is required: at least 8 MB, but in some +circumstances even 24 MB - only the operating system can know this and +install it correctly). Important: To get into the +supervisor-mode, never use the GEMDOS function Super, but use +Supexec from the BIOS instead. Only Supexec can ensure that a +sufficiently large supervisor stack will be used. +
      +

  • +
+ +

See also: +
Programming guidelines   Style guidelines   XBRA procedure +

+

14.1.8 The shutdown process in MagiC Mac

+ +

Under MagiC Mac the shutdown process will be taken on by the +program 'shutdown.prg'; if this was able to terminate all currently +active (Atari) programs, then MagiC Mac itself will be terminated as +well. Some programmers might find it of interest how one can terminate +MagiC Mac without a query. This can be done in two steps: +

+
    +
  • Switch to the Macintosh-mode (with modeMac) +
  • +
  • Execute the Mac routine ExitToShell. +
  • +
+ +

In Pure-C this could look as follows, for instance: +

+
  static pascal void ExitToShell (void) 0xA9F4;
+  MgMcCookie *mgmc;
+  ...
+  ...
+  get_cookie ("MgMc", &mgmc); /* Pointer to MgMc cookie structure    */
+  mgmc->modeMac ();           /* Switch to Mac-mode                  */
+  ExitToShell ();             /* Terminates MM at once without query */
+
+

This information could be important if you want to program your +own shutdown.prg. +

+

See also: +
General remarks about shutdown   shel_write   Shutdown in MultiTOSShutdown in MagiC   Shutdown at the receiver   Shutdown at the initiator   +

+

14.1.9 XCMDs under MagiC Mac

+

XCMDs are small external code modules for Macintosh +applications. As a rule these can be created fairly easily with the +development tools under MacOS (e.g. with Metrowerks' +CodeWarrior or Symantec C). As of version 1.2.2 MagiC Mac +also permits the simple use of such code modules by programs that run +under MagiC. This greatly simplifies the development of programs or +drivers that want to use the Macintosh functions, as these portions +can then be created with a Macintosh compiler, rather than having to +recreate the interfaces laboriously under an Atari development system. +

+

An example of such a XCMD can be found in the 'Demo +XCMD' folder of the original MagiC Mac documentation. The created +module can then just be placed in the MagiC Mac XCMDs folder. +This folder must lie in the same directory as the MagiC Mac +application. At the launch of MagiC Mac this folder is searched +through for files with the filetype 'xCmd' and the XCMD resources +contained in it loaded and executed. These XCMDs can then register +themselves with MagiC Mac and so become available for MagiC +programs. +

+

An application is shown by the Pure-C program in the +'MGMC_API' folder of the original MagiC Mac documentation. This +shows how easily an installed XCMD can be opened and called. The +functions offered here by the cookie (xcmdMgrPtr) go automatically +into the supervisor-mode if required and switch to the Mac environment +(with callMacContext), and also control parameter passing. The call of +the XCMD functions in this way is therefore permitted only when the +Atari-mode is active and if the call is not made from an interrupt. +

+

If the XCMD functions are to be called from interrupts or in +Mac-mode, one can use 'xcmdMgrPtr->getAdr' to get the entry address +of the XCMD dispatcher and then jump to it directly. +

+

Further information for XCMDs can be found in the source text +'Demo XCMD.c' of the original MagiC Mac documentation. +

+

14.1.10 Cooperation between MagiC and the MacOS

+

MagiC Mac hooks itself directly into all interrupt vectors that +the Macintosh uses. If MagiC is running and a hardware interrupt +occurs, MagiC Mac switches the MMU back into the normal +Macintosh-mode. At the end of the IntrRoutine one will be switched +back into the Atari-mode and the programs running under MagiC will +continue. As long as the Mac-mode is active, MagiC Mac does +not meddle further with the Intr-processing, but does so only +when the Atari-mode is active. +

+

Whenever a switch is made from the Mac-mode back to the +Atari-mode, a check is made whether a given amount of time has passed +(measured in ticks; a tick is around 1/60s), in order to then perform +periodic tasks. These tasks are called Mac-tasks here. +

+

Mac-tasks perform the following, amongst others: +

+
    +
  • Poll the Mac events (functions GetOSEvent or WaitNextEvent) +
      +

  • +
  • Evaluate [Command]-[Q] and [Command]-[W] +
      +

  • +
  • Evaluate external Apple events, e.g. Suspend/Resume (switch +MagiC Mac into the background) and terminated externals +
      +

  • +
  • Cede CPU time to other Mac applications (with WaitNextEvent) +
      +

  • +
+ +

The decision whether to use GetOSEvent or WaitNextEvent (WNE) +for polling the events can be set via 'Preferences' and also by a +cookie function. Only if WNE is used will CPU time be allocated to +other Mac applications as well. +

+

Mac-tasks can be executed only if it is certain that no other +MacOS function is being processed at the time, since the MacOS is not +reentrant. Mac-tasks are therefore performed only if all of the +following conditions apply: +

+
    +
  • After the interruption (an interrupt or a modeAtari call) the +Atari-mode will be active and the interrupt-level mask is zero, i.e. +there is no other interrupt being handled (to ensure this, +Intr-handlers that switch from Mac-mode into the Atari-mode have to +use intrLock correctly, see below) +
      +

  • +
  • No routine in the Mac-context is being executed at the time +(callMacContext) +
      +

  • +
  • MagiC Mac is not in the process of terminating itself +
      +

  • +
+ +

14.1.11 The MagiC Mac cookie

+

The MagiC Mac operating system [a port of MagiC to the hardware +of the Apple (Power) Macintosh] creates a cookie MgMc, which points +to the following structure: +

+ + +
typedef struct
+{
+  SHORT   vers;                 /* Version identifier in BCD format    */
+  SHORT   size;                 /* Size of the structure in bytes      */
+  LONG    flags1;               /* Various flags:                      */
+                                /*  Bit 0: 640*400 emulation active    */
+                                /*  Bit 1: Right-[Shift] possible      */
+                                /*  Bit 2: 2-button mouse              */
+                                /*  Bit 3: 68k emulation on a Power-PC */
+                                /*  Bit 4: Upper I/O area not present  */
+                                /*  Bit 5: Lower I/O area not present  */
+                                /*                                     */
+                                /* Note: Bit 2 is only available as of */
+                                /* Version 1.01, bit 3 from Version    */
+                                /* 1.05 on and the following only as   */
+                                /* of Version 1.10                     */
+  PixMap  *scrnPMPtr;           /* Pointer to screen description       */
+  BOOLEAN *updatePalette;       /* Is to be set to restore the         */
+                                /* colour tables                       */
+  ProcPtr modeMac;              /* MMU switching to Mac-mode           */
+  ProcPtr modeAtari;            /* MMU switching to Atari-mode         */
+  ProcPtr getBaseMode;          /* Returns the MMU-mode in d0.W        */
+                                /* The following apply:                */
+                                /*  0 = Macintosh                      */
+                                /*  <> 0 = Atari                       */
+  ProcPtr getIntrCount;         /* Returns interrupt semaphore-counter */
+                                /* in d0.L (0 = free)                  */
+  ProcPtr intrLock;             /* Increments inter. semaphore-counter */
+  ProcPtr intrUnlock;           /* Decrements inter. semaphore-counter */
+  ProcPtr callMacContext;       /* Executes routine in Mac-context;    */
+                                /* Proc-adr. on stack                  */
+                                /*                                     */
+                                /* Warning: Registers d0-d2/a0/a1/a5   */
+                                /* and a7 will be destroyed            */
+  Ptr     atariZeroPage;        /* Pointer to Atari memory area,       */
+                                /* $0-$800 in Macintosh address space  */
+  Ptr     macA5;                /* Value of a5-register in Mac-context */
+  ProcPtr macAppSwitch;         /* Called by the MagiC kernel (d0/4(a7)*/
+                                /* The following apply:                */
+                                /*  0 = Suspend                        */
+                                /*  1 = Resume                         */
+                                /*  2 = Quit                           */
+                                /*  3/4 = atariModePossible alternates */
+  ProcPtr controlSwitch;        /* Called by the MagiC kernel (d0/4(a7)*/
+                                /* The following apply:                */
+                                /*  0 = Hide Atari screen              */
+                                /*  1 = Show Atari screen              */
+  LONG    hardwareAttr1;        /* Undefined at present                */
+  LONG    hardwareAttr2;        /* Undefined at present                */
+  Ptr     magiC_BP;             /* BASEPAGE of the MagiC OS            */
+  Ptr     auxOutName;           /* Pascal string for AUX-out workstation*/
+  Ptr     auxInName;            /* Pascal string for AUX-in workstation */
+  ProcPtr auxControl;           /* Called by the MagiC kernel (d0/4(a7)*/
+                                /* The following apply:                */
+                                /*  0 = Suspend                        */
+                                /*  1 = Resume                         */
+                                /*  2 = Quit                           */
+  PrintDesc *printDescPtr;
+  GenProc   configKernel;       /* Call (C-convention) Atari-mode      */
+  BOOLEAN   *atariModePossible; /* Pointer to a flag showing whether   */
+                                /* the call of modeAtari is permitted  */
+                                /* at the time                         */
+  MacVersion *versionOfMacAppl; /* Version of the MagiC Mac application*/
+                                /* (as of Version 1.06)                */
+  VOID       *hwEmulSupport;    /* Internal use (as of Version 1.07)   */
+  FlpDrvInfo *floppyDrvInfoPtr; /* Points to information for drives A: */
+                                /* and B: (as of Version 1.07)         */
+  XCMDgrRec *xcmdMgrPtr;        /* XCMD interface (as of Version 1.08) */
+  ProcPtr   giveTimeToMac;      /* Call in Mac-context if idle         */
+  LONG      minStackSize;       /* Minimum supervisor stack size       */
+  GenProc   ext;                /* Help routines, call from Atari-mode */
+  GenProc   extMac;             /* As for 'ext' but call from Mac-mode */
+  ProcPtr   stackLoad;          /* (As of 1.11 / MagiC Mac 2.0)        */
+  ProcPtr   stackUnload;        /* (As of 1.11 / MagiC Mac 2.0)        */
+  LONG      reserved[3];        /* Undefined at present                */
+} MgMcCookie;
+
+

Notes: +

+
    +
  • The components giveTimeToMac and minStackSize are available +only as of Version 1.09; all further components only from Version 1.10 +onwards +
      +

  • +
  • Unused bits and undefined values are always zero! +
      +

  • +
  • All pointers remain constant, i.e. it is permitted to copy the +pointer contents and then work with them +
      +

  • +
  • Call according to C-convention means that parameters are passed +on the stack and that registers d0-d2/a0-a2 may be destroyed +
      +

  • +
+ +

See also: +
MagiC Mac type conventions   Cookie and XBRA list +

+

14.1.11.1 MagiC Mac type conventions

+

Here follows a list of type conventions that play a role in +connection with MagiC Mac: +

+
typedef char Boolean;
+typedef char *Ptr, **Handle;
+typedef unsigned char *StringPtr;
+typedef void PixMap;
+typedef Handle THPrint;
+typedef void (*ProcPtr)(void);
+
+typedef long cdecl (*GenProc) (short function, void *data);
+typedef Boolean cdecl (*PrSetupProc) (Boolean alwaysInteractively);
+
+

Note: The XCMD structures are contained in the file +'MgMc_API.h' of the original documentation for MagiC Mac. +

+

See also: Type definitions in MagiC +

+

14.1.11.2 mmc_flg1_bit4

+

The lower I/O area ($00FF8000-$00FFFFFF) is not present +as such, i.e. quite normal RAM may reside there, just as in any other +place. In that case no distinction will be made between ST-RAM +and TT-RAM - the whole of the RAM used by MagiC Mac, even that above +16 MB, will be made available as ST-RAM. +

+

This means, of course, that in this case programs can make +no I/O accesses to this area! If this bit is cleared (not +set), a program can make accesses there nevertheless and count on a +bus error if no Atari-compatible hardware (such as McSTout, +say) is installed there. +

+

14.1.11.3 mmc_flg1_bit5

+

The upper I/O area ($FFFF8000-$FFFFFFFF) is not +accessible as such (see MagiC Mac and Power-Macs); on accessing it one +does not get a bus error, but data from the Macintosh-ROM. +

+

14.1.11.4 auxControl

+

This is intended for the HSMODEM driver: The WORD parameter on +the stack determines whether the ports are to be released (2 = close +completely, 0 = close, but hold DTR if necessary) or if reassignment +of the ports is permitted (value = 1). Between value-0 and value-1 the +names (auxInPort, auxOutPort) may have changed. +

+

Note: The call should be made in Atari supervisor-mode, +the USP is undefined. +

+

See also: The MagiC Mac cookie   Cookie and XBRA list +

+

14.1.11.5 callMacContext

+

This serves to produce the required Macintosh environment for +calling any MacOS routines. The routine must be called in Mac-mode +and in supervisor-mode and not from an interrupt. +

+

For this one should pass on the stack the address of the routine +that is to be called as a subroutine in the Mac context. The normal +user stack of MagiC Mac is used for the called routine; in addition +the register a5 is loaded with macA5 and if virtual memory is active, +a switch is made to user-mode. As this function alters the stack, it +is not possible to pass parameters via the stack. The +registers d0-d2/a0/a1/a5/a7 are altered both at the call and also at +the return of the subroutine (although a5/a7 after return from +'callMacContext' have the same values as before the call). The other +registers are not altered and can be used for parameter +passing and returns. +

+

The execution of this subroutine implicitly brings calls of +intrLock and intrUnlock with it, meaning that during this no Mac-tasks +will be processed, even if one switches into Atari-mode occasionally. +To allow processing of Mac-tasks despite of this, one can call the +function 'giveTimeToMac'. +

+

See also: The MagiC Mac cookie   Cookie and XBRA list +

+

14.1.11.6 configKernel

+

This offers access to some settings that are otherwise +accessible only interactively from the Macintosh side. For this one +passes as a rule a function number in the function parameter +and a pointer to a variable in the data parameter, which has +to contain the value to be set before the call, or -1 in case no new +value is to be set. +

+

After the call the variable contains the current value. The +settings will be adopted in the 'Preferences' if nothing else is +specified. The functions: +

+ + + + + + + + + + + + + + + + + + +
Value Description +
    +
1 data points to a byte that determines whether the 200Hz +timer is to be simulated by the MacOS timer. The following +apply: +
+
+ + + + + + + + + + +
0=No
1=Yes (default)
+
+ +
2 Determines whether Mac background processes are to be called. +The following apply: +
+
+ + + + + + + + + + +
0=No
1=Yes
+
+ +
3 Determines whether the IDLE state for Powerbooks is +permitted. The followinng apply: +
+
+ + + + + + + + + + +
0=No
1=Yes
+
+ +
4 Similar to (1), for the flag 'UnlockMemOnMacSide' (see also +under atariModePossible): If this is non-zero, the memory occupied by +MagiC Mac for the TPA is released for offloading, as long as virtual +memory is active. Otherwise it cannot be offloaded. This is not saved +in the 'Preferences' at present. + +
+ +

See also: Program launch and TPA   The MagiC Mac cookie +

+

14.1.11.7 controlSwitch

+

Here Atari routines can hook themselves in with the XBRA +procedure. They are then called in Atari-mode (supervisor-mode) when +one of the specified events occurs. This is required, for instance, +when an Atari program wants to make use of certain Macintosh routines. +For example, a program using the sound routines of the Mac can be told +in this way when MagiC Mac has been terminated to close the sound +channels and to release the occupied memory. +

+

The following values are passed in d0.W and on the stack (and +must also remain there): +

+ + + + + + + + + + + + +
Value Description +
    +
0 Hide +
Mouse and keyboard control for MagiC are suspended, because a Mac +dialog is opened, for instance; in that case there should be no output +to the screen either (e.g. for interrupt routines) as otherwise these +could overwrite the Macintosh dialog +
1 Show +
The opposite of Hide + +
+ +

Note: The routine has to be called in Atari +supervisor-mode, the USP is undefined. +

+

See also: The MagiC Mac cookie   Cookie and XBRA list +

+

14.1.11.8 getBaseMode

+

If getBaseMode is called in an interrupt, the function returns +the mode that existed at the instant before the interrupt was handled. +

+

14.1.11.9 intrLock

+

This must be called before switching to Atari-mode from a +Macintosh routine that could run in an interrupt. In addition, one has +to count on the fact that before the switch a foreign stack is active +which does not belong to the address space of the Atari-mode. +

+

Therefore one has to switch beforehand to a stack (see +minStackSize) from the Atari address space. After switching back to +the Macinntosh- mode one has to call intrUnlock, of course. +

+

With the aid of these intr-semaphores one can recognize when the +CPU executes commands under MagiC in a non-interrupt state. This +state has to be recognized, because only then can the +Macintosh background processes and other Macintosh routines be called +without risk by the MagiC Mac kernel through its interrupt control +routines. (While the interrupt routines or Macintosh routines are +being processed, no Mac routines may be called by the MagiC Mac +kernel, because the MacOS is not reentrant. During this time no Mac +events are handled; even [Command]-[W]/[Q] do not function at that +time). +

+

See also: The MagiC Mac cookie   System-Cookies +

+

14.1.11.10 macAppSwitch

+

Here Atari routines can hook themselves in with the XBRA +procedure. They are then called in Atari-mode (supervisor-mode) when +one of the specified events occurs. This is required, for instance, +when an Atari program wants to make use of certain Macintosh routines. +For example, a program using the sound routines of the Mac can be told +in this way when MagiC Mac has been terminated to close the sound +channels and to release the occupied memory. +

+

The following values are passed in d0.W and on the stack (and +must also remain there): +

+ + + + + + + + + + + + + + + + + + + + + +
Value Description +
    +
0 Suspend +
MagiC Mac is placed in the background - a different Macintosh +application comes to the foreground (e.g. the Finder) +
1 Resume +
MagiC Mac is the foreground application again on the Macintosh +side +
2 Quit +
MagiC Mac is terminated +
3 Flag atariModePossible becomes FALSE afterwards +
4 Flag atariModePossible is TRUE again + +
+ +

Note: The routine has to be called in Atari +supervisor-mode, the USP is undefined. +

+

See also: The MagiC Mac cookie   Cookie and XBRA list +

+

14.1.11.11 atariModePossible

+

This points to a byte indicating whether a switch from the Mac +to the Atari MMU-mode is possible at that instant (0=forbidden, +1=allowed). So long as the Macintosh is running without virtual memory +(VM) (also without RAM-doubler), the 'modeAtari' call is always +possible; however if VM is active and also the 'UnlockMemOnMacSide' +flag is non-zero, then on switching from the MagiC to the Mac screen +the memory occupied by MM (MagiC Mac) for the TPA will be released +for offloading. +

+

However, as soon as the VM management offloads a block, the MMU +tables calculated by MM are no longer valid and must be calculated +anew prior to the next switch to the Atari-mode. This is not done +automatically, however, but only when switching back to the Atari +screen. For this reason interrupt and other asynchronous routines that +are installed under MagiC Mac by MacOS functions may not +perform Atari-mode switches under the described circumstances. +

+

Atari programs that hook into the Atari vectors (e.g. the VBL +vector at $70) need not take all of this into account, since in cases +when the MMU tables become invalid the Atari interrupts will not even +be simulated any more. In cases where one should take further measures +before or after the status of the flags alters one can install also a +routine via macAppSwitch that then indicates this event with the +values 3 and 4 in d0.W). +

+

See also: Program launch and TPA   The MagiC Mac cookie +

+

14.1.11.12 modeAtari

+

Before this function can be called the following conditions have +to be fulfilled: +

+
    +
  • The Mac-mode must be active +
      +

  • +
  • The CPU must be in the supervisor-mode. Under virtual memory, +Mac programs and also the Mac interrupt routines run in user-mode. If +one wants to switch occasionally to the Atari-mode from there, one has +to change to the supervisor-mode beforehand. See +'EnterSupervisorMode'. +
      +

  • +
  • The current stack must lie in Atari address space, else the CPU +freezes immediately due to a double bus error if the program is +running on a 68k computer - because then other areas, including the +stack area, are no longer addressable. Please see also minStackSize +for this. +
      +

  • +
  • atariModePossible must indicate that MMU switching is +permitted. Otherwise, with MacsBug installed, the following message +appears: 'Fatal Error: Atari-mode currently not available (MMU tables +invalid)'. +
      +

  • +
+ +

See also: The MagiC Mac cookie   Cookie and XBRA list +

+

14.1.11.13 modeMac

+

This can be called at any time, also in interrupt routines, as +long as the program is in the Atari-mode and in supervisor-mode at the +time. After the call the whole Mac address space can be accessed. +

+

The memory that starts in Atari-mode at address zero, starts in +the Mac-mode at the position to which atariZeroPage points. If +a switch was made from a normal Atari application to the Mac-mode with +modeMac, then only those MacOS routines may be called that may also be +called in an interrupt (see 'Inside Macintosh'); if necessary one also +has to place in register a5 the value from macA5. Other routines +should be called only with callMacContext, particularly those that use +the QuitDraw routines - if appropriate this has to be tried out. If a +call of callMacContext is required, this can be recognized often by the fact +that bus errors occur otherwise, or no texts appear in dialog boxes +etc. +

+

See also: The MagiC Mac cookie   Cookie and XBRA list +

+

14.1.11.14 versionOfMacAppl

+

With this one obtains the version identifier of the running +MagiC Mac application (i.e. the ID that can also be displayed in the +Finder). At last programs can adjust themselves to the MM versions! +

+

14.1.11.15 giveTimeToMac

+

This serves for ceding time to Mac event handling of MagiC Mac +if the computer spends too long in Mac-mode (sensible from 1/60s +onwards), e.g. while waiting for completion of asynchronous processes. +

+

'giveTimeToMac' can be called as often as desired; the +Mac events are in any case only polled as frequently as set in the +Preferences (normal: every 1/60s, which is also the maximum +frequency). In order to call the routine, the complete Mac context +must be fashioned, i.e. the applications stack must be active and a5 +set accordingly (this is achieved for instance with callMacContext). +The routine performs no other actions that do not happen otherwise as +well when the Atari-mode is active and during this the Mac events are +polled automatically in turn. A specialty is that the routine does not +evaluate a pending Quit command, so that the routine that calls +'giveTimeToMac' can assume that it will be its turn again immediately +(as long as a fatal error does not occur). +

+

See also:The MagiC Mac cookie   Cookie and XBRA list +

+

14.1.11.16 minStackSize

+

This specifies the minimum size for the supervisor stack, in +case a program has to reserve such stack space itself (for example +when a callback routine is called from MacOS and this then wants to +call a routine in Atari-mode, because one has to ensure there that the +SP when switching to the Atari-mode lies within the Atari address +space and this can only be effected with an own, local stack). +

+

Warning: It is imperative that one keeps to this value, +because though 5 kb suffice on the older 68k machines as a rule, on +the newer PCI PowerMacs over 12 kb is required when the network +(Ether-Talk) is active! However, it is best if one forgoes the +creation of one's own supervisor stack completely, to avoid such +problems in the future. In case of doubt one should contact the author +of the MagiC Mac kernel! +

+

See also:The MagiC Mac cookie   Cookie and XBRA list +

+

14.1.11.17 ext

+

This offers various help functions of the MagiC Mac kernel. The +call has to be made from Atari-mode (user- or supervisor-mode). Calls +from interrupts are not permitted. +

+

For this one passes a function number in the function +parameter and a pointer to possibly additionally required data in the +data parameter. On calling undefined function numbers the +return value of the function will always be -1. The functions: +

+ + + + + + + + + + + + + + + + + + +
Value Description +
    +
0 extMax +
data is unused (pass NULL!), the return will be the +highest implemented function number. +
1 extAlert +
Displays a generic Mac dialog (alert). data points to a +NULL- terminated string (255 characters maximum!) that is displayed in +the dialog. Warning: Umlauts and other accented characters +must have Mac codings. For newlines simply insert a CR. +
Return value: Always zero. +
2 extAUXOpenErr +
Displays a Mac alert with a text (adapted to the language in use) +that the serial port cannot be opened because it is occupied (is +required by HSMODEM/MACM1). data is unused. Return value: +Always zero. +
3 extFSSpecToPath +
Converts a Macintosh filepath to a GEMDOS-conform path. +data points to the following structure: First an FSSpec (see +Mac docs), followed by a buffer with room for 256 characters. This +buffer is filled by a C-string that describes a complete pathname, +with which the file can be accessed via GEMDOS file functions. It may +be a good idea later that this path goes via the pseudo-drive 'u:\', +in which all currently present Mac drives are then available. One must +also take into account that we are dealing with file and folder names +that do not fit into the 8+3 scheme. +
If we are dealing with a folder, then the path is terminated with +'\' in any case. If a path cannot be obtained, say because none of the +configured MagiC drives 'sees' the relevant folder, the function +returns the value -2. On success, a 0 is returned. + +
+ +

Warning: This function may take some time under certain +circumstances, as all the directories used by MM may have to be +searched through; therefore do not airily call it up continuously if +you can avoid it! +

+

See also: The MagiC Mac cookie   Cookie and XBRA list +

+

14.1.11.18 extMac

+

Corresponds to 'ext', though the call must be made in the Mac +context (see 'callMacContext'). It is advantageous if, due to call of +other Mac functions, the program is already in the Mac-mode. Calls +from interrupts are not permitted as a rule. +

+

14.1.11.19 stackLoad

+

stackLoad activates a new CPU stack (a7). +

+

This is required when one wants to call a routine in the Atari +context from a Mac context during which an arbitrary CPU stack is +active, i.e. before a mode-change with 'modeAtari' has been performed. +A switch to another stack is necessary then, because the memory area +that a7 is currently using may be blanked out through the switch to +Atari-mode, which could lead to the CPU freezing (see also the +relevant parts of 'Exceptions under MagiC Mac'). +

+

Instead of simply placing the a7 onto the new stack, one should +use 'stackLoad'. Basically this function does the same thing, but it +also informs the MacOS about this (by setting some global variables). +As a result the MacOS does not check a7 periodically in the meantime. +The reason is because otherwise, with certain MacOS versions (prior to +7.5 and again as of 7.5.3), the MacOS would issue a stack overflow +message even though this has not occurred. +

+

If virtual memory is active, this call also prevents this stack +area being offloaded, which could result in the computer freezing in +some circumstances. +

+

Usage: In a0 one should pass a pointer to a MemArea structure +(see above). This must contain a pointer to the start (lowest address) +of the stack as well as its length (respect 'minStackSize'!). The +routine will destroy the registers a0 and a1 and sets a7 to the value +of <MemArea.start+MemArea.length>. +

+

14.1.11.20 stackUnload

+

The inverse of 'stackLoad'. This is to be called if the stack +that was active previously is to be used again. +

+

The routine destroys the register a0 (a7 receives again the +value it had before the stackLoad call). +

+
+ +Home +EmulatorsEmulators +EmulatorsEmulators +MagiC PC interfaceMagiC PC interface + + diff --git a/en/emulators_magicpc.html b/en/emulators_magicpc.html new file mode 100644 index 000000000..c4e1efbb7 --- /dev/null +++ b/en/emulators_magicpc.html @@ -0,0 +1,1565 @@ + + + + + +The documentation for TOS: MagiC PC interface + + + + + + + + + +Home +EmulatorsEmulators +MagiC Mac specificsMagiC Mac specifics +STEmulatorSTEmulator + +
+ +

14.2 MagiC PC interface

+

MagiC PC knows sveral interfaces with which one can call up +functions of the Windows system. +

+
    +
  • mec0 (MPS) interface: +
    This serves for executing any kind of (self-written) Windows code. +It is stored in a DLL and called via illegal opcodes from within +MagiC PC. +
      +

  • +
  • mec1 interface: +
    With this a predefined set of special functions can be called. +
      +

  • +
  • mec2 Schnittstelle: +
    Is provided by XFS_PC.LDR. +
      +

  • +
  • mec3 Schnittstelle: +
    Used by MPC_ACC for communication with MagiCPC. +
      +

  • +
  • mecnvdi Schnittstelle: +
    Is provided by NVDI_PC.DLL. +
      +

  • +
+ +

14.2.1 mec0 (MPS) interface

+

0. General remarks +

+

MPS = Magic_Programmier_Schnittstelle = MagiC programmer's +interface +

+

Files of the demo example: +

+ + + + + + + + + + + + + + + + + + +
mps_base.def The export list of the DLL, DO NOT ALTER! +
mps_base.h Definition of the MPS interface, DO NOT ALTER! +
mps_base.cpp Basic functions of the DLL, DO NOT ALTER! +
mps_demo.h Definitions for the demo-DLL +
mps_demo.cpp The MPS_functions of the demo-DLL +
testmps.s Motorola - Example for calling the MPS functions of the demo + +
+ +

To develop your own MPS_DLLs, please use mps_base.def, mps_base.h and +mps_base.cpp unaltered. You can alter/supplement mps_demo.h and mps_demo.cpp. +In particular, please choose your own DLL_ID in mps_demo.h for +differentiation from other MPS_DLLs. +

+

I. Concept +

+

Windows-side one can use dynamic link libraries (DLLs) to +establish any number of functions (called 'MPS_functions' in the +following) which can be called within MagiC PC (Motorola-side). +

+

In the start-up phase MagiC PC attempts to load and start all +DLLs in the MPS subdirectory. For this MagiC PC calls three functions +to be exported from the DLL (in this order): +

+ +
    +
  1. mps_get_type(): Must return 0x4701! +
      +

  2. +
  3. mps_get_functionlist(...): Obtains DLL_ID and MPS_functions +list of the DLL. +
      +

  4. +
  5. mps_magicinfo: Provides information about MagiC PC's own data +and functions which the DLL may use on demand. +
      +

  6. +
+ +

All functions declared in 2) can be called via special opcodes +on the Motorola side. See part IV for more about the call. +

+

II. Functions of the DLL to be exported ('Basic +functions') +

+

An MPS_DLL must export exactly 3 C functions under fixed ordinal +numbers (these are also called basic functions): (see mfp_base.def, +mfp_base.cpp, mfp_base.h) +

+
    +
  • @101: int mps_get_type() +
      +
    Purpose: Serves for reassurance that it was really MPS_DLL that +was caught. !! Return value: 0x4701 !! +
      +

  • +
  • @102: int mps_get_functionlist(DWORD *mps_dll_id,MPS_fuptr +**p_funktionsliste); +
      +
    Purpose: MagiC PC wants to know DLL_ID and MPS_functionlist. +
      +
    Return values: +
    *mps_ddl_id: DLL_ID (4 bytes, to be selected DLL-specifically!) +
    *p_functionslist: Pointer to list of the MPS_functions. +
    Return: 1: All OK +
      +

  • +
  • @103: void mps_magicinfo(MPS_magicinfo *is); +
      +
    Purpose: Provides information about MagiC PC's own info / +function pointers which the DLL may use: +
      + +

      typedef struct {
    +   DWORD sizeof_str;               // Size of MPS_magicinfo
    +   DWORD magic_version;            // e.g. 0x010001
    +   DWORD magic_date;               // e.g. 19960815  (ascending)
    +   BYTE  is_demo;                  // Is it a demo version?
    +   BYTE  uu1, uu2, uu3;            // Still unused, 0
    +
    +   // Convert address Motorola -> Intel
    +   BYTE *(*intel_adr)(DWORD motadr);
    +   // Convert pointer Motorola -> Intel
    +   BYTE *(*intel_ptr)(DWORD motptr);
    +
    +   WORD (*swap_word)(WORD w);      // Swap one WORD
    +   DWORD (*swap_long)(DWORD dw);   // Swap one LONGword
    +  } MPS_magicinfo;
    +
    +
    The address conversions return NULL if motadr or motptr is +invalid. +
      +

  • +
+ +

III. The freely definable MPS_functions of a DLL: +

+

MPS_functions basically have the form: +

+

void function_blabla( MPS_motregs *motregs ) +

+

motregs here points to a list of the Motorola registers +d0-a7. The contents of the registers is already in the correct Intel +byte order. The Motorola registers may also have new values written to +them. +

+

With mps_get_functionlist the DLL passes the list of addresses +of all such MPS_functions. The function numbers correspond to the +position of the function within the list. If a number is to remain +free, then its address is passed as 0xffffffff (= -1). See also +mps_demo.cpp. +

+

IV. Motorola-side call +

+

MPS_functions are called by a Motorola-side 8-byte opcode: +

+
    dc.w    $4fbf       * 2 bytes: Do not alter!
+    dc.l    DLL_ID      * 4 bytes: DLL-specific DLL_ID
+    dc.w    Fkt_no.     * 2 bytes: Function number
+
+

DLL_ID is the DLL_ID (4 bytes!) passed via mps_get_functionlist. +Function number is the position of the function in the function list +passed by mps_get_functionlist (count starts at 0). +

+

V. Miscellaneous +

+ +
    +
  1. Each DLL should use an individual DLL_ID to prevent conflicts +between multiple DLLs (see mps_demo.h). DLL_IDs with bit 31 set are +reserved for us (Application Systems) or for allocated IDs. Therefore +please do not choose a DLL_ID with set bit 31! If we are to allocate a +reserved DLL_ID to you, please get in touch with Herr Hoffmann of +Application Systems Heidelberg. +
      +
    The following DLL_IDs have been allocated: +
      +

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    DLL_IDProgram nameAuthor
    0x003f5c66MPCTimeRobert Weiß
    0x2053434BMPCSTiKDan Ackerman
    0x21342812Draconis Windows Sockets
    0x44594a01In2CatDimitri Junker
    0x44594a02Win_LnkDimitri Junker
    0x4e415446mpsyield
    0x50475752MPC_POWREmanuel Welter
    +
    + +

  2. +
  3. Pay attention to the displacement of the address space!! If you +want to use a Motorola address on the DLL side, you should call +intel_adr(..) or intel_ptr(..) respectively for conversion (see +MPS_magicinfo in mps_base.h). Addresses from the DLL address space can +not be used Motorola-side! +
      +

  4. +
  5. Also pay attention to the different byte order between Motorola +and Intel processors. WORDs and LONGwords from the Motorola address +space have to be swapped so that they lie correctly in the DLL. If +anything is written back then it has to be swapped once more. For this +you can call the functions swap_word(..) or swap_long(..) (see +MPS_magicinfo in mps_base.h). BUT: Elements of MPS_motregs (d0-a7) are +already in the Intel order and do not have to be swapped. +
      +

  6. +
+ +

14.2.1.1 mps_base.def

+
; ==========================================================
+; Export definitions for MPS MagiC PC programmer's interface   FS 15.08.96
+; ==========================================================
+;
+; !! DO NOT ALTER !!
+; ==================
+EXPORTS
+   mps_get_type         @101
+   mps_get_functionlist @102
+   mps_magicinfo        @103
+
+

14.2.1.2 mps_base.h

+
// Tab size: 3
+
+// Last change:  15.08.96
+// Author:   FS
+
+// ------------------------------------------------------------------------
+//
+// The MagiC PC programmer's interface
+//
+// mps_base.h: Basic include     !! ADOPT UNALTERED !!
+//                               =====================
+
+#ifdef __cplusplus
+   extern "C" {
+#endif
+
+/* ========================================================================
+   The DLL functions freely definable by the user have the form:
+   void mps_function(MPS_motregs *r),
+   where r represents a pointer to the 16 Motorola registers, so:
+*/
+   typedef struct {              // MPS_motregs = The Motorola registers
+     long d0,d1,d2,d3,d4,d5,d6,d7;
+     long a0,a1,a2,a3,a4,a5,a6,a7;
+     } MPS_motregs;
+                                 // MPS_fuptr = Pointer to a MPS_function:
+   typedef void (*MPS_fuptr)(MPS_motregs *);
+
+
+/* ======================================================================
+   The DLL basic function mps_info is passed the following info block
+   MPS_infostr:
+*/
+   typedef struct {
+     DWORD sizeof_str;           // Size of MPS_infostr
+     DWORD magic_version;        // e.g. 0x010001
+     DWORD magic_date;           // e.g. 19960815  (ascending)
+     BYTE  is_demo;              // Is it a demo-version?
+     BYTE  uu1, uu2, uu3;        // Still unused, 0
+
+     BYTE *(*intel_adr)(DWORD motadr); // Convert address Motorola -> Intel
+     BYTE *(*intel_ptr)(DWORD motptr); // Convert pointer Motorola -> Intel
+
+     WORD (*swap_word)(WORD w);           // Swap one WORD
+     DWORD (*swap_long)(DWORD dw);        // Swap one LONGword
+     } MPS_magicinfo;
+
+// =============== 3 basic functions to be exported: ==================
+//
+   int mps_get_type();                                             // @101
+   int mps_get_functionlist(DWORD *mps_dll_id,
+                            MPS_fuptr **p_functionslist);          // @102
+   void mps_magicinfo(MPS_magicinfo *is);                          // @103
+//
+// See also mps_base.cpp, mps_base.def
+
+
+#ifdef __cplusplus
+   }
+#endif
+
+

See also: MagiC PC interface +

+

14.2.1.3 mps_base.cpp

+
// Tab size: 3
+
+// Last change:  15.08.96
+// Author:   FS
+
+// ------------------------------------------------------------------------
+// Demo example for MagiC PC programmer's interface (MPS)
+//
+// Part 1: Basic functions, adopt UNCHANGED!
+// =======
+//
+// ------------------------------------------------------------------------
+
+#include "windows.h"
+#include "mps_base.h"
+#include "mps_demo.h"
+
+//
+// The following 3 basic functions must be exported by the DLL:
+//
+
+
+// 1) Basic function @101: Type query
+// ---------------------
+   int mps_get_type()
+// ----------------
+ {
+   return(0x4701);         // Must return this value
+ }
+
+// 2) Basic function @102: MagiC PC requests ID and function list
+// -----------------------
+   int mps_get_functionlist(DWORD *mps_dll_id,MPS_fuptr **p_functionslist)
+// ------------------------
+ {
+   *mps_dll_id = DLL_ID;              // User-defined ID, see mps_demo.h
+   *p_functionslist = my_funclist;    // Enter pointer to function list
+   return(1);
+ }
+
+// 3) Basic function @103: MagiC PC passes MPS_magicinfo to the DLL
+// -----------------------
+   void mps_magicinfo(MPS_magicinfo *is)
+// -------------
+ {
+   m_info = *is;                    // Remember
+ }
+
+//
+// END basic functions ----------------------------------------------------
+//
+
+
+

See also: MagiC PC interface +

+

14.2.1.4 mps_demo.h

+
// Tab size: 3
+
+// Last change:  15.08.96
+// Author:   FS
+
+// ------------------------------------------------------------------------
+// Demo example for MagiC PC programmer's interface (MPS)
+//
+// Part 2: User-defined functions, change DLL_ID to your own value !!!
+// =======
+//
+// ------------------------------------------------------------------------
+
+#define DLL_ID  0x01020304           // Change to your own value
+                                     // !! Values with bit 31 set are
+                                     // reserved for Appl.Systems.
+                                     // ID reservation: Apply to
+                                     // Appl. Systems (Herr Hoffmann)!
+
+   extern MPS_fuptr my_funclist[];   // Function list in the demo-DLL
+
+   extern MPS_magicinfo m_info;      // Is adopted by MagiC PC
+
+

See also: MagiC PC interface +

+

14.2.1.5 mps_demo.cpp

+
// Tab size: 3
+
+// Last change:  15.08.96
+// Author:   FS
+
+// ------------------------------------------------------------------------
+// Demo example for MagiC PC programmer's interface (MPS)
+//
+// Parl 2: User-defined functions, freely alterable
+// =======
+//
+// ------------------------------------------------------------------------
+
+#include "windows.h"
+#include "mps_base.h"
+#include "mps_demo.h"
+
+   MPS_magicinfo m_info;               // Global for the DLL
+
+//
+// List of the user-defined functions (alter/extend as required):
+// ------------------------------------------------------------------
+   static void demo_0(MPS_motregs *r);
+   static void demo_1(MPS_motregs *r);
+   static void demo_3(MPS_motregs *r);
+   static void copy_string(MPS_motregs *r);
+
+   MPS_fuptr my_funclist[] = {
+     demo_0,                       // Demo function 0
+     demo_1,                       // Demo function 1
+     (MPS_fuptr) -1,               // -1 (i.e function No.2 not defined)
+     demo_3,                       // Demo function 3
+     copy_string,                  // Demo function 4
+     NULL                          // !! A NULL-entry at list end !!
+     } ;
+
+
+// ******************************************************************
+//
+// Here the user-defined functions:
+// ================================
+//
+
+// Demo_0 only returns the value 1 in d0:
+//
+   static void demo_0(MPS_motregs *r)
+// ----------------------
+ {
+   r->d0 = 1;                       // Demo-0 sets d0 to 1
+   return;
+ }
+
+// Demo_1 adds the registers d1 and d2; result to d0:
+//
+   static void demo_1(MPS_motregs *r)
+// ----------------------
+ {
+   r->d0 = r->d1 + r->d2;
+   return;
+ }
+
+// Demo_3 does nothing at all!
+//
+   static void demo_3(MPS_motregs *r)
+// ----------------------
+ {
+   return;
+ }
+
+// Demo routine_4 copy_string copies a string to Motorola address space:
+//                -----------
+// a0: Destination address,
+// d0: Maximum number of characters (incl. 0)
+//
+   static void copy_string(MPS_motregs *r)
+// -----------------------
+ {
+   static char string[] = "This is a demo-text of copy_string(..)";
+
+   int i, nchmax;
+   char *dest;
+
+   nchmax = (int) r->d0;
+   dest = (char *) (*m_info.intel_ptr)(r->a0);
+   if (nchmax<=0 || dest==NULL) return;         // Invalid?
+
+   for (i=0; i<nchmax; i++) {
+     if ((dest[i] = string[i])==0)
+       return;
+     }
+   dest[nchmax-1] = 0;                          // Too long->truncate
+   return;
+ }
+
+

See also: MagiC PC interface +

+

14.2.1.6 testmps.s

+
+*                                                 FS  15.08.96
+*
+*   ===========================================================
+*   Sample for the call of the MPS functions from Motorola side
+*   ===========================================================
+*
+* Source Windows-side:
+* --------------------
+* mps_base.cpp, mps_demo.cpp
+*
+mps_code .equ  $4fbf                   * !! DO NOT ALTER !!
+DLL_ID   .equ  $01020304               * Enter own DLL_ID here
+
+* -------------------------------------- 60 bytes buffer
+bufsize  .equ  60
+.bss
+.even
+buffer:   ds.w  bufsize
+* --------------------------------------
+
+
+*
+* ------------------- Here we go: -----------------------------------
+*
+.text
+.globl _main
+_main:
+      moveq    #-1,d0                  * d0 to -1 (for testing)
+
+*     ===========================      * Call function 0 (Demo_0):
+      dc.w     mps_code                * = $4fbf
+      dc.l     DLL_ID                  * = Own DLL_ID
+      dc.w     0                       * Function number (here 0)
+*     ===========================
+      cmpi.l   #1,d0                   * Should return 1
+      bne      finish
+
+* Example for call with parameters (copy_string)
+* ----------------------------------
+      movea.l  #buffer,a0              * Pointer to buffer for string
+      move.l   #bufsize,d0             * Max. string length (incl.0-byte)
+
+*     ===========================      * Call function 4 (copy_string):
+      dc.w     mps_code                * = $4fbf
+      dc.l     DLL_ID                  * = Own DLL_ID
+      dc.w     4                       * Function number (here 4)
+*     ===========================
+
+      bsr      put_line                * Output line (a0)
+finish:
+      bsr      wait                    * Wait for keypress
+      rts
+*
+* --------------------- END main routine _main -----------------------
+*
+
+
+* ------------------------ Output line (a0) --------------------------
+put_line:
+      moveq    #13,d0
+      bsr      put_char
+      moveq    #10,d0
+put_lnext:
+      bsr      put_char
+      move.b   (a0)+,d0
+      bne      put_lnext
+      rts
+
+* ------------------------ Output chatacter d0 -----------------------
+put_char:
+      movem.l  d0-d2/a0-a2,-(sp)
+      move.w   d0,-(sp)
+      move.w   #2,-(sp)
+      move.w   #3,-(sp)
+      trap     #13
+      addq.l   #6,sp
+      movem.l  (sp)+,d0-d2/a0-a2
+      rts
+
+* -------------------------- Wait for keypress -----------------------
+wait:
+      move.w   #2,-(sp)
+      move.w   #2,-(sp)
+      trap     #13
+      addq.l   #4,sp
+      rts
+
+
+

See also: MagiC PC interface +

+

14.2.2 mec1 interface

+ +
    +
  1. Concept +
      +
    The mec1 interface makes it possible to call functions +predefined by the emulator in Motorola code. In principle it is +similar to the mec0 (MPS) interface, though the functions are not +freely definable in a DLL but already predefined by the emulator. +
      +

  2. +
  3. Call: The functions are called uniformly by the opcode $43bf, +followed by a function number, thus with 4 bytes total length. +Example: +
      +
    dc.w $43bf,$0031 +
      +
    calls the mec1 function with the number 0x31. ($43bf is the +opcode for chk <ea>,d1, with <ea> = 111111 binary, so +invalid). Parameter passing is, as with mec0, via the Motorola +registers. +
      +

  4. +
  5. The functions +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    $0001 long emu_version: +
      +

    +
    + + + + + + + + + + + + + + + + +
    Parameters:None
    Return:d0: Version number
     d1: Version date
     d2: Bit0: Is it a demo-version?
    +
    + +
    $0002 long emu_enquire: Obtains diverse information +
      +

    +
    + + + + + + + + +
    Parameters:long d0: What do you want to know?
    Return:long d0: Value
    +
    + +
    bisher definiert: +
      +

    +
    + + + + + + + + + + + + +
    was:1: Version number
     2: Version date
     3: Is it a demo?
    +
    + +
    $0003 void emu_getexepath: Obtains the full path (including drive, +without MAGIC_PC.EXE) +
      +

    +
    + + + + + + + + +
    Parameters:a0: char *bufadr (Buffer)
     d0: short nb_max (Max. bytecount for buffer)
    +
    + +
    $0004 int emu_install_newvdi: +
      +

    +
    + + + + + + + + + + + + + + + + + + + + +
    Parameters:a0: Byte *bufadr (New contents of NVDI_PC.DLL)
     d0: long nbytes (Length)
    Return:d0: >0: NVDI_PC.DLN sucessfully created.
     At next runup it will be automatically
     renamed to NVDI_PC.DLL, as discussed.
    +
    + +
    $0008 +
      +

    +
    + + + + + + + + + + + + +
    Parameters:d0: unknown
     d1: unknown
     d2: unknown
    +
    + +
    $0009 +
      +

    +
    + + + + +
    Parameters:a0: unknown
    +
    + +
    $0010 void dw_addline:  ! As of 03.97 +
      +
    Output text in new line in the debug window +
      +

    +
    + + + + +
    Parameters:a0: Pointer to the text.
    +
    + +
    $0011 void dw_addtext:  ! As of 03.97 +
      +
    Output text in debug window +
      +

    +
    + + + + +
    Parameters:a0: Pointer to the text
    +
    + +
    $0012 void dw_formtxt:  ! As of 03.97 +
      +
    Output text sprintf-like in debug window +
      +

    +
    + + + + + + + + + + + + + + + + + + + + +
    Parameters:a0: Pointer to the format-string
     d0, d1, ... Additional parameters suitable
     for the format-string. The format-string
     corresponds roughly to sprintf(format,...);
     string pointers are not allowed, however.
    +
    + +
    $0020 enq_bigscreen +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    Parameters:a0: unknown
    Return:d0<>0: All OK, 0=Error
     d1: unknown
     d2: unknown
     d3: unknown
     d4: unknown
    +
    + +
    $0021 new_bigscreen +
      +

    +
    + + + + + + + + + + + + + + + + +
    Parameters:d1: unknown
     d2: unknown
     d3: unknown
     d4: unknown
    +
    + +
    $0022 +
      +

    +
    + + + + +
    Parameters:d0: unknown
    +
    + +
    $0028 +
      +

    +
    + + + + + + + + +
    Parameters:d0: unknown
    Return:d0: unknown
    +
    + +
    $0031 int printer_open  ! As of 03.97 +
      +
    printer_open Opens the standard printer and starts a new +document +
      +

    +
    + + + + + + + + + + + + +
    Parameters:a0: char *DocName (NULL-pointer allowed)
    Return:d0>0: All OK
     d0<=0 Error
    +
    + +
    $0032 int printer_close  ! As of 03.97 +
      +
    printer_close Terminates the previously opened document and +closes the printer +
      +

    +
    + + + + + + + + + + + + +
    Parameters:None
    Return:d0>0: All OK
     d0<=0 Error
    +
    + +
    $0033 int printer_write  ! As of 03.97 +
      +

    +
    + + + + + + + + + + + + +
    Parameters:a0: Byte *pData; // Pointer to the data buffer
    d0: long nBytes; // No. of bytes in buffer
    Return:d0: Number of bytes transferred
    +
    + +
    $0040 DWORD getTickCount  ! As of 03.97 +
      +

    +
    + + + + +
    Return:d0: TickCount (msec since start of the computer)
    +
    + +
    $0041 DWORD getDrivePath  ! ab 02.99 +
      +
    The function obtains the Windows path for a MagiC drive +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Parameters:d0: Drive No. (0 for A:, 1 for B:, ...)
     a0: Text buffer for the path
     d1: Size of the text buffer
    Return:d0: 0: Not found,
         1: Container drive,
         2: xfs drive (Windows drive)
         4: Floppy drive
    +
    + +
    $0042 DWORD setClipboardDir  ! ab 02.99 +
      +

    +
    + + + + + + + + +
    Parameters:a0: char *pPath // NULL: Set to default
    Return:d0: 1
    +
    + +
    Beispiel: +
      +
            movea.l stringadr,a0  *
    +        dc.w    $43bf,$0042   * mec1, call function $42
    +        tst.l   d0            * -1: Function not implemented
    +        jl  nichtimplementiert
    +
    +
    $0043 long getMouseWheel +
      +

    +
    + + + + + + + + + + + + +
    Parameters:d0.l: 1: Reset position after readout
          0: Don't reset position after readout
    Return:d0.l: Current position of the mouse-wheel
    +
    + +
    Beispiel: +
      +
            moveq   #1,d0       * Reset position after readout
    +        dc.w    $43bf,$0043 * mec1, call function $43
    +        tst.l   d0          * Position altered since last reset
    +        je  no_action
    +        <d0.l verarbeiten>
    +
    +
    $0045 long setCompiler  ! As of 17.06.99 +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Parameters:d0.l: Selection; realised at present:
     d0 = 1: Switch compiler on/off:
     ————————-
     d1 = 0: Compiler off,
     d1 = 1: Compiler on
     d1 = -1: Query mode (from my experience
              this does not work, but it ought
              to work in the 6.20 version)
    Return:Old mode (0 or 1)
    +
    + + +
    + +

  6. +
+ +

14.2.3 mec2 interface

+ +
    +
  1. Concept +
      +
    The mec2 interface is provided by XFS_PC.LDR. +
      +

  2. +
  3. Call: The functions are called uniformly by the opcode $45bf, +followed by a function number, thus with 4 bytes total length. +Example: +
      +
    dc.w $45bf,$0001 +
      +

  4. +
  5. The functions +
      +
    Details about the various functions or not known yet. +
      +

  6. +
+ +

14.2.4 mec3 interface

+ +
    +
  1. Concept +
      +
    The mec3 is used by MPC_ACC for communication with MagiCPC. +
      +

  2. +
  3. Call: The functions are called uniformly by the opcode $47bf, +followed by a function number, thus with 4 bytes total length. +Example: +
      +
    dc.w $47bf,$0001 +
      +

  4. +
  5. The functions +
      + + + + + + + + + + + + + + + +
    $0001 long mpc_shutdown: +
      +
    Terminate MagiCPC. +
      +

    +
    + + + + + + + + +
    Parameters:Keine
    Return:d0<>0: All OK, 0=Error
    +
    + +
    $0002 long mpc_restart: +
      +
    Restart MagiCPC. +
      +

    +
    + + + + + + + + +
    Parameters:Keine
    Return:d0<>0: All OK, 0=Error
    +
    + +
    $0010 : long start_winfile +
      +
    Execute windows program. +
      +

    +
    + + + + + + + + + + + + + + + + + + + + +
    Parameters:a0: pathname (must not be null)
     a1: command line (can be null)
     a2: environment (can be null)
     a3: current directory (can be null)
    Return:d0<>0: All OK, 0=Error
    +
    + +
    $0020 : long mpc_control +
      +
    This function has several subfunctions, whose number is passed +in d0.l +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    $0010 mpc_init +
      +
    Tell MagiCPC that MPC_ACC is active. +
      +

    +
    + + + + + + + + +
    Parameters:none
    Return:d0<>0: All OK, 0=Error
    +
    + +
    $0011 mpc_exit +
      +
    Tell MagiCPC that MPC_ACC is no longer active. +
      +

    +
    + + + + + + + + +
    Parameters:none
    Return:d0<>0: All OK, 0=Error
    +
    + +
    $0020 mpc_control +
      +
    Ask MagiCPC whether a shutdown should be initiated. +
      +

    +
    + + + + + + + + +
    Parameters:none
    Return:d0>0: Shutdown should be started.
    +
    + +
    $0021 mpc_shutdown_start +
      +
    Tell MagiCPC that shutdown has started. +
      +

    +
    + + + + + + + + +
    Parameters:none
    Return:d0>0: Shutdown should be started.
    +
    + +
    $0022 mpc_shutdown_completed +
      +
    Tell MagiCPC that shutdown has successfully completed. +
      +

    +
    + + + + + + + + +
    Parameters:none
    Return:none
    +
    + +
    $0023 mpc_shutdown_cancelled +
      +
    Tell MagiCPC that shutdown has been canceled. +
      +

    +
    + + + + + + + + +
    Parameters:none
    Return:none
    +
    + +
    $0030 mpc_execute +
      +
    Get filename to be executed from MagiCPC. +
      +

    +
    + + + + + + + + + + + + + + + + + + + + +
    Parameters:a1: pathname
     d1: max length for pathname
     a2: command line
     d2: max length for command line
    Return:d0<>0: All OK, 0=Error
    +
    + +
    $0031 mpc_start_exe +
      +
    Execute windows program. This function is used when parameters +are passed via VA_START to MPC_ACC. +
      +

    +
    + + + + + + + + +
    Parameters:a0: pointer to argument vector
    Return:d0<>0: All OK, 0=Error
    +
    + +
    $0040 mpc_debout +
      +
    Output text sprintf-like in debug window +
      +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    Parameters:a0: Zeiger auf den Format-String
     d1, ... d7 Additional parameters suitable
     for the format-string. The format-string
     corresponds roughly to sprintf(format,...);
     string pointers are not allowed, however.
    Return:none
    +
    + +
    others For unknown/illegal subfunction codes, -1 is returned in d0.l +
      + +
    + +
    others For unknown/illegal function codes, -1 is returned in d0.l +
      + +
    + +

  6. +
+ +

14.2.5 mecnvdi interface

+ +
    +
  1. Concept +
      +
    The mec2 interface is provided by NVDI_PC.DLL. +
      +

  2. +
  3. Call: The functions are called uniformly by the opcode $41bf, +followed by a function number, thus with 4 bytes total length. +Example: +
      +
    dc.w $41bf,$0001 +
      +

  4. +
  5. The functions +
      +
    Details about the various functions or not known yet. +
      +

  6. +
+ +
+ +Home +EmulatorsEmulators +MagiC Mac specificsMagiC Mac specifics +STEmulatorSTEmulator + + diff --git a/en/emulators_others.html b/en/emulators_others.html new file mode 100644 index 000000000..4e2d236dd --- /dev/null +++ b/en/emulators_others.html @@ -0,0 +1,251 @@ + + + + + +The documentation for TOS: Detecting the presence of TosBox, Steem and PaCifiST + + + + + + + + + +Home +EmulatorsEmulators +TOS2WINTOS2WIN +ProtocolsProtocols + +
+ +

14.5 Detecting the presence of TosBox, Steem and PaCifiST

+ + + +
; FOR ST PROGRAMMERS - How to detect PaCifiST (0.46 or greater)
+;
+; When Vsync is called with d6=d7='Emu?' and those registers are
+; altered, you can assume you're running under an emulator.
+
+; If d6='PaCi' & d7='fiST', then it's under PaCifiST and a0 points out
+; some extra hardware registers:
+;
+; 0     BYTE    major version (BCD)
+; 1     BYTE    minor version (BCD)
+
+; TosBox
+; The approved method, à la PaCifiST, is to call Vsync with d6 = d7 =
+; 'Emu?'($456D753F). On return, d6 will contain 'TBox' ($54426f78) and
+; d7 will contain the ASCII-encoded version number.
+
+; Steem
+; modified 16/4/02 by Anthony Hayward to recognize Steem - that
+; returns d6='STEe'=$53544565, d7='mEng'=$6d456e67. Since v2.4
+; a0 points to extra information (read-only unless stated):
+;
+; 0     BYTE    Major version (BCD)
+; 1     BYTE    Minor version (BCD)
+; 2     BYTE    Slow motion flag
+; 3     BYTE    Slow motion speed (%)
+; 4     BYTE    Fast forward flag
+; 5     BYTE    Millions of cpu cycles per second (read-write on v3+,
+;               changes at next VBL)
+; 6     BYTE    Debug build flag
+; 7     BYTE    Snapshot loaded flag (read-write). If you set this
+;               flag to 0 at the start of your program then you
+;               can detect users loading snapshots.
+; 8     WORD    Run speed (%) (read-write on v3+)
+; 10    WORD    How fast Steem is actually managing to run
+;               as a percentage. If the computer is fast enough
+;               this will equal run speed most of the time. It
+;               is updated every 12 VBLs and can jump around a bit.
+;
+; The following are available on Steem v2.5 and higher:
+;
+; 12    LONG    Cycle count (overflows every 8 minutes at 8Mhz)
+; 16    LONG    Cycle count at start of frame (last VBL interrupt)
+; 20    LONG    Cycle count at start of line (last HBL interrupt)
+; 24    WORD    Signed word containing the number of the current line.
+;               In low/medium res the first line after the top border
+;               is 0, the last before the bottom border is 199.
+; 26    BYTE    Print ST logs in user build flag (read-write). If you
+;               set this flag then writing the address of a NULL-
+;               terminated string to 0xffc1f0 will output it to the
+;               parallel port. In the debug build the string is always
+;               written to the log file.
+;
+; The following are available on Steem v3.2 and higher:
+;
+; 27    BYTE    Super video mode (read-write). This register is here
+;               to allow developers to test Falcon graphics using
+;               Steem. Possible values are 0 - normal ST mode,
+;               1 - Falcon 256 colour (palette at $FF9800),
+;               2 - Falcon true colour (16-bit).
+;               Note: You can't switch to super video from ST high res
+;               or if Steem is running in 256 colour mode. To check
+;               for this, read the register back immediately after
+;               setting it.
+; 28    BYTE    Super video size (read-write) 0=320x200, 1=640x400,
+;               2=320x240, 3=640x480.
+;
+; There are two write-only registers:
+;
+; 0     LONG    (Steem v3+) This register allows you to create new
+;               disk images in the user's home directory. You must
+;               write the address of a string in ST memory that
+;               contains the disk name and a parameter list separated
+;               by NULLs; the string must be double NULL-terminated.
+;               The first parameter is the number of sides the disk
+;               should have, the second the number of tracks and the
+;               third sets the sectors per track. All parameters are
+;               passed as strings. Here is an example:
+;
+;   create_disk_string:  dc.b   'New Disk Name',0,'2',0,'80',0,'11',0,0
+;
+;               That will create a 900 kb disk with the name
+;               "New Disk Name.st". Once the disk is created it will
+;               be inserted into drive A. Make sure you delay for half
+;               a second after creating a new disk before accessing it
+;               - this allows TOS to detect media change.
+;
+; 4     BYTE    (Steem v3.2+) Writing anything to this address will
+;               disable the extra hardware registers. When the
+;               hardware registers are available, some ST programs
+;               may detect they are running on a Falcon; to stop that,
+;               write to this when you no longer need the extra
+;               features. Any writes to extra registers after writing
+;               a byte here will cause a bus error.
+;
+; Every address up to offset 31 is reserved for future use (won't
+; cause bus errors on read or write). If you want anything put in
+; here let us know (steem@gmx.net).
+
+        move.l  #'Emu?',d5
+        move.l  d5,d7
+        move.l  d5,d6
+        move    #$25,-(a7)
+        trap    #$e
+        addq.l  #2,a7
+        move.l  a0,regbase
+
+        cmp.l   d5,d6
+        bne.s   under_emu
+        cmp.l   d5,d7
+        bne.s   under_emu
+
+        lea     no_emu(pc),a0
+        bra.s   print_and_quit
+
+under_emu:
+        cmp.l  #'PaCi',d6
+        bne.s  not_pacifist
+        cmp.l  #'fiST',d7
+        bne.s  not_pacifist
+
+        pea     getversion_pacifist(pc)
+        move.w  #$26,-(a7)
+        trap    #$e
+        addq.l  #6,a7
+        lea     pacifist_emu(pc),a0
+        bra.s   print_and_quit
+
+not_pacifist:
+        cmp.l   #"TBox",d6
+        bne.s   not_tosbox
+
+        move.l  #tosbver+1,d0
+        and     #$fffe,d0
+        move.l  d0,a0
+        move.l  d7,(a0)
+        lea     tosbox_emu(pc),a0
+        bra.s   print_and_quit
+
+not_tosbox:
+        cmp.l   #'STEe',d6
+        bne.s   not_steem
+        cmp.l   #'mEng',d7
+        bne.s   not_steem
+
+        pea     getversion_steem(pc)
+        move.w  #$26,-(a7)
+        trap    #$e
+        addq.l  #6,a7
+        lea     steem_emu(pc),a0
+        bra.s   print_and_quit
+
+not_steem:
+        lea     an_emu(pc),a0
+
+print_and_quit:
+        pea     (a0)
+        move    #9,-(a7)
+        trap    #1
+
+        addq.l  #6,a7
+        move    #1,-(a7)
+        trap    #1
+
+        addq.l  #2,a7
+        clr.w   -(a7)
+        trap    #1
+
+getversion_pacifist:
+        move.l  regbase(pc),a0
+        move.b  (a0),d0
+        add.b   d0,pacifist_majorv
+        move.b  1(a0),d0
+        move    d0,d1
+        lsr     #4,d1
+        and     #$f,d0
+        and     #$f,d1
+        add.b   d1,pacifist_minorv
+        add.b   d0,pacifist_minorv+1
+        rts
+
+getversion_steem:
+        move.l  regbase(pc),a0
+        move.b  (a0),d0
+        add.b   d0,steem_majorv
+        move.b  1(a0),d0
+        move    d0,d1
+        lsr     #4,d1
+        and     #$f,d0
+        and     #$f,d1
+        add.b   d1,steem_minorv
+        add.b   d0,steem_minorv+1
+        rts
+
+
+  SECTION DATA
+
+regbase     dc.l    0
+
+no_emu:          dc.b    "It seems you're running under a",13,10
+                 dc.b    "mere ST.",13,10,0
+
+an_emu:          dc.b    "It seems you're running under an",13,10
+                 dc.b    "emulator.",13,10,0
+
+steem_emu:       dc.b    "You're running under Steem v"
+steem_majorv:    dc.b    "0."
+steem_minorv:    dc.b    "00.",13,10,0
+
+pacifist_emu:    dc.b    "You're running under PaCifiST v"
+pacifist_majorv: dc.b    "0."
+pacifist_minorv: dc.b    "00.",13,10,0
+
+tosbox_emu:      dc.b    "You're running under TOSBOX "
+tosbver          dcb.b   32,5
+                 dc.b    13,10,0
+
+
+ +Home +EmulatorsEmulators +TOS2WINTOS2WIN +ProtocolsProtocols + + diff --git a/en/emulators_stem.html b/en/emulators_stem.html new file mode 100644 index 000000000..74bcab108 --- /dev/null +++ b/en/emulators_stem.html @@ -0,0 +1,60 @@ + + + + + +The documentation for TOS: STEmulator + + + + + + + + + +Home +EmulatorsEmulators +MagiC PC interfaceMagiC PC interface +TOS2WINTOS2WIN + +
+ +

14.3 STEmulator

+

The STEmulator emulates a Motorola 68000 microprocessor and some +of the hardware present in an Atari ST, such as MFP, shifter, MMU or +blitter. For use a minimum of a Pentium PC and Windows 95/98/NT is +required. +

+

As of Version 1.21 a cookie is created which indicates that the +STEmulator is active. It is called STEM and its value points to the +following structure at present: +

+
struct _stemu_vars
+{
+  int16_t Version;           /* e.g. 0x0121 Version 1.21    */
+  int32_t unused             /* 0, currently not used       */
+}
+
+

Furthermore cookies are set for the language in use (_AKP), +the time display (_IDT), HD floppy drive (_FDC) and the switches +(_SWI). +

+

The cookie for the GEMDOS network extension (_FLK) is set and +the corresponding GEMDOS functions are present. +

+

The cookie MNAM points to the machine name, here: STEmulator +

+

The STEmulator makes the following GEMDOS functions available: +

+

STEFcntrl +

+
+ +Home +EmulatorsEmulators +MagiC PC interfaceMagiC PC interface +TOS2WINTOS2WIN + + diff --git a/en/emulators_tos2win.html b/en/emulators_tos2win.html new file mode 100644 index 000000000..3be79549b --- /dev/null +++ b/en/emulators_tos2win.html @@ -0,0 +1,187 @@ + + + + + +The documentation for TOS: TOS2WIN + + + + + + + + + +Home +EmulatorsEmulators +STEmulatorSTEmulator +Detecting the presence of TosBox, Steem and PaCifiSTDetecting the presence of TosBox, Steem and PaCifiST + +
+ +

14.4 TOS2WIN

+

Tos2Win Cookie +

+

To ascertain which Tos2Win version and which features are +present, as of Version 1.19 a cookie '_T2W' exists with a pointer to +the following data structure: +

+ + + + + + + + + + + + +
1 x Word Length of the structure +
1 x Word Version in BCD i.e. $0119 = Version 1.19 +
1 x Long Offset of the Atari memory in PC memory for recalculation of +pointers +
4 x Long Bit-fields for individual T2W features + +
+ +

+
Call PC-DLLs as of Version 1.19J +

+

In TOS2WIN all PC calls are introduced with the sequence $4858, +which is followed by the group code (e.g. $5043) for the DLL +functions, and is terminated with the function number (e.g. $0000). +

+

So a call of a DLL function would look as follows: +

+
Function start
+                    .
+                    .
+                    .
+                  $4858
+                  $5043
+                  $0000
+                    .
+                    .
+                    .
+Function end       RTS
+
+

The parameters for the function lie from a7 + 4 onwards. This +means placing all required parameters on the stack (always only +LONGwords) and then a bsr to function start. +

+

All pointers passed to the PC function to values in Atari memory +have to be corrected with an offset. Atari address + offset = PC +address. One can get the offset either via the Tos2Win cookie or via +the DLL function $0000. The offset does not alter during the runtime +of the program. +

+

DLL function +

+ + + + + + + + + + + + + + + +
$0000 LONG HoleOffset() +
  + + + +
Return value: Returns in d0 the offset for recalculation + +
+ +
This function can also be used to ascertain whether the +following functions are present. Just load register d0 with zero and +call the function. If there is still zero in d0, then the functions +are not implemented. +
  +
$0001 LONG OpenLibrary(Name) +
  + + + + + + +
Name : Pointer to a NULL-terminated string that contains the name of +the desired DLL, e.g. 'GDI32.DLL' (the pointer must be corrected with +the offset) +
Return value: Returns in d0 a handle to the DLL + +
+ +
$0002 VOID CloseLibrary(Handle) +
  + + + +
Handle : Handle to the DLL to be closed; when the internal Windows +counter has reached zero, the DLL is removed from memory + +
+ +
$0003 LONG GetFunctionAdress(Handle,Name) +
  + + + + + + + + + +
Handle : Handle for the DLL +
Name : Pointer to a NULL-terminated string that contains the name of +the function (pointer has to be corrected) +
Return value: Address of the function in PC memory + +
+ +
$0004 LONG CallLibraryFunction(Adr,Number,.....) +
  + + + + + + + + + + + + +
Adr : Address of the desired function +
Number : Number of parameters passed to the PC function +
.... : The corresponding parameters (pointers have to be corrected) +
Return value: Possible return value of the PC function + +
+ + +
+ +
+ +Home +EmulatorsEmulators +STEmulatorSTEmulator +Detecting the presence of TosBox, Steem and PaCifiSTDetecting the presence of TosBox, Steem and PaCifiST + + diff --git a/en/evnt.html b/en/evnt.html new file mode 100644 index 000000000..d3a269843 --- /dev/null +++ b/en/evnt.html @@ -0,0 +1,7448 @@ + + + + + +The documentation for TOS: Event library + + + + + + + + + +Home +AESAES +Editable object functionsEditable object functions +Window-dialogsWindow-dialogs + +
+ +

8.7 Event library

+

This library makes functions available with whose aid events can +be recognized and processed. As a rule, program control is released to +the operating system until the specified event has occurred. The +following routines are available for this purpose: +

+ + + + + + + + + + + + + + + + + + + + + +
evnt_button Waits for a mouse button press +
evnt_dclick Obtains/alters the double-click response rate +
evnt_keybd Waits for a keypress +
evnt_mesag Waits for a message +
evnt_mouse Waits for a move of the mouse pointer +
evnt_multi Reacts to several events +
evnt_timer Waits for a timer event + +
+ + + + + + + +
Standard messages   +
Message-list Overview of all known messages, including: +
Messages from Geneva +
RSDAEMON messages + +
+ +

Note: 'event' in this case should be understood as a +message, key press, mouse movement and button activation, timer events +etc. +

+

See also: About the AES   GEM   Style guidelines +

+

8.7.1 evnt_button

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Event button« - Wait for a mouse button event. +
  +
Opcode: 21 +
  +
Syntax: int16_t evnt_button ( int16_t ev_bclicks, int16_t ev_bmask, +int16_t ev_bstate, int16_t *ev_bmx, int16_t *ev_bmy, int16_t +*ev_bbutton, int16_t *ev_bkstate ); +
  +
Description: The call evnt_button waits for a button event, i.e. until the +mouse buttons specified in ev_bmask are set to the state +specified in ev_bstate. More exactly: +
  +
The function waits until the desired event has occurred +once. This is followed by a wait to check if the event is +repeated. If the event has occurred ev_bclickstimes or the +time set with evnt_dclick has expired), the function returns +immediately. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
ev_bclicks Maximum number of clicks before returning +
ev_bmask A bit-vector, which masks the buttons to wait for with a 1. The +following apply: +
+
+ + + + + + + + + + + + + + + +
Bit-0=Left button
Bit-1=Right button.
Bit-2=Middle button, PC-GEM
+
+ +
ev_bstate A bit-vector like ev_bmask, which specifies for each +button which state it has to reach before returning. These are: +
+
+ + + + + + + + + + +
0=Not pressed
1=Pressed
+
+ +
ev_bmx On return, contains the X and +
ev_bmy Y coordinate of the mouse pointer at the time the event +occurred +
ev_bbutton On return, contains the state of the mouse buttons when the +event occurred (as in ev_bstate) +
ev_bkstate On return contains the status of the 'special' keys of the +keyboard when the event occurred: +
+
+ + + + + + + + + + + + + + + + + + + + +
0x001=Right [Shift]
0x002=Left [Shift]
0x004=[Control]
0x008=[Alternate]
+
+ +
With a pressed key the corresponding bit will be set + +
+ +
Note: As of PC-GEM/3 the event functions support only one +mouse button. +
  +
Note 2: Specifying both left and right buttons in +ev_bmask: +
  +
ev_button(1,3,3,... +
  +
will wait until *both* buttons are pressed simultaneously. If +you wish to wait for *either* button to be pressed, then you must set +bit 8 of *ev_bclicks*: +
  +
ev_button(0x0101,3,3,... +
  +
This was documented in the December 1992 issue of ATARI.RSC (the +developer's newsletter) and is true for all releases of Atari TOS. +
  +
Return value: The function returns the number of mouse clicks that were +actually made, or, more exactly, the number of times that the mouse +button state matched ev_bstate. +
  +
Availability: All AES versions. +
  +
Group: Event library +
  +
See also: Binding   evnt_multi   Messages +
  + +
+ +

8.7.1.1 Bindings for evnt_button

+ + + + + + + + + +
C: int16_t evnt_button ( int16_t ev_bclicks, int16_t ev_bmask, +int16_t ev_bstate, int16_t *ev_bmx, int16_t *ev_bmy, int16_t +*ev_bbutton, int16_t *ev_bkstate ); +
  +
Binding: +
  +
int16_t evnt_button (int16_t ev_bclicks, int16_t ev_bmask,
+                     int16_t ev_bstate,  int16_t *ev_bmx,
+                     int16_t *ev_bmy, int16_t *ev_bbutton,
+                     int16_t *ev_bkstate )
+{
+   int_in[0] = ev_bclicks;
+   int_in[1] = ev_bmask;
+   int_in[2] = ev_bstate;
+
+   crys_if (21);
+
+   *ev_bmx     = int_out[1];
+   *ev_bmy     = int_out[2];
+   *ev_bbutton = int_out[3];
+   *ev_bkstate = int_out[4];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]21 # Function opcode
control+2control[1]3 # Entry in int_in
control+4control[2]5 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]ev_bclicks
int_in+2int_in[1]ev_bmask
int_in+4int_in[2]ev_bstate
int_outint_out[0]Return value
int_out+2int_out[1]ev_bmx
int_out+4int_out[2]ev_bmy
int_out+6int_out[3]ev_bbutton
int_out+8int_out[4]ev_bkstate
+
+ + +
+ +

8.7.2 evnt_dclick

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Event double-click« - Obtain or set the time delay between +the two clicks of a double-click. +
  +
Opcode: 26 +
  +
Syntax: int16_t evnt_dclick ( int16_t ev_dnew, int16_t ev_dgetset ); +
  +
Description: The call evnt_dclick sets or obtains the speed with which the +double-clicks of the mouse have to be made. The following apply: +
  +

+
+ + + + + + + + + + + + + + + + +
ParameterMeaning
ev_dnewNew speed from 0 (slow) to 4 (fast)
ev_dgetset0 = Get current value (ignores ev_dnew)
 1 = Set new value
+
+ +
Note: One should always bear in mind that there are +people who have problems with too fast a speed, and can then no longer +perform double-clicks! +
  +
The function is also often named evnt_dclicks in older +GEM documentation. +
  +
Return value: The function returns the applicable response rate for +double-clicks. +
  +
Availability: All AES versions. +
  +
Group: Event library +
  +
See also: Binding   Messages +
  + +
+ +

8.7.2.1 Bindings for evnt_dclick

+ + + + + + + + + +
C: int16_t evnt_dclick ( int16_t ev_dnew, int16_t ev_dgetset ); +
  +
Binding: +
  +
int16_t evnt_dclick (int16_t ev_dnew, int16_t ev_dgetset)
+{
+   int_in[0] = ev_dnew;
+   int_in[1] = ev_dgetset;
+
+   return ( crys_if(26) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]26 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]ev_dnew
int_in+2int_in[1]ev_dgetset
int_outint_out[0]Return value
+
+ + +
+ +

8.7.3 evnt_keybd

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Event keyboard« - Wait for a keyboard event +
  +
Opcode: 20 +
  +
Syntax: int16_t evnt_keybd ( void ); +
  +
Description: The call evnt_keybd waits for a keyboard event, and returns the +corresponding code. +
  +
Note: Keyboard events are always returned only to the +application that 'owns' the active window. +
  +
With TOS versions from 2.06 and 3.06 onwards, this function +is disabled for keys [0] to [9] on the numeric keypad when pressed +together with the [Alternate] key. These key combinations allow the +entry of the complete range of ASCII values (001 .. 255) by holding +down the [Alternate] key while typing in the decimal ASCII-code on the +numeric keypad. Without [Alternate] the numeric keypad operates +normally. +
  +
Return value: The function returns in bits 0..7 the ASCII-code, and in the +bits 8..15 the scancode of the pressed key. +
  +
Availability: All AES versions. +
  +
Group: Event library +
  +
See also: Binding   evnt_multi   Messages +
  + +
+ +

8.7.3.1 Bindings for evnt_keybd

+ + + + + + + + + +
C: int16_t evnt_keybd ( void ); +
  +
Binding: +
  +
int16_t evnt_keybd (void)
+{
+   return ( crys_if (20) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]20 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_outint_out[0]Return value
+
+ + +
+ +

8.7.4 evnt_mesag

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Event message« - Wait for an AES message. +
  +
Opcode: 23 +
  +
Syntax: int16_t evnt_mesag ( int16_t *msg ); +
  +
Description: The call evnt_mesag waits until a valid system message is +available in the message pipe of the application. +
  +
The parameter msg is a pointer to the 16 byte long +message buffer. +
  +
Return value: This is always the value 1. +
  +
Availability: All AES versions. +
  +
Group: Event library +
  +
See also: Binding   Messages +
  + +
+ +

8.7.4.1 Bindings for evnt_mesag

+ + + + + + + + + +
C: int16_t evnt_mesag ( int16_t *msg ); +
  +
Binding: +
  +
int16_t evnt_mesag (int16_t *msg)
+{
+   addr_in[0] = msg;
+   return ( crys_if (23) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]23 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_outint_out[0]Return value
addr_inaddr_in[0]msg
+
+ + +
+ +

8.7.5 evnt_mouse

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Event mouse« - Wait for the mouse pointer to enter or leave +a specified area of the screen. +
  +
Opcode: 22 +
  +
Syntax: int16_t evnt_mouse ( int16_t ev_moflags, int16_t ev_mox, +int16_t ev_moy, int16_t ev_mowidth, int16_t ev_moheight, int16_t +*ev_momx, int16_t *ev_momy, int16_t *ev_mobutton, int16_t *ev_mokstate +); +
  +
Description: The call evnt_mouse waits until the mouse pointer enters or +leaves a specified area of the screen. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
ev_moflags +
+
+ + + + + + + + + + +
0=Wait for mouse to enter rectangle
1=Wait for mouse to leave rectangle
+
+ +
ev_mox, X-coordinate, and +
ev_moy Y-coordinate of top left of the rectangle to be monitored +
ev_mowidth, Width, and +
ev_moheight Height of the rectangle to be monitored +
ev_momx, X-coordinate, and +
ev_momy Y-coordinate of the mouse pointer when entering or leaving the +rectangle +
ev_mobutton Status of the mouse buttons (bit 0 = left button, bit 1 = right +button) +
ev_mokstate Status of the 'special' keys when the event occurs. The +following apply: +
+
+ + + + + + + + + + + + + + + + + + + + +
0x001=Right [Shift]
0x002=Left [Shift]
0x004=[Control]
0x008=[Alternate]
+
+ + +
+ +
Return value: This is always the value 1. +
  +
Availability: All AES versions. +
  +
Group: Event library +
  +
See also: Binding   Messages +
  + +
+ +

8.7.5.1 Bindings for evnt_mouse

+ + + + + + + + + +
C: int16_t evnt_mouse ( int16_t ev_moflags, int16_t ev_mox, +int16_t ev_moy, int16_t ev_mowidth, int16_t ev_moheight, int16_t +*ev_momx, int16_t *ev_momy, int16_t *ev_mobutton, int16_t *ev_mokstate +); +
  +
Binding: +
  +
int16_t evnt_mouse (int16_t ev_moflags, int16_t ev_mox,
+                    int16_t ev_moy, int16_t ev_mowidth,
+                    int16_t ev_moheight, int16_t *ev_momx,
+                    int16_t *ev_momy, int16_t *ev_mobutton,
+                    int16_t *ev_mokstate)
+{
+   int_in[0] = ev_moflags;
+   int_in[1] = ev_mox;
+   int_in[2] = ev_moy;
+   int_in[3] = ev_mowidth;
+   int_in[4] = ev_moheight;
+
+   crys_if (22);
+
+   *ev_momx     = int_out[1];
+   *ev_momy     = int_out[2];
+   *ev_mobutton = int_out[3];
+   *ev_mokstate = int_out[4];
+
+   return (int_out[0]);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]22 # Function opcode
control+2control[1]5 # Entry in int_in
control+4control[2]5 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]ev_moflags
int_in+2int_in[1]ev_mox
int_in+4int_in[2]ev_moy
int_in+6int_in[3]ev_mowidth
int_in+8int_in[4]ev_moheight
int_outint_out[0]Return value
int_out+2int_out[1]ev_momx
int_out+4int_out[2]ev_momy
int_out+6int_out[3]ev_mobutton
int_out+8int_out[4]ev_mokstate
+
+ + +
+ +

8.7.6 evnt_multi

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Event multi« - Wait for an arbitrary event. +
  +
Opcode: 25 +
  +
Syntax: int16_t evnt_multi ( int16_t ev_mflags, int16_t ev_mbclicks, +int16_t ev_mbmask, int16_t ev_mbstate, int16_t ev_mm1flags, int16_t +ev_mm1x, int16_t ev_mm1y, int16_t ev_mm1width, int16_t ev_mm1height, +int16_t ev_mm2flags, int16_t ev_mm2x, int16_t ev_mm2y, int16_t +ev_mm2width, int16_t ev_mm2height, int16_t *ev_mmgpbuff, int16_t +ev_mtlocount, int16_t ev_mthicount, int16_t *ev_mmox, int16_t +*ev_mmoy, int16_t *ev_mmbutton, int16_t *ev_mmokstate, int16_t +*ev_mkreturn, int16_t *ev_mbreturn ); +
  +
Description: The evnt_multi call waits for a number of various events, +combining the functionality of evnt_button, evnt_keybd, evnt_mesag, +evnt_mouse and evnt_timer in one call. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    + + + + + + + + + + + + +
ev_mflags Desired event: +
MU_KEYBD      (0x0001) Keybord event +
MU_BUTTON     (0x0002) Button event +
MU_M1         (0x0004) Mouse event 1 +
MU_M2         (0x0008) Mouse event 2 +
MU_MESAG      (0x0010) Messages +
MU_TIMER      (0x0020) Timer events +
MU_WHEEL      (0x0040) Mouse-wheel, XaAES +
MU_MX         (0x0080) Mouse movement, XaAES +
MU_KEYBD4     (0x0100) GEM/4 +
MU_NORM_KEYBD (0x0100)Normalized key-codes, XaAES +
MU_DYNAMIC_KEYBD (0x0200) XaAES, not yet implemented +
X_MU_DIALOG   (0x4000) (Geneva) +
ev_mbclicks Number of clicks (see ev_bclicks in evnt_button) +
ev_mbmask Which mouse buttons should be taken into account (format see +ev_bmask in evnt_button) +
ev_mbstate Which status the mouse buttons must reach (format see +ev_bstate in evnt_button) +
ev_mm1flags Should the event be triggered by the entry (0) or leaving (1) +of the first rectangle (see ev_moflags in evnt_mouse +
ev_mm1x, X-coordinate, and +
ev_mm1y Y-coordinate of top L of 1st rectangle (see ev_mox, +ev_moy in evnt_mouse) +
ev_mm1width Width of the first rectangle (see ev_mowidth in +evnt_mouse) +
ev_mm1height Height of the first rectangle (see ev_moheight in +evnt_mouse) +
ev_mm2flags,   +
ev_mm2x,   +
ev_mm2y,   +
ev_mm2width,   +
ev_mm2height These are the corresponding parameters for the second mouse +event rectangle +
ev_mmgpbuff A 16-byte message buffer (see evnt_mesag and +ev_mgpbuff) +
ev_mtlocount Low-WORD for the timer counter (see evnt_timer) +
ev_mthicount High-WORD for the timer counter (see evnt_timer) +
Warning: Under TOS 1.0 one may not set the timer in a +desk accessory to 0, otherwise the system will hang! +
ev_mmox, The X-coordinate, and +
ev_mmoy Y-coordinate of the mouse pointer at the occurrence of the +event (see evnt_mouse, (MU_WHEEL)) +
ev_mmobutton Status of the mouse buttons at the occurrence of the event +(format see evnt_button) +
ev_mmokstate Status of the 'special' keys on the keyboard at the occurrence +of the event (format see evnt_button) +
For MU_WHEEL: Wheel number +
ev_mkreturn Scancode of the pressed key +
ev_mbreturn Number of clicks with the mouse button +
For MU_WHEEL: Number of wheel rotations + +
+ +
Note: Due to the large number of parameters to be passed +this function consumes a relatively large amount of CPU time, since +the parameters must first be stored on the stack, and then distributed +to the GEM input fields. +
  +
MU_WHEEL: +
This will only be sent if there is not a top window or the top +window doesn't have arrow widgets. +
  +
MU_MX: +
This reports ANY mouse movement to the application, +(ev_mmox, ev_mmoy), with the state of the keyboard. +
  +
MU_KEYBD4: +
Used internally in GEM/4 to check for a context-sensitive help +request. +
  +
MU_NORM_KEYBD: +
If the event mask MU_NORM_KEYBD is passed to evnt_multi the +application will receive a normalized key-code (NKCC) instead of the +standard AES key-code, together with the state of the mouse. The +mask can be used together with MU_KEYBD; if both are passed, then +MU_NORM_KEYBD prevails. The normalized key-code is in +ev_mmokstate and ev_mkreturn, both having the same +value. +
  +
X_MU_DIALOG: +
If the ev_mflags parameter has its bit 14 set, +(ev_mflags |= X_MU_DIALOG), then any mouse clicks and keyboard +actions within windows containing dialogs will cause the +ev_mwhich return value from evnt_multi to have bit 14 set. +
When this happens, ev_mmgpbuff WORD 2 contains the index +of the object within the dialog which was selected. If the object was +a TOUCHEXIT button and the user double-clicked on it, then bit 15 will +be set, similar to the way form_do works. WORD 3 of the message buffer +ev_mmgpbuff contains the window handle of the window in which +the event occurred. This feature is used in conjunction with the +wind_set option X_WF_DIALOG. +
  +
Return value: The function returns the number of the occurring event(s) in +the format specified above. +
  +
Availability: All AES versions. +
  +
Group: Event library +
  +
See also: Binding   evnt_keybd   evnt_button   evnt_mouse   evnt_mesag   +evnt_timer   evnt_dclick   Messages +
  + +
+ +

8.7.6.1 Bindings for evnt_multi

+ + + + + + + + + +
C: int16_t evnt_multi ( int16_t ev_mflags, int16_t ev_mbclicks, +int16_t ev_mbmask, int16_t ev_mbstate, int16_t ev_mm1flags, int16_t +ev_mm1x, int16_t ev_mm1y, int16_t ev_mm1width, int16_t ev_mm1height, +int16_t ev_mm2flags, int16_t ev_mm2x, int16_t ev_mm2y, int16_t +ev_mm2width, int16_t ev_mm2height, int16_t *ev_mmgpbuff, int16_t +ev_mtlocount, int16_t ev_mthicount, int16_t *ev_mmox, int16_t +*ev_mmoy, int16_t *ev_mmbutton, int16_t *ev_mmokstate, int16_t +*ev_mkreturn, int16_t *ev_mbreturn ); +
  +
Binding: +
  +
int16_t evnt_multi (int16_t ev_mflags,  int16_t ev_mbclicks,
+                    int16_t ev_mbmask,  int16_t ev_mbstate,
+                    int16_t ev_mm1flags, int16_t ev_mm1x,
+                    int16_t ev_mm1y, int16_t ev_mm1width,
+                    int16_t ev_mm1height, int16_t ev_mm2flags,
+                    int16_t ev_mm2x, int16_t ev_mm2y,
+                    int16_t ev_mm2width, int16_t ev_mm2height,
+                    int16_t *ev_mmgpbuff,
+                    int16_t ev_mtlocount,
+                    int16_t ev_mthicount, int16_t *ev_mmox,
+                    int16_t *ev_mmoy, int16_t *ev_mmbutton,
+                    int16_t *ev_mmokstate,
+                    int16_t *ev_mkreturn,
+                    int16_t *ev_mbreturn)
+{
+   int_in[0]  = ev_mflags;
+   int_in[1]  = ev_mbclicks;
+   int_in[2]  = ev_mbmask;
+   int_in[3]  = ev_mbstate;
+   int_in[4]  = ev_mm1flags;
+   int_in[5]  = ev_mm1x;
+   int_in[6]  = ev_mm1y;
+   int_in[7]  = ev_mm1width;
+   int_in[8]  = ev_mm1height;
+   int_in[9]  = ev_mm2flags;
+   int_in[10] = ev_mm2x;
+   int_in[11] = ev_mm2y;
+   int_in[12] = ev_mm2width;
+   int_in[13] = ev_mm2height;
+   int_in[14] = ev_mtlocount;
+   int_in[15] = ev_mthicount;
+   addr_in[0] = ev_mmgpbuff;
+
+   crys_if (25);
+
+   *ev_mmox      = int_out[1];
+   *ev_mmoy      = int_out[2];
+   *ev_mmbutton  = int_out[3];
+   *ev_mmokstate = int_out[4];
+   *ev_mkreturn  = int_out[5];
+   *ev_mbreturn  = int_out[6];
+
+   return (intout[0]);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]25 # Function opcode
control+2control[1]16 # Entry in int_in
control+4control[2]7 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]ev_mflags
int_in+2int_in[1]ev_mbclicks
int_in+4int_in[2]ev_mbmask
int_in+6int_in[3]ev_mbstate
int_in+8int_in[4]ev_mm1flags
int_in+10int_in[5]ev_mm1x
int_in+12int_in[6]ev_mm1y
int_in+14int_in[7]ev_mm1width
int_in+16int_in[8]ev_mm1height
int_in+18int_in[9]ev_mm2flags
int_in+20int_in[10]ev_mm2x
int_in+22int_in[11]ev_mm2y
int_in+24int_in[12]ev_mm2width
int_in+26int_in[13]ev_mm2height
int_in+28int_in[14]ev_mtlocount
int_in+30int_in[15]ev_mthicount
int_outint_out[0]Return value
int_out+2int_out[1]ev_mmox
int_out+4int_out[2]ev_mmoy
int_out+6int_out[3]ev_mmbutton
int_out+8int_out[4]ev_mmokstate
int_out+10int_out[5]ev_mkreturn
int_out+12int_out[6]ev_mbreturn
addr_inaddr_in[0]ev_mmgpbuff
+
+ + +
+ +

8.7.7 evnt_timer

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Event Timer« - Wait for a given time interval. +
  +
Opcode: 24 +
  +
Syntax: int16_t evnt_timer ( int16_t ev_tlocount, int16_t ev_thicount +); +
  +
Description: The call evnt_timer waits until a given time has passed before +releasing control to the operating system. The following apply: +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
ev_tlocountLow-WORD of time value in milliseconds
ev_thicountHigh-WORD of time value in milliseconds
+
+ +
Note: One should always use this function for +delay loops in programs. The operating system can then allocate the +CPU to another process (even without real multitasking). +
  +
Under TOS 1.0, neither parameter may be set to 0 for a desk +accessory, otherwise the system will hang. +
  +
This function cannot be relied on as an accurate clock. The +specified time is only the minimum time value, with the function +returning at some point after this time has passed. +
  +
Return value: This is always the value 1. +
  +
Availability: All AES versions. +
  +
Group: Event library +
  +
See also: Binding   Messages +
  + +
+ +

8.7.7.1 Bindings for evnt_timer

+ + + + + + + + + +
C: int16_t evnt_timer ( int16_t ev_tlocount, int16_t ev_thicount +); +
  +
Binding: +
  +
int16_t evnt_timer (int16_t ev_tlocount, int16_t ev_thicount)
+{
+   int_in[0] = ev_tlocount;
+   int_in[1] = ev_thicount;
+
+   return ( crys_if (24) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]24 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]ev_tlocount
int_in+2int_in[1]ev_thicount
int_outint_out[0]Return value
+
+ + +
+ +

8.7.8 Messages

+ +

Standard messages of the screen-manager are built up as follows: +

+ + + + + + + + + +
msg[0] Message type +
  +
msg[1] Application ID of sender +
  +
msg[2] Length of additional data; if non-zero, use appl_read to read +the additional data. Always 0 in messages sent by the AES. +
  + +
+ +

Types of standard messages: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Message Meaning +
  +
    +
  + +
AC_CLOSE (41) This is sent to a desk accessory when the current application +terminates, the screen is cleared and the window manager is +reinitialized +
  + + + +
msg[3] Identifier of the desk accessory + +
+ +
Note: This message plays practically no role in +multitasking systems any more, and is also no longer present in MagiC! +
  + +
AC_OPEN (40) A desk accessory has been activated +
  + + + +
msg[4] Identifier of the desk accessory; +
PC-GEM returns this information in msg[3]!, while KAOS 1.4.2 +sets both entries + +
+ +
Geneva has the following extension: +
If an application sends an AC_OPEN message to another application, +it can optionally set WORD 4 of the message to -1; in this case, +Geneva will automatically substitute the correct menu identifier for +the application in WORD 4. Example to open application with ID +#5: +
  +
int buf[8]im { AC_OPEN, 5, 0, my_apid, -1 }; +
appl_write( 5, 16, buf ); +
  +
Sending an AC_OPEN message to a desk accessory will cause it to +open if it is not already open, or it will make its window topmost (by +sending a WM_TOPPED message) if the desk accessory has a window open; +an application will receive a WM_TOPPED message, if it has a window +open. +
  + +
AP_DRAGDROP (63) This is a part of the Drag&Drop protocol and is sent by the +sender to the receiver +
  + + + + + + + + + + + + + + + +
msg[3] ID (handle) of the destination window +
msg[4] X-position of the mouse pointer +
msg[5] Y-position of the mouse pointer +
msg[6] Keyboard Shift status +
msg[7] 2-byte ASCII packed pipe identifier + +
+ +
Note: If a value of -1 is passed instead of a valid +window ID, then the destination of the Drag&Drop operation is no +specific window, but the application itself; in that case normally one +should open an additional window for the specified data. +
  + +
AP_RESCHG (57) With this message, which is a sub-command only found as a +possible value in AP_TERM (50), the relevant application is informed +that a resolution change is to take place; the receiver of this +message should then terminate itself as soon as possible +
  + +
AP_TERM (50) The operating system requests the application to terminate +itself; this may be necessary for a resolution change, for instance, or triggered +by a general Shutdown utility +
  + + + +
msg[5] Reason for the shutdown, so e.g. + + + + + + +
AP_TERM (General termination) +
AP_RESCHG (Resolution change) + +
+ + +
+ +
Warning: Contrary to the usual convention, the value -1 +must be entered in msg[1], as according to MagiC documentation +one can not guarantee otherwise that the desktop will react to an +[Alternate]-[Control]-[Delete] Shutdown sequence +
  +
Note: Desk accesories will always be sent AC_CLOSE +messages, not AP_TERM +
  + +
AP_TFAIL (51) This is sent by the receiver of an AC_CLOSE or AP_TERM message +if this does not wish to or cannot terminate itself +
  + +
CH_EXIT (90) This is sent to the parent process when a child terminates +
  + + + + + + +
msg[3] Child's application ID +
msg[4] Child's exit code + +
+ + +
CT_KEY (53) This is sent by the modular control field XCONTROL to be able +to evaluate key-presses that can have no effect on editable fields, +such as [Help] or [Undo], for instance +
  + + + +
msg[3] High byte: Scancode of the pressed key +
Low byte : ASCII-code of the key + +
+ + +
FNT_CHANGED (83) This is sent if GDOS fonts were loaded or unloaded at run-time. +
At the receipt of this message the reaction should be +vst_unload_fonts, followed directly by vst_load_fonts; this ensures +that the application can work with the current fonts. Then you should +check, if the fonts you are using in open documents are still +available. +
  + + + + + + + + + + + + + + + +
msg[3] Number of removed fonts +
msg[4] Number of added fonts +
msg[5] reserved (0) +
msg[6] reserved (0) +
msg[7] reserved (0) + +
+ + +
MN_SELECTED (10) This is sent when a menu option is chosen +
  + + + + + + + + + + + + + + + +
msg[3] The object index of the menu title selected +
msg[4] The object index of the menu item selected +
msg[5] Pointer to the OBJECT structure of the menu tree, as also +passed in +
msg[6] menu_bar +
msg[7] Parent of the selected entry, i.e. the object index of the +'dropped down' box that contains the entry + +
+ +
Note: The presence of the extended message (msg[5] and +following) is best inquired with appl_getinfo (opcode 9) +
  + +
PRN_CHANGED (82) This message is sent by the GDOS configuration program to all +reachable applications, to inform them about changes to device +drivers; the following apply: +
  + + + + + + +
msg[3] Device number +
msg[4] Action +
+
+ + + + + + + + + + + + + + + +
0=New
1=Changed
2=Removed
+
+ + +
+ +
After receipt of this message, an application can re-open the +corresponding workstation, for instance, obtain the current settings, +and perhaps offer a new preview +
  + +
RESCH_COMPLETED (61) This message is sent to the application that initiated a +resolution change; if no error has arisen, this must now terminate itself +
  + + + +
msg[3] Status (0 = error, 1 = OK) + +
+ + +
SC_CHANGED (80) This message should be sent by a program to all other +applications in the system when the contents of the GEM clipboard +have been changed +
  + + + + + + + + + + + + + + + +
msg[3] Description of the file format: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
0x0000 = No more exact specification +
0x0001 = Data for a database +
0x0002 = Text files +
0x0004 = Vector graphics +
0x0008 = Raster graphics +
0x0010 = Spreadsheet data +
0x0020 = Samples, MIDI files, Sound +
0x0040 = Archive files (e.g. ".zip", ".lzh") +
0x8000 = System files (e.g. colour palettes) + +
+ +
If possible the format 0x0000 should be avoided! +
msg[4] 4 characters that describe the "best" and +format (least loss of information) for +
msg[5] the data import; example ".RTF" rather than +".TXT" +
msg[6] Reserved, 0 +
msg[7] Reserved, 0 + +
+ + +
SH_WDRAW (72) This message should be sent by an application to the system +shell when the contents of a drive has been changed; following this +the shell can update the corresponding window +
  + + + +
msg[3] Drive (0 = A:, 1 = B:, etc) + +
+ +
Note: A value of -1 means that the shell should update +all windows +
  + +
SHUT_COMPLETED (60) This is sent by the operating system to the initiator of a +Shutdown when all other applications have already been informed about +this and have reacted positively +
  + + + + + + + + + + +
SM_M_SPECIAL (101) This message is only available under MagiC (as of Version +2.0), and must be sent to the screen-manager +
  + + + + + + + + + + + + + + + +
msg[3] 0 +
msg[4] 'MA' +
msg[5] 'GX' +
msg[6] Desired action; the following apply: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
0 = Perform a redraw +
1 = Terminate an application +
2 = Switch to an application +
3 = Freeze an application +
4 = Thaw out an application again +
5 = No information known at present +
6 = Unhide all applications +
7 = Hide other applications +
8 = Hide current application + +
+ +
msg[7] 0 + +
+ +
Note: The codes 6..8 of msg[6] are available only as of +MagiC Version 3.1. For "Perform a redraw" and "Unhide +all applications" the ID to be passed must be that of the screen-manager +(1). +
  + +
THR_EXIT (88) This message is sent to the thread or the application that +created the terminated thread; the following apply: +
  + + + + + + + + + +
msg[3] AES ID of the terminated thread +
msg[4] Return value or error-code as a +
msg[5] LONG value + +
+ + +
WM_ALLICONIFY (36) All windows of the application should be collected up in one +iconified window +
  + + + + + + + + + + + + +
msg[4] X-coordinate, and +
msg[5] Y-coordinate of top left of the iconified window +
msg[6] Width, and +
msg[7] Height of the iconified window + +
+ + + + + + + + + + + +
WM_ARROWED (24) This message is sent to an application to tell it that one of +its slider widgets (arrow or scroll bar) was clicked on; the following +apply: +
  + + + + + + +
msg[3] The handle (ID) of the window +
msg[4] One of the following values: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
WA_UPPAGE (0) = Page up +
WA_DNPAGE (1) = Page down +
WA_UPLINE (2) = Row up +
WA_DNLINE (3) = Row down +
WA_LFPAGE (4) = Page left +
WA_RTPAGE (5) = Page right +
WA_LFLINE (6) = Column left +
WA_RTLINE (7) = Column right +
WA_WHEEL  (8) = See below + +
+ + +
+ +
As of XaAES v0.960 there is an extension of this message, since +it has new drivers for a wheeled mouse: +
  + + + + + + + + + +
msg[5] 'MW' (0x4d57) or 'Mw' (0x4d77) +
'MW' (0x4d57) For the first mouse-wheel turn +
'Mw' (0x4d77) For each further turn +
  +
msg[6] 0 +
  +
msg[7] Current number of mouse-wheel turns; with this one can add +together several turns, for instance for movement of the slider +
  + +
+ +
But there is also the possibility of obtaining with WF_WHEEL +real messages about mouse-wheel +
  + + + + + + + + + +
msg[4] WA_WHEEL (8) +
  +
msg[6] Index of the wheel +
  +
msg[7] Number of mouse-wheel turns; with this one can add together +several turns, for instance for movement of the slider +
  + +
+ +
If WINX is installed one can get an extended WM_ARROWED message: +
  + + + + + + + + + +
msg[5] Negates the speed factor for msg[4] +
  +
msg[6] Scroll type and direction, possible values as in msg[4] +
  +
msg[7] Negated speed factor for msg[6] +
  + +
+ +
One should proceed as follows: +
If [5] >=0, then we are dealing with a normal scroll message +
If [5] < 0, then one negates the value and obtains the factor +for [4] +
If [7] < 0, then one negates the value and obtains the factor +for [6] +
Otherwise [6] will be ignored +
  +
Example: +
If one receives [WM_ARROWED 1 0 win WA_DNLINE -2 WA_RTLINE -1] for +instance, then one should scroll two lines downwards and one column to +the right +
  + +
WM_BACKDROPPED (31) +
  + + + +
msg[3] Handle (ID) of the window in question + +
+ +
The application receives this message when operating the +backdrop button of the window. This message is present only in KAOS +1.4.2 as well as MagiC 1 and 2; since MagiC Version 3, WM_BOTTOMED is +sent. +
  + +
WM_BOTTOMED (33) This is used by the screen-manager to request that the application +should place a window in the background. In some TOS versions this +is triggered by [Shift]-clicking on the window's mover bar; with MagiC +(as of version 3) there is an extra widget for this (3rd from the right at +the top). +
  + + + +
msg[3] Handle (ID) of the window in question + +
+ +
Note: The window can then be simply placed by the +application in the background with wind_set (msg[3], WF_BOTTOM, 0, 0 +,0, 0). Under MagiC 2.0 this message is still called WM_M_BDROPPED. +
  + +
WM_CLOSED (22) This message is sent when the user clicks on a window's +'Closer' widget (top left corner), signalling that the topped window +should be closed +
  + + + +
msg[3] The handle (ID) of the window + +
+ + +
WM_FULLED (23) This message is sent when the user clicks on the top window's +'Fuller' widget (top right corner) +
  + + + +
msg[3] Handle (ID) of the window that is to be brought to its full +size + +
+ + +
WM_HSLID (25) This message is sent when the horizontal slider of the scroll bar has been +moved +
  + + + + + + +
msg[3] Handle (ID) of the window +
msg[4] The new slider position: +
+
+ + + + + + + + + + +
0000=Far left
1000=Far right
+
+ + +
+ + +
WM_ICONIFY (34) This message is sent when the user clicks on the 'Iconify' +widget of a window (top, second rom the right), signifying that a +window of the application is to be iconified +
  + + + + + + + + + + + + + + + +
msg[3] Handle (ID) of the window in question +
msg[4] X-coordinate, and +
msg[5] Y-coordinate of top left of the iconified window +
msg[6] Width, and +
msg[7] Height of the iconified window + +
+ + +
WM_M_BDROPPED (100) This is used by the screen-manager to request that the application +should place a window in the background (say when the 'Backdrop' button +is activated). As of MagiC 3 this opcode is no longer sent, but +WM_BOTTOMED is used instead. +
  + + + +
msg[3] Handle (ID) of the window in question + +
+ + +
WM_MOVED (28) This message is sent when the user moves the whole window by +dragging a window's title-bar +
  + + + + + + + + + + + + + + + +
msg[3] Handle (ID) of the window +
msg[4] New X-coordinate, and +
msg[5] New Y-coordinate of top left of window +
msg[6] New window width (unchanged) +
msg[7] New window height (unchanged) + +
+ + +
WM_NEWTOP (29) This message is sent when a window has been topped (brought to +the front) +
  + + + +
msg[3] Handle (ID) of the window + +
+ + +
WM_ONTOP (31) This message is sent when a window (after closing or +deactivating another window) becomes the top (current or active) one +
  + + + +
msg[3] Handle (ID) of the window in question + +
+ +
Note: By the time the message arrives the window stack +may have already changed again; the message is sent only when the +application has not itself issued a call to place the window in the +foreground +
  +
Messages of this type are coalesced in the AES message +buffer. It follows from this that at all times the last message of +this type will be received; thus there cannot be several of these +messages in the buffer. +
  + +
WM_REDRAW (20) This message warns an application that a part of the window +area must be redrawn +
  + + + + + + + + + + + + + + + +
msg[3] Handle (ID) of the window +
msg[4] X-coordinate of the top left corner of the window area to +redraw +
msg[5] Y-coordinate of the top left corner of the window area to +redraw +
msg[6] Width of the portion of the window area to redraw +
msg[7] Height of the portion of the window area to redraw + +
+ + +
WM_SHADED (22360) This message is sent when a window has been 'shaded' (by +double-clicking its title-bar so that only the title-bar remains visible +
  + + + +
msg[3] Handle (ID) of the window + +
+ + +
WM_SIZED (27) This message occurs when the user alters the window's size (by +dragging the window's 'Sizer' widget at the bottom right corner) +
  + + + + + + + + + + + + + + + +
msg[3] Handle (ID) of the window +
msg[4] New X-coordinate, and +
msg[5] New Y-coordinate of the window's top left corner (both +unchanged) +
msg[6] New window width +
msg[7] New window height + +
+ + +
WM_TOOLBAR (37) This message is sent when a toolbar object is clicked on; the +following apply: +
  + + + + + + + + + + + + +
msg[3] Handle (ID) of the window +
msg[4] Object clicked on +
msg[5] Number of mouse clicks +
msg[6] Keyboard state of [Shift], [Alternate] and [Control] + +
+ +
Note: All objects of the toolbox should have the +TOUCHEXIT flag set. This does not apply for XaAES, for which there is +an additional value: +
  + + + +
msg[7] Current object in which the text cursor is positioned +
  + +
+ + +
WM_TOPPED (21) This message is sent when an application window which is not +currently topped is clicked on by the user to move it to the top (made +active) +
  + + + +
msg[3] The handle (ID) of the window + +
+ + +
WM_UNICONIFY (35) This message is sent when the user double-clicks one or more +iconified windows of an application to uniconify it/them; if several +windows are affected (WM_ALLICONIFY) then it is up to the application +alone to process this, as the AES does not make available any +information about the windows in question, including their positions +or dimensions +
  + + + + + + + + + + + + + + + +
msg[3] Handle (ID) of the window in question +
msg[4] X-coordinate, and +
msg[5] Y-coordinate of top left corner of the uniconified window +
msg[6] Width, and +
msg[7] Height of the uniconified window + +
+ + +
WM_UNSHADED (22361) This message is sent when a window has been 'unshaded' (by +again double-clicking its title-line) to make the whole window visible +
  + + + +
msg[3] Handle (ID) of the window + +
+ + +
WM_UNTOPPED (30) This message is sent when the current window has been sent +behind one or more windows due to another window becoming the active +one +
  + + + +
msg[3] Handle (ID) of the window in question + +
+ +
Note: By the time the message arrives the window stack +may have already changed again; the message is sent only when the +application has not itself issued a call to place the window in the +background +
  + +
WM_VSLID (26) This message indicates that the vertical slider of the scroll bar has +been moved +
  + + + + + + +
msg[3] Handle (ID) of the window +
msg[4] The new slider position: +
+
+ + + + + + + + + + +
0000=At the very top
1000=At the very bottom
+
+ + +
+ + +
+ +

Support of the newer message types can be inquired with appl_getinfo +(opcode 12). Incidentally, for user-defined messages Digital +Research has suggested message numbers beyond 1024. +

+

About the size of the message buffer: +

+

An individual application should not use more than 16 windows +under MagiC 2.0, as otherwise the message buffer of the system can +overflow and possibly redraws can no longer be performed. +

+

See also: evnt_multi   evnt_mesag   AV protocol   OLGA protocolDrag&Drop +

+

8.7.9 Message-list

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HexDecNamePresent in
$000a10MN_SELECTED
$001420WM_REDRAW
$001521WM_TOPPED
$001622WM_CLOSED
$001723WM_FULLED
$001824WM_ARROWED
$001925WM_HSLID
$001a26WM_VSLID
$001b27WM_SIZED
$001c28WM_MOVED
$001d29WM_NEWTOP
$001e30WM_UNTOPPED
$001f31WM_ONTOP
$001f31WM_BACKDROPPEDKAOS 1.4.2
$002032WM_OFFTOPMultiGEM
$002133WM_BOTTOMED
$002234WM_ICONIFY
$002335WM_UNICONIFY
$002436WM_ALLICONIFY
$002537WM_TOOLBAR
$002638WM_REPOSEDXaAES
$002840AC_OPEN
$002941AC_CLOSE
$002b43WM_ISTOPMultiGEM
$003250AP_TERM
$003250CT_UPDATEDR
$003351AP_TFAIL
$003351CT_MOVEDR
$003452CT_NEWTOPDR
$003452AP_AESTERMN.AES
$003553CT_KEYXControl
$003957AP_RESCHG
$003c60SHUT_COMPLETED
$003d61RESCH_COMPLETED
$003f63AP_DRAGDROP
$004670TDI_QuestionTDI-Modula
$004771TDI_AnswerTDI-Modula
$004872SH_WDRAW
$005080SC_CHANGED
$005282PRN_CHANGEDNVDI
$005383FNT_CHANGEDNVDI
$005484COLORS_CHANGEDNVDI
$005888THR_EXIT
$005989PA_EXITMagiC 3
$005a90CH_EXIT
$0064100WM_M_BDROPPEDMagiC
$0064100DruckauftragCALCLOCK, from DR
$0065101SM_M_SPECIALMagiC
$0065101Druckauftrag emfpangenCALCLOCK, from DR
$0066..$006d102..109SM_M_RESMagiC (intern)
$006e..$00c7110..199reserviertScreen-Manager
$00c8200PRT_MSGOutput
$00c9201STRT_MSGOutput
$00ca202QUIT_MSGOutput
$00cb..$0158203..344reserviertScreen-Manager
$0159345WM_WHEELXaAES
$015a..$03e7346..999reserviertScreen-Manager
$03e81000SCRAP_OKScrap
$03e91001SCRAP_NOTOKScrap
$03ea1002SCRAP_UPDTScrap
$03eb1003SCRAP_OPENScrap
$03ec..$03ff1004..1023reserviertScreen-Manager
$03fd1021SHOWMultiGEM2
$03ff1023HIDEMultiGEM2
$04001024ACC_IDXAcc Protocol
$04011025ACC_OPENXAcc Protocol
$04021026ACC_CLOSEXAcc Protocol
$04031027ACC_ACCXAcc Protocol
$04041028ACC_EXITXAcc Protocol
$04381080MYOSD_DISPLAYMyOSD
$04391081MYOSD_OKMyOSD
$043A1082MYOSD_NOKMyOSD
$04801152ACC_REQUESTXAcc Protocol
$04811153ACC_REPLYXAcc Protocol
$05001280ACC_ACKXAcc Protocol
$05011281ACC_TEXTXAcc Protocol
$05021282ACC_KEYXAcc Protocol
$05031283ACC_METAXAcc Protocol
$05041284ACC_IMGXAcc Protocol
$05101296ACC_GETDSIXAcc Protocol
$05111297ACC_DSINFOXAcc Protocol
$05121298ACC_FILEINFOXAcc Protocol
$05131299ACC_GETFIELDSXAcc Protocol
$05141300ACC_FIELDINFOXAcc Protocol
$05201312ACC_FORCESDFXAcc Protocol
$05211313ACC_GETSDFXAcc Protocol
$04011025AC_HELPPureC-Help Protocol
$04021026AC_REPLYPureC-Help Protocol
$04031027AC_VERSIONPureC-Help Protocol
$04041028AC_COPYPureC-Help Protocol
$0708..$07101800..1808interne KommunikationHänisch Modula-2
$07d02000MSG_IDENTIFYSTalker
$07d12001MSG_SLEEPSTalker
$07d22002MSG_WAKESTalker
$07d32003MSG_DISPLAYSTalker
$07d42004MSG_INFOSTalker
$07d52005MSG_CONFIGSTalker
$07d62006MSG_BUFFERSTalker
$07d72007MSG_RESOURCESTalker
$07d82008MSG_SENDSTRINGSTalker
$07d92009MSG_KEYSTROKESTalker
$07da2010MSG_EXECUTE_SCRIPTSTalker
$07db2011MSG_ENABLESTalker
$07db2011INST_CURSORHFB-Hausfinanzbuchhaltung
$07dc2012CHANGE_MENUHFB-Hausfinanzbuchhaltung
$07dd2013PUT_VORGABE_DO2HFB-Hausfinanzbuchhaltung
$07de2014PUT_VORGABE_EIGENTHFB-Hausfinanzbuchhaltung
$07df2015PUT_DATA_IN_BOXHFB-Hausfinanzbuchhaltung
$07e02016MY_WM_ONTOPHFB-Hausfinanzbuchhaltung
$09302352WM_MOUSEWHEEL
$09352357WIND_DATA
$09362358DO_WPOPUPDirUp
$09912449Holger Weets
$09942452ICON_MSGASH-EMailer
$09952453RSDAEMON_MSGPPP-Connect
$09962454DD_STRING
$09972455WISEL_MSG
$09982456MSG_NOEVENT
$09992457WINCOM_MSG
$0a2b2603TOPW_OPENEDManager
$0a912705FILE_UPDATEDManager
$0c943220ASK_ALTA_LISTAAlta Lista
$0c95..$0c9d3221..3229reserviertAlta Lista
$0c9e3230AL_ReplyAlta Lista
$0cf13313TWSTARTTosWin2, tw-call
$0cf23314TWOKTosWin2, tw-call
$0cf33315TWWRITETosWin2, tw-call
$0cf43316TWREADTosWin2, tw-call
$0cf53317TWERRTosWin2, tw-call
$0cf63318TWTOPTosWin2, tw-call
$0cf73319TWSHELLTosWin2, tw-call
$0fa04000PENGUIN_VersionHomePage Penguin
$0fa14001PENGUIN_ReplyHomePage Penguin
$0fa2..$0faf4002..4015reserviertHomePage Penguin
$10004096WM_SAVEMenü Protocol
$10014097WM_SAVEASMenü Protocol
$10024098WM_PRINTMenü Protocol
$10034099WM_UNDOMenü Protocol
$10044100WM_CUTMenü Protocol
$10054101WM_COPYMenü Protocol
$10064102WM_PASTEMenü Protocol
$10074103WM_SELECTALLMenü Protocol
$10084104WM_FINDMenü Protocol
$10094105WM_REPLACEMenü Protocol
$100a4106WM_FINDNEXTMenü Protocol
$100b4107WM_HELPMenü Protocol
$100c4108WM_DELETEMenü Protocol
$10654197IDC_FROM_ACCIDC
$10a54261IDC_WAKE_UPIDC
$10e54325IDC_FROM_APPIDC
$11504432JINNEE_MSG
$12354661GO_PRIVATEObjectGEM
$12364662OLGA_INITOLGA-Protocol
$12384664OLGA_UPDATEOLGA-Protocol
$12394665OLGA_ACKOLGA-Protocol
$123a4666OLGA_RENAMEOLGA-Protocol
$123b4667OLGA_OPENDOCOLGA-Protocol
$123c4668OLGA_CLOSEDOCOLGA-Protocol
$123d4669OLGA_LINKOLGA-Protocol
$123e4670OLGA_UNLINKOLGA-Protocol
$123f4671OLGA_UPDATEDOLGA-Protocol
$12404672OLGA_RENAMELINKOLGA-Protocol
$12414673OLGA_LINKRENAMEDOLGA-Protocol
$12424674OLGA_GETOBJECTSOLGA-Protocol
$12434675OLGA_OBJECTSOLGA-Protocol
$12444676OLGA_BREAKLINKOLGA-Protocol
$12454677OLGA_LINKBROKENOLGA-Protocol
$12464678OLGA_STARTOLGA-Protocol
$12474679OLGA_GETINFOOLGA-Protocol
$12484680OLGA_INFOOLGA-Protocol
$12494681OLGA_IDLEOLGA-Protocol
$124a4682OLGA_ACTIVATEOLGA-Protocol
$124b4683OLGA_EMBEDOLGA-Protocol
$124c4684OLGA_EMBEDDEDOLGA-Protocol
$124d4685OLGA_UNEMBEDOLGA-Protocol
$124e4686OLGA_GETSETTINGSOLGA-Protocol
$124f4687OLGA_SETTINGSOLGA-Protocol
$12504688OLGA_REQUESTNOTIFICATIONOLGA-Protocol
$12514689OLGA_RELEASENOTIFICATIONOLGA-Protocol
$12524690OLGA_NOTIFYOLGA-Protocol
$12534691OLGA_NOTIFIEDOLGA-Protocol
$12544692OLGA_SERVERTERMINATEDOLGA-Protocol
$12554693OLGA_CLIENTTERMINATEDOLGA-Protocol
$12564694OLGA_INPLACEUPDATEOLGA-Protocol
$12574695OLGA_ID4UPDATEOLGA-Protocol
$12584696OLGA_GETEXTENSIONOLGA-Protocol
$12594697OLGA_EXTENSIONOLGA-Protocol
$125a4698OLGA_GETSERVERPATHOLGA-Protocol
$125b4699OLGA_SERVERPATHOLGA-Protocol
$125c4700OLGA_IE_BUTTONOLGA-Protocol
$125d4701OLGA_IE_KEYOLGA-Protocol
$125e..$126f4702..4719reserviertOLGA-Protocol
$126f4719SSP_SRASRSystem Services Protocol
$12704720SSP_SSIRSystem Services Protocol
$12714721SSP_SPASISystem Services Protocol
$12724722SSP_SSURSystem Services Protocol
$12734723SSP_SPASASystem Services Protocol
$12744724SSP_SSASystem Services Protocol
$1275..$128d4725..4738reservedSystem Services Protocol
$13504944GS_REQUESTGEMScript Protocol
$13514945GS_REPLYGEMScript Protocol
$13524946GS_COMMANDGEMScript Protocol
$13534947GS_ACKGEMScript Protocol
$13544948GS_QUITGEMScript Protocol
$13554949GS_OPENMACROGEMScript Protocol
$13564950GS_MACROGEMScript Protocol
$13574951GS_WRITEGEMScript Protocol
$13584952GS_CLOSEMACROGEMScript Protocol
$17706000_ASSIGNMIDI_COM
$17716001_GOOD_BYEMIDI_COM
$17726002_SEND_DATAMIDI_COM
$17736003_PRINTMIDI_COM
$17746004_WAIT_TOKENMIDI_COM
$17756005_FREE_TOKENMIDI_COM
$17776007_UNITIMEMIDI_COM
$17786008_STOP_RINGMIDI_COM
$17796009_GET_VERWMIDI_COM
$178e6030_PRKONFMIDI_COM
$17956037_SHUTDOWNMIDI_COM
$17966038_VERSIONMIDI_COM
$19706512RS_INITIATERelationships
$19716513RS_TERMINATERelationships
$19726514RS_ACKRelationships
$19736515RS_HELLORelationships
$19746516RS_BYERelationships
$19756517RS_LINKRelationships
$19766518RS_UNLINKRelationships
$19776519RS_DATARelationships
$19786520RS_OPENRelationships
$1a0066561ADDR_INIT1st Address
$1a0166571ADDR_SEARCH1st Address
$1a0266581ADDR_INPUT1st Address
$1a0366591ADDR_SORT1st Address
$1a0466601ADDR_ALL1st Address
$1a0566611ADDR_REPLACE1st Address
$1a0666621ADDR_DELETE1st Address
$1a8067841ADDR_ANSW_INIT1st Address
$1a8167851ADDR_ANSW_SEARCH1st Address
$1a8267861ADDR_ANSW_INPUT1st Address
$1a8367871ADDR_ANSW_SORT1st Address
$1a8467881ADDR_ANSW_ALL1st Address
$1a8567891ADDR_ANSW_REPLACE1st Address
$1a8667901ADDR_ANSW_DELETE1st Address
$1aff69111ADDR_QUIT1st Address
$1f408000GM_SHOW_FILEGREPIT
$1f418001GM_OPEN_DIALOGGREPIT
$1f428002GM_OPEN_PRGINFOGREPIT
$2f1012048KOBOLD_JOBKobold Protocol
$2f1112049KOBOLD_JOB_NO_WINDOWKobold Protocol
$2f1212050KOBOLD_ANSWERKobold Protocol
$2f1312051KOBOLD_CONFIGKobold Protocol
$2f1412052KOBOLD_FIRST_SLCTKobold Protocol
$2f1512053KOBOLD_NEXT_SLCTKobold Protocol
$2f1612054KOBOLD_CLOSEKobold Protocol
$2f1712055KOBOLD_FREE_DRIVESKobold Protocol
$3d00..$3d7f15616..15743CAD-3D_Request_xxxCAD-3D
$3d80..$3dff15744..15871CAD-3D_Reply_xxxCAD-3D
$414B16715'AK'MG-Copy -> MagxDesk
$415016720 Aniplayer
$420016896SE_INITSE-Protocol
$420116897SE_OKSE-Protocol
$420216898SE_ACKSE-Protocol
$420316899SE_OPENSE-Protocol
$420416900SE_ERRORSE-Protocol
$420516901SE_ERRFILESE-Protocol
$420616902SE_PROJECTSE-Protocol
$420716903SE_QUITSE-Protocol
$420816904SE_TERMINATESE-Protocol
$420916905SE_CLOSESE-Protocol
$424016960ES_INITSE-Protocol
$424116961ES_OKSE-Protocol
$424216962ES_ACKSE-Protocol
$424316963ES_COMPILESE-Protocol
$424416964ES_MAKESE-Protocol
$424516965ES_MAKEALLSE-Protocol
$424616966ES_LINKSE-Protocol
$424716967ES_EXECSE-Protocol
$424816968ES_MAKEEXECSE-Protocol
$424916969ES_PROJECTSE-Protocol
$424a16970ES_QUITSE-Protocol
$424b16971ES_SHLCTRLSE-Protocol
$440017408WM_DESTROYWinDom
$440117409WM_MNSELECTEDWinDom
$440217410WM_FORMWinDom
$440317411AP_LOADCONFWinDom
$440417412AP_BUTTONWinDom
$440517413AP_KEYBDWinDom
$441017424AP_DEBUGWinDom
$441117425WM_UPLINEWinDom
$441217426WM_DNLINEWinDom
$441317427WM_LFLINEWinDom
$441417428WM_RTLINEWinDom
$441517429WM_UPPAGEWinDom
$441617430WM_DNPAGEWinDom
$441717431WM_LFPAGEWinDom
$441817432WM_RTPAGEWinDom
$441917433WM_PREREDRAWWinDom
$451117681eb_dump_capture_fullscreenEB DUMP
$451217682eb_dump_capture_windowEB DUMP
$451317683eb_dump_capture_mouseEB DUMP
$451417684eb_dump_disable_selectorEB DUMP
$451517685eb_dump_enable_selectorEB DUMP
$451617686eb_dump_disable_windframeEB DUMP
$451717687eb_dump_enable_windframeEB DUMP
$456017760FILE_SELECTEDFreedom
$456417764AF_DOALERTFreedom Protocol
$456517765FA_ALERTISOPENFreedom Protocol
$456617766FA_ALERTDONEFreedom Protocol
$456717767AF_DOFSELECTFreedom Protocol
$456817768FA_FSELISOPENFreedom Protocol
$456917769FA_FSELCLOSEDFreedom Protocol
$457017776AF_CLOSEACKFreedom Protocol
$457117777AF_SENDREDRAWFreedom Protocol
$460017920BA_BUBBLE_REQUESTTrouble Bubble
$460117921AB_OPEN_BUBBLETrouble Bubble
$460217922BA_BUBBLE_OPENEDTrouble Bubble
$460317923AB_CLOSE_BUBBLETrouble Bubble
$460417924BA_BUBBLE_CLOSEDTrouble Bubble
$46ff18175THING_CMDThing
$470018176AV_PROTOKOLLAV Protocol
$470118177VA_PROTOSTATUSAV Protocol
$470318179AV_GETSTATUSAV Protocol
$470418180AV_STATUSAV Protocol
$470518181VA_SETSTATUSAV Protocol
$470918185AV_SENDCLICKAV Protocol
$471018192AV_SENDKEYAV Protocol
$471118193VA_STARTAV Protocol
$471218194AV_ASKFILEFONTAV Protocol
$471318195VA_FILEFONTAV Protocol
$471418196AV_ASKCONFONTAV Protocol
$471518197VA_CONFONTAV Protocol
$471618198AV_ASKOBJECTAV Protocol
$471718199VA_OBJECTAV Protocol
$471818200AV_OPENCONSOLEAV Protocol
$471918201VA_CONSOLEOPENAV Protocol
$472018208AV_OPENWINDAV Protocol
$472118209VA_WINDOPENAV Protocol
$472218210AV_STARTPROGAV Protocol
$472318211VA_PROGSTARTAV Protocol
$472418212AV_ACCWINDOPENAV Protocol
$472518213VA_DRAGACCWINDAV Protocol
$472618214AV_ACCWINDCLOSEDAV Protocol
$472818216AV_COPY_DRAGGEDAV Protocol
$472918217VA_COPY_COMPLETEAV Protocol
$473018224AV_PATH_UPDATEAV Protocol
$473218226AV_WHAT_IZITAV Protocol
$473318227VA_THAT_IZITAV Protocol
$473418228AV_DRAG_ON_WINDOWAV Protocol
$473518229VA_DRAG_COMPLETEAV Protocol
$473618230AV_EXITAV Protocol
$473818232AV_STARTEDAV Protocol
$473918233VA_FONTCHANGEDAV Protocol
$474018240AV_XWINDAV Protocol
$474118241VA_XOPENAV Protocol
$474218242GBGFA-Basic Editor
$475118257AV_VIEWAV Protocol
$475218258VA_VIEWEDAV Protocol
$475318259AV_FILEINFOAV Protocol
$475418260VA_FILECHANGEDAV Protocol
$475518261AV_COPYFILEAV Protocol
$475618262VA_FILECOPIEDAV Protocol
$475718263AV_DELFILEAV Protocol
$475818264VA_FILEDELETEDAV Protocol
$475918265AV_SETWINDPOSAV Protocol
$475a18266GZ_PRIVATEGSZRZ Z-Modem
$476018272VA_PATH_UPDATEAV Protocol
$4790..$479918320..18329Mafia 2
$479818328VA_SERVER_INFOAV-Server
$479918329AV_SERVER_INFOAV-Server
$480018432MP_ACKPaula Protocol
$480118433MP_NAKPaula Protocol
$480218434MP_STARTPaula Protocol
$480318435MP_STOPPaula Protocol
$480418436MP_SHUTDOWNPaula Protocol
$488818568SEND_TRACETracer
$488918569ANSWER_TRACETracer
$494D18765IM_COMImagine graphic driver IM_COL.ACC
$495018768OLE_INITOLE Protocol
$495018768IP_DIAL_REQUESTQdialer
$495118769OLE_EXITOLE Protocol
$495118769IP_DIAL_HANGUPQdialer
$495218770OLE_NEWOLE Protocol
$495218770IP_DIAL_DONEQdialer
$495318771IP_DIAL_ERRORQdialer
$495418772IP_HANGUP_DONEQdialer
$495518773IP_STATUS_GETQdialer
$4b4819272DA_KNOWHOW
$4c0119457AT_PERGAMONPEGASUS, SCHECKS, EVER, TARKUS
$4c4a19530LDG_QUITLDG
$4c4d19533LDG_LOST_LIBLDG
$4d0019712MOD_OKTetrax
$4d0119713MOD_NAKTetrax
$4d0219714MOD_PLAYTetrax
$4d0319715MOD_STOPTetrax
$4d0419716MOD_LOADTetrax
$4d0519717MOD_CLEARTetrax
$4d5019762 M_PLAYER
$4e2020000VTX_GET_BIN_PAGEVideotext Protocol
$4e2120001VTX_GET_ASCII_PAGEVideotext Protocol
$4e5220050VTX_FOUNDVideotext Protocol
$4e5320051VTX_NOTFOUNDVideotext Protocol
$4e5420052VTX_PROCESSKILLEDVideotext Protocol
$4e5520053VTX_TERMVideotext Protocol
$4f4d20301M_ASKVARInterface
$4f4e20302M_SENDVARInterface
$500020480PDF_AV_OPEN_FILEMyPDF
$500120481PDF_AV_CLOSE_FILEMyPDF
$500220482PDF_AV_PRINT_FILEMyPDF
$500320483PDF_AV_FIND_WORDMyPDF
$500420484PDF_AV_SHOW_INFOMyPDF
$500520485PDF_AV_GET_INFOMyPDF
$501020496MYTASK_STARTMyTask
$501120497MYTASK_NEW_COLORMyTask
$501220498MYTASK_NEW_ICONMyTask
$501320499MYTASK_DELETE_ICONMyTask
$501420500MYTASK_ICON_CLICKMyTask
$501520501MYTASK_BUTTONMyTask
$501620502MYTASK_NEW_WINDOWMyTask
$501720503MYTASK_NAMEMyTask
$501820504MYTASK_GET_SIZEMyTask
$501920505MYTASK_BUBBLE_CHANGEMyTask
$501a20506MYTASK_ICON_ERRORMyTask
$501b20507MYTASK_CHANGED_OPTIONSMyTask
$501c20508MYTASK_SEND_OPTIONSMyTask
$520821000OEP_OKObject Exchange Protocol (OEP)
$520921001OEP_CONFIGObject Exchange Protocol (OEP)
$520a21002OEP_INFOObject Exchange Protocol (OEP)
$520b21003OEP_LINKObject Exchange Protocol (OEP)
$520c21004OEP_RESObject Exchange Protocol (OEP)
$520d21005OEP_UPDATEObject Exchange Protocol (OEP)
$520e21006OEP_DATAObject Exchange Protocol (OEP)
$520f21007OEP_CHANGEDObject Exchange Protocol (OEP)
$521021008OEP_SERVJOBObject Exchange Protocol (OEP)
$521121009OEP_TAKEOVERObject Exchange Protocol (OEP)
$521221010OEP_RES0Object Exchange Protocol (OEP)
$521321011OEP_RES1Object Exchange Protocol (OEP)
$521421012OEP_RES2Object Exchange Protocol (OEP)
$521521013OEP_RES3Object Exchange Protocol (OEP)
$521621014OEP_RES4Object Exchange Protocol (OEP)
$521721015OEP_RES5Object Exchange Protocol (OEP)
$521821016OEP_RES6Object Exchange Protocol (OEP)
$521921017OEP_RES7Object Exchange Protocol (OEP)
$521a21018OEP_RES8Object Exchange Protocol (OEP)
$521b21019OEP_RES9Object Exchange Protocol (OEP)
$530021248SRTY_SETUPSecurity
$530121249SRTY_GETDEVSSecurity
$530221250SRTY_DEVSTATSecurity
$534321315SH_CHANGEDIFormats-CPXe
$534621318 STarFax
$535421332 XaAESnap
$560022016VIEW_FILEView Protocol
$560122017VIEW_FAILEDView Protocol
$560222018VIEW_OPENView Protocol
$560322019VIEW_CLOSEDView Protocol
$560422020VIEW_DATAView Protocol
$561022032VIEW_GETMFDBView Protocol
$561122033VIEW_SETMFDBView Protocol
$561222034VIEW_MFDBView Protocol
$5613..$56ff22035..22271reservedView Protocol
$564622086 ViewFax
$575822360WM_SHADEDWINX
$575922361WM_UNSHADEDWINX
$636825448CHTW_MSGChatwin
$640025600che_existCHEMCALC
$640125601mes_ackCHEMCALC
$640325603set_modusCHEMCALC
$641125617app_exitCHEMCALC
$641425620get_menu_pointCHEMCALC
$641525621send_menu_pointCHEMCALC
$642025632request_file_extCHEMCALC
$642125633send_file_extCHEMCALC
$64ff25855errorCHEMCALC
$650225858request_floatCHEMCALC
$650325859send_floatCHEMCALC
$660226114request_textCHEMCALC
$660326115send_textCHEMCALC
$666626214LOAD_FILEPorthos
$666726215READ_HeaderPorthos
$666826216READ_CATALOGPorthos
$666926217CHG_PAGEPorthos
$666a26218LOOK_PAGEPorthos
$666b26219SAVE_REGPorthos
$666c26220SEND_IMGPorthos
$666d26221WRK_NAVIGPorthos
$670226370decl_textCHEMCALC
$670426372send_decltextCHEMCALC
$670526373send_declfloatCHEMCALC
$740729703GEMJING_RETURNGEMJing
$78f130961WinChangeFontTrueMagic
$78f2..$791730962..30999TrueMagic
$799631126AES_Load
$7a0031232OBJC_EDITEDEnhancedGEM
$7a0131233CURSOR_INITEnhancedGEM
$7a0231234OBJC_CHANGEDEnhancedGEM
$7a0331235OBJC_SIZEDEnhancedGEM
$7a0431236OBJC_DRAGGEDEnhancedGEM
$7a0531237MENU_INITEnhancedGEM
$7a0631238MOUSE_INITEnhancedGEM
$7a0831239POPUP_CHANGEDEnhancedGEM
$7a0831240SLIDER_CHANGEDEnhancedGEM
$7a1031248XACC_AV_INITEnhancedGEM
$7a1131249XACC_AV_EXITEnhancedGEM
$7a1231250XACC_AV_CLOSEEnhancedGEM
$7a13..$7a1731251..31255EnhancedGEM
$7a1831256FONT_CHANGEDFont Protocol
$7a1931257FONT_SELECTFont Protocol
$7a1a31258FONT_ACKFont Protocol
$7a1b31259XFONT_CHANGEDFont Protocol
$7a1c..$7a1f31260..31263EnhancedGEM
$7a2031264WIN_CHANGEDEnhancedGEM
$7a2131265WIN_SCROLLEDEnhancedGEM
$7a2231266WIN_TOPPEDEnhancedGEM
$7a2331267WIN_CLOSEDEnhancedGEM
$7a2431268WIN_VSLSIZEEnhancedGEM
$7a2531269WIN_HSLSIZEEnhancedGEM
$7a2631270WIN_NAMEEnhancedGEM
$7a2731271WIN_INFOEnhancedGEM
$7a2831272WIN_HSLIDEEnhancedGEM
$7a2931273WIN_VSLIDEEnhancedGEM
$7a2a31274WIN_SIZEDEnhancedGEM
$7a2b31275WIN_NEWTOPEnhancedGEM
$7a2c..$7a4f31276..31311EnhancedGEM
$800032768CatMsgCAT
$800132769ExtCatMsgCAT
$800332771CatProtoMsgCAT
$927737495 Suji, internally only
$999339315RC_ROTATERoute It! / Circu It!
$999539317RC_MOVERoute It! / Circu It!
$999639318RC_UNDORoute It! / Circu It!
$999739319CR_REDRAWRoute It! / Circu It!
$999839320CR_PARARoute It! / Circu It!
$999939321RC_SENDPARARoute It! / Circu It!
$9a0039424WR_RECWinRec
$9a0139425WR_STOPWinRec
$9a0239426WR_PLAYWinRec
$9a0339427WR_TIMEWinRec
$a08141089 QFax/Pro
$baba47802BUBBLEGEM_REQUESTBubbleGEM
$babb47803BUBBLEGEM_SHOWBubbleGEM
$babc47804BUBBLEGEM_ACKBubbleGEM
$babd47805BUBBLEGEM_ASKFONTBubbleGEM
$babe47806BUBBLEGEM_FONTBubbleGEM
$babf47807BUBBLEGEM_HIDEBubbleGEM
$c01049168COLOR_IDColor-Drag&Drop
$c01149169COLOR_RGBColor-Drag&Drop
$cab051888CAB_CHANGEDCAB Protocol
$cab151889CAB_EXITCAB Protocol
$cab251890CAB_PATHCAB Protocol
$cab351891CAB_VIEWCAB Protocol
$cab451892CAB_TERMCAB Protocol
$cab551893CAB_REQUESTSTATUSCAB Protocol
$cab651894CAB_RELEASESTATUSCAB Protocol
$cab751895CAB_STATUSCAB Protocol
$cab851896CAB_HELLOCAB Protocol
$cab951897CAB_MAILCAB Protocol
$caba51898CAB_MAILSENTCAB Protocol
$cabb51899CAB_MAILSENTCAB Protocol
$cabc..$cabf51900..51903CAB Protocol
$cc00..$cc7f52224..52351CYBSMASH_Request_xxxCybersmash
$cc80..$ccff52352..52479CYBSMASH_Reply_xxxCybersmash
$cc6052320MSG_CT60_TEMPCT60-CPX
$dadd56029DHST_ADDDocument History Protocol
$dade56030DHST_ACKDocument History Protocol
$de00..$de7f56832..56959DEGAS_Request_xxxDegas
$de80..$deff56960..57087DEGAS_Reply_xxxDegas
$e00057344X_MN_SELECTEDGeneva
$e10057600X_WM_SELECTEDGeneva
$e20057856X_GET_HELPGeneva
$e40058368X_WM_HSPLITGeneva
$e60058880X_WM_ARROWED2Geneva
$e70059136X_WM_HSLID2Geneva
$e80059392X_WM_VSLID2Geneva
$e90059648X_WM_OBJECTGeneva
$ea0059904X_WM_VECKEYGeneva Release 004
$ea0159905X_WM_VECSWGeneva Release 004
$ea0259906X_WM_VECEVNTGeneva Release 004
$ed0060672ED_HELLOSTeno
$ed0160673ED_OPENSTeno
$ed0260674ED_BYESTeno
$ed1060688ED_LOADFSTeno
$ed1160676ED_NEWSTeno
$ed1260677ED_SAVEFSTeno
$ed1460692ED_CUTSTeno
$ed1560693ED_COPYSTeno
$ed1660694ED_PASTESTeno
$ed1760695ED_DELETESTeno
$ed1860696ED_FINDSTeno
$ed1960697ED_CHANGESTeno
$ed1a60698ED_PRINTSTeno
$ed1d60701ED_LINESTeno
$ed1e60702ED_READSTeno
$ed1f60703ED_INQINFSTeno
$ed3060720ED_DCLICKSTeno
$ed3160721ED_SELECTSTeno
$ed4060736ED_MLOADSTeno
$ed4160737ED_MNEWSTeno
$ed4260738ED_MSAVESTeno
$ed5060752ED_CLOSESTeno
$ed5160753ED_UNDOKSTeno
$ed8060800ED_REPLY (Answer to ED_HELLO)STeno
$ed9f60831Answer of ED_INQINFSTeno
$f3d062416F3D_INITFocus 3D
$f3d162417F3D_EXITFocus 3D
$f3d262418F3D_REQUESTFocus 3D
$f3d362419F3D_RETURNFocus 3D
$f3d4..$f3df62420..62431reserviertFocus 3D
$f82563525Answer of MSG_ENABLESTalker
-2011
$f82663526Answer of MSG_EXECUTE_SCRIPTSTalker
-2010
$f82763527Answer of MSG_KEYSTROKESTalker
-2009
$f82863528Answer of MSG_SENSTRINGSTalker
-2008
$f82963529Answer of MSG_RESOURCESTalker
-2007
$f82a63530Answer of MSG_BUFFERSTalker
-2006
$f82b63531Answer of MSG_CONFIGSTalker
-2005
$f82c63532Answer of MSG_INFOSTalker
-2004
$f82d63533Answer of MSG_DISPLAYSTalker
-2003
$f82e63534Answer of MSG_WAKESTalker
-2002
$f82f63535Answer of MSG_SLEEPSTalker
-2001
$f83063536Answer of MSG_IDENTIFYSTalker
-2000
$fe0065034 PRINTMON.APP (NVDI)
$fe0165035 PRINTMON.APP (NVDI)
$ff0165281 PRINTMON.APP (NVDI)
$fff065520XMESSAGEXMSG - Message Server
$fff165521XMSG_ASKXMSG - Message Server
$fff265522XMSG_OKXMSG - Message Server
+
+ +

8.7.9.1 The CAB protocol

+

The CAB protocol consists of a series of AES messages with +whose aid any GEM programs can devolve certain tasks to CAB, or +coordinate certain actions with CAB. +

+

The contents of the environmental variable BROWSER= (if defined) +holds CAB's access path. If CAB is not already in memory, then a +program can launch CAB subsequently via this variable. +

+

A possible application: If one offers further current +information or updates for one's own programs on the internet, one +could use the CAB protocol to provide access to this information from +within these programs with little effort. CAB then takes care of the +download of the data and its presentation. +

+

Description of the messages +

+ +

CAB_HELLO (0xCAB8) (message from CAB) +
CAB transmits after its launch the following message to all +running programs: +

+
msg[0] = 0xCAB8
+msg[1] = Id von CAB
+msg[2] = 0
+msg[3] = Version of the CAB protocol (0x0100 corresponds to V1.00)
+msg[4] = Bit-vector with the internet protocols supported by CAB
+         (CAB.OVL):
+             Bit 0: HTTP
+             Bit 1: FTP
+             Bit 2: GOPHER
+             Bit 3: WAIS
+             Bit 4: MAILTO
+             Bit 5: NNTP
+             Bit 6: TELNET
+             Bit 7-15: 0 (reserved)
+msg[5] = Bit-vector with the CAB protocol messages supported by CAB:
+             Bit 0: CAB_VIEW
+             Bit 1: CAB_MAIL, CAB_MAILSENT
+             Bit 2: CAB_REQUESTSTATUS, CAB_RELEASESTATUS, CAB_STATUS,
+                    CAB_EXIT
+             Bit 3-15: 0 (reserved)
+msg[6] = 0
+msg[7] = 0
+
+ +

CAB_SUPPORT (0xCABB) (message to CAB) +
If this message is sent to CAB, then CAB sends back the message +CAB_HELLO. If CAB_HELLO is not returned, then an old version of CAB is +being used that does not yet support the CAB protocol. All programs +that are interested in the information that CAB_HELLO delivers should +send CAB_SUPPORT to CAB after their launch. If CAB is only launched +later, then CAB_HELLO is sent automatically to the program. +

+
msg[0] = 0xCABB
+msg[1] = Id des PRGs
+msg[2] = 0
+msg[3] = 0
+msg[4] = 0
+msg[5] = 0
+msg[6] = 0
+msg[7] = 0
+
+ +

CAB_VIEW (0xCAB3) (message to CAB) +
Similar to VA_START, but instead of a fielname a URL is passed. +CAB then displays this file. +

+
msg[0] = 0xCAB3
+msg[1] = ID of the PRG
+msg[2] = 0
+msg[3] = \ Pointer to the URL
+msg[4] = /
+msg[5] = If a 1 was entered here CAB displays the URL in a new window;
+         if a 0 was entered, the top CAB window will be used
+msg[6] = 0
+msg[7] = 0
+
+ +

CAB_REQUESTSTATUS (0xCAB5) (message to CAB) +
This can be sent to CAB to check whether CAB is currently online +or offline. CAB subsequently sends the message CAB_STATUS at each +change of the online/offline state. +

+
msg[0] = 0xCAB5
+msg[1] = ID of the PRG
+msg[2] = 0
+msg[3] = 0
+msg[4] = 0
+msg[5] = 0
+msg[6] = 0
+msg[7] = 0
+
+ +

CAB_RELEASESTATUS (0xCAB7) (message to CAB) +
This should be sent to CAB when a program is no longer interested +in the on/offline information that was requested with +CAB_REQUESTSTATUS (e.g. because it terminates itself). +

+
msg[0] = 0xCAB7
+msg[1] = ID of the PRG
+msg[2] = 0
+msg[3] = 0
+msg[4] = 0
+msg[5] = 0
+msg[6] = 0
+msg[7] = 0
+
+ +

CAB_STATUS (0xCAB6) (message from CAB) +
This is sent by CAB to all programs that have registered +themselves with CAB_REQUESTSTATUS. +

+
msg[0] = 0xCAB6
+msg[1] = ID of the PRG
+msg[2] = 0
+msg[3] = 1 if CAB online; 0 if CAB offline
+msg[4] = 0
+msg[5] = 0
+msg[6] = 0
+msg[7] = 0
+
+ +

CAB_EXIT (0xCAB1) (message from CAB) +
This is sent by CAB as soon as CAB terminates to all programs that +have registered themselves with CAB_REQUESTSTATUS. Before this a +CAB_STATUS is sent in which the offline state is reported. +

+
msg[0] = 0xCAB1
+msg[1] = ID of the PRG
+msg[2] = 0
+msg[3] = 0
+msg[4] = 0
+msg[5] = 0
+msg[6] = 0
+msg[7] = 0
+
+ +

CAB_MAIL (0xCAB9) (message to CAB) +
This can be sent to CAB to transmit mails. +

+
msg[0] = 0xCAB9
+msg[1] = ID of the PRG
+msg[2] = 0
+
+msg[3] = \ Pointer to the URL; a subject can be appended directly to
+msg[4] = / the URL, separated by a question mark
+
+msg[5] = \ Pointer to a file holding the mail contents, or NULL (in
+msg[6] = / which case CAB opens an editor into which the mail can be
+           entered)
+
+msg[7] = Bit-vector with further options:
+             Bit 0: 0 if the mail file is to be sent immediately, or 1
+                    if the mail file is still to be edited/altered in
+                    CAB by the user
+             Bit 1: With 1 the mail file will be deleted after it has
+                    been sent, while 0 means it will be retained
+             Bit 2-15: 0 (reserved)
+
+ +

CAB_MAILSENT (0xCABA) (message from CAB) +
This is sent by CAB to the program that has sent CAB_MAIL and +contains infomation whether sending of the mail worked correctly or +not. +

+
msg[0] = 0xCABA
+msg[1] = ID of CAB
+msg[2] = 0
+msg[3] = 1 if the mail was sent without error; 0 if an error occurred
+         (in which case one can find the cause of the error in msg[4])
+msg[4] = Contains an error number if msg[3]=0
+              0: No URL specified
+              1: Offline, net connection failed, server not accessible
+              2: User has aborted the action (if the mail is to be
+                 modified in CAB, the user has the option of aborting
+                 the action)
+              3: GEMDOS error on accessing the mail file
+              4: Editor for modifying the file could not be called
+msg[5] = 0
+msg[6] = 0
+msg[7] = 0
+
+

Special messages for 'Cache-Tools' +
+

+ +

CAB_CHANGED (0xCAB0) (message to/from CAB) +
The cache (or CACHE.CAB) has been changed and should be read in +anew. +

+
msg[0] = 0xCAB0
+msg[1] = ID of CAB/the PRG
+msg[2] = 0
+msg[3] = 0
+msg[4] = 0
+msg[5] = 0
+msg[6] = 0
+msg[7] = 0
+
+

CAB_EXIT (0xCAB1) (message to/from CAB) +
CAB or the Cache-Tool terminates itself (as information for the +other PRG in each case). +

+
msg[0] = 0xCAB1
+msg[1] = ID of CAB/the PRG
+msg[2] = 0
+msg[3] = 0
+msg[4] = 0
+msg[5] = 0
+msg[6] = 0
+msg[7] = 0
+
+ +

CAB_PATH (0xCAB2) (message from CAB) +
The local HTML directory and/or the cache directory was altered. +Further information is available in the Cache-Tools documentation. +

+
msg[0] = 0xCAB2
+msg[1] = ID of CAB
+msg[2] = 0
+msg[3] = 0
+msg[4] = 0
+msg[5] = 0
+msg[6] = 0
+msg[7] = 0
+
+ +

CAB_TERM (0xCAB4) (message from CAB) +
The Cache-Tool should terminate itself. +

+
msg[0] = 0xCAB4
+msg[1] = ID of CAB
+msg[2] = 0
+msg[3] = 0
+msg[4] = 0
+msg[5] = 0
+msg[6] = 0
+msg[7] = 0
+
+

8.7.9.2 Messages from Geneva

+
+
+
X_MN_SELECTED (0xE000)
+
+

+
This message is either accompanied by the MU_MESAG bit of an +evnt_multi return, or is returned by the evnt_mesag call. When this +message occurs, the message buffer contains: +
  +

+ + + + + + + + + + + + + + + + + + + + + + + + +
PortionContents
msg[0]0xE000
msg[3]The object index of the menu title selected
msg[4]The object index of the selected menu item
msg[5], [6]The object tree of the menu item selected
msg[7]The handle of the window containing the menu
+
+ +
This feature is used in conjunction with the wind_set option +X_WF_MENU, described in detail, below. +
  +
+

+ + +
X_WM_SELECTED (0xE100)
+
+

+
This message is received when the user clicks on a window gadget +in a window whose flags were modified with the wind_tree function. It +only occurs when the X_WTFL_CLICKS attribute is off. If the user +clicks on one of the normal scroll gadgets or arrows, a standard +WM_ARROWED message is sent to the application. However, when the user +clicks on any other gadget, an X_WM_SELECTED message is sent: +
  +

+ + + + + + + + + + + + + + + + + + + + +
PortionContents
msg[0]0xE100
msg[3]The handle of the window containing the gadget
msg[4]The object index of the window tree object the user
 clicked on
+
+ +
This feature is used by the Task Manager's +"Keyboard..." dialog. +
  +
+

+ + +
X_GET_HELP (0xE200)
+
+

+
This message is sent to the Help display program when the user +requests help on a certain topic. The message is actually comprised of +two parts. When the application sees the X_GET_HELP message, it must +then use the appl_read function to get the entire remainder of the +message, whether it intends to use the whole thing or not. The first +part of the message is comprised of the following values: +
  +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PortionContents
msg[0]0xE200
msg[1]Application ID
msg[2]Length of the second part ofthe message
msg[3]Length of the topic portion of the message, including
 the NUL terminator
msg[4]Length of the filename portion of the message, including
 the NUL terminator
msg[5]Upper/lowercase sensitivity. If non-zero, the topic is
 case-sensitive.
+
+ +
The second part of the message contains the actual text of the +topic and filename fields. This can be read with one or more calls to +appl_read. +
  +
Example: +
  +
    void read_string( char *s, int max, int size )
+    {
+      char dummy;
+
+      if( size<=max )               /* the whole string fits */
+        appl_read( my_application_id, size, s );
+      else
+      {
+        /* read what we can */
+        appl_read( my_application_id, max-1, s);
+        s[max-1] = '\0';            /* terminate the string   */
+        /* now, get the remaining bytes of the string         */
+        for( size=size-(max-1); size>0; size-- )
+           appl_read( my_application_id, 1, &dummy );
+      }
+    }
+
+    main()
+    {
+      int msg[8], caps_sens;
+      char topic[20], filename[100];
+
+      evnt_mesag( msg );
+      switch( msg[0] )
+      {
+        case X_GET_HELP:
+           caps_sens = msg[5];
+          /* Read the topic portion */
+           read_string( topic, sizeof(topic), msg[3] );
+          /* Read the filename portion */
+            read_string( filename, sizeof(filename). msg[4] );
+          /* Do whatever with it... */
+
+
+

+ + +
X_WM_HSPLIT (0xE400)
+
+

+
This message is sent to an application when the position of the +horizontal split bar has changed: +
  +

+ + + + + + + + + + + + + + + + + + + + + + + + +
PortionContents
msg[0]0xE400
msg[1]Application ID
msg[2]0
msg[3]Handle of the window being affected
msg[4]The new offset (in pixels) of the split bar
+
+ +
The application is then free to either act upon this message and +change the split bar position with wind_set(X_WF_HSPLIT), or to ignore +the message completely. +
  +
See the x_wind_create function for more information. +
  +
+

+ + +
X_WM_ARROWED2 (0xE600)
+
+

+
This message is sent to an application when the user has licked on +one of the arrow or scroll bar gadgets which are not reported by the +normal WM_ARROWED message. X_WM_ARROWED2 reports changes in gadgets +which are below a vertical split bar and/or to the right of a +horizontal split bar. The format of a X_WM_ARROWED2 message is +identical to that of WM_ARROWED. +
  +
See the x_wind_create function for more information. +
  +

+

+ + +
X_WM_HSLID2 (0xE700)
+
+

+
This message is sent to an application when the user has dragged +the second horizontal scroll gadget, which appears to the right of a +horizontal split bar. The format of this message is identical to that +of WM_HSLID. +
  +
See the x_wind_create function for more information. +
  +

+

+ + +
X_WM_VSLID2 (0xE800)
+
+

+
This message is sent to an application when the user has dragged +the second vertical scroll gadget, which appears below a vertical +split bar. The format of this message is identical to that of +WM_VSLID. +
  +
See the x_wind_create function for more information. +
  +

+

+ + +
X_WM_OBJECT (0xE900) (since Release 003)
+
+

+
This message type is returned to an application when it uses +wind_set mode X_WF_OBJHAND to affect the manner in which window +gadgets are handled. +
  +
If an application receives this message, it is because the +object tree handler routine instructed Geneva not to process the mouse +click on a window gadget as a normal event. Instead, a special message +is returned to the application: +
  +

+ + + + + + + + + + + + + + + + + + + + + + + + +
PortionContents
msg[0]0xE900
msg[1]Application ID
msg[2]0
msg[3]Handle of the window containing the object
msg[4]Object tree index of the object which was clicked
+
+ +
Note that in order for Geneva to determine that the mouse has +been clicked on an object in a window's tree structure, it must be of +type EXIT or TOUCHEXIT. Geneva's default window gadgets already have +these attributes set correctly. +
  +
See also: wind_set mode   X_WF_OBJHAND. +
  +

+ +
+
+

8.7.9.3 RSDAEMON_MSG

+

The RSDAEMON is a parallel-running application which assumes the +task of the resolver with an AES message. It's intended as a kind +of non-blocking gethostbyname, although the RSDAEMON only returns an +IP, not a complete hostent-struct. +

+

The RSDAEMON is normally started and terminated automatically by +IConnect. +

+

Utilization: +

+

With appl_find("RSDAEMON") the App ID is to be +obtained. In case of error one should fall back to the blocking +gethostbyname, and only if nothing else is possible, break off with an +error-message. +

+

Now the RSDAEMON can be sent an AES message: +

+
#include <rsdaemon.h>
+
+pbuf[0]=RSDAEMON_MSG
+pbuf[1]=<eigene App-ID>
+pbuf[2]=0
+pbuf[3]=RSD_REQUEST_IP
+pbuf[4]=<Own freely choosable ID, to be able to assign the reply>
+pbuf[5/6]=<Pointer to the string that contains the nname of the host>
+           (Pay attention to possible memory protection!)
+
+The RSDAEMON returns a reply of the following form:
+
+pbuf[0]=RSDAEMON_MSG
+pbuf[1]=<RSDAEMON ID>
+pbuf[2]=0
+
+pbuf[3]=RSD_IP_UNKNOWN = IP could not be obtained. This may be due to
+                         various causes (user has not entered a DNS,
+                         the DNS does not recognize the host etc.)
+pbuf[4]=<Here the ID of the request is returned>
+
+or:
+
+pbuf[3]=RSD_IP_FOUND
+pbuf[4]=<Here the ID of the request is returned>
+pbuf[5/6]=<IP of the host as ulong>
+
+

And here still the RSDAEMON.H: +

+
#ifndef __RSDAEMON__
+#define __RSDAEMON__
+
+#define RSDAEMON_MSG    0x995
+
+#define RSD_REQUEST_IP  1
+#define RSD_IP_FOUND    2
+#define RSD_IP_UNKNOWN  3
+
+#endif
+
+
+ +Home +AESAES +Editable object functionsEditable object functions +Window-dialogsWindow-dialogs + + diff --git a/en/fnts.html b/en/fnts.html new file mode 100644 index 000000000..8b5087f33 --- /dev/null +++ b/en/fnts.html @@ -0,0 +1,2740 @@ + + + + + +The documentation for TOS: Font selection + + + + + + + + + +Home +AESAES +Extended shell libraryExtended shell library +AES function listAES function list + +
+ +

8.25 Font selection

+

This library contains routines for handling a font selector, +which an application can use to select fonts for its use. The routines +were introduced with MagiC 4. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
fnts_add Adds user's fonts for selection +
fnts_close Closes selector +
fnts_create Initializes the font selector +
fnts_delete Releases memory used by font selector +
fnts_do Displays font selector in modal dialog +
fnts_evnt Processes events for dialog in window +
fnts_get_info Obtains information about a font +
fnts_get_name Obtains name of a font +
fnts_get_no_styles Obtains number of styles of a font family +
fnts_get_style Obtains ID of the n-th style of a family +
fnts_open Opens font selector in a window +
fnts_remove Removes user's fonts from the list +
fnts_update Updates font selector + +
+ +

Note: The existence of these functions is best +established with a call of appl_getinfo (opcode 7). +

+

See also: +
Selector in a window   Selector in a modal dialog   WDIALOG   xFSL interface +

+

8.25.1 fnts_add

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Font selector add user fonts« - Add user's fonts for +selection. +
  +
Opcode: 185 (sub-opcode 0) +
  +
Syntax: int16_t fnts_add ( FNT_DIALOG *fnt_dialog, FNTS_ITEM +*user_fonts ); +
  +
Description: The call fnts_add adds the user's fonts to those of those +displayed by the font selector. The following apply: +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
fnt_dialogPointer to management structure
user_fontsPointer to user fonts
+
+ +
Hint: The IDs of these fonts must be higher than 65535. +In addition the pointer to a display function must be entered into the +structure element display. +
  +
Return value: On successful execution the function returns the value 1. A +value of 0 on the other hand signals an error. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: Font selection +
  +
See also: Binding   fnts_delete   fnts_remove   xFSL interface +
  + +
+ +

8.25.1.1 Bindings for fnts_add

+ + + + + + + + + +
C: int16_t fnts_add ( FNT_DIALOG *fnt_dialog, FNTS_ITEM +*user_fonts ); +
  +
Binding: +
  +
int16_t fnts_add ( FNT_DIALOG *fnt_dialog,
+                   FNTS_ITEM *user_fonts )
+{
+   addr_in[0] = fnt_dialog;
+   addr_in[1] = user_fonts;
+
+   int_in[0] = 0;
+   crys_if (185);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]185 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]fnt_dialog
addr_in+4addr_in[1]user_fonts
int_inint_in[0]0 # Sub-opcode
int_outint_out[0]Return value
+
+ + +
+ +

8.25.2 fnts_close

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Font selector close window« - Close font selector window. +
  +
Opcode: 183 +
  +
Syntax: int16_t fnts_close ( FNT_DIALOG *fnt_dialog, int16_t *x, +int16_t *y ); +
  +
Description: The call fnts_close closes the window of the font selector. The +following apply: +
  +

+
+ + + + + + + + + + + + + + + + +
ParameterMeaning
fnt_dialogPointer to management structure
xLast x-coordinate of the dialog
yLast y-coordinate of the dialog
+
+ +
Hint: Old WDIALOG versions do not return the window +coordinates. In that case the binding enters -1, so that the dialog +will be centred automatically at the next call. +
  +
Return value: This function returns always 1. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: Font selection +
  +
See also: Binding   fnts_open   xFSL interface +
  + +
+ +

8.25.2.1 Bindings for fnts_close

+ + + + + + + + + +
C: int16_t fnts_close ( FNT_DIALOG *fnt_dialog, int16_t *x, +int16_t *y ); +
  +
Binding: +
  +
int16_t fnts_close ( FNT_DIALOG *fnt_dialog, int16_t *x,
+                     int16_t *y )
+{
+   int_out[1] = -1;
+   int_out[2] = -1;
+
+   addr_in[0] = fnt_dialog;
+
+   crys_if (183);
+
+   *x = int_out[1];
+   *y = int_out[2];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]183 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]3 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]fnt_dialog
int_outint_out[0]Return value
int_out+2int_out[1]Last x-coordinate of the dialog
int_out+4int_out[2]Last y-coordinate of the dialog
+
+ + +
+ +

8.25.3 fnts_create

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Font selector create« - Initializes the font selector. +
  +
Opcode: 180 +
  +
Syntax: FNT_DIALOG *fnts_create ( int16_t vdi_handle, int16_t no_fonts, +int16_t font_flags, int16_t dialog_flags, int8_t *sample, int8_t +*opt_button ); +
  +
Description: The call fnts_create initializes the font selector. The +following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
vdi_handle Handle of the workstation to be used +
no_fonts Number of available fonts, or 0 if vst_load_fonts is to be +called +
font_flags Type of fonts to be displayed: + + + + +
+
+ + + + + + + + + + + + + + + + + + + + +
Bit 0=Display bitmap fonts ( FNTS_BTMP = 1)
Bit 1=Display vector fonts ( FNTS_OUTL = 2)
Bit 2=Display mono-spaced fonts ( FNTS_MONO = 4)
Bit 3=Display proportional fonts ( FNTS_PROP = 8)
+
+ + + +
dialog_flags Appearance of the dialog: +
FNTS_3D (1) = Display selector in 3D-look +
FNTS_DISPLAY (2) = Display available display styles (XaAES) +
sample Pointer to string for the sample text +
opt_button Pointer to string for optional button, or 0L + +
+ +
Hint: If no_fonts is 0, vst_load_fonts is called +with vdi_handle. Otherwise an assumption is made that +no_fonts is the number of all fonts available via +vdi_handle, i.e. the number of all system fonts (work_out[10] +for v_opnvwk/vq_extnd) plus the number of fonts loaded in later +(return value of vst_load_fonts). +
  +
Depending on system configuration, this function may well take 1 +second (possibly even more), so it should be called at program start +and not just immediately before displaying the font selector. +
  +
Note: The font selector alters the attributes of the +workstation described by vdi_handle. If one wants to use the +workstation passed with fnts_create also for other purposes, the +attributes have to be set first each time, as they may have been +altered meantime by the font selector. +
  +
Return value: This function returns a pointer to management structure. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: Font selection +
  +
See also: Binding   fnts_open   fnts_close   xFSL interface +
  + +
+ +

8.25.3.1 Bindings for fnts_create

+ + + + + + + + + +
C: FNT_DIALOG *fnts_create ( int16_t vdi_handle, int16_t no_fonts, +int16_t font_flags, int16_t dialog_flags, int8_t *sample, int8_t +*opt_button ); +
  +
Binding: +
  +
FNT_DIALOG *fnts_create ( int16_t vdi_handle,
+                          int16_t no_fonts,
+                          int16_t font_flags,
+                          int16_t dialog_flags,
+                          int8_t *sample,
+                          int8_t *opt_button )
+{
+   addr_in[0] = sample;
+   addr_in[1] = opt_button;
+
+   int_in[0] = vdi_handle;
+   int_in[1] = no_fonts;
+   int_in[2] = font_flags;
+   int_in[3] = dialog_flags;
+   crys_if (180);
+
+   return ( addr_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]180 # Function opcode
control+2control[1]4 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]1 # Entry in addr_out
addr_inaddr_in[0]sample
addr_in+4addr_in[1]opt_button
int_inint_in[0]vdi_handle
int_in+2int_in[1]no_fonts
int_in+4int_in[2]font_flags
int_in+6int_in[3]dialog_flags
addr_outaddr_out[0]Return value
+
+ + +
+ +

8.25.4 fnts_delete

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Font selector delete« - Release memory used by font +selector. +
  +
Opcode: 181 +
  +
Syntax: int16_t fnts_delete ( FNT_DIALOG *fnt_dialog, int16_t +vdi_handle ); +
  +
Description: The call fnts_delete releases the memory that was used by the +font selector. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
fnt_dialog Pointer to management structure +
vdi_handle Handle of the Workstation, or 0 if vst_unload_fonts() is not to +be called + +
+ +
Hint: If vdi_handle is not 0, then +vst_unload_fonts() will be called. +
  +
Return value: This function returns always one. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: Font selection +
  +
See also: Binding   fnts_close   fnts_remove   xFSL interface +
  + +
+ +

8.25.4.1 Bindings for fnts_delete

+ + + + + + + + + +
C: int16_t fnts_delete ( FNT_DIALOG *fnt_dialog, int16_t +vdi_handle ); +
  +
Binding: +
  +
int16_t fnts_delete ( FNT_DIALOG *fnt_dialog,
+                      int16_t vdi_handle )
+{
+   addr_in[0] = fnt_dialog;
+   int_in[0]  = vdi_handle;
+   crys_if (181);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]181 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]fnt_dialog
int_inint_in[0]vdi_handle
int_outint_out[0]Return value
+
+ + +
+ +

8.25.5 fnts_do

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Font selector do« - Display font selector in a modal dialog. +
  +
Opcode: 187 +
  +
Syntax: int16_t fnts_do ( FNT_DIALOG *fnt_dialog, int16_t button_flags, +int32_t id_in, int32_t pt_in, int32_t ratio_in, int16_t *check_boxes, +int32_t *id, fix31 *pt, int32_t *ratio ); +
  +
Description: The call fnts_do displays the font selector in a modal dialog. +The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
fnt_dialog Pointer to management structure +
button_flags Flags for supported buttons: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
0x0001 = Select checkbox for names +
0x0002 = Select checkbox for style +
0x0004 = Select checkbox for height +
0x0008 = Select checkbox for width/height ratio +
0x0100 = Display checkbox for names +
0x0200 = Display checkbox for style +
0x0400 = Display checkbox for height +
0x0800 = Display checkbox for width/height ratio +
0x1000 = Width/height ratio adjustable +
0x2000 = Button "Set" selectable +
0x4000 = Button "Mark" selectable + +
+ +
id_in Font ID of the displayed font +
pt_in Height in 1/65536 point +
ratio_in Width/height ratio in 1/65536 +
check_boxes Status of the checkboxes +
id Font ID of the selected font +
pt Height in 1/65536 point +
ratio Width/height ratio in 1/65536 + +
+ +
Hint: This function is the counterpart to +fnts_open/fnts_evnt/fnts_close. This function opens a modal dialog and +only returns to the caller when one of the exit buttons was activated. +
  +
Return value: This function returns the index of the exit button +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
1=Cancel
2=OK
3=Set
4=Mark
5=Options
+
+ +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: Font selection +
  +
See also: Binding   fnts_open   fnts_evnt   xFSL interface +
  + +
+ +

8.25.5.1 Bindings for fnts_do

+ + + + + + + + + +
C: int16_t fnts_do ( FNT_DIALOG *fnt_dialog, int16_t button_flags, +int32_t id_in, int32_t pt_in, int32_t ratio_in, int16_t *check_boxes, +int32_t *id, fix31 *pt, int32_t *ratio ); +
  +
Binding: +
  +
int16_t fnts_do ( FNT_DIALOG *fnt_dialog,
+                  int16_t button_flags,
+                  int32_t id_in, int32_t pt_in,
+                  int32_t ratio_in, int16_t *check_boxes,
+                  int32_t *id, fix31 *pt,
+                  int32_t *ratio )
+{
+   addr_in[0] = fnt_dialog;
+
+   int_in[0]    = button_flags;
+   int_in[1..2] = id_in;
+   int_in[3..4] = pt_in;
+   int_in[5..6] = ratio_in;
+   crys_if (187);
+
+   *check_boxes = int_out[1];
+   *id          = int_out[2..3];
+   *pt          = int_out[4..5];
+   *ratio       = int_out[6..7];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]187 # Function opcode
control+2control[1]7 # Entry in int_in
control+4control[2]8 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]fnt_dialog
int_inint_in[0]button_flags
int_in+2int_in[1..2]id_in
int_in+6int_in[3..4]pt_in
int_in+10int_in[5..6]ratio_in
int_outint_out[0]Return value
int_out+2int_out[1]check_boxes
int_out+4int_out[2..3]id
int_out+8int_out[4..5]pt
int_out+12int_out[6..7]ratio
+
+ + +
+ +

8.25.6 fnts_evnt

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Font selector handle event« - Process events for a font +selector dialog in a window. +
  +
Opcode: 186 +
  +
Syntax: int16_t fnts_evnt ( FNT_DIALOG *fnt_dialog, EVNT *events, +int16_t *button, int16_t *check_boxes, int32_t *id, fix31 *pt, int32_t +*ratio ); +
  +
Description: The call fnts_evnt evaluates the passed EVNT structure. The +following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
fnt_dialog Pointer to management structure +
events Pointer to EVNT structure +
button Selected button (or 0): + + + + + + + + + + + + + + + +
1 = Cancel +
2 = Ok +
3 = Set +
4 = Mark +
5 = Optional (application-specific) + +
+ +
check_boxes Status of the checkboxes: + + + + + + + + + + + + +
Bit-0 = Checkbox for the names selected +
Bit-1 = Checkbox for the style selected +
Bit-2 = Checkbox for the height selected +
Bit-3 = dto. für Breiten/Höhenverhältnis + +
+ +
id ID of the selected font +
pt Height in 1/65536 point +
ratio Width/height ratio + +
+ +
Hint: The function calls internally wdlg_evnt. +
  +
Return value: The function returns the value 0 if an exit button was +selected, else the value 1 if nothing happened. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: Font selection +
  +
See also: Binding   fnts_do   xFSL interface +
  + +
+ +

8.25.6.1 Bindings for fnts_evnt

+ + + + + + + + + +
C: int16_t fnts_evnt ( FNT_DIALOG *fnt_dialog, EVNT *events, +int16_t *button, int16_t *check_boxes, int32_t *id, fix31 *pt, int32_t +*ratio ); +
  +
Binding: +
  +
int16_t fnts_evnt ( FNT_DIALOG *fnt_dialog, EVNT *events,
+                    int16_t *button, int16_t *check_boxes,
+                    int32_t *id, fix31 *pt, int32_t *ratio )
+{
+   addr_in[0] = fnt_dialog;
+   addr_in[1] = events;
+   crys_if (186);
+
+   *button      = int_out[1];
+   *check_boxes = int_out[2];
+   *id          = int_out[3..4];
+   *pt          = int_out[5..6];
+   *ratio       = int_out[7..8];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]186 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]9 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]fnt_dialog
addr_in+4addr_in[1]events
int_outint_out[0]Return value
int_out+2int_out[1]button
int_out+4int_out[2]check_boxes
int_out+6int_out[3..4]id
int_out+10int_out[5..6]pt
int_out+14int_out[7..8]ratio
+
+ + +
+ +

8.25.7 fnts_get_info

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Font selector get font info« - Obtain information about a +font. +
  +
Opcode: 184 (sub-opcode 3) +
  +
Syntax: int16_t fnts_get_info ( FNT_DIALOG *fnt_dialog, int32_t id, +int16_t *mono, int16_t *outline ); +
  +
Description: The call fnts_get_info obtains various items of information +about a font. The following apply: +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
fnt_dialogPointer to management structure
idFont ID
monoFlag for monospaced font
outlineFlag for vector font
+
+ +
Note: The function determines whether the specified font +is a monospaced one, or a vector (outline) font. +
  +
Return value: The function returns the index of the font (or the value 0 in +case of error). +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: Font selection +
  +
See also: Binding   fnts_get_name   fnts_get_style   xFSL interface +
  + +
+ +

8.25.7.1 Bindings for fnts_get_info

+ + + + + + + + + +
C: int16_t fnts_get_info ( FNT_DIALOG *fnt_dialog, int32_t id, +int16_t *mono, int16_t *outline ); +
  +
Binding: +
  +
int16_t fnts_get_info ( FNT_DIALOG *fnt_dialog, int32_t id,
+                        int16_t *mono, int16_t *outline )
+{
+   addr_in[0] = fnt_dialog;
+
+   int_in[0]    = 3;
+   int_in[1..2] = id;
+   crys_if (184);
+
+   *mono    = int_out[1];
+   *outline = int_out[2];
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]184 # Function opcode
control+2control[1]3 # Entry in int_in
control+4control[2]3 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]fnt_dialog
int_inint_in[0]3 # Sub-opcode
int_in+2int_in[1..2]id
int_outint_out[0]Return value
int_out+2int_out[1]mono
int_out+4int_out[2]outline
+
+ + +
+ +

8.25.8 fnts_get_name

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Font selector get font name« - Obtain name of a font. +
  +
Opcode: 184 (sub-opcode 2) +
  +
Syntax: int16_t fnts_get_name ( FNT_DIALOG *fnt_dialog, int32_t id, +int8_t *full_name, int8_t *family_name, int8_t *style_name ); +
  +
Description: The call fnts_get_name obtains the name, family name and style +name of a font. The following apply: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
fnt_dialogPointer to management structure
idFont ID
full_namePointer to the full name, or NULL
family_namePointer to the family name, or NULL
style_namePointer to the style name, or NULL
+
+ +
Return value: The function returns the value 1 on error-free execution; a +value of 0, on the other hand, signals an error has occurred. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: Font selection +
  +
See also: Binding   fnts_get_info   fnts_get_style   xFSL interface +
  + +
+ +

8.25.8.1 Bindings for fnts_get_name

+ + + + + + + + + +
C: int16_t fnts_get_name ( FNT_DIALOG *fnt_dialog, int32_t id, +int8_t *full_name, int8_t *family_name, int8_t *style_name ); +
  +
Binding: +
  +
int16_t fnts_get_name ( FNT_DIALOG *fnt_dialog, int32_t id,
+                        int8_t *full_name,
+                        int8_t *family_name,
+                        int8_t *style_name )
+{
+   addr_in[0] = fnt_dialog;
+   addr_in[1] = full_name;
+   addr_in[2] = family_name;
+   addr_in[3] = style_name;
+
+   int_in[0]    = 2;
+   int_in[1..2] = id;
+   crys_if (184);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]184 # Function opcode
control+2control[1]3 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]4 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]fnt_dialog
addr_in+4addr_in[1]full_name
addr_in+8addr_in[2]family_name
addr_in+12addr_in[3]style_name
int_inint_in[0]2 # Sub-opcode
int_in+2int_in[1..2]id
int_outint_out[0]Return value
+
+ + +
+ +

8.25.9 fnts_get_no_styles

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Font selector get number of styles« - Obtain number of +styles of a font family. +
  +
Opcode: 184 (sub-opcode 0) +
  +
Syntax: int16_t fnts_get_no_styles ( FNT_DIALOG *fnt_dialog, int32_t id +); +
  +
Description: The call fnts_get_no_styles obtains the number of styles of a +font. The following apply: +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
fnt_dialogPointer to management structure
idID of a font of the family
+
+ +
Hint: The parameter id is the ID of a font of +this family, that may have been returned by fnts_evnt for instance. +
  +
Return value: This function returns the number of styles belonging to the +family. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: Font selection +
  +
See also: Binding   fnts_get_info   fnts_get_name   xFSL interface +
  + +
+ +

8.25.9.1 Bindings for fnts_get_no_styles

+ + + + + + + + + +
C: int16_t fnts_get_no_styles ( FNT_DIALOG *fnt_dialog, int32_t id +); +
  +
Binding: +
  +
int16_t fnts_get_no_styles ( FNT_DIALOG *fnt_dialog,
+                             int32_t id )
+{
+   addr_in[0] = fnt_dialog;
+
+   int_in[0]    = 0;
+   int_in[1..2] = id;
+   crys_if (184);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]184 # Function opcode
control+2control[1]3 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]fnt_dialog
int_inint_in[0]0 # Sub-opcode
int_in+2int_in[1..2]id
int_outint_out[0]Return value
+
+ + +
+ +

8.25.10 fnts_get_style

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Font selector get style ID« - Obtain ID of the n-th style of +a font family. +
  +
Opcode: 184 (sub-opcode 1) +
  +
Syntax: int32_t fnts_get_style ( FNT_DIALOG *fnt_dialog, int32_t id, +int16_t index ); +
  +
Description: The call fnts_get_style obtains the ID of the n-th font of a +font family. The following apply: +
  +

+
+ + + + + + + + + + + + + + + + +
ParameterMeaning
fnt_dialogPointer to management structure
idID of a font of the family
indexIndex within the family
+
+ +
Hint: The parameter index must be a number +between 1 and the result of fnts_get_no_styles. +
  +
Return value: This function returns ID of the index-th font of the +family. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: Font selection +
  +
See also: Binding   fnts_get_info   fnts_get_name   xFSL interface +
  + +
+ +

8.25.10.1 Bindings for fnts_get_style

+ + + + + + + + + +
C: int32_t fnts_get_style ( FNT_DIALOG *fnt_dialog, int32_t id, +int16_t index ); +
  +
Binding: +
  +
int32_t fnts_get_style ( FNT_DIALOG *fnt_dialog, int32_t id,
+                         int16_t index )
+{
+   addr_in[0] = fnt_dialog;
+
+   int_in[0]    = 1;
+   int_in[1..2] = id;
+   int_in[3]    = index;
+   crys_if (184);
+
+   return ( int_out[0..1] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]184 # Function opcode
control+2control[1]4 # Entry in int_in
control+4control[2]2 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]fnt_dialog
int_inint_in[0]1 # Sub-opcode
int_in+2int_in[1..2]id
int_in+6int_in[3]index
int_outint_out[0..1]Return value
+
+ + +
+ +

8.25.11 fnts_open

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Font selector open window« - Open font selector in a window. +
  +
Opcode: 182 +
  +
Syntax: int16_t fnts_open ( FNT_DIALOG *fnt_dialog, int16_t +button_flags, int16_t x, int16_t y, int32_t id, fix31 pt, fix31 ratio +); +
  +
Description: The call fnts_open opens a window dialog with the font +selector. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
fnt_dialog Pointer to management structure +
button_flags Flags for supported buttons: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
0x0001 = Select checkbox for names +
0x0002 = Select checkbox for style +
0x0004 = Select checkbox for height +
0x0008 = Select checkbox for width/height ratio +
0x0100 = Display checkbox for names +
0x0200 = Display checkbox for style +
0x0400 = Display checkbox for height +
0x0800 = Display checkbox for width/height ratio +
0x1000 = Width/height ratio adjustable +
0x2000 = Button 'Set' selectable +
0x4000 = Button 'Mark' selectable + +
+ +
x X-coordinate of the window's top left corner, or -1 (centred) +
y Y-coordinate of the window's top left corner, or -1 (centred) +
id Font ID +
pt Height in 1/65536 point +
ratio Width/height ratio in 1/65536 + +
+ +
Return value: This function returns the AES handle of the window or 0 +(error). +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: Font selection +
  +
See also: Binding   fnts_close   xFSL interface +
  + +
+ +

8.25.11.1 Bindings for fnts_open

+ + + + + + + + + +
C: int16_t fnts_open ( FNT_DIALOG *fnt_dialog, int16_t +button_flags, int16_t x, int16_t y, int32_t id, fix31 pt, fix31 ratio +); +
  +
Binding: +
  +
int16_t fnts_open ( FNT_DIALOG *fnt_dialog,
+                     int16_t button_flags,
+                    int16_t x, int16_t y, int32_t id,
+                    fix31 pt, fix31 ratio )
+{
+   addr_in[0] = fnt_dialog;
+
+   int_in[0]    = button_flags;
+   int_in[1]    = x;
+   int_in[2]    = y;
+   int_in[3..4] = id;
+   int_in[5..6] = pt;
+   int_in[7..8] = ratio;
+   crys_if (182);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]182 # Function opcode
control+2control[1]9 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]fnt_dialog
int_inint_in[0]button_flags
int_in+2int_in[1]x
int_in+4int_in[2]y
int_in+6int_in[3..4]id
int_in+10int_in[5..6]pt
int_in+14int_in[7..8]ratio
int_outint_out[0]Return value
+
+ + +
+ +

8.25.12 fnts_remove

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Font selector remove user fonts« - Remove user's fonts from +the font list. +
  +
Opcode: 185 (sub-opcode 1) +
  +
Syntax: void fnts_remove ( FNT_DIALOG *fnt_dialog ); +
  +
Description: The call fnts_remove removes the fonts registered with fnts_add +from the font list. The following applies: +
  +

+
+ + + + + + + + +
ParameterMeaning
fnt_dialogPointer to management structure
+
+ +
Hint: If a program's user fonts have been installed, then +fnts_remove must be called before fnts_delete. +
  +
Return value: The function does not return a result. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: Font selection +
  +
See also: Binding   fnts_delete   fnts_add   xFSL interface +
  + +
+ +

8.25.12.1 Bindings for fnts_remove

+ + + + + + + + + +
C: void fnts_remove ( FNT_DIALOG *fnt_dialog ); +
  +
Binding: +
  +
void fnts_remove ( FNT_DIALOG *fnt_dialog )
+{
+   addr_in[0] = fnt_dialog;
+   int_in[0] = 1;
+   crys_if (185);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]185 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]fnt_dialog
int_inint_in[0]1 # Sub-opcode
+
+ + +
+ +

8.25.13 fnts_update

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Font selector update window« - Update font selector. +
  +
Opcode: 185 (sub-opcode 2) +
  +
Syntax: int16_t fnts_update ( FNT_DIALOG *fnt_dialog, int16_t +button_flags, int32_t id, fix31 pt, int32_t ratio ); +
  +
Description: The call fnts_update ensures an update of the font selector. +The following apply: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
fnt_dialog Pointer to management structure +
button_flags Flags for supported buttons: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
0x0001 = Select checkbox for the names +
0x0002 = Select checkbox for the style +
0x0004 = Select checkbox for the height +
0x0008 = Select checkbox for the width/height ratio +
0x0100 = Display checkbox for the names +
0x0200 = Display checkbox for the style +
0x0400 = Display checkbox for the height +
0x0800 = Display checkbox for the width/height ratio +
0x1000 = Width/height ratio adjustable +
0x2000 = Button 'Set' selectable +
0x4000 = Button 'Mark' selectable + +
+ +
id Font ID +
pt Height in 1/65536 point +
ratio Width/height ratio in 1/65536 + +
+ +
Return value: The function returns one of the following values: +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
-1=Function not present
0=Error (insufficient memory), the font selector
  must then be closed with fnts_close().
1=All OK
+
+ +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
This function was not present in older versions of WDIALOG. The +binding ensures that in that case intout[0] returns -1. +
  +
Group: Font selection +
  +
See also: Binding   fnts_close   xFSL interface +
  + +
+ +

8.25.13.1 Bindings for fnts_update

+ + + + + + + + + +
C: int16_t fnts_update ( FNT_DIALOG *fnt_dialog, int16_t +button_flags, int32_t id, fix31 pt, int32_t ratio ); +
  +
Binding: +
  +
int16_t fnts_update ( FNT_DIALOG *fnt_dialog,
+                      int16_t button_flags,
+                      int32_t id, fix31 pt, int32_t ratio )
+{
+   addr_in[0] = fnt_dialog;
+
+   int_in[0]    = 2;
+   int_in[1]    = button_flags;
+   int_in[2..3] = id;
+   int_in[4..5] = pt;
+   int_in[6..7] = ratio;
+   crys_if (185);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]185 # Function opcode
control+2control[1]8 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]fnt_dialog
int_inint_in[0]2
int_in+2int_in[1]button_flags
int_in+4int_in[2..3]id
int_in+8int_in[4..5]pt
int_in+12int_in[6..7]ratio
int_outint_out[0]Return value
+
+ + +
+ +

8.25.14 Font selector in a window

+ + + + + + + + + + + + + + + +
Program start: fnts_create() +
. +
Calling the font selector: fnts_open() +
. +
Event loop: fnts_evnt() +
. +
......Possibly fnts_get_no_styles()/fnts_get_style()/... +
(depending on the status of the checkboxes) +
. +
Closing the font selector: fnts_close() +
. +
Program end: fnts_delete() + +
+ +

8.25.15 Font selector in a modal dialog

+ + + + + + + + + +
Program start: fnts_create() +
. +
Calling the font selector: fnts_do() +
. +
+
......Possibly fnts_get_no_styles()/fnts_get_style()/... +
(depending on status of the checkboxes) +
. +
Program end: fnts_delete() + +
+ +
+ +Home +AESAES +Extended shell libraryExtended shell library +AES function listAES function list + + diff --git a/en/form.html b/en/form.html new file mode 100644 index 000000000..9e802f954 --- /dev/null +++ b/en/form.html @@ -0,0 +1,3723 @@ + + + + + +The documentation for TOS: Form library + + + + + + + + + +Home +AESAES +Extended file-selectorsExtended file-selectors +Geneva libraryGeneva library + +
+ +

8.11 Form library

+

This library contains useful functions for handling dialog and +alert boxes of all kinds. The following routines are available for +this purpose: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
form_alert Displays standardized alert box +
form_button Simulates a mouse-click +
form_center Centres an object +
form_dial Reserves and releases screen memory +
form_do Processes a dialog +
form_error Outputs operating system error alert +
form_keybd Processes keyboard input +
form_popup Manages a popup-menu +
form_wbutton Simulates a mouse-click (in window) +
form_wkeybd Processes keyboard input (in window) +
form_xdial Reserves/releases screen memory (Flydials) +
form_xdo Extended dialog handling +
form_xerr Outputs operating system error alert (MagiC) +
xfrm_popup Manages a popup-menu (extended version) +
x_form_center Centres an object (Geneva) +
x_form_error Outputs operating system error alert (Geneva) +
x_form_filename Convert to/from a standard GEMDOS filename in editable field in +a dialog. +
x_form_mouse Handle mouse clicks in a dialog, including editable cursor +movement. + +
+ +

Note: Some of these functions are only present under +MagiC, and offer additional convenience (e.g. movable dialog +boxes). +

+

See also: Dialog boxes   Style guidelines   Scrollable input +fields +

+

8.11.1 form_alert

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Form alert box« - Display an alert box. +
  +
Opcode: 52 +
  +
Syntax: int16_t form_alert ( int16_t fo_adefbttn, CONST int8_t +*fo_astring ); +
  +
Description: The call form_alert displays a standardized alert box on the +screen and returns the index of the button with which the alert box +was exited. During this the AES saves the background and restores +it after the alert box is closed. +
  +
The parameter fo_adefbttn determines the index of the +default exit button of the alert box. The following apply: +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
ValueMeaning
0No default button
1First button
2Second button
3Third button
+
+ +
The parameter fo_astring is a pointer to the formatted +string that determines the appearance of the alert box. The format is +'[n][lines][buttons]' where n is the index number of the icon +to be included: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
n Meaning Icon +
    +
0 No icon   +
+
1 Exclamation mark +

+
2 Question mark +

+
3 Stop sign +

+
4 Info icon, as of AES 4.10 +

+
5 Diskette icon, as of AES 4.10 +

+
6 Bomb, XaAES +

+
7 System, XaAES +

+ +
+ +
Note: The available icons should not be used in an +arbitrary manner, but should suit the situation in each case, i.e.: +
  +
    +
  • The exclamation mark should be used for any kind of +message that the user should just confirm briefly. +
      +

  • +
  • The question mark serves for all queries that should be +answered before an action takes place (e.g. the deletion of a file). +
      +

  • +
  • The stop sign should be employed for serious problems +which it is imperative that the user knows about. +
      +

  • +
+ +
The component lines describes the individual text lines +that are to appear in the alert box. There can be up to five text +lines, each with a maximum of 30 characters, which are separated from +each other by a '|' character. +
  +
The component buttons describes the texts for up to +three buttons with up to 10 characters each, which are separated by a +'|' character from each other. +
  +
Note: All AES versions below 1.06 have problems +formatting alert strings padded with spaces; to make alerts look right +with all AES versions, do not pad any line or button with spaces, +apart from adding one space to the longest text line of an alert (to +prevent the last character touching the right border in some AES +versions). +
  +
+
MagiC:
+
+

Due to the compatibility to GEM/3, alert boxes here can +contain up to 40 characters per text line and 20 characters per +button. In addition, all alert boxes may be operated completely via +the keyboard, with the function key [F1] servicing the left, [F2] the +centre and [F3] the right button. +
  +

+ +
+
ViewMAX/2
+
+

and later parse the 'default button' parameter as two bytes; +the low byte is the default button and the high byte is the Cancel +button (ESC is a shortcut for it). This style of parameter will crash +earlier GEM versions. +
  +

+ +
+
Under Geneva,
+
+

the alert string can contain left bracket ('[') characters +within the text of the buttons. These denote the keyboard equivalents +to be used for the buttons. For example, this defines an alert with +the equivalents [Alternate][H] and [Alternate][Y]: +
  +
form_alert( 1, "[1][Hi there!][[Hi!|B[ye!]" ); +
  +
If an alert button does not contain a pre-defined keyboard +equivalent, it will be considered for an automatic keyboard +equivalent. +
  +
Note: DO NOT use this type of alert string when running +without Geneva, as this will have some unpredictable results. +
  +
Additionally, if an alert would normally not have a default +button, Geneva always forces the rightmost button to be the default. +For example: +
  +
form_alert( 2, "[1][Hi!][OK]" ); /* OK is the default +*/ +
  +

+ +
+
+
Return value: This will be the index of the button with which the alert box +was quit; the button at far left has the index 1, and so on in +sequence. +
  +
Availability: All AES versions. +
  +
Group: Form library +
  +
See also: Binding +
  + +
+ +

8.11.1.1 Bindings for form_alert

+ + + + + + + + + +
C: int16_t form_alert ( int16_t fo_adefbttn, CONST int8_t +*fo_astring ); +
  +
Binding: +
  +
int16_t form_alert (int16_t fo_adefbttn,
+                    CONST int8_t *fo_astring)
+{
+   int_in[0]  = fo_adefbttn;
+   addr_in[0] = fo_astring;
+
+   return ( crys_if(52) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]52 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]fo_adefbttn
addr_inaddr_in[0]fo_astring
int_outint_out[0]Return value
+
+ + +
+ +

8.11.2 form_button

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Form button« - Simulate the clicking on an object. +
  +
Opcode: 56 +
  +
Syntax: int16_t form_button ( OBJECT *fo_btree, int16_t fo_bobject, +int16_t fo_bclicks, int16_t *fo_bnxtobj ); +
  +
Description: The call form_button simulates mouse clicks on an object. The +following apply: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
fo_btree Address of the object tree in memory +
fo_bobject Object to be processed +
fo_bclicks Number of mouse clicks +
fo_bnxtobj New current object, or 0 if the next object has the status +HIDDEN or DISABLED, or is not editable + +
+ +
Note: At a double-click on an object with TOUCHEXIT, bit +15 will be set in the parameter fo_bnxtobj. The rectangle list +will not be taken into account by this function. +
  +
The correct usage of the function is as follows: +
  +
    +
  • Monitor mouse clicks with evnt_multi or evnt_button +
  • +
  • Once a click occurs, use obj_find to check if the click was +made on the object. +
  • +
  • If it was, call form_button with the appropriate values. +
  • +
+ +
Warning: This function was not originally documented by +Atari, so you may need to add bindings for it to some earlier 'C' +compilers. +
  +
Return value: The return value of the function is 0 if an EXIT or TOUCHEXIT +object was selected, else it is positive. +
  +
Availability: All AES versions. +
  +
Group: Form library +
  +
See also: Binding   OBJECT   evnt_multi   form_keybd +
  + +
+ +

8.11.2.1 Bindings for form_button

+ + + + + + + + + +
C: int16_t form_button ( OBJECT *fo_btree, int16_t fo_bobject, +int16_t fo_bclicks, int16_t *fo_bnxtobj ); +
  +
Binding: +
  +
int16_t form_button (OBJECT *fo_btree, int16_t fo_bobject,
+                     int16_t fo_bclicks, int16_t *fo_bnxtobj)
+{
+   int_in[0]  = fo_bobject;
+   int_in[1]  = fo_bclicks;
+   addr_in[0] = fo_btree;
+
+   crys_if (56);
+
+   *fo_bnxtobj = int_out[1];
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]56 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]2 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]fo_bobject
int_in+2int_in[1]fo_bclicks
addr_inaddr_in[0]fo_btree
int_outint_out[0]Return value
int_out+2int_out[1]fo_bnxtobj
+
+ + +
+ +

8.11.3 form_center

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Form centered object« - Centre an object on the screen. +
  +
Opcode: 54 +
  +
Syntax: int16_t form_center ( OBJECT *fo_ctree, int16_t *fo_cx, int16_t +*fo_cy, int16_t *fo_cw, int16_t *fo_ch ); +
  +
Description: The call form_center modifies an object's coordinates so that +it will appear at the centre of the display screen, and returns the +actual position of the object. The following apply: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
fo_ctreeAddress of the object tree
fo_cxX-coordinate, and
fo_cyY-coordinate of top left of object
fo_cwWidth, and
fo_chHeight of object (each centred)
+
+ +
Note: The function also takes special attributes of the +object into account, such as OUTLINED, for instance (but not +SHADOWED). +
  +
As of PC-GEM/3 the object tree is no longer centred +in the Y-direction on the whole screen. The reason given for this is +that users of large screen monitors would otherwise have to cover too +large a distance from the menu bar to the object (perhaps a dialog +box). +
  +
Return value: The return value is always 1. +
  +
Availability: All AES versions. +
  +
Group: Form library +
  +
See also: Binding   x_form_center   OBJECT   objc_offset +
  + +
+ +

8.11.3.1 Bindings for form_center

+ + + + + + + + + +
C: int16_t form_center ( OBJECT *fo_ctree, int16_t *fo_cx, int16_t +*fo_cy, int16_t *fo_cw, int16_t *fo_ch ); +
  +
Binding: +
  +
int16_t form_center (OBJECT *fo_ctree, int16_t *fo_cx,
+                     int16_t *fo_cy, int16_t *fo_cw,
+                     int16_t *fo_ch)
+{
+   addr_in[0] = fo_ctree;
+
+   crys_if (54);
+
+   *fo_cx = int_out[1];
+   *fo_cy = int_out[2];
+   *fo_cw = int_out[3];
+   *fo_ch = int_out[4];
+
+   return (int_out[0]);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]54 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]5 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]fo_ctree
int_outint_out[0]Return value
int_out+2int_out[1]fo_cx
int_out+4int_out[2]fo_cy
int_out+6int_out[3]fo_cw
int_out+8int_out[4]fo_ch
+
+ + +
+ +

8.11.4 form_dial

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Form dialog space« - Reserve or release memory for a dialog +object. +
  +
Opcode: 51 +
  +
Syntax: int16_t form_dial ( int16_t fo_diflag, int16_t fo_dilittlx, +int16_t fo_dilittly, int16_t fo_dilittlw, int16_t fo_dilittlh, int16_t +fo_dibigx, int16_t fo_dibigy, int16_t fo_dibigw, int16_t fo_dibigh ); +
  +
Description: The call form_dial takes on various tasks, depending on the +passed parameters. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
fo_diflag Action to be performed +
0 = FMD_START Reserve screen space for a dialog +
1 = FMD_GROW Draw several expanding rectangles from the +coordinates fo_dilittlx/y/w/hto fo_dibigx/y/w/h +
2 = FMD_SHRINK Draw several shrinking rectangles from +fo_dibigx/y/w/h to fo_dilittlx/y/w/h +
3 = FMD_FINISH Release the reserved screen space again +
1000 = X_FMD_START (Geneva) +
Store the information in the rectangular screen area described by +the fo_dibig parameters for restoration later; if there is +insufficient free memory for the area to be saved, then form_dial will +return a 0 (error) condition +
1003 = X_FMD_FINISH (Geneva) +
Copy back the information previously saved with X_FMD_START; this +MUST be done whenever X_FMD_START is used, but not if an error +occurred during the X_FMD_START +
fo_dilittlx X-coordinate, and +
fo_dilittly Y-coordinate of top left corner, +
fo_dilittlw Width, and +
fo_dilittlh Height of the smallest rectangle +
fo_dibigx X-coordinate, and +
fo_dibigy Y-coordinate of top left corner, +
fo_dibigw Width, and +
fo_dibigh Height of the largest rectangle + +
+ +
Note: With the opcode FMD_FINISH, all affected windows +receive a WM_REDRAW message from the AES. However the menu bar can +not be restored in this way, as it lies outside the working +area of the desktop window. +
  +
At the time of writing, the AES does not use FMD_START, but +the call should still be executed for upwards compatibility. +
  +
The opcodes FMD_GROW and FMD_SHRINK in PC-GEM Version 2.0 +fell as victims of the lawsuit between Apple and Digital +Research. +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: All AES versions. +
  +
Group: Form library +
  +
See also: Binding   evnt_mesag   form_xdial   graf_growbox   +graf_shrinkbox +
  + +
+ +

8.11.4.1 Bindings for form_dial

+ + + + + + + + + +
C: int16_t form_dial ( int16_t fo_diflag, int16_t fo_dilittlx, +int16_t fo_dilittly, int16_t fo_dilittlw, int16_t fo_dilittlh, int16_t +fo_dibigx, int16_t fo_dibigy, int16_t fo_dibigw, int16_t fo_dibigh ); +
  +
Binding: +
  +
int16_t form_dial (int16_t fo_diflag, int16_t fo_dilittlx,
+                   int16_t fo_dilittly, int16_t fo_dilittlw,
+                   int16_t fo_dilittlh, int16_t fo_dibigx,
+                   int16_t fo_dibigy, int16_t fo_dibigw,
+                   int16_t fo_dibigh)
+{
+   int_in[0]  = fo_diflag;
+   int_in[1]  = fo_dilittlx;
+   int_in[2]  = fo_dilittly;
+   int_in[3]  = fo_dilittlw;
+   int_in[4]  = fo_dilittlh;
+   int_in[5]  = fo_dibigx;
+   int_in[6]  = fo_dibigy;
+   int_in[7]  = fo_dibigw;
+   int_in[8]  = fo_dibigh;
+
+   return ( crys_if(51) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]51 # Function opcode
control+2control[1]9 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]fo_diflag
int_in+2int_in[1]fo_dilittlx
int_in+4int_in[2]fo_dilittly
int_in+6int_in[3]fo_dilittlw
int_in+8int_in[4]fo_dilittlh
int_in+10int_in[5]fo_dibigx
int_in+12int_in[6]fo_dibigy
int_in+14int_in[7]fo_dibigw
int_in+16int_in[8]fo_dibigh
int_outint_out[0]Return value
+
+ + +
+ +

8.11.5 form_do

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Form do dialog« - Process the dialog with input from the +user. +
  +
Opcode: 50 +
  +
Syntax: int16_t form_do ( OBJECT *fo_dotree, int16_t fo_dostartob ); +
  +
Description: The call form_do takes over the processing of user actions in a +dialog form from the calling application, suspending program control +and handling all selectable objects, radio buttons etc. The following +apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
fo_dotree Pointer to object tree of the dialog box +
fo_dostartob Index of the editable object where the text cursor should be at +the opening of the dialog (the object must have the EDITABLE flag +set); it will be 0 if the object tree contains no editable object + +
+ +
Note: The function only returns once the user activates +an object with the EXIT or TOUCHEXIT flag, and restores control to the +calling program. +
  +
Return value: This will be the index of the object which was used to close +the dialog. With a double-click, in addition bit 15 will be set. +
  +
Availability: All AES versions. +
  +
Group: Form library +
  +
See also: Binding   form_xdo   OBJECT +
  + +
+ +

8.11.5.1 Bindings for form_do

+ + + + + + + + + +
C: int16_t form_do ( OBJECT *fo_dotree, int16_t fo_dostartob ); +
  +
Binding: +
  +
int16_t form_do (OBJECT *fo_dotree, int16_t fo_dostartob)
+{
+   int_in[0]  = fo_dostartob;
+   addr_in[0] = fo_dotree;
+
+   return ( crys_if(50) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]50 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]fo_dostartob
addr_inaddr_in[0]fo_dotree
int_outint_out[0]Return value
+
+ + +
+ +

8.11.6 form_error

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Form error« - Display an alert box form for TOS errors. +
  +
Opcode: 53 +
  +
Syntax: int16_t form_error ( int16_t fo_enum ); +
  +
Description: The call form_error outputs an MS-DOS error number as a plain +text description (i.e. in an alert box form that contains a stop sign +icon at the left side of the box, a text string holding an explanatory +error message or just 'TOS error #X' and a 'Cancel' button). +
  +
The parameter fo_enum is here the corresponding error +number. +
  +
Note: This function is present for reasons of +compatibility to PC-GEM. Hence on TOS systems one first has to +translate the GEMDOS error number to the MS-DOS coding. For the +conversion (GEMDOS -> MS-DOS) one can use, say, the following +formula: (~fo_enum) - 30. +
  +
In N.AES there is an extended form of form_error with all +GEMDOS error-codes. Its presence can be checked with appl_getinfo (opcode +64). +
  +
Geneva interpreted a negative number as a GEMDOS/BIOS error-code, and +an appropriate error-message is displayed. For instance, the call: +
form_error(-33); +
produces an alert with the text 'There is no file with this name'. +
  +
Return value: This will be the index (1-3) of the selected exit button. +However, with current GEM versions only one button is available in +error alerts. +
  +
Availability: All AES versions. +
  +
Group: Form library +
  +
See also: Binding   form_xerr   form_error in N.AES +
  + +
+ +

8.11.6.1 Bindings for form_error

+ + + + + + + + + +
C: int16_t form_error ( int16_t fo_enum ); +
  +
Binding: +
  +
int16_t form_error (int16_t fo_enum)
+{
+   int_in[0] = fo_enum;
+   return ( crys_if(53) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]53 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]fo_enum
int_outint_out[0]Return value
+
+ + +
+ +

8.11.7 form_keybd

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Form keyboard« - Process keyboard input in a dialog box +form. +
  +
Opcode: 55 +
  +
Syntax: int16_t form_keybd ( OBJECT *fo_ktree, int16_t fo_kobject, +int16_t fo_kobnext, int16_t fo_kchar, int16_t *fo_knxtobject, int16_t +*fo_knxtchar ); +
  +
Description: The call form_keybd processes keyboard input for the control of +forms in dialog boxes. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
fo_ktree Address of the object tree +
fo_kobject Index of the editable object +
fo_kobnext Unused, should be 0 +
fo_kchar Pressed key's scancode and ASCII value (as from evnt_keybd or +evnt_multi) +
fo_knxtobject Editable object for next call +
fo_knxtchar 0 = Pressed key was a cursor key, [Tab] or [Return], +processed and handled by the call +
>0 = Character passed to obj_edit without processing + +
+ +
User input may change the editable object (cursor or [Tab] +keys), or select the default object ([Return]). +
  +
Note about MagiC, N.AES: If the value 0x8765 is +specified as the object index, then keys will be processed that are +pressed together with the [Alternate] key. If a matching object is +found then the value 1 will be returned, the character deleted and the +appertaining object index passed in fo_knxtobject. +
  +
Return value: The function returns 0 if an EXIT object was selected, else a +positive number if the dialog should continue to be processed. +
  +
Availability: All AES versions. +
  +
Group: Form library +
  +
See also: Binding   OBJECT   objc_edit   form_button   form_wkeybd +
  + +
+ +

8.11.7.1 Bindings for form_keybd

+ + + + + + + + + +
C: int16_t form_keybd ( OBJECT *fo_ktree, int16_t fo_kobject, +int16_t fo_kobnext, int16_t fo_kchar, int16_t *fo_knxtobject, int16_t +*fo_knxtchar ); +
  +
Binding: +
  +
int16_t form_keybd (OBJECT *fo_ktree, int16_t fo_kobject,
+                    int16_t fo_kobnext, int16_t fo_kchar,
+                    int16_t *fo_knxtobject,
+                    int16_t *fo_knxtchar)
+{
+   int_in[0]  = fo_kobject;
+   int_in[1]  = fo_kchar;
+   int_in[2]  = fo_kobnext;
+   addr_in[0] = fo_ktree;
+
+   crys_if (55);
+
+   *fo_knxtobject = int_out[1];
+   *fo_knxtchar   = int_out[2];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]55 # Function opcode
control+2control[1]3 # Entry in int_in
control+4control[2]3 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]fo_kobject
int_in+2int_in[1]fo_kchar
int_in+4int_in[2]fo_kobnext
addr_inaddr_in[0]fo_ktree
int_outint_out[0]Return value
int_out+2int_out[1]fo_knxtobject
int_out+4int_out[2]fo_knxtchar
+
+ + +
+ +

8.11.8 form_popup

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Form Popup« - Manage a popup menu. +
  +
Opcode: 135 +
  +
Syntax: int16_t form_popup ( OBJECT *tree, int16_t x, int16_t y ); +
  +
Description: The call form_popup displays a popup menu on the screen and +takes over its management. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
tree Address of the object tree +
x X-coordinate, and +
y Y-coordinate, around which the box is to be centered + +
+ +
Note: If the parameters x and y have the +value 0, then the corresponding values from the object structure will +be respected, and the centering is abandoned. At all times the +function ensures that the complete popup is displayed on the screen. +
  +
Selectable objects must have the status SELECTABLE and +non-selectable objects the status DISABLED assigned. The +object with the index 0 in the object tree should be of the type G_BOX +or G_IBOX. +
  +
Return value: The function returns the index of the selected object from the +popup menu, else the value -1. +
  +
Availability: As of MagiC 1.11, but can also be inquired for by appl_getinfo +(opcode 9), as other systems also understand this function. +
  +
Group: Form library +
  +
See also: Binding   OBJECT   xfrm_popup +
  + +
+ +

8.11.8.1 Bindings for form_popup

+ + + + + + + + + +
C: int16_t form_popup ( OBJECT *tree, int16_t x, int16_t y ); +
  +
Binding: +
  +
int16_t form_popup (OBJECT *tree, int16_t x, int16_t y)
+{
+   int_in[0]  = x;
+   int_in[1]  = y;
+   addr_in[0] = tree;
+
+   return ( crys_if(135) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]135 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]x
int_in+2int_in[1]y
addr_inaddr_in[0]tree
int_outint_out[0]Return value
+
+ + +
+ +

8.11.9 form_wbutton

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Form window button« - Simulate the clicking on an object in +a window. +
  +
Opcode: 63 +
  +
Syntax: int16_t form_wbutton ( OBJECT *fo_btree, int16_t fo_bobject, +int16_t fo_bclicks, int16_t *fo_bnxtobj, int16_t whandle ); +
  +
Description: The call form_wbutton simulates the clicking on an object in a +window. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
fo_btree Address of the object tree +
fo_bobject Object to be processed +
fo_bclicks Number of mouse clicks +
fo_bnxtobj New current object, or 0 if the next object has the status +HIDDEN or DISABLED, or is not editable +
whandle Window ID + +
+ +
Note: With a double-click on a TOUCHEXIT objec, bit 15 +will be set in the parameter fo_bnxtobj. +
  +
The function corresponds essentially to form_button, with the +difference that the rectangle list of a window is taken into account. +
  +
Return value: The function returns 0 if an EXIT object was selected, else a +positive value. +
  +
Availability: As of MagiC Version 5.10 +
  +
Group: Form library +
  +
See also: Binding   OBJECT   evnt_multi   form_keybd +
  + +
+ +

8.11.9.1 Bindings for form_wbutton

+ + + + + + + + + +
C: int16_t form_wbutton ( OBJECT *fo_btree, int16_t fo_bobject, +int16_t fo_bclicks, int16_t *fo_bnxtobj, int16_t whandle ); +
  +
Binding: +
  +
int16_t form_wbutton (OBJECT *fo_btree, int16_t fo_bobject,
+                      int16_t fo_bclicks, int16_t *fo_bnxtobj,
+                      int16_t whandle)
+{
+   int_in[0]  = fo_bobject;
+   int_in[1]  = fo_bclicks;
+   int_in[2]  = whandle;
+
+   addr_in[0] = fo_btree;
+
+   crys_if (63);
+
+   *fo_bnxtobj = int_out[1];
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]63 # Function opcode
control+2control[1]3 # Entry in int_in
control+4control[2]2 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]fo_bobject
int_in+2int_in[1]fo_bclicks
int_in+4int_in[2]whandle
addr_inaddr_in[0]fo_btree
int_outint_out[0]Return value
int_out+2int_out[1]fo_bnxtobj
+
+ + +
+ +

8.11.10 form_wkeybd

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Form window keyboard« - Process keyboard input into a form +in a window. +
  +
Opcode: 64 +
  +
Syntax: int16_t form_wkeybd ( OBJECT *fo_ktree, int16_t fo_kobject, +int16_t fo_kobnext, int16_t fo_kchar, int16_t *fo_knxtobject, int16_t +*fo_knxtchar, int16_t whandle ); +
  +
Description: The call form_wkeybd processes keyboard input into a form in a +window. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
fo_ktree Address of the object tree +
fo_kobject Index of the editable object +
fo_kobnext Unused, should be 0 +
fo_kchar Pressed key's scancode and ASCII value (as from evnt_keybd or +evnt_multi) +
fo_knxtobject Editable object for next call +
fo_knxtchar 0 = Pressed key was a cursor key, [Tab] or [Return], +processed and handled by the call +
>0 = Character passed to obj_edit without processing +
whandle Window ID + +
+ +
User input may change the editable object (cursor or [Tab] +keys), or select the default object (Return). +
  +
Note about MagiC, XaAES: If the value 0x8765 is +specified as the object index, then keys will be processed that are +pressed together with the [Alternate] key. If a matching object is +found then the value 1 will be returned, the character deleted and the +appertaining object index passed in fo_knxtobject. +
  +
This function essentially corresponds to form_keybd with the +difference that here the rectangle list of a window is taken into +account. +
  +
Return value: The function returns 0 if an EXIT object was selected, else a +positive number if the dialog should continue to be processed. +
  +
Availability: As of MagiC Version 5.10, XaAES. +
  +
Group: Form library +
  +
See also: Binding   OBJECT   objc_edit   form_button +
  + +
+ +

8.11.10.1 Bindings for form_wkeybd

+ + + + + + + + + +
C: int16_t form_wkeybd ( OBJECT *fo_ktree, int16_t fo_kobject, +int16_t fo_kobnext, int16_t fo_kchar, int16_t *fo_knxtobject, int16_t +*fo_knxtchar, int16_t whandle ); +
  +
Binding: +
  +
int16_t form_wkeybd (OBJECT *fo_ktree, int16_t fo_kobject,
+                     int16_t fo_kobnext, int16_t fo_kchar,
+                     int16_t *fo_knxtobject,
+                     int16_t *fo_knxtchar, int16_t whandle)
+{
+   int_in[0]  = fo_kobject;
+   int_in[1]  = fo_kchar;
+   int_in[2]  = fo_kobnext;
+   int_in[3]  = whandle;
+
+   addr_in[0] = fo_ktree;
+
+   crys_if (64);
+
+   *fo_knxtobject = int_out[1];
+   *fo_knxtchar   = int_out[2];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]64 # Function opcode
control+2control[1]4 # Entry in int_in
control+4control[2]3 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]fo_kobject
int_in+2int_in[1]fo_kchar
int_in+4int_in[2]fo_kobnext
int_in+6int_in[3]whandle
addr_inaddr_in[0]fo_ktree
int_outint_out[0]Return value
int_out+2int_out[1]fo_knxtobject
int_out+4int_out[2]fo_knxtchar
+
+ + +
+ +

8.11.11 form_xdial

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Form Xdialog space« - Reserve or release screen memory for a +dialog object when using Flydials. +
  +
Opcode: 51 +
  +
Syntax: int16_t form_xdial ( int16_t fo_diflag, int16_t fo_dilittlx, +int16_t fo_dilittly, int16_t fo_dilittlw, int16_t fo_dilittlh, int16_t +fo_dibigx, int16_t fo_dibigy, int16_t fo_dibigw, int16_t fo_dibigh, +void **flydial ); +
  +
Description: The call form_xdial takes on various tasks, depending on the +passed parameters. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
fo_diflag 0 = FMD_START reserves screen memory for the dialog +
3 = FMD_FINISH restores the screen and releases the buffer +used to save the background in +
fo_dilittlx X-coordinate, and +
fo_dilittly Y-coordinate of the top left corner, +
fo_dilittlw Width, and +
fo_dilittlh Height of the smallest growing or shrinking rectangle +
fo_dibigx X-coordinate, and +
fo_dibigy Y-coordinate of the top left corner, +
fo_dibigw Width, and +
fo_dibigh Height of the largest growing or shrinking rectangle +
flydial See below + +
+ +
Note: If flydial is non-zero, a test is made +whether enough memory is available to save the background of the +dialog box. A pointer to this saved data is then stored in this +variable. If insufficient memory is available to save the background, +then the dialog box processed by form_xdo is not movable; in that case +also the dialog will display no 'fly corner' ('asses ear'). +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: When Flydials is in use, whose presence can be checked for with +appl_getinfo (opcode 14). +
  +
Group: Form library +
  +
See also: Binding   evnt_mesag   form_dial   graf_growbox   graf_shrinkbox +
  + +
+ +

8.11.11.1 Bindings for form_xdial

+ + + + + + + + + +
C: int16_t form_xdial ( int16_t fo_diflag, int16_t fo_dilittlx, +int16_t fo_dilittly, int16_t fo_dilittlw, int16_t fo_dilittlh, int16_t +fo_dibigx, int16_t fo_dibigy, int16_t fo_dibigw, int16_t fo_dibigh, +void **flydial ); +
  +
Binding: +
  +
int16_t form_xdial (int16_t fo_diflag, int16_t fo_dilittlx,
+                    int16_t fo_dilittly, int16_t fo_dilittlw,
+                    int16_t fo_dilittlh, int16_t fo_dibigx,
+                    int16_t fo_dibigy, int16_t fo_dibigw,
+                    int16_t fo_dibigh, void **flydial)
+{
+   int_in[0]  = fo_diflag;
+   int_in[1]  = fo_dilittlx;
+   int_in[2]  = fo_dilittly;
+   int_in[3]  = fo_dilittlw;
+   int_in[4]  = fo_dilittlh;
+   int_in[5]  = fo_dibigx;
+   int_in[6]  = fo_dibigy;
+   int_in[7]  = fo_dibigw;
+   int_in[8]  = fo_dibigh;
+   addr_in[0] = flydial;
+   addr_in[1] = 0;            /* reserved */
+
+   return ( crys_if(51) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]51 # Function opcode
control+2control[1]9 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]fo_diflag
int_in+2int_in[1]fo_dilittlx
int_in+4int_in[2]fo_dilittly
int_in+6int_in[3]fo_dilittlw
int_in+8int_in[4]fo_dilittlh
int_in+10int_in[5]fo_dibigx
int_in+12int_in[6]fo_dibigy
int_in+14int_in[7]fo_dibigw
int_in+16int_in[8]fo_dibigh
addr_inaddr_in[0]flydial
addr_in+4addr_in[1]0
int_outint_out[0]Return value
+
+ + +
+ +

8.11.12 form_xdo

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Form do Xdialog« - Process an extended dialog with user +input. +
  +
Opcode: 50 +
  +
Syntax: int16_t form_xdo ( OBJECT *tree, int16_t startob, int16_t +*lastcrsr, XDO_INF *tabs, void *flydial ); +
  +
Description: The call form_xdo takes on the handling of user actions in a +dialog form. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
tree Pointer to object tree of the dialog box +
startob Index of the editable object where the text cursor should be at +the opening of the dialog (the object must have the EDITABLE flag +set); it will be 0 if the object tree contains no editable object +
lastcrsr Contains the index of the object where the cursor was at the +closing of the dialog +
tabs Pointer to keyboard tables, or NULL +
flydial The corresponding parameter returned by form_xdial, or NULL if +foregoing Flydials + +
+ +
Return value: This will be the index of the object used to close the dialog. +
  +
Availability: The function is only available under MagiC (as of Version 2.0). +The presence of the Flydials and keyboard tables as well as the +possibility of establishing the last cursor position can be inquired +for with appl_getinfo (opcode 14). +
  +
Group: Form library +
  +
See also: Binding   form_do +
  + +
+ +

8.11.12.1 Bindings for form_xdo

+ + + + + + + + + +
C: int16_t form_xdo ( OBJECT *tree, int16_t startob, int16_t +*lastcrsr, XDO_INF *tabs, void *flydial ); +
  +
Binding: +
  +
int16_t form_xdo (OBJECT *tree, int16_t startob,
+                  int16_t *lastcrsr,
+                  XDO_INF *tabs, void *flydial)
+{
+   int_in[0]  = startob;
+   addr_in[0] = tree;
+   addr_in[1] = tabs;
+   addr_in[2] = flydial;
+
+   crys_if (50);
+
+   *lastcrsr = int_out[1];
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]50 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]2 # Entry in int_out
control+6control[3]3 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]startob
addr_inaddr_in[0]tree
addr_in+4addr_in[1]tabs
addr_in+8addr_in[2]flydial
int_outint_out[0]Return value
int_out+2int_out[1]lastcrsr
+
+ + +
+ +

8.11.13 form_xerr

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Form Xerror« - Display an error box for TOS errors +(MagiC). +
  +
Opcode: 136 +
  +
Syntax: int16_t form_xerr ( int32_t errcode, int8_t *errfile ); +
  +
Description: The call form_xerror outputs an error number as a plain text +description (i.e. in an alert box form that contains a stop sign icon +at the left side of the box, a text string holding an explanatory +error message or just 'TOS error #X' and a 'Cancel' button). In +contrast to form_error, there is no need for translation from the +TOS to the MS-DOS format. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
errcode Normal, negative GEMDOS or BIOS error-code; if this is EBREAK +(program termination with [Control]-[C]) or E_OK (no error) then no +alert box will be displayed +
errfile Path of the file in which the error arose. With a NULL-pointer +this parameter will be ignored; -1 means that the message will be +prefaced with 'The program returned:' + +
+ +
Return value: This will be the index (1-3) of the selected exit button. +However, with current GEM versions only one button is available in +error alerts. +
  +
Availability: The function is available only under MagiC (as of Version 2.0). +
  +
Group: Form library +
  +
See also: Binding   form_error +
  + +
+ +

8.11.13.1 Bindings for form_xerr

+ + + + + + + + + +
C: int16_t form_xerr ( int32_t errcode, int8_t *errfile ); +
  +
Binding: +
  +
int16_t form_xerr (int32_t errcode, int8_t *errfile)
+{
+   int_in[0]  = errcode (High);
+   int_in[1]  = errcode (Low);
+   addr_in[0] = errfile;
+
+   return ( crys_if(136) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]136 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]errcode (High)
int_in+2int_in[1]errcode (Low)
addr_inaddr_in[0]errfile
int_outint_out[0]Return value
+
+ + +
+ +

8.11.14 xfrm_popup

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »XForm popup« - Manage a popup menu (extended MagiC version). +
  +
Opcode: 135 +
  +
Syntax: int16_t xfrm_popup( OBJECT *tree, int16_t x, int16_t y, int16_t +firstscrlob, int16_t lastscrlob, int16_t nlines, void cdecl +(*init)(OBJECT *tree, int16_t scrollpos, int16_t nlines, void *param), +void *param, int16_t *lastscrlpos ) +
  +
Description: The call xfrm_popup displays a popup menu on the screen, and +takes on its management. The followiong apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
tree Address of the object tree +
x X-coordinate, and +
y Y-coordinate around which the box is to be centered +
firstscrlob Object index of the first scrollable object +
lastscrlob Object index of the last scrollable object +
nlines Number of lines actually present +
init Callback routine for translating the objects. tree, +param and nlines are the parameters that were passed +in xfrm_popup. scrollpos specifies the current scroll +position. It lies at: 0..(nlines-(lastscrlob-firstscrlob+1). If the +popup should not scroll, init == NULL must be passed. +
param User-defined parameter +
lastscrlpos Last scroll position + +
+ +
Note: If the parameters x and y have the +value 0, then the corresponding values from the object structure will +be respected, and the centering is abandoned. At all times the +function ensures that the complete popup is displayed on the screen. +
  +
Selectable objects must have the flag SELECTABLE and +non-selectable objects the status DISABLED assigned. The +object with the index 0 in the object tree should be of the type G_BOX +or G_IBOX. +
  + +
    +
  1. The object tree is initialized automatically by a call of the +init routine before the first drawing action. +
      +

  2. +
  3. The variable scrollpos need not be initialized, as the +system always start at scrollpos 0. +
      +

  4. +
  5. The init routine is responsible for initializing the +first and/or last scroll object with an arrow. +
      +

  6. +
  7. The scrollable objects are firstscrlob ... +lastscrlob. The object indices must be consecutive numbers. +The objects must lie directly below each other and all must have the +same size. +
      +

  8. +
+ +
Return value: The function returns the index of the selected object from the +popup menu, else the value -1. +
  +
Availability: The function is available as of MagiC 5.03. +
  +
Group: Form library +
  +
See also: Binding   OBJECT   form_popup +
  + +
+ +

8.11.14.1 Bindings for xfrm_popup

+ + + + + + + + + +
C: int16_t xfrm_popup( OBJECT *tree, int16_t x, int16_t y, int16_t +firstscrlob, int16_t lastscrlob, int16_t nlines, void cdecl +(*init)(OBJECT *tree, int16_t scrollpos, int16_t nlines, void *param), +void *param, int16_t *lastscrlpos ) +
  +
Binding: +
  +
int16_t xfrm_popup( OBJECT *tree, int16_t x, int16_t y,
+                    int16_t firstscrlob, int16_t lastscrlob,
+                    int16_t nlines,
+                    void  cdecl (*init)(OBJECT *tree,
+                    int16_t scrollpos,
+                    int16_t nlines, void *param),
+                    void *param, int16_t *lastscrlpos )
+{
+   int_in[0]  = x;
+   int_in[1]  = y;
+   int_in[2]  = firstscrlob;
+   int_in[3]  = lastscrlob;
+   int_in[4]  = nlines;
+   int_in[5]  = *lastscrlpos;
+   addr_in[0] = tree;
+   addr_in[1] = init;
+   addr_in[2] = param;
+
+   int_out[1] = *lastscrlpos;   /* Preset this */
+
+   crys_if(135)
+
+   *lastscrlpos = int_out[1];
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]135 # Function opcode
control+2control[1]6 # Entry in int_in
control+4control[2]2 # Entry in int_out
control+6control[3]3 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]x
int_in+2int_in[1]y
int_in+4int_in[2]firstscrlob
int_in+6int_in[3]lastscrlob
int_in+8int_in[4]nlines
int_in+10int_in[5]lastscrlpos
addr_inaddr_in[0]tree
addr_in+4addr_in[1]init
addr_in+8addr_in[2]param
int_outint_out[0]Return value
int_out+2int_out[1]lastscrlpos
+
+ + +
+ +

8.11.15 x_form_center

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »XForm centered object« - Centre an object on the screen +(extended version for Geneva). +
  +
Opcode: 28944 +
  +
Syntax: int16_t x_form_center( OBJECT *tree, int16_t *cx, int16_t *cy, +int16_t *cw, int16_t *ch ); +
  +
Description: The function x_form_center will center a dialog on the screen, +taking into account all object attributes that can affect the outer +border. The following apply: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
treeObject tree being modified
cxX-coordinate of the outer rectangle
cyY-coordinate of the outer rectangle
cwWidth of the outer rectangle
chHeight of the outer rectangle
+
+ +
This function is essentially identical in purpose to the AES +form_center call, however it takes all attributes which can affect the +size of the outer border of the object tree (SHADOWED, OUTLINED, 3D +effect, etc.) into consideration. The returned rectangle describes the +entire area containing these effects. +
  +
Return value: The function always return a value 1. +
  +
Availability: The function is only available under Geneva. +
  +
Group: Form library +
  +
See also: Binding   form_center +
  + +
+ +

8.11.15.1 Bindings for x_form_center

+ + + + + + + + + +
C: int16_t x_form_center( OBJECT *tree, int16_t *cx, int16_t *cy, +int16_t *cw, int16_t *ch ); +
  +
Binding: +
  +
int16_t x_form_center( OBJECT *tree, int16_t *cx, int16_t *cy,
+                       int16_t *cw, int16_t *ch )
+{
+   addr_in[0] = tree;
+
+   crys_if(28944);
+
+   *cx = int_out[1];
+   *cy = int_out[2];
+   *cw = int_out[3];
+   *ch = int_out[4];
+
+   return (int_out[0]);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]28944 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]5 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]tree
int_outint_out[0]Return value
int_out+2int_out[1]cx
int_out+4int_out[2]cy
int_out+6int_out[3]cw
int_out+8int_out[4]ch
+
+ + +
+ +

8.11.16 x_form_error

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »XForm error« - Display an error box for TOS errors +(Geneva). +
  +
Opcode: 28945 +
  +
Syntax: int16_t x_form_error ( uint8_t *fmt, int16_t errnum ); +
  +
Description: The function x_form_error takes the error-code specified by +errnum and finds an appropriate error-message string. It then +inserts this text into a program-defined alert string and displays an +alert. +
  +
The fmt should be in standard form_alert format, with a +'%s' to indicate the location where the error-message should be +inserted. Since an alert can contain no more than five lines of 30 +characters each, and the predefined error-messages can take up to +three lines, there should be no more than two lines of text +surrounding the inserted error text. +
  +
Example: +
  +
if( x_form_error( "[1][Error!|%s][Continue|Quit]", -33 ) == 1 )
+  continue...
+else quit...
+
+
Return value: This will be the index (1-3) of the selected exit button. +
  +
Availability: The function is only available under Geneva. +
  +
Group: Form library +
  +
See also: Binding   form_error   form_xerr   form_error in N.AES +
  + +
+ +

8.11.16.1 Bindings for x_form_error

+ + + + + + + + + +
C: int16_t x_form_error ( uint8_t *fmt, int16_t errnum ); +
  +
Binding: +
  +
int16_t x_form_error ( uint8_t *fmt, int16_t errnum )
+{
+   int_in[0] = errnum;
+
+   addr_in[0] = fmt;
+
+   return ( crys_if(28945) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]28945 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]enum
addr_inaddr_in[0]fmt
int_outint_out[0]Return value
+
+ + +
+ +

8.11.17 x_form_filename

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »XForm filename« - Convert to/from a standard GEMDOS filename +in editable field in a dialog. +
  +
Opcode: 28996 +
  +
Syntax: int16_t x_form_filename( OBJECT *tree, int16_t obj, int16_t +to_from, uint8_t *string ); +
  +
Description: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
tree Object tree of the dialog containing the editable field +
obj Index of the editable object in the tree +
to_from Convert to (0) or from (1) the field +
string Pointer to the string containing the GEMDOS-formatted +(FILENAME.EXT) string. + +
+ +
Since filenames are typically entered in a GEM dialog using the +period to separate the filename from the extension, and filenames with +less than eight characters before the period are padded with spaces, +converting to and from the editable field can be a difficult task. +
  +
When the mode parameter passed to x_form_filename is 0, the +string is converted from the FILENAME.EXT format to the editable field +format. When mode is 1, the filename is converted from the editable +field and written into string in FILENAME.EXT format. Note that this +function assumes that the editable field is an object of type G_FTEXT +or G_FBOXTEXT and uses the te_ptmplt string "________.___". +
  +
Example: +
  +
OBJECT *tree;
+char name[13] = "DEFAULT.TXT";
+
+x_form_filename( tree, object, 0, name );
+form_do( tree, object );
+x_form_filename( tree, object, 1, name );
+/* "name" now contains what the user changed it to */
+
+
Return value: Return always 1. +
  +
Availability: The function is only available under Geneva. +
  +
Group: Form library +
  +
See also: Binding +
  + +
+ +

8.11.17.1 Bindings for x_form_filename

+ + + + + + + + + +
C: int16_t x_form_filename( OBJECT *tree, int16_t obj, int16_t +to_from, uint8_t *string ); +
  +
Binding: +
  +
int16_t x_form_filename( OBJECT *tree, int16_t obj,
+                         int16_t to_from, uint8_t *string )
+{
+   int_in[0] = obj;
+   int_in[1] = to_from;
+
+   addr_in[0] = tree;
+   addr_in[1] = string;
+
+   return ( crys_if(28996) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]28996 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]obj
int_in+2int_in[1]to_from
addr_inaddr_in[0]tree
addr_in+4addr_in[1]string
int_outint_out[0]Return value
+
+ + +
+ +

8.11.18 x_form_mouse

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »XForm mouse« - Handle mouse clicks in a dialog, including +editable cursor movement. +
  +
Opcode: 28997 +
  +
Syntax: int16_t x_form_mouse( OBJECT *tree, int16_t mouse_x, int16_t +mouse_y, int16_t clicks, int16_t *edit_obj, int16_t *next_obj, int16_t +*edit_idx ); +
  +
Description: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
tree Object tree of the dialog +
mouse_x X coordinate of the mouse pointer +
mouse_y Y coordinate of the mouse pointer +
clicks Number of clicks to be processed +
edit_obj Object currently having the edit cursor +
next_obj Object selected with the mouse +
edit_idx Position of edit cursor within field + +
+ +
This function begins by calling form_button. If neither an EXIT +nor a TOUCHEXIT button is selected, and the object is EDITABLE, then +the editable cursor is moved to the character within the editable +field which is under the mouse pointer. +
  +
Return value: 0 = An object was selected +
1 = No object +
  + + + + + + + + + + + + +
Parameter Meaning +
edit_obj New object having the edit cursor +
next_obj Selected object, or 0 for none +
edit_idx New edit cursor position + +
+ +
Availability: The function is only available under Geneva. +
  +
Group: Form library +
  +
See also: Binding +
  + +
+ +

8.11.18.1 Bindings for x_form_mouse

+ + + + + + + + + +
C: int16_t x_form_mouse( OBJECT *tree, int16_t mouse_x, int16_t +mouse_y, int16_t clicks, int16_t *edit_obj, int16_t *next_obj, int16_t +*edit_idx ); +
  +
Binding: +
  +
int16_t x_form_mouse( OBJECT *tree, int16_t mouse_x, int16_t
+mouse_y, int16_t clicks, int16_t *edit_obj, int16_t *next_obj,
+int16_t *edit_idx )
+{
+   int_in[0] = mouse_x;
+   int_in[1] = mouse_y;
+   int_in[2] = clicks;
+   int_in[3] = edit_obj;
+   int_in[4] = next_obj;
+   int_in[5] = edit_idx;
+
+   addr_in[0] = tree;
+
+   crys_if(28997);
+
+   *edit_obj = int_out[1];
+   *next_obj = int_out[2];
+   *edit_idx = int_out[3];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]28997 # Function opcode
control+2control[1]6 # Entry in int_in
control+4control[2]4 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]tree
int_inint_in[0]mouse_x
int_in+2int_in[1]mouse_y
int_in+4int_in[2]clicks
int_in+6int_in[3]edit_obj
int_in+8int_in[4]next_obj
int_in+10int_in[5]edit_idx
int_outint_out[0]Return value
int_out+2int_out[1]edit_obj
int_out+4int_out[2]next_obj
int_out+6int_out[3]edit_idx
+
+ + +
+ +
+ +Home +AESAES +Extended file-selectorsExtended file-selectors +Geneva libraryGeneva library + + diff --git a/en/fsel.html b/en/fsel.html new file mode 100644 index 000000000..eabfa9cbc --- /dev/null +++ b/en/fsel.html @@ -0,0 +1,940 @@ + + + + + +The documentation for TOS: File-selector library + + + + + + + + + +Home +AESAES +Application libraryApplication library +Print dialogsPrint dialogs + +
+ +

8.4 File-selector library

+

The functions of this library make a file-selector available, +which is used for loading and saving files. The following routines are +present for this purpose: +

+ + + + + + + + + + + + +
fsel_boxinput Selects filename with file-selector (Boxkite) +
fsel_exinput Selects filename with file-selector (AES 1.4 onwards) +
fsel_input Selects filename with file-selector +
x_fsel_input Selects filename with file-selector (Geneva) + +
+ +

Note: Unfortunately alternative file systems (keyword: +long filenames) are not supported; as of MagiC 4 however this is taken +over by the functions of the FSLX library. +

+

See also: Extended file-selectors   Style guidelines +

+

8.4.1 fsel_boxinput

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »File selection extended input« - Select filenames. +
  +
Opcode: 91 +
  +
Syntax: int16_t fsel_boxinput ( int16_t *global, int8_t *fs_einpath, +int8_t *fs_einsel, int16_t *fs_eexbutton, int8_t *elabel, +FSEL_CALLBACK callback ); +
  +
Description: The call fsel_boxinput makes a file-selector dialog box +available, which can also be passed a title string. It is used in an +extended version of the file-selector BoxKite. +
  +
The function can be passed the following parameters: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
fs_einpath Name of the default access path (absolute) with appended search +mask; after the call it contains the new pathname +
fs_einsel Name of the default file; after the call it contains the newly +selected filename +
fs_eexbutton Exit button: +
+
+ + + + + + + + + + +
0='Cancel' was selected
1='OK' was selected
+
+ +
fs_elabel Title-line +
callback Address of a function that is called by BoxKite if a GEM +message is to be passed to the main application. +
This includes not just the message WM_REDRAW but also WM_MOVED, +for instance, as there are some operating system versions that offer +movement of windows lying at the back. Messages that implicitly open new +windows or top existing ones, on the other hand, should be ignorerd or +stored and only processed after return from the file-selector. +WM_TOPPED messages are not passed through to the message callback. + +
+ +
Hint: BoxKite as of Version 2.00 also makes the +functions of the MagiC file-selector available. The presence of this call should be +checked for using appl_getinfo (opcode 7). +
  +
Return value: It is imperative that the return value of the function (0 = +error) is respected, as a shortage of memory, for instance, may make +it impossible to use a file-selector. +
  +
Availability: If BoxKite from Version 1.71 on is installed. This can be checked +for by the presence of the cookie HBFS. But note that this is also +present for versions earlier than Version 1.71. +
  +
Group: File-selector library +
  +
See also: Binding   XFS-concept in MagiC +
  + +
+ +

8.4.1.1 Bindings for fsel_boxinput

+ + + + + + + + + +
C: +
  + +
/* Message handler for updating background windows */ +
typedef void cdecl (* FSEL_CALLBACK)(int16_t *msg); +
  +
int16_t fsel_boxinput ( int16_t *global, int8_t *fs_einpath, +int8_t *fs_einsel, int16_t *fs_eexbutton, int8_t *elabel, +FSEL_CALLBACK callback ); +
  +
Binding: +
  +
int16_t fsel_boxinput ( int16_t *global, int8_t *fs_einpath,
+                        int8_t *fs_einsel,
+                        int16_t *fs_eexbutton,
+                        int8_t *elabel,
+                        FSEL_CALLBACK callback )
+{
+  void *aespb[6], *addrin[6], *addrout[6];
+  int contrl[5], intin[16], intout[7];
+
+  aespb[0] = contrl;
+  aespb[1] = global;
+  aespb[2] = intin;
+  aespb[3] = intout;
+  aespb[4] = addrin;
+  aespb[5] = addrout;
+
+  contrl[0] = 91;
+  contrl[1] = 0;
+  contrl[2] = 2;
+  contrl[3] = 4;
+  contrl[4] = 0;
+
+   addr_in[0] = fs_einpath;
+   addr_in[1] = fs_einsel;
+   addr_in[2] = elabel;
+   addr_in[3] = callback;
+
+  _crystal((AESPB *)aespb);
+
+   *fs_eexbutton = int_out[1];
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]91 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]2 # Entry in int_out
control+6control[3]4 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]fs_einpath
addr_in+4addr_in[1]fs_einsel
addr_in+8addr_in[2]elabel
addr_in+12addr_in[3]callback
int_outint_out[0]Return value
int_out+2int_out[1]fs_eexbutton
+
+ + +
+ +

Note: BoxKite requires information from the 'global' +array of the main application. The supplied GEM bindings of +development systems normally pass this automatically. +

+

8.4.2 fsel_exinput

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »File selection extended input« - Select filenames. +
  +
Opcode: 91 +
  +
Syntax: int16_t fsel_exinput ( int8_t *fs_einpath, int8_t *fs_einsel, +int16_t *fs_eexbutton, int8_t *elabel ); +
  +
Description: The call fsel_exinput makes a system file-selector dialog box +available in which the user may choose a complete GEMDOS path +specification. It may also be passed a title-string that is to appear +in the file-selector (normally indicating the action the user is about +to take). +
  +

+
The function can be passed the following parameters: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
fs_einpath Name of the default access path (absolute) with appended search +mask; after the call it contains the new pathname +
fs_einsel Name of the default file; after the call it contains the newly +selected filename +
fs_eexbutton Exit button: +
+
+ + + + + + + + + + +
0='Cancel' was selected
1='OK' was selected
+
+ +
fs_elabel Titelzeile + +
+ +
Notes: The function should be nested with wind_update +(BEG_MCTRL or END_MCTRL) to prevent double-clicks being passed on to +underlying windows. +
  +
fs_einpath points to a character buffer at least 128 +bytes long (200 bytes if CD-ROMs are to be accessed). +fs_einsel points to a 13-byte buffer (12 for filename +characters plus a terminating NULL). fs_elabel points to a +buffer up to 30 characters long. +
  +
Return value: It is imperative that the return value of the function (0 = +error) is respected, as a shortage of memory, for instance, may make +it impossible to use a file-selector. +
  +
Availability: This function is available only from AES 1.4 onwards. +
  +
It is also present in FreeGEM. To check for this feature, use +appl_init and check that xbuf.arch is non-zero. +
  +
If it is available, it should be used rather than the fsel_input +call, as with the latter the user is not reminded what the function is +actually doing. +
  +
Group: File-selector library +
  +
See also: Binding   fsel_input   XFS-concept in MagiC +
  + +
+ +

8.4.2.1 Bindings for fsel_exinput

+ + + + + + + + + +
C: int16_t fsel_exinput ( int8_t *fs_einpath, int8_t *fs_einsel, +int16_t *fs_eexbutton, int8_t *elabel ); +
  +
Binding: +
  +
int16_t fsel_exinput (int8_t *fs_einpath, int8_t *fs_einsel,
+                      int16_t *fs_eexbutton, int8_t *elabel)
+{
+   addr_in[0] = fs_einpath;
+   addr_in[1] = fs_einsel;
+   addr_in[2] = elabel;
+
+   crys_if (91);
+
+   *fs_eexbutton = int_out[1];
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]91 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]2 # Entry in int_out
control+6control[3]3 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]fs_einpath
addr_in+4addr_in[1]fs_einsel
addr_in+8addr_in[2]elabel
int_outint_out[0]Return value
int_out+2int_out[1]fs_eexbutton
+
+ + +
+ +

8.4.3 fsel_input

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »File selection input« - Selects filenames. +
  +
Opcode: 90 +
  +
Syntax: int16_t fsel_input ( int8_t *fs_iinpath, int8_t *fs_iinsel, +int16_t *fs_iexbutton ); +
  +
Description: The call fsel_input makes a file-selector dialog box available: +The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
fs_iinpath Name of the default access path (absolute) with appended search +mask; after the call it contains the new pathname +
fs_iinsel Name of the default file; after the call it contains the newly +selected filename +
fs_iexbutton Exit button: +
+
+ + + + + + + + + + +
0='Cancel' was selected
1=OK' was selected
+
+ + +
+ +
Notes: The function should be nested with wind_update +(BEG_MCTRL or END_MCTRL) to prevent double-clicks being passed on to +underlying windows. +
  +
fs_iinpath points to a character buffer at least 128 +bytes long (200 bytes if CD-ROMs are to be accessed). +fs_iinsel points to a 13-byte buffer (12 for filename +characters plus a terminating NULL). +
  +
Incidentally, AES versions earlier than 1.4 can only display +a maximum of 100 files; there a 'ping' warns if not all files can be +displayed. +
  +
Return value: It is imperative that the return value of the function (0 = +error) is respected, as a shortage of memory, for instance, may make +it impossible to use a file-selector. +
  +
Availability: All AES versions, not present in ViewMAX/3, and will crash +ViewMAX/2. +
  +
Group: File-selector library +
  +
See also: Binding   fsel_exinput   XFS-concept in MagiC +
  + +
+ +

8.4.3.1 Bindings for fsel_input

+ + + + + + + + + +
C: int16_t fsel_input ( int8_t *fs_iinpath, int8_t *fs_iinsel, +int16_t *fs_iexbutton ); +
  +
Binding: +
  +
int16_t fsel_input (int8_t *fs_iinpath, int8_t *fs_iinsel,
+                    int16_t *fs_iexbutton)
+{
+   addr_in[0] = fs_iinpath;
+   addr_in[1] = fs_iinsel;
+
+   crys_if (90);
+
+   *fs_iexbutton = int_out[1];
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]90 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]2 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]fs_iinpath
addr_in+4addr_in[1]fs_iinsel
int_outint_out[0]Return value
int_out+2int_out[1]fs_iexbutton
+
+ + +
+ +

8.4.4 x_fsel_input

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Extended file selector« +
  +
Opcode: 28960 +
  +
Syntax: int16_t x_fsel_input( int8_t *inpath, int16_t pathlen, int8_t +*files, int16_t sels, int16_t *exbutton, int8_t *label ); +
  +
Description: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
inpath Pointer to the path (with wildcards) to start selection at +
pathlen Maximum length (incl. null) of inpath +
files Pointer to the string containing the default filename to be +displayed. Also, holds up to "sels" filenames (each +null-terminated) upon return. +
sels Maximum number of items that can be selected upon return from +the call +
exbutton Exit button: +
+
+ + + + + + + + + + +
0='Cancel' was selected
1='OK' was selected
+
+ +
label A label of up to 30 characters, which will appear at the top of +the item selector. + +
+ +
This function is similar to fsel_exinput, but has several +extensions: +
  +
    +
  • The inpath parameter can contain not only the +traditional * and ? wildcards, but can also contain regular +expressions using [] and {}: +
      +
    • Any characters contained between square brackets +("[]") define a list of acceptable characters to substitute +into that one position. This can either be individual characters, like +"[ABCD]", a range separated by a hyphen like +"[A-D]", or a mix of the two, like "[A-DXYZ]". +
    • +
    • A list of words contained within curly brackets +("{}") defines one or more acceptable values. The values +must be separated by commas. +
    • +
    + +
  • +
  • The pathlen parameter defines the maximum length of +inpath. If the user adds too many extensions or the path otherwise +grows too long, an error alert will appear. +
  • +
  • Upon successful return, files can contain up to sels filenames. +Each name in the list is followed by a NULL character (ASCII 0) and +the last filename is followed by a final NULL. The exception to this +rule is when sels is one, in which case the final NULL is not used; +For all other cases, the area pointed to by files must be at least (13 +* sels)+1 bytes long. +
  • +
+ +
Return value: 0 = An error occurred +
  +
Availability: The function is only available under Geneva. +
  +
Group: File-selector library +
  +
See also: Binding +
  + +
+ +

8.4.4.1 Bindings for x_fsel_input

+ + + + + + + + + +
C: int16_t x_fsel_input( int8_t *inpath, int16_t pathlen, int8_t +*files, int16_t sels, int16_t *exbutton, int8_t *label ); +
  +
Binding: +
  +
int16_t x_fsel_input( int8_t *inpath, int16_t pathlen, int8_t
+*files, int16_t sels, int16_t *exbutton, int8_t *label )
+{
+   int_in[0] = pathlen;
+   int_in[1] = sels;
+
+   addr_in[0] = inpath;
+   addr_in[1] = files;
+   addr_in[2] = label;
+
+   crys_if(28960);
+
+   *exbutton = int_out[1];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]28960 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]2 # Entry in int_out
control+6control[3]3 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]pathlen
int_in+2int_in[1]sels
addr_inaddr_in[0]inpath
addr_in+4addr_in[1]files
addr_in+8addr_in[2]label
int_outint_out[0]Return value
int_out+2int_out[1]exbutton
+
+ + +
+ +
+ +Home +AESAES +Application libraryApplication library +Print dialogsPrint dialogs + + diff --git a/en/fslx.html b/en/fslx.html new file mode 100644 index 000000000..15375041d --- /dev/null +++ b/en/fslx.html @@ -0,0 +1,1591 @@ + + + + + +The documentation for TOS: Extended file-selectors + + + + + + + + + +Home +AESAES +Window libraryWindow library +Form libraryForm library + +
+ +

8.10 Extended file-selectors

+

The following functions were introduced with MagiC 4, and permit +management of the file-selector: +

+ + + + + + + + + + + + + + + + + + +
fslx_close Closes the file-selector and releases memory +
fslx_do Faster call-up of the file-selector +
fslx_evnt Releases file-selector for use +
fslx_getnxtfile Obtains all further selected entries +
fslx_open Initializes and opens file-selector +
fslx_set_flags Sets certain flags for the whole system + +
+ +

Note: The existence of these functions can be checked +with a call of appl_getinfo (opcode 7). +

+

The main advantage of using these routines lies in the ability +of the functions specified here to work also with alternative +file-systems (catchword: long filenames). +

+

See also: +
File-selector as a dialog   File-selector in a window   Operation of file-selectors +

+

8.10.1 fslx_close

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »File selectionX close« - Close the file-selector and release +memory. +
  +
Opcode: 191 +
  +
Syntax: int16_t fslx_close ( void *fsd ); +
  +
Description: The call fslx_close closes the file-selector, and releases the +specified descriptor. The following apply: +
  + + + + + + + + + +
Parameter Meaning +
    +
fsd Descriptor that was passed at the successful opening of a +file-selector window + +
+ +
Return value: The function returns the value 1 if successful, else the value +0. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(opcode 7). +
  +
Group: Extended file-selectors +
  +
See also: Binding   fslx_open +
  + +
+ +

8.10.1.1 Bindings for fslx_close

+ + + + + + + + + +
C: int16_t fslx_close ( void *fsd ); +
  +
Binding: +
  +
int16_t fslx_close ( void *fsd )
+{
+   addr_in[0] = fsd;
+   crys_if (191);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]191 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]fsd
int_outint_out[0]Return value
+
+ + +
+ +

8.10.2 fslx_do

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »File selectionX do« - Faster call-up of the file-selector. +
  +
Opcode: 194 +
  +
Syntax: void *fslx_do ( int8_t *title, int8_t *path, int16_t pathlen, +int8_t *fname, int16_t fnamelen, int8_t *patterns, XFSL_FILTER +*filter, int8_t *paths, int16_t *sort_mode, int16_t flags, int16_t +*button, int16_t *nfiles, int8_t **pattern ); +
  +
Description: The call fslx_do displays a file-selector box on the screen, +and takes over its handling. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
title Title of the file-selector, or NULL +
path Complete path, which starts with the drive letter, and ends +with '\' +
pathlen Length of the path-receiving buffer +
fname Buffer for the filename +
fnamelen Length of the filename-receiving buffer +
patterns Filename masks such as '*.TXT', '*.PRG' or '*.IMG'; these +alternative selectable masks are separated by EOS and terminated by +EOS, EOS +
filter Filter function which is called before the mask +comparison (or NULL); if this returns the value 0 the file is invalid, +while a value of 1 will display the filename +
paths Path history; the alternative selectable paths are separated by +EOS and terminated by EOS, EOS +
sort_mode Sort-mode for the display: +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
0=By name
1=By date
2=By size
3=By type
4=Unsorted (physical order)
+
+ +
flags Various settings: + + + + + + + + + +
1 = DOSMODE - This is the compatibility mode, also used by +fsel_(ex)input, and returns filenames basically in the 8+3 format; for +this all subdirectories are called with Dopendir (name, 1) +
2 = Do not follow symbolic links; so in that case the date, +time as well as the XATTR structure that will pass filter will +belong to the link itself +
8 = Multiple selection - In this case several files can be selected +and passed at a time + +
+ +
button Index of the selected button: +
+
+ + + + + + + + + + +
0='Cancel' button
1='OK' button
+
+ +
nfiles Number of selected files +
pattern Selected file mask, such as '*.TXT' + +
+ +
Note: The function is a combination of fslx_open and +fslx_evnt, but uses a non-windowed dialog box. +
  +
Return value: The function returns a pointer to a descriptor, which is to be +specified for the other routines. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(opcode 7). +
  +
Group: Extended file-selectors +
  +
See also: Binding   fslx_open   fslx_evnt +
  + +
+ +

8.10.2.1 Bindings for fslx_do

+ + + + + + + + + +
C: void *fslx_do ( int8_t *title, int8_t *path, int16_t pathlen, +int8_t *fname, int16_t fnamelen, int8_t *patterns, XFSL_FILTER +*filter, int8_t *paths, int16_t *sort_mode, int16_t flags, int16_t +*button, int16_t *nfiles, int8_t **pattern ); +
  +
Binding: +
  +
void *fslx_do ( int8_t *title, int8_t *path, int16_t pathlen,
+                int8_t *fname, int16_t fnamelen,
+                int8_t *patterns, XFSL_FILTER *filter,
+                int8_t *paths, int16_t *sort_mode,
+                int16_t flags, int16_t *button,
+                int16_t *nfiles, int8_t **pattern )
+{
+   addr_in[0] = title;
+   addr_in[1] = path;
+   addr_in[2] = fname;
+   addr_in[3] = patterns;
+   addr_in[4] = filter;
+   addr_in[5] = paths;
+
+   int_in[0] = pathlen;
+   int_in[1] = fnamelen;
+   int_in[2] = *sort_mode;
+   int_in[3] = flags;
+
+   crys_if (194);
+
+   *button    = int_out[1];
+   *nfiles    = int_out[2];
+   *sort_mode = int_out[3];
+   *pattern   = addr_out[1];
+
+   return ( (void *) addr_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]194 # Function opcode
control+2control[1]4 # Entry in int_in
control+4control[2]4 # Entry in int_out
control+6control[3]6 # Entry in addr_in
control+8control[4]2 # Entry in addr_out
addr_inaddr_in[0]title
addr_in+4addr_in[1]path
addr_in+8addr_in[2]fname
addr_in+12addr_in[3]patterns
addr_in+16addr_in[4]filter
addr_in+20addr_in[5]paths
int_inint_in[0]pathlen
int_in+2int_in[1]fnamelen
int_in+4int_in[2]sort_mode
int_in+6int_in[3]flags
addr_outaddr_out[0]Return value
addr_out+4addr_out[1]pattern
int_outint_out[0]1
int_out+2int_out[1]button
int_out+4int_out[2]nfiles
int_out+6int_out[3]sort_mode
+
+ + +
+ +

8.10.3 fslx_evnt

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »File selectionX event« - Takes over the handling of the +file-selector. +
  +
Opcode: 193 +
  +
Syntax: int16_t fslx_evnt ( void *fsd, EVNT *events, int8_t *path, +int8_t *fname, int16_t *button, int16_t *nfiles, int16_t *sort_mode, +int8_t **pattern ); +
  +
Description: The call fslx_evnt takes over the handling of the file-selector +displayed on the screen. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
fsd Descriptor that was passed at a successful opening of a +file-selector window +
events EVNT-structure; the events are serviced by the dialog if they +are intended for the associated window +
path Pointer to the selected path +
fname Pointer to the selected filename +
button Index of the selected button +
+
+ + + + + + + + + + +
0='Cancel' button
1='OK' button
+
+ +
nfiles Number of selected files +
sort_mode Selected sort-mode +
pattern Seleted file pattern, such as '*.TXT' + +
+ +
Note: Events, i.e. mouse clicks, messages and keypresses +are passed on to the file-selector window and serviced by it if +appropriate. When an event has been serviced then the corresponding +bit in the EVENT structure will be cleared. +
  +
Return value: The function returns the value 0 if the dialog is to be +terminated, else the value 1. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(opcode 7). +
  +
Group: Extended file-selectors +
  +
See also: Binding +
  + +
+ +

8.10.3.1 Bindings for fslx_evnt

+ + + + + + + + + +
C: int16_t fslx_evnt ( void *fsd, EVNT *events, int8_t *path, +int8_t *fname, int16_t *button, int16_t *nfiles, int16_t *sort_mode, +int8_t **pattern ); +
  +
Binding: +
  +
int16_t fslx_evnt ( void *fsd, EVNT *events, int8_t *path,
+                    int8_t *fname, int16_t *button,
+                    int16_t *nfiles,
+                    int16_t *sort_mode, int8_t **pattern )
+{
+   addr_in[0] = fsd;
+   addr_in[1] = events;
+   addr_in[2] = path;
+   addr_in[3] = fname;
+
+   crys_if (193);
+
+   *button    = int_out[1];
+   *nfiles    = int_out[2];
+   *sort_mode = int_out[3];
+   *pattern   = addr_out[0];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]193 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]4 # Entry in int_out
control+6control[3]4 # Entry in addr_in
control+8control[4]1 # Entry in addr_out
addr_inaddr_in[0]fsd
addr_in+4addr_in[1]events
addr_in+8addr_in[2]path
addr_in+12addr_in[3]fname
addr_outaddr_out[0]pattern
int_outint_out[0]Return value
int_out+2int_out[1]button
int_out+4int_out[2]nfiles
int_out+6int_out[3]sort_mode
+
+ + +
+ +

8.10.4 fslx_getnxtfile

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »File selectionX get next file« - Obtains all further +selected entries in the file-selector. +
  +
Opcode: 192 +
  +
Syntax: int16_t fslx_getnxtfile ( void *fsd, int8_t *fname ); +
  +
Description: The call fslx_getnxtfile otains all the further, selected +entries in the file-selector. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
fsd Descriptor that was passed at a successful opening of a +file-selector window +
fname Name of the obtained entry + +
+ +
Note: If the flag GETMULTI was passed with fslx_do or +fslx_open, then fslx_do or fslx_evnt will return in the parameter +nfiles the number of files that are still selected in addition +to the one in fname. One can call these further files with +fslx_getnxtfile. Only after this may one call fslx_close. +
  +
Return value: The function returns the value 0 if no further file is +selected, else the value 1 if one filename was still to be copied. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(opcode 7). +
  +
Group: Extended file-selectors +
  +
See also: Binding   fslx_open   fslx_close +
  + +
+ +

8.10.4.1 Bindings for fslx_getnxtfile

+ + + + + + + + + +
C: int16_t fslx_getnxtfile ( void *fsd, int8_t *fname ); +
  +
Binding: +
  +
int16_t fslx_getnxtfile ( void *fsd, int8_t *fname )
+{
+   addr_in[0] = fsd;
+   addr_in[1] = fname;
+
+   crys_if (192);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]192 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]fsd
addr_in+4addr_in[1]fname
int_outint_out[0]Return value
+
+ + +
+ +

8.10.5 fslx_open

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »File selectionX open« - Initializes and opens the +file-selector +
  +
Opcode: 190 +
  +
Syntax: void *fslx_open ( int8_t *title, int16_t x, int16_t y, int16_t +*whdl, int8_t *path, int16_t pathlen, int8_t *fname, int16_t fnamelen, +int8_t *patterns, XFSL_FILTER *filter, int8_t *paths, int16_t +sort_mode, int16_t flags ); +
  +
Description: The call fslx_open initializes and opens the file-selector box. +The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
title Window title of file-selector, may be NULL +
x X-coordinate, and +
y Y-coordinate of the top left corner of the window; for +x=y=-1 the window will be centred +
whdl Window handle after successful opening +
path Complete path, starts with drive and ends with '\'. +
From MagiC 6.10 onwards the path may be initialized incompletely, +as with fsel_xxx, e.g. as an empty string; MagiC will then complete +the path in a sensible way +
pathlen Length of path buffer, i.e. maximum pathlength + 1 (for EOS) +
fname Buffer for the filename +
fnamelen Length of filename buffer, i.e. maximum length of filename + 1 +(for EOS) +
patterns Filemask, e.g. '*.TXT' or '*.PRG,*.APP'. The alternatively +selectable masks are separated by EOS and terminated by EOS,EOS. +
From MagiC 6.10 onwards a NULL-pointer may be passed here, in +which case MagiC then uses '*\0'. +
filter May be NULL. The filter function is called before the mask +comparison. If it returns 0 then the file is invalid, if 1 is returned +then the filename will be displayed. +
paths Path "history" e.g. "C:\\BIN\\" etc. The +alternatively selectable paths are separated by EOS and terminated by +EOS,EOS. A NULL-pointer may be passed here. +
sort_mode Sort-mode for the display: + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SORTBYNAME (0)=By name
SORTBYDATE (1)=By date
SORTBYSIZE (2)=By size
SORTBYTYPE (3)=By type
SORTBYNONE (4)=Unsorted (physical order)
SORTDEFAULT (-1)=Default
+
+ +
SORTDEFAULT exists from Magic 6.10 onwards and means that the +sort mode saved in the system will be used. + + + +
flags Various settings: + + + + + + + + + +
1 = (DOSMODE) This is the compatibility mode that is also used by +fsel_(ex)input and basically returns filenames in the 8+3 format; for +this all directories are called with Dopendir(DOPEN_COMPAT) +
2 = (NFOLLOWSLKS) Symbolic links will not be followed, i.e. date +and time etc., as well as the XATTR-structure that is passed to +filter, belong to the link itself +
8 = If GETMULTI is set, one can select and pass several files at +the same time; for this fslx_getnxtfile is used if fslx_evnt or +fslx_do in the parameter nfiles signals that there are still +further files selected + +
+ + +
+ +
Return value: The function returns a descriptor for the further actions, else +the value NULL if an error has arisen. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(opcode 7). +
  +
Group: Extended file-selectors +
  +
See also: Binding   fslx_close +
  + +
+ +

8.10.5.1 Bindings for fslx_open

+ + + + + + + + + +
C: void *fslx_open ( int8_t *title, int16_t x, int16_t y, int16_t +*whdl, int8_t *path, int16_t pathlen, int8_t *fname, int16_t fnamelen, +int8_t *patterns, XFSL_FILTER *filter, int8_t *paths, int16_t +sort_mode, int16_t flags ); +
  +
Binding: +
  +
void *fslx_open ( int8_t *title, int16_t x, int16_t y,
+                  int16_t *whdl, int8_t *path,
+                  int16_t pathlen, int8_t *fname,
+                  int16_t fnamelen, int8_t *patterns,
+                  XFSL_FILTER *filter, int8_t *paths,
+                  int16_t sort_mode, int16_t flags )
+{
+   addr_in[0] = title;
+   addr_in[1] = path;
+   addr_in[2] = fname;
+   addr_in[3] = patterns;
+   addr_in[4] = filter;
+   addr_in[5] = paths;
+
+   int_in[0] = x;
+   int_in[1] = y;
+   int_in[2] = pathlen;
+   int_in[3] = fnamelen;
+   int_in[4] = sort_mode;
+   int_in[5] = flags;
+
+   crys_if (190);
+
+   *whdl = int_out[0];
+   return ( (void *) addr_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]190 # Function opcode
control+2control[1]6 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]6 # Entry in addr_in
control+8control[4]1 # Entry in addr_out
addr_inaddr_in[0]title
addr_in+4addr_in[1]path
addr_in+8addr_in[2]fname
addr_in+12addr_in[3]patterns
addr_in+16addr_in[4]filter
addr_in+20addr_in[5]paths
int_inint_in[0]x
int_in+2int_in[1]y
int_in+4int_in[2]pathlen
int_in+6int_in[3]fnamelen
int_in+8int_in[4]sort_mode
int_in+10int_in[5]flags
addr_outaddr_out[0]Return value
int_outint_out[0]whdl
+
+ + +
+ +

8.10.6 fslx_set_flags

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »File selectionX set flags« - Sets certain flags of the +file-selector for the whole system. +
  +
Opcode: 195 +
  +
Syntax: int16_t fslx_set_flags ( int16_t flags, int16_t *oldval ); +
  +
Description: The call fslx_set_flags sets certain flags of the file-selector +box for the whole system. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
flags Various flags: + + + + +
1 = SHOW8P3 is valid only for the display of directories on DOS +drives; it corresponds to the switch "Show TOS Files as +'8+3'" in Magxdesk + +
+ +
oldval Previous value + +
+ +
Return value: The function return the value 0 in case of error, else the +value 1 for error-free execution. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(opcode 7). +
  +
Group: Extended file-selectors +
  +
See also: Binding   fslx_open   fslx_close +
  + +
+ +

8.10.6.1 Bindings for fslx_set_flags

+ + + + + + + + + +
C: int16_t fslx_set_flags ( int16_t flags, int16_t *oldval ); +
  +
Binding: +
  +
int16_t fslx_set_flags ( int16_t flags, int16_t *oldval )
+{
+   int_in[0] = 0;
+   int_in[1] = flags;
+
+   crys_if (195);
+
+   *oldval = int_out[1];
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]195 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]2 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]0
int_in+2int_in[1]flags
int_outint_out[0]Return value
int_out+2int_out[1]oldval
+
+ + +
+ +

8.10.7 Operation of file-selectors from MagiC 4 onwards

+

MagiC as from Version 4.0 makes its own file-selector box +available, which apart from support of long filenames also offers some +operating niceties otherwise known only from alternative +file-selectors. The following table gives a synopsis of the more +important shortcuts: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Key presses Function +
    +
Return No file selected: Returns the text in the editable +field to the program. +
File selected: Returns the selected file. +
Folder selected: Opens the folder. +
Alt-A..Z Opens the respective drive in current directory +
Ctrl-Esc Rereads the directory +
Ctrl-Backspace or +
Ctrl-H Goes back one directory level +
Ctrl-D Deselects all entries. With this one can force the return of +the input filename in place of the selected file. +
Cursor up,down Moves selection up/down +
Ctrl-Cursor up,down Scrolls up/down +
Sh-Cursor up,down Moves selection by one page +
Sh-Ctrl-Cursor up,down Scrolls page by page +
Home Selects topmost element +
Sh-Home Selects lowest element + +
+ +

There are some things to note for the operation of the +buttons too: A double-click on the 'parent' field jumps back to +the root directory. A click on a line selects the object. In cases +where several files are selectable (can be influenced through the +system call), these can be selected with a [Shift]-click. +
In each case one can deselect one file with [Shift]-click. +

+

Further, one should note: +

+
    +
  • Long filenames are returned only if the caller has signalled +beforehand with Pdomain(1) that he could do something with them. +
      +

  • +
  • When selecting a folder with [Return], the input field will be +cleared. If nothing is selected, then 'Cursor down' selects the first +line, 'Cursor up' the last line. +
      +

  • +
  • With the old calls fsel_(ex)input, the sort-mode is set during +booting to 'By name' and later stored in a global variable, i.e. the +last set sort-mode is saved until the next boot process. +
      +

  • +
  • With the old function fsel_(ex)input the mask '*.*' instead of +'*' may be returned in some cases. +
      +

  • +
+ +

See also: Key assignments +

+

8.10.8 File-selector as a dialog

+
fsel = fslx_do(..., &button, &nfiles, ...);
+
+if (fsel) /* Was the selector open? */
+{
+   if (button)
+   {
+      while (--nfiles) /* Several files? */
+         fslx_getnxtfile(...);   /* Get them all */
+   }
+
+   fslx_close(fsel); /* Release everything again */
+}
+
+

8.10.9 File-selector in a window

+
fsel = fslx_open(...);
+if (fsel)
+{
+   do {
+      evnt.mwhich = evnt_multi(...);
+      rv = fslx_evnt(fsel, &evnt, ..., &nfiles, ...);
+
+      /* Evaluate bits for own windows/menus */
+   } while (rv);
+
+   while (--nfiles) fslx_getnxtfile(...);
+   fslx_close(fsel);
+}
+
+
+ +Home +AESAES +Window libraryWindow library +Form libraryForm library + + diff --git a/en/gem_about.html b/en/gem_about.html new file mode 100644 index 000000000..b6b290ffa --- /dev/null +++ b/en/gem_about.html @@ -0,0 +1,218 @@ + + + + + +The documentation for TOS: GEM + + + + + + + + + +Home +TOSTOS +The Operating System TOSThe Operating System TOS +BIOSBIOS + +
+ +

2.2 GEM

+

GEM (Graphics Environment Manager) is a +part of the operating system that represents the (graphical) interface +between the computer and the user. GEM was developed by the firm +Digital Research in 1984 for PCs with Intel processors. The +system became well-known, however, mainly when the Atari ST was +marketed, offering a powerful and well- priced alternative to the (at +the time) expensive PC and Macintosh machines. +

+

In the course of time, GEM was adapted to various operating +systems and hardware platforms, including: +

+
    +
  • PC GEM +
  • +
  • Atari GEM +
  • +
  • GEM on X (version for Unix systems) +
  • +
  • X/GEM, for FlexOS operation system +
  • +
+ +

GEM may be divided into two sub-areas: +

+
    +
  • AES, Application Environment Services +
  • +
  • VDI, Virtual Device Interface +
  • +
+ +

The AES takes charge of organising the user environment, +whereas the VDI looks after a uniform graphical rendition of the +user interface. During development of GEM programs it is imperative to +keep to the valid style guidelines and never attempt to force on the user one's +own interface 'surface' that doesn't keep to any standards. +

+

2.2.1 The various GEM versions

+

For the GEM version number one normally uses the ID returned in +the global field by the appl_init call. The VDI, on the other hand, +has actually no version number of its own, the more so as the +behaviour of the individual VDI-functions is determined principally +by the device drivers used which are, after all, replacable. +

+

One can differentiate roughly between the following +GEM-versions: +

+ +

GEM 1.x: This first AES version (1.x) had, not +accidently, very great similarities with the operating system of the +Apple Macintosh. This manifested itself not only in the design of the +window elements, but also in many features of the desktop and other +application programs. At the time, GEM was exhibited mostly in +connection with test versions of GEM-Draw, GEM-Paint and +GEM-Write, which corresponded in many details with the known +Macintosh prototypes MacDraw, MacPaint and MacWrite. +

+

This is also the version that was finally adopted by Atari and +delivered in the ST; all newer versions of Atari-GEM are also based +on this version. This is because the Atari company then acquired all +the rights for the existing version, and itself continued to develop +it. This also explains the ever-yawning differences between PC-GEM +and Atari-GEM. The greatest defect of the Atari version was surely the +absence of the Graphics Device Operating Systems (GDOS); this contains +device-independent graphical functions, which were implemented on the +Atari only for the screen, and so had to be post- loaded separately +for printers, plotters, cameras etc. As a result (particularly in the +early days of the Atari), each program used their own drivers and +formats, so that data exchange between applications became almost +impossible. +

+ +

GEM 2.x: Due to a legal dispute between Apple and +Digital Research (which mainly concerned the look of application +programs and the desktop), the PC-version of the GEM had to be +altered. +

+

The settlement, which did not affect Atari's GEM-version, +looked like this: +

+
    +
  • Some window elements were altered in such a way that they no +longer looked like the Macintosh windows (above all the title bar) +
  • +
  • The Accessory menu wandered into the opposite (right) corner of +the screen +
  • +
  • The functions graf_growbox and graf_shrinkbox were eliminated +
  • +
  • The desktop was reprogrammed completely, and tied down to two +fixed windows. Contrary to customary views, however, this was only a +change in the desktop, and not in the AES, which continued to +permit up to eight overlapping windows. +
  • +
+ +

However there were not just restrictions, but also improvements. +The most important example one should mention is that accessories +could install their own menu bar. +

+

This version received the version number 2.0 and was supplied +from 1987 onwards; only a little later it was ported by the Dutch +software house ABC together with GEM-Draw, GEM-Paint, +GEM-Graph and of course the GEM desktop to the Atari. +However this version never attained much importance, unfortunately, +and is today no longer available. +

+ +

PC-GEM 3.x: This version contained some minor +improvements. Thus the menu behaviour can be switched from drop-down +to pull-down, for instance. +

+

From GEM/3 version 3.11 on further VDI-functions exist, which +are concerned with Bezier functions and Postscript printers. The +program ARTLINE makes use of these new functions with its vector +fonts. +

+

Due to the dominance of MS-Windows this version has practically +vanished from the PC market. +

+

GEM Desktop 3.13 : The last standard retail version shipped. +Part of the GEM PTK/SDK 3.13 which finally was rewritten to support +ANSI C compilers. +

+ +

GEM/4: Only made it to the market as runtime support +for Artline/2, PresTeam/2, Publish it/3 etc. The VDI will use EMS, if +available. +

+

The GEM/3 desktop will not run properly, and a com shell +provided to launch gem/4 apps from the GEM/3 desktop may crash +after repeated use. +

+ +

GEM/5: Only made it to the market as runtime support +for Timeworks Publisher 2.1. It had scalable font support using XMS +memory, and adds 3D look and feel to AES objects. +

+

Both GEM/4 and GEM/5 added new VDI and AES calls but their +bindings are unknown. This proprietary AES 4.0 has support for a new +MU_HELP message and some calls take an additional parameter for +context-sensitive help. What these features really do is not known. +

+ +

GEM/XM: Probably the model for DRI's X/GEM for FlexOS +(a 32bit protected mode multitasking system). GEM/XM planned to bring +support for multitasking under DOS but remained unfinished. Latest +release is FreeGEM/XM 3.0beta5-je1. +

+ + +

ViewMAX: ViewMAX/1 (DR-DOS 5.0) is a 'crippled' GEM/4 +kernel and can only be used as a shell to call GEM Applications. +Although designed for DR DOS, it will run under MS-DOS 3.x and later +(minus passwords). To use it with GEM apps you must have a GEM/3 +installation as well as a ViewMAX installation. This version was +written in Lattice C 3.x +

+

ViewMAX/2 (DR-DOS 6.0) was an improved version of the above, but +with the same kernel limitations as the above. This version was +rewritten in Turbo C2.0 and and allows configuration via *.ini file. +

+

ViewMAX/3 (DR-DOS 7.0) was never released but beta code is +available. +

+ + + +

X/GEM: This GEM version was developed by Digital +Research on a multi-user multitasking operating system (FlexOS), +and permits the simultaneous handling of several applications in the +foreground. +

+ +

Atari-GEM 1.4: Major changes were made by Atari only +in GEM 1.4 of TOS 1.04; best known feature is the greatly improved +file selector. +

+ +

Atari-GEM 3.x: Not yet written. +

+ +

Atari-GEM 4.x: Not yet written. +

+

See Also: GEM   Style guidelines +

+
+ +Home +TOSTOS +The Operating System TOSThe Operating System TOS +BIOSBIOS + + diff --git a/en/gemdos_about.html b/en/gemdos_about.html new file mode 100644 index 000000000..1933a3e6f --- /dev/null +++ b/en/gemdos_about.html @@ -0,0 +1,96 @@ + + + + + +The documentation for TOS: About the GEMDOS + + + + + + + + + +Home +GEMDOSGEMDOS +GEMDOSGEMDOS +Support for alternative file-systemsSupport for alternative file-systems + +
+ +

5.1 About the GEMDOS

+

The GEMDOS is, apart from the hardware-dependent BIOS and +XBIOS, the actual operating system of the Atari and its functions +form the highest level of TOS. The functions are called via the +680X0 Trap #1. The operating system functions can be easily divided +into categories by the first letter of the function name: +

+ + + + + + + + + + + + + + + + + + + + + + + + +
File functions (F...) +
Date and Time (T...) +
Process functions (P...) +
Memory management (M...) +
System functions (S...) +
Directory functions (D...) +
Character input/output (C...) +
Network (F...) + +
+ +

Under MagiC, GEMDOS is reentrant (as of MagiC 3.0 this applies +even for the file-system!). This is visible, for instance, by alert +boxes of the type "Data in Drive A: may be damaged" being +movable - because memory has to be demanded for this, which does not +work under (Multi)TOS, as a file operation in GEMDOS is being +handled at the same time. +

+ +

With the appearance of MiNT, the GEMDOS was extended by many +functions. Also MagiC as of Version 3.0 possesses some +MiNT-compatible functions and MetaDOS drivers with corresponding +functionality have been spotted. +

+ + +

The GEMDOS receives its parameters on the stack; for this, the +last argument from the parameter list is stored as the first on the +stack. Function results are returned in processor register d0. Only +the registers d3-d7 and a3-a7 are saved, all others will be altered by +the call. +

+

See also: XFS-concept in MagiC   Background-DMA   Program format   Function list +

+
+ +Home +GEMDOSGEMDOS +GEMDOSGEMDOS +Support for alternative file-systemsSupport for alternative file-systems + + diff --git a/en/gemdos_argv.html b/en/gemdos_argv.html new file mode 100644 index 000000000..942e4ff3d --- /dev/null +++ b/en/gemdos_argv.html @@ -0,0 +1,158 @@ + + + + + +The documentation for TOS: ARGV procedure + + + + + + + + + +Home +GEMDOSGEMDOS +NetworkNetwork +C'Task RoyalC'Task Royal + +
+ +

5.18 ARGV procedure

+ +

The ARGV procedure serves for passing extended command lines, +and was specified officially in the autumn of 1989 by Ken +Badertscher (of Atari USA). The procedure works as follows: +

+

The environmental variable ARGV indicates that this procedure is +being used; the value of the variables does not play a part in +this, only its presence is decisive. The ARGV variable must be the +last environmental variable, so that the called program can continue +to use the "front" part as its normal environment. +

+

The extended command line is now simply written as a series of +strings (NULL-terminated !) after ARGV in the environment. The first +string here contains the name of the launched program, in the same way +that it is passed with Pexec (and corresponds to the so far unused +argv[0]). The following strings contain the individual parameters, in +which space characters may appear too; the end of the list is +indicated by a double 0, as for a normal environment. +

+

Beyond that one passes the value 127 with Pexec as the +length-byte (first byte of the command line), which due to the +existing length restriction to 125 bytes could not be accepted until +now. This allows the called program to make sure that the values +passed in the environment are really valid and have not been left +behind by a program that does not know the ARGV standard, perhaps. +

+

Depending on whether one wants to pass parameters to programs +via ARGV or just to read them, one proceeds in one of the following +two ways: +

+

• ARGV with a launched program +

+ +

First establish whether the variable ARGV is present in the +environment. If this is the case and the command line +length-byte has the value 127, then one finds after the first 0 +following ARGV (since the variable could have a value) the individual +command line parameters. At the end one should set the first letter of +'ARGV' to 0 so that the environment takes the standard form again. +

+

• ARGV at the caller +

+ +

First a new environment has to be created for the program to be +called. To do this, calculate, say, the length of the environment +already present, add the length of the command line and allocate a +corresponding number of bytes. Then copy the existing environment (and +during this remove any existing ARGV variable), followed by the +command line parameters one after the other (each NULL-terminated). A +final NULL concludes the environment. At the end pass the magic value +127 in the length-byte of the command line. +

+

• Extension of the ARGV procedure +

+ +

A problem with the original definition of the ARGV procedure was +not being able to pass empty parameters (two zeros following +each other will terminate the environment !). To be able to pass these +nevertheless, the procedure was extended as follows: +

+
    +
  • Empty parameters are set in the command line in single +quotation marks, and appear in the environment as exactly one +space. +
      +

  • +
  • A value is defined for the variable ARGV: if this starts with +'NULL:', the rest of the line contains comma-separated positions of +the empty parameters. Example: ARGV=NULL:3,5,9 means that +argv[3], argv[5] and argv[9] are empty. The startup code should then +be responsible for deleting the corresponding parameters. +
      +

  • +
+ +

Note: To ensure maximum compatibility to old programs, +the extended ARGV procedure should be used only when empty +parameters actually have to be passed. In all other cases one should +fall back to the original definiton. +

+

• ARGV procedure as of MagiC 3.0 +

+ + +

From MagiC 3 onwards the ARGV procedure is supported by Pexec +in three different ways: +

+
    +
  • If the length-byte of the command line is 127, Pexec +assumes that the calling program supports ARGV and the environment has +been manipulated accordingly already; the environment is not changed, +therefore. +
      +

  • +
  • If the length-byte is 254, MagiC expects directly +after it the string "ARGV=", followed by a NULL-byte and a +list of parameters terminated by two NULL-bytes. By passing +"ARGV=NULL..." etc. one can also use the extended ARGV +procedure that permits passing of empty parameters (see above). +
      +
    Pexec deletes any ARGV present and enters the new environment. +The command line consists only of the value 127 as an indicator that +the parameters lie in the environment. This procedure is suitable if +it is certain that the called program can handle the ARGV procedure. +
      +

  • +
  • If the length-byte is 255, MagiC expects directly +after it a space-separated and NULL-byte terminated list of parameters +(as the command line is passed generally). Pexec deletes any ARGV +that may be present, creates a list of arguments from the command line +and enters these as ARGV into the environment. The program file path +that was passed to Pexec will be taken as argv[0]. If this path is +invalid the result will be rubbish, so one should pass a sensible +program name even with mode 5 of Pexec (create basepage). With mode +7, argv[0] will simply be called "NONAME", since no name is +passed in this case. +
      +
    The command line has 127 as a length-byte as an indicator of the +presence of ARGV. If the length of the command line is < 127, then +it will also be copied to the basepage, otherwise the command line +consists only of the value 127. This procedure is suitable if the +called program is not certain that it understands ARGV. +
      +

  • +
+ +
+ +Home +GEMDOSGEMDOS +NetworkNetwork +C'Task RoyalC'Task Royal + + diff --git a/en/gemdos_chrinout.html b/en/gemdos_chrinout.html new file mode 100644 index 000000000..220a9711c --- /dev/null +++ b/en/gemdos_chrinout.html @@ -0,0 +1,1455 @@ + + + + + +The documentation for TOS: Character input/output + + + + + + + + + +Home +GEMDOSGEMDOS +Directory functionsDirectory functions +NetworkNetwork + +
+ +

5.16 Character input/output

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Cauxin  Reads character from serial port. +
Cauxis  Obtains input status of serial port. +
Cauxos  Obtains output status of serial port. +
Cauxout Writes character to serial port. +
Cconin  Reads character from standard input device. +
Cconis  Checks keyboard buffer whether character is waiting. +
Cconos  Checks status of standard output device. +
Cconout Writes character to standard output device. +
Cconrs  Reads string from standard input device. +
Cconws  Outputs string to standard output device. +
Cnecin  Reads character without displaying it on-screen. +
Cprnos  Obtains printer status. +
Cprnout Outputs character to printer. +
Crawcin Reads character without display/interpretation. +
Crawio  Reads character direct from keyboard, or outputs it to screen. + +
+ +

Note: The output routines of the GEMDOS emulate a VT52 +terminal. +

+

5.16.1 Cauxin

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Character auxiliary input« - Input via serial port. +
  +
Opcode: 3 +
  +
Syntax: int32_t Cauxin ( void ); +
  +
Description: The GEMDOS routine Cauxin reads a character byte from the +GEMDOS handle 2 - normally the serial port aux:. The function waits +until the character arrives. +
  +
Note: Atari recommends use of the BIOS function Bconin +for this, as Cauxin can cause problems when its handle is redirected +and end-of-file is encountered. +
  +
Return value: The function returns the read-in character in the low byte of +the returned WORD. +
  +
Availability: All GEMDOS versions. +
  +
Group: Character input/output +
  +
See also: Binding   Cauxout   Bconin +
  + +
+ +

5.16.1.1 Bindings for Cauxin

+ + + + + + +
C: int32_t Cauxin ( void ); +
  +
Assembler: +
  +
move.w    #3,-(sp)     ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

5.16.2 Cauxis

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Character auxiliary input status« - Check the input status +of the serial port. +
  +
Opcode: 18 +
  +
Syntax: int16_t Cauxis ( void ); +
  +
Description: The GEMDOS routine Cauxis checks the status of GEMDOS handle 2 +- normally the serial port aux: - to see whether at least one +character is waiting to be received. +
  +
Note: The function works correctly with redirection of +input/output only as of GEMDOS Version 0.15. Atari recommends the use +of the BIOS function Bconstat instead. +
  +
Return value: The function can return the following results: +
  + + + + + + + + + + + + +
Value Meaning +
    +
-1 At least one character in buffer available +
0 No character available + +
+ +
Availability: All GEMDOS versions. +
  +
Group: Character input/output +
  +
See also: Binding   Cauxos +
  + +
+ +

5.16.2.1 Bindings for Cauxis

+ + + + + + +
C: int16_t Cauxis ( void ); +
  +
Assembler: +
  +
move.w    #18,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

5.16.3 Cauxos

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Character auxiliary output status« - Check the ouput status +of the serial port. +
  +
Opcode: 19 +
  +
Syntax: int16_t Cauxos ( void ); +
  +
Description: The GEMDOS routine Cauxos checks the status of GEMDOS handle 2 +- normally the serial port aux: - to see whether it is ready to output +characters. +
  +
Note: Atari recommends use of the BIOS function +Bcostat for this. +
  +
Return value: The function can return the following results: +
  + + + + + + + + + + + + +
Value Meaning +
    +
-1 Character can be output +
0 Character can not be output + +
+ +
Availability: All GEMDOS versions. +
  +
Group: Character input/output +
  +
See also: Binding   Cauxis   Bcostat +
  + +
+ +

5.16.3.1 Bindings for Cauxos

+ + + + + + +
C: int16_t Cauxos ( void ); +
  +
Assembler: +
  +
move.w    #19,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

5.16.4 Cauxout

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Character auxiliary output« - Write a character to the +serial port. +
  +
Opcode: 4 +
  +
Syntax: int32_t Cauxout ( int16_t c ); +
  +
Description: The GEMDOS routine Cauxout writes the character c to +GEMDOS handle 2 - normally the serial port aux:. +
  +
Note: The function works correctly with redirection of +input/output only as of GEMDOS Version 0.15. Atari recommends the use +of the BIOS function Bconout instead. +
  +
Return value: The function returns a negative value in case of error. +
  +
Availability: All GEMDOS versions. +
  +
Group: Character input/output +
  +
See also: Binding   Cauxin   Bconout +
  + +
+ +

5.16.4.1 Bindings for Cauxout

+ + + + + + +
C: int32_t Cauxout ( int16_t c ); +
  +
Assembler: +
  +
move.w    c,-(sp)      ; Offset 2
+move.w    #4,-(sp)     ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

5.16.5 Cconin

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Character console input« - Read a character from the +standard input device. +
  +
Opcode: 1 +
  +
Syntax: int32_t Cconin ( void ); +
  +
Description: The GEMDOS routine Cconin reads a character from GEMDOS handle +0 - normally the standard input device con: (the keyboard as a rule), +waiting until one is available. +
  +
Note: By setting bit 3 of the system variable +conterm one can have the value of Kbshift returned in bits +24..31. Unfortunately there is no way to recognise input/output +redirection or end-of-file. That is why many libraries define the key +combination Control-Z (ASCII-code 26) as the character for +end-of-file. +
  +
Return value: The function returns a LONG with the ASCII-code of the +character in the lower WORD (bits 0 .. 7). If the read character +originates from the keyboard, then the lower 8 bits of the higher WORD +(bits 16 .. 23) contain the scancode of the keyboard, with Shift-key +status in the upper 8 bits as mentioned above. Note that if a +non-ASCII key is pressed, the ASCII-code returned will be 0. +
  +
Availability: All GEMDOS versions. +
  +
Group: Character input/output +
  +
See also: Binding   Cconout   Cconis   Kbshift +
  + +
+ +

5.16.5.1 Bindings for Cconin

+ + + + + + +
C: int32_t Cconin ( void ); +
  +
Assembler: +
  +
move.w    #1,-(sp)     ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

5.16.6 Cconis

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Character console is waiting« - Check whether a character is +waiting in the standard input buffer. +
  +
Opcode: 11 +
  +
Syntax: int32_t Cconis ( void ); +
  +
Description: The GEMDOS routine Cconis checks whether a character is waiting +to be read in GEMDOS handle 0 - normally the standard input buffer of +con:. +
  +
Return value: The function can return the following results: +
  + + + + + + + + + + + + +
Value Meaning +
    +
-1L Character available +
0L Character not available + +
+ +
Availability: All GEMDOS versions. +
  +
Group: Character input/output +
  +
See also: Binding   Cconin +
  + +
+ +

5.16.6.1 Bindings for Cconis

+ + + + + + +
C: int32_t Cconis ( void ); +
  +
Assembler: +
  +
move.w    #11,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

5.16.7 Cconos

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Character console output status« - Check status of standard +output device. +
  +
Opcode: 16 +
  +
Syntax: int16_t Cconos ( void ); +
  +
Description: The GEMDOS routine Cconos checks whether a character may be +output to GEMDOS handle 1 - normally the standard output device con:. +
  +
Note: The function works correctly with redirection of +input/output only as of GEMDOS Version 0.15. +
  +
Return value: The function returns the status of the standard output device, +as follows: +
  + + + + + + + + + + + + +
Value Meaning +
    +
0 Character can not be output +
1 At least one character can be output + +
+ +
Availability: All GEMDOS versions. +
  +
Group: Character input/output +
  +
See also: Binding   Cconout +
  + +
+ +

5.16.7.1 Bindings for Cconos

+ + + + + + +
C: int16_t Cconos ( void ); +
  +
Assembler: +
  +
move.w    #16,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

5.16.8 Cconout

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Character console output« - Write one character to the +standard output device. +
  +
Opcode: 2 +
  +
Syntax: int32_t Cconout ( int16_t c ); +
  +
Description: The GEMDOS routine Cconout writes the character c to +GEMDOS handle 1 - normally the standard output device con: - as a rule +the screen. +
  +
Note: The character c contain the associated +ASCII-code in bits 0..7 (all other bits have to be 0). No line-feed +translation is done at the output, so ASCII 13 and ACII 10 must be +sent to start a new line. The function works correctly with +redirection of the input/output only as of GEMDOS Version 0.15; with +earlier versions, do not redirect this handle to a write-only device +since the call tries to read from the output stream to process the +'special' keys. +
  +
Return value: The return value of the function depends on the operating +system. The following apply: +
  + + + + + + + + + + + + + + + +
Operating system Value +
    +
TOS No sensible return value +
MagiC < 3.00 + + + + + + + + + +
< 0 = Error +
0L = Output device is full +
1L = Output was successful + +
+ +
MiNT/MagiC > 3.00 + + + + + + + + + + + + +
< 0 = Error +
0L = Output device is full +
1L = Output was successful +
4L = Output to the terminal was successful + +
+ + +
+ +
Availability: All GEMDOS versions. +
  +
Group: Character input/output +
  +
See also: BindingCconin   Cconos   VT52 terminal +
  + +
+ +

5.16.8.1 Bindings for Cconout

+ + + + + + +
C: int32_t Cconout ( int16_t c ); +
  +
Assembler: +
  +
move.w    c,-(sp)      ; Offset 2
+move.w    #2,-(sp)     ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

5.16.9 Cconrs

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Character console read string« - Read a string from the +standard input. +
  +
Opcode: 10 +
  +
Syntax: int32_t Cconrs ( LINE *buf ); +
  +
Description: The GEMDOS routine Cconrs reads a string from the standard +input stream (GEMDOS handle 0) - normally the keyboard - and echoes it +to the standard output stream (GEMDOS handle 1) - normally the screen. +
  +
To do this one writes in the component maxlen of LINE +the number of bytes to be read in - 1. The input will be terminated by +the function when the Return key is pressed or the maximum input +length has been exceeded. +
  +
'Special' key combinations cause various actions. In detail: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Input Meaning +
    +
Return End of input; don't place Return in buffer +
Control-J End of line; don't place Ctrl-J in buffer +
Control-H Kill last character (= Delete) +
Backspace Delete last character +
Control-U/X Delete whole line and start over +
Control-R Echo input line and start over +
Control-C Terminate program (!) + +
+ +
Note: Umlauts are handled correctly by the function only +as of GEMDOS Version 0.15. On earlier versions a possible end-of-file +will not be recognised, and read characters will be output to the +screen even if the standard output has been redirected. +
  +
In MagiC the function has been greatly extended; here the +following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Input Meaning +
    +
Cursor up/down Get back last input +
Cursor left/right Move cursor by one character L/R +
ditto with Shift Cursor to start/end of line +
ClrHome Cursor to start of line +
Insert Insert mode +
Shift-Insert Overwrite mode +
Shift-Clear Delete input +
Tabulator Alternate line-start/-end +
Undo Undo last input +
Delete/Backspace Delete char. under/before cursor +
F1..F10 Call environmental variables F1..F10 + +
+ +
With normal files MagiC will read up to the first LF, while CR +is skipped. The environmental variables can be assigned with any +desired command interpreter (e.g. the Mupfel). +
  +
Return value: The function returns the value 0L on successful conclusion, or +a negative number in case of error. +
  +
Availability: All GEMDOS versions. +
  +
Group: Character input/output +
  +
See also: Binding   Cconws   MagiC +
  + +
+ +

5.16.9.1 Bindings for Cconrs

+ + + + + + +
C: int32_t Cconrs ( LINE *buf ); +
  +
Assembler: +
  +
pea       buf          ; Offset 2
+move.w    #10,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

5.16.10 Cconws

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Character console write string« - Write a string to the +standard output device. +
  +
Opcode: 9 +
  +
Syntax: int32_t Cconws ( CONST BYTE *buf ); +
  +
Description: The GEMDOS routine Cconws writes the string buf to +GEMDOS handle 1 - normally the standard output device con:. The string +must be NULL-terminated (with the ASCII character 0). With GEMDOS +versions below 0.15, do not redirect this handle to a write-only +device since the call tries to read from the output stream to process +the 'special' keys. +
  +
Return value: Under TOS 1.04 the function returns the value 0L on +successful execution, or the value -1L in case of error. +
Since MagiC 3.00 is there no return value respectively is it the +value form Fwrite. +
  +
Availability: All GEMDOS versions. +
  +
Group: Character input/output +
  +
See also: Binding   Cconrs   VT-52 terminal   ASCII table +
  + +
+ +

5.16.10.1 Bindings for Cconws

+ + + + + + +
C: int32_t Cconws ( CONST BYTE *buf ); +
  +
Assembler: +
  +
pea       buf          ; Offset 2
+move.w    #9,-(sp)     ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

5.16.11 Cnecin

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Character no echo input« - Read character from the standard +input device without displaying it on-screen. +
  +
Opcode: 8 +
  +
Syntax: int32_t Cnecin ( void ); +
  +
Description: The GEMDOS routine Cnecin reads a character from GEMDOS handle +0 - normally the standard input device con: (the keyboard as a rule), +without outputting it to the standard output device (normally the +screen). +
  +
Note: Flow control can be achieved with the key +combinations Control-S (stop output) or Control-Q (continue output). +With GEMDOS versions prior to 0.30, if the function's handle is +redirected an end-of-file condition will cause the system to hang. +
  +
Return value: The function returns a LONG with the ASCII-code of the +character in the lower WORD (bits 0 .. 7). If the read character +originates from the keyboard, then the lower 8 bits of the higher WORD +(bits 16 .. 23) will contain the scancode of the keyboard, with +Shift-key status in the upper 8 bits provided bit 3 of the system +variable conterm is set. Note that if a non-ASCII key is +pressed, the ASCII-code returned will be 0. +
  +
Availability: All GEMDOS versions. +
  +
Group: Character input/output +
  +
See also: Binding   Cconin   Crawcin   Crawio +
  + +
+ +

5.16.11.1 Bindings for Cnecin

+ + + + + + +
C: int32_t Cnecin ( void ); +
  +
Assembler: +
  +
move.w    #8,-(sp)     ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

5.16.12 Cprnos

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Character printer output status« - Check the status of the +printer port. +
  +
Opcode: 17 +
  +
Syntax: int16_t Cprnos ( void ); +
  +
Description: The GEMDOS routine Cprnos checks whether handle 3 - normally +the parallel port prn: - is ready to accept characters. +
  +
Note: It is strongly recommended to use this function +before starting a printout, since it takes around 30 seconds to +recognize a printer timeout if the printer is not ready (perhaps not +switched on?). +
  +
Return value: The function can return the following results: +
  + + + + + + + + + + + + +
Value Meaning +
    +
-1 Printer is ready +
0 Printer is not ready + +
+ +
Availability: All GEMDOS versions. +
  +
Group: Character input/output +
  +
See also: Binding   Cconos +
  + +
+ +

5.16.12.1 Bindings for Cprnos

+ + + + + + +
C: int16_t Cprnos ( void ); +
  +
Assembler: +
  +
move.w    #17,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

5.16.13 Cprnout

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Character printer output« - Write a character to the printer +port. +
  +
Opcode: 5 +
  +
Syntax: int32_t Cprnout ( int16_t c ); +
  +
Description: The GEMDOS routine Cprnout writes the character c to +GEMDOS handle 3 - normally the printer port prn:. +
  +
c is a WORD value, with the character to be output +occupying bits 0..7; all other bits must be 0. +
  +
Note: Before print output one should check with Cprnos +whether the printer is ready. Settings made with the aid of the Setprt +function are ignored for printing by almost all TOS +versions. With redirection of input/output, the function works +correctly only as of GEMDOS Version 0.15. +
  +
Return value: The function returns 0 in case of error, else non-zero if it +wrote the character to the printer successfully. +
  +
Availability: All GEMDOS versions. +
  +
Group: Character input/output +
  +
See also: Binding   Cprnos   Setprt +
  + +
+ +

5.16.13.1 Bindings for Cprnout

+ + + + + + +
C: int32_t Cprnout ( int16_t c ); +
  +
Assembler: +
  +
move.w    c,-(sp)      ; Offset 2
+move.w    #5,-(sp)     ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

5.16.14 Crawcin

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Character raw input« - Read a character unbuffered from +standard input device. +
  +
Opcode: 7 +
  +
Syntax: int32_t Crawcin ( void ); +
  +
Description: The GEMDOS routine Crawcin reads a character from GEMDOS handle +1 - normally the standard input con: (the keyboard) - without echoing +it immediately to the screen or processing any of the 'special' keys. +
  +
Note: The function works correctly with input/output +redirection only as of GEMDOS Version 0.15. +
  +
Return value: The function returns a LONG with the ASCII-code of the +character in the lower WORD (bits 0 .. 7). If the read character +originates from the keyboard, then the lower 8 bits of the higher WORD +(bits 16 .. 23) will contain the scancode of the keyboard, with +Shift-key status in the upper 8 bits provided bit 3 of the system +variable conterm is set. Note that if a non-ASCII key is +pressed, the ASCII-code returned will be 0. +
  +
Availability: All GEMDOS versions. +
  +
Group: Character input/output +
  +
See also: Binding   Cconin   Cconout   Crawio +
  + +
+ +

5.16.14.1 Bindings for Crawcin

+ + + + + + +
C: int32_t Crawcin ( void ); +
  +
Assembler: +
  +
move.w    #7,-(sp)     ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

5.16.15 Crawio

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Character raw input output« - Permit unbuffered +input/output. +
  +
Opcode: 6 +
  +
Syntax: int32_t Crawio ( int16_t w ); +
  +
Description: The GEMDOS routine Crawio combines unbuffered console input and +output in one function. The following applies for the parameter +w, of which only the lower 8 bits are significant (others +should be 0): +
  + + + + + + + + + + + + +
Value Meaning +
    +
0xff Read character from standard input +
else Output character to standard output + +
+ +
Note: The function works correctly with input/output +redirection only as of GEMDOS Version 0.15. +
  +
Return value: If the parameter w has the value 0xff, the function +returns a bit-array LONG with the ASCII-code of the character in the +lower WORD (bits 0 .. 7). If the read character originates from the +keyboard, then the lower 8 bits of the higher WORD (bits 16 .. 23) +will contain the scancode of the keyboard, with Shift-key status in +the upper 8 bits provided bit 3 of the system variable conterm +is set. Note that if a non-ASCII key is pressed, the ASCII-code +returned will be 0. A return value of 0 means that no character is +available. +
  +
Availability: All GEMDOS versions. +
  +
Group: Character input/output +
  +
See also: Binding   Cconin   Cconout   VT-52 terminal +
  + +
+ +

5.16.15.1 Bindings for Crawio

+ + + + + + +
C: int32_t Crawio ( int16_t w ); +
  +
Assembler: +
  +
move.w    w,-(sp)      ; Offset 2
+move.w    #6,-(sp)     ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +
+ +Home +GEMDOSGEMDOS +Directory functionsDirectory functions +NetworkNetwork + + diff --git a/en/gemdos_datetime.html b/en/gemdos_datetime.html new file mode 100644 index 000000000..57f1648c9 --- /dev/null +++ b/en/gemdos_datetime.html @@ -0,0 +1,1009 @@ + + + + + +The documentation for TOS: Date and Time + + + + + + + + + +Home +GEMDOSGEMDOS +File functionsFile functions +Process functionsProcess functions + +
+ +

5.10 Date and Time

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tadjtime   Correct the time to synchronize the system clock. +
Talarm     Alarm function. +
Tgetdate   Obtains date. +
Tgettime   Obtains time. +
Tgettimeofday Interrogates the state of the internal, high resolution system +clock. +
Tmalarm    Reads/sets a process alarm for the current process. +
Tsetdate   Sets date. +
Tsetitimer Sets a periodical timer. +
Tsettime   Sets time. +
Tsettimeofday Sets the state of the internal, high resolution system clock. + +
+ +

See also: Date and Time in XBIOS +

+

5.10.1 Tadjtime

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Adjust time« - correct the time to synchronize the system +clock. +
  +
Opcode: 343 (0x157) +
  +
Syntax: int Tadjtime ( const struct timeval *delta, struct timeval +*olddelta ); +
  +
Description: The Tadjtime() function gradually adjusts the system clock (as +returned by Tgettimeofday). The amount of time by which the clock is +to be adjusted is specified in the structure pointed to by delta. +
  +
If the adjustment in delta is positive, then the system clock is +speeded up by some small percentage (i.e., by adding a small amount of +time to the clock value in each second) until the adjustment has been +completed. If the adjustment in delta is negative, then the clock is +slowed down in a similar fashion. +
  +
If a clock adjustment from an earlier Tadjtime() call is already +in progress at the time of a later Tadjtime() call, and delta is not +NULL for the later call, then the earlier adjustment is stopped, but +any already completed part of that adjustment is not undone. +
  +
If olddelta is not NULL, then the buffer that it points to is +used to return the amount of time remaining from any previous +adjustment that has not yet been completed. +
  +
Return value: A return value 0 if the setting was successful, otherwise a +negative error code is returned. +
  +
Notes: The adjustment that Tadjtime() makes to the clock is carried +out in such a manner that the clock is always monotonically +increasing. Using Tadjtime() to adjust the time prevents the problems +that can be caused for certain applications (e.g., make(1)) by abrupt +positive or negative jumps in the system time. +
  +
Availability: This function is available as of FreeMiNT 1.16. +
  +
Group: Date and Time +
  +
See also: Binding   Tsetdate   Tsettime +
  + +
+ +

5.10.1.1 Bindings for Tadjtime

+ + + + + + +
C: int Tadjtime ( const struct timeval *delta, struct timeval +*olddelta ); +
  +
Assembler: +
  +
move.l    olddelta,-(sp)   ; Offset 6
+move.l    delta,-(sp)  ; Offset 2
+move.w    #343,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+lea       10(sp),sp    ; Correct stack
+
+ +
+ +

5.10.2 Talarm

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Talarm« - Reads/sets a process alarm for the current +process. +
  +
Opcode: 288 (0x0120) +
  +
Syntax: int32_t Talarm ( int32_t time ); +
  +
Description: The function Talarm sends a SIGALRM signal to the calling +process after time seconds. +
  +
If no signal-handler was installed for this signal with Psignal, +then the process will be terminated immediately (i.e. on receiving the +signal). +
  +
By setting the value of time = 0, an earlier set alarm +can be cancelled. If time is negative, then the function has +no effect and only the return value is delivered. +
  +
Return value: The function returns the time (in seconds) remaining before the +SIGALRM signal is triggered (if an alarm has been activated), or +otherwise the value 0 if no alarm was scheduled before this call. +
  +
Availability: As of the first in MultiTOS integrated MiNT version 1.04. +
  +
The call was introduced in the MiNT version 0.8pl8, but prior to +the version 1.12 the code contained a bug that affected its +functionality. +
  +
Group: Date and Time +
  +
See also: Binding   Tmalarm   Pause   Psignal   Signale +
  + +
+ +

5.10.2.1 Bindings for Talarm

+ + + + + + +
C: int32_t Talarm ( int32_t time ); +
  +
Assembler: +
  +
move.l    time,-(sp)   ; Offset 2
+move.w    #288,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

5.10.3 Tgetdate

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »get date« - Obtain date. +
  +
Opcode: 42 +
  +
Syntax: uint16_t Tgetdate ( void ); +
  +
Description: The GEMDOS routine Tgetdate obtains the current date. +
  +
Return value: The function returns a uint32_t number with the date, which is +coded as follows: +
  + + + + + + + + + + + + + + + +
Bits Meaning +
    +
0-4 Day (1-31) +
5-8 Month (1-12) +
9-15 Year (0-119, 0= 1980) + +
+ +
Availability: All GEMDOS versions. +
  +
Group: Date and Time +
  +
See also: Binding   Tsetdate +
  + +
+ +

5.10.3.1 Bindings for Tgetdate

+ + + + + + +
C: uint16_t Tgetdate ( void ); +
  +
Assembler: +
  +
move.w    #42,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

5.10.4 Tgettime

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Get time« - Obtain the time. +
  +
Opcode: 44 +
  +
Syntax: uint32_t Tgettime ( void ); +
  +
Description: The GEMDOS routine Tgettime obtains the system time. +
  +
Return value: The function returns the system time, coded as follows: +
  + + + + + + + + + + + + + + + +
Bits Meaning +
    +
0-4 Seconds in units of two (0-29) +
5-10 Minutes (0-59) +
11-15 Hours (0-23) + +
+ +
Availability: All GEMDOS versions. +
  +
Group: Date and Time +
  +
See also: Binding   Tsettime +
  + +
+ +

5.10.4.1 Bindings for Tgettime

+ + + + + + +
C: uint16_t Tgettime ( void ); +
  +
Assembler: +
  +
move.w    #44,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

5.10.5 Tgettimeofday

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Tgettimeofday« - Interrogate the state of the internal, high +resolution system clock. +
  +
Opcode: 341 (0x0155) +
  +
Syntax: int32_t Tgettimeofday ( timeval *tv, timezone *tzp ); +
  +
Description: The function Tgettimeofday interrogates the state of the +internal, high resolution system clock. +
  +
The argument tv is a pointer to the timeval structure. +
  +
The argument tzp is a pointer to timezone structure. +
  +
You may safely pass NULL for either argument. This isn't +considered an error. +
  +
Implementors of library bindings should be aware that the +definition of struct timezone is non-standard. The members are actually +int and not long int (this applies only to struct timezone; the members +of struct timeval are always long). 16-bit libraries will have to copy +the contents of the structure that tzp points to. +
  +
The Ssystem() call has a command S_CLOCKMODE. This command +allows to retrieve or set the kernel clock mode, i.e. to specify +whether the hardware clock is meant to run in UTC or in local time. +
It is planned to make MiNT compliant with the kernel time keeping +model described in RFC1305. This model is already successfully +implemented in operating systems such as SunOS, Ultrix, OSF/1, HP-UX +and Linux. Please expect the internal realization to change in the +future. +
  +
Return value: The function can never fail. It always returns E_OK. +
  +
Availability: Available when a MiNT kernel of a version at least 1.15.0 +release is detected. +
  +
Group: Date and Time +
  +
See also: Binding   Ssystem   Tsettimeofday +
  + +
+ +

5.10.5.1 Bindings for Tgettimeofday

+ + + + + + +
C: int32_t Tgettimeofday ( timeval *tv, timezone *tzp ); +
  +
Assembler: +
  +
pea       tzp          ; Offset 6
+pea       tv           ; Offset 2
+move.w    #341,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+lea       $0a(sp),sp   ; Correct stack
+
+ +
+ +

5.10.6 Tmalarm

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Tmalarm« - Interrogates the state of the internal, high +resolution system clock. +
  +
Opcode: 317 (0x013d) +
  +
Syntax: int32_t Tmalarm( int32_t time ); +
  +
Description: This function reads/sets a process alarm for the current +process. +
  +
time specifies the length of time (in milliseconds) to +wait before a SIGALRM signal is delivered. If time is 0 then any +previously set alarm is cancelled. If time is negative the function +does not modify any alarm currently set. +
  +
If no SIGALRM signal handler has been set up when the alarm is +triggered, the process will be killed. +
  +
Return value: Returns 0 if no alarm was scheduled prior to this call or the +amount of time remaining (in milliseconds) before the alarm is +triggered. +
  +
Availability: Available when a 'MiNT' cookie with a version of at least 1.10 +exists. +
  +
Group: Date and Time +
  +
See also: Binding   Talarm   Pause   Psignal +
  + +
+ +

5.10.6.1 Bindings for Tmalarm

+ + + + + + +
C: int32_t Tmalarm( int32_t time ); +
  +
Assembler: +
  +
move.l    time,-(sp)   ; Offset 2
+move.w    #341,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

5.10.7 Tsetdate

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set date« - Set the date. +
  +
Opcode: 43 +
  +
Syntax: int16_t Tsetdate ( uint16_t date ); +
  +
Description: The GEMDOS routine Tsetdate sets the current date. The +parameter date is coded as follows: +
  + + + + + + + + + + + + + + + +
Bits Meaning +
    +
0-4 Day (1-31) +
5-8 Month (1-12) +
9-15 Year (0-119, 0= 1980) + +
+ +
Note: From Blitter-TOS onwards the date is set in the +hardware clock as well (if present). +
  +
Return value: A return value 0 if the setting was successful, or -1 if the +date format was invalid. +
  +
Availability: All GEMDOS versions. +
  +
Group: Date and Time +
  +
See also: Binding   Tgetdate   Tadjtime +
  + +
+ +

5.10.7.1 Bindings for Tsetdate

+ + + + + + +
C: int32_t Tsetdate ( uint16_t date ); +
  +
Assembler: +
  +
move.w    date,-(sp)   ; Offset 2
+move.w    #43,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

5.10.8 Tsetitimer

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Tsetitimer« - Control a periodic timer. +
  +
Opcode: 329 (0x0149) +
  +
Syntax: int32_t Tsetitimer ( int16_t which, int32_t *interval, int32_t +*value, int32_t *ointerval, int32_t *ovalue ); +
  +
Description: The GEMDOS routine Tsetitimer controls one of three possible +periodic timers. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
which Desired timer + + + + + + + + + + +
0 = This timer works in real time, and sends the signal SIGALRM on +expiry + +
1 = This timer works in 'virtual process time' and sends the signal +SIGVTALRM on expiry. The timer in this case runs only when the process +that is controlling the timer currently owns the CPU. + +
2 = This timer works both in 'virtual process time' as well as when +the operating system itself is active. On expiry of the timer the +signal SIGPROF is sent. + +
+ +
interval Address of an int32_t which holds the value to which the timer +is to be set on expiry. A NULL-pointer means that the corresponding +old value should not be changed. If the int32_t holds the value 0, the +timer will be deactivated after its expiry. +
value Address of an int32_t which holds the initial value of the +timer in milliseconds. A NULL-pointer leaves the current timer +unaffected. If the int32_t holds the value 0, the timer will be +deactivated. +
ointerval Address of an int32_t which holds the current intervall of the +timer, or NULL if this value is of no interest. +
ovalue Address of an int32_t which holds the current value of the +timer, or NULL if this value is of no interest. + +
+ +
As all internal calculations are measured in miliseconds, it is +not possible to set a timer to (very large, future) arbitrary values. +
  +
Return value: The function returns 0 when executed correctly, or a a negative +value in case of error. +
  +
Availability: This function is optional, so a call may be answered with +EINVFN. Available when a 'MiNT' cookie with a version of at least 1.11 +exists. +
  +
Group: Date and Time +
  +
See also: Binding   Pause   Psignal   Talarm +
  + +
+ +

5.10.8.1 Bindings for Tsetitimer

+ + + + + + +
C: int32_t Tsetitimer ( int16_t which, int32_t *interval, int32_t +*value, int32_t *ointerval, int32_t *ovalue ); +
  +
Assembler: +
  +
move.l    ovalue,-(sp)    ; Offset 16
+move.l    ointerval,-(sp) ; Offset 12
+move.l    value,-(sp)     ; Offset  8
+move.l    interval,-(sp)  ; Offset  4
+move.w    which,-(sp)     ; Offset  2
+move.w    #329,-(sp)      ; Offset  0
+trap      #1              ; GEMDOS
+lea       20(sp),sp       ; Correct stack
+
+ +
+ +

5.10.9 Tsettime

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set time« - Set the time. +
  +
Opcode: 45 +
  +
Syntax: int16_t Tsettime ( uint16_t time ); +
  +
Description: The GEMDOS routine Tsettime sets the time. The parameter +time must be coded as follows: +
  + + + + + + + + + + + + + + + +
Bits Meaning +
    +
0-4 Seconds in units of two (0-29) +
5-10 Minutes (0-59) +
11-15 Hours (0-23) + +
+ +
Note: From Blitter-TOS 1.02 onwards the time is set +in the hardware clock as well (if present). +
  +
Return value: A return value 0 if the setting was successful, or -1 if the +time format was invalid. +
  +
Availability: All GEMDOS versions. +
  +
Group: Date and Time +
  +
See also: Binding   Tgettime +
  + +
+ +

5.10.9.1 Bindings for Tsettime

+ + + + + + +
C: int32_t Tsettime ( uint16_t time ); +
  +
Assembler: +
  +
move.w    time,-(sp)   ; Offset 2
+move.w    #45,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

5.10.10 Tsettimeofday

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Tsettimeofday« - Sets the state of the internal, high +resolution system clock. +
  +
Opcode: 342 (0x0156) +
  +
Syntax: int32_t Tsettimeofday ( timeval *tv, timezone *tzp ); +
  +
Description: The function Tsettimeofday sets the state of the internal, high +resolution system clock. +
  +
The argument tv is a pointer to the timeval structure. +
  +
The argument tzp is a pointer to the timezone structure. +
  +
You may safely pass NULL for either argument. This isn't +considered an error. +
  +
Implementors of library bindings should be aware that the +definition of struct timezone is non-standard. The members are actually +int and not long int (this applies only to struct timezone; the members +of struct timeval are always long). 16-bit libraries will have to copy +the contents of the structure that tzp points to. +
  +
The tz_dsttime member of timezone is stored, but not evaluated +within the kernel. Beware not to misunderstand its meaning: if +non-zero it simply signifies that daylight savings time applies during +some part of the year, not necessarily now. In other words: if it is +non-zero someday, it should be non-zero during the entire year. The +Ssystem call has a command S_CLOCKMODE. This command allows retrieval +or setting of the kernel clock mode, i.e. to specify whether the +hardware clock is meant to run in UTC or in local time. +
It is planned to make MiNT compliant with the kernel timekeeping +model described in RFC1305. This model is already successfully +implemented in operating systems such as SunOS, Ultrix, OSF/1, HP-UX +and Linux. Please expect the internal realization to change in the +future. +
  +
Return value: The following error conditions are defined: +
  +
EPERM - an attempt was made by a user without super-user +privileges to change the system time or system time zone information. +
  +
EBADARG - one of the arguments is out of range. Note that the +kernel time cannot be set to dates before Jan 1 1980 00:00:00 and +after some day in 2038 (yep, MAX_LONG seconds since the epoch). +Timezone offsets must be in the range of +/- 720 minutes. +
  +
Availability: Available when a MiNT kernel of a version at least 1.15.0 +release is detected. +
  +
Group: Date and Time +
  +
See also: Binding   Ssystem   Tgettimeofday +
  + +
+ +

5.10.10.1 Bindings for Tsettimeofday

+ + + + + + +
C: int32_t Tsettimeofday ( timeval *tv, timezone *tzp ); +
  +
Assembler: +
  +
pea       tzp          ; Offset 6
+pea       tv           ; Offset 2
+move.w    #342,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+lea       $0a(sp),sp   ; Correct stack
+
+ +
+ +
+ +Home +GEMDOSGEMDOS +File functionsFile functions +Process functionsProcess functions + + diff --git a/en/gemdos_directory.html b/en/gemdos_directory.html new file mode 100644 index 000000000..e5f8281f8 --- /dev/null +++ b/en/gemdos_directory.html @@ -0,0 +1,2884 @@ + + + + + +The documentation for TOS: Directory functions + + + + + + + + + +Home +GEMDOSGEMDOS +System functionsSystem functions +Character input/outputCharacter input/output + +
+ +

5.15 Directory functions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dchroot     Changes the root directory for the calling process. +
Dclosedir   Closes a directory. +
Dcntl       File-system-specific operation on file/directory. +
Dcreate     Creates a directory. +
Ddelete     Deletes a directory. +
Dfree       Obtains free and total capacity of a drive. +
Dgetcwd     Obtains directory of a process. +
Dgetdrv     Obtains current drive. +
Dgetpath    Obtains current directory. +
Dlock       Locks or releases again a BIOS device. +
Dopendir    Opens a directory for reading. +
Dpathconf   Obtains information about a file-system. +
Dreaddir    Reads directory information. +
Dreadlabel  Reads file-system label. +
Drewinddir  Rewinds opened directory pointer. +
Dsetdrv     Sets current drive. +
Dsetkey     Sets key/passphrase for a drive. +
Dsetpath    Sets current directory. +
Dwritelabel Sets file-system label. +
Dxopendir   Opens directory for reading. +
Dxreaddir   Reads directory information, obtains attributes. + +
+ +

See also: File functions   XBIOS drive functions +

+

5.15.1 Dchroot

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dchroot« - Change the root directory for the calling +process. +
  +
Opcode: 330 (0x014a) +
  +
Syntax: int32_t Dchroot( int8_t *path ); +
  +
Description: The path parameter is a pathname of the folder that +will be the new root directory for the calling process. Directories +and files which are outside of the specified tree will no longer be +accessible. +
  +
Dchroot does not automatically change the current directory to +the newly specified root. Also, the call needs root privileges to +operate properly. This function is used by e.g. ftpd to limit the user +privileges in accessing file-systems. +
  +
Return value: Returns the E_OK on success, or a negative GEMDOS error-code +otherwise. +
  +
Availability As of FreeMiNT version 1.15.4 +
  +
Group: Directories functions +
  +
See also: Binding   Dopendir   Dreaddir   MagiC +
  + +
+ +

5.15.1.1 Bindings for Dchroot

+ + + + + + +
C: int32_t Dchroot( int8_t *path ); +
  +
Assembler: +
  +
pea       path             ; Offset 2
+move.w    #330,-(sp)       ; Offset 0
+trap      #1               ; GEMDOS
+addq.l    #6,sp            ; Correct stack
+
+ +
+ +

5.15.2 Dclosedir

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dclosedir« - Close a specified directory. +
  +
Opcode: 299 +
  +
Syntax: int32_t Dclosedir ( int32_t dirhandle ); +
  +
Description: The function Dclosedir closes the directory with the handle +dirhandle. +
  +
Return value: The function returns the value 0 if the directory could be +closed correctly. If dirhandle is invalid, then the value +EBADF will be returned. +
  +
Availability: Available when a 'MiNT' cookie with a version of at least 0.90 +exists, and MagiC as of Version 3.0. +
  +
Group: Directory functions +
  +
See also: Binding   Dopendir   Dreaddir   MagiC +
  + +
+ +

5.15.2.1 Bindings for Dclosedir

+ + + + + + +
C: int32_t Dclosedir ( int32_t dirhandle ); +
  +
Assembler: +
  +
move.l    dirhandle,-(sp)  ; Offset 2
+move.w    #299,-(sp)       ; Offset 0
+trap      #1               ; GEMDOS
+addq.l    #6,sp            ; Correct stack
+
+ +
+ +

5.15.3 Dcntl

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dcntl« - Execute a file-system-specific operation on a file +or a directory. +
  +
Opcode: 304 +
  +
Syntax: int32_t Dcntl ( int16_t cmd, int8_t *name, int32_t arg ); +
  +
Description: The function Dcntl executes the command cmd on the file +or the directory name. Details depend on the file-system to +which name refers. The meaning of the parameter arg is +in turn dependent on cmd. +
  +
Normally the Dcntl call is supported by the file-systems U:\\ +and U:\DEV. +
  +
The unified file-system U:\ knows the following +commands: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Command Description +
  + +
FS_INSTALL (0xf001) Installs a new file-system +
  + + + + + + +
name: Must be U:\ +
arg: Pointer to fs_descr structure + +
+ + +
FS_MOUNT (0xf002) Mounts an already existing file-system in the unified system +U:\ +
  + + + + + + +
name: Name under which one can access the file-system +
arg: Pointer to fs_descr structure + +
+ + +
FS_UNMOUNT (0xf003) Unmounts a file-system installed by FS_MOUNT +
  + + + + + + +
name: Name under which the file-system was mounted +
arg: Pointer to fs_descr structure + +
+ + +
FS_UNINSTALL (0xf004) Removes a file-system completely from the kernel. This command +is only allowed if no further references to the file-system exist, so +that any mounts have been revoked, for instance. +
  + + + + + + +
name: U:\\ +
arg: Pointer to fs_descr structure + +
+ +
FUTIME (0x4603) Is the complement to the Fcntl function of the same name. It is +supported by MiNT as well as DOS-XFS in MagiC. A pointer to a mutimbuf +structure is passed as a parameter. +
  + + +
KER_GETINFO (0x0100) Obtains a pointer to the kernel functions of MagiC. The +parameters name and arg must have NULL-values. The +return is a pointer to a MX_KERNEL structure. (*) +
  +
As of MagiC 6: MX_KER_GETINFO (0x6d00) (1) +
  + + +
KER_DOSLIMITS (0x0101) Invites the kernel of MagiC to obtain the limits for FAT +file-systems. The parameter name and arg must be set +to NULL. The return is a pointer to a pointer to a MX_DOSLIMITS +structure; this can therefore be diverted to one's own structure if a +new driver is installed. This opcode is normally used only by hard disk +drivers (such as HDDRIVER). (*) +
  +
As of MagiC 6: MX_KER_DOSLIMITS (0x6d01) (1) +
  + +
KER_INTMAVAIL (0x102)   +
  + +
KER_INTGARBC (0x103) These functions exist in versions of MagiC prior to Version +4.01, and are converted to Sconfig calls to avoid conflicts with +drivers that have problems with unknown opcodes (*). +
  + + +
KER_DRVSTAT (0x0104) Obtains simple information about a drive. The following apply: +
  + + + + + + +
name: Is ignored +
arg: Pointer to two int16_ts. + +
+ +
The first int16_t here must hold a NULL, into the second a drive +number from 0..25 (A..Z) will be written. The possible return values +for this opcode are: +
  + + + + + + +
EDRIVE : Invalid drive number +
ELOCKED : Drived locked at present + +
+ +
A value of 0 or >0 indicates that the drive is at present +mounted or not mounted respectively. This opcode is only available +from the MagiC Version of 09.09.95 onwards (*). +
  +
As of MagiC 6: MX_KER_DRVSTAT (0x6d04) (1) +
  + + +
KER_XFSNAME (0x0105) Obtains the name of the driver that is responsible for a given +directory. +
  + + + + + + +
name: Pathname (not filename!) +
arg: Pointer to a buffer at least 9 characters long which has to lie +at an even address. + +
+ +
A return value < 0 denotes no error; otherwise the name of +the driver will be stored in the specified buffer; at present the +following driver names are known: +
  + + + + + + + + + +
(a) "DOS_XFS": Old DOS-XFS +
(b) "VDOS_XFS": DOS-XFS with VFAT +
(c) "MMAC_HFS": MagiCMac-HFS + +
+ +
This opcode is only available from the MagiC Version of +15.06.1996 onwards (*). +
  +
As of MagiC 6: MX_KER_XFSNAME (0x6d05) (1) +
  + + +
KER_INSTXFS (0x0200) Invites the kernel of MagiC to install an XFS (*) +
  + + + + + + +
name: NULL-pointer +
arg: Driver to install + +
+ +
As of MagiC 6: MX_KER_INSTXFS (0x6d02) (1) +
  + +
KER_SETWBACK (0x0300) Invites the kernel of MagiC to configure the WriteBack. As of +MagiC Version 4.01, this opcode was converted to a Sconfig call, to +prevent conflicts with drivers that have problems with unknown opcodes +(*). +
  + + +
DFS_GETINFO (0x1100) Obtains a pointer to the DOS_XFS functions of MagiC. The +parameters name and arg must have NULL-values. The +return is a pointer to a ??? structure. (*) +
  +
As of MagiC 6: MX_DFS_GETINFO (0x6d40) (1) +
  + + +
DFS_INSTDFS (0x1200) Installs a DFS under MagiC (*). +
  + + + + + + +
name: NULL-pointer +
arg: Driver to install + +
+ +
CDROMEJECT (0x4309) Takes charge of ejection of media. +
  + + + + + + +
name: Path of the medium to be ejected +
arg: NULL + +
+ +
The ejection function is supported for all drives that are +accessed via an XHDI-compatible driver, as well as for Macintosh +volumes (under MagiCMac). +
  +
As of MagiC 6: MX_DFS_INSTDFS (0x6d41) (1) +
  + +
VFAT_CNFDFLN (0x5600) Configures a VFAT file-system +
  + + + + + + +
name: U:\\ +
arg: Bit-vector that determines which drives permit long filenames + +
+ +
The setting only becomes active on mounting a file-system, so +that already mounted file-systems can not be affected by it. +This opcode is only available from the MagiC Version of 02.01.96 +onwards. (*). +
  + +
VFAT_CNFLN (0x5601) Serves for the configuration of a VFAT file-system. More +exactly: Determines whether a mounted drive supports long filenames, +or not. With this opcode therefore one can supplant the +default value set by VFAT_CNFDFLN. So that the change becomes visible +to the user, a SH_WDRAW message should be sent to the system shell. +This opcode is only available as of the MagiC Version of 02.01.96 +(*). +
  + +
PROC_CREATE (0xcc00) This function is reserved in MagiC for future use (*). It is +no longer used as of MagiC 6. +
  + +
+ +
The file-system U:\DEV knows the following commands: +
  + + + + + + + + + + + + + + + + + + +
Command Description +
  +
    +
  + +
DEV_INSTALL (0xde02) Installs a new driver for a device. +
  + + + + + + +
name: Complete pathname of the driver +
arg: Pointer to dev_descr structure + +
+ +
The device installed in this way may only be accessed via GEMDOS +operations. +
  + + +
DEV_M_INSTALL (0xcd00) Corresponds to DEV_INSTALL and has to be used in MagiC due to +the incompatible driver format to MultiTOS. (*) +
  + + + + + + +
name: Complete pathname of the driver +
arg: Pointer to MX_DDEV structure + +
+ +
As of MagiC 6: MX_DEV_INSTALL (0x6d20) (1) +
  + +
DEV_NEWTTY (0xde00) Installs drivers for a new BIOS terminal +
  + + + + + + +
name: Name of the terminal (in the form 'U:\DEV\DEVNAME') +
arg: BIOS device number of the terminal + +
+ +
The BIOS must have been informed about the device via Bconmap, +else any attempt to access the device will be punished with EUNDEV. +
  + +
DEV_NEWBIOS (0xde01) Installs a driver for a new BIOS non-terminal device (devices +that must have their data transmitted raw, such as SCSI devices). +
  + + + + + + +
name: Complete name of the device +
arg: Associated BIOS device number + +
+ +
The BIOS must have been informed about the device via Bconmap, +else any attempt to access the device will be punished with EUNDEV. +
  + +
+ +
Note: The opcodes marked with (*) here are only +available under MagiC, all others only under MiNT or MultiTOS. +Exceptions: The opcodes FUTIME and CDROMEJECT are avaiable both under +MiNT/MultiTOS as well as under MagiC. +
  +
(1): Unfortunately there were collisions between MagiC and the +Minix-XFS for MiNT. Hence MagiC as of Version 6 contains new codes, +though the old ones are still supported. The new codes have 0x6d in +the upper WORD; this ID is reserved for MagiC. +
  +
Return value: The return value depends on the desired operation and the +underlying file-system. With a value >= 0 everything was +successful. An exception is the value for DEV_INSTALL, which either +points to an information structure of the kernel, or else has the +value 0. +
  +
For an invalid opcode, EINVFN will be returned. +
  +
Availability: Available when a 'MiNT' cookie with a version of at least 0.90 +exists, and MagiC as of Version 3.0. +
  +
Group: Directory functions +
  +
See also: Binding   XFS-concept in MagiC   Bconmap   Fcntl   MagiC   Metaioctl +
  + +
+ +

5.15.3.1 Bindings for Dcntl

+ + + + + + +
C: int32_t Dcntl ( int16_t cmd, int8_t *name, int32_t arg ); +
  +
Assembler: +
  +
move.l    arg,-(sp)    ; Offset 8
+pea       name         ; Offset 4
+move.w    cmd,-(sp)    ; Offset 2
+move.w    #304,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+lea       $C(sp),sp    ; Correct stack
+
+ +
+ +

5.15.4 Dcreate

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Create directory« - Create a directory. +
  +
Opcode: 57 +
  +
Syntax: int32_t Dcreate ( CONST int8_t *path ); +
  +
Description: The GEMDOS routine Dcreate creates a directory with the +pathname path, which has to be terminated with the ASCII +character 0, on the specified drive. +
  +
Note: Due to defective error-handling in GEMDOS Versions +< 0.15, the file-system could be damaged in some circumstances. +Furthermore, no check was made whether a file with the specified name +already exists. +
  +
Atari GEMDOS Reference Manual from April 4, 1986 warns about +passing paths ending with a trailing backslash and indeed, the +function fails at least on TOS 1.0x in such case with EPTHNF. +
  +
As of MagiC 3, the call is passed on by the kernel as +xfs_dcreate with creation mode Fxattr %0100000111101101 (i.e. a +'directory file' with access permissions RWXRwXRwX). The XFS should +not delete any files or subdirectories of the same name, but return +the error-code EACCDN in this case. Invalid filenames "." or +".." must also be intercepted by the XFS. +
  +
Return value: The function can return the following results: +
  + + + + + + + + + +
E_OK No error has arisen +
EPTHNF Directory not found +
EACCDN Access denied + +
+ +
Availability: All GEMDOS versions. +
  +
Group: Directory functions +
  +
See also: Binding   Ddelete   ASCII table +
  + +
+ +

5.15.4.1 Bindings for Dcreate

+ + + + + + + + + +
C: int32_t Dcreate ( CONST int8_t *path ); +
  +
Assembler: +
  +
pea       path         ; Offset 2
+move.w    #57,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #6,sp        ; Correct stack
+
+
GFA-Basic Fehler%=Gemdos(&H39,L:path%) +
  + +
+ +

5.15.5 Ddelete

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Delete directory« - Delete a directory. +
  +
Opcode: 58 +
  +
Syntax: int32_t Ddelete ( CONST int8_t *path ); +
  +
Description: The GEMDOS routine Ddelete deletes a directory with the +pathname path, which may not contain any files or +subdirectories. The string path must be terminated with the +ASCII character 0. +
  +
Note: In GEMDOS Versions < 0.15 a call of Dcreate +with an immediately following Ddelete did not work - only a further +Ddelete achieved the desired result. +
  +
In MagiC the kernel first checks whether the directory is a +current path and if appropriate returns an error-message. If possible, +only empty directories should be deleted; this is however up to the +XFS. As of MagiC Version 4.01, symbolic links too can be deleted with +this function; older versions always deleted the directory to which +the link pointed. +
  +
Return value: The function can return the following results: +
  + + + + + + + + + + + + +
E_OK No eror has arisen +
EPTHNF Directory not found +
EACCDN Access denied +
EINTRN Internal error of the GEMDOS + +
+ +
Availability: All GEMDOS versions. +
  +
Group: Directory functions +
  +
See also: Binding   Dcreate   XFS-concept in MagiC +
  + +
+ +

5.15.5.1 Bindings for Ddelete

+ + + + + + + + + +
C: int32_t Ddelete ( CONST int8_t *path ); +
  +
Assembler: +
  +
pea       path         ; Offset 2
+move.w    #58,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #6,sp        ; Correct stack
+
+
GFA-Basic Fehler%=Gemdos(&H3A,L:path%) +
  + +
+ +

5.15.6 Dfree

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Free disk space« - Obtain free and total capacity of a +drive. +
  +
Opcode: 54 +
  +
Syntax: int16_t Dfree ( DISKINFO *buf, int16_t driveno ); +
  +
Description: The GEMDOS routine Dfree obtains the capacity and current +occupancy of a drive. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
buf Address of the information buffer +
driveno + + + + + + + + + +
0 = Current drive +
1 = Drive A: +
2 = Drive B: (etc.) + +
+ + +
+ +
Note: In GEMDOS Versions < 0.15 this function is +unbelievably slow when used on a hard drive. +
  +
Applied to the directory U:\PROC, from MagiC 3 onwards this +function returns the minimum, actual block length (as sectors per +cluster). Presently the memory is allocated word-wise, i.e. the +'sector size' is 1 int8_t and the cluster size comprises 2 sectors +(i.e. 2 int8_ts). +
  +
Return value: The function returns a 0 for a correct execution, or a negative +number if an error arose. +
  +
Availability: All GEMDOS versions. +
  +
Group: Directory functions +
  +
See also: Binding   Fdelete +
  + +
+ +

5.15.6.1 Bindings for Dfree

+ + + + + + + + + +
C: int16_t Dfree ( DISKINFO *buf, int16_t driveno ); +
  +
Assembler: +
  +
move.w    driveno,-(sp)  ; Offset 6
+pea       buf            ; Offset 2
+move.w    #54,-(sp)      ; Offset 0
+trap      #1             ; GEMDOS
+addq.l    #8,sp          ; Correct stack
+
+
GFA-Basic Fehler%=Gemdos(&H36,L:buf%,W:driveno%) +
  + +
+ +

5.15.7 Dgetcwd

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dgetcwd« - Obtain the current directory of a process. +
  +
Opcode: 315 +
  +
Syntax: int32_t Dgetcwd ( int8_t *path, int16_t drv, int16_t size ); +
  +
Description: The current working directory of the active process in drive +drv is returned. The parameter size gives the size of +the buffer for accommodating the name. +
  +
Return value: path: Directory of the current process. +
  +
The return value of the function is either 0 (all OK), ERANGE +(the size of the buffer is insufficient to hold the exact description +of the directory), or EDRIVE (invalid GEMDOS ignore} drive). +
  +
Availability: Available when a 'MiNT' cookie with a version of at least 0.96 +exists, and MagiC as of Version 3.0. +
  +
Group: Directory functions +
  +
See also: Binding   Dgetpath +
  + +
+ +

5.15.7.1 Bindings for Dgetcwd

+ + + + + + +
C: int32_t Dgetcwd ( int8_t *path, int16_t drv, int16_t size ); +
  +
Assembler: +
  +
move.w    size,-(sp)   ; Offset 8
+move.w    drv,-(sp)    ; Offset 6
+pea       path         ; Offset 2
+move.w    #315,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+lea       $A(sp),sp    ; Correct stack
+
+ +
+ +

5.15.8 Dgetdrv

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Disk get drive« - Obtain the current drive. +
  +
Opcode: 25 +
  +
Syntax: int16_t Dgetdrv ( VOID ); +
  +
Description: The GEMDOS routine Dgetdrv obtains the current drive. +
  +
Return value: The function returns a number, which is coded as follows: +
  + + + + + + + + + + + + + + + + + + +
Value Meaning +
    +
0 Drive A: +
1 Drive B: +
2 Drive C: +
3 Drive D: (etc.) + +
+ +
Note: As of MagiC 3, drives from A: to Z:, i.e. values +from 0 to 25, are permissible. +
  +
Availability: All GEMDOS versions. +
  +
Group: Directory functions +
  +
See also: Binding   Dsetdrv   _drvbits +
  + +
+ +

5.15.8.1 Bindings for Dgetdrv

+ + + + + + + + + +
C: int16_t Dgetdrv ( VOID ); +
  +
Assembler: +
  +
move.w    #25,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #2,sp        ; Correct stack
+
+
GFA-Basic Fehler%=Gemdos(&H19) +
  + +
+ +

5.15.9 Dgetpath

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Get path« - Obtain current path specification. +
  +
Opcode: 71 +
  +
Syntax: int16_t Dgetpath ( int8_t *path, int16_t driveno ); +
  +
Description: The GEMDOS routine Dgetpath obtains the current directory on +the drive driveno. The designation of the drives are coded in +the parameter driveno as follows: +
  + + + + + + + + + + + + + + + + + + +
driveno Meaning +
    +
0 Current drive +
1 Drive A: +
2 Drive B: +
3 Drive C: (etc.) + +
+ +
The path is stored in buffer path as a string. As the +maximum path length is not restricted in GEMDOS, and can be obtained +only with the existence of the function Dpathconf, the receiving +buffer should offer sufficient space (256 bytes ought to be enough). +
  +
Return value: The function can return the following results: +
  +

+
+ + + + + + + + + + +
E_OK:No eror has arisen
EDRIVE:Invalid drive number
+
+ +
Availability: All GEMDOS versions. +
  +
Group: Directory functions +
  +
See also: Binding   Dsetpath +
  + +
+ +

5.15.9.1 Bindings for Dgetpath

+ + + + + + + + + +
C: int16_t Dgetpath ( int8_t *path, int16_t driveno ); +
  +
Assembler: +
  +
move.w    driveno,-(sp)  ; Offset 6
+pea       path           ; Offset 2
+move.w    #71,-(sp)      ; Offset 0
+trap      #1             ; GEMDOS
+addq.l    #8,sp          ; Correct stack
+
+
GFA-Basic Fehler%=Gemdos(&H47,L;path%,W:driveno%) +
  + +
+ +

5.15.10 Dlock

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dlock« - Lock a BIOS device or releases it again. +
  +
Opcode: 309 +
  +
Syntax: int32_t Dlock ( int16_t mode, int16_t drv ); +
  +
Description: The function Dlock permits the locking of the BIOS device +drv, or releasing it again. On a locked drive no GEMDOS file +operations are permitted; Rwabs is only allowed for the locking +process. +
  +
The purpose of the function is to allow low-level programs (such +as those for formatting) to perform (X)BIOS functions, while the +device remains locked for normal file accesses. +
  +

+
+ + + + + + + + +
Bit 0 of mode = 1:Lock device
= 0:Release device
+
+ +
If a process is terminated that still holds a lock on a device, +then this lock will be lifted. +
  +
Bit 1 of mode indicates which return values are desired. +If this bit is set, and the corresponding device is already locked by +another process (or if another process has opened files on this +device), then this process' ID will be returned. This permits more +meaningful error-messages to the user, as one can now disclose which +process is using the device if the locking should go wrong. +
  +
All other bits of mode are reserved and must be set to +0. +
  +
Locking of a device with immediately following release of the +same is very similar to a media change. One should merely note that it +is not possible to lock if files are still open on the specified +device. +
  +
Note for MagiC: Before locking of the drive, provided a +file-system exists for the drive, the caches will be written back via +the vector xfs_sync. Then the kernel inquires via xfs_drv_close +whether the drive may be locked. If so, the XFS releases its +structures and then signals the kernel that it too can release its +structures for the drive, and perform the lock. +
  +
Return value: The function can return the following values: +
  + + + + + + + + + + + + + + + +
E_OK : No error has arisen +
EACCDN : Device could not be locked, as open files or directories exist +on it +
EDRIVE : drv is not a valid BIOS device +
ELOCKED : Device is already locked by another process +
ENSLOCK : Device has been released already + +
+ +
Availability: Available when a 'MiNT' cookie with a version of at least 0.93 +exists, and MagiC as of Version 3.0. +
  +
Group: Directory functions +
  +
See also: Binding   Fxattr   XFS-concept in MagiC +
  + +
+ +

5.15.10.1 Bindings for Dlock

+ + + + + + +
C: int32_t Dlock ( int16_t mode, int16_t drv ); +
  +
Assembler: +
  +
move.w    drv,-(sp)    ; Offset 4
+move.w    mode,-(sp)   ; Offset 2
+move.w    #309,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

5.15.11 Dopendir

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dopendir« - Open a specified directory for reading. +
  +
Opcode: 296 +
  +
Syntax: int32_t Dopendir ( int8_t *name, int16_t flag ); +
  +
Description: The function Dopendir opens the directory name for +reading. name should be NULL-terminated and should not contain +a trailing backslash. The parameter flag describes the manner +in which the directory is to be opened: +
  + + + + + + + + + + + + +
flag Meaning +
    +
0 Normal mode +
In this mode an attempt is made not to restrict the length of the +filename. Also, Dreaddir in this mode return an index number (similar +to the UNIX inode's) in the first 4 bytes of the filename. +
1 Compatibility mode +
In this mode file-systems behave as if Fsfirst or Fsnext calls +were being used. In particular, filenames will be truncated according +to the DOS-convention to 8+3 characters, if that is possible. + +
+ +
Newer programs should always use the normal mode if possible, in +order to exploit the full functionaity. +
  +
Return value: The function returns a 32-bit directory handle if successful; +this may also be negative, but in no case may contain the value 0xff +in the higher byte, through which it can be differentiated from +errors. +
  +
In case of error, the following returns are possible: +
  + + + + + + + + + +
EPTHNF : name is not a valid directory +
EACCDN : The directory is not addressable by this program +
ENSMEM : The kernel cannot allocate memory for this operation + +
+ +
Availability: Available when a 'MiNT' cookie with a version of at least 0.90 +exists, and in MagiC as of Version 3.0. +
  +
Group: Directory functions +
  +
See also: Binding   Dclosedir   Dreaddir   Drewinddir   Pdomain +
  + +
+ +

5.15.11.1 Bindings for Dopendir

+ + + + + + +
C: int32_t Dopendir ( int8_t *name, int16_t flag ); +
  +
Assembler: +
  +
move.w    flag,-(sp)   ; Offset 6
+pea       name         ; Offset 2
+move.w    #296,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #8,sp        ; Correct stack
+
+ +
+ +

5.15.12 Dpathconf

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dpathconf« - Obtain information about a file-system. +
  +
Opcode: 292 +
  +
Syntax: int32_t Dpathconf ( BYTE *name, int16_t mode ); +
  +
Description: The function Dpathconf makes it possible to obtain information +about the file-system that contains the file name. +
  +
The parameter mode specifies which possibilities or +restrictions of the file-systems are to be inquired. Possible values +here are: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
mode Meaning +
  +
    +
  +
-1: Maximum permissible value for Dpathconf itself +
  + +
DP_IOPEN (0): Maximum number of opened files +
  + +
DP_MAXLINKS (1): Maximum number of references (links) to a file +
  + +
DP_PATHMAX (2): Maximum length of the full pathname +
  + +
DP_NAMEMAX (3): Maximum length of a filename +
  + +
DP_ATOMIC (4): Number of bytes that may be written at a time per write +operation +
  + +
DP_TRUNC (5): Information about truncation of filenames: +
  + + + + + + + + + +
0 = Filenames are not truncated; if the maximum filename length is +exceeded at a system call, the value ERANGE will be returned +
1 = Filenames are truncated automatically to the maximum possible +length +
2 = Filenames are truncated according to the DOS convention (i.e. 8 +characters for the name, 3 characters for the extension) + +
+ + +
DP_CASE (6): Information about case sensitivity: +
  + + + + + + + + + +
0 = Differentiation between capitals and lower case (file-system is +case-sensitive) +
1 = No differentiation between capitals and lower case (all +characters are converted to either capitals or lower case - +file-system is not case-sensitive) +
2 = No differentiation between capitals and lower case; however the +file-system saves the path and filenames with the original values +
Example: The displayed file 'HelloWorld' can also be accessed +with 'HELLOWorld' or 'HeLLoWORLD' + +
+ + + +
DP_MODEATTR (7): Information about mode-bits of a file: +
  +
This mode returns information about the validity of the values +defined in the mode and attr fields of the XATTR +structure. The bits 0..5 describe which flags of the component +attr are valid. The following apply: +
  + + + + + + + + + + + + + + + + + + +
FA_RDONLY (0x01): Is set only if the read permission is controlled via this bit, +and not when it is emulated via the meaning of the mode-bits +
FA_HIDDEN (0x02):   +
FA_SYSTEM (0x04): Is set if the file-system supports these specific attributes +(normally only the case for DOS file-systems) +
FA_LABEL (0x08): Is set if the file-system label can be obtained with +Fsfirst/Fsnext +
FA_DIR (0x10): Reserved; to decide whether one is dealing with a folder on the +file-system, one should fall back to the filetype bits (see below) +
FA_CHANGED (0x20): Is set if the file-system knows the concept of archive bits, +and the attr field is used for this purpose + +
+ +
The bits 6 and 7 are reserved. The bits 8..19 store information +about whether the lower 12 bits of the mode component are +valid. The bits 20..27 describe which filetypes are supported by the +file-system. The following applies: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
DP_FT_DIR (0x00100000L): Folder +
DP_FT_CHR (0x00200000L): Special character-files +
DP_FT_BLK (0x00400000L): Special block-files (unused at present) +
DP_FT_REG (0x00800000L): Regular files +
DP_FT_LNK (0x01000000L): Symbolic links +
DP_FT_SOCK (0x02000000L): Sockets (unused at present) +
DP_FT_FIFO (0x04000000L): Pipes +
DP_FT_MEM (0x08000000L): Shared memory or process files + +
+ +
The bits 28..31 are reserved. +
  + + +
DP_XATTRFIELDS (8): Information about extended attributes: +
  +
In this mode a bit-mask of the supported fields (specified in +the XATTR structure) is returned. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DP_INDEX (0x0001): Unambiguous index field for each file on the +file-system +
DP_DEV (0x0002): Device number +
DP_RDEV (0x0004): rdev field valid, and not identical +to the dev field +
DP_NLINK (0x0008): Number of links +
DP_UID (0x0010): User number +
DP_GID (0x0020): Group number +
DP_BLKSIZE (0x0040): Block size +
DP_SIZE (0x0080): File length +
DP_NBLOCKS (0x0100): Number of blocks +
DP_ATIME (0x0200): Time of last access +
DP_CTIME (0x0400): Time of file creation +
DP_MTIME (0x0800): Time of last change + +
+ +
All other bits are reserved for future purposes. +
  + +
DP_VOLNAMEMAX (9): Maximum length of a volume name (0 if volume names not +supported) +
  + +
+ +
A return value of 0x7fffffff (2^31 -1) means that there is no +limit for the component inquired about. +
  +
Note: In MagiC the function can also be applied to +files. However the filename is ignored in this case, i.e. only +the path will be evaluated. The function should be called in MagiC +after Dopendir if necessary, as Dpathconf does not recognise disk +changes (reason: if the path is still in the cache, no disk +access is performed and hence no disk change is recognised). +
  +
Return value: The function returns the properties/limitations of the +file-system paying regard to the parameter mode (see above). +
  +
Availability: As of the first in MultiTOS integrated MiNT version 1.04, and +in MagiC as of Version 3.0. +
  +
Group: Directory functions +
  +
See also: Binding   Sysconf   XFS-concept in MagiC   Test for pipes +
  + +
+ +

5.15.12.1 Bindings for Dpathconf

+ + + + + + +
C: int32_t Dpathconf ( BYTE *name, int16_t mode ); +
  +
Assembler: +
  +
move.w    mode,-(sp)   ; Offset 6
+pea       name         ; Offset 2
+move.w    #292,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #8,sp        ; Correct stack
+
+ +
+ +

5.15.13 Dreaddir

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dreaddir« - Read directory information. +
  +
Opcode: 297 +
  +
Syntax: int32_t Dreaddir ( int16_t len, int32_t dirhandle, int8_t *buf +); +
  +
Description: The function Dreaddir returns the next file in the directory +dirhandle. The filename and an optional 4-byte index for the +file are written to buf. +
  +
The file index is omitted if the directory was opened im +compatibility mode, otherwise it appears as the first in buf +followed by a (NULL-terminated) filename. +
  +
(Possibly different) names with the same index belong to the +same file. (Possibly same) names with different indexes belong to +different files. +
  +
Note about MagiC: For FAT file-systems the function +returns the following index data: +
  +
    +
  • Directories: Start cluster in Motorola format +
  • +
  • Other files: + + + + + + +
    High word = Start cluster of the directory +
    Low word = Position within the directory >> 5 + +
    + +
  • +
+ +
This procedure is similar to that used by Linux and Solaris. The +drawback is that files alter their index during a move. +
  +
In len the size of the receiving buffers has to be +specified. +
  +
Return value: The function can return the following results: +
  + + + + + + + + + +
E_OK : No error has arisen +
ENMFIL : No further files present +
ERANGE : The buffer length is insufficient + +
+ +
Availability: Available when a 'MiNT' cookie with a version of at least 0.90 +exists, and in MagiC as of Version 3.0. +
  +
Group: Directory functions +
  +
See also: Binding   Dclosedir   Dopendir   Drewinddir   Dxreaddir +
  + +
+ +

5.15.13.1 Bindings for Dreaddir

+ + + + + + +
C: int32_t Dreaddir ( int16_t len, int32_t dirhandle, int8_t *buf +); +
  +
Assembler: +
  +
pea       buf          ; Offset 8
+move.l    dirhandle    ; Offset 4
+move.w    len          ; Offset 2
+move.w    #297,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+lea       $C(sp),sp    ; Correct stack
+
+ +
+ +

5.15.14 Dreadlabel

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dreadlabel« - Read file-system label. +
  +
Opcode: 338 (0x0152) +
  +
Syntax: int32_t Dreadlabel ( CONST int8_t *path, int8_t *label, int16_t +length ); +
  +
Description: The function Dreadlabel returns in label the name of +the file-system lying in path. The parameter length +specifies the size of the receiving buffer for label. +
  +
Return value: The function can return the following results: +
  + + + + + + +
E_OK : No eror has arisen +
ENAMETOOLONG : The name of the file-system is longer than the size of the +receiving buffer + +
+ +
Availability: In MagiC as of Version 3.0, from MiNT 1.12 onwards. +
  +
Group: Directory functions +
  +
See also: Binding   Dwritelabel   XFS-concept in MagiC +
  + +
+ +

5.15.14.1 Bindings for Dreadlabel

+ + + + + + +
C: int32_t Dreadlabel ( CONST int8_t *path, int8_t *label, int16_t +length ); +
  +
Assembler: +
  +
move.w    length,-(sp)  ; Offset 10
+pea       label         ; Offset  6
+pea       path          ; Offset  2
+move.w    #338,-(sp)    ; Offset  0
+trap      #1            ; GEMDOS
+lea       $C(sp),sp     ; Correct stack
+
+ +
+ +

5.15.15 Drewinddir

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Drewinddir« - Rewind the pointer for the specified directory +to the first file. +
  +
Opcode: 298 +
  +
Syntax: int32_t Drewinddir ( int32_t handle ); +
  +
Description: The function Drewinddir resets the directory handle to +the start, so that the next call of Dreaddir reads the first entry in +the directory once more. +
  +
Return value: The function can return the following results: +
  + + + + + + + + + +
E_OK : No error has arisen +
EINVFN : Directory cannot be rewound +
EBADF : The directory handle is not open + +
+ +
Availability: Available when a 'MiNT' cookie with a version of at least 0.90 +exists, and in MagiC as of Version 3.0. +
  +
Group: Directory functions +
  +
See also: Binding   Dopendir   Dreaddir +
  + +
+ +

5.15.15.1 Bindings for Drewinddir

+ + + + + + +
C: int32_t Drewinddir ( int32_t handle ); +
  +
Assembler: +
  +
move.l    handle,-(sp)  ; Offset 2
+move.w    #298,-(sp)    ; Offset 0
+trap      #1            ; GEMDOS
+addq.l    #6,sp         ; Correct stack
+
+ +
+ +

5.15.16 Dsetdrv

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Disk set drive« - Set the current drive and returns a +bit-map of mounted drives. +
  +
Opcode: 14 +
  +
Syntax: int32_t Dsetdrv ( int16_t drv ); +
  +
Description: The GEMDOS routine Dsetdrv makes the drive drv the +current default drive. The following apply: +
  + + + + + + + + + + + + + + + +
drv Meaning +
    +
0 Drive A: +
1 Drive B: +
2 Drive C: (etc.) + +
+ +
Note: An incorrect drive number can lead to serious +damage in GEMDOS-internal structures. The drives supported by GEMDOS +are best interrogated as follows: +
  +
Dsetdrv (Dgetdrv ());
+
+
As of MagiC 3, drives from A to Z, i.e. values from 0 to 25 are +permissible. No check is made whether the specified drive even exists. +
  +
GEMDOS 0.30 (TOS 4.00-4.04) returns erroneous EDRIVEs for +drives above P:! +
  +
Return value: Return value: The function returns a bit-table with all +mounted drives. Each mounted drive is shown as one set bit. +
  +
Availability: All GEMDOS versions. +
  +
Group: Directory functions +
  +
See also: Binding   Dgetdrv   _drvbits +
  + +
+ +

5.15.16.1 Bindings for Dsetdrv

+ + + + + + + + + +
C: int32_t Dsetdrv ( int16_t drv ); +
  +
Assembler: +
  +
move.w    drv,-(sp)    ; Offset 2
+move.w    #14,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #4,sp        ; Correct stack
+
+
GFA-Basic Fehler%=Gemdos(&H0E,W:drv%) +
  + +
+ +

5.15.17 Dsetkey

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set key« - Set the key/passphrase for a drive. +
  +
Opcode: 333 (0x014d) +
  +
Syntax: int32_t Dsetkey ( int32_t hidev, int32_t lowdev, int8_t *key, +int16_t cipher ); +
  +
Description: The GEMDOS routine Dsetkey set the key/passphrase for the drive +specified by hidev and lowdev. Drive will be +deferenced if it is an alias. +
  +
The parameter key is a pointer to the new passhrase; if +this is an empty string, ciphering will be disabled for the drive; if +it is a NULL pointer, the function checks the current ciphering mode. +
  +
The parameter cipher specifies the cipher type to use. +Currently, only zero (Blowfish) is supported. Other values are +reserved for future expansion. +
  +
As changing the key directly influences data access, the drive +is Dlock()ed during this process to prevent data loss. +
  +
Return value: If key is NULL, the function returns 0 if ciphering is +disabled on dev, or any other value if ciphering is enabled. +
  +
If key is not NULL, the following return values are +possible: +
  + + + + + + + + + + + + +
E_OK No error has arisen +
EDRIVE Drive is invalid +
EINVAL Cipher is invalid +
Otherwise Any GEMDOS error code returned by Dlock() + +
+ +
Availability: This function is available as of FreeMiNT 1.15.4. +
  +
Group: Directory functions +
  +
See also: Binding +
  + +
+ +

5.15.17.1 Bindings for Dsetkey

+ + + + + + + + + +
C: int32_t Dsetkey ( int32_t hidev, int32_t lowdev, int8_t *key, +int16_t cipher ); +
  +
Assembler: +
  +
move.w    cipher,-(sp) ; Offset 14
+pea       key          ; Offset 10
+move.l    lowdev,-(sp) ; Offset 6
+move.l    hidev,-(sp)  ; Offset 2
+move.w    #333,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+lea       16(sp),sp    ; Correct stack
+
+
GFA-Basic Fehler%=Gemdos(&H14D,L:hidev%,L:lowdev%,L:key%,W:cipher%) +
  + +
+ +

5.15.18 Dsetpath

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set path« - Set the current directory. +
  +
Opcode: 59 +
  +
Syntax: int16_t Dsetpath ( CONST int8_t *path ); +
  +
Description: The GEMDOS routine Dsetpath sets a new access path for the +current drive. The parameter path contains the new current +access path for the drive. +
  +
Note: For each drive, GEMDOS will remember the current +directory. However, the function Dsetpath should be used only for the +current drive. For other drives the following method should be applied +instead: +
  +
    +
  • Establish current drive +
  • +
  • Set desired drive +
  • +
  • Set path for this drive +
  • +
  • Make the old (remembered) drive the current one again +
  • +
+ +
On some (older) versions of GEMDOS, a too frequent setting of +non-existing paths can lead to disturbance in the internal structures. +
  +
Return value: The function can return the following results: +
  + + + + + + +
E_OK No eror has arisen +
EPTHNF Directory not found + +
+ +
Availability: All GEMDOS versions. +
  +
Group: Directory functions +
  +
See also: Binding   Dgetpath +
  + +
+ +

5.15.18.1 Bindings for Dsetpath

+ + + + + + + + + +
C: int16_t Dsetpath ( CONST int8_t *path ); +
  +
Assembler: +
  +
pea       path         ; Offset 2
+move.w    #59,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #6,sp        ; Correct stack
+
+
GFA-Basic Fehler%=Gemdos(&H3B,L:path%) +
  + +
+ +

5.15.19 Dwritelabel

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dwritelabel« - Set file-system label. +
  +
Opcode: 339 (0x0153) +
  +
Syntax: int32_t Dwritelabel ( CONST int8_t *path, CONST int8_t *label +); +
  +
Description: The function Dwritelabel writes the name specified in +label to the file-system specified in path. +
  +
Prior to MiNT version 1.14.5 this call contained a bug that +allowed the label to be changed by all users. +
  +
Return value: E_OK if successful, else a negative GEMDOS error-code. +
  +
Availability: MagiC as of Version 3.0, MiNT 1.12 +
  +
Group: Directory functions +
  +
See also: Binding   Dreadlabel   XFS-concept in MagiC +
  + +
+ +

5.15.19.1 Bindings for Dwritelabel

+ + + + + + +
C: int32_t Dwritelabel ( CONST int8_t *path, CONST int8_t *label +); +
  +
Assembler: +
  +
pea       label        ; Offset 6
+pea       path         ; Offset 2
+move.w    #339,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+lea       $A(sp),sp    ; Correct stack
+
+ +
+ +

5.15.20 Dxopendir

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dxopendir« - Open directory for reading. +
  +
Opcode: 1296 +
  +
Syntax: int32_t Dxopendir ( int8_t *name, int16_t flag ); +
  +
Description: Dxopendir calls the normal Dopendir, but then saves the +returned handle and flag in a chained list, so that Dreaddir and +Dxreaddir know what they have to convert for this directory. +Dcloseddir deletes the handle again from the list. +
  +
Dreaddir and Dxreaddir convert the returned name to lower case. +
  +
The function opens the directory name for reading. The +parameter flag describes the manner how the directory is to be +opened: +
  + + + + + + + + + + + + +
flag Meaning +
    +
0 Normal mode +
In this mode an attempt is made not to restrict the length of the +filename. Also, Dreaddir in this mode return an index number (similar +to the UNIX inode's) in the first 4 bytes of the filename. +
1 Compatibility mode +
In this mode file-systems behave as if Fsfirst or Fsnext calls +were being used. In particular, filenames will be truncated according +to the DOS-convention to 8+3 characters, if that is possible. + +
+ +
Newer programs should always use the normal mode if possible, in +order to exploit the full functionaity. +
  +
Return value: The function returns a 32-bit directory handle if successful; +this may also be negative, but in no case may contain the value 0xff +in the higher byte, through which it can be differentiated from +errors. +
  +
In case of error, the following returns are possible: +
  + + + + + + + + + +
EPTHNF : name is not a valid directory +
EACCDN : The directory is not addressable by this program +
ENSMEM : The kernel cannot allocate memory for this operation + +
+ +
Availability: When the system extension Dir_Lwr (supplied with Égale 4.2) is +installed. Creates the cookie 'DYDL'. +
  +
Group: Directory functions +
  +
See also: Binding   Dclosedir   Dreaddir   Drewinddir   Pdomain +
  + +
+ +

5.15.20.1 Bindings for Dxopendir

+ + + + + + +
C: int32_t Dxopendir ( int8_t *name, int16_t flag ); +
  +
Assembler: +
  +
move.w    flag,-(sp)   ; Offset 6
+pea       name         ; Offset 2
+move.w    #1296,-(sp)  ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #8,sp        ; Correct stack
+
+ +
+ +

5.15.21 Dxreaddir

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dxreaddir« - Read directory information, obtain attributes. +
  +
Opcode: 322, (0x142) +
  +
Syntax: int32_t Dxreaddir ( int16_t ln, int32_t dirh, int8_t *buf, +XATTR *xattr, int32_t *xr ); +
  +
Description: The function Dxreaddir returns the next file from the directory +with the handle dirh. The filename and the optional 4 byte +long file index are stored in the buffer specified in buf. +
  +
The file index is omitted if the compatibility mode was +specified for Dopendir. If two filenames have the same index, they +represent the same file. +
  +
MagiC returns for FAT file-systems the following index data: +
  +
    +
  • Directories: Start cluster in Motorola format +
  • +
  • Other files: + + + + + + +
    High word = Start cluster of the directory +
    Low word = Position within the directory >> 5 + +
    + +
  • +
+ +
This procedure is similar to that used by Linux and Solaris. The +drawback is that files alter their index during a move. +
  +
The parameter ln specifies the length of the receiving +buffer buf. The extended file attributes are stored similarly +to Fxattr in the xattr structure, where symbolic links are not +dissolved. +
  +
Note: This part of the call may fail even though the +filename was readable. In that case a separate return code will be +stored in the LONG value to which the parameter xr points. +
  +
Return value: The function can return the following results: +
  + + + + + + + + + +
E_OK : No error has arisen +
ENMFIL : No further files found +
ERANGE : The receiving buffer is not large enoough + +
+ +
Availability: MagiC as of Version 3.0, MiNT 1.11 onwards. +
  +
Group: Directory functions +
  +
See also: Binding   Dreaddir   Dopendir   Dclosedir   Drewinddir +
  + +
+ +

5.15.21.1 Bindings for Dxreaddir

+ + + + + + +
C: int32_t Dxreaddir ( int16_t ln, int32_t dirh, int8_t *buf, +XATTR *xattr, int32_t *xr ); +
  +
Assembler: +
  +
pea       xr           ; Offset 16
+pea       xattr        ; Offset 12
+pea       buf          ; Offset  8
+move.l    dirh         ; Offset  4
+move.w    ln           ; Offset  2
+move.w    #322,-(sp)   ; Offset  0
+trap      #1           ; GEMDOS
+lea       $14(sp),sp   ; Correct stack
+
+ +
+ +
+ +Home +GEMDOSGEMDOS +System functionsSystem functions +Character input/outputCharacter input/output + + diff --git a/en/gemdos_errors.html b/en/gemdos_errors.html new file mode 100644 index 000000000..aa8bb1990 --- /dev/null +++ b/en/gemdos_errors.html @@ -0,0 +1,947 @@ + + + + + +The documentation for TOS: GEMDOS error-messages + + + + + + + + + +Home +GEMDOSGEMDOS +Support for alternative file-systemsSupport for alternative file-systems +Pipes, Test forPipes, Test for + +
+ +

5.3 GEMDOS error-messages

+

Errors are reported by GEMDOS as negative LONG values. The +following list contains all known error-messages: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
No. Name Meaning +
    + +
  0 E_OK OK. No error has arisen + +
-32 EINVFN Unknown function number + +
-33 EFILNF File not found + +
-34 EPTHNF Directory (folder) not found + +
-35 ENHNDL No more handles available + +
-36 EACCDN Access denied + +
-37 EIHNDL Invalid file handle + +
-39 ENSMEM Insufficient memory + +
-40 EIMBA Invalid memory block address + +
-46 EDRIVE Invalid drive specification + +
-47 ECWD Current directory cannot be deleted + +
-48 ENSAME Files on different logical drives + +
-49 ENMFIL No more files can be opened +
-58 ELOCKED Segment of a file is protected (network) +
-59 ENSLOCK Invalid lock removal request +
-64 ERANGE File pointer in invalid segment (see also FreeMiNT message -88) + +
-65 EINTRN Internal error of GEMDOS + +
-66 EPLFMT Invalid program load format + +
-67 EGSBF Allocated memory block could not be enlarged +
-68 EBREAK Program termination by Control-C +
-69 EXCPT 68000 exception (bombs) + +
-70 EPTHOV Path overflow +
-80 ELOOP Endless loop with symbolic links +
-81 EPIPE Write to broken pipe. + +
+ +

Under FreeMiNT there are a few more error-messages, or values +were adapted. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
No. Name Meaning +
    + +
  -1 EERROR Generic error + +
  -2 EBUSY Resource busy + +
  -3 EUKCMD Unknown command + +
  -4 ECRC CRC error + +
  -5 EBADR Bad request + +
  -6 ESPIPE Illegal seek + +
  -7 EMEDIUMTYPE Wrong medium type + +
  -8 ESECTOR Sector not found + +
 -10 EWRITE Write fault + +
 -12 EGENERIC General mishap + +
 -13 EROFS Write protected + +
 -14 ECHMEDIA Media change + +
 -15 ENODEV No such device + +
 -16 EBADSEC Bad sectors found + +
 -17 ENOMEDIUM No medium found + +
 -20 ESRCH No such process + +
 -21 ECHILD No child processes + +
 -22 EDEADLK Resource deadlock would occur + +
 -23 ENOTBLK Block device required + +
 -24 EISDIR Is a directory + +
 -25 EINVAL Invalid argument + +
 -26 EFTYPE Inappropriate file type or format + +
 -27 EILSEQ Illegal byte sequence + +
 -32 ENOSYS Function not implemented + +
 -33 ENOENT No such file or directory + +
 -34 ENOTDIR Not a directory + +
 -35 EMFILE Too many open files + +
 -36 EACCES Permission denied + +
 -37 EBADF Bad file descriptor + +
 -38 EPERM Operation not permitted + +
 -39 ENOMEM Cannot allocate memory + +
 -40 EFAULT Bad address + +
 -46 ENXIO No such device or address + +
 -48 EXDEV Cross-device link + +
 -49 ENMFILES No more matching file names + +
 -50 ENFILE File table overflow + +
 -58 ELOCKED Locking conflict + +
 -59 ENSLOCK No such lock + +
 -64 EBADARG Bad argument + +
 -65 EINTERNAL Internal error + +
 -66 ENOEXEC Invalid executable file format + +
 -67 ESBLOCK Memory block growth failure + +
 -68 EBREAK Aborted by user + +
 -69 EXCPT Terminated with bombs + +
 -70 ETXTBSY Text file busy + +
 -71 EFBIG File too big + +
 -80 ELOOP Too many symbolic links, possibly endless loop + +
 -81 EPIPE Broken pipe + +
 -82 EMLINK Too many links + +
 -83 ENOTEMPTY Directory not empty + +
 -85 EEXIST File exists + +
 -86 ENAMETOOLONG Name too long + +
 -87 ENOTTY Not a TTY + +
 -88 ERANGE Range error + +
 -89 EDOM Domain error + +
 -90 EIO I/O error + +
 -91 ENOSPC No space left on device +
 -92 reserved for TraPatch +
 -93 reserved for TraPatch +
 -94 reserved for TraPatch +
 -95 reserved for TraPatch +
 -96 reserved for TraPatch +
 -97 reserved for TraPatch +
 -98 reserved for TraPatch +
 -99 reserved for TraPatch + +
-100 EPROCLIM Too many processes for user + +
-101 EUSERS Too many users + +
-102 EDQUOT Quota exceeded + +
-103 ESTALE Stale NFS file handle + +
-104 EREMOTE Object is remote + +
-105 EBADRPC RPC struct is bad + +
-106 ERPCMISMATCH RPC version wrong + +
-107 EPROGUNAVAIL RPC program not available + +
-108 EPROGMISMATCH RPC program version wrong + +
-109 EPROCUNAVAIL RPC bad procedure for program + +
-110 ENOLCK No locks available + +
-111 EAUTH Authentication error + +
-112 ENEEDAUTH Need authenticator + +
-113 EBACKGROUND Inappropriate operation for background process + +
-114 EBADMSG Not a data message + +
-115 EIDRM Identifier removed + +
-116 EMULTIHOP Multihop attempted + +
-117 ENODATA No data available + +
-118 ENOLINK Link has been severed + +
-119 ENOMSG No message of desired type + +
-120 ENOSR Out of streams resources + +
-121 ENOSTR Device not a stream + +
-122 EOVERFLOW Value too large for defined data type + +
-123 EPROTO Protocol error + +
-124 ETIME Timer expired + +
-125 E2BIG Argument list too long + +
-126 ERESTART Interrupted system call should be + +
-127 ECHRNG Channel number out of range + +
-128 EINTR Interrupted function call + +
-129 ESNDLOCKED Sound system is already locked + +
-130 ESNDNOTLOCK Sound system is not locked + +
-131 EL2NSYNC Level 2 not synchronized + +
-132 EL3HLT Level 3 halted + +
-133 EL3RST Level 3 reset + +
-134 ELNRNG Link number out of range + +
-135 EUNATCH Protocol driver not attached + +
-136 ENOCSI No CSI structure available + +
-137 EL2HLT Level 2 halted + +
-138 EBADE Invalid exchange + +
-139 EXFULL Exchange full + +
-140 ENOANO No anode + +
-141 EBADRQC Invalid request code + +
-142 EBADSLT Invalid slot + +
-143 EBFONT Bad font file format + +
-144 ENONET Machine is not on the network + +
-145 ENOPKG Package is not installed. + +
-146 EADV Advertise error + +
-147 ESRMNT Srmount error + +
-148 ECOMM Communication error on send + +
-149 EDOTDOT RFS specific error + +
-150 ELIBACC Cannot access a needed shared library + +
-151 ELIBBAD Accessing a corrupted shared library + +
-152 ELIBSCN lib section in a.out corrupted + +
-153 ELIBMAX Attempting to link too many shared libraries + +
-154 ELIBEXEC Cannot exec a shared library directly + +
-155 ESTRPIPE Streams pipe error + +
-156 EUCLEAN Structure needs cleaning + +
-157 ENOTNAM Not a XENIX named type file + +
-158 ENAVAIL No XENIX semaphores available + +
-159 EREMOTEIO Remote I/O error + +
-200 EMOUNT Mount point crossed (indicator) + +
-300 ENOTSOCK Socket operation on non-socket + +
-301 EDESTADDRREQ Destination address required + +
-302 EMSGSIZE Message too long + +
-303 EPROTOTYPE Protocol wrong type for socket + +
-304 ENOPROTOOPT Protocol not available + +
-305 EPROTONOSUPPORT Protocol not supported + +
-306 ESOCKTNOSUPPORT Socket type not supported + +
-307 EOPNOTSUPP Operation not supported + +
-308 EPFNOSUPPORT Protocol family not supported + +
-309 EAFNOSUPPORT Address family not supported by protocol + +
-310 EADDRINUSE Address already in use + +
-311 EADDRNOTAVAIL Cannot assign requested address + +
-312 ENETDOWN Network is down + +
-313 ENETUNREACH Network is unreachable + +
-314 ENETRESET Network dropped connection because of reset + +
-315 ECONNABORTED Software caused connection abort + +
-316 ECONNRESET Connection reset by peer + +
-317 EISCONN Socket is already connected + +
-318 ENOTCONN Socket is not connected + +
-319 ESHUTDOWN Cannot send after shutdown + +
-320 ETIMEDOUT Connection timed out + +
-321 ECONNREFUSED Connection refused + +
-322 EHOSTDOWN Host is down + +
-323 EHOSTUNREACH No route to host + +
-324 EALREADY Operation already in progress + +
-325 EINPROGRESS Operation now in progress + +
-326 EAGAIN Operation would block + +
-326 EWOULDBLOCK see EAGAIN + +
-327 ENOBUFS No buffer space available + +
-328 ETOOMANYREFS Too many references + +
+ +

See also: Error-messages in MagiC   BIOS error-messages +

+
+ +Home +GEMDOSGEMDOS +Support for alternative file-systemsSupport for alternative file-systems +Pipes, Test forPipes, Test for + + diff --git a/en/gemdos_file.html b/en/gemdos_file.html new file mode 100644 index 000000000..b44e40ecf --- /dev/null +++ b/en/gemdos_file.html @@ -0,0 +1,5641 @@ + + + + + +The documentation for TOS: File functions + + + + + + + + + +Home +GEMDOSGEMDOS +gemdos-trapgemdos-trap +Date and TimeDate and Time + +
+ +

5.9 File functions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Fattrib    Reads or modifies file attributes. +
Fchdir     Sets the current directory from a file descriptor. +
Fchmod     Sets file access permissions. +
Fchown     Changes ownership of a filename to uid and gid respectively. +
Fchown16   Changes ownership of a filename to uid and gid respectively. +
Fclose     Closes a given file. +
Fcntl      Performs control operations on a file. +
Fcreate    Creates a file. +
Fdatime    Reads or modifies a file's date/time stamp. +
Fdelete    Deletes a specified file. +
Fdirfd     Returns a file descriptor from a directory handle. +
Fdup       Duplicates file handle. +
Ffchmod    Changes access permissions for an open file. +
Ffchown    Changes ownership of an open file to uid and gid respectively. +
Ffdopendir Opens a directory from a file descriptor. +
Fforce     Redirects input/output of standard channels. +
Ffstat64   Obtains extended file attributes. +
Fgetchar   Reads characters from a file. +
Fgetdta    Gets disk transfer address. +
Finstat    Gets input status of a file. +
Flink      Creates a link to a file. +
Flock      Sets or removes file record lock. +
Fmidipipe  Redirects MIDI in/output. +
Fopen      Opens a specified file. +
Foutstat   Finds the output status of a file. +
Fpipe      Creates a pipe. +
Fpoll      Polls file descriptors. +
Fputchar   Writes a character to a specified file. +
Fread      Reads from a specified file. +
Freadlink  Finds the contents of a symbolic link. +
Frename    Renames a file. +
Fseek      Sets a pointer to a given position of a file. +
Fseek64    Sets a pointer to a given 64-bit position of a file. +
Fselect    Selects file descriptors. +
Fsetdta    Modifies disk transfer address in memory. +
Fsfirst    Finds first entry in a directory. +
Fsnext     Finds next entry in a directory. +
Fsymlink   Creates symbolic link to a file. +
Fstat64    Obtains extended file attributes. +
Fsync      Synchronize a file's in-core state with storage device. +
Fwrite     Writes to a file. +
Fxattr     Obtains extended file attributes. + +
+ +

See also: Directory functions   XBIOS drive functions   Test for pipes +

+

5.9.1 Fattrib

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »File attributes« - Read or modify file attributes. +
  +
Opcode: 67 +
  +
Syntax: int16_t Fattrib ( const int8_t *filename, int16_t wflag, +int16_t attrib ); +
  +
Description: The GEMDOS routine Fattrib reads or sets the attributes of a +GEMDOS file. +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
filename Filename of the relevant file +
wflag + + + + + + +
0 = Read attributes +
1 = Set attributes + +
+ + + +
attrib File attribute flags: + + + + + + + + + + + + + + + + + + +
Bit 0: File is write-protected +
Bit 1: File is hidden +
Bit 2: System file +
Bit 3: Volume label (diskette name) +
Bit 4: Directory +
Bit 5: Archive bit + +
+ + +
+ +
Note: If possible, programs should make use of the +Fxattr and Fchmod routines, as these are more efficient than Fattrib. +
  +
Return value: The function returns the following results: +
  + + + + + + + + + + + + +
EACCDN : Access denied. +
EFILNF : File not found. +
EPTHNF : Directory not found. +
Otherwise: The current file attributes. + +
+ +
Availability: All GEMDOS versions. +
  +
Group: File functions +
  +
See also: Binding   Fxattr +
  + +
+ +

5.9.1.1 Bindings for Fattrib

+ + + + + + + + + +
C: int16_t Fattrib ( const int8_t *filename, int16_t wflag, +int16_t attrib ); +
  +
Assembler: +
  +
move.w    attrib,-(sp) ; Offset 8
+move.w    wflag,-(sp)  ; Offset 6
+pea       filename     ; Offset 2
+move.w    #67,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS
+lea       $A(sp),sp    ; correct stack
+
+
GFA-Basic Fehler%=Gemdos(&H43,L:filename%,W:wflag%,W:attrib%) +
  + +
+ +

5.9.2 Fchdir

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Set directory« - Set the current directory from a file +descriptor. +
  +
Opcode: 385 +
  +
Syntax: int32_t Fchdir ( int16_t handle ); +
  +
Description: The GEMDOS routine Fchdir sets the current directory for the +current process from a directory with the ID handle. +
  +
Return value: Returns E_OK on success or a negative GEMDOS error code +otherwise. +
  +
Availability: Available as of FreeMiNT version 1.17. +
  +
Group: File functions +
  + +
+ +

5.9.2.1 Bindings for Fchdir

+ + + + + + + + + +
C: int32_t Fchdir ( int16_t handle ); +
  +
Assembler: +
  +
move.w    handle,-(sp) ; Offset 2
+move.w    #385,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #4,sp        ; Correct stack
+
+
GFA-Basic Error%=Gemdos(&H181,W:handle%) +
  + +
+ +

5.9.3 Fchmod

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Fchmod« - Set permissions for file access. +
  +
Opcode: 306 +
  +
Syntax: int32_t Fchmod ( int8_t *name, int16_t mode ); +
  +
Description: The function alters the access rights for the GEMDOS file +name. The parameter mode contains the new access +rights: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Access bymodeMeaning
Owner of the0400Read permission
file0200Write permission
 0100Execution permission
   
Group of the0040Read permission
file0020Write permission
 0010Execution permission
   
All other0004Read permission
users0002Write permission
 0001Execution permission
+
+ +
For executable files the following applies: +
  + + + + + + + + + + + + + + + + + + +
mode Meaning +
    +
04000 Set effective UID of the process to the UID of whatever +executes this process +
02000 Set effective GID of the process to the GID of whatever +executes this process +
01000 The file is a directory. +
Only the owner of the file or directory (or root) can delete files +in this directory. +
???? The file is a shared-text program. +
The program is not removed from memory after it has been executed +and therefore need not be reloaded for repeat use. + +
+ +
Note: Not all file-systems need to support all the +options. Unsupported access rights are then ignored. Execution rights +for a directory mean that one may search in this directory for a name +or name component. +
  +
Return value: The function can return the following results: +
  + + + + + + + + + + + + +
E_OK   : No error has arisen +
EFILNF : File not found +
EPTHNF : Path to file not found +
EACCDN : The EUID of the called process differs from the UID of the file +owner and is also not that of the kernel (0) + +
+ +
Availability: Available when a 'MiNT' cookie with a version of at least 0.90 +exists. +
  +
Group: File functions +
  +
See also: Binding   Fattrib   Fxattr   XFS-concept in MagiC +
  + +
+ +

5.9.3.1 Bindings for Fchmod

+ + + + + + +
C: int32_t Fchmod ( int8_t *name, int16_t mode ); +
  +
Assembler: +
  +
move.w    mode,-(sp)   ; Offset 6
+pea       name         ; Offset 2
+move.w    #306,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #8,sp        ; correct stack
+
+ +
+ +

5.9.4 Fchown

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Fchown« - Alter owner/group ID. +
  +
Opcode: 305 +
  +
Syntax: int32_t Fchown ( int8_t *name, int16_t uid, int16_t gid ); +
  +
Description: The function alters the user/group ID of the file name, +which control the access rights of the file. +
  +
This call can only be issued by a process that has an effective +user identifier (EUID) which is 0, or which corresponds to the UID of +the file; in the latter case the new UID must correspond to the old +one, and in addition the calling process must be a member of the group +with the group number GID. +
  +
Return value: The function can return the following results: +
  + + + + + + + + + +
E_OK : No error has arisen +
EINVFN : The file-system does not support the concept of user/group IDs +(example TOS-FS) +
EACCDN : The EUID of the calling process differs from the UID of the +file-owner and is also non-zero + +
+ +
Availability: Available when a 'MiNT' cookie with a version of at least 0.90 +exists. +
  +
Group: File functions +
  +
See also: Binding   Fchown16   Fchmod   Fxattr   XFS-concept in MagiC +
  + +
+ +

5.9.4.1 Bindings for Fchown

+ + + + + + +
C: int32_t Fchown ( int8_t *name, int16_t uid, int16_t gid ); +
  +
Assembler: +
  +
move.w    gid,-(sp)    ; Offset 8
+move.w    uid,-(sp)    ; Offset 6
+pea       name         ; Offset 2
+move.w    #305,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+lea       $A(sp),sp    ; Correct stack
+
+ +
+ +

5.9.5 Fchown16

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Fchown16« - Alter owner/group ID. +
  +
Opcode: 384 +
  +
Syntax: int32_t Fchown16 ( int8_t *name, int16_t uid, int16_t gid, +int16_t flag ); +
  +
Description: The function alters the user/group ID of the file name, +which control the access rights of the file. +
  +
The parameter flag specifies how symbolic links are to +be treated. The following apply: +
  + + + + + + + + + + + + +
flag Meaning +
    +
0 The ownership of the symbolic link itself is changed. This is +equivalent to calling Fchown(name, uid, gid). +
1 Symbolic links are followed to the source file and ownership +for this file is changed. + +
+ +
This call can only be issued by a process that has an effective +user identifier (EUID) which is 0, or which corresponds to the UID of +the file; in the latter case the new UID must correspond to the old +one, and in addition the calling process must be a member of the group +with the group number GID. +
  +
Return value: The function can return the following results: +
  + + + + + + + + + +
E_OK : No error has arisen +
EINVFN : The file-system does not support the concept of user/group IDs +(example TOS-FS) +
EACCDN : The EUID of the calling process differs from the UID of the +file-owner and is also non-zero + +
+ +
Availability: Available when a 'MiNT' cookie with a version of at least +1.16.0 exists. +
  +
Group: File functions +
  +
See also: Binding   Fchown   Fchmod   Fxattr   XFS-concept in MagiC +
  + +
+ +

5.9.5.1 Bindings for Fchown16

+ + + + + + +
C: int32_t Fchown16 ( int8_t *name, int16_t uid, int16_t gid, +int16_t flag ); +
  +
Assembler: +
  +
move.w    flag,-(sp)   ; Offset 10
+move.w    gid,-(sp)    ; Offset 8
+move.w    uid,-(sp)    ; Offset 6
+pea       name         ; Offset 2
+move.w    #384,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+lea       12(sp),sp    ; Correct stack
+
+ +
+ +

5.9.6 Fclose

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »File close« - Close a specified file. +
  +
Opcode: 62 +
  +
Syntax: int16_t Fclose ( int16_t handle ); +
  +
Description: The GEMDOS routine Fclose closes a file with the file ID +handle. +
  +
Note: In a network the active locking is lifted. During +closing of standard channels, from GEMDOS Version 0.15 onwards the +original channel will be reinstated. +
  +
Return value: The function returns the following results: +
  + + + + + + +
E_OK No error has arisen +
EBADF Wrong file ID + +
+ +
Availability: All GEMDOS versions. +
  +
Group: File functions +
  +
See also: Binding   Fopen +
  + +
+ +

5.9.6.1 Bindings for Fclose

+ + + + + + + + + +
C: int16_t Fclose ( int16_t handle ); +
  +
Assembler: +
  +
move.w    handle,-(sp)  ; Offset 2
+move.w    #62,-(sp)     ; Offset 0
+trap      #1            ; GEMDOS
+addq.l    #4,sp         ; Correct stack
+
+
GFA-Basic Fehler%=Gemdos(&H3E,W:handle%) +
  + +
+ +

5.9.7 Fcntl

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Fcntl« - Perform command operations on a given file. +
  +
Opcode: 260 +
  +
Syntax: int32_t Fcntl ( int16_t fh, int32_t arg, int16_t cmd ); +
  +
Description: The function performs various command operations on the file +with the handle fh. The parameter cmd describes the +desired operation, and can assume the following values. (arg +here depends on the selected command): +
  + + +
F_DUPFD (0): +
Duplicates the specified file handle. The following applies for +the new interval: arg <= Handle < 32. If no free handles +exist in the specified segment, the error-message ENHNDL will be +returned. A call of Fdup (handle) is therefore equivalent to Fcntl +(handle, 6L, F_DUPFD). +
  + +
F_GETFD (1): +
This command returns the non-inheritance flag for the handle +fh. The flag is 0 when child processes started with Pexec are +to inherit the file handle, otherwise it has the value 1 and the +parameter arg is ignored. +
  + +
F_SETFD (2): +
This command sets the non-inheritance flag for the handle +fh. arg specifies if child processes started with +Pexec will inherit the file handle; a value of 1 indicates they will +not, a value of 0 that they will. The default value for the flag is 0 +for the standard GEMDOS handles in the region 0...5 and 1 for all +others, i.e. non-standard handles. +
  + +
F_GETFL (3): +
This command returns the file descriptor flags that can be altered +by the user. We are here dealing with the parameter mode +specified at Fopen, as long as this has not been altered by another +call of Fcntl. arg is ignored. +
  + +
F_SETFL (4): +
This command sets the file descriptor flags that can be altered by +the user to arg (the other bits are ignored, and should be set +to the value 0). It is not possible to alter the read/write mode or +the modes for file sharing. +
  + +
F_GETLK (5): +
The parameter arg is a pointer to an flock structure, in which +information about file locks are stored. If a lock exists then it will +be copied into the structure. During this the element l_pid +will hold the PID of the locking process. If no lock exists, then the +element l_type will be set to the value F_UNLCK. For the case +that the lock is held by another computer in a network, the element +l_pid is set to a value defined by the NFS (Network +File System). For this value, 0x1000 <= +l_pid <= 0xffff. One should note that normal PID's have a +value smaller than 1000. +
  + +
F_SETLK (6): +
This command sets (l_type = F_RDLCK or F_WRLCK) or lifts +(l_type = F_UNLCK) an advisory lock on the specified file. If +this is a FIFO queue +(First-In-First-Out), the whole file +must be processed at the same time. For the case when the lock +conflicts with locks set by other processes, the value ELOCKED will be +returned. If one tries to lift a non-existent lock, the value ENSLOCK +will be returned. One should note that read-locks may overlap, but +write-locks may not. If a locked file is closed, or the corresponding +process terminates, then all set locks will be lifted automatically +(i.e. reset). +
  + +
F_SETLKW (7): +
Similar to F_SETLK, with the difference that if the lock conflicts +with those from other processes, then ELOCKED is not returned but the +locked process is suspended until the locking from the other process +is lifted. +
  + +
FSTAT (0x4600): +
Gets the extended attributes of a file. The parameter arg +returns a pointer to an XATTR structure that is filled in with the +file's extended attributes, as if an Fxattr call had been made. This +command is supported in MagiC as of Version 3.0. +
  + +
FIONREAD (0x4601): +
In the parameter arg a pointer to a LONG value is returned +which shows the number of bytes that may be read currently from a +specified file handle without causing the process to block (wait for +more input). The returned value is not necessarily correct, as the +exact amount can only be estimated in some cases. The command is +supported in MagiC as of Version 3.0. +
  + +
FIONWRITE (0x4602): +
Similar to FIONREAD, only here the number of bytes that may be +written at present is returned. The command is supported in MagiC as +of Version 3.0. +
  + +
FUTIME (0x4603): +
No information available at present. +
  + +
FTRUNCATE (0x4604): +
The parameter arg is a pointer to a LONG value that +contains the new length of the file to be truncated. The command is +supported in MagiC as of Version 3.0. +
  + +
FIOEXECPT (0x4605): +
In the parameter arg a pointer to a LONG value is returned +which specifies whether the file is in an exception state (1) or not +(0). +
  + +
The following commands are to be applied to all terminal +devices such as the console or a pseudo-terminal: +
  + +
TIOCGETP (0x5400): +
This command returns via the parameter arg a pointer to a +sgttyb structure, in which the parameters of the terminal are defined. +
  + +
TIOCSETN (0x5401): +
With this command one can set a new sgttyb structure which sets +the parameters of the terminal. You should first get the terminal +control parameters, modify what you wish to change, and then set them +with this call. +
  + +
TIOCGETC (0x5402): +
This command returns via the parameter arg a pointer to a +tchars structure in which the terminal control characters are defined. +
  + +
TIOCSETC (0x5403): +
With this command new terminal control characters can be set. For +this one passes a pointer in arg to a tchars structure in +which the control characters are defined. If a character is set to 0 +then the corresponding function will be disabled. +
  + +
TIOCGLTC (0x5404): +
This command returns via the parameter arg a pointer to a +ltchars structure in which extended terminal control characters are +defined. +
  + +
TIOCSLTC (0x5405): +
With this command one can set new extended terminal control +characters. To do this, one passes in arg a pointer to a +ltchars structure in which the control characters are defined. If a +character is set to 0 then the corresponding function will be +disabled. +
  + +
TIOCGPGRP (0x5406): +
This command returns via the parameter arg a pointer to +the process group ID of the terminal. +
  + +
TIOCSPGRP (0x5407): +
With this command one can set the process group ID of the +terminal. To do this, one passes in the parameter arg a +pointer to the corresponding process group. If processes from other +groups should attempt to access this terminal (read or write) then +they will be sent job control signals (SIGTSTP etc.). +
  + +
TIOCFLUSH (0x5408): +
With this command one can specify the type of flushing. For this, +one passes a pointer in the parameter arg to a LONG value that +describes the desired type. The following apply: +
  + + + + + + + + + + + + + + + +
Value Meaning +
    +
0 Flush input and output +
Bit 0 set Flush input +
Bit 1 set Flush output + +
+ + +
TIOCSTOP (0x5409): +
This command interrupts the output to the terminal (similar to +flow control with Control-S). The parameter arg is ignored in +this case. +
  + +
TIOCSTART (0x540a): +
This command restarts output to the terminal again (similar to +flow control with Control-Q). The parameter arg is ignored in +this case. +
  + +
TIOCGWINSZ (0x540b): +
With this command one can inquire the size of a text window. For +this a pointer to a winsize structure is returned via the parameter +arg. If an element of this structure has the value 0, then it +means that the corresponding value is unknown. +
  + +
TIOCSWINSZ (0x540c): +
With this command one can set the window size. For this a pointer +to a winsize structure is passed via the parameter arg which +contains the required information. In this connection one should note +that though the kernel handles the call, it leaves its execution to +window managers. These also send the signal SIGWINCH if necessary. +
  + +
TIOCGXKEY (0x540d): +
This command returns the current definition of a system key +(function, cursor etc.). For this a pointer to the xkey structure is +passed in the parameter arg. The element xk_num of the +structure has to be filled with the desired key: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
xk_numKey
0-9F1-F10
10-19F11-F20 (reached via Shift)
20Cursor up
21Cursor down
22Cursor to right
23Cursor to left
24Help
25Undo
26Insert
27Clr/Home
28Shift + cursor up
29Shift + cursor down
30Shift + cursor to right
31Shift + cursor to left
+
+ +
The NULL-terminated string associated with the key (the +convention of the C language applies) is returned via the element +xk_def. +
  + +
TIOCSXKEY (0x540e): +
With this command one can set the current definition of a system +key (function or cursor etc.). For this a pointer to the xkey +structure is passed in the parameter arg, in which the +elements xk_num and xk_def must have been set already. After the +execution of the command, Fread returns the text string (instead of +ASCII-0) specified in xk_def. This translation only happens, however, +if the program has been set into the MiNT domain with Pdomain and if +the terminal is reading characters using Fread. As the string passed +in xk_def has to be NULL-terminated, one can pass a maximum of 7 +characters in this way. +
  + +
TIOCIBAUD (0x5412): +
With this command one can set the Baud rate for input to the +terminal. For this a pointer is passed via the parameter arg +to a LONG value that specifies the Baud rate. +
  + +
TIOCOBAUD (0x5413): +
With this command one can set the Baud rate for output from the +terminal. For this a pointer is passed via the parameter arg +to a LONG value that specifies the Baud rate. +
  + +
TIOCCBRK (0x5414): +
This command clears bit 3 of the TSR register (the break +condition) of the MFP68901 peripheral component. The parameter +arg is ignored. +
  + +
TIOCSBRK (0x5415): +
This command sets bit 3 of the TSR register of the MFP68901 +peripheral component. This causes a break signal to be sent as soon as +the transmit register is empty. The parameter arg is ignored. +
  + +
TIOCGFLAGS (0x5416): +
This command returns in the lower 16 bits of the LONG pointed to +by the parameter arg the terminal control flags (i.e. the +current stop-bit and data-bit configuration). Valid mask values for +arg are: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MaskMeaning
0x00011 stop-bit
0x00021.5 stop-bits
0x00032 stop-bits
0x00008 data-bits
0x00047 data-bits
0x00086 data-bits
0x000C5 data-bits
+
+ + +
TIOCSFLAGS (0x5417): +
This command sets new terminal control flags that are passed via +the parameter arg. +
  + +
TIOCOUTQ (0x5418): +
This command returns in arg a pointer to a LONG value in +which the number of bytes in the output buffer is stored. +
  + +
TIOCSETP (0x5419): +
Functions in a similar way to TIOCSETN, but with the difference +that (if the terminal supports TIOCOUTQ) the function only returns +when the output buffer is empty. +
  + +
TCURSOFF (0x6300): +
This command switches off the cursor of the terminal. The +parameter arg is ignored. +
  + +
TCURSON (0x6301): +
This command switches on the cursor of the terminal. The parameter +arg is ignored. +
  + +
TCURSBLINK (0x6302): +
This command switches on blinking of the terminal's cursor. The +blink rate can be set with TCURSSRATE. The parameter arg is +ignored. +
  + +
TCURSSTEADY (0x6303): +
This command switches off blinking of the terminal's cursor again. +The parameter arg is ignored. +
  + +
TCURSSRATE (0x6304): +
This command sets the blink rate of the terminal's cursor. For +this a pointer to a WORD value is passed in arg which +specifies after how many vertical blanks the cursor is to be inverted. +
  + +
TCURSGRATE (0x6305): +
This command obtains the cursor blink rate of the terminal. This +is returned in a WORD value to which arg points. +
  + +
The following commands are applicable only for processes +(opened as files). To open your own process as a file, you have to +specify the path for Fopen as 'U:\PROC\processname.-1'. Here the +extension -1 selects your own, and -2 the parent process. +
  + +
PBASEADDR (0x5002): +
In the parameter arg a pointer to the address of the +GEMDOS basepage of the process opened as a file is returned. The command +is supported in MagiC from Version 3.0 onwards. +
  + +
PPROCADDR (0x5001): +
In the parameter arg a pointer to the address of the PCB +(Process Control Block) is returned. If memory +protection is enabled, this memory cannot be read directly, use +Fseek/Fread on the open process file. This is to prevent manipulation +of process' rgid/ruid/egid/euid fields to e.g. become the root. +
  + +
PCTXTSIZE (0x5003): +
In the parameter arg a pointer to a LONG value is returned +in which the length of the process context structure is specified. Two +of these structures lie in memory before the PCB, whose address may be +inquired with PPROCADDR. The first structure is responsible for the +current process context, while the second contains the stored context +of the last system call. +
  + +
PSETFLAGS (0x5004): +
This command sets the program flags (corresponding to those in the +program header. For this a pointer to a LONG value is passed in arg +whose lower 16 bits represent the program flags. +
  + +
PGETFLAGS (0x5005): +
This command obtains the current program flags. For this a pointer to +these flags is returned via the parameter arg. +
  + +
PTRACESFLAGS (0x5006): +
This command sets the process trace flags. A pointer to a WORD +value is passed in the parameter arg that represents the +flags: +
  + + + + + + + + + + + + +
P_ENABLE = 1 (Enable tracing) +
P_DOS = 2 (Trace GEMDOS calls) +
P_BIOS = 4 (Trace BIOS calls) +
P_XBIOS = 8 (Trace XBIOS calls) + +
+ + +
PTRACEGFLAGS (0x5007): +
This command obtains the current process trace flags. A pointer to +these flags is returned via the parameter arg. +
  +
PTRACEGO (0x5008): (from MC-68020 processor on) +
PTRACEFLOW (0x5009): +
PTRACESTEP (0x500a): +
PTRACE11 (0x500b): +
These functions should in future enable tracing of processes. The +process to be traced must be in the 'suspended' state for this; it +will be reawakened by the trace function. These functions are however +not yet implemented at present. +
  + +
PLOADINFO (0x500c): +
arg is a pointer to the ploadinfo structure. +fnamelen must contain the length of fname buffer in +bytes and both cmdlin and fname must be preallocated +(the former to at least 128 bytes and the latter to at least +fnamelen bytes). Processes' command line will be copied into +cmdlin. The complete path and filename of the process' parent +will be copied into fname. If the buffer is too short the call +will return EBADARG. +
  + +
PFSTAT (0x500d): +
This command corresponds to FSTAT. It obtains the extended +attributes of the program file belonging to the process. +
  + +
The following commands are applicable only to files that +represent shared memory: +
  + +
SHMGETBLK (0x4d00): +
This command returns the address of a memory block allocated with +SHMSETBLK (or a NULL-pointer in case of error). For the sake of +compatibility the parameter arg must be set to the value 0. +Note: Different processes may see the memory block at +different positions in their address space. For this reason a shared memory +block may not contain absolute pointers to data! The command is +supported in MagiC as of Version 3.0. +
  + +
SHMSETBLK (0x4d01): +
A pointer is passed in the parameter arg to a memory block +that was earlier allocated with Malloc/Mxalloc. The memory is then +offered for sharing under the filename of the file with the handle +fh. For this the file must be created in the subdirectory +U:\SHM. The block is marked in such a way that it will not be released +at the termination of the process. The length will be obtained and +used both for the opened file as well as entered in the directory. +Invalid block addresses lead to the error-code EIMBA or to a bus- or +address-error. The command is supported in MagiC as of Version 3.0. +
  + + +
The following commands are of interest in connection with +CD-ROM's: +
  + +
CDROMREADOFFSET (0x4300): +
This command obtains the block number of the first sector of the +last session of a multi-session CD. The parameter arg +contains this block number after the call. +
  + +
CDROMPAUSE (0x4301): +
This command causes a CD-ROM to enter the pause state when +playing an audio CD. +
  + +
CDROMRESUME (0x4302): +
This command causes a CD-ROM to resume playing of an audio +CD (pause is rescinded). +
  + +
CDROMPLAYMSF (0x4303): +
This command starts audio playback. The parameter arg is a +pointer to a cdrom_msf structure, in which the start and end times are +to be entered in MSF notation. +
  + +
CDROMPLAYTRKIND (0x4304): +
This command starts audio playback. The parameter arg is a +pointer to a cdrom_ti structure in which the start and end positions +are to be entered in track/index notation. In most audio CD's from +the POP world the tracks are not subdivided any further. But many +classical CD's also have finer markings within tracks as indices. +Warning: Not every CD-ROM can access directly indices +other than 1! +
  + +
CDROMREADTOCHDR (0x4305): +
This command allows one to obtain information about the structure +of a CD. The parameter arg is a pointer to a cdrom_tochdr +structure in which the first and last track of the CD are entered. +
  + +
CDROMREADTOCENTRY (0x4306): +
This command allows one to obtain further information about the +structure of a CD. The parameter arg is a pointer to a +cdrom_tocentry structure in which the desired information is entered. +
  + +
CDROMSTOP (0x4307): +
This command stops the corresponding drive. +
  + +
CDROMSTART (0x4308): +
This command starts the corresponding drive, and may also close +the drawer. +
  + +
CDROMEJECT (0x4309): +
This command serves for opening the drawer of the corresponding +drive. +
  + +
CDROMVOLCTRL (0x430a): +
This command permits altering the volume and channel assignments +of the individual audio channels. The parameter arg is a +pointer to a cdrom_volctrl structure. The command is compatible to the +corresponding SunOS call. Warning: Altering the volume is not +possible with all devices! +
  + +
CDROMSUBCHNL (0x430b): +
This command obtains the current position data, as well as the +audio state. The parameter arg is a pointer to a cdrom_subchnl +structure. +
  + +
CDROMREADMODE2 (0x430c): +
This command enables reading of Mode-2 sectors. Such sectors are +used by XA-CDs (e.g.: Photo-CDs without error correction or Video-CDs) +and contain 2336 bytes. The parameter arg is a pointer to a +cdrom_read structure. Warning: Not all devices can read these +sector types, and not all drivers offer this function. +
  + +
CDROMREADMODE1 (0x430d): +
This command enables reading of Mode-1 sectors. Such sectors have +a size of 2048 bytes and are used on normal CD-ROMs. The parameter +arg is a pointer to a cdrom_read structure. Warning: +Not all devices can read these sector types, and not all drivers offer +this function. +
  + +
CDROMPREVENTREMOVAL (0x430e): +
This command blocks the eject function of the corresponding +CD-ROM. This can be useful, for instance, if the device is +positioned in a public place and one wants to prevent theft of the +CD. +
  + +
CDROMALLOWRMOVAL (0x430f): +
This command releases the eject function of the corresponding +CD-ROM once more. +
  + +
CDROMAUDIOCTRL (0x4310): +
This command permits altering the volume and channel assignments +of the individual audio channels. The parameter arg is a +pointer to a cdrom_audioctrl structure. By setting the element +set of this structure to the value 0, one can inquire the +current settings. Warning: Altering the volume is not possible +with all devices! +
  + +
CDROMREADDA (0x4311): +
This command permits the reading of Digital Audio (DA) sectors. +Such sectors have a size of 2352 bytes, and contain per sector 588 +samples in 16-bit stereo-PCM format. The parameter arg is a +pointer to a cdrom_read structure. Warning: Not all devices +can read these sector types, and not all drivers offer this function. +
  + +
CDROMGETMCN (0x4313): +
This command obtains the Media Catalog Number, which can be used +theoretically to identify a CD easily. Unfortunately this +information is present in only very few CDs. The parameter arg +is a pointer to a cdrom_mcn structure. +
  + +
CDROMGETTISRC (0x4314): +
This command obtains the Track International Standard Recording +Code, which should represent unique identifiers for individual tracks. +The parameter arg is a pointer to a cdrom_tisrc structure. +
  +
Return value: The function can return the following results: +
  + + + + + + + + + +
>= 0 : No error occurred (deviations see above). +
EBADF : Invalid file handle. +
EINVFN : Command cannot be executed with the handle fh. + +
+ +
Availability: As of the first in MultiTOS integrated MiNT version 1.04, and +MagiC as of Version 3.0. +
  +
Group: File functions. +
  +
See also: Binding   Fdup   Flock   Fopen   Fxattr   Pgetpgrp   Psetpgrp   +Metaioctl   CD-ROM definitions +
  + +
+ +

5.9.7.1 Bindings for Fcntl

+ + + + + + +
C: int32_t Fcntl ( int16_t fh, int32_t arg, int16_t cmd ); +
  +
Assembler: +
  +
move.w    cmd,-(sp)    ; Offset 8
+move.l    arg,-(sp)    ; Offset 4
+move.w    fh,-(sp)     ; Offset 2
+move.w    #260,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+lea       $A(sp),sp    ; Correct stack
+
+ +
+ +

5.9.8 Fcreate

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »File create« - Create a file. +
  +
Opcode: 60 +
  +
Syntax: int16_t Fcreate ( const int8_t *fname, int16_t attr ); +
  +
Description: The GEMDOS routine Fcreate creates a new file, or truncates an +existing one, with a given name and attributes. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
fname Pointer to the filename. +
attr File attributes: + + + + + + + + + + + + + + + +
Bit 0: File is write-protected +
Bit 1: File is hidden +
Bit 2: File is a system file +
Bit 3: Volume label (diskette name) +
Bit 5: Archive bit + +
+ + +
+ +
Note: In a network, the creation of a file sets the +exclusivity. Whether the underlying GEMDOS is network capable can be +established via the cookie _FLK. +
  +
Note about MagiC: If bit 3 in attr is set, then +the XFS function xfs_wlabel will be called. If this function can be +executed without an error, then the value 0x0000fffc will be returned. +This corresponds to a handle for the file NUL: or U:\DEV\NULL. +However, this feature is only present for reasons of compatibility; as +of MagiC 3, it is better to fall back on the function Dwritelabel. +
  +
The specified attributes exist only under DOS file-systems and +are ignored or emulated by other file-systems. With the Macintosh +file-system (HFS), for instance, only bit 0 of attr is +supported. +
  +
Incidentally, symbolic links are dereferenced by this function, +so that if the file already exists as a symbolic link, the file +referenced from this link will be set to zero length. +
  +
Return value: The function returns the following results: +
  + + + + + + + + + + + + +
EPTHNF : Access path is incorrect. +
ENHNDL : No more file handles left. +
EACCDN : Write access denied. +
Otherwise : ID of the file. + +
+ +
Availability: All GEMDOS versions. However, GEMDOS Version 0.13 creating a +read-only file returns a handle that is of not much use. GEMDOS +versions below 0.15 wrongly allow more than one volume label per disk. +
  +
Group: File functions +
  +
See also: Binding   Fopen   XFS-concept in MagiC +
  + +
+ +

5.9.8.1 Bindings for Fcreate

+ + + + + + + + + +
C: int16_t Fcreate ( const int8_t *fname, int16_t attr ); +
  +
Assembler: +
  +
move.w    attr,-(sp)   ; Offset 6
+pea       fname        ; Offset 2
+move.w    #60,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #8,sp        ; Correct stack
+
+
GFA-Basic Handle%=Gemos(&H3c,L:fname%,W:attr) +
  + +
+ +

5.9.9 Fdatime

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »File date and time« - Obtain or set creation date and time +of a file. +
  +
Opcode: 87 +
  +
Syntax: void Fdatime ( DOSTIME *timeptr, int16_t handle, int16_t wflag +); +
  +
Description: The GEMDOS routine Fdatime reads or sets the date and time of +creation of a file. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
timeptr Pointer to date/time structure +
handle File ID +
wflag + + + + + + +
0 = Obtain values +
1 = Set values + +
+ + +
+ +
Note: Due to some errors in older versions of the +GEMDOS, the function should be applied in the following way: +
  +
    +
  • Open file +
  • +
  • Call Fdatime +
  • +
  • Close file +
  • +
+ +
Return value: The function returns no direct result. +
  +
Availability: All GEMDOS versions. +
  +
Group: File functions +
  +
See also: Binding   Tgettime   Tsettime +
  + +
+ +

5.9.9.1 Bindings for Fdatime

+ + + + + + + + + +
C: void Fdatime ( DOSTIME *timeptr, int16_t handle, int16_t wflag +); +
  +
Assembler: +
  +
move.w    wflag,-(sp)   ; Offset 8
+move.w    handle,-(sp)  ; Offset 6
+pea       timeptr       ; Offset 2
+move.w    #87,-(sp)     ; Offset 0
+trap      #1            ; GEMDOS
+lea       $A(sp),sp     ; Correct stack
+
+
GFA-Basic Fehler%=Gemdos(&H57,L:timeptr%,W:handle%,W:wflag%) +
  + +
+ +

5.9.10 Fdelete

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »File delete« - Delete a file. +
  +
Opcode: 65 +
  +
Syntax: int16_t Fdelete ( const int8_t *fname ); +
  +
Description: The GEMDOS routine Fdelete deletes the file designated by +fname. +
  +
Note: The function should not be applied to opened +files. As of MagiC 4, deletion also works for files with the 'Hidden' +and 'System' attributes. In MagiC, furthermore, no symbolic +links will be dereferenced, i.e. the link will be deleted and +not the file or the folder to which the link points. +
  +
Return value: The function returns the following results: +
  + + + + + + + + + +
E_OK No error has arisen +
EFILNF File not found +
EACCDN Access denied + +
+ +
Availability: All GEMDOS versions. +
  +
Group: File functions +
  +
See also: Binding   Fcreate +
  + +
+ +

5.9.10.1 Bindings for Fdelete

+ + + + + + + + + +
C: int16_t Fdelete ( const int8_t *fname ); +
  +
Assembler: +
  +
pea       fname        ; Offset 2
+move.w    #65,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #6,sp        ; Correct stack
+
+
GFA-Basic Fehler%=Gemdos(&H41,L:fname%) +
  + +
+ +

5.9.11 Fdirfd

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Fdirfd« - Return a file descriptor from a directory handle. +
  +
Opcode: 387 (0x0183) +
  +
Syntax: int16_t Fdirfd ( int32_t handle ); +
  +
Description: The function Fdirfd returns a file descriptor from the +specified directory handle. +
  +
Return value: The function returns a file handle if successful, or a negative +error-message. +
  +
Availability: Available as of FreeMiNT version 1.17. +
  +
Group: File functions +
  +
See also: Binding   Dopendir   Dclosedir   Dreaddir   Drewinddir   +Ffdopendir   Pdomain +
  + +
+ +

5.9.11.1 Bindings for Fdirfd

+ + + + + + +
C: int16_t Fdirfd ( int32_t handle ); +
  +
Assembler: +
  +
move.l    handle,-(sp) ; Offset 2
+move.w    #387,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

5.9.12 Fdup

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »File duplicate« - Duplicate a file handle. +
  +
Opcode: 69 +
  +
Syntax: int16_t Fdup ( int16_t handle ); +
  +
Description: The GEMDOS routine Fdup duplicates a standard file handle (0-5) +and assigns it a new handle (>6) for a standard channel. The +following apply: +
  + + + + + + + + + + + + + + + + + + +
handle Meaning +
    +
0 Keyboard (stdin:) +
1 Screen (stdout:) +
2 Serial port (stdaux:) +
3 Parallel port (stdprn:) + +
+ +
Note: In all known GEMDOS versions (up to and including +0.19) errors occur if, after an Fdup, a program is started with Pexec. +As of MagiC 4, one can also use this function to the device files -1, +-2, -3 (system global) and -4 (NULL device). +
  +
Return value: The function returns the following results: +
  + + + + + + + + + +
ENHNDL : No more handles available. +
EBADF : Incorrect file handle. +
Otherwise : The desired new handle. + +
+ +
Availability: All GEMDOS versions. +
  +
Group: File functions +
  +
See also: Binding   Fforce +
  + +
+ +

5.9.12.1 Bindings for Fdup

+ + + + + + + + + +
C: int16_t Fdup ( int16_t handle ); +
  +
Assembler: +
  +
move.w    handle,-(sp)  ; Offset 2
+move.w    #69,-(sp)     ; Offset 0
+trap      #1            ; GEMDOS
+addq.l    #4,sp         ; Correct stack
+
+
GFA-Basic Phys_channel%=Gemdos(&H45,W:handle%) +
  + +
+ +

5.9.13 Ffchmod

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Ffchmod« - Change access permissions for an open file. +
  +
Opcode: 258 (0x0102) +
  +
Syntax: int32_t Ffchmod ( int16_t fd, int16_t mode); +
  +
Description: See 'Name' above. +
  +
Return value: Returns E_OK on success or a negative GEMDOS error-code +otherwise. +
  +
Availability: Available as of FreeMiNT version 1.15.2 +
  +
Group: File functions +
  +
See also: Binding   Ffchown   Fchmod +
  + +
+ +

5.9.13.1 Bindings for Ffchmod

+ + + + + + +
C: int32_t Ffchmod ( int16_t fd, int16_t mode); +
  +
Assembler: +
  +
move.w    mode,-(sp)   ; Offset 4
+move.w    fd,-(sp)     ; Offset 2
+move.w    #258,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

5.9.14 Ffchown

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Ffchown« - Changes ownership of an open file to uid and gid +respectively. +
  +
Opcode: 257 (0x0101) +
  +
Syntax: int32_t Ffchown ( int16_t fd, int16_t uid, int16_t gid ); +
  +
Description: This function changes ownership of an open file to uid +and gid respectively. +
  +
A non-privileged process can only change the ownership of a file +that is owned by this user to the effective group id of the process or +one of its supplementary groups. +
  +
Return value: Returns E_OK on success or a negative GEMDOS error code +otherwise. +
  +
Availability: Available as of FreeMiNT version 1.15.2 +
  +
Group: File functions +
  +
See also: Binding   Ffchmod   Fchown +
  + +
+ +

5.9.14.1 Bindings for Ffchown

+ + + + + + +
C: int32_t Ffchown ( int16_t fd, int16_t uid, int16_t gid ); +
  +
Assembler: +
  +
move.w    gid,-(sp)    ; Offset 6
+move.w    uid,-(sp)    ; Offset 4
+move.w    fd,-(sp)     ; Offset 2
+move.w    #257,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #8,sp        ; Correct stack
+
+ +
+ +

5.9.15 Ffdopendir

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Ffdopendir« - Duplicate a directory handle from a file +descriptor. +
  +
Opcode: 386 (0x0182) +
  +
Syntax: int32_t Ffdopendir ( int16_t fd ); +
  +
Description: The function Ffdopendir duplicates a directory handle of a +opened directory by specifying its file descriptor. The flag +of the directory with ID fd is inherited by the new directory +handle. +
  +
Return value: The function returns a 32-bit directory handle if successful; +this may also be negative, but in no case may contain the value 0xff +in the higher byte, through which it can be differentiated from +errors. +
  +
In case of error, the following returns are possible: +
  + + + + + + + + + +
EPTHNF : fd is not a valid directory +
EACCDN : The directory is not addressable by this program +
ENSMEM : The kernel cannot allocate memory for this operation + +
+ +
Availability: Available as of FreeMiNT version 1.17. +
  +
Group: File functions +
  +
See also: Binding   Dopendir   Dclosedir   Dreaddir   Drewinddir   FdirfdPdomain +
  + +
+ +

5.9.15.1 Bindings for Ffdopendir

+ + + + + + +
C: int32_t Ffdopendir ( int16_t fd ); +
  +
Assembler: +
  +
move.w    fd,-(sp)     ; Offset 2
+move.w    #386,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

5.9.16 Fforce

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »File force« - Redirect standard file. +
  +
Opcode: 70 +
  +
Syntax: int16_t Fforce ( int16_t stdh, int16_t nonstdh ); +
  +
Description: The GEMDOS routine Fforce redirects a standard channel to a +specific other channel created by the application. The following +apply: +
  + + + + + + +
stdh Channel to be redirected + + + + + + + + + + + + +
0 = Keyboard (stdin, con:) +
1 = Screen (stdout, con:) +
2 = Serial port (stdaux:) +
3 = Parallel port (stdprn:) + +
+ +
nonstdh Number of the replacement channel (as above) + +
+ +
Under MiNT further channels may be redirected: +
  + + + + + + + + + + + + + + + +
-1 = Refers to BIOS handle 2, redirects BIOS output +
-2 = Refers to BIOS handle 1, redirects BIOS output +
-3 = Refers to BIOS handle 0, redirects BIOS output +
-4 = GEMDOS handles -4 and -5 refer +
-5 = to MIDI input and output respectively. Redirecting them will +affect BIOS handle 3. + +
+ +
Note: As of MagiC 4, this function can be used to +redirect device files -1,-2 and -3 (system global). The NULL device +(-4) however may not be redirected. +
  +
To redirect, say, screen output to a printer one can use a +construct such as Fforce(1, Fdup(3)). +
  +
Return value: The function returns the following results: +
  + + + + + + +
E_OK : No error has arisen +
EBADF : Incorrect handle + +
+ +
Availability: All GEMDOS versions. +
  +
Group: File functions +
  +
Comment: This function is used often to redirect the input or output of +a child process. It should be used together with Fdup to restore the +standard handle before the process terminates. You should note also +that any file handle redirected to a standard handle (say con:) will +be closed when the child exits and should not be closed by the parent. +
  +
See also: Binding   Fdup   Directory U:\DEV +
  + +
+ +

5.9.16.1 Bindings for Fforce

+ + + + + + + + + +
C: int16_t Fforce ( int16_t stdh, int16_t nonstdh ); +
  +
Assembler: +
  +
move.w    nonstdh,-(sp)  ; Offset 4
+move.w    stdh,-(sp)     ; Offset 2
+move.w    #70,-(sp)      ; Offset 0
+trap      #1             ; GEMDOS
+addq.l    #6,sp          ; Correct stack
+
+
GFA-Basic Fehler%=Gemdos(&H46,W:stdh%,W:nonstdh%) +
  + +
+ +

5.9.17 Ffstat64

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Ffstat64« - Obtain extended file attributes of an open file. +
  +
Opcode: 349 (0x15d) +
  +
Syntax: int32_t Ffstat64 ( int16_t fd, STAT *stat ); +
  +
Description: The function Ffstat64 obtains the extended attributes of an +open file, and saves these in stat. +
  +
Note: This function is equivalent to a call of Fcntl +(mode F_STAT64). +
  +
Return value: The function can return the following results: +
  + + + + + + + + + +
E_OK : No error has arisen +
EFILNF : File not found +
EPTHNF : Path to file not found + +
+ +
Availability: This function is available as of FreeMiNT 1.16. +
  +
Group: File functions +
  +
See also: Binding   Fattrib   Fsnext   Fstat64   STAT +
  + +
+ +

5.9.17.1 Bindings for Ffstat64

+ + + + + + +
C: int32_t Ffstat64 ( int16_t fd, STAT *stat ); +
  +
Assembler: +
  +
pea       stat         ; Offset  4
+move.w    fd,-(sp)     ; Offset  2
+move.w    #349,-(sp)   ; Offset  0
+trap      #1           ; GEMDOS
+lea       8(sp),sp     ; Correct stack
+
+ +
+ +

5.9.18 Fgetchar

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Fgetchar« - Read a character from a file. +
  +
Opcode: 263 +
  +
Syntax: int32_t Fgetchar ( int16_t fh, int16_t mode ); +
  +
Description: The function reads a character from the file with the handle +fh. The parameter mode is only of interest when the +opened file is a (pseudo-)terminal. In that case the following values +apply: +
  + + + + + + + + + + + + + + + +
mode Meaning +
    +
0 Raw mode +
No evaluation of control characters +
1 Cooked mode +
Special control characters (Control-C, Control-Z) will be looked +for and interpreted if appropriate; the same applies for flow control +(Control-S, Control-Q) +
2 Echo mode +
Read characters will be output on the terminal + +
+ +
The ASCII value of the character read will be stored in the low +byte of the LONG returned by the function. For cases where the file is +a (pseudo-)terminal, the scancode and Shift status will be returned as +for Bconin. +
  +
The individual modes of mode can naturally also be +combined with an OR operation. +
  +
Warning: This function is optional, hence a call may be +answered with EINVFN. +
  +
Return value: The function can return the following results: +
  + + + + + + + + + +
>= 0 : No error, but the read character +
0xff1a : End-of-File (EOF) was recognized +
EBADF : Invalid file handle + +
+ +
Availability: As of the first in MultiTOS integrated MiNT version 1.04. +
  +
Group: File functions +
  +
See also: Binding   Bconin   Cconin   Cauxin   Fputchar   Fread +
  + +
+ +

5.9.18.1 Bindings for Fgetchar

+ + + + + + +
C: int32_t Fgetchar ( int16_t fh, int16_t mode ); +
  +
Assembler: +
  +
move.w    mode,-(sp)   ; Offset 4
+move.w    fh,-(sp)     ; Offset 2
+move.w    #263,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

5.9.19 Fgetdta

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Get disk transfer address« - Obtain the transfer address for +floppy disk operations. +
  +
Opcode: 47 +
  +
Syntax: DTA *Fgetdta ( void ); +
  +
Description: The GEMDOS routine Fgetdta obtains the address of a buffer for +Fsfirst and Fsnext. +
  +
Return value: The function returns a pointer to the address of the DTA +(Disk Transfer Address). +
  +
Availability: All GEMDOS versions. +
  +
Group: File functions +
  +
Comment: When an application launches, its DTA overlaps the command line +string in the process' basepage. Any use of the Fsfirst or Fsnext call +withoutn first reallocating a new DTA will cause the process' command +line to be corrupted. To prevent this, you should use Fsetdta to +define a new DTA structure for your process prior to using Fsfirst or +Fsnext. Be careful of assigning your DTA to a local or automatic +variable without setting it to its original value before the variable +goes out of scope. +
  +
See also: Binding   Fsetdta   Fsfirst   Fsnext   DTA +
  + +
+ +

5.9.19.1 Bindings for Fgetdta

+ + + + + + + + + +
C: DTA *Fgetdta ( void ); +
  +
Assembler: +
  +
move.w    #47,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #2,sp        ; Correct stack
+
+
GFA-Basic Pointer%=Gemdos(&H2F) +
  + +
+ +

5.9.20 Finstat

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Finstat« - Determine input status of a file. +
  +
Opcode: 261 +
  +
Syntax: int32_t Finstat ( int16_t fh ); +
  +
Description: The function Finstat returns the maximum number of bytes that +may be read from a file with the handle fh without having to +wait. +
  +
If the number of bytes cannot be reported exactly, then the +value 1 will be returned. +
  +
Note: In MagiC, the kernel first tries to implement the +call in Fcntl (FIONREAD). If this subfunction of dev_ioctl does not +exist (i.e. the file driver returns EINVFN), then dev_stat will be +called. In that case this can only result in the statement +"Character available" (return == 1) or "No character +available" (return == 0). FAT files and (1link [shared +memory][Shared memory]) return the actual file length minus the +current position. Pipes return the number of bytes present in the +block. +
  +
Return value: The function can return the following results: +
  + + + + + + +
>= 0 : No error occurred (number of bytes) +
EBADF : Invalid file handle + +
+ +
Availability: As of the first in MultiTOS integrated MiNT version 1.04, and +in MagiC as of Version 3.0. +
  +
Group: File functions +
  +
See also: Binding   Cauxis   Cconis   Fcntl   Foutstat +
  + +
+ +

5.9.20.1 Bindings for Finstat

+ + + + + + +
C: int32_t Finstat ( int16_t fh ); +
  +
Assembler: +
  +
move.w    fh,-(sp)     ; Offset 2
+move.w    #261,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

5.9.21 Flink

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Flink« - Create a new (hard-)link to a file. +
  +
Opcode: 301 +
  +
Syntax: int32_t Flink ( int8_t *oldname, int8_t *newname ); +
  +
Description: The function Flink creates a new name (newname) for the +file named oldname. The file can later be addressed under both +names, and the deletion (with Fdelete) of one name has no effect on +the other. +
  +
One should note that oldname and newname have to +lie on the same physical drive, and also that not all file-systems offer the +option of setting links. +
  +
Return value: The function can return the following results: +
  + + + + + + + + + + + + + + + +
E_OK : No error has arisen +
EINVFN : The file-system does not support hard links +
EFILNF : The file oldname does not exist +
EXDEV : (As below) +
ENSAME : The files oldname/newname do not lie on the +same physical drive + +
+ +
Availability: Available when a 'MiNT' cookie with a version of at least 0.90 +exists and in MagiC as of Version 3.0 +
  +
Group: File functions +
  +
See also: Binding   Frename   Fsymlink   XFS-concept in MagiC +
  + +
+ +

5.9.21.1 Bindings for Flink

+ + + + + + +
C: int32_t Flink ( int8_t *oldname, int8_t *newname ); +
  +
Assembler: +
  +
pea       newname      ; Offset 6
+pea       oldname      ; Offset 2
+move.w    #301,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+lea       $A(sp),sp    ; Correct stack
+
+ +
+ +

5.9.22 Flock

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »File record locking« - Lock or unlock part of a file. +
  +
Opcode: 92 +
  +
Syntax: int32_t Flock ( int16_t handle, int16_t mode, int32_t start, +int32_t length ); +
  +
Description: The GEMDOS routine Flock serves to protect portions of a file +from access by other processes. The following apply: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle File ID +
mode + + + + + + +
0 = Apply lock +
1 = Remove lock + +
+ +
start Start position in the file +
length Number of bytes affected + +
+ +
Warning: This function is optional, hence the call may +return EINVFN as a reply. In particular, one should note that Flock +need not be available on all installed file-systems. +
  +
Return value: The function can return the following results: +
  + + + + + + + + + +
E_OK : No error has arisen +
ELOCKED : Overlapping portion of file already locked +
ENSLOCK : Matching lock not found for removal + +
+ +
Availability: Only present when '_FLK' cookie exists. +
  +
Group: File functions +
  +
See also: Binding   Fcreate   Fopen   Fclose   Fdelete   Ptermres   +F_SETLK +
  + +
+ +

5.9.22.1 Bindings for Flock

+ + + + + + +
C: int32_t Flock ( int16_t handle, int16_t mode, int32_t start, +int32_t length ); +
  +
Assembler: +
  +
move.l    length,-(sp)  ; Offset 10
+move.l    start,-(sp)   ; Offset  6
+move.w    mode,-(sp)    ; Offset  4
+move.w    handle,-(sp)  ; Offset  2
+move.w    #92,-(sp)     ; Offset  0
+trap      #1            ; GEMDOS
+lea       $E(sp),sp     ; Correct stack
+
+ +
+ +

5.9.23 Fmidipipe

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Fmidipipe« - Redirect MIDI input/output. +
  +
Opcode: 294 +
  +
Syntax: int32_t Fmidipipe ( int16_t pid, int16_t in, int16_t out ); +
  +
Description: The function Fmidipipe alters the GEMDOS handles for MIDI inout +and output for the process with the ID pid. The parameters +in and out describe the GEMDOS handles that take on +MIDI input and output respectively for the process. +
  +
In the case pid = 0, the current process will be used. +Then The function call is equivalent to the following two lines: +
  +
Fforce (-4, in);
+Fforce (-5, out);
+
+
Return value: The function can return the following results: +
  + + + + + + + + + + + + +
E_OK : No error has arisen +
EFILNF : The process pid was not found +
EACCDN : in/out are not open for reading or writing +
EBADF : in/out is not a valid handle + +
+ +
Availability: Available when a 'MiNT' cookie with a version of at least 0.90 +exists. +
  +
Group: File functions +
  +
See also: Binding   Fdup   Fforce   Test for pipes +
  + +
+ +

5.9.23.1 Bindings for Fmidipipe

+ + + + + + +
C: int32_t Fmidipipe ( int16_t pid, int16_t in, int16_t out ); +
  +
Assembler: +
  +
move.w    out,-(sp)    ; Offset 6
+move.w    in,-(sp)     ; Offset 4
+move.w    pid,-(sp)    ; Offset 2
+move.w    #294,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #8,sp        ; Correct stack
+
+ +
+ +

5.9.24 Fopen

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »File open« - Open a given file. +
  +
Opcode: 61 +
  +
Syntax: int32_t Fopen ( const int8_t *fname, int16_t mode ); +
  +
Description: The GEMDOS routine Fopen serves for opening specified files. +The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
fname Name of file to be opened +
mode Mode, as bit-vector: + + + + + + + + + + + + +
Bit-0..2 = Access mode + + + + + + + + + +
0 = Read only +
1 = Write only +
2 = Read and write + +
+ +
Bit-3 = Reserved (to be set to 0) +
Bit-4..6 = Sharing-Modus +
Bit-7 = Inheritance flag + +
+ +
The bits 3..7 are only available with a GEMDOS that offers file +locking extensions (test for _FLK cookie). The inheritance flag +determines whether a child started by a process inherits any open file +handles and has the same access as the parent. If this flag is set +then a child has to reopen any files it wishes to use and must face +the same sharing restrictions that other processes must share. The +sharing mode determines the way other processes may access the file +once it has been opened. The following apply: + + + + + + + + + + + + + + + + + + + + + +
Sharing Meaning +
    +
0 Compatibility mode (will be used by those programs that do not +know about network extensions). If the file's read-only bit is set +then this is the same as deny writing; otherwise it is the same as +deny reading/writing. +
1 Reading and writing denied (the file may not be opened a second +time) +
2 Writing denied (the file may only be reopened for reading) +
3 Reading denied (the file may only be reopened for writing) +
4 Everything is allowed + +
+ + +
+ +
Warning: The file locking may be implemented in an +advisory manner, i.e. it may be possible to access segments despite +the presence of a lock. Programs that support file locking should +therefore set their own lock before making an access and +release it again immediately after the access. In this way one +can guarantee that possible locks set by others will be respected. +
  +
In MiNT and MagiC there are in addition the following modes +available: +
  + + + + + + + + + + + + + + + + + + + + + +
mode Meaning +
    +
0x080 Reserved for MiNT +
0x100 Do not block file for I/O +
0x200 Create file, if this does not exist +
0x400 Set existing file to zero length +
0x800 Do not open existing file + +
+ +
Note: For some devices, standard channel numbers already +exist, so that it is not necessary to call Fopen. In detail: +
  + + + + + + + + + + + + + + + + + + +
Channel Meaning +
    +
0 Keyboard (stdin:) +
1 Screen (stdout:) +
2 Serial port (stdaux:) +
3 Parallel port (stdprn:) + +
+ +
According to Atari the standard channel numbers 4 and 5 are +reserved, so that normal channel numbers for files only start at 6. +
  +
In addition it is also possible to open the following +character-oriented devices: +
  +
    +
  • PRN: (parallel port, -3) +
  • +
  • AUX: (serial port, -2) +
  • +
  • CON: (console, -1) +
  • +
+ +
Symbolic links are automatically dereferenced by this function, +i.e. if the file already exists as a symbolic link, the file +referenced from it will be opened or, depending on the mode, truncated +to zero length. +
  +
Return value: The function returns the corresponding file handle in the lower +WORD of the positive LONG, or a negative error-message. +
  +
Availability: All GEMDOS versions. +
  +
Group: File functions +
  +
See also: Binding   Fcreate   The BIOS input/output channels   F_SETLK +
  + +
+ +

5.9.24.1 Bindings for Fopen

+ + + + + + + + + +
C: int32_t Fopen ( const int8_t *fname, int16_t mode ); +
  +
Assembler: +
  +
move.w    mode,-(sp)   ; Offset 6
+pea       fname        ; Offset 2
+move.w    #61,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #8,sp        ; Correct stack
+
+
GFA-Basic Handle%=Gemdos(&H3D,L:fname%,W:mode%) +
  + +
+ +

5.9.25 Foutstat

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Foutstat« - Determine the output status of a file. +
  +
Opcode: 262 +
  +
Syntax: int32_t Foutstat ( int16_t fh ); +
  +
Description: The function Foutstat returns the number of bytes that may be +written to the file with the handle fh without blocking the +corresponding process. +
  +
If the exact number of bytes cannot be specified, then the value +1 will be returned. +
  +
Note: In MagiC, the kernel first tries to implement the +call in Fcntl (FIONWRITE). If this subfunction of dev_ioctl does not +exist (i.e. the file driver returns EINVFN), then dev_stat will be +called. In that case this can only result in the statement "One +character can be written" (return == 1) or "No character can +be written" (return == 0). FAT files always return the value 1, +shared memory returns the actual file length minus the current position. +Pipes return the number of bytes still free in the block. +
  +
Return value: The function can return the following results: +
  + + + + + + +
>= 0 : No error arisen (number of bytes) +
EBADF : Invalid file handle. + +
+ +
Note that currently this function always returns 1 for disk +files +
  +
Availability: As of the first in MultiTOS integrated MiNT version 1.04, and +in MagiC as of Version 3.0. +
  +
Group: File functions +
  +
See also: Binding   Cauxos   Cconos   Cprnos   Fcntl   Finstat +
  + +
+ +

5.9.25.1 Bindings for Foutstat

+ + + + + + +
C: int32_t Foutstat ( int16_t fh ); +
  +
Assembler: +
  +
move.w    fh,-(sp)     ; Offset 2
+move.w    #262,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

5.9.26 Fpipe

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Fpipe« - Create a pipe. +
  +
Opcode: 256 +
  +
Syntax: int32_t Fpipe ( int16_t usrh[2] ); +
  +
Description: The function Fpipe creates a pipe that may be used for +inter-process communication (IPC). It is normally used by shells that +wish to redirect the input and output of their child processes; prior +to launching the child process, the shell redirects its input and +output (as necessary) to the read and write ends of the newly created +file. On a successful call, two GEMDOS handles will be returned in +usrh. +
  +
usrh[0] denotes the handle for the read-end of the pipe, +(read-only) while usrh[1] the handle for the write-end of the +pipe (write-only). +
  +
The pipe produced in this way will be created in the directory +U:\PIPE as a pseudo-file and will be named 'sys$pipe.xxx', where 'xxx' +represent a three-digit integer. +
  +
Return value: The function can return the following results: +
  + + + + + + + + + + + + +
E_OK : No error has arisen +
ENHNDL : No 2 handles free any more +
EACCDN : No pipeline free any more (max. 999 available) +
ENSMEM : Not enough memory free to create the pipe + +
+ +
Availability: Available when a 'MiNT' cookie with a version of at least 0.90 +exists and in MagiC as of Version 3.0. +
  +
Group: File functions +
  +
See also: Binding   Fmidipipe   Test for pipes +
  + +
+ +

5.9.26.1 Bindings for Fpipe

+ + + + + + +
C: int32_t Fpipe ( int16_t usrh[2] ); +
  +
Assembler: +
  +
pea       usrh         ; Offset 2
+move.w    #256,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

5.9.27 Fpoll

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Fpoll« - Enquiry of the file status with timeout. +
  +
Opcode: 346 +
  +
Syntax: int32_t Fpoll (POLLFD *fds, uint32_t nfds, uint32_t timeout ); +
  +
Description: Fpoll() performs a similar task to Fselect: it waits for one of +a set of file descriptors to become ready to perform I/O. +
  +
The set of file descriptors to be monitored is specified in the +fds argument, which is an array of structures of the following form: +
  +
typedef struct pollfd
+{
+        int32_t  fd;            /* file descriptor */
+        uint16_t events;        /* requested events */
+        uint16_t revents;       /* returned events */
+} POLLFD;
+
+
The caller should specify the number of items in the fds array +in nfds. +
  +
The field fd contains a file descriptor for an open file. If +this field is negative, then the corresponding events field is ignored +and the revents field returns zero. (This provides an easy way of +ignoring a file descriptor for a single poll() call: simply negate the +fd field.) +
  +
The field events is an input parameter, a bit mask specifying +the events the application is interested in for the file descriptor +fd. If this field is specified as zero, then all events are ignored +for fd and revents returns zero. +
  +
The field revents is an output parameter, filled by the kernel +with the events that actually occurred. The bits returned in revents +can include any of those specified in events, or one of the values +POLLERR, POLLHUP, or POLLNVAL. (These three bits are meaningless in +the events field, and will be set in the revents field whenever the +corresponding condition is true.) +
  +
If none of the events requested (and no error) has occurred for +any of the file descriptors, then poll() blocks until one of the +events occurs. +
  +
The timeout argument specifies the minimum number of +milliseconds that poll() will block. (This interval will be rounded up +to the system clock granularity, and kernel scheduling delays mean +that the blocking interval may overrun by a small amount.) Specifying +a negative value in timeout means an infinite timeout. Specifying a +timeout of zero causes poll() to return immediately, even if no file +descriptors are ready. +
  +
The bits that may be set/returned in events and revents are +defined in <poll.h>: +
  + + + + + + + + + + + + + + + + + + + + + +
POLLIN There is data to read. +
POLLPRI There is urgent data to read (e.g., out-of-band data on TCP +socket; pseudoterminal master in packet mode has seen state change in +slave). +
POLLOUT Writing now will not block. +
POLLRDHUP Stream socket peer closed connection, or shut down writing half +of connection. The _GNU_SOURCE feature test macro must be defined +(before including any header files) in order to obtain this +definition. +
POLLERR Error condition (output only). +
POLLHUP Hang up (output only). +
POLLNVAL Invalid request: fd not open (output only). + +
+ +
When compiling with _XOPEN_SOURCE defined, one also has the +following, which convey no further information beyond the bits listed +above: +
  + + + + + + + + + + + + +
POLLRDNORM Equivalent to POLLIN. +
POLLRDBAND Priority band data can be read (generally unused on MiNT). +
POLLWRNORM Equivalent to POLLOUT. +
POLLWRBAND Priority data may be written. + +
+ +
MiNT(Lib) also knows about, but does not use POLLMSG. +
  +
Return value: The function can return the following results: +
  + + + + + + + + + + + + + + + + + + + + + +
0 : The call timed out and no file descriptors were ready. +
>0 : The number of structures which have nonzero revents fields (in +other words, those descriptors with events or errors reported). +
EBADF : At least one of the handles is not assigned to an open file. +
EFAULT : The array given as argument was not contained in the calling +program's address space. +
EINTR : A signal occurred before any requested event; see Psignal. +
EINVAL : The nfds value exceeds the RLIMIT_NOFILE value. +
ENOMEM : There was no space to allocate file descriptor tables. + +
+ +
Availability: This function is available as of FreeMiNT 1.15.12. +
  +
Group: File functions +
  +
See also: Binding   Fselect   Finstat   Foutstat +
  + +
+ +

5.9.27.1 Bindings for Fpoll

+ + + + + + +
C: int32_t Fpoll (POLLFD *fds, uint32_t nfds, uint32_t timeout ); +
  +
Assembler: +
  +
move.l    timeout,-(sp)  ; Offset  10
+move.l    nfds,-(sp)     ; Offset  6
+pea       fds            ; Offset  2
+move.w    #346,-(sp)     ; Offset  0
+trap      #1             ; GEMDOS
+lea       14(sp),sp      ; Correct stack
+
+ +
+ +

5.9.28 Fputchar

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Fputchar« - Write a character to a given file. +
  +
Opcode: 264 +
  +
Syntax: int32_t Fputchar ( int16_t fh, int32_t ch, int16_t mode ); +
  +
Description: The function Fputchar writes a character to the file with the +handle fh. The parameter mode is only significant if +the file is a (pseudo-)terminal: +
  + + + + + + + + + + + + +
mode Meaning +
    +
0 Raw mode +
No evaluation of control characters +
1 Cooked mode +
Special control characters (Control-C, Control-Z) will be looked +for and interpreted if appropriate; the same applies for flow control +(Control-S, Control-Q) + +
+ +
If the file is a (pseudo-)terminal, then all 4 bytes can be +tranmitted. In this way it is possible to transmit simulated BIOS +scancodes and Shift-status messages. Otherwise only the low byte of +ch will be transmitted. +
  +
Return value: The function can return the following values: +
  + + + + + + + + + + + + + + + +
4 : Number of written bytes, if the file is a terminal +
1 : Output successful, but file is not a terminal +
0 : Bytes could not be written (perhaps due to flow control) +
EBADF : Invalid file handle +
  A negative BIOS error-code if an error occurred during I/O. + +
+ +
Availability: As of the first in MultiTOS integrated MiNT version 1.04. +
  +
Group: File functions +
  +
See also: Binding   Bconout   Cauxout   Cconout   Crawio   Fgetchar   +Fwrite +
  + +
+ +

5.9.28.1 Bindings for Fputchar

+ + + + + + +
C: int32_t Fputchar ( int16_t fh, int32_t ch, int16_t mode ); +
  +
Assembler: +
  +
move.w    mode,-(sp)   ; Offset 8
+move.l    ch,-(sp)     ; Offset 4
+move.w    fh,-(sp)     ; Offset 2
+move.w    #264,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+lea       $A(sp),sp    ; Correct stack
+
+ +
+ +

5.9.29 Fread

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »file read« - Read from a file. +
  +
Opcode: 63 +
  +
Syntax: int32_t Fread ( int16_t handle, int32_t count, void *buf ); +
  +
Description: The GEMDOS routine Fread reads a given number of bytes from a +file. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle File handle identifier +
count Number of bytes of data to read +
buf Address of the receiving buffer (at least count bytes +long) + +
+ +
Note: In all GEMDOS Versions < 0.15 the system will +freeze if the parameter count has a value of 0. When reading +from standard channels, a maximum of 16383 characters may be read. +
  +
Return value: The function returns either a positive number showing the +number of bytes actually read, which may be lower than count +if an EOF (end of file) was encountered, or a negative GEMDOS +error-code: +
  + + + + + + +
EBADF : Wrong file handle +
ELOCKED : File segment is marked as locked + +
+ +
Availability: All GEMDOS versions. +
  +
Group: File functions +
  +
See also: Binding   Fwrite   FIONREAD +
  + +
+ +

5.9.29.1 Bindings for Fread

+ + + + + + + + + +
C: int32_t Fread ( int16_t handle, int32_t count, void *buf ); +
  +
Assembler: +
  +
pea       buf           ; Offset 8
+move.l    count,-(sp)   ; Offset 4
+move.w    handle,-(sp)  ; Offset 2
+move.w    #63,-(sp)     ; Offset 0
+trap      #1            ; GEMDOS
+lea       $C(sp),sp     ; Correct stack
+
+
GFA-Basic Fehler%=Gemdos(&H3F,W:handle%,L:count%,L:buf%) +
  + +
+ +

5.9.30 Freadlink

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Freadlink« - Follow symbolic link. +
  +
Opcode: 303 +
  +
Syntax: int32_t Freadlink ( int16_t bufsiz, int8_t *buf, int8_t *name +); +
  +
Description: The function Freadlink determines the filename of the symbolic +link name. This is the name that was specified for the first +parameter of Fsymlink. +
  +
The name is stored in buffer buf, which has a length of +bufsiz characters. +
  +
Return value: The function can return the following results: +
  + + + + + + + + + + + + + + + +
E_OK : No error has arisen +
EINVFN : The file-system of name does not permit any symbolic +links +
EFILNF : The symbolic link name was not found +
EACCDN : name is not a symbolic link +
ERANGE : The buffer buf is too small for the filename that is to +be determined + +
+ +
Availability: Available when a 'MiNT' cookie with a version of at least 0.90 +exists and in MagiC as of Version 3.0. +
  +
Group: File functions +
  +
See also: Binding   Fsymlink   XFS-concept in MagiC +
  + +
+ +

5.9.30.1 Bindings for Freadlink

+ + + + + + +
C: int32_t Freadlink ( int16_t bufsiz, int8_t *buf, int8_t *name +); +
  +
Assembler: +
  +
pea       Name          ; Offset 10
+pea       buf           ; Offset  6
+move.w    bufsiz,-(sp)  ; Offset  2
+move.w    #303,-(sp)    ; Offset  0
+trap      #1            ; GEMDOS
+lea       $C(sp),sp     ; Correct stack
+
+ +
+ +

5.9.31 Frename

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »file rename« - Rename a GEMDOS file. +
  +
Opcode: 86 +
  +
Syntax: int32_t Frename ( const int8_t *oldname, const int8_t *newname +); +
  +
Description: The GEMDOS routine Frename serves for renaming files. The new +name may also contain a complete access path within the relevant +physical drive; in that case the file will be moved. The following +apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
oldname Pointer to present name +
newname Pointer to new name + +
+ +
Note: As of GEMDOS Version 0.15 it is possible to alter +the names of directories as well. However, these cannot be moved. One +should avoid renaming files that are already open. +
  +
Note about MagiC: It is up to the XFS to decide +whether directories may be renamed or moved. The integrated DOS-XFS +only allows a moving of directories as of MagiC 5. +
  +
Return value: The function returns the following results: +
  + + + + + + + + + + + + +
E_OK : No error has arisen +
EPTHNF : Directory not found +
EACCDN : Access denied (write-protected) +
ENSAME : Destination not on same drive + +
+ +
Availability: All GEMDOS versions. +
  +
Group: File functions +
  +
See also: Binding   Fdelete   XFS-concept in MagiC +
  + +
+ +

5.9.31.1 Bindings for Frename

+ + + + + + + + + +
C: int32_t Frename ( const int8_t *oldname, const int8_t *newname +); +
  +
Assembler: +
  +
pea       newname      ; Offset 8
+pea       oldname      ; Offset 4
+move.w    #0,-(sp)     ; Offset 2
+move.w    #86,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS
+lea       $C(sp),sp    ; Correct stack
+
+
Note: The Null-parameter will normally be appended +automatically for a C binding. +
  +
GFA-Basic Fehler%=Gemdos(&H56,W:0,L:oldname%,L:newname%) +
  + +
+ +

5.9.32 Fseek

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »file seek« - Move file position pointer. +
  +
Opcode: 66 +
  +
Syntax: int32_t Fseek ( int32_t offset, int16_t handle, int16_t +seekmode ); +
  +
Description: The GEMDOS routine Fseek permits the file pointer to be moved +to a new position within a file. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
offset Number of bytes that are to be skipped +
handle GEMDOS file handle +
seekmode Type of repositioning: + + + + + + + + + +
0 = From start of file +
1 = From current position +
2 = From end of file + +
+ + +
+ +
Note: Applied to pipes the function returns the value +EACCDN; this way applications can differentiate between devices and +pipes. +
  +
Return value: The function returns a positive value of the new absolute +location of the file pointer from the start of the file, or a negative +error-message. +
  +
Availability: All GEMDOS versions. +
  +
Group: File functions +
  +
See also: Binding   Fread   Fwrite   Test for pipes +
  + +
+ +

5.9.32.1 Bindings for Fseek

+ + + + + + + + + +
C: int32_t Fseek ( int32_t offset, int16_t handle, int16_t +seekmode ); +
  +
Assembler: +
  +
move.w    seekmode,-(sp)  ; Offset 8
+move.w    handle,-(sp)    ; Offset 6
+move.l    offset,-(sp)    ; Offset 2
+move.w    #66,-(sp)       ; Offset 0
+trap      #1              ; GEMDOS
+lea       $A(sp),sp       ; Correct stack
+
+
GFA-Basic Fehler%=Gemdos(&H42,L:offset%,W:handle%,W:seekmode%) +
  + +
+ +

5.9.33 Fseek64

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »file seek« - Move 64-bit file position pointer. +
  +
Opcode: 332 (0x014c) +
  +
Syntax: int32_t Fseek64 ( int32_t hioffset, uint32_t lowoffset, int16_t +handle, int16_t seekmode, int64_t *newpos ); +
  +
Description: The GEMDOS routine Fseek64 permits the file pointer to be moved +to a new position within a file. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
hioffset Upper 32 bits of the int64_t number of bytes that are to be +skipped +
lowoffset Lower 32 bits of the int64_t number of bytes that are to be +skipped +
handle GEMDOS file handle +
seekmode Type of repositioning: + + + + + + + + + +
0 = From start of file +
1 = From current position +
2 = From end of file + +
+ +
newpos The 64-bit value pointed to by newpos is set to the new +position if successful + +
+ +
Note: Applied to pipes the function returns the value +EACCDN; this way applications can differentiate between devices and +pipes. +
  +
Note: At the moment Fseek64() is only a wrapper around +Fseek() as there is no 64bit XFS/XDD support. If the specified offset +is greater than 2147483647L (2^31-1), the call fails and returns +EBADARG. +
  +
Return value: The function returns a positive value of the new absolute +location of the file pointer from the start of the file, or a negative +error-message. +
  +
Availability: This function is available as of FreeMiNT 1.15.10. +
  +
Group: File functions +
  +
See also: Binding   Fread   Fseek   Fwrite   Test for pipes +
  + +
+ +

5.9.33.1 Bindings for Fseek64

+ + + + + + + + + +
C: int32_t Fseek64 ( int32_t hioffset, uint32_t lowoffset, int16_t +handle, int16_t seekmode, int64_t *newpos ); +
  +
Assembler: +
  +
pea       newpos          ; Offset 14
+move.w    seekmode,-(sp)  ; Offset 12
+move.w    handle,-(sp)    ; Offset 10
+move.l    lowoffset,-(sp) ; Offset 6
+move.l    hioffset,-(sp)  ; Offset 2
+move.w    #332,-(sp)      ; Offset 0
+trap      #1              ; GEMDOS
+lea       $12(sp),sp      ; Correct stack
+
+
GFA-Basic +Fehler%=Gemdos(&H14C,L:hioffset%,L:lowoffset%,W:handle%,W:seekmode%,L:newpos%) +
  + +
+ +

5.9.34 Fselect

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Fselect« - Enquiry of the file status with timeout. +
  +
Opcode: 285 +
  +
Syntax: int32_t Fselect ( uint16_t timeout, int32_t *rfds, int32_t +*wfds, ((int32_t) 0) ); +
  +
Description: The function Fselect checks which open files are ready for +reading or writing. The parameter rfds points to a LONG bitmap +which describes the set of GEMDOS read file descriptors to wait for. +
  +
In this longword, bit n is set when the file descriptor +n is to be checked for input. An empty set may also be +represented optionally by a NULL-pointer. +
  +
In the same way, wfds points to a set of write file +descriptors whose output status is to be checked. +
  +
On return of the function, the handles of the files that are +ready for reading or writing respectively and also should be checked +are passed in rfds and wfds. +
  +
Note that currently the only BIOS device Fselect works with is +the keyboard. +
  +
With timeout one can specify how many milliseconds one +should wait before the function returns. A value of 0 means in this +case that the function waits until one of the specified files is ready +for reading or writing. +
  +
Example: +
  + + + + + + +
Fselect (0, 0L, 0L, 0L) waits forever +
Fselect (1, 0L, 0L, 0L) waits for one millisecond + +
+ +
Return value: The function can return the following results: +
  + + + + + + + + + +
0 : In the specified time no files were ready for reading or +writing (timeout) +
>0 : Sum of the set bits of rfds and wfds +
EBADF : At least one of the handles is not assigned to an open file + +
+ +
Availability: As of the first in MultiTOS integrated MiNT version 1.04 and +MagiC since version 3.00. +
  +
Group: File functions +
  +
See also: Binding   Finstat   Foutstat +
  + +
+ +

5.9.34.1 Bindings for Fselect

+ + + + + + +
C: int32_t Fselect ( uint16_t timeout, int32_t *rfds, int32_t +*wfds, ((int32_t) 0) ); +
  +
Assembler: +
  +
move.l    dummy,-(sp)    ; Offset 12
+pea       wfds           ; Offset  8
+pea       rfds           ; Offset  4
+move.w    timeout,-(sp)  ; Offset  2
+move.w    #285,-(sp)     ; Offset  0
+trap      #1             ; GEMDOS
+lea       $10(sp),sp     ; Correct stack
+
+ +
+ +

5.9.35 Fsetdta

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set disk transfer address« - Set the address for the +transfer region for floppy disk operations. +
  +
Opcode: 26 +
  +
Syntax: void Fsetdta ( DTA *buf ); +
  +
Description: The GEMDOS routine Fsetdta sets the address of the memory +segment that will be used as the new DTA. The parameter buf is +a pointer to this structure. +
  +
Note: At program launch the DTA will be established +starting at offset 0x80 in the basepage. +
  +
Return value: The function does not return a result. +
  +
Availability: All GEMDOS versions. +
  +
Group: File functions +
  +
See also: Binding   Fgetdta   Fsfirst   BASEPAGE   DTA +
  + +
+ +

5.9.35.1 Bindings for Fsetdta

+ + + + + + + + + +
C: void Fsetdta ( DTA *buf ); +
  +
Assembler: +
  +
pea       buf          ; Offset 2
+move.w    #26,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #6,sp        ; Correct stack
+
+
GFA-Basic Fehler%=Gemdos(&H1A,L:buf%) +
  + +
+ +

5.9.36 Fsfirst

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »search first file« - Search for first file entry. +
  +
Opcode: 78 +
  +
Syntax: int32_t Fsfirst ( const int8_t *filename, int16_t attr ); +
  +
Description: The GEMDOS routine Fsfirst can obtain information about the +first occurrence of a file or subdirectory. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
filename Pointer to the filename or subdirectory +
attr Attributes that should be matched by the file searched for + + + + + + + + + + + + + + + + + + +
Bit-0: Include read-only files +
Bit-1: Include hidden files +
Bit-2: Include system files +
Bit-3: Include volume labels +
Bit-4: Include subdirectories +
Bit-5: Include files with archive-bit set + +
+ + +
+ +
The filename or path may also contain the jokers '*' and '?'. +When the function terminates, the directory entry will fill the disk +transfer area (DTA), whose location can be obtained or set with +Fgetdta and Fsetdta respectively. The required information can then be +obtained from the DTA structure. +
  +
The DTA must be initialised with Fsfirst! +
  +
Note: If the program runs in the MiNT-domain, Fsfirst +will return lower case filenames. As file-systems exist that are case +sensitive, you should avoid making such conversions manually. However, +if you absolutely need upper case filenames you should use Pdomain to +make your program run in the TOS-domain. +
  +
Notes about MagiC: If bit 3 of attr is set, then the kernel +will call the XFS function xfs_rlabel. The calling user program can +unfortunately no longer get the date and time of the disk name under +MagiC with this. The kernel sets all fields to 0 and the function +Fsnext may not be executed. As of MagiC 3, the function Dreadlabel is +used instead, which also manages long filenames. +
  +
If bit 3 of attr is not set, a search for files is made +as in TOS. If a file is a symbolic link, the DOS kernel calls the +function Fxattr to follow the link. The values returned by Fxattr are +then copied to the DTA. +
  +
Warning: MagiC is not always able to evaluate correctly +relative symbolic links during Fsfirst/Fsnext. There are three ways to +overcome this: +
  + + + + + + + + + +
(a) Best: use Dxreaddir +
(b) Use only absolute symbolic links +
(c) Alays make the search directory the current one + +
+ +
Though MiNT handles this case correctly, it is at a huge cost. +The Fsfirst/next concept is basically obsolete, ineffective and +unsafe, and should be avoided both in MiNT as well as in MagiC. +
  +
Return value: The function returns the following results: +
  + + + + + + + + + +
E_OK : No error has occurred +
EFILNF : File not found +
ENMFIL : No more files + +
+ +
Availability: All GEMDOS versions. +
  +
Group: File functions +
  +
See also: Binding   Fgetdta   Fsetdta   Fsnext   DTA   Recursive search   XFS-concept +
  + +
+ +

5.9.36.1 Bindings for Fsfirst

+ + + + + + + + + +
C: int32_t Fsfirst ( const int8_t *filename, int16_t attr ); +
  +
Assembler: +
  +
move.w    attr,-(sp)   ; Offset 6
+pea       filename     ; Offset 2
+move.w    #78,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #8,sp        ; Correct stack
+
+
GFA-Basic Fehler%=Gemdos(&H4E,L:filename%,W:attr%) +
  + +
+ +

5.9.37 Fsnext

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »search next file« - Search for next file entry. +
  +
Opcode: 79 +
  +
Syntax: int16_t Fsnext ( void ); +
  +
Description: The GEMDOS routine Fsnext searches for the next file entry that +matches the criteria specified in Fsfirst. It should be called as +often as necessary after a Fsfirst call to find all files that match +the search criteria. +
  +
Be aware that this function uses the application's DTA which +initially shares its memory location with the processes' command line. +Hence using this function without first assigning a new DTA will +corrupt the command line. +
  +
Note: If the program runs in the MiNT-domain, Fsnext +will return lower case filenames. As file-systems exist that are case +sensitive, you should avoid making such conversions manually. However, +if you absolutely need upper case filenames you should use Pdomain to +make your program run in the TOS-domain. +
  +
Return value: The function returns 0 if a matching file was found, else a +negative error-message. +
  +
Availability: All GEMDOS versions. +
  +
Group: File functions +
  +
See also: Binding   Fgetdta   Fsetdta   Fsfirst +
  + +
+ +

5.9.37.1 Bindings for Fsnext

+ + + + + + + + + +
C: int16_t Fsnext ( void ); +
  +
Assembler: +
  +
move.w    #79,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #2,sp        ; Correct stack
+
+
GFA-Basic Fehler%=Gemdos(&H4F) +
  + +
+ +

5.9.38 Fsymlink

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Fsymlink« - Create a symbolic link to a file. +
  +
Opcode: 302 +
  +
Syntax: int32_t Fsymlink ( int8_t *oldname, int8_t *newname ); +
  +
Description: The function Fsymlink creates a symbolic link newname +for the file named oldname. If the call succeeds then the file +can later be accessed under both names. Deletion with Fdelete for +newname does not affect the file itself, but only the symbolic +link. However, if Fdelete is applied to oldname, then the file +will be deleted as usual, and accesses to newname are no +longer possible. +
  +
The difference to hard links lies in the fact that symbolic +links can exist between different physical devices (and with that even +different file-system types). +
  +
Return value: The function can return the following results: +
  + + + + + + +
E_OK : No error has arisen +
EINVFN : The file-system does not support symbolic links + +
+ +
Availability: Available when a 'MiNT' cookie with a version of at least 0.90 +exists and in MagiC as of Version 3.0. +
  +
Group: File functions +
  +
See also: Binding   Flink   Freadlink   Frename   XFS-concept +
  + +
+ +

5.9.38.1 Bindings for Fsymlink

+ + + + + + +
C: int32_t Fsymlink ( int8_t *oldname, int8_t *newname ); +
  +
Assembler: +
  +
pea       newname      ; Offset 6
+pea       oldname      ; Offset 2
+move.w    #302,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+lea       $A(sp),sp    ; Correct stack
+
+ +
+ +

5.9.39 Fstat64

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Fstat64« - Obtain extended file attributes. +
  +
Opcode: 331 (0x14b) +
  +
Syntax: int32_t Fstat64 ( int16_t flag, int8_t *name, STAT *stat ); +
  +
Description: The function Fstat64 obtains the extended attributes of the +file whose complete name is specified in name, and saves these +in stat. +
  +
The parameter flag specifies how symbolic links are to +be treated. The following apply: +
  + + + + + + + + + + + + +
flag Meaning +
    +
0 Symbolic links are followed to the source file and the extended +attributes are obtained from this file. (This corresponds to the +procedure stat under UNIX). +
1 The extended attributes of the symbolic link itself are +obtained. (This corresponds to the procedure lstat under +UNIX). + +
+ +
Note: This function is equivalent to a call of Fcntl +(mode F_STAT64) with the difference that instead of a filename, the +handle of an already opened file is passed. +
  +
Return value: The function can return the following results: +
  + + + + + + + + + +
E_OK : No error has arisen +
EFILNF : File not found +
EPTHNF : Path to file not found + +
+ +
Availability: This function is available as of FreeMiNT 1.15.4. +
  +
Group: File functions +
  +
See also: Binding   Fattrib   Fsnext   STAT +
  + +
+ +

5.9.39.1 Bindings for Fstat64

+ + + + + + +
C: int32_t Fstat64 ( int16_t flag, int8_t *name, STAT *stat ); +
  +
Assembler: +
  +
pea       stat         ; Offset 10
+pea       name         ; Offset  6
+move.w    flag,-(sp)   ; Offset  2
+move.w    #331,-(sp)   ; Offset  0
+trap      #1           ; GEMDOS
+lea       $C(sp),sp    ; Correct stack
+
+ +
+ +

5.9.40 Fsync

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Fsync« - Synchronize a file's in-core state with storage +device. +
  +
Opcode: 259 (0x0103) +
  +
Syntax: int16_t Fsync ( int16_t handle ); +
  +
Description: +
  +
Fsync() transfers ("flushes") all modified in-core +data of (i.e., modified buffer cache pages for) the file referred to +by the file descriptor fd to the disk device (or other permanent +storage device) so that all changed information can be retrieved even +after the system crashed or was rebooted. This includes writing +through or flushing a disk cache if present. The call blocks until the +device reports that the transfer has completed. It also flushes +metadata information associated with the file (see stat(2)). +
  +
Calling Fsync() does not necessarily ensure that the entry in +the directory containing the file has also reached disk. For that an +explicit Fsync() on a file descriptor for the directory is also +needed. +
  +
Warning: In MiNT this function is currently not +implemented and calls Sync() instead. +
  +
Return value: On success, these system call return zero. Otherwise, it +returns one of the following error codes: +
  + + + + + + + + + + + + +
EBADF : Incorrect file handle. +
EIO : An error occurred during synchronization. +
EROFS: +
EINVAL: "handle" is bound to a special file which does not +support synchronization. + +
+ +
Availability: Available as of FreeMiNT version 1.15.10. +
  +
Group: File functions +
  +
See also: Binding   Sync +
  + +
+ +

5.9.40.1 Bindings for Fsync

+ + + + + + +
C: int16_t Fsync ( int16_t handle ); +
  +
Assembler: +
  +
move.w    handle,-(sp)  ; Offset 2
+move.w    #259,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

5.9.41 Fwrite

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »file write« - Write to a specified file. +
  +
Opcode: 64 +
  +
Syntax: int32_t Fwrite ( int16_t handle, int32_t count, void *buf ); +
  +
Description: The GEMDOS routine Fwrite writes a given number of bytes to a +specified GEMDOS file. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle File handle identifier +
count Number of bytes to be written +
buf Start address of the buffer + +
+ +
Note about MagiC: If one passes the value 0 for the +number of bytes to be written, and the value -1 in buf, then +the file will be truncated to the current position of the file +pointer. +
  +
Return value: The function returns the number of bytes actually written, or +one of the following error-messages: +
  + + + + + + + + + +
EACCDN : Access denied +
EBADF : Invalid file handle +
ELOCKED : File segment is marked as protected + +
+ +
Availability: All GEMDOS versions. +
  +
Group: File functions +
  +
See also: Binding   Fread   FIONWRITE +
  + +
+ +

5.9.41.1 Bindings for Fwrite

+ + + + + + + + + +
C: int32_t Fwrite ( int16_t handle, int32_t count, void *buf ); +
  +
Assembler: +
  +
pea       buf           ; Offset 8
+move.l    count,-(sp)   ; Offset 4
+move.w    handle,-(sp)  ; Offset 2
+move.w    #64,-(sp)     ; Offset 0
+trap      #1            ; GEMDOS
+lea       $C(sp),sp     ; Correct stack
+
+
GFA-Basic Fehler%=Gemdos(&H40,W:handle,L:count%,L:buf%) +
  + +
+ +

5.9.42 Fxattr

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Fxattr« - Obtain extended file attributes. +
  +
Opcode: 300 +
  +
Syntax: int32_t Fxattr ( int16_t flag, int8_t *name, XATTR *xattr ); +
  +
Description: The function Fxattr obtains the extended attributes of the file +whose complete name is specified in name, and saves these in +xattr. +
  +
The parameter flag specifies how symbolic links are to +be treated. The following apply: +
  + + + + + + + + + + + + +
flag Meaning +
    +
0 Symbolic links are followed to the source file and the extended +attributes are obtained from this file. (This corresponds to the +procedure stat under UNIX). +
1 The extended attributes of the symbolic link itself are +obtained. (This corresponds to the procedure lstat under +UNIX). + +
+ +
Note: This function is equivalent to a call of Fcntl +(mode F_STAT) with the difference that instead of a filename, the +handle of an already opened file is passed. +
  +
Return value: The function can return the following results: +
  + + + + + + + + + +
E_OK : No error has arisen +
EFILNF : File not found +
EPTHNF : Path to file not found + +
+ +
Availability: Available when a 'MiNT' cookie with a version of at least 0.90 +exists and in MagiC as of Version 3.0. +
  +
Group: File functions +
  +
See also: Binding   Fattrib   Fsnext   XFS-concept in MagiC +
  + +
+ +

5.9.42.1 Bindings for Fxattr

+ + + + + + +
C: int32_t Fxattr ( int16_t flag, int8_t *name, XATTR *xattr ); +
  +
Assembler: +
  +
pea       xattr        ; Offset 10
+pea       name         ; Offset  6
+move.w    flag,-(sp)   ; Offset  2
+move.w    #300,-(sp)   ; Offset  0
+trap      #1           ; GEMDOS
+lea       $C(sp),sp    ; Correct stack
+
+ +
+ +
+ +Home +GEMDOSGEMDOS +gemdos-trapgemdos-trap +Date and TimeDate and Time + + diff --git a/en/gemdos_filesys.html b/en/gemdos_filesys.html new file mode 100644 index 000000000..13afe6f7d --- /dev/null +++ b/en/gemdos_filesys.html @@ -0,0 +1,73 @@ + + + + + +The documentation for TOS: Support for alternative file-systems + + + + + + + + + +Home +GEMDOSGEMDOS +About the GEMDOSAbout the GEMDOS +GEMDOS error-messagesGEMDOS error-messages + +
+ +

5.2 Support for alternative file-systems

+ + +

The MiNT project of the Canadian Eric Smith made +possible for the first time the use of alternative file-systems, and +with that the use of long filenames under TOS. This was achieved +through the introduction of new GEMDOS functions. +

+

These new functions however do not have to be present only when +MiNT is installed: MagiC as of Version 3.0 possesses some +MiNT-compatible functions; also MetaDOS drivers with corresponding +functionality have been spotted. For this reason it is imperative that +interrogation for the MiNT cookie should be removed from all programs. +The presence of a GEMDOS function can be recognized by the fact that +the function does not return the value EINVFN. +

+

To obtain information about the underlying file-system, one +should use the GEMDOS function Dpathconf. +

+

+

The above illustration shows the limitations of a pure TOS +file system for the various drives. The column files specifies +the maximum number of files that may be opened per process (apart from +process-internal limits). Under links one can see the maximum +number of links to a file that may exist. path_max shows how +long complete filenames (including the path) may be on the +file-system. The column name_max shows the maximum length of a +filename, and under atomic is specified how many bytes may be +written per write operation. The column trunc is specially +important, showing how over-length filenames will be truncated. +Finally, under case one can tell whether and how filenames +with mixed capitals and lower case will be supported. +

+ +

The rule of thumb is: Always continue using filenames +and paths exactly as they were presented by the operating system; +basically, write filenames in lower case, as even on systems with +mixed capitals and lower case, filenames in capitals are rather the +exception! +

+

See also: XFS-concept in MagiC   Dpathconf +

+
+ +Home +GEMDOSGEMDOS +About the GEMDOSAbout the GEMDOS +GEMDOS error-messagesGEMDOS error-messages + + diff --git a/en/gemdos_functions.html b/en/gemdos_functions.html new file mode 100644 index 000000000..fb7a15365 --- /dev/null +++ b/en/gemdos_functions.html @@ -0,0 +1,1949 @@ + + + + + +The documentation for TOS: GEMDOS function list + + + + + + + + + +Home +GEMDOSGEMDOS +TekBiosTekBios +GEMDOS structuresGEMDOS structures + +
+ +

5.23 GEMDOS function list

+

The following list is a synopsis of the GEMDOS routines, sorted +by function numbers: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
dezhexFunctionpresent
00x00Pterm0TOS
10x01CconinTOS
20x02CconoutTOS
30x03CauxinTOS
40x04CauxoutTOS
50x05CprnoutTOS
60x06CrawioTOS
70x07CrawcinTOS
80x08CnecinTOS
90x09CconwsTOS
100x0ACconrsTOS
110x0BCconisTOS
140x0EDsetdrvTOS
160x10CconosTOS
170x11CprnosTOS
180x12CauxisTOS
190x13CauxosTOS
200x14MaddaltTOS
210x15SreallocTOS 4
220x16SlbopenMagiC
230x17SlbcloseMagiC
250x19DgetdrvTOS
260x1AFsetdtaTOS
320x20SuperTOS
420x2ATgetdateTOS
430x2BTsetdateTOS
440x2CTgettimeTOS
450x2DTsettimeTOS
470x2FFgetdtaTOS
480x30SversionTOS
490x31PtermresTOS
510x33SconfigMagiC
540x36DfreeTOS
570x39DcreateTOS
580x3ADdeleteTOS
590x3BDsetpathTOS
600x3CFcreateTOS
610x3DFopenTOS
620x3EFcloseTOS
630x3FFreadTOS
640x40FwriteTOS
650x41FdeleteTOS
660x42FseekTOS
670x43FattribTOS
680x44MxallocTOS
690x45FdupTOS
700x46FforceTOS
710x47DgetpathTOS
720x48MallocTOS
730x49MfreeTOS
740x4AMshrinkTOS
750x4BPexecTOS
760x4CPtermTOS
780x4EFsfirstTOS
790x4FFsnextTOS
860x56FrenameTOS
870x57FdatimeTOS
910x5Bnap_ioNAP BioNet100
920x5CFlock
960x60Nversion
960x60Init_ProcessC'Task Royal
970x61Load_ProcessC'Task Royal
980x62Frlock
990x62End_ProcessC'Task Royal
990x63Frunlock
990x63Stop_ProcessC'Task Royal
1000x64Flock
1000x64Cont_ProcessC'Task Royal
1000x64SetLinkAdrTekBios
1010x65Funlock
1010x65Find_ProcessC'Task Royal
1010x65ByteToLinkTekBios
1020x66Fflush
1020x66Stop_AllC'Task Royal
1020x66ByteFromLinkTekBios
1030x67Cont_AllC'Task Royal
1030x67LongWordToLinkTekBios
1030x68Creat_QueueC'Task Royal
1040x68LongWordFromLinkTekBios
1050x69Delete_QueueC'Task Royal
1050x69SliceToLinkTekBios
1060x6AWrite_QueueC'Task Royal
1060x6ASliceFromLinkTekBios
1070x6BRead_QueueC'Task Royal
1070x6BreservedTekBios
1080x6CQueue_InfoC'Task Royal
1080x6CreservedTekBios
1090x6DFind_QueueC'Task Royal
1090x6DreservedTekBios
1100x6EEvnt_SignalC'Task Royal
1100x6EreservedTekBios
1110x6FEvnt_WaitC'Task Royal
1110x6FTestErrorTekBios
1110x6Ftrap111MIDI_COM, since version 3.7
1120x70AttachC'Task Royal
1120x70SetResetTekBios
1120x70MforkMultiGEM
1130x71Pr_AssignC'Task Royal
1130x71SetAnalyseTekBios
1140x72Creat_ScreenC'Task Royal
1140x72BootRootTekBios
1150x73NenablePAMs Net
1150x73Del_ScreenC'Task Royal
1160x74NdisablePAMs Net
1160x74InstallC'Task Royal
1170x75NremotePAMs Net
1170x75MvarsC'Task Royal
1180x76NmsgPAMs Net
1180x76AllocC'Task Royal
1190x77NrecordPAMs Net
1190x77FreeC'Task Royal
1200x78NresetPAMs Net
1210x79NprinterPAMs Net
1220x7ANlockedPAMs Net
1230x7BNunlockPAMs Net
1240x7CNlockPAMs Net
1250x7DNloggedPAMs Net
1260x7ENnodeidPAMs Net
1270x7FNactivePAMs Net
1280x80PuseridPowerDOS
1290x81PpriorityPowerDOS
1300x82PgetpidPowerDOS
1300x82nap_in_sNAP BioNet100
1310x83PgetppidPowerDOS
1310x83nap_out_sNAP BioNet100
1320x84PgetpdPowerDOS
1330x85PfindpidPowerDOS
1340x86PprocinfPowerDOS
1350x87PnicePowerDOS
1360x88SmallocPowerDOS
1370x89MassignPowerDOS
1390x8BFstatusPowerDOS
1400x8CFsfirstidxPowerDOS
1410x8DWake_parentPowerDOS
1420x8EWaitPowerDOS
1430x8FSleepPowerDOS
1440x90IoqueuePowerDOS
1450x91Wait_dtPowerDOS
1460x92Dev_createPowerDOS
1470x93Fm_addPowerDOS
1480x94Drv_addPowerDOS
1490x95DevinfoPowerDOS
1500x96SendPowerDOS
1510x97Sig_interceptPowerDOS
1520x98SuspendPowerDOS
1530x99Q_messagePowerDOS
1540x9ASemaphorePowerDOS
1550x9BMem_sharePowerDOS
1580x9EChgvectorPowerDOS
1590x9FChgsysvarPowerDOS
1600xA0PnamePowerDOS
1610xA1PvectorPowerDOS
1620xA2PattribPowerDOS
1630xA3PmaxmemPowerDOS
2550xFFSyieldMiNT
2560x100FpipeMiNT
2570x101FfchownMiNT
2580x102FfchmodMiNT
2590x103FsyncMiNT
2600x104FcntlMiNT
2610x105FinstatMiNT
2620x106FoutstatMiNT
2630x107FgetcharMiNT
2640x108FputcharMiNT
2650x109PwaitMiNT
2660x10APniceMiNT
2670x10BPgetpidMiNT
2680x10CPgetppidMiNT
2690x10DPgetpgrpMiNT
2700x10EPsetpgrpMiNT
2710x10FPgetuidMiNT
2720x110PsetuidMiNT
2730x111PkillMiNT
2740x112PsignalMiNT
2750x113PvforkMiNT
2760x114PgetgidMiNT
2770x115PsetgidMiNT
2780x116PsigblockMiNT
2790x117PsigsetmaskMiNT
2800x118PusrvalMiNT
2810x119PdomainMiNT
2820x11APsigreturnMiNT
2830x11BPforkMiNT
2840x11CPwait3MiNT
2850x11DFselectMiNT
2860x11EPrusageMiNT
2870x11FPsetlimitMiNT
2880x120TalarmMiNT
2890x121PauseMiNT
2900x122SysconfMiNT
2910x123PsigpendingMiNT
2920x124DpathconfMiNT
2930x125PmsgMiNT
2940x126FmidipipeMiNT
2950x127PreniceMiNT
2960x128DopendirMiNT
2970x129DreaddirMiNT
2980x12ADrewinddirMiNT
2990x12BDclosedirMiNT
3000x12CFxattrMiNT
3010x12DFlinkMiNT
3020x12EFsymlinkMiNT
3030x12FFreadlinkMiNT
3040x130DcntlMiNT
3050x131FchownMiNT
3060x132FchmodMiNT
3070x133PumaskMiNT
3080x134PsemaphoreMiNT
3090x135DlockMiNT
3100x136PsigpauseMiNT
3110x137PsigactionMiNT
3120x138PgeteuidMiNT
3130x139PgetegidMiNT
3140x13APwaitpidMiNT
3150x13BDgetcwdMiNT
3160x13CSalertMiNT
3170x13DTmalarmMiNT 1.10
3180x13EPsigintrMiNT 1.11 until FreeMiNT 1.15.12 inclusive
3190x13FSuptimeMiNT 1.11
3200x140PtraceMiNT
3210x141MvalidateFreeMiNT 1.15.12
3220x142DxreaddirMiNT 1.11
3230x143PseteuidMiNT 1.11
3240x144PsetegidMiNT 1.11
3250x145PgetauidMiNT 1.11
3260x146PsetauidMiNT 1.11
3270x147PgetgroupsMiNT 1.11
3280x148PsetgroupsMiNT 1.11
3290x149TsetitimerMiNT 1.11
3300x14AScookieMiNT (obsolete)
3300x14ADchrootMiNT ^^^^
3310x14BFstat64MiNT 1.15.4
3320x14CFseek64MiNT
3330x14DDsetkeyMiNT
3340x14EPsetreuidMiNT 1.12
3350x14FPsetregidMiNT 1.12
3360x150SyncMiNT, MagiC
3370x151ShutdownMiNT
3380x152DreadlabelMiNT 1.12
3390x153DwritelabelMiNT 1.12
3400x154SsystemMiNT 1.15.0
3410x155TgettimeofdayMiNT 1.15.0
3420x156TsettimeofdayMiNT 1.15.0
3430x157TadjtimeMiNT 1.16
3440x158PgetpriorityMiNT 1.15.0
3450x159PsetpriorityMiNT 1.15.0
3460x15aFpollFreeMiNT 1.15.12
3470x15BFwritevMiNTNet
3480x15CFreadvMiNTNet
3490x15DFfstat64FreeMint 1.16
3500x15EPsysctlMiNT
3510x15FPemulationMiNT
3520x160FsocketMiNTNet
3530x161FsocketpairMiNTNet
3540x162FacceptMiNTNet
3550x163FconnectMiNTNet
3560x164FbindMiNTNet
3570x165FlistenMiNTNet
3580x166FrecvmsgMiNTNet
3590x167FsendmsgMiNTNet
3600x168FrecvfromMiNTNet
3610x169FsendtoMiNTNet
3620x16AFsetsockoptMiNTNet
3630x16BFgetsockoptMiNTNet
3640x16CFgetpeernameMiNTNet
3650x16DFgetsocknameMiNTNet
3660x16EFshutdownMiNTNet
3680x170PshmgetMiNT
3690x171PshmctlMiNT
3700x172PshmatMiNT
3710x173PshmdtMiNT
3720x174PsemgetMiNT
3730x175PsemctlMiNT
3740x176PsemopMiNT
3750x177PsemconfigMiNT
3760x178PmsggetMiNT
3770x179PmsgctlMiNT
3780x17APmsgsndMiNT
3790x17BPmsgrcvMiNT
3810x17DMaccessMiNT
3820x17EMmapReserved for FreeMiNT
3830x17FMunmapReserved for FreeMiNT
3840x180Fchown16FreeMiNT 1.16.0
3850x181FchdirFreeMiNT 1.17
3860x182FfdopendirFreeMiNT 1.17
3870x183FdirfdFreeMiNT 1.17
5030x1F7getprtAtari Network Service
5040x1F8dflushAtari Network Service
5050x1F9chpwAtari Network Service
6010x259DisableAtari Network Service
6020x25AEnableAtari Network Service
6030x25BGetTaskAtari Network Service
6040x25COpenPortAtari Network Service
6050x25DGetMsgAtari Network Service
6060x25EAskMsgAtari Network Service
6070x25FAskPortAtari Network Service
6080x260SendMsgAtari Network Service
6090x261ReplyMsgAtari Network Service
6100x262ClosePortAtari Network Service
6120x264GetIPAddrAtari Network Service
6130x265PGetMsgAtari Network Service
6140x266mytimeAtari Network Service
6150x267IamBackAtari Network Service
6200x26Cudp_openAtari Network Service
6210x26Cudp_closeAtari Network Service
6220x26Cudp_readAtari Network Service
6230x26Dudp_writeAtari Network Service
6300x276tcp_openAtari Network Service
6310x277tcp_writeAtari Network Service
6320x278tcp_readAtari Network Service
6330x279tcp_closeAtari Network Service
6340x27Atcp_abortAtari Network Service
6350x27Btcp_statAtari Network Service
12960x510DxopendirDir_Lwr
42000x1068Sys_BreakSysMon
42010x1069Sys_PrintfSysMon
240000x5DC0STEFcntrlSTEmulator
+
+ +

See also: GEMDOS   BIOS function list   XBIOS function list +

+
+ +Home +GEMDOSGEMDOS +TekBiosTekBios +GEMDOS structuresGEMDOS structures + + diff --git a/en/gemdos_main.html b/en/gemdos_main.html new file mode 100644 index 000000000..c3d59534e --- /dev/null +++ b/en/gemdos_main.html @@ -0,0 +1,60 @@ + + + + + +The documentation for TOS: GEMDOS + + + + + + + + + +Home +Contents +XBIOS StructuresXBIOS Structures +About the GEMDOSAbout the GEMDOS + +
+ +

5 GEMDOS

+ +
+
+ +Home +Contents +XBIOS StructuresXBIOS Structures +About the GEMDOSAbout the GEMDOS + + diff --git a/en/gemdos_memory.html b/en/gemdos_memory.html new file mode 100644 index 000000000..fcb773f0d --- /dev/null +++ b/en/gemdos_memory.html @@ -0,0 +1,895 @@ + + + + + +The documentation for TOS: Memory management + + + + + + + + + +Home +GEMDOSGEMDOS +Process functionsProcess functions +Network functionsNetwork functions + +
+ +

5.12 Memory management

+ + + + + + + + + + + + + + + + + + + + + +
Maccess   Verify accessibility of a region of memory. +
Maddalt   Registers 'Alternative' memory. +
Malloc    Reserves memory or inquires free memory. +
Mfree     Releases a block of memory. +
Mshrink   Reduces/increases size of a memory block. +
Mvalidate Verify accessibility of a process region of memory. +
Mxalloc   Reserves a block of memory. + +
+ +

Warning: Here one should emphasise that in view of +future operating system versions, memory blocks used for communication +between different programs, or blocks allocated via pointers, have to +be global (Mxalloc functions with a global flag). Otherwise, +when using computers with PMMU (e.g. Atari-TT030 or Falcon030), memory +protection violations may arise. +

+

See also: +
Program launch and TPA   Process functions   Memory management in +TOS   Memory management in MagiC +

+

5.12.1 Maccess

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: Maccess - verify accessibility of a region of memory +
  +
Opcode: 381 (0x17d) +
  +
Syntax: int32_t Maccess ( void *start, int32_t size, int16_t mode ); +
  +
Description: Maccess verifies accessibility for the calling process's memory +page(s) containing any part of the address range in the interval +[addr, addr+len-1]. +
  + + + + + + + + + + + + +
Parameter Meaning +
start Start address of the memory block to be verified list +
size Length of the memory block +
mode mode is either 1 to check for read access, or 0 to check for +read/write access. + +
+ +
Return value: The function returns the value 0 on success, else a negative +error code. +
  +
Availability: This function is available as of FreeMiNT 1.15.12. +
  +
Group: Memory management +
  +
See also: Binding   Mfree   Malloc   Mxalloc   Mvalidate +
  + +
+ +

5.12.1.1 Bindings for Maccess

+ + + + + + +
C: int32_t Maccess ( void *start, int32_t size, int16_t mode ); +
  +
Assembler: +
  +
move.w    mode,-(sp)   ; Offset 10
+move.l    size,-(sp)   ; Offset 6
+pea       start        ; Offset 2
+move.w    #381,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+lea       $C(sp),sp    ; Correct stack
+
+ +
+ +

5.12.2 Maddalt

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inform GEMDOS of alternative memory« - Register +'Alternative' RAM with GEMDOS. +
  +
Opcode: 20 +
  +
Syntax: int32_t Maddalt ( void *start, int32_t size ); +
  +
Description: The GEMDOS routine Maddalt permits the inclusion of a block of +additional alternate-RAM in the GEMDOS memory list that would not +normally have been identified by the system. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
start Start address of the memory block to be added to the GEMDOS +free list +
size Length of the memory block + +
+ +
Note: The block remains the property of DOS and may not +be reclaimed. If the added blocks are not consecutive, the number of +blocks that can be added is restricted to around 12. +
  +
This function could be useful perhaps when using VME-bus cards +in an Atari-TT030, or similar hardware modifications, if their memory +is to be made accessible to GEMDOS. +
  +
Return value: The function returns the value 0 on success, else a negative +error code. +
  +
Availability: The function is only available from GEMDOS 0.19 on. +
  +
Group: Memory management +
  +
See also: Binding   Mfree   Malloc   Mxalloc +
  + +
+ +

5.12.2.1 Bindings for Maddalt

+ + + + + + +
C: int32_t Maddalt ( void *start, int32_t size ); +
  +
Assembler: +
  +
move.l    size,-(sp)   ; Offset 6
+pea       start        ; Offset 2
+move.w    #20,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS
+lea       $A(sp),sp    ; Correct stack
+
+ +
+ +

5.12.3 Malloc

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »memory allocation« - Reserve a block of memory or inquire +free memory. +
  +
Opcode: 72 +
  +
Syntax: void *Malloc ( int32_t number ); +
  +
Description: The GEMDOS routine Malloc reserves a block of memory for an +application, or calculates the size of the largest free block of +memory. The following applies for the parameter number: +
  + + + + + + + + + + + + +
Value Meaning +
    +
-1 Get size of the largest available memory block +
Other Number of bytes to be reserved + +
+ +
Note: One should never rely on the number of bytes +actually allocated corresponding to the number requested. Constructs +of the type Malloc(Malloc(-1L)) are simply out of the question in +multitasking systems (catchword: Task-switching). +
  +
Under TOS the GEMDOS supported only a limited number of memory +blocks. For that reason, a programm should not often use the function, +instead it reserve larger blocks (at least 16KBytes) and manage +themselves. +
  +
Furthermore one should note the following poins: +
  +
    +
  • The memory block need not be empty. +
      +

  • +
  • Memory blocks allocated consecutively need not necessarily be +contiguous. +
      +

  • +
  • Never access memory blocks that do not belong to one's own +process. In systems with memory protection this would lead to an +exception. +
      +

  • +
+ +
In MagiC this call is implemented as Mxalloc with mode 0 or 3 +(depending on the configuration bits in the program file header). The +configuration bits are stored in the basepage at present. +
  +
Return value: The function returns the start address of the reserved memory +block. A NULL-pointer means that there is not enough memory available +to fulfill the request. In the case of number = -1, the length +of the largest available memory block will be returned. +
  +
Availability: All GEMDOS versions. However, prior to GEMDOS Version 0.15, +Malloc( 0L ) will return a pointer to invalid memory instead of +failing as it should. +
  +
Group: Memory management +
  +
See also: Bindings for Malloc   Mfree   Mxalloc   Maddalt   Program flags +
  + +
+ +

5.12.3.1 Bindings for Malloc

+ + + + + + +
C: void *Malloc ( int32_t number ); +
  +
Assembler: +
  +
move.l    number,-(sp) ; Offset 2
+move.w    #72,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

5.12.4 Mfree

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »memory free« - Release a block of memory. +
  +
Opcode: 73 +
  +
Syntax: int32_t Mfree ( void *block ); +
  +
Description: The GEMDOS routine Mfree releases a block of memory previously +reserved with Malloc. +
  +
The parameter block contains the start address of the +memory block to be released. +
  +
Note: In almost all GEMDOS versions no check is made +whether the block to be released really belongs to the relevant +process. Hence particular care is needed, specially in multitasking +systems. +
  +
Return value: The function can return the following results: +
  + + + + + + +
E_OK No error has arisen +
EIMBA Invalid memory block address + +
+ +
Availability: All GEMDOS versions. +
  +
Group: Memory management +
  +
See also: Binding   Malloc   Mxalloc   Maddalt +
  + +
+ +

5.12.4.1 Bindings for Mfree

+ + + + + + +
C: int32_t Mfree ( void *block ); +
  +
Assembler: +
  +
pea       block        ; Offset 2
+move.w    #73,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

5.12.5 Mshrink

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Memory shrink« - Reduce or enlarge a memory block. +
  +
Opcode: 74 +
  +
Syntax: int32_t Mshrink ( void *block, int32_t newsiz ); +
  +
Description: The GEMDOS routine Mshrink reduces or enlarges an already +reserved memory block in the GEMDOS free list. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
block Start address of the memory block +
newsiz New (changed) length of the block; in MagiC +additionally: + + + + + + +
-1 = Obtain the largest possible size of the memory block +
 0 = Release block + +
+ + +
+ +
Note: As a rule no check is made whether the memory +block really belongs to the caller. The option to enlarge a +memory block is only available in MagiC at present. However this only +works if a large enough free block is present above the block in +question, and the TOS-compatibility has been deactivated. +
  +
Return value: The function can return the following results: +
  + + + + + + + + + +
E_OK : No error has arisen +
EIMBA : Invalid memory block address +
EGSBF : Block was enlarged + +
+ +
Availability: All GEMDOS versions. +
  +
Group: Memory management +
  +
See also: Binding   Malloc   Mfree +
  + +
+ +

5.12.5.1 Bindings for Mshrink

+ + + + + + +
C: int32_t Mshrink ( void *block, int32_t newsiz ); +
  +
Assembler: +
  +
move.l    newsiz,-(sp)  ; Offset 8
+pea       block         ; Offset 4
+move.w    #0,-(sp)      ; Offset 2
+move.w    #74,-(sp)     ; Offset 0
+trap      #1            ; GEMDOS
+lea       $C(sp),sp     ; Correct stack
+
+
Note: The NULL-parameter is normally added automatically +in a C binding. +
  + +
+ +

5.12.6 Mvalidate

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: Mvalidate - verify access to a process memory region +
  +
Opcode: 321 (0x141) +
  +
Syntax: int32_t Mvalidate ( int16_t pid, void *start, int32_t size, +int32_t *flags ); +
  +
Description: Mvalidate verifies accessibility for the specified process's +memory page(s) containing any part of the address range in the +interval [addr, addr+len-1]. +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
pid Process id of the process to check. May be 0 for the current +process. +
start Start address of the memory block to be verified. +
size Length of the memory block. +
flags Upon a successfull call, will contain the protection flags of +the specified memory region. + +
+ +
Return value: The function returns the value 0 on success, else a negative +error code. +
  +
Availability: This function is available as of FreeMiNT 1.15.12. +
  +
Group: Memory management +
  +
See also: Binding   Mfree   Malloc   Mxalloc   Maccess +
  + +
+ +

5.12.6.1 Bindings for Mvalidate

+ + + + + + +
C: int32_t Mvalidate ( int16_t pid, void *start, int32_t size, +int32_t *flags ); +
  +
Assembler: +
  +
pea       flags        ; Offset 12
+move.l    size,-(sp)   ; Offset 8
+pea       start        ; Offset 4
+move.w    pid,-(sp)    ; Offset 2
+move.w    #321,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+lea       $10(sp),sp   ; Correct stack
+
+ +
+ +

5.12.7 Mxalloc

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Allocate memory (with preference)« - Reserve memory +according to specified preferences. +
  +
Opcode: 68 +
  +
Syntax: void *Mxalloc ( int32_t amount, int16_t mode ); +
  +
Description: The GEMDOS routine Mxalloc reserves a block of memory of the +size amount. One can use the bits of the WORD parameter +mode to specify the desired type of memory. The following +apply: +
  + + + + + + + + + + + + + + + + + + +
Bits Meaning +
    +
0-2 Treatment of the TT-RAM + + + + + + + + + + + + +
0 = Allocate ST-RAM only +
1 = Allocate Alternative-RAM only +
2 = Allocate either, ST-RAM preferred +
3 = Allocate either, Alternative-RAM preferred + +
+ +
3 Reserved +
4-7 Protection mode + + + + + + + + + + + + + + + +
0 = Default (from your PRGFLAGS) +
1 = Private +
2 = Global +
3 = Supervisor-mode-only access +
4 = World-readable access + +
+ +
Other values are undefined and reserved. +
14 No-Free modus +
When set, this bit means "if the owner of this block +terminates, don't free this block. Instead, let MiNT inherit it, so +it'll never be freed." This is a special mode meant for the OS +only, and may not remain available to user processes. + +
+ +
All further bits are reserved for future purposes. With the +value -1L for amount one can inquire the size of the largest +contiguous block of memory (dependent on mode). +
  +
Under MagiC all memory allocations are logged. If the +restriction set with LIMITMEM is exceeded, A NULL-pointer will be +returned. In the case amount = -1, the minimum of free memory +and not yet exhausted LIMITMEM restriction will be returned. +Exceptions are calls of the screen manager (SCRENMGR) which controls +the menus. This ensures that even LIMITMEM-restricted programs do not +have problems with menu redraws. +
  +
Note: A problem exists in ascertaining when the extended +modes (bits 3 and following) may be used. This is because some older +versions of GEMDOS do not get along with these modes and are partly +responsible for crashing the application or the whole system. For this +reason many programmers test explicitly for the presence of +MiNT/MultiTOS or versions of MagiC >= 2.0. Alternatively one can +also use the function Mxmask. +
  +
Return value: The function returns the start address of the reserved block as +an untyped pointer. Mxalloc returns a 0 when insufficient memory is +available. +
  +
Availability: This function exists only from GEMDOS Version 0.19 on. +
  +
Group: Memory management +
  +
See also: Binding   Mfree   Malloc   Maddalt   Program flags +
  + +
+ +

5.12.7.1 Bindings for Mxalloc

+ + + + + + +
C: void *Mxalloc ( int32_t amount, int16_t mode ); +
  +
Assembler: +
  +
move.w    mode,-(sp)    ; Offset 6
+move.l    amount,-(sp)  ; Offset 2
+move.w    #68,-(sp)     ; Offset 0
+trap      #1            ; GEMDOS
+addq.l    #8,sp         ; Correct stack
+
+ +
+ +

5.12.7.2 Mxmask

+
/*
+   Mxmask returns a bit-mask with which one should mask the mode
+   WORD of a Mxalloc call if one wants to use protection bits.
+   This is necessary as Mxalloc unfortunately returns erroneous
+   results in some GEMDOS implementations when protection bits are
+   specified, which can result in a system crash.
+   (© 1994 Martin Osieka)
+
+   Application example:
+   mxMask = Mxmask();
+   p = mxMask ? Mxalloc( size, 0x43 & mxMask) : Malloc( size); */
+
+SHORT Mxmask (void)
+{
+    void *svStack;         /* Supervisor-Stack */
+    int32_t sRAM, sRAMg;   /* ST-RAM           */
+    int32_t aRAM, aRAMg;   /* Alternate RAM    */
+
+    /*
+    // Sample table of possible values:
+    //           | newfashion  | oldfashion
+    // sRAM aRAM | sRAMg aRAMg | sRAMg aRAMg
+    //   1    0  |   1     0   |   1     1
+    //   0    2  |   0     2   |   2     2
+    //   1    2  |   1     2   |   3     3
+    */
+
+    svStack = (void *) Super( 0);  /* Disallow task-switching */
+
+    sRAM  = (int32_t) Mxalloc( -1, 0);
+    /* In error case Mxalloc( -1, 3) */
+    sRAMg = (int32_t) Mxalloc( -1, 0x40);
+    aRAM  = (int32_t) Mxalloc( -1, 1);
+    /* In error case Mxalloc( -1, 3) */
+    aRAMg = (int32_t) Mxalloc( -1, 0x41);
+
+    Super( svStack);  /* Permit task-switching */
+
+    if (sRAM == -32)
+        return 0x0000;  /* Mxalloc is not implemented */
+
+    else if ( ((sRAM + aRAM) == sRAMg) && ((sRAM + aRAM) == aRAMg) )
+        return 0x0003;  /* oldfashion Mxalloc() */
+
+    else
+        return 0xFFFF;
+
+} /* Mxmask */
+
+

See also: GEMDOS   Memory management +

+
+ +Home +GEMDOSGEMDOS +Process functionsProcess functions +Network functionsNetwork functions + + diff --git a/en/gemdos_mintnet.html b/en/gemdos_mintnet.html new file mode 100644 index 000000000..63b4b0b8b --- /dev/null +++ b/en/gemdos_mintnet.html @@ -0,0 +1,868 @@ + + + + + +The documentation for TOS: Network + + + + + + + + + +Home +GEMDOSGEMDOS +Character input/outputCharacter input/output +ARGV procedureARGV procedure + +
+ +

5.17 Network

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Fwritev       Write data from multiple buffers +
Freadv        Read data into multiple buffers +
Fsocket       Create an endpoint for communication +
Fsocketpair   Create a pair of connected sockets +
Faccept       Accept a connection on a socket +
Fconnect      Initiate a connection on a socket +
Fbind         Bind a name to a socket +
Flisten       Listen for connections on a socket +
Frecvmsg      Receive a message from a socket +
Fsendmsg      Send a message on a socket +
Frecvfrom     Receive a message from a socket +
Fsendto       Send a message on a socket +
Fsetsockopt   Set options on sockets +
Fgetsockopt   Get options on sockets +
Fgetpeername  Get name of connected peer socket +
Fgetsockname  Get socket name +
Fshutdown     Shut down part of a full-duplex connection + +
+ +

See also: Network functions +

+

5.17.1 Fwritev

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »file write« - Write data from multiple buffers +
  +
Opcode: 347 +
  +
Syntax: int32_t Fwritev(int16_t handle, struct iovec *iov, int32_t +niov); +
  +
Description: +
  +
Return value: +
  +
Availability: This function is available as of FreeMiNT 1.16. +
  +
Group: Network +
  +
See also: +
  + +
+ +

5.17.2 Freadv

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »file read« - Read data into multiple buffers +
  +
Opcode: 348 +
  +
Syntax: int32_t Freadv(int16_t handle, struct iovec *iov, int32_t +niov); +
  +
Description: +
  +
Return value: +
  +
Availability: This function is available as of FreeMiNT 1.16. +
  +
Group: Network +
  +
See also: +
  + +
+ +

5.17.3 Fsocket

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »socket« - Create an endpoint for communication +
  +
Opcode: 352 +
  +
Syntax: int32_t Fsocket(int32_t domain, int32_t type, int32_t +protocol); +
  +
Description: +
  +
Return value: +
  +
Availability: This function is available as of FreeMiNT 1.16. +
  +
Group: Network +
  +
See also: +
  + +
+ +

5.17.4 Fsocketpair

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »socketpair« - Create a pair of connected sockets +
  +
Opcode: 353 +
  +
Syntax: int32_t Fsocketpair(int32_t domain, int32_t type, int32_t +protocol, int16_t fds[2]); +
  +
Description: +
  +
Return value: +
  +
Availability: This function is available as of FreeMiNT 1.16. +
  +
Group: Network +
  +
See also: +
  + +
+ +

5.17.5 Faccept

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »accept« - Accept a connection on a socket +
  +
Opcode: 354 +
  +
Syntax: int32_t Faccept(int16_t fd, struct sockaddr *name, uint32_t +*anamelen); +
  +
Description: +
  +
Return value: +
  +
Availability: This function is available as of FreeMiNT 1.16. +
  +
Group: Network +
  +
See also: +
  + +
+ +

5.17.6 Fconnect

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »connect« - Initiate a connection on a socket +
  +
Opcode: 355 +
  +
Syntax: int32_t Fconnect(int16_t fd, struct sockaddr *name, uint32_t +anamelen); +
  +
Description: +
  +
Return value: +
  +
Availability: This function is available as of FreeMiNT 1.16. +
  +
Group: Network +
  +
See also: +
  + +
+ +

5.17.7 Fbind

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »bind« - Bind a name to a socket +
  +
Opcode: 356 +
  +
Syntax: int32_t Fbind(int16_t fd, const struct sockaddr *name, uint32_t +anamelen); +
  +
Description: +
  +
Return value: +
  +
Availability: This function is available as of FreeMiNT 1.16. +
  +
Group: Network +
  +
See also: +
  + +
+ +

5.17.8 Flisten

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »listen« - Listen for connections on a socket +
  +
Opcode: 357 +
  +
Syntax: int32_t Flisten(int16_t fd, int32_t backlog); +
  +
Description: +
  +
Return value: +
  +
Availability: This function is available as of FreeMiNT 1.16. +
  +
Group: Network +
  +
See also: +
  + +
+ +

5.17.9 Frecvmsg

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »recvmsg« - Receive a message from a socket +
  +
Opcode: 358 +
  +
Syntax: int32_t Frecvmsg(int16_t fd, struct msghdr *msg, int32_t +flags); +
  +
Description: +
  +
Return value: +
  +
Availability: This function is available as of FreeMiNT 1.16. +
  +
Group: Network +
  +
See also: +
  + +
+ +

5.17.10 Fsendmsg

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »sendmsg« - Send a message on a socket +
  +
Opcode: 359 +
  +
Syntax: int32_t Fsendmsg(int16_t fd, const struct msghdr *msg, int32_t +flags); +
  +
Description: +
  +
Return value: +
  +
Availability: This function is available as of FreeMiNT 1.16. +
  +
Group: Network +
  +
See also: +
  + +
+ +

5.17.11 Frecvfrom

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »recvfrom« - Receive a message from a socket +
  +
Opcode: 360 +
  +
Syntax: int32_t Frecvfrom(int16_t fd, void *buf, int32_t buflen, +int32_t flags, struct sockaddr *to, uint32_t *addrlen); +
  +
Description: +
  +
Return value: +
  +
Availability: This function is available as of FreeMiNT 1.16. +
  +
Group: Network +
  +
See also: +
  + +
+ +

5.17.12 Fsendto

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »sendto« - Send a message on a socket +
  +
Opcode: 361 +
  +
Syntax: int32_t Fsendto(int16_t fd, const void *buf, int32_t buflen, +int32_t flags, const struct sockaddr *to, uint32_t addrlen); +
  +
Description: +
  +
Return value: +
  +
Availability: This function is available as of FreeMiNT 1.16. +
  +
Group: Network +
  +
See also: +
  + +
+ +

5.17.13 Fsetsockopt

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »setsockopt« - Set options on sockets +
  +
Opcode: 362 +
  +
Syntax: int32_t Fsetsockopt(int16_t fd, int32_t level, int32_t name, +const void *val, uint32_t valsize); +
  +
Description: +
  +
Return value: +
  +
Availability: This function is available as of FreeMiNT 1.16. +
  +
Group: Network +
  +
See also: +
  + +
+ +

5.17.14 Fgetsockopt

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »getsockopt« - Get options on sockets +
  +
Opcode: 363 +
  +
Syntax: int32_t Fgetsockopt(int16_t fd, int32_t level, int32_t name, +void *val, uint32_t *valsize); +
  +
Description: +
  +
Return value: +
  +
Availability: This function is available as of FreeMiNT 1.16. +
  +
Group: Network +
  +
See also: +
  + +
+ +

5.17.15 Fgetpeername

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »getpeername« - Get name of connected peer socket +
  +
Opcode: 364 +
  +
Syntax: int32_t Fgetpeername(int16_t fd, struct sockaddr *asa, uint32_t +*alen); +
  +
Description: +
  +
Return value: +
  +
Availability: This function is available as of FreeMiNT 1.16. +
  +
Group: Network +
  +
See also: +
  + +
+ +

5.17.16 Fgetsockname

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »getsockname« - Get socket name +
  +
Opcode: 365 +
  +
Syntax: int32_t Fgetsockname(int16_t fd, struct sockaddr *asa, uint32_t +*alen); +
  +
Description: +
  +
Return value: +
  +
Availability: This function is available as of FreeMiNT 1.16. +
  +
Group: Network +
  +
See also: +
  + +
+ +

5.17.17 Fshutdown

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »shutdown« - Shut down part of a full-duplex connection +
  +
Opcode: 366 +
  +
Syntax: int32_t Fshutdown(int16_t fd, int32_t how); +
  +
Description: +
  +
Return value: +
  +
Availability: This function is available as of FreeMiNT 1.16. +
  +
Group: Network +
  +
See also: +
  + +
+ +
+ +Home +GEMDOSGEMDOS +Character input/outputCharacter input/output +ARGV procedureARGV procedure + + diff --git a/en/gemdos_network.html b/en/gemdos_network.html new file mode 100644 index 000000000..a1a953cda --- /dev/null +++ b/en/gemdos_network.html @@ -0,0 +1,570 @@ + + + + + +The documentation for TOS: Network functions + + + + + + + + + +Home +GEMDOSGEMDOS +Memory managementMemory management +System functionsSystem functions + +
+ +

5.13 Network functions

+ + + + + + + + + + + + + + + + + + +
Fflush Flush file +
Flock Lock file from current position +
Frlock Lock a file record +
Frunlock Unlock a file record +
Funlock Unlock file +
Nversion Network identifier determine + +
+ +

5.13.1 Fflush

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Fflush« - Flush the buffer of a file +
  +
Opcode: 102 (0x0066) +
  +
Syntax: int32_t Fflush ( int16_t handle ); +
  +
Description: The GEMDOS routine Fflush writes all modified data of the +specified file handle from its buffer to the disk. +
  +
Return value: Returns E_OK on success, or a negative GEMDOS error code +otherwise. +
  +
Availability: Available when a network driver is installed. +
  +
Group: Network functions +
  +
See also: Binding +
  + +
+ +

5.13.1.1 Bindings for Fflush

+ + + + + + +
C: int32_t Fflush ( int16_t handle ); +
  +
Assembler: +
  +
move.w    handle,-(sp) ; Offset 2
+move.w    #102,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #4,sp        ; correct stack
+
+ +
+ +

5.13.2 F_lock

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Flock« - Protect a portion of a file +
  +
Opcode: 100 (0x0064) +
  +
Syntax: int32_t Flock ( int16_t handle, int32_t length ); +
  +
Description: The GEMDOS routine Flock serves to protect a portion of a file +(from the current position) from access by other processes across a +network. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle File ID +
length Number of bytes affected + +
+ +
Note: Please do not confuse this function ($64) with +Flock ($5C) from the specification for GEMDOS File Sharing & +Record Locking. +
  +
Return value: Returns E_OK on success, or a negative GEMDOS error code +otherwise. +
  +
Availability: Available when a network driver is installed. +
  +
Group: Network functions +
  +
See also: Binding Funlock +
  + +
+ +

5.13.2.1 Bindings for F_lock

+ + + + + + +
C: int32_t Flock ( int16_t handle, int32_t length ); +
  +
Assembler: +
  +
move.l    length,-(sp) ; Offset 4
+move.w    handle,-(sp) ; Offset 2
+move.w    #100,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #8,sp        ; correct stack
+
+ +
+ +

5.13.3 Frlock

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Frlock« - Protect a portion of a file +
  +
Opcode: 98 (0x0062) +
  +
Syntax: int32_t Frlock ( int16_t handle, int32_t start, int32_t length +); +
  +
Description: The GEMDOS routine Frlock serves to protect a portion of a file +from access by other processes across a network. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle File ID +
start Start position in the file +
length Number of bytes affected + +
+ +
Return value: Returns E_OK on success, or a negative GEMDOS error code +otherwise. +
  +
Availability: Available when a network driver is installed. +
  +
Group: Network functions +
  +
See also: Binding Frunlock Nversion +
  + +
+ +

5.13.3.1 Bindings for Frlock

+ + + + + + +
C: int32_t Frlock ( int16_t handle, int32_t start, int32_t length +); +
  +
Assembler: +
  +
move.l    length,-(sp) ; Offset 8
+move.l    start,-(sp)  ; Offset 4
+move.w    handle,-(sp) ; Offset 2
+move.w    #98,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS
+lea       12(sp),sp    ; correct stack
+
+ +
+ +

5.13.4 Frunlock

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Frunlock« - Unlock a portion of a file +
  +
Opcode: 99 (0x0063) +
  +
Syntax: int32_t Frunlock ( int16_t handle, int32_t start ); +
  +
Description: The GEMDOS routine Frunlock serves to unlock the locked portion +of a file. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle File ID +
start Start position in the file + +
+ +
Return value: Returns E_OK on success, or a negative GEMDOS error code +otherwise. +
  +
Availability: Available when a network driver is installed. +
  +
Group: Network functions +
  +
See also: Binding Frlock Nversion +
  + +
+ +

5.13.4.1 Bindings for Frunlock

+ + + + + + +
C: int32_t Frunlock ( int16_t handle, int32_t start ); +
  +
Assembler: +
  +
move.l    start,-(sp)  ; Offset 4
+move.w    handle,-(sp) ; Offset 2
+move.w    #99,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #8,sp        ; correct stack
+
+ +
+ +

5.13.5 Funlock

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Funlock« - Unlock a portion of a file +
  +
Opcode: 101 (0x0065) +
  +
Syntax: int32_t Funlock ( int16_t handle ); +
  +
Description: The GEMDOS routine Funlock serves to unlock the portion of a +file previously locked by Flock. The following apply: +
  + + + + + + + + + +
Parameter Meaning +
    +
handle File ID + +
+ +
Return value: Returns E_OK on success, or a negative GEMDOS error code +otherwise. +
  +
Availability: Available when a network driver is installed. +
  +
Group: Network functions +
  +
See also: Binding Flock +
  + +
+ +

5.13.5.1 Bindings for Funlock

+ + + + + + +
C: int32_t Funlock ( int16_t handle ); +
  +
Assembler: +
  +
move.w    handle,-(sp) ; Offset 2
+move.w    #101,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #4,sp        ; correct stack
+
+ +
+ +

5.13.6 Nversion

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Nversion« - Network identifier determine +
  +
Opcode: 96 +
  +
Syntax: int32_t Nversion( void ); +
  +
Description: Returns the identifier of the connected network +
  +
Return value: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDName
1Bionet
2A-Net
3Elan
4TSE-Net
5Atlanet
6PAMs-Net
7Transnet
+
+ +
Availability: +
  +
Group: Network functions +
  +
See also: Binding +
  + +
+ +

5.13.6.1 Bindings for Nversion

+ + + + + + +
C: int32_t Nversion( void ); +
  +
Assembler: +
  +
move.w    #96,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #2,sp        ; correct stack
+
+ +
+ +
+ +Home +GEMDOSGEMDOS +Memory managementMemory management +System functionsSystem functions + + diff --git a/en/gemdos_pipes.html b/en/gemdos_pipes.html new file mode 100644 index 000000000..b09c2828f --- /dev/null +++ b/en/gemdos_pipes.html @@ -0,0 +1,47 @@ + + + + + +The documentation for TOS: Pipes, Test for + + + + + + + + + +Home +GEMDOSGEMDOS +GEMDOS error-messagesGEMDOS error-messages +The program formatThe program format + +
+ +

5.4 Pipes, Test for

+

To test whether pipes are present, one can proceed as follows: +

+
    +
  • Is Drive U present? +
      +

  • +
  • Is there a directory PIPE there? +
      +

  • +
  • Are files created there really pipes, i.e. does Fxattr after a +Fcreate return the type PIPE? +
      +

  • +
+ +
+ +Home +GEMDOSGEMDOS +GEMDOS error-messagesGEMDOS error-messages +The program formatThe program format + + diff --git a/en/gemdos_process.html b/en/gemdos_process.html new file mode 100644 index 000000000..5da573261 --- /dev/null +++ b/en/gemdos_process.html @@ -0,0 +1,5422 @@ + + + + + +The documentation for TOS: Process functions + + + + + + + + + +Home +GEMDOSGEMDOS +Date and TimeDate and Time +Memory managementMemory management + +
+ +

5.11 Process functions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Pause        Suspends a process until the arrival of a signal. +
Pdomain      Sets or inquires the processes' execution domain. +
Pexec        Loads and executes a further program. +
Pfork        Creates a copy of the current process. +
Pgetauid     Gets the user ID of a process at the beginning. +
Pgetegid     Gets the effective group ID of a process. +
Pgeteuid     Gets the effective user ID of a process. +
Pgetgid      Gets the group ID of a process. +
Pgetgroups   gets the supplementary group ids for the calling process. +
Pgetpgrp     Gets current process group number. +
Pgetpid      Gets current process ID. +
Pgetppid     Gets process ID for parent process. +
Pgetpriority Gets the current priority value for a process. +
Pgetuid      Gets the user ID of a process. +
Pkill        Sends a signal to a process. +
Pmsg         Sends and receives messages. +
Pnice        Alters priority of the calling process. +
Prenice      Adjusts priority of a specified process. +
Prusage      Gets resource information about current process. +
Psemaphore   Creates, uses or destroys a semaphore. +
Psetauid     Sets user ID of a process at the start. +
Psetegid     Sets effective group ID of a process. +
Pseteuid     Sets effective user ID of a process. +
Psetgid      Alters group ID of a process. +
Psetgroups   Sets the supplementary group ids for the calling process. +
Psetlimit    Sets/gets limits of the system resources. +
Psetpgrp     Sets/gets process group number of a process. +
Psetpriority Sets the current priority value for a process. +
Psetregid    Sets the real and/or effective group ID for the calling +process. +
Psetreuid    Sets the real and/or effective user ID for the calling process. +
Psetuid      Alters user ID of a process. +
Psigaction   Alters manner of signal handling. +
Psigblock    Alters signal mask. +
Psigintr     Assigns a signal to a particular exception vector. +
Psignal      Alters manner of signal handling. +
Psigpause    Sets a new signal mask and then suspends process until the +arrival of a signal. +
Psigpending  Checks which signals have been sent but not processed. +
Psigreturn   Prepares exit from a signal-handler. +
Psigsetmask  Sets/replaces a signal mask. +
Psysctl      Gets or sets system information. +
Pterm        Terminates program and returns value to caller. +
Pterm0       Terminates program and returns 0 to caller. +
Ptermres     Terminates program but leaves it in memory. +
Ptrace       Process tracing and debugging. +
Pumask       Sets initial creation mask for files/directories. +
Pusrval      Sets/interrogates specific process information. +
Pvfork       Creates copy of the current process. +
Pwait        Tries to get the exit code of waiting or terminated child +process. +
Pwait3       Gets exit code of any waiting or terminated children of the +calling process. +
Pwaitpid     Gets exit code information about one or more child processes. + +
+ +

See also: Memory management   Signals   Task-Manager +

+

5.11.1 Pause

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pause« - Suspend a process until the arrival of a signal. +
  +
Opcode: 289 +
  +
Syntax: void Pause ( void ); +
  +
Description: The function Pause suspends the calling process until a signal +for this arrives. If a signal-handler has been installed for this signal +with Psignal, the handler will be called before the function Pause +returns. +
  +
The function will not return if the signal-handler executes a +non-local jump (via longjump), or if the program is terminated. +
  +
Return value: The function has no direct return result. +
  +
Availability: As of the first in MultiTOS integrated MiNT version 1.04 and +MagiC as of Version 4.50. +
  +
Group: Process functions +
  +
See also: Binding   Psigblock   Psignal   Psigpause   Psigsetmask   +Signals +
  + +
+ +

5.11.1.1 Bindings for Pause

+ + + + + + +
C: void Pause ( void ); +
  +
Assembler: +
  +
move.w    #289,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

5.11.2 Pdomain

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pdomain« - Set or get the caller's execution domain. +
  +
Opcode: 281 +
  +
Syntax: int16_t Pdomain ( int16_t dom ); +
  +
Description: The function Pdomain serves for setting or obtaining the domain +in which the process is executed. This domain can influence the +behaviour of the process drastically in parts. The following apply: +
  + + + + + + + + + + + + + + + +
dom Meaning +
    +
-1 Get currently valid domain (don't change it) + + +
 0 TOS-domain (default value). In this domain all +system calls behave exactly as under normal TOS. + + +
 1 MiNT-domain. In this domain the behaviour of Fread and +Fwrite is influences by the parameters set for Fcntl when these are +applied to a terminal. Furthermore, filenames returned by Fsfirst or +Fsnext are handled in a different way. + +
+ +
Note: MiNT-compatible processes should also be able to +deal with files that do not correspond to the standard DOS +convention (8+3 characters). +
  +
Return value: The function returns the domain of the process that was valid +at the function call. +
  +
Availability: As of the first in MultiTOS integrated MiNT version 1.04 and +MagiC as of Version 4.0 (05.11.1995). +
  +
Group: Process functions +
  +
See also: Binding   Dpathconf   Dopendir +
  + +
+ +

5.11.2.1 Bindings for Pdomain

+ + + + + + +
C: int16_t Pdomain ( int16_t dom ); +
  +
Assembler: +
  +
move.w    dom,-(sp)    ; Offset 2
+move.w    #281,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

5.11.3 Pexec

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Program execution« - Load and execute a program. +
  +
Opcode: 75 +
  +
Syntax: int32_t Pexec ( uint16_t mode, ... ); +
  +
Description: The function Pexec loads and launches a program. With the +parameter mode one can select from several variants: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
mode Meaning +
  +
0 int32_t Pexec (0, int8_t *name, int8_t *cmdline, int8_t *env); +
  +
Load and go: Loads and launches the program specified in +name and passes the command line cmdline. Returns a +WORD exit code when the child terminates. The following apply for the +parameter env: +
  + + + + + + +
-1 = Do not create an environment +
NULL = Inherit the environment of the parent + +
+ +
Any other value is a pointer to the environment to be inherited. +
  +
3 PD *Pexec (3, int8_t* name, int8_t *cmdline, int8_t *env); +
  +
Load, don't go: This is used most often for launching +overlays or for loading programs in a debugger. Corresponds to +mode 0 with the difference that the program is not launched +immediately, but that a pointer to the child processes' basepage is +returned as a LONG. The parent owns the memory of the child's +environment and basepage and hence must free them when finished with +the child. +
  +
4 int32_t Pexec (4, 0L, PD *basepage, 0L); +
  +
Just go: Launches an already loaded program with +basepage at the specified address. The basepage should have been +created with mode 3 or 5. +
  +
5 PD *Pexec (5, 0L, int8_t *cmdline, int8_t *env); +
  +
Create basepage: First of all GEMDOS creates a new +environment. Then the largest block of free memory is allocated and a +basepage is created in the first 256 bytes. The following applies for +the parameter env: +
  + + + + + + +
-1 = Do not create an environment +
NULL = Inherit the environment of the parent + +
+ +
Any other value is a pointer to the environment to be inherited. +
  +
With MiNT, use of this mode in conjunction with mode 3 +can be used to emulate the Pvfork call without blocking the parent. +
  +
6 int32_t Pexec (6, 0L, PD *basepage, 0L); +
  +
Just go, then free: Corresponds to mode 4 but +with the difference that the allocated memory belongs to the launched +process (child) and not to the launcher (parent); thus the basepage +memory blocks are freed automatically when the child is terminated +with Pterm. Together with mode 3 one can achieve the same +effect with it as with mode 0. This mode is available only +from GEMDOS Version 0.15. +
  +
7 PD *Pexec (7, uint32_t prgflags, int8_t *cmdline, int8_t *env); +
  +
Create basepage, respecting prgflags: Similar to +mode 5, but in prgflags one can pass the same +information as in the ph_prgflags field of the program header. This +mode is used by the BIOS of the TT030 to launch GEM, and is only +available as of GEMDOS Version 0.19. +
  +
100 int32_t Pexec (100, int8_t *name, int8_t *cmdline, int8_t +*env); +
  +
Load, go, don't wait: Similar to mode 0, only +the caller does not wait until the launched program is terminated, +i.e. the parent process is returned to immediately while the child +continues to excecute. The return value is a negative error-code or +the positive PID of the child. +
  +
101 As this mode is only used internally by MagiC for inheriting +path and file handles, the details of the exact syntax will be forgone +here. +
  +
102 Is used internally by MagiC to remove a given process. +Therefore the details of the exact syntax will be forgone here. +
  +
104 int32_t Pexec (104, int8_t *name, PD *basepage, 0L); +
  +
Just go, don't wait: Similar to mode 4, only the +caller does not wait until the launched program is terminated. A +process will be launched whose basepage was set earlier with mode +3, 5 or 7. One should note that the environment and the +basepage of the child is also owned by the parent (in fact the child +inherits all the memory that is possessed by the parent). The +parameter name is a pointer to a string that describes the +name of the new process; with a NULL value the name of the parent +process will be used. The function returns a negative error-code, or +the positive PID of the child. +
  +
106 int32_t Pexec (106, int8_t *name, PD *basepage, 0L); +
  +
Just go, don't wait, no sharing: Similar to mode +104, however the environment and basepage of the child are +not in the possession of the parent, and the child has no +access to memory that was allocated to the parent process. At the +termination of the child its memory is released again. In combination +with mode 3, therefore, Pexec (106, ...) corresponds to +mode 100 (while mode 3 followed by mode 6 +corresponds to a call of Pexec (0, ...)). +
Is no longer supported from MagiC 2.0 onwards. +
  +
107 Corresponds essentially with mode 7, and is used +internally by MagiC since version 2.10. Hence the details of the exact +syntax will be forgone here. +
  +
108 Is used by MagiC since version 2.10 internally for launching a +desk accessory. Since the exact syntax is not officially documented, +it is better for own programs to fall back on shel_write. +
  +
200 int32_t Pexec (200, int8_t *name, int8_t *cmdline, int8_t +*env); +
  +
Replace program and go: Similar to mode 100, +however the new process overwrites the old one completely. Though the +old process retains its PID and most of its attributes, all the memory +it occupied will be released. While Pexec (0, ...) can be taken as a +subprogram call (call...return), this mode acts more like a 'goto'. +
  +
300 +
  +
301 +
  +
401 Is used internally by MagiC. Therefore the details of the exact +syntax will be forgone here. +
  + +
+ +
Note: Not all the modes are available under all +varieties of operating system; therefore careful note should be taken +of the return value of the function. Unknown modes results in a +function return of EINVFN. +
  +
Command lines are passed as a Pascal format string, i.e. +the first byte contains the length of the line (maximum 124 +characters). +
  +
Return value: Return value: The function returns the exit code of the +child process. If an overlay was loaded, the result contains the +basepage of the overlay. With a negative result, an error has arisen. +
  +
Availability: All GEMDOS versions. +
  +
Group: Process functions +
  +
See also: Binding   shel_write   Program flags   ARGV procedure +
  + +
+ +

5.11.3.1 Bindings for Pexec

+ + + + + + + + + +
C: int32_t Pexec ( uint16_t mode, ... ); +
  +
Assembler: +
  +
pea       env          ; Offset 12
+pea       cmdline      ; Offset  8
+pea       name         ; Offset  4
+move.w    mode,-(sp)   ; Offset  2
+move.w    #75,-(sp)    ; Offset  0
+trap      #1           ; GEMDOS
+lea       $10(sp),sp   ; Correct stack
+
+
GFA-Basic Adresse%=Gemdos(&H4B,W:mode%,L:name%,L:cmdline%,L:env) +
  + +
+ +

5.11.4 Pfork

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pfork« - Create a copy of the current process. +
  +
Opcode: 283 +
  +
Syntax: int16_t Pfork ( void ); +
  +
Description: The function Pfork creates a copy of the current process. The +child process inherits a copy of the address space of the parent +process, i.e. changes made to variables by the child have no effect on +the parent. +
  +
The newly created process starts its work when the function +Pfork returns. +
  +
If the parent is in supervisor-mode when this call is made, the +child is launched in user-mode anyway. +
  +
New processes launched with this call should not use Mshrink, +but are required to do any GEM initialisation such as appl_init and +v_openvwk again (if they need to use GEM). Both parent and child +use Pterm or Pterm0 to terminate themselves. +
  +
Return value: The function can return the following results: +
  + + + + + + + + + +
E_OK  : In child process +
>0    : New process ID in parent process +
ENSMEM: Not enough memory available to create the new process + +
+ +
Availability: As of the first in MultiTOS integrated MiNT version 1.04. +
  +
Group: Process functions +
  +
See also: Binding   Pexec   Pvfork   Threads +
  + +
+ +

5.11.4.1 Bindings for Pfork

+ + + + + + +
C: int16_t Pfork ( void ); +
  +
Assembler: +
  +
move.w    #283,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

5.11.5 Pgetauid

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pgetauid« - Get user ID of a process at the start. +
  +
Opcode: 325 (0x0145) +
  +
Syntax: int16_t Pgetauid ( void ); +
  +
Description: The function Pgetauid obtains the start user ID of the current +process. Together with Psetauid one can use it in a multi-user +environment to ascertain who was the first logged-in user. +
  +
Return value: The return value is the start user ID of the process. +
  +
Availability: From MiNT 1.11 onwards. +
  +
Group: Process functions +
  +
See also: Binding   Psetauid +
  + +
+ +

5.11.5.1 Bindings for Pgetauid

+ + + + + + +
C: int16_t Pgetauid ( void ); +
  +
Assembler: +
  +
move.w    #325,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

5.11.6 Pgetegid

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pgetegid« - Get effective group ID of a process. +
  +
Opcode: 313 +
  +
Syntax: int32_t Pgetegid ( void ); +
  +
Description: The function Pgetegid returns the effective group ID of the +current process and resembles the system call Pgetgid. The difference +lies in that here the effective group ID is returned. +
  +
This is normally identical to the actual group ID; however, if a +program is running that has set the setgid bit, its effective group ID +is equal to the (actual) ID of the owner of this program file. +
  +
File accesses are based, among other things, on the effective +group ID, so that the setgid mechanism allows users (particularly the +super-user) to permit access by other users. +
  +
Return value: The return value is the effective group ID of the process. +
  +
Availability: Available when a 'MiNT' cookie with a version of at least 0.95 +exists. +
  +
Group: Process functions +
  +
See also: Binding   Pgetuid   Pgetgid   Pgeteuid +
  + +
+ +

5.11.6.1 Bindings for Pgetegid

+ + + + + + +
C: int32_t Pgetegid ( void ); +
  +
Assembler: +
  +
move.w    #313,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

5.11.7 Pgeteuid

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pgeteuid« - Get effective user ID of a process. +
  +
Opcode: 312 +
  +
Syntax: int32_t Pgeteuid ( void ); +
  +
Description: The function Pgeteuid returns the effective user ID of the +current process and resembles the system call Pgetuid. The difference +lies in that here the effective user ID is returned. +
  +
This is normally identical to the actual user ID; however, if a +program is running that has set the setuid bit, its effective user ID +is equal to the (actual) ID of the owner of this program file. +
  +
File accesses are based, among other things, on the effective +user ID, so that the setuid mechanism allows users (particularly the +super-user) to permit access by other users. +
  +
Return value: The return value is the effective user ID of the process. +
  +
Availability: Available when a 'MiNT' cookie with a version of at least 0.95 +exists. +
  +
Group: Process functions +
  +
See also: Binding   Pgetuid   Pgetgid   Pgetegid +
  + +
+ +

5.11.7.1 Bindings for Pgeteuid

+ + + + + + +
C: int32_t Pgeteuid ( void ); +
  +
Assembler: +
  +
move.w    #312,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

5.11.8 Pgetgid

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pgetgid« - Get group ID of a processes. +
  +
Opcode: 276 +
  +
Syntax: int16_t Pgetgid ( void ); +
  +
Description: The function Pgetgid returns the actual group ID of the current +calling processes. This is as number between 0 and 255, which sets the +rights of the process group. +
  +
Return value: The return value is the actual group ID of the process. +
  +
Availability: As of the first in MultiTOS integrated MiNT version 1.04. +
  +
Group: Process functions +
  +
See also: Binding   Pgetuid   Pgeteuid   Pgetegid +
  + +
+ +

5.11.8.1 Bindings for Pgetgid

+ + + + + + +
C: int16_t Pgetgid ( void ); +
  +
Assembler: +
  +
move.w    #276,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

5.11.9 Pgetgroups

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pgetgroups« - Gets the supplementary group IDs for the +calling process. +
  +
Opcode: 327 (0x0147) +
  +
Syntax: int32_t Pgetgroups( int16_t len, int16_t *gidset); +
  +
Description: The function Pgetgroups obtains the supplementary group IDs for +the calling process. +
  +
len specifies the length (in words) of the array to be +filled with the supplementary group IDs available. This value must be +a positive number not greater than NGROUPS_MAX. If len is a +zero, the call will return the number of supplementary group ids +currently available for the calling process. +
  +
gidset is a pointer to a word array to be filled with +retrieved ids. +
  +
The NGROUPS_MAX value is returned by Sysconf(). +
  +
Return value: Returns a number of supplementary group IDs for the process on +success or a negative GEMDOS error code otherwise. +
  +
Availability: This function is available from MiNT 1.11 onwards. +
  +
Group: Process functions +
  +
See also: Binding   Psetgroups   Sysconf +
  + +
+ +

5.11.9.1 Bindings for Pgetgroups

+ + + + + + +
C: int32_t Pgetgroups( int16_t len, int16_t *gidset); +
  +
Assembler: +
  +
pea       gidset       ; Offset 4
+move.w    len,-(sp)    ; Offset 2
+move.w    #327,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #8,sp        ; Correct stack
+
+ +
+ +

5.11.10 Pgetpgrp

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pgetpgrp« - Get current group number. +
  +
Opcode: 269 +
  +
Syntax: int16_t Pgetpgrp ( void ); +
  +
Description: The function Pgetpgrp returns the group number code of the +currently active process. Process groups are normally used for +job-control and similar purposes. +
  +
Return value: Process group number of the active process. +
  +
Availability: As of the first in MultiTOS integrated MiNT version 1.04. +
  +
Group: Process functions +
  +
See also: Bindings for Pgetpgrp   Pkill   Pgetpid   Psetpgrp +
  + +
+ +

5.11.10.1 Bindings for Pgetpgrp

+ + + + + + +
C: int16_t Pgetpgrp ( void ); +
  +
Assembler: +
  +
move.w    #269,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

5.11.11 Pgetpid

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pgetpid« - Get current process ID. +
  +
Opcode: 267 (0x010b) +
  +
Syntax: int16_t Pgetpid ( void ); +
  +
Description: The function Pgetpid returns the PID of the currently active +(calling) process, i.e. the one that currently 'owns' the CPU; this is +the filetype under which the current process is administered in the +directory U:\PROC. +
  +
A PID is dynamically assigned to a process when it is created. +You should make no assumption on the PID a process may have. For the +kernel, the PID is a WORD but when you program in C, you should use +the pid_t type, which complies with the POSIX standard. The FreeMiNT +kernel's PID is always 0. +
  +
The PID is useful when it is important to identify a process +among others in the system. Knowing the PID of a program, it is +possible to do a lot of things: send it a signal with Psignal(), look +for its name in /proc by searching with a "*.xxx" mask (xxx +is the PID of the program which name we wanna know), etc. +
  +
Return value: PID of the active processes. +
  +
Availability: The function is available in MagiC from Version 3.0 on and +under MiNT. +
  +
Group: Process functions +
  +
See also: Binding   Pgetpgrp   Pgetppid +
  + +
+ +

5.11.11.1 Bindings for Pgetpid

+ + + + + + +
C: int16_t Pgetpid ( void ); +
  +
Assembler: +
  +
move.w    #267,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

5.11.12 Pgetppid

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pgetppid« - Get process ID for parent process. +
  +
Opcode: 268 (0x010c) +
  +
Syntax: int16_t Pgetppid ( void ); +
  +
Description: The function Pgetppid returns the PID of the parent process of +the currently active (calling) process. +
  +
In the FreeMiNT kernel, processes are represented as a tree. The +root of the tree is the kernel itself (PID 0). At boot time, the +kernel launches another process (which can be 'init' in case of a +Unix-like setup, or an AES, a shell or whatever) specified by the +INIT or GEM keyword in the mint.cnf file. This process will launch +other processes (daemons, accessories, programs etc) that are its +so-called children. +
  +
Therefore, every process (but the kernel, obviously) is created +by its so-called parent. The Pgetppid() (get parent's PID) call allows +determination the PID of the parent of the calling process. To have a +good illustration of this, you can use the 'ps' command in your shell. +You will see that all accessories parent is the AES, and that the +daemons are started by the 'init' program. +
  +
Return value: Process ID of the parent (positive). If the current process was +started directly from the kernel, 0 will be returned. A return value +of -1 signals that the process has no parent. +
  +
Availability: As of the first in MultiTOS integrated MiNT version 1.04 and +MagiC as of Version 3.0. +
  +
Group: Process functions +
  +
See also: Binding   Pgetpgrp   Pgetpid +
  + +
+ +

5.11.12.1 Bindings for Pgetppid

+ + + + + + +
C: int16_t Pgetppid ( void ); +
  +
Assembler: +
  +
move.w    #268,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

5.11.13 Pgetpriority

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pgetpriority« - Get the current priority value for a +process. +
  +
Opcode: 344 (0x0158) +
  +
Syntax: int32_t Pgetpriority ( int16_t which, int16_t who); +
  +
Description: The function Pgetpriority obtains the priority of the processes +specified by which and who. The interpretation of +parameter who depends on which: +
  + +
PRIO_PROCESS (0) reads the priority of process with process ID +who. A who of 0 implies the process id of the calling +process. +
  + +
PRIO_PGRP (1) reads the priority of the process group with +process group ID who. If the priorities of the process differ, +the lowest valued priority (i.e. the highest CPU usage priority) is +returned. A who of 0 implies the process group id of the +calling process. +
  + +
PRIO_USER (2) reads the priority of the process of the user with +user ID who. For multiple processes the lowest valued priority +is returned. A who of 0 implies the user id of the calling +process. +
  +
Library functions should first check for an error condition and +then decrement the returned value by 20. +
  +
This call makes calls Pnice and Prenice obsolete. +
  +
Return value: Return value is either a negative error number in case of +failure or the requested priority + 20 on success. +
  +
Availability: MiNT 1.15.0 +
  +
Group: Process functions +
  +
See also: Binding   Psetpriority +
  + +
+ +

5.11.13.1 Bindings for Pgetpriority

+ + + + + + +
C: int32_t Pgetpriority ( int16_t which, int16_t who); +
  +
Assembler: +
  +
move.w    who,-(sp)    ; Offset 4
+move.w    which,-(sp)  ; Offset 2
+move.w    #344,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

5.11.14 Pgetuid

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pgetuid« - Get user ID of a process. +
  +
Opcode: 271 +
  +
Syntax: int16_t Pgetuid ( void ); +
  +
Description: The function Pgetuid returns the actual user ID of the current +(calling) process. This is a number between 0 and 255 that determines +the access rights permissions of the process, and can be used to +differentiate the individual users in multi-user systems. +
  +
Return value: The return value is the actual user ID of the process. +
  +
Availability: As of the first in MultiTOS integrated MiNT version 1.04. +
  +
Group: Process functions +
  +
See also: Binding   Pgetgid   Pgeteuid   Pgetegid +
  + +
+ +

5.11.14.1 Bindings for Pgetuid

+ + + + + + +
C: int16_t Pgetuid ( void ); +
  +
Assembler: +
  +
move.w    #271,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

5.11.15 Pkill

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pkill« - Send a signal to one or more processes. +
  +
Opcode: 273 +
  +
Syntax: int32_t Pkill ( int16_t pid, int16_t sig ); +
  +
Description: The function Pkill sends the signal sig to one or more +processes. The following apply for the parameter pid: +
  + + + + + + + + + + + + + + + +
pid Meaning +
    +
> 0 The signal will be sent to the process with the specified +pid +
= 0 The signal will be sent to all processes of the corresponding +process group (this includes the caller itself too!) +
< 0 The signal will be sent to all processes with the group number +-pid + +
+ +
The signal SIGNULL is not handled by Pkill in the usual way. It +can be used to test the existence of a process. For this one sends it +a SIGNULL, and checks whether Pkill returns with the value 0. +
  +
Since MagiC 6.01 (1998.10.10) are also PIDs < 0 supported. +
  +
Return value: The function can return the following results: +
  + + + + + + + + + + + + +
E_OK  : No error has arisen +
EFILNF: If pid > 0 and the specified process no longer +exists, or if pid < 0 and the specified process group has +no members any more +
EACCDN: If pid > 0, and the sending process has no EUID of 0 +and in addition if the UID of the receiving process differs from the +sending one +
ERANGE: sig is an invalid signal + +
+ +
Note: If the current process receives the signal iself +and is terminated, the function does not return! +
  +
Availability: As of the first in MultiTOS integrated MiNT version 1.04 and +MagiC as of Version 4.50. +
  +
Group: Process functions +
  +
See also: Binding   Psetpgrp   Psignal   Signals +
  + +
+ +

5.11.15.1 Bindings for Pkill

+ + + + + + +
C: int32_t Pkill ( int16_t pid, int16_t sig ); +
  +
Assembler: +
  +
move.w    sig,-(sp)    ; Offset 4
+move.w    pid,-(sp)    ; Offset 2
+move.w    #273,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

5.11.16 Pmsg

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pmsg« - Send and receive messages. +
  +
Opcode: 293 +
  +
Syntax: int32_t Pmsg ( int16_t mode, int32_t mbox, void *msg ); +
  +
Description: The function Pmsg sends or receives a message to or from a +'mail box'. The operation to be executed in each case can be set with +the bits of the parameter mode. The following apply: +
  + + + + + + + + + + + + + + + + + + +
mode Operation +
    +
0x0000 Block the process and don't return until a message is read from +the specified mailbox mbox and placed in the structure pointed +to by msg. +
0x0001 Block the process and don't return until a process waiting for +a message with mailbox ID mbox has received the message from +the structure pointed to by msg. +
0x0002 Block the process until a process waiting for a message with +the mailbox ID mbox has received the message held in the +structure pointed to by msg and a return message is received +with mailbox ID 0xffffxxxx (where xxxx is the PID of the current +process). +
0x8000 An OR combination with this value allows the operation to be +performed in a non-blocking mode. + +
+ +
The messages are 5 words long, namely two LONGwords and one +SHORT (in that order). For this the two LONGs can be filled with any +desired information by the process, while the SHORT should have the +PID of the sender entered in it. +
  +
After the message has been sent, this SHORT contains the PID of +the process that has read the message. Conversely, after reading a +message it contains the PID of the processes that wrote the message. +
  +
If mode has the highest bit set and no readers or +writers for the mailbox mbox exist, then the value -1 will be +returned. Otherwise a read operation waits until a message has been +written, or a write operation waits until a read process is ready. +
  +
Im mode 2 the writer says that it would like to wait for +a reply. The idea behind this is that the process can put itself to +sleep, and can be reawakened later by the process that receives the +message. This will guarantee that the process that contains the +original message is not blocked when writing the reply. +
  +
Return value: The function can return the following results: +
  + + + + + + + + + +
E_OK : No error has arisen +
EINVFN : Invalid value for the parameter mode +
-1 : Bit 15 is set, and Pmsg would block + +
+ +
Availability: Available when a 'MiNT' cookie with a version of at least 0.90 +exists. +
  +
Group: Process functions +
  +
See also: Binding +
  + +
+ +

5.11.16.1 Bindings for Pmsg

+ + + + + + +
C: int32_t Pmsg ( int16_t mode, int32_t mbox, void *msg ); +
  +
Assembler: +
  +
pea       msg          ; Offset 8
+move.l    mbox,-(sp)   ; Offset 4
+move.w    mode,-(sp)   ; Offset 2
+move.w    #293,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+lea       $C(sp),sp    ; Correct stack
+
+ +
+ +

5.11.17 Pnice

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pnice« - Alter priority of the calling process. +
  +
Opcode: 266 +
  +
Syntax: int16_t Pnice ( int16_t delta ); +
  +
Description: The function Pnice alters the priority of the process calling +it by the value delta. A higher priority means that the +process receives a larger time-slice, i.e. it is not switched over so +often. In the same way, a lower priority means that the time-slice of +the process is reduced, and so it must yield time to the CPU more +often. +
  +
For the parameter delta the following must apply: +
- 20 <= delta <= 20. +
  +
The function Pnice corresponds to Prenice (Pgetpid, delta) and +is implemented for backwards compatibility. +
  +
Return value: The function returns the current process switching priority. +This is set to 0 by default. Higher or lower values mean that the +process is allocated respectively a larger or smaller time-slice. +
  +
Availability: As of the first in MultiTOS integrated MiNT version 1.04 and +MagiC since Version 6.20 (2000-01-02). +
  +
Group: Process functions +
  +
See also: Binding   Prenice +
  + +
+ +

5.11.17.1 Bindings for Pnice

+ + + + + + +
C: int16_t Pnice ( int16_t delta ); +
  +
Assembler: +
  +
move.w    delta,-(sp)  ; Offset 2
+move.w    #266,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

5.11.18 Prenice

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Prenice« - Adjust priority of a specified process. +
  +
Opcode: 295 +
  +
Syntax: int32_t Prenice ( int16_t pid, int16_t delta ); +
  +
Description: The function Prenice alters the priority of the process with +the ID pid by the value delta. A higher priority means +that the process receives a larger time-slice, i.e. it is not switched +over so often. In the same way, a lower priority means that the +time-slice of the process is reduced, and so it must yield time to the +CPU more often. +
  +
For the parameter delta the following must apply: +
- 20 <= delta <= 20. +
  +
Return value: The function returns the current process switching priority. +This is set to 0 by default. Higher or lower values mean that the +process is allocated respectively a larger or smaller time-slice. +
  +
In case of error the function returns: +
  + + + + + + +
EFILNF: The specified process does not exist +
EACCDN: The specified process has a different user ID than the calling +process + +
+ +
Availability: Available when a 'MiNT' cookie with a version of at least 0.90 +exists and MagiC since version 6.20 (2000-01-02). +
  +
Group: Process functions +
  +
See also: Bindings for Prenice   Pnice +
  + +
+ +

5.11.18.1 Bindings for Prenice

+ + + + + + +
C: int32_t Prenice ( int16_t pid, int16_t delta ); +
  +
Assembler: +
  +
move.w    delta,-(sp)  ; Offset 4
+move.w    pid,-(sp)    ; Offset 2
+move.w    #295,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

5.11.19 Prusage

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Prusage« - Obtain resource information about current +process. +
  +
Opcode: 286 +
  +
Syntax: int32_t Prusage ( int32_t *r ); +
  +
Description: The function Prusage returns information about the system +resources required by the current process. +
  +
The information is passed to the outside by a pointer r +to an array of 8 LONGs; the allocation is as follows: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
r[0]: Process time spent in MiNT kernel +
r[1]: Process time spent in its own program code +
r[2]: Total process time spent by children of this process in MiNT +kernel +
r[3]: Total process time spent by children of this process in their +own program code +
r[4]: Memory allocated by process (in bytes) +
r[5]: Reserved for future use +
r[6]: Reserved +
r[7]: Reserved + +
+ +
All times are given in milliseconds. +
  +
Return value: The function has no direct result. +
  +
Availability: As of the first in MultiTOS integrated MiNT version 1.04. +
  +
Group: Process functions +
  +
See also: Binding   Psetlimit +
  + +
+ +

5.11.19.1 Bindings for Prusage

+ + + + + + +
C: int32_t Prusage ( int32_t *r ); +
  +
Assembler: +
  +
pea       r            ; Offset 2
+move.w    #286,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

5.11.20 Psemaphore

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Psemaphore« - Create, use or destroy a semaphore. +
  +
Opcode: 308 +
  +
Syntax: int32_t Psemaphore ( int16_t mode, int32_t id, int32_t timeout +); +
  +
Description: The function Psemaphore implements non-counting semaphores. +Only one process can access a semaphore at the same time. +
  +
Semaphores can be used, for instance, to synchronise accesses to +data structures in shared memory by different subprocesses: Hence a +subprocess must try, before it accesses memory, to obtain possession +of the semaphore. This can be created during initialisation, for +instance, and removed again at program termination. +
  +
Semaphores are identified by a name. This name is a LONGword +that may contain four ASCII characters. Semaphores whose name starts +with an underscore '_' are reserved for the operating system. +
  +
The parameter timeout is only used in mode +2. The following assignments apply: +
  + + + + + + +
timeout =  0: Return immediately. +
  = -1: No timeout (wait indefinitely). + +
+ +
Other values for timeout specify the delay time in +milliseconds before a timeout occurs. +
  +
The following values are possible for the parameter +mode: +
  + + + + + + + + + + + + + + + + + + +
mode Meaning +
    +
0 Create a semaphore with the ID id (and grant ownership +to the calling process) +
1 Destroy semaphore with the ID id; this works only if +the semaphore is owned by the caller +
2 Request ownership of the semaphore with the ID id; this +blocks the caller until the semaphore becomes available, or a timeout +occurs +
3 Release ownership of semaphore with the ID id; this +works only if the semaphore is owned by the caller + +
+ +
Note: When a process creates a semaphore, it also owns +it immediately. So that other processes may use it, it must first be +released. As the creation of a semphore has to reserve internal +memory, the function should be used frugally. +
  +
If a blocked process is waiting for a semaphore (before the +timeout occurs), and a different process destroys the semaphore, then +the function Psemaphore returns with the message ERANGE, as the +requested semaphore no longer exists. +
  +
When a process terminates, all semaphores owned by it are +released automatically (but not destroyed). The ownership of a +semaphore can not be inherited (say with Pfork). If a process creates +a semaphore and then crashes, the semaphore remains and cannot be +removed any more. +
  +
In MagiC, plausibility checks ensure that no system semaphores +can be released; in addition, only modes 2 and 3 are supported at +present. +
  +
Return value: The function can return the following results: +
  + + + + + + + + + + + + +
E_OK  : No error has arisen +
ERROR : A semaphore was requested that the caller already owns +
EACCDN: An attempt was made to create a semaphore that already esists, +the caller is not the owner of the semaphore or a timeout has occurred +
ERANGE: The specified semaphore does not exist + +
+ +
Availability: Available when a 'MiNT' cookie with a version of at least 0.92 +exists and MagiC as of version 3.0. +
  +
Group: Process functions +
  +
See also: Binding   Semaphores in MagiC +
  + +
+ +

5.11.20.1 Bindings for Psemaphore

+ + + + + + +
C: int32_t Psemaphore ( int16_t mode, int32_t id, int32_t timeout +); +
  +
Assembler: +
  +
move.l    timeout,-(sp)  ; Offset 8
+move.l    id,-(sp)       ; Offset 4
+move.w    mode,-(sp)     ; Offset 2
+move.w    #308,-(sp)     ; Offset 0
+trap      #1             ; GEMDOS
+lea       $C(sp),sp      ; Correct stack
+
+ +
+ +

5.11.21 Psetauid

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Psetauid« - Set user ID of a process at the start. +
  +
Opcode: 326 (0x0146) +
  +
Syntax: int16_t Psetauid ( int16_t id ); +
  +
Description: The function Psetauid sets the starting user ID of the current +process. This can only happen once. Together with Pgetauid one can +ascertian who was the first logged-in user in a multi-user +environment. The parameter id is the desired start ID. +
  +
Warning: This function is optional, hence a call may be +answered with EINVFN. +
  +
Return value: Unknown at present. +
  +
Availability: Available when a 'MiNT' cookie with a version of at least 0.92 +exists. +
  +
Group: Process functions +
  +
See also: Binding   Pgetauid +
  + +
+ +

5.11.21.1 Bindings for Psetauid

+ + + + + + +
C: int16_t Psetauid ( int16_t id ); +
  +
Assembler: +
  +
move.w    id,-(sp)     ; Offset 2
+move.w    #326,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

5.11.22 Psetegid

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Psetegid« - Set the effective group ID for the calling +process. +
  +
Opcode: 324 (0x0144) +
  +
Syntax: int32_t Psetegid ( int16_t egid ); +
  +
Description: egid specifies the new effective group ID for the +calling process. +
  +
Prior to MiNT version 1.12, this call contained a bug affecting +its functionality. Setting effective group id needs root privileges. +
  +
This call is often used by daemon processes to downgrade their +privileges to user level. +
  +
Return value: Returns new egid on success or a negative GEMDOS +error-code otherwise. +
  +
Availability: MiNT 1.11 +
  +
Group: Process functions +
  +
See also: Binding   Pseteuid   Psetgid   Psetregid +
  + +
+ +

5.11.22.1 Bindings for Psetegid

+ + + + + + +
C: int32_t Psetegid ( int16_t egid ); +
  +
Assembler: +
  +
move.w    egid,-(sp)   ; Offset 2
+move.w    #324,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

5.11.23 Pseteuid

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pseteuid« - Sets the effective user ID for the calling +process. +
  +
Opcode: 323 (0x0143) +
  +
Syntax: int32_t Pseteuid ( int16_t euid ); +
  +
Description: euid specifies the new effective user ID for the +calling process. +
  +
Prior to MiNT version 1.12 this call contained a bug affecting +its functionality. Setting effective user ID needs root privileges. +
  +
This call is often used by daemon processes to downgrade their +privileges to user level. +
  +
Return value: Returns new euid on success or a negative GEMDOS error +code otherwise. +
  +
Availability: As of MiNT 1.11. +
  +
Group: Process functions +
  +
See also: Binding   Psetegid   Psetuid   Psetreuid +
  + +
+ +

5.11.23.1 Bindings for Pseteuid

+ + + + + + +
C: int32_t Pseteuid ( int16_t euid ); +
  +
Assembler: +
  +
move.w    euid,-(sp)   ; Offset 2
+move.w    #323,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

5.11.24 Psetgid

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Psetgid« - Alter the group ID of the calling process. +
  +
Opcode: 277 +
  +
Syntax: int16_t Psetgid ( int16_t id ); +
  +
Description: The function Psetgid sets the group ID of the current process +to id. This must be a number between 0 and 255. +
  +
Return value: The function can return the following results: +
  + + + + + + +
0-255 : No error has occurred (the new ID) +
EACCDN: The process does not have the authority to alter its ID + +
+ +
Availability: As of the first in MultiTOS integrated MiNT version 1.04. +
  +
Group: Process functions +
  +
See also: Binding   Psetuid +
  + +
+ +

5.11.24.1 Bindings for Psetgid

+ + + + + + +
C: int16_t Psetgid ( int16_t id ); +
  +
Assembler: +
  +
move.w    id,-(sp)     ; Offset 2
+move.w    #277,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

5.11.25 Psetgroups

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Psetgroups« - Sets the supplementary group IDs for the +calling process. +
  +
Opcode: 328 (0x0148) +
  +
Syntax: int32_t Psetgroups( int16_t len, int16_t *gidset); +
  +
Description: The function Psetgroups sets the supplementary group IDs for +the calling process. +
  +
len specifies the length (in words) of the array +containing the supplementary group IDs to be set. This value must be a +positive number not greater than NGROUPS_MAX. If len is a +zero, the call will return the number of supplementary group ids those +have been set. +
  +
gidset is a pointer to a word array containing the new +supplementary group IDs for the process. +
  +
Setting new supplementary group IDs needs root privileges. +
  +
The NGROUPS_MAX value is returned by Sysconf(). +
  +
Return value: Returns a number of new supplementary group IDs for the process +on success or a negative GEMDOS error code otherwise. +
  +
Availability: Available from MiNT 1.11 onwards. +
  +
Group: Process functions +
  +
See also: Binding   Pgetgroups   Sysconf +
  + +
+ +

5.11.25.1 Bindings for Psetgroups

+ + + + + + +
C: int32_t Psetgroups( int16_t len, int16_t *gidset); +
  +
Assembler: +
  +
peam      gidset       ; Offset 4
+move.w    len,-(sp)    ; Offset 2
+move.w    #328,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #8,sp        ; Correct stack
+
+ +
+ +

5.11.26 Psetlimit

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Psetlimit« - Set or obtain allocation limits of the system +resources. +
  +
Opcode: 287 +
  +
Syntax: int32_t Psetlimit ( int16_t lim, int32_t value ); +
  +
Description: The function Psetlimit serves for setting or obtaining resource +allocation limits for the current process. The parameter lim +determines the desired resource type: +
  + + + + + + + + + + + + + + + +
lim Meaning +
    +
1 Max. CPU-time for the process (milliseconds) +
2 Max. total memory allowed for process in bytes +
3 Max. allocatable memory for the process (in bytes) + +
+ +
The difference between 2 and 3 is that the total memory also +includes the TEXT, DATA and BSS segments of the process. +
  +
With the help of this function the resource allocation limits +are set both for the current process as well as individually for all +child processes created later. So if a process sets a CPU limit and +later creates several child processes, then this CPU limit applies +also for each individual child process, and not, say, for all child +processes together. +
  +
The parameter value determines the maximum value that a +resource is allowed to take. A value of 0 here means that the resource +is unlimited. A negative value here returns the current value, leaving +it unaltered. +
  +
Note: There are no restrictions on increasing the +limits. Each process may alter any of its limits or even set it to +unlimited. +
  +
Memory allocation limits do not apply for Pexec. If, say, a +process is limited to 256 kbyte, it can nevertheless use Pexec to +launch a child process that uses more memory. Warning: This +does not apply in MagiC; here memory limits are inherited at +Pexec! +
  +
Memory limitations are not valid retrospectively. If, for +instance, a process owns 256 kbyte and then calls Psetlimit to reduce +its requirements to 128 kbyte, then though it will not be terminated, +it can not allocate any memory any more until its size falls under the +specified 128 kbyte. +
  +
Limitations of the CPU-time on the other hand do act +retrospectively. If a process reduces its CPU-time below the +previously valid value, then it will receive a SIGXCPU signal +immediately. +
  +
Warning: Invalid function numbers and those that are not +supported by MagiC return EINVFN. +
  +
Note about MagiC: If a program has been modified with +the utility program LIMITMEM, then this setting takes precedence over +the calling process' memory limit. Psetlimit is supported by the +extended shel_write mode; due to this, memory-limited applications may +also be started in parallel. +
  +
Return value: The function returns the old limit value. +
  +
Availability: MagiC from Version 4.0 (17.09.1996) onwards and as of the first +in MultiTOS integrated MiNT version 1.04. +
  +
Group: Process functions +
  +
See also: Binding   Prusage   Signals +
  + +
+ +

5.11.26.1 Bindings for Psetlimit

+ + + + + + +
C: int32_t Psetlimit ( int16_t lim, int32_t value ); +
  +
Assembler: +
  +
move.l    value,-(sp)  ; Offset 4
+move.w    lim,-(sp)    ; Offset 2
+move.w    #287,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #8,sp        ; Correct stack
+
+ +
+ +

5.11.27 Psetpgrp

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Psetpgrp« - Get/Set process group number of a process. +
  +
Opcode: 270 +
  +
Syntax: int16_t Psetpgrp ( int16_t pid, int16_t newgrp ); +
  +
Description: The function Psetpgrp alters the group number of the process +with the ID pid to the value newgrp, or inquires the +group number if newgrp is negative. The process must have the +same UID as the current process, or be the parent of it. +
  +
If pid = 0, the process group of the current process +will be set. If newgrp = 0, the process group will be set to +the value of the PID of the current process. +
  +
Return value: The function can return the following results: +
  + + + + + + + + + +
>= 0  : No error (new or current process group number) +
EFILNF: The process pid does not exist +
EACCDN: The process pid has a different UID, and is not a child +of the calling process + +
+ +
Availability: As of the first in MultiTOS integrated MiNT version 1.04. +
  +
Group: Process functions +
  +
See also: Binding   Pkill   Pgetpgrp   Pgetpid +
  + +
+ +

5.11.27.1 Bindings for Psetpgrp

+ + + + + + +
C: int16_t Psetpgrp ( int16_t pid, int16_t newgrp ); +
  +
Assembler: +
  +
move.w    newgrp,-(sp)  ; Offset 4
+move.w    pid,-(sp)     ; Offset 2
+move.w    #270,-(sp)    ; Offset 0
+trap      #1            ; GEMDOS
+addq.l    #6,sp         ; Correct stack
+
+ +
+ +

5.11.28 Psetpriority

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Psetpriority« - Set the current priority value for a +process. +
  +
Opcode: 345 (0x0159) +
  +
Syntax: int32_t Psetpriority ( int16_t which, int16_t who, int16_t pri +); +
  +
Description: The function Psetpriority sets the priority pri (not an +increment but an absolute value) for the processes specified by +which and who. The interpretation of parameter +who depends on which: +
  +
PRIO_PROCESS (0) sets the priority of process with process ID +who. A who of 0 implies the process ID of the calling +process. +
  +
PRIO_PGRP (1) sets the priority of the process group with +process group ID who. A who of 0 implies the process +group ID of the calling process. +
  +
PRIO_USER (2) sets the priority of the process of the user with +user ID who. A who of 0 implies the user ID of the +calling process. +
  + + +
The pri argument is silently changed to the maximum +(resp. minimum) possible value if it is not in the range between +PRIO_MIN (-20) and PRIO_MAX (+20). +
  +
This call makes calls Pnice and Prenice obsolete. +
  +
Return value: The function returns E_OK on success or a negative error-code +otherwise. The following error conditions are defined: +
  +
EINVAL, invalid argument for who, which or +pri. +
  +
EACCES, the calling process is not an owner of one or more of +the selected processes; the other selected processes are still +affected +
  +
EPERM, the calling process does not have privileges to change +the priority of one or more of the selected processes; this can only +happen if an attempt was made to change the priority of a process to a +positive value +
  +
ESRCH, the combination of which and who does not +match any existing process. +
  +
The error condition reported is the last error condition +encountered (in other words if both EACCES and EPERM occur the return +value is arbitrary). +
  +
Availability: As of MiNT 1.15.0 +
  +
Group: Process functions +
  +
See also: Binding   Pgetpriority +
  + +
+ +

5.11.28.1 Bindings for Psetpriority

+ + + + + + +
C: int32_t Psetpriority ( int16_t which, int16_t who, int16_t pri +); +
  +
Assembler: +
  +
move.w    pri,-(sp)    ; Offset 6
+move.w    who,-(sp)    ; Offset 4
+move.w    which,-(sp)  ; Offset 2
+move.w    #345,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #8,sp        ; Correct stack
+
+ +
+ +

5.11.29 Psetregid

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Psetregid« - Set the real and/or effective group ID for the +calling process. +
  +
Opcode: 335 (0x014f) +
  +
Syntax: int32_t Psetregid ( int16_t rgid, int16_t egid); +
  +
Description: The function Psetregid sets the real and/or effective group ID +for the calling process. +
  +
rgid specifies the new real group ID and egid +specifies the new effective group ID for the calling process. If +either argument is -1, only the other gets changed +
  +
Setting group IDs needs root privileges. +
  +
This call is often used by daemon processes to downgrade their +privileges to user level. +
  +
Return value: Returns E_OK on success or a negative error-code otherwise. +
  +
Availability: As of MiNT 1.12. +
  +
Group: Process functions +
  +
See also: Binding   Psetreuid   Psetegid +
  + +
+ +

5.11.29.1 Bindings for Psetregid

+ + + + + + +
C: int32_t Psetregid ( int16_t rgid, int16_t egid); +
  +
Assembler: +
  +
move.w    egid,-(sp)   ; Offset 4
+move.w    rgid,-(sp)   ; Offset 2
+move.w    #335,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

5.11.30 Psetreuid

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Psetreuid« - Sets the real and/or effective user ID for the +calling process. +
  +
Opcode: 334 (0x014e) +
  +
Syntax: int32_t Psetreuid ( int16_t ruid, int16_t euid); +
  +
Description: The function Psetreuid sets the real and/or effective user ID +for the calling process. +
  +
ruid specifies the new real user ID and euid +specifies the new effective user ID for the calling process. If either +argument is -1, only the other gets changed. +
  +
Setting user ids needs root privileges. +
  +
This call is often used by daemon processes to downgrade their +privileges to user level. +
  +
Return value: Returns E_OK on success or a negative GEMDOS error code +otherwise. +
  +
Availability: As of MiNT 1.12. +
  +
Group: Process functions +
  +
See also: Binding   Psetregid   Pseteuid +
  + +
+ +

5.11.30.1 Bindings for Psetreuid

+ + + + + + +
C: int32_t Psetreuid ( int16_t ruid, int16_t euid); +
  +
Assembler: +
  +
move.w    euid,-(sp)   ; Offset 4
+move.w    ruid,-(sp)   ; Offset 2
+move.w    #334,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

5.11.31 Psetuid

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Psetuid« - Alter the user ID of a process. +
  +
Opcode: 272 +
  +
Syntax: int16_t Psetuid ( int16_t id ); +
  +
Description: The function Psetuid sets the user ID of the current process to +id. This must be a number between 0 and 255. The function +fails if the user ID of the process does not have the value 0, i.e. +once set, the user ID can no longer be altered. +
  +
Return value: The function can return the following results: +
  + + + + + + +
0-255 : No error has occurred (the new ID) +
EACCDN: The process does not have authority to alter its ID + +
+ +
Availability: As of the first in MultiTOS integrated MiNT version 1.04. +
  +
Group: Process functions +
  +
See also: Binding   Psetgid +
  + +
+ +

5.11.31.1 Bindings for Psetuid

+ + + + + + +
C: int16_t Psetuid ( int16_t id ); +
  +
Assembler: +
  +
move.w    id,-(sp)     ; Offset 2
+move.w    #272,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

5.11.32 Psigaction

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Psigaction« - Set default action for a specified signal. +
  +
Opcode: 311 +
  +
Syntax: int32_t Psigaction ( int16_t sig, struct sigaction *act, struct +sigaction *oact ); +
  +
Description: The function Psigaction alters the response to the signal +sig. The parameter act for this is either NULL, or +points to a sigaction structure that describes the behaviour of the +signal handling. The following applies for the component +sa_handler: +
  + + + + + + + + + + + + +
sa_handler Meaning +
    +
0 On arrival of the signal the default action for the signal will +be executed +
1 The signal sig will be ignored; If it currently +present, it will be deleted + +
+ +
Any other value of sa_handler is interpreted as an +address of a function that will be called when the signal occurs. This +function is passed a LONG value via the stack that corresponds to the +relevant signal number. In this way it is possible to use the +signal-handler for several signals. +
  +
While a signal is being processed, it cannot be sent again. +Furthermore, one should note that (in contrast to some Unix versions) +the signal handling before the execution of the handler is not reset +to the default handler. +
  +
The signal-handler must either be terminated with RTS +(Return To Sender), or Psigreturn called to +indicate that the signal handling has been concluded. Following this, +the blocking of the signal will be lifted. Psigreturn additionally +performs some internal mopping up in the kernel, necessary in case the +signal-handler is not terminated (longjump). +
  +
Signal-handlers can make any BIOS, XBIOS and GEMDOS calls. +AES or VDI calls on the other hand are not permitted. However +this does not apply in MagiC; here one needs to heed several +differences. +
  +
A Psigaction call has the side effect that the signal will be +unmasked (i.e. released). In this way a process, while handling a +signal, can reset it and then send it to itself again - for instance +to suspend itself while a signal for job-control is processed. The +signal handling is secured against Pfork/Pvfork. +
  +
Signals that are ignored by a process will also be ignored by its +child after a Pexec call. Additionally, signals that are intercepted +by a signal-handler will be reset in the child process to the default +value. +
  +
The component sa_flags of the sigaction structure +defines an additional, signal-specific behaviour: If sig is +the signal SIGCHLD, and the SA_NOCLDSTOP bit is set in +sa_flags, then SIGCHLD is sent to the process only when one of +its children terminates (and not just when a child is suspended by a +job-control signal). +
  +
Return value: The function can return the following results: +
  + + + + + + + + + +
E_OK  : No error has arisen +
EACCDN: Signal cannot be intercepted by the user +
ERANGE: sig is an invalid signal + +
+ +
Availability: Available when a 'MiNT' cookie with a version of at least 0.95 +exists, and MagiC as of Version 4.50. +
  +
Group: Process functions +
  +
See also: Binding   Pkill   Psigblock   Psignal   Psigreturn   Signals +
  + +
+ +

5.11.32.1 Bindings for Psigaction

+ + + + + + +
C: int32_t Psigaction ( int16_t sig, struct sigaction *act, struct +sigaction *oact ); +
  +
Assembler: +
  +
pea       oact         ; Offset 8
+pea       act          ; Offset 4
+move.w    sig,-(sp)    ; Offset 2
+move.w    #311,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+lea       $C(sp),sp    ; Correct stack
+
+ +
+ +

5.11.33 Psigblock

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Psigblock« - Alter signal mask. +
  +
Opcode: 278 +
  +
Syntax: int32_t Psigblock ( int32_t mask ); +
  +
Description: The function Psigblock blocks selected signals from delivery. +It adds the signals specified in mask to the set of currently +blocking signals. For this, each bit of the parameter mask +represents one signal. If bit n in mask is set, it +means that the signal with the number n will be blocked. +
  +
One should note that some signals (e.g. SIGKILL) can not be +blocked. The kernel will delete these signals from mask before +any change of the signal set is performed. +
  +
Furthermore it should be pointed out that blocked signals also +remain blocked via Pfork/Pvfork calls. After a Pexec call the child +always starts with an empty set of signals to be blocked, irrespective +of which signals were blocked by its parent. +
  +
Warning: This function is optional, hence a call may be +answered with EINVFN. +
  +
Return value: The function returns the set of blocked signals that were valid +before the call. So with a Psigsetmask call the old set can be recovered +again. +
  +
Availability: As of the first in MultiTOS integrated MiNT version 1.04 and in +MagiC from Version 4.50 onwards. +
  +
Group: Process functions +
  +
See also: Binding   Psigsetmask   Signals +
  + +
+ +

5.11.33.1 Bindings for Psigblock

+ + + + + + +
C: int32_t Psigblock ( int32_t mask ); +
  +
Assembler: +
  +
move.l    mask,-(sp)   ; Offset 2
+move.w    #278,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

5.11.34 Psigintr

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Psigintr« - Assigns a signal to a particular exception +vector. +
  +
Opcode: 318 (0x013e) +
  +
Syntax: int32_t Psigintr ( int16_t vec, int16_t sig ); +
  +
Description: The function Psigintr assigns a signal to a particular +exception vector. When the exception occurs, the kernel will send the +signal to the process. +
  +
vec specifies the exception vector. This is the same +value as specified for Setexc() call. sig specifies the signal +number that is supposed to be delivered when an exception assigned to +the vector vec occurs. When both sig and vec +are zero, all handlers installed by your program are removed. +
  +
You should install a signal-handler prior to making this call, +otherwise your process will most probably get killed by the first +occurrence of the interrupt assigned to vec vector. +
Also notice that the function is not available on machines +equipped with 68000 and 68010 processors. +
  +
This function has been totally rewritten as of MiNT version +1.15.1. However, the only change visible to programs is that the old +value of vec is no longer returned (it had little use anyway). +Also, since long stack frames are needed, a 68020 or newer processor +is required. +
  +
The handler set up by Psigintr gets removed when your process +terminates. +
  +
Return value: Returns E_OK on success, or a negative GEMDOS error code +otherwise: +
  + + + + + + + + + + + + +
EBADARG: A signal or vector number was specified outside the allowed +range. Only autovectors ($60-$7c), traps ($80-$bc) and user defined +interrupts ($0100-$03fc) are allowed (other interrupts already +generate fixed signals). +
ENOMEM: The kernel ran out of memory while trying to allocate RAM for +internal structures needed by this call. +
ENXIO: The interrupt you want to register has no service routine +installed. +
ENOSYS: The function is not available (wrong architecture). + +
+ +
Availability: When a 'MiNT' cookie with a version of at least 1.11 exists. As +of MiNT version 1.15.1 this call is available only on machines +equipped with 68020 processor or higher. +
  +
This function has been disabled as of FreeMiNT 1.16. +
  +
Group: Process functions +
  +
See also: Binding   Pause   Pkill   Psigsetmask   Psignal   Signals +
  + +
+ +

5.11.34.1 Bindings for Psigintr

+ + + + + + +
C: int32_t Psigintr ( int16_t vec, int16_t sig ); +
  +
Assembler: +
  +
move.w    sig,-(sp)    ; Offset 4
+move.w    vec,-(sp)    ; Offset 2
+move.w    #318,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

5.11.35 Psignal

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Psignal« - Alter manner of signal handling. +
  +
Opcode: 274 +
  +
Syntax: int32_t Psignal ( int16_t sig, int32_t handler ); +
  +
Description: The function Psignal alters the action to be taken when the +signal sig arrives. The parameter handler can assume 3 +possible values: +
  + + + + + + + + + + + + +
handler Meaning +
    +
0 The signal will be answered with the default action +
1 The signal will be ignored by the process; if currently +present, it will be deleted + +
+ +
Any other value will be interpreted as the address of a user +function that will be called when the signal sig appears. This +function is passed a LONG value (via the stack) that corresponds to +the signal number. In this way it is possible to use the +signal-handler for several signals. +
  +
While a signal is being processed, it cannot be sent again. +Furthermore, one should note that (in contrast to some Unix versions) +the signal handling before the execution of the handler is not reset +to the default handler. +
  +
The signal-handler must either be terminated with RTS +(Return To Sender), or Psigreturn called to +indicate that the signal handling has been concluded. Following this, +the blocking of the signal will be lifted. Psigreturn additionally +performs some internal mopping up in the kernel, necessary in case the +signal-handler is not terminated (longjump). +
  +
Signal-handlers can make any BIOS, XBIOS and GEMDOS calls. +AES or VDI calls on the other hand are not permitted. However +this does not apply in MagiC; here one needs to heed several +differences. +
  +
A Psigaction call has the side effect that the signal will be +unmasked (i.e. released). In this way a process, while handling a +signal, can reset it and then send it to itself again - for instance +to suspend itself while a signal for job-control is processed. The +signal handling is secured against Pfork/Pvfork. +
  +
Signals that are ignored by a process will also be ignored by its +child after a Pexec call. Additionally, signals that are intercepted +by a signal-handler will be reset in the child process to the default +value. +
  +
Return value: The function returns the old value of the signal-handler. This +is either 0, 1 or the address of the handler. +
  +
Im case of error, the following results are returned: +
  + + + + + + +
EACCDN: Signal cannot be intercepted by the user +
ERANGE: sig is an invalid signal + +
+ +
Availability: As of the first in MultiTOS integrated MiNT version 1.04 and +MagiC as of Version 4.50. +
  +
Group: Process Functions +
  +
See also: Binding   Pkill   Psigaction   Psigblock   Psigreturn   Signals +
  + +
+ +

5.11.35.1 Bindings for Psignal

+ + + + + + +
C: int32_t Psignal ( int16_t sig, int32_t handler ); +
  +
Assembler: +
  +
move.l    handler,-(sp)  ; Offset 4
+move.w    sig,-(sp)      ; Offset 2
+move.w    #274,-(sp)     ; Offset 0
+trap      #1             ; GEMDOS
+addq.l    #8,sp          ; Correct stack
+
+ +
+ +

5.11.36 Psigpause

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Psigpause« - Set a new signal mask and then suspend process +until the arrival of a signal. +
  +
Opcode: 310 +
  +
Syntax: void Psigpause ( int32_t mask ); +
  +
Description: The function Psigpause sets a new signal mask mask, and +suspends the called process until a signal arrives that is not masked +or ignored. +
  +
If a handler has been installed for this signal with Psignal, then +this will be called before the function returns. If the handler +executes a longjump to another part of the program, or the process +terminates, then the function will never return. +
  +
Note: When the function returns, the signal mask will be +reset to the value that applied before the call of Psigpause. Thus the +signal mask set by the function is only valid temporarily. In MagiC, +problems may arise if several threads call this function at the same +time, as the signal mask here is process-global. +
  +
Return value: The function returns always 0. +
  +
Availability: Available when a 'MiNT' cookie with a version of at least 0.95 +exists, and MagiC as of Version 4.50. +
  +
Group: Process functions +
  +
See also: Binding   Pause   Psigblock   Psignal   Psigsetmask   Signals +
  + +
+ +

5.11.36.1 Bindings for Psigpause

+ + + + + + +
C: void Psigpause ( int32_t mask ); +
  +
Assembler: +
  +
move.w    mask,-(sp)   ; Offset 2
+move.w    #310,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

5.11.37 Psigpending

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Psigpending« - Check which signals have been sent but not +yet processed. +
  +
Opcode: 291 +
  +
Syntax: int32_t Psigpending ( void ); +
  +
Description: The function Psigpending returns the signals that have been +sent to the calling process, but not yet handled (say because they are +blocked with Psigblock or because they are currently being processed). +
  +
Return value: The function returns the desired signals as a bit-mask in a +LONG; for each bit n set, signal n is waiting to be +processed. +
  +
Availability: As of the first in MultiTOS integrated MiNT version 1.04, and +MagiC as of Version 4.50. +
  +
Group: Process functions +
  +
See also: Binding   Psigblock   Psignal   Psigsetmask   Signals +
  + +
+ +

5.11.37.1 Bindings for Psigpending

+ + + + + + +
C: int32_t Psigpending ( void ); +
  +
Assembler: +
  +
move.w    #291,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

5.11.38 Psigreturn

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Psigreturn« - Prepare exit from a signal-handler. +
  +
Opcode: 282 +
  +
Syntax: void Psigreturn ( void ); +
  +
Description: The function Psigreturn prepares for the exit from a +signal-handler. As this happens automatically when the handler +returns, calling Psigreturn is only necessary if the handler executes +a non-local jump (perhaps with longjump) rather than using RTS. +
  +
The call has no effect when no signal is being processed at the +time. +
  +
In MagiC, the thread of the active signal-handler will become +the main thread of the process and then be removed. All other signal +processes will be removed as well (nesting). The locked semaphores of +the main thread will be released, and the supervisor stack will be +reset to the value at process start. +
  +
Return value: The function has no direct result under MiNT/MultiTOS; +in MagiC the value EACCDN will be returned if the caller is +not a signal-handling routine, or the value E_OK otherwise. +
  +
Availability: As of the first in MultiTOS integrated MiNT version 1.04, and +MagiC as of Version 4.50. +
  +
Group: Process functions +
  +
See also: Binding   Psignal   Signals   Signal-handler in MagiC +
  + +
+ +

5.11.38.1 Bindings for Psigreturn

+ + + + + + +
C: void Psigreturn ( void ); +
int32_t Psigreturn ( void ); +
  +
Assembler: +
  +
move.w    #282,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

5.11.39 Psigsetmask

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Psigsetmask« - Set/replace a signal mask. +
  +
Opcode: 279 +
  +
Syntax: int32_t Psigsetmask ( int32_t mask ); +
  +
Description: The function Psigsetmask replaces the set of signals that are +currently to be blocked completely by the signals specified in the +parameter mask. +
  +
One should note that some signals (e.g. SIGKILL) can not be +blocked. The kernel will delete these signals from mask before +any change of the signal set is performed. +
  +
Furthermore it should be pointed out that blocked signals also +remain blocked via Pfork/Pvfork calls. After a Pexec call the child +always starts with an empty set of signals to be blocked, irrespective +of which signals were blocked by its parent. +
  +
Return value: The function returns the set of the blocked signals that were +valid before the call. +
  +
Availability: As of the first in MultiTOS integrated MiNT version 1.04, and +MagiC as of Version 4.50. +
  +
Group: Process functions +
  +
See also: Binding   Psigblock   Signals   Signal-handler in MagiC +
  + +
+ +

5.11.39.1 Bindings for Psigsetmask

+ + + + + + +
C: int32_t Psigsetmask ( int32_t mask ); +
  +
Assembler: +
  +
move.l    mask,-(sp)   ; Offset 2
+move.w    #279,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

5.11.40 Psysctl

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Psysctl« - Get or set system information. +
  +
Opcode: 350 (0x015e) +
  +
Syntax: int32_t Psysctl ( int32_t *name, uint32_t namelen, void *old, +uint32_t *oldlenp, void *new, uint32_t newlen ); +
  +
Description: The function Psysctl retrieves system information and allows +processes with appropriate privileges to set system information. The +system information may be an integer, a string or a structure. +
  +
name and namelen specify the system information +to retrieve. name is an array of longwords which defines a +path to the actual value. The first longword holds the top level name, +the second longword is the second level name... namelen is the +size of this array. +
  +
The information is copied into the buffer specified by +old and oldlenp. +
  +
Before the call, oldlenp points to a long specifiying +the size of the buffer. After the call, this long word is set to the +amount of copied data. +
  +
If both old and oldlenp are set to NULL, the old +value is not returned. +
  +
If only old is set to NULL, oldlenp will be set +to the amount of available data. +
  +
To set a new value, new is set to a pointer to a buffer +of lenght newlen. Otherwise, new should be set to NULL +and newlen set to 0. +
  +
The top level names are defined with the following CTL_ prefix. +
  + +
CTL_KERN (1): Kernel +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KERN_OSTYPE=1 (string) System version +
KERN_OSRELEASE=2 (string) System release +
KERN_OSREV=3 (integer) System revision +
KERN_VERSION=4 (string) Compile time information +
KERN_HOSTNAME=5 (string) Hostname +
KERN_DOMAINNAME=6 (string) (YP) Domainname +
KERN_SECURELVL=7 (integer) System security level +
KERN_MAXPROC=8 (integer) Max processes +
KERN_MAXFILES=9 (integer) Max open files +
KERN_NGROUPS=10 (integer) Number of supplemental group IDs +
KERN_IOV_MAX=11 (integer) Max iovec's for readv(2) etc. +
KERN_LOGIN_NAME_MAX=12 (integer) Max length login name + NUL +
KERN_BOOTTIME=13 (struct timeval) Time kernel was booted +
KERN_INITIALTPA=14 (integer) Max TPA size of a process +
KERN_SYSDIR=15 (string) The system directory + +
+ + +
CTL_HW (2): Generic CPU/IO +
  + + + + + + + + + + + + + + + + + + + + + +
HW_MACHINE=1 (string) Machine class +
HW_MACHINE_ARCH=2 (string) Machine architecture +
HW_MODEL=3 (string) Specific machine model +
HW_NCPU=4 (integer) Number of CPUs +
HW_BYTEORDER=5 (integer) Machine byte order +
HW_PAGESIZE=6 (integer) Software page size +
HW_FREEPHYSMEM=7 (integer) Free physical memory + +
+ + +
CTL_MACHDEP (3): Machine dependent (not yet implemented) +
  + +
CTL_DEBUG (4): Debugging parameters (not yet +implemented) +
  + +
CTL_PROC (5): Per-proc attributes +
The second level name specifies the process ID (PROC_CURPROC or +any PID), the third level name specifies the system information +(PROC_PID_DEBUG). +
  + + + + + + +
PROC_CURPROC=0x7fffffff (2^31-1) (integer) Select the current process +
Other value (integer) ID of specified process + + + +
PROC_PID_DEBUG=1 (integer) Process debug level + +
+ + +
+ + +
CTL_KBD (6): Keyboard configuration +
  + + + + + + + + + +
KBD_PC_STYLE_CAPS=1 (integer) CAPS key operate in PC style mode +
KBD_MOUSE_PIXELS=2 (integer) Keyboard mouse movement pixels +
KBD_PIXELS_FINE=3 (integer) Keyboard mouse movement pixels 'fine' + +
+ +
Return value: The function can return the following results: +
  + + + + + + + + + + + + + + + + + + + + + +
E_OK  : No error has arisen +
ENOMEM : The amount of data available is greater than the size of the +buffer supplied +
EACCDN: An attempt was made to change a read-only value or was made by +a process with insufficient privilege +
ERANGE: The name array was less than two or greater than +CTL_MAXNAME +
ENOTDIR: name specifies an intermediate rather than terminal +name +
EOPNOTSUPP: name not found +
ESRCH Process not found + +
+ +
Availability: This function is available as of FreeMiNT 1.15.12. +
  +
Group: Process functions +
  +
See also: Binding   Sysconf +
  + +
+ +

5.11.40.1 Bindings for Psysctl

+ + + + + + +
C: int32_t Psysctl ( int32_t *name, uint32_t namelen, void *old, +uint32_t *oldlenp, void *new, uint32_t newlen ); +
  +
Assembler: +
  +
move.l    newlen,-(sp)   ; Offset 22
+pea       new,-(sp)      ; Offset 18
+pea       oldlenp,-(sp)  ; Offset 14
+pea       old,-(sp)      ; Offset 10
+move.l    namelen,-(sp)  ; Offset 6
+pea       name,-(sp)     ; Offset 2
+move.w    #350,-(sp)     ; Offset 0
+trap      #1             ; GEMDOS
+lea       $1A(sp),sp     ; Correct stack
+
+ +
+ +

5.11.41 Pterm

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Process termination« - Terminate a TOS program. +
  +
Opcode: 76 +
  +
Syntax: void Pterm ( uint16_t retcode ); +
  +
Description: The GEMDOS routine Pterm terminates a running process, and +removes it from memory. The following apply: +
  + + + + + + + + + +
Parameter Meaning +
    +
retcode Status that is returned to the calling program. + + + + + + + + + + + + + + + +
-32 = Should not be used, as one obtains this value for programs +terminated by Control-C +
 -1 = Should not be used, as one obtains this value from GEMDOS 0.15 +onwards if a process crashes +
  0 = No error has arisen +
  1 = General error +
  2 = Error in the parameters + +
+ + +
+ +
Note about MagiC: Before any steps are taken, the +vector etv_term is located via Setexc and jumped over. Subsequently, +the process is cleaned up properly (including VDI workstations, +informing all XFSs via xfs_pterm, closing of all opened files and +current paths, and deleting the process file in directory U:\PROC). +
  +
Return value: The function does not return a result. +
  +
Availability: All GEMDOS versions. +
  +
Group: Process functions +
  +
See also: Binding   Pexec   Pterm0   Ptermres   XFS-concept in MagiC +
  + +
+ +

5.11.41.1 Bindings for Pterm

+ + + + + + +
C: void Pterm ( uint16_t retcode ); +
  +
Assembler: +
  +
move.w    retcode,-(sp)  ; Offset 2
+move.w    #76,-(sp)      ; Offset 0
+trap      #1             ; GEMDOS
+addq.l    #4,sp          ; Correct stack
+
+ +
+ +

5.11.42 Pterm0

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Process termination« - Terminate a TOS program and return +0 to caller. +
  +
Opcode: 0 +
  +
Syntax: void Pterm0 ( void ); +
  +
Description: The GEMDOS routine Pterm0 terminates a TOS program and does +not return again. The routine returns an exit code of 0. +
  +
Note: In MagiC this function is executed directly as +Pterm(0). +
  +
Return value: The function does not return a result. +
  +
Availability: All GEMDOS versions. +
  +
Group: Process functions +
  +
See also: Binding   Pexec   Pterm   Ptermres +
  + +
+ +

5.11.42.1 Bindings for Pterm0

+ + + + + + +
C: void Pterm0 ( void ); +
  +
Assembler: +
  +
move.w    #0,-(sp)     ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

5.11.43 Ptermres

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Terminate and stay resident« - Terminate a program but leave +it in memory. +
  +
Opcode: 49 +
  +
Syntax: void Ptermres ( int32_t keepcnt, int16_t retcode ); +
  +
Description: The GEMDOS routine Ptermres terminates a program, yet leaves a +part of the program's TPA intact and removes the memory left from +GEMDOS's memory list. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
keepcnt Number of bytes that are to be retained (applies from the start +of the basepage and includes the length of the TEXT, DATA and BSS +segments of the application plus length of the stack; minimum is 128 +bytes). Important: The memory retained by this call may not be +freed later since it has been removed completely from the GEMDOS +memory list. +
retcode Status that is returned to the calling program + + + + + + + + + + + + + + + +
-32 = Should not be used, as one obtains this value for programs +terminated by Control-C +
 -1 = Should not be used, as one obtains this value from GEMDOS 0.15 +onwards if a process crashes +
  0 = No error has arisen +
  1 = General error +
  2 = Error in the parameters + +
+ + +
+ +
Note: In a network all lockings of the processes will be +lifted. +
  +
Return value: The function does not return a result. +
  +
Availability: All GEMDOS versions. +
  +
Group: Process functions +
  +
See also: Binding   Pexec   Pterm   Pterm0 +
  + +
+ +

5.11.43.1 Bindings for Ptermres

+ + + + + + +
C: void Ptermres ( int32_t keepcnt, int16_t retcode ); +
  +
Assembler: +
  +
move.w    retcode,-(sp)  ; Offset 6
+move.l    keepcnt,-(sp)  ; Offset 2
+move.w    #49,-(sp)      ; Offset 0
+trap      #1             ; GEMDOS
+addq.l    #8,sp          ; Correct stack
+
+ +
+ +

5.11.44 Ptrace

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Ptrace« - Process tracing and debugging +
  +
Opcode: 320 +
  +
Syntax: int16_t Ptrace(int16_t request, int16_t pid, void * addr, +int32_t data) +
  +
Description: Ptrace provides tracing and debugging facilities. It allows one +process (the tracing process) to control another (the traced process). +Most of the time, the traced process runs normally, but when it +receives a signal (see sigaction(2)), it stops. The tracing process is +expected to notice this via wait(2) or the delivery of a SIGCHLD +signal, examine the state of the stopped process, and cause it to +terminate or continue as appropriate. Ptrace is the mechanism by which +all this happens. +
  +
The request argument specifies what operation is being +performed; the meaning of the rest of the arguments depends on the +operation, but except for one special case noted below, all ptrace +calls are made by the tracing process, and the pid argument +specifies the process ID of the traced process. request can +be: +
  + + + + + + + + + + + + + + + + + + + + + + + + + +
PT_TRACE_ME (0) This request is the only one used by the traced process; it +declares that the process expects to be traced by its parent. All the +other arguments are ignored. (If the parent process does not expect to +trace the child, it will probably be rather confused by the results; +once the traced process stops, it cannot be made to continue except +via ptrace.) When a process has used this request and calls execve(2) +or any of the routines built on it (such as execv(3)), it will stop +before executing the first instruction of the new image. Also, any +setuid or setgid bits on the executable being executed will be +ignored. +
  + + +
PT_READ_I (1), PT_READ_D (2) +
These requests read a single int of data from the traced process' +address space. Traditionally, ptrace has allowed for machines with +distinct address spaces for instruction and data, which is why there +are two requests: conceptually, PT_READ_I reads from the instruction +space and PT_READ_D reads from the data space. In the current NetBSD +implementation, these two requests are completely identical. The addr +argument specifies the address (in the traced process' virtual address +space) at which the read is to be done. This address does not have to +meet any alignment constraints. The value read is returned as the +return value from ptrace. +
  + + +
PT_WRITE_I (4), PT_WRITE_D (5) +
These requests parallel PT_READ_I and PT_READ_D, except that they +write rather than read. The data argument supplies the value to be +written. +
  + +
PT_CONTINUE (7) The traced process continues execution. addr is an +address specifying the place where execution is to be resumed (a new +value for the program counter), or (caddr_t)1 to indicate that +execution is to pick up where it left off. data provides a +signal number to be delivered to the traced process as it resumes +execution, or 0 if no signal is to be sent. +
  + +
PT_KILL (8) The traced process terminates, as if PT_CONTINUE had been used +with SIGKILL given as the signal to be delivered. +
  + +
PT_ATTACH (9) This request allows a process to gain control of an otherwise +unrelated process and begin tracing it. It does not need any +cooperation from the to-be-traced process. In this case, pid +specifies the process ID of the to-be-traced process, and the other +two arguments are ignored. This request requires that the target +process must have the same real UID as the tracing process, and that +it must not be executing a setuid or setgid executable. (If the +tracing process is running as root, these restrictions do not apply.) +The tracing process will see the newly-traced process stop and may +then control it as if it had been traced all along. +
  +
Two other restrictions apply to all tracing processes, even +those running as root. First, no process may trace the process running +init(8). Second, if a process has its root directory set with +chroot(2), it may not trace another process unless that process' root +directory is at or below the tracing process' root. +
  + +
PT_DETACH (10) This request is like PT_CONTINUE, except that it does not allow +specifying an alternative place to continue execution, and after it +succeeds, the traced process is no longer traced and continues +execution normally. +
  + +
PT_SYSCALL (11) Continue and stop at next return from syscall. +
  + +
+ +
Additionally, machine-specific requests can exist. On the SPARC, +these are: +
  + + + + + + + + + + + + +
PT_GETREGS This request reads the traced process' machine registers into +the struct reg (defined in <machine/reg.h>) pointed to by +addr. +
  +
PT_SETREGS This request is the converse of PT_GETREGS; it loads the traced +process' machine registers from the struct reg (defined in +<machine/reg.h>) pointed to by addr. +
  +
PT_GETFPREGS This request reads the traced process' floating-point registers +into the struct fpreg (defined in <machine/reg.h>) pointed to by +addr. +
  +
PT_SETFPREGS This request is the converse of PT_GETFPREGS; it loads the +traced process' floating-point registers from the struct fpreg +(defined in <machine/reg.h>) pointed to by addr. +
  + +
+ +
Return alue: Some requests can cause ptrace to return -1 as a non-error +value; to disambiguate, errno can be set to 0 before the call and +checked afterwards. The possible errors are: +
  + + + + + + + + + + + + +
ww No process having the specified process ID exists. +
  +
EINVAL +
  +
    +
  • A process attempted to use PT_ATTACH on itself. +
  • +
  • The request was not one of the legal requests. +
  • +
  • The signal number (in data) to PT_CONTINUE was neither +0 nor a legal signal number. +
  • +
  • PT_GETREGS, PT_SETREGS, PT_GETFPREGS, or PT_SETFPREGS was +attempted on a process with no valid register set. (This is normally +true only of system processes.) +
  • +
+ +
EBUSY +
  +
    +
  • PT_ATTACH was attempted on a process that was already being +traced. +
  • +
  • A request attempted to manipulate a process that was being +traced by some process other than the one making the request. +
  • +
  • A request (other than PT_ATTACH) specified a process that +wasn't stopped. +
  • +
+ +
EPERM +
  +
    +
  • A request (other than PT_ATTACH) attempted to manipulate a +process that wasn't being traced at all. +
  • +
  • An attempt was made to use PT_ATTACH on a process in violation +of the requirements listed under PT_ATTACH above. +
  • +
+ + +
+ +
Availability: This function is available as of FreeMiNT 1.15.11. +
  +
Group: Process functions +
  +
See also: Binding +
  + +
+ +

5.11.44.1 Bindings for Ptrace

+ + + + + + +
C: int16_t Ptrace(int16_t request, int16_t pid, void *addr, +int32_t data); +
  +
Assembler: +
  +
move.l    data,-(sp)    ; Offset 10
+pea       addr          ; Offset 6
+move.w    pid,-(sp)     ; Offset 4
+move.w    request,-(sp) ; Offset 2
+move.w    #320,-(sp)    ; Offset 0
+trap      #1            ; GEMDOS
+lea       14(sp),sp     ; Correct stack
+
+ +
+ +

5.11.45 Pumask

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pumask« - Set initial creation mask for files and +directories. +
  +
Opcode: 307 +
  +
Syntax: int16_t Pumask ( int16_t mode ); +
  +
Description: The function Pumask alters the file/directory creation mask of +the current process to mode, which is a WORD bitmask of +various access permission flags as defined in Fchmod. The new value of +the mask is inherited by child processes. +
  +
When a new file or a new directory is created (with Fcreate or +Dcreate respectively), the access rights are normally set so that full +access is permitted. (Exception: New files are normally not +executable.) +
  +
With the aid of Pumask one can specify which access rights +during creation of a file are not (!) to be permitted. +
  +
Explicit Fchmod calls are not affected by Pumask. +
  +
Warning: In MagiC however the mask is not evaluated by +any internal XFS of MagiC, and finds use exclusively in UNIX-like +file-systems. +
  +
Return value: The function returns the value of the old creation mask. +
  +
Availability: Available when a 'MiNT' cookie with a version of at least 0.92 +exists, and MagiC as of Version 5.04. +
  +
Group: Process functions +
  +
See also: Binding   Dcreate   Fchmod   Fcreate +
  + +
+ +

5.11.45.1 Bindings for Pumask

+ + + + + + +
C: int16_t Pumask ( int16_t mode ); +
  +
Assembler: +
  +
move.w    mode,-(sp)   ; Offset 2
+move.w    #307,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

5.11.46 Pusrval

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pusrval« - Set/interrogate specific process information. +
  +
Opcode: 280 +
  +
Syntax: int32_t Pusrval ( int32_t val ); +
  +
Description: The function Pusrval permits the setting or interrogation of +process-specific information. These are stored in a LONGword, and +inherited by all child processes. +
  +
The meaning of the value can be freely determined by the calling +program. +
  +
Return value: The function returns the old value. +
  +
Availability: As of the first in MultiTOS integrated MiNT version 1.04, and +MagiC as of Version 5.04. +
  +
Group: Process functions +
  +
See also: Binding +
  + +
+ +

5.11.46.1 Bindings for Pusrval

+ + + + + + +
C: int32_t Pusrval ( int32_t val ); +
  +
Assembler: +
  +
move.l    val,-(sp)    ; Offset 2
+move.w    #280,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

5.11.47 Pvfork

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pvfork« - Create copy of the current process. +
  +
Opcode: 275 +
  +
Syntax: int16_t Pvfork ( void ); +
  +
Description: The function Pvfork creates a copy of the current process. +Parent and child process share the same address and data space, i.e. +every change that the child makes to variables will also affect the +parent. The new process starts its work when the function Pvfork +returns. +
  +
Note that if the parent is in supervisor-mode when the call is +made, the child is placed in user-mode anyway. +
  +
As both processes share the same address space (and stack), +problems would arise if both ran at the same time. For this reason the +parent is paused until the child process is either terminated or uses +Pexec (mode 200) to write itself as a new process to a new address +space. +
  +
Return value: The function can return the following results: +
  + + + + + + + + + +
E_OK  : In child process +
>0    : New process ID in parent process +
ENSMEM: Not enough memory available to create a new process + +
+ +
Availability: As of the first in MultiTOS integrated MiNT version 1.04. +
  +
Group: Process functions +
  +
See also: Binding   Pexec   Pfork   Threads +
  + +
+ +

5.11.47.1 Bindings for Pvfork

+ + + + + + +
C: int16_t Pvfork ( void ); +
  +
Assembler: +
  +
move.w    #275,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

5.11.48 Pwait

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pwait« - Try to obtain exit code of waiting or terminated +child process. +
  +
Opcode: 265 +
  +
Syntax: int32_t Pwait ( void ); +
  +
Description: The function Pwait is equivalent to Pwait3 (2, NULL) and is +offered for reasons of backwards compatibility. +
  +
According to POSIX, the library function 'wait' should be +implemented as Pwaitpid (-1, 0, NULL). Hence Pwait should not be used +for a POSIX-compatible library. +
  +
Warning: In MagiC the function is implemented as +Pwaitpid (-1, 2, NULL). +
  +
Return value: The function can return the following results: +
  + + + + + + + + + +
>0    : Exit status and PID of the child in the lower and upper 16 bits +respectively of a 32-bit return code +
 0    : No child processes have terminated. +
EFILNF: No child processes exist + +
+ +
Availability: As of the first in MultiTOS integrated MiNT version 1.04, and +MagiC as of Version 5.04. +
  +
Group: Process functions +
  +
See also: Binding   Pwait3   Pwaitpid +
  + +
+ +

5.11.48.1 Bindings for Pwait

+ + + + + + +
C: int32_t Pwait ( void ); +
  +
Assembler: +
  +
move.w    #265,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

5.11.49 Pwait3

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pwait3« - Get exit code of any waiting or terminated +children of the calling process. +
  +
Opcode: 284 +
  +
Syntax: int32_t Pwait3 ( int16_t flag, int32_t *rusage ); +
  +
Description: The function Pwait3 is equivalent to a call of Pwaitpid (-1, +flag, rusage) and determines with it the exit code as well as the CPU +load of a terminated or stopped child process. +
  +
flag is a bit-mask showing the specifics of this call as +follows: +
  + + + + + + + + + + + + +
Value Meaning +
    +
1 If set, the function will not block the calling process if no +child has been stopped or terminated, but will just return 0; if not +set (clear), the process will be blocked until a child of the process +has been terminated or stopped +
2 If set, returns exit codes for processes that have been +terminated as well as stopped; if clear, only returns exit codes for +processes that have actually terminated + +
+ +
rusage points to an array of two LONGs that are filled +in with information about resource usage of the stopped or terminated +process. The first LONG holds the number of milliseconds used by the +child in user space; the second LONG shows the number of milliseconds +spent by the process in kernel space. If this information is not +required, rusage may be set to NULL. +
  +
Return value: The function can return the following results: +
  + + + + + + + + + +
>0    : Exit status and PID of the child in the lower and upper 16 bits +respectively of a 32-bit return code +
 0    : No child processes have been stopped and/or terminated, or, if +bit 0 of the parameter flag is set, the function would be +blocked when waiting for the exit or the stopping of the child process +
EFILNF: No child processes exist + +
+ +
Availability: As of the first in MultiTOS integrated MiNT version 1.04, and +MagiC as of Version 5.04. +
  +
Group: Process functions +
  +
See also: Binding   Pwait   Pwaitpid +
  + +
+ +

5.11.49.1 Bindings for Pwait3

+ + + + + + +
C: int32_t Pwait3 ( int16_t flag, int32_t *rusage ); +
  +
Assembler: +
  +
pea       rusage       ; Offset 4
+move.w    flag,-(sp)   ; Offset 2
+move.w    #284,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #8,sp        ; Correct stack
+
+ +
+ +

5.11.50 Pwaitpid

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pwaitpid« - Get exit code information about one or more +child processes. +
  +
Opcode: 314 +
  +
Syntax: int32_t Pwaitpid ( int16_t pid, int16_t flag, int32_t *rusage +); +
  +
Description: The function Pwaitpid tries to obtain the exit code of child +processes that have been stopped or terminated. If bit 1 of the +parameter flag is set, then the child processes currently +stopped will be reported; if clear, child processes newly terminated +or stopped by tracing will be reported. +
  +
A stopped process will be reported once, as a rule, (as long as +it has not been restarted and stopped again). Equally, a terminated +process will be reported only once. +
  +
If child processes are present that have neither been stopped +nor terminated (or are waiting for such an event), then the further +behaviour of the function is determined by bit 0 of the parameter +flag. The following applies here: +
  + + + + + + +
Bit-0 = 0: Wait until child is stopped or terminated +
Bit-0 = 1: Return immediately + +
+ +
With the parameter pid the children whose exit codes +are of interest can be specified more exactly: +
  + + + + + + + + + + + + + + + + + + +
pid Meaning +
    +
-1 Inquire status for all children +
>0 pid is the process ID of the child whose status is to +be established +
=0 Inquire status for all children whose group ID is the same as +that of the calling process +
< -1 Inquire status for all children whose group ID corresponds to +the absolute value of pid + +
+ +
With the parameter rusage information about the +usage of CPU time of the child is accounted for: +
  + + + + + + +
rusage[0]: Time spent in user space (msec) +
rusage[1]: Time spent in kernel space (msec) + +
+ +
If a child process was found, its PID will be given in the upper +16 bits and its exit status in the lower 16 bits of the return value. +If the process was stopped or terminated by a signal with the number +n, its exit status will be 256*n+x, where: +
  + + + + + + +
x = 127, if the process was stopped +
x = 0, If the process was terminated + +
+ +
Warning: In MagiC, stopped child-processes are not yet +recognized, but only terminated child processes. In addition, only +NULL-values are returned at present in the parameter rusage. +
  +
Process groups, too, are not properly supported at present +because the function Psetpgrp is missing. +
  +
Return value: The function can return the following values: +
  + + + + + + + + + +
>0    : Exit status and PID of the child in the lower and upper 16 bits +respectively of a 32-bit return code +
 0    : No child processes have been stopped and/or terminated, or, if +bit 0 of the parameter flag is set, the function would be +blocked when waiting for the exit or the stopping of the child process +
EFILNF: No child processes exist + +
+ +
Availability: Available when a 'MiNT' cookie with a version of at least 0.96 +exists, and MagiC as of Version 5.04. +
  +
Group: Process functions +
  +
See also: Binding   Pwait   Pwait3 +
  + +
+ +

5.11.50.1 Bindings for Pwaitpid

+ + + + + + +
C: int32_t Pwaitpid ( int16_t pid, int16_t flag, int32_t *rusage +); +
  +
Assembler: +
  +
pea       rusage       ; Offset 6
+move.w    flag,-(sp)   ; Offset 4
+move.w    pid,-(sp)    ; Offset 2
+move.w    #314,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+lea       $A(sp),sp    ; Correct stack
+
+ +
+ +
+ +Home +GEMDOSGEMDOS +Date and TimeDate and Time +Memory managementMemory management + + diff --git a/en/gemdos_programs.html b/en/gemdos_programs.html new file mode 100644 index 000000000..9aa3182fb --- /dev/null +++ b/en/gemdos_programs.html @@ -0,0 +1,254 @@ + + + + + +The documentation for TOS: The program format + + + + + + + + + +Home +GEMDOSGEMDOS +Pipes, Test forPipes, Test for +Program launch and TPAProgram launch and TPA + +
+ +

5.5 The program format

+ +

A program file under GEMDOS consists of the following segments: +

+
    +
  • Header +
  • +
  • TEXT, DATA and BSS segment +
  • +
  • Symbol table (optional) +
  • +
  • Relocation table (optional) +
  • +
+ +

The header is built up as follows: +

+ + + +
typedef struct
+{
+   WORD  ph_branch;        /* Branch to start of the program  */
+                           /* (must be 0x601a!)               */
+
+   LONG  ph_tlen;          /* Length of the TEXT segment      */
+   LONG  ph_dlen;          /* Length of the DATA segment      */
+   LONG  ph_blen;          /* Length of the BSS segment       */
+   LONG  ph_slen;          /* Length of the symbol table      */
+   LONG  ph_res1;          /* Reserved, should be 0;          */
+                           /* Required by PureC               */
+   LONG  ph_prgflags;      /* Program flags                   */
+   WORD  ph_absflag;       /* 0 = Relocation info present     */
+} PH;
+
+ +

A symbol table in Digital Research format consists of a +series of 14 byte long entries, made up of the symbol name (maximum 8 +bytes; any shorter names are terminated with a 0!), a 2 byte long +symbol type and the actual symbol value (4 bytes). The supported +symbol types are summarized in the following table: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValueSymbol type
0x0100In the BSS
0x0200In program text
0x0280Start of an object module
0x02c0Start of a library
0x0400In DATA segment
0x0800External
0x1000Register
0x2000Globales Symbol
0x4000Equated
0x8000Defined
+
+ + +

Many development systems (e.g. Pure-C) however use their own +(usually more efficient) symbol format. As programs under TOS may +be loaded at any arbitrary location in working memory (and must be +capable of running there), a program file normally contains a +relocation table, with whose aid the addresses specified in +the program code can be recalculated to the segments actually +allocated. +

+

Whether relocation information is present or not can be gathered +from the element ph_absflag of the program header (see above). +Basically only a relocation of 32-bit values (i.e. addresses) is +possible; prior to GEMDOS Version 0.15 (or TOS Version 1.04) the +relocation information was limited to a maximum of 32 kbytes. +

+

The relocation table itself starts with a 32-bit value which +marks the offset of the first value to be relocated relative +to the start of the TEXT segment. Single bytes are then used for all +following offsets. To be able to handle offsets greater than 255 +correctly, one proceeds as follows: If a 1 is found as an offset +(this is not possible due to the characteristics of the MC-680x0 +processor family) then the value 254 is added automatically to the +offset. For very large offsets this procedure can of course be +repeated. Incidentally, an empty relocation table is flagged +with a LONG value of 0. +

+

See also: Fcntl   ARHEADER   OHEADER   OSHEADER   PSETFLAGS   +The program flags +

+

5.5.1 The program flags

+ + +

With program flags one is dealing with a bit-vector within the +program header, which is built up as follows: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Bits Meaning +
    +
   0 Fastload flag. If this bit is set, then the stack will +not be cleared, but only the BSS segment preinitialized. +
   1 If this bit is set, then the program may be loaded into the +fast alternate RAM +
   2 If this bit is set, memory requests via Malloc may be allocated +from alternate RAM +
   3 Reserved, should be NULL +
Used for the Shared library. + + + +
 4-7 Memory protection mode + + + + + + + + + + + + + +
0 = Private: +
Only the process itself, and the operating system, may access the +memory + +
1 = Global: +
The memory is completely unprotected and hence all programs can +access it + +
2 = Super: +
The memory can be accessed by all processes that run in +supervisor-mode + +
3 = Read only: +
Any process can read from the memory; but writing is only +permitted by the process itself, as well as the operating system + +
+ +
8-11 Reserved, should be NULL + +
  12 Shared text.If this bit is set, then the TEXT segment +of the program may be shared. If such a program is launched +three times, for instance, then 3 different DATA and BSS segments +exist, but only a common TEXT segment. Warning: The bit should +only be set if the program does not perform any absolute accesses to +the DATA or BSS segments. +
13-27 Reserved, should be NULL. + + +
28-31 TPA size field. Here one can specify in steps of 128 +kbyte the maximum amount of memory to be allocated to the program from +alternate RAM if the computer has more ST-RAM then alternate RAM. The +16 possible value represent allocations between 128 kbyte and 2 Mbyte. + +
+ +

See also: Program header   Program launch and TPA +

+
+ +Home +GEMDOSGEMDOS +Pipes, Test forPipes, Test for +Program launch and TPAProgram launch and TPA + + diff --git a/en/gemdos_signals.html b/en/gemdos_signals.html new file mode 100644 index 000000000..b5ed51db5 --- /dev/null +++ b/en/gemdos_signals.html @@ -0,0 +1,508 @@ + + + + + +The documentation for TOS: Signals + + + + + + + + + +Home +GEMDOSGEMDOS +Program launch and TPAProgram launch and TPA +gemdos-trapgemdos-trap + +
+ +

5.7 Signals

+

The "signal" concept, originating from the U*NIX +world, is also available in the operating systems MultiTOS (actually +the underlying MiNT) and MagiC (as of Version 4.50). Signals can be +thought of as natural number messages that represent a given exception +condition. They are comparable to an interrupt or a CPU exception, but +with the difference that they deal with a pure software +implementation. +

+

Each process possesses: +

+
    +
  • A bit-vector of the pending signal. This describes those +signals that are still waiting to be processed, perhaps because they +are currently blocked by the signal mask, or because the process is in +a state where it cannot process signals. +
      +

  • +
  • A signal mask. This 32-bit value defines those signals that are +currently blocked as a bit-vector; if, say, bit 30 is set in this +vector, then the signal SIGUSR2 is blocked. The signal mask is not +just impacted explicitly (i.e. by system calls) but also +implicitly by other processes. During the processing of a +signal, for instance, it is blocked, yet others may occur. After the +signal has been processed it is released again and any signals waiting +can then be processed. One should note that some signals (e.g. +SIGKILL, SIGSTOP, SIGCONT) can not be masked. +
      +

  • +
  • A table in the form struct sigaction. +
      +

  • +
+ +

At a Pexec the signal mask and the pending value (see above) of +the child process will be zeroed. The element sa_handler of +the sigaction structure is inherited, during which a non-0 or 1 value +is always set to 0. The elements sa_mask and sa_flags +of the structure are zeroed. +

+

Most signals can be caught by a program (perhaps to call up a +given routine on receipt), ignored, or also blocked. Blocked signals +will be ignored until the blockade is lifted again. Re +terminology: One says that a signal is sent to a process +when the exception that is represented by the signal occurs, or the +signal is sent by another process via Pkill. On the other hand a +signal is caught by a process when the corresponding process +awakes and starts the actions matching the signal. One should note +that the signal handling takes up time: Between sending a signal and +the execution of the matching action a considerable period of time may +pass. +

+ +

In total there are 31 possible signals (0 to 30) available, not +all of which however have been assigned a fixed meaning. The following +list describes (as far as known) all possible signals in the form: +Signal number, Name of the signal, Meaning of the signal for the +receiving process. Unless explicitly noted otherwise, the default +action on the receipt of a signal is the killing (termination) of the +receiving process. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Number Name Meaning +
    + +
   0   SIGNULL Null: This signal has no default action, because strictly +speaking it is not really a signal at all. Together with Pkill it can +be used, however, to test for the existence of a child process. The +signal can not be masked or caught. + +
   1   SIGHUP Hang up: Is normally sent when the terminal with which a +process is connected is no longer valid. After receiving this signal +the process should make no further output to the terminal. In MagiC +the VT52 will send the signal when a terminal window has been closed. + +
   2   SIGINT Interrupt: Is usually sent when the user presses the key +combination ^C to interrupt a process. This signal is used by later +versions of MagiC in place of previous ways of handling ^C. + +
   3   SIGQUIT Quit: Generally this is sent when the user presses the key +combination ^\. This signal should be 'harder' than SIGINT, and at +present is not sent by MagiC or VT52. + +
   4   SIGILL Illegal instruction: Corresponds to the exception vector of the +same name of the 68k processor. The signal should not be +caught. In MiNT the signal can be caught, i.e. the vector will be +diverted for almost every process. In MagiC however this does not +work at present, so that here 8 bombs will always appear. + +
   5   SIGTRAP Trap: Corresponds to the 'Trace' exception vector of the 68k +processor, and is sent after each instruction is executed with the +system in single-step 'trace' mode. This signal should be caught only +by debuggers. In MiNT the signal can be caught, i.e. the +vector will be diverted for almost every process. In MagiC however +this does not work at present, so that here 9 bombs will always +appear. + +
   6   SIGABRT Abort: Is normally used by the library function abort in ANSI +C, and should not be caught. This signal is not sent by the +operating system itself. + +
   7   SIGPRIV Privilege violation: Corresponds to the exception vector of the +same name of the 68k processor, when a process tries to execute an +instruction in user-mode that may be executed only in supervisor-mode. +The signal should not be caught. In MiNT, however, this is +possible, so that the exception vector will be diverted for almost +every process. But in MagiC this does not work at present, so that +here 8 bombs will always appear. + +
   8   SIGFPE Floating point exception: The default action consists of +ignoring the signal. It corresponds to the 68k exception vector +'Division by zero' or a floating point exception. The signal may be +ignored or caught. In MiNT the signal may be caught, so the vector +will be diverted for almost every process. In MagiC however this does +not work at present. + +
   9   SIGKILL Kill: Forcibly terminates the receiving process. The signal +cannot be masked or caught; therefore this signal should only be sent +if SIGTERM failed. The signal is not presently sent by MagiC itself. + +
  10   SIGBUS Bus error: Corresponds to the exception vector of the same name +of the 68k processor. The signal should not be ignored or +caught. In MiNT the signal may be caught, i.e. the exception vector +will be diverted for almost every process. In MagiC however this does +not work at present, so that 2 bombs will always appear. In MiNT, +SIGBUS, SIGSEGV and SIGPRIV are reset to the default routine of the +system on first receipt of the signals, so that a double +bus/address/privilege error always kills the process. + +
  11   SIGSEGV Segmentation violation: Corresponds to an 'address error' +exception vector of the 68k processor. The signal should not +be caught or ignored. In MiNT the signal may be caught, i.e. the +exception vector will be diverted for almost every process. In MagiC +however this does not work at present, so 3 bombs always appear. + +
  12   SIGSYS Bad system call: Sent when an argument to a system call is bad +or out of range and the call does not have means to report the error. +Is not sent by MagiC at present. + +
  13   SIGPIPE Pipe error: Is sent when an attempt is made to write to a pipe +that no longer exists or has no readers, and can be masked in +Drag&Drop protocol, for instance. This signal is not sent by +MagiC at present. + +
  14   SIGALRM Alarm: Is used by MiNT for Talarm, and serves for handling +timeouts, for instance. In MagiC this signal is not sent at present. + +
  15   SIGTERM Terminate: Standard request for the process to clean up and +exit; sent by MiNT, for instance, when deleting a program file in the +U:\PROC directory. At present ignored by MagiC. + +
  16   SIGURG This signal is currently not defined. + +
  17   SIGSTOP Stop: The default action serves to suspend the receiving +process. The signal can not be blocked, caught or ignored. In +MagiC it causes all threads of a process to be paused. When paused, +no mouse or keyboard clicks are lost in MagiC; on a restart of the +process with SIGCONT all the corresponding messages will be evaluated. + +
  18   SIGTSTP Terminal stop: The default action is suspension of the +receiving process until a SIGCONT is caught. The signal corresponds to +SIGSTOP, and is usually initiated by the user pressing the key +combination ^Z. It can not be masked or caught. The signal is +not sent by MagiC and VT52 at present. + +
  19   SIGCONT Continue: The default action is to resume the process that was +previously suspended with SIGSTOP or Pause. Though the signal cannot +be masked or ignored, one can install a handling routine for this +signal. In MagiC all threads will be awakened that were paused with a +Pause call or a SIGSTOP signal. + +
  20   SIGCHLD Child terminated: The default action is to ignore the signal. +It is sent to the parent process both on termination as well as +pausing of a child process. In MiNT one can arrange that this signal +is sent only on termination, and in addition one can determine which +child process was affected. As MagiC until now only knows the waiting +Pexec (i.e. the parent waits until the child terminates), this signal +does not exist there. Processes that are created with shel_write are +not real child processes, but fully independent ones; in such +cases one therefore has to wait for the arrival of a CH_EXIT message. + +
  21   SIGTTIN Terminal input error: The default action consists of pausing +the receiving process. As a rule, a process is attempting to read from +a terminal in a process group that does not belong to it. This signal +is not sent by MagiC or VT52 at present. + +
  22   SIGTTOU Terminal output error: The default action consists of pausing +the receiving process. As a rule, a process is attempting to output to +a terminal in a process group that does not belong to it. This signal +is not sent by MagiC or VT52 at present. + +
  23   SIGIO I/O possible: Sent to show that input/output is possible on a +file descriptor. + +
  24   SIGXCPU Exhaustion of CPU limit: The calculation time contingent set by +Psetlimit or by the extended shel_write modes has elapsed. As the +limitation of CPU time is not yet implemented in MagiC, this signal +is not sent at present under this OS. + +
  25   SIGXFSZ File size limit exceeded: Sent to a process if it tries to +modify a file in a way that makes it exceed the maximum file size +limit of the process. + +
  26   SIGVTALRM Time limit expired: Sent to a process that has exceeded its +maximum time limit. + +
  27   SIGPROF Profiling time expired: Sent to a process to tell it that its +profiling time has expired. + +
  28   SIGWINCH Window changed: The default action is to ignore the signal. +Normally it is sent if the size of the terminal (i.e. number of lines +or columns) has altered. A program that is running in a terminal +window can then reconfigure itself to match the new size of the +window. For obtaining the current window size one can use in MiNT +Fcntl Opcodes, which however are not yet implemented in MagiC. Hence +the signal is currently not sent by MagiC or VT52. + +
  29   SIGUSR1 User-defined: + +
  30   SIGUSR2 User-defined: These two signals may be sent by user programs. +As a process is killed by default on receipt of this signal, it should +only be sent if the receiver is known. + +
  31   SIGPWR The system is restart due to a power failure. + +
+ +

See also: +
Signal-handler in MagiC   Process functions   Sample code   PsigactionPsignal   Pkill   Test for pipes +

+

5.7.1 Signal-handler in MagiC

+

As MagiC's signal-handlers differ somewhat from those in MiNT or +in MultiTOS, we will deal here with the most important differences and +features. First of all it must be realised that in MagiC, AES and +VDI calls from within a signal-handler are permitted (quite +in contrast to MiNT). +

+

A signal-handler runs in user-mode and employs the user stack of +the main thread, while this sleeps. In MiNT the supervisor stack of +the process is used. Hence, according to the MiNT documentation, the +nesting of signals more than 4 deep makes a process crash due to stack +overflow. In MagiC each signal-handler is its own thread with +its own supervisor stack, so that the worst that can happen is +the extremely rare case of user stack overflow. However, if too little +memory is available for a new thread when handling a signal, then an +"Out of internal memory" alert will appear, and one should +terminate a program as soon as possible. MagiC requires about 7 kb of +memory for handling each signal. +

+

In MagiC, the same applies for signals as for threads (a +signal-handler is a thread), i.e. the corresponding system libraries +have to be reentrant. However, there is a complication because +the main thread is halted while processing the signal. So if the main +thread has set a signal (wind_update for example), a deadlock occurs +if the signal-handler also wants to set these signals. Furthermore, in +MagiC a process may be interrupted at almost any point (MagiC is +reentrant, even DOS is interruptible), so that the main thread may in +some cases block important areas of the system (files, directories, +semaphores). Due to this it is possible that certain files cannot be +deleted or opened, for instance. +

+

With normal termination of a signal-handler all semaphores +blocked by the handler are released automatically. Furthermore, +windows, screen background and menu bar of the signal-handler will be +released if appropriate. Note that a signal-handler has its own AES +message-queue, i.e. evnt_message and appl_write should be used with +care. +

+

On Psigreturn the semaphores of all signal-handlers as well as +those of the main thread will be released. However the windows, screen +background and menu bar of the signal-handler will not be released. +Though this would not have been much of a problem, it may not be +necessary in practice. Psigreturn restores the supervisor stack of the +main thread, i.e. a setjmp/longjmp mechanism only needs to set the +USP. This is not sufficiently documented in the MiNT documentation, +and also works only if the main thread is waiting via a GEMDOS call. +If AES comes into play, MultiTOS crashes! Hence Psigreturn should +be avoided if possible. Psigreturn in MagiC is not of the type VOID +as in MiNT, but of the type LONG. If the function is called from a +non-signal-handler, Psigreturn returns the value EACCDN, otherwise +E_OK. If Psigreturn has returned E_OK, then (as in MiNT) under no +circumstances should the handling procedure be terminated in the +normal way via rts, because the jump-back address on the user stack is +invalid after execution of Psigreturn. +

+

A problem exists in MagiC with the existing versions of VT52. A +signal-handler cannot yet perform keyboard scans in VT52; the +keys will not be received. This may alter in a later version, however. +

+

See also: Process functions   Signals   Threads +

+

5.7.2 Sample code for signals

+

The first program installs a signal-handler for the two signals +SIGUSR1 and SIGUSR2. With that one can test the nesting of both +signals, if both are sent consecutively. The program should run in VT52 +or in MINIWIN. If one presses Ctrl-Alt-Esc during the +"for()" delay loop, one can see that MagiC creates its own +thread for each signal-handler. This has the advantage that under +MagiC no events (mouse, timer, ...) will be lost while a signal is +being processed. +

+
------------------------------ snip --------------------------
+#include <tos.h>
+#include <stdio.h>
+
+void cdecl handler(long signr)
+{
+    long i;
+
+    printf("Handler: Signal %ld received.\n", signr);
+    Cconws("Wait...");
+    for (i = 0; i < 7000000L; i++)
+        ;
+    Cconws("...OK\r\n");
+}
+
+int main( void )
+{
+    long ret;
+
+    printf("My ProcID is %d.\n", Pgetpid());
+    ret = (long) Psignal(SIGUSR1, handler);
+    printf("Psignal => %ld\n", ret);
+    ret = (long) Psignal(SIGUSR2, handler);
+    printf("Psignal => %ld\n", ret);
+    Cconin();
+    return(0);
+}
+------------------------------ snap --------------------------
+
+

The second program shows the treatment of the Psigreturn call. +Under MiNT this program only works if one doesn't use any AES calls +(evnt_keybd or evnt_multi), but uses, say, Cconin. This means that the +following program works under MagiC but crashes under MultiTOS (MiNT +1.08+AES 4.1). The problem lies probably in the restoration of the +supervisor stack (system stack pointer), where MultiTOS fails due to +the non-homogenous concept AES<->MiNT. +

+
------------------------------ snip ---------------------------
+#include <tos.h>
+#include <aes.h>
+#include <setjmp.h>
+#include <tosdefs.h>
+#include <stdio.h>
+
+jmp_buf env;
+
+void cdecl handler(long signr)
+{
+    printf("Handler: Signal %ld received.\n", signr);
+    Cconws("Perform Psigreturn()\r\n");
+    Psigreturn();
+    longjmp(env, 1);
+}
+
+int main( void )
+{
+    long ssp;
+
+    appl_init();
+    printf("My ProcID is %d.\n", Pgetpid());
+    Psignal(SIGUSR1, handler);
+
+    if  (setjmp(env))
+        Cconws("Coming from longjmp.\r\n");
+    else    Cconws("Coming from setjmp.\r\n");
+    ssp = Super(0L);
+    Super((void *) ssp);
+    printf("ssp = 0%08lx\n", ssp);
+    evnt_keybd();
+    return(0);
+}
+
+

See also: Signals   Process functions   GEMDOS +

+
+ +Home +GEMDOSGEMDOS +Program launch and TPAProgram launch and TPA +gemdos-trapgemdos-trap + + diff --git a/en/gemdos_structures.html b/en/gemdos_structures.html new file mode 100644 index 000000000..e1c84eecf --- /dev/null +++ b/en/gemdos_structures.html @@ -0,0 +1,1007 @@ + + + + + +The documentation for TOS: GEMDOS structures + + + + + + + + + +Home +GEMDOSGEMDOS +GEMDOS function listGEMDOS function list +Line-ALine-A + +
+ +

5.24 GEMDOS structures

+ +
+

5.24.1 CD-ROM definitions

+ + + + + + + + + + + + + +
/* CD-ROM address types */
+
+#define CDROM_LBA               0x01
+#define CDROM_MSF               0x02
+
+/* SUB Q control bits */
+
+#define CDROM_AUDIO_EMPHASIS    0x01
+#define CDROM_COPY_PERMITTED    0x02
+#define CDROM_DATA_TRACK        0x04
+#define CDROM_FOUR_CHANNEL      0x08
+
+/* The leadout track is always 0xAA, regardless of # of tracks on disc */
+
+#define CDROM_LEADOUT   0xAA
+
+/* return value from READ SUBCHANNEL DATA */
+
+/* Audio status not supported         */
+#define CDROM_AUDIO_INVALID     0x00
+/* Audio play operation in progress   */
+#define CDROM_AUDIO_PLAY        0x11
+/* Audio play operation paused        */
+#define CDROM_AUDIO_PAUSED      0x12
+/* Audio play successfully completed  */
+#define CDROM_AUDIO_COMPLETED   0x13
+/* Audio play stopped due to error    */
+#define CDROM_AUDIO_ERROR       0x14
+/* No current audio status to return  */
+#define CDROM_AUDIO_NO_STATUS   0x15
+
+

See also: CD-ROM opcodes for Fcntl +

+

5.24.2 cdrom_audioctrl

+
struct cdrom_audioctrl
+{
+    /* input parameters */
+
+    int16_t set;                   /* 0 = 0 == inquire only */
+
+    /* input/output parameters */
+
+    struct
+    {
+        int8_t selection;
+        int8_t volume;
+    } channel[4];
+};
+
+

See also: CD-ROM opcodes for Fcntl +

+

5.24.3 cdrom_mcn

+
struct cdrom_mcn
+{
+    int8_t  mcn_audiostatus;
+    int8_t  mcn_mcn[23];       /* Media catalog number as ASCII string */
+};
+
+

See also: CD-ROM opcodes for Fcntl   ASCII table +

+

5.24.4 cdrom_msf

+
struct cdrom_msf
+{
+    int8_t cdmsf_min0;       /* Start minute  */
+    int8_t cdmsf_sec0;       /* Start second  */
+    int8_t cdmsf_frame0;     /* Start frame   */
+    int8_t cdmsf_min1;       /* End minute    */
+    int8_t cdmsf_sec1;       /* End second    */
+    int8_t cdmsf_frame1;     /* End frame     */
+};
+
+

See also: CD-ROM opcodes for Fcntl +

+

5.24.5 cdrom_read

+
struct cdrom_read
+{
+    int32_t  cdread_lba;       /* Logical block address */
+    int8_t  *cdread_bufaddr;   /* Buffer pointer        */
+    int32_t  cdread_buflen;    /* Byte count            */
+};
+
+

See also: CD-ROM opcodes for Fcntl +

+

5.24.6 cdrom_subchnl

+
struct cdrom_subchnl
+{
+    /* input parameters */
+
+    int8_t cdsc_format;             /* CDROM_MSF or CDROM_LBA */
+
+    /* output parameters */
+
+    int8_t   cdsc_audiostatus;
+    unsigned cdsc_resvd: 8;         /* Reserved               */
+    unsigned cdsc_adr  : 4;
+    unsigned cdsc_ctrl : 4;
+    int8_t   cdsc_track;            /* Current track          */
+    int8_t   cdsc_ind;              /* Current index          */
+    cd_ad    cdsc_absaddr;          /* Absolute address       */
+    cd_ad    cdsc_reladdr;          /* Track relative address */
+};
+
+

See also: CD-ROM opcodes for Fcntl +

+

5.24.7 cdrom_ti

+
struct cdrom_ti
+{
+    int8_t cdti_trk0;        /* Start track */
+    int8_t cdti_ind0;        /* Start index */
+    int8_t cdti_trk1;        /* End track   */
+    int8_t cdti_ind1;        /* End index   */
+};
+
+

See also: CD-ROM opcodes for Fcntl +

+

5.24.8 cdrom_tisrc

+
struct cdrom_tisrc
+{
+    /* input parameters */
+
+    int8_t tisrc_track;          /* Track number                 */
+
+    /* output parameters */
+
+    int8_t tisrc_audiostatus;
+    int8_t tisrc_tisrc[23];      /* Track International Standard
+                                    Recording Code (ASCII)       */
+};
+
+

See also: CD-ROM opcodes for Fcntl   ASCII table +

+

5.24.9 cdrom_tocentry

+
struct cdrom_tocentry
+{
+    /* input parameters */
+
+    int8_t cdte_track;             /* Track number or CDROM_LEADOUT */
+    int8_t cdte_format;            /* CDROM_LBA or CDROM_MSF        */
+
+    /* output parameters */
+
+    unsigned cdte_adr:4;           /* the SUBQ channel encodes:
+                                      0 = nothing
+                                      1 = position data
+                                      2 = MCN
+                                      3 = ISRC
+                                      Else: reserved                */
+    unsigned cdte_ctrl:4;          /* Bit-0: Audio with pre-emphasis
+                                      Bit-1: Digital copy permitted
+                                      Bit-2: Data track
+                                      Bit-3: Four channel           */
+    int8_t   cdte_datamode;        /* Currently not se              */
+    cd_ad    dte_addr;             /* Track start                   */
+};
+
+

See also: CD-ROM opcodes for Fcntl +

+

5.24.10 cdrom_tochdr

+
struct cdrom_tochdr
+{
+    int8_t cdth_trk0;        /* Start track */
+    int8_t cdth_trk1;        /* End track   */
+};
+
+

See also: CD-ROM opcodes for Fcntl +

+

5.24.11 cdrom_volctrl

+
struct cdrom_volctrl
+{
+    int8_t  channel0;   /* Channel 1: Volume 0...255 */
+    int8_t  channel1;   /* Channel 2: Volume 0...255 */
+    int8_t  channel2;   /* Channel 3: Volume 0...255 */
+    int8_t  channel3;   /* Channel 4: Volume 0...255 */
+};
+
+

See also: CD-ROM opcodes for Fcntl +

+

5.24.12 cd_ad

+

This union is defined as follows: +

+
typedef union
+{
+    struct
+    {
+       int8_t reserved;    /* Reserved   */
+       int8_t minute;      /* Minute     */
+       int8_t second;      /* Second     */
+       int8_t frame;       /* Frame      */
+    } msf;
+    int32_t lba;
+} cd_ad;
+
+

See also: CD-ROM opcodes for Fcntl +

+

5.24.13 DISKINFO

+

This structure is defined as follows: +

+
typedef struct
+{
+    uint32_t   b_free;    /* Number of free clusters  */
+    uint32_t   b_total;   /* Total number of clusters */
+    uint32_t   b_secsiz;  /* Bytes per sektor         */
+    uint32_t   b_clsiz;   /* sector per cluster       */
+} DISKINFO;
+
+

See also: Dfree   GEMDOS +

+

5.24.14 DOSTIME

+
typedef struct
+{
+   uint16_t     time;  /* Time like Tgettime */
+   uint16_t     date;  /* Date like Tgetdate */
+} DOSTIME;
+
+

The structure of both integer values is arranged as follows: +

+ + + + + + + + + + + + + + + +
Bit Time +
    +
0-4 Seconds in units of two (0-29) +
5-10 Minutes (0-59) +
11-15 Hours (0-23) + +
+ + + + + + + + + + + + + + + + +
Bit Date +
    +
0-4 Day of month (1-31) +
5-8 Month (1-12) +
9-15 Year (0-119, 0=1980) + +
+ +

See also: Fdatime   GEMDOS +

+

5.24.15 DOSVARS

+
typedef struct
+{
+   int8_t    *in_dos;                 /* Adress of the DOS semaphore  */
+   int16_t   *dos_time;               /* Adress of the DOS time       */
+   int16_t   *dos_date;               /* Adress of the DOS date       */
+   int32_t   res1;                    /*                              */
+   int32_t   res2;                    /*                              */
+   int32_t   res3;                    /* is 0L                        */
+   VOID      *act_pd;                 /* Running program              */
+   int32_t   res4;                    /*                              */
+   int16_t   res5;                    /*                              */
+   VOID      *res6;                   /*                              */
+   VOID      *res7;                   /* Internal DOS memory list     */
+   VOID      (*resv_intmem)();        /* Extend DOS memory            */
+   int32_t   (*etv_critic)();         /* etv_critic of the GEMDOS     */
+   int8_t *  ((*err_to_str)(int8_t e)); /* Conversion code->plain text */
+   VOID      *xaes_appls;             /*                              */
+   VOID      *mem_root;               /*                              */
+   VOID      *ur_pd;                  /*                              */
+} DOSVARS;
+
+

Note: These variables are READ-ONLY ! +

+

With the aid of the function resv_intmem one can reserve +memory for internal memory management (similar to using FOLDRnnnn). In +contrast to TOS however this is stressed far less, so that +extension is not usually necessary. If memory has to be extended, +which also happens with ADDMEM, then one passes to the function +resv_intmem the address in register A0, and the length of the +memory block to be reserved in register D0. +

+

The prototype for the Event Critic Handler runs: +

+
int32_t etv_critic (int16_t errcode, int16_t drvnr)
+
+

Note that the function expects the arguments on the stack, and +hence in Pure-C must be declared as cdecl. +

+

The function err_to_str expects in register D0 a TOS +error-code, and returns in registers D0 and A0 a pointer to the +descriptive character string. With an invalid error-code one receives +in D0 a NULL, and in A0 a pointer to the character string 'TOS +error'. +

+

As seen by KAOS 1.4.2 the structure looks like this: +

+
typedef struct
+{
+   int8_t    *in_dos;                 /* Address of the DOS semaphores */
+   int16_t   *dos_time;               /* Address of the DOS time       */
+   int16_t   *dos_date;               /* Address of the DOS date       */
+   int32_t   dos_stack;               /* Stack for DOS itself          */
+   int32_t   pgm_superset;            /* User-program super stack      */
+   MD        *menlist[3];             /* Address of the 3 MD lists     */
+   VOID      *act_pd;                 /* Running program               */
+   FCB       *fcbx;                   /* Files                         */
+   int16_t   fcbn;                    /* Length of fcbx[]              */
+   DMD       *dmdx;                   /* Pointer to 16 DMDs            */
+   IMB       *imbx;                   /* Internal DOS memory list      */
+   VOID      (*resv_intmem)();        /* Extend DOS memory             */
+   int32_t   (*etv_critic)();         /* etv_critic of the GEMDOS      */
+   int8_t *  ((*err_to_str)(int8_t e)); /* Conversion code->clear text */
+} DOSVARS;
+
+

See also: AESVARS   Cookie of MagiC   Sconfig +

+

5.24.16 DTA

+

This structure is defined as follows: +

+
typedef struct
+{
+    int8_t    d_reserved[21];  /* Reserved for GEMDOS */
+    uint8_t   d_attrib;        /* File attributes     */
+    uint16_t  d_time;          /* Time                */
+    uint16_t  d_date;          /* Date                */
+    uint32_t  d_length;        /* File length         */
+    int8_t    d_fname[14];     /* Filename            */
+} DTA;
+
+

Recursive search in folders +

+

In each DTA, all required information is stored that is required +after a Fsfirst for further Fsnext calls. That means that one should +never call Fsfirst anew for other directories/wildcards as long as +further Fsnext calls are made in the same directory. +
For a recursive search one must use a new DTA for each new Fsfirst, +which must be maintained until all Fsnext for the Fsfirst have been +made. Here an example in pseudo-C: +

+
void search_directory (int8_t *pfadname)
+{
+  DTA_Record local_dta, saved_dta;
+
+  saved_dta = GetDTA ();
+  SetDTA (local_dta);
+
+  err = Fsfirst (pfadname, ...);
+  while (err == 0) {
+    if (local_dta.attrib == subdir) {
+      // recursive search in sub-dir
+      search_directory (subdir-pfadname);
+    } else {
+      ... evaluate normal file
+    }
+    err = Fsnext ();
+  }
+
+  SetDTA (saved_dta);
+}
+
+

See also: Fgetdta   Fsetdta   Fsfirst   Fsnext   GEMDOS +

+

5.24.17 fcookie

+
typedef struct f_cookie
+{
+    struct filesys *fs; /* File-system that knows this cookie       */
+    uint16_t dev;       /* Device info (e.g. Rwabs device number)   */
+    uint16_t aux;       /* Further data for the file-system         */
+    int32_t  index;     /* Serves together with dev for identifying */
+                        /* a file                                   */
+} fcookie;
+
+

See also: FILEPTR   FILESYS   XFS-concept in MagiC +

+

5.24.18 FILEPTR

+
typedef struct fileptr
+{
+    int16_t         links;
+    uint16_t        flags;
+    int32_t         pos;
+    int32_t         devinfo;
+    fcookie         fc;
+    struct devdrv  *dev;
+    struct fileptr *next;
+} FILEPTR;
+
+

See also: Dcntl   DEVDRV +

+

5.24.19 flock, Fcntl

+
struct flock
+{
+    int16_t  l_type;     /* Type of lock                 */
+    int16_t  l_whence;   /* SEEK_SET, SEEK_CUR, SEEK_END */
+    int32_t  l_start;    /* Start of the locking region  */
+    int32_t  l_len;      /* Length of the locking region */
+    int16_t  l_pid;      /* PID of the locking process   */
+};
+
+

Note: Possible values for l_type are: 0 = Read locking, +1 = Write locking as well as 3 = No locking. +

+

5.24.20 iovec

+
struct iovec
+{
+    char    *iov_base;
+    int32_t iov_len;
+};
+
+

5.24.21 LINE

+
typedef struct
+{
+    uint8_t   maxlen;        /* Maximum line length */
+    uint8_t   actuallen;     /* Current line length */
+    int8_t    buffer[255];   /* Line buffer         */
+} LINE;
+
+

See also: Cconrs   GEMDOS +

+

5.24.22 ltchars

+
struct ltchars
+{
+    int8_t t_suspc;
+    int8_t t_dsuspc;
+    int8_t t_rprntc;
+    int8_t t_flushc;
+    int8_t t_werasc;
+    int8_t t_lnextc;
+};
+
+

See also: struct tty   XFS-concept in MagiC +

+

5.24.23 msghdr

+
/* structure used with sendmsg() and recvmsg() */
+struct msghdr
+{
+    struct sockaddr *msg_name;
+    int32_t         msg_namelen;
+    struct iovec    *msg_iov;
+    int32_t         msg_iovlen;
+    void            *msg_accrights;
+    int32_t         msg_accrightslen;
+};
+
+

5.24.24 mutimbuf

+
struct mutimbuf
+{
+   uint16_t actime;     /* Access time               */
+   uint16_t acdate;     /* Access date               */
+   uint16_t modtime;    /* Time of last modification */
+   uint16_t moddate;    /* Date of last modification */
+};
+
+

See also: Dcntl   Fcntl   GEMDOS +

+

5.24.25 Process Descriptor (PD) resp. BASEPAGE

+ + +
typedef struct pd
+{
+   VOID     *p_lowtpa;      /* Start address of the TPA            */
+   VOID     *p_hitpa;       /* First byte after the end of the TPA */
+   VOID     *p_tbase;       /* Start address of the program code   */
+   int32_t   p_tlen;        /* Length of the program code          */
+   VOID     *p_dbase;       /* Start address of the DATA segment   */
+   int32_t   p_dlen;        /* Length of the DATA section          */
+   VOID     *p_bbase;       /* Start address of the BSS segment    */
+   int32_t   p_blen;        /* Length of the BSS section           */
+   DTA      *p_dta;         /* Pointer to the default DTA          */
+                            /* Warning: Points first to the        */
+                            /* command line !                      */
+   struct pd *p_parent;     /* Pointer to the basepage of the      */
+                            /* calling processes                   */
+   int32_t   p_resrvd0;     /* Reserved                            */
+   int8_t   *p_env;         /* Address of the environment string   */
+   int8_t    p_resrvd1[80]; /* Reserved                            */
+   int8_t    p_cmdlin[128]; /* Command line                        */
+} PD; /* also: BASEPAGE */
+
+

Note about the command line: The number of characters is +inserted in the first line. The maximum length of the command line +does not amount to 127, but only to 124 characters! (This does +not apply in MagiC as of Version 3 - see ARGV procedure). +

+

See also: GEMDOS   OSHEADER   Pexec   Program launch and TPA +

+

5.24.26 Poll Descriptor

+ +
typedef struct pollfd
+{
+        int32_t  fd;            /* File descriptor to poll */
+        uint16_t events;        /* Types of events poller cares about */
+        uint16_t revents;       /* Types of events that actually occurred */
+} POLLFD;
+
+

See also: GEMDOS   Fpoll +

+

5.24.27 ploadinfo

+
struct ploadinfo
+{
+   int16_t fnamelen;  /* Lenght from 'fname'                         */
+   int8_t *cmdlin;    /* Command line of the processes (128 bytes)   */
+   int8_t *fname;     /* Complete path and filename of the processes */
+};
+
+

See also: Fcntl   PLOADINFO +

+

5.24.28 sgttyb

+
struct sgttyb
+{
+    int8_t   sg_ispeed;
+    int8_t   sg_ospeed;
+    int8_t   sg_erase;
+    int8_t   sg_kill;
+    uint16_t sg_flags;
+};
+
+

See also: struct tty   XFS-concept in MagiC +

+

5.24.29 struct sigaction

+ +

This structure is defined as follows: +

+
struct sigaction
+{
+   void cdecl (*sa_handler)(int32_t sig);
+   int32_t    sa_mask;
+   int16_t    sa_flags;
+};
+
+

Note: The component sa_handler can assume +various values here. A value of 0 means default signal-handling by the +system, with a value of 1 the signal will be ignored; any other value +will be interpreted as the address of a signal handling routine, which +is then called. +

+

The component sa_mask contains additionally (to the +signal currently being processed) the signals to be masked during the +signal handling. In that case mask = oldmask+(1<<sig)+sa_mask). +With sa_flags one can influence the behaviour of a signal +further. A value of 1 for sa_flags means in MiNT that the +signal SIGCHLD is triggered only on termination and not on stopping +the child; other values for sa_flags are not yet defined at +the present time. +

+

See also: Signals   Signal-handler in MagiC   GEMDOS   +Psigaction   Process functions +

+

5.24.30 sockaddr

+
/* generic socket address */
+struct sockaddr
+{
+    int16_t sa_family;
+    char    sa_data[14];
+};
+
+

5.24.31 STAT

+
struct time
+{
+   int32_t high_time;
+   int32_t time;
+   uint32_t nanoseconds;
+};
+
+typedef struct stat
+{
+   uint64_t   dev;               /* Device number             */
+   uint32_t   ino;               /* File number               */
+   uint32_t   mode;              /* File mode, statements for */
+                                 /* - possible filetypes      */
+                                 /* - special bits            */
+                                 /* - access rights           */
+   uint32_t   nlink;             /* Number of links           */
+   uint32_t   uid;               /* User number               */
+   uint32_t   gid;               /* Group number              */
+   uint64_t   rdev;              /* Actual device             */
+                                 /* (e.g. for BIOS files)     */
+   struct time atime;            /* time of last access, UTC */
+   struct time mtime;            /* time of last data modification, UTC */
+   struct time ctime;            /* time of last file status change, UTC */
+   int64_t    size;              /* File length               */
+   int64_t    blocks;            /* occupied blocks           */
+   int32_t    blksize;           /* Blocksize                 */
+   uint32_t   flags;             /* user defined flags for file */
+   uint32_t   gen;               /* file generation number    */
+   int32_t    reserved[7];       /* reserved                  */
+} STAT;
+
+

Note: MagiC returns for FAT file-systems the following +index data: +

+ + + + + + +
• Directories: Start cluster in Motorola format +
• Other files: + + + + + + +
High word = Start cluster of the directory +
Low word = Position within the directory >> 5 + +
+ + +
+ +

This procedure is similar to that used by Linux and Solaris. The +drawback is that files alter their index during a move. +

+

The component index is therefore a LONGword for the +unambiguous identification of a file or a folder. The index must be +unique within a file-system; together with the following field +(dev) it completely pinpoints a file or a folder +system-globally. +

+

Under UNIX-like file-systems, index is the number of the +Inode. +

+

On Macintosh partitions, the hard file ID or the hard dir ID +that the MacOS makes available is used. However, the MacOS uses FSSpec +as the standard descriptors. For directories, i.e. for directory IDs, +there are functions of the MacOS to calculate a FSSpec. Unfortunately +the hard file IDs for normal files (i.e. not subdirectories) +cannot continue to be used, as they are not processed by any +function of the MacOS. +

+

See also: XFS-concept in MagiC   Fxattr   Dxreaddir +

+

5.24.31.1 STAT, dev-components

+

Determines the file-system. On the Atari, 0..25 are the BIOS +drives A: to Z:, Drive U: or other file-systems use higher numbers. On +the Macintosh the 'volume ID' is used, which is assigned by the MacOS. +

+

5.24.31.2 STAT, possible filetypes

+ +

Possible filetypes that can be set or obtained via the STAT +structure: +

+
#define S_IFMT   0170000  /* For isolating the filetype */
+#define S_IFSOCK 0010000  /* Socket file                */
+#define S_IFCHR  0020000  /* Special BIOS file          */
+#define S_IFDIR  0040000  /* Directory                  */
+#define S_IFBLK  0060000  /* Block special file         */
+#define S_IFREG  0100000  /* Normal file                */
+#define S_IFIFO  0120000  /* FIFO (Pipe with name)      */
+#define S_IMEM   0140000  /* Memory block/process file  */
+#define S_IFLNK  0160000  /* Symbolic link              */
+
+

5.24.31.3 STAT, Sticky-bit

+

Special bits that can be set or obtained via the STAT +structure: +

+
#define S_ISUID 04000  /* Set user ID of the owner */
+#define S_ISGID 02000  /* Set group ID at call     */
+#define S_ISVTX 01000  /* Sticky-bit               */
+
+

Note: The meaning of the sticky-bit depends on +the filetype. +

+

5.24.31.4 STAT, size-components

+

On DOS partitions, folders return the value 0 as their +length. The actual length unfortunately cannot be ascertained due to +limitations of MSDOS. Only the length of the root directory can be +obtained. +

+

On Macintosh partitions folders always have the length +0, the actual length cannot be obtained (at least under System 7). +

+

5.24.31.5 STAT, access rights

+

Possible access rights that can be set or obtained via the +STAT structure: +

+
#define S_IRUSR 0400   /* Owner may read file       */
+#define S_IWUSR 0200   /* Owner may write           */
+#define S_IXUSR 0100   /* Owner members may execute */
+#define S_IRGRP 0040   /* Group members may read    */
+#define S_IWGRP 0020   /* Group members may write   */
+#define S_IXGRP 0010   /* Group members may execute */
+#define S_IROTH 0004   /* Others may read file      */
+#define S_IWOTH 0002   /* Others may write          */
+#define S_IXOTH 0001   /* Others may execute        */
+
+

5.24.32 tchars

+
struct tchars
+{
+    int8_t t_intrc;
+    int8_t t_quitc;
+    int8_t t_startc;
+    int8_t t_stopc;
+    int8_t t_eofc;
+    int8_t t_brkc;
+};
+
+

See also: struct tty   XFS-concept in MagiC +

+

5.24.33 timeval

+
struct timeval
+{
+  int32_t int tv_sec;
+  int32_t int tv_usec;
+};
+
+

tv_sec holds the number of seconds elapsed since the +epoch. The epoch is Thu, Jan 1 1970 00:00:00 UTC. +

+

tv_usec holds the fractional part of tv_sec +measured in microseconds. +

+

5.24.34 timezone

+
struct timezone
+{
+  int32_t int tz_minuteswest;
+  int32_t int tz_dsttime;
+};
+
+

tz_minuteswest holds the offset to UTC in seconds. +Timezones east of the zero-meridian (e.g. Eastern Europe) have a +negative offset, timezones west of the zero-meridian (e.g. America) +have a positive one. +

+

tz_dsttime is non-zero if daylight savings time applies +during some part of the year. +

+

5.24.35 struct tty

+
struct tty
+{
+    int16_t         pgrp;
+    int16_t         state;
+    int16_t         use_cnt;
+    int16_t         res1;
+    struct sgttyb   sg;
+    struct tchars   tc;
+    struct ltchars  ltc;
+    struct winsize  wsiz;
+    int32_t         rsel;
+    int32_t         wsel;
+    int8_t          *xkey;
+    int32_t         hup_ospeed;
+    uint16_t        vmin, vtime;
+    int32_t         resrvd[1];
+};
+
+

See also: Dcntl   dev_descr   XFS-concept in MagiC +

+

5.24.36 winsize

+
struct winsize
+{
+    int16_t  ws_row;
+    int16_t  ws_col;
+    int16_t  ws_xpixel;
+    int16_t  ws_ypixel;
+};
+
+

See also: Fcntl   TIOCGWINSZ +

+

5.24.37 XATTR

+
typedef struct xattr
+{
+   uint16_t   mode;              /* File mode, statements for */
+                                 /* - possible filetypes      */
+                                 /* - special bits            */
+                                 /* - access rights           */
+   int32_t    index;             /* File number               */
+   uint16_t   dev;               /* Device number             */
+   uint16_t   rdev;              /* Actual device             */
+                                 /* (e.g. for BIOS files)     */
+                                 /* in MagiC however reserved */
+   uint16_t   nlink;             /* Number of links           */
+   uint16_t   uid;               /* User number               */
+   uint16_t   gid;               /* Group number              */
+   int32_t    size;              /* File length               */
+   int32_t    blksize, nblocks;  /* Blocksize/occupied blocks */
+   uint16_t   mtime, mdate;      /* Date of last modification */
+   uint16_t   atime, adate;      /* Date of the last access   */
+   uint16_t   ctime, cdate;      /* Creation date             */
+   uint16_t   attr;              /* TOS file attributes       */
+   uint16_t   reserved2;         /* Reserviert                */
+   int32_t    reserved3[2];      /* Reserviert                */
+} XATTR;
+
+

Note: MagiC returns for FAT file-systems the following +index data: +

+ + + + + + +
• Directories: Start cluster in Motorola format +
• Other files: + + + + + + +
High word = Start cluster of the directory +
Low word = Position within the directory >> 5 + +
+ + +
+ +

This procedure is similar to that used by Linux and Solaris. The +drawback is that files alter their index during a move. +

+

The component index is therefore a LONGword for the +unambiguous identification of a file or a folder. The index must be +unique within a file-system; together with the following field +(dev) it completely pinpoints a file or a folder +system-globally. +

+

Under UNIX-like file-systems, index is the number of the +Inode. +

+

On Macintosh partitions, the hard file ID or the hard dir ID +that the MacOS makes available is used. However, the MacOS uses FSSpec +as the standard descriptors. For directories, i.e. for directory IDs, +there are functions of the MacOS to calculate a FSSpec. Unfortunately +the hard file IDs for normal files (i.e. not subdirectories) +cannot continue to be used, as they are not processed by any +function of the MacOS. +

+

See also: XFS-concept in MagiC   Fxattr   Dxreaddir +

+

5.24.37.1 XATTR, dev-components

+

Determines the file-system. On the Atari, 0..25 are the BIOS +drives A: to Z:, Drive U: or other file-systems use higher numbers. On +the Macintosh the 'volume ID' is used, which is assigned by the MacOS. +

+

5.24.37.2 XATTR, possible filetypes

+

Possible filetypes that can be set or obtained via the XATTR +structure: +

+
#define S_IFMT  0170000  /* For isolating the filetype */
+#define S_IFCHR 0020000  /* Special BIOS file          */
+#define S_IFDIR 0040000  /* Directory                  */
+#define S_IFREG 0100000  /* Normal file                */
+#define S_IFIFO 0120000  /* FIFO (Pipe with name)      */
+#define S_IMEM  0140000  /* Memory block/process file  */
+#define S_IFLNK 0160000  /* Symbolic link              */
+
+

5.24.37.3 XATTR, Sticky-bit

+

Special bits that can be set or obtained via the XATTR +structure: +

+
#define S_ISUID 04000  /* Set user ID of the owner */
+#define S_ISGID 02000  /* Set group ID at call     */
+#define S_ISVTX 01000  /* Sticky-bit               */
+
+

Note: The meaning of the sticky-bit depends on +the filetype. +

+

5.24.37.4 XATTR, size-components

+

On DOS partitions, folders return the value 0 as their +length. The actual length unfortunately cannot be ascertained due to +limitations of MSDOS. Only the length of the root directory can be +obtained. +

+

On Macintosh partitions folders always have the length +0, the actual length cannot be obtained (at least under System 7). +

+

5.24.37.5 XATTR, access rights

+

Possible access rights that can be set or obtained via the +XATTR structure: +

+
#define S_IRUSR 0400   /* Owner may read file       */
+#define S_IWUSR 0200   /* Owner may write           */
+#define S_IXUSR 0100   /* Owner members may execute */
+#define S_IRGRP 0040   /* Group members may read    */
+#define S_IWGRP 0020   /* Group members may write   */
+#define S_IXGRP 0010   /* Group members may execute */
+#define S_IROTH 0004   /* Others may read file      */
+#define S_IWOTH 0002   /* Others may write          */
+#define S_IXOTH 0001   /* Others may execute        */
+
+

5.24.37.6 XATTR, special bits

+

Special bits that may be set or obtained via the XATTR +structure: +

+
#define S_ISUID 04000  /* Set user ID of the owner */
+#define S_ISGID 02000  /* Set group ID at call     */
+#define S_ISVTX 01000  /* Sticky-bit               */
+
+

Note: The meaning of sticky-bit depends on the +filetype. +

+

5.24.38 xkey

+
struct xkey
+{
+    int16_t   xk_num;
+    int8_t    xk_def[8];
+};
+
+

See also: Fcntl   TIOCGXKEY +

+
+ +Home +GEMDOSGEMDOS +GEMDOS function listGEMDOS function list +Line-ALine-A + + diff --git a/en/gemdos_system.html b/en/gemdos_system.html new file mode 100644 index 000000000..a10833c59 --- /dev/null +++ b/en/gemdos_system.html @@ -0,0 +1,2775 @@ + + + + + +The documentation for TOS: System functions + + + + + + + + + +Home +GEMDOSGEMDOS +Network functionsNetwork functions +Directory functionsDirectory functions + +
+ +

5.14 System functions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Salert    Outputs alerts or error-messages. +
Sconfig   Obtains/Sets operating system configuration. +
Scookie   Controls cookie jar. +
Shutdown  Kills all processes, syncs file-systems then halts or reboots +the system. +
Slbclose  Closes a shared library +
Slbopen   Opens a shared library. +
Srealloc  Allocates screen memory. +
Ssystem   Controls cookie jar, memory access and various system settings. +
STEFcntrl STEmulator control functions. +
Super     Obtains or alters supervisor-mode. +
Suptime   Obtains the current uptime and load averages for the system. +
Sversion  Obtains the version number of GEMDOS. +
Syield    Releases CPU for other processes. +
Sync      Synchronises all mounted file-systems. +
Sysconf   Checks operating system configuration. + +
+ +

See also: File functions   Process functions +

+

5.14.1 Salert

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Salert« - Output alert or error-message. +
  +
Opcode: 316 +
  +
Syntax: void Salert ( int8_t *msg ); +
  +
Description: The function Salert outputs an alert or error-message that is +written to the alert pipeline U:\PIPE\ALERT. +
  +
The message msg should not contain any escape or control +characters, linefeeds etc. It should be a simple one-line +NULL-terminated character string alert- or error-message. +
  +
The function formats the message itself and sends it to the +user. The exact format of the output however depends on the system +configuration in use. +
  +
Return value: The function has no direct result. +
  +
Availability: Available when a 'MiNT' cookie with a version of at least 0.98 +exists. +
  +
Group: System functions +
  +
See also: Binding   Cconws   Test for pipes +
  + +
+ +

5.14.1.1 Bindings for Salert

+ + + + + + +
C: void Salert ( int8_t *msg ); +
  +
Assembler: +
  +
pea       msg          ; Offset 2
+move.w    #316,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

5.14.2 Sconfig

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Sconfig« - Configuration of parts of the operating system. +
  +
Opcode: 51 +
  +
Syntax: int32_t Sconfig ( int16_t mode, int32_t flags ); +
  +
Description: The function Sconfig permits the configuration of parts of the +operating system. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
mode Action + + + + + + + + + + + + + + + + + + + + + +
0 = Obtain configuration +
1 = Set configuration +
2 = Get pointer to DOSVARS structure; as of KAOS 1.4.2, MagiC +
3 = Reserved; MagiC 3.00 +
4 = For WBDAEMON; MagiC 4.01 +
5 = Reserved; MagiC 4.01 +
6 = Reserved; MagiC 4.01 + +
+ +
flags Configuration as bit-vector: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Bit-0 = Path-checking on +
Bit-1 = Insert mode for GEMDOS and dialog boxes +
Bit-2 = Reserved +
Bit-3 = Reserved +
Bit-4 = Fastload for diskette off +
Bit-5 = TOS-compatibility on +
Bit-6 = Smart redraw off +
Bit-7 = Grow-/Shrinkboxes off +
Bit-8 = No pause after TOS programs +
Bit-9 = Reserved +
Bit-10 = Pulldown menus +
Bit-11 = Floppy background operation + +
+ + +
+ +
Note: Set bits switch the relevant function on, cleared +bits switch in off again. +
Bit 11 is only available as of MagiC 3.0. The setting of the +configuration is only possible with TOS-compatibility switched +off. +
  +
The function is also present in KAOS, though with a somewhat +different assignment of the bit-vector. For mode, KAOS 1.2 +only knows the first two subfunctions. +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Bit-0 = Path-checking on +
Bit-1 = Disk change simulation in desktop on +
Bit-2 = Break on; CTRL-C interrogation at every DOS call +
Bit-3 = CTRL-C interrogation off; for character-oriented functions +
Bit-4 = Fastload for diskette off +
Bit-5 = TOS-compatibility on (as of KAOS 1.4.2) +
Bit-6 = Smart redraw off (as of KAOS 1.4.2) +
Bit-7 = Grow-/shrinkboxes off (as of KAOS 1.4.2) +
Bit-8 = No pause after TOS programs (as of KAOS 1.4.2) +
Bit-9 = MF2-Layout ein (as of KAOS 1.4.2) +
Bit-10 = Pulldown menus (as of KAOS 1.4.2) +
Bit-11..30 = Reserved (as of KAOS 1.4.2) +
Bit-31 = Has to be 0, else error! (as of KAOS 1.4.2) + +
+ +
Return value: The function returns, depending on the parameter mode, +the currently valid configuration or a pointer to a DOSVARS structure. +
In case of error the function will return EINVFN or EACCDN. +
  +
Availability: As of KAOS Version 1.2, and MagiC Version 1.0. +
  +
Group: System functions +
  +
See also: Binding   Sysconf +
  + +
+ +

5.14.2.1 Bindings for Sconfig

+ + + + + + +
C: int32_t Sconfig ( int16_t mode, int32_t flags ); +
  +
Assembler: +
  +
move.l    flags,-(sp)  ; Offset 4
+move.w    mode,-(sp)   ; Offset 2
+move.w    #51,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #8,sp        ; Correct stack
+
+ +
+ +

5.14.3 Scookie

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Scookie« - Cookie jar management. +
  +
Opcode: 330 (0x014a) +
  +
Syntax: int32_t Scookie ( int16_t action, COOKIE *cookie ); +
  +
Description: The function Scookie permits the management of the cookie jar. +The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
action Meaning +
    +
C_BAKE (0x01) cookie is a pointer to a cookie you want to install +into the cookie jar. Only root can bake a cookie (or you get EACCDN), +and you cannot overwrite an existing cookie (ELOCKED). +
Returns 0 for success, or a negative error code +
C_GRAB (0x02) cookie is a pointer to a cookie you want to grab from +the cookie jar. You must supply a cookie with a tag name to look for. +If you use a -1 (LONG) value for the cookie tag, then the first cookie +will be returned to you. If the cookie is found, it will be copied +into the cookie pointed to by cookie. +
Returns 0 for success or EFILNF. If you need direct access to the +jar, pass -1L as your cookie pointer. This will return a +pointer to the jar +
C_MORE (0x04) Like C_GRAB but find the NEXT cookie after the one with +a tag like cookie's. This is so that you can find the entire +jar with C_GRAB and C_MORE. The found cookie is copied +into cookie. The NULL cookie is copied into cookie if +cookie was the last cookie, or returns EFILNF if not found. +
Returns 0 for success (or last cookie) +
C_READ (0x08) cookie should be a LONG tag value to find, NOT a +pointer! The returned value is the value of the cookie indicated, or +EFILNF if not found. Use this when you know the cookie exists, such as +"_MCH" since this is faster and easier. +
C_SIZE (0x10) Returns the number of cookies that are actually in the jar. Use +C_READ,0 to find out how many cookies can be put in the jar +without resizing +
C_EAT (0x20) cookie is the cookie to delete (only need tag value). +Only root can eat cookies (or you get EACCDN). +
Returns EFILNF if cookie is not found or zero for success. + +
+ +
Return value: The return value depends on the parameter action +
In case of invalid action value the function will return EINVFN. +
  +
Availability: This function is not available, use Ssystem() instead to manage +cookies. +
  +
This function has been disabled as of FreeMiNT 1.12.4. +Opcode 330 is now assigned to Dchroot(). +
  +
Group: System functions +
  +
See also: Binding   Ssystem +
  + +
+ +

5.14.3.1 Bindings for Scookie

+ + + + + + +
C: int32_t Scookie ( int16_t action, COOKIE *cookie ); +
  +
Assembler: +
  +
pea       cookie       ; Offset 4
+move.w    action,-(sp) ; Offset 2
+move.w    #330,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #8,sp        ; Correct stack
+
+ +
+ +

5.14.4 Shutdown

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Shutdown« - Kill all processes, sync file-systems then halt +or reboot the system. +
  +
Opcode: 337 (0x0151) +
  +
Syntax: int32_t Shutdown ( int32_t mode ); +
  +
Description: The function Shutdown kills all processes, syncs file-systems +then halts or reboots the system. +
  + +
On mode equal to SHUT_POWER (0L), the system will turn +the power off. The only hardware that supports it at present is CT60 +and the FireBee. If the hardware does not support it, SHUT_HALT will +be performed. SHUT_POWER mode is recognized as of FreeMiNT version +1.16a; older versions of the kernel will treat the SHUT_POWER mode as +SHUT_COLD. +
  + +
On mode equal to SHUT_BOOT (1L), the system will reboot +the machine after shutting everything down. +
  + +
On mode equal to SHUT_COLD (2L), the system will act the +same as with the SHUT_BOOT mode, except that a cold start rather than +the warm start will be performed. SHUT_COLD mode is recognized as of +FreeMiNT version 1.15.5; older versions of the kernel will treat the +SHUT_COLD mode as SHUT_BOOT. +
  + +
On mode equal to SHUT_HALT (3L), the system will shut +down, then enter a halted condition. +
  +
All other values of mode are reserved for future +definition. +
  +
Older versions of MiNT contained a bug that might cause the +system to crash if you called Shutdown while both GEM AES and virtual +console daemon were present. +
  +
You need root privileges to shut the system down. +
  +
Return value: Returns a negative GEMDOS error-code if it fails. On success +this call obviously never returns. +
  +
Availability: As of the first in MultiTOS integrated MiNT version 1.04. +
  +
Group: System functions +
  +
See also: Binding   Sync +
  + +
+ +

5.14.4.1 Bindings for Shutdown

+ + + + + + +
C: void Shutdown ( int32_t mode ); +
  +
Assembler: +
  +
move.l    mode,-(sp)   ; Offset 2
+move.w    #337,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

5.14.5 Slbclose

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Slbclose« - Close a shared library +
  +
Opcode: 23 (0x017) +
  +
Syntax: int32_t Slbclose( SHARED_LIB *sl ); +
  +
Description: The function Slbclose closes a shared library. +
  +
The parameter sl is the descriptor that is obtained with +Slbopen. +
  +
Since MagiC 6: Is sl=-1, then all shared library +will be closed. +
  +
Return value: E_OK = All OK else a negative GEMDOS error-number. +
  +
Availability: As of MagiC 5.20 and FreeMiNT 1.15.4. +
  +
Group: System functions +
  +
See also: Binding   Slbopen   Shared libraries +
  + +
+ +

5.14.5.1 Bindings for Slbclose

+ + + + + + +
C: int32_t Slbclose( SHARED_LIB *sl ); +
  +
Assembler: +
  +
pea       sl           ; Offset 2
+move.w    #23,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

5.14.6 Slbopen

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Slbopen« - Open a shared library +
  +
Opcode: 22 (0x016) +
  +
Syntax: int32_t Slbopen( int8_t *name, int8_t *path, int32_t min_ver, +SHARED_LIB *sl, SLB_EXEC *fn ); +
  +
Description: The function Slbopen opens a shared library. +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
  +
name The name of the library, in capitals, incl. extension +(".SLB"). The library name is the filename as well. +
  +
path Path where the library is first looked for (the path must be +terminated in MagiC 5.20 with '\'; this is no longer necessary in +MagiC 6). If the parameter is NULL, or the library was not found in +the specified bath, then it will be looked for in the XTENSION folder. +
From MagiC 6 onwards the environmental variable SLBPATH will be +evaluated. As in PATH, it contains a list of the search paths, each +separated by ';'. If the variable is defined, then no extra search +will be made in the XTENSION folder. +
  +
With FreeMiNT an attempt will be made to load the library from +the current directory if path is NULL. +
  +
min_ver Lowest required version number of the library +
  +
sl Pointer to the descriptor +
  +
fn Pointer to the function pointer +
  + +
+ +
Return value: +
  + + + + + + + + + + + + + + + +
>= 0 All OK, version number of the library +
ERANGE Version number too low +
EACCDN Library already opened by the process +
EFILNF Library not found +
ENSMEM Insufficient memory available + +
+ +
Availability: As of MagiC 5.20 and FreeMiNT 1.15.4. +
  +
Group: System functions +
  +
See also: Binding   Slbclose   Shared libraries +
  + +
+ +

5.14.6.1 Bindings for Slbopen

+ + + + + + +
C: int32_t Slbopen( int8_t *name, int8_t *path, int32_t min_ver, +SHARED_LIB *sl, SLB_EXEC *fn ); +
  +
Assembler: +
  +
pea       fn           ; Offset 18
+pea       sl           ; Offset 14
+move.l    minver,-(sp) ; Offset 10
+pea       path         ; Offset 6
+pea       name         ; Offset 2
+move.w    #22,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS
+lea       22(sp),sp    ; Correct stack
+
+ +
+ +

5.14.7 Srealloc

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Srealloc« - Allocate screen memory. +
  +
Opcode: 21 +
  +
Syntax: int32_t Srealloc ( int32_t len ); +
  +
Description: The GEMDOS routine Srealloc allocates a block of length +len bytes for the screen memory. +
  +
The screen memory is a block of the ST-RAM whose owner is the +boot process. The address of the screen memory (logbase or physbase) +is not affected by this function. +
  +
Return value: The function returns (if len has the value -1) the +maximum possible size of the screen memory. +
  +
Availability: As of GEMDOS 0.30 (TOS 4). +
  +
Group: System functions +
  +
See also: Binding +
  + +
+ +

5.14.7.1 Bindings for Srealloc

+ + + + + + +
C: int32_t Srealloc ( int32_t len ); +
  +
Assembler: +
  +
move.l    len,-(sp)    ; Offset 2
+move.w    #21,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

5.14.8 Ssystem

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Ssystem« - Control cookie jar, memory access and various +system settings. +
  +
Opcode: 340 (0x0154) +
  +
Syntax: int32_t Ssystem ( int16_t mode, int32_t arg1, int32_t arg2 ); +
  +
Description: The Ssystem call has been designed to make your life easier. +Using this you can get some closer control of the system and the kernel +itself. Via this call the kernel now supports e.g. an easy cookie jar +management and provides a safe access to supervisor memory. It's +strictly encouraged to access GEMDOS variables and system vectors via +the Ssystem, because this way is considered safe for multi-user +setups. +
  +
arg1 and arg2 are LONG parameters specific to a +particular mode. If a mode doesn't use a parameter, it is usually +ignored, but should be set to zero for future compatibility. +mode specifies a particular action as follows: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
mode Meaning +
  + +
S_INQUIRE(0xffff) Returns a zero if the kernel supports Ssystem. You can expect +the function to be present if MiNT version at least 1.15 is detected. +
  + +
S_OSNAME(0x0000) Identifies the operating system type. Returned LONGword +contains a 32-bit positive number, which interpreted as an ASCII +string gives a 4-character ID. For MiNT the returned value is +0x4d694e54 ('MiNT'). +
  + +
S_OSXNAME(0x0001) Identifies the subtype of the operating system. If this call +returns zero or a negative value, that means that no subtype is +available. Otherwise the returned value, when interpreted as an ASCII +string, gives a 4-character subtype ID. For FreeMiNT, being a +derivative of the MiNT, the returned value is 0x46726565 ('Free'). +
  +
If a subtype ID is less than 4 characters long, it should be +padded with zeros. +
  + +
S_OSVERSION(0x0002) Identifies the exact operating system version. Returned +LONGword contains a 32-bit positive version number encoded as follows: +
  + + + + + + + + + + + + + + + + + + +
Bits Meaning +
    +
0-7 Some printable character to characterize the current version, +e.g. + + + + + + +
0x61 (`a') if alpha release, +
0x62 (`b') if beta release. + +
+ +
For official releases you will always find a value of 0 here. +
8-15 Patchlevel (0x55 for pl 88) +
16-23 Minor version number (0x0e for x.14) +
24-31 Major version number ($01 for 1.xx) + +
+ +
Definition of an official release: every release for which a +value of 0 is returned in bits 0-7... +
  + +
S_OSHEADER(0x0003) Allows accessing the TOS header so as to get some +information from it. Current implementation permits access to the +first 256 LONGwords of the header. The address of the required +LONGword, relative to the start address of the TOS header, has to +be specified as arg1. Only even values are allowed (bit 0 of +the arg1 is masked out by the kernel). A whole LONGword is +returned always. +
  + +
S_OSBUILDDATE(0x0004) Returns a 32-bit positive value with the build date encoded as +follows: +
  + + + + + + + + + + + + + + + +
Bits Meaning +
    +
0-15 Binary year ($07dd for 1998) +
16-23 Binary month ($0c for December) +
24-31 Binary day of the month + +
+ + +
S_OSBUILDTIME(0x0005) Returns a 32-bit positive value with the build time encoded as +follows: +
  + + + + + + + + + + + + + + + + + + +
Bits Meaning +
    +
0-7 Binary seconds +
8-15 Binary minutes +
16-23 Binary hours +
24-31 Day of week + +
+ +
Day of week has 1 for Monday, 2 for Tuesday... 7 for Sunday. +
  +
The call should never return a zero in these bits, but if it +does, it should be interpreted as Sunday. +
  + +
S_OSCOMPILE(0x0006) Returns a 32-bit positive value specifying the primary CPU type +the kernel has been compiled for. Encoding: +
  + + + + + + + + + + + + + + + +
Bits Meaning +
    +
0-7 Binary minor CPU ID +
8-15 Binary major CPU ID +
16-31 Reserved for future definition + +
+ +
The major ID identifies a particular series of processors. A +value of $00 is assigned to the Motorola 68k series and since kernel +version 1.19 a value of $01 is assigned to the ColdFire processors. +Other values of this field are reserved for future definition. +
  +
The minor CPU ID interpretation depends on the major ID. For 68k +series, values are as follows: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
0x0068000
0x0a68010
0x1468020
0x1e68030
0x2868040
0x3c68060
+
+ +
For the ColdFire series: +
  +

+
+ + + + + + + + + + + + + + + + +
0x00isa_a
0X01isa_a+
0X02isa_b
0X03isa_c
+
+ +
This is not the same as the _CPU cookie value. The _CPU +cookie specifies the CPU physically present in the machine, while the +S_OSCOMPILE indicates the processor type selected at the time when the +system was compiled. In other words, running a 68000-compiled kernel +will return a 0x00 here, even if the machine is running 68040 or +something. +
  + +
S_OSFEATURES(0x0007) Returns a 32-bit positive value specifying the state of kernel +features. Encoding: +
  + + + + + + + + + + + + + + + +
Bits Meaning +
    +
0 Memory protection (1 = turned on) +
1 Virtual memory (1 = turned on) +
2-31 Reserved for future usage + +
+ +
This call has an informative purpose only and you cannot toggle +anything with it. +
  + +
S_GETCOOKIE(0x0008) Fetches required information from the cookie jar. +
  + +
    +
  1. If arg1 is a value bigger than 65535 (0xffff), it is +interpreted as a tag ID. The cookie jar is searched for such a tag, +then if the tag is found, the corresponding slot value is returned, or +-1 otherwise. +
      +

  2. +
  3. If arg1 is a value between 1 and 65535, it is +interpreted as a slot number, not a tag ID. Then the corresponding tag +ID is fetched and returned, or a value of -1 if the specified slot is +free or does not exist at all (a slot number past the end of the +cookie jar was specified). The first slot in the cookie jar is +considered number 1. +
      +

  4. +
  5. If arg1 is equal to zero, then the cookie jar is +searched for the NULL cookie, and the corresponding slot value is +returned. +
      +

  6. +
+ +
The place where the value fetched from the cookie jar will be +returned is defined by arg2. If this is a zero, the call +returns its values in the GEMDOS return value (d0). If arg2 is +not a zero, it is interpreted as a pointer to a memory location where +the slot tag or its value should be written to. The return value is 0 +(E_OK) if everything went OK, or -1 otherwise. +
  +
This behaviour (where arg2 != NULL) is not implemented +in MiNT versions below 1.14.8. +
  + +
S_SETCOOKIE(0x0009) Places a tag ID specified by arg1 with the value of +arg2 in the cookie jar. If a slot with the specified tag ID +already exists, it will be replaced with the new value. NULL-cookie is +reallocated automatically and its value is adjusted. If there are no +more free slots, no action is performed and ENOMEM is returned +instead. +
  +
S_SETCOOKIE requires root euid, EACCES is returned otherwise and +no action is performed. +
  +
The call refuses to place a cookie (a value of -1 is returned) +whose tag id contains a zero-byte. +
  + +
S_GETLVAL(0x000a) Fetches and returns a LONGword from the address of supervisor +area specified as a 16-bit, even, unsigned integer value passed as +arg1. Bit 0 and bits 16-31 are masked out (ignored). The call +returns a zero if the value at the specified address has to be +"hidden" from reading. Currently the hidden values are the +initial PC value and the initial stack pointer value stored at +0x00000000 and 0x00000004 respectively. Reading a hidden value may +require root euid. +
  +
If the desired address is LONGword aligned, LONGwords can be +also retrieved from the supervisor area using Setexc. +
  + +
S_GETWVAL(0x000b) Fetches and returns a word from the address of supervisor area +specified as a 16-bit, even, unsigned integer value passed as +arg1. Bit 0 and bits 16-31 are masked out (ignored). The call +returns a zero if the value at the specified address has to be +"hidden" from reading. Currently the hidden values are the +initial PC value and the initial stack pointer value stored at +0x00000000 and 0x00000004 respectively. Reading a hidden value may +require root euid. +
  + +
S_GETBVAL(0x000c) Fetches and returns a byte from the address of supervisor area +specified as a 16-bit unsigned integer value passed as arg1. +Bits 16-31 are masked out (ignored). The call returns a zero if the +value at the specified address has to be "hidden" from +reading. Currently the hidden values are the initial PC value and the +initial stack pointer value stored at 0x00000000 and 0x00000004 +respectively. Reading a hidden value may require root euid. +
  + +
S_SETLVAL(0x000d) Places a LONGword value specified by arg2 at address +specified as 16-bit integer by arg1. Bit 0 and bits 16-31 of +the arg1 are masked out (ignored). Since this call is designed +to manipulate operating system variables located within the supervisor +area (first 32k), it is restricted to root euid and returns EACCES if +called by an unprivileged process. +
  + +
S_SETWVAL(0x000e) Places a word value specified by arg2 at address +specified as 16-bit integer by arg1. Bit 0 and bits 16-31 of +the arg1 are masked out (ignored). Since this call is designed +to manipulate operating system variables located within the supervisor +area (first 32k), it is restricted for root euid and returns EACCES if +called by an unprivileged process. +
  + +
S_SETBVAL(0x000f) Places a byte value specified by arg2 at address +specified as 16-bit integer by arg1. Bits 16-31 of the +arg1 are masked out (ignored). Since this call is designed to +manipulate operating system variables located within the supervisor +area (first 32k), it is restricted for root euid and returns EACCES if +called by an unprivileged process. +
  + +
S_SECLEVEL(0x0010) Resets the current security level to a value specified by +arg1. Valid levels are as follows: +
  +
0: none of hardware specific system calls are restricted. This +is a 'MultiTOS compatibility' mode. +
  +
1: BIOS and XBIOS calls require root privileges; any call +except Supexec and Super returns EACCES if called by an unprivileged +process. This does not apply to Setexc, which sends SIGSYS to the +caller if a change of an exception vector was attempted. +
  +
2: as above, with except that Supexec and Super generates SIGSYS +in order to kill the calling process. +
  +
On values bigger than 2, EACCES is returned. If arg1 is +equal to -1, the current security level value is returned. +
  +
The call absolutely needs root privileges - user processes +cannot even inquire the current security level value. +
  + +
S_RUNLEVEL(0x0011) Reserved for future definition. +
  + +
S_TSLICE(0x0012) Allows setting/interrogating the global timeslice value. Values +are exactly the same as for SLICES keyword in mint.cnf. If +arg1 is equal to -1, the call returns the current global +timeslice value. +
  +
Setting the timeslice requires root privileges. +
  + +
S_FASTLOAD(0x0013) Allows changing the interpretation of the FASTLOAD bit in the +program header. +
  +
On Ssystem(S_FASTLOAD, 0L, 0L); the program header bit will be +used as before, this is actually equal to FASTLOAD=NO in mint.cnf. +
  +
On Ssystem(S_FASTLOAD, 1L, 0L); , the program header bit will be +ignored and fastload will be forced for all programs. +
  +
arg1 = -1 allows interrogation of the current state of +this variable. +
  +
You need root privileges to toggle the FASTLOAD mode. +
  + +
S_SYNCTIME(0x0014) Allows interrogation or changing the global file-system sync +time. The default value is 5 sec. +
  +
If arg1 is a positive value, it is interpreted as a new +sync time value. +
  +
If arg1 is equal to -1, the current sync time value will +be returned. +
  +
To be able to change the file-system sync time you must have +root privileges. +
  + +
S_BLOCKCACHE(0x0015) A positive value of arg1 ranging from 0 to 100 +specifies the percentage of file-system cache to be filled with linear +reads, as in the PERCENTAGE keyword in the mint.cnf file. A negative +value of arg1 returns the currently set percentage value. +
  +
Root privileges are required to use this mode. +
  + +
S_FLUSHCACHE(0x0016) Invalidates CPU cache entries. arg1 is a pointer to the +memory area whose cache entries should be invalidated, arg2 is +the size of the area in bytes. Passing -1 as arg2 invalidates +all cache entries. If the CPU features separate instruction and data +caches, both are flushed. +
  +
This call automatically recognizes caches in 68020/030/040/060 +and handles them as appropriate. The 68060 branch cache is +automatically invalidated too. On 68000/68010 calling this mode has no +effect. This mode is in fact just an interface to the MiNT function +cpush used internally by the system. +
  +
Root privileges are NOT required to use this mode. +
  + +
S_CTRLCACHE(0x0017) Provides an universal (among 68k family members) way of +controlling the CPU on-chip caches. arg1, referenced as Cache +Control Word (CCW), is a bit-field where each bit enables (if 1) or +disables (if 0) a particular function of CPU caches. arg2, +referenced as Cache Control Mask (CCM), is a bit-mask where you define +(by setting appropriate bits to 1) which bits of the Cache Control +Word should be actually taken into account and written into the Cache +Control Register (CACR). This is the control mode of the S_CTRLCACHE. +
  +
In inquire mode you can pass -1 as either argument. If the CCW +is -1, the call returns a LONGword reflecting the actual state of the +caches. +
  +
If the CCM is -1, a default bit-mask is returned, where any bit +set indicates that a cache function defined by the same bit in the +Cache Control Word is valid for the processor the MiNT is currently +running on. +
  +
If both arguments are negative, the call simply returns E_OK if +it is valid at all, or ENOSYS otherwise. This is the acknowledge mode +of the S_CTRLCACHE. +
  +
Bits in either argument are defined as follows: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
020030040060CFv4e
0Enable instruction cachexxxxx
1Enable data cache-xxxx
2Enable branch cache---xx
3Freeze instruction cachexx---
4Freeze data cache-x---
5Instruction burst enable-x---
6Data burst enable-x---
7Enable write allocate-x---
8Instruction cache full mode enable---x-
9Instruction cache read/write allocate---x-
10Data cache full mode enable---x-
11Data cache read/write allocate enable---x-
12Invalidate branch cache---xx
13Invalidate branch cache user entries---x-
14Enable CPUSH invalidate---xx
15Enable store buffer---xx
16Instruction cache invalidate all----x
17Instruction cache mode default----x
18Instruction cache half lock enable----x
19CPUSH invalidate enable (instruction)----x
20Default cache-inhibited fill buffer----x
21Data cache invalidate all----x
22Default data cache mode (bit 0)----x
23Default data cache mode (bit 1)----x
24Data cache half lock enable----x
25-31Reserved for future definition
+
+ +
Note that no processor currently supports all of these functions +and some (68000 and 68010) have no on-chip caches at all. To figure +out what functions are valid for the actual CPU used, you should first +request the default bit-mask using the inquire mode described above. +Your program should save this mask, logically AND the arg2 +with it, then pass the result as the Cache Control Mask for a control +mode call. +
  +
Also note that the above bit definition does not exactly reflect +the function and even position of actual bits in the physical Cache +Control Register. The bits of either argument are arbitrarily assigned +to particular cache functions, but their position and state are +converted by the system before the Cache Control Register is written +and after it is read, so that the user program can see always the same +functions assigned to bits as above regardless of the physical +configuration of the Cache Control Register. +
  +
Since changing cache configuration is global and may severely +affect system performance, root privileges are needed to use +S_CTRLCACHE control mode. +
  + +
S_INITIALTPA(0x0018) A positive non-zero value of arg1 defines the default +amount of memory (in bytes) allocated for TPA space, as in the +INITIALMEM keyword of the mint.cnf file. A negative value allows one +to interrogate the value currently set. A value of 0 is illegal and +will cause the call to fail and return EBADARG. Note that even if you +define a very small value, like 1 or 2 bytes, the system will round +this up to the smallest size of a memory block possible to allocate. +
  +
Root privileges are required to use this mode. +
  + +
S_CTRLALTDEL(0x0019) Reserved for future definition. +
  + +
S_DELCOOKIE(0x001a) Removes a tag ID specified by arg1 from the cookie jar. +If there is no slot with the specified tag ID, no action is performed +and EINVAL is returned instead. +
  +
S_DELCOOKIE requires root euid, EPERM is returned otherwise and +no action is performed. +
  + +
S_LOADKBD(0x001b) Load the keyboard table into memory. arg1 specify the +address of the complete path to the keyboard table or NULL. If path is +NULL the default path of <sysdir>/keyboard.tbl is used. Returns +a negative GEMDOS error-code if it fails. On success this call returns +0 and _AKP and _ISO cookies are updated. +
  +
S_LOADKBD requires root euid, EPERM is returned otherwise and no +action is performed. +
  + +
S_SETEXC(0x001c) Allow Setexc(). Valid argc1 values are as follows: +
  + + + + + + + + + + + + + + + + + + +
Value Meaning +
    +
-1 Return the current setting +
0 Deny all (only kernel-processes may change sys-vectors) +
1 Deny trap-changes (numbers 0-15) +
2 Allow all (default) + +
+ +
Returns EBADARG if arg1 is greater than 2, or 0 on +success. +
  +
S_SETEXC requires root euid, EPERM is returned otherwise and no +action is performed. +
  + +
S_GETBOOTLOG(0x001d) Inquires the file path of bootlog file. arg1 and +arg2 specify the address and length in bytes, respectively, of +a memory buffer where a NULL-terminated ASCII string will be written +identifying the full name of the bootlog file. If the memory buffer is +not long enough to hold the entire string, the string is truncated +down to the buffer size. Returns EBADARG if arg1 is null or if +arg2 is 0. On success this call returns 0. +
  +
S_GETBOOTLOG requires root euid, EPERM is returned otherwise and +no action is performed. +
  + +
S_CLOCKUTC(0x0064) S_CLOCKUTC called with an arg1 of -1 inquires the +kernel's notion of the hardware system clock. If the command returns a +zero, the hardware clock is considered to tick in UTC; if it returns a +positive non-zero value, it is considered to tick in local time. Any +other positive value of arg1 sets the current clock mode. On a +0 it is reset to UTC, or to local time otherwise. +
  +
Although this call will never really change the setting of the +hardware clock, due to the changed interpretation the clock seems to +warp; don't play around too much with it. +
  + +
S_KNAME(0x0384) arg1 and arg2 specify the address and length in +bytes, respectively, of a memory buffer where a NULL-terminated ASCII +string will be written identifying the full name and version of the +system kernel. If the memory buffer is not long enough to hold the +entire string, the string is truncated down to the buffer size. +
  + +
S_CNAME(0x038e) arg1 and arg2 specify the address and length in +bytes, respectively, of a memory buffer where a NULL-terminated ASCII +string will be written identifying the full name of the compiler used +to compile the system kernel. If the memory buffer is not long enough +to hold the entire string, the string is truncated down to the buffer +size. +
  + +
S_CVERSION(0x038f) arg1 and arg2 specify the address and length in +bytes, respectively, of a memory buffer where a NULL-terminated ASCII +string will be written identifying the version of the compiler used to +compile the system kernel. If the memory buffer is not long enough to +hold the entire string, the string is truncated down to the buffer +size. +
  + +
S_CDEFINES(0x0390) arg1 and arg2 specify the address and length in +bytes, respectively, of a memory buffer where a NULL-terminated ASCII +string will be written containing the compile time definitions +(switches) used while compiling the system kernel. If the memory +buffer is not long enough to hold the entire string, the string is +truncated down to the buffer size. +
  + +
S_COPTIM(0x0391) arg1 and arg2 specify the address and length in +bytes, respectively, of a memory buffer where a NULL-terminated ASCII +string will be written containing the compile time optimization +options used while compiling the system kernel. If the memory buffer +is not long enough to hold the entire string, the string is truncated +down to the buffer size. +
  + +
S_DEBUGLEVEL(0x03e8) S_DEBUGLEVEL called with an arg1 of -1 inquires the +kernel's current debug level. Any other positive value will set the +current debug level. If it is a zero, the kernel will not output any +debugging information, except for fatal error-messages. The higher the +debug level, the more MiNT will spew about what it is doing. +
  +
Note that special debug kernels will output more information +than an ordinary distribution kernel. +
  +
Root privileges are needed to change the debug level. +
  + +
S_DEBUGDEVICE(0x03e9) S_DEBUGDEVICE called with an arg1 of -1 inquires the +current BIOS device to output the debug information to. The order of +defined BIOS devices is as follows: +
  +
    +
  • 0, printer +
  • +
  • 1, AUX: +
  • +
  • 2, console (default) +
  • +
  • 3, MIDI +
  • +
  • 4, keyboard +
  • +
  • 5, raw screen +
  • +
+ +
Any positive value of arg1, ranging from 0 to 9, will +redirect the debug information output to an appropriate BIOS device. +Notice however, that setting device 4 (keyboard) as a debug device +does not make much sense and may produce undesired results. The system +does not restrict this in any way though, just assuming that you know +what you're doing. +
  +
Root privileges are needed to change the debug device. +
  + +
S_DEBUGKMTRACE(0x044c) Dump out kmalloc'ed blocks with size and caller (debug kernel). +arg1 specify the address of the kmalloc'ed block to check and +arg2 specify the memory buffer where the dump will be written. +Returns ENOENT if it fails. On success this call returns 0. +
  +
S_DEBUGKMTRACE requires root euid, EPERM is returned otherwise +and no action is performed. +
  + +
S_TIOCMGET(0x54f8) This mode is reserved for the internal and exclusive usage of +the MiNT Library. +
  + +
+ +
Ssystem was first introduced as of MiNT version 1.14.6, but it +is considered fully functional as of MiNT version 1.15.0 release. +
  +
The S_OSHEADER opcode should be only used for fetching the +TOS version number when running MiNT versions below 1.15.0 release. +
  +
The S_FLUSHCACHE, S_CTRLCACHE, S_DEBUGLEVEL and S_DEBUGDEV are +supported as of MiNT version 1.15.1 release. +
  +
You should never use Ssystem(S_TIOCMGET, ...); in your own +programs. +
  +
The Ssystem behaviour does not depend on the S_SECLEVEL +settings. +
  +
Any values returned by the kernel on reserved fields should be +considered undocumented and no software should rely on them. +
  +
It's strictly encouraged to access GEMDOS variables and system +vectors via the Ssystem, because this way is considered safe for +multi-user setups. For example, you can access the cookie jar pointer +using the call Ssystem(S_GETLVAL, 0x05a0, NULL), though if +TOS-compatibility is the issue you should rather use (2, -1). +
  +
Prior to any further Ssystem usage, your application should +first check if the kernel supports this call. If it does, the +Ssystem(-1, 0L, 0L); should return a zero. +
  +
Ssystem is used and supported by the MiNT Library as of +patchlevel 48. +
  +
Return value: +
  +
Availability: Available when a 'MiNT' cookie with a version of at least 1.15 +exists. +
  +
Group: System functions +
  +
See also: Binding   Tgettimeofday   Tsettimeofday +
  + +
+ +

5.14.8.1 Bindings for Ssystem

+ + + + + + +
C: int32_t Ssystem ( int16_t mode, int32_t arg1, int32_t arg2 ); +
  +
Assembler: +
  +
move.l    arg2,-(sp)   ; Offset 8
+move.l    arg1,-(sp)   ; Offset 4
+move.w    mode,-(sp)   ; Offset 2
+move.w    #340,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+lea       $0c(sp),sp   ; Correct stack
+
+ +
+ +

5.14.9 STEFcntrl

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »STEFcntrl« - STEmulator control functions +
  +
Opcode: 24000 (0x5DC0) +
  +
Syntax: int32_t STEFcntrl ( int16_t func, int32_t special1, int32_t +special2 ); +
  +
Description: +
  +
SET_INFOTEXT (1) +
special1 = (int8_t *) Pointer to new info-line +
special2 = (int8_t *) Pointer to old info-line +
  +
The string pointed to be special1 will be adopted as the +new info-line in the status-line of the STEmulator. A value of NULL +switches back to the standard display again. +
  +
If a valid pointer to a buffer is passed in special2, +this will contain the old text of the info-line after the function +call. With NULL, nothing happens. +
  +
SET_WINDOWTITLE (2) +
special1 = (int8_t *) Pointer to new title-line +
special2 = (int8_t *) Pointer to old title-line +
  +
The string pointed to by special1 will be adopted as the +new title-line of the STEmulator window. +
  +
If a valid pointer to a buffer is passed in special2, +this will contain the old text of the window title after the function +call. With NULL, nothing happens. +
  +
Return value: EINVFN = Unknown function. +
ERANGE = Invalid parameter. +
  +
Availability: STEmulator +
  +
Group: System functions +
  +
See also: Binding +
  + +
+ +

5.14.9.1 Bindings for STEFcntrl

+ + + + + + +
C: int32_t STEFcntrl ( int16_t func, int32_t special1, int32_t +special2 ); +
  +
Assembler: +
  +
move.l    special2,-(sp)   ; Offset 8
+move.l    special1,-(sp)   ; Offset 4
+move.w    func,-(sp)       ; Offset 2
+move.w    #24000,-(sp)     ; Offset 0
+trap      #1               ; GEMDOS
+lea       $0c(sp),sp       ; Correct stack
+
+ +
+ +

5.14.10 Super

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »supervisor« - Switch supervisor-mode. +
  +
Opcode: 32 (0x0020) +
  +
Syntax: int32_t Super ( void *stack ); +
  +
Description: The GEMDOS routine Super switches between user- and +supervisor-mode, or interrogates the current operating +
  +
The address of the supervisor stack may be altered during +switching. If one passes the value 1 for the parameter stack, +then the current mode will be interrogated. The value 0 switches +between user- and supervisor-mode. All other values will be regarded +as the new address for the supervisor stack. In the supervisor-mode +one can access all protected memory blocks. +
  +
Note: With regard to future operating system versions, +you should avoid use of the Super function. This function gives rise +to major problems in conjunction with virtual memory and interruptible +(and re-entrant) file-systems in a multitasking system. If neccesary, +alter your code so that you can use the BIOS function Supexec. +
  +
For MiNT the following applies: +
If you are in SECURELEVEL > 1, you must have root privileges to +get into supervisor-mode. If you don't have them and call Super, the +SIGSYS signal (12) will be raised. +
  +
Return value: If the state is to be obtained, one gets the value 0 for the +user-mode and -1 for the supervisor-mode. Else the function returns +the address of the old supervisor stack, provided one had switched to +the supervisor-mode. +
  +
Availability: All GEMDOS versions. +
  +
Group: System functions +
  +
See also: Binding   Supexec +
  + +
+ +

5.14.10.1 Bindings for Super

+ + + + + + +
C: int32_t Super ( void *stack ); +
  +
Assembler: +
  +
pea       stack        ; Offset 2
+move.w    #32,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

5.14.10.2 Note for the use of the GEMDOS function Super

+

The function Super in switching to the supervisor-mode sets the +Super stack pointer to the user-stack of the program. This can be +fatal, as the program can not know how large a super stack block has +to be. Too small a stack can lead to faulty behaviour, crashes or +similar. The super stack no longer lies in a block that is possibly +protected by memory protection mechanisms, so it can be destroyed by +the program. +

+

A part of the user stack could have been laid-off by virtual +memory mechanisms. A laid-off super stack as seen from the processor +means that the MC-680x0 processor can no longer save its CPU status to +the super stack as usual for exceptions, and then stop intentionally. +No applications programmer should be so arrogant as to burden the +system with any kind of restriction to the supervisor stack size. +

+

See also: GEMDOS   Supexec +

+

5.14.11 Suptime

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Suptime« - Return the current uptime and load averages from +the system. +
  +
Opcode: 319 (0x013f) +
  +
Syntax: int32_t Suptime ( int32_t *uptime, int32_t *loadaverage ); +
  +
Description: The function Suptime returns the current uptime and load +averages from the system. +
  +
uptime is a pointer to a LONG value that will be filled +with the current amount of seconds elapsed since the last reboot. +
  +
loadaverage is a pointer to a three LONGword array, that +will be filled with the current load averages (for the last 1, 5 and +15 minutes). +
  +
The load average value is calculated using the following +formula: +
  +
sum += (new_load - old_load) * LOAD_SCALE; +
load_avg = sum / MAX_SIZE; +
  +
where LOAD_SCALE is 2048, MAX_SIZE is the number of 5 second +periods in the specified amount of time (12 for 1 min., 60 for 5 min. +and 180 for 15 min). new_load is the number of currently running +processes, old_load is the number of processes running previous time. +A 'running' process is considered the one which is put onto run or +ready queue. +
  +
Return value: Returns E_OK if successful, or a negative GEMDOS error-code +otherwise (actually it may be only ENOSYS if the call is not +supported...). +
  +
Availability: Available when a 'MiNT' cookie with a version of at least 1.11 +exists. +
  +
Group: System functions +
  +
See also: Binding +
  + +
+ +

5.14.11.1 Bindings for Suptime

+ + + + + + +
C: int32_t Suptime ( int32_t *uptime, int32_t *loadaverage ); +
  +
Assembler: +
  +
pea       loadaverage  ; Offset 6
+pea       uptime       ; Offset 4
+move.w    #48,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS
+lea       $0a(sp),sp   ; Correct stack
+
+ +
+ +

5.14.12 Sversion

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Operating system version« - Obtain the number of the current +GEMDOS version. +
  +
Opcode: 48 +
  +
Syntax: uint16_t Sversion ( void ); +
  +
Description: The GEMDOS routine Sversion obtains the version number of the +GEMDOS. At the present time, the following versions are known: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Version Explanation +
  +
0.13 Found in TOS 1.00 and 1.02. This version distinguishes +itself with several errors, so should not be used any more. +
  +
0.14 Number of the Turbo-DOS, which was issued for a short time by +Atari with hard drives. Fast, but also very unsafe. KAOS 1.2.x also +has this version number. +
  +
0.15 Found in TOS 1.04 and 1.06. This version is relatively fast +and stable. +
  +
0.16 KAOS 1.4.x +
  +
0.17 Found in TOS 1.62. The difference from version 0.15 lies +only in the fact that the patch program POOLFIX3.PRG is no longer +required. +
  +
0.19 Normally found in TOS 2.01, 2.05, 2.06, 3.01, 3.05, 3.06. +This version was mainly extended by functions for managing alternate +memory, and is also reported by MagiC up to Version 6.10. +
  +
0.20 TOS 2.06 up to 2.95 and TOS 3.06 have the GEMDOS version +0.20. Only change known so far: Media with only one FAT are supported. +MagiC 6.20 returns also 0.20. +
  +
0.30 TOS 4.00 to 4.04, also MultiTOS 1.00 and 1.08. +
  +
0.31 Milan-TOS 4.05. Mxalloc ignores bit 2 to 15 of mode. +
  +
0.32 Milan-TOS 4.08, Release 08.07.1999 +
  +
0.33 Milan-TOS 4.08, Release 15.06.2001 +
  +
0.40 FreeMiNT +
  + +
+ +
Return value: The function returns the named version number, in the following +manner: +
  + + + + + + +
Low byte : Main version number +
High byte : Minor version number + +
+ +
The value is BCD coded. +
  +
Availability: All GEMDOS versions. +
  +
Group: System functions +
  +
See also: Binding   Sysconf   TOS list +
  + +
+ +

5.14.12.1 Bindings for Sversion

+ + + + + + +
C: uint16_t Sversion ( void ); +
  +
Assembler: +
  +
move.w    #48,-(sp)    ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

5.14.13 Syield

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Syield« - Release CPU for other processes. +
  +
Opcode: 255 +
  +
Syntax: void Syield ( void ); +
  +
Description: By calling the Syield function a process releases the CPU, so +that it can be allocated to other processes (possibly earlier than +planned). +
  +
Note: Under MagiC this function directly calls the +AES routine appl_yield, and will be ignored in the Auto folder. +
  +
Return value: The function does not return a result. +
  +
Availability: In MagiC as of Version 3.0, and when the MiNT cookie is +present. +
  +
Group: System functions +
  +
See also: Binding   Pause   Fselect +
  + +
+ +

5.14.13.1 Bindings for Syield

+ + + + + + +
C: void Syield ( void ); +
  +
Assembler: +
  +
move.w    #255,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

5.14.14 Sync

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Sync« - Synchronise all mounted file-systems. +
  +
Opcode: 336 (0x0150) +
  +
Syntax: void Sync ( void ); +
  +
Description: The function Sync synchronises all mounted file-systems. +
  +
Warning: In MagiC this function is called Ssync. +
  +
Return value: The function does not return a result. +
  +
Availability: MagiC as of Version 4.01, and under all MiNT versions +integrated with MultiTOS. +
  +
Group: System functions +
  +
See also: Binding   Shutdown +
  + +
+ +

5.14.14.1 Bindings for Sync

+ + + + + + +
C: void Sync ( void ); +
  +
Assembler: +
  +
move.w    #336,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

5.14.15 Sysconf

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Sysconf« - Obtain information about the operating system +configuration. +
  +
Opcode: 290 +
  +
Syntax: int32_t Sysconf ( int16_t n ); +
  +
Description: The function Sysconf returns information about the capabilities +(or the configuration) of the operating system. With the parameter +n various values can be interrogated: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
n Meaning +
    +
-1 Max. legal value for n itself +
 0 Max. value of memory regions per process +
 1 Max. length of command line string for Pexec +
 2 Max. number of open files per process +
 3 Max. number of supplementary groups per process +
 4 Max. number of processes per user +
 5 HZ (CLK_TCK) +
 6 Pagesize +
 7 Available physical pages +
 8 Password buffer size +
 9 Group buffer size. + +
+ +
A return value of 0x7fffffff (2^31 - 1) means that the +corresponding value is unlimited. +
Note: MagiC may return -1 for unlimited values. +
  +
Return value: Return value: The function returns the information +specified by the parameter n. +
  +
Availability: As of the first in MultiTOS integrated MiNT version 1.04. +
  +
Group: System functions +
  +
See also: Binding   Dpathconf +
  + +
+ +

5.14.15.1 Bindings for Sysconf

+ + + + + + +
C: int32_t Sysconf ( int16_t n ); +
  +
Assembler: +
  +
move.w    n,-(sp)      ; Offset 2
+move.w    #290,-(sp)   ; Offset 0
+trap      #1           ; GEMDOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +
+ +Home +GEMDOSGEMDOS +Network functionsNetwork functions +Directory functionsDirectory functions + + diff --git a/en/gemdos_tpa.html b/en/gemdos_tpa.html new file mode 100644 index 000000000..54fecf981 --- /dev/null +++ b/en/gemdos_tpa.html @@ -0,0 +1,92 @@ + + + + + +The documentation for TOS: Program launch and TPA + + + + + + + + + +Home +GEMDOSGEMDOS +The program formatThe program format +SignalsSignals + +
+ +

5.6 Program launch and TPA

+ + +

At the launch of a program it is very important to return +surplus memory to the operating system with Mshrink, as otherwise +there will be no memory available for other processes. +

+

A compiler normally takes over this task automatically; an +assembler programmer, however, has to perform this task himself. The +corresponding routine may look something like the following: +

+
            .text
+
+            move.l    4(sp),a0      ; Pointer to BASEPAGE
+            lea       mystack,sp    ; Set stack pointer
+            move.l    #$100,d0      ; Length of basepage
+            add.l     $c(a0),d0     ; Length of the TEXT segment
+            add.l     $14(a0),d0    ; Length of the DATA segment
+            add.l     $1c(a0),d0    ; Length of the BSS segment
+            move.l    d0,-(sp)      ; Return to the stack
+            move.l    a0,-(sp)      ; Basepage address to stack
+            clr.w     -(sp)         ; Fill parameter
+            move.w    #$4a,-(sp)    ; Mshrink
+            trap      #1            ; Call GEMDOS
+            lea       $c(sp),sp     ; Correct stack
+            jsr       main          ; Call main program
+            move.w    d0,-(sp)      ; Return value of the program
+            move.w    #$4c,-(sp)    ; Pterm
+            trap      #1            ; Call GEMDOS
+
+            .bss
+
+            .ds.l     2000          ; 8000 bytes stack
+mystack:    .ds.l     2
+
+

In plain language: The required memory space is +calculated by adding together the length of the basepage, the TEXT, +the DATA and the BSS segments, as well as the stack (if necessary). +All the required information resides in the basepage, whose address is +passed as a parameter on the stack (4(sp)). The calculated value is +then the number of bytes to which the TPA (Transient Program Area, +memory range of a program) can be shrunk to. +

+

After execution of this procedure, the TPA of a program then +has the following form: +

+

+

The memory released in this way can now be used by GEMDOS for +other purposes: perhaps for launching further programs, or to satisfy +memory allocations via Malloc or Mxalloc. +

+ + +

For a TSR program (Terminate and Stay +Resident) too the required memory space can be found by the +above method; the only difference is that programs of this type do +not terminate themselves with Pterm but with Ptermres, and +with this anchor themselves resident in memory. +

+

See also: BASEPAGE   Memory management +

+
+ +Home +GEMDOSGEMDOS +The program formatThe program format +SignalsSignals + + diff --git a/en/gemdos_trap.html b/en/gemdos_trap.html new file mode 100644 index 000000000..f18676cd5 --- /dev/null +++ b/en/gemdos_trap.html @@ -0,0 +1,62 @@ + + + + + +The documentation for TOS: gemdos-trap + + + + + + + + + +Home +GEMDOSGEMDOS +SignalsSignals +File functionsFile functions + +
+ +

5.8 gemdos-trap

+ + + + + + + + + + + + + + + + +
Name: »gemdos« - Execute GEMDOS-trap. +
  +
Declaration: LONG gemdos ( VOID , ... ); +
  +
Description: The routine gemdos performs a TRAP #1 call. The parameters +depend on the particular GEMDOS function in each case. +
  +
Return value: The function returns a value of the data type LONG. +
  +
See also: bios   xbios   GEMDOS   Dispatcher +
  + +
+ +
+ +Home +GEMDOSGEMDOS +SignalsSignals +File functionsFile functions + + diff --git a/en/geneva_function.html b/en/geneva_function.html new file mode 100644 index 000000000..8f48e4be5 --- /dev/null +++ b/en/geneva_function.html @@ -0,0 +1,1536 @@ + + + + + +The documentation for TOS: Geneva library + + + + + + + + + +Home +AESAES +Form libraryForm library +Graphics libraryGraphics library + +
+ +

8.12 Geneva library

+

This library contains special functions, which only available on +Geneva. +

+ + + + + + + + + + + + + + + + + + + + + + + + +
x_help Start the Help display program. +
x_malloc Allocate memory from Geneva. +
x_mfree Free memory allocated with x_malloc. +
x_mshrink Shrink a memory block with x_malloc. +
x_realloc Change the size of memory allocated with x_malloc. +
x_settings Get or set Geneva's internal settings. +
x_sprintf Print data to a string. +
x_sscanf Read formatted data from a string. + +
+ +

See also: About the AES +

+

8.12.1 x_help

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Geneva help« - Inform the Help display program of a request +for help text. +
  +
Opcode: 29061 +
  +
Syntax: int16_t x_help( int8_t *topic, int8_t *helpfile, int16_t +sensitive ); +
  +
Description: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
topic Help topic to search for +
helpfile GEMDOS file name to search first for the help topic, or NULL to +search only GENEVA.HLP. +
sensitive 0 = topic is not case-sensitive + +
+ +
This function is used by a program to provide online help for +its features. +
  +
Geneva begins by checking to see if the help display program is +already in memory. If it is not, then it is loaded from disk by way of +the SHOWHELP environmental variable, as set in GEM.CNF. +
  +
Once the program is in memory, it is sent a message containing +the values passed in the x_help function call. The user is then either +shown the help text, or an error message saying that the topic was not +found. +
  +
The topic parameter points to a NUL-terminated string +containing the help topic to search for. If sensitive is +non-zero, then the case (upper/lower) of the topic must exactly match +what is stored in the help file. If, however, sensitive is zero, both +the case-sensitive and case-insensitive sections of the help file are +searched for the topic. +
  +
filename points to a NUL-terminated string describing +the path and file name of the default help file to search for the +topic. If no path information is used, then the PATH environmental +variable is searched (by way of shel_find) for the file. If this file +is not found, or the topic is not found in the file, the user receives +an error message. If filename is NULL (0L), then the topic is only +searched for in GENEVA.HLP. +
  +
Return value: An error code (0) is returned if either the help program could +not be loaded, or there was insufficient free memory to send the +message. +
  +
Availability: The function is only available under Geneva. +
  +
Group: Geneva library +
  +
See also: Binding +
  + +
+ +

8.12.1.1 Bindings for x_help

+ + + + + + + + + +
C: int16_t x_help( int8_t *topic, int8_t *helpfile, int16_t +sensitive ); +
  +
Binding: +
  +
int16_t x_help( int8_t *topic, int8_t *helpfile, int16_t
+sensitive )
+{
+   int_in[0] = sensitive
+   addr_in[0] = topic;
+   addr_in[1] = helpfile;
+
+   crys_if(29061);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]29061 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]sensitive
addr_inaddr_in[0]topic
addr_in+4addr_in[1]helpfile
int_outint_out[0]Return value
+
+ + +
+ +

8.12.2 x_malloc

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »memory allocation« - Allocate memory from Geneva. +
  +
Opcode: 29062 +
  +
Syntax: void x_malloc( void **addr, int32_t size ); +
  +
Description: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
size Number of bytes to be reserved +
addr Pointer to a pointer which receives the address of an allocated +block, or 0L + +
+ +
This function allocates memory, much in the same way Malloc or +malloc does. The only major difference is that it comes without the +extra overhead of malloc. Since Geneva takes this memory from the same +pool as the rest of its memory, it is also not as likely to cause +memory fragmentation if the application allocates lots of small blocks +using this call as it is when doing so with Malloc. +
  +
If no memory could be allocated, the addr is set to NULL +(0L). +
  +
Unlike the GEMDOS Malloc function, this function does not accept +the "size" -1L. +
  +
Return value: The function have no return value. +
  +
Availability: The function is only available under Geneva since Release 004. +
  +
Group: Geneva library +
  +
See also: Binding +
  + +
+ +

8.12.2.1 Bindings for x_malloc

+ + + + + + + + + +
C: void x_malloc( void **addr, int32_t size ); +
  +
Binding: +
  +
void x_malloc( void **addr, int32_t size )
+{
+   (int32_t)int_in[0] = size;
+
+   addr_in[0] = addr;
+
+   crys_if(29062);
+
+   return;
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]29062 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]MSW of the size
int_in+2int_in[1]LSW of the size (lower 16 bits)
addr_inaddr_in[0]addr
+
+ + +
+ +

8.12.3 x_mfree

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »memory free« - Free memory allocated with x_malloc. +
  +
Opcode: 29063 +
  +
Syntax: int16_t x_mfree( void *addr ); +
  +
Description: +
  + + + + + + + + + +
Parameter Meaning +
    +
addr Pointer to a memory block previously allocated with x_malloc. + +
+ +
Return value: 0 = Success +
other = Failure +
  +
Availability: The function is only available under Geneva since Release 004. +
  +
Group: Geneva library +
  +
See also: Binding +
  + +
+ +

8.12.3.1 Bindings for x_mfree

+ + + + + + + + + +
C: int16_t x_mfree( void *addr ); +
  +
Binding: +
  +
int16_t x_mfree( void *addr )
+{
+   addr_in[0] = addr;
+
+   crys_if(29063);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]29063 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]addr
int_outint_out[0]Return value
+
+ + +
+ +

8.12.4 x_mshrink

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »memory shrink« - Shrink a memory block allocated with +x_malloc. +
  +
Opcode: 29064 +
  +
Syntax: int16_t x_mshrink( void *addr, int32_t newsize ); +
  +
Description: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
addr Pointer to a memory block previously allocated with x_malloc. +
newsize New size of the memory block. + +
+ +
This function shrinks (decreases the size of) a block of memory +previously allocated with the x_malloc function. The newsize +must be less than the original size, or Failure will be returned. +
  +
Return value: 0 = Success +
other = Failure +
  +
Availability: The function is only available under Geneva since Release 004. +
  +
Group: Geneva library +
  +
See also: Binding +
  + +
+ +

8.12.4.1 Bindings for x_mshrink

+ + + + + + + + + +
C: int16_t x_mshrink( void *addr, int32_t newsize ); +
  +
Binding: +
  +
int16_t x_mshrink( void *addr, int32_t newsize )
+{
+   int_in[0-1] = newsize;    /* int_in[0] MSW of the size */
+                             /* int_in[1] LSW of the size (lower 16 bits) */
+   addr_in[0] = addr;
+
+   crys_if(29064);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]29064 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]newsize; MSW of the size
int_in+2int_in[1]newsize; LSW of the size (lower 16 bits)
addr_inaddr_in[0]addr
int_outint_out[0]Return value
+
+ + +
+ +

8.12.5 x_realloc

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »memory realloc« - Change the size of memory allocated with +x_malloc. +
  +
Opcode: 29065 +
  +
Syntax: int16_t x_realloc( void **addr, int32_t newsize ); +
  +
Description: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
addr Pointer to a memory block previously allocated with x_malloc. +
newsize New size of the memory block. + +
+ +
This function changes the size of a block of memory previously +allocated with the x_malloc function. If newsize is greater +than the block's original size, it may be necessary for Geneva to move +the block to a new location. If there is insufficient free memory to +increase the size of the block, the "old" block continues to +reside where it was and an error code is returned. +
  +
Return value: 0 = Success +
other = Failure +
  +
Availability: The function is only available under Geneva since Release 004. +
  +
Group: Geneva library +
  +
See also: Binding +
  + +
+ +

8.12.5.1 Bindings for x_realloc

+ + + + + + + + + +
C: int16_t x_realloc( void **addr, int32_t newsize ); +
  +
Binding: +
  +
int16_t x_realloc( void **addr, int32_t newsize )
+{
+   int_in[0-1] = newsize;    /* int_in[0] MSW of the size */
+                             /* int_in[1] LSW of the size (lower 16 bits) */
+   addr_in[0] = addr;
+
+   crys_if(29065);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]29065 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]newsize; MSW of the size
int_in+2int_in[1]newsize; LSW of the size (lower 16 bits)
addr_inaddr_in[0]addr
int_outint_out[0]Return value
+
+ + +
+ +

8.12.6 x_settings

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Geneva settings« - Get or set Geneva's internal settings. +
  +
Opcode: 29056 +
  +
Syntax: int16_t x_settings ( int16_t getset, int16_t length, SETTINGS +*user ); +
  +
Description: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
getset 0 = Get, 1 = Set, -1 = Reset +
length length of bytes to get or set +
user Points to SETTINGS to get or set, or NULL + +
+ +
0: Get +
Read length bytes (or the maximum length of the SETTINGS +structure.) Setting length to a negative number will read the whole +structure, though this is not recommended since future versions may +expand the SETTINGS structure. +
  +
Example: +
  +
SETTINGS set;
+x_settings ( 0, sizeof(set), &set );
+
+
1: Set +
Set length bytes (or the maximum length of the SETTINGS +structure.) Setting length to a negative number will set the whole +structure, though this is not recommended since future versions may +expand the SETTINGS structure. The contents of user are not modified. +
  +
Example: Temporarily disable pulldowns: +
  +
SETTINGS set;
+x_settings ( 0, sizeof(set), &set ); /* get current        */
+set.pulldown = 0;
+x_settings ( 1, sizeof(set), &set ); /* turn off           */
+...                                  /* do some stuff here */
+set.pulldown = 1;
+x_settings ( 1, sizeof(set), &set ); /* turn back on       */
+
+
-1: Reset +
Reset length bytes of the settings to their default values. If +length is less than zero, all of the settings will be reset. The user +parameter can be NULL, since it is not used. +
  +
Return value: The function always returns 1. +
  +
Availability: The function is only available under Geneva. +
  +
Group: Geneva library +
  +
See also: Binding +
  + +
+ +

8.12.6.1 Bindings for x_settings

+ + + + + + + + + +
C: int16_t x_settings ( int16_t getset, int16_t length, SETTINGS +*user ); +
  +
Binding: +
  +
int16_t x_settings ( int16_t getset, int16_t length, SETTINGS
+*user )
+{
+   int_in[0] = getset;
+   int_in[1] = length;
+   addr_in[0] = user;
+
+   crys_if(29056);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]29056 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]getset
int_in+2int_in[1]length
addr_inaddr_in[0]user
int_outint_out[0]Return value
+
+ + +
+ +

8.12.7 x_sprintf

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Geneva sprinft« - Print data to a string, with extended +formats. +
  +
Opcode: 29059 +
  +
Syntax: void x_sprintf( int8_t *buf, int8_t *fmt, ... ); +
  +
Description: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
buf Buffer to receive output string +
fmt Null-terminated format string +
... Pointer to first argument on user stack + +
+ +
This function acts almost identically to the sprintf function +found in C programming libraries. It understands the following format +specifiers: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
%cCharacter
%sString
%xUnsigned int in hexadecimal
%XUnsigned long in hexadecimal
%dSigned int in decimal
%DSigned long in decimal
%oSigned int in octal
%bBoolean: 'F' for 0, or 'T' for non-zero
%kWhen passed a pointer to a KEYCODE structure, output
all three elements using the format "%02x %02x %02x"
%vTake the int argument and output the MSB and LSB in the
format "%x.%02x". Used for generating version numbers.
%SSurround the string with curly braces, so that a string
containing spaces can be read back in correctly with
the x_sscanf function
%hSame as %x
+
+ +
These prefixes can be used before the string and number formats: +
  +

+
+ + + + + + + + + + + + + + + + +
-Left-justified, instead of right-justified
0Pad with 0's insteausof spaces
0-9Any number of digits (following a possible first '0'
for padding) specify the field length, in decimal
+
+ +
Example:                                   Result:
+x_sprintf( str, "%04x", 0xFE );            00FE
+x_sprintf( str, "%-06s", "Hi!" );          Hi!000
+x_sprintf( str, "%6s", "Hi!" );            Hi!
+x_sprintf( str, "%b %v", 2, 0x502 );       T 5.02
+x_sprintf( str, "%S %s", "a b", "c d" );   {a b} c d
+KEYCODE key = { 1, 0, 'X' };
+x_sprintf( str, "key=%k", &key );          keyd 1 00 58
+
+
This sort of thing doesn't really belong in a GUI, but it made +sense to include it, since it is used by Geneva internally, anyway. +
  +
Return value: The function have no return value. +
  +
Availability: The function is only available under Geneva. +
  +
Group: Geneva library +
  +
See also: Binding +
  + +
+ +

8.12.7.1 Bindings for x_sprintf

+ + + + + + + + + +
C: void x_sprintf( int8_t *buf, int8_t *fmt, ... ); +
  +
Binding: +
  +
void x_sprintf( int8_t *buf, int8_t *fmt, ... )
+{
+   addr_in[0] = buf;
+   addr_in[1] = fmt;
+   addr_in[2] = &...;
+
+   crys_if(29059);
+
+   return;
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]29059 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]3 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]buf
addr_in+4addr_in[1]fmt
addr_in+8addr_in[2]...
+
+ + +
+ +

8.12.8 x_sscanf

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Geneva sscanf« - Read formatted data from a string, with +extended formats. +
  +
Opcode: 29060 +
  +
Syntax: void x_sscanf( int8_t *buf, int8_t *fmt, ... ); +
  +
Description: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
buf Buffer containing data +
fmt Null-terminated format string +
... Pointer to first argument on user stack + +
+ +
This function acts almost identically to the sscanf function +found in C programming libraries. It understands the following format +specifiers: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
%cCharacter
%sString
%xUnsigned int in hexadecimal
%XUnsigned long in hexadecimal
%dSigned int in decimal
%DSigned long in decimal
%oSigned int in octal
%bBoolean: 'F' for 0, or 'T' for non-zero
%kWhen passed a pointer to a KEYCODE structure, output
all three elements using the format "%02x %02x %02x"
%vTake the int argument and output the MSB and LSB in the
format "%x.%02x". Used for generating version numbers.
%SSurround the string with curly braces, so that a string
containing spaces can be read back in correctly with
the x_sscanf function
%hUnsigned char in hexadecimal
+
+ +
Example:                                   Result:
+int i;
+char str[10], str2[10], bool;
+KEYCODE key;
+x_sscanf( "FE", "%x", &i );                i = 0xFE
+x_sscanf( "Hi!", "%s", str );              str = "Hi!"
+x_sscanf( "T 5.02", "%b %v", &bool, &i );  bool = 1, i = 0x502
+x_sscanf( "{a b} c", "%S %s", str, str2 ); str = "a b", str2 = "c"
+x_sprintf( "01 00 58", "%k", &key );       key = { 1, 0, 58 };
+
+
This sort of thing doesn't really belong in a GUI, but it made +sense to include it, since it is used by Geneva internally, anyway. +
  +
Return value: The function have no return value. +
  +
Availability: The function is only available under Geneva. +
  +
Group: Geneva library +
  +
See also: Binding +
  + +
+ +

8.12.8.1 Bindings for x_sscanf

+ + + + + + + + + +
C: void x_sscanf( int8_t *buf, int8_t *fmt, ... ); +
  +
Binding: +
  +
void x_sscanf( int8_t *buf, int8_t *fmt, ... )
+{
+   addr_in[0] = buf;
+   addr_in[1] = fmt;
+   addr_in[2] = &...;
+
+   crys_if(29060);
+
+   return;
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]29060 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]3 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]buf
addr_in+4addr_in[1]fmt
addr_in+8addr_in[2]...
+
+ + +
+ +
+ +Home +AESAES +Form libraryForm library +Graphics libraryGraphics library + + diff --git a/en/gpl.html b/en/gpl.html new file mode 100644 index 000000000..b8da9262e --- /dev/null +++ b/en/gpl.html @@ -0,0 +1,384 @@ + + + + + +The documentation for TOS: The GNU General Public Licence + + + + + + + + + +Home +IntroductionIntroduction +HistoryHistory +TOSTOS + +
+ +

1.4 The GNU General Public Licence

+
                   GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                  GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange;
+    or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject
+to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do
+not excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program
+by all those who receive copies directly or indirectly through you,
+then the only way you could satisfy both it and this License would be
+to refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended
+to apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new
+versions of the General Public License from time to time.  Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Program does not specify a
+version number of this License, you may choose any version ever
+published by the Free Software Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the
+author to ask for permission.  For software which is copyrighted by
+the Free Software Foundation, write to the Free Software Foundation;
+we sometimes make exceptions for this.  Our decision will be guided by
+the two goals of preserving the free status of all derivatives of our
+free software and of promoting the sharing and reuse of software
+generally.
+
+    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+PROGRAM IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                END OF TERMS AND CONDITIONS
+
+
+        How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these
+terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year>  <name of author>
+
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
+  USA
+
+
+Also add information on how to contact you by electronic and paper
+mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type
+    `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the
+appropriate parts of the General Public License.  Of course, the
+commands you use may be called something other than `show w' and
+`show c'; they could even be mouse-clicks or menu items -- whatever
+suits your program.
+
+You should also get your employer (if you work as a programmer) or
+your school, if any, to sign a "copyright disclaimer" for the program,
+if necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  program `Gnomovision' (which makes passes at compilers) written by
+  James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library,
+you may consider it more useful to permit linking proprietary
+applications with the library.  If this is what you want to do, use
+the GNU Library General Public License instead of this License.
+
+
+
+ +Home +IntroductionIntroduction +HistoryHistory +TOSTOS + + diff --git a/en/graf.html b/en/graf.html new file mode 100644 index 000000000..28e32ae9b --- /dev/null +++ b/en/graf.html @@ -0,0 +1,3695 @@ + + + + + +The documentation for TOS: Graphics library + + + + + + + + + +Home +AESAES +Geneva libraryGeneva library +Scrap libraryScrap library + +
+ +

8.13 Graphics library

+

This library takes on the management of rectangles; so one can +draw a rectangle that moves automatically with the mouse pointer, say. +In all, the following functions are available: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
graf_dragbox Moves a rectangular outline frame +
graf_growbox Animates a growing rectangle +
graf_handle Obtains ID of the AES workstation +
graf_mbox Displays moving rectangle +
graf_mkstate Obtains state of mouse pointer and keyboard +
graf_mouse Alters appearance of mouse pointer +
graf_multirubber Displays two 'rubber band' outline rectangles +
graf_rubbox Display 'rubber band' outline rectangle +
graf_shrinkbox Animates a shrinking rectangle +
graf_slidebox Obtains slider position +
graf_watchbox Selects an object and supervises mouse movements referring to +this object +
graf_wwatchbox Selects an object in a window and supervises mouse movements +referring to this object. +
graf_xhandle Obtains ID of the AES workstation +
x_graf_blit Blit one area of the screen to another location +
x_graf_rast2rez Convert a bit image +
x_graf_rubberbox Extended rubberband box drawing + +
+ +

Note: Of these, graf_handle has earned special +importance because with its aid the ID of the physical screen +workstation can be obtained. +

+

See also: Style guidelines +

+

8.13.1 graf_dragbox

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Graphics drag box« - Move a rectangular outline frame with +the mouse. +
  +
Opcode: 71 +
  +
Syntax: int16_t graf_dragbox ( int16_t gr_dwidth, int16_t gr_dheight, +int16_t gr_dstartx, int16_t gr_dstarty, int16_t gr_dboundx, int16_t +gr_dboundy, int16_t gr_dboundw, int16_t gr_dboundh, int16_t +*gr_dfinishx, int16_t *gr_dfinishy ); +
  +
Description: The call graf_dragbox allows the movement a small, rectangular +outline frame within a larger bounding rectangle. Its most frequent +use is to give the user a visual clue when an object is being dragged +on the screen. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
gr_dwidth Initial width, +
gr_dheight Height, +
gr_dstartx X-coordinate, and +
gr_dstarty Y-coordinate of the frame to be moved +
gr_dboundx X-coordinate, +
gr_dboundy Y-coordinate, +
gr_dboundw Width, and +
gr_dboundh Height of the bounding rectangle +
gr_dfinishx X-coordinate, and +
gr_dfinishy Y-coordinate of the frame destination when the mouse button is +released + +
+ +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: All AES versions. +
  +
Group: Graphics library +
  +
See also: Binding +
  + +
+ +

8.13.1.1 Bindings for graf_dragbox

+ + + + + + + + + +
C: int16_t graf_dragbox ( int16_t gr_dwidth, int16_t gr_dheight, +int16_t gr_dstartx, int16_t gr_dstarty, int16_t gr_dboundx, int16_t +gr_dboundy, int16_t gr_dboundw, int16_t gr_dboundh, int16_t +*gr_dfinishx, int16_t *gr_dfinishy ); +
  +
Binding: +
  +
int16_t graf_dragbox (int16_t gr_dwidth, int16_t gr_dheight,
+                      int16_t gr_dstartx, int16_t gr_dstarty,
+                      int16_t gr_dboundx, int16_t gr_dboundy,
+                      int16_t gr_dboundw, int16_t gr_dboundh,
+                      int16_t *gr_dfinishx,
+                      int16_t *gr_dfinishy)
+{
+   int_in[0] = gr_dwidth;
+   int_in[1] = gr_dheight;
+   int_in[2] = gr_dstartx;
+   int_in[3] = gr_dstarty;
+   int_in[4] = gr_dboundx;
+   int_in[5] = gr_dboundy;
+   int_in[6] = gr_dboundw;
+   int_in[7] = gr_dboundh;
+
+   crys_if (71);
+
+   *gr_dfinishx = int_out[1];
+   *gr_dfinishy = int_out[2];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]71 # Function opcode
control+2control[1]8 # Entry in int_in
control+4control[2]3 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]gr_dwidth
int_in+2int_in[1]gr_dheight
int_in+4int_in[2]gr_dstartx
int_in+6int_in[3]gr_dstarty
int_in+8int_in[4]gr_dboundx
int_in+10int_in[5]gr_dboundy
int_in+12int_in[6]gr_dboundw
int_in+14int_in[7]gr_dboundh
int_outint_out[0]Return value
int_out+2int_out[1]gr_dfinishx
int_out+4int_out[2]gr_dfinishy
+
+ + +
+ +

8.13.2 graf_growbox

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Graphics grow box« - Draw an animated, growing rectangle. +
  +
Opcode: 73 +
  +
Syntax: int16_t graf_growbox ( int16_t gr_gstx, int16_t gr_gsty, +int16_t gr_gstwidth, int16_t gr_gstheight, int16_t gr_gfinx, int16_t +gr_gfiny, int16_t gr_gfinwidth, int16_t gr_gfinheight ); +
  +
Description: The call graf_growbox draws an animated rectangular outline box +growing from one set of coordinates to another (complement to +graf_shrinkbox). The following apply: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
gr_gstxX-coordinate,
gr_gstyY-coordinate,
gr_gstwidthWidth, and
gr_gstheightHeight of the outline box at start
gr_gfinxX-coordinate,
gr_gfinyY-coordinate,
gr_gfinwidthWidth, and
gr_gfinheightHeight of the outline box at end
+
+ +
Note: As of PC-GEM Version 2.0, this call is ignored. +The reason given for this is the legal dispute between Apple +and Digital Research. +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: All AES versions. +
  +
Group: Graphics library +
  +
See also: Binding   form_dial   graf_shrinkbox +
  + +
+ +

8.13.2.1 Bindings for graf_growbox

+ + + + + + + + + +
C: int16_t graf_growbox ( int16_t gr_gstx, int16_t gr_gsty, +int16_t gr_gstwidth, int16_t gr_gstheight, int16_t gr_gfinx, int16_t +gr_gfiny, int16_t gr_gfinwidth, int16_t gr_gfinheight ); +
  +
Binding: +
  +
int16_t graf_growbox (int16_t gr_gstx, int16_t gr_gsty,
+                      int16_t gr_gstwidth,
+                      int16_t gr_gstheight, int16_t gr_gfinx,
+                      int16_t gr_gfiny, int16_t gr_gfinwidth,
+                      int16_t gr_gfinheight)
+{
+   int_in[0] = gr_gstx;
+   int_in[1] = gr_gsty;
+   int_in[2] = gr_gstwidth;
+   int_in[3] = gr_gstheight;
+   int_in[4] = gr_gfinx;
+   int_in[5] = gr_gfiny;
+   int_in[6] = gr_gfinwidth;
+   int_in[7] = gr_gfinheight;
+
+   return ( crys_if(73) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]73 # Function opcode
control+2control[1]8 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]gr_gstx
int_in+2int_in[1]gr_gsty
int_in+4int_in[2]gr_gstwidth
int_in+6int_in[3]gr_gstheight
int_in+8int_in[4]gr_gfinx
int_in+10int_in[5]gr_gfiny
int_in+12int_in[6]gr_gfinwidth
int_in+14int_in[7]gr_gfinheight
int_outint_out[0]Return value
+
+ + +
+ +

8.13.3 graf_handle

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Graphics handle« - Obtain the VDI handle of the AES +workstation. +
  +
Opcode: 77 +
  +
Syntax: int16_t graf_handle ( int16_t *gr_hwchar, int16_t *gr_hhchar, +int16_t *gr_hwbox, int16_t *gr_hhbox ); +
  +
Description: The call graf_handle obtains the ID of the physical screen +workstation on which the AES outputs, as well as some further +information which will be filled in the following parameters when the +function exits: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
gr_hwchar Width, and +
gr_hhchar Height of a character from the system font, in points +
gr_hwbox Width, and +
gr_hhbox Height of a cell into which any character from the system font +will fit completely + +
+ +
Note: The information from the parameters +gr_hwbox or gr_hhbox is used be the AES for the +width of the individual window components. +
  +
Return value: The function returns the ID (handle) of the opened AES +workstation. +
  +
Availability: All AES versions. +
  +
Group: Graphics library +
  +
See also: Binding   v_opnvwk   graf_xhandle +
  + +
+ +

8.13.3.1 Bindings for graf_handle

+ + + + + + + + + +
C: int16_t graf_handle ( int16_t *gr_hwchar, int16_t *gr_hhchar, +int16_t *gr_hwbox, int16_t *gr_hhbox ); +
  +
Binding: +
  +
int16_t graf_handle (int16_t *gr_hwchar, int16_t *gr_hhchar,
+                     int16_t *gr_hwbox, int16_t *gr_hhbox)
+{
+   crys_if (77);
+
+   *gr_hwchar = int_out[1];
+   *gr_hhchar = int_out[2];
+   *gr_hwbox  = int_out[3];
+   *gr_hhbox  = int_out[4];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]77 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]5 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_outint_out[0]Return value
int_out+2int_out[1]gr_hwchar
int_out+4int_out[2]gr_hhchar
int_out+6int_out[3]gr_hwbox
int_out+8int_out[4]gr_hhbox
+
+ + +
+ +

8.13.4 graf_mbox/graf_movebox

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Graphics move box« - Move a rectangle with the mouse. +
  +
Opcode: 72 +
  +
Syntax: int16_t graf_movebox ( int16_t gr_mwidth, int16_t gr_mheight, +int16_t gr_msourcex, int16_t gr_msourcey, int16_t gr_mdestx, int16_t +gr_mdesty ); +
  +
or +
  +
int16_t graf_mbox( ... ) +
  +
Description: The call graf_movebox draws a rectangle of constant size that +moves with the mouse pointer, and is used to give the user a visual +'clue' to an action undertaken by an application. The following apply: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
gr_mwidthWidth, and
gr_mheightHeight of the rectangle
gr_msourcexX-coordinate, and
gr_msourceyY-coordinate of top left corner at start
gr_mdestxX-coordinate, and
gr_mdestyY-coordinate of top left corner at end
+
+ +
Note: The function can be used, for instance, when the +movement of an icon is not permitted (e.g. dragging the printer icon +onto the wastebasket icon) and so it is to be placed back at its +original position. +
  +
In older GEM documentation this function is also called +'graf_mbox'! +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: All AES versions. +
  +
Group: Graphics library +
  +
See also: Binding +
  + +
+ +

8.13.4.1 Bindings for graf_mbox

+ + + + + + + + + +
C: int16_t graf_mbox ( int16_t gr_mwidth, int16_t gr_mheight, +int16_t gr_msourcex, int16_t gr_msourcey, int16_t gr_mdestx, int16_t +gr_mdesty ); +
  +
oder +
  +
int16_t graf_movebox ( ... ) +
  +
Binding: +
  +
int16_t graf_mbox (int16_t gr_mwidth, int16_t gr_mheight,
+                   int16_t gr_msourcex, int16_t gr_msourcey,
+                   int16_t gr_mdestx, int16_t gr_mdesty)
+{
+   int_in[0] = gr_mwidth;
+   int_in[1] = gr_mheight;
+   int_in[2] = gr_msourcex;
+   int_in[3] = gr_msourcey;
+   int_in[4] = gr_mdestx;
+   int_in[5] = gr_medsty;
+
+   return ( crys_if(72) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]72 # Function opcode
control+2control[1]6 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]gr_mwidth
int_in+2int_in[1]gr_mheight
int_in+4int_in[2]gr_msourcex
int_in+6int_in[3]gr_msourcey
int_in+8int_in[4]gr_mdestx
int_in+10int_in[5]gr_mdesty
int_outint_out[0]Return value
+
+ + +
+ +

8.13.5 graf_mkstate

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Graphics mouse and keyboard status« - Obtain the state of +the mouse and keyboard. +
  +
Opcode: 79 +
  +
Syntax: int16_t graf_mkstate ( int16_t *gr_mkmx, int16_t *gr_mkmy, +int16_t *gr_mkmstate, int16_t *gr_mkkstate ); +
  +
Description: The call graf_mkstate obtains the current mouse position as +well as the state of the mouse buttons and the so-called 'special' +keys ([Shift], [Control], [Alternate]). The following apply: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
gr_mkmx X-position, and +
gr_mkmy Y-position of the mouse pointer +
gr_mkmstate State of mouse buttons (Bit 0 = left button, etc.) +
gr_mkkstate 'Special' keys of keyboard as bit-vector: +
+
+ + + + + + + + + + + + + + + + + + + + +
0x0001=Right [Shift] key
0x0002=Left [Shift] key
0x0004=[Control] key
0x0008=[Alternate] key
+
+ + +
+ +
Note: A bit is set when the corresponding mouse button +or key is pressed down. +
  +
Return value: This is always a 1. +
  +
Availability: All AES versions. +
  +
Group: Graphics library +
  +
See also: Binding   evnt_button +
  + +
+ +

8.13.5.1 Bindings for graf_mkstate

+ + + + + + + + + +
C: int16_t graf_mkstate ( int16_t *gr_mkmx, int16_t *gr_mkmy, +int16_t *gr_mkmstate, int16_t *gr_mkkstate ); +
  +
Binding: +
  +
int16_t graf_mkstate (int16_t *gr_mkmx, int16_t *gr_mkmy,
+                      int16_t *gr_mkmstate,
+                      int16_t *gr_mkkstate)
+{
+   crys_if (79);
+
+   *gr_mkmx     = int_out[1];
+   *gr_mkmy     = int_out[2];
+   *gr_mkmstate = int_out[3];
+   *gr_mkkstate = int_out[4];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]79 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]5 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_outint_out[0]Return value
int_out+2int_out[1]gr_mkmx
int_out+4int_out[2]gr_mkmy
int_out+6int_out[3]gr_mkmstate
int_out+8int_out[4]gr_mkkstate
+
+ + +
+ +

8.13.6 graf_mouse

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Graphics mouse« - Change the appearance of the mouse +pointer. +
  +
Opcode: 78 +
  +
Syntax: int16_t graf_mouse ( int16_t gr_monumber, MFORM *gr_mofaddr ); +
  +
Description: The call graf_mouse permits changing the appearance of the +mouse pointer. The following apply for the parameter +gr_monumber: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 gr_monumberMeaning
ARROW0Arrow
TEXT_CRSR1Text cursor
HOURGLASS2Hourglass, bee
BUSY_BEE2See HOURGLASS
BUSYBEE2See HOURGLASS
POINT_HAND3Pointing hand
FLAT_HAND4Flat hand
THIN_CROSS5Thin crosshairs
THICK_CROSS6Thick crosshairs
OUTLN_CROSS7Outlined crosshairs
 8Sizer (N.AES)
X_LFTRT8Left-right arrow (Geneva)
 9Horizontal arrows (N.AES)
X_UPDOWN9Up-down arrow (Geneva)
 10Vertical arrows (N.AES)
USER_DEF255User-defined mouse form
M_OFF256Switch off mouse pointer
M_ON257Switch on mouse pointer
M_SAVE258Save current mouse form
M_RESTORE259Restore last shape
M_LAST260Restore most recently saved form
M_PREVIOUS260See M_LAST
XACRS_BUBBLE_DISC270The Data Uncertain logo (XaAES)
XACRS_RESIZER271The 'resize window' cursors (XaAES)
XACRS_NE_SIZER272(XaAES)
XACRS_MOVER273The 'move window' cursor (XaAES)
XACRS_VERTSIZER274The 'resize vertically' cursor (XaAES)
XACRS_HORSIZER275The 'resize horizontally' cursor (XaAES)
XACRS_POINTSLIDE276The 'two-arrows pointing inwards'
  cursor to pinpoint slider position(XaAES)
X_MRESET1000(Geneva)
X_MGET1001(Geneva)
X_SET_SHAPE1100(Geneva)
+
+ +
If gr_monumber = USER_DEF, then gr_mofaddr is a +pointer to the MFORM structure that sets the appearance of the mouse +pointer. +
  +
Note: One should ensure that outside of the working area +of one's own window, the mouse pointer takes the form of an arrow or +hourglass. +
  +
In the event that the application must change the mouse form, +set the highest bit (bit 15) of gr_monumber to 1 and OR it +with the desired mouse form index. After finishing the work, call +graf_mouse with the value 0 to set the mouse back to an arrow. +
  + +
M_FORCE   0x8000 +
  +
Whether modes 258-260 are available, or whether the mouse form +is managed locally for each application can be inquired with appl_getinfo +(opcode 8). +
  +
+
X_MRESET (1000)
+
+

+
  +
graf_mouse( X_MRESET, 0L ); +
  +
Resets the mouse so that it is 'on' just once, and also updates +graf_mouse's idea of the hide count. +
  +

+ +
+
X_MGET (1001)
+
+

+
  +
hidecount = graf_mouse( X_MGET, MFORM *mouse ); +
  +
In this mode, if mouse is non-zero, then the MFORM it +points to is filled-in with the shape of the last mouse set with +graf_mouse. 'hidecount' gets the number of times the mouse was hidden +using graf_mouse(M_OFF...). If this number is greater than zero, the +mouse is hidden that number of times. If it is zero, the mouse is +shown once. If it is less than zero, the mouse is 'shown' more than +once. +
  +

+ +
+
X_SET_SHAPE (1100)
+
+

+
  +
graf_mouse( X_SET_SHAPE+index, ANI_MOUSE *mouse_form ); +
  +
Change the shape of the mouse form whose number is +index. The ANI_MOUSE structure contains up to 32 mouse shapes +to be animated in a continuous loop while that particular mouse shape +is being displayed. +
If the frames portion of the ANI_MOUSE structure is one, +then no animation is performed. Otherwise, it should be the number of +frames contained in the mouse animation sequence. The delay +value is the number of 50 Hz timer ticks to pause between each frame +in the animation. The form portion of the structure only needs +to be initialized for the number of frames, so if there are only two +frames, this means that only form[0] and form[1] are used. If a NULL +pointer is passed instead of a pointer to an ANI_MOUSE structure, then +the mouse shape is restored to its default. +
It does not matter if the application which sets a new shape +terminates without resetting the mouse shape, as this call allocates +memory internally to hold the new shape data. +
  +

+ +
+
+
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: All AES versions. +
  +
Group: Graphics library +
  +
See also: Binding   Mouse clicks and shapes +
  + +
+ +

8.13.6.1 Bindings for graf_mouse

+ + + + + + + + + +
C: int16_t graf_mouse ( int16_t gr_monumber, MFORM *gr_mofaddr ); +
  +
Binding: +
  +
int16_t graf_mouse (int16_t gr_monumber, MFORM *gr_mofaddr)
+{
+   int_in[0]  = gr_monumber;
+   addr_in[0] = gr_mofaddr;
+
+   return ( crys_if(78) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]78 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]gr_monumber
addr_inaddr_in[0]gr_mofaddr
int_outint_out[0]Return value
+
+ + +
+ +

8.13.7 graf_multirubber

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Graphics rubberbox« - Draw two 'rubber band' outline +rectangles on the screen. +
  +
Opcode: 69 +
  +
Syntax: int16_t graf_multirubber(int16_t x, int16_t y, int16_t minw, +int16_t minh, GRECT *rec, int16_t *outw, int16_t *outh) +
  +
Description: The call graf_multirubber displays a pair of 'rubber bands' in +the form of rectangles on the screen, whose top left corner remains +fixed and bottom right corner can be moved while the left mouse button +is held down. Similar to graf_rubberbox, but with two rectangles. The +following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
x X-coordinate, and +
y Y-coordinate of initial corner +
minw Minimum width of rubber band box +
minh Minimum height of rubber band box +
rec   +
outw Width of rubber band box when releasing the mouse button +
outh Height of rubber band box when releasing the mouse button + +
+ +
Note: For the reasons mentioned above, the function +should only be called with an already pressed mouse button, since it +returns when the button is released. It's interesting that the minimum +width and height parameters may also take negative values; the +rubber band may then be stretched from bottom right to top left. +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: The function is only available under N.AES. +
  +
Group: Graphics library +
  +
See also: Binding   graf_rubberbox   x_graf_rubberbox +
  + +
+ +

8.13.7.1 Bindings for graf_multirubber

+ + + + + + + + + +
C: int16_t graf_multirubber(int16_t x, int16_t y, int16_t minw, +int16_t minh, GRECT *rec, int16_t *outw, int16_t *outh) +
  +
Binding: +
  +
int16_t graf_multirubber (int16_t x, int16_t y, int16_t minw,
+                          int16_t minh, GRECT *rec,
+                          int16_t *outw, int16_t *outh)
+{
+   int_in[0] = x;
+   int_in[1] = y;
+   int_in[2] = minw;
+   int_in[3] = minh;
+
+   addr_in[0] = rec;
+
+   crys_if (69);
+
+   *outw = int_out[1];
+   *outh = int_out[2];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]69 # Function opcode
control+2control[1]4 # Entry in int_in
control+4control[2]3 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]x
int_in+2int_in[1]y
int_in+4int_in[2]minw
int_in+6int_in[3]minh
addr_inaddr_in[0]rec
int_outint_out[0]Return value
int_out+2int_out[1]outw
int_out+4int_out[2]outh
+
+ + +
+ +

8.13.8 graf_rubberbox/graf_rubbox

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Graphics rubberbox« - Draw 'rubber band' outline rectangle +on the screen. +
  +
Opcode: 70 +
  +
Syntax: int16_t graf_rubberbox ( int16_t gr_rx, int16_t gr_ry, int16_t +gr_minwidth, int16_t gr_minheight, int16_t *gr_rlastwidth, int16_t +*gr_rlastheight ); +
  +
or +
  +
int16_t graf_rubbox ( ... ); +
  +
Description: The call graf_rubberbox displays a 'rubber band' in the form of +a rectangle on the screen, whose top left corner remains fixed and its +bottom right corner can be moved while the left mouse button is held +down. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
gr_rx X-coordinate, and +
gr_ry Y-coordinate of initial corner +
gr_minwidth Minimum width of rubber band box +
gr_minheight Minimum height of rubber band box +
gr_rlastwidth Width, and +
gr_rlastheight Height of rubber band box when releasing the mouse button + +
+ +
Note: For the reasons mentioned above, the function +should only be called with an already pressed mouse button, since it +returns when the button is released. It's interesting that the minimum +width and height parameters may also take negative values; the +rubber band may then be stretched from bottom right to top left. +
  +
In older GEM documentation this function is also called +'graf_rubbox'! +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: All AES versions. +
  +
Group: Graphics library +
  +
See also: Binding   graf_multirubber   x_graf_rubberbox +
  + +
+ +

8.13.8.1 Bindings for graf_rubberbox

+ + + + + + + + + +
C: int16_t graf_rubberbox ( int16_t gr_rx, int16_t gr_ry, int16_t +gr_minwidth, int16_t gr_minheight, int16_t *gr_rlastwidth, int16_t +*gr_rlastheight ); +
  +
or +
  +
int16_t graf_rubbox ( ... ) +
  +
Binding: +
  +
int16_t graf_rubbox (int16_t gr_rx, int16_t gr_ry,
+                     int16_t gr_minwidth,
+                     int16_t gr_minheight,
+                     int16_t *gr_rlastwidth,
+                     int16_t *gr_rlastheight)
+{
+   int_in[0] = gr_rx;
+   int_in[1] = gr_ry;
+   int_in[2] = gr_minwidth;
+   int_in[3] = gr_minheight;
+
+   crys_if (70);
+
+   *gr_rlastwidth = int_out[1];
+   *gr_lastheight = int_out[2];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]70 # Function opcode
control+2control[1]4 # Entry in int_in
control+4control[2]3 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]gr_rx
int_in+2int_in[1]gr_ry
int_in+4int_in[2]gr_minwidth
int_in+6int_in[3]gr_minheight
int_outint_out[0]Return value
int_out+2int_out[1]gr_rlastwidth
int_out+4int_out[2]gr_rlastheight
+
+ + +
+ +

8.13.9 graf_shrinkbox

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Graphics shrink box« - Draw an animated shrinking rectangle +on the screen. +
  +
Opcode: 74 +
  +
Syntax: int16_t graf_shrinkbox ( int16_t gr_sfinx, int16_t gr_sfiny, +int16_t gr_sfinwidth, int16_t gr_sfinheight, int16_t gr_sstx, int16_t +gr_ssty, int16_t gr_sstwidth, int16_t gr_sstheight ); +
  +
Description: The call graf_shrinkbox draws an animated rectangular outline +box shinking from one set of coordinates to another (complement to +graf_growbox). The following apply: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
gr_sfinxX-coordinate,
gr_sfinyY-coordinate,
gr_sfinwidthWidth, and
gr_sfinheightHeight of outline box at end
gr_sstxX-coordinate,
gr_sstyY-coordinate,
gr_sstwidthWidth, and
gr_sstheightHeight of outline box at start
+
+ +
Note: As of PC-GEM Version 2.0, this call is ignored. +The reason given for this is the legal dispute between Apple +and Digital Research. +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: All AES versions. +
  +
Group: Graphics library +
  +
See also: Binding   form_dial   graf_growbox +
  + +
+ +

8.13.9.1 Bindings for graf_shrinkbox

+ + + + + + + + + +
C: int16_t graf_shrinkbox ( int16_t gr_sfinx, int16_t gr_sfiny, +int16_t gr_sfinwidth, int16_t gr_sfinheight, int16_t gr_sstx, int16_t +gr_ssty, int16_t gr_sstwidth, int16_t gr_sstheight ); +
  +
Binding: +
  +
int16_t graf_shrinkbox (int16_t gr_sfinx, int16_t gr_sfiny,
+                        int16_t gr_sfinwidth,
+                        int16_t gr_sfinheight,
+                        int16_t gr_sstx, int16_t gr_ssty,
+                        int16_t gr_sstwidth,
+                        int16_t gr_sstheight)
+{
+   int_in[0] = gr_sfinx;
+   int_in[1] = gr_sfiny;
+   int_in[2] = gr_sfinwidth;
+   int_in[3] = gr_sfinheight;
+   int_in[4] = gr_sstx;
+   int_in[5] = gr_ssty;
+   int_in[6] = gr_sstwidth;
+   int_in[7] = gr_sstheight;
+
+   return ( crys_if(74) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]74 # Function opcode
control+2control[1]8 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]gr_sfinx
int_in+2int_in[1]gr_sfiny
int_in+4int_in[2]gr_sfinwidth
int_in+6int_in[3]gr_sfinheight
int_in+8int_in[4]gr_sstx
int_in+10int_in[5]gr_ssty
int_in+12int_in[6]gr_sstwidth
int_in+14int_in[7]gr_sstheight
int_outint_out[0]Return value
+
+ + +
+ +

8.13.10 graf_slidebox

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Graphics slide box« - Obtain slider position etc. +
  +
Opcode: 76 +
  +
Syntax: int16_t graf_slidebox ( OBJECT *gr_slptree, int16_t +gr_slparent, int16_t gr_slobject, int16_t gr_slvh ); +
  +
Description: The call graf_slidebox serves to inquire the position of +sliders within the bounds of its parent object. The following apply: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
gr_slptree Address of object tree holding parent and child objects +
gr_slparent Index of the parent rectangle +
gr_slobject Index of the child rectangle to be moved (slider) +
gr_slvh Direction of movement: +
+
+ + + + + + + + + + +
0=Move horizontally
1=Move vertically
+
+ + +
+ +
Note: The function may only be called with an already +pressed mouse button, since it returns immediately when the button is +released. +
  +
It can be used also with sliders built into dialogs: Make the +slider a TOUCHEXIT object and call this function when it is clicked +on. +
  +
In Geneva the parameter gr_slvh has changed slightly. +
  +
Return value: The function returns the relative position of the slider, +between 0 (far left or very top) and 1000 (far right or very bottom). +
  +
Availability: All AES versions. +
  +
Group: Graphics library +
  +
See also: Binding   OBJECT +
  + +
+ +

8.13.10.1 graf_slidebox from Geneva

+

The meaning of the gr_slvh parameter has changed +slightly, to provide for real-time updating of sliders: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
LSB0for horizontal slider, 1 for vertical
MSB0for old-style, dotted outline drag box
 1to describe the area to be scrolled in real-time
 2to initialize real-time scrolling
 3to process the scroll bar in real time
+
+ +

To use real-time scroll bars, a program does the following: +

+ +
    +
  1. Call graf_slidebox with gr_slvh mode 0x1XX (where +"XX" is 00 for a horizontal slider, and 01 for vertical). In +this mode, the gr_slparent parameter describes the size of the +entire area to be scrolled, and gr_slobject describes the size +of the area which is visible at one time. Both of these values can be +in any units the programmer chooses. +
      +

  2. +
  3. Call graf_slidebox with gr_slvh mode 0x2XX. In this mode, +gr_slparent and gr_slobject have the same meaning they +normally do. The return value will either be -1, if the user has +released the slider, or it will be a number >= 0 which represents +the new position of the slider. This number is based on the numbers +passed in Step 1. The call does not return until the slider has either +moved enough to change the position within the list, or the mouse +button has been released. +
      +

  4. +
  5. If the result of the last graf_slidebox call was -1, then continue on +with the rest of the program. Otherwise, perform whatever action is +necessary to redraw the list of items, starting at the returned index. +The slider position is updated automatically by Geneva; the program +must not alter it. +
      +

  6. +
  7. Call graf_slidebox with gr_slvh mode 0x3XX. In this mode, +gr_slparent and gr_slobject have the same meaning they +normally do. Go to Step 3. +
      +

  8. +
+ +

Example: Process a list of 100 items, 10 of which are visible at +once +

+
if( graf_slidebox( 0L, 100, 10, 0x101 ) >= 0 )
+{
+  i = graf_slidebox( object_tree, parent_obj, slider_obj, 0x201 );
+  while( i>=0 )
+  {
+     redraw_list_starting_at(i);
+     i = graf_slidebox( object_tree, parent_obj, slider_obj, 0x301 );
+  }
+}
+
+

8.13.10.2 Bindings for graf_slidebox

+ + + + + + + + + +
C: int16_t graf_slidebox ( OBJECT *gr_slptree, int16_t +gr_slparent, int16_t gr_slobject, int16_t gr_slvh ); +
  +
Binding: +
  +
int16_t graf_slidebox (OBJECT *gr_slptree,
+                       int16_t gr_slparent,
+                       int16_t gr_slobject,
+                       int16_t gr_slvh)
+{
+   int_in[0]  = gr_slparent;
+   int_in[1]  = gr_slobject;
+   int_in[2]  = gr_slvh;
+   addr_in[0] = gr_slptree;
+
+   return ( crys_if(76) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]76 # Function opcode
control+2control[1]3 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]gr_slparent
int_in+2int_in[1]gr_slobject
int_in+4int_in[2]gr_slvh
addr_inaddr_in[0]gr_slptree
int_outint_out[0]Return value
+
+ + +
+ +

8.13.11 graf_watchbox

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Graphics watch box« - Select an object and supervise mouse +movements referring to this object. +
  +
Opcode: 75 +
  +
Syntax: int16_t graf_watchbox ( OBJECT *gr_wptree, int16_t gr_wobject, +int16_t gr_winstate, int16_t gr_woutstate ); +
  +
Description: The call graf_watchbox sets the status of an object, depending +on the position of the mouse pointer (whether it is within or outside +the bounds of the object) while the left mouse button is held down. +The following apply: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
gr_wptree Address of root object of object tree +
gr_wpobject Index of the object to watch +
gr_winstate Object status when the mouse pointer is within the boundary: +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NORMAL(0x0000)
SELECTED(0x0001)
CROSSED(0x0002)
CHECKED(0x0004)
DISABLED(0x0008)
OUTLINED(0x0010)
SHADOWED(0x0020)
+
+ +
gr_woutstate Object status when the mouse pointer is outside the boundary: + +
+ +
Note: The function returns when the mouse button is +released, so it should only be made while the button is depressed. +
  +
Return value: The function returns the position of the mouse pointer at the +release of the button (0 = outside the object boundary, 1 = inside the +boundary). +
  +
Availability: All AES versions. +
  +
Group: Graphics library +
  +
See also: Binding   graf_wwatchbox   OBJECT +
  + +
+ +

8.13.11.1 Bindings for graf_watchbox

+ + + + + + + + + +
C: int16_t graf_watchbox ( OBJECT *gr_wptree, int16_t gr_wobject, +int16_t gr_winstate, int16_t gr_woutstate ); +
  +
Binding: +
  +
int16_t graf_watchbox (OBJECT *gr_wptree, int16_t gr_wobject,
+                       int16_t gr_winstate,
+                       int16_t gr_woutstate)
+{
+   int_in[0]  = 0;
+   int_in[1]  = gr_wobject;
+   int_in[2]  = gr_winstate;
+   int_in[3]  = gr_woutstate;
+
+   addr_in[0] = gr_wptree;
+
+   return ( crys_if(75) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]75 # Function opcode
control+2control[1]4 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]0
int_in+2int_in[1]gr_wobject
int_in+4int_in[2]gr_winstate
int_in+6int_in[3]gr_woutstate
addr_inaddr_in[0]gr_wptree
int_outint_out[0]Return value
+
+ + +
+ +

8.13.12 graf_wwatchbox

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Graphics window watch box« - Select an object in a window +and supervise mouse movements referring to this object. +
  +
Opcode: 62 +
  +
Syntax: int16_t graf_wwatchbox ( OBJECT *gr_wptree, int16_t gr_wobject, +int16_t gr_winstate, int16_t gr_woutstate, int16_t whandle ); +
  +
Description: The call graf_wwatchbox sets the object status of an object in +a window, depending on the position of the mouse pointer (whether it +is within or outside the bounds of the object) while the left mouse +button is held down. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
gr_wptree Address of root object of object tree +
gr_wpobject Index of the object to watch +
gr_winstate Object status when the mouse pointer is within the boundary: +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NORMAL(0x0000)
SELECTED(0x0001)
CROSSED(0x0002)
CHECKED(0x0004)
DISABLED(0x0008)
OUTLINED(0x0010)
SHADOWED(0x0020)
+
+ +
gr_woutstate Object status when the mouse pointer is outside the boundary: +
whandle Window identifier + +
+ +
Note: The function returns when the mouse button is +released, so it should only be made while the button is depressed. It +basically corresponds to graf_watchbox with the difference that here +the rectangle-list of the window is taken into account. +
  +
Return value: The function returns the position of the mouse pointer at the +release of the button (0 = outside the object boundary, 1 = inside the +boundary). +
  +
Availability: The function is available in MagiC as of Version 5.10. +
  +
Group: Graphics library +
  +
See also: Binding   graf_watchbox   OBJECT +
  + +
+ +

8.13.12.1 Bindings for graf_wwatchbox

+ + + + + + + + + +
C: int16_t graf_wwatchbox ( OBJECT *gr_wptree, int16_t gr_wobject, +int16_t gr_winstate, int16_t gr_woutstate, int16_t whandle ); +
  +
Binding: +
  +
int16_t graf_wwatchbox (OBJECT *gr_wptree, int16_t gr_wobject,
+                        int16_t gr_winstate,
+                        int16_t gr_woutstate,
+                        int16_t whandle)
+{
+   int_in[0]  = gr_wobject;
+   int_in[1]  = gr_winstate;
+   int_in[2]  = gr_woutstate;
+   int_in[3]  = whandle;
+
+   addr_in[0] = gr_wptree;
+
+   return ( crys_if(62) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]62 # Function opcode
control+2control[1]4 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]gr_wobject
int_in+2int_in[1]gr_winstate
int_in+4int_in[2]gr_woutstate
int_in+6int_in[3]whandle
addr_inaddr_in[0]gr_wptree
int_outint_out[0]Return value
+
+ + +
+ +

8.13.13 graf_xhandle

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Graphics handle« - Obtain ID of the VDI workstation. +
  +
Opcode: 77 +
  +
Syntax: int16_t graf_xhandle ( int16_t *gr_hwchar, int16_t *gr_hhchar, +int16_t *gr_hwbox, int16_t *gr_hhbox, int16_t *device ); +
  +
Description: The call graf_xhandle obtains the ID of the screen workstation +to which the AES outputs. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
gr_hwchar Width, and +
gr_hhchar Height of a character from the system font, in points +
gr_hwbox Width, and +
gr_hhbox Height of a cell into which any character from the system font +fits completely +
device Workstation handle of the AES (vdi_device) + +
+ +
Note: The information from the parameters +gr_hwbox or gr_hhbox is used be the AES for the +width of the individual window components. +
  +
Return value: The function returns the ID (handle) of the opened VDI +workstation. +
  +
Availability: Since KAOS 1.4 +
  +
Group: Graphics library +
  +
See also: Binding   v_opnvwk   graf_handle +
  + +
+ +

8.13.13.1 Bindings for graf_xhandle

+ + + + + + + + + +
C: int16_t graf_xhandle ( int16_t *gr_hwchar, int16_t *gr_hhchar, +int16_t *gr_hwbox, int16_t *gr_hhbox, int16_t *device ); +
  +
Binding: +
  +
int16_t graf_xhandle (int16_t *gr_hwchar, int16_t *gr_hhchar,
+                      int16_t *gr_hwbox, int16_t *gr_hhbox,
+                      int16_t *device )
+{
+   crys_if (77);
+
+   *gr_hwchar = int_out[1];
+   *gr_hhchar = int_out[2];
+   *gr_hwbox  = int_out[3];
+   *gr_hhbox  = int_out[4];
+   *device    = int_out[5];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]77 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]6 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_outint_out[0]Return value
int_out+2int_out[1]gr_hwchar
int_out+4int_out[2]gr_hhchar
int_out+6int_out[3]gr_hwbox
int_out+8int_out[4]gr_hhbox
int_out+10int_out[5]device
+
+ + +
+ +

8.13.14 x_graf_blit

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Blit area« +
  +
Opcode: 28976 +
  +
Syntax: int16_t x_graf_blit( GRECT *source, GRECT *dest ); +
  +
Description: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
source Address of source rectangle or NULL +
dest Address of destination rectangle or NULL + +
+ +
If source and dest are both non-zero, then the +function simply blits the screen data from one rectangle to the other. +
  +
If dest is NULL, then the operation saves the area of +the screen specified by source in its internal buffer. When the +function ise=ater called with source NULL and dest properly set, it +will restore the area in the (new) location. +
  +
The internal buffer is large enough to hold 1/2 of the current +screen. Exceeding this will cause Geneva to try to allocate enough +memory to hold the screen data. If this fails, a zero will be +returned. Since this buffer is also used by Geneva to hold the screen +data for alerts and menus, and also by the item selector, you should +always surround code which uses x_graf_blit with wind_update calls. +
  +
This example displays a dialog and uses a blit to restore what +was underneath it: +
  +
OBJECT *tree;
+GRECT r;
+
+rsrc_gaddr( 0, 0, &tree );                    /* get dialog        */
+form_center( tree, &r.x, &r.y, &r.w, &r.h );  /* center it         */
+wind_update( BEG_UPDATE );                    /* lock menu bar     */
+x_graf_blit( &r, 0L );                        /* save what's there */
+objc_draw( tree, 0, 8, r.x, r.y, r.w, r.h );  /* draw dialog       */
+form_do( tree, 0 );                           /* get user response */
+x_graf_blit( 0L, &r );                        /* now restore       */
+wind_update( END_UPDATE );                    /* re-enable menus   */
+
+
Return value: 0 = Not enough memory for data to be stored +
1 = No error +
  +
Availability: The function is only available under Geneva. +
  +
Group: Graphics library +
  +
See also: Binding +
  + +
+ +

8.13.14.1 Bindings for x_graf_blit

+ + + + + + + + + +
C: int16_t x_graf_blit( GRECT *source, GRECT *dest ); +
  +
Binding: +
  +
int16_t x_graf_blit( GRECT *source, GRECT *dest )
+{
+   addr_in[0] = source;
+   addr_in[1] = dest;
+
+   crys_if(28976);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]28976 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]source
addr_in+4addr_in[1]dest
int_outint_out[0]Return value
+
+ + +
+ +

8.13.15 x_graf_rast2rez

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »« - +
  +
Opcode: 28978 +
  +
Syntax: void x_graf_rast2rez( uint16_t *src_data, int32_t plane_len, +int16_t old_planes, MFDB *mfdb, int16_t devspef ); +
  +
Description: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
plane_len Size of one bitplane of data, in the dest. image, in bytes +
old_planes Number of bitplanes in the source data +
devspef If non-zero, the dest. image is in device-specific format. +Otherwise, it is in VDI format. +
src_data Pointer to the location of the source image's data. +
mfdb Pointer to the MFDB describing the dest. image. All values must +be correct, including the fd_addr. + +
+ +
This function will convert an image (in either VDI or +device-specific format) to a format which can be displayed in the +current video mode. This includes things like transforming a color +image of fewer bitplanes than the current video mode into an image +that can be displayed using vro_cpyfm. If the source is a monochrome +image, it is much faster to simply use vrt_cpyfm to display it and +avoid x_graf_rast2rez completely. +
  +
All values in mfdb describe the destination image, +except for fd_stand, which describes the source image. +
  +
Example: Take the image described by source, convert it +to the current video mode, and display it. +
  +
MFDB source,                           /* assume this is already filled-in */
+     dest,
+     screen;
+     int32_t dest_size;
+
+     dest = source;                    /* most values are the same to start */
+     dest.fd_nplanes = current_video_planes;
+     dest_size = (long)dest.fd_nplanes * dest.fd_wdwidth*2 * dest.fd_h;
+     dest.fd_addr = Malloc(dest_size);
+     x_graf_rast2rez( source.fd_addr, (long)source.fd_wdwidth*2 * source.fd_h,
+                      source.fd_nplanes, &dest, 1 );
+     screen.fd_addr = 0L;
+     vro_cpyfm( vdi_handle, MD_REPLACE, array, &dest, &screen );
+
+
Return value: The function does not return a value. +
  +
Availability: The function is only available under Geneva since Release 004. +
  +
Group: Graphics library +
  +
See also: Binding +
  + +
+ +

8.13.15.1 Bindings for x_graf_rast2rez

+ + + + + + + + + +
C: void x_graf_rast2rez( uint16_t *src_data, int32_t plane_len, +int16_t old_planes, MFDB *mfdb, int16_t devspef ); +
  +
Binding: +
  +
void x_graf_rast2rez( uint16_t *src_data, int32_t plane_len, int16_t old_planes,
+                      MFDB *mfdb, int16_t devspef )
+{
+   int_in[0-1] = plane_len;
+   int_in[2]   = old_planes;
+   int_in[3]   = devspef;
+
+   addr_in[0] = src_data;
+   addr_in[1] = mfdb;
+
+   crys_if(28978);
+
+   return;
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]28978 # Function opcode
control+2control[1]4 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]plane_len
int_in+2int_in[1]plane_len
addr_inaddr_in[0]src_data
addr_in+4addr_in[1]mfdb
+
+ + +
+ +

8.13.16 x_graf_rubberbox

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Extended rubberband box drawing« +
  +
Opcode: 28977 +
  +
Syntax: int16_t x_graf_rubberbox(GRECT *area, GRECT *outer, int16_t +minwidth, int16_t minheight, int16_t maxwidth, int16_t maxheight, +int16_t snap, int16_t lag ); +
  +
Description: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
area Initial size of the rubberband box +
outer Outer limit of the rubberband box +
minwidth Minimum width of the rubberband box +
minheight Minimum height of the box +
maxwidth Maximum width of the box +
maxheight Maximum height of the box +
snap Width/height increment +
lag +
+
+ + + + + + + + + + +
0=Follow mouse exactly
1=Move relative to initial width and height
+
+ + +
+ +
This function is similar to the AES function graf_rubberbox, but +it offers several extensions. +
  +
    +
  • The area parameter points to a GRECT structure which +describes the dimensions of the initial rubberband box. If the lag +parameter is zero, then the g_w and g_h elements of area are ignored. +
  • +
  • outer describes the size of the outside bounding +rectangle. The rubberband box will never go outside this box. If this +is a NULL pointer, the outside boundaries will be the whole desktop. +
  • +
  • minwidth and minheight describe the minimum +height of the rubberband box; maxwidth and maxheight +are the maximums. If either of the minimums are greater than zero, +then extended resizing is possible. In this mode, the mouse can be +dragged to the left or top edge of the minimum area, and resizing +happens in a manner similar to Geneva's extended window resizing. +
  • +
  • snap is the number of pixels to jump by. If this value +is greater than 1, the rubberband box will only move when its width or +height is an even increment of this value. +
  • +
  • The lag parameter says whether the rubberband box +should exactly follow the mouse, or if it should stay a constant +distance from the mouse pointer. When resizing a window, Geneva uses +the lag mode so that if the resize gadget is released before the mouse +is moved, the window will not be resized. +
  • +
+ +
Return value: 0 = The mouse was released prematurely +
1 = No error +
  +
Availability: The function is only available under Geneva. +
  +
Group: Graphics library +
  +
See also: Binding   graf_rubberbox   graf_multirubber +
  + +
+ +

8.13.16.1 Bindings for x_graf_rubberbox

+ + + + + + + + + +
C: int16_t x_graf_rubberbox(GRECT *area, GRECT *outer, int16_t +minwidth, int16_t minheight, int16_t maxwidth, int16_t maxheight, +int16_t snap, int16_t lag ); +
  +
Binding: +
  +
int16_t x_graf_rubberbox(GRECT *area, GRECT *outer, int16_t
+minwidth, int16_t minheight, int16_t maxwidth, int16_t
+maxheight, int16_t snap, int16_t lag )
+{
+   int_in[0] = minwidth;
+   int_in[1] = minheight;
+   int_in[2] = maxwidth;
+   int_in[3] = maxheight;
+   int_in[4] = snap;
+   int_in[5] = lag;
+
+   addr_in[0] = area;
+   addr_in[1] = outer;
+
+   crys_if(28977);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]28977 # Function opcode
control+2control[1]6 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]minwidth
int_in+2int_in[1]minheight
int_in+4int_in[2]maxwidth
int_in+6int_in[3]maxheight
int_in+8int_in[4]snap
int_in+10int_in[5]lag
addr_inaddr_in[0]area
addr_in+4addr_in[1]outer
int_outint_out[0]Return value
+
+ + +
+ +
+ +Home +AESAES +Geneva libraryGeneva library +Scrap libraryScrap library + + diff --git a/en/guidelines.html b/en/guidelines.html new file mode 100644 index 000000000..03627a527 --- /dev/null +++ b/en/guidelines.html @@ -0,0 +1,38 @@ + + + + + +The documentation for TOS: Programming guidelines + + + + + + + + + +Home +Contents +About XCONTROLAbout XCONTROL +Three important programming rulesThree important programming rules + +
+ +

10 Programming guidelines

+ +
+
+ +Home +Contents +About XCONTROLAbout XCONTROL +Three important programming rulesThree important programming rules + + diff --git a/en/guidelines_rules.html b/en/guidelines_rules.html new file mode 100644 index 000000000..db99a3338 --- /dev/null +++ b/en/guidelines_rules.html @@ -0,0 +1,88 @@ + + + + + +The documentation for TOS: Three important programming rules + + + + + + + + + +Home +Programming guidelinesProgramming guidelines +Programming guidelinesProgramming guidelines +Style guidelinesStyle guidelines + +
+ +

10.1 Three important programming rules

+

As the TOS operating system is relatively cleanly structured +in several layers, all programmers should keep the following three +rules at the back of their mind when creating an application: +

+
    +
  • Never intermix calls from different operating system +layers for one task! Example: In GEM programs the mouse and +keyboard are interrogated via AES, and not perhaps via the BIOS. +Disregarding this rule can lead to conflicts between the various +layers. +
      +

  • +
  • Never start with any unsafe assumptions about internal +coherence between the individual layers. Example: A GEMDOS +drive can lie both on a BIOS as well as a MetaDOS device. The mouse +normally hangs on the keyboard chip, but it does not have to (with new +hardware, keyboard interfaces etc.) +
      +

  • +
  • Always use the highest possible operating system level +for a task. Example: Though the language to be used could be +obtained from the operating system header, it is better to use the +_AKP cookie or the function appl_getinfo for this. +
      +

  • +
+ +

Beyond this many further programming rules exist, which +ought to be well-known but which are not heeded unfortunately by all +applications. Some examples: +

+
    +
  • Only allocate as much memory as absolutely necessary, so that +in a multitasking environment other processes too can be launched or +work sensibly +
      +

  • +
  • Entry to the supervisor-mode should be avoided as much +as possible, as this is actually intended only for the operating +system, and in many environments no task-switching takes place +when a process is in this mode +
      +

  • +
  • Never write directly to screen memory, but always fall back to +the relevant GEM functions (AES, VDI) +
      +

  • +
  • Never access memory that does not belong to that particular +program, or has been made accessible to it, since this will give rise +to an exception on systems with memory protection; also, memory should +always be allocated in such a way that other processes should +preferably not be able to access the same block +
      +

  • +
+ +
+ +Home +Programming guidelinesProgramming guidelines +Programming guidelinesProgramming guidelines +Style guidelinesStyle guidelines + + diff --git a/en/guidelines_styles.html b/en/guidelines_styles.html new file mode 100644 index 000000000..8c9dcc8a2 --- /dev/null +++ b/en/guidelines_styles.html @@ -0,0 +1,829 @@ + + + + + +The documentation for TOS: Style guidelines + + + + + + + + + +Home +Programming guidelinesProgramming guidelines +Three important programming rulesThree important programming rules +MagiCMagiC + +
+ +

10.2 Style guidelines

+ +

If one looks at several GEM applications of the same +category, it soon becomes clear that some programs are easy to use +while others can be quite difficult. A text processor such as +Papyrus, for instance, will surely present few problems to +most users; quite in contrast to programs such as Signum!2, +which brings many users out in a sweat! +

+

Whether a program is easy to use depends greatly on the +construction of the user interface. This chapter tries to offer some +tips on the design of user interfaces, and deals with the following +points or aspects: +

+ + +

All software developers are urged to follow the recommendations +made here or to orient themselves on typical GEM applications. +Besides its functionality, the acceptability of a program (and hence +its sales prospects) depend to a large extent on the design of its +graphical user interface (GUI). +

+

Examples of errors in GUI design or poor user guidance can be +found in http://www.iarchitect.com/mshame.htm. +

+

See also: About the AES   About the VDI   GDOS +

+

10.2.1 Dialog boxes

+ +

During the construction of dialog boxes a software developer +should adhere to both an inner and outer consistecy, i.e. he should +orient himself on typical dialog boxes of other programs (outer +consistency) and also ensure that within an application the dialog +boxes have a uniform appearance (inner consistency). +

+ +

The following list names some exemplary aspects that should +be paid regard to in the design of dialog boxes: +

+
    +
  • Similar structure of all of an application's dialog boxes +
      +

  • +
  • Similar structure of dialog boxes of all applications if +possible +
      +

  • +
  • Each dialog should handle a partial task complete in itself +
      +

  • +
  • Use uniform buttons for the same actions +
      +

  • +
  • Split information into logical blocks +
      +

  • +
  • Omit superfluous information +
      +

  • +
  • Do not use too many objects on one plane +
      +

  • +
  • Clearly differentiate between activating and indicating +elements +
      +

  • +
  • Use special effects and colours very sparsely and deliberately +
      +

  • +
+ +

In addition one should think very carefully about which type of +dialog is to be used for which purpose. Here one can differentiate +between the following dialog types: +

+ + +

+

Alert boxes are used to inform the user about important +events, or to ask questions that need to be answered. They inform +briefly about the state of affairs, and if appropriate offer several +alternatives of how to react to them. The above illustration shows an +alert box which has been placed in a window to actively support +multitasking. +

+ + +

+

Modal dialog boxes should be used always when the user +has to be, or should be, forced to take immediate action. The user can +only continue to use the application when he has left the +corresponding dialog. The above illustration shows a modal dialog box, +which has been placed in a window to actively support multitasking. +Modal window-dialogs can be recognized by the user by the missing +Closer in the window components. +

+ + +

+

Nonmodal dialog boxes should be used whenever this is +possible. Such a dialog exists like a window parallel to the actual +program, and offers maximum flexibility to the user. The illustration +above shows a nonmodal dialog box, which has been placed in a window +to actively support multitasking. Nonmodal window-dialogs can be +recognized by the user by the presence of a Closer in the +window components. +

+

Important: So that all applications can make +unrestricted outputs to the screen at any time in a multitasking +environment, it is imperative that all alert and dialog boxes of a +program are placed in windows. Some applications (e.g. the resource +editor Interface) allows one to switch at any time between +conventional dialogs and window-dialogs; however this option should be +offered only when it is really necessary. In view of future, or +already existing, multitasking-capable TOS versions, conventional +dialogs will only play a subordinate role. +

+

See also: About the AES   Window-dialogs   Forms +

+

10.2.2 Help systems

+

With increasing complexity of software there is also an +increasing need for active user support with a carefully impemented +help system. +

+

+

Besides the relief of long-term memory such a system +should answer the following four questions for the user: +

+
    +
  • Where am I? +
  • +
  • What can I do here? +
  • +
  • How did I get here? +
  • +
  • Where can I go to, and how do I get there? +
  • +
+ +

A very good help system is offered, for instance, by the +relational database Phoenix from Application Systems +Heidelberg (and there are similar offerings by Pure-C, +Grismo, ST-Guide or 1st Guide). +

+ +

In principle such a system works as follows: The desired +information is displayed in a window, and through visually emphasised +cross- references a mouse click allows further information for +given themes to be obtained at any time. Via a table of contents it is +possible to jump to a given theme (as in a book), and an index allows +targeted search for a given item of information. +

+ + +

Above all, there is real merit in a context-sensitive help +system: This term is understood to cover the provision of helpful +explanation referring to the momentary situation. +

+

For instance, if a window or a dialog box is open, then calling +the help system brings up an explanatory text for just this window or +dialog box. +

+ +

During the development of a help system for an application +the following points should be taken into account: +

+
    +
  • Every dialog box should contain a 'Help' button, which +when activated makes information about exactly this dialog appear. +
      +

  • +
  • Every error message should contain a 'Help' button, +which when activated explains to the user why this error has arisen, +and how it may be remedied +
      +

  • +
  • If a window of the application (and no dialog box) is open, +then a help message for this window should be output. In this context +one should note that the functioning of the help system itself must be +explained! +
      +

  • +
  • If no windows or dialog boxes are open, and also no objects +(say icons) of the application are selected, then a general help to +the program should be displayed when a suitable menu entry is selected +or the [Help] key is pressed. +
      +

  • +
+ +

+

Every help text should contain at least the following +information: +

+
    +
  • To which object does the help refer (window, dialog box or icon +etc.)? +
      +

  • +
  • Which actions can be performed on or with this object? +
      +

  • +
+ + +

The fear expressed by many software developers that a good help +system supports or encourages piracy, though understandable, +should not be the reason to punish honest users. +

+

See also: About the AES   Window management +

+

10.2.3 Mouse clicks and shapes

+

Even a relatively unpretentious object as the mouse pointer has +an important meaning in a system with a graphical user interface. Both +the number of mouse clicks and the shape of the mouse pointer are of +particular interest to the user of a program. +

+

It has become customary to assign a given shape to the mouse +pointer depending on the operation to be performed; in detail: +

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Shape of mouse pointerMeaning
ArrowGeneral operation (default)
Bar or blockText input
Bee or hourglassThe computer is busy with an operation, and
 the human user cannot do anything during
 the execution of this action
Pointing fingerSelection or dimensioning
Open handMoving or positioning of objects
Crosshairs, thinDrawing or selection
Crosshairs, thickNo fixed meaning
Crosshairs, outlinedNo fixed meaning
+
+ +

In addition the mouse pointer can be completely switched off as +well; this is useful, for instance, when executing drawing operations, +to avoid pixel rubbish accumulating. In special cases, the shape of +the mouse pointer can also be defined freely; in that case, however, +the shape of the mouse pointer should match the current situation. +

+ +

As a rule of thumb, outside the working area of its own +window the mouse pointer should always take the shape of an arrow. +

+ + +

There are some things to report about the number of mouse +clicks as well. A single-click generally serves to select certain +elements. These can be elements of a dialog box (checkbox, radio +button, etc.), icons on the desktop of a shell, and also the +components of a window. In many cases a single-click can also trigger +further actions. For example, if the mouse button is held down, then +objects such as icons or windows can be dragged to another location, +or it is possible to select a whole group of objects. +

+ + +

A double-click usually initiates a special operation; +the desktop, for instance, launches a program if its associated icon +is double- clicked on. +

+ + +

In principle, besides single- and double-clicks of the mouse, +there are also triple- or quadruple-clicks available. But it +is strongly recommended to avoid these variants, as many people might +have major problems performing the corresponding number of mouse +clicks in a given time interval. +

+ +

Last but not least one can use mouse clicks also in +associationg with the keyboard ([Alternate], [Control], [Shift]): +A mouse click in combination with a [Shift] key generally ensures that +further objects can be selected. In the shell Gemini, +double-clicking on an icon while holding down the [Alternate] key +opens a window containing the directory belonging to this icon. With +the alternative desktop Thing, holding down [Alternate] while +double-clicking on a desktop icon of an application or file (but not a +drive or folder) again opens the window of the relevant directory, +with the entry matching the icon preselected (inverse video). +

+

See also: graf_mouse +

+

10.2.4 Menus and menu bars

+ +

To a large extent, the design of the menus is responsible for +the clarity and user-friendliness of an application. Therefore every +software developer should take enough time to create these in a +sensible and appealing manner. +

+ +

As already mentioned, the capacity of short-term memory +is restricted. For this reason a menu bar should not offer more than +seven menu entries, if possible; otherwise the user has to glance at +the menu bar several times to be able to decide what he wants to +select. The following illustration shows the main menu bar of the +relational database system Phoenix in its English version: +

+
  MANAGER  File   Edit  Process  Report  Parameters  Options  Help
+
+ +

Both the menu bar as well as the menus contained in it should +have a standard make-up, so that the user feels 'at home' +immediately after the launch of a program. The first menu from the +left should always carry the name of the current application; +this has the inestimable advantage in a multitasking environment of +being able to identify the active application immediately by a quick +glance at the menu bar. +

+

+

The second menu title should always be named File, and +offer menu entries that deal with various aspects of input and output. +The lowest entry of this menu should always offer the option of +quitting the program. +

+ +

As one can see in the above illustration, individual entries +within a menu can be collected together in logical subgroups +separated by fixed or dashed lines, which contributes greatly to +clarity and acceptance by the user. +

+ +

Note: In assigning shortcuts in menus, take care not to +duplicate any of them in the complete set of menu entries and +also within any of the non-modal dialogs. Furthermore, avoid using +accented characters, since these may not be present on keyboards used +in countries other than that of the original programmer (Example: +Umlauts [Ä], [Ö], [Ü] and [ß] are only present on German +keyboards, and similar restrictions apply for French, Spanish or +Swedish etc.) +

+

Also remember that while [Control] combinations will use a +modified ASCII-code of the character key to execute the menu event, +[Alternate] combinations cannot do this and have to use the scancode; +however, the keyboard layouts in some countries differ in a few keys +(for instance, the [Y] and [Z] keys are transposed in English and +German-language keyboards, and the French ones have other +differences). It may thus be impossible to use some of these +characters together with [Alternate] successfully as shortcuts in many +programs when run on keyboards in languages other than that of the +programmer without changing and then recompiling the program source. +Just changing the shortcut in the RSC file or program file will +not work! +

+ +

Three dots following a menu entry indicate that after +selecting this entry a dialog box (or file-selector) will open; the +user can then attune himself to this, and move the mouse pointer to +the middle of the screen, for instance, while the dialog is built up. +

+

Further frequently used menu titles are Edit, Parameters, +Options and Help. The first should always lie to the right +of the File menu, the last should always be placed at the +right end of the menu bar. +

+ +

Each title should start with a capital (upper case) letter (the +name of the program at far left should always be completely in +capitals), consist of a single word only, and as demarcation to +other titles always have a space character to both its left and +right. +

+ + +

In addition, menu entries should always have a +context-sensitive configuration, i.e. an entry may only be +selectable if this is possible or sensible at the current situation of +the program. Thus, say, there is no point of calling the menu entry +Save when there is nothing to be saved. The same applies for +an entry Close, which should be selectable only if a window or +a dialog exists that can be closed. Such non-selectable menu entries +should be displayed 'greyed out' (in light type). +

+

+

Apart from the conventional menu bar, some further and +interesting possibilities exist to allow the user to make selections. +Thus many programs (e.g. the shells Thing or Ease - +see illustration above) make popup-menus available to the user +to facilitate fast selection between various alternatives or perform +an operation. +

+ + +

The main advantage of a popup menu lies in shortening mouse +movements. The menu simply appears at the screen position where +the mouse click was performed (usually with the right mouse button). +In implementing popup-menus one should ensure that these always appear +complete on the screen (long popup-menus can often be scrolled). +

+ +

Last but not least there is the possibility to place a menu +bar in a window. This method offers many advantages: First of all +the main menu bar can be relieved in this way and so allow a much +clearer layout, secondly it makes possible building up an application +in a much more logical way; all operations affecting a given window +wander into the window menu, all others into the global menu bar. +

+

+ +

As one can not only move windows on the screen but, generally, +also change their size, it is possible that not all titles of a window +menu are visible. Hence some programs allow the menu bar to be +scrolled. This applies, for instance, to the text editor +Grismo or the resource editor Interface. +

+

See also: About the AES   Menu library +

+

10.2.5 Visual and acoustic feedback

+ + + + +

When working with a computer, the human user is dependent on +visual or acoustic feedback to retain the feeling at all times of +being in control of the task being perfomed, or being able to grasp the +current state of the process. +

+

GEM offers a multitude of possibilities for procuring a sense +of feedback to the user. Thus, for instance, menu titles or icons are +displayed in inverse video when the user selects them with the mouse. +

+

Acoustic feedback is particularly useful in connection +with error or alert messages, which can be displayed in dialog boxes. +

+

Visual feedback should be used always when the user +selects objects on the screen, or initiates a task with a long +processing phase. The user may never be left uncertain which operation +is being performed at the time, and how far this has progressed. +

+

+

Graphical displays (such as an advancing progress-bar +shown in the above illustration, for instance) are to be preferred to +textual ones for this, as the latter first has to be 'decoded' by the +user. +

+

Visual feedback is provided, for instance, by the relational +database system Phoenix, to inform the user of the state of +the inquiry; the shell Gemini (and many other programs) use +this method to show the user how the formatting of floppy disks is +progressing, and the text editor Grismo, amongst others, +inverts the cross-references of its help system when the user +activates them with the mouse. +

+

See also: About the AES   Style guidelines +

+

10.2.6 Selections

+

'Selection' is understood to be the choosing of one or more +objects. On the desktop, for instance, one can select the files in a +drive window with a mouse click, [Shift]-mouse click or by drawing up +a rubber band box. +

+

+

Basically the following conventions apply on the desktop: +

+ +

Mouse click: A single left-click with the mouse selects +the object clicked on; objects that are already selected must be +deselected again by this action. +

+ +

[Shift]-mouse click: This adds the selected object to +the set of already selected objects (so previously selected objects +will remain selected). A [Shift]-mouse click on a selected object +removes this from the set of selected objects again. +

+ +

Rubber band: By drawing out a rubber band box +(left-click at the start of the area to be selected and holding the +button down drag the mouse pointer to the end-point), all objects +enclosed by this band will be selected; any objects already selected +must be deselected again by this action. In combination with the +[Shift] key the affected objects can be added to the set of selected +objects. +

+ + +

A very useful type of selection is the so-called realtime +selection. This describes a procedure under which the selected +area is inverted already during the movement of the mouse pointer. +Many programs such as Pure-C, Gemini, Everest +or Grismo use this method of selection, and even scroll the +contents of the window automatically when the edge of the window is +reached. +

+

See also: About the AES   Style guidelines +

+

10.2.7 Special effects

+

Particular care is required for using colours, text attributes +etc. Usually the motto Less is more! applies here. +

+

One cannot provide here a patent recipe, but only the suggestion +that one should orient oneself on examplary application models. +

+ +

Particularly when using colours, software developers should keep +at the back of their minds that human colour sense is very +subjective; from this follows that it should be possible for the user +to set the colours in a way he finds agreeable. +

+

+

An exemplary application in this respect is the relational +database system Phoenix by Application Systems Heidelberg, for +instance, which is illustrated above. Here the user can configure +freely almost every aspect of the user interface. +

+ +

In text documents one should take care not to use too many, or +mixed text attributes (effects such as bold, italic, underscored, +shadowed, light or outlined etc.) at the same time. Here too the motto +Less is more! applies. But this statement cannot be applied +across the board: There are cases where the use of several attributes +at a time can not just be tolerated, but is recommended. In a +hypertext system, for instance, the cross-references +must be made particularly clear to the user. On nearly all platforms +it is standard to display these cross- references underscored, and if +possible also in colour. This has the advantage that text passages +that use a simple attribute can still be differentiated from the +cross-references. +

+

Absence of a patent recipe leads to uncertainty in many +developers which culminates in forgoing special effects or colours +completely. But that missess the whole point! Colour, sensibly +used, can not just increase clarity appreciably, but also drastically +increase an appli cation's attractiveness. However, developers should +also keep in mind that some users may be working in 2-colour +(monochrome) resolutions and ensure that their program is still usable +under those conditions. +

+

To sum up: Special effects (of whatever kind) should be used in +a premeditated and sparse manner. +

+ + +

During the development of a software product the programmer +would do well to include a typical user as soon as possible in his +work (user- testing), and to orient himself on model programs. +The most sensible thing is to make all ticklish points freely +configurable by the user! +

+

See also: About the AES   Style guidelines +

+

10.2.8 Key assignments

+

As people are creatures of habit, it is desirable that not just +the dialogs and menus are built up in a consistent manner, but also +that the most important functions of a program can be operated +consistenty from the keyboard. +

+ +

Actually there are a number of command-key combinations +(shortcuts) that are either standardized, or which have established +themselves as quasi (accepted) standards; in detail: +

+ +

Standardized according to decisions of the developers +conference in August '89: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Key combinationFunction
[Control]-[C]Copy
[Control]-[F]Find
[Control]-[O]Open
[Control]-[Q]Quit program
[Control]-[V]Paste
[Control]-[X]Cut
[Shift]-Upward arrowGo one page back
[Shift]-Downward arrowGo one page forward
[Shift]-Leftward arrowCursor to start of line
[Shift]-Rightward arrowCursor to end of line
[Control]-Leftward arrowMove back by one word
[Control]-Rightward arrowMove forward by one word
[ClrHome]Go to the start of the document
[Shift]-[ClrHome]Go to the end of the document
+
+ + +

Not standardized, but accepted as standard in practice: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Key combinationFunction
[Control]-[A]Select all
[Control]-[G]Find next
[Control]-[M]Save as...
[Control]-[N]New document
[Control]-[P]Print
[Control]-[S]Save
[Control]-[R]Replace
[Control]-[U]Close top window
[Control]-[W]Cycle to next window
[Control]-[Y]Cut current line
[Control]-[Z]Start shell
+
+ + +

Important note: All '[Alternate]-[Control]' key +combinations are reserved for the operating system. As examples one +can name here: +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +
Key combinationFunction
[Alternate]-[Control]-[Tab]Task change under MagiC
[Alternate]-[Control]-[Delete]Start Shutdown sequence
[Alternate]-[Control]-[Esc]Program manager under MagiC
[Alternate]-[Control]-[Space]Iconify current window
[Shift]-[Alternate]-[Control]-[Space]Iconify application
+
+ +

Note that shortcuts must not be duplicated within a menu +structure or a dialog, and some keyboard shortcuts can give rise to +problems when the application is run with a keyboard of a different +nationality to that used by the programmer. This is due to both the +absence of some characters on a keyboard as well as to different +keyboard layouts; the latter may affect [Alternate] combinations in +particular. +

+

See also: Operation of the file-selector   ASCII table   Scancode table +

+

10.2.9 Toolboxes

+

In some cases there is not enough room in an application's menu +bar or dialog boxes to accomodate all of the functions. +

+

Instead of overfilling the menu bar or squeezing too much +information into a dialog, one should fall back in such cases to a +toolbox or a local menu bar in windows. +

+

In nearly all cases this allows the corresponding functions to +be housed in the user interface - and in a clear manner into the +bargain. +

+

Toolboxes are generally offered at the top or right edge of a +window, but can also be movable. +

+

+

Local menu bars and toolboxes are utilized by the resource +editor Interface, for instance, shown above. It can be useful +if a toolbox can be hidden temporarily, in order to be able to +show the actually more important information in the window; this is +permitted by the text editor Grismo, for instance. +

+

See also: About the AES   Style guidelines +

+
+ +Home +Programming guidelinesProgramming guidelines +Three important programming rulesThree important programming rules +MagiCMagiC + + diff --git a/en/history.html b/en/history.html new file mode 100644 index 000000000..66a9bee57 --- /dev/null +++ b/en/history.html @@ -0,0 +1,4604 @@ + + + + + +The documentation for TOS: History + + + + + + + + + +Home +IntroductionIntroduction +Old foreword by Rolf KotzianOld foreword by Rolf Kotzian +The GNU General Public LicenceThe GNU General Public Licence + +
+ +

1.3 History

+ +
+

1.3.1 Version 5.01

+
2014-12-23 Tuesday 19:00  Gerhard Stoll
+
+        * gem/vdi/control/: v_opnvwk.ui, v_opnwk.ui:
+
+        Value for work_in[0] is only x = 2 + Getrez() (Mike Fulton)
+
+2014-11-15 Saturday 10:29  Gerhard Stoll
+
+        * magic/magic_en.u:
+
+        Correct label (Lonny Pursell)
+
+2014-10-28 Tuesday 18:36  Gerhard Stoll
+
+        * gem/aes/aes_f.u:
+
+        Add function appl_options (Lonny Pursell)
+
+        * gem/aes/graf_/graf_multirubber.ui:
+
+        Wrong parameter name (Lonny Pursell)
+
+2014-07-20 Sunday 08:51  Gerhard Stoll
+
+        * gem/vdi/vdi_f.u:
+
+        Add function from the MATRIX TC-VDI
+
+2014-04-06 Sunday 15:39  Gerhard Stoll
+
+        * bios/structures/pun_info.ui:
+
+        Add bit for Falcon IDE and USB
+
+2014-04-05 Saturday 08:12  Gerhard Stoll
+
+        * xbios/pci_bios/pci_bios.u:
+
+        Correct cookie
+
+2014-04-05 Saturday 08:11  Gerhard Stoll
+
+        * protokol/xssi.u:
+
+        Correct text
+
+2014-04-05 Saturday 08:10  Gerhard Stoll
+
+        * gem/aes/appl_/appl_get_cicon.ui:
+
+        Add english version
+
+2014-04-05 Saturday 08:10  Gerhard Stoll
+
+        * bios/cookie/description/XSSI.ui:
+
+        Add link
+
+2014-04-05 Saturday 08:10  Gerhard Stoll
+
+        * bios/cookie/description/PCI_.ui:
+
+        Change link
+
+2014-04-05 Saturday 08:09  Gerhard Stoll
+
+        * bios/cookie/description/_PCI.ui:
+
+        Change Link
+
+2014-03-18 Tuesday 19:44  Gerhard Stoll
+
+        * protokol/xssi.u:
+
+        ID from BUBBLES
+
+2014-03-18 Tuesday 19:44  Gerhard Stoll
+
+        * html/tos_hyp.u:
+
+        Link to the archives
+
+2014-03-18 Tuesday 19:43  Gerhard Stoll
+
+        * anhang/typedefs.u:
+
+        Change headline from MCB for MagiC
+
+2014-03-18 Tuesday 16:17  Gerhard Stoll
+
+        * gem/aes/: aes_f.u, appl_/appl_.u, appl_/appl_get_cicon.ui:
+
+        New function appl_get_cicon from Olivier Landemarre
+
+2014-03-14 Friday 18:58  Gerhard Stoll
+
+        * gem/aes/evnt_/messages/messages.u:
+
+        Messages from Tetrax
+
+2014-02-02 Sunday 15:59  Michael Bernstein
+
+        * gem/aes/structures/applrecord.ui:
+
+        Change field descriptions to values evaluated by tests from Roger Burrows
+
+2013-09-17 Tuesday 13:41  Gerhard Stoll
+
+        * gemdos/gemdos_f.u:
+
+        Function from BiNet100 and Atari Network Service
+
+2013-06-30 Sunday 08:32  Gerhard Stoll
+
+        * bios/bios_f.u:
+
+        Add function from the Drive B Simulator
+
+2013-03-24 Sunday 09:32  Gerhard Stoll
+
+        * xbios/xbios_f.u:
+
+        XBIOS function from Hatari and the Hatari version from DHS
+
+
+
+

1.3.2 Version 5.00

+
2013-03-04 Monday 17:49  Gerhard Stoll
+
+        * anhang/anhang/ascii.ui:
+
+        Lowercase letter "c" was shown instead of "e"
+        (Hex code 65). (David Gálvez)
+
+2013-01-20 Sunday 08:29  Gerhard Stoll
+
+        * gem/vdi/inquire/vq_color.ui:
+
+        Declaration wrong, there is a return value
+        (init16_t and not void).
+
+2012-11-26 Monday 17:34  Gerhard Stoll
+
+        * gem/vdi/control/v_opnprn.ui:
+
+        Wrong Opcode in binding.
+
+2012-09-21 Friday 18:22  Gerhard Stoll
+
+        * gemdos/memory/malloc.ui:
+
+        Info about the limits from that function.
+
+2012-09-19 Wednesday 17:03  Gerhard Stoll
+
+        * gemdos/datetime/tsetitim.ui:
+
+        Correct C prototyp
+
+2012-03-10 Saturday 15:59  Gerhard Stoll
+
+        * gem/aes/appl_/appl_getinfo.ui:
+
+        more detailed AES_ARCH-defines
+
+2012-03-01 Thursday 18:45  Gerhard Stoll
+
+        * anhang/typedefs.u:
+
+        Correct OSHEADER for EmuTOS (Helmut Karlowski)
+
+2012-01-20 Friday 10:25  Gerhard Stoll
+
+        * gem/aes/appl_/appl_find.ui:
+
+        Add MyAES for Mode -3.
+
+2011-07-30 Saturday 17:16  Gerhard Stoll
+
+        * bios/cookie/: list.ui, description/AmAN.ui, description/cVDI.ui,
+        description/ALIC.ui:
+
+        Delete german paragraph in english doc. Contributed by Paul Wratt.
+
+2011-05-29 Sunday 08:23  Gerhard Stoll
+
+        * bios/sys_var_en.u, bios/sys_vec_en.ui, magic/magic_en.u:
+
+        Small changes from Peter A. West
+
+2011-01-16 Sunday 15:00  Gerhard Stoll
+
+        * gem/aes/wind_/: wind_get_set.ui, wind_set.ui,
+        wind_set/WF_TOPMOST.ui:
+
+        Add WF_TOPMOST
+
+2011-01-01 Saturday 17:53  Gerhard Stoll
+
+        * bios/cookie/cookie.u:
+
+        _PCI and XPCI are displayed in the ST-Guideversion
+
+
+

1.3.3 Version 4.99

+
2010-11-01 Monday 07:52  Gerhard Stoll
+
+  * bios/cookie/description/PCI_.ui,
+    bios/cookie/description/XPCI.ui,
+    xbios/pci_bios/pci_bios.u:
+
+  Add links
+
+2010-10-20 Wednesday 18:51  Gerhard Stoll
+
+  * bios/cookie/: cookie.u, list.ui, description/8_8.ui,
+  description/BIGS.ui, description/BSTE.ui:
+
+  Add some more cookies
+
+2010-10-11 Monday 16:49  Gerhard Stoll
+
+  * bios/cookie/: cookie.u, list.ui, description/CT40.ui,
+  description/FALT.ui, description/Lity.ui, description/MFMV.ui,
+  description/MgPC.ui, description/ceci.ui, description/iTMA.ui,
+  description/nAES.ui:
+
+  Add some more cookies
+
+2010-10-07 Thursday 09:15  Gerhard Stoll
+
+  * bios/cookie/list.ui:
+
+  Some changes (Olivier Landemarre)
+
+2010-09-30 Thursday 07:29  Gerhard Stoll
+
+  * anhang/anhang/xhdi/: xhdi_de.ui, xhdi_en.ui:
+
+  Correct short description from XHMediumChanged (by David Gálvez)
+
+2010-08-08 Sunday 16:37  Gerhard Stoll
+
+  * xbios/spezial/puntaes.ui:
+
+  Some more infos from MagiC.
+
+2010-07-31 Saturday 20:14  Gerhard Stoll
+
+  * xbios/spezial/puntaes.ui:
+
+  Some more info from MagiC
+
+2010-07-24 Saturday 11:52  Gerhard Stoll
+
+  * gem/aes/: aes_f.u, structures/WINFRAME_HANDLER.ui,
+  structures/WINFRAME_SETTINGS.ui, structures/WININFO.ui,
+  structures/structures.u, wind_/sys_set_winframe_manager.ui,
+  wind_/wind_.u:
+
+  Add sys_set_winframe_manager from MagiC 6
+
+2010-07-24 Saturday 11:50  Gerhard Stoll
+
+  * gem/aes/rsrc_/sys_recalc_cicon_colours.ui:
+
+  Correct binding
+
+2010-07-21 Wednesday 19:53  Gerhard Stoll
+
+  * bios/cookie/: cookie.u, list.ui, description/Xgem.ui:
+
+  Add cookie Xgem from Winframe Xgem.
+
+2010-07-21 Wednesday 18:52  Gerhard Stoll
+
+  * gem/aes/aes_f.u:
+
+  Wrong opcode in edit_set.
+
+2010-07-04 Sunday 16:21  Gerhard Stoll
+
+  * bios/cookie/description/_MCH.ui:
+
+  Delete the values from M5484LITE and Coldari, which was in some EmuTOS
+  version, which was never released.
+
+2010-06-26 Saturday 17:56  Gerhard Stoll
+
+  * anhang/typedefs.u:
+
+  OSHEADER: More info about p_run and p_root
+
+2010-06-17 Thursday 18:51  Gerhard Stoll
+
+  * gem/aes/scrp_/scrp_clear.ui:
+
+  Translate from english to german
+
+2010-06-17 Thursday 18:50  Gerhard Stoll
+
+  * gem/aes/appl_/: _appl_yield.ui, appl_.u, appl_yield.ui:
+
+  Add _appl_yield
+
+2010-04-25 Sunday 07:04  Gerhard Stoll
+
+  * protokol/vscreen.u:
+
+  Add id from NOVA VDI
+
+2010-04-18 Sunday 17:07  Gerhard Stoll
+
+  * protokol/AV/: av_de.ui, av_en.ui:
+
+  VA_COPY_COMPLETE is the anser from AV_COPY_DRAGGED
+
+2010-04-17 Saturday 09:31  Gerhard Stoll
+
+  * gem/vdi/inquire/v_delete_driver_info.ui:
+
+  Correct binding
+
+2010-04-14 Wednesday 18:00  Gerhard Stoll
+
+  * gemdos/network/Nversion.ui:
+
+  Correct binding
+
+2010-02-04 Thursday 21:25  Gerhard Stoll
+
+  * gemdos/gemdos.u:
+
+  Add some info to the programflags
+
+2010-02-04 Thursday 21:24  Gerhard Stoll
+
+  * magic/sharelib.u:
+
+  Example how to make a shared library
+
+2010-01-24 Sunday 17:05  Gerhard Stoll
+
+  * gem/vdi/: vdi_f.u, inquire/inquire.u, inquire/vq_devinfo.ui,
+  inquire/vq_ext_devinfo.ui, inquire/vqt_devinfo.ui:
+
+  Add vqt_devinfo
+
+2010-01-13 Wednesday 20:49  Gerhard Stoll
+
+  * gem/vdi/control/: v_opnvwk.ui, v_opnwk.ui:
+
+  2+Getrez()
+
+2009-12-19 Saturday 20:22  Gerhard Stoll
+
+  * xbios/: bildscrm/Setscreen_ct60.ui, ct60/cache.ui,
+  ct60/ct60_vmalloc.ui, ct60/rd_param.ui:
+
+  Update to new ct60 document
+
+2009-12-13 Sunday 10:57  Gerhard Stoll
+
+  * bios/cookie/description/_MCH.ui:
+
+  Add values from M5484LITE and Coldari
+
+2009-10-10 Saturday 16:21  Gerhard Stoll
+
+  * bios/cookie/: list.ui, description/CT60.ui, description/_CF_.ui:
+
+  Add _CF_ cookie
+
+2009-06-12 Friday 13:33  Gerhard Stoll
+
+  * gemdos/gemdos_f.u:
+
+  Add function Fchdir, Ffdopendir and Fdirfd from FreeMiNT 1.17
+
+2009-01-06 Tuesday 17:05  Gerhard Stoll
+
+  * gem/aes/appl_/appl_getinfo.ui:
+
+  Bit 15 in WINOWS
+
+
+

1.3.4 Version 4.98

+
+2008-11-19 Wednesday 17:49  Gerhard Stoll
+
+  * config.u, e_aes.u, e_bios.u, e_cpxdok.u, e_funk_l.u, e_gemdos.u,
+  e_linea.u, e_magic.u, e_olga.u, e_protok.u, e_tos.u, e_tos_li.u,
+  e_vdi.u, e_view.u, e_vt52.u, e_xbios.u, e_xbra.u, e_xhdi.u,
+  tos_hyp.u, gem/aes/evnt_/messages/messages.u, gemdos/filesys.u,
+  gemdos/*, xbios/*:
+
+  Change line end
+
+2008-11-18 Tuesday 20:19  Gerhard Stoll
+
+  * doc/liesmich, doc/styl.u, emulator.en/sonstige.u,
+  emulator.en/stem.u, emulator.en/tos2win.u, gem/*,
+  linea/*, magic/*, n_aes/n_aes.u, protokol/*,
+  tos/tos_de.ui, tos/tos_en.ui, tos/tosmain.u,
+  xaaes/xaaes.u:
+
+  Change lineend
+
+2008-11-16 Sunday 14:25  Gerhard Stoll
+
+  * gem/aes/: appl_/*, edit_/*, evnt_/*:
+
+  Change line end
+
+2008-11-16 Sunday 14:24  Gerhard Stoll
+
+  * xbios/xbios_f.u:
+
+  Add function form ct60
+
+2008-11-09 Sunday 14:30  Gerhard Stoll
+
+  * anhang/*, bios/*:
+
+  Change line end to unix
+
+2008-11-09 Sunday 08:51  Gerhard Stoll
+
+  * gem/vdi/output/v_arc.ui:
+
+  Test upload
+
+2008-11-06 Thursday 20:38  Michael Bernstein
+
+  * gemdos/system/ssystem.ui:
+
+  Syntaxfehler in begin_table end_tabel in deutschen Teil behoben.
+
+  Bugfix of syntax error with begin_table end_table in german part.
+
+2008-11-05 Wednesday 21:04  Michael Bernstein
+
+  * gemdos/: argv.u, gemdos_f.u, chrinout/cauxin.ui,
+  chrinout/cauxos.ui, chrinout/cauxout.ui, chrinout/cconis.ui,
+  chrinout/cconout.ui, chrinout/cconrs.ui, chrinout/cconws.ui,
+  chrinout/cprnos.ui, chrinout/crawcin.ui, chrinout/crawio.ui,
+  datetime/tgettime.ui, datetime/tsettime.ui, dir/dclosedi.ui,
+  dir/dcntl.ui, dir/dcreate.ui, dir/ddelete.ui, dir/dfree.ui,
+  dir/dgetcwd.ui, dir/dgetdrv.ui, dir/dgetpath.ui, dir/dreadlab.ui,
+  dir/dsetdrv.ui, dir/dsetpath.ui, dir/dwritela.ui, dir/dxopendir.ui,
+  dir/dxreaddi.ui, file/fattrib.ui, file/fclose.ui, file/fdatime.ui,
+  file/fdelete.ui, file/fgetdta.ui, file/fread.ui, file/fsnext.ui,
+  file/fwrite.ui, memory/mfree.ui, memory/mshrink.ui,
+  memory/mxalloc.ui, network/Nversion.ui, prozess/pseteuid.ui,
+  prozess/psigintr.ui, prozess/pterm.ui, prozess/pterm0.ui,
+  structures/DISKINFO.ui, structures/DTA.ui, structures/FILEPTR.ui,
+  structures/LINE.ui, structures/PD.ui, structures/XATTR.ui,
+  structures/cd_ad.ui, structures/cdrom_tocentry.ui,
+  structures/fcookie.ui, structures/mutimbuf.ui,
+  structures/ploadinfo.ui, structures/tty.ui, structures/winsize.ui,
+  structures/xkey.ui, system/slbclose.ui, system/slbopen.ui,
+  system/super.ui:
+
+  Doppelte Zeilenumbrüch entfernt, die aus jeder Zeile einen Absatz
+  gemacht hatten.
+
+  Remove double newlines which case UDO to take every line as a
+  separate paragraph
+
+2008-11-02 Sunday 21:48  Michael Bernstein
+
+  * gemdos/: chrinout/chrinout.u, system/system.u:
+
+  Fehler in Verschachtelung iflang-endif mit begin_node end_node
+
+  Bugfix in iflang-endif with begin_node end_node
+
+2008-11-01 Saturday 18:29  Michael Bernstein
+
+  * gemdos/system/ssystem.ui:
+
+  Syntaxfehler in Item eienr XLIST im deutschen Teil behoben.
+
+  Bugfix in item part of xlist from german part.
+
+2008-10-31 Friday 08:31  Gerhard Stoll
+
+  * gem/vdi/attribut/bitmap/vsr_bg_color.ui,
+  gem/vdi/attribut/text/vst_error.ui, gemdos/gemdos.u,
+  gemdos/signale.u, gemdos/dir/dclosedi.ui, gemdos/dir/dcntl.ui,
+  gemdos/dir/dcreate.ui, gemdos/dir/ddelete.ui, gemdos/dir/dfree.ui,
+  gemdos/dir/dgetcwd.ui, gemdos/dir/dgetdrv.ui,
+  gemdos/dir/dgetpath.ui, gemdos/dir/dlock.ui,
+  gemdos/dir/dopendir.ui, gemdos/dir/dpathcon.ui,
+  gemdos/dir/dreaddir.ui, gemdos/dir/dreadlab.ui,
+  gemdos/dir/drewindd.ui, gemdos/dir/dsetdrv.ui,
+  gemdos/dir/dsetpath.ui, gemdos/dir/dwritela.ui,
+  gemdos/dir/dxopendir.ui, gemdos/dir/dxreaddi.ui,
+  gemdos/file/fchown.ui, gemdos/file/fsnext.ui,
+  xbios/intrface/dosound.ui, xbios/laufwerk/floprd.ui,
+  xbios/spezial/blitmode.ui, xbios/spezial/cachectr.ui,
+  xbios/spezial/cjar.ui, xbios/spezial/dbmsg.ui,
+  xbios/spezial/janus.ui, xbios/spezial/puntaes.ui,
+  xbios/spezial/random.ui, xbios/spezial/ssbrk.ui,
+  xbios/spezial/supexec.ui, xbios/spezial/trapper.ui,
+  xbios/spezial/wdgctrl.ui, xbios/startrac/hardplay.ui:
+
+  Correct links
+
+2008-10-27 Monday 19:52  Gerhard Stoll
+
+  * anhang/hilfe.u:
+
+  Add address
+
+2008-10-27 Monday 19:37  Gerhard Stoll
+
+  * anhang/anhang/tos_vers.u:
+
+  Some more AES versions
+
+2008-10-25 Saturday 20:51  Michael Bernstein
+
+  * gemdos/: chrinout/chrinout.u, datetime/datetime.u,
+  datetime/talarm.ui, datetime/tgettofd.ui, datetime/tsetitim.ui,
+  dir/dclosedi.ui, dir/dcntl.ui, dir/dgetcwd.ui, dir/dir.u,
+  dir/dlock.ui, dir/dopendir.ui, dir/dreaddir.ui, dir/drewindd.ui,
+  file/fchmod.ui, file/fchown.ui, file/file.u, file/flink.ui,
+  file/fmidipip.ui, file/fpipe.ui, file/freadlin.ui,
+  file/fsymlink.ui, memory/memory.u, network/network.u,
+  prozess/pgetegid.ui, prozess/pgeteuid.ui, prozess/pmsg.ui,
+  prozess/prenice.ui, prozess/prozess.u, prozess/psemapho.ui,
+  prozess/psetauid.ui, prozess/psigacti.ui, prozess/psigpaus.ui,
+  prozess/pumask.ui, prozess/pwaitpid.ui, structures/timeval.ui,
+  structures/timezone.ui, system/salert.ui, system/ssync.ui,
+  system/system.u:
+
+  kleine englische Teile im deutschen Zweig aud deutsch übersetzt.
+
+  Translate small english parts in german part to german.
+
+2008-10-19 Sunday 18:50  Michael Bernstein
+
+  * gemdos/: filesys.u, gemdos.u, signale.u, chrinout/cnecin.ui,
+  datetime/talarm.ui, dir/dcntl.ui, dir/dir.u, dir/dopendir.ui,
+  file/fchmod.ui, file/fcntl.ui, file/fdup.ui, file/fforce.ui,
+  file/file.u, file/flock.ui, file/fsfirst.ui, memory/memory.u,
+  network/network.u, prozess/pause.ui, prozess/prozess.u,
+  prozess/prusage.ui, prozess/psigpaus.ui, structures/cdrom.ui,
+  structures/sigaction.ui, system/salert.ui, system/ssystem.ui,
+  system/system.u:
+
+  Ändern einiger Formatierungen nach Vorlagen von Peter West,
+  soweit mit UDO möglich. Korrektur von verschachtelten
+  if-else mit begin_node end_node.
+
+  Modify some formats found by Peter West if they can be done with
+  UDO. Bugfix in some nested if-else with begin_node end_node
+
+2008-10-17 Friday 21:02  Michael Bernstein
+
+  * gemdos/: dir/dpathcon.ui, file/fcntl.ui, file/fgetchar.ui,
+  file/finstat.ui, file/foutstat.ui, file/fputchar.ui,
+  file/fselect.ui, prozess/pause.ui, prozess/pdomain.ui,
+  prozess/pfork.ui, prozess/pgetgid.ui, prozess/pgetpgrp.ui,
+  prozess/pgetppid.ui, prozess/pgetuid.ui, prozess/pkill.ui,
+  prozess/pnice.ui, prozess/prusage.ui, prozess/psetgid.ui,
+  prozess/psetlimi.ui, prozess/psetpgrp.ui, prozess/psetuid.ui,
+  prozess/psigbloc.ui, prozess/psignal.ui, prozess/psigpend.ui,
+  prozess/psigretu.ui, prozess/psigsetm.ui, prozess/pusrval.ui,
+  prozess/pvfork.ui, prozess/pwait.ui, prozess/pwait3.ui,
+  system/shutdown.ui, system/sysconf.ui:
+
+  Beschreibung der Verfügbarkeit für ab MultiTOS vorhandene
+  Funktionen um MiNT Versionsnummer 1.04 erweitert
+
+  Expand description of availability for functions which are
+  available as of MultiTOS by MiNT version number 1.04
+
+2008-10-12 Sunday 16:52  Gerhard Stoll
+
+  * bios/cookie/description/: _FDC.ui, hade.ui:
+
+  Add some infos from the Hades
+
+2008-10-05 Sunday 07:48  Gerhard Stoll
+
+  * protokol/vscreen.u:
+
+  Add a table with program and identifier
+
+2008-10-05 Sunday 07:47  Gerhard Stoll
+
+  * gemdos/gemdos_f.u:
+
+  Add function from SysMon
+
+2008-10-03 Friday 15:19  Gerhard Stoll
+
+  * gem/aes/appl_/appl_exit.ui, gem/vdi/*,
+  gemdos/datetime/tgettime.ui, gemdos/datetime/tsettime.ui,
+  gemdos/dir/dcreate.ui, gemdos/dir/ddelete.ui, gemdos/dir/dfree.ui,
+  gemdos/dir/dgetdrv.ui, gemdos/dir/dsetpath.ui,
+  gemdos/file/fattrib.ui, gemdos/file/fchown.ui,
+  gemdos/file/fclose.ui, gemdos/file/fdatime.ui,
+  gemdos/file/fdelete.ui, gemdos/file/fforce.ui,
+  gemdos/file/fgetdta.ui, gemdos/file/fwrite.ui,
+  gemdos/memory/mfree.ui, gemdos/memory/mshrink.ui,
+  gemdos/prozess/pseteuid.ui, gemdos/prozess/pterm.ui,
+  gemdos/prozess/pterm0.ui, gemdos/system/slbclose.ui, magic/magic.u,
+  xbios/bildscrm/cursconf.ui, xbios/bildscrm/getrez.ui,
+  xbios/interrpt/jenabint.ui, xbios/intrface/dosound.ui,
+  xbios/intrface/giaccess.ui, xbios/intrface/ikbdws.ui,
+  xbios/intrface/iorec.ui, xbios/intrface/kbdvbase.ui,
+  xbios/intrface/mfpint.ui, xbios/intrface/midiws.ui,
+  xbios/intrface/offgibit.ui, xbios/intrface/ongibit.ui,
+  xbios/intrface/rsconf.ui, xbios/laufwerk/flopfmt.ui,
+  xbios/laufwerk/floprd.ui, xbios/laufwerk/flopver.ui,
+  xbios/laufwerk/flopwr.ui, xbios/laufwerk/protobt.ui,
+  xbios/spezial/blitmode.ui, xbios/spezial/cachectr.ui,
+  xbios/spezial/cjar.ui, xbios/spezial/dbmsg.ui,
+  xbios/spezial/janus.ui, xbios/spezial/puntaes.ui,
+  xbios/spezial/random.ui, xbios/spezial/ssbrk.ui,
+  xbios/spezial/supexec.ui, xbios/spezial/trapper.ui,
+  xbios/spezial/wdgctrl.ui:
+
+  Add some nolink
+
+2008-09-23 Tuesday 21:02  Michael Bernstein
+
+  * gemdos/gemdos.u:
+
+  Shorten paragraph about mint compatible function in introduction
+  because the same text occures in the chapter about filesystems.
+
+  Kürzen des Absatz über Mint kompatible Funktionen in der Einleitung,
+  da der Text ganauso im Kapitel üner Dateisystem erscheint.
+
+2008-09-21 Sunday 20:58  Michael Bernstein
+
+  * gemdos/prozess/pusrval.ui:
+
+  remove short part which cause problem for translation and gives
+  not additional information
+
+  kurze Passage entfernt, die keine Zusatzinformation liefert, aber
+  Probleme mit der Übersetzung machte
+
+2008-09-21 Sunday 20:53  Michael Bernstein
+
+  * gemdos/prozess/prozess.u:
+
+  modify short description of Psigaction
+
+  Kurzbeschreibung von Psigaction geändert
+
+2008-09-21 Sunday 20:50  Michael Bernstein
+
+  * gemdos/prozess/pexec.ui:
+
+  modify names of some modes to names given by atari compendium
+
+  Namen einiger Modi auf die Namen geändert, die das Atari
+  Compendium benutzt
+
+2008-09-18 Thursday 18:26  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/description/cab.ui:
+
+  Translation by Peter A. West
+
+2008-09-17 Wednesday 17:53  Gerhard Stoll
+
+  * xbios/: xbios.u, bildscrm/*, centscrn/*,
+  crazydot/*, ct60/*, datetime/datetime.ui, datetime/gettime.ui,
+  datetime/nvmacces.ui, datetime/settime.ui, datetime/xbtimer.ui,
+  drucker/*, dsp56001/*, interrpt/*, intrface/*,
+  laufwerk/*, overscan/*, pci_bios/*, sound/*,
+  startrac/*, tastatur/*:
+
+  Change the psition of Group and Availability
+
+2008-09-09 Tuesday 15:02  Gerhard Stoll
+
+  * gemdos/network/Nversion.ui, gemdos/network/network.u,
+  gem/vdi/escape/camera/vqp_error.ui,
+  gem/vdi/escape/camera/vqp_films.ui,
+  gem/vdi/escape/camera/vqp_state.ui,
+  gem/vdi/escape/camera/vsp_save.ui,
+  gem/vdi/escape/camera/vsp_state.ui:
+
+  Translation by Peter A. West
+
+2008-09-09 Tuesday 15:01  Gerhard Stoll
+
+  * bios/bios_en.ui, bios/bios_trap.ui, bios/sys_var_en.u,
+  bios/sys_vec_en.ui, bios/vt52.u, bios/xbra.u,
+  bios/cookie/cookie_en.ui, bios/cookie/description/_FSR.ui,
+  bios/function/bconin.u, bios/function/bconout.u,
+  bios/function/bconstat.u, bios/function/bcostat.u,
+  bios/function/drvmap.u, bios/function/getbpb.u,
+  bios/function/getmpb.u, bios/function/kbshift.u,
+  bios/function/mediach.u, bios/function/rwabs.u,
+  bios/function/setexc.u, bios/function/tickcal.u,
+  bios/structures/bpb.ui, bios/structures/md.ui,
+  bios/structures/mpb.ui, bios/structures/pun_info.ui, tos/tos_en.ui:
+
+  Correct some text and links
+
+2008-09-09 Tuesday 13:27  Gerhard Stoll
+
+  * tos_hyp.u, anhang/gpl.ui, anhang/hilfe.u:
+
+  Add GPL
+
+2008-09-03 Wednesday 23:39  Gerhard Stoll
+
+  * anhang/typedefs.u, anhang/anhang/anhang.u, anhang/anhang/pmmu.u,
+  anhang/anhang/xhdi/xhdi_en.ui, emulator.en/stem.u, magic/magic.u,
+  magic/magic_en.u, magic/magicerr.u, magic/magicinf.u,
+  magic/sharelib.u, magic/DFS/dfs_en.ui,
+  magic/MagiC_PC/magicpc_en.ui, magic/XFS/xfs_en.ui,
+  magic/threads/threads.u, protokol/dd.u, protokol/dhst.u,
+  protokol/font.u, protokol/gdps.ui, protokol/ltlproto.u,
+  protokol/xfsl.u, protokol/AV/av_en.ui,
+  protokol/BubbleGEM/bubble_en.ui, protokol/olga/olga_en.ui,
+  protokol/xacc/xacc_en.ui:
+
+  Correct links and wrong UDO commandos
+
+2008-09-03 Wednesday 07:45  Gerhard Stoll
+
+  * gem/cpxdoku.u:
+
+  Correct links
+
+2008-09-03 Wednesday 07:44  Gerhard Stoll
+
+  * bios/cookie/cookie_en.ui, gem/*, gemdos/*, linea/*,
+  protokol/ssp/ssp.u, xbios/laufwerk/laufwerk.u:
+
+  Correct links and wrong UDO commandos
+
+2008-09-01 Monday 12:28  Gerhard Stoll
+
+  * magic/magic_en.u, magic/DFS/dfs_en.ui,
+  magic/MagiC_Mac/magicmac_en.ui, magic/shutdown/shutdown_en.ui,
+  tos/tos_en.ui, tos_hyp.u, xbios/intrface/giaccess.ui,
+  xbios/intrface/ikbdws.ui, xbios/intrface/iorec.ui,
+  xbios/laufwerk/flopfmt.ui, xbios/overscan/oscanscr.ui,
+  xbios/overscan/oscanvb.ui, xbios/pci_bios/pci_bios.u,
+  xbios/pci_bios/read_config_byte.ui,
+  xbios/pci_bios/read_config_longword.ui,
+  xbios/pci_bios/read_config_word.ui,
+  xbios/pci_bios/set_interrupt.ui, xbios/pci_bios/special_cycle.ui,
+  xbios/pci_bios/unhook_interrupt.ui, xbios/sound/sound.u,
+  xbios/sound/soundcmd.ui, xbios/startrac/wr_dconv.ui,
+  xbios/startrac/wr_dpat1.ui, xbios/startrac/wr_dpat2.ui,
+  xbios/startrac/wr_dpdat.ui, xbios/startrac/wr_dport.ui,
+  xbios/startrac/wr_raes.ui, xbios/startrac/wr_rdsp.ui,
+  xbios/startrac/wr_rhi.ui, xbios/startrac/wr_rlow.ui,
+  xbios/structures/DSPBLOCK.ui, xbios/structures/OVERPATCH.ui,
+  xbios/structures/PBDEF.ui, xbios/tastatur/keytbl.ui,
+  gem/guidelns/style_en.u, gem/vdi/vdi_en.u, gemdos/gemdos.u,
+  gemdos/file/fforce.ui, gem/aes/shel_/shel_write.ui,
+  gem/aes/fnts_/fnts_.u, gem/aes/fnts_/fnts_add.ui,
+  gem/aes/fnts_/fnts_close.ui, gem/aes/fnts_/fnts_create.ui,
+  gem/aes/fnts_/fnts_delete.ui, gem/aes/fnts_/fnts_do.ui,
+  gem/aes/fnts_/fnts_evnt.ui, gem/aes/fnts_/fnts_get_info.ui,
+  gem/aes/fnts_/fnts_get_name.ui,
+  gem/aes/fnts_/fnts_get_no_styles.ui,
+  gem/aes/fnts_/fnts_get_style.ui, gem/aes/fnts_/fnts_open.ui,
+  gem/aes/fnts_/fnts_remove.ui, gem/aes/fnts_/fnts_update.ui,
+  anhang/typedefs.u, anhang/anhang/anhang.u, anhang/anhang/ascii.ui,
+  anhang/anhang/pmmu.u, anhang/anhang/scan-code.ui,
+  anhang/anhang/tos_vers.u, anhang/anhang/xhdi/xhdi_en.ui,
+  bilder/farbe/olga_1.img, bilder/farbe/olga_2.img,
+  bilder/farbe/olga_3.img, bilder/farbe/olga_4.img,
+  bilder/gif/olga_1.gif, bilder/gif/olga_2.gif,
+  bilder/gif/olga_3.gif, bilder/gif/olga_4.gif,
+  bilder/mono/olga_1.img, bilder/mono/olga_2.img,
+  bilder/mono/olga_3.img, bilder/mono/olga_4.img, bios/bios_en.ui,
+  bios/sys_var_en.u, bios/xbra.u, bios/cookie/cookie_en.ui,
+  bios/function/bconin.u, bios/function/getmpb.u:
+
+  Change links
+
+2008-09-01 Monday 12:27  Gerhard Stoll
+
+  * protokol/: xfsl.u, xssi.u, olga/olga_de.ui, olga/olga_en.ui,
+  ssp/ssp.u:
+
+  Translation by Peter A. West
+
+2008-08-26 Tuesday 13:59  Gerhard Stoll
+
+  * protokol/: dd.u, dhst.u, font.u, gdps.ui, ltlproto.u, view.u,
+  vscreen.u, AV/av_en.ui, BubbleGEM/bubble_de.ui,
+  BubbleGEM/bubble_en.ui, olga/olga_de.ui, olga/olga_en.ui,
+  seproto/seproto_de.ui, seproto/seproto_en.ui, ssp/ssp.u,
+  xacc/xacc_de.ui, xacc/xacc_en.ui:
+
+  Translation by Peter A. West
+
+2008-08-03 Sunday 09:47  Gerhard Stoll
+
+  * config.u, bios/bios_trap.ui, bios/sys_vec_en.ui,
+  gem/aes/appl_/appl_search.ui, gem/aes/fslx_/fslx_.u,
+  gem/aes/menu_/menu_settings.ui, gem/aes/objc_/objc_sysvar.ui,
+  gem/guidelns/style_en.u, gemdos/dir/dreadlab.ui,
+  gemdos/prozess/prozess.u, magic/DFS/dfs_en.ui, magic/XFS/xfs_en.ui,
+  xbios/laufwerk/laufwerk.u:
+
+  Correct links
+
+2008-07-31 Thursday 18:00  Gerhard Stoll
+
+  * bilder/: farbe/img2035_en.img, farbe/img2037_en.img,
+  farbe/img2040_en.img, farbe/img2041_en.img, farbe/img2042_en.img,
+  farbe/img2043_en.img, farbe/img2044_en.img, farbe/img2045_en.img,
+  gif/img2035_en.gif, gif/img2037_en.gif, gif/img2040_en.gif,
+  gif/img2041_en.gif, gif/img2042_en.gif, gif/img2043_en.gif,
+  gif/img2044_en.gif, gif/img2045_en.gif, mono/img2035_en.img,
+  mono/img2037_en.img, mono/img2040_en.img, mono/img2041_en.img,
+  mono/img2042_en.img, mono/img2043_en.img, mono/img2044_en.img,
+  mono/img2045_en.img:
+
+  Translation by Peter A. West
+
+2008-07-31 Thursday 17:54  Gerhard Stoll
+
+  * xbios/pci_bios/: get_routing.ui, set_interrupt.ui,
+  special_cycle.ui:
+
+  Wrong UDO syntax
+
+2008-07-31 Thursday 17:49  Gerhard Stoll
+
+  * gem/aes/: appl_/appl_control.ui, wind_/wind_set.ui:
+
+  Wrong UDO commando
+
+2008-07-31 Thursday 17:49  Gerhard Stoll
+
+  * emulator.en/sonstige.u, emulator.en/stem.u,
+  emulator.en/tos2win.u, gem/guidelns/style_en.u, magic/XFS/xfs.u,
+  n_aes/n_aes.u,
+  * magic/:
+  * xaaes/xaaes.u, tos_hyp.u, e_magic.u:
+
+  Translation by Peter A. West
+
+2008-07-27 Sunday 15:28  Michael Bernstein
+
+  * gemdos/: gemdos.u, datetime/talarm.ui, datetime/tgetdate.ui,
+  dir/dopendir.ui, file/fcntl.ui, file/fgetdta.ui, file/finstat.ui,
+  file/flink.ui, file/foutstat.ui, file/fputchar.ui, file/fread.ui,
+  prozess/pexec.ui, prozess/psetpgrp.ui, prozess/psigbloc.ui,
+  prozess/psigpaus.ui, prozess/pwait.ui, structures/DTA.ui,
+  system/sversion.ui, system/sysconf.ui:
+
+  Bugfixes aufgrund von Anmerkungen, die Peter West beim Vergleich
+  mit dem Atari Compendium bei der Übersetzung gemacht hatte.
+
+  Bugfixes made because of annotations made by Peter West as a result
+  of comparing with Atari Compendium while translating from german to
+  english.
+
+2008-07-19 Saturday 18:39  Gerhard Stoll
+
+  * magic/:
+  * gem/cpxdoku.u, gem/guidelns/style.u, gem/guidelns/style_en.u:
+
+  Translation by Peter A. West
+
+2008-06-29 Sunday 13:46  Gerhard Stoll
+
+  * anhang/hilfe.u, anhang/typedefs.u, anhang/anhang/anhang.u,
+  anhang/changes/04_90.ui, anhang/changes/04_93.ui,
+  anhang/changes/04_95.ui, anhang/changes/old.ui, bios/sys_vec_de.ui,
+  bios/sys_vec_en.ui, bios/vt52.u, bios/cookie/list.ui,
+  bios/cookie/description/DYJD.ui, bios/cookie/description/DYwl.ui,
+  bios/cookie/description/MagX.ui, bios/cookie/description/MgMc.ui,
+  bios/cookie/description/MgMx.ui, bios/cookie/description/MgSn.ui,
+  bios/cookie/description/StIc.ui, bios/cookie/description/SwTm.ui,
+  bios/cookie/description/WICO.ui, bios/cookie/description/_FDC.ui,
+  bios/cookie/description/_FLK.ui, gem/aes/aes_f.u,
+  gem/aes/evnt_/messages/evnts_de.ui,
+  gem/aes/evnt_/messages/messages.u, gem/aes/fnts_/fnts_.u,
+  gem/aes/fsel_/fsel_.u, gem/aes/fsel_/fsel_boxinput.ui,
+  gem/aes/fslx_/fslx_.u, gem/aes/fslx_/use.ui, gem/aes/lbox_/lbox_.u,
+  gem/aes/menu_/menu_.u, gem/aes/objc_/objc_.u,
+  gem/aes/objc_/objc_sysvar.ui, gem/aes/shel_/shel_.u,
+  gem/aes/shel_/shel_get.ui, gem/aes/shel_/shel_put.ui,
+  gem/aes/shel_/shel_write.ui, gem/aes/structures/hndl_obj.ui,
+  gem/aes/structures/prn_settings.ui, gem/aes/wdlg_/wdlg_.u,
+  gem/aes/wdlg_/wdlg_get_edit.ui, gem/aes/wind_/wind_create.ui,
+  gem/aes/wind_/wind_get.ui, gem/aes/wind_/wind_open.ui,
+  gem/aes/wind_/wind_set.ui, gem/guidelns/style.u,
+  gem/guidelns/style_en.u, gem/vdi/vdi.u, gem/vdi/vdi_en.u,
+  gemdos/dir/dfree.ui, gemdos/dir/dgetdrv.ui, gemdos/dir/dsetdrv.ui,
+  gemdos/file/fcreate.ui, gemdos/file/fdelete.ui,
+  gemdos/file/fdup.ui, gemdos/file/fforce.ui, gemdos/file/frename.ui,
+  gemdos/file/fselect.ui, gemdos/file/fsfirst.ui,
+  gemdos/system/sconfig.ui, gemdos/system/slbclose.ui,
+  gemdos/system/slbopen.ui, magic/magic.u, magic/magicinf.u,
+  magic/magicmac.u, magic/magicpc.u, magic/xfs.u,
+  magic/shutdown/shutdown_de.ui, magic/threads/threads.u,
+  protokol/ltlproto.u, tos/tos_de.ui, tos/tos_en.ui, xbios/xbios.u,
+  xbios/drucker/prtblk.ui, xbios/drucker/scrdmp.ui,
+  xbios/laufwerk/floprate.ui, xbios/pci_bios/pci_bios.u,
+  xbios/spezial/blitmode.ui, xbios/spezial/ssbrk.ui,
+  xbios/structures/META_INFO_2.ui, xbios/structures/bconmap.ui:
+
+  Change MagiCMac and MagiCPC to MagiC Mac and MagiC PC
+
+2008-06-12 Thursday 17:59  Gerhard Stoll
+
+  * gem/aes/:
+  * gem/structures/:
+  * gem/aes/appl_/:
+  * gem/aes/shel_/:
+
+  Translation by Peter A. West
+
+2008-06-08 Sunday 07:07  Gerhard Stoll
+
+  * gem/aes/wind_/wind_get_set.ui:
+
+  Add source from WF_MINXYWH and WF_INFOXYWH
+
+2008-06-08 Sunday 07:07  Gerhard Stoll
+
+  * gem/aes/objc_/:
+  * gem/aes/rsrc_/:
+  * gem/aes/menu_/:
+  * gem/aes/xgrf_/:
+  * gem/aes/lbox_/:
+
+  Translation by Peter A. West
+
+2008-06-03 Tuesday 19:24  Gerhard Stoll
+
+  * gem/aes/appl_/appl_getinfo.ui:
+
+  Wrong number fron WinX
+
+2008-05-31 Saturday 06:14  Gerhard Stoll
+
+  * gem/aes/:
+  * gem/scrp_/:
+  * gem/aes/form_/:
+
+  Translation by Peter A. West
+
+2008-05-27 Tuesday 16:14  Gerhard Stoll
+
+  * bios/cookie/: cookie.u, list.ui, description/AMCG.ui:
+
+  Add the cookie AMCG (AMC-GDOS)
+
+2008-05-27 Tuesday 16:11  Gerhard Stoll
+
+  * xbios/: xbios_f.u, xbios_f.u:
+
+  Wrong opcode by GetActiveFeatures
+
+2008-05-23 Friday 07:39  Gerhard Stoll
+
+  * gem/aes/fslx_/:
+  * gem/aes/wind_/:
+  * gem/aes/wdlg_/:
+  * gem/aes/evnt_/:
+  * gem/aes/edit_/:
+  * gem/aes/pdlg_/:
+  * gem/aes/fsel_/:
+  * gem/aes/: aes_f.u, toolbar.ui
+  * gem/aes/appl_/:
+
+  Translation by Peter A. West
+
+2008-05-13 Tuesday 14:11  Gerhard Stoll
+
+  * xbios/: xbios_f.u, pci_bios/get_routing.ui, pci_bios/pci_bios.u,
+  pci_bios/set_interrupt.ui, pci_bios/special_cycle.ui:
+
+  Add more PCI-XBIOS function
+
+2008-05-01 Thursday 16:55  Gerhard Stoll
+
+  * gem/aes/: aes.u, aes_en.u, toolbar.ui:
+
+  Translation by Peter A. West
+
+2008-05-01 Thursday 16:54  Gerhard Stoll
+
+  * bilder/: gif/fenster_en.gif, farbe/fenster_en.img,
+  mono/fenster_en.img:
+
+  New picture from Peter A. West
+
+2008-03-30 Sunday 09:31  Gerhard Stoll
+
+  * gem/vdi/raster/:
+
+  Translation by Peter A. West
+
+2008-03-29 Saturday 20:21  Gerhard Stoll
+
+  * gem/vdi/attribut/:
+  * gem/vdi/control/:
+  * gem/vdi/inquire/:
+  * gem/vdi/output/:
+  * gem/vdi/colortable/:
+  * gem/vdi/escape/:
+  * bios/bios_en.ui, bios/sys_vec_en.ui, gem/aes/aes_en.u,
+  * gem/aes/appl_/appl_getinfo.ui, gem/vdi/vdi_en.u,
+  gem/vdi/attribut/text/*, gem/vdi/attribut/uebergeordnete/*,
+  gem/vdi/escape/metafile/*, gem/vdi/output/*,
+  gem/vdi/structures/xfnt_info.ui, gemdos/gemdos.u, gemdos/signale.u,
+  gemdos/file/fforce.ui, gemdos/file/fopen.ui, xbios/xbios.u:
+
+  Translation by Peter A. West
+
+2008-03-22 Saturday 09:06  Gerhard Stoll
+
+  * gem/vdi/input/: input.u, v_hide_c.ui, v_show_c.ui, vex_butv.ui,
+  vex_curv.ui, vex_motv.ui, vex_timv.ui, vex_wheelv.ui, vq_key_s.ui,
+  vq_mouse.ui, vrq_choice.ui, vrq_locator.ui, vrq_string.ui,
+  vrq_valuator.ui, vsc_form.ui, vsin_mode.ui, vsm_choice.ui,
+  vsm_locator.ui, vsm_string.ui, vsm_valuator.ui:
+
+  Translation by Peter A. West
+
+2008-03-21 Friday 14:41  Gerhard Stoll
+
+  * gem/vdi/inquire/: disable_nvdi.ui, fontheader.ui, inquire.u,
+  v_create_driver_info.ui, v_delete_driver_info.ui,
+  v_get_driver_info.ui, v_getbitmap_info.ui,
+  v_read_default_settings.ui, v_write_default_settings.ui,
+  vq_cellarray.ui, vq_color.ui, vq_devinfo.ui, vq_ext_devinfo.ui,
+  vq_extnd.ui, vq_scrninfo.ui, vqf_attributes.ui, vqf_bg_color.ui,
+  vqf_fg_color.ui, vqin_mode.ui, vql_attributes.ui, vql_bg_color.ui,
+  vql_fg_color.ui, vqm_attributes.ui, vqm_bg_color.ui,
+  vqm_fg_color.ui, vqr_bg_color.ui, vqr_fg_color.ui, vqt_advance.ui,
+  vqt_advance32.ui, vqt_attributes.ui, vqt_bg_color.ui,
+  vqt_cachesize.ui, vqt_char_index.ui, vqt_ext_name.ui,
+  vqt_extent.ui, vqt_f_extent.ui, vqt_fg_color.ui, vqt_fontheader.ui,
+  vqt_fontinfo.ui, vqt_get_table.ui, vqt_justified.ui, vqt_name.ui,
+  vqt_name_and_id.ui, vqt_pairkern.ui, vqt_real_extent.ui,
+  vqt_trackkern.ui, vqt_width.ui, vqt_xfntinfo.ui:
+
+  Translation by Peter A. West
+
+2008-03-17 Monday 13:25  Gerhard Stoll
+
+  * gemdos/gemdos_f.u:
+
+  Wrong opcode from Maccess
+
+2008-03-16 Sunday 16:34  Gerhard Stoll
+
+  * gem/vdi/output/: output.u, v_arc.ui, v_bar.ui, v_bez.ui,
+  v_bez_fill.ui, v_cellarray.ui, v_circle.ui, v_contourfill.ui,
+  v_ellarc.ui, v_ellipse.ui, v_ellpie.ui, v_etext.ui, v_fillarea.ui,
+  v_ftext.ui, v_ftext_offset.ui, v_gtext.ui, v_justified.ui,
+  v_pieslice.ui, v_pline.ui, v_pmarker.ui, v_rbox.ui, v_rfbox.ui,
+  vr_recfl.ui:
+
+  Translation by Peter A. West
+
+2008-03-12 Wednesday 18:33  Gerhard Stoll
+
+  * gemdos/: prozess/pwait3.ui, system/ssystem.ui:
+
+  Wrong UDO syntax
+
+2008-03-12 Wednesday 18:32  Gerhard Stoll
+
+  * bios/bios.u, bios/bios_en.ui, xbios/xbios.u, gemdos/gemdos.u,
+  magic/magicerr.u:
+
+  Translation by Peter A. West
+
+2008-03-07 Friday 17:56  Gerhard Stoll
+
+  * bios/cookie/: list.ui, description/*:
+  * gem/vdi/: vdi_f.u, attribut/*, structures/*:
+  * bios/cookie/description/_VDI.ui, xbios/bildscrm/getrez.ui,
+  xbios/bildscrm/setpalet.ui, xbios/bildscrm/vsetmask.ui,
+  gem/vdi/assign_sys.ui, gem/vdi/metafile.u, gem/vdi/vdi.u,
+  gem/vdi/vdi_en.u, gem/vdi/attribut/attribut.u,
+  gem/vdi/attribut/bitmap/bitmap.u, gem/vdi/attribut/fill/fill.u,
+  gem/vdi/attribut/linien/lines.u, gem/vdi/attribut/marker/marker.u,
+  gem/vdi/attribut/text/text.u,
+  gem/vdi/attribut/uebergeordnete/superior.u:
+
+  Translation by Peter A. West
+
+2008-01-27 Sunday 13:34  Gerhard Stoll
+
+  * tos/: tos_de.ui, tos_en.ui:
+  * linea/:
+
+  Translation by Peter A. West
+
+2008-01-13 Sunday 20:41  Michael Bernstein
+
+  * gemdos/: signale.u
+  * gemdos/chrinout/:
+  * gemdos/dir/:
+  * gemdos/file/:
+  * gemdos/prozess/:
+  * gemdos/structures/PD.ui, structures/flock.ui:
+
+  Erweiterungen hinzugefuegt, die Peter West beim Uebersetzen von Deutsch
+  nach Englisch mit Hilfe des AC eingefuegt hatte.
+
+  Add extensions made by Peter West with help of AC while translate from
+  german to english.
+
+2008-01-08 Tuesday 18:32  Gerhard Stoll
+
+  * gemdos/: filesys.u, gemdos.u, gemdos_f.u, signale.u,
+  chrinout/cauxin.ui, chrinout/cconws.ui, file/fforce.ui,
+  prozess/psetauid.ui, prozess/psignal.ui, prozess/pwait3.ui,
+  structures/PD.ui, structures/sigaction.ui, system/ssystem.ui,
+  system/super.ui:
+
+  Translation by Peter A. West
+
+2008-01-01 Tuesday 19:38  Michael Bernstein
+
+  * gemdos/: argv.u, filesys.u, gemdos.u, gemdos_f.u, signale.u,
+  tekbios.u, chrinout/*, datetime/*, dir/*, file/*,
+  memory/*, prozess/*, structures/*, system/*:
+
+  Uebersetzung von Peter West integriert. Seine Kommentare wurden
+  noch nicht beachtet, da sie etwas Recherche erfordern.
+
+  Add translations from Peter West. His comments ignored at this
+  time because they need some research work.
+
+2007-12-30 Sunday 09:33  Gerhard Stoll
+
+  * xbios/*, bios/sys_var_en.u, bios/xbra.u,
+  bios/cookie/description/FSMC.ui,
+  bios/cookie/description/NVDI.ui, bios/cookie/description/_FLK.ui,
+  bios/cookie/description/_NET.ui, bios/structures/mpb.ui,
+  anhang/anhang/ascii.ui:
+
+  Translation by Peter A. West
+
+2007-12-27 Thursday 10:22  Gerhard Stoll
+
+  * xbios/: startrac/installe.ui
+  * xbios/structures/:
+  * xbios/: xbios_f.u
+  * xbios/spezial/:
+  * xbios/tastatur/:
+  * xbios/: sound/*, startrac/*:
+  * xbios/pci_bios/:
+
+  Translation by Peter A. West
+
+2007-12-09 Sunday 10:30  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/messages.u:
+
+  Messages from Porthos add
+
+2007-12-04 Tuesday 20:10  Gerhard Stoll
+
+  * xbios/overscan/: oscanis.ui, oscanpat.ui, oscanphy.ui,
+  oscanscr.ui, oscanswi.ui, oscantab.ui, oscanvb.ui, overscan.u:
+
+  Translation by Peter A. West
+
+2007-12-04 Tuesday 20:10  Gerhard Stoll
+
+  * gemdos/gemdos_f.u:
+
+  Add function from GEMTASK Royal to the list
+
+2007-12-02 Sunday 09:50  Gerhard Stoll
+
+  * xbios/: datetime/settime.ui, dsp56001/iostream.ui,
+  dsp56001/outstrea.ui, interrpt/jdisint.ui, interrpt/jenabint.ui,
+  laufwerk/*:
+  * xbios/centscrn/: vattrib.ui, vclose.ui, vcreate.ui, vdelete.ui,
+  vfirst.ui, vload.ui, vlock.ui, vnext.ui, voffset.ui, vopen.ui,
+  vread.ui, vsave.ui, vscroll.ui, vseek.ui, vsize.ui, vvalid.ui,
+  vwrite.ui:
+  * xbios/: dsp56001/*, interrpt/interrpt.u,
+  interrpt/jdisint.ui, interrpt/jenabint.ui:
+
+  Translation by Peter A. West
+
+2007-10-07 Sunday 08:59  Gerhard Stoll
+
+  * bios/cookie/description/: CT60.ui, FSMC.ui, NVDI.ui, _MCH.ui:
+
+  More infos from some cookies
+
+2007-10-07 Sunday 08:58  Gerhard Stoll
+
+  * xbios/: datetime/datetime.u, datetime/datetime.ui,
+  datetime/gettime.ui, datetime/nvmacces.ui, datetime/settime.ui,
+  datetime/xbtimer.ui, drucker/drucker.u, drucker/prtblk.ui,
+  drucker/scrdmp.ui, drucker/setprt.ui, dsp56001/availabl.ui,
+  dsp56001/blkbytes.ui, dsp56001/blkhndsh.ui, dsp56001/dsp56001.u:
+  * config.u, bios/cookie/example_en.ui, gem/vdi/vdi.u,
+  gem/vdi/vdi_en.u, xbios/bildscrm/*, xbios/centscrn/*,
+  xbios/crazydot/*, xbios/crazydot/resetscr.ui,
+  xbios/ct60/cache.ui, xbios/ct60/ct60.u,
+  xbios/ct60/ct60_vmalloc.ui, xbios/ct60/fl_cache.ui,
+  xbios/ct60/rcortemp.ui, xbios/ct60/rd_param.ui:
+  * config.u, gem/aes/aes_f.u, gem/aes/appl_/appl_getinfo.ui,
+  gemdos/gemdos_f.u, xbios/xbios.u, xbios/bildscrm/bildscrm.u,
+  xbios/bildscrm/cursconf.ui, xbios/bildscrm/egetpale.ui,
+  xbios/bildscrm/egetshif.ui, xbios/bildscrm/esetbank.ui,
+  xbios/startrac/scmsmode.ui:
+
+  Translation by Peter A. West
+
+2007-08-26 Sunday 16:37  Gerhard Stoll
+
+  * xbios/pci_bios/get_machine_id.ui:
+
+  Manufacturer code from ARAnyM
+
+2007-08-26 Sunday 16:36  Gerhard Stoll
+
+  * bios/: bios_en.ui, cookie/cookie.u, cookie/cookie_en.ui,
+  cookie/description/CHBT.ui, cookie/description/CHN1.ui,
+  cookie/description/CHNG.ui, cookie/description/FSER.ui:
+
+  Small text changes
+
+2007-08-13 Monday 19:50  Gerhard Stoll
+
+  * magic/magic.u, anhang/typedefs.u:
+
+  Wrong label
+
+2007-08-13 Monday 19:50  Gerhard Stoll
+
+  * protokol/dhst.u:
+
+  Add define DHST_ADD and DHST_ACK
+
+2007-08-13 Monday 19:49  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/: geneva.ui, messages.u, rsdaemon.ui,
+  description/cab.ui, description/geneva.ui, description/rsdaemon.ui:
+
+  CAB Protocol
+
+2007-08-13 Monday 19:48  Gerhard Stoll
+
+  * bios/cookie/: list.ui, description/GSND.ui:
+
+  GSND is a cookie
+
+2007-08-04 Saturday 05:52  Gerhard Stoll
+
+  * bios/cookie/description/GMTC.ui:
+
+  Infos for programmer
+
+2007-08-04 Saturday 05:52  Gerhard Stoll
+
+  * gemdos/structures/flock.ui:
+
+  Add some lables
+
+2007-08-04 Saturday 05:52  Gerhard Stoll
+
+  * anhang/typedefs.u:
+
+  Wrong syntax in XCPB
+
+2007-07-03 Tuesday 18:01  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/messages.u:
+
+  Message from the GFA-Basic Editor (GBE)
+
+2007-07-03 Tuesday 18:00  Gerhard Stoll
+
+  * gemdos/: gemdos.u, network/Nversion.ui, network/network.u:
+
+  Network function
+
+2007-07-03 Tuesday 17:59  Gerhard Stoll
+
+  * anhang/: neu.u, changes/04_98.ui:
+
+  Start with version 4.98
+
+2007-06-17 Sunday 17:05  Gerhard Stoll
+
+  * anhang/changes/04_97.ui:
+
+  Make Release 4.97
+
+2007-06-17 Sunday 06:52  Gerhard Stoll
+
+  * bios/cookie/: cookie.u, list.ui:
+
+  Delete some links
+
+2007-06-16 Saturday 12:14  Gerhard Stoll
+
+  * bios/bios_en.ui:
+
+  Small chnages
+
+2007-06-16 Saturday 12:13  Gerhard Stoll
+
+  * gem/aes/wind_/wind_get_set_geneva.ui:
+
+  Double defined symbol
+
+2007-06-16 Saturday 08:24  Gerhard Stoll
+
+  * bios/cookie/description/PRNß.ui:
+
+  Delete file with no good filename
+
+2007-06-15 Friday 17:07  Gerhard Stoll
+
+  * bios/cookie/description/PRNSS.ui:
+
+  Change filename
+
+2007-06-15 Friday 16:40  Gerhard Stoll
+
+  * bios/cookie/list.ui:
+
+  Wrong UDO syntax
+
+2007-06-15 Friday 16:40  Gerhard Stoll
+
+  * bios/cookie/description/LMus.ui:
+
+  Wrong headline
+
+
+

1.3.5 Version 4.97

+
+2007-06-15 Friday 16:40  Gerhard Stoll
+
+  * anhang/anhang/tos_vers.u:
+
+  Add TOS 4.06
+
+2007-06-03 Sunday 07:16  Gerhard Stoll
+
+  * bios/cookie/description/MAGN.ui:
+
+  More info about the cookie
+
+2007-06-03 Sunday 07:13  Gerhard Stoll
+
+  * bios/bios_f.u:
+
+  Correct Bios function 0x10
+
+2007-05-28 Monday 08:01  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/messages.u:
+
+  Add messages from MyOSD
+
+2007-05-19 Saturday 08:38  Gerhard Stoll
+
+  * bios/cookie/description/LOGB.ui:
+
+  More info about the cookie
+
+2007-05-05 Saturday 13:20  Gerhard Stoll
+
+  * config.u, bilder/farbe/cl_width_en.img,
+  bilder/farbe/extent_en.img, bilder/farbe/f_select_en.img,
+  bilder/farbe/fenster_en.img, bilder/farbe/fontinfo_en.img,
+  bilder/farbe/img2034_en.img, bilder/farbe/koords_en.img,
+  bilder/farbe/raster_en.img, bilder/farbe/taskman_en.img,
+  bilder/farbe/tpa_en.img, bilder/farbe/wr_modi_en.img,
+  bilder/farbe/xcontrol_en.img, bilder/gif/cl_width_en.gif,
+  bilder/gif/extent_en.gif, bilder/gif/f_select_en.gif,
+  bilder/gif/fenster_en.gif, bilder/gif/fontinfo_en.gif,
+  bilder/gif/img2034_en.gif, bilder/gif/koords_en.gif,
+  bilder/gif/raster_en.gif, bilder/gif/taskman_en.gif,
+  bilder/gif/tpa_en.gif, bilder/gif/wr_modi_en.gif,
+  bilder/gif/xcontrol_en.gif, bilder/mono/cl_width_en.img,
+  bilder/mono/extent_en.img, bilder/mono/f_select_en.img,
+  bilder/mono/fenster_en.img, bilder/mono/fontinfo_en.img,
+  bilder/mono/img2034_en.img, bilder/mono/koords_en.img,
+  bilder/mono/raster_en.img, bilder/mono/taskman_en.img,
+  bilder/mono/tpa_en.img, bilder/mono/wr_modi_en.img,
+  bilder/mono/xcontrol_en.img, gem/aes/fsel_/fsel_exinput.ui,
+  gem/aes/wind_/components.ui, gem/aes/wind_/wind_get_set_geneva.ui,
+  gem/guidelns/style_en.u, gem/vdi/vdi_en.u,
+  gem/vdi/attribut/fill/filltypes.ui, gem/vdi/control/v_opnbm.ui,
+  gem/vdi/control/v_pat_rotate.ui, gem/vdi/inquire/vqt_extent.ui,
+  gem/vdi/inquire/vqt_fontinfo.ui, gem/vdi/inquire/vqt_width.ui,
+  gemdos/gemdos.u:
+
+  Translation by Peter A. West
+
+2007-04-28 Saturday 13:02  Gerhard Stoll
+
+  * config.u, tos_hyp.u, bios/bios_en.ui, gem/aes/wind_/wind_get.ui,
+  xbios/bildscrm/cursconf.ui, xbios/bildscrm/egetpale.ui,
+  xbios/bildscrm/egetshif.ui, xbios/bildscrm/esetbank.ui,
+  xbios/bildscrm/esetcolo.ui, xbios/bildscrm/esetgray.ui,
+  xbios/bildscrm/esetpale.ui, xbios/bildscrm/esetshif.ui,
+  xbios/bildscrm/esetsmea.ui, xbios/bildscrm/getrez.ui,
+  xbios/bildscrm/initmous.ui, xbios/bildscrm/logbase.ui,
+  xbios/bildscrm/mon_type.ui, xbios/bildscrm/physbase.ui,
+  xbios/bildscrm/setcolor.ui, xbios/bildscrm/setpalet.ui,
+  xbios/bildscrm/setscree.ui, xbios/bildscrm/vgetrgb.ui,
+  xbios/bildscrm/vgetsize.ui, xbios/bildscrm/vsetmask.ui,
+  xbios/bildscrm/vsetmode.ui, xbios/bildscrm/vsetrgb.ui,
+  xbios/bildscrm/vsetscre.ui, xbios/bildscrm/vsetsync.ui,
+  xbios/bildscrm/vsync.ui, xbios/centscrn/multimon.ui,
+  xbios/centscrn/setmon.ui, xbios/centscrn/sizecomp.ui,
+  xbios/centscrn/vattrib.ui, xbios/centscrn/vclose.ui,
+  xbios/centscrn/vcreate.ui, xbios/centscrn/vdelete.ui,
+  xbios/centscrn/vfirst.ui, xbios/centscrn/vload.ui,
+  xbios/centscrn/vlock.ui, xbios/centscrn/vnext.ui,
+  xbios/centscrn/voffset.ui, xbios/centscrn/vopen.ui,
+  xbios/centscrn/vread.ui, xbios/centscrn/vsave.ui,
+  xbios/centscrn/vscroll.ui, xbios/centscrn/vseek.ui,
+  xbios/centscrn/vsize.ui, xbios/centscrn/vvalid.ui,
+  xbios/centscrn/vwrite.ui, xbios/crazydot/acmodenr.ui,
+  xbios/crazydot/cpmd2amd.ui, xbios/crazydot/gamddesc.ui,
+  xbios/crazydot/getafeat.ui, xbios/crazydot/getfeat.ui,
+  xbios/crazydot/getnofpm.ui, xbios/crazydot/getpmode.ui,
+  xbios/crazydot/gregbase.ui, xbios/crazydot/gscrdesc.ui,
+  xbios/crazydot/readmode.ui, xbios/crazydot/resetscr.ui:
+
+  Translation by Peter A. West
+
+2007-04-28 Saturday 12:57  Gerhard Stoll
+
+  * bios/cookie/description/Gnva.ui, gem/aes/appl_/appl_yield.ui,
+  gem/aes/appl_/x_appl_flags.ui, gem/aes/appl_/x_appl_sleep.ui,
+  gem/aes/evnt_/messages/geneva.ui, gem/aes/graf_/graf_slidebox.ui,
+  gem/aes/structures/rsxhdr.ui, gem/aes/wind_/wind_.u,
+  gem/aes/wind_/wind_get_set.ui,
+  gem/aes/wind_/wind_get_set_geneva.ui, gem/aes/form_/form_.u,
+  gem/aes/form_/form_center.ui, gem/aes/form_/form_dial.ui,
+  gem/aes/form_/x_form_center.ui, gem/aes/form_/x_form_error.ui:
+
+  Infos from Geneva add
+
+2007-04-24 Tuesday 18:39  Gerhard Stoll
+
+  * gem/aes/: appl_/x_appl_flags.ui, structures/ANI_MOUSE.ui,
+  structures/APPFLAGS.ui, structures/APPFLG.ui,
+  structures/XFONTINFO.ui, structures/menu.ui,
+  structures/structures.u:
+
+  Add some structures from Geneva
+
+2007-04-22 Sunday 17:34  Gerhard Stoll
+
+  * tos_hyp.u, anhang/hilfe.u, anhang/anhang/anhang.u,
+  anhang/anhang/ascii.ui, anhang/anhang/scan-code.ui,
+  anhang/anhang/xhdi/xhdi_en.ui, bios/bios_en.ui, bios/bios_trap.ui,
+  bios/sys_vec_en.ui, bios/vt52.u, bios/xbra.u,
+  bios/function/bconin.u, bios/function/bconout.u,
+  bios/function/bconstat.u, bios/function/bcostat.u,
+  bios/function/drvmap.u, bios/function/getbpb.u,
+  bios/function/getmpb.u, bios/function/kbshift.u,
+  bios/function/mediach.u, bios/function/rwabs.u,
+  bios/function/setexc.u, bios/function/tickcal.u,
+  gem/aes/evnt_/evnt_keybd.ui, gem/aes/structures/scanx.ui,
+  gem/aes/structures/xdo_inf.ui, gem/guidelns/style_en.u,
+  protokol/AV/av_en.ui, xbios/tastatur/keytbl.ui,
+  xbios/tastatur/tastatur.u:
+
+  Translation by Peter A. West
+
+2007-04-21 Saturday 06:51  Gerhard Stoll
+
+  * config.u, e_aes.u, e_bios.u, e_cpxdok.u, e_funk_l.u, e_gemdos.u,
+  e_linea.u, e_magic.u, e_olga.u, e_protok.u, e_tos.u, e_tos_li.u,
+  e_vdi.u, e_view.u, e_vt52.u, e_xbios.u, e_xbra.u, e_xhdi.u,
+  tos_hyp.u, anhang/hilfe.u, anhang/anhang/tos_vers.u, bios/bios.u,
+  bios/bios_en.ui, bios/sys_var.u, bios/sys_var_de.u,
+  bios/sys_var_en.u, bios/sys_vec_de.ui, bios/sys_vec_en.ui,
+  gem/gem.u, tos/tos_de.ui, tos/tos_en.ui:
+
+  Translation by Peter A. West
+
+2007-04-08 Sunday 08:38  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/messages.u:
+
+  Message form Aniplayer and M_PLAYER
+
+2007-04-06 Friday 10:02  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/messages.u:
+
+  Message form Suji
+
+2007-03-25 Sunday 17:33  Gerhard Stoll
+
+  * protokol/AV/: av.u, av_de.ui, av_en.ui:
+
+  Update AV protocol
+  VA_THAT_IZIT  : VA_OB_NOTEPAD and VA_OB_NOTE
+  VA_PROTOSTATUS: Bit 5 (AV_SENDCLICK)
+  AV_XWIND      : Bit 2
+  AV_VIEW       : msg[5]
+
+2007-03-09 Friday 10:27  Gerhard Stoll
+
+  * protokol/AV/av.u, protokol/AV/av_de.ui, protokol/AV/av_en.ui,
+  protokol/av.u, e_protok.u, tos_hyp.u:
+
+  First translation of the AV protocol
+
+2007-03-07 Wednesday 07:48  Gerhard Stoll
+
+  * gem/aes/wind_/wind_get.ui:
+
+  Description the bug in TOS 1.02 by WF_SCREEN
+
+2007-02-16 Friday 17:39  Gerhard Stoll
+
+  * xbios/: xbios_f.u, pci_bios/error.ui,
+  pci_bios/fast_read_config_byte.ui,
+  pci_bios/fast_read_config_longword.ui,
+  pci_bios/fast_read_config_word.ui, pci_bios/fpclassc.ui,
+  pci_bios/fpdevice.ui, pci_bios/get_machine_id.ui,
+  pci_bios/get_resource.ui, pci_bios/hook_interrupt.ui,
+  pci_bios/pci_bios.u, pci_bios/read_config_longword.ui,
+  pci_bios/unhook_interrupt.ui, pci_bios/write_config_longword.ui,
+  pci_bios/write_config_word.ui, structures/PCI_RSC_DESC.ui,
+  structures/structures.u:
+
+  Add PCI-BIOS function get_machine_id, get_resource and
+  unhook_interrupt
+
+2007-02-12 Monday 06:37  Gerhard Stoll
+
+  * xbios/bildscrm/mon_type.ui:
+
+  Value Value four and five from the ct60
+
+2007-02-11 Sunday 14:39  Gerhard Stoll
+
+  * bios/cookie/: cookie.u, description/MN3D.ui:
+
+  Cookie form the MENU3D.PRG
+
+2007-02-11 Sunday 14:34  Gerhard Stoll
+
+  * bios/cookie/: cookie.u, list.ui, description/Nspd.ui:
+
+  Cookie form the acceleration-card Nemesis
+
+2007-02-03 Saturday 16:06  Gerhard Stoll
+
+  * xbios/: xbios_f.u, bildscrm/Setscreen_Milan.ui,
+  bildscrm/Setscreen_ct60.ui, bildscrm/bildscrm.u,
+  bildscrm/vsetscre.ui, ct60/cache.ui, ct60/ct60.u,
+  ct60/ct60_vmalloc.ui, ct60/fl_cache.ui, ct60/rcortemp.ui,
+  ct60/rd_param.ui, structures/SCREENINFO.ui,
+  structures/SCRMEMBLK.ui:
+
+  Add new XBIOS functions from the ct60 (2007-01-24)
+
+2007-01-20 Saturday 16:20  Gerhard Stoll
+
+  * gem/vdi/: vdi_en.u, attribut/attribut.u,
+  attribut/bitmap/bitmap.u, attribut/fill/vsf_xperimeter.ui,
+  attribut/linien/lines.u, attribut/linien/v_bez_qual.ui,
+  attribut/linien/vsl_bg_color.ui, attribut/linien/vsl_color.ui,
+  attribut/linien/vsl_ends.ui, attribut/linien/vsl_fg_color.ui,
+  attribut/linien/vsl_type.ui, attribut/linien/vsl_udsty.ui,
+  attribut/linien/vsl_width.ui, attribut/marker/marker.u,
+  attribut/marker/vsm_bg_color.ui, attribut/marker/vsm_color.ui,
+  attribut/marker/vsm_fg_color.ui, attribut/text/text.u,
+  attribut/text/v_topbot.ui, attribut/text/vst_alignment.ui,
+  attribut/text/vst_arbpt.ui, attribut/text/vst_bg_color.ui,
+  attribut/text/vst_fg_color.ui, attribut/text/vst_scratch.ui,
+  attribut/text/vst_setsize.ui, attribut/uebergeordnete/superior.u,
+  attribut/uebergeordnete/v_ps_halftone.ui,
+  attribut/uebergeordnete/v_setrgb.ui,
+  attribut/uebergeordnete/v_setrgbi.ui,
+  attribut/uebergeordnete/vs_color.ui,
+  attribut/uebergeordnete/vs_color2.ui,
+  attribut/uebergeordnete/vs_grayoverride.ui,
+  attribut/uebergeordnete/vswr_mode.ui:
+
+  Small Update for the english version
+
+2007-01-01 Monday 15:43  Gerhard Stoll
+
+  * bios/cookie/: cookie.u, list.ui, description/FAX_.ui,
+  description/MCWR.ui:
+
+  Cookie from STarFax
+
+2007-01-01 Monday 15:42  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/messages.u:
+
+  Messages from QFax/Pro, STarFax and ViewFax
+
+2006-12-15 Friday 18:10  Gerhard Stoll
+
+  * bios/cookie/: cookie.u, list.ui, description/CHBT.ui,
+  description/CHTW.ui, description/CICN.ui, description/CLOK.ui,
+  description/DATE.ui, description/DYDL.ui, description/DYwl.ui,
+  description/EURO.ui, description/FSER.ui, description/Gnva.ui,
+  description/HSND.ui, description/MCSP.ui, description/McSn.ui,
+  description/MgSn.ui, description/PAUL.ui, description/PDEB.ui,
+  description/RFLX.ui, description/RSVE.ui, description/SCSI.ui,
+  description/SSND.ui, description/TIME.ui, description/Tmon.ui,
+  description/Typ1.ui, description/UFSL.ui, description/UsNm.ui,
+  description/WRAP.ui, description/XSDD.ui, description/_FSR.ui,
+  description/ck01.ui, description/nTOS.ui:
+
+  More Cookies and XBRA
+
+2006-12-15 Friday 18:08  Gerhard Stoll
+
+  * xbios/sound/soundcmd.ui:
+
+  Add info about mode 7
+
+2006-11-19 Sunday 09:53  Gerhard Stoll
+
+  * anhang/anhang/tos_vers.u:
+
+  Add more TOS versions
+
+2006-11-18 Saturday 19:45  Gerhard Stoll
+
+  * bios/cookie/list.ui:
+
+  VDLY is a cookie
+
+2006-11-04 Saturday 09:36  Gerhard Stoll
+
+  * gemdos/system/sconfig.ui:
+
+  Small translation
+
+2006-11-04 Saturday 09:33  Gerhard Stoll
+
+  * xbios/bildscrm/bildscrm.u:
+
+  Small correcting
+
+2006-11-04 Saturday 09:32  Gerhard Stoll
+
+  * bios/cookie/: cookie.u, list.ui, description/KAOS.ui:
+
+  Add KAOS cookie
+
+
+

1.3.6 Version 4.96

+
+2006-10-21 Saturday 13:30  Gerhard Stoll
+
+  * bios/cookie/: list.ui, description/EdDI.ui:
+
+  More info about EdDI
+
+2006-10-21 Saturday 13:30  Gerhard Stoll
+
+  * bios/sys_var.u:
+
+  More info from memcntrl
+
+2006-09-14 Thursday 14:54  Gerhard Stoll
+
+  * gem/aes/shel_/shel_write.ui, gem/aes/structures/sheltail.ui,
+  magic/magic.u, magic/magicmac.u, magic/shutdown/shutdown.u,
+  magic/shutdown/shutdown_de.ui, magic/shutdown/shutdown_en.ui:
+
+  Translate a little bit
+
+2006-09-07 Thursday 16:24  Gerhard Stoll
+
+  * bios/cookie/: cookie.u, list.ui:
+
+  Cookie DCSD, fVDI and VDI, CKBD is also a cookie
+
+2006-09-07 Thursday 16:24  Gerhard Stoll
+
+  * bios/cookie/description/: DCSD.ui, VDIp.ui, fVDI.ui:
+
+  Cookie DCSD, fVDI and VDI
+
+2006-08-27 Sunday 08:35  Gerhard Stoll
+
+  * anhang/anhang/tos_vers.u:
+
+  Mistake in UDO syntax
+
+2006-08-18 Friday 16:01  Gerhard Stoll
+
+  * bios/cookie/description/_MCH.ui:
+
+  Mistake in UDO syntax
+
+2006-08-12 Saturday 19:25  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/messages.u:
+
+  Messages from MultiGEM2
+
+2006-08-12 Saturday 19:24  Gerhard Stoll
+
+  * gemdos/gemdos_f.u, gem/aes/aes_f.u:
+
+  Function from MultiGEM2
+
+2006-08-08 Tuesday 17:11  Gerhard Stoll
+
+  * gem/aes/: aes_f.u, appl_/appl_.u, appl_/appl_search.ui,
+  appl_/x_appl_flags.ui, appl_/x_appl_font.ui, appl_/x_appl_sleep.ui,
+  appl_/x_appl_term.ui, evnt_/evnt_multi.ui, form_/form_alert.ui,
+  form_/form_dial.ui, form_/form_error.ui, graf_/graf_mouse.ui,
+  graf_/graf_slidebox.ui, rsrc_/rsrc_load.ui, shel_/shel_write.ui,
+  wind_/wind_get.ui, wind_/wind_set.ui:
+
+  x_appl_flags, x_appl_font, x_appl_sleep, x_appl_term and other infos form Geneva
+
+2006-08-08 Tuesday 15:54  Gerhard Stoll
+
+  * bios/cookie/list.ui:
+
+  AHVR is also a cookie
+
+2006-08-08 Tuesday 15:50  Gerhard Stoll
+
+  * gemdos/structures/DOSVARS.ui, gem/aes/rsrc_/rsrc_rcfix.ui:
+
+  Change the look of the text
+
+2006-08-08 Tuesday 15:50  Gerhard Stoll
+
+  * gem/vdi/control/v_savecache.ui:
+
+  Correcting the binding
+
+2006-08-07 Monday 18:08  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/messages.u:
+
+  Messages from Interface
+
+2006-08-06 Sunday 17:14  Gerhard Stoll
+
+  * gem/aes/structures/: rshdr.ui, rsxhdr.ui, structures.u,
+  tedinfo.ui:
+
+  Add extend resource header
+
+2006-08-06 Sunday 17:13  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/: evnts_de.ui, evnts_en.ui, geneva.ui,
+  messages.u:
+
+  Add Messages from Geneva
+
+2006-08-06 Sunday 17:12  Gerhard Stoll
+
+  * gem/aes/appl_/appl_read.ui:
+
+  Add link to appl_getinfo
+
+2006-08-06 Sunday 17:12  Gerhard Stoll
+
+  * gem/aes/aes.u, gem/aes/aes_en.u, gem/aes/evnt_/evnt_mesag.ui,
+  gem/aes/menu_/menu_attach.ui, bios/cookie/description/_MCH.ui:
+
+  Change the look of the text
+
+2006-08-06 Sunday 17:11  Gerhard Stoll
+
+  * bios/cookie/list.ui:
+
+  BLOW used as cookie and XBRA
+
+2006-06-19 Monday 20:45  Gerhard Stoll
+
+  * bios/cookie/: cookie.u, list.ui, description/LEmu.ui,
+  description/LMus.ui, description/Lace.ui, description/MgSn.ui:
+
+  Cookie MgSn, Lace, LEmu and LMus add
+
+2006-06-19 Monday 20:43  Gerhard Stoll
+
+  * anhang/typedefs.u:
+
+  Adress from p_run for TOS < 1.02 (OSHEADER)
+
+2006-06-19 Monday 20:43  Gerhard Stoll
+
+  * protokol/vscreen.u:
+
+  Small translation
+
+2006-06-16 Friday 14:40  Gerhard Stoll
+
+  * anhang/typedefs.u:
+
+  Detecting from EmuTOS (OSHEADER)
+
+2006-06-12 Monday 09:55  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/messages.u:
+
+  Messages from EB DUMP
+
+2006-06-11 Sunday 09:47  Gerhard Stoll
+
+  * anhang/: changes/04_96.ui, neu.u:
+
+  Start with version 4.96
+
+2006-06-11 Sunday 09:38  Gerhard Stoll
+
+  * config.u, anhang/changes/04_95.ui:
+
+  Make Release 4.95
+
+2006-06-11 Sunday 09:36  Gerhard Stoll
+
+  * anhang/hilfe.u:
+
+  Change email
+
+2006-06-11 Sunday 09:36  Gerhard Stoll
+
+  * bilder/gif/email.gif:
+
+  Email as graphic
+
+
+

1.3.7 Version 4.95

+
+2006-06-09 Friday 18:30  Gerhard Stoll
+
+  * bios/cookie/description/MaTC.ui:
+
+  Add structure
+
+2006-06-05 Monday 10:45  Gerhard Stoll
+
+  * bios/cookie/list.ui:
+
+  TK40 used for cookie and XBRA
+
+2006-06-03 Saturday 15:35  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/messages.u:
+
+  Message from XaAESnap
+
+2006-06-02 Friday 16:51  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/messages.u:
+
+  Messages from Qdialer (STiK)
+
+2006-06-02 Friday 16:51  Gerhard Stoll
+
+  * xbios/xbios_f.u:
+
+  Add XBIOS function from MATRIX grahpic cards
+
+2006-06-02 Friday 16:50  Gerhard Stoll
+
+  * bios/cookie/description/_NET.ui:
+
+  Add structure netinfo
+
+2006-05-27 Saturday 07:15  Gerhard Stoll
+
+  * config.u, gemdos/structures/cdrom_msf.ui,
+  gemdos/structures/cdrom_read.ui,
+  gemdos/structures/cdrom_subchnl.ui, gemdos/structures/cdrom_ti.ui,
+  gemdos/structures/cdrom_tocentry.ui, xbios/laufwerk/metainit.ui,
+  gemdos/structures/cdrom.ui, gemdos/structures/cdrom_audioctrl.ui,
+  gemdos/structures/cdrom_mcn.ui, gemdos/structures/cdrom_tisrc.ui,
+  gemdos/structures/cdrom_tochdr.ui, xbios/laufwerk/metaopen.ui,
+  xbios/structures/CD_DISC_INFO.ui, xbios/structures/META_INFO_1.ui,
+  xbios/structures/META_INFO_2.ui:
+
+  Translation from some MetaDOS structures
+
+2006-05-25 Thursday 17:03  Gerhard Stoll
+
+  * anhang/typedefs.u:
+
+  Remove some structures to an other place
+
+2006-05-25 Thursday 17:02  Gerhard Stoll
+
+  * gemdos/: gemdos.u, struktur.ui, structures/DISKINFO.ui,
+  structures/DOSTIME.ui, structures/DOSVARS.ui, structures/DTA.ui,
+  structures/FILEPTR.ui, structures/LINE.ui, structures/PD.ui,
+  structures/XATTR.ui, structures/cd_ad.ui, structures/cdrom.ui,
+  structures/cdrom_audioctrl.ui, structures/cdrom_mcn.ui,
+  structures/cdrom_msf.ui, structures/cdrom_read.ui,
+  structures/cdrom_subchnl.ui, structures/cdrom_ti.ui,
+  structures/cdrom_tisrc.ui, structures/cdrom_tocentry.ui,
+  structures/cdrom_tochdr.ui, structures/cdrom_volctrl.ui,
+  structures/fcookie.ui, structures/flock.ui, structures/ltchars.ui,
+  structures/mutimbuf.ui, structures/ploadinfo.ui,
+  structures/sgttyb.ui, structures/sigaction.ui,
+  structures/structures.u, structures/tchars.ui,
+  structures/timeval.ui, structures/timezone.ui, structures/tty.ui,
+  structures/winsize.ui, structures/xkey.ui:
+
+  New structures dircetory and some translations
+
+2006-05-23 Tuesday 19:49  Gerhard Stoll
+
+  * config.u, e_bios.u, tos_hyp.u, anhang/typedefs.u,
+  bilder/farbe/bubblegem.img, bilder/farbe/pipeline.img,
+  bilder/farbe/sspicon_.img, bilder/gif/aligment.gif,
+  bilder/gif/bubblegem.gif, bilder/gif/cl_width.gif,
+  bilder/gif/disk.gif, bilder/gif/drv_u.gif, bilder/gif/drv_udev.gif,
+  bilder/gif/drvuproc.gif, bilder/gif/extent.gif,
+  bilder/gif/f_select.gif, bilder/gif/fenster.gif,
+  bilder/gif/filesys.gif, bilder/gif/fontinfo.gif,
+  bilder/gif/frage.gif, bilder/gif/gdos_ahn.gif,
+  bilder/gif/img2034.gif, bilder/gif/img2035.gif,
+  bilder/gif/img2036.gif, bilder/gif/img2037.gif,
+  bilder/gif/img2038.gif, bilder/gif/img2039.gif,
+  bilder/gif/img2040.gif, bilder/gif/img2041.gif,
+  bilder/gif/img2042.gif, bilder/gif/img2043.gif,
+  bilder/gif/img2044.gif, bilder/gif/img2045.gif,
+  bilder/gif/info.gif, bilder/gif/koords.gif, bilder/gif/linien.gif,
+  bilder/gif/marker.gif, bilder/gif/meta_3.gif,
+  bilder/gif/metafile.gif, bilder/gif/muster.gif,
+  bilder/gif/pipeline.gif, bilder/gif/raster.gif,
+  bilder/gif/rufen.gif, bilder/gif/sspicon_.gif, bilder/gif/stop.gif,
+  bilder/gif/taskman.gif, bilder/gif/tpa.gif, bilder/gif/wr_modi.gif,
+  bilder/gif/xcontrol.gif, bilder/mono/bubblegem.img,
+  bilder/mono/pipeline.img, bilder/mono/sspicon_.img,
+  bios/bios_en.ui, bios/sys_var.u, bios/cookie/cookie_en.ui,
+  bios/cookie/description/CHTW.ui, bios/cookie/description/MagX.ui,
+  bios/cookie/description/_MCH.ui, bios/function/bconin.u,
+  bios/function/bconout.u, bios/function/bconstat.u,
+  bios/function/bcostat.u, bios/function/drvmap.u,
+  bios/function/getbpb.u, bios/function/getmpb.u,
+  bios/function/kbshift.u, bios/function/mediach.u,
+  bios/function/rwabs.u, bios/function/setexc.u,
+  bios/function/tickcal.u, emulator.en/stem.u, gem/cpxdoku.u,
+  gem/aes/aes.u, gem/aes/aes_en.u, gem/aes/toolbar.ui,
+  gem/aes/appl_/appl_bvset.ui, gem/aes/appl_/appl_getinfo.ui,
+  gem/aes/appl_/appl_options.ui, gem/aes/evnt_/messages/evnts_de.ui,
+  gem/aes/evnt_/messages/evnts_en.ui, gem/aes/menu_/menu_istart.ui,
+  gem/aes/structures/media_type.ui, gem/aes/structures/object.ui,
+  gem/aes/structures/prn_settings.ui, gem/aes/structures/prn_tray.ui,
+  gem/aes/structures/scanx.ui, gem/aes/wind_/components.ui,
+  gem/aes/wind_/wind_get.ui, gem/aes/wind_/wind_set.ui,
+  gem/guidelns/img2034.gif, gem/guidelns/img2035.gif,
+  gem/guidelns/img2036.gif, gem/guidelns/img2037.gif,
+  gem/guidelns/img2038.gif, gem/guidelns/img2039.gif,
+  gem/guidelns/img2040.gif, gem/guidelns/img2041.gif,
+  gem/guidelns/img2042.gif, gem/guidelns/img2043.gif,
+  gem/guidelns/img2044.gif, gem/guidelns/img2045.gif,
+  gem/guidelns/style.u, gem/guidelns/style_en.u, gem/vdi/vdi.u,
+  gem/vdi/vdi_en.u, gem/vdi/attribut/fill/filltypes.ui,
+  gem/vdi/control/v_resize_bm.ui, gem/vdi/escape/camera/vqp_films.ui,
+  gem/vdi/escape/camera/vsc_expose.ui, gem/vdi/input/vrq_valuator.ui,
+  gem/vdi/inquire/vq_ext_devinfo.ui, gem/vdi/inquire/vq_extnd.ui,
+  gem/vdi/inquire/vqf_attributes.ui, gemdos/filesys.u,
+  gemdos/gemdos.u, gemdos/struktur.ui, gemdos/datetime/datetime.u,
+  gemdos/dir/dcreate.ui, gemdos/dir/ddelete.ui, gemdos/dir/dfree.ui,
+  gemdos/dir/dgetdrv.ui, gemdos/dir/dgetpath.ui,
+  gemdos/dir/dsetdrv.ui, gemdos/dir/dsetpath.ui,
+  gemdos/file/fattrib.ui, gemdos/file/fclose.ui,
+  gemdos/file/fcntl.ui, gemdos/file/fcreate.ui,
+  gemdos/file/fdatime.ui, gemdos/file/fdelete.ui,
+  gemdos/file/fdup.ui, gemdos/file/fforce.ui, gemdos/file/fgetdta.ui,
+  gemdos/file/flock.ui, gemdos/file/fopen.ui, gemdos/file/fread.ui,
+  gemdos/file/frename.ui, gemdos/file/fseek.ui,
+  gemdos/file/fsetdta.ui, gemdos/file/fsfirst.ui,
+  gemdos/file/fsnext.ui, gemdos/file/fwrite.ui,
+  gemdos/prozess/pexec.ui, gemdos/system/ssystem.ui,
+  gemdos/system/system.u, magic/magicpc.u, magic/xfs.u,
+  protokol/font.u, protokol/ltlproto.u, protokol/view.u,
+  protokol/BubbleGEM/bubble_de.ui, protokol/BubbleGEM/bubble_en.ui,
+  protokol/BubbleGEM/img20.img, protokol/ssp/pipeline.gif,
+  protokol/ssp/pipeline.img, protokol/ssp/ssp.u,
+  protokol/ssp/sspicon_.gif, protokol/ssp/sspicon_.img,
+  xbios/bildscrm/bildscrm.u, xbios/bildscrm/cursconf.ui,
+  xbios/bildscrm/egetpale.ui, xbios/bildscrm/egetshif.ui,
+  xbios/bildscrm/esetbank.ui, xbios/bildscrm/esetcolo.ui,
+  xbios/bildscrm/esetgray.ui, xbios/bildscrm/esetpale.ui,
+  xbios/bildscrm/esetshif.ui, xbios/bildscrm/esetsmea.ui,
+  xbios/bildscrm/getrez.ui, xbios/bildscrm/initmous.ui,
+  xbios/bildscrm/logbase.ui, xbios/bildscrm/mon_type.ui,
+  xbios/bildscrm/physbase.ui, xbios/bildscrm/setcolor.ui,
+  xbios/bildscrm/setpalet.ui, xbios/bildscrm/setscree.ui,
+  xbios/bildscrm/vgetrgb.ui, xbios/bildscrm/vgetsize.ui,
+  xbios/bildscrm/vsetmask.ui, xbios/bildscrm/vsetrgb.ui,
+  xbios/bildscrm/vsetscre.ui, xbios/bildscrm/vsetsync.ui,
+  xbios/bildscrm/vsync.ui, xbios/centscrn/centscrn.u,
+  xbios/ct60/rcortemp.ui, xbios/datetime/datetime.u,
+  xbios/datetime/datetime.ui, xbios/datetime/gettime.ui,
+  xbios/datetime/nvmacces.ui, xbios/datetime/settime.ui,
+  xbios/datetime/xbtimer.ui, xbios/drucker/drucker.u,
+  xbios/drucker/prtblk.ui, xbios/drucker/scrdmp.ui,
+  xbios/drucker/setprt.ui, xbios/interrpt/interrpt.u,
+  xbios/interrpt/jdisint.ui, xbios/interrpt/jenabint.ui,
+  xbios/laufwerk/flopfmt.ui, xbios/laufwerk/floprd.ui,
+  xbios/laufwerk/flopver.ui, xbios/laufwerk/flopwr.ui,
+  xbios/laufwerk/laufwerk.u, xbios/laufwerk/protobt.ui,
+  xbios/sound/buffoper.ui, xbios/sound/buffptr.ui,
+  xbios/sound/devconne.ui, xbios/sound/gpio.ui,
+  xbios/sound/locksnd.ui, xbios/sound/setbuffe.ui,
+  xbios/sound/setinter.ui, xbios/sound/setmode.ui,
+  xbios/sound/setmontr.ui, xbios/sound/sndstatu.ui,
+  xbios/sound/sound.u, xbios/sound/soundcmd.ui,
+  xbios/sound/unlocksn.ui, xbios/sound/waveplay.ui,
+  xbios/spezial/spezial.u, xbios/tastatur/tastatur.u:
+
+  - Change for a HTML version
+  - Binding for GFA-Basic
+  - Change Status and download from Chatwin and STJ-Oberon-2
+  - MagiC PC DLL-ID from Draconis Windows Sockets
+
+2006-05-14 Sunday 14:29  Gerhard Stoll
+
+  * xbios/laufwerk/metaopen.ui:
+
+  Missing syntay
+
+2006-05-14 Sunday 14:29  Gerhard Stoll
+
+  * xbios/laufwerk/floprate.ui:
+
+  Undocumented systemvariable for the seek rate
+
+2006-05-11 Thursday 17:36  Gerhard Stoll
+
+  * magic/: magic.u, magicmac.u:
+
+  Change links for new cookie structure
+
+2006-05-11 Thursday 17:36  Gerhard Stoll
+
+  * bios/: sys_vec.u, sys_vec_de.ui, sys_vec_en.ui, bios_en.ui:
+
+  some translations
+
+2006-05-11 Thursday 17:31  Gerhard Stoll
+
+  * bios/: bios.u, bios_f.u, cookie.u, sys_var.u, vt52.u, xbra.u,
+  cookie/cookie.u, cookie/cookie_de.ui, cookie/cookie_en.ui,
+  cookie/example_de.ui, cookie/example_en.ui, cookie/list.ui,
+  cookie/description/3DMN.ui, cookie/description/3RDB.ui,
+  cookie/description/60Hz.ui, cookie/description/8_8.ui,
+  cookie/description/ACCS.ui, cookie/description/AFnt.ui,
+  cookie/description/AHVR.ui, cookie/description/ALHP.ui,
+  cookie/description/ALIC.ui, cookie/description/AMC1.ui,
+  cookie/description/AMC2.ui, cookie/description/ANSe.ui,
+  cookie/description/ASum.ui, cookie/description/AVOJ.ui,
+  cookie/description/AVmw.ui, cookie/description/AgK0.ui,
+  cookie/description/AmAN.ui, cookie/description/BASH.ui,
+  cookie/description/BBD2.ui, cookie/description/BCKW.ui,
+  cookie/description/BGEM.ui, cookie/description/BGHD.ui,
+  cookie/description/BHLP.ui, cookie/description/BHdl.ui,
+  cookie/description/BLNK.ui, cookie/description/BLOW.ui,
+  cookie/description/BSIM.ui, cookie/description/BUG1.ui,
+  cookie/description/C24P.ui, cookie/description/CACH.ui,
+  cookie/description/CALD.ui, cookie/description/CASE.ui,
+  cookie/description/CB2K.ui, cookie/description/CBDF.ui,
+  cookie/description/CBHD.ui, cookie/description/CBHY.ui,
+  cookie/description/CBIT.ui, cookie/description/CCDA.ui,
+  cookie/description/CDOT.ui, cookie/description/CFIX.ui,
+  cookie/description/CFsl.ui, cookie/description/CHAM.ui,
+  cookie/description/CHN1.ui, cookie/description/CHNG.ui,
+  cookie/description/CJar.ui, cookie/description/CKBD.ui,
+  cookie/description/CKJR.ui, cookie/description/CLCK.ui,
+  cookie/description/CLK1.ui, cookie/description/CLOK.ui,
+  cookie/description/CM16.ui, cookie/description/CNTS.ui,
+  cookie/description/CPSL.ui, cookie/description/CRAC.ui,
+  cookie/description/CRIT.ui, cookie/description/CSMD.ui,
+  cookie/description/CT60.ui, cookie/description/CTCH.ui,
+  cookie/description/CTSF.ui, cookie/description/CtCp.ui,
+  cookie/description/DATE.ui, cookie/description/DATL.ui,
+  cookie/description/DAWN.ui, cookie/description/DBFX.ui,
+  cookie/description/DCF7.ui, cookie/description/DECD.ui,
+  cookie/description/DEPI.ui, cookie/description/DHST.ui,
+  cookie/description/DIG2.ui, cookie/description/DJBX.ui,
+  cookie/description/DKEY.ui, cookie/description/DNTR.ui,
+  cookie/description/DPAT.ui, cookie/description/DPRS.ui,
+  cookie/description/DRIV.ui, cookie/description/DRRH.ui,
+  cookie/description/DSSO.ui, cookie/description/DYJA.ui,
+  cookie/description/DYJD.ui, cookie/description/A2sv.ui,
+  cookie/description/ALRM.ui, cookie/description/APGM.ui,
+  cookie/description/ARTS.ui, cookie/description/DYNL.ui,
+  cookie/description/DYwl.ui, cookie/description/Dsel.ui,
+  cookie/description/EBPO.ui, cookie/description/EDFX.ui,
+  cookie/description/EGON.ui, cookie/description/EMNP.ui,
+  cookie/description/ENV$.ui, cookie/description/ENVN.ui,
+  cookie/description/ENVR.ui, cookie/description/EPro.ui,
+  cookie/description/ETM.ui, cookie/description/EURO.ui,
+  cookie/description/EXRA.ui, cookie/description/EXTD.ui,
+  cookie/description/EdDI.ui, cookie/description/FALT.ui,
+  cookie/description/FAXR.ui, cookie/description/FHFX.ui,
+  cookie/description/FIX2.ui, cookie/description/FLTP.ui,
+  cookie/description/FLXD.ui, cookie/description/FOse_.ui,
+  cookie/description/FSEL.ui, cookie/description/FSER.ui,
+  cookie/description/FSMC.ui, cookie/description/FSmp.ui,
+  cookie/description/F_3D.ui, cookie/description/FaKE.ui,
+  cookie/description/Fose.ui, cookie/description/FrmD.ui,
+  cookie/description/GABI.ui, cookie/description/GBel.ui,
+  cookie/description/GCOM.ui, cookie/description/GDEV.ui,
+  cookie/description/GEHC.ui, cookie/description/GEHD.ui,
+  cookie/description/GEMB.ui, cookie/description/GENV.ui,
+  cookie/description/GI30.ui, cookie/description/GIGA.ui,
+  cookie/description/GLAS.ui, cookie/description/GLBL.ui,
+  cookie/description/GMTC.ui, cookie/description/GNUC.ui,
+  cookie/description/GOBJ.ui, cookie/description/GOff.ui,
+  cookie/description/GSND.ui, cookie/description/GSXB.ui,
+  cookie/description/GULM.ui, cookie/description/Gfix.ui,
+  cookie/description/Gnva.ui, cookie/description/HABO.ui,
+  cookie/description/HAMM.ui, cookie/description/BIGS.ui,
+  cookie/description/BIOC.ui, cookie/description/CBCE.ui,
+  cookie/description/CHTW.ui, cookie/description/CISY.ui,
+  cookie/description/CJAR_.ui, cookie/description/COLO.ui,
+  cookie/description/CWCo.ui, cookie/description/CaTT.ui,
+  cookie/description/CatS.ui, cookie/description/HBFS.ui,
+  cookie/description/HDDR.ui, cookie/description/HDEX.ui,
+  cookie/description/HDEY.ui, cookie/description/HDJR.ui,
+  cookie/description/HDLD.ui, cookie/description/HDPR.ui,
+  cookie/description/HDRC.ui, cookie/description/HDST.ui,
+  cookie/description/HDSW.ui, cookie/description/HFIX.ui,
+  cookie/description/HIDS.ui, cookie/description/HMDU.ui,
+  cookie/description/HMOC.ui, cookie/description/HMRD.ui,
+  cookie/description/HMRS.ui, cookie/description/HPHC.ui,
+  cookie/description/HPLJ.ui, cookie/description/HSCD.ui,
+  cookie/description/HSND.ui, cookie/description/HWAM.ui,
+  cookie/description/HcP6.ui, cookie/description/IBMP.ui,
+  cookie/description/ICFS.ui, cookie/description/ICST.ui,
+  cookie/description/IDSK.ui, cookie/description/IMAC.ui,
+  cookie/description/IMNE.ui, cookie/description/INSJ.ui,
+  cookie/description/INXR.ui, cookie/description/IRSB.ui,
+  cookie/description/JAM1.ui, cookie/description/JB2G.ui,
+  cookie/description/JCLK.ui, cookie/description/JCNB.ui,
+  cookie/description/JCNC.ui, cookie/description/JCNH.ui,
+  cookie/description/JCNT.ui, cookie/description/JFTP.ui,
+  cookie/description/JMLB.ui, cookie/description/JMLS.ui,
+  cookie/description/JSHD.ui, cookie/description/JUST.ui,
+  cookie/description/J_Sc.ui, cookie/description/KEYT.ui,
+  cookie/description/KGTF.ui, cookie/description/KIDI.ui,
+  cookie/description/KREG.ui, cookie/description/KbEv.ui,
+  cookie/description/KyMp.ui, cookie/description/LACY.ui,
+  cookie/description/LALA.ui, cookie/description/LASB.ui,
+  cookie/description/LAWC.ui, cookie/description/DCdd.ui,
+  cookie/description/DYJT.ui, cookie/description/EADC.ui,
+  cookie/description/LDGE.ui, cookie/description/LEDP.ui,
+  cookie/description/LLCR.ui, cookie/description/LPJM.ui,
+  cookie/description/LTMF.ui, cookie/description/MADD.ui,
+  cookie/description/MADN.ui, cookie/description/MAGN.ui,
+  cookie/description/MBRD.ui, cookie/description/MCL_.ui,
+  cookie/description/MCSP.ui, cookie/description/MCWR.ui,
+  cookie/description/MDIA.ui, cookie/description/MDRK.ui,
+  cookie/description/MDSa.ui, cookie/description/MFAC.ui,
+  cookie/description/MFFM.ui, cookie/description/MFIX.ui,
+  cookie/description/MFNT.ui, cookie/description/MGEM.ui,
+  cookie/description/MID3.ui, cookie/description/MIMA.ui,
+  cookie/description/MIPS.ui, cookie/description/MJAF.ui,
+  cookie/description/MM2X.ui, cookie/description/MMAC.ui,
+  cookie/description/MMUT.ui, cookie/description/MM_2.ui,
+  cookie/description/MNAM.ui, cookie/description/MOAF.ui,
+  cookie/description/MOGR.ui, cookie/description/MPRO.ui,
+  cookie/description/MRAM.ui, cookie/description/MSPD.ui,
+  cookie/description/MSPO.ui, cookie/description/MTft.ui,
+  cookie/description/MUPF.ui, cookie/description/MWHL.ui,
+  cookie/description/MZTR.ui, cookie/description/MaTC.ui,
+  cookie/description/MagC.ui, cookie/description/MagX.ui,
+  cookie/description/MbAr.ui, cookie/description/McSn.ui,
+  cookie/description/MgMc.ui, cookie/description/MgMx.ui,
+  cookie/description/GMNI.ui, cookie/description/GSP1.ui,
+  cookie/description/MiNT.ui, cookie/description/MkJr.ui,
+  cookie/description/N203.ui, cookie/description/NBEL.ui,
+  cookie/description/NBLL.ui, cookie/description/NCLN.ui,
+  cookie/description/NERV.ui, cookie/description/NETS.ui,
+  cookie/description/NEXB.ui, cookie/description/NEXK.ui,
+  cookie/description/NFMT.ui, cookie/description/NFnt.ui,
+  cookie/description/NKCC.ui, cookie/description/NLdr.ui,
+  cookie/description/NMGE.ui, cookie/description/NO7P.ui,
+  cookie/description/NOR5.ui, cookie/description/NOVA.ui,
+  cookie/description/NSC1.ui, cookie/description/NTK4.ui,
+  cookie/description/NUL_.ui, cookie/description/NVDI.ui,
+  cookie/description/OBNL.ui, cookie/description/OFLS.ui,
+  cookie/description/OPMM.ui, cookie/description/OSBL.ui,
+  cookie/description/OSTT.ui, cookie/description/OTOS.ui,
+  cookie/description/OV24.ui, cookie/description/OVDJ.ui,
+  cookie/description/OVEP.ui, cookie/description/OVER.ui,
+  cookie/description/OVEX.ui, cookie/description/OVFS.ui,
+  cookie/description/OVIM.ui, cookie/description/OVLS.ui,
+  cookie/description/OVRD.ui, cookie/description/OVUT.ui,
+  cookie/description/OVWI.ui, cookie/description/PAMN.ui,
+  cookie/description/PBUG.ui, cookie/description/PCI_.ui,
+  cookie/description/PDEB.ui, cookie/description/PDOS.ui,
+  cookie/description/PDRZ.ui, cookie/description/PFIX.ui,
+  cookie/description/PKSH.ui, cookie/description/PMMU.ui,
+  cookie/description/POIS.ui, cookie/description/POWM.ui,
+  cookie/description/PRCS.ui, cookie/description/PRDS.ui,
+  cookie/description/PRMD.ui, cookie/description/PRN!.ui,
+  cookie/description/PRNß.ui, cookie/description/PRO5.ui,
+  cookie/description/PROB.ui, cookie/description/PROT.ui,
+  cookie/description/JINX.ui, cookie/description/KyWt.ui,
+  cookie/description/LOGB.ui, cookie/description/LPCD.ui,
+  cookie/description/LP_2.ui, cookie/description/LoSe.ui,
+  cookie/description/M16X.ui, cookie/description/M16s.ui,
+  cookie/description/MAST.ui, cookie/description/MKHC.ui,
+  cookie/description/PRTD.ui, cookie/description/PRTO.ui,
+  cookie/description/PRTR_.ui, cookie/description/PSND.ui,
+  cookie/description/PSSG.ui, cookie/description/PTOS.ui,
+  cookie/description/Pinp.ui, cookie/description/QIKM.ui,
+  cookie/description/QMAC.ui, cookie/description/QMCP.ui,
+  cookie/description/QST2.ui, cookie/description/QST3.ui,
+  cookie/description/QUAN.ui, cookie/description/RAIL.ui,
+  cookie/description/RESG.ui, cookie/description/RFLX.ui,
+  cookie/description/RFUS.ui, cookie/description/RGUS.ui,
+  cookie/description/RING.ui, cookie/description/ROT8.ui,
+  cookie/description/RREG.ui, cookie/description/RSLT.ui,
+  cookie/description/RSVE.ui, cookie/description/RSVF.ui,
+  cookie/description/RSpd.ui, cookie/description/RTKC.ui,
+  cookie/description/RTOB.ui, cookie/description/RWIN.ui,
+  cookie/description/RaSn.ui, cookie/description/SAM.ui,
+  cookie/description/SBKM.ui, cookie/description/SBTE.ui,
+  cookie/description/SBTS.ui, cookie/description/SCAH.ui,
+  cookie/description/SCKM.ui, cookie/description/SCPN.ui,
+  cookie/description/SCRD.ui, cookie/description/SCRN.ui,
+  cookie/description/SCRS.ui, cookie/description/SCRW.ui,
+  cookie/description/SCSI.ui, cookie/description/SCSV.ui,
+  cookie/description/SDCH.ui, cookie/description/SDES.ui,
+  cookie/description/SDWN.ui, cookie/description/SDsk.ui,
+  cookie/description/SELC.ui, cookie/description/SENV.ui,
+  cookie/description/SFA^.ui, cookie/description/SFIX.ui,
+  cookie/description/SFMN.ui, cookie/description/SKEY.ui,
+  cookie/description/SLCT.ui, cookie/description/SLIP.ui,
+  cookie/description/SLif.ui, cookie/description/SM00.ui,
+  cookie/description/SM01.ui, cookie/description/SM02.ui,
+  cookie/description/SMAL.ui, cookie/description/SMAU.ui,
+  cookie/description/SMTT.ui, cookie/description/SMon.ui,
+  cookie/description/SNAP.ui, cookie/description/SOFS.ui,
+  cookie/description/SOSW.ui, cookie/description/SPCK.ui,
+  cookie/description/SPEE.ui, cookie/description/SPEK.ui,
+  cookie/description/SPEX.ui, cookie/description/SPRG.ui,
+  cookie/description/SSND.ui, cookie/description/ST-C.ui,
+  cookie/description/ST17.ui, cookie/description/STAT.ui,
+  cookie/description/STEM.ui, cookie/description/STEW.ui,
+  cookie/description/STFA.ui, cookie/description/STMS.ui,
+  cookie/description/STRX.ui, cookie/description/STiK.ui,
+  cookie/description/SVAR.ui, cookie/description/SVGA.ui,
+  cookie/description/SWAP.ui, cookie/description/SYMB.ui,
+  cookie/description/SYNL.ui, cookie/description/SYNT.ui,
+  cookie/description/SYST.ui, cookie/description/SZ_M.ui,
+  cookie/description/S_DR.ui, cookie/description/ShLk.ui,
+  cookie/description/SpcE.ui, cookie/description/Spol.ui,
+  cookie/description/StIc.ui, cookie/description/SwTm.ui,
+  cookie/description/SysE.ui, cookie/description/Syso.ui,
+  cookie/description/T206.ui, cookie/description/T2GM.ui,
+  cookie/description/TAPE.ui, cookie/description/TASS.ui,
+  cookie/description/TCFS.ui, cookie/description/TCRB.ui,
+  cookie/description/TFIX.ui, cookie/description/THNX.ui,
+  cookie/description/THRM.ui, cookie/description/THST.ui,
+  cookie/description/TIM3.ui, cookie/description/TIM5.ui,
+  cookie/description/TIME.ui, cookie/description/TK40.ui,
+  cookie/description/TL3D.ui, cookie/description/TLWV.ui,
+  cookie/description/TOUC.ui, cookie/description/TOpW.ui,
+  cookie/description/TPGM.ui, cookie/description/TPat.ui,
+  cookie/description/TRAK.ui, cookie/description/TRUE.ui,
+  cookie/description/TSEN.ui, cookie/description/TSWP.ui,
+  cookie/description/TTTF.ui, cookie/description/TUBS.ui,
+  cookie/description/TWFS.ui, cookie/description/Tenv.ui,
+  cookie/description/Tmon.ui, cookie/description/TraP.ui,
+  cookie/description/Trpp.ui, cookie/description/Typ1.ui,
+  cookie/description/UFSL.ui, cookie/description/UIS3.ui,
+  cookie/description/UKB1.ui, cookie/description/UKB3.ui,
+  cookie/description/USCK.ui, cookie/description/USHD.ui,
+  cookie/description/USPK.ui, cookie/description/USRS.ui,
+  cookie/description/UTRK.ui, cookie/description/VBLF.ui,
+  cookie/description/VDLY.ui, cookie/description/VECS.ui,
+  cookie/description/VFIX.ui, cookie/description/VFNT.ui,
+  cookie/description/VGAS.ui, cookie/description/VI-2.ui,
+  cookie/description/VIRA.ui, cookie/description/VMEM.ui,
+  cookie/description/VPCH.ui, cookie/description/VRAM.ui,
+  cookie/description/VREP.ui, cookie/description/VSCR.ui,
+  cookie/description/VSTM.ui, cookie/description/VSco.ui,
+  cookie/description/VTFX.ui, cookie/description/VXCK.ui,
+  cookie/description/VeiL.ui, cookie/description/View.ui,
+  cookie/description/WARP.ui, cookie/description/WBrd.ui,
+  cookie/description/WDOG.ui, cookie/description/WEGA.ui,
+  cookie/description/WFSL.ui, cookie/description/WICO.ui,
+  cookie/description/WINX.ui, cookie/description/WINZ.ui,
+  cookie/description/WPRO.ui, cookie/description/WRAP.ui,
+  cookie/description/WaHW.ui, cookie/description/WaSA.ui,
+  cookie/description/WfNa.ui, cookie/description/WinK.ui,
+  cookie/description/XALT.ui, cookie/description/XBTN.ui,
+  cookie/description/XDsk.ui, cookie/description/XFRB.ui,
+  cookie/description/XFS1.ui, cookie/description/XHDI.ui,
+  cookie/description/XKBD.ui, cookie/description/XMMU.ui,
+  cookie/description/XMuz.ui, cookie/description/XPCI.ui,
+  cookie/description/XSND.ui, cookie/description/XSSI.ui,
+  cookie/description/XTOS.ui, cookie/description/XWin.ui,
+  cookie/description/_AFM.ui, cookie/description/_AKP.ui,
+  cookie/description/_CPU.ui, cookie/description/_DOS.ui,
+  cookie/description/_FDC.ui, cookie/description/_FLK.ui,
+  cookie/description/_FPU.ui, cookie/description/_FRB.ui,
+  cookie/description/_FSC.ui, cookie/description/_FSR.ui,
+  cookie/description/_IDT.ui, cookie/description/_INF.ui,
+  cookie/description/_INU.ui, cookie/description/_ISO.ui,
+  cookie/description/_JPD.ui, cookie/description/_MCH.ui,
+  cookie/description/_MET.ui, cookie/description/_MIL.ui,
+  cookie/description/_NET.ui, cookie/description/_OOL.ui,
+  cookie/description/_PCI.ui, cookie/description/_PKT.ui,
+  cookie/description/_PWR.ui, cookie/description/_SLM.ui,
+  cookie/description/_SND.ui, cookie/description/_SWI.ui,
+  cookie/description/_T2W.ui, cookie/description/_T30.ui,
+  cookie/description/_VDI.ui, cookie/description/_VDO.ui,
+  cookie/description/__NF.ui, cookie/description/asGT.ui,
+  cookie/description/cVDI.ui, cookie/description/cdMC.ui,
+  cookie/description/fMSX.ui, cookie/description/gk5_.ui,
+  cookie/description/gkCO.ui, cookie/description/hFRB.ui,
+  cookie/description/hade.ui, cookie/description/iPRN.ui,
+  cookie/description/iTMA.ui, cookie/description/lanc.ui,
+  cookie/description/macc.ui, cookie/description/mstx.ui,
+  cookie/description/nAES.ui, cookie/description/nTAS.ui,
+  cookie/description/ne2k.ui, cookie/description/noCF.ui,
+  cookie/description/oVDI.ui, cookie/description/prtr.ui,
+  cookie/description/shlp.ui, cookie/description/spMR.ui,
+  cookie/description/strk.ui, cookie/description/un_x.ui,
+  cookie/description/vT52.ui, cookie/description/wdlg.ui,
+  cookie/description/xFSL.ui, cookie/description/xNet.ui,
+  cookie/description/xRmt.ui, cookie/description/xUFC.ui,
+  cookie/description/zCAC.ui, cookie/description/zDCF.ui,
+  function/kbshift.u:
+
+  Cookie- and XBRA-List
+
+2006-05-11 Thursday 17:24  Gerhard Stoll
+
+  * bios/structures/: md.ui, structures.u:
+
+  Add structure MD
+
+2006-05-07 Sunday 09:51  Gerhard Stoll
+
+  * gem/aes/wind_/wind_get_set.ui:
+
+  WF_USER_POINTER, WF_WIND_ATTACH and WF_WIND_ATTACH add to the list
+
+2006-04-18 Tuesday 22:38  Gerhard Stoll
+
+  * gem/aes/appl_/appl_control.ui:
+
+  Internal modes from OAESis and XaAES
+
+2006-04-16 Sunday 18:10  Gerhard Stoll
+
+  * xbios/structures/bconmap.ui:
+
+  Undocument element
+
+2006-04-10 Monday 12:24  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/messages.u:
+
+  Messages from Geneva add
+
+2006-04-04 Tuesday 16:04  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/messages.u:
+
+  Messages from MyPDF add
+
+2006-04-03 Monday 06:07  Gerhard Stoll
+
+  * gem/aes/shel_/shel_write.ui:
+
+  shel_write (9) NM_INHIBIT_HIDE
+
+2006-04-03 Monday 06:06  Gerhard Stoll
+
+  * gem/aes/aes_f.u:
+
+  Add objc_data to the list
+
+2006-04-03 Monday 06:06  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/messages.u:
+
+  Add WM_WHEEL to the list
+
+2006-04-03 Monday 06:06  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/: evnts_de.ui, evnts_en.ui:
+
+  Fixed docu from SM_M_SPECIAL
+
+2006-04-03 Monday 06:05  Gerhard Stoll
+
+  * gem/aes/structures/: menu.ui, mn_set.ui:
+
+  Translate
+
+2006-03-12 Sunday 08:33  Gerhard Stoll
+
+  * gem/aes/wind_/wind_new.ui:
+
+  Available since AES version 1.4
+
+2006-03-12 Sunday 08:33  Gerhard Stoll
+
+  * protokol/dd.u:
+
+  Add some labels
+
+
+

1.3.8 Version 4.94

+
2006-02-25 Saturday 09:45  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/messages.u:
+
+  Labels for the messages from EnhancedGEM
+
+2006-02-19 Sunday 09:04  Gerhard Stoll
+
+  * bios/function/kbshift.u:
+
+  Adress from pkbshift in TOS 1.00
+
+2006-02-09 Thursday 17:00  Gerhard Stoll
+
+  * linea/linea.u:
+
+  Same text correcting
+
+2006-02-09 Thursday 16:59  Gerhard Stoll
+
+  * xbios/: pci_bios/error.ui, pci_bios/fast_read_config_byte.ui,
+  pci_bios/fast_read_config_longword.ui,
+  pci_bios/fast_read_config_word.ui, pci_bios/fpclassc.ui,
+  pci_bios/fpdevice.ui, pci_bios/hook_interrupt.ui,
+  pci_bios/pci_bios.u, pci_bios/read_config_byte.ui,
+  pci_bios/read_config_longword.ui, pci_bios/read_config_word.ui,
+  pci_bios/write_config_byte.ui, pci_bios/write_config_longword.ui,
+  pci_bios/write_config_word.ui, struktur.ui, xbios_f.u:
+
+  Some function from the PCI BIOS add
+
+2006-02-09 Thursday 16:24  Gerhard Stoll
+
+  * magic/threads/: exapmle.ui, threads.u, vdi.u:
+
+  some translations
+
+2006-02-08 Wednesday 18:01  Gerhard Stoll
+
+  * gem/vdi/vdi.u:
+
+  Add some NVDI and SpeedoGDOS version number, only as comment
+
+2006-02-08 Wednesday 18:00  Gerhard Stoll
+
+  * bios/cookie.u:
+
+  Add quality to FSMC structure
+
+2006-02-08 Wednesday 18:00  Gerhard Stoll
+
+  * gem/aes/form_/xfrm_popup.ui:
+
+  More info about some parameter
+
+2006-02-08 Wednesday 18:00  Gerhard Stoll
+
+  * magic/magicpc.u:
+
+  Add DLL_ID from MPCSTiK
+
+2006-01-26 Thursday 17:49  Gerhard Stoll
+
+  * gemdos/system/sconfig.ui:
+
+  Add new modes
+
+2006-01-26 Thursday 17:49  Gerhard Stoll
+
+  * gem/aes/form_/form_xdial.ui:
+
+  Correct binding
+
+2006-01-26 Thursday 17:49  Gerhard Stoll
+
+  * gem/aes/appl_/appl_getinfo.ui:
+
+  Interface resource file supported from MyAES
+
+2006-01-21 Saturday 15:42  Gerhard Stoll
+
+  * e_olga.u, e_protok.u, tos_hyp.u, protokol/font.u,
+  protokol/olga.u, protokol/olga/olga.u, protokol/olga/olga_de.ui,
+  protokol/olga/olga_en.ui:
+
+  Start with an english version from OLGA
+
+2006-01-08 Sunday 18:16  Gerhard Stoll
+
+  * gemdos/dir/: dir.u, dxopendir.ui:
+
+  New Gemdos function Dxopendir from Dir_Lwr
+
+2005-12-29 Thursday 16:46  Gerhard Stoll
+
+  * bios/bios.u, bios/bios_str.u, bios/structures/bpb.ui,
+  bios/structures/mpb.ui, bios/structures/pun_info.ui,
+  bios/structures/structures.u, xbios/structures/CD_DISC_INFO.ui,
+  xbios/structures/CD_TOC_ENTRY.ui, xbios/structures/DSPBLOCK.ui,
+  xbios/structures/IOREC.ui, xbios/structures/KBDVBASE.ui,
+  xbios/structures/KEYTAB.ui, xbios/structures/MAPTAB.ui,
+  xbios/structures/META_DRVINFO.ui, xbios/structures/META_INFO_1.ui,
+  xbios/structures/META_INFO_2.ui, xbios/structures/MOD_DESC.ui,
+  xbios/structures/MOUSE.ui, xbios/structures/OVERPATCH.ui,
+  xbios/structures/PBDEF.ui, xbios/structures/PMODE.ui,
+  xbios/structures/SCREEN.ui, xbios/structures/SCREENINFO.ui,
+  xbios/structures/SCREEN_OverScan.ui, xbios/structures/SCRMEMBLK.ui,
+  xbios/structures/VDO_MODE.ui, xbios/structures/VDO_PARAM.ui,
+  xbios/structures/VPOS.ui, xbios/structures/bconmap.ui,
+  xbios/structures/structures.u, xbios/xbios.u:
+
+  New structure
+
+2005-12-11 Sunday 14:56  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/evnts.ui:
+
+  English version
+
+2005-12-11 Sunday 14:52  Gerhard Stoll
+
+  * gem/aes/menu_/menu_unregister.ui:
+
+  Add Info about KAOS 1.4.2, thanks to Michael Schroeter
+
+2005-12-11 Sunday 14:51  Gerhard Stoll
+
+  * gem/aes/wind_/: wind_get.ui, wind_get_set.ui, wind_set.ui,
+  wind_xget.ui, wind_xset.ui:
+
+  WF_CALCF2W and WF_CALCW2F from XaAES
+
+2005-12-11 Sunday 14:45  Gerhard Stoll
+
+  * gem/aes/appl_/: appl_.u, appl_options.ui:
+
+  New function aes_options from XaAES, not finished
+
+2005-12-11 Sunday 14:45  Gerhard Stoll
+
+  * gem/aes/appl_/appl_getinfo.ui:
+
+  Add new modes (98, 99) from XaAES
+
+2005-12-11 Sunday 14:44  Gerhard Stoll
+
+  * gem/vdi/attribut/text/vst_error.ui:
+
+  Some error codes from SpeedoGDOS 5 add
+
+2005-12-08 Thursday 21:00  Gerhard Stoll
+
+  * gem/aes/xgrf_/: xgrf_2box.ui, xgrf_stepcalc.ui:
+
+  Add Info about KAOS 1.4.2, thanks to Michael Schroeter
+
+2005-12-08 Thursday 20:56  Gerhard Stoll
+
+  * gem/aes/appl_/appl_bvset.ui, gem/aes/appl_/appl_init.ui,
+  anhang/anhang/tos_vers.u, gemdos/system/sconfig.ui,
+  gemdos/struktur.ui, bios/sys_var.u,
+  gem/aes/evnt_/messages/evnts_de.ui,
+  gem/aes/evnt_/messages/evnts_en.ui,
+  gem/aes/evnt_/messages/messages.u, gem/aes/wind_/wind_get.ui,
+  gem/aes/wind_/wind_get_set.ui, gem/aes/wind_/wind_set.ui,
+  gem/aes/menu_/menu_click.ui,
+  gem/aes/scrp_/scrp_clear.ui,
+  gem/aes/shel_/shel_rdef.ui, gem/aes/shel_/shel_wdef.ui:
+
+  Add Info about KAOS 1.4.2, thanks to Michael Schroeter
+
+2005-12-08 Thursday 20:43  Gerhard Stoll
+
+  * gem/aes/appl_/appl_find.ui:
+
+  Special mode in KAOS and MagiC
+
+2005-12-08 Thursday 13:06  Gerhard Stoll
+
+  * gemdos/system/sconfig.ui:
+
+  Wrong description from bit 4
+
+2005-12-03 Saturday 10:53  Gerhard Stoll
+
+  * gem/aes/: aes.u, aes_en.u, aes_f.u, struktur.ui, toolbar.ui,
+  appl_/appl_getinfo.ui, fnts_/fnts_create.ui, form_/form_.u,
+  form_/form_popup.ui, fslx_/fslx_close.ui, fslx_/fslx_do.ui,
+  fslx_/fslx_evnt.ui, fslx_/fslx_getnxtfile.ui, fslx_/fslx_open.ui,
+  fslx_/fslx_set_flags.ui, lbox_/flags.ui, lbox_/lbox_create.ui,
+  pdlg_/pdlg_.u, pdlg_/pdlg_add_printers.ui,
+  pdlg_/pdlg_add_sub_dialogs.ui, pdlg_/pdlg_close.ui,
+  pdlg_/pdlg_create.ui, pdlg_/pdlg_delete.ui,
+  pdlg_/pdlg_dflt_settings.ui, pdlg_/pdlg_do.ui, pdlg_/pdlg_evnt.ui,
+  pdlg_/pdlg_free_settings.ui, pdlg_/pdlg_get_setsize.ui,
+  pdlg_/pdlg_new_settings.ui, pdlg_/pdlg_open.ui,
+  pdlg_/pdlg_remove_printers.ui, pdlg_/pdlg_remove_sub_dialogs.ui,
+  pdlg_/pdlg_save_default_settings.ui, pdlg_/pdlg_update.ui,
+  pdlg_/pdlg_use_settings.ui, pdlg_/pdlg_validate_settings.ui,
+  pdlg_/use.ui, shel_/shel_.u, structures/applrecord.ui,
+  structures/bitblk.ui, structures/cicon.ui, structures/ciconblk.ui,
+  structures/clrcat.ui, structures/dialog.ui,
+  structures/dither_mode.ui, structures/drv_entry.ui,
+  structures/drv_info.ui, structures/evnt.ui,
+  structures/fnt_dialog.ui, structures/fnts_item.ui,
+  structures/hndl_obj.ui, structures/iconblk.ui,
+  structures/lbox_item.ui, structures/list_box.ui,
+  structures/media_size.ui, structures/media_type.ui,
+  structures/menu.ui, structures/mform.ui, structures/mn_set.ui,
+  structures/object.ui, structures/parmblk.ui,
+  structures/pdlg_hndl.ui, structures/pdlg_init.ui,
+  structures/pdlg_reset.ui, structures/pdlg_sub.ui,
+  structures/popinfo.ui, structures/prn_dialog.ui,
+  structures/prn_entry.ui, structures/prn_mode.ui,
+  structures/prn_settings.ui, structures/prn_switch.ui,
+  structures/prn_tray.ui, structures/rshdr.ui, structures/scanx.ui,
+  structures/set_item.ui, structures/sheltail.ui,
+  structures/slct_item.ui, structures/structures.u,
+  structures/swinfo.ui, structures/tedinfo.ui, structures/userblk.ui,
+  structures/utxt_fn.ui, structures/x_buf_v2.ui,
+  structures/xaesmsg.ui, structures/xdo_inf.ui,
+  structures/xfsl_filter.ui, structures/xshw_command.ui,
+  structures/xted.ui, wind_/wind_get_set.ui, wind_/wind_set.ui,
+  wind_/wind_xget.ui:
+
+  New structures dircetory and some translations
+
+2005-12-03 Saturday 10:49  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/: evnts_de.ui, evnts_en.ui:
+
+  Wrong parameter number in AC_CLOSE
+
+2005-12-03 Saturday 10:48  Gerhard Stoll
+
+  * gem/aes/evnt_/: evnt_.u, evnts.ui, messages/evnts_de.ui,
+  messages/evnts_en.ui:
+
+  English version
+
+2005-11-13 Sunday 07:51  Gerhard Stoll
+
+  * magic/magicmac.u:
+
+  Add cookie elements from version 1.11
+
+2005-11-13 Sunday 07:50  Gerhard Stoll
+
+  * xbios/pci_bios/: error.ui, fpclassc.ui, fpdevice.ui, pci_bios.u:
+
+  error codes
+
+2005-11-13 Sunday 07:50  Gerhard Stoll
+
+  * xbios/xbios_f.u:
+
+  Add the function form the ct60
+
+2005-11-01 Tuesday 07:59  Gerhard Stoll
+
+  * gem/vdi/inquire/vq_extnd.ui:
+
+  work_out[32] indicate new style colour routines (NVDI 5.xx)
+
+2005-11-01 Tuesday 07:58  Gerhard Stoll
+
+  * anhang/anhang/tos_vers.u:
+
+  Translate
+
+2005-10-19 Wednesday 18:26  Gerhard Stoll
+
+  * gem/vdi/: assign_sys.ui, struktur.ui, vdi.u, vdi_en.u,
+  attribut/attribut.u, attribut/fill/vsf_color.ui,
+  attribut/fill/vsf_interior.ui, attribut/fill/vsf_perimeter.ui,
+  attribut/fill/vsf_style.ui, attribut/fill/vsf_udpat.ui,
+  attribut/linien/v_bez_qual.ui, attribut/linien/vsl_color.ui,
+  attribut/linien/vsl_ends.ui, attribut/linien/vsl_type.ui,
+  attribut/linien/vsl_udsty.ui, attribut/linien/vsl_width.ui,
+  attribut/marker/vsm_color.ui, attribut/marker/vsm_height.ui,
+  attribut/marker/vsm_type.ui, attribut/text/vst_alignment.ui,
+  attribut/text/vst_arbpt32.ui, attribut/text/vst_charmap.ui,
+  attribut/text/vst_color.ui, attribut/text/vst_effects.ui,
+  attribut/text/vst_font.ui, attribut/text/vst_height.ui,
+  attribut/text/vst_kern.ui, attribut/text/vst_map_mode.ui,
+  attribut/text/vst_name.ui, attribut/text/vst_point.ui,
+  attribut/text/vst_rotation.ui, attribut/text/vst_setsize32.ui,
+  attribut/text/vst_skew.ui, attribut/text/vst_track_offset.ui,
+  attribut/text/vst_width.ui, attribut/uebergeordnete/vs_color.ui,
+  attribut/uebergeordnete/vswr_mode.ui, control/v_bez_off.ui,
+  control/v_bez_on.ui, control/v_clrwk.ui, control/v_clsbm.ui,
+  control/v_clswk.ui, control/v_getoutline.ui, control/v_opnbm.ui,
+  control/v_opnvwk.ui, control/v_opnwk.ui, control/v_opnwk_pc_gem.ui,
+  control/vs_clip.ui, control/vst_load_fonts.ui, escape/escape.u,
+  escape/graphic/v_bit_image.ui, escape/graphic/v_copies.ui,
+  escape/graphic/v_orient.ui, escape/graphic/v_page_size.ui,
+  escape/graphic/v_tray.ui, escape/graphic/vq_calibrate.ui,
+  escape/graphic/vq_page_name.ui, escape/graphic/vq_tray_names.ui,
+  escape/graphic/vs_calibrate.ui, escape/metafile/v_meta_extents.ui,
+  escape/metafile/v_write_meta.ui, escape/metafile/vm_coords.ui,
+  escape/metafile/vm_filename.ui, escape/metafile/vm_pagesize.ui,
+  escape/special/v_escape2000.ui, escape/text/v_curaddress.ui,
+  escape/text/v_curdown.ui, escape/text/v_curleft.ui,
+  escape/text/v_curright.ui, escape/text/v_curtext.ui,
+  escape/text/v_curup.ui, escape/text/vq_chcells.ui,
+  escape/text/vq_curaddress.ui, input/input.u, input/v_hide_c.ui,
+  input/v_show_c.ui, input/vex_butv.ui, input/vex_curv.ui,
+  input/vex_motv.ui, input/vex_timv.ui, input/vq_key_s.ui,
+  input/vq_mouse.ui, input/vrq_choice.ui, input/vrq_locator.ui,
+  input/vrq_string.ui, input/vsc_form.ui, input/vsin_mode.ui,
+  input/vsm_choice.ui, input/vsm_string.ui, inquire/inquire.u,
+  inquire/v_getbitmap_info.ui, inquire/vq_color.ui,
+  inquire/vq_devinfo.ui, inquire/vq_ext_devinfo.ui,
+  inquire/vq_extnd.ui, inquire/vq_scrninfo.ui,
+  inquire/vqf_attributes.ui, inquire/vqin_mode.ui,
+  inquire/vql_attributes.ui, inquire/vqm_attributes.ui,
+  inquire/vqt_advance32.ui, inquire/vqt_attributes.ui,
+  inquire/vqt_char_index.ui, inquire/vqt_ext_name.ui,
+  inquire/vqt_extent.ui, inquire/vqt_f_extent.ui,
+  inquire/vqt_fontheader.ui, inquire/vqt_fontinfo.ui,
+  inquire/vqt_get_table.ui, inquire/vqt_name_and_id.ui,
+  inquire/vqt_pairkern.ui, inquire/vqt_real_extent.ui,
+  inquire/vqt_trackkern.ui, inquire/vqt_width.ui,
+  inquire/vqt_xfntinfo.ui, output/output.u, output/v_arc.ui,
+  output/v_bar.ui, output/v_bez.ui, output/v_bez_fill.ui,
+  output/v_circle.ui, output/v_contourfill.ui, output/v_ellarc.ui,
+  output/v_ellipse.ui, output/v_ellpie.ui, output/v_fillarea.ui,
+  output/v_ftext.ui, output/v_ftext_offset.ui, output/v_gtext.ui,
+  output/v_justified.ui, output/v_pieslice.ui, output/v_pline.ui,
+  output/v_pmarker.ui, output/v_rbox.ui, output/v_rfbox.ui,
+  output/vr_recfl.ui, raster/v_get_pixel.ui, raster/vr_trnfm.ui,
+  raster/vro_cpyfm.ui, raster/vrt_cpyfm.ui,
+  structures/color_entry.ui, structures/color_rgb.ui,
+  structures/color_tab.ui, structures/fix31.ui,
+  structures/font_hdr.ui, structures/gcbitmap.ui, structures/mfdb.ui,
+  structures/point16.ui, structures/point32.ui,
+  structures/pxyarray.ui, structures/rect16.ui, structures/rect32.ui,
+  structures/structures.u, structures/xfnt_info.ui:
+
+  A very raw translation
+
+2005-10-19 Wednesday 18:21  Gerhard Stoll
+
+  * magic/magicmac.u:
+
+   Delete info about the ASH-Mailbox
+
+2005-08-30 Tuesday 16:41  Gerhard Stoll
+
+  * bios/sys_vec.u:
+
+  NVDI use TRAP #15, Cubase MROS use TRAP #8
+
+2005-08-23 Tuesday 16:51  Gerhard Stoll
+
+  * protokol/dhst.u:
+
+  English version form Document History Protocol (DHST)
+
+2005-08-06 Saturday 06:40  Gerhard Stoll
+
+  * gem/vdi/control/v_opnbm.ui:
+
+  Change availability
+
+2005-08-06 Saturday 06:39  Gerhard Stoll
+
+  * gem/vdi/inquire/: disable_nvdi.ui, v_read_default_settings.ui,
+  v_write_default_settings.ui:
+
+  Missing Subfunction
+
+2005-08-06 Saturday 06:39  Gerhard Stoll
+
+  * gem/vdi/inquire/vqr_bg_color.ui:
+
+  Wrong subfunction number
+
+2005-08-06 Saturday 06:39  Gerhard Stoll
+
+  * gem/vdi/attribut/uebergeordnete/v_setrgb.ui:
+
+  Wrong opcode
+
+2005-08-04 Thursday 10:16  Gerhard Stoll
+
+  * gem/aes/appl_/appl_getinfo.ui:
+
+  New bits in mode 11 and new mode 97 from XaAES
+
+2005-08-04 Thursday 10:15  Gerhard Stoll
+
+  * gem/aes/appl_/appl_getinfo_str.ui:
+
+  Replace appl_getinfo with appl_getinfo_str
+
+2005-07-18 Monday 08:19  Gerhard Stoll
+
+  * protokol/xacc/: xacc.u, xacc_de.ui, xacc_en.ui:
+
+  XACC protocol; parts of the text from Thomas Much
+
+2005-07-16 Saturday 07:59  Gerhard Stoll
+
+  * bios/cookie.u:
+
+  Hades add to _FDC
+
+2005-07-10 Sunday 15:16  Gerhard Stoll
+
+  * anhang/anhang/: xhdi.u, xhdi/xhdi.u, xhdi/xhdi_de.ui,
+  xhdi/xhdi_en.ui:
+
+  English version
+
+
+

1.3.9 Version 4.93

+
2005-07-03 Sunday 08:35  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/messages.u:
+
+  Messages from WinDom, LDG and Output add
+
+2005-06-04 Saturday 17:47  Gerhard Stoll
+
+  * gem/aes/evnt_/messages/messages.u:
+
+  Messages from MyTask add
+
+2005-06-03 Friday 07:35  Gerhard Stoll
+
+  * gem/aes/evnt_/: evnt_.u, messages/messages.u,
+  messages/rsdaemon.ui:
+
+  GEM-Messageslist from Martin Elsaesser add
+
+2005-06-03 Friday 07:33  Gerhard Stoll
+
+  * anhang/anhang/anhang.u:
+
+  ResourceMaster add to developer tools
+
+2005-06-03 Friday 07:29  Gerhard Stoll
+
+  * gem/aes/wind_/: wind_.u, wind_get.ui, wind_get_set.ui,
+  wind_set.ui, wind_xget.ui, wind_xset.ui:
+
+  Overwork all about wind_get and wind_set, add new modes from XaAES
+
+2005-05-24 Tuesday 21:27  Gerhard Stoll
+
+  * gem/aes/evnt_/: evnt_multi.ui, evnt_timer.ui:
+
+  Do not use with timer vaule 0 with TOS 1.0
+
+2005-05-24 Tuesday 21:27  Gerhard Stoll
+
+  * gem/aes/struktur.ui:
+
+  Better description from APPLRECORD
+
+2005-05-24 Tuesday 21:26  Gerhard Stoll
+
+  * protokol/view.u:
+
+  Some messages defines add
+
+2005-05-24 Tuesday 21:26  Gerhard Stoll
+
+  * protokol/seproto/: seproto.u, seproto_de.ui, seproto_en.ui:
+
+  English version
+
+2005-05-24 Tuesday 21:24  Gerhard Stoll
+
+  * gem/aes/wind_/wind_get.ui:
+
+  WF_NAME also available since MagiC 6
+
+2005-05-24 Tuesday 21:24  Gerhard Stoll
+
+  * gem/aes/menu_/menu_register.ui:
+
+  Mode -1 from the programs A-MAN and MenuBar
+
+2005-05-24 Tuesday 21:24  Gerhard Stoll
+
+  * gem/aes/menu_/menu_bar.ui:
+
+  Mode -2 and -3 from the programs A-MAN and MenuBar
+
+2005-05-24 Tuesday 21:23  Gerhard Stoll
+
+  * gem/aes/appl_/appl_xbvset.ui:
+
+  Function appl_xbvset from GEM/4, GEM/5 and FreeGEM
+
+2005-05-24 Tuesday 21:22  Gerhard Stoll
+
+  * gem/aes/appl_/appl_getinfo.ui:
+
+  Worng type number for XaAES and WINX
+
+2005-05-24 Tuesday 21:22  Gerhard Stoll
+
+  * gem/aes/appl_/appl_find.ui:
+
+  Mode -3 also in XaAES available
+
+2005-05-24 Tuesday 21:22  Gerhard Stoll
+
+  * e_protok.u, tos_hyp.u:
+
+  Add BubbleGEM
+
+2005-05-24 Tuesday 21:22  Gerhard Stoll
+
+  * protokol/BubbleGEM/: bubble.u, bubble_de.ui, bubble_en.ui,
+  img20.img:
+
+  Add BubbleGEM
+  Thanks to Thomas Much and Goetz Hoffart, which allow
+  to use some parts of the original doc.
+
+2005-03-05 Saturday 10:22  Gerhard Stoll
+
+  * bios/cookie.u:
+
+  Wrong description of the _AKP cookie
+
+2005-03-05 Saturday 10:22  Gerhard Stoll
+
+  * magic/xfs.u:
+
+  New elements in MX_KERNEL
+
+2005-03-05 Saturday 10:22  Gerhard Stoll
+
+  * bios/sys_vec.u:
+
+  Trap#3 is used from the Omega-Color-CAD
+
+2005-03-05 Saturday 10:22  Gerhard Stoll
+
+  * xbios/datetime/datetime.ui:
+
+  More info about the NVRAM
+
+2005-03-05 Saturday 10:21  Gerhard Stoll
+
+  * gem/vdi/: inquire/disable_nvdi.ui, inquire/inquire.u,
+  inquire/v_create_driver_info.ui, inquire/v_delete_driver_info.ui,
+  inquire/v_read_default_settings.ui,
+  inquire/v_write_default_settings.ui, vdi_f.u:
+
+  Add Funktion 180, 181 and 182 form NVDI 5.xx (WDialog)
+
+2005-02-20 Sunday 10:27  Gerhard Stoll
+
+  * gem/aes/graf_/graf_xhandle.ui:
+
+  Description from parameter device
+
+2005-02-20 Sunday 10:27  Gerhard Stoll
+
+  * n_aes/n_aes.u:
+
+  XaAES fake 'nAES' cookie
+
+2005-01-30 Sunday 09:39  Gerhard Stoll
+
+  * gem/aes/objc_/objc_.u:
+
+  objc_xedit listen
+
+2005-01-30 Sunday 09:38  Gerhard Stoll
+
+  * magic/magicpc.u:
+
+  Some DLL IDs for MagiC PC DLLs add
+
+2005-01-24 Monday 16:54  Gerhard Stoll
+
+  * gem/aes/appl_/appl_getinfo.ui:
+
+  Worng type number for XaAES
+
+2005-01-24 Monday 16:53  Gerhard Stoll
+
+  * gem/aes/graf_/graf_mouse.ui:
+
+  Add mouse form from N.AES and XaAES
+
+2005-01-02 Sunday 11:29  Gerhard Stoll
+
+  * anhang/typedefs.u, bios/bios.u, gem/aes/aes.u, gem/aes/aes_en.u,
+  gem/aes/aes_f.u, gem/aes/struktur.ui, gem/aes/appl_/appl_.u,
+  gem/aes/appl_/appl_bvset.ui, gem/aes/appl_/appl_find.ui,
+  gem/aes/appl_/appl_init.ui, gem/aes/evnt_/evnt_button.ui,
+  gem/aes/evnt_/evnt_dclick.ui, gem/aes/evnt_/evnt_multi.ui,
+  gem/aes/form_/form_alert.ui, gem/aes/fsel_/fsel_exinput.ui,
+  gem/aes/fsel_/fsel_input.ui, gem/aes/graf_/graf_mouse.ui,
+  gem/aes/graf_/graf_rubberbox.ui, gem/aes/menu_/menu_bar.ui,
+  gem/aes/objc_/objc_draw.ui, gem/aes/objc_/objc_edit.ui,
+  gem/aes/rsrc_/rsrc_gaddr.ui, gem/aes/rsrc_/rsrc_saddr.ui,
+  gem/aes/scrp_/scrp_clear.ui, gem/aes/scrp_/scrp_read.ui,
+  gem/aes/scrp_/scrp_write.ui, gem/aes/wind_/wind_get_set.ui,
+  gem/vdi/vdi_f.u, gem/vdi/escape/graphic/v_xbit_image.ui,
+  gem/vdi/inquire/vq_extnd.ui, gem/vdi/inquire/vqt_name.ui:
+
+  Add some more infos from GEM/3, GEM/4, ViewMAX and FreeGEM
+
+2004-12-31 Friday 14:28  Gerhard Stoll
+
+  * gem/aes/appl_/: appl_.u, appl_getinfo.ui, appl_getinfo_str.ui:
+
+  AES_VERSION
+
+2004-12-31 Friday 14:27  Gerhard Stoll
+
+  * gem/aes/appl_/appl_search.ui:
+
+  APP_TASKINFO, APP_HIDDEN and APP_FOCUS from XaAES
+
+2004-12-31 Friday 14:27  Gerhard Stoll
+
+  * gem/aes/wind_/: wind_.u, wind_get.ui, wind_get_set.ui,
+  wind_set.ui:
+
+  Overview about all subfunction form wind_get/set
+
+2004-12-31 Friday 14:26  Gerhard Stoll
+
+  * gem/aes/struktur.ui:
+
+  Some new links in HNDL_OBJ
+
+2004-12-31 Friday 14:25  Gerhard Stoll
+
+  * anhang/changes/04_93.ui:
+
+  Changelog updated
+
+2004-12-31 Friday 14:25  Gerhard Stoll
+
+  * xbios/xbios.u:
+
+  Errorlist formated
+
+2004-12-31 Friday 14:25  Gerhard Stoll
+
+  * anhang/anhang/tos_vers.u:
+
+  Table formated
+
+2004-12-28 Tuesday 15:12  Gerhard Stoll
+
+  * gem/aes/wind_/wind_create.ui:
+
+  Add BORDER
+
+2004-12-28 Tuesday 15:12  Gerhard Stoll
+
+  * gem/aes/wdlg_/wdlg_close.ui:
+
+  Wrong Syntax, missing parameter X and Y
+
+2004-12-28 Tuesday 15:12  Gerhard Stoll
+
+  * gem/aes/fsel_/fsel_boxinput.ui:
+
+  The GEM-Arrays was wrong
+
+2004-12-28 Tuesday 15:12  Gerhard Stoll
+
+  * xbios/datetime/datetime.ui:
+
+  TOS Bootprferenz is 0x80 and not 0x00
+
+2004-12-28 Tuesday 15:12  Gerhard Stoll
+
+  * xbios/bildscrm/vsetmode.ui:
+
+  mode VM_INQUIRE (-1)
+
+2004-12-19 Sunday 10:52  Gerhard Stoll
+
+  * protokol/gdps.ui, e_protok.u, tos_hyp.u:
+
+  New: GDPS: Gerti's Driver Piping System
+
+2004-12-19 Sunday 10:52  Gerhard Stoll
+
+  * anhang/anhang/tos_vers.u:
+
+  TOS 7.0x
+
+2004-12-19 Sunday 10:52  Gerhard Stoll
+
+  * bios/bios_f.u:
+
+  DOLMEN function
+
+2004-12-19 Sunday 10:52  Gerhard Stoll
+
+  * gemdos/prozess/: prozess.u, ptrace.ui:
+
+  Add function Ptrace
+
+2004-12-19 Sunday 10:52  Gerhard Stoll
+
+  * gemdos/file/freadlin.ui:
+
+  Wrong Binding
+
+2004-12-19 Sunday 10:52  Gerhard Stoll
+
+  * gemdos/gemdos.u:
+
+  GEMDOS errors from FreeMiNT add
+
+2004-12-19 Sunday 10:51  Gerhard Stoll
+
+  * magic/magicpc.u:
+
+  mec1 interface from MagiC PC
+
+2004-12-05 Sunday 14:55  Gerhard Stoll
+
+  * xbios/: struktur.ui, bildscrm/Setscreen_Milan.ui,
+  bildscrm/bildscrm.u, bildscrm/vsetscre.ui:
+
+  Milan Setscreen
+
+2004-12-05 Sunday 14:51  Gerhard Stoll
+
+  * anhang/anhang/tos_vers.u:
+
+  TOS 3.00 add
+
+2004-12-05 Sunday 14:51  Gerhard Stoll
+
+  * xbios/datetime/datetime.ui:
+
+  Info about the size of the NVM from the Milan
+
+2004-12-05 Sunday 14:51  Gerhard Stoll
+
+  * gem/vdi/vdi.u:
+
+  Add the device ID number form 101 to 130
+
+2004-12-05 Sunday 14:50  Gerhard Stoll
+
+  * gem/aes/appl_/: appl_control.ui, appl_find.ui, appl_getinfo.ui:
+
+  Small translation
+
+2004-11-22 Monday 17:58  Gerhard Stoll
+
+  * gem/vdi/vdi.u:
+
+  Add fVDI at vq_vgdos
+
+2004-11-15 Monday 19:24  Gerhard Stoll
+
+  * linea/linea.u:
+
+  Remove the label Line-A, because it was twice
+
+2004-11-15 Monday 19:23  Gerhard Stoll
+
+  * gemdos/memory/mxalloc.ui:
+
+  Change bit3 to reserved
+
+2004-11-09 Tuesday 16:59  Gerhard Stoll
+
+  * gem/aes/fslx_/use.ui, gem/aes/pdlg_/pdlg_.u,
+  xbios/bildscrm/setscree.ui, xbios/ct60/rd_param.ui,
+  xbios/datetime/datetime.ui, xbios/pci_bios/fpclassc.ui:
+
+  Some small translation
+
+2004-11-09 Tuesday 16:55  Gerhard Stoll
+
+  * gem/aes/wind_/: wind_.u, wind_get.ui, wind_get_set.ui,
+  wind_set.ui:
+
+  Overview from the wind_get and wind_set mode
+
+2004-11-09 Tuesday 16:55  Gerhard Stoll
+
+  * gem/aes/evnt_/evnt_keybd.ui:
+
+  Link to ASCII- and scancode
+
+2004-11-09 Tuesday 16:55  Gerhard Stoll
+
+  * emulator.en/sonstige.u:
+
+  New parameter from Steem v3.2 add
+
+2004-10-22 Friday 16:53  Gerhard Stoll
+
+  * doc/tos_hyp.upl:
+
+  Description for upload
+
+2004-10-22 Friday 16:48  Gerhard Stoll
+
+  * xbios/xbios_f.u:
+
+  Add PCI-BIOS function name and VideoCtrl from MilanTOS
+
+2004-10-15 Friday 16:47  Gerhard Stoll
+
+  * gemdos/datetime/tsetitim.ui:
+
+  Parameter which is int16_t and not int32_t
+
+2004-10-15 Friday 16:46  Gerhard Stoll
+
+  * gemdos/datetime/tsetdate.ui:
+
+  Return value is a int16_t and not uint32_t
+
+2004-10-02 Saturday 13:19  Gerhard Stoll
+
+  * gem/aes/: struktur.ui, evnt_/evnts.ui,
+    fnts_/...,
+    lbox_/lbox_delete.ui:
+
+  A raw translation of some parts
+
+2004-10-02 Saturday 13:18  Gerhard Stoll
+
+  * anhang/typedefs.u:
+
+  Change typdef
+
+2004-10-02 Saturday 13:18  Gerhard Stoll
+
+  * gem/aes/graf_/: graf_.u, graf_handle.ui, graf_xhandle.ui:
+
+  graf_xhandle was missed in the overview
+
+2004-09-26 Sunday 08:56  Gerhard Stoll
+
+  * gem/aes/edit_/...
+    gem/aes/lbox_/...
+    gem/aes/rsrc_/sys_recalc_cicon_colours.ui,
+    gem/aes/wind_/wind_get.ui, gem/vdi/vdi.u, gemdos/gemdos_f.u,
+    xbios/spezial/cachectr.ui:
+
+  A raw translation of some parts
+
+2004-09-26 Sunday 08:53  Gerhard Stoll
+
+  * xbios/ct60/rd_param.ui:
+
+  New 'type_param' add
+
+2004-09-22 Wednesday 07:38  Gerhard Stoll
+
+  * gem/aes/: appl_/appl_getinfo.ui, evnt_/evnts.ui,
+  wind_/wind_calc.ui, wind_/wind_get.ui, wind_/wind_set.ui:
+
+  Add WINX informations
+
+2004-09-22 Wednesday 07:38  Gerhard Stoll
+
+  * gem/aes/appl_/appl_find.ui:
+
+  Add defined names
+
+2004-09-22 Wednesday 07:37  Gerhard Stoll
+
+  * gem/aes/: aes.u, aes_en.u:
+
+  Add links
+
+2004-09-22 Wednesday 07:37  Gerhard Stoll
+
+  * gem/vdi/vdi_f.u:
+
+  Add function from the SpeedoGDOS driver from Thierry Rodolfo
+
+2004-09-22 Wednesday 07:36  Gerhard Stoll
+
+  * xbios/spezial/cjar.ui:
+
+  new link
+
+2004-09-22 Wednesday 07:36  Gerhard Stoll
+
+  * xbios/spezial/puntaes.ui:
+
+  infos about the MagiC subfunction
+
+2004-09-22 Wednesday 07:36  Gerhard Stoll
+
+  * xbios/xbios.u:
+
+  forget to include the drucker.u
+
+2004-09-22 Wednesday 07:36  Gerhard Stoll
+
+  * bios/cookie.u:
+
+  _FDC: Add >Mac<
+
+
+

1.3.10 Version 4.92

+
The tos.hyp goes CVS.
+
+2004-08-31 Tuesday 16:00  Gerhard Stoll
+
+  * n_aes/n_aes.u:
+
+  add a ~ in the formula
+
+2004-08-31 Tuesday 16:00  Gerhard Stoll
+
+  * gem/vdi/: colortable/v_color2nearest.ui,
+  colortable/v_ctab_idx2value.ui, colortable/vq_dflt_ctab.ui,
+  control/v_pat_rotate.ui:
+
+  correct the binding
+
+2004-08-31 Tuesday 15:59  Gerhard Stoll
+
+  * bios/cookie.u:
+
+  Cookie _FPU: add 68060
+
+2004-08-07 Saturday 17:29  Gerhard Stoll
+
+  * tos_hyp.u, bios/cookie.u, gem/aes/aes.u, gem/aes/aes_f.u,
+  gem/aes/toolbar.ui, gem/aes/appl_/appl_getinfo.ui,
+  gem/aes/appl_/appl_yield.ui, gem/aes/evnt_/evnt_.u,
+  gem/aes/evnt_/evnt_multi.ui, gem/aes/evnt_/evnts.ui,
+  gem/aes/form_/form_alert.ui, gem/aes/wind_/wind_create.ui,
+  gem/aes/wind_/wind_get.ui, gem/aes/wind_/wind_set.ui,
+  xaaes/xaaes.u:
+
+  Added info about XaAES
+
+2004-07-31 Saturday 09:09  Gerhard Stoll
+
+  * gem/vdi/inquire/vqt_get_table.ui:
+
+  Add mapping tables
+
+2004-07-31 Saturday 09:07  Gerhard Stoll
+
+  * xbios/struktur.ui:
+
+  KEYTAB: undocumented tables add
+
+2004-07-29 Thursday 19:58  Gerhard Stoll
+
+  * bios/cookie.u:
+
+  Cookie: _FDC: Milan add
+
+2004-07-17 Saturday 16:52  Gerhard Stoll
+
+  * bios/cookie.u:
+
+  Cookie _MCH: Medusa T40 add
+
+2004-06-25 Friday 17:29  Gerhard Stoll
+
+  * gem/aes/: appl_/appl_init.ui, fsel_/fsel_boxinput.ui,
+  fsel_/fsel_exinput.ui, menu_/menu_bar.ui, pdlg_/pdlg_do.ui,
+  pdlg_/pdlg_open.ui, wind_/wind_draw.ui:
+
+  Small text correcting
+
+2004-06-25 Friday 17:29  Gerhard Stoll
+
+  * gem/aes/form_/: form_wbutton.ui, form_wkeybd.ui:
+
+  Add availability
+
+2004-06-25 Friday 17:27  Gerhard Stoll
+
+  * gem/vdi/attribut/uebergeordnete/vs_bkcolor.ui:
+
+  Comments in GEM-Array wrong
+
+2004-06-25 Friday 17:27  Gerhard Stoll
+
+  * gem/vdi/attribut/marker/vsm_bg_color.ui:
+
+  Wrong group
+
+2004-06-25 Friday 17:26  Gerhard Stoll
+
+  * gem/aes/objc_/: objc_edit.ui, objc_xedit.ui:
+
+  Chance availability
+
+2004-06-25 Friday 17:26  Gerhard Stoll
+
+  * gem/aes/form_/xfrm_popup.ui:
+
+  Add Return-Value in Binding
+
+2004-05-13 Thursday 19:04  Gerhard Stoll
+
+  * gem/vdi/escape.u:
+
+  Binding fuer vqp_error geschrieben
+
+2004-05-10 Monday 19:36  Gerhard Stoll
+
+  * linea/: bitblt.ui, drsprite.ui, fillpoly.ui, fillrect.ui,
+  getpixel.ui, hdmouse.ui, hline.ui, init.ui, line.ui, putpixel.ui,
+  seedfill.ui, shmouse.ui, textblt.ui, trmouse.ui, udrsprit.ui:
+
+  Im Assemblerteil Lina-A Opcode durch Line-A Opcode ersetzt
+
+2004-05-10 Monday 19:36  Gerhard Stoll
+
+  * linea/cpraster.ui:
+
+  Im deutschen Binding stand linea_init. Im Assemblerteil Lina-A Opcode
+  durch Line-A Opcode ersetzt
+
+2004-05-10 Monday 19:36  Gerhard Stoll
+
+  * linea/linea.u:
+
+  Strukture LINEA um Kommentare ergaenzt. Alle Strukturen etwas formatiert
+
+2004-05-10 Monday 19:36  Gerhard Stoll
+
+  * tos_hyp.u:
+
+  Korrekte Schreibweise von Line-A
+
+2004-05-10 Monday 19:35  Gerhard Stoll
+
+  * gem/vdi/eingabe.u:
+
+  Verfügbarkeit eingetragen, Datentypen angepasst. Beim Binding von
+  vex_wheelv den korrekten Funktionsnamen eingetragen
+
+2004-05-08 Saturday 19:51  Gerhard Stoll
+
+  * gem/vdi/: ausgabe.u, auskunft.u:
+
+  Datentypen angepasst
+
+2004-05-08 Saturday 19:51  Gerhard Stoll
+
+  * gem/vdi/attribut.u:
+
+  Statt des Bindings steht nun die Deklaration auf der Beschreibungsseite
+
+2004-05-07 Friday 16:36  Gerhard Stoll
+
+  * gem/vdi/attribut.u:
+
+  Verfuegabekeit und Datentypen geaendert
+
+2004-05-05 Wednesday 18:32  Gerhard Stoll
+
+  * xbios/drucker/prtblk.ui:
+
+  Statt Prtblk stand nur c bei begin_node
+
+2004-05-05 Wednesday 18:32  Gerhard Stoll
+
+  * tos_hyp.u:
+
+  Linea eingefuegt
+
+2004-05-05 Wednesday 18:31  Gerhard Stoll
+
+  * anhang/anhang/tos_vers.u:
+
+  Der Befehl end_node war nicht vorhanden
+
+2004-05-04 Tuesday 20:31  Gerhard Stoll
+
+  * magic/magic.u:
+
+  Fuer die Links in den Zeilen 1176 und 11617 haben sich die Ueberschriften
+  geaendert
+
+2004-05-04 Tuesday 20:30  Gerhard Stoll
+
+  * xbios/xbios.u:
+
+  Fuer die Links in den Zeilen 1210 und 1211 haben sich die Ueberschriften
+  geaendert
+
+2004-05-04 Tuesday 20:30  Gerhard Stoll
+
+  * bios/bios.u:
+
+  Versuchte die Datei bios_strukt.u statt bios_str.u zu oeffnen
+
+2004-05-04 Tuesday 19:51  Gerhard Stoll
+
+  * anhang/anhang/tos_vers.u:
+
+  TOS 1.60 nach 1.06 genaendert und TOS 1.62 hinzugefuegt
+
+2004-05-04 Tuesday 19:49  Gerhard Stoll
+
+  * anhang/typedefs.u:
+
+  end_node bei OSHEADER an falscher Stelle.
+
+2004-05-04 Tuesday 19:46  Gerhard Stoll
+
+  * bios/function/rwabs.u:
+
+  Titel kam nicht in den Index
+
+2004-05-04 Tuesday 19:46  Gerhard Stoll
+
+  * bios/cookie.u:
+
+  Quellenangabe bei _FPU
+
+2004-05-04 Tuesday 19:20  Gerhard Stoll
+
+  * bilder/: farbe/disk.img, farbe/info.img, mono/disk.img,
+  mono/info.img:
+
+  config.u   - Die zusätzlichen Sprachen gelöscht, da es nur deutsch und
+               englisch gibt.
+  tos_hyp.u  - Neuse Kapitel Emulatoren eingefügt.
+  cpxdoku.u  - Darstellung der Auflistung der Funktionen verbessert.
+  vdi.u      - Hinweis auf einen möglichen Absturz von ABC-GEM.
+               Bei Assmblerquelltext von vq_vgdos stand die falsche
+               Bezeichnung.
+               Einige Rückgabewerte von vq_vgdos ergänzt.
+  metafile.u - DIN-A3 und ähnliche heißen jetzt DIN A3.
+  attribut.u - Bei (!begin_liste) [Beschreibung:] den Doppelpunkt gelöscht.
+               !item [Verfügbarkeit] eingefügt und entsprechend eingtragen.
+
+  Bei allen restlichen Dateien des VDIs:
+               Bei (!begin_liste) [Beschreibung:] den Doppelpunkt gelöscht.
+               !item [Verfügbarkeit] eingefügt.
+
+  aes.u      - Reihenfolge der Nodes geändert. Die Funktionen kommen nun
+               zum Schluß.
+  appl_.u    - Bei (!begin_liste) [Beschreibung:] den Doppelpunkt gelöscht.
+               Appl_getinfo 13: Wert um objc_sysvar erweitert.
+  wind_.u    - wind_create: wi_crkind um MENUBAR von XaAES ergänzt.
+               wind_set: Beschränkung von WF_INFO und WF_NAME
+  form_.u    - form_alert: Icon Info und Diskettesymbol von AES 4.10
+  aes_f.u    - Opcodenummer bei den fsel_ Funktionen korrigiert.
+               Funktionen von XaAES und Geneva nachgetragen.
+  aes/struktur.ui - Tedinfo: te_pvalid Beschreibung verbessert und neuer
+                    Typ ergänzt.
+  style.u    - Ein Label von einem " befreit.
+  tosmain.u  - Neuer Querverweis beim Node "Das Betriebssystem TOS".
+
+  magic/dfs.u   - Bei (!begin_liste) [Beschreibung:] den Doppelpunkt ge-
+                  löscht.
+  magic/xfs.u   - Bei (!begin_liste) [Beschreibung:] den Doppelpunkt ge-
+                  löscht.
+  magic/magic.u - Teile heraus genommen.
+                  Ein Label von einem " befreit.
+  magic/magicmac.u - Supervisor-Modus anstatt Supervisormodus.
+  magic/sharelib.u - Minimale Übersetzungen ins englische.
+  magic/magicerr.u - Übersetzt ins englische.
+  n_aes/n_aes.u    - ~ ein ! vorrangestellt, dass es angezeigt wird.
+  bios.u           - Die einzelnen Funktionen aus dem Text gelöst.
+  cookie.u         - Niederlande heißt jetzt Holland.
+                     _MCH: ARAnyM ergänzt
+  sys_var.u        - Nummerisch sortierte Liste
+  sys_vec.u        - Hinweis auf SuperCharger (Trap #4), Wind-XES (Trap #5)
+                     und TapeBIOS (Trap #10)
+  bios_str.u       - Struktur BPB und PUN_INFO hierher kopiert. Letztere um
+                     einige Erklärung erweitert.
+  bios_f.u         - Ein paar Ergänzungen.
+  typedef.u        - Einige Strukturen sind gewandert.
+  neu.u            - Version 4.92 angefangen
+  anhang.u         - Scancode um Milan Alt Gr erweitert.
+  pmmu.u           - Bei (!begin_liste) [Beschreibung:] den Doppelpunkt
+                     gelöscht.
+  xhdi.u           - Bei (!begin_liste) [Beschreibung:] den Doppelpunkt
+                     gelöscht.
+  tos_vers.u       - Einige TOS Versionen ergänzt.
+  gemdos.u         - Neue Struktur erstellt.
+  signale.u        - Querverweise an neue Überschriften angepasst.
+  gemdos/struktur.u- Ein Struktieren sind hierher gekommen.
+                     Erläuterung zum rekursiven Bearbeiten von Directories.
+  tekbios.u        - Erweitert für englische Übersetzung
+  olga.u           - Hinweis auf das Archiv gelöscht, Maus KA gibt es nicht
+                     mehr.
+                     Bei (!begin_liste) [Beschreibung:] den Doppelpunkt
+                     gelöscht.
+
+  Neuer Ordner bios/function mit den einzelnen Funktionen.
+
+  Neuer Ordner emulator.en angelegt mit den Dateien sonstige.u, stem.u,
+  tos2win.u. disk.img und info.img in Bilder/Farbe und Bilder/mono abgelegt.
+
+2004-04-15 Thursday 20:32  Michael Bernstein
+
+  * .cvsignore, Makefile, config.u, e_linea.u, linea/bitblt.ui,
+  linea/cpraster.ui, linea/drsprite.ui, linea/fillpoly.ui,
+  linea/fillrect.ui, linea/getpixel.ui, linea/hdmouse.ui,
+  linea/hline.ui, linea/init.ui, linea/line.ui, linea/linea.u,
+  linea/putpixel.ui, linea/seedfill.ui, linea/shmouse.ui,
+  linea/textblt.ui, linea/trmouse.ui, linea/udrsprit.ui:
+
+  Beschreibung von Lina-A mit Makefile hinzugefuegt
+
+
    +
  • Von den Systemvariablen gibt nun auch eine Liste welche nach +Adressen sortiert ist. +
  • +
  • Beschreibung der XBIOS-Funktionen: +
    Janus +
  • +
  • Grobe Beschreibung der CENTScreen-XBIOS-Funktionen +
  • +
  • Dcntl Kommandos von MagiC 6 ergänzt. +
  • +
  • BPB->bflags um Bit 1 ergänzt. +
  • +
  • In der AES Funktionsliste Opcode für fsel_input und fsel_exinput +korrigiert. +
  • +
  • appl_getinfo: Rückgabe zu objc_sysvar erweitert. +
  • +
  • Rückgabe Parameter von tsettime von ULONG in WORD verändert. +
  • +
  • Einige Textstellen korrigiert. +
  • +
+ +

1.3.11 Version 4.91

+ + +

1.3.12 Version 4.90

+
    +
  • Der komplette Quelltext wurde ins UDO-Format konvertiert. +Dadurch fehlen jetzt zum Teil interne und externe Verweise, werden +aber mit der Zeit wieder vervollständigt. +
    Ein Teil der Doku ist in englisch. Nach dem Motto, besser +Überhaupt eine Doku als nichts. +
  • +
  • XBIOS Funktion WavePlay +
  • +
  • Beschreibung der Shared Libraries +
  • +
  • Bugfix bei soundcmd +
  • +
  • Meta-DOS durch MetaDOS ersetzt. +
  • +
  • Funktionsliste des AES und VDI-Routinen eingebaut. +
  • +
  • Bei den Funktionslisten wurden alle Funktionen aufgeführt die +ich gefunden habe. Auch solche die nur zu bestimmten Treibern oder +Programmen gehören. +
  • +
  • Unterstützung des DHST-Protokolls. +
  • +
  • Unterstützung des VIEW-Protokolls. +
  • +
  • Unterstützung des XSSI-Protokolls. +
  • +
  • Sversion um MilanTOS erweitern +
  • +
  • XBIOS-Routinen des Milans beschrieben. +
  • +
  • Cookie _VDO, _MCH und _SND um Milan erweitert +
  • +
  • objc_xedit aus MagiC (Parameter 103) +
  • +
  • N.AES Funktionen +
  • +
  • Zwei Funktionen des noch nicht vorhandenen PCI-BIOS 2.00 ;-) +
  • +
  • AV_SENDKEY um CodeAlpha Erweiterung ergänzt +
  • +
  • Neue Message AV_SENDCLICK +
  • +
  • Einige MiNT Funktionen ergänzt +
  • +
  • Alle NVDI 5.0x Erweiterungen beschrieben. +
  • +
  • Ffchown, Ffchmod, Dchroot +
  • +
  • MagiC PC Programmierschnittstelle +
  • +
  • Beschreibung der Crazy-Dots-XBIOS-Erweiterungen (Dank an +Johann-Wilhelm Arndt) +
  • +
  • Beschreibung der StarTrack-XBIOS-Erweiterungen +
  • +
  • XHDI-Spezifikation überarbeitet (1.30) +
  • +
+ +

1.3.13 Version 4.80 - 0.40

+

Version 4.80 +

+
    +
  • Unterstützung der neuen AES-Funktionen von MagiC 5.10 +sowie der scrollenden Eingabefelder. +
  • +
  • Beschreibungen der GEMDOS-Funktionen an den aktuellen +MagiC-Stand angepaßt. +
  • +
  • diverse Bug-Fixes. +
  • +
  • Index geringfügig erweitert. +
  • +
  • Seiten teilweise überarbeitet. +
  • +
+ +

Version 4.70 +

+
    +
  • Unterstützung der AES-Druckdialoge. +
  • +
  • Bugfix bzw. Ergänzung bei AP_TERM. +
  • +
  • Bugfix bei Mxalloc (Dank an Thomas Much und Daniel Höpfl). +
  • +
  • Seiten teilweise überarbeitet. +
  • +
+ +

Version 4.65 +

+
    +
  • Erweiterung des AV-Protokolls und von SC_CHANGED. (Dank an Norbert +Hanz und Thomas Much). +
  • +
  • kleinere Bugfixes. +
  • +
  • Seiten teiweise überarbeitet. +
  • +
+ +

Version 4.60 +

+
    +
  • Unterstützung von NVDI (bis Version 4.1) +
  • +
  • Unterstützung von COPS. +
  • +
  • diverse Bugfixes. +
  • +
  • Index geringfügig überarbeitet. +
  • +
  • Seiten teilweise überarbeitet. +
  • +
+ +

Version 4.50 +

+
    +
  • dies ist die erste Version des Hypertextes, die nicht auf einem +Atari, sondern auf einem Apple Power-Macintosh entwickelt wurde. +
  • +
  • Unterstützung von MagiC 5 +
  • +
  • die Syntax der Pexec-Modi 101,102 und 107 wird auf Wunsch von +Andreas Kromke nicht mehr angegeben. +
  • +
  • kleinere Bugfixes. +
  • +
  • Seiten teilweise überarbeitet. +
  • +
+ +

Version 4.35 +

+
    +
  • Beschreibung der Objekttypen G_SWBUTTON und G_POPUP. +
  • +
  • Vergleich der Speicherverwaltungs-Mechanismen von TOS und +MagiC. +
  • +
  • Informationen zu den work_in/work_out-Arrays bei vq_extnd und +v_opnwk von PC-GEM/3. +
  • +
  • Bugfix bei Pexec (Dank an Andreas Kromke). +
  • +
  • Unterstützung weiterer Datentypen bzw. Strukturen. +
  • +
  • kleinere Bugfixes. +
  • +
  • Update der Links auf externe Hypertexte. +
  • +
  • detailliertere Informationen zur XATTR-Struktur. +
  • +
  • Beschreibung der VDI-Funktion vs_color2. +
  • +
  • Index geringfügig überarbeitet. +
  • +
  • Seiten teilweise überarbeitet. +
  • +
+ +

Version 4.30 +

+
    +
  • Beschreibung des OUT-Dateiformats von PC-GEM. +
  • +
  • Angabe weiterer Details bzw. Unterschiede zu PC-GEM. +
  • +
  • Unterstützung des OLGA-Protokolls. +
  • +
  • ShutDown in MagiC Mac überarbeitet. (Dank an Thomas +Tempelmann) +
  • +
  • Bugfix bei scrp_read. +
  • +
  • Seiten teilweise überarbeitet. +
  • +
+ +

Version 4.20 +

+
    +
  • Übersicht der möglichen Kombinationen von Fülltyp und +Musterindex eingefügt (vgl. Fülltyp-Attribute. +
  • +
  • neue Grafiken eingefügt (Dank an Sven Dreier). +
  • +
  • Beschreibung der Nachricht FNT_CHANGED. +
  • +
  • Bugfix in den VDI-Bindings. +
  • +
  • Bugfix in der MN_SET-Struktur, sowie beim Drag&Drop-Protokoll (Dank an +Thomas Much). +
  • +
  • Bugfix bei Dgetcwd. +
  • +
  • Tabelle der ASCII-Codes eingefügt. +
  • +
  • Tabelle der Scan-Codes eingefügt. +
  • +
  • grafische Übersicht geändert. +
  • +
  • neue Querverweise (Links) eingebaut. +
  • +
  • Update der Links auf externe Hypertexte, sowie Angabe einer +entsprechenden Liste. +
  • +
  • Angabe der Standard-RGB-Werte für die ersten 16 Objektfarben. +
  • +
  • Funktionsliste der GEMDOS, BIOS und XBIOS-Routinen +eingebaut. +
  • +
  • Hypertext besser strukturiert. +
  • +
  • Index geringfügig überarbeitet. +
  • +
  • sehr viele (!) Seiten überarbeitet. +
  • +
+ +

Version 4.10 +

+
    +
  • Hypertext bzgl. MagiC 4 nochmals stark überarbeitet +
  • +
  • Beschreibung der MX_DOSLIMITS-Struktur, sowie Anpassung des +Dcntl-Opcodes KER_DOSLIMITS. +
  • +
  • Querverweise auf den Hypertext XFSL.HYP eingefügt, welcher die +xFSL-Schnittstelle beschreibt. +
  • +
  • Bugfix in den AES-Bindings +
  • +
  • Seiten teilweise überarbeitet +
  • +
+ +

Version 4.01 +

+
    +
  • das Font-Protokoll wird nicht mehr länger unterstützt, da +Font-Selektoren mittlerweile ein Teil des Betriebssystems sind. +
  • +
  • Seiten teilweise überarbeitet +
  • +
+ +

Version 4.00 +

+
    +
  • Unterstützung von MagiC 4 +
  • +
  • Beschreibung der VDI-Routinen v_orient, v_tray und v_copies +(Dank an Ulrich Roßgoderer) +
  • +
  • Seiten teilweise überarbeitet +
  • +
+ +

Version 3.75 +

+
    +
  • Bugfix in den VDI-Bindings +
  • +
  • einige Funktionen von PC-GEM/3 berücksichtigt +
  • +
  • Beschreibung der AES-Message PRN_CHANGED +
  • +
  • Liste der Metafile Sub-Opcodes überarbeitet +
  • +
  • Seiten teilweise überarbeitet +
  • +
+ +

Version 3.70 +

+
    +
  • da die Spendenmoral mehr als dürftig ist, und ich es mir auf +Dauer nicht leisten kann mehrere MByte Daten kostenlos in der Mailbox +abzulegen, muss das Experiment Fairware als gescheitert angesehen +werden. +
  • +
  • Bugfix bei Frename (Dank an Winfried Salomon) +
  • +
  • Bugfix bei Fopen und in den VT-52-Sequenzen (Dank an Jan +Starzynski) +
  • +
  • Bugfix bei evnt_button (Dank an Thomas Baade) +
  • +
  • Bugfix beim FSMC-Cookie (Dank an Dirk Haun) +
  • +
  • Bugfix in den VDI-Bindings +
  • +
  • Beschreibung der Dcntl-Modi von MagiC +
  • +
  • Beschreibung des DFS-Konzeptes in MagiC (Teil-1) +
  • +
  • Beschreibung des PMMU-Cookies/Funktionshandlers +
  • +
  • aktuelle Beschreibung von MagiC Mac-Spezifika (Dank an Thomas Tempelmann) +
  • +
  • Liste der GEMDOS-Fehlermeldungen überarbeitet +
  • +
  • Liste der Cookies überarbeitet +
  • +
  • einige Links/XREF's optimiert +
  • +
  • viele Seiten überarbeitet +
  • +
+ +

Version 3.60 +

+
    +
  • Bugfix bei Flopver (Dank an Markus Kohm) +
  • +
  • Bugfix bei shel_write (Dank an Christian Felsch) +
  • +
  • Bugfix bei Mshrink (Dank an Jan Starzynski) +
  • +
  • Bugfix bei Dopendir (Dank an Jörg Hahne) +
  • +
  • Bugfix in der KBDVBASE-Struktur (Dank an Christoph Zwerschke) +
  • +
  • Bugfixes im Zusammenhang mit dem @xref-Kommando (die 'Typdefinitionen' +heißen jetzt auch wieder so) +
  • +
  • Beschreibung des Toolbar-Supports von AES 4.1 (Dank an +Ulrich Rossgoderer) +
  • +
  • Beschreibung der OverScan-XBIOS-Erweiterungen (Dank an Patrick Jerchel) +
  • +
  • Liste der Cookies überarbeitet +
  • +
  • Beschreibung des XFS-Konzeptes in MagiC (Teil-1) +
  • +
  • allgemeines zu Vektorschriften, Kerning, usw. +
  • +
  • Index geringfügig überarbeitet +
  • +
  • viele Seiten optisch und inhaltlich überarbeitet +
  • +
+ +

Version 3.50 +

+
    +
  • der Hypertext wurde intern darauf vorbereitet, wahl- weise (und +schnell) eine Version mit Monochrom- oder Farbbildern erzeugen zu +können +
  • +
  • es gibt nun eine spezielle MagiC-Seite, die einen leichten +Zugriff auf die MagiC-Specials ermöglicht +
  • +
  • XHDI-Spezifikation überarbeitet +
  • +
  • Unterstützung des @xref-Kommandos vervollständigt +
  • +
  • Seiten teilweise überarbeitet +
  • +
+ +

Version 3.10 +

+
    +
  • der Hypertext besitzt ab sofort einen neuen Autor, und der +Status wurde von Freeware auf Fairware geändert +
  • +
  • Beschreibung der AES-Message SM_M_SPECIAL, sowie Bugfix bei vq_extnd +(Dank an Thomas Baade und Dimitri Junker) +
  • +
  • Liste der Systemvariablen überarbeitet +
  • +
  • GEMDOS-Funktion Cconrs überarbeitet +
  • +
  • AES-Funktion objc_sysvar überarbeitet +
  • +
  • weitere Informationen zum MagX-Cookie +
  • +
  • Eingabefelder in MagiC +
  • +
  • AV-Protokoll überarbeitet +
  • +
  • Informationen zum Smart-Redraw in MagiC +
  • +
  • neue Informationen zum Iconifying in MagiC +
  • +
  • Informationen über die MagiC-Zusatzprogramme +
  • +
  • Beschreibung der GEMDOS-Funktion Srealloc +
  • +
  • Beschreibung der GEMDOS-Funktion Tsetitimer +
  • +
  • GEMDOS-Funktionen Fchmod, Psignal und Psigaction überarbeitet +
  • +
  • einige Seiten unterstützen bereits das neue @xref-Kommando, so +z.B. das AES- und BIOS-Kapitel +
  • +
  • Bugfixes in den AES-Bindings +
  • +
  • viele Seiten überarbeitet +
  • +
+ +

Version 3.00 +

+
    +
  • Beschreibung grundlegender AES-Konzepte +
  • +
  • Beschreibung grundlegender VDI-Konzepte +
  • +
  • Hypertext besser strukturiert +
  • +
  • viele Seiten überarbeitet +
  • +
+ +

Version 2.60 +

+
    +
  • Aufruf der VDI-Funktionen in Assembler beschrieben +
  • +
  • Allgemeines zum Datenaustausch per Klemmbrett +
  • +
  • Allgemeine Informationen über die AES-Bibliotheken +
  • +
  • Weitere Informationen zu den GEMDOS, BIOS und XBIOS Bindings +
  • +
  • Bugfixes in den AES-Bindings +
  • +
  • Seiten teilweise überarbeitet +
  • +
+ +

Version 2.40 +

+
    +
  • Aufruf der AES-Funktionen in Assembler beschrieben +
  • +
  • Liste der Entwicklungssysteme überarbeitet +
  • +
  • Seiten teilweise überarbeitet +
  • +
+ +

Version 2.30 +

+
    +
  • BIOS Funktion Rwabs erweitert (Dank an Erik Dick) +
  • +
  • Beschreibung der AES-Funktionen menu_attach und menu_istart +
  • +
  • Objektarten und Objektflags erweitert +
  • +
  • Informationen zum Analysieren einer Metadatei +
  • +
  • Aufruf der GEMDOS, BIOS und XBIOS-Funktionen in Assembler +beschrieben +
  • +
  • Angabe der verwendeten Quellen +
  • +
  • Liste der einschlägigen Literatur, sowie der bekannten Entwicklungssysteme +hinzugefügt +
  • +
  • viele Seiten überarbeitet +
  • +
+ +

Version 2.10 +

+
    +
  • Flock nochmals überarbeitet +
  • +
  • Beschreibung des Metafile-Formats, sowie der entsprechenden +Sub-Opcodes +
  • +
  • Querverweise auf die Hypertexte grafform.hyp und aip.hyp +eingefügt, welche Informationen über verschiedene Grafikformate bzw. +Programme zur Verfügung stellen +
  • +
  • Seiten teilweise überarbeitet +
  • +
+ +

Version 2.00 +

+
    +
  • wind_set (WF_DCOLOR) überarbeitet +
  • +
  • Objektstatus DRAW3D überarbeitet +
  • +
  • Bugfix beim Objektflag FL3DACT, sowie bei Flock (Dank an Thomas +Baade und Rolf Kotzian) +
  • +
  • Beschreibung der Nachricht WM_TOOLBAR +
  • +
  • Beschreibung der Programmflags +
  • +
  • Radikale Umstrukturierung des Hypertextes für HypTree +
  • +
  • Seiten teilweise überarbeitet +
  • +
+ +

Version 1.95 +

+
    +
  • Bugfixes bei den Trap-Nummern von (X)BIOS +
  • +
  • Funktionsnummern der Falcon-XBIOS-Routinen hinzugefügt (Dank +an Ben-Jamin Wilke) +
  • +
  • Beschreibung des Shutdown in MagiC Mac +
  • +
  • Beschreibung des ARGV-Verfahrens in MagiC +
  • +
  • Beschreibung des MagiC-spezifischen 3D-Looks +
  • +
  • Beschreibung der MAGX.INF Datei von MagiC +
  • +
  • Beschreibung der GEMDOS-Funktion Sconfig +
  • +
  • weitere GEMDOS-Specials von MagiC +
  • +
  • Beschreibung der AES-Funktion menu_popup +
  • +
  • Beschreibung der AES-Funktion menu_settings +
  • +
  • AES bzgl. MagiC 3 überarbeitet +
  • +
  • Unterstützung des Font-Protokolls +
  • +
  • Seiten teilweise überarbeitet +
  • +
+ +

Version 1.80 +

+
    +
  • GEMDOS bzgl. MagiC3 überarbeitet +
  • +
  • Seiten teilweise überarbeitet +
  • +
+ +

Version 1.70 +

+
    +
  • Beschreibung des AES Bindings +
  • +
  • Beschreibung des VDI Bindings +
  • +
  • Beschreibung des Mindestfunktionsumfangs für die verschiedenen +GDOS-Gerätetreiber +
  • +
  • MagiC Mac Spezifika +
  • +
  • Beschreibung des Laufwerks U: in MagiC +
  • +
  • Beschreibung des Hintergrund-DMA in MagiC +
  • +
  • neue Tips zum Iconifying +
  • +
  • Unterstützung weiterer Datentypen/Strukturen +
  • +
  • Seiten teilweise überarbeitet +
  • +
+ +

Version 1.50 +

+
    +
  • Unterstützung von NVDI (bis Version 3.02) +
  • +
  • neuer Modus für objc_sysvar +
  • +
  • neue Modi für Fopen +
  • +
  • TEDINFO vervollständigt +
  • +
  • Fehlermeldungen (GEMDOS) überarbeitet +
  • +
  • Seiten teilweise überarbeitet +
  • +
+ +

Version 1.30 +

+
    +
  • Beschreibung von XControl (Teil-2) +
  • +
  • Objekttypen überarbeitet +
  • +
  • Mxalloc überarbeitet +
  • +
  • Beschreibung der Systemvektoren +
  • +
  • Beschreibung der xgrf-Funktionen +
  • +
  • Hypertext besser strukturiert +
  • +
  • Seiten teilweise überarbeitet +
  • +
+ +

Version 1.20 +

+
    +
  • Beschreibung des XIMG-Formats +
  • +
  • Erste Seiten an MagiC 3 angepaßt +
  • +
  • Funktionsnummern der AES- und VDI-Routinen hinzugefügt. +
  • +
  • Hinweise zur Unterstützung fremder Dateisysteme (Teil-1) +
  • +
  • Beschreibung von XControl +
  • +
  • Index überarbeitet +
  • +
  • viele Seiten nochmals überarbeitet +
  • +
+ +

Version 1.10 +

+
    +
  • Liste der System-Cookies überarbeitet +
  • +
  • Beschreibung des VSCR-Protokolls +
  • +
  • Belegung des NVM der Echtzeituhr +
  • +
  • Seiten teilweise überarbeitet +
  • +
+ +

Version 1.00 +

+
    +
  • Beschreibung des ARGV-Verfahrens +
  • +
  • Beschreibung des Drag&Drop-Protokolls +
  • +
  • grafische Übersicht geändert +
  • +
  • Index stark überarbeitet +
  • +
  • Seiten teilweise überarbeitet +
  • +
+ +

Version 0.99 +

+
    +
  • Beschreibung des Cookie-Jars, sowie der wichtigsten Cookies +
  • +
  • Beschreibung der Systemvariablen +
  • +
  • Beschreibung des XBRA-Verfahrens +
  • +
  • Index überarbeitet +
  • +
  • Seiten teilweise überarbeitet +
  • +
+ +

Version 0.98 +

+
    +
  • Bugfixes bei den Routinen appl_getinfo und appl_search (Dank an Dirk Haun) +
  • +
  • Beschreibung der MetaDOS Funktionen +
  • +
  • CD ROM Opcodes für Fcntl +
  • +
  • Hypertext besser strukturiert +
  • +
  • Seiten teilweise überarbeitet +
  • +
+ +

Version 0.97 +

+
    +
  • Unterstützung weiterer Datentypen +
  • +
  • Datentypen auf portables Format umgestellt (z.B. WORD statt int) +
  • +
  • Neues Kapitel über Style-Guidelines (Teil-1) +
  • +
  • Einbindung weiterer Grafiken +
  • +
  • Hypertext besser strukturiert +
  • +
  • neue Komponente für wind_create +
  • +
  • viele Seiten nochmals überarbeitet +
  • +
+ +

Version 0.96 +

+
    +
  • aktuelle Beschreibung der TEDINFO-Struktur +
  • +
  • es gibt nun eine grafische Übersicht über den +grundsätzlichen Aufbau des Hypertextes bzw. des TOS +
  • +
  • Beschreibung der wichtigsten GDOS-Treiber, sowie des Aufbaus der +ASSIGN.SYS-Datei +
  • +
  • Hypertext besser strukturiert +
  • +
  • Seiten teilweise überarbeitet +
  • +
+ +

Version 0.95 +

+
    +
  • viele Seiten überarbeitet (VDI fast komplett) +
  • +
+ +

Version 0.90 +

+
    +
  • neue Modi für wind_get/wind_set Fensterverwaltung +
  • +
  • Beschreibung der neuen AES-Messages +
  • +
  • es gibt nun einen Querverweis auf den Hypertext newdesk.hyp, welcher +das Format der NEWDESK.INF Datei des Desktops beschreibt +
  • +
  • Seiten teilweise überarbeitet, AES komplett überarbeitet +bzw. vervollständigt. +
  • +
+ +

Version 0.85 +

+
    +
  • GEMDOS wesentlich überarbeitet +
  • +
+ +

Version 0.80 +

+
    +
  • Unterstützung von SpeedoGDOS (Teil-1) +
  • +
  • Beschreibung der AES-Funktion objc_sysvar +
  • +
  • Beschreibung der erweiterten appl_find Features +
  • +
  • Beschreibung der neuen shel_write Features +
  • +
  • Beschreibung der AES-Funktion objc_xfind +
  • +
  • Beschreibung der neuen Objektflags +
  • +
  • Einbindung erster Grafiken +
  • +
  • viele Seiten überarbeitet, BIOS und XBIOS komplett überarbeitet bzw. +vervollständigt. +
  • +
+ +

Version 0.70 +

+
    +
  • Unterstützung weiterer Datentypen +
  • +
  • Beschreibung der neuen Pexec-Modi +
  • +
  • Beschreibung der erweiterten Mxalloc-Funktion +
  • +
  • Seiten optisch sehr stark überarbeitet +
  • +
+ +

Version 0.60 +

+
    +
  • Beschreibung der XHDI-Spezifikation (Version 1.25) +
  • +
  • MiNT kompatible Funktionen (Teil-1) +
  • +
  • Fehlermeldungen des GEMDOS +
  • +
+ +

Version 0.50 +

+
    +
  • Unterstützung von NVDI (z.Zt. erst Version 2.50) +
  • +
  • Beschreibung des AV-Protokolls von Gemini +
  • +
  • Unterstützung von Datentypen +
  • +
  • Seiten optisch überarbeitet +
  • +
+ +

Version 0.40 +

+
    +
  • Erste öffentliche Version +
  • +
+ +
+ +Home +IntroductionIntroduction +Old foreword by Rolf KotzianOld foreword by Rolf Kotzian +The GNU General Public LicenceThe GNU General Public Licence + + diff --git a/en/index.html b/en/index.html new file mode 100644 index 000000000..6cc751af1 --- /dev/null +++ b/en/index.html @@ -0,0 +1,79 @@ + + + + + +The documentation for TOS + + + + + + + + + +Home + + +IntroductionIntroduction + +
+ +
+

The documentation for

+

TOS

+

+tos.hyp
+November 22, 2024
+

+


+ +
+

Contents

+ +
+

Appendix

+ +
+

Index

+ +
+
+
+ +Home + + +IntroductionIntroduction + + diff --git a/en/index.ulh b/en/index.ulh new file mode 100644 index 000000000..4ec6b0e51 --- /dev/null +++ b/en/index.ulh @@ -0,0 +1,38 @@ +######## errors, warnings and notes: + + +######## information: + +source file: /home/runner/work/tos.hyp/tos.hyp/tos_hyp.u + +Warnings: 0 +Notes: 0 +Errors: 0 + +Nodes: 25 +Subnodes: 208 +Subsubnodes: 1638 +Subsubsubnodes: 2027 +Subsubsubsubnodes: 95 +Subsubsubsubsubnodes: 2 +Subsubsubsubsubsubnodes: 0 +Subsubsubsubsubsubsubnodes: 0 +Subsubsubsubsubsubsubsubnodes: 0 +Total nodes: 3996 +Macros: 2 +Defines: 21 +Hyphens: 0 + +started: 19:51:20 +finished: 19:51:22 + +GIF written to /home/runner/work/tos.hyp/tos.hyp/gh-pages/en/udo_hm.gif +GIF written to /home/runner/work/tos.hyp/tos.hyp/gh-pages/en/udo_up.gif +GIF written to /home/runner/work/tos.hyp/tos.hyp/gh-pages/en/udo_lf.gif +GIF written to /home/runner/work/tos.hyp/tos.hyp/gh-pages/en/udo_rg.gif +GIF written to /home/runner/work/tos.hyp/tos.hyp/gh-pages/en/udo_nohm.gif +GIF written to /home/runner/work/tos.hyp/tos.hyp/gh-pages/en/udo_noup.gif +GIF written to /home/runner/work/tos.hyp/tos.hyp/gh-pages/en/udo_nolf.gif +GIF written to /home/runner/work/tos.hyp/tos.hyp/gh-pages/en/udo_norg.gif +Tree file written to /home/runner/work/tos.hyp/tos.hyp/gh-pages/en/index.uth +Output written to /home/runner/work/tos.hyp/tos.hyp/gh-pages/en/index.html diff --git a/en/index.uth b/en/index.uth new file mode 100644 index 000000000..9ab64d9da --- /dev/null +++ b/en/index.uth @@ -0,0 +1,6150 @@ +/home/runner/work/tos.hyp/tos.hyp/tos_hyp.u +|----config.u +|----hyphen.ui +|----hyphen_en.ui +|----macros.ui +|----anhang/hilfe.u +|----anhang/neu.u +|----|----anhang/changes/05_01.ui +|----|----anhang/changes/05_00.ui +|----|----anhang/changes/04_99.ui +|----|----anhang/changes/04_98.ui +|----|----anhang/changes/04_97.ui +|----|----anhang/changes/04_96.ui +|----|----anhang/changes/04_95.ui +|----|----anhang/changes/04_94.ui +|----|----anhang/changes/04_93.ui +|----|----anhang/changes/04_92.ui +|----|----anhang/changes/04_91.ui +|----|----anhang/changes/04_90.ui +|----|----anhang/changes/old.ui +|----anhang/gpl.ui +|----tos/tosmain.u +|----|----tos/tos_en.ui +|----bios/bios.u +|----|----bios/bios_en.ui +|----|----|----bios/bios_trap.ui +|----|----|----bios/function/bconin.u +|----|----|----bios/function/bconout.u +|----|----|----bios/function/bconstat.u +|----|----|----bios/function/bcostat.u +|----|----|----bios/function/drvmap.u +|----|----|----bios/function/getbpb.u +|----|----|----bios/function/getmpb.u +|----|----|----bios/function/kbshift.u +|----|----|----bios/function/mediach.u +|----|----|----bios/function/rwabs.u +|----|----|----bios/function/setexc.u +|----|----|----bios/function/tickcal.u +|----|----|----bios/sys_var_en.u +|----|----|----bios/sys_vec_en.ui +|----|----bios/cookie/cookie.u +|----|----|----bios/cookie/cookie_en.ui +|----|----|----|----bios/cookie/example_en.ui +|----|----|----|----bios/cookie/list.ui +|----|----|----|----|----bios/cookie/description/3DMN.ui +|----|----|----|----|----bios/cookie/description/3RDB.ui +|----|----|----|----|----bios/cookie/description/60Hz.ui +|----|----|----|----|----bios/cookie/description/8_8.ui +|----|----|----|----|----bios/cookie/description/A2sv.ui +|----|----|----|----|----bios/cookie/description/AB40.ui +|----|----|----|----|----bios/cookie/description/ACCS.ui +|----|----|----|----|----bios/cookie/description/AFnt.ui +|----|----|----|----|----bios/cookie/description/AgK0.ui +|----|----|----|----|----bios/cookie/description/AHVR.ui +|----|----|----|----|----bios/cookie/description/ALHP.ui +|----|----|----|----|----bios/cookie/description/ALIC.ui +|----|----|----|----|----bios/cookie/description/ALRM.ui +|----|----|----|----|----bios/cookie/description/AmAN.ui +|----|----|----|----|----bios/cookie/description/AMC1.ui +|----|----|----|----|----bios/cookie/description/AMC2.ui +|----|----|----|----|----bios/cookie/description/AMCG.ui +|----|----|----|----|----bios/cookie/description/ANSe.ui +|----|----|----|----|----bios/cookie/description/APGM.ui +|----|----|----|----|----bios/cookie/description/ARAe.ui +|----|----|----|----|----bios/cookie/description/ARTS.ui +|----|----|----|----|----bios/cookie/description/asGT.ui +|----|----|----|----|----bios/cookie/description/ASum.ui +|----|----|----|----|----bios/cookie/description/AVmw.ui +|----|----|----|----|----bios/cookie/description/AVOJ.ui +|----|----|----|----|----bios/cookie/description/AVSV.ui +|----|----|----|----|----bios/cookie/description/BASH.ui +|----|----|----|----|----bios/cookie/description/BBD2.ui +|----|----|----|----|----bios/cookie/description/BCKW.ui +|----|----|----|----|----bios/cookie/description/BGEM.ui +|----|----|----|----|----bios/cookie/description/BGHD.ui +|----|----|----|----|----bios/cookie/description/BHdl.ui +|----|----|----|----|----bios/cookie/description/BHLP.ui +|----|----|----|----|----bios/cookie/description/BIGS.ui +|----|----|----|----|----bios/cookie/description/BIOC.ui +|----|----|----|----|----bios/cookie/description/BLNK.ui +|----|----|----|----|----bios/cookie/description/BLOW.ui +|----|----|----|----|----bios/cookie/description/BScn.ui +|----|----|----|----|----bios/cookie/description/BSIM.ui +|----|----|----|----|----bios/cookie/description/BSTE.ui +|----|----|----|----|----bios/cookie/description/BUG1.ui +|----|----|----|----|----bios/cookie/description/C24P.ui +|----|----|----|----|----bios/cookie/description/CACH.ui +|----|----|----|----|----bios/cookie/description/CALD.ui +|----|----|----|----|----bios/cookie/description/CASE.ui +|----|----|----|----|----bios/cookie/description/CatS.ui +|----|----|----|----|----bios/cookie/description/CaTT.ui +|----|----|----|----|----bios/cookie/description/CB2K.ui +|----|----|----|----|----bios/cookie/description/CBCE.ui +|----|----|----|----|----bios/cookie/description/CBDF.ui +|----|----|----|----|----bios/cookie/description/CBHD.ui +|----|----|----|----|----bios/cookie/description/CBHY.ui +|----|----|----|----|----bios/cookie/description/CBIT.ui +|----|----|----|----|----bios/cookie/description/CBTS.ui +|----|----|----|----|----bios/cookie/description/CCDA.ui +|----|----|----|----|----bios/cookie/description/cdMC.ui +|----|----|----|----|----bios/cookie/description/CDOT.ui +|----|----|----|----|----bios/cookie/description/ceci.ui +|----|----|----|----|----bios/cookie/description/CFIX.ui +|----|----|----|----|----bios/cookie/description/CFsl.ui +|----|----|----|----|----bios/cookie/description/CHAM.ui +|----|----|----|----|----bios/cookie/description/CHBT.ui +|----|----|----|----|----bios/cookie/description/CHN1.ui +|----|----|----|----|----bios/cookie/description/CHNG.ui +|----|----|----|----|----bios/cookie/description/CHTW.ui +|----|----|----|----|----bios/cookie/description/CICN.ui +|----|----|----|----|----bios/cookie/description/CISY.ui +|----|----|----|----|----bios/cookie/description/CJar.ui +|----|----|----|----|----bios/cookie/description/CJAR_.ui +|----|----|----|----|----bios/cookie/description/ck01.ui +|----|----|----|----|----bios/cookie/description/CKBD.ui +|----|----|----|----|----bios/cookie/description/CKJR.ui +|----|----|----|----|----bios/cookie/description/CLCK.ui +|----|----|----|----|----bios/cookie/description/CLK1.ui +|----|----|----|----|----bios/cookie/description/CLOK.ui +|----|----|----|----|----bios/cookie/description/CM16.ui +|----|----|----|----|----bios/cookie/description/CNTS.ui +|----|----|----|----|----bios/cookie/description/COLO.ui +|----|----|----|----|----bios/cookie/description/CPSL.ui +|----|----|----|----|----bios/cookie/description/CRAC.ui +|----|----|----|----|----bios/cookie/description/CRIT.ui +|----|----|----|----|----bios/cookie/description/CSMD.ui +|----|----|----|----|----bios/cookie/description/CT40.ui +|----|----|----|----|----bios/cookie/description/CT60.ui +|----|----|----|----|----bios/cookie/description/CTCH.ui +|----|----|----|----|----bios/cookie/description/CtCp.ui +|----|----|----|----|----bios/cookie/description/CTSF.ui +|----|----|----|----|----bios/cookie/description/cVDI.ui +|----|----|----|----|----bios/cookie/description/CWCo.ui +|----|----|----|----|----bios/cookie/description/DATE.ui +|----|----|----|----|----bios/cookie/description/DATL.ui +|----|----|----|----|----bios/cookie/description/DAWN.ui +|----|----|----|----|----bios/cookie/description/DBFX.ui +|----|----|----|----|----bios/cookie/description/DCdd.ui +|----|----|----|----|----bios/cookie/description/DCF7.ui +|----|----|----|----|----bios/cookie/description/DCSD.ui +|----|----|----|----|----bios/cookie/description/DECD.ui +|----|----|----|----|----bios/cookie/description/DEPI.ui +|----|----|----|----|----bios/cookie/description/DHST.ui +|----|----|----|----|----bios/cookie/description/DIG2.ui +|----|----|----|----|----bios/cookie/description/DJBX.ui +|----|----|----|----|----bios/cookie/description/DKEY.ui +|----|----|----|----|----bios/cookie/description/DNTR.ui +|----|----|----|----|----bios/cookie/description/DPAT.ui +|----|----|----|----|----bios/cookie/description/DPRS.ui +|----|----|----|----|----bios/cookie/description/DRIV.ui +|----|----|----|----|----bios/cookie/description/DRRH.ui +|----|----|----|----|----bios/cookie/description/Dsel.ui +|----|----|----|----|----bios/cookie/description/DSSO.ui +|----|----|----|----|----bios/cookie/description/DYDL.ui +|----|----|----|----|----bios/cookie/description/DYJA.ui +|----|----|----|----|----bios/cookie/description/DYJD.ui +|----|----|----|----|----bios/cookie/description/DYJT.ui +|----|----|----|----|----bios/cookie/description/DYNL.ui +|----|----|----|----|----bios/cookie/description/DYwl.ui +|----|----|----|----|----bios/cookie/description/EADC.ui +|----|----|----|----|----bios/cookie/description/EBPO.ui +|----|----|----|----|----bios/cookie/description/EdDI.ui +|----|----|----|----|----bios/cookie/description/EDFX.ui +|----|----|----|----|----bios/cookie/description/EGON.ui +|----|----|----|----|----bios/cookie/description/EMNP.ui +|----|----|----|----|----bios/cookie/description/ENV$.ui +|----|----|----|----|----bios/cookie/description/ENVN.ui +|----|----|----|----|----bios/cookie/description/ENVR.ui +|----|----|----|----|----bios/cookie/description/EPro.ui +|----|----|----|----|----bios/cookie/description/F117.ui +|----|----|----|----|----bios/cookie/description/ETM.ui +|----|----|----|----|----bios/cookie/description/EURO.ui +|----|----|----|----|----bios/cookie/description/EUSB.ui +|----|----|----|----|----bios/cookie/description/EXRA.ui +|----|----|----|----|----bios/cookie/description/EXTD.ui +|----|----|----|----|----bios/cookie/description/FaKE.ui +|----|----|----|----|----bios/cookie/description/FALT.ui +|----|----|----|----|----bios/cookie/description/FAX_.ui +|----|----|----|----|----bios/cookie/description/FAXR.ui +|----|----|----|----|----bios/cookie/description/FHFX.ui +|----|----|----|----|----bios/cookie/description/FIX2.ui +|----|----|----|----|----bios/cookie/description/FLTP.ui +|----|----|----|----|----bios/cookie/description/FLXD.ui +|----|----|----|----|----bios/cookie/description/fMSX.ui +|----|----|----|----|----bios/cookie/description/Fose.ui +|----|----|----|----|----bios/cookie/description/FOse_.ui +|----|----|----|----|----bios/cookie/description/FrmD.ui +|----|----|----|----|----bios/cookie/description/FSEL.ui +|----|----|----|----|----bios/cookie/description/FSER.ui +|----|----|----|----|----bios/cookie/description/FSMC.ui +|----|----|----|----|----bios/cookie/description/FSmp.ui +|----|----|----|----|----bios/cookie/description/fVDI.ui +|----|----|----|----|----bios/cookie/description/FxOP.ui +|----|----|----|----|----bios/cookie/description/F_3D.ui +|----|----|----|----|----bios/cookie/description/GABI.ui +|----|----|----|----|----bios/cookie/description/GBel.ui +|----|----|----|----|----bios/cookie/description/GCOM.ui +|----|----|----|----|----bios/cookie/description/GDEV.ui +|----|----|----|----|----bios/cookie/description/GEHC.ui +|----|----|----|----|----bios/cookie/description/GEHD.ui +|----|----|----|----|----bios/cookie/description/GEMB.ui +|----|----|----|----|----bios/cookie/description/GENV.ui +|----|----|----|----|----bios/cookie/description/Gfix.ui +|----|----|----|----|----bios/cookie/description/GI30.ui +|----|----|----|----|----bios/cookie/description/GIGA.ui +|----|----|----|----|----bios/cookie/description/gk5_.ui +|----|----|----|----|----bios/cookie/description/gkCO.ui +|----|----|----|----|----bios/cookie/description/GLAS.ui +|----|----|----|----|----bios/cookie/description/GLBL.ui +|----|----|----|----|----bios/cookie/description/GMNI.ui +|----|----|----|----|----bios/cookie/description/GMTC.ui +|----|----|----|----|----bios/cookie/description/GNUC.ui +|----|----|----|----|----bios/cookie/description/Gnva.ui +|----|----|----|----|----bios/cookie/description/GOBJ.ui +|----|----|----|----|----bios/cookie/description/GOff.ui +|----|----|----|----|----bios/cookie/description/GSND.ui +|----|----|----|----|----bios/cookie/description/GSP1.ui +|----|----|----|----|----bios/cookie/description/GSXB.ui +|----|----|----|----|----bios/cookie/description/GULM.ui +|----|----|----|----|----bios/cookie/description/HABO.ui +|----|----|----|----|----bios/cookie/description/hade.ui +|----|----|----|----|----bios/cookie/description/HAMM.ui +|----|----|----|----|----bios/cookie/description/HBFS.ui +|----|----|----|----|----bios/cookie/description/HcP6.ui +|----|----|----|----|----bios/cookie/description/HDDR.ui +|----|----|----|----|----bios/cookie/description/HDEX.ui +|----|----|----|----|----bios/cookie/description/HDEY.ui +|----|----|----|----|----bios/cookie/description/HDJR.ui +|----|----|----|----|----bios/cookie/description/HDLD.ui +|----|----|----|----|----bios/cookie/description/HDPR.ui +|----|----|----|----|----bios/cookie/description/HDRC.ui +|----|----|----|----|----bios/cookie/description/HDST.ui +|----|----|----|----|----bios/cookie/description/HDSW.ui +|----|----|----|----|----bios/cookie/description/HFIX.ui +|----|----|----|----|----bios/cookie/description/hFRB.ui +|----|----|----|----|----bios/cookie/description/HIDS.ui +|----|----|----|----|----bios/cookie/description/HMDU.ui +|----|----|----|----|----bios/cookie/description/HMOC.ui +|----|----|----|----|----bios/cookie/description/HMRD.ui +|----|----|----|----|----bios/cookie/description/HMRS.ui +|----|----|----|----|----bios/cookie/description/HPHC.ui +|----|----|----|----|----bios/cookie/description/HPLJ.ui +|----|----|----|----|----bios/cookie/description/HSCD.ui +|----|----|----|----|----bios/cookie/description/HSND.ui +|----|----|----|----|----bios/cookie/description/HWAM.ui +|----|----|----|----|----bios/cookie/description/IBMP.ui +|----|----|----|----|----bios/cookie/description/ICFS.ui +|----|----|----|----|----bios/cookie/description/ICST.ui +|----|----|----|----|----bios/cookie/description/IDSK.ui +|----|----|----|----|----bios/cookie/description/IMAC.ui +|----|----|----|----|----bios/cookie/description/IMNE.ui +|----|----|----|----|----bios/cookie/description/INSJ.ui +|----|----|----|----|----bios/cookie/description/INXR.ui +|----|----|----|----|----bios/cookie/description/iPRN.ui +|----|----|----|----|----bios/cookie/description/IRSB.ui +|----|----|----|----|----bios/cookie/description/iTMA.ui +|----|----|----|----|----bios/cookie/description/JAM1.ui +|----|----|----|----|----bios/cookie/description/JANU.ui +|----|----|----|----|----bios/cookie/description/JB2G.ui +|----|----|----|----|----bios/cookie/description/JCLK.ui +|----|----|----|----|----bios/cookie/description/JCNB.ui +|----|----|----|----|----bios/cookie/description/JCNC.ui +|----|----|----|----|----bios/cookie/description/JCNH.ui +|----|----|----|----|----bios/cookie/description/JCNT.ui +|----|----|----|----|----bios/cookie/description/JFTP.ui +|----|----|----|----|----bios/cookie/description/JINX.ui +|----|----|----|----|----bios/cookie/description/JMLB.ui +|----|----|----|----|----bios/cookie/description/JMLS.ui +|----|----|----|----|----bios/cookie/description/JSHD.ui +|----|----|----|----|----bios/cookie/description/JUST.ui +|----|----|----|----|----bios/cookie/description/J_Sc.ui +|----|----|----|----|----bios/cookie/description/KAOS.ui +|----|----|----|----|----bios/cookie/description/KbEv.ui +|----|----|----|----|----bios/cookie/description/KEYT.ui +|----|----|----|----|----bios/cookie/description/KGTF.ui +|----|----|----|----|----bios/cookie/description/KIDI.ui +|----|----|----|----|----bios/cookie/description/KLME.ui +|----|----|----|----|----bios/cookie/description/KREG.ui +|----|----|----|----|----bios/cookie/description/KyMp.ui +|----|----|----|----|----bios/cookie/description/KyWt.ui +|----|----|----|----|----bios/cookie/description/Lace.ui +|----|----|----|----|----bios/cookie/description/LACY.ui +|----|----|----|----|----bios/cookie/description/LALA.ui +|----|----|----|----|----bios/cookie/description/lanc.ui +|----|----|----|----|----bios/cookie/description/LASB.ui +|----|----|----|----|----bios/cookie/description/LAWC.ui +|----|----|----|----|----bios/cookie/description/LDGM.ui +|----|----|----|----|----bios/cookie/description/LEDP.ui +|----|----|----|----|----bios/cookie/description/LEmu.ui +|----|----|----|----|----bios/cookie/description/Lity.ui +|----|----|----|----|----bios/cookie/description/LLCR.ui +|----|----|----|----|----bios/cookie/description/LMus.ui +|----|----|----|----|----bios/cookie/description/LOGB.ui +|----|----|----|----|----bios/cookie/description/LoSe.ui +|----|----|----|----|----bios/cookie/description/LPCD.ui +|----|----|----|----|----bios/cookie/description/LPJM.ui +|----|----|----|----|----bios/cookie/description/LP_2.ui +|----|----|----|----|----bios/cookie/description/LTMF.ui +|----|----|----|----|----bios/cookie/description/M16s.ui +|----|----|----|----|----bios/cookie/description/M16X.ui +|----|----|----|----|----bios/cookie/description/macc.ui +|----|----|----|----|----bios/cookie/description/MADD.ui +|----|----|----|----|----bios/cookie/description/MADN.ui +|----|----|----|----|----bios/cookie/description/Maes.ui +|----|----|----|----|----bios/cookie/description/MagC.ui +|----|----|----|----|----bios/cookie/description/MAGN.ui +|----|----|----|----|----bios/cookie/description/MagX.ui +|----|----|----|----|----bios/cookie/description/MAST.ui +|----|----|----|----|----bios/cookie/description/MaTC.ui +|----|----|----|----|----bios/cookie/description/MbAr.ui +|----|----|----|----|----bios/cookie/description/MBRD.ui +|----|----|----|----|----bios/cookie/description/MCL_.ui +|----|----|----|----|----bios/cookie/description/McSn.ui +|----|----|----|----|----bios/cookie/description/MCSP.ui +|----|----|----|----|----bios/cookie/description/MCWR.ui +|----|----|----|----|----bios/cookie/description/MDIA.ui +|----|----|----|----|----bios/cookie/description/MDRK.ui +|----|----|----|----|----bios/cookie/description/MDSa.ui +|----|----|----|----|----bios/cookie/description/MFAC.ui +|----|----|----|----|----bios/cookie/description/MFFM.ui +|----|----|----|----|----bios/cookie/description/MFIX.ui +|----|----|----|----|----bios/cookie/description/MFMV.ui +|----|----|----|----|----bios/cookie/description/MFNT.ui +|----|----|----|----|----bios/cookie/description/MGEM.ui +|----|----|----|----|----bios/cookie/description/MgMc.ui +|----|----|----|----|----bios/cookie/description/MgMx.ui +|----|----|----|----|----bios/cookie/description/MgPC.ui +|----|----|----|----|----bios/cookie/description/MgSn.ui +|----|----|----|----|----bios/cookie/description/MID3.ui +|----|----|----|----|----bios/cookie/description/MIMA.ui +|----|----|----|----|----bios/cookie/description/MiNT.ui +|----|----|----|----|----bios/cookie/description/MIPS.ui +|----|----|----|----|----bios/cookie/description/MJAF.ui +|----|----|----|----|----bios/cookie/description/MKHC.ui +|----|----|----|----|----bios/cookie/description/MkJr.ui +|----|----|----|----|----bios/cookie/description/MM2X.ui +|----|----|----|----|----bios/cookie/description/MMAC.ui +|----|----|----|----|----bios/cookie/description/MMUT.ui +|----|----|----|----|----bios/cookie/description/MM_2.ui +|----|----|----|----|----bios/cookie/description/MN3D.ui +|----|----|----|----|----bios/cookie/description/MNAM.ui +|----|----|----|----|----bios/cookie/description/MOAF.ui +|----|----|----|----|----bios/cookie/description/MOGR.ui +|----|----|----|----|----bios/cookie/description/MPRO.ui +|----|----|----|----|----bios/cookie/description/MRAM.ui +|----|----|----|----|----bios/cookie/description/MSPD.ui +|----|----|----|----|----bios/cookie/description/MSPO.ui +|----|----|----|----|----bios/cookie/description/mstx.ui +|----|----|----|----|----bios/cookie/description/MTCI.ui +|----|----|----|----|----bios/cookie/description/MTft.ui +|----|----|----|----|----bios/cookie/description/MUPF.ui +|----|----|----|----|----bios/cookie/description/MWHL.ui +|----|----|----|----|----bios/cookie/description/MZTR.ui +|----|----|----|----|----bios/cookie/description/MZVT.ui +|----|----|----|----|----bios/cookie/description/M_IN.ui +|----|----|----|----|----bios/cookie/description/N203.ui +|----|----|----|----|----bios/cookie/description/nAES.ui +|----|----|----|----|----bios/cookie/description/NAH3.ui +|----|----|----|----|----bios/cookie/description/NBEL.ui +|----|----|----|----|----bios/cookie/description/NBLL.ui +|----|----|----|----|----bios/cookie/description/NCLN.ui +|----|----|----|----|----bios/cookie/description/ne2k.ui +|----|----|----|----|----bios/cookie/description/NERV.ui +|----|----|----|----|----bios/cookie/description/NETS.ui +|----|----|----|----|----bios/cookie/description/NEXB.ui +|----|----|----|----|----bios/cookie/description/NEXK.ui +|----|----|----|----|----bios/cookie/description/NFMT.ui +|----|----|----|----|----bios/cookie/description/NFnt.ui +|----|----|----|----|----bios/cookie/description/NKCC.ui +|----|----|----|----|----bios/cookie/description/NLdr.ui +|----|----|----|----|----bios/cookie/description/NMGE.ui +|----|----|----|----|----bios/cookie/description/NO7P.ui +|----|----|----|----|----bios/cookie/description/noCF.ui +|----|----|----|----|----bios/cookie/description/NOR5.ui +|----|----|----|----|----bios/cookie/description/NOVA.ui +|----|----|----|----|----bios/cookie/description/NSC1.ui +|----|----|----|----|----bios/cookie/description/Nspd.ui +|----|----|----|----|----bios/cookie/description/nTAS.ui +|----|----|----|----|----bios/cookie/description/NTK4.ui +|----|----|----|----|----bios/cookie/description/nTOS.ui +|----|----|----|----|----bios/cookie/description/NUL_.ui +|----|----|----|----|----bios/cookie/description/NVDI.ui +|----|----|----|----|----bios/cookie/description/OBNL.ui +|----|----|----|----|----bios/cookie/description/OFLS.ui +|----|----|----|----|----bios/cookie/description/OPMM.ui +|----|----|----|----|----bios/cookie/description/OSBL.ui +|----|----|----|----|----bios/cookie/description/OSTT.ui +|----|----|----|----|----bios/cookie/description/OTOS.ui +|----|----|----|----|----bios/cookie/description/OV24.ui +|----|----|----|----|----bios/cookie/description/oVDI.ui +|----|----|----|----|----bios/cookie/description/OVDJ.ui +|----|----|----|----|----bios/cookie/description/OVEP.ui +|----|----|----|----|----bios/cookie/description/OVER.ui +|----|----|----|----|----bios/cookie/description/OVEX.ui +|----|----|----|----|----bios/cookie/description/OVFS.ui +|----|----|----|----|----bios/cookie/description/OVIM.ui +|----|----|----|----|----bios/cookie/description/OVLS.ui +|----|----|----|----|----bios/cookie/description/OVRD.ui +|----|----|----|----|----bios/cookie/description/OVUT.ui +|----|----|----|----|----bios/cookie/description/OVWI.ui +|----|----|----|----|----bios/cookie/description/PAMN.ui +|----|----|----|----|----bios/cookie/description/PAUL.ui +|----|----|----|----|----bios/cookie/description/PBUG.ui +|----|----|----|----|----bios/cookie/description/PDEB.ui +|----|----|----|----|----bios/cookie/description/PDOS.ui +|----|----|----|----|----bios/cookie/description/PDRZ.ui +|----|----|----|----|----bios/cookie/description/PFIX.ui +|----|----|----|----|----bios/cookie/description/Pinp.ui +|----|----|----|----|----bios/cookie/description/PKSH.ui +|----|----|----|----|----bios/cookie/description/PMMU.ui +|----|----|----|----|----bios/cookie/description/POIS.ui +|----|----|----|----|----bios/cookie/description/POWM.ui +|----|----|----|----|----bios/cookie/description/PRCS.ui +|----|----|----|----|----bios/cookie/description/PRDS.ui +|----|----|----|----|----bios/cookie/description/PRMD.ui +|----|----|----|----|----bios/cookie/description/PRN!.ui +|----|----|----|----|----bios/cookie/description/PRNSS.ui +|----|----|----|----|----bios/cookie/description/PRO5.ui +|----|----|----|----|----bios/cookie/description/PROB.ui +|----|----|----|----|----bios/cookie/description/PROT.ui +|----|----|----|----|----bios/cookie/description/PRTD.ui +|----|----|----|----|----bios/cookie/description/PRTO.ui +|----|----|----|----|----bios/cookie/description/prtr.ui +|----|----|----|----|----bios/cookie/description/PRTR_.ui +|----|----|----|----|----bios/cookie/description/PSND.ui +|----|----|----|----|----bios/cookie/description/PSSG.ui +|----|----|----|----|----bios/cookie/description/PTOS.ui +|----|----|----|----|----bios/cookie/description/QIKM.ui +|----|----|----|----|----bios/cookie/description/QMAC.ui +|----|----|----|----|----bios/cookie/description/QMCP.ui +|----|----|----|----|----bios/cookie/description/QST2.ui +|----|----|----|----|----bios/cookie/description/QST3.ui +|----|----|----|----|----bios/cookie/description/QUAN.ui +|----|----|----|----|----bios/cookie/description/RAIL.ui +|----|----|----|----|----bios/cookie/description/RaSn.ui +|----|----|----|----|----bios/cookie/description/RESG.ui +|----|----|----|----|----bios/cookie/description/RFLX.ui +|----|----|----|----|----bios/cookie/description/RFUS.ui +|----|----|----|----|----bios/cookie/description/RGUS.ui +|----|----|----|----|----bios/cookie/description/RING.ui +|----|----|----|----|----bios/cookie/description/ROMD.ui +|----|----|----|----|----bios/cookie/description/ROT8.ui +|----|----|----|----|----bios/cookie/description/RPIT.ui +|----|----|----|----|----bios/cookie/description/RREG.ui +|----|----|----|----|----bios/cookie/description/RSLT.ui +|----|----|----|----|----bios/cookie/description/RSpd.ui +|----|----|----|----|----bios/cookie/description/RSVE.ui +|----|----|----|----|----bios/cookie/description/RSVF.ui +|----|----|----|----|----bios/cookie/description/RTKC.ui +|----|----|----|----|----bios/cookie/description/RTOB.ui +|----|----|----|----|----bios/cookie/description/RWIN.ui +|----|----|----|----|----bios/cookie/description/SAM.ui +|----|----|----|----|----bios/cookie/description/SBKM.ui +|----|----|----|----|----bios/cookie/description/SBTE.ui +|----|----|----|----|----bios/cookie/description/SBTS.ui +|----|----|----|----|----bios/cookie/description/SCAH.ui +|----|----|----|----|----bios/cookie/description/SCKM.ui +|----|----|----|----|----bios/cookie/description/SCPN.ui +|----|----|----|----|----bios/cookie/description/SCRD.ui +|----|----|----|----|----bios/cookie/description/SCRN.ui +|----|----|----|----|----bios/cookie/description/SCRS.ui +|----|----|----|----|----bios/cookie/description/SCRW.ui +|----|----|----|----|----bios/cookie/description/SCSI.ui +|----|----|----|----|----bios/cookie/description/SCSV.ui +|----|----|----|----|----bios/cookie/description/SDCH.ui +|----|----|----|----|----bios/cookie/description/SDES.ui +|----|----|----|----|----bios/cookie/description/SDsk.ui +|----|----|----|----|----bios/cookie/description/SDWN.ui +|----|----|----|----|----bios/cookie/description/SELC.ui +|----|----|----|----|----bios/cookie/description/SENV.ui +|----|----|----|----|----bios/cookie/description/SFA^.ui +|----|----|----|----|----bios/cookie/description/SFIX.ui +|----|----|----|----|----bios/cookie/description/SFMN.ui +|----|----|----|----|----bios/cookie/description/ShLk.ui +|----|----|----|----|----bios/cookie/description/shlp.ui +|----|----|----|----|----bios/cookie/description/SKEY.ui +|----|----|----|----|----bios/cookie/description/SLCT.ui +|----|----|----|----|----bios/cookie/description/SLif.ui +|----|----|----|----|----bios/cookie/description/SLIP.ui +|----|----|----|----|----bios/cookie/description/SM00.ui +|----|----|----|----|----bios/cookie/description/SM01.ui +|----|----|----|----|----bios/cookie/description/SM02.ui +|----|----|----|----|----bios/cookie/description/SMAL.ui +|----|----|----|----|----bios/cookie/description/SMAU.ui +|----|----|----|----|----bios/cookie/description/SMon.ui +|----|----|----|----|----bios/cookie/description/SMTT.ui +|----|----|----|----|----bios/cookie/description/SNAP.ui +|----|----|----|----|----bios/cookie/description/SOFS.ui +|----|----|----|----|----bios/cookie/description/SOSW.ui +|----|----|----|----|----bios/cookie/description/SpcE.ui +|----|----|----|----|----bios/cookie/description/SPCK.ui +|----|----|----|----|----bios/cookie/description/SPEE.ui +|----|----|----|----|----bios/cookie/description/SPEK.ui +|----|----|----|----|----bios/cookie/description/SPEX.ui +|----|----|----|----|----bios/cookie/description/spMR.ui +|----|----|----|----|----bios/cookie/description/Spol.ui +|----|----|----|----|----bios/cookie/description/SPRG.ui +|----|----|----|----|----bios/cookie/description/SR17.ui +|----|----|----|----|----bios/cookie/description/SSND.ui +|----|----|----|----|----bios/cookie/description/ST-C.ui +|----|----|----|----|----bios/cookie/description/ST17.ui +|----|----|----|----|----bios/cookie/description/STAT.ui +|----|----|----|----|----bios/cookie/description/STEM.ui +|----|----|----|----|----bios/cookie/description/STEW.ui +|----|----|----|----|----bios/cookie/description/STFA.ui +|----|----|----|----|----bios/cookie/description/StIc.ui +|----|----|----|----|----bios/cookie/description/STiK.ui +|----|----|----|----|----bios/cookie/description/STMS.ui +|----|----|----|----|----bios/cookie/description/strk.ui +|----|----|----|----|----bios/cookie/description/STRX.ui +|----|----|----|----|----bios/cookie/description/SupV.ui +|----|----|----|----|----bios/cookie/description/SVAR.ui +|----|----|----|----|----bios/cookie/description/SVGA.ui +|----|----|----|----|----bios/cookie/description/SWAP.ui +|----|----|----|----|----bios/cookie/description/SwTm.ui +|----|----|----|----|----bios/cookie/description/SYMB.ui +|----|----|----|----|----bios/cookie/description/SYNL.ui +|----|----|----|----|----bios/cookie/description/SYNT.ui +|----|----|----|----|----bios/cookie/description/SysE.ui +|----|----|----|----|----bios/cookie/description/Syso.ui +|----|----|----|----|----bios/cookie/description/SYST.ui +|----|----|----|----|----bios/cookie/description/SZ_M.ui +|----|----|----|----|----bios/cookie/description/S_DR.ui +|----|----|----|----|----bios/cookie/description/T206.ui +|----|----|----|----|----bios/cookie/description/T2GM.ui +|----|----|----|----|----bios/cookie/description/TALK.ui +|----|----|----|----|----bios/cookie/description/TAPE.ui +|----|----|----|----|----bios/cookie/description/TASS.ui +|----|----|----|----|----bios/cookie/description/TCFS.ui +|----|----|----|----|----bios/cookie/description/TCRB.ui +|----|----|----|----|----bios/cookie/description/Tenv.ui +|----|----|----|----|----bios/cookie/description/TFIX.ui +|----|----|----|----|----bios/cookie/description/THNX.ui +|----|----|----|----|----bios/cookie/description/THRM.ui +|----|----|----|----|----bios/cookie/description/THST.ui +|----|----|----|----|----bios/cookie/description/TIM3.ui +|----|----|----|----|----bios/cookie/description/TIM5.ui +|----|----|----|----|----bios/cookie/description/TIME.ui +|----|----|----|----|----bios/cookie/description/TK40.ui +|----|----|----|----|----bios/cookie/description/TL3D.ui +|----|----|----|----|----bios/cookie/description/TLWV.ui +|----|----|----|----|----bios/cookie/description/Tmon.ui +|----|----|----|----|----bios/cookie/description/tmsW.ui +|----|----|----|----|----bios/cookie/description/TOpW.ui +|----|----|----|----|----bios/cookie/description/TOUC.ui +|----|----|----|----|----bios/cookie/description/TPat.ui +|----|----|----|----|----bios/cookie/description/TPGM.ui +|----|----|----|----|----bios/cookie/description/TRAK.ui +|----|----|----|----|----bios/cookie/description/TraP.ui +|----|----|----|----|----bios/cookie/description/Trpp.ui +|----|----|----|----|----bios/cookie/description/TRUE.ui +|----|----|----|----|----bios/cookie/description/TSEN.ui +|----|----|----|----|----bios/cookie/description/TSWP.ui +|----|----|----|----|----bios/cookie/description/TTTF.ui +|----|----|----|----|----bios/cookie/description/TUBS.ui +|----|----|----|----|----bios/cookie/description/TWFS.ui +|----|----|----|----|----bios/cookie/description/Typ1.ui +|----|----|----|----|----bios/cookie/description/UFSL.ui +|----|----|----|----|----bios/cookie/description/UIS3.ui +|----|----|----|----|----bios/cookie/description/UKB1.ui +|----|----|----|----|----bios/cookie/description/UKB3.ui +|----|----|----|----|----bios/cookie/description/un_x.ui +|----|----|----|----|----bios/cookie/description/USCK.ui +|----|----|----|----|----bios/cookie/description/USHD.ui +|----|----|----|----|----bios/cookie/description/UsNm.ui +|----|----|----|----|----bios/cookie/description/USPK.ui +|----|----|----|----|----bios/cookie/description/USRS.ui +|----|----|----|----|----bios/cookie/description/USSC.ui +|----|----|----|----|----bios/cookie/description/UTRK.ui +|----|----|----|----|----bios/cookie/description/VBLF.ui +|----|----|----|----|----bios/cookie/description/VDIp.ui +|----|----|----|----|----bios/cookie/description/VDLY.ui +|----|----|----|----|----bios/cookie/description/VECS.ui +|----|----|----|----|----bios/cookie/description/VeiL.ui +|----|----|----|----|----bios/cookie/description/VFIX.ui +|----|----|----|----|----bios/cookie/description/VFNT.ui +|----|----|----|----|----bios/cookie/description/VGAS.ui +|----|----|----|----|----bios/cookie/description/VI-2.ui +|----|----|----|----|----bios/cookie/description/View.ui +|----|----|----|----|----bios/cookie/description/VIRA.ui +|----|----|----|----|----bios/cookie/description/VMEM.ui +|----|----|----|----|----bios/cookie/description/VPCH.ui +|----|----|----|----|----bios/cookie/description/VRAM.ui +|----|----|----|----|----bios/cookie/description/VREP.ui +|----|----|----|----|----bios/cookie/description/VSco.ui +|----|----|----|----|----bios/cookie/description/VSCR.ui +|----|----|----|----|----bios/cookie/description/VSTM.ui +|----|----|----|----|----bios/cookie/description/vT52.ui +|----|----|----|----|----bios/cookie/description/VTFX.ui +|----|----|----|----|----bios/cookie/description/VXCK.ui +|----|----|----|----|----bios/cookie/description/WaHW.ui +|----|----|----|----|----bios/cookie/description/WARP.ui +|----|----|----|----|----bios/cookie/description/WaSA.ui +|----|----|----|----|----bios/cookie/description/WBrd.ui +|----|----|----|----|----bios/cookie/description/wdlg.ui +|----|----|----|----|----bios/cookie/description/WDOG.ui +|----|----|----|----|----bios/cookie/description/WEGA.ui +|----|----|----|----|----bios/cookie/description/WfNa.ui +|----|----|----|----|----bios/cookie/description/WFSL.ui +|----|----|----|----|----bios/cookie/description/WICO.ui +|----|----|----|----|----bios/cookie/description/WinK.ui +|----|----|----|----|----bios/cookie/description/WINX.ui +|----|----|----|----|----bios/cookie/description/WINZ.ui +|----|----|----|----|----bios/cookie/description/WPRO.ui +|----|----|----|----|----bios/cookie/description/WRAP.ui +|----|----|----|----|----bios/cookie/description/XALT.ui +|----|----|----|----|----bios/cookie/description/XBTN.ui +|----|----|----|----|----bios/cookie/description/XDsk.ui +|----|----|----|----|----bios/cookie/description/XFRB.ui +|----|----|----|----|----bios/cookie/description/XFS1.ui +|----|----|----|----|----bios/cookie/description/xFSL.ui +|----|----|----|----|----bios/cookie/description/Xgem.ui +|----|----|----|----|----bios/cookie/description/XHDI.ui +|----|----|----|----|----bios/cookie/description/XKBD.ui +|----|----|----|----|----bios/cookie/description/XMMU.ui +|----|----|----|----|----bios/cookie/description/XMuz.ui +|----|----|----|----|----bios/cookie/description/xNet.ui +|----|----|----|----|----bios/cookie/description/XPCI.ui +|----|----|----|----|----bios/cookie/description/xRmt.ui +|----|----|----|----|----bios/cookie/description/XSDD.ui +|----|----|----|----|----bios/cookie/description/XSND.ui +|----|----|----|----|----bios/cookie/description/XSSI.ui +|----|----|----|----|----bios/cookie/description/XTOS.ui +|----|----|----|----|----bios/cookie/description/xUAG.ui +|----|----|----|----|----bios/cookie/description/xUFC.ui +|----|----|----|----|----bios/cookie/description/XWin.ui +|----|----|----|----|----bios/cookie/description/zCAC.ui +|----|----|----|----|----bios/cookie/description/zDCF.ui +|----|----|----|----|----bios/cookie/description/_5MS.ui +|----|----|----|----|----bios/cookie/description/_AFM.ui +|----|----|----|----|----bios/cookie/description/_AKP.ui +|----|----|----|----|----bios/cookie/description/_CF_.ui +|----|----|----|----|----bios/cookie/description/_CPU.ui +|----|----|----|----|----bios/cookie/description/_DOS.ui +|----|----|----|----|----bios/cookie/description/_FDC.ui +|----|----|----|----|----bios/cookie/description/_FLK.ui +|----|----|----|----|----bios/cookie/description/_FPU.ui +|----|----|----|----|----bios/cookie/description/_FRB.ui +|----|----|----|----|----bios/cookie/description/_FSC.ui +|----|----|----|----|----bios/cookie/description/_FSR.ui +|----|----|----|----|----bios/cookie/description/_IDT.ui +|----|----|----|----|----bios/cookie/description/_INF.ui +|----|----|----|----|----bios/cookie/description/_INU.ui +|----|----|----|----|----bios/cookie/description/_ISO.ui +|----|----|----|----|----bios/cookie/description/_JPD.ui +|----|----|----|----|----bios/cookie/description/_MCF.ui +|----|----|----|----|----bios/cookie/description/_MCH.ui +|----|----|----|----|----bios/cookie/description/_MET.ui +|----|----|----|----|----bios/cookie/description/_MIL.ui +|----|----|----|----|----bios/cookie/description/_NET.ui +|----|----|----|----|----bios/cookie/description/_OOL.ui +|----|----|----|----|----bios/cookie/description/_PCI.ui +|----|----|----|----|----bios/cookie/description/_PKT.ui +|----|----|----|----|----bios/cookie/description/_PWR.ui +|----|----|----|----|----bios/cookie/description/_SLM.ui +|----|----|----|----|----bios/cookie/description/_SND.ui +|----|----|----|----|----bios/cookie/description/_SWI.ui +|----|----|----|----|----bios/cookie/description/_T2W.ui +|----|----|----|----|----bios/cookie/description/_T30.ui +|----|----|----|----|----bios/cookie/description/_USB.ui +|----|----|----|----|----bios/cookie/description/_VDI.ui +|----|----|----|----|----bios/cookie/description/_VDO.ui +|----|----|----|----|----bios/cookie/description/__NF.ui +|----|----bios/vt52.u +|----|----bios/xbra.u +|----|----bios/bios_bsim.u +|----|----|----bios/bsim/bsim_id.ui +|----|----|----bios/bsim/drv_change.ui +|----|----|----bios/bsim/drvprotec.ui +|----|----|----bios/bsim/dstate.ui +|----|----|----bios/bsim/kill_disk.ui +|----|----|----bios/bsim/load_disk.ui +|----|----|----bios/bsim/save_disk.ui +|----|----bios/bios_f.u +|----|----bios/structures/structures.u +|----|----|----bios/structures/bpb.ui +|----|----|----bios/structures/md.ui +|----|----|----bios/structures/mpb.ui +|----|----|----bios/structures/patternrectdata.ui +|----|----|----bios/structures/pun_info.ui +|----|----|----bios/structures/solidrecdata.ui +|----xbios/xbios.u +|----|----xbios/bildscrm/bildscrm.u +|----|----|----xbios/bildscrm/cursconf.ui +|----|----|----xbios/bildscrm/egetpale.ui +|----|----|----xbios/bildscrm/egetshif.ui +|----|----|----xbios/bildscrm/esetbank.ui +|----|----|----xbios/bildscrm/esetcolo.ui +|----|----|----xbios/bildscrm/esetgray.ui +|----|----|----xbios/bildscrm/esetpale.ui +|----|----|----xbios/bildscrm/esetshif.ui +|----|----|----xbios/bildscrm/esetsmea.ui +|----|----|----xbios/bildscrm/getrez.ui +|----|----|----xbios/bildscrm/initmous.ui +|----|----|----xbios/bildscrm/logbase.ui +|----|----|----xbios/bildscrm/mon_type.ui +|----|----|----xbios/bildscrm/physbase.ui +|----|----|----xbios/bildscrm/setcolor.ui +|----|----|----xbios/bildscrm/setpalet.ui +|----|----|----xbios/bildscrm/setscree.ui +|----|----|----xbios/bildscrm/Setscreen_Milan.ui +|----|----|----xbios/bildscrm/Setscreen_ct60.ui +|----|----|----xbios/bildscrm/validmod.ui +|----|----|----xbios/bildscrm/vgetrgb.ui +|----|----|----xbios/bildscrm/vsetscre.ui +|----|----|----xbios/bildscrm/vgetsize.ui +|----|----|----xbios/bildscrm/vsetmask.ui +|----|----|----xbios/bildscrm/vsetmode.ui +|----|----|----xbios/bildscrm/vsetrgb.ui +|----|----|----xbios/bildscrm/vsetsync.ui +|----|----|----xbios/bildscrm/vsync.ui +|----|----|----xbios/bildscrm/bildscrm.ui +|----|----xbios/centscrn/centscrn.u +|----|----|----xbios/centscrn/multimon.ui +|----|----|----xbios/centscrn/setmon.ui +|----|----|----xbios/centscrn/sizecomp.ui +|----|----|----xbios/centscrn/vattrib.ui +|----|----|----xbios/centscrn/vclose.ui +|----|----|----xbios/centscrn/vcreate.ui +|----|----|----xbios/centscrn/vdelete.ui +|----|----|----xbios/centscrn/vfirst.ui +|----|----|----xbios/centscrn/vload.ui +|----|----|----xbios/centscrn/vlock.ui +|----|----|----xbios/centscrn/vnext.ui +|----|----|----xbios/centscrn/voffset.ui +|----|----|----xbios/centscrn/vopen.ui +|----|----|----xbios/centscrn/vread.ui +|----|----|----xbios/centscrn/vsave.ui +|----|----|----xbios/centscrn/vscroll.ui +|----|----|----xbios/centscrn/vseek.ui +|----|----|----xbios/centscrn/vsize.ui +|----|----|----xbios/centscrn/vvalid.ui +|----|----|----xbios/centscrn/vwrite.ui +|----|----xbios/crazydot/crazydot.u +|----|----|----xbios/crazydot/gscrdesc.ui +|----|----|----xbios/crazydot/resetscr.ui +|----|----|----xbios/crazydot/getnofpm.ui +|----|----|----xbios/crazydot/getpmode.ui +|----|----|----xbios/crazydot/readmode.ui +|----|----|----xbios/crazydot/cpmd2amd.ui +|----|----|----xbios/crazydot/acmodenr.ui +|----|----|----xbios/crazydot/gamddesc.ui +|----|----|----xbios/crazydot/gregbase.ui +|----|----|----xbios/crazydot/getfeat.ui +|----|----|----xbios/crazydot/getafeat.ui +|----|----xbios/ct60/ct60.u +|----|----|----xbios/ct60/cache.ui +|----|----|----xbios/ct60/fl_cache.ui +|----|----|----xbios/ct60/rcortemp.ui +|----|----|----xbios/ct60/rd_param.ui +|----|----|----xbios/ct60/ct60_vmalloc.ui +|----|----xbios/datetime/datetime.u +|----|----|----xbios/datetime/gettime.ui +|----|----|----xbios/datetime/nvmacces.ui +|----|----|----xbios/datetime/settime.ui +|----|----|----xbios/datetime/xbtimer.ui +|----|----|----xbios/datetime/datetime.ui +|----|----xbios/drucker/drucker.u +|----|----|----xbios/drucker/prtblk.ui +|----|----|----xbios/drucker/scrdmp.ui +|----|----|----xbios/drucker/setprt.ui +|----|----xbios/dsp56001/dsp56001.u +|----|----|----xbios/dsp56001/availabl.ui +|----|----|----xbios/dsp56001/blkbytes.ui +|----|----|----xbios/dsp56001/blkhndsh.ui +|----|----|----xbios/dsp56001/blkunpac.ui +|----|----|----xbios/dsp56001/blkwords.ui +|----|----|----xbios/dsp56001/doblock.ui +|----|----|----xbios/dsp56001/execboot.ui +|----|----|----xbios/dsp56001/execprog.ui +|----|----|----xbios/dsp56001/flushsub.ui +|----|----|----xbios/dsp56001/getproga.ui +|----|----|----xbios/dsp56001/getwords.ui +|----|----|----xbios/dsp56001/hf0.ui +|----|----|----xbios/dsp56001/hf1.ui +|----|----|----xbios/dsp56001/hf2.ui +|----|----|----xbios/dsp56001/hf3.ui +|----|----|----xbios/dsp56001/hstat.ui +|----|----|----xbios/dsp56001/inqsubra.ui +|----|----|----xbios/dsp56001/instream.ui +|----|----|----xbios/dsp56001/iostream.ui +|----|----|----xbios/dsp56001/loadprog.ui +|----|----|----xbios/dsp56001/loadsubr.ui +|----|----|----xbios/dsp56001/lock.ui +|----|----|----xbios/dsp56001/lodtobin.ui +|----|----|----xbios/dsp56001/multbloc.ui +|----|----|----xbios/dsp56001/outstrea.ui +|----|----|----xbios/dsp56001/removein.ui +|----|----|----xbios/dsp56001/requestu.ui +|----|----|----xbios/dsp56001/reserve.ui +|----|----|----xbios/dsp56001/runsubro.ui +|----|----|----xbios/dsp56001/setvecto.ui +|----|----|----xbios/dsp56001/triggerh.ui +|----|----|----xbios/dsp56001/unlock.ui +|----|----xbios/dhs/dhs.u +|----|----|----xbios/dhs/cyclesrd.ui +|----|----|----xbios/dhs/cyclesst.ui +|----|----|----xbios/dhs/frequenc.ui +|----|----|----xbios/dhs/debug.ui +|----|----|----xbios/dhs/debugui.ui +|----|----|----xbios/dhs/hatariop.ui +|----|----|----xbios/dhs/register.ui +|----|----xbios/interrpt/interrpt.u +|----|----|----xbios/interrpt/jdisint.ui +|----|----|----xbios/interrpt/jenabint.ui +|----|----xbios/laufwerk/laufwerk.u +|----|----|----xbios/laufwerk/dmaread.ui +|----|----|----xbios/laufwerk/dmawrite.ui +|----|----|----xbios/laufwerk/flopfmt.ui +|----|----|----xbios/laufwerk/floprate.ui +|----|----|----xbios/laufwerk/floprd.ui +|----|----|----xbios/laufwerk/flopver.ui +|----|----|----xbios/laufwerk/flopwr.ui +|----|----|----xbios/laufwerk/metaclos.ui +|----|----|----xbios/laufwerk/metadinf.ui +|----|----|----xbios/laufwerk/metagett.ui +|----|----|----xbios/laufwerk/metainit.ui +|----|----|----xbios/laufwerk/metaioct.ui +|----|----|----xbios/laufwerk/metaopen.ui +|----|----|----xbios/laufwerk/metaread.ui +|----|----|----xbios/laufwerk/metaseek.ui +|----|----|----xbios/laufwerk/metasets.ui +|----|----|----xbios/laufwerk/metastar.ui +|----|----|----xbios/laufwerk/metastat.ui +|----|----|----xbios/laufwerk/metastop.ui +|----|----|----xbios/laufwerk/metawrit.ui +|----|----|----xbios/laufwerk/protobt.ui +|----|----xbios/matrix/matrix.u +|----|----xbios/overscan/overscan.u +|----|----|----xbios/overscan/oscanis.ui +|----|----|----xbios/overscan/oscanpat.ui +|----|----|----xbios/overscan/oscanphy.ui +|----|----|----xbios/overscan/oscanscr.ui +|----|----|----xbios/overscan/oscanswi.ui +|----|----|----xbios/overscan/oscantab.ui +|----|----|----xbios/overscan/oscanvb.ui +|----|----xbios/pci_bios/pci_bios.u +|----|----|----xbios/pci_bios/bus_to_virt.ui +|----|----|----xbios/pci_bios/fast_read_config_byte.ui +|----|----|----xbios/pci_bios/fast_read_config_longword.ui +|----|----|----xbios/pci_bios/fast_read_config_word.ui +|----|----|----xbios/pci_bios/fast_read_io_byte.ui +|----|----|----xbios/pci_bios/fast_read_io_longword.ui +|----|----|----xbios/pci_bios/fast_read_io_word.ui +|----|----|----xbios/pci_bios/fast_read_mem_byte.ui +|----|----|----xbios/pci_bios/fast_read_mem_longword.ui +|----|----|----xbios/pci_bios/fast_read_mem_word.ui +|----|----|----xbios/pci_bios/fpclassc.ui +|----|----|----xbios/pci_bios/fpdevice.ui +|----|----|----xbios/pci_bios/get_card_used.ui +|----|----|----xbios/pci_bios/get_machine_id.ui +|----|----|----xbios/pci_bios/get_pagesize.ui +|----|----|----xbios/pci_bios/get_resource.ui +|----|----|----xbios/pci_bios/get_routing.ui +|----|----|----xbios/pci_bios/hook_interrupt.ui +|----|----|----xbios/pci_bios/phys_to_virt.ui +|----|----|----xbios/pci_bios/read_config_byte.ui +|----|----|----xbios/pci_bios/read_config_longword.ui +|----|----|----xbios/pci_bios/read_config_word.ui +|----|----|----xbios/pci_bios/read_io_byte.ui +|----|----|----xbios/pci_bios/read_io_longword.ui +|----|----|----xbios/pci_bios/read_io_word.ui +|----|----|----xbios/pci_bios/read_mem_byte.ui +|----|----|----xbios/pci_bios/read_mem_longword.ui +|----|----|----xbios/pci_bios/read_mem_word.ui +|----|----|----xbios/pci_bios/set_card_used.ui +|----|----|----xbios/pci_bios/set_interrupt.ui +|----|----|----xbios/pci_bios/special_cycle.ui +|----|----|----xbios/pci_bios/unhook_interrupt.ui +|----|----|----xbios/pci_bios/virt_to_bus.ui +|----|----|----xbios/pci_bios/virt_to_phys.ui +|----|----|----xbios/pci_bios/write_config_byte.ui +|----|----|----xbios/pci_bios/write_config_longword.ui +|----|----|----xbios/pci_bios/write_config_word.ui +|----|----|----xbios/pci_bios/write_io_byte.ui +|----|----|----xbios/pci_bios/write_io_longword.ui +|----|----|----xbios/pci_bios/write_io_word.ui +|----|----|----xbios/pci_bios/write_mem_byte.ui +|----|----|----xbios/pci_bios/write_mem_longword.ui +|----|----|----xbios/pci_bios/write_mem_word.ui +|----|----|----xbios/pci_bios/error.ui +|----|----xbios/intrface/intrface.u +|----|----|----xbios/intrface/bconmap.ui +|----|----|----xbios/intrface/dosound.ui +|----|----|----xbios/intrface/extrscon.ui +|----|----|----xbios/intrface/giaccess.ui +|----|----|----xbios/intrface/ikbdws.ui +|----|----|----xbios/intrface/iorec.ui +|----|----|----xbios/intrface/kbdvbase.ui +|----|----|----xbios/intrface/mfpint.ui +|----|----|----xbios/intrface/midiws.ui +|----|----|----xbios/intrface/offgibit.ui +|----|----|----xbios/intrface/ongibit.ui +|----|----|----xbios/intrface/rsconf.ui +|----|----xbios/sound/sound.u +|----|----|----xbios/sound/buffoper.ui +|----|----|----xbios/sound/buffptr.ui +|----|----|----xbios/sound/devconne.ui +|----|----|----xbios/sound/dsptrist.ui +|----|----|----xbios/sound/gpio.ui +|----|----|----xbios/sound/locksnd.ui +|----|----|----xbios/sound/setbuffe.ui +|----|----|----xbios/sound/setinter.ui +|----|----|----xbios/sound/setmode.ui +|----|----|----xbios/sound/setmontr.ui +|----|----|----xbios/sound/settrack.ui +|----|----|----xbios/sound/sndstatu.ui +|----|----|----xbios/sound/soundcmd.ui +|----|----|----xbios/sound/startrac.ui +|----|----|----|----xbios/startrac/installe.ui +|----|----|----|----xbios/startrac/cardslot.ui +|----|----|----|----xbios/startrac/cardsel.ui +|----|----|----|----xbios/startrac/cardmagi.ui +|----|----|----|----xbios/startrac/cardadr.ui +|----|----|----|----xbios/startrac/digana.ui +|----|----|----|----xbios/startrac/digcom.ui +|----|----|----|----xbios/startrac/dspmode.ui +|----|----|----|----xbios/startrac/sclock.ui +|----|----|----|----xbios/startrac/highsrat.ui +|----|----|----|----xbios/startrac/bypass.ui +|----|----|----|----xbios/startrac/recmode.ui +|----|----|----|----xbios/startrac/playmode.ui +|----|----|----|----xbios/startrac/mode24.ui +|----|----|----|----xbios/startrac/digmode.ui +|----|----|----|----xbios/startrac/scmsmode.ui +|----|----|----|----xbios/startrac/mycopybi.ui +|----|----|----|----xbios/startrac/emphasis.ui +|----|----|----|----xbios/startrac/digsrate.ui +|----|----|----|----xbios/startrac/digcode.ui +|----|----|----|----xbios/startrac/errorcod.ui +|----|----|----|----xbios/startrac/cblmode.ui +|----|----|----|----xbios/startrac/cblread.ui +|----|----|----|----xbios/startrac/recstat.ui +|----|----|----|----xbios/startrac/playstat.ui +|----|----|----|----xbios/startrac/volad.ui +|----|----|----|----xbios/startrac/volda.ui +|----|----|----|----xbios/startrac/readsmp.ui +|----|----|----|----xbios/startrac/writesmp.ui +|----|----|----|----xbios/startrac/intact.ui +|----|----|----|----xbios/startrac/dspintac.ui +|----|----|----|----xbios/startrac/sysreset.ui +|----|----|----|----xbios/startrac/dspreset.ui +|----|----|----|----xbios/startrac/dspmemor.ui +|----|----|----|----xbios/startrac/clkdivid.ui +|----|----|----|----xbios/startrac/pathset.ui +|----|----|----|----xbios/startrac/dsp_host.ui +|----|----|----|----xbios/startrac/dspclear.ui +|----|----|----|----xbios/startrac/mix.ui +|----|----|----|----xbios/startrac/dspmix.ui +|----|----|----|----xbios/startrac/monitor.ui +|----|----|----|----xbios/startrac/recwait.ui +|----|----|----|----xbios/startrac/memrec.ui +|----|----|----|----xbios/startrac/memplay.ui +|----|----|----|----xbios/startrac/recplay.ui +|----|----|----|----xbios/startrac/hardrec.ui +|----|----|----|----xbios/startrac/hardplay.ui +|----|----|----|----xbios/startrac/hrecplay.ui +|----|----|----|----xbios/startrac/init_pea.ui +|----|----|----|----xbios/startrac/init_ime.ui +|----|----|----|----xbios/startrac/init_ipl.ui +|----|----|----|----xbios/startrac/init_ipm.ui +|----|----|----|----xbios/startrac/init_hre.ui +|----|----|----|----xbios/startrac/init_hpl.ui +|----|----|----|----xbios/startrac/init_hpm.ui +|----|----|----|----xbios/startrac/init_mrp.ui +|----|----|----|----xbios/startrac/init_mpp.ui +|----|----|----|----xbios/startrac/init_mpk.ui +|----|----|----|----xbios/startrac/init_hrp.ui +|----|----|----|----xbios/startrac/init_hpp.ui +|----|----|----|----xbios/startrac/init_hpk.ui +|----|----|----|----xbios/startrac/init_xmr.ui +|----|----|----|----xbios/startrac/init_xmp.ui +|----|----|----|----xbios/startrac/init_xxp.ui +|----|----|----|----xbios/startrac/init_xr4.ui +|----|----|----|----xbios/startrac/init_xp4.ui +|----|----|----|----xbios/startrac/peakshak.ui +|----|----|----|----xbios/startrac/read_rlo.ui +|----|----|----|----xbios/startrac/read_rhi.ui +|----|----|----|----xbios/startrac/read_rds.ui +|----|----|----|----xbios/startrac/read_rae.ui +|----|----|----|----xbios/startrac/read_rin.ui +|----|----|----|----xbios/startrac/wr_rlow.ui +|----|----|----|----xbios/startrac/wr_rhi.ui +|----|----|----|----xbios/startrac/wr_rdsp.ui +|----|----|----|----xbios/startrac/wr_raes.ui +|----|----|----|----xbios/startrac/wr_rint.ui +|----|----|----|----xbios/startrac/read_dp1.ui +|----|----|----|----xbios/startrac/read_dp2.ui +|----|----|----|----xbios/startrac/read_dpo.ui +|----|----|----|----xbios/startrac/read_dco.ui +|----|----|----|----xbios/startrac/read_dpd.ui +|----|----|----|----xbios/startrac/read_dcl.ui +|----|----|----|----xbios/startrac/wr_dpat1.ui +|----|----|----|----xbios/startrac/wr_dpat2.ui +|----|----|----|----xbios/startrac/wr_dport.ui +|----|----|----|----xbios/startrac/wr_dconv.ui +|----|----|----|----xbios/startrac/wr_dpdat.ui +|----|----|----|----xbios/startrac/wr_dclk.ui +|----|----|----|----xbios/startrac/fastcut.ui +|----|----|----|----xbios/startrac/peaksuch.ui +|----|----|----|----xbios/startrac/zerono.ui +|----|----|----|----xbios/startrac/fading.ui +|----|----|----xbios/sound/unlocksn.ui +|----|----|----xbios/sound/waveplay.ui +|----|----xbios/spezial/spezial.u +|----|----|----xbios/spezial/blitmode.ui +|----|----|----xbios/spezial/cachectr.ui +|----|----|----xbios/spezial/cjar.ui +|----|----|----xbios/spezial/dbmsg.ui +|----|----|----xbios/spezial/janus.ui +|----|----|----xbios/spezial/puntaes.ui +|----|----|----xbios/spezial/random.ui +|----|----|----xbios/spezial/ssbrk.ui +|----|----|----xbios/spezial/supexec.ui +|----|----|----xbios/spezial/trapper.ui +|----|----|----xbios/spezial/wdgctrl.ui +|----|----xbios/tastatur/tastatur.u +|----|----|----xbios/tastatur/bioskeys.ui +|----|----|----xbios/tastatur/kbrate.ui +|----|----|----xbios/tastatur/keytbl.ui +|----|----xbios/vidix/vidix.u +|----|----|----xbios/vidix/vdxconfigplayback.ui +|----|----|----xbios/vidix/vdxdestroy.ui +|----|----|----xbios/vidix/vdxgetcapability.ui +|----|----|----xbios/vidix/vdxgetgrkeys.ui +|----|----|----xbios/vidix/vdxgetversion.ui +|----|----|----xbios/vidix/vdxinit.ui +|----|----|----xbios/vidix/vdxplaybackcopyframe.ui +|----|----|----xbios/vidix/vdxplaybackframeselect.ui +|----|----|----xbios/vidix/vdxplaybackgetdeint.ui +|----|----|----xbios/vidix/vdxplaybackgeteq.ui +|----|----|----xbios/vidix/vdxplaybackoff.ui +|----|----|----xbios/vidix/vdxplaybackon.ui +|----|----|----xbios/vidix/vdxplaybacksetdeint.ui +|----|----|----xbios/vidix/vdxplaybackseteq.ui +|----|----|----xbios/vidix/vdxprobe.ui +|----|----|----xbios/vidix/vdxquerydmastatus.ui +|----|----|----xbios/vidix/vdxqueryfourcc.ui +|----|----|----xbios/vidix/vdxsetgrkeys.ui +|----|----xbios/xbios_f.u +|----|----xbios/structures/structures.u +|----|----|----xbios/structures/bconmap.ui +|----|----|----xbios/structures/CD_DISC_INFO.ui +|----|----|----xbios/structures/CD_TOC_ENTRY.ui +|----|----|----xbios/structures/DSPBLOCK.ui +|----|----|----xbios/structures/IOREC.ui +|----|----|----xbios/structures/KEYBDPARMS.ui +|----|----|----xbios/structures/KBDVBASE.ui +|----|----|----xbios/structures/KEYTAB.ui +|----|----|----xbios/structures/MAPTAB.ui +|----|----|----xbios/structures/META_DRVINFO.ui +|----|----|----xbios/structures/META_INFO_1.ui +|----|----|----xbios/structures/META_INFO_2.ui +|----|----|----xbios/structures/MOD_DESC.ui +|----|----|----xbios/structures/MOUSE.ui +|----|----|----xbios/structures/OVERPATCH.ui +|----|----|----xbios/structures/PBDEF.ui +|----|----|----xbios/structures/PCI_RSC_DESC.ui +|----|----|----xbios/structures/PMODE.ui +|----|----|----xbios/structures/SCRCLIPMEMBLK.ui +|----|----|----xbios/structures/SCRCOPYMEMBLK.ui +|----|----|----xbios/structures/SCREEN.ui +|----|----|----xbios/structures/SCREENINFO.ui +|----|----|----xbios/structures/SCREEN_OverScan.ui +|----|----|----xbios/structures/SCRFILLMEMBLK.ui +|----|----|----xbios/structures/SCRLINEMEMBLK.ui +|----|----|----xbios/structures/SCRMEMBLK.ui +|----|----|----xbios/structures/SCRTEXTUREMEMBLK.ui +|----|----|----xbios/structures/VDO_MODE.ui +|----|----|----xbios/structures/VDO_PARAM.ui +|----|----|----xbios/structures/vidix_capability.ui +|----|----|----xbios/structures/vidix_deinterlace.ui +|----|----|----xbios/structures/vidix_dma.ui +|----|----|----xbios/structures/vidix_fourcc.ui +|----|----|----xbios/structures/vidix_grkey.ui +|----|----|----xbios/structures/vidix_playback.ui +|----|----|----xbios/structures/vidix_video_eq.ui +|----|----|----xbios/structures/VPOS.ui +|----gemdos/gemdos.u +|----|----gemdos/filesys.u +|----|----gemdos/signale.u +|----|----gemdos/file/file.u +|----|----|----gemdos/file/fattrib.ui +|----|----|----gemdos/file/fchdir.ui +|----|----|----gemdos/file/fchmod.ui +|----|----|----gemdos/file/fchown.ui +|----|----|----gemdos/file/fchown16.ui +|----|----|----gemdos/file/fclose.ui +|----|----|----gemdos/file/fcntl.ui +|----|----|----gemdos/file/fcreate.ui +|----|----|----gemdos/file/fdatime.ui +|----|----|----gemdos/file/fdelete.ui +|----|----|----gemdos/file/fdirfd.ui +|----|----|----gemdos/file/fdup.ui +|----|----|----gemdos/file/ffchmod.ui +|----|----|----gemdos/file/ffchown.ui +|----|----|----gemdos/file/ffdopendir.ui +|----|----|----gemdos/file/fforce.ui +|----|----|----gemdos/file/ffstat64.ui +|----|----|----gemdos/file/fgetchar.ui +|----|----|----gemdos/file/fgetdta.ui +|----|----|----gemdos/file/finstat.ui +|----|----|----gemdos/file/flink.ui +|----|----|----gemdos/file/flock.ui +|----|----|----gemdos/file/fmidipip.ui +|----|----|----gemdos/file/fopen.ui +|----|----|----gemdos/file/foutstat.ui +|----|----|----gemdos/file/fpipe.ui +|----|----|----gemdos/file/fpoll.ui +|----|----|----gemdos/file/fputchar.ui +|----|----|----gemdos/file/fread.ui +|----|----|----gemdos/file/freadlin.ui +|----|----|----gemdos/file/frename.ui +|----|----|----gemdos/file/fseek.ui +|----|----|----gemdos/file/fseek64.ui +|----|----|----gemdos/file/fselect.ui +|----|----|----gemdos/file/fsetdta.ui +|----|----|----gemdos/file/fsfirst.ui +|----|----|----gemdos/file/fsnext.ui +|----|----|----gemdos/file/fsymlink.ui +|----|----|----gemdos/file/fstat64.ui +|----|----|----gemdos/file/fsync.ui +|----|----|----gemdos/file/fwrite.ui +|----|----|----gemdos/file/fxattr.ui +|----|----gemdos/datetime/datetime.u +|----|----|----gemdos/datetime/tadjtime.ui +|----|----|----gemdos/datetime/talarm.ui +|----|----|----gemdos/datetime/tgetdate.ui +|----|----|----gemdos/datetime/tgettime.ui +|----|----|----gemdos/datetime/tgettofd.ui +|----|----|----gemdos/datetime/tmalarm.ui +|----|----|----gemdos/datetime/tsetdate.ui +|----|----|----gemdos/datetime/tsetitim.ui +|----|----|----gemdos/datetime/tsettime.ui +|----|----|----gemdos/datetime/tsettofd.ui +|----|----gemdos/prozess/prozess.u +|----|----|----gemdos/prozess/pause.ui +|----|----|----gemdos/prozess/pdomain.ui +|----|----|----gemdos/prozess/pexec.ui +|----|----|----gemdos/prozess/pfork.ui +|----|----|----gemdos/prozess/pgetauid.ui +|----|----|----gemdos/prozess/pgetegid.ui +|----|----|----gemdos/prozess/pgeteuid.ui +|----|----|----gemdos/prozess/pgetgid.ui +|----|----|----gemdos/prozess/pgetgrou.ui +|----|----|----gemdos/prozess/pgetpgrp.ui +|----|----|----gemdos/prozess/pgetpid.ui +|----|----|----gemdos/prozess/pgetppid.ui +|----|----|----gemdos/prozess/pgetprio.ui +|----|----|----gemdos/prozess/pgetuid.ui +|----|----|----gemdos/prozess/pkill.ui +|----|----|----gemdos/prozess/pmsg.ui +|----|----|----gemdos/prozess/pnice.ui +|----|----|----gemdos/prozess/prenice.ui +|----|----|----gemdos/prozess/prusage.ui +|----|----|----gemdos/prozess/psemapho.ui +|----|----|----gemdos/prozess/psetauid.ui +|----|----|----gemdos/prozess/psetegid.ui +|----|----|----gemdos/prozess/pseteuid.ui +|----|----|----gemdos/prozess/psetgid.ui +|----|----|----gemdos/prozess/psetgrou.ui +|----|----|----gemdos/prozess/psetlimi.ui +|----|----|----gemdos/prozess/psetpgrp.ui +|----|----|----gemdos/prozess/psetprio.ui +|----|----|----gemdos/prozess/psetregi.ui +|----|----|----gemdos/prozess/psetreui.ui +|----|----|----gemdos/prozess/psetuid.ui +|----|----|----gemdos/prozess/psigacti.ui +|----|----|----gemdos/prozess/psigbloc.ui +|----|----|----gemdos/prozess/psigintr.ui +|----|----|----gemdos/prozess/psignal.ui +|----|----|----gemdos/prozess/psigpaus.ui +|----|----|----gemdos/prozess/psigpend.ui +|----|----|----gemdos/prozess/psigretu.ui +|----|----|----gemdos/prozess/psigsetm.ui +|----|----|----gemdos/prozess/psysctl.ui +|----|----|----gemdos/prozess/pterm.ui +|----|----|----gemdos/prozess/pterm0.ui +|----|----|----gemdos/prozess/ptermres.ui +|----|----|----gemdos/prozess/ptrace.ui +|----|----|----gemdos/prozess/pumask.ui +|----|----|----gemdos/prozess/pusrval.ui +|----|----|----gemdos/prozess/pvfork.ui +|----|----|----gemdos/prozess/pwait.ui +|----|----|----gemdos/prozess/pwait3.ui +|----|----|----gemdos/prozess/pwaitpid.ui +|----|----gemdos/memory/memory.u +|----|----|----gemdos/memory/maccess.ui +|----|----|----gemdos/memory/maddalt.ui +|----|----|----gemdos/memory/malloc.ui +|----|----|----gemdos/memory/mfree.ui +|----|----|----gemdos/memory/mshrink.ui +|----|----|----gemdos/memory/mvalidate.ui +|----|----|----gemdos/memory/mxalloc.ui +|----|----gemdos/network/network.u +|----|----|----gemdos/network/fflush.ui +|----|----|----gemdos/network/flock.ui +|----|----|----gemdos/network/frlock.ui +|----|----|----gemdos/network/frunlock.ui +|----|----|----gemdos/network/funlock.ui +|----|----|----gemdos/network/Nversion.ui +|----|----gemdos/system/system.u +|----|----|----gemdos/system/salert.ui +|----|----|----gemdos/system/sconfig.ui +|----|----|----gemdos/system/scookie.ui +|----|----|----gemdos/system/shutdown.ui +|----|----|----gemdos/system/slbclose.ui +|----|----|----gemdos/system/slbopen.ui +|----|----|----gemdos/system/srealloc.ui +|----|----|----gemdos/system/ssystem.ui +|----|----|----gemdos/system/stefcntr.ui +|----|----|----gemdos/system/super.ui +|----|----|----gemdos/system/suptime.ui +|----|----|----gemdos/system/sversion.ui +|----|----|----gemdos/system/syield.ui +|----|----|----gemdos/system/sync.ui +|----|----|----gemdos/system/sysconf.ui +|----|----gemdos/dir/dir.u +|----|----|----gemdos/dir/dchroot.ui +|----|----|----gemdos/dir/dclosedi.ui +|----|----|----gemdos/dir/dcntl.ui +|----|----|----gemdos/dir/dcreate.ui +|----|----|----gemdos/dir/ddelete.ui +|----|----|----gemdos/dir/dfree.ui +|----|----|----gemdos/dir/dgetcwd.ui +|----|----|----gemdos/dir/dgetdrv.ui +|----|----|----gemdos/dir/dgetpath.ui +|----|----|----gemdos/dir/dlock.ui +|----|----|----gemdos/dir/dopendir.ui +|----|----|----gemdos/dir/dpathcon.ui +|----|----|----gemdos/dir/dreaddir.ui +|----|----|----gemdos/dir/dreadlab.ui +|----|----|----gemdos/dir/drewindd.ui +|----|----|----gemdos/dir/dsetdrv.ui +|----|----|----gemdos/dir/dsetkey.ui +|----|----|----gemdos/dir/dsetpath.ui +|----|----|----gemdos/dir/dwritela.ui +|----|----|----gemdos/dir/dxopendir.ui +|----|----|----gemdos/dir/dxreaddi.ui +|----|----gemdos/chrinout/chrinout.u +|----|----|----gemdos/chrinout/cauxin.ui +|----|----|----gemdos/chrinout/cauxis.ui +|----|----|----gemdos/chrinout/cauxos.ui +|----|----|----gemdos/chrinout/cauxout.ui +|----|----|----gemdos/chrinout/cconin.ui +|----|----|----gemdos/chrinout/cconis.ui +|----|----|----gemdos/chrinout/cconos.ui +|----|----|----gemdos/chrinout/cconout.ui +|----|----|----gemdos/chrinout/cconrs.ui +|----|----|----gemdos/chrinout/cconws.ui +|----|----|----gemdos/chrinout/cnecin.ui +|----|----|----gemdos/chrinout/cprnos.ui +|----|----|----gemdos/chrinout/cprnout.ui +|----|----|----gemdos/chrinout/crawcin.ui +|----|----|----gemdos/chrinout/crawio.ui +|----|----gemdos/mintnet/mintnet.u +|----|----|----gemdos/mintnet/fwritev.ui +|----|----|----gemdos/mintnet/freadv.ui +|----|----|----gemdos/mintnet/fsocket.ui +|----|----|----gemdos/mintnet/fsocketpair.ui +|----|----|----gemdos/mintnet/faccept.ui +|----|----|----gemdos/mintnet/fconnect.ui +|----|----|----gemdos/mintnet/fbind.ui +|----|----|----gemdos/mintnet/flisten.ui +|----|----|----gemdos/mintnet/frecvmsg.ui +|----|----|----gemdos/mintnet/fsendmsg.ui +|----|----|----gemdos/mintnet/frecvfrom.ui +|----|----|----gemdos/mintnet/fsendto.ui +|----|----|----gemdos/mintnet/fsetsockopt.ui +|----|----|----gemdos/mintnet/fgetsockopt.ui +|----|----|----gemdos/mintnet/fgetpeername.ui +|----|----|----gemdos/mintnet/fgetsockname.ui +|----|----|----gemdos/mintnet/fshutdown.ui +|----|----gemdos/argv.u +|----|----gemdos/c_task.u +|----|----gemdos/bionet.u +|----|----gemdos/powerdos.u +|----|----gemdos/tekbios.u +|----|----gemdos/gemdos_f.u +|----|----gemdos/structures/structures.u +|----|----|----gemdos/structures/cdrom.ui +|----|----|----gemdos/structures/cdrom_audioctrl.ui +|----|----|----gemdos/structures/cdrom_mcn.ui +|----|----|----gemdos/structures/cdrom_msf.ui +|----|----|----gemdos/structures/cdrom_read.ui +|----|----|----gemdos/structures/cdrom_subchnl.ui +|----|----|----gemdos/structures/cdrom_ti.ui +|----|----|----gemdos/structures/cdrom_tisrc.ui +|----|----|----gemdos/structures/cdrom_tocentry.ui +|----|----|----gemdos/structures/cdrom_tochdr.ui +|----|----|----gemdos/structures/cdrom_volctrl.ui +|----|----|----gemdos/structures/cd_ad.ui +|----|----|----gemdos/structures/DISKINFO.ui +|----|----|----gemdos/structures/DOSTIME.ui +|----|----|----gemdos/structures/DOSVARS.ui +|----|----|----gemdos/structures/DTA.ui +|----|----|----gemdos/structures/fcookie.ui +|----|----|----gemdos/structures/FILEPTR.ui +|----|----|----gemdos/structures/flock.ui +|----|----|----gemdos/structures/iovec.ui +|----|----|----gemdos/structures/LINE.ui +|----|----|----gemdos/structures/ltchars.ui +|----|----|----gemdos/structures/msghdr.ui +|----|----|----gemdos/structures/mutimbuf.ui +|----|----|----gemdos/structures/PD.ui +|----|----|----gemdos/structures/POLLFD.ui +|----|----|----gemdos/structures/ploadinfo.ui +|----|----|----gemdos/structures/sgttyb.ui +|----|----|----gemdos/structures/sigaction.ui +|----|----|----gemdos/structures/sockaddr.ui +|----|----|----gemdos/structures/STAT.ui +|----|----|----gemdos/structures/tchars.ui +|----|----|----gemdos/structures/timeval.ui +|----|----|----gemdos/structures/timezone.ui +|----|----|----gemdos/structures/tty.ui +|----|----|----gemdos/structures/winsize.ui +|----|----|----gemdos/structures/XATTR.ui +|----|----|----gemdos/structures/xkey.ui +|----linea/linea.u +|----|----linea/init.ui +|----|----linea/putpixel.ui +|----|----linea/getpixel.ui +|----|----linea/line.ui +|----|----linea/hline.ui +|----|----linea/fillrect.ui +|----|----linea/fillpoly.ui +|----|----linea/bitblt.ui +|----|----linea/textblt.ui +|----|----linea/shmouse.ui +|----|----linea/hdmouse.ui +|----|----linea/trmouse.ui +|----|----linea/udrsprit.ui +|----|----linea/drsprite.ui +|----|----linea/cpraster.ui +|----|----linea/seedfill.ui +|----gem/vdi/vdi.u +|----|----gem/vdi/vdi_en.u +|----|----|----gem/vdi/assign_sys.ui +|----|----|----gem/vdi/metafile.u +|----|----|----gem/vdi/structures/vdipb.ui +|----|----gem/vdi/attribut/attribut.u +|----|----|----gem/vdi/attribut/bitmap/bitmap.u +|----|----|----gem/vdi/attribut/fill/fill.u +|----|----|----gem/vdi/attribut/linien/lines.u +|----|----|----gem/vdi/attribut/marker/marker.u +|----|----|----gem/vdi/attribut/text/text.u +|----|----|----gem/vdi/attribut/uebergeordnete/superior.u +|----|----|----gem/vdi/attribut/bitmap/vsr_bg_color.ui +|----|----|----gem/vdi/attribut/bitmap/vsr_fg_color.ui +|----|----|----gem/vdi/attribut/fill/filltypes.ui +|----|----|----gem/vdi/attribut/fill/vsf_bg_color.ui +|----|----|----gem/vdi/attribut/fill/vsf_color.ui +|----|----|----gem/vdi/attribut/fill/vsf_fg_color.ui +|----|----|----gem/vdi/attribut/fill/vsf_interior.ui +|----|----|----gem/vdi/attribut/fill/vsf_perimeter.ui +|----|----|----gem/vdi/attribut/fill/vsf_style.ui +|----|----|----gem/vdi/attribut/fill/vsf_udpat.ui +|----|----|----gem/vdi/attribut/fill/vsf_xperimeter.ui +|----|----|----gem/vdi/attribut/linien/vsl_bg_color.ui +|----|----|----gem/vdi/attribut/linien/vsl_color.ui +|----|----|----gem/vdi/attribut/linien/vsl_ends.ui +|----|----|----gem/vdi/attribut/linien/vsl_fg_color.ui +|----|----|----gem/vdi/attribut/linien/vsl_type.ui +|----|----|----gem/vdi/attribut/linien/vsl_udsty.ui +|----|----|----gem/vdi/attribut/linien/vsl_width.ui +|----|----|----gem/vdi/attribut/linien/v_bez_qual.ui +|----|----|----gem/vdi/attribut/marker/vsm_bg_color.ui +|----|----|----gem/vdi/attribut/marker/vsm_color.ui +|----|----|----gem/vdi/attribut/marker/vsm_fg_color.ui +|----|----|----gem/vdi/attribut/marker/vsm_height.ui +|----|----|----gem/vdi/attribut/marker/vsm_type.ui +|----|----|----gem/vdi/attribut/text/vst_alignment.ui +|----|----|----gem/vdi/attribut/text/vst_arbpt.ui +|----|----|----gem/vdi/attribut/text/vst_arbpt32.ui +|----|----|----gem/vdi/attribut/text/vst_bg_color.ui +|----|----|----gem/vdi/attribut/text/vst_charmap.ui +|----|----|----gem/vdi/attribut/text/vst_color.ui +|----|----|----gem/vdi/attribut/text/vst_effects.ui +|----|----|----gem/vdi/attribut/text/vst_error.ui +|----|----|----gem/vdi/attribut/text/vst_fg_color.ui +|----|----|----gem/vdi/attribut/text/vst_font.ui +|----|----|----gem/vdi/attribut/text/vst_height.ui +|----|----|----gem/vdi/attribut/text/vst_kern.ui +|----|----|----gem/vdi/attribut/text/vst_map_mode.ui +|----|----|----gem/vdi/attribut/text/vst_name.ui +|----|----|----gem/vdi/attribut/text/vst_point.ui +|----|----|----gem/vdi/attribut/text/vst_rotation.ui +|----|----|----gem/vdi/attribut/text/vst_scratch.ui +|----|----|----gem/vdi/attribut/text/vst_setsize.ui +|----|----|----gem/vdi/attribut/text/vst_setsize32.ui +|----|----|----gem/vdi/attribut/text/vst_skew.ui +|----|----|----gem/vdi/attribut/text/vst_track_offset.ui +|----|----|----gem/vdi/attribut/text/vst_width.ui +|----|----|----gem/vdi/attribut/text/v_topbot.ui +|----|----|----gem/vdi/attribut/uebergeordnete/vswr_mode.ui +|----|----|----gem/vdi/attribut/uebergeordnete/vs_bkcolor.ui +|----|----|----gem/vdi/attribut/uebergeordnete/vs_color.ui +|----|----|----gem/vdi/attribut/uebergeordnete/vs_color2.ui +|----|----|----gem/vdi/attribut/uebergeordnete/vs_grayoverride.ui +|----|----|----gem/vdi/attribut/uebergeordnete/v_ps_halftone.ui +|----|----|----gem/vdi/attribut/uebergeordnete/v_setrgb.ui +|----|----|----gem/vdi/attribut/uebergeordnete/v_setrgbi.ui +|----|----gem/vdi/output/output.u +|----|----|----gem/vdi/output/vr_recfl.ui +|----|----|----gem/vdi/output/v_arc.ui +|----|----|----gem/vdi/output/v_bar.ui +|----|----|----gem/vdi/output/v_bez.ui +|----|----|----gem/vdi/output/v_bez_fill.ui +|----|----|----gem/vdi/output/v_cellarray.ui +|----|----|----gem/vdi/output/v_circle.ui +|----|----|----gem/vdi/output/v_contourfill.ui +|----|----|----gem/vdi/output/v_ellarc.ui +|----|----|----gem/vdi/output/v_ellipse.ui +|----|----|----gem/vdi/output/v_ellpie.ui +|----|----|----gem/vdi/output/v_etext.ui +|----|----|----gem/vdi/output/v_fillarea.ui +|----|----|----gem/vdi/output/v_ftext.ui +|----|----|----gem/vdi/output/v_ftext_offset.ui +|----|----|----gem/vdi/output/v_gtext.ui +|----|----|----gem/vdi/output/v_justified.ui +|----|----|----gem/vdi/output/v_pieslice.ui +|----|----|----gem/vdi/output/v_pline.ui +|----|----|----gem/vdi/output/v_pmarker.ui +|----|----|----gem/vdi/output/v_rbox.ui +|----|----|----gem/vdi/output/v_rfbox.ui +|----|----gem/vdi/inquire/inquire.u +|----|----|----gem/vdi/inquire/vqf_attributes.ui +|----|----|----gem/vdi/inquire/vqf_bg_color.ui +|----|----|----gem/vdi/inquire/vqf_fg_color.ui +|----|----|----gem/vdi/inquire/vqin_mode.ui +|----|----|----gem/vdi/inquire/vql_attributes.ui +|----|----|----gem/vdi/inquire/vql_bg_color.ui +|----|----|----gem/vdi/inquire/vql_fg_color.ui +|----|----|----gem/vdi/inquire/vqm_attributes.ui +|----|----|----gem/vdi/inquire/vqm_bg_color.ui +|----|----|----gem/vdi/inquire/vqm_fg_color.ui +|----|----|----gem/vdi/inquire/vqr_bg_color.ui +|----|----|----gem/vdi/inquire/vqr_fg_color.ui +|----|----|----gem/vdi/inquire/vqt_advance.ui +|----|----|----gem/vdi/inquire/vqt_advance32.ui +|----|----|----gem/vdi/inquire/vqt_attributes.ui +|----|----|----gem/vdi/inquire/vqt_bg_color.ui +|----|----|----gem/vdi/inquire/vqt_cachesize.ui +|----|----|----gem/vdi/inquire/vqt_char_index.ui +|----|----|----gem/vdi/inquire/vqt_devinfo.ui +|----|----|----gem/vdi/inquire/vqt_extent.ui +|----|----|----gem/vdi/inquire/vqt_ext_name.ui +|----|----|----gem/vdi/inquire/vqt_fg_color.ui +|----|----|----gem/vdi/inquire/vqt_fontheader.ui +|----|----|----gem/vdi/inquire/vqt_fontinfo.ui +|----|----|----gem/vdi/inquire/vqt_f_extent.ui +|----|----|----gem/vdi/inquire/vqt_get_table.ui +|----|----|----gem/vdi/inquire/vqt_justified.ui +|----|----|----gem/vdi/inquire/vqt_name.ui +|----|----|----gem/vdi/inquire/vqt_name_and_id.ui +|----|----|----gem/vdi/inquire/vqt_pairkern.ui +|----|----|----gem/vdi/inquire/vqt_real_extent.ui +|----|----|----gem/vdi/inquire/vqt_trackkern.ui +|----|----|----gem/vdi/inquire/vqt_width.ui +|----|----|----gem/vdi/inquire/vqt_xfntinfo.ui +|----|----|----gem/vdi/inquire/vq_cellarray.ui +|----|----|----gem/vdi/inquire/vq_color.ui +|----|----|----gem/vdi/inquire/vq_devinfo.ui +|----|----|----gem/vdi/inquire/vq_extnd.ui +|----|----|----gem/vdi/inquire/vq_ext_devinfo.ui +|----|----|----gem/vdi/inquire/vq_ptsinsz.ui +|----|----|----gem/vdi/inquire/vq_scrninfo.ui +|----|----|----gem/vdi/inquire/v_create_driver_info.ui +|----|----|----gem/vdi/inquire/v_delete_driver_info.ui +|----|----|----gem/vdi/inquire/v_getbitmap_info.ui +|----|----|----gem/vdi/inquire/v_get_driver_info.ui +|----|----|----gem/vdi/inquire/v_read_default_settings.ui +|----|----|----gem/vdi/inquire/v_write_default_settings.ui +|----|----|----gem/vdi/inquire/fontheader.ui +|----|----|----gem/vdi/inquire/disable_nvdi.ui +|----|----gem/vdi/input/input.u +|----|----|----gem/vdi/input/vex_butv.ui +|----|----|----gem/vdi/input/vex_curv.ui +|----|----|----gem/vdi/input/vex_motv.ui +|----|----|----gem/vdi/input/vex_timv.ui +|----|----|----gem/vdi/input/vex_wheelv.ui +|----|----|----gem/vdi/input/vq_key_s.ui +|----|----|----gem/vdi/input/vq_mouse.ui +|----|----|----gem/vdi/input/vrq_choice.ui +|----|----|----gem/vdi/input/vrq_locator.ui +|----|----|----gem/vdi/input/vrq_string.ui +|----|----|----gem/vdi/input/vrq_valuator.ui +|----|----|----gem/vdi/input/vsc_form.ui +|----|----|----gem/vdi/input/vsin_mode.ui +|----|----|----gem/vdi/input/vsm_choice.ui +|----|----|----gem/vdi/input/vsm_locator.ui +|----|----|----gem/vdi/input/vsm_string.ui +|----|----|----gem/vdi/input/vsm_valuator.ui +|----|----|----gem/vdi/input/v_hide_c.ui +|----|----|----gem/vdi/input/v_show_c.ui +|----|----gem/vdi/escape/escape.u +|----|----|----gem/vdi/escape/graphic/graphic.u +|----|----|----|----gem/vdi/escape/graphic/vq_bit_image.ui +|----|----|----|----gem/vdi/escape/graphic/vq_calibrate.ui +|----|----|----|----gem/vdi/escape/graphic/vq_driver_info.ui +|----|----|----|----gem/vdi/escape/graphic/vq_driver_name.ui +|----|----|----|----gem/vdi/escape/graphic/vq_image_type.ui +|----|----|----|----gem/vdi/escape/graphic/vq_margins.ui +|----|----|----|----gem/vdi/escape/graphic/vq_page_name.ui +|----|----|----|----gem/vdi/escape/graphic/vq_prn_scaling.ui +|----|----|----|----gem/vdi/escape/graphic/vq_scan.ui +|----|----|----|----gem/vdi/escape/graphic/vq_tabstatus.ui +|----|----|----|----gem/vdi/escape/graphic/vq_tray_names.ui +|----|----|----|----gem/vdi/escape/graphic/vs_calibrate.ui +|----|----|----|----gem/vdi/escape/graphic/vs_crop.ui +|----|----|----|----gem/vdi/escape/graphic/vs_document_info.ui +|----|----|----|----gem/vdi/escape/graphic/vs_load_disp_list.ui +|----|----|----|----gem/vdi/escape/graphic/vs_page_info.ui +|----|----|----|----gem/vdi/escape/graphic/vs_palette.ui +|----|----|----|----gem/vdi/escape/graphic/vs_save_disp_list.ui +|----|----|----|----gem/vdi/escape/graphic/v_bit_image.ui +|----|----|----|----gem/vdi/escape/graphic/v_clear_disp_list.ui +|----|----|----|----gem/vdi/escape/graphic/v_copies.ui +|----|----|----|----gem/vdi/escape/graphic/v_dspcur.ui +|----|----|----|----gem/vdi/escape/graphic/v_form_adv.ui +|----|----|----|----gem/vdi/escape/graphic/v_hardcopy.ui +|----|----|----|----gem/vdi/escape/graphic/v_orient.ui +|----|----|----|----gem/vdi/escape/graphic/v_output_window.ui +|----|----|----|----gem/vdi/escape/graphic/v_page_size.ui +|----|----|----|----gem/vdi/escape/graphic/v_rmcur.ui +|----|----|----|----gem/vdi/escape/graphic/v_tray.ui +|----|----|----|----gem/vdi/escape/graphic/v_xbit_image.ui +|----|----|----gem/vdi/escape/tablet/tablet.u +|----|----|----|----gem/vdi/escape/tablet/vq_tdimensions.ui +|----|----|----|----gem/vdi/escape/tablet/vt_alignment.ui +|----|----|----|----gem/vdi/escape/tablet/vt_axis.ui +|----|----|----|----gem/vdi/escape/tablet/vt_origin.ui +|----|----|----|----gem/vdi/escape/tablet/vt_resolution.ui +|----|----|----gem/vdi/escape/metafile/metafile.u +|----|----|----|----gem/vdi/escape/metafile/vm_coords.ui +|----|----|----|----gem/vdi/escape/metafile/vm_filename.ui +|----|----|----|----gem/vdi/escape/metafile/vm_pagesize.ui +|----|----|----|----gem/vdi/escape/metafile/v_meta_extents.ui +|----|----|----|----gem/vdi/escape/metafile/v_write_meta.ui +|----|----|----gem/vdi/escape/camera/camera.u +|----|----|----|----gem/vdi/escape/camera/vqp_error.ui +|----|----|----|----gem/vdi/escape/camera/vqp_filmname.ui +|----|----|----|----gem/vdi/escape/camera/vqp_films.ui +|----|----|----|----gem/vdi/escape/camera/vqp_state.ui +|----|----|----|----gem/vdi/escape/camera/vsc_expose.ui +|----|----|----|----gem/vdi/escape/camera/vsp_film.ui +|----|----|----|----gem/vdi/escape/camera/vsp_message.ui +|----|----|----|----gem/vdi/escape/camera/vsp_save.ui +|----|----|----|----gem/vdi/escape/camera/vsp_state.ui +|----|----|----gem/vdi/escape/sound/sound.u +|----|----|----|----gem/vdi/escape/sound/vmid_load.ui +|----|----|----|----gem/vdi/escape/sound/vmid_play.ui +|----|----|----|----gem/vdi/escape/sound/vmid_unload.ui +|----|----|----|----gem/vdi/escape/sound/vqspl_position_d2d.ui +|----|----|----|----gem/vdi/escape/sound/vqspl_position_dma.ui +|----|----|----|----gem/vdi/escape/sound/vqspl_status_d2d.ui +|----|----|----|----gem/vdi/escape/sound/vqspl_status_dma.ui +|----|----|----|----gem/vdi/escape/sound/vqspl_time_left_d2d.ui +|----|----|----|----gem/vdi/escape/sound/vspl_load_d2d.ui +|----|----|----|----gem/vdi/escape/sound/vspl_load_sample.ui +|----|----|----|----gem/vdi/escape/sound/vspl_make_d2d.ui +|----|----|----|----gem/vdi/escape/sound/vspl_pause_d2d.ui +|----|----|----|----gem/vdi/escape/sound/vspl_pause_dma.ui +|----|----|----|----gem/vdi/escape/sound/vspl_play.ui +|----|----|----|----gem/vdi/escape/sound/vspl_play_d2d.ui +|----|----|----|----gem/vdi/escape/sound/vspl_play_dma.ui +|----|----|----|----gem/vdi/escape/sound/vspl_stop_d2d.ui +|----|----|----|----gem/vdi/escape/sound/vspl_stop_dma.ui +|----|----|----|----gem/vdi/escape/sound/vspl_unload_d2d.ui +|----|----|----|----gem/vdi/escape/sound/vspl_unload_sample.ui +|----|----|----|----gem/vdi/escape/sound/vsspl_monitor_off.ui +|----|----|----|----gem/vdi/escape/sound/vsspl_monitor_on.ui +|----|----|----gem/vdi/escape/special/special.u +|----|----|----|----gem/vdi/escape/special/v_escape2000.ui +|----|----|----|----gem/vdi/escape/special/v_fontinit.ui +|----|----|----|----gem/vdi/escape/special/v_offset.ui +|----|----|----|----gem/vdi/escape/special/v_sound.ui +|----|----|----|----gem/vdi/escape/special/vs_mute.ui +|----|----|----gem/vdi/escape/text/text.u +|----|----|----|----gem/vdi/escape/text/vq_chcells.ui +|----|----|----|----gem/vdi/escape/text/vq_curaddress.ui +|----|----|----|----gem/vdi/escape/text/v_alpha_text.ui +|----|----|----|----gem/vdi/escape/text/v_curaddress.ui +|----|----|----|----gem/vdi/escape/text/v_curdown.ui +|----|----|----|----gem/vdi/escape/text/v_curhome.ui +|----|----|----|----gem/vdi/escape/text/v_curleft.ui +|----|----|----|----gem/vdi/escape/text/v_curright.ui +|----|----|----|----gem/vdi/escape/text/v_curtext.ui +|----|----|----|----gem/vdi/escape/text/v_curup.ui +|----|----|----|----gem/vdi/escape/text/v_eeol.ui +|----|----|----|----gem/vdi/escape/text/v_eeos.ui +|----|----|----|----gem/vdi/escape/text/v_enter_cur.ui +|----|----|----|----gem/vdi/escape/text/v_exit_cur.ui +|----|----|----|----gem/vdi/escape/text/v_rvoff.ui +|----|----|----|----gem/vdi/escape/text/v_rvon.ui +|----|----gem/vdi/colortable/colortable.u +|----|----|----gem/vdi/colortable/v_color2nearest.ui +|----|----|----gem/vdi/colortable/v_color2value.ui +|----|----|----gem/vdi/colortable/v_create_ctab.ui +|----|----|----gem/vdi/colortable/v_create_itab.ui +|----|----|----gem/vdi/colortable/v_ctab_idx2value.ui +|----|----|----gem/vdi/colortable/v_ctab_idx2vdi.ui +|----|----|----gem/vdi/colortable/v_ctab_vdi2idx.ui +|----|----|----gem/vdi/colortable/v_delete_ctab.ui +|----|----|----gem/vdi/colortable/v_delete_itab.ui +|----|----|----gem/vdi/colortable/v_get_ctab_id.ui +|----|----|----gem/vdi/colortable/v_value2color.ui +|----|----|----gem/vdi/colortable/vq_ctab.ui +|----|----|----gem/vdi/colortable/vq_ctab_entry.ui +|----|----|----gem/vdi/colortable/vq_ctab_id.ui +|----|----|----gem/vdi/colortable/vq_dflt_ctab.ui +|----|----|----gem/vdi/colortable/vq_px_format.ui +|----|----|----gem/vdi/colortable/vs_ctab.ui +|----|----|----gem/vdi/colortable/vs_ctab_entry.ui +|----|----|----gem/vdi/colortable/vs_dflt_ctab.ui +|----|----gem/vdi/control/control.u +|----|----|----gem/vdi/control/v_bez_off.ui +|----|----|----gem/vdi/control/v_bez_on.ui +|----|----|----gem/vdi/control/v_clrwk.ui +|----|----|----gem/vdi/control/v_clsbm.ui +|----|----|----gem/vdi/control/v_clsvwk.ui +|----|----|----gem/vdi/control/v_clswk.ui +|----|----|----gem/vdi/control/v_flushcache.ui +|----|----|----gem/vdi/control/v_getoutline.ui +|----|----|----gem/vdi/control/v_get_outline.ui +|----|----|----gem/vdi/control/v_killoutline.ui +|----|----|----gem/vdi/control/v_loadcache.ui +|----|----|----gem/vdi/control/v_load_cache.ui +|----|----|----gem/vdi/control/v_open_bm.ui +|----|----|----gem/vdi/control/v_opnbm.ui +|----|----|----gem/vdi/control/v_opnprn.ui +|----|----|----gem/vdi/control/v_opnvwk.ui +|----|----|----gem/vdi/control/v_opnwk.ui +|----|----|----gem/vdi/control/v_opnwk_pc_gem.ui +|----|----|----gem/vdi/control/v_pat_rotate.ui +|----|----|----gem/vdi/control/v_resize_bm.ui +|----|----|----gem/vdi/control/v_savecache.ui +|----|----|----gem/vdi/control/v_save_cache.ui +|----|----|----gem/vdi/control/v_set_app_buff.ui +|----|----|----gem/vdi/control/v_updwk.ui +|----|----|----gem/vdi/control/vs_clip.ui +|----|----|----gem/vdi/control/vst_ex_load_fonts.ui +|----|----|----gem/vdi/control/vst_load_fonts.ui +|----|----|----gem/vdi/control/vst_unload_fonts.ui +|----|----gem/vdi/raster/raster.u +|----|----|----gem/vdi/raster/v_get_pixel.ui +|----|----|----gem/vdi/raster/vq_hilite_color.ui +|----|----|----gem/vdi/raster/vq_max_color.ui +|----|----|----gem/vdi/raster/vq_min_color.ui +|----|----|----gem/vdi/raster/vq_weight_color.ui +|----|----|----gem/vdi/raster/vr_clip_rects32_by_dst.ui +|----|----|----gem/vdi/raster/vr_clip_rects32_by_src.ui +|----|----|----gem/vdi/raster/vr_clip_rects_by_dst.ui +|----|----|----gem/vdi/raster/vr_clip_rects_by_src.ui +|----|----|----gem/vdi/raster/vr_transfer_bits.ui +|----|----|----gem/vdi/raster/vr_trnfm.ui +|----|----|----gem/vdi/raster/vro_cpyfm.ui +|----|----|----gem/vdi/raster/vrt_cpyfm.ui +|----|----|----gem/vdi/raster/vs_hilite_color.ui +|----|----|----gem/vdi/raster/vs_max_color.ui +|----|----|----gem/vdi/raster/vs_min_color.ui +|----|----|----gem/vdi/raster/vs_weight_color.ui +|----|----gem/vdi/tcvdi/tcvdi.u +|----|----|----gem/vdi/tcvdi/vq_colors.ui +|----|----|----gem/vdi/tcvdi/vq_pixcol.ui +|----|----|----gem/vdi/tcvdi/vq_pixrgb.ui +|----|----|----gem/vdi/tcvdi/vrf_rgb.ui +|----|----|----gem/vdi/tcvdi/vrl_rgb.ui +|----|----|----gem/vdi/tcvdi/vrt_rgb.ui +|----|----|----gem/vdi/tcvdi/vrun_parallel.ui +|----|----|----gem/vdi/tcvdi/vrun_rect.ui +|----|----|----gem/vdi/tcvdi/vrun_triangle.ui +|----|----|----gem/vdi/tcvdi/vs_colors.ui +|----|----|----gem/vdi/tcvdi/vs_pixcol.ui +|----|----|----gem/vdi/tcvdi/vs_pixrgb.ui +|----|----|----gem/vdi/tcvdi/vsf_rgb.ui +|----|----|----gem/vdi/tcvdi/vsl_rgb.ui +|----|----|----gem/vdi/tcvdi/vst_rgb.ui +|----|----gem/vdi/vdi_f.u +|----|----gem/vdi/structures/structures.u +|----|----|----gem/vdi/structures/vdipb.ui +|----|----|----gem/vdi/structures/bit_image.ui +|----|----|----gem/vdi/structures/color_entry.ui +|----|----|----gem/vdi/structures/color_rgb.ui +|----|----|----gem/vdi/structures/color_tab.ui +|----|----|----gem/vdi/structures/fix31.ui +|----|----|----gem/vdi/structures/font_hdr.ui +|----|----|----gem/vdi/structures/gcbitmap.ui +|----|----|----gem/vdi/structures/mfdb.ui +|----|----|----gem/vdi/structures/point16.ui +|----|----|----gem/vdi/structures/point32.ui +|----|----|----gem/vdi/structures/pxyarray.ui +|----|----|----gem/vdi/structures/rect16.ui +|----|----|----gem/vdi/structures/rect32.ui +|----|----|----gem/vdi/structures/xfnt_info.ui +|----gem/aes/aes.u +|----|----gem/aes/aes_en.u +|----|----|----gem/aes/toolbar.ui +|----|----|----gem/aes/structures/AESPB.ui +|----|----gem/aes/appl_/appl_.u +|----|----|----gem/aes/appl_/appl_bvset.ui +|----|----|----gem/aes/appl_/appl_control.ui +|----|----|----gem/aes/appl_/appl_exit.ui +|----|----|----gem/aes/appl_/appl_find.ui +|----|----|----gem/aes/appl_/appl_getinfo.ui +|----|----|----gem/aes/appl_/appl_getinfo_str.ui +|----|----|----gem/aes/appl_/appl_get_cicon.ui +|----|----|----gem/aes/appl_/appl_init.ui +|----|----|----gem/aes/appl_/appl_options.ui +|----|----|----gem/aes/appl_/appl_read.ui +|----|----|----gem/aes/appl_/appl_search.ui +|----|----|----gem/aes/appl_/appl_tplay.ui +|----|----|----gem/aes/appl_/appl_trecord.ui +|----|----|----gem/aes/appl_/appl_write.ui +|----|----|----gem/aes/appl_/appl_xbvget.ui +|----|----|----gem/aes/appl_/appl_xbvset.ui +|----|----|----gem/aes/appl_/appl_yield.ui +|----|----|----gem/aes/appl_/_appl_yield.ui +|----|----|----gem/aes/appl_/x_appl_flags.ui +|----|----|----gem/aes/appl_/x_appl_font.ui +|----|----|----gem/aes/appl_/x_appl_sleep.ui +|----|----|----gem/aes/appl_/x_appl_term.ui +|----|----|----gem/aes/appl_/x_appl_getinfo.ui +|----|----gem/aes/fsel_/fsel_.u +|----|----|----gem/aes/fsel_/fsel_boxinput.ui +|----|----|----gem/aes/fsel_/fsel_exinput.ui +|----|----|----gem/aes/fsel_/fsel_input.ui +|----|----|----gem/aes/fsel_/x_fsel_input.ui +|----|----gem/aes/pdlg_/pdlg_.u +|----|----|----gem/aes/pdlg_/pdlg_add_printers.ui +|----|----|----gem/aes/pdlg_/pdlg_add_sub_dialogs.ui +|----|----|----gem/aes/pdlg_/pdlg_close.ui +|----|----|----gem/aes/pdlg_/pdlg_create.ui +|----|----|----gem/aes/pdlg_/pdlg_delete.ui +|----|----|----gem/aes/pdlg_/pdlg_dflt_settings.ui +|----|----|----gem/aes/pdlg_/pdlg_do.ui +|----|----|----gem/aes/pdlg_/pdlg_evnt.ui +|----|----|----gem/aes/pdlg_/pdlg_free_settings.ui +|----|----|----gem/aes/pdlg_/pdlg_get_setsize.ui +|----|----|----gem/aes/pdlg_/pdlg_new_settings.ui +|----|----|----gem/aes/pdlg_/pdlg_open.ui +|----|----|----gem/aes/pdlg_/pdlg_remove_printers.ui +|----|----|----gem/aes/pdlg_/pdlg_remove_sub_dialogs.ui +|----|----|----gem/aes/pdlg_/pdlg_save_default_settings.ui +|----|----|----gem/aes/pdlg_/pdlg_update.ui +|----|----|----gem/aes/pdlg_/pdlg_use_settings.ui +|----|----|----gem/aes/pdlg_/pdlg_validate_settings.ui +|----|----|----gem/aes/pdlg_/use.ui +|----|----gem/aes/edit_/edit_.u +|----|----|----gem/aes/edit_/edit_close.ui +|----|----|----gem/aes/edit_/edit_create.ui +|----|----|----gem/aes/edit_/edit_cursor.ui +|----|----|----gem/aes/edit_/edit_delete.ui +|----|----|----gem/aes/edit_/edit_evnt.ui +|----|----|----gem/aes/edit_/edit_get_buf.ui +|----|----|----gem/aes/edit_/edit_get_colour.ui +|----|----|----gem/aes/edit_/edit_get_cursor.ui +|----|----|----gem/aes/edit_/edit_get_dirty.ui +|----|----|----gem/aes/edit_/edit_get_font.ui +|----|----|----gem/aes/edit_/edit_get_format.ui +|----|----|----gem/aes/edit_/edit_get_pos.ui +|----|----|----gem/aes/edit_/edit_get_scrollinfo.ui +|----|----|----gem/aes/edit_/edit_get_sel.ui +|----|----|----gem/aes/edit_/edit_open.ui +|----|----|----gem/aes/edit_/edit_resized.ui +|----|----|----gem/aes/edit_/edit_scroll.ui +|----|----|----gem/aes/edit_/edit_set_buf.ui +|----|----|----gem/aes/edit_/edit_set_colour.ui +|----|----|----gem/aes/edit_/edit_set_cursor.ui +|----|----|----gem/aes/edit_/edit_set_dirty.ui +|----|----|----gem/aes/edit_/edit_set_font.ui +|----|----|----gem/aes/edit_/edit_set_format.ui +|----|----|----gem/aes/edit_/edit_set_pos.ui +|----|----|----gem/aes/edit_/uses.ui +|----|----gem/aes/evnt_/evnt_.u +|----|----|----gem/aes/evnt_/evnt_button.ui +|----|----|----gem/aes/evnt_/evnt_dclick.ui +|----|----|----gem/aes/evnt_/evnt_keybd.ui +|----|----|----gem/aes/evnt_/evnt_mesag.ui +|----|----|----gem/aes/evnt_/evnt_mouse.ui +|----|----|----gem/aes/evnt_/evnt_multi.ui +|----|----|----gem/aes/evnt_/evnt_timer.ui +|----|----|----gem/aes/evnt_/messages/evnts.ui +|----|----|----|----gem/aes/evnt_/messages/evnts_en.ui +|----|----|----gem/aes/evnt_/messages/messages.u +|----|----|----|----gem/aes/evnt_/messages/description/cab.ui +|----|----|----|----gem/aes/evnt_/messages/description/geneva.ui +|----|----|----|----gem/aes/evnt_/messages/description/rsdaemon.ui +|----|----gem/aes/wdlg_/wdlg_.u +|----|----|----gem/aes/wdlg_/wdlg_close.ui +|----|----|----gem/aes/wdlg_/wdlg_create.ui +|----|----|----gem/aes/wdlg_/wdlg_delete.ui +|----|----|----gem/aes/wdlg_/wdlg_evnt.ui +|----|----|----gem/aes/wdlg_/wdlg_get_edit.ui +|----|----|----gem/aes/wdlg_/wdlg_get_handle.ui +|----|----|----gem/aes/wdlg_/wdlg_get_tree.ui +|----|----|----gem/aes/wdlg_/wdlg_get_udata.ui +|----|----|----gem/aes/wdlg_/wdlg_open.ui +|----|----|----gem/aes/wdlg_/wdlg_redraw.ui +|----|----|----gem/aes/wdlg_/wdlg_set_edit.ui +|----|----|----gem/aes/wdlg_/wdlg_set_iconify.ui +|----|----|----gem/aes/wdlg_/wdlg_set_size.ui +|----|----|----gem/aes/wdlg_/wdlg_set_tree.ui +|----|----|----gem/aes/wdlg_/wdlg_set_uniconify.ui +|----|----gem/aes/wind_/wind_.u +|----|----|----gem/aes/wind_/wind_apfind.ui +|----|----|----gem/aes/wind_/wind_calc.ui +|----|----|----gem/aes/wind_/wind_close.ui +|----|----|----gem/aes/wind_/wind_create.ui +|----|----|----gem/aes/wind_/wind_delete.ui +|----|----|----gem/aes/wind_/wind_draw.ui +|----|----|----gem/aes/wind_/wind_find.ui +|----|----|----gem/aes/wind_/wind_get.ui +|----|----|----gem/aes/wind_/wind_new.ui +|----|----|----gem/aes/wind_/wind_open.ui +|----|----|----gem/aes/wind_/wind_set.ui +|----|----|----|----gem/aes/wind_/wind_set/WF_TOPMOST.ui +|----|----|----gem/aes/wind_/wind_update.ui +|----|----|----gem/aes/wind_/wind_xget.ui +|----|----|----gem/aes/wind_/wind_xset.ui +|----|----|----gem/aes/wind_/x_wdial_change.ui +|----|----|----gem/aes/wind_/x_wdial_draw.ui +|----|----|----gem/aes/wind_/x_wind_calc.ui +|----|----|----gem/aes/wind_/x_wind_create.ui +|----|----|----gem/aes/wind_/x_wind_tree.ui +|----|----|----gem/aes/wind_/components.ui +|----|----|----gem/aes/wind_/wind_get_set.ui +|----|----|----gem/aes/wind_/wind_get_set_geneva.ui +|----|----gem/aes/fslx_/fslx_.u +|----|----|----gem/aes/fslx_/fslx_close.ui +|----|----|----gem/aes/fslx_/fslx_do.ui +|----|----|----gem/aes/fslx_/fslx_evnt.ui +|----|----|----gem/aes/fslx_/fslx_getnxtfile.ui +|----|----|----gem/aes/fslx_/fslx_open.ui +|----|----|----gem/aes/fslx_/fslx_set_flags.ui +|----|----|----gem/aes/fslx_/use.ui +|----|----gem/aes/form_/form_.u +|----|----|----gem/aes/form_/form_alert.ui +|----|----|----gem/aes/form_/form_button.ui +|----|----|----gem/aes/form_/form_center.ui +|----|----|----gem/aes/form_/form_dial.ui +|----|----|----gem/aes/form_/form_do.ui +|----|----|----gem/aes/form_/form_error.ui +|----|----|----gem/aes/form_/form_keybd.ui +|----|----|----gem/aes/form_/form_popup.ui +|----|----|----gem/aes/form_/form_wbutton.ui +|----|----|----gem/aes/form_/form_wkeybd.ui +|----|----|----gem/aes/form_/form_xdial.ui +|----|----|----gem/aes/form_/form_xdo.ui +|----|----|----gem/aes/form_/form_xerr.ui +|----|----|----gem/aes/form_/xfrm_popup.ui +|----|----|----gem/aes/form_/x_form_center.ui +|----|----|----gem/aes/form_/x_form_error.ui +|----|----|----gem/aes/form_/x_form_filename.ui +|----|----|----gem/aes/form_/x_form_mouse.ui +|----|----gem/aes/geneva_/geneva_.u +|----|----|----gem/aes/geneva_/x_help.ui +|----|----|----gem/aes/geneva_/x_malloc.ui +|----|----|----gem/aes/geneva_/x_mfree.ui +|----|----|----gem/aes/geneva_/x_mshrink.ui +|----|----|----gem/aes/geneva_/x_realloc.ui +|----|----|----gem/aes/geneva_/x_settings.ui +|----|----|----gem/aes/geneva_/x_sprintf.ui +|----|----|----gem/aes/geneva_/x_sscanf.ui +|----|----gem/aes/graf_/graf_.u +|----|----|----gem/aes/graf_/graf_dragbox.ui +|----|----|----gem/aes/graf_/graf_growbox.ui +|----|----|----gem/aes/graf_/graf_handle.ui +|----|----|----gem/aes/graf_/graf_mbox.ui +|----|----|----gem/aes/graf_/graf_mkstate.ui +|----|----|----gem/aes/graf_/graf_mouse.ui +|----|----|----gem/aes/graf_/graf_multirubber.ui +|----|----|----gem/aes/graf_/graf_rubberbox.ui +|----|----|----gem/aes/graf_/graf_shrinkbox.ui +|----|----|----gem/aes/graf_/graf_slidebox.ui +|----|----|----gem/aes/graf_/graf_watchbox.ui +|----|----|----gem/aes/graf_/graf_wwatchbox.ui +|----|----|----gem/aes/graf_/graf_xhandle.ui +|----|----|----gem/aes/graf_/x_graf_blit.ui +|----|----|----gem/aes/graf_/x_graf_rast2rez.ui +|----|----|----gem/aes/graf_/x_graf_rubberbox.ui +|----|----gem/aes/scrp_/scrp_.u +|----|----|----gem/aes/scrp_/scrp_clear.ui +|----|----|----gem/aes/scrp_/scrp_read.ui +|----|----|----gem/aes/scrp_/scrp_write.ui +|----|----|----gem/aes/scrp_/x_scrp_get.ui +|----|----gem/aes/lbox_/lbox_.u +|----|----|----gem/aes/lbox_/lbox_ascroll_to.ui +|----|----|----gem/aes/lbox_/lbox_bscroll_to.ui +|----|----|----gem/aes/lbox_/lbox_cnt_items.ui +|----|----|----gem/aes/lbox_/lbox_create.ui +|----|----|----gem/aes/lbox_/lbox_delete.ui +|----|----|----gem/aes/lbox_/lbox_do.ui +|----|----|----gem/aes/lbox_/lbox_free_items.ui +|----|----|----gem/aes/lbox_/lbox_free_list.ui +|----|----|----gem/aes/lbox_/lbox_get_afirst.ui +|----|----|----gem/aes/lbox_/lbox_get_avis.ui +|----|----|----gem/aes/lbox_/lbox_get_bentries.ui +|----|----|----gem/aes/lbox_/lbox_get_bfirst.ui +|----|----|----gem/aes/lbox_/lbox_get_bvis.ui +|----|----|----gem/aes/lbox_/lbox_get_idx.ui +|----|----|----gem/aes/lbox_/lbox_get_item.ui +|----|----|----gem/aes/lbox_/lbox_get_items.ui +|----|----|----gem/aes/lbox_/lbox_get_slct_idx.ui +|----|----|----gem/aes/lbox_/lbox_get_slct_item.ui +|----|----|----gem/aes/lbox_/lbox_get_tree.ui +|----|----|----gem/aes/lbox_/lbox_get_udata.ui +|----|----|----gem/aes/lbox_/lbox_set_asldr.ui +|----|----|----gem/aes/lbox_/lbox_set_bentries.ui +|----|----|----gem/aes/lbox_/lbox_set_bsldr.ui +|----|----|----gem/aes/lbox_/lbox_set_items.ui +|----|----|----gem/aes/lbox_/lbox_update.ui +|----|----|----gem/aes/lbox_/use.ui +|----|----|----gem/aes/lbox_/flags.ui +|----|----gem/aes/magic_/magic_.u +|----|----|----gem/aes/magic_/sys_set_getdisp.ui +|----|----|----gem/aes/magic_/sys_recalc_cicon_colours.ui +|----|----|----gem/aes/magic_/sys_set_editob.ui +|----|----|----gem/aes/magic_/sys_set_getfn.ui +|----|----|----gem/aes/magic_/sys_set_setfn.ui +|----|----|----gem/aes/magic_/sys_set_winframe_manager.ui +|----|----|----gem/aes/magic_/sys_set_appl_getinfo.ui +|----|----gem/aes/menu_/menu_.u +|----|----|----gem/aes/menu_/menu_attach.ui +|----|----|----gem/aes/menu_/menu_bar.ui +|----|----|----gem/aes/menu_/menu_click.ui +|----|----|----gem/aes/menu_/menu_icheck.ui +|----|----|----gem/aes/menu_/menu_ienable.ui +|----|----|----gem/aes/menu_/menu_istart.ui +|----|----|----gem/aes/menu_/menu_popup.ui +|----|----|----gem/aes/menu_/menu_register.ui +|----|----|----gem/aes/menu_/menu_settings.ui +|----|----|----gem/aes/menu_/menu_text.ui +|----|----|----gem/aes/menu_/menu_tnormal.ui +|----|----|----gem/aes/menu_/menu_unregister.ui +|----|----gem/aes/objc_/objc_.u +|----|----|----gem/aes/objc_/objc_add.ui +|----|----|----gem/aes/objc_/objc_change.ui +|----|----|----gem/aes/objc_/objc_delete.ui +|----|----|----gem/aes/objc_/objc_draw.ui +|----|----|----gem/aes/objc_/objc_edit.ui +|----|----|----gem/aes/objc_/objc_find.ui +|----|----|----gem/aes/objc_/objc_offset.ui +|----|----|----gem/aes/objc_/objc_order.ui +|----|----|----gem/aes/objc_/objc_sysvar.ui +|----|----|----gem/aes/objc_/objc_wchange.ui +|----|----|----gem/aes/objc_/objc_wdraw.ui +|----|----|----gem/aes/objc_/objc_wedit.ui +|----|----|----gem/aes/objc_/objc_xedit.ui +|----|----|----gem/aes/objc_/objc_xfind.ui +|----|----|----gem/aes/objc_/x_objc_edit.ui +|----|----gem/aes/proc_/proc_.u +|----|----|----gem/aes/proc_/proc_create.ui +|----|----|----gem/aes/proc_/proc_delete.ui +|----|----|----gem/aes/proc_/proc_info.ui +|----|----|----gem/aes/proc_/proc_malloc.ui +|----|----|----gem/aes/proc_/proc_mfree.ui +|----|----|----gem/aes/proc_/proc_run.ui +|----|----|----gem/aes/proc_/proc_setblock.ui +|----|----|----gem/aes/proc_/proc_shrink.ui +|----|----|----gem/aes/proc_/proc_switch.ui +|----|----gem/aes/prop_/prop_.u +|----|----|----gem/aes/prop_/prop_del.ui +|----|----|----gem/aes/prop_/prop_get.ui +|----|----|----gem/aes/prop_/prop_gui_get.ui +|----|----|----gem/aes/prop_/prop_gui_set.ui +|----|----|----gem/aes/prop_/prop_put.ui +|----|----gem/aes/rsrc_/rsrc_.u +|----|----|----gem/aes/rsrc_/rsrc_free.ui +|----|----|----gem/aes/rsrc_/rsrc_gaddr.ui +|----|----|----gem/aes/rsrc_/rsrc_load.ui +|----|----|----gem/aes/rsrc_/rsrc_obfix.ui +|----|----|----gem/aes/rsrc_/rsrc_rcfix.ui +|----|----|----gem/aes/rsrc_/rsrc_saddr.ui +|----|----gem/aes/shel_/shel_.u +|----|----|----gem/aes/shel_/shel_envrn.ui +|----|----|----gem/aes/shel_/shel_find.ui +|----|----|----gem/aes/shel_/shel_get.ui +|----|----|----gem/aes/shel_/shel_help.ui +|----|----|----gem/aes/shel_/shel_put.ui +|----|----|----gem/aes/shel_/shel_rdef.ui +|----|----|----gem/aes/shel_/shel_read.ui +|----|----|----gem/aes/shel_/shel_wdef.ui +|----|----|----gem/aes/shel_/shel_write.ui +|----|----|----gem/aes/shel_/x_shel_get.ui +|----|----|----gem/aes/shel_/x_shel_put.ui +|----|----gem/aes/xgrf_/xgrf_.u +|----|----|----gem/aes/xgrf_/xgrf_2box.ui +|----|----|----gem/aes/xgrf_/xgrf_stepcalc.ui +|----|----|----gem/aes/xgrf_/xgrf_color.ui +|----|----|----gem/aes/xgrf_/xgrf_dtimage.ui +|----|----gem/aes/xshl_/xshl_.u +|----|----|----gem/aes/xshl_/xshl_getshell.ui +|----|----|----gem/aes/xshl_/xshl_setshell.ui +|----|----gem/aes/fnts_/fnts_.u +|----|----|----gem/aes/fnts_/fnts_add.ui +|----|----|----gem/aes/fnts_/fnts_close.ui +|----|----|----gem/aes/fnts_/fnts_create.ui +|----|----|----gem/aes/fnts_/fnts_delete.ui +|----|----|----gem/aes/fnts_/fnts_do.ui +|----|----|----gem/aes/fnts_/fnts_evnt.ui +|----|----|----gem/aes/fnts_/fnts_get_info.ui +|----|----|----gem/aes/fnts_/fnts_get_name.ui +|----|----|----gem/aes/fnts_/fnts_get_no_styles.ui +|----|----|----gem/aes/fnts_/fnts_get_style.ui +|----|----|----gem/aes/fnts_/fnts_open.ui +|----|----|----gem/aes/fnts_/fnts_remove.ui +|----|----|----gem/aes/fnts_/fnts_update.ui +|----|----|----gem/aes/fnts_/use.ui +|----|----gem/aes/aes_f.u +|----|----gem/aes/structures/structures.u +|----|----|----gem/aes/structures/AESPB.ui +|----|----|----gem/aes/structures/ANI_MOUSE.ui +|----|----|----gem/aes/structures/APPFLAGS.ui +|----|----|----gem/aes/structures/APPFLG.ui +|----|----|----gem/aes/structures/applrecord.ui +|----|----|----gem/aes/structures/bitblk.ui +|----|----|----gem/aes/structures/cicon.ui +|----|----|----gem/aes/structures/ciconblk.ui +|----|----|----gem/aes/structures/clrcat.ui +|----|----|----gem/aes/structures/dialog.ui +|----|----|----gem/aes/structures/dither_mode.ui +|----|----|----gem/aes/structures/drv_entry.ui +|----|----|----gem/aes/structures/drv_info.ui +|----|----|----gem/aes/structures/evnt.ui +|----|----|----gem/aes/structures/fnts_item.ui +|----|----|----gem/aes/structures/fnt_dialog.ui +|----|----|----gem/aes/structures/G_VECTORS.ui +|----|----|----gem/aes/structures/hndl_obj.ui +|----|----|----gem/aes/structures/iconblk.ui +|----|----|----gem/aes/structures/KEYCODE.ui +|----|----|----gem/aes/structures/lbox_item.ui +|----|----|----gem/aes/structures/list_box.ui +|----|----|----gem/aes/structures/media_size.ui +|----|----|----gem/aes/structures/media_type.ui +|----|----|----gem/aes/structures/menu.ui +|----|----|----gem/aes/structures/mform.ui +|----|----|----gem/aes/structures/mn_set.ui +|----|----|----gem/aes/structures/object.ui +|----|----|----gem/aes/structures/OB_PREFER.ui +|----|----|----gem/aes/structures/parmblk.ui +|----|----|----gem/aes/structures/pdlg_hndl.ui +|----|----|----gem/aes/structures/pdlg_init.ui +|----|----|----gem/aes/structures/pdlg_reset.ui +|----|----|----gem/aes/structures/pdlg_sub.ui +|----|----|----gem/aes/structures/popinfo.ui +|----|----|----gem/aes/structures/prn_dialog.ui +|----|----|----gem/aes/structures/prn_entry.ui +|----|----|----gem/aes/structures/prn_mode.ui +|----|----|----gem/aes/structures/prn_settings.ui +|----|----|----gem/aes/structures/prn_switch.ui +|----|----|----gem/aes/structures/prn_tray.ui +|----|----|----gem/aes/structures/rshdr.ui +|----|----|----gem/aes/structures/rsxhdr.ui +|----|----|----gem/aes/structures/scanx.ui +|----|----|----gem/aes/structures/SETTINGS.ui +|----|----|----gem/aes/structures/set_item.ui +|----|----|----gem/aes/structures/sheltail.ui +|----|----|----gem/aes/structures/shelw.ui +|----|----|----gem/aes/structures/slct_item.ui +|----|----|----gem/aes/structures/swinfo.ui +|----|----|----gem/aes/structures/tedinfo.ui +|----|----|----gem/aes/structures/userblk.ui +|----|----|----gem/aes/structures/utxt_fn.ui +|----|----|----gem/aes/structures/WIND_TREE.ui +|----|----|----gem/aes/structures/WINFRAME_HANDLER.ui +|----|----|----gem/aes/structures/WINFRAME_SETTINGS.ui +|----|----|----gem/aes/structures/WININFO.ui +|----|----|----gem/aes/structures/xaesmsg.ui +|----|----|----gem/aes/structures/xdo_inf.ui +|----|----|----gem/aes/structures/XFONTINFO.ui +|----|----|----gem/aes/structures/xfsl_filter.ui +|----|----|----gem/aes/structures/xshw_command.ui +|----|----|----gem/aes/structures/xted.ui +|----|----|----gem/aes/structures/x_buf_v2.ui +|----gem/cpxdoku.u +|----gem/guidelns/style.u +|----|----gem/guidelns/style_en.u +|----magic/magic.u +|----|----magic/magic_en.u +|----|----|----magic/magicerr.u +|----|----|----magic/magicinf.u +|----|----|----magic/shutdown/shutdown.u +|----|----|----|----magic/shutdown/shutdown_en.ui +|----|----|----magic/threads/threads.u +|----|----|----|----magic/threads/vdi.u +|----|----|----|----magic/threads/example.ui +|----|----|----magic/DFS/dfs.u +|----|----|----|----magic/DFS/dfs_en.ui +|----|----|----magic/XFS/xfs.u +|----|----|----|----magic/XFS/xfs_en.ui +|----|----|----magic/sharelib.u +|----n_aes/n_aes.u +|----xaaes/xaaes.u +|----|----xaaes/function/function.u +|----|----|----xaaes/function/appl_pipe.ui +|----|----|----xaaes/function/client_exit.ui +|----|----|----xaaes/function/new_client.ui +|----|----|----xaaes/function/rregen.ui +|----|----|----xaaes/function/wredraw.ui +|----magic/MagiC_Mac/magicmac.u +|----|----magic/MagiC_Mac/magicmac_en.ui +|----magic/MagiC_PC/magicpc.u +|----|----magic/MagiC_PC/magicpc_en.ui +|----emulator.en/stem.u +|----emulator.en/tos2win.u +|----emulator.en/sonstige.u +|----protokol/AV/av.u +|----|----protokol/AV/av_en.ui +|----protokol/BubbleGEM/bubble.u +|----|----protokol/BubbleGEM/bubble_en.ui +|----protokol/dd.u +|----protokol/dhst.u +|----protokol/font.u +|----protokol/gdps.ui +|----protokol/ltlproto.u +|----protokol/olga/olga.u +|----|----protokol/olga/olga_en.ui +|----protokol/seproto/seproto.u +|----|----protokol/seproto/seproto_en.ui +|----protokol/ssp/ssp.u +|----protokol/view.u +|----protokol/vscreen.u +|----protokol/xacc/xacc.u +|----|----protokol/xacc/xacc_en.ui +|----protokol/xfsl.u +|----protokol/xssi.u +|----anhang/anhang/anhang.u +|----|----anhang/anhang/ascii.ui +|----|----anhang/anhang/scan-code.ui +|----|----anhang/anhang/pmmu.u +|----|----anhang/anhang/tos_vers.u +|----|----anhang/anhang/xhdi/xhdi.u +|----|----|----anhang/anhang/xhdi/xhdi_en.ui +|----|----anhang/typedefs.u +|----|----|----anhang/typedefs/AESVARS.ui +|----|----|----anhang/typedefs/ARHEADER.ui +|----|----|----anhang/typedefs/BCB.ui +|----|----|----anhang/typedefs/CPXINFO.ui +|----|----|----anhang/typedefs/FlpDrvInfo.ui +|----|----|----anhang/typedefs/GEM_MUPB.ui +|----|----|----anhang/typedefs/GRECT.ui +|----|----|----anhang/typedefs/HDFUNCS.ui +|----|----|----anhang/typedefs/MacVersion.ui +|----|----|----anhang/typedefs/MCB.ui +|----|----|----anhang/typedefs/MD.ui +|----|----|----anhang/typedefs/MRETS.ui +|----|----|----anhang/typedefs/OHEADER.ui +|----|----|----anhang/typedefs/OSHEADER.ui +|----|----|----anhang/typedefs/PrintDesc.ui +|----|----|----anhang/typedefs/RGB_LIST.ui +|----|----|----anhang/typedefs/THREADINFO.ui +|----|----|----anhang/typedefs/XCPB.ui +/home/runner/work/tos.hyp/tos.hyp/gh-pages/en/udo0dXml2 + + 1 Introduction; /home/runner/work/tos.hyp/tos.hyp/tos_hyp.u; introduction + 1 1 Contact; anhang/hilfe.u; contact + 1 2 Old foreword by Rolf Kotzian; anhang/hilfe.u; old_preface + 1 3 History; anhang/neu.u; history + 1 3 1 Version 5.01; anhang/changes/05_01.ui; history + 1 3 2 Version 5.00; anhang/changes/05_00.ui; history + 1 3 3 Version 4.99; anhang/changes/04_99.ui; history + 1 3 4 Version 4.98; anhang/changes/04_98.ui; history + 1 3 5 Version 4.97; anhang/changes/04_97.ui; history + 1 3 6 Version 4.96; anhang/changes/04_96.ui; history + 1 3 7 Version 4.95; anhang/changes/04_95.ui; history + 1 3 8 Version 4.94; anhang/changes/04_94.ui; history + 1 3 9 Version 4.93; anhang/changes/04_93.ui; history + 1 3 10 Version 4.92; anhang/changes/04_92.ui; history + 1 3 11 Version 4.91; anhang/changes/04_91.ui; history + 1 3 12 Version 4.90; anhang/changes/04_90.ui; history + 1 3 13 Version 4.80 - 0.40; anhang/changes/old.ui; history + 1 4 The GNU General Public Licence; anhang/gpl.ui; gpl + 2 TOS; /home/runner/work/tos.hyp/tos.hyp/tos_hyp.u; tos_main + 2 1 The Operating System TOS; tos/tos_en.ui; tos_about + 2 2 GEM; tos/tos_en.ui; gem_about + 2 2 1 The various GEM versions; tos/tos_en.ui; gem_about + 3 BIOS; /home/runner/work/tos.hyp/tos.hyp/tos_hyp.u; bios_main + 3 1 About the BIOS; bios/bios_en.ui; About_the_BIOS + 3 1 1 bios-trap; bios/bios_trap.ui; About_the_BIOS + 3 1 2 Bconin; bios/function/bconin.u; About_the_BIOS + 3 1 2 1 Bindings for Bconin; bios/function/bconin.u; About_the_BIOS + 3 1 3 Bconout; bios/function/bconout.u; About_the_BIOS + 3 1 3 1 Bindings for Bconout; bios/function/bconout.u; About_the_BIOS + 3 1 4 Bconstat; bios/function/bconstat.u; About_the_BIOS + 3 1 4 1 Bindings for Bconstat; bios/function/bconstat.u; About_the_BIOS + 3 1 5 Bcostat; bios/function/bcostat.u; About_the_BIOS + 3 1 5 1 Bindings for Bcostat; bios/function/bcostat.u; About_the_BIOS + 3 1 6 Drvmap; bios/function/drvmap.u; About_the_BIOS + 3 1 6 1 Bindings for Drvmap; bios/function/drvmap.u; About_the_BIOS + 3 1 7 Getbpb; bios/function/getbpb.u; About_the_BIOS + 3 1 7 1 Bindings for Getbpb; bios/function/getbpb.u; About_the_BIOS + 3 1 8 Getmpb; bios/function/getmpb.u; About_the_BIOS + 3 1 8 1 Bindings for Getmpb; bios/function/getmpb.u; About_the_BIOS + 3 1 9 Kbshift; bios/function/kbshift.u; About_the_BIOS + 3 1 10 Bindings for Kbshift; bios/function/kbshift.u; About_the_BIOS + 3 1 11 Mediach; bios/function/mediach.u; About_the_BIOS + 3 1 11 1 Bindings for Mediach; bios/function/mediach.u; About_the_BIOS + 3 1 12 Rwabs; bios/function/rwabs.u; About_the_BIOS + 3 1 12 1 Bindings for Rwabs; bios/function/rwabs.u; About_the_BIOS + 3 1 13 Setexc; bios/function/setexc.u; About_the_BIOS + 3 1 13 1 Bindings for Setexc; bios/function/setexc.u; About_the_BIOS + 3 1 14 Tickcal; bios/function/tickcal.u; About_the_BIOS + 3 1 14 1 Bindings for Tickcal; bios/function/tickcal.u; About_the_BIOS + 3 2 The input/output channels of the BIOS; bios/bios_en.ui; bios_channels + 3 3 Hooking into the reset vector; bios/bios_en.ui; bios_resvector + 3 4 The system variables; bios/sys_var_en.u; bios_sysvars + 3 4 1 System variables, sorted numerically; bios/sys_var_en.u; bios_sysvars + 3 5 The system vectors; bios/sys_vec_en.ui; the_system_vectors + 3 6 BIOS error-messages; bios/bios_en.ui; bios_errors + 3 7 Cookie jar; bios/cookie/cookie_en.ui; bios_cookiejar + 3 7 1 Sample code; bios/cookie/example_en.ui; bios_cookiejar + 3 7 2 Cookie and XBRA list; bios/cookie/cookie_en.ui; bios_cookiejar + 3 7 2 1 Cookie, 3DMN; bios/cookie/description/3DMN.ui; bios_cookiejar + 3 7 2 2 Cookie, 3RDB; bios/cookie/description/3RDB.ui; bios_cookiejar + 3 7 2 3 Cookie, 60Hz; bios/cookie/description/60Hz.ui; bios_cookiejar + 3 7 2 4 Cookie, 8*8; bios/cookie/description/8_8.ui; bios_cookiejar + 3 7 2 5 Cookie, A2sv; bios/cookie/description/A2sv.ui; bios_cookiejar + 3 7 2 6 Cookie, AB40; bios/cookie/description/AB40.ui; bios_cookiejar + 3 7 2 7 Cookie, ACCS; bios/cookie/description/ACCS.ui; bios_cookiejar + 3 7 2 8 Cookie, AFnt; bios/cookie/description/AFnt.ui; bios_cookiejar + 3 7 2 9 Cookie, AgK0; bios/cookie/description/AgK0.ui; bios_cookiejar + 3 7 2 10 Cookie, AHVR; bios/cookie/description/AHVR.ui; bios_cookiejar + 3 7 2 11 Cookie, ALHP; bios/cookie/description/ALHP.ui; bios_cookiejar + 3 7 2 12 Cookie, ALIC; bios/cookie/description/ALIC.ui; bios_cookiejar + 3 7 2 13 Cookie, ALRM; bios/cookie/description/ALRM.ui; bios_cookiejar + 3 7 2 14 Cookie, AmAN; bios/cookie/description/AmAN.ui; bios_cookiejar + 3 7 2 15 Cookie, AMC1; bios/cookie/description/AMC1.ui; bios_cookiejar + 3 7 2 16 Cookie, AMC2; bios/cookie/description/AMC2.ui; bios_cookiejar + 3 7 2 17 Cookie, AMCG; bios/cookie/description/AMCG.ui; bios_cookiejar + 3 7 2 18 Cookie, ANSe; bios/cookie/description/ANSe.ui; bios_cookiejar + 3 7 2 19 Cookie, APGM; bios/cookie/description/APGM.ui; bios_cookiejar + 3 7 2 20 Cookie, ARAe; bios/cookie/description/ARAe.ui; bios_cookiejar + 3 7 2 21 Cookie, ARTS; bios/cookie/description/ARTS.ui; bios_cookiejar + 3 7 2 22 Cookie, asGT; bios/cookie/description/asGT.ui; bios_cookiejar + 3 7 2 23 Cookie, ASum; bios/cookie/description/ASum.ui; bios_cookiejar + 3 7 2 24 Cookie, AVmw; bios/cookie/description/AVmw.ui; bios_cookiejar + 3 7 2 25 Cookie, AVOJ; bios/cookie/description/AVOJ.ui; bios_cookiejar + 3 7 2 26 Cookie, AVSV; bios/cookie/description/AVSV.ui; bios_cookiejar + 3 7 2 27 Cookie, BASH; bios/cookie/description/BASH.ui; bios_cookiejar + 3 7 2 28 Cookie, BBD2; bios/cookie/description/BBD2.ui; bios_cookiejar + 3 7 2 29 Cookie, BCKW; bios/cookie/description/BCKW.ui; bios_cookiejar + 3 7 2 30 Cookie, BGEM; bios/cookie/description/BGEM.ui; bios_cookiejar + 3 7 2 31 Cookie, BGHD; bios/cookie/description/BGHD.ui; bios_cookiejar + 3 7 2 32 Cookie, BHdl; bios/cookie/description/BHdl.ui; bios_cookiejar + 3 7 2 33 Cookie, BHLP; bios/cookie/description/BHLP.ui; bios_cookiejar + 3 7 2 34 Cookie, BIGS; bios/cookie/description/BIGS.ui; bios_cookiejar + 3 7 2 35 Cookie, BIOC; bios/cookie/description/BIOC.ui; bios_cookiejar + 3 7 2 36 Cookie, BLNK; bios/cookie/description/BLNK.ui; bios_cookiejar + 3 7 2 37 Cookie, BLOW; bios/cookie/description/BLOW.ui; bios_cookiejar + 3 7 2 38 Cookie, BScn; bios/cookie/description/BScn.ui; bios_cookiejar + 3 7 2 39 Cookie, BSIM; bios/cookie/description/BSIM.ui; bios_cookiejar + 3 7 2 40 Cookie, BSTE; bios/cookie/description/BSTE.ui; bios_cookiejar + 3 7 2 41 Cookie, BUG1; bios/cookie/description/BUG1.ui; bios_cookiejar + 3 7 2 42 Cookie, C24P; bios/cookie/description/C24P.ui; bios_cookiejar + 3 7 2 43 Cookie, CACH; bios/cookie/description/CACH.ui; bios_cookiejar + 3 7 2 44 Cookie, CALD; bios/cookie/description/CALD.ui; bios_cookiejar + 3 7 2 45 Cookie, CASE; bios/cookie/description/CASE.ui; bios_cookiejar + 3 7 2 46 Cookie, CatS; bios/cookie/description/CatS.ui; bios_cookiejar + 3 7 2 47 Cookie, CaTT; bios/cookie/description/CaTT.ui; bios_cookiejar + 3 7 2 48 Cookie, CB2K; bios/cookie/description/CB2K.ui; bios_cookiejar + 3 7 2 49 Cookie, CBCE; bios/cookie/description/CBCE.ui; bios_cookiejar + 3 7 2 50 Cookie, CBDF; bios/cookie/description/CBDF.ui; bios_cookiejar + 3 7 2 51 Cookie, CBHD; bios/cookie/description/CBHD.ui; bios_cookiejar + 3 7 2 52 Cookie, CBHY; bios/cookie/description/CBHY.ui; bios_cookiejar + 3 7 2 53 Cookie, CBIT; bios/cookie/description/CBIT.ui; bios_cookiejar + 3 7 2 54 Cookie, CBTS; bios/cookie/description/CBTS.ui; bios_cookiejar + 3 7 2 55 Cookie, CCDA; bios/cookie/description/CCDA.ui; bios_cookiejar + 3 7 2 56 Cookie, cdMC; bios/cookie/description/cdMC.ui; bios_cookiejar + 3 7 2 57 Cookie, CDOT; bios/cookie/description/CDOT.ui; bios_cookiejar + 3 7 2 58 Cookie, ceci; bios/cookie/description/ceci.ui; bios_cookiejar + 3 7 2 59 Cookie, CFIX; bios/cookie/description/CFIX.ui; bios_cookiejar + 3 7 2 60 Cookie, CFsl; bios/cookie/description/CFsl.ui; bios_cookiejar + 3 7 2 61 Cookie, CHAM; bios/cookie/description/CHAM.ui; bios_cookiejar + 3 7 2 62 Cookie, CHBT; bios/cookie/description/CHBT.ui; bios_cookiejar + 3 7 2 63 Cookie, CHN1; bios/cookie/description/CHN1.ui; bios_cookiejar + 3 7 2 64 Cookie, CHNG; bios/cookie/description/CHNG.ui; bios_cookiejar + 3 7 2 65 Cookie, CHTW; bios/cookie/description/CHTW.ui; bios_cookiejar + 3 7 2 66 Cookie, CICN; bios/cookie/description/CICN.ui; bios_cookiejar + 3 7 2 67 Cookie, CISY; bios/cookie/description/CISY.ui; bios_cookiejar + 3 7 2 68 Cookie, CJar; bios/cookie/description/CJar.ui; bios_cookiejar + 3 7 2 69 Cookie, CJAR; bios/cookie/description/CJAR_.ui; bios_cookiejar + 3 7 2 70 Cookie, ck01; bios/cookie/description/ck01.ui; bios_cookiejar + 3 7 2 71 Cookie, CKBD; bios/cookie/description/CKBD.ui; bios_cookiejar + 3 7 2 72 Cookie, CKJR; bios/cookie/description/CKJR.ui; bios_cookiejar + 3 7 2 73 Cookie, CLCK; bios/cookie/description/CLCK.ui; bios_cookiejar + 3 7 2 74 Cookie, CLK1; bios/cookie/description/CLK1.ui; bios_cookiejar + 3 7 2 75 Cookie, CLOK; bios/cookie/description/CLOK.ui; bios_cookiejar + 3 7 2 76 Cookie, CM16; bios/cookie/description/CM16.ui; bios_cookiejar + 3 7 2 77 Cookie, CNTS; bios/cookie/description/CNTS.ui; bios_cookiejar + 3 7 2 78 Cookie, COLO; bios/cookie/description/COLO.ui; bios_cookiejar + 3 7 2 79 Cookie, CPSL; bios/cookie/description/CPSL.ui; bios_cookiejar + 3 7 2 80 Cookie, CRAC; bios/cookie/description/CRAC.ui; bios_cookiejar + 3 7 2 81 Cookie, CRIT; bios/cookie/description/CRIT.ui; bios_cookiejar + 3 7 2 82 Cookie, CSMD; bios/cookie/description/CSMD.ui; bios_cookiejar + 3 7 2 83 Cookie, CT40; bios/cookie/description/CT40.ui; bios_cookiejar + 3 7 2 84 Cookie, CT60; bios/cookie/description/CT60.ui; bios_cookiejar + 3 7 2 85 Cookie, CTCH; bios/cookie/description/CTCH.ui; bios_cookiejar + 3 7 2 86 Cookie, CtCp; bios/cookie/description/CtCp.ui; bios_cookiejar + 3 7 2 87 Cookie, CTSF; bios/cookie/description/CTSF.ui; bios_cookiejar + 3 7 2 88 Cookie, cVDI; bios/cookie/description/cVDI.ui; bios_cookiejar + 3 7 2 89 Cookie, CWCo; bios/cookie/description/CWCo.ui; bios_cookiejar + 3 7 2 90 Cookie, DATE; bios/cookie/description/DATE.ui; bios_cookiejar + 3 7 2 91 Cookie, DATL; bios/cookie/description/DATL.ui; bios_cookiejar + 3 7 2 92 Cookie, DAWN; bios/cookie/description/DAWN.ui; bios_cookiejar + 3 7 2 93 Cookie, DBFX; bios/cookie/description/DBFX.ui; bios_cookiejar + 3 7 2 94 Cookie, DCdd; bios/cookie/description/DCdd.ui; bios_cookiejar + 3 7 2 95 Cookie, DCF7; bios/cookie/description/DCF7.ui; bios_cookiejar + 3 7 2 96 Cookie, DCSD; bios/cookie/description/DCSD.ui; bios_cookiejar + 3 7 2 97 Cookie, DECD; bios/cookie/description/DECD.ui; bios_cookiejar + 3 7 2 98 Cookie, DEPI; bios/cookie/description/DEPI.ui; bios_cookiejar + 3 7 2 99 Cookie, DHST; bios/cookie/description/DHST.ui; bios_cookiejar + 3 7 2 100 Cookie, DIG2; bios/cookie/description/DIG2.ui; bios_cookiejar + 3 7 2 101 Cookie, DJBX; bios/cookie/description/DJBX.ui; bios_cookiejar + 3 7 2 102 Cookie, DKEY; bios/cookie/description/DKEY.ui; bios_cookiejar + 3 7 2 103 Cookie, DNTR; bios/cookie/description/DNTR.ui; bios_cookiejar + 3 7 2 104 Cookie, DPAT; bios/cookie/description/DPAT.ui; bios_cookiejar + 3 7 2 105 Cookie, DPRS; bios/cookie/description/DPRS.ui; bios_cookiejar + 3 7 2 106 Cookie, DRIV; bios/cookie/description/DRIV.ui; bios_cookiejar + 3 7 2 107 Cookie, DRRH; bios/cookie/description/DRRH.ui; bios_cookiejar + 3 7 2 108 Cookie, Dsel; bios/cookie/description/Dsel.ui; bios_cookiejar + 3 7 2 109 Cookie, DSSO; bios/cookie/description/DSSO.ui; bios_cookiejar + 3 7 2 110 Cookie, DYDL; bios/cookie/description/DYDL.ui; bios_cookiejar + 3 7 2 111 Cookie, DYJA; bios/cookie/description/DYJA.ui; bios_cookiejar + 3 7 2 112 Cookie, DYJD; bios/cookie/description/DYJD.ui; bios_cookiejar + 3 7 2 113 Cookie, DYJT; bios/cookie/description/DYJT.ui; bios_cookiejar + 3 7 2 114 Cookie, DYNL; bios/cookie/description/DYNL.ui; bios_cookiejar + 3 7 2 115 Cookie, DYwl; bios/cookie/description/DYwl.ui; bios_cookiejar + 3 7 2 116 Cookie, EADC; bios/cookie/description/EADC.ui; bios_cookiejar + 3 7 2 117 Cookie, EBPO; bios/cookie/description/EBPO.ui; bios_cookiejar + 3 7 2 118 Cookie, EdDI; bios/cookie/description/EdDI.ui; bios_cookiejar + 3 7 2 119 Cookie, EDFX; bios/cookie/description/EDFX.ui; bios_cookiejar + 3 7 2 120 Cookie, EGON; bios/cookie/description/EGON.ui; bios_cookiejar + 3 7 2 121 Cookie, EMNP; bios/cookie/description/EMNP.ui; bios_cookiejar + 3 7 2 122 Cookie, ENV$; bios/cookie/description/ENV$.ui; bios_cookiejar + 3 7 2 123 Cookie, ENVN; bios/cookie/description/ENVN.ui; bios_cookiejar + 3 7 2 124 Cookie, ENVR; bios/cookie/description/ENVR.ui; bios_cookiejar + 3 7 2 125 Cookie, EPro; bios/cookie/description/EPro.ui; bios_cookiejar + 3 7 2 126 Cookie, F117; bios/cookie/description/F117.ui; bios_cookiejar + 3 7 2 127 Cookie, ETM; bios/cookie/description/ETM.ui; bios_cookiejar + 3 7 2 128 Cookie, EURO; bios/cookie/description/EURO.ui; bios_cookiejar + 3 7 2 129 Cookie, EUSB; bios/cookie/description/EUSB.ui; bios_cookiejar + 3 7 2 130 Cookie, EXRA; bios/cookie/description/EXRA.ui; bios_cookiejar + 3 7 2 131 Cookie, EXTD; bios/cookie/description/EXTD.ui; bios_cookiejar + 3 7 2 132 Cookie, FaKE; bios/cookie/description/FaKE.ui; bios_cookiejar + 3 7 2 133 Cookie, FALT; bios/cookie/description/FALT.ui; bios_cookiejar + 3 7 2 134 Cookie, FAX!; bios/cookie/description/FAX_.ui; bios_cookiejar + 3 7 2 135 Cookie, FAXR; bios/cookie/description/FAXR.ui; bios_cookiejar + 3 7 2 136 Cookie, FHFX; bios/cookie/description/FHFX.ui; bios_cookiejar + 3 7 2 137 Cookie, FIX2; bios/cookie/description/FIX2.ui; bios_cookiejar + 3 7 2 138 Cookie, FLTP; bios/cookie/description/FLTP.ui; bios_cookiejar + 3 7 2 139 Cookie, FLXD; bios/cookie/description/FLXD.ui; bios_cookiejar + 3 7 2 140 Cookie, fMSX; bios/cookie/description/fMSX.ui; bios_cookiejar + 3 7 2 141 Cookie, Fose; bios/cookie/description/Fose.ui; bios_cookiejar + 3 7 2 142 Cookie, FOse; bios/cookie/description/FOse_.ui; bios_cookiejar + 3 7 2 143 Cookie, FrmD; bios/cookie/description/FrmD.ui; bios_cookiejar + 3 7 2 144 Cookie, FSEL; bios/cookie/description/FSEL.ui; bios_cookiejar + 3 7 2 145 Cookie, FSER; bios/cookie/description/FSER.ui; bios_cookiejar + 3 7 2 146 Cookie, FSMC; bios/cookie/description/FSMC.ui; bios_cookiejar + 3 7 2 147 Cookie, FSmp; bios/cookie/description/FSmp.ui; bios_cookiejar + 3 7 2 148 Cookie, fVDI; bios/cookie/description/fVDI.ui; bios_cookiejar + 3 7 2 149 Cookie, FxOP; bios/cookie/description/FxOP.ui; bios_cookiejar + 3 7 2 150 Cookie, F_3D; bios/cookie/description/F_3D.ui; bios_cookiejar + 3 7 2 151 Cookie, GABI; bios/cookie/description/GABI.ui; bios_cookiejar + 3 7 2 152 Cookie, GBel; bios/cookie/description/GBel.ui; bios_cookiejar + 3 7 2 153 Cookie, GCOM; bios/cookie/description/GCOM.ui; bios_cookiejar + 3 7 2 154 Cookie, GDEV; bios/cookie/description/GDEV.ui; bios_cookiejar + 3 7 2 155 Cookie, GEHC; bios/cookie/description/GEHC.ui; bios_cookiejar + 3 7 2 156 Cookie, GEHD; bios/cookie/description/GEHD.ui; bios_cookiejar + 3 7 2 157 Cookie, GEMB; bios/cookie/description/GEMB.ui; bios_cookiejar + 3 7 2 158 Cookie, GENV; bios/cookie/description/GENV.ui; bios_cookiejar + 3 7 2 159 Cookie, Gfix; bios/cookie/description/Gfix.ui; bios_cookiejar + 3 7 2 160 Cookie, GI30; bios/cookie/description/GI30.ui; bios_cookiejar + 3 7 2 161 Cookie, GIGA; bios/cookie/description/GIGA.ui; bios_cookiejar + 3 7 2 162 Cookie, gk5"; bios/cookie/description/gk5_.ui; bios_cookiejar + 3 7 2 163 Cookie, gkCO; bios/cookie/description/gkCO.ui; bios_cookiejar + 3 7 2 164 Cookie, GLAS; bios/cookie/description/GLAS.ui; bios_cookiejar + 3 7 2 165 Cookie, GLBL; bios/cookie/description/GLBL.ui; bios_cookiejar + 3 7 2 166 Cookie, GMNI; bios/cookie/description/GMNI.ui; bios_cookiejar + 3 7 2 167 Cookie, GMTC; bios/cookie/description/GMTC.ui; bios_cookiejar + 3 7 2 168 Cookie, GNUC; bios/cookie/description/GNUC.ui; bios_cookiejar + 3 7 2 169 Cookie, Gnva; bios/cookie/description/Gnva.ui; bios_cookiejar + 3 7 2 170 Cookie, GOBJ; bios/cookie/description/GOBJ.ui; bios_cookiejar + 3 7 2 171 Cookie, GOff; bios/cookie/description/GOff.ui; bios_cookiejar + 3 7 2 172 Cookie, GSND; bios/cookie/description/GSND.ui; bios_cookiejar + 3 7 2 173 Cookie, GSP1; bios/cookie/description/GSP1.ui; bios_cookiejar + 3 7 2 174 Cookie, GSXB; bios/cookie/description/GSXB.ui; bios_cookiejar + 3 7 2 175 Cookie, GULM; bios/cookie/description/GULM.ui; bios_cookiejar + 3 7 2 176 Cookie, HABO; bios/cookie/description/HABO.ui; bios_cookiejar + 3 7 2 177 Cookie, hade; bios/cookie/description/hade.ui; bios_cookiejar + 3 7 2 178 Cookie, HAMM; bios/cookie/description/HAMM.ui; bios_cookiejar + 3 7 2 179 Cookie, HBFS; bios/cookie/description/HBFS.ui; bios_cookiejar + 3 7 2 180 Cookie, HcP6; bios/cookie/description/HcP6.ui; bios_cookiejar + 3 7 2 181 Cookie, HDDR; bios/cookie/description/HDDR.ui; bios_cookiejar + 3 7 2 182 Cookie, HDEX; bios/cookie/description/HDEX.ui; bios_cookiejar + 3 7 2 183 Cookie, HDEY; bios/cookie/description/HDEY.ui; bios_cookiejar + 3 7 2 184 Cookie, HDJR; bios/cookie/description/HDJR.ui; bios_cookiejar + 3 7 2 185 Cookie, HDLD; bios/cookie/description/HDLD.ui; bios_cookiejar + 3 7 2 186 Cookie, HDPR; bios/cookie/description/HDPR.ui; bios_cookiejar + 3 7 2 187 Cookie, HDRC; bios/cookie/description/HDRC.ui; bios_cookiejar + 3 7 2 188 Cookie, HDST; bios/cookie/description/HDST.ui; bios_cookiejar + 3 7 2 189 Cookie, HDSW; bios/cookie/description/HDSW.ui; bios_cookiejar + 3 7 2 190 Cookie, HFIX; bios/cookie/description/HFIX.ui; bios_cookiejar + 3 7 2 191 Cookie, hFRB; bios/cookie/description/hFRB.ui; bios_cookiejar + 3 7 2 192 Cookie, HIDS; bios/cookie/description/HIDS.ui; bios_cookiejar + 3 7 2 193 Cookie, HMDU; bios/cookie/description/HMDU.ui; bios_cookiejar + 3 7 2 194 Cookie, HMOC; bios/cookie/description/HMOC.ui; bios_cookiejar + 3 7 2 195 Cookie, HMRD; bios/cookie/description/HMRD.ui; bios_cookiejar + 3 7 2 196 Cookie, HMRS; bios/cookie/description/HMRS.ui; bios_cookiejar + 3 7 2 197 Cookie, HPHC; bios/cookie/description/HPHC.ui; bios_cookiejar + 3 7 2 198 Cookie, HPLJ; bios/cookie/description/HPLJ.ui; bios_cookiejar + 3 7 2 199 Cookie, HSCD; bios/cookie/description/HSCD.ui; bios_cookiejar + 3 7 2 200 Cookie, HSND; bios/cookie/description/HSND.ui; bios_cookiejar + 3 7 2 201 Cookie, HWAM; bios/cookie/description/HWAM.ui; bios_cookiejar + 3 7 2 202 Cookie, IBMP; bios/cookie/description/IBMP.ui; bios_cookiejar + 3 7 2 203 Cookie, ICFS; bios/cookie/description/ICFS.ui; bios_cookiejar + 3 7 2 204 Cookie, ICST; bios/cookie/description/ICST.ui; bios_cookiejar + 3 7 2 205 Cookie, IDSK; bios/cookie/description/IDSK.ui; bios_cookiejar + 3 7 2 206 Cookie, IMAC; bios/cookie/description/IMAC.ui; bios_cookiejar + 3 7 2 207 Cookie, IMNE; bios/cookie/description/IMNE.ui; bios_cookiejar + 3 7 2 208 Cookie, INSJ; bios/cookie/description/INSJ.ui; bios_cookiejar + 3 7 2 209 Cookie, INXR; bios/cookie/description/INXR.ui; bios_cookiejar + 3 7 2 210 Cookie, iPRN; bios/cookie/description/iPRN.ui; bios_cookiejar + 3 7 2 211 Cookie, IRSB; bios/cookie/description/IRSB.ui; bios_cookiejar + 3 7 2 212 Cookie, iTMA; bios/cookie/description/iTMA.ui; bios_cookiejar + 3 7 2 213 Cookie, JAM1; bios/cookie/description/JAM1.ui; bios_cookiejar + 3 7 2 214 Cookie, JANU; bios/cookie/description/JANU.ui; bios_cookiejar + 3 7 2 215 Cookie, JB2G; bios/cookie/description/JB2G.ui; bios_cookiejar + 3 7 2 216 Cookie, JCLK; bios/cookie/description/JCLK.ui; bios_cookiejar + 3 7 2 217 Cookie, JCNB; bios/cookie/description/JCNB.ui; bios_cookiejar + 3 7 2 218 Cookie, JCNC; bios/cookie/description/JCNC.ui; bios_cookiejar + 3 7 2 219 Cookie, JCNH; bios/cookie/description/JCNH.ui; bios_cookiejar + 3 7 2 220 Cookie, JCNT; bios/cookie/description/JCNT.ui; bios_cookiejar + 3 7 2 221 Cookie, JFTP; bios/cookie/description/JFTP.ui; bios_cookiejar + 3 7 2 222 Cookie, JINX; bios/cookie/description/JINX.ui; bios_cookiejar + 3 7 2 223 Cookie, JMLB; bios/cookie/description/JMLB.ui; bios_cookiejar + 3 7 2 224 Cookie, JMLS; bios/cookie/description/JMLS.ui; bios_cookiejar + 3 7 2 225 Cookie, JSHD; bios/cookie/description/JSHD.ui; bios_cookiejar + 3 7 2 226 Cookie, JUST; bios/cookie/description/JUST.ui; bios_cookiejar + 3 7 2 227 Cookie, J_Sc; bios/cookie/description/J_Sc.ui; bios_cookiejar + 3 7 2 228 Cookie, KAOS; bios/cookie/description/KAOS.ui; bios_cookiejar + 3 7 2 229 Cookie, KbEv; bios/cookie/description/KbEv.ui; bios_cookiejar + 3 7 2 230 Cookie, KEYT; bios/cookie/description/KEYT.ui; bios_cookiejar + 3 7 2 231 Cookie, KGTF; bios/cookie/description/KGTF.ui; bios_cookiejar + 3 7 2 232 Cookie, KIDI; bios/cookie/description/KIDI.ui; bios_cookiejar + 3 7 2 233 Cookie, KLME; bios/cookie/description/KLME.ui; bios_cookiejar + 3 7 2 234 Cookie, KREG; bios/cookie/description/KREG.ui; bios_cookiejar + 3 7 2 235 Cookie, KyMp; bios/cookie/description/KyMp.ui; bios_cookiejar + 3 7 2 236 Cookie, KyWt; bios/cookie/description/KyWt.ui; bios_cookiejar + 3 7 2 237 Cookie, Lace; bios/cookie/description/Lace.ui; bios_cookiejar + 3 7 2 238 Cookie, LACY; bios/cookie/description/LACY.ui; bios_cookiejar + 3 7 2 239 Cookie, LALA; bios/cookie/description/LALA.ui; bios_cookiejar + 3 7 2 240 Cookie, lanc; bios/cookie/description/lanc.ui; bios_cookiejar + 3 7 2 241 Cookie, LASB; bios/cookie/description/LASB.ui; bios_cookiejar + 3 7 2 242 Cookie, LAWC; bios/cookie/description/LAWC.ui; bios_cookiejar + 3 7 2 243 Cookie, LDGM; bios/cookie/description/LDGM.ui; bios_cookiejar + 3 7 2 244 Cookie, LEDP; bios/cookie/description/LEDP.ui; bios_cookiejar + 3 7 2 245 Cookie, LEmu; bios/cookie/description/LEmu.ui; bios_cookiejar + 3 7 2 246 Cookie, Lity; bios/cookie/description/Lity.ui; bios_cookiejar + 3 7 2 247 Cookie, LLCR; bios/cookie/description/LLCR.ui; bios_cookiejar + 3 7 2 248 Cookie, LMus; bios/cookie/description/LMus.ui; bios_cookiejar + 3 7 2 249 Cookie, LOGB; bios/cookie/description/LOGB.ui; bios_cookiejar + 3 7 2 250 Cookie, LoSe; bios/cookie/description/LoSe.ui; bios_cookiejar + 3 7 2 251 Cookie, LPCD; bios/cookie/description/LPCD.ui; bios_cookiejar + 3 7 2 252 Cookie, LPJM; bios/cookie/description/LPJM.ui; bios_cookiejar + 3 7 2 253 Cookie, LP/2; bios/cookie/description/LP_2.ui; bios_cookiejar + 3 7 2 254 Cookie, LTMF; bios/cookie/description/LTMF.ui; bios_cookiejar + 3 7 2 255 Cookie, M16s; bios/cookie/description/M16s.ui; bios_cookiejar + 3 7 2 256 Cookie, M16X; bios/cookie/description/M16X.ui; bios_cookiejar + 3 7 2 257 Cookie, macc; bios/cookie/description/macc.ui; bios_cookiejar + 3 7 2 258 Cookie, MADD; bios/cookie/description/MADD.ui; bios_cookiejar + 3 7 2 259 Cookie, MADN; bios/cookie/description/MADN.ui; bios_cookiejar + 3 7 2 260 Cookie, Maes; bios/cookie/description/Maes.ui; bios_cookiejar + 3 7 2 261 Cookie, MagC; bios/cookie/description/MagC.ui; bios_cookiejar + 3 7 2 262 Cookie, MAGN; bios/cookie/description/MAGN.ui; bios_cookiejar + 3 7 2 263 Cookie, MagX; bios/cookie/description/MagX.ui; bios_cookiejar + 3 7 2 264 Cookie, MAST; bios/cookie/description/MAST.ui; bios_cookiejar + 3 7 2 265 Cookie, MaTC; bios/cookie/description/MaTC.ui; bios_cookiejar + 3 7 2 266 Cookie, MbAr; bios/cookie/description/MbAr.ui; bios_cookiejar + 3 7 2 267 Cookie, MBRD; bios/cookie/description/MBRD.ui; bios_cookiejar + 3 7 2 268 Cookie, MCL_; bios/cookie/description/MCL_.ui; bios_cookiejar + 3 7 2 269 Cookie, McSn; bios/cookie/description/McSn.ui; bios_cookiejar + 3 7 2 270 Cookie, MCSP; bios/cookie/description/MCSP.ui; bios_cookiejar + 3 7 2 271 Cookie, MCWR; bios/cookie/description/MCWR.ui; bios_cookiejar + 3 7 2 272 Cookie, MDIA; bios/cookie/description/MDIA.ui; bios_cookiejar + 3 7 2 273 Cookie, MDRK; bios/cookie/description/MDRK.ui; bios_cookiejar + 3 7 2 274 Cookie, MDSa; bios/cookie/description/MDSa.ui; bios_cookiejar + 3 7 2 275 Cookie, MFAC; bios/cookie/description/MFAC.ui; bios_cookiejar + 3 7 2 276 Cookie, MFFM; bios/cookie/description/MFFM.ui; bios_cookiejar + 3 7 2 277 Cookie, MFIX; bios/cookie/description/MFIX.ui; bios_cookiejar + 3 7 2 278 Cookie, MFMV; bios/cookie/description/MFMV.ui; bios_cookiejar + 3 7 2 279 Cookie, MFNT; bios/cookie/description/MFNT.ui; bios_cookiejar + 3 7 2 280 Cookie, MGEM; bios/cookie/description/MGEM.ui; bios_cookiejar + 3 7 2 281 Cookie, MgMc; bios/cookie/description/MgMc.ui; bios_cookiejar + 3 7 2 282 Cookie, MgMx; bios/cookie/description/MgMx.ui; bios_cookiejar + 3 7 2 283 Cookie, MgPC; bios/cookie/description/MgPC.ui; bios_cookiejar + 3 7 2 284 Cookie, MgSn; bios/cookie/description/MgSn.ui; bios_cookiejar + 3 7 2 285 Cookie, MID3; bios/cookie/description/MID3.ui; bios_cookiejar + 3 7 2 286 Cookie, MIMA; bios/cookie/description/MIMA.ui; bios_cookiejar + 3 7 2 287 Cookie, MiNT; bios/cookie/description/MiNT.ui; bios_cookiejar + 3 7 2 288 Cookie, MIPS; bios/cookie/description/MIPS.ui; bios_cookiejar + 3 7 2 289 Cookie, MJAF; bios/cookie/description/MJAF.ui; bios_cookiejar + 3 7 2 290 Cookie, MKHC; bios/cookie/description/MKHC.ui; bios_cookiejar + 3 7 2 291 Cookie, MkJr; bios/cookie/description/MkJr.ui; bios_cookiejar + 3 7 2 292 Cookie, MM2X; bios/cookie/description/MM2X.ui; bios_cookiejar + 3 7 2 293 Cookie, MMAC; bios/cookie/description/MMAC.ui; bios_cookiejar + 3 7 2 294 Cookie, MMUT; bios/cookie/description/MMUT.ui; bios_cookiejar + 3 7 2 295 Cookie, MM_2; bios/cookie/description/MM_2.ui; bios_cookiejar + 3 7 2 296 Cookie, MN3D; bios/cookie/description/MN3D.ui; bios_cookiejar + 3 7 2 297 Cookie, MNAM; bios/cookie/description/MNAM.ui; bios_cookiejar + 3 7 2 298 Cookie, MOAF; bios/cookie/description/MOAF.ui; bios_cookiejar + 3 7 2 299 Cookie, MOGR; bios/cookie/description/MOGR.ui; bios_cookiejar + 3 7 2 300 Cookie, MPRO; bios/cookie/description/MPRO.ui; bios_cookiejar + 3 7 2 301 Cookie, MRAM; bios/cookie/description/MRAM.ui; bios_cookiejar + 3 7 2 302 Cookie, MSPD; bios/cookie/description/MSPD.ui; bios_cookiejar + 3 7 2 303 Cookie, MSPO; bios/cookie/description/MSPO.ui; bios_cookiejar + 3 7 2 304 Cookie, mstx; bios/cookie/description/mstx.ui; bios_cookiejar + 3 7 2 305 Cookie, MTCI; bios/cookie/description/MTCI.ui; bios_cookiejar + 3 7 2 306 Cookie, MTft; bios/cookie/description/MTft.ui; bios_cookiejar + 3 7 2 307 Cookie, MUPF; bios/cookie/description/MUPF.ui; bios_cookiejar + 3 7 2 308 Cookie, MWHL; bios/cookie/description/MWHL.ui; bios_cookiejar + 3 7 2 309 Cookie, MZTR; bios/cookie/description/MZTR.ui; bios_cookiejar + 3 7 2 310 Cookie, MZVT; bios/cookie/description/MZVT.ui; bios_cookiejar + 3 7 2 311 Cookie, M_IN; bios/cookie/description/M_IN.ui; bios_cookiejar + 3 7 2 312 Cookie, N203; bios/cookie/description/N203.ui; bios_cookiejar + 3 7 2 313 Cookie, nAES; bios/cookie/description/nAES.ui; bios_cookiejar + 3 7 2 314 Cookie, NAH3; bios/cookie/description/NAH3.ui; bios_cookiejar + 3 7 2 315 Cookie, NBEL; bios/cookie/description/NBEL.ui; bios_cookiejar + 3 7 2 316 Cookie, NBLL; bios/cookie/description/NBLL.ui; bios_cookiejar + 3 7 2 317 Cookie, NCLN; bios/cookie/description/NCLN.ui; bios_cookiejar + 3 7 2 318 Cookie, ne2k; bios/cookie/description/ne2k.ui; bios_cookiejar + 3 7 2 319 Cookie, NERV; bios/cookie/description/NERV.ui; bios_cookiejar + 3 7 2 320 Cookie, NETS; bios/cookie/description/NETS.ui; bios_cookiejar + 3 7 2 321 Cookie, NEXB; bios/cookie/description/NEXB.ui; bios_cookiejar + 3 7 2 322 Cookie, NEXK; bios/cookie/description/NEXK.ui; bios_cookiejar + 3 7 2 323 Cookie, NFMT; bios/cookie/description/NFMT.ui; bios_cookiejar + 3 7 2 324 Cookie, NFnt; bios/cookie/description/NFnt.ui; bios_cookiejar + 3 7 2 325 Cookie, NKCC; bios/cookie/description/NKCC.ui; bios_cookiejar + 3 7 2 326 Cookie, NLdr; bios/cookie/description/NLdr.ui; bios_cookiejar + 3 7 2 327 Cookie, NMGE; bios/cookie/description/NMGE.ui; bios_cookiejar + 3 7 2 328 Cookie, NO7P; bios/cookie/description/NO7P.ui; bios_cookiejar + 3 7 2 329 Cookie, noCF; bios/cookie/description/noCF.ui; bios_cookiejar + 3 7 2 330 Cookie, NOR5; bios/cookie/description/NOR5.ui; bios_cookiejar + 3 7 2 331 Cookie, NOVA; bios/cookie/description/NOVA.ui; bios_cookiejar + 3 7 2 332 Cookie, NSC1; bios/cookie/description/NSC1.ui; bios_cookiejar + 3 7 2 333 Cookie, Nspd; bios/cookie/description/Nspd.ui; bios_cookiejar + 3 7 2 334 Cookie, nTAS; bios/cookie/description/nTAS.ui; bios_cookiejar + 3 7 2 335 Cookie, NTK4; bios/cookie/description/NTK4.ui; bios_cookiejar + 3 7 2 336 Cookie, nTOS; bios/cookie/description/nTOS.ui; bios_cookiejar + 3 7 2 337 Cookie, NUL>; bios/cookie/description/NUL_.ui; bios_cookiejar + 3 7 2 338 Cookie, NVDI; bios/cookie/description/NVDI.ui; bios_cookiejar + 3 7 2 339 Cookie, OBNL; bios/cookie/description/OBNL.ui; bios_cookiejar + 3 7 2 340 Cookie, OFLS; bios/cookie/description/OFLS.ui; bios_cookiejar + 3 7 2 341 Cookie, OPMM; bios/cookie/description/OPMM.ui; bios_cookiejar + 3 7 2 342 Cookie, OSBL; bios/cookie/description/OSBL.ui; bios_cookiejar + 3 7 2 343 Cookie, OSTT; bios/cookie/description/OSTT.ui; bios_cookiejar + 3 7 2 344 Cookie, OTOS; bios/cookie/description/OTOS.ui; bios_cookiejar + 3 7 2 345 Cookie, OV24; bios/cookie/description/OV24.ui; bios_cookiejar + 3 7 2 346 Cookie, oVDI; bios/cookie/description/oVDI.ui; bios_cookiejar + 3 7 2 347 Cookie, OVDJ; bios/cookie/description/OVDJ.ui; bios_cookiejar + 3 7 2 348 Cookie, OVEP; bios/cookie/description/OVEP.ui; bios_cookiejar + 3 7 2 349 Cookie, OVER; bios/cookie/description/OVER.ui; bios_cookiejar + 3 7 2 350 Cookie, OVEX; bios/cookie/description/OVEX.ui; bios_cookiejar + 3 7 2 351 Cookie, OVFS; bios/cookie/description/OVFS.ui; bios_cookiejar + 3 7 2 352 Cookie, OVIM; bios/cookie/description/OVIM.ui; bios_cookiejar + 3 7 2 353 Cookie, OVLS; bios/cookie/description/OVLS.ui; bios_cookiejar + 3 7 2 354 Cookie, OVRD; bios/cookie/description/OVRD.ui; bios_cookiejar + 3 7 2 355 Cookie, OVUT; bios/cookie/description/OVUT.ui; bios_cookiejar + 3 7 2 356 Cookie, OVWI; bios/cookie/description/OVWI.ui; bios_cookiejar + 3 7 2 357 Cookie, PAMN; bios/cookie/description/PAMN.ui; bios_cookiejar + 3 7 2 358 Cookie, PAUL; bios/cookie/description/PAUL.ui; bios_cookiejar + 3 7 2 359 Cookie, PBUG; bios/cookie/description/PBUG.ui; bios_cookiejar + 3 7 2 360 Cookie, PDEB; bios/cookie/description/PDEB.ui; bios_cookiejar + 3 7 2 361 Cookie, PDOS; bios/cookie/description/PDOS.ui; bios_cookiejar + 3 7 2 362 Cookie, PDRZ; bios/cookie/description/PDRZ.ui; bios_cookiejar + 3 7 2 363 Cookie, PFIX; bios/cookie/description/PFIX.ui; bios_cookiejar + 3 7 2 364 Cookie, Pinp; bios/cookie/description/Pinp.ui; bios_cookiejar + 3 7 2 365 Cookie, PKSH; bios/cookie/description/PKSH.ui; bios_cookiejar + 3 7 2 366 Cookie, PMMU; bios/cookie/description/PMMU.ui; bios_cookiejar + 3 7 2 367 Cookie, POIS; bios/cookie/description/POIS.ui; bios_cookiejar + 3 7 2 368 Cookie, POWM; bios/cookie/description/POWM.ui; bios_cookiejar + 3 7 2 369 Cookie, PRCS; bios/cookie/description/PRCS.ui; bios_cookiejar + 3 7 2 370 Cookie, PRDS; bios/cookie/description/PRDS.ui; bios_cookiejar + 3 7 2 371 Cookie, PRMD; bios/cookie/description/PRMD.ui; bios_cookiejar + 3 7 2 372 Cookie, PRN!; bios/cookie/description/PRN!.ui; bios_cookiejar + 3 7 2 373 Cookie, PRNß; bios/cookie/description/PRNSS.ui; bios_cookiejar + 3 7 2 374 Cookie, PRO5; bios/cookie/description/PRO5.ui; bios_cookiejar + 3 7 2 375 Cookie, PROB; bios/cookie/description/PROB.ui; bios_cookiejar + 3 7 2 376 Cookie, PROT; bios/cookie/description/PROT.ui; bios_cookiejar + 3 7 2 377 Cookie, PRTD; bios/cookie/description/PRTD.ui; bios_cookiejar + 3 7 2 378 Cookie, PRTO; bios/cookie/description/PRTO.ui; bios_cookiejar + 3 7 2 379 Cookie, prtr; bios/cookie/description/prtr.ui; bios_cookiejar + 3 7 2 380 Cookie, PRTR; bios/cookie/description/PRTR_.ui; bios_cookiejar + 3 7 2 381 Cookie, PSND; bios/cookie/description/PSND.ui; bios_cookiejar + 3 7 2 382 Cookie, PSSG; bios/cookie/description/PSSG.ui; bios_cookiejar + 3 7 2 383 Cookie, PTOS; bios/cookie/description/PTOS.ui; bios_cookiejar + 3 7 2 384 Cookie, QIKM; bios/cookie/description/QIKM.ui; bios_cookiejar + 3 7 2 385 Cookie, QMAC; bios/cookie/description/QMAC.ui; bios_cookiejar + 3 7 2 386 Cookie, QMCP; bios/cookie/description/QMCP.ui; bios_cookiejar + 3 7 2 387 Cookie, QST2; bios/cookie/description/QST2.ui; bios_cookiejar + 3 7 2 388 Cookie, QST3; bios/cookie/description/QST3.ui; bios_cookiejar + 3 7 2 389 Cookie, QUAN; bios/cookie/description/QUAN.ui; bios_cookiejar + 3 7 2 390 Cookie, RAIL; bios/cookie/description/RAIL.ui; bios_cookiejar + 3 7 2 391 Cookie, RaSn; bios/cookie/description/RaSn.ui; bios_cookiejar + 3 7 2 392 Cookie, RESG; bios/cookie/description/RESG.ui; bios_cookiejar + 3 7 2 393 Cookie, RFLX; bios/cookie/description/RFLX.ui; bios_cookiejar + 3 7 2 394 Cookie, RFUS; bios/cookie/description/RFUS.ui; bios_cookiejar + 3 7 2 395 Cookie, RGUS; bios/cookie/description/RGUS.ui; bios_cookiejar + 3 7 2 396 Cookie, RING; bios/cookie/description/RING.ui; bios_cookiejar + 3 7 2 397 Cookie, ROMD; bios/cookie/description/ROMD.ui; bios_cookiejar + 3 7 2 398 Cookie, ROT8; bios/cookie/description/ROT8.ui; bios_cookiejar + 3 7 2 399 Cookie, RPIT; bios/cookie/description/RPIT.ui; bios_cookiejar + 3 7 2 400 Cookie, RREG; bios/cookie/description/RREG.ui; bios_cookiejar + 3 7 2 401 Cookie, RSLT; bios/cookie/description/RSLT.ui; bios_cookiejar + 3 7 2 402 Cookie, RSpd; bios/cookie/description/RSpd.ui; bios_cookiejar + 3 7 2 403 Cookie, RSVE; bios/cookie/description/RSVE.ui; bios_cookiejar + 3 7 2 404 Cookie, RSVF; bios/cookie/description/RSVF.ui; bios_cookiejar + 3 7 2 405 Cookie, RTKC; bios/cookie/description/RTKC.ui; bios_cookiejar + 3 7 2 406 Cookie, RTOB; bios/cookie/description/RTOB.ui; bios_cookiejar + 3 7 2 407 Cookie, RWIN; bios/cookie/description/RWIN.ui; bios_cookiejar + 3 7 2 408 Cookie, SAM; bios/cookie/description/SAM.ui; bios_cookiejar + 3 7 2 409 Cookie, SBKM; bios/cookie/description/SBKM.ui; bios_cookiejar + 3 7 2 410 Cookie, SBTE; bios/cookie/description/SBTE.ui; bios_cookiejar + 3 7 2 411 Cookie, SBTS; bios/cookie/description/SBTS.ui; bios_cookiejar + 3 7 2 412 Cookie, SCAH; bios/cookie/description/SCAH.ui; bios_cookiejar + 3 7 2 413 Cookie, SCKM; bios/cookie/description/SCKM.ui; bios_cookiejar + 3 7 2 414 Cookie, SCPN; bios/cookie/description/SCPN.ui; bios_cookiejar + 3 7 2 415 Cookie, SCRD; bios/cookie/description/SCRD.ui; bios_cookiejar + 3 7 2 416 Cookie, SCRN; bios/cookie/description/SCRN.ui; bios_cookiejar + 3 7 2 417 Cookie, SCRS; bios/cookie/description/SCRS.ui; bios_cookiejar + 3 7 2 418 Cookie, SCRW; bios/cookie/description/SCRW.ui; bios_cookiejar + 3 7 2 419 Cookie, SCSI; bios/cookie/description/SCSI.ui; bios_cookiejar + 3 7 2 420 Cookie, SCSV; bios/cookie/description/SCSV.ui; bios_cookiejar + 3 7 2 421 Cookie, SDCH; bios/cookie/description/SDCH.ui; bios_cookiejar + 3 7 2 422 Cookie, SDES; bios/cookie/description/SDES.ui; bios_cookiejar + 3 7 2 423 Cookie, SDsk; bios/cookie/description/SDsk.ui; bios_cookiejar + 3 7 2 424 Cookie, SDWN; bios/cookie/description/SDWN.ui; bios_cookiejar + 3 7 2 425 Cookie, SELC; bios/cookie/description/SELC.ui; bios_cookiejar + 3 7 2 426 Cookie, SENV; bios/cookie/description/SENV.ui; bios_cookiejar + 3 7 2 427 Cookie, SFA^; bios/cookie/description/SFA^.ui; bios_cookiejar + 3 7 2 428 Cookie, SFIX; bios/cookie/description/SFIX.ui; bios_cookiejar + 3 7 2 429 Cookie, SFMN; bios/cookie/description/SFMN.ui; bios_cookiejar + 3 7 2 430 Cookie, ShLk; bios/cookie/description/ShLk.ui; bios_cookiejar + 3 7 2 431 Cookie, shlp; bios/cookie/description/shlp.ui; bios_cookiejar + 3 7 2 432 Cookie, SKEY; bios/cookie/description/SKEY.ui; bios_cookiejar + 3 7 2 433 Cookie, SLCT; bios/cookie/description/SLCT.ui; bios_cookiejar + 3 7 2 434 Cookie, SLif; bios/cookie/description/SLif.ui; bios_cookiejar + 3 7 2 435 Cookie, SLIP; bios/cookie/description/SLIP.ui; bios_cookiejar + 3 7 2 436 Cookie, SM00; bios/cookie/description/SM00.ui; bios_cookiejar + 3 7 2 437 Cookie, SM01; bios/cookie/description/SM01.ui; bios_cookiejar + 3 7 2 438 Cookie, SM02; bios/cookie/description/SM02.ui; bios_cookiejar + 3 7 2 439 Cookie, SMAL; bios/cookie/description/SMAL.ui; bios_cookiejar + 3 7 2 440 Cookie, SMAU; bios/cookie/description/SMAU.ui; bios_cookiejar + 3 7 2 441 Cookie, SMon; bios/cookie/description/SMon.ui; bios_cookiejar + 3 7 2 442 Cookie, SMTT; bios/cookie/description/SMTT.ui; bios_cookiejar + 3 7 2 443 Cookie, SNAP; bios/cookie/description/SNAP.ui; bios_cookiejar + 3 7 2 444 Cookie, SOFS; bios/cookie/description/SOFS.ui; bios_cookiejar + 3 7 2 445 Cookie, SOSW; bios/cookie/description/SOSW.ui; bios_cookiejar + 3 7 2 446 Cookie, SpcE; bios/cookie/description/SpcE.ui; bios_cookiejar + 3 7 2 447 Cookie, SPCK; bios/cookie/description/SPCK.ui; bios_cookiejar + 3 7 2 448 Cookie, SPEE; bios/cookie/description/SPEE.ui; bios_cookiejar + 3 7 2 449 Cookie, SPEK; bios/cookie/description/SPEK.ui; bios_cookiejar + 3 7 2 450 Cookie, SPEX; bios/cookie/description/SPEX.ui; bios_cookiejar + 3 7 2 451 Cookie, spMR; bios/cookie/description/spMR.ui; bios_cookiejar + 3 7 2 452 Cookie, Spol; bios/cookie/description/Spol.ui; bios_cookiejar + 3 7 2 453 Cookie, SPRG; bios/cookie/description/SPRG.ui; bios_cookiejar + 3 7 2 454 Cookie, SR17; bios/cookie/description/SR17.ui; bios_cookiejar + 3 7 2 455 Cookie, SSND; bios/cookie/description/SSND.ui; bios_cookiejar + 3 7 2 456 Cookie, ST-C; bios/cookie/description/ST-C.ui; bios_cookiejar + 3 7 2 457 Cookie, ST17; bios/cookie/description/ST17.ui; bios_cookiejar + 3 7 2 458 Cookie, STAT; bios/cookie/description/STAT.ui; bios_cookiejar + 3 7 2 459 Cookie, STEM; bios/cookie/description/STEM.ui; bios_cookiejar + 3 7 2 460 Cookie, STEW; bios/cookie/description/STEW.ui; bios_cookiejar + 3 7 2 461 Cookie, STFA; bios/cookie/description/STFA.ui; bios_cookiejar + 3 7 2 462 Cookie, StIc; bios/cookie/description/StIc.ui; bios_cookiejar + 3 7 2 463 Cookie, STiK; bios/cookie/description/STiK.ui; bios_cookiejar + 3 7 2 464 Cookie, STMS; bios/cookie/description/STMS.ui; bios_cookiejar + 3 7 2 465 Cookie, strk; bios/cookie/description/strk.ui; bios_cookiejar + 3 7 2 466 Cookie, STRX; bios/cookie/description/STRX.ui; bios_cookiejar + 3 7 2 467 Cookie, SupV; bios/cookie/description/SupV.ui; bios_cookiejar + 3 7 2 468 Cookie, SVAR; bios/cookie/description/SVAR.ui; bios_cookiejar + 3 7 2 469 Cookie, SVGA; bios/cookie/description/SVGA.ui; bios_cookiejar + 3 7 2 470 Cookie, SWAP; bios/cookie/description/SWAP.ui; bios_cookiejar + 3 7 2 471 Cookie, SwTm; bios/cookie/description/SwTm.ui; bios_cookiejar + 3 7 2 472 Cookie, SYMB; bios/cookie/description/SYMB.ui; bios_cookiejar + 3 7 2 473 Cookie, SYNL; bios/cookie/description/SYNL.ui; bios_cookiejar + 3 7 2 474 Cookie, SYNT; bios/cookie/description/SYNT.ui; bios_cookiejar + 3 7 2 475 Cookie, SysE; bios/cookie/description/SysE.ui; bios_cookiejar + 3 7 2 476 Cookie, Syso; bios/cookie/description/Syso.ui; bios_cookiejar + 3 7 2 477 Cookie, SYST; bios/cookie/description/SYST.ui; bios_cookiejar + 3 7 2 478 Cookie, SZ_M; bios/cookie/description/SZ_M.ui; bios_cookiejar + 3 7 2 479 Cookie, S_DR; bios/cookie/description/S_DR.ui; bios_cookiejar + 3 7 2 480 Cookie, T206; bios/cookie/description/T206.ui; bios_cookiejar + 3 7 2 481 Cookie, T2GM; bios/cookie/description/T2GM.ui; bios_cookiejar + 3 7 2 482 Cookie, TALK; bios/cookie/description/TALK.ui; bios_cookiejar + 3 7 2 483 Cookie, TAPE; bios/cookie/description/TAPE.ui; bios_cookiejar + 3 7 2 484 Cookie, TASS; bios/cookie/description/TASS.ui; bios_cookiejar + 3 7 2 485 Cookie, TCFS; bios/cookie/description/TCFS.ui; bios_cookiejar + 3 7 2 486 Cookie, TCRB; bios/cookie/description/TCRB.ui; bios_cookiejar + 3 7 2 487 Cookie, Tenv; bios/cookie/description/Tenv.ui; bios_cookiejar + 3 7 2 488 Cookie, TFIX; bios/cookie/description/TFIX.ui; bios_cookiejar + 3 7 2 489 Cookie, THNX; bios/cookie/description/THNX.ui; bios_cookiejar + 3 7 2 490 Cookie, THRM; bios/cookie/description/THRM.ui; bios_cookiejar + 3 7 2 491 Cookie, THST; bios/cookie/description/THST.ui; bios_cookiejar + 3 7 2 492 Cookie, TIM3; bios/cookie/description/TIM3.ui; bios_cookiejar + 3 7 2 493 Cookie, TIM5; bios/cookie/description/TIM5.ui; bios_cookiejar + 3 7 2 494 Cookie, TIME; bios/cookie/description/TIME.ui; bios_cookiejar + 3 7 2 495 Cookie, TK40; bios/cookie/description/TK40.ui; bios_cookiejar + 3 7 2 496 Cookie, TL3D; bios/cookie/description/TL3D.ui; bios_cookiejar + 3 7 2 497 Cookie, TLWV; bios/cookie/description/TLWV.ui; bios_cookiejar + 3 7 2 498 Cookie, Tmon; bios/cookie/description/Tmon.ui; bios_cookiejar + 3 7 2 499 Cookie, tmsW; bios/cookie/description/tmsW.ui; bios_cookiejar + 3 7 2 500 Cookie, TOpW; bios/cookie/description/TOpW.ui; bios_cookiejar + 3 7 2 501 Cookie, TOUC; bios/cookie/description/TOUC.ui; bios_cookiejar + 3 7 2 502 Cookie, TPat; bios/cookie/description/TPat.ui; bios_cookiejar + 3 7 2 503 Cookie, TPGM; bios/cookie/description/TPGM.ui; bios_cookiejar + 3 7 2 504 Cookie, TRAK; bios/cookie/description/TRAK.ui; bios_cookiejar + 3 7 2 505 Cookie, TraP; bios/cookie/description/TraP.ui; bios_cookiejar + 3 7 2 506 Cookie, Trpp; bios/cookie/description/Trpp.ui; bios_cookiejar + 3 7 2 507 Cookie, TRUE; bios/cookie/description/TRUE.ui; bios_cookiejar + 3 7 2 508 Cookie, TSEN; bios/cookie/description/TSEN.ui; bios_cookiejar + 3 7 2 509 Cookie, TSWP; bios/cookie/description/TSWP.ui; bios_cookiejar + 3 7 2 510 Cookie, TTTF; bios/cookie/description/TTTF.ui; bios_cookiejar + 3 7 2 511 Cookie, TUBS; bios/cookie/description/TUBS.ui; bios_cookiejar + 3 7 2 512 Cookie, TWFS; bios/cookie/description/TWFS.ui; bios_cookiejar + 3 7 2 513 Cookie, Typ1; bios/cookie/description/Typ1.ui; bios_cookiejar + 3 7 2 514 Cookie, UFSL; bios/cookie/description/UFSL.ui; bios_cookiejar + 3 7 2 515 Cookie, UIS3; bios/cookie/description/UIS3.ui; bios_cookiejar + 3 7 2 516 Cookie, UKB1; bios/cookie/description/UKB1.ui; bios_cookiejar + 3 7 2 517 Cookie, UKB3; bios/cookie/description/UKB3.ui; bios_cookiejar + 3 7 2 518 Cookie, UN*X; bios/cookie/description/un_x.ui; bios_cookiejar + 3 7 2 519 Cookie, USCK; bios/cookie/description/USCK.ui; bios_cookiejar + 3 7 2 520 Cookie, USHD; bios/cookie/description/USHD.ui; bios_cookiejar + 3 7 2 521 Cookie, UsNm; bios/cookie/description/UsNm.ui; bios_cookiejar + 3 7 2 522 Cookie, USPK; bios/cookie/description/USPK.ui; bios_cookiejar + 3 7 2 523 Cookie, USRS; bios/cookie/description/USRS.ui; bios_cookiejar + 3 7 2 524 Cookie, USSC; bios/cookie/description/USSC.ui; bios_cookiejar + 3 7 2 525 Cookie, UTRK; bios/cookie/description/UTRK.ui; bios_cookiejar + 3 7 2 526 Cookie, VBLF; bios/cookie/description/VBLF.ui; bios_cookiejar + 3 7 2 527 Cookie, VDIp; bios/cookie/description/VDIp.ui; bios_cookiejar + 3 7 2 528 Cookie, VDLY; bios/cookie/description/VDLY.ui; bios_cookiejar + 3 7 2 529 Cookie, VECS; bios/cookie/description/VECS.ui; bios_cookiejar + 3 7 2 530 Cookie, VeiL; bios/cookie/description/VeiL.ui; bios_cookiejar + 3 7 2 531 Cookie, VFIX; bios/cookie/description/VFIX.ui; bios_cookiejar + 3 7 2 532 Cookie, VFNT; bios/cookie/description/VFNT.ui; bios_cookiejar + 3 7 2 533 Cookie, VGAS; bios/cookie/description/VGAS.ui; bios_cookiejar + 3 7 2 534 Cookie, VI-2; bios/cookie/description/VI-2.ui; bios_cookiejar + 3 7 2 535 Cookie, View; bios/cookie/description/View.ui; bios_cookiejar + 3 7 2 536 Cookie, VIRA; bios/cookie/description/VIRA.ui; bios_cookiejar + 3 7 2 537 Cookie, VMEM; bios/cookie/description/VMEM.ui; bios_cookiejar + 3 7 2 538 Cookie, VPCH; bios/cookie/description/VPCH.ui; bios_cookiejar + 3 7 2 539 Cookie, VRAM; bios/cookie/description/VRAM.ui; bios_cookiejar + 3 7 2 540 Cookie, VREP; bios/cookie/description/VREP.ui; bios_cookiejar + 3 7 2 541 Cookie, VSco; bios/cookie/description/VSco.ui; bios_cookiejar + 3 7 2 542 Cookie, VSCR; bios/cookie/description/VSCR.ui; bios_cookiejar + 3 7 2 543 Cookie, VSTM; bios/cookie/description/VSTM.ui; bios_cookiejar + 3 7 2 544 Cookie, vT52; bios/cookie/description/vT52.ui; bios_cookiejar + 3 7 2 545 Cookie, VTFX; bios/cookie/description/VTFX.ui; bios_cookiejar + 3 7 2 546 Cookie, VXCK; bios/cookie/description/VXCK.ui; bios_cookiejar + 3 7 2 547 Cookie, WaHW; bios/cookie/description/WaHW.ui; bios_cookiejar + 3 7 2 548 Cookie, WARP; bios/cookie/description/WARP.ui; bios_cookiejar + 3 7 2 549 Cookie, WaSA; bios/cookie/description/WaSA.ui; bios_cookiejar + 3 7 2 550 Cookie, WBrd; bios/cookie/description/WBrd.ui; bios_cookiejar + 3 7 2 551 Cookie, wdlg; bios/cookie/description/wdlg.ui; bios_cookiejar + 3 7 2 552 Cookie, WDOG; bios/cookie/description/WDOG.ui; bios_cookiejar + 3 7 2 553 Cookie, WEGA; bios/cookie/description/WEGA.ui; bios_cookiejar + 3 7 2 554 Cookie, WfNa; bios/cookie/description/WfNa.ui; bios_cookiejar + 3 7 2 555 Cookie, WFSL; bios/cookie/description/WFSL.ui; bios_cookiejar + 3 7 2 556 Cookie, WICO; bios/cookie/description/WICO.ui; bios_cookiejar + 3 7 2 557 Cookie, WinK; bios/cookie/description/WinK.ui; bios_cookiejar + 3 7 2 558 Cookie, WINX; bios/cookie/description/WINX.ui; bios_cookiejar + 3 7 2 559 Cookie, WINZ; bios/cookie/description/WINZ.ui; bios_cookiejar + 3 7 2 560 Cookie, WPRO; bios/cookie/description/WPRO.ui; bios_cookiejar + 3 7 2 561 Cookie, WRAP; bios/cookie/description/WRAP.ui; bios_cookiejar + 3 7 2 562 Cookie, XALT; bios/cookie/description/XALT.ui; bios_cookiejar + 3 7 2 563 Cookie, XBTN; bios/cookie/description/XBTN.ui; bios_cookiejar + 3 7 2 564 Cookie, XDsk; bios/cookie/description/XDsk.ui; bios_cookiejar + 3 7 2 565 Cookie, XFRB; bios/cookie/description/XFRB.ui; bios_cookiejar + 3 7 2 566 Cookie, XFS1; bios/cookie/description/XFS1.ui; bios_cookiejar + 3 7 2 567 Cookie, xFSL; bios/cookie/description/xFSL.ui; bios_cookiejar + 3 7 2 568 Cookie, Xgem; bios/cookie/description/Xgem.ui; bios_cookiejar + 3 7 2 569 Cookie, XHDI; bios/cookie/description/XHDI.ui; bios_cookiejar + 3 7 2 570 Cookie, XKBD; bios/cookie/description/XKBD.ui; bios_cookiejar + 3 7 2 571 Cookie, XMMU; bios/cookie/description/XMMU.ui; bios_cookiejar + 3 7 2 572 Cookie, XMuz; bios/cookie/description/XMuz.ui; bios_cookiejar + 3 7 2 573 Cookie, xNet; bios/cookie/description/xNet.ui; bios_cookiejar + 3 7 2 574 Cookie, XPCI; bios/cookie/description/XPCI.ui; bios_cookiejar + 3 7 2 575 Cookie, xRmt; bios/cookie/description/xRmt.ui; bios_cookiejar + 3 7 2 576 Cookie, XSDD; bios/cookie/description/XSDD.ui; bios_cookiejar + 3 7 2 577 Cookie, XSND; bios/cookie/description/XSND.ui; bios_cookiejar + 3 7 2 578 Cookie, XSSI; bios/cookie/description/XSSI.ui; bios_cookiejar + 3 7 2 579 Cookie, XTOS; bios/cookie/description/XTOS.ui; bios_cookiejar + 3 7 2 580 Cookie, xUAG; bios/cookie/description/xUAG.ui; bios_cookiejar + 3 7 2 581 Cookie, xUFC; bios/cookie/description/xUFC.ui; bios_cookiejar + 3 7 2 582 Cookie, XWin; bios/cookie/description/XWin.ui; bios_cookiejar + 3 7 2 583 Cookie, zCAC; bios/cookie/description/zCAC.ui; bios_cookiejar + 3 7 2 584 Cookie, zDCF; bios/cookie/description/zDCF.ui; bios_cookiejar + 3 7 2 585 Cookie, _5MS; bios/cookie/description/_5MS.ui; bios_cookiejar + 3 7 2 586 Cookie, _AFM; bios/cookie/description/_AFM.ui; bios_cookiejar + 3 7 2 587 Cookie, _AKP; bios/cookie/description/_AKP.ui; bios_cookiejar + 3 7 2 588 Cookie, _CF_; bios/cookie/description/_CF_.ui; bios_cookiejar + 3 7 2 589 Cookie, _CPU; bios/cookie/description/_CPU.ui; bios_cookiejar + 3 7 2 590 Cookie, _DOS; bios/cookie/description/_DOS.ui; bios_cookiejar + 3 7 2 591 Cookie, _FDC; bios/cookie/description/_FDC.ui; bios_cookiejar + 3 7 2 592 Cookie, _FLK; bios/cookie/description/_FLK.ui; bios_cookiejar + 3 7 2 593 Cookie, _FPU; bios/cookie/description/_FPU.ui; bios_cookiejar + 3 7 2 594 Cookie, _FRB; bios/cookie/description/_FRB.ui; bios_cookiejar + 3 7 2 595 Cookie, ΣFSC; bios/cookie/description/_FSC.ui; bios_cookiejar + 3 7 2 596 Cookie, _FSR; bios/cookie/description/_FSR.ui; bios_cookiejar + 3 7 2 597 Cookie, _IDT; bios/cookie/description/_IDT.ui; bios_cookiejar + 3 7 2 598 Cookie, _INF; bios/cookie/description/_INF.ui; bios_cookiejar + 3 7 2 599 Cookie, _INU; bios/cookie/description/_INU.ui; bios_cookiejar + 3 7 2 600 Cookie, _ISO; bios/cookie/description/_ISO.ui; bios_cookiejar + 3 7 2 601 Cookie, _JPD; bios/cookie/description/_JPD.ui; bios_cookiejar + 3 7 2 602 Cookie, _MCF; bios/cookie/description/_MCF.ui; bios_cookiejar + 3 7 2 603 Cookie, _MCH; bios/cookie/description/_MCH.ui; bios_cookiejar + 3 7 2 604 Cookie, _MET; bios/cookie/description/_MET.ui; bios_cookiejar + 3 7 2 605 Cookie, _MIL; bios/cookie/description/_MIL.ui; bios_cookiejar + 3 7 2 606 Cookie, _NET; bios/cookie/description/_NET.ui; bios_cookiejar + 3 7 2 607 Cookie, _OOL; bios/cookie/description/_OOL.ui; bios_cookiejar + 3 7 2 608 Cookie, _PCI; bios/cookie/description/_PCI.ui; bios_cookiejar + 3 7 2 609 Cookie, _PKT; bios/cookie/description/_PKT.ui; bios_cookiejar + 3 7 2 610 Cookie, _PWR; bios/cookie/description/_PWR.ui; bios_cookiejar + 3 7 2 611 Cookie, _SLM; bios/cookie/description/_SLM.ui; bios_cookiejar + 3 7 2 612 Cookie, _SND; bios/cookie/description/_SND.ui; bios_cookiejar + 3 7 2 613 Cookie, _SWI; bios/cookie/description/_SWI.ui; bios_cookiejar + 3 7 2 614 Cookie, _T2W; bios/cookie/description/_T2W.ui; bios_cookiejar + 3 7 2 615 Cookie, _T30; bios/cookie/description/_T30.ui; bios_cookiejar + 3 7 2 616 Cookie, _USB; bios/cookie/description/_USB.ui; bios_cookiejar + 3 7 2 617 Cookie, _VDI; bios/cookie/description/_VDI.ui; bios_cookiejar + 3 7 2 618 Cookie, _VDO; bios/cookie/description/_VDO.ui; bios_cookiejar + 3 7 2 619 Cookie, __NF; bios/cookie/description/__NF.ui; bios_cookiejar + 3 8 VT-52 terminal; bios/vt52.u; VT_52_terminal + 3 8 1 Bell; bios/vt52.u; VT_52_terminal + 3 8 2 Blink_off; bios/vt52.u; VT_52_terminal + 3 8 3 Blink_on; bios/vt52.u; VT_52_terminal + 3 8 4 Clear_down; bios/vt52.u; VT_52_terminal + 3 8 5 Clear_eol; bios/vt52.u; VT_52_terminal + 3 8 6 Clear_home; bios/vt52.u; VT_52_terminal + 3 8 7 Clear_line; bios/vt52.u; VT_52_terminal + 3 8 8 Clear_sol; bios/vt52.u; VT_52_terminal + 3 8 9 Clear_up; bios/vt52.u; VT_52_terminal + 3 8 10 Cur_down; bios/vt52.u; VT_52_terminal + 3 8 11 Cur_home; bios/vt52.u; VT_52_terminal + 3 8 12 Cur_left; bios/vt52.u; VT_52_terminal + 3 8 13 Cur_off; bios/vt52.u; VT_52_terminal + 3 8 14 Cur_on; bios/vt52.u; VT_52_terminal + 3 8 15 Cur_right; bios/vt52.u; VT_52_terminal + 3 8 16 Cur_up; bios/vt52.u; VT_52_terminal + 3 8 17 Del_line; bios/vt52.u; VT_52_terminal + 3 8 18 Escape sequences; bios/vt52.u; VT_52_terminal + 3 8 19 Get_blink; bios/vt52.u; VT_52_terminal + 3 8 20 Goto_pos; bios/vt52.u; VT_52_terminal + 3 8 21 Ink; bios/vt52.u; VT_52_terminal + 3 8 22 Ins_line; bios/vt52.u; VT_52_terminal + 3 8 23 Line_feed; bios/vt52.u; VT_52_terminal + 3 8 24 Load_pos; bios/vt52.u; VT_52_terminal + 3 8 25 Paper; bios/vt52.u; VT_52_terminal + 3 8 26 Return; bios/vt52.u; VT_52_terminal + 3 8 27 Rev_off; bios/vt52.u; VT_52_terminal + 3 8 28 Rev_on; bios/vt52.u; VT_52_terminal + 3 8 29 Save_pos; bios/vt52.u; VT_52_terminal + 3 8 30 Scroll_up; bios/vt52.u; VT_52_terminal + 3 8 31 Set_blink; bios/vt52.u; VT_52_terminal + 3 8 32 Tab; bios/vt52.u; VT_52_terminal + 3 8 33 Wrap_off; bios/vt52.u; VT_52_terminal + 3 8 34 Wrap_on; bios/vt52.u; VT_52_terminal + 3 9 XBRA procedure; bios/xbra.u; xbra_main + 3 10 BSIM-BIOS-Extension; bios/bios_bsim.u; BSIM-BIOS-Extension + 3 10 1 bsim_id; bios/bsim/bsim_id.ui; BSIM-BIOS-Extension + 3 10 1 1 Bindings for bsim_id; bios/bsim/bsim_id.ui; BSIM-BIOS-Extension + 3 10 2 drv_change; bios/bsim/drv_change.ui; BSIM-BIOS-Extension + 3 10 2 1 Bindings for drv_change; bios/bsim/drv_change.ui; BSIM-BIOS-Extension + 3 10 3 drvprotec; bios/bsim/drvprotec.ui; BSIM-BIOS-Extension + 3 10 3 1 Bindings for drvprotec; bios/bsim/drvprotec.ui; BSIM-BIOS-Extension + 3 10 4 dstate; bios/bsim/dstate.ui; BSIM-BIOS-Extension + 3 10 4 1 Bindings for dstate; bios/bsim/dstate.ui; BSIM-BIOS-Extension + 3 10 5 kill_disk; bios/bsim/kill_disk.ui; BSIM-BIOS-Extension + 3 10 5 1 Bindings for kill_disk; bios/bsim/kill_disk.ui; BSIM-BIOS-Extension + 3 10 6 load_disk; bios/bsim/load_disk.ui; BSIM-BIOS-Extension + 3 10 6 1 Bindings for load_disk; bios/bsim/load_disk.ui; BSIM-BIOS-Extension + 3 10 7 save_disk; bios/bsim/save_disk.ui; BSIM-BIOS-Extension + 3 10 7 1 Bindings for save_disk; bios/bsim/save_disk.ui; BSIM-BIOS-Extension + 3 11 BIOS function list; bios/bios_f.u; bios_functions + 3 12 BIOS Structures; bios/structures/structures.u; bios_structures + 3 12 1 BPB; bios/structures/bpb.ui; bios_structures + 3 12 2 MD; bios/structures/md.ui; bios_structures + 3 12 3 MPB; bios/structures/mpb.ui; bios_structures + 3 12 4 patternrectdata; bios/structures/patternrectdata.ui; bios_structures + 3 12 5 PUN_INFO; bios/structures/pun_info.ui; bios_structures + 3 12 6 solidrectdata; bios/structures/solidrecdata.ui; bios_structures + 4 XBIOS; /home/runner/work/tos.hyp/tos.hyp/tos_hyp.u; xbios_main + 4 1 About the XBIOS; xbios/xbios.u; xbios_about + 4 2 MetaDOS; xbios/xbios.u; xbios_metados + 4 3 XBIOS error-messages; xbios/xbios.u; xbios_errors + 4 4 xbios-trap; xbios/xbios.u; xbios_trap + 4 5 Screen functions; xbios/bildscrm/bildscrm.u; Screen_functions + 4 5 1 Cursconf; xbios/bildscrm/cursconf.ui; Screen_functions + 4 5 1 1 Bindings for Cursconf; xbios/bildscrm/cursconf.ui; Screen_functions + 4 5 2 EgetPalette; xbios/bildscrm/egetpale.ui; Screen_functions + 4 5 2 1 Bindings for EgetPalette; xbios/bildscrm/egetpale.ui; Screen_functions + 4 5 3 EgetShift; xbios/bildscrm/egetshif.ui; Screen_functions + 4 5 3 1 Bindings for EgetShift; xbios/bildscrm/egetshif.ui; Screen_functions + 4 5 4 EsetBank; xbios/bildscrm/esetbank.ui; Screen_functions + 4 5 4 1 Bindings for EsetBank; xbios/bildscrm/esetbank.ui; Screen_functions + 4 5 5 EsetColor; xbios/bildscrm/esetcolo.ui; Screen_functions + 4 5 5 1 Bindings for EsetColor; xbios/bildscrm/esetcolo.ui; Screen_functions + 4 5 6 EsetGray; xbios/bildscrm/esetgray.ui; Screen_functions + 4 5 6 1 Bindings for EsetGray; xbios/bildscrm/esetgray.ui; Screen_functions + 4 5 7 EsetPalette; xbios/bildscrm/esetpale.ui; Screen_functions + 4 5 7 1 Bindings for EsetPalette; xbios/bildscrm/esetpale.ui; Screen_functions + 4 5 8 EsetShift; xbios/bildscrm/esetshif.ui; Screen_functions + 4 5 8 1 Bindings for EsetShift; xbios/bildscrm/esetshif.ui; Screen_functions + 4 5 9 EsetSmear; xbios/bildscrm/esetsmea.ui; Screen_functions + 4 5 9 1 Bindings for EsetSmear; xbios/bildscrm/esetsmea.ui; Screen_functions + 4 5 10 Getrez; xbios/bildscrm/getrez.ui; Screen_functions + 4 5 10 1 Bindings for Getrez; xbios/bildscrm/getrez.ui; Screen_functions + 4 5 11 Initmouse; xbios/bildscrm/initmous.ui; Screen_functions + 4 5 11 1 Bindings for Initmouse; xbios/bildscrm/initmous.ui; Screen_functions + 4 5 12 Logbase; xbios/bildscrm/logbase.ui; Screen_functions + 4 5 12 1 Bindings for Logbase; xbios/bildscrm/logbase.ui; Screen_functions + 4 5 13 mon_type; xbios/bildscrm/mon_type.ui; Screen_functions + 4 5 13 1 Bindings for mon_type; xbios/bildscrm/mon_type.ui; Screen_functions + 4 5 14 Physbase; xbios/bildscrm/physbase.ui; Screen_functions + 4 5 14 1 Bindings for Physbase; xbios/bildscrm/physbase.ui; Screen_functions + 4 5 15 Setcolor; xbios/bildscrm/setcolor.ui; Screen_functions + 4 5 15 1 Bindings for Setcolor; xbios/bildscrm/setcolor.ui; Screen_functions + 4 5 16 Setpalette; xbios/bildscrm/setpalet.ui; Screen_functions + 4 5 16 1 Bindings for Setpalette; xbios/bildscrm/setpalet.ui; Screen_functions + 4 5 17 Setscreen; xbios/bildscrm/setscree.ui; Screen_functions + 4 5 17 1 Bindings for Setscreen; xbios/bildscrm/setscree.ui; Screen_functions + 4 5 18 Setscreen, Milan; xbios/bildscrm/Setscreen_Milan.ui; Screen_functions + 4 5 19 Setscreen, ct60; xbios/bildscrm/Setscreen_ct60.ui; Screen_functions + 4 5 20 ValidMode; xbios/bildscrm/validmod.ui; Screen_functions + 4 5 20 1 Bindings for ValidMode; xbios/bildscrm/validmod.ui; Screen_functions + 4 5 21 VgetRGB; xbios/bildscrm/vgetrgb.ui; Screen_functions + 4 5 21 1 Bindings for VgetRGB; xbios/bildscrm/vgetrgb.ui; Screen_functions + 4 5 22 VsetScreen; xbios/bildscrm/vsetscre.ui; Screen_functions + 4 5 22 1 Bindings for VsetScreen; xbios/bildscrm/vsetscre.ui; Screen_functions + 4 5 23 VgetSize; xbios/bildscrm/vgetsize.ui; Screen_functions + 4 5 23 1 Bindings for VgetSize; xbios/bildscrm/vgetsize.ui; Screen_functions + 4 5 24 VsetMask; xbios/bildscrm/vsetmask.ui; Screen_functions + 4 5 24 1 Bindings for VsetMask; xbios/bildscrm/vsetmask.ui; Screen_functions + 4 5 25 VsetMode; xbios/bildscrm/vsetmode.ui; Screen_functions + 4 5 25 1 Bindings for VsetMode; xbios/bildscrm/vsetmode.ui; Screen_functions + 4 5 26 VsetRGB; xbios/bildscrm/vsetrgb.ui; Screen_functions + 4 5 26 1 Bindings for VsetRGB; xbios/bildscrm/vsetrgb.ui; Screen_functions + 4 5 27 VsetSync; xbios/bildscrm/vsetsync.ui; Screen_functions + 4 5 27 1 Bindings for VsetSync; xbios/bildscrm/vsetsync.ui; Screen_functions + 4 5 28 Vsync; xbios/bildscrm/vsync.ui; Screen_functions + 4 5 28 1 Bindings for Vsync; xbios/bildscrm/vsync.ui; Screen_functions + 4 5 29 Constants for the Falcon's video hardware; xbios/bildscrm/bildscrm.ui; Screen_functions + 4 6 CENTScreen XBIOS extension; xbios/centscrn/centscrn.u; CENTScreen_XBIOS_extension + 4 6 1 MultiMon; xbios/centscrn/multimon.ui; CENTScreen_XBIOS_extension + 4 6 1 1 Bindings for MultiMon; xbios/centscrn/multimon.ui; CENTScreen_XBIOS_extension + 4 6 2 SetMon; xbios/centscrn/setmon.ui; CENTScreen_XBIOS_extension + 4 6 2 1 Bindings for SetMon; xbios/centscrn/setmon.ui; CENTScreen_XBIOS_extension + 4 6 3 SizeComp; xbios/centscrn/sizecomp.ui; CENTScreen_XBIOS_extension + 4 6 3 1 Bindings for SizeComp; xbios/centscrn/sizecomp.ui; CENTScreen_XBIOS_extension + 4 6 4 Vattrib; xbios/centscrn/vattrib.ui; CENTScreen_XBIOS_extension + 4 6 4 1 Bindings for Vattrib; xbios/centscrn/vattrib.ui; CENTScreen_XBIOS_extension + 4 6 5 Vclose; xbios/centscrn/vclose.ui; CENTScreen_XBIOS_extension + 4 6 5 1 Bindings for Vclose; xbios/centscrn/vclose.ui; CENTScreen_XBIOS_extension + 4 6 6 Vcreate; xbios/centscrn/vcreate.ui; CENTScreen_XBIOS_extension + 4 6 6 1 Bindings for Vcreate; xbios/centscrn/vcreate.ui; CENTScreen_XBIOS_extension + 4 6 7 Vdelete; xbios/centscrn/vdelete.ui; CENTScreen_XBIOS_extension + 4 6 7 1 Bindings for Vdelete; xbios/centscrn/vdelete.ui; CENTScreen_XBIOS_extension + 4 6 8 Vfirst; xbios/centscrn/vfirst.ui; CENTScreen_XBIOS_extension + 4 6 8 1 Bindings for Vfirst; xbios/centscrn/vfirst.ui; CENTScreen_XBIOS_extension + 4 6 9 Vload; xbios/centscrn/vload.ui; CENTScreen_XBIOS_extension + 4 6 9 1 Bindings for Vload; xbios/centscrn/vload.ui; CENTScreen_XBIOS_extension + 4 6 10 Vlock; xbios/centscrn/vlock.ui; CENTScreen_XBIOS_extension + 4 6 10 1 Bindings for Vlock; xbios/centscrn/vlock.ui; CENTScreen_XBIOS_extension + 4 6 11 Vnext; xbios/centscrn/vnext.ui; CENTScreen_XBIOS_extension + 4 6 11 1 Bindings for Vnext; xbios/centscrn/vnext.ui; CENTScreen_XBIOS_extension + 4 6 12 Voffset; xbios/centscrn/voffset.ui; CENTScreen_XBIOS_extension + 4 6 12 1 Bindings for Voffset; xbios/centscrn/voffset.ui; CENTScreen_XBIOS_extension + 4 6 13 Vopen; xbios/centscrn/vopen.ui; CENTScreen_XBIOS_extension + 4 6 13 1 Bindings for Vopen; xbios/centscrn/vopen.ui; CENTScreen_XBIOS_extension + 4 6 14 Vread; xbios/centscrn/vread.ui; CENTScreen_XBIOS_extension + 4 6 14 1 Bindings for Vread; xbios/centscrn/vread.ui; CENTScreen_XBIOS_extension + 4 6 15 Vsave; xbios/centscrn/vsave.ui; CENTScreen_XBIOS_extension + 4 6 15 1 Bindings for Vsave; xbios/centscrn/vsave.ui; CENTScreen_XBIOS_extension + 4 6 16 Vscroll; xbios/centscrn/vscroll.ui; CENTScreen_XBIOS_extension + 4 6 16 1 Bindings for Vscroll; xbios/centscrn/vscroll.ui; CENTScreen_XBIOS_extension + 4 6 17 Vseek; xbios/centscrn/vseek.ui; CENTScreen_XBIOS_extension + 4 6 17 1 Bindings for Vseek; xbios/centscrn/vseek.ui; CENTScreen_XBIOS_extension + 4 6 18 Vsize; xbios/centscrn/vsize.ui; CENTScreen_XBIOS_extension + 4 6 18 1 Bindings for Vsize; xbios/centscrn/vsize.ui; CENTScreen_XBIOS_extension + 4 6 19 Vvalid; xbios/centscrn/vvalid.ui; CENTScreen_XBIOS_extension + 4 6 19 1 Bindings for Vvalid; xbios/centscrn/vvalid.ui; CENTScreen_XBIOS_extension + 4 6 20 Vwrite; xbios/centscrn/vwrite.ui; CENTScreen_XBIOS_extension + 4 6 20 1 Bindings for Vwrite; xbios/centscrn/vwrite.ui; CENTScreen_XBIOS_extension + 4 7 Crazy-Dots XBIOS extension; xbios/crazydot/crazydot.u; crazydots + 4 7 1 GetScreenDescriptor; xbios/crazydot/gscrdesc.ui; crazydots + 4 7 1 1 Bindings for GetScreenDescriptor; xbios/crazydot/gscrdesc.ui; crazydots + 4 7 2 ResetScreen; xbios/crazydot/resetscr.ui; crazydots + 4 7 2 1 Bindings for ResetScreen; xbios/crazydot/resetscr.ui; crazydots + 4 7 3 GetNumberofPModes; xbios/crazydot/getnofpm.ui; crazydots + 4 7 3 1 Bindings for GetNumberOfPModes; xbios/crazydot/getnofpm.ui; crazydots + 4 7 4 GetPMode; xbios/crazydot/getpmode.ui; crazydots + 4 7 4 1 Bindings for GetPMode; xbios/crazydot/getpmode.ui; crazydots + 4 7 5 ReadMode; xbios/crazydot/readmode.ui; crazydots + 4 7 5 1 Bindings for ReadMode; xbios/crazydot/readmode.ui; crazydots + 4 7 6 CopyModeToActiveMode; xbios/crazydot/cpmd2amd.ui; crazydots + 4 7 6 1 Bindings for CopyModeToActiveMode; xbios/crazydot/cpmd2amd.ui; crazydots + 4 7 7 ActiveModeNumber; xbios/crazydot/acmodenr.ui; crazydots + 4 7 7 1 Bindings for ActiveModeNumber; xbios/crazydot/acmodenr.ui; crazydots + 4 7 8 GetActiveModeDesc; xbios/crazydot/gamddesc.ui; crazydots + 4 7 8 1 Bindings for GetActiveModeDesc; xbios/crazydot/gamddesc.ui; crazydots + 4 7 9 GetRegisterbase; xbios/crazydot/gregbase.ui; crazydots + 4 7 9 1 Bindings for GetRegisterbase; xbios/crazydot/gregbase.ui; crazydots + 4 7 10 GetFeatures; xbios/crazydot/getfeat.ui; crazydots + 4 7 10 1 Bindings for GetFeatures; xbios/crazydot/getfeat.ui; crazydots + 4 7 11 GetActiveFeatures; xbios/crazydot/getafeat.ui; crazydots + 4 7 11 1 Bindings for GetActiveFeatures; xbios/crazydot/getafeat.ui; crazydots + 4 8 CT60 XBIOS extension; xbios/ct60/ct60.u; ct60 + 4 8 1 ct60_cache; xbios/ct60/cache.ui; ct60 + 4 8 1 1 Bindings for ct60_cache; xbios/ct60/cache.ui; ct60 + 4 8 2 ct60_flush_cache; xbios/ct60/fl_cache.ui; ct60 + 4 8 2 1 Bindings for ct60_flush_cache; xbios/ct60/fl_cache.ui; ct60 + 4 8 3 ct60_read_core_temperature; xbios/ct60/rcortemp.ui; ct60 + 4 8 3 1 Bindings for ct60_read_core_temperature; xbios/ct60/rcortemp.ui; ct60 + 4 8 4 ct60_rw_parameter; xbios/ct60/rd_param.ui; ct60 + 4 8 4 1 Bindings for ct60_rw_parameter; xbios/ct60/rd_param.ui; ct60 + 4 8 5 ct60_vmalloc; xbios/ct60/ct60_vmalloc.ui; ct60 + 4 8 5 1 Bindings for ct60_vmalloc; xbios/ct60/ct60_vmalloc.ui; ct60 + 4 9 Date, Time and Timer; xbios/datetime/datetime.u; xbios_datetime + 4 9 1 Gettime; xbios/datetime/gettime.ui; xbios_datetime + 4 9 1 1 Bindings for Gettime; xbios/datetime/gettime.ui; xbios_datetime + 4 9 2 NVMaccess; xbios/datetime/nvmacces.ui; xbios_datetime + 4 9 2 1 Bindings for NVMaccess; xbios/datetime/nvmacces.ui; xbios_datetime + 4 9 3 Settime; xbios/datetime/settime.ui; xbios_datetime + 4 9 3 1 Bindings for Settime; xbios/datetime/settime.ui; xbios_datetime + 4 9 4 Xbtimer; xbios/datetime/xbtimer.ui; xbios_datetime + 4 9 4 1 Bindings for Xbtimer; xbios/datetime/xbtimer.ui; xbios_datetime + 4 9 5 Assignment of the real-time clock's NVM; xbios/datetime/datetime.ui; xbios_datetime + 4 10 Printer functions; xbios/drucker/drucker.u; xbios_printer + 4 10 1 Prtblk; xbios/drucker/prtblk.ui; xbios_printer + 4 10 1 1 Bindings for Prtblk; xbios/drucker/prtblk.ui; xbios_printer + 4 10 2 Scrdmp; xbios/drucker/scrdmp.ui; xbios_printer + 4 10 2 1 Bindings for Scrdmp; xbios/drucker/scrdmp.ui; xbios_printer + 4 10 3 Setprt; xbios/drucker/setprt.ui; xbios_printer + 4 10 3 1 Bindings for Setprt; xbios/drucker/setprt.ui; xbios_printer + 4 11 DSP programming; xbios/dsp56001/dsp56001.u; xbios_dsp56001 + 4 11 1 Dsp_Available; xbios/dsp56001/availabl.ui; xbios_dsp56001 + 4 11 1 1 Bindings for Dsp_Available; xbios/dsp56001/availabl.ui; xbios_dsp56001 + 4 11 2 Dsp_BlkBytes; xbios/dsp56001/blkbytes.ui; xbios_dsp56001 + 4 11 2 1 Bindings for Dsp_BlkBytes; xbios/dsp56001/blkbytes.ui; xbios_dsp56001 + 4 11 3 Dsp_BlkHandShake; xbios/dsp56001/blkhndsh.ui; xbios_dsp56001 + 4 11 3 1 Bindings for Dsp_BlkHandShake; xbios/dsp56001/blkhndsh.ui; xbios_dsp56001 + 4 11 4 Dsp_BlkUnpacked; xbios/dsp56001/blkunpac.ui; xbios_dsp56001 + 4 11 4 1 Bindings for Dsp_BlkUnpacked; xbios/dsp56001/blkunpac.ui; xbios_dsp56001 + 4 11 5 Dsp_BlkWords; xbios/dsp56001/blkwords.ui; xbios_dsp56001 + 4 11 5 1 Bindings for Dsp_BlkWords; xbios/dsp56001/blkwords.ui; xbios_dsp56001 + 4 11 6 Dsp_DoBlock; xbios/dsp56001/doblock.ui; xbios_dsp56001 + 4 11 6 1 Bindings for Dsp_DoBlock; xbios/dsp56001/doblock.ui; xbios_dsp56001 + 4 11 7 Dsp_ExecBoot; xbios/dsp56001/execboot.ui; xbios_dsp56001 + 4 11 7 1 Bindings for Dsp_ExecBoot; xbios/dsp56001/execboot.ui; xbios_dsp56001 + 4 11 8 Dsp_ExecProg; xbios/dsp56001/execprog.ui; xbios_dsp56001 + 4 11 8 1 Bindings for Dsp_ExecProg; xbios/dsp56001/execprog.ui; xbios_dsp56001 + 4 11 9 Dsp_FlushSubroutines; xbios/dsp56001/flushsub.ui; xbios_dsp56001 + 4 11 9 1 Bindings for Dsp_FlushSubroutines; xbios/dsp56001/flushsub.ui; xbios_dsp56001 + 4 11 10 Dsp_GetProgAbility; xbios/dsp56001/getproga.ui; xbios_dsp56001 + 4 11 10 1 Bindings for Dsp_GetProgAbility; xbios/dsp56001/getproga.ui; xbios_dsp56001 + 4 11 11 Dsp_GetWordSize; xbios/dsp56001/getwords.ui; xbios_dsp56001 + 4 11 11 1 Bindings for Dsp_GetWordSize; xbios/dsp56001/getwords.ui; xbios_dsp56001 + 4 11 12 Dsp_Hf0; xbios/dsp56001/hf0.ui; xbios_dsp56001 + 4 11 12 1 Bindings for Dsp_Hf0; xbios/dsp56001/hf0.ui; xbios_dsp56001 + 4 11 13 Dsp_Hf1; xbios/dsp56001/hf1.ui; xbios_dsp56001 + 4 11 13 1 Bindings for Dsp_Hf1; xbios/dsp56001/hf1.ui; xbios_dsp56001 + 4 11 14 Dsp_Hf2; xbios/dsp56001/hf2.ui; xbios_dsp56001 + 4 11 14 1 Bindings for Dsp_Hf2; xbios/dsp56001/hf2.ui; xbios_dsp56001 + 4 11 15 Dsp_Hf3; xbios/dsp56001/hf3.ui; xbios_dsp56001 + 4 11 15 1 Bindings for Dsp_Hf3; xbios/dsp56001/hf3.ui; xbios_dsp56001 + 4 11 16 Dsp_HStat; xbios/dsp56001/hstat.ui; xbios_dsp56001 + 4 11 16 1 Bindings for Dsp_HStat; xbios/dsp56001/hstat.ui; xbios_dsp56001 + 4 11 17 Dsp_InqSubrAbility; xbios/dsp56001/inqsubra.ui; xbios_dsp56001 + 4 11 17 1 Bindings for Dsp_InqSubrAbility; xbios/dsp56001/inqsubra.ui; xbios_dsp56001 + 4 11 18 Dsp_InStream; xbios/dsp56001/instream.ui; xbios_dsp56001 + 4 11 18 1 Bindings for Dsp_InStream; xbios/dsp56001/instream.ui; xbios_dsp56001 + 4 11 19 Dsp_IOStream; xbios/dsp56001/iostream.ui; xbios_dsp56001 + 4 11 19 1 Bindings for Dsp_IOStream; xbios/dsp56001/iostream.ui; xbios_dsp56001 + 4 11 20 Dsp_LoadProg; xbios/dsp56001/loadprog.ui; xbios_dsp56001 + 4 11 20 1 Bindings for Dsp_LoadProg; xbios/dsp56001/loadprog.ui; xbios_dsp56001 + 4 11 21 Dsp_LoadSubroutine; xbios/dsp56001/loadsubr.ui; xbios_dsp56001 + 4 11 21 1 Bindings for Dsp_LoadSubroutine; xbios/dsp56001/loadsubr.ui; xbios_dsp56001 + 4 11 22 Dsp_Lock; xbios/dsp56001/lock.ui; xbios_dsp56001 + 4 11 22 1 Bindings for Dsp_Lock; xbios/dsp56001/lock.ui; xbios_dsp56001 + 4 11 23 Dsp_LodToBinary; xbios/dsp56001/lodtobin.ui; xbios_dsp56001 + 4 11 23 1 Bindings for Dsp_LodToBinary; xbios/dsp56001/lodtobin.ui; xbios_dsp56001 + 4 11 24 Dsp_MultBlocks; xbios/dsp56001/multbloc.ui; xbios_dsp56001 + 4 11 24 1 Bindings for Dsp_MultBlocks; xbios/dsp56001/multbloc.ui; xbios_dsp56001 + 4 11 25 Dsp_OutStream; xbios/dsp56001/outstrea.ui; xbios_dsp56001 + 4 11 25 1 Bindings for Dsp_OutStream; xbios/dsp56001/outstrea.ui; xbios_dsp56001 + 4 11 26 Dsp_RemoveInterrupts; xbios/dsp56001/removein.ui; xbios_dsp56001 + 4 11 26 1 Bindings for Dsp_RemoveInterrupts; xbios/dsp56001/removein.ui; xbios_dsp56001 + 4 11 27 Dsp_RequestUniqueAbility; xbios/dsp56001/requestu.ui; xbios_dsp56001 + 4 11 27 1 Bindings for Dsp_RequestUniqueAbility; xbios/dsp56001/requestu.ui; xbios_dsp56001 + 4 11 28 Dsp_Reserve; xbios/dsp56001/reserve.ui; xbios_dsp56001 + 4 11 28 1 Bindings for Dsp_Reserve; xbios/dsp56001/reserve.ui; xbios_dsp56001 + 4 11 29 Dsp_RunSubroutine; xbios/dsp56001/runsubro.ui; xbios_dsp56001 + 4 11 29 1 Bindings for Dsp_RunSubroutine; xbios/dsp56001/runsubro.ui; xbios_dsp56001 + 4 11 30 Dsp_SetVectors; xbios/dsp56001/setvecto.ui; xbios_dsp56001 + 4 11 30 1 Bindings for Dsp_SetVectors; xbios/dsp56001/setvecto.ui; xbios_dsp56001 + 4 11 31 Dsp_TriggerHC; xbios/dsp56001/triggerh.ui; xbios_dsp56001 + 4 11 31 1 Bindings for Dsp_TriggerHC; xbios/dsp56001/triggerh.ui; xbios_dsp56001 + 4 11 32 Dsp_Unlock; xbios/dsp56001/unlock.ui; xbios_dsp56001 + 4 11 32 1 Bindings for Dsp_Unlock; xbios/dsp56001/unlock.ui; xbios_dsp56001 + 4 12 Hatari DHS XBIOS extension; xbios/dhs/dhs.u; xbios_dhs + 4 12 1 CounterRead; xbios/dhs/cyclesrd.ui; xbios_dhs + 4 12 1 1 Bindings for CounterRead; xbios/dhs/cyclesrd.ui; xbios_dhs + 4 12 2 CounterStart; xbios/dhs/cyclesst.ui; xbios_dhs + 4 12 2 1 Bindings for CounterStart; xbios/dhs/cyclesst.ui; xbios_dhs + 4 12 3 CPUFreq; xbios/dhs/frequenc.ui; xbios_dhs + 4 12 3 1 Bindings for CPUFreq; xbios/dhs/frequenc.ui; xbios_dhs + 4 12 4 Debug; xbios/dhs/debug.ui; xbios_dhs + 4 12 4 1 Bindings for Debug; xbios/dhs/debug.ui; xbios_dhs + 4 12 5 DebugUI; xbios/dhs/debugui.ui; xbios_dhs + 4 12 5 1 Bindings for DebugUI; xbios/dhs/debugui.ui; xbios_dhs + 4 12 6 HatariOption; xbios/dhs/hatariop.ui; xbios_dhs + 4 12 6 1 Bindings for HatariOption; xbios/dhs/hatariop.ui; xbios_dhs + 4 12 7 Registers; xbios/dhs/register.ui; xbios_dhs + 4 12 7 1 Bindings for Registers; xbios/dhs/register.ui; xbios_dhs + 4 13 Interrupt functions; xbios/interrpt/interrpt.u; xbios_interrupt + 4 13 1 Jdisint; xbios/interrpt/jdisint.ui; xbios_interrupt + 4 13 1 1 Bindings for Jdisint; xbios/interrpt/jdisint.ui; xbios_interrupt + 4 13 2 Jenabint; xbios/interrpt/jenabint.ui; xbios_interrupt + 4 13 2 1 Bindings for Jenabint; xbios/interrpt/jenabint.ui; xbios_interrupt + 4 14 Drive functions; xbios/laufwerk/laufwerk.u; xbios_drive + 4 14 1 DMAread; xbios/laufwerk/dmaread.ui; xbios_drive + 4 14 1 1 Bindings for DMAread; xbios/laufwerk/dmaread.ui; xbios_drive + 4 14 2 DMAwrite; xbios/laufwerk/dmawrite.ui; xbios_drive + 4 14 2 1 Bindings for DMAwrite; xbios/laufwerk/dmawrite.ui; xbios_drive + 4 14 3 Flopfmt; xbios/laufwerk/flopfmt.ui; xbios_drive + 4 14 3 1 Bindings for Flopfmt; xbios/laufwerk/flopfmt.ui; xbios_drive + 4 14 4 Floprate; xbios/laufwerk/floprate.ui; xbios_drive + 4 14 4 1 Bindings for Floprate; xbios/laufwerk/floprate.ui; xbios_drive + 4 14 4 2 Seekrate for all TOS versions; xbios/laufwerk/floprate.ui; xbios_drive + 4 14 5 Floprd; xbios/laufwerk/floprd.ui; xbios_drive + 4 14 5 1 Bindings for Floprd; xbios/laufwerk/floprd.ui; xbios_drive + 4 14 6 Flopver; xbios/laufwerk/flopver.ui; xbios_drive + 4 14 6 1 Bindings for Flopver; xbios/laufwerk/flopver.ui; xbios_drive + 4 14 7 Flopwr; xbios/laufwerk/flopwr.ui; xbios_drive + 4 14 7 1 Bindings for Flopwr; xbios/laufwerk/flopwr.ui; xbios_drive + 4 14 8 Metaclose; xbios/laufwerk/metaclos.ui; xbios_drive + 4 14 8 1 Bindings for Metaclose; xbios/laufwerk/metaclos.ui; xbios_drive + 4 14 9 Metadiscinfo; xbios/laufwerk/metadinf.ui; xbios_drive + 4 14 9 1 Bindings for Metadiscinfo; xbios/laufwerk/metadinf.ui; xbios_drive + 4 14 10 Metagettoc; xbios/laufwerk/metagett.ui; xbios_drive + 4 14 10 1 Bindings for Metagettoc; xbios/laufwerk/metagett.ui; xbios_drive + 4 14 11 Metainit; xbios/laufwerk/metainit.ui; xbios_drive + 4 14 11 1 Bindings for Metainit; xbios/laufwerk/metainit.ui; xbios_drive + 4 14 12 Metaioctl; xbios/laufwerk/metaioct.ui; xbios_drive + 4 14 12 1 Bindings for Metaioctl; xbios/laufwerk/metaioct.ui; xbios_drive + 4 14 13 Metaopen; xbios/laufwerk/metaopen.ui; xbios_drive + 4 14 13 1 Bindings for Metaopen; xbios/laufwerk/metaopen.ui; xbios_drive + 4 14 14 Metaread; xbios/laufwerk/metaread.ui; xbios_drive + 4 14 14 1 Bindings for Metaread; xbios/laufwerk/metaread.ui; xbios_drive + 4 14 15 Metaseek; xbios/laufwerk/metaseek.ui; xbios_drive + 4 14 15 1 Bindings for Metaseek; xbios/laufwerk/metaseek.ui; xbios_drive + 4 14 16 Metasetsongtime; xbios/laufwerk/metasets.ui; xbios_drive + 4 14 16 1 Bindings for Metasetsongtime; xbios/laufwerk/metasets.ui; xbios_drive + 4 14 17 Metastartaudio; xbios/laufwerk/metastar.ui; xbios_drive + 4 14 17 1 Bindings for Metastartaudio; xbios/laufwerk/metastar.ui; xbios_drive + 4 14 18 Metastatus; xbios/laufwerk/metastat.ui; xbios_drive + 4 14 18 1 Bindings for Metastatus; xbios/laufwerk/metastat.ui; xbios_drive + 4 14 19 Metastopaudio; xbios/laufwerk/metastop.ui; xbios_drive + 4 14 19 1 Bindings for Metastopaudio; xbios/laufwerk/metastop.ui; xbios_drive + 4 14 20 Metawrite; xbios/laufwerk/metawrit.ui; xbios_drive + 4 14 20 1 Bindings for Metawrite; xbios/laufwerk/metawrit.ui; xbios_drive + 4 14 21 Protobt; xbios/laufwerk/protobt.ui; xbios_drive + 4 14 21 1 Bindings for Protobt; xbios/laufwerk/protobt.ui; xbios_drive + 4 15 MATRIX XBIOS extension; xbios/matrix/matrix.u; matrix_XBIOS_extension + 4 15 1 MatScreen - Cxx; xbios/matrix/matrix.u; matrix_XBIOS_extension + 4 15 2 MatGraph - TCxx; xbios/matrix/matrix.u; matrix_XBIOS_extension + 4 16 OverScan XBIOS extension; xbios/overscan/overscan.u; xbios_overscan + 4 16 1 Oscanis; xbios/overscan/oscanis.ui; xbios_overscan + 4 16 1 1 Bindings for Oscanis; xbios/overscan/oscanis.ui; xbios_overscan + 4 16 2 Oscanpatch; xbios/overscan/oscanpat.ui; xbios_overscan + 4 16 2 1 Bindings for Oscanpatch; xbios/overscan/oscanpat.ui; xbios_overscan + 4 16 3 Oscanphy; xbios/overscan/oscanphy.ui; xbios_overscan + 4 16 3 1 Bindings for Oscanphy; xbios/overscan/oscanphy.ui; xbios_overscan + 4 16 4 Oscanscr; xbios/overscan/oscanscr.ui; xbios_overscan + 4 16 4 1 Bindings for Oscanscr; xbios/overscan/oscanscr.ui; xbios_overscan + 4 16 5 Oscanswitch; xbios/overscan/oscanswi.ui; xbios_overscan + 4 16 5 1 Bindings for Oscanswitch; xbios/overscan/oscanswi.ui; xbios_overscan + 4 16 6 Oscantab; xbios/overscan/oscantab.ui; xbios_overscan + 4 16 6 1 Bindings for Oscantab; xbios/overscan/oscantab.ui; xbios_overscan + 4 16 7 Oscanvb; xbios/overscan/oscanvb.ui; xbios_overscan + 4 16 7 1 Bindings for Oscanvb; xbios/overscan/oscanvb.ui; xbios_overscan + 4 17 PCI-BIOS; xbios/pci_bios/pci_bios.u; PCI_BIOS + 4 17 1 bus_to_virt; xbios/pci_bios/bus_to_virt.ui; PCI_BIOS + 4 17 1 1 Bindings for bus_to_virt; xbios/pci_bios/bus_to_virt.ui; PCI_BIOS + 4 17 2 fast_read_config_byte; xbios/pci_bios/fast_read_config_byte.ui; PCI_BIOS + 4 17 2 1 Bindings for fast_read_config_byte; xbios/pci_bios/fast_read_config_byte.ui; PCI_BIOS + 4 17 3 fast_read_config_longword; xbios/pci_bios/fast_read_config_longword.ui; PCI_BIOS + 4 17 3 1 Bindings for fast_read_config_longword; xbios/pci_bios/fast_read_config_longword.ui; PCI_BIOS + 4 17 4 fast_read_config_word; xbios/pci_bios/fast_read_config_word.ui; PCI_BIOS + 4 17 4 1 Bindings for fast_read_config_word; xbios/pci_bios/fast_read_config_word.ui; PCI_BIOS + 4 17 5 fast_read_io_byte; xbios/pci_bios/fast_read_io_byte.ui; PCI_BIOS + 4 17 5 1 Bindings for fast_read_io_byte; xbios/pci_bios/fast_read_io_byte.ui; PCI_BIOS + 4 17 6 fast_read_io_longword; xbios/pci_bios/fast_read_io_longword.ui; PCI_BIOS + 4 17 6 1 Bindings for fast_read_io_longword; xbios/pci_bios/fast_read_io_longword.ui; PCI_BIOS + 4 17 7 fast_read_io_word; xbios/pci_bios/fast_read_io_word.ui; PCI_BIOS + 4 17 7 1 Bindings for fast_read_io_word; xbios/pci_bios/fast_read_io_word.ui; PCI_BIOS + 4 17 8 fast_read_mem_byte; xbios/pci_bios/fast_read_mem_byte.ui; PCI_BIOS + 4 17 8 1 Bindings for fast_read_mem_byte; xbios/pci_bios/fast_read_mem_byte.ui; PCI_BIOS + 4 17 9 fast_read_mem_longword; xbios/pci_bios/fast_read_mem_longword.ui; PCI_BIOS + 4 17 9 1 Bindings for fast_read_mem_longword; xbios/pci_bios/fast_read_mem_longword.ui; PCI_BIOS + 4 17 10 fast_read_mem_word; xbios/pci_bios/fast_read_mem_word.ui; PCI_BIOS + 4 17 10 1 Bindings for fast_read_mem_word; xbios/pci_bios/fast_read_mem_word.ui; PCI_BIOS + 4 17 11 find_pci_classcode; xbios/pci_bios/fpclassc.ui; PCI_BIOS + 4 17 11 1 Bindings for find_pci_classcode; xbios/pci_bios/fpclassc.ui; PCI_BIOS + 4 17 12 find_pci_device; xbios/pci_bios/fpdevice.ui; PCI_BIOS + 4 17 12 1 Bindings for find_pci_device; xbios/pci_bios/fpdevice.ui; PCI_BIOS + 4 17 13 get_card_used; xbios/pci_bios/get_card_used.ui; PCI_BIOS + 4 17 13 1 Bindings for get_card_used; xbios/pci_bios/get_card_used.ui; PCI_BIOS + 4 17 14 get_machine_id; xbios/pci_bios/get_machine_id.ui; PCI_BIOS + 4 17 14 1 Bindings for get_machine_id; xbios/pci_bios/get_machine_id.ui; PCI_BIOS + 4 17 15 get_pagesize; xbios/pci_bios/get_pagesize.ui; PCI_BIOS + 4 17 15 1 Bindings for get_pagesize; xbios/pci_bios/get_pagesize.ui; PCI_BIOS + 4 17 16 get_resource; xbios/pci_bios/get_resource.ui; PCI_BIOS + 4 17 16 1 Bindings for get_resource; xbios/pci_bios/get_resource.ui; PCI_BIOS + 4 17 17 get_routing; xbios/pci_bios/get_routing.ui; PCI_BIOS + 4 17 17 1 Bindings for get_routing; xbios/pci_bios/get_routing.ui; PCI_BIOS + 4 17 18 hook_interrupt; xbios/pci_bios/hook_interrupt.ui; PCI_BIOS + 4 17 18 1 Bindings for hook_interrupt; xbios/pci_bios/hook_interrupt.ui; PCI_BIOS + 4 17 19 phys_to_virt; xbios/pci_bios/phys_to_virt.ui; PCI_BIOS + 4 17 19 1 Bindings for phys_to_virt; xbios/pci_bios/phys_to_virt.ui; PCI_BIOS + 4 17 20 read_config_byte; xbios/pci_bios/read_config_byte.ui; PCI_BIOS + 4 17 20 1 Bindings for read_config_byte; xbios/pci_bios/read_config_byte.ui; PCI_BIOS + 4 17 21 read_config_longword; xbios/pci_bios/read_config_longword.ui; PCI_BIOS + 4 17 21 1 Bindings for read_config_longword; xbios/pci_bios/read_config_longword.ui; PCI_BIOS + 4 17 22 read_config_word; xbios/pci_bios/read_config_word.ui; PCI_BIOS + 4 17 22 1 Bindings for read_config_word; xbios/pci_bios/read_config_word.ui; PCI_BIOS + 4 17 23 read_io_byte; xbios/pci_bios/read_io_byte.ui; PCI_BIOS + 4 17 23 1 Bindings for read_io_byte; xbios/pci_bios/read_io_byte.ui; PCI_BIOS + 4 17 24 read_io_longword; xbios/pci_bios/read_io_longword.ui; PCI_BIOS + 4 17 24 1 Bindings for read_io_longword; xbios/pci_bios/read_io_longword.ui; PCI_BIOS + 4 17 25 read_io_word; xbios/pci_bios/read_io_word.ui; PCI_BIOS + 4 17 25 1 Bindings for read_io_word; xbios/pci_bios/read_io_word.ui; PCI_BIOS + 4 17 26 read_mem_byte; xbios/pci_bios/read_mem_byte.ui; PCI_BIOS + 4 17 26 1 Bindings for read_mem_byte; xbios/pci_bios/read_mem_byte.ui; PCI_BIOS + 4 17 27 read_mem_longword; xbios/pci_bios/read_mem_longword.ui; PCI_BIOS + 4 17 27 1 Bindings for read_mem_longword; xbios/pci_bios/read_mem_longword.ui; PCI_BIOS + 4 17 28 read_mem_word; xbios/pci_bios/read_mem_word.ui; PCI_BIOS + 4 17 28 1 Bindings for read_mem_word; xbios/pci_bios/read_mem_word.ui; PCI_BIOS + 4 17 29 set_card_used; xbios/pci_bios/set_card_used.ui; PCI_BIOS + 4 17 29 1 Bindings for set_card_used; xbios/pci_bios/set_card_used.ui; PCI_BIOS + 4 17 30 set_interrupt; xbios/pci_bios/set_interrupt.ui; PCI_BIOS + 4 17 30 1 Bindings for set_interrupt; xbios/pci_bios/set_interrupt.ui; PCI_BIOS + 4 17 31 special_cycle; xbios/pci_bios/special_cycle.ui; PCI_BIOS + 4 17 31 1 Bindings for special_cycle; xbios/pci_bios/special_cycle.ui; PCI_BIOS + 4 17 32 unhook_interrupt; xbios/pci_bios/unhook_interrupt.ui; PCI_BIOS + 4 17 32 1 Bindings for unhook_interrupt; xbios/pci_bios/unhook_interrupt.ui; PCI_BIOS + 4 17 33 virt_to_bus; xbios/pci_bios/virt_to_bus.ui; PCI_BIOS + 4 17 33 1 Bindings for virt_to_bus; xbios/pci_bios/virt_to_bus.ui; PCI_BIOS + 4 17 34 virt_to_phys; xbios/pci_bios/virt_to_phys.ui; PCI_BIOS + 4 17 34 1 Bindings for virt_to_phys; xbios/pci_bios/virt_to_phys.ui; PCI_BIOS + 4 17 35 write_config_byte; xbios/pci_bios/write_config_byte.ui; PCI_BIOS + 4 17 35 1 Bindings for write_config_byte; xbios/pci_bios/write_config_byte.ui; PCI_BIOS + 4 17 36 write_config_longword; xbios/pci_bios/write_config_longword.ui; PCI_BIOS + 4 17 36 1 Bindings for write_config_longword; xbios/pci_bios/write_config_longword.ui; PCI_BIOS + 4 17 37 write_config_word; xbios/pci_bios/write_config_word.ui; PCI_BIOS + 4 17 37 1 Bindings for write_config_word; xbios/pci_bios/write_config_word.ui; PCI_BIOS + 4 17 38 write_io_byte; xbios/pci_bios/write_io_byte.ui; PCI_BIOS + 4 17 38 1 Bindings for write_io_byte; xbios/pci_bios/write_io_byte.ui; PCI_BIOS + 4 17 39 write_io_longword; xbios/pci_bios/write_io_longword.ui; PCI_BIOS + 4 17 39 1 Bindings for write_io_longword; xbios/pci_bios/write_io_longword.ui; PCI_BIOS + 4 17 40 write_io_word; xbios/pci_bios/write_io_word.ui; PCI_BIOS + 4 17 40 1 Bindings for write_io_word; xbios/pci_bios/write_io_word.ui; PCI_BIOS + 4 17 41 write_mem_byte; xbios/pci_bios/write_mem_byte.ui; PCI_BIOS + 4 17 41 1 Bindings for write_mem_byte; xbios/pci_bios/write_mem_byte.ui; PCI_BIOS + 4 17 42 write_mem_longword; xbios/pci_bios/write_mem_longword.ui; PCI_BIOS + 4 17 42 1 Bindings for write_mem_longword; xbios/pci_bios/write_mem_longword.ui; PCI_BIOS + 4 17 43 write_mem_word; xbios/pci_bios/write_mem_word.ui; PCI_BIOS + 4 17 43 1 Bindings for write_mem_word; xbios/pci_bios/write_mem_word.ui; PCI_BIOS + 4 17 44 PCI-BIOS Error codes; xbios/pci_bios/error.ui; PCI_BIOS + 4 18 Interface programming; xbios/intrface/intrface.u; xbios_interface + 4 18 1 Bconmap; xbios/intrface/bconmap.ui; xbios_interface + 4 18 1 1 Bindings for Bconmap; xbios/intrface/bconmap.ui; xbios_interface + 4 18 2 Dosound; xbios/intrface/dosound.ui; xbios_interface + 4 18 2 1 Bindings for Dosound; xbios/intrface/dosound.ui; xbios_interface + 4 18 3 ExtRsConf; xbios/intrface/extrscon.ui; xbios_interface + 4 18 3 1 Bindings for ExtRsConf; xbios/intrface/extrscon.ui; xbios_interface + 4 18 4 Giaccess; xbios/intrface/giaccess.ui; xbios_interface + 4 18 4 1 Bindings for Giaccess; xbios/intrface/giaccess.ui; xbios_interface + 4 18 5 Ikbdws; xbios/intrface/ikbdws.ui; xbios_interface + 4 18 5 1 Bindings for Ikbdws; xbios/intrface/ikbdws.ui; xbios_interface + 4 18 6 Iorec; xbios/intrface/iorec.ui; xbios_interface + 4 18 6 1 Bindings for Iorec; xbios/intrface/iorec.ui; xbios_interface + 4 18 7 Kbdvbase; xbios/intrface/kbdvbase.ui; xbios_interface + 4 18 7 1 Bindings for Kbdvbase; xbios/intrface/kbdvbase.ui; xbios_interface + 4 18 8 Mfpint; xbios/intrface/mfpint.ui; xbios_interface + 4 18 8 1 Bindings for Mfpint; xbios/intrface/mfpint.ui; xbios_interface + 4 18 9 Midiws; xbios/intrface/midiws.ui; xbios_interface + 4 18 9 1 Bindings for Midiws; xbios/intrface/midiws.ui; xbios_interface + 4 18 10 Offgibit; xbios/intrface/offgibit.ui; xbios_interface + 4 18 10 1 Bindings for Offgibit; xbios/intrface/offgibit.ui; xbios_interface + 4 18 11 Ongibit; xbios/intrface/ongibit.ui; xbios_interface + 4 18 11 1 Bindings for Ongibit; xbios/intrface/ongibit.ui; xbios_interface + 4 18 12 Rsconf; xbios/intrface/rsconf.ui; xbios_interface + 4 18 12 1 Bindings for Rsconf; xbios/intrface/rsconf.ui; xbios_interface + 4 19 Sound routines; xbios/sound/sound.u; xbios_sound + 4 19 1 buffoper; xbios/sound/buffoper.ui; xbios_sound + 4 19 1 1 Bindings for buffoper; xbios/sound/buffoper.ui; xbios_sound + 4 19 2 buffptr; xbios/sound/buffptr.ui; xbios_sound + 4 19 2 1 Bindings for buffptr; xbios/sound/buffptr.ui; xbios_sound + 4 19 3 devconnect; xbios/sound/devconne.ui; xbios_sound + 4 19 3 1 Bindings for devconnect; xbios/sound/devconne.ui; xbios_sound + 4 19 4 dsptristate; xbios/sound/dsptrist.ui; xbios_sound + 4 19 4 1 Bindings for dsptristate; xbios/sound/dsptrist.ui; xbios_sound + 4 19 5 gpio; xbios/sound/gpio.ui; xbios_sound + 4 19 5 1 Bindings for gpio; xbios/sound/gpio.ui; xbios_sound + 4 19 6 locksnd; xbios/sound/locksnd.ui; xbios_sound + 4 19 6 1 Bindings for locksnd; xbios/sound/locksnd.ui; xbios_sound + 4 19 7 setbuffer; xbios/sound/setbuffe.ui; xbios_sound + 4 19 7 1 Bindings for setbuffer; xbios/sound/setbuffe.ui; xbios_sound + 4 19 8 setinterrupt; xbios/sound/setinter.ui; xbios_sound + 4 19 8 1 Bindings for setinterrupt; xbios/sound/setinter.ui; xbios_sound + 4 19 9 setmode; xbios/sound/setmode.ui; xbios_sound + 4 19 9 1 Bindings for setmode; xbios/sound/setmode.ui; xbios_sound + 4 19 10 setmontracks; xbios/sound/setmontr.ui; xbios_sound + 4 19 10 1 Bindings for setmontracks; xbios/sound/setmontr.ui; xbios_sound + 4 19 11 settracks; xbios/sound/settrack.ui; xbios_sound + 4 19 11 1 Bindings for settracks; xbios/sound/settrack.ui; xbios_sound + 4 19 12 sndstatus; xbios/sound/sndstatu.ui; xbios_sound + 4 19 12 1 Bindings for sndstatus; xbios/sound/sndstatu.ui; xbios_sound + 4 19 13 soundcmd; xbios/sound/soundcmd.ui; xbios_sound + 4 19 13 1 Bindings for soundcmd; xbios/sound/soundcmd.ui; xbios_sound + 4 19 14 StarTrack; xbios/sound/startrac.ui; xbios_sound + 4 19 15 installed; xbios/startrac/installe.ui; xbios_sound + 4 19 15 1 Bindings for installed; xbios/startrac/installe.ui; xbios_sound + 4 19 16 cardslot; xbios/startrac/cardslot.ui; xbios_sound + 4 19 16 1 Bindings for cardslot; xbios/startrac/cardslot.ui; xbios_sound + 4 19 17 cardsel; xbios/startrac/cardsel.ui; xbios_sound + 4 19 17 1 Bindings for cardsel; xbios/startrac/cardsel.ui; xbios_sound + 4 19 18 cardmagic; xbios/startrac/cardmagi.ui; xbios_sound + 4 19 18 1 Bindings for cardmagic; xbios/startrac/cardmagi.ui; xbios_sound + 4 19 19 cardadr; xbios/startrac/cardadr.ui; xbios_sound + 4 19 19 1 Bindings for cardadr; xbios/startrac/cardadr.ui; xbios_sound + 4 19 20 digana; xbios/startrac/digana.ui; xbios_sound + 4 19 20 1 Bindings for digana; xbios/startrac/digana.ui; xbios_sound + 4 19 21 digcom; xbios/startrac/digcom.ui; xbios_sound + 4 19 21 1 Bindings for digcom; xbios/startrac/digcom.ui; xbios_sound + 4 19 22 dspmode; xbios/startrac/dspmode.ui; xbios_sound + 4 19 22 1 Bindings for dspmode; xbios/startrac/dspmode.ui; xbios_sound + 4 19 23 sclock; xbios/startrac/sclock.ui; xbios_sound + 4 19 23 1 Bindings for sclock; xbios/startrac/sclock.ui; xbios_sound + 4 19 24 highsrate; xbios/startrac/highsrat.ui; xbios_sound + 4 19 24 1 Bindings for highsrate; xbios/startrac/highsrat.ui; xbios_sound + 4 19 25 bypass; xbios/startrac/bypass.ui; xbios_sound + 4 19 25 1 Bindings for bypass; xbios/startrac/bypass.ui; xbios_sound + 4 19 26 recmode; xbios/startrac/recmode.ui; xbios_sound + 4 19 26 1 Bindings for recmode; xbios/startrac/recmode.ui; xbios_sound + 4 19 27 playmode; xbios/startrac/playmode.ui; xbios_sound + 4 19 27 1 Bindings for playmode; xbios/startrac/playmode.ui; xbios_sound + 4 19 28 mode24; xbios/startrac/mode24.ui; xbios_sound + 4 19 28 1 Bindings for mode24; xbios/startrac/mode24.ui; xbios_sound + 4 19 29 digmode; xbios/startrac/digmode.ui; xbios_sound + 4 19 29 1 Bindings for digmode; xbios/startrac/digmode.ui; xbios_sound + 4 19 30 scmsmode; xbios/startrac/scmsmode.ui; xbios_sound + 4 19 30 1 Bindings for scmsmode; xbios/startrac/scmsmode.ui; xbios_sound + 4 19 31 mycopybit; xbios/startrac/mycopybi.ui; xbios_sound + 4 19 31 1 Bindings for mycopybit; xbios/startrac/mycopybi.ui; xbios_sound + 4 19 32 emphasis; xbios/startrac/emphasis.ui; xbios_sound + 4 19 32 1 Bindings for emphasis; xbios/startrac/emphasis.ui; xbios_sound + 4 19 33 digsrate; xbios/startrac/digsrate.ui; xbios_sound + 4 19 33 1 Bindings for digsrate; xbios/startrac/digsrate.ui; xbios_sound + 4 19 34 digcode; xbios/startrac/digcode.ui; xbios_sound + 4 19 34 1 Bindings for digcode; xbios/startrac/digcode.ui; xbios_sound + 4 19 35 errorcode; xbios/startrac/errorcod.ui; xbios_sound + 4 19 35 1 Bindings for errorcode; xbios/startrac/errorcod.ui; xbios_sound + 4 19 36 cblmode; xbios/startrac/cblmode.ui; xbios_sound + 4 19 36 1 Bindings for cblmode; xbios/startrac/cblmode.ui; xbios_sound + 4 19 37 cblread; xbios/startrac/cblread.ui; xbios_sound + 4 19 37 1 Bindings for cblread; xbios/startrac/cblread.ui; xbios_sound + 4 19 38 recstat; xbios/startrac/recstat.ui; xbios_sound + 4 19 38 1 Bindings for recstat; xbios/startrac/recstat.ui; xbios_sound + 4 19 39 playstat; xbios/startrac/playstat.ui; xbios_sound + 4 19 39 1 Bindings for playstat; xbios/startrac/playstat.ui; xbios_sound + 4 19 40 volad; xbios/startrac/volad.ui; xbios_sound + 4 19 40 1 Bindings for volad; xbios/startrac/volad.ui; xbios_sound + 4 19 41 volda; xbios/startrac/volda.ui; xbios_sound + 4 19 41 1 Bindings for volda; xbios/startrac/volda.ui; xbios_sound + 4 19 42 readsmp; xbios/startrac/readsmp.ui; xbios_sound + 4 19 42 1 Bindings for readsmp; xbios/startrac/readsmp.ui; xbios_sound + 4 19 43 writesmp; xbios/startrac/writesmp.ui; xbios_sound + 4 19 43 1 Bindings for writesmp; xbios/startrac/writesmp.ui; xbios_sound + 4 19 44 intact; xbios/startrac/intact.ui; xbios_sound + 4 19 44 1 Bindings for intact; xbios/startrac/intact.ui; xbios_sound + 4 19 45 dspintact; xbios/startrac/dspintac.ui; xbios_sound + 4 19 45 1 Bindings for dspintact; xbios/startrac/dspintac.ui; xbios_sound + 4 19 46 sysreset; xbios/startrac/sysreset.ui; xbios_sound + 4 19 46 1 Bindings for sysreset; xbios/startrac/sysreset.ui; xbios_sound + 4 19 47 dspreset; xbios/startrac/dspreset.ui; xbios_sound + 4 19 47 1 Bindings for dspreset; xbios/startrac/dspreset.ui; xbios_sound + 4 19 48 dspmemory; xbios/startrac/dspmemor.ui; xbios_sound + 4 19 48 1 Bindings for dspmemory; xbios/startrac/dspmemor.ui; xbios_sound + 4 19 49 clkdivide; xbios/startrac/clkdivid.ui; xbios_sound + 4 19 49 1 Bindings for clkdivide; xbios/startrac/clkdivid.ui; xbios_sound + 4 19 50 pathset; xbios/startrac/pathset.ui; xbios_sound + 4 19 50 1 Bindings for pathset; xbios/startrac/pathset.ui; xbios_sound + 4 19 51 dsp_hostcommand; xbios/startrac/dsp_host.ui; xbios_sound + 4 19 51 1 Bindings for dsp_hostcommand; xbios/startrac/dsp_host.ui; xbios_sound + 4 19 52 dspclear; xbios/startrac/dspclear.ui; xbios_sound + 4 19 52 1 Bindings for dspclear; xbios/startrac/dspclear.ui; xbios_sound + 4 19 53 mix; xbios/startrac/mix.ui; xbios_sound + 4 19 53 1 Bindings for mix; xbios/startrac/mix.ui; xbios_sound + 4 19 54 dspmix; xbios/startrac/dspmix.ui; xbios_sound + 4 19 54 1 Bindings for dspmix; xbios/startrac/dspmix.ui; xbios_sound + 4 19 55 monitor; xbios/startrac/monitor.ui; xbios_sound + 4 19 55 1 Bindings for monitor; xbios/startrac/monitor.ui; xbios_sound + 4 19 56 recwait; xbios/startrac/recwait.ui; xbios_sound + 4 19 56 1 Bindings for recwait; xbios/startrac/recwait.ui; xbios_sound + 4 19 57 memrec; xbios/startrac/memrec.ui; xbios_sound + 4 19 57 1 Bindings for memrec; xbios/startrac/memrec.ui; xbios_sound + 4 19 58 memplay; xbios/startrac/memplay.ui; xbios_sound + 4 19 58 1 Bindings for memplay; xbios/startrac/memplay.ui; xbios_sound + 4 19 59 recplay; xbios/startrac/recplay.ui; xbios_sound + 4 19 59 1 Bindings for recplay; xbios/startrac/recplay.ui; xbios_sound + 4 19 60 hardrec; xbios/startrac/hardrec.ui; xbios_sound + 4 19 60 1 Bindings for hardrec; xbios/startrac/hardrec.ui; xbios_sound + 4 19 61 hardplay; xbios/startrac/hardplay.ui; xbios_sound + 4 19 61 1 Bindings for hardplay; xbios/startrac/hardplay.ui; xbios_sound + 4 19 62 hrecplay; xbios/startrac/hrecplay.ui; xbios_sound + 4 19 62 1 Bindings for hrecplay; xbios/startrac/hrecplay.ui; xbios_sound + 4 19 63 init_peak; xbios/startrac/init_pea.ui; xbios_sound + 4 19 63 1 Bindings for init_peak; xbios/startrac/init_pea.ui; xbios_sound + 4 19 64 init_imemrec; xbios/startrac/init_ime.ui; xbios_sound + 4 19 64 1 Bindings for init_imemrec; xbios/startrac/init_ime.ui; xbios_sound + 4 19 65 init_imemplay; xbios/startrac/init_ipl.ui; xbios_sound + 4 19 65 1 Bindings for init_imemplay; xbios/startrac/init_ipl.ui; xbios_sound + 4 19 66 init_implaymix; xbios/startrac/init_ipm.ui; xbios_sound + 4 19 66 1 Bindings for init_implaymix; xbios/startrac/init_ipm.ui; xbios_sound + 4 19 67 init_hrec; xbios/startrac/init_hre.ui; xbios_sound + 4 19 67 1 Bindings for init_hrec; xbios/startrac/init_hre.ui; xbios_sound + 4 19 68 init_hplay; xbios/startrac/init_hpl.ui; xbios_sound + 4 19 68 1 Bindings for init_hplay; xbios/startrac/init_hpl.ui; xbios_sound + 4 19 69 init_ihplaymix; xbios/startrac/init_hpm.ui; xbios_sound + 4 19 69 1 Bindings for init_ihplaymix; xbios/startrac/init_hpm.ui; xbios_sound + 4 19 70 init_mrecpeak; xbios/startrac/init_mrp.ui; xbios_sound + 4 19 70 1 Bindings for init_mrecpeak; xbios/startrac/init_mrp.ui; xbios_sound + 4 19 71 init_mplaypeak; xbios/startrac/init_mpp.ui; xbios_sound + 4 19 71 1 Bindings for init_mplaypeak; xbios/startrac/init_mpp.ui; xbios_sound + 4 19 72 init_mrppeak; xbios/startrac/init_mpk.ui; xbios_sound + 4 19 72 1 Bindings for init_mrppeak; xbios/startrac/init_mpk.ui; xbios_sound + 4 19 73 init_hrecpeak; xbios/startrac/init_hrp.ui; xbios_sound + 4 19 73 1 Bindings for init_hrecpeak; xbios/startrac/init_hrp.ui; xbios_sound + 4 19 74 init_hplaypeak; xbios/startrac/init_hpp.ui; xbios_sound + 4 19 74 1 Bindings for init_hplaypeak; xbios/startrac/init_hpp.ui; xbios_sound + 4 19 75 init_hrppeak; xbios/startrac/init_hpk.ui; xbios_sound + 4 19 75 1 Bindings for init_hrppeak; xbios/startrac/init_hpk.ui; xbios_sound + 4 19 76 init_xmemrec; xbios/startrac/init_xmr.ui; xbios_sound + 4 19 76 1 Bindings for init_xmemrec; xbios/startrac/init_xmr.ui; xbios_sound + 4 19 77 init_xmemplay; xbios/startrac/init_xmp.ui; xbios_sound + 4 19 77 1 Bindings for init_xmemplay; xbios/startrac/init_xmp.ui; xbios_sound + 4 19 78 init_xmixplay; xbios/startrac/init_xxp.ui; xbios_sound + 4 19 78 1 Bindings for init_xmixplay; xbios/startrac/init_xxp.ui; xbios_sound + 4 19 79 init_xmemrec4; xbios/startrac/init_xr4.ui; xbios_sound + 4 19 79 1 Bindings for init_xmemrec4; xbios/startrac/init_xr4.ui; xbios_sound + 4 19 80 init_xmemplay4; xbios/startrac/init_xp4.ui; xbios_sound + 4 19 80 1 Bindings for init_xmemplay4; xbios/startrac/init_xp4.ui; xbios_sound + 4 19 81 peakshake; xbios/startrac/peakshak.ui; xbios_sound + 4 19 81 1 Bindings for peakshake; xbios/startrac/peakshak.ui; xbios_sound + 4 19 82 read_rlow; xbios/startrac/read_rlo.ui; xbios_sound + 4 19 82 1 Bindings for read_rlow; xbios/startrac/read_rlo.ui; xbios_sound + 4 19 83 read_rhi; xbios/startrac/read_rhi.ui; xbios_sound + 4 19 83 1 Bindings for read_rhi; xbios/startrac/read_rhi.ui; xbios_sound + 4 19 84 read_rdsp; xbios/startrac/read_rds.ui; xbios_sound + 4 19 84 1 Bindings for read_rdsp; xbios/startrac/read_rds.ui; xbios_sound + 4 19 85 read_raes; xbios/startrac/read_rae.ui; xbios_sound + 4 19 85 1 Bindings for read_raes; xbios/startrac/read_rae.ui; xbios_sound + 4 19 86 read_rint; xbios/startrac/read_rin.ui; xbios_sound + 4 19 86 1 Bindings for read_rint; xbios/startrac/read_rin.ui; xbios_sound + 4 19 87 wr_rlow; xbios/startrac/wr_rlow.ui; xbios_sound + 4 19 87 1 Bindings for wr_rlow; xbios/startrac/wr_rlow.ui; xbios_sound + 4 19 88 wr_rhi; xbios/startrac/wr_rhi.ui; xbios_sound + 4 19 88 1 Bindings for wr_rhi; xbios/startrac/wr_rhi.ui; xbios_sound + 4 19 89 wr_rdsp; xbios/startrac/wr_rdsp.ui; xbios_sound + 4 19 89 1 Bindings for wr_rdsp; xbios/startrac/wr_rdsp.ui; xbios_sound + 4 19 90 wr_raes; xbios/startrac/wr_raes.ui; xbios_sound + 4 19 90 1 Bindings for wr_raes; xbios/startrac/wr_raes.ui; xbios_sound + 4 19 91 wr_rint; xbios/startrac/wr_rint.ui; xbios_sound + 4 19 91 1 Bindings for wr_rint; xbios/startrac/wr_rint.ui; xbios_sound + 4 19 92 read_dpath1; xbios/startrac/read_dp1.ui; xbios_sound + 4 19 92 1 Bindings for read_dpath1; xbios/startrac/read_dp1.ui; xbios_sound + 4 19 93 read_dpath2; xbios/startrac/read_dp2.ui; xbios_sound + 4 19 93 1 Bindings for read_dpath2; xbios/startrac/read_dp2.ui; xbios_sound + 4 19 94 read_dport; xbios/startrac/read_dpo.ui; xbios_sound + 4 19 94 1 Bindings for read_dport; xbios/startrac/read_dpo.ui; xbios_sound + 4 19 95 read_dconv; xbios/startrac/read_dco.ui; xbios_sound + 4 19 95 1 Bindings for read_dconv; xbios/startrac/read_dco.ui; xbios_sound + 4 19 96 read_dpdat; xbios/startrac/read_dpd.ui; xbios_sound + 4 19 96 1 Bindings for read_dpdat; xbios/startrac/read_dpd.ui; xbios_sound + 4 19 97 read_dclk; xbios/startrac/read_dcl.ui; xbios_sound + 4 19 97 1 Bindings for read_dclk; xbios/startrac/read_dcl.ui; xbios_sound + 4 19 98 wr_dpath1; xbios/startrac/wr_dpat1.ui; xbios_sound + 4 19 98 1 Bindings for wr_dpath1; xbios/startrac/wr_dpat1.ui; xbios_sound + 4 19 99 wr_dpath2; xbios/startrac/wr_dpat2.ui; xbios_sound + 4 19 99 1 Bindings for wr_dpath2; xbios/startrac/wr_dpat2.ui; xbios_sound + 4 19 100 wr_dport; xbios/startrac/wr_dport.ui; xbios_sound + 4 19 100 1 Bindings for wr_dport; xbios/startrac/wr_dport.ui; xbios_sound + 4 19 101 wr_dconv; xbios/startrac/wr_dconv.ui; xbios_sound + 4 19 101 1 Bindings for wr_dconv; xbios/startrac/wr_dconv.ui; xbios_sound + 4 19 102 wr_dpdat; xbios/startrac/wr_dpdat.ui; xbios_sound + 4 19 102 1 Bindings for wr_dpdat; xbios/startrac/wr_dpdat.ui; xbios_sound + 4 19 103 wr_dclk; xbios/startrac/wr_dclk.ui; xbios_sound + 4 19 103 1 Bindings for wr_dclk; xbios/startrac/wr_dclk.ui; xbios_sound + 4 19 104 fastcut; xbios/startrac/fastcut.ui; xbios_sound + 4 19 104 1 Bindings for fastcut; xbios/startrac/fastcut.ui; xbios_sound + 4 19 105 peaksuch; xbios/startrac/peaksuch.ui; xbios_sound + 4 19 105 1 Bindings for peaksuch; xbios/startrac/peaksuch.ui; xbios_sound + 4 19 106 zerono; xbios/startrac/zerono.ui; xbios_sound + 4 19 106 1 Bindings for zerono; xbios/startrac/zerono.ui; xbios_sound + 4 19 107 fading; xbios/startrac/fading.ui; xbios_sound + 4 19 107 1 Bindings for fading; xbios/startrac/fading.ui; xbios_sound + 4 19 108 unlocksnd; xbios/sound/unlocksn.ui; xbios_sound + 4 19 108 1 Bindings for unlocksnd; xbios/sound/unlocksn.ui; xbios_sound + 4 19 109 WavePlay; xbios/sound/waveplay.ui; xbios_sound + 4 19 109 1 Bindings for WavePlay; xbios/sound/waveplay.ui; xbios_sound + 4 20 Special commands; xbios/spezial/spezial.u; xbios_special + 4 20 1 Blitmode; xbios/spezial/blitmode.ui; xbios_special + 4 20 1 1 Bindings for Blitmode; xbios/spezial/blitmode.ui; xbios_special + 4 20 2 CacheCtrl; xbios/spezial/cachectr.ui; xbios_special + 4 20 2 1 Bindings for CacheCtrl; xbios/spezial/cachectr.ui; xbios_special + 4 20 3 CJar; xbios/spezial/cjar.ui; xbios_special + 4 20 3 1 Bindings for CJar; xbios/spezial/cjar.ui; xbios_special + 4 20 4 Dbmsg; xbios/spezial/dbmsg.ui; xbios_special + 4 20 4 1 Bindings for Dbmsg; xbios/spezial/dbmsg.ui; xbios_special + 4 20 5 Janus; xbios/spezial/janus.ui; xbios_special + 4 20 5 1 Bindings for Janus; xbios/spezial/janus.ui; xbios_special + 4 20 6 Puntaes; xbios/spezial/puntaes.ui; xbios_special + 4 20 6 1 Bindings for Puntaes; xbios/spezial/puntaes.ui; xbios_special + 4 20 7 Random; xbios/spezial/random.ui; xbios_special + 4 20 7 1 Bindings for Random; xbios/spezial/random.ui; xbios_special + 4 20 8 Ssbrk; xbios/spezial/ssbrk.ui; xbios_special + 4 20 8 1 Bindings for Ssbrk; xbios/spezial/ssbrk.ui; xbios_special + 4 20 9 Supexec; xbios/spezial/supexec.ui; xbios_special + 4 20 9 1 Bindings for Supexec; xbios/spezial/supexec.ui; xbios_special + 4 20 10 Trapper; xbios/spezial/trapper.ui; xbios_special + 4 20 10 1 Bindings for Trapper; xbios/spezial/trapper.ui; xbios_special + 4 20 11 WdgCtrl; xbios/spezial/wdgctrl.ui; xbios_special + 4 20 11 1 Bindings for WdgCtrl; xbios/spezial/wdgctrl.ui; xbios_special + 4 21 Keyboard functions; xbios/tastatur/tastatur.u; xbios_keyboard + 4 21 1 Bioskeys; xbios/tastatur/bioskeys.ui; xbios_keyboard + 4 21 1 1 Bindings for Bioskeys; xbios/tastatur/bioskeys.ui; xbios_keyboard + 4 21 2 Kbrate; xbios/tastatur/kbrate.ui; xbios_keyboard + 4 21 2 1 Bindings for Kbrate; xbios/tastatur/kbrate.ui; xbios_keyboard + 4 21 3 Keytbl; xbios/tastatur/keytbl.ui; xbios_keyboard + 4 21 3 1 Bindings for Keytbl; xbios/tastatur/keytbl.ui; xbios_keyboard + 4 22 VIDIX XBIOS extension; xbios/vidix/vidix.u; vidix_xbios_extension + 4 22 1 vdxConfigPlayback; xbios/vidix/vdxconfigplayback.ui; vidix_xbios_extension + 4 22 1 1 Bindings for vdxConfigPlayback; xbios/vidix/vdxconfigplayback.ui; vidix_xbios_extension + 4 22 2 vdxDestroy; xbios/vidix/vdxdestroy.ui; vidix_xbios_extension + 4 22 2 1 Bindings for vdxDestroy; xbios/vidix/vdxdestroy.ui; vidix_xbios_extension + 4 22 3 vdxGetCapability; xbios/vidix/vdxgetcapability.ui; vidix_xbios_extension + 4 22 3 1 Bindings for vdxGetCapability; xbios/vidix/vdxgetcapability.ui; vidix_xbios_extension + 4 22 4 vdxGetGrKeys; xbios/vidix/vdxgetgrkeys.ui; vidix_xbios_extension + 4 22 4 1 Bindings for vdxGetGrKeys; xbios/vidix/vdxgetgrkeys.ui; vidix_xbios_extension + 4 22 5 vdxGetVersion; xbios/vidix/vdxgetversion.ui; vidix_xbios_extension + 4 22 5 1 Bindings for vdxGetVersion; xbios/vidix/vdxgetversion.ui; vidix_xbios_extension + 4 22 6 vdxInit; xbios/vidix/vdxinit.ui; vidix_xbios_extension + 4 22 6 1 Bindings for vdxInit; xbios/vidix/vdxinit.ui; vidix_xbios_extension + 4 22 7 vdxPlaybackCopyFrame; xbios/vidix/vdxplaybackcopyframe.ui; vidix_xbios_extension + 4 22 7 1 Bindings for vdxPlaybackCopyFrame; xbios/vidix/vdxplaybackcopyframe.ui; vidix_xbios_extension + 4 22 8 vdxPlaybackFrameSelect; xbios/vidix/vdxplaybackframeselect.ui; vidix_xbios_extension + 4 22 8 1 Bindings for vdxPlaybackFrameSelect; xbios/vidix/vdxplaybackframeselect.ui; vidix_xbios_extension + 4 22 9 vdxPlaybackGetDeint; xbios/vidix/vdxplaybackgetdeint.ui; vidix_xbios_extension + 4 22 9 1 Bindings for vdxPlaybackGetDeint; xbios/vidix/vdxplaybackgetdeint.ui; vidix_xbios_extension + 4 22 10 vdxPlaybackGetEq; xbios/vidix/vdxplaybackgeteq.ui; vidix_xbios_extension + 4 22 10 1 Bindings for vdxPlaybackGetEq; xbios/vidix/vdxplaybackgeteq.ui; vidix_xbios_extension + 4 22 11 vdxPlaybackOff; xbios/vidix/vdxplaybackoff.ui; vidix_xbios_extension + 4 22 11 1 Bindings for vdxPlaybackOff; xbios/vidix/vdxplaybackoff.ui; vidix_xbios_extension + 4 22 12 vdxPlaybackOn; xbios/vidix/vdxplaybackon.ui; vidix_xbios_extension + 4 22 12 1 Bindings for vdxPlaybackOn; xbios/vidix/vdxplaybackon.ui; vidix_xbios_extension + 4 22 13 vdxPlaybackSetDeint; xbios/vidix/vdxplaybacksetdeint.ui; vidix_xbios_extension + 4 22 13 1 Bindings for vdxPlaybackSetDeint; xbios/vidix/vdxplaybacksetdeint.ui; vidix_xbios_extension + 4 22 14 vdxPlaybackSetEq; xbios/vidix/vdxplaybackseteq.ui; vidix_xbios_extension + 4 22 14 1 Bindings for vdxPlaybackSetEq; xbios/vidix/vdxplaybackseteq.ui; vidix_xbios_extension + 4 22 15 vdxProbe; xbios/vidix/vdxprobe.ui; vidix_xbios_extension + 4 22 15 1 Bindings for vdxProbe; xbios/vidix/vdxprobe.ui; vidix_xbios_extension + 4 22 16 vdxQueryDMAStatus; xbios/vidix/vdxquerydmastatus.ui; vidix_xbios_extension + 4 22 16 1 Bindings for vdxQueryDMAStatus; xbios/vidix/vdxquerydmastatus.ui; vidix_xbios_extension + 4 22 17 vdxQueryFourcc; xbios/vidix/vdxqueryfourcc.ui; vidix_xbios_extension + 4 22 17 1 Bindings for vdxQueryFourcc; xbios/vidix/vdxqueryfourcc.ui; vidix_xbios_extension + 4 22 18 vdxSetGrKeys; xbios/vidix/vdxsetgrkeys.ui; vidix_xbios_extension + 4 22 18 1 Bindings for vdxSetGrKeys; xbios/vidix/vdxsetgrkeys.ui; vidix_xbios_extension + 4 23 XBIOS function list; xbios/xbios_f.u; xbios_functions + 4 24 XBIOS Structures; xbios/structures/structures.u; xbios_structures + 4 24 1 BCONMAP; xbios/structures/bconmap.ui; xbios_structures + 4 24 2 CD_DISC_INFO; xbios/structures/CD_DISC_INFO.ui; xbios_structures + 4 24 3 CD_TOC_ENTRY; xbios/structures/CD_TOC_ENTRY.ui; xbios_structures + 4 24 4 DSPBLOCK; xbios/structures/DSPBLOCK.ui; xbios_structures + 4 24 5 IOREC; xbios/structures/IOREC.ui; xbios_structures + 4 24 6 KEYBDPARMS; xbios/structures/KEYBDPARMS.ui; xbios_structures + 4 24 7 KBDVBASE; xbios/structures/KBDVBASE.ui; xbios_structures + 4 24 8 KEYTAB; xbios/structures/KEYTAB.ui; xbios_structures + 4 24 9 MAPTAB; xbios/structures/MAPTAB.ui; xbios_structures + 4 24 10 META_DRVINFO; xbios/structures/META_DRVINFO.ui; xbios_structures + 4 24 11 META_INFO_1; xbios/structures/META_INFO_1.ui; xbios_structures + 4 24 12 META_INFO_2; xbios/structures/META_INFO_2.ui; xbios_structures + 4 24 13 MOD_DESC; xbios/structures/MOD_DESC.ui; xbios_structures + 4 24 14 MOUSE; xbios/structures/MOUSE.ui; xbios_structures + 4 24 15 OVERPATCH; xbios/structures/OVERPATCH.ui; xbios_structures + 4 24 16 PBDEF; xbios/structures/PBDEF.ui; xbios_structures + 4 24 17 PCI_RSC_DESC; xbios/structures/PCI_RSC_DESC.ui; xbios_structures + 4 24 18 PMODE; xbios/structures/PMODE.ui; xbios_structures + 4 24 19 SCRCLIPMEMBLK; xbios/structures/SCRCLIPMEMBLK.ui; xbios_structures + 4 24 20 SCRCOPYMEMBLK; xbios/structures/SCRCOPYMEMBLK.ui; xbios_structures + 4 24 21 SCREEN; xbios/structures/SCREEN.ui; xbios_structures + 4 24 22 SCREENINFO; xbios/structures/SCREENINFO.ui; xbios_structures + 4 24 23 SCREEN, OverScan; xbios/structures/SCREEN_OverScan.ui; xbios_structures + 4 24 24 SCRFILLMEMBLK; xbios/structures/SCRFILLMEMBLK.ui; xbios_structures + 4 24 25 SCRLINEMEMBLK; xbios/structures/SCRLINEMEMBLK.ui; xbios_structures + 4 24 26 SCRMEMBLK; xbios/structures/SCRMEMBLK.ui; xbios_structures + 4 24 27 SCRTEXTUREMEMBLK; xbios/structures/SCRTEXTUREMEMBLK.ui; xbios_structures + 4 24 28 VDO_MODE; xbios/structures/VDO_MODE.ui; xbios_structures + 4 24 29 VDO_PARAM; xbios/structures/VDO_PARAM.ui; xbios_structures + 4 24 30 vidix_capability_t; xbios/structures/vidix_capability.ui; xbios_structures + 4 24 31 vidix_deinterlace_t; xbios/structures/vidix_deinterlace.ui; xbios_structures + 4 24 32 vidix_dma_t; xbios/structures/vidix_dma.ui; xbios_structures + 4 24 33 vidix_fourcc_t; xbios/structures/vidix_fourcc.ui; xbios_structures + 4 24 34 vidix_grkey_t; xbios/structures/vidix_grkey.ui; xbios_structures + 4 24 35 vidix_playback_t; xbios/structures/vidix_playback.ui; xbios_structures + 4 24 36 vidix_video_eq_t; xbios/structures/vidix_video_eq.ui; xbios_structures + 4 24 37 VPOS; xbios/structures/VPOS.ui; xbios_structures + 5 GEMDOS; /home/runner/work/tos.hyp/tos.hyp/tos_hyp.u; gemdos_main + 5 1 About the GEMDOS; gemdos/gemdos.u; gemdos_about + 5 2 Support for alternative file-systems; gemdos/filesys.u; gemdos_filesys + 5 3 GEMDOS error-messages; gemdos/gemdos.u; gemdos_errors + 5 4 Pipes, Test for; gemdos/gemdos.u; gemdos_pipes + 5 5 The program format; gemdos/gemdos.u; gemdos_programs + 5 5 1 The program flags; gemdos/gemdos.u; gemdos_programs + 5 6 Program launch and TPA; gemdos/gemdos.u; gemdos_tpa + 5 7 Signals; gemdos/signale.u; gemdos_signals + 5 7 1 Signal-handler in MagiC; gemdos/signale.u; gemdos_signals + 5 7 2 Sample code for signals; gemdos/signale.u; gemdos_signals + 5 8 gemdos-trap; gemdos/gemdos.u; gemdos_trap + 5 9 File functions; gemdos/file/file.u; gemdos_file + 5 9 1 Fattrib; gemdos/file/fattrib.ui; gemdos_file + 5 9 1 1 Bindings for Fattrib; gemdos/file/fattrib.ui; gemdos_file + 5 9 2 Fchdir; gemdos/file/fchdir.ui; gemdos_file + 5 9 2 1 Bindings for Fchdir; gemdos/file/fchdir.ui; gemdos_file + 5 9 3 Fchmod; gemdos/file/fchmod.ui; gemdos_file + 5 9 3 1 Bindings for Fchmod; gemdos/file/fchmod.ui; gemdos_file + 5 9 4 Fchown; gemdos/file/fchown.ui; gemdos_file + 5 9 4 1 Bindings for Fchown; gemdos/file/fchown.ui; gemdos_file + 5 9 5 Fchown16; gemdos/file/fchown16.ui; gemdos_file + 5 9 5 1 Bindings for Fchown16; gemdos/file/fchown16.ui; gemdos_file + 5 9 6 Fclose; gemdos/file/fclose.ui; gemdos_file + 5 9 6 1 Bindings for Fclose; gemdos/file/fclose.ui; gemdos_file + 5 9 7 Fcntl; gemdos/file/fcntl.ui; gemdos_file + 5 9 7 1 Bindings for Fcntl; gemdos/file/fcntl.ui; gemdos_file + 5 9 8 Fcreate; gemdos/file/fcreate.ui; gemdos_file + 5 9 8 1 Bindings for Fcreate; gemdos/file/fcreate.ui; gemdos_file + 5 9 9 Fdatime; gemdos/file/fdatime.ui; gemdos_file + 5 9 9 1 Bindings for Fdatime; gemdos/file/fdatime.ui; gemdos_file + 5 9 10 Fdelete; gemdos/file/fdelete.ui; gemdos_file + 5 9 10 1 Bindings for Fdelete; gemdos/file/fdelete.ui; gemdos_file + 5 9 11 Fdirfd; gemdos/file/fdirfd.ui; gemdos_file + 5 9 11 1 Bindings for Fdirfd; gemdos/file/fdirfd.ui; gemdos_file + 5 9 12 Fdup; gemdos/file/fdup.ui; gemdos_file + 5 9 12 1 Bindings for Fdup; gemdos/file/fdup.ui; gemdos_file + 5 9 13 Ffchmod; gemdos/file/ffchmod.ui; gemdos_file + 5 9 13 1 Bindings for Ffchmod; gemdos/file/ffchmod.ui; gemdos_file + 5 9 14 Ffchown; gemdos/file/ffchown.ui; gemdos_file + 5 9 14 1 Bindings for Ffchown; gemdos/file/ffchown.ui; gemdos_file + 5 9 15 Ffdopendir; gemdos/file/ffdopendir.ui; gemdos_file + 5 9 15 1 Bindings for Ffdopendir; gemdos/file/ffdopendir.ui; gemdos_file + 5 9 16 Fforce; gemdos/file/fforce.ui; gemdos_file + 5 9 16 1 Bindings for Fforce; gemdos/file/fforce.ui; gemdos_file + 5 9 17 Ffstat64; gemdos/file/ffstat64.ui; gemdos_file + 5 9 17 1 Bindings for Ffstat64; gemdos/file/ffstat64.ui; gemdos_file + 5 9 18 Fgetchar; gemdos/file/fgetchar.ui; gemdos_file + 5 9 18 1 Bindings for Fgetchar; gemdos/file/fgetchar.ui; gemdos_file + 5 9 19 Fgetdta; gemdos/file/fgetdta.ui; gemdos_file + 5 9 19 1 Bindings for Fgetdta; gemdos/file/fgetdta.ui; gemdos_file + 5 9 20 Finstat; gemdos/file/finstat.ui; gemdos_file + 5 9 20 1 Bindings for Finstat; gemdos/file/finstat.ui; gemdos_file + 5 9 21 Flink; gemdos/file/flink.ui; gemdos_file + 5 9 21 1 Bindings for Flink; gemdos/file/flink.ui; gemdos_file + 5 9 22 Flock; gemdos/file/flock.ui; gemdos_file + 5 9 22 1 Bindings for Flock; gemdos/file/flock.ui; gemdos_file + 5 9 23 Fmidipipe; gemdos/file/fmidipip.ui; gemdos_file + 5 9 23 1 Bindings for Fmidipipe; gemdos/file/fmidipip.ui; gemdos_file + 5 9 24 Fopen; gemdos/file/fopen.ui; gemdos_file + 5 9 24 1 Bindings for Fopen; gemdos/file/fopen.ui; gemdos_file + 5 9 25 Foutstat; gemdos/file/foutstat.ui; gemdos_file + 5 9 25 1 Bindings for Foutstat; gemdos/file/foutstat.ui; gemdos_file + 5 9 26 Fpipe; gemdos/file/fpipe.ui; gemdos_file + 5 9 26 1 Bindings for Fpipe; gemdos/file/fpipe.ui; gemdos_file + 5 9 27 Fpoll; gemdos/file/fpoll.ui; gemdos_file + 5 9 27 1 Bindings for Fpoll; gemdos/file/fpoll.ui; gemdos_file + 5 9 28 Fputchar; gemdos/file/fputchar.ui; gemdos_file + 5 9 28 1 Bindings for Fputchar; gemdos/file/fputchar.ui; gemdos_file + 5 9 29 Fread; gemdos/file/fread.ui; gemdos_file + 5 9 29 1 Bindings for Fread; gemdos/file/fread.ui; gemdos_file + 5 9 30 Freadlink; gemdos/file/freadlin.ui; gemdos_file + 5 9 30 1 Bindings for Freadlink; gemdos/file/freadlin.ui; gemdos_file + 5 9 31 Frename; gemdos/file/frename.ui; gemdos_file + 5 9 31 1 Bindings for Frename; gemdos/file/frename.ui; gemdos_file + 5 9 32 Fseek; gemdos/file/fseek.ui; gemdos_file + 5 9 32 1 Bindings for Fseek; gemdos/file/fseek.ui; gemdos_file + 5 9 33 Fseek64; gemdos/file/fseek64.ui; gemdos_file + 5 9 33 1 Bindings for Fseek64; gemdos/file/fseek64.ui; gemdos_file + 5 9 34 Fselect; gemdos/file/fselect.ui; gemdos_file + 5 9 34 1 Bindings for Fselect; gemdos/file/fselect.ui; gemdos_file + 5 9 35 Fsetdta; gemdos/file/fsetdta.ui; gemdos_file + 5 9 35 1 Bindings for Fsetdta; gemdos/file/fsetdta.ui; gemdos_file + 5 9 36 Fsfirst; gemdos/file/fsfirst.ui; gemdos_file + 5 9 36 1 Bindings for Fsfirst; gemdos/file/fsfirst.ui; gemdos_file + 5 9 37 Fsnext; gemdos/file/fsnext.ui; gemdos_file + 5 9 37 1 Bindings for Fsnext; gemdos/file/fsnext.ui; gemdos_file + 5 9 38 Fsymlink; gemdos/file/fsymlink.ui; gemdos_file + 5 9 38 1 Bindings for Fsymlink; gemdos/file/fsymlink.ui; gemdos_file + 5 9 39 Fstat64; gemdos/file/fstat64.ui; gemdos_file + 5 9 39 1 Bindings for Fstat64; gemdos/file/fstat64.ui; gemdos_file + 5 9 40 Fsync; gemdos/file/fsync.ui; gemdos_file + 5 9 40 1 Bindings for Fsync; gemdos/file/fsync.ui; gemdos_file + 5 9 41 Fwrite; gemdos/file/fwrite.ui; gemdos_file + 5 9 41 1 Bindings for Fwrite; gemdos/file/fwrite.ui; gemdos_file + 5 9 42 Fxattr; gemdos/file/fxattr.ui; gemdos_file + 5 9 42 1 Bindings for Fxattr; gemdos/file/fxattr.ui; gemdos_file + 5 10 Date and Time; gemdos/datetime/datetime.u; gemdos_datetime + 5 10 1 Tadjtime; gemdos/datetime/tadjtime.ui; gemdos_datetime + 5 10 1 1 Bindings for Tadjtime; gemdos/datetime/tadjtime.ui; gemdos_datetime + 5 10 2 Talarm; gemdos/datetime/talarm.ui; gemdos_datetime + 5 10 2 1 Bindings for Talarm; gemdos/datetime/talarm.ui; gemdos_datetime + 5 10 3 Tgetdate; gemdos/datetime/tgetdate.ui; gemdos_datetime + 5 10 3 1 Bindings for Tgetdate; gemdos/datetime/tgetdate.ui; gemdos_datetime + 5 10 4 Tgettime; gemdos/datetime/tgettime.ui; gemdos_datetime + 5 10 4 1 Bindings for Tgettime; gemdos/datetime/tgettime.ui; gemdos_datetime + 5 10 5 Tgettimeofday; gemdos/datetime/tgettofd.ui; gemdos_datetime + 5 10 5 1 Bindings for Tgettimeofday; gemdos/datetime/tgettofd.ui; gemdos_datetime + 5 10 6 Tmalarm; gemdos/datetime/tmalarm.ui; gemdos_datetime + 5 10 6 1 Bindings for Tmalarm; gemdos/datetime/tmalarm.ui; gemdos_datetime + 5 10 7 Tsetdate; gemdos/datetime/tsetdate.ui; gemdos_datetime + 5 10 7 1 Bindings for Tsetdate; gemdos/datetime/tsetdate.ui; gemdos_datetime + 5 10 8 Tsetitimer; gemdos/datetime/tsetitim.ui; gemdos_datetime + 5 10 8 1 Bindings for Tsetitimer; gemdos/datetime/tsetitim.ui; gemdos_datetime + 5 10 9 Tsettime; gemdos/datetime/tsettime.ui; gemdos_datetime + 5 10 9 1 Bindings for Tsettime; gemdos/datetime/tsettime.ui; gemdos_datetime + 5 10 10 Tsettimeofday; gemdos/datetime/tsettofd.ui; gemdos_datetime + 5 10 10 1 Bindings for Tsettimeofday; gemdos/datetime/tsettofd.ui; gemdos_datetime + 5 11 Process functions; gemdos/prozess/prozess.u; gemdos_process + 5 11 1 Pause; gemdos/prozess/pause.ui; gemdos_process + 5 11 1 1 Bindings for Pause; gemdos/prozess/pause.ui; gemdos_process + 5 11 2 Pdomain; gemdos/prozess/pdomain.ui; gemdos_process + 5 11 2 1 Bindings for Pdomain; gemdos/prozess/pdomain.ui; gemdos_process + 5 11 3 Pexec; gemdos/prozess/pexec.ui; gemdos_process + 5 11 3 1 Bindings for Pexec; gemdos/prozess/pexec.ui; gemdos_process + 5 11 4 Pfork; gemdos/prozess/pfork.ui; gemdos_process + 5 11 4 1 Bindings for Pfork; gemdos/prozess/pfork.ui; gemdos_process + 5 11 5 Pgetauid; gemdos/prozess/pgetauid.ui; gemdos_process + 5 11 5 1 Bindings for Pgetauid; gemdos/prozess/pgetauid.ui; gemdos_process + 5 11 6 Pgetegid; gemdos/prozess/pgetegid.ui; gemdos_process + 5 11 6 1 Bindings for Pgetegid; gemdos/prozess/pgetegid.ui; gemdos_process + 5 11 7 Pgeteuid; gemdos/prozess/pgeteuid.ui; gemdos_process + 5 11 7 1 Bindings for Pgeteuid; gemdos/prozess/pgeteuid.ui; gemdos_process + 5 11 8 Pgetgid; gemdos/prozess/pgetgid.ui; gemdos_process + 5 11 8 1 Bindings for Pgetgid; gemdos/prozess/pgetgid.ui; gemdos_process + 5 11 9 Pgetgroups; gemdos/prozess/pgetgrou.ui; gemdos_process + 5 11 9 1 Bindings for Pgetgroups; gemdos/prozess/pgetgrou.ui; gemdos_process + 5 11 10 Pgetpgrp; gemdos/prozess/pgetpgrp.ui; gemdos_process + 5 11 10 1 Bindings for Pgetpgrp; gemdos/prozess/pgetpgrp.ui; gemdos_process + 5 11 11 Pgetpid; gemdos/prozess/pgetpid.ui; gemdos_process + 5 11 11 1 Bindings for Pgetpid; gemdos/prozess/pgetpid.ui; gemdos_process + 5 11 12 Pgetppid; gemdos/prozess/pgetppid.ui; gemdos_process + 5 11 12 1 Bindings for Pgetppid; gemdos/prozess/pgetppid.ui; gemdos_process + 5 11 13 Pgetpriority; gemdos/prozess/pgetprio.ui; gemdos_process + 5 11 13 1 Bindings for Pgetpriority; gemdos/prozess/pgetprio.ui; gemdos_process + 5 11 14 Pgetuid; gemdos/prozess/pgetuid.ui; gemdos_process + 5 11 14 1 Bindings for Pgetuid; gemdos/prozess/pgetuid.ui; gemdos_process + 5 11 15 Pkill; gemdos/prozess/pkill.ui; gemdos_process + 5 11 15 1 Bindings for Pkill; gemdos/prozess/pkill.ui; gemdos_process + 5 11 16 Pmsg; gemdos/prozess/pmsg.ui; gemdos_process + 5 11 16 1 Bindings for Pmsg; gemdos/prozess/pmsg.ui; gemdos_process + 5 11 17 Pnice; gemdos/prozess/pnice.ui; gemdos_process + 5 11 17 1 Bindings for Pnice; gemdos/prozess/pnice.ui; gemdos_process + 5 11 18 Prenice; gemdos/prozess/prenice.ui; gemdos_process + 5 11 18 1 Bindings for Prenice; gemdos/prozess/prenice.ui; gemdos_process + 5 11 19 Prusage; gemdos/prozess/prusage.ui; gemdos_process + 5 11 19 1 Bindings for Prusage; gemdos/prozess/prusage.ui; gemdos_process + 5 11 20 Psemaphore; gemdos/prozess/psemapho.ui; gemdos_process + 5 11 20 1 Bindings for Psemaphore; gemdos/prozess/psemapho.ui; gemdos_process + 5 11 21 Psetauid; gemdos/prozess/psetauid.ui; gemdos_process + 5 11 21 1 Bindings for Psetauid; gemdos/prozess/psetauid.ui; gemdos_process + 5 11 22 Psetegid; gemdos/prozess/psetegid.ui; gemdos_process + 5 11 22 1 Bindings for Psetegid; gemdos/prozess/psetegid.ui; gemdos_process + 5 11 23 Pseteuid; gemdos/prozess/pseteuid.ui; gemdos_process + 5 11 23 1 Bindings for Pseteuid; gemdos/prozess/pseteuid.ui; gemdos_process + 5 11 24 Psetgid; gemdos/prozess/psetgid.ui; gemdos_process + 5 11 24 1 Bindings for Psetgid; gemdos/prozess/psetgid.ui; gemdos_process + 5 11 25 Psetgroups; gemdos/prozess/psetgrou.ui; gemdos_process + 5 11 25 1 Bindings for Psetgroups; gemdos/prozess/psetgrou.ui; gemdos_process + 5 11 26 Psetlimit; gemdos/prozess/psetlimi.ui; gemdos_process + 5 11 26 1 Bindings for Psetlimit; gemdos/prozess/psetlimi.ui; gemdos_process + 5 11 27 Psetpgrp; gemdos/prozess/psetpgrp.ui; gemdos_process + 5 11 27 1 Bindings for Psetpgrp; gemdos/prozess/psetpgrp.ui; gemdos_process + 5 11 28 Psetpriority; gemdos/prozess/psetprio.ui; gemdos_process + 5 11 28 1 Bindings for Psetpriority; gemdos/prozess/psetprio.ui; gemdos_process + 5 11 29 Psetregid; gemdos/prozess/psetregi.ui; gemdos_process + 5 11 29 1 Bindings for Psetregid; gemdos/prozess/psetregi.ui; gemdos_process + 5 11 30 Psetreuid; gemdos/prozess/psetreui.ui; gemdos_process + 5 11 30 1 Bindings for Psetreuid; gemdos/prozess/psetreui.ui; gemdos_process + 5 11 31 Psetuid; gemdos/prozess/psetuid.ui; gemdos_process + 5 11 31 1 Bindings for Psetuid; gemdos/prozess/psetuid.ui; gemdos_process + 5 11 32 Psigaction; gemdos/prozess/psigacti.ui; gemdos_process + 5 11 32 1 Bindings for Psigaction; gemdos/prozess/psigacti.ui; gemdos_process + 5 11 33 Psigblock; gemdos/prozess/psigbloc.ui; gemdos_process + 5 11 33 1 Bindings for Psigblock; gemdos/prozess/psigbloc.ui; gemdos_process + 5 11 34 Psigintr; gemdos/prozess/psigintr.ui; gemdos_process + 5 11 34 1 Bindings for Psigintr; gemdos/prozess/psigintr.ui; gemdos_process + 5 11 35 Psignal; gemdos/prozess/psignal.ui; gemdos_process + 5 11 35 1 Bindings for Psignal; gemdos/prozess/psignal.ui; gemdos_process + 5 11 36 Psigpause; gemdos/prozess/psigpaus.ui; gemdos_process + 5 11 36 1 Bindings for Psigpause; gemdos/prozess/psigpaus.ui; gemdos_process + 5 11 37 Psigpending; gemdos/prozess/psigpend.ui; gemdos_process + 5 11 37 1 Bindings for Psigpending; gemdos/prozess/psigpend.ui; gemdos_process + 5 11 38 Psigreturn; gemdos/prozess/psigretu.ui; gemdos_process + 5 11 38 1 Bindings for Psigreturn; gemdos/prozess/psigretu.ui; gemdos_process + 5 11 39 Psigsetmask; gemdos/prozess/psigsetm.ui; gemdos_process + 5 11 39 1 Bindings for Psigsetmask; gemdos/prozess/psigsetm.ui; gemdos_process + 5 11 40 Psysctl; gemdos/prozess/psysctl.ui; gemdos_process + 5 11 40 1 Bindings for Psysctl; gemdos/prozess/psysctl.ui; gemdos_process + 5 11 41 Pterm; gemdos/prozess/pterm.ui; gemdos_process + 5 11 41 1 Bindings for Pterm; gemdos/prozess/pterm.ui; gemdos_process + 5 11 42 Pterm0; gemdos/prozess/pterm0.ui; gemdos_process + 5 11 42 1 Bindings for Pterm0; gemdos/prozess/pterm0.ui; gemdos_process + 5 11 43 Ptermres; gemdos/prozess/ptermres.ui; gemdos_process + 5 11 43 1 Bindings for Ptermres; gemdos/prozess/ptermres.ui; gemdos_process + 5 11 44 Ptrace; gemdos/prozess/ptrace.ui; gemdos_process + 5 11 44 1 Bindings for Ptrace; gemdos/prozess/ptrace.ui; gemdos_process + 5 11 45 Pumask; gemdos/prozess/pumask.ui; gemdos_process + 5 11 45 1 Bindings for Pumask; gemdos/prozess/pumask.ui; gemdos_process + 5 11 46 Pusrval; gemdos/prozess/pusrval.ui; gemdos_process + 5 11 46 1 Bindings for Pusrval; gemdos/prozess/pusrval.ui; gemdos_process + 5 11 47 Pvfork; gemdos/prozess/pvfork.ui; gemdos_process + 5 11 47 1 Bindings for Pvfork; gemdos/prozess/pvfork.ui; gemdos_process + 5 11 48 Pwait; gemdos/prozess/pwait.ui; gemdos_process + 5 11 48 1 Bindings for Pwait; gemdos/prozess/pwait.ui; gemdos_process + 5 11 49 Pwait3; gemdos/prozess/pwait3.ui; gemdos_process + 5 11 49 1 Bindings for Pwait3; gemdos/prozess/pwait3.ui; gemdos_process + 5 11 50 Pwaitpid; gemdos/prozess/pwaitpid.ui; gemdos_process + 5 11 50 1 Bindings for Pwaitpid; gemdos/prozess/pwaitpid.ui; gemdos_process + 5 12 Memory management; gemdos/memory/memory.u; gemdos_memory + 5 12 1 Maccess; gemdos/memory/maccess.ui; gemdos_memory + 5 12 1 1 Bindings for Maccess; gemdos/memory/maccess.ui; gemdos_memory + 5 12 2 Maddalt; gemdos/memory/maddalt.ui; gemdos_memory + 5 12 2 1 Bindings for Maddalt; gemdos/memory/maddalt.ui; gemdos_memory + 5 12 3 Malloc; gemdos/memory/malloc.ui; gemdos_memory + 5 12 3 1 Bindings for Malloc; gemdos/memory/malloc.ui; gemdos_memory + 5 12 4 Mfree; gemdos/memory/mfree.ui; gemdos_memory + 5 12 4 1 Bindings for Mfree; gemdos/memory/mfree.ui; gemdos_memory + 5 12 5 Mshrink; gemdos/memory/mshrink.ui; gemdos_memory + 5 12 5 1 Bindings for Mshrink; gemdos/memory/mshrink.ui; gemdos_memory + 5 12 6 Mvalidate; gemdos/memory/mvalidate.ui; gemdos_memory + 5 12 6 1 Bindings for Mvalidate; gemdos/memory/mvalidate.ui; gemdos_memory + 5 12 7 Mxalloc; gemdos/memory/mxalloc.ui; gemdos_memory + 5 12 7 1 Bindings for Mxalloc; gemdos/memory/mxalloc.ui; gemdos_memory + 5 12 7 2 Mxmask; gemdos/memory/mxalloc.ui; gemdos_memory + 5 13 Network functions; gemdos/network/network.u; gemdos_network + 5 13 1 Fflush; gemdos/network/fflush.ui; gemdos_network + 5 13 1 1 Bindings for Fflush; gemdos/network/fflush.ui; gemdos_network + 5 13 2 F_lock; gemdos/network/flock.ui; gemdos_network + 5 13 2 1 Bindings for F_lock; gemdos/network/flock.ui; gemdos_network + 5 13 3 Frlock; gemdos/network/frlock.ui; gemdos_network + 5 13 3 1 Bindings for Frlock; gemdos/network/frlock.ui; gemdos_network + 5 13 4 Frunlock; gemdos/network/frunlock.ui; gemdos_network + 5 13 4 1 Bindings for Frunlock; gemdos/network/frunlock.ui; gemdos_network + 5 13 5 Funlock; gemdos/network/funlock.ui; gemdos_network + 5 13 5 1 Bindings for Funlock; gemdos/network/funlock.ui; gemdos_network + 5 13 6 Nversion; gemdos/network/Nversion.ui; gemdos_network + 5 13 6 1 Bindings for Nversion; gemdos/network/Nversion.ui; gemdos_network + 5 14 System functions; gemdos/system/system.u; gemdos_system + 5 14 1 Salert; gemdos/system/salert.ui; gemdos_system + 5 14 1 1 Bindings for Salert; gemdos/system/salert.ui; gemdos_system + 5 14 2 Sconfig; gemdos/system/sconfig.ui; gemdos_system + 5 14 2 1 Bindings for Sconfig; gemdos/system/sconfig.ui; gemdos_system + 5 14 3 Scookie; gemdos/system/scookie.ui; gemdos_system + 5 14 3 1 Bindings for Scookie; gemdos/system/scookie.ui; gemdos_system + 5 14 4 Shutdown; gemdos/system/shutdown.ui; gemdos_system + 5 14 4 1 Bindings for Shutdown; gemdos/system/shutdown.ui; gemdos_system + 5 14 5 Slbclose; gemdos/system/slbclose.ui; gemdos_system + 5 14 5 1 Bindings for Slbclose; gemdos/system/slbclose.ui; gemdos_system + 5 14 6 Slbopen; gemdos/system/slbopen.ui; gemdos_system + 5 14 6 1 Bindings for Slbopen; gemdos/system/slbopen.ui; gemdos_system + 5 14 7 Srealloc; gemdos/system/srealloc.ui; gemdos_system + 5 14 7 1 Bindings for Srealloc; gemdos/system/srealloc.ui; gemdos_system + 5 14 8 Ssystem; gemdos/system/ssystem.ui; gemdos_system + 5 14 8 1 Bindings for Ssystem; gemdos/system/ssystem.ui; gemdos_system + 5 14 9 STEFcntrl; gemdos/system/stefcntr.ui; gemdos_system + 5 14 9 1 Bindings for STEFcntrl; gemdos/system/stefcntr.ui; gemdos_system + 5 14 10 Super; gemdos/system/super.ui; gemdos_system + 5 14 10 1 Bindings for Super; gemdos/system/super.ui; gemdos_system + 5 14 10 2 Note for the use of the GEMDOS function Super; gemdos/system/super.ui; gemdos_system + 5 14 11 Suptime; gemdos/system/suptime.ui; gemdos_system + 5 14 11 1 Bindings for Suptime; gemdos/system/suptime.ui; gemdos_system + 5 14 12 Sversion; gemdos/system/sversion.ui; gemdos_system + 5 14 12 1 Bindings for Sversion; gemdos/system/sversion.ui; gemdos_system + 5 14 13 Syield; gemdos/system/syield.ui; gemdos_system + 5 14 13 1 Bindings for Syield; gemdos/system/syield.ui; gemdos_system + 5 14 14 Sync; gemdos/system/sync.ui; gemdos_system + 5 14 14 1 Bindings for Sync; gemdos/system/sync.ui; gemdos_system + 5 14 15 Sysconf; gemdos/system/sysconf.ui; gemdos_system + 5 14 15 1 Bindings for Sysconf; gemdos/system/sysconf.ui; gemdos_system + 5 15 Directory functions; gemdos/dir/dir.u; gemdos_directory + 5 15 1 Dchroot; gemdos/dir/dchroot.ui; gemdos_directory + 5 15 1 1 Bindings for Dchroot; gemdos/dir/dchroot.ui; gemdos_directory + 5 15 2 Dclosedir; gemdos/dir/dclosedi.ui; gemdos_directory + 5 15 2 1 Bindings for Dclosedir; gemdos/dir/dclosedi.ui; gemdos_directory + 5 15 3 Dcntl; gemdos/dir/dcntl.ui; gemdos_directory + 5 15 3 1 Bindings for Dcntl; gemdos/dir/dcntl.ui; gemdos_directory + 5 15 4 Dcreate; gemdos/dir/dcreate.ui; gemdos_directory + 5 15 4 1 Bindings for Dcreate; gemdos/dir/dcreate.ui; gemdos_directory + 5 15 5 Ddelete; gemdos/dir/ddelete.ui; gemdos_directory + 5 15 5 1 Bindings for Ddelete; gemdos/dir/ddelete.ui; gemdos_directory + 5 15 6 Dfree; gemdos/dir/dfree.ui; gemdos_directory + 5 15 6 1 Bindings for Dfree; gemdos/dir/dfree.ui; gemdos_directory + 5 15 7 Dgetcwd; gemdos/dir/dgetcwd.ui; gemdos_directory + 5 15 7 1 Bindings for Dgetcwd; gemdos/dir/dgetcwd.ui; gemdos_directory + 5 15 8 Dgetdrv; gemdos/dir/dgetdrv.ui; gemdos_directory + 5 15 8 1 Bindings for Dgetdrv; gemdos/dir/dgetdrv.ui; gemdos_directory + 5 15 9 Dgetpath; gemdos/dir/dgetpath.ui; gemdos_directory + 5 15 9 1 Bindings for Dgetpath; gemdos/dir/dgetpath.ui; gemdos_directory + 5 15 10 Dlock; gemdos/dir/dlock.ui; gemdos_directory + 5 15 10 1 Bindings for Dlock; gemdos/dir/dlock.ui; gemdos_directory + 5 15 11 Dopendir; gemdos/dir/dopendir.ui; gemdos_directory + 5 15 11 1 Bindings for Dopendir; gemdos/dir/dopendir.ui; gemdos_directory + 5 15 12 Dpathconf; gemdos/dir/dpathcon.ui; gemdos_directory + 5 15 12 1 Bindings for Dpathconf; gemdos/dir/dpathcon.ui; gemdos_directory + 5 15 13 Dreaddir; gemdos/dir/dreaddir.ui; gemdos_directory + 5 15 13 1 Bindings for Dreaddir; gemdos/dir/dreaddir.ui; gemdos_directory + 5 15 14 Dreadlabel; gemdos/dir/dreadlab.ui; gemdos_directory + 5 15 14 1 Bindings for Dreadlabel; gemdos/dir/dreadlab.ui; gemdos_directory + 5 15 15 Drewinddir; gemdos/dir/drewindd.ui; gemdos_directory + 5 15 15 1 Bindings for Drewinddir; gemdos/dir/drewindd.ui; gemdos_directory + 5 15 16 Dsetdrv; gemdos/dir/dsetdrv.ui; gemdos_directory + 5 15 16 1 Bindings for Dsetdrv; gemdos/dir/dsetdrv.ui; gemdos_directory + 5 15 17 Dsetkey; gemdos/dir/dsetkey.ui; gemdos_directory + 5 15 17 1 Bindings for Dsetkey; gemdos/dir/dsetkey.ui; gemdos_directory + 5 15 18 Dsetpath; gemdos/dir/dsetpath.ui; gemdos_directory + 5 15 18 1 Bindings for Dsetpath; gemdos/dir/dsetpath.ui; gemdos_directory + 5 15 19 Dwritelabel; gemdos/dir/dwritela.ui; gemdos_directory + 5 15 19 1 Bindings for Dwritelabel; gemdos/dir/dwritela.ui; gemdos_directory + 5 15 20 Dxopendir; gemdos/dir/dxopendir.ui; gemdos_directory + 5 15 20 1 Bindings for Dxopendir; gemdos/dir/dxopendir.ui; gemdos_directory + 5 15 21 Dxreaddir; gemdos/dir/dxreaddi.ui; gemdos_directory + 5 15 21 1 Bindings for Dxreaddir; gemdos/dir/dxreaddi.ui; gemdos_directory + 5 16 Character input/output; gemdos/chrinout/chrinout.u; gemdos_chrinout + 5 16 1 Cauxin; gemdos/chrinout/cauxin.ui; gemdos_chrinout + 5 16 1 1 Bindings for Cauxin; gemdos/chrinout/cauxin.ui; gemdos_chrinout + 5 16 2 Cauxis; gemdos/chrinout/cauxis.ui; gemdos_chrinout + 5 16 2 1 Bindings for Cauxis; gemdos/chrinout/cauxis.ui; gemdos_chrinout + 5 16 3 Cauxos; gemdos/chrinout/cauxos.ui; gemdos_chrinout + 5 16 3 1 Bindings for Cauxos; gemdos/chrinout/cauxos.ui; gemdos_chrinout + 5 16 4 Cauxout; gemdos/chrinout/cauxout.ui; gemdos_chrinout + 5 16 4 1 Bindings for Cauxout; gemdos/chrinout/cauxout.ui; gemdos_chrinout + 5 16 5 Cconin; gemdos/chrinout/cconin.ui; gemdos_chrinout + 5 16 5 1 Bindings for Cconin; gemdos/chrinout/cconin.ui; gemdos_chrinout + 5 16 6 Cconis; gemdos/chrinout/cconis.ui; gemdos_chrinout + 5 16 6 1 Bindings for Cconis; gemdos/chrinout/cconis.ui; gemdos_chrinout + 5 16 7 Cconos; gemdos/chrinout/cconos.ui; gemdos_chrinout + 5 16 7 1 Bindings for Cconos; gemdos/chrinout/cconos.ui; gemdos_chrinout + 5 16 8 Cconout; gemdos/chrinout/cconout.ui; gemdos_chrinout + 5 16 8 1 Bindings for Cconout; gemdos/chrinout/cconout.ui; gemdos_chrinout + 5 16 9 Cconrs; gemdos/chrinout/cconrs.ui; gemdos_chrinout + 5 16 9 1 Bindings for Cconrs; gemdos/chrinout/cconrs.ui; gemdos_chrinout + 5 16 10 Cconws; gemdos/chrinout/cconws.ui; gemdos_chrinout + 5 16 10 1 Bindings for Cconws; gemdos/chrinout/cconws.ui; gemdos_chrinout + 5 16 11 Cnecin; gemdos/chrinout/cnecin.ui; gemdos_chrinout + 5 16 11 1 Bindings for Cnecin; gemdos/chrinout/cnecin.ui; gemdos_chrinout + 5 16 12 Cprnos; gemdos/chrinout/cprnos.ui; gemdos_chrinout + 5 16 12 1 Bindings for Cprnos; gemdos/chrinout/cprnos.ui; gemdos_chrinout + 5 16 13 Cprnout; gemdos/chrinout/cprnout.ui; gemdos_chrinout + 5 16 13 1 Bindings for Cprnout; gemdos/chrinout/cprnout.ui; gemdos_chrinout + 5 16 14 Crawcin; gemdos/chrinout/crawcin.ui; gemdos_chrinout + 5 16 14 1 Bindings for Crawcin; gemdos/chrinout/crawcin.ui; gemdos_chrinout + 5 16 15 Crawio; gemdos/chrinout/crawio.ui; gemdos_chrinout + 5 16 15 1 Bindings for Crawio; gemdos/chrinout/crawio.ui; gemdos_chrinout + 5 17 Network; gemdos/mintnet/mintnet.u; gemdos_mintnet + 5 17 1 Fwritev; gemdos/mintnet/fwritev.ui; gemdos_mintnet + 5 17 2 Freadv; gemdos/mintnet/freadv.ui; gemdos_mintnet + 5 17 3 Fsocket; gemdos/mintnet/fsocket.ui; gemdos_mintnet + 5 17 4 Fsocketpair; gemdos/mintnet/fsocketpair.ui; gemdos_mintnet + 5 17 5 Faccept; gemdos/mintnet/faccept.ui; gemdos_mintnet + 5 17 6 Fconnect; gemdos/mintnet/fconnect.ui; gemdos_mintnet + 5 17 7 Fbind; gemdos/mintnet/fbind.ui; gemdos_mintnet + 5 17 8 Flisten; gemdos/mintnet/flisten.ui; gemdos_mintnet + 5 17 9 Frecvmsg; gemdos/mintnet/frecvmsg.ui; gemdos_mintnet + 5 17 10 Fsendmsg; gemdos/mintnet/fsendmsg.ui; gemdos_mintnet + 5 17 11 Frecvfrom; gemdos/mintnet/frecvfrom.ui; gemdos_mintnet + 5 17 12 Fsendto; gemdos/mintnet/fsendto.ui; gemdos_mintnet + 5 17 13 Fsetsockopt; gemdos/mintnet/fsetsockopt.ui; gemdos_mintnet + 5 17 14 Fgetsockopt; gemdos/mintnet/fgetsockopt.ui; gemdos_mintnet + 5 17 15 Fgetpeername; gemdos/mintnet/fgetpeername.ui; gemdos_mintnet + 5 17 16 Fgetsockname; gemdos/mintnet/fgetsockname.ui; gemdos_mintnet + 5 17 17 Fshutdown; gemdos/mintnet/fshutdown.ui; gemdos_mintnet + 5 18 ARGV procedure; gemdos/argv.u; gemdos_argv + 5 19 C'Task Royal; gemdos/c_task.u; c_task_royal + 5 20 NAP BioNet100; gemdos/bionet.u; nap_bionet100 + 5 21 PowerDOS; gemdos/powerdos.u; powerdos + 5 22 TekBios; gemdos/tekbios.u; tekbios + 5 23 GEMDOS function list; gemdos/gemdos_f.u; gemdos_functions + 5 24 GEMDOS structures; gemdos/structures/structures.u; gemdos_structures + 5 24 1 CD-ROM definitions; gemdos/structures/cdrom.ui; gemdos_structures + 5 24 2 cdrom_audioctrl; gemdos/structures/cdrom_audioctrl.ui; gemdos_structures + 5 24 3 cdrom_mcn; gemdos/structures/cdrom_mcn.ui; gemdos_structures + 5 24 4 cdrom_msf; gemdos/structures/cdrom_msf.ui; gemdos_structures + 5 24 5 cdrom_read; gemdos/structures/cdrom_read.ui; gemdos_structures + 5 24 6 cdrom_subchnl; gemdos/structures/cdrom_subchnl.ui; gemdos_structures + 5 24 7 cdrom_ti; gemdos/structures/cdrom_ti.ui; gemdos_structures + 5 24 8 cdrom_tisrc; gemdos/structures/cdrom_tisrc.ui; gemdos_structures + 5 24 9 cdrom_tocentry; gemdos/structures/cdrom_tocentry.ui; gemdos_structures + 5 24 10 cdrom_tochdr; gemdos/structures/cdrom_tochdr.ui; gemdos_structures + 5 24 11 cdrom_volctrl; gemdos/structures/cdrom_volctrl.ui; gemdos_structures + 5 24 12 cd_ad; gemdos/structures/cd_ad.ui; gemdos_structures + 5 24 13 DISKINFO; gemdos/structures/DISKINFO.ui; gemdos_structures + 5 24 14 DOSTIME; gemdos/structures/DOSTIME.ui; gemdos_structures + 5 24 15 DOSVARS; gemdos/structures/DOSVARS.ui; gemdos_structures + 5 24 16 DTA; gemdos/structures/DTA.ui; gemdos_structures + 5 24 17 fcookie; gemdos/structures/fcookie.ui; gemdos_structures + 5 24 18 FILEPTR; gemdos/structures/FILEPTR.ui; gemdos_structures + 5 24 19 flock, Fcntl; gemdos/structures/flock.ui; gemdos_structures + 5 24 20 iovec; gemdos/structures/iovec.ui; gemdos_structures + 5 24 21 LINE; gemdos/structures/LINE.ui; gemdos_structures + 5 24 22 ltchars; gemdos/structures/ltchars.ui; gemdos_structures + 5 24 23 msghdr; gemdos/structures/msghdr.ui; gemdos_structures + 5 24 24 mutimbuf; gemdos/structures/mutimbuf.ui; gemdos_structures + 5 24 25 Process Descriptor (PD) resp. BASEPAGE; gemdos/structures/PD.ui; gemdos_structures + 5 24 26 Poll Descriptor; gemdos/structures/POLLFD.ui; gemdos_structures + 5 24 27 ploadinfo; gemdos/structures/ploadinfo.ui; gemdos_structures + 5 24 28 sgttyb; gemdos/structures/sgttyb.ui; gemdos_structures + 5 24 29 struct sigaction; gemdos/structures/sigaction.ui; gemdos_structures + 5 24 30 sockaddr; gemdos/structures/sockaddr.ui; gemdos_structures + 5 24 31 STAT; gemdos/structures/STAT.ui; gemdos_structures + 5 24 31 1 STAT, dev-components; gemdos/structures/STAT.ui; gemdos_structures + 5 24 31 2 STAT, possible filetypes; gemdos/structures/STAT.ui; gemdos_structures + 5 24 31 3 STAT, Sticky-bit; gemdos/structures/STAT.ui; gemdos_structures + 5 24 31 4 STAT, size-components; gemdos/structures/STAT.ui; gemdos_structures + 5 24 31 5 STAT, access rights; gemdos/structures/STAT.ui; gemdos_structures + 5 24 32 tchars; gemdos/structures/tchars.ui; gemdos_structures + 5 24 33 timeval; gemdos/structures/timeval.ui; gemdos_structures + 5 24 34 timezone; gemdos/structures/timezone.ui; gemdos_structures + 5 24 35 struct tty; gemdos/structures/tty.ui; gemdos_structures + 5 24 36 winsize; gemdos/structures/winsize.ui; gemdos_structures + 5 24 37 XATTR; gemdos/structures/XATTR.ui; gemdos_structures + 5 24 37 1 XATTR, dev-components; gemdos/structures/XATTR.ui; gemdos_structures + 5 24 37 2 XATTR, possible filetypes; gemdos/structures/XATTR.ui; gemdos_structures + 5 24 37 3 XATTR, Sticky-bit; gemdos/structures/XATTR.ui; gemdos_structures + 5 24 37 4 XATTR, size-components; gemdos/structures/XATTR.ui; gemdos_structures + 5 24 37 5 XATTR, access rights; gemdos/structures/XATTR.ui; gemdos_structures + 5 24 37 6 XATTR, special bits; gemdos/structures/XATTR.ui; gemdos_structures + 5 24 38 xkey; gemdos/structures/xkey.ui; gemdos_structures + 6 Line-A; /home/runner/work/tos.hyp/tos.hyp/tos_hyp.u; linea_main + 6 1 The Line-A emulator; linea/linea.u; linea_about + 6 2 LINEA; linea/linea.u; linea_vars + 6 3 The negative Line-A variables; linea/linea.u; linea_escape + 6 4 BITBLT; linea/linea.u; linea_structures + 6 5 Initialization; linea/init.ui; linea_init + 6 5 1 Bindings for linea_init; linea/init.ui; linea_init + 6 6 Put pixel; linea/putpixel.ui; linea_putpixel + 6 6 1 Bindings for put_pixel; linea/putpixel.ui; linea_putpixel + 6 7 Get pixel; linea/getpixel.ui; linea_getpixel + 6 7 1 Bindings for get_pixel; linea/getpixel.ui; linea_getpixel + 6 8 Arbitrary line; linea/line.ui; linea_line + 6 8 1 Bindings for draw_line; linea/line.ui; linea_line + 6 9 Horizontal line; linea/hline.ui; linea_hline + 6 9 1 Bindings for horizontal_line; linea/hline.ui; linea_hline + 6 10 Filled rectangle; linea/fillrect.ui; linea_fillrect + 6 10 1 Bindings for filled_rect; linea/fillrect.ui; linea_fillrect + 6 11 Filled polygon; linea/fillpoly.ui; linea_fillpoly + 6 11 1 Bindings for filled_polygon; linea/fillpoly.ui; linea_fillpoly + 6 12 Bit block transfer; linea/bitblt.ui; linea_bitblt + 6 12 1 Bindings for bit_blt; linea/bitblt.ui; linea_bitblt + 6 13 Text block transfer; linea/textblt.ui; linea_textblt + 6 13 1 Bindings for text_blt; linea/textblt.ui; linea_textblt + 6 14 Show mouse; linea/shmouse.ui; linea_showmouse + 6 14 1 Bindings for show_mouse; linea/shmouse.ui; linea_showmouse + 6 15 Hide mouse; linea/hdmouse.ui; linea_hidemouse + 6 15 1 Bindings for hide_mouse; linea/hdmouse.ui; linea_hidemouse + 6 16 Transform mouse; linea/trmouse.ui; linea_transform + 6 16 1 Bindings for transform_mouse; linea/trmouse.ui; linea_transform + 6 17 Undraw sprite; linea/udrsprit.ui; linea_undrawsprite + 6 17 1 Bindings for undraw_sprite; linea/udrsprit.ui; linea_undrawsprite + 6 18 Draw sprite; linea/drsprite.ui; linea_drawsprite + 6 18 1 Bindings for draw_sprite; linea/drsprite.ui; linea_drawsprite + 6 19 Copy raster form; linea/cpraster.ui; linea_copyraster + 6 19 1 Bindings for copy_raster; linea/cpraster.ui; linea_copyraster + 6 20 Seedfill; linea/seedfill.ui; linea_seedfill + 6 20 1 Bindings for seed_fill; linea/seedfill.ui; linea_seedfill + 7 VDI; /home/runner/work/tos.hyp/tos.hyp/tos_hyp.u; vdi_main + 7 1 About the VDI; gem/vdi/vdi_en.u; About_the_VDI + 7 2 VDI fundamentals; gem/vdi/vdi_en.u; VDI_fundamentals + 7 2 1 Clipping; gem/vdi/vdi_en.u; VDI_fundamentals + 7 2 2 About the GDOS; gem/vdi/vdi_en.u; VDI_fundamentals + 7 2 3 The make-up of the ASSIGN.SYS file; gem/vdi/assign_sys.ui; VDI_fundamentals + 7 2 4 GDOS drivers; gem/vdi/vdi_en.u; VDI_fundamentals + 7 2 4 1 Screen drivers; gem/vdi/vdi_en.u; VDI_fundamentals + 7 2 4 2 Minimum range of functions for screen drivers; gem/vdi/vdi_en.u; VDI_fundamentals + 7 2 4 3 Bit-image drivers; gem/vdi/vdi_en.u; VDI_fundamentals + 7 2 4 4 Printer drivers; gem/vdi/vdi_en.u; VDI_fundamentals + 7 2 4 5 Minimum range of functions for printer drivers; gem/vdi/vdi_en.u; VDI_fundamentals + 7 2 4 6 Bitmap format for printer drivers; gem/vdi/vdi_en.u; VDI_fundamentals + 7 2 4 7 Fax drivers; gem/vdi/vdi_en.u; VDI_fundamentals + 7 2 4 8 Tablet drivers; gem/vdi/vdi_en.u; VDI_fundamentals + 7 2 4 9 Camera drivers; gem/vdi/vdi_en.u; VDI_fundamentals + 7 2 4 10 Minimum range of functions for camera drivers; gem/vdi/vdi_en.u; VDI_fundamentals + 7 2 4 11 Memory drivers; gem/vdi/vdi_en.u; VDI_fundamentals + 7 2 4 12 Metafile drivers; gem/vdi/vdi_en.u; VDI_fundamentals + 7 2 4 13 Minimum range of functions for metafile drivers; gem/vdi/vdi_en.u; VDI_fundamentals + 7 2 4 14 Plotter drivers; gem/vdi/vdi_en.u; VDI_fundamentals + 7 2 4 15 Minimum range of functions for plotter drivers; gem/vdi/vdi_en.u; VDI_fundamentals + 7 2 5 VDI coordinate systems; gem/vdi/vdi_en.u; VDI_fundamentals + 7 2 6 Metafile format; gem/vdi/metafile.u; VDI_fundamentals + 7 2 6 1 Metafile sub-opcodes; gem/vdi/metafile.u; VDI_fundamentals + 7 2 6 2 Analysis of a metafile; gem/vdi/metafile.u; VDI_fundamentals + 7 2 6 3 Binding of a metafile sub-opcode; gem/vdi/metafile.u; VDI_fundamentals + 7 2 6 4 Sample analysis of a metafile; gem/vdi/metafile.u; VDI_fundamentals + 7 2 6 5 Metafile version; gem/vdi/metafile.u; VDI_fundamentals + 7 2 7 NVDI; gem/vdi/vdi_en.u; VDI_fundamentals + 7 2 7 1 is_EdDI; gem/vdi/vdi_en.u; VDI_fundamentals + 7 2 8 Off-screen bitmaps; gem/vdi/vdi_en.u; VDI_fundamentals + 7 2 9 The OUT file format; gem/vdi/vdi_en.u; VDI_fundamentals + 7 2 10 Raster formats; gem/vdi/vdi_en.u; VDI_fundamentals + 7 2 11 SpeedoGDOS; gem/vdi/vdi_en.u; VDI_fundamentals + 7 2 12 Details about vector fonts; gem/vdi/vdi_en.u; VDI_fundamentals + 7 2 12 1 Monospaced fonts; gem/vdi/vdi_en.u; VDI_fundamentals + 7 2 12 2 Font index and ID; gem/vdi/vdi_en.u; VDI_fundamentals + 7 2 12 3 Size of vector fonts; gem/vdi/vdi_en.u; VDI_fundamentals + 7 2 12 4 Height and width of vector fonts; gem/vdi/vdi_en.u; VDI_fundamentals + 7 2 12 5 Kerning; gem/vdi/vdi_en.u; VDI_fundamentals + 7 2 12 6 Positioning of vector text; gem/vdi/vdi_en.u; VDI_fundamentals + 7 2 12 7 Vector or bitmap font?; gem/vdi/vdi_en.u; VDI_fundamentals + 7 2 13 VDI workstations; gem/vdi/vdi_en.u; VDI_fundamentals + 7 2 14 The XIMG format for pixel images; gem/vdi/vdi_en.u; VDI_fundamentals + 7 3 VDI bindings; gem/vdi/vdi_en.u; vdi_bindings + 7 3 1 VDI-string to C-string; gem/vdi/vdi_en.u; vdi_bindings + 7 3 2 C-string to VDI-string; gem/vdi/vdi_en.u; vdi_bindings + 7 4 Attribute functions; gem/vdi/attribut/attribut.u; vdi_attribute + 7 4 1 Bitmap attributes; gem/vdi/attribut/bitmap/bitmap.u; vdi_attribute + 7 4 2 Fill attributes; gem/vdi/attribut/fill/fill.u; vdi_attribute + 7 4 3 Lines attributes; gem/vdi/attribut/linien/lines.u; vdi_attribute + 7 4 4 Marker attributes; gem/vdi/attribut/marker/marker.u; vdi_attribute + 7 4 5 Text attributes; gem/vdi/attribut/text/text.u; vdi_attribute + 7 4 6 Superior attributes; gem/vdi/attribut/uebergeordnete/superior.u; vdi_attribute + 7 4 6 1 vsr_bg_color; gem/vdi/attribut/bitmap/vsr_bg_color.ui; vdi_attribute + 7 4 6 2 Bindings for vsr_bg_color; gem/vdi/attribut/bitmap/vsr_bg_color.ui; vdi_attribute + 7 4 6 3 vsr_fg_color; gem/vdi/attribut/bitmap/vsr_fg_color.ui; vdi_attribute + 7 4 6 4 Bindings for vsr_fg_color; gem/vdi/attribut/bitmap/vsr_fg_color.ui; vdi_attribute + 7 4 6 5 Graphical overview of fill-type and pattern index; gem/vdi/attribut/fill/filltypes.ui; vdi_attribute + 7 4 6 6 Description of the VDI writing modes; gem/vdi/attribut/fill/filltypes.ui; vdi_attribute + 7 4 6 7 vsf_bg_color; gem/vdi/attribut/fill/vsf_bg_color.ui; vdi_attribute + 7 4 6 8 Bindings for vsf_bg_color; gem/vdi/attribut/fill/vsf_bg_color.ui; vdi_attribute + 7 4 6 9 vsf_color; gem/vdi/attribut/fill/vsf_color.ui; vdi_attribute + 7 4 6 10 Bindings for vsf_color; gem/vdi/attribut/fill/vsf_color.ui; vdi_attribute + 7 4 6 11 vsf_fg_color; gem/vdi/attribut/fill/vsf_fg_color.ui; vdi_attribute + 7 4 6 12 Bindings for vsf_fg_color; gem/vdi/attribut/fill/vsf_fg_color.ui; vdi_attribute + 7 4 6 13 vsf_interior; gem/vdi/attribut/fill/vsf_interior.ui; vdi_attribute + 7 4 6 14 Bindings for vsf_interior; gem/vdi/attribut/fill/vsf_interior.ui; vdi_attribute + 7 4 6 15 vsf_perimeter; gem/vdi/attribut/fill/vsf_perimeter.ui; vdi_attribute + 7 4 6 16 Bindings for vsf_perimeter; gem/vdi/attribut/fill/vsf_perimeter.ui; vdi_attribute + 7 4 6 17 vsf_style; gem/vdi/attribut/fill/vsf_style.ui; vdi_attribute + 7 4 6 18 Bindings for vsf_style; gem/vdi/attribut/fill/vsf_style.ui; vdi_attribute + 7 4 6 19 vsf_udpat; gem/vdi/attribut/fill/vsf_udpat.ui; vdi_attribute + 7 4 6 20 Bindings for vsf_udpat; gem/vdi/attribut/fill/vsf_udpat.ui; vdi_attribute + 7 4 6 21 vsf_xperimeter; gem/vdi/attribut/fill/vsf_xperimeter.ui; vdi_attribute + 7 4 6 22 Bindings for vsf_xperimeter; gem/vdi/attribut/fill/vsf_xperimeter.ui; vdi_attribute + 7 4 6 23 vsl_bg_color; gem/vdi/attribut/linien/vsl_bg_color.ui; vdi_attribute + 7 4 6 24 Bindings for vsl_bg_color; gem/vdi/attribut/linien/vsl_bg_color.ui; vdi_attribute + 7 4 6 25 vsl_color; gem/vdi/attribut/linien/vsl_color.ui; vdi_attribute + 7 4 6 26 Bindings for vsl_color; gem/vdi/attribut/linien/vsl_color.ui; vdi_attribute + 7 4 6 27 vsl_ends; gem/vdi/attribut/linien/vsl_ends.ui; vdi_attribute + 7 4 6 28 Bindings for vsl_ends; gem/vdi/attribut/linien/vsl_ends.ui; vdi_attribute + 7 4 6 29 vsl_fg_color; gem/vdi/attribut/linien/vsl_fg_color.ui; vdi_attribute + 7 4 6 30 Bindings for vsl_fg_color; gem/vdi/attribut/linien/vsl_fg_color.ui; vdi_attribute + 7 4 6 31 vsl_type; gem/vdi/attribut/linien/vsl_type.ui; vdi_attribute + 7 4 6 32 Bindings for vsl_type; gem/vdi/attribut/linien/vsl_type.ui; vdi_attribute + 7 4 6 33 vsl_udsty; gem/vdi/attribut/linien/vsl_udsty.ui; vdi_attribute + 7 4 6 34 Bindings for vsl_udsty; gem/vdi/attribut/linien/vsl_udsty.ui; vdi_attribute + 7 4 6 35 vsl_width; gem/vdi/attribut/linien/vsl_width.ui; vdi_attribute + 7 4 6 36 Bindings for vsl_width; gem/vdi/attribut/linien/vsl_width.ui; vdi_attribute + 7 4 6 37 v_bez_qual; gem/vdi/attribut/linien/v_bez_qual.ui; vdi_attribute + 7 4 6 38 Bindings for v_bez_qual; gem/vdi/attribut/linien/v_bez_qual.ui; vdi_attribute + 7 4 6 39 vsm_bg_color; gem/vdi/attribut/marker/vsm_bg_color.ui; vdi_attribute + 7 4 6 40 Bindings for vsm_bg_color; gem/vdi/attribut/marker/vsm_bg_color.ui; vdi_attribute + 7 4 6 41 vsm_color; gem/vdi/attribut/marker/vsm_color.ui; vdi_attribute + 7 4 6 42 Bindings for vsm_color; gem/vdi/attribut/marker/vsm_color.ui; vdi_attribute + 7 4 6 43 vsm_fg_color; gem/vdi/attribut/marker/vsm_fg_color.ui; vdi_attribute + 7 4 6 44 Bindings for vsm_fg_color; gem/vdi/attribut/marker/vsm_fg_color.ui; vdi_attribute + 7 4 6 45 vsm_height; gem/vdi/attribut/marker/vsm_height.ui; vdi_attribute + 7 4 6 46 Bindings for vsm_height; gem/vdi/attribut/marker/vsm_height.ui; vdi_attribute + 7 4 6 47 vsm_type; gem/vdi/attribut/marker/vsm_type.ui; vdi_attribute + 7 4 6 48 Bindings for vsm_type; gem/vdi/attribut/marker/vsm_type.ui; vdi_attribute + 7 4 6 49 vst_alignment; gem/vdi/attribut/text/vst_alignment.ui; vdi_attribute + 7 4 6 50 Bindings for vst_alignment; gem/vdi/attribut/text/vst_alignment.ui; vdi_attribute + 7 4 6 51 vst_arbpt; gem/vdi/attribut/text/vst_arbpt.ui; vdi_attribute + 7 4 6 52 Bindings for vst_arbpt; gem/vdi/attribut/text/vst_arbpt.ui; vdi_attribute + 7 4 6 53 vst_arbpt32; gem/vdi/attribut/text/vst_arbpt32.ui; vdi_attribute + 7 4 6 54 Bindings for vst_arbpt32; gem/vdi/attribut/text/vst_arbpt32.ui; vdi_attribute + 7 4 6 55 vst_bg_color; gem/vdi/attribut/text/vst_bg_color.ui; vdi_attribute + 7 4 6 56 Bindings for vst_bg_color; gem/vdi/attribut/text/vst_bg_color.ui; vdi_attribute + 7 4 6 57 vst_charmap; gem/vdi/attribut/text/vst_charmap.ui; vdi_attribute + 7 4 6 58 Bindings for vst_charmap; gem/vdi/attribut/text/vst_charmap.ui; vdi_attribute + 7 4 6 59 vst_color; gem/vdi/attribut/text/vst_color.ui; vdi_attribute + 7 4 6 60 Bindings for vst_color; gem/vdi/attribut/text/vst_color.ui; vdi_attribute + 7 4 6 61 vst_effects; gem/vdi/attribut/text/vst_effects.ui; vdi_attribute + 7 4 6 62 Bindings for vst_effects; gem/vdi/attribut/text/vst_effects.ui; vdi_attribute + 7 4 6 63 vst_error; gem/vdi/attribut/text/vst_error.ui; vdi_attribute + 7 4 6 64 Bindings for vst_error; gem/vdi/attribut/text/vst_error.ui; vdi_attribute + 7 4 6 65 vst_fg_color; gem/vdi/attribut/text/vst_fg_color.ui; vdi_attribute + 7 4 6 66 Bindings for vst_fg_color; gem/vdi/attribut/text/vst_fg_color.ui; vdi_attribute + 7 4 6 67 vst_font; gem/vdi/attribut/text/vst_font.ui; vdi_attribute + 7 4 6 68 Bindings for vst_font; gem/vdi/attribut/text/vst_font.ui; vdi_attribute + 7 4 6 69 vst_height; gem/vdi/attribut/text/vst_height.ui; vdi_attribute + 7 4 6 70 Bindings for vst_height; gem/vdi/attribut/text/vst_height.ui; vdi_attribute + 7 4 6 71 vst_kern; gem/vdi/attribut/text/vst_kern.ui; vdi_attribute + 7 4 6 72 Bindings for vst_kern; gem/vdi/attribut/text/vst_kern.ui; vdi_attribute + 7 4 6 73 vst_map_mode; gem/vdi/attribut/text/vst_map_mode.ui; vdi_attribute + 7 4 6 74 Bindings for vst_map_mode; gem/vdi/attribut/text/vst_map_mode.ui; vdi_attribute + 7 4 6 75 vst_name; gem/vdi/attribut/text/vst_name.ui; vdi_attribute + 7 4 6 76 Bindings for vst_name; gem/vdi/attribut/text/vst_name.ui; vdi_attribute + 7 4 6 77 vst_point; gem/vdi/attribut/text/vst_point.ui; vdi_attribute + 7 4 6 78 Bindings for vst_point; gem/vdi/attribut/text/vst_point.ui; vdi_attribute + 7 4 6 79 vst_rotation; gem/vdi/attribut/text/vst_rotation.ui; vdi_attribute + 7 4 6 80 Bindings for vst_rotation; gem/vdi/attribut/text/vst_rotation.ui; vdi_attribute + 7 4 6 81 vst_scratch; gem/vdi/attribut/text/vst_scratch.ui; vdi_attribute + 7 4 6 82 Bindings for vst_scratch; gem/vdi/attribut/text/vst_scratch.ui; vdi_attribute + 7 4 6 83 vst_setsize; gem/vdi/attribut/text/vst_setsize.ui; vdi_attribute + 7 4 6 84 Bindings for vst_setsize; gem/vdi/attribut/text/vst_setsize.ui; vdi_attribute + 7 4 6 85 vst_setsize32; gem/vdi/attribut/text/vst_setsize32.ui; vdi_attribute + 7 4 6 86 Bindings for vst_setsize32; gem/vdi/attribut/text/vst_setsize32.ui; vdi_attribute + 7 4 6 87 vst_skew; gem/vdi/attribut/text/vst_skew.ui; vdi_attribute + 7 4 6 88 Bindings for vst_skew; gem/vdi/attribut/text/vst_skew.ui; vdi_attribute + 7 4 6 89 vst_track_offset; gem/vdi/attribut/text/vst_track_offset.ui; vdi_attribute + 7 4 6 90 Bindings for vst_track_offset; gem/vdi/attribut/text/vst_track_offset.ui; vdi_attribute + 7 4 6 91 vst_width; gem/vdi/attribut/text/vst_width.ui; vdi_attribute + 7 4 6 92 Bindings for vst_width; gem/vdi/attribut/text/vst_width.ui; vdi_attribute + 7 4 6 93 v_topbot; gem/vdi/attribut/text/v_topbot.ui; vdi_attribute + 7 4 6 94 Bindings for v_topbot; gem/vdi/attribut/text/v_topbot.ui; vdi_attribute + 7 4 6 95 vswr_mode; gem/vdi/attribut/uebergeordnete/vswr_mode.ui; vdi_attribute + 7 4 6 96 Bindings for vswr_mode; gem/vdi/attribut/uebergeordnete/vswr_mode.ui; vdi_attribute + 7 4 6 97 vs_bkcolor; gem/vdi/attribut/uebergeordnete/vs_bkcolor.ui; vdi_attribute + 7 4 6 98 Bindings for vs_bkcolor; gem/vdi/attribut/uebergeordnete/vs_bkcolor.ui; vdi_attribute + 7 4 6 99 vs_color; gem/vdi/attribut/uebergeordnete/vs_color.ui; vdi_attribute + 7 4 6 100 Bindings for vs_color; gem/vdi/attribut/uebergeordnete/vs_color.ui; vdi_attribute + 7 4 6 101 vs_color2; gem/vdi/attribut/uebergeordnete/vs_color2.ui; vdi_attribute + 7 4 6 102 Bindings for vs_color2; gem/vdi/attribut/uebergeordnete/vs_color2.ui; vdi_attribute + 7 4 6 103 vs_grayoverride; gem/vdi/attribut/uebergeordnete/vs_grayoverride.ui; vdi_attribute + 7 4 6 104 Bindings for vs_grayoverride; gem/vdi/attribut/uebergeordnete/vs_grayoverride.ui; vdi_attribute + 7 4 6 105 v_ps_halftone; gem/vdi/attribut/uebergeordnete/v_ps_halftone.ui; vdi_attribute + 7 4 6 106 Bindings for v_ps_halftone; gem/vdi/attribut/uebergeordnete/v_ps_halftone.ui; vdi_attribute + 7 4 6 107 v_setrgb; gem/vdi/attribut/uebergeordnete/v_setrgb.ui; vdi_attribute + 7 4 6 108 Bindings for v_setrgb; gem/vdi/attribut/uebergeordnete/v_setrgb.ui; vdi_attribute + 7 4 6 109 v_setrgbi; gem/vdi/attribut/uebergeordnete/v_setrgbi.ui; vdi_attribute + 7 4 6 110 Bindings for v_setrgbi; gem/vdi/attribut/uebergeordnete/v_setrgbi.ui; vdi_attribute + 7 5 Output functions; gem/vdi/output/output.u; vdi_output + 7 5 1 vr_recfl; gem/vdi/output/vr_recfl.ui; vdi_output + 7 5 2 Bindings for vr_recfl; gem/vdi/output/vr_recfl.ui; vdi_output + 7 5 3 v_arc; gem/vdi/output/v_arc.ui; vdi_output + 7 5 4 Bindings for v_arc; gem/vdi/output/v_arc.ui; vdi_output + 7 5 5 v_bar; gem/vdi/output/v_bar.ui; vdi_output + 7 5 6 Bindings for v_bar; gem/vdi/output/v_bar.ui; vdi_output + 7 5 7 v_bez; gem/vdi/output/v_bez.ui; vdi_output + 7 5 8 Bindings for v_bez; gem/vdi/output/v_bez.ui; vdi_output + 7 5 9 v_bez_fill; gem/vdi/output/v_bez_fill.ui; vdi_output + 7 5 10 Bindings for v_bez_fill; gem/vdi/output/v_bez_fill.ui; vdi_output + 7 5 11 v_cellarray; gem/vdi/output/v_cellarray.ui; vdi_output + 7 5 12 Bindings for v_cellarray; gem/vdi/output/v_cellarray.ui; vdi_output + 7 5 13 v_circle; gem/vdi/output/v_circle.ui; vdi_output + 7 5 14 Bindings for v_circle; gem/vdi/output/v_circle.ui; vdi_output + 7 5 15 v_contourfill; gem/vdi/output/v_contourfill.ui; vdi_output + 7 5 16 Bindings for v_contourfill; gem/vdi/output/v_contourfill.ui; vdi_output + 7 5 17 v_ellarc; gem/vdi/output/v_ellarc.ui; vdi_output + 7 5 18 Bindings for v_ellarc; gem/vdi/output/v_ellarc.ui; vdi_output + 7 5 19 v_ellipse; gem/vdi/output/v_ellipse.ui; vdi_output + 7 5 20 Bindings for v_ellipse; gem/vdi/output/v_ellipse.ui; vdi_output + 7 5 21 v_ellpie; gem/vdi/output/v_ellpie.ui; vdi_output + 7 5 22 Bindings for v_ellpie; gem/vdi/output/v_ellpie.ui; vdi_output + 7 5 23 v_etext; gem/vdi/output/v_etext.ui; vdi_output + 7 5 24 Bindings for v_etext; gem/vdi/output/v_etext.ui; vdi_output + 7 5 25 v_fillarea; gem/vdi/output/v_fillarea.ui; vdi_output + 7 5 26 Bindings for v_fillarea; gem/vdi/output/v_fillarea.ui; vdi_output + 7 5 27 v_ftext; gem/vdi/output/v_ftext.ui; vdi_output + 7 5 28 Bindings for v_ftext; gem/vdi/output/v_ftext.ui; vdi_output + 7 5 29 v_ftext_offset; gem/vdi/output/v_ftext_offset.ui; vdi_output + 7 5 30 Bindings for v_ftext_offset; gem/vdi/output/v_ftext_offset.ui; vdi_output + 7 5 31 v_gtext; gem/vdi/output/v_gtext.ui; vdi_output + 7 5 32 Bindings for v_gtext; gem/vdi/output/v_gtext.ui; vdi_output + 7 5 33 v_justified; gem/vdi/output/v_justified.ui; vdi_output + 7 5 34 Bindings for v_justified; gem/vdi/output/v_justified.ui; vdi_output + 7 5 35 v_pieslice; gem/vdi/output/v_pieslice.ui; vdi_output + 7 5 36 Bindings for v_pieslice; gem/vdi/output/v_pieslice.ui; vdi_output + 7 5 37 v_pline; gem/vdi/output/v_pline.ui; vdi_output + 7 5 38 Bindings for v_pline; gem/vdi/output/v_pline.ui; vdi_output + 7 5 39 v_pmarker; gem/vdi/output/v_pmarker.ui; vdi_output + 7 5 40 Bindings for v_pmarker; gem/vdi/output/v_pmarker.ui; vdi_output + 7 5 41 v_rbox; gem/vdi/output/v_rbox.ui; vdi_output + 7 5 42 Bindings for v_rbox; gem/vdi/output/v_rbox.ui; vdi_output + 7 5 43 v_rfbox; gem/vdi/output/v_rfbox.ui; vdi_output + 7 5 44 Bindings for v_rfbox; gem/vdi/output/v_rfbox.ui; vdi_output + 7 6 Inquire functions; gem/vdi/inquire/inquire.u; vdi_inquire + 7 6 1 vqf_attributes; gem/vdi/inquire/vqf_attributes.ui; vdi_inquire + 7 6 2 Bindings for vqf_attributes; gem/vdi/inquire/vqf_attributes.ui; vdi_inquire + 7 6 3 vqf_bg_color; gem/vdi/inquire/vqf_bg_color.ui; vdi_inquire + 7 6 4 Bindings for vqf_bg_color; gem/vdi/inquire/vqf_bg_color.ui; vdi_inquire + 7 6 5 vqf_fg_color; gem/vdi/inquire/vqf_fg_color.ui; vdi_inquire + 7 6 6 Bindings for vqf_fg_color; gem/vdi/inquire/vqf_fg_color.ui; vdi_inquire + 7 6 7 vqin_mode; gem/vdi/inquire/vqin_mode.ui; vdi_inquire + 7 6 8 Bindings for vqin_mode; gem/vdi/inquire/vqin_mode.ui; vdi_inquire + 7 6 9 vql_attributes; gem/vdi/inquire/vql_attributes.ui; vdi_inquire + 7 6 10 Bindings for vql_attributes; gem/vdi/inquire/vql_attributes.ui; vdi_inquire + 7 6 11 vql_bg_color; gem/vdi/inquire/vql_bg_color.ui; vdi_inquire + 7 6 12 Bindings for vql_bg_color; gem/vdi/inquire/vql_bg_color.ui; vdi_inquire + 7 6 13 vql_fg_color; gem/vdi/inquire/vql_fg_color.ui; vdi_inquire + 7 6 14 Bindings for vql_fg_color; gem/vdi/inquire/vql_fg_color.ui; vdi_inquire + 7 6 15 vqm_attributes; gem/vdi/inquire/vqm_attributes.ui; vdi_inquire + 7 6 16 Bindings for vqm_attributes; gem/vdi/inquire/vqm_attributes.ui; vdi_inquire + 7 6 17 vqm_bg_color; gem/vdi/inquire/vqm_bg_color.ui; vdi_inquire + 7 6 18 Bindings for vqm_bg_color; gem/vdi/inquire/vqm_bg_color.ui; vdi_inquire + 7 6 19 vqm_fg_color; gem/vdi/inquire/vqm_fg_color.ui; vdi_inquire + 7 6 20 Bindings for vqm_fg_color; gem/vdi/inquire/vqm_fg_color.ui; vdi_inquire + 7 6 21 vqr_bg_color; gem/vdi/inquire/vqr_bg_color.ui; vdi_inquire + 7 6 22 Bindings for vqr_bg_color; gem/vdi/inquire/vqr_bg_color.ui; vdi_inquire + 7 6 23 vqr_fg_color; gem/vdi/inquire/vqr_fg_color.ui; vdi_inquire + 7 6 24 Bindings for vqr_fg_color; gem/vdi/inquire/vqr_fg_color.ui; vdi_inquire + 7 6 25 vqt_advance; gem/vdi/inquire/vqt_advance.ui; vdi_inquire + 7 6 26 Bindings for vqt_advance; gem/vdi/inquire/vqt_advance.ui; vdi_inquire + 7 6 27 vqt_advance32; gem/vdi/inquire/vqt_advance32.ui; vdi_inquire + 7 6 28 Bindings for vqt_advance32; gem/vdi/inquire/vqt_advance32.ui; vdi_inquire + 7 6 29 vqt_attributes; gem/vdi/inquire/vqt_attributes.ui; vdi_inquire + 7 6 30 Bindings for vqt_attributes; gem/vdi/inquire/vqt_attributes.ui; vdi_inquire + 7 6 31 vqt_bg_color; gem/vdi/inquire/vqt_bg_color.ui; vdi_inquire + 7 6 32 Bindings for vqt_bg_color; gem/vdi/inquire/vqt_bg_color.ui; vdi_inquire + 7 6 33 vqt_cachesize; gem/vdi/inquire/vqt_cachesize.ui; vdi_inquire + 7 6 34 Bindings for vqt_cachesize; gem/vdi/inquire/vqt_cachesize.ui; vdi_inquire + 7 6 35 vqt_char_index; gem/vdi/inquire/vqt_char_index.ui; vdi_inquire + 7 6 36 Bindings for vqt_char_index; gem/vdi/inquire/vqt_char_index.ui; vdi_inquire + 7 6 37 vqt_devinfo; gem/vdi/inquire/vqt_devinfo.ui; vdi_inquire + 7 6 38 Bindings for vqt_devinfo; gem/vdi/inquire/vqt_devinfo.ui; vdi_inquire + 7 6 39 vqt_extent; gem/vdi/inquire/vqt_extent.ui; vdi_inquire + 7 6 40 Bindings for vqt_extent; gem/vdi/inquire/vqt_extent.ui; vdi_inquire + 7 6 41 vqt_ext_name; gem/vdi/inquire/vqt_ext_name.ui; vdi_inquire + 7 6 42 Bindings for vqt_ext_name; gem/vdi/inquire/vqt_ext_name.ui; vdi_inquire + 7 6 43 vqt_fg_color; gem/vdi/inquire/vqt_fg_color.ui; vdi_inquire + 7 6 44 Bindings for vqt_fg_color; gem/vdi/inquire/vqt_fg_color.ui; vdi_inquire + 7 6 45 vqt_fontheader; gem/vdi/inquire/vqt_fontheader.ui; vdi_inquire + 7 6 46 Bindings for vqt_fontheader; gem/vdi/inquire/vqt_fontheader.ui; vdi_inquire + 7 6 47 vqt_fontinfo; gem/vdi/inquire/vqt_fontinfo.ui; vdi_inquire + 7 6 48 Bindings for vqt_fontinfo; gem/vdi/inquire/vqt_fontinfo.ui; vdi_inquire + 7 6 49 vqt_f_extent; gem/vdi/inquire/vqt_f_extent.ui; vdi_inquire + 7 6 50 Bindings for vqt_f_extent; gem/vdi/inquire/vqt_f_extent.ui; vdi_inquire + 7 6 51 vqt_get_table; gem/vdi/inquire/vqt_get_table.ui; vdi_inquire + 7 6 52 Bindings for vqt_get_table; gem/vdi/inquire/vqt_get_table.ui; vdi_inquire + 7 6 53 vqt_justified; gem/vdi/inquire/vqt_justified.ui; vdi_inquire + 7 6 54 Bindings for vqt_justified; gem/vdi/inquire/vqt_justified.ui; vdi_inquire + 7 6 55 vqt_name; gem/vdi/inquire/vqt_name.ui; vdi_inquire + 7 6 56 Bindings for vqt_name; gem/vdi/inquire/vqt_name.ui; vdi_inquire + 7 6 57 vqt_name_and_id; gem/vdi/inquire/vqt_name_and_id.ui; vdi_inquire + 7 6 58 Bindings for vqt_name_and_id; gem/vdi/inquire/vqt_name_and_id.ui; vdi_inquire + 7 6 59 vqt_pairkern; gem/vdi/inquire/vqt_pairkern.ui; vdi_inquire + 7 6 60 Bindings for vqt_pairkern; gem/vdi/inquire/vqt_pairkern.ui; vdi_inquire + 7 6 61 vqt_real_extent; gem/vdi/inquire/vqt_real_extent.ui; vdi_inquire + 7 6 62 Bindings for vqt_real_extent; gem/vdi/inquire/vqt_real_extent.ui; vdi_inquire + 7 6 63 vqt_trackkern; gem/vdi/inquire/vqt_trackkern.ui; vdi_inquire + 7 6 64 Bindings for vqt_trackkern; gem/vdi/inquire/vqt_trackkern.ui; vdi_inquire + 7 6 65 vqt_width; gem/vdi/inquire/vqt_width.ui; vdi_inquire + 7 6 66 Bindings for vqt_width; gem/vdi/inquire/vqt_width.ui; vdi_inquire + 7 6 67 vqt_xfntinfo; gem/vdi/inquire/vqt_xfntinfo.ui; vdi_inquire + 7 6 68 Bindings for vqt_xfntinfo; gem/vdi/inquire/vqt_xfntinfo.ui; vdi_inquire + 7 6 69 vq_cellarray; gem/vdi/inquire/vq_cellarray.ui; vdi_inquire + 7 6 70 Bindings for vq_cellarray; gem/vdi/inquire/vq_cellarray.ui; vdi_inquire + 7 6 71 vq_color; gem/vdi/inquire/vq_color.ui; vdi_inquire + 7 6 72 Bindings for vq_color; gem/vdi/inquire/vq_color.ui; vdi_inquire + 7 6 73 vq_devinfo; gem/vdi/inquire/vq_devinfo.ui; vdi_inquire + 7 6 74 Bindings for vq_devinfo; gem/vdi/inquire/vq_devinfo.ui; vdi_inquire + 7 6 75 vq_extnd; gem/vdi/inquire/vq_extnd.ui; vdi_inquire + 7 6 76 Bindings for vq_extnd; gem/vdi/inquire/vq_extnd.ui; vdi_inquire + 7 6 77 vq_ext_devinfo; gem/vdi/inquire/vq_ext_devinfo.ui; vdi_inquire + 7 6 78 Bindings for vq_ext_devinfo; gem/vdi/inquire/vq_ext_devinfo.ui; vdi_inquire + 7 6 79 vq_ptsinsz; gem/vdi/inquire/vq_ptsinsz.ui; vdi_inquire + 7 6 80 Bindings for vq_ptsinsz; gem/vdi/inquire/vq_ptsinsz.ui; vdi_inquire + 7 6 81 vq_scrninfo; gem/vdi/inquire/vq_scrninfo.ui; vdi_inquire + 7 6 82 Bindings for vq_scrninfo; gem/vdi/inquire/vq_scrninfo.ui; vdi_inquire + 7 6 83 Examples for vq_scrninfo; gem/vdi/inquire/vq_scrninfo.ui; vdi_inquire + 7 6 84 v_create_driver_info; gem/vdi/inquire/v_create_driver_info.ui; vdi_inquire + 7 6 85 Bindings for v_create_driver_info; gem/vdi/inquire/v_create_driver_info.ui; vdi_inquire + 7 6 86 v_delete_driver_info; gem/vdi/inquire/v_delete_driver_info.ui; vdi_inquire + 7 6 87 Bindings for v_delete_driver_info; gem/vdi/inquire/v_delete_driver_info.ui; vdi_inquire + 7 6 88 v_getbitmap_info; gem/vdi/inquire/v_getbitmap_info.ui; vdi_inquire + 7 6 89 Bindings for v_getbitmap_info; gem/vdi/inquire/v_getbitmap_info.ui; vdi_inquire + 7 6 90 v_get_driver_info; gem/vdi/inquire/v_get_driver_info.ui; vdi_inquire + 7 6 91 Bindings for v_get_driver_info; gem/vdi/inquire/v_get_driver_info.ui; vdi_inquire + 7 6 92 v_read_default_settings; gem/vdi/inquire/v_read_default_settings.ui; vdi_inquire + 7 6 93 Bindings for v_read_default_settings; gem/vdi/inquire/v_read_default_settings.ui; vdi_inquire + 7 6 94 v_write_default_settings; gem/vdi/inquire/v_write_default_settings.ui; vdi_inquire + 7 6 95 Bindings for v_write_default_settings; gem/vdi/inquire/v_write_default_settings.ui; vdi_inquire + 7 6 96 Make-up of the font-header; gem/vdi/inquire/fontheader.ui; vdi_inquire + 7 6 97 disable_nvdi_errors; gem/vdi/inquire/disable_nvdi.ui; vdi_inquire + 7 6 98 enable_nvdi_errors; gem/vdi/inquire/disable_nvdi.ui; vdi_inquire + 7 7 Input functions; gem/vdi/input/input.u; vdi_input + 7 7 1 vex_butv; gem/vdi/input/vex_butv.ui; vdi_input + 7 7 2 Bindings for vex_butv; gem/vdi/input/vex_butv.ui; vdi_input + 7 7 3 vex_curv; gem/vdi/input/vex_curv.ui; vdi_input + 7 7 4 Bindings for vex_curv; gem/vdi/input/vex_curv.ui; vdi_input + 7 7 5 vex_motv; gem/vdi/input/vex_motv.ui; vdi_input + 7 7 6 Bindings for vex_motv; gem/vdi/input/vex_motv.ui; vdi_input + 7 7 7 vex_timv; gem/vdi/input/vex_timv.ui; vdi_input + 7 7 8 Bindings for vex_timv; gem/vdi/input/vex_timv.ui; vdi_input + 7 7 9 vex_wheelv; gem/vdi/input/vex_wheelv.ui; vdi_input + 7 7 10 Bindings for vex_wheelv; gem/vdi/input/vex_wheelv.ui; vdi_input + 7 7 11 vq_key_s; gem/vdi/input/vq_key_s.ui; vdi_input + 7 7 12 Bindings for vq_key_s; gem/vdi/input/vq_key_s.ui; vdi_input + 7 7 13 vq_mouse; gem/vdi/input/vq_mouse.ui; vdi_input + 7 7 14 Bindings for vq_mouse; gem/vdi/input/vq_mouse.ui; vdi_input + 7 7 15 vrq_choice; gem/vdi/input/vrq_choice.ui; vdi_input + 7 7 16 Bindings for vrq_choice; gem/vdi/input/vrq_choice.ui; vdi_input + 7 7 17 vrq_locator; gem/vdi/input/vrq_locator.ui; vdi_input + 7 7 18 Bindings for vrq_locator; gem/vdi/input/vrq_locator.ui; vdi_input + 7 7 19 vrq_string; gem/vdi/input/vrq_string.ui; vdi_input + 7 7 20 Bindings for vrq_string; gem/vdi/input/vrq_string.ui; vdi_input + 7 7 21 vrq_valuator; gem/vdi/input/vrq_valuator.ui; vdi_input + 7 7 22 Bindings for vrq_valuator; gem/vdi/input/vrq_valuator.ui; vdi_input + 7 7 23 vsc_form; gem/vdi/input/vsc_form.ui; vdi_input + 7 7 24 Bindings for vsc_form; gem/vdi/input/vsc_form.ui; vdi_input + 7 7 25 vsin_mode; gem/vdi/input/vsin_mode.ui; vdi_input + 7 7 26 Bindings for vsin_mode; gem/vdi/input/vsin_mode.ui; vdi_input + 7 7 27 vsm_choice; gem/vdi/input/vsm_choice.ui; vdi_input + 7 7 28 Bindings for vsm_choice; gem/vdi/input/vsm_choice.ui; vdi_input + 7 7 29 vsm_locator; gem/vdi/input/vsm_locator.ui; vdi_input + 7 7 30 Bindings for vsm_locator; gem/vdi/input/vsm_locator.ui; vdi_input + 7 7 31 vsm_string; gem/vdi/input/vsm_string.ui; vdi_input + 7 7 32 Bindings for vsm_string; gem/vdi/input/vsm_string.ui; vdi_input + 7 7 33 vsm_valuator; gem/vdi/input/vsm_valuator.ui; vdi_input + 7 7 34 Bindings for vsm_valuator; gem/vdi/input/vsm_valuator.ui; vdi_input + 7 7 35 v_hide_c; gem/vdi/input/v_hide_c.ui; vdi_input + 7 7 36 Bindings for v_hide_c; gem/vdi/input/v_hide_c.ui; vdi_input + 7 7 37 v_show_c; gem/vdi/input/v_show_c.ui; vdi_input + 7 7 38 Bindings for v_show_c; gem/vdi/input/v_show_c.ui; vdi_input + 7 8 Escape functions; gem/vdi/escape/escape.u; vdi_escape + 7 8 1 Special graphic functions; gem/vdi/escape/graphic/graphic.u; vdi_escape + 7 8 1 1 vq_bit_image; gem/vdi/escape/graphic/vq_bit_image.ui; vdi_escape + 7 8 1 2 Bindings for vq_bit_image; gem/vdi/escape/graphic/vq_bit_image.ui; vdi_escape + 7 8 1 3 vq_calibrate; gem/vdi/escape/graphic/vq_calibrate.ui; vdi_escape + 7 8 1 4 Bindings for vq_calibrate; gem/vdi/escape/graphic/vq_calibrate.ui; vdi_escape + 7 8 1 5 vq_driver_info; gem/vdi/escape/graphic/vq_driver_info.ui; vdi_escape + 7 8 1 6 Bindings for vq_driver_info; gem/vdi/escape/graphic/vq_driver_info.ui; vdi_escape + 7 8 1 7 vq_driver_name; gem/vdi/escape/graphic/vq_driver_name.ui; vdi_escape + 7 8 1 8 Bindings for vq_driver_name; gem/vdi/escape/graphic/vq_driver_name.ui; vdi_escape + 7 8 1 9 vq_image_type; gem/vdi/escape/graphic/vq_image_type.ui; vdi_escape + 7 8 1 10 Bindings for vq_image_type; gem/vdi/escape/graphic/vq_image_type.ui; vdi_escape + 7 8 1 11 vq_margins; gem/vdi/escape/graphic/vq_margins.ui; vdi_escape + 7 8 1 12 Bindings for vq_margins; gem/vdi/escape/graphic/vq_margins.ui; vdi_escape + 7 8 1 13 vq_page_name; gem/vdi/escape/graphic/vq_page_name.ui; vdi_escape + 7 8 1 14 Bindings for vq_page_name; gem/vdi/escape/graphic/vq_page_name.ui; vdi_escape + 7 8 1 15 vq_prn_scaling; gem/vdi/escape/graphic/vq_prn_scaling.ui; vdi_escape + 7 8 1 16 Bindings for vq_prn_scaling; gem/vdi/escape/graphic/vq_prn_scaling.ui; vdi_escape + 7 8 1 17 vq_scan; gem/vdi/escape/graphic/vq_scan.ui; vdi_escape + 7 8 1 18 Bindings for vq_scan; gem/vdi/escape/graphic/vq_scan.ui; vdi_escape + 7 8 1 19 vq_tabstatus; gem/vdi/escape/graphic/vq_tabstatus.ui; vdi_escape + 7 8 1 20 Bindings for vq_tabstatus; gem/vdi/escape/graphic/vq_tabstatus.ui; vdi_escape + 7 8 1 21 vq_tray_names; gem/vdi/escape/graphic/vq_tray_names.ui; vdi_escape + 7 8 1 22 Bindings for vq_tray_names; gem/vdi/escape/graphic/vq_tray_names.ui; vdi_escape + 7 8 1 23 vs_calibrate; gem/vdi/escape/graphic/vs_calibrate.ui; vdi_escape + 7 8 1 24 Bindings for vs_calibrate; gem/vdi/escape/graphic/vs_calibrate.ui; vdi_escape + 7 8 1 25 vs_crop; gem/vdi/escape/graphic/vs_crop.ui; vdi_escape + 7 8 1 26 Bindings for vs_crop; gem/vdi/escape/graphic/vs_crop.ui; vdi_escape + 7 8 1 27 vs_document_info; gem/vdi/escape/graphic/vs_document_info.ui; vdi_escape + 7 8 1 28 Bindings for vs_document_info; gem/vdi/escape/graphic/vs_document_info.ui; vdi_escape + 7 8 1 29 vs_load_disp_list; gem/vdi/escape/graphic/vs_load_disp_list.ui; vdi_escape + 7 8 1 30 Bindings for vs_load_disp_list; gem/vdi/escape/graphic/vs_load_disp_list.ui; vdi_escape + 7 8 1 31 vs_page_info; gem/vdi/escape/graphic/vs_page_info.ui; vdi_escape + 7 8 1 32 Bindings for vs_page_info; gem/vdi/escape/graphic/vs_page_info.ui; vdi_escape + 7 8 1 33 vs_palette; gem/vdi/escape/graphic/vs_palette.ui; vdi_escape + 7 8 1 34 Bindings for vs_palette; gem/vdi/escape/graphic/vs_palette.ui; vdi_escape + 7 8 1 35 vs_save_disp_list; gem/vdi/escape/graphic/vs_save_disp_list.ui; vdi_escape + 7 8 1 36 Bindings for vs_save_disp_list; gem/vdi/escape/graphic/vs_save_disp_list.ui; vdi_escape + 7 8 1 37 v_bit_image; gem/vdi/escape/graphic/v_bit_image.ui; vdi_escape + 7 8 1 38 Bindings for v_bit_image; gem/vdi/escape/graphic/v_bit_image.ui; vdi_escape + 7 8 1 39 v_clear_disp_list; gem/vdi/escape/graphic/v_clear_disp_list.ui; vdi_escape + 7 8 1 40 Bindings for v_clear_disp_list; gem/vdi/escape/graphic/v_clear_disp_list.ui; vdi_escape + 7 8 1 41 v_copies; gem/vdi/escape/graphic/v_copies.ui; vdi_escape + 7 8 1 42 Bindings for v_copies; gem/vdi/escape/graphic/v_copies.ui; vdi_escape + 7 8 1 43 v_dspcur; gem/vdi/escape/graphic/v_dspcur.ui; vdi_escape + 7 8 1 44 Bindings for v_dspcur; gem/vdi/escape/graphic/v_dspcur.ui; vdi_escape + 7 8 1 45 v_form_adv; gem/vdi/escape/graphic/v_form_adv.ui; vdi_escape + 7 8 1 46 Bindings for v_form_adv; gem/vdi/escape/graphic/v_form_adv.ui; vdi_escape + 7 8 1 47 v_hardcopy; gem/vdi/escape/graphic/v_hardcopy.ui; vdi_escape + 7 8 1 48 Bindings for v_hardcopy; gem/vdi/escape/graphic/v_hardcopy.ui; vdi_escape + 7 8 1 49 v_orient; gem/vdi/escape/graphic/v_orient.ui; vdi_escape + 7 8 1 50 Bindings for v_orient; gem/vdi/escape/graphic/v_orient.ui; vdi_escape + 7 8 1 51 v_output_window; gem/vdi/escape/graphic/v_output_window.ui; vdi_escape + 7 8 1 52 Bindings for v_output_window; gem/vdi/escape/graphic/v_output_window.ui; vdi_escape + 7 8 1 53 v_page_size; gem/vdi/escape/graphic/v_page_size.ui; vdi_escape + 7 8 1 54 Bindings for v_page_size; gem/vdi/escape/graphic/v_page_size.ui; vdi_escape + 7 8 1 55 v_rmcur; gem/vdi/escape/graphic/v_rmcur.ui; vdi_escape + 7 8 1 56 Bindings for v_rmcur; gem/vdi/escape/graphic/v_rmcur.ui; vdi_escape + 7 8 1 57 v_tray; gem/vdi/escape/graphic/v_tray.ui; vdi_escape + 7 8 1 58 Bindings for v_tray; gem/vdi/escape/graphic/v_tray.ui; vdi_escape + 7 8 1 59 v_xbit_image; gem/vdi/escape/graphic/v_xbit_image.ui; vdi_escape + 7 8 2 Graphics tablet functions; gem/vdi/escape/tablet/tablet.u; vdi_escape + 7 8 2 1 vq_tdimensions; gem/vdi/escape/tablet/vq_tdimensions.ui; vdi_escape + 7 8 2 2 Bindings for vq_tdimensions; gem/vdi/escape/tablet/vq_tdimensions.ui; vdi_escape + 7 8 2 3 vt_alignment; gem/vdi/escape/tablet/vt_alignment.ui; vdi_escape + 7 8 2 4 Bindings for vt_alignment; gem/vdi/escape/tablet/vt_alignment.ui; vdi_escape + 7 8 2 5 vt_axis; gem/vdi/escape/tablet/vt_axis.ui; vdi_escape + 7 8 2 6 Bindings for vt_axis; gem/vdi/escape/tablet/vt_axis.ui; vdi_escape + 7 8 2 7 vt_origin; gem/vdi/escape/tablet/vt_origin.ui; vdi_escape + 7 8 2 8 Bindings for vt_origin; gem/vdi/escape/tablet/vt_origin.ui; vdi_escape + 7 8 2 9 vt_resolution; gem/vdi/escape/tablet/vt_resolution.ui; vdi_escape + 7 8 2 10 Bindings for vt_resolution; gem/vdi/escape/tablet/vt_resolution.ui; vdi_escape + 7 8 3 Metafile functions; gem/vdi/escape/metafile/metafile.u; vdi_escape + 7 8 3 1 vm_coords; gem/vdi/escape/metafile/vm_coords.ui; vdi_escape + 7 8 3 2 Bindings for vm_coords; gem/vdi/escape/metafile/vm_coords.ui; vdi_escape + 7 8 3 3 vm_filename; gem/vdi/escape/metafile/vm_filename.ui; vdi_escape + 7 8 3 4 Bindings for vm_filename; gem/vdi/escape/metafile/vm_filename.ui; vdi_escape + 7 8 3 5 vm_pagesize; gem/vdi/escape/metafile/vm_pagesize.ui; vdi_escape + 7 8 3 6 Bindings for vm_pagesize; gem/vdi/escape/metafile/vm_pagesize.ui; vdi_escape + 7 8 3 7 v_meta_extents; gem/vdi/escape/metafile/v_meta_extents.ui; vdi_escape + 7 8 3 8 Bindings for v_meta_extents; gem/vdi/escape/metafile/v_meta_extents.ui; vdi_escape + 7 8 3 9 v_write_meta; gem/vdi/escape/metafile/v_write_meta.ui; vdi_escape + 7 8 3 10 Bindings for v_write_meta; gem/vdi/escape/metafile/v_write_meta.ui; vdi_escape + 7 8 4 Polaroid functions; gem/vdi/escape/camera/camera.u; vdi_escape + 7 8 4 1 vqp_error; gem/vdi/escape/camera/vqp_error.ui; vdi_escape + 7 8 4 2 Bindings for vqp_error; gem/vdi/escape/camera/vqp_error.ui; vdi_escape + 7 8 4 3 vqp_filmname; gem/vdi/escape/camera/vqp_filmname.ui; vdi_escape + 7 8 4 4 Bindings for vqp_filmname; gem/vdi/escape/camera/vqp_filmname.ui; vdi_escape + 7 8 4 5 vqp_films; gem/vdi/escape/camera/vqp_films.ui; vdi_escape + 7 8 4 6 vqp_state; gem/vdi/escape/camera/vqp_state.ui; vdi_escape + 7 8 4 7 vsc_expose; gem/vdi/escape/camera/vsc_expose.ui; vdi_escape + 7 8 4 8 Bindings for vsc_expose; gem/vdi/escape/camera/vsc_expose.ui; vdi_escape + 7 8 4 9 vsp_film; gem/vdi/escape/camera/vsp_film.ui; vdi_escape + 7 8 4 10 Bindings for vsp_film; gem/vdi/escape/camera/vsp_film.ui; vdi_escape + 7 8 4 11 vsp_message; gem/vdi/escape/camera/vsp_message.ui; vdi_escape + 7 8 4 12 vsp_save; gem/vdi/escape/camera/vsp_save.ui; vdi_escape + 7 8 4 13 vsp_state; gem/vdi/escape/camera/vsp_state.ui; vdi_escape + 7 8 5 Sound functions; gem/vdi/escape/sound/sound.u; vdi_escape + 7 8 5 1 vmid_load; gem/vdi/escape/sound/vmid_load.ui; vdi_escape + 7 8 5 1 1 Bindings for vmid_load; gem/vdi/escape/sound/vmid_load.ui; vdi_escape + 7 8 5 2 vmid_play; gem/vdi/escape/sound/vmid_play.ui; vdi_escape + 7 8 5 2 1 Bindings for vmid_play; gem/vdi/escape/sound/vmid_play.ui; vdi_escape + 7 8 5 3 vmid_unload; gem/vdi/escape/sound/vmid_unload.ui; vdi_escape + 7 8 5 3 1 Bindings for vmid_unload; gem/vdi/escape/sound/vmid_unload.ui; vdi_escape + 7 8 5 4 vqspl_position_d2d; gem/vdi/escape/sound/vqspl_position_d2d.ui; vdi_escape + 7 8 5 4 1 Bindings for vqspl_position_d2d; gem/vdi/escape/sound/vqspl_position_d2d.ui; vdi_escape + 7 8 5 5 vqspl_position_dma; gem/vdi/escape/sound/vqspl_position_dma.ui; vdi_escape + 7 8 5 5 1 Bindings for vqspl_position_dma; gem/vdi/escape/sound/vqspl_position_dma.ui; vdi_escape + 7 8 5 6 vqspl_status_d2d; gem/vdi/escape/sound/vqspl_status_d2d.ui; vdi_escape + 7 8 5 6 1 Bindings for vqspl_status_d2d; gem/vdi/escape/sound/vqspl_status_d2d.ui; vdi_escape + 7 8 5 7 vqspl_status_dma; gem/vdi/escape/sound/vqspl_status_dma.ui; vdi_escape + 7 8 5 7 1 Bindings for vqspl_status_dma; gem/vdi/escape/sound/vqspl_status_dma.ui; vdi_escape + 7 8 5 8 vqspl_time_left_d2d; gem/vdi/escape/sound/vqspl_time_left_d2d.ui; vdi_escape + 7 8 5 8 1 Bindings for vqspl_time_left_d2d; gem/vdi/escape/sound/vqspl_time_left_d2d.ui; vdi_escape + 7 8 5 9 vspl_load_d2d; gem/vdi/escape/sound/vspl_load_d2d.ui; vdi_escape + 7 8 5 9 1 Bindings for vspl_load_d2d; gem/vdi/escape/sound/vspl_load_d2d.ui; vdi_escape + 7 8 5 10 vspl_load_sample; gem/vdi/escape/sound/vspl_load_sample.ui; vdi_escape + 7 8 5 10 1 Bindings for vspl_load_sample; gem/vdi/escape/sound/vspl_load_sample.ui; vdi_escape + 7 8 5 11 vspl_make_d2d; gem/vdi/escape/sound/vspl_make_d2d.ui; vdi_escape + 7 8 5 11 1 Bindings for vspl_make_d2d; gem/vdi/escape/sound/vspl_make_d2d.ui; vdi_escape + 7 8 5 12 vspl_pause_d2d; gem/vdi/escape/sound/vspl_pause_d2d.ui; vdi_escape + 7 8 5 12 1 Bindings for vspl_pause_d2d; gem/vdi/escape/sound/vspl_pause_d2d.ui; vdi_escape + 7 8 5 13 vspl_pause_dma; gem/vdi/escape/sound/vspl_pause_dma.ui; vdi_escape + 7 8 5 13 1 Bindings for vspl_pause_dma; gem/vdi/escape/sound/vspl_pause_dma.ui; vdi_escape + 7 8 5 14 vspl_play; gem/vdi/escape/sound/vspl_play.ui; vdi_escape + 7 8 5 14 1 Bindings for vspl_play; gem/vdi/escape/sound/vspl_play.ui; vdi_escape + 7 8 5 15 vspl_play_d2d; gem/vdi/escape/sound/vspl_play_d2d.ui; vdi_escape + 7 8 5 15 1 Bindings for vspl_play_d2d; gem/vdi/escape/sound/vspl_play_d2d.ui; vdi_escape + 7 8 5 16 vspl_play_dma; gem/vdi/escape/sound/vspl_play_dma.ui; vdi_escape + 7 8 5 16 1 Bindings for vspl_play_dma; gem/vdi/escape/sound/vspl_play_dma.ui; vdi_escape + 7 8 5 17 vspl_stop_d2d; gem/vdi/escape/sound/vspl_stop_d2d.ui; vdi_escape + 7 8 5 17 1 Bindings for vspl_stop_d2d; gem/vdi/escape/sound/vspl_stop_d2d.ui; vdi_escape + 7 8 5 18 vspl_stop_dma; gem/vdi/escape/sound/vspl_stop_dma.ui; vdi_escape + 7 8 5 18 1 Bindings for vspl_stop_dma; gem/vdi/escape/sound/vspl_stop_dma.ui; vdi_escape + 7 8 5 19 vspl_unload_d2d; gem/vdi/escape/sound/vspl_unload_d2d.ui; vdi_escape + 7 8 5 19 1 Bindings for vspl_unload_d2d; gem/vdi/escape/sound/vspl_unload_d2d.ui; vdi_escape + 7 8 5 20 vspl_unload_sample; gem/vdi/escape/sound/vspl_unload_sample.ui; vdi_escape + 7 8 5 20 1 Bindings for vspl_unload_sample; gem/vdi/escape/sound/vspl_unload_sample.ui; vdi_escape + 7 8 5 21 vsspl_monitor_off; gem/vdi/escape/sound/vsspl_monitor_off.ui; vdi_escape + 7 8 5 21 1 Bindings for vsspl_monitor_off; gem/vdi/escape/sound/vsspl_monitor_off.ui; vdi_escape + 7 8 5 22 vsspl_monitor_on; gem/vdi/escape/sound/vsspl_monitor_on.ui; vdi_escape + 7 8 5 22 1 Bindings for vsspl_monitor_on; gem/vdi/escape/sound/vsspl_monitor_on.ui; vdi_escape + 7 8 6 Special functions; gem/vdi/escape/special/special.u; vdi_escape + 7 8 6 1 v_escape2000; gem/vdi/escape/special/v_escape2000.ui; vdi_escape + 7 8 6 2 Bindings for v_escape2000; gem/vdi/escape/special/v_escape2000.ui; vdi_escape + 7 8 6 3 v_fontinit; gem/vdi/escape/special/v_fontinit.ui; vdi_escape + 7 8 6 4 Bindings for v_fontinit; gem/vdi/escape/special/v_fontinit.ui; vdi_escape + 7 8 6 5 v_offset; gem/vdi/escape/special/v_offset.ui; vdi_escape + 7 8 6 6 Bindings for v_offset; gem/vdi/escape/special/v_offset.ui; vdi_escape + 7 8 6 7 v_sound; gem/vdi/escape/special/v_sound.ui; vdi_escape + 7 8 6 8 Bindings for v_sound; gem/vdi/escape/special/v_sound.ui; vdi_escape + 7 8 6 9 vs_mute; gem/vdi/escape/special/vs_mute.ui; vdi_escape + 7 8 6 10 Bindings for vs_mute; gem/vdi/escape/special/vs_mute.ui; vdi_escape + 7 8 7 Text functions; gem/vdi/escape/text/text.u; vdi_escape + 7 8 7 1 vq_chcells; gem/vdi/escape/text/vq_chcells.ui; vdi_escape + 7 8 7 2 Bindings for vq_chcells; gem/vdi/escape/text/vq_chcells.ui; vdi_escape + 7 8 7 3 vq_curaddress; gem/vdi/escape/text/vq_curaddress.ui; vdi_escape + 7 8 7 4 Bindings for vq_curaddress; gem/vdi/escape/text/vq_curaddress.ui; vdi_escape + 7 8 7 5 v_alpha_text; gem/vdi/escape/text/v_alpha_text.ui; vdi_escape + 7 8 7 6 Bindings for v_alpha_text; gem/vdi/escape/text/v_alpha_text.ui; vdi_escape + 7 8 7 7 v_curaddress; gem/vdi/escape/text/v_curaddress.ui; vdi_escape + 7 8 7 8 Bindings for v_curaddress; gem/vdi/escape/text/v_curaddress.ui; vdi_escape + 7 8 7 9 v_curdown; gem/vdi/escape/text/v_curdown.ui; vdi_escape + 7 8 7 10 Bindings for v_curdown; gem/vdi/escape/text/v_curdown.ui; vdi_escape + 7 8 7 11 v_curhome; gem/vdi/escape/text/v_curhome.ui; vdi_escape + 7 8 7 12 Bindings for v_curhome; gem/vdi/escape/text/v_curhome.ui; vdi_escape + 7 8 7 13 v_curleft; gem/vdi/escape/text/v_curleft.ui; vdi_escape + 7 8 7 14 Bindings for v_curleft; gem/vdi/escape/text/v_curleft.ui; vdi_escape + 7 8 7 15 v_curright; gem/vdi/escape/text/v_curright.ui; vdi_escape + 7 8 7 16 Bindings for v_curright; gem/vdi/escape/text/v_curright.ui; vdi_escape + 7 8 7 17 v_curtext; gem/vdi/escape/text/v_curtext.ui; vdi_escape + 7 8 7 18 Bindings for v_curtext; gem/vdi/escape/text/v_curtext.ui; vdi_escape + 7 8 7 19 v_curup; gem/vdi/escape/text/v_curup.ui; vdi_escape + 7 8 7 20 Bindings for v_curup; gem/vdi/escape/text/v_curup.ui; vdi_escape + 7 8 7 21 v_eeol; gem/vdi/escape/text/v_eeol.ui; vdi_escape + 7 8 7 22 Bindings for v_eeol; gem/vdi/escape/text/v_eeol.ui; vdi_escape + 7 8 7 23 v_eeos; gem/vdi/escape/text/v_eeos.ui; vdi_escape + 7 8 7 24 Bindings for v_eeos; gem/vdi/escape/text/v_eeos.ui; vdi_escape + 7 8 7 25 v_enter_cur; gem/vdi/escape/text/v_enter_cur.ui; vdi_escape + 7 8 7 26 Bindings for v_enter_cur; gem/vdi/escape/text/v_enter_cur.ui; vdi_escape + 7 8 7 27 v_exit_cur; gem/vdi/escape/text/v_exit_cur.ui; vdi_escape + 7 8 7 28 Bindings for v_exit_cur; gem/vdi/escape/text/v_exit_cur.ui; vdi_escape + 7 8 7 29 v_rvoff; gem/vdi/escape/text/v_rvoff.ui; vdi_escape + 7 8 7 30 Bindings for v_rvoff; gem/vdi/escape/text/v_rvoff.ui; vdi_escape + 7 8 7 31 v_rvon; gem/vdi/escape/text/v_rvon.ui; vdi_escape + 7 8 7 32 Bindings for v_rvon; gem/vdi/escape/text/v_rvon.ui; vdi_escape + 7 9 Colour table functions; gem/vdi/colortable/colortable.u; vdi_colortable + 7 9 1 v_color2nearest; gem/vdi/colortable/v_color2nearest.ui; vdi_colortable + 7 9 2 Bindings for v_color2nearest; gem/vdi/colortable/v_color2nearest.ui; vdi_colortable + 7 9 3 v_color2value; gem/vdi/colortable/v_color2value.ui; vdi_colortable + 7 9 4 Bindings for v_color2value; gem/vdi/colortable/v_color2value.ui; vdi_colortable + 7 9 5 v_create_ctab; gem/vdi/colortable/v_create_ctab.ui; vdi_colortable + 7 9 6 Bindings for v_create_ctab; gem/vdi/colortable/v_create_ctab.ui; vdi_colortable + 7 9 7 v_create_itab; gem/vdi/colortable/v_create_itab.ui; vdi_colortable + 7 9 8 Bindings for v_create_itab; gem/vdi/colortable/v_create_itab.ui; vdi_colortable + 7 9 9 v_ctab_idx2value; gem/vdi/colortable/v_ctab_idx2value.ui; vdi_colortable + 7 9 10 Bindings for v_ctab_idx2value; gem/vdi/colortable/v_ctab_idx2value.ui; vdi_colortable + 7 9 11 v_ctab_idx2vdi; gem/vdi/colortable/v_ctab_idx2vdi.ui; vdi_colortable + 7 9 12 Bindings for v_ctab_idx2vdi; gem/vdi/colortable/v_ctab_idx2vdi.ui; vdi_colortable + 7 9 13 v_ctab_vdi2idx; gem/vdi/colortable/v_ctab_vdi2idx.ui; vdi_colortable + 7 9 14 Bindings for v_ctab_vdi2idx; gem/vdi/colortable/v_ctab_vdi2idx.ui; vdi_colortable + 7 9 15 v_delete_ctab; gem/vdi/colortable/v_delete_ctab.ui; vdi_colortable + 7 9 16 Bindings for v_delete_ctab; gem/vdi/colortable/v_delete_ctab.ui; vdi_colortable + 7 9 17 v_delete_itab; gem/vdi/colortable/v_delete_itab.ui; vdi_colortable + 7 9 18 Bindings for v_delete_itab; gem/vdi/colortable/v_delete_itab.ui; vdi_colortable + 7 9 19 v_get_ctab_id; gem/vdi/colortable/v_get_ctab_id.ui; vdi_colortable + 7 9 20 Bindings for v_get_ctab_id; gem/vdi/colortable/v_get_ctab_id.ui; vdi_colortable + 7 9 21 v_value2color; gem/vdi/colortable/v_value2color.ui; vdi_colortable + 7 9 22 Bindings for v_value2color; gem/vdi/colortable/v_value2color.ui; vdi_colortable + 7 9 23 vq_ctab; gem/vdi/colortable/vq_ctab.ui; vdi_colortable + 7 9 24 Bindings for vq_ctab; gem/vdi/colortable/vq_ctab.ui; vdi_colortable + 7 9 25 vq_ctab_entry; gem/vdi/colortable/vq_ctab_entry.ui; vdi_colortable + 7 9 26 Bindings for vq_ctab_entry; gem/vdi/colortable/vq_ctab_entry.ui; vdi_colortable + 7 9 27 vq_ctab_id; gem/vdi/colortable/vq_ctab_id.ui; vdi_colortable + 7 9 28 Bindings for vq_ctab_id; gem/vdi/colortable/vq_ctab_id.ui; vdi_colortable + 7 9 29 vq_dflt_ctab; gem/vdi/colortable/vq_dflt_ctab.ui; vdi_colortable + 7 9 30 Bindings for vq_dflt_ctab; gem/vdi/colortable/vq_dflt_ctab.ui; vdi_colortable + 7 9 31 vq_px_format; gem/vdi/colortable/vq_px_format.ui; vdi_colortable + 7 9 32 Bindings for vq_px_format; gem/vdi/colortable/vq_px_format.ui; vdi_colortable + 7 9 33 vs_ctab; gem/vdi/colortable/vs_ctab.ui; vdi_colortable + 7 9 34 Bindings for vs_ctab; gem/vdi/colortable/vs_ctab.ui; vdi_colortable + 7 9 35 vs_ctab_entry; gem/vdi/colortable/vs_ctab_entry.ui; vdi_colortable + 7 9 36 Bindings for vs_ctab_entry; gem/vdi/colortable/vs_ctab_entry.ui; vdi_colortable + 7 9 37 vs_dflt_ctab; gem/vdi/colortable/vs_dflt_ctab.ui; vdi_colortable + 7 9 38 Bindings for vs_dflt_ctab; gem/vdi/colortable/vs_dflt_ctab.ui; vdi_colortable + 7 10 Control functions; gem/vdi/control/control.u; vdi_control + 7 10 1 v_bez_off; gem/vdi/control/v_bez_off.ui; vdi_control + 7 10 2 Bindings for v_bez_off; gem/vdi/control/v_bez_off.ui; vdi_control + 7 10 3 v_bez_on; gem/vdi/control/v_bez_on.ui; vdi_control + 7 10 4 Bindings for v_bez_on; gem/vdi/control/v_bez_on.ui; vdi_control + 7 10 5 v_clrwk; gem/vdi/control/v_clrwk.ui; vdi_control + 7 10 6 Bindings for v_clrwk; gem/vdi/control/v_clrwk.ui; vdi_control + 7 10 7 v_clsbm; gem/vdi/control/v_clsbm.ui; vdi_control + 7 10 8 Bindings for v_clsbm; gem/vdi/control/v_clsbm.ui; vdi_control + 7 10 9 v_clsvwk; gem/vdi/control/v_clsvwk.ui; vdi_control + 7 10 10 Bindings for v_clsvwk; gem/vdi/control/v_clsvwk.ui; vdi_control + 7 10 11 v_clswk; gem/vdi/control/v_clswk.ui; vdi_control + 7 10 12 Bindings for v_clswk; gem/vdi/control/v_clswk.ui; vdi_control + 7 10 13 v_flushcache; gem/vdi/control/v_flushcache.ui; vdi_control + 7 10 14 Bindings for v_flushcache; gem/vdi/control/v_flushcache.ui; vdi_control + 7 10 15 v_getoutline; gem/vdi/control/v_getoutline.ui; vdi_control + 7 10 16 Bindings for v_getoutline; gem/vdi/control/v_getoutline.ui; vdi_control + 7 10 17 v_get_outline; gem/vdi/control/v_get_outline.ui; vdi_control + 7 10 18 Bindings for v_get_outline; gem/vdi/control/v_get_outline.ui; vdi_control + 7 10 19 v_killoutline; gem/vdi/control/v_killoutline.ui; vdi_control + 7 10 20 v_loadcache; gem/vdi/control/v_loadcache.ui; vdi_control + 7 10 21 Bindings for v_loadcache; gem/vdi/control/v_loadcache.ui; vdi_control + 7 10 22 v_load_cache; gem/vdi/control/v_load_cache.ui; vdi_control + 7 10 23 Bindings for v_load_cache; gem/vdi/control/v_load_cache.ui; vdi_control + 7 10 24 v_open_bm; gem/vdi/control/v_open_bm.ui; vdi_control + 7 10 25 Bindings for v_open_bm; gem/vdi/control/v_open_bm.ui; vdi_control + 7 10 26 v_opnbm; gem/vdi/control/v_opnbm.ui; vdi_control + 7 10 27 Bindings for v_opnbm; gem/vdi/control/v_opnbm.ui; vdi_control + 7 10 28 v_opnprn; gem/vdi/control/v_opnprn.ui; vdi_control + 7 10 29 Bindings for v_opnprn; gem/vdi/control/v_opnprn.ui; vdi_control + 7 10 30 v_opnvwk; gem/vdi/control/v_opnvwk.ui; vdi_control + 7 10 31 Bindings for v_opnvwk; gem/vdi/control/v_opnvwk.ui; vdi_control + 7 10 32 v_opnwk; gem/vdi/control/v_opnwk.ui; vdi_control + 7 10 33 Bindings for v_opnwk; gem/vdi/control/v_opnwk.ui; vdi_control + 7 10 34 Changes in PC-GEM; gem/vdi/control/v_opnwk_pc_gem.ui; vdi_control + 7 10 35 v_pat_rotate; gem/vdi/control/v_pat_rotate.ui; vdi_control + 7 10 36 Bindings for v_pat_rotate; gem/vdi/control/v_pat_rotate.ui; vdi_control + 7 10 37 v_resize_bm; gem/vdi/control/v_resize_bm.ui; vdi_control + 7 10 38 Bindings for v_resize_bm; gem/vdi/control/v_resize_bm.ui; vdi_control + 7 10 39 v_savecache; gem/vdi/control/v_savecache.ui; vdi_control + 7 10 40 Bindings for v_savecache; gem/vdi/control/v_savecache.ui; vdi_control + 7 10 41 v_save_cache; gem/vdi/control/v_save_cache.ui; vdi_control + 7 10 42 Bindings for v_save_cache; gem/vdi/control/v_save_cache.ui; vdi_control + 7 10 43 v_set_app_buff; gem/vdi/control/v_set_app_buff.ui; vdi_control + 7 10 44 Bindings for v_set_app_buff; gem/vdi/control/v_set_app_buff.ui; vdi_control + 7 10 45 v_updwk; gem/vdi/control/v_updwk.ui; vdi_control + 7 10 46 Bindings for v_updwk; gem/vdi/control/v_updwk.ui; vdi_control + 7 10 47 vs_clip; gem/vdi/control/vs_clip.ui; vdi_control + 7 10 48 Bindings for vs_clip; gem/vdi/control/vs_clip.ui; vdi_control + 7 10 49 vst_ex_load_fonts; gem/vdi/control/vst_ex_load_fonts.ui; vdi_control + 7 10 50 Bindings for vst_ex_load_fonts; gem/vdi/control/vst_ex_load_fonts.ui; vdi_control + 7 10 51 vst_load_fonts; gem/vdi/control/vst_load_fonts.ui; vdi_control + 7 10 52 Bindings for vst_load_fonts; gem/vdi/control/vst_load_fonts.ui; vdi_control + 7 10 53 vst_unload_fonts; gem/vdi/control/vst_unload_fonts.ui; vdi_control + 7 10 54 Bindings for vst_unload_fonts; gem/vdi/control/vst_unload_fonts.ui; vdi_control + 7 11 Raster functions; gem/vdi/raster/raster.u; vdi_raster + 7 11 1 v_get_pixel; gem/vdi/raster/v_get_pixel.ui; vdi_raster + 7 11 2 Bindings for v_get_pixel; gem/vdi/raster/v_get_pixel.ui; vdi_raster + 7 11 3 vq_hilite_color; gem/vdi/raster/vq_hilite_color.ui; vdi_raster + 7 11 4 Bindings for vq_hilite_color; gem/vdi/raster/vq_hilite_color.ui; vdi_raster + 7 11 5 vq_max_color; gem/vdi/raster/vq_max_color.ui; vdi_raster + 7 11 6 Bindings for vq_max_color; gem/vdi/raster/vq_max_color.ui; vdi_raster + 7 11 7 vq_min_color; gem/vdi/raster/vq_min_color.ui; vdi_raster + 7 11 8 Bindings for vq_min_color; gem/vdi/raster/vq_min_color.ui; vdi_raster + 7 11 9 vq_weight_color; gem/vdi/raster/vq_weight_color.ui; vdi_raster + 7 11 10 Bindings for vq_weight_color; gem/vdi/raster/vq_weight_color.ui; vdi_raster + 7 11 11 vr_clip_rects32_by_dst; gem/vdi/raster/vr_clip_rects32_by_dst.ui; vdi_raster + 7 11 12 Bindings for vr_clip_rects32_by_dst; gem/vdi/raster/vr_clip_rects32_by_dst.ui; vdi_raster + 7 11 13 vr_clip_rects32_by_src; gem/vdi/raster/vr_clip_rects32_by_src.ui; vdi_raster + 7 11 14 Bindings for vr_clip_rects32_by_src; gem/vdi/raster/vr_clip_rects32_by_src.ui; vdi_raster + 7 11 15 vr_clip_rects_by_dst; gem/vdi/raster/vr_clip_rects_by_dst.ui; vdi_raster + 7 11 16 Bindings for vr_clip_rects_by_dst; gem/vdi/raster/vr_clip_rects_by_dst.ui; vdi_raster + 7 11 17 vr_clip_rects_by_src; gem/vdi/raster/vr_clip_rects_by_src.ui; vdi_raster + 7 11 18 Bindings for vr_clip_rects_by_src; gem/vdi/raster/vr_clip_rects_by_src.ui; vdi_raster + 7 11 19 vr_transfer_bits; gem/vdi/raster/vr_transfer_bits.ui; vdi_raster + 7 11 20 Bindings for vr_transfer_bits; gem/vdi/raster/vr_transfer_bits.ui; vdi_raster + 7 11 21 vr_trnfm; gem/vdi/raster/vr_trnfm.ui; vdi_raster + 7 11 22 Bindings for vr_trnfm; gem/vdi/raster/vr_trnfm.ui; vdi_raster + 7 11 23 vro_cpyfm; gem/vdi/raster/vro_cpyfm.ui; vdi_raster + 7 11 24 Bindings for vro_cpyfm; gem/vdi/raster/vro_cpyfm.ui; vdi_raster + 7 11 25 vrt_cpyfm; gem/vdi/raster/vrt_cpyfm.ui; vdi_raster + 7 11 26 Bindings for vrt_cpyfm; gem/vdi/raster/vrt_cpyfm.ui; vdi_raster + 7 11 27 vs_hilite_color; gem/vdi/raster/vs_hilite_color.ui; vdi_raster + 7 11 28 Bindings for vs_hilite_color; gem/vdi/raster/vs_hilite_color.ui; vdi_raster + 7 11 29 vs_max_color; gem/vdi/raster/vs_max_color.ui; vdi_raster + 7 11 30 Bindings for vs_max_color; gem/vdi/raster/vs_max_color.ui; vdi_raster + 7 11 31 vs_min_color; gem/vdi/raster/vs_min_color.ui; vdi_raster + 7 11 32 Bindings for vs_min_color; gem/vdi/raster/vs_min_color.ui; vdi_raster + 7 11 33 vs_weight_color; gem/vdi/raster/vs_weight_color.ui; vdi_raster + 7 11 34 Bindings for vs_weight_color; gem/vdi/raster/vs_weight_color.ui; vdi_raster + 7 12 TC-VDI functions; gem/vdi/tcvdi/tcvdi.u; tc_vdi + 7 12 1 vq_colors; gem/vdi/tcvdi/vq_colors.ui; tc_vdi + 7 12 2 Bindings for vq_colors; gem/vdi/tcvdi/vq_colors.ui; tc_vdi + 7 12 3 vq_pixcol; gem/vdi/tcvdi/vq_pixcol.ui; tc_vdi + 7 12 4 Bindings for vq_pixcol; gem/vdi/tcvdi/vq_pixcol.ui; tc_vdi + 7 12 5 vq_pixrgb; gem/vdi/tcvdi/vq_pixrgb.ui; tc_vdi + 7 12 6 Bindings for vq_pixrgb; gem/vdi/tcvdi/vq_pixrgb.ui; tc_vdi + 7 12 7 vrf_rgb; gem/vdi/tcvdi/vrf_rgb.ui; tc_vdi + 7 12 8 Bindings for vrf_rgb; gem/vdi/tcvdi/vrf_rgb.ui; tc_vdi + 7 12 9 vrl_rgb; gem/vdi/tcvdi/vrl_rgb.ui; tc_vdi + 7 12 10 Bindings for vrl_rgb; gem/vdi/tcvdi/vrl_rgb.ui; tc_vdi + 7 12 11 vrt_rgb; gem/vdi/tcvdi/vrt_rgb.ui; tc_vdi + 7 12 12 Bindings for vrt_rgb; gem/vdi/tcvdi/vrt_rgb.ui; tc_vdi + 7 12 13 vrun_parallel; gem/vdi/tcvdi/vrun_parallel.ui; tc_vdi + 7 12 14 Bindings for vrun_parallel; gem/vdi/tcvdi/vrun_parallel.ui; tc_vdi + 7 12 15 vrun_rect; gem/vdi/tcvdi/vrun_rect.ui; tc_vdi + 7 12 16 Bindings for vrun_rect; gem/vdi/tcvdi/vrun_rect.ui; tc_vdi + 7 12 17 vrun_triangle; gem/vdi/tcvdi/vrun_triangle.ui; tc_vdi + 7 12 18 Bindings for vrun_triangle; gem/vdi/tcvdi/vrun_triangle.ui; tc_vdi + 7 12 19 vs_colors; gem/vdi/tcvdi/vs_colors.ui; tc_vdi + 7 12 20 Bindings for vs_colors; gem/vdi/tcvdi/vs_colors.ui; tc_vdi + 7 12 21 vs_pixcol; gem/vdi/tcvdi/vs_pixcol.ui; tc_vdi + 7 12 22 Bindings for vs_pixcol; gem/vdi/tcvdi/vs_pixcol.ui; tc_vdi + 7 12 23 vs_pixrgb; gem/vdi/tcvdi/vs_pixrgb.ui; tc_vdi + 7 12 24 Bindings for vs_pixrgb; gem/vdi/tcvdi/vs_pixrgb.ui; tc_vdi + 7 12 25 vsf_rgb; gem/vdi/tcvdi/vsf_rgb.ui; tc_vdi + 7 12 26 Bindings for vsf_rgb; gem/vdi/tcvdi/vsf_rgb.ui; tc_vdi + 7 12 27 vsl_rgb; gem/vdi/tcvdi/vsl_rgb.ui; tc_vdi + 7 12 28 Bindings for vsl_rgb; gem/vdi/tcvdi/vsl_rgb.ui; tc_vdi + 7 12 29 vst_rgb; gem/vdi/tcvdi/vst_rgb.ui; tc_vdi + 7 12 30 Bindings for vst_rgb; gem/vdi/tcvdi/vst_rgb.ui; tc_vdi + 7 13 VDI functions list; gem/vdi/vdi_f.u; vdi_functions + 7 14 VDI structures; gem/vdi/structures/structures.u; vdi_structures + 7 14 1 VDIPB; gem/vdi/structures/structures.u; vdi_structures + 7 14 2 BIT_IMAGE; gem/vdi/structures/bit_image.ui; vdi_structures + 7 14 3 COLOR_ENTRY; gem/vdi/structures/color_entry.ui; vdi_structures + 7 14 4 COLOR_RGB; gem/vdi/structures/color_rgb.ui; vdi_structures + 7 14 5 COLOR_TAB; gem/vdi/structures/color_tab.ui; vdi_structures + 7 14 6 fix31; gem/vdi/structures/fix31.ui; vdi_structures + 7 14 7 FONT_HDR; gem/vdi/structures/font_hdr.ui; vdi_structures + 7 14 8 GCBITMAP; gem/vdi/structures/gcbitmap.ui; vdi_structures + 7 14 9 MFDB; gem/vdi/structures/mfdb.ui; vdi_structures + 7 14 10 POINT16; gem/vdi/structures/point16.ui; vdi_structures + 7 14 11 POINT32; gem/vdi/structures/point32.ui; vdi_structures + 7 14 12 pxyarray; gem/vdi/structures/pxyarray.ui; vdi_structures + 7 14 13 RECT16; gem/vdi/structures/rect16.ui; vdi_structures + 7 14 14 RECT32; gem/vdi/structures/rect32.ui; vdi_structures + 7 14 15 XFNT_INFO; gem/vdi/structures/xfnt_info.ui; vdi_structures + 8 AES; /home/runner/work/tos.hyp/tos.hyp/tos_hyp.u; aes_main + 8 1 About the AES; gem/aes/aes_en.u; aes_about + 8 2 AES fundamentals; gem/aes/aes_en.u; aes_fundamentals + 8 2 1 Accessories; gem/aes/aes_en.u; aes_fundamentals + 8 2 1 1 Startup-code for accessories; gem/aes/aes_en.u; aes_fundamentals + 8 2 1 2 Accessories in MagiC; gem/aes/aes_en.u; aes_fundamentals + 8 2 2 The desktop window; gem/aes/aes_en.u; aes_fundamentals + 8 2 3 Data exchange via the GEM clipboard; gem/aes/aes_en.u; aes_fundamentals + 8 2 4 The object structure; gem/aes/aes_en.u; aes_fundamentals + 8 2 4 1 AES object types; gem/aes/aes_en.u; aes_fundamentals + 8 2 4 2 AES object colours; gem/aes/aes_en.u; aes_fundamentals + 8 2 4 3 AES object flags; gem/aes/aes_en.u; aes_fundamentals + 8 2 4 4 AES object stati; gem/aes/aes_en.u; aes_fundamentals + 8 2 5 The quarter-screen buffer; gem/aes/aes_en.u; aes_fundamentals + 8 2 6 The rectangle-list of a window; gem/aes/aes_en.u; aes_fundamentals + 8 2 7 The screen-manager; gem/aes/aes_en.u; aes_fundamentals + 8 2 8 Toolbar support; gem/aes/toolbar.ui; aes_fundamentals + 8 2 8 1 Redraw and updating of toolbars; gem/aes/toolbar.ui; aes_fundamentals + 8 2 8 2 Toolbars and the window-manager; gem/aes/toolbar.ui; aes_fundamentals + 8 2 8 3 Problems with wind_calc in toolbar windows; gem/aes/toolbar.ui; aes_fundamentals + 8 2 9 AES bindings; gem/aes/aes_en.u; aes_fundamentals + 8 2 9 1 Sample binding for AES functions; gem/aes/aes_en.u; aes_fundamentals + 8 3 Application library; gem/aes/appl_/appl_.u; appl + 8 3 1 appl_bvset; gem/aes/appl_/appl_bvset.ui; appl + 8 3 1 1 Bindings for appl_bvset; gem/aes/appl_/appl_bvset.ui; appl + 8 3 2 appl_control; gem/aes/appl_/appl_control.ui; appl + 8 3 2 1 Bindings for appl_control; gem/aes/appl_/appl_control.ui; appl + 8 3 3 appl_exit; gem/aes/appl_/appl_exit.ui; appl + 8 3 3 1 Bindings for appl_exit; gem/aes/appl_/appl_exit.ui; appl + 8 3 4 appl_find; gem/aes/appl_/appl_find.ui; appl + 8 3 4 1 Bindings for appl_find; gem/aes/appl_/appl_find.ui; appl + 8 3 5 appl_getinfo; gem/aes/appl_/appl_getinfo.ui; appl + 8 3 5 1 Bindings for appl_getinfo; gem/aes/appl_/appl_getinfo.ui; appl + 8 3 5 2 appl_xgetinfo; gem/aes/appl_/appl_getinfo.ui; appl + 8 3 6 appl_getinfo_str; gem/aes/appl_/appl_getinfo_str.ui; appl + 8 3 6 1 Bindings for appl_getinfo_str; gem/aes/appl_/appl_getinfo_str.ui; appl + 8 3 7 appl_getcicon; gem/aes/appl_/appl_get_cicon.ui; appl + 8 3 7 1 Bindings for appl_getcicon; gem/aes/appl_/appl_get_cicon.ui; appl + 8 3 8 appl_init; gem/aes/appl_/appl_init.ui; appl + 8 3 8 1 Bindings for appl_init; gem/aes/appl_/appl_init.ui; appl + 8 3 9 appl_options; gem/aes/appl_/appl_options.ui; appl + 8 3 9 1 Bindings for appl_options; gem/aes/appl_/appl_options.ui; appl + 8 3 10 appl_read; gem/aes/appl_/appl_read.ui; appl + 8 3 10 1 Bindings for appl_read; gem/aes/appl_/appl_read.ui; appl + 8 3 11 appl_search; gem/aes/appl_/appl_search.ui; appl + 8 3 11 1 Bindings for appl_search; gem/aes/appl_/appl_search.ui; appl + 8 3 12 appl_tplay; gem/aes/appl_/appl_tplay.ui; appl + 8 3 12 1 Bindings for appl_tplay; gem/aes/appl_/appl_tplay.ui; appl + 8 3 13 appl_trecord; gem/aes/appl_/appl_trecord.ui; appl + 8 3 13 1 Bindings for appl_trecord; gem/aes/appl_/appl_trecord.ui; appl + 8 3 14 appl_write; gem/aes/appl_/appl_write.ui; appl + 8 3 14 1 Bindings for appl_write; gem/aes/appl_/appl_write.ui; appl + 8 3 15 appl_xbvget; gem/aes/appl_/appl_xbvget.ui; appl + 8 3 15 1 Bindings for appl_xbvget; gem/aes/appl_/appl_xbvget.ui; appl + 8 3 16 appl_xbvset; gem/aes/appl_/appl_xbvset.ui; appl + 8 3 16 1 Bindings for appl_xbvset; gem/aes/appl_/appl_xbvset.ui; appl + 8 3 17 appl_yield; gem/aes/appl_/appl_yield.ui; appl + 8 3 17 1 Bindings for appl_yield; gem/aes/appl_/appl_yield.ui; appl + 8 3 18 _appl_yield; gem/aes/appl_/_appl_yield.ui; appl + 8 3 18 1 Bindings for _appl_yield; gem/aes/appl_/_appl_yield.ui; appl + 8 3 19 x_appl_flags; gem/aes/appl_/x_appl_flags.ui; appl + 8 3 19 1 Bindings for x_appl_flags; gem/aes/appl_/x_appl_flags.ui; appl + 8 3 20 x_appl_font; gem/aes/appl_/x_appl_font.ui; appl + 8 3 20 1 Bindings for x_appl_font; gem/aes/appl_/x_appl_font.ui; appl + 8 3 21 x_appl_sleep; gem/aes/appl_/x_appl_sleep.ui; appl + 8 3 21 1 Bindings for x_appl_sleep; gem/aes/appl_/x_appl_sleep.ui; appl + 8 3 22 x_appl_term; gem/aes/appl_/x_appl_term.ui; appl + 8 3 22 1 Bindings for x_appl_term; gem/aes/appl_/x_appl_term.ui; appl + 8 3 23 xappl_getinfo; gem/aes/appl_/x_appl_getinfo.ui; appl + 8 4 File-selector library; gem/aes/fsel_/fsel_.u; fsel + 8 4 1 fsel_boxinput; gem/aes/fsel_/fsel_boxinput.ui; fsel + 8 4 1 1 Bindings for fsel_boxinput; gem/aes/fsel_/fsel_boxinput.ui; fsel + 8 4 2 fsel_exinput; gem/aes/fsel_/fsel_exinput.ui; fsel + 8 4 2 1 Bindings for fsel_exinput; gem/aes/fsel_/fsel_exinput.ui; fsel + 8 4 3 fsel_input; gem/aes/fsel_/fsel_input.ui; fsel + 8 4 3 1 Bindings for fsel_input; gem/aes/fsel_/fsel_input.ui; fsel + 8 4 4 x_fsel_input; gem/aes/fsel_/x_fsel_input.ui; fsel + 8 4 4 1 Bindings for x_fsel_input; gem/aes/fsel_/x_fsel_input.ui; fsel + 8 5 Print dialogs; gem/aes/pdlg_/pdlg_.u; pdlg + 8 5 1 pdlg_add_printers; gem/aes/pdlg_/pdlg_add_printers.ui; pdlg + 8 5 1 1 Bindings for pdlg_add_printers; gem/aes/pdlg_/pdlg_add_printers.ui; pdlg + 8 5 2 pdlg_add_sub_dialogs; gem/aes/pdlg_/pdlg_add_sub_dialogs.ui; pdlg + 8 5 2 1 Bindings for pdlg_add_sub_dialogs; gem/aes/pdlg_/pdlg_add_sub_dialogs.ui; pdlg + 8 5 3 pdlg_close; gem/aes/pdlg_/pdlg_close.ui; pdlg + 8 5 3 1 Bindings for pdlg_close; gem/aes/pdlg_/pdlg_close.ui; pdlg + 8 5 4 pdlg_create; gem/aes/pdlg_/pdlg_create.ui; pdlg + 8 5 4 1 Bindings for pdlg_create; gem/aes/pdlg_/pdlg_create.ui; pdlg + 8 5 5 pdlg_delete; gem/aes/pdlg_/pdlg_delete.ui; pdlg + 8 5 5 1 Bindings for pdlg_delete; gem/aes/pdlg_/pdlg_delete.ui; pdlg + 8 5 6 pdlg_dflt_settings; gem/aes/pdlg_/pdlg_dflt_settings.ui; pdlg + 8 5 6 1 Bindings for pdlg_dflt_settings; gem/aes/pdlg_/pdlg_dflt_settings.ui; pdlg + 8 5 7 pdlg_do; gem/aes/pdlg_/pdlg_do.ui; pdlg + 8 5 7 1 Bindings for pdlg_do; gem/aes/pdlg_/pdlg_do.ui; pdlg + 8 5 8 pdlg_evnt; gem/aes/pdlg_/pdlg_evnt.ui; pdlg + 8 5 8 1 Bindings for pdlg_evnt; gem/aes/pdlg_/pdlg_evnt.ui; pdlg + 8 5 9 pdlg_free_settings; gem/aes/pdlg_/pdlg_free_settings.ui; pdlg + 8 5 9 1 Bindings for pdlg_free_settings; gem/aes/pdlg_/pdlg_free_settings.ui; pdlg + 8 5 10 pdlg_get_setsize; gem/aes/pdlg_/pdlg_get_setsize.ui; pdlg + 8 5 10 1 Bindings for pdlg_get_setsize; gem/aes/pdlg_/pdlg_get_setsize.ui; pdlg + 8 5 11 pdlg_new_settings; gem/aes/pdlg_/pdlg_new_settings.ui; pdlg + 8 5 11 1 Bindings for pdlg_new_settings; gem/aes/pdlg_/pdlg_new_settings.ui; pdlg + 8 5 12 pdlg_open; gem/aes/pdlg_/pdlg_open.ui; pdlg + 8 5 12 1 Bindings for pdlg_open; gem/aes/pdlg_/pdlg_open.ui; pdlg + 8 5 13 pdlg_remove_printers; gem/aes/pdlg_/pdlg_remove_printers.ui; pdlg + 8 5 13 1 Bindings for pdlg_remove_printers; gem/aes/pdlg_/pdlg_remove_printers.ui; pdlg + 8 5 14 pdlg_remove_sub_dialogs; gem/aes/pdlg_/pdlg_remove_sub_dialogs.ui; pdlg + 8 5 14 1 Bindings for pdlg_remove_sub_dialogs; gem/aes/pdlg_/pdlg_remove_sub_dialogs.ui; pdlg + 8 5 15 pdlg_save_default_settings; gem/aes/pdlg_/pdlg_save_default_settings.ui; pdlg + 8 5 15 1 Bindings for pdlg_save_default_settings; gem/aes/pdlg_/pdlg_save_default_settings.ui; pdlg + 8 5 16 pdlg_update; gem/aes/pdlg_/pdlg_update.ui; pdlg + 8 5 16 1 Bindings for pdlg_update; gem/aes/pdlg_/pdlg_update.ui; pdlg + 8 5 17 pdlg_use_settings; gem/aes/pdlg_/pdlg_use_settings.ui; pdlg + 8 5 17 1 Bindings for pdlg_use_settings; gem/aes/pdlg_/pdlg_use_settings.ui; pdlg + 8 5 18 pdlg_validate_settings; gem/aes/pdlg_/pdlg_validate_settings.ui; pdlg + 8 5 18 1 Bindings for pdlg_validate_settings; gem/aes/pdlg_/pdlg_validate_settings.ui; pdlg + 8 5 19 Print selection in a window; gem/aes/pdlg_/use.ui; pdlg + 8 5 20 Print selection as a dialog; gem/aes/pdlg_/use.ui; pdlg + 8 6 Editable object functions; gem/aes/edit_/edit_.u; edit + 8 6 1 edit_close; gem/aes/edit_/edit_close.ui; edit + 8 6 1 1 Bindings for edit_close; gem/aes/edit_/edit_close.ui; edit + 8 6 2 edit_create; gem/aes/edit_/edit_create.ui; edit + 8 6 2 1 Bindings for edit_create; gem/aes/edit_/edit_create.ui; edit + 8 6 3 edit_cursor; gem/aes/edit_/edit_cursor.ui; edit + 8 6 3 1 Bindings for edit_cursor; gem/aes/edit_/edit_cursor.ui; edit + 8 6 4 edit_delete; gem/aes/edit_/edit_delete.ui; edit + 8 6 4 1 Bindings for edit_delete; gem/aes/edit_/edit_delete.ui; edit + 8 6 5 edit_evnt; gem/aes/edit_/edit_evnt.ui; edit + 8 6 5 1 Bindings for edit_evnt; gem/aes/edit_/edit_evnt.ui; edit + 8 6 6 edit_get_buf; gem/aes/edit_/edit_get_buf.ui; edit + 8 6 6 1 Bindings for edit_get_buf; gem/aes/edit_/edit_get_buf.ui; edit + 8 6 7 edit_get_colour; gem/aes/edit_/edit_get_colour.ui; edit + 8 6 7 1 Bindings for edit_get_colour; gem/aes/edit_/edit_get_colour.ui; edit + 8 6 8 edit_get_cursor; gem/aes/edit_/edit_get_cursor.ui; edit + 8 6 8 1 Bindings for edit_get_cursor; gem/aes/edit_/edit_get_cursor.ui; edit + 8 6 9 edit_get_dirty; gem/aes/edit_/edit_get_dirty.ui; edit + 8 6 9 1 Bindings for edit_get_dirty; gem/aes/edit_/edit_get_dirty.ui; edit + 8 6 10 edit_get_font; gem/aes/edit_/edit_get_font.ui; edit + 8 6 10 1 Bindings for edit_get_font; gem/aes/edit_/edit_get_font.ui; edit + 8 6 11 edit_get_format; gem/aes/edit_/edit_get_format.ui; edit + 8 6 11 1 Bindings for edit_get_format; gem/aes/edit_/edit_get_format.ui; edit + 8 6 12 edit_get_pos; gem/aes/edit_/edit_get_pos.ui; edit + 8 6 12 1 Bindings for edit_get_pos; gem/aes/edit_/edit_get_pos.ui; edit + 8 6 13 edit_get_scrollinfo; gem/aes/edit_/edit_get_scrollinfo.ui; edit + 8 6 13 1 Bindings for edit_get_scrollinfo; gem/aes/edit_/edit_get_scrollinfo.ui; edit + 8 6 14 edit_get_sel; gem/aes/edit_/edit_get_sel.ui; edit + 8 6 14 1 Bindings for edit_get_sel; gem/aes/edit_/edit_get_sel.ui; edit + 8 6 15 edit_open; gem/aes/edit_/edit_open.ui; edit + 8 6 15 1 Bindings for edit_open; gem/aes/edit_/edit_open.ui; edit + 8 6 16 edit_resized; gem/aes/edit_/edit_resized.ui; edit + 8 6 16 1 Bindings for edit_resized; gem/aes/edit_/edit_resized.ui; edit + 8 6 17 edit_scroll; gem/aes/edit_/edit_scroll.ui; edit + 8 6 17 1 Bindings for edit_scroll; gem/aes/edit_/edit_scroll.ui; edit + 8 6 18 edit_set_buf; gem/aes/edit_/edit_set_buf.ui; edit + 8 6 18 1 Bindings for edit_set_buf; gem/aes/edit_/edit_set_buf.ui; edit + 8 6 19 edit_set_colour; gem/aes/edit_/edit_set_colour.ui; edit + 8 6 19 1 Bindings for edit_set_colour; gem/aes/edit_/edit_set_colour.ui; edit + 8 6 20 edit_set_cursor; gem/aes/edit_/edit_set_cursor.ui; edit + 8 6 20 1 Bindings for edit_set_cursor; gem/aes/edit_/edit_set_cursor.ui; edit + 8 6 21 edit_set_dirty; gem/aes/edit_/edit_set_dirty.ui; edit + 8 6 21 1 Bindings for edit_set_dirty; gem/aes/edit_/edit_set_dirty.ui; edit + 8 6 22 edit_set_font; gem/aes/edit_/edit_set_font.ui; edit + 8 6 22 1 Bindings for edit_set_font; gem/aes/edit_/edit_set_font.ui; edit + 8 6 23 edit_set_format; gem/aes/edit_/edit_set_format.ui; edit + 8 6 23 1 Bindings for edit_set_format; gem/aes/edit_/edit_set_format.ui; edit + 8 6 24 edit_set_pos; gem/aes/edit_/edit_set_pos.ui; edit + 8 6 24 1 Bindings for edit_set_pos; gem/aes/edit_/edit_set_pos.ui; edit + 8 6 25 Using G_EDIT objects; gem/aes/edit_/uses.ui; edit + 8 6 26 Keyboard codes for G_EDIT; gem/aes/edit_/uses.ui; edit + 8 7 Event library; gem/aes/evnt_/evnt_.u; evnt + 8 7 1 evnt_button; gem/aes/evnt_/evnt_button.ui; evnt + 8 7 1 1 Bindings for evnt_button; gem/aes/evnt_/evnt_button.ui; evnt + 8 7 2 evnt_dclick; gem/aes/evnt_/evnt_dclick.ui; evnt + 8 7 2 1 Bindings for evnt_dclick; gem/aes/evnt_/evnt_dclick.ui; evnt + 8 7 3 evnt_keybd; gem/aes/evnt_/evnt_keybd.ui; evnt + 8 7 3 1 Bindings for evnt_keybd; gem/aes/evnt_/evnt_keybd.ui; evnt + 8 7 4 evnt_mesag; gem/aes/evnt_/evnt_mesag.ui; evnt + 8 7 4 1 Bindings for evnt_mesag; gem/aes/evnt_/evnt_mesag.ui; evnt + 8 7 5 evnt_mouse; gem/aes/evnt_/evnt_mouse.ui; evnt + 8 7 5 1 Bindings for evnt_mouse; gem/aes/evnt_/evnt_mouse.ui; evnt + 8 7 6 evnt_multi; gem/aes/evnt_/evnt_multi.ui; evnt + 8 7 6 1 Bindings for evnt_multi; gem/aes/evnt_/evnt_multi.ui; evnt + 8 7 7 evnt_timer; gem/aes/evnt_/evnt_timer.ui; evnt + 8 7 7 1 Bindings for evnt_timer; gem/aes/evnt_/evnt_timer.ui; evnt + 8 7 8 Messages; gem/aes/evnt_/messages/evnts_en.ui; evnt + 8 7 9 Message-list; gem/aes/evnt_/messages/messages.u; evnt + 8 7 9 1 The CAB protocol; gem/aes/evnt_/messages/description/cab.ui; evnt + 8 7 9 2 Messages from Geneva; gem/aes/evnt_/messages/description/geneva.ui; evnt + 8 7 9 3 RSDAEMON_MSG; gem/aes/evnt_/messages/description/rsdaemon.ui; evnt + 8 8 Window-dialogs; gem/aes/wdlg_/wdlg_.u; wdlg + 8 8 1 wdlg_close; gem/aes/wdlg_/wdlg_close.ui; wdlg + 8 8 1 1 Bindings for wdlg_close; gem/aes/wdlg_/wdlg_close.ui; wdlg + 8 8 2 wdlg_create; gem/aes/wdlg_/wdlg_create.ui; wdlg + 8 8 2 1 Bindings for wdlg_create; gem/aes/wdlg_/wdlg_create.ui; wdlg + 8 8 3 wdlg_delete; gem/aes/wdlg_/wdlg_delete.ui; wdlg + 8 8 3 1 Bindings for wdlg_delete; gem/aes/wdlg_/wdlg_delete.ui; wdlg + 8 8 4 wdlg_evnt; gem/aes/wdlg_/wdlg_evnt.ui; wdlg + 8 8 4 1 Bindings for wdlg_evnt; gem/aes/wdlg_/wdlg_evnt.ui; wdlg + 8 8 5 wdlg_get_edit; gem/aes/wdlg_/wdlg_get_edit.ui; wdlg + 8 8 5 1 Bindings for wdlg_get_edit; gem/aes/wdlg_/wdlg_get_edit.ui; wdlg + 8 8 6 wdlg_get_handle; gem/aes/wdlg_/wdlg_get_handle.ui; wdlg + 8 8 6 1 Bindings for wdlg_get_handle; gem/aes/wdlg_/wdlg_get_handle.ui; wdlg + 8 8 7 wdlg_get_tree; gem/aes/wdlg_/wdlg_get_tree.ui; wdlg + 8 8 7 1 Bindings for wdlg_get_tree; gem/aes/wdlg_/wdlg_get_tree.ui; wdlg + 8 8 8 wdlg_get_udata; gem/aes/wdlg_/wdlg_get_udata.ui; wdlg + 8 8 8 1 Bindings for wdlg_get_udata; gem/aes/wdlg_/wdlg_get_udata.ui; wdlg + 8 8 9 wdlg_open; gem/aes/wdlg_/wdlg_open.ui; wdlg + 8 8 9 1 Bindings for wdlg_open; gem/aes/wdlg_/wdlg_open.ui; wdlg + 8 8 10 wdlg_redraw; gem/aes/wdlg_/wdlg_redraw.ui; wdlg + 8 8 10 1 Bindings for wdlg_redraw; gem/aes/wdlg_/wdlg_redraw.ui; wdlg + 8 8 11 wdlg_set_edit; gem/aes/wdlg_/wdlg_set_edit.ui; wdlg + 8 8 11 1 Bindings for wdlg_set_edit; gem/aes/wdlg_/wdlg_set_edit.ui; wdlg + 8 8 12 wdlg_set_iconify; gem/aes/wdlg_/wdlg_set_iconify.ui; wdlg + 8 8 12 1 Bindings for wdlg_set_iconify; gem/aes/wdlg_/wdlg_set_iconify.ui; wdlg + 8 8 13 wdlg_set_size; gem/aes/wdlg_/wdlg_set_size.ui; wdlg + 8 8 13 1 Bindings for wdlg_set_size; gem/aes/wdlg_/wdlg_set_size.ui; wdlg + 8 8 14 wdlg_set_tree; gem/aes/wdlg_/wdlg_set_tree.ui; wdlg + 8 8 14 1 Bindings for wdlg_set_tree; gem/aes/wdlg_/wdlg_set_tree.ui; wdlg + 8 8 15 wdlg_set_uniconify; gem/aes/wdlg_/wdlg_set_uniconify.ui; wdlg + 8 8 15 1 Bindings for wdlg_set_uniconify; gem/aes/wdlg_/wdlg_set_uniconify.ui; wdlg + 8 9 Window library; gem/aes/wind_/wind_.u; wind + 8 9 1 wind_apfind; gem/aes/wind_/wind_apfind.ui; wind + 8 9 1 1 Bindings for wind_apfind; gem/aes/wind_/wind_apfind.ui; wind + 8 9 2 wind_calc; gem/aes/wind_/wind_calc.ui; wind + 8 9 2 1 Bindings for wind_calc; gem/aes/wind_/wind_calc.ui; wind + 8 9 3 wind_close; gem/aes/wind_/wind_close.ui; wind + 8 9 3 1 Bindings for wind_close; gem/aes/wind_/wind_close.ui; wind + 8 9 4 wind_create; gem/aes/wind_/wind_create.ui; wind + 8 9 4 1 Bindings for wind_create; gem/aes/wind_/wind_create.ui; wind + 8 9 5 wind_delete; gem/aes/wind_/wind_delete.ui; wind + 8 9 5 1 Bindings for wind_delete; gem/aes/wind_/wind_delete.ui; wind + 8 9 6 wind_draw; gem/aes/wind_/wind_draw.ui; wind + 8 9 6 1 Bindings for wind_draw; gem/aes/wind_/wind_draw.ui; wind + 8 9 7 wind_find; gem/aes/wind_/wind_find.ui; wind + 8 9 7 1 Bindings for wind_find; gem/aes/wind_/wind_find.ui; wind + 8 9 8 wind_get; gem/aes/wind_/wind_get.ui; wind + 8 9 8 1 Bindings for wind_get; gem/aes/wind_/wind_get.ui; wind + 8 9 9 wind_new; gem/aes/wind_/wind_new.ui; wind + 8 9 9 1 Bindings for wind_new; gem/aes/wind_/wind_new.ui; wind + 8 9 10 wind_open; gem/aes/wind_/wind_open.ui; wind + 8 9 10 1 Bindings for wind_open; gem/aes/wind_/wind_open.ui; wind + 8 9 11 wind_set; gem/aes/wind_/wind_set.ui; wind + 8 9 11 1 wind_set and PC-GEM; gem/aes/wind_/wind_set.ui; wind + 8 9 11 2 Bindings for wind_set; gem/aes/wind_/wind_set.ui; wind + 8 9 11 3 WF_TOPMOST, wind_set; gem/aes/wind_/wind_set/WF_TOPMOST.ui; wind + 8 9 12 wind_update; gem/aes/wind_/wind_update.ui; wind + 8 9 12 1 Bindings for wind_update; gem/aes/wind_/wind_update.ui; wind + 8 9 13 wind_xget; gem/aes/wind_/wind_xget.ui; wind + 8 9 13 1 Bindings for wind_xget; gem/aes/wind_/wind_xget.ui; wind + 8 9 14 wind_xset; gem/aes/wind_/wind_xset.ui; wind + 8 9 14 1 Bindings for wind_xset; gem/aes/wind_/wind_xset.ui; wind + 8 9 15 x_wdial_change; gem/aes/wind_/x_wdial_change.ui; wind + 8 9 15 1 Bindings for x_wdial_change; gem/aes/wind_/x_wdial_change.ui; wind + 8 9 16 x_wdial_draw; gem/aes/wind_/x_wdial_draw.ui; wind + 8 9 16 1 Bindings for x_wdial_draw; gem/aes/wind_/x_wdial_draw.ui; wind + 8 9 17 x_wind_calc; gem/aes/wind_/x_wind_calc.ui; wind + 8 9 17 1 Bindings for x_wind_calc; gem/aes/wind_/x_wind_calc.ui; wind + 8 9 18 x_wind_create; gem/aes/wind_/x_wind_create.ui; wind + 8 9 18 1 Bindings for x_wind_create; gem/aes/wind_/x_wind_create.ui; wind + 8 9 19 x_wind_tree; gem/aes/wind_/x_wind_tree.ui; wind + 8 9 19 1 Bindings for x_wind_tree; gem/aes/wind_/x_wind_tree.ui; wind + 8 9 20 The components of a window; gem/aes/wind_/components.ui; wind + 8 9 21 Overview of the wind_get/set subfunctions; gem/aes/wind_/wind_get_set.ui; wind + 8 9 22 wind_get and wind_set mode in Geneva; gem/aes/wind_/wind_get_set_geneva.ui; wind + 8 10 Extended file-selectors; gem/aes/fslx_/fslx_.u; fslx + 8 10 1 fslx_close; gem/aes/fslx_/fslx_close.ui; fslx + 8 10 1 1 Bindings for fslx_close; gem/aes/fslx_/fslx_close.ui; fslx + 8 10 2 fslx_do; gem/aes/fslx_/fslx_do.ui; fslx + 8 10 2 1 Bindings for fslx_do; gem/aes/fslx_/fslx_do.ui; fslx + 8 10 3 fslx_evnt; gem/aes/fslx_/fslx_evnt.ui; fslx + 8 10 3 1 Bindings for fslx_evnt; gem/aes/fslx_/fslx_evnt.ui; fslx + 8 10 4 fslx_getnxtfile; gem/aes/fslx_/fslx_getnxtfile.ui; fslx + 8 10 4 1 Bindings for fslx_getnxtfile; gem/aes/fslx_/fslx_getnxtfile.ui; fslx + 8 10 5 fslx_open; gem/aes/fslx_/fslx_open.ui; fslx + 8 10 5 1 Bindings for fslx_open; gem/aes/fslx_/fslx_open.ui; fslx + 8 10 6 fslx_set_flags; gem/aes/fslx_/fslx_set_flags.ui; fslx + 8 10 6 1 Bindings for fslx_set_flags; gem/aes/fslx_/fslx_set_flags.ui; fslx + 8 10 7 Operation of file-selectors from MagiC 4 onwards; gem/aes/fslx_/use.ui; fslx + 8 10 8 File-selector as a dialog; gem/aes/fslx_/use.ui; fslx + 8 10 9 File-selector in a window; gem/aes/fslx_/use.ui; fslx + 8 11 Form library; gem/aes/form_/form_.u; form + 8 11 1 form_alert; gem/aes/form_/form_alert.ui; form + 8 11 1 1 Bindings for form_alert; gem/aes/form_/form_alert.ui; form + 8 11 2 form_button; gem/aes/form_/form_button.ui; form + 8 11 2 1 Bindings for form_button; gem/aes/form_/form_button.ui; form + 8 11 3 form_center; gem/aes/form_/form_center.ui; form + 8 11 3 1 Bindings for form_center; gem/aes/form_/form_center.ui; form + 8 11 4 form_dial; gem/aes/form_/form_dial.ui; form + 8 11 4 1 Bindings for form_dial; gem/aes/form_/form_dial.ui; form + 8 11 5 form_do; gem/aes/form_/form_do.ui; form + 8 11 5 1 Bindings for form_do; gem/aes/form_/form_do.ui; form + 8 11 6 form_error; gem/aes/form_/form_error.ui; form + 8 11 6 1 Bindings for form_error; gem/aes/form_/form_error.ui; form + 8 11 7 form_keybd; gem/aes/form_/form_keybd.ui; form + 8 11 7 1 Bindings for form_keybd; gem/aes/form_/form_keybd.ui; form + 8 11 8 form_popup; gem/aes/form_/form_popup.ui; form + 8 11 8 1 Bindings for form_popup; gem/aes/form_/form_popup.ui; form + 8 11 9 form_wbutton; gem/aes/form_/form_wbutton.ui; form + 8 11 9 1 Bindings for form_wbutton; gem/aes/form_/form_wbutton.ui; form + 8 11 10 form_wkeybd; gem/aes/form_/form_wkeybd.ui; form + 8 11 10 1 Bindings for form_wkeybd; gem/aes/form_/form_wkeybd.ui; form + 8 11 11 form_xdial; gem/aes/form_/form_xdial.ui; form + 8 11 11 1 Bindings for form_xdial; gem/aes/form_/form_xdial.ui; form + 8 11 12 form_xdo; gem/aes/form_/form_xdo.ui; form + 8 11 12 1 Bindings for form_xdo; gem/aes/form_/form_xdo.ui; form + 8 11 13 form_xerr; gem/aes/form_/form_xerr.ui; form + 8 11 13 1 Bindings for form_xerr; gem/aes/form_/form_xerr.ui; form + 8 11 14 xfrm_popup; gem/aes/form_/xfrm_popup.ui; form + 8 11 14 1 Bindings for xfrm_popup; gem/aes/form_/xfrm_popup.ui; form + 8 11 15 x_form_center; gem/aes/form_/x_form_center.ui; form + 8 11 15 1 Bindings for x_form_center; gem/aes/form_/x_form_center.ui; form + 8 11 16 x_form_error; gem/aes/form_/x_form_error.ui; form + 8 11 16 1 Bindings for x_form_error; gem/aes/form_/x_form_error.ui; form + 8 11 17 x_form_filename; gem/aes/form_/x_form_filename.ui; form + 8 11 17 1 Bindings for x_form_filename; gem/aes/form_/x_form_filename.ui; form + 8 11 18 x_form_mouse; gem/aes/form_/x_form_mouse.ui; form + 8 11 18 1 Bindings for x_form_mouse; gem/aes/form_/x_form_mouse.ui; form + 8 12 Geneva library; gem/aes/geneva_/geneva_.u; geneva_function + 8 12 1 x_help; gem/aes/geneva_/x_help.ui; geneva_function + 8 12 1 1 Bindings for x_help; gem/aes/geneva_/x_help.ui; geneva_function + 8 12 2 x_malloc; gem/aes/geneva_/x_malloc.ui; geneva_function + 8 12 2 1 Bindings for x_malloc; gem/aes/geneva_/x_malloc.ui; geneva_function + 8 12 3 x_mfree; gem/aes/geneva_/x_mfree.ui; geneva_function + 8 12 3 1 Bindings for x_mfree; gem/aes/geneva_/x_mfree.ui; geneva_function + 8 12 4 x_mshrink; gem/aes/geneva_/x_mshrink.ui; geneva_function + 8 12 4 1 Bindings for x_mshrink; gem/aes/geneva_/x_mshrink.ui; geneva_function + 8 12 5 x_realloc; gem/aes/geneva_/x_realloc.ui; geneva_function + 8 12 5 1 Bindings for x_realloc; gem/aes/geneva_/x_realloc.ui; geneva_function + 8 12 6 x_settings; gem/aes/geneva_/x_settings.ui; geneva_function + 8 12 6 1 Bindings for x_settings; gem/aes/geneva_/x_settings.ui; geneva_function + 8 12 7 x_sprintf; gem/aes/geneva_/x_sprintf.ui; geneva_function + 8 12 7 1 Bindings for x_sprintf; gem/aes/geneva_/x_sprintf.ui; geneva_function + 8 12 8 x_sscanf; gem/aes/geneva_/x_sscanf.ui; geneva_function + 8 12 8 1 Bindings for x_sscanf; gem/aes/geneva_/x_sscanf.ui; geneva_function + 8 13 Graphics library; gem/aes/graf_/graf_.u; graf + 8 13 1 graf_dragbox; gem/aes/graf_/graf_dragbox.ui; graf + 8 13 1 1 Bindings for graf_dragbox; gem/aes/graf_/graf_dragbox.ui; graf + 8 13 2 graf_growbox; gem/aes/graf_/graf_growbox.ui; graf + 8 13 2 1 Bindings for graf_growbox; gem/aes/graf_/graf_growbox.ui; graf + 8 13 3 graf_handle; gem/aes/graf_/graf_handle.ui; graf + 8 13 3 1 Bindings for graf_handle; gem/aes/graf_/graf_handle.ui; graf + 8 13 4 graf_mbox/graf_movebox; gem/aes/graf_/graf_mbox.ui; graf + 8 13 4 1 Bindings for graf_mbox; gem/aes/graf_/graf_mbox.ui; graf + 8 13 5 graf_mkstate; gem/aes/graf_/graf_mkstate.ui; graf + 8 13 5 1 Bindings for graf_mkstate; gem/aes/graf_/graf_mkstate.ui; graf + 8 13 6 graf_mouse; gem/aes/graf_/graf_mouse.ui; graf + 8 13 6 1 Bindings for graf_mouse; gem/aes/graf_/graf_mouse.ui; graf + 8 13 7 graf_multirubber; gem/aes/graf_/graf_multirubber.ui; graf + 8 13 7 1 Bindings for graf_multirubber; gem/aes/graf_/graf_multirubber.ui; graf + 8 13 8 graf_rubberbox/graf_rubbox; gem/aes/graf_/graf_rubberbox.ui; graf + 8 13 8 1 Bindings for graf_rubberbox; gem/aes/graf_/graf_rubberbox.ui; graf + 8 13 9 graf_shrinkbox; gem/aes/graf_/graf_shrinkbox.ui; graf + 8 13 9 1 Bindings for graf_shrinkbox; gem/aes/graf_/graf_shrinkbox.ui; graf + 8 13 10 graf_slidebox; gem/aes/graf_/graf_slidebox.ui; graf + 8 13 10 1 graf_slidebox from Geneva; gem/aes/graf_/graf_slidebox.ui; graf + 8 13 10 2 Bindings for graf_slidebox; gem/aes/graf_/graf_slidebox.ui; graf + 8 13 11 graf_watchbox; gem/aes/graf_/graf_watchbox.ui; graf + 8 13 11 1 Bindings for graf_watchbox; gem/aes/graf_/graf_watchbox.ui; graf + 8 13 12 graf_wwatchbox; gem/aes/graf_/graf_wwatchbox.ui; graf + 8 13 12 1 Bindings for graf_wwatchbox; gem/aes/graf_/graf_wwatchbox.ui; graf + 8 13 13 graf_xhandle; gem/aes/graf_/graf_xhandle.ui; graf + 8 13 13 1 Bindings for graf_xhandle; gem/aes/graf_/graf_xhandle.ui; graf + 8 13 14 x_graf_blit; gem/aes/graf_/x_graf_blit.ui; graf + 8 13 14 1 Bindings for x_graf_blit; gem/aes/graf_/x_graf_blit.ui; graf + 8 13 15 x_graf_rast2rez; gem/aes/graf_/x_graf_rast2rez.ui; graf + 8 13 15 1 Bindings for x_graf_rast2rez; gem/aes/graf_/x_graf_rast2rez.ui; graf + 8 13 16 x_graf_rubberbox; gem/aes/graf_/x_graf_rubberbox.ui; graf + 8 13 16 1 Bindings for x_graf_rubberbox; gem/aes/graf_/x_graf_rubberbox.ui; graf + 8 14 Scrap library; gem/aes/scrp_/scrp_.u; scrp + 8 14 1 scrp_clear; gem/aes/scrp_/scrp_clear.ui; scrp + 8 14 1 1 Bindings for scrp_clear; gem/aes/scrp_/scrp_clear.ui; scrp + 8 14 2 scrp_read; gem/aes/scrp_/scrp_read.ui; scrp + 8 14 2 1 Bindings for scrp_read; gem/aes/scrp_/scrp_read.ui; scrp + 8 14 3 scrp_write; gem/aes/scrp_/scrp_write.ui; scrp + 8 14 3 1 Bindings for scrp_write; gem/aes/scrp_/scrp_write.ui; scrp + 8 14 4 x_scrp_get; gem/aes/scrp_/x_scrp_get.ui; scrp + 8 14 4 1 Bindings for x_scrp_get; gem/aes/scrp_/x_scrp_get.ui; scrp + 8 15 List boxes; gem/aes/lbox_/lbox_.u; lbox + 8 15 1 lbox_ascroll_to; gem/aes/lbox_/lbox_ascroll_to.ui; lbox + 8 15 1 1 Bindings for lbox_ascroll_to; gem/aes/lbox_/lbox_ascroll_to.ui; lbox + 8 15 2 lbox_bscroll_to; gem/aes/lbox_/lbox_bscroll_to.ui; lbox + 8 15 2 1 Bindings for lbox_bscroll_to; gem/aes/lbox_/lbox_bscroll_to.ui; lbox + 8 15 3 lbox_cnt_items; gem/aes/lbox_/lbox_cnt_items.ui; lbox + 8 15 3 1 Bindings for lbox_cnt_items; gem/aes/lbox_/lbox_cnt_items.ui; lbox + 8 15 4 lbox_create; gem/aes/lbox_/lbox_create.ui; lbox + 8 15 4 1 Bindings for lbox_create; gem/aes/lbox_/lbox_create.ui; lbox + 8 15 5 lbox_delete; gem/aes/lbox_/lbox_delete.ui; lbox + 8 15 5 1 Bindings for lbox_delete; gem/aes/lbox_/lbox_delete.ui; lbox + 8 15 6 lbox_do; gem/aes/lbox_/lbox_do.ui; lbox + 8 15 6 1 Bindings for lbox_do; gem/aes/lbox_/lbox_do.ui; lbox + 8 15 7 lbox_free_items; gem/aes/lbox_/lbox_free_items.ui; lbox + 8 15 7 1 Bindings for lbox_free_items; gem/aes/lbox_/lbox_free_items.ui; lbox + 8 15 8 lbox_free_list; gem/aes/lbox_/lbox_free_list.ui; lbox + 8 15 8 1 Bindings for lbox_free_list; gem/aes/lbox_/lbox_free_list.ui; lbox + 8 15 9 lbox_get_afirst; gem/aes/lbox_/lbox_get_afirst.ui; lbox + 8 15 9 1 Bindings for lbox_get_afirst; gem/aes/lbox_/lbox_get_afirst.ui; lbox + 8 15 10 lbox_get_avis; gem/aes/lbox_/lbox_get_avis.ui; lbox + 8 15 10 1 Bindings for lbox_get_avis; gem/aes/lbox_/lbox_get_avis.ui; lbox + 8 15 11 lbox_get_bentries; gem/aes/lbox_/lbox_get_bentries.ui; lbox + 8 15 11 1 Bindings for lbox_get_bentries; gem/aes/lbox_/lbox_get_bentries.ui; lbox + 8 15 12 lbox_get_bfirst; gem/aes/lbox_/lbox_get_bfirst.ui; lbox + 8 15 12 1 Bindings for lbox_get_bfirst; gem/aes/lbox_/lbox_get_bfirst.ui; lbox + 8 15 13 lbox_get_bvis; gem/aes/lbox_/lbox_get_bvis.ui; lbox + 8 15 13 1 Bindings for lbox_get_bvis; gem/aes/lbox_/lbox_get_bvis.ui; lbox + 8 15 14 lbox_get_idx; gem/aes/lbox_/lbox_get_idx.ui; lbox + 8 15 14 1 Bindings for lbox_get_idx; gem/aes/lbox_/lbox_get_idx.ui; lbox + 8 15 15 lbox_get_item; gem/aes/lbox_/lbox_get_item.ui; lbox + 8 15 15 1 Bindings for lbox_get_item; gem/aes/lbox_/lbox_get_item.ui; lbox + 8 15 16 lbox_get_items; gem/aes/lbox_/lbox_get_items.ui; lbox + 8 15 16 1 Bindings for lbox_get_items; gem/aes/lbox_/lbox_get_items.ui; lbox + 8 15 17 lbox_get_slct_idx; gem/aes/lbox_/lbox_get_slct_idx.ui; lbox + 8 15 17 1 Bindings for lbox_get_slct_idx; gem/aes/lbox_/lbox_get_slct_idx.ui; lbox + 8 15 18 lbox_get_slct_item; gem/aes/lbox_/lbox_get_slct_item.ui; lbox + 8 15 18 1 Bindings for lbox_get_slct_item; gem/aes/lbox_/lbox_get_slct_item.ui; lbox + 8 15 19 lbox_get_tree; gem/aes/lbox_/lbox_get_tree.ui; lbox + 8 15 19 1 Bindings for lbox_get_tree; gem/aes/lbox_/lbox_get_tree.ui; lbox + 8 15 20 lbox_get_udata; gem/aes/lbox_/lbox_get_udata.ui; lbox + 8 15 20 1 Bindings for lbox_get_udata; gem/aes/lbox_/lbox_get_udata.ui; lbox + 8 15 21 lbox_set_asldr; gem/aes/lbox_/lbox_set_asldr.ui; lbox + 8 15 21 1 Bindings for lbox_set_asldr; gem/aes/lbox_/lbox_set_asldr.ui; lbox + 8 15 22 lbox_set_bentries; gem/aes/lbox_/lbox_set_bentries.ui; lbox + 8 15 22 1 Bindings for lbox_set_bentries; gem/aes/lbox_/lbox_set_bentries.ui; lbox + 8 15 23 lbox_set_bsldr; gem/aes/lbox_/lbox_set_bsldr.ui; lbox + 8 15 23 1 Bindings for lbox_set_bsldr; gem/aes/lbox_/lbox_set_bsldr.ui; lbox + 8 15 24 lbox_set_items; gem/aes/lbox_/lbox_set_items.ui; lbox + 8 15 24 1 Bindings for lbox_set_items; gem/aes/lbox_/lbox_set_items.ui; lbox + 8 15 25 lbox_update; gem/aes/lbox_/lbox_update.ui; lbox + 8 15 25 1 Bindings for lbox_update; gem/aes/lbox_/lbox_update.ui; lbox + 8 15 26 Calling procedure for modal dialogs; gem/aes/lbox_/use.ui; lbox + 8 15 27 Flags for the behaviour of the list box; gem/aes/lbox_/flags.ui; lbox + 8 16 MagiC library; gem/aes/magic_/magic_.u; magic_function + 8 16 1 sys_set_getdisp; gem/aes/magic_/sys_set_getdisp.ui; magic_function + 8 16 1 1 Bindings for sys_set_getdisp; gem/aes/magic_/sys_set_getdisp.ui; magic_function + 8 16 2 sys_recalc_cicon_colours; gem/aes/magic_/sys_recalc_cicon_colours.ui; magic_function + 8 16 2 1 Bindings for sys_recalc_cicon_colours; gem/aes/magic_/sys_recalc_cicon_colours.ui; magic_function + 8 16 3 sys_set_editob; gem/aes/magic_/sys_set_editob.ui; magic_function + 8 16 3 1 Bindings for sys_set_editob; gem/aes/magic_/sys_set_editob.ui; magic_function + 8 16 4 sys_set_getfn; gem/aes/magic_/sys_set_getfn.ui; magic_function + 8 16 4 1 Bindings for sys_set_getfn; gem/aes/magic_/sys_set_getfn.ui; magic_function + 8 16 5 sys_set_setfn; gem/aes/magic_/sys_set_setfn.ui; magic_function + 8 16 5 1 Bindings for sys_set_setfn; gem/aes/magic_/sys_set_setfn.ui; magic_function + 8 16 6 sys_set_winframe_manager; gem/aes/magic_/sys_set_winframe_manager.ui; magic_function + 8 16 6 1 Bindings for sys_set_winframe_manager; gem/aes/magic_/sys_set_winframe_manager.ui; magic_function + 8 16 7 sys_set_appl_getinfo; gem/aes/magic_/sys_set_appl_getinfo.ui; magic_function + 8 16 7 1 Bindings for sys_set_appl_getinfo; gem/aes/magic_/sys_set_appl_getinfo.ui; magic_function + 8 17 Menu library; gem/aes/menu_/menu_.u; menu + 8 17 1 menu_attach; gem/aes/menu_/menu_attach.ui; menu + 8 17 1 1 Bindings for menu_attach; gem/aes/menu_/menu_attach.ui; menu + 8 17 2 menu_bar; gem/aes/menu_/menu_bar.ui; menu + 8 17 2 1 Bindings for menu_bar; gem/aes/menu_/menu_bar.ui; menu + 8 17 3 menu_click; gem/aes/menu_/menu_click.ui; menu + 8 17 3 1 Bindings for menu_click; gem/aes/menu_/menu_click.ui; menu + 8 17 4 menu_icheck; gem/aes/menu_/menu_icheck.ui; menu + 8 17 4 1 Bindings for menu_icheck; gem/aes/menu_/menu_icheck.ui; menu + 8 17 5 menu_ienable; gem/aes/menu_/menu_ienable.ui; menu + 8 17 5 1 Bindings for menu_ienable; gem/aes/menu_/menu_ienable.ui; menu + 8 17 6 menu_istart; gem/aes/menu_/menu_istart.ui; menu + 8 17 6 1 Bindings for menu_istart; gem/aes/menu_/menu_istart.ui; menu + 8 17 7 menu_popup; gem/aes/menu_/menu_popup.ui; menu + 8 17 7 1 Bindings for menu_popup; gem/aes/menu_/menu_popup.ui; menu + 8 17 8 menu_register; gem/aes/menu_/menu_register.ui; menu + 8 17 8 1 Bindings for menu_register; gem/aes/menu_/menu_register.ui; menu + 8 17 9 menu_settings; gem/aes/menu_/menu_settings.ui; menu + 8 17 9 1 Bindings for menu_settings; gem/aes/menu_/menu_settings.ui; menu + 8 17 10 menu_text; gem/aes/menu_/menu_text.ui; menu + 8 17 10 1 Bindings for menu_text; gem/aes/menu_/menu_text.ui; menu + 8 17 11 menu_tnormal; gem/aes/menu_/menu_tnormal.ui; menu + 8 17 11 1 Bindings for menu_tnormal; gem/aes/menu_/menu_tnormal.ui; menu + 8 17 12 menu_unregister; gem/aes/menu_/menu_unregister.ui; menu + 8 17 12 1 Bindings for menu_unregister; gem/aes/menu_/menu_unregister.ui; menu + 8 18 Object library; gem/aes/objc_/objc_.u; objc + 8 18 1 objc_add; gem/aes/objc_/objc_add.ui; objc + 8 18 1 1 Bindings for objc_add; gem/aes/objc_/objc_add.ui; objc + 8 18 2 objc_change; gem/aes/objc_/objc_change.ui; objc + 8 18 2 1 Bindings for objc_change; gem/aes/objc_/objc_change.ui; objc + 8 18 3 objc_delete; gem/aes/objc_/objc_delete.ui; objc + 8 18 3 1 Bindings for objc_delete; gem/aes/objc_/objc_delete.ui; objc + 8 18 4 objc_draw; gem/aes/objc_/objc_draw.ui; objc + 8 18 4 1 Bindings for objc_draw; gem/aes/objc_/objc_draw.ui; objc + 8 18 5 objc_edit; gem/aes/objc_/objc_edit.ui; objc + 8 18 5 1 Bindings for objc_edit; gem/aes/objc_/objc_edit.ui; objc + 8 18 6 objc_find; gem/aes/objc_/objc_find.ui; objc + 8 18 6 1 Bindings for objc_find; gem/aes/objc_/objc_find.ui; objc + 8 18 7 objc_offset; gem/aes/objc_/objc_offset.ui; objc + 8 18 7 1 Bindings for objc_offset; gem/aes/objc_/objc_offset.ui; objc + 8 18 8 objc_order; gem/aes/objc_/objc_order.ui; objc + 8 18 8 1 Bindings for objc_order; gem/aes/objc_/objc_order.ui; objc + 8 18 9 objc_sysvar; gem/aes/objc_/objc_sysvar.ui; objc + 8 18 9 1 Bindings for objc_sysvar; gem/aes/objc_/objc_sysvar.ui; objc + 8 18 10 objc_wchange; gem/aes/objc_/objc_wchange.ui; objc + 8 18 10 1 Bindings for objc_wchange; gem/aes/objc_/objc_wchange.ui; objc + 8 18 11 objc_wdraw; gem/aes/objc_/objc_wdraw.ui; objc + 8 18 11 1 Bindings for objc_wdraw; gem/aes/objc_/objc_wdraw.ui; objc + 8 18 12 objc_wedit; gem/aes/objc_/objc_wedit.ui; objc + 8 18 12 1 Bindings for objc_wedit; gem/aes/objc_/objc_wedit.ui; objc + 8 18 13 objc_xedit; gem/aes/objc_/objc_xedit.ui; objc + 8 18 13 1 Bindings for objc_xedit; gem/aes/objc_/objc_xedit.ui; objc + 8 18 14 objc_xfind; gem/aes/objc_/objc_xfind.ui; objc + 8 18 14 1 Bindings for objc_xfind; gem/aes/objc_/objc_xfind.ui; objc + 8 18 15 x_objc_edit; gem/aes/objc_/x_objc_edit.ui; objc + 8 18 15 1 Bindings for x_objc_edit; gem/aes/objc_/x_objc_edit.ui; objc + 8 19 Process library; gem/aes/proc_/proc_.u; proc + 8 19 1 proc_create; gem/aes/proc_/proc_create.ui; proc + 8 19 1 1 Bindings for proc_create; gem/aes/proc_/proc_create.ui; proc + 8 19 2 proc_delete; gem/aes/proc_/proc_delete.ui; proc + 8 19 2 1 Bindings for proc_delete; gem/aes/proc_/proc_delete.ui; proc + 8 19 3 proc_info; gem/aes/proc_/proc_info.ui; proc + 8 19 3 1 Bindings for proc_info; gem/aes/proc_/proc_info.ui; proc + 8 19 4 proc_malloc; gem/aes/proc_/proc_malloc.ui; proc + 8 19 4 1 Bindings for proc_malloc; gem/aes/proc_/proc_malloc.ui; proc + 8 19 5 proc_mfree; gem/aes/proc_/proc_mfree.ui; proc + 8 19 5 1 Bindings for proc_mfree; gem/aes/proc_/proc_mfree.ui; proc + 8 19 6 proc_run; gem/aes/proc_/proc_run.ui; proc + 8 19 6 1 Bindings for proc_run; gem/aes/proc_/proc_run.ui; proc + 8 19 7 proc_setblock; gem/aes/proc_/proc_setblock.ui; proc + 8 19 7 1 Bindings for proc_setblock; gem/aes/proc_/proc_setblock.ui; proc + 8 19 8 proc_shrink; gem/aes/proc_/proc_shrink.ui; proc + 8 19 8 1 Bindings for proc_shrink; gem/aes/proc_/proc_shrink.ui; proc + 8 19 9 proc_switch; gem/aes/proc_/proc_switch.ui; proc + 8 19 9 1 Bindings for proc_switch; gem/aes/proc_/proc_switch.ui; proc + 8 20 Property library; gem/aes/prop_/prop_.u; prop + 8 20 1 prop_del; gem/aes/prop_/prop_del.ui; prop + 8 20 1 1 Bindings for prop_del; gem/aes/prop_/prop_del.ui; prop + 8 20 2 prop_get; gem/aes/prop_/prop_get.ui; prop + 8 20 2 1 Bindings for prop_get; gem/aes/prop_/prop_get.ui; prop + 8 20 3 prop_gui_get; gem/aes/prop_/prop_gui_get.ui; prop + 8 20 3 1 Bindings for prop_gui_get; gem/aes/prop_/prop_gui_get.ui; prop + 8 20 4 prop_gui_set; gem/aes/prop_/prop_gui_set.ui; prop + 8 20 4 1 Bindings for prop_gui_set; gem/aes/prop_/prop_gui_set.ui; prop + 8 20 5 prop_put; gem/aes/prop_/prop_put.ui; prop + 8 20 5 1 Bindings for prop_put; gem/aes/prop_/prop_put.ui; prop + 8 21 Resource library; gem/aes/rsrc_/rsrc_.u; rsrc + 8 21 1 rsrc_free; gem/aes/rsrc_/rsrc_free.ui; rsrc + 8 21 1 1 Bindings for rsrc_free; gem/aes/rsrc_/rsrc_free.ui; rsrc + 8 21 2 rsrc_gaddr; gem/aes/rsrc_/rsrc_gaddr.ui; rsrc + 8 21 2 1 Bindings for rsrc_gaddr; gem/aes/rsrc_/rsrc_gaddr.ui; rsrc + 8 21 3 rsrc_load; gem/aes/rsrc_/rsrc_load.ui; rsrc + 8 21 3 1 Bindings for rsrc_load; gem/aes/rsrc_/rsrc_load.ui; rsrc + 8 21 4 rsrc_obfix; gem/aes/rsrc_/rsrc_obfix.ui; rsrc + 8 21 4 1 Bindings for rsrc_obfix; gem/aes/rsrc_/rsrc_obfix.ui; rsrc + 8 21 5 rsrc_rcfix; gem/aes/rsrc_/rsrc_rcfix.ui; rsrc + 8 21 5 1 Bindings for rsrc_rcfix; gem/aes/rsrc_/rsrc_rcfix.ui; rsrc + 8 21 6 rsrc_saddr; gem/aes/rsrc_/rsrc_saddr.ui; rsrc + 8 21 6 1 Bindings for rsrc_saddr; gem/aes/rsrc_/rsrc_saddr.ui; rsrc + 8 22 Shell library; gem/aes/shel_/shel_.u; shel + 8 22 1 shel_envrn; gem/aes/shel_/shel_envrn.ui; shel + 8 22 1 1 Bindings for shel_envrn; gem/aes/shel_/shel_envrn.ui; shel + 8 22 2 shel_find; gem/aes/shel_/shel_find.ui; shel + 8 22 2 1 Bindings for shel_find; gem/aes/shel_/shel_find.ui; shel + 8 22 3 shel_get; gem/aes/shel_/shel_get.ui; shel + 8 22 3 1 Bindings for shel_get; gem/aes/shel_/shel_get.ui; shel + 8 22 4 shel_help; gem/aes/shel_/shel_help.ui; shel + 8 22 4 1 Bindings for shel_help; gem/aes/shel_/shel_help.ui; shel + 8 22 5 shel_put; gem/aes/shel_/shel_put.ui; shel + 8 22 5 1 Bindings for shel_put; gem/aes/shel_/shel_put.ui; shel + 8 22 6 shel_rdef; gem/aes/shel_/shel_rdef.ui; shel + 8 22 6 1 Bindings for shel_rdef; gem/aes/shel_/shel_rdef.ui; shel + 8 22 7 shel_read; gem/aes/shel_/shel_read.ui; shel + 8 22 7 1 Bindings for shel_read; gem/aes/shel_/shel_read.ui; shel + 8 22 8 shel_wdef; gem/aes/shel_/shel_wdef.ui; shel + 8 22 8 1 Bindings for shel_wdef; gem/aes/shel_/shel_wdef.ui; shel + 8 22 9 shel_write; gem/aes/shel_/shel_write.ui; shel + 8 22 9 1 Bindings for shel_write; gem/aes/shel_/shel_write.ui; shel + 8 22 10 x_shel_get; gem/aes/shel_/x_shel_get.ui; shel + 8 22 10 1 Bindings for x_shel_get; gem/aes/shel_/x_shel_get.ui; shel + 8 22 11 x_shel_put; gem/aes/shel_/x_shel_put.ui; shel + 8 22 11 1 Bindings for x_shel_put; gem/aes/shel_/x_shel_put.ui; shel + 8 23 Extended graphics library; gem/aes/xgrf_/xgrf_.u; xgrf + 8 23 1 xgrf_2box; gem/aes/xgrf_/xgrf_2box.ui; xgrf + 8 23 2 Bindings for xgrf_2box; gem/aes/xgrf_/xgrf_2box.ui; xgrf + 8 23 3 xgrf_stepcalc; gem/aes/xgrf_/xgrf_stepcalc.ui; xgrf + 8 23 4 Bindings for xgrf_stepcalc; gem/aes/xgrf_/xgrf_stepcalc.ui; xgrf + 8 23 5 xgrf_color; gem/aes/xgrf_/xgrf_color.ui; xgrf + 8 23 6 xgrf_dtimage; gem/aes/xgrf_/xgrf_dtimage.ui; xgrf + 8 24 Extended shell library; gem/aes/xshl_/xshl_.u; xshl + 8 24 1 xshl_getshell; gem/aes/xshl_/xshl_getshell.ui; xshl + 8 24 1 1 Bindings for xshl_getshell; gem/aes/xshl_/xshl_getshell.ui; xshl + 8 24 2 xshl_setshell; gem/aes/xshl_/xshl_setshell.ui; xshl + 8 24 2 1 Bindings for xshl_setshell; gem/aes/xshl_/xshl_setshell.ui; xshl + 8 25 Font selection; gem/aes/fnts_/fnts_.u; fnts + 8 25 1 fnts_add; gem/aes/fnts_/fnts_add.ui; fnts + 8 25 1 1 Bindings for fnts_add; gem/aes/fnts_/fnts_add.ui; fnts + 8 25 2 fnts_close; gem/aes/fnts_/fnts_close.ui; fnts + 8 25 2 1 Bindings for fnts_close; gem/aes/fnts_/fnts_close.ui; fnts + 8 25 3 fnts_create; gem/aes/fnts_/fnts_create.ui; fnts + 8 25 3 1 Bindings for fnts_create; gem/aes/fnts_/fnts_create.ui; fnts + 8 25 4 fnts_delete; gem/aes/fnts_/fnts_delete.ui; fnts + 8 25 4 1 Bindings for fnts_delete; gem/aes/fnts_/fnts_delete.ui; fnts + 8 25 5 fnts_do; gem/aes/fnts_/fnts_do.ui; fnts + 8 25 5 1 Bindings for fnts_do; gem/aes/fnts_/fnts_do.ui; fnts + 8 25 6 fnts_evnt; gem/aes/fnts_/fnts_evnt.ui; fnts + 8 25 6 1 Bindings for fnts_evnt; gem/aes/fnts_/fnts_evnt.ui; fnts + 8 25 7 fnts_get_info; gem/aes/fnts_/fnts_get_info.ui; fnts + 8 25 7 1 Bindings for fnts_get_info; gem/aes/fnts_/fnts_get_info.ui; fnts + 8 25 8 fnts_get_name; gem/aes/fnts_/fnts_get_name.ui; fnts + 8 25 8 1 Bindings for fnts_get_name; gem/aes/fnts_/fnts_get_name.ui; fnts + 8 25 9 fnts_get_no_styles; gem/aes/fnts_/fnts_get_no_styles.ui; fnts + 8 25 9 1 Bindings for fnts_get_no_styles; gem/aes/fnts_/fnts_get_no_styles.ui; fnts + 8 25 10 fnts_get_style; gem/aes/fnts_/fnts_get_style.ui; fnts + 8 25 10 1 Bindings for fnts_get_style; gem/aes/fnts_/fnts_get_style.ui; fnts + 8 25 11 fnts_open; gem/aes/fnts_/fnts_open.ui; fnts + 8 25 11 1 Bindings for fnts_open; gem/aes/fnts_/fnts_open.ui; fnts + 8 25 12 fnts_remove; gem/aes/fnts_/fnts_remove.ui; fnts + 8 25 12 1 Bindings for fnts_remove; gem/aes/fnts_/fnts_remove.ui; fnts + 8 25 13 fnts_update; gem/aes/fnts_/fnts_update.ui; fnts + 8 25 13 1 Bindings for fnts_update; gem/aes/fnts_/fnts_update.ui; fnts + 8 25 14 Font selector in a window; gem/aes/fnts_/use.ui; fnts + 8 25 15 Font selector in a modal dialog; gem/aes/fnts_/use.ui; fnts + 8 26 AES function list; gem/aes/aes_f.u; aes_functions + 8 27 AES structures; gem/aes/structures/structures.u; aes_structures + 8 27 1 AESPB; gem/aes/structures/structures.u; aes_structures + 8 27 2 ANI_MOUSE; gem/aes/structures/ANI_MOUSE.ui; aes_structures + 8 27 3 APPFLAGS; gem/aes/structures/APPFLAGS.ui; aes_structures + 8 27 4 APFLG; gem/aes/structures/APPFLG.ui; aes_structures + 8 27 5 APPLRECORD; gem/aes/structures/applrecord.ui; aes_structures + 8 27 6 The bit-block structure; gem/aes/structures/bitblk.ui; aes_structures + 8 27 7 CICON; gem/aes/structures/cicon.ui; aes_structures + 8 27 8 CICONBLK; gem/aes/structures/ciconblk.ui; aes_structures + 8 27 9 CLRCAT; gem/aes/structures/clrcat.ui; aes_structures + 8 27 10 DIALOG; gem/aes/structures/dialog.ui; aes_structures + 8 27 11 DITHER_MODE; gem/aes/structures/dither_mode.ui; aes_structures + 8 27 12 DRV_ENTRY; gem/aes/structures/drv_entry.ui; aes_structures + 8 27 13 DRV_INFO; gem/aes/structures/drv_info.ui; aes_structures + 8 27 14 EVNT; gem/aes/structures/evnt.ui; aes_structures + 8 27 15 FNTS_ITEM; gem/aes/structures/fnts_item.ui; aes_structures + 8 27 16 FNT_DIALOG; gem/aes/structures/fnt_dialog.ui; aes_structures + 8 27 17 G_VECTORS; gem/aes/structures/G_VECTORS.ui; aes_structures + 8 27 18 HNDL_OBJ; gem/aes/structures/hndl_obj.ui; aes_structures + 8 27 18 1 Example for HNDL_OBJ; gem/aes/structures/hndl_obj.ui; aes_structures + 8 27 18 2 HNDL_INIT; gem/aes/structures/hndl_obj.ui; aes_structures + 8 27 18 3 HNDL_MESG; gem/aes/structures/hndl_obj.ui; aes_structures + 8 27 18 4 HNDL_OPEN; gem/aes/structures/hndl_obj.ui; aes_structures + 8 27 18 5 HNDL_CLSD; gem/aes/structures/hndl_obj.ui; aes_structures + 8 27 18 6 HNDL_MOVE; gem/aes/structures/hndl_obj.ui; aes_structures + 8 27 18 7 HNDL_TOPW; gem/aes/structures/hndl_obj.ui; aes_structures + 8 27 18 8 HNDL_UNTP; gem/aes/structures/hndl_obj.ui; aes_structures + 8 27 18 9 HNDL_EDIT; gem/aes/structures/hndl_obj.ui; aes_structures + 8 27 18 10 HNDL_EDDN; gem/aes/structures/hndl_obj.ui; aes_structures + 8 27 18 11 HNDL_EDCH; gem/aes/structures/hndl_obj.ui; aes_structures + 8 27 19 ICONBLK; gem/aes/structures/iconblk.ui; aes_structures + 8 27 20 KEYCODE; gem/aes/structures/KEYCODE.ui; aes_structures + 8 27 21 LBOX_ITEM; gem/aes/structures/lbox_item.ui; aes_structures + 8 27 22 LIST_BOX; gem/aes/structures/list_box.ui; aes_structures + 8 27 23 MEDIA_SIZE; gem/aes/structures/media_size.ui; aes_structures + 8 27 24 MEDIA_TYPE; gem/aes/structures/media_type.ui; aes_structures + 8 27 25 MENU; gem/aes/structures/menu.ui; aes_structures + 8 27 26 MFORM; gem/aes/structures/mform.ui; aes_structures + 8 27 27 MN_SET; gem/aes/structures/mn_set.ui; aes_structures + 8 27 28 OBJECT; gem/aes/structures/object.ui; aes_structures + 8 27 29 OB_PREFER; gem/aes/structures/OB_PREFER.ui; aes_structures + 8 27 30 PARMBLK; gem/aes/structures/parmblk.ui; aes_structures + 8 27 31 PDLG_HNDL; gem/aes/structures/pdlg_hndl.ui; aes_structures + 8 27 32 PDLG_INIT; gem/aes/structures/pdlg_init.ui; aes_structures + 8 27 33 PDLG_RESET; gem/aes/structures/pdlg_reset.ui; aes_structures + 8 27 34 PDLG_SUB; gem/aes/structures/pdlg_sub.ui; aes_structures + 8 27 35 POPINFO; gem/aes/structures/popinfo.ui; aes_structures + 8 27 36 PRN_DIALOG; gem/aes/structures/prn_dialog.ui; aes_structures + 8 27 37 PRN_ENTRY; gem/aes/structures/prn_entry.ui; aes_structures + 8 27 38 PRN_MODE; gem/aes/structures/prn_mode.ui; aes_structures + 8 27 39 PRN_SETTINGS; gem/aes/structures/prn_settings.ui; aes_structures + 8 27 40 PRN_SWITCH; gem/aes/structures/prn_switch.ui; aes_structures + 8 27 41 PRN_TRAY; gem/aes/structures/prn_tray.ui; aes_structures + 8 27 42 RSHDR; gem/aes/structures/rshdr.ui; aes_structures + 8 27 43 RSXHDR; gem/aes/structures/rsxhdr.ui; aes_structures + 8 27 44 SCANX; gem/aes/structures/scanx.ui; aes_structures + 8 27 45 SETTINGS; gem/aes/structures/SETTINGS.ui; aes_structures + 8 27 46 SET_ITEM; gem/aes/structures/set_item.ui; aes_structures + 8 27 47 SHELTAIL; gem/aes/structures/sheltail.ui; aes_structures + 8 27 48 SHELW; gem/aes/structures/shelw.ui; aes_structures + 8 27 49 SLCT_ITEM; gem/aes/structures/slct_item.ui; aes_structures + 8 27 50 SWINFO; gem/aes/structures/swinfo.ui; aes_structures + 8 27 51 TEDINFO; gem/aes/structures/tedinfo.ui; aes_structures + 8 27 52 USERBLK; gem/aes/structures/userblk.ui; aes_structures + 8 27 53 UTXT_FN; gem/aes/structures/utxt_fn.ui; aes_structures + 8 27 54 WIND_TREE; gem/aes/structures/WIND_TREE.ui; aes_structures + 8 27 55 WINFRAME_HANDLER; gem/aes/structures/WINFRAME_HANDLER.ui; aes_structures + 8 27 56 WINFRAME_SETTINGS; gem/aes/structures/WINFRAME_SETTINGS.ui; aes_structures + 8 27 57 WININFO; gem/aes/structures/WININFO.ui; aes_structures + 8 27 58 XAESMSG; gem/aes/structures/xaesmsg.ui; aes_structures + 8 27 59 XDO_INF; gem/aes/structures/xdo_inf.ui; aes_structures + 8 27 60 XFONTINFO; gem/aes/structures/XFONTINFO.ui; aes_structures + 8 27 61 XFSL_FILTER; gem/aes/structures/xfsl_filter.ui; aes_structures + 8 27 62 XSHW_COMMAND; gem/aes/structures/xshw_command.ui; aes_structures + 8 27 63 XTED; gem/aes/structures/xted.ui; aes_structures + 8 27 64 X_BUF_V2; gem/aes/structures/x_buf_v2.ui; aes_structures + 9 XCONTROL; /home/runner/work/tos.hyp/tos.hyp/tos_hyp.u; xcontrol_main + 9 1 About XCONTROL; gem/cpxdoku.u; xcontrol + 9 1 1 CPX programming guidelines; gem/cpxdoku.u; xcontrol + 9 1 2 CPX functions; gem/cpxdoku.u; xcontrol + 9 1 2 1 cpx_button; gem/cpxdoku.u; xcontrol + 9 1 2 2 cpx_call; gem/cpxdoku.u; xcontrol + 9 1 2 3 cpx_close; gem/cpxdoku.u; xcontrol + 9 1 2 4 cpx_draw; gem/cpxdoku.u; xcontrol + 9 1 2 5 cpx_hook; gem/cpxdoku.u; xcontrol + 9 1 2 6 cpx_init; gem/cpxdoku.u; xcontrol + 9 1 2 7 cpx_m1; gem/cpxdoku.u; xcontrol + 9 1 2 8 cpx_m2; gem/cpxdoku.u; xcontrol + 9 1 2 9 cpx_key; gem/cpxdoku.u; xcontrol + 9 1 2 10 cpx_timer; gem/cpxdoku.u; xcontrol + 9 1 2 11 cpx_wmove; gem/cpxdoku.u; xcontrol + 9 1 3 XCONTROL functions; gem/cpxdoku.u; xcontrol + 9 1 3 1 CPX_Save; gem/cpxdoku.u; xcontrol + 9 1 3 2 Get_Buffer; gem/cpxdoku.u; xcontrol + 9 1 3 3 getcookie; gem/cpxdoku.u; xcontrol + 9 1 3 4 GetFirstRect; gem/cpxdoku.u; xcontrol + 9 1 3 5 GetNextRect; gem/cpxdoku.u; xcontrol + 9 1 3 6 MFsave; gem/cpxdoku.u; xcontrol + 9 1 3 7 Popup; gem/cpxdoku.u; xcontrol + 9 1 3 8 rsh_fix; gem/cpxdoku.u; xcontrol + 9 1 3 9 rsh_obfix; gem/cpxdoku.u; xcontrol + 9 1 3 10 Set_Evnt_Mask; gem/cpxdoku.u; xcontrol + 9 1 3 11 Sl_arrow; gem/cpxdoku.u; xcontrol + 9 1 3 12 Sl_dragx; gem/cpxdoku.u; xcontrol + 9 1 3 13 Sl_dragy; gem/cpxdoku.u; xcontrol + 9 1 3 14 Sl_size; gem/cpxdoku.u; xcontrol + 9 1 3 15 Sl_x; gem/cpxdoku.u; xcontrol + 9 1 3 16 Sl_y; gem/cpxdoku.u; xcontrol + 9 1 3 17 Xform_do; gem/cpxdoku.u; xcontrol + 9 1 3 18 XGen_Alert; gem/cpxdoku.u; xcontrol + 10 Programming guidelines; /home/runner/work/tos.hyp/tos.hyp/tos_hyp.u; guidelines + 10 1 Three important programming rules; gem/guidelns/style_en.u; guidelines_rules + 10 2 Style guidelines; gem/guidelns/style_en.u; guidelines_styles + 10 2 1 Dialog boxes; gem/guidelns/style_en.u; guidelines_styles + 10 2 2 Help systems; gem/guidelns/style_en.u; guidelines_styles + 10 2 3 Mouse clicks and shapes; gem/guidelns/style_en.u; guidelines_styles + 10 2 4 Menus and menu bars; gem/guidelns/style_en.u; guidelines_styles + 10 2 5 Visual and acoustic feedback; gem/guidelns/style_en.u; guidelines_styles + 10 2 6 Selections; gem/guidelns/style_en.u; guidelines_styles + 10 2 7 Special effects; gem/guidelns/style_en.u; guidelines_styles + 10 2 8 Key assignments; gem/guidelns/style_en.u; guidelines_styles + 10 2 9 Toolboxes; gem/guidelns/style_en.u; guidelines_styles + 11 MagiC; magic/magic_en.u; magic + 11 1 AESVARS, Pointer to AESVARS; magic/magic_en.u; magic_aesvars + 11 2 MAGX_COOKIE, status_bits; magic/magic_en.u; magic_cookie + 11 3 Extract from MagiC's BIOS; magic/magic_en.u; magic_bios + 11 4 The AUTOEXEC.BAT file in MagiC; magic/magic_en.u; magic_autoexec + 11 5 Notes about MagiC's 3D-look; magic/magic_en.u; magic_3dlook + 11 6 Input fields in MagiC; magic/magic_en.u; magic_editable + 11 7 Scrollable input fields; magic/magic_en.u; magic_scroll + 11 8 Special error-messages in MagiC; magic/magicerr.u; magic_errors + 11 8 1 Fatal error while booting; magic/magicerr.u; magic_errors + 11 8 2 Fatal error in gemdos; magic/magicerr.u; magic_errors + 11 8 3 Out of internal memory; magic/magicerr.u; magic_errors + 11 8 4 Memory block destroyed by user program; magic/magicerr.u; magic_errors + 11 8 5 Fatal error in aes; magic/magicerr.u; magic_errors + 11 8 6 System stack overflow; magic/magicerr.u; magic_errors + 11 9 The background-DMA of MagiC; magic/magic_en.u; magic_dma + 11 10 Iconification in MagiC; magic/magic_en.u; magic_iconify + 11 11 The drive U: in MagiC; magic/magic_en.u; magic_driveu + 11 11 1 The directory U:\DEV; magic/magic_en.u; magic_driveu + 11 11 2 The directory U:\PIPE; magic/magic_en.u; magic_driveu + 11 11 3 The directory U:\PROC; magic/magic_en.u; magic_driveu + 11 11 4 The directory U:\SHM; magic/magic_en.u; magic_driveu + 11 12 Make-up of the MAGX.INF file; magic/magicinf.u; magic_magxinf + 11 12 1 Example of a MAGX.INF file; magic/magicinf.u; magic_magxinf + 11 13 Semaphores in MagiC; magic/magic_en.u; magic_semaphore + 11 14 General remarks about shutdown; magic/shutdown/shutdown_en.ui; magic_shutdown + 11 14 1 Shutdown in MultiTOS; magic/shutdown/shutdown_en.ui; magic_shutdown + 11 14 2 Shutdown in MagiC; magic/shutdown/shutdown_en.ui; magic_shutdown + 11 14 3 Shutdown as seen by the application; magic/shutdown/shutdown_en.ui; magic_shutdown + 11 14 4 Shutdown as seen by the initiator; magic/shutdown/shutdown_en.ui; magic_shutdown + 11 15 Smart redraw in MagiC; magic/magic_en.u; magic_smartredraw + 11 16 The task-manager of MagiC; magic/magic_en.u; magic_taskmanager + 11 17 Test for MagiC; magic/magic_en.u; magic_test + 11 18 Threads in MagiC; magic/threads/threads.u; magic_threads + 11 18 1 Threads and signals; magic/threads/threads.u; magic_threads + 11 18 2 Threads and AES calls; magic/threads/threads.u; magic_threads + 11 18 3 Threads and VDI calls; magic/threads/vdi.u; magic_threads + 11 18 4 Apportionment of resources with threads; magic/threads/threads.u; magic_threads + 11 18 5 Threads, Example for; magic/threads/example.ui; magic_threads + 11 19 Additional programs for MagiC; magic/magic_en.u; magic_programs + 11 20 MagiC's DFS-concept; magic/DFS/dfs_en.ui; magic_dfs + 11 20 1 The make-up of a DFS; magic/DFS/dfs_en.ui; magic_dfs + 11 20 1 1 dfs_dfree; magic/DFS/dfs_en.ui; magic_dfs + 11 20 1 2 dfs_dir2FD; magic/DFS/dfs_en.ui; magic_dfs + 11 20 1 3 dfs_dir2index; magic/DFS/dfs_en.ui; magic_dfs + 11 20 1 4 dfs_drv_close; magic/DFS/dfs_en.ui; magic_dfs + 11 20 1 5 dfs_drv_open; magic/DFS/dfs_en.ui; magic_dfs + 11 20 1 6 dfs_ext_fd; magic/DFS/dfs_en.ui; magic_dfs + 11 20 1 7 dfs_fcreate; magic/DFS/dfs_en.ui; magic_dfs + 11 20 1 8 dfs_fdelete; magic/DFS/dfs_en.ui; magic_dfs + 11 20 1 9 dfs_fxattr; magic/DFS/dfs_en.ui; magic_dfs + 11 20 1 10 dfs_init; magic/DFS/dfs_en.ui; magic_dfs + 11 20 1 11 dfs_name; magic/DFS/dfs_en.ui; magic_dfs + 11 20 1 12 dfs_next; magic/DFS/dfs_en.ui; magic_dfs + 11 20 1 13 dfs_pathconf; magic/DFS/dfs_en.ui; magic_dfs + 11 20 1 14 dfs_readlink; magic/DFS/dfs_en.ui; magic_dfs + 11 20 1 15 dfs_sfirst; magic/DFS/dfs_en.ui; magic_dfs + 11 20 1 16 dfs_snext; magic/DFS/dfs_en.ui; magic_dfs + 11 20 1 17 dfs_sync; magic/DFS/dfs_en.ui; magic_dfs + 11 20 2 Data structures for a DFS; magic/DFS/dfs_en.ui; magic_dfs + 11 20 2 1 The directory entry (DIR); magic/DFS/dfs_en.ui; magic_dfs + 11 20 2 2 The device driver (MX_DDEV); magic/DFS/dfs_en.ui; magic_dfs + 11 20 2 2 1 ddev_open; magic/DFS/dfs_en.ui; magic_dfs + 11 20 2 2 2 ddev_close; magic/DFS/dfs_en.ui; magic_dfs + 11 20 2 2 3 ddev_read; magic/DFS/dfs_en.ui; magic_dfs + 11 20 2 2 4 ddev_write; magic/DFS/dfs_en.ui; magic_dfs + 11 20 2 2 5 ddev_stat; magic/DFS/dfs_en.ui; magic_dfs + 11 20 2 2 6 ddev_seek; magic/DFS/dfs_en.ui; magic_dfs + 11 20 2 2 7 ddev_datime; magic/DFS/dfs_en.ui; magic_dfs + 11 20 2 2 8 ddev_ioctl; magic/DFS/dfs_en.ui; magic_dfs + 11 20 2 2 9 ddev_delete; magic/DFS/dfs_en.ui; magic_dfs + 11 20 2 2 10 ddev_getc; magic/DFS/dfs_en.ui; magic_dfs + 11 20 2 2 11 ddev_getline; magic/DFS/dfs_en.ui; magic_dfs + 11 20 2 2 12 ddev_putc; magic/DFS/dfs_en.ui; magic_dfs + 11 20 2 3 The Disk Transfer Area (DTA) for DFSs; magic/DFS/dfs_en.ui; magic_dfs + 11 20 3 Installation of a DFS; magic/DFS/dfs_en.ui; magic_dfs + 11 21 MagiC's XFS-concept; magic/XFS/xfs_en.ui; magic_xfs + 11 21 1 General remarks about MagiC's XFS-concept; magic/XFS/xfs_en.ui; magic_xfs + 11 21 2 The make-up of an XFS; magic/XFS/xfs_en.ui; magic_xfs + 11 21 2 1 xfs_attrib; magic/XFS/xfs_en.ui; magic_xfs + 11 21 2 2 xfs_chmod; magic/XFS/xfs_en.ui; magic_xfs + 11 21 2 3 xfs_chown; magic/XFS/xfs_en.ui; magic_xfs + 11 21 2 4 xfs_dclosedir; magic/XFS/xfs_en.ui; magic_xfs + 11 21 2 5 xfs_dcntl; magic/XFS/xfs_en.ui; magic_xfs + 11 21 2 6 xfs_dcreate; magic/XFS/xfs_en.ui; magic_xfs + 11 21 2 7 xfs_ddelete; magic/XFS/xfs_en.ui; magic_xfs + 11 21 2 8 xfs_dfree; magic/XFS/xfs_en.ui; magic_xfs + 11 21 2 9 xfs_DD2name; magic/XFS/xfs_en.ui; magic_xfs + 11 21 2 10 xfs_dopendir; magic/XFS/xfs_en.ui; magic_xfs + 11 21 2 11 xfs_dpathconf; magic/XFS/xfs_en.ui; magic_xfs + 11 21 2 12 xfs_dreaddir; magic/XFS/xfs_en.ui; magic_xfs + 11 21 2 13 xfs_drewinddir; magic/XFS/xfs_en.ui; magic_xfs + 11 21 2 14 xfs_drv_close; magic/XFS/xfs_en.ui; magic_xfs + 11 21 2 15 xfs_drv_open; magic/XFS/xfs_en.ui; magic_xfs + 11 21 2 16 xfs_fdelete; magic/XFS/xfs_en.ui; magic_xfs + 11 21 2 17 xfs_flags; magic/XFS/xfs_en.ui; magic_xfs + 11 21 2 18 xfs_fopen; magic/XFS/xfs_en.ui; magic_xfs + 11 21 2 19 xfs_freeDD; magic/XFS/xfs_en.ui; magic_xfs + 11 21 2 20 xfs_garbcoll; magic/XFS/xfs_en.ui; magic_xfs + 11 21 2 21 xfs_init; magic/XFS/xfs_en.ui; magic_xfs + 11 21 2 22 xfs_link; magic/XFS/xfs_en.ui; magic_xfs + 11 21 2 23 xfs_name; magic/XFS/xfs_en.ui; magic_xfs + 11 21 2 24 xfs_next; magic/XFS/xfs_en.ui; magic_xfs + 11 21 2 25 xfs_path2DD; magic/XFS/xfs_en.ui; magic_xfs + 11 21 2 26 xfs_pterm; magic/XFS/xfs_en.ui; magic_xfs + 11 21 2 27 xfs_readlink; magic/XFS/xfs_en.ui; magic_xfs + 11 21 2 28 xfs_rlabel; magic/XFS/xfs_en.ui; magic_xfs + 11 21 2 29 xfs_sfirst; magic/XFS/xfs_en.ui; magic_xfs + 11 21 2 30 xfs_snext; magic/XFS/xfs_en.ui; magic_xfs + 11 21 2 31 xfs_symlink; magic/XFS/xfs_en.ui; magic_xfs + 11 21 2 32 xfs_sync; magic/XFS/xfs_en.ui; magic_xfs + 11 21 2 33 xfs_wlabel; magic/XFS/xfs_en.ui; magic_xfs + 11 21 2 34 xfs_xattr; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 Data structures for an XFS; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 1 The directory descriptor (DD); magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 1 1 dd_dmd; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 1 2 dd_refcnt; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 2 The directory handle descriptor (DHD); magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 2 1 dhd_dmd; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 3 The Drive Medium Descriptor (DMD); magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 3 1 d_xfs; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 3 2 d_drive; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 3 3 d_root; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 3 4 d_biosdev; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 3 5 d_driver; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 3 6 d_devcode; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 3 7 d_dfs; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 4 The Disk Transfer Area (DTA) for XFSs; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 4 1 xfs_dta_res1; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 4 2 xfs_dta_drive; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 5 The File Descriptor (FD); magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 5 1 fd_dmd; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 5 2 fd_refcnt; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 5 3 fd_mode; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 5 4 fd_dev; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 5 5 fd_ddev; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 5 6 fd_name; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 5 7 fd_attr; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 5 8 fd_owner; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 5 9 fd_parent; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 5 10 fd_children; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 5 11 fd_next; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 5 12 fd_multi; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 5 13 fd_multi1; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 5 14 fd_fpos; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 5 15 fd_dirch; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 5 16 fd_unused; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 5 17 fd_time; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 5 18 fd_date; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 5 19 fd_stcl; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 5 20 fd_len; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 5 21 fd_dirpos; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 5 22 fd_user1; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 5 23 fd_user2; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 6 The device driver (MX_DEV); magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 6 1 dev_close; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 6 2 dev_datime; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 6 3 dev_getc; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 6 4 dev_getline; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 6 5 dev_ioctl; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 6 6 dev_putc; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 6 7 dev_read; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 6 8 dev_seek; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 6 9 dev_stat; magic/XFS/xfs_en.ui; magic_xfs + 11 21 3 6 10 dev_write; magic/XFS/xfs_en.ui; magic_xfs + 11 21 4 Installation of an XFS; magic/XFS/xfs_en.ui; magic_xfs + 11 21 5 Kernel functions for an XFS; magic/XFS/xfs_en.ui; magic_xfs + 11 21 5 1 mxk_version; magic/XFS/xfs_en.ui; magic_xfs + 11 21 5 2 mxk_fast_clrmem; magic/XFS/xfs_en.ui; magic_xfs + 11 21 5 3 mxk_toupper; magic/XFS/xfs_en.ui; magic_xfs + 11 21 5 4 mxk__sprintf; magic/XFS/xfs_en.ui; magic_xfs + 11 21 5 5 mxk_act_pd; magic/XFS/xfs_en.ui; magic_xfs + 11 21 5 6 mxk_act_appl; magic/XFS/xfs_en.ui; magic_xfs + 11 21 5 7 mxk_keyb_app; magic/XFS/xfs_en.ui; magic_xfs + 11 21 5 8 mxk_pe_slice; magic/XFS/xfs_en.ui; magic_xfs + 11 21 5 9 mxk_pe_timer; magic/XFS/xfs_en.ui; magic_xfs + 11 21 5 10 mxk_appl_yield; magic/XFS/xfs_en.ui; magic_xfs + 11 21 5 11 mxk_appl_suspend; magic/XFS/xfs_en.ui; magic_xfs + 11 21 5 12 mxk_appl_begcritic; magic/XFS/xfs_en.ui; magic_xfs + 11 21 5 13 mxk_appl_endcritic; magic/XFS/xfs_en.ui; magic_xfs + 11 21 5 14 mxk_evnt_IO; magic/XFS/xfs_en.ui; magic_xfs + 11 21 5 15 mxk_evnt_mIO; magic/XFS/xfs_en.ui; magic_xfs + 11 21 5 16 mxk_appl_IOcomplete; magic/XFS/xfs_en.ui; magic_xfs + 11 21 5 17 mxk_evnt_sem; magic/XFS/xfs_en.ui; magic_xfs + 11 21 5 18 SEM_FREE; magic/XFS/xfs_en.ui; magic_xfs + 11 21 5 19 SEM_SET; magic/XFS/xfs_en.ui; magic_xfs + 11 21 5 20 SEM_TEST; magic/XFS/xfs_en.ui; magic_xfs + 11 21 5 21 SEM_CSET; magic/XFS/xfs_en.ui; magic_xfs + 11 21 5 22 SEM_GET; magic/XFS/xfs_en.ui; magic_xfs + 11 21 5 23 SEM_CREATE; magic/XFS/xfs_en.ui; magic_xfs + 11 21 5 24 SEM_DEL; magic/XFS/xfs_en.ui; magic_xfs + 11 21 5 25 mxk_Pfree; magic/XFS/xfs_en.ui; magic_xfs + 11 21 5 26 mxk_int_msize; magic/XFS/xfs_en.ui; magic_xfs + 11 21 5 27 mxk_int_malloc; magic/XFS/xfs_en.ui; magic_xfs + 11 21 5 28 mxk_int_mfree; magic/XFS/xfs_en.ui; magic_xfs + 11 21 5 29 mxk_resv_intmem; magic/XFS/xfs_en.ui; magic_xfs + 11 21 5 30 mxk_diskchange; magic/XFS/xfs_en.ui; magic_xfs + 11 21 5 31 mxk_DMD_rdevinit; magic/XFS/xfs_en.ui; magic_xfs + 11 21 5 32 mxk_proc_info; magic/XFS/xfs_en.ui; magic_xfs + 11 21 5 33 mxk_mxalloc; magic/XFS/xfs_en.ui; magic_xfs + 11 21 5 34 mxk_mfree; magic/XFS/xfs_en.ui; magic_xfs + 11 21 5 35 mshrink; magic/XFS/xfs_en.ui; magic_xfs + 11 21 6 Symbolic links and the XFS-concept; magic/XFS/xfs_en.ui; magic_xfs + 11 21 7 MX_DOSLIMITS; magic/XFS/xfs_en.ui; magic_xfs + 11 21 8 XFS structures; magic/XFS/xfs_en.ui; magic_xfs + 11 21 8 1 dev_descr; magic/XFS/xfs_en.ui; magic_xfs + 11 21 8 2 DEVDRV; magic/XFS/xfs_en.ui; magic_xfs + 11 21 8 3 FILESYS; magic/XFS/xfs_en.ui; magic_xfs + 11 21 8 4 fs_descr; magic/XFS/xfs_en.ui; magic_xfs + 11 22 VFAT-XFS in MagiC; magic/magic_en.u; magic_vfat + 11 23 Shared libraries; magic/sharelib.u; magic_sharelib + 11 23 1 What are shared libraries?; magic/sharelib.u; magic_sharelib + 11 23 2 Why shared libraries?; magic/sharelib.u; magic_sharelib + 11 23 3 How do I use a library?; magic/sharelib.u; magic_sharelib + 11 23 4 How do I write a library?; magic/sharelib.u; magic_sharelib + 11 23 5 SLB_DEMO.C; magic/sharelib.u; magic_sharelib + 11 23 6 LIBHEAD.S; magic/sharelib.u; magic_sharelib + 11 23 7 SLB_DEMO.PRJ; magic/sharelib.u; magic_sharelib + 11 23 8 PH_BIT3.TTP; magic/sharelib.u; magic_sharelib + 11 23 9 SLB_BIND; magic/sharelib.u; magic_sharelib + 11 23 10 SLB.H; magic/sharelib.u; magic_sharelib + 12 N.AES; /home/runner/work/tos.hyp/tos.hyp/tos_hyp.u; n_aes + 12 1 form_error in N.AES; n_aes/n_aes.u; naes_formerror + 12 2 The N.AES cookie; n_aes/n_aes.u; naes_cookie + 12 3 The N.AES configuration file; n_aes/n_aes.u; naes_cnf + 13 XaAES; /home/runner/work/tos.hyp/tos.hyp/tos_hyp.u; xaaes + 13 1 Toolbar support under XaAES; xaaes/xaaes.u; xaaes_toolbar + 13 2 XaAES deprecated functions; xaaes/function/function.u; xaaes_functions + 13 2 1 appl_pipe; xaaes/function/appl_pipe.ui; xaaes_functions + 13 2 1 1 Bindings for appl_pipe; xaaes/function/appl_pipe.ui; xaaes_functions + 13 2 2 client_exit; xaaes/function/client_exit.ui; xaaes_functions + 13 2 2 1 Bindings for client_exit; xaaes/function/client_exit.ui; xaaes_functions + 13 2 3 new_client; xaaes/function/new_client.ui; xaaes_functions + 13 2 3 1 Bindings for new_client; xaaes/function/new_client.ui; xaaes_functions + 13 2 4 rregen; xaaes/function/rregen.ui; xaaes_functions + 13 2 4 1 Bindings for rregen; xaaes/function/rregen.ui; xaaes_functions + 13 2 5 wredraw; xaaes/function/wredraw.ui; xaaes_functions + 13 2 5 1 Bindings for wredraw; xaaes/function/wredraw.ui; xaaes_functions + 14 Emulators; /home/runner/work/tos.hyp/tos.hyp/tos_hyp.u; emulators + 14 1 MagiC Mac specifics; magic/MagiC_Mac/magicmac_en.ui; emulators_magicmac + 14 1 1 General remarks about MagiC Mac; magic/MagiC_Mac/magicmac_en.ui; emulators_magicmac + 14 1 2 MagiC Mac and Power-Macs; magic/MagiC_Mac/magicmac_en.ui; emulators_magicmac + 14 1 3 Cookies under MagiC Mac; magic/MagiC_Mac/magicmac_en.ui; emulators_magicmac + 14 1 4 Filesystems under MagiC Mac; magic/MagiC_Mac/magicmac_en.ui; emulators_magicmac + 14 1 5 Restrictions of MagiC Mac; magic/MagiC_Mac/magicmac_en.ui; emulators_magicmac + 14 1 6 Exceptions under MagiC Mac; magic/MagiC_Mac/magicmac_en.ui; emulators_magicmac + 14 1 7 Clean programming; magic/MagiC_Mac/magicmac_en.ui; emulators_magicmac + 14 1 8 The shutdown process in MagiC Mac; magic/MagiC_Mac/magicmac_en.ui; emulators_magicmac + 14 1 9 XCMDs under MagiC Mac; magic/MagiC_Mac/magicmac_en.ui; emulators_magicmac + 14 1 10 Cooperation between MagiC and the MacOS; magic/MagiC_Mac/magicmac_en.ui; emulators_magicmac + 14 1 11 The MagiC Mac cookie; magic/MagiC_Mac/magicmac_en.ui; emulators_magicmac + 14 1 11 1 MagiC Mac type conventions; magic/MagiC_Mac/magicmac_en.ui; emulators_magicmac + 14 1 11 2 mmc_flg1_bit4; magic/MagiC_Mac/magicmac_en.ui; emulators_magicmac + 14 1 11 3 mmc_flg1_bit5; magic/MagiC_Mac/magicmac_en.ui; emulators_magicmac + 14 1 11 4 auxControl; magic/MagiC_Mac/magicmac_en.ui; emulators_magicmac + 14 1 11 5 callMacContext; magic/MagiC_Mac/magicmac_en.ui; emulators_magicmac + 14 1 11 6 configKernel; magic/MagiC_Mac/magicmac_en.ui; emulators_magicmac + 14 1 11 7 controlSwitch; magic/MagiC_Mac/magicmac_en.ui; emulators_magicmac + 14 1 11 8 getBaseMode; magic/MagiC_Mac/magicmac_en.ui; emulators_magicmac + 14 1 11 9 intrLock; magic/MagiC_Mac/magicmac_en.ui; emulators_magicmac + 14 1 11 10 macAppSwitch; magic/MagiC_Mac/magicmac_en.ui; emulators_magicmac + 14 1 11 11 atariModePossible; magic/MagiC_Mac/magicmac_en.ui; emulators_magicmac + 14 1 11 12 modeAtari; magic/MagiC_Mac/magicmac_en.ui; emulators_magicmac + 14 1 11 13 modeMac; magic/MagiC_Mac/magicmac_en.ui; emulators_magicmac + 14 1 11 14 versionOfMacAppl; magic/MagiC_Mac/magicmac_en.ui; emulators_magicmac + 14 1 11 15 giveTimeToMac; magic/MagiC_Mac/magicmac_en.ui; emulators_magicmac + 14 1 11 16 minStackSize; magic/MagiC_Mac/magicmac_en.ui; emulators_magicmac + 14 1 11 17 ext; magic/MagiC_Mac/magicmac_en.ui; emulators_magicmac + 14 1 11 18 extMac; magic/MagiC_Mac/magicmac_en.ui; emulators_magicmac + 14 1 11 19 stackLoad; magic/MagiC_Mac/magicmac_en.ui; emulators_magicmac + 14 1 11 20 stackUnload; magic/MagiC_Mac/magicmac_en.ui; emulators_magicmac + 14 2 MagiC PC interface; magic/MagiC_PC/magicpc_en.ui; emulators_magicpc + 14 2 1 mec0 (MPS) interface; magic/MagiC_PC/magicpc_en.ui; emulators_magicpc + 14 2 1 1 mps_base.def; magic/MagiC_PC/magicpc_en.ui; emulators_magicpc + 14 2 1 2 mps_base.h; magic/MagiC_PC/magicpc_en.ui; emulators_magicpc + 14 2 1 3 mps_base.cpp; magic/MagiC_PC/magicpc_en.ui; emulators_magicpc + 14 2 1 4 mps_demo.h; magic/MagiC_PC/magicpc_en.ui; emulators_magicpc + 14 2 1 5 mps_demo.cpp; magic/MagiC_PC/magicpc_en.ui; emulators_magicpc + 14 2 1 6 testmps.s; magic/MagiC_PC/magicpc_en.ui; emulators_magicpc + 14 2 2 mec1 interface; magic/MagiC_PC/magicpc_en.ui; emulators_magicpc + 14 2 3 mec2 interface; magic/MagiC_PC/magicpc_en.ui; emulators_magicpc + 14 2 4 mec3 interface; magic/MagiC_PC/magicpc_en.ui; emulators_magicpc + 14 2 5 mecnvdi interface; magic/MagiC_PC/magicpc_en.ui; emulators_magicpc + 14 3 STEmulator; emulator.en/stem.u; emulators_stem + 14 4 TOS2WIN; emulator.en/tos2win.u; emulators_tos2win + 14 5 Detecting the presence of TosBox, Steem and PaCifiST; emulator.en/sonstige.u; emulators_others + 15 Protocols; /home/runner/work/tos.hyp/tos.hyp/tos_hyp.u; protocols + 15 1 AV protocol; protokol/AV/av_en.ui; proto_av + 15 1 1 Quoting in AV protocol; protokol/AV/av_en.ui; proto_av + 15 1 2 AV functions; protokol/AV/av_en.ui; proto_av + 15 1 2 1 AV_ACCWINDCLOSED; protokol/AV/av_en.ui; proto_av + 15 1 2 2 AV_ACCWINDOPEN; protokol/AV/av_en.ui; proto_av + 15 1 2 3 AV_ASKCONFONT; protokol/AV/av_en.ui; proto_av + 15 1 2 4 AV_ASKFILEFONT; protokol/AV/av_en.ui; proto_av + 15 1 2 5 AV_ASKOBJECT; protokol/AV/av_en.ui; proto_av + 15 1 2 6 AV_COPY_DRAGGED; protokol/AV/av_en.ui; proto_av + 15 1 2 7 AV_COPYFILE; protokol/AV/av_en.ui; proto_av + 15 1 2 8 AV_DELFILE; protokol/AV/av_en.ui; proto_av + 15 1 2 9 AV_DRAG_ON_WINDOW; protokol/AV/av_en.ui; proto_av + 15 1 2 10 AV_EXIT; protokol/AV/av_en.ui; proto_av + 15 1 2 11 AV_FILEINFO; protokol/AV/av_en.ui; proto_av + 15 1 2 12 AV_GETSTATUS; protokol/AV/av_en.ui; proto_av + 15 1 2 13 AV_OPENCONSOLE; protokol/AV/av_en.ui; proto_av + 15 1 2 14 AV_OPENWIND; protokol/AV/av_en.ui; proto_av + 15 1 2 15 AV_PATH_UPDATE; protokol/AV/av_en.ui; proto_av + 15 1 2 16 AV_PROTOKOLL; protokol/AV/av_en.ui; proto_av + 15 1 2 17 AV_SENDCLICK; protokol/AV/av_en.ui; proto_av + 15 1 2 18 AV_SENDKEY; protokol/AV/av_en.ui; proto_av + 15 1 2 19 AV_SETWINDPOS; protokol/AV/av_en.ui; proto_av + 15 1 2 20 AV_STARTED; protokol/AV/av_en.ui; proto_av + 15 1 2 21 AV_STARTPROG; protokol/AV/av_en.ui; proto_av + 15 1 2 22 AV_STATUS; protokol/AV/av_en.ui; proto_av + 15 1 2 23 AV_VIEW; protokol/AV/av_en.ui; proto_av + 15 1 2 24 AV_WHAT_IZIT; protokol/AV/av_en.ui; proto_av + 15 1 2 25 AV_XWIND; protokol/AV/av_en.ui; proto_av + 15 1 3 VA functions; protokol/AV/av_en.ui; proto_av + 15 1 3 1 VA_ACC_QUOTING(a); protokol/AV/av_en.ui; proto_av + 15 1 3 2 VA_CONFONT; protokol/AV/av_en.ui; proto_av + 15 1 3 3 VA_CONSOLEOPEN; protokol/AV/av_en.ui; proto_av + 15 1 3 4 VA_COPY_COMPLETE; protokol/AV/av_en.ui; proto_av + 15 1 3 5 VA_DRAGACCWIND; protokol/AV/av_en.ui; proto_av + 15 1 3 6 VA_DRAG_COMPLETE; protokol/AV/av_en.ui; proto_av + 15 1 3 7 VA_FILECHANGED; protokol/AV/av_en.ui; proto_av + 15 1 3 8 VA_FILECOPIED; protokol/AV/av_en.ui; proto_av + 15 1 3 9 VA_FILEDELETED; protokol/AV/av_en.ui; proto_av + 15 1 3 10 VA_FILEFONT; protokol/AV/av_en.ui; proto_av + 15 1 3 11 VA_FONTCHANGED; protokol/AV/av_en.ui; proto_av + 15 1 3 12 VA_OBJECT; protokol/AV/av_en.ui; proto_av + 15 1 3 13 VA_PATH_UPDATE; protokol/AV/av_en.ui; proto_av + 15 1 3 14 VA_PROGSTART; protokol/AV/av_en.ui; proto_av + 15 1 3 15 VA_PROTOSTATUS; protokol/AV/av_en.ui; proto_av + 15 1 3 16 VA_SERVER_QUOTING(a); protokol/AV/av_en.ui; proto_av + 15 1 3 17 VA_SETSTATUS; protokol/AV/av_en.ui; proto_av + 15 1 3 18 VA_START; protokol/AV/av_en.ui; proto_av + 15 1 3 19 VA_THAT_IZIT; protokol/AV/av_en.ui; proto_av + 15 1 3 20 VA_VIEWED; protokol/AV/av_en.ui; proto_av + 15 1 3 21 VA_WINDOPEN; protokol/AV/av_en.ui; proto_av + 15 1 3 22 VA_XOPEN; protokol/AV/av_en.ui; proto_av + 15 2 BubbleGEM; protokol/BubbleGEM/bubble_en.ui; proto_bubblegem + 15 2 1 How to call BubbleGEM?; protokol/BubbleGEM/bubble_en.ui; proto_bubblegem + 15 2 2 Call routine; protokol/BubbleGEM/bubble_en.ui; proto_bubblegem + 15 2 3 Time-controlled call; protokol/BubbleGEM/bubble_en.ui; proto_bubblegem + 15 2 4 BubbleGEM cookies; protokol/BubbleGEM/bubble_en.ui; proto_bubblegem + 15 2 5 BubbleGEM environmental variable; protokol/BubbleGEM/bubble_en.ui; proto_bubblegem + 15 2 6 Font-selection; protokol/BubbleGEM/bubble_en.ui; proto_bubblegem + 15 2 7 AV_SENDCLICK, BubbleGEM; protokol/BubbleGEM/bubble_en.ui; proto_bubblegem + 15 3 Drag&Drop protocol; protokol/dd.u; proto_dd + 15 3 1 D&D-listing_1; protokol/dd.u; proto_dd + 15 3 2 Drag&Drop, Data-types for; protokol/dd.u; proto_dd + 15 3 3 Drag&Drop, Status bytes for; protokol/dd.u; proto_dd + 15 4 Document History protocol; protokol/dhst.u; proto_dhst + 15 5 Font protocol; protokol/font.u; proto_font + 15 6 GDPS: Gerti's Driver Piping System; protokol/gdps.ui; proto_gdps + 15 6 1 General description; protokol/gdps.ui; proto_gdps + 15 6 2 Definition of the driver daisy chain; protokol/gdps.ui; proto_gdps + 15 6 3 Data structure; protokol/gdps.ui; proto_gdps + 15 6 4 Driver types; protokol/gdps.ui; proto_gdps + 15 6 4 1 Scanner driver group; protokol/gdps.ui; proto_gdps + 15 6 4 2 GDPS, virtual memory management; protokol/gdps.ui; proto_gdps + 15 7 LTL protocol; protokol/ltlproto.u; proto_ltl + 15 7 1 The OBNL cookie; protokol/ltlproto.u; proto_ltl + 15 7 2 The OBNCOMM structure; protokol/ltlproto.u; proto_ltl + 15 7 3 LTL messages from the shell to the loader; protokol/ltlproto.u; proto_ltl + 15 7 3 1 CL_INIT; protokol/ltlproto.u; proto_ltl + 15 7 3 2 CL_COMMAND; protokol/ltlproto.u; proto_ltl + 15 7 3 3 CL_TIME; protokol/ltlproto.u; proto_ltl + 15 7 4 LTL messages from the loader to the shell; protokol/ltlproto.u; proto_ltl + 15 7 4 1 LC_WRCHAR; protokol/ltlproto.u; proto_ltl + 15 7 4 2 LC_WRSTR; protokol/ltlproto.u; proto_ltl + 15 7 4 3 LC_OUTBUF; protokol/ltlproto.u; proto_ltl + 15 7 4 4 LC_CLOSEWIN; protokol/ltlproto.u; proto_ltl + 15 7 4 5 LC_OPENWIN; protokol/ltlproto.u; proto_ltl + 15 7 5 Example: Chatwin and STJ-Oberon-2; protokol/ltlproto.u; proto_ltl + 15 8 OLGA protocol; protokol/olga/olga_en.ui; proto_olga + 15 8 1 OLGA initialization; protokol/olga/olga_en.ui; proto_olga + 15 8 2 OLGA-Client; protokol/olga/olga_en.ui; proto_olga + 15 8 3 OLGA-Server; protokol/olga/olga_en.ui; proto_olga + 15 8 4 OLGA_BREAKLINK; protokol/olga/olga_en.ui; proto_olga + 15 8 4 1 OLGA_BREAKLINK, Response to; protokol/olga/olga_en.ui; proto_olga + 15 8 5 OLGA_INFO; protokol/olga/olga_en.ui; proto_olga + 15 8 5 1 OLGA_INFO, Response to; protokol/olga/olga_en.ui; proto_olga + 15 8 6 OLGA_RENAME; protokol/olga/olga_en.ui; proto_olga + 15 8 6 1 OLGA_RENAME, Response to; protokol/olga/olga_en.ui; proto_olga + 15 8 7 OLGA_UPDATE; protokol/olga/olga_en.ui; proto_olga + 15 8 7 1 OLGA_UPDATE, Response to; protokol/olga/olga_en.ui; proto_olga + 15 8 8 OLGA_CLIENTTERMINATED; protokol/olga/olga_en.ui; proto_olga + 15 8 9 OLGA_CLOSEDOC; protokol/olga/olga_en.ui; proto_olga + 15 8 9 1 OLGA_CLOSEDOC, Response to; protokol/olga/olga_en.ui; proto_olga + 15 8 10 OLGA_GETINFO; protokol/olga/olga_en.ui; proto_olga + 15 8 11 OLGA_LINK; protokol/olga/olga_en.ui; proto_olga + 15 8 11 1 OLGA_LINK, Response to; protokol/olga/olga_en.ui; proto_olga + 15 8 12 OLGA_LINKBROKEN; protokol/olga/olga_en.ui; proto_olga + 15 8 13 OLGA_LINKRENAMED; protokol/olga/olga_en.ui; proto_olga + 15 8 14 OLGA_OPENDOC; protokol/olga/olga_en.ui; proto_olga + 15 8 15 OLGA_RENAMELINK; protokol/olga/olga_en.ui; proto_olga + 15 8 16 OLGA_START; protokol/olga/olga_en.ui; proto_olga + 15 8 16 1 OLGA_START, Response to; protokol/olga/olga_en.ui; proto_olga + 15 8 16 2 OLGA_START, Response2 to; protokol/olga/olga_en.ui; proto_olga + 15 8 16 3 OLS_TYPE; protokol/olga/olga_en.ui; proto_olga + 15 8 16 4 OLS_EXTENSION; protokol/olga/olga_en.ui; proto_olga + 15 8 16 5 OLS_NAME; protokol/olga/olga_en.ui; proto_olga + 15 8 17 OLGA_UPDATED; protokol/olga/olga_en.ui; proto_olga + 15 8 18 OLGA_UNLINK; protokol/olga/olga_en.ui; proto_olga + 15 8 18 1 OLGA_UNLINK, Response to; protokol/olga/olga_en.ui; proto_olga + 15 8 19 OLGA_SERVERTERMINATED; protokol/olga/olga_en.ui; proto_olga + 15 8 20 Server minimum requirement; protokol/olga/olga_en.ui; proto_olga + 15 8 21 Client minimum requirement; protokol/olga/olga_en.ui; proto_olga + 15 8 22 OLE_EXIT; protokol/olga/olga_en.ui; proto_olga + 15 8 23 OLE_INIT; protokol/olga/olga_en.ui; proto_olga + 15 8 24 OLE_NEW; protokol/olga/olga_en.ui; proto_olga + 15 8 25 OLGA_INIT; protokol/olga/olga_en.ui; proto_olga + 15 8 26 OLGA Info file format; protokol/olga/olga_en.ui; proto_olga + 15 8 27 OLGAInfHeader; protokol/olga/olga_en.ui; proto_olga + 15 8 28 OLGABlockHeader; protokol/olga/olga_en.ui; proto_olga + 15 8 29 InplaceDrawing for OLGA (ID-4); protokol/olga/olga_en.ui; proto_olga + 15 8 29 1 ID4-Client; protokol/olga/olga_en.ui; proto_olga + 15 8 29 2 OLGA_GETOBJECTS; protokol/olga/olga_en.ui; proto_olga + 15 8 29 3 OLGA_ACTIVATE; protokol/olga/olga_en.ui; proto_olga + 15 8 29 4 OLGA_EMBED; protokol/olga/olga_en.ui; proto_olga + 15 8 29 5 ID4-Server; protokol/olga/olga_en.ui; proto_olga + 15 8 29 6 OLGA_EMBEDDED; protokol/olga/olga_en.ui; proto_olga + 15 8 29 7 OLGA_UNEMBED; protokol/olga/olga_en.ui; proto_olga + 15 8 29 8 OLGA_INPLACEUPDATE; protokol/olga/olga_en.ui; proto_olga + 15 8 29 9 CBDraw; protokol/olga/olga_en.ui; proto_olga + 15 8 29 10 CBUnembed; protokol/olga/olga_en.ui; proto_olga + 15 8 30 Notification; protokol/olga/olga_en.ui; proto_olga + 15 8 31 OLGA_REQUESTNOTIFICATION; protokol/olga/olga_en.ui; proto_olga + 15 8 32 OLGA_RELEASENOTIFICATION; protokol/olga/olga_en.ui; proto_olga + 15 8 33 OLGA_NOTIFY; protokol/olga/olga_en.ui; proto_olga + 15 8 34 Idle-test; protokol/olga/olga_en.ui; proto_olga + 15 8 35 Configuration inquiry; protokol/olga/olga_en.ui; proto_olga + 15 8 36 List of OLGA-aware applications; protokol/olga/olga_en.ui; proto_olga + 15 8 37 Extensions; protokol/olga/olga_en.ui; proto_olga + 15 8 38 File formats; protokol/olga/olga_en.ui; proto_olga + 15 8 38 1 OLGA.H; protokol/olga/olga_en.ui; proto_olga + 15 8 38 2 OLGA.INC; protokol/olga/olga_en.ui; proto_olga + 15 8 38 3 OLGA.INF; protokol/olga/olga_en.ui; proto_olga + 15 8 39 Much, Thomas; protokol/olga/olga_en.ui; proto_olga + 15 8 40 OL_SERVER; protokol/olga/olga_en.ui; proto_olga + 15 8 41 OL_CLIENT; protokol/olga/olga_en.ui; proto_olga + 15 8 42 OL_PEER; protokol/olga/olga_en.ui; proto_olga + 15 8 43 OL_IDLE; protokol/olga/olga_en.ui; proto_olga + 15 8 44 OL_PIPES; protokol/olga/olga_en.ui; proto_olga + 15 8 45 OL_START; protokol/olga/olga_en.ui; proto_olga + 15 8 46 OL_MANAGER; protokol/olga/olga_en.ui; proto_olga + 15 8 47 OL_OEP; protokol/olga/olga_en.ui; proto_olga + 15 8 48 OLGA history; protokol/olga/olga_en.ui; proto_olga + 15 9 SE protocol; protokol/seproto/seproto_en.ui; proto_seproto + 15 9 1 Contact initiation; protokol/seproto/seproto_en.ui; proto_seproto + 15 9 2 Notes on SE protocol; protokol/seproto/seproto_en.ui; proto_seproto + 15 9 3 Messages from the shell to the editor; protokol/seproto/seproto_en.ui; proto_seproto + 15 9 3 1 SE_INIT; protokol/seproto/seproto_en.ui; proto_seproto + 15 9 3 2 SE_OK; protokol/seproto/seproto_en.ui; proto_seproto + 15 9 3 3 SE_ACK; protokol/seproto/seproto_en.ui; proto_seproto + 15 9 3 4 SE_OPEN; protokol/seproto/seproto_en.ui; proto_seproto + 15 9 3 5 SE_ERROR; protokol/seproto/seproto_en.ui; proto_seproto + 15 9 3 6 SE_ERRFILE; protokol/seproto/seproto_en.ui; proto_seproto + 15 9 3 7 SE_PROJECT; protokol/seproto/seproto_en.ui; proto_seproto + 15 9 3 8 SE_QUIT; protokol/seproto/seproto_en.ui; proto_seproto + 15 9 3 9 SE_TERMINATE; protokol/seproto/seproto_en.ui; proto_seproto + 15 9 3 10 SE_CLOSE; protokol/seproto/seproto_en.ui; proto_seproto + 15 9 3 11 SE_MENU; protokol/seproto/seproto_en.ui; proto_seproto + 15 9 4 Messages from the editor to the shell; protokol/seproto/seproto_en.ui; proto_seproto + 15 9 4 1 ES_INIT; protokol/seproto/seproto_en.ui; proto_seproto + 15 9 4 2 ES_OK; protokol/seproto/seproto_en.ui; proto_seproto + 15 9 4 3 ES_ACK; protokol/seproto/seproto_en.ui; proto_seproto + 15 9 4 4 ES_COMPILE; protokol/seproto/seproto_en.ui; proto_seproto + 15 9 4 5 ES_MAKE; protokol/seproto/seproto_en.ui; proto_seproto + 15 9 4 6 ES_MAKEALL; protokol/seproto/seproto_en.ui; proto_seproto + 15 9 4 7 ES_LINK; protokol/seproto/seproto_en.ui; proto_seproto + 15 9 4 8 ES_EXEC; protokol/seproto/seproto_en.ui; proto_seproto + 15 9 4 9 ES_MAKEEXEC; protokol/seproto/seproto_en.ui; proto_seproto + 15 9 4 10 ES_PROJECT; protokol/seproto/seproto_en.ui; proto_seproto + 15 9 4 11 ES_QUIT; protokol/seproto/seproto_en.ui; proto_seproto + 15 9 4 12 ES_SHLCTRL; protokol/seproto/seproto_en.ui; proto_seproto + 15 9 5 History, SE protocol; protokol/seproto/seproto_en.ui; proto_seproto + 15 9 6 Authors and programs; protokol/seproto/seproto_en.ui; proto_seproto + 15 10 System Services Protocol (SSP); protokol/ssp/ssp.u; proto_ssp + 15 10 1 SSP changes; protokol/ssp/ssp.u; proto_ssp + 15 10 2 What is SSP?; protokol/ssp/ssp.u; proto_ssp + 15 10 3 SSP messages; protokol/ssp/ssp.u; proto_ssp + 15 10 4 Services; protokol/ssp/ssp.u; proto_ssp + 15 10 5 SSP Server registration; protokol/ssp/ssp.u; proto_ssp + 15 10 6 General Rules; protokol/ssp/ssp.u; proto_ssp + 15 10 7 Timeouts and error handling; protokol/ssp/ssp.u; proto_ssp + 15 10 8 SSP message pipeline; protokol/ssp/ssp.u; proto_ssp + 15 10 9 Defines (SSP); protokol/ssp/ssp.u; proto_ssp + 15 10 10 How to implement an SRA; protokol/ssp/ssp.u; proto_ssp + 15 10 11 How to implement an SPA; protokol/ssp/ssp.u; proto_ssp + 15 10 12 List of prospective SSP-implementing software to date; protokol/ssp/ssp.u; proto_ssp + 15 10 13 Glossary; protokol/ssp/ssp.u; proto_ssp + 15 11 View protocol; protokol/view.u; proto_view + 15 11 1 The purpose(s) of the View protocol; protokol/view.u; proto_view + 15 11 2 Using the View protocol; protokol/view.u; proto_view + 15 11 3 Implementing the View protocol; protokol/view.u; proto_view + 15 11 3 1 Who is the viewer?; protokol/view.u; proto_view + 15 11 3 2 What kinds of files can be displayed?; protokol/view.u; proto_view + 15 11 3 3 How can I tell the viewer what is to be shown?; protokol/view.u; proto_view + 15 11 3 4 What does the viewer do?; protokol/view.u; proto_view + 15 11 4 The VIEW_XXX messages; protokol/view.u; proto_view + 15 11 4 1 View a file; protokol/view.u; proto_view + 15 11 4 2 Further communication; protokol/view.u; proto_view + 15 11 4 3 View data from memory; protokol/view.u; proto_view + 15 11 5 The View protocol messages; protokol/view.u; proto_view + 15 12 Virtual Screen protocol; protokol/vscreen.u; proto_vscreen + 15 13 XAcc; protokol/xacc/xacc_en.ui; proto_xacc + 15 13 1 Purpose of XAcc; protokol/xacc/xacc_en.ui; proto_xacc + 15 13 2 Classic XAcc; protokol/xacc/xacc_en.ui; proto_xacc + 15 13 2 1 XAcc message groups; protokol/xacc/xacc_en.ui; proto_xacc + 15 13 2 2 XAcc messages; protokol/xacc/xacc_en.ui; proto_xacc + 15 13 2 2 1 Basic XAcc messages; protokol/xacc/xacc_en.ui; proto_xacc + 15 13 2 2 1 1 Single-tasking GEM versions; protokol/xacc/xacc_en.ui; proto_xacc + 15 13 2 2 1 2 Multitasking GEM versions; protokol/xacc/xacc_en.ui; proto_xacc + 15 13 2 2 2 Extended names; protokol/xacc/xacc_en.ui; proto_xacc + 15 13 2 2 3 Message group 1; protokol/xacc/xacc_en.ui; proto_xacc + 15 13 2 2 4 Message group 2; protokol/xacc/xacc_en.ui; proto_xacc + 15 13 2 3 Compatibility considerations; protokol/xacc/xacc_en.ui; proto_xacc + 15 13 3 Extended XAcc; protokol/xacc/xacc_en.ui; proto_xacc + 15 13 3 1 MailMerge protocol; protokol/xacc/xacc_en.ui; proto_xacc + 15 13 3 2 Remote-Mailmerge protocol; protokol/xacc/xacc_en.ui; proto_xacc + 15 13 3 3 Inquiry protocol; protokol/xacc/xacc_en.ui; proto_xacc + 15 13 3 4 Request/Reply protocol; protokol/xacc/xacc_en.ui; proto_xacc + 15 13 4 Example: no|Link's XAcc protocol; protokol/xacc/xacc_en.ui; proto_xacc + 15 13 5 XACC.H; protokol/xacc/xacc_en.ui; proto_xacc + 15 14 xFSL interface; protokol/xfsl.u; proto_xfsl + 15 14 1 About the xFSL interface; protokol/xfsl.u; proto_xfsl + 15 14 1 1 The xFSL cookie; protokol/xfsl.u; proto_xfsl + 15 14 1 2 The simplified call (xfsl_input); protokol/xfsl.u; proto_xfsl + 15 14 1 3 The extended xFSL call; protokol/xfsl.u; proto_xfsl + 15 14 1 3 1 xfsl_init; protokol/xfsl.u; proto_xfsl + 15 14 1 3 2 xfsl_event; protokol/xfsl.u; proto_xfsl + 15 14 1 3 3 xfsl_exit; protokol/xfsl.u; proto_xfsl + 15 14 1 3 4 The info call (xfsl_info); protokol/xfsl.u; proto_xfsl + 15 14 1 3 5 The VDI workstation in the xFSL interface; protokol/xfsl.u; proto_xfsl + 15 14 1 3 6 The xFSL_PAR structure; protokol/xfsl.u; proto_xfsl + 15 14 1 3 7 The control-flags; protokol/xfsl.u; proto_xfsl + 15 14 1 3 8 The PFONTINFO structure; protokol/xfsl.u; proto_xfsl + 15 14 1 3 9 The user-popup; protokol/xfsl.u; proto_xfsl + 15 14 1 4 The font-flags; protokol/xfsl.u; proto_xfsl + 15 14 1 5 xFSL return codes; protokol/xfsl.u; proto_xfsl + 15 14 1 6 The Pure-C event structure; protokol/xfsl.u; proto_xfsl + 15 14 2 xFSL tips and notes; protokol/xfsl.u; proto_xfsl + 15 14 2 1 A simple xFSL call; protokol/xfsl.u; proto_xfsl + 15 14 2 2 xFSL Questions and Answers; protokol/xfsl.u; proto_xfsl + 15 14 2 3 xFSL technical programming notes; protokol/xfsl.u; proto_xfsl + 15 14 2 3 1 Data-types; protokol/xfsl.u; proto_xfsl + 15 14 2 3 2 xFSL parameter passing; protokol/xfsl.u; proto_xfsl + 15 14 2 3 3 Pure-C and 'cdecl'; protokol/xfsl.u; proto_xfsl + 15 14 3 xFSL revisions history; protokol/xfsl.u; proto_xfsl + 15 14 4 UFSL/xFSL program overview; protokol/xfsl.u; proto_xfsl + 15 14 4 1 Font-selector overview; protokol/xfsl.u; proto_xfsl + 15 14 4 2 Programs that support a font-selector; protokol/xfsl.u; proto_xfsl + 15 14 5 The UFSL interface; protokol/xfsl.u; proto_xfsl + 15 14 6 Notes for authors of other font-selectors; protokol/xfsl.u; proto_xfsl + 15 15 XSSI protocol; protokol/xssi.u; appendix + A ASCII table; anhang/anhang/ascii.ui; ascii + B The scancode; anhang/anhang/scan-code.ui; scancode + C Development systems; anhang/anhang/anhang.u; develop + D Literature for the TOS operating system; anhang/anhang/anhang.u; literature + E Declaration of sources; anhang/anhang/anhang.u; references + F The PMMU functions-handler; anhang/anhang/pmmu.u; pmmu + F 1 ClearPageMode; anhang/anhang/pmmu.u; pmmu_ClearPageMode + F 2 GetHdv_inuse; anhang/anhang/pmmu.u; pmmu_GetHdv_inuse + F 3 GetPageSize; anhang/anhang/pmmu.u; pmmu_GetPageSize + F 4 pmem_size; anhang/anhang/pmmu.u; pmmu_pmem_size + F 5 PMMUversion; anhang/anhang/pmmu.u; pmmu_PMMUversion + F 6 SetPageMode; anhang/anhang/pmmu.u; pmmu_SetPageMode + F 7 vmem_size; anhang/anhang/pmmu.u; pmmu_vmem_size + G TOS list; anhang/anhang/tos_vers.u; tos_vers + H XHDI - eXtended HardDisk Interface (Version 1.30); anhang/anhang/xhdi/xhdi_en.ui; xhdi + H 1 XHDI cookie; anhang/anhang/xhdi/xhdi_en.ui; xhdi_cookie + H 2 XHDI terminology; anhang/anhang/xhdi/xhdi_en.ui; xhdi_terminology + H 3 Arbitration; anhang/anhang/xhdi/xhdi_en.ui; xhdi_arbitration + H 4 Recommended partition types; anhang/anhang/xhdi/xhdi_en.ui; xhdi_partition_types + H 4 1 Partition type RAW; anhang/anhang/xhdi/xhdi_en.ui; xhdi_partition_types + H 5 XHDI functions; anhang/anhang/xhdi/xhdi_en.ui; xhdi_functions + H 5 1 XHGetVersion; anhang/anhang/xhdi/xhdi_en.ui; xhdi_functions + H 5 2 XHInqTarget; anhang/anhang/xhdi/xhdi_en.ui; xhdi_functions + H 5 3 XHReserve; anhang/anhang/xhdi/xhdi_en.ui; xhdi_functions + H 5 4 XHLock; anhang/anhang/xhdi/xhdi_en.ui; xhdi_functions + H 5 5 XHStop; anhang/anhang/xhdi/xhdi_en.ui; xhdi_functions + H 5 6 XHEject; anhang/anhang/xhdi/xhdi_en.ui; xhdi_functions + H 5 7 XHDrvMap; anhang/anhang/xhdi/xhdi_en.ui; xhdi_functions + H 5 8 XHInqDev; anhang/anhang/xhdi/xhdi_en.ui; xhdi_functions + H 5 9 XHInqDriver; anhang/anhang/xhdi/xhdi_en.ui; xhdi_functions + H 5 10 XHNewCookie; anhang/anhang/xhdi/xhdi_en.ui; xhdi_functions + H 5 11 XHReadWrite; anhang/anhang/xhdi/xhdi_en.ui; xhdi_functions + H 5 12 XHInqTarget2; anhang/anhang/xhdi/xhdi_en.ui; xhdi_functions + H 5 13 XHInqDev2; anhang/anhang/xhdi/xhdi_en.ui; xhdi_functions + H 5 14 XHDriverSpecial; anhang/anhang/xhdi/xhdi_en.ui; xhdi_functions + H 5 15 XHGetCapacity; anhang/anhang/xhdi/xhdi_en.ui; xhdi_functions + H 5 16 XHMediumChanged; anhang/anhang/xhdi/xhdi_en.ui; xhdi_functions + H 5 17 XHMiNTInfo; anhang/anhang/xhdi/xhdi_en.ui; xhdi_functions + H 5 18 XHDOSLimits; anhang/anhang/xhdi/xhdi_en.ui; xhdi_functions + H 5 19 XHLastAccess; anhang/anhang/xhdi/xhdi_en.ui; xhdi_functions + H 5 20 XHReaccess; anhang/anhang/xhdi/xhdi_en.ui; xhdi_functions + I Type definitions; anhang/typedefs.u; typedefs + I 1 AESVARS; anhang/typedefs/AESVARS.ui; AESVARS + I 2 Archive header (ARHEADER); anhang/typedefs/ARHEADER.ui; ARHEADER + I 3 Buffer Control Block (BCB); anhang/typedefs/BCB.ui; BCB + I 4 CPXINFO; anhang/typedefs/CPXINFO.ui; CPXINFO + I 5 FlpDrvInfo; anhang/typedefs/FlpDrvInfo.ui; FlpDrvInfo + I 6 GEM_MUPB; anhang/typedefs/GEM_MUPB.ui; GEM_MUPB + I 7 GRECT; anhang/typedefs/GRECT.ui; GRECT + I 8 HDFUNCS; anhang/typedefs/HDFUNCS.ui; HDFUNCS + I 9 MacVersion; anhang/typedefs/MacVersion.ui; MacVersion + I 10 Memory-Control-Block (MCB) in MagiC; anhang/typedefs/MCB.ui; magic_MCB + I 11 Memory Descriptor (MD) in TOS; anhang/typedefs/MD.ui; MD + I 12 MRETS; anhang/typedefs/MRETS.ui; MRETS + I 13 OHEADER; anhang/typedefs/OHEADER.ui; OHEADER + I 14 OSHEADER; anhang/typedefs/OSHEADER.ui; OSHEADER + I 15 PrintDesc; anhang/typedefs/PrintDesc.ui; PrintDesc + I 16 RGB_LIST; anhang/typedefs/RGB_LIST.ui; RGB_LIST + I 17 THREADINFO; anhang/typedefs/THREADINFO.ui; THREADINFO + I 18 XCPB; anhang/typedefs/XCPB.ui; XCPB + @ Index; /home/runner/work/tos.hyp/tos.hyp/gh-pages/en/udo0dXml2; indexudo diff --git a/en/indexudo.html b/en/indexudo.html new file mode 100644 index 000000000..344fbf277 --- /dev/null +++ b/en/indexudo.html @@ -0,0 +1,5593 @@ + + + + + +The documentation for TOS: Index + + + + + + + + + +Home +Contents +XCPBXCPB + + +
+ +

Index

+
+# + | % + | 2 + | A + | B + | C + | D + | E + | F + | G + | H + | I + | J + | K + | L + | M + | N + | O + | P + | Q + | R + | S + | T + | U + | V + | W + | X + | Z + | _ +
+ +

+#
+#_ACC
+#_APP
+#_AUT
+#_BKG
+#_BUF
+#_CTR
+#_DEV
+#_DRV
+#_ENV
+#_FLG
+#_FSL
+#_HDV
+#_INW
+#_MAG
+#_OBS
+#_SCP
+#_SHL
+#_SLB
+#_TRM
+#_TSL
+#_TXB
+#_TXT
+#_WND
+

+ +

+%
+%apgi_0
+%apgi_1
+%apgi_10
+%apgi_11
+%apgi_12
+%apgi_13
+%apgi_14
+%apgi_2
+%apgi_22360
+%apgi_22528
+%apgi_3
+%apgi_4
+%apgi_5
+%apgi_6
+%apgi_64
+%apgi_65
+%apgi_7
+%apgi_8
+%apgi_9
+%apgi_96
+%apgi_97
+%apgi_98
+%apgi_99
+%ctl_1
+%ctl_2
+%ctl_3
+%ctl_4
+%ctl_5
+%ctl_6
+%dpthconf_7
+%dpthconf_8
+%mmcookie_flgs1
+

+ +

+2
+200Hz Timer, Vector for
+

+ +

+A
+A simple xFSL call
+A3 format
+A4 format
+A5 format
+ABC-GEM
+ABLE_EMSDESK
+ABLE_GETINFO
+ABLE_PROP
+ABLE_PROP2
+ABLE_WTREE
+ABLE_X3D
+ABLE_XBVSET
+ABLE_XSHL
+About the AES
+About the BIOS
+About the GDOS
+About the GEMDOS
+About the VDI
+About the XBIOS
+About the xFSL interface
+About XCONTROL
+Accessories
+Accessories in MagiC
+Accessories, Startup-code for
+ACC_ACC
+ACC_ACK
+ACC_CLOSE
+ACC_DSINFO
+ACC_EXIT
+ACC_FIELDINFO
+ACC_FILEINFO
+ACC_FORCESDF
+ACC_GETDSI
+ACC_GETFIELDS
+ACC_GETSDF
+ACC_ID
+ACC_IMG
+ACC_KEY
+ACC_META
+ACC_OPEN
+ACC_REPLY
+ACC_REQUEST
+ACC_TEXT
+Acoustic feedback
+ACSI, Vector for
+ACTBUTCOL
+ActiveModeNumber
+AC_CLOSE
+AC_COPY
+AC_HELP
+AC_OPEN
+AC_REPLY
+AC_VERSION
+AD3DVALUE
+Additional programs for MagiC
+ADDMEM
+Address Error vector
+addr_in
+addr_out
+AES
+aes
+AES bindings
+AES Broadcasting
+AES clones
+AES function list
+AES fundamentals
+AES in source text?
+AES messages
+AES object colours
+AES object flags
+AES object stati
+AES object types
+AES parameter-block
+AES structures
+AES version number
+AES, Origin of the
+AES-TRAP
+AESPB
+AESVARS
+AESVARS, Pointer to AESVARS
+AES_AOPTS
+AES_ARCH_COLDFILRE
+AES_ARCH_M68000
+AES_ARCH_M68010
+AES_ARCH_M68020
+AES_ARCH_M6802060
+AES_ARCH_M68030
+AES_ARCH_M68040
+AES_ARCH_M68060
+AES_ARCH_M68K
+AES_DEVSTATUS_ALPHA
+AES_DEVSTATUS_BETA
+AES_DEVSTATUS_RELEASE
+AES_FDEVSTATUS_STABLE
+AES_FUNCTIONS
+AES_Load
+AES_VERSION
+AES_WOPTS
+AF_CLOSEACK
+AF_DOALERT
+AF_DOFSELECT
+AF_SENDREDRAW
+Alert boxes
+Alignment
+Alloc
+Alternate-Help, Counter for
+AMC-GDOS
+Analysis of a metafile
+ANI_MOUSE
+ANSWER_TRACE
+AO0_OBJC_EDIT
+AO0_WF_SLIDER
+AOPT_CLEAR
+AOPT_SET
+APCI_HASDESK
+APCI_HASMBAR
+APCI_HIDDEN
+APC_APP_CONFIG
+APC_HIDE
+APC_HIDENOT
+APC_INFO
+APC_INFORM_MESAG
+APC_KILL
+APC_MENU
+APC_SHOW
+APC_SYSTEM
+APC_TOP
+APC_TOPNEXT
+APC_WIDGETS
+APFLG
+APL development systems
+APPFLAGS
+APPLICAT
+Application library
+Application, Freezing of an
+Application, Switching to
+Application, Thawing of an
+APPLRECORD
+appl_bvset
+appl_control
+appl_exit
+appl_find
+appl_getcicon
+appl_getinfo
+appl_getinfo, Existence of
+appl_getinfo_str
+appl_init
+appl_options
+appl_pipe
+appl_read
+appl_search
+appl_tplay
+appl_trecord
+appl_write
+appl_xbvget
+appl_xbvset
+appl_xgetinfo
+appl_yield
+Apportionment of resources with threads
+APP_ACCESSORY
+APP_AESSYS
+APP_AESTHREAD
+APP_APPLICATION
+APP_DESK
+APP_FIRST
+APP_NEXT
+APP_SHELL
+APP_SYSTEM
+APP_TASKINFO
+AP_DRAGDROP
+AP_RESCHG
+AP_TERM
+AP_TFAIL
+Arbitrary line
+Arbitration
+Archive header (ARHEADER)
+ARGV at the caller
+ARGV procedure
+ARGV procedure as of MagiC 3.0
+ARGV procedure, extended
+ARGV with a launched program
+ARHEADER
+ARROW
+ASCII table
+Assembler development systems
+ASSIGN.SYS file as of GEM/3
+Assignment of the real-time clock's NVM
+atariModePossible
+Attach
+Attribute functions
+Attributes of a file
+Attributes, Bitmap
+Attributes, Fill
+Attributes, Lines
+Attributes, Marker
+Attributes, Superior
+Attributes, Text
+AT_PERGAMON
+Authors and programs
+AUTO folder, Access path for
+AUTO folder, Start from the
+Auto-vector Interrupt, Level 1
+Auto-vector Interrupt, Level 2
+Auto-vector Interrupt, Level 3
+Auto-Vector Interrupt, Level 4
+Auto-Vector interrupt, Level 5
+Auto-Vector interrupt, Level 6
+Auto-Vector interrupt, Level 7
+AUTOEXEC.BAT in MagiC
+auxControl
+AV functions
+AV protocol
+AV protocol, Quoting in
+AV_ACCWINDCLOSED
+AV_ACCWINDOPEN
+AV_ASKCONFONT
+AV_ASKFILEFONT
+AV_ASKOBJECT
+AV_COPYFILE
+AV_COPY_DRAGGED
+AV_DELFILE
+AV_DRAG_ON_WINDOW
+AV_EXIT
+AV_FILEINFO
+AV_GETSTATUS
+AV_OPENCONSOLE
+AV_OPENWIND
+AV_PATH_UPDATE
+AV_PROTOKOLL
+AV_SENDCLICK
+AV_SENDKEY
+AV_SETWINDPOS
+AV_STARTED
+AV_STARTPROG
+AV_STATUS
+AV_VIEW
+AV_WHAT_IZIT
+AV_XWIND
+

+ +

+B
+B5 format
+BACKDROP
+BACKGRCOL
+Background-DMA in MagiC
+BASEPAGE
+Basic development systems
+Basic XAcc messages
+Baud-rate generator, Vector for
+BCB
+Bconin
+Bconmap
+BCONMAP
+Bconout
+Bconstat
+Bcostat
+BEG_MCTRL
+BEG_UPDATE
+Bell
+bell_hook
+Binding of a metafile sub-opcode
+Bindings of the AES
+Bindings of the VDI
+BIOS
+bios
+BIOS Dispatcher
+BIOS error-messages
+BIOS function list
+BIOS Structures
+BIOS, Parameter passing in
+BIOS, The
+bios-trap
+Bioskeys
+Bit block transfer
+Bit-image drivers
+Bit-Strings
+BITBLK
+BITBLT
+BITBUTTON
+Bitmap attributes
+Bitmap fonts, Header for
+Bitmap format for printer drivers
+BITMAP_FONT
+BIT_IMAGE
+Blink_off
+Blink_on
+Blitmode
+BLK_CLEARED
+BLK_ERR
+BLK_OK
+Boot sector, Loading of
+Booting drive, Number of
+BootRoot
+BORDER
+BPB
+BPB, Ascertaining the
+Broadcasting of the AES
+BSIM
+BSIM-BIOS-Extension
+bsim_id
+BubbleGEM
+BubbleGEM cookies
+BUBBLEGEM_ACK
+BUBBLEGEM_ASKFONT
+BUBBLEGEM_FONT
+BUBBLEGEM_HIDE
+BUBBLEGEM_REQUEST
+BUBBLEGEM_SHOW
+Buffer Control Block (BCB)
+Buffer lists of GEMDOS
+buffoper
+buffptr
+Bus Error vector
+BUSY interrupt, Vector for
+BUSYBEE
+BUSY_BEE
+bus_to_virt
+button_click
+bypass
+ByteFromLink
+ByteToLink
+

+ +

+C
+C development systems
+C'Task Royal
+C++ development systems
+C-string to VDI-string
+CAB_CHANGED
+CAB_EXIT
+CAB_HELLO
+CAB_MAIL
+CAB_MAILSENT
+CAB_PATH
+CAB_RELEASESTATUS
+CAB_REQUESTSTATUS
+CAB_STATUS
+CAB_SUPPORT
+CAB_TERM
+CAB_VIEW
+Cache purging, CPU
+CacheCtrl
+Calling procedure for modal dialogs
+callMacContext
+Camera drivers
+cardadr
+cardmagic
+cardsel
+cardslot
+CatMsg
+CatProtoMsg
+Cauxin
+Cauxis
+Cauxos
+Cauxout
+CBDraw
+cblmode
+CBLock
+cblread
+CBUnembed
+Cconin
+Cconis
+Cconos
+Cconout
+Cconrs
+Cconws
+CD
+CD-ROM definitions
+CD-ROM functions
+CDROMALLOWREMOVAL
+CDROMAUDIOCTRL
+CDROMEJECT
+CDROMGETMCN
+CDROMGETTISRC
+CDROMPAUSE
+CDROMPLAYMSF
+CDROMPLAYTRKIND
+CDROMPREVENTREMOVAL
+CDROMREADDA
+CDROMREADMODE1
+CDROMREADMODE2
+CDROMREADOFFSET
+CDROMREADTOCENTRY
+CDROMREADTOCHDR
+CDROMRESUME
+CDROMSTART
+CDROMSTOP
+CDROMSUBCHNL
+CDROMVOLCTRL
+cdrom_audioctrl
+CDROM_AUDIO_COMPLETED
+CDROM_AUDIO_EMPHASIS
+CDROM_AUDIO_ERROR
+CDROM_AUDIO_INVALID
+CDROM_AUDIO_NO_STATUS
+CDROM_AUDIO_PAUSED
+CDROM_AUDIO_PLAY
+CDROM_COPY_PERMITTED
+CDROM_DATA_TRACK
+CDROM_FOUR_CHANNEL
+CDROM_LBA
+CDROM_LEADOUT
+cdrom_mcn
+CDROM_MSF
+cdrom_msf
+cdrom_read
+cdrom_subchnl
+cdrom_ti
+cdrom_tisrc
+cdrom_tocentry
+cdrom_tochdr
+cdrom_volctrl
+cd_ad
+CD_DISC_INFO
+CD_TOC_ENTRY
+Central Processing Unit, Type of the
+CENTScreen XBIOS extension
+Changes in PC-GEM
+Character input/output
+Character offset table
+CHECKED
+Chgsysvar
+Chgvector
+CHK Instruction Exception vector
+CHTW_MSG
+CH_EXIT
+CICON
+CICONBLK
+CJar
+Classic XAcc
+Clean programming
+ClearPageMode
+Clear_down
+Clear_eol
+Clear_home
+Clear_line
+Clear_sol
+Clear_up
+Click, Double-
+Click, Single-
+Clicks, Multiple
+Client minimum requirement
+ClientData
+ClientGEMPB
+client_exit
+Clip
+Clipboard, Data exchange via
+Clipping
+clkdivide
+Clock (200Hz), Vector for
+Clones, AES
+CLOSER
+CLRCAT
+CLUT
+CL_COMMAND
+CL_INIT
+CL_TIME
+CMD_ALLOCMEM
+CMD_ALLOCPAGE
+CMD_BLANK
+CMD_CLIPMEM
+CMD_COPYMEM
+CMD_COPYPAGE
+CMD_ENUMMODES
+CMD_FILLMEM
+CMD_FLIPPAGE
+CMD_FREEMEM
+CMD_FREEPAGE
+CMD_GETINFO
+CMD_GETMODE
+CMD_GETVERSION
+CMD_LINEMEM
+CMD_SETADR
+CMD_SETMODE
+CMD_SYNCMEM
+CMD_TESTMODE
+CMD_TEXTUREMEM
+Cnecin
+Co-processor, mathematical
+Code, self-modifying
+colorptr
+COLORS_CHANGED
+COLOR_ENTRY
+COLOR_ID
+COLOR_RGB
+COLOR_TAB
+Colour icons present?
+Colour index and pixel value, VDI
+Colour lookup table (CLUT)
+Colour table functions
+Colour, Subjectivity of
+Command lines, extended
+COMMAND.PRG, Launching of
+Compatibility considerations
+Components of a window
+Computer family
+CON:, Attribute bits of the device
+configKernel
+Configuration inquiry
+Constants for the Falcon's video hardware
+Contact
+Contact initiation
+conterm
+Context-sensitive help
+Context-sensitive menus
+contrl
+control
+Control functions
+controlSwitch
+Cont_All
+Cont_Process
+con_state
+Cookie and XBRA list
+Cookie jar
+Cookie jar, End of
+Cookie jar, Size of
+Cookie name, Choice of
+Cookie, 3DMN
+Cookie, 3RDB
+Cookie, 60Hz
+Cookie, 8*8
+Cookie, A2sv
+Cookie, AB40
+Cookie, ACCS
+Cookie, AFnt
+Cookie, AgK0
+Cookie, AHVR
+Cookie, ALHP
+Cookie, ALIC
+Cookie, ALRM
+Cookie, AmAN
+Cookie, AMC1
+Cookie, AMC2
+Cookie, AMCG
+Cookie, ANSe
+Cookie, APGM
+Cookie, ARAe
+Cookie, ARTS
+Cookie, asGT
+Cookie, ASum
+Cookie, AVmw
+Cookie, AVOJ
+Cookie, AVSV
+Cookie, BASH
+Cookie, BBD2
+Cookie, BCKW
+Cookie, BGEM
+Cookie, BGHD
+Cookie, BHdl
+Cookie, BHLP
+Cookie, BIGS
+Cookie, BIOC
+Cookie, BLNK
+Cookie, BLOW
+Cookie, BScn
+Cookie, BSIM
+Cookie, BSTE
+Cookie, BUG1
+Cookie, C24P
+Cookie, CACH
+Cookie, CALD
+Cookie, CASE
+Cookie, CatS
+Cookie, CaTT
+Cookie, CB2K
+Cookie, CBCE
+Cookie, CBDF
+Cookie, CBHD
+Cookie, CBHY
+Cookie, CBIT
+Cookie, CBTS
+Cookie, CCDA
+Cookie, cdMC
+Cookie, CDOT
+Cookie, ceci
+Cookie, CFIX
+Cookie, CFsl
+Cookie, CHAM
+Cookie, CHBT
+Cookie, CHN1
+Cookie, CHNG
+Cookie, CHTW
+Cookie, CICN
+Cookie, CISY
+Cookie, CJar
+Cookie, CJAR
+Cookie, ck01
+Cookie, CKBD
+Cookie, CKJR
+Cookie, CLCK
+Cookie, CLK1
+Cookie, CLOK
+Cookie, CM16
+Cookie, CNTS
+Cookie, COLO
+Cookie, CPSL
+Cookie, CRAC
+Cookie, CRIT
+Cookie, CSMD
+Cookie, CT40
+Cookie, CT60
+Cookie, CTCH
+Cookie, CtCp
+Cookie, CTSF
+Cookie, cVDI
+Cookie, CWCo
+Cookie, DATE
+Cookie, DATL
+Cookie, DAWN
+Cookie, DBFX
+Cookie, DCdd
+Cookie, DCF7
+Cookie, DCSD
+Cookie, DECD
+Cookie, Deleting a
+Cookie, DEPI
+Cookie, DHST
+Cookie, DIG2
+Cookie, DJBX
+Cookie, DKEY
+Cookie, DNTR
+Cookie, DPAT
+Cookie, DPRS
+Cookie, DRIV
+Cookie, DRRH
+Cookie, Dsel
+Cookie, DSSO
+Cookie, DYDL
+Cookie, DYJA
+Cookie, DYJD
+Cookie, DYJT
+Cookie, DYNL
+Cookie, DYwl
+Cookie, DYWL
+Cookie, EADC
+Cookie, EBPO
+Cookie, EdDI
+Cookie, EDFX
+Cookie, EGON
+Cookie, EMNP
+Cookie, ENV$
+Cookie, ENVN
+Cookie, ENVR
+Cookie, EPro
+Cookie, ETM
+Cookie, EURO
+Cookie, EUSB
+Cookie, EXRA
+Cookie, EXTD
+Cookie, F117
+Cookie, FaKE
+Cookie, FALT
+Cookie, FAX!
+Cookie, FAXR
+Cookie, FHFX
+Cookie, FIX2
+Cookie, FLTP
+Cookie, FLXD
+Cookie, fMSX
+Cookie, Fose
+Cookie, FOse
+Cookie, FrmD
+Cookie, FSEL
+Cookie, FSER
+Cookie, FSMC
+Cookie, FSmp
+Cookie, fVDI
+Cookie, FxOP
+Cookie, F_3D
+Cookie, GABI
+Cookie, GBel
+Cookie, GCOM
+Cookie, GDEV
+Cookie, GEHC
+Cookie, GEHD
+Cookie, GEMB
+Cookie, GENV
+Cookie, Gfix
+Cookie, GI30
+Cookie, GIGA
+Cookie, gk5"
+Cookie, gkCO
+Cookie, GLAS
+Cookie, GLBL
+Cookie, GMNI
+Cookie, GMTC
+Cookie, GNUC
+Cookie, Gnva
+Cookie, GOBJ
+Cookie, GOff
+Cookie, GSND
+Cookie, GSP1
+Cookie, GSXB
+Cookie, GULM
+Cookie, HABO
+Cookie, hade
+Cookie, HAMM
+Cookie, HBFS
+Cookie, HcP6
+Cookie, HDDR
+Cookie, HDEX
+Cookie, HDEY
+Cookie, HDJR
+Cookie, HDLD
+Cookie, HDPR
+Cookie, HDRC
+Cookie, HDST
+Cookie, HDSW
+Cookie, HFIX
+Cookie, hFRB
+Cookie, HIDS
+Cookie, HMDU
+Cookie, HMOC
+Cookie, HMRD
+Cookie, HMRS
+Cookie, HPHC
+Cookie, HPLJ
+Cookie, HSCD
+Cookie, HSND
+Cookie, HSnd
+Cookie, HWAM
+Cookie, IBMP
+Cookie, ICFS
+Cookie, ICST
+Cookie, IDSK
+Cookie, IMAC
+Cookie, IMNE
+Cookie, INSJ
+Cookie, INXR
+Cookie, iPRN
+Cookie, IRSB
+Cookie, iTMA
+Cookie, JAM1
+Cookie, JANU
+Cookie, JB2G
+Cookie, JCLK
+Cookie, JCNB
+Cookie, JCNC
+Cookie, JCNH
+Cookie, JCNT
+Cookie, JFTP
+Cookie, JINX
+Cookie, JMLB
+Cookie, JMLS
+Cookie, JSHD
+Cookie, JUST
+Cookie, J_Sc
+Cookie, KAOS
+Cookie, KbEv
+Cookie, KEYT
+Cookie, KGTF
+Cookie, KIDI
+Cookie, KLME
+Cookie, KREG
+Cookie, KyMp
+Cookie, KyWt
+Cookie, Lace
+Cookie, LACY
+Cookie, LALA
+Cookie, lanc
+Cookie, LASB
+Cookie, LAWC
+Cookie, LDGM
+Cookie, LEDP
+Cookie, LEmu
+Cookie, Lity
+Cookie, LLCR
+Cookie, LMus
+Cookie, LOGB
+Cookie, LoSe
+Cookie, LP/2
+Cookie, LPCD
+Cookie, LPJM
+Cookie, LTMF
+Cookie, M16s
+Cookie, M16X
+Cookie, macc
+Cookie, MADD
+Cookie, MADN
+Cookie, Maes
+Cookie, MagC
+Cookie, MAGN
+Cookie, MagX
+Cookie, MAST
+Cookie, MaTC
+Cookie, MbAr
+Cookie, MBRD
+Cookie, MCL_
+Cookie, McSn
+Cookie, MCSP
+Cookie, MCWR
+Cookie, MDIA
+Cookie, MDRK
+Cookie, MDSa
+Cookie, MFAC
+Cookie, MFFM
+Cookie, MFIX
+Cookie, MFMV
+Cookie, MFNT
+Cookie, MGEM
+Cookie, MgMc
+Cookie, MgMx
+Cookie, MgPC
+Cookie, MgSn
+Cookie, MID3
+Cookie, MIMA
+Cookie, MiNT
+Cookie, MIPS
+Cookie, MJAF
+Cookie, MKHC
+Cookie, MkJr
+Cookie, MM2X
+Cookie, MMAC
+Cookie, MMUT
+Cookie, MM_2
+Cookie, MN3D
+Cookie, MNAM
+Cookie, MOAF
+Cookie, MOGR
+Cookie, MPRO
+Cookie, MRAM
+Cookie, MSPD
+Cookie, MSPO
+Cookie, mstx
+Cookie, MTCI
+Cookie, MTft
+Cookie, MUPF
+Cookie, MWHL
+Cookie, MZTR
+Cookie, MZVT
+Cookie, M_IN
+Cookie, N203
+Cookie, nAES
+Cookie, NAH3
+Cookie, NBEL
+Cookie, NBLL
+Cookie, NCLN
+Cookie, ne2k
+Cookie, NERV
+Cookie, NETS
+Cookie, NEXB
+Cookie, NEXK
+Cookie, NFMT
+Cookie, NFnt
+Cookie, NKCC
+Cookie, NLdr
+Cookie, NMGE
+Cookie, NO7P
+Cookie, noCF
+Cookie, NOR5
+Cookie, NOVA
+Cookie, NSC1
+Cookie, Nspd
+Cookie, nTAS
+Cookie, NTK4
+Cookie, nTOS
+Cookie, NUL>
+Cookie, Null-
+Cookie, NVDI
+Cookie, OBNL
+Cookie, OFLS
+Cookie, OPMM
+Cookie, OSBL
+Cookie, OSTT
+Cookie, OTOS
+Cookie, OV24
+Cookie, oVDI
+Cookie, OVDJ
+Cookie, OVEP
+Cookie, OVER
+Cookie, OVEX
+Cookie, OVFS
+Cookie, OVIM
+Cookie, OVLS
+Cookie, OVRD
+Cookie, OVUT
+Cookie, OVWI
+Cookie, PAMN
+Cookie, PAUL
+Cookie, PBUG
+Cookie, PDEB
+Cookie, PDeb
+Cookie, PDOS
+Cookie, PDRZ
+Cookie, PFIX
+Cookie, Pinp
+Cookie, PKSH
+Cookie, Placing of a
+Cookie, PMMU
+Cookie, POIS
+Cookie, POWM
+Cookie, PRCS
+Cookie, PRDS
+Cookie, PRMD
+Cookie, PRN!
+Cookie, PRNß
+Cookie, PRO5
+Cookie, PROB
+Cookie, PROT
+Cookie, PRTD
+Cookie, PRTO
+Cookie, prtr
+Cookie, PRTR
+Cookie, PSND
+Cookie, PSSG
+Cookie, PTOS
+Cookie, QIKM
+Cookie, QMAC
+Cookie, QMCP
+Cookie, QST2
+Cookie, QST3
+Cookie, QUAN
+Cookie, RAIL
+Cookie, RaSn
+Cookie, RESG
+Cookie, RFLX
+Cookie, RFUS
+Cookie, RGUS
+Cookie, RING
+Cookie, ROMD
+Cookie, ROT8
+Cookie, RPIT
+Cookie, RREG
+Cookie, RSLT
+Cookie, RSpd
+Cookie, RSVE
+Cookie, RSVF
+Cookie, RTKC
+Cookie, RTOB
+Cookie, RWIN
+Cookie, SAM
+Cookie, SBKM
+Cookie, SBTE
+Cookie, SBTS
+Cookie, SCAH
+Cookie, SCKM
+Cookie, SCPN
+Cookie, SCRD
+Cookie, SCRN
+Cookie, SCRS
+Cookie, SCRW
+Cookie, SCSI
+Cookie, SCSV
+Cookie, SDCH
+Cookie, SDES
+Cookie, SDsk
+Cookie, SDWN
+Cookie, SELC
+Cookie, SENV
+Cookie, SFA^
+Cookie, SFIX
+Cookie, SFMN
+Cookie, ShLk
+Cookie, shlp
+Cookie, SKEY
+Cookie, SLCT
+Cookie, SLif
+Cookie, SLIP
+Cookie, SM00
+Cookie, SM01
+Cookie, SM02
+Cookie, SMAL
+Cookie, SMAU
+Cookie, SMon
+Cookie, SMTT
+Cookie, SNAP
+Cookie, SOFS
+Cookie, SOSW
+Cookie, SpcE
+Cookie, SPCK
+Cookie, SPEE
+Cookie, SPEK
+Cookie, SPEX
+Cookie, spMR
+Cookie, Spol
+Cookie, SPRG
+Cookie, SR17
+Cookie, SSND
+Cookie, ST-C
+Cookie, ST17
+Cookie, STAT
+Cookie, STEM
+Cookie, STEW
+Cookie, STFA
+Cookie, StIc
+Cookie, STiK
+Cookie, STMS
+Cookie, strk
+Cookie, STRX
+Cookie, SupV
+Cookie, SVAR
+Cookie, SVGA
+Cookie, SWAP
+Cookie, SwTm
+Cookie, SYMB
+Cookie, SYNL
+Cookie, SYNT
+Cookie, SysE
+Cookie, Syso
+Cookie, SYST
+Cookie, SZ_M
+Cookie, S_DR
+Cookie, T206
+Cookie, T2GM
+Cookie, TALK
+Cookie, TAPE
+Cookie, TASS
+Cookie, TCFS
+Cookie, TCRB
+Cookie, Tenv
+Cookie, TFIX
+Cookie, THNX
+Cookie, THRM
+Cookie, THST
+Cookie, TIM3
+Cookie, TIM5
+Cookie, TIME
+Cookie, TK40
+Cookie, TL3D
+Cookie, TLWV
+Cookie, Tmon
+Cookie, TMON
+Cookie, tmsW
+Cookie, TOpW
+Cookie, TOUC
+Cookie, TPat
+Cookie, TPGM
+Cookie, TRAK
+Cookie, TraP
+Cookie, Trpp
+Cookie, TRUE
+Cookie, TSEN
+Cookie, TSWP
+Cookie, TTTF
+Cookie, TUBS
+Cookie, TWFS
+Cookie, Typ1
+Cookie, UFSL
+Cookie, UIS3
+Cookie, UKB1
+Cookie, UKB3
+Cookie, UN*X
+Cookie, USCK
+Cookie, USHD
+Cookie, UsNm
+Cookie, USPK
+Cookie, USRS
+Cookie, USSC
+Cookie, UTRK
+Cookie, VBLF
+Cookie, VDIp
+Cookie, VDLY
+Cookie, VECS
+Cookie, VeiL
+Cookie, VFIX
+Cookie, VFNT
+Cookie, VGAS
+Cookie, VI-2
+Cookie, View
+Cookie, VIRA
+Cookie, VMEM
+Cookie, VPCH
+Cookie, VRAM
+Cookie, VREP
+Cookie, VSco
+Cookie, VSCR
+Cookie, VSTM
+Cookie, vT52
+Cookie, VTFX
+Cookie, VXCK
+Cookie, WaHW
+Cookie, WARP
+Cookie, WaSA
+Cookie, WBrd
+Cookie, wdlg
+Cookie, WDOG
+Cookie, WEGA
+Cookie, WfNa
+Cookie, WFSL
+Cookie, WICO
+Cookie, WinK
+Cookie, WINX
+Cookie, WINZ
+Cookie, WPRO
+Cookie, WRAP
+Cookie, WrAp
+Cookie, XALT
+Cookie, XBTN
+Cookie, XDsk
+Cookie, XFRB
+Cookie, XFS1
+Cookie, xFSL
+Cookie, Xgem
+Cookie, XHDI
+Cookie, XKBD
+Cookie, XMMU
+Cookie, XMuz
+Cookie, xNet
+Cookie, XPCI
+Cookie, xRmt
+Cookie, XSDD
+Cookie, XSND
+Cookie, XSSI
+Cookie, XTOS
+Cookie, xUAG
+Cookie, xUFC
+Cookie, XWin
+Cookie, zCAC
+Cookie, zDCF
+Cookie, _5MS
+Cookie, _AFM
+Cookie, _AKP
+Cookie, _CF_
+Cookie, _CPU
+Cookie, _DOS
+Cookie, _FDC
+Cookie, _FLK
+Cookie, _FPU
+Cookie, _FRB
+Cookie, _FSR
+Cookie, _IDT
+Cookie, _INF
+Cookie, _INU
+Cookie, _ISO
+Cookie, _JPD
+Cookie, _MCF
+Cookie, _MCH
+Cookie, _MET
+Cookie, _MIL
+Cookie, _NET
+Cookie, _OOL
+Cookie, _PCI
+Cookie, _PKT
+Cookie, _PWR
+Cookie, _SLM
+Cookie, _SND
+Cookie, _SWI
+Cookie, _T2W
+Cookie, _T30
+Cookie, _USB
+Cookie, _VDI
+Cookie, _VDO
+Cookie, __NF
+Cookie, ΣFSC
+Cookies under MagiC Mac
+Cooperation between MagiC and the MacOS
+Coordinates, NDC
+Coordinates, Normalized
+Coordinates, RC
+Copies of a printed page
+COPS
+COPS, Test for
+Copy raster form
+CopyModeToActiveMode
+Core dump
+Core dump, Name for
+CounterRead
+CounterStart
+Cprnos
+Cprnout
+CPU cache purging
+CPU, Stackframes of
+CPU, Type of the
+CPUFreq
+CPX file, Format of a
+CPX file, Header of a
+CPX functions
+CPX module, Activation of a
+CPX programming guidelines
+CPX, Event
+CPX, Form
+CPX, Suffix of a
+CPXHEAD
+CPXINFO
+cpx_button
+cpx_call
+cpx_close
+cpx_draw
+cpx_hook
+cpx_init
+cpx_key
+cpx_m1
+cpx_m2
+CPX_Save
+cpx_timer
+cpx_wmove
+Crawcin
+Crawio
+Crazy-Dots XBIOS extension
+Creat_Queue
+Creat_Screen
+criticret
+CROSSED
+crys_if
+CT60 XBIOS extension
+ct60_cache
+ct60_flush_cache
+ct60_read_core_temperature
+ct60_rw_parameter
+ct60_vmalloc
+CTS interrupt, Vector for
+CT_KEY
+CT_MOVE
+CT_NEWTOP
+CT_UPDATE
+Cubase MROS
+Cursconf
+Cursor position, Return of the
+CURSOR_INIT
+Cur_down
+Cur_home
+Cur_left
+Cur_off
+Cur_on
+Cur_right
+Cur_up
+

+ +

+D
+D&D-listing_1
+Data exchange via clipboard
+Data exchange via the GEM clipboard
+Data structure
+Data structures for a DFS
+Data structures for an XFS
+Data-type fix31
+Data-types
+dataID
+Date and Time
+Date, Time and Timer
+DA_KNOWHOW
+DB
+Dbmsg
+DC
+DCD interrupt, Vector for
+Dchroot
+Dclosedir
+Dcntl
+Dcreate
+Ddelete
+ddev_close
+ddev_datime
+ddev_delete
+ddev_getc
+ddev_getline
+ddev_ioctl
+ddev_open
+ddev_putc
+ddev_read
+ddev_seek
+ddev_stat
+ddev_write
+ddlisting
+DD_CLIPBOARD
+dd_dmd
+DD_EXT
+DD_LEN
+DD_NAK
+DD_OK
+DD_PRINTER
+dd_refcnt
+DD_STRING
+DD_TRASH
+Debug
+DebugUI
+Declaration of sources
+DEFAULT
+Defines (SSP)
+Definition of the driver daisy chain
+defshiftmd
+Delete_Queue
+Del_line
+Del_Screen
+Description of the VDI writing modes
+Descriptor, Directory
+Descriptor, Directory handle
+Descriptor, Drive medium
+Descriptor, File
+Details about vector fonts
+Detecting the presence of TosBox, Steem and PaCifiST
+devconnect
+DEVDRV
+Development systems
+Development systems, APL
+Development systems, Assembler
+Development systems, Basic
+Development systems, C
+Development systems, C++
+Development systems, Fortran77+
+Development systems, functional
+Development systems, Modula
+Development systems, Oberon
+Development systems, Pascal
+Development systems, RCS
+Device number of the VDI
+Device-independent format
+Devinfo
+dev_close
+Dev_create
+dev_datime
+dev_descr
+dev_getc
+dev_getline
+DEV_INSTALL
+dev_ioctl
+DEV_M_INSTALL
+DEV_NEWBIOS
+DEV_NEWTTY
+dev_putc
+dev_read
+dev_seek
+dev_stat
+dev_write
+Dfree
+DFS, Data structures for a
+DFS-concept in MagiC
+dfs_dfree
+dfs_dir2FD
+dfs_dir2index
+dfs_drv_close
+dfs_drv_open
+dfs_ext_fd
+dfs_fcreate
+dfs_fdelete
+dfs_fxattr
+DFS_GETINFO
+dfs_init
+DFS_INSTDFS
+dfs_name
+dfs_next
+dfs_pathconf
+dfs_readlink
+dfs_sfirst
+dfs_snext
+dfs_sync
+Dgetcwd
+Dgetdrv
+Dgetpath
+dhd_dmd
+DHST
+DHST_ACK
+DHST_ADD
+Diablo drivers
+DIALOG
+Dialog boxes
+Dialog boxes, Alert
+Dialog boxes, Creation of
+Dialog boxes, Design rules for
+Dialog boxes, modal
+Dialog boxes, nonmodal
+Dialogs, GDOS fonts in
+digana
+digcode
+digcom
+digmode
+digsrate
+DIN A3
+DIN A4
+DIN A5
+DIN B5
+DIP switches
+Directory descriptor
+Directory functions
+Directory handle descriptor
+DISABLED
+DISKINFO
+Dispatcher, BIOS
+Dispatcher, GEMDOS
+Dispatcher, XBIOS
+Display Enable Signal vector
+DITHER_MODE
+Diverting vectors
+Division by Zero Error vector
+Dlock
+DMA chip, Access to
+DMAread
+DMAwrite
+DNARROW
+Document History protocol
+DOMagixAESVars
+Domain, MiNT-
+Domain, TOS-
+Dopendir
+DOSMODE
+Dosound
+DOSTIME
+DOSVARS
+Double-click
+DO_WPOPUP
+DP
+Dpathconf
+DP_ATOMIC
+DP_CASE
+DP_IOPEN
+DP_MAXLINKS
+DP_MODEATTR
+DP_NAMEMAX
+DP_PATHMAX
+DP_TRUNC
+DP_VOLNAMEMAX
+DP_XATTRFIELDS
+Drag&Drop protocol
+Drag&Drop, Data-types for
+Drag&Drop, Header for
+Drag&Drop, Source text for
+Drag&Drop, Status bytes for
+Draw sprite
+DRAW3D
+Dreaddir
+Dreadlabel
+Drewinddir
+Drive functions
+Drive medium descriptor
+Driver types
+Drivers, Bit-image
+Drivers, Camera
+Drivers, Fax
+Drivers, GDOS
+Drivers, Memory
+Drivers, Metafile
+Drivers, Plotter
+Drivers, Printer
+Drivers, Screen
+Drivers, Tablet
+Drivers, VDI
+Drives of the BIOS, Mounted
+DRS
+Drvmap
+drvprotec
+Drv_add
+drv_change
+DRV_ENTRY
+DRV_INFO
+Dsetdrv
+Dsetkey
+Dsetpath
+DSP programming
+DSPBLOCK
+dspclear
+dspintact
+dspmemory
+dspmix
+dspmode
+dspreset
+dsptristate
+Dsp_Available
+Dsp_BlkBytes
+Dsp_BlkHandShake
+Dsp_BlkUnpacked
+Dsp_BlkWords
+Dsp_DoBlock
+Dsp_ExecBoot
+Dsp_ExecProg
+Dsp_FlushSubroutines
+Dsp_GetProgAbility
+Dsp_GetWordSize
+Dsp_Hf0
+Dsp_Hf1
+Dsp_Hf2
+Dsp_Hf3
+dsp_hostcommand
+Dsp_HStat
+Dsp_InqSubrAbility
+Dsp_InStream
+Dsp_IOStream
+Dsp_LoadProg
+Dsp_LoadSubroutine
+Dsp_Lock
+Dsp_LodToBinary
+Dsp_MultBlocks
+Dsp_OutStream
+Dsp_RemoveInterrupts
+Dsp_RequestUniqueAbility
+Dsp_Reserve
+Dsp_RunSubroutine
+Dsp_SetVectors
+Dsp_TriggerHC
+Dsp_Unlock
+dstate
+DT
+DTA
+Dwritelabel
+Dxopendir
+Dxreaddir
+d_biosdev
+d_devcode
+d_dfs
+d_drive
+d_driver
+d_root
+d_xfs
+

+ +

+E
+E2BIG
+EACCDN
+EACCES
+EADDRINUSE
+EADDRNOTAVAIL
+EADV
+EAFNOSUPPORT
+EAGAIN
+EALREADY
+EAUTH
+EBACKGROUND
+EBADARG
+EBADE
+EBADF
+EBADMSG
+EBADR
+EBADRPC
+EBADRQ
+EBADRQC
+EBADSEC
+EBADSF
+EBADSLT
+EBFONT
+EBREAK
+EBUSY
+ECHILD
+ECHMEDIA
+ECHRNG
+ECOMM
+ECONNABORTED
+ECONNREFUSED
+ECONNRESET
+ECRC
+ECWD
+ec_illegal
+ED
+EDCHAR
+EdDI
+EDEADLK
+EDEND
+EDESTADDRREQ
+EDINIT
+EDITABLE
+Editable fields in MagiC
+Editable object functions
+edit_close
+edit_create
+edit_cursor
+edit_delete
+edit_evnt
+edit_get_buf
+edit_get_colour
+edit_get_cursor
+edit_get_dirty
+edit_get_font
+edit_get_format
+edit_get_pos
+edit_get_scrollinfo
+edit_get_sel
+edit_open
+edit_resized
+edit_scroll
+edit_set_buf
+edit_set_colour
+edit_set_cursor
+edit_set_dirty
+edit_set_font
+edit_set_format
+edit_set_pos
+EDOM
+EDOTDOT
+EDQUOT
+EDRIVE
+EDRVNR
+EDSTART
+EDVNRSP
+EERROR
+EEXIST
+EFAULT
+EFBIG
+EFILNF
+EFTYPE
+EGENERIC
+EGENRL
+EgetPalette
+EgetShift
+EGSBF
+EHOSTDOWN
+EHOSTUNREACH
+EIDRM
+EIHNDL
+EILSEQ
+EIMBA
+EINPROGRESS
+EINSERT
+EINTERNAL
+EINTR
+EINTRN
+EINVAL
+EINVFN
+EIO
+EISCONN
+EISDIR
+EL2HLT
+EL2NSYNC
+EL3HLT
+EL3RST
+ELIBACC
+ELIBBAD
+ELIBEXEC
+ELIBMAX
+ELIBSCN
+ELNRNG
+ELOCKED
+ELOOP
+EMEDIA
+EMEDIUMTYPE
+EMFILE
+EMLINK
+EMOUNT
+emphasis
+EMSGSIZE
+Emulators
+EMULTIHOP
+EmuTOS, Detect
+ENAMETOOLONG
+ENAVAIL
+END_MCTRL
+end_os
+End_Process
+END_UPDATE
+ENEEDAUTH
+ENETDOWN
+ENETRESET
+ENETUNREACH
+ENFILE
+ENHNDL
+ENMFIL
+ENMFILES
+ENOANO
+ENOBUFS
+ENOCSI
+ENODATA
+ENODEV
+ENOENT
+ENOEXEC
+ENOLCK
+ENOLINK
+ENOMEDIUM
+ENOMEM
+ENOMSG
+ENONET
+ENOPKG
+ENOPROTOOPT
+ENOSPC
+ENOSR
+ENOSTR
+ENOSYS
+ENOTBLK
+ENOTCONN
+ENOTDIR
+ENOTEMPTY
+ENOTNAM
+ENOTSOCK
+ENOTTY
+ENSAME
+ENSLOCK
+ENSMEM
+ENUMMODE_CONT
+ENUMMODE_EXIT
+Environment strings, Pointer to
+Environmnetal variable OEPSERVER
+Environmnetal variable OLEMANAGER
+Environmnetal variable OLGAMANAGER
+ENXIO
+EOPNOTSUPP
+EOTHER
+EOVERFLOW
+EPAPER
+EPERM
+EPFNOSUPPORT
+EPIPE
+EPLFMT
+EPROCLIM
+EPROCUNAVAIL
+EPROGMISMATCH
+EPROGUNAVAIL
+EPROTO
+EPROTONOSUPPORT
+EPROTOTYPE
+EPTHNF
+EPTHOV
+ERANGE
+EREADF
+EREMOTE
+EREMOTEIO
+ERESTART
+EROFS
+ERPCMISMATCH
+ERRINFO
+ERROR
+errorcode
+ESBLOCK
+Escape functions
+Escape sequences
+ESCCANCEL
+ESECNF
+ESECTOR
+EsetBank
+EsetColor
+EsetGray
+EsetPalette
+EsetShift
+EsetSmear
+ESHUTDOWN
+ESNDLOCKED
+ESNDNOTLOCK
+ESOCKTNOSUPPORT
+ESPIPE
+ESRCH
+ESRMNT
+ESTALE
+ESTRPIPE
+ES_ACK
+ES_COMPILE
+ES_EXEC
+ES_INIT
+ES_LINK
+ES_MAKE
+ES_MAKEALL
+ES_MAKEEXEC
+ES_OK
+ES_PROJECT
+ES_QUIT
+ES_SHLCTRL
+ETIME
+ETIMEDOUT
+ETOOMANYREFS
+etv_critic
+etv_term
+etv_timer
+etv_xtra
+ETXTBSY
+EUCLEAN
+EUKCMD
+EUNATCH
+EUNCMD
+EUNDEV
+EUSERS
+EVENT
+Event CPX
+Event library
+EVNT
+evnt_button
+evnt_dclick
+evnt_dclicks
+evnt_keybd
+evnt_mesag
+evnt_mouse
+evnt_multi
+Evnt_Signal
+evnt_timer
+Evnt_Wait
+ev_adrerr
+ev_a_line
+ev_buserr
+ev_chk_ofl
+ev_divby0
+ev_priverr
+ev_reset
+ev_trace
+ev_trapv
+EWOULDBLOCK
+EWRITE
+EWRITF
+EWRPRO
+Example for HNDL_OBJ
+Example of a MAGX.INF file
+Example: Chatwin and STJ-Oberon-2
+Example: no|Link's XAcc protocol
+Examples for vq_scrninfo
+Exception vector 36
+Exceptions under MagiC Mac
+EXCPT
+EXDEV
+exec_os
+EXFULL
+EXIT
+Expand memory, internal
+ext
+ExtCatMsg
+Extended feature
+Extended file-selectors
+Extended GEM
+Extended graphics library
+Extended names
+Extended shell library
+Extended XAcc
+Extended-Fast-RAM-Buffer
+Extensions
+extMac
+Extract from MagiC's BIOS
+ExtRsConf
+E_CHNG
+E_CRC
+E_OK
+E_SEEK
+

+ +

+F
+Faccept
+fading
+FALCON_BITS
+Fast-RAM buffer
+Fast-RAM, End of
+Fast-RAM-Buffer, Extended
+fastcut
+Fastload
+fast_read_config_byte
+fast_read_config_longword
+fast_read_config_word
+fast_read_io_byte
+fast_read_io_longword
+fast_read_io_word
+fast_read_mem_byte
+fast_read_mem_longword
+fast_read_mem_word
+Fatal error in aes
+Fatal error in gemdos
+Fatal error while booting
+Fattrib
+Fax drivers
+FA_ALERTDONE
+FA_ALERTISOPEN
+FA_FSELCLOSED
+FA_FSELISOPEN
+Fbind
+Fchdir
+Fchmod
+Fchown
+Fchown16
+Fclose
+Fcntl
+Fcntl, CD-ROM commands for
+Fcntl, File commands for
+Fcntl, Process commands for
+Fcntl, SharedMem commands for
+Fcntl, Terminal commands for
+Fconnect
+fcookie
+Fcreate
+Fdatime
+FDC, Vector for
+FDC, Write-density of the
+Fdelete
+Fdirfd
+Fdup
+fd_attr
+fd_children
+fd_date
+fd_ddev
+fd_dev
+fd_dirch
+fd_dirpos
+fd_dmd
+fd_fpos
+fd_len
+fd_mode
+fd_multi
+fd_multi1
+fd_name
+fd_next
+fd_owner
+fd_parent
+fd_refcnt
+fd_stcl
+fd_time
+fd_unused
+fd_user1
+fd_user2
+Feed tray of the printer
+Feedback, acoustic
+Feedback, visual
+Ffchmod
+Ffchown
+Ffdopendir
+Fflush
+Fforce
+Ffstat64
+Fgetchar
+Fgetdta
+Fgetpeername
+Fgetsockname
+Fgetsockopt
+File attributes of TOS
+File descriptor
+File formats
+File functions
+File locking possible?
+File-selector as a dialog
+File-selector in a window
+File-selector library
+File-systems
+File-systems, alternative
+File-systems, Rule of thumb for
+Filename field
+FILEPTR
+FILESYS
+Filesystems under MagiC Mac
+FILE_SELECTED
+FILE_UPDATED
+Fill attributes
+Filled polygon
+Filled rectangle
+find_pci_classcode
+find_pci_device
+Find_Process
+Find_Queue
+Finstat
+FIOEXECPT
+FIONREAD
+FIONWRITE
+fix31
+FL3DACT
+FL3DBAK
+FL3DIND
+FLAG3D
+Flags for the behaviour of the list box
+Flags of a program
+FLAT_HAND
+FLG_16BIT
+FLG_32BIT
+FLG_8BIT
+FLG_ENDMASK
+Flink
+Flisten
+Floating Point Unit, Type of
+flock
+Flock
+flock, Fcntl
+Flopfmt
+Floppy disk controller
+Floppy disk drives, Number of
+Floppy drive, Seekrate of
+Floppy parallel operation
+Floppy, Timeout of the
+Floprate
+Floprd
+Flopver
+Flopwr
+FlpDrvInfo
+FLP_PAR
+Flydials present?
+FMD_FINISH
+FMD_GROW
+FMD_SHRINK
+FMD_START
+Fmidipipe
+Fm_add
+FNTS_3D
+fnts_add
+FNTS_BTMP
+fnts_close
+fnts_create
+fnts_delete
+FNTS_DISPLAY
+fnts_do
+fnts_evnt
+fnts_get_info
+fnts_get_name
+fnts_get_no_styles
+fnts_get_style
+FNTS_ITEM
+FNTS_MONO
+fnts_open
+FNTS_OUTL
+FNTS_PROP
+fnts_remove
+fnts_update
+FNT_CHANGED
+FNT_DIALOG
+Font index and ID
+Font protocol
+Font selection
+Font selector in a modal dialog
+Font selector in a window
+Font, Font-ID of a
+Font, Index of a
+Font-selector overview
+FontGDOS
+Fonts in dialogs
+Fonttyp
+FONT_ACK
+FONT_CHANGED
+FONT_HDR
+FONT_SELECT
+Fopen
+Form CPX
+Form library
+Format in background
+Format, Device-independent
+Format, Half
+Format, Landscape
+Format, Ledger
+Format, Legal
+Format, Letter
+Format, Portrait
+Format, Wide
+Formats, Page
+Formats, Paper
+form_alert
+form_button
+form_center
+form_dial
+form_do
+form_error
+form_error in N.AES
+form_keybd
+form_popup
+form_wbutton
+form_wkeybd
+form_xdial
+form_xdo
+form_xerr
+Fortran77+ development systems
+Foutstat
+Fpipe
+Fpoll
+FPU, Type of
+Fputchar
+Fread
+Freadlink
+Freadv
+Frecvfrom
+Frecvmsg
+Free
+Freezing on an application
+Frename
+Frlock
+Frunlock
+Fseek
+Fseek64
+Fselect
+fsel_boxinput
+FSEL_CALLBACK
+fsel_exinput
+fsel_input
+Fsendmsg
+Fsendto
+Fsetdta
+Fsetsockopt
+Fsfirst
+Fsfirstidx
+Fshutdown
+fslx_close
+fslx_do
+fslx_evnt
+fslx_getnxtfile
+fslx_open
+fslx_set_flags
+FSM-GDOS
+Fsnext
+Fsocket
+Fsocketpair
+FSTAT
+Fstat64
+Fstatus
+Fsymlink
+Fsync
+fs_descr
+FS_INSTALL
+FS_MOUNT
+FS_UNINSTALL
+FS_UNMOUNT
+FTRUNCATE
+FULLER
+Functional development systems
+Funlock
+Further communication
+FUTIME
+Fwrite
+Fwritev
+Fxattr
+F_DUPFD
+F_GETFD
+F_GETFL
+F_GETLK
+F_lock
+F_SETFD
+F_SETFL
+F_SETLK
+F_SETLKW
+

+ +

+G
+GCBITMAP
+GDOS Driver, Bit-Image
+GDOS drivers
+GDOS drivers, Camera
+GDOS drivers, Fax
+GDOS drivers, Memory
+GDOS drivers, Metafile
+GDOS drivers, Plotter
+GDOS drivers, Printer
+GDOS drivers, Screen
+GDOS drivers, Tablet
+GDOS fonts in dialogs
+GDOS, AMC-
+GDOS, Family of
+GDOS, Font-
+GDOS, FSM-
+GDOS, Speedo-
+GDOS_AMC
+GDOS_AMCLIGHT
+GDOS_ATARI
+GDOS_FNT
+GDOS_FSM
+GDOS_NONE
+GDPS, virtual memory management
+GDPS: Gerti's Driver Piping System
+GEM
+GEM, Extended
+GEM-Version 1.4, Atari-
+GEM-Version 1.x
+GEM-Version 2.x
+GEM-Version 3.x, Atari-
+GEM-Version 3.x, PC-
+GEM-Version 4.x, Atari-
+GEM/4
+GEM/5
+GEM/XM
+GEMDOS
+gemdos
+GEMDOS buffer lists
+GEMDOS Dispatcher
+GEMDOS error-messages
+GEMDOS function list
+GEMDOS structures
+GEMDOS, Parameter passing in
+GEMDOS, Program format under
+GEMDOS, Version number
+gemdos-trap
+GEMJING_RETURN
+GEM_ALIGN
+GEM_BEZ_QUAL
+GEM_COLOR
+GEM_END_BEZIER
+GEM_END_BGIF
+GEM_END_FILL
+GEM_END_GREY
+GEM_END_GROUP
+GEM_END_JOIN
+GEM_END_SHADOW
+GEM_GRID
+GEM_MUPB
+GEM_NO_LINE_STYLE
+GEM_START_BEZIER
+GEM_START_BGIF
+GEM_START_FILL
+GEM_START_GREY
+GEM_START_GROUP
+GEM_START_JOIN
+GEM_START_SHADOW
+GEM_WIND
+General description
+General remarks about MagiC Mac
+General remarks about MagiC's XFS-concept
+General remarks about shutdown
+General Rules
+Geneva library
+Get pixel
+GetActiveFeatures
+GetActiveModeDesc
+getBaseMode
+Getbpb
+getcookie
+GetFeatures
+GetFirstRect
+GetHdv_inuse
+Getmpb
+GETMULTI
+GetNextRect
+GetNumberofPModes
+GetPageSize
+GetPMode
+GetRegisterbase
+Getrez
+GetScreenDescriptor
+Gettime
+Get_blink
+Get_Buffer
+get_card_used
+get_machine_id
+get_pagesize
+get_resource
+get_routing
+GG
+Giaccess
+giveTimeToMac
+global
+Global field of the AES
+Glossary
+GM_OPEN_DIALOG
+GM_OPEN_PRGINFO
+GM_SHOW_FILE
+Goto_pos
+GO_PRIVATE
+gpio
+GPU Done, Vector for
+graf_dragbox
+graf_growbox
+graf_handle
+graf_mbox
+graf_mbox/graf_movebox
+graf_mkstate
+graf_mouse
+graf_movebox
+graf_multirubber
+graf_rubberbox
+graf_rubberbox/graf_rubbox
+graf_rubbox
+graf_shrinkbox
+graf_slidebox
+graf_slidebox from Geneva
+graf_watchbox
+graf_wwatchbox
+graf_xhandle
+Graphical overview of fill-type and pattern index
+Graphics library
+Graphics tablet functions
+GRECT
+Guidelines for CPX modules
+Guidelines, Style
+GZ_PRIVATE
+G_BOX
+G_BOXCHAR
+G_BOXTEXT
+G_BUTTON
+G_CICON
+G_CLRICN
+G_DTMFDB
+G_EDIT
+G_EDIT objects, Using
+G_FBOXTEXT
+G_FTEXT
+G_IBOX
+G_ICON
+G_IMAGE
+G_POPUP
+G_PROGDEF
+G_SHORTCUT
+G_SLIST
+G_STRING
+G_SWBUTTON
+G_TEXT
+G_TITLE
+G_USERDEF
+G_VECTORS
+G_vectors
+G_WINTITLE
+

+ +

+H
+Half format
+HARDCOPY
+Hardcopy routine, Pointer to
+hardplay
+hardrec
+Hardware, non-ST-compatible
+Hardware, Type of
+HARD_CLUT
+Hatari DHS XBIOS extension
+HatariOption
+HDFUNCS
+hdv_boot
+hdv_bpb
+hdv_init
+hdv_mediach
+hdv_rw
+Header of a program
+Header of a Resource file
+Height and width of vector fonts
+Help system, Requirements for
+Help systems
+Help systems, Encouragement for
+Help systems, Functioning of the
+Help, context-sensitive
+HIDDEN
+HIDE
+Hide mouse
+HIDETREE
+HIGHLIGHTED
+highsrate
+History
+History, SE protocol
+HNDL_CLSD
+HNDL_EDCH
+HNDL_EDDN
+HNDL_EDIT
+HNDL_INIT
+HNDL_MESG
+HNDL_MOVE
+HNDL_OBJ
+HNDL_OPEN
+HNDL_TOPW
+HNDL_UNTP
+Hooking into the reset vector
+hook_interrupt
+Horizontal line
+Horizontal offset table
+hot-spot
+HOTCLOSEBOX
+HOURGLASS
+How can I tell the viewer what is to be shown?
+How to implement an SPA
+How to implement an SRA
+hrecplay
+HSLIDE
+

+ +

+I
+ICONBLK
+Iconification in MagiC
+Iconification, Algorithm during
+Iconification, Elements after
+Iconification, Shortcuts for
+Iconification, Size after
+ICONIFIER
+Icons present?, Colour
+ICON_MSG
+ID4-Client
+ID4-Server
+IDC_FROM_ACC
+IDC_FROM_APP
+IDC_WAKE_UP
+Idle-test
+IKBD interrupts, Vector for
+Ikbdws
+Illegal Instruction Error vector
+Image format, Pixel-oriented
+Image format, Plane-oriented
+Implementing the View protocol
+INDBUTCOL
+INDIRECT
+INFO
+Initialization
+Initmouse
+init_hplay
+init_hplaypeak
+init_hrec
+init_hrecpeak
+init_hrppeak
+init_ihplaymix
+init_imemplay
+init_imemrec
+init_implaymix
+init_mplaypeak
+init_mrecpeak
+init_mrppeak
+init_peak
+Init_Process
+init_xmemplay
+init_xmemplay4
+init_xmemrec
+init_xmemrec4
+init_xmixplay
+Ink
+InplaceDrawing for OLGA (ID-4)
+Input fields in MagiC
+Input functions
+Inquire functions
+Inquiry protocol
+Install
+Install Hardcopy routines
+Installation of a DFS
+installed
+Ins_line
+intact
+INTEL_BITS
+Interactive Service
+Interface programming
+INTERLEAVE_PLANES
+Interrupt functions
+Interrupt, BUSY
+Interrupt, CTS
+Interrupt, DCD
+Interrupt, IKBD
+Interrupt, MFP-TT
+Interrupt, MIDI
+Interrupt, SCC-TT
+intin
+intout
+intrLock
+Introduction
+int_in
+int_out
+Invisible Service
+Ioqueue
+Iorec
+IOREC
+iovec
+IP_DIAL_DONE
+IP_DIAL_ERROR
+IP_DIAL_HANGUP
+IP_DIAL_REQUEST
+IP_HANGUP_DONE
+IP_STATUS_GET
+IRS
+is_EdDI
+ITIMER_PROF
+ITIMER_REAL
+ITIMER_VIRTUAL
+

+ +

+J
+Janus
+Jdisint
+Jenabint
+JINNEE_MSG
+

+ +

+K
+KAOS-TOS
+Kbdvbase
+KBDVBASE
+Kbrate
+Kbshift
+kcl_hook
+Kernel functions for an XFS
+Kerning
+Kerning parameter
+Kerning, Pair
+Kerning, Track
+KER_DOSLIMITS
+KER_DRVSTAT
+KER_GETINFO
+KER_INSTXFS
+KER_INTGARBC
+KER_INTMAVAIL
+KER_SETWBACK
+KER_XFSNAME
+Key assignments
+Key-clicks, Sound for
+KEYBDPARMS
+Keyboard codes for G_EDIT
+Keyboard functions
+Keyboard tables present?
+KEYCODE
+KEYTAB
+Keytbl
+kill_disk
+KOBOLD_ANSWER
+KOBOLD_CLOSE
+KOBOLD_CONFIG
+KOBOLD_FIRST_SLCT
+KOBOLD_FREE_DRIVES
+KOBOLD_JOB
+KOBOLD_JOB_NO_WINDOW
+KOBOLD_NEXT_SLCT
+

+ +

+L
+Landscape format
+Language of the operating system
+LASTOB
+LBOX_2SLDRS
+lbox_ascroll_to
+LBOX_AUTO
+LBOX_AUTOSLCT
+lbox_bscroll_to
+lbox_cnt_items
+lbox_create
+lbox_delete
+lbox_do
+lbox_free_items
+lbox_free_list
+lbox_get_afirst
+lbox_get_avis
+lbox_get_bentries
+lbox_get_bfirst
+lbox_get_bvis
+lbox_get_first
+lbox_get_idx
+lbox_get_item
+lbox_get_items
+lbox_get_slct_idx
+lbox_get_slct_item
+lbox_get_tree
+lbox_get_udata
+lbox_get_visible
+LBOX_ITEM
+LBOX_REAL
+lbox_scroll_to
+lbox_set_asldr
+lbox_set_bentries
+lbox_set_bsldr
+lbox_set_items
+lbox_set_slider
+LBOX_SHFT
+LBOX_SNGL
+LBOX_TOGGLE
+lbox_update
+LBOX_VERT
+LC_CLOSEWIN
+LC_OPENWIN
+LC_OUTBUF
+LC_WRCHAR
+LC_WRSTR
+Ledger format
+Legal format
+Letter format
+LFARROW
+LINE
+Line-A
+Line-A, Vector for
+Line-F, Vector for
+LINEA
+Lines attributes
+Line_feed
+Linking, Object
+List boxes
+List of OLGA-aware applications
+List of prospective SSP-implementing software to date
+LIST_BOX
+Literature for the TOS operating system
+LK3DACT
+LK3DIND
+load_disk
+Load_pos
+Load_Process
+locksnd
+Logbase
+Logical screen memory, Start of
+LongWordFromLink
+LongWordToLink
+Lookup table
+ltchars
+LTL messages from the loader to the shell
+LTL messages from the shell to the loader
+LTL protocol
+

+ +

+M
+macAppSwitch
+Maccess
+Machine name
+Machine type
+MacVersion
+Maddalt
+MagiC
+MagiC Flydials present?
+MagiC keyboard tables present?
+MagiC library
+MagiC Mac and Power-Macs
+MagiC Mac specifics
+MagiC Mac type conventions
+MagiC PC interface
+MagiC's DFS-concept
+MagiC's XFS-concept
+MagiC, Accessories in
+MagiC, Boot programs for
+MagiC, Cookie from
+MagiC, MagiC, ARGV procedure in
+MagiC, Make-up of a DFS in
+MagiC, Make-up of an XFS in
+MagiC, Memory management in
+MagiCMac, Cookie from
+MAGX.INF file of MagiC
+MAGXBOOT
+MAGXCONF
+MAGX_COOKIE
+MAGX_COOKIE, status_bits
+MailMerge protocol
+Major Device Number
+Make-up of the font-header
+Make-up of the MAGX.INF file
+Malloc
+Management of mouse form
+Manipulate AES environment
+Manipulate environment of the AES
+Mapping
+MAPTAB
+MAP_ASCII
+MAP_DIRECT
+Marker attributes
+Massign
+MatGraph - TCxx
+Mathematical co-processor
+MATRIX XBIOS extension
+MatScreen - Cxx
+MC680x0 cache purging
+MCB
+MD
+MD structure, Pointer to
+mec0 (MPS) interface
+mec1 interface
+mec2 interface
+mec3 interface
+mecnvdi interface
+Media-change status, Establishment of
+Mediach
+MEDIA_SIZE
+MEDIA_TYPE
+memcntrl
+Memory block destroyed by user program
+Memory Descriptor (MD) in TOS
+Memory drivers
+Memory management
+Memory management in MagiC
+Memory management in TOS
+Memory protection
+Memory protection, Global
+Memory protection, Modes for
+Memory protection, Private
+Memory protection, Read only
+Memory protection, Super
+Memory-Control-Block (MCB) in MagiC
+memplay
+memrec
+memval2
+memval3
+memvalid
+Mem_share
+MENU
+Menu bar, Standard make-up of
+Menu functions, extended
+Menu library
+Menu titles, Demarcation of
+Menu, Advantage of a popup-
+MENUBAR
+Menus and menu bars
+Menus in windows
+Menus, Assigning keyboard shortcuts in
+Menus, context-sensitive
+Menus, Design of
+Menus, scrollable
+Menus, Sub-groups in
+Menus, Three dots in
+menu_attach
+menu_bar
+menu_click
+MENU_GETMODE
+MENU_HIDDEN
+MENU_HIDE
+menu_icheck
+menu_ienable
+MENU_INIT
+MENU_INSTL
+menu_istart
+menu_popup
+MENU_PULLDOWN
+menu_register
+MENU_SETMODE
+menu_settings
+MENU_SHADOWED
+MENU_SHOW
+menu_text
+menu_tnormal
+menu_unregister
+MENU_UPDATE
+Message
+Message group 1
+Message group 2
+Message-list
+Messages
+Messages from the editor to the shell
+Messages from the shell to the editor
+Metaclose
+Metadiscinfo
+MetaDOS
+MetaDOS functions
+Metafile drivers
+Metafile format
+Metafile functions
+Metafile sub-opcodes
+Metafile version
+Metagettoc
+Metainit
+Metaioctl
+Metaopen
+Metaread
+Metaseek
+Metasetsongtime
+Metastartaudio
+Metastatus
+Metastopaudio
+Metawrite
+META_DRVINFO
+META_HEADER
+META_INFO_1
+META_INFO_2
+MFDB
+MFORM
+MFP-TT-Interrupt-Vector
+Mfpint
+Mfree
+MFsave
+MGCOPY
+MGFORMAT
+MgMcCookie
+MGSEARCH
+MIDI interrupts, Vector for
+MidiShare
+Midiws
+MinA
+Minimum range of functions for camera drivers
+Minimum range of functions for metafile drivers
+Minimum range of functions for plotter drivers
+Minimum range of functions for printer drivers
+Minimum range of functions for screen drivers
+Minor Device Number
+minStackSize
+MiNT, Cookie of
+MiNT-compatible functions
+MiNT-domain
+MINWINOBJ
+mix
+MI_MAGIC
+mmc_flg1_bit4
+mmc_flg1_bit5
+MN_SELECTED
+MN_SET
+Modal dialog boxes
+mode24
+modeAtari
+modeMac
+Modula development systems
+MOD_DESC
+monitor
+Monitor Detect, Vector for
+Monospaced fonts
+mon_type
+MOUSE
+Mouse clicks and key-presses
+Mouse clicks and shapes
+Mouse form management, Type of
+Mouse-shape, Meaning of
+Mouse-shape, Rule of thumb for
+Mouse-shapes
+MOUSE_INIT
+MOVER
+MPB
+mps_base.cpp
+mps_base.def
+mps_base.h
+mps_demo.cpp
+mps_demo.h
+MPS_magicinfo
+MP_ACK
+MP_NAK
+MP_SHUTDOWN
+MP_START
+MP_STOP
+MRETS
+msghdr
+MSG_CT60_TEMP
+MSG_NOEVENT
+Mshrink
+mshrink
+MU
+Much, Thomas
+MultiMon
+Multiple clicks
+Multitasking GEM versions
+Multitasking preemptive?
+Multitasking present?
+Multitasking, Timeslices for
+mutimbuf
+MU_BUTTON
+MU_DYNAMIC_KEYBD
+MU_KEYBD
+MU_KEYBD4
+MU_M1
+MU_M2
+MU_MESAG
+MU_MX
+MU_NORM_KEYBD
+MU_TIMER
+MU_WHEEL
+MV
+Mvalidate
+Mvars
+Mxalloc
+mxk_act_appl
+mxk_act_pd
+mxk_appl_begcritic
+mxk_appl_endcritic
+mxk_appl_IOcomplete
+mxk_appl_suspend
+mxk_appl_yield
+mxk_diskchange
+mxk_DMD_rdevinit
+mxk_evnt_IO
+mxk_evnt_mIO
+mxk_evnt_sem
+mxk_fast_clrmem
+mxk_int_malloc
+mxk_int_mfree
+mxk_int_msize
+mxk_keyb_app
+mxk_mfree
+mxk_mxalloc
+mxk_pe_slice
+mxk_pe_timer
+mxk_Pfree
+mxk_proc_info
+mxk_resv_intmem
+mxk_toupper
+mxk_version
+mxk__sprintf
+Mxmask
+MX_DEV
+MX_DEV_INSTALL
+MX_DFS_GETINFO
+MX_DFS_INSTDFS
+MX_DOSLIMITS
+MX_ENABLE3D
+MX_KERNEL
+MX_KER_DOSLIMITS
+MX_KER_DRVSTAT
+MX_KER_GETINFO
+MX_KER_INSTXFS
+MX_KER_XFSNAME
+MX_MENUCOL
+mycopybit
+MYOSD_DISPLAY
+MYOSD_NOK
+MYOSD_OK
+MYTASK_BUBBLE_CHANGE
+MYTASK_BUTTON
+MYTASK_CHANGED_OPTIONS
+MYTASK_DELETE_ICON
+MYTASK_GET_SIZE
+MYTASK_ICON_CLICK
+MYTASK_ICON_ERROR
+MYTASK_NAME
+MYTASK_NEW_COLOR
+MYTASK_NEW_ICON
+MYTASK_NEW_WINDOW
+MYTASK_SEND_OPTIONS
+MYTASK_START
+M_FORCE
+M_LAST
+M_OFF
+M_ON
+M_PREVIOUS
+M_RESTORE
+M_SAVE
+

+ +

+N
+N.AES
+nAES, Cookie of
+NAME
+Name of a process
+NAP BioNet100
+nap_in_s
+nap_io
+nap_out_s
+NDC coordinates
+netinfo
+Network
+Network extension present?
+Network functions
+new_client
+NFOLLOWSLKS
+NKCC
+NM_INHIBIT_HIDE
+Non-volatile memory, Assignment of the
+Nonmodal dialog boxes
+Normalized coordinates
+Normalized Key Code Converter
+Note for the use of the GEMDOS function Super
+Notes about MagiC's 3D-look
+Notes for authors of other font-selectors
+Notes on SE protocol
+Notification
+NO_CLUT
+NSoundcmd
+NULL-cookie
+nvbls
+NVDI
+NVDI, Cookie from
+NVDIMac
+NVDI_STRUC
+Nversion
+NVM, in Milan
+NVMaccess
+N_AES.CNF
+N_AESINFO
+

+ +

+O
+Oberon development systems
+objc_add
+objc_change
+OBJC_CHANGED
+objc_data
+objc_delete
+OBJC_DRAGGED
+objc_draw
+objc_edit
+OBJC_EDITED
+objc_find
+objc_offset
+objc_order
+objc_setscroll
+OBJC_SIZED
+objc_sysvar
+objc_wchange
+objc_wdraw
+objc_wedit
+objc_xedit
+objc_xfind
+OBJECT
+Object colours of the AES
+Object flags of the AES
+Object library
+Object linking
+Object stati of the AES
+Object types of the AES
+OBNCOMM
+OBNL
+OB_PREFER
+OEPSERVER, Environmnetal variable
+OEP_CHANGED
+OEP_CONFIG
+OEP_DATA
+OEP_INFO
+OEP_LINK
+OEP_OK
+OEP_RES
+OEP_RES0
+OEP_RES1
+OEP_RES2
+OEP_RES3
+OEP_RES4
+OEP_RES5
+OEP_RES6
+OEP_RES7
+OEP_RES8
+OEP_RES9
+OEP_SERV
+OEP_SERVJOB
+OEP_TAKEOVER
+OEP_UPDATE
+Off-screen bitmaps
+Offgibit
+OHEADER
+OLEMANAGER, Environmnetal variable
+OLEMANGR
+OLE_EXIT
+OLE_INIT
+OLE_NEW
+OLGA history
+OLGA Info file format
+OLGA initialization
+OLGA protocol
+OLGA-Client
+OLGA-Server
+OLGA.H
+OLGA.INC
+OLGA.INF
+OLGABlockHeader
+OLGAInfHeader
+OLGAMANAGER, Environmnetal variable
+OLGAObjectInfo
+OLGA_ACK
+OLGA_ACTIVATE
+OLGA_BREAKLINK
+OLGA_BREAKLINK, Response to
+OLGA_CLIENTTERMINATED
+OLGA_CLOSEDOC
+OLGA_CLOSEDOC, Response to
+OLGA_EMBED
+OLGA_EMBEDDED
+OLGA_GETINFO
+OLGA_GETOBJECTS
+OLGA_GETSETTINGS
+OLGA_IDLE
+OLGA_INFO
+OLGA_INFO, Response to
+OLGA_INIT
+OLGA_INPLACEUPDATE
+OLGA_LINK
+OLGA_LINK, Response to
+OLGA_LINKBROKEN
+OLGA_LINKRENAMED
+OLGA_NOTIFIED
+OLGA_NOTIFY
+OLGA_OBJECTS
+OLGA_OPENDOC
+OLGA_RELEASENOTIFICATION
+OLGA_RENAME
+OLGA_RENAME, Response to
+OLGA_RENAMELINK
+OLGA_REQUESTNOTIFICATION
+OLGA_SERVERTERMINATED
+OLGA_SETTINGS
+OLGA_START
+OLGA_START, Response to
+OLGA_START, Response2 to
+OLGA_UNEMBED
+OLGA_UNLINK
+OLGA_UNLINK, Response to
+OLGA_UPDATE
+OLGA_UPDATE, Response to
+OLGA_UPDATED
+OLS_EXTENSION
+OLS_NAME
+OLS_TYPE
+OL_CLIENT
+OL_IDLE
+OL_MANAGER
+OL_OEP
+OL_PEER
+OL_PIPES
+OL_SERVER
+OL_START
+Omega-Color-CAD
+Ongibit
+Operating system language
+Operating system, End of
+Operation of file-selectors from MagiC 4 onwards
+Oscanis
+Oscanpatch
+Oscanphy
+Oscanscr
+Oscanswitch
+Oscantab
+Oscanvb
+OSHEADER
+Out of internal memory
+outDevID
+outHandle
+OUTLINED
+OUTLN_CROSS
+OUTPUT format
+Output functions
+outScreen
+OVERPATCH
+OverScan XBIOS extension
+OverScan, Cookie from
+Overview of the wind_get/set subfunctions
+

+ +

+P
+PaCifiST
+PACKEDPIX_PLANES
+Page formats
+Pair kerning
+palmode
+Paper
+Paper formats
+Paper tray of the printer
+Parallel launching of programs
+Parallel operation of floppy
+Parameter block of the VDI
+Parameter passing in BIOS
+Parameter passing in GEMDOS
+Parameter passing in XBIOS
+Parameter-block of the AES
+PARMBLK
+Partition type RAW
+Partition type, BGM
+Partition type, F32
+Partition type, GEM
+Partition type, LNX
+Partition type, MAC
+Partition type, MIX
+Partition type, QWA
+Partition type, SWP
+Partition type, UNX
+Pascal development systems
+Patch, POOLFIX3
+Patch, STEFIX
+Patch, VDIFIX
+pathset
+Pattern runs
+patternrectdata
+Pattrib
+Pause
+PA_EXIT
+PBASEADDR
+PBDEF
+PCI-BIOS
+PCI-BIOS Error codes
+PCI_BAD_HANDLE
+PCI_BAD_REGISTER_NUMBER
+PCI_BAD_VENDOR_ID
+PCI_BIOS_NOT_INSTALLED
+PCI_BIOS_WRONG_VERSION
+PCI_BUFFER_TOO_SMALL
+PCI_DEVICE_NOT_FOUND
+PCI_FUNC_NOT_SUPPORTED
+PCI_GENERAL_ERROR
+PCI_RSC_DESC
+PCI_SET_FAILED
+PCI_SUCCESSFUL
+PCTXTSIZE
+PD
+PDF_AV_CLOSE_FILE
+PDF_AV_FIND_WORD
+PDF_AV_GET_INFO
+PDF_AV_OPEN_FILE
+PDF_AV_PRINT_FILE
+PDF_AV_SHOW_INFO
+PDLG_3D
+pdlg_add_printers
+pdlg_add_sub_dialogs
+PDLG_CANCEL
+pdlg_close
+pdlg_create
+pdlg_delete
+pdlg_dflt_settings
+pdlg_do
+pdlg_evnt
+pdlg_free_settings
+pdlg_get_setsize
+PDLG_HNDL
+PDLG_INIT
+pdlg_new_settings
+PDLG_OK
+pdlg_open
+pdlg_remove_printers
+pdlg_remove_sub_dialogs
+PDLG_RESET
+pdlg_save_default_settings
+PDLG_SUB
+pdlg_update
+pdlg_use_settings
+pdlg_validate_settings
+Pdomain
+PE
+peakshake
+peaksuch
+Pexec
+PFB_FONT
+Pfindpid
+PFONTINFO
+Pfork
+PFSTAT
+Pgetauid
+Pgetegid
+Pgeteuid
+PGETFLAGS
+Pgetgid
+Pgetgroups
+Pgetpd
+Pgetpgrp
+Pgetpid
+Pgetppid
+Pgetpriority
+Pgetuid
+PH
+Physbase
+phystop
+phys_to_virt
+ph_prgflags
+Pipes
+Pipes, Test for
+Pixel value and VDI colour index
+Pixel-oriented image format
+Pkill
+Plane-oriented image format
+playmode
+playstat
+PLOADINFO
+ploadinfo
+Plotter drivers
+Pmaxmem
+pmem_size
+PMMUversion
+PMODE
+Pmsg
+Pname
+Pnice
+POINT16
+POINT32
+POINT_HAND
+Polaroid functions
+Poll Descriptor
+POLLFD
+POOLFIX3 patch
+POPINFO
+Popup
+Popup-menu, Advantage of a
+POPUP_CHANGED
+Portrait format
+Positioning of vector text
+Possible filetypes
+PowerDOS
+Ppriority
+PPROCADDR
+Pprocinf
+Preemptive multitasking?
+Prenice
+Print dialogs
+Print selection as a dialog
+Print selection in a window
+PrintDesc
+Printed page, Number of copies
+Printer drivers
+Printer drivers, Bitmap format
+Printer functions
+Printer, Paper tray of the
+PRIO_MAX
+PRIO_MIN
+PRIO_PGRP
+PRIO_PROCESS
+PRIO_USER
+Privilege Violation Exception vector
+PRN_CHANGED
+PRN_DIALOG
+PRN_ENTRY
+PRN_MODE
+PRN_SETTINGS
+PRN_SWITCH
+PRN_TRAY
+Problems with wind_calc in toolbar windows
+Process Descriptor (PD) resp. BASEPAGE
+Process functions
+Process library
+Process, Freezing of a
+Process, Name of a
+Process, Switching to a
+Process, Thawing of a
+Processor type
+PROC_CREATE
+proc_create
+proc_delete
+proc_info
+proc_malloc
+proc_mfree
+proc_run
+proc_setblock
+proc_shrink
+proc_switch
+Program header
+Program launch and TPA
+Programming guidelines
+Property library
+prop_del
+prop_get
+prop_gui_get
+prop_gui_set
+prop_put
+Protection, Memory
+Protobt
+Protocol, AV
+Protocol, DHST
+Protocol, Document History
+Protocol, Drag&Drop
+Protocol, View
+Protocol, Virtual Screen
+Protocol, XSSI
+Protocols
+Prtblk
+prt_cnt
+PRT_MSG
+Prusage
+prv_aux
+prv_auxo
+prv_lst
+prv_lsto
+Pr_Assign
+Psemaphore
+Psetauid
+Psetegid
+Pseteuid
+PSETFLAGS
+Psetgid
+Psetgroups
+Psetlimit
+Psetpgrp
+Psetpriority
+Psetregid
+Psetreuid
+Psetuid
+Psigaction
+Psigblock
+Psigintr
+Psignal
+Psigpause
+Psigpending
+Psigreturn
+Psigsetmask
+Psysctl
+Pterm
+Pterm0
+Ptermres
+Ptrace
+PTRACEGFLAGS
+PTRACESFLAGS
+ptsin
+ptsout
+PT_ATTACH
+PT_CONTINUE
+PT_DETACH
+PT_KILL
+PT_READ_D
+PT_READ_I
+PT_SYSCALL
+PT_TRACE_ME
+PT_WRITE_D
+PT_WRITE_I
+Pumask
+Puntaes
+PUN_INFO
+pun_ptr
+Pure-C and 'cdecl'
+Purging of the CPU cache
+Purpose of XAcc
+Puserid
+Pusrval
+Put pixel
+Pvector
+Pvfork
+Pwait
+Pwait3
+Pwaitpid
+pxyarray
+P_getpid
+P_getppid
+P_nice
+

+ +

+Q
+Queue_Info
+QUIT_MSG
+Quoting in AV protocol
+Q_message
+

+ +

+R
+ramtop
+ramvalid
+Random
+Raster coordinates
+Raster formats
+Raster functions
+RBUTTON
+RC coordinates
+RCS development systems
+ReadMode
+readsmp
+read_config_byte
+read_config_longword
+read_config_word
+read_dclk
+read_dconv
+read_dpath1
+read_dpath2
+read_dpdat
+read_dport
+read_io_byte
+read_io_longword
+read_io_word
+read_mem_byte
+read_mem_longword
+read_mem_word
+Read_Queue
+read_raes
+read_rdsp
+read_rhi
+read_rint
+read_rlow
+Realtime selection
+recmode
+Recommended partition types
+recplay
+recstat
+RECT16
+RECT32
+recwait
+Redraw and updating of toolbars
+Registers
+Relocation table
+Remote-Mailmerge protocol
+Replace mode
+REQUEST
+Request/Reply protocol
+RESCH_COMPLETED
+Reset: PC vector
+Reset: SSP vector
+ResetScreen
+Resolution change
+Resource files, size of
+Resource format, New
+Resource header
+Resource library
+Restrictions of MagiC Mac
+resvalid
+resvector
+Return
+Return, VT-52
+Reverse transparent mode
+Rev_off
+Rev_on
+RG
+RGB_LIST
+Ring-Indicator, Vector
+Rotation
+rregen
+RS-232 Receive Buffer Full interrupt
+RS-232 Receive Error vector
+RS-232 Transmit Buffer Error vector
+RS-232 Transmit Error vector
+Rsconf
+RSC_IO
+RSC_LAST
+RSC_ROM
+RSDAEMON_MSG
+RSHDR
+rsh_fix
+rsh_obfix
+rsrc_free
+rsrc_gaddr
+rsrc_load
+rsrc_obfix
+rsrc_rcfix
+rsrc_saddr
+RSXHDR
+RTARROW
+Rwabs
+R_BIPDATA
+R_BITBLK
+R_FRIMG
+R_FRSTR
+R_IBPDATA
+R_IBPMASK
+R_IBPTEXT
+R_ICONBLK
+R_IMAGEDATA
+R_OBJECT
+R_OBSPEC
+R_STRING
+R_TEDINFO
+R_TEPTEXT
+R_TEPTMPLT
+R_TEPVALID
+R_TREE
+

+ +

+S
+Salert
+SAMPLE
+Sample analysis of a metafile
+Sample binding for AES functions
+Sample code
+Sample code for signals
+save_disk
+Save_pos
+savptr
+sav_context
+sav_row
+Scanner driver group
+SCANX
+SCC-TT-Interrupt-Vector
+sclock
+scmsmode
+Sconfig
+Scookie
+Scrap library
+SCRAP_CSV
+SCRAP_DCA
+SCRAP_GEM
+SCRAP_IMG
+SCRAP_NOTOK
+SCRAP_OK
+SCRAP_OPEN
+SCRAP_TXT
+SCRAP_UPDT
+SCRAP_USR
+SCRCLIPMEMBLK
+SCRCOPYMEMBLK
+Scrdmp
+SCREEN
+Screen drivers
+Screen functions
+SCREEN, OverScan
+Screen, virtual
+Screen-manager, ID of the
+Screen-manager, Name of the
+SCREENINFO
+screenpt
+SCRFILLMEMBLK
+SCRINFO_OK
+SCRLINEMEMBLK
+SCRMEMBLK
+Scrollable input fields
+SCROLLER
+Scroll_up
+scrp_clear
+scrp_read
+scrp_write
+SCRTEXTUREMEMBLK
+scr_dump
+SC_CHANGED
+SE protocol
+Seedfill
+seekrate
+SELECTABLE
+SELECTED
+Selection by mouse
+Selection by rubber band
+Selection by [Shift]-mouse
+Selection, Realtime
+Selections
+Self-modifying code
+Semaphore
+Semaphore, _DMA
+Semaphore, _NCR
+Semaphore, _SCR
+Semaphores in MagiC
+SEMENUINFO
+SEM_CREATE
+SEM_CSET
+SEM_DEL
+SEM_FREE
+SEM_GET
+SEM_SET
+SEM_TEST
+Send
+SEND_TRACE
+Server debug mode
+Server minimum requirement
+Server registration
+ServerData
+Service
+Services
+Set ouput format, VDI
+Set VDI output format
+SetAnalyse
+setbuffer
+Setcolor
+Setexc
+setinterrupt
+SetLinkAdr
+setmode
+SetMon
+setmontracks
+SetPageMode
+Setpalette
+Setprt
+SetReset
+Setscreen
+Setscreen, ct60
+Setscreen, Milan
+Settime
+SETTINGS
+settracks
+Set_blink
+set_card_used
+Set_Evnt_Mask
+set_interrupt
+SET_ITEM
+SE_ACK
+SE_CLOSE
+SE_ERRFILE
+SE_ERROR
+SE_INIT
+SE_MENU
+SE_OK
+SE_OPEN
+SE_PROJECT
+SE_QUIT
+SE_TERMINATE
+sgttyb
+SHADOWED
+Shared libraries
+Shared memory
+Shared text
+Shell library
+SHELTAIL
+SHELW
+shel_envrn
+shel_find
+shel_get
+shel_help
+shel_put
+shel_rdef
+shel_read
+shel_wdef
+shel_write
+shel_write and Single-TOS
+SHMGETBLK
+SHMSETBLK
+Short-term memory, Capacity of
+Shortcuts, List of
+Shortcuts, Non-standardized
+Shortcuts, Reserved
+Shortcuts, Standardized
+SHOW
+Show mouse
+SHOW8P3
+SHP_HELP
+Shutdown
+SHUTDOWN
+Shutdown as seen by the application
+Shutdown as seen by the initiator
+Shutdown in MagiC
+Shutdown in MagiC Mac
+Shutdown in MultiTOS
+Shutdown mode
+Shutdown, Complete
+Shutdown, Partial
+Shutdown, Terminate
+SHUTDOWN.INF
+SHUT_BOOT
+SHUT_COLD
+SHUT_COMPLETED
+SHUT_HALT
+SHUT_POWER
+SH_CHANGED
+SH_WDRAW
+SIGABRT
+sigaction
+SIGALRM
+SIGBUS
+SIGCHLD
+SIGCONT
+SIGFPE
+SIGHUP
+SIGILL
+SIGINT
+SIGIO
+SIGKILL
+Signal-handler in MagiC
+Signals
+Signals, List of
+SIGNULL
+SIGPIPE
+SIGPRIV
+SIGPROF
+SIGPWR
+SIGQUIT
+SIGSEGV
+SIGSTOP
+SIGSYS
+SIGTERM
+SIGTRAP
+SIGTSTP
+SIGTTIN
+SIGTTOU
+SIGURG
+SIGUSR1
+SIGUSR2
+SIGVTALRM
+SIGWINCH
+SIGXCPU
+SIGXFSZ
+Sig_intercept
+Single-click
+Single-mode
+Single-tasking GEM versions
+Size
+Size field of the TPA
+Size of vector fonts
+SizeComp
+SIZER
+Slbclose
+Slbopen
+SLCT_ITEM
+Sleep
+SliceFromLink
+SliceToLink
+SLIDER_CHANGED
+Sl_arrow
+Sl_dragx
+Sl_dragy
+Sl_size
+Sl_x
+Sl_y
+Smalloc
+Smart redraw
+Smart redraw in MagiC
+SM_M_SPECIAL
+SNDLOCKED
+SNDNOTLOCK
+sndstatus
+sockaddr
+SOFT_CLUT
+Solid runs
+solidrectdata
+SORTBYDATE
+SORTBYNAME
+SORTBYNONE
+SORTBYSIZE
+SORTBYTYPE
+SORTDEFAULT
+Sound functions
+Sound hardware
+Sound options
+Sound routines
+soundcmd
+Source text, AES in
+SPA
+Special commands
+Special effects
+Special error-messages in MagiC
+Special functions
+Special graphic functions
+special_cycle
+SpeedoGDOS
+SPEEDO_FONT
+Spurious Interrupt, Vector for
+SRA
+Srealloc
+SRTY_DEVSTAT
+SRTY_GETDEVS
+SRTY_SETUP
+SS
+Ssbrk
+sshiftmd
+SSP changes
+SSP message pipeline
+SSP messages
+SSP Server registration
+SSP-Server
+SSP_COMPRESSFILE
+SSP_CONTEXT
+SSP_DISPLAYINFO
+SSP_DISPLAYMESSAGE
+ssp_init
+SSP_SENDFILE
+SSP_SENDMESSAGE
+SSP_SPASA
+SSP_SPASI
+SSP_SRASR
+SSP_SSA
+SSP_SSIR
+SSP_SSUR
+SSP_STATUSDISPLAY
+SSP_UPLOADFILE
+Ssync
+Ssystem
+Stackframes of CPU
+stackLoad
+stackUnload
+Standard format of the VDI
+STANDARD_BITS
+STANDARD_PLANES
+StarTrack
+Startup-code for accessories
+STAT
+STAT, access rights
+STAT, dev-components
+STAT, possible filetypes
+STAT, size-components
+STAT, Sticky-bit
+Steem
+STEFcntrl
+STEFIX patch
+STEmulator
+Stop_All
+Stop_Process
+STRT_MSG
+struct sigaction
+struct tty
+Style guidelines
+SUBMENU
+Super
+SuperCharger
+Superior attributes
+Supexec
+Support for alternative file-systems
+Suptime
+Suspend
+Sversion
+SWINFO
+Switch background DMA on/off
+Switch grow-boxes on/off
+Switch off Dropdown menus
+Switch on Pulldown menus
+Switch shrink-boxes on/off
+Switch Smart redraw on/off
+Switching to an application
+swv_vec
+Syield
+Symbol table
+Symbolic links and the XFS-concept
+Sync
+Sysconf
+SYSHDR
+sysreset
+System functions
+System Services Protocol (SSP)
+System stack overflow
+System variable, bell_hook
+System variable, colorptr
+System variable, conterm
+System variable, con_state
+System variable, criticret
+System variable, defshiftmd
+System variable, end_os
+System variable, etv_critic
+System variable, etv_term
+System variable, etv_timer
+System variable, etv_xtra
+System variable, exec_os
+System variable, flock
+System variable, hdv_boot
+System variable, hdv_bpb
+System variable, hdv_init
+System variable, hdv_mediach
+System variable, hdv_rw
+System variable, kcl_hook
+System variable, memcntrl
+System variable, memval2
+System variable, memval3
+System variable, memvalid
+System variable, nvbls
+System variable, palmode
+System variable, phystop
+System variable, prt_cnt
+System variable, prv_aux
+System variable, prv_auxo
+System variable, prv_lst
+System variable, prv_lsto
+System variable, pun_ptr
+System variable, ramtop
+System variable, ramvalid
+System variable, resvalid
+System variable, resvector
+System variable, sav_context
+System variable, sav_ptr
+System variable, sav_row
+System variable, screenpt
+System variable, scr_dump
+System variable, seekrate
+System variable, sshiftmd
+System variable, swv_vec
+System variable, themd
+System variable, the_env
+System variable, trp14ret
+System variable, vblsem
+System variable, xconin
+System variable, xconout
+System variable, xconstat
+System variable, xcostat
+System variable, _autopath
+System variable, _bootdev
+System variable, _bufl
+System variable, _cmdload
+System variable, _drvbits
+System variable, _dskbufp
+System variable, _frclock
+System variable, _fverify
+System variable, _hz_200
+System variable, _longframe
+System variable, _md
+System variable, _membot
+System variable, _memtop
+System variable, _nflops
+System variable, _prtabt
+System variable, _p_cookies
+System variable, _shell_p
+System variable, _sysbase
+System variable, _timr_ms
+System variable, _vbclock
+System variable, _vblqueue
+System variable, _vbl_list
+System variable, _v_bas_ad
+System variables, sorted numerically
+sys_recalc_cicon_colours
+sys_set_appl_getinfo
+sys_set_editob
+sys_set_getdisp
+sys_set_getfn
+sys_set_setfn
+sys_set_winframe_manager
+S_BLOCKCACHE
+S_CDEFINES
+S_CLOCKUTC
+S_CNAME
+S_COPTIM
+S_CTRLALTDEL
+S_CTRLCACHE
+S_CVERSION
+S_DEBUGDEVICE
+S_DEBUGKMTRACE
+S_DEBUGLEVEL
+S_DELCOOKIE
+S_FASTLOAD
+S_FLUSHCACHE
+S_GETBOOTLOG
+S_GETBVAL
+S_GETCOOKIE
+S_GETLVAL
+S_GETWVAL
+s_hutdown
+S_INITIALTPA
+S_INQUIRE
+S_KNAME
+S_LOADKBD
+S_OSBUILDDATE
+S_OSBUILDTIME
+S_OSCOMPILE
+S_OSFEATURES
+S_OSHEADER
+S_OSNAME
+S_OSVERSION
+S_OSXNAME
+S_RUNLEVEL
+S_SECLEVEL
+S_SETBVAL
+S_SETCOOKIE
+S_SETEXC
+S_SETLVAL
+S_SETWVAL
+S_SYNCTIME
+S_TIOCMGET
+S_TSLICE
+

+ +

+T
+Tab
+Tablet drivers
+Tadjtime
+Talarm
+TapeBIOS
+TC-VDI functions
+tchars
+TCURSBLINK
+TCURSGRATE
+TCURSOFF
+TCURSON
+TCURSSRATE
+TCURSSTEADY
+TDI_Answer
+TDI_Question
+TEDINFO
+TekBios
+Terminate and Stay Resident
+Test for MagiC
+TestError
+Testing, User-
+testmps.s
+Text alignment
+Text attributes
+Text attributes, Use of
+Text block transfer
+Text effects
+Text functions
+Text rotation
+TEXT_CRSR
+Tgetdate
+Tgettime
+Tgettimeofday
+Thanks
+Thawing on an application
+THA_CENTER
+THA_LEFT
+THA_RIGHT
+The AUTOEXEC.BAT file in MagiC
+The background-DMA of MagiC
+The bit-block structure
+The CAB protocol
+The components of a window
+The control-flags
+The desktop window
+The device driver (MX_DDEV)
+The device driver (MX_DEV)
+The directory descriptor (DD)
+The directory entry (DIR)
+The directory handle descriptor (DHD)
+The directory U:\DEV
+The directory U:\PIPE
+The directory U:\PROC
+The directory U:\SHM
+The Disk Transfer Area (DTA) for DFSs
+The Disk Transfer Area (DTA) for XFSs
+The Drive Medium Descriptor (DMD)
+The drive U: in MagiC
+The extended xFSL call
+The File Descriptor (FD)
+The font-flags
+The GNU General Public Licence
+The info call (xfsl_info)
+The input/output channels of the BIOS
+The Line-A emulator
+The MagiC Mac cookie
+The make-up of a DFS
+The make-up of an XFS
+The make-up of the ASSIGN.SYS file
+The N.AES configuration file
+The N.AES cookie
+The negative Line-A variables
+The object structure
+The OBNCOMM structure
+The OBNL cookie
+The Operating System TOS
+The OUT file format
+The PFONTINFO structure
+The PMMU functions-handler
+The program flags
+The program format
+The Pure-C event structure
+The purpose(s) of the View protocol
+The quarter-screen buffer
+The rectangle-list of a window
+The scancode
+The screen-manager
+The shutdown process in MagiC Mac
+The simplified call (xfsl_input)
+The system variables
+The system vectors
+The task-manager of MagiC
+The UFSL interface
+The user-popup
+The various GEM versions
+The VDI workstation in the xFSL interface
+The View protocol messages
+The VIEW_XXX messages
+The xFSL cookie
+The xFSL_PAR structure
+The XIMG format for pixel images
+themd
+the_env
+THICK_CROSS
+THING_CMD
+THIN_CROSS
+THREADINFO
+Threads and AES calls
+Threads and signals
+Threads and VDI calls
+Threads in MagiC
+Threads, Creation of
+Threads, Ending of
+Threads, Example for
+Three important programming rules
+THR_EXIT
+Tickcal
+Timeout of the floppy
+Timeouts and error handling
+Timeslices for Multitasking
+timeval
+timezone
+TIOCCBRK
+TIOCFLUSH
+TIOCGETC
+TIOCGETP
+TIOCGFLAGS
+TIOCGLTC
+TIOCGPGRP
+TIOCGWINSZ
+TIOCGXKEY
+TIOCIBAUD
+TIOCOBAUD
+TIOCOUTQ
+TIOCSBRK
+TIOCSETC
+TIOCSETN
+TIOCSETP
+TIOCSFLAGS
+TIOCSLTC
+TIOCSPGRP
+TIOCSTART
+TIOCSTOP
+TIOCSWINSZ
+TIOCSXKEY
+Tmalarm
+Toolbar support
+Toolbar support under XaAES
+Toolbar, Exchange of a
+Toolbar, Removal of a
+Toolbar, Tacking on a
+Toolbars and the window-manager
+Toolbars, Redraw and update of
+Toolboxes
+TOPW_OPENED
+TOS
+TOS list
+TOS, Memory management in
+TOS, Version number of
+TOS-compatibility
+TOS-domain
+TOS2WIN
+Tosbox
+TOUCHEXIT
+TPA and Program launch
+TPA size field
+Trace, Vector for
+Track kerning
+Transform mouse
+Transient Program Area
+Transparent mode
+TRAP#0, Vector for
+TRAP#1, Vector for
+TRAP#10, Vector for
+TRAP#13, Vector for
+TRAP#14, Vector for
+TRAP#15, Vector for
+TRAP#2, Vector for
+TRAP#3, Vector for
+TRAP#5, Vector for
+TRAP#6, Vektor for
+TRAP#8, Vector for
+TRAP#9, Vector for
+Trapper
+TRAPV Instruction Exception vector
+trp14ret
+Tsetdate
+Tsetitimer
+Tsettime
+Tsettimeofday
+TSLICE
+TSR programs
+TT_FONT
+TV standard, NTSC
+TV standard, PAL
+TVA_BOTTOM
+TVA_CENTER
+TVA_TOP
+TWERR
+TWOK
+TWREAD
+TWSHELL
+TWSTART
+TWTOP
+TWWRITE
+Type definitions
+

+ +

+U
+UFSL
+UFSL/xFSL program overview
+UNDERLINE
+Undraw sprite
+UNHIGHLIGHTED
+unhook_interrupt
+union
+unlocksnd
+UPARROW
+USECOLOURCAT
+User selection
+User-testing
+USERBLK
+USERDEF
+USER_DEF
+Using G_EDIT objects
+Using the View protocol
+UTXT_FN
+

+ +

+V
+VA functions
+VA protocol
+ValidMode
+Vattrib
+VA_ACC_QUOTING(a)
+VA_CONFONT
+VA_CONSOLEOPEN
+VA_COPY_COMPLETE
+VA_DRAGACCWIND
+VA_DRAG_COMPLETE
+VA_FILECHANGED
+VA_FILECOPIED
+VA_FILEDELETED
+VA_FILEFONT
+VA_FONTCHANGED
+VA_OBJECT
+VA_OB_CLIPBOARD
+VA_OB_DRIVE
+VA_OB_FILE
+VA_OB_FOLDER
+VA_OB_SHREDDER
+VA_OB_TRASHCAN
+VA_OB_UNKNOWN
+VA_OB_WINDOW
+VA_PATH_UPDATE
+VA_PROGSTART
+VA_PROTOSTATUS
+VA_SERVER_QUOTING(a)
+VA_SETSTATUS
+VA_START
+VA_THAT_IZIT
+VA_VIEWED
+VA_WINDOPEN
+VA_XOPEN
+vblsem
+VcheckMode
+Vclose
+Vcreate
+Vdelete
+VDI
+vdi
+VDI bindings
+VDI colour index and pixel value
+VDI coordinate systems
+VDI device number
+VDI drivers
+VDI functions list
+VDI fundamentals
+VDI parameter block
+VDI structures
+VDI workstations
+VDI, Fundamentals of the
+VDI, Origin of the
+VDI, Standard format of the
+VDI-string to C-string
+VDI-TRAP
+VDIFIX, Patch-program
+VDIPB
+VDO_MODE
+VDO_PARAM
+vdxConfigPlayback
+vdxDestroy
+vdxGetCapability
+vdxGetGrKeys
+vdxGetVersion
+vdxInit
+vdxPlaybackCopyFrame
+vdxPlaybackFrameSelect
+vdxPlaybackGetDeint
+vdxPlaybackGetEq
+vdxPlaybackOff
+vdxPlaybackOn
+vdxPlaybackSetDeint
+vdxPlaybackSetEq
+vdxProbe
+vdxQueryDMAStatus
+vdxQueryFourcc
+vdxSetGrKeys
+Vector or bitmap font?
+Vector, 200Hz clock
+Vector, ACSI
+Vector, Address error
+Vector, Auto (Level-1)
+Vector, Auto (Level-2)
+Vector, Auto (Level-3)
+Vector, Auto (Level-4)
+Vector, Auto (Level-5)
+Vector, Auto (Level-6)
+Vector, Auto (Level-7)
+Vector, Baud-rate generator
+Vector, Bus error
+Vector, BUSY interrupt
+Vector, CHK instruction
+Vector, CTS interrupt
+Vector, DCD interrupt
+Vector, Display Enable Signal
+Vector, Division by zero
+Vector, FDC
+Vector, GPU-Done
+Vector, IKBD
+Vector, Illegal instruction
+Vector, Line-A
+Vector, Line-F
+Vector, MIDI
+Vector, Monochrome monitor detect
+Vector, PC
+Vector, Privilege violation
+Vector, Ring Indicator
+Vector, RS-232 Receive Buffer Full
+Vector, RS-232 Receive Error
+Vector, RS-232 Transmit Buffer Error
+Vector, RS-232 Transmit Error
+Vector, Spurious interrupt
+Vector, SSP-
+Vector, Trace
+Vector, TRAP#0
+Vector, TRAP#1
+Vector, TRAP#10
+Vector, TRAP#13
+Vector, TRAP#14
+Vector, TRAP#15
+Vector, TRAP#2
+Vector, TRAP#3
+Vector, TRAP#4
+Vector, TRAP#5
+Vector, TRAP#6
+Vector, TRAP#8
+Vector, TRAP#9
+Vector, TRAPV-
+Vectoren, TT-MFP-Interrupt
+Vectoren, TT-SCC-Interrupt
+Verify, Perform?
+Verify, Switch off
+Verify, Switch on
+Version 4.80 - 0.40
+Version 4.90
+Version 4.91
+Version 4.92
+Version 4.93
+Version 4.94
+Version 4.95
+Version 4.96
+Version 4.97
+Version 4.98
+Version 4.99
+Version 5.00
+Version 5.01
+Version number of the AES
+Version number of the GEMDOS
+versionOfMacAppl
+Vertical Blank Routines
+Vertical blanks, Number of
+vex_butv
+vex_curv
+vex_motv
+vex_timv
+vex_wheelv
+VFAT, Configuration for
+VFAT-XFS in MagiC
+VFATCONF
+VFAT_CNFDFLN
+VFAT_CNFLN
+Vfirst
+VG
+VgetRGB
+VgetSize
+Video hardware
+Video hardware, non-compatible
+VIDIX XBIOS extension
+vidix_capability_t
+vidix_deinterlace_t
+vidix_dma_t
+vidix_fourcc_t
+vidix_grkey_t
+vidix_playback_t
+vidix_video_eq_t
+View a file
+View data from memory
+View protocol
+View protocol, The messages
+VIEWERR_COLOR
+VIEWERR_ERROR
+VIEWERR_MEM
+VIEWERR_SIZE
+VIEWERR_WID
+ViewMax
+ViewMAX
+VIEW_CLOSED
+VIEW_DATA
+VIEW_FAILED
+VIEW_FILE
+VIEW_GETMFDB
+VIEW_MFDB
+VIEW_OPEN
+VIEW_SETMFDB
+Virtual screen
+Virtual Screen protocol
+Virtual workstations
+virt_to_bus
+virt_to_phys
+Visual and acoustic feedback
+Visual feedback
+Vload
+Vlock
+vmem_size
+vmid_load
+vmid_play
+vmid_unload
+vm_align
+vm_color
+vm_coords
+vm_end_bezier
+vm_end_bgif
+vm_end_fill
+vm_end_grey
+vm_end_group
+vm_end_join
+vm_end_shadow
+vm_filename
+vm_grid
+VM_INQUIRE
+vm_no_outline
+vm_pagesize
+vm_start_bezier
+vm_start_bgif
+vm_start_fill
+vm_start_grey
+vm_start_group
+vm_start_join
+vm_start_shadow
+VM_VER_APP
+vm_ver_app
+vm_wind
+Vnext
+Voffset
+volad
+volda
+Vopen
+VPOS
+vqf_attributes
+vqf_bg_color
+vqf_fg_color
+vqin_mode
+vql_attributes
+vql_bg_color
+vql_fg_color
+vqm_attributes
+vqm_bg_color
+vqm_fg_color
+vqp_error
+vqp_filmname
+vqp_films
+vqp_state
+vqr_bg_color
+vqr_fg_color
+vqspl_position_d2d
+vqspl_position_dma
+vqspl_status_d2d
+vqspl_status_dma
+vqspl_time_left_d2d
+vqt_advance
+vqt_advance32
+vqt_attributes
+vqt_bg_color
+vqt_cachesize
+vqt_char_index
+vqt_devinfo
+vqt_extent
+vqt_ext_name
+vqt_fg_color
+vqt_fontheader
+vqt_fontinfo
+vqt_f_extent
+vqt_get_table
+vqt_justified
+vqt_name
+vqt_name_and_id
+vqt_pairkern
+vqt_real_extent
+vqt_trackkern
+vqt_width
+vqt_xfntinfo
+vq_bit_image
+vq_calibrate
+vq_cellarray
+vq_chcells
+vq_color
+vq_colors
+vq_ctab
+vq_ctab_entry
+vq_ctab_id
+vq_curaddress
+vq_devinfo
+vq_dflt_ctab
+vq_driver_info
+vq_driver_name
+vq_extnd
+vq_ext_devinfo
+vq_gdos
+vq_hilite_color
+vq_image_type
+vq_key_s
+vq_margins
+vq_max_color
+vq_min_color
+vq_mouse
+vq_page_name
+vq_pixcol
+vq_pixrgb
+vq_prn_scaling
+vq_ptsinsz
+vq_px_format
+vq_scan
+vq_scrninfo
+vq_tabstatus
+vq_tdimensions
+vq_tray_names
+vq_vgdos
+vq_weight_color
+Vread
+vrf_rgb
+vrl_rgb
+vro_cpyfm
+vrq_choice
+vrq_locator
+vrq_string
+vrq_valuator
+vrt_cpyfm
+vrt_rgb
+vrun_parallel
+vrun_rect
+vrun_triangle
+vr_clip_rects32_by_dst
+vr_clip_rects32_by_src
+vr_clip_rects_by_dst
+vr_clip_rects_by_src
+vr_recfl
+vr_transfer_bits
+vr_trnfm
+Vsave
+VSCR
+Vscroll
+vsc_expose
+vsc_form
+Vseek
+VsetMask
+VsetMode
+VsetRGB
+VsetScreen
+VsetSync
+vsf_bg_color
+vsf_color
+vsf_fg_color
+vsf_interior
+vsf_perimeter
+vsf_rgb
+vsf_style
+vsf_udpat
+vsf_xperimeter
+vsin_mode
+Vsize
+VSLIDE
+vsl_bg_color
+vsl_color
+vsl_ends
+vsl_fg_color
+vsl_rgb
+vsl_type
+vsl_udsty
+vsl_width
+vsm_bg_color
+vsm_choice
+vsm_color
+vsm_fg_color
+vsm_height
+vsm_locator
+vsm_string
+vsm_type
+vsm_valuator
+vspl_load_d2d
+vspl_load_sample
+vspl_make_d2d
+vspl_pause_d2d
+vspl_pause_dma
+vspl_play
+vspl_play_d2d
+vspl_play_dma
+vspl_stop_d2d
+vspl_stop_dma
+vspl_unload_d2d
+vspl_unload_sample
+vsp_film
+vsp_message
+vsp_save
+vsp_state
+vsr_bg_color
+vsr_fg_color
+vsspl_monitor_off
+vsspl_monitor_on
+vst_alignment
+vst_arbpt
+vst_arbpt32
+vst_bg_color
+vst_charmap
+vst_color
+vst_effects
+vst_error
+vst_ex_load_fonts
+vst_fg_color
+vst_font
+vst_height
+vst_kern
+vst_load_fonts
+vst_map_mode
+vst_name
+vst_point
+vst_rgb
+vst_rotation
+vst_scratch
+vst_setsize
+vst_setsize32
+vst_skew
+vst_track_offset
+vst_unload_fonts
+vst_width
+vswr_mode
+Vsync
+vs_bkcolor
+vs_calibrate
+vs_clip
+vs_color
+vs_color2
+vs_colors
+vs_crop
+vs_ctab
+vs_ctab_entry
+vs_curaddress
+vs_dflt_ctab
+vs_document_info
+vs_grayoverride
+vs_hilite_color
+vs_load_disp_list
+vs_max_color
+vs_min_color
+vs_mute
+vs_page_info
+vs_palette
+vs_pixcol
+vs_pixrgb
+vs_save_disp_list
+vs_weight_color
+VT-52 terminal
+vt_alignment
+vt_axis
+vt_origin
+vt_resolution
+Vvalid
+Vwrite
+v_alpha_text
+v_arc
+v_bar
+v_bez
+v_bez_fill
+v_bez_off
+v_bez_on
+v_bez_qual
+v_bit_image
+v_cellarray
+V_CHAR_ALL
+V_CHAR_ASC
+V_CHAR_IND
+V_CHAR_PRT
+v_circle
+v_clear_disp_list
+v_clrwk
+v_clsbm
+v_clsvwk
+v_clswk
+v_color2nearest
+v_color2value
+v_contourfill
+v_copies
+v_create_ctab
+v_create_driver_info
+v_create_itab
+v_ctab_idx2value
+v_ctab_idx2vdi
+v_ctab_vdi2idx
+v_curaddress
+v_curdown
+v_curhome
+v_curleft
+v_curright
+v_curtext
+v_curup
+v_delete_ctab
+v_delete_driver_info
+v_delete_itab
+v_dspcur
+v_eeol
+v_eeos
+v_ellarc
+v_ellipse
+v_ellpie
+v_enter_cur
+v_escape2000
+v_etext
+v_exit_cur
+v_fillarea
+v_flushcache
+v_fontinit
+v_form_adv
+v_ftext
+v_ftext_offset
+v_getbitmap_info
+v_getoutline
+v_get_ctab_id
+v_get_driver_info
+v_get_outline
+v_get_pixel
+v_gtext
+v_hardcopy
+v_hide_c
+v_justified
+v_killoutline
+v_loadcache
+v_load_cache
+v_meta_extents
+v_offset
+v_open_bm
+v_opnbm
+v_opnprn
+v_opnvwk
+v_opnwk
+v_opnwk, Special features
+v_orient
+v_output_window
+v_page_size
+v_pat_rotate
+v_pieslice
+v_pline
+v_pmarker
+v_ps_halftone
+v_rbox
+v_read_default_settings
+v_resize_bm
+v_rfbox
+v_rmcur
+v_rvoff
+v_rvon
+v_savecache
+v_save_cache
+v_setrgb
+v_setrgbi
+v_set_app_buff
+v_show_c
+v_sound
+v_topbot
+v_tray
+v_trays
+v_updwk
+v_updwk, Special features
+v_value2color
+v_write_default_settings
+v_write_meta
+v_xbit_image
+

+ +

+W
+Wait
+Wait_dt
+Wake_parent
+WavePlay
+WA_DNLINE
+WA_DNPAGE
+WA_LFLINE
+WA_LFPAGE
+WA_RTLINE
+WA_RTPAGE
+WA_UPLINE
+WA_UPPAGE
+WA_WHEEL
+WBDAEMON
+WC_BORDER
+WC_WIN
+WC_WORK
+WdgCtrl
+WDIALOG
+wdlg_close
+wdlg_create
+wdlg_delete
+wdlg_evnt
+wdlg_get_edit
+wdlg_get_handle
+wdlg_get_tree
+wdlg_get_udata
+wdlg_open
+wdlg_redraw
+wdlg_set_edit
+wdlg_set_iconify
+wdlg_set_size
+wdlg_set_tree
+wdlg_set_uniconify
+WF_APPICON, wind_set
+WF_ATTRB
+WF_ATTRB, wind_set
+WF_BACKDROP, wind_set
+WF_BEVENT
+WF_BEVENT, wind_get
+WF_BEVENT, wind_set
+WF_BITMAP
+WF_BITMAP, wind_get
+WF_BOTTOM
+WF_BOTTOM, wind_get
+WF_BOTTOM, wind_set
+WF_BOTTOMALL
+WF_BOTTOMALL, wind_set
+WF_CALCF2U
+WF_CALCF2W
+WF_CALCF2W, wind_xget
+WF_CALCU2F
+WF_CALCW2F
+WF_CALCW2F, wind_xget
+WF_COLOR
+WF_COLOR, wind_set
+WF_CURRXYWH
+WF_CURRXYWH, wind_get
+WF_CURRXYWH, wind_set
+WF_CURRXYWH, wind_xset
+WF_DCOLOR
+WF_DCOLOR, wind_get
+WF_DCOLOR, wind_set
+WF_DDELAY
+WF_DDELAY, wind_get
+WF_DDELAY, wind_set
+WF_FIRSTAREAXYWH
+WF_FIRSTAREAXYWH, wind_xget
+WF_FIRSTXYWH, wind_get
+WF_FTOOLBAR
+WF_FTOOLBAR, wind_get
+WF_FULLSCREEN
+WF_FULLSCREEN, wind_set
+WF_FULLXYWH
+WF_FULLXYWH, wind_get
+WF_FULLXYWH, wind_set
+WF_FULLXYWH, wind_xset
+WF_HSLIDE
+WF_HSLIDE, wind_get
+WF_HSLIDE, wind_set
+WF_HSLSIZE
+WF_HSLSIZE, wind_get
+WF_HSLSIZE, wind_set
+WF_ICONIFY
+WF_ICONIFY, wind_get
+WF_ICONIFY, wind_set
+WF_IGNORE, wind_set
+WF_INFO
+WF_INFO, wind_get
+WF_INFO, wind_set
+WF_INFOXYWH
+WF_INFOXYWH, wind_get
+WF_KIND
+WF_KIND, wind_get
+WF_KIND, wind_set
+WF_MAXWORKXYWH
+WF_MENU
+WF_MENU, wind_get
+WF_MENU, wind_set
+WF_MINXYWH
+WF_MINXYWH, wind_get
+WF_M_BACKDROP
+WF_M_BACKDROP, wind_set
+WF_M_OWNER
+WF_M_OWNER, wind_get
+WF_M_WINDLIST
+WF_M_WINDLIST, wind_get
+WF_NAME
+WF_NAME, wind_get
+WF_NAME, wind_set
+WF_NEWDESK
+WF_NEWDESK, wind_get
+WF_NEWDESK, wind_set
+WF_NEXTXYWH, wind_get
+WF_NTOOLBAR
+WF_NTOOLBAR, wind_get
+WF_OBFLAG
+WF_OBSPEC
+WF_OBTYPE
+WF_OPTIONS
+WF_OPTIONS, wind_set
+WF_OPTS
+WF_OPTS, wind_get
+WF_OPTS, wind_set
+WF_OWNER
+WF_OWNER, wind_get
+WF_PREVXYWH
+WF_PREVXYWH, wind_get
+WF_PREVXYWH, wind_set
+WF_PREVXYWH, wind_xset
+WF_RESVD, wind_set
+WF_SCREEN
+WF_SCREEN, wind_get
+WF_SHADE
+WF_SHADE, wind_get
+WF_SHADE, wind_set
+WF_SIZETOP
+WF_SIZETOP, wind_set
+WF_STACK
+WF_STACK, wind_set
+WF_TOOLBAR
+WF_TOOLBAR, wind_get
+WF_TOOLBAR, wind_set
+WF_TOP
+WF_TOP, wind_get
+WF_TOP, wind_set
+WF_TOPALL
+WF_TOPALL, wind_set
+WF_TOPAP
+WF_TOPMOST
+WF_TOPMOST, wind_get
+WF_TOPMOST, wind_set
+WF_UNICONIFY
+WF_UNICONIFY, wind_get
+WF_UNICONIFY, wind_set
+WF_UNICONIFYXYWH
+WF_UNICONIFYXYWH, wind_set
+WF_USER_POINTER
+WF_USER_POINTER, wind_get
+WF_USER_POINTER, wind_set
+WF_VSLIDE
+WF_VSLIDE, wind_get
+WF_VSLIDE, wind_set
+WF_VSLSIZE
+WF_VSLSIZE, wind_get
+WF_VSLSIZE, wind_set
+WF_WCOLOR
+WF_WHEEL
+WF_WHEEL, wind_set
+WF_WIDGETS
+WF_WIDGETS, wind_get
+WF_WIDGETS, wind_set
+WF_WINDLIST, wind_get
+WF_WIND_ATTACH
+WF_WIND_ATTACH, wind_set
+WF_WINX
+WF_WINX, wind_get
+WF_WINXCFG
+WF_WINXCFG, wind_get
+WF_WINXCFG, wind_set
+WF_WORKXYWH
+WF_WORKXYWH, wind_get
+What does the viewer do?
+What is SSP?
+What is the SSP-Server?
+What kinds of files can be displayed?
+What's mapping?
+WHITEBAK
+Who is the viewer?
+Wide format
+WinChangeFont
+WINCOM_MSG
+Wind-XES
+Window library
+Window, Desktop
+Window, rectangle-list of a
+Window-dialogs
+wind_apfind
+wind_calc
+wind_calc, Problems with
+wind_close
+wind_create
+WIND_DATA
+wind_delete
+wind_draw
+wind_find
+wind_get
+wind_get and wind_set mode in Geneva
+wind_new
+wind_open
+wind_set
+wind_set and PC-GEM
+WIND_TREE
+wind_update
+wind_xget
+wind_xset
+WINFRAME_HANDLER
+WINFRAME_SETTINGS
+WININFO
+winsize
+WIN_CHANGED
+WIN_CHANGEFNT
+WIN_CLOSED
+WIN_HSLIDE
+WIN_HSLSIZE
+WIN_INFO
+WIN_NAME
+WIN_NEWTOP
+WIN_SCROLLED
+WIN_SIZED
+WIN_TOPPED
+WIN_VSLIDE
+WIN_VSLSIZE
+WISEL_MSG
+WM_ALLICONIFY
+WM_ARROWED
+WM_BACKDROPPED
+WM_BOTTOMED
+WM_CLOSED
+WM_COPY
+WM_CUT
+WM_DELETE
+WM_FIND
+WM_FINDNEXT
+WM_FULLED
+WM_HELP
+WM_HSLID
+WM_ICONIFY
+WM_ISTOP
+WM_MOUSEWHEEL
+WM_MOVED
+WM_M_BDROPPED
+WM_NEWTOP
+WM_OFFTOP
+WM_ONTOP
+WM_PASTE
+WM_PRINT
+WM_REDRAW
+WM_REPLACE
+WM_REPOSED
+WM_SAVE
+WM_SAVEAS
+WM_SELECTALL
+WM_SHADED
+WM_SIZED
+WM_TOOLBAR
+WM_TOPPED
+WM_UNDO
+WM_UNICONIFY
+WM_UNSHADED
+WM_UNTOPPED
+WM_VSLID
+WM_WHEEL
+WO0_FULLREDRAW
+WO0_NOBLITH
+WO0_NOBLITW
+WO0_SENDREPOS
+WO0_WCOWORK
+WO0_WHEEL
+Workstation driver, MX_DDEV
+Workstations, Virtual
+WP
+Wrap_off
+Wrap_on
+wredraw
+Write mode
+Write-density of the FDC
+Writeback-demon
+writesmp
+write_config_byte
+write_config_longword
+write_config_word
+write_io_byte
+write_io_longword
+write_io_word
+write_mem_byte
+write_mem_longword
+write_mem_word
+Write_Queue
+wr_dclk
+wr_dconv
+wr_dpath1
+wr_dpath2
+wr_dpdat
+wr_dport
+WR_PLAY
+wr_raes
+wr_rdsp
+WR_REC
+wr_rhi
+wr_rint
+wr_rlow
+WR_STOP
+WR_TIME
+W_BOTTOMER
+W_BOX
+W_CLOSER
+W_DATA
+W_DNARROW
+W_FULLER
+W_HBAR
+W_HELEV
+W_HSLIDE
+W_INFO
+W_LFARROW
+W_NAME
+W_RTARROW
+W_SIZER
+W_SMALLER
+W_TITLE
+W_UPARROW
+W_VBAR
+W_VELEV
+W_VSLIDE
+W_WORK
+

+ +

+X
+X/GEM
+XA
+XA, wind_get
+XaAES
+XaAES deprecated functions
+XaAES functions
+XAcc
+XAcc message groups
+XAcc messages
+Xacc program types
+XACC.H
+XACC_AV_CLOSE
+XACC_AV_EXIT
+XACC_AV_INIT
+Xacc_Dsinfo
+Xacc_Dsi_Request
+Xacc_Field_Info
+Xacc_File_Info
+XACRS_BUBBLE_DISC
+XACRS_HORSIZER
+XACRS_MOVER
+XACRS_NE_SIZER
+XACRS_POINTSLIDE
+XACRS_RESIZER
+XACRS_VERTSIZER
+XAESMSG
+xappl_getinfo
+xapp_getinfo
+XATTR
+XATTR, access rights
+XATTR, dev-components
+XATTR, possible filetypes
+XATTR, size-components
+XATTR, special bits
+XATTR, Sticky-bit
+XBIOS
+xbios
+XBIOS Dispatcher
+XBIOS error-messages
+XBIOS function list
+XBIOS Structures
+xbios(32000)
+xbios(32001)
+xbios(32002)
+xbios(CHECKinst)
+xbios(GETboard)
+xbios(GETscreen)
+XBIOS, Parameter passing in
+xbios-trap
+XBRA procedure
+XBRA structure
+Xbtimer
+XCMDs under MagiC Mac
+xconin
+xconout
+xconstat
+XCONTROL
+XCONTROL functions
+XControl, Start of
+xcostat
+XCPB
+XDO_INF
+XFNT_INFO
+XFONTINFO
+XFONT_CHANGED
+Xform_do
+xfrm_popup
+XFS structures
+XFS, Data structures for an
+XFS, Installation of an
+XFS, Kernel functions for a
+XFS-concept in MagiC
+XFS-concept, General remarks
+xFSL cookie
+xFSL interface
+xFSL parameter passing
+xFSL Questions and Answers
+xFSL return codes
+xFSL revisions history
+xFSL technical programming notes
+xFSL tips and notes
+xfsl_event
+xfsl_exit
+XFSL_FILTER
+xfsl_info
+xfsl_init
+xfsl_input
+xFSL_PAR
+xFSL_PENTRY
+xfs_attrib
+xfs_chmod
+xfs_chown
+xfs_dclosedir
+xfs_dcntl
+xfs_dcreate
+xfs_DD2name
+xfs_ddelete
+xfs_dfree
+xfs_dopendir
+xfs_dpathconf
+xfs_dreaddir
+xfs_drewinddir
+xfs_drv_close
+xfs_drv_open
+xfs_dta_drive
+xfs_dta_res1
+xfs_fdelete
+xfs_flags
+xfs_fopen
+xfs_freeDD
+xfs_garbcoll
+xfs_init
+xfs_link
+xfs_name
+xfs_next
+xfs_path2DD
+xfs_pterm
+xfs_readlink
+xfs_rlabel
+xfs_sfirst
+xfs_snext
+xfs_symlink
+xfs_sync
+xfs_wlabel
+xfs_xattr
+XGen_Alert
+xgrf_2box
+xgrf_color
+xgrf_dtimage
+xgrf_stepcalc
+XHDI
+XHDI - eXtended HardDisk Interface (Version 1.30)
+XHDI cookie
+XHDI error-codes
+XHDI functions
+XHDI terminology
+XHDOSLimits
+XHDriverSpecial
+XHDrvMap
+XHEject
+XHGetCapacity
+XHGetVersion
+XHInqDev
+XHInqDev2
+XHInqDriver
+XHInqTarget
+XHInqTarget2
+XHLastAccess
+XHLock
+XHMediumChanged
+XHMiNTInfo
+XHNewCookie
+XHReaccess
+XHReadWrite
+XHReserve
+XHStop
+XH_DL_BFLAGS
+XH_DL_CLSIZB
+XH_DL_CLUSTS
+XH_DL_CLUSTS12
+XH_DL_CLUSTS32
+XH_DL_DRIVES
+XH_DL_MAXFAT
+XH_DL_MAXSEC
+XH_DL_MAXSPC
+XH_DL_MINFAT
+XH_DL_MINSPC
+XH_DL_RDLEN
+XH_DL_SECSIZ
+XH_MI_GETKERINFO
+XH_MI_SETKERINFO
+XH_TARGET_EJECTABLE
+XH_TARGET_LOCKABLE
+XH_TARGET_LOCKED
+XH_TARGET_REMOVABLE
+XH_TARGET_RESERVED
+XH_TARGET_STOPPABLE
+XH_TARGET_STOPPED
+XIMG-Header
+xkey
+XMEN_MGR
+XOR mode
+XSDD protocol
+xshelw
+xshl_getshell
+xshl_setshell
+XSHW_COMMAND
+XSHW_RUNACC
+XSHW_RUNANY
+XSHW_RUNAPP
+XSSI protocol
+XSTATE
+XTED
+xUFSL
+X_APF_SEARCH
+x_appl_flags
+x_appl_font
+x_appl_sleep
+x_appl_term
+X_APS_CHEXIT
+X_APS_CHILD
+X_APS_CHILD0
+X_BUF_V2
+X_FMD_FINISH
+X_FMD_START
+x_form_center
+x_form_error
+x_form_filename
+x_form_mouse
+x_fsel_input
+X_GET_HELP
+x_graf_blit
+x_graf_rast2rez
+x_graf_rubberbox
+x_help
+X_HSPLIT
+X_LFTRT
+x_malloc
+X_MENU
+x_mfree
+X_MGET
+X_MN_SELECTED
+X_MRESET
+x_mshrink
+X_MU_DIALOG
+x_objc_edit
+x_realloc
+x_scrp_get
+x_settings
+X_SET_SHAPE
+X_SHACCESS
+X_SHCLOSE
+x_shel_get
+x_shel_put
+X_SHLOADSAVE
+X_SHOPEN
+x_sprintf
+x_sscanf
+X_UPDOWN
+X_VSPLIT
+x_wdial_change
+x_wdial_draw
+X_WD_ACTIVE
+X_WD_BLITSCRL
+X_WD_KEYS
+X_WF_DCOLSTAT
+X_WF_DCOLSTAT, wind_get
+X_WF_DCOLSTAT, wind_set
+X_WF_DFLTDESK
+X_WF_DFLTDESK, wind_get
+X_WF_DFLTDESK, wind_set
+X_WF_DIALEDIT
+X_WF_DIALEDIT, wind_get
+X_WF_DIALEDIT, wind_set
+X_WF_DIALFLGS
+X_WF_DIALFLGS, wind_get
+X_WF_DIALFLGS, wind_set
+X_WF_DIALHT
+X_WF_DIALHT, wind_get
+X_WF_DIALHT, wind_set
+X_WF_DIALOG
+X_WF_DIALOG, wind_get
+X_WF_DIALOG, wind_set
+X_WF_DIALWID
+X_WF_DIALWID, wind_get
+X_WF_DIALWID, wind_set
+X_WF_HSLIDE2
+X_WF_HSLIDE2, wind_get
+X_WF_HSLIDE2, wind_set
+X_WF_HSLSIZE2
+X_WF_HSLSIZE2, wind_get
+X_WF_HSLSIZE2, wind_set
+X_WF_HSPLIT
+X_WF_HSPLIT, wind_get
+X_WF_HSPLIT, wind_set
+X_WF_MENU
+X_WF_MENU, wind_get
+X_WF_MENU, wind_set
+X_WF_MINMAX
+X_WF_MINMAX, wind_get
+X_WF_MINMAX, wind_set
+X_WF_OBJHAND
+X_WF_OBJHAND, wind_get
+X_WF_OBJHAND, wind_set
+X_WF_SPLMIN
+X_WF_SPLMIN, wind_get
+X_WF_SPLMIN, wind_set
+X_WF_VSLIDE2
+X_WF_VSLIDE2, wind_get
+X_WF_VSLIDE2, wind_set
+X_WF_VSLSIZE2
+X_WF_VSLSIZE2, wind_get
+X_WF_VSLSIZE2, wind_set
+X_WF_VSPLIT
+X_WF_VSPLIT, wind_get
+X_WF_VSPLIT, wind_set
+x_wind_calc
+x_wind_create
+x_wind_tree
+X_WM_ARROWED2
+X_WM_HSLID2
+X_WM_HSPLIT
+X_WM_OBJECT
+X_WM_SELECTED
+X_WM_VECEVNT
+X_WM_VECKEY
+X_WM_VECSW
+X_WM_VSLID2
+X_WTFL_CLICKS
+X_WTFL_RESIZE
+X_WTFL_SLIDERS
+X_WT_GETCNT
+X_WT_READ
+X_WT_SET
+

+ +

+Z
+zerono
+

+ +

+_
+_appl_yield
+_autopath
+_bootdev
+_bufl
+_cmdload
+_drvbits
+_dskbufp
+_frclock
+_fverify
+_hz_200
+_longframe
+_md
+_membot
+_memtop
+_nflops
+_PNAM
+_prtabt
+_p_cookies
+_shell_p
+_sysbase
+_timr_ms
+_vbclock
+_vblqueue
+_vbl_list
+_vq_gdos
+_v_bas_ad
+

+ +
+# + | % + | 2 + | A + | B + | C + | D + | E + | F + | G + | H + | I + | J + | K + | L + | M + | N + | O + | P + | Q + | R + | S + | T + | U + | V + | W + | X + | Z + | _ +
+ +
+ +Home +Contents +XCPBXCPB + + + + + + + + diff --git a/en/introduction.html b/en/introduction.html new file mode 100644 index 000000000..d1f225e80 --- /dev/null +++ b/en/introduction.html @@ -0,0 +1,40 @@ + + + + + +The documentation for TOS: Introduction + + + + + + + + + +Home +Contents +Home +ContactContact + +
+ +

1 Introduction

+ +
+
+ +Home +Contents +Home +ContactContact + + diff --git a/en/lbox.html b/en/lbox.html new file mode 100644 index 000000000..a4b948d39 --- /dev/null +++ b/en/lbox.html @@ -0,0 +1,4264 @@ + + + + + +The documentation for TOS: List boxes + + + + + + + + + +Home +AESAES +Scrap libraryScrap library +MagiC libraryMagiC library + +
+ +

8.15 List boxes

+

The following routines were introduced with MagiC 4, and permit +the creation and hadling of list boxes: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
lbox_ascroll_to Positions slider A of the list box +
lbox_bscroll_to Positions slider B of the list box +
lbox_cnt_items Obtains number of list items +
lbox_create Creates a list box +
lbox_delete Releases memory allocated for a list box +
lbox_do Processes button of a list box +
lbox_free_items Releases items list +
lbox_free_list Releases items list +
lbox_get_afirst Obtains index of first visible item (slider A) +
lbox_get_avis Obtains number of visible entries (slider A) +
lbox_get_bentries Obtains number of entries (slider B) +
lbox_get_bfirst Obtains index of first visible item (slider B) +
lbox_get_bvis Obtains number of visible entries (slider B) +
lbox_get_idx Obtains index of an item +
lbox_get_item Returns pointer to n-th item +
lbox_get_items Returns pointer to the first item +
lbox_get_slct_idx Obtains index of the first selected item +
lbox_get_slct_item Returns pointer to the first selected item +
lbox_get_tree Obtains object tree of the dialog +
lbox_get_udata Gets pointer to program-specific data +
lbox_set_asldr Sets position of the slider A +
lbox_set_bentries Sets number of entries for slider B +
lbox_set_bsldr Sets position of the slider B +
lbox_set_items Sets new items list +
lbox_update Updates list box + +
+ +

Hint: The presence of this call should be checked for +using appl_getinfo (Opcode 7). +

+

See also: +
Calling procedure for modal dialogs   Style guidelines   WDIALOG +

+

8.15.1 lbox_ascroll_to

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List box scroll to, Slider A« - Set position of slider A of +the list box. +
  +
Opcode: 175 (sub-opcode 4) +
  +
Syntax: void lbox_ascroll_to ( LIST_BOX *box, int16_t first, GRECT +*box_rect, GRECT *slider_rect ); +
  +
or +
  +
void lbox_scroll_to ( ... ); +
  +
Description: The call lbox_ascroll_to positions slider A in a list box. The +following apply: +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
boxPointer to the list box structure
firstIndex of the first visible entry
box_rectPointer to redraw rectangle or 0L
slider_rectPointer to redraw rectangle or 0L
+
+ +
Hint: This function works in principle like a call of +lbox_set_slider followed by a lbox_update; scrolling takes place if +possible, however, to reduce the amount of drawing required. One may +therefore not use lbox_scroll_to if the item list of the list box has +changed. +
  +
Return value: The function does not return a result. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: List boxes +
  +
See also: Binding   lbox_do   lbox_set_slider +
  + +
+ +

8.15.1.1 Bindings for lbox_ascroll_to

+ + + + + + + + + +
C: void lbox_ascroll_to ( LIST_BOX *box, int16_t first, GRECT +*box_rect, GRECT *slider_rect ); +
  +
or +
  +
void lbox_scroll_to ( ... ); +
  +
Binding: +
  +
void lbox_ascroll_to ( LIST_BOX *box, int16_t first,
+                       GRECT *box_rect,
+                       GRECT *slider_rect )
+
+or
+
+void lbox_scroll_to ( ... )
+{
+   addr_in[0] = box;
+   addr_in[1] = box_rect;
+   addr_in[2] = slider_rect;
+
+   int_in[0] = 4;
+   int_in[1] = first;
+   crys_if (175);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]175 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]3 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]box
addr_in+4addr_in[1]box_rect
addr_in+8addr_in[2]slider_rect
int_inint_in[0]4 # Sub-opcode
int_in+2int_in[1]first
+
+ + +
+ +

8.15.2 lbox_bscroll_to

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List box scroll to, Slider B« - Set position of slider B of +the list box. +
  +
Opcode: 175 (sub-opcode 7) +
  +
Syntax: void lbox_bscroll_to ( LIST_BOX *box, int16_t first, GRECT +*box_rect, GRECT *slider_rect ); +
  +
Description: The call lbox_bscroll_to positions slider B of a list box. The +following apply: +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
boxPointer to the list box structure
firstIndex of the first visible entry
box_rectPointer to redraw rectangle or 0L
slider_rectPointer to redraw rectangle or 0L
+
+ +
Hint: The parameter box_rect is the redraw +rectangle for the list box and slider_rect is the redraw +rectangle for the slider. +
  +
The function works in principle like a call of lbox_set_bslider +followed by a lbox_update; scrolling takes place if possible, however, +to reduce the amount of drawing required. One may therefore not use +lbox_scroll_to if the item list of the list box has changed. +
  +
Return value: The function does not return a result. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: List boxes +
  +
See also: Binding   lbox_free_items   lbox_get_slct_item +
  + +
+ +

8.15.2.1 Bindings for lbox_bscroll_to

+ + + + + + + + + +
C: void lbox_bscroll_to ( LIST_BOX *box, int16_t first, GRECT +*box_rect, GRECT *slider_rect ); +
  +
Binding: +
  +
void lbox_bscroll_to ( LIST_BOX *box, int16_t first,
+                       GRECT *box_rect,
+                       GRECT *slider_rect )
+{
+   addr_in[0] = box;
+   addr_in[1] = box_rect;
+   addr_in[2] = slider_rect;
+
+   int_in[0] = 7;
+   int_in[0] = first;
+   crys_if (175);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]175 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]3 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]box
addr_in+4addr_in[1]box_rect
addr_in+8addr_in[2]slider_rect
int_inint_in[0]7 # Sub-opcode
int_in+2int_in[1]first
+
+ + +
+ +

8.15.3 lbox_cnt_items

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List box count items« - Obtain the number of list items. +
  +
Opcode: 174 (Sub-opcode 0) +
  +
Syntax: int16_t lbox_cnt_items ( LIST_BOX *box ); +
  +
Description: The call lbox_cnt_items counts the items of the chained list in +the list box. +
  +

+
+ + + + + + + + +
ParameterMeaning
boxPointer to the list box structure
+
+ +
Return value: Number of the items in the list +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: List boxes +
  +
See also: Binding   lbox_free_items   lbox_get_slct_item +
  + +
+ +

8.15.3.1 Bindings for lbox_cnt_items

+ + + + + + + + + +
C: int16_t lbox_cnt_items ( LIST_BOX *box ); +
  +
Binding: +
  +
int16_t lbox_cnt_items ( LIST_BOX *box )
+{
+   addr_in[0] = box;
+   int_in[0]  = 0;
+   crys_if (174);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]174 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]box
int_inint_in[0]0 # Sub-opcode
int_outint_out[0]Return value
+
+ + +
+ +

8.15.4 lbox_create

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List Box Create« - Create a list box +
  +
Opcode: 170 +
  +
Syntax: LIST_BOX *lbox_create ( OBJECT *tree, SLCT_ITEM slct, SET_ITEM +set, LBOX_ITEM *items, int16_t visible_a, int16_t first_a, int16_t +*ctrl_objs, int16_t *objs, int16_t flags, int16_t pause_a, void +*user_data, DIALOG *dialog, int16_t visible_b, int16_t first_b, +int16_t entries_b, int16_t pause_b ); +
  +
Description: The function lbox_create allocates memory for a list box and +initializes the objects. +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
tree Pointer to the object tree of the dialog +
slct Pointer to selection routine +
set Pointer to set routine +
items Pointer to linked list with LBOX_ITEMs or NULL +
visible_a Number of visible entries (Slider A) +
first_a Index of the first visible entry (Slider A) +
ctrl_objs Pointer to a field with the object indices of the buttons and +slider (5 entries) + + + + + + + + + + + + + + + +
ctrl_objs[0] = Object index of the BOX or IBOX, that contains the actual list +box object +
ctrl_objs[1] = Object index of the buttons for scrolling upwards or left +
ctrl_objs[2] = Object index of the buttons for scrolling downwards or right +
ctrl_objs[3] = Object index of the slider background box +
ctrl_objs[4] = Object index of the slider box + +
+ +
+
If the list box has 2 sliders, ctrl_objs[5-8] +contain the numbers of the objects for Slider B: + + + + + + + + + + + + +
ctrl_objs[5] = Object index of the button for scrolling upwards or left +
ctrl_objs[6] = Object index of the button for scrolling downwards or right +
ctrl_objs[7] = Object index of the slider background box +
ctrl_objs[8] = Object index of the slider box + +
+ +
objs Pointer to a field with the object indices of the list box +items (entries). + + + + + + +
objs[0] = Number of the first object +
objs[entries-1] = Number of the last object + +
+ +
The objects should normally have TOUCHEXIT status. +
flags Various flags +
pause_a Delay during scrolling in ms (Slider A) +
user_data Pointer for application +
dialog Pointer to the window dialog structure or 0L +
visible_b Number of visible items (Slider B) +
first_b First visible item (Slider B) +
entries_b Number of items (Slider B) +
pause_b Delay during scrolling in ms (Slider B) + +
+ +
Note: The initialization is performed by calling the +routine set for each of the objects specified in objs. +Calling this function does not draw the list box. +
  +
The buttons, the slider and the slider background should have a +TOUCHEXIT status. If the list box contains only buttons and no slider, +ctrl_objs[3/4] or [7/8] must contain -1. +
  +
Independent of the main scroll direction, the list box can have +a second slider as well if the entries themselves should also be +scrolled sideways; this can be sensible for a vertical list box with +text entries that are wider than the box itself, for instance. +
  +
Both slct and set are functions whose parameters +are passed on the stack. The functions may alter registers +d0-d2/a0-a2. +
  +
slct is always called whenever an entry is selected or +deselected. The variable selected in the LBOX_ITEM structure +already contains the new status of the object when slct is +called. +
  +
Return value: The function returns a pointer to the structure of the list box +(or the value NULL in case of error). +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: List boxes +
  +
See also: Binding   lbox_delete   lbox_do +
  + +
+ +

8.15.4.1 Bindings for lbox_create

+ + + + + + + + + +
C: LIST_BOX *lbox_create ( OBJECT *tree, SLCT_ITEM slct, SET_ITEM +set, LBOX_ITEM *items, int16_t visible_a, int16_t first_a, int16_t +*ctrl_objs, int16_t *objs, int16_t flags, int16_t pause_a, void +*user_data, DIALOG *dialog, int16_t visible_b, int16_t first_b, +int16_t entries_b, int16_t pause_b ); +
  +
Binding: +
  +
LIST_BOX *lbox_create ( OBJECT *tree, SLCT_ITEM slct,
+                        SET_ITEM set,
+                        LBOX_ITEM *items, int16_t visible_a,
+                        int16_t first_a, int16_t *ctrl_objs,
+                        int16_t *objs, int16_t flags,
+                        int16_t pause_a, void *user_data,
+                        DIALOG *dialog, int16_t visible_b,
+                        int16_t first_b, int16_t entries_b,
+                        int16_t pause_b )
+{
+   addr_in[0] = tree;
+   addr_in[1] = slct;
+   addr_in[2] = set;
+   addr_in[3] = items;
+   addr_in[4] = ctrl_objs;
+   addr_in[5] = objs;
+   addr_in[6] = user_data;
+   addr_in[7] = dialog;
+
+   int_in[0]  = visible_a;
+   int_in[1]  = first_a;
+   int_in[2]  = flags;
+   int_in[3]  = pause_a;
+
+   int_in[4]  = visible_b;
+   int_in[5]  = first_b;
+   int_in[6]  = entries_b;
+   int_in[7]  = pause_b;
+
+   crys_if (170);
+
+   return ( addr_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]170 # Function opcode
control+2control[1]4/8 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]8 # Entry in addr_in
control+8control[4]1 # Entry in addr_out
addr_inaddr_in[0]tree
addr_in+4addr_in[1]slct
addr_in+8addr_in[2]set
addr_in+12addr_in[3]items
addr_in+16addr_in[4]ctrl_objs
addr_in+20addr_in[5]objs
addr_in+24addr_in[6]user_data
addr_in+28addr_in[7]dialog
int_inint_in[0]visible_a
int_in+2int_in[1]first_a
int_in+4int_in[2]flags
int_in+6int_in[3]pause_a
int_in+8int_in[4]visible_b
int_in+10int_in[5]first_b
int_in+12int_in[6]entries_b
int_in+14int_in[7]pause_b
addr_outaddr_out[0]Return value
+
+ + +
+ +

8.15.5 lbox_delete

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List box delete« - Release memory allocated for a list box. +
  +
Opcode: 173 +
  +
Syntax: int16_t lbox_delete ( LIST_BOX *box ); +
  +
Description: The call lbox_delete releases the memory allocated for the list +box. +
  +

+
+ + + + + + + + +
ParameterMeaning
boxPointer to the list box structure
+
+ +
Return value: Always 1 +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: List boxes +
  +
See also: Binding   lbox_create   lbox_do +
  + +
+ +

8.15.5.1 Bindings for lbox_delete

+ + + + + + + + + +
C: int16_t lbox_delete ( LIST_BOX *box ); +
  +
Binding: +
  +
int16_t lbox_delete ( LIST_BOX *box )
+{
+   addr_in[0] = box;
+   crys_if (173);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]173 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]box
int_outint_out[0]Return value
+
+ + +
+ +

8.15.6 lbox_do

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List box do« - Process button of a list box. +
  +
Opcode: 172 +
  +
Syntax: int16_t lbox_do ( LIST_BOX *box, int16_t obj ); +
  +
Description: The call lbox_do reacts to the operation of a button of a list +box. The following apply: +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
boxPointer to the list box structure
objIndex of the selected object
+
+ +
Hint: The function should be called after form_do (or by +the service function of the window dialog). Double-clicks (see below) +are recognized by the function by a set top bit (obj | 0x8000) of the +object index. In the returned object index the top bit is cleared in +all cases. +
  +
Return value: The function returns the index of the selected object (or the +value -1 if a double-click was made on an entry). In the latter case +the dialog should be closed and the action seen as a click on the OK +button. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: List boxes +
  +
See also: Binding   lbox_delete   lbox_create +
  + +
+ +

8.15.6.1 Bindings for lbox_do

+ + + + + + + + + +
C: int16_t lbox_do ( LIST_BOX *box, int16_t obj ); +
  +
Binding: +
  +
int16_t lbox_do ( LIST_BOX *box, int16_t obj )
+{
+   addr_in[0] = box;
+   int_in[0]  = obj;
+   crys_if (172);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]172 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]box
int_inint_in[0]obj
int_outint_out[0]Return value
+
+ + +
+ +

8.15.7 lbox_free_items

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List box free items« - Release items list. +
  +
Opcode: 175 (sub-opcode 2) +
  +
Syntax: void lbox_free_items ( LIST_BOX *box ); +
  +
Description: The call lbox_free_items frees the memory used for the chained +list from LBOX_ITEM. The following applies: +
  +

+
+ + + + + + + + +
ParameterMeaning
boxPointer to the list box structure
+
+ +
Hint: A prerequisite for this is that memory was +allocated with Malloc for each item of the list. +
  +
If custom memory management was used for LBOX_ITEM (e.g. the C +standard functions), then a custom function must also be called to +free the memory. +
  +
Return value: The function does not return a result. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: List boxes +
  +
See also: Binding   lbox_free_list   lbox_delete +
  + +
+ +

8.15.7.1 Bindings for lbox_free_items

+ + + + + + + + + +
C: void lbox_free_items ( LIST_BOX *box ); +
  +
Binding: +
  +
void lbox_free_items ( LIST_BOX *box )
+{
+   addr_in[0] = box;
+   int_in[0]  = 2;
+
+   crys_if (175);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]175 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]box
int_inint_in[0]2 # Sub-opcode
+
+ + +
+ +

8.15.8 lbox_free_list

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List box free item list« - Release items list. +
  +
Opcode: 175 (sub-opcode 3) +
  +
Syntax: void lbox_free_list ( LBOX_ITEM *items ); +
  +
Description: The call lbox_free_list releases the memory used for the items +of the list box. The following applies: +
  +

+
+ + + + + + + + +
ParameterMeaning
itemsPointer to linked list with LBOX_ITEM
+
+ +
Hint: This functions works exactly the same as +lbox_free_items. In contrast to that however lbox_free_list is called +with the pointer on the first LBOX_ITEM of the list. +
  +
Return value: The function does not return a result. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: List boxes +
  +
See also: Binding   lbox_free_items   lbox_delete +
  + +
+ +

8.15.8.1 Bindings for lbox_free_list

+ + + + + + + + + +
C: void lbox_free_list ( LBOX_ITEM *items ); +
  +
Binding: +
  +
void lbox_free_list ( LBOX_ITEM *items )
+{
+   addr_in[0] = items;
+   int_in[0]  = 3;
+
+   crys_if (175);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]175 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]items
int_inint_in[0]3 # Sub-opcode
+
+ + +
+ +

8.15.9 lbox_get_afirst

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List box get first visible item, Slider A« - Obtain index of +first visible item (slider A). +
  +
Opcode: 174 (sub-opcode 4) +
  +
Syntax: int16_t lbox_get_afirst ( LIST_BOX *box ); +
  +
Description: The call lbox_get_afirst obtains the index of the first visible +item of the list box for slider A. The following applies: +
  +

+
+ + + + + + + + +
ParameterMeaning
boxPointer to the list box structure
+
+ +
Return value: The function returns the index of the first visible item for +slider A. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: List boxes +
  +
See also: Binding   lbox_get_idx   lbox_get_item +
  + +
+ +

8.15.9.1 Bindings for lbox_get_afirst

+ + + + + + + + + +
C: int16_t lbox_get_afirst ( LIST_BOX *box ); +
  +
or +
  +
int16_t lbox_get_first ( ... ); +
  +
Binding: +
  +
int16_t lbox_get_afirst ( LIST_BOX *box )
+
+(!I)or(!i)
+
+int16_t lbox_get_first  ( ... )
+{
+   addr_in[0] = box;
+   int_in[0]  = 4;
+   crys_if (174);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]174 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]box
int_inint_in[0]4 # Sub-opcode
int_outint_out[0]Return value
+
+ + +
+ +

8.15.10 lbox_get_avis

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List box get number of visible items, Slider A« - Obtain +number of visible items (slider A). +
  +
Opcode: 174 (sub-opcode 2) +
  +
Syntax: int16_t lbox_get_avis ( LIST_BOX *box ); +
  +
Description: The call lbox_get_avis obtains the number of visible items of a +list box for slider A. The following applies: +
  +

+
+ + + + + + + + +
ParameterMeaning
boxPointer to the list box structure
+
+ +
Return value: The function returns the number of visible items for slider A. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: List boxes +
  +
See also: Binding   lbox_get_tree   lbox_get_first +
  + +
+ +

8.15.10.1 Bindings for lbox_get_avis

+ + + + + + + + + +
C: int16_t lbox_get_avis ( LIST_BOX *box ); +
  +
or +
  +
int16_t lbox_get_visible ( ... ); +
  +
Binding: +
  +
int16_t lbox_get_avis ( LIST_BOX *box )
+
+(!I)or(!i)
+
+int16_t lbox_get_visible ( ... )
+{
+   addr_in[0] = box;
+   int_in[0]  = 2;
+   crys_if (174);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]174 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]box
int_inint_in[0]2 # Sub-opcode
int_outint_out[0]Return value
+
+ + +
+ +

8.15.11 lbox_get_bentries

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List box get number of entries, Slider B« - Obtain number of +entries (slider B). +
  +
Opcode: 174 (sub-opcode 11) +
  +
Syntax: int16_t lbox_get_bentries ( LIST_BOX *box ); +
  +
Description: The call lbox_get_bentries returns the number of entries in the +list for slider B. The following applies: +
  +

+
+ + + + + + + + +
ParameterMeaning
boxPointer to the list box structure
+
+ +
Return value: This function returns the number of items for slider B. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: List boxes +
  +
See also: Binding   lbox_free_items   lbox_delete +
  + +
+ +

8.15.11.1 Bindings for lbox_get_bentries

+ + + + + + + + + +
C: int16_t lbox_get_bentries ( LIST_BOX *box ); +
  +
Binding: +
  +
int16_t lbox_get_bentries ( LIST_BOX *box )
+{
+   addr_in[0] = box;
+   int_in[0]  = 11;
+
+   crys_if (174);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]174 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]box
int_inint_in[0]11 # Sub-opcode
int_outint_out[0]Return value
+
+ + +
+ +

8.15.12 lbox_get_bfirst

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List box get first visible item, Slider B« - Obtain index of +first visible item (slider B). +
  +
Opcode: 174 (sub-opcode 12) +
  +
Syntax: int16_t lbox_get_bfirst ( LIST_BOX *box ); +
  +
Description: The call lbox_get_bfirst obtains the index of the first visible +item of a list box for slider B. The following applies: +
  +

+
+ + + + + + + + +
ParameterMeaning
boxPointer to the list box structure
+
+ +
Return value: This function returns the index of the first visible item for +slider B. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: List boxes +
  +
See also: Binding   lbox_free_items   lbox_delete +
  + +
+ +

8.15.12.1 Bindings for lbox_get_bfirst

+ + + + + + + + + +
C: int16_t lbox_get_bfirst ( LIST_BOX *box ); +
  +
Binding: +
  +
int16_t lbox_get_bfirst ( LIST_BOX *box )
+{
+   addr_in[0] = box;
+   int_in[0]  = 12;
+
+   crys_if (174);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]174 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]box
int_inint_in[0]12 # Sub-opcode
int_outint_out[0]Return value
+
+ + +
+ +

8.15.13 lbox_get_bvis

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List box get number of visible items, Slider B« - Obtain +number of visible items (slider B). +
  +
Opcode: 174 (sub-opcode 10) +
  +
Syntax: int16_t lbox_get_bvis ( LIST_BOX *box ); +
  +
Description: The call lbox_get_bvis obtains the number of visible items of a +list box for slider B. The following applies: +
  +

+
+ + + + + + + + +
ParameterMeaning
boxPointer to the list box structure
+
+ +
Return value: This function returns the number of visible items for slider B. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: List boxes +
  +
See also: Binding   lbox_free_items   lbox_delete +
  + +
+ +

8.15.13.1 Bindings for lbox_get_bvis

+ + + + + + + + + +
C: int16_t lbox_get_bvis ( LIST_BOX *box ); +
  +
Binding: +
  +
int16_t lbox_get_bvis ( LIST_BOX *box )
+{
+   addr_in[0] = box;
+   int_in[0]  = 10;
+
+   crys_if (174);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]174 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]box
int_inint_in[0]10 # Sub-opcode
int_outint_out[0]Return value
+
+ + +
+ +

8.15.14 lbox_get_idx

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »»List box get item index« - Obtain index of an item. +
  +
Opcode: 174 (sub-opcode 9) +
  +
Syntax: int16_t lbox_get_idx ( LBOX_ITEM *items, LBOX_ITEM *search ); +
  +
Description: The call lbox_get_idx returns the index of a given item of the +list box. The following apply: +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
itemsPointer to the first item of the list
searchPointer to the item to be found
+
+ +
Return value: This function returns the index of the item. If the item is not +an element of the list, the return value is -1. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: List boxes +
  +
See also: Binding   lbox_get_item   lbox_get_first +
  + +
+ +

8.15.14.1 Bindings for lbox_get_idx

+ + + + + + + + + +
C: int16_t lbox_get_idx ( LBOX_ITEM *items, LBOX_ITEM *search ); +
  +
Binding: +
  +
int16_t lbox_get_idx ( LBOX_ITEM *items, LBOX_ITEM *search )
+{
+   addr_in[0] = items;
+   addr_in[1] = search;
+   int_in[0]  = 9;
+   crys_if (174);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]174 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]items
addr_in+4addr_in[1]search
int_inint_in[0]9 # Sub-opcode
int_outint_out[0]Return value
+
+ + +
+ +

8.15.15 lbox_get_item

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List box get item« - Return pointer to n-th item. +
  +
Opcode: 174 (sub-opcode 7) +
  +
Syntax: LBOX_ITEM *lbox_get_item ( LIST_BOX *box, int16_t n ); +
  +
Description: The call lbox_get_item returns a pointer to the n-th +item of the list box. The following apply: +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
boxPointer to the list box structure
nIndex of the items
+
+ +
Return value: The function returns the pointer to item n, or NULL if +this is not found. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: List boxes +
  +
See also: Binding   lbox_get_first   lbox_get_idx +
  + +
+ +

8.15.15.1 Bindings for lbox_get_item

+ + + + + + + + + +
C: LBOX_ITEM *lbox_get_item ( LIST_BOX *box, int16_t n ); +
  +
Binding: +
  +
LBOX_ITEM *lbox_get_item ( LIST_BOX *box, int16_t n )
+{
+   addr_in[0] = box;
+   int_in[0]  = 7;
+   int_in[1]  = n;
+   crys_if (174);
+
+   return ( addr_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]174 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]1 # Entry in addr_out
addr_inaddr_in[0]box
int_inint_in[0]7 # Sub-opcode
int_in+2int_in[1]n
addr_outaddr_out[0]Return value
+
+ + +
+ +

8.15.16 lbox_get_items

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List box get items« - Return pointer to the first item. +
  +
Opcode: 174 (sub-opcode 6) +
  +
Syntax: LBOX_ITEM *lbox_get_items ( LIST_BOX *box ); +
  +
Description: The call lbox_get_items returns a pointer to the first item of +the list box. The following applies: +
  +

+
+ + + + + + + + +
ParameterMeaning
boxPointer to the list box structure
+
+ +
Return value: The function returns the pointer to the chained list. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: List boxes +
  +
See also: Binding   lbox_get_first   lbox_get_idx +
  + +
+ +

8.15.16.1 Bindings for lbox_get_items

+ + + + + + + + + +
C: LBOX_ITEM *lbox_get_items ( LIST_BOX *box ); +
  +
Binding: +
  +
LBOX_ITEM *lbox_get_items ( LIST_BOX *box )
+{
+   addr_in[0] = box;
+   int_in[0]  = 6;
+   crys_if (174);
+
+   return ( addr_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]174 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]1 # Entry in addr_out
addr_inaddr_in[0]box
int_inint_in[0]6 # Sub-opcode
addr_outaddr_out[0]Return value
+
+ + +
+ +

8.15.17 lbox_get_slct_idx

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List box get index of selected item« - Obtain index of the +first selected item. +
  +
Opcode: 174 (sub-opcode 5) +
  +
Syntax: int16_t lbox_get_slct_idx ( LIST_BOX *box ); +
  +
Description: The call lbox_get_slct_idx returns the index of the first +selected item of the list box. The following applies: +
  +

+
+ + + + + + + + +
ParameterMeaning
boxPointer to the list box structure
+
+ +
Return value: The function returns the index of the selected item. If no item +in the list is selected then -1 will be returned. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: List boxes +
  +
See also: Binding   lbox_get_slct_item +
  + +
+ +

8.15.17.1 Bindings for lbox_get_slct_idx

+ + + + + + + + + +
C: int16_t lbox_get_slct_idx ( LIST_BOX *box ); +
  +
Binding: +
  +
int16_t lbox_get_slct_idx ( LIST_BOX *box )
+{
+   addr_in[0] = box;
+   int_in[0]  = 5;
+   crys_if (174);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]174 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]box
int_inint_in[0]5 # Sub-opcode
int_outint_out[0]Return value
+
+ + +
+ +

8.15.18 lbox_get_slct_item

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List box get selected item« - Return pointer to first +selected item. +
  +
Opcode: 174 (sub-opcode 8) +
  +
Syntax: LBOX_ITEM *lbox_get_slct_item ( LIST_BOX *box ); +
  +
Description: The call lbox_get_slct_item obtains a pointer to the first +selected item of a list box. The following applies: +
  +

+
+ + + + + + + + +
ParameterMeaning
boxPointer to the list box structure
+
+ +
Return value: The function returns the pointer to the first selected item, or +NULL if none is selected. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: List boxes +
  +
See also: Binding   lbox_get_slct_idx +
  + +
+ +

8.15.18.1 Bindings for lbox_get_slct_item

+ + + + + + + + + +
C: LBOX_ITEM *lbox_get_slct_item ( LIST_BOX *box ); +
  +
Binding: +
  +
LBOX_ITEM *lbox_get_slct_item ( LIST_BOX *box )
+{
+   addr_in[0] = box;
+   int_in[0]  = 8;
+   crys_if (174);
+
+   return ( addr_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]174 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]1 # Entry in addr_out
addr_inaddr_in[0]box
int_inint_in[0]8 # Sub-opcode
addr_outaddr_out[0]Return value
+
+ + +
+ +

8.15.19 lbox_get_tree

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List box get tree« - Obtain object tree of the list box +dialog. +
  +
Opcode: 174 (sub-opcode 1) +
  +
Syntax: OBJECT *lbox_get_tree ( LIST_BOX *box ); +
  +
Description: The call lbox_get_tree obtains a pointer to the object tree of +the list box dialog. The following applies: +
  +

+
+ + + + + + + + +
ParameterMeaning
boxPointer to the list box structure
+
+ +
Return value: The function returns a pointer to the object tree of the list +box dialog. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: List boxes +
  +
See also: Binding   lbox_get_udata   lbox_get_first +
  + +
+ +

8.15.19.1 Bindings for lbox_get_tree

+ + + + + + + + + +
C: OBJECT *lbox_get_tree ( LIST_BOX *box ); +
  +
Binding: +
  +
OBJECT *lbox_get_tree ( LIST_BOX *box )
+{
+   addr_in[0] = box;
+   int_in[0]  = 1;
+   crys_if (174);
+
+   return ( addr_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]174 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]1 # Entry in addr_out
addr_inaddr_in[0]box
int_inint_in[0]1 # Sub-opcode
addr_outaddr_out[0]Return value
+
+ + +
+ +

8.15.20 lbox_get_udata

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List box get user data« - Get pointer to program-specific +data. +
  +
Opcode: 174 (sub-opcode 3) +
  +
Syntax: void *lbox_get_udata ( LIST_BOX *box ); +
  +
Description: The call lbox_get_udata obtains a pointer to the +program-specific data. The following applies: +
  +

+
+ + + + + + + + +
ParameterMeaning
boxPointer to the list box structure
+
+ +
Return value: The function returns the pointer <user_data>. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: List boxes +
  +
See also: Binding   lbox_get_tree   lbox_get_first +
  + +
+ +

8.15.20.1 Bindings for lbox_get_udata

+ + + + + + + + + +
C: void *lbox_get_udata ( LIST_BOX *box ); +
  +
Binding: +
  +
void *lbox_get_udata ( LIST_BOX *box )
+{
+   addr_in[0] = box;
+   int_in[0]  = 3;
+   crys_if (174);
+
+   return ( addr_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]174 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]1 # Entry in addr_out
addr_inaddr_in[0]box
int_inint_in[0]3 # Sub-opcode
addr_outaddr_out[0]Return value
+
+ + +
+ +

8.15.21 lbox_set_asldr

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List box set Slider A« - Set position of slider A of a list +box. +
  +
Opcode: 175 (sub-opcode 0) +
  +
Syntax: void lbox_set_asldr ( LIST_BOX *box, int16_t first, GRECT *rect +); +
  +
or +
  +
void lbox_set_slider ( LIST_BOX *box, int16_t first, GRECT *rect +); +
  +
Description: The call lbox_set_asldr positions the slider A of a list box. +The following apply: +
  +

+
+ + + + + + + + + + + + + + + + +
ParameterMeaning
boxPointer to the list box structure
firstIndex of the first visible entry
rectPointer to redraw rectangle, or 0L
+
+ +
Hint: The contents of the list box will not be updated, +so one may have to call lbox_update. If rect is 0L, then only +the position of the slider objects will be altered, but the objects +will not be drawn. +
  +
Return value: The function does not return a result. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: List boxes +
  +
See also: Binding   lbox_scroll_to +
  + +
+ +

8.15.21.1 Bindings for lbox_set_asldr

+ + + + + + + + + +
C: void lbox_set_asldr ( LIST_BOX *box, int16_t first, GRECT *rect +); +
  +
or +
  +
void lbox_set_slider ( ... ); +
  +
Binding: +
  +
void lbox_set_asldr ( LIST_BOX *box, int16_t first,
+                      GRECT *rect )
+
+(!I)or(!i)
+
+void lbox_set_slider ( ... )
+{
+   addr_in[0] = box;
+   addr_in[1] = rect;
+
+   int_in[0] = 0;
+   int_in[1] = first;
+   crys_if (175);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]175 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]box
addr_in+4addr_in[1]rect
int_inint_in[0]0 # Sub-opcode
int_in+2int_in[1]first
+
+ + +
+ +

8.15.22 lbox_set_bentries

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List box set number of entries, Slider B« - Set number of +entries for slider B. +
  +
Opcode: 175 (Sub-opcode 6) +
  +
Syntax: void lbox_set_bentries ( LIST_BOX *box, int16_t entries ); +
  +
Description: The call lbox_set_bentries sets the number of entries (or +subdivisions) for slider B of a list box. The following apply: +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
boxPointer to the list box structure
entriesNumber of items
+
+ +
Return value: The function does not return a result.k. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: List boxes +
  +
See also: Binding   lbox_free_items   lbox_cnt_items +
  + +
+ +

8.15.22.1 Bindings for lbox_set_bentries

+ + + + + + + + + +
C: void lbox_set_bentries ( LIST_BOX *box, int16_t entries ); +
  +
Binding: +
  +
void lbox_set_bentries ( LIST_BOX *box, int16_t entries )
+{
+   addr_in[0] = box;
+
+   int_in[0] = 6;
+   int_in[1] = entries;
+   crys_if (175);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]175 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]box
int_inint_in[0]6 # Sub-opcode
int_in+2int_in[1]entries
+
+ + +
+ +

8.15.23 lbox_set_bsldr

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List box set slider B« - Set position of slider B of a list +box. +
  +
Opcode: 175 (sub-opcode 5) +
  +
Syntax: void lbox_set_bsldr ( LIST_BOX *box, int16_t first, GRECT *rect +); +
  +
Description: The call lbox_set_bsldr positions the slider B of a list box. +The following apply: +
  +

+
+ + + + + + + + + + + + + + + + +
ParameterMeaning
boxPointer to the list box structure
firstIndex of the first visible entry
rectPointer to redraw rectangle, or 0L
+
+ +
Hint: This function draws the slider within the redraw +rectangle rect. The contents of the list box will not +be updated, so one may have to call lbox_update. If rect is +0L, then only the position of the slider objects will be altered, but +the objects will not be drawn. +
  +
Return value: The function does not return a result. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: List boxes +
  +
See also: Binding   lbox_free_items   lbox_cnt_items +
  + +
+ +

8.15.23.1 Bindings for lbox_set_bsldr

+ + + + + + + + + +
C: void lbox_set_bsldr ( LIST_BOX *box, int16_t first, GRECT *rect +); +
  +
Binding: +
  +
void lbox_set_bsldr ( LIST_BOX *box, int16_t first,
+                      GRECT *rect )
+{
+   addr_in[0] = box;
+   addr_in[1] = rect;
+
+   int_in[0] = 5;
+   int_in[1] = first;
+   crys_if (175);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]175 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]box
addr_in+4addr_in[1]rect
int_inint_in[0]5 # Sub-opcode
int_in+2int_in[1]first
+
+ + +
+ +

8.15.24 lbox_set_items

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List box set new item list« - Sets new items list for the +list box. +
  +
Opcode: 175 (sub-opcode 1) +
  +
Syntax: void lbox_set_items ( LIST_BOX *box, LBOX_ITEM *items ); +
  +
Description: The call lbox_set_items sets a new list with list box items. +The following apply: +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
boxPointer to the list box structure
itemsPointer to the new list of items, or NULL
+
+ +
Hint: The old list must first be freed with +lbox_free_items. The pointer items can also be 0L if the list +box is empty and contains no entries. +
  +
Return value: This function does not return a result. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: List boxes +
  +
See also: Binding   lbox_free_items   lbox_cnt_items +
  + +
+ +

8.15.24.1 Bindings for lbox_set_items

+ + + + + + + + + +
C: void lbox_set_items ( LIST_BOX *box, LBOX_ITEM *items ); +
  +
Binding: +
  +
void lbox_set_items ( LIST_BOX *box, LBOX_ITEM *items )
+{
+   addr_in[0] = box;
+   addr_in[1] = items;
+
+   int_in[0]  = 1;
+   crys_if (175);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]175 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]box
addr_in+4addr_in[1]items
int_inint_in[0]1 # Sub-opcode
+
+ + +
+ +

8.15.25 lbox_update

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »List box update« - Update contents of list box objects. +
  +
Opcode: 171 +
  +
Syntax: void lbox_update ( LIST_BOX *box, GRECT *rect ); +
  +
Description: The call lbox_update brings the contents of the list box +objects to the current state. The following apply: +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
boxPointer to the list box structure
rectPointer to the redraw GRECT, or 0L
+
+ +
Hint: The updating is sequentiat, i.e. the function +set (see above) is called for each of the objects. If +rect is not 0L it will be regarded as a pointer to a GRECT +that will be used for the redraw of the list box. Otherwise the +objects will only be updated but not drawn. +
  +
Return value: The function does not return a result. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: List boxes +
  +
See also: Binding   lbox_do   lbox_scroll_to +
  + +
+ +

8.15.25.1 Bindings for lbox_update

+ + + + + + + + + +
C: void lbox_update ( LIST_BOX *box, GRECT *rect ); +
  +
Binding: +
  +
void lbox_update ( LIST_BOX *box, GRECT *rect )
+{
+   addr_in[0] = box;
+   addr_in[1] = rect;
+
+   crys_if (171);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]171 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]box
addr_in+4addr_in[1]rect
+
+ + +
+ +

8.15.26 Calling procedure for modal dialogs

+ + + + + + + + + + + + + + + + + + +
wind_update() Lock screen +
lbox_create() Create list box +
form_center() Centre dialog +
form_dial() Buffer screen portion +
.   +
Loop: form_do() +
lbox_do() + +
+ +

End of loop, possibly. lbox_get_slct_item()... +

+ + + + + + + + + + + + +
.   +
form_dial() Send redraw message +
wind_update() Release screen +
lbox_delete() Release memory for list box + +
+ +

8.15.27 Flags for the behaviour of the list box

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Bit + + + +
State Description + +
+ +
  +
0 + + + + + + +
0 The box scrolls horizontally +
1 The box scrolls vertically + +
+ +
1 + + + + + + +
0 No automatic scrolling +
1 Scrolling takes place automatically as soon as the mouse cursor +is moved past the first or last item with the mouse button held down + +
+ +
2 + + + + + + +
0 The selection routine will be called only after the automatic +scrolling has finished, i.e. it will be called for the last selected +entry. +
1 With automatic scrolling the selection routine will be called +for each selected entry during scrolling + +
+ +
3 + + + + + + +
0 When moving the slider a frame will be moved (graf_slidebox), +the list box will only be updated after releasing the mouse button +
1 The slider is a real-time slider + +
+ +
4 + + + + + + +
0 Multiple selections within the list box are possible +
1 Only one item can be selected + +
+ +
5 + + + + + + +
0 Multiple selections possible without the [Shift] key +
1 Multiple selections only possible with the [Shift] key + +
+ +
6 + + + + + + +
0 On selection the status is always SELECTED +
1 On selection the status is always changed + +
+ +
7 + + + + + + +
0 The list box has only one slider +
1 The list box has two sliders + +
+ + +
+ + + + + + + + + +
#define LBOX_VERT     1   /* List box with vertical slider           */
+#define LBOX_AUTO     2   /* Auto-scrolling                          */
+#define LBOX_AUTOSLCT 4   /* Automatic display during auto-scrolling */
+#define LBOX_REAL     8   /* Real-time slider                        */
+#define LBOX_SNGL    16   /* Only one selectable entry               */
+#define LBOX_SHFT    32   /* Multiple selections with [Shift]        */
+#define LBOX_TOGGLE  64   /* On selection change status of an entry  */
+#define LBOX_2SLDRS 128   /* Support 2 sliders                       */
+
+

The flag LBOX_SNGL can also be combined with LBOX_SHFT or +LBOX_TOGGLE to permit deselection in a list box with only one +selectable entry. LBOX_SNGL + LBOX_SHFT means that the selected entry +can be deselected by a click with a pressed [Shift] key. LBOX_SNGL + +LBOX_TOGGLE causes a click to deselect a selected entry. +

+

See also: List boxes   lbox_create +

+
+ +Home +AESAES +Scrap libraryScrap library +MagiC libraryMagiC library + + diff --git a/en/linea_about.html b/en/linea_about.html new file mode 100644 index 000000000..55ad04199 --- /dev/null +++ b/en/linea_about.html @@ -0,0 +1,57 @@ + + + + + +The documentation for TOS: The Line-A emulator + + + + + + + + + +Home +Line-ALine-A +Line-ALine-A +LINEALINEA + +
+ +

6.1 The Line-A emulator

+

The Line-A emulator makes fast graphical routines available that +serve as the basis for the VDI functions. However, the Line-A +functions are only usable for the 3 ST screen resolutions. Since they +are not resolution-independent, they should not be used if an +application may run on other graphics systems! In the TT030 the Line-A +functions are present only for the sake of compatibility. +

+

One also talks about a Line-A emulator, as the processors of the +68k series do not have opcodes that start with $A or $F in the highest +nibble. An exception is triggered instead. Since the exception handler +can itself perform more or less sensible things, one can also look at +this procedure as a command extension, where the opcodes do not +execute directly in the processor, but represent a program instead. So +a machine command is emulated, so to speak. +

+

Parameter passing to the Line-A functions takes place in the +Line-A parameter block. The address of this structure can be obtained +with initialization $A000, which returns a pointer to an internal variable +table in d0 and a0 which is used in place of the stack or internal +registers. +

+

Callling a Line-A function alters the registers d0-d2 and a0-a2. +If further registers are altered, this is noted explicitly in the +description of the various functions. +

+
+ +Home +Line-ALine-A +Line-ALine-A +LINEALINEA + + diff --git a/en/linea_bitblt.html b/en/linea_bitblt.html new file mode 100644 index 000000000..9b1269a41 --- /dev/null +++ b/en/linea_bitblt.html @@ -0,0 +1,193 @@ + + + + + +The documentation for TOS: Bit block transfer + + + + + + + + + +Home +Line-ALine-A +Filled polygonFilled polygon +Text block transferText block transfer + +
+ +

6.12 Bit block transfer

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Bit block transfer« +
  +
Line-A number: $A007 +
  +
Syntax: See 'Bindings for bit_blt' +
  +
Description: This Line-A function copies between a rectangular source and +destination block. For this the source area can be combined with a +raster. Source and destination can be combined with one of 16 possible +logical operations. This function also serves as the basis for the +Line-A functions Text block transfer and Copy raster form. +
  +
For the parameters a structure of the type BITBLT has to be +filled and passed in register A6. +
  +
The following logical combinations are available: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OperationFunction
0D' = 0Destination is background colour
1D' = S & D
2D' = S &  D
3D' = S
4D' =  S & D
5D' = D
6D' = S ^ D
7D' = S | D
8D' =  (S | D)
9D' =  (S ^ D)
10D' =  D
11D' = S |  D
12D' =  S
13D' =  S | D
14D' =   (S & D)
15D' = 1Destination is foreground colour
+
+ +
D' is the destination after the combination, S and D are the +source and destination before the combination. & is the logical +AND combination, | is OR, ^ is the exclusive OR (XOR) combination, ! +is a NOT inversion. +
  +
Return value: The function does not have a return value. +
  +
Availability: All TOS versions. +
  +
See also: Binding   Text block transfer   Copy raster form +
  + +
+ +

6.12.1 Bindings for bit_blt

+ + + + + + +
Pure-C: void bit_blt(BITBLT *bitblt); +
  +
Assembler: +
  +
movem.l   D0-D2/A0-A2,-(A7)  ; Save registers
+move.l    bitblt,A6          ; Address BITBLT structure
+dc.w      $A007              ; Line-A opcode
+movem.l   (A7)+,D0-D2/A0-A2  ; Restore registers
+
+ +
+ +
+ +Home +Line-ALine-A +Filled polygonFilled polygon +Text block transferText block transfer + + diff --git a/en/linea_copyraster.html b/en/linea_copyraster.html new file mode 100644 index 000000000..7af476073 --- /dev/null +++ b/en/linea_copyraster.html @@ -0,0 +1,169 @@ + + + + + +The documentation for TOS: Copy raster form + + + + + + + + + +Home +Line-ALine-A +Draw spriteDraw sprite +SeedfillSeedfill + +
+ +

6.19 Copy raster form

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Copy raster form« +
  +
Line-A number: $A00E +
  +
Syntax: See 'Bindings for copy_raster' +
  +
Description: This Line-A function corresponds exactly to the VDI function +vro_cpyfm (Copy raster, Opaque). Merely some fields of the contrl +field are not set, as no VDI workstation needs to be open. +Therefore one should refer to the documentation of the VDI +function. The following Line-A variables are used: +
  + + + + + + + + + + + + + + + +
Variable Meaning +
    +
patptr Can contain a pointer to a pattern +
multifill 0 if the pattern has only one plane, and 1 for several planes +
copy_tran Set to 0 for opaque copying (source and destination have the +same number of colour planes) or to 1 for transparent copying +(destination is copied to one colour plane) + +
+ +
Note: The binding from Turbo C does not support this +function. +
  +
Return value: The function does not return a result. +
  +
Availability: All TOS versions. +
  +
See also: Binding   vro_cpyfm +
  + +
+ +

6.19.1 Bindings for copy_raster

+ + + + + + +
Pure-C: void copy_raster( void ); /* WARNING: NOT supported ! */ +
  +
Assembler: +
  +
; Save registers
+movem.l   D0-D2/A0-A2,-(A7)
+; Pointer parameter block LINEA
+move.l    pParamblk,A0
+; contrl to A1
+move.l    (4,A0),A1
+; Address source MFDB to D0
+move.l    s_mfdb,D0
+; Lower WORD source MFDB to contrl[8]
+move.w    D0,(8,A1)
+; Move upper WORD of D0 ...
+lsr.l     #8,D0
+; ... onto lower WORD
+lsr.l     #8,D0
+; Upper WORD source MFDB to contrl[7]
+move.w    D0,(7,A1)
+; Address destination MFDB to D0
+move.l    d_mfdb,D0
+; Lower WORD destination MFDB to contrl[10]
+move.w    D0,(10,A1)
+; Move upper WORD of D0 ...
+lsr.l     #8,D0
+; ... onto lower WORD
+lsr.l     #8,D0
+; Upper WORD destination MFDB to contrl[9]
+move.w    D0,(9,A1)
+; contrl in LINEA.contrl
+move.l    intin,(8,A0)
+; Save old value of the intin field
+move.l    (8,A0),-(A7)
+; intin in LINEA.intin
+move.l    intin,(8,A0)
+; Save old value of the ptsin field
+move.l    (12,A0),-(A7)
+; ptsin in LINEA.ptsin
+move.l    intin,(8,A0)
+; Line pattern in LINEA.patptr
+move.w    patptr,(44,A0)
+; Plane flag in LINEA.multifill
+move.w    multifill,(50,A0)
+; Copy mode in LINEA.copy_tran
+move.w    copy_tran,(116,A0)
+; Line-A opcode
+dc.w      $A00E
+; Pointer parameter block LINEA
+move.l    pParamblk,A0
+; Restore old value of the ptsin field
+move.l    (A7)+,(12,A0)
+; Restore old value of the intin field
+move.l    (A7)+,(8,A0)
+; Restore registers
+movem.l   (A7)+,D0-D2/A0-A2
+
+ +
+ +
+ +Home +Line-ALine-A +Draw spriteDraw sprite +SeedfillSeedfill + + diff --git a/en/linea_drawsprite.html b/en/linea_drawsprite.html new file mode 100644 index 000000000..a8b024ee8 --- /dev/null +++ b/en/linea_drawsprite.html @@ -0,0 +1,207 @@ + + + + + +The documentation for TOS: Draw sprite + + + + + + + + + +Home +Line-ALine-A +Undraw spriteUndraw sprite +Copy raster formCopy raster form + +
+ +

6.18 Draw sprite

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Draw sprite« +
  +
Line-A number: $A00D +
  +
Syntax: See 'Bindings for draw_sprite' +
  +
Description: This Line-A function draws a sprite on the screen. The +X-position is passed in D0, the Y-position in d1. A0 points to a +structure of the type SDB that describes the construction of the +sprite. A2 points to the sprite-save buffer which stores the saved +background and has to have a minimum size of 10 + 64 * number of +colour planes. The register A6 will be destroyed. +
  +
typedef struct
+{
+  int16_t xhot,       /* X-offset                   */
+          yhot,       /* Y-offset                   */
+          form,       /* Format (1 = VDI, -1 = XOR) */
+          bgcol,      /* Background colour          */
+          fgcol,      /* Foreground colour          */
+          image[32];  /* Sprite image               */
+} SDB;
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
Variable Meaning +
    +
xhot X-coordinate of the hot-spot of the sprite, as for Transform +mouse +
yhot Y-coordinate of the hot-spot of the sprite, as for Transform +mouse +
form 1 for the VDI format and -1 for the XOR format +
bgcol The colour of the background +
fgcol The colour of the foreground +
image The data for the foreground and the background of the 16*16 +pixel-sized sprite. The data is stored interleaved - first a WORD of +the background and then a WORD of the foreground. + +
+ +
The result on the screen depends on the format set in form and +can be gathered for each 1 bit from the foreground and background data +from the following table. Old is the existing image point, new the new +one after drawing the sprite: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Foregrnd.Backgrnd.VDI formatXOR format
00new = oldnew = old
01new = bgcolnew = bgcol
10new = fgcolnew = fgcol xor old
11new = fgcolnew = fgcol
+
+ +
Return value: The function does not return a result. +
  +
Availability: All TOS versions. +
  +
See also: Binding   Transform mouse   Undraw sprite +
  + +
+ +

6.18.1 Bindings for draw_sprite

+ + + + + + +
Pure-C: +
  +
typedef struct
+{
+  int16_t xhot,       /* X-offset                   */
+          yhot,       /* Y-offset                   */
+          form,       /* Format (1 = VDI, -1 = XOR) */
+          bgcol,      /* Background colour          */
+          fgcol,      /* Foreground colour          */
+          image[32];  /* Sprite image               */
+} SDB;
+
+typedef int16_T SSB[10 + 4 * 64];
+
+void draw_sprite( int16_t x, int16_t y, SDB *pSdb, SSB *pSsb );
+
+
Assembler: +
  +
; Save registers
+movem.l   D0-D2/A0-A2/A6,-(A7)
+; X-position to D0
+move.w    x,D0
+; Y-position to D1
+move.w    y,D1
+; Pointer sprite-definition block to A0
+move.l    pSdb,A0
+; Pointer sprite-save block to A2
+move.l    pSsb,A2
+; Line-A opcode
+dc.w      $A00D
+; Restore registers
+movem.l   (A7)+,D0-D2/A0-A2/A6
+
+ +
+ +
+ +Home +Line-ALine-A +Undraw spriteUndraw sprite +Copy raster formCopy raster form + + diff --git a/en/linea_escape.html b/en/linea_escape.html new file mode 100644 index 000000000..393087f9b --- /dev/null +++ b/en/linea_escape.html @@ -0,0 +1,130 @@ + + + + + +The documentation for TOS: The negative Line-A variables + + + + + + + + + +Home +Line-ALine-A +LINEALINEA +BITBLTBITBLT + +
+ +

6.3 The negative Line-A variables

+

In addition, by using negative offsets to the start address of +the Line-A variables one can read out the local variables of the +screen driver. The read access has been released officially by Atari +with the document "S.A.L.A.D."; however, the offsets are +specified wrongly in that. These variables can be described by the +following structure. The number in the comment section gives the +offset of the component to the start of the Line-A variables LINEA in +each case. +

+
typedef struct
+{
+  int32_t  reserved6;          /* -$38E: Reserved                     */
+  FONT_HDR *cur_font;          /* -$38A: Pointer->current font header */
+  int16_t  reserved5[23],      /* -$386: Reserved                     */
+           m_pos_hx,           /* -$358: X-coordinate mouse hot-spot  */
+           m_pos_hy,           /* -$356: Y-coordinate mouse hot-spot  */
+           m_planes,           /* -$354: Write mode for mouse pointer */
+                               /*        1=Replace, -1=XOR mode       */
+           m_cdb_bg,           /* -$352: Mouse pointer backgr. colour */
+           m_cdb_fg,           /* -$350: Mouse pointer foregr. colour */
+           mask_form[32],      /* -$34E: Mouse ptr. foregr. and mask  */
+                               /*        Alternately 1 WORD           */
+                               /*        foreground and mask          */
+           inq_tab[45],        /* -$30E: As vq_extnd                  */
+           dev_tab[45],        /* -$2B4: As v_opnwk                   */
+           gcurx,              /* -$25A: Curr. mouse pointer X-posn.  */
+           gcury,              /* -$258: Curr. mouse pointer Y-posn.  */
+           m_hid_ct,           /* -$256: Number of hide_mouse-calls   */
+           mouse_bt,           /* -$254: Current mouse button status  */
+           req_col[3][16],     /* -$252: Internal data for vq_color   */
+           siz_tab[15],        /* -$1F2: As v_opnwk                   */
+           reserved4[2];       /*        Reserved                     */
+  void     *cur_work;          /* -$1D0: Attributes current workstn.  */
+  FONT_HDR *def_font;          /* -$1CC: Standard system font         */
+  FONT_HDR *font_ring[4];      /* -$1C8: System and GDOS font lists   */
+                               /*        Chained FONT_HDR structures  */
+                               /*        0 as terminator ID           */
+  int16_t  font_count,         /* -$1B8: Total number of fonts        */
+           reserved3[45];      /*        Reserved                     */
+  int8_t   cur_ms_stat,        /* -$15C: Mouse status since last      */
+                               /*        Bit 0:    Left button (0=up) */
+                               /*        Bit 1:    Right button (0=up)*/
+                               /*        Bit 2..4: Reserved           */
+                               /*        Bit 5:    1=Mouse moved      */
+                               /*        Bit 6:    1=State of right   */
+                               /*                  button changed     */
+                               /*        Bit 7:    1=State of left    */
+                               /*                  button changed     */
+           reserved2;          /*        Reserved                     */
+  int16_t  v_hid_cnt,          /*        Number of Hide_cursor calls  */
+           cur_x,              /* -$158: X-position for mouse pointer */
+           cur_y;              /* -$156: Y-position for mouse pointer */
+  int8_t   cur_flag,           /* -$154: != 0: Redraw mouse ptr.in VBL*/
+           mouse_flag;         /* -$153: != 0: Mouse interrupt on     */
+  int32_t  reserved1;          /*        Reserved                     */
+  int16_t  v_sav_xy[2],        /* -$14E: X-Y coordinates saved by VT52*/
+           save_len;           /* -$14A: Number of screen lines       */
+  void     *save_addr;         /* -$148: First bufered byte in screen */
+                               /*        memory                       */
+  int16_t  save_stat;          /* -$144: Dirty flag                   */
+                               /*        Bit 0: 1=Buffer is valid     */
+                               /*        Bit 1: 1=Long, 0=Word bufferd*/
+  int32_t  save_area[4][16];   /* -$142: Buffer for image under mouse */
+  void    (*user_tim)( void ); /*  -$42: Timer interrupt vector       */
+                               /*        To terminate should jump to  */
+                               /*        next_tim                     */
+  void    (*next_tim)( void ); /*  -$3E: Old timer interrupt          */
+  void    (*user_but)( void ); /*  -$3A: Mouse button vector          */
+  void    (*user_cur)( void ); /*  -$36: Mouse rendering vector       */
+  void    (*user_mot)( void ); /*  -$32: Mouse movement vector        */
+  int16_t  v_cel_ht,           /*  -$2E: Current text cell height     */
+           v_cel_mx,           /*  -$2C: Maximum column for cursor    */
+           v_cel_my,           /*  -$2A: Maximum line for cursor      */
+           v_cel_wr,           /*  -$28: Bytes betwn. character cells */
+           v_col_bg,           /*  -$26: Text background colour       */
+           v_col_fg;           /*  -$24: Text foreground colour       */
+  void     *v_cur_ad;          /*  -$22: Address of cursor position   */
+  int16_t  v_cur_off,          /*  -$1E: Vertical screen offset       */
+           v_cur_xy[2];        /*  -$1C: X-Y position of text cursor  */
+  int8_t   v_period,           /*  -$18: Current cursor blink rate    */
+           v_cur_ct;           /*  -$17: Countdown timer for blink    */
+  void     *v_fnt_ad;          /*  -$16: Addr. of monospace font data */
+  int16_t  v_fnt_nd,           /*  -$12: Last ASCII code in font      */
+           v_fnt_st,           /*  -$10: First ASCII code in font     */
+           v_fnt_wd,           /*   -$E: Width of font form in bytes  */
+           v_rez_hz,           /*   -$C: Horizontal pixel resolution  */
+           *v_off_ad,          /*   -$A: Address of font offset table */
+           reserved,           /*   -$6: Cursorflag (TOS 1.00)/res.   */
+                               /*        Bit 0: Blink on/off          */
+                               /*        Bit 1: Blink status norm/inv.*/
+                               /*        Bit 2: Cursor visible no/yes */
+                               /*        Bit 3: Wrapping on/off       */
+                               /*        Bit 4: Inverse on/off        */
+                               /*        Bit 5: Cursorpos. saved n/y  */
+           v_rez_vt,           /*   -$4: Vertical pixel resolution    */
+           bytes_lin;          /*   -$2: Bytes per screen line        */
+} VDIESC;
+
+
+ +Home +Line-ALine-A +LINEALINEA +BITBLTBITBLT + + diff --git a/en/linea_fillpoly.html b/en/linea_fillpoly.html new file mode 100644 index 000000000..fdee5cd8d --- /dev/null +++ b/en/linea_fillpoly.html @@ -0,0 +1,244 @@ + + + + + +The documentation for TOS: Filled polygon + + + + + + + + + +Home +Line-ALine-A +Filled rectangleFilled rectangle +Bit block transferBit block transfer + +
+ +

6.11 Filled polygon

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Filled polygon« +
  +
Line-A number: $A006 +
  +
Syntax: See 'Bindings for filled_polygon' +
  +
Description: This Line-A function draws one line of a filled polygon through +calls of the horizontal line function. For drawing the whole polygon this +function must be called for any possible Y-coordinate. In addition, as +for filled rectangle, there is the option to permit drawing of the polygon only +within a passed clipping rectangle. +
  +
All vertices of the polygon are passed in the field ptsin, the +number of vertices is contained in the second element of the contrl +field. In C this means that contrl[1] will hold the number of +vertices, ptsin[0] the X-coordinate of the first vertex, ptsin[1] the +Y-coordinate of the first vertex, ptsin[2] the X-coordinate of the +second vertex, ... The last vertex in ptsin must be the first one +again, so that the polygon is closed! The Y-coordinate of the line to +be drawn is passed in the Line-A parameter block in y1. +
  +
The following Line-A variables are used: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Variable Meaning +
    +
y1 Y-coordinate of the line to be drawn +
fg_bp_1 Bit value of the first plane for the colour to be used for the +fill +
fg_bp_2 Bit value of the second plane (only low or medium resolution) +
fg_bp_3 Bit value of the third plane (only low resolution) +
fg_bp_4 Bit value of the fourth plane (only low resolution) +
patptr Pointer to a field with 16-bit line patterns +
patmsk Number of line patterns - 1. Depending on the Y-coordinate one +pattern will be selected now from the field of line patterns. The +index of the line pattern used can be calculated with (y mod (patmsk + +1)). By specifying several line patterns and using multiple calls of +this function for consecutive lines, it is easy to draw complex +patterns as well. +
wrt_mode Writing mode; the following modes are possible: + + + + + + + + + + + + +
REPLACE 0 Replace +
TRANS 1 Transparent (OR) +
XOR 2 Inverse (XOR) +
INVERS 3 Inverse Transparent (XOR with not(LN_MASK)) + +
+ +
clip 1 if clipping is desired, else 0 +
xmn_clip X-coordinate of the top left corner of the clipping region, if +clipping is switched on +
ymn_clip y-coordinate of the top left corner of the clipping region, if +clipping is switched on +
xmx_clip X-coordinate of the bottom right corner of the clipping region, +if clipping is switched on +
ymx_clip Y-coordinate of the bottom right corner of the clipping region, +if clipping is switched on + +
+ +
The binding from TC passes the line pattern, the writing mode and +colour not to the filled_polygon function, but uses separate functions +set_fg_bp, set_wrt_mode, set_pattern and set_clipping for setting the +parameters in the Line-A parameter block. +
  +
Return value: The function does not return a result. +
  +
Availability: All TOS versions. +
  +
See also: Binding   Horizontal line   Filled rectangle +
  + +
+ +

6.11.1 Bindings for filled_polygon

+ + + + + + +
Pure-C: void filled_polygon( int16_t *xy, int16_t count ); +
  +
Assembler: It is assumed that the contrl field has already been entered in +the Line-A parameter block. +
  +
; Save registers
+movem.l   D0-D2/A0-A2,-(A7)
+; Pointer parameter block LINEA
+move.l    pParamblk,A0
+; contrl to a1
+move.w    (4,A0),A1
+; No. or vertexes to contrl[1]
+move.w    count,(2,A1)
+; Save old value of the ptsin field
+move.l    (12,A0),-(A7)
+; Field with coordinates of vertexes in LINEA.ptsin
+move.l    xy,(12,A0)
+; Line to be drawn, Y-coordinate in LINEA.y1
+move.w    y1,(40,A0)
+; Bit for first plane in LINEA.fg_bp_1
+move.w    colbit0,(24,A0)
+; Bit for first plane in LINEA.fg_bp_2
+move.w    colbit1,(26,A0)
+; Bit for first plane in LINEA.fg_bp_3
+move.w    colbit2,(28,A0)
+; Bit for first plane in LINEA.fg_bp_4
+move.w    colbit3,(30,A0)
+; Writing mode in LINEA.wrt_mode
+move.w    wmode,(36,A0)
+; Line pattern in LINEA.patptr
+move.w    patptr,(46,A0)
+; No. of patterns in LINEA.patmsk
+move.w    patmsk,(50,A0)
+; Clipmode in LINEA.clip
+move.w    mode,(54,A0)
+; Top left clip corner, X-coordinate in LINEA.xmn_clip
+move.w    cx1,(56,A0)
+; Top left clip corner, Y-coordinate in LINEA.ymn_clip
+move.w    cy1,(58,A0)
+; Bottom right clip corner, X-coordinate in LINEA.xmx_clip
+move.w    cx2,(60,A0)
+; Bottom right clip corner, Y-coordinate in LINEA.ymx_clip
+move.w    cy2,(62,A0)
+; Line-A opcode
+dc.w      $A006
+; Pointer parameter block LINEA
+move.l    pParamblk,A0
+; Restore old value of the ptsin field
+move.l    (A7)+,(12,A0)
+; Restore registers
+movem.l   (A7)+,D0-D2/A0-A2
+
+ +
+ +
+ +Home +Line-ALine-A +Filled rectangleFilled rectangle +Bit block transferBit block transfer + + diff --git a/en/linea_fillrect.html b/en/linea_fillrect.html new file mode 100644 index 000000000..81f88c607 --- /dev/null +++ b/en/linea_fillrect.html @@ -0,0 +1,238 @@ + + + + + +The documentation for TOS: Filled rectangle + + + + + + + + + +Home +Line-ALine-A +Horizontal lineHorizontal line +Filled polygonFilled polygon + +
+ +

6.10 Filled rectangle

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Filled rectangle« +
  +
Line-A number: $A005 +
  +
Syntax: See 'Bindings for filled_rect' +
  +
Description: This Line-A function draws a filled rectangle through calls of +the horizontal line function. In addition there is the option to permit drawing +of the rectangle only within a passed clipping region. The following +Line-A variables are used: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Variable Meaning +
    +
x1 X-coordinate of the top left corner of the rectangle +
y1 Y-coordinate of the top left corner of the rectangle +
x2 X-coordinate of the bottom right corner of the rectangle +
y2 Y-coordinate of the bottom right corner of the rectangle +
fg_bp_1 Bit value of the first plane for the colour that should be used +for filling +
fg_bp_2 Bit value of the second plane (only low or medium resolution) +
fg_bp_3 Bit value of the third plane (only low resolution) +
fg_bp_4 Bit value of the fourth plane (only low resolution) +
patptr Pointer to a field with 16-bit line patterns +
patmsk Number of line patterns - 1. Depending on the Y-coordinate, one +pattern will now be chosen from the field of line patterns. The index +of the line pattern used may be calculated with (y mod (patmsk + 1)). +By specifying several line patterns and using multiple calls of this +function for consecutive lines, it is easy to draw complex patterns as +well. +
wrt_mode Writing mode; the following modes are possible: + + + + + + + + + + + + +
REPLACE 0 Replace +
TRANS 1 Transparent (OR) +
XOR 2 Inverse (XOR) +
INVERS 3 Inverse Transparent (XOR with not(LN_MASK)) + +
+ +
clip 1 if clipping is desired, else 0 +
xmn_clip X-coordinate of the top left corner of the clipping region, if +clipping is switched on +
ymn_clip Y-coordinate of the top left corner of the clipping region, if +clipping is switched on +
xmx_clip X-coordinate of the bottom right corner of the clipping region, +if clipping is switched on +
ymx_clip Y-coordinate of the bottom right corner of the clipping region, +if clipping is switched on + +
+ +
The binding from TC passes the line pattern, writing mode and colour +not to the filled_rect function, but uses separate functions +set_fg_bp, set_wrt_mode and set_pattern for setting the parameters in +the Line-A parameter block. +
  +
Return value: The function does not return a result. +
  +
Availability: All TOS versions. +
  +
See also: Binding   Horizontal line +
  + +
+ +

6.10.1 Bindings for filled_rect

+ + + + + + +
Pure-C: void filled_rect( int16_t x1, int16_t y1, int16_t x2, int16_t +y2 ); +
  +
Assembler: +
  +
; Save registers
+movem.l   D0-D2/A0-A2,-(A7)
+; Pointer parameter block LINEA
+move.l    pParamblk,A0
+; Top left corner, X-coordinate in LINEA.x1
+move.w    x1,(38,A0)
+; Top left corner, Y-coordinate in LINEA.y1
+move.w    y1,(40,A0)
+; Bottom right corner, X-coordinate in LINEA.x2
+move.w    x2,(42,A0)
+; Bottom right corner, Y-coordinate in LINEA.x2
+move.w    y2,(44,A0)
+; Bit for first plane in LINEA.fg_bp_1
+move.w    colbit0,(24,A0)
+; Bit for first plane in LINEA.fg_bp_2
+move.w    colbit1,(26,A0)
+; Bit for first plane in LINEA.fg_bp_3
+move.w    colbit2,(28,A0)
+; Bit for first plane in LINEA.fg_bp_4
+move.w    colbit3,(30,A0)
+; Writing mode in LINEA.wrt_mode
+move.w    wmode,(36,A0)
+; Line pattern in LINEA.patptr
+move.w    patptr,(46,A0)
+; Number of patterns in LINEA.patmsk
+move.w    patmsk,(50,A0)
+; Clip mode in LINEA.clip
+move.w    mode,(54,A0)
+; Top left clip corner, X-coordinate in LINEA.xmn_clip
+move.w    cx1,(56,A0)
+; Top left clip corner, Y-coordinate in LINEA.ymn_clip
+move.w    cy1,(58,A0)
+; Bottom right clip corner, X-coordinate in LINEA.xmx_clip
+move.w    cx2,(60,A0)
+; Bottom right clip corner, Y-coordinate in LINEA.ymx_clip
+move.w    cy2,(62,A0)
+; Line-A opcode
+dc.w      $A005
+; Restore registers
+movem.l   (A7)+,D0-D2/A0-A2
+
+ +
+ +
+ +Home +Line-ALine-A +Horizontal lineHorizontal line +Filled polygonFilled polygon + + diff --git a/en/linea_getpixel.html b/en/linea_getpixel.html new file mode 100644 index 000000000..7fce80abe --- /dev/null +++ b/en/linea_getpixel.html @@ -0,0 +1,95 @@ + + + + + +The documentation for TOS: Get pixel + + + + + + + + + +Home +Line-ALine-A +Put pixelPut pixel +Arbitrary lineArbitrary line + +
+ +

6.7 Get pixel

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Get pixel« +
  +
Line-A number: $A002 +
  +
Syntax: See 'Bindings for get_pixel' +
  +
Description: This Line-A function obtains the colour register at the +specified coordinates. +
  +
Return value: The function returns in d0 the colour register at the specified +coordinates. +
  +
Availability: All TOS versions. +
  +
See also: Binding   LINEA   Put Pixel +
  + +
+ +

6.7.1 Bindings for get_pixel

+ + + + + + +
Pure-C: int16_t get_pixel( int x, int y ); +
  +
Assembler: +
  +
movem.l   D0-D2/A0-A2,-(A7)  ; Save registers
+move.l    pParamblk,A0       ; Pointer parameter block LINEA
+move.l    (12,A0),A1         ; Address of ptsin
+move.w    x,(A1)             ; X-coordinate in ptsin[0]
+move.w    y,(2,A1)           ; Y-coordinate in ptsin[1]
+dc.w      $A002              ; Line-A opcode
+move.w    D0,color           ; d0 contains colour
+movem.l   (A7)+,D0-D2/A0-A2  ; Restore registers
+
+ +
+ +
+ +Home +Line-ALine-A +Put pixelPut pixel +Arbitrary lineArbitrary line + + diff --git a/en/linea_hidemouse.html b/en/linea_hidemouse.html new file mode 100644 index 000000000..97896d2ae --- /dev/null +++ b/en/linea_hidemouse.html @@ -0,0 +1,88 @@ + + + + + +The documentation for TOS: Hide mouse + + + + + + + + + +Home +Line-ALine-A +Show mouseShow mouse +Transform mouseTransform mouse + +
+ +

6.15 Hide mouse

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Hide mouse« +
  +
Line-A number: $A00A +
  +
Syntax: See 'Bindings for hide_mouse' +
  +
Description: This Line-A function switches off the mouse pointer. +
  +
Return value: The function does not return a result. +
  +
Availability: All TOS versions. +
  +
See also: Binding   Show mouse +
  + +
+ +

6.15.1 Bindings for hide_mouse

+ + + + + + +
Pure-C: void hide_mouse( void ); +
  +
Assembler: +
  +
movem.l   D0-D2/A0-A2,-(A7)  ; Save registers
+dc.w      $A00A              ; Line-A opcode
+movem.l   (A7)+,D0-D2/A0-A2  ; Restore registers
+
+ +
+ +
+ +Home +Line-ALine-A +Show mouseShow mouse +Transform mouseTransform mouse + + diff --git a/en/linea_hline.html b/en/linea_hline.html new file mode 100644 index 000000000..3eab92727 --- /dev/null +++ b/en/linea_hline.html @@ -0,0 +1,205 @@ + + + + + +The documentation for TOS: Horizontal line + + + + + + + + + +Home +Line-ALine-A +Arbitrary lineArbitrary line +Filled rectangleFilled rectangle + +
+ +

6.9 Horizontal line

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Horizontal line« +
  +
Line-A number: $A004 +
  +
Syntax: See 'Bindings for horizontal_line' +
  +
Description: This Line-A function draws a horizontal line. The following +Line-A variables are used: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Variable Meaning +
    +
x1 X-coordinate of the first end-point +
y1 Y-coordinate of the line +
x2 X-coordinate of the second end-point +
fg_bp_1 Bit value of the first plane for the colour that should be used +for filling +
fg_bp_2 Bit value of the second plane (only low or medium resolution) +
fg_bp_3 Bit value of the third plane (only low resolution) +
fg_bp_4 Bit value of the fourth plane (only low resolution) +
patptr Pointer to a field with 16-bit line patterns +
patmsk Number of line patterns - 1. Depending on the Y-coordinate, one +pattern will now be chosen from the field of line patterns. The index +of the line pattern used may be calculated with (y mod (patmsk + 1)). +By specifying several line patterns and using multiple calls of this +function for consecutive lines, it is easy to draw complex patterns as +well. +
wrt_mode Writing mode; the following modes are possible: + + + + + + + + + + + + +
REPLACE 0 Replace +
TRANS 1 Transparent (OR) +
XOR 2 Inverse (XOR) +
INVERS 3 Inverse Transparent (XOR with not(LN_MASK)) + +
+ +
multifill 0 specifies that only the first colour plane is to be drawn, a +value >0 that all colour planes are to be drawn + +
+ +
Note: This function is used internally for the area fill +routines. +
  +
The binding from TC passes the line pattern, writing mode and colour +not to the horizontal_line function, but uses separate functions +set_fg_bp, set_wrt_mode and set_pattern for setting the parameters in +the Line-A parameter block. +
  +
Return value: The function does not return a result. +
  +
Availability: All TOS versions. +
  +
See also: Binding   LINEA   Filled rectangle +
  + +
+ +

6.9.1 Bindings for horizontal_line

+ + + + + + +
Pure-C: void horizontal_line( int16_t x1, int16_t y1, int16_t x2 ); +
  +
Assembler: +
  +
; Save registers
+movem.l   D0-D2/A0-A2,-(A7)
+; Pointer parameter block LINEA
+move.l    pParamblk,A0
+; First X-coordinate in LINEA.x1
+move.w    x1,(38,A0)
+; First Y-coordinate in LINEA.y1
+move.w    y1,(40,A0)
+; Second X-coordinate in LINEA.x2
+move.w    x2,(42,A0)
+; Bit for first plane in LINEA.fg_bp_1
+move.w    colbit0,(24,A0)
+; Bit for first plane in LINEA.fg_bp_2
+move.w    colbit1,(26,A0)
+; Bit for first plane in LINEA.fg_bp_3
+move.w    colbit2,(28,A0)
+; Bit for first plane in LINEA.fg_bp_4
+move.w    colbit3,(30,A0)
+; Writing mode in LINEA.wrt_mode
+move.w    wmode,(36,A0)
+; Line pattern in LINEA.patptr
+move.w    patptr,(46,A0)
+; Number patterns in LINEA.patmsk
+move.w    patmsk,(50,A0)
+; Writing mode in LINEA.multifill
+move.w    mfill,(52,A0)
+; Line-A opcode
+dc.w      $A004
+; Restore registers
+movem.l   (A7)+,D0-D2/A0-A2
+
+ +
+ +
+ +Home +Line-ALine-A +Arbitrary lineArbitrary line +Filled rectangleFilled rectangle + + diff --git a/en/linea_init.html b/en/linea_init.html new file mode 100644 index 000000000..747cb3d5b --- /dev/null +++ b/en/linea_init.html @@ -0,0 +1,105 @@ + + + + + +The documentation for TOS: Initialization + + + + + + + + + +Home +Line-ALine-A +BITBLTBITBLT +Put pixelPut pixel + +
+ +

6.5 Initialization

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Line-A initialization« +
  +
Line-A number: $A000 +
  +
Syntax: See 'Bindings for linea_init' +
  +
Description: This Line-A function serves to inquire the address of the +Line-A parameter block. +
  +
Return value: The function returns in d0 and a0 a pointer to the parameter +block. In a1 a pointer to a field with 3 addresses of the system fonts +will be returned, and in a2 a pointer to the start addresses of the +Line-A routines. +
  +
Note: Some bindings, as that from TC, for instance, do +not return the addresses to the caller, but set the parameters for the +call of the Line-A functions themselves internally. +
  +
Availability: All TOS versions. +
  +
See also: Binding   LINEA +
  + +
+ +

6.5.1 Bindings for linea_init

+ + + + + + +
Pure-C: void linea_init( void ); +
  +
Assembler: +
  +
; Save registers
+movem.l   D0-D2/A0-A2,-(A7)
+; Line-A opcode
+dc.w      $A000
+; Pointer parameter block LINEA
+move.l    A0,pParamblk
+; Pointer system fonts
+move.l    A1,pFnthdr
+; Pointer start addr. Line-A routines
+move.l    a2,pFktadr
+; Restore registers
+movem.l   (a7)+,d0-d2/a0-a2
+
+ +
+ +
+ +Home +Line-ALine-A +BITBLTBITBLT +Put pixelPut pixel + + diff --git a/en/linea_line.html b/en/linea_line.html new file mode 100644 index 000000000..30cd5aade --- /dev/null +++ b/en/linea_line.html @@ -0,0 +1,204 @@ + + + + + +The documentation for TOS: Arbitrary line + + + + + + + + + +Home +Line-ALine-A +Get pixelGet pixel +Horizontal lineHorizontal line + +
+ +

6.8 Arbitrary line

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Arbitrary line« +
  +
Line-A number: $A003 +
  +
Syntax: See 'Bindings for draw_line' +
  +
Description: This Line-A function draws a straight line from top left to +bottom right. The following Line-A variables are used: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Variable Meaning +
    +
x1 X-coordinate of the first end-point +
y1 Y-coordinate of the first end-point +
x2 X-coordinate of the second end-point +
y2 Y-coordinate of the second end-point +
fg_bp_1 Bit value of the first plane for the colour that should be used +for filling +
fg_bp_2 Bit value of the second plane (only low or medium resolution) +
fg_bp_3 Bit value of the third plane (only low resolution) +
fg_bp_4 Bit value of the fourth plane (only low resolution) +
ln_mask Bit pattern for the line type; the bit pattern is to be +interpreted as a dot pattern +
wrt_mode Writing mode; the following modes are possible: + + + + + + + + + + + + +
REPLACE 0 Replace +
TRANS 1 Transparent (OR) +
XOR 2 Inverse (XOR) +
INVERS 3 Inverse Transparent (XOR with not(LN_MASK)) + +
+ +
lstlin Is the last pixel of the line to be drawn (1) or not (0) + +
+ +
Note: Independent of the order of the coordinates, the +line is drawn always from top left to bottom right. +
  +
For a horizontal line there is a faster function $A004 +Horizontal line available. +
  +
The bindings of TC passes the line mask, writing mode and colour not +to the draw_line function, but uses separate functions set_fg_bp, +set_ln_mask and set_wrt_mode for setting the parameters in the Line-A +parameter block. +
  +
Return value: The function does not return a result. The field ln_mask of the +Line-A parameter block is shifted by the output algorithm. +
  +
Availability: All TOS versions. +
  +
See also: Binding   LINEA   Horizontal line +
  + +
+ +

6.8.1 Bindings for draw_line

+ + + + + + +
Pure-C: void draw_line(int16_t x1, int16_t y1, int16_t x2, int16_t y2); +
  +
Assembler: +
  +
; Save registers
+movem.l   D0-D2/A0-A2,-(A7)
+; Pointer parameter block LINEA
+move.l    pParamblk,A0
+; First X-coordinate in LINEA.x1
+move.w    x1,(38,A0)
+; First Y-coordinate in LINEA.y1
+move.w    y1,(40,A0)
+; Second X-coordinate in LINEA.x2
+move.w    x2,(42,A0)
+; Second Y-coordinate in LINEA.y2
+move.w    y2,(44,A0)
+; Bit for first plane in LINEA.fg_bp_1
+move.w    colbit0,(24,A0)
+; Bit for first plane in LINEA.fg_bp_2
+move.w    colbit1,(26,A0)
+; Bit for first plane in LINEA.fg_bp_3
+move.w    colbit2,(28,A0)
+; Bit for first plane in LINEA.fg_bp_4
+move.w    colbit3,(30,A0)
+; Line style in LINEA.ln_mask
+move.w    lnmask,(34,A0)
+; Writing mode in LINEA.wrt_mode
+move.w    wmode,(36,A0)
+; Line style in LINEA.lstlin
+move.w    lstlin,(32,A0)
+; Line-A opcode
+dc.w      $A003
+; Restore registers
+movem.l   (A7)+,D0-D2/A0-A2
+
+ +
+ +
+ +Home +Line-ALine-A +Get pixelGet pixel +Horizontal lineHorizontal line + + diff --git a/en/linea_main.html b/en/linea_main.html new file mode 100644 index 000000000..03e0666ab --- /dev/null +++ b/en/linea_main.html @@ -0,0 +1,56 @@ + + + + + +The documentation for TOS: Line-A + + + + + + + + + +Home +Contents +GEMDOS structuresGEMDOS structures +The Line-A emulatorThe Line-A emulator + +
+ +

6 Line-A

+ +
+
+ +Home +Contents +GEMDOS structuresGEMDOS structures +The Line-A emulatorThe Line-A emulator + + diff --git a/en/linea_putpixel.html b/en/linea_putpixel.html new file mode 100644 index 000000000..43a49610b --- /dev/null +++ b/en/linea_putpixel.html @@ -0,0 +1,95 @@ + + + + + +The documentation for TOS: Put pixel + + + + + + + + + +Home +Line-ALine-A +InitializationInitialization +Get pixelGet pixel + +
+ +

6.6 Put pixel

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Put pixel« +
  +
Line-A number: $A001 +
  +
Syntax: See 'Bindings for put_pixel' +
  +
Description: This Line-A function sets one pixel in the specified colour at +the specified coordinates. +
  +
Return value: The function does not return a result. +
  +
Availability: All TOS versions. +
  +
See also: Binding   LINEA   Get Pixel +
  + +
+ +

6.6.1 Bindings for put_pixel

+ + + + + + +
Pure-C: void put_pixel( int16_t x, int16_t y, int16_t color ); +
  +
Assembler: +
  +
movem.l   D0-D2/A0-A2,-(A7)  ; Save registers
+move.l    pParamblk,A0       ; Pointer parameter block LINEA
+move.l    (8,A0),A1          ; Address of intin
+move.w    color,(A1)         ; Colour in intin[0]
+move.l    (12,A0),A1         ; Address of ptsin
+move.w    x,(A1)             ; X-coordinate in ptsin[0]
+move.w    y,(2,A1)           ; Y-coordinate in ptsin[1]
+dc.w      $A001              ; Line-A opcode
+movem.l   (A7)+,D0-D2/A0-A2  ; Restore registers
+
+ +
+ +
+ +Home +Line-ALine-A +InitializationInitialization +Get pixelGet pixel + + diff --git a/en/linea_seedfill.html b/en/linea_seedfill.html new file mode 100644 index 000000000..572dbf069 --- /dev/null +++ b/en/linea_seedfill.html @@ -0,0 +1,217 @@ + + + + + +The documentation for TOS: Seedfill + + + + + + + + + +Home +Line-ALine-A +Copy raster formCopy raster form +VDIVDI + +
+ +

6.20 Seedfill

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Seedfill« +
  +
Line-A number: $A00F +
  +
Syntax: See 'Bindings for seed_fill' +
  +
Description: This Line-A function fills an area with a colour, and so +corresponds to the VDI function v_contourfill. +
  +
Passed in the first word of ptsin (ptsin[0] in C) is the +X-coordinate and in the second word of ptsin (ptsin[1] in C) the +Y-coordinate of the start point. Into the first word of intin +(intin[0] in C) the mode word is written. If the mode word is greater +than 0, it specifies the colour of the surround border up to which +filling is to take place. If the mode word is smaller than 0, the +surround border consists of all pixels that do not have the colour of +the start point. +
  +
The following Line-A variables are used: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Variable Meaning +
    +
fill_abort This is the address of a function that is called at the end of +each line. If this function returns the value 0 in d0, then the +filling will be continued, else it will be broken off. +
patptr Pointer to a field with 16-bit line patterns +
patmsk Number of line patterns - 1. Depending on the y-coordinate one +pattern will be selected now from the field of line patterns. The +index of the line pattern used can be calculated with (y mod (patmsk + +1)). By specifying several line patterns and using multiple calls of +this function for consecutive lines, it is easy to draw complex +patterns as well. +
multifill 0 when the pattern has only one plane, and 1 for several planes +
wrt_mode Writing mode; the following modes are possible: + + + + + + + + + + + + +
REPLACE 0 Replace +
TRANS 1 Transparent (OR) +
XOR 2 Inverse (XOR) +
INVERS 3 Inverse Transparent (XOR with not(LN_MASK)) + +
+ +
clip 1 if clipping is desired, else 0 +
xmn_clip X-coordinate of the top left corner of the clipping region, if +clipping is switched on +
ymn_clip Y-coordinate of the top left corner of the clipping region, if +clipping is switched on +
xmx_clip X-coordinate of the bottom right corner of the clipping region, +if clipping is switched on +
ymx_clip Y-coordinate of the bottom right corner of the clipping region, +if clipping is switched on + +
+ +
Return value: The function does not return a result. +
  +
Availability: All TOS versions. +
  +
See also: Binding   v_contourfill +
  + +
+ +

6.20.1 Bindings for seed_fill

+ + + + + + +
Pure-C: void seed_fill( void ); /* WARNING: NOT supported ! */ +
  +
Assembler: It is assumed that the intin and ptsin fields have already been +entered in the Line-A parameter block. +
  +
; Save registers
+movem.l   D0-D2/A0-A2,-(A7)
+; Pointer parameter block LINEA
+move.l    pParamblk,A0
+; Address intin to A1
+move.l    (8,A0),A1
+; Mode word to intin[0]
+move.w    mode_wort,(A1)
+; Address ptsin to A1
+move.l    (12,A0),A1
+; X-coordinate to ptsin[0]
+move.w    x,(A1)
+; Y-coordinate to ptsin[1]
+move.w    y,(2,A1)
+; Writing mode in LINEA.wrt_mode
+move.w    wmode,(36,A0)
+; Line pattern in LINEA.patptr
+move.w    patptr,(44,A0)
+; Number of patterns in LINEA.patmsk
+move.w    patmsk,(48,A0)
+; Plane flag in LINEA.multifill
+move.w    multifill,(50,A0)
+; Clip mode in LINEA.clip
+move.w    mode,(54,A0)
+; Top left clip corner, X-coordinate in LINEA.xmn_clip
+move.w    cx1,(56,A0)
+; Top left clip corner, Y-coordinate in LINEA.ymn_clip
+move.w    cy1,(58,A0)
+; Bottom right clip corner, X-coordinate in LINEA.xmx_clip
+move.w    cx2,(60,A0)
+; Bottom right clip corner, Y-coordinate in LINEA.ymx_clip
+move.w    cy2,(62,A0)
+; Abort function to LINEA.fill_abort
+move.l    fill_abort,(118,A0)
+; Line-A opcode
+dc.w      $A00F
+; Restore registers
+movem.l   (A7)+,D0-D2/A0-A2
+
+ +
+ +
+ +Home +Line-ALine-A +Copy raster formCopy raster form +VDIVDI + + diff --git a/en/linea_showmouse.html b/en/linea_showmouse.html new file mode 100644 index 000000000..4245b191a --- /dev/null +++ b/en/linea_showmouse.html @@ -0,0 +1,96 @@ + + + + + +The documentation for TOS: Show mouse + + + + + + + + + +Home +Line-ALine-A +Text block transferText block transfer +Hide mouseHide mouse + +
+ +

6.14 Show mouse

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Show mouse« +
  +
Line-A number: $A009 +
  +
Syntax: See 'Bindings for show_mouse' +
  +
Description: This Line-A function switches on the mouse pointer again. If +the first value of the intin field is set to 0, then the mouse pointer +will be switched on at once. If the value is non-0, the function works +as in normal mode; in that case Show mouse has to be called as often +as Hide mouse was called to make the mouse pointer visible again. +
  +
Return value: The function does not return a result. +
  +
Availability: All TOS versions. +
  +
See also: Binding   Hide mouse +
  + +
+ +

6.14.1 Bindings for show_mouse

+ + + + + + +
Pure-C: void show_mouse( int16_t flag ); +
  +
Assembler: It is assumed that the intin field has already been entered in +the Line-A parameter block. +
  +
movem.l   D0-D2/A0-A2,-(A7)  ; Save registers
+move.l    pParamblk,A0       ; Pointer parameter block LINEA
+move.w    (8,A0),A1          ; intin to A1
+move.w    flag,(A1)          ; Flag to intin[0]
+dc.w      $A009              ; Line-A opcode
+movem.l   (A7)+,D0-D2/A0-A2  ; Restore registers
+
+ +
+ +
+ +Home +Line-ALine-A +Text block transferText block transfer +Hide mouseHide mouse + + diff --git a/en/linea_structures.html b/en/linea_structures.html new file mode 100644 index 000000000..5f2d2fb3f --- /dev/null +++ b/en/linea_structures.html @@ -0,0 +1,62 @@ + + + + + +The documentation for TOS: BITBLT + + + + + + + + + +Home +Line-ALine-A +The negative Line-A variablesThe negative Line-A variables +InitializationInitialization + +
+ +

6.4 BITBLT

+

The parameters for the bit-block transfer function are passed in +the following structure: +

+
typedef struct
+{
+  int16_t  b_wd,         /* Width of the block in pixels    */
+           b_ht,         /* Height of the block in pixels   */
+           plane_ct,     /* Number of colour planes to blit */
+           fg_col,       /* Foreground colour               */
+           bg_col;       /* Background colour               */
+  int8_t   op_tab[4];    /* Combination (for each plane)    */
+  int16_t  s_xmin,       /* X offset to source top left     */
+           s_ymin;       /* Y offset to source top left     */
+  void    *s_form;       /* Address of the source form      */
+  int16_t  s_nxwd,       /* Offset to next word             */
+           s_nxln,       /* Byte width of form              */
+           s_nxpl,       /* Byte offset between planes      */
+           d_xmin,       /* X offset to destination top L   */
+           d_ymin;       /* Y offset to destination top L   */
+  void    *d_form;       /* Address of the destination form */
+  int16_t  d_nxwd,       /* Offset to next word             */
+           d_nxln,       /* Byte width of form              */
+           d_nxpl;       /* Byte offset to next plane       */
+  void    *p_addr;       /* 16-bit masks for ANDing         */
+  int16_t  p_nxln,       /* Width of the mask in bytes      */
+           p_nxpl,       /* Byte offset to next plane       */
+           p_mask;       /* Height of mask in lines         */
+  int8_t   filler[24];   /* Internal buffer                 */
+} BITBLT;
+
+
+ +Home +Line-ALine-A +The negative Line-A variablesThe negative Line-A variables +InitializationInitialization + + diff --git a/en/linea_textblt.html b/en/linea_textblt.html new file mode 100644 index 000000000..3d3c8087e --- /dev/null +++ b/en/linea_textblt.html @@ -0,0 +1,361 @@ + + + + + +The documentation for TOS: Text block transfer + + + + + + + + + +Home +Line-ALine-A +Bit block transferBit block transfer +Show mouseShow mouse + +
+ +

6.13 Text block transfer

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Text block transfer« +
  +
Line-A number: $A008 +
  +
Syntax: Bindings für text_blt +
  +
Description: This Line-A function outputs a single character. The source for +the character must have the same buildup as in a GDOS raster font. One +can can regard the font data as a large image, whose height +corresponds to the character height. All characters lie close to each +other in this "image". Additionally a GDOS font contains an +offset table, containing the offset for each character in this large +image. The parameter ade_lo of the font header contains the first +ASCII character for which an image and thus also an offset is present. +This offset is to be passed together with the font data to this Line-A +function. The Y-offset is usually 0. As Line-A does not manage the +fonts itself and also does not know the font header, corresponding +parameters for the font data have to be passed. To this must be added +a string of other parameters for various effects such as italic..., +for instance. The following Line-A variables are used: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Variable Meaning +
    +
wrt_mode Writing mode, the following are possible: + + + + + + + + + + + + +
REPLACE 0 Replace +
TRANS 1 Transparent (OR) +
XOR 2 Inverse (XOR) +
INVERS 3 Inverse Transparent (XOR with not(LN_MASK)) + +
+ +
xacc_dda Should be set at each call to $8000 +
dda_inc Scaling factor +
t_sclsts Scaling direction, i.e. whether one is enlarging or reducing +
mono_status 1 if all characters have the same width, i.e. we are dealing +with a non-proprtional font, else 0 +
sourcex X-coordinate of the character in font to be output; can be +obtained from the offset table +
sourcey Y-coordinate of the character in the font, normally 0 +
destx X-coordinate of the screen position at which the character is +to be output +
desty Y-coordinate of the screen position at which the character is +to be output +
delx Width of the character, can also be obtained from the font +header +
dely Height of the character, can also be obtained from the font +header +
fbase The pointer to the font data, i.e. the image of the glyph +
fwidth Width of the font image +
style Specifies the text effects; individual bits represent +individual effects and may be combined: + + + + + + + + + + + + + + + +
Bit 0 Bold +
Bit 1 Light +
Bit 2 Skewed ("italics") +
Bit 3 Underlined (is ignored) +
Bit 4 Outlined + +
+ +
litemask A mask for light +
skewmask A mask for skewed +
weight The width for bold +
r_off The right offset for skewed, so more or less a parameter for +the "slope" of the character +
l_off The left offset for skewed, so more or less a parameter for the +"slope" of the character +
scale 1, if scaling is desired +
chup Rotation angle in 1/10 degree; however, only rotation of +multiples of 90 degrees are possible, i.e. values 0, 900, 1800, 2700 +
text_fg Text colour +
text_bg Background colour +
scrtchp A buffer that should offer twice as much space as occupied by +the character, so that Line-A can calculate the text effects +
scrpt2 An index into the buffer that points to the centre of the +buffer, i.e. specifies half of the bufer size +
clip 1 if clipping is desired, else 0 +
xmn_clip X-coordinate of the top left corner of the clipping region, if +clipping is switched on +
ymn_clip Y-coordinate of the top left corner of the clipping region, if +clipping is switched on +
xmx_clip X-coordinate of the bottom right corner of the clipping region, +if clipping is switched on +
ymx_clip Y-coordinate of the bottom right corner of the clipping region, +if clipping is switched on + +
+ +
The binding from TC passes a pointer to the font header, flags +for scaling, style, rotation vector, foreground and background colour +not to the text_blt function, but uses the separate function +set_text_blt for setting the parameters in the Line-A parameter block. +Data about the font are set automatically. +
  +
Return value: The function does not return a result. +
  +
Availability: All TOS versions. +
  +
See also: Binding   Bit block transfer +
  + +
+ +

6.13.1 Bindings for text_blt

+ + + + + + +
Pure-C: void text_blt( int16_t x, int16_t y, uint8_t c ); +
  +
Assembler: +
  +
; Save registers
+movem.l   D0-D2/A0-A2,-(A7)
+; Pointer parameter block LINEA
+move.l    pParamblk,A0
+; Writing mode in LINEA.wrt_mode
+move.w    wmode,(36,A0)
+; Clip mode in LINEA.clip
+move.w    mode,(54,A0)
+; Top left clip corner, X-coordinate in LINEA.xmn_clip
+move.w    cx1,(56,A0)
+; Top left clip corner, Y-coordinate in LINEA.ymn_clip
+move.w    cy1,(58,A0)
+; Bottom right clip corner, X-coordinate in LINEA.xmx_clip
+move.w    cx2,(60,A0)
+; Bottom right clip corner, Y-coordinate in LINEA.ymx_clip
+move.w    cy2,(62,A0)
+; Put $8000 in xacc_dda
+move.w    #$8000,(64,A0)
+; Scaling factor in LINEA.dda_inc
+move.w    dda_inc,(66,A0)
+; Scaling direction in LINEA.t_sclsts
+move.w    t_sclsts,(68,A0)
+; Proportional font in LINEA.mono_status
+move.w    mono_status,(70,A0)
+; X-coordinate in font in LINEA.sourcex
+move.w    sourcex,(72,A0)
+; Y-coordinate in font in LINEA.sourcey
+move.w    sourcey,(74,A0)
+; X-destination coordinate LINEA.destx
+move.w    destx,(76,A0)
+; Y-destination coordinate in LINEA.desty
+move.w    desty,(78,A0)
+; Width of the character in LINEA.delx
+move.w    delx,(80,A0)
+; Height of the character LINEA.dely
+move.w    dely,(82,A0)
+; Start of font data in LINEA.fbase
+move.l    fbase,(84,A0)
+; Width of the font image in LINEA.fwidth
+move.w    fwidth,(88,A0)
+; Write style in LINEA.style
+move.w    style,(90,A0)
+; Mask for light in LINEA.litemask
+move.w    litemask,(92,A0)
+; Mask for skewed in LINEA.skewmask
+move.w    skewmask,(94,A0)
+; Width for bold in LINEA.weight
+move.w    weight,(96,A0)
+; Skewed offset right in LINEA.r_off
+move.w    r_off,(98,A0)
+; Skewed offset left in LINEA.l_off
+move.w    l_off,(100,A0)
+; VScaling yes/no in LINEA.scale
+move.w    scale,(102,A0)
+; Rotation angle in LINEA.chup
+move.w    chup,(104,A0)
+; Text color LINEA.text_fg
+move.w    text_fg,(106,A0)
+; Buffer in LINEA.scrtchp
+move.l    scrtchp,(108,A0)
+; Index to mid-buffer in LINEA.scrpt2
+move.w    scrpt2,(112,A0)
+; Background color in LINEA.text_bg
+move.w    text_bg,(114,A0)
+; Line-A opcode
+dc.w      $A008
+; Restore registers
+movem.l   (A7)+,D0-D2/A0-A2
+
+ +
+ +
+ +Home +Line-ALine-A +Bit block transferBit block transfer +Show mouseShow mouse + + diff --git a/en/linea_transform.html b/en/linea_transform.html new file mode 100644 index 000000000..fc10bc643 --- /dev/null +++ b/en/linea_transform.html @@ -0,0 +1,165 @@ + + + + + +The documentation for TOS: Transform mouse + + + + + + + + + +Home +Line-ALine-A +Hide mouseHide mouse +Undraw spriteUndraw sprite + +
+ +

6.16 Transform mouse

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Transform mouse« +
  +
Line-A number: $A00B +
  +
Syntax: See 'Bindings for transform_mouse' +
  +
Description: This Line-A function sets the mouse pointer to a new shape. The +required parameters are passed via the intin field. Alternatively, the +AES structure MFORM may be used instead. For the call of the Line-A +function, the intin in the Line-A parameter block is set to this +structure, and after the call the old value is restored again. +
  +
typedef struct mfstr
+{
+   int16_t mf_xhot;
+   int16_t mf_yhot;
+   int16_t mf_nplanes;
+   int16_t mf_fg;
+   int16_t mf_bg;
+   int16_t mf_mask[16];
+   int16_t mf_data[16];
+} MFORM;
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Variable Meaning +
    +
mf_xhot X-coordinate of the hot-spot of the mouse form; for actions +performed by the mouse it is important where this point is positioned +in the mouse form +
mf_yhot Y-coordinate of the hot-spot of the mouse form; for actions +performed by the mouse it is important where this point is positioned +in the mouse form +
mf_nplanes Must be set to 1, as the mouse form may only have one colour +plane +
mf_fg The colour of the mask +
mf_bg The colour of the data +
mf_mask The 16 * 16 pixel-sized mask. Each 1 in the mask clears the +background at that point (or sets the background colour). This way one +can prevent 'shine-through' of the background at places where no mouse +data are drawn, and to provide the mouse pointer with a 'frame' to +offset it from the background. +
mf_data The 16 * 16 pixel-sized mouse form. Each 1 in the mouse form +creates one dot in the colour mf_bg on the screen. + +
+ +
Return value: The function does not return a result. +
  +
Availability: All TOS versions. +
  +
See also: Binding   Undraw sprite   Draw sprite +
  + +
+ +

6.16.1 Bindings for transform_mouse

+ + + + + + +
Pure-C: void transform_mouse( MFORM *mform ); +
  +
Assembler: +
  +
; Save registers
+movem.l   D0-D2/A0-A2,-(A7)
+; Pointer parameter block LINEA
+move.l    pParamblk,A0
+; Save old value of the intin field
+move.l    (8,A0),-(A7)
+; Field with mouse form in LINEA.intin
+move.l    mform,(8,A0)
+; Line-A opcode
+dc.w      $A00B
+; Pointer parameter block LINEA
+move.l    pParamblk,A0
+; Restore old value of the intin field
+move.l    (A7)+,(8,A0)
+; Restore registers
+movem.l   (A7)+,D0-D2/A0-A2
+
+ +
+ +
+ +Home +Line-ALine-A +Hide mouseHide mouse +Undraw spriteUndraw sprite + + diff --git a/en/linea_undrawsprite.html b/en/linea_undrawsprite.html new file mode 100644 index 000000000..e0b52c8cd --- /dev/null +++ b/en/linea_undrawsprite.html @@ -0,0 +1,94 @@ + + + + + +The documentation for TOS: Undraw sprite + + + + + + + + + +Home +Line-ALine-A +Transform mouseTransform mouse +Draw spriteDraw sprite + +
+ +

6.17 Undraw sprite

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Undraw sprite« +
  +
Line-A number: $A00C +
  +
Syntax: See 'Bindings for undraw_sprite' +
  +
Description: This Line-A function deletes a sprite and restores the screen. +The function must be passed the same sprite-save block that was also +passed to Draw sprite and in which Draw sprite saves the screen under +the sprite. The register A6 is destroyed. +
  +
Return value: The function does not return a result. +
  +
Availability: All TOS versions. +
  +
See also: Binding   Transform mouse   Draw sprite +
  + +
+ +

6.17.1 Bindings for undraw_sprite

+ + + + + + +
Pure-C: typedef int16_t SSB[10 + 4 * 64]; +
  +
void undraw_sprite( SSB *ssb ); +
  +
Assembler: +
  +
movem.l   D0-D2/A0-A2/A6,-(A7) ; Save registers
+move.l    ssb,A2               ; Sprite-save block to A2
+dc.w      $A00C                ; Line-A opcode
+movem.l   (A7)+,D0-D2/A0-A2/A6 ; Restore registers
+
+ +
+ +
+ +Home +Line-ALine-A +Transform mouseTransform mouse +Draw spriteDraw sprite + + diff --git a/en/linea_vars.html b/en/linea_vars.html new file mode 100644 index 000000000..715deb6bf --- /dev/null +++ b/en/linea_vars.html @@ -0,0 +1,89 @@ + + + + + +The documentation for TOS: LINEA + + + + + + + + + +Home +Line-ALine-A +The Line-A emulatorThe Line-A emulator +The negative Line-A variablesThe negative Line-A variables + +
+ +

6.2 LINEA

+

A structure is used for passing parameters to the Line-A +functions. This statically created Line-A parameter block is made up +as shown below. The number in the comment section gives the offset of +the component to the start of the structure in each case. +

+
typedef struct
+{
+  int16_t  v_planes,               /*   0: # Bit planes (1, 2 or 4)     */
+           v_lin_wr,               /*   2: # bytes/scanline             */
+           *contrl,
+           *intin,
+           *ptsin,                 /*  12: Coordinates input            */
+           *intout,
+           *ptsout,                /*  20: Coordinates output           */
+           fg_bp_1,                /*  24: Plane 0                      */
+           fg_bp_2,                /*  26: Plane 1                      */
+           fg_bp_3,                /*  28: Plane 2                      */
+           fg_bp_4,                /*  30: Plane 3                      */
+           lstlin;                 /*  32: Draw last pixel of a line    */
+                                   /*      (1) or don't draw it (0)     */
+  uint16_t ln_mask;                /*  34: Line pattern                 */
+  int16_t  wrt_mode,               /*  36: Writing modes                */
+           x1, y1, x2, y2;         /*  38: Coordinate                   */
+  void     *patptr;                /*  46: Fill pattern                 */
+  uint16_t patmsk;                 /*  50: Fill pattern "mask"          */
+  int16_t  multifill,              /*  52: Fill pattern for planes      */
+           clip,                   /*  54: Flag for clipping            */
+           xmn_clip, ymn_clip,
+           xmx_clip, ymx_clip,     /*  60: Clipping rectangle           */
+                                   /*      Rest for text_blt:           */
+           xacc_dda,               /*  64: Set to 0x8000 before text    */
+                                   /*      output                       */
+           dda_inc,                /*  66: Scaling increment            */
+           t_sclsts,               /*  68: Scaling direction            */
+           mono_status,            /*  70: Proportional font            */
+           sourcex, sourcey,       /*  72: Coordinates in font          */
+           destx, desty,           /*  76: Screen coordinates           */
+           delx, dely;             /*  80: Width and height of character*/
+  FONT_HDR *fbase;                 /*  84: Pointer to font data         */
+  int16_t  fwidth,                 /*  88: Width of font form           */
+           style;                  /*  90: Font style effect            */
+  uint16_t litemask,               /*  92: Mask for light               */
+           skewmask;               /*  94: Mask for italic              */
+  int16_t  weight,                 /*  96: Width for bold               */
+           r_off,                  /*  98: Italic offset right          */
+           l_off,                  /* 100: Italic offset left           */
+           scale,                  /* 102: Scaling flag yes/no          */
+           chup,                   /* 104: Character rotation angle *10 */
+           text_fg;                /* 106: Text foreground colour       */
+  void     *scrtchp;               /* 108: Pointer to 2 contiguous      */
+                                   /*      scratch buffers              */
+  int16_t  scrpt2,                 /* 112: Index in buffer              */
+           text_bg,                /* 114: Unused                       */
+           copy_tran,              /* 116: --                           */
+           (*fill_abort)( void );  /* 118: Tests seedfill               */
+} LINEA;
+
+
+ +Home +Line-ALine-A +The Line-A emulatorThe Line-A emulator +The negative Line-A variablesThe negative Line-A variables + + diff --git a/en/literature.html b/en/literature.html new file mode 100644 index 000000000..990e246b0 --- /dev/null +++ b/en/literature.html @@ -0,0 +1,228 @@ + + + + + +The documentation for TOS: Literature for the TOS operating system + + + + + + + + + +Home +Contents +Development systemsDevelopment systems +Declaration of sourcesDeclaration of sources + +
+ +

D Literature for the TOS operating system

+

Unfortunately there is no all-encompassing documentation for +TOS or operating systems compatible to it, and due to the current +market situation one must assume that this will not change in the +future. +

+

The list included here makes no claim to completeness; +documentation that is only available to registered developers was +deliberately not included. Furthermore one should point out +that practically all the cited works regarding the current development +position (of AES Version 4.x, MiNT, Multi-TOS, MagiC, +SpeedoGDOS, NVDI 4.x, etc.) are not only hopelessly outdated, but +partly also no longer available. +

+

List of (mainly German) books +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
• Assembler-Praxis auf Atari ST(TeWi Verlag)
• Atari Compendium(Atari Corp.)
• Atari Profibuch ST-STE-TT(Sybex Verlag)
• Atari-ST Assembler Buch(Markt & Technik)
• Atari ST - Das Floppy Arbeitsbuch(Sybex Verlag)
• Atari-ST GEM(Data Becker)
• Atari-ST Intern(Data Becker)
• C-Programmierung unter TOS(Markt & Technik)
• Das Atari-ST Grafikbuch(Sybex Verlag)
• Das TOS-Listing, BIOS-GEMDOS-VDI(Heise-Verlag)
• GEM-Programmier-Handbuch(Sybex Verlag)
• Programmierung des 68000(Sybex Verlag)
• Scheibenkleister II - Massenspeicher am ST(Maxon Computer)
• Vom Anfänger zum GEM-ProfiDieter Geiß, Jürgen Geiß
 Hüthig Verlag, ISBN 3-7785-2182-9
+
+ +

Translator's note: A few of the listed books are (or +rather were) available in English language versions as well. +

+

List of (former) magazines (no longer being published) +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Atari Computing (English)(ACR/Renegade Publishing)
Atari-Journal(Heim-Verlag)
Atari ST Review (English) 
Atari ST User (English)(Europa Publications)
Atari World (English)(Specialist Magazines)
Byte(McGraw-Hill)
c't - Magazin für Computertechnik(Heise-Verlag)
Start (English language)(Antic Publishing)
ST Applications (English)(ST Club/FaST Club)
ST-Computer(Heim-Verlag)
ST Format (English)(Future Publishing)
ST-Magazin(Markt & Technik)
ST World (English) 
TOS - Magazin plus Software(ICP-Verlag)
+
+ +

Miscellaneous +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Atari ST Machine Language(Abacus Software)
Compute!'s Technical Reference Guide - Atari ST Vol.1 - VDI(Compute!)
Compute!'s Technical Reference Guide - Atari ST Vol.2 - AES(Compute!)
First Steps on 68000 Assembly Language(Glentop Press)
GEM on the Atari ST(Data Becker/First Publishing)
GEM AES Reference Guide to GEM Version 2.0(Digital Research)
GEM VDI Reference Guide to GEM Version 2.0(Digital Research)
Introduction to GEM-Programming(Digital Research)
Professional GEM(Antic Publishing)
The Concise Atari ST 68000 Programmer's Reference Guide(Glentop Press)
The Atari A-Z(Linnhe Computing)
+
+ +

See also: Development systems   Source declaration   Appendix +

+
+ +Home +Contents +Development systemsDevelopment systems +Declaration of sourcesDeclaration of sources + + diff --git a/en/magic.html b/en/magic.html new file mode 100644 index 000000000..87b0d362a --- /dev/null +++ b/en/magic.html @@ -0,0 +1,100 @@ + + + + + +The documentation for TOS: MagiC + + + + + + + + + +Home +Contents +Style guidelinesStyle guidelines +AESVARS, Pointer to AESVARSAESVARS, Pointer to AESVARS + +
+ +

11 MagiC

+

... is a largely TOS-compatible operating system from +Application Systems Heidelberg, which can offer preemptive +multitasking as well as a range of further features. The prime +argument for MagiC is doubtless the fact that it is the only +(compatible) operating system that is still being developed further +(at the time this was written), and in addition offers the use of +modern hardware (the Power-PC). The latter was achieved with a port of +MagiC to the Apple platform as MagiC Mac. At a later stage, MagiC was +also ported to the PC platform under Windows, known as MagiC PC. +

+

This section describes the following points: +

+ + +

Note: One should not hide the fact here that MagiC (at +least the earlier versions) has clear weaknesses compared to +Atari's MultiTOS: The functionality of the AES Version 4.0 has not +been reached yet, many GEMDOS functions are not implemented, and also +the interface for installing alternative filesystems can be described +as unfortunate in comparison to the MultiTOS solution. +

+

See also: About the BIOS   About the XBIOS   GEM   About the VDI +

+
+ +Home +Contents +Style guidelinesStyle guidelines +AESVARS, Pointer to AESVARSAESVARS, Pointer to AESVARS + + diff --git a/en/magic_3dlook.html b/en/magic_3dlook.html new file mode 100644 index 000000000..c67966d15 --- /dev/null +++ b/en/magic_3dlook.html @@ -0,0 +1,76 @@ + + + + + +The documentation for TOS: Notes about MagiC's 3D-look + + + + + + + + + +Home +MagiCMagiC +The AUTOEXEC.BAT file in MagiCThe AUTOEXEC.BAT file in MagiC +Input fields in MagiCInput fields in MagiC + +
+ +

11.5 Notes about MagiC's 3D-look

+

From MagiC 3 onwards a 3D-look is available for objects, which +however differs in some details from the Atari variant. The most +important points is summary: +

+
    +
  • The 3D-look is only available in resolutions with at least +16 colours +
      +

  • +
  • While in TOS 4.0 one can use objc_sysvar to influence the +behaviour of indicators and activators as well as colours, MagiC +permits only interrogation of the data. For the colours, MagiC always +uses colour numbers 8 and 9 (light or dark grey). +
      +

  • +
  • Activators are always shown as depressed for SELECTED, while +indicators or background objects are colourized +
      +

  • +
  • Indicators and background objects are treated in the same way +
      +

  • +
  • 3D effects can be applied to all object types, which includes +text input fields, headings, group frames etc. +
      +

  • +
  • 3D objects do not get an additional border and hence do not +alter their size. Depending on the border width they stand out better, +and in some circumstances may also have an additional border and +shadow. The headings should have a height of 1+3 instead of the +previous 1+2, so that everything looks tidy. +
      +

  • +
  • The object status DRAW3D is ignored +
      +

  • +
  • Ornamental borders for dialog boxes will be created only if an +inner border of 2 pixels and OUTLINED was selected +
      +

  • +
+ +

See also: About the AES   GEM   Style guidelines +

+
+ +Home +MagiCMagiC +The AUTOEXEC.BAT file in MagiCThe AUTOEXEC.BAT file in MagiC +Input fields in MagiCInput fields in MagiC + + diff --git a/en/magic_MCB.html b/en/magic_MCB.html new file mode 100644 index 000000000..b839876d2 --- /dev/null +++ b/en/magic_MCB.html @@ -0,0 +1,76 @@ + + + + + +The documentation for TOS: Memory-Control-Block (MCB) in MagiC + + + + + + + + + +Home +Type definitionsType definitions +MacVersionMacVersion +Memory Descriptor (MD) in TOSMemory Descriptor (MD) in TOS + +
+ +

I.10 Memory-Control-Block (MCB) in MagiC

+ + + +
typedef struct
+{
+    int32_t mcb_magic;        /* 'ANDR' or 'KROM' (last)       */
+    int32_t mcb_len;          /* Nett length                   */
+    int32_t mcb_owner;        /* Pointer to PD structure       */
+    int32_t mcb_prev;         /* Previous block, or NULL       */
+    int8_t mcb_data[0];
+} MCB;
+
+

Note: The component mcb_magic has the value +'KROM' if no futher MCB follows, else the value 'ANDR'. In the latter +case the next MCB lies mcb_len bytes behind the currrent MCB. +The list is chained backwards with mcb_prev which considerably +speeds up many operations. +

+

With all memory operations the component mcb_magic is +always checked, and if an error is found the system is halted +immediately. For a halt due to a memory error the address of the +faulty MCB as well as the data (4 LONGwords) are output. Subsequently +one is asked on which +

+ +

drive one would like a core dump to be saved. If one +specifies a valid drive, then the whole ST memory from 0 to phystop is +written to the root directory of the specified drive, and is assigned +the +

+ +

name '_sys_'. The file, depending on the ST model, can be up to +4 or even 16 MB long, of course. +

+

Memory-resident programs (terminating themselves with Ptermres) +now work - unlike earlier - in a way that the blocks are not +released, all MCBs remain intact and continue to be used (each time +one clicks in the menu-bar the free memory is output, for which the +whole list is run through once and during this all MCBs are checked). +Those who wish to do so can therefore release memory-resident programs +(or also parts of them) subsequently. +

+

See also: GEMDOS   MagiC   MD   Memory management +

+
+ +Home +Type definitionsType definitions +MacVersionMacVersion +Memory Descriptor (MD) in TOSMemory Descriptor (MD) in TOS + + diff --git a/en/magic_aesvars.html b/en/magic_aesvars.html new file mode 100644 index 000000000..0a0fe9195 --- /dev/null +++ b/en/magic_aesvars.html @@ -0,0 +1,65 @@ + + + + + +The documentation for TOS: AESVARS, Pointer to AESVARS + + + + + + + + + +Home +MagiCMagiC +MagiCMagiC +MAGX_COOKIE, status_bitsMAGX_COOKIE, status_bits + +
+ +

11.1 AESVARS, Pointer to AESVARS

+ +
/* The following code obtains the pointer to the AESVARS structure of
+   MagiC in a reliable manner.
+
+   The routine is particularly important as the relevant components
+   in the MagX cookie do not yet have a valid value at boot-up. */
+
+
+AESVARS* DOMagixAESVars (VOID)
+{
+    LOCAL WORD have_it = 0;
+    LOCAL AESVARS *ap = 0;
+
+    if (!have_it)
+    {
+        OSHEADER *O;
+
+        have_it = 1;
+
+        O = (OSHEADER *) Supexec (get_osheader);
+        ap = (AESVARS *) O->os_magic;
+
+        if (!get_cookie ('MagX', NULL) ||
+            ap->magic != 0x87654321L || ap->magic2 != 'MAGX')
+              ap = 0;
+    }
+
+    return (ap);
+
+} /* DOMagixAESVars */
+
+

See also: Test for MagiC   get_cookie +

+
+ +Home +MagiCMagiC +MagiCMagiC +MAGX_COOKIE, status_bitsMAGX_COOKIE, status_bits + + diff --git a/en/magic_autoexec.html b/en/magic_autoexec.html new file mode 100644 index 000000000..76bfd8e66 --- /dev/null +++ b/en/magic_autoexec.html @@ -0,0 +1,52 @@ + + + + + +The documentation for TOS: The AUTOEXEC.BAT file in MagiC + + + + + + + + + +Home +MagiCMagiC +Extract from MagiC's BIOSExtract from MagiC's BIOS +Notes about MagiC's 3D-lookNotes about MagiC's 3D-look + +
+ +

11.4 The AUTOEXEC.BAT file in MagiC

+ +

Due to the forwards- or backwards-sorted AUTO folder on the +Apple Macintosh (keyword: MagiC Mac) there is now also an alternative +for Atari machines: +

+

If a file named AUTOEXEC.BAT is found in the AUTO folder during +the boot process, then all programs that are listed in it line-by-line +will be executed. Empty lines are permitted, program names will be +adopted up to the first space character. Thus comments can be entered +(separated by a space character from the programs). The programs may +include absolute paths; if these are absent then they will be +looked for in the AUTO folder. +

+

The root directory serves here as the current directly, as +usual. Due to this feature there is therefore a MagiC-specific AUTO +folder collection, as the AUTOEXEC.BAT is ignored by other operating +systems. +

+

See also: _autopath   System variables +

+
+ +Home +MagiCMagiC +Extract from MagiC's BIOSExtract from MagiC's BIOS +Notes about MagiC's 3D-lookNotes about MagiC's 3D-look + + diff --git a/en/magic_bios.html b/en/magic_bios.html new file mode 100644 index 000000000..96bd3f330 --- /dev/null +++ b/en/magic_bios.html @@ -0,0 +1,368 @@ + + + + + +The documentation for TOS: Extract from MagiC's BIOS + + + + + + + + + +Home +MagiCMagiC +MAGX_COOKIE, status_bitsMAGX_COOKIE, status_bits +The AUTOEXEC.BAT file in MagiCThe AUTOEXEC.BAT file in MagiC + +
+ +

11.3 Extract from MagiC's BIOS

+
*******************************
+******* ACSI ******************
+*******************************
+
+
+* Interrupt control :
+*
+* Everything works via input I5 of the ST-MFP, has the interrupt #7
+* (activated with bit 7 of ierb)
+* Polling via bit 5 of gpip
+* First aer for bit 5 must be 0, i.e. interrupt is only triggered
+* during the transition of 1 to 0
+* Second activate interrupt _mfpint (7) and set vector (address $11c)
+*
+
+**********************************************************************
+*
+* Lock the FDC/ACSI-DMA -
+* and then free it again
+* No register (apart from d0 at dma_end) is altered
+*
+* For the time in which AES has not yet been initialized, evnt_sem
+* cannot block, as act_appl is always NULL
+*
+
+dma_begin:
+ movem.l  d1-d2/a0-a2,-(sp)
+ lea      dma_sem,a0
+ moveq    #0,d1               ; No timeout
+ moveq    #SEM_SET,d0
+ jsr      evnt_sem
+ st       flock
+ movem.l  (sp)+,d1-d2/a0-a2
+ rts
+
+dma_end:
+ movem.l  d0-d2/a0-a2,-(sp)
+ lea      dma_sem,a0
+ moveq    #SEM_FREE,d0
+ jsr      evnt_sem
+ clr.w    flock
+ movem.l  (sp)+,d0-d2/a0-a2
+ rts
+
+
+**********************************************************************
+*
+* long wait_ACSI( d0 = long ticks_200hz )
+*
+* Return value: 0    OK
+*              -1    Timeout
+*              -2    Bus error
+*
+
+wait_ACSI:
+ movem.l  d1-d2/a0-a2,-(sp)
+ tst.w    pe_slice            ; Preemptive?
+ bmi.b    wdma_no_yield       ; No, busy waiting
+ move.l   act_appl,d2
+ ble.b    wdma_no_yield       ; Current application invalid
+
+* New routine via evnt_IO and MFP interrupt
+
+ lsr.l    #2,d0               ; AES: 50Hz instead of 200Hz
+wdma_new:
+ move     sr,d1
+ ori      #$700,sr
+ btst     #5,gpip             ; Finished?
+ beq.b    wdma_ok2            ; Yes, enable interrupt
+; Set up interrupt
+ pea      int_mfp7_unsel(pc)
+ move.l   d2,imfp7_appl       ; act_appl
+ move.l   sp,imfp7_unsel
+; Release interrupt
+ move.w   d1,sr
+; Wait for interrupt
+ move.l   sp,a0
+;move.w   d0,d0               ; Timeout in 50Hz ticks
+ jsr      evnt_IO
+ addq.l   #4,sp
+wdma_end:
+ movem.l  (sp)+,d1-d2/a0-a2
+ rts
+
+* Old routine with busy waiting via _hz_200
+
+wdma_no_yield:
+ add.l    _hz_200,d0
+wdma_loop:
+ btst     #5,gpip
+ beq.b    wdma_ok
+ cmp.l    _hz_200,d0
+ bcc.b    wdma_loop
+wdma_timeout:
+ moveq    #-1,d0              ; Timeout
+ bra.b    wdma_end
+wdma_ok2:
+ move.w   d1,sr
+wdma_ok:
+ moveq    #0,d0               ; OK
+ bra.b    wdma_end
+
+
+**********************************************************************
+*
+* Interrupt routine for MFP, interrupt channel #7 = I/O-port 5
+* (DMA/FDC busy)
+*
+* Return value: 0 (OK)
+*
+
+int_mfp7:
+ tst.l    imfp7_unsel                   ; Interrupt activated?
+ beq.b    imfp7_end                     ; No, continue
+ movem.l  d0-d2/a0-a2,-(sp)
+
+ move.l   imfp7_unsel,a0
+ clr.l    imfp7_unsel                   ; Deactivate interrupt
+ clr.l    (a0)                          ; Mark as arrived
+
+ move.l   imfp7_appl,a0
+ jsr      appl_IOcomplete               ; Awake waiting APP
+ movem.l  (sp)+,d0-d2/a0-a2
+imfp7_end:
+ move.b   #$7f,isrb                     ; Clear service-bit
+ rte
+
+
+**********************************************************************
+*
+* void int_mfp7_unsel( a0 = long *unselect, a1 = APPL *ap );
+*
+* Deactivates the interrupt again if it has not arrived
+* Return value: -1 (timeout)
+*
+
+int_mfp7_unsel:
+ clr.l    imfp7_unsel                   ; Deactivate interrupt
+ moveq    #-1,d0
+ move.l   d0,(a0)                       ; Not arrived
+ rts
+
+
+
+*******************************
+******* SCSI ******************
+*******************************
+
+
+* Interrupt control:
+*
+* SCSI-DMA bus error: Input I5 of the TT-MFP
+* First aer for bit 5 must be 0, i.e. interrupt is triggered at the
+* transition of 1 to 0
+* Polling via bit 5 of gpip
+* Interrupt #7 of the TT-MFP (address $15c)
+
+* SCSI: Input I7 of the TT-MFP
+* First aer for bit 7 must be 1, i.e. interrupt is triggered at the
+* transition of 0 to 1
+* Polling via bit 7 of gpip
+* Interrupt #15 of the TT-MFP (address $17c)
+
+* During the transmission, the operating type register $fff785 of
+* the ncr 5380 manifestly has to have bit 3 (enable process interrupt)
+* set
+
+**********************************************************************
+*
+* Interrupt routine for TT-MFP, interrupt channel #7 = I/O-port 5
+* (SCSI-DMA bus error)
+*
+* Return value: -2
+*
+
+int_scsidma:
+ tst.l    ncrdma_unsel                  ; Interrupt activated?
+ beq.b    incrdma_end                   ; No, continue
+ movem.l  d0-d2/a0-a2,-(sp)
+
+ moveq    #-2,d0                        ; Arrived (error)
+ move.l   ncrdma_unsel,a0
+ clr.l    ncrdma_unsel                  ; Deactivate interrupt
+ move.l   d0,(a0)                       ; Mark as arrived
+
+ move.l   ncrdma_appl,a0
+ jsr      appl_IOcomplete               ; Awake waiting APP
+ movem.l  (sp)+,d0-d2/a0-a2
+incrdma_end :
+ move.b   #$7f,isrb+$80                 ; Clear service-bit (TT-MFP)
+ rte
+
+
+**********************************************************************
+*
+* Interrupt routine for TT-MFP, interrupt channel #15 = I/O-port 7
+* (SCSI)
+*
+* Return value: 0
+*
+
+int_ncr:
+ tst.l    ncrdma_unsel                  ; Interrupt activated?
+ beq.b    incr_end                      ; No, continue
+ movem.l  d0-d2/a0-a2,-(sp)
+
+ move.l   ncrdma_unsel,a0
+ clr.l    ncrdma_unsel                  ; Deactivate interrupt
+ clr.l    (a0)                          ; Mark as arrived
+
+ move.l   ncrdma_appl,a0
+ jsr      appl_IOcomplete               ; Awake waiting APP
+ movem.l  (sp)+,d0-d2/a0-a2
+incr_end:
+ move.b   #$7f,isra+$80                 ; Clear service-bit (TT-MFP)
+ rte
+
+
+**********************************************************************
+*
+* void incrdma_unsel( a0 = long *unselect, a1 = APPL *ap );
+*
+* Deactivates the interrupt again if it has not arrived
+* (Return value: -1)
+*
+
+incrdma_unsel:
+ clr.l    ncrdma_unsel                  ; Deactivate interrupt
+ moveq    #-1,d0 ; Timeout
+ move.l   d0,(a0)                       ; Not arrived
+ rts
+
+
+**********************************************************************
+*
+* long wait_NCR( d0 = long ticks_200hz )
+*
+* Return value: 0    OK
+*              -2    Bus error
+*              -1    Timeout
+*
+* No register apart fro d0 altered
+*
+
+wait_NCR:
+ movem.l  d1-d2/a0-a2,-(sp)
+ tst.w    pe_slice            ; Preemptive?
+ bmi.b    wncr_no_yield       ; No, busy waiting
+ move.l   act_appl,d2
+ ble.b    wncr_no_yield       ; Current application invalid
+
+* New routine via evnt_IO and MFP interrupt
+
+ lsr.l    #2,d0               ; AES: 50Hz instead of 200Hz
+wncr_new:
+ move     sr,d1
+ ori      #$700,sr
+ btst     #5,gpip+$80         ; DMA bus error?
+ beq.b    wncr_err2           ; Yes, return(-2)
+ btst     #7,gpip+$80         ; Finished?
+ bne.b    wncr_ok2            ; Yes, enable interrupt, return(0)
+; Set u0 interrupt
+ pea      incrdma_unsel(pc)
+ move.l   d2,ncrdma_appl      ; act_appl
+ move.l   sp,ncrdma_unsel
+; Release interrupt
+ move.w   d1,sr
+; Wait for interrupt
+ move.l   sp,a0
+;move.w   d0,d0               ; Timeout in 50Hz ticks
+ jsr      evnt_IO
+ addq.l   #4,sp
+wncr_end:
+ movem.l  (sp)+,d1-d2/a0-a2
+ rts
+
+* Old routine with busy waiting via _hz_200
+
+wncr_no_yield:
+ add.l    _hz_200,d0
+wncr_loop:
+ btst     #5,gpip+$80
+ beq.b    wncr_err
+ btst     #7,gpip+$80
+ bne.b    wncr_ok
+ cmp.l    _hz_200,d0
+ bcc.b    wncr_loop
+ moveq    #-1,d0                   ; Timeout
+ bra.b    wncr_end
+wncr_ok2:
+ move.w   d1,sr
+wncr_ok:
+ moveq    #0,d0
+ bra.b    wncr_end
+wncr_err2:
+ move.w   d1,sr
+wncr_err:
+ moveq    #-2,d0
+ bra.b    wncr_end
+
+
+**********************************************************************
+*
+* Lock the NCR-SCSI
+*
+* No register apart from d0 altered
+*
+* and release it again
+*
+* No register is altered
+*
+* For the time in which AES has not yet been initialized, evnt_sem
+* cannot block, as act_appl is always NULL
+
+ncr_begin:
+ movem.l  d1-d2/a0-a2,-(sp)
+ lea      ncr_sem,a0
+ moveq    #0,d1               ; No timeout
+ moveq    #SEM_SET,d0
+ jsr      evnt_sem
+ movem.l  (sp)+,d1-d2/a0-a2
+ rts
+
+ncr_end:
+ movem.l  d0-d2/a0-a2,-(sp)
+ lea      ncr_sem,a0
+ moveq    #SEM_FREE,d0
+ jsr      evnt_sem
+ movem.l  (sp)+,d0-d2/a0-a2
+ rts
+
+

Warning: The routines given here can naturally change +again at any time!! +

+

See also: MagiC   About the GEMDOS   About the BIOS   MagiC's XFS-concept +

+
+ +Home +MagiCMagiC +MAGX_COOKIE, status_bitsMAGX_COOKIE, status_bits +The AUTOEXEC.BAT file in MagiCThe AUTOEXEC.BAT file in MagiC + + diff --git a/en/magic_cookie.html b/en/magic_cookie.html new file mode 100644 index 000000000..448f565e6 --- /dev/null +++ b/en/magic_cookie.html @@ -0,0 +1,61 @@ + + + + + +The documentation for TOS: MAGX_COOKIE, status_bits + + + + + + + + + +Home +MagiCMagiC +AESVARS, Pointer to AESVARSAESVARS, Pointer to AESVARS +Extract from MagiC's BIOSExtract from MagiC's BIOS + +
+ +

11.2 MAGX_COOKIE, status_bits

+

A bit-vector, which is defined as follows: +

+
+ + + + + + + + + + + + + + + + + + + + +
Bit-00=MagiC task-manager active at present?
Bit-01=Reserved
.. 
Bit-31=Reserved
+
+ +

Warning: The specified bits in this LONG value are +read-only, i.e. the may not be changed. +

+
+ +Home +MagiCMagiC +AESVARS, Pointer to AESVARSAESVARS, Pointer to AESVARS +Extract from MagiC's BIOSExtract from MagiC's BIOS + + diff --git a/en/magic_dfs.html b/en/magic_dfs.html new file mode 100644 index 000000000..4c106aa9a --- /dev/null +++ b/en/magic_dfs.html @@ -0,0 +1,1634 @@ + + + + + +The documentation for TOS: MagiC's DFS-concept + + + + + + + + + +Home +MagiCMagiC +Additional programs for MagiCAdditional programs for MagiC +MagiC's XFS-conceptMagiC's XFS-concept + +
+ +

11.20 MagiC's DFS-concept

+ +

MagiC, just as MultiTOS, enables the incorporation of +alternative filesystems (so-called XFSs). Firmly integrated in MagiC +is only a single XFS, the DOS_XFS. On top of this XFS sit in turn +subdrivers, the so-called DFS (DOS filesystem), of which two are +integrated in MagiC, namely the FAT filesystem and the U filesystem +(that for the drive U:). +

+

A DOS filesystem (DFS) is called by DOS_XFS. This includes only +the file functions, while the management of directories is essentially +taken over by the DOS_XFS. Further DFSs can be installed. The effort +for a DFS is appreciably lower than for an XFS as many +functions are performed already by the DOS_XFS. The vital prerequisite +is a DOS- conforming directory structure (with 32-bit entries and +filenames in the 8+3 format). This section deals with the items: +

+ + +

See also: MagiC's XFS-concept +

+

11.20.1 The make-up of a DFS

+ +

Since the implementation of a DFS can only be performed in +Assembler, this description is specified in Assembler syntax: +

+
dfs_name:      DS.B      8    /* Subname of the DOS filesystems */
+dfs_next:      DS.L      1    /* Next driver                    */
+dfs_init:      DS.L      1    /* Initialization                 */
+dfs_sync:      DS.L      1    /* Synchronises the filesystem    */
+dfs_drv_open:  DS.L      1    /* New drive                      */
+dfs_drv_close: DS.L      1    /* Release drive                  */
+dfs_dfree:     DS.L      1    /* For Dfree                      */
+dfs_sfirst:    DS.L      1    /* For Fsfirst                    */
+dfs_snext:     DS.L      1    /* For Fsnext                     */
+dfs_ext_fd:    DS.L      1    /* Extends a directory            */
+dfs_fcreate:   DS.L      1    /* Creates a directory or file    */
+dfs_fxattr:    DS.L      1    /* For Fxattr                     */
+dfs_dir2index: DS.L      1    /* For Dreaddir                   */
+dfs_readlink:  DS.L      1    /* For Freadlink                  */
+dfs_dir2FD:    DS.L      1    /* for Fopen                      */
+dfs_fdelete:   DS.L      1    /* For Fdelete and Ddelete        */
+dfs_pathconf:  DS.L      1    /* For Dpathconf                  */
+
+

See also: Make-up of an XFS   MagiC +

+

11.20.1.1 dfs_dfree

+ + + + + + + + + + + + + + + +
Name: »dfs_dfree« +
  +
Parameters: +
  +

+
+ + + + + + + + + + + + + + + +
a0=FD *
a1=long df[4]
-> d0=long errcode
+
+ +
Description: For Dfree it is generally sufficient to obtain from the DD +the DMD that belongs to it and to specify the free space on the +whole drive. +
  +
Group: Make-up of a DFS +
  +
See also: MagiC's DFS-concept +
  + +
+ +

11.20.1.2 dfs_dir2FD

+ + + + + + + + + + + + + + + +
Name: »dfs_dir2FD« - Initialize a prototype FD. +
  +
Parameters: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
a0=FD *dd
a1=DIR *dir
-> d0=long errcode
If necessary  
a0=LINK *l
+
+ +
Description: dfs_dir2FD initializes a prototype-FD, namely the fields: +
  + + +
and if necessary: +
  +
    +
  • fd_name +
  • +
  • fd_xftype +
  • +
  • fd_xdata usw. +
  • +
+ +
Other data of the FD may also be changed if necessary. +
  +
Group: Make-up of a DFS +
  +
See also: MagiC's DFS-concept +
  + +
+ +

11.20.1.3 dfs_dir2index

+ + + + + + + + + + + + + + + +
Name: »dfs_dir2index« +
  +
Parameters: +
  +

+
+ + + + + + + + + + + + + + + +
a0=FD *dd
a1=DIR *dir
-> d0=long index or errcode
+
+ +
Description: dfs_dir2index simply returns an index (32-bit) to a DIR entry. +For this the FAT_DFS takes the de-Intelled starting cluster. +dd is the directory that contains the file. +
  +
Group: Make-up of a DFS +
  +
See also: MagiC's DFS-concept +
  + +
+ +

11.20.1.4 dfs_drv_close

+ + + + + + + + + + + + + + + +
Name: »dfs_drv_close« +
  +
Parameters: +
  +

+
+ + + + + + + + + + + + + + + +
d0=int mode
a0=DMD *d
-> d0=long errcode
+
+ +
Description: The dfs_drv_close function too fulfills two tasks, depending on +mode: +
  +
1. mode == 0: +
The DOS_XFS asks the DFS whether the drive may be closed. If +this is not permitted, then EACCDN must be returned, else E_OK +(required e.g. for Dlock). Opened files were already recognized be the +kernel and DOS_XFS, i.e. in that case dfs_drv_close will not be called +at all. +
  +
For this reason, generally no altered sector buffers may exist, +even those that are currently being read or written (this is always +done via files!). In this case it suffices, therefore, always to +return an E_OK. Things become more problematic if one uses a +write-back cache. With this it may happen that no file is open any +more, but a buffer still holds data that have to be written back. The +kernel makes a sync call (xfs_sync, which is passed on to dfs_sync) +before the inquiry is made; thus no altered buffers ought to exist any +more - if they do, then for safety's sake the DFS should return +EACCON. +
  +
2. mode == 1: +
The DOS_XFS forces the closing of the drive, the DFS must return +E_OK. No caches may be written back, since the drive is already +invalid (after a media change has been reported already). +
  +
With Dlock, dfs_drv_close is first called in mode 0, then - if +no error has occurred - with mode 1. This strategy will be carried out +also even if at some time a mechanism is built in that monitors the +eject button of interchangeable-media drives or CD-ROMs, and bars +ejection if necessary. +
  +
Group: Make-up of a DFS +
  +
See also: MagiC's DFS-concept +
  + +
+ +

11.20.1.5 dfs_drv_open

+ + + + + + + + + + + + + + + +
Name: »dfs_drv_open« +
  +
Parameters: +
  +

+
+ + + + + + + + + + +
a0=DMD *d
-> d0=long errcode
+
+ +
Description: MagiC supports exactly 26 simultaneously active filesystems +that are assigned letters 'A'..'Z'. dfs_drv_open has two tasks: +
  + +
    +
  1. At the first access to a drive (say D:), the kernel creates a +DMD (drive medium descriptor) and 'offers' this to the XFSs. The +DOS_XFS offers this again to all DFS drivers in turn. The entry +d_dfs is still a NULL-pointer, d_drive is initialized (between 0 and +25, corresponding to 'A'..'Z'). The DFS drivers now attempt to +recognize 'their' filesystem on the drive. If this succeeds, then +d_dfs and d_root have to be initialized, in which case the return +value is then E_OK. Else EDRIVE is reported, and the DOS_XFS tries the +next DFS. +
      +

  2. +
  3. At a repeated access d_dfs is already initialized, and the DFS +has the opportunity to test for a medium change. If everything is in +order, E_OK has to be returned. Else the disk medium change routine +of the kernel has to be called and E_CHNG returned. For this one +obtains the pointer to the medium change routine of the kernel with +Dcntl. +
      +

  4. +
+ +
Group: Make-up of a DFS +
  +
See also: MagiC's DFS-concept +
  + +
+ +

11.20.1.6 dfs_ext_fd

+ + + + + + + + + + + + + + + +
Name: »dfs_ext_fd« +
  +
Parameters: +
  +

+
+ + + + + + + + + + +
a0=FD *fd
-> d0=long errcode
+
+ +
Description: dfs_ext_fd is used when a file is to be created but the +directory is already full. It is also used during the creation of a +folder (Dcreate). +
  +
fd is a prototype FD, which is already opened in the +exclusive mode. The file has to be extended and the new space +initialized with NULLs. +
  +
Group: Make-up of a DFS +
  +
See also: MagiC's DFS-concept +
  + +
+ +

11.20.1.7 dfs_fcreate

+ + + + + + + + + + + + + + + +
Name: »dfs_fcreate« +
  +
Parameters: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
a0=FD *dd
a1=DIR *dir
d0=int cmd
d1=long arg
-> d0=long errcode
+
+ +
Description: dfs_fcreate is used for Fcreate, Dcreate and Dcntl. The DOS_XFS +has already found free space in the directory dd, and - at +first in memory - created the new directory entry dir. Those +parts of the DIR not used in every DFS (the cluster number too) +are already initialized with NULLs. The DFS has the opportunity here +still to make corrections and to initialize the reserved DIR areas +according to the file-type before the DOS_XFS writes the whole entry +into the directory. +
  +
When the call Dcntl or Fsymlink occurs, d0 and a0 contain the +relevant parameters, otherwise d0 == 0. If d0 == SYMLINK_CREATE, a +symbolic link must (or at least can, if possible) be created. +
  +
Group: Make-up of a DFS +
  +
See also: MagiC's DFS-concept +
  + +
+ +

11.20.1.8 dfs_fdelete

+ + + + + + + + + + + + + + + +
Name: »dfs_fdelete« +
  +
Parameters: +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
a0=FD *dd
a1=DIR *dir
d0=long dirpos
-> d0=long errcode
+
+ +
Description: The file with the directory entry dir in the directory +FD is to be deleted. dfs_fdelete performs the actual deletion +of the file; the deletion of the directory entry and access checks are +performed by the DOS_XFS. +
  +
Group: Make-up of a DFS +
  +
See also: MagiC's DFS-concept +
  + +
+ +

11.20.1.9 dfs_fxattr

+ + + + + + + + + + + + + + + +
Name: »dfs_fxattr« +
  +
Parameters: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
a0=FD *dd
a1=DIR *dir oder NULL
d0=int mode
d1=XATTR *xattr
-> d0=long errcode
If necessary:  
a0=LINK *l
+
+ +
Description: dfs_fxattr is required for Fxattr. The DOS_XFS has already +entered all the information, which is identical for all DFSs, into +the XATTR. xattr_blksize as well as xattr_nblocks both still have to +be initialized by the DFS, xattr_size can be adapted for special +files, say. xattr_index has been initialized by the DOS_XFS, with +dir_stcl converted to the Motorola format. In many cases it will be +necessary to perform a correction here, and to pass a pointer to a +driver or a global data structure, for instance. +
  +
With mode d0 == 0 (i.e. follow symbolic links) the DFS must +react appropriately and in the case of a link it has to return in d0 +ELINK and in a0 the link. If dir == NULL, then the DOS_XFS has +not located a directory entry but an FD (e.g. the root, or an open +file). +
  +
Group: Make-up of a DFS +
  +
See also: MagiC's DFS-concept +
  + +
+ +

11.20.1.10 dfs_init

+ + + + + + + + + + + + + + + +
Name: »dfs_init« +
  +
Parameters: — +
  +
Description: Reserved. In case of MagiC-internal XFSs, dfs_init contains +their initialization. It is not used with loaded-in XFSs. +
  +
Group: Make-up of a DFS +
  +
See also: MagiC's DFS-concept +
  + +
+ +

11.20.1.11 dfs_name

+ + + + + + + + + + + + + + + +
Name: »dfs_name« +
  +
Parameters: — +
  +
Description: The name is up till now just a comment; perhaps in the future +it may offer the possibility of ascertaining which drivers are +installed and what, say, the driver responsible for drive A: is called +(i.e. what sort of filesystem the floppy disk contains). +
  +
The name of the integrated XFS is 'DOS_XFS ' (extended to 8 +characters with spaces). +
  +
Group: Make-up of a DFS +
  +
See also: MagiC's DFS-concept +
  + +
+ +

11.20.1.12 dfs_next

+ + + + + + + + + + + + + + + +
Name: »dfs_next« +
  +
Parameters: — +
  +
Description: dfs_next is simply a chaining pointer to the next driver. A new +driver is always incorporated at the front, so always has the highest +priority. This makes it possible to load a driver in place of the +integrated DOS driver, for instance. +
  +
Group: Make-up of a DFS +
  +
See also: MagiC's DFS-concept +
  + +
+ +

11.20.1.13 dfs_pathconf

+ + + + + + + + + + + + + + + +
Name: »dfs_pathconf« +
  +
Parameters: +
  +

+
+ + + + + + + + + + + + + + + +
a0=FD *dd
d0=int which
-> d0=long val or error-code
+
+ +
Description: dfs_pathconf inquires about various restrictions that apply for +a given path dd. Most values for which have been set +by the DOS_XFS already, so only the following values occur: +
  +

+
+ + + + + + + + + + + + + + + +
DP_IOPEN(0)Maximum number of simultaneously open files
DP_ATOMIC(4)Internal block size
DP_MODEATTR(7)Permitted file-types (from 21.05.95)
+
+ +
Group: Make-up of a DFS +
  +
See also: MagiC's DFS-concept +
  + +
+ +

11.20.1.14 dfs_readlink

+ + + + + + + + + + + + + + + +
Name: »dfs_readlink« +
  +
Parameters: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
a0=FD *dd
a1=DIR *dir
-> d0=long errcode
If necessary:  
a0=LINK *l
+
+ +
Description: dfs_readlink is used for Freadlink. d0 is either EACCDN if +dir is not a symlink, or another error-code. If no error has +arisen, a0 must return the link and d0 has to have the value ELINK. +
  +
Group: Make-up of a DFS +
  +
See also: MagiC's DFS-concept +
  + +
+ +

11.20.1.15 dfs_sfirst

+ + + + + + + + + + + + + + + +
Name: »dfs_sfirst« +
  +
Parameters: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
a0=FD * d
a1=DIR *dir
d0=long pos
d1=DTA *dta
-> d0=long errcode
If necessary:  
a0=LINK *l
+
+ +
Description: The DOS_XFS has already accessed the file. The DFS only +needs to initialize the reserved entries dta_usr1 and dta_usr2 for the +next Fsnext, so that this position can be found again. +
  +
File descriptors (FDs) cannot be used in dta_usrm as releasing +them during a 'garbage collection' cannot be avoided. Simply blocking +the FDs is not possible either as one cannot predict the end of the +Fsfirst/Fsnext operation. An already failed search can be marked by +deleting dta_sname, for instance. +
  +
pos already points to the next entry, i.e. 32 bytes +after dir. For symbolic links the DFS has to react +appropriately, pass ELINK in d0 and in a0 a pointer to the link. A +link starts with a WORD (16-bit) for the length of the path, followed +by the path itself. +
  +
Warning: The length must include the terminating +NULL-byte and also be even. The link must lie at an even memory +address. +
  +
The buffer for the link may be static or volatile as the kernel +immediately copies the data elsewhere, with no possibility of a +context change happening inbetween. +
  +
Group: Make-up of a DFS +
  +
See also: MagiC's DFS-concept +
  + +
+ +

11.20.1.16 dfs_snext

+ + + + + + + + + + + + + + + +
Name: »dfs_snext« +
  +
Parameters: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
a0=DTA *dta
a1=DMD *dmd
-> d0=long errcode
If necessary:  
a0=LINK *l
+
+ +
Description: The next matching file will be looked for, based on the data +that dfs_sfirst has stored in the reserved area of the DTA. For +this one can fall back on the functions of the DOS_XFS that can be +obtained with Dcntl: +
  + + + + + + + + + + + + + + + + + + +
_dir_srch Searches through a directory with FD +
reopen_FD Opens an FD +
close_DD Closes an FD +
filename_match Compares filenames +
conv_path_elem Coverts filenames +
init_DTA Copies data from DIR to the DTA + +
+ +
Group: Make-up of a DFS +
  +
See also: MagiC's DFS-concept +
  + +
+ +

11.20.1.17 dfs_sync

+ + + + + + + + + + + + + + + +
Name: »dfs_sync« +
  +
Parameters: +
  +

+
+ + + + + + + + + + +
a0=DMD *d
-> d0=long errcode
+
+ +
Description: The kernel has notified DOS_XFS that all buffers have been +written back on drive d. A pointer to a DMD (drive medium +descriptor) is passed in register a0. The DOS_XFS passes this call on +directly to the DFS. +
  +
The return value will be an error-code. If the DFS does not +manage the buffer (e.g. a RAMdisk), then a 0 has to be returned. +
  +
Group: Make-up of a DFS +
  +
See also: MagiC's DFS-concept +
  + +
+ +

11.20.2 Data structures for a DFS

+ +

When working with a DFS the following data structures are +important: +

+ + +

See also: XFS structures +

+

11.20.2.1 The directory entry (DIR)

+

The following fields are identical for every DFS: +

+
dir_name:  DS.B   11    /* 0x00: Filename                            */
+dir_attr:  DS.B    1    /* 0x0b: Attribute                           */
+dir_usr1:  DS.W    1    /* 0x0c: For free user assignment            */
+dir_usr2:  DS.L    1    /* 0x0e: For free user assignment            */
+dir_usr3:  DS.L    1    /* 0x12: For free user assignment            */
+dir_time:  DS.W    1    /* 0x16: Time of last change (Intel format)  */
+dir_date:  DS.W    1    /* 0x18: Date of last change (Intel format)  */
+dir_stcl:  DS.W    1    /* 0x1a: First cluster, or other info        */
+dir_flen:  DS.L    1    /* 0x1c: File length (Intel format)          */
+
+

Note: Instead of the cluster, other statements are +possible as well. However, DOS_XFS treats the entry as a cluster +specification at first (for xattr.index and fd_stcl as well as the +creation of the entries '.' and '..' for Dcreate). In the case of +Fxattr the statements of the DFS can be overwritten with other +data. +

+

See also: MagiC's DFS-concept +

+

11.20.2.2 The device driver (MX_DDEV)

+ +

The sub-device driver (MX_DDEV) is inserted into the file +descriptor by the DFS function dfs_dir2FD at the opening of a file +and called up by the DOS_XFS. The MX_DDEV device driver has to make +the following functions available: +

+
typedef struct _mx_ddev
+{
+        LONG cdecl (*ddev_open)(struct _mx_dosfd *f);
+        LONG cdecl (*ddev_close)();
+        LONG cdecl (*ddev_read)();
+        LONG cdecl (*ddev_write)();
+        LONG cdecl (*ddev_stat)();
+        LONG cdecl (*ddev_seek)();
+        LONG cdecl (*ddev_datime)();
+        LONG cdecl (*ddev_ioctl)();
+        LONG cdecl (*ddev_delete)();
+        LONG cdecl (*ddev_getc)();
+        LONG cdecl (*ddev_getline)();
+        LONG cdecl (*ddev_putc)();
+} MX_DDEV;
+
+

See also: MagiC's DFS-concept   MagiC's XFS-concept +

+
11.20.2.2.1 ddev_open
+ + + + + + + + + + + + + + + +
Name: »ddev_open« +
  +
Parameters: +
  +

+
+ + + + + + + + + + +
a0=FD *file
-> d0=long errcode
+
+ +
Description: The file is opened, the FD is already initialized. In open-mode +(fd_mode), bit O_TRUNC has to be evaluated. If appropriate an +error-code has been returned, for devices O_TRUNC can be confidently +ignored. +
  +
The field fd_fpos is already initialized to 0L. Should this not +suffice (say if the FAT_DFS always memorizes the current cluster), +then the appropriate fields of the user area of the FD are to be +initialized or other fields of the FD adapted. ddev_open is called +both on the first opening of a file (after dfs_dir2FD) as well as on +duplication of a file descriptor (say if several programs access a +file or a directory simultaneously). The compatibility of the +open-modes (perhaps a shared read) is guaranteed by the kernel. The +device driver can, for instance, modify the open-mode in such a way +that the FD is always opened as 'exclusive', or arrange with the +bit OM_NOCHECK that it wants to oversee the open-mode itself. If +ddev_open for the prototype FD is called, then fd->fd_multi1 == fd. +
  +
If ddev_open returns an error-code, then the FD is simply +released again by the DOS-XFS. +
  +
Group: DOS device driver +
  +
See also: — +
  + +
+ +
11.20.2.2.2 ddev_close
+

The file is closed. The handling of fd_refcnt is taken +over by the DOS_XFS. The MX_DDEV driver here only needs to write back +any buffers that may exist. +

+

Parameters: +

+
+ + + + + + + + + + +
a0=FD *file,
-> d0=long errcode
+
+ +
11.20.2.2.3 ddev_read
+

See dev_read. +

+

Parameters: +

+
+ + + + + + + + + + + + + + + + + + + + +
a0=FD *file
d0=long count
a1=char *buffer
-> d0=long amount
+
+ +
11.20.2.2.4 ddev_write
+

See dev_write. The MX_DDEV does not have to bother with the +updating of the directory or the date of last access. +

+

Parameters: +

+
+ + + + + + + + + + + + + + + + + + + + +
a0=FD *file
d0=long count
a1=char *buffer
-> d0=long amount
+
+ +
11.20.2.2.5 ddev_stat
+

See dev_stat. +

+

Parameters: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
a0=FD *file
a1=MAGX_UNSEL *unselect oder NULL
d0=int rwflag
d1=long apcode
-> d0=long status
+
+ +
11.20.2.2.6 ddev_seek
+

See dev_seek. +

+

Parameters: +

+
+ + + + + + + + + + + + + + + + + + + + +
a0=FD *file
d0=long where
d1=int mode
-> d0=long position
+
+ +
11.20.2.2.7 ddev_datime
+

See dev_datime. The MX_DDEV can simply insert a NULL-pointer +here, then the DOS_XFS performs the standard procedure. The DOS_XFS +converts Fcntl(FUTIME, ...) to Fdatime. +

+

Parameters: +

+
+ + + + + + + + + + + + + + + + + + + + +
a0=FD *file
a1=int d[2]
d0=int setflag
-> d0=long errcode
+
+ +
11.20.2.2.8 ddev_ioctl
+

See dev_ioctl. There should be support for the functions +FTRUNCATE, FIONREAD and FIONWRITE at least. DOS_XFS converts +Fcntl(FUTIME, ...) to Fdatime and with that to ddev_datime, i.e. +FUTIME does not have to be supported directly by ddev_ioctl. +

+

Parameters: +

+
+ + + + + + + + + + + + + + + + + + + + +
a0=FD *file
d0=int cmd
a1=void *buf
-> d0=long errcode
+
+ +
11.20.2.2.9 ddev_delete
+

This function is called only by the U_DFS, i.e. the integrated +DFS file system for drive U:. So if one installs one's own device +driver, this is the time to release its memory and so retire from the +system. +

+

Parameters: +

+
+ + + + + + + + + + + + + + + +
a0=FD *directory
a1=DIR *dir
-> d0=long errcode
+
+ +
11.20.2.2.10 ddev_getc
+

See dev_getc. The MX_DDEV can simply insert a NULL-pointer here, +then the DOS_XFS performs the standard procedure, i.e. calls +ddev_read. +

+

Parameters: +

+
+ + + + + + + + + + + + + + + +
a0=FD *file
d0=int mode
-> d0=unsigned long c
+
+ +
11.20.2.2.11 ddev_getline
+

See dev_getline. The MX_DDEV can simply insert a NULL-pointer +here, then the DOS_XFS performs the standard procedure, i.e. calls +ddev_read. +

+

Parameters: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
a0=FD *file
a1=char *buf
d1=long size
d0=int mode
-> d0=long amount
+
+ +
11.20.2.2.12 ddev_putc
+

See dev_putc. The MX_DDEV can simply insert a NULL-pointer here, +then the DOS_XFS performs the standard procedure, i.e. calls +ddev_write. +

+

Parameters: +

+
+ + + + + + + + + + + + + + + + + + + + +
a0=FD *file
d0=int mode
d1=long value
-> d0=unsigned long count
+
+ +

11.20.2.3 The Disk Transfer Area (DTA) for DFSs

+

The DTA is used by the old DOS functions Fsfirst and Fsnext, +whose clumsy conception by the MSDOS originators still weighs down the +system like a curse. The partitioning into res1/res2 has historical +reasons, to make the structure at least in DOS_XFS as compatible as +possible to old TOSs. For the DOS_XFS and with that for all DFSs +the structure looks as follows: +

+
dta_sname:  DS.B    12       /* 0x00: Search name (from Fsfirst)   */
+dta_usr1 :  DS.L     1       /* 0x0c: For free user assignment     */
+dta_usr2 :  DS.L     1       /* 0x10: For free user assignment     */
+dta_drive:  DS.B     1       /* 0x14: Logical drive (0..25)        */
+dta_attr :  DS.B     1       /* 0x15: Found attribute              */
+dta_time :  DS.W     1       /* 0x16: Found time                   */
+dta_date :  DS.W     1       /* 0x18: Found date                   */
+dta_len  :  DS.L     1       /* 0x1a: Found length                 */
+dta_name :  DS.B    14       /* 0x1e: Found filename               */
+
+

Note: Here there are two LONGwords for free assignment +by the user. dta_sname contains the search name already in the +current format. In dta_usr1 and dta_usr2 one must +enter the current position of the search, so that a following Fsnext +continues the search at the correct position. +

+

See also: MagiC's DFS-concept +

+

11.20.3 Installation of a DFS

+

A DFS is simply a program that installs the driver and then +terminates itself as resident. The installation takes place with: +
dosfunctions = Dcntl(DFS_INSTDFS, "U:\\", +&myxfs); +
the path "U:\\" is important, because the Dcntl call is +performed not by the MagiC kernel, but by the DOS-XFS. The return +value will be a pointer to important XFS functions, or an +error-code. +

+

The DOS_XFS functions can also be inquired for independent of +the installation of a DFS by using: +
dosfunctions = Dcntl(DFS_GETINFO, "U:\\", NULL); +
with kernel = Dcntl (KER_GETINFO, NULL, NULL) one obtains +the kernel functions. +

+

The deinstallation of a DFS is not provided for. +

+
+ +Home +MagiCMagiC +Additional programs for MagiCAdditional programs for MagiC +MagiC's XFS-conceptMagiC's XFS-concept + + diff --git a/en/magic_dma.html b/en/magic_dma.html new file mode 100644 index 000000000..3b8c94476 --- /dev/null +++ b/en/magic_dma.html @@ -0,0 +1,139 @@ + + + + + +The documentation for TOS: The background-DMA of MagiC + + + + + + + + + +Home +MagiCMagiC +Special error-messages in MagiCSpecial error-messages in MagiC +Iconification in MagiCIconification in MagiC + +
+ +

11.9 The background-DMA of MagiC

+ +

As of MagiC 3, the whole of the DOS, inclusive of access to DOS +file systems, is reentrant and runs in the background. Thus it is +possible to edit files on Drive A: without perceptibly slowing down +the computer at floppy disk accesses. A prerequisite for this, +however, are floppy and hard drive routines that work in the +background. +

+

So that the hard disk driver does not need to make these +functions available, the BIOS of MagiC contains all the required +functions. Via the MagX cookie (component hddrv_functions) one +obtains access to the following structure, which contains pointers to +the important routines of the background-DMA: +

+
typedef struct
+{
+    LONG dma_begin ( VOID);
+    LONG dma_end   ( VOID );
+    LONG dma_wait  ( d0 = LONG ticks_200hz );
+    LONG ncr_begin ( VOID );
+    LONG ncr_end   ( VOID );
+    LONG ncr_wait  ( d0 = LONG ticks_200hz );
+} HDFUNCS;
+
+

Note: Directly before the structure (2 bytes before) +lies a WORD that gives the length of the table in LONGs (in this case +6). All of the 6 pointers lie in the system variables region and may +be changed in case of need. The internal functions for the floppy +drive also jump via the 6 pointers. Important: The +hddrv_functions pointer in MagX cookie may not be altered! +

+

At boot-time the preemptive multitasking is switched off +(actually the multitasking itself is switched off) but the routines +also work before installation of the AES, whereby the wait routines +then do a 'busy waiting' (as they do when switching off the preemptive +multitasking), and the semaphore routines simply do nothing (apart +from setting and clearing flock). +

+

This hypertext contains extracts from MagiC's BIOS that should demonstrate how the +whole thing works. A few words about this: +

+
    +
  • The routines acsi_xxx are both for ACSI and FDC, i.e. dma_begin +sets flock, dma_end clears it again +
      +

  • +
  • The routines ncr_xxx are for TT-SCSI +
      +

  • +
  • The functions xxx_begin reserve the relevant semaphores. The +following applies for the return values: +
      +

    +

    + + + + + + + + + + + + +
    ValueMeaning
    -1Semaphore is already in possession
     0Ok
    +
    + +
    Apart from d0, the routines do not alter any registers +
      +

  • +
  • The functions xxx_end release the semaphores again; here too no +registers are altered +
      +

  • +
  • dma_wait waits for an interrupt of the ACSI-DMA (or FDC) +controller; ncr_wait is for the SCSI bus of the Atari-TT. The +following applies for the return values: +
      +

    +

    + + + + + + + + + + + + + + + + +
    ValueMeaning
    -2Bus error (interrupt of TT-SCSI)
    -1Timeout
     0Ok
    +
    + +

  • +
+ +

See also: About the BIOS   About the GEMDOS   MagiC's +XFS-concept +

+
+ +Home +MagiCMagiC +Special error-messages in MagiCSpecial error-messages in MagiC +Iconification in MagiCIconification in MagiC + + diff --git a/en/magic_driveu.html b/en/magic_driveu.html new file mode 100644 index 000000000..c7c1b4d6d --- /dev/null +++ b/en/magic_driveu.html @@ -0,0 +1,347 @@ + + + + + +The documentation for TOS: The drive U: in MagiC + + + + + + + + + +Home +MagiCMagiC +Iconification in MagiCIconification in MagiC +Make-up of the MAGX.INF fileMake-up of the MAGX.INF file + +
+ +

11.11 The drive U: in MagiC

+

Under MagiC, a drive U: is created during the DOS initializtion. +So that its existence is recognized by current programs, the relevant +bit in _drvbits is set; however, no corresponding BIOS drive exists. +

+

+

Within the pseudo-drive, there are some special directories, +namely: +

+ + +

In contrast to MiNT, however, these are not special filesystems, +but just subdirectories of the DFS for Drive U:. Depending on the +particular subdirectory, the U-DFS creates various file-types and +-drivers. As the directory control is encumbent on the DOS_XFS, write +accesses to a workstation, for instance, are logged in the directory +by the file date-stamp. This even goes so far that a write access to +the root of drive A: alters the file date-stamp of U:\A automatically. +

+

All directories are restricted to a maxium of 32 entries at +present, and Dfree calls only return the value NULL. In the root +directory one can create, besides existing files, only symbolic links +(via Fsymlink). +

+

Before every access to drive U:, newly added drives will be +added via symbolic links, or no longer existing ones removed; this is +recognized via _drvbits. A symbolic link for drive X: is registered as +standard under the name U:\X, and points to the directory X:\. +Symbolic links can be renamed or deleted (even a renamed link will be +deleted if the relevant bit in the system variables _drvbits is +cleared). +

+

Warning: MiNT does not incorporate the drives as +symbolic links, so one can set down the following command order: +

+ + + + + + + + + + + + + + + +
Dsetdrv U: +
Dsetpath U:\A +
Dgetpath ==> U:\A +
Dsetpath .. +
Dgetpath ==> U:\ + +
+ +

With a symbolic link, on the other hand, one really changes the +path, i.e. in the third line A:\ appears as the current path. To +overcome this problem, there is special treatment in the kernel which +enable the above control order in MagiC as well. However there is a +problem with this: The symbolic link may not be renamed, as otherwise +the following happens: +

+ + + + + + + + + + + + + + + + + + +
Frename U:\A U:\FLOPPY +
Dsetdrv U: +
Dsetpath U:\FLOPPY +
Dgetpath ==> U:\A +
Dsetpath .. +
Dgetpath ==> U:\ + +
+ +

Because all file functions on U: work in exactly the same way as +on a floppy disk, it is possible to rename directories such as U:\DEV. +Warning: This should be avoided if at all possible, since +otherwise user programs will not be able to find their device drivers. +

+

See also: About the BIOS   About the GEMDOS   MagiC's +XFS-concept   Test for pipes +

+

11.11.1 The directory U:\DEV

+

In this directory the device drivers are entered. We are dealing +here with pseudo-files, which are only known to DOS but not the +BIOS. +

+

+

The well-known device names too are found in this directory, as +the following apply: +

+
    +
  • CON: (Handle -1) ==> U:\DEV\CON +
  • +
  • AUX: (Handle -2) ==> U:\DEV\AUX +
  • +
  • PRN: (Handle -3) ==> U:\DEV\PRN +
  • +
  • NUL: (Handle -4) ==> U:\DEV\NULL +
  • +
+ +

Because the devices installed here can be accessed with the +normal GEMDOS file functions, it is possile to output a text document +to a printer simply by saving with Fwrite, for instance. Filenames +such as CON: are converted automatically by the kernel into the +correct form (in this case: U:\DEV\CON). +

+

Depending on the computer model, the following devices are +available by default: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Device Description +
    +
AUX BIOS device 2 +
CON Console +
LAN BIOS device 7, generally SCC, channel A +
MIDI BIOS device 3; with output status on the other hand the +device with the index 4 +
MODEM1 BIOS device 6, generally the serial port realised with the +ST-MFP, on the Falcon030 the SCC with channel B +
MODEM2 BIOS device 7, generally SCC, channel B +
NULL Empty pseudo-file, always returns during writing the status OK +and during reading the value EOF (no character available) +
PRN BIOS device 0, during output it will abort at a timeout +
SERIAL1 BIOS device 8, generally the TT-MFP +
SERIAL2 BIOS device 9, generally SCC, channel A + +
+ +

Apart from CON:, all devices operate in 'raw-mode', which means +that control sequences such as [Control]-[C] are ignored. +

+

Further devices can be created and entered at any time with +Dcntl; due to the incompatible driver format, however, one must use +the opcode DEV_M_INSTALL and not the otherwise usual DEV_INSTALL. The +devices present can be renamed and deleted with the usual methods; in +contrast to MiNT, the deletion of a device is performed via the device +driver itself, which withdraws from the relevant system vectors and +releases the occupied memory or can terminate itself. A further +difference to MiNT is that MagiC makes the full functionality of the +DOS filesystem available, i.e.: +

+
    +
  • No more than one device with the same name may exist +
  • +
  • Write accesses are monitored by changes of the file date-stamp +
  • +
  • Write-protected devices may not be written to, deleted or +renamed +
  • +
+ +

Note: With Fcreate one can not create files here; however +it is possible to create symbolic links with Fsymlink. +

+

See also: About the BIOS   About the GEMDOS   MagiC's +XFS-concept +

+

11.11.2 The directory U:\PIPE

+ +

In this directory pipes are stored; these are temporary files +that are used particularly for data exchange between processes. +

+

One differentiates between unidirectional and +bidirectional pipes: the former allow data to flow only in one +direction, the latter can transmit in both directions, though not +simultaneously. Bidirectional pipes are used in the Drag&Drop +protocol, for instance. Pipes return when reading via Fread basically +EOF (End Of File) if they are empty or if no +write process is present. Similarly, during writing with Fwrite the +value EOF is returned if no read process is present. +

+

The access for this is purely asynchronous, i.e. aplications +wait for the read or write, and awake another application again if +necessary. Pipes are deleted automatically when the last program using +them has closed the file that represents them. +

+

Note: MagiC supports a maximum of 32 pipes +simultaneously. An Fseek on pipes leads basically to the return value +of 0L, i.e. the file pointer cannot be influenced. In directories, +pipes appear with a length of 2 or 4k and the date of their creation. +If an ID > 31 is returned on opening of a pipe, the system function +Fselect cannot be used. +

+

In addition, as of MagiC 3 the following is to be +heeded: +

+
    +
  • Pipes with mode 4 (pseudo-TTYs) are not supported. MagiC knows +only uni- and bidirectional pipes and for mode 4 creates a +bidirectional pipe. The main reason for pipes at present is the +Drag&Drop protocol. +
      +

  • +
  • Pipes return for Finstat/Foutstat the number of bytes present +or still free in the block +
      +

  • +
  • If a pipe is closed, then all waiting programs are awakened, to +prevent any possible deadlocks +
      +

  • +
+ +

See also: +
Fcreate   Fread   Fwrite   Fclose   Fpipe   Test for pipes +

+

11.11.3 The directory U:\PROC

+ + + +

This directory gives an oveview of the processes currently +active in the system. Each entry consists of the following components: +

+
    +
  • The process name +
  • +
  • The process ID (PID) +
  • +
  • The current memory usage +
  • +
  • Date and time of creation of the process +
  • +
+ +

+

In the above illustration, for instance, the process +XCONTROL has the PID 4 and occupies 93460 bytes of memory at +present. +

+

Process IDs are allocated at program launch and released again +on termination. The deletion of a file in this directory results in +the corresponding process being destroyed (via the AES program +manager). +

+

Note: The MiNT-conform process attributes (special file +attributes) are not supported by MagiC at present. The name of a +process can be obtained also via the environmental variable +_PNAM; the process ID is found also in the basepage. +

+

See also: GEM   Style guidelines   Task-manager +

+

11.11.4 The directory U:\SHM

+ +

This directory serves as 'storage' for shared memory; so here +one can create files that represent blocks of memory which other +processes may access. +

+

By using shared memory it is very ease to realise +inter-process communication (IPC). +

+

See also: Fcntl   SHMGETBLK   SHMSETBLK +

+
+ +Home +MagiCMagiC +Iconification in MagiCIconification in MagiC +Make-up of the MAGX.INF fileMake-up of the MAGX.INF file + + diff --git a/en/magic_editable.html b/en/magic_editable.html new file mode 100644 index 000000000..464fb2164 --- /dev/null +++ b/en/magic_editable.html @@ -0,0 +1,64 @@ + + + + + +The documentation for TOS: Input fields in MagiC + + + + + + + + + +Home +MagiCMagiC +Notes about MagiC's 3D-lookNotes about MagiC's 3D-look +Scrollable input fieldsScrollable input fields + +
+ +

11.6 Input fields in MagiC

+ +

The input fields in MagiC offer natively many functions which +would otherwise have to be programmed laboriously by hand. Amongst +others these are: +

+
    +
  • Exact cursor positioning with the mouse +
  • +
  • Keyboard shortcuts to move the cursor to the previous/next word +or to the start/end of the line +
  • +
  • Insert/overwrite mode +
  • +
  • Deletion to end of line +
  • +
  • Cut, Copy, Paste +
  • +
  • Input fields with small fonts are possible +
  • +
+ +

The functions for [Help], [Undo], [Shift]-[up-arrow], +[Shift]-[down- arrow] and [Ctrl]-[Q] are contained in form_keybd +(however they are ignored if the relevant object is DISABLED), the +cursor positioning with the mouse is performed by form_do or form_xdo +and objc_edit and the remaining functions by objc_edit. +

+

Those who would like to find delight in the corresponding +functions must use the associated AES calls. +

+

See also: About the AES   GEM   Style guidelines   Scrollable input fields +

+
+ +Home +MagiCMagiC +Notes about MagiC's 3D-lookNotes about MagiC's 3D-look +Scrollable input fieldsScrollable input fields + + diff --git a/en/magic_errors.html b/en/magic_errors.html new file mode 100644 index 000000000..7f5edf2fa --- /dev/null +++ b/en/magic_errors.html @@ -0,0 +1,133 @@ + + + + + +The documentation for TOS: Special error-messages in MagiC + + + + + + + + + +Home +MagiCMagiC +Scrollable input fieldsScrollable input fields +The background-DMA of MagiCThe background-DMA of MagiC + +
+ +

11.8 Special error-messages in MagiC

+

The alternative operating system MagiC has some error-messages +that are not present under normal TOS: +

+ + +

When any of these errors occur, they are displayed directly on +the screen in capital letters. +

+

See also: GEMDOS error-messages   BIOS and XBIOS error-messages +

+

11.8.1 Fatal error while booting

+

Cause: +

+
    +
  • The system has insufficient memory free for initialisation. +
  • +
  • Internal data structures have been destroyed and are therefore +in an inconsistent condition. +
  • +
+ +

Remedy: Reinstall system, remove hard disk driver, boot +from floppy disk, deactivate AUTO-folder. +

+

11.8.2 Fatal error in gemdos

+

Cause: +

+
    +
  • With a Falcon the screen is placed at an invalid address. +
  • +
  • During termination of a process the parent is invalid. +
  • +
  • With a Falcon Srealloc() cannot be performed. +
  • +
  • Internal data structures have been destroyed and are therefore +in an inconsistent condition. +
  • +
+ +

Remedy: Depending on circumstances. +

+

11.8.3 Out of internal memory

+

Cause: The system request to open a file, a directory or +a drive partition can not be executed because the internal memory +blocks are fully occupied. +

+

Remedy: If the problem does not disappear when one +copies ADDMEM two or three times under different names into the +AUTO-folder, then the cause is a user program that, for instance, does +not close files or folders (missing Fclose or Dclosedir). +

+

11.8.4 Memory block destroyed by user program

+

Cause: A user program has overwritten an allocated block +of memory or a 'foreign' block of memory. +

+

Remedy: The user program can not be used under MagiC. +Although it may appear to work under TOS or MultiTOS, its use is risky +as the results are indeterminate. +

+

11.8.5 Fatal error in aes

+

Cause: +

+
    +
  • Insufficient memory free for starting the AES. +
  • +
  • Internal data structures of the AES have been destroyed and +are therefore in an inconsistent condition. +
  • +
  • An invalid object tree was passed to form_button. +
  • +
  • The fixed background memory for menus is insufficient, as a +menu has an inadmissible size. +
  • +
  • VDI device 1 is invalid. +
  • +
+ +

Remedy: Depending on circumstances. +

+

11.8.6 System stack overflow

+

Cause: The system stack of a user program has +overflowed. +

+

Remedy: Compared to TOS the stack in MagiC 3 is many +times larger, so the cause can only be a program running amok or a +defective driver (TSR-program or device driver). Remove faulty +programs! +

+
+ +Home +MagiCMagiC +Scrollable input fieldsScrollable input fields +The background-DMA of MagiCThe background-DMA of MagiC + + diff --git a/en/magic_function.html b/en/magic_function.html new file mode 100644 index 000000000..8b7f5af03 --- /dev/null +++ b/en/magic_function.html @@ -0,0 +1,949 @@ + + + + + +The documentation for TOS: MagiC library + + + + + + + + + +Home +AESAES +List boxesList boxes +Menu libraryMenu library + +
+ +

8.16 MagiC library

+

This library contains special functions, which only available on +MagiC. +

+ + + + + + + + + + + + + + + + + + + + + +
sys_recalc_cicon_colours Passes RGB-triplets in promille for icon conversion in 'direct +colour' screen modes +
sys_set_editob Define edit object +
sys_set_getfn Get AES function +
sys_set_setfn Change AES function +
sys_set_winframe_manager Install a new window-frame manager +
sys_set_getdisp Determine AES dispatcher +
sys_set_appl_getinfo Install function for appl_getinfo + +
+ +

See also: About the AES +

+

8.16.1 sys_set_getdisp

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: Determine AES dispatcher +
  +
Opcode: 0 (sub-opcode 0) +
  +
Syntax: void sys_set_getdisp(void **disp_addr, void **disp_err); +
  +
Description: +
  +
Return value: +
  +
Availability: As of MagiC 5.20 +
  +
Group: MagiC library +
  +
See also: Binding +
  + +
+ +

8.16.1.1 Bindings for sys_set_getdisp

+ + + + + + + + + +
C: void sys_set_getdisp(void **disp_addr, void **disp_err); +
  +
Binding: +
  +
void sys_set_getdisp(void **disp_addr, void **disp_err)
+{
+   int_in[0]  = 0;      /* Subcode 0: determine AES dispatcher */
+
+   crys_if(0);
+
+   *disp_addr = addr_out[0];
+   if (disp_err)
+      *disp_err = addr_out[1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]0 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]2 # Entry in addr_out
int_inint_in[0]0
addr_outaddr_out[0]
+
+ + +
+ +

8.16.2 sys_recalc_cicon_colours

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: ??? +
  +
Opcode: 0 (sub-opcode 5) +
  +
Syntax: void *sys_recalc_cicon_colours( uint16_t colour_values[3*256] +); +
  +
Description: Pass RGB-triplets in promille (1/1000th) for the icon +conversion with 'direct colour' screen modes. +
  +
Only used from MagxDesk. +
  +
Return value: unknown. +
  +
Availability: As of MagiC 5.20 from 20.11.97 +
  +
Group: Resource library +
  +
See also: Binding +
  + +
+ +

8.16.2.1 Bindings for sys_recalc_cicon_colours

+ + + + + + + + + +
C: void *sys_recalc_cicon_colours( uint16_t colour_values[3*256] +); +
  +
Binding: +
  +
void *sys_recalc_cicon_colours( uint16_t colour_values[3*256] );
+{
+   int_in[0]  = 5;               /* Subcode 5: */
+   addr_in[0] = colour_values;
+
+   crys_if(0);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]0 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]5
addr_inaddr_in[0]colour_values
+
+ + +
+ +

8.16.3 sys_set_editob

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: Define edit object. +
  +
Opcode: 0 (sub-opcode 4) +
  +
Syntax: void *sys_set_editob( int16_t cdecl (*editob) (PARMBLK *pb) ); +
  +
Description: +
  +
Return value: unknown. +
  +
Availability: As of MagiC 5.20 +
  +
Group: MagiC library +
  +
See also: Binding +
  + +
+ +

8.16.3.1 Bindings for sys_set_editob

+ + + + + + + + + +
C: void *sys_set_editob( int16_t cdecl (*editob) (PARMBLK *pb) ); +
  +
Binding: +
  +
void *sys_set_editob( int16_t cdecl (*editob) (PARMBLK *pb) )
+{
+   int_in[0]  = 4;      /* Subcode 4: define Edit object */
+   addr_in[0] = editob;
+
+   crys_if(0);
+
+   return ( addr_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]0 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]1 # Entry in addr_out
int_inint_in[0]4
addr_inaddr_in[0]editob
addr_outaddr_out[0]
+
+ + +
+ +

8.16.4 sys_set_getfn

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: AES-Funktion ermitteln +
  +
Opcode: 0 (sub-opcode 1) +
  +
Syntax: AES_FUNCTION *sys_set_getfn( int16_t fn ); +
  +
Description: Es wird ermittelt ob die AES Funktion mit der Nummer fn +vorhanden ist. +
  +
Return value: NULL oder die Adresse der Funktion. +
  +
Availability: MagiC +
  +
Group: MagiC library +
  +
See also: Binding +
  + +
+ +

8.16.4.1 Bindings for sys_set_getfn

+ + + + + + + + + +
C: AES_FUNCTION *sys_set_getfn( int16_t fn ); +
  +
Binding: +
  +
AES_FUNCTION *sys_set_getfn( int16_t fn )
+{
+   int_in[0]  = 1;      /* Subcode 1: AES-Funktion ermitteln */
+   int_in[1]  = fn;
+
+   crys_if(0);
+
+   return ( addr_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]0 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]1 # Entry in addr_out
int_inint_in[0]1
int_in+2int_in[1]fn
addr_outaddr_out[0]
+
+ + +
+ +

8.16.5 sys_set_setfn

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: AES-Funktion ändern +
  +
Opcode: 0 (sub-opcode 2) +
  +
Syntax: int16_t sys_set_setfn( int16_t fn, AES_FUNCTION *f ); +
  +
Description: Setzt die Adresse der AES Funktion mit der Nummer fn +neu. +
  +
Return value: +
  +
Availability: MagiC +
  +
Group: MagiC library +
  +
See also: Binding +
  + +
+ +

8.16.5.1 Bindings for sys_set_setfn

+ + + + + + + + + +
C: int16_t sys_set_setfn( int16_t fn, AES_FUNCTION *f ); +
  +
Binding: +
  +
int16_t sys_set_setfn( int16_t fn, AES_FUNCTION *f )
+{
+   int_in[0]  = 2;      /* Subcode 2: AES-Funktion ändern */
+   int_in[1]  = fn;
+   addr_in[0] = f;
+
+   crys_if(0);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]0 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]2
int_in+2int_in[1]fn
addr_inaddr_in[0]f
addr_outaddr_out[0]
+
+ + +
+ +

8.16.6 sys_set_winframe_manager

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: Install a new window-frame manager +
  +
Opcode: 0 (sub-opcode 6) +
  +
Syntax: int16_t sys_set_winframe_manager( WINFRAME_HANDLER *old_wfh, +WINFRAME_HANDLER *new_wfh, WINFRAME_SETTINGS **set ) +
  +
Description: +
  +
Return value: unknown. +
  +
Availability: As of MagiC 6 +
  +
Group: Window library +
  +
See also: Binding +
  + +
+ +

8.16.6.1 Bindings for sys_set_winframe_manager

+ + + + + + + + + +
C: int16_t sys_set_winframe_manager( WINFRAME_HANDLER *old_wfh, +WINFRAME_HANDLER *new_wfh, WINFRAME_SETTINGS **set ); +
  +
Binding: +
  +
int16_t sys_set_winframe_manager( WINFRAME_HANDLER *old_wfh,
+            WINFRAME_HANDLER *new_wfh,
+            WINFRAME_SETTINGS **set )
+{
+   int_in[0]  = 6;      /* Subcode 6: Window-frame manager */
+   addr_in[0] = old_wfh;
+   addr_in[1] = new_wfh;
+
+   crys_if(0);
+
+   *set = addr_out[0];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]0 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]1 # Entry in addr_out
int_inint_in[0]6
addr_inaddr_in[0]old_wfh
addr_in+4addr_in[1]new_wfh
int_outint_out[0]return value
addr_outaddr_out[0]set
+
+ + +
+ +

8.16.7 sys_set_appl_getinfo

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: Install function for appl_getinfo. +
  +
Opcode: 0 (sub-opcode 3) +
  +
Syntax: AES_FUNCTION *sys_set_appl_getinfo( AES_FUNCTION *f ); +
  +
Description: +
  +
Return value: Previous function for appl_getinfo. +
  +
Availability: As of MagiC 5.20 +
  +
Group: MagiC library +
  +
See also: Binding +
  + +
+ +

8.16.7.1 Bindings for sys_set_appl_getinfo

+ + + + + + + + + +
C: AES_FUNCTION *sys_set_appl_getinfo( AES_FUNCTION *f ); +
  +
Binding: +
  +
AES_FUNCTION *sys_set_appl_getinfo( AES_FUNCTION *f )
+{
+   int_in[0]  = 3;      /* Subcode 3: define Edit objcet */
+   addr_in[0] = f;
+
+   crys_if(0);
+
+   return ( addr_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]0 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]1 # Entry in addr_out
int_inint_in[0]3
addr_inaddr_in[0]f
addr_outaddr_out[0]
+
+ + +
+ +
+ +Home +AESAES +List boxesList boxes +Menu libraryMenu library + + diff --git a/en/magic_iconify.html b/en/magic_iconify.html new file mode 100644 index 000000000..c568b86ad --- /dev/null +++ b/en/magic_iconify.html @@ -0,0 +1,55 @@ + + + + + +The documentation for TOS: Iconification in MagiC + + + + + + + + + +Home +MagiCMagiC +The background-DMA of MagiCThe background-DMA of MagiC +The drive U: in MagiCThe drive U: in MagiC + +
+ +

11.10 Iconification in MagiC

+

MagiC (from Version 3.0 onwards), like MultiTOS, permits the +iconification of windows. One should note the following for this: +

+ +

The algorithm for setting the position of the iconified windows +works in a different way to MultiTOS; MagiC searches through the +current positions of already iconified windows and places the new +window in a free position. A position is free only if it does +not intersect with the new position. +

+ + +

The AES explicitly sends a redraw message during +un-/iconification, even if the size has not altered. The +iconified window has as its components only a Mover and a title. Its total +size comprises (as under MultiTOS) 72x72 pixels in all. This size +should however not be taken as fixed; it could possibly change in +later versions. For this reason the size of an iconified window should +be obtained from the WM_ICONIFY message, or with wind_get(WF_ICONIFY). +

+

See also: wind_get   wind_set   WM_ICONIFY   WM_ALLICONIFY   +WM_UNICONIFY   Shortcuts +

+
+ +Home +MagiCMagiC +The background-DMA of MagiCThe background-DMA of MagiC +The drive U: in MagiCThe drive U: in MagiC + + diff --git a/en/magic_magxinf.html b/en/magic_magxinf.html new file mode 100644 index 000000000..70d42f496 --- /dev/null +++ b/en/magic_magxinf.html @@ -0,0 +1,574 @@ + + + + + +The documentation for TOS: Make-up of the MAGX.INF file + + + + + + + + + +Home +MagiCMagiC +The drive U: in MagiCThe drive U: in MagiC +Semaphores in MagiCSemaphores in MagiC + +
+ +

11.12 Make-up of the MAGX.INF file

+ +

With the MAGX.INF file one can make settings that influence +MagiC's behaviour. The following apply: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Entry Meaning +
  + +
#_ACC Desk accessories are loaded from the path specified in this +line; if the line is missing, they will be loaded from the current +directory of the boot drive, i.e. generally from the root directory. +
  + +
#_APP The directory for launching the 'AUTO applications' can be +specified with this line. The programs present here are then loaded +before the launch of the shell and are available more-or-less +immediately; the programs are launched in the graphics mode. +Warning: One should only place programs here that are moderate +in their memory usage; if one loads, say, WORDPLUS in this manner then +no other program can be loaded any more unless one had limited its +memory hunger by using LIMITMEM.TTP (a utility supplied with MagiC). +
  + +
#_AUT Specifies the program that is to be loaded and launched (in +graphics mode) automatically in place of the desktop or the default +shell at system startup. Only when the application specified here +terminates itself and has not specified a successor with shel_write, +will the desktop or the default shell be launched; the entry is thus +practical particularly for a 'login program' in networks. +
  + +
#_BKG With this entry one can specify the colour and fill-pattern of +the default desktop background by entering a number num. For +instance num = 120 (== 0x78) results in light grey; here 0x70 +is the fill-pattern (7=fully filled) and 8 is the colour. Thus the +code corresponds to the value that sets the appearance of a filled +rectangle in the AES object G_BOX. +
  +
From MagiC 5.20 onwards. +
  + +
#_BUF Sets the size of the shell-buffer; this has to be variable so +that any shell can accommodate its data. The size may not +exceed 65535; at least 4192 bytes are reserved in all cases. A program +can obtain the size of this buffer with shel_get. A value that is too +small means that not all of the data can be saved. +
  + +
#_CTR This entry marks the end of the MagiC variables, and serves as +an identifier that the following data (of the control field or +desktop) are adopted directly in the shell buffer. +
  + +
#_DEV Determines the device number for the VDI; the device number +is not evaluated if the system has just been restarted for a +resolution change. If the VDI returns an error-code on opening of +the workstation, then a re-start will be made with device number 1 +(current resolution). The usual resolutions of ST/TT are: +
  +

+
+ + + + + + + + + + +
2 = ST-Low,3 = ST-Medium,4 = ST-High
6 = TT-Medium,8 = TT-High,9 = TT-Low
+
+ +
Further ones depend on the device drivers that were declared in +the ASSIGN.SYS file. As of MagiC 4, the above-mentioned number must be +followed by a further one that describes the Falcon030 resolution +modes. This second number must be included, as otherwise the +MAGX.INF file will not be read. +
  + +
#_DRV No longer present from Mag!X 2.0 onwards. +
  + +
#_ENV With this entry one can define the environmental variables. As +the character strings are adopted up to the end of the line, there may +be no comments at the end of an #_ENV line (this is necessary to allow +semicolons or spaces in the environment string, for instance). The +environment passed by the BIOS will be used by the AES, and +passed on, when no #_ENV line has been entered. +
  + +
#_FLG Determines various MagiC settings. The value included here is +taken to be a bit-vector, and interpreted as follows: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Bit-0 = Position of the MagiC logo (set ==> left); +
from Mag!x 2.0 onwards +
Bit-1 = Activation of the 3D-look (set ==> 3D off); +
from MagiC 3.0 onwards +
Bit-2 = Display Backdrop button? (set ==> no); +
from MagiC 3.0 onwards +
Bit-3 = Window name in 3D-look? (set ==> no); +
from MagiC 4.0 onwards +
Bit-4 = 3D font in window title? (set ==> no); +
from MagiC 4.0 onwards +
Bit-5 = Use realtime scrolling? (set ==> no); +
from MagiC 4.02 onwards +
Bit-6 = Use realtime sizing and moving? (set ==> no); +
from MagiC 5.10 onwards +
Bit-7 = Use 3D menus? (set ==> yes); +
from MagiC 6.00 onwards + +
+ +
Note: If this entry is missing then all flags will be +taken to be 0. If bit 2 is set, then a backdrop can be performed by a +short click on the name field of an active window. +
  + +
#_FSL This entry allows settings for MagiC's file-selector. First +comes a flag which is ignored at present and so should be 0. Next +follows a character string of possible file-type masks, separated by +';'. Double masks are separated from each other by ',' (e.g. +'*.PRG,*.APP' or '*.JPG,*.JPEG'). +
  +
From MagiC 5.10 onwards. +
  + +
#_HDV No longer present from Mag!x 2.0 onwards. +
  + +
#_INW This entry permits changing the appearance of the INFO line in +all windows. There are 4 parameters on the line, which represent in +turn: +
  + + + + + + + + + + + + +
lineh Line height; a height of 0 means standard height +
fontID Font ID for the INFO line; a 0 here means the same font as that +for the large AES text +
monoFlag 1 (equidistant) or 0 (proportional) +
fontH Font height for vst_height + +
+ +
From MagiC 6.00 onwards. +
  + +
#_MAG This entry is reserved, and currently serves as a pure comment. +
  + +
#_OBS The height of a resource unit of measure can be set as of MagiC +5.20 independently of the large AES font. Specially with vector +fonts one should enter a fixed 8*16 raster here so as not to confuse +user programs. +
Syntax: #_OBS <horizontal raster> <vertical raster> 0 +0 +
  +
From MagiC 5.20 onwards. +
  + +
#_SCP Sets the full path for the GEM clipboard (e.g. C:\CLIPBRD\); +here one should always specify an existing directory, since it will be +undefined otherwise. +
  + +
#_SHL Contains the full path of the default shell, which will be +launched after processing the #_AUT entry, if appropriate. The shell +is always launched in graphics mode. If this entry is missing, then +MAGXDESK will be launched. +
  + +
#_SLB Here one can load any number of shared libraries, with each +listed on a separate line starting with '#_SLB'. These are loaded when +the AES starts, and freed again at termination or a resolution change. +
Some of these (WINFRAME) alter the properties of the AES (as a +sort of system extension), others (PDLG, EDITOBJC) can be 'reserved', +so if a program calls Slbopen, for instance, the libraries do not have +to be specially loaded in; this is sensible if one has sufficient +memory or a slow storage medium (loading in of an SLB costs time). +
  +
From MagiC 6.00 onwards. +
  + +
#_TRM Contains the program name and complete path for the program +that performs redirection of TOS programs to windows. When +launching the first TOS program, the program specified here is +automatically loaded into memory beforehand (if it has not been loaded +previously). +
  +
From Mag!x 2.0 onwards. +
  + +
#_TSL Controls the distribution of CPU time between foreground and +background processes. The fist value yields the length of a timeslice +in multiples of 5 ms, the second the background priority: '32' means a +priority of 1:32 for background processes. If any statement is +missing, the preemptive multitasking is deactivated and cooperative +multitasking is activated. The value defined here can also be set with +the bundled configuration ACC/CPX. +
Tip: In case of boot problems, it is recommended that this +command is removed from the MAGX.INF file and the settings performed +with the CPX module; in that case the boot phase runs in cooperative +mode (so task-switching only takes place when the currently running +program makes a system call), which usually avoids any timing +problems. +
  +
From Mag!x 2.0 onwards. +
  + +
#_TXB +
  +
#_TXS From MagiC 5.20 onwards, the font and its height may be set +separately for the small and large AES font. One has to +specify here whether the font is proportional or monospaced. +Proportional fonts work as of MagiC 6. Syntax for the large +
font is: #_TXB <fontID> <monoFlag> +<pixelHeight>, and for the small font: #_TXS <fontID> +<monoFlag> <pixelHeight>. +
  +
As of MagiC 5.20. +
  + +
#_TXT Sets the font and text height of the AES font; the format +is: <Height of large font> <height of small font> <font +ID>. The font height is set by the AES with vst_height; a height +of 0 denotes standard settings; font ID 1 is the system font. +
  +
As of Mag!X 2.0, additional parameter; no longer present from +MagiC 6.00 onwards. +
  + +
#_WND Sets the maximum number of windows that may be managed. Valid +values are between 0 and 64; however, you shouldn't use a value < +16. If this entry is missing, then a value will be taken as 16. +Hint: When using MGNOTICE, enter at least 30. +
  +
From Mag!X 2.0 onwards. +
  +
#[aes] The information for the AES begins with the line following +this command; the lines relevant to the AES all start with '#_???' +and come before the line #[shelbuf]. If this section identifier is not +found, then one will be assumed implicitly before the first line. +
  +
From MagiC 5.01 onwards. +
  +
#[boot] From this section identifier onwards, the following values are +evaluated before the start of the AES. The section includes the +number of cookies, the log-file, and tiles plus logo image to be used +for the background during booting (see below). +
  +
From MagiC 6.00 onwards. +
  +
#[shelbuf] With this section identifier, the AES section ends. +
  +
From MagiC 6.00 onwards. +
  +
#[vfat] With this entry one can specify the drives that are to support +long filenames in Windows95 format; the entry can be seen as an +alternative to the program VFATCONF. The line following this entry +must start with the keyword drives=, and contains a listing of +the drive partitions that are to support long filenames. +Example: drives=cdef. For each drive specified in this way an +unmount is perfomed first, so that it is possible to use long +filenames on boot drives as well. +
  +
From MagiC 5.01 onwards. +
  +
aux The GEMDOS standard files can now be redirected also to BIOS +devices that lie in u:\dev: Example: aux=u:\dev\modem +
  +
As of MagiC 6.20. +
  +
biosdev Definition of the BIOS devices. As without changes to the +MAGX.INF a few filenames in u:/dev will be missing from MagiC 6.20 +onwards, herewith a few examples for various computer types that are +to be inserted: +
  +
Atari ST:
+biosdev=3,u:\dev\midi
+biosdev=6,u:\dev\modem1
+
+Atari Mega-STE:
+biosdev=3,u:\dev\midi
+biosdev=6,u:\dev\modem1
+biosdev=7,u:\dev\modem2
+biosdev=8,u:\dev\serial2
+
+Atari TT:
+biosdev=3,u:\dev\midi
+biosdev=6,u:\dev\modem1
+biosdev=7,u:\dev\modem2
+biosdev=8,u:\dev\serial1
+biosdev=9,u:\dev\serial2
+
+Atari Falcon:
+biosdev=3,u:\dev\midi
+biosdev=6,u:\dev\modem1
+biosdev=7,u:\dev\lan
+
+Mac:
+(None)
+
+
As of MagiC 6.20. +
  +
cookie Determines the number of cookies in the cookie jar. By default +at least 20 cookies are always installed. +
  +
From MagiC 6.00 onwards. +
  +
con The GEMDOS standard files can now be redirected also to BIOS +devices that lie in u:\dev: Example: con=u:\dev\console +
  +
As of MagiC 6.20. +
  +
image Draws a logo in the centre of the screen. +
  +
From MagiC 6.00 onwards. +
  +
log The BIOS outputs of the AUTO folder are intercepted and +written to the specified log-file. You can also put u:\dev\null here +in order to suppress the output completely. +
  +
From MagiC 6.00 onwards. +
  +
prn The GEMDOS standard files can now be redirected also to BIOS +devices that lie in u:\dev: Example: prn=u:\dev\prn +
  +
As of MagiC 6.20. +
  +
titel Before executing the AUTO folder, the screen can be tiled +first. +
  +
From MagiC 6.00 onwards. +
  + +
+ +

Note: Lines starting with a semicolon are ignored, and +so can be used for comments. From MagiC 5 onwards, a faulty +line found when evaluating the MAGX.INF file will be displayed on the +screen; but as the AES has not yet been initialized at this point +in time, the output cannot be made to a dialog box. +

+

See also:: Example of a MAGX.INF file   MagiC   Style guidelines +

+

11.12.1 Example of a MAGX.INF file

+
#_MAG MAG!X V6.20
+#[boot]
+
+cookies=50
+log=c:\log\magic.log
+
+tiles=C:\GEMSYS\GEMDESK\PAT\16\PAT27.IMG
+image=C:\GEMSYS\GEMDESK\PAT\256\MAGIC.IMG
+
+;Atari TT:
+biosdev=3,u:\dev\midi
+biosdev=6,u:\dev\modem1
+biosdev=7,u:\dev\modem2
+biosdev=8,u:\dev\serial1
+biosdev=9,u:\dev\serial2
+
+con=u:\dev\console
+aux=u:\dev\modem
+prn=u:\dev\prn
+
+#[vfat]
+drives=ag
+#[aes]
+
+#_DEV 1 0
+#_FLG 0
+#_WND 40
+
+#_SCP C:\CLIPBRD\
+#_TRM c:\gemsys\gemdesk\vt52.prg
+#_ACC c:\acc\
+#_APP C:\APPS\
+
+#_ENV AVSERVER=JINNEE
+#_ENV SHELL=d:\desktop\gemini\mupfel.ttp
+
+#_SLB 0 WINFRAME.SLB
+#_SLB 0 PDLG.SLB
+
+#_SHL d:\desktop\jinnee\jinnee.app
+
+#[shelbuf]
+#_CTR
+#a000000
+#b000000
+#c7770007000600070055200505552220770557075055507703111103
+#d                                            ;
+#_DSK MAGXDESK V5.02 1
+
+

See also: MagiC   MAGX.INF file +

+
+ +Home +MagiCMagiC +The drive U: in MagiCThe drive U: in MagiC +Semaphores in MagiCSemaphores in MagiC + + diff --git a/en/magic_programs.html b/en/magic_programs.html new file mode 100644 index 000000000..2544eeb01 --- /dev/null +++ b/en/magic_programs.html @@ -0,0 +1,367 @@ + + + + + +The documentation for TOS: Additional programs for MagiC + + + + + + + + + +Home +MagiCMagiC +Threads in MagiCThreads in MagiC +MagiC's DFS-conceptMagiC's DFS-concept + +
+ +

11.19 Additional programs for MagiC

+

On the MagiC floppy there are also a number of programs for +various purposes. In detail: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Program Meaning +
  + + +
ADDMEM Corresponds to FOLDR100 required for TOS, and makes +additional memory available to the system for internal management of +the data. The installation of this program is not mandatory, +but whould be undertaken if the message 'Out of internal memory' +appears. +
  + +
APPLICAT This program is, to some extent, an offloaded function of the +MagXDesk desktop and hence should only be called by the latter; in +particular it is not suited for direct launching with a double-click +on the program icon. It enables the allocation of icons to files, as +well as the installation of applications for certain file-types. +
  + + + +
FLP_PAR With this pair of programs one can configure parallel operation +of the floppy drive. The following apply: +
  + + + + + + +
FLP_PAR0 = Switch off parallel operation +
FLP_PAR1 = Switch on parallel operation + +
+ +
(No longer included with MagiC 5 onwards.) +
  + + +
HARDCOPY The internal hardcopy routine for 9-pin Epson printers has been +thrown out of the BIOS. Instead of the [Alt]-[Help] routine, Scrdmp +and Prtblk, only dummy routines remain. +
  +
The included HARDCOPY.PRG program installs the hardcopy +functions previously integrated in the BIOS. The program can be +launched only under MagiC. Warning: It has no inquiry +function for the MagiC version and may not be launched under +MagiC Version 2.0 or older 3.0 versions. +
  + + +
MAGXBOOT The program is included in two versions (magxboot.prg and +magxboot32.prg). The version of the program suitable for your system +is copied to the AUTO folder and launches or installs MagiC at +booting; hence it should lie as early as possible in the AUTO folder, +so that all other programs are informed that MagiC is running. In +addition booting then goes faster, as after a cold start magxboot then +performs an additional warm start. +
  +
The difference between the two launch programs is that +magxboot32 loads the file 'magic.ram' into memory in such a way that +it can be protected with Outside.prg (a virtual memory management +application), magx2rom etc. from being overwritten by any programs +that may run amok. However, this works only on computers with a 68030 +and up processor and PMMU, such as the TT030 and Falcon030 series. +
  + +
MAGXCONF The CPX module or desk accessory permits the configuration of +several features of MagiC. In detail: +
  + + + + + + + + + + + + + + + + + + + +
Fastload +
This switches on fast reading of floppy disks; as it does not +affect writing, it can really be left switched on permanently. + +
TOS-compatibility +
Due to the fact that MagiC can allow several programs to run +simultaneously, one has to take strict safety precautions. +Unfortunately there are still programs that make faulty system calls, +which can give rise to problems during multitasking in some +circumstances. On the other hand some programs rely on errors in +TOS and so do not run correctly if they were launched under MagiC. +Thus some of these safety precautions may be switched off to persuade +such programs to cooperate - as this naturally compromises operational +safety, such programs should be swapped as quickly as possible for +compliant newer versions or alternatives. + +
Smart redraw +
(De-)activates the faster screen buildup under MagiC. Some +(mostly older) programs rely on certain properties of TOS during +window redraws, that (because they are unnecessary or faulty) no +longer exist under MagiC. To persuade such programs to cooperate, the +more elegant Smart redraw mechanism of MagiC can be switched off. + + +
Grow- and Shrink Boxes +
This can switch on or off the growing and shrinking rectangles +that appear in some programs before the opening/closing of windows and +dialogs. Switching them off can lead to small speed gains on some +computers, but has no other repercussions. + +
Floppy Background DMA +
With this switch the background operation of the floppy drive can +be switched on or off. When switched on, you can perform other tasks +while using read, write or format operations on the floppy. STs and +Falcon030s need a suitable hard disk driver (such as HDDRIVER) with +this capability. + + +
Pulldown menus +
If this switch is active then the menus only drop down after being +clicked on with the mouse, so no longer open undesirably when brushed +accidentally with the mouse pointer, say during movement of a window. +This behaviour is known from the Apple Macintosh, for instance. + +
+ + +
MGCOPY This program is, to some extent, an offloaded function of the +MagXDesk desktop and hence should only be called by the latter; in +particular it is not suited for direct launching with a double-click on the +program icon. The program takes on the copying and moving of files and +folders; the makeup of the command line or the format of the sent +messages is not documented, and hence can alter at any time. +
  + + +
MGFORMAT With this program one can format floppy disks, and do this +without blocking the computer while this is done. For the +creation of the boot sector, incidentally, Protobt is not used any +more; for 720k floppies an MSDOS format having 730,112 bytes free is +created. +
  + +
MGSEARCH This program is, to some extent, an offloaded function of the +MagXDesk desktop and hence should only be called by the latter; in +particular it is not suited for direct launching with a double-click on the +program icon. The tool represents a file searcher, somewhat like the +one that is built into the TOS 2.06 desktop. This module too is +not, or only conditionally, suited for direct launch with a +double-click on the program icon, as the drives to be searched through +are set in the desktop and with a direct launch only the current drive +will be searched. +
  + +
SHUTDOWN This is the program normally called from the desktop when you +select the Shutdown menu entry (or activate the key +combination [Alternate]-[Control]-[Delete]), which ensures that all +applications still running save their data and then terminate. +
  + +
The file SHUTDOWN.INF serves as the configuration file +for this program, and, besides comments (introduced with the character +'#') contains the following commands: +
  +
    +
  • ignore <prg>: For uncritical old programs. These +are not warned by SHUTDOWN, so that a rundown of the system is +possible nevertheless. Caution: Programs such as these do not +save their data, so it can be sensible to terminate them manually in +individual cases (before the system is closed down). +
  • +
  • terminate <prg>: Special case for XCONTROL. +Programs itemized in this way will be 'force terminated'; for data +safety the same applies as for ignore above. +
  • +
  • timeout <time>: Maximum reaction time for modern +programs. A value of 0 means 'wait for ever'. +
  • +
+ + + + +
TSLICE With this CPX module one can first of all switch off the +preemptive multitasking, after which the system operates in +cooperative multitasking (when tasks are switched only when the +currently running program makes a system call). Secondly, one can set +here the timeslice length as well as the background priority. +
  +
To visualise preemptive multitasking, imagine a clock with its +clock-face divided into a number of equally-sized pie-slices, which +are then distributed amongst the running programs. The parameter +Timeslice length then determines the size of the pie-slices; +if one selects a small value, changes will take place more frequently, +which of course costs time but divides the allocated CPU-time more +evenly; if one selects a large value, then the calculating process is +interrupted less often, but the individual programs also must wait +longer before they are re-allocated a pie-slice, which in extreme +cases can cause judder in scrolling, for instance. +
  +
The parameter Background priority determines how many +more pie-slices the program owning the topped window receives, since +this is manifestly the one currently in use and so should react faster +than any of the programs running in the background. +
  +
In practice a timeslice length of 5-10ms (milliseconds) and a +background priority of 1:20 to 1:32 have proved to be suitable. +Incidentally, these values can also be set with the '#_TSL' entry +directly in the MAGX.INF file. +
  + + +
VFATCONF With this program one can determine on which hard drive +partitions long filenames in the VFAT format of Windows95 should be +supported. The program works from MagiC Version 4.02 of 16.02.96 +onwards. Further details about VFATCONF can be obtained from the +original MagiC documentation. +
  + + +
WBDAEMON The writeback-demon is a program that delays the write accesses +of all running applications to hard or floppy disks until the CPU is +not being used intensively; further changes of data do not have to be +written to disk but can be read directly from the (much faster) +volatile memory cache in the computer. Only if no further changes are +being made for a certain time will the disk be updated in one go, so +noticeably speeding up the system. To install, copy the WBDAEMON.PRG +into the \GEMSYS\MAGIC\START folder and reboot the system. +
  +
Using the writeback-demon is now safe in principle, since it can +no longer be frozen. Previously the launch of a single-tasking +application always resulted in the WBDAEMON being frozen and until it +was unfrozen the cache was not written back. Just make sure not to +eject floppy disk or interchangeable hard drive media before writing +has been completed (normally 2 seconds after the last access), and +always use the SHUTDOWN procedure rather than simply switching off the +computer when you finish your work. +
  +
In contrast to Ataris where this program is only optional, its +use on a Macintosh is explicitly recommended; this is because +on this platform it increases both the speed and data safety +of the filesystem. +
  + +
WDIALOG This program is a system extension making MagiC-compatible +AES extensions (such as window- and print- dialogs, list boxes, font selection +available under some older operating systems as well. The program is +installed by copying WDIALOG.PRG into the AUTO folder and re-booting the +system. From experience it is recommended that the AUTO folder has +WDIALOG lying before NVDI. +
  + + +
XMEN_MGR This program arose for compatibility to the extended menu +functions of MultiTOS and hence need only be used when required. It +installs the following functions: +
  + + +
The function appl_getinfo returns the value TRUE for the +relevant subfunctions when this program is installed. +
  + +
+ +

See also: MagiC   GEM   Style guidelines +

+
+ +Home +MagiCMagiC +Threads in MagiCThreads in MagiC +MagiC's DFS-conceptMagiC's DFS-concept + + diff --git a/en/magic_scroll.html b/en/magic_scroll.html new file mode 100644 index 000000000..41bcc8a37 --- /dev/null +++ b/en/magic_scroll.html @@ -0,0 +1,214 @@ + + + + + +The documentation for TOS: Scrollable input fields + + + + + + + + + +Home +MagiCMagiC +Input fields in MagiCInput fields in MagiC +Special error-messages in MagiCSpecial error-messages in MagiC + +
+ +

11.7 Scrollable input fields

+
/*******************************************************************
+*
+* This sample program demonstrates the use of scrollable
+* input fields in MagiC 3.
+*
+*******************************************************************/
+
+#include <aes.h>
+#include <tos.h>
+#include <string.h>
+#include <magx.h>
+#include "magxlib.h"
+#include "edscroll.h"
+
+#define TLEN  30
+
+int  do_dialog    (OBJECT *dialog);
+
+void main()
+{
+  OBJECT *adr_dialog;
+  ULONG crdate;
+  int is_scroll;
+
+  XTED xted;
+  char tmplt[TLEN+1],txt[TLEN+1];
+
+
+  /* Check whether the system can scrolledit */
+  /* ------------------------------------------ */
+
+  is_scroll = ((0 < get_MagiC_ver(&crdate)) &&
+    (crdate >= 0x19950829L));
+
+     /* Register application with the AES */
+     /* ----------------------------- */
+
+     if   (appl_init() < 0)
+          Pterm(1);
+
+     /* Resourcedatei laden */
+     /* ------------------- */
+     if   (!rsrc_load("edscroll.rsc"))
+     {
+          form_alert(1, "[3][ \"EDSCROLL.RSC\"|not found!][Cancel]");
+          goto err;
+     }
+
+     rsrc_gaddr(0, EDIT, &adr_dialog);
+
+  /* Initialize scroll TEDINFO  */
+  /* ----------------------------- */
+
+  init_scrlted(adr_dialog+EDITTXT, is_scroll, &xted,
+        txt, tmplt, TLEN);
+
+  strcpy(txt, "Beispiel");
+
+  /* Dialog */
+  /* ------ */
+
+     wind_update(BEG_MCTRL);
+     graf_mouse(ARROW, 0L);
+     do_dialog(adr_dialog);
+     wind_update(END_MCTRL);
+     rsrc_free();
+
+  err:
+     appl_exit();
+     Pterm0();
+}
+
+
+/****************************************************************
+*
+* do_dialog
+*
+****************************************************************/
+
+int do_dialog(OBJECT *dialog)
+{
+     int cx, cy, cw, ch;
+     int exitbutton;
+
+     form_center(dialog, &cx, &cy, &cw, &ch);
+     form_dial(FMD_START, 0,0,0,0, cx, cy, cw, ch);
+     objc_draw(dialog, ROOT, MAX_DEPTH, cx, cy, cw, ch);
+     exitbutton = 0x7f & form_do(dialog, 0);
+     form_dial(FMD_FINISH, 0,0,0,0,cx, cy, cw, ch);
+     return(exitbutton);
+}
+
+
+/*******************************************************************
+*
+* Ascertain MagiC version
+* =======================
+*
+* If <crdate> != NULL, the creation date will be returned
+* in the form yyyymmdd. With '<' and '>' one can then
+* ascertain directly whether a given function is available
+* in the MagiC version in question.
+*
+* Return value:  0     No MagiC installed
+*               -1     Still in AUTO folder
+*           0x0a0b     Version a.b
+*
+*******************************************************************/
+
+WORD get_MagiC_ver(ULONG *crdate)
+{
+  ULONG *cookie;
+  AESVARS *av;
+
+  cookie = get_cookie('MagX');
+  if  (!cookie)
+    return(0);
+  else
+  {
+    av = ((MAGX_COOKIE *) (*cookie))->aesvars;
+    if  (!av)
+      return(-1);
+    else if (crdate)
+    {
+      *crdate = av->date << 16L;                /* yyyy0000 */
+      *crdate |= av->date >> 24L;               /* yyyy00dd */
+      *crdate |= (av->date >> 8L) & 0xff00L;    /* yyyymmdd */
+      return(av->version);
+    }
+  }
+}
+
+
+/****************************************************************
+*
+* Makes an F(BOX)TEXT object scrollable if MagiC is running.
+*
+* If <is_scroll> is FALSE, only the text field will be converted
+* to a user character string.
+*
+* In the RCS, the text field should be left empty, but the template
+* and the validation character string have to be input, as the RCS
+* will strike otherwise.
+* For scrolling fields a new template has to be created, as the
+* one registered in the .RSC file cannot be used since it is too
+* short. The template created here consists only of '_' characters,
+* since this covers 99.9% of all applications for scrolling objects.
+* The length of the validation string is immaterial. i.e. has to be
+* at least 1, as the AES automatically duplicates the validation
+* string until the length of the text field has been filled.
+*
+* The maximum length for the input character string is in every case
+* (TEDINFO.te_txtlen - 1).
+*
+****************************************************************/
+
+void init_scrlted(OBJECT *o, WORD is_scroll, XTED *xted,
+        char *txt, char *tmplt, WORD len)
+{
+  TEDINFO *t;
+
+  t = o->ob_spec.tedinfo;
+  t->te_just = TE_LEFT;   /* Important! */
+  t->te_ptext = txt;
+  if  (is_scroll)
+  {
+    memset(tmplt, '_', len);  /* New template */
+    tmplt[len] = '\0';
+    xted->xte_ptmplt = tmplt;
+    xted->xte_pvalid = t->te_pvalid;
+    xted->xte_vislen = t->te_tmplen - 1;
+    xted->xte_scroll = 0;
+
+    t->te_tmplen = len+1;
+    t->te_ptmplt = NULL;
+    t->te_pvalid = (void *) xted;
+  }
+  t->te_txtlen = t->te_tmplen;
+}
+
+

See also: About the AES   Input fields in MagiC   GEM   TEDINFO +

+
+ +Home +MagiCMagiC +Input fields in MagiCInput fields in MagiC +Special error-messages in MagiCSpecial error-messages in MagiC + + diff --git a/en/magic_semaphore.html b/en/magic_semaphore.html new file mode 100644 index 000000000..46d07c5a9 --- /dev/null +++ b/en/magic_semaphore.html @@ -0,0 +1,70 @@ + + + + + +The documentation for TOS: Semaphores in MagiC + + + + + + + + + +Home +MagiCMagiC +Make-up of the MAGX.INF fileMake-up of the MAGX.INF file +General remarks about shutdownGeneral remarks about shutdown + +
+ +

11.13 Semaphores in MagiC

+

Under MagiC, semaphores are released when the program (more +exactly the application) terminates. In contrast to MiNT this applies +also to the semaphores allocated with Psemaphore. +

+

MagiC supports with Psemaphore only modes 2 and 3 at present, and +recognizes the following system semaphores: +

+ + + + + + + + + + + + + + + +
Semaphore Meaning +
    + +
_DMA ACSI and FDC +
On receipt of these semaphores one must not forget to set the +system variable flock, and also to release this again after the +semaphore is released + +
_NCR SCSI of the Atari-TT + +
_SCR AES screen (used by wind_update) + +
+ +

See also: About the GEMDOS   Process functions   Signals +

+
+ +Home +MagiCMagiC +Make-up of the MAGX.INF fileMake-up of the MAGX.INF file +General remarks about shutdownGeneral remarks about shutdown + + diff --git a/en/magic_sharelib.html b/en/magic_sharelib.html new file mode 100644 index 000000000..dd87a71b3 --- /dev/null +++ b/en/magic_sharelib.html @@ -0,0 +1,697 @@ + + + + + +The documentation for TOS: Shared libraries + + + + + + + + + +Home +MagiCMagiC +VFAT-XFS in MagiCVFAT-XFS in MagiC +N.AESN.AES + +
+ +

11.23 Shared libraries

+

Shared Libraries in MagiC from V6.00 onwards +

+ + +

Note: Shared libraries were introduced already with +MagiC Version 5.20. Due to a design error, they had to change the +format of the library as of Version 6.00. As different +"magic" IDs are used this can not cause crashes; it's just +that the libraries for 6.00 will not be recognized by the old version +5.20, and vice versa. Due to several inadequacies in version 5.20 one +should in any case only create libraries for 6.00. +

+

11.23.1 What are shared libraries?

+

Usually libraries with frequently used procedures are collected +in their own object module and then linked with several programs +during compilation. In that case each program receives a copy of the +library, which is integrated firmly into the PRG file. On the other +hand, shared libraries exist as separate files only once on the hard +disk and can be used by several programs, even simultaneously. +

+

11.23.2 Why shared libraries?

+

Compared to hard-linked libraries, using shared libraries +results in a series of advantages: +

+
    +
  • Saving of storage space on the hard disk. The more programs +that use the same libraries, the greater the saving. +
  • +
  • Saving of storage space in main memory (RAM). This only comes +into play when several programs that use the same library are loaded +simultaneously. +
  • +
  • Systematic maintenance by the programmer: For an update it may +suffice at times just to distribute a new library. All programs that +use the library will then profit from the update. Additionally there +will be fewer source texts to maintain. When a library has been +altered there is no need to newly translate all of the programs using +it. +
  • +
+ +

Naturally there are also disadvantages: +

+
    +
  • Program loading takes somewhat longer; however this is so only +if the library has not been loaded yet. +
  • +
  • There may be interaction between updates of various programs. +When exchanging a library, several programs may be affected +(positively or negatively). +
  • +
  • During installation of a program the files have to be copied to +the XTENSION folder (normally in GEMSYS\MAGIC\ of the boot drive) or +to the first folder specified in the searchlist SLBPATH (from MagiC +6), so it is no longer possible to establish easily which shared +library belongs to which program. Remedies, for instance: +
      +
    • Only place aliases in the XTENSION folder or the first folder +specified by the environmental variable SLBPATH (see below) +
    • +
    • Leave the shared libraries in a subdirectory of the program and +merely extend the environmental variable SLBPATH in MAGX.INF by this +directory (possible from MagiC 6 onwards). If no SLBPATH variable +exists as yet then one has to enter the XTENSION path in it first. +
    • +
    + +
  • +
+ +

11.23.3 How do I use a library?

+

To start with, one needs the object module SLB_BIND for calling +the two new DOS functions, for which one has to link the file SLB.H. +

+

For each library used one declares a descriptor of the type +SHARED_LIB and a function pointer of the type SLB_EXEC. +

+

Each library is opened with Slbopen (opening and closing should +only take place in user-mode), during which the following parameters +are passed: +

+ + + + + + + + + + + + + + + +
char *name The name of the library, in capitals, including the extension +(".SLB"). The library name is also the filename. +
char *path If this parameter is not NULL, then first of all a search will +be made for the library (the path must end with '\' in MagiC 5.20; +this is no longer necessary in MagiC 6). The path should be an +absolute one, so that the shared library knows where it lies. If the +parameter is NULL or the library was not found in the specified path, +then a search is made in the XTENSION folder. +
From MagiC 6 onwards the environmental variable SLBPATH will be +evaluated. Like PATH it contains a list of search-paths, each +separated by ';'. If the variable is defined no additional search will +be made in the XTENSION folder. +
LONG min_ver Minimum required version number of the library. +
If a program needs, say, version 3 but the library present is only +version 2, then ERANGE will be returned. The return value will be the +actual version number of the library. +
SHARED_LIB *sl Pointer to the descriptor. When the library is opened the +descriptor will be entered here. +
SLB_EXEC *fn Pointer to the function pointer. When the library is opened the +function pointer will be entered here. + +
+ +

Return values can be: +

+
  >= 0        All OK, version number of the library
+  ERANGE      Version number too low
+  EACCDN      Library already opened by this process
+  EFILNF      Library not found
+  ENSMEM      Insufficient memory free
+  ...         Other error-codes.
+
+

The library can now be used and finally closed again with +Slbclose. This is not absolutely necessary as all open libraries are +closed automatically at program termination, but it is good +programming practice. On no account may a library be closed more than +once, since the kernel can not recognize such errors. +

+

Some libraries such as EDITOBJC.SLB, for instance, install new +system calls, in this case the AES calls 210..217. For these +libraries the function pointer is not needed. Otherwise all functions +of the library are called via the function pointer. The library call +function is declared in the following way: +

+
 typedef LONG cdecl (*SLB_EXEC)( SHARED_LIB sl, LONG fn,
+        WORD nargs, ... );
+
+

As regretably Pure-C has an error here, I was forced to declare +this functions as 'typedef LONG (*SLB_EXEC)( void , ... );'. +Unfortunately this inhibits all type checking. So take care! +

+

The call expects the following parameters: +

+
     The descriptor of the library
+     A longword (!) for the function number
+     A WORD, that specifies the number of arguments in WORDs
+             (i.e. all "..." arguments)
+     Further arguments, depending on the function.
+
+

The best way is to make the call via a macro, which should be +defined in a header file for the library, e.g.: +

+

JPEG.H: +

+

#define SLBJPEG_WANDELN (a,b) (*slbjpeg_exec)(slbjpeg, 7L, 4, a, +b) +

+

With this slbjpeg_exec and slbjpeg will be +ascertained at Slbopen, 7L is the function number for the call WANDELN +(convert), 4 describes the length of the following arguments +(<a> and <b> are two pointers => 2*4 bytes => 4 +WORDs), and a and b are the arguments of the function +WANDELN. +

+

If the function is not present (the library contains a +NULL-pointer for this function, or the function number is higher than +the number of functions actually present), one will receive EINVFN as +the function result (in fact this only works correctly from MagiC 6 +onwards). +

+

11.23.4 How do I write a library?

+

For this too there is a sample library SLB_DEMO, which contains +all the required elements and descriptions. The best thing is to copy +SLB_DEMO.C, LIBHEAD.S and SLB_DEMO.PRJ and then modify the files to +suit your requirements. It is most important to ensure that bit 3 of +the flag in the program header of a library is set; one can use +PH_BIT3.TTP for this. +

+

LIBHEAD is the header for a shared library. The pointer to the +function names can be omitted, otherwise it points to a table of +pointers with the names of the library functions. The number of +functions must be stated correctly, as must the table of functions and +the library name, which is identical to the filename. When adding a +function one has to ensure that the function number is adapted +accordingly, and perhaps that the version number is increased. +

+

For publicly available shared libraries one has to ensure that +documented function calls are never altered! They can either be +supplemented with new parameters (the called function can inquire the +number of parameters actually passed), or a new function number should +be used. +

+

NULL-pointers are also permissible for the function pointers; +they return a EINVFN when the function is called. +

+

The following functions for (de-)initialization are obligatory: +

+

slb_init/slb_exit +

+

These are called during loading and removal of the library +respectively, and at that in supervisor-mode and in the context +(process) of the library. Typically, slb_init loads a configuration +file, allocates global memory for the library and opens a virtual +VDI workstation. slb_exit writes back the configuration file, +releases the memory again and closes the VDI workstation. +

+

If slb_init opens a file, then the handle can only be accessed +again at slb_exit, as all other calls of the library run in the +context of the calling application. +

+

From MagiC 6 onwards the library is passed a normal 'C' +character string in the command line structure which contains the +complete path of the shared library. If the shared library has to load +configuration or RSC files, the path can be extracted and the filename +of the configuration file assembled correspondingly. +

+

If slb_init terminates by reason of a bus error, for instance, +then the caller will get EXCPT as the result of the Slbopen call. In +order to intercept an unplanned termination of the library, the kernel +installs an etv_term handler for the library before calling +slb_init/exit. +

+

slb_open/slb_close +

+

These are called at the opening or closing of the library +respectively. Once the library has been opened, the order is: +

+
  slb_init()
+  slb_open()
+  slb_close()
+  slb_exit()
+
+

Unlike slb_init/slb_exit, slb_open/slb_close run in the context +of the caller and in user-mode, with the user-stack of the caller, +even if the Slbopen call was performed in supervisor-mode. +

+

The library can also allocate memory at slb_open, though this +belongs to the caller and should be released again at slb_close. In +order to permit allocation of this reserved memory to the caller, the +library is also passed the current process descriptor at slb_open, +slb_close and at every function call. +

+

Warning: Due to a bug in 5.20, the passing of the PD +to slb_open and slb_close only works from MagiC 6 onwards. +

+

The kernel ensures that the open/close calls are nested +correctly, i.e. a process can not open a library more than once. +

+

The kernel ensures that the open/close calls are nested +correctly, i.e. a process cannot open a library more than once. +

+

Functions +

+

Functions are not obligatory, so a library can hook in system +calls also via the AES or DOS that are removed again at +termination, yet generally functions are made available. +

+

A function is called with the following parameters on the stack: +

+ + + + + + + + + + + + +
PD *pd Process descriptor of the caller, corresponds to the associated +slb_open()/close() +
LONG fn Function number. Practical when several functions are +amalgamated (identical function pointers in LIBHEAD) +
WORD nargs Number of the following arguments, in WORDs. If a function has +a variable number of parameters, one can ascertain the actual number. +Very useful for extensions, without having to incorporate new +functions. Example: If a function always expects a pointer, +but optionally also a WORD, it will receive either 2 or 3 as +nargs. +
... The remaining parameters + +
+ +

The functions are executed in the context of the caller and with +its stack. As this call is generally made in user-mode, multitasking +will not be interrupted even for longer operations. Depending on the +function, the function result can be a LONG, a WORD, void etc. +

+

A function may alter registers d0-d2 and a0-a1, all other +registers have to be saved if appropriate. In particular, register a2 +must not be altered, so that Pure-C routines may be called. +

+

11.23.5 SLB_DEMO.C

+
/*
+*
+* Body of a "shared library"
+*
+* Andreas Kromke
+* 22.10.97
+*
+*/
+
+#include <portab.h>
+#include <tos.h>
+#include <tosdefs.h>
+#pragma warn -par
+
+typedef void *PD;
+
+char *mem;               /* Here global memory */
+
+/*****************************************************************
+*
+* The init-function is called once during loading the library.
+* For this it runs as a process of the library, i.e. files can
+* be opened and memory can be reserved that belong to the library
+* in each case.
+* Warning: The files opened in this way may _NOT_ be accessed
+*          by the library functions, because these run in the
+*          context of the caller.
+*
+* Warning: The init-function runs in supervisor mode, as a
+*          library generally does not have a user stack.
+*          Hence it must not use too much stack space (max. 1kB)
+*          and may not run too long (because multitasking is
+*          blocked in supervisor mode).
+*          But if necessary a user stack can be allocated and one
+*          can then switch to user mode.
+*
+*****************************************************************/
+
+extern LONG cdecl slb_init( void )
+{
+     mem = Malloc(4096L);
+     if     (mem)
+          return(E_OK);
+     else     return(ENSMEM);
+}
+
+/*****************************************************************
+*
+* The exit-function is called once during releasing the library.
+* For this it runs as a process of the library, i.e. files can
+* be opened and memory can be reserved that belong to the library
+* in each case.
+*
+* Warning: The exit-function runs in supervisor mode, as a
+*          library generally does not have a user stack.
+*          Hence it must not use too much stack space (max. 1kB)
+*          and may not run too long (because multitasking is
+*          blocked in supervisor mode).
+*          But if necessary a user stack can be allocated and one
+*          can then switch to user mode.
+*
+*****************************************************************/
+
+extern void cdecl slb_exit( void )
+{
+     Mfree(mem);
+}
+
+
+/*****************************************************************
+*
+* The open-function is called once during opening of the library
+* by an application process. For this it runs as a process of the
+* caller, i.e. files can be opened and memory can be reserved that
+* belong to the caller in each case.
+*
+* The kernel ensures that each process does not open the library
+* several times, and that the library is always closed properly.
+*
+* Warning: The open-function runs in user mode, and actually with
+*          the user stack of the caller. This means that the caller,
+*          even when running in supervisor mode, always has to make
+*          a sufficiently large usp available.
+*
+*****************************************************************/
+
+extern LONG cdecl slb_open( PD *pd )
+{
+     return(E_OK);
+}
+
+
+/*****************************************************************
+*
+* The close-function is called once during closing of the library
+* by an application process. For this it runs as a process of the
+* caller, i.e. files can be opened and memory can be reserved and
+* released, that belongs to the caller in each case.
+*
+* Warning: The close-function runs in user mode, and actually with
+*          the user stack of the caller. This means that the caller,
+*          even when running in supervisor mode, always has to make
+*          a sufficiently large usp available.
+*
+*****************************************************************/
+
+extern void cdecl slb_close( PD *pd )
+{
+}
+
+
+/*****************************************************************
+*
+* An example library function.
+* It is executed in the context of the caller, and actually with
+* the stack of the caller (depending on status usp or ssp).
+*
+* It is strongly recommended to call the functions of an SLB only in
+* user mode, so as to ensure compatibility to later implementations.
+*
+*****************************************************************/
+
+extern LONG cdecl slb_fn0( PD *pd, LONG fn, WORD nargs, char *s )
+{
+     Cconws(s);
+     Cconws("\r\n Key: ");
+     Cconin();
+     return(E_OK);
+}
+
+

11.23.6 LIBHEAD.S

+
/*
+*
+* Header for a "shared library"
+* This is used in place of the start-code of PureC
+*
+* It is _imperative_ to ensure that bit 3 of the flags
+* in the program header is set, so that the library
+* does not reserve the whole of the available memory.
+*
+* Warning: The SLB-concept of MagiC 5.20 still had an error,
+* which I have fixed in 6.00. For this the makeup had to be
+* modified slightly. SLBs for MagiC 6 therefore do not run
+* with those for MagiC 5.20 and vice versa.
+*
+* Andreas Kromke
+* 10.2.98
+*
+*/
+
+     XREF slb_init
+     XREF slb_exit
+     XREF slb_open
+     XREF slb_close
+     XREF slb_fn0
+
+     TEXT
+
+DC.L          $70004afc              ; Magical value (5.20: $42674e41)
+DC.L          name                   ; Pointer to name of library
+DC.L          1                      ; Version number
+DC.L          0                      ; Flags, at present 0L
+DC.L          slb_init               ; Is called after loading
+DC.L          slb_exit               ; Is called before removing
+DC.L          slb_open               ; Is called at opening
+DC.L          slb_close              ; Is called at closing
+DC.L          0                      ; Pointer to procedure name (optional)
+DC.L          0,0,0,0,0,0,0,0        ; Unused, always NULL
+DC.L          1                      ; Number of functions (5.20: .W)
+DC.L          slb_fn0                ; Function #0
+
+name:          DC.B     'DEMO.SLB',0
+
+     END
+
+

11.23.7 SLB_DEMO.PRJ

+
slb_demo.slb
+.L[-S=256]     ; Minimum stack
+
+=
+
+libhead.s      ; Startup code for SLBs
+slb_demo.c (slb.h)
+
+pctoslib.lib
+pcstdlib.lib
+
+

11.23.8 PH_BIT3.TTP

+
/*
+*
+* Program for the manipulation of bit 3 in the program header.
+* MagiC needs this bit, which is generally 0, to assign to
+* the program only the minimum amount of memory that is needed,
+* i.e. only basepage+text+data+symbol+BSS.
+* Is needed in particular for all SharedLibraries.
+*
+* Andreas Kromke
+* 25.10.97
+*
+*/
+
+#include <portab.h>
+#include <tos.h>
+#include <tosdefs.h>
+#include <stdio.h>
+
+/* ProgramHeader, Program header for executable files                   */
+/************************************************************************/
+
+typedef struct {
+ WORD ph_branch;         /* 0x00: Must be 0x601a */
+ LONG ph_tlen;           /* 0x02: Length of TEXT segment */
+ LONG ph_dlen;           /* 0x06: Length of DATA segment */
+ LONG ph_blen;           /* 0x0a: Length of BSS  segment */
+ LONG ph_slen;           /* 0x0e: Length of the symbol table */
+ LONG ph_res1;           /* 0x12: Required by PureC */
+ LONG ph_prgflags;       /* 0x16:    Bit 0: Don't clear heap */
+                         /*          Bit 1: Load into FastRAM */
+                         /*          Bit 2: Malloc from FastRAM */
+                         /*          Bit 3: Only t+d+b+s (MagiC 5.20) */
+                         /*          Bit 4,5,6,7: Memory protection */
+                         /*          Bit 8: Unused */
+                         /*          Bit 9: Unused */
+                         /*          Bit 10: Unused */
+                         /*          Bit 11: SharedText (MiNT) */
+                         /*          Bit 12: Unused */
+                         /*          Bit 13: Unused */
+                         /*          Bit 14: Unused */
+                         /*          Bit 15: Unused */
+                         /*          Bits 31..28: TPA size */
+                         /*          (times 128k + 128k: Min. heap size) */
+ WORD ph_absflag;        /* 0x1a: Non-zero => do not relocate */
+} PH;
+
+
+
+WORD main( WORD argc, char *argv[] )
+{
+     PH ph;
+     WORD ret = 0;
+     LONG err;
+     WORD f;
+
+     for     (argc--,argv++; argc; argc--,argv++)
+          {
+          Cconws("File: ");
+          Cconws(*argv);
+          err = Fopen(*argv, RMODE_RW);    /* Open for reading + writing */
+          f = (WORD) err;                  /* File handle                */
+          err = Fread(f, sizeof(PH), &ph);
+          if     ((err != sizeof(PH)) || (ph.ph_branch != 0x601a))
+               {
+               err = EPLFMT;
+               goto nextone;
+               }
+          Fseek(0L, f, 0);                 /* File pointer to the start  */
+          ph.ph_prgflags |= 8;             /* Set bit 3                  */
+          err = Fwrite(f, sizeof(PH), &ph);
+
+      nextone:
+          if     (f > 0)
+               Fclose(f);
+          if     (err < 0)
+               {
+               printf(" => Error %ld", err);
+               ret = (WORD) err;
+               }
+          Cconws("\r\n");
+          }
+     return(ret);
+}
+
+

11.23.9 SLB_BIND

+

Warning: The function Slbopen contains an additionnal +parameter param. This no longer appears in the SLB.H. Best to +just simply inore it. +

+
/*
+*
+* Binding for the use of a "shared library"
+*
+* Andreas Kromke
+* 22.10.97
+*
+*/
+
+#include <mgx_dos.h>
+
+/*****************************************************************
+*
+* Opens a "shared lib".
+*
+* Input:
+*     name             Name of the library, including extension
+*     path             Search path with '\', optional
+*     min_ver          Minimum required version number
+* Returns:
+*     sl               Library descriptor
+*     fn               Function for calling a library function
+*     <ret>            Actual version number, or error code
+*
+*****************************************************************/
+
+LONG Slbopen( char *name, char *path, LONG min_ver,
+        SHARED_LIB *sl, SLB_EXEC *fn,
+        LONG param )
+{
+  return(gemdos(0x16, name, path, min_ver, sl, fn, param));
+}
+
+
+/*****************************************************************
+*
+* Closes a "shared lib".
+*
+* Returns:
+*     <ret>          EACCDN, if library not opened
+*
+*****************************************************************/
+
+extern LONG Slbclose( SHARED_LIB sl )
+
+{
+  return(gemdos(0x17, sl));
+}
+
+
+

11.23.10 SLB.H

+
/*
+*
+* Binding for the use of "shared libraries"
+*
+* Andreas Kromke
+* 22.10.97
+* Last change 19.2.99  - SLB_EXEC with cdecl corrected
+*
+* 19.2.99
+* - SLB_EXEC mit cdecl korrigiert
+* 20.8.99
+* - Slbclose korrigiert
+*/
+
+#ifndef LONG
+#include <portab.h>
+#endif
+
+typedef void *SHARED_LIB;
+
+/* old Version: typedef LONG (*SLB_EXEC)( void , ... ); */
+typedef LONG cdecl (*SLB_EXEC)( SHARED_LIB sl, LONG fn, WORD nargs, ... );
+
+extern LONG Slbopen( char *name, char *path, LONG min_ver,
+        SHARED_LIB *sl, SLB_EXEC *fn );
+extern LONG Slbclose( SHARED_LIB sl );
+
+
+ +Home +MagiCMagiC +VFAT-XFS in MagiCVFAT-XFS in MagiC +N.AESN.AES + + diff --git a/en/magic_shutdown.html b/en/magic_shutdown.html new file mode 100644 index 000000000..eb61b92ea --- /dev/null +++ b/en/magic_shutdown.html @@ -0,0 +1,366 @@ + + + + + +The documentation for TOS: General remarks about shutdown + + + + + + + + + +Home +MagiCMagiC +Semaphores in MagiCSemaphores in MagiC +Smart redraw in MagiCSmart redraw in MagiC + +
+ +

11.14 General remarks about shutdown

+

Shutdown is to be understood as a mechanism that allows the system +to be run down in a controlled manner. In a multitasking environment +it is actually no longer permissible to simply switch off the computer +after use; a reset with the reset button should be taboo as well. +Rather one must ensure that all programs have been terminated properly +and all files closed correctly before the current to the computer is +turned off. If this is ignored, then data losses may well result. +

+

For this reason UNIX systems or the Apple Macintosh, for +instance, have a Shutdown mechanism; such a one was also introduced by +Atari in MultiTOS and is also available in MagiC (as of Version 3.0). +

+

Shutdown is activated normally via the menu entry 'File/Shutdown' on +the desktop, with the key combination [[Control]-[Alternate]-[Delete], +or by a resolution change. During the Shutdown, no programs can be +launched. +

+

See also: Shutdown in MultiTOS   Shutdown in MagiC   Shutdown at the receiver   +Shutdown at the initiator   shel_write +

+

11.14.1 Shutdown in MultiTOS

+

Under MultiTOS, programs must do the following to support the +Shutdown mechanism: +

+
    +
  • Call shel_write (with sh_wdoex= 9), to inform the +AES that they understand the AP_TERM message +
      +

  • +
  • Terminate on receipt of an AP_TERM message, or send AP_TFAIL +
      +

  • +
+ +

Note: MultiTOS sends the AP_TERM message here only to +those processes that explicitly understand AP_TERM. As hardly any +programs exist at present that dismiss a corresponding shel_write, an +implementation such as this in MagiC would not give the desired +result. Hence a different procedure was chosen, in which the AP_TERM +message is sent to all running applications. +

+

See also: Shutdown in MagiC   shel_write   Shutdown at the receiver   Shutdown at the initiator +

+

11.14.2 Shutdown in MagiC

+

Under MagiC the Shutdown works a follows: all running programs +receive an AP_TERM message signalling that they should terminate +themselves. If there are still programs in memory after a certain +time, then SHUTDOWN outputs an error-message. In the file SHUTDOWN.INF +one can specify program names (without a suffix such as '.prg' or +'.app') that are uncritical and should not lead to an error-message +from SHUTDOWN. +

+

In addition to this the following points have to be heeded: +

+
    +
  • If [Control]-[Alternate]-[Delete] is to be used to terminate +the system, one must ensure that the screen is not locked, i.e. that a +program is not currently processing a dialog box or alert on the +screen, for instance. Furthermore a suitable shell (such as MAGXDESK, +Thing or Jinnee) must have been loaded, i.e. no program may be loaded +in 'single-mode' or in the 'Shell not resident' mode (say with +[Alternate]-double-click). +
      +

  • +
  • f the screen is locked, then only the writeback-demon will be +terminated, i.e. the cache written back. Only after the screen is +released (i.e. after closing of the dialog or alert box) can the +Shutdown be performed. +
      +

  • +
  • Should the system have crashed in such a way that no Shutdown is +possible any more, then [Control]-[Alternate]-[Delete] should be +performed for a second time; a warm start will be carried out without +programs being terminated +
      +

  • +
  • If 'single-mode' is active or the shell is not loaded, then again +only the writeback-demon will be terminated and the cache written +back. For a complete Shutdown the running program has to be terminated +so that the shell is active again. The Shutdown then must be +performed via the 'File/Shutdown' menu entry. +
      +

  • +
+ +

In MagiC 4, the Shutdown mechanism was revised as follow: +The AES now sends a SHUT_COMPLETED message with msg[3] = 0 (i.e. 'Shutdown +terminated unsuccessfully') and msg[4] = -1 (invalid ap_id) if there +are still programs running in the system that do not understand +AP_TERM explicitly. With that, a program that only masters the +MultiTOS specification will break off the Shutdown. SHUTDOWN.PRG, on the +other hand, was adapted to the new specification, and functions as +previously, i.e. gives all programs still running a timeout and then +outputs the names of all reluctant applications. +

+

In addition, the application #0 is no longer passed arbitrary +data in msg[4,5,6,7] on [Control]-[Alternate]-[Delete], but the +following message: +

+
  msg[3]     = -1
+  msg[4,6,7] =  0
+  msg[5]     = AP_TERM
+
+

See also: +
Shutdown in MultiTOS   shel_write   Shutdown at the receiver   Shutdown at the initiator +

+

11.14.3 Shutdown as seen by the application

+

First one should point out that the Shutdown mechanism in MultiTOS +differs from that in MagiC: Atari's MultiTOS sends an AP_TERM message +only to those applications that have explicitly informed the AES +with shel_write (opcode 9) that they understand the AP_TERM message; on the +other hand MagiC sends the mssage to all active applications. +

+

The Shutdown will be seen by the AES as successful only when +all programs explicitly understanding AP_TERM have terminated +themselves. If an application should intimate that it cannot terminate +itself, then the Shutdown will be broken off. For these reasons, every +program receiving an AP_TERM message has principally only two options: +

+
    +
  • It terminates itself immediately +
  • +
  • It makes the following call +
    msg[0] = AP_TFAIL;
    +msg[1] = err;
    +shel_write(10, 0, 0, (char *) msg, NULL);
    +
    +
    and so informs the AES that the process was interrupted with +the error-code err. The application that has caused the Shutdown +is told the ap_id and error-code of the interrupting application. +
  • +
+ +

If the application reacts differently on the other hand, i.e. +ignores the AP_TERM message, then the behaviour of the system depends +on whether it was informed that the AP_TERM message is understood. +In plain language: +

+
    +
  • If the application explicitly understands AP_TERM then +the system starts from the assumption that the application cannot +accept any messages at the time. The Shutdown is not interrupted, but +lasts until the caller (generally the program SHUTDOWN) terminates the +Shutdown. SHUTDOWN uses a timeout for this of 3 seconds, i.e. if 3 seconds +after the start of the Shutdown programs are still active that +understand AP_TERM, the program will break off the Shutdown process. +
      +

  • +
  • If the application does not explicitly understand +AP_TERM, then the system tells the initiator of the Shutdown (generally +SHUTDOWN.PRG) that the Shutdown process has been successful. Only +because the SHUTDOWN.PRG is so indulgent with old programs, it tests +whether any applications are still active, and outputs a message if +so. One can specify in the file SHUTDOWN.INF the programs that should +not lead to an error-message, i.e. that need not be terminated. +
      +

  • +
+ +

Note: If the Shutdown was started with +[Alternate]-[Control]-[Delete], then at first only the writeback-demon +and the application with the ID 0 receives an AP_TERM message; -1 is +entered as sender for this. Application 0 (generally the desktop) then +terminates itself and then starts the Shutdown program. +

+

See also: +
Shutdown at the initiator   shel_write   Shutdown in MagiC   Shutdown in MultiTOS +

+

11.14.4 Shutdown as seen by the initiator

+

Shutdown and resolution change are taken on in MagiC by the +program SHUTDOWN, which is called with the following parameters: +

+

SHUTDOWN.PRG dev txt +

+

For this dev = -1 if a Shutdown without a +resolution change is to be performed, else = the device number of the +VDI screen driver. txt is the text height for the AES; +generally this should be 0. +

+

A Shutdown is started with ret = shel_write(4, TRUE, 0, NULL, +NULL). Here a return value of 0 signals that a Shutdown is not possible, +because a Shutdown is already running, for instance. A resolution change +is performed with ret = shel_write(5, dev, 0, NULL, NULL); here +dev is the VDI device driver. Alternatively, one can +specify a Falcon resolution mode in xdv with shel_write(5, xdv, 1, +NULL, NULL). +

+

These calls are all MultiTOS-conform. In addition, as of MagiC 3 +the following call exists: ret = shel_write(5, dev, 100+txt, NULL, NULL). +With this one can set the text height for the AES. One cannot pass +a Falcon resolution with this mode, so dev is the device +number of the VDI screen driver. +

+

The device number depends on the system in use and the VDI. +With a 'naked' ST or TT030 (without graphics card) the following +allocations apply: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
1Default resolution 
2ST-Low(320*200*16)
3ST-Medium(640*200*4)
4ST-High(640*400*2)
6TT-Medium(640*480*16)
8TT-High(1280*960*2)
9TT-Low(320*480*256)
+
+ +

When using a graphics card, or on a Macintosh, the device +numbers are found as usual in the ASSIGN.SYS file in the root +directory of the boot drive. +

+

After a successful shel_write call the system will be in the Shutdown +mode and no more programs can be launched. On successful completion of +the Shutdown or a resolution change the initiator receives the following +message: +

+ + + + + + +
msg[0] = SHUT_COMPLETED +
msg[3] = 1 - Shutdown successful + +
+ +

or with a resolution change: +

+ + + + + + +
msg[0] = RESCH_COMPLETED +
msg[3] = 1 - Resolution change successful + +
+ +

Successful as far as the system is concerned means that all +progams that understand AP_TERM have terminated themselves. If the +Shutdown should be broken off nevertheless, then this can be done by +using ret = shel_write(4, FALSE, 0, NULL, NULL). Otherwises a +resolution change will be performed irrevocably when the initiator has +terminated itself. On the other hand the Shutdown will be broken off +when the initiator terminates. +

+

If a program has refused a Shutdown with AP_TFAIL, then the +initiator receives the following message: +

+ + + + + + + + + + + + +
msg[0] = SHUT_COMPLETED +
msg[3] = 0 - Break off Shutdown +
msg[4] = ap_id of the application that has refused +
msg[5] = Error-code of this application + +
+ +

bzw. beim Auflösungswechsel +

+ + + + + + + + + + + + +
msg[0] = RESCH_COMPLETED +
msg[3] = 0 - Resolution change broken off +
msg[4] = ap_id of the application that has refused +
msg[5] = Error-code of this application + +
+ +

In this case the system has already terminated the Shutdown or +resolution change, i.e. the initiator cannot do anything any more. +

+

Note: Because it is possible that the Shutdown process is +never reported by the system as complete or broken off (the +RESCH_COMPLETED or SHUT_COMPLETED message is never sent), the initiator should +forsee a timeout while waiting for the message. In that case the +Shutdown must be broken off explicitly. With appl_search the initiator +can test whether there are still programs active that do not +understand AP_TERM explicitly. +

+

See also: +
Shutdown at the receiver   shel_write   Shutdown in MultiTOS   Shutdown in MagiC +

+
+ +Home +MagiCMagiC +Semaphores in MagiCSemaphores in MagiC +Smart redraw in MagiCSmart redraw in MagiC + + diff --git a/en/magic_smartredraw.html b/en/magic_smartredraw.html new file mode 100644 index 000000000..acde07eae --- /dev/null +++ b/en/magic_smartredraw.html @@ -0,0 +1,108 @@ + + + + + +The documentation for TOS: Smart redraw in MagiC + + + + + + + + + +Home +MagiCMagiC +General remarks about shutdownGeneral remarks about shutdown +The task-manager of MagiCThe task-manager of MagiC + +
+ +

11.15 Smart redraw in MagiC

+ +

MagiC follows the philosophy that speed should not be obtained +by brutal means such as graphics processors etc., but rather by +applying a bit of thought. Above all, this includes only ever doing as +much as necessary. While TOS on changing the current window, or on +closing or moving it, has a predilection of redrawing the +whole window or even quite innocent, non-participating +windows, MagiC effectively avoids doing this. Though this +unattractive TOS behaviour is not documented anywhere, +unfortunately programs and libraries exist (perhaps those from the +book 'Vom Anfänger zum GEM-Profi'), which use the feature +that TOS always redraws the window when enlarging it. +

+

An example of this: Let us assume that five columns fit +in a window next to each other, which are also displayed. If the user +now reduces the window so that only four columns fit in it, the user +program re- sorts its data and subsequently itself causes a redraw of +the window (since TOS does not redraw a window when it is +reduced). On the other hand if the user enlarges the window to 7 +columns wide, the program again re-sorts the data, but in this case +does not cause a redraw of the window. Due to this behaviour, +which should really be described as a failure of TOS to always +completely redraw the window in this case, output will then take +place. +

+

MagiC now always redraws only the minimum required part of the +window; when enlarging a window, that would be at most two rectangles +at the right and bottom. For the programs that make use of the error +in TOS described above, there will be a discrepancy between the +logical and physical screen contents. +

+

It would have been far simpler to just forgo distinguishing the +case 'window larger or smaller than before' and always cause a redraw +when re-sorting. As, even in TOS, the operating system always +aggregates redraws, a possibly superfluous redraw never has +any repercussions. +

+

Incidentally, the described effect arises also when enlarging +the window if the lowest line or rightmost column is displayed. +

+

Here too an example: A 100-line text is displayed in a +window with a height of 20 lines; as the scroll-bar is right at the +bottom, lines 80 to 100 will be displayed in the window. If the window +is now enlarged downwards so that there is room for around 30 lines, +then one could actually only drag out a white area, since there are no +further data below line 100. To avoid this, most programs scroll their +data in this situation, in our example 10 lines upwards. As a result +the program now displays the lines 70 to 100; but as this is based on +a TOS error, it does not cause a redraw, which of course +readily leads to confusion under MagiC. +

+

Here too a general redraw of the window during re-sorting under +TOS as well would not only be clean but also have no side-effects, +as TOS too avoids unnecessary redraws in this case. In a direct +comparison between 'Smart redraw' and 'TOS redraw', which are to be +seen literally as opposites, the former shows itself to have +appreciably faster, calmer and cleaner screen build-up that can +compete favourably with the Macintosh system and which would +not be possible in this form under TOS even with a blitter and +68040 processor. Therefore it is strongly recommended that you do not +ruin this elegant solution by taking advantage of undocumented +properties of TOS. +

+

If you are using programs that exhibit the faulty behaviour +described above, then you should proceed as follows: +

+
    +
  • In MagxConf ACC/CPX, deactivate the 'Smart Redraw' switch +
  • +
  • Stimulate the author of the affected program to remedy this +error +
  • +
+ +

See also: Switch Smart redraw on/off   GEM   Style guidelines +

+
+ +Home +MagiCMagiC +General remarks about shutdownGeneral remarks about shutdown +The task-manager of MagiCThe task-manager of MagiC + + diff --git a/en/magic_taskmanager.html b/en/magic_taskmanager.html new file mode 100644 index 000000000..da04acf20 --- /dev/null +++ b/en/magic_taskmanager.html @@ -0,0 +1,97 @@ + + + + + +The documentation for TOS: The task-manager of MagiC + + + + + + + + + +Home +MagiCMagiC +Smart redraw in MagiCSmart redraw in MagiC +Test for MagiCTest for MagiC + +
+ +

11.16 The task-manager of MagiC

+

With the task-manager of MagiC one can perform various tasks, +such as the freezing, unfreezing or terminating processes, for +instance. The task-manager is called by the +[Control]-[Alternate]-[Esc] key combination. After the call a list of +all programs in memory appears, which is built up as follows: +

+

+

Note: Below this list there is a menu making a series of +commands available for controlling the system. Since the mouse is +unavailable, selection must be made by pressing the listed shortcut +key (shown below each command). In detail: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Command Meaning +
    +
Control MagiC attempts to give the selected application control over +the screen and mouse - this may help with deadlocks in some +circumstances +
freeze The selected application is frozen; it is then invisible to all +other programs and is not assigned any CPU time +
OK Return to normal operation; the task-manager is exited without +performing any action +
prev, next One line of the above-mentioned list is always shown in inverse +video - which one this is can be set with the cursor up/down keys; any +following commands refer to the application that is selected in this +way. Applications with a set ID can also be seleceted by typing in the +corresponding number. +
Switch The menu bar of the selected application will be activated +
Terminate The selected application is kicked out of the memory, which +usually results in all of its data being lost; sometimes this may lead +to a crash, so this function should be used with particular care +
unfreeze With this command the frozen applicationen is unfrozen again; +you can then continue your work at the position where it was frozen +previously + +
+ +

See also: Process functions   U:\\PROC +

+
+ +Home +MagiCMagiC +Smart redraw in MagiCSmart redraw in MagiC +Test for MagiCTest for MagiC + + diff --git a/en/magic_test.html b/en/magic_test.html new file mode 100644 index 000000000..2b0411844 --- /dev/null +++ b/en/magic_test.html @@ -0,0 +1,63 @@ + + + + + +The documentation for TOS: Test for MagiC + + + + + + + + + +Home +MagiCMagiC +The task-manager of MagiCThe task-manager of MagiC +Threads in MagiCThreads in MagiC + +
+ +

11.17 Test for MagiC

+
/*  The following code tess whether MagiC is installed, and returns
+    one of the following values:
+
+    -1 = No MagiC present
+    -2 = MagiC installed, but MagiC-AES inactive, i.e. MagiC is only
+         being used as a fast filesystem
+    >0 = MagiC present and MagiC-AES active. The return value contains
+         the BCD-coded version number  */
+
+GLOBAL WORD InqMagX (VOID)
+{
+    MAGX_COOKIE *cv;
+
+    if (get_cookie ("MagX", (LONG) &cv))
+    {
+        if (cv->aesvars)
+            return (cv->aesvars->version);
+        else
+           return (-2);
+    }
+    else
+       return (-1);
+} /* InqMagX */
+
+

Note: Programs launched from the AUTO folder can +not obtain MagiC's version number with the aid of this +routine, since the AES is not yet initialized at boot-time. In this +case one should fall back on the function DoMagixAESVars. +

+

See also: Cookie jar   Cookie and XBRA list +

+
+ +Home +MagiCMagiC +The task-manager of MagiCThe task-manager of MagiC +Threads in MagiCThreads in MagiC + + diff --git a/en/magic_threads.html b/en/magic_threads.html new file mode 100644 index 000000000..96aab530d --- /dev/null +++ b/en/magic_threads.html @@ -0,0 +1,316 @@ + + + + + +The documentation for TOS: Threads in MagiC + + + + + + + + + +Home +MagiCMagiC +Test for MagiCTest for MagiC +Additional programs for MagiCAdditional programs for MagiC + +
+ +

11.18 Threads in MagiC

+

The concept of threads enables a sort of parallel working +within an application, and has been known for some time in +operating systems such as OS/2, MacOS or UNIX. In contrast to normal +multitasking, it is possible for several threads to belong to +a program (or process). In MagiC threads are supported from version +4.50 (01.04.96) onwards, and are implemented as an application, i.e. a +thread under MagiC posseses its own application ID. The concept here +is based on that of Sun Solaris 2.x. +

+

This section describes the following points: +

+ + +

See also: About the GEMDOS   Process functions   Example +

+

11.18.1 Threads and signals

+

If a process is paused with the signal SIGSTOP or similar then +all threads are paused as well; with SIGCONT all threads are +reawakened. When terminating a program with SIGTERM, SIGKILL etc. all +threads are terminated too. +

+

The signal handling will be taken over entirely by the main +thread, i.e. the one that was started with Pexec. This means that +during the processing of a signal-handler only the main thread will be +paused, and at Psigreturn one will jump back to it. +

+

If more than one thread is mucking about with the signal mask +then oddities can occur if the old signal mask is not restored in the +correct order. For instance: +

+
Thread A rescues the old mask
+Thread A alters the mask
+Thread B rescues the old mask
+Thread A restores the old mask
+Thread B restores the old mask
+
+

This alters the signal mask in an unwanted manner. A clean +solution would be to give each thread its own signal mask and +OR-combine all masks of all threads for the effective signal +mask. If this becomes necessary the author has said he will alter the +kernel appropriately. +

+

See also: Threads in MagiC   Signals   shel_write   Process +functions +

+

11.18.2 Threads and AES calls

+

In the development of users' own programs, it is imperative that +a multithread-safe library is used. The standard libraries of, say, +Pure-C are largely unusable in this respect. In particular one +must ensure that each thread is assigned its own global field. Hence +the following functions are affected: +

+ + +

Note: The original MagiC documentation contains examples +for multithread-capable AES functions, on whose structure one may +orient oneself. One should also note that the name of a thread is +invalid on the AES plane, i.e. it cannot be found with +appl_find or appl_search. +

+

See also: +
Threads and VDI calls   Process functions   AES bindings   Signals +

+

11.18.3 Threads and VDI calls

+

VDI calls are generally not as 'critical' as AES calls, as +reentrance problems are much rarer here. +

+

The reason is due to the fact that a call of VDI functions +does not lead to task-switching as frequently as happens with AES +calls, for instance. +

+

VDI calls however can be problematic in this respect whenever +vector fonts are accessed, as in that case one normally requires disk +access; these, as is generally known, are interruptible in MagiC. In +such a situation a task-switch may happen. Which VDI commands +individually are interruptible cannot be answered here; if +required, this should be clarified with the NVDI developers, so that +then reentrant library functions would be required for only those +functions. +

+

See also: +
Threads and AES calls   Process functions   VDI bindings   Signals +

+

11.18.4 Apportionment of resources with threads

+

In MagiC, threads run in the same process, but possess their own +application ID, and so are a self-contained task. The following table +gives an overview of the resources that a thread possesses itself, or +uses from the main program. +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Threads possessThe main program uses
• User stack• File handles
• Supervisor stack• Basepage
• Application ID• Memory blocks
• Resource files• Current directories, current drive
• Menu bar• Process ID (PID)
• Desktop background• Domain (MiNT/TOS)
• Window• umask
• Message queue• Current DTA
• Mouse pointerMalloc flags
• Possibly VT52 window (selectable)• Command line and environment
etv_term vector• Signal-handler and -mask
• Semaphores• Possibly VT52 window (selectable)
+
+ +

Note: As one can see, a thread thereby receives its +own AP_TERM message. When using resource files, one should pay +attention to the fact that the thread may use its own global field if +necessary. +

+

One should also note that any memory that the thread may +allocate belongs to the process, and at termination of the thread is +not freed automatically; the same applies to opened files, +which are only closed on termination of the program; if necessary, +this must be undertaken by the thread. +

+

Warning: It is imperative to note that: +

+
    +
  • No DTA is used, as the functions Fsfirst, Fsnext, Fsetdta and +Fgetdta are not multithread-safe +
      +

  • +
  • Accesses to file handles are synchronized by suitable methods. +Two threads may not access the same file simultaneously +
      +

  • +
+ +

The function Psemaphore is already prepared for threads, and can +be used both for synchronization between processes as well as between +several threads of a process. On termination of a thread, all the +semaphores blocked by this will be released again automatically. +

+

If possible, only the main thread should execute a Pexec at +present, but not subsidiary threads. Theoretically this is permitted, +however, namely when no other thread or the main thread has called +Pexec, and the main thread does not terminate itself. +

+

The problem lies, simply, in the fact that at present the +jump-back addresses with Pexec are stored not in the running process +but in the parent, and the parent of the process started by the thread +becomes invalid. +

+

If a thread performs the function Pterm, then at present only +this thread is terminated. One should note also that a thread may +start other programs with shel_write (in parallel), and wait on their +termination. +

+

See also: +
Threads and AES calls   Threads and VDI calls   Process functionsAbout the GEMDOS +

+

11.18.5 Threads, Example for

+
#include <tos.h>
+#include <mt_aes.h>
+
+WORD global[15];
+WORD ap_id;
+WORD fmt_id;
+
+LONG cdecl format_thread( struct fmt_parameter *par )
+{
+   WORD myglobal[15];
+   WORD ap_id;
+
+   /* we do not want to fry the global-field of the main-APPL */
+
+   ap_id = MT_appl_init(myglobal);
+   (...)
+}
+
+
+/*********************************************************************
+*
+* Starts the formatting thread.
+*
+*********************************************************************/
+
+WORD start_format( VOID *param )
+{
+   THREADINFO thi;
+
+   if   (fmt_id < 0)   /* thread not yet active */
+   {
+      thi.proc = (VOID *) format_thread;
+      thi.user_stack = NULL;
+      thi.stacksize = 4096L;
+      thi.mode = 0;
+      thi.res1 = 0L;
+      fmt_id = shel_write(SHW_THR_CREATE, 1, 0,
+                          (BYTE *) &thi, param);
+      return(fmt_id);
+   }
+   else
+      return(-1);    /* thread still running */
+}
+
+WORD main( VOID )
+{
+   if ((ap_id = MT_appl_init(global)) < 0)
+      Pterm(-1);
+   else
+   {
+      (...)
+      start_format( .... );
+
+      while(...)
+         (...);
+
+      appl_exit();
+      return(0);
+   }
+}
+
+

See also: Threads   About the GEMDOS   Process functions   +Signals +

+
+ +Home +MagiCMagiC +Test for MagiCTest for MagiC +Additional programs for MagiCAdditional programs for MagiC + + diff --git a/en/magic_vfat.html b/en/magic_vfat.html new file mode 100644 index 000000000..f1921375e --- /dev/null +++ b/en/magic_vfat.html @@ -0,0 +1,150 @@ + + + + + +The documentation for TOS: VFAT-XFS in MagiC + + + + + + + + + +Home +MagiCMagiC +MagiC's XFS-conceptMagiC's XFS-concept +Shared librariesShared libraries + +
+ +

11.22 VFAT-XFS in MagiC

+

As of Version 5.0 MagiC supports a VFAT-XFS, with whose help +long filenames in Windows95 format can be used on the Atari. +

+

Advantages of this concept: +

+
    +
  • Existing partitions need not be reformatted; the long filenames +are thus available directly +
      +

  • +
  • Files created in this way may be exchanged directly between +MagiC and Windows95 (or higher), and the use of such files is also +possible without an installed VFAT-XFS (important in case one boots +without MagiC at times, for instance) +
      +

  • +
  • As VFAT is based on the FAT concept, simple implementation was +possible without any appreciable memory overheads +
      +

  • +
+ +

Disadvantages of this concept: +

+
    +
  • VFAT has inherited all problems from FAT, so the known cluster +fracturing also exists under VFAT, for instance +
      +

  • +
  • There are more modern concepts that are both faster and safer +
      +

  • +
  • On the Atari there are at present no programs that can repair +volumes with long filenames; these would have to delete all the +filename entries that are incomplete, or followed by a wrong main +entry +
      +

  • +
+ +

Technical description of the VFAT system: +

+
typedef struct
+{
+    BYTE   head;       /* Bit 0..4: Number, Bit 6: Endofname */
+    UBYTE  name1[10];  /* 5 Unicode characters               */
+    BYTE   attr;       /* Attribute (0x0f)                   */
+    BYTE   unused;     /* Unused at present                  */
+    BYTE   chksum;     /* Checksum of the short name         */
+    UBYTE  name2[12];  /* 6 Unicode characters               */
+    WORD   stcl;       /* First cluster (0)                  */
+    UBYTE  name3[4];   /* 2 Unicode characters               */
+} LDIR;
+
+

Note: Here head is for the first entry e.g 0x01, +for the second 0x02 and for the third 0x43, if the name requires three +entries. +

+

One can store 13 characters for each entry. The entries with the +long filename always lie immediately before the main (8+3) entry. The +Unicode characters are in the Intel format. In the last entry, any +unused characters after the NULL-byte are filled with 0xff, 0xff. The +order of the entries is reversed, i.e. the last 13 characters of the +long name lie physically in the first position. The last directory +entry, which is flagged by a set bit 6 in the head field, lies +physically in the first position. +

+

The component stcl is always zero; chksum is +calculated from the short name (in an internal format) through +right-rotation in turn of the previous result and addition of the 11 +characters. Linux uses the field unused to store flags for +upper/lowercase. The current Windows version however always writes +zeros to this field, and MagiC behaves in the same way. Further +notes: +

+
    +
  • The renaming of files with identical names apart from +lower/upper case is possible. Example: By renaming 'test.txt' +to 'TEST.TXT', the long name is discarded automatically. +
      +

  • +
  • The conversion Unicode <-> ASCII is implemented according +to the NVDI mapping +
      +

  • +
  • If a file is copied from a VFAT partition with long filenames +enabled to one with a normal FAT (where they are not), its name will +be truncated to the 8+3 format. Example: Copying a file +'longfilename.txt' to a FAT partition will make it appear in the +directory as 'LONGFILE.TXT'. If an attempt is then made to copy the +file 'longfilenameS.txt' to the same directory, the usual name +conflict dialog will appear, inviting the user to rename the copy to +avoid duplicating a filename. +
      +

  • +
  • If the parition type is changed from VFAT to normal FAT (using +VFATCONF.PRG, say), any long filenames will be truncated; this is +indicated by a tilde ' ' character followed by a numeral at the end of +the shortened name. If two or more such files start with the same +characters, the numeral will be incremented each time. +Example: A directory containing 'longfilename.txt' and +'longfilenameS.txt' when changed from a VFAT to a FAT partition will +display 'LONGFI 1.TXT' and 'LONGFI 2.TXT'. The same applies to +directory names. +
      +

  • +
  • In the creation of the short name, spaces are replaced by under +scores. Example: 'Wassili Kandinsky.app' -> 'WASSILI_.APP'. +
      +

  • +
  • The VFAT-XFS can also move folders within the directory +structure (irrespective of whether long names are allowed or not). +
      +

  • +
+ +

See also: MagiC's XFS-concept   VFATCONF +

+
+ +Home +MagiCMagiC +MagiC's XFS-conceptMagiC's XFS-concept +Shared librariesShared libraries + + diff --git a/en/magic_xfs.html b/en/magic_xfs.html new file mode 100644 index 000000000..6b0046d9a --- /dev/null +++ b/en/magic_xfs.html @@ -0,0 +1,4199 @@ + + + + + +The documentation for TOS: MagiC's XFS-concept + + + + + + + + + +Home +MagiCMagiC +MagiC's DFS-conceptMagiC's DFS-concept +VFAT-XFS in MagiCVFAT-XFS in MagiC + +
+ +

11.21 MagiC's XFS-concept

+ +

MagiC, just as MultiTOS, enables the incorporation of +alternative filesystems (so-called XFSs) and with that the use of long +filenames. However, for several reasons a different approach was +chosen in MagiC to Atari's solution. This has the unfortunate +consequence that the XFS's available for MultiTOS (Minix-XFS, +CD-ROM-XFS, ...) cannot be used under MagiC. This chapter +describes the following points: +

+ + +

See also: VFAT-XFS in MagiC   MagiC's DFS-concept +

+

11.21.1 General remarks about MagiC's XFS-concept

+ +

GEMDOS was until now the most conservative part of the MagiC +operating system. For network drivers, practically all DOS calls, +including Pexec, had to be recreated without being able to intervene +at a deeper level. In Mag!X 1.x (as in TOS) the DOS was not even +reentrant because a statically constructed stack was used. +

+

In MultiTOS/MiNT the problem is circumvented in such a way that +a virtual system is laid over the GEMDOS which takes care of all +higher management tasks, can incorporate other filesystems and uses +GEMDOS only as a dumb filesystem driver. An advantage of this solution +is its great flexibility and extendibility, but a decided drawback is +the towering overhead when using the 'normal' DOS filesystem. But this +is just the one that is utilized most frequently. In addition, the +GEMDOS filesystem can gain no functionality, comfort or speed with the +use of MiNT, since the old routines only execute with additional +overhead. File-system accesses under MiNT are therefore generally +not reentrant, i.e., as under MS-Windows, every floppy disk +access paralyses the whole computer. +

+

A further property of MiNT is the attempt to undertake functions +that all filesystems have in common in the kernel. Although this +leaves the filesystem drivers (MiNT-XFSs) compact, due to the +Inode-oriented format of the kernel functions an unfavourable +structure is forced on the file drivers in some circumstances; in +addition, generally many calls of the filesystem driver are required +for one DOS call. Finally the MiNT kernel itself is very long, but to +a large extent lies fallow as long as no filesystems other than DOS +are in use. +

+

Under MagiC a different approach was chosen, which +included rewriting all GEMDOS functions from the ground up, including +the low-level ones for the sector buffering, and to carve them up into +three, four or five layers in which one can intervene from the outside +(with loaded- in drivers). A side-effect resulted in an extension of +the DOS file system functionality and an additional filesystem on the +logical drive U:. +

+

The whole concept inclusive of accesses to the DOS +filesystems is reentrant and runs in the background. Thus it is +possible to amend files on drive A: without markedly slowing down the +computer during floppy disk accesses. Despite this MagiC has till now +grown only by 10kB. Compared to MiNT, more functions were offloaded +into the file system drivers, and while this makes them longer, it +gives them the possibility of executing the functions much more +efficiently. Also, the DOS filesystem has become somewhat faster +rather than slower. +

+

Although realized completely in Assembler, we are dealing with +an object-oriented operating system with virtual functions and multi- +level heredity. A file descriptor (FD), as used by the kernel and made +available by the XFS, is an object with special data and functions. +But the XFS realizes also a derived object with further data fields +and functions. Finally the DFS subdriver of the DOS_XFS must in +turn accommodate further functions and data in the FD and +extrapolate the class further. Things look exactly the same with the +DMD (drive medium descriptor). The kernel requires only a few +statements, but the lower layers appreciably more, though always +different ones. +

+

The layers in detail: +

+ +
    +
  1. The DOS kernel. This lies in MagiC itself and is +called directly by user programs via TRAP #1. It contains modules for +memory management, for process management and for file management. The +latter has the following sublayers: +
  2. +
  3. The filesystem (XFS = eXtended +File-System). Its construction is basically different +from a MiNT-XFS, but fulfills the same purpose. MagiC for Ataris +contains only a single XFS, the so- called DOS_XFS; others can be +incorporated. The Macintosh version (MagiC Mac) contains a Mac-XFS +in addition. Specifically this filesystem again makes use of +subdrivers: + +
      +
    1. A DOS filesystem (DFS) is called up by DOS_XFS. This only +contains the file functions, while the directory management is +essentially taken on by the DOS_XFS. MagiC contains directly two +DFSs. One for drive U:, a second for the FAT filesystems that lie on +BIOS drives. More DFSs can be incorporated. The effort for a DFS +is appreciably lower than for an XFS, as many functions are +performed already by the DOS_XFS. The vital prerequisite is a DOS- +conforming directory structure (with 32-bit entries and filenames in +the 8+3 format). The kernel itself does not come into contact +with the DFS but controls it transparently via the DOS-XFS. +
    2. +
    + +
  4. +
  5. The file drivers (MX_DEV), which essentially take care +of file reading and writing operations. They are created and managed +by the XFS, but with functions such as Fread and Fwrite called +directly by the kernel, which accrues extremely low overheads. The +DOS_XFS actually contains only one file driver. This handles the +updating of the directory at write accesses, for instance, and in turn +calls a subdriver (MX_DDEV). + +
      +
    1. The subdriver MX_DDEV is only called by the DOS file driver of +the DOS_XFS filesystem. The user can incorporate custom MX_DDEVs via +the directory U:\\DEV. The kernel itself does not come into contact +with the subdrivers. +
    2. +
    + +
  6. +
+ +

Notes: +

+
    +
  • In contrast to MiNT, U:\PROC, U:\DEV etc. are not their own +file systems but simply just subdirectories of the DFS for drive +U:. Depending on the subdirectory, the U-DFS creates various file- +types and -drivers. As the control of the directory is encumbent on the +DOS_XFS, write accesses to a workstation, for instance, are logged in +the directory by the file date-stamp. This even goes so far that a +write access to the root of drive A: will alter the file date-stamp of +U:\A automatically. +
      +
    Devices, pipes and shared memory blocks can be moved, deleted or +renamed. Symbolic links can be created in all directories of drive U:; +for instance, with 'ln -s U:\CON U:\CONSOLE' one can create an alias +for the device file CON. One can also create empty files simply, +though not folders since the drive U: has no memory allocated to it. +
      +

  • +
  • In contrats to MiNT, U:\ is not its own special filesystem. One +just has to respect that only symbolic links can be created. The +directories U:\A etc. are simply symbolic links, which can also be +removed or renamed. +
      +

  • +
  • All directories of U: are restricted to 32 entries at present +
      +

  • +
  • The construction of all internal structures and the fast +register- based parameter passing and return requires an +implementation of all filesystems and drivers to be written in +Assembler, at least for most of the functions +
      +

  • +
  • The construction of the MX_DDEV file driver has changed since +MagiC V2.10. The sample driver DEV_LPT1 may not be used under MagiC +V3.00 and higher. Actually the concepts have stayed the same, only a +few constants have changed. A new sample driver is not yet available +(at the time this was written). +
      +

  • +
+ +

See also: MagiC's XFS-concept   Test for pipes +

+

11.21.2 The make-up of an XFS

+ +

Since the implementation of an XFS can only be performed in +Assembler, its description is given in Assembler syntax: +

+
xfs_name:       DS.B      8    /* Name of the filesystem              */
+xfs_next:       DS.L      1    /* Next driver                         */
+xfs_flags:      DS.L      1    /* Flags, analogous to MiNT            */
+xfs_init:       DS.L      1    /* Initialization                      */
+xfs_sync:       DS.L      1    /* Synchronization of the filesystem   */
+xfs_pterm:      DS.L      1    /* Notifies a program termination      */
+xfs_garbcoll:   DS.L      1    /* Garbage collection, or NULL         */
+xfs_freeDD:     DS.L      1    /* Releases DD                         */
+xfs_drv_open:   DS.L      1    /* Tests/initializes DMD (Mediach)     */
+xfs_drv_close:  DS.L      1    /* Forces a disk media change          */
+xfs_path2DD:    DS.L      1    /* Returns a DD to a pathname          */
+xfs_sfirst:     DS.L      1    /* Searches for first matching file    */
+xfs_snext:      DS.L      1    /* Searches for next matching file     */
+xfs_fopen:      DS.L      1    /* Opens or creates a file             */
+xfs_fdelete:    DS.L      1    /* Deletes a file                      */
+xfs_link:       DS.L      1    /* Required for Frename and Flink      */
+xfs_xattr:      DS.L      1    /* Required for Fxattr                 */
+xfs_attrib:     DS.L      1    /* Required for Fattrib                */
+xfs_chown:      DS.L      1    /* Required for Fchown                 */
+xfs_chmod:      DS.L      1    /* Required for Fchmod                 */
+xfs_dcreate:    DS.L      1    /* Creates a directory                 */
+xfs_ddelete:    DS.L      1    /* Deletes a directory                 */
+xfs_DD2name:    DS.L      1    /* Returns the absolute pathname       */
+xfs_dopendir:   DS.L      1    /* Opens a directory                   */
+xfs_dreaddir:   DS.L      1    /* Reads the next directory entry      */
+xfs_drewinddir: DS.L      1    /* Sets the dirhandle to 1st entry     */
+xfs_dclosedir:  DS.L      1    /* Closes the dirhandle                */
+xfs_dpathconf:  DS.L      1    /* Obtains various limits              */
+xfs_dfree:      DS.L      1    /* Obtains number of free blocks etc.  */
+xfs_wlabel:     DS.L      1    /* Writes the disk name                */
+xfs_rlabel:     DS.L      1    /* Reads the disk name                 */
+xfs_symlink:    DS.L      1    /* Creates a symbolic link             */
+xfs_readlink:   DS.L      1    /* Reads a symbolic link               */
+xfs_dcntl:      DS.L      1    /* Required for Dcntl                  */
+
+

See also: Make-up of a DFS   MagiC's XFS-concept +

+

11.21.2.1 xfs_attrib

+ + + + + + + + + + + + + + + +
Name: »xfs_attrib« - Required for Fattrib. +
  +
Parameters: +
  + + + + + + + + + + + + + + + + + + +
a0 = DD * +
a1 = char *name +
d0 = int rwflag +
d1 = int attrib +
-> d0 = char attr or long errcode +
-> a0 = SYMLINK * + +
+ +
Description: Unlike MiNT, MagiC does not implement this function as Fxattr, +because this can mean a huge overhead in some circumstances. Here +symbolic links must followed, i.e. the return of ELINK is permissible. +
  +
The function xfs_attrib is not yet carried out tidily by +DOS_XFS, symbolic links are not recognised. +
  +
Group: Make-up of an XFS +
  +
See also: MagiC's XFS-concept   Fattrib   Fxattr +
  + +
+ +

11.21.2.2 xfs_chmod

+ + + + + + + + + + + + + + + +
Name: »xfs_chmod« - Required for Fchmod. +
  +
Parameters: +
  + + + + + + + + + + + + +
a0 = DD * +
a1 = char *name +
d0 = int mode +
-> d0 = long errcode + +
+ +
Description: xfs_chmod alters the access rights of a file. The parameters +correspond to those of Fchmod. Note that symbolic links are not +followed. +
  +
It is not supported by DOS_XFS. +
  +
Group: Make-up of an XFS +
  +
See also: MagiC's XFS-concept   Fchmod +
  + +
+ +

11.21.2.3 xfs_chown

+ + + + + + + + + + + + + + + +
Name: »xfs_chown« - Required for Fchown. +
  +
Parameters: +
  + + + + + + + + + + + + + + + +
a0 = DD * +
a1 = char *name +
d0 = uid +
d1 = gid +
-> d0 = long errcode + +
+ +
Description: xfs_chown alters the owner (user ID and group ID) of a file. +The parameters correspond to those of Fchown. Symbolic links are not +followed, i.e. owner and group of the symbolic link are modified. +
  +
It is not supported by DOS_XFS. +
  +
Group: Make-up of an XFS +
  +
See also: MagiC's XFS-concept   Fchown +
  + +
+ +

11.21.2.4 xfs_dclosedir

+ + + + + + + + + + + + + + + +
Name: »xfs_dclosedir« - schließt ein Verzeichnis +
  +
Parameters: +
  + + + + + + +
a0 = DHD *dhd +
-> d0 = long errcode + +
+ +
Description: Analogous to MiNT. +
  +
Group: Make-up of an XFS +
  +
See also: MagiC's XFS-concept   Dclosedir +
  + +
+ +

11.21.2.5 xfs_dcntl

+ + + + + + + + + + + + + + + +
Name: »xfs_dcntl« - Required for Dcntl. +
  +
Parameters: +
  + + + + + + + + + + + + + + + +
a0 = DD * +
a1 = char *name +
d0 = int cmd +
d1 = long arg +
-> d0 = long errcode + +
+ +
Description: xfs_dcntl is required for Dcntl. Every XFS should support +FUTIME. +
  +
Group: Make-up of an XFS +
  +
See also: MagiC's XFS-concept +
  + +
+ +

11.21.2.6 xfs_dcreate

+ + + + + + + + + + + + + + + +
Name: Create a directory. +
  +
Parameters: +
  + + + + + + + + + +
a0 = DD * +
a1 = char *name (without path) +
-> d0 = long errcode + +
+ +
Description: xfs_dcreate is required for Dcreate. +
  +
Group: Make-up of an XFS +
  +
See also: MagiC's XFS-concept   Dcreate +
  + +
+ +

11.21.2.7 xfs_ddelete

+ + + + + + + + + + + + + + + +
Name: »xfs_ddelete« - Delete a directory. +
  +
Parameters: +
  + + + + + + +
a0 = DD * +
-> d0 = long errcode + +
+ +
Description: The call xfs_ddelete had to be altered as of MagiC Version +4.01. +
  +
For MagiC < 4.01 (kernel version < 3) the following +applies: +
During deletion one must ensure that no directory may be +referenced by the kernel except by the call itself (i.e. dd_refcnt +must == 1). In addition one must ensure that there are no files in the +directory. ELINK may not be returned, symbolic links may not be +processed. The access rights (if they exist) must be tested by the +XFS. +
  +
For MagiC < 4.01 (kernel version >= 3) the following +applies: +
Reentrance problems gave rise to some changes, whereby the kernel +takes over access control from the XFS and furthermore the kernel +releases the DD, not the XFS: The kernel first of all opens the parent +of the directory to be deleted with xfs_path2DD, then it tests with +xfs_xattr whether it is dealing with a symlink, and if appropriate +deletes it with xfs_fdelete. +
  +
If it is dealing with a directory, the kernel opens this again +with xfs_path2DD (mode 1) and releases the parent again with xfs_freeDD. +The check of dd_refcnt is performed by the kernel, hence the counter +can and must be ignored by the XFS. The XFS must now ensure that +the directory to be deleted or the DD cannot be opened or used by +others (important for reentrant XFSs). The XFS then deletes the +directory, but does not (!) release the DD, so that the kernel if +successful (return value E_OK) can release its standard paths +beforehand. The kernel then calls xfs_freeDD. As usual the XFS must +check that the directory is empty, or if access rights exist if +appropriate. +
  +
Again in context: +
  +
    +
  • The kernel ascertains the DD to be deleted, tests the +reference counter +
      +

  • +
  • xfs_ddelete locks the DD. If this does not work then EACCDN is +returned +
      +

  • +
  • xfs_ddelete deletes the directory, provided it is empty; here +the DD acts as a lock for parallel-runnning attempts to use the newly +deleted directory +
      +

  • +
  • xfs_ddelete leaves the now invalid (but still serving as a +lock) DD still valid (in contrast to the old concept) +
      +

  • +
  • On success the kernel makes its standard paths invalid +
      +

  • +
  • The kernel releases the DD +
      +

  • +
+ +
Group: Make-up of an XFS +
  +
See also: MagiC's XFS-concept   Ddelete +
  + +
+ +

11.21.2.8 xfs_dfree

+ + + + + + + + + + + + + + + +
Name: »xfs_dfree« - Obtain number of free blocks. +
  +
Parameters: +
  + + + + + + + + + +
a0 = DD * +
a1 = long[4] +
-> d0 = long errcode + +
+ +
Description: xfs_dfree is required for Dfree. DOS_XFS calls the appropriate +DFS driver directly. +
  +
Group: Make-up of an XFS +
  +
See also: MagiC's XFS-concept   Dfree +
  + +
+ +

11.21.2.9 xfs_DD2name

+ + + + + + + + + + + + + + + +
Name: »xfs_DD2name« - Return the absolute pathname. +
  +
Parameters: +
  + + + + + + + + + + + + +
a0 = DD * +
a1 = char *name +
d0 = int bufsize +
-> d0 = long errcode + +
+ +
Description: xfs_DD2name is required for Dgetpath and Dgetcwd. The path that +belongs to the passed directory is copied after name. The path +must be returned without the trailing '\', i.e. an empty string for +the root directory. bufsize, as ever, is to be interpreted as +including the terminating NULL-byte. If the buffer is too small +(bufsize shorler than the path), then as in MiNT ERANGE must +be returned. +
  +
Group: Make-up of an XFS +
  +
See also: MagiC's XFS-concept +
  + +
+ +

11.21.2.10 xfs_dopendir

+ + + + + + + + + + + + + + + +
Name: »xfs_dopendir« - Open a directory. +
  +
Parameters: +
  + + + + + + + + + +
a0 = DD * +
d0 = int tosflag +
-> d0 = DHD *dhd or Fehlercode + +
+ +
Description: xfs_dopendir is required for Dopendir. As tosflag only +0 and 1 are permitted at present. If tosflag == 0, filenames +are not truncated, and the first four bytes returned by D(x)readdir contain +the file index. +
  +
If tosflag == 1, Dreaddir must truncate the filenames to +8+3 and convert them to upper case, and may not return a file ID. +
  +
Group: Make-up of an XFS +
  +
See also: MagiC's XFS-concept   Dopendir   Dreaddir   Dxreaddir +
  + +
+ +

11.21.2.11 xfs_dpathconf

+ + + + + + + + + + + + + + + +
Name: »xfs_dpathconf« - Obtain various limits. +
  +
Parameters: +
  + + + + + + + + + +
a0 = DD * +
d0 = int which +
-> d0 = long value + +
+ +
Description: Analogous to MiNT. The DOS_XFS directly calls the appropriate +DFS driver. which can take the following values: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
DP_MAXREQ (-1) Obtain maximum valid value for which +
DP_IOPEN (0) Internal limit for number of open files +
DP_MAXLINKS (1) Maximum number of links for a file +
DP_PATHMAX (2) Maximum length for full pathnames +
DP_NAMEMAX (3) Maximum length for filenames +
DP_ATOMIC (4) Block size +
DP_TRUNC (5) Filename truncation, returns: + + + + + + + + + +
DP_NOTRUNC (0) Never truncate ERANGE if nec. +
DP_AUTOTRUNC (1) Truncated to max. length +
DP_DOSTRUNC (2) Truncated to 8+3 + +
+ +
DP_CASE (6) Upper/lower case, returns: + + + + + + + + + +
DP_CASESENS (0) Differentiate +
DP_CASECONV (1) Converted to upper case +
DP_CASEINSENS (2) Not differentiated and not converted + +
+ + +
+ +
As of the MagiC version of 21.5.95 the following are supported +as well: +
  + + + + + + +
DP_MODEATTR (7) (as for Dpathconf) +
DP_XATTRFIELDS (8) (as for Dpathconf) + +
+ +
Group: Make-up of an XFS +
  +
See also: MagiC's XFS-concept   Dpathconf +
  + +
+ +

11.21.2.12 xfs_dreaddir

+ + + + + + + + + + + + + + + +
Name: »xfs_dreaddir« - Read next directory entry. +
  +
Parameters: +
  + + + + + + + + + + + + + + + + + + +
a0 = DHD *dhd +
d0 = int size +
a1 = char *buf +
d1 = XATTR *xattr or NULL +
d2 = long *xr (if xattr != NULL) +
-> d0 = long errcode + +
+ +
Description: Analogous to MiNT. Supplants both Dreaddir as well as +Dxreaddir. +
  +
Group: Make-up of an XFS +
  +
See also: MagiC's XFS-concept +
  + +
+ +

11.21.2.13 xfs_drewinddir

+ + + + + + + + + + + + + + + +
Name: »xfs_drewinddir« - Set directory handle to 1st entry. +
  +
Parameters: +
  + + + + + + +
a0 = DHD * dhd +
-> d0 = long errcode + +
+ +
Description: Analogous to MiNT. +
  +
Group: Make-up of an XFS +
  +
See also: MagiC's XFS-concept   Drewinddir +
  + +
+ +

11.21.2.14 xfs_drv_close

+ + + + + + + + + + + + + + + +
Name: »xfs_drv_close« - Force a disk media change. +
  +
Parameters: +
  + + + + + + + + + +
a0 = DMD * +
d0 = int mode +
-> d0 = long errcode + +
+ +
Description: The function xfs_drv_close also performs two tasks, depending +on mode: +
  + +
    +
  1. mode = 0: +
    The kernel requests the XFS to close the drive, if possible. If +this is not permitted then EACCON must be returned, else all +structures are to be released or caches written back and E_OK +returned. +
      +
    Opened fies are recognized already by the kernel and closing of +the drive will be prevented. However only those files that have a +handle and are known to the kernel can be recognized here. For the +sake of safety the kernel calls xfs_sync before calling this function +in case a write-back cache is being used. This strategy will be +carried out also even if at some time a mechanism is built in that +monitors eject buttons of interchangeable media drives or CD-ROMs, +and bars ejection if necessary. +
      +

  2. +
  3. mode = 1: +
    The kernel forces closing of the drive, the XFS has to return +E_OK. No caches may be written back as the drive is already invalid +(after a media change has been reported already). DDs and FDs do +not have to be released as far as they are still referenced by the +kernel, i.e. the kernel still performs xfs_freeDD or dev_close even +after a media change. +
      +

  4. +
+ +
The internal DOS_XFS passes the call on to the DFS function +of the same name, and in addition the XFS structures will be +released if necessary. +
  +
Group: Make-up of an XFS +
  +
See also: MagiC's XFS-concept +
  + +
+ +

11.21.2.15 xfs_drv_open

+ + + + + + + + + + + + + + + +
Name: »xfs_drv_open« - Test/initialize the DMD (Mediach). +
  +
Parameters: +
  + + + + + + +
a0 = DMD * +
-> d0 = long errcode + +
+ +
Description: MagiC supports exactly 26 simultaneously active filesystems +that are assigned letters 'A'..'Z'. xfs_drv_open has two tasks: +
  + +
    +
  1. At the first access to a drive (say D:), the kernel creates a +DMD (drive medium descriptor) and 'offers' this to the XFSs. The entry +d_dfs is still a NULL-pointer, d_drive is initialized (between 0 and +25, corresponding to 'A'..'Z'). +
      +
    The DFS drivers now attempt to recognize 'their' filesystem +on the drive. If this succeeds, then d_xfs and d_root have to be +initialized, in which case the return value is then E_OK. Else EDRIVE +is reported, and the DOS_XFS tries the next DFS. +
      +
    Warning: The root may not be released during the +lifetime of a mounted filesystem. The reference counter of the root +should be preloaded with 1 to prevent it being released with +xfs_freeDD. In the MagiC versions before 4.01 this was not necessary +because the reference counter (in a 'dirty' way) was not incremented +before the xfs_path2DD call, nor decremented afterwards. +
      +

  2. +
  3. On subsequent access d_xfs is already initialized, and the +DFS has the opportunity to test for a medium change. If everything +is in order, E_OK has to be returned. Else the disk medium change +routine of the kernel has to be called and E_CHNG returned. For this +one obtains the pointer to the medium change routine of the kernel +with Dcntl. +
      +

  4. +
+ +
The internal DOS_XFS passes on the call to the DFS function of +the same name, i.e. all DFS drivers are tried in turn. +
  +
Group: Make-up of an XFS +
  +
See also: MagiC's XFS-concept +
  + +
+ +

11.21.2.16 xfs_fdelete

+ + + + + + + + + + + + + + + +
Name: »xfs_fdelete« - Delete a file. +
  +
Parameters: +
  + + + + + + + + + +
a0 = DD * +
a1 = char *name (without path) +
-> d0 = long errcode + +
+ +
Description: xfs_fdelete is required for Fdelete. When deleting a symlink, +only this may be deleted but not a referenced file. This means that a +return value of ELINK is not permissible here. +
  +
Access right checks are left completely to the XFS. During +deletion one should pay attention that no file may be referenced by +the kernel (i.e. fd_refcnt != 0). +
  +
Group: Make-up of an XFS +
  +
See also: MagiC's XFS-concept +
  + +
+ +

11.21.2.17 xfs_flags

+ + + + + + + + + + + + + + + +
Name: »xfs_flags« -Flags, analogous to MiNT. +
  +
Parameters: — +
  +
Description: Reserved. Should actually contain flags, but it is not used by +the MagiC kernel. So please do not use it! +
  +
Group: Make-up of an XFS +
  +
See also: MagiC's XFS-concept +
  + +
+ +

11.21.2.18 xfs_fopen

+ + + + + + + + + + + + + + + +
Name: »xfs_fopen« - Open or create a file. +
  +
Parameters: +
  + + + + + + + + + + + + + + + + + + +
a0 = DD * +
a1 = char *name (for opening) +
d0 = int omode (fürs Öffnen) +
d1 = int attrib (for creating) +
-> d0 = FD * or error-code +
-> a0 = SYMLINK * + +
+ +
Description: xfs_fopen is used by the functions Fopen and Fcreate. The +open-mode in the lower-value byte is different to MiNT, because the +MiNT modes are unfavourable for the implementation of inquiries. When +calling Fopen via TRAP #1, the MiNT modes are converted by the kernel +to the internal modes. +
  +
These are the internal modes which have to be handled by the +XFS driver (NOINHERIT is not supported, because according +to TOS convention only the handles 0..5 are inherited). Otherwise +the high byte corresponds to the MiNT conventions: +
  +
OM_RPERM   EQU  1   // File is opened for reading
+OM_WPERM   EQU  2   // File is opened for writing
+OM_EXEC    EQU  4   // File is opened for execution
+OM_APPEND  EQU  8   // Write accesses at end (kernel!)
+OM_RDENY   EQU  16  // Others may not read at same time
+OM_WDENY   EQU  32  // Others may not write at same time
+OM_NOCHECK EQU  64  // No check by the kernel
+
+
The bit OM_APPEND is taken note of by the kernel at a Fwrite +call automatically; the kernel performs an Fseek before every write +access. +
  +
OM_NOCHECK is set by the kernel if a file is opened or +redirected (Fforce) as a device, i.e. as handle -1, -2, -3 or -4. If +this bit is set, then the XFS should not perform a check for +multiple opening of the file (see also below for fd_mode), but leave +this to the device driver. +
  +
Here are the bits, which are used as in MiNT: +
  +
O_CREAT EQU  $200 // Create file, if it doesn't exist
+O_TRUNC EQU  $400 // Clear file, if it exists
+O_EXCL  EQU  $800 // Don't open file, if it exists
+
+
The kernel performs Fcreate as Fopen (O_CREAT +O_RDWR + +O_TRUNC). O_COMPAT (i.e. specify only the TOS mode 0, 1 or 2), is +in MagiC always equivalent to O_WDENY. +
  +
The checking of the access rights is completely up to the XFS, +the kernel does nothing; that would be fairly pointless anyway, since +every filesystem has its own mechanisms and rights. The kernel is +returned a pointer to an opened FD, i.e. the opening of the file +driver must be performed by the XFS. The reference counter of the +returned FD is to be incremented by the XFS, or initialized as 1 at +the first opening. For symbolic links and disk media changes the same +applies as for xfs_sfirst. +
  +
Fopen is implemented as follows under MiNT: +
  + +
    +
  1. With <lookup> convert pathname->fcookie +
  2. +
  3. With <getxattr> obtain the access rights +
  4. +
  5. Test of access rights by the kernel +
  6. +
  7. With <getdev> obtain the file driver +
  8. +
  9. With <getdev->open> open the file +
  10. +
+ +
This procedure is very protracted. DOS returns a pointer to the +32-byte directory entry already when searching for a file, which +serves directly for the checking of the attributes and with that the +access rights, and also for opening the file. Hence MagiC expects +direct implementation of the Fopen call with all checks of the access +rights. The return is an FD structure, in which the file driver +was entered and opened. +
  +
Group: Make-up of an XFS +
  +
See also: MagiC's XFS-concept +
  + +
+ +

11.21.2.19 xfs_freeDD

+ + + + + + + + + + + + + + + +
Name: »xfs_freeDD« - Release a DD. +
  +
Parameters: +
  + + + + + + +
a0 = DD * +
-> void + +
+ +
Description: The kernel has decremeted the reference counter of a DD to +0, so that the DD is no longer referenced by the kernel. The function +xfs_freeDD is called, say, when the kernel after the Fopen no longer +requires the path in which the opened file lies and which was passed +to xfs_fopen. XFSs that do not perform garbage collection can release +their DDs via this function. +
  +
One must ensure that the root is never released. Either one +builds in a special inquiry here, or (more elegant) already sets the +reference counter of the root with xfs_drv_open to 1. +
  +
Group: Make-up of an XFS +
  +
See also: MagiC's XFS-concept +
  + +
+ +

11.21.2.20 xfs_garbcoll

+ + + + + + + + + + + + + + + +
Name: »xfs_garbcoll« - Garbage collection. +
  +
Parameters: +
  + + + + + + +
a0 = DMD *d +
-> d0 = 1L oder 0L + +
+ +
Description: The kernel urgently requires internal GEMDOS memory and uses +xfs_garbcoll to perform a garbage collection. An XFS that does not +use the kernel's internal memory management can place a NULL-pointer +as a function here. +
  +
Warning: As many blocks as possible should be released. +The return value is 1 if (at least) one block could be released. +During a garbage collection the kernel runs through the whole list of +mounted logical drives, so the XFS requests a garbage collection as +many times as the number of drives it is managing at the time. +
  +
Group: Make-up of an XFS +
  +
See also: MagiC's XFS-concept +
  + +
+ +

11.21.2.21 xfs_init

+ + + + + + + + + + + + + + + +
Name: »xfs_init« - Initialization. +
  +
Parameters: — +
  +
Description: Reserved. For MagiC-internal XFSs it contains their +initialization. Not used with loaded-in XFSs. +
  +
Group: Make-up of an XFS +
  +
See also: MagiC's XFS-concept +
  + +
+ +

11.21.2.22 xfs_link

+ + + + + + + + + + + + + + + +
Name: »xfs_link« - Required for Frename and Flink. +
  +
Parameters: +
  + + + + + + + + + + + + + + + + + + +
a0 = DD *olddir +
a1 = DD *newdir +
d0 = char *oldname +
d1 = char *newname +
d2 = int flag_link +
-> d0 = long errcode + +
+ +
Description: xfs_link is used both for Frename (d2 = 0) and also for Flink +(d2 = 1). In the case of Frename a new directory entry has to be +created and the old entry (reference to the file) deleted or +overwritten. +
  +
In the case of Flink a further reference to the same file is +created and the old entry is not deleted. Both DDs always lie in +the same filesystem, so have the same DMD. As for Fdelete, in the +case of a symbolic link this has to be renamed or a further link +created. This means that an ELINK return value is +impermissible here (as for xfs_fdelete). +
  +
Flink is not supported by the DOS_XFS. +
  +
Group: Make-up of an XFS +
  +
See also: MagiC's XFS-concept +
  + +
+ +

11.21.2.23 xfs_name

+ + + + + + + + + + + + + + + +
Name: »xfs_name« - Name of the filesystem. +
  +
Parameters: — +
  +
Description: The name is up till now just a comment; perhaps in the future +it may offer the possibility of ascertaining which drivers are +installed and what, say, the driver responsible for drive A: is called +(i.e. what sort of filesystem the floppy disk contains). +
  +
The name of the integrated XFS is 'DOS_XFS ' (extended to 8 +characters with a space). +
  +
Group: Make-up of an XFS +
  +
See also: MagiC's XFS-concept +
  + +
+ +

11.21.2.24 xfs_next

+ + + + + + + + + + + + + + + +
Name: »xfs_next« - Next driver. +
  +
Parameters: — +
  +
Description: xfs_next is simply a chaining pointer to the next driver. A new +driver is always incorporated at the front, so always has the highest +priority. This makes it possible to load a driver in place of the +intergated DOS driver, for instance. +
  +
Group: Make-up of an XFS +
  +
See also: MagiC's XFS-concept +
  + +
+ +

11.21.2.25 xfs_path2DD

+ + + + + + + + + + + + + + + +
Name: »xfs_path2DD« - Return a directory descriptor (DD) to a pathname. +
  +
Parameters: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
mode = 0: The name is a file +
= 1: The name is itself a directory +
d0 = int mode +
a0 = DD *reldir current directory +
a1 = char *pathname +
-> d0 = DD * +
d1 = char *restpfad +
oder   +
-> d0 = ELINK +
d1 = Restpath without leading '\' +
a0 = FD of the path in which the symbolic link lies; this is +important for relative path specifications in the link +
a1 = NULL, the path represents the parent of the root directory +
oder   +
a1 = Path of the symbolic link + +
+ +
Description: The kernel differentiates between two different types of +descriptors, file descriptors (FD) and directory descriptors (DD), +which can have an identical structure however. The xfs_path2DD +function returns a descriptor for a path. +
The reference counter of the DD must be incremented by 1 each +time it is returned as a function value, as it is referenced by the +kernel. The xfs_path2DD function corresponds to an 'opening' of the +path; a kind of 'file handle' is returned to the kernel, which the +kernel has to close again. The parsing of the path must always be +taken care of by the XFS. +
  +
Input parameters: +
  + + + + + + + + + +
<mode> Determines whether the last path element is itself a directory +(mode == 1), or whether the path is to be obtained in which +this file lies +
<reldir> Directory from which the search is to start +
<pathname> The pathname, without drive letter and without leading '\' + +
+ +
Output parameters: +
  +
1st case: An error has arisen +
  +
d0 contains the error-code +
  +
2nd case: A directory descriptor (DD) could not be +obtained +
  + + + + + + +
<d0> Pointer to the DD; the XFS has incremented the reference +counter of the DD by 1 +
<d1> Pointer to the remaining filenames without leading '\' or '/'; +if the end of the path was reached, this pointer points to the +terminating NULL-byte + +
+ +
3rd case: The XFS hit on a symbolic link during the )path +evaluation +
  + + + + + + + + + + + + +
<d0> Contains the internal MagiC error-code ELINK +
<d1> Pointer to the remaining path without the leading '\' or '/' +
<a0> Contains the DD of the path in which the symbolic link +lies; the XFS has incremented the reference counter of the DD by 1 +
<a1> This is the pointer to the link itself; a link starts with a +WORD (16 bits) for the length of the path, followed by the path itself + +
+ +
Warning: The length must include the terminating +NULL-byte and also be even. The link has to lie at an even memory +address. +
  +
The buffer for the link may be static or volatile since the +kernel immediately copies the data elsewhere, with no possibility of a +context change happening inbetween. +
  +
If a1 == NULL is passed, a signal is sent to the kernel that the +parent of the root directory was selected. If the path resides, say, +on U:\A, then the kernel can fall back to U:\. The value of the return +register a0 is ignored by the kernel, so no reference counter may be +incremented. +
  +
Group: Make-up of an XFS +
  +
See also: MagiC's XFS-concept +
  + +
+ +

11.21.2.26 xfs_pterm

+ + + + + + + + + + + + + + + +
Name: »xfs_pterm« - Notify a program termination. +
  +
Parameters: +
  + + + + + + +
a0 = PD * +
-> void + +
+ +
Description: The call xfs_pterm is made at every program termination and +gives the XFS the opportunity to release internal structures or +remove locks. The files visible to the kernel (i.e. those that are +assigned a handle) are closed by the kernel beforehand. The reference +counter for the standard directories is likewise decremented +beforehand by the kernel. +
  +
A pointer to a process descriptor is passed in a0. +
  +
Group: Make-up of an XFS +
  +
See also: MagiC's XFS-concept +
  + +
+ +

11.21.2.27 xfs_readlink

+ + + + + + + + + + + + + + + +
Name: »xfs_readlink« - Read a symbolic link. +
  +
Parameters: +
  + + + + + + + + + + + + + + + +
a0 = DD * +
a1 = char *name +
d0 = char *buf +
d1 = int size +
-> d0 = long errcode + +
+ +
Description: xfs_readlink is used for Freadlink. It is supported by DOS_XFS. +
  +
Group: Make-up of an XFS +
  +
See also: MagiC's XFS-concept +
  + +
+ +

11.21.2.28 xfs_rlabel

+ + + + + + + + + + + + + + + +
Name: »xfs_rlabel« - liest den Disknamen. +
  +
Parameters: +
  + + + + + + + + + + + + + + + +
a0 = DD * +
a1 = char *name +
d0 = char *buf +
d1 = int len +
-> d0 = long errcode + +
+ +
Description: xfs_rlabel serves for reading the medium name. It is called by +the kernel when Fsfirst with attribute == 8 is performed. name +is generally "*.*" and can be ignored. len is the +length of the buffer buf; on overflow ERANGE must be returned. +
xfs_rlabel is also called for Dreadlabel. In this case +name == NULL. +
  +
Group: Make-up of an XFS +
  +
See also: MagiC's XFS-concept +
  + +
+ +

11.21.2.29 xfs_sfirst

+ + + + + + + + + + + + + + + +
Name: »xfs_sfirst« - Search for first matching file. +
  +
Parameters: +
  + + + + + + + + + + + + + + + + + + +
a0 = DD * srchdir +
a1 = char *name (ohne Pfad) +
d0 = DTA * +
d1 = int attrib +
-> d0 = long errcode +
-> a0 = SYMLINK * (or Symlink if appropriate) + +
+ +
Description: xfs_sfirst is required for Fsfirst. MiNT uses instead of this +function a combination of Dreaddir and Fxattr, which however makes +very many calls of the XFS driver necessary. The reserved area of +the DTA can be used freely by the XFS; if this is too small, one +has to proceed with similar heuristic methods to MiNT, i.e. pointers +must be entered in the DTA that point to fixed descriptors. +
  +
These descriptors however can be released again only with +heuristic methods, because one never knows whether another Fsnext is +coming or not. The kernel already gets the complete path with +xfs_path2DD, so that only the pure pathname is passed in a1. As with +all DOS calls that process a path, the XFS must ensure that the DD +is protected for the duration of the processing. This is particularly +critical if the filesystem is reentrant. +
  +
If a file searched for is a symbolic link, then one has to pass +ELINK as error-code in d0 and the pointer to the link in a0. The +kernel then simply calls Fxattr} to fill the DTA. If a disk media +change has occurred, then E_CHNG is to be returned; the kernel then +automatically repeats the function. This also applies for all other +functions. +
  +
In every case xfs_dta_drive has to be initialized correctly, +e.g. with: +
dta.dta_drive = srchdir->dd_dmd->d_drive. If E_OK or ELINK +is returned without xfs_dta_drive being initialized, then the result +is indeterminate. +
  +
Group: Make-up of an XFS +
  +
See also: MagiC's XFS-concept +
  + +
+ +

11.21.2.30 xfs_snext

+ + + + + + + + + + + + + + + +
Name: »xfs_snext« - Search for the next matching file. +
  +
Parameters: +
  + + + + + + + + + + + + +
a0 = DTA * +
a1 = DMD * +
-> d0 = long errcode, +
-> a0 = SYMLINK * (Symlink) + +
+ +
Description: xfs_snext is required for Fsnext. The kernel has already +obtained from the DTA the relevant filesystem whose DMD is passed +in a1. Here too a symbolic link may occur. +
  +
Group: Make-up of an XFS +
  +
See also: MagiC's XFS-concept +
  + +
+ +

11.21.2.31 xfs_symlink

+ + + + + + + + + + + + + + + +
Name: »xfs_symlink« - Create a symbolic link. +
  +
Parameters: +
  + + + + + + + + + + + + +
a0 = DD * dir +
a1 = char *name +
d0 = char *to +
-> d0 = long errcode + +
+ +
Description: xfs_symlink is required for Fsymlink. A file has to be created +under the new name name in the directory dir that +points to the file to. The call is supported by DOS_XFS. +
  +
Group: Make-up of an XFS +
  +
See also: MagiC's XFS-concept +
  + +
+ +

11.21.2.32 xfs_sync

+ + + + + + + + + + + + + + + +
Name: »xfs_sync« - Synchronize the filesystem. +
  +
Parameters: +
  + + + + + + +
a0 = DMD *d +
-> long errcode + +
+ +
Description: The kernel notifies the XFS that on drive d all the +buffers have been written back. Passed in register a0 is a pointer to +a DMD (drive medium descriptor). This is created by the kernel. +
  +
The return value will be an error-code. If the DFS does not +manage the buffer (e.g. a RAMdisk), then a 0 has to be returned. The +internal DOS_XFS simply calls the DFS function with the same name. +
  +
Group: Make-up of an XFS +
  +
See also: MagiC's XFS-concept +
  + +
+ +

11.21.2.33 xfs_wlabel

+ + + + + + + + + + + + + + + +
Name: »xfs_wlabel« - Write the disk name. +
  +
Parameters: +
  + + + + + + + + + +
a0 = DD * +
a1 = char *name +
-> d0 = long errcode + +
+ +
Description: xfs_wlabel serves for (re)naming media. It is called by the +kernel when Fcreate with attribute 8 is performed. If the disk name is +stored as a special file, as for the DOS filesystem, then all other +path-based XFS functions have to ignore the disk name. +
  +
An empty name, or one consisting of '0xe5' (for TOS +compatibility) must delete the disk name (provided that media without +names are allowable). xfs_wlabel is also called for Dwritelabel. +
  +
Group: Make-up of an XFS +
  +
See also: MagiC's XFS-concept +
  + +
+ +

11.21.2.34 xfs_xattr

+ + + + + + + + + + + + + + + +
Name: »xfs_xattr« - Required for Fxattr. +
  +
Parameters: +
  + + + + + + + + + + + + + + + + + + +
a0 = DD * +
a1 = char *name +
d0 = XATTR * +
d1 = int mode +
-> d0 = long errcode +
-> a0 = SYMLINK * + +
+ +
Description: xfs_xattr is used for Fxattr. In the case mode == 0 +(i.e. follow symbolic links) one can return ELINK in d0 and a link in +a0, else ELINK is inadmissible. +
  + + + + + + +
mode == 0: Follow symbolic links (or return ELINK if appropriate) +
== 1: Do not follow (i.e. creale XATTR for the link) + +
+ +
Group: Make-up of an XFS +
  +
See also: MagiC's XFS-concept +
  + +
+ +

11.21.3 Data structures for an XFS

+ +

When working with an XFS the following data structures are +important: +

+ + + + + + + + + + + + + + + + + + +
DD (Directory descriptor) +
DHD (Directory handle descriptor) +
DMD (Drive medium descriptor) +
DTA (Disk transfer area) +
FD (File descriptor) +
MX_DEV (Device driver) + +
+ +

See also: DFS structures   MagiC's XFS-concept +

+

11.21.3.1 The directory descriptor (DD)

+ + +

The directory descriptors must be created and managed by the +XFS. All descriptors that are known to the kernel (i.e. those that are +used as a standard path for a process) have a non-zero reference +counter. The only exception is the DD for the root directory of a +drive; here the reference counter is always 0, irrespective of whether +a process has the root directory as a standard directory or not. +

+

For the kernel a DD looks like the following; these entries have +to be created by the XFS: +

+
dd_dmd:      DS.L      1    /* 0x00: Pointer to DMD                  */
+dd_refcnt:   DS.W      1    /* 0x04: Ref. counter for standard paths */
+
+

See also: MagiC's XFS-concept +

+
11.21.3.1.1 dd_dmd
+

The associated filesystem is found here. +

+
11.21.3.1.2 dd_refcnt
+

The reference counter. dd_refcnt is used only by the kernel, has +to be initialized to 0 by the XFS on creation of a DD (for the +root better to 1, see above for xfs_drv_open) and incremented by 1 at +each handing over to the kernel (-> xfs_path2DD). +

+

This means that on returning a new DD (which is thus not +otherwise referenced by the kernel) xfs_path2DD must set the reference +counter to 1. +

+

If the reference counter is non-zero, the kernel has a pointer +to this DD and it may in no way be released by the XFS. The kernel +decrements the reference counter by 1 each time it no longer requires +a DD. If the counter reaches 0 during this, then xfs_freeDD is +called. The XFS can then release the DD, or else only at a call of +xfs_garbcoll (the garbage collection) or at xfs_drv_close. +

+

Warning: The root may not be released during the +lifetime of the mounted filesystem. The root's reference counter +should be preset to 1 to prevent it being released with xfs_freeDD. +

+

See also: MagiC's XFS-concept   Data structures for an XFS +

+

11.21.3.2 The directory handle descriptor (DHD)

+ + +

The directory handles are required for +Dopendir/Dclosedir/Drewinddir. Unlike the file descriptors (FDs) the +kernel does not hold a list of opened directory handles (DH). When a +process terminates, the XFS is called via the function xfs_pterm +and must release all DHs created for the process. +

+

The XFS can obtain the owner of a DH with the kernel pointer +act_pd. For the kernel a DH looks like the following; these +entries have to be created by the XFS: +

+
dhd_dmd:  DS.L   1   /* 0x00: Pointer to DMD  */
+
+

See also: MagiC's XFS-concept   DMD +

+
11.21.3.2.1 dhd_dmd
+

The associated filesystem is found here. +

+

11.21.3.3 The Drive Medium Descriptor (DMD)

+ + +

The DMD is created by the kernel (!) for each opened drive and +also released again if necessary. The XFS stores all data here that +it has to memorize for the drive. The following fields are the ones +that the kernel requires (the ancestor object from which the XFS +derives its XFS-DMD): +

+
d_xfs:      DS.L   1    /* 0x00: The filesystem driver            */
+d_drive:    DS.W   1    /* 0x04: Drive number 0..25               */
+d_root:     DS.L   1    /* 0x06: Pointer to DD of the root        */
+d_biosdev:  DS.W   1    /* 0x0a: BIOS drive, or -1                */
+d_driver:   DS.L   1    /* 0x0c: With devcode, defines the medium */
+d_devcode:  DS.L   1    /* 0x10: e.g. SCSI target and drive       */
+d_dfs:      DS.L   1    /* 0x14: DOS-specific filesystem driver   */
+
+

Other XFSs or DFSs enter further data into the DMD. One can +envisage the DMD as an object class. A DMD derived for the DOS_XFS +only has the additional entry d_dfs. The FAT enters extra data such as +the cluster size and the number of sectors. +

+

See also: MagiC's XFS-concept   DD +

+
11.21.3.3.1 d_xfs
+

The associated filesystem driver (XFS) is found here. It is +entered by xfs_drv_open. +

+
11.21.3.3.2 d_drive
+

d_drive specifies which logical drive ('A' .. 'Z') the +filesystem is assigned to. This does not always have to correspond to +a BIOS drive. This value is always(!) entered by the +kernel when a drive is opened, before an XFS is entered. +

+
11.21.3.3.3 d_root
+

A pointer to the DD of the root directory can be found here. +

+
11.21.3.3.4 d_biosdev
+

If dealing with a partition that is handled by BIOS's Rwabs, +then the BIOS device number will be found here. Else -1 must be +entered here (e.g. for drive U: or a Macintosh partition). +

+
11.21.3.3.5 d_driver
+

Together with d_devcode, this determines the medium. That means +that if d_driver and d_devcode are identical, both drives lie on the same +medium, and if the medium is to be ejected then both filesystems have +to be locked. With a hard disk partition, d_biosdev is the BIOS +drive, d_driver is arbitrary (e.g. pointer to the XHDI +structure), d_devcode is the XHDI code of a medium, i.e. SCSI target and +device number (one WORD in each case). +

+
11.21.3.3.6 d_devcode
+

Together with d_driver, this determines the medium. That means +that if d_driver and d_devcode are identical, both drives lie on the +same medium, and if the medium is to be ejected then both filesystems +have to be locked. With a hard disk partition, d_biosdev is the +BIOS drive, d_driver is arbitrary (e.g. pointer to the +XHDI structure), d_devcode is the XHDI code of a medium, i.e. SCSI +target and device number (one WORD in each case). +

+
11.21.3.3.7 d_dfs
+

This entry is mandatory only for DOS filesystems +(i.e. already for a derived object) and contains a pointer to the +DFS subdriver. +

+

11.21.3.4 The Disk Transfer Area (DTA) for XFSs

+

The DTA is used by the old DOS functions Fsfirst and Fsnext, +whose clumsy conception by the MS-DOS originators still weighs down +the system like a curse. For the kernel the structure looks as +follows: +

+
dta_res1:        DS.B    20    /* 0x00: Not used by the kernel   */
+dta_drive:       DS.B     1    /* 0x14: Logical drive            */
+dta_attribute:   DS.B     1    /* 0x15: Found attribute          */
+dta_time:        DS.W     1    /* 0x16: Found time               */
+dta_date:        DS.W     1    /* 0x18: Found date               */
+dta_len:         DS.L     1    /* 0x1a: Found length             */
+dta_name:        DS.B    14    /* 0x1e: Found filename           */
+
+

Note: The components dta_attribute to +dta_name represent the documented user area; this has to be +handled according to GEMDOS specifications. +

+

See also: MagiC's XFS-concept +

+
11.21.3.4.1 xfs_dta_res1
+

dta_res1 (from XFS) is not used by the kernel. Here the XFS +may muck about. +

+
11.21.3.4.2 xfs_dta_drive
+

xfs_dta_drive contains the associated logical drive (0 +corresponds to drive A: etc). With this information the kernel can +decide at Fsnext which XFS has to perform the task. +

+

11.21.3.5 The File Descriptor (FD)

+ + +

The file descriptors must be created and managed by the XFS. All +the descriptors that are known to the kernel have a non-zero reference +counter. For the kernel an FD looks exactly like a DD, which is +why the same data structure is used in the DOS_XFS. +

+

For the kernel an FD looks like the following; these entries +have to be created by the XFS: +

+
fd_dmd:      DS.L    1   /* 0x00: Pointer to DMD                       */
+fd_refcnt:   DS.W    1   /* 0x04: Reference counter for closing, or -1 */
+fd_mode:     DS.W    1   /* 0x06: Open-mode and flags                  */
+fd_dev:      DS.L    1   /* 0x08: Pointer to MX_DEV                    */
+
+

The class derived from DOS_XFS (a 'DOS-FD') also has the +additional fields: +

+
fd_ddev:     DS.L    1    /* 0x0c: Pointer to MX_DDEV                  */
+fd_name:     DS.B   11    /* 0x10: DD_FD: Name in internal format      */
+fd_attr:     DS.B    1    /* 0x1b: Attribute                           */
+fd_owner:    DS.L    1    /* 0x1c: DD_FD: Owner of an FD, or NULL      */
+fd_parent:   DS.L    1    /* 0x20: Pointer to the parent DD_FD         */
+fd_children: DS.L    1    /* 0x24: DD_FD: List of all children         */
+fd_next:     DS.L    1    /* 0x28: Pointer to FDs im same directory    */
+fd_multi:    DS.L    1    /* 0x2c: Pointer to FD of the same file      */
+fd_multi1:   DS.L    1    /* 0x30: Pointer to first list element       */
+fd_fpos:     DS.L    1    /* 0x34: Position of the file pointer        */
+fd_dirch:    DS.B    1    /* 0x38: Bit0: 'dirty'                       */
+fd_unused:   DS.B    1    /* 0x39: Not used                            */
+fd_time:     DS.W    1    /* 0x3a: Time  (8086)                        */
+fd_date:     DS.W    1    /* 0x3c: Date (8086)                         */
+fd_stcl:     DS.W    1    /* 0x3e: Starting cluster                    */
+fd_len:      DS.L    1    /* 0x40: File length in bytes                */
+fd_dirpos:   DS.L    1    /* 0x44: Pos. of matching entry in directory */
+fd_user1:    DS.L    1    /* 0x48: Available for user allocation       */
+fd_user2:    DS.L    1    /* 0x4c: Available for user allocation       */
+
+

See also: MagiC's XFS-concept   DMD   MX_DDEV   MX_DEV +

+
11.21.3.5.1 fd_dmd
+

fd_dmd contains a pointer to the associated filesystem. +

+
11.21.3.5.2 fd_refcnt
+

The reference counter. This entry is used only by the +kernel, has to be decremented by 1 at each dev_close call +and initialized (to 1) by xfs_fopen. +

+

A reference counter of -1 signals that the FD may never be +released. This is necessary for, say, the device files U:\DEV\CON, +U:\DEV\AUX etc. that are always available. +

+
11.21.3.5.3 fd_mode
+

fd_mode contains the mode, as described for xfs_fopen. If two +FDs point to the same file, then the modes have to be compatible. +Thanks to the simple MagiC-internal mode notation, a plain rotation +and ANDing of the bits is sufficient, e.g.: +

+
  move.w   fd_mode(a0),d1
+  btst     #BOM_NOCHECK,d1  ; No check by the XFS?
+  bne.b    _opf_nxt         ; Yes, ddev_open checks
+  ror.b    #4,d1
+  and.b    d0,d1
+  bne      opd_eaccdn       ; Conflict: return(EACCDN)
+
+
11.21.3.5.4 fd_dev
+

fd_dev is the pointer to the device driver. +

+
11.21.3.5.5 fd_ddev
+

Here the DFS has to enter the MX_DDEV (i.e. the device +driver) at a dfs_dir2FD call. +

+
11.21.3.5.6 fd_name
+

Here the name (8+3) is stored in an internal format. The name is +valid only when it refers to a subdirectory, and only in a +prototype FD, i.e. in fd_multi1. The name of the root is an empty +character string. +

+
11.21.3.5.7 fd_attr
+

Here the file attribute is stored. This is valid only in a +prototype FD, i.e. in fd_multi1. From the attribute one can +recognize whether the FD represents a directory. +

+
11.21.3.5.8 fd_owner
+

Here a pointer to the owner of an FD is stored (i.e. a +pointer to the basepage). A value of NULL signifies that the +FD is not allocated at present. +

+
11.21.3.5.9 fd_parent
+

This is a chaining pointer to the parent, i.e. to the +directory in which the file lies, or the parent directory of a +subdirectory. fd_parent is valid only for the prototype FD. +

+
11.21.3.5.10 fd_children
+

This is a list of all opened files and opened subdirecories. +fd_children is valid only for the prototype FD. +

+
11.21.3.5.11 fd_next
+

This is a pointer to the next FD in the same directory, i.e. +the next sibling; this can be an opened file or a subdirectory - in +principle these are not differentiated. +
fd_next is valid only for the prototype FD. +

+
11.21.3.5.12 fd_multi
+

If a file is opened several times, then a 'clone' of the +prototype FD is created. Most of the FD fields are invalid for +this clone; in essence only driver, mode and file position are valid. +fd_multi is a chained list, wich is NULL-terminated. +

+
11.21.3.5.13 fd_multi1
+

This is the associated prototype FD that contains the valid +file data. If a file is only opened once, then: fd->fd_multi1 == +fd. +

+
11.21.3.5.14 fd_fpos
+

fd_fpos is the position of the file pointer; it is 0L for a +device. +

+
11.21.3.5.15 fd_dirch
+

Bit 0 of fd_dirch indicates whether a file has been altered and +hence on closing the file the directory (fd_parent) has to be updated +(does not happen when dealing with a folder). The other bits are +reserved and are used in part by the DOS_XFS. +

+
11.21.3.5.16 fd_unused
+

Unused and reserved. +

+
11.21.3.5.17 fd_time
+

fd_time is the time of day from the directory entry in Intel +format. +

+
11.21.3.5.18 fd_date
+

fd_date is the date from the directory entry in Intel +format. +

+
11.21.3.5.19 fd_stcl
+

fd_stcl is the starting cluster in Motorola format. +

+
11.21.3.5.20 fd_len
+

fd_len is the file length in bytes in Motorola format. +

+
11.21.3.5.21 fd_dirpos
+

fd_dirpos is the position of the associated entry in the parent. +It is valid only for the prototype FD. +

+
11.21.3.5.22 fd_user1
+

Together with fd_user2, 2 LONGwords available for free +allocation by the user. The FAT_DFS stores here additional information +for fd_fpos, namely the current cluster. Other DFSs can store +other data. These fields are valid initially only for the prototype +FD, except that on opening (ddev_open) the data are copied +explicitly from the prototype FD into the clone. +

+
11.21.3.5.23 fd_user2
+

Together with fd_user1, 2 LONGwords available for free +allocation by the user. The FAT_DFS stores here additional information +for fd_fpos, namely the current cluster. Other DFSs can store +other data. These fields are valid initially only for the prototype +FD, except that on opening (ddev_open) the data are copied +explicitly from the prototype FD into the clone. +

+

11.21.3.6 The device driver (MX_DEV)

+ +

The device driver is inserted by the XFS into the file +descriptor at the opening of a file, and called directly by the +kernel. The device driver must make the following functions available: +

+
typedef struct _mx_dev
+{
+  LONG  (*dev_close)();
+  LONG  (*dev_read)();
+  LONG  (*dev_write)();
+  LONG  (*dev_stat)();
+  LONG  (*dev_seek)();
+  LONG  (*dev_datime)();
+  LONG  (*dev_ioctl)();
+  LONG  (*dev_getc)();
+  LONG  (*dev_getline)();
+  LONG  (*dev_putc)();
+} MX_DEV;
+
+

See also: MagiC's XFS-concept +

+
11.21.3.6.1 dev_close
+ + + + + + + + + + + + + + + +
Name: »dev_close« +
  +
Parameters: +
  + + + + + + +
a0 = FD *file +
-> d0 = long errcode + +
+ +
Description: If fd_refcnt is not 0 already, fd_refcnt must be decremented +(this must be accomplished by the MX_DEV). On this occasion any +buffers that may be present should be written back and directory +entries updated. If fd_refcnt is 0, the FD can be released. At a disk +media change fd_refcnt is already 0 at a dev_close call, i.e. the FD just +needs to be released. +
  +
The file driver installed by DOS_XFS writes back the directory +data and then calls the MX_DDEV subdriver. +
  +
Group: Workstation driver +
  +
See also: — +
  + +
+ +
11.21.3.6.2 dev_datime
+

For Fdatime. The file driver installed by DOS_XFS passes +the call on to the MX_DDEV subdriver, if the function is supported in +the MX_DDEV driver (pointer != NULL), otherwise the function will be +performed automatically with the help of the FD data. +

+

Parameters: +

+
+ + + + + + + + + + + + + + + + + + + + +
a0=FD *file
a1=int d[2]
d0=int setflag
-> d0=long errcode
+
+ +
11.21.3.6.3 dev_getc
+ + + + + + + + + + + + + + + +
Name: »dev_getc« +
  +
Parameters: +
  + + + + + + + + + +
a0 = FD *file +
d0 = int mode +
-> d0 = unsigned long c + +
+ +
Description: dev_getc is used by the kernel for Fgetchar and the +character-oriented functions (Cconin, Cconout, Cauxin etc.). In the +case of a device, the return value may be a LONGword (e.g. for CON +having the scancode of the key in the high-WORD), else a byte (always +extended to 'unsigned'). At EOF, 0x0000FF1A must be returned. +
  +
mode means: +
  + + + + + + + + + +
CMODE_COOKED (1) Bit 0 set: Control characters ^C, ^S, ^Q will be processed +
CMODE_RAW (0) Bit 0 not set: 'raw' mode +
CMODE_ECHO (2) Bit 1 set: Input will be echoed + +
+ +
The file driver installed by DOS_XFS passes the call on to the +MX_DDEV subdriver if the function is supported in the MX_DDEV driver +(pointer != NULL), otherwise the function is implemented automatically +as dev_fread. +
  +
Group: Workstation driver +
  +
See also: — +
  + +
+ +
11.21.3.6.4 dev_getline
+

For line-oriented input. mode as in dev_getc. +The return will be the number of characters input without terminatng +characters or similar. The file driver installed by DOS_XFS passes the +dev_getline call on to the MX_DDEV subdriver if the function is +supported in the MX_DDEV driver (pointer != NULL); otherwise the +function is implemented auto matically as dev_fread. The line is then +terminated with CR and LF; +

+

Parameters: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
a0=FD *file
a1=char *buf
d1=long size
d0=int mode
-> d0=long amount
+
+ +
11.21.3.6.5 dev_ioctl
+

For Fcntl. The file driver installed by DOS_XFS passes +the dev_ioctl call directly to the MX_DDEV subdriver. Only the +following functions are handled however: FSTAT and FUTIME. These +should also be executed by other XFSs. Every file driver should +support FIONREAD and FIONWRITE. +

+

Parameters: +

+
+ + + + + + + + + + + + + + + + + + + + +
a0=FD *file
d0=int cmd
a1=void *buf
-> d0=long errcode
+
+ +
11.21.3.6.6 dev_putc
+ + + + + + + + + + + + + + + +
Name: »dev_putc« +
  +
Parameters: +
  + + + + + + + + + + + + +
a0 = FD *file +
d0 = int mode +
d1 = long value +
-> d0 = unsigned long count + +
+ +
Description: dev_putc is used by the kernel for Fgetchar and the +character-oriented functions (Cconin, Cconout, Cauxin etc.). In the +case of a terminal the return value must be 4L (i.e. 4 bytes written), +otherwises 1L if writing was successful. +
  +
mode means: +
  + + + + + + +
CMODE_COOKED (1) Bit 0 set: Control characters ^C, ^S, ^Q will be processed +
CMODE_RAW (0) Bit 0 not set: 'raw' mode + +
+ +
The file driver installed by DOS_XFS passes the call on to the +MX_DDEV subdriver if the function is supported in the MX_DDEV driver +(pointer != NULL), otherwise the function is automatically implemented +as dev_fwrite. +
  +
Group: Workstation driver +
  +
See also: — +
  + +
+ +
11.21.3.6.7 dev_read
+

From the file file, count bytes are read into +the buffer buffer. The return is the number of characters +actually read. The file driver installed by DOS_XFS passes the +dev_read call directly to the MX_DDEV subdriver. +

+

Parameters: +

+
+ + + + + + + + + + + + + + + + + + + + +
a0=FD *file
d0=long count
a1=char *buffer
-> d0=long amount
+
+ +
11.21.3.6.8 dev_seek
+

For Fseek. mode is, as in TOS, 0, 1 or 2. The +return value will be the current position of the write/read pointer; +device drivers must always return a 0L here. The file driver installed +by DOS_XFS passes the dev_seek call directly to the MX_DDEV subdriver. +

+

Parameters: +

+
+ + + + + + + + + + + + + + + + + + + + +
a0=FD *file
d0=long where
d1=int mode
-> d0=long position
+
+ +
11.21.3.6.9 dev_stat
+ + + + + + + + + + + + + + + +
Name: »dev_stat« +
  +
Parameters: +
  + + + + + + + + + + + + + + + +
a0 = FD *file +
a1 = MAGX_UNSEL *unselect oder NULL +
d0 = int rwflag +
d1 = long apcode +
-> d0 = long status + +
+ +
Description: dev_stat specifies the read/write status of the file. It is +called for Fselect (or for Cconos/Cconis etc.) for instance. In +contrast to MiNT, it is left to the driver here whether it is +interrupt-capable or not, i.e. whether it is able to call a waiting +application in interrupt again or not. rwflag specifies +whether the write or read status is inquired for. +
  +
unselect is either NULL or a pointer to the following +structure: +
  +
typedef struct
+{
+   union
+   {
+      void (*unsel) (MAGX_UNSEL *un);
+      long status;
+   }
+   long param;
+} MAGX_UNSEL;
+
+
Procedure: +
  +
Generally the following applies: If unselect is non-0, +the return value must be returned not only as the function result (in +d0.L) but also in unselect->status. This applies for all kinds of +return values. One can optionally store a parameter in +unsel->param. +
  +
If apcode == NULL, polling will be performed, i.e. +the application is not put to sleep. So the return will be: +
  +
0 = Not ready, 1 = Ready, <0 = Error. +
  +
If apcode ! = NULL (then unselect != NULL as +well) then the return will be: +
  + + + + + + + + + + + + +
<0 Error +
0 Not ready, device can only be polled +
1 Ready +
>0 Perhaps a pointer to a function that deinstalls the awakening +interrupt again (corresonds more or less to unselect in MiNT) + +
+ +
If the device is not ready and is interrupt-capable, then +one proceeds as follows: +
  + +
    +
  1. Initialize unselect with the address of the clean-up +routine and an optional parameter; prototype on the lines of: +
    void unselect( a0 = MAGX_UNSEL *un,a1 = void *ap_code );
    +
    +
  2. +
  3. Install interrupt for awakening, pass it unselect (and +with it also the optional parameter) and appl +
  4. +
  5. Return pointer to the clean-up routine in d0 +
  6. +
+ +
The interrupt routine does the following: +
  + +
    +
  1. The interrupt arrives +
  2. +
  3. unselect->status has 1 (OK) or < 0 (not OK) written to it +and the interrupt is deactivated! The application is awakened with: +
    kernel->appl_IOcomplete( a0 = APPL *ap );
    +
    +
  4. +
+ +
The clean-up routine does the following: +
  + +
    +
  1. The interrupt is deactivated. +
  2. +
  3. If it has not happened already, unsel->status will have a 1 +(arrived) or a 0 (not arrived) or < 0 (error) entered into it. One +must ensure that no IOcomplete and no write access to unsel +can follow subsequently. A value that is not 1 but greater than zero +is always interpreted as the address of the clean-up routine; this +still has to be called if the interrupt has not arrived. If the +interrupt entered a value of 2L, say, the kernel would assume that the +interrupt has not arrived and that the address of the clean-up routine +is still contained in the MAGX_UNSEL structure. A jump to address 2 +however is then deadly rather quickly! +
  4. +
+ +
The DOS functions Finstat and Foutstat at first attempt to +execute the call as Fcntl} (FIONREAD or FIONWRITE). If this +subfunction of dev_ioctl does not exist (the file driver has to return +EINVFN!), then dev_stat is called. In that case one can state either +that a 'character is available' (value == 1) or 'no character is +available' (value == 0). +
  +
The file driver installed by DOS_XFS passes on the call directly +to the MX_DDEV subdriver. +
  +
Group: Workstation driver +
  +
See also: — +
  + +
+ +
11.21.3.6.10 dev_write
+

To the file file, count bytes are written from +the buffer buffer. The return is the number of characters +actually written. The file driver installed by DOS_XFS updates the +date/timestamp of the file and then passes the dev_write call to the +MX_DDEV subdriver. +

+

Parameters: +

+
+ + + + + + + + + + + + + + + + + + + + +
a0=FD *file
d0=long count
a1=char *buffer
-> d0=long amount
+
+ +

11.21.4 Installation of an XFS

+ +

An XFS is just a program that installs the driver and then +terminates itself resident. The installation is performed with: +
kernel = Dcntl(KER_INSTXFS, NULL, &myxfs). +

+

The return is a pointer to important kernel functions, or an +error- code. The kernel functions can also be inquired for +independently of the installation of an XFS, namely with: kernel = +Dcntl(KER_GETINFO, NULL, NULL). +

+

The deinstallation of an XFS is not provided for. +

+

11.21.5 Kernel functions for an XFS

+ +

MagiC makes available to the installed XFSs, DFSs or device +drivers some kernel information as well as kernel functions. The same +register conventions apply for the kernel functions as for the XFS +functions, i.e. d0-d2 and a0-a2 may be destroyed. One can obtain a +pointer to the structure that contains the kernel functions with: +

+
     kernel = Dcntl (KER_INSTXFS, NULL, &myxfs);   or
+     kernel = Dcntl (KER_GETINFO, NULL, NULL);
+
+

In the first case an XFS is installed, in the second case one +only gets the kernel structure (perhaps for a DFS or a device +driver). The build-up of the kernel structure in detail: +

+ +
typedef struct
+{
+  WORD   mxk_version;
+  VOID (*mxk_fast_clrmem)      ( void *von, void *bis );
+  BYTE (*mxk_toupper)          ( char c );
+  VOID (*mxk__sprintf)         ( char *dest, char *source, LONG *p );
+  VOID  *mxk_mxk_act_pd;
+  APPL  *mxk_act_appl;
+  APPL  *mxk_keyb_app;
+  WORD  *mxk_pe_slice;
+  WORD  *mxk_pe_timer;
+  VOID (*mxk_appl_yield)       ( void );
+  VOID (*mxk_appl_suspend)     ( void );
+  VOID (*mxk_appl_begcritic)   ( void );
+  VOID (*mxk_appl_endcritic)   ( void );
+  LONG (*mxk_evnt_IO)          ( LONG ticks_50hz, void *unsel );
+  VOID (*mxk_evnt_mIO)         ( LONG ticks_50hz, void *unsel, WORD cnt );
+  VOID (*mxk_evnt_emIO)        ( APPL *ap );
+  VOID (*mxk_appl_IOcomplete)  ( APPL *ap );
+  LONG (*mxk_evnt_sem)         ( WORD mode, void *sem, LONG timeout );
+  VOID (*mxk_Pfree)            ( void *pd );
+  WORD   mxk_int_msize;
+  VOID  *mxk_int_malloc        ( void );
+  VOID   mxk_int_mfree         ( void *memblk );
+  VOID   mxk_resv_intmem       ( void *mem, LONG bytes );
+  LONG   mxk_diskchange        ( WORD drv );
+  LONG   mxk_DMD_rdevinit      ( DMD *dmd );
+  LONG   mxk_proc_info         ( WORD code, PD *pd );
+  LONG   mxk_mxalloc           ( d0 = LONG amount, d1 = WORD mode, a0 = PD *pd );
+  LONG   mxk_mfree             ( a0 = void *block );
+  LONG   mxk_mshrink           ( d0 = LONG newlen, a0 = void *block );
+} MX_KERNEL;
+
+

See also: MagiC's XFS-concept +

+

11.21.5.1 mxk_version

+

mxk_version is the version number, which is simply 3 at present. +For each change of the kernel structure the version number is +increased, so that programs may adapt themselves accordingly. +

+

11.21.5.2 mxk_fast_clrmem

+

mxk_fast_clrmem is a fast memory clearance routine, which sets +the memory block between from and to (exclusive) to 0. +

+

The following apply for this: +

+
+ + + + + + + + + + +
a0=void *from
a1=void *to
+
+ +

11.21.5.3 mxk_toupper

+

mxk_toupper converts the character c to upper case, +respecting the national special characters (accents, umlauts etc.). +

+

The following apply for this: +

+
+ + + + + +
d0=char c
+
+ +

11.21.5.4 mxk__sprintf

+

mxk__sprintf is a function that expects its arguments on the +stack. Items to pass are the destination character string +dest, the template source and the values to be entered +p[]. Depending on the formatting statement, the LONGwords are +interpreted as 'unsigned int' (%W), 'signed long' (%L) or character +string (%S). +

+

With %W the WORD lying further down in memory is used, the +sequence %% inserts a 'percent' character. +

+

11.21.5.5 mxk_act_pd

+

mxk_act_pd is the pointer to the current basepage; the +address can be obtained also from the system header or the DOS +variables. +

+

11.21.5.6 mxk_act_appl

+

mxk_act_appl is a pointer to the current application +(i.e. the running task). The build-up of the structure is not +documented. Due to faster access, the pointer is used as the +descriptor in place of the ap_id. +

+

11.21.5.7 mxk_keyb_app

+

mxk_keyb_app is the pointer to the application that currently +'owns' the keyboard. The pointer can be used by device drivers that +have to process the keyboard-owning application in a different way, +for instance. +

+

11.21.5.8 mxk_pe_slice

+

mxk_pe_slice is used for preemptive multitasking. If +*pe_slice == -1 then preemptive multitasking is switched off, +and disk accesses are not interrupted. +

+

11.21.5.9 mxk_pe_timer

+

mxk_pe_timer is used for preemptive multitasking. If +*pe_slice == -1 then preemptive multitasking is switched off, +and disk accesses are not interrupted. +

+

11.21.5.10 mxk_appl_yield

+

mxk_appl_yield allocates CPU time to the system. It is important +for drivers that cannot wait for an interrupt and have to prevent that +their 'busy waiting' paralyses the system. +

+

11.21.5.11 mxk_appl_suspend

+

mxk_appl_suspend works like appl_yield, though it allocates a +lower priority to the application, perhaps as a background process. +

+

11.21.5.12 mxk_appl_begcritic

+

mxk_appl_begcritic signals that the current application has +entered a critical phase and may not be terminated. +

+

11.21.5.13 mxk_appl_endcritic

+

mxk_appl_endcritic signals the end of the critical phase for the +current application. If a termination command has arrived in the +meantime then the program will be terminated. +

+

11.21.5.14 mxk_evnt_IO

+ + + + + + + + + + + + + + + +
Name: »evnt_IO« +
  +
Parameters: +
  + + + + + + +
d0 = long ticks_50hz +
a0 = void *unsel + +
+ +
Description: mxk_evnt_IO makes it possible to wait for one external +event. The external event in question is either an interrupt or +another application (which perhaps writes to a pipe for awakening). +The function is used for the creation of device drivers: +
  +
Procedure (see DEV_LPT1 as an example): +
  + +
    +
  1. Block interrupts. +
  2. +
  3. Inquire whether the event (in the case of DEV_LPT1 the event is +called: 'Centronics busy off') has arrived. +
  4. +
  5. If so, free interrupts and perform the action (in the case of +DEV_LPT1: print character). +
  6. +
  7. If not, set up interrupt routine (in the case of DEV_LPT1: +MFP-I0, i.e. 'Activate Centronics busy interrupt') and make available +to it the current application (act_appl) and also a LONGword address +into which the interrupt routine can write return messages. This +address should have written to it the address of a routine that +deinstalls the interrupt again, and can be followed by some user +requirements. i.e. some further data. The unselect routine later gets +a pointer to all this data and can evaluate the optional parameters +for instance. The whole mechanism is required to guarantee a corrrect +deinitialization of the interrupt in each case. +
  8. +
  9. Release interrupts. +
  10. +
  11. Call evnt_IO. In d0.w specify the number of 50Hz ticks for the +timeout; 0 means 'no timeout'. In a0 give the address of the LONGword +containing the address of the clean-up routine that deinstalls the +interrupt again (which is followed by optional further parameters, +provided the unselect routine understands these). In the case of +incorporation of device drivers for Fselect, only one optional +LONGword is possible. +
    On arrival of the interrupt, the interrupt routine writes a +status < 0L (error) or 1L (OK) in place of the deinitialization +routine into the status LONGword (which previously contained its own +start address). Following this the routine will deinstall itself or +make sure that no actions are performed on following interrupts. +Finally the interrupt routine awakens the application assigned to the +interrupt, using the call appl_IOcomplete with the application as +parameter. +
  12. +
  13. evnt_IO returns either the value 0L (timeout, the interrupt has +not arrived) or < 0 (the interrupt has written an error-code to the +status LONGword) or 1L (the interrupt has written a 1L into the status +LONGword). Deinstallation of the interrupt is no longer required as +the kernel has taken care of this if the interrupt routine did not do +this itself on arrival of the interrupt. +
  14. +
+ +
Group: Kernel functions +
  +
See also: — +
  + +
+ +

11.21.5.15 mxk_evnt_mIO

+ + + + + + + + + + + + + + + +
Name: »evnt_mIO« +
  +
Parameters: +
  + + + + + + + + + +
d0 = long ticks_50hz +
a0 = void *unsel +
d1 = int cnt + +
+ +
or +
  + + + +
a0 = APPL *ap + +
+ +
Description: mxk_evnt_mIO makes it possible to wait for several +external events; this function is used by Fselect (several files!) for +instance. +
  +
Procedure: +
  + +
    +
  1. Create a LONGword table for n events with a length of 2*n. +
  2. +
  3. Enter the clean-up routine (unselect routine) for each event +(followed by an optional LONGword parameter) and set up the interrupt. +The order is important: one must prevent the unselect address +overwriting the return value of an already arrived interrupt - if +necessary block interrupts. +
  4. +
  5. Call evnt_mIO. The parameters are the same as in evnt_IO: in +d1.w the number of events is passed, a0 is the start of the table. +
  6. +
  7. evnt_mIO offers no return value. The table must be searched +through and the interrupts deinstalled (e.g. call the unselect +routines); during this one can check which interrupts have arrived +already. +
  8. +
  9. Call evnt_emIO with the current application. This call ensures +that after deinstallation of all the interrupts their now useless +messages to the application are deleted. +
  10. +
+ +
Applications waiting for evnt_(m)IO events appear in the program +manager as waiting for 'io' (input/output) or 'io ti' (input/output +with timeout). +
  +
Group: Kernel functions +
  +
See also: — +
  + +
+ +

11.21.5.16 mxk_appl_IOcomplete

+

mxk_appl_IOcomplete wakes up an application that is waiting for +evnt_(m)IO. +

+

The following apply for this: +

+
+ + + + + +
a0=APPL *ap
+
+ +

11.21.5.17 mxk_evnt_sem

+ + + + + + + + + + + + + + + +
Name: »evnt_sem« +
  +
Parameters: +
  + + + + + + + + + +
d0 = int mode +
a0 = void *sem +
d1 = long timeout + +
+ +
Description: mxk_evnt_sem is used for controlling semaphores. The following +subfunctions are possible for mode: +
  + + + + + + + + + + + + + + + + + + + + + +
0 SEM_FREE Release semaphore (without task-switching!) +
1 SEM_SET Set semaphore, wait if necessary +
2 SEM_TEST Obtain owner of semaphore (if necessary NULL) +
3 SEM_CSET Set semaphore, if not set already +
4 SEM_GET Get semaphore if name is known +
5 SEM_CREATE Create semaphore, i.e. establish new one +
6 SEM_DEL Remove semaphore + +
+ +
SEM_SET and SEM_CSET are the only subfunctions that can initiate +a task-switch. +
  +
In contrast to wind_update, the setting and releasing of +semaphores can not be nested with these calls. If one attempts to +reserve again a semaphore that is already reserved then this results +in an error-code. +
  +
On releasing the semaphores no task-switching will take place, +i.e. though the semaphores may now belong to another application that +has a 'ready' status, it has not yet been allocated any CPU time. If +the situation is not critical then an appl_yield should be performed +subsequently in each case. +
  +
The screen semaphore has the name _SCR and may use mxk_evnt_sem +only with the subfunction SEM_TEST. +
  +
SEM_CREATE does not set the creator automatically as the owner. +This is not necessary as no task-switching has taken place, so SEM_SET +can be performed afterwards without further ado. +
  +
SEM_DEL requires that the deleter is also the owner. On deletion +all waiting applications are released; they receive, if waiting via +evnt_sem(SEM_SET, ..), a -2 as return value. People deleting system +semaphores (those whose names start with a '_') have only themselves +to blame! +
  +
Group: Kernel functions +
  +
See also: — +
  + +
+ +

11.21.5.18 SEM_FREE

+

Parameters: +

+ + + +
a0 = Pointer to semaphore + + + + + + +
-> 0 OK +
-> -1 Semaphore unused, or used by another APP + +
+ + +
+ +

11.21.5.19 SEM_SET

+

Parameters: +

+ + + + + + +
a0 = Pointer to semaphore +
d1 = Timeout in 50Hz ticks + + + + + + + + + + + + +
-> 0 OK +
-> 1 Timeout +
-> -1 Semaphore was already set by me +
-> -2 Semaphore has been removed in the meantime + +
+ + +
+ +

11.21.5.20 SEM_TEST

+

Parameters: +

+ + + +
a0 = Pointer to semaphore + + + + + + +
-> >0 Owner +
-> 0 Not used + +
+ + +
+ +

11.21.5.21 SEM_CSET

+

Parameters: +

+ + + + + + +
a0 = Pointer to semaphore +
d1 = Timeout in 50Hz ticks + + + + + + + + + +
-> 0 OK +
-> 1 Semaphore set by another APP +
-> -1 Semaphore was already set by me + +
+ + +
+ +

11.21.5.22 SEM_GET

+

Parameters: +

+ + + +
d1 = Name of semaphore + + + + + + +
-> >0 Pointer to semaphore. +
-> -1 Semaphore not found + +
+ + +
+ +

11.21.5.23 SEM_CREATE

+

Parameters: +

+ + + + + + +
a0 = Pointer to semaphore (32 bytes at even address) +
d1 = Name void + +
+ +

11.21.5.24 SEM_DEL

+

Parameters: +

+ + + +
a0 = Pointer to semaphore + + + + + + +
-> 0 OK +
-> -1 Semaphore invalid + +
+ + +
+ +

11.21.5.25 mxk_Pfree

+

mxk_Pfree releases the memory for a process that was terminated +with Ptermres. This is necessary to remove a device driver correctly. +

+

The following apply for this: +

+
+ + + + + +
a0=void *pd
+
+ +

11.21.5.26 mxk_int_msize

+

mxk_int_msize gives the length of a memory block of the internal +(kernel) memory management. +

+

11.21.5.27 mxk_int_malloc

+

mxk_int_malloc allocates an internal memory block. If there is +no free memory any more then first a global 'garbage +collection' will be performed (see description of the XFS), and +if this fails the system will be halted. Internal memory blocks may be +reserved only in small lots, else one soon gets 'Out of internal +memory' messages and the system locks up. +

+

11.21.5.28 mxk_int_mfree

+

mxk_int_mfree releases a memory block once more. +

+

The following apply for this: +

+
+ + + + + +
a0=void *memblk
+
+ +

11.21.5.29 mxk_resv_intmem

+

mxk_resv_intmem extends the kernel memory. There is no +possibility foreseen to claim memory back. As the kernel only reserves +internal memory sufficient for the FAT drives on booting, it may be +necessary for an XFS to reserve further kernel memory with this +function at the start. +

+

The following apply for this: +

+
+ + + + + + + + + + +
a0=void *mem
d0=long bytes
+
+ +

11.21.5.30 mxk_diskchange

+

mxk_diskchange must be called when an XFS or DFS driver +has recognized a disk media change. The XFS driver releases +its files and structures and subsequently the kernel. +

+

Return values: +

+ + + + + + +
EDRIVE Invalid drive +
E_CHNG Valid drive with new disk medium + +
+ +

The following apply for this: +

+
+ + + + + +
d0=int drv
+
+ +

11.21.5.31 mxk_DMD_rdevinit

+

As of kernel version 1. +

+

mxk_DMD_rdevinit initializes the fields d_driver and +d_devcode of the DMD and uses the field d_biosdev for +this. It is required for interchangeable disk mechanisms. +

+

The following apply for this: +

+
+ + + + + +
a0=DMD *dmd
+
+ +

11.21.5.32 mxk_proc_info

+

As of kernel version 2. +

+

mxk_proc_info obtains data for the current process: +

+ + + + + + + + + +
d0 = 0: 0: Highest available subfunction number +
  1: Domain +
  2: Process ID + +
+ +

The following apply for this: +

+
+ + + + + + + + + + +
d0=WORD code
a0=PD *pd
+
+ +

11.21.5.33 mxk_mxalloc

+

As of kernel version 4. +

+

mxk_mxalloc enables fast memory allocation, e.g. for a +RAMdisk-XFS, without having to go via a trap. +

+

pd specifies the process that is entered as the owner of +the new block, therefore normally the basepage of the XFS driver +should be passed. +

+

11.21.5.34 mxk_mfree

+

As of kernel version 4. +

+

mxk_mfree releases the memory allocated by mxk_mxalloc. +

+

11.21.5.35 mshrink

+

As of kernel version 4. +

+

mxk_mshrink alters the size of a memory block. +

+

11.21.6 Symbolic links and the XFS-concept

+

Symbolic links (also called aliases in the user +documentation in accordance with Macintosh nomenclature) are files +that are specially labelled in some way, and instead of data contain a +path which in turn points to another file. Such a path can also point +to a no longer or not yet existing file. Paths can be absolute +or relative, where the latter have the directory in which the +link lies as a reference. +

+

In memory such links are managed as structures: +

+
{
+   WORD n;         /* Rounded up to an even number, incl. EOS */
+   char path[n];   /* Path with EOS at end  */
+}
+
+

Note: When some XFS functions come across a symlink +they have to dereference it, i.e. they return to the kernel in d0 the +error-code ELINK and in a0 a pointer to a structure of the above form. +The kernel then looks after the dereferencing and the limiting of the +maximum nesting depth (if the symlink points to another one). +

+

XFS functions that may return ELINK are: +

+

xfs_path2DD, xfs_sfirst, xfs_snext, xfs_fopen, xfs_xattr, +xfs_attrib. +

+

See also: MagiC's XFS-concept +

+

11.21.7 MX_DOSLIMITS

+

This structure is defined as follows: +

+
typedef struct
+{
+    UWORD version;        /* Version number                 */
+    UWORD num_drives;     /* Max. number of drives          */
+    ULONG max_secsizb;    /* Max. sector size in bytes      */
+    UWORD min_nfats;      /* Min. number of FATs            */
+    UWORD max_nfats;      /* Max. number of FATs            */
+    ULONG min_nclsiz;     /* Min. number of sectors/cluster */
+    ULONG max_nclsiz;     /* Max. number of sectors/cluster */
+    ULONG max_ncl;        /* Max. number of clusters        */
+    ULONG max_nsec;       /* Max. number of sectors         */
+} MX_DOSLIMITS;
+
+

See also: Dcntl   KER_DOSLIMITS   MagiC's XFS-concept +

+

11.21.8 XFS structures

+ +
+

11.21.8.1 dev_descr

+

This structure is defined as follows: +

+
struct dev_descr
+{
+    DEVDRV  *driver;
+    SHORT   dinfo;
+    SHORT   flags;
+    struct tty *tty;
+    LONG    devdrvsiz;
+    LONG    reserved[4];
+};
+
+

Note: The component devdrvsiz describes the size +of the DEVDRV structure. +

+

See also: Dcntl   MagiC's XFS-concept +

+

11.21.8.2 DEVDRV

+

This structure is defined as follows: +

+
typedef struct devdrv
+{
+    LONG (*open)      (FILEPTR *f);
+    LONG (*write)     (FILEPTR *f, BYTE *buf, LONG bytes);
+    LONG (*read)      (FILEPTR *f, BYTE *buf, LONG bytes);
+    LONG (*lseek)     (FILEPTR *f, LONG where, WORD whence);
+    LONG (*ioctl)     (FILEPTR *f, WORD mode, VOID *buf);
+    LONG (*datime)    (FILEPTR *f, WORD *timeptr, WORD rwflag);
+    LONG (*close)     (FILEPTR *f, WORD pid);
+    LONG (*select)    (FILEPTR *f, LONG proc, WORD mode);
+    VOID (*unselect)  (FILEPTR *f, LONG proc, WORD mode);
+    LONG reserved[3];
+} DEVDRV;
+
+

See also: Dcntl   dev_descr   FILESYS   MagiC's XFS-concept +

+

11.21.8.3 FILESYS

+

This structure is defined as follows: +

+
typedef struct filesys
+{
+    struct  filesys *next;
+    LONG    fsflags;
+    LONG    (*root)       (WORD drv, fcookie *fc);
+    LONG    (*lookup)     (fcookie *dir, BYTE *name, fcookie *fc);
+    LONG    (*creat)      (fcookie *dir, BYTE *name, UWORD mode,
+                           WORD attrib, fcookie *fc);
+    DEVDRV *(*getdev)     (fcookie *fc, LONG *devspecial);
+    LONG    (*getxattr)   (fcookie *fc, XATTR *xattr);
+    LONG    (*chattr)     (fcookie *fc, WORD attr);
+    LONG    (*chown)      (fcookie *fc, WORD uid, WORD gid);
+    LONG    (*chmode)     (fcookie *fc, UWORD mode);
+    LONG    (*mkdir)      (fcookie *dir, BYTE *name, UWORD mode);
+    LONG    (*rmdir)      (fcookie *dir, BYTE *name);
+    LONG    (*remove)     (fcookie *dir, BYTE *name);
+    LONG    (*getname)    (fcookie *relto, fcookie *dir, BYTE *pathname,
+                           WORD size);
+    LONG    (*rename)     (fcookie *olddir, BYTE *oldname,
+                           fcookie *newdir, BYTE *newname);
+    LONG    (*opendir)    (DIR *dirh, WORD tosflag);
+    LONG    (*readdir)    (DIR *dirh, BYTE *nm, WORD nmlen, fcookie *fc);
+    LONG    (*rewinddir)  (DIR *dirh);
+    LONG    (*closedir)   (DIR *dirh);
+    LONG    (*pathconf)   (fcookie *dir, WORD which);
+    LONG    (*dfree)      (fcookie *dir, LONG *buf);
+    LONG    (*writelabel) (fcookie *dir, BYTE *name);
+    LONG    (*readlabel)  (fcookie *dir, BYTE *name, WORD namelen);
+    LONG    (*symlink)    (fcookie *dir, BYTE *name, BYTE *to);
+    LONG    (*readlink)   (fcookie *dir, BYTE *buf, WORD len);
+    LONG    (*hardlink)   (fcookie *fromdir, BYTE *fromname,
+                           fcookie *todir, BYTE *toname);
+    LONG    (*fscntl)     (fcookie *dir, BYTE *name, WORD cmd, LONG arg);
+    LONG    (*dskchng)    (WORD drv);
+    LONG    (*release)    (fcookie *fc);
+    LONG    (*dupcookie)  (fcookie *dest, fcookie *src);
+} FILESYS;
+
+

See also: Dcntl   fs_descr   MagiC's XFS-concept +

+

11.21.8.4 fs_descr

+

This structure is defined as follows: +

+
struct fs_descr
+{
+    FILESYS *file_system;
+    SHORT   dev_no;
+    LONG    flags;
+    LONG    reserved[4];
+};
+
+

See also: Dcntl   MagiC's XFS-concept +

+
+ +Home +MagiCMagiC +MagiC's DFS-conceptMagiC's DFS-concept +VFAT-XFS in MagiCVFAT-XFS in MagiC + + diff --git a/en/matrix_XBIOS_extension.html b/en/matrix_XBIOS_extension.html new file mode 100644 index 000000000..343d8cebb --- /dev/null +++ b/en/matrix_XBIOS_extension.html @@ -0,0 +1,91 @@ + + + + + +The documentation for TOS: MATRIX XBIOS extension + + + + + + + + + +Home +XBIOSXBIOS +Drive functionsDrive functions +OverScan XBIOS extensionOverScan XBIOS extension + +
+ +

4.15 MATRIX XBIOS extension

+

The driver for the MATRIX graphic card installs some XBIOS +functions. +

+ + + +

4.15.1 MatScreen - Cxx

+

cxx_info.tos +

+
+ + + + + + + + + + + + + + + + +
Function numberDescription
32000Unknown
32001Unknown
32002Returns 'CxOk' (0x43784f6b) if the driver is installed
+
+ +

XBRA ID M_IN +

+ + + +

4.15.2 MatGraph - TCxx

+

tcxxinfo.tos +

+
+ + + + + + + + + + + + + + + + +
Function numberDescription
CHECKinst (31000)Returns INSTokay='TcOk' (0x54634f6b) if the driver is installed
GETscreen (31001)Returns a pointer to a SCREENparameter structure
GETboard (31002)Returns a pointer to a BOARDparameter structure
+
+ +

XBRA ID MTCI Cookie MaTC +

+
+ +Home +XBIOSXBIOS +Drive functionsDrive functions +OverScan XBIOS extensionOverScan XBIOS extension + + diff --git a/en/menu.html b/en/menu.html new file mode 100644 index 000000000..cb49f29bd --- /dev/null +++ b/en/menu.html @@ -0,0 +1,2176 @@ + + + + + +The documentation for TOS: Menu library + + + + + + + + + +Home +AESAES +MagiC libraryMagiC library +Object libraryObject library + +
+ +

8.17 Menu library

+

This library makes functions available for drawing and +manipulating menu bars. The following routines are available for this +purpose: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
menu_attach Adds, alters or deletes a submenu +
menu_bar Processes the menu bar +
menu_click Processes pulldown menus +
menu_icheck Sets or clears check mark (tick) in menu options +
menu_ienable Enables or disables a menu entry +
menu_istart Aligns a submenu entry +
menu_popup Displays and processes a popup menu +
menu_register Enters desk accessory in 'Desk' menu +
menu_settings Sets or inquires popup/submenu parameters +
menu_text Alters the text of a menu item +
menu_tnormal Inverts menu title +
menu_unregister Removes accessory name from 'Desk' menu. + +
+ +

Note: As of AES version 4.0 (or MagiC 3) this library +was revised intensely, and now also takes on the display and +management of popup and submenus. +

+

See also: Menus and menu bars   Style guidelines   XMEN_MGR +

+

8.17.1 menu_attach

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Menu attach« - Add, alter, delete or obtain information +about a submenu. +
  +
Opcode: 37 +
  +
Syntax: int16_t menu_attach ( int16_t mode, OBJECT *tree, int16_t item, +MENU *mdata ); +
  +
Description: The call menu_attach permits adding, deleting or altering a +submenu. In addition one can obtain information about a submenu. The +following apply: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
mode Desired action: + + + + + + + + + +
0 = Get information about a submenu and store it in mdata +
1 = Add to, or alter, a submenu whose description is stored in +mdata; if mdata has the value NULL, the submenu will +be removed +
2 = Direct removal of a submenu; mdata should be a +NULL-pointer + +
+ +
tree Address of the menu object tree +
item Index of the object with which the submenu is (or should +become) connected, or from which the submenu should be removed or +altered +
mdata MENU structure of the submenu + +
+ +
Note: If possible, not more than one submenu +level should be created for a menu entry, though up to four +levels are supported. The number of submenus per menu is restricted to +64. +
  +
The ob_x and ob_y fields of the root object +should always be set to 0 before making a menu_attach call. +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: This function is available only from AES version 3.30 +onwards. In AES versions 4.0 and greater appl_getinfo (opcode 9) should +be used to determine its exact functionality. +
  +
Group: Menu library +
  +
See also: Binding   menu_istart   menu_settings   menu_popup   XMEN_MGR +
  + +
+ +

8.17.1.1 Bindings for menu_attach

+ + + + + + + + + +
C: int16_t menu_attach ( int16_t mode, OBJECT *tree, int16_t item, +MENU *mdata ); +
  +
Binding: +
  +
int16_t menu_attach (int16_t mode, OBJECT *tree, int16_t item,
+                     MENU *mdata)
+{
+   int_in[0]  = mode;
+   int_in[1]  = item;
+   addr_in[0] = tree;
+   addr_in[1] = mdata;
+
+   return ( crys_if(37) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]37 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]mode
int_in+2int_in[1]item
addr_inaddr_in[0]tree
addr_in+4addr_in[1]mdata
int_outint_out[0]Return value
+
+ + +
+ +

8.17.2 menu_bar

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Menu bar« - Display, delete or install a menu bar. +
  +
Opcode: 30 +
  +
Syntax: int16_t menu_bar ( OBJECT *me_btree, int16_t me_bshow ); +
  +
Description: The call menu_bar performs various operations, depending on the +parameter me_bshow: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
me_bshow Meaning +
    +
-3 Inquire low-WORD of an application's menu bar +
-2 Inquire high-WORD of an application's menu bar +
-1 Inquire owner (application) of the menu bar; as this can change +continuously, the screen must be locked with wind_update to make a +safe inquiry +
0 Delete menu bar specified in me_btree +
1 Draw menu bar specified in me_btree +
3 Get the menu bar mode (N.AES) +
4 Set the menu bar mode (N.AES, not implemented) +
5 Update the system part of the menu bar (N.AES) +
100 Install menu bar, without forcing a change-over of the top +application + +
+ +
Definitions: +
  + + + + + + +
MENU_HIDE = 0 +
MENU_SHOW = 1 +
MENU_GETMODE = 3 +
MENU_SETMODE = 4 +
MENU_UPDATE = 5 +
MENU_INSTL = 100 +
  +
Menu bar modes: +
  + + + +
MENU_HIDDEN = 0x0001 Menu bar only visible when needed +
MENU_PULLDOWN = 0x0002 Pulldown-Menus +
MENU_SHADOWED = 0x0004 Menu bar with shadows +
  +
Note: The parameter me_btree is a pointer to the +object tree of the corresponding menu. At termination of the program +one must not forget to remove the menu bar again. +
  +
With menu_bar(-2/-3) one can inquire the tree address of an +application's menu bar. menu_bar(-2) returns the high-WORD and +menu_bar(-3) the low-WORD. Only available if the cookie 'MbAr' or +'AmAN' is present. +
  +
OBJECT *get_menu(int apid)
+{
+  unsigned int hi = menu_bar((OBJECT *)apid, -2);
+  unsigned int lo = menu_bar((OBJECT *)apid, -3);
+  OBJECT *tree = (OBJECT *)(((unsigned long)hi << 16) | lo);
+  return tree;
+}
+
+
The presence of the extended possibilities can be checked for +with appl_getinfo (opcode 6). +
  +
Return value: An error has arisen only if the value 0 is returned. A value of +-1 signals that there is no owner of the menu bar. +
  +
Availability: All AES versions. +
  +
Group: Menu library +
  +
See also: Binding   OBJECT +
  + +
+ +

8.17.2.1 Bindings for menu_bar

+ + + + + + + + + +
C: int16_t menu_bar ( OBJECT *me_btree, int16_t me_bshow ); +
  +
Binding: +
  +
int16_t menu_bar (OBJECT *me_btree, int16_t me_bshow)
+{
+   int_in[0]  = me_bshow;
+   addr_in[0] = me_btree;
+
+   return ( crys_if(30) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]30 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]me_bshow
addr_inaddr_in[0]me_btree
int_outint_out[0]Return value
+
+ + +
+ +

8.17.3 menu_click

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Menu click« - »Menu click« - Set or inquire type of menu +control. +
  +
Opcode: 37 +
  +
Syntax: int16_t menu_click ( int16_t click, int16_t setit ); +
  +
Description: With the aid of the menu_click function it is possible to +change the operation of dropdown menus to that of pulldown menus, +familiar from the Macintosh. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
click +
+
+ + + + + + + + + + +
0=Dropdown
1=Pulldown
+
+ +
setit +
+
+ + + + + + + + + + +
0=Inquire menu control
1=Set menu control
+
+ + +
+ +
Return value: The function returns the type of menu control set (0 = Dropdown, +1 = Pulldown). +
  +
Availability: On the PC this function is available only from GEM/3, KAOS +1.4.2 and MagiC; on the Atari the presence should be checked for with +appl_getinfo (opcode 5). +
  +
Group: Menu library +
  +
See also: Binding +
  + +
+ +

8.17.3.1 Bindings for menu_click

+ + + + + + + + + +
C: int16_t menu_click ( int16_t click, int16_t setit ); +
  +
Binding: +
  +
int16_t menu_click (int16_t click, int16_t setit)
+{
+   int_in[0] = click;
+   int_in[1] = setit;
+
+   return ( crys_if(37) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]37 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]click
int_in+2int_in[1]setit
int_outint_out[0]Return value
+
+ + +
+ +

8.17.4 menu_icheck

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Menu indicate check« - Set or clear check mark (tick) in +menu options. +
  +
Opcode: 31 +
  +
Syntax: int16_t menu_icheck ( OBJECT *me_ctree, int16_t me_citem, +int16_t me_ccheck ); +
  +
Description: The call menu_icheck sets or removes a check mark (tick) before +a menu entry. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
me_ctree Address of the menu object tree +
me_citem Index of the menu entry +
me_ccheck +
+
+ + + + + + + + + + +
0=Clear tick
1=Set tick
+
+ + +
+ +
Note: For appearance's sake, every entry of a menu +should start with two space characters. From PC-GEM 2.0 onwards, +small triangles instead of a tick are used for this purpose. +
  +
Return value: The value 0 indicates that an error has arisen. +
  +
Availability: All AES versions. +
  +
Group: Menu library +
  +
See also: Binding   OBJECT +
  + +
+ +

8.17.4.1 Bindings for menu_icheck

+ + + + + + + + + +
C: int16_t menu_icheck ( OBJECT *me_ctree, int16_t me_citem, +int16_t me_ccheck ); +
  +
Binding: +
  +
int16_t menu_icheck (OBJECT *me_ctree, int16_t me_citem,
+                     int16_t me_ccheck)
+{
+   int_in[0]  = me_citem;
+   int_in[1]  = me_ccheck;
+   addr_in[0] = me_ctree;
+
+   return ( crys_if(31) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]31 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]me_citem
int_in+2int_in[1]me_ccheck
addr_inaddr_in[0]me_ctree
int_outint_out[0]Return value
+
+ + +
+ +

8.17.5 menu_ienable

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Menu indicate enable« - Enable or disable a menu entry. +
  +
Opcode: 32 +
  +
Syntax: int16_t menu_ienable ( OBJECT *me_etree, int16_t me_eitem, +int16_t me_eenable ); +
  +
Description: The call menu_ienable switches menu entries on or off. The +following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
me_etree Address of the menu object tree +
me_eitem Index of the menu entry +
me_eenable +
+
+ + + + + + + + + + +
0=Disable menu entry
1=Enable menu entry
+
+ + +
+ +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: All AES versions. +
  +
Group: Menu library +
  +
See also: Binding   OBJECT +
  + +
+ +

8.17.5.1 Bindings for menu_ienable

+ + + + + + + + + +
C: int16_t menu_ienable ( OBJECT *me_etree, int16_t me_eitem, +int16_t me_eenable ); +
  +
Binding: +
  +
int16_t menu_ienable (OBJECT *me_etree, int16_t me_eitem,
+                      int16_t me_eenable)
+{
+   int_in[0]  = me_eitem;
+   int_in[1]  = me_eenable;
+   addr_in[0] = me_etree;
+
+   return ( crys_if(32) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]32 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]me_eitem
int_in+2int_in[1]me_eenable
addr_inaddr_in[0]me_etree
int_outint_out[0]Return value
+
+ + +
+ +

8.17.6 menu_istart

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Menu istart« - Align a submenu entry. +
  +
Opcode: 38 +
  +
Syntax: int16_t menu_istart ( int16_t flag, OBJECT *tree, int16_t +imenu, int16_t item ); +
  +
Description: The call menu_istart enables the alignment of a submenu item +vertically with the corresponding entry of the parent (main) menu. The +following apply: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
flag 1 = Align, 0 = Don't align +
tree Address of the menu object tree +
imenu Index of the submenu entry that is to be aligned +
item Index of the menu entry with which the submenu is to be +associated + +
+ +
Return value: An error has arisen only if the value 0 is returned; a positive +number is the object index of the submenu item currently aligned with +its parent menu entry. +
  +
Availability: This function is available only with AES versions 3.30 and +above. +
  +
The presence of this function can be ascertained with a call of +appl_getinfo (opcode 9). +
  +
Group: Menu library +
  +
See also: Binding   menu_attach   XMEN_MGR +
  + +
+ +

8.17.6.1 Bindings for menu_istart

+ + + + + + + + + +
C: int16_t menu_istart ( int16_t flag, OBJECT *tree, int16_t +imenu, int16_t item ); +
  +
Binding: +
  +
int16_t menu_istart (int16_t flag, OBJECT *tree,
+                     int16_t imenu,
+                     int16_t item)
+{
+   int_in[0]  = flag;
+   int_in[1]  = imenu;
+   int_in[2]  = item;
+   addr_in[0] = tree;
+
+   return ( crys_if(38) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]38 # Function opcode
control+2control[1]3 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]flag
int_in+2int_in[1]imenu
int_in+4int_in[2]item
addr_inaddr_in[0]tree
int_outint_out[0]Return value
+
+ + +
+ +

8.17.7 menu_popup

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Menu popup« - Take over the display and handling of a popup +menu. +
  +
Opcode: 36 +
  +
Syntax: int16_t menu_popup ( MENU *me_menu, int16_t me_xpos, int16_t +me_ypos, MENU *me_mdata ); +
  +
Description: The call menu_popup takes over the display and handling of a +popup menu, returning the user's selection. The following apply: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
me_menu Pointer to the structure of the popup +
me_xpos X-coordinate, and +
me_ypos Y-coordinate of the menu's top left corner +
me_mdata Pointer to the data of the selected menu entry + +
+ +
If mn_scroll of MENU is set to 0 when menu_popup is +called, a non-scrollable popup menu will be displayed. +
  +
if mn_scroll of MENU is set to >0 when menu_popup is +called, a scrolling popup menu will be displayed; height of +MN_SET determines it's height in items (note that Atari's AES +implements up/down arrows within the popup for scrolling to maintain +the same look and feel of dropdown menus as they can be attached to +menubar items, note that NAES mimics this exact behavior). See also +menu_settings. +
  +
As of AES version 4.1, if mn_scroll of MENU is set to +-1 when menu_popup is called, a dropdown list box instead of a popup +menu will be displayed; this will have a scroll bar if eight entries +or more exist. +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: This function is available only with AES versions 3.30 and +above. +
  +
The presence of this function can be ascertained by a call of +appl_getinfo (opcode 9). +
  +
Group: Menu library +
  +
See also: Binding   menu_settings   XMEN_MGR +
  + +
+ +

8.17.7.1 Bindings for menu_popup

+ + + + + + + + + +
C: int16_t menu_popup ( MENU *me_menu, int16_t me_xpos, int16_t +me_ypos, MENU *me_mdata ); +
  +
Binding: +
  +
int16_t menu_popup (MENU *me_menu, int16_t me_xpos,
+                    int16_t me_ypos,
+                    MENU *me_mdata)
+{
+   int_in[0]  = me_xpos;
+   int_in[1]  = me_ypos;
+   addr_in[0] = me_menu;
+   addr_in[1] = me_mdata;
+
+   return ( crys_if(36) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]36 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]me_xpos
int_in+2int_in[1]me_ypos
addr_inaddr_in[0]me_menu
addr_in+4addr_in[1]me_mdata
int_outint_out[0]Return value
+
+ + +
+ +

8.17.8 menu_register

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Menu register« - Register a desk accessory in the 'Desk' +accessory menu. +
  +
Opcode: 35 +
  +
Syntax: int16_t menu_register ( int16_t me_rapid, CONST int8_t +*me_rpstring ); +
  +
Description: The call menu_register enters the name of a desk accessory in +the accessory menu (below the left-most entry of the menu bar), or +alters it. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
me_rapid Application ID of the accessory, or -1 to alter the process +name of the application to that specified in me_rpstring +
me_rpstring Address of the NULL-terminated text string for the menu entry + +
+ +
Although altering the name of the application is only documented +as of AES 4.0, this feature seems to work in all TOS versions. +
  +
Important: The parameter me_rpstring is used by +GEM only as a pointer; thus no copy of the new entry will be +created. The function call only becomes effective when the +corresponding main program makes a menu_bar call. Hence desk +accessories should call this function immediately after launching, +else there is the danger that they will miss the menu_bar of the +desktop. +
  +
If the cookie 'MbAr' or 'AmAN' is present, then one can find the +appication ID with menu_register(-1,"?\0\n"), where +n specifies the ID of the accessory in question. The return +value then represents the menu_id (or -1). +
  +
Note: Applications other than desk accessories should +not call this function unless they are running under MultiTOS, where +they can use it to provide a more meaningful title for the 'Desk' menu +than the program's filename. Calling menu_register with a parameter of +-1 for me_rapid is used to change the internal process name of +the application returned by appl_find and appl_search - useful if you +know that another process will try to find your application as a +specific process name and the user may have altered the application's +filename (which is normally used as the process name). +
  +
Return value: The function returns the menu identifier for the accessory, or +(in case of error) the value -1. Desk accessories should store the +return value, as it is included in AC_OPEN messages to identify the +accessory. +
  +
Availability: All AES versions. +
  +
Group: Menu library +
  +
See also: Binding   menu_bar   menu_unregister +
  + +
+ +

8.17.8.1 Bindings for menu_register

+ + + + + + + + + +
C: int16_t menu_register ( int16_t me_rapid, CONST int8_t +*me_rpstring ); +
  +
Binding: +
  +
int16_t menu_register (int16_t me_rapid,
+                       CONST int8_t *me_rpstring)
+{
+   int_in[0]  = me_rapid;
+   addr_in[0] = me_rpstring;
+
+   return ( crys_if(35) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]35 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]me_rapid
addr_inaddr_in[0]me_rpstring
int_outint_out[0]Return value
+
+ + +
+ +

8.17.9 menu_settings

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Menu settings« - Set or inquire popup/submenu parameters. +
  +
Opcode: 39 +
  +
Syntax: int16_t menu_settings ( int16_t me_flag, MN_SET *me_values ); +
  +
Description: The call menu_settings enables manipulation of the global +parameters for popups and for submenus. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
me_flag Parameter +
+
+ + + + + + + + + + +
0=Inquire current settings
1=Set current settings from MN_SET
+
+ +
me_values Pointer to MN_SET structure + +
+ +
Note: The settings made with this function apply not +just for the calling program, but for the whole system. For this +reason this call should not be used by normal application +programs but only in configuration programs (such as CPX modules, for +instance). +
  +
Return value: The function always returns the value 1. +
  +
Availability: This function is available only with AES versions 3.30 and +above. +
  +
The presence of this function can be ascertained with a call of +appl_getinfo (opcode 9). +
  +
Group: Menu library +
  +
See also: Binding   menu_popup   XMEN_MGR +
  + +
+ +

8.17.9.1 Bindings for menu_settings

+ + + + + + + + + +
C: int16_t menu_settings ( int16_t me_flag, MN_SET *me_values ); +
  +
Binding: +
  +
int16_t menu_settings (int16_t me_flag, MN_SET *me_values)
+{
+   int_in[0]  = me_flag;
+   addr_in[0] = me_values;
+
+   return ( crys_if(39) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]39 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]me_flag
addr_inaddr_in[0]me_values
int_outint_out[0]Return value
+
+ + +
+ +

8.17.10 menu_text

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Menu text« - Replaces the text of a menu item. +
  +
Opcode: 34 +
  +
Syntax: int16_t menu_text ( OBJECT *me_ttree, int16_t me_titem, CONST +int8_t *me_ttext ); +
  +
Description: The call menu_text alters the text in a menu item. In this way +menu texts can be dependent of the state of the application, i.e. +become context-sensitive. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
me_ttree Address of the menu object tree +
me_titem Index of the menu item to be altered +
me_ttext Address of the new NULL-terminated character string for the +item + +
+ +
Important: The parameter me_ttext is used by +GEM only as a pointer; thus no copy of the new entry will be +created. Furthermore one should ensure that the new entry does not +exceed the length of the old one. +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: All AES versions. +
  +
Group: Menu library +
  +
See also: Binding   OBJECT +
  + +
+ +

8.17.10.1 Bindings for menu_text

+ + + + + + + + + +
C: int16_t menu_text ( OBJECT *me_ttree, int16_t me_titem, CONST +int8_t *me_ttext ); +
  +
Binding: +
  +
int16_t menu_text (OBJECT *me_ttree, int16_t me_titem,
+                   CONST int8_t *me_ttext)
+{
+   int_in[0]  = me_titem;
+   addr_in[0] = me_ttree;
+   addr_in[1] = me_ttext;
+
+   return ( crys_if(34) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]34 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]me_titem
addr_inaddr_in[0]me_ttree
addr_in+4addr_in[1]me_ttext
int_outint_out[0]Return value
+
+ + +
+ +

8.17.11 menu_tnormal

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Menu text normal« - Displays a menu title in inverse video +or normal. +
  +
Opcode: 33 +
  +
Syntax: int16_t menu_tnormal ( OBJECT *me_ntree, int16_t me_ntitle, +int16_t me_nnormal ); +
  +
Description: The call menu_tnormal highlights a menu title by displaying it +in inverse video. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
me_ntree Address of the menu object tree +
me_ntitle Index of the menu item to change +
me_nnormal +
+
+ + + + + + + + + + +
0=Display menu item inverse
1=Display menu item normal
+
+ + +
+ +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: All AES versions. +
  +
Group: Menu library +
  +
See also: Binding +
  + +
+ +

8.17.11.1 Bindings for menu_tnormal

+ + + + + + + + + +
C: int16_t menu_tnormal ( OBJECT *me_ntree, int16_t me_ntitle, +int16_t me_nnormal ); +
  +
Binding: +
  +
int16_t menu_tnormal (OBJECT *me_ntree, int16_t me_ntitle,
+                      int16_t me_nnormal)
+{
+   int_in[0]  = me_ntitle;
+   int_in[1]  = me_nnormal;
+   addr_in[0] = me_ntree;
+
+   return ( crys_if(33) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]33 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]me_ntitle
int_in+2int_in[1]me_nnormal
addr_inaddr_in[0]me_ntree
int_outint_out[0]Return value
+
+ + +
+ +

8.17.12 menu_unregister

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Menu unregister« - Remove accessory name from 'Desk' menu. +
  +
Opcode: 36 +
  +
Syntax: int16_t menu_unregister ( int16_t mid ); +
  +
Description: The call menu_unregister allows a desk accessory to remove its +name from the 'Desk' menu again. +
  +
The parameter mid is the application ID of the +corresponding desk accessory. +
  +
Return value: Not known at present. +
  +
Availability: The function is available only under PC-GEM as of 2.0, KAOS +as of 1.4.2 and MagiC. +
  +
Group: Menu library +
  +
See also: Binding   menu_register +
  + +
+ +

8.17.12.1 Bindings for menu_unregister

+ + + + + + + + + +
C: int16_t menu_unregister ( int16_t mid ); +
  +
Binding: +
  +
int16_t menu_unregister (int16_t mid)
+{
+   int_in[0] = mid;
+   return ( crys_if(36) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]36 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]mid
int_outint_out[0]Return value
+
+ + +
+ +
+ +Home +AESAES +MagiC libraryMagiC library +Object libraryObject library + + diff --git a/en/n_aes.html b/en/n_aes.html new file mode 100644 index 000000000..a51cd7503 --- /dev/null +++ b/en/n_aes.html @@ -0,0 +1,39 @@ + + + + + +The documentation for TOS: N.AES + + + + + + + + + +Home +Contents +Shared librariesShared libraries +form_error in N.AESform_error in N.AES + +
+ +

12 N.AES

+ +
+
+ +Home +Contents +Shared librariesShared libraries +form_error in N.AESform_error in N.AES + + diff --git a/en/naes_cnf.html b/en/naes_cnf.html new file mode 100644 index 000000000..b7b886f07 --- /dev/null +++ b/en/naes_cnf.html @@ -0,0 +1,80 @@ + + + + + +The documentation for TOS: The N.AES configuration file + + + + + + + + + +Home +N.AESN.AES +The N.AES cookieThe N.AES cookie +XaAESXaAES + +
+ +

12.3 The N.AES configuration file

+ +

The configuration file N_AES.CNF that N.AES reads in and +evaluates at system startup contains the user-definable settings (CNF +variables) and commands (CNF commands). +

+

Please do not get frightened by the wide variety of setting +options! The bundled configuration file contains standard values for +the individual variables and should be able to be used by you at first +without changes. Once you have become a little familiar with N.AES, +you can alter various settings at a later time to suit your taste. +

+

The configuration file is not retained in memory at run-time but +just evaluated once at the start, after which the memory it occupies +is released. Hence one need not (and should not) economize with +comments here. +

+

A comment is introduced by a '#' character at the start of a +line and continues to the end of this line. Everything contained in +such a comment line will be ignored when evaluating the configuration +file. Equally, any empty lines will be skipped during evaluation. +

+

The specifications possible in the configuration file may be +divided into three groups: +

+
    +
  • With the aid of the CNF variables the global operating +parameters of N.AES are set, which cannot be altered at run-time at +present. For example, with the help of these variables one can specify +the size of the icon windows. +
      +

  • +
  • The CNF commands are executed shortly after the reading in of +the configuration file and take effect immediately. Thus with the help +of these commands one can launch programs or set the environmental +variables. +
      +

  • +
  • The CNF debug variables have a meaning only in a special N.AES +version, which is not a part of the normal distribution. +
      +

  • +
+ +

Note about the variables: Please proceed with particular care +when altering settings that affect the system (sstacksize, mpipesize, +qsbchars, ...). Values that are too small or too large may give rise +to unwanted effects, or even to faulty behaviour of N.AES. +

+
+ +Home +N.AESN.AES +The N.AES cookieThe N.AES cookie +XaAESXaAES + + diff --git a/en/naes_cookie.html b/en/naes_cookie.html new file mode 100644 index 000000000..8bcc428cf --- /dev/null +++ b/en/naes_cookie.html @@ -0,0 +1,139 @@ + + + + + +The documentation for TOS: The N.AES cookie + + + + + + + + + +Home +N.AESN.AES +form_error in N.AESform_error in N.AES +The N.AES configuration fileThe N.AES configuration file + +
+ +

12.2 The N.AES cookie

+ +

N.AES creates a cookie with the name 'nAES'. Its value is a +pointer to a structure (readable), which is made up as follows: +

+
typedef struct {
+    unsigned int    version;
+    unsigned int    date;
+    unsigned int    time;
+    unsigned int    flags;
+    CNF_VAR         **config;
+    unsigned long   unused_2;
+} N_AESINFO;
+
+ + + + + + + + + + + + + + + +
version: The hexadecimal-coded version number of N.AES. A value of +0x0058 would mean a version number 0.5.8, a value of 0x0107 the +version 1.0.7 +
  +
date/time: The creation date and the creation time in TOS format, i.e. +as returned by Tgetdate and Tgettime. +
  +
Note: +
The time that is output on booting N.AES corresponds to the time +of compilation of a given N.AES source file; the time value that is +found in the cookie is set by means of a patch program and is actually +the relevant specification. +
  +
flags: Bit mask, whose bits have the following meaning: +
+
  + + + + + + + + + + + + + + + +
Bit  0 = 0: ST-version +
+
Bit  0 = 1: TT030-version (compiler option '68020') +
+
Bit  1 = 0: Normal version +
+
Bit  1 = 1: Debug version +
Bit 15 = If this bit is TRUE then this cookie was created by XaAES + +
+ +
config: Pointer to a list of the CNF variables, which may be altered +while the system is running. Memory is allocated as (global). The +bundled N_CONTRL.CPX uses it. +
  +
/* cnf types */
+#define CNF_TEND  0   /* Marks the end of the list. */
+#define CNF_TBOOL 1   /* True/false.                */
+#define CNF_TWORD 2   /* 16-bit signed value        */
+#define CNF_TLONG 3
+/* Further ones may follow!  */
+
+typedef enum {false, true} bool;
+
+typedef struct
+{
+  union cnf_typ { bool b; WORD w; LONG l; }
+          val;            /* The contents           */
+  WORD    typ;            /* Type, CNF_T...         */
+  BYTE    text[22];       /* Name, as in N_AES.CNF. */
+} CNF_INF;
+
+typedef struct
+{
+  BYTE    typ[16];  /* Category, text from the strings *
+                     * of the dialog tree CNF_TREE of  *
+                     * N_AESSYS.RSC.                   *
+                     * e.g. 'Fenster' or 'System'.     */
+  CNF_INF *cnf_inf; /* The variables themselves        */
+} CNF_VAR;
+
+
The end of the list is signalled by a NULL-pointer. +
  +
unused_2: Free space for later N.AES versions +
  + +
+ +
+ +Home +N.AESN.AES +form_error in N.AESform_error in N.AES +The N.AES configuration fileThe N.AES configuration file + + diff --git a/en/naes_formerror.html b/en/naes_formerror.html new file mode 100644 index 000000000..44451537c --- /dev/null +++ b/en/naes_formerror.html @@ -0,0 +1,165 @@ + + + + + +The documentation for TOS: form_error in N.AES + + + + + + + + + +Home +N.AESN.AES +N.AESN.AES +The N.AES cookieThe N.AES cookie + +
+ +

12.1 form_error in N.AES

+

The form_error function has been extended in N.AES, so that a +sensible message can be output for all GEMDOS errors for a form_error +call. +

+

An N.AES form_error code is calculated from a GEMDOS error-code with: +

+

formcode = ~gemdoscode - 30 +

+

~ ist bitweises NOT +

+

In the 'form_error codes' table (below) all possible N.AES form_error codes +are listed next to the corresponding GEMDOS errors. The first column +holds the form_error code and the name of the associated object in the +system resource, the second column the corresponding GEMDOS error and +the third column a short description of the error. +

+

Please note that not all form_error codes have a GEMDOS error +assigned to them. +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CodeGEMDOS errorMeaning
0 ERR_TOSERR  !~
1 ERR_INVFN-32 EINVFNInvalid function
2 ERR_NOTFOUND-33 EFILNFFile not found
3 ERR_NOTFOUND-34 EPTHNFPath not found
4 ERR_NHNDL-35 ENHNDLNo more handles
5 ERR_ACCDN-36 EACCDNAccess denied
6 ERR_IHNDL-37 EBADFInvalid handle
8 ERR_NSMEM-39 ENSMEMInsufficient memory
9 ERR_IMBA-40 EIMBAInvalid memory block address
15 ERR_DRIVE-46 EDRIVEInvalid drive specification
17 ERR_XDEV-48 EXDEVCross device rename
18 ERR_NOTFOUND-49 ENMFILNo more files (fsnext)
27 ERR_LOCKING-58 ELOCKEDRecord is locked already
28 ERR_LOCKING-59 ENSLOCKInvalid lock removal request
33 ERR_TOSERR-64 ERANGERange error
34 ERR_INTRN-65 EINTRNInternal error
35 ERR_PLFMT-66 EPLFMTInvalid program load format
36 ERR_GSBF-67 EGSBFMemory block growth failure
49 ERR_LOOP-80 ELOOPToo many symbolic links
50 ERR_PIPE-81 EPIPEWrite to a broken pipe
+
+ +

For each of the various form_errors there is also a +corresponding alert box in the system resource file N_AESSYS.RSC, +whose symbolic constant starts with 'ERR_' and is also listed in the +first column of the 'form_error codes' table. +

+
+ +Home +N.AESN.AES +N.AESN.AES +The N.AES cookieThe N.AES cookie + + diff --git a/en/nap_bionet100.html b/en/nap_bionet100.html new file mode 100644 index 000000000..64ba156cb --- /dev/null +++ b/en/nap_bionet100.html @@ -0,0 +1,127 @@ + + + + + +The documentation for TOS: NAP BioNet100 + + + + + + + + + +Home +GEMDOSGEMDOS +C'Task RoyalC'Task Royal +PowerDOSPowerDOS + +
+ +

5.20 NAP BioNet100

+ + + +

BioNet was a GEMDOS network extension from BIODATA GmbH. +

+

Three functions are added to the GEMDOS, which allow the BioNet +Client to communicate with a 'Nap' hosted by the Nap Server. A server +can run multiple Nap, each of them is identified by a +nap_handle associated to a internal NAP_COM structure. +

+ + + + + + + + + + + + +
Number Meaning +
  +
91 nap_io() Nap input/output +
This function is the legacy function for bidirectional +communication with the server. nap_io is divided into the +nap_in_s and nap_out_s functions, which are executed +one after the other. +
The return value is the number of returned bytes. +
  +
Syntax: +
int32_t gemdos( 91, int16_t nap_handle, int8_t *buf_out, int32_t +len_out, int8_t *buf_in, int32_t len_in); +
  +
130 nap_in_s() Nap input +
This function writes data to the server. +
Returns the number of transferred bytes. +
  +
Syntax: +
int32_t gemdos( 130, int16_t nap_handle, int32_t mode, int32_t +count, int8_t *buffer); +
  +
131 nap_out_s() Nap output +
This function reads data from the server. +
Returns the number of transferred bytes. +
  +
Syntax: +
int32_t gemdos( 131, int16_t nap_handle, int32_t mode, int32_t +count, int8_t *buffer); +
  + +
+ +

The mode parameter is stored into the field +nap_wert by the server. Values from 0 to -9L are reserved by +BioNet100. The client can set mode to a value less than -9L to +acquire a lock, or to 0L to release the lock. If no transfer is +required, count should be set to 0. +

+

The NAP_COM structure is defined as follows: +

+
typedef struct
+{
+  int16_t    nap_handle;   /* Nap handle that identifies a program   */
+  int32_t    nummer;       /* BioNet client number                   */
+  int16_t    status;       /* Status of the client                   */
+                           /*   Bit 0: nap_in_s is active            */
+                           /*   Bit 1: nap_out_s is active           */
+                           /*   Bit 2: first data burst              */
+                           /*   Bit 3: last data burst               */
+                           /*   Bit 4: fatal error                   */
+  int32_t    ret_wert;     /* If bit 4 of status is set, specifies   */
+                           /* the message sent to the client:        */
+                           /*   0 = 'Cant repair protocoll-error...' */
+                           /*   1 = 'Repairing protocoll-error...'   */
+  int32_t    nap_wert;     /* If nonzero, prevents other client to   */
+                           /* communicate with this Nap. By default, */
+                           /* set to nummer. This value is returned  */
+                           /* as error-code to other client          */
+  int8_t    *in_buffer;    /* Pointer to the data buffer that holds  */
+                           /* either the data to read from nap_in_s, */
+                           /* or command data for nap_out_s          */
+  int8_t    *out_buffer;   /* Pointer to the data buffer that holds  */
+                           /* the data to send to the client through */
+                           /* nap_out_s.                             */
+  int32_t    ges_count;    /* Total number of data to send/receive   */
+  int32_t    akt_count;    /* Current number of data to send/receive */
+}
+
+

Note: The BioNet server complies to the XBRA protocol +with ID 'BioS'. +

+

See also: GEMDOS   BIOS function list   XBIOS function list +

+
+ +Home +GEMDOSGEMDOS +C'Task RoyalC'Task Royal +PowerDOSPowerDOS + + diff --git a/en/objc.html b/en/objc.html new file mode 100644 index 000000000..caa8daa6b --- /dev/null +++ b/en/objc.html @@ -0,0 +1,3131 @@ + + + + + +The documentation for TOS: Object library + + + + + + + + + +Home +AESAES +Menu libraryMenu library +Process libraryProcess library + +
+ +

8.18 Object library

+

This library makes functions available for drawing and +manipulating objects (of any kind). The following routines exist for +this: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
objc_add Inserts an object in object tree +
objc_change Alters status of an object +
objc_delete Removes object from the object tree +
objc_draw Draws AES objects (or part-objects) +
objc_edit Edits text in an object +
objc_find Determines object at given screen position +
objc_offset Obtains true screen coordinates of an object +
objc_order Alters order of objects in object tree +
objc_sysvar Manipulates 3D objects +
objc_wchange Alters status of an object (in window) +
objc_wdraw Draws objects (or part-objects) (in window) +
objc_wedit Edits text in an object (in window) +
objc_xedit Edits text in an object +
objc_xfind Finds object index from its position +
• objc_xoffset No information available at present +
x_objc_edit Edits text in an object, with extensions + +
+ +

Note: Here special merit has been earned by objc_sysvar, +with whose help the 3D-look of objects can be controlled (and as of +MagiC 3 also switched off). +

+

See also: +
About the AES   AES object structure   Scrollable input fields   Style guidelines +

+

8.18.1 objc_add

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Object add« - Insert object in an object tree. +
  +
Opcode: 40 +
  +
Syntax: int16_t objc_add ( OBJECT *ob_atree, int16_t ob_aparent, +int16_t ob_achild ); +
  +
Description: The call objc_add creates a hierarchical connection between two +objects in an object tree - in other words extablishes the +relationship of a child object to its parent. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
ob_atree Address of the relevant object tree +
ob_aparent Index of the object to which the child is to be added +
ob_achild Index of the child, i.e. of the object to be added + +
+ +
(Note: At insertion, the components ob_head and +ob_tail of the OBJECT structure must already have been +suitably initialized and be part of the OBJECT array. +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: All AES versions. +
  +
Group: Object library +
  +
See also: Binding   OBJECT   objc_delete +
  + +
+ +

8.18.1.1 Bindings for objc_add

+ + + + + + + + + +
C: int16_t objc_add ( OBJECT *ob_atree, int16_t ob_aparent, +int16_t ob_achild ); +
  +
Binding: +
  +
int16_t objc_add (OBJECT *ob_atree, int16_t ob_aparent,
+                  int16_t ob_achild)
+{
+   int_in[0]  = ob_aparent;
+   int_in[1]  = ob_achild;
+   addr_in[0] = ob_atree;
+
+   return ( crys_if(40) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]40 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]ob_aparent
int_in+2int_in[1]ob_achild
addr_inaddr_in[0]ob_atree
int_outint_out[0]Return value
+
+ + +
+ +

8.18.2 objc_change

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Object change« - Alter display of an object within specified +limits. +
  +
Opcode: 47 +
  +
Syntax: int16_t objc_change ( OBJECT *ob_ctree, int16_t ob_cobject, +int16_t ob_cresvd, int16_t ob_cxclip, int16_t ob_cyclip, int16_t +ob_cwclip, int16_t ob_chclip, int16_t ob_cnewstate, int16_t ob_credraw +); +
  +
Description: The call objc_change alters the display state of an object and, +if necessary, redraws it. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
ob_ctree Address of the relevant object tree +
ob_cobject Index of the object in question +
ob_cresvd Reserved, should be 0 +
ob_cxclip X-coordinate, and +
ob_cyclip Y-coordinate of top left corner, +
ob_cwclip Width, and +
ob_chclip Height of the clipping cectangle +
ob_cnewstate New status of the object +
ob_credraw +
+
+ + + + + + + + + + +
0=Do not redraw object
1=Redraw object
+
+ + +
+ +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: All AES versions. +
  +
Group: Object library +
  +
See also: Binding   objc_wchange   OBJECT +
  + +
+ +

8.18.2.1 Bindings for objc_change

+ + + + + + + + + +
C: int16_t objc_change ( OBJECT *ob_ctree, int16_t ob_cobject, +int16_t ob_cresvd, int16_t ob_cxclip, int16_t ob_cyclip, int16_t +ob_cwclip, int16_t ob_chclip, int16_t ob_cnewstate, int16_t ob_credraw +); +
  +
Binding: +
  +
int16_t objc_change (OBJECT *ob_ctree, int16_t ob_cobject,
+                     int16_t ob_cresvd, int16_t ob_cxclip,
+                     int16_t ob_cyclip, int16_t ob_cwclip,
+                     int16_t ob_chclip, int16_t ob_cnewstate,
+                     int16_t ob_credraw)
+{
+   int_in[0]  = ob_cobject;
+   int_in[1]  = ob_cresvd;
+   int_in[2]  = ob_cxclip;
+   int_in[3]  = ob_cyclip;
+   int_in[4]  = ob_cwclip;
+   int_in[5]  = ob_chclip;
+   int_in[6]  = ob_cnewstate;
+   int_in[7]  = ob_credraw;
+
+   addr_in[0] = ob_ctree;
+
+   return ( crys_if(47) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]47 # Function opcode
control+2control[1]8 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]ob_cobject
int_in+2int_in[1]ob_cresvd
int_in+4int_in[2]ob_cxclip
int_in+6int_in[3]ob_cyclip
int_in+8int_in[4]ob_cwclip
int_in+10int_in[5]ob_chclip
int_in+12int_in[6]ob_cnewstate
int_in+14int_in[7]ob_credraw
addr_inaddr_in[0]ob_ctree
int_outint_out[0]Return value
+
+ + +
+ +

8.18.3 objc_delete

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Object delete« - Remove object from an object tree. +
  +
Opcode: 41 +
  +
Syntax: int16_t objc_delete ( OBJECT *ob_dltree, int16_t ob_dlobject ); +
  +
Description: The call objc_delete removes an object from an object tree. The +following apply: +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
ob_dltreeAddress of the relevant object tree
ob_dlobjectIndex of the object to be removed
+
+ +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: All AES versions. +
  +
Group: Object library +
  +
Querverweise: Binding   OBJECT   objc_add +
  + +
+ +

8.18.3.1 Bindings for objc_delete

+ + + + + + + + + +
C: int16_t objc_delete ( OBJECT *ob_dltree, int16_t ob_dlobject ); +
  +
Binding: +
  +
int16_t objc_delete (OBJECT *ob_dltree, int16_t ob_dlobject)
+{
+   int_in[0]  = ob_dlobject;
+   addr_in[0] = ob_dltree;
+
+   return ( crys_if(41) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]41 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]ob_dlobject
addr_inaddr_in[0]ob_dltree
int_outint_out[0]Return value
+
+ + +
+ +

8.18.4 objc_draw

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Object draw« - Draw an AES object tree. +
  +
Opcode: 42 +
  +
Syntax: int16_t objc_draw ( OBJECT *ob_drtree, int16_t ob_drstart, +int16_t ob_drdepth, int16_t ob_drxclip, int16_t ob_dryclip, int16_t +ob_drwclip, int16_t ob_drhclip ); +
  +
Description: The call objc_draw renders an object tree (or parts of objects) +on the screen. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
ob_drtree Address of object tree to draw +
ob_drstart Index of the first object to be drawn +
ob_drdepth Number of object generations to be drawn (0 = only the first +object), maximum of 8 +
ob_drxclip X-coordinate, and +
ob_dryclip Y-coordinate of top left corner, +
ob_drwclip Width, and +
ob_drhclip Height of the bounding rectangle + +
+ +
Note: With the parameters one can specify a rectangle to +which drawing is to be restricted (clipping). +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: All AES versions. +
  +
Group: Object library +
  +
See also: Binding   objc_wdraw   OBJECT +
  + +
+ +

8.18.4.1 Bindings for objc_draw

+ + + + + + + + + +
C: int16_t objc_draw ( OBJECT *ob_drtree, int16_t ob_drstart, +int16_t ob_drdepth, int16_t ob_drxclip, int16_t ob_dryclip, int16_t +ob_drwclip, int16_t ob_drhclip ); +
  +
Binding: +
  +
int16_t objc_draw (OBJECT *ob_drtree, int16_t ob_drstart,
+                   int16_t ob_drdepth, int16_t ob_drxclip,
+                   int16_t ob_dryclip, int16_t ob_drwclip,
+                   int16_t ob_drhclip)
+{
+   int_in[0]  = ob_drstart;
+   int_in[1]  = ob_drdepth;
+   int_in[2]  = ob_drxclip;
+   int_in[3]  = ob_dryclip;
+   int_in[4]  = ob_drwclip;
+   int_in[5]  = ob_drhclip;
+
+   addr_in[0] = ob_drtree;
+
+   return ( crys_if(42) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]42 # Function opcode
control+2control[1]6 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]ob_drstart
int_in+2int_in[1]ob_drdepth
int_in+4int_in[2]ob_drxclip
int_in+6int_in[3]ob_dryclip
int_in+8int_in[4]ob_drwclip
int_in+10int_in[5]ob_drhclip
addr_inaddr_in[0]ob_drtree
int_outint_out[0]Return value
+
+ + +
+ +

8.18.5 objc_edit

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Object edit« - Edit text in an editable text object. +
  +
Opcode: 46 +
  +
Syntax: int16_t objc_edit ( OBJECT *ob_edtree, int16_t ob_edobject, +int16_t ob_edchar, int16_t *ob_edidx, int16_t ob_edkind ); +
  +
Description: The call objc_edit permits manual text input into objects of +the type G_FTEXT or G_FBOXTEXT. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
ob_edtree Address of the relevant object tree +
ob_edobject Index of the object to be edited +
ob_edchar Character that was input (scancode in the high and ASCII-code in +the low byte) +
ob_edidx Position of the character in string +
ob_edkind Function selection, as follows: + + + + + + + + + + + + + + + + +
EDSTART 0 Reserved +
EDINIT 1 Calculate formatted string, and switch on cursor +
EDCHAR 2 Process character and then display string anew +
EDEND 3 Switch off cursor + +
+ + +
+ +
Note: MagiC as of version 2.0 has an extended function +objc_xedit. +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: All AES versions. +
  +
Group: Object library +
  +
See also: Binding   objc_wedit   OBJECT   TEDINFO   objc_xedit +
  + +
+ +

8.18.5.1 Bindings for objc_edit

+ + + + + + + + + +
C: int16_t objc_edit ( OBJECT *ob_edtree, int16_t ob_edobject, +int16_t ob_edchar, int16_t *ob_edidx, int16_t ob_edkind ); +
  +
Binding: +
  +
int16_t objc_edit (OBJECT *ob_edtree, int16_t ob_edobject,
+                   int16_t ob_edchar, int16_t *ob_edidx,
+                   int16_t ob_edkind)
+{
+   int_in[0]  = ob_edobject;
+   int_in[1]  = ob_edchar;
+   int_in[2]  = *ob_edidx;
+   int_in[3]  = ob_edkind;
+   addr_in[0] = ob_edtree;
+
+   crys_if (46);
+
+   *ob_edidx = int_out[1];
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]46 # Function opcode
control+2control[1]4 # Entry in int_in
control+4control[2]2 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]ob_edobject
int_in+2int_in[1]ob_edchar
int_in+4int_in[2]ob_edidx
int_in+6int_in[3]ob_edkind
addr_inaddr_in[0]ob_edtree
int_outint_out[0]Return value
int_out+2int_out[1]ob_edidx
+
+ + +
+ +

8.18.6 objc_find

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Object find« - Find which object that lies at the specified +screen position. +
  +
Opcode: 43 +
  +
Syntax: int16_t objc_find ( OBJECT *ob_ftree, int16_t ob_fstartob, +int16_t ob_fdepth, int16_t ob_fmx, int16_t ob_fmy ); +
  +
Description: The call objc_find determines which object is found at given +screen coordinates. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
ob_ftree Address of the relevant object tree +
ob_fstartob Index of the object at which the search is to start +
ob_fdepth Number of generations that are to be searched (0 = parent +object only), 7 max. +
ob_fmx X-coordinate, and +
ob_fmy Y-coordinate of screen position to search + +
+ +
Return value: The object index found at the coordinates ob_fmx, +ob_fmy (or -1 for 'no object found'). +
  +
Availability: All AES versions. +
  +
Group: Object library +
  +
See also: Binding   OBJECT   objc_xfind +
  + +
+ +

8.18.6.1 Bindings for objc_find

+ + + + + + + + + +
C: int16_t objc_find ( OBJECT *ob_ftree, int16_t ob_fstartob, +int16_t ob_fdepth, int16_t ob_fmx, int16_t ob_fmy ); +
  +
Binding: +
  +
int16_t objc_find (OBJECT *ob_ftree, int16_t ob_fstartob,
+                   int16_t ob_fdepth, int16_t ob_fmx,
+                   int16_t ob_fmy)
+{
+   int_in[0]  = ob_fstartob;
+   int_in[1]  = ob_fdepth;
+   int_in[2]  = ob_fmx;
+   int_in[3]  = ob_fmy;
+   addr_in[0] = ob_ftree;
+
+   return ( crys_if(43) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]43 # Function opcode
control+2control[1]4 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]ob_fstartob
int_in+2int_in[1]ob_fdepth
int_in+4int_in[2]ob_fmx
int_in+6int_in[3]ob_fmy
addr_inaddr_in[0]ob_ftree
int_outint_out[0]Return value
+
+ + +
+ +

8.18.7 objc_offset

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Object offset« - Calculate the true position of an object on +the screen. +
  +
Opcode: 44 +
  +
Syntax: int16_t objc_offset ( OBJECT *ob_oftree, int16_t ob_ofobject, +int16_t *ob_ofxoff, int16_t *ob_ofyoff ); +
  +
Description: The call objc_offset calculates the true position of an object +in absolute screen coordinates. The following apply: +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
ob_oftreeAddress of the object tree
ob_ofobjectIndex of the relevant object
ob_ofxoffCalculated X-coordinate
ob_ofyoffCalculated Y-coordinate
+
+ +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: All AES versions. +
  +
Group: Object library +
  +
Querverweise: Binding   OBJECT   form_center +
  + +
+ +

8.18.7.1 Bindings for objc_offset

+ + + + + + + + + +
C: int16_t objc_offset ( OBJECT *ob_oftree, int16_t ob_ofobject, +int16_t *ob_ofxoff, int16_t *ob_ofyoff ); +
  +
Binding: +
  +
int16_t objc_offset (OBJECT *ob_oftree, int16_t ob_ofobject,
+                     int16_t *ob_ofxoff, int16_t *ob_ofyoff)
+{
+   int_in[0]  = ob_ofobject;
+   addr_in[0] = ob_oftree;
+
+   crys_if (44);
+
+   *ob_ofxoff = int_out[1];
+   *ob_ofyoff = int_out[2];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]44 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]3 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]ob_ofobject
addr_inaddr_in[0]ob_oftree
int_outint_out[0]Return value
int_out+2int_out[1]ob_ofxoff
int_out+4int_out[2]ob_ofyoff
+
+ + +
+ +

8.18.8 objc_order

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Object order« - Alter order of object in object tree. +
  +
Opcode: 45 +
  +
Syntax: int16_t objc_order ( OBJECT *ob_ortree, int16_t ob_orobject, +int16_t ob_ornewpos ); +
  +
Description: The call objc_order alters the position of an object relative +to other child objects of the same parent within a sub-tree. The +following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
ob_ortree Address of the object tree +
ob_orobject Index of the relevant object +
ob_ornewpos New position in tree, namely: +
+
+ + + + + + + + + + + + + + + + + + + + +
-1=At the end (last child)
0=At the start (first child)
1=In the second position (2nd child)
2=In the third position (etc.)
+
+ + +
+ +
Note: This call does not move the structure elements in +memory, but updates the OBJECT tree's ob_head, ob_tail and +ob_next fields, thus 'moving' the OBJECT in the tree +hierarchy. +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: All AES versions. +
  +
Group: Object library +
  +
See also: Binding   OBJECT +
  + +
+ +

8.18.8.1 Bindings for objc_order

+ + + + + + + + + +
C: int16_t objc_order ( OBJECT *ob_ortree, int16_t ob_orobject, +int16_t ob_ornewpos ); +
  +
Binding: +
  +
int16_t objc_order (OBJECT *ob_ortree, int16_t ob_orobject,
+                    int16_t ob_ornewpos)
+{
+   int_in[0]  = ob_orobject;
+   int_in[1]  = ob_ornewpos;
+   addr_in[0] = ob_ortree;
+
+   return ( crys_if(45) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]45 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]ob_orobject
int_in+2int_in[1]ob_ornewpos
addr_inaddr_in[0]ob_ortree
int_outint_out[0]Return value
+
+ + +
+ +

8.18.9 objc_sysvar

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Object sysvar« - Manipulation of 3D objects. +
  +
Opcode: 48 +
  +
Syntax: int16_t objc_sysvar ( int16_t ob_smode, int16_t ob_swhich, +int16_t ob_sival1, int16_t ob_sival2, int16_t *ob_soval1, int16_t +*ob_soval2 ); +
  +
Description: The call objc_sysvar permits the setting or inquiring the +appearance of the AES 3D objects. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
ob_smode +
+
+ + + + + + + + + + +
0-Inquire status
1-Set new status
+
+ +
ob_swhich Desired 3D elements: +
+ +
LK3DIND (1) - Indicators + + + + + + +
Mode 0: ob_soval1 = 0 +
On selection of an object the associated text does not move +ob_soval1 = 1 +
On selection of an abject the associated text moves +
ob_soval2 = 0 +
Object colour does not change on selection +
ob_soval2 = 1 +
Object colour changes on selection +
Mode 1: As mode 1, but now the relevant values may be set with the +parameters ob_sival1 or ob_sival2 + +
+ + +
LK3DACT (2) - Activators +
Determines behaviour of the activators; all further statements are +to be used in the same way as for indicators +
+ +
INDBUTCOL (3) - Colour of non-selected indicators + + + + + + +
Mode 0: ob_soval1 is the current colour +
Mode 1: ob_sival1 contains the colour to be set + +
+ + +
ACTBUTCOL (4) - Colour of non-selected activators + + + + + + +
Mode 0: ob_soval1 is the current colour +
Mode 1: ob_sival1 contains the colour to be set + +
+ + +
BACKGRCOL (5) - Colour of the 3D background + + + + + + +
Mode 0: ob_soval1 is the current colour +
Mode 1: ob_sival1 contains the colour to be set + +
+ + +
AD3DVALUE (6) - Inquire pixel enlargement + + + + + + +
Mode 0: ob_soval1 +
Number of pixels in the horizontal direction by which the 3D +buttons should be enlarged on each side +
ob_soval2 +
Number of pixels in the vertical direction by which the 3D buttons +should be enlarged on each side +
Note: This mode always returns the value 0 in MagiC as the +object sizes of the system are not affected in this case +
Mode 1: Not supported at present + +
+ + +
MX_ENABLE3D (10) - Switch on/off 3D-look +
This mode is only present under MagiC (since Version 3.0) and +allows the 3D-look to be switched on or off. The following apply: + + + + + + +
Mode 0: ob_soval1 = 0 +
(3D is off) +
ob_soval1 = 1 +
(3D is active) +
Mode 1: ob_sival1 = 0 +
ob_sival2 = 0 +
(3D-look off) +
ob_sival1 = 1 +
ob_sival2 = 1 +
(3D-look on) + +
+ + +
MX_MENUCOL (11) - Menüfarbe +
This mode is only present under MagiC (since version 6.0 +09.04.1998). +
Es kann die Farbe der Menüzeile ermittelt werden. + + + + + + +
Mode 0: ob_soval1 is the current colour +
Mode 1: Return an error. + +
+ + +
+ +
Note: The settings made with objc_sysvar apply not just +for your own program, but are global for the whole system. For this +reason the function should not be used in normal user applications, +but only in configuration programs (such as CPX modules). +
  +
Although the function is present in MagiC 2.0, due to not yet +implemented 3D-objects no modifications are possible. For this reason +close attention should be paid to the function's return value. As of +MagiC 3 the 3D-look is available, but some differences have to be +borne in mind. +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: Available as of AES version 3.40. +
  +
The presence of this function can be ascertained with a call of +appl_getinfo (opcode 13). +
  +
Group: Object library +
  +
See also: Binding +
  + +
+ +

8.18.9.1 Bindings for objc_sysvar

+ + + + + + + + + +
C: int16_t objc_sysvar ( int16_t ob_smode, int16_t ob_swhich, +int16_t ob_sival1, int16_t ob_sival2, int16_t *ob_soval1, int16_t +*ob_soval2 ); +
  +
Binding: +
  +
int16_t objc_sysvar (int16_t ob_smode, int16_t ob_swhich,
+                     int16_t ob_sival1, int16_t ob_sival2,
+                     int16_t *ob_soval1, int16_t *ob_soval2)
+{
+   int_in[0] = ob_smode;
+   int_in[1] = ob_swhich;
+   int_in[2] = ob_sival1;
+   int_in[3] = ob_sival2;
+
+   crys_if (48);
+
+   *ob_soval1 = int_out[1];
+   *ob_soval2 = int_out[2];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]48 # Function opcode
control+2control[1]4 # Entry in int_in
control+4control[2]3 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]ob_smode
int_in+2int_in[1]ob_swhich
int_in+4int_in[2]ob_sival1
int_in+6int_in[3]ob_sival2
int_outint_out[0]Return value
int_out+2int_out[1]ob_soval1
int_out+4int_out[2]ob_soval2
+
+ + +
+ +

8.18.10 objc_wchange

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Object window change« - Alter the display of an object in a +window within specified limits. +
  +
Opcode: 61 +
  +
Syntax: void objc_wchange ( OBJECT *ob_ctree, int16_t ob_cobject, +int16_t ob_cnewstate, GRECT *clip, int16_t whandle ); +
  +
Description: The call objc_wchange alters the display state of an object in +a window and, if necessary, redraws it. The following apply: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
ob_ctreeAddress of the object tree
ob_cobjectIndex of the relevant object
ob_cnewstateNew status of the object
clipBounding clipping rectangle
whandleWindow identifier
+
+ +
Note: A call of this function is equivalent to calling +objc_change (without a redraw) followed by objc_wdraw. +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: The function is available in MagiC as of Version 5.10. +
  +
Group: Object library +
  +
See also: Binding   objc_change   OBJECT +
  + +
+ +

8.18.10.1 Bindings for objc_wchange

+ + + + + + + + + +
C: void objc_wchange ( OBJECT *ob_ctree, int16_t ob_cobject, +int16_t ob_cnewstate, GRECT *clip, int16_t whandle ); +
  +
Binding: +
  +
void objc_wchange (OBJECT *ob_ctree, int16_t ob_cobject,
+                   int16_t ob_cnewstate, GRECT *clip,
+                   int16_t whandle)
+{
+   int_in[0]  = ob_cobject;
+   int_in[1]  = ob_cnewstate;
+   int_in[2]  = whandle;
+
+   addr_in[0] = ob_ctree;
+   addr_in[1] = clip;
+
+   crys_if(61);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]61 # Function opcode
control+2control[1]3 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]ob_cobject
int_in+2int_in[1]ob_cnewstate
int_in+4int_in[2]whandle
addr_inaddr_in[0]ob_ctree
addr_in+4addr_in[1]clip
+
+ + +
+ +

8.18.11 objc_wdraw

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Object window draw« - Draw an AES object tree in a +window. +
  +
Opcode: 60 +
  +
Syntax: void objc_wdraw ( OBJECT *ob_drtree, int16_t ob_drstart, +int16_t ob_drdepth, GRECT *clip, int16_t whandle ); +
  +
Description: The call objc_wdraw renders an object tree (or parts of +objects) in a window on the screen. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
ob_drtree Address of object tree to draw +
ob_drstart Index of the first object to be drawn +
ob_drdepth Number of object generations to be drawn (0 = only the first +object), maximum of 8 +
clip Bounding clipping rectangle +
whandle Window identifier + +
+ +
Note: In the parameters one can specify a rectangle to +which drawing is to be restricted (clipping). If clip has the +value NULL, then the drawing region is restricted to the working area +of the window. +
  +
The function corresponds essentially to objc_draw with the +difference that here the rectangle list of a window is respected. +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: The function is available in MagiC as of Version 5.10. +
  +
Group: Object library +
  +
See also: Binding   objc_draw   OBJECT +
  + +
+ +

8.18.11.1 Bindings for objc_wdraw

+ + + + + + + + + +
C: void objc_wdraw ( OBJECT *ob_drtree, int16_t ob_drstart, +int16_t ob_drdepth, GRECT *clip, int16_t whandle ); +
  +
Binding: +
  +
void objc_wdraw (OBJECT *ob_drtree, int16_t ob_drstart,
+                 int16_t ob_drdepth, GRECT *clip,
+                 int16_t whandle)
+{
+   int_in[0]  = ob_drstart;
+   int_in[1]  = ob_drdepth;
+   int_in[2]  = whandle;
+
+   addr_in[0] = ob_drtree;
+   addr_in[1] = clip;
+
+   crys_if(60);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]60 # Function opcode
control+2control[1]3 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]ob_drstart
int_in+2int_in[1]ob_drdepth
int_in+4int_in[2]whandle
addr_inaddr_in[0]ob_drtree
addr_in+4addr_in[1]clip
+
+ + +
+ +

8.18.12 objc_wedit

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Object window edit« - Edit text in an object in a window. +
  +
Opcode: 65 +
  +
Syntax: int16_t objc_wedit ( OBJECT *ob_edtree, int16_t ob_edobject, +int16_t ob_edchar, int16_t *ob_edidx, int16_t ob_edkind, int16_t +whandle ); +
  +
Description: The call objc_wedit permits manual text input into objects of +the type G_FTEXT or G_FBOXTEXT in a window. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
ob_edtree Address of the relevant object tree +
ob_edobject Index of the object to be edited +
ob_edchar Character that was input (scancode in the high and ASCII-code in +the low byte) +
ob_edidx Position of character in the string +
ob_edkind Function selection, as follows: + + + + + + + + + + + + + + + +
0 = Reserved +
1 = Calculate formatted string, and switch on cursor +
2 = Process character and then display string anew +
3 = Switch off cursor +
103 = As mode 3, but the cursor is drawn in XOR mode + +
+ +
whandle Window identifier + +
+ +
Note: The function corresponds in principle to objc_edit +with the difference that here the rectangle list of a window is +respected. +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: The function is available in MagiC as of Version 5.10. +
  +
Group: Object library +
  +
See also: Binding   objc_edit   OBJECT   TEDINFO +
  + +
+ +

8.18.12.1 Bindings for objc_wedit

+ + + + + + + + + +
C: int16_t objc_wedit ( OBJECT *ob_edtree, int16_t ob_edobject, +int16_t ob_edchar, int16_t *ob_edidx, int16_t ob_edkind, int16_t +whandle ); +
  +
Binding: +
  +
int16_t objc_wedit (OBJECT *ob_edtree, int16_t ob_edobject,
+                    int16_t ob_edchar, int16_t *ob_edidx,
+                    int16_t ob_edkind, int16_t whandle)
+{
+   int_in[0] = ob_edobject;
+   int_in[1] = ob_edchar;
+   int_in[2] = *ob_edidx;
+   int_in[3] = ob_edkind;
+   int_in[4] = whandle;
+
+   addr_in[0] = ob_edtree;
+
+   crys_if (65);
+
+   *ob_edidx = int_out[1];
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]65 # Function opcode
control+2control[1]5 # Entry in int_in
control+4control[2]2 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]ob_edobject
int_in+2int_in[1]ob_edchar
int_in+4int_in[2]ob_edidx
int_in+6int_in[3]ob_edkind
int_in+8int_in[4]whandle
addr_inaddr_in[0]ob_edtree
int_outint_out[0]Return value
int_out+2int_out[1]ob_edidx
+
+ + +
+ +

8.18.13 objc_xedit

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Object xedit« - Edit text in an object. +
  +
Opcode: 46 +
  +
Syntax: int16_t objc_xedit ( OBJECT *ob_edtree, int16_t ob_edobject, +int16_t ob_edchar, int16_t *ob_edidx, int16_t ob_edkind, GRECT *r ); +
  +
Description: The call objc_xedit permits manual text input into objects of +the type G_FTEXT or G_FBOXTEXT. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
ob_edtree Address of the relevant object tree +
ob_edobject Index of the object to be edited +
ob_edchar Character that was input (scancode in the high and ASCII-code in +the low byte) +
ob_edidx Position of character in the string +
ob_edkind Function selection, as follows: + + + + + + + + + + + + + + + +
  0 = Reserved +
  1 = Calculate formatted string, and switch on cursor +
  2= Process character and then display string anew +
  3 = Switch off cursor +
103 As mode 3, but the cursor is drawn in XOR mode, and in addition +a pointer to a GRECT must be passed, to which the output is +restricted; important for redraws in windows + +
+ +
r See ob_edkind + +
+ +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: As of MagiC Version 2.0. +
  +
Group: Object library +
  +
See also: Binding   objc_wedit   OBJECT   TEDINFO   objc_edit +
  + +
+ +

8.18.13.1 Bindings for objc_xedit

+ + + + + + + + + +
C: int16_t objc_xedit ( OBJECT *ob_edtree, int16_t ob_edobject, +int16_t ob_edchar, int16_t *ob_edidx, int16_t ob_edkind, GRECT *r ); +
  +
Binding: +
  +
int16_t objc_xedit (OBJECT *ob_edtree, int16_t ob_edobject,
+                    int16_t ob_edchar, int16_t *ob_edidx,
+                    int16_t ob_edkind, GRECT *r)
+{
+   int_in[0]  = ob_edobject;
+   int_in[1]  = ob_edchar;
+   int_in[2]  = *ob_edidx;
+   int_in[3]  = ob_edkind;
+   addr_in[0] = ob_edtree;
+   addr_in[1] = r;
+
+   crys_if (46);
+
+   *ob_edidx = int_out[1];
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]46 # Function opcode
control+2control[1]4 # Entry in int_in
control+4control[2]2 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]ob_edobject
int_in+2int_in[1]ob_edchar
int_in+4int_in[2]ob_edidx
int_in+6int_in[3]ob_edkind
addr_inaddr_in[0]ob_edtree
addr_in+4addr_in[1]r
int_outint_out[0]Return value
int_out+2int_out[1]ob_edidx
+
+ + +
+ +

8.18.14 objc_xfind

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Object xfind« - Find which object lies at the specified +screen position. +
  +
Opcode: 49 +
  +
Syntax: int16_t objc_xfind ( OBJECT *ob_ftree, int16_t ob_fstartob, +int16_t ob_fdepth, int16_t ob_fmx, int16_t ob_fmy ); +
  +
Description: The call objc_xfind determines which object is found at given +screen coordinates. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
ob_ftree Address of the relevant object tree +
ob_fstartob Index of the object at which the search is to start +
ob_fdepth Number of generations that are to be searched (0 = parent +object only), 7 max. +
ob_fmx X-coordinate, and +
ob_fmy Y-coordinate of the screen position + +
+ +
Note: The difference from objc_find is that this uses the +bounding object rectangle instead of the normal object rectangle, so +in this function the frame of the object will be respected as well. +
  +
Return value: The object index found at the coordinates ob_fmx, +ob_fmy (or -1 for 'no object found'). +
  +
Availability: The presence of this function can be ascertained with a call of +appl_getinfo (opcode 5). +
  +
Group: Object library +
  +
See also: Binding   OBJECT   objc_find +
  + +
+ +

8.18.14.1 Bindings for objc_xfind

+ + + + + + + + + +
C: int16_t objc_xfind ( OBJECT *ob_ftree, int16_t ob_fstartob, +int16_t ob_fdepth, int16_t ob_fmx, int16_t ob_fmy ); +
  +
Binding: +
  +
int16_t objc_xfind (OBJECT *ob_ftree, int16_t ob_fstartob,
+                    int16_t ob_fdepth, int16_t ob_fmx,
+                    int16_t ob_fmy)
+{
+   int_in[0]  = ob_fstartob;
+   int_in[1]  = ob_fdepth;
+   int_in[2]  = ob_fmx;
+   int_in[3]  = ob_fmy;
+   addr_in[0] = ob_ftree;
+
+   return ( crys_if(49) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]49 # Function opcode
control+2control[1]4 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]ob_fstartob
int_in+2int_in[1]ob_fdepth
int_in+4int_in[2]ob_fmx
int_in+6int_in[3]ob_fmy
addr_inaddr_in[0]ob_ftree
int_outint_out[0]Return value
+
+ + +
+ +

8.18.15 x_objc_edit

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Object edit« - Edit text in an editable text object. +
  +
Opcode: 28992 +
  +
Syntax: int16_t x_objc_edit( OBJECT *tree, int16_t edit_obj, int16_t +key_press, int16_t shift_state, int16_t *edit_idx, int16_t mode ); +
  +
Description: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
tree OBJECT tree containing editable field +
edit_obj Object being edited +
key_press Scan code and ASCII value of the key +
shift_state +
+
+ + + + + + + + + + + + + + + +
Bit 0=Right-Shift
Bit 1=Left-Shift
Bit 2=Control
+
+ +
edit_idx Current cursor position within field +
mode + + + + + + + + + +
1 Calculate formatted string, and switch on cursor +
2 Process character and then display string anew +
3 Switch off cursor + +
+ + +
+ +
This function is nearly identical to the objc_edit function +normaly found in GEM. By adding the shift_state, however, it is able +to correctly process extended keystrokes involving the [Control] and +[Shift] keys. +
  +
Return value: 0 = not an editable field +
1 = No error +
  +
In edit_idx will return the new cursor position. +
  +
Availability: The function is only available under Geneva. +
  +
Group: Object library +
  +
See also: Binding   objc_edit +
  + +
+ +

8.18.15.1 Bindings for x_objc_edit

+ + + + + + + + + +
C: int16_t x_objc_edit( OBJECT *tree, int16_t edit_obj, int16_t +key_press, int16_t shift_state, int16_t *edit_idx, int16_t mode ); +
  +
Binding: +
  +
int16_t x_objc_edit( OBJECT *tree, int16_t edit_obj, int16_t
+key_press, int16_t shift_state, int16_t *edit_idx, int16_t
+mode )
+{
+   int_in[0] = edit_obj;
+   int_in[1] = key_press;
+   int_in[2] = *edit_idx;
+   int_in[3] = shift_state;
+   int_in[4] = mode;
+   addr_in[0] = tree;
+
+   crys_if(28992);
+
+   *edit_idx = int_out[1];
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]28992 # Function opcode
control+2control[1]5 # Entry in int_in
control+4control[2]2 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]edit_obj
int_in+2int_in[1]key_press
int_in+4int_in[2]edit_idx
int_in+6int_in[3]shift_state
int_in+8int_in[4]mode
addr_inaddr_in[0]tree
int_outint_out[0]Return value
int_out+2int_out[1]edit_idx
+
+ + +
+ +
+ +Home +AESAES +Menu libraryMenu library +Process libraryProcess library + + diff --git a/en/old_preface.html b/en/old_preface.html new file mode 100644 index 000000000..c69866155 --- /dev/null +++ b/en/old_preface.html @@ -0,0 +1,194 @@ + + + + + +The documentation for TOS: Old foreword by Rolf Kotzian + + + + + + + + + +Home +IntroductionIntroduction +ContactContact +HistoryHistory + +
+ +

1.2 Old foreword by Rolf Kotzian

+

This hypertext serves as a reference work for the system +functions of the operating systems TOS, MultiTOS, MagiC and MagiC Mac. +As one can no longer expect a new edition of the 'Atari-Profibuch', it +is getting more and more difficult to obtain structured information +about the existing system functions. A well-structured hypertext for +ST-Guide can provide a remedy for this and I believe that this version +of the hypertext meanwhile will fulfill many requirements. +

+

As the original author, for various reasons, no longer had an +interest in maintaining this hypertext, I have taken over further +development from Version 3.10 onwards. Unfortunately the Fairware +concept that I chose for this hypertext has proved to be a complete +flop. As the development of the hypertext is linked not only with +a very high expenditure of time but also of money, and I cannot afford +to store several megabytes of data free of charge in my mailbox for +any length of time, future versions will only be available for payment +(and only directly from me). Translator's note: This changed +later and the hypertext is at present available free of charge under +the conditions described in The GNU General Public Licence. +

+

Naturally it's obvious that I can only include information in +the hypertext that I know about. Anyone missing some particular +information can therefore assume first that I do not have it at the +present time or due to certain circumstances I have not yet got round +to including it in the hypertext. I am basically thankful to anyone +who can help me with any information, and in that way contribute to +make this hypertext as complete and up to date a reference work for +TOS/MagiC programming as possible. It should be clear that the +potentialities of an operating system can only be fully exploited in +programs when this is sufficiently documented - and this is just what +this project is intended to realize. In this connection a complete and +extensive documentation of the MiNT-library would be most desirable. +

+

I refer at this point specifically to the fact that the +information contained in this hypertext does not all originate from my +pen, but that an almost uncountable number of sources have been +collated, sorted, revised and transformed into the hypertext format. +In this connection, my thanks go to Volker Ritzhaupt and +Oliver Buchmann (Application Systems Heidelberg), who made +available to me important sources of information (MagiC, MagiC Mac and +NVDI), as well as Thomas Tempelmann for energetic support for +the MagiC Mac specifics. +

+

I have attempted to take the greatest of care in the collation +of all information; however I can assume no guarantee for the +correctness of the information present in this hypertext. The author +can accept no liability for any damage or harm arising from +the use of this work. The reproduction of registered or trade names, +trade descriptions etc. in this work does not entitle anyone +to assume even without special identification that such names may be +used freely by anyone without regard to trade mark and related +legislation. +

+
+ +

Translator's note: Most of the rest of this section no +longer applies as the hypertext is at present being distributed free +of charge under the conditions described in The GNU General Public +Licence. +

+
+ +

As mentioned above already, unfortunately the Fairware +concept for this hypertext has proved to be a complete failure. +For this reason new versions are only available to those who pay and +only directly from me. Those who have not so far sent a contribution, +but are interested in a current version of the hypertext, may obtain +it for a onetime payment of 35.- DM. When an update appears +no further payment is required (though I will not turn down +any update donations ;-). Money can be transferred to the following +account: +

+

Data deleted! (Gerhard Stoll) +

+

For payment I would ask you to note the reason for the payment +(e.g. 'TOS-Hypertext') as well as including a complete and legible +address. Those with email facilities are advised to also notify me of +payment via this. Payment of the above-mentioned 35.- DM will register +you with me and you will receive the current version by return on an +HD floppy disk (only HD disks will be sent). Future versions +can then be ordered for a transfer to my acount of 5.- DM (for +diskette, postage and envelope), and are also available for +download via the Internet for registered users. +

+

All those interested should specify whether they wish to order a +mono or colour version of the hypertext. If this is not stated, I +will send the monochrome version. With the colour version you +should note the following: This contains graphics with up to 16 +colours, which however are only displayed correctly with the ST-Guide +version dated 10.12.96. Apart from the difference between monochrome +and coloured illustrations, the mono and colour versions of the +hypertexts are, of course, fully identical, i.e. they contain the same +information. +

+

Normally one should assume that the Bundespost will deliver +letters. Besides delays, it has been said that letters and even +packages at times suddenly just disappear. For someone who has paid +the postage etc., this is, of course, very annoying. I ask for +understanding that I can do nothing in such cases, and will send off +the hypertext only after a new transfer of 5.-DM to my +account. +

+

Praise, criticism, suggestions and bug-reports can reach me by +mail to the following address: +

+

Data deleted! (Gerhard Stoll) +

+

Information about the current version of the hypertex can +also be obtained via my homepage in the Internet. The URL is: +

+

Data deleted! (Gerhard Stoll) +

+

Important: Due to lack of support by users, the status +of the hypertext has been changed once more. The TOS-hypertext is +neither Public Domain nor Freeware, and from Version 3.70 on also +no longer Fairware. Distribution via PD-collection disks, +CD-ROMs, via mailboxes and similar media is not permitted. +

+

In no way do I want to give the impression of only wanting +to make money with this project. I certainly won't get rich from +this hypertext (and this surely applies also to virtualy all products +on the Atari market). But I am of the opinion that those who have used +this hypertext since Version 3.10 (and have made use of updates) +should think for a minute about the word Fairware, and the +(also financial) outlay of this project. +

+

Paderborn, August 1998 +

+

Rolf Kotzian +

+

Changes in distribution (as of: November 1998) +———————– +

+

Due to the high expenditure of time in the development of this +hypertext I have have till now felt unable to make it available free +of charge. Recently the development has unfortunately come to +something of a standstill. Reasons: +

+

• Job-related stress +
• Changes in private life +
• Increasing focus on the Macintosh +

+

As unfortunately no improvement is likely in this regard in the +near future, but I would still like to make life a little easier for +the remaining Atari programmers, the hypertext is from now on +downloadable free of charge via my homepage. Warning: +I retain the right to change this again at any time. So possibly later +versions of this hypertext will be available again only after payment. +Regarding payment: Those using the hypertext and finding it useful may +like to send me a contribution of some kind. The following account may +be used for this: +

+

Data deleted! (Gerhard Stoll) +

+

With a contribution I would ask you to note the reason for it +(e.g. 'TOS-Hypertext') as well as including a complete and legible +address. +

+

Paderborn, November 1998 +

+

Rolf Kotzian +

+
+ +Home +IntroductionIntroduction +ContactContact +HistoryHistory + + diff --git a/en/pdlg.html b/en/pdlg.html new file mode 100644 index 000000000..46a9ed0fd --- /dev/null +++ b/en/pdlg.html @@ -0,0 +1,3020 @@ + + + + + +The documentation for TOS: Print dialogs + + + + + + + + + +Home +AESAES +File-selector libraryFile-selector library +Editable object functionsEditable object functions + +
+ +

8.5 Print dialogs

+

The following routines were introduced with MagiC (also +WDIALOG), and permit the creation and handling of print dialogs: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
pdlg_add_printers Adds application's printers +
pdlg_add_sub_dialogs Adds application's sub-dialogs +
pdlg_close Close window of a print dialog +
pdlg_create Initialise print dialog, allocate memory +
pdlg_delete Frees memory +
pdlg_dflt_settings Initialise memory region with printer settings +
pdlg_do Displays modal dialog +
pdlg_evnt Manages events for dialog in window +
pdlg_free_settings Frees memory used for printer settings +
pdlg_get_setsize Gets size of the structure +
pdlg_new_settings Returns pointer to initialized printer settings +
pdlg_open Opens selection dialog in window +
pdlg_remove_printers Removes application's printers +
pdlg_remove_sub_dialogs Removes application's sub-dialogs +
pdlg_save_default_settings Saves the default settings +
pdlg_update Updates window title +
pdlg_use_settings Validates and adopt printer settings +
pdlg_validate_settings Validates printer settings + +
+ +

Hint: The presence of this call should be checked for +using appl_getinfo (opcode 7). +

+

See also: +
Display in a window   Display as modal dialog   AES   GEM   WDIALOG   Style guidelines +

+

8.5.1 pdlg_add_printers

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Print dialog - Add private printers« - Add application's own +printer descriptions. +
  +
Opcode: 205 (sub-opcode 0) +
  +
Syntax: int16_t pdlg_add_printers ( PRN_DIALOG *prn_dialog, DRV_INFO +*drv_info ); +
  +
Description: The call pdlg_add_printer permits adding an application's own +printer descriptions to the print dialog. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
prn_dialog Pointer to management structure +
drv_info Pointer to the list of available printers and rastering +processes + +
+ +
Note: The driver's index should be set to 0x7fff, so as +to differentiate the custom driver from that of the operating system. +
  +
Return value: The function returns the value 1 if all went well, else the +value 0 in case of error. +
  +
Availability: The presence of this function can be checked with appl_getinfo +(opcode 7). +
  +
Group: Print dialogs +
  +
See also: Binding   WDIALOG +
  + +
+ +

8.5.1.1 Bindings for pdlg_add_printers

+ + + + + + + + + +
C: int16_t pdlg_add_printers ( PRN_DIALOG *prn_dialog, DRV_INFO +*drv_info ); +
  +
Binding: +
  +
int16_t pdlg_add_printers ( PRN_DIALOG *prn_dialog,
+                            DRV_INFO *drv_info )
+{
+   addr_in[0] = prn_dialog;
+   addr_in[1] = drv_info;
+   int_in[0] = 0;
+
+   crys_if (205);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]205 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]prn_dialog
addr_in+4addr_in[1]drv_info
int_inint_in[0]0 # Sub-opcode
int_outint_out[0]Return value
+
+ + +
+ +

8.5.2 pdlg_add_sub_dialogs

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Print dialog - Add private dialogs« - Add sub-dialogs to the +printer dialog. +
  +
Opcode: 205 (sub-opcode 3) +
  +
Syntax: int16_t pdlg_add_sub_dialogs ( PRN_DIALOG *prn_dialog, PDLG_SUB +*sub_dialog ); +
  +
Description: The call pdlg_add_sub_dialogs permits adding an application's +own sub-dialogs to the printer dialog. The following apply: +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
prn_dialogPointer to management structure
sub_dialogList of sub-dialogs
+
+ +
This function could be useful to add custom print options such +as markers, watermarks or background images, for instance. +
  +
Return value: The function returns the value 1 if all went well, else the +value 0 in case of error. +
  +
Availability: The presence of this function can be checked with appl_getinfo +(opcode 7). +
  +
Group: Print dialogs +
  +
See also: Binding   WDIALOG +
  + +
+ +

8.5.2.1 Bindings for pdlg_add_sub_dialogs

+ + + + + + + + + +
C: int16_t pdlg_add_sub_dialogs ( PRN_DIALOG *prn_dialog, PDLG_SUB +*sub_dialog ); +
  +
Binding: +
  +
int16_t pdlg_add_sub_dialogs ( PRN_DIALOG *prn_dialog,
+                               PDLG_SUB *sub_dialog )
+{
+   addr_in[0] = prn_dialog;
+   addr_in[1] = sub_dialog;
+   int_in[0] = 3;
+
+   crys_if (205);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]205 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]prn_dialog
addr_in+4addr_in[1]sub_dialog
int_inint_in[0]3 # Sub-opcode
int_outint_out[0]Return value
+
+ + +
+ +

8.5.3 pdlg_close

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Print dialog - Close window« - Close print dialog. +
  +
Opcode: 203 +
  +
Syntax: int16_t pdlg_close ( PRN_DIALOG *prn_dialog, int16_t *x, +int16_t *y ); +
  +
Description: The call pdlg_close closes the window of the print dialog. The +following apply: +
  +

+
+ + + + + + + + + + + + + + + + +
ParameterMeaning
prn_dialogPointer to management structure
xX-coordinate of the window
yY-coordinate of the window
+
+ +
The parameters x and y are those of the last +position of the print dialog. +
  +
Return value: The function always returns the value 1. +
  +
Availability: The presence of this function can be checked with appl_getinfo +(opcode 7). +
  +
Group: Print dialogs +
  +
See also: Binding   WDIALOG +
  + +
+ +

8.5.3.1 Bindings for pdlg_close

+ + + + + + + + + +
C: int16_t pdlg_close ( PRN_DIALOG *prn_dialog, int16_t *x, +int16_t *y ); +
  +
Binding: +
  +
int16_t pdlg_close ( PRN_DIALOG *prn_dialog, int16_t *x,
+                     int16_t *y )
+{
+   int_out[1] = -1;
+   int_out[2] = -1;
+
+   addr_in[0] = prn_dialog;
+   crys_if (203);
+
+   *x = int_out[1];
+   *y = int_out[2];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]203 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]3 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]prn_dialog
int_outint_out[0]Return value
int_out+2int_out[1]x
int_out+4int_out[2]y
+
+ + +
+ +

8.5.4 pdlg_create

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Print dialog - Create« - Initialize the print dialog. +
  +
Opcode: 200 +
  +
Syntax: PRN_DIALOG *pdlg_create ( int16_t dialog_flags ); +
  +
Description: The call pdlg_create initializes the print dialog and allocates +memory for it. The following apply: +
  + + + + + + + + + +
Parameter Meaning +
    + +
dialog_flags Diverse flags: + + + +
PDLG_3D (1) = Display selection in 3D-look + +
+ + +
+ +
On calling the function a scan will be made for the printer +drivers present and memory will be allocated for the resource. +
  +
Return value: The function returns a pointer to a PRN_DIALOG structure. +
  +
Availability: The presence of this function can be checked with appl_getinfo +(opcode 7). +
  +
Group: Print dialogs +
  +
See also: Binding   WDIALOG +
  + +
+ +

8.5.4.1 Bindings for pdlg_create

+ + + + + + + + + +
C: PRN_DIALOG *pdlg_create ( int16_t dialog_flags ); +
  +
Binding: +
  +
PRN_DIALOG *pdlg_create ( int16_t dialog_flags )
+{
+   int_in[0] = dialog_flags;
+   crys_if (200);
+
+   return ( addr_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]200 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]1 # Entry in addr_out
int_inint_in[0]dialog_flags
addr_outaddr_out[0]Return value
+
+ + +
+ +

8.5.5 pdlg_delete

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Print dialog - Delete« - Release the memory of the print +dialog. +
  +
Opcode: 201 +
  +
Syntax: int16_t pdlg_delete ( PRN_DIALOG *prn_dialog ); +
  +
Description: The call pdlg_delete frees the memory used for the print +dialog. The following applies: +
  +

+
+ + + + + + + + +
ParameterMeaning
prn_dialogPointer to management structure
+
+ +
Return value: The function always returns the value 1. +
  +
Availability: The presence of this function can be checked with appl_getinfo +(opcode 7). +
  +
Group: Print dialogs +
  +
See also: Binding   WDIALOG +
  + +
+ +

8.5.5.1 Bindings for pdlg_delete

+ + + + + + + + + +
C: int16_t pdlg_delete ( PRN_DIALOG *prn_dialog ); +
  +
Binding: +
  +
int16_t pdlg_delete ( PRN_DIALOG *prn_dialog )
+{
+   addr_in[0] = prn_dialog;
+   crys_if (201);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]201 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]prn_dialog
int_outint_out[0]Return value
+
+ + +
+ +

8.5.6 pdlg_dflt_settings

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Print dialog - Default settings« - Default initialization. +
  +
Opcode: 205 (sub-opcode 7) +
  +
Syntax: int16_t pdlg_dflt_settings ( PRN_DIALOG *prn_dialog, +PRN_SETTINGS *settings ); +
  +
Description: The call pdlg_dflt_settings takes on the initialization of the +default printer settings in memory. The following apply: +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
prn_dialogPointer to management structure
settingsPrinter settings
+
+ +
Structure length from PRN_SETTINGS can be found with +pdlg_get_setsize. +
  +
Return value: The function always returns the value 1. +
  +
Availability: The presence of this function can be checked with appl_getinfo +(opcode 7). +
  +
Group: Print dialogs +
  +
See also: Binding   WDIALOG +
  + +
+ +

8.5.6.1 Bindings for pdlg_dflt_settings

+ + + + + + + + + +
C: int16_t pdlg_dflt_settings ( PRN_DIALOG *prn_dialog, +PRN_SETTINGS *settings ); +
  +
Binding: +
  +
int16_t pdlg_dflt_settings ( PRN_DIALOG *prn_dialog,
+                             PRN_SETTINGS *settings )
+{
+   addr_in[0] = prn_dialog;
+   addr_in[1] = settings;
+
+   int_in[0] = 7;
+   crys_if (205);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]205 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]prn_dialog
addr_in+4addr_in[1]settings
int_inint_in[0]7 # Sub-opcode
int_outint_out[0]Return value
+
+ + +
+ +

8.5.7 pdlg_do

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Print dialog - Do« - Open a print dialog. +
  +
Opcode: 207 +
  +
Syntax: int16_t pdlg_do ( PRN_DIALOG *prn_dialog, PRN_SETTINGS +*settings, int8_t *document_name, int16_t option_flags ); +
  +
Description: The call pdlg_do opens a modal print dialog. The following +apply: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
prn_dialog Pointer to management structure +
settings Printer settings +
document_name Document name +
option_flags Diverse flags: + + + + + + + + + + + + + + + + + + +
0x0000 = Display settings dialog +
0x0001 = Display print dialog +
0x0010 = Always offer No. of copies +
0x0020 = Always offer landscape format +
0x0040 = Always offer scaling +
0x0100 = Offer option for even and odd pages + +
+ + +
+ +
The function only returns to the caller when one of the exit +buttons has been activated ('Cancel', 'OK'). +
  +
Return value: The function returns the value of the selected button (1 = +Cancel, 2 = OK), or the value 0 in case of error. +
  +
Availability: The presence of this function can be checked with appl_getinfo +(opcode 7). +
  +
Group: Print dialogs +
  +
See also: Binding   WDIALOG +
  + +
+ +

8.5.7.1 Bindings for pdlg_do

+ + + + + + + + + +
C: int16_t pdlg_do ( PRN_DIALOG *prn_dialog, PRN_SETTINGS +*settings, int8_t *document_name, int16_t option_flags ); +
  +
Binding: +
  +
int16_t pdlg_do ( PRN_DIALOG *prn_dialog,
+                  PRN_SETTINGS *settings,
+                  int8_t *document_name,
+                  int16_t option_flags )
+{
+   addr_in[0] = prn_dialog;
+   addr_in[1] = settings;
+   addr_in[2] = document_name;
+
+   int_in[0] = option_flags;
+   crys_if (207);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]207 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]3 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]prn_dialog
addr_in+4addr_in[1]settings
addr_in+8addr_in[2]document_name
int_inint_in[0]option_flags
int_outint_out[0]Return value
+
+ + +
+ +

8.5.8 pdlg_evnt

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Print dialog - Handle event« - Event processing of the print +dialog. +
  +
Opcode: 206 +
  +
Syntax: int16_t pdlg_evnt ( PRN_DIALOG *prn_dialog, PRN_SETTINGS +*settings, EVNT *events, int16_t *button ); +
  +
Description: The call pdlg_evnt takes on the event management for a print +dialog. The following apply: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
prn_dialogPointer to management structure
settingsPrinter settings
eventsPointer to EVNT structure
buttonSelected button (or 0)
 PDLG_CANCEL (1) = Cancel
 PDLG_OK (2)     = OK
+
+ +
The funcfunc evaluat and internally calls wdlg_evnt. If the +dialog was confirmed, then the new printer settings are returned in +settings. +
  +
Return value: The function returns the value 0 if one of the EXIT buttons was +clicked on, else the value 1. +
  +
Availability: The presence of this function can be checked with appl_getinfo +(opcode 7). +
  +
Group: Print dialogs +
  +
See also: Binding   WDIALOG +
  + +
+ +

8.5.8.1 Bindings for pdlg_evnt

+ + + + + + + + + +
C: int16_t pdlg_evnt ( PRN_DIALOG *prn_dialog, PRN_SETTINGS +*settings, EVNT *events, int16_t *button ); +
  +
Binding: +
  +
int16_t pdlg_evnt ( PRN_DIALOG *prn_dialog,
+                    PRN_SETTINGS *settings,
+                    EVNT *events, int16_t *button )
+{
+   addr_in[0] = prn_dialog;
+   addr_in[1] = settings;
+   addr_in[2] = events;
+
+   crys_if (206);
+
+   *button = int_out[1];
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]206 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]2 # Entry in int_out
control+6control[3]3 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]prn_dialog
addr_in+4addr_in[1]settings
addr_in+8addr_in[2]events
int_outint_out[0]Return value
int_out+2int_out[1]button
+
+ + +
+ +

8.5.9 pdlg_free_settings

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Print dialog - Free settings« - Release memory. +
  +
Opcode: 205 (sub-opcode 6) +
  +
Syntax: int16_t pdlg_free_settings ( PRN_SETTINGS *settings ); +
  +
Description: The call pdlg_free_setting frees the memory that was reserved +by the call pdlg_new_settings. The following applies: +
  +

+
+ + + + + + + + +
ParameterMeaning
settingsPrinter settings
+
+ +
Return value: The function returns the value 1 if all went well, else the +value 0 in case of error. +
  +
Availability: The presence of this function can be checked with appl_getinfo +(opcode 7). +
  +
Group: Print dialogs +
  +
See also: Binding   WDIALOG +
  + +
+ +

8.5.9.1 Bindings for pdlg_free_settings

+ + + + + + + + + +
C: int16_t pdlg_free_settings ( PRN_SETTINGS *settings ); +
  +
Binding: +
  +
int16_t pdlg_free_settings ( PRN_SETTINGS *settings )
+{
+   addr_in[0] = settings;
+   int_in[0] = 6;
+   crys_if (205);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]205 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]settings
int_inint_in[0]6 # Sub-opcode
int_outint_out[0]Return value
+
+ + +
+ +

8.5.10 pdlg_get_setsize

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Print dialog - Get setting structure size« - Obtain the +length of the PRN_SETTINGS structure. +
  +
Opcode: 204 (sub-opcode 0) +
  +
Syntax: int32_t pdlg_get_setsize ( void ); +
  +
Description: The call pdlg_get_setsize returns the length of the +PRN_SETTINGS structure. +
  +
Return value: The function returns the length of the structure in bytes. +
  +
Availability: The presence of this function can be checked with appl_getinfo +(opcode 7). +
  +
Group: Print dialogs +
  +
See also: Binding   WDIALOG +
  + +
+ +

8.5.10.1 Bindings for pdlg_get_setsize

+ + + + + + + + + +
C: int32_t pdlg_get_setsize ( void ); +
  +
Binding: +
  +
int32_t pdlg_get_setsize ( void )
+{
+   int_in[0] = 0;
+   crys_if (204);
+
+   return ( int_out[0..1] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]204 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]2 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]0 # Sub-opcode
int_outint_out[0..1]Return value
+
+ + +
+ +

8.5.11 pdlg_new_settings

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Print dialog - New default settings« - Set default printer +settings. +
  +
Opcode: 205 (sub-opcode 5) +
  +
Syntax: PRN_SETTINGS *pdlg_new_settings ( PRN_DIALOG *prn_dialog ); +
  +
Description: The call pdlg_new_settings returns a pointer to the initialized +printer settings. The following applies: +
  +

+
+ + + + + + + + +
ParameterMeaning
prn_dialogPointer to management structure
+
+ +
Return value: The function returns a pointer to a PRN_SETTINGS structure in +which the current printer settings are stored. +
  +
Availability: The presence of this function can be checked with appl_getinfo +(opcode 7). +
  +
Group: Print dialogs +
  +
See also: Binding   WDIALOG +
  + +
+ +

8.5.11.1 Bindings for pdlg_new_settings

+ + + + + + + + + +
C: PRN_SETTINGS *pdlg_new_settings ( PRN_DIALOG *prn_dialog ); +
  +
Binding: +
  +
PRN_SETTINGS *pdlg_new_settings ( PRN_DIALOG *prn_dialog )
+{
+   addr_in[0] = prn_dialog;
+   int_in[0] = 5;
+   crys_if (205);
+
+   return ( addr_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]205 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]1 # Entry in addr_out
addr_inaddr_in[0]prn_dialog
int_inint_in[0]5 # Sub-opcode
addr_outaddr_out[0]Return value
+
+ + +
+ +

8.5.12 pdlg_open

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Print Dialog - Open Window« - Druckdialog im Fenster +öffnen. +
  +
Opcode: 202 +
  +
Syntax: int16_t pdlg_open ( PRN_DIALOG *prn_dialog, PRN_SETTINGS +*settings, int8_t *document_name, int16_t option_flags, int16_t x, +int16_t y ); +
  +
Description: The call pdlg_open opens a window with the print dialog. The +following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
prn_dialog Pointer to management structure +
settings Printer settings +
document_name Document name +
option_flags Diverse flags: + + + + + + + + + + + + + + + + + + +
0x0000 = Display settings dialog +
0x0001 = Display print dialog +
0x0010 = Always offer No. of copies +
0x0020 = lways offer landscape format +
0x0040 = Always offer scaling +
0x0100 = Offer option for even and odd pages + +
+ +
x X-coordinates of the window, or -1 (centred) +
y Y-coordinates of the window, or -1 (centred) + +
+ +
Note: The structure settings contains the +printer setting that should be saved with each document. If no setting +exists yet for a document, it can either be created with +pdlg_new_settings, or the application can call Malloc and subsequently +pdlg_dflt_settings to initialize the memory. +
  +
In the parameter option_flags one can decide, amongst +others, whether the dialog should be displayed as a settings or a +print dialog. With further flags one can also determine whether +scaling, copy options and landscape printing should be offered even if +a driver does not support them, so that the application has to output +the page rotated, for instance. +
  +
Return value: The function returns the ID of the created window, or the value +0 in case of error. +
  +
Availability: The presence of this function can be checked with appl_getinfo +(opcode 7). +
  +
Group: Print dialogs +
  +
See also: Binding   WDIALOG +
  + +
+ +

8.5.12.1 Bindings for pdlg_open

+ + + + + + + + + +
C: int16_t pdlg_open ( PRN_DIALOG *prn_dialog, PRN_SETTINGS +*settings, int8_t *document_name, int16_t option_flags, int16_t x, +int16_t y ); +
  +
Binding: +
  +
int16_t pdlg_open ( PRN_DIALOG *prn_dialog,
+                    PRN_SETTINGS *settings,
+                    int8_t *document_name,
+                    int16_t option_flags,
+                    int16_t x, int16_t y)
+{
+   addr_in[0] = prn_dialog;
+   addr_in[1] = settings;
+   addr_in[2] = document_name;
+
+   int_in[0] = option_flags;
+   int_in[1] = x;
+   int_in[2] = y;
+   crys_if (202);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]202 # Function opcode
control+2control[1]3 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]3 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]prn_dialog
addr_in+4addr_in[1]settings
addr_in+8addr_in[2]document_name
int_inint_in[0]option_flags
int_in+2int_in[1]x
int_in+4int_in[2]y
int_outint_out[0]Return value
+
+ + +
+ +

8.5.13 pdlg_remove_printers

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Print dialog - Remove private printers« - Remove +application's printers from the list. +
  +
Opcode: 205 (sub-opcode 1) +
  +
Syntax: int16_t pdlg_remove_printers ( PRN_DIALOG *prn_dialog ); +
  +
Description: The call pdlg_remove_printers removes the application's +printers registered with pdlg_add_printers. The following applies: +
  +

+
+ + + + + + + + +
ParameterMeaning
prn_dialogPointer to management structure
+
+ +
The function must be called before pdlg_delete. +
  +
Return value: The function always returns the value 1. +
  +
Availability: The presence of this function can be checked with appl_getinfo +(opcode 7). +
  +
Group: Print dialogs +
  +
See also: Binding   WDIALOG +
  + +
+ +

8.5.13.1 Bindings for pdlg_remove_printers

+ + + + + + + + + +
C: int16_t pdlg_remove_printers ( PRN_DIALOG *prn_dialog ); +
  +
Binding: +
  +
int16_t pdlg_remove_printers ( PRN_DIALOG *prn_dialog )
+{
+   addr_in[0] = prn_dialog_dialog;
+   int_in[0] = 1;
+   crys_if (205);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]205 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]prn_dialog
int_inint_in[0]1 # Sub-opcode
int_outint_out[0]Return value
+
+ + +
+ +

8.5.14 pdlg_remove_sub_dialogs

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Print dialog - Remove private dialogs« - Remove sub-dialogs +from the print dialog. +
  +
Opcode: 205 (sub-opcode 4) +
  +
Syntax: int16_t pdlg_remove_sub_dialogs ( PRN_DIALOG *prn_dialog ); +
  +
Description: The call pdlg_remove_sub_dialogs removes the application's own +sub-dialogs from the print dialog. The following applies: +
  +

+
+ + + + + + + + +
ParameterMeaning
prn_dialogPointer to management structure
+
+ +
Return value: The function always returns the value 1. +
  +
Availability: The presence of this function can be checked with appl_getinfo +(opcode 7). +
  +
Group: Print dialogs +
  +
See also: Binding   WDIALOG +
  + +
+ +

8.5.14.1 Bindings for pdlg_remove_sub_dialogs

+ + + + + + + + + +
C: int16_t pdlg_remove_sub_dialogs ( PRN_DIALOG *prn_dialog ); +
  +
Binding: +
  +
int16_t pdlg_remove_sub_dialogs ( PRN_DIALOG *prn_dialog )
+{
+   addr_in[0] = prn_dialog;
+   int_in[0] = 4;
+   crys_if (205);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]205 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]prn_dialog
int_inint_in[0]4 # Sub-opcode
int_outint_out[0]Return value
+
+ + +
+ +

8.5.15 pdlg_save_default_settings

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Print dialog - Save default settings« +
  +
Opcode: 205 (sub-opcode 10) +
  +
Syntax: int16_t pdlg_save_default_settings ( PRN_DIALOG *prn_dialog, +PRN_SETTINGS *settings ); +
  +
Description: The call pdlg_save_default_settings saves the default printer +settings that were set with pdlg_new_settings. The following apply: +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
prn_dialogPointer to management structure
settingsPointer to printer settings
+
+ +
Return value: The function returns the value 1 if all went well, else the +value 0 in case of error. +
  +
Availability: The presence of this function can be checked with appl_getinfo +(opcode 7). +
  +
Group: Print dialogs +
  +
See also: Binding   WDIALOG +
  + +
+ +

8.5.15.1 Bindings for pdlg_save_default_settings

+ + + + + + + + + +
C: int16_t pdlg_save_default_settings ( PRN_DIALOG *prn_dialog, +PRN_SETTINGS *settings ); +
  +
Binding: +
  +
int16_t pdlg_save_default_settings ( PRN_DIALOG *prn_dialog,
+                                     PRN_SETTINGS *settings )
+{
+   addr_in[0] = prn_dialog;
+   addr_in[1] = settings;
+
+   int_in[0] = 10;
+
+   crys_if (205);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]205 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]prn_dialog
addr_in+4addr_in[1]settings
int_inint_in[0]10 # Sub-opcode
int_outint_out[0]Return value
+
+ + +
+ +

8.5.16 pdlg_update

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Print Dialog - Update Window« - neuen Fensternamen setzen. +
  +
Opcode: 205 (sub-opcode 2) +
  +
Syntax: int16_t pdlg_update ( PRN_DIALOG *prn_dialog, int8_t +*document_name ); +
  +
Description: »Print dialog - Update window« - Set new window title. +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
prn_dialogPointer to management structure
document_nameNew document name
+
+ +
Note: The function should be called if a window-dialog +is lying in the background and the user tops a new document window +(brings it to the front). +
  +
Return value: The function returns the value 1 if it operates correctly, else +the value 0 in case of error. +
  +
Availability: The presence of this function can be checked with appl_getinfo +(opcode 7). +
  +
Group: Print dialogs +
  +
See also: Binding   WDIALOG +
  + +
+ +

8.5.16.1 Bindings for pdlg_update

+ + + + + + + + + +
C: int16_t pdlg_update ( PRN_DIALOG *prn_dialog, int8_t +*document_name ); +
  +
Binding: +
  +
int16_t pdlg_update ( PRN_DIALOG *prn_dialog,
+                      int8_t *document_name )
+{
+   addr_in[0] = prn_dialog;
+   addr_in[1] = 0;              /* Reserved (must be 0!) */
+   addr_in[2] = document_name;
+
+   int_in[0] = 2;
+   crys_if (205);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]205 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]3 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]prn_dialog
addr_in+4addr_in[1]0
addr_in+8addr_in[2]document_name
int_inint_in[0]2 # Sub-opcode
int_outint_out[0]Return value
+
+ + +
+ +

8.5.17 pdlg_use_settings

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Print dialog - Use settings« - Use validated settings. +
  +
Opcode: 205 (sub-opcode 9) +
  +
Syntax: int16_t pdlg_use_settings ( PRN_DIALOG *prn_dialog, +PRN_SETTINGS *settings ); +
  +
Description: The call pdlg_use_settings serves to validate the printer +settings that were set with pdlg_new_settings before adopting them for +use. The following apply: +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
prn_dialogPointer to management structure
settingsPrinter settings
+
+ +
This function should be called if a program wants to print +immediately and it is not possible to call pdlg_do or pdlg_open and +pdlg_evnt (e.g. Calamus print dialogs). The passed printer settings +will be validated (and saved for old drivers). +
  +
Return value: The function returns the value 1 if it operates correctly, else +the value 0 in case of error. +
  +
Availability: The presence of this function can be checked with appl_getinfo +(opcode 7). +
  +
Group: Print dialogs +
  +
See also: Binding   WDIALOG +
  + +
+ +

8.5.17.1 Bindings for pdlg_use_settings

+ + + + + + + + + +
C: int16_t pdlg_use_settings ( PRN_DIALOG *prn_dialog, +PRN_SETTINGS *settings ); +
  +
Binding: +
  +
int16_t pdlg_use_settings ( PRN_DIALOG *prn_dialog,
+                            PRN_SETTINGS *settings )
+{
+   addr_in[0] = prn_dialog;
+   addr_in[1] = settings;
+
+   int_in[0] = 9;
+   crys_if (205);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]205 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]prn_dialog
addr_in+4addr_in[1]settings
int_inint_in[0]9 # Sub-opcode
int_outint_out[0]Return value
+
+ + +
+ +

8.5.18 pdlg_validate_settings

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Print dialog - Validate settings« - Validates the printer +settings. +
  +
Opcode: 205 (sub-opcode 8) +
  +
Syntax: int16_t pdlg_validate_settings ( PRN_DIALOG *prn_dialog, +PRN_SETTINGS *settings ); +
  +
Description: The call pdlg_validate_settings validates the printer settings +that were set with pdlg_new_settings. The following apply: +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
prn_dialogPointer to management structure
settingsPrinter settings
+
+ +
Note: Faulty structure contents will be corrected by the +function if necessary. +
  +
Return value: The function returns the value 1 if it operates correctly, else +the value 0 in case of error. +
  +
Availability: The presence of this function can be checked with appl_getinfo +(opcode 7). +
  +
Group: Print dialogs +
  +
See also: Binding   WDIALOG +
  + +
+ +

8.5.18.1 Bindings for pdlg_validate_settings

+ + + + + + + + + +
C: int16_t pdlg_validate_settings ( PRN_DIALOG *prn_dialog, +PRN_SETTINGS *settings ); +
  +
Binding: +
  +
int16_t pdlg_validate_settings ( PRN_DIALOG *prn_dialog,
+                                 PRN_SETTINGS *settings )
+{
+   addr_in[0] = prn_dialog;
+   addr_in[1] = settings;
+
+   int_in[0] = 8;
+   crys_if (205);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]205 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]prn_dialog
addr_in+4addr_in[1]settings
int_inint_in[0]8 # Sub-opcode
int_outint_out[0]Return value
+
+ + +
+ +

8.5.19 Print selection in a window

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Program start:   +
. pdlg_create() +
.   +
Calling the print dialog: pdlg_open() +
.   +
Event loop: pdlg_evnt() +
.   +
Closing of the print dialog: pdlg_close() +
.   +
. pdlg_delete() +
Program end:   + +
+ +

8.5.20 Print selection as a dialog

+ + + + + + + + + + + + + + + + + + + + + +
Program start:   +
. pdlg_create() +
.   +
Calling the print dialog: pdlg_do() +
.   +
. pdlg_delete() +
Program end:   + +
+ +
+ +Home +AESAES +File-selector libraryFile-selector library +Editable object functionsEditable object functions + + diff --git a/en/pmmu.html b/en/pmmu.html new file mode 100644 index 000000000..817859cf0 --- /dev/null +++ b/en/pmmu.html @@ -0,0 +1,80 @@ + + + + + +The documentation for TOS: The PMMU functions-handler + + + + + + + + + +Home +Contents +Declaration of sourcesDeclaration of sources +ClearPageModeClearPageMode + +
+ +

F The PMMU functions-handler

+

The Paged Memory Management Unit +functions-handler can be reached via the PMMU-Cookie, and is created by +programs such as Outside or VRAM that can swap blocks +of memory to and from a hard drive when insufficient RAM is available +for a given task. These memory blocks will then lie in so-called +'virtual RAM' divided into 'pages' on the drive. +

+

The handler can only be called in supervisor-mode, and works via +a function number that is stored in data register d0. Possible return +values will be found in this register as well. Other processor +registers are not altered. +

+

The following functions are available at present: +

+ + +

Important note: These functions only have meaning for a +few programs in the region of system software, an have no +place in user programs. +

+

See also: Super   Supexec +

+ +
+
+ +Home +Contents +Declaration of sourcesDeclaration of sources +ClearPageModeClearPageMode + + diff --git a/en/pmmu_ClearPageMode.html b/en/pmmu_ClearPageMode.html new file mode 100644 index 000000000..16e0ad93a --- /dev/null +++ b/en/pmmu_ClearPageMode.html @@ -0,0 +1,99 @@ + + + + + +The documentation for TOS: ClearPageMode + + + + + + + + + +Home +The PMMU functions-handlerThe PMMU functions-handler +The PMMU functions-handlerThe PMMU functions-handler +GetHdv_inuseGetHdv_inuse + +
+ +

F.1 ClearPageMode

+ + + + + + + + + + + + + + + + + + + + + +
Name: »ClearPageMode« - Clear PMMU mode for a memory block. +
  +
Number: 2 +
  +
Declaration: ULONG ClearPageMode ( ULONG mode, ULONG start_address, ULONG +length ); +
  +
Description: The call ClearPagemode clears the PMMU mode for a given block +of memory. The following apply: +
  +

+
+ + + + + + + + + + + + + + + + +
ParameterMeaning
modeBit-vector as in SetPageMode
start_addressStart address of memory segment
lengthLength of desired segment
+
+ +
Note: All other bits are reserved for future purposes. A +program may only clear those bits that it has set itself previously. +
  +
Return value: The function returns zero on error-free execution. Otherwise a +value is returned in which the bits that could not be manipulated are +set. +
  +
Group: PMMU functions-handler +
  +
See also: GetHdv_inuse   GetPageSize   pmem_size   PMMUversion   +SetPageMode   vmem_size +
  + +
+ +
+ +Home +The PMMU functions-handlerThe PMMU functions-handler +The PMMU functions-handlerThe PMMU functions-handler +GetHdv_inuseGetHdv_inuse + + diff --git a/en/pmmu_GetHdv_inuse.html b/en/pmmu_GetHdv_inuse.html new file mode 100644 index 000000000..f6e563a6e --- /dev/null +++ b/en/pmmu_GetHdv_inuse.html @@ -0,0 +1,79 @@ + + + + + +The documentation for TOS: GetHdv_inuse + + + + + + + + + +Home +The PMMU functions-handlerThe PMMU functions-handler +ClearPageModeClearPageMode +GetPageSizeGetPageSize + +
+ +

F.2 GetHdv_inuse

+ + + + + + + + + + + + + + + + + + + + + +
Name: »GetHdv_inuse« - Obtain the activity of the hard disk driver. +
  +
Number: 4 +
  +
Declaration: UWORD *GetHdv_inuse ( VOID ); +
  +
Description: The call GetHdv_inuse enables one to check whether the hard +disk driver is currently in the process of swapping a page from or to +RAM. +
  +
Note: A check of this WORD must be made before +the virtual RAM is accessed from an interrupt routine. This is because +the hard disk driver may not be interrupted by an access to a +non-existing memory page if it is currently offloading another page. +If the status WORD is non-zero, the access has to be delayed. +
  +
Return value: The function returns a pointer to the hdv_inuse WORD. +
  +
Group: PMMU functions-handler +
  +
See also: ClearPageMode   GetPageSize   pmem_size   PMMUversion   +SetPageMode   vmem_size +
  + +
+ +
+ +Home +The PMMU functions-handlerThe PMMU functions-handler +ClearPageModeClearPageMode +GetPageSizeGetPageSize + + diff --git a/en/pmmu_GetPageSize.html b/en/pmmu_GetPageSize.html new file mode 100644 index 000000000..1f6563b5f --- /dev/null +++ b/en/pmmu_GetPageSize.html @@ -0,0 +1,74 @@ + + + + + +The documentation for TOS: GetPageSize + + + + + + + + + +Home +The PMMU functions-handlerThe PMMU functions-handler +GetHdv_inuseGetHdv_inuse +pmem_sizepmem_size + +
+ +

F.3 GetPageSize

+ + + + + + + + + + + + + + + + + + + + + +
Name: »GetPageSize« - Obtain size of a memory page. +
  +
Number: 3 +
  +
Declaration: ULONG GetPageSize ( VOID ); +
  +
Description: The call GetPageSize obtains the current size of a memory page. +
  +
Note: With a MC-68030 the size can lie between 256 bytes +and 32 kbytes. +
  +
Return value: The function returns the size of a memory page. +
  +
Group: +
  +
See also: ClearPageMode   GetHdv_inuse   pmem_size   PMMUversion   +SetPageMode   vmem_size +
  + +
+ +
+ +Home +The PMMU functions-handlerThe PMMU functions-handler +GetHdv_inuseGetHdv_inuse +pmem_sizepmem_size + + diff --git a/en/pmmu_PMMUversion.html b/en/pmmu_PMMUversion.html new file mode 100644 index 000000000..d0dbaeead --- /dev/null +++ b/en/pmmu_PMMUversion.html @@ -0,0 +1,74 @@ + + + + + +The documentation for TOS: PMMUversion + + + + + + + + + +Home +The PMMU functions-handlerThe PMMU functions-handler +pmem_sizepmem_size +SetPageModeSetPageMode + +
+ +

F.5 PMMUversion

+ + + + + + + + + + + + + + + + + + + + + +
Name: »PMMUversion« - Obtains the version number of the handler. +
  +
Number: 0 +
  +
Declaration: UWORD PMMUversion ( VOID ); +
  +
Description: The call PMMUversion obtains the version number of the PMMU +handler. Here the bits 8..15 store the version, and the bits 0..7 the +revision. A value of 0x102 thus represents Version 1.02. +
  +
Return value: The function returns the version number of the handler in the +above-mentioned format. +
  +
Group: PMMU functions-handler +
  +
See also: ClearPageMode   GetHdv_inuse   GetPageSize   pmem_size   +SetPageMode   vmem_size +
  + +
+ +
+ +Home +The PMMU functions-handlerThe PMMU functions-handler +pmem_sizepmem_size +SetPageModeSetPageMode + + diff --git a/en/pmmu_SetPageMode.html b/en/pmmu_SetPageMode.html new file mode 100644 index 000000000..85bae5ec7 --- /dev/null +++ b/en/pmmu_SetPageMode.html @@ -0,0 +1,142 @@ + + + + + +The documentation for TOS: SetPageMode + + + + + + + + + +Home +The PMMU functions-handlerThe PMMU functions-handler +PMMUversionPMMUversion +vmem_sizevmem_size + +
+ +

F.6 SetPageMode

+ + + + + + + + + + + + + + + + + + + + + +
Name: »SetPageMode« - Set PMMU mode for a memory block. +
  +
Number: 1 +
  +
Declaration: ULONG SetPageMode ( ULONG mode, ULONG start_address, ULONG +length ); +
  +
Description: The call SetPageMode sets the PMMU mode for a given block of +memory. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
mode Mode as a bit-vector + + + + + + + + + + + + + + + +
Bit 0 = SwapInhibit +
The memory block will not be offloaded +
Bit 1 = WriteProtect +
The memory block will be write-protected; attempts to write to it +lead to a bus error +
Bit 2 = Used +
The memory block is marked as being in use; by this it temporarily +gets a higher priority and is not offloaded at first +
Bit 3 = Modified +
The memory block is marked as having been modified; due to this +the block is written to disk in any case before new data are read into +its ophysical address +
Bit 4 = CacheInhibit +
The processor caches are switched off for the specified block + +
+ +
start_address Start address of memory block +
length Length of the desired block + +
+ +
Note: The remaining bits are reserved and must be set to +zero. For the virtual memory management the SwapInhibit bit is the +most meaningful one, since it offers the possibility of protecting +given memory blocks from being offloaded to disk. +
  +
With write-protection of memory blocks it is imperative to note +that the memory is subdivided into pages, which form the smallest unit +that can be write-protected. One has to ensure that the +write-protection does not extend to a block that must not be +protected, because it does not belong to the program in question, for +instance. +
  +
Return value: The function returns zero on error-free execution. Otherwise a +value is returned in which the bits that could not be manipulated are +set. +
  +
Group: PMMU functions-handler +
  +
See also: ClearPageMode   GetHdv_inuse   GetPageSize   pmem_size   +PMMUversion   vmem_size +
  + +
+ +
+ +Home +The PMMU functions-handlerThe PMMU functions-handler +PMMUversionPMMUversion +vmem_sizevmem_size + + diff --git a/en/pmmu_pmem_size.html b/en/pmmu_pmem_size.html new file mode 100644 index 000000000..9d498a4cb --- /dev/null +++ b/en/pmmu_pmem_size.html @@ -0,0 +1,76 @@ + + + + + +The documentation for TOS: pmem_size + + + + + + + + + +Home +The PMMU functions-handlerThe PMMU functions-handler +GetPageSizeGetPageSize +PMMUversionPMMUversion + +
+ +

F.4 pmem_size

+ + + + + + + + + + + + + + + + + + + + + +
Name: »pmem_size« - Obtain total size of the physical memory +handled by the memory manager. +
  +
Number: 6 +
  +
Declaration: ULONG pmem_size ( VOID ); +
  +
Description: The call pmem_size obtains the total size of the physical +memory that is being handled by the memory manager. +
  +
Note: This function is only available as of Version 1.01 +of the PMMU cookie. +
  +
Return value: The function returns the named size. +
  +
Group: PMMU functions-handler +
  +
See also: ClearPageMode   GetHdv_inuse   GetPageSize   PMMUversion   +SetPageMode   vmem_size +
  + +
+ +
+ +Home +The PMMU functions-handlerThe PMMU functions-handler +GetPageSizeGetPageSize +PMMUversionPMMUversion + + diff --git a/en/pmmu_vmem_size.html b/en/pmmu_vmem_size.html new file mode 100644 index 000000000..a95438390 --- /dev/null +++ b/en/pmmu_vmem_size.html @@ -0,0 +1,72 @@ + + + + + +The documentation for TOS: vmem_size + + + + + + + + + +Home +The PMMU functions-handlerThe PMMU functions-handler +SetPageModeSetPageMode +TOS listTOS list + +
+ +

F.7 vmem_size

+ + + + + + + + + + + + + + + + + + + + + +
Name: »vmem_size« - Inquire total size of the virtual memory. +
  +
Number: 5 +
  +
Declaration: ULONG vmem_size ( VOID ); +
  +
Description: The call vmem_size obtains the total size of the virtual +memory. +
  +
Return value: The function returns the named size. +
  +
Group: PMMU functions-handler +
  +
See also: ClearPageMode   GetHdv_inuse   GetPageSize   pmem_size   +PMMUversion   SetPageMode +
  + +
+ +
+ +Home +The PMMU functions-handlerThe PMMU functions-handler +SetPageModeSetPageMode +TOS listTOS list + + diff --git a/en/powerdos.html b/en/powerdos.html new file mode 100644 index 000000000..21da3d3ec --- /dev/null +++ b/en/powerdos.html @@ -0,0 +1,334 @@ + + + + + +The documentation for TOS: PowerDOS + + + + + + + + + +Home +GEMDOSGEMDOS +NAP BioNet100NAP BioNet100 +TekBiosTekBios + +
+ +

5.21 PowerDOS

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

PowerDOS is a GEMDOS extension for preemptive multitasking. +

+

For more information, see the PowerDOS Programmer's Manual. +

+

New modes for Pexec provide multitasking and threads support: +

+ + + + + + + + + + + + + + + + + + +
mode Meaning +
    +
0x10 Like mode 0, except that the parent continues to operate +concurrently with the newly created child task. +
0x16 Like mode 6, except that the parent continues to operate +concurrently with the newly created child task. +
0x17 Execute a code fragment that is within the text segment of the +calling process. +
0x18 Like mode 0x17, except that it allows a number of INTs to be +placed on the stack of the new task. + +
+ +

PowerDOS adds the function Flock and the cookie _FLK conforming +to the specification for GEMDOS File Sharing & Record Locking. +

+

The following list is a synopsis of the PowerDOS routines, +sorted by function numbers: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
128 Puserid Get or set Group.User ID of a process +
Syntax: int32_t Puserid(int16_t process_id, int16_t flag, int32_t +new_group_user) +
  +
129 Ppriority Set or get the priority of given process +
Syntax: int32_t Ppriority(int16_t process_id, int16_t +new_priority) +
  +
130 Pgetpid Get current process' process ID +
Syntax: int16_t Pgetpid() +
  +
131 Pgetppid Get current process' parent's process ID +
Syntax: int32_t Pgetppid() +
  +
132 Pgetpd Return pointer to process descriptor of given +process +
Syntax: void *Pgetpd(int16_t process_id) +
  +
133 Pfindpid Find the process ID of a process with the +given name +
Syntax: int32_t Pfindpid(int8_t *process_name) +
  +
134 Pprocinf Return information about process +
Syntax: int32_t Pprocinf(int16_t process_id, struct PROCINFO +*buffer) +
  +
135 Pnice Change process priority using delta +
Syntax: int32_t Pnice(int16_t process_id, int16_t delta) +
  +
136 Smalloc Allocate a block of system memory (top down) +
Syntax: char *Smalloc(int32_t mem_size) +
  +
137 Massign Assign a block of memory owned by calling +process to process of given process ID +
Syntax: int32_t Massign(int16_t process_id, int8_t *mem_start) +
  +
139 Fstatus Perform various status operations on an open +file +
Syntax: int32_t Fstatus(int16_t handle, int16_t sub_function, ...) +
  +
140 Fsfirstidx Perform Fsfirst function with index into +directory structure +
Syntax: int32_t Fsfirstidx(int8_t *pathname, int16_t attributes, +int16_t index) +
  +
141 Wake_parent Wake parent process of current process +
Syntax: int32_t Wake_parent(int16_t code) +
  +
142 Wait Wait for child process to terminate +
Syntax: int32_t Wait() +
  +
143 Sleep Sleep (block) for specified time, or indefinately +
Syntax: int32_t Sleep(int32_t time) +
  +
144 Ioqueue Link to queue of processes waiting for access +I/O +
Syntax: int32_t Ioqueue(int16_t process_id, int32_t time) +
  +
145 Wait_dt Wait (block) until a specified date/time +
Syntax: int32_t Wait_dt(uint32_t date_time) +
  +
146 Dev_create Create a new I/O device +
Syntax: int32_t Dev_create(int8_t *dev_name, int8_t *fm_name, +int8_t *drv_name, int8_t *path_vars, int8_t *dev_vars, int16_t share) +
  +
147 Fm_add Add a new file manager to the system +
Syntax: int32_t Fm_add(int8_t *fm_name, int8_t *subroutine_tab, +int8_t *fm_vars, int16_t fm_type) +
  +
148 Drv_add Add a new device driver to the system, or +replace an old one +
Syntax: int32_t Drv_add(int8_t *drv_name, int8_t *subroutine_tab, +int8_t *drv_vars) +
  +
149 Devinfo Return device info for requested device index +
Syntax: int32_t Devinfo(int16_t idx, struct dev_info *buffer) +
  +
150 Send Send a signal to a process +
Syntax: int32_t Send(int16_t process_id, int32_t signal_code) +
  +
151 Sig_intercept Install signal intercept routine +
Syntax: int32_t Sig_intercept(int16_t (*intercept_rtn)(int32_t, +void*), int32_t *var_ptr) +
  +
152 Suspend Suspend a process +
Syntax: int32_t Suspend(int16_t process_id) +
  +
153 Q_message The Message Queue +
Syntax: int16_t Q_message(struct mq_params *mqparams) +
  +
154 Semaphore The Semaphore function +
Syntax: int16_t Semaphore(struct s_params *sparams) +
  +
155 Mem_share Shared memory +
Syntax: int16_t Mem_share(struct ms_params *msparams) +
  +
158 Chgvector Read or modify a GEMDOS, BIOS or XBIOS +function vector +
Syntax: int32_t Chgvector(int16_t trap_num, int16_t vector_num, +int8_t *new_vector) +
  +
159 Chgsysvar Read or modify a PowerDOS internal variable +
Syntax: int32_t Chgsysvar(int16_t var_num, int16_t flag, int32_t +new_value) +
  +
160 Pname Read or modify the name of a process +
Syntax: int32_t Pname(int16_t proc_id, int16_t get_set, int8_t +*name) +
  +
161 Pvector Read or modify a process' user vector +
Syntax: int32_t Pvector(int16_t proc_id, int32_t vector) +
  +
162 Pattrib Set or clear bits in a process' attribute byte +
Syntax: int32_t Pattrib(int16_t proc_id, unsigned char flag, +unsigned char mask) +
  +
163 Pmaxmem Set or get the maximum memory returned for +Malloc(-1) for a process +
Syntax: int32_t Pmaxmem(int16_t proc_id, int16_t flag, int32_t +size) +
  + +
+ +

See also: GEMDOS   BIOS function list   XBIOS function list   Cookie PDOS   +Cookie _FLK +

+
+ +Home +GEMDOSGEMDOS +NAP BioNet100NAP BioNet100 +TekBiosTekBios + + diff --git a/en/proc.html b/en/proc.html new file mode 100644 index 000000000..ea4386f13 --- /dev/null +++ b/en/proc.html @@ -0,0 +1,1392 @@ + + + + + +The documentation for TOS: Process library + + + + + + + + + +Home +AESAES +Object libraryObject library +Property libraryProperty library + +
+ +

8.19 Process library

+

This library is only available on GEM XM. These functions allow +to run up to 10 GEM and DOS applications at once, swapping out to +eXpanded Memory (XM) or to disk. Each process uses a +'channel' to store its system area, work area, interrupt table and +swap file. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
proc_create Create a new process +
proc_delete Close all desk accessories +
proc_info Obtain info about a process +
proc_malloc Allocate memory +
proc_mfree Release memory +
proc_run Run process +
proc_setblock Shrink channel and create swap file +
proc_shrink Shrink channel with optional swap creation +
proc_switch Switch to process + +
+ +

8.19.1 proc_create

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Process create« - Create a new process +
  +
Opcode: 60 +
  +
Syntax: int16_t proc_create ( void *address, int32_t size, int16_t +is_swap, int16_t is_gem, int16_t *num ); +
  +
Description: The call proc_create allocates a new process ID but does not +launch the process. The following apply: +
  + + + + + + + + + + + + + + + +
address Channel address at which to load process +
size Space to allocate, or 0 to allocate maximum channel space +
is_swap Nonzero if the process can be swapped out, zero if it must stay +paged in. The GEM XM Desktop marks accessories as not to be paged out +
is_gem Nonzero if the process is a GEM application, zero for DOS +application +
num Process ID of new process + +
+ +
Note: Since GEM XM doesn't support having more than one +newly-launched process waiting around, the process with ID num +must be launched through proc_run before calling proc_create again. +
  +
Return value: An error has arisen only if the value 0 is returned (no more ID +available). +
  +
Availability: This function is only available under GEM XM and FreeGEM/XM. +
  +
Group: Process library +
  +
See also: Binding   proc_info   proc_run   proc_switch +
  + +
+ +

8.19.1.1 Bindings for proc_create

+ + + + + + + + + +
C: int16_t proc_create ( void *address, int32_t size, int16_t +is_swap, int16_t is_gem, int16_t *num ); +
  +
Binding: +
  +
int16_t proc_create (void *address, int32_t size, int16_t is_swap,
+                 int16_t is_gem, int16_t *num)
+{
+   int_in[0]  = is_swap;
+   int_in[1]  = is_gem;
+   addr_in[0] = address;
+   addr_in[1] = size;
+
+   crys_if(60);
+
+   *num = int_out[1];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]60 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]2 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]is_swap
int_in+2int_in[1]is_gem
addr_inaddr_in[0]address
addr_in+4addr_in[1]size
int_outint_out[0]Return value
int_out+2int_out[1]num
+
+ + +
+ +

8.19.2 proc_delete

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Process delete« - Close all desk accessories +
  +
Opcode: 62 +
  +
Syntax: int16_t proc_delete ( int16_t pr_deid ); +
  +
Description: The call proc_delete shuts down all desk accessories. The +pr_deid parameter is ignored, but Desktop uses -1. +
  +
Return value: Return value of the function is unknown at present. +
  +
Availability: The function is only available under GEM XM and FreeGEM/XM. +
  +
Group: Process library +
  +
See also: Binding +
  + +
+ +

8.19.2.1 Bindings for proc_delete

+ + + + + + + + + +
C: int16_t proc_delete ( int16_t pr_deid ); +
  +
Binding: +
  +
int16_t proc_delete (int16_t pr_deid)
+{
+   int_in[0]  = pr_deid;
+   return ( crys_if(62) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]62 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]pr_deid
int_outint_out[0]Return value
+
+ + +
+ +

8.19.3 proc_info

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Process information« - Obtains information about a process +
  +
Opcode: 63 +
  +
Syntax: int16_t proc_info ( int16_t pid, int16_t *is_swap, int16_t +*is_gem, void **address, int32_t *csize, void **endmem, int32_t +*ssize, void **intaddr ); +
  +
Description: The call proc_info inquires information about a process. The +following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
pid Process ID about which to get info +
is_swap Nonzero if swappable, else zero +
is_gem Nonzero for a GEM application, zero for a DOS application +
address Address of channel +
csize Size of channel +
endmem First address beyond end of process memory +
ssize Channel system size +
intaddr Address of process's copy of the interrupt vector table + +
+ +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: The function is only available under GEM XM and FreeGEM/XM. +
  +
Group: Process library +
  +
See also: Binding   proc_create   proc_run   proc_switch +
  + +
+ +

8.19.3.1 Bindings for proc_info

+ + + + + + + + + +
C: int16_t proc_info ( int16_t pid, int16_t *is_swap, int16_t +*is_gem, void **address, int32_t *csize, void **endmem, int32_t +*ssize, void **intaddr ); +
  +
Binding: +
  +
int16_t proc_info (int16_t pid, int16_t *is_swap, int16_t *is_gem,
+              void **address, int32_t *csize, void **endmem,
+              int32_t *ssize, void **intaddr)
+{
+   int_in[0]  = pid;
+
+   crys_if(63);
+
+   *is_swap  = int_out[1];
+   *is_gem   = int_out[2];
+   *address  = addr_out[0];
+   *csize    = addr_out[1];
+   *endmem   = addr_out[2];
+   *ssize    = addr_out[3];
+   *intaddr  = addr_out[4];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]63 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]3 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]5 # Entry in addr_out
int_inint_in[0]pid
int_outint_out[0]Return value
int_out+2int_out[1]is_swap
int_out+4int_out[2]is_gem
addr_outaddr_out[0]address
addr_out+4addr_out[1]csize
addr_out+8addr_out[2]endmem
addr_out+12addr_out[3]ssize
addr_out+16addr_out[4]intaddr
+
+ + +
+ +

8.19.4 proc_malloc

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Process memory allocation« - Allocate memory +
  +
Opcode: 64 +
  +
Syntax: void *proc_malloc ( int32_t size, int32_t *ret_size ); +
  +
Description: The call proc_malloc allocates a memory block of size +bytes. +
  +
Return value: The function returns a pointer to the allocated memory block, +or 0 if failed. ret_size is filled with either the size of the +allocated memory block, or with the maximum available size. +
  +
Availability: The function is only available under GEM XM and FreeGEM/XM. +
  +
Group: Process library +
  +
See also: Binding   proc_mfree   proc_setblock   proc_shrink +
  + +
+ +

8.19.4.1 Bindings for proc_malloc

+ + + + + + + + + +
C: void *proc_malloc ( int32_t size, int32_t *ret_size ); +
  +
Binding: +
  +
void *proc_malloc (int32_t size, int32_t *ret_size)
+{
+   addr_in[0] = size;
+
+   crys_if(64);
+
+   *ret_size = addr_out[1];
+
+   return ( addr_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]64 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]2 # Entry in addr_out
addr_inaddr_in[0]size
int_outint_out[0]1 if success, or 0 if failure
addr_outaddr_out[0]Return value
addr_out+4addr_out[1]ret_size
+
+ + +
+ +

8.19.5 proc_mfree

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Process memory free« - Release memory +
  +
Opcode: 65 +
  +
Syntax: int16_t proc_mfree ( int16_t pr_mfid ); +
  +
Description: The call proc_mfree deletes the channel associated to the +process ID pr_mfid from memory and disk for reuse. +
  +
Return value: An error has arisen if the value 0 is returned. +
  +
Availability: This function is only available under GEM XM and FreeGEM/XM. +
  +
Group: Process library +
  +
See also: Binding   proc_malloc   proc_setblock   proc_shrink +
  + +
+ +

8.19.5.1 Bindings for proc_mfree

+ + + + + + + + + +
C: int16_t proc_mfree ( int16_t pr_mfid ); +
  +
Binding: +
  +
int16_t proc_mfree (int16_t pr_mfid)
+{
+   int_in[0]  = pr_mfid;
+   return ( crys_if(65) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]65 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]pr_mfid
int_outint_out[0]Return value
+
+ + +
+ +

8.19.6 proc_run

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Process run« - Run a process +
  +
Opcode: 61 +
  +
Syntax: int16_t proc_run ( int16_t pid, int16_t is_graphical, int16_t +options, int8_t *command, int8_t *tail ); +
  +
Description: The call proc_run launches a process previously created with +proc_create. The following apply: +
  + + + + + + + + + + + + + + + +
pid Process ID previously returned by proc_create +
is_graphical Nonzero for a GEM program, zero for a DOS program +
options Special load options: + + + + + + + + + +
3 Program is a desk accessory +
4 If this is a GEM program, its windows remain visible +whichever program is in the foreground; otherwise they are only +visible when the program in question is in the foreground +
-1 If the gl_allwins flag is turned on, then behaves like +type 4. Otherwise behaves as default. GEM provides no option to +turn this flag on programmatically; you have to patch the AES by +writing a nonzero value in the byte that follows the marker 'zyxg' +inside the binary AES file. + +
+ +
command Name of program to run +
tail Command tail to pass to it + +
+ +
Note: The odd range of values passed to the load options +is chosen for compatibility with the isover flag of +shel_write. +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: The function is only available under GEM XM and FreeGEM/XM. +
  +
Group: Process library +
  +
See also: Binding   proc_create   proc_info   proc_switch +
  + +
+ +

8.19.6.1 Bindings for proc_run

+ + + + + + + + + +
C: int16_t proc_run ( int16_t pid, int16_t is_graphical, int16_t +options, int8_t *command, int8_t *tail ); +
  +
Binding: +
  +
int16_t proc_run (int16_t pid, int16_t is_graphical, int16_t options,
+                 int8_t *command, int8_t *tail)
+{
+   int_in[0]  = pid;
+   int_in[1]  = is_graphical;
+   int_in[2]  = options;
+   addr_in[0] = command;
+   addr_in[1] = tail;
+
+   return ( crys_if(61) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]61 # Function opcode
control+2control[1]3 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]pid
int_in+2int_in[1]is_graphical
int_in+4int_in[2]options
addr_inaddr_in[0]command
addr_in+4addr_in[1]tail
int_outint_out[0]Return value
+
+ + +
+ +

8.19.7 proc_setblock

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Process set block« - Shrink channel and create swap file +
  +
Opcode: 67 +
  +
Syntax: int16_t proc_setblock ( int16_t pr_seid ); +
  +
Description: The call proc_setblock reduces the channel size allocated to +the process pr_seid to what it is using now by eliminating its +free memory, and creates the swap file used to page it out. +
  +
Note This function calls proc_shrink(pr_seid, 1, +&dummy, &dummy). The FreeGEM/XM Desktop defines this function +as proc_shrink() with PROC_SHRINK=67 and omit to define a function for +opcode 68. Original sources stated PROC_SETBLOCK=67 (with PID only) +and PROC_SHRINK=68 (with extra parameters), as documented here. +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: The function is only available under GEM XM and FreeGEM/XM. +
  +
Group: Process library +
  +
See also: Binding   proc_malloc   proc_mfree   proc_shrink +
  + +
+ +

8.19.7.1 Bindings for proc_setblock

+ + + + + + + + + +
C: int16_t proc_setblock ( int16_t pr_seid ); +
  +
Binding: +
  +
int16_t proc_setblock (int16_t pr_seid)
+{
+   int_in[0]  = pr_seid;
+   return ( crys_if(67) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]67 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]pr_seid
int_outint_out[0]Return value
+
+ + +
+ +

8.19.8 proc_shrink

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Process shrink« - Shrink channel +
  +
Opcode: 68 +
  +
Syntax: int16_t proc_shrink ( int16_t pr_shid, int16_t createswap, void +*address, int32_t *size ); +
  +
Description: The call proc_shrink reduces the size of the channel allocated +to the process pr_shid to what it is using now by eliminating +its free memory, and optionally creates the swap file used to page it +out if createswap is set to 1. +
  +
Note: This function is not used by FreeGEM/XM Desktop. +On this environment, the function with opcode 67 is called proc_shrink +and there is no binding for opcode 68. +
  +
Return value: An error has arisen only if the value 0 is returned. On +success, this function returns the new size and +address of the channel. +
  +
Availability: The function is only available under GEM XM. +
  +
Group: Process library +
  +
See also: Binding   proc_malloc   proc_mfree   proc_setblock +
  + +
+ +

8.19.8.1 Bindings for proc_shrink

+ + + + + + + + + +
C: int16_t proc_shrink ( int16_t pr_shid, int16_t createswap, void +*address, int32_t *size ); +
  +
Binding: +
  +
int16_t proc_shrink (int16_t pr_shid, int16_t createswap, void *address, int32_t *size)
+{
+   int_in[0]  = pr_shid;
+   int_in[1]  = createswap;
+
+   crys_if(68);
+
+   *address = addr_out[0];
+   *size    = addr_out[1];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]68 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]2 # Entry in addr_out
int_inint_in[0]pr_shid
int_in+2int_in[1]createswap
int_outint_out[0]Return value
addr_outaddr_out[0]address
addr_out+4addr_out[1]size
+
+ + +
+ +

8.19.9 proc_switch

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Process switch« - Switch to process +
  +
Opcode: 66 +
  +
Syntax: int16_t proc_switch ( int16_t pr_swid ); +
  +
Description: The call proc_switch switches to process with the ID +pr_swid. +
  +
Return value: Returns 0 if process is already the active process, else 1. +
  +
Availability: This function is only available under GEM XM and FreeGEM/XM. +
  +
Group: Process library +
  +
See also: Binding   proc_create   proc_info   proc_run +
  + +
+ +

8.19.9.1 Bindings for proc_switch

+ + + + + + + + + +
C: int16_t proc_switch ( int16_t pr_swid ); +
  +
Binding: +
  +
int16_t proc_switch (int16_t pr_swid)
+{
+   int_in[0]  = pr_swid;
+   return ( crys_if(66) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]66 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]pr_swid
int_outint_out[0]Return value
+
+ + +
+ +
+ +Home +AESAES +Object libraryObject library +Property libraryProperty library + + diff --git a/en/prop.html b/en/prop.html new file mode 100644 index 000000000..8c220b75c --- /dev/null +++ b/en/prop.html @@ -0,0 +1,971 @@ + + + + + +The documentation for TOS: Property library + + + + + + + + + +Home +AESAES +Process libraryProcess library +Resource libraryResource library + +
+ +

8.20 Property library

+

This library contains special functions, which are only +available on FreeGEM. +

+ + + + + + + + + + + + + + + +
prop_del Deletes a setting from global properties file +
prop_get Gets settings from global properties file +
prop_gui_get Obtains GUI options +
prop_gui_set Sets GUI options +
prop_put Saves setting to global properties file + +
+ +

See also: About the AES +

+

8.20.1 prop_del

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Property delete« - Delete setting from the GEM +configuration file. +
  +
Opcode: 1012 +
  +
Syntax: int16_t prop_del ( int8_t *program, int8_t *section, int16_t +options ); +
  +
Description: The call prop_del serves for deleting settings from the global +settings file of the AES. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
program Name that identifies the program. It should be formed of one or +more words separated by dots - for example, the DEMO sample uses +"PTK.DEMO". +
section Name of the field to delete. Again, this should be one or more +words separated by dots. DEMO uses "Pen.shade", +"Pen.colour" and "Pen.size". +
options Current user (0) or all users (1). Use 0 if possible although +multiple user profiles is not yet supported. + +
+ +
Return value:  0 = Property delete successfully +
 1 = Property was not found +
-1 = File I/O error +
+
  +
Availability: This call is a compile-time option in recent FreeGEM versions. +To check for this feature, use appl_init(xbuf) and check that bit 1 of +xbuf.abilities is set (ABLE_PROP). +
  +
Group: Property library +
  +
See also: Binding   prop_get   prop_put +
  + +
+ +

8.20.1.1 Bindings for prop_del

+ + + + + + + + + +
C: int16_t prop_del ( int8_t *program, int8_t *section, int16_t +options ); +
  +
Binding: +
  +
int16_t prop_del (int8_t *program, int8_t *section, int16_t options )
+{
+   int_in[0]  = options;
+   addr_in[0] = program;
+   addr_in[1] = section;
+
+   return ( crys_if(1012) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]1012 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]options
addr_inaddr_in[0]program
addr_in+4addr_in[1]section
int_outint_out[0]Return value
+
+ + +
+ +

8.20.2 prop_get

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Property get« - Read setting from the GEM configuration +file. +
  +
Opcode: 1010 +
  +
Syntax: int16_t prop_get ( int8_t *program, int8_t *section, int8_t +*buffer, int16_t buflen, int16_t options ); +
  +
Description: The call prop_get serves for reading settings from the global +settings file of the AES. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
program Name that identifies the program. It should be formed of one or +more words separated by dots - for example, the DEMO sample uses +"PTK.DEMO". +
section Name of the field to retrieve. Again, this should be one or +more words separated by dots. DEMO uses "Pen.shade", +"Pen.colour" and "Pen.size". +
buffer Address of the buffer to which the information will be written. +
buflen Size of buffer, including the terminating 0. +
options Current user (0) or all users (1). Use 0 if possible although +multiple user profiles is not yet supported. + +
+ +
Return value:  0 = Property read successfully +
 1 = Property was not found +
-1 = File I/O error +
-2 = Not enough memory +
  +
Availability: This call is a compile-time option in recent FreeGEM versions. +To check for this feature, use appl_init(xbuf) and check that bit 1 of +xbuf.abilities is set (ABLE_PROP). +
  +
Group: Property library +
  +
See also: Binding   prop_del   prop_put +
  + +
+ +

8.20.2.1 Bindings for prop_get

+ + + + + + + + + +
C: int16_t prop_get ( int8_t *program, int8_t *section, int8_t +*buffer, int16_t buflen, int16_t options ); +
  +
Binding: +
  +
int16_t prop_get (int8_t *program, int8_t *section, int8_t *buffer,
+                  int16_t buflen, int16_t options )
+{
+   int_in[0]  = options;
+   int_in[1]  = buflen;
+   addr_in[0] = program;
+   addr_in[1] = section;
+   addr_in[2] = buffer;
+
+   return ( crys_if(1010) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]1010 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]3 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]options
int_in+2int_in[1]buflen
addr_inaddr_in[0]program
addr_in+4addr_in[1]section
addr_in+8addr_in[2]buffer
int_outint_out[0]Return value
+
+ + +
+ +

8.20.3 prop_gui_get

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »GUI options get« - Gets the value of a GUI option. +
  +
Opcode: 1013 +
  +
Syntax: int16_t prop_gui_get ( int16_t option ); +
  +
Description: The call prop_gui_get returns the value of the given option, or +zero if the option is out of range. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + +
option Meaning +
    +
0 Count of available options (currently returns 5; valid values +are 0-4). +
1 3D objects have square corners (0); otherwise rounded corners. +
2 Window frames follow GEM/2 style (0); otherwise GEM/5 +style. +
3 GEM emulation mode: +
+
+ + + + + + + + + + + + + + + +
0-GEM/1
1-Atari GEM
2-FreeGEM
+
+ +
4 Menu flags: +
+
+ + + + + + + + + + +
Bit 0-"Name of Desk" menu is the current program name (0) or "Desk" (1)
Bit 1-"Desk" menu is on the right (0) or on the left (1)
+
+ + +
+ +
Return value: Value of the requested option, or 0 if option is out of range. +
  +
Availability: This call is a compile-time option in recent FreeGEM versions. +To check for this feature, use appl_init(xbuf) and check that bit 5 of +xbuf.abilities is set (ABLE_PROP2). +
  +
Group: Property library +
  +
See also: Binding   prop_gui_set +
  + +
+ +

8.20.3.1 Bindings for prop_gui_get

+ + + + + + + + + +
C: int16_t prop_gui_get ( int16_t option ); +
  +
Binding: +
  +
int16_t prop_gui_get ( int16_t option )
+{
+   int_in[0]  = option;
+
+   return ( crys_if(1013) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]1013 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]option
int_outint_out[0]Return value
+
+ + +
+ +

8.20.4 prop_gui_set

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »GUI options set« - Sets the value of a GUI option. +
  +
Opcode: 1014 +
  +
Syntax: int16_t prop_gui_set ( int16_t option, int16_t value ); +
  +
Description: The call prop_gui_set changes the given option. The following +apply: +
  + + + + + + + + + + + + + + + + + + + + + +
option Meaning +
    +
0 Cannot be set. Return 0. +
1 3D objects: set square corners (0); otherwise rounded corners. +
2 Window frames: set GEM/2 style (0); otherwise GEM/5 style. +Takes effect when a new program is loaded. +
3 Set the GEM emulation mode: +
+
+ + + + + + + + + + + + + + + +
0-GEM/1
1-Atari GEM
2-FreeGEM
+
+ +
Currently, FreeGEM supports only modes 0 and 2 (they are the +same). The variable is set to 0 if the desired mode is not available, +or to the requested mode if it is available. +
4 Set menu flags: +
+
+ + + + + + + + + + +
Bit 0-Name of "Desk" menu is the current program name (0) or "Desk" (1)
Bit 1-"Desk" menu is on the right (0) or on the left (1)
+
+ + +
+ +
Return value: Returns the value used, which may not be the same as the +requested value. +
  +
Availability: This call is a compile-time option in recent FreeGEM versions. +To check for this feature, use appl_init(xbuf) and check that bit 5 of +xbuf.abilities is set (ABLE_PROP2). +
  +
Group: Property library +
  +
See also: Binding   prop_gui_get +
  + +
+ +

8.20.4.1 Bindings for prop_gui_set

+ + + + + + + + + +
C: int16_t prop_gui_set ( int16_t option, int16_t value ); +
  +
Binding: +
  +
int16_t prop_gui_set ( int16_t option, int16_t value )
+{
+   int_in[0]  = option;
+   int_in[1]  = value;
+
+   return ( crys_if(1014) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]1014 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]option
int_in+2int_in[1]value
int_outint_out[0]Return value
+
+ + +
+ +

8.20.5 prop_put

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Property put« - Write setting to the GEM configuration +file. +
  +
Opcode: 1011 +
  +
Syntax: int16_t prop_put ( int8_t *program, int8_t *section, int8_t +*buffer, int16_t options ); +
  +
Description: The call prop_put serves for writing settings to the global +settings file of the AES. The following apply: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
program Name that identifies the program. It should be formed of one or +more words separated by dots - for example, the DEMO sample uses +"PTK.DEMO". Program names starting with "GEM." +should be avoided to avoid a conflict with GEM itself. +
section Name of the field to store. Again, this should be one or more +words separated by dots. DEMO uses "Pen.shade", +"Pen.colour" and "Pen.size". +
buffer Address of the buffer containing the information to write +(NULL-terminated, without carriage returns or linefeeds). +
options Current user (0) or all users (1). Use 0 if possible although +multiple user profiles is not yet supported. + +
+ +
Note: prop_get will remove any leading spaces from +returned values; so to write a string value that may start with +spaces, quotation marks must be added before calling prop_put and the +quotation marks should be removed after the prop_get. +
  +
Return value:  0 = Property write successfully +
-1 = File I/O error +
-2 = Not enough memory +
  +
Availability: This call is a compile-time option in recent FreeGEM versions. +To check for this feature, use appl_init(xbuf) and check that bit 1 of +xbuf.abilities is set (ABLE_PROP). +
  +
Group: Property library +
  +
See also: Binding   prop_del   prop_get +
  + +
+ +

8.20.5.1 Bindings for prop_put

+ + + + + + + + + +
C: int16_t prop_put ( int8_t *program, int8_t *section, int8_t +*buffer, int16_t options ); +
  +
Binding: +
  +
int16_t prop_put (int8_t *program, int8_t *section, int8_t *buffer,
+                  int16_t options )
+{
+   int_in[0]  = options;
+   addr_in[0] = program;
+   addr_in[1] = section;
+   addr_in[2] = buffer;
+
+   return ( crys_if(1011) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]1011 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]3 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]options
addr_inaddr_in[0]program
addr_in+4addr_in[1]section
addr_in+8addr_in[2]buffer
int_outint_out[0]Return value
+
+ + +
+ +
+ +Home +AESAES +Process libraryProcess library +Resource libraryResource library + + diff --git a/en/proto_av.html b/en/proto_av.html new file mode 100644 index 000000000..56210da57 --- /dev/null +++ b/en/proto_av.html @@ -0,0 +1,2780 @@ + + + + + +The documentation for TOS: AV protocol + + + + + + + + + +Home +ProtocolsProtocols +ProtocolsProtocols +BubbleGEMBubbleGEM + +
+ +

15.1 AV protocol

+ + +

The AV protocol (Accessory-Venus) was developed +by Stefan Eissing and used for the first time in the +alternative desktop Gemini. Since then however this protocol +has been supported in many further shells (Ease, Jinnee, MagXDesk, +Thing, ...). +

+

This section describes the version of the protocol from the +Gemini distribution of 29th January 1995 (Gemini 1.a). All references +to 'Venus' in the following can be substituted with 'Client' or +'Server' as appropriate when using other shells. +

+

The communication between two processes takes place with AV +protocol via the exchange of (extended) AES messages, which can be allocated +to one of the following categories: +

+ + +

Warning: Here one must point out that with a view to +future operating system versions, memory blocks used for communication +between various programs, or allocated via pointers, have to be global +(Mxalloc function with Global flag set). Otherwise memory protection +violations would arise on computers with PMMU (e.g. Atari TT030 or +Falcon030). +

+

If paths or filenames are to be included in messages, then one +must always quote the absolute path (i.e. including the drive) +and the drive letters must be in upper case. Paths should +always end with a backslash! +

+

With an AV_PROTOKOLL call, each application can inquire which +messages are unnderstood (not all shells support the complete +protocol). It would be nice if other programs too would react to this +protocol. At least AV_SENDKEY is certainly easy to implement and is the +only method by which keypresses can be simulated via messages. +

+

Under normal TOS, a desk accessory that has received an +AC_CLOSE message from the AES inquires of the application (with ID) +0 via AV_PROTOKOLL whether it has understood this. In a multitasking +environment (MultiTOS, MiNT/N.AES or MagiC) the program need no +longer have the ID 0; besides, there will be (hardly) any AC_CLOSE +messages any more. In addition, not just desk accessories but also +normal programs will want to communicate with the AV-Server. So what +do we do? +

+

If more than one main application can exist, then the program or +the desk accessory should try to extablish contact with GEMINI. After +all, the ID can be obtained with appl_find. If this fails, then one +can still search for AVSERVER or the contents of the (AES) +nnvironmental variable AVSERVER. The latter possibility in particular +permits easy configuration from the outside. The new versions of the +library VAFUNC by Stephan Gerle (available in well-sorted +mailboxes) proceed in almost the same way. +

+

See also: Messages   Drag&Drop protocol   OLGA protocol +

+

15.1.1 Quoting in AV protocol

+ +

Quoting in AV protocol means that filenames can optionally be +enclosed in single quote-marks (e.g. 'name'). However, this is +permitted only if both parties (Server and Client) are of the same +mind, i.e. both understand it. +

+

So why should one want to do this and how does it work? Let us +assume that the Server sends a filename to the application which +contains a space. An application that does not understand +quoting will take this as two filenames having been passed +instead of one, since normally spaces are used to separate filenames. +But if the application does understand quoting (bit 4 in its protocol +status is set), then the Server will enclose the filename with '' and +the application will recognize that the space belongs to the filename. +The same applies for filenames that are sent by an application to a +Server, of course. +

+

The question remains of how one sends single quote-marks. Well, +such characters forming part of the filename are simply doubled up. +So, for instance, Zorro's hypertext will be passed as 'Zorro''s +hypertext'. So in such cases the same method is used as for the +Drag&Drop protocol. +

+

See also: +
AV_PROTOKOLL   VA_ACC_QUOTING(a)   VA_SERVER_QUOTING(a)   +VA_PROTOSTATUS   Drag&Drop protocol +

+

15.1.2 AV functions

+

These messages are sent by an application to Gemini or a +present AV-Server: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AV_ACCWINDCLOSED Application has closed a window +
AV_ACCWINDOPEN Application has opened a window +
AV_ASKCONFONT Obtain the font for the console +
AV_ASKFILEFONT Obtain the font for filenames +
AV_ASKOBJECT Obtain the currently selected object +
AV_COPY_DRAGGED Provide information about a copy action +
AV_COPYFILE Copy/move files or folders +
AV_DELFILE Delete files or folders +
AV_DRAG_ON_WINDOW Provide information about moved objects +
AV_EXIT Unlink from the AV protocol +
AV_FILEINFO Display file or folder information +
AV_GETSTATUS Obtain current status +
AV_OPENCONSOLE Open the console window +
AV_OPENWIND Open a file window +
AV_PATH_UPDATE Contents of a directory was altered +
AV_PROTOKOLL Provide information about supported messages +
AV_SENDCLICK Send mouse event +
AV_SENDKEY Send keyboard event +
AV_SETWINDPOS Set position for directory window +
AV_STARTED Reply to a VA_START message +
AV_STARTPROG Start an application or file +
AV_STATUS Set current status +
AV_VIEW Load a viewer for a given filetype +
AV_WHAT_IZIT Information about position on the screen +
AV_XWIND Open a file windnow + +
+ +

See also: VA functions   Messages +

+

15.1.2.1 AV_ACCWINDCLOSED

+ + + + + + + + + + + + + + + +
Name: »AV_ACCWINDCLOSED« +
  +
Number: 0x4726 +
  +
Description: An application informs the AV-Server that a window has been +closed. This is only necessary if it closed the window itself. If the +window is closed due to an AC_CLOSE message, the Server knows that all +windows are closed. +
  +

+
+ + + + + + + + +
ParameterMeaning
WORD 3AES handle of the window
+
+ +
Group: AV functions +
  +
See also: AV_ACCWINDOPEN   AV protocol +
  + +
+ +

15.1.2.2 AV_ACCWINDOPEN

+ + + + + + + + + + + + + + + +
Name: »AV_ACCWINDOPEN« +
  +
Number: 0x4724 +
  +
Description: This message can be used by an application to inform the +AV-Server about its own (opened) window. +
  +

+
+ + + + + + + + +
ParameterMeaning
WORD 3AES handle of the opened window
+
+ +
Group: AV functions +
  +
See also: AV_ACCWINDCLOSED   AV protocol +
  + +
+ +

15.1.2.3 AV_ASKCONFONT

+ + + + + + + + + + + + + + + +
Name: »AV_ASKCONFONT« +
  +
Number: 0x4714 +
  +
Description: With this message an application asks the AV-Server for the +font currently set for the console window. +
  +
Group: AV functions +
  +
See also: AV_ASKFILEFONT   VA_CONFONT   VA_FILEFONT   AV protocol +
  + +
+ +

15.1.2.4 AV_ASKFILEFONT

+ + + + + + + + + + + + + + + +
Name: »AV_ASKFILEFONT« +
  +
Number: 0x4712 +
  +
Description: Using this message the Client can request the current font used +for filenames in directory windows. +
  +
Group: AV functions +
  +
See also: AV_ASKCONFONT   VA_CONFONT   VA_FILEFONT   AV protocol +
  + +
+ +

15.1.2.5 AV_ASKOBJECT

+ + + + + + + + + + + + + + + +
Name: »AV_ASKOBJECT« +
  +
Number: 0x4716 +
  +
Description: Ask about the currently selected object(s). The name(s) of the +selected object(s) is (are) returned. If no object is selected, the +string is empty. +
  +
If several objects are selected, their names are separated by +spaces. +
  +
Group: AV functions +
  +
See also: VA_OBJECT   AV protocol +
  + +
+ +

15.1.2.6 AV_COPY_DRAGGED

+ + + + + + + + + + + + + + + +
Name: »AV_COPY_DRAGGED« +
  +
Number: 0x4728 +
  +
Description: An application tells the AV-Server that the objects that have +been dragged to its window should be copied. This may be the case, +e.g. if objects are dragged to the TreeView window. +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
WORD 3The keyboard state ([Alternate], [Control], [Shift])
WORD 4+5Pointer to a string which must contain the name of the destination object This HAS to be a pathname!
+
+ +
This message may only be used as reply to a VA_DRAGACCWIND message. +
  +
Group: AV functions +
  +
See also: VA_DRAGACCWIND   AV protocol +
  + +
+ +

15.1.2.7 AV_COPYFILE

+ + + + + + + + + + + + + + + +
Name: »AV_COPYFILE« +
  +
Number: 0x4755 +
  +
Description: This command directs the AV-Server to copy or move certain +file(s) or folder(s). +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
WORD 3+4Pointer to the source file/s and folder/s
WORD 5+6Pointer to the destination folder
WORD 7Various flags:
 Bit 0 = Delete original (= move)
 Bit 1 = Rename copy
 Bit 2 = Overwrite destination without comment
 Bit 3 = Only create symbolic links of
         sources (bit 0 in that case
         has no meaning)
 Bit 4-15 = Reserved, always 0
+
+ +
Note: All further bits are reserved for future purposes. +
  +
Multiple files must be separated by space characters. Folders +must include a trailing backslash '\' character! +
  +
Group: AV functions +
  +
See also: VA_FILECOPIED   AV protocol +
  + +
+ +

15.1.2.8 AV_DELFILE

+ + + + + + + + + + + + + + + +
Name: »AV_DELFILE« +
  +
Number: 0x4757 +
  +
Description: This command directs the AV-Server to delete certain file(s) or +folder(s). +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
WORD 3+4Pointer to the file(s)/folder(s) to be deleted
WORD 5-7Reserved, always 0
+
+ +
Multiple files or folders must be separated by space characters. +Folders must include a trailing backslash '\' character! +
  +
Group: AV functions +
  +
See also: VA_FILEDELETED   AV protocol +
  + +
+ +

15.1.2.9 AV_DRAG_ON_WINDOW

+ + + + + + + + + + + + + + + +
Name: »AV_DRAG_ON_WINDOW« +
  +
Number: 0x4734 +
  +
Description: An application tells the AV-Server that objects have been +dragged onto one of its windows inquired for with AV_WHATIZIT. +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
WORD 3X-position to which the mouse was dragged
WORD 4Y-position to which the mouse was dragged
WORD 5Keyboard state ([Alternate], [Control], [Shift])
WORD 6+7Pointer to a string that contain the names of the objects
+
+ +
The names are the names of files, folders or drives; multiple +names are separated by a space character. Names of folders or drives +must include a trailing backslash '\' character! +
  +
Group: AV functions +
  +
See also: VA_DRAG_COMPLETE   VA_DRAGACCWIND   AV protocol +
  + +
+ +

15.1.2.10 AV_EXIT

+ + + + + + + + + + + + + + + +
Name: »AV_EXIT« +
  +
Number: 0x4736 +
  +
Description: An application tells the AV-Server that it doesn't link into +the protocol any longer. +
  +

+
+ + + + + + + + +
ParameterMeaning
WORD 3AES id of the application
+
+ +
This message must be used, before terminating a program if the +program did use AV_PROTOKOLL! +
  +
Group: AV functions +
  +
See also: appl_init   AV protocol +
  + +
+ +

15.1.2.11 AV_FILEINFO

+ + + + + + + + + + + + + + + +
Name: »AV_FILEINFO« +
  +
Number: 0x4753 +
  +
Description: This command directs the AV-Server to display an information +dialog for a given file or folder. +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
WORD 3+4Pointer to file or folder name
WORD 5-7Reserved, always 0
+
+ +
Multiple files/folders may be separated using space characters. +Folders must include a trailing backslash '\' character! +
  +
Group: AV functions +
  +
See also: VA_FILECHANGED   AV protocol +
  + +
+ +

15.1.2.12 AV_GETSTATUS

+ + + + + + + + + + + + + + + +
Name: »AV_GETSTATUS« +
  +
Number: 0x4703 +
  +
Description: An accessory asks Venus for the current status that it has +given to Venus via the AV_STATUS message. +
  +
Group: AV functions +
  +
See also: AV_STATUS   AV protocol +
  + +
+ +

15.1.2.13 AV_OPENCONSOLE

+ + + + + + + + + + + + + + + +
Name: »AV_OPENCONSOLE« +
  +
Number: 0x4718 +
  +
Description: Venus should open the console window. If it is open already, it +will be topped. This action is of use if a desk accessory is about to +launch a TOS program using the system function. +
  +
Note: No GEM programs should be started by an +accessory via the system function! The message should only be +used if the user explicitly wants to, as otherwise it can quickly lead +to confusion. +
  +
This message is only available in Gemini at present. +
  +
Group: AV functions +
  +
See also: AV_OPENWIND   AV_XWIND   VA_CONSOLEOPEN   VA_XOPEN   +VA_WINDOPEN   AV_STARTPROG +
  + +
+ +

15.1.2.14 AV_OPENWIND

+ + + + + + + + + + + + + + + +
Name: »AV_OPENWIND« +
  +
Number: 0x4720 +
  +
Description: An application directs the AV-Server to open a file window. +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
WORD 3+4Pointer to the path for the window
WORD 5+6Pointer to a string containing the wildcards for the files which should be displayed
+
+ +
Note: This message should only be used when the reason +is clearly evident to the user. +
  +
Group: AV functions +
  +
See also: AV_OPENCONSOLE   AV_XWIND   VA_CONSOLEOPEN   VA_WINDOPEN   +VA_XOPEN +
  + +
+ +

15.1.2.15 AV_PATH_UPDATE

+ + + + + + + + + + + + + + + +
Name: »AV_PATH_UPDATE« +
  +
Number: 0x4730 +
  +
Description: A program/accessory tells the AV-Server that the contents of a +folder has been changed. The AV-Server redraws this folder if it is +displayed in a window, even if subdirectories are shown. +
  +

+
+ + + + + + + + +
ParameterMeaning
WORD 3+4Pointer to the complete (!) pathname
+
+ +
The update of "C:\" for example results in +redisplaying everything on drive C:. +
  +
Group: AV functions +
  +
See also: AV_OPENWIND   AV_XWIND   AV protocol +
  + +
+ +

15.1.2.16 AV_PROTOKOLL

+ + + + + + + + + + + + + + + +
Name: »AV_PROTOKOLL« +
  +
Number: 0x4700 +
  +
Description: This message should be used to ask an application or the +AV-Server whether or which messages are supported. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
WORD 3Bit 0 = VA_SETSTATUS
 Bit 1 = VA_START
 Bit 2 = AV_STARTED
 Bit 3 = VA_FONTCHANGED
 Bit 4 = Provides & uses filename quoting
 Bit 5 = VA_PATH_UPDATE
 Bit 6-15 = Reserved, always 0
WORD 4+5Reserved, always 0
WORD 6+7A pointer to the name of the desk
 accessory/application for use with
 appl_find (aligned to 8 characters
 and terminated by a '\0' byte).
+
+ +
Group: AV functions +
  +
See also: AV_STARTED   VA_FONTCHANGED   VA_SETSTATUS   VA_START +
  + +
+ +

15.1.2.17 AV_SENDCLICK

+ + + + + + + + + + + + + + + +
Name: »AV_SENDCLICK« +
  +
Number: 0x4709 +
  +
Description: An application sends a mouse event to the AV-Server. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
WORD 3ev_mmox
WORD 4ev_mmoy
WORD 5ev_mmobutton
WORD 6ev_mmokstate
WORD 7ev_mbreturn
+
+ +
Group: AV functions +
  +
See also: evnt_button   evnt_multi +
  + +
+ +

15.1.2.18 AV_SENDKEY

+ + + + + + + + + + + + + + + +
Name: »AV_SENDKEY« +
  +
Number: 0x4710 +
  +
Description: Using this message a Client can send the AV-Server any key +events it may not use for itself. +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
WORD 3Keyboard state (ev_mmokstate)
WORD 4Scan code of the pressed key (ev_mkreturn)
+
+ +
As an unofficial extension ('CodeAlpha') there is a concept that +allows ASCII characters for which no scancode exists to be passed as +well. For this one passes 0 for the scancode, the desired ASCII value +and in msg[5] the value $5048 (the latter to indicate that msg[4] is +indeed valid and that no conversion via the scancode tables is +required. +
  +
This message should always be supported If possible, as with its +help trans-application window cycling can be realised, for instance. +
  +
Group: AV functions +
  +
See also: evnt_keybd   evnt_multi   Scancode table +
  + +
+ +

15.1.2.19 AV_SETWINDPOS

+ + + + + + + + + + + + + + + +
Name: »AV_SETWINDPOS« +
  +
Number: 0x4759 +
  +
Description: With this the Client can be informed of the position and size +of the next directory window to be opened by the AV-Server (with +AV_XWIND or AV_OPENWIND). +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
WORD 3X-position
WORD 4Y-position
WORD 5Width of window
WORD 6Height of window
WORD 7Reserved, always 0
+
+ +
The coordinates are given in absolute coordinates. If +AV_XWIND tops an existing window rather than opening a new window, +this message has no effect! +
  +
Group: AV functions +
  +
See also: AV_OPENWIND   AV_XWIND +
  + +
+ +

15.1.2.20 AV_STARTED

+ + + + + + + + + + + + + + + +
Name: »AV_STARTED« +
  +
Number: 0x4738 +
  +
Description: A Client informs the AV-Server it has received and understood +the VA_START message and the memory reserved for the command line can +be released. +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
WORD 3+4Pointer to the command line containing path or
 filename received by VA_START; can also be NULL.
+
+ +
To recognize which VA_START message is being dealt with, the +values of VA_START are returned. +
  +
Group: AV functions +
  +
See also: VA_START   AV protocol +
  + +
+ +

15.1.2.21 AV_STARTPROG

+ + + + + + + + + + + + + + + +
Name: »AV_STARTPROG« +
  +
Number: 0x4722 +
  +
Description: An application requests the AV-Server to start a program (or +file). +
  +

+
+ + + + + + + + + + + + + + + + +
ParameterMeaning
WORD 3+4Pointer to the program's name (with complete path!)
WORD 5+6Pointer to the command line for the program (may be NULL)
WORD 7Any 16-bit WORD, which will be returned by VA_PROGSTART
+
+ +
In Gemini the installed applications are also taken into account. +This makes it possible to specify a file for which a program is then +searched for. +
  +
Group: AV functions +
  +
See also: VA_PROGSTART   AV protocol +
  + +
+ +

15.1.2.22 AV_STATUS

+ + + + + + + + + + + + + + + +
Name: »AV_STATUS« +
  +
Number: 0x4704 +
  +
Description: An accessory can give its current state to Venus, which will +store it in the INF-file and can be restored using AV_GETSTATUS. +Before sending AV_STATUS it must send AV_PROTOKOLL to Venus! +
  +

+
+ + + + + + + + + + + + + + + + +
ParameterMeaning
WORD 3+4A pointer to a string, which must not contain
 any control characters and must not be longer
 than 256 characters; the pointer may be NULL
+
+ +
The application must first have registered itself with the +Server via AV_PROTOKOLL. +
  +
Group: AV functions +
  +
See also: AV_GETSTATUS   AV_PROTOKOLL   AV protocol +
  + +
+ +

15.1.2.23 AV_VIEW

+ + + + + + + + + + + + + + + +
Name: »AV_VIEW« +
  +
Number: 0x4751 +
  +
Description: The AV-Server calls the viewer for a specific file. +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
WORD 3+4Pointer to the name of the file to be displayed (only a single file is allowed!)
WORD 50 = Calls the viewer
 1 = Calls the editor
WORD 6-7Reserved, always 0
+
+ +
Note: Only a single file may be specified. If no +suitable viewer is available, an error-message will be returned to the +user. +
  +
Group: AV functions +
  +
See also: VA_VIEWED   AV protocol +
  + +
+ +

15.1.2.24 AV_WHAT_IZIT

+ + + + + + + + + + + + + + + +
Name: »AV_WHAT_IZIT« +
  +
Number: 0x4732 +
  +
Description: A Client requests details about what is located at a given +position of the screen. +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
WORD 3X-coordinate
WORD 4Y-coordinate
+
+ +
The coordinates are the normal VDI coordinates (the origin is +the left upper corner of the screen). +
  +
Group: AV functions +
  +
See also: VA_THAT_IZIT   AV protocol +
  + +
+ +

15.1.2.25 AV_XWIND

+ + + + + + + + + + + + + + + +
Name: »AV_XWIND« +
  +
Number: 0x4740 +
  +
Description: Thing opens a directory window, similar to AV_OPENWIND except +additional options are available: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
WORD 3+4Pointer to the path for opening directories
WORD 5+6Pointer to the mask (wildcard) for the available files
WORD 7Bit-mask:
 0x0001 = Use current top window, if available
 0x0002 = Use wildcard for object selection
 0x0004 = Continue using existing window
 All other bit must be set to zero.
+
+ +
Note: This message should only be used when the reason +is clearly evident to the user. +
  +
Group: AV functions +
  +
See also: AV_OPENCONSOLE   AV_OPENWIND   VA_CONSOLEOPEN   VA_WINDOPEN   +VA_XOPEN   AV protocol +
  + +
+ +

15.1.3 VA functions

+

These messages are sent by Gemini or other present +AV-Server to an application: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VA_ACC_QUOTING(a) Test accessory protocol status for quoting +
VA_CONFONT Convey font of the console +
VA_CONSOLEOPEN Convey whether the console window is open +
VA_COPY_COMPLETE Reply to AV_COPY +
VA_DRAGACCWIND Objects were dragged to application's window +
VA_DRAG_COMPLETE AV_DRAG_ON_WINDOW action is completed +
VA_FILECHANGED Reply to AV_FILEINFO. +
VA_FILECOPIED Reply to AV_COPYFILE. +
VA_FILEDELETED Reply to AV_DELFILE. +
VA_FILEFONT Convey font for file window +
VA_FONTCHANGED A set font has been changed +
VA_OBJECT Returns the names of the selected objects +
VA_PATH_UPDATE Contents of a directory have changed +
VA_PROGSTART Information about whether a program could be started +
VA_PROTOSTATUS Reply to AV_PROTOKOLL. +
VA_SERVER_QUOTING(a) Test Server protocol status for quoting +
VA_SETSTATUS Convey status of an application +
VA_START An application has been activated +
VA_THAT_IZIT Provides information about object at screen position +
VA_VIEWED Reply to AV_VIEW. +
VA_WINDOPEN Conveys whether the console window is open +
VA_XOPEN Conveys whether a window could be opened + +
+ +

See also: AV functions +

+

15.1.3.1 VA_ACC_QUOTING(a)

+

This is a test of the protocol status of an accessory for +quoting. +

+

In C the test may be realized as a macro as follows: +

+
#define VA_ACC_QUOTING(a)   ((a) & 0x10)
+
+

15.1.3.2 VA_CONFONT

+ + + + + + + + + + + + + + + +
Name: »VA_CONFONT« +
  +
Number: 0x4715 +
  +
Description: Gives the currently selected font for the console window. Valid +are: +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
WORD 3Console font (ID)
WORD 4Console font size (points)
+
+ +
Group: VA functions +
  +
See also: AV_ASKCONFONT   AV_ASKFILEFONT   VA_FILEFONT +
  + +
+ +

15.1.3.3 VA_CONSOLEOPEN

+ + + + + + + + + + + + + + + +
Name: »VA_CONSOLEOPEN« +
  +
Number: 0x4719 +
  +
Description: Returns the state of the console window (whether it has been +topped or opened). Valid are: +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
WORD 30 = Not topped/opened
 <> 0 = Is topped
+
+ +
Group: VA functions +
  +
See also: AV_OPENCONSOLE   AV protocol +
  + +
+ +

15.1.3.4 VA_COPY_COMPLETE

+ + + + + + + + + + + + + + + +
Name: »VA_COPY_COMPLETE« +
  +
Number: 0x4729 +
  +
Description: This message is a direct reply to AV_COPY_DRAGGED. Valid are: +
  +

+
+ + + + + + + + +
ParameterMeaning
WORD 3State of the copying process
+
+ +
!= 0 means that something really was copied or moved. This may +be useful if a window has to be redrawn. +
  +
Group: VA functions +
  +
See also: AV_COPY_DRAGGED   AV protocol +
  + +
+ +

15.1.3.5 VA_DRAGACCWIND

+ + + + + + + + + + + + + + + +
Name: »VA_DRAGACCWIND« +
  +
Number: 0x4725 +
  +
Description: The AV-Server (e.g. Thing) sends a message to the Client +sharing the information that one or more object/s has/have been +dragged to its window that was notified with AV_ACCWINDOPEN. Valid +are: +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
WORD 3AES handle of the window
WORD 4X-position of the mouse
WORD 5Y-position of the mousee
WORD 6+7Pointer to a string containing the names of the objects.
+
+ +
Group: VA functions +
  +
See also: AV_ACCWINDOPEN   AV_ACCWINDCLOSED   AV_DRAG_ON_WINDOW +
  + +
+ +

15.1.3.6 VA_DRAG_COMPLETE

+ + + + + + + + + + + + + + + +
Name: »VA_DRAG_COMPLETE« +
  +
Number: 0x4735 +
  +
Description: Reply to AV_DRAG_ON_WINDOW message. The AV-Server informs an +application that the action that was triggered by AV_DRAG_ON_WINDOW +has terminated. +
  + + + + + + +
Parameter Meaning +
  +
WORD 3 Status of the action +
  +
A value <> 0 means that something was really copied or +moved; the application may use this for building up a window anew +
  + +
+ +
The returned value corresponds to the one that is also returned +for VA_COPY_COMPLETE. +
  +
Group: VA functions +
  +
See also: AV_DRAG_ON_WINDOW   VA_DRAGACCWIND   AV protocol +
  + +
+ +

15.1.3.7 VA_FILECHANGED

+ + + + + + + + + + + + + + + +
Name: »VA_FILECHANGED« +
  +
Number: 0x4754 +
  +
Description: Reply to AV_FILEINFO sent by the AV-Server to the Client. +
  + + + + + + + + + +
Parameter Meaning +
  +
WORD 3+4 Pointer to the name of a file/folder, passed via AV_FILEINFO, which +can naturally contain a new file/folder name +
  +
WORD 5-7 Reserved, always 0 +
  + +
+ +
Note: One should heed that the user may have altered the +name in the dialog and therefore it is possible that the string +reachable via words 3+4 will no longer match that of AV_FILEINFO. +
  +
Group: VA functions +
  +
See also: AV_FILEINFO   AV protocol +
  + +
+ +

15.1.3.8 VA_FILECOPIED

+ + + + + + + + + + + + + + + +
Name: »VA_FILECOPIED« +
  +
Number: 0x4756 +
  +
Description: Reply to AV_COPYFILE message sent by the AV-Server to the +Client. +
  +

+
+ + + + + + + + + + + + + + + + +
ParameterMeaning
WORD 30 = Error
 1 = All OK
WORD 4-7Reserved, always 0
+
+ +
Group: VA functions +
  +
See also: AV_COPYFILE   AV protocol +
  + +
+ +

15.1.3.9 VA_FILEDELETED

+ + + + + + + + + + + + + + + +
Name: »VA_FILEDELETED« +
  +
Number: 0x4758 +
  +
Description: Reply to AV_DELFILE from the AV-Server to the Client. +
  +

+
+ + + + + + + + + + + + + + + + +
ParameterMeaning
WORD 30 = Error
 1 = All OK
WORD 4-7Reserved, always 0
+
+ +
Group: VA functions +
  +
See also: AV_DELFILE   AV protocol +
  + +
+ +

15.1.3.10 VA_FILEFONT

+ + + + + + + + + + + + + + + +
Name: »VA_FILEFONT« +
  +
Number: 0x4713 +
  +
Description: The Server returns the ID and size (in points) of the current +font used for filenames in directory windows. +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
WORD 3ID of font (vst_font)
WORD 4Size in points (vst_point)
+
+ +
Group: VA functions +
  +
See also: AV_ASKCONFONT   AV_ASKFILEFONT   VA_CONFONT +
  + +
+ +

15.1.3.11 VA_FONTCHANGED

+ + + + + + + + + + + + + + + +
Name: »VA_FONTCHANGED« +
  +
Number: 0x4739 +
  +
Description: The AV-Server informs an application that one of its set fonts +has been changed. Valid are: +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
WORD 3ID of the font used for directories (vst_font)
WORD 4Size in points for font used in directories (vst_point)
WORD 5ID of the font used in the console window (vst_font)
WORD 6Size in points for font used in the console window (vst_point)
+
+ +
The message is sent to all applications that have previously +enquired about a font from the AV-Server. +
  +
Group: VA functions +
  +
See also: AV_ASKCONFONT   AV_ASKFILEFONT   VA_FILEFONT +
  + +
+ +

15.1.3.12 VA_OBJECT

+ + + + + + + + + + + + + + + +
Name: »VA_OBJECT« +
  +
Number: 0x4717 +
  +
Description: Return the currently selected object(s). +
  +

+
+ + + + + + + + +
ParameterMeaning
WORD 3+4Pointer to a command line with the name(s) of the selected object(s)
+
+ +
Group: VA functions +
  +
See also: AV_ASKOBJECT   AV protocol +
  + +
+ +

15.1.3.13 VA_PATH_UPDATE

+ + + + + + + + + + + + + + + +
Name: »VA_PATH_UPDATE« +
  +
Number: 0x4760 +
  +
Description: With this message the AV-Server informs a Client that the +contents of a directory have changed. +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
WORD 3+4Pointer to the directory
WORD 5-7Reserved, always 0
+
+ +
The specified directory always includes a trailing backslash '\' +character. The Client has to first establish via AV_PROTOKOLL that the +Server supports this message, and informs the Server whenever it +changes the contents of a directory or subdirectory. The Client should +then re-read all affected directories and subdirectories, closing any +subdirectories which no longer exist if necessary. +
  +
Group: VA functions +
  +
See also: AV_PROTOKOLL   AV protocol +
  + +
+ +

15.1.3.14 VA_PROGSTART

+ + + + + + + + + + + + + + + +
Name: »VA_PROGSTART« +
  +
Number: 0x4723 +
  +
Description: The AV-Server informs an application whether a specified +program was started. +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
WORD 3 0  = Error
 <>0 = Program started
WORD 4Return code of the program (where available)
WORD 716-bit WORD from AV_STARTPROG
+
+ +
In general the application will receive a message immediately in +case of error; but if the program is started, then the application +receives this message only after the start of the program, since the +routine which executes the Pexec can no longer know that an +application still has to get a message quickly. With a GEM program +one can recognize a success also from the AC_CLOSE message. +
  +
The error recognition unfortunately is sub-optimal; furthermore +the return value does not indicate whether the program has run free of +error. +
  +
Group: VA functions +
  +
See also: AV_STARTPROG   VA_START   AV protocol +
  + +
+ +

15.1.3.15 VA_PROTOSTATUS

+ + + + + + + + + + + + + + + +
Name: »VA_PROTOSTATUS« +
  +
Number: 0x4701 +
  +
Description: Tells the sender of AV_PROTOKOLL that the application knows +something about the VA protocol. The words 3-7 of the message buffer +contain information about which messages are understood. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
WORD 3Bit 0 = AV_SENDKEY
 Bit 1  = AV_ASKFILEFONT
 Bit 2  = AV_ASKCONFONT, AV_OPENCONSOLE
 Bit 3  = AV_ASKOBJECT
 Bit 4  = AV_OPENWIND
 Bit 5  = AV_STARTPROG
 Bit 6  = AV_ACCWINDOPEN, AV_ACCWINDCLOSED
 Bit 7  = AV_STATUS, AV_GETSTATUS
 Bit 8  = AV_COPY_DRAGGED
 Bit 9  = AV_PATH_UPDATE, AV_WHAT_IZIT, AV_DRAG_ON_WINDOW
 Bit 10 = AV_EXIT
 Bit 11 = AV_XWIND
 Bit 12 = VA_FONTCHANGED
 Bit 13 = AV_STARTED
 Bit 14 = Quoting of filenames is
          understood and used
 Bit 15 = AV_FILEINFO
WORD 4Bit 0 = AV_COPYFILE
 Bit 1 = AV_DELFILE
 Bit 2 = AV_VIEW
 Bit 3 = AV_SETWINDPOS
 Bit 4 = Permits creation of symbolic links
     with AV_COPYFILE
 Bit 5 = AV_SENDCLICK
WORD 5Reserved, always 0
WORD 6+7Pointer to the program names of the Servers, prepared for appl_find (8 characters long and NULL-terminated).
+
+ +
If a bit is set, the message (group) is supported. All other +bits are reserved for future use and should be set to zero (all unused +bits of words 4 and 5 too). +
  +
Group: VA functions +
  +
See also: AV_PROTOKOLL   AV protocol +
  + +
+ +

15.1.3.16 VA_SERVER_QUOTING(a)

+

This is a test of the protocol status of a Server for quoting. +

+

In C the test may be realized as a macro as follows: +

+
#define VA_SERVER_QUOTING(a)  ((a) & 0x40)
+
+

15.1.3.17 VA_SETSTATUS

+ + + + + + + + + + + + + + + +
Name: »VA_SETSTATUS« +
  +
Number: 0x4705 +
  +
Description: The AV-server tells an accessory about its stored state as a +reply to AV_GETSTATUS. The state can be set by the accessory. +
  +

+
+ + + + + + + + +
ParameterMeaning
WORD 3+4Pointer to the saved string or NULL if no information is available.
+
+ +
The returned status can be set subsequently by the application. +
  +
Group: VA functions +
  +
See also: AV_GETSTATUS   AV protocol +
  + +
+ +

15.1.3.18 VA_START

+ + + + + + + + + + + + + + + +
Name: »VA_START« +
  +
Number: 0x4711 +
  +
Description: Using this message an AV-Server passes parameters to desktop +accessories or parallel running applications. +
  +

+
+ + + + + + + + +
ParameterMeaning
WORD 3+4A pointer to the command line, which may be NULL. The command line contains paths or filenames.
+
+ +
Group: VA functions +
  +
See also: AV_STARTPROG   AV_STARTED   VA_PROGSTART +
  + +
+ +

15.1.3.19 VA_THAT_IZIT

+ + + + + + + + + + + + + + + +
Name: »VA_THAT_IZIT« +
  +
Number: 0x4733 +
  +
Description: The AV-Server tells an application on request what object is +placed at a given position on the screen. +
  + + + + + + + + +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
WORD 3ID of the appropriate application
WORD 4Object type:
 VA_OB_UNKNOWN   (0) = Unknown
 VA_OB_TRASHCAN  (1) = Trash can
 VA_OB_SHREDDER  (2) = Shredder
 VA_OB_CLIPBOARD (3) = Clipboard
 VA_OB_FILE      (4) = File
 VA_OB_FOLDER    (5) = Folder
 VA_OB_DRIVE     (6) = Drive
 VA_OB_WINDOW    (7) = Window
 VA_OB_NOTEPAD   (8) = Notepad
 VA_OB_NOTE      (9) = Note
WORD 5+6Pointer to the name of the object(s), or NULL if there was nothing.
+
+ +
All other values are reserved for future purposes. +
  +
Group: VA functions +
  +
See also: AV_WHAT_IZIT   AV protocol +
  + +
+ +

15.1.3.20 VA_VIEWED

+ + + + + + + + + + + + + + + +
Name: »VA_VIEWED« +
  +
Number: 0x4752 +
  +
Description: Reply to AV_VIEW from the AV-Server to the Client. +
  +

+
+ + + + + + + + + + + + + + + + +
ParameterMeaning
WORD 30 = Error
 1 = All OK
WORD 4-7Reserved, always 0
+
+ +
The Server informs the Client whether the file will be displayed +or not. The answer is immediate and always sent out if an error +occured. Otherwise, in a multitasking environment, the answer is +received as soon as the viewer is topped (made active), Under +Single-TOS the answer is received after exiting the viewer, in the +case that the Server had not already been ended. +
  +
Group: VA functions +
  +
See also: AV_VIEW   AV protocol +
  + +
+ +

15.1.3.21 VA_WINDOPEN

+ + + + + + + + + + + + + + + +
Name: »VA_WINDOPEN« +
  +
Number: 0x4721 +
  +
Description: Returns the state of the file window (see VA_CONSOLEOPEN). +
  +
Group: VA functions +
  +
See also: AV_OPENCONSOLE   VA_CONSOLEOPEN   AV protocol +
  + +
+ +

15.1.3.22 VA_XOPEN

+ + + + + + + + + + + + + + + +
Name: »VA_XOPEN« +
  +
Number: 0x4741 +
  +
Description: Reply to AV_XWIND, similar to VA_WINDOPEN. The AV-Server +informs an application whether a given window could be opened. +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
WORD 30 = no
 <> 0 = Window opened and the directory
 completely read i.e. an available
 window could be topped.
+
+ +
Group: VA functions +
  +
See also: AV_OPENWIND   AV_XWIND   VA_WINDOPEN +
  + +
+ +
+ +Home +ProtocolsProtocols +ProtocolsProtocols +BubbleGEMBubbleGEM + + diff --git a/en/proto_bubblegem.html b/en/proto_bubblegem.html new file mode 100644 index 000000000..2c0e6d2db --- /dev/null +++ b/en/proto_bubblegem.html @@ -0,0 +1,422 @@ + + + + + +The documentation for TOS: BubbleGEM + + + + + + + + + +Home +ProtocolsProtocols +AV protocolAV protocol +Drag&Drop protocolDrag&Drop protocol + +
+ +

15.2 BubbleGEM

+

+

Modern GEM applications often include a bewildering array of +options and icons which take time to learn. Even after learning a +program interface a short break away from the keyboard often triggers +amnesia! +

+

The solution? +

+

BubbleGEM! Programmers supporting this cute little program can +add speech bubble help to their user interface making it much easier +for users to find their way around. +

+ +
+

15.2.1 How to call BubbleGEM?

+

There are two fundamental ways to call BubbleGEM. The following +example code snippet describes the simplest way to call BubbleGEM from +non-modal dialogs and window-dialogs. Since BubbleGEM Release 05 it's now +also possible to call BubbleGEM from modal dialogs. +

+

Before every Bubble-call, supporting applications search via +appl_find("BUBBLE ") for the BubbleGEM AES application +identification number (bubble_id). Once the AES ID has been +received, a message BUBBLEGEM_SHOW (hexadecimal: 0xBABB) can be sent +to the ap_id and should receive a BUBBLEGEM_ACK (0xBABC) message in +reply. +

+

It is important the character string passed is NULL-terminated, +255 characters maximum and global legible - otherwise this leads to +memory corruption in systems with memory protection. Always request +global memory. +

+

The message BUBBLEGEM_SHOW should be sent out as soon as the the +right mouse button is pressed - don't wait until the button is +released! +

+

The mouse coordinates are passed using x and y and these are +used to determine where the speech bubble will be drawn. Calls for +BubbleGEM may only be instigated from non-modal dialogs. +

+

Changes to BubbleGEM bubbles are updated automatically, however, +you can intervene manually using the vertical line "|" +character. Preceding or following space characters are not necessary. +

+

C example: +

+ +
#include <portab.h>
+
+/* BUBBLEGEM_SHOW - Message:
+ * msg[0]   0xBABB
+ * msg[1]   ap_id
+ * msg[2]   0
+ * msg[3]   mouse X
+ * msg[4]   mouse Y
+ * msg[5/6] to NULL-terminated character string in global memory
+ * msg[7]   0
+ */
+
+...
+
+#define MGLOBAL         0x20
+
+#define BUBBLEGEM_REQUEST  0xBABA
+#define BUBBLEGEM_SHOW     0xBABB
+#define BUBBLEGEM_ACK      0xBABC
+#define BUBBLEGEM_ASKFONT  0xBABD
+#define BUBBLEGEM_FONT     0xBABE
+#define BUBBLEGEM_HIDE     0xBABF
+
+#define MagX_COOKIE     0x4D616758L
+#define MiNT_COOKIE     0x4D694E54L
+...
+
+WORD msg[8];
+WORD bubble_id;
+BYTE *bubble_text;
+
+/* Establish if Mxalloc() is available, if yes,
+ * then memory protection mode is set to "Global"
+ */
+if ((get_cookie (MagX_COOKIE, &val) == TRUE) ||
+     (get_cookie (MiNT_COOKIE, &val) == TRUE))
+{
+        bubble_text = (BYTE *) Mxalloc (256, 0 | MGLOBAL);
+}
+else
+        bubble_text = (BYTE *) Malloc (256);
+
+if (!bubble_text)               /* Pointer invalid, no memory there */
+        return;
+
+if (right_mouse key_button_pressed)
+{
+    /* fill buffer */
+    strcpy(bubble_text, "My first help speech bubble.");
+
+    bubble_id = appl_find("BUBBLE  ");
+
+    if (bubble_id >= 0)
+    {
+        msg[0] = BUBBLEGEM_SHOW;
+        msg[1] = ap_id;
+        msg[2] = 0;
+        msg[3] = x;
+        msg[4] = y;
+        msg[5] = (WORD)(((LONG) bubble_text >> 16) & 0x0000ffff);
+        msg[6] = (WORD)((LONG) bubble_text & 0x0000ffff);
+        msg[7] = 0;
+        if (appl_write(bubble_id, 16, msg) == 0)
+        {
+            /* Error */
+        }
+    }
+}
+
+ +

A reply message BUBBLEGEM_ACK (0xBABC) is received with the +pointer to the character string, whose memory can now be released. The +array elements 2, 3, 4 and 7 are set to null (zeroed). On non-modal +calls the BUBBLEGEM_ACK comes only after closing the bubble! +

+
/* BUBBLEGEM_ACK (0xBABC)
+ *
+ * msg[0]   0xBABC
+ * msg[1]   ap_id
+ * msg[2]   0
+ * msg[3]   0
+ * msg[4]   0
+ * msg[5/6] Pointer from BUBBLEGEM_SHOW
+ * msg[7]   Same value as msg[7] on sending BUBBLEGEM_SHOW;
+ *          presently 0.
+ */
+
+/* example code snippet */
+
+pointer = *(BYTE **) &msg[5];
+
+if (pointer)
+  Mfree(pointer)
+
+

To make translation into other languages easier, please consider +storing the character strings externally, for example in the resource +file (RSC) or a separate ASCII file. +

+

If on BUBBLEGEM_SHOW the bit BGS7_MOUSE (0x0004) in msg[7] is +set, the passed coordinates are only used for drawing; BubbleGEM +ascertains the mouse coordinates, which can be used to recognize mouse +movement (leading to bursting the bubble) shortly before automatically +re- displaying the bubble. +

+

The procedure to call BubbleGEM from modal dialogs (see also the +call routine) proceeds similarly to calls from non-modal dialogs, +assuming the BGEM cookie is available, except BGS7_USRHIDE (0x0001) is +set in msg[7] instead. +

+ +

Additionally, after evaluating the mouse coordinates through the +calling application, BUBBLEGEM_HIDE (0xbabf) must be sent to BubbleGEM. +The evaluation of the mouse and keys on calling modal dialogs is the +responsibility of the calling application. +

+

On systems without wind_update, testmode is possible. Double +help texts can be displayed (directly above one another). Currently +this is not possible otherwise. +

+

15.2.2 Call routine

+

Here's a general routine in pseudocode. +

+
bubblegem:=appl_find('BUBBLE  ');
+if bubblegem<0 then
+  begin
+    path:=GetEnv('BUBBLEGEM');
+    if length(path)>0 then
+      begin
+        { start BubbleGEM in parallel, notice ID in bubblegem }
+        if bubblegem>=0 then evnt_timer(500,0)
+      end
+  end;
+if bubblegem<0 then exit; { BubbleGEM not found -> Cancel}
+StrPCopy(bubblebuf,helptext);
+msg[0]:=BUBBLEGEM_SHOW;
+msg[1]:=apID;
+msg[2]:=0;
+msg[3]:=mx;
+msg[4]:=my;
+msg[5]:=integer(HiWord(bubblebuf));
+msg[6]:=integer(LoWord(bubblebuf));
+msg[7]:=0;
+if non-modal_call then
+  begin
+    appl_write(bubblegem,16,@msg);
+    evnt_timer(100,0)
+  end
+else
+  begin
+    { call from a system modal dialog: }
+    if not(GetCookie('BGEM',bgemcookie)) then Bing { Error }
+      { modal call only possible if BGEM-Cookie available }
+    else
+      begin
+        msg[7]:=msg[7] or BGS7_USRHIDE;
+        appl_write(bubblegem,16,@msg);
+        evnt_timer(10,0);
+        graf_mkstate(dummy,dummy,ms,dummy);
+        if (ms and 3)=0 then { no mouse key pressed? }
+          begin
+            bclicks:=258;
+            bmask:=3;
+            bstate:=0
+          end
+        else
+          begin
+            bclicks:=0;
+            bmask:=3;
+            bstate:=0
+          end;
+        if not(GetCookie('BHLP',delay)) then delay:=200
+        else
+          delay:=(delay shr 16) and 0x0000ffff;
+        graf_mouse(USER_DEF,bgemcookie->mhelp);
+        evnt_timer(delay,0);
+        evnt_multi(MU_KEYBD or MU_BUTTON or MU_M1, bclicks, bmask,
+          bstate, 1, mX-6, mY-6, 13, 13, 0, 0, 0, 0, 0, msg,
+          0, 0, dummy, dummy, ms, dummy, dummy, dummy);
+        msg[0]:=BUBBLEGEM_HIDE;
+        msg[1]:=apID;
+        msg[2]:=0;
+        msg[3]:=0;
+        msg[4]:=0;
+        msg[5]:=0;
+        msg[6]:=0;
+        msg[7]:=0;
+        appl_write(bubblegem,16,@msg);
+        graf_mouse(ARROW,NULL)
+      end;
+    repeat
+      graf_mkstate(dummy,dummy,ms,dummy)
+    until (ms and 3)=0
+  end;
+
+

15.2.3 Time-controlled call

+

The configuration from applications is simply: +

+ +
    +
  • On receipt from BUBBLEGEM_REQUEST (0xBABA), BubbleGEM is called +normally (certainly with the coordinates from BUBBLEGEM_REQUEST) to +determine, after ascertaining the received coordinates, if help is +available for this position. +
      +

  • +
  • The message BUBBLEGEM_REQUEST is made up as follows: msg[0] := +BUBBLEGEM_REQUEST; +
    msg[1] := demonID; +
    msg[2] := 0; +
    msg[3] := winID; { AES ID of the window under the mouse cursor +} +
    msg[4] := mX;    { mouse coordinates } +
    msg[5] := mY; +
    msg[6] := KStat; { Status of the [Shift] keys } +
    msg[7] := 0; +
      +

  • +
  • The time-controlled help only functions non-modally. +
      +

  • +
  • For the help demon to function the System must support +wind_get(WF_OWNER). +
      +

  • +
  • The demon is on if bit BGC_DEMONACTIVE (0x0008) in the +BHLP-Cookie is set; after changes BUBBLEGEM_REQUEST (msg[3..7] nulled) +sent to BUBBLE.APP (previously HLPDEMON.APP) +
      +

  • +
  • If BGC_TOPONLY (0x0010) is set, the help demon is only active +for the topped window. +
      +

  • +
  • On/off switching the help-demon by VA_START (although using the +CPX is better because the state can be saved): "-demonon" +(="-demon1"), "-demonoff" (="-demon0"). +
      +

  • +
  • The demon-timer defaults to 200ms. It can be changed in the +dtimer field of the BGEM cookie. +
      +

  • +
+ +

15.2.4 BubbleGEM cookies

+

BHLP: +

+

BubbleGEM evaluates the cookie "BHLP". The top WORD sets +the minimum visible time a bubble is displayed; the default setting is +200 milliseconds. The lower WORD is a bitmap; if bit 0 is set (0x0001 += BGC_FONTCHANGED), this means the FONT_CHANGED message will be +evaluated. If BGC_NOWINSTYLE (0x0002) (i.e. no-win-style, not now-in- +style) set, the bubble help will be displayed as a speech balloon. +Conversely a deleted bit corresponds to Windows-help style display. A +bit set in BGC_SENDKEY (0x0004) means AV_SENDKEY is sent to the caller +after closing the bubble via a keypress. BGC_DEMONACTIVE (0x0008) +means the demon is switched on. BGC_TOPONLY (0x0010) decides whether +the help demon is only active for the topped window. +

+

BGEM: +

+

In addition, the BGEM cookie is placed in the cookie jar. It is +available only on launching BubbleGEM, therefore it is installed on starting +BubbleGEM and removed with AP_TERM. +

+
 typedef struct
+ {
+   long   magic;   /* 'BGEM'                                      */
+   long   size;    /* Size of the structure, currently 18         */
+   int    release; /* Currently 7, never smaller than 5           */
+   int    active;  /* <>0, if immediately help is displayed;
+                        0  otherwise                              */
+   MFORM *mhelp;   /* Pointer to help-mouse form                  */
+   int    dtimer;  /* Demon-timer; Default 200ms; from Release 06 */
+ } BGEM;
+
+

The structure lies in the global memory. Important: +dtimer is the only field released for read and +write. All other fields are read only! +

+

15.2.5 BubbleGEM environmental variable

+

If you want to start BubbleGEM manually and it doesn't run, try +setting the 'BUBBLEGEM' environmental variable. This specifies the +absolute path to BubbleGEM including the program name. For example with +MagiC, something like: +

+

#_ENV BUBBLEGEM=D:\TOOLS\BUBBLE\BUBBLE.APP +

+

15.2.6 Font-selection

+ + +

On starting BubbleGEM a BUBBLEGEM_ASKFONT message will be sent to +the AV-Server or the application with the AES ID 0. This should be +answered with a BUBBLEGEM_FONT message (Jinnee supports this). +

+
msg[0] = BUBBLEGEM_ASKFONT;
+msg[1] = apID;
+msg[2] = 0;
+msg[3] = 0;
+msg[4] = 0;
+msg[5] = 0;
+msg[6] = 0;
+msg[7] = 0;
+
+msg[0] = BUBBLEGEM_FONT;
+msg[1] = apID;
+msg[2] = 0;
+msg[3] = FontID;
+msg[4] = FontPt;
+msg[5] = 0;
+msg[6] = 0;
+msg[7] = 0;
+
+

If BubbleGEM receives this message, it immediately takes the font +with the ID msg[3] and the point size from msg[4] to display help +bubbles. The ID and point size is adopted without checking validity. +Additionally BubbleGEM reacts to FONT_CHANGED if the corresponding +checkbox is active in the CPX module. +

+

15.2.7 AV_SENDCLICK, BubbleGEM

+
msg[0] = AV_SENDCLICK  /* 0x4709 */
+msg[1] = ap_id;
+msg[2] = 0;
+msg[3] = ev_mmox;
+msg[4] = ev_mmoy;
+msg[5] = ev_mmobutton;
+msg[6] = ev_mmokstate;
+msg[7] = ev_mbreturn;
+
+

AV_SENDCLICK will be sent if the bubble was closed by clicking +(as opposed bursting bubbles by releasing the mouse button!). +

+

AV_SENDCLICK is the counterpart to AV_SENDKEY. +

+
+ +Home +ProtocolsProtocols +AV protocolAV protocol +Drag&Drop protocolDrag&Drop protocol + + diff --git a/en/proto_dd.html b/en/proto_dd.html new file mode 100644 index 000000000..a6417168a --- /dev/null +++ b/en/proto_dd.html @@ -0,0 +1,294 @@ + + + + + +The documentation for TOS: Drag&Drop protocol + + + + + + + + + +Home +ProtocolsProtocols +BubbleGEMBubbleGEM +Document History protocolDocument History protocol + +
+ +

15.3 Drag&Drop protocol

+ +

The Drag&Drop protocol was developed by Atari for MultiTOS. +This is a very flexible protocol which is not itself part of the +operating system, and therefore could also be applied under other +operating systems provided these supported multitasking and pipes. +

+

AES messages in this protocol are only used to bring the communicating +partners in touch with each other; all the remaining data transfer +takes place via a pipe, which one can access with the usual +GEMDOS file functions. +

+

To initiate a Drag&Drop communication, one creates +in the directory U:\PIPE a file with the name 'DRAGDROP.xx', where +each 'x' represents a letter from 'A' to 'Z'. Thanks to this, up to +676 simultaneous Drag&Drop procedures can take place in theory, +which should certainly suffice. For creating the pipe one should use +the function Fcreate, as this returns a tidy error message should a +pipe with the same name exist already. In addition, when creating the +pipe the hidden bit (bit 1) should be set; with this the +reading end receives an End-of- file (EOF) when the other end of the +pipe is closed. +

+

Subsequently the message AP_DRAGDROP is sent to the receiver. As +there is no provision for an acknowledgement for this message, the +sender must make use of the Fselect function to ascertain whether +someone on the opposite side has opened the pipe for reading and is +ready to receive. In this connection Atari recommends a timeout of +three to four seconds. +

+

Warning: The sender is unfortunately not in the +position to establish in advance whether the destination application +supports the Drag&Drop protocol at all. Thus it is possible that +the user only receives an appropriate message after the expiry of the +timeout interval. For this reason, all applications that do +not support this protocol should return a negative acknowledgement, so that the +annoying waiting time is avoided. On the other hand, if the receiver +is ready to receive the data, it should return the identifier DD_OK +(with the value 0). +

+

Next, both parties have to agree on the type of data to be sent; +the crucial point of the Drag&Drop protocol namely lies in the +various kinds of data types, which are represented as a four character long string +of letters. For this the receiver sends a preference-sorted +list of eight filetypes that it can use to the sender. For instance, a +text processor could communicate in this manner that it supports files +in Rich Text Format (RTF) and ASCII format, and that it gives +preference to the former. Important: If fewer than eight +data-types are understood, the rest of the list must be filled with +NULL-bytes, so that always exactly 32 bytes are transmitted. +

+

From the list conveyed by the receiver, the sender can then +decide which data format is to be used. The transmitted list only +serves as a guideline for that, however; hence the sender may use a +different order, or also offer other formats. +

+

Transmission of the actual data then proceeds in the +following steps: +

+ +
    +
  • First a header is transmitted that contains all information +about the data - its format and its length. The receiver can then +react accordingly. The header is constructed as follows: +
      +

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PositionLengthMeaning
    02 bytesLength of the header
    24 bytesData-type (e.g. ARGS)
    64 bytesLength of data to be transmitted
    10Variable(n)Name of the data (NULL-terminated)
    10+nVariableFilename (NULL-terminated)
    +
    + +
    As the length of the header has to be included, it can be easily +extended for future purposes. +
      +

  • +
  • After it has read in the header, the receiver can react to it. +Thus it can inform the sender, for instance, that it agrees with the +suggested data format, or not. This is done by sending various status bytes. +
      +

  • +
  • As soon as the receiver has replied with DD_OK, the +transmission of the data starts; for this, exactly as many bytes are +written as were specified in the header, and subsequently the pipe is +closed. +
      +

  • +
+ +

Important note: Normally a process is terminated by the +kernel if it writes to a pipe that has not been opened by anyone for +reading. This can be avoided by ignoring the signal SIGPIPE. +Furthermore, neither of the partners should use a wind_update, since +otherwise it could lead to a deadlock in some circumstances if +one of the two sides attempts to make a screen output (e.g. an alert +box). +

+ +

Tip: A sample source text for the Drag&Drop protocol +can be found, for instance, in the magazine ST-Computer (issue +12/1993). +

+

See also: +
AV protocol   GEM   Style guidelines   Test for pipes   OLGA protocol +

+ +

15.3.1 D&D-listing_1

+
/* The following program fragment signals the sender of the
+   Drag&Drop protocol that the particular program does not
+   support this protocol. */
+
+#define AP_DRAGDROP   63
+#define DD_NAK         1
+
+/* We are now in the event-loop;
+   msg is the message buffer. */
+
+case AP_DRAGDROP:
+{
+    static BYTE pipename[] = "U:\\PIPE\\DRAGDROP.AA";
+    LONG fd;
+
+    pipename[18] = msg[7] & 0x00ff;
+    pipename[17] = (msg[7] & 0xff00) >> 8;
+
+    fd = Fopen (pipename, 2);
+    if (fd >= 0)
+    {
+        BYTE c = DD_NAK;
+
+        Fwrite ((WORD) fd, 1, &c);
+        Fclose ((WORD) fd);
+    }
+}
+break;
+
+

15.3.2 Drag&Drop, Data-types for

+

Data-types are represented within the Drag&Drop protocol by a +four character long letter string. The following list contains the +data- types defined at present: +

+
+
ARGS
+
+

represents a command line, so generally one or more +filenames or directory names, separated from each other by a space. +For filenames that themselves contain a space, special treatment is +required: the filename is enclosed in single quotation marks, +and should a single quote mark appear in the name, it is doubled up +automatically. +
  +
Example: +
  +

(!I)Eric's file((!i) will be converted to (!I)'Eric('')s file'(!i).
+
+

+ +
+
PATH
+
+

is reserved to request information about the destination object +selected by the user. The transmission in this case runs in the +opposite direction; i.e. the sender reads exactly as many +bytes as specified. For this, the receiver has to transmit the data +directly after sending DD_OK. The data should contain the full +pathname or filename of the destination window (terminated with a +'\'). +
  +

+ +
+
.XXX
+
+

represents an extension (of a filename) Examples: +
  +

+ + + + + + + + + + + + + + + + + + + + +
.IMG=Graphic data in XIMG format
.GEM=Graphic data in metafile format
.TXT=Texts in ASCII format
.RTF=Texts in Rich Text Format
+
+ +

+ +
+
+

See also: Drag&Drop protocol +

+

15.3.3 Drag&Drop, Status bytes for

+ + + + + + + +

The following list contains all the status bytes that may occur +within a Drag&Drop communication: +

+
#define DD_OK         0    /* OK, - continue                    */
+#define DD_NAK        1    /* Abort Drag&Drop                   */
+#define DD_EXT        2    /* Data format is not accepted       */
+#define DD_LEN        3    /* Request for fewer data            */
+#define DD_TRASH      4    /* Destination is a wastebasket icon */
+#define DD_PRINTER    5    /* Destination is a printer icon     */
+#define DD_CLIPBOARD  6    /* Destination is a clipboard icon   */
+
+

All other values are reserved for future purposes. +

+

Note: The status byte DD_EXT is sent when the receiver +does not like the offered data format. Following this the sender will +transmit a new header with a different data format, or break off +transmission on its part. This can be repeated until the sender and +receiver have agreed on a format, or until it is established that +there is no possibility of mutual understanding. +

+

See also: Drag&Drop protocol +

+
+ +Home +ProtocolsProtocols +BubbleGEMBubbleGEM +Document History protocolDocument History protocol + + diff --git a/en/proto_dhst.html b/en/proto_dhst.html new file mode 100644 index 000000000..c0774a893 --- /dev/null +++ b/en/proto_dhst.html @@ -0,0 +1,97 @@ + + + + + +The documentation for TOS: Document History protocol + + + + + + + + + +Home +ProtocolsProtocols +Drag&Drop protocolDrag&Drop protocol +Font protocolFont protocol + +
+ +

15.4 Document History protocol

+ + + +

The Document History protocol (DHST) serves to provide a global +list of the last-used documents, similar to the Recall menu in Texel. +Start-Me-Up makes use of this by enabling files to be +retrieved from just one place. +

+

Here is a short version of the structure in C-notation: +

+ + +
 #define DHST_ADD 0xdadd
+ #define DHST_ACK 0xdade
+
+typedef struct
+{
+   int8_t *appname,
+          *apppath,
+          *docname,
+          *docpath;
+} DHSTINFO;
+
+

Every time the user opens a file, it searches the application +for the cookie 'DHST'. The AES ID of the DHST-Server informs other +programs where they should send DHST messages using the DHST_ADD +message. The application then sends the information down to the +global DHSTINFO- structure and adds the corresponding +information depending upon: +

+
 appname:     Name of the application
+              (e.g. "Texel")
+
+ apppath:     Absolute path of the application
+              (e.g. "c:\program\texel.app")
+
+ docname:     Name of the document
+              (e.g. "balmer.txl")
+
+ docpath:     Absolute path of the document
+              (e.g. "d:\Data\balmer.txl")
+
+

Then the DHST-Server sends the following message: +

+
 msg[0]    DHST_ADD (0xdadd)
+ msg[1]    ap_id
+ msg[2]    0
+ msg[3]    and
+ msg[4]    Pointer to DHSTINFO-structure (how DHST_ADD passed)
+ msg[5]    0
+ msg[6]    0
+ msg[7]    0
+
+

When an answer is received, the application sends the following +message: +

+
 msg[0]    DHST_ACK (0xdade)
+ msg[1]    ap_id
+ msg[2]    0
+ msg[3]    and
+ msg[4]    Pointer to DHSTINFO structure (how passed with DHST_ADD)
+ msg[5]    0
+ msg[6]    0
+ msg[7]    0=error(s), else: OK
+
+
+ +Home +ProtocolsProtocols +Drag&Drop protocolDrag&Drop protocol +Font protocolFont protocol + + diff --git a/en/proto_font.html b/en/proto_font.html new file mode 100644 index 000000000..f830353ab --- /dev/null +++ b/en/proto_font.html @@ -0,0 +1,181 @@ + + + + + +The documentation for TOS: Font protocol + + + + + + + + + +Home +ProtocolsProtocols +Document History protocolDocument History protocol +GDPS: Gerti's Driver Piping SystemGDPS: Gerti's Driver Piping System + +
+ +

15.5 Font protocol

+

Description of the Font protocol, Revision 5 +

+

Minimal support of this protocol consists in the evaluation of +the FONT_CHANGED message. Programs that support one of the (GDOS) +attributes text angle, text width, kerning, text slope or the setting +of the text size in 1/65536 points should also support the +XFONT_CHANGED message, which offers additional information. +

+

With the message FONT_SELECT the font-selector can also be +called up by the application. During this the currently set attributes +can be passsed as well. +

+

If the application also supports the XAcc-2 protocol, then it +can also reveal easily the FONT_ACK confirmation message, and search +for font selectors in memory even without an environmental variable. +

+
    + +
  • FONT_CHANGED message: +
    Message from the font-selector to an application that the font +and/or character attributes (size, colour and effects) in one or more +windows of the application should be changed. If the target +application contains in its extended XAcc name the identifier +'XFontAck' then this message has to be replied to with a FONT_ACK +message. Otherwise the support for this message is optional. +
      +
    Negative values in msg[6/7] or zero in msg[4/5] represents no +change. +
      +

    +
    msg[0]  = FONT_CHANGED (0x7a18)
    +msg[1]  = apID
    +msg[2]  = 0
    +msg[3]  = Handle of the affected window, or negative
    +          value if the font for all windows should be
    +          changed.
    +msg[4]  = Font ID, or 0
    +msg[5]  = Font size in points (>0) or pixels (<0)
    +          or zero for no change
    +msg[6]  = Font colour
    +msg[7]  = Effects:
    +          Bit 0: Bold
    +          Bit 1: Light
    +          Bit 2: Italics
    +          Bit 3: Underlined
    +          Bit 4: Outlined
    +          Bit 5: Shadowed
    +          Bit 6: Inverse
    +          Bit 12: 1=Font is monospaced; 0=unknown
    +          (remaining bits are reserved)
    +
    +
    +
    Bit 12 was introduced with Revision 5. +
      + +

  • +
  • XFONT_CHANGED message: +
    Convey extended (GDOS) attributes. This message is optional and +is sent before the FONT_CHANGED message, i.e. these values may +be set only when the FONT_CHANGED message arrives and has the same +sender (compare with msg[1]!). This avoids duplicated redraws and/or +errors. +
      +
    The FONT_CHANGED message contains the size, rounded to a point +value, i.e. programs that do not support XFONT_CHANGED can use this +value. +
      +
    Font-selectors as a rule only understand this message when one +of the conveyed attributes differs from the normal value! +
      +

    +
    msg[0]   = XFONT_CHANGED (0x7a1b)
    +msg[1]   = apID
    +msg[2]   = 0
    +msg[3/4] = Size in 1/65536 point (fix31)
    +msg[5]   = Rotation angle in 1/10-degree (0-3599)
    +msg[6]   = Slope in 1/10-degree (-1800 - 1800)
    +msg[7]   = Width and kerning:
    +           Bit 15:    Pair kerning
    +           Bit 13/14: Track kerning mode (0-3)
    +           Bit 0-12:  Width in points
    +
    +           In C:
    +
    +           typedef struct
    +           {
    +               unsigned int  pair  : 1;
    +               unsigned int  track : 2;
    +               unsigned int  width : 13;
    +           } VECTOR_INFO;
    +
    +
    + +

  • +
  • FONT_SELECT message: +
    With this message one can call a font-selector containing in its +extended XAcc name the identifier 'XFontAck' that is present in +memory. If the application and/or the font-selector does not support +the XAcc-2 protocol, then one can still search for the contents of the +(AES) environmental variable 'FONTSELECT'. In some cases this +variable may contain several names (separated by semicolons), where +the names optionally may include the path and file extender, so that +under multitasking one can load the font-selector in parallel. +
      +
    Examples: +
      +

    setenv FONTSELECT=FONT_PAL;FONT_SEL
    +setenv FONTSELECT=C:\FONTSEL\FONT_SEL.APP;C:\FONTSEL\FONT_PAL.APP
    +
    +
    But for passive support of the Font protocol, an evaluation of +the above-named FONT_CHANGED and XFONT_CHANGED messages suffices. +
      +
    Negative values in msg[6/7] or a zero in msg[4/5] mean that this +parameter is not required, is not to be set, or has not yet been set. +
      +
    +
    msg[0]   = FONT_SELECT (0x7a19)
    +msg[1]   = apID
    +msg[2]   = 0
    +msg[3]   = Handle of the window whose font is to be set,
    +           or a negative value if the font in all windows
    +           of the application is to be changed
    +msg[4]   = Font ID, or 0
    +msg[5]   = Font size in points (>0) or pixels (<0), or zero
    +           if the parameter is not required (see above)
    +msg[6]   = Font colour
    +msg[7]   = Effects (see above)
    +
    +
    + +

  • +
  • FONT_ACK message: +
    Inform the font-selector about whether the FONT_CHANGED message +could be evaluated, or the font attributes could be set. +
      +

    +
    msg[0]   = FONT_ACK (0x7a1a)
    +msg[1]   = apID
    +msg[2]   = 0
    +msg[3]   = TRUE (1):  Message was evaluated
    +           FALSE (0): Message was ignored
    +msg[4-7] = 0 (reserved)
    +
    +
    +

  • +
+ +

See also: xFSL interface   MagiC font-selection +

+
+ +Home +ProtocolsProtocols +Document History protocolDocument History protocol +GDPS: Gerti's Driver Piping SystemGDPS: Gerti's Driver Piping System + + diff --git a/en/proto_gdps.html b/en/proto_gdps.html new file mode 100644 index 000000000..934e5764f --- /dev/null +++ b/en/proto_gdps.html @@ -0,0 +1,709 @@ + + + + + +The documentation for TOS: GDPS: Gerti's Driver Piping System + + + + + + + + + +Home +ProtocolsProtocols +Font protocolFont protocol +LTL protocolLTL protocol + +
+ +

15.6 GDPS: Gerti's Driver Piping System

+

As of: 1990-08-23 +

+ +
+

15.6.1 General description

+

This driver concept is intended to enable calling of +memory-resident device drivers of various types from any desired +programs. The communication between the programs and the drivers takes +place via a data structure made available by the driver. A fixed +kernel for the data structure is prescribed for this, which must be +adhered to by all drivers that comply with this standard. In addition, +some extensions are possible. From the version numbers the calling +program then can establish if and which extensions of the data +structure are present. All data structures are upwardly compatible. +

+ +
    +
  1. Preliminary remarks +
      +
    All values that require more than 1 byte are defined always in +the order MSB...LSB. The sample codes are formulated in 68000 +Assembler. The description for ATARI ST follows. +
      +

  2. +
+ +

15.6.2 Definition of the driver daisy chain

+

Basis of the GDPS is the vector $41C which is unused by the +operating system. Normally this vector contains 0L. In GDPS this +vector points to the header of the first device driver in the chain. +This header is built up as follows (rAdr=relative Address, S=Size): +

+
     rAdr S  Meaning
+
+      OH  L  Pointer to the next driver header, or 0 in last driver
+             of the chain
+      4H  L  'GDPS' = 0x47445053 magic string as identifier for GDPS
+
+

From this follows the method for linking a driver in and out of +the chain. +

+ +
    +
  1. Linking in of a driver +
      +
    The driver copies the vector placed at 0x41C into its header. +Subsequently it enters the address of its header into 0x41C. +
      +
    Assembler example (to be executed in supervisor-mode): +
      +

        len     header(pe),a0  * Address of the GDPS header
    +    clr.l   (a0)           * Initialize NEXT to 0
    +    cmp.l   0x41C,a0       * = old value
    +    beq     unten          * Yes, no endless chaining!
    +    move.l  0x41C,(a0)     * sonst NEXT eintragen
    +    move.l  a0,0x41C       * and link header into the chain
    +
    +

  2. +
  3. Unlinking of a driver +
      +
    The driver searches the chain for the pointer to its header. It +then replaces it with a pointer found in its header. +
      +
    Assembler example (to be executed in supervisor-mode): +
      +

                   move.l  #0x41C,a0
    +               lea     header(pe),a1
    +   search:     cmp.l   (a0),a1
    +               beq     found
    +               move.l  (a0),a0
    +               bra     search
    +   found:      move.l  (a1),(a0)
    +
    +

  4. +
  5. Searching for a driver +
      +
    Searches for a driver too should be performed in +supervisor-mode. As the operating system does not set the variable +0x41C to 0 at a warm start, one has to check for the magic string for +each vector found. +
      +
    There follows a sample routine in GFA Basic notation that writes +the found and valid vectors into an integer array: +
      +

       DIM vector%(31)                 ! Here addresses of the drivers lie
    +   index%=0                        ! Initialize counter to 0
    +   adr%=SLPEEK($41C)               ! Address of the first driver
    +   WHILE adr%<>0 AND SLPEEK(adr%+4)=$47445053
    +                                   ! Test: Address valid and magic OK?
    +      vector%(index%)=adr%         ! If yes, remember address
    +      inc index%                   ! Increment counter by one
    +   WEND
    +   PRINT index%;" Driver found!"
    +
    +

  6. +
+ +

15.6.3 Data structure

+
 rAdr S  Meaning
+  0H  L  Pointer to the next driver header, or 0 in last driver of
+         the chain
+  4H  L  'GDPS' = 0x47445053 magic string as identifier for GDPS
+  8H  W  100 = Version number (Data structure definition) * 100
+  AH  W  Driver type
+  CH  L  Pointer to driver info, 0-terminated string,  max. 32 chars.
+ 10H  L  Pointer to programmer/Copyright, 0-terminated string, max.
+         32 characters
+ 14H onwards follows the driver-specific data structure.
+
+

15.6.4 Driver types

+

There may be any number of drivers in memory, even drivers of +the same type! +

+

The driver types are first subdivided into groups: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
GroupDriver typeMeaning
0000-0FFGraphical input devices
1100-1FFGraphical output devices
2200-2FFVarious input interfaces (ports)
3300-3FFVarious output interfaces (ports)
4400-4FFI/O interfaces
5500-5FFMass storage
6-F600-FFFReserved
10-FF1000-FFFF'Private' drivers, whose data structure is not
  contained in the DPS definitions
+
+ + +
+

15.6.4.1 Scanner driver group

+

Introduction: With bi-level data, a set bit corresponds +to a pixel that is present. With multi-value data, a 0 corresponds to +`nothing` and with increasing values the relevant colour intensity or +brightness rises. +

+

Warning: With commands in the 10xH group, greyscale +images are inverted! +

+
  14H  W  Scanner description
+          If this WORD contains the value 0 then the scanner/driver is
+          not yet initialized, execute command 105H
+          Bit 0: Bi-level possible
+              1: Dithering possible
+              2: Multi-value possible
+              3: Multi-value and dithering possible
+              4: Bi-level colour possible
+              5: Colour dithering possible
+              6: Multi-value in colour possible
+              7: Multi-value in colour and dithering possible
+              8: Compression of data (see below) possible
+              9: Block-wise return possible
+             10: Single sheet feed with separate command
+             11: Single sheet feed automatic
+             12: Prescan possible
+             13: Virtual memory management possible
+                 (GDPS-Version >= 1.10)
+             14: Reserved (0)
+             15: Reserved (0)
+            Multi-value and dithering: Special mode, always 2 bits/pixel
+  16H  W  Number of colours
+  18H  W  Possible multi-value bit depths
+          Makeup:  Bit 0 set: Monochrome possible
+                   Bit 1 set: 2 grey-steps possible
+                   Bit 2 set: 4 grey-steps possible
+                   Bit 3 set: 8 grey-steps possible
+                   etc...
+  1AH  W  Reserve scanner
+  1CH  W  Command to scanner (0=Ready, 1-FFH reserved!!!)
+  1EH  L  Pointer to command structure
+
+

A scanner driver with its own user interface is assumed here. If +a program wants to address the scanner driver, then this is done as +follows: +

+
   a) Wait until WORD 1AH = 0 (scanner free)
+   b) Reserve scanner be entering a WORD in 1AH
+   c) Create a command structure
+   d) Enter the pointer to the command structure in 1EH
+   e) Enter the command in 1CH
+   f) In an EVENT loop (!!) (timer- or multi-event) wait until the
+      command WORD of the scanner driver is set to 0 again
+   g) Repeat steps from c) onwards as often as required
+   h) Release scanner (enter 0 in 1AH)
+
+

The command structure to be made available by the calling +program has three tasks: +

+
   a) Passsing of the command structure
+   b) Return of a success or error message
+   c) Return of the parameters used
+
+

Makeup of the command structure: +

+
   00H  W  Return value, is initialized by the calling program to 0.
+           After processing the command, the scanner driver enters
+           0xFFFF (=OK) or a positive error-message here.
+           If the scanner is operating in block mode, then 0xFFFE is
+           entered after a block and 0xFFFF after the last block. If
+           working in block mode AND in colour, there are two options:
+           a) The scanner scans the colour separations individually;
+              then the passing will proceed as above, but several
+              times corresponding to the number of colours.
+           b) The scanner scans all colours simultaneously; in that
+              case 0xFFFD is entered after the blocks. The returned
+              block then consists of 'number of colours' equal-sized
+              areas.
+   02H  W  Permitted scan modes. Makeup of this WORD is as for 14H;
+           a set bit denotes that the scanner driver may use the
+           corresponding mode.
+   04H  W  Permitted bit depths (makeup as above for 18H)
+   06H  L  Pointer to memory
+   0AH  L  Number of bytes in memory (Return: Number of bytes used)
+   0EH  W  Bytes per scanline, or 0 (always mod 2!)
+   10H  W  Number of scanlines, or 0
+   12H  W  Width of the image in 1/10 mm, or 0
+   14H  W  Height of the image in 1/10 mm, or 0
+   16H  W  Resolution in main scan direction (X) in dpi, or 0
+   18H  W  Resolution in sub scan direction (Y) in dpi, or 0
+           (For return: Resolution = Resolution * zoom factor!)
+   1AH  W  Modulo value for scanlines (in bytes, e.g. 2 = 2*n bytes
+           per scanline)
+   1CH  W  X-position of the image in 1/10 mm
+   1EH  W  Y-position of the image in 1/10 mm
+
+Since GDPS Version >= 1.10:
+   20H  L  Serial number of the calling program
+   24H  W  (!I)add_bits:(!i) Additional memory required by program (in bits
+           per pixel)
+   26H  L  Pointer to 'Dchange_pointer' (function of the vmm)
+   2AH  L  Pointer to 'Dupdate' (function of the vmm)
+   2EH  W  (!I)v_handle(!i) READ (vmm)
+   30H  W  (!I)v_handle(!i) WRITE (vmm)
+   32H  W  (!I)virt_flag(!i) (1 = vmm being used)
+
+

vmm = virtual memory management +

+

After processing a command the scanner driver enters the +actually used values into this data structure. +

+

If the image size is to remain fixed, then this can be defined +with the WORDS 0EH, 10H or 12H, 14H, 1CH, 1EH. If both value pairs are +preset, the default in bytes will be used. If the scanner is not able +to scan in this format, a change may be made to suitable values if +necessary; therefore, check the return vales!! +

+

Compression: +

+

Bi-level and dither data are always packed in such a way +that 8 pixels are present in a byte. For this the first pixel is +entered in the most significant bit. +

+

Multi-value data are present either uncompressed, in which case +one pixel occupies exactly one byte. Here (with fewer than 256 grey +steps) the data is always formatted to the MS bit, and the LS bits are +filled if appropriate (depending on the scanner with 0 or 1). In +compressed form the multi-value data are packed in such a way that +byte borders are not exceeded; if necessary empty bits are filled with +(depending on the scanner) with 0 or 1: +

+
                 +--+--+--+--+--+--+--+--+
+   2 bits/pixel  |B1|B0|B1|B0|B1|B0|B1|B0|   -> 4 pixels/byte
+                 +--+--+--+--+--+--+--+--+
+
+                 +--+--+--+--+--+--+--+--+
+   3 bits/pixel  |B2|B1|B0|--|B2|B1|B0|--|   -> 2 pixels/byte
+                 +--+--+--+--+--+--+--+--+
+
+                 +--+--+--+--+--+--+--+--+
+   4 bits/pixel  |B3|B2|B1|B0|B3|B2|B1|B0|   -> 2 pixels/byte
+                 +--+--+--+--+--+--+--+--+
+
+                 +--+--+--+--+--+--+--+--+
+   5 bits/pixel  |B4|B3|B2|B1|B0|--|--|--|   -> 1 pixel/byte
+                 +--+--+--+--+--+--+--+--+
+
+                 +--+--+--+--+--+--+--+--+
+   6 bits/pixel  |B5|B4|B3|B2|B1|B0|--|--|   -> 1 pixel/byte
+                 +--+--+--+--+--+--+--+--+
+   etc.
+
+

If the compression bit is not set in the command structure, then +the data are decompressed by the scanner driver if necessary. If the +bit is set, however, then after processing the command one has to test +whether the data are really compressed. +

+

Fixed commands: +

+
   100H: Scan
+           The user dialog is called up, and if appropriate the scan
+           process is performed
+   101H: Continue
+           In block mode this command continues the scan
+   102H: Scan without dialog
+           The scanning process is initiated without further user
+           intervention; the same user-set parameters are used as
+           for the previous scan
+   103H: Next sheet
+           The next sheet is fed in from the single-sheet tray
+   104H: Prescan
+           Executes a prescan with set parameters
+   105H: Initialize scanner/driver
+           Gets device description from scanner
+
+

Commands 102H and 103H are meant specially for automatic optical +character recognition (OCR). +

+

Since GDPS Version 1.10 new commands exist (as above, but +instead of 10xH, 20xH is used). If these commands are used, one can +work in a virtual mode provided virt_flag=1. Furthermore +greyscale images with these commands are delivered as follows: +

+
      0=black
+    255=white
+
+

Warning: With 20xH commands the calling program must +pass the extended command structure according to GDPS 1.10 !!! +

+

Error-messages in return value: +

+
   FFFEH: Block ready, further blocks follow
+   FFFFH: Scan process (possibly for one colour) completed, last (or
+          only) data block is present
+      0H: Wait and have a cup of tea (if appropriate wait with an
+          EVENT loop)
+      1H: Unknown command
+      2H: Scanner error
+      3H: Abort by the user
+      4H: Out of paper (only with single-sheet feed)
+      5H: Out of memory: The user has set too large a paper format
+      6H: Scanner not yet initialized
+
+

The error-messages are displayed to the user of the driver. They +only serve as information for the calling program. +

+

15.6.4.2 GDPS, virtual memory management

+
#define VOR              1
+#define ZURUECK         -1
+#define MITTE            0
+
+/********************************************************************/
+/*                        Scanner structures                        */
+/********************************************************************/
+typedef struct                   /* Passing structure for scanner   */
+{
+   void  *next;                  /* Pointer to the next driver      */
+   char  ident[4];               /* Magic GDPS as driver identifier */
+   int   version;                /* Version number, currently < 200 */
+   int   type;                   /* Driver type, 0 for scanner      */
+   char  *info;                  /* Pointer to driver info and to   */
+   char  *copyright;             /* the Copyright message           */
+   int   devdescr;               /* Device description flags        */
+   int   colours;                /* Number of colours, 0=B/W        */
+   int   deep;                   /* Possible bit-depths             */
+   int   free;                   /* Flag whether scanner is free    */
+   int   scommand;               /* Command to scanner              */
+   void  *command;               /* Pointer to the command structure*/
+} SCANHEADER;
+
+typedef struct                 /* Command structure for GDPI scanners*/
+{
+   int   result;                 /* Result that reports drivers     */
+   int   modes;                  /* Permitted scan modes            */
+   int   depth;                  /* Image depth in bits/pixel       */
+   void  *vmemory:               /* Where image should be placed    */
+   long  vmaxlen;                /* Available memory                */
+   int   bytewidth;              /* Width of a line in bytes        */
+   int   height;                 /* Height of the image in lines    */
+   int   mmwidth;                /* Width (!U)and(!u)               */
+   int   mmheight;               /* Height in 1/10 millimeters      */
+   int   xdpi;                   /* Resolution in X (!U)and(!u)     */
+   int   ydpi;                   /* Y direction                     */
+   int   modulo;                 /* 2=>image becomes word-aligned   */
+   int   start_x;                /* Top left corner X in 1/10 mm    */
+   int   start_y;                /* Top left corner Y in 1/10 mm    */
+   long  ser_no;                 /* Serial number                   */
+
+/****
+The following part is defined only for calls of the scanners with
+the commands of the 0x2XX series
+******/
+   int     add_bits;              /* Specifies how many additional   */
+                                  /* bits are required. For instance */
+                                  /* CRANACH Studio has 2 masks for  */
+                                  /* each image. If one scans a bit- */
+                                  /* map, the program requires not   */
+                                  /* just 1 bit per pixel, but three */
+                                  /* bits. In a similar way, with a  */
+                                  /* greyscale picture one has to    */
+                                  /* calculate 8 + 2 = 10 pixels. If */
+                                  /* this value is not allowed for,  */
+                                  /* then it may happen that after   */
+                                  /* scanning CRANACH Studio can not */
+                                  /* open its window, because though */
+                                  /* memory is available for the     */
+                                  /* scanned image, there is none    */
+                                  /* for the required masks.         */
+                                  /* One needs, for exampple, two    */
+                                  /* additional bits for the mask.   */
+   void *Dchange_pointer;         /* Pointer to this function        */
+   void *Dupdate;                 /* Pointer to that function        */
+   int  read;                     /* Virtual read buffer index       */
+   int  write;                    /* Virtual write buffer index      */
+   int  virt_flag;                /* Flag whether working with       */
+                                  /* virtual memory management(1=yes)*/
+} SCANCOM;
+SCANCOM scancom;
+
+void *Dchange_pointer(
+                        void *pointer,
+                         int v_handle,
+                         int richtung,
+                         long *max_vor,
+                         long *max_zurueck
+                       );
+
+

void Dupdate(int v_handle); +

+

All tms products work with virtual memory management. This means +that it does not have to access memory areas that are present in RAM. +The virtual memory management implemented in tms products was +optimized for the requirements of images. +

+

General procedure: The driver passes in scancom.write a virtual +handle. With this handle one can then access the virtual data. The +data are obtained automatically from the hard drive when required, and +stored. +

+

One possible application would be: +

+

UCHAR *real; +
long max_forward, max_back; +

+

scancom->vmemory points to the free virtual memory. This is +to be treated just like normal memory. so, say, free memory from addr +16MB to addr 50MB with scancom->vmemory = addr 30MB. As this +address does not really exist, the pointer must be mapped to the real +memory and the data loaded from the hard drive. This is achieved with +the function Dchange_pointer. +

+
 real = (UCHAR*)Dchange_pointer(
+                                   scancom->vmemory,
+                                   scancom->write,
+                                   FORWARD,
+                                   &max_forward,
+                                   &max_back
+                                 );
+
+

So real now points to an area of RAM. +

+

scancom->write is the memory handle passed by the +program. +

+

FORWARD tells the memory management that we want to move +as far as possible to the start of the memory. This optimizes disk +accesses. +

+

max_forward returns how many bytes from real one +may move forward in the memory. +

+

max_back returns how many bytes from real one +may move backwards in the memory. +

+

If these limits are reached then Dchange_pointer must be called +anew. The minimum lengths for max_forward and max_back +are: +

+
+ + + + + + + + + + + + + + + + + + +
 FORWARDBACKMID
max_forward:32k0k16k
max_back:0k32k16k
+
+ +

Der Ram Speicher ist in 6 Blöcke unterteilt, von denen jeder +einen he RAM memory is subdivided into 6 blocks, which each can +represent a separate or also an overlapping portion of the virtual +memory. To guarantee with overlapping blocks that after a memory +alteration all blocks will reproduce the current memory contents, call +the function Dupdate(scancom->write). This updates the other +blocks. However, one only needs to use Dupdate before accessing a +different block. For a scanner driver that only uses the block +scancom->write, it suffices therefore to call +Dupdate(scancom->write) at the end of the scanning process. +

+

Sample code for the deletion of 10 MB as of address 32 MB: +

+
v_pointer=32MB
+size=10MB
+
+while(size>0)
+{
+        real=Dchange_pointer(
+                              v_pointer,
+                              scancom->write,
+                              FORWARD,
+                              &max_forward,
+                              &max_back);
+        if(max_forward<=size)
+        {
+                memset(real,0,max_forward);
+                size-=max_forward;
+                v_pointer+=max_forward;
+        }
+        else
+        {
+                memset(real,0,size);
+                size=0;
+                v_pointer+=size;
+        }
+}
+Dupdate(scancom->write);  !!!!!!!!!!!!!
+
+
+
+***************************************************************************
+Old programs call the scanner with the command 0x100 (and not 0x200).
+These programs (e.g. tms CRANACH) also do not yet use virtual memory
+management. Therefore the SCANCOM structure is not defined from the
+position marked onwards. The functions Dchange_pointer or Dupdate
+should then be replaced in the driver by dummy functions.
+
+/********************************************************************/
+
+Possible application as ACC:
+
+/********************************************************************/
+/*    main()                                                        */
+/*                                                                  */
+/*    Heart of the program                                          */
+/********************************************************************/
+
+int main( void )
+{
+   int work_in[12],work_out[58],dummy;
+   int buffer[20];
+
+   appl_id = appl_init();
+
+   /* Open an own workstation */
+   handle=graf_handle(&dummy,&dummy,&dummy,&dummy);
+   for ( dummy=0; dummy<10; work_in[dummy++]=1 );
+   work_in[10]=2;
+   v_opnvwk(work_in,&handle,work_out);
+
+   if(!rsrc_load("SCANNER.RSC"))
+   {
+      form_alert(0,NO_RSC_FILE);
+      goto FOREVER;
+   }
+
+   if( appl_id != -1 )
+   {
+      if( !_app )
+      {
+         scanner_moeglichkeiten();
+         menu_id = menu_register( appl_id, "  SCANNER" );
+         event_loop();   /* Here one waits for the call of the    */
+                         /* driver by the program; the dialog is  */
+                         /* handled, the image is scanned and     */
+                         /* the values placed in vmemory          */
+      }
+
+   }
+FOREVER: /* Initialization has not worked */
+   while(1)
+        evnt_mesag((int*)buffer);
+}
+
+/********************************************************************/
+/* Initialize scanner                  */
+/********************************************************************/
+
+void scanner_moeglichkeiten()
+{
+        long
+                **zeiger;
+        long
+                stack;
+
+/********** Divert pointer to GDPS *******************************/
+
+        stack=Super(0);
+
+        zeiger = (long **)0x41c;
+
+        if(*(*zeiger+1)== 0x47445053l)
+                header.next = *zeiger;
+        else
+                header.next = NULL;
+
+        *zeiger = (void *)&header;
+
+        Super((void *)stack);
+
+/********************************************************************/
+
+        sprintf(header.ident,"GDPS");
+        header.version          =100;
+        header.type             =0;          /* Scanner */
+        header.info             =info;
+        header.copyright        =copyright;
+        header.devdescr         =1 | 2 | 4;  /* Device description flags */
+        header.colours          =1;          /* Number of colours, 0=B/W */
+        header.deep             =1 | 16;     /* Possible bit-depths      */
+        header.free             =0;
+        header.scommand         =0;          /* Command to scanner       */
+        header.command          =&command;
+
+}
+
+
+ +Home +ProtocolsProtocols +Font protocolFont protocol +LTL protocolLTL protocol + + diff --git a/en/proto_ltl.html b/en/proto_ltl.html new file mode 100644 index 000000000..3d0e2b2a0 --- /dev/null +++ b/en/proto_ltl.html @@ -0,0 +1,465 @@ + + + + + +The documentation for TOS: LTL protocol + + + + + + + + + +Home +ProtocolsProtocols +GDPS: Gerti's Driver Piping SystemGDPS: Gerti's Driver Piping System +OLGA protocolOLGA protocol + +
+ +

15.7 LTL protocol

+

With most compilers languages a program has to be first compiled +(i.e. translated from the source text to machine code) and then linked +(i.e. joined up with other program portions and library functions and +saved as a program file) before it can be executed. Load-time linking +(abbreviated 'LTL') omits the last step until the program is to be +executed. Only then does the so-called loader assemble the program, +though without saving it as a program file. Thus the linking process +takes place in RAM, immediately before the execution of the program. +

+

This text desribes a protocol permitting a shell to communicate +with a loader (i.e. a program that implements load-time linking). This +protocol was used for the first time by the development environment +Chatwin and the Oberon-System STJ-Oberon-2. But the protocol has been +constructed in such a way that in principle it can also be used by +other shells and loaders. +

+ +
+ +

15.7.1 The OBNL cookie

+

The communication between shell and loader takes place via a +cookie named OBNL. This points to a routine with which the shell can +call the loader. Hence the cookie must be created by the loader. +

+

The routine to which the OBNL cookie points is defined as +follows: +

+
+
int cdecl obnload ( OBNCOMM *com );
+
+
+

i.e. that the routine passes on the stack a pointer to a OBNCOMM +structure and that the routine returns a 16-bit value in register d0. +

+ +

15.7.2 The OBNCOMM structure

+

The OBNCOMM structure is built up as follows: +

+
+
typedef struct _obncomm
+{
+  int   type;
+  void *ptr;
+  int   chr;
+  void *env;
+} OBNCOMM;
+
+
+

The field type contains one message number at a time. +Depending on this number, the other entries of the structure are then +filled. +

+

'int' is a signed 16-bit integer, 'void *' is a pointer to +'something' i.e. it is not at first specified particularly what type +of data the pointer points to. +

+

15.7.3 LTL messages from the shell to the loader

+

The shell can send the following messages to the loader: +

+
+
+ + + + + + + + + + + + + + + + +
MessageNumber
CL_INIT0x6500
CL_COMMAND0x6501
CL_TIME0x6502
+
+ +
+
+

Messages from the shell to the loader always start with 'CL_'. +

+

Please note: These are not AES messages! The +communication takes place via the routine to which the OBNL cookie +points. +

+

15.7.3.1 CL_INIT

+

With the message CL_INIT the shell inform the loader that it +supports the LTL protocol. At the same time it passes to the loader +the address of a function via which the loader can trigger actions in +the shell. +

+

The function in the shell has the same parameters as the +function to which the OBNL cookie points: +

+
+
int cdecl obnshell ( OBNCOMM *com );
+
+
+
+

Assignment of the OBNCOMM structure: +

+ + + + + + + + + + + + +
type CL_INIT +
  +
ptr Address of the function in the shell +
  +
chr Undefined +
  +
env Undefined +
  + +
+ +

15.7.3.2 CL_COMMAND

+

The shell is to execute a command that requires a load-time +linking. After this it passes on the complete command to the loader. +

+
+

Assignment of the OBNCOMM structure: +

+ + + + + + + + + + + + +
type CL_COMMAND +
  +
ptr Pointer to a NULL-terminated string that contains the complete +command that was input (incl. parameters) +
  +
chr Undefined +
  +
env Pointer to the environment +
  + +
+ +

15.7.3.3 CL_TIME

+

If there has been no user input for some time and the shell also +has nothing to do otherwise, it can inform the loader about this so +that it is free to perform tasks in the background if desired. +

+
+

Assignment of the OBNCOMM structure: +

+ + + + + + + + + + + + +
type CL_TIME +
  +
ptr Undefined +
  +
chr Undefined +
  +
env Undefined +
  + +
+ +

15.7.4 LTL messages from the loader to the shell

+

The loader can send the following messages to the shell: +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
MessageNumber
LC_WRCHAR0x6503
LC_WRSTR0x6504
LC_OUTBUF0x6505
LC_CLOSEWIN0x6506
LC_OPENWIN0x6507
+
+ +
+
+

Messages from the loader to the shell always start with 'LC_'. +

+

Please note: These are not AES messages! The +communication takes place via the routine that the shell has informed +the loader about at CL_INIT. +

+

15.7.4.1 LC_WRCHAR

+

The loader sends to the shell a character that is to be output +on the console. +

+
+

Assignment of the OBNCOMM structure: +

+ + + + + + + + + + + + +
type LC_WRCHAR +
  +
ptr Undefined +
  +
chr The character to be output +
  +
env Undefined +
  + +
+ +

15.7.4.2 LC_WRSTR

+

The loader sends to the shell a NULL-terminated string that is +to be output in the console. +

+
+

Assignment of the OBNCOMM structure: +

+ + + + + + + + + + + + +
type LC_WRSTR +
  +
ptr Pointer to the string to be output +
  +
chr Undefined +
  +
env Undefined +
  + +
+ +

15.7.4.3 LC_OUTBUF

+

The loader directs the shell to output to the console +immediately any characters that may still be left in the buffer. +

+
+

Assignment of the OBNCOMM structure: +

+ + + + + + + + + + + + +
type LC_OUTBUF +
  +
ptr Undefined +
  +
chr Undefined +
  +
env Undefined +
  + +
+ +

15.7.4.4 LC_CLOSEWIN

+

The loader directs the shell to close all windows that may be +open at the time. This call is required at the launch of a GEM +module under Single-TOS. +

+
+

Assignment of the OBNCOMM structure: +

+ + + + + + + + + + + + +
type LC_CLOSEWIN +
  +
ptr Undefined +
  +
chr Undefined +
  +
env Undefined +
  + +
+ +

15.7.4.5 LC_OPENWIN

+

The loader directs the shell to reopen all windows closed +previously with LC_CLOSEWIN. +

+
+

Assignment of the OBNCOMM structure: +

+ + + + + + + + + + + + +
type LC_OPENWIN +
  +
ptr Undefined +
  +
chr Undefined +
  +
env Undefined +
  + +
+ +

15.7.5 Example: Chatwin and STJ-Oberon-2

+

As an example one should show here briefly how Chatwin (shell) +and STJ-Oberon-2 (loader) implement the LTL protocol: +

+
    +
  • The Oberon loader installs the OBNL cookie and then launches +Chatwin. +
      +

  • +
  • Chatwin recognizes by the presence of the cookie that LTL is +desired and declares itself to the loader with the CL_INIT call. +During this Chatwin passes a pointer to a function via which the loader +in turn can trigger actions in Chatwin. +
      +

  • +
  • Whenever Chatwin is directed now to launch a file with the +extension '*.OBJ', it passes this file and any parameters that may be +required via the message CL_COMMAND to the loader. +
      +
    The loader now has to launch the program. If it is dealing with +a TOS program, then it can direct the outputs of this program via +the LC_WRCHAR and LC_WRSTR messages to Chatwin's console window. If it +is dealing with a GEM program, then the loader can direct Chatwin +under Single-TOS to close all its windows (LC_CLOSEWIN message) before +the program is launched. +
      +
    Note: Chatwin recognizes by the extension whether a +load-time linking is to be performed for a given file. In older +versions the extension '*.OBJ' is fixed, as of Chatwin 3.04 the +extension can be specified in the environmental variable $LTLEXT. Due +to this Chatwin is prepared also for other languages that do not use +'*.OBJ' as extensions for the object files. +
      +

  • +
  • If there has been no user input for some time and also there +are no other tasks pending, Chatwin cedes CPU time to the loader by +sending a CL_TIME message. Due to this the loader can perform certain +tasks in the background. +
      +

  • +
  • A special protocol exists for program termination: When Chatwin +is terminated, the loader terminates as well. +
      +

  • +
+ +
+ +Home +ProtocolsProtocols +GDPS: Gerti's Driver Piping SystemGDPS: Gerti's Driver Piping System +OLGA protocolOLGA protocol + + diff --git a/en/proto_olga.html b/en/proto_olga.html new file mode 100644 index 000000000..ae2dbf357 --- /dev/null +++ b/en/proto_olga.html @@ -0,0 +1,4392 @@ + + + + + +The documentation for TOS: OLGA protocol + + + + + + + + + +Home +ProtocolsProtocols +LTL protocolLTL protocol +SE protocolSE protocol + +
+ +

15.8 OLGA protocol

+ + +

The OLGA protocol (Object Linking for +GEM Applications) was developed by Thomas +Much, and permits object linking under GEM too. +

+

As this concept may not be familiar to all readers, first a +possible example of its application: Imagine you are using your +text processor and would like to enhance your document with a graphic. +After placing your graphic in the text, you decide to alter it +slightly. Normally you would have to switch over to your graphics +program, perform the desired changes there, switch back to the text +processor, discard the old graphic, then import and position the new +one. But if both of the applications (i.e. graphics program and text +processor) support the OLGA protocol, the solution of this task could +look as follows: You switch to the graphics program, modify the +graphic there, and after saving it you are finished! Because the text +processor automatically recognizes that the graphic has been +altered, and itself replaces it in the document! +

+

The above example presupposes a multitasking operating system +such as MagiC or MultiTOS. And in fact: Single-TOS systems are not +supported by OLGA (since Rev. 1.0 - earlier versions could also be run +as desk accessories.) Those wanting to involve themselves closer with +the OLGA protocol should take note of the following points: +

+ + +

OLGA works in a document centred manner, i.e. the +protocol is prepared for one application handling multiple documents +(possibly even of different data-types). For controlling the object +linking, use is made of a so-called OLGA-Manager (in short: +Manager). Communication between the applications is transacted wholly +via this Manager (which, by the way, can be present only once +in the system). +

+

The illustration below shows a simple model of OLGA +communication. +

+

+

The actual object linking is realized in OLGA with so-called +links: these are references from the Client to data objects, +or more exactly filenames with absolute path, which are saved +by the Client in a document. If now the Server makes changes to an +object for which a link exists, then the Client is informed of this +(by the Manager), and can then update itself to display the updated +object. +

+

From Rev 1.2 (1996-11-20) onwards, extra functions were added +and the OLGA architecture model now looks like this: +

+

+

The above illustration shows the distribution of services +between the OLGA-Manager and the applications using it (i.e. Client or +Server). During linking, InplaceDrawing and Notification, the correct +balance of communication between Manager and application for the +embedding is the sole responsibility of the Client application. +

+

Finally, the Info files are co-ordinated by the Manager but then +operate directly between Server and Client applications. Schematically +communications are handled something like this: +

+

+

See also: AV protocol   Drag&Drop protocol +

+

15.8.1 OLGA initialization

+

Initialization and termination with OLGA +

+

The OLGA protocol corresponds to the OLE protocol, which enables +object embedding with OEP (object exchange protocol) and object +linking with OLGA. As it may be sensible to support both variants in +an application, both protocols (i.e. OLGA und OEP) are +initialized with the same messages, possibly simultaneously(!) +

+

The routines required to register and deregister themselves run +as follows: +

+
    +
  • OLE_EXIT     Disengage from the protocol +
  • +
  • OLE_INIT     Register application with the Manager +
  • +
  • OLE_NEW      Manager was launched in parallel +
  • +
  • OLGA_INIT    Verification of registration with OLE_INIT. +
  • +
+ +

As already mentioned. the communication between the OLGA +applications proceeds via a Manager, whose AES ID for the message +exchange has to be ascertained. The recipe for this runs as follows: +

+

· 1: The application requires OLE (i.e. OEP and OLGA) +

+ + + + + + + + + + + + + +
(a) If appl_find("OLEMANGR") is successful the Manager +has already been located. +
  + + +
(b) Otherwise the environmnetal variable OLEMANAGER is evaluated. +This can contain a complete access path! First of all the program name +for appl_find is extracted and then proceeds as for (a). If the name +cannot be ascertained the program indicated by OLEMANAGER is launched +using shel_write. +
  + +
(c) If the above has not been successful, there is obviously no +OLE-Manager and one may have to make do with the OLGA protocol. To do +this (similar to (a)) an appl_find("OLGA ") as well +as appl_find("OEP_SERV") is performed and two Managers +must now be supported! +
  + + + + +
(d) If all else fails the environmental variables OLGAMANAGER and +OEPSERVER, as under (b) are evaluated. +
  + +
+ +

2: The application only requires OLGA +

+
+

The process proceeds as for (1), except the sequence is altered +to (c), (d), (a) and (b). However, OEP_SERV and OEPSERVER are not +evaluated because it's unlikely an OEP-Server will understand the +OLGA-Protocol. +

+
+

See also: OLGA protocol   AV protocol   Drag&Drop protocol +

+

15.8.2 OLGA-Client

+

An OLGA-Client is an application capable of editing objects used +in other applications. Note that applications can be both Client and +Server simultaneously; this doesn't cause problems and is highly +desireable in most cases. +

+

The following messages can be sent to or received from an +OLGA-Client: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OLGA_CLOSEDOC Indicates closing of a document +
OLGA_GETINFO Obtains index number for an Info file +
OLGA_LINK Indicates inclusion of a file in a document +
OLGA_LINKBROKEN Reference to an object is no longer available +
OLGA_LINKRENAMED Reference to an object has been updated +
OLGA_OPENDOC Registers document with Manager +
OLGA_RENAMELINK Updates reference to an object +
OLGA_START Launches Server for a Client in parallel +
OLGA_UPDATED Server has altered a file +
OLGA_UNLINK Terminates monitoring of a file +
OLGA_SERVERTERMINATED Server has terminated + +
+ +

Warning: One has to point out here that in view of +future operating system versions, memory regions used for +communication between various programs or assigned via pointers have +to be global (Mxalloc function with Global flag set). Otherwise, +memory protection violation would occur if used on computers with +PMMUs (e.g. Atari-TT030 or Falcon030). +

+

See also: Minimum requirements   OLGA protocol   OLGA-Server +

+

15.8.3 OLGA-Server

+

An OLGA-Server is an application capable of creating and editing +objects. Note that applications can be both Client and Server at the +same time; this doesn't cause problems and is highly desireable in +most cases. +

+

The following messages can be sent to or received from an +OLGA-Server: +

+ + + + + + + + + + + + + + + +
OLGA_BREAKLINK Breaks link to an object +
OLGA_INFO Reply to an OLGA_GETINFO message +
OLGA_RENAME Reports name change of an object +
OLGA_UPDATE Reports change to an object +
OLGA_CLIENTTERMINATED Reports Client terminated + +
+ +

Warning: One has to point out here that in view of +future operating system versions, memory regions used for +communication between various programs or assigned via pointers have +to be global (Mxalloc function with Global flag set). Otherwise, +memory protection violation would occur if used on computers with +PMMUs (e.g. Atari-TT030 or Falcon030). +

+

See also: Minimum requirements   OLGA protocol   OLGA-Client +

+

15.8.4 OLGA_BREAKLINK

+ + + + + + + + + + + + + + + +
Name: »OLGA_BREAKLINK« - Break link to an object. +
  +
Number: 0x1244 +
  +
Description: This message is sent by the Server to the Manager when it +deletes a file, or otherwise makes it unusable for the Client. +
  +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
Word 0Message number (0x1244)
Word 1AES-ID of the own program
Word 20
Word 3+4Pointer to filename, including absolute path
Word 50
Word 60
Word 70
+
+ +
Note: The Manager subsequently informs all Clients that +have set a link to this file about the break. +
  +
The Server subsequently receives a reply from the Manager, so +that it can be certain that its intention was understood. +
  +
Group: OLGA-Server +
  +
See also: OLGA_INFO   OLGA_RENAME   OLGA_UPDATE +
  + +
+ +

15.8.4.1 OLGA_BREAKLINK, Response to

+

This message is received by the Server as a reply to a sent +OLGA_BREAKLINK message: +

+
Word 0   = OLGA_ACK (0x1239)
+Word 1   = apID
+Word 2   = 0
+Word 3+4 = Exactly the same value from OLGA_BREAKLINK
+Word 5   = 0
+Word 6   = 0
+Word 7   = OLGA_BREAKLINK
+
+

15.8.5 OLGA_INFO

+ + + + + + + + + + + + + + + +
Name: »OLGA_INFO« - Reply to an OLGA_GETINFO message. +
  +
Number: 0x1248 +
  +
Description: This message is to be uderstood as a reply to OLGA_GETINFO, and +is sent by the Server directly to the Client. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
Word 0Message number (0x1248)
Word 1AES ID of the program
Word 20
Word 3+4Pointer to the complete Info filename,
 including absolute path
Word 5Index number of the desired Info file
Word 60
Word 70
+
+ +
Note: Before sending this message the Server may have to +construct the associated Info file if this is not present already. A +Client however must not rely on the receipt of this reply, +since the Server may have been terminated in the meantime; in addition +it may make only a read access to the file. +
  +
As soon as the Client has closed the Info file again, it sends a +reply to the Server, so that it may possibly delete this file again. +
  +
Group: OLGA-Server +
  +
See also: OLGA_BREAKLINK   OLGA_RENAME   OLGA_UPDATE +
  + +
+ +

15.8.5.1 OLGA_INFO, Response to

+

This message is received by the Server as a reply to a sent +OLGA_INFO message: +

+
Word 0   = OLGA_ACK (0x1239)
+Word 1   = apID
+Word 2   = 0
+Word 3+4 = Exactly the same value from OLGA_INFO
+Word 5   = Index number of desired Info file
+Word 6   = 0
+Word 7   = OLGA_INFO
+
+

15.8.6 OLGA_RENAME

+ + + + + + + + + + + + + + + +
Name: »OLGA_RENAME« - Report name change of an object. +
  +
Number: 0x123a +
  +
Description: This message is sent by the Server to the Manager if the user +has renamed or moved a file in the Server. The following apply: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
Word 0Message number (0x123a)
Word 1AES ID of the program
Word 20
Word 3+4Pointer to the old filename including absolute
 path
Word 5+6Pointer to the new filename including absolute
 path
Word 70
+
+ +
Note: It is up to the discretion of the Server whether +it sends this message after the 'Save as...' command. It would be +sensible in any case if the Server adopts the new path specification, +or new filename, for the the document. Though links should exist only +for files on non-interchangeable media, in practice this may +be difficult or impossible to achieve. If the contents of the file has +changed, then additionally the message OLGA_UPDATE has to be sent. +
  +
The Server subsequently receives a reply, to which it can react +for instance by releasing the old memory area. Incidentally, the +confirmation only means that the Manager has passed on the renaming; +if the Client does not react to this, then the corresponding link is +dead, i.e. it can no longer be supervised! +
  +
Group: OLGA-Server +
  +
See also: OLGA_BREAKLINK   OLGA_INFO   OLGA_UPDATE +
  + +
+ +

15.8.6.1 OLGA_RENAME, Response to

+

This message is received by the Server as a reply to a sent +OLGA_RENAME message: +

+
Word 0   = OLGA_ACK (0x1239)
+Word 1   = apID
+Word 2   = 0
+Word 3+4 = Exactly the same value from OLGA_RENAME
+Word 5+6 = Exactly the same value from OLGA_RENAME
+Word 7   = OLGA_RENAME
+
+

15.8.7 OLGA_UPDATE

+ + + + + + + + + + + + + + + +
Name: »OLGA_UPDATE« - Report change to an object. +
  +
Number: 0x1238 +
  +
Description: This message has to be sent by the Server to the Manager when +it has saved a file. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
Word 0Message number (0x1238)
Word 1AES ID of the program
Word 20
Word 3+4Pointer to the complete filename, including
 absolute path
Word 50, or Server-internal (unique) index number,
 in the case that an Info file is available
 or can be created
Word 60
Word 70
+
+ +
Note: The handling is presently not +case-sensitive, i.e. it makes no difference whether the filename is in +capitals or lower case, so that the linking does not fail with +differing user input. However, this will not be the case any more in +later versions (for use with alternative filesystems). +
  +
The Server subsequetly receives a reply, to which it can react +for instance by releasing the old memory area reserved for the +filename. +
  +
Group: OLGA-Server +
  +
See also: OLGA_BREAKLINK   OLGA_INFO   OLGA_RENAME +
  + +
+ +

15.8.7.1 OLGA_UPDATE, Response to

+

This message is received by the Server as a reply to a sent +OLGA_UPDATE message: +

+
Word 0   = OLGA_ACK (0x1239)
+Word 1   = apID
+Word 2   = 0
+Word 3+4 = Exactly the same value from OLGA_UPDATE
+Word 5   = 0
+Word 6   = 0
+Word 7   = OLGA_UPDATE
+
+

15.8.8 OLGA_CLIENTTERMINATED

+ + + + + + + + + + + + + + + +
Name: »OLGA_CLIENTTERMINATED« - A Client was terminated. +
  +
Number: 0x1255 +
  +
Description: If a Client is terminated that was started by a Server using +OLGA_START, the Server receives the following message: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
Word 0Message number (0x1255)
Word 1Manager ID (manID)
Word 20
Word 3AES ID of the terminated Client(s)
Word 4Number of Clients the Server is still
 using (>= 0)
Word 50
Word 60
Word 71, if Server already ran with OLGA_START;
 otherwise 0
+
+ +
Note: This function was added as of Rel. 1.2. +
  +
Group: OLGA-Server +
  +
See also: OLGA_START +
  + +
+ +

15.8.9 OLGA_CLOSEDOC

+ + + + + + + + + + + + + + + +
Name: »OLGA_CLOSEDOC« - Indicate closing of a document. +
  +
Number: 0x123c +
  +
Description: This message should be sent by the Client to the OLGA- Manager +when a document is closed. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
Word 0Message number (0x123c)
Word 1AES ID of the program
Word 20
Word 30
Word 40
Word 5Group ID of the document
Word 60
Word 70
+
+ +
Note: The Manager can then delete all links with the +corresponding group number. Although this could be done with +individual OLGA_UNLINK calls as well, this is a much simpler way for +releasing the Manager-internal structures. +
  +
The message must not be used at program termination, as +OLE_EXIT already causes all the required actions to be taken. As a +reply, the Client receives a simple confirmation. +
  +
Group: OLGA-Client +
  +
See also: OLGA_GETINFO   OLGA_LINK   OLGA_LINKBROKEN   OLGA_OPENDOC   +OLGA_LINKRENAMED   OLGA_START   OLGA_UPDATED   OLGA_UNLINK +
  + +
+ +

15.8.9.1 OLGA_CLOSEDOC, Response to

+

This message is received by a Client as a reply to a sent +OLGA_CLOSEDOC message: +

+
Word 0   = OLGA_ACK (0x1239)
+Word 1   = apID
+Word 2   = 0
+Word 3   = 0
+Word 4   = 0
+Word 5   = Group ID of the document
+Word 6   = 0
+Word 7   = OLGA_CLOSEDOC
+
+

15.8.10 OLGA_GETINFO

+ + + + + + + + + + + + + + + +
Name: »OLGA_GETINFO« - Obtain index number for an Info file. +
  +
Number: 0x1247 +
  +
Description: With this message a Client can inquire directly of the Server +for an index number of an Info file, provided this has made one known at +OLGA_UPDATE. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
Word 0Message number (0x1247)
Word 1AES ID of the program
Word 20
Word 30
Word 40
Word 5Index number of the desired Info file
Word 60
Word 70
+
+ +
Note: After the receipt of this message the Server can +construct the corresponding file if this is not present yet. +Additionally one should note that the passed index number may be +invalid, in which case it must be ignored by the Server. +
  +
Group: OLGA-Client +
  +
See also: OLGA_CLOSEDOC   OLGA_LINK   OLGA_LINKBROKEN   OLGA_OPENDOC   +OLGA_LINKRENAMED   OLGA_RENAMELINK   OLGA_START   OLGA_UPDATED   +OLGA_UNLINK +
  + +
+ +

15.8.11 OLGA_LINK

+ + + + + + + + + + + + + + + +
Name: »OLGA_LINK« - Indicate inclusion of a file in a document +
  +
Number: 0x123d +
  +
Description: This message has to be sent by the Client to the Manager if +this has incorporated a file in one of its documents. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
Word 0Message number (0x123d)
Word 1AES ID of the program
Word 20
Word 3+4Pointer to filename to be monitored,
 including absolute path
Word 5Group ID of the document
Word 60
Word 70
+
+ +
Note: If the specified file is altered by an OLGA-Server (or +an AV_PATH_UPDATE message is received from a program which is not a +Server), then the Client receives a corresponding OLGA_UPDATED +message. +
  +
As confirmation the Client receives from the Manager a +corresponding reply. +
  +
Group: OLGA-Client +
  +
See also: OLGA_CLOSEDOC   OLGA_GETINFO   OLGA_LINKBROKEN   +OLGA_LINKRENAMED   OLGA_OPENDOC   OLGA_RENAMELINK   OLGA_START   +OLGA_UPDATED   OLGA_UNLINK +
  + +
+ +

15.8.11.1 OLGA_LINK, Response to

+

This message is received by a Client as a reply to a sent +OLGA_LINK message: +

+
Word 0    = OLGA_ACK (0x1239)
+Word 1    = apID
+Word 2    = 0
+Word 3+4  = Exactly the same value from OLGA_LINK
+Word 5    = Group ID of the document
+Word 6    = 0=Error, otherwise: Link established
+Word 7    = OLGA_LINK
+
+

15.8.12 OLGA_LINKBROKEN

+ + + + + + + + + + + + + + + +
Name: »OLGA_LINKBROKEN« - Reference to an object is no longer +available. +
  +
Number: 0x1245 +
  +
Description: This message is received by the Client from the Manager when a +file is no longer available to it (e.g. because it has been deleted). +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
Word 0Message number (0x1245)
Word 1AES ID of the program
Word 20
Word 3+4Pointer to the old filename including absolute
 path
Word 5Group ID of the document
Word 60
Word 70
+
+ +
Note: The Client can subsequently inform the user about +this, or open a file-selector to permit another file to be chosen. In +addition it ought to dissolve the now invalid link with a OLGA_UNLINK +message. +
  +
Group: OLGA-Client +
  +
See also: OLGA_CLOSEDOC   OLGA_GETINFO   OLGA_LINK   OLGA_LINKRENAMED   +OLGA_OPENDOC   OLGA_RENAMELINK   OLGA_START   OLGA_UPDATED   +OLGA_UNLINK +
  + +
+ +

15.8.13 OLGA_LINKRENAMED

+ + + + + + + + + + + + + + + +
Name: »OLGA_LINKRENAMED« - Reference to an object has been updated. +
  +
Number: 0x1241 +
  +
Description: This message must be sent by the Client to the Manager as the +reply to a OLGA_RENAMELINK message. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
Word 0Message number (0x1241)
Word 1AES ID of the program
Word 20
Word 3+4Pointer to the old filename including the
 absolute path
Word 5+6Pointer to the new filename including the
 absolute path
Word 7Group ID of the document
+
+ +
Note: If this reply is missing then the corresponding +link is dead, i.e. it can not be supervised any more, since +the old name is still stored in the Manager. +
  +
Group: OLGA-Client +
  +
See also: OLGA_CLOSEDOC   OLGA_GETINFO   OLGA_LINK   OLGA_LINKBROKEN   +OLGA_OPENDOC   OLGA_RENAMELINK   OLGA_START   OLGA_UPDATED   +OLGA_UNLINK +
  + +
+ +

15.8.14 OLGA_OPENDOC

+ + + + + + + + + + + + + + + +
Name: »OLGA_OPENDOC« - Register document with Manager. +
  +
Number: 0x123b +
  +
Description: This message can be sent by the Client to the Manager when a +document has been opened. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
Word 0Message number (0x123b)
Word 1AES ID of the program
Word 20
Word 30
Word 40
Word 5Group ID
Word 60
Word 70
+
+ +
Note: Currently offered for information purposes only, +the required internal structures are set by the Manager or on receipt +of the first OLGA_LINK message. The group ID is a number unique within +the Client which it can choose freely, with which the links within the +Client can be assigned to documents; if possible, it should be +specified in all cases, as it is required for the links. +
  +
Group: OLGA-Client +
  +
See also: OLGA_CLOSEDOC   OLGA_GETINFO   OLGA_LINK   OLGA_LINKBROKEN   +OLGA_LINKRENAMED   OLGA_RENAMELINK   OLGA_START   OLGA_UPDATED   +OLGA_UNLINK +
  + +
+ +

15.8.15 OLGA_RENAMELINK

+ + + + + + + + + + + + + + + +
Name: »OLGA_RENAMELINK« - Update reference to an object. +
  +
Number: 0x1240 +
  +
Description: This message is received by the Client from the Manager when +the Server has renamed or moved a file to which a link is set. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
Word 0Message number (0x1240)
Word 1AES ID of the program
Word 20
Word 3+4Pointer to the old filename including the
 absolute path
Word 5+6Pointer to the new filename including the
 absolute path
Word 7Group ID of the document
+
+ +
Note: This message should only direct the Client to +update its internal reference; the document does not have to +be redrawn. Incidentally, the pointer to the new name remains valid as +long as the link exists. +
  +
As reply to this message the Client has to send an +OLGA_LINKRENAMED message to the Manager, so that it can opdate its +reference and release surplus memory. +
  +
Group: OLGA-Client +
  +
See also: OLGA_CLOSEDOC   OLGA_GETINFO   OLGA_LINK   OLGA_LINKBROKEN   +OLGA_LINKRENAMED   OLGA_OPENDOC   OLGA_START   OLGA_UPDATED   +OLGA_UNLINK +
  + +
+ +

15.8.16 OLGA_START

+ + + + + + + + + + + + + + + +
Name: »OLGA_START« - Launch Server for a Client in parallel. +
  +
Number: 0x1246 +
  +
Description: With this message a Client can start up a suitable Server. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
Word 0Message number (0x1246)
Word 1AES ID of the program
Word 20
Word 3One of the OLS values:
 0x0001 = OLS_TYPE
 0x0002 = OLS_EXTENSION
 0x0003 = OLS_NAME
Word 4+5Specification of program to be launched,
 or program type (depending on WORD 3)
Word 6+7Pointer to command line (actually only the
 file to be loaded), or NULL
+
+ +
Note: To launch the program, the configuration file +'olga.inf' is evaluated (at OLS_TYPE and OLS_EXTENSION). The Server found there +is first looked for in memory, and if successful called with VA_START. +Otherwise, in a multitasking environment such as MagiC or MultiTOS +etc. it is launched in parallel with shel_write. +
  +
As confirmation one gets a simple reply, as well as a further +message, to make it easier to release the command line (if this was not +NULL). +
  +
Group: OLGA-Client +
  +
See also: OLGA_CLOSEDOC   OLGA_GETINFO   OLGA_LINK   OLGA_LINKBROKEN   +OLGA_LINKRENAMED   OLGA_OPENDOC   OLGA_RENAMELINK   OLGA_UPDATED   +OLGA_UNLINK +
  + +
+ +

15.8.16.1 OLGA_START, Response to

+

This message is received by the Client as a reply to a sent +OLGA_START message: +

+
Word 0   = OLGA_ACK (0x1239)
+Word 1   = apID
+Word 2   = 0
+Word 3   = OLS value from OLGA_START
+Word 4+5 = Exactly the same value as for OLGA_START
+Word 6   = 0=Error, otherwise: Server started
+Word 7   = OLGA_START
+
+

15.8.16.2 OLGA_START, Response2 to

+

This message too is received by the Client as a reply to a +sent OLGA_START message: +

+
Word 0   = OLGA_ACK (0x1239)
+Word 1   = apID
+Word 2   = 0
+Word 3   = 0 (!)
+Word 4+5 = Exactly the same value as for OLGA_START [6]+[7]
+Word 6   = 0=Error, otherwise: Server started
+Word 7   = OLGA_START
+
+

15.8.16.3 OLS_TYPE

+

OLS_TYPE (0x0001): +
Word[4] = 0 +
Word[5] contains an XAcc program type +

+

15.8.16.4 OLS_EXTENSION

+

OLS_EXTENSION (0x0002): +
WORDs 4,5 contains a file extension (e.g. '.GEM') +

+

15.8.16.5 OLS_NAME

+

OLS_NAME (0x0003): +
WORD[4,5] contains a pointer to the absolute filename of +the application to be started. +

+

15.8.17 OLGA_UPDATED

+ + + + + + + + + + + + + + + +
Name: »OLGA_UPDATED« - Server has altered a file. +
  +
Number: 0x123f +
  +
Description: This message is received by the Client from the Manager when +the Server has altered a file to which a link is set. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
Word 0Message number (0x123f)
Word 1AES ID of the program
Word 20
Word 3+4Pointer to filename, including the absolute
 path of the file which has been changed
Word 50, or an index number, if an Info file
 can be obtained
Word 6AES identifier of the Server
Word 7Group ID of the document
+
+ +
Note: When the Client receives this message, it +therefore should display the associated document anew. Incidentally, +the pointer remains valid as long as the link exists. +
  +
The identifier of the Server (WORD 6) is guaranteed to be set if +WORD 5 has a non-zero value. To this ID (i.e. directly to the +Server) one can then send an OLGA_GETINFO message. +
  +
Group: OLGA-Client +
  +
See also: OLGA_CLOSEDOC   OLGA_GETINFO   OLGA_LINK   OLGA_LINKBROKEN   +OLGA_LINKRENAMED   OLGA_OPENDOC   OLGA_RENAMELINK   OLGA_START   +OLGA_UNLINK +
  + +
+ +

15.8.18 OLGA_UNLINK

+ + + + + + + + + + + + + + + +
Name: »OLGA_UNLINK« - Terminate monitoring of a file. +
  +
Number: 0x123e +
  +
Description: This message must be sent from the Client to the Manager when +the monitoring of a given file is to be terminated. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
Word 0Message number (0x123e)
Word 1AES ID of the program
Word 20
Word 3+4Pointer to filename which is no longer to
 be monitored, including absolute path
Word 5Group ID of the document
Word 60
Word 70
+
+ +
Note: If the document is closed, then OLGA_CLOSEDOC +should be sent instead. If the Client terminates, then all the +corresponding links will be deleted automatically with OLE_EXIT. +
  +
The specified filename must correspond exactly with the +character string passed at OLGA_LINK. As confirmation the Client +receives a suitable reply. +
  +
Group: OLGA-Client +
  +
See also: OLGA_CLOSEDOC   OLGA_GETINFO   OLGA_LINK   OLGA_LINKBROKEN   +OLGA_LINKRENAMED   OLGA_OPENDOC   OLGA_RENAMELINK   OLGA_START   +OLGA_UPDATED +
  + +
+ +

15.8.18.1 OLGA_UNLINK, Response to

+

This message is received by a Client as reply to a sent +OLGA_UNLINK message: +

+
Word 0    = OLGA_ACK (0x1239)
+Word 1    = apID
+Word 2    = 0
+Word 3+4  = Exactly the same value as for OLGA_UNLINK
+Word 5    = Group ID of the document
+Word 6    = 0=Error, otherwise: Link removed
+Word 7    = OLGA_UNLINK
+
+

15.8.19 OLGA_SERVERTERMINATED

+ + + + + + + + + + + + + + + +
Name: »OLGA_SERVERTERMINATED« - Server terminated. +
  +
Number: 0x123e +
  +
Description: If a Server terminates, all clients this Server called via +OLGA_START are sent the following message: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
Word 0Message number (0x123e)
Word 1AES ID of Manager program (manID)
Word 20
Word 3AES ID of terminated Server
Word 4+5Extension, or (0,XAcc type), or NULL
Word 6Reserved
Word 70
+
+ +
Depending on which mode the Server was running in parallel, +WORDs 4+5 will contain different values. If started with OLS_EXTENSION +they will contain the extension, if started with OLS_TYPE WORD 4=0 and +WORD 5 contains the XAcc program type. If started with OLS_NAME both +fields are nulled. +
  +
Note: This function was added as of Rel. 1.2 +(1996-11-20). +
  +
Group: OLGA-Client +
  +
See also: OLGA_CLOSEDOC   OLGA_GETINFO   OLGA_LINK   OLGA_LINKBROKEN   +OLGA_LINKRENAMED   OLGA_OPENDOC   OLGA_RENAMELINK   OLGA_START   +OLGA_UPDATED +
  + +
+ +

15.8.20 Server minimum requirement

+

An OLGA-Server must do at least the following: +

+
· Send OLE_INIT
+· Evaluate OLE_NEW
+· Receive OLGA_INITSend OLE_EXIT
+· Support VA_START
+
+

In order for the Server to really function as such the +OLGA_UPDATE message must also be sent. +

+

15.8.21 Client minimum requirement

+

An OLGA-Client must do at least the following: +

+
· Send OLE_INIT
+· Evaluate OLE_NEW
+· Receive OLGA_INITSend OLE_EXIT
+· On receiving OLGA_RENAMELINK reply with OLGA_LINKRENAMED
+· On receiving OLGA_LINKBROKEN reply with OLGA_UNLINK
+
+

15.8.22 OLE_EXIT

+ + + + + + + + + + + + + + + +
Name: »OLE_EXIT« - Disengage from the protocol. +
  +
Number: 0x4951 +
  +
Description: This message should be sent at program termination to the +Manager. +
  +

+
+ + + + + + + + + + + + + + + + +
ParameterMeaning
Word 0Message number (0x4951)
Word 1AES ID of the program
Word 2-70
+
+ +
Note: Moreover, the message is sent to the applications +by the Manager when this terminates. If the terminating program is an +OLGA-Client all corresponding links and documents are deleted. +
  +
Group: OLGA initialization +
  +
See also: OLE_INIT   OLE_NEW   OLGA_INIT +
  + +
+ +

15.8.23 OLE_INIT

+ + + + + + + + + + + + + + + +
Name: »OLE_INIT« - Register application with the Manager. +
  +
Number: 0x4950 +
  +
Description: This message must be sent to the OLGA-Manager if one has been +found, and ensures that the relevant application is known to the +Manager. +
  + +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
Word 0Message number (0x4950)
Word 1AES ID of the program
Word 20
Word 3Bitmap for OLGA:
 0x0001 = OL_SERVER
 0x0002 = OL_CLIENT
 0x1000 = OL_PIPES
Word 4Maximum level of the protocol understood
 by the application (currently 0)
Word 5Only for OEP: Bitmap, OL_OEP set
Word 6Only for OEP: Reserved (0)
Word 7Machine-readable XAcc program type (or 0)
 with following meaning:
 "WP" = Word processing
 "DP" = DTP
 "ED" = Text editor
 "DB" = Database
 "SS" = Spreadsheet
 "RG" = Raster image editor
 "VG" = Vector image editor
 "GG" = General graphics program
 "MU" = Music application
 "CD" = Computer Aided Design
 "DC" = Data communication
 "DT" = Desktop
 "PE" = Programming environment
+
+ +
Note: If a protocol is not supported by the application +then the WORDs 3 and 4 or 5 and 6 should be nulled. Depending on the +protocol chosen, one then receives from the Manager an OEP_CONFIG +and/or an OLGA_INIT message and one should then proceed as in the +descriptions of the relevant protocol. +
  +
Group: OLGA initialization +
  +
See also: OLE_EXIT   OLE_NEW   OLGA_INIT +
  + +
+ +

15.8.24 OLE_NEW

+ + + + + + + + + + + + + + + +
Name: »OLE_NEW« - Manager was launched in parallel. +
  +
Number: 0x4952 +
  +
Description: This message is sent by the Manager to all reachable +applications when it has been started in parallel (only applies in a +multitasking environment). +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
Word 0Message number (0x4952)
Word 1AES ID of the program
Word 20
Word 3Bitmap:
 0x1000 = OL_PIPES
 0x2000 = OL_START
 0x4000 = OL_MANAGER
Word 4Maximum level of OLGA protocol understood
Word 5Only for OEP: OL_OEP (0x001) set,
 if the Manager handles OEP
Word 6Only for OEP: 0, reserved
Word 7Manager version number, where for example
 0x0120 equates to 1.20
+
+ +
After receipt and evaluation of this message an application +should send a OLE_INIT message. The values in OLE_NEW do not +replace the reply from OEP_CONFIG/OLGA_INIT, which are for information +only! (For example, if a new Manager only supports one of the +protocols, the old Manager may continue to be used). +
  +
Group: OLGA initialization +
  +
See also: OLE_EXIT   OLE_INIT   OLGA_INIT +
  + +
+ +

15.8.25 OLGA_INIT

+ + + + + + + + + + + + + + + +
Name: »OLGA_INIT« - Verification of registration with OLE_INIT. +
  +
Number: 0x1236 +
  +
Description: This message is sent as reply to an OLE_INIT message as +verfification. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
Word 0Message number (0x1236)
Word 1AES ID of the program
Word 20
Word 3Bitmap (OL_MANAGER set):
  
 0x1000 = OL_PIPES
 0x2000 = OL_START
 0x4000 = OL_MANAGER
 0x8000 = OL_IDLE
Word 4Level of the protocol available
Word 50
Word 60
Word 70 = Error, else: All OK
+
+ +
Note: Applications should use the OLGA mechanism only +after they have received this message and this has not signalled an +error. +
  +
Exception: With programs that already open documents +during their startup phase, it may be sensible to use this protocol +even without receiving this message; but in that case any +errors arising in the application will not be reported by the Manager. +
  +
Group: OLGA initialization +
  +
See also: OLE_EXIT   OLE_INIT   OLE_NEW +
  + +
+ +

15.8.26 OLGA Info file format

+

The OLGA protocol enables the exchange of speciallised +information between Client and Server with so-called Info +files. These files contain two types of data structures: +

+ + +

Note: Please do not confuse these files with OLGA.INF! +

+
InfHeader
+BlockHeader 1
+Daten 1
+BlockHeader 2
+Daten 2
+...
+...
+BlockHeader n-1
+Daten n-1
+BlockHeader n (id=0)
+
+

The file end (and consequently block n) is identified by an ID +with the value 0. Some of the subsequent block IDs are already +defined. In detail: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDMeaning
'AUTH'Author: The coding corresponds to 'REM ' (see below),
 though it should be restricted to a single (0-terminated)
 line
  
'DATE'Date of the last change as DOSTIME structure
'KEYW'Keywords: Coding coresponds to 'REM ' (see below);
 within lines the keywords are separated using commas
  
'REM 'Comments: Individual lines are NULL-terminated, the end
 will be recognised by the length (so empty lines can be
 sent as well)
  
0x00000000File end: So the component length of the OLGABlockHeader
 structure should have the value 0
+
+ +

Warning: This naturally does not establish at +all which blocks in general (or in what sequence) are actually +saved. Thus unknown blocks have to be ignored (i.e. jumped over). New +block IDs can be defined freely; but to avoid collisions with already +existing IDs, it is best if programmers first contact the OLGA developer. +

+

See also: OLGA protocol   OLGA-Client   OLGA-Server +

+

15.8.27 OLGAInfHeader

+
typedef struct
+{
+    LONG magic;    /* Identifier: 'OLGA'                 */
+    WORD version;  /* Version number (at present 0x0120) */
+    WORD skip;     /* Number of following header bytes   */
+                   /* which must be skipped, currently 0 */
+} OLGAInfHeader;
+
+

15.8.28 OLGABlockHeader

+
typedef struct
+{
+    LONG id;       /* Block-ID */
+    LONG length;   /* Number of data bytes following */
+} OLGABlockHeader;
+
+

15.8.29 InplaceDrawing for OLGA (ID-4)

+

This function is one of a set added to OLGA in Rev 1.2 +(1996-11-20). +

+

For InplaceDrawing ('ID4-OLGA', 'ID4') to function, the +OLGA-Manager must be correctly installed and OLGA.INF must be properly +structured (containing the [Extensions] and [Objects] sections). +ID4-Server and -Clients are entirely normal OLGA-Server and +OLGA-Clients, which additionally support the ID4-Client and ID4-Server +protocols. +

+

15.8.29.1 ID4-Client

+ +

ID4-Clients embed objects in its documents (which is why these +Clients are also called 'Container applications'). A Client uses the +function OLGA_GETOBJECTS to ascertain all the ID4-objects in OLGA.INF +which could, for example, display the following dialog: +

+

+

For each object that is to be embedded, an ID4-Client must put +the following structure in global memory (see also OLGA.H and +OLGA.INC): +

+ +
typedef struct ObjectInfo
+{
+ char  *Filename;
+ AESPB *ClientGEMPB;
+ long   ClientData,
+ ServerData;
+ int    CBLock,
+        CBCount;
+ void   cdecl (*CBDraw)    (ObjectInfo *objectinfo,
+                           int outScreen,
+                           int outHandle,
+                           int outDevID,
+                           GRECT *Size,
+                           GRECT *Clip);
+ void   cdecl (*CBUnembed) (ObjectInfo *objectinfo);
+} OLGAObjectInfo;
+
+
+

Afterwards the required ID4-Servers can be started in parallel +using OLGA_ACTIVATE and all objects will be included individually with +OLGA_EMBED. +

+ +

To draw an object, a Client proceeds as follows: First of all +OLGAObjectInfo.CBLock of the corresponding object is increased by one. +Immediately afterwards the Client tests whether CBLock contains a +value higher than NULL. If this is not the case the Client must not +call the Callback routines! Otherwise the Client tests whether CBDraw +is not NULL - if yes it calls the Callback routine. Finally CBLock is +again decremented (reduced by one). +

+

On receipt of OLGA_INPLACEUPDATE, Clients should re-draw the +object contained (or passed) in this message. +

+

On deletion of an object (or closing of a document i.e. +termination of the Client) CBUnembed must be called for every object, +so long as the Callback is not NULL. The safeguards with CBLock +described above apply. The Server then knows that for this object no +more ID4-linking exists (or is one less). +

+

Conversely a Server sends the Client OLGA_UNEMBED if it can no +longer provide (or there is drawn) an embedded object. The Client can +then mark the object 'invalid' (for example it could display a white +rectangle crossed out in red). A Client should react similarly on +receipt of an OLGA_SERVERTERMINATED message. +

+

This function was added to OLGA in Rev 1.2 (1996-11-20). +

+

See also: OLGA_GETOBJECTS   OLGA_ACTIVATE   OLGA_EMBED +

+

15.8.29.2 OLGA_GETOBJECTS

+

An ID4-Client can use this message to ask the Manager which +filetypes can be embedded via ID4-OLGA. +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
WORD 0Message number (0x1242)
WORD 1AES ID of own program (apID)
WORD 20
WORD 3First (0) or further (1) object
WORD 40
WORD 50
WORD 60
WORD 70
+
+ +

In reply the Client receives the OLGA_OBJECTS message, including +the extension and plain text description of the filetype for the User +selection. +

+

The Manager replies to the ID4-Client with an OLGA_OBJECTS message +as follows: +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
WORD 0Message number (0x1243)
WORD 1Manager identifier (manID)
WORD 20
WORD 3Number of objects which can still be
retrieved (0 means this is the last object)
WORD 4+5Extension of the file format, e.g. '.GEM'
WORD 6+7Pointer to the plain text object description
 (valid until the Manager is terminated)
+
+ +

The message OLGA_GETOBJECTS must now be sent to the Manager +until the OLGA_OBJECTS WORD 3 returns NULL. +

+

This function was added to OLGA in Rev 1.2 (1996-11-20). +

+

See also: OLGA protocol   OLGA_ACTIVATE   OLGA_EMBED +

+

15.8.29.3 OLGA_ACTIVATE

+

Sometime before drawing, ideally before embedding the first +object, and outside (!) a wind_update blocking, the ID4-Client should +send the Manager the following message. If the Client, before the next +wind_update, does not enter its event loop, it must perform an +event_timer of at least 1000ms after it. +

+

The Client sends to the Manager: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
WORD 0Message number (0x124a)
WORD 1AES ID of own program (apID)
WORD 20
WORD 3+4Pointer to 4-character extensions (e.g.
 '.GEM.CWG'); if necessary shorten or fill
 with Nullbytes (!)
WORD 5Number of extensions (>=1)
WORD 60
WORD 70
+
+ +

In this message all different extensions of all embedded objects +should be passed so the Manager can then start a suitable Server. As +confirmation the Manager sends the following message: +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
WORD 0Message number (0x1239)
WORD 1Manager identifier (manID)
WORD 20
WORD 3Same value as in the received OLGA_ACTIVATE
WORD 4Same value as in the received OLGA_ACTIVATE
WORD 5Same value as in the received OLGA_ACTIVATE
WORD 60
WORD 7OLGA_ACTIVATE
+
+ +

This function was added to OLGA in Rev 1.2 (1996-11-20). +

+

See also: OLGA protocol   OLGA_GETOBJECTS   OLGA_EMBED +

+

15.8.29.4 OLGA_EMBED

+ + + +

To embed an object, a Client places a OLGAObjectInfo structure +in global memory and sets the fields Filename (absolute filename, +NULL- terminated), ClientGEMPB (contains a pointer to the structure, +the pointer to the GEM arrays global etc.), ClientData (any Client +data), CBLock (constant on -16000) as well as CBCount (to date always +2) and nulls all other fields. Then the Client sends the Manager the +following message: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
WORD 0Message number (0x124b)
WORD 1clientID
WORD 20
WORD 3Client-flag
WORD 4+5Pointer to OLGAObjectInfo of the object
WORD 6+7Extension
+
+ +

The Client flag can be freely set from the Client and will later +be returned to the Client. The extension describes the filetype of the +filenames from OLGAObjectInfo (e.g. '.GEM'). This extension is used +to communicate with the ID4-Server - which must already be running in +parallel (see OLGA_ACTIVATE). +

+

The actual embeding may be carried out by the Client only when +it has received the following OLGA_EMBEDDED message direct from the +Server: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
WORD 0Message number (0x124c)
WORD 1serverID
WORD 20
WORD 3Client-flag
WORD 4+5Pointer to OLGAObjectInfo
WORD 6Width of the object in 1/100mm (unsigned),
 0 on error
WORD 7Height of the object in 1/100mm (unsigned),
 0 on error
+
+ +

Client-flag and OLGAObjectInfo pointer are unchanged to +OLGA_EMBED. The ServerData may have been changed by the Server (as the +name indicates, this field belongs to the Server and may not be +changed by the Client), and in CBDraw the Server should enter a +pointer to its drawing routine. +

+

With WORD 6/WORD 7 the Server informs the Client of the optimum +object size. The client need not maintain this size, but in any case +it knows the aspect ratio (proportions) of the object from the +width/height ratio. +

+

Important: If WORD 6/WORD 7 are NULL, an error has been +encountered (in this case the Manager may already have sent out an +OLGA_EMBEDDED message). The Client may then not embed the object! +

+

This function was added to OLGA in Rev 1.2 (1996-11-20). +

+

See also: OLGA protocol   OLGA_GETOBJECTS   OLGA_ACTIVATE +

+

15.8.29.5 ID4-Server

+

Important: If ID4 is to function with memory protection +the GLOBAL- flag should be set in the ID4-Server program header! +

+

If a Client would like to embed an object, the Server will +receive an OLGA_EMBED message from the Manager, to which it must reply +with OLGA_EMBEDDED. +

+

To draw, the Client calls CBDraw-Callback. During processing of +the Callback the Server as a rule may not make any AES calls (it +closes wind_update!). The Server must also not adjust the palette. If +the Server makes changes to an object, it can immediately send an +OLGA_INPLACEUPDATE message to the Client so that it can perform an +immediate update. +

+

To avoid passing an undefined pointer on terminating a Server or +closing of documents, the Server must proceed as follows: +

+

For each object, the Server tests whether +OLGAObjectInfo.CBLock<=0. If this is the case, the Server first +sets CBLock to -16000, then CBDraw to NULL. +

+

Everything must be enclosed in an evnt_timer loop and repeated +until no more objects are assigned. Only then may the Server terminate +or close the document window. +

+

Once the Server has set all corresponding CBDraw pointers to +NULL, an OLGA_UNEMBED message must be sent to the Client. On receipt +of this message the Client can mark the objects as 'invalid', for +example by drawing a white rectangle crossed out by a red cross. +

+

In order for a Server to determine if a Client is still using an +embedded object, the Clients will call CBUNEMBED Callback to dissolve +the connection. An ID4-Server should react the same way on receipt of +OLGA_CLIENTTERMINATED. +

+

In order to avoid any problems resulting from a Server crash, +the Server should overwrite etv_critic, and by running this routine +CBDraw will set all objects to NULL and CBLock to -16000. +

+

This function was added to OLGA in Rev 1.2 (1996-11-20). +

+

See also: OLGA protocol   OLGA_EMBEDDED   OLGA_UNEMBED +OLGA_INPLACEUPDATE   CBDraw   CBUnembed +

+

15.8.29.6 OLGA_EMBEDDED

+

If a Client would like to embed an object, the Server receives +the following OLGA_EMBED message from the Manager: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
WORD 0Message number (0x124b)
WORD 1Manager identifier (manID)
WORD 20
WORD 3Client-flag
WORD 4+5Pointer to OLGAObjectInfo
WORD 60
WORD 7ClientID
+
+ + +

WORDs 3..5 may not be changed by the Server and must be returned +by OLGA_EMBEDDED. The ServerData field in OLGAObjectInfo can be freely +used by the Server. +

+

The Server can now load the file passed in OLGAObjectInfo, set +CBLock to NULL and enter in CBDraw the pointer to its draw routine. In +CBUnembed, the Server can carry a routine which the Client will call +on dissolving the ID4-connection. +

+

The Server must then immediately (!) send the Client the +following OLGA_EMBEDDED reply (the Server obtains the ClientID from +WORD 7 of the above OLGA_EMBED message): +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
WORD 0Message number (0x124c)
WORD 1Server identifier (serverID)
WORD 20
WORD 3Client-flag
WORD 4+5Pointer to OLGAObjectInfo
WORD 6Width of the object in 1/100mm (unsigned),
 0 on error
WORD 7Height of the object in 1/100mm (unsigned),
 0 on error
+
+ +

If the Server indicates an error in WORD 6..7, the Client will +not embed the object. +

+

Important: If the Server was started in parallel with +the Manager, OLGA_EMBED messages can arrive before the Server has +ended its OLGA installation! It is up to the Server whether it deals +with the OLGA_EMBEDDED replies immediately or only after completing +its initialization. +

+

This function was added to OLGA in Rev 1.2 (1996-11-20). +

+

See also: OLGA protocol   OLGA_UNEMBED   OLGA_INPLACEUPDATE   +CBDraw   CBUnembed +

+

15.8.29.7 OLGA_UNEMBED

+

In order to avoid undefined pointers when terminating a Server +or closing a document, the Server must proceed as follows: +

+

For every object the Server checks whether CBLock<=0. If this +is the case then the Server first of all sets CBLock to -16000, then +CBDraw to NULL. +

+

Everything must be enclosed in an evnt_timer loop and repeated +until no more objects are assigned. After this the Server may +terminate or close the document window. +

+

Once the Server has set all corresponding CBDraw pointers to +NULL etc. it must send the Client directly (!) for each object the +following message (or a single message instead with WORD 3..4=NULL on +terminating): +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
WORD 0Message number (0x124d)
WORD 1Server identifier (serverID)
WORD 20
WORD 30
WORD 4+5Pointer to OLGAObjectInfo, or NULL
 (see above)
WORD 60
WORD 70
+
+ +

On receipt of this message the Client can mark the objects as +'invalid' (for example it could display a white rectangle crossed out +in red). +

+

This function was added to OLGA in Rev 1.2 (1996-11-20). +

+

See also: OLGA protocol   OLGA_EMBEDDED   OLGA_INPLACEUPDATE   +CBDraw   CBUnembed +

+

15.8.29.8 OLGA_INPLACEUPDATE

+

If changes are made to a document, the Server can send the +Client the following message, so the last embedded object can be +immediately redrawn (without requiring a Save). The Server may only +send this message after it has sent OLGA_EMBEDDED to the Client! +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
WORD 0Message number (0x1256)
WORD 1Server identifier (serverID)
WORD 20
WORD 30
WORD 4+5Pointer to OLGAObjectInfo
WORD 60
WORD 70
+
+ +

This function was added to OLGA in Rev 1.2 (1996-11-20). +

+

See also: OLGA protocol   OLGA_EMBEDDED   OLGA_UNEMBED   CBDrawCBUnembed +

+

15.8.29.9 CBDraw

+

C notation: +

+
        void cdecl (*CBDraw) (ObjectInfo *objectinfo,
+                              int outScreen,
+                              int outHandle,
+                              int outDevID,
+                              GRECT *Size,
+                              GRECT *Clip);
+
+

PurePascal notation: +
(d1..d5 are dummy values, here NULL or 0 shoul be passed) +

+
        CBDraw: procedure(d1,d2: pointer; d3,d4,d5: longint;
+                          objectinfo: POLGAObjectInfo;
+                          outScreen,
+                          outHandle,
+                          outDevID: integer;
+                          Size,
+                          Clip: GRECTPtr);
+
+

If CBDraw is called by the Client, the Server should check +whether the file OLGAObjectInfo.Filename (the OLGAObjectInfo pointer +is passed by CBDraw) is already loaded - if not then it should do so +now. Since the loading should actually have been ensured through +OLGA_EMBED, one can in that case alternatively signal an error, for +example by crossing out the object area using two red lines (or +possibly by displaying the actual error as plain text in the object +area). +

+

Then the Server can draw the graphics with the help of the +passed values (see below). Inside of this drawing routine the Server +must not make any wind_update calls! The CBDraw parameters have the +following meaning: +

+
    + +
  • outScreen signals whether output is to be to the screen +(<>0) or not (=0). An on-screen preview is screen output too! +
      + +

  • +
  • outHandle is the handle of the open workstation (screen, +printer etc.), to which the Server can output directly. If outScreen +is <>0, the Server can also alternatively output to its own +screen workstation. +
      + +

  • +
  • outDevID gives the device number (from ASSIGN.SYS) of the +driver to output to. If outputting purely to screen this field +contains NULL. Although a preview is an output to the screen, outDevID +in that case specifies, for instance, the driver to which output will +be made later during printing. In that case the Server can try to open +that driver in order to better match the screen output to subsequent +printer output. +
      + + +

  • +
  • Size is the rectangle in which the passed graphic must fit +exactly, even if this leads to distortions. Clip is the Clipping +rectangle (set before the call). +
      +

  • +
+ +

Important: A Server must not make any AES calls +during CBDraw! (Unless the AESPB pointer field has been adapted by the +ClientGEMPB; nevertheless wind_update remains taboo for ID4-Servers). +Additionally the colour palette in Callback must not be changed. +

+

This function was added to OLGA in Rev 1.2 (1996-11-20). +

+

See also: OLGA protocol   OLGA_EMBEDDED   OLGA_UNEMBED   +OLGA_INPLACEUPDATE   CBUnembed +

+

15.8.29.10 CBUnembed

+

C notation: +

+
        void cdecl (*CBUnembed) (ObjectInfo *objectinfo);
+
+

PurePascal notation: +
(d1..d5 are dummy-values, here NULL or 0 should be passed) +

+
        CBUnembed: procedure(d1,d2: pointer; d3,d4,d5: longint;
+                             objectinfo: POLGAObjectInfo);
+
+

On deletion of an object (or closing of a document i.e. +termination), a Client calls CBUnembed() for each object. In this way +the ID4-Server can ascertain that the ID4-linking for this object no +longer exists (or is reduced by one). +

+

This function was added to OLGA in Rev 1.2 (1996-11-20). +

+

See also: OLGA protocol   OLGA_EMBEDDED   OLGA_UNEMBED   +OLGA_INPLACEUPDATE   CBDraw +

+

15.8.30 Notification

+

There may be applications for which the previously described +ObjectLinking does not suffice, since only known (or user-selected) +files can be supervised. With the Notification extension an +application may now be informed by the Manager about all updates, or +those of a specified filetype. +

+

As always the extensions in the following messages must always be in +upper case. They are (including the dot/point) exactly four characters +long. If necessary the extension must be shortened or lengthened (by +padding it with NULL-bytes (!). +

+

This function was added to OLGA in Rev 1.2 (1996-11-20). +

+

See also: OLGA protocol   OLGA_REQUESTNOTIFICATION   +OLGA_RELEASENOTIFICATION   OLGA_NOTIFY +

+

15.8.31 OLGA_REQUESTNOTIFICATION

+

If an application would like to be informed by the Manager about +alterations of all files of a specific type, it sends the following +message to the Manager. If four null bytes are passed the application +will be informed about every update for every file. +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
WORD 0Message number (0x1250)
WORD 1AES ID of own program (apID)
WORD 20
WORD 3+4Extension (e.g. '.TIF') or NULL (='*.*')
WORD 50
WORD 60
WORD 70
+
+ +

This function was added to OLGA in Rev 1.2 (1996-11-20). +

+

See also: OLGA protocol   OLGA_RELEASENOTIFICATION   OLGA_NOTIFY +

+

15.8.32 OLGA_RELEASENOTIFICATION

+

An application can switch notification off again for certain +filetypes (previously requested with OLGA_REQUESTNOTIFICATION) or for +all of them (if four nullbytes are passed) with the following message +to the Manager: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
WORD 0Message number (0x1251)
WORD 1AES ID of own program (apID)
WORD 20
WORD 3+4Extension (e.g. '.TIF') or NULL (='*.*')
WORD 50
WORD 60
WORD 70
+
+ +

This function was added to OLGA in Rev 1.2 (1996-11-20). +

+

See also: OLGA protocol   OLGA_REQUESTNOTIFICATION   OLGA_NOTIFY +

+

15.8.33 OLGA_NOTIFY

+

The Manager notifies an application that a file has been +altered. If the application has a link set to this file, it should +already have received an OLGA_UPDATED message! +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
WORD 0Message number (0x1252)
WORD 1Manager ID (manID)
WORD 20
WORD 3+4Pointer to filename with absolute path
WORD 50
WORD 60
WORD 70
+
+ +

After receipt of this message the application must send to the +Manager the following OLGA_NOTIFIED message: +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
WORD 0Message number (0x1253)
WORD 1AES ID of own program (apID)
WORD 20
WORD 3Same value as in the received OLGA_NOTIFY
WORD 4Same value as in the received OLGA_NOTIFY
WORD 5Same value as in the received OLGA_NOTIFY
WORD 6Same value as in the received OLGA_NOTIFY
WORD 7Same value as in the received OLGA_NOTIFY
+
+ +

This function was added to OLGA in Rev 1.2 (1996-11-20). +

+

See also: OLGA protocol   OLGA_REQUESTNOTIFICATION   +OLGA_RELEASENOTIFICATION +

+

15.8.34 Idle-test

+

Using the Idle-test, Server or Clients and the Manager can +mutually ascertain whether all preceding OLGA-messages have been +processed. For this the following OLGA_IDLE message is sent (Manager +-> App or App -> Manager): +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
WORD 0Message number (0x1249)
WORD 1Manager ID (manID)
WORD 20
WORD 31
WORD 4Reserved
WORD 5Reserved
WORD 6Reserved
WORD 7Reserved
+
+ +

As a reply one receives (or the Client/Server has to send to the +Manager) the following OLGA_IDLE message: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
WORD 0Message number (0x1249)
WORD 1AES ID of own program (apID)
WORD 20
WORD 30
WORD 4Same value as in the received OLGA_IDLE
WORD 5Same value as in the received OLGA_IDLE
WORD 6Same value as in the received OLGA_IDLE
WORD 7Same value as in the received OLGA_IDLE
+
+ +

An application supporting the Idle-test must set the +corresponding bit (OLE-IDLE) when it receives OLE_INIT. Conversely the +OLGA-Manager displays these abilities with OLGA_INIT and OLE_NEW. +

+

This function was added to OLGA in Rev 1.2 (1996-11-20). +

+

See also: OLGA protocol +

+

15.8.35 Configuration inquiry

+ +

In order to obtain the global values of the OLGA-Manager, an +application sends the following OLGA_GETSETTINGS message to the +Manager: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
WORD 0Message number (0x124e)
WORD 1AES ID of own program (apID)
WORD 20
WORD 30
WORD 40
WORD 50
WORD 60
WORD 70
+
+ +

In reply the application receives the following OLGA_SETTINGS +message from the Manager. Note that the fields of WORD 4..7 may only +be evaluated/utilised if WORD 3 contains 1! +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
WORD 0Message number (0x124f)
WORD 1Manager ID (manID)
WORD 20
WORD 31=OK, 0=Error
WORD 4Reserved (currently 0)
WORD 5Reserved (currently 0)
WORD 6Reserved (currently 0)
WORD 7Reserved (currently 0)
+
+ +

Currently no internal Manager data is returned. +

+

This function was added to OLGA in Rev 1.2 (1996-11-20). +

+

15.8.36 List of OLGA-aware applications

+

Status: 15th Januar 1998 +

+

The folowing programs support OLGA: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ProgramFromAuthorClientServerID4-Cl.ID4-Srv.
Alert Help1.2Matthias Jaap *  
Alta Lista1.3Matthias Jaap *  
ArtWorx1.0Christian Witt**1.41.14
Bellini01/97Ingo Dehne *  
CAB1.2A. Clauss*2.52.0 
E.C.I.1.2Matthias Jaap *  
Everest12/96Oliver Schmidt *  
Focus 3D1.50Ralf Trinler *  
freeBase1.0Holger Weets*   
GEMJing1.03Götz Hoffart *  
GEM-Look12/95Rolf Kotzian*   
Gleichungen1.2Matthias Jaap *  
HP-Pinguin1.65Matthias Jaap2.0*  
IdeaList3.71Chr. Bartholme*   
JAnE1.50Harald Becker *  
JingleFALCON1.41Erik Hall**  
Kandinsky2.0U. Roßgoderer**  
Papillon2.3Dirk Sabiwalsky *  
Papyrus5.5R.O.M.**  
Phoenix5.0D.+J. Geiß*   
PixArt3.32Mario Meißner *  
qed3.90Chr. Felsch *  
Roman1.2Matthias Jaap *  
STELLA2.0Thomas Künneth** 2.61
Tabi!1.5Matthias Jaap *  
Texel1.0Thomas Much1.5*1.5 
XURL2.40Gary Priest *  
+
+ +

These libraries support OLGA: +

+
+ + + + + + + + + + + + + + + + + + + + +
LibraryFrom versionAuthor
OLGA-C-Lib Alexander Barton
OLGA-C-Lib Thomas Künneth
ObjectGEM1.21-betaThomas Much
+
+ +

15.8.37 Extensions

+

These are some of the common file extensions, with those handled +by OLGA identified in the last column: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ShortformLongformDescriptionServer/Client
.AI Adobe IllustratorArtWorx
.AIF.aiff  
.ASC ASCII textEverest, qed
.AU   
.CLA.classJava class 
.CSV   
.CVG Calamus vector graphicArtWorx
.CWG ArtWorx documentArtWorx
.DIF   
.GEM GEM-MetafileArtWorx
.GIF   
.HDU Hard Disk Utility 
.HTM.html CAB
.IMG GEM-(X)IMG raster graphic 
.INC Pascal include 
.JPG.jpeg Papillon, STELLA
.MOV   
.MPG.mpeg  
.PAS Pascal source 
.PS PostScript document 
.SDB STELLA databaseSTELLA
.TAD Diagram fileArtWorx, Texel
.TIF.tiff Papillon, STELLA
.TXL Texel spreadsheetTexel
.TXT ASCII textEverest, qed
.WAV   
.WRL VRML 
.XBM X-Bitmap graphic 
.XLS Excel spreadsheet 
+
+ +

15.8.38 File formats

+

There are some additional files used in conjunction with OLGA +and its programming: +

+ + +

Their format will be found in the following pages. +

+

15.8.38.1 OLGA.H

+
/* OLGA Rev 1.2 (11/20/96)                       */
+/* Thomas_Much                                   */
+/* http://www.uni-karlsruhe.de/~Thomas.Much/OLGA */
+
+#ifndef OLGA_H
+#define OLGA_H
+
+
+#define OLE_INIT                 0x4950
+#define OLE_EXIT                 0x4951
+#define OLE_NEW                  0x4952
+
+#define OLGA_INIT                0x1236
+#define OLGA_UPDATE              0x1238
+#define OLGA_ACK                 0x1239
+#define OLGA_RENAME              0x123a
+#define OLGA_OPENDOC             0x123b
+#define OLGA_CLOSEDOC            0x123c
+#define OLGA_LINK                0x123d
+#define OLGA_UNLINK              0x123e
+#define OLGA_UPDATED             0x123f
+#define OLGA_RENAMELINK          0x1240
+#define OLGA_LINKRENAMED         0x1241
+#define OLGA_GETOBJECTS          0x1242
+#define OLGA_OBJECTS             0x1243
+#define OLGA_BREAKLINK           0x1244
+#define OLGA_LINKBROKEN          0x1245
+#define OLGA_START               0x1246
+#define OLGA_GETINFO             0x1247
+#define OLGA_INFO                0x1248
+#define OLGA_IDLE                0x1249
+#define OLGA_ACTIVATE            0x124a
+#define OLGA_EMBED               0x124b
+#define OLGA_EMBEDDED            0x124c
+#define OLGA_UNEMBED             0x124d
+#define OLGA_GETSETTINGS         0x124e
+#define OLGA_SETTINGS            0x124f
+#define OLGA_REQUESTNOTIFICATION 0x1250
+#define OLGA_RELEASENOTIFICATION 0x1251
+#define OLGA_NOTIFY              0x1252
+#define OLGA_NOTIFIED            0x1253
+#define OLGA_SERVERTERMINATED    0x1254
+#define OLGA_CLIENTTERMINATED    0x1255
+#define OLGA_INPLACEUPDATE       0x1256
+
+#define OL_SERVER                0x0001
+#define OL_CLIENT                0x0002
+#define OL_PEER          (OL_SERVER | OL_CLIENT)
+#define OL_IDLE                  0x0800
+#define OL_PIPES                 0x1000
+#define OL_START                 0x2000
+#define OL_MANAGER               0x4000
+#define OL_OEP                   0x0001
+
+#define OLS_TYPE                 1
+#define OLS_EXTENSION            2
+#define OLS_NAME                 3
+
+
+typedef struct
+{
+        int x,y,w,h,
+            x1,y1,x2,y2;
+} GRECT;
+
+
+typedef struct
+{
+        long         magic;
+        unsigned int version,
+                     skip;
+} OLGAInfHeader;
+
+
+typedef struct
+{
+        long id,
+             length;
+} OLGABlockHeader;
+
+
+typedef struct ObjectInfo
+{
+        char  *Filename;
+        AESPB *ClientGEMPB;
+        long   ClientData,
+               ServerData;
+        int    CBLock,
+               CBCount;
+        void   cdecl (*CBDraw)    (ObjectInfo *objectinfo,
+                                   int outScreen,
+                                   int outHandle,
+                                   int outDevID,
+                                   GRECT *Size,
+                                   GRECT *Clip);
+        void   cdecl (*CBUnembed) (ObjectInfo *objectinfo);
+} OLGAObjectInfo;
+
+
+#endif
+
+

See also: OLGA protocol   OLGA.INC   OLGA.INF +

+

15.8.38.2 OLGA.INC

+
/* OLGA Rev 1.2 (11/20/96)                       */
+/* Thomas_Much                                   */
+/* http://www.uni-karlsruhe.de/~Thomas.Much/OLGA */
+
+const
+
+        OLE_INIT                 = 0x4950;
+        OLE_EXIT                 = 0x4951;
+        OLE_NEW                  = 0x4952;
+
+        OLGA_INIT                = 0x1236;
+        OLGA_UPDATE              = $1238;
+        OLGA_ACK                 = $1239;
+        OLGA_RENAME              = $123a;
+        OLGA_OPENDOC             = $123b;
+        OLGA_CLOSEDOC            = $123c;
+        OLGA_LINK                = $123d;
+        OLGA_UNLINK              = $123e;
+        OLGA_UPDATED             = $123f;
+        OLGA_RENAMELINK          = $1240;
+        OLGA_LINKRENAMED         = $1241;
+        OLGA_GETOBJECTS          = $1242;
+        OLGA_OBJECTS             = $1243;
+        OLGA_BREAKLINK           = $1244;
+        OLGA_LINKBROKEN          = $1245;
+        OLGA_START               = $1246;
+        OLGA_GETINFO             = $1247;
+        OLGA_INFO                = $1248;
+        OLGA_IDLE                = $1249;
+        OLGA_ACTIVATE            = $124a;
+        OLGA_EMBED               = $124b;
+        OLGA_EMBEDDED            = $124c;
+        OLGA_UNEMBED             = $124d;
+        OLGA_GETSETTINGS         = $124e;
+        OLGA_SETTINGS            = $124f;
+        OLGA_REQUESTNOTIFICATION = $1250;
+        OLGA_RELEASENOTIFICATION = $1251;
+        OLGA_NOTIFY              = $1252;
+        OLGA_NOTIFIED            = $1253;
+        OLGA_SERVERTERMINATED    = $1254;
+        OLGA_CLIENTTERMINATED    = $1255;
+        OLGA_INPLACEUPDATE       = $1256;
+
+        OL_SERVER                = $0001;
+        OL_CLIENT                = $0002;
+        OL_PEER                  = OL_SERVER or OL_CLIENT;
+        OL_IDLE                  = $0800;
+        OL_PIPES                 = $1000;
+        OL_START                 = $2000;
+        OL_MANAGER               = $4000;
+        OL_OEP                   = $0001;
+
+        OLS_TYPE                 =     1;
+        OLS_EXTENSION            =     2;
+        OLS_NAME                 =     3;
+
+
+type
+
+        GRECTPtr = ^GRECT;
+        GRECT    = record
+                X,Y,W,H,
+                X1,Y1,X2,Y2: integer
+        end;
+
+        POLGAInfHeader = ^TOLGAInfHeader;
+        TOLGAInfHeader = record
+                Magic  : array [0..3] of char;
+                Version,
+                Skip   : word
+        end;
+
+        POLGABlockHeader = ^TOLGABlockHeader;
+        TOLGABlockHeader = record
+                ID    : array [0..3] of char;
+                Length: longint
+        end;
+
+        POLGAObjectInfo = ^TOLGAObjectInfo;
+        TOLGAObjectInfo = record
+                Filename   : PChar;
+                ClientGEMPB: AESPBPtr;
+                ClientData,
+                ServerData : longint;
+                CBLock,
+                CBCount    : integer;
+                CBDraw     : procedure(d1,d2: pointer; d3,d4,d5: longint;
+                                       objectinfo: POLGAObjectInfo;
+                                       outScreen,
+                                       outHandle,
+                                       outDevID: integer;
+                                       Size,
+                                       Clip: GRECTPtr);
+                CBUnembed  : procedure(d1,d2: pointer; d3,d4,d5: longint;
+                                       objectinfo: POLGAObjectInfo);
+        end;
+
+

See also: OLGA protocol   OLGA.H   OLGA.INF +

+

15.8.38.3 OLGA.INF

+
;This is the OLGA Manager configuration file.
+;It must be placed in the root directory of the boot drive,
+;in $HOME/defaults or $HOME.
+;
+; Note that this is (!I)not(!i) the OLGA Info file described elsewhere!
+
+;Important: The minimal Manager cannot tolerate errors
+;in this file!!! Any lines preceded with a semicolon are
+;comment lines. Empty lines, using CR/LF only, are allowed.
+;All entries must start at the start of the line (i.e. in
+;column 1) and preceding space characters etc. are not allowed.
+;Program names are always absolute, i.e. with path and drive.
+
+[Extensions]
+;Wildcards are not allowed!
+;Extensions (including dot "." ) are a maximum four characters long.
+.TAD=$ARTWORX
+.CWG=$ARTWORX
+.GEM=$ARTWORX
+.CVG=$ARTWORX
+.AI=$ARTWORX
+.SDB=$STELLA
+.TXL=$TEXEL
+.DIF=$TEXEL
+.CSV=$TEXEL
+.XLS=$TEXEL
+.HTM=$CAB
+.TXT=$QED
+.ASC=$QED
+.IMG=$PAPILLON
+.TIF=$PAPILLON
+.JPG=$PAPILLON
+.GIF=$PAPILLON
+
+[Objects]
+; An ID4-Server exists for the following extensions. The
+; extensions must also be defined in the previous section!
+.CWG=ArtWorx document
+.CVG=Calamus document
+.GEM=GEM Metafile
+.AI=Adobe Illustrator document
+.TAD=Texel spreadsheet
+
+[Types]
+;XAcc types, refer to OLGAPROT.TXT; these are exactly two
+;characters long and case sensitive!
+SS=$TEXEL
+VG=$ARTWORX
+RG=$PAPILLON
+GG=$STELLA
+ED=$QED
+
+[Applications]
+;Here aliases are established, which can (but don't have to) be used
+;as abbreviations (with a leading $, see above).
+;Encapsulation is allowed but take care not to create any
+;endless loops. Case sensitivity is observed!
+TEXEL=C:\Program\PP\PRGS\texel.app
+STELLA=C:\Program\STELLA\STELLA.APP
+ARTWORX=C:\Program\ArtWorx\ARTWORX.PRG
+IDEALIST=C:\Tools\IdeaList\IDEALIST.PRG
+CAB=C:\Program\WWW\CAB\CAB.APP
+QED=C:\Other\qed\qed.app
+PAPILLON=C:\Program\PAPILLON\PAPILLON.PRG
+
+;-----------------EOF--------------
+
+

See also: OLGA protocol   OLGA.H   OLGA.INC +

+

15.8.39 Much, Thomas

+

Thomas Much +
Gerwigstraße 46 +
D-76131 Karlsruhe Fax: (0721) 622821 +
E-Mail: Thomas.Much@stud.uni-karlsruhe.de (Internet) +
http://www.uni-karlsruhe.de/ Thomas.Much (WorldWideWeb) +

+

15.8.40 OL_SERVER

+

OL_SERVER (0x0001): +
Application is OLGA-Server +

+

15.8.41 OL_CLIENT

+

OL_CLIENT (0x0002): +
Application is OLGA-Client +

+

15.8.42 OL_PEER

+

OL_PEER (0x0003): +
Application is a Client and a Server. +

+

15.8.43 OL_IDLE

+

OL_IDLE (0x0800): +
Manager supports the Idle-test. +

+

15.8.44 OL_PIPES

+

OL_PIPES (0x1000): +
Application wants to communicate via MultiTOS Drag&Drop pipes +instead of pointers; the Manager then reports whether it supports this +communication or if it is possible on the current system (see below); +this is currently not supported +

+

15.8.45 OL_START

+

OL_START (0x2000): +
The Manager can perform OLGA_START. +

+

15.8.46 OL_MANAGER

+

OL_MANAGER (0x4000): +
The application is the OLGA-Manager. +

+

15.8.47 OL_OEP

+

OL_OEP (0x0001): +
Application understands OEP. +

+

15.8.48 OLGA history

+

Rev 1.3-beta (1997-06-05) +

+ + +

Rev 1.2 (1996-11-20) +

+ + +

Rev 1.1 (1996-07-24) +

+ + +

Rev 1.0 (1996-01-24) +

+
    +
  • msg[6] of the command line OLGA_ACK adapted to OLGA_START +
      +

  • +
  • From now on multitasking is a prerequisite, so the OLGA_BLOCK +and OLGA_UNBLOCK messages become unnecessary +
      +

  • +
+ +

Rev 0.9 (1995-11-10) +

+
    +
  • OLE messages have new numbers +
      +

  • +
+ +

Rev 0.8 (1995-11-05) +

+ + +

Rev 0.7 (1995-04-09) +

+
    +
  • OLE initialisation (OEP/OLGA) +
      +

  • +
  • The OLGA_INIT message for the application to the Manager +replaced with OLE_INIT +
      +

  • +
  • The Manager no longer passes its own name via OLGA_INIT +
      +

  • +
  • OLGA_EXIT renamed OLE_EXIT, OLGA_NEW renamed OLE_NEW +
      +

  • +
  • OLGA_OPENDOC no longer passes document names +
      +

  • +
+ +

Rev 0.6 (beta release only) +

+
    +
  • Parallel starting of the Manager (refer to OLGA_INIT) with +shel_write +
      +

  • +
  • Automatic termination +
      +

  • +
  • OLGA_EXIT on Manager shutdown +
      +

  • +
  • OLGA_NEW +
      +

  • +
+ +

Rev 0.5 (1999-03-01) +

+ + +

Rev 0.4 (1995-01-07) +

+ + +

Rev 0.3 (1995-01-04) +

+
    +
  • OLGA_RENAMED renamed OLGA_RENAMELINK +
      +

  • +
  • OLGA_LINKRENAMED has been added, and due to this the numbers of +OLGA_BLOCK/OLGA_UNBLOCK have changed +
      +

  • +
+ +

Rev 0.2 +

+
    +
  • Completely revised in line with the GOLEM suggestions +
      +

  • +
+ +
+ +Home +ProtocolsProtocols +LTL protocolLTL protocol +SE protocolSE protocol + + diff --git a/en/proto_seproto.html b/en/proto_seproto.html new file mode 100644 index 000000000..8dab4f7aa --- /dev/null +++ b/en/proto_seproto.html @@ -0,0 +1,1617 @@ + + + + + +The documentation for TOS: SE protocol + + + + + + + + + +Home +ProtocolsProtocols +OLGA protocolOLGA protocol +System Services Protocol (SSP)System Services Protocol (SSP) + +
+ +

15.9 SE protocol

+

The purpose of the SE protocol is the communication between +program development shells and editors, hence the name: +Shell-Editor protocol. +

+

This protocol serves, under multitasking systems, to cause the +shell to perform compilation and similar actions from within the +editor, and to return shell error-messages and/or error files to the +editor. +

+

Commands or messages from the shell to the editor start with +SE_, messages from the editor to the shell start with ES_. +

+

The current version number of the protocol is 1.05. +

+ +
+

15.9.1 Contact initiation

+

Initiating contact proceeds as follows: +

+

After startup, the shell sends the message SE_INIT. As a reply +it will then receive the message ES_OK. From the bit-fields of both +messages the shell can now deduce which commands it can send to the +editor and which commands are to be expected from the editor. If the +shell no longer wishes to participate in the SE protocol (for instance +because it is being terminated) then it will send the message SE_QUIT +to the editor. +

+

After launching, the editor sends the message ES_INIT. As a +reply it will then receive the message SE_OK. From the bit-fields of +both messages the editor can now deduce which commands it can send to +the shell and which commands are to be expected from the shell. If the +editor no longer wishes to participate in the SE protocol (for +instance because it is being terminated) then it will send the message +ES_QUIT to the editor. +

+

The remaining question is to whom the shell and editor should +send these messages. The SE protocol is best suited for use under a +multitasking system, in which the AES function appl_search will +normally be available. So the shell and editor should simply send +their respective init message to all processes (except the system +processes). +

+

Other possibilities: +

+
    +
  • If the shell knows the name of the editor, it can, of course, +restrict itself to this and send SE_INIT only to it. +
      +

  • +
  • If the function appl_search is not available, then the XAcc +protocol provides an alternative for initiating contact: Shell and +editor should simply send their init messages to every process that +registers itself via XAcc. The XAcc protocol also provides for a +machine-readable identification of the program type (XDSC), so that +one may be able to recognize whether the communication partner one is +dealing with is a shell (ID `PE' for "Programming +Environment") or whether it is an editor (ID `ED' for "text +EDitor"). +
      +

  • +
+ +

15.9.2 Notes on SE protocol

+

When we talk of a 'message' in the following, then this means an +AES message that consists of 8 WORDs (integers) and is sent with +the AES function appl_write. The first WORD always contains the +number of the message, the second the application ID of the sender and +the third is always NULL. The allocation of the other WORDs depends on +the particular message in each case. WORDs for which no allocation is +specified are to be set to NULL. +

+

Please note: As the count starts from 0, then 'WORD 3' +in the following means the fourth WORD! +

+

For clarification, once again in C: +

+
+
 int msg[8];
+
+ msg[0] = SE_ACK;   /* Message                          */
+ msg[1] = gl_apid;  /* ID of the sender                 */
+ msg[2] = 0;        /* 0, i.e. no excess length         */
+ msg[3] = TRUE;     /* This is "WORD 3"                 */
+ msg[4] = msg[5] = msg[6] = msg[7] = 0; /* Rest to NULL */
+ appl_write (editor, 16, msg);          /* Send         */
+
+
+
+

If a pointer (i.e. an address) is contained in a message, then +the upper WORD of the address is passed in the first and the lower +WORD in the second of the specified WORDs. +

+

With pointers to memory areas, each sender of the message must +ensure that these memory areas can also be read by the receiver +(memory protection!). For this they have to be allocated as +'readable'! This is achieved via the Gemdos call Mxalloc. +

+

With some messages it is possible to pass line and column +numbers for the cursor position. As there are different opinions +whether lines and/or columns should be counted starting from zero or +from one, it is recommended that these statements should be checked +before adoption and corrected if necessary. So if the editor starts +counting its lines from one then a line number of zero should not +upset it and it should be handled as line one. +

+
+

15.9.3 Messages from the shell to the editor

+

The shell can send the following messages or commands to the +editor: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MessageNumber
SE_INIT0x4200
SE_OK0x4201
SE_ACK0x4202
SE_OPEN0x4203
SE_ERROR0x4204
SE_ERRFILE0x4205
SE_PROJECT0x4206
SE_QUIT0x4207
SE_TERMINATE0x4208
SE_CLOSE0x4209
SE_MENU0x420A
+
+ +

15.9.3.1 SE_INIT

+

The shell asks whether an editor understands the SE protocol. +

+
+

Make-up of the message: +

+ + + + + + + + + +
Word 3: A bitset specifying which messages the shell sends: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MessageBitHex value
SE_INIT00x0001
SE_OK10x0002
SE_ACK20x0004
SE_OPEN30x0008
SE_ERROR40x0010
SE_ERRFILE50x0020
SE_PROJECT60x0040
SE_QUIT70x0080
SE_TERMINATE80x0100
SE_CLOSE90x0200
SE_MENU100x0400
+
+ +
Word 4+5: A bitset specifying which editor commands are understood: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MessageBitHex value
ES_INIT00x0001
ES_OK10x0002
ES_ACK20x0004
ES_COMPILE30x0008
ES_MAKE40x0010
ES_MAKEALL50x0020
ES_LINK60x0040
ES_EXEC70x0080
ES_MAKEEXEC80x0100
ES_PROJECT90x0200
ES_QUIT100x0400
ES_SHLCTRL110x0800
+
+ +
Note: WORD 4 and 5 together form a LONGword. Since the +messages defined to date only require 12 bits, WORD 4 will normally be +NULL. +
  +
Word 6: Supported version number of the protocol as BCD number, thus +0x0105 (hexadecimal) for Version 1.05 +
  + +
+ +
+

Reply: +

+

The editor replies with the message ES_OK. +

+
+

See also: ES_OK   SE_QUIT +

+

15.9.3.2 SE_OK

+

The shell tells the editor that it understands the protocol. +

+
+

Make-up of the message: +

+ + + + + + + + + + + + +
Word 3: A bitset specifying which messages the shell sends: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MessageBitHex value
SE_INIT00x0001
SE_OK10x0002
SE_ACK20x0004
SE_OPEN30x0008
SE_ERROR40x0010
SE_ERRFILE50x0020
SE_PROJECT60x0040
SE_QUIT70x0080
SE_TERMINATE80x0100
SE_CLOSE90x0200
SE_MENU100x0400
+
+ +
Word 4+5: A bitset specifying which editor commands are understood: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MessageBitHex value
ES_INIT00x0001
ES_OK10x0002
ES_ACK20x0004
ES_COMPILE30x0008
ES_MAKE40x0010
ES_MAKEALL50x0020
ES_LINK60x0040
ES_EXEC70x0080
ES_MAKEEXEC80x0100
ES_PROJECT90x0200
ES_QUIT100x0400
ES_SHLCTRL110x0800
+
+ +
Note: WORD 4 and 5 together form a LONGword. Since the +messages defined to date only require 12 bits, WORD 4 will normally be +NULL. +
  +
Word 6: Supported version number of the protocol as BCD number, thus +0x0105 (hexadecimal) for version 1.05 +
  +
Word 7: The apID of the program whose message is being answered +
  + +
+ +
+

Reply: +

+

None (SE_OK is already the reply of the shell to the message +ES_INIT). +

+

15.9.3.3 SE_ACK

+

The shell confirms the receipt of the editor command and returns +whether the command is executed. +

+
+

Make-up of the message: +

+ + + +
Word 3: TRUE : Command is understood and will be executed +
FALSE: The command is not understood +
  +
A SE_ACK with TRUE says nothing about whether the command was +executed successfully. It only says that the shell understands the +command and will execute it! +
  + +
+ +
+

Reply: +

+

None (SE_ACK is already the reply to a message). +

+

15.9.3.4 SE_OPEN

+

The shell tells the editor that it is to open a text. +

+
+

Make-up of the message: +

+ + + + + + + + + +
Word 3+4: A pointer to the filename of the file to be opened +
  +
Word 5+6: Line at which the cursor is to be positioned +
  +
Word 7: Column at which the cursor is to be positioned +
  + +
+ +
+

Reply: +

+

As a reply the shell receives an ES_ACK. +

+
+

Note: The specification of line and column numbers is +only provided for from protocol Version 1.02 onwards. Programs that +still use older protocol versions should really have set the WORDs +5..7 to NULL. If one wants to be quite certain, then it may be +necessary to enquire the version number of the shell passed by SE_INIT +or SE_OK. +

+

If the shell can't or doesn't want to make any position +specification, it should set the line and column to zero. +

+

15.9.3.5 SE_ERROR

+

An error has arisen during compilation. +

+
+

Make-up of the message: +

+ + + +
Word 3+4: A pointer to an info structrure that is built up as follows: +
  + +
+ + +
    typedef struct
+    {
+      char *errFile; /* Pointer to the name of the compiled file   */
+      char *errMess; /* Pointer to the error-message               */
+      int errNum;    /* The error number                           */
+      long errLine;  /* The erroneous line                         */
+      int errRow;    /* The column with the error (or 0)           */
+    } ERRINFO;
+
+
+

Reply: +

+

The editor confirms the message with ES_ACK. +

+
+

Note: If the shell can't or doesn't want to make any +position specification, it should set the line and column to zero. +

+

15.9.3.6 SE_ERRFILE

+

Errors have occurred. The error-messages are contained in an +error file which is specified in the message. +

+
+

Make-up of the message: +

+ + + + + + +
Word 3+4: A pointer to the filename of the error file with the +error-messages +
  +
Word 5+6: A pointer to the name of the compiled text +
  + +
+ +
+

Reply: +

+

The editor confirms the message with ES_ACK. +

+

15.9.3.7 SE_PROJECT

+

The shell tells the editor that the project has been altered. +The filename of the current project file will be passed as a +parameter. If NULL is passed, the current project should be logged +off. +

+

A sensible reaction of the editor in this case would be to also +change the project, insofar as it supports this. +

+
+

Make-up of the message: +

+ + + +
Word 3+4: A pointer to the name of the project file, or NULL. +
  + +
+ +
+

Reply: +

+

The editor acknowledges with ES_ACK. +

+
+

Note: Setting the name of the project file to NULL is +available only from protocol Version 1.01 onwards. The shell should +therefore check beforehand whether the editor understands protocol +Version 1.01 or higher. +

+

15.9.3.8 SE_QUIT

+

The shell tells the editor that is is being terminated. The +editor in this case should forget the shell as a communications +partner. +

+
+

Make-up of the message: +

+
+
No parameters
+
+

+
  +

+ +
+
+
+

Reply: +

+

No reply is expected! +

+

15.9.3.9 SE_TERMINATE

+

The shell tells the editor that it should terminate itself. The +editor should terminate itself in this case and run through its normal +termination process (and during this also send an ES_QUIT). The reason +for such a message from the shell could be insufficient memory for +compilation, for instance. +

+
+

Make-up of the message: +

+
+
No parameters
+
+

+
  +

+ +
+
+
+

Reply: +

+

The editor confirms the message with ES_ACK. +

+

15.9.3.10 SE_CLOSE

+

The shell tells the editor that it is to save or close given +texts. When closing altered texts the editor should first issue a +confirmation query. +

+
+

Make-up of the message: +

+ + + + + + +
Word 3+4: A pointer to the name of a file, or a file mask. '*.*' +represents all text windows (so corresponds to the SE_CLOSE of the +protocol Version 1.00). +
  +
Word 5: 0 = Save only +
1 = Save and close +
2 = Close without saving (from version 1.04 on) +
  + +
+ +
+

Reply: +

+

The editor confirms the message with ES_ACK. +

+
+

Note: In the protocol Version 1.00 no provision was made +for parameters for SE_CLOSE. Editors that only support Version 1.00 +will therefore ingnore the file masks and the flag and save all texts. +

+

15.9.3.11 SE_MENU

+

The shell tells the editor what it should enter for individual +programs in its menu. This way the editor can use the same texts as +the shell for those menu entries that trigger an action in the shell. +

+
+

Make-up of the message: +

+ + + +
Word 3+4: A pointer to an info structure, which is built up as follows: +
  + +
+ + +
  typedef struct
+  {
+    char *compStr;      /* Text for the menu entry "Compiler"       */
+    char *makeStr;      /* Text for the menu entry "Makefile"       */
+    char *makeAllStr;   /* Text for the menu entry "Make all"       */
+    char *linkStr;      /* Text for the menu entry "Linker"         */
+    char *execStr;      /* Text for the menu entry "Execute"        */
+    char *makeExecStr;  /* Text for the menu entry "Make & Execute" */
+    char *progName;     /* Name of the shell (from version 1.04 on) */
+    char *shellCtrlStr; /* Text for the menu entry "Shell Control"  */
+                        /* (from version 1.05 on)                   */
+  } SEMENUINFO;
+
+
+

Reply: +

+

The editor confirms the message with ES_ACK. +

+
+

Note: The texts are all optional and can also be NULL if +the shell has no corresponding menu entry. This does not mean, +however, that the shell does not offer this functionality. Therefore +the editor should insert defaults for all texts if necessary. +

+

This message exists only from protocol Version 1.02 onwards. But +a test if the corresponding bit in ES_INIT or ES_OK is set is +sufficient. +

+

When accessing progName and shellCtrlStr one has +to ensure that the communications partner also supports these already +(test the protocol version)! +

+

15.9.4 Messages from the editor to the shell

+

The editor can send the following messages or commands to the +shell: +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MessageNumber
ES_INIT0x4240
ES_OK0x4241
ES_ACK0x4242
ES_COMPILE0x4243
ES_MAKE0x4244
ES_MAKEALL0x4245
ES_LINK0x4246
ES_EXEC0x4247
ES_MAKEEXEC0x4248
ES_PROJECT0x4249
ES_QUIT0x424A
ES_SHLCTRL0x424B
+
+ +
+

15.9.4.1 ES_INIT

+

The editor asks whether a shell understands the SE protocol. +

+
+

Make-up of the message: +

+ + + + + + + + + +
Word 3: A bitset specifying which shell messages are understood: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MessageBitHex value
SE_INIT00x0001
SE_OK10x0002
SE_ACK20x0004
SE_OPEN30x0008
SE_ERROR40x0010
SE_ERRFILE50x0020
SE_PROJECT60x0040
SE_QUIT70x0080
SE_TERMINATE80x0100
SE_CLOSE90x0200
SE_MENU100x0400
+
+ +
Word 4+5: A bitset specifying which editor commands are sent: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MessageBitHex value
ES_INIT00x0001
ES_OK10x0002
ES_ACK20x0004
ES_COMPILE30x0008
ES_MAKE40x0010
ES_MAKEALL50x0020
ES_LINK60x0040
ES_EXEC70x0080
ES_MAKEEXEC80x0100
ES_PROJECT90x0200
ES_QUIT100x0400
ES_SHLCTRL110x0800
+
+ +
Note: WORD 4 and 5 together form a LONGword. Since the +messages defined to date only require 12 bits, WORD 4 will normally be +NULL. +
  +
Word 6: Supported version number of the protocol as BCD number, thus +0x0105 (hexadecimal) for Version 1.05 +
  + +
+ +
+

Reply: +

+

As a reply the editor receives SE_OK from the shell. +

+

15.9.4.2 ES_OK

+

The editor replies to the query from the shell about the +protocol. +

+
+

Make-up of the message: +

+ + + + + + + + + + + + +
Word 3: A bitset specifying which shell messages are understood: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MessageBitHex value
SE_INIT00x0001
SE_OK10x0002
SE_ACK20x0004
SE_OPEN30x0008
SE_ERROR40x0010
SE_ERRFILE50x0020
SE_PROJECT60x0040
SE_QUIT70x0080
SE_TERMINATE80x0100
SE_CLOSE90x0200
SE_MENU100x0400
+
+ +
Word 4+5: A bitset specifying which editor commands are sent: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MessageBitHex value
ES_INIT00x0001
ES_OK10x0002
ES_ACK20x0004
ES_COMPILE30x0008
ES_MAKE40x0010
ES_MAKEALL50x0020
ES_LINK60x0040
ES_EXEC70x0080
ES_MAKEEXEC80x0100
ES_PROJECT90x0200
ES_QUIT100x0400
ES_SHLCTRL110x0800
+
+ +
Note: WORD 4 and 5 together form a LONGword. Since the +messages defined to date only require 12 bits, WORD 4 will normally be +NULL. +
  +
Word 6: Supported version number of the protocol as BCD number, thus +0x0105 (hexadecimal) for Version 1.05 +
  +
Word 7: The apID of the program whose message is replied to +
  + +
+ +
+

Reply: +

+

None (ES_OK is already the reply of the editor to the message +SE_INIT). +

+

15.9.4.3 ES_ACK

+

The editor confirms the receipt of the command. +

+
+

Make-up of the message: +

+ + + +
Word 3: TRUE : Command will be understood and executed +
FALSE: The command is not understood +
  +
An ES_ACK with TRUE says nothing about whether the command was +executed successfully. It only says that the editor understands the +command and will execute it! +
  + +
+ +
+

Reply: +

+

None (ES_ACK is already a reply to a message). +

+

15.9.4.4 ES_COMPILE

+

The editor tells the shell that it should translate a file. A +pointer to the filename can be passed in the message. +

+
+

Make-up of the message: +

+ + + +
Word 3+4: Pointer to the name of the file to be compiled, or NULL. +
  + +
+ +
+

Reply: +

+

This message must be confirmed with SE_ACK. +

+
+

Note: Provision for setting the name of the file to be +compiled to NULL is available only in protocol versions from 1.03 on. +The editor should therefore check beforehand that the shell supports +at least protocol Version 1.03. +

+

15.9.4.5 ES_MAKE

+

The editor tells the shell that it should perform a 'make'. A +filename can be passed in the message, but does not have to be set and +also does not have to be paid regard to by the shell! +

+
+

Make-up of the message: +

+ + + +
Word 3+4: Pointer to the mame of the makefile, or NULL +
  + +
+ +
+

Reply: +

+

The shell confirms the message with SE_ACK. +

+

15.9.4.6 ES_MAKEALL

+

The editor tells the shell that a complete 'make all' is to be +performed. A filename for the makefile can (but does not have to) be +passed in the message. +

+
+

Make-up of the message: +

+ + + +
Word 3+4: Pointer to the name of the makefile or NULL +
  + +
+ +
+

Reply: +

+

The shell confirms the message with SE_ACK. +

+

15.9.4.7 ES_LINK

+

The editor tells the shell that a program is to be linked. A +filename can be passed in the message, but does not necessarily have +to be paid regard to by the shell! +

+
+

Make-up of the message: +

+ + + +
Word 3+4: Pointer to the name of the source that is to be linked or NULL +
  + +
+ +
+

Reply: +

+

The shell confirms the message with SE_ACK. +

+

15.9.4.8 ES_EXEC

+

The editor tells the shell that the program for the source is to +be executed. A filename can be passed, but does not have to be paid +regard to by the shell. +

+
+

Make-up of the message: +

+ + + +
Word 3+4: Pointer to the name of the file to be executed or NULL +
  +
For a source file it may be necessay to compile and/or link it +first +
  + +
+ +
+

Reply: +

+

The shell confirms the message with SE_ACK. +

+

15.9.4.9 ES_MAKEEXEC

+

The shell should perform a 'make' and execute the program +afterwards. A filename for the makefile can (but does not have to be) +passed in the message. +

+
+

Make-up of the message: +

+ + + +
Word 3+4: Pointer to the name of the makefile or NULL +
  + +
+ +
+

Reply: +

+

The shell confirms the message with SE_ACK. +

+

15.9.4.10 ES_PROJECT

+

The editor tells the shell that the project has been +altered/changed. The filename of the project file will be passed as a +parameter in the message. If NULL is passed, then the current project +should be logged off. +

+

A sensible reaction of the shell in this case would be to also +change the project, as long as it supports this. +

+
+

Make-up of the message: +

+ + + +
Word 3+4: Pointer to the name of the projectfile or NULL +
  + +
+ +
+

Reply: +

+

The shell confirms the message with SE_ACK. +

+
+

Note: Provision for setting the name of the projectfile +to NULL is only available in protocol versions from 1.01 on. The +editor should therefore check beforehand that the shell supports at +least protocol Version 1.01. +

+

15.9.4.11 ES_QUIT

+

The editor tells the shell that it is now being terminated. The +shell should forget about the editor as a communications partner in +that case. +

+
+

Make-up of the message: +

+
+
No parameters
+
+

+
  +

+ +
+
+
+

Reply: +

+

No reply is expected! +

+

15.9.4.12 ES_SHLCTRL

+

Message of the editor for controlling the shell. +

+
+

Make-up of the message: +

+ + + + + + +
Word 3+4: Pointer to the name of the topped window of the editor or NULL +
  +
Word 5: Control flags: +
Bit 0: Shell should top itself (Menu/Window) +
  + +
+ +
+

Reply: +

+

The shell confirms the message with SE_ACK. +

+
+

Note: This message exists only from protocol Version +1.05 onwards. The remaining bits of WORD 5 are reserved for future +extensions. +

+

15.9.5 History, SE protocol

+

Version 1.05 of 23.12.1997 +

+ + +
+

Version 1.04 of 08.01.1997 +

+ + +
+

Version 1.03 of 19.11.1996 +

+
    +
  • For ES_COMPILE the pointer to the filename may now also be NULL +
      +

  • +
+ +
+

Version 1.02 of 13.08.1996 +

+
    +
  • New message SE_MENU +
      +

  • +
  • For SE_OPEN one can now also specify a line and a column +
      +

  • +
+ +
+

Version 1.01 of 30.01.1996 +

+ + +
+

Version 1.00 of 17.01.1994 +

+
    +
  • First published version +
      +

  • +
+ +

15.9.6 Authors and programs

+

The SE protocol was developed by Dirk Steins and Frank Storm, +while the extensions to the newer protocol versions originate from +Christian Felsch and Dirk Haun. +

+

The number of programs that support the SE protocol is +unfortunately not very large as yet: +

+
    +
  • Editors: +
      +

      +
    • Clix by Steffen Engels +
        +

    • +
    • Everest by Oliver Schmidt (from version 3.5 on) +
        +

    • +
    • Fred by Dirk Steins +
        +

    • +
    • qed by Christian Felsch (from version 3.3 on, in +addition from version 3.70 the protocol version 1.01 is supported as +well) +
        +

    • +
    + +

  • +
  • Shells: +
      +

      +
    • Chatwin by Dirk Haun (from version 3.04 the SE protocol +is supported completely, older versios support only the most important +messages) +
        +

    • +
    • Shell for Megamax Modula-2 by Thomas Tempelmann and +Dirk Steins +
        +

    • +
    • PC-Shell by Frank Schramm (from version 3.01 on) +
        +

    • +
    + +

  • +
  • Miscellaneous: +
      +

      +
    • SE-Lib by Manfred Rosenboom and Dirk Haun +
        +
      This library is accompanied also by SE-Evaluator, a kind of +debugger for the SE protocol. +
        +

    • +
    + +

  • +
+ +

It is to be hoped that further editors and shells will support +this useful protocol in the future. We hope that this text will help +its wider distribution and adoption. +

+
+

Dirk Haun, 23.12.1997 +
English version: Peter West, DDP Translations +

+
+ +Home +ProtocolsProtocols +OLGA protocolOLGA protocol +System Services Protocol (SSP)System Services Protocol (SSP) + + diff --git a/en/proto_ssp.html b/en/proto_ssp.html new file mode 100644 index 000000000..12389a7df --- /dev/null +++ b/en/proto_ssp.html @@ -0,0 +1,2284 @@ + + + + + +The documentation for TOS: System Services Protocol (SSP) + + + + + + + + + +Home +ProtocolsProtocols +SE protocolSE protocol +View protocolView protocol + +
+ +

15.10 System Services Protocol (SSP)

+

The purpose of the System Services Protocol (SSP) is described +in 'What is SSP?' +

+

Planning phase +

+

+

Idea: Joakim Högberg +
Server Code and this Specification: Olaf Piesche +

+

CCurrently involved in specification, planning and future first +implementations: +

+

Joakim Högberg (AtarICQ) +
Lonny Pursell (AtarIRC) +
Olaf Piesche(Smurf) +
Odd Skancke (TextView) +
Jo Even Skarstein (TaskBar) +
Ralph Lowinski (GuiTar) +
Rafal Kawecki (WAP-Browser, ArchView) +
Dan Ackermann (mICQ, AtarICQ-Overlay) +
Jan Krivanek (Atack) (aMail, aFTP) +
Erik Häll (MyMail) +
Martin Elsässer (ACSPro) +
Denis Huguet FalcAmp +

+

Emailed people (got the spec, waiting for reply): +

+

Joachim Fornallaz (GEMSetup) +

+

News +

+

UPDATED to V0.9: Nov. 17th, 2000 (see changes!) +

+

Dec. 9th, 4:39pm +
Martin Elsässer has announced interest to implement SSP in +ACSPro. That means that all applications constructed with ACSPro could +support basic SSP functionality from the start! +

+

Nov. 17th, 1:46pm +
AES message definitions added. Basically the protocol is ready. +

+

Just decided that the Server will feature 2 different debug +modes. Because it will take a short while until we have implemented +the protocol, it might be difficult to find out if the protocol is +implemented correctly in terms of how SPAs and SRAs react to different +messages. The standard debug mode will feature output and logging of +incoming and sent messages and their parameters, but this doesn't show +the reaction of SPAs and SRAs to different messages, if the protocol +implementation in these applications is not finished. This will be +solved by the Server providing an extended debug mode in which it can +simulate both SRAs and SPAs, additionally to the logging. +

+

SPA programers: you'll get a dialog window in which you can send +different service requests directly from the Server, as if another +application requested a service (SRA simulation). +

+

SRA programmers: You'll have display in the same dialog window +showing different requests coming in, and the Server will simulate +being an SPA and sending back acknowledgement (SPA simulation) +including simulation of Service Initialization and DRS delays. +

+

The debug modes will not be available in the first official +release version, to keep the Server code small and efficient. +

+

About this spec +

+

Welcome to the online SSP specs ;) +

+

I want to ask everybody involved to tell me if you send the +specs to somebody else, so that we can keep track of things and I can +send updates to everybody. +

+

Target for V1.0 is an as complete as possible spec of Send +File, Display Message, Send Message, Status Display, Context Popup, +Compress File and Display Information Services. +

+

These are the services that will be primarily used by the +currently involved applications. +

+

Changes to the spec will be listed on the 'SSP changes' page. +

+

Everybody involved is encouraged to come up with suggestions, +improvement, criticism and anything else you can come up with. There +are 2 reasons for not specifying SSP alone and releasing it then. One +is, this way we have a broad base of applications supporting the +protocol at release time already, which will increase the acceptance +of it on the side of the users, and hence also on the side of +developers. The other reason, just as, if not more important, is that +this way not only ideas of one or two persons flow into the project, +but of a variety of developers working on all different kinds of +software. That'll make SSP more versatile and flexible and make it +take several different points of view into account. Read SSP changes +for everything else ;) +

+

15.10.1 SSP changes

+

Specification changes as of Nov. 17th, 2000 +

+
    +
  • Updated spec version number to V0.9 +
      +

  • +
  • Little tweaks here and there +
      +

  • +
  • Added constant definitions for the AES messages. SSP +reserves messages from 4719 to 4749 (currently using the first 6) for +future use. With this, the protocol is practically ready for +implementation! +
      +
    Update to 1.0 will be done as soon as I start implementing the +server (in about a week I hope), and if no more suggestions for +changes are made. +
      +

  • +
+ +

Specification changes as of Nov. 9th, 2000 +

+
    +
  • Updated spec version number to V0.85 +
      +

  • +
  • Added instructions on how to implement SSP as a SPA and SRA, +including some short sample code. +
      +

  • +
+ +

Specification changes as of Nov. 7th, 2000 +

+
    +
  • updated spec version number to V0.8 +
      +

  • +
  • Added the first constant definitions including a short explanation of the +determintation of services on Server side as reaction to SSP_SRASR and +its data identification. +
      +

  • +
  • Updated the services with necessary value of dataID for using +specific services. +
      +

  • +
+ +

Specification changes as of Nov. 6th, 2000 +

+
    +
  • Updated spec version number to V0.77 +
      +

  • +
  • Added spec of server registration +
      +

  • +
  • Updated Status Display Service with possibility to remove the +status icon (e.g. when exiting the SRA). Shame, I didn't think of that +when I specified it... +
      +

  • +
  • Added message directions in the message +descriptionsServer", to make more clear who sends which message, +and where to +
      +

  • +
+ +

Specification changes as of Nov. 4th, 2000 +

+
    +
  • Updated spec version to 0.75 +
      +

  • +
  • Added what is SSP? section as an introduction. +
      +

  • +
  • Changed Timeouts and Errors - the pipeline scheme showed me +something I didn't see before (that's pretty sad...): the SRA can't +know if services are Immediate or Delayed Response. Hence, timeouts +will have to be handeled completely by the server. This shows how good +it is to have a thorough plan before implementing something like +this... +
      +

  • +
  • Added SSP message pipeline scheme to make the way it works more +transparent ;) +
      +

  • +
  • Changed Context Popup Service spec to including mouse +parameters into the SSP_SRASR and SSP_SSIR messages +
      +

  • +
  • Added Information Display Service in conjunction with Status Display Service. SPAs +providing Status Display should also be able to request Information +Display. Updated the Software list concerning this. +
      +

  • +
+ +

Specification changes as of Nov. 3rd, 2000 +

+
    +
  • Introduced this website and wrote some new stuff into 'about +this spec' on the mainpage +
      +

  • +
  • Added no-write-rule to general rules concerning shared memory +handling +
      +

  • +
  • Added list of prospective SSP implementing software with +possible services for each of the apps +
      +

  • +
  • SSP_SRASR: changed and updated data type spec for SRA service +request +
      +

  • +
  • Added handling of folder names to the send file, upload file +and compress file service specs in Services, SSP_SENDFILE, +SSP_UPLOADFILE, and SSP_COMPRESSFILE, see the service implementation +notes. +
      +

  • +
  • Decided to implement SSP into a text editor shared/static +library under development by Olaf, added the lib to implementing +software list +
      +

  • +
  • Moved Jo Even, Odd and Ralph to the involved developers list ;) +
      +

  • +
+ +

15.10.2 What is SSP?

+

SSP is an approach to make functionality of different +applications useable throughout the whole system. All applications are +targeted, although networking applications will probably benefit most +quickly. SSP is a Client-Server architecture. The SSP-Server +(background application) has globally registered applications +providing different services (service providing applications or SPAs). +Service Requesting Applications (SRAs) can use the SPA's services +for their own documents. +

+

Example: +

+
    +
  • User opens popup by right clicking into an image in Smurf +
  • +
  • User chooses 'System Services' in the popup and another popup +
  • +
  • with all possible services opens (provided by the SSP-Server) +
  • +
  • User chooses 'Send file' and another popup with registered Send +File Service applications opens (provided by SSP-Server) +
  • +
  • User chooses for example AtarICQ +
  • +
  • Smurf sends Service Initialization Request (SIR) for Send File +and chosen SPA (AtarICQ) to SSP-Server +
  • +
  • SSP-Server, if necessary, starts AtarICQ and sends Send File +SIR along with request for list of possible recipients +
  • +
  • AtarICQ sends list of online users to SSP-Server +
  • +
  • SSP-Server opens popup with possible recipients +
  • +
  • User chooses one +
  • +
  • Server sends Service Use Request (SUR) for Send File service to +SPA (aICQ) +
  • +
  • aICQ opens connection to recipient and sends image file +
  • +
  • aICQ confirms the Server with SPA Service Acknowledge (SPASA) +
  • +
  • Server confirms Smurf with Server Service Acknowledge (SSA) +
  • +
+ +

Possible services and registered applications are held in +different configuration files on the Server side. When new +applications want to be registered, it can be done at the first +communication between the SSP-Server and the application, or pre-use, +by the application installer or config program. The first possibility +is for convenience to the user, because simply copying and using a new +version of a program would not corrupt the registration with the +SSP-Server, since the application would register itself with the +Server at startup. Registering with the SSP-Server consists of a short +communication in which the program path and name of the SPA and the +provided services are sent to the Server. The Server could runtime +(when services are requested by the SRA) check for the existence of +registered SPAs, which will prevent errors upon service +initialization. +

+ +

What is the SSP-Server? +

+

The SSP-Server is an application running in the background that +manages all communication between SRAs and SPAs. All services are +hardwired into the Server. This system has been chosen for several +reasons: +

+
    +
  • The Server can perform error checking, correction and +prevention, which takes workload off the developers of implementing +SPAs and SRAs +
      +

  • +
  • The Server can perform user interaction (choice of service, +choice of SPA, user parameter input) without the SPAs and SRAs having +to hassle with it. +
      +

  • +
  • Appearance of the user interactive parts (popups, dialogs for +parameter input, etc.) is consistent +
      +

  • +
  • Hardwiring the services prevents messy implementation and +introduction of new services +
      +

  • +
  • The Server can combine different services into one, for example +Compress File Service and Send File or Upload File Service to Compress +and Send or Compress and Upload, without the SRAs and the SPAs having +to know about it. +
      +

  • +
  • The protocol can be extended in many cases (e.g. with global +contacts, see 5.) without interfering with any previous +implementations and specifications. +
      +

  • +
+ +

The Server may install a cookie to indicate its presence. This +might make it possible to have the Server run without menu_register, +which would keep it more or less completely invisible to the user. +This will prevent accidental termination of the Server (by +[Control]-clicking on its desk-menu entry) and make it work more as an +integral part of the system. +

+

The SPAs have to register with the Server. Currently, the best +way to do this seems to be at 2 different points: +

+

a. At the SPA's first time installation +
b. At every startup of the SPA +

+

b is for convenience and reliability reasons. Sending a small +registration information block to the Server at any SPA startup makes +it possible, for example, to simply copy a new version of an SPA over +an old one. If the new version supports new services, the Server will +find out about this on the SPA's startup and can automatically update +its configuration files, without the user having to mess with +anything. +

+

The user will have the possibility to switch single SPAs for +certain services on and off, for example for the Status Display +Service (see sspServices.txt). Registration protocol still has to be +specified. +

+

15.10.3 SSP messages

+

Messages are currently undefined. Free AES message numbers +have to be found and the SSP messages defined. +

+ +
    +
  1. Service Requesting Application Service Request +
      + +

    #define SSP_SRASR 0x126F
    +SRA -> Server
    +
    +AES message-buffer:
    +
    +  [0]    = SSP_SRASR
    +  [1]    = appl_id        - Application ID of SRA
    +  [2][3] = (long)dataLen  - LONG that gives length of data in the
    +                            shm-block
    +  [4]    = dataID         - Data identification (SSP_TEXT,
    +                            SSP_FILENAME ...)
    +  [5]    = shmID          - ID number for shared memory file
    +  Filename for shm-file is u:/shm/[applid]_data[id].ssp
    +
    +  For example, if Smurf has appl_id 25, is sending a file and
    +  chose id 0: u:/shm/25_data0.ssp
    +
    +
    The shm-block contains data to be transferred: +
      + + + + + + + + + + + + +
    SSP_COMPRESSFILE: Complete Filepath, including name and extension +
      +
    SSP_SENDFILE: Complete Filepath, including name and extension +
      +
    SSP_UPLOADFILE: Complete Filepath, including name and extension +
      +
    SSP_SENDMSG: Complete text message to be sent +
      + +
    + +
    [4] is important to the Server. Since the SRA doesn't have any +influence on the selection of services by the user, the SRA has to +tell the Server what the shared memory block contains, so that the Server can +decide which services apply to the data, how these services are to be +handled and what to send to the SPA, especially when combining +services. +
      +
    This is all the SRA has to do. The Server will open +popups/dialog windows for choosing possible services and service +providing applications - open shared memory file with Fcreate and Fcntl, +Fclose - send SRASR message to SSP-Server +
      +

  2. +
  3. Server Service Initialization Request +
      + +

    #define SSP_SSIR 0x1270
    +Server -> SPA
    +
    +AES message-buffer:
    +
    +  [0] = SSP_SSIR
    +  [1] = requestID - ID of Server request (SSP_RECIPIENTS,
    +                                          SSP_COMPRESSFORMAT...)
    +  [2] = sessionID - ID of SSP session
    +  Filename for shm-file is u:/shm/[applID]_init[sessionID].ssp
    +
    +
    For example, if aICQ is to send a file to another user, [1] will +contain SSP_RECIPIENTS. aICQ is then to open an shm-file with the name +built by the above conventions: u:/shm/32_init0.ssp (given aICQs +appl_id is 32), containing a list of recipients (nicknames) +separated by CRLF terminated by NULL. requestID will only +contain values for possible services for the SPA, as transmitted to +the Server upon SSP initialization (e.g. aICQ will only receive +SSP_RECIPIENTS for SSP_SENDFILE and SSP_SENDMSG). The SPA has to +respond with SSP_SPASI. +
      +

  4. +
  5. Service Providing Application Service Initialization +
      + +

    #define SSP_SPASI 0x1271
    +SPA -> Server
    +
    +AES message-buffer:
    +
    +  [0] = SSP_SPASI
    +  [1] = sessionID - ID of SSP session as given in SSP_SSIR
    +
    +
    The Server holds the status of each session and can hence +determine by the sessionID the name of the shm-file to open +and the type of data that it contains. +
      +
    In the SSP_SENDFILE / SSP_RECIPIENTS case, the Server will +retrieve the list of recipients from the file and open a popup/dialog, +listing them. After the user picks a recipient, the SPA will receive +SSP_SSUR: +
      +

  6. +
  7. Server Service Use Request +
      + +

    #define SSP_SSUR 0x1272
    +Server -> SPA
    +
    +AES message-buffer:
    +
    +  [0]    = SSP_SSUR
    +  [1]    = serviceID    - ID of service (e.g. SSP_SENDFILE)
    +  [2]    = sessionID    - ID of SSP session as given in SSP_SSIR
    +  [3][4] = (long)initID - ID of picked initialization datum
    +  [5]    = shmID1       - ID 1 for shm-block
    +  [5]    = shmID2       - ID 2 for shm-block
    +  [7]    = sspPar1
    +  [8]    = sspPar2
    +
    +
    The SPA can then open the file u:/shm/[shmID1]_data[shmID2].ssp +(e.g. 25_data0.ssp) and retrieve the data, initID is the +number of the initialization datum chosen by the user, for a ICQ +sendfile it would be the number of the recipient out of the list it +transmitted in SSP_SPASI. 1 would be the first recipient, n the n-th. +
      +
    The shm file contains: +
      + + + + + + + + + + + + +
    SSP_COMPRESSFILE: Complete filepath, including name and extension +
      +
    SSP_SENDFILE: Complete filepath, including name and extension +
      +
    SSP_UPLOADFILE: Complete filepath, including name and extension +
      +
    SSP_SENDMSG: Complete text message to be sent +
      + +
    + +
    sspPar1 and sspPar2 are parameters set by the +Server that indicate what to do. For SSP_SENDFILE, both are unused. +For SSP_COMPRESSFILE sspPar1 would be the ID of a shared memory file +(u:/shm/cffile[ssPar1].ssp) that contains the filename to pack the +archive to. +
      +
    For SSP_UPLOADFILE sspPar1 would be the ID of a shared +memory file u:/shm/uplfile[sspPar1].ssp) that contains the directory +name to upload the file to on the chosen Server (initID). +
      +
    The SPA is to copy or use the data contained in the +shm-block as quickly as possible, and then send SSP_SPASA back to the +Server. After that, the service should be performed (see also +Immediate Response and Delayed Response services!) +
      +

  8. +
  9. Service Providing Application Service Acknowledge +
      + +

    #define SSP_SPASA 0x1273
    +SPA -> Server
    +
    +AES message-buffer:
    +
    +  [0] = SSP_SPASA
    +  [1] = sessionID - ID of SSP session as given in SSP_SSIR
    +
    +
    This acknowledges performing the service and closes the current +session. Finally, the Server will send SSP_SSA to the SRA, after +receiving SSP_SPASA: +
      +

  10. +
  11. Server Service Acknowledge +
      + +

    #define SSP_SSA 0x1274
    +Server -> SRA
    +
    +AES message-buffer:
    +
    +  [0] = SSP_SSA
    +  [1] = dataID  - ID of data shm file as given in SSP_SRASR
    +
    +
    This indicates that the service is performing or has been +performed, and the SRA can close and delete the shared memory file +u:/shm/[appl_id]_data[dataID].ssp (e.g. 25_data0.ssp) using Fdelete. +
      +

  12. +
+ +

15.10.4 Services

+

The services are not directly requested by the SRA, but +determined by the Server, from the data identification provided by the +SRA in messagebuf[4] when sending SSP_SRASR. +

+
    + +
  • SSP_SENDFILE - Send File Service +
      +
    Interactive IRS +
      +
    Used to make a networking application send a file to a +destination (user). +
      +
    Upon sending of the SSP_SRASR message from the SRA to the +Server, the shared memory block will contain a NULL-terminated filename for +the file to be sent. dataID has to be SSP_FILENAME. +
      +
    The Server will request SSP_RECIPIENTS from the SPA with +SSP_SSIR. The SPA then has to provide a shared memory block that +contains a list of possible recipients separated by CRLF terminated by +NULL with the SSP_SPASI message. The Server will open a list of the +recipients for the user to choose from. +
      +
    The SPA will then receive a SSP_SSUR message containing the +number of the recipient from the list in ssp_par1 +(messagebuf[6]). The shared memory block will contain the NULL- +terminated filename of the file to be sent. +
      +
    The SPA concludingly has to send SSP_SPASA to the Server, to +close the session. +
      +
    The Server will send SSP_SSA to the SRA, indicating the service +is in progress and the shared memory file can be closed and deleted by +the SRA. +
      +
    Notes: +
    Synchronization of the global contacts and the local contacts of +the SPA can be done at this point. +
    Folders: if a directory name instead of a filename is passed, the +SPA should try to send the complete file folder, including all +subdirectories and all files inside. +
      + +

  • +
  • SSP_STATUSDISPLAY - Status Display Service +
      +
    Invisible IRS +
      +
    Used to make any application (preferably those with permanent +screen displays, for example TaskBar or MultiStrip or any Desktop) +display status icons of other applications. Also see the Context Popup +Service, which applications providing this service should implement to +be able to request a popup menu in context to the current status from +the SDS requesting app. +
      +
    Upon sending of the SSP_SRASR message, the SRA's shared memory block +will contain icon data. +
    A dataLen (messagebuf[2]/[3]) value of 0 (zero) +removes the icon from the status display. This has to be done before +exiting the SPA! +
    dataID has to be SSP_STATUSICON. +
      +
    The Server will send SSP_SSIR with SSP_SDS as requestID, +indicating use of the Status Display Service with the application id +of the SRA in msgbuf[6] for distinguishing different SRAs on the SPAs +side (e.g. to maintain consistent status icon positions in the +display). +
    SSP_SSIR will be sent to all registered SPAs providing this +service, that are switched on for SDS by the user. If +requestID (messagebuf[1]) is SSP_ENDSDS, the SPA has to remove +the icon referring to the status of the application with the +appl_id sent. +
      +
    The SPA will answer with SSP_SPASI without any further +parameters. +
      +
    The Server will then send SSP_SSUR containing the application ID +of the SRA in msgbuf[6]. The shared memory file will contain the icon data +(16x16) to display. If requestID in SSP_SSIR was SSP_ENDSDS, +the shm-block contains no data! The SPA has then to remove the status +icon of the SRA. +
      +
    The SPA will answer with SSP_SPASA +
      +
    The Server will send SSP_SSA to the SRA, to indicate the status +display has been updated, and the shm-file can be deleted. +
      +
    Notes: +
    Upon registration of the SPAs with the Server, the Server will +check if any not formerly registered apps providing the Status Display +Service have registered. If so, a list of these SPAs will be presented +to the user, with the possibility to turn the status display for +single applications on and off. This makes it possible for the user to +choose where the status icons are to be displayed. SPAs that are +switched off for status display will not receive SSP_SSIR messages +from the Server. +
      + +

  • +
  • SSP_DISPLAYMESSAGE - Display Message Service +
      +
    Invisible IRS +
      +
    Used to make an application display a text message from another +application in one of their own windows. For example, messages +received in iconified aICQ windows can be sent to be displayed in +visible aIRC windows and vice versa. +
      +
    Upon sending of SSP_SRASR by the SRA, the shared memory block will +contain the text to display. dataID has to be SSP_TEXT. +
      +
    The Server will send SSP_SSIR with the application ID of the SRA +in msgbuf[6] to the SPA +
      +
    The SPA will answer with SSP_SPASI +
      +
    The Server will send SSP_SSUR containing the application ID of +the SRA in msgbuf[6]. The shared memory block will contain the text to +display. +
      +
    The SPA will display the text and answer with SSP_SPASA. It is +up to the SPA to choose one or more of its windows to display the text +in. +
      +
    The Server will send SSP_SSA to the SRA. +
      +
    Notes: +
    Other than with the send message service, the text message is only +to be displayed by the SPA, not sent over network connections +to other users. +
      + +

  • +
  • SSP_SENDMESSAGE - Send Message Service +
      +
    Interactive IRS +
      +
    Used to make a (network) application post a message from another +application in one of their own windows to a certain destination. For +example, a text block selected in an editor can be sent to an online +user in aICQ or to a channel or chat in aIRC, or as an email by any +email client. +
      +
    Upon sending of SSP_SRASR by the SRA, the shared memory block will +contain the text to post. dataID has to be SSP_TEXT. +
      +
    The Server will send SSP_SSIR requesting SSP_RECIPIENTS to the +SPA. +
      +
    The SPA will answer with SSP_SPASI providing a list of possible +destinations in shared memory (e.g. online users in aICQ or open +channels/chats in aIRC) separated by CRLF terminated by NULL. The +Server will open a list with possible destinations for the user to +choose from. +
      +
    The SPA will then receive a SSP_SSUR message containing the +number of the recipient from the list in ssp_par1 +(messagebuf[6]). The shared memory block will contain a NULL- +terminated string that is the message to send. +
      +
    The SPA will post the text to the chosen destination and answer +with SSP_SPASA. +
      +
    The Server will send SSP_SSA to the SRA. +
      +
    Notes: +
    Synchronization of global and local contacts can be done at this +point. The Server might be able to determine if the recipients are +email addresses (maybe by the SPAs registration information) and +provide a possibility to type in a new recipient for the user. +
      + +

  • +
  • SSP_UPLOADFILE - Upload File Service +
      +
    Interactive IRS +
      +
    Used to make a networking application (ftp client or similar) +upload a file to a destination (Server/directory). +
      +
    Upon sending of the SSP_SRASR message from the SRA to the +Server, the shared memory block will contain a NULL-terminated filename for +the file to be uploaded. dataID has to be SSP_FILENAME. +
      +
    The Server will request SSP_RECIPIENTS from the SPA with +SSP_SSIR. The SPA then has to provide a shared memory block that +contains a list of possible destination Servers (from the favorites) +and a list of directories (from the favorites) with the SSP_SPASI +message: +
    server|user|pass|directory|directory[CRLF] +
    server|user|pass|directory|directory|directory[CRLF] +
    server|user|pass|directory[NULL] +
      +
    The Server will open a list of the destination Servers and +directories for the user to choose from, and/or provide a text edit +field for typing in Server, directory and login/password. +
      +
    The SPA will then receive a SSP_SSUR message, the shared memory +block will contain the NULL-terminated filename of the file to be sent +followed by the NULL-terminated Server name, NULL- terminated +directory. +
      +
    The SPA concludingly has to send SSP_SPASA to the Server, to +close the session. The Server will send SSP_SSA to the SRA, indicating +the service is in progress and the shared memory file can be closed +and deleted by the SRA. +
      +
    Notes: +
    The ftp servers, directories and user/pass combinations will be +held in global contacts as well, at some point. The SPA will still +send the local favorites, and the global contacts can be synchronized +with the local contacts by the Server at this point. Newly entered +contacts can be integrated into the global contacts. +
      +
    Folders: if a directory name instead of a filename is passed, +the SPA should try to upload the complete file folder, including all +subdirectories and all files inside. +
      + +

  • +
  • SSP_COMPRESSFILE - Compress File Service Interactive +DRS +
      +
    Used to make an archiver application compress a file +
      +
    Upon sending of the SSP_SRASR message from the SRA to the +Server, the shared memory block will contain a NULL-terminated filename for +the file to be compressed. dataID has to be SSP_FILENAME. +
      +
    The Server will request SSP_FORMATS from the SPA with SSP_SSIR. +The SPA then has to provide a shared memory block that contains a list +of possible compression formats (for TwoInOne e.g. LZH and ZIP, GuiTar +TAR, GZ, TGZ) with a SSP_SPASI message. The Server will open a list of +the formats for the user to choose from. The SPA can also provide one +format in different versions, e.g. for compression levels ZIP low, +medium and high compression. +
      +
    The SPA will then receive a SSP_SSUR message containing the +number of the format from the list in ssp_par1 +(messagebuf[6]). The shared memory block [shmID]_data.ssp will contain +the NULL- terminated filename of the file to be sent. Additionally, +the destination directory and filename for the archive will be +provided in a shm-block with the name [archiver- +appl_id]cmpname[sessionID].ssp, for example 25cmpname0.ssp, if the +archiver has appl_id 25. +
      +
    After finishing (!!) compression of the file, the SPA will send +SSP_SPASA. +
      +
    The Server will send SSP_SSA to the SRA, indicating the finished +compression of the file. +
      +
    Notes: +
    This service is a DRS, the acknowledge message is sent by the SPA +after finished compression of the file. This is because this service +can be combined with others (Send file or Upload file), so the archive +file might have to be used for the second service. +
      +
    Folders: if a directory name instead of a filename is passed, +the SPA should try to compress the complete file folder, including all +subdirectories and all files inside, incorpoating the directory +structure of the compression source into the compressed archive. +
      + +

  • +
  • SSP_CONTEXT - Context Popup Service Interactive IRS +
      +
    Used to make an app display a context menu in context of the +current status displayed with the Status Display Service at a certain +position on screen, and react on the user's choice from the popup. +
      +
    This service will be requested by the application that +provides the Status Display Service SPA will in this case also be SRA +and SRA also SPA. +
      +
    Upon sending of the SSP_SRASR message from the SRA (the SDS +providing application) to the Server, there will be no shared memory +block. dataID has to be SSP_CONTEXT. messagebuf[6] and [7] have to +contain the X- and Y-position of the mouse click, messagebuf[8] the +mouse button vector as returned from evnt_button or evnt_multi. +messagebuf[9] has to contain the application ID of the application +that the status icon refers to. The appl_id for every icon is +sent with the Status Display Service. dataID has to be +SSP_CONTEXTREQUEST. +
      +
    The Server will request SSP_POPUP from the SPA with SSP_SSIR. +
      +
    The SPA has to answer with an SSP_SPASI message. No parameters +(except requestID and sessionID) will be of any +meaning in either of the messages. +
      +
    The SPA will then receive a SSP_SSUR message containing the X- +position of the mouse click in messagebuf[6] and the Y-position in +messagebuf[7]. Both coordinates are screen coordinates with 0/0 in the +upper left corner. messagebuf[8] will contain the mouse button vector, +stating which button(s) have been pressed, as usually returned by the +AES evnt_xx functions. The SPA will then display its context popup, +preferably in context to the current status displayed with the Status +Display Service. +
      +
    After the user has chosen a popup entry, the SPA will send +SSP_SPASA. +
      +
    The SRA (the Status Display Service providing application) will +receive SSP_SSA. +
      +
    Notes: +
    When receiving the SSP_SSIR message, the application providing the +CPS (and hence requesting SDS) service, should open the context popup +as quickly as possible, to provide responsivity and reasonable user +feedback. +
      +
    The context popup should be in context to the current status +display, for example if aICQs context popup is opened, one menu entry +for connecting or disconnecting to an ICQ Server should be used, +saying 'Connect' if aICQ is disconnected, and 'Disconnect' if it is +already connected. Other possibilities would be to provide the other +user status modes (Online, Invisible, Do not disturb, etc.) in the +context popup for quick access, or an entry 'bring to top', that tops +all aICQ windows. Since the context popup is actually displayed and +handled by the application that uses the SDS, submenus and +hierarchical popups are possible and encouraged. Try to keep it +functional and easy to use, without overloading the context menus with +options. The application does not need to be fully operateable only by +the context menu, it's rather a way to make options that are +status-dependent or are frequently used accessible quickly and easily. +
      + +

  • +
  • SSP_DISPLAYINFO - Display Information Service Interactive +IRS +
      +
    Used to make an app send information (will mostly be used in +context of the current status displayed with the Status Display +Service) in the form of ASCII text. Can be used, for example, if a +BubbleGEM event on a Status Icon occurs in TaskBar, to make the +application requesting the status display send extended information +about the current status for TaskBar to display. +
      +
    This service will probably most commonly be requested by the +application that provides the Status Display Service SPA will in this +case also be SRA and SRA also SPA. +
      +
    Another possibility would be PS-Control-like applications, that +show system information about running processes (CPU and memory usage, +etc.). These could then also display information about the +application's current status. N.AES could use this service to display +the current status of the applications when switching apps with +[Alternate]+[Tab]. +
      +
    Upon sending of the SSP_SRASR message from the SRA (the SDS +providing application) to the Server, the shared memory block has to be a +buffer with space for the maximum size of displayable information and +read and write access rights. +
    dataID has to be SSP_INFOBUF. +
      +
    The Server will request SSP_INFO from the SPA with SSP_SSIR. +
    The SPA is to prepare the information to display (consider current +status). +
      +
    The SPA has to answer with an SSP_SPASI message. No params +(except requestID, sessionID) have any meaning. +
      +
    The SPA will then receive a SSP_SSUR message. +
    messagebuf[7] will contain the maximum length of +information. The SPA is then to copy the information to display +into the existing shared memory block provided with SSP_SSIR. The +SPA doesn't need to create its own shm-block. +
      +
    The SPA will send SSP_SPASA after copying the string to shm +and freeing temporary memory. +
      +
    The SRA (e.g. the Status Display Service providing application) +will receive SSP_SSA. This indicates that the information is now in +the shared memory file provided at SSP_SRASR and can be displayed, and +the shm-file deleted. +
      +
    Notes: +
    Careful with the shared memory on this one! The SRA has to +create the shared memory file as read/write! Otherwise the SPA +might not be able to copy the information text to it, if the operating +system supports access rights for shared memory! +
      +
    Delays for the information display (e.g. showing the display +after the mouse has been over the status icon for more than 2 seconds +or so) will be handled by the SRA. +
      +
    The information display should be in context to the current +status display, for example displaying the current user status mode +(Online, Invisible, Do not disturb, etc.) +
      +
    Only display vital information, try not to overload the bubble. +Use the information to display more details about what the current +status icon means, things like that. +
      +

  • +
+ +

15.10.5 SSP Server registration

+

Messages are currently undefined. Free AES message numbers +have to be found and the SSP messages defined. +

+

All SPAs have to register with the Server at installation and at +every startup of the application. Here's how it works: +

+ +
    +
  1. Service Providing Application Server registration +
      +
    #define SSP_SPASREG +
      +
    First initial message from the SPA to the Server. +
      +
    AES message-buffer: +
      +

      [0] = SSP_SPASREG
    +  [1] = appl_id           - Application ID of SPA
    +  [2][3] = (long)services - Long bit vector for supported services
    +                            (see below)
    +
    +
    Put your application ID into messagebuf[1]. messagebuf[2]/[3] is +a 32bit LONG value that describes the services provided by the +application, composed as follows: +
      +
    #define SSP_PSENDFILE        0x01
    +#define SSP_PSTATUSDISPLAY   0x02
    +#define SSP_PDISPLAYMESSAGE  0x04
    +#define SSP_PSENDMESSAGE     0x08
    +#define SSP_PUPLOADFILE      0x10
    +#define SSP_PCOMPRESSFILE    0x20
    +#define SSP_PCONTEXTPOPUP    0x40
    +#define SSP_PDISPLAYINFO     0x80
    +
    +
    Bringing the values together composes a bit-vector that tells +the Server which services are provided. Response to this message is +SSP_SREG. +
      +

  2. +
  3. SSP Server Registration +
      +
    #define SSP_SREG +
      +
    AES message-buffer: +
      +

      +[0] = SSP_SREG [1] = shmID - ID of shared memory block +
        +

      +
    + +
    shmID is identification for a shared memory block +provided by the Server with this message. +
      +
    For example, if Smurf has appl_id 25, the registration +shared memory block is: u:/shm/25_reg.ssp +
      +
    This shm-block provides 4096 bytes of space and is read/write. +Copy the full path and name of your application into this memory +block, terminate with CRLF and append the long application name of +your app (like used in menu_register) and terminate with NULL again. +Example: d:\apps\misc\my_application.app[CRLF]My +Application[NULL] +
      +
    For the special case that your application has changed the long +app name in a new version, terminate the application name with CRLF +instead of NULL and append other possible old application names, then +terminate with NULL: +
      +
    d:\apps\misc\my_application.app[CRLF]My old application[CRLF]My +newer Application [CRLF]My current Application[NULL] +
      +
    Respond to the Server with SSP_SPARF. +
      +

  4. +
  5. SSP Service Providing Application Registration Finish +
      +
    #define SSP_SPARF +
      +
    AES message-buffer: +
      +

      [0] = SSP_SPARF
    +  [1] = appl_id           - Application ID of SPA
    +  [2] = version as BCD    - Version ID of SPA
    +
    +
    Upon sending this message, the shm-block provided with SSP_SREG +must contain the full path and name of your application. +
      +
    The version ID is a binary coded decimal. For example, for +Version 1.0 of your program pass 0x0100. Version 1.01 would be 0x0101, +12.10 would be 0x1210. The version number in combination with the long +application name will provide pretty safe identifications of +applications for the Server, which will make automatic registration +and configuration update possible. +
      +
    This message closes the registration session. The Server will +take the sent data into its configuration and update existing +configurations for this application with the new one. +
      +

  6. +
+ +

15.10.6 General Rules

+
    +
  • All fixed message parameters are sent in the AES +message-buffer, data and extended parameters are sent in a shared memory +block. +
      +

  • +
  • There is no direct communication between SRA and SPA, the +Server handles all messages for purposes of error checking and +extending messages and parameters with Server-handled components (e.g. +providing GEM object structures for popups and similar) +
      +

  • +
  • SPAs should provide services with as litle output as possible. +For example when aICQ is started by the SSP-Server with a Send File +SIR, the contact list window should stay closed and only a file +transfer window be opened (maybe configurable) +
      +

  • +
  • Error-messages concerning protocol issues should be posted by +the SRA, so that the service use can be provided as completely as +possible on the SRA side without having to handle dialogs and messages +from the SPA. Timeouts on the SRAs side should depend on the service. +We will provide suggestions for error handling, timeouts and other +special cases in the final documentation. Error-messages concerning +performing the service should be posted by the SPA (e.g. file transfer +errors in aICQ). +
      +

  • +
  • The SPA is never to change data in the shared memory +blocks unless this is explicitly specified for the particular +service! Keep in mind it's shared, so every change the SPA does +might apply to the SRA as well. For the current services it is +absolutely necessary that the SPA does not write to the shared memory +blocks. Exceptions from this rule so far: Display Information Service. +
      +

  • +
+ +

Why shared memory? +

+

Using shared memory for the data and parameter transfer between +SPA, Server and SRA has several reasons. There is an ongoing fight +about whether to use globally allocated memory blocks (Mxalloc) or +shared memory for data transfer. Reasons that speak for shared memory +are the following: +

+
    +
  • Shared memory is generally considered 'cleaner' than global +memory blocks, and it's more or less the standard way to transfer data +in memory between applications in Un*x operating systems. +
      +

  • +
  • Using global memory blocks would mean that the SRA would have +to either hold all possibly transferrable data in global blocks (not +really an option), or, upon requesting a service, would have to +allocate a new global block of the size of the data, copy the data to +transfer there and free the memory block again after the service was +performed. Handling shared memory is easier, since it only consists of +an Fcreate and an Fcntl call. +
      +

  • +
  • Shared memory can be declared as read-only. I'm not sure if +this is currently implemented in MiNT, but the word goes that it will +be. That means, that there will be a general protection by the +operating system on the SRA's side against SPAs accidentally writing +into their memory blocks. +
      +

  • +
  • If we have an elegant mechanism like that which also works with +MiNT and MagiC, why not use it? +
      +

  • +
+ +

15.10.7 Timeouts and error handling

+

There will be no SRA-side timeouts. Timing out will be handled +completely on the Server side, because a) the SRA doesn't know about +Immediate or Delayed Response Services, and b) depending on the SPA +that might have to be started first, startup time may screw up SRA- +side timeouts. Besides that, it takes even more work off the SRA's +back ;) +

+

Timing out between SSP_SRASR and SSP_SSA will be done by the +SSP- Server, with consideration of startup times and IRS/DRS cases. +The amount of time before a service times out will have to be +determined once the first Server implementations and protocol +implementations on application side are done. Approximately 3 to 5 +seconds after possible startup of the SPA should be sufficient for +IRS. +

+

The Server will check all errors it can (nonexisting or empty +shm- files, etc.). If an error during a session occurs, the Server +will send SSP_SSA to the SRA to make sure the shm-file gets closed, +and then report the error in an alert box. Timeout for delayed +response services will depend on the type of service and on +Server-side determinations. For example, If the SPA knows an error +occured, it can send an error-message instead of SSP_SPASA. Still, in +case of a crash of the SPA, a timeout has to be implemented. +

+

Compress File Service timeouts can be done with consideration of +the time between size changes of the archive file, opened and closed +files or memory usage of the SPA. If none of the above changes, at +some point it's safe to say that some error occured during performing +the service (probably a crash of the SPA). In this case the Server +could try to terminate what's left of the SPA, close shared memory files, +clean up and close the communication session and start the whole thing +over (Server-side retry). If that doesn't work, the Server will send +SSP_SSA to the SRA to acknowledge and make sure the SRA frees +temporary memory and closes shared memory files, and then display an +error-message. +

+

15.10.8 SSP message pipeline

+

+

Every arrow is one AES message. This makes clear that there +are only 2 messages (send one, receive one) to handle for the SRA, and +only 4 (send 2, receive 2) for the SPA. The majority of the work is +done by the SSP-Server. The communication is a request-response +scheme, where every message has a response from the messages' +recipient. +

+

15.10.9 Defines (SSP)

+

Provided Services for Server registration +

+
#define SSP_PSENDFILE        0x01
+#define SSP_PSTATUSDISPLAY   0x02
+#define SSP_PDISPLAYMESSAGE  0x04
+#define SSP_PSENDMESSAGE     0x08
+#define SSP_PUPLOADFILE      0x10
+#define SSP_PCOMPRESSFILE    0x20
+#define SSP_PCONTEXTPOPUP    0x40
+#define SSP_PDISPLAYINFO     0x80
+
+

Services for Service Requesting Application Service Request +

+

Same as when registering to the Server. +

+
#define SSP_SENDFILE        0x01
+#define SSP_STATUSDISPLAY   0x02
+#define SSP_DISPLAYMESSAGE  0x04
+#define SSP_SENDMESSAGE     0x08
+#define SSP_UPLOADFILE      0x10
+#define SSP_COMPRESSFILE    0x20
+#define SSP_CONTEXTPOPUP    0x40
+#define SSP_DISPLAYINFO     0x80
+
+ +

Data identification for Service Requesting Application +Service Request +

+

messagebuf[4], identifies the type of data for the Server to +determine possible services. +

+

#define SSP_TEXT 0x01 +
The shared memory block contains NULL-terminated ASCII text. Possible +services will be: SSP_DISPLAYMESSAGE, SSP_SENDMESSAGE (sends or +displays the text directly) +
SSP_SENDFILE, SSP_UPLOADFILE, SSP_COMPRESSFILE and combinations +(sends, uploads or compresses Text as file) +

+

#define SSP_FILENAME 0x02 +
The shared memory block contains Null-terminated file path and +-name. Possible services will be: SSP_SENDFILE, SSP_UPLOADFILE, +SSP_COMPRESSFILE and combinations (sends, uploads or compresses file) +

+

#define SSP_STATUSICON 0x04 +
The shared memory block contains Icon data. Possible Service: +SSP_STATUSDISPLAY +
This service will be started and performed without user +interaction. The server will, when receiving SSP_SRASR with +SSP_STATUSICON as dataID, send a request for SSP_STATUSDISPLAY to the +SPA. +

+

#define SSP_INFOBUF 0x08 +
The shared memory block contains nothing but has to be a buffer +with space for the maximum length of displayable information +(determined by the SRA) and have read and write access rights.. +Possible Service: +
SSP_DISPLAYINFO +

+

#define SSP_CONTEXTREQUEST 0x10 +
No shared memory block has to be created. This dataID indicates +use of the Context Popup Service. Possible Service: +
SSP_CONTEXT +

+

This makes clear that the SRA usually does not request a +specific service. It provides a certain type of data to the Server +(and thus to the SPA), and the Server determines which services can be +used with this type of data. In case of SSP_CONTEXT, SSP_INFOBUF and +SSP_STATUSICON there is only one possible service. The Status Display, +Display Information and Context Popup Services are usually used in +conjunction. +

+

SRA-side definition of a data-type has the advantage that new +services can be introduced and immediately used with a new Server +release, without changes in the SRA. Also, the Server will provide the +popup menus for choosing SPA and service in context to the data +identification. For SSP_FILENAME for example, the popups could look +like this: +

+
+ + + + + + + + + + + + + + + + + + + + +
System Services ->Send File
 Upload File
 Compress File
 Compress & Send
 Compress & Upload
+
+ +

While for SSP_TEXT it could be like this: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
System Services ->Send as message
 Send as File
 Upload as File
 Compress as File
 Compress & Send as File
 Compress & Upload as File
+
+ +

AES message definitions +

+

We reserve the messages 4719 (0x126F) to 4739 (0x128D), messages +after 0x1274 for future use. +

+
#define SSP_SRASR  0x126F
+#define SSP_SSIR   0x1270
+#define SSP_SPASI  0x1271
+#define SSP_SSUR   0x1272
+#define SSP_SPASA  0x1273
+#define SSP_SSA    0x1274
+
+

15.10.10 How to implement an SRA

+

Here's a step-by-step instruction on how to implement SSP as a +Service Requesting application. All code provided here is also +available as sample code in the archive in the file SRAtools.c +(SRAtools.gfa for GFABasic, SRAtools.s for assembler). Use and modify +as necessary :) +

+

The data identification +

+

An important thing is that the SRA does not really request or +distinguish between specific services. The SRA rather determines a +dataID depending on the user action, and the type of object the user +action leading to the use of system services was performed on, and +sends this dataID to the Server. The Server will then figure out which +services can be used with the provided data. This makes it possible to +implement new services into the SSP-Server using the same data-types +without changing the SRAs. +

+

Communication Session +

+

A second concept that should be understood is the use of +sessions. A session between an SRA and the Server is started with the +SSP_SRASR message, and ended when the SRA receives SSP_SSA. The Server +can handle multiple sessions for one SRA and multiple SRAs at a time +(up to 32 sessions per SRA at a time, and 32 different SRAs at a time, +that's 1024 parallel SRA sessions, meaning the use of 1024 service +requests at a time, max). +

+

Every session is usually bound to a certain shared memory block that +contains the data necessary for the session. One SRA session always +refers to one service request. For this, it is necessary also that the +SRA can distinguish between different sessions. Every session has an +ID number, which also makes up the last characters of the shared +memory filename (shmID passed in SSP_SRASR). +

+

Multiple sessions from your application at a time can occur for +example like this: +

+
    +
  • AtarIRC as SRA of Status Display Service sends SSP_SRASR with +dataID SSP_STATUSICON to change the status display, due to starting a +dcc download from a user +
      +

  • +
  • Before the Server acknowledges with SSP_SSA, the user starts a +dcc send to another user; a second SSP_SRASR message is sent, opening +a second session and hence providing a second shared memory block and +the corresponding file in u:/shm/ +
      +

  • +
+ +

To implement this, a simple 32-bit bit-vector can be used to +determine if a session is active or not. Each bit represents a +possible session. Before starting a session (before sending +SSP_SRASR), check the bits from 0 to 31. If a bit is not set, another +session can be opened. Set the bit and use the index of the bit as the +session ID (shmID). This code uses the global 32-bit integer +sessionVector as the indicator for active sessions, and returns the +next inactive session number, or -1, if all possible 32 sessions are +active: +

+
long sessionVector;
+
+int determineSessionID(void){
+
+  int idCounter, noMoreSessions=1;
+
+  for(idCounter=0; idCounter
+    if( (sessionVector&(1<&ltidCounter)==0 ){
+
+      sessionVector |= (1<<idCounter);
+      noMoreSessions = 0;
+      break;
+    }
+  }
+  if(noMoreSessions) return(-1);
+  else return (idCounter);
+
+}
+
+

1. Finding the Server +

+

The SRA has to find the Server's appl_id in order to +send messages. Do this at program startup and store the application id +of the Server for later use. This is done basically the same way it is +in OLGA: +

+
    +
  • Read environment variable SSP_SERVERNAME to retrieve the Server +application name +
      +

  • +
  • Use appl_find to determine the Server's appl_id +
      +

  • +
  • If the Server can't be found: +
      +

      +
    • Read environment variable SSP_SERVERPATH to retrieve the Server +application's path and filename +
        +

    • +
    • Start Server with shel_write +
        +

    • +
    • Read environment variable SSP_SERVERNAME to retrieve the Server +application name +
        +

    • +
    • Use appl_find to determine the Server's appl_id +
        +

    • +
    • If the Server application is not in the specified path or if +starting fails: +
        +

        +
      • output an understandable error message to the user, possibly +referring to a chapter in your application's documentation +
          +

      • +
      • continue starting your application, not using SSP SSP is an +addition to the system, unavailability should not interfer with your +application's usual behaviour, except your application explicitly +requires SSP to work (complete applications of different kinds that +basically consist of an SSP SRA client are possible). +
          +

      • +
      + +

    • +
    + +

  • +
+ +

2. Using a service +

+

2.1 Determining the data-type +

+

To use a service, the SSP_SRASR AES message has to be sent to +the Server. Before sending the message, determine the data-type used. +For example, if a block has been selected in an editor and the user +wants to use SSP by right clicking and choosing System Services from +the context menu, or from the editor's menu bar, the data-type +(referred to as dataID) is SSP_TEXT. If for example an image file or +MP3 is to be handled via SSP, the data-type should be SSP_FILENAME. +

+

For the Status Display Service, the data-type has to be +SSP_STATUSICON. This service should be initialized automatically, +without user interaction, after the Server has been started, at +program startup. See also 'Data identification' for SSP_SRASR for +short explanations of the data-types and the corresponding data in the +shared memory block. +

+

2.2 Requesting a service +

+

2.2.1 Creating shared memory file +

+

Data is sent in a shared memory file. Whether one has to be +created or not depends on the dataID (thus on the service type). There +is a unique ID for every shm-file used for each service request, and +the name of the file is built by the following conventions: +u:/shm/[appl_id]_data[shmID].ssp For example if Smurf with +appl_id 25 is sending a file and chose ID 0: +u:/shm/25_data0.ssp +

+

The shared memory ID is vital to the Server, because it is used +to distinguish between different service requests and SRA +communication sessions that are 'alive' at the same time. A session is +'alive' between the sending of SSP_SRASR and receiving SSP_SSA. For +example, the user could make your application request Send File +Service, while you haven't gotten the SSP_SSA response for the +SSP_STATUSICON request. This would make you open a second session, and +a second shared memory file, while the session for the status display +is still alive. +

+

There are two different ways to handle this: 1. Wait until the +SSP_SSA response for one request has come in before sending the second +request +

+

2. Keep track of sent requests and received responses. Make an +array, the index being the number of the request sent (which can be +the shmID as well), and set the array value to 1 if a request +has been sent. If SSP_SSA comes in, set the referring array value to +0. Use only indices (shmIDs) if the array value is 0. +

+

The second way is recommended. +

+

After you have built the name for the shared memory file, use +Fcreate to create the file. Read/Write access rights have to be set +correctly, depending on the request type! +

+

Then, bind the memory block that contains the data (text, +filename, icon data, etc., depending on dataID) to the file using +Fcntl. Close the file with Fclose. The following code calls the above +routine detemineSessionID, uses the returned ID to build the filename +and creates the file. The function openSession takes two +parameters: access describes the access rights to the +memory block, and *memPtr is a pointer to the memory block to +share. buildFilename takes a determined session ID as parameter, +builds a filename from it and returns a pointer to the static string +containing the filename. buildFileName assumes appl_id being +the SRA's (your) application ID available as a global variable! +

+
int openSession(int access, void *memPtr)
+{
+  int fHandle;
+  int sessionID = determineSessionID();
+  char *filename = buildFileName(sessionID);
+
+  fHandle = Fcreate(filename, access);
+  Fcntl(fHandle, memPtr, SHMSETBLK);
+
+  return(sessionID);
+}
+
+char *buildFilename(int sessionID)
+{
+  static char filename[256] = "u:/shm/";
+  char tmpstring[4];
+
+  strcat(&filename, itoa(appl_id, tmpstring, 10));
+  strcat(&filename, "_data");
+  strcat(&filename, itoa(sessionID, tmpstring, 10));
+  strcat(&filename, ".ssp");
+
+  return(&filename);
+}
+
+

The return value of openSession is the new sessionID +which can be used to pass to the Server in the service request. The +filename could also be stored, but that's not really necessary because +the Server passes the shmID that it received from the SRA back +to it, in the SSP_SSA acknowledge message, so the filename can be +built again to delete the file. +

+

2.2.2 Sending a Service Request +

+

Send an SSP_SRASR message to the Server, filling the AES +message- buffer with the following values: +

+
    [0] = SSP_SRASR
+    [1] = appl_id
+    [2][3] = (long)dataLen
+    [4] = dataID
+    [5] = shmID
+
+

appl_id (messagebuf[1]) +
This is your appl_id. Make sure to fill this correctly, +because the Server will distinguish different SRA-communication +sessions by the application IDs of the SRAs. +

+

dataLen (messagebuf[2]/[3]) +
The length of the data to transfer (32 bit!). For example the +length of the string to send if dataID is SSP_TEXT or SSP_FILENAME, or +the length of the icon data in the SSP_STATUSICON case. +
messagebuf[2] holds the upper 16 bits, [3] the lower 16 bits: +
messagebuf[2] = (int)(dataLen>>16); +
messagebuf[3] = (int)(dataLen&0xFFFF); +

+

dataID (messagebuf[3]) +
The identification value of the data you determined, for the +Server to find out which services can be possibly used. +

+

shmID (messagebuf[4]) +
The identification number for the shared memory block (your session ID). +This is absolutely necessary for the Server to distinguish different +sessions with one SRA. +

+

If the Server is in debug mode (environment variable +SSP_SERVERDEBUG is defined), it will print out all information +received from the SRA in an understandable form into a window, and +write it to a logfile sspdebug.log in the same directory the Server +application is in. It will post error-messages and possible +suggestions on how to fix the error in both the window and the log +file. +

+

3. Closing a session on SSP_SSA +

+

When your application receives SSP_SSA, this means that a +service has been performed (DRS), or has been started to be performed +(IRS). +

+

messagebuf[1] will contain the shmID you passed to the +Server in SSP_SRASR. This makes it possible for you to find out which +session the response is for. Build a filename like in 2.2.1 (or store +the filename when sending SSP_SRASR) and delete the shared memory file, free +all temporary memory you have possibly allocated for the service +request, and you're done. The following code uses the above function +buildFilename and the sessionID from messagebuf[1] as a +parameter to build a filename, delete the shm-file, and clear the bit +of the session in the global sessionVector variable: +

+
int closeSession(int sessionID){
+
+  char *fileName = buildFilename(sessionID);
+  return Fdelete(fileName);
+  sessionVector &= ~(1-sessionID);
+
+}
+
+

Don't forget to free temporary memory that you might have +allocated to compose the data. You could also store the memory pointer +for each session in an array of pointers and implement the Mfree/free +into the closeSession function. NULL pointers in the array could +indicate that no temporary buffer was allocated (e.g. when you share +your internal buffers for filenames, text or other data, directly). +This could be done by adding a parameter tmpFlag to the +openSession function that indicates if memPtr is a temporary +buffer. openSession could then automatically insert memPtr or +NULL at the appropriate position in a global array, one entry for +every session, with sessionID as the index. closeSession could then +get the pointer from the array at the index of its parameter +sessionID and perform Mfree on the pointer, if it's not NULL. +This would automate and connect the processes of opening and closing +sessions internally, creating and deleting shared memory files, and freeing +possible temporary buffers. +

+

4. The different dataIDs and their impact on sessions +

+

4.1 SSP_STATUSICON request and the Status Display +Service +

+

The dataIDs have an influence on how a session and service is +handled internally. For SSP_TEXT and SSP_FILENAME, you don't have to +worry about it, just go by the above scheme. For SSP_STATUSICON +however, there is a twist. The status icon will be displayed by all +applications that are switched on for Status Display Service. The +service is invisible, meaning it won't be triggered by a user action +rather than automatically, on program startup and anytime the status +of your program changes. When that happens, and you want to display a +different status icon, you have to send another request with +SSP_STATUSICON as dataID. All 'on' applications for Status Display +Service will then update the icon they display for your application's +status. +

+

When you exit your application and have sent a service request +with SSP_STATUSICON, you have to inform the Server that your status +icon is to be removed from all displaying applications! Implement a +service request with the dataID SSP_ENDSDS into the exit code of your +application. The Server will then inform all applications that display +your status icon that the icon has to be removed. +

+

A nice idea would be to display the download status of internet +applications in the status icon, by making the icon a 16 pixel high or +wide progress bar. Update the status icon every time enough data has +been downloaded to fill another pixel line of the progress bar, and +there you go. Memory could be saved, if necessary, by updating the +icon data dynamically instead of including a separate icon for every +progress bar phase. +

+

4.2 Requesting SSP_STATUSICON will make your SRA an SPA +

+

Applications that provide Status Display Service will usually be +able to request the SSP_DISPLAYINFO and SSP_CONTEXTPOPUP services. +This means that if you request service with SSP_STATUSICON as dataID, +you will probably receive a request for SSP_DISPLAYINFO or +SSP_CONTEXTPOPUP at some point! Look at How to implement an SPA on how +to provide the Display Information and Context Popup services. +

+

4.3 The icon data +

+

The icon data has to be put into the shm-block as follows: +

+
  mono_icon1 monomask1
+  [16col_icon1 16colmask1]
+  [256col_icon1 256colmask1]
+  [CRLF]
+  [mono_icon2 monomask2]
+  [16col_icon2 16colmask2]
+  [256col_icon2 256colmask2]
+  NULL
+
+

Entries in [] are optional. That means the SRA has to send at +least one monochrome status icon and its mask. The application +providing the status display will pick the icon best for the current +screen colour depth. The mask data directly follows the icon data +without any separation! The spaces above are just for readability. All +mask data is 1 bit, as provided by the GEM ICNBLK and CICNBLK +structures. The xx_icon2 data blocks are optional second icons +for animation. The SPA will read, if provided, both icon data blocks +for the current screen mode and switch in 1 second intervals between +the 2 icon blocks. This is useful to make status changes noticeable. +To make the 'blinking' animation stop, send another service request +with SSP_STATUSICON and only the xx_icon1 icon data. Blinking +should be done for no longer than 8 seconds, after that the second +status display request should be performed by your application to +switch to a static icon. The data should be in the regular screen +format, meaning you should incorporate possible status icons in your +application's resource file, and copy the raw graphics data from the +icon objects into the memory block that will be shared, one after +another, and terminate with a NULL byte. The icons must have 16x16 +pixel dimensions. A good approach would be to have the status icons in +every available colour depth in the above format ready in each a +memory block, to be able to request the service without having to copy +around icon data. That makes the interactions between SRA and SPA +quicker and saves the hassle of building memory blocks before every +request. Memory saving is not really an issue here, as one icon in all +3 colour depths uses just 512 bytes, so even keeping 20 different +icons in all 3 colour depths, and their 2-phase animated pendants, in +memory, would only cost 30 kBytes. This can be reduced to 20 kBytes by +just keeping the 2-phase versions in memory and inserting NULL or CRLF +at the middle position to switch between animated and static versions. +Usually it will be less, because 256-colour icons will rarely be +needed at 16x16 pixels size. And, which application really has 20 +different statii? +

+

5. Guidelines for implementing SPAs +

+
    +
  • Make your icons for the Status Display Service distinguishable +(so people can see it is this specific application's status icon) and +recognizeable (so the user doesn't have to wonder 'what the heck is +that supposed to be?'). +
      +

  • +
  • Use status icons intelligent and carefully. There is no point +in displaying a different status for an operation that only takes 1/10 +second. +
      +

  • +
  • The SSP protocol is rather easy to implement on SRA side. Try +to make the implementation as transparent to the user as possible, +without the user noticing much of the different applications and +processes involved. +
      +

  • +
  • Request invisible services like Status Display really +invisible, without any direct output to or input from the user. +
      +

  • +
  • After implementing SSP, switch the server into debug mode and +try requesting different services with different data types. If +everything works and the server outputs no error or warning messages, +your implementation is OK. +
      +

  • +
  • Remember, the user doesn't care much about how it works, only +that it works. +
      +

  • +
+ +

15.10.11 How to implement an SPA

+

Here's a step-by-step instruction on how to implement SSP as a +Service providing application. All code provided here is also +available as sample code in the archive in the file SPAtools.c +(SPAtools.gfa for GFABasic, SPAtools.s for assembler). Use and modify +as necessary :) +

+

Communication Session +

+

Make sure you understand the concept of SSP SPA-sessions. A +session between an SPA and the Server is started with the SSP_SSIR +message, and ended when the SPA sends SSP_SPASA. For every SPA there +will only be one session at a time. Multiple service requests by SRAs +will be queued, and sent one after another. This might be changed in +future implementations because of not being able to perform another +service while a session is active, which is a drawback in case of +Delayed Response services. +

+

1. Receiving Service Initialization Request and determining +the information type +

+

The SPA (your application) will receive the SSP_SSIR message to +indicate use of a service your application provides. The Server knows +the services provided by your application from the Server +registration, so you will only receive requests for services you +actually provide. The message-buffer with SSP_SSIR: +

+
  [0] = SSP_SSIR
+  [1] = serviceID
+  [1] = requestID
+  [2] = sessionID
+
+

serviceID (messagebuf[1]) is the requested service. This +in conjunction with requestID will give your application an +idea as of which information to provide. +

+

requestID (messagebuf[2]) is an identification that +tells you which information to provide to the Server. For example, if +Send File Service has been requested by the user, you will receive +SSP_RECIPIENTS as requestID. Build a list of possible +recipients (depending on the type of your application) separated by +CRLF, terminated by NULL. If your application is an IRC Client for +example, provide a list of online users that can currently be seen in +open channels. For an email Client, provide a list of email addresses +from your favorites. Provide only users that can be actually reached +at the time; in IRC or ICQ, for example, provide only online users. +For a SSP_DISPLAYMESSAGE service as serviceID, if your +application is an IRC Client, say, provide a list of open channels and +open chats. +

+

sessionID is used to distinguish between multiple +sessions. For now, this will always be 0. +

+

2. Initializing the service and providing information +

+

2.1 Creating a shared memory file +

+

The information the Server has requested is sent by your +application in a shared memory file. Whether one has to be created or not +depends on the serviceID. There is a unique name for every +shm-file used for each service request, the name of the file is built +by the following conventions: +
u:/shm/[applID]_init[sessionID].ssp +
For example, if your application has appl_id 25 and +sessionID is 0: +
u:/shm/25_init0.ssp +

+

After you have built the name for the shared memory file, use +Fcreate to create the file. Read/Write access rights have to be set +correctly, depending on the request type! +
Then, bind the memory block that contains the requested +information (list of recipients, etc., depending on requestID +and serviceID) to the file using Fcntl. The following code +will build the filename and open an initialization data shared memory +file when calling createShmFile: +

+
    int createShmFile(int access, void *memPtr, int sessionID){
+
+      int fHandle;
+      char *filename = buildInitFilename(sessionID);
+
+      fHandle = Fcreate(filename, access);
+      Fcntl(fHandle, memPtr, SHMSETBLK);
+
+      return(fHandle);
+
+    }
+
+    char *buildInitFilename(int sessionID){
+
+      static char filename[256] = "u:/shm/";
+      char tmpstring[4];
+
+      strcat(&filename, itoa(appl_id, tmpstring, 10));
+      strcat(&filename, "_init");
+      strcat(&filename, itoa(sessionID, tmpstring, 10));
+      strcat(&filename, ".ssp");
+
+      return(&filename);
+
+    }
+
+

2.2.2 Sending Service Initialization +

+

Send an SSP_SPASI message to the Server, filling the AES +message- buffer with the following values: +

+
    [0] = SSP_SPASI
+    [1] = sessionID
+
+

sessionID(messagebuf[1]) +
The session ID sent to you with SSP_SSIR. +

+

3. Receiving Service Use Request +

+

When your application receives SSP_SSUR, this means that a +service should be performed now. +

+

messagebuf[1] will contain the serviceID also received +in SSP_SSIR. This makes it possible for you to keep initializing and +performing services separate from one another. The serviceID +will be the same throughout one session. +

+

messagebuf[2] will contain the same sessionID as in +SSP_SSIR. +

+

messagebuf[3]/[4] will build a LONG that is the number of the +information part of all the parts you provided in SSP_SPASI. For +example, if you have sent 10 recipients for a Send File Service +request, and this LONG is 0, the first recipient in the list is to +receive the file. +

+

messagebuf[5] and messagebuf[6] contain 2 different ID numbers +for a shared memory file, shmID1 and shmID2. Build a filename +like this: +
u:/shm/[shmID1]_data[shmID2].ssp For example, if shmID1 is +25 and shmID2 is 0: u:/shm/25_data0.ssp +
This is the file that contains the data necessary to perform the +service. The contents of the shared memory block depend on +serviceID: +

+

SSP_SENDFILE, SSP_UPLOADFILE, SSP_COMPRESSFILE: the shm-block +will contain a NULL-terminated file path and name. +

+

SSP_SENDMSG, SSP_DISPLAYMSG: the shm-block will contain a NULL- +terminated string to display or send. +

+

SSP_DISPLAYINFO: the shm-block will be an empty buffer with +space for information about your current status with read/write access +rights. Copy NULL-terminated text information into the shm-block. The +maximum length will be in shmPar1 (messagebuf[7])! +

+

SSP_CONTEXT: no shared memory file will exist. Don't try to open +it ;) +

+

SSP_STATUSDISPLAY: the shm-block will contain icon data. +

+

The following code will build the filename, open the data shared +memory file and return a pointer to the shm-block when calling +openDataShm. The parameter access should be either FO_READ or +FO_WRITE, depending on what the serviceID is: +

+
    void *openDataShm(int shmId1, int shmId2, int access){
+
+      int fHandle;
+      char *filename = buildDataFilename(shmId1, shmId2);
+
+      fHandle = Fopen(filename, access);
+      Fcntl(fHandle, memPtr, SHMGETBLK);
+
+      return(fHandle);
+
+    }
+
+    char *buildDataFilename(int shmId1, int shmId2){
+
+      static char filename[256] = "u:/shm/";
+      char tmpstring[4];
+
+      strcat(&filename, itoa(shmId1, tmpstring, 10));
+      strcat(&filename, "_init");
+      strcat(&filename, itoa(shmId2, tmpstring, 10));
+      strcat(&filename, ".ssp");
+
+      return(&filename);
+
+    }
+
+

Remember to close the shared memory file as soon as you don't need to +read from or write to it any more (before acknowledging the Server) +with Fclose! Delete the initialization shm-file when receiving +SSP_SSUR and free temporary memory, if any! +

+

4. Performing the Service and acknowledging +

+

4.1 Performing the Service +

+

Depending on the parameters sent in SSP_SSUR you can determine +what to do. Ultimately the way your application performs certain +services is up to you, and also depends on the type of your +application. See 'Guidelines for performing services' for a general +direction to go to. +

+

4.2 Acknowledging +

+

Acknowledging a service is done by sending SSP_SPASA to the +Server. When you do this depends on your application and on the type +of service (IRS or DRS). With Immediate Response Services, you should +start performing the service (e.g. open a connection to a user and +start sending a file) and acknowledge before the service is actually +finished. +

+

With Delayed Response Services (e.g. the Compress File Service) +acknowledging should not be done before the service is completely +performed (e.g. the files are compressed). +

+

5. Guidelines for performing services +

+

5.1 Send File Service +

+

For online Clients like IRC and ICQ: +
When receiving SSP_SSIR with SSP_RECIPIENTS, only provide online +users that a file can actually be sent to in the recipients list. +After opening a connection and starting to send the file, acknowledge +immediately. +

+

For email and news Clients: +
In the recipient information, provide recipients from your +favorites. Encode the file into an attachment, and open an email +editor window for typing in text. Make sure the received attachment +and the typed email go out together. +

+

5.2 Send Message Service +

+

For online Clients like IRC and ICQ: +
For SSP_RECIPIENTS, provide a list only of open chats or chat +channels. Receive the message and post it to the user. Acknowledge +immediately. +

+

For email and news Clients: +
Receive the message and put it into an email as text. +Configurably, post an alert box to provide the possibility to edit the +message and add attachments for the user. Only open the email editor +window if the user answers this question with 'Yes'. Acknowledge as +soon as the user has answered the question. If this security request +is turned off, send immediately. +

+

5.2 Display Message Service +

+

For online Clients like IRC and ICQ: +
You will not receive SSP_RECIPIENTS. This service can be triggered +with user interaction as well as automatically. Decide in which window +of your application to display the message. Prefer topped, +uniconified, unshaded, visible windows. Do not send the text message +over network connections. +

+

For email and news Clients, text editors and similar: +
You will not receive SSP_RECIPIENTS. Insert the text message into +the currently top open email editor window. If none is open, open one +with no recipient and insert the message there. +

+

5.3 Upload File Service +

+

For FTP Clients: +
Provide a list of recipients in shm as described here. Retrieve +the Server and directory name from the shm-block provided with +SSP_SSUR, and upload the file. Acknowledge after opening the +connection and starting to upload. +

+

5.4 Status Display Service +

+

Retrieve the icon data, copy it into your own buffers. Display +new icon. Acknowledge. +

+

5.5 Display Information Service +

+

Copy information text, NULL terminated, to the shm-block +provided. Acknowledge. +

+

5.6 Context Popup Service +

+

Retrieve coordinates for the context popup from the +message-buffer. Open context popup in context to the current status +icon from the Status Display Service. Make frequently used and status +dependend options available in the context popup. Make all information +available in the context popup also available directly by your +application! The context popup is never to supersede generally +available options! +

+

5.7 Compress File Service +

+

Provide different archive types and compression levels after +receiving SSP_FORMATS. Use the format number contained in +sspPar1 at SSP_SSUR. If sspPar1 is -1, use default +format and compression level. Retrieve file or folder names to +compress. Archive files to provided archive name and -path. +Acknowledge after compression and archiving is finished. +

+

5.8 General +

+
    +
  • Try to make performing services transparent to the user. When +started from the Server (your commandline will be 'SSP_START'), don't +open any unnecessary windows, try to restrict the screen output to +what is necessary for performing the service. If you're started with +'SSP_START' in your commandline, wait 3 seconds after performing your +service, and then exit. Chances are that queued requests will come +through in this time, and if not, chances are the user doesn't need +your application anymore for now ;) +
    Exit without any screen output and user input, unless it's +absolutely inevitable! +
      +

  • +
  • After implementing SSP, switch the Server into debug mode and +try requesting your provided services with different applications. If +everything works and the Server outputs no error or warning messages, +your implementation is OK. +
      +

  • +
  • Remember, the user doesn't care much about how it works, only +that it works. +
      +

  • +
+ +

15.10.12 List of prospective SSP-implementing software to date

+

AtarICQ +

+

SRA: Status Display, Display Message, Send Message +
SPA: Context Popup, Display Information, Send File, Display +Message, Send Message +

+

AtarIRC +

+

SRA: Status Display, Display Message, Send Message +
SPA: Context Popup, Display Information, Send File, Display +Message, Send Message +

+

EditorLib +

+

SRA: Display Message, Send Message, Send (text as) File, Upload +(text as) File, Compress File +
SPA: Display Message +

+

GuiTar +

+

SRA: Send File, Upload File +
SPA: Compress File +

+

Smurf +

+

SRA: Send File, Upload File, Compress File +

+

TaskBar +

+

SRA: Context Popup, Display Information +
SPA: Status Display +

+

TextView +

+

SRA: Display Message, Send Message, Send (text as) File, Upload +(text as) File, Compress File, Send File +
SPA: Display Message +

+

ACSPro +

+

SRA: Display Message, Send Message, Send (text as) File, Upload +(text as) File, +
SPA: Display Message +
All applications built with ACSPro could provide SSP support +generated by ACSPro. +

+

FalcAmp +

+

SRA: Display Message, Send File, Upload File, Compress File +

+

15.10.13 Glossary

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SRA Service Requesting Application. This means the application that +sends SSP_SRASR to the Server to request use of a service. +
  + +
SPA Service Providing Application. This means the application that +receives SSP_SSIR from the Server to indicate that an SRA has +requested a service. All SPAs have to register with the SSP-Server. +
  + +
Service is a certain part of an applications functionality or +capability that can be provided to, and used by, other applications +using SSP. Generalized types of services are hardwired into the +SSP-Server. See SSP services. +
  + +
IRS Immediate Response Service. This means a service that requires +virtually immediate response to SSP_SSUR from the Server, with +SSP_SPASA. +
  + +
DRS Delayed Response Service. This means a service that requires +response to SSP_SSUR from the Server with SSP_SPASA not after +performing the service has started, but after performing the service +has been completed (e.g. compressing files). +
  + +
Invisible Service This means a service that is usually triggered automatically by +the SRA without requiring user interaction. See Status Display Service. +
  + +
Interactive Service This means a service that is usually triggered by the SRA from +a user action. See Send File Service. +
  + +
Server Registration All SPAs have to register with the SSP-Server before they can +provide and perform any services. Registration should be done once on +program installation and every time the SPA starts up. See SSP Server registration. +
  + +
Server or SSP-Server Application running in the background +that receives and sends messages from and to SPAs and SRAs. All +communication between SPAs and SRAs has the SSP-Server as mediator. +
See What is the SSP-Server? +
  + +
Message in these documents refers to an AES message received by +evnt_mesag (or evnt_multi, respectively). The communication in SSP is +based on AES messages. +
See SSP messages. +
  + +
Server debug mode If the environment variable SSP_SERVERDEBUG is defined (!) the +Server will log all activity (service requests, message-buffers, +shared memory addresses and -files, etc.) to sspdebug.log in the Server +application directory, and output the same information in a window, +including suggestions on how to fix possible bugs. +
  + +
+ +
+ +Home +ProtocolsProtocols +SE protocolSE protocol +View protocolView protocol + + diff --git a/en/proto_view.html b/en/proto_view.html new file mode 100644 index 000000000..0f5bd50aa --- /dev/null +++ b/en/proto_view.html @@ -0,0 +1,594 @@ + + + + + +The documentation for TOS: View protocol + + + + + + + + + +Home +ProtocolsProtocols +System Services Protocol (SSP)System Services Protocol (SSP) +Virtual Screen protocolVirtual Screen protocol + +
+ +

15.11 View protocol

+ +

The View protocol was developed by Peter Seitz and +Dieter Fiebelkorn to make it possible for a GEM application +to display files (using an external viewer) without being forced to +implement a viewer for the various file formats itself, and to provide +a uniform method of communication between the application and the +viewer (so that the application can use any viewer, rather than just +one particular viewer). +

+

There are already several applications that can be used as +viewers. They are GEM-View(Dieter Fiebelkorn), +1st-View/1st-Guide (Guido Vollbending), and ShowImage +(Peter Seitz). When installed as desk accessories, these applications can +be instructed (by other applications) to view files. +

+

This experimental version of the View protocol is implemented in +GEM- View and ShowImage. IT IS STRONGLY RECOMMENDED +THAT ALL PROGRAMMERS USE AND EXPERIMENT WITH THIS PROTOCOL! We hope +that eventually it will become a standard. Suggestions and comments +are welcome; please send them to Peter Seitz at one of the following +addresses: +

+
  Peter Seitz, Robert-Koch-Str.6, 63225 Langen, GERMANY
+  E-Mail (Internet): seitz(at)rbg.informatik.th-darmstadt.de
+                  or seitz(at))isa.informatik.th-darmstadt.de
+
+

This protocol should be quite easy to implement for both the +writers of viewers and the writers of applications. It should provide +substantial benefits for the user as well, since he will be able to +use his favourite viewer with all applications. +

+

–Peter Seitz +

+

In the following dicussion, 'viewer' refers to the desk +accessory or application that is used to display the file(s) and +'application' always refers to the program that requests the services +of the viewer. +

+ +
+

15.11.1 The purpose(s) of the View protocol

+

The View protocol was developed to allow an application to: +

+
    +
  • Determine if a viewer is already in memory (without knowing the +name of the viewer). If no viewer is available, the application can +start the viewer itself (if the name is available). +
      +

  • +
  • Determine what type of files can be displayed by the available +viewer. +
      +

  • +
  • View files in various formats (using the viewer) and receive +feedback from the viewer (using a uniform message protocol). +
      +

  • +
+ +

15.11.2 Using the View protocol

+

It is very easy for the user to use the facilities of the View +protocol. If there is a view-accessory (GEM-View, ShowImage) +that supports the View protocol, and the application supports the View +protocol, nothing needs to be done. If there is no resident view- +accessory (or the desired viewer does not support the View protocol) +then the user should install an environmental variable called 'View' +with the full pathname of the desired viewer as its value. The way +that this can be done is described in 'Who is the viewer?'. +

+

15.11.3 Implementing the View protocol

+

The View protocol is based on parts of the XAcc protocol, so a +programmer planning to implement the View protocol should obtain a +copy of the XAcc protocol (xacc_mt.txt). +

+

15.11.3.1 Who is the viewer?

+

First, an application should determine if there is a viewer that +the user prefers. It does this by (in this order) looking for an +environmental variable called 'View', looking for a cookie in the +cookie jar called 'View', and then looking for an environmental +variable called 'SHSHOW' (which is used by the MultiTOS desktop, too). +All these names are case-sensitive. +

+

The value of each one of these variables is the full pathname of +the viewer. +

+

The programmer can determine if one of the viewers is in memory +(as a desk accessory, usually, but it is possible for the viewer to be +an application under a multitasking operating system) using the +appl_find system call. +

+

To use the appl_find system call, the path and the extension +have to be removed from the name of the viewer and must be padded with +spaces to a length of eight characters. If this is not done, the +appl_find call will fail. It should be noted that appl_find is +case-sensitive, so normally the value MUST be all upper case. It would +not be wise to convert the name to upper case, however, as +case-sensitive file systems may be used under MiNT or MagiC. +

+

If the viewer has not yet sent its XAcc-identification (the +ACC_ID message), the application does this now. This may be the case +if the main application does not support the XAcc protocol. +

+

If no viewer is found, the application should check the extended +name (introduced in version two of the XAcc protocol) of all +applications and accessories that have sent XAcc-identification +messages for the string '2View' (this is the application type +'viewer') or the string 'NView' (this is the generic type 'viewer'). +If either of these strings is found, then the application/accessory in +question supports the View protocol and may be used as a viewer. As in +the case of the environment variables, the case of '2View' and 'NView' +is significant. +

+

If there is no viewer in memory but one of these environmental +variables (or the cookie) was found, the application can try to load +the viewer itself (using the pathname given in the variable). Please +note that wildcards may be used in the extension of the viewer (a +view-accessory could be named 'XXX.ACC' or 'XXX.ACX'). If the 'View' +environmental variable was found, the viewer may be started as an +accessory as well using Chameleon or MultiTOS. As a consequence of +this, the viewer specified in the 'View' environmental variable must +be able to run as both an application or an accessory. If the viewer +cannot run as an accessory, it should be specified using the 'SHSHOW' +environmental variable. +

+

Normally the user should use one of the enironmental variables +('View' or 'SHSHOW'). These should be placed in the desktop +environment, as all applications started by the desktop will inherit +its environment. This can be done with special programs (ENVIRON.PRG, +JCNBOOT.PRG) or, if MiNT is installed, by placing the following line in +MINT.CNF: +

+

setenv View C:\GEM_VIEW\GEMVIEW.APP +

+

and/or +

+

setenv SHSHOW C:\GEM_VIEW\GEMSHOW.PRG +

+

Using MagiC the environment can be set by putting a '#_ENV' - +line in the MAGX.INF file, like the following: +

+

#_ENV View=F:\SHOW_IMG\SHOW_IMG.PRG +

+

The cookie should no longer be used. +

+

15.11.3.2 What kinds of files can be displayed?

+

The XAcc Extended name of the viewer should contain an entry of +the form 'X.ext' for every supported file format, where 'ext' +may be one of the following: +

+
  X.ART      - Art-Director
+  X.ASC      - ASCII
+    Paragraphs end with carriage return, and lines may end
+    with a linefeed.
+  X.B&W      - Imagelab image
+  X.BLK      - GFA bit-block
+    There is a three-WORD header: width minus one, height
+    minus one, planes.
+  X.BMP      - OS/2 bitmap, MS-Windows bitmap
+  X.CFN      - Calamus font
+  X.CRG      - Calamus raster
+  X.CTX      - Calamus text
+  X.CVG      - Calamus vector
+  X.DOC      - 1stWord document
+  X.DOO      - Doodle Mono
+  X.ESM      - Enhanced Simplex
+  X.FNT      - GDOS font (and nothing else!)
+  X.GEM      - GEM-metafile
+  X.GIF      - GIF image
+  X.GVW      - GEM-View internal format
+    Used by GEM-View internally and should not be in this
+    list! (Hi, Dieter!)
+  //X.HEX    - Hex-Dump
+    This is obsolete.  It is now called 'XDump'
+  X.IFF      - IFF-file
+    The .IFF format in general! This should be present if any
+    IFF-filetypes are supported.
+  X.IFF.ILBM - IFF InterLeavedBitMap
+  X.IFF.type - Other IFF-filetypes
+  X.IMC      - Signum!2 image
+  X.IMG      - GEM-image, XIMG
+  X.JPG      - JPEG image
+  X.MAC      - MacPaint image
+  X.NEO      - Neochrome image
+  X.OUT      - The GEM 'OUT' file format
+    SEE:  v_alpha_text
+  X.PAC      - STAD image
+  X.PC[123]  - Degas compressed Image
+  X.PCX      - PC Paintbrush
+  X.P[BGP]M  - Portable Bitmap
+  X.PIC      - Screen-dump (current resolution)
+  X.PI[123]  - Degas uncompressed image
+  X.RLE      - MS-Windows bitmap
+  X.RSC      - GEM Resource file
+  X.RTF      - Rich Text Format
+  X.SDO      - Signum!2 document
+  X.SDK      - Signum!3 document
+  X.SNP      - Becker Snap-shot
+    This has a three-WORD header: width, height, planes.
+  X.SP[CU]   - Spectrum 512 image
+  X.SUN      - Sun raster file
+  X.TGA      - Targa image
+  X.TIF      - TIFF image
+  X.TN[123Y] - Tiny image
+  X.TXT      - ASCII
+    Lines end with a carriage return and a linefeed.  It would
+    be nice if a single linefeed (Unix) or a single CR (Macintosh)
+    would also be accepted.
+  X.XBM      - X-Bitmap file
+
+  XDump      - Hex-dump
+    This is not an extension, but means that the viewer is
+    able to show files as hexadecimal dumps.
+
+

Note: [abc] means one of the characters 'a', 'b', or 'c' +and not the string '[abc]'. +

+

All other entries starting with 'X.' are reserved for future +versions! If you would like to add other formats, please contact Peter +Seitz. It would be wise if the entries are unique. +

+

I recommend the support of X.IMG, X.GEM and X.OUT, as these +are the standard formats for GEM data-exchanges! +

+

It should be noted that the file formats listed here that an +application supports could be a clue as to which file formats the +application will accept using the Drag&Drop protocol. +

+

15.11.3.3 How can I tell the viewer what is to be shown?

+

Because of the XAcc2 protocol, the application knows which +message- groups are supported and these messages may be used for +communication if the application has the data already in memory (and +not within a file). +

+

Use the VIEW_xxx messages (discussed below) when the data to be viewed is +contained in a file. With these messages the application has extensive +control over what is happening. These messages may be used if, and +only if, the strings '2View' or 'NView' are found in the +viewer's Extended XAcc name. This should normally be the case, though. +

+

This may be a problem if the viewer has been started by the +application. In this case I would suggest to try to send the messages +and see what happens. If the viewer does not support them, no reaction +is given (as unknown messages should be ignored!). Otherwise, the +viewer will send a response. +

+

The viewer is strongly recommended to support the +VA_START message! Of course this has to be tested in its protostatus +(if possible, see above). +

+

There is no explicit support of the Drag&Drop protocol, as +it was mainly a MiNT-specific extension (though it is included in +MultiTOS and later in MagiC), but programs running under MiNT should +understand this protocol! +

+

All other protocols, of course, may be used to communicate with +the viewer (as long as they provide some method to determine whether +or not they are supported). +

+

Please keep in mind that pointers to strings in AES +messages have to point to global-readable memory (if running in an +environment with memory protection)! +

+

15.11.3.4 What does the viewer do?

+

When the viewer is started, it should check the command line for +a list of filenames to view. To be consistent with the direction that +the Atari is moving, the viewer should support the ARGV argument- +passing scheme developed by Atari. +

+

The viewer should support the XAcc protocol, and answer XAcc +protocol messages. +

+

The viewer should use the [Alternate] + [X] key combination to +send data using the XAcc protocol messages. +

+

If the viewer receives the VA_START message, it should determine +the type of the file and whether or not the type is supported by +itself. The viewer does not have to send a reply to this message. If a +reply is needed, the application should send the message to the viewer +using the VIEW_FILE message. +

+

15.11.4 The VIEW_XXX messages

+

This is a description of the View protocol messages. In contrast +to to the VA_START and XAcc messages, these messages provide more +refined control of what happens to the viewed file. +

+

Please remember that these messages may be used if, and +only if, the strings '2View' or 'NView' are found in the +viewer's Extended XAcc name as described above. +

+

In general, there are four messages; VIEW_FILE, which may be +sent to the viewer, and VIEW_FAILED, VIEW_OPEN and VIEW_CLOSED that +are used to inform the application of what has happened to its file. +

+

The viewer is expected to answer every VIEW_FILE message it +receives. At the very least, it should send a +VIEW_FAILED(VIEWERR_ERROR) message (see below). However, if the viewer +does not send an answer and the application expects one, the +application should recover by using a timeout value (ten seconds +should be sufficient). +

+

It is possible for the viewer to send other messages (for +example AV_ACCWINDOPEN) before answering the VIEW_FILE message! +

+

Note: All strings are NULL-terminated (as in the 'C' +programming language). +

+

15.11.4.1 View a file

+

The VIEW_FILE message is used by the application to inform the +viewer that a file is to be displayed. +

+
msg[0]   = VIEW_FILE
+msg[3/4] = filename // Must be global-readable (due to MiNT's memory
+                    // protection)!
+msg[5/6] = 0        // Reserved!
+msg[7]   = 0        // Zero = new file, see below!
+
+

Notes about filename(9.10.1993):: +

+
    +
  • If filename ends with a slash/backslash, or +filename is a directory, the file-selector should be opened +with filename as the current path. +
      +

  • +
  • If the terminating byte (0) of filename is followed by +another string starting with an 'X' (0x58), this string gives the file +type that filename should be displayed as (using the strings +from 'What kinds of files can be displayed?' as a guide) if possible. +This could be used to show hex-dumps ('XDump'). +
      +

  • +
+ +

This message is always answered by the viewer: +

+

If the file could not be displayed, respond with the VIEW_FAILED +message: +

+
retmsg[0]   = VIEW_FAILED
+retmsg[3/4] = msg[3/4]  // Filename (same pointer!)
+retmsg[5]   = errcode   // See below.
+retmsg[6]   = 0         // Reserved!
+retmsg[7]   = msg[7]    // 0 or window identification.
+
+

filename should always be the pointer received +in VIEW_FILE, as only this way can the sender recognize which file was +meant in case msg[7] is zero (and - of course - no new memory has to +be allocated. +

+

The errcode variable may be a GEMDOS error-code (<0) +or one of the following: +

+
VIEWERR_ERROR   - The error is unspecified
+VIEWERR_SIZE    - The file is too large, or the wrong size
+VIEWERR_COLOR   - Unsupported resolution or color
+VIEWERR_WID     - Wrong window identification
+VIEWERR_MEM     - Not enough memory
+
+

It is expected that the viewer informs the user about the error +(by printing a message or displaying an alert box), since it will know +what the problem is much better than the application. +

+

If the file has been displayed, but no further +communication is possible, the viewer sends the VIEW_OPEN message: +

+
retmsg[0]   = VIEW_OPEN
+retmsg[3/4] = msg[3/4]          // Filename (the recieved pointer)
+retmsg[5]   = viewprot_version  // Currently 0
+retmsg[6]   = 0                 // Reserved!
+retmsg[7]   = 0                 // 0 = no further communication!
+
+

If the file has been displayed, and further communication is possible, the +viewer sends the VIEW_OPEN message: +

+
retmsg[0]   = VIEW_OPEN
+retmsg[3/4] = msg[3/4]          // Filename (the recieved pointer)
+retmsg[5]   = viewprot_version  // Currently 0
+retmsg[6]   = 0                 // Reserved!
+retmsg[7]   = wid               // Window ID (non-zero!)
+
+

The window identification wid refers to the AES +identification of the window the file is being displayed in. This +seems to be a unique number representing the file, which is used in +further communication as an identifier. +

+

The currently defined viewprot_version is 0. +

+

15.11.4.2 Further communication

+

Once a file is displayed (in a window) and the viewer has +returned a non-zero window identification in msg[7], both the +application and the viewer may send each other messages refering to +this file/window. +

+

The 'msg[7]' variable will always contain the (non-zero) +window identification as an identifier! As this is supposed to be +unique, the 'msg[3/4]' variable should not be used to identify +the file (if the 'msg[7]' variable is not zero). +

+

If the viewer receives a wrong window identification, it replies +by sending a VIEW_FAILED message: +

+
retmsg[0]   = VIEW_FAILED
+retmsg[3/4] = msg[3/4]
+retmsg[5]   = VIEWERR_WID
+retmsg[6]   = 0
+retmsg[7]   = msg[7]    // The wrong window identification.
+
+

The application receiving this message must not use this +window identification again, since the case may be that the viewer +simply did not send VIEW_CLOSED(wid). +

+

The application can perform some operations on the file being +viewed: +

+
    +
  • The window should be closed (and the memory used by the file +freed): +
      +

    msg[0]   = VIEW_FILE
    +msg[3/4] = NULL         // Remove File
    +msg[5/6] = 0
    +msg[7]   = wid          // This (obviously) cannot be 0.
    +
    +

  • +
  • If the application knows that the file has been changed, or +wants another file to be displayed in the same window, it can send the +following message: +
      +

    msg[0]   = VIEW_FILE
    +msg[3/4] = filename     // This may be different.
    +msg[5/6] = 0
    +msg[7]   = wid          // The identification of the window.
    +
    +
    On the other side, the viewer should inform the application of +what is happening to its file: +
      +

  • +
  • If the window is closed (the user closed it or the viewer +received AC_CLOSE or VIEW_FILE(NULL, wid)), then the viewer should send +the following message: +
      +

    msg[0]   = VIEW_CLOSED
    +msg[3/4] = filename     // This may be NULL and should be ignored!
    +msg[5/6] = 0
    +msg[7]   = wid
    +
    +
    The filename should be the one from the VIEW_FILE message, +otherwise it may be NULL, as no new global memory should be allocated. +
      +

  • +
  • If the window was closed due to an error, the VIEW_FAILED message +may be sent instead: +
      +

    msg[0]   = VIEW_FAILED
    +msg[3/4] = filename     // This may be NULL and should be ignored!
    +msg[5]   = errcode      // See above.
    +msg[6]   = 0
    +msg[7]   = wid
    +
    +
    If the viewer does not have the ability to store the +identification of the application, it may not inform the application +when a window was closed without a message from the application. This +is very easy to implement, but may lead to unexpected results. Please +send your experiences to Peter Seitz (the addresses he can be +contacted at are shown above). +
      +

  • +
+ +

15.11.4.3 View data from memory

+

In Version 1.04 of the View protocol a new message (VIEW_DATA) has +been added, which is used to view data that has already been read into +memory. +

+

To indicate the support of this new message, the string +'XViewData' must be within the viewer's Extended XAcc name. +

+
msg[0]   = VIEW_DATA
+msg[3/4] = data     // Pointer to data, incl. header (see below)
+msg[5/6] = length   // Total length of header + data
+msg[7]   = wid      // Same as with VIEW_FILE (see above)
+
+

where data points to: +

+
LONG  type;         // eg '.IMG'
+WORD  head_length;  // Offset to beginning of data, word alligned!
+CHAR[]  name;       // 0-terminated name of variable length
+
+

If the type is 0, the viewer should try to figure it out +itself. Other possible value for type are all file-types +listed in 'What kinds of files can be displayed?' but without the 'X' +at the beginning (e.g. 'Dump' means that starting at 'data + +head_length', 'length - head_length' bytes should be +displayed as a hex-dump). +

+

Please note that: +

+
    +
  • data has to point to an even adress, +
  • +
  • data has to point to global readable memory, +
  • +
  • head_length is even, +
  • +
  • the data of the file is found at data + +head_length and is in the same form, as it would be in a file +of type type. +
  • +
+ +

The viewer receiving VIEW_DATA answers the same way as VIEW_FILE, +but filename (= msg[3/4]) should be set to the value of +data. The application must not free the memory pointed +to by data before receiving the answer from the viewer; in +case of a timeout it should ask the user what to do. +

+

15.11.5 The View protocol messages

+ + + + + + + + + + + + + + +

At last, the definitions for the messages: +

+
+#define VIEW_FILE    0x5600
+#define VIEW_FAILED  0x5601
+#define VIEW_OPEN    0x5602
+#define VIEW_CLOSED  0x5603
+#define VIEW_DATA    0x5604
+#define VIEW_GETMFDB 0x5610
+#define VIEW_SETMFDB 0x5611
+#define VIEW_MFDB    0x5612
+
+#define VIEWERR_ERROR 0
+#define VIEWERR_SIZE  1
+#define VIEWERR_COLOR 2
+#define VIEWERR_WID   3
+#define VIEWERR_MEM   4
+
+// 0x56xx = 'V' as in 'View'!
+
+

All other message values ranging from 0x5600 to 0x56FF are +reserved for future extensions of the View protocol and should be +ignored for now. +

+
+ +Home +ProtocolsProtocols +System Services Protocol (SSP)System Services Protocol (SSP) +Virtual Screen protocolVirtual Screen protocol + + diff --git a/en/proto_vscreen.html b/en/proto_vscreen.html new file mode 100644 index 000000000..5aca19cd3 --- /dev/null +++ b/en/proto_vscreen.html @@ -0,0 +1,105 @@ + + + + + +The documentation for TOS: Virtual Screen protocol + + + + + + + + + +Home +ProtocolsProtocols +View protocolView protocol +XAccXAcc + +
+ +

15.12 Virtual Screen protocol

+ +

A real problem when using a large-screen emulation is that +dialog and alert boxes often appear outside the visible portion of the +total screen area. Programs such as BigScreen cannot alter +this. A solution to this is offered by the possibility of providing +information about which portion of the screen is visible at any given +time. +

+

The cookie jar can be used for this, which is intended for just +such purposes. In our case the cookie is called VSCR, which is short +for Virtual Screen. It points to a structure that contains information +about the displayed segment of the total screen image. Applications +can use this information to centre dialog boxes on the actually +visible part of the screen, for instance. +

+

The structure is defined as follows: +

+ +
typedef struct
+{
+  int32_t cookie;   /* Must be 'VSCR'                     */
+  int32_t product;  /* Same as XBRA ID of emulator        */
+  int16_t version;  /* Version of the VSCR protocol       */
+  int16_t x,y,w,h;  /* Visible segment of virtual screen  */
+} INFOVSCR;
+
+

A description of the individual components: +cookie must have the value 0x56534352 ('VSCR'). The point of +the whole thing is that a large-screen simulator can set the +information structure to 'invalid', without having to remove the +cookie first. BigScreen, for instance, can be active or +inactive depending on the chosen resolution, and when the screen resolution is +changed it uses this mechanism to switch the structure on or off as +redquired. +

+

A large-screen simulator can enter its own identifier in +product. The four bytes should consist of four printable +characters (ASCII-code between 32 and 126), just as with an XBRA +identifier. +

+
+ + + + + + + + + + + + + + + + + + + + +
ProgramIdentifier
BigScreenBIGS
BlowUP030BLOW
LaceScanLEmu
NOVA VDIIMNE
+
+ +

The component version identifies the version of the VSCR +protocol, and is intended to allow at some time in the future to +supplement the structure with new fields. Finally, x, y, w and +h specify the position, width and height of the visible screen +segment. +

+

The protocol is deliberately constructed in such a way that it +may be used by other simulators as well, and extended if required. +

+
+ +Home +ProtocolsProtocols +View protocolView protocol +XAccXAcc + + diff --git a/en/proto_xacc.html b/en/proto_xacc.html new file mode 100644 index 000000000..0d3d08965 --- /dev/null +++ b/en/proto_xacc.html @@ -0,0 +1,1422 @@ + + + + + +The documentation for TOS: XAcc + + + + + + + + + +Home +ProtocolsProtocols +Virtual Screen protocolVirtual Screen protocol +xFSL interfacexFSL interface + +
+ +

15.13 XAcc

+

The XAcc protocol was originally designed for non-multitasking +versions of GEM to allow data exchange between the main application +and any number of accessories. Since the AES did not provide a +function to find the application IDs (apIDs) of other applications +without knowing their names, XAcc had to rely on the undocumented +feature that the main application always has the apID 0. Therefore +XAcc in its present (1) form does not work in a multitasking +environment. However, AES 4.0 provides the new function +appl_search, which allows any application to find the apIDs of all +other applications running concurrently. This makes it possible to +design a modified XAcc that does not use any 'dirty tricks'. This +document contains a proposal for such a modified XAcc; the changes +with respect to the previous definition are small and modifying an +existing XAcc-based application should be a matter of minutes. Since +single-tasking TOS will still be with us for a while, applications +are encouraged to implement both 'traditional' and 'modern' XAcc, +depending on the version number of the AES. +

+ +
+

15.13.1 Purpose of XAcc

+

The GEM AES functions appl_write and appl_read can be used +to exchange data between GEM applications running concurrently. In +practice however, some problems need to be solved to make good use of +these two functions: +

+
    +
  • There are no standard messages for exchanging data. Their +definition is the main goal of XAcc. +
      +

  • +
  • appl_write needs the receiver's application identifier (apID). +The only way to get this (before AES 4.0) is to call appl_find, +which needs the receiver's name. Thus communication is only possible +if the sender knows the receiver's name. +
    This problem is solved in AES 4.0 by the introduction of the +function appl_search. +
      +

  • +
  • The main application does not know when an accessory is +activated or deactivated. This would often be useful, for example if +the main application changes system variables that could affect the +accessory's behaviour. If the main application were informed before +the accessory gains control, it could reset those to their old values +and change them back after the accessory is finished. +
    Another advantage would be that after an accessory has been +called, the main application could check if something has been written +to the clipboard or if other changes to the environment have been +made. +
      +
    With multitasking GEM, the situation has changed in several +important ways. The possibility of using several 'main' applications +in parallel makes it even more undesirable to let them directly +manipulate system variables and the like; nevertheless there will +probably always remain some purposes that require such methods. On the +other hand, at least for applications using windows (the preferred +method to get the most out of a multitasking system) it is now +possible to detect changes of the active application by interpreting +the new AES messages WM_ONTOP and WM_UNTOPPED. Therefore it is not +considered necessary for XAcc to provide additional means to achieve +this. +
      +

  • +
+ +

The communications protocol described in this document solves +all these problems. It was designed for two distinct purposes: +

+
    +
  • Exchanging data of standard types between programs that have no +information about each other. +
      +

  • +
  • Exchanging data between specific applications known to each +other. The standard protocol ensures that program combinations from +different vendors do not interfere with each other. +
      +

  • +
+ +

A potential problem caused by this protocol should be mentioned +at this point: for single-tasking GEM versions, it relies on the +currently undocumented fact that the main application's apID is always +zero. Without this assumption there is no way to exchange data without +using appl_find. Although this fact is not documented, it holds for +all single-tasking versions of GEM in existence until now, both for +MS-DOS and the Atari ST (this information was confirmed by Digital +Research Germany). Of course the main application's apID may be +different in future versions, although there is no reason to change +the current behaviour for single-tasking systems. For AES 4.0 (and +later) the above assumption is not needed anyway, so no compatibility +problems are to be expected in the future. +

+

A further requirement is that all programs not using this +protocol must ignore its messages. This should not be a serious +problem, as all GEM applications should ignore messages they do not +understand. At the time of writing no programs are known to violate +this rule. +

+

15.13.2 Classic XAcc

+

The 'classic' XAcc protocoll was finally defined on November 28, +1992. All known XAcc applications implement the protocol this way. +

+ +
+

15.13.2.1 XAcc message groups

+

[Note: The 'levels' used in previous XAcc versions have been +replaced by this new concept. Compatibility issues are discussed in a +special section at the end of this document.] +

+

Both main applications and accessories can have widely different +needs for communication with other programs. Therefore XAcc defines +several groups of related messages that deal with a certain range of +data types. The message groups always indicate the messages understood +by a program, not the messages it might send to other ones. If a +program supports a certain message group, it must correctly respond to +all corresponding messages, whether it can actually use the supplied +data or not. +

+

In addition to XAcc message groups, there are the so-called +'basic messages' which must be supported by any XAcc-aware program, +and program-specific so-called 'special messages'. +

+

The basic messages deal solely with identification, but no real +data exchange. They are already sufficient for programs that either do +not exchange data with others at all or use only special messages to +communicate with a number of other specific programs. +

+ + + + + + +
Message group 1 specifies the exchange of ASCII-format character data. +
  +
Message group 2 deals with the exchange of drawings and pictures using the +GEM metafile format and the GEM bit-image file format. +
  + +
+ +

Future extensions might include sound or spreadsheet data. In +addition, a message group could be defined to handle command +interchange between applications, e.g. for a 'Drag&Drop' protocol. +

+

15.13.2.2 XAcc messages

+

There are two kinds of XAcc messages: standard messages, which +must be understood by every participating program, and special +messages intended for communications between specific program +combinations. The standard messages have numbers ranging from 0x400 to +0x7ff, special messages start from 0x800. The latter ones may only be +sent after the receiver has been identified and is known to understand +them. The following description is only concerned with standard +messages. In addition to XAcc standard messages, the AES messages +normally sent by the screen manager may be used. The most useful ones are +AC_OPEN and MN_SELECTED; the latter one requires a knowledge of the +receiver and therefore belongs to the special messages. +

+ +
+
15.13.2.2.1 Basic XAcc messages
+ + + + + +
ACC_ID    = 0x400
+ACC_OPEN  = 0x401
+ACC_CLOSE = 0x402
+ACC_ACC   = 0x403
+ACC_EXIT  = 0x404
+
+

These messages provide XAcc initialization and organization. +This is the only part of XAcc which has to be implemented in a +different way for single- and multi-tasking GEM versions. Note that +the procedure described for 'multitasking' actually only depends on +the existence of appl_search and hence on an AES version number +>= 4.0. If some future single-tasking AES supports appl_search, +the 'multitasking' initialization should be used. Multitasking AES +versions with a version number < 4.0 should never exist; to be on +the safe side, applications should not attempt to use XAcc if such a +situation is detected. +

+ +
+
15.13.2.2.1.1 Single-tasking GEM versions
+

The communication between the main application and the +accessories is initiated in the following way: +

+ +
    +
  1. When a main application is started (or terminated), all desk +accessories receive an AC_CLOSE message from the AES screen manager. In +response they must send an identification to the main application +according to the following format: +
      +

         msg[0]:  ACC_ID (0x400)
    +     msg[1]:  Sender's apID
    +     msg[2]:  Length of the message - 16, giving 0
    +     msg[3]:  Program version number and message groups
    +     msg[4]  and
    +     msg[5]:  Pointer to sender's name
    +     msg[6]:  Menu number (menu_id) as returned by menu_register
    +     msg[7]:  Reserved (see ACC_ACC)
    +
    +
    The low byte of msg[3] contains a bitmap indicating which +message groups are understood by the sender. Bit zero is set for +message group 1, bit one for message group 2, and so on. This is +independent of the message types which the sender might itself send to +others. The sender of a message must ensure that it is understood by +the receiver. The high byte is used to indicate a program version +number using an arbitrary encoding scheme. +
      +
    The pointer to the sender's name is stored in a +machine-dependent format. The name itself is a character string +following C conventions, i.e. a string of characters terminated by a +zero byte. To avoid name conflicts, long names are preferred to short +abbreviations. The name must be available at the given address at any +time, it may not be removed after initialization. As the version +number is stored in msg[3], it should not occur again in the name. +(Note: See the section 'Extended names' for more details on names.) +
      +
    Accessories using more than one menu entry must issue one ACC_ID +message for each entry used. Accessories without a menu entry must use +a number of -1. +
      +
    Since msg[1] and msg[2] have the same meaning for all message +types, they are no longer mentioned from now on. +
      +

  2. +
  3. In response to an ACC_ID message the main application sends an +identification back to the accessory. The format is identical, except +that there is no menu number and thus msg[6] can be used for any other +purpose if neccessary. The same applies to msg[7]. +
      +

  4. +
  5. In addition to the ACC_ID message, the main application informs +all previously registered accessories about the new one by sending +them the message +
      +

         msg[0]:  ACC_ACC (0x403)
    +     msg[3]:  Program version number and message groups
    +     msg[4]  and
    +     msg[5]:  Pointer to accessory's name
    +     msg[6]:  Accessory's menu number (menu_id)
    +     msg[7]:  Accessory's apID
    +
    +

  6. +
  7. A desk accessory receiving the ACC_ACC message from the main +application sends an ACC_ID message to the thereby registered +accessory, identical to the one previously sent to the main +application. +
      +

  8. +
  9. When an accessory is activated by receiving an AC_OPEN message, +it sends the following message to the main application: +
    msg[0]: ACC_OPEN +
    Just before the accessory returns control to another program, it +sends the message +
    msg[0]: ACC_CLOSE +
    When receiving ACC_OPEN, the main application restores all system +variables it has changed to their original values (if possible and +neccessary). After receiving ACC_CLOSE, it may set them again to any +desired value. +
      +
    Accessories should change system variables only after sending +ACC_OPEN and restore them before ACC_CLOSE. +
      +
    There have been some problems with the implementation of +ACC_OPEN and ACC_CLOSE that should be mentioned. The system was +designed with windowless accessories in mind, i.e. accessories that +only display a dialog box. For these accessories, the above procedure +is well-defined. Accessories that use windows however have no way to +find out if they have been activated or deactivated, because they do +not receive a message to indicate this (starting from AES 4.0, this +problem is solved). Therefore such accessories must be careful with +ACC_OPEN and ACC_CLOSE. The most important thing is to guarantee that +ACC_OPEN and ACC_CLOSE always occur in pairs, and that in between no other +program gains control. How exactly this is implemented depends on the +specific application. Sometimes the best implementation is not to use +ACC_OPEN and ACC_CLOSE at all. +
      +

  10. +
+ +

After initialization is completed, all participating programs +know the identity of all other ones, either by receiving an ACC_ID +message or by receiving an ACC_ACC message. The main application is +always informed about accessory activities. If in addition it proves +neccessary to inform one accessory about the activation of another +one, this can be accomplished by sending special messages (starting +from 0x800). +

+
15.13.2.2.1.2 Multitasking GEM versions
+

The initialization procedure is much simpler in this case. Any +application, i.e. both 'standard' applications and accessories, uses +appl_search to detect all currently running AES processes when it +is started. To each application or accessory (i.e. everything but +system processes) it sends an ACC_ID message: +

+
  msg[0]:  ACC_ID (0x400)
+  msg[1]:  Sender's apID
+  msg[2]:  Length of the message - 16, giving 0
+  msg[3]:  Program version number and message groups
+  msg[4]  and
+  msg[5]:  Pointer to sender's name
+  msg[6]:  Menu number (menu_id) as returned by menu_register
+  msg[7]:  Reserved
+
+

The low byte of msg[3] contains a bitmap indicating which +message groups are understood by the sender. Bit zero is set for +message group 1, bit one for message group 2, and so on. This is +independent of the message types which the sender might itself send to +others. The sender of a message must ensure that it is understood by +the receiver. The high byte is used to indicate a program version +number using an arbitrary encoding scheme. +

+

The pointer to the sender's name is stored in a +processor-dependent format. The name itself is a string of characters +terminated by two zero bytes. To avoid name conflicts, long names are +preferred to short abbreviations. The name must be available at the +given address at any time, it may not be removed after initialization. +It must also reside in globally accessible memory. As the version +number is stored in msg[3], it should not occur again in the name. +(Note: see the section 'Extended names' for more details on names.) +

+

Applications using more than one menu entry must issue one +ACC_ID message for each entry used. Accessories without a menu entry +must use a number of -1. +

+

When receiving an ACC_ID message, an application replies by +sending a message of the same format to the original sender, the only +difference being that ACC_ACC is used instead of ACC_ID. Applications +with several menu entries must again send one message for each entry. +

+

The messages ACC_OPEN and ACC_CLOSE are not used in multitasking +systems. +

+

Note: The only difference between ACC_ID and ACC_ACC for +multitasking systems is that an application receiving ACC_ID sends +ACC_ACC as a reply, whereas no reply is sent on receiving ACC_ACC. This +prevents applications from sending ACC_ID to each other indefinitely. +Obviously the name ACC_ACC has lost its original meaning and probably +should be changed. But since the symbolic names do not influence the +actual behaviour of any program, this is not really important at all. +

+

Since in a multitasking environment every participating +application can terminate, some means must be provided to tell other +applications about this. Therefore the message ACC_EXIT has been added +to the list of level 0 messages. Before terminating, any application +sends +

+
  msg[0]:  ACC_EXIT (0x404)
+  msg[1]:  Sender's apID
+  msg[2]:  Length of the message - 16, giving 0
+
+

to all applications that have ever registered themselves by +sending ACC_ID or ACC_ACC. +

+
15.13.2.2.2 Extended names
+

Experience with XAcc has shown that it would often be useful to +have more information about an application than specified with ACC_ID +messages. For example it is sometimes useful to check for a special +feature that is not unique to a single program, but to several similar +ones. This was the motivation for the introduction of "Extended +Names". +

+

An "extended name" is a character string of the +format: +

+

'name'\0XDSC\0'string'\0'string'\0...'string'\0\0 +

+

i.e. a "standard" name followed by the string +"XDSC" (for "eXtended +DeSCription"), followed by a list of strings +containing additional information. The end of the list is marked by an +additional zero byte. +

+

Each information string indicates by its first byte what kind of +information it contains. Currently the following types are defined: +

+ + + + + + + + + + + + +
'1' - application type (human-readable) +
  +
The text following this byte (an ASCII-1, 0x31) should roughly +specify the type of application, e.g. "word processor" or +"spreadsheet". The purpose is for applications to present +this information to the user to let him/her decide where data should +go. This is not the place for advertising hype; a word processor +should call itself "word processor" and not "document +editing and design system". +
  +
It should be clear that the text should be understandable for +end users, especially it should be in the language used for the user +interface. +
  + + + + + + + + + + + + + + +
'2' - application type (machine-readable) +
  +
Currently defined are: +
"WP" - Word processor +
"DP" - DTP +
"ED" - Text editor +
"DB" - Database +
"SS" - Spreadsheet +
"RG" - Raster graphics application +
"VG" - Vector graphics application +
"GG" - General graphics application +
"MU" - Music application +
"CD" - CAD +
"DC" - Data communication +
"DT" - Desktop +
"PE" - Programming environment +
  + +
'X' - extended features This string is used to indicate special +communication capabilities of an application. It can be used to give +more specific information than just the message groups understood. +Since this information is meant to be used by other applications +rather than end users, short abbreviations are sufficient. +
  +
'N' - generic name Often several related, but not completely +identical, applications have different names. Marketing requirements +may even dictate changes of the "official" brand names, +making them unsuitable for a "technical" identification. In +such cases a "generic" name for all these programs can be +specified, which is mainly used by other programs wishing to use +special messages. +
  + +
+ +

The "normal" name should be the "official" +name of the program, just as it is used on the package, in the manual, +and in similar places. It should be presentable to the user to let +him/her decide where to send data. +

+

Example: The address database "That's Address" +identifies itself with the extended name (in C syntax) +

+

"That's Address\0XDSC\01database\02DB\0XMM\0XSU\0", +

+

indicating that it is a database with features "MM" +and "SU". The first one indicates a special mail merge mode, +the second one the possibility of retrieving data by sending the key +via ACC_TEXT. (Further information on this program can be obtained +from its manual.) +

+
15.13.2.2.3 Message group 1
+ + + +
ACC_ACK  = 0x500
+ACC_TEXT = 0x501
+ACC_KEY  = 0x502
+
+ +
    +
  1. Transmitting text data: +
      +

         msg[0]:  ACC_TEXT (0x501)
    +     msg[4]  and
    +     msg[5]:  Pointer to text
    +
    +
    The text may contain all printable ASCII characters (code >= +32) and the following control codes: +
      +
    0x09 TAB (may be interpreted as a space by the receiver) +
    0x0A LF (usually ignored by receiver) +
    0x0D CR (used to mark an end-of-line (or end-of paragraph) +
      +
    Other control codes may only be used if the receiver is known to +understand them. The text is terminated by a zero byte. After the text +has been interpreted completely, the receiver acknowledges by sending +
      +
         msg[0]:  ACC_ACK (0x500)
    +     msg[3]:  0 if the text was simply ignored
    +              1 if it was used in some sensible way
    +
    +
    The sender of a text message may not change the text nor send +any other text messages to the same receiver until is has received the +acknowledgement. +
      +
    The sender must make sure that the memory used to store the text +is globally accessible. +
      +
    The receiver should normally interpret the text as if it were +typed from the keyboard. A word processor would for example insert it +into the currently edited document (this implies using CR as an +end-of-paragraph mark), a command line interpreter would interpret the +text as a command (which implies using CR as an end-of-line mark). +
      +

  2. +
  3. Simulation of a key press: +
      +

         msg[0]:  ACC_KEY (0x502)
    +     msg[3]:  Scancode of the simulated key and corresponding
    +              ASCII-code (as returned by evnt_keybd)
    +     msg[4]:  State of the SHIFT keys (as returned by Kbshift)
    +
    +
    This message should be regarded identical to a keyboard event. +It can be used to send control commands to a receiver which might have +been issued from the keyboard. Of course this requires a knowledge of +the receiver, as no standard keyboard command sets exist. It should be +noted that the receiver is free to use only the ASCII-code or only the +scancode, or both of them. +
      +
    This message is acknowledged after its interpretation with: +
      +
         msg[0]:  ACC_ACK (0x500)
    +     msg[3]:  0 if ACC_KEY was ignored or a given command was not
    +              understood, 1 if some action was taken.
    +
    +

  4. +
+ +

To prevent a deadlock if a program does not properly acknowledge +a message, the sender should have some way to recover. An accessory +could for example stop waiting for an acknowledgement after the next +AC_OPEN, a main application might time out after a sufficiently long +period. +

+
15.13.2.2.4 Message group 2
+ + +
ACC_META = 0x503
+ACC_IMG  = 0x504
+
+

These message are used to exchange drawings and pictures. Only +the file formats defined in the GEM documentation are used; they +are sufficient to meet most requirements, and any GEM application +should be able to handle them anyway. +

+ +
    +
  1. Sending a metafile: +
      +

         msg[0]:  ACC_META (0x503)
    +     msg[3]:  1 for the final part, 0 otherwise
    +     msg[4]  and
    +     msg[5]:  Pointer to data
    +     msg[6]  and
    +     msg[7]:  Length of data (32 bit longword)
    +
    +
    The metafile data is sent in the same format as it would be +stored on disk. As metafiles can become quite large, and often +accessories in particular do not have sufficient memory free to store +them, a file can be sent in several pieces. The receiver has to take +care of assembling all parts to restore the original data, if +neccessary by writing the parts to a file. The last part of a file is +marked by msg[3]=1. The sender may send no other data between the +parts of a file. msg[6] and msg[7] contain the length of the part +being sent, not the total length. +
      +
    The receiver acknowledges each part as described for group 1. As +for text messages, the sender must make sure that the data to be +transferred is stored in globally accessible memory. +
      +

  2. +
  3. Sending a bit image file: +
      +
    msg[0]: ACC_IMG (0x504) +
      +
    otherwise identical to 1. +
      +

  4. +
+ +

15.13.2.3 Compatibility considerations

+

There are two major changes with respect to the original XAcc +definition: +

+ +
    +
  1. "Levels" have been replaced by "message +groups" +
      +
    The motivation for this change was that the classification +according to exchangeable data types was not really a hierarchical +one; there is no reason why a programm accepting graphics should also +be able to understand text. The new scheme makes no such arbitrary +assumptions. +
      +
    There is only one situation in which a possible incompatibility +could occur: an application following the "old" convention +encounters a "new" application and one of them indicates 2 +in the level/message group byte. This would be interprets as +"graphics only" by one and as "graphics and text" +by the other. Since the number of level-2 applications was always +extremely small (in fact, the author knows only of a single one), this +should be no problem in practice. +
      +

  2. +
  3. Extended names have been introduced +
      +
    This could lead to a problem in the extremely unlikely case of +an "old" application using a name string which is +accidentally followed by "XDSC". +
      +

  4. +
+ +

In any case it is expected that most applications will be +converted to the new rules soon, if only to support MultiTOS. +

+

15.13.3 Extended XAcc

+

This chapter describes developments of the XAcc protocol after +"Classic XAcc" (11/28/92). Last changes have been made on +June 15, 1995. +

+

Since the last official documentation for the XAcc protocol, +some extensions have appeared, which are now summarized here. Some of +these extensions have arisen from the special forms of data +interchange between the text processor That's Write and the +address manager That's Address or its successor +no|Address. However, these extensions are also accessible for +any other applications, and the use of these application names in the +following documentation is only for purposes of serving as examples +(That's Address = TA and That's Write= TW). The +extensions comprise: +

+ + + +
+

15.13.3.1 MailMerge protocol

+

This protocol works with ACC_TEXT messages for historical +reasons. The TW sends to TA first an ACC_TEXT message with a string that +starts with '#I' and contains after the 'I' the SDF format string +which tells the TA which parts of an address data-set are to be +transferred. +

+

Example: '#IA1,A2,A3,A4,T1' (the first 4 address fields +and the first lelephone number). +

+

After successful receipt of this message, an ACC_TEXT message with +the string '0' is returned to TW, else an empty string ''. +

+

Now TW can start to request individual address data with the +ACC_TEXT message '#N'. at the receipt of such a message, TA sends for +each address field of an address an ACC_TEXT message and at the end of +the data set an empty string ''. +

+

15.13.3.2 Remote-Mailmerge protocol

+

For this protocol there are two new XAcc message types, +namely: +

+ + +
#define ACC_FORCESDF        0x520
+#define ACC_GETSDF          0x521
+
+

TA sends to TW an ACC_FORCESDF when an address or an +address-list is to be sent to TW. If it is dealing only with an +address, msg[4]+[5] contains a pointer to the keyword of the address; +for an address-list msg[4]+[5] contains a pointer to '#L'. The +ACC_FORCESDF message must be conirmed with an ACC_ACK (msg[3]==1 -> +OK and msg[3]==0 -> ERROR). +

+

When TW receves a '#L', then TW runs a normal MailMerge +protocol. If TW receives a keyword (max. 20 characters long), then TW +requests this address from TA with ACC_GETSDF. The ACC_GETSDF message +must have a pointer in msg[4]+[5] to a buffer that first contains the +keyword with a terminating '\0' followed by the XDF format string +(e.g.: 'JÖRG\0A1,A2,A3\0'). +

+

If TA can understand the ACC_GETSDF message, then it sends an +ACC_ACK with msg[3]==1, else an ACC_ACK with msg[3]==0. Subsequently +TW will receive the data of this single address as with the normal +MailMerge protocol. +

+

TW must have in its XDSC string an 'XRM', so that TA itself will +start a Remote-Mailmerge protocol. +

+

TA now has the following XDSC features (e.g. ACC): +

+
const char ta2Ident[] = "That's Address ACC\0XDSC\0"
+                        "1Adressverwaltung\0"
+                        "2DB\0"
+                        "XMM\0XSU\0XDI\0XRM\0NnoAddress ACC\0";
+
+ + + + + + + + + + + + +
XMM MailMerge +
  +
XSU Keyword passing (optional with following '?') +
  +
XDI Inquiry protocol +
  +
XRM Remote-MailMerge +
  + +
+ +

15.13.3.3 Inquiry protocol

+ + + +

In principle the whole Inquiry protocol proceeds in 2 steps. +First the data of the available databases are obtained, and +subsequently (completely independent of each other timewise) the +individual fields of a selected database are inquired for. +

+

So part 1 (as example of TA and TW): +

+
            TA                  |                   TW
+--------------------------------+------------------------------------
+                            ACC_GETDSI
+            <----------------------------------------
+
+                            ACC_DSINFO
+            ---------------------------------------->
+
+                            ACC_ACK
+            <----------------------------------------
+
+    {
+                            ACC_FILEINFO
+            ---------------------------------------->
+
+                            ACC_ACK
+            <----------------------------------------
+
+    }   /* 'n' times, where n was passed at ACC_DSINFO */
+
+

Explanation of the individual protocol elements: +

+ + + + + + + + + +
ACC_GETDSI +
  +
This initiates the Inquiry protocol. This message contains a +pointer to a variable of the type Xacc_Dsi_Request, containing coding +of which fields of what type are desired. +
  +
        msg[0]            = ACC_GETDSI (0x510)
+        msg[1]            = Application ID
+        msg[4] and msg[5] = Pointer to the desired
+                            field types (see XACC.H)
+
+
ACC_DSINFO +
  +
The inquired application replies to an ACC_GETDSI with this +message, in which a pointer is passed to the inquiring application to +a variable of the type Xacc_Dsinfo if the inquiry could be answered, +or a NULL-pointer if the inquiry could not be answered. +
  +
        msg[0]            = ACC_DSINFO (0x511)
+        msg[4] and msg[5] = Pointer to Xacc_Dsinfo structure
+                            (see XACC.H), or NULL
+
+
The inquired application in turn answers all its replies with an +ACC_ACK message: +
  +
        msg[0]            = ACC_ACK
+        msg[3]            = 1     If all is OK
+                          = 0     If an error has arisen (this terminates
+                                  the protocol)
+
+
ACC_FILEINFO +
  +
When the ACC_DSINFO message from the inquiring application has +been confirmed, then for each available file an ACC_FILEINFO message +with a pointer to a variable of the type Xacc_File_Info, or a NULL- +pointer for an error, is sent to the inquiring application. +
  +
As mentioned above, each of these messages must be confirmed +with ACC_ACK from the inquiring application. +
  +
        msg[0]            = ACC_FILEINFO (0x512)
+        msg[4] and msg[5] = Pointer to Xacc_File_Info structure (see
+                            XACC.H), or NULL
+
+ +
+ + + +

When the first part of the Inquiry protocol has been completed +successfully, then the inquiring application can present the user with +a list of the available databases and the information they contain, +and let him make a selection. +

+

If the user does this, then the second part of the Inquiry +protocol proceeds (again an example of TA and TW): +

+
            TA                  |                   TW
+--------------------------------+------------------------------------
+                            ACC_GETFIELDS
+            <----------------------------------------
+
+    {
+                            ACC_FIELDINFO
+            ---------------------------------------->
+
+                            ACC_ACK
+            <----------------------------------------
+
+    }   /* 'n' times, wher n was passed at ACC_FILEINFO */
+
+

Explanation of the individual protocol elements: +

+ + + + + + +
ACC_GETFIELDS +
  +
With this the inquiring application selects a database (the +relevant database ID was received in the ACC_FILEINFO message in the +structure Xacc_File_Info)) and now tells the inquired application that +it should now transmit the individual field information. +
  +
        msg[0]            = ACC_GETFIELDS (0x513)
+        msg[1]            = Application ID
+        msg[3]            = ID of the desired database
+
+
ACC_FIELDINFO +
  +
When the ACC_GETFIELDS message has been confirmed by the +inquiring application, then for each field an ACC_FIELDINFO message +with a pointer to a variable of the type Xacc_Field_Info, or a NULL- +pointer at an error, is sent to the inquiring application. +
  +
As mentioned above, each of these messages must be confirmed +with ACC_ACK from the inquiring application. +
  +
        msg[0]            = ACC_FIELDINFO (0x514)
+        msg[4] and msg[5] = Pointer to Xacc_Field_Info structure (see
+                            XACC.H), or NULL
+
+ +
+ +

In That's/no|Address at present the field types +FT_CHAR, FT_DATE and FT_TIME are implemented. +

+

15.13.3.4 Request/Reply protocol

+

Two further messages were introduced to enable a general data +exchange: +

+ + +
#define ACC_REQUEST     0x480
+#define ACC_REPLY       0x481
+
+ + + + + + +
ACC_REQUEST +
  +
With this message one requests a service from another +application. The makeup of this message is as follows: +
  +
      msg[0]:     ACC_REQUEST (0x480)
+      msg[1]:     Application ID of the sender
+      msg[2]:     0
+      msg[3]:     The high-byte is free for application-specific
+                  information, and in the low-byte the type of the
+                  data is coded that are sent with this message:
+                  0x01  String, i.e. msg[4]+msg[5] is a
+                        pointer to the string
+                  0x02  EEnv-string, i.e. msg[4]+msg[5] is
+                        a pointer to the Env-string (multiple
+                        strings separated by '\0', with a
+                        terminating double '\0'-bytes)
+                  0x03  Binary data, i.e. msg[4]+msg[5] is
+                        a pointer to the binary data. In this
+                        case the receiver naturally has to be
+                        aware of the data structure! (Local
+                        type differentiation is possible by means
+                        of the high-byte, for instance)
+                  0x04  Code, i.e. msg[4] to msg[7] directly
+                        contain the data (useful for transmission
+                        of data amounts up to 8 bytes)
+      msg[4,5]:   Pointer to the data (except type 0x04)
+      msg[6,7]:   Length of data area, incl. possible '\0'-bytes
+                  (except type 0x04)
+
+
There are two different options for replying to this message: +
  +
    +
  • ACC_ACK with msg[3]=0, if the receiving application cannot +process this message +
      +

  • +
  • ACC_REPLY, if the message could be processed and a reply has +been sent back +
      +

  • +
+ +
ACC_REPLY +
  +
A successful ACC_REQUEST request is answered with this message. +The makeup of this message is as follows: +
  +
            msg[0]:     ACC_REPLY (0x481)
+            msg[1]:
+                .
+                .       see ACC_REQUEST!
+                .
+            msg[7]:
+
+ +
+ +

Applications that support the protocol elements described above +have to contain the Extended feature 'RQ' in their XDSC description. +

+

15.13.4 Example: no|Link's XAcc protocol

+

The no|Link accessory was conceived for the control of +infra-red devices and contains an XAcc communication layer for the +control by special applications. At present the Media-Link +interface of Catch Computer is supported. A further adaptation for the +no|Remote interface of no|Software is in preparation (at the +time this was written). +

+

The no|Link accessory administers all information +required for the control of the infra-red or other hardware. Each +hardware-dependent code (e.g. an infra-red signal) is assigned a +command, and for each device (e.g. a video recorder) there exists a +list of such commands. +

+

For example, if an application for the remote control of a video +recorder wants to send an infra-red signal for the 'Play' key, then it +sends no|Link an XAcc message, in which the command 'send', +the device <VIDEORECORDER> and the command <PLAY> are +coded. +

+

So that an application can communicate completely with +no|Link, it must support the Request/Reply protocol, which is +made known by an Extended feature 'RQ' in the XDSC description. Only +in this way is it possible to maintain the list of the no|Link +registered devices. +

+

If the application also wants to receive codes from the +accessory (only possible with suitable hardware), then the XDSC +description must contain additionally an Extended feature 'RR' (Remote +Receive). All applications that want to work with no|Link have +to support the XAcc Level/Message group 1. +

+

As application type the no|Link accessory receives in +XDSC '\2RC' (Remote Control). +

+

The complete XAcc identification of no|Link at present +is as follows (in C-syntax, using the original German): +

+
    char xaccNoLinkIdent[] =    "Infrarot Manager\0"
+                                "XDSC\0"
+                                "1Fernsteuerschnittstelle\0"
+                                "2RC\0"
+                                "XRQ\0"
+                                "NnoRci\0";
+
+

A possible XAcc identification for a no|Link +application could look like this: +

+
    char xaccIdentstring[] =    "VideoControl\0"
+                                "XDSC\0"
+                                "1Video Fernbedienung\0"
+                                "XRQ\0"
+                                "Nno|Video ACC\0";
+
+

The communication between the application and the +no|Link accessory is mainly via ACC_TEXT messages. +

+

The accessory at present understands the following commands, +which have to be sent as a string by means of an ACC_TEXT message +(where <X> := <device>:<command>): +

+ + + + + + + + + + + + +
"S <X>" Sending of a command, e.g: 'S VIDEO:PLAY'. +
  +
"P <X>" Preparation of a command, e.g: 'P VIDEO:PLAY'. With this the +infra red hardware is informed of the code for this command, but it is +not yet sent +
  +
"S" Sending of the last prepared command +
  +
"T <X>" Test of the existence of a command +
  +
Particularly at a new installation of a remote control +application, all devices and commands that this application uses +should be communicated to the accessory! +
  +
If no|Link does not know the supplied command, the user +is invited to activate the required 'learning procedure', or to assign +the new command to one already present. +
  +
Each remote control application should contain a function that +allows the user to 'test' all supported commands - preferably via an +'Install' button. +
  + +
+ +

The test function is the only one that may lead to interaction +with the user in some circumstances. All others issue no output. +

+

As reply the application receives an ACC_ACK message, in which +the success or otherwise of handling the command is noted in msg[3]: +

+ + + + + + +
1 Operation was successful +
  +
0 Device/command is not present, or error in the handling +
  + +
+ +

Device and command names may be up to 32 characters long and may +not contain a ':'. No regard is paid to case, i.e. capitals +and lower case characters are not differentiated. +

+

An application can request a list of registered devices from the +accessory. For this the application has to understand the new XAcc +Request/Reply protocol (see above, or XACC.H). +

+

To request the list, the application sends a ACC_REQUEST to the +accessory, where the message must be constructed as follows: +

+
    msg[0] = ACC_REQUEST (0x480)
+    msg[1] = apid
+    msg[2] = 0
+    msg[3] = 0x04       /* Data-type: Code */
+    msg[4] = 'D'        /* 'D' represents 'devices' */
+    msg[5] = 0
+    msg[6] = 0
+    msg[7] = 0
+
+

As reply the application receives an ACC_ACK message with msg[3] +== 0 if an error has occured, or on success an ACC_REPLY message: +

+
    msg[0] = ACC_REPLY (0x481)
+    msg[1] = apID of no|Link
+    msg[2] = 0
+    msg[3] = 0x02       /* Data-type: Environment string */
+    msg[4]+msg[5] = Pointer to globally accessible memory containing the
+                    list of the devices in the following format:
+                           "DEVICEINFOS:\0device1\0device2\0"
+    msg[6]+msg[7] = LONG value, specifying the size of the buffer
+                    (inclusive of the terminating two NULL-bytes)
+
+
+

The receipt of an ACC_REPLY message must be confirmed +subsequently with an ACC_ACK message, so that the no|Link +accessory can release its resources again! +

+

15.13.5 XACC.H

+ + + + +
/*==================================================================*/
+/*                                                                  */
+/*                XAcc definitions (Pure-C syntax)                  */
+/*                                                                  */
+/*==================================================================*/
+
+#ifndef __XACC__
+# define __XACC__
+
+/*--------------------------------------------------------------------
+    XAcc message types
+--------------------------------------------------------------------*/
+/* Level 0 */
+# define ACC_ID             0x400
+# define ACC_OPEN           0x401
+# define ACC_CLOSE          0x402
+# define ACC_ACC            0x403
+# define ACC_EXIT           0x404
+
+/* Level/Message group 1 */
+##6# 'Message group' eingefuegt
+# define ACC_ACK            0x500
+# define ACC_TEXT           0x501
+# define ACC_KEY            0x502
+
+/* Level/Message group 2 */
+# define ACC_META           0x503
+# define ACC_IMG            0x504
+
+/*
+ * Extended XACC message types:
+ * These messages are relatively 'independent' of the XACC-level
+ * of the applications, i.e. they should be used only if the
+ * communication partner in its XDSC description signals that it
+ * participates in the relevant Extended feature!
+ */
+
+/* Reuest/Reply protocol: (Extended feature 'RQ')      */
+/*        ACC_ACK messages are a part of the protocol  */
+/*        and therefore must be understood!            */
+# define ACC_REQUEST        0x480
+# define ACC_REPLY          0x481
+
+/* Inquiry protocol: (Extended feature 'DI')           */
+/*        ACC_ACK messages are a part of the protocol  */
+/*        and therefore must be understood!            */
+#define ACC_GETDSI          0x510
+#define ACC_DSINFO          0x511
+#define ACC_FILEINFO        0x512
+#define ACC_GETFIELDS       0x513
+#define ACC_FIELDINFO       0x514
+
+/* Remote MailMerge protocol: (Extended feature 'RM')  */
+/*        ACC_ACK messages are a part of the protocol  */
+/*        and therefore must be understood!            */
+#define ACC_FORCESDF        0x520
+#define ACC_GETSDF          0x521
+
+
+/*----------------------------------------------------------------------
+    Definitions for the Request/Reply protocol
+----------------------------------------------------------------------*/
+/* Data-types of the Request/Reply: */
+#define RQREP_TYPE_STRING   1
+#define RQREP_TYPE_ENVSTR   2
+#define RQREP_TYPE_BIN      3
+#define RQREP_TYPE_CODE     4
+
+
+/*----------------------------------------------------------------------
+    Definitions for the Inquiry protocol
+----------------------------------------------------------------------*/
+#define DSI_VERSION         0x0100
+
+
+/* Field data-types:
+ *    Values lower than 128 are 'human-readable types' and
+ *    values greater/equal 128 are 'machine-readable types'
+ */
+#define FT_CHAR        0x00  /* String                                */
+#define FT_DATE        0x02  /* String in _IDT format                 */
+                             /* Deflt: DD.MM.YY if no _IDT available; */
+                             /* for more about _IDT see MINT          */
+#define FT_TIME        0x03  /* String: HH:MM:SS                      */
+
+#define FT_BYTE        0x80  /* 2-byte HEX-string                     */
+#define FT_UBYTE       0x81  /* 2-byte HEX-string, unsigned           */
+#define FT_SHORT       0x82  /* 4-byte HEX-string                     */
+#define FT_USHORT      0x83  /* 4-byte HEX-string, unsigned           */
+#define FT_LONG        0x84  /* 8-byte HEX-string                     */
+#define FT_ULONG       0x85  /* 8-byte HEX-string, unsigned           */
+#define FT_FLOAT       0x86  /* 8-byte HEX-string                     */
+#define FT_DOUBLE      0x87  /* 20-byte HEX-string                    */
+#define FT_ENUM        0x88  /* 4-byte HEX-string                     */
+#define FT_BOOL        0x89  /* String: 'T' or 'F'                    */
+#define FT_BITFLD      0x8A  /* An 8-bit aligned HEX-string           */
+#define FT_TIME_T      0x90  /* 8-byte HEX-string (time_t, see UNIX)  */
+
+
+typedef struct {
+    int     version;
+    char    field_types[32]; /* Max. count of 256 field-types are     */
+                             /* available (see definements above);    */
+                             /* each bit in this field represents a   */
+                             /* valid field-type, where type 0 is     */
+                             /* the lowest bit of the first character */
+                             /* and type 255 the highest bit of the   */
+                             /* last character */
+} Xacc_Dsi_Request;
+
+typedef struct {
+    int     db_anz;          /* Count of available databases          */
+##6# Hier und spaeter 'data base' -> 'database'
+
+} Xacc_Dsinfo;
+
+typedef struct {
+    long    db_id;           /* ID of the database                    */
+    char    fname[32];       /* Filename of the database; if you      */
+                             /* are using a GEMDOS or DOS filesystem  */
+                             /* it must have a <8.3> format.          */
+    char    title[32];       /* A max. 32 byte long description of    */
+                             /* the database                          */
+    time_t  crea_time;       /* The creation date/time of the         */
+                             /* database file                         */
+    time_t  mod_time;        /* The last modification date/time of    */
+                             /* the database structure                */
+    int     n_fields;        /* The number of fields that are         */
+                             /* available corresponding to the        */
+                             /* requested field types given by the    */
+                             /* ACC_GETDSI message                    */
+} Xacc_File_Info;
+
+typedef struct {
+    int     fld_size;        /* The count of bits in the field        */
+    int     n_fields;        /* The count of field elements           */
+    int     elem_size;       /* The length of one field element       */
+    char    field_buff[0];   /* From here the list of the n_fields    */
+                             /* elements follows in this format:      */
+                             /* 2 byte bitno and elem_size byte-      */
+                             /* description, e.g. (elem_size=10):     */
+                             /*    "\0\1private\0\0\0"                */
+                             /*    "\0\2sex\0\0\0\0\0\0\0"            */
+                             /*    "\0\4dealer\0\0\0\0"               */
+                             /* The value '06' identifies the 2nd     */
+                             /* and the 3rd element;                  */
+                             /* NOTE that you can't use sizeof        */
+                             /* because of this declaration           */
+} Bitfld_Info;
+
+typedef struct {
+    int     n_enums;         /* The count of enum-elements            */
+    int     elem_size;       /* The length of one enum element        */
+    char    enum_buff[0];    /* From here the list of the n_enums     */
+                             /* elements follows in this format:      */
+                             /* 2 byte id and elem_size byte-         */
+                             /* description, e.g. (elem_size=10):     */
+                             /*    "\0Aprivate\0\0\0"                 */
+                             /*    "\0Bsex\0\0\0\0\0\0\0"             */
+                             /*    "\0Edealer\0\0\0\0"                */
+                             /* The value '0042' identifies the 2nd   */
+                             /* element;                              */
+                             /* NOTE that you can't use sizeof        */
+                             /* because of this declaration           */
+} Enum_Info;
+
+typedef union {
+    ulong        n_elems;      /* For types like char, uchar this is  */
+                               /* the length of the field             */
+    Enum_Info    *enum_info;   /* enum is a special type, which needs */
+                               /* more description than the length!   */
+    Bitfld_Info  *bitfld_info; /* A bitfield like used in TA2 for the */
+                               /* info-flags                          */
+} Type_Desc;
+
+typedef struct {
+    char         id[8];      /* The export-identifier of the corres-  */
+                             /* ponding field, i.e. 'A1' for the      */
+                             /* first address field of Clever or TA2  */
+    char         name[16];   /* A short description                   */
+    char         desc[32];   /* A long description                    */
+    int          type;       /* The data-type; must be one of the     */
+                             /* constants defined at the top of this  */
+                             /* file                                  */
+    Type_Desc    t_desc;     /* This union contains either the length */
+                             /* of the field or a pointer to an info- */
+                             /* struct if the type is a special one   */
+                             /* like enum or other user-defined types */
+} Xacc_Field_Info;
+
+
+#endif    /* #ifndef __XACC__ */
+
+
+ +Home +ProtocolsProtocols +Virtual Screen protocolVirtual Screen protocol +xFSL interfacexFSL interface + + diff --git a/en/proto_xfsl.html b/en/proto_xfsl.html new file mode 100644 index 000000000..b676dc3fc --- /dev/null +++ b/en/proto_xfsl.html @@ -0,0 +1,2647 @@ + + + + + +The documentation for TOS: xFSL interface + + + + + + + + + +Home +ProtocolsProtocols +XAccXAcc +XSSI protocolXSSI protocol + +
+ +

15.14 xFSL interface

+

GDOS, which for years suffered a shadowy existence on the Atari +platform, has enjoyed rising popularity since the introduction of +vector fonts at the latest. Ever more programs offer the possibility +to use a font different from the system font for output (and partly +also for input). +

+

Now to be able to select a font, one needs a font-selector. And +so that not every programmer had to concoct his own brew, and to +obtain consistent operation, there grew a desire for a system +extension that made a font-selector available to all programs - just +like a file- selector. +

+

The first program of this type was the 'UFSL' by Michael +Thänitz. Via a cookie it makes available routines for calling a +font-selector. This interface is already being used by a number of +programs, and there are also further font-selectors that can be called +via this interface. +

+

Although one can now call a font-selector via the UFSL +interface, it has already been subject to a number of - partly +incompatible - alterations and extensions. That is why most programs +today assume that they have only the original, simple UFSL interface available +to them. The result is therefore that the extensions remain unused, +and when a somewhat more powerful font-selector is required in a +program, one is thrown back to having to write a new one specially for +that program. In a somewhat exaggerated form there is presented here +the idea of an external font-selector ad absurdum ... +

+

Due to the 'wild growth' of the UFSL interface it seemed more sensible +to draw a clear line under this and develop a completely new interface +that is then also offered via a new cookie. +

+

This text describes this new interface, which can not simply +call a font-selector, but can also exert an influence on it in many +ways. +

+ +
+

15.14.1 About the xFSL interface

+

With the xFSL interface, the caller (i.e. the program that calls +the font-selector) has appreciably more influence on the +font-selector, its behaviour, and on the fonts offered for selection. +

+

During the conception of the new interface, the attempt was made +to pay regard to the capabilities of various programming languages +(e.g. the avoidance of pointers to functions), and at the same time to +be prepared for possible extensions of the interface. +

+

The adaptation of a program to the xFSL interface should be a matter of +a few minutes, specially as sample calls in various programming +languages are provided. The conversion of special requests may require +somewhat more effort, of course, but should not present an insoluble +problem. +

+

There follows a description of the xFSL cookie as well as the +various xFSL calls and parameters ... +

+ +
+

15.14.1.1 The xFSL cookie

+ +

If a font-selector is installed that supports the xFSL +interface, then a cookie 'xFSL' exists whose value is a pointer to the +following structure: +

+
+
typedef struct
+{
+  unsigned long xfsl;       /* Magic 'xFSL'              */
+  unsigned int  revision;   /* Interface revision        */
+  unsigned long product;    /* Font-selector identifier  */
+  unsigned int  version;    /* Font-selector version     */
+  xFSL_INPUT    xfsl_input; /* Simplified call           */
+  xFSL_INIT     xfsl_init;  /* Init call                 */
+  xFSL_EVENT    xfsl_event; /* Event call                */
+  xFSL_EXIT     xfsl_exit;  /* Exit call                 */
+  xFSL_INFO     xfsl_info;  /* Info call                 */
+} xFSL;
+
+
+

Die Komponenten der Struktur im einzelnen: +

+ + + + + + + + + + + + + + + + + + + + + +
xfsl Here we have for safety's sake once more the ASCII character +string 'xFSL' (= 0x7846534C in hexadecimal). +
  +
revision This is the revision number of the xFSL interface; at present it +contains the value 4. If the interface should be extended in the +future, one will find correspondingly higher values there. +
  +
product Here one finds the identifier for the actually installed +font-selector. This entry is intended, however, only as additional +information, and should not be evaluated by application +programs that want to call the font-selector! +
  +
Identifiers used to date: +
  +

+
+ + + + + + + + + + + + + + + + +
IdentifierFont-selector
CLVNCalvino
FSELFontSel
HUGOHuGo!
+
+ +
The identifier (like the following version number too) was only +introduced for programs that want to output information about the +installed font-selector (e.g. the program 'SysInfo'). +
  +
version The version number of the installed font-selector as BCD number +(e.g. hexadecimal 0x100 for Version 1.00). The same notes apply here +as for the product field above. +
  +
xfsl_input This is the entry point for a simplified call of the +font-selector. The font-selector then appears always as a modal dialog +and most of the additional features of the xFSL interface can not be accessed. +
  +
xfsl_init, xfsl_event, xfsl_exit  These three functions together form the extended font-selector +call. All of the new features can be accessed via them. The procedure +corresponds to the display of a GEM dialog: +
  + +
    +
  1. Display font-selector (xfsl_init) +
      +

  2. +
  3. Event handling in a loop until 'OK' or 'Cancel' has been +selected (xfsl_event) +
      +

  4. +
  5. Remove font-selector from the screen (xfsl_exit) +
      +

  6. +
+ +
xfsl_info With this call one can inquire about some of the features of +the installed font-selector, e.g. Drag&Drop support. +
  + +
+ +

15.14.1.2 The simplified call (xfsl_input)

+ +

xfsl_input is the entry point for a simplified call. With it one +can only call the font-selector as a modal dialog. In addition one can +specify a heading, and restrict the type of fonts that the selector is +to present for selection. +

+
+
int xfsl_input (int           vdihandle,
+                unsigned int  fontflags,
+                const char   *headline,
+                int          *id,
+                int          *size
+               );
+
+
+

The parameters in detail: +

+ + + + + + + + + + + + + + + +
vdihandle Here you pass the handle of a virtual VDI workstation +already opened by your program (if you want to set a font in your +program, you have to open such a VDI workstation anyway). The +font-selector then adopts the font just set on this workstation as the +current font (provided it is actually offered for selection by +fontflags). +
  +
Instead of a valid handle you can however just pass a NULL, in +which case the font-selector will display the font that you pass in +the parameters id and size. +
  +
If you pass a VDI workstation handle, then the selected font +will also be simultaneously set on this workstation. +
  +
fontflags With the font-flags you can determine which fonts will actually be +offered for selection. +
  +
headline Here you can specify a header that will then appear in the +font-selector. If the header is missing (pass 0L), then a default text +('Font-selector', 'Fontauswahl' or similar) will be shown. +
  +
id In this variable the ID of the selected font will be returned +(naturally only if a font was really selected). This font can now be +set directly with the VDI function vst_font. +
  +
If you pass a NULL in vdihandle, then the font-selector +will display the font specified in id. +
  +
size In this variable the size of the selected font in points will +be returned (also only if a new font was really selected). If this is +a bitmap font, then its size may be set with the VDI function +vst_point. For vector fonts one should call the function vst_arbpt. +
  +
If you pass a NULL in vdihandle, then the font-selector +will display the font specified in id in the size given in +size. +
  + +
+ +
+

Return values +

+

xfsl_input returns a negative number if an error has arisen. A 0 +is returned if 'Cancel' was selected. If a 1 is returned, then a new +font was selected. +

+

The return values are the same for all xFSL functions, and +upwardly compatible to the return values of the UFSL. +

+

15.14.1.3 The extended xFSL call

+

The extended xFSL call consists of three individual function +calls: +

+ + + + + + + + + +
xfsl_init Displays the font-selector on the screen. In addition the +parameters are passed here. +
  +
xfsl_event This function is called repeatedly until a font has been +selected in the font-selector, or 'Cancel' selected. +
  +
xfsl_exit Removes the font-selector from the screen again. +
  + +
+ +
+

In C it can look like this, for instance: +

+
+
xhandle = xfsl->xfsl_init (vdihandle, &xpar);
+if (xhandle >= 0)
+{
+  do
+  {
+    ret = xfsl->xfsl_event (xhandle, 0L);
+    if (ret == xFS_HELP)
+      ...;  /* Call Help function  */
+    else if (ret == xFS_POPUP)
+      ...;  /* Handle popup       */
+    else if (ret == xFS_EVENT)
+      ...;  /* Handle AES event   */
+  } while ((ret != xFS_OK) && (ret != xFS_STOP));
+  xfsl->xfsl_exit (xhandle);
+}
+
+
+

This splitting up into three has the advantage, amongst others, +that the handling of the events (HELP button, popup, AES events) +does not have to pass pointers to functions (which presents +difficulties in some programming languages). Also the interface can be +extended easily by furher events if these should ever become +necessary. +

+
15.14.1.3.1 xfsl_init
+

This call not only brings up the font-selector on the screen, it +also determines which fonts are to be displayed, whether a user-popup +is being used and several other things. +

+
+
int xsfl_init (int       vdihandle,
+               xFSL_PAR *xpar
+              );
+
+
+

The two parameters mean: +

+ + + + + + +
vdihandle As for the simplified call, here you pass the handle of a +virtual VDI workstation already opened by your program, or simply a +NULL. +
  +
If you pass a valid workstation handle, then the font- selector +will adopt the font current on this workstation and display it - +provided fontflags (in the xFSL_PAR structure) actually makes +it available for selection. If this is not the case, then the +font-selector will choose a font from those available and display it. +
  +
If you pass a NULL as workstation handle, then the font from the +PFONTINFO structure (to which a pointer in the xFSL_PAR structure +points) will be adopted and displayed. +
  +
If you pass a VDI workstation handle, then the font selected +on this workstation will also be set. +
  +
xpar This is a pointer (i.e. the address) of an xFSL_PAR structure +that contains all further specifications for the font-selector. +
  +
Due to the large number of options, this structure has been +given its own page. +
  + +
+ +

The following applies again for the return codes of the +function: A negative return value indicates an error. Positive values +here have a slightly different meaning: A 0 means that the +font-selector was opened (successfully) as a modal dialog. Any other +positive values correspond to the window handle of the opened +font-selector. This way you can register the font-selector window with +an AV-server, for instance. +

+

On success (return value larger or equal to 0) you should store +the handle in a variable, as it will still be needed for the following +calls (xfsl_event and xfsl_exit). +

+

Note: If the font-selector is to be displayed as a +window, but xfsl_init returns the error xFS_NO_WINDOW (no more windows +available), then one should attempt to display the font-selector at +least as a dialog (clear control-flag CC_WINDOW and call xfsl_init +again). +

+

Remember: The user wants a font-selector, not an +error-message! +

+
15.14.1.3.2 xfsl_event
+

When the font-selector has been initialized and brought to the +screen, xfsl_event takes over the main work. +

+
+
int xfsl_event (int    xhandle,
+                EVENT *event
+               );
+
+
+

The two parameters mean: +

+ + + + + + +
xhandle The handle of the font-selector, as returned by xfsl_init. +
  +
event Pointer to an EVENT structure, as used by Pure-C. In this +structure the font-selector returns AES events that it could not +process itself. In addition, you can also use the input parameters to +tell the font-selector about which events are to be reported. +
  +
However, the pointer can also just be a NULL if you do not want +to evaluate any (further) events. If the font-selector is to be +operated as a window-dialog and the caller (i.e. your program) has +some other windows open, then you have to evaluate the redraw messages +at least! +
  +
Example: If you set the MU_MESAG flag in +ev_mflags of evnt_multi, then the font-selector will return +all the arriving AES messages that it cannot handle itself to the +caller. +
  +
Note: It is also possible, or course, to receive timer +events; but these should only be used sparingly and not be too short, +as in that case the font-selector has to leave its own event loop each +time. 250 ms might serve as the - non-binding - lower limit. +
  + +
+ +

The possible return values of xfsl_event: +

+ + + + + + + + + + + + + + + + + + +
xFS_STOP The 'Cancel' button or (if present) the Closer of the +window-dialog was selected in the font-selector. +
  +
If the CC_CLOSER control-flag is set and the Closer is clicked +on, the PFONTINFO structure to which the pointer in the xFSL_PAR +structure points nevertheless contains data about which font was last +selected in the font- selector. Otherwise this information would not +be preserved. +
  +
xFS_OK A font was chosen and 'OK' selected. The font that was selected +is described in the PFONTINFO structure to which the pointer in the +xFSL_PAR structure points. If a valid VDI handle was passed at +xfsl_init, then this font will also be set immediately on this VDI +workstation. +
  +
xFS_HELP The HELP button was selected (this can only occur if one has +been provided, of course). It is up to the caller how it reacts to +this. Normally help will be provided by the display of a Help page (or +triggering such a display). +
  +
xFS_EVENT An AES event has occurred that the font-selector could not +process (e.g. a Redraw message for another window). Exactly what this +event was can be gathered from the ev_mwich field of the EVENT +structure. +
  +
Desk accessories should not forget calling xfsl_exit on receipt +of an AC_CLOSE message! The same applies for the AP_TERM message. +
  +
xFS_POPUP A change was made in the user-popup (if present). For the +changed popup entry the FF_CHANGED bit is set in the fontflags +element. The popup entry which was then selected, and on return to the +font-selector will be the current one in the popup (at the next +xfsl_event call), will lie in the sel_entry element of +xFSL_PAR. +
  +
You now still have the option of making changes to the popup +entries, for instance to alter the font-flags, or adopt the changed font +in all other popup entries (in this way it is possible to use the +popup for some other kind of information which may have nothing to do +with the selected font). But the texts and the number of popup entries +may not be changed! +
  +
other values: Other positive values should be ignored. It is possible that +the interface will be extended by further return values (events). +
  +
Negative values indicate an error, the font-selector should then +be aborted. But it is imperative that one still calls xfsl_exit +beforehand! +
  + +
+ +
15.14.1.3.3 xfsl_exit
+

With the xfsl_exit call the font-selector is removed from the +screen again: +

+
+
void xfsl_exit (int xhandle);
+
+
+

Here xhandle is again the handle of the font-selector, +as returned by xfsl_init. +

+

xfsl_exit must be called always when the use of the +font-selector is to be ended, be it that a font was chosen or 'Cancel' +was selected, or that xfsl_event reported an error. If already the +xfsl_init call failed, then xfsl_exit may not be called +(logical, since one has no valid handle). +

+

The call of xfsl_exit should also not be forgotten on arrival of +the AC_CLOSE and AP_TERM messages! +

+
15.14.1.3.4 The info call (xfsl_info)
+ +

With this call one can inquire about some of the features of the +installed font-selector: +

+
+
long xfsl_info (void);
+
+
+

If the return value is positive, then the following flags +represent the features that are present (negative return values are, +as usual, error-messages): +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameValueMeaning
XF_SIZE0x0001Size changes possible
XF_COLOR0x0002Colour changes possible
XF_ATTR0x0004Attribute changes possible
XF_WIDTH0x0008Width changes possible
XF_KERN0x0010Kerning changes possible
XF_SKEW0x0020Slope/skew changes possible
XF_ALIGN0x0040Alignment changes possible
XF_ROTATION0x0080Text rotation possible
XF_FIX310x0100fix31 support
XF_POPUP0x0200Popup support
XF_DRAGDROP0x0400Drag&Drop support
XF_MAPPING0x0800Understands mapping
+
+ +
+

Further features of the font-selector can be inquired indirectly +via the control element of the xFSL_PAR structure: On a +successful xfsl_init call, those control-flags that the font-selector +does not know are cleared. +

+
15.14.1.3.5 The VDI workstation in the xFSL interface
+

With the xfsl_input and xfsl_init calls one can pass the handle +of a virtual VDI workstation already opened by the user in each +case. +

+

The further behaviour of the font-selector depends on whether +one actually passes a workstation handle or just a NULL: +

+

If one passes a valid handle, then the font-selector will try to +ascertain the current font on the corresponding workstation and then - +provided it matches the passed font-flags - to also set it and offer it +for selection. If the current font does not match the +fontflags setting (say if only vector fonts are to be offered +but the current font is a bitmap font), then the font-selector will +select a font from those on offer and present it as the current font. +

+

If the user now selects a font and closes the font-selector with +'OK' then this font will also be set immediately on the passed +workstation, so that the calling program no longer has to do this. +

+

For this one should note that the font-selector also opens its +own VDI workstation and uses this internally and for the selection +of the fonts. Amongst other things it will also call vst_load_fonts +for this workstation (provided a GDOS is installed). This can lead to +some unexpected results if no vst_load_fonts has been called yet on +the passed workstation and the user selects a font in the +font-selector that only becomes available after a vst_load_fonts call! +

+
+

Instead of a workstation handle however one can also simply pass +a NULL. The font-selector will then ascertain the current font from +the passed parameters (for a xfsl_input call) or from the xFSL_PAR +structure (for a xfsl_init call). +

+

The selected font will then (logically) only be returned in the +parameters or the xFSL_PAR structure and the caller then has to set it +him/herself. +

+
15.14.1.3.6 The xFSL_PAR structure
+ +

With this structure you have extensive influence on the +behaviour of the font-selector and the type of fonts displayed. +Therefore the description of the options is somewhat on the long side +... +

+
+
typedef struct
+{
+ int            par_size;    /* Size of xFSL_PAR structure     */
+ int            pfi_size;    /* Size of PFONTINFO structure    */
+ unsigned long  control;     /* Control-flags                  */
+ const char    *headline;    /* Header, or 0L                  */
+ const char    *example;     /* Sample text, or 0L             */
+ const char    *helptext;    /* Text of the HELP button, or 0L */
+ PFONTINFO     *font;        /* Pointer to Fontinfo structure  */
+ unsigned int   fontflags;   /* Permitted font types           */
+ const char    *poptext;     /* Text before the popup, or 0L   */
+ int            num_entries; /* Number of entries (0..n)       */
+ int            sel_entry;   /* Selected entry (0..n-1)        */
+ xFSL_PENTRY   *popup;       /* Pointer to a popup, or 0L      */
+ char          *helpinfo;    /* Pointer to Help-file/-page     */
+} xFSL_PAR;
+
+
+

Despite the multitude of entries everything is really quite +simple, the more so that the fields that you do not need, or whose +meaning is not yet clear to you, can simply be filled with zeros, +whereupon the font-selector will then assume sensible default values. +

+

The fields in detail: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
par_size This field may not be set to zero; here the size of the +xFSL_PAR structure in bytes is entered, so that in C one can simply +write: +
  +
+
xpar.par_size=sizeof(xFSL_PAR);
+
+
+
The size of the structure currently comprises 42 bytes. Should +the structure be extended at some time, then the font-selector can +recognize from the size specification whether it is dealing with the +old or the new structure. +
  +
pfi_size This field too may not be zero; here one has to enter the size +of the PFONTINFO structure, so in C: +
  +
+
xpar.pfi_size=sizeof(PFONTINFO);
+
+
+
The current size of the PFONTINFO structure comprises 38 bytes +and might also be extended in the future. +
  +
control These are the so-called control-flags, with which the behaviour +of the font-selector can be influenced (e.g. whether it is to appear +as a window or a dialog). +
  +
These flags are described in greater detail in their dedicated section +below. +
  +
headline This, as already familiar from the simplified call, is a +pointer to a header line for the font-selector. If this is missing +(headline contains 0L), then a default text header will +inserted. +
  +
The length of the header should be within the limit set by UFSL +(34 characters), though the font-selector will truncate longer headers +if necessary. +
  +
example A pointer to a sample text. The font-selector displays an +example of glyphs in the currently selected font making up a text that +may be specified here. If this text is missing (i.e. example +contains zero) then the font- selector will display a default text +(e.g. the name of the current font in each case). +
  +
helptext This is the text for a button that can be displayed at bottom +left of the font-selector. Normally one will want to display a button +labelled 'HELP' (or 'HILFE'), which explains to the user the function +of the font-selector, and what the selected font is to be used for. +
  +
If this text is missing (i.e. helptext contains zero), +then no HELP button will be displayed and also xfsl_event will not +return a value for xFS_HELP. +
  +
One should choose a short text (around 8 characters), though the +font-selector will truncate longer texts if necessary. +
  +
font This is a pointer to a structure (PFONTINFO) which describes a +font. The structure is used both for passing values to the +font-selector as well as returning the selected font. +
  +
This structure too is described in greater detail in its dedicated section +below. +
  +
fontflags These are once more the font-flags, familiar from the simplified +call, with which you can influence the fonts available for selection. +
  +
poptext, num_entries, sel_entry, popup: With these four parameters an additional popup can be made to +appear in the font- selector. Due to the manifold options there is +again a dedicated section below for this. +
  +
If you do not want a popup, then simply set these four values to +zero. +
  +
helpinfo This is a pure output parameter: If the HELP button was +selected (provided it is present, see `helptext'), then one +will find here a pointer to a filename of a Help-file and the name of +a page to be displayed. The filename is specified without a path or +extension, with the page name following directly after it, separated +by a comma. +
  +
+The string may only be read, but not altered! +
  +
+
If you do not want to display Help yourself with xFS_HELP then +you can use the information to call up a help-system (e.g. ST-Guide). +
  +
Example: xfsl_event returns xFS_HELP, in +helpinfo there is a pointer to the string: +
  +
+
fine,The finest font-selector of all time
+
+
+
From this one can create the following call for ST-Guide: +
  +
+
*:\fine.hyp The finest font-selector of all time
+
+
+
So one appends the extension for the relevant help-system to the +filename and passes the post-comma portion as a page-name. +
  + +
+ +
+

To stress once more: Fields that you do not require or do not +yet understand can simply be set to zero at first. Exceptions are +only: +

+
    +
  • par_size, the size of the xFSL_PAR structure itself +
      +

  • +
  • pfi_size, the size of the PFONTINFO structure +
      +

  • +
  • font, the pointer to the PFONTINFO structure +
      +

  • +
+ +
15.14.1.3.7 The control-flags
+

With the control-flags one can influence the benaviour of the +font- selector. +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameValueMeaning
CC_WINDOW0x0001Font-selector as a window
CC_APPMODAL0x0002Font-selector is application-modal
CC_FIX310x0004All size specifications in 1/65536 point
CC_FAKESTYLE0x0008Simulate styles (only bitmap fonts)
CC_CLOSER0x0010Window with Closer, no OK button
CC_NOSIZE0x0100Do not alter size
CC_NOCOLOR0x0200Do not alter colour
CC_NOATTR0x0400Do not alter attributes
CC_NOWIDTH0x0800Do not alter width
CC_NOKERN0x1000Do not alter kerning
CC_NOSKEW0x2000Do not alter skewing
CC_NOALIGN0x4000Do not alter alignment
CC_NOROTATION0x8000Do not alter text rotation
CC_DFLTSIZE0x10000'Default' font size
CC_INVSTYLE0x20000'Inverse' attribute
+
+ +
+

The function of the individual flags should be clear already +from the names and short descriptions. Here still a few notes: +

+
    +
  • CC_APPMODAL +
    'application-modal' means that the program is put in a mode in +which only the font-selector can be processed. Essentially this means +that the font-selector intercepts all WM_TOPPED messages for other +windows of the calling program and does not pass them on, but +makes itself the topped window instead. This is meant to tell the user +that he should first deal with the font-selector before he can +initiate another action in the program. +
      +
    The caller in this mode should of course forego topping its own +windows with wind_set(WF_TOP). +
      +

  • +
  • CC_FAKESTYLE +
    This is a specialty that only Calvino offers at present: For those +bitmap fonts for which no light, italic or bold variants are present, +the missing cuts are each simulated with the VDI function +vst_effects. +
      +

  • +
  • CC_CLOSER +
    If this flag and CC_WINDOW are set, then the font-selector is +provided with a Closer, while the 'OK' and the 'Cancel' buttons are +hidden. This is intenderd for cases where the font-selector is to be +used as a pure Drag&Drop selector. +
      +

  • +
  • CC_NO... +
    With these flags one can determine which settings are not to be +altered. For instance, a program may want to prevent the size of a +font being changed, while a change of the font itself is to be +allowed. In that case the caller only has to set the CC_NOSIZE flag. +
      +
    But please note that despite a set CC_NO... flag you always have +to pass a valid value. The meaning of these flags therefore is that +the preset values may not be changed, and not that these values are +not of interest. +
      +

  • +
+ +

Please note: Not all font-selectors support all of the +control-flags! If a font-selector does not support a flag, then it will +simply ignore it. On a successful(!) xfsl_init call, the font-selector +will clear those flags in the control element of the xFSL_PAR +structure that it does not understand. +

+
15.14.1.3.8 The PFONTINFO structure
+ +

This structure describes a font. After calling the font-selector +it contains the selected font. In addition these specifications are +evaluated by the font-selector already at the call (and the described +font displayed), if a zero is passed as the VDI handle. +

+
+
typedef struct
+{
+ int          fontid;     /* ID of the font               */
+ int          fonttype;   /* Type of font                 */
+ char        *fontname;   /* Name of the font             */
+ union fsize  fontsize;   /* Font size in pt or fix31     */
+ union fsize  fontwidth;  /* Width in pt or fix31         */
+ char         trackkern;  /* Track kerning                */
+ char         pairkern;   /* Pair kerning                 */
+ int          fontattr;   /* Attributes                   */
+ int          fontskew;   /* Skew                         */
+ int          fontcol;    /* Colour                       */
+ int          backcol;    /* Text background colour       */
+ int          halign;     /* Horizontal text alignment    */
+ int          valign;     /* Vertical text alignment      */
+ int          rotation;   /* Text rotation in 1/10 degree */
+ int          validtype;  /* Type (V_CHAR_...) or mapping */
+ int         *validchars; /* Valid characters, or  0L     */
+} PFONTINFO;
+
+
+

The elements in detail: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
fontid The ID of the font, as also returned by the VDI function +vqt_name. The font ID is a non-zero number (so can also be negative). +
  + + + + +
fonttype The type of font, as used as of Speedo 5 or NVDI 3: +
  + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameValueFont type
BITMAP_FONT0x0001Pixel
SPEEDO_FONT0x0002Speedo
TT_FONT0x0004TrueType
PFB_FONT0x0008Type-1 (Postscript)
+
+ +
+
These specification are currenly for information only, having no +meaning for the font-selector. However, in the future it will be +possible to set a font not just by its ID but also by its name, in +which case the font type will be required as well. +
  +
The font type is also of interest when one wants to alter the +size of the font: With bitmap fonts this is done with the VDI +function vst_point, for all other types (vector fonts) with the +function vst_arbpt. +
  +
fontname The name of the font, as returned by vqt_name (possibly one or +more space characters were removed). +
  +
The caller itself must make enough space available for the font +name, thus for 32 characters and a NULL-byte! If you do not require +the font name, then you can also simply set the pointer to zero. +
  +
fontsize The size of the font in points (pt) or 1/65536 point (type +'fix31'): +
  +
+
union fsize
+{
+ int   size;    /* Font size in points        */
+ fix31 size31;  /* Font size in 1/65536 point */
+};
+
+
+
Which of these two statements is valid is controlled globally +with the control-flag CC_FIX31. +
  +
fontwidth Width of the font in points (pt) or 1/65536 point (type (type +'fix31'): +
  +
+
union fsize
+{
+ int   size;    /* Font size in points        */
+ fix31 size31;  /* Font size in 1/65536 point */
+};
+
+
+
Which of these two statements is valid is controlled globally +with the control-flag CC_FIX31. +
  +
The width can be set with the VDI functions vst_width in +points and with vst_setsize in fix31. +
  + +
trackkern This parameter specifies the type of track kerning for vst_kern. Valid +values are: +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
ValueKerning
0No kerning
1Normal kerning
2Tight kerning
3Very tight kerning
+
+ +
pairkern With this parameter pair kerning can be switched on (0) or off (1), +see vst_kern. +
  +
fontattr These are the font attributes (text effects), as also used by +the VDI function vst_effects. +
  +
Calvino only uses this field if the CC_FAKESTYLE control-flag is +set. +
  +
fontskew The slope or skew of the font in 1/10 degree, see vst_skew. +
  +
fontcol The colour of the font. The VDI colours are used, i.e. 0 = +White, 1 = Black, etc. See vst_color. +
  +
backcol The background colour to the text. The VDI colours are used, +i.e. 0 = White, 1 = Black etc. The setting of a text background colour +is not supported directly by the VDI, so it is up to the caller +whether and how this parameter is used. +
  + + +
halign With this one can specify the horizontal alignment of the text: +The text is to be output ranged left, ranged right or centred. +
  + + + +

+
+ + + + + + + + + + + + + + + + + + + + +
NameValueAlignment
THA_LEFT0Ranged left
THA_CENTER1Centred
THA_RIGHT2Ranged right
+
+ +
These values correspond to the parameter for horizontal +alignment for the VDI call vst_alignment. +
  +
valign With this one can specify the vertical aligment of the text: +The text is to be output aligned to the top line or the bottom line, +or (vertically) centred. +
  + + + +

+
+ + + + + + + + + + + + + + + + + + + + +
NameValueAlignment
TVA_BOTTOM0At the text bottom line
TVA_CENTER1Vertically centred
TVA_TOP2At the text top line
+
+ +
These values deliberately do not correspond to the +parameter for vertical alignment with vst_alignment! Values used there +('Base line', 'Character cell bottom line') are hardly intuitive for +the normal user and hence should not form part of the user interface +(which they would be however for selections in the font-selector). The +alignment therefore must be converted by the calling program to the +'correct' values. +
  + + +
rotation Text rotation in 1/10 degrees, as also used in the VDI +function vst_rotation. +
  + +
+ +
+

Still missing are the two parameters validtype and +validchars: +

+

Sometimes it is important to ensure that the font contains +certain characters. There are two possibilities for this: +

+

If validchars is zero, one can select with +validtype one of the following four groups of characters: +

+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameValueRangeComment
V_CHAR_IND-1-'Doesn't matter'
V_CHAR_ASC-232-126All printable ASCII characters
V_CHAR_PRT-332-255All printable characters
V_CHAR_ALL-40-255Really all characters
+
+ +

These four groups ought to cover the most common applications. +

+

If both validtype and validchars are zero, then +the font-selector will treat this as V_CHAR_IND; the same for othr +invalid values in validtype. +

+
+

Should the four groups not suffice at times, then one can +instead also specify more precisely with validtype and +validchars which characters are required: +

+ + + + + + + +
validtype then contains a value for the character mapping to be used by +GDOS (see vst_charmap and What's mapping?). +
  +
A free choice of mapping is only available with an appropriate +GDOS (SpeedoGDOS or NVDI from Version 3 onwards). At present the +following mappings are defined: +
  + + +

+
+ + + + + + + + + + + + + + + +
NameValueMeaning
MAP_DIRECT0Direct mapping
MAP_ASCII1ASCII mapping (default)
+
+ +
If the GDOS does not support mapping, then the font-selector +will only accept MAP_ASCII; in that case all other mappings will be +ignored and a test for the presence of given characters will +not be performed. +
  +
validchars is a pointer to an array of integers (WORDs), with which one +can specify which characters the font has to contain. +
  +
The array consists of a series of from-to pairs: +
  +
    +
  • Two values following each other specify a range (from-to) +
      +

  • +
  • Individual characters are specified by doubling up +
      +

  • +
  • The end of the list is specified by a from-to pair in which the +'to' is smaller than the 'from' +
      +

  • +
+ +
Example: Only those fonts should be offered for +selection that contain all printable ASCII characters as well as the +German Umlauts: +
  +
+xFSL_PAR xpar; +
int chars[] = { ' ', ' ', /* ASCII 32..126 */ +
'ä','ä', 'ö','ö', 'ü','ü', +
'Ä','Ä', 'Ö','Ö', 'Ü','Ü', 'ß','ß', +
1,0 /* Ende der Liste */ +
}; +
+
xpar.font->validtype=MAP_ASCII; +
xpar.font->validchars=chars; +
  +
+ +
+ +

Future GDOSes will probably support further mappings (BICS, +Unicode, ...). Thanks to the coding used, the font-selector will also +handle these correctly: The mapping is simply passed in +validtype and then the presence of a character tested with +validchars. +

+

Note: The various possibilities available with the +validtype and validchars parameters should be used +sparingly and with some thought, as the required testing of the +characters may - depending on the GDOS - take quite a lot of time. +

+
15.14.1.3.9 The user-popup
+

For the user-defined popup (user-popup in short) the following +fields exist in the xFSL_PAR structure: +

+ + + + + + + + + + + + +
poptext Pointer to a text that is to appear before the popup, or 0L. +The font-selector is free to ignore this text. +
  +
num_entries Number of entries (i.e. lines) in popup. If there is a zero +here than no popup will be displayed. One should not use more than 16 +entries, even though some font- selectors may support more in some +circumstances. +
  +
sel_entry The selected entry in the popup (count starts from 0). The +font-selector stores the number of the selected popup entry here and +reads out the value anew at each xfsl_event call. In this way you can +also force the font-selector to activate the entry with number 5 +instead of the selected number 3, for instance, (at xFS_POPUP the +font-selector only reports which entry was selected, though this is +only activated on jumping back into the font-selector). +
  +
popup This is a pointer to an array of xFSL_PENTRY elements as shown +below. At the specified address there have to be exactly as many +elements as were specified in num_entries. +
  + +
+ + +

An entry in the popup is built up as follows: +

+
+
typedef struct
+{
+ char         *entry;      /* Text of the popup entry        */
+ PFONTINFO    *fontinfo;   /* Pointer to Fontinfo structure  */
+ unsigned int  fontflags;  /* Permitted font types           */
+ long          funcflags;  /* Function-flags, only for HuGo! */
+} xFSL_PENTRY;
+
+
+

The meaning of the elements of this structure should be clear +from the preceding explanations. The function-flags correspond to the +control- flags, apart from the flags that influence the global +behaviour of the font-selector (CC_WINDOW etc.). These are ignored +here. +

+

Important: The pointer to the PFONTINFO structure may +not be NULL! +

+

If the text of an entry starts with a `-', then the relevant +entry is disabled (displayed in light type and not selectable). This +is mainly intended for separation lines between entries. +

+
+

Application +

+

In principle one can see three fields of use for the user-popup: +

+ +
    +
  1. Each popup entry sets the font for a given part of a program. +So for example one could allow only non-proportional fonts in a given +program window, no vector fonts in another one, and all fonts in a +third. +
      +

  2. +
  3. Each entry makes a given group of fonts available. For +instance, if one frequently requires vector fonts, one could construct +a popup with the entries 'Vector fonts only' and 'All fonts'. +
      +

  4. +
  5. The popup however can be used also for something completely +different. One could accommodate information here that though it has +nothing to do with fonts, affects the window for which one wants to +set a font. For instance, one could offer a choice of the way that +inverse characters are to be displayed in a console window in the form +of a popup having entries 'Inverse', 'Bold', 'Underlined' available +for selection. +
      +
    If one wants to alienate the purpose of the popup in this way, +then with the xFS_POPUP message one has to transfer the changed font +(which can be recognized by the set FF_CHANGED flag) to all other +popup entries, as otherwise the font that is displayed in the +font-selector would change! +
      +

  6. +
+ +

15.14.1.4 The font-flags

+

With the font-flags one can restrict the fonts offered for +selection: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameValueMeaning
FF_SYSTEM0x0001Show system font (additionally)
FF_MONOSPACED0x0002Show monospaced fonts
FF_PROPORTIONAL0x0004Show proportional fonts
FF_BITMAP0x0008Show bitmap fonts
FF_SPD0x0010Show Speedo fonts
FF_TTF0x0020Show TrueType fonts
FF_PFB0x0040Show Type-1 fonts
FF_CFN0x0080Show Calamus fonts (not implemented yet)
FF_VECTOR0x00F0Show all vector fonts
FF_ALL0x00FEShow all fonts
FF_CHANGED0x8000Change made (only in the popup)
+
+ +

The values have been chosen in such a way that the individual +flags may be OR'd with each other. So, for instance if one uses for +the font-flags FF_MONOSPACED|FF_VECTOR, then only non-proportional +vector fonts will be offered for selection. +

+

In addition the following applies: +

+
    +
  • FF_SYSTEM has priority, i.e. if this flag is set then the +system font will be made available for selection too in any event. +
      +

  • +
  • If FF_SYSTEM is not set, then the system font will be offered +for selection only when its properties correspond to the set flags. +
      +

  • +
  • If neither FF_MONOSPACED nor FF_PROPORTIONAL is set, then the +font-flags are treated as if both flags are set. +
      +
    This applies in a similar way for FF_VECTOR and FF_BITMAP. +
      +

  • +
  • If FF_VECTOR is set, the all vector font formats will be +offered automatically. A finer subdivision is possible with the flags +FF_SPD, ..., FF_CFN, if desired. +
      +
    Please note: Calamus fonts (and therefore the FF_CFN +flag) are not supported by any GDOS at present! +
      +

  • +
  • The flag FF_CHANGED is only used to mark in the user-popup the +settings that have changed. The font-selector only sets this flag but +does not itself evaluate it. +
      +

  • +
+ +

15.14.1.5 xFSL return codes

+

All xFSL calls return consistent return codes (return values). A +negative number represents an error, a positive number (or zero) means +success or an event. +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameValueMeaning
xFS_PARERROR-9Parameter error, e.g. call after Rev. 3
xFS_LOADERROR-8Error when loading an xFSL module
xFS_RES_ERROR-7Resolution too low (minimum 640x400 pixels)
xFS_NO_HANDLE-6No VDI handle free
xFS_NO_WINDOW-5No window(handle) free
xFS_NO_FONTS-4No fonts loaded
xFS_NO_FONTSIZE-3Font size not identifiable
xFS_ACTIVE-2Font-selector is active already
xFS_ERROR-1General error (memory shortage or similar)
xFS_STOP0[Cancel] button selected
xFS_OK1[OK] button selected
xFS_HELP2[Help] button selected
xFS_EVENT3AES event occurred
xFS_POPUP4Changes to user-popup
+
+ +

These values were chosen to be upwardly compatible to the UFSL +font- selector (this knows the return codes -4, -3, -2, -1, 0 and 1). +

+

In addition, GEMDOS error messages (values smaller or equal to +-32) can occur; in particular, xfsl_init can also return the value +EINVFN (-32) if the font-selector does not support the extended call. +

+

With the xfsl_init call, positive return values correspond to +the font-selector's window handle (0 means that the font-selector was +opened as a modal dialog). +

+

It is possible that the list of return codes will be extended in +the future for further errors (values smaller than -9) or events +(values greater that 4). This should be respected during the design of +the program: Unknown errors should lead to an abort, unknown events +should be ignored. +

+

15.14.1.6 The Pure-C event structure

+ +

The GEM library of Pure-C uses a special structure in which +the parameters of the AES function evnt_multi are coalesced. This +structure is also used by xfsl_event. +

+
+
typedef struct /* Special type for EventMulti */
+{
+ /* Input parameters */
+ int ev_mflags,
+     ev_mbclicks, ev_bmask, ev_mbstate,
+     ev_mm1flags, ev_mm1x, ev_mm1y, ev_mm1width, ev_mm1height,
+     ev_mm2flags, ev_mm2x, ev_mm2y, ev_mm2width, ev_mm2height,
+     ev_mtlocount, ev_mthicount;
+
+ /* Output parameters */
+ int ev_mwich,
+     ev_mmox, ev_mmoy, ev_mmobutton, ev_mmokstate,
+     ev_mkreturn, ev_mbreturn;
+
+ /* Message-Buffer */
+ int ev_mmgpbuf[8];
+} EVENT;
+
+
+

The elements of the structure correspond to those of the +evnt_multi call. The order of the parameters too - apart from a few +exceptions - is identical. The field ev_mwich contains the +occurred events in the same coding as ev_mflags in evnt_multi. +

+

15.14.2 xFSL tips and notes

+

In the following sections an attempt is made to give some tips +and notes for the xFSL interface. +

+

15.14.2.1 A simple xFSL call

+

In view of the multitude of parameters and setting options, the +following note seems appropriate: +

+
+Don't panic! +
+

An xFSL call is simpler than it appears at first. In particular +one can adopt here the strategy of 'step-by-step refinement', since +one can set (almost) all parameters to zero at first. +

+

A possible simple xFSL call can look like this, for instance: +

+
+
#include <stdio.h>
+#include <aes.h>
+#include <vdi.h>
+#include <xfsl.h>
+
+void call_xfsl (void)
+{
+  int xhandle, xret;
+  xFSL_PAR xpar;
+  PFONTINFO pfont;
+  xFSL *xfsl;
+
+  memset (&xpar, 0, sizeof (xFSL_PAR));
+  memset (&pfont, 0, sizeof (PFONTINFO));
+
+  xpar.par_size = sizeof (xFSL_PAR);
+  xpar.pfi_size = sizeof (PFONTINFO);
+  xpar.font = &pfont;
+  xpar.font->fontcol = BLACK;
+
+  if (get_cookie ('xFSL', &xfsl))
+  {
+    xhandle = xfsl->xfsl_init (0, &xpar);
+    if (xhandle >= 0)
+    {
+     do
+       xret = xfsl->xfsl_event (xhandle, 0L);
+     while (xret > xFS_OK);
+     xfsl->xfsl_exit (xhandle);
+     if (xret == xFS_STOP)
+       printf ("Cancel\n");
+     else if (xret == xFS_OK)
+       printf ("Font with ID %d selected\n", xpar.font->fontid);
+     else if (xret < 0)
+       printf ("Error %d\n", xret);
+   }
+   else
+     printf ("Error %d\n", xhandle);
+  }
+  else
+    printf ("Cookie not found!\n");
+}
+
+
+

With the two memset calls all elements of the structures +xFSL_PAR and PFONTINFO are set to zero. Subsequently some absolutely +necessary values are entered: +

+
    +
  • The size of the two structures xFSL_PAR and PFONTINFO +
      +

  • +
  • The address of the PFONTINFO structure is entered in the +xFSL_PAR structure +
      +

  • +
  • The font colour is set to black (one could also omit this, but +normally one wants to write in black type on a white background) +
      +

  • +
+ +

MNo further preparation is required, and now the actual call +follows. First the xFSL cookie is searched for and on success the +font-selector will be initialized by passing the xFSL_PAR structure. +If this call was successful (xhandle is greater or equal to +zero), then the font-selector is already on the screen. In the main +loop one now waits until the font-selector is terminated either with +xFS_STOP or xFS_OK by the user, or until an error occurs (other +positive return values are simply ignored here). With the call of +xfsl_exit the font-selector is removed from the screen once more and +subsequently the return value is evaluated. +

+

That wasn't too complicated, was it? From here on you can now +continue experimenting with various parameters and flags. +

+

15.14.2.2 xFSL Questions and Answers

+

How can I find out which features the font-selector +offers? +

+

Directly, this can be done for some features by using the +function xfsl_info. Indirectly, further features can be inquired for +with the control field in the xFSL_PAR structure: After a +successful xfsl_init call the font-selector will clear those control-flags +that it does not understand. +

+

How should my program behave when it realizes that the +font-selector does not support the desired feature? +

+

If some kind of font-selector is installed, then it also ought to +be used in any case. Depending on how important the missing feature +is, your program could look for alternatives (e.g. via the Font +protocol) or attempt to compensate for the missing feature. +

+

Once again: The user wanted a font-selector, not an +error-message! If the missing feature can be compensated for only with +difficulty, then you should inform the user once(!) with a +corresponding note, but call up the font-selector nevertheless. Even +if the selection can then not be made with the desired convenience, it +is still far less frustrating for the user than not being able to +select a font at all. +

+

Some examples: If the popup is to be used to set the font for a +given program window, then if the popup is missing the font should be +set for the topped window of the program. If the font-selector does +not support the locking of size-changes, then the returned size should +simply be ignored and - if it differs from the desired size - the user +informed about this by a note. +

+

Incidentally, one should not rely on the font-selector +supporting the same features the next time it is called! The +font-selectors that work with an overlay (XFSL.OVL) can be substituted +at any time without a Reset by re-copying the overlay. +

+

What's all this 'mapping' about? +

+ +

Vector fonts generally contain more than the familiar 256 +characters, and furthermore they are not normally in the accustomed +ASCII coding (for example the space character may lie at position 0 +instead of 32). Therefore the pertinent characters of the font are +'mapped' to the 'normal' 256 characters, so that the space character +lies as usual in position 32, no matter what position it has within +the font. This is designated as 'ASCII mapping'. +

+

The ASCII mapping is active by default, but due to this one +cannot access the characters that lie outside the ASCII character set. +Hence a second mapping, 'Direct mapping', is available. Here one has +access to all characters of a font. However, for this one also +has to know what type of font one is dealing with and how many +characters the font contains: Speedo fonts usually have 564 +characters, TrueType fonts can (theoretically) contain up to 65536 +characters. One can get this information after switching to Direct +mapping with the VDI function vqt_fontinfo: +

+

int minADE, maxADE; +

+

vst_charmap(handle,0); +vqt_fontinfo(handle,&minADE,&maxADE,dumarray,&dummy,dumarray); +

+

In minADE one gets the smallest, in maxADE the +largest valid character index. +

+

Direct mapping only has limited use for normal applications. +Unlike ASCII mapping which provides consistent mapping for all types +of fonts, one needs to know here exactly what kind of font one is +dealing with. Thus, for instance, the Speedo symbol fonts have a +different coding to the 'normal' Speedo fonts. This means that at +position 64 of such a symbol font, say, one will not find the same +character as for a 'normal' Speedo font. +

+

Other mappings than ASCII are therefore of no interest to the +majority of programs at present. But future GDOSes or equivalents may +possibly also offer other consistent mappings (e.g. Unicode or BICS), +where one can once more rely on the same character appearing always at +a given position (similar to ASCII mapping but also including +positions higher than 255). +

+

Note: NVDI from NVDI 4 onwards is able to use Unicode +mapping. +

+

15.14.2.3 xFSL technical programming notes

+

The description of the xFSL interface in this text is effected +in Pure-C. In the following sections the data-types and specifics of +Pure-C are described in greater detail, so that xFSL calls succeed in +other programming languages and C-dialects as well. +

+
15.14.2.3.1 Data-types
+

The following data-types are used in this (part of the) text: +

+
+
+ + + + + + + + + + + + + + + + + + + + +
NameSize
int16-bit signed
unsigned int16-bit unsigned
long32-bit signed
unsigned long32-bit unsigned
+
+ +
+

The data-type 'char' is an (ASCII) character and is used here +only as a pointer type, i.e. as a pointer to a C-string (series of +characters terminated with a NULL-byte). +

+
+ +

Union +

+

A union corresponds to a variable record in Pascal. It is a +structure whose individual elements lie 'on top of each other', i.e. +occupy the same block of memory. Which element is valid at a given +time depends on the context, or is left to the programmer. +

+

Example: In the structure PFONTINFO a union `fsize' is +used for the size specification: +

+
+
union fsize
+{
+ int   size;    /* Font size in points        */
+ fix31 size31;  /* Font size in 1/65536 point */
+};
+
+
+

The memory requirement of this union comprises four bytes, as +the type fix31 is four bytes long. One could now assign to the +element size31 a size-specification in 1/65536 point and then +read out the value in whole points from the element size - but +this is not to be recommended, as in the conversion of fix31 to +points one should always round off (see below). +

+
+ +

fix31 +

+

The data-type fix31 is a fixed-point number, in which the upper +16 bits represent the signed pre-decimal point (whole number) portion, +and the lower 16 bits the unsigned decimal portion. It is used only +for the size specification and positioning of fonts, so that one can +obtain a precision of 1/65536 point with it. +

+

In the conversion of fix31 to points one must not forget +rounding. To quote from the NVDI guide: +

+

One may never, never, ever just cut off the decimal +part! +

+
15.14.2.3.2 xFSL parameter passing
+

The passing of parameters for all xFSL calls is done via the +stack according to C-convention. This means that at the call the +parameter lying furthest right is placed first on the stack, and the +left-most parameter at the end, i.e. when jumping to the +font-selector, lies at the top. +

+
15.14.2.3.3 Pure-C and 'cdecl'
+

Pure-C normally passes the parameters to functions in registers. +For passing via the stack one must either use the keyword 'cdecl' (as +in the include file XFSL.H) or the compiler switch '-H' must be set. +

+

The keyword 'cdecl' is a Pure-C-specific extension and so will +issue a warning with compiler switch '-A' (ANSI-conform) set. +

+

15.14.3 xFSL revisions history

+

Revision 4 +

+
    +
  • Due to a small design error in the older revisions that limited +the extendebility of the interface, Revision 4 is not +compatible to older revisions. This should not be a problem in +practice, as the font-selector will quit calls according to the old +scheme with an error. The old Revision 3 will disappear in time. +
      +

  • +
  • New parameters in the PFONTINFO structure: +
      +

      +
    • Text background colour (backcol) +
        +

    • +
    • Text alignment (halign and valign) +
        +

    • +
    • Text rotation (rotation) +
        +

    • +
    • Specification of characters that the selected font has +to contain (validtype and validchars) +
        +

    • +
    + +

  • +
  • The PFONTINFO structure is also filled for returns of xFS_STOP +with the values of the last font selected in the font-selector +
      +

  • +
  • Coding of the font-flags changed (finer differentiation of the +vector formats) +
      +

  • +
+ +
+

Revision 3 +

+
    +
  • The first publicly available interfacen revision +
      +

  • +
+ +
+

Older revisions +

+
    +
  • Older revisions can be safely ignored, as these never appeared +in a program available to the public at large +
      +

  • +
+ +

15.14.4 UFSL/xFSL program overview

+

There follows an overview of all available font-selectors at +this time that dispose of a UFSL or an xFSL interface (or both). +

+

This is followed by a list of programs that use a font-selector +with one or both of these interfaces. +

+

15.14.4.1 Font-selector overview

+

A short overview of the currently existig font-selectors: +

+
+
+
UFSL
+
+

by Michael Thänitz +
This is the prototype of all external font-selectors. The last +published version is 0.97, after which Michael unfortunately ceased +its development. Thankfully however he has published the source texts. +
  +

+ +
+
FontSel
+
+

by Holger Weets and Christoph Zwerschke +
A small but also rather spartan font-selector from Holger Weets, +which from Version 1.02 has been developed further by Christoph +Zwerschke. As of the Version 1.02 the xFSL interface is supported as +well. +
  +

+

+ + +
xUFSL
+
+

by Stefan Rogel +
The xUFSL offers many additional features to the font-selectors +named above. As these could not be accessed via the existing UFSL +interface, Stefan has extended the interface. The design of the first +version was, to put it carefully, 'controversial'. The last published +Version: 1.05. The successor of the xUFSL is ... +
  +

+ +
+
HuGo
+
+

by Stefan Rogel +
HuGo! is the successor of the xUFSL adapted to the xFSL interface +(the UFSL interface is also still supported, but not the special +extensions of the xUFSL to the UFSL interface). The name change was +made to avoid confusion. +
  +

+ +
+
Calvino
+
+

by Dirk Haun +
Together with HuGo! the first font-selector with a xFSL interface. +Calvino too still supports the simple UFSL interface. +
  +

+ +
+
FONT_SEL und FONT_PAL
+
+

by Christian Grunenberg +
These two programs work on a Drag&Drop basis, so they support +neither the UFSL nor the xFSL interface, but instead support the Font +protocol. FONT_SEL is a font-selector, FONT_PAL a font palette (with +integrated font-selector). +
  +

+ +
+
+

15.14.4.2 Programs that support a font-selector

+

The following programs support an external font-selector +(position at 16.08.1998, all specifications without guarantee): +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ProgramCategoryAuthorUFSLxFSL
800XL-DeejayDrive emulatorKolja Koischwitz+
APP_ListSystem utilityRalf Zimmermann+
BelliniGraphics programIngo Dehne+
BibelSTBible softwareReinhard Bartel+
Cat2MausMausTauschHarald Sommerfeldt+
ChatwinShellDirk Haun+W+W
CyPressText processorRene Bartholomay+W
DB-PointNewsreaderMichael Heng+
Disk CakeDisk utilityChristoph Zwerschke++
EgaleFile utilityDavid Reitter++
EverestEditorOliver Schmidt+
Face ValueApp.builder/LibVegard Hofsoy-+
FlohFFile list utilityHeiko Schaefer+
GEMARBackupSteffen Engel+
GEM-FontviewerFont displayerReinhard Bartel++
GEM-PlanSpreadsheetReiner Rosin+W
HitchcockSystem utilityThorsten Pohlmann+
IdeaListASCII print programChristoph Bartholme+
ImaginFunction plotterReinhard Maier+
JediGAL-AssemblerRalf Zimmermann+
KandinskyDrawing programUlrich Rossgoderer+
MagiC!ConfMagiC utilityChristian Ratsch+
MasterBrowseFile viewerMichel Forget+
MenuInfoSystem utilityDirk Hagedorn+W
OkamiNewsreaderWolfram Rösler+
Photo LineImage processorGerhard Huber+
QEDEditorChristian Felsch+
RoadRunnerCar journey plannerAndreas Schrell+W
SaugUtilityDittoFrank Rüger+
SchecksBusiness softwareChristian Lehmann+
ST-GuideHypertextHolger Weets+
STJ-OberonProgramming languageStephan Junker++
TexelSpreadsheetThomas Much++
UpToCASECASE toolMichael Nolte+
VESALLearning programPeter Klasen+
Zeig's mirFile viewerReiner Rosin++W
+
+ +

(+: supported, W: as window-dialog) +

+
+ +

15.14.5 The UFSL interface

+

For the sake of completeness, an English translation of the +original description by Michael Thänitz of the original UFSL +interface follows here : +

+

Programming interface: +

+

UFSL is a font-selector box for the AUTO folder. If offers a +simple programming interface to the programmer via a cookie. +

+

The cookie is called: 'UFSL'. +
The cookie returns a pointer to the following structure: +

+
 typedef struct
+ {
+  unsigned long  id;      /* UFSL ID (UFSL)       */
+  unsigned int   version; /* Version (BCD format) */
+  int dialtyp;            /* 0=Dialog, 1=Window   */
+  int cdecl (*font_selinit)(void);
+  int cdecl (*font_selinput)(
+              int vdihandle,
+              int dummy,
+              char *text,    /* Custom text, max. 34 characters  */
+              int ftype,     /* 1=Only monospaced fonts, 0=All   */
+              int *fretid,   /* Set Font ID                      */
+              int *fretsize  /* Set font size                    */
+              );
+  OBJECT *helpbutton;           /* Type: BOXTEXT                 */
+  void cdecl (*helpfunc)(void); /* User-defined Help function    */
+
+  /**** As of Version 0.91 ********************************************/
+  char *examplestr;            /* Sample text for font display     */
+
+  /**** As of Version 0.96 ********************************************/
+  void cdecl (*msgfunc)(int event, int msgbuf[]);/* Redraw function */
+
+  /**** As of Version 0.97 ********************************************/
+  int cdecl (*fontsel_exinput)(
+              int vdihandle,
+              int ftype,     /* 1=Only monospaced fonts, 0=All     */
+              char *text,    /* Custom text, masx. 34 characters   */
+              int *fretid,   /* Set font ID                        */
+              int *fretsize  /* Set font size                      */
+              );
+ } UFSL;
+
+

Call: +

+
UFSL *ufsl;
+ufsl=(UFSL *)get_cookie('UFSL');
+ufsl->helpfunc= my_helpfunc;   /* Help function, or NULL */
+ufsl->msgfunc = my_msghandler; /* Redraw function, or NULL,
+                                  respect dialtyp       */
+ufsl->fontsel_input(vdihandle,"Please select a font",0,&id,&size);
+or
+ufsl->fontsel_input(vdihandle,NULL,0,&id,&size);
+
+

Return codes: +

+
 1 : All OK, values are valid
+ 0 : Cancel selected
+-1 : Out of memory
+-2 : Impermissible mutliple call
+-3 : Font size could not be identified
+-4 : Number of fonts must be greater than zero
+
+

Special functions: +

+
void cdecl (*helpfunc)(void); /* User-defined Help function      */
+
+

UFSL can call a user-defined Help function via the equally +optional HELP button. helpfunc requires no parameters and also +has no return value. +

+
void cdecl (*msgfunc)(int event, int msgbuf[]); /* Redraw function */
+
+

When using the UFSL as a window-dialog it is necessary to make a +Redraw function available. It sends any received events back to the +calling program, so that after moving the dialog one can restore the +background windows. msgfunc returns the result of evnt_multi +as the first parameter and the MsgPipe as the second parameter. A +return code is not required. The calling program must make available +all the required routines for window handling. wind_update(..._UPDATE) +is not set by UFSL, so this is the duty of the calling user program. +On principle (?) the memory protection of MultiTOS should be switched +off. +

+

Basically one should give some thought whether all events should +be replied to appropriately. A WM_TOPPED, which tops other windows of +the program, should not be answered, since UFSL naturally can only be +applications modal as UFSL gyrates in its own form_do / evnt_multi. +

+

15.14.6 Notes for authors of other font-selectors

+

Authors of other font-selectors are invited to have their +program join the xFSL interface. In principle, every font-selector +that uses a TSR concept can be furnished with the xFSL interface. +

+

To prevent misunderstandings: The overlay technique and the +reentrancy as offered by Calvino and HuGo! are not part of the actual +interface and hence need not be supported by other font-selectors. +Indeed the interface between the resident part ('shell') and the +post-loaded part ('overlay') is also standardized and therefore can be +used by other font-selectors as well. A description of this internal +interface is available on request, see 'Contact addresses'. +

+

Since a number of programs already support the old UFSL +interface, it seems advisable to make this interface available in new +font-selectors as well. However a quick look at these programs shows +that they call the font-selector almost exclusively as a modal dialog. +Thus the recommendation is to build in minimal UFSL support (as a +modal dialog only) and instead implement the xFSL interface as widely +as possible, since one can now expect that just those - now finally +standardized - extensions will be used by programs rather than the +UFSL interface. +

+

A font-selector should offer the following additional features +if possible: +

+
    +
  • Size changes possible +
    In particular this means that not just fixed sizes can be chosen, +but with vector fonts inbetween sizes can be set as well. +
      +

  • +
  • fix31 support +
    For some applications the setting of the font size in points is +not enough, hence a setting in 1/65536 point should be possible. +
      +

  • +
  • User-popup +
    With an additional popup, the font-selector can be used more +flexibly. +
      +

  • +
  • Drag&Drop support +
    Besides the 'traditional' call via the cookie, solutions on the +Drag&Drop basis are coming more and more into fashion. If the +font-selector already supports Drag&Drop natively, then it can be +converted easily with a 'front end' program into a full-blown +Drag&Drop selector. +
      +

  • +
+ +

The following conventions were agreed for an xFSL font-selector: +

+
    +
  • If the font-selector has a Closer, then clicking on this will +be interpreted as 'Cancel', i.e. xFS_STOP will be returned. If the +CC_CLOSER control-flag is set, then the font current at the time will +be returned nevertheless (in the PFONTINFO structure in xFSL_PAR). +
      +

  • +
  • If the extended call (xfsl_init, xfsl_event and xfsl_exit) is +not supported, then at least a dummy function for xfsl_init will be +installed that always returns -32 (GEMDOS error-message EINVFN, +invalid function number). +
      +
    But it is urgently requested that the extended call is offered, +as this is the one used most frequently. +
      +

  • +
  • It does not matter if the font-selector only appears as a modal +dialog for the extended call. But with a set CC_WINDOW, xfsl_init +should then return xFS_NO_WINDOW, so that the caller can adjust +himself to this. +
      +

  • +
+ +
+ +Home +ProtocolsProtocols +XAccXAcc +XSSI protocolXSSI protocol + + diff --git a/en/protocols.html b/en/protocols.html new file mode 100644 index 000000000..512ffc01a --- /dev/null +++ b/en/protocols.html @@ -0,0 +1,51 @@ + + + + + +The documentation for TOS: Protocols + + + + + + + + + +Home +Contents +Detecting the presence of TosBox, Steem and PaCifiSTDetecting the presence of TosBox, Steem and PaCifiST +AV protocolAV protocol + +
+ +

15 Protocols

+ +
+
+ +Home +Contents +Detecting the presence of TosBox, Steem and PaCifiSTDetecting the presence of TosBox, Steem and PaCifiST +AV protocolAV protocol + + diff --git a/en/references.html b/en/references.html new file mode 100644 index 000000000..5705e5b20 --- /dev/null +++ b/en/references.html @@ -0,0 +1,72 @@ + + + + + +The documentation for TOS: Declaration of sources + + + + + + + + + +Home +Contents +Literature for the TOS operating systemLiterature for the TOS operating system +The PMMU functions-handlerThe PMMU functions-handler + +
+ +

E Declaration of sources

+

The information collected in this hypertext originates from +various sources, namely: +

+
    +
  • Atari Profibuch ST-STE-TT +
  • +
  • Documentation for: +
      +
    • MagiC +
    • +
    • MagiC Mac +
    • +
    • MiNT +
    • +
    • NVDI +
    • +
    + +
  • +
  • ST-Computer and ST-Magazin +
  • +
  • Vom Anfänger zum GEM-Profi +
  • +
  • The groups ATARI.EXP, ATARI.PROG, GEM.GER, GEMINI and +MINT/MTOS of the Mausnet, as well as multiple further sources. +
  • +
+ + +

In this connection I would like to express my thanks to everyone +who has sent me information and bug-reports. +

+

Extra special thanks from Rolf Kotzian go to Volker +Ritzhaupt and Oliver Buchmann (Application Systems +Heidelberg), who allowed me access to the MagiC, MagiC Mac and +NVDI sources, as well as to Thomas Tempelmann for the +support for the MagiC Mac specifics. +

+

See also: Literature +

+
+ +Home +Contents +Literature for the TOS operating systemLiterature for the TOS operating system +The PMMU functions-handlerThe PMMU functions-handler + + diff --git a/en/rsrc.html b/en/rsrc.html new file mode 100644 index 000000000..6d8999fc3 --- /dev/null +++ b/en/rsrc.html @@ -0,0 +1,1131 @@ + + + + + +The documentation for TOS: Resource library + + + + + + + + + +Home +AESAES +Property libraryProperty library +Shell libraryShell library + +
+ +

8.21 Resource library

+

This library contains functions to load the resources of a +GEM program (menu bars, dialog boxes, icons etc.) into memory and +manipulate them there, as well as ascertaining the addresses of the +relevant objects. The following routines are available for this +purpose: +

+ + + + + + + + + + + + + + + + + + + + + +
rsrc_free Releases memory occupied by an application's resource +
rsrc_gaddr Obtains address of an object in a resource data set +
rsrc_load Loads a resource file +
rsrc_obfix Converts character-based to pixel-based coordinates +
rsrc_rcfix Fixes up coordinates and pointers in memory +
rsrc_saddr Stores address of an object +
sys_recalc_cicon_colours Passes RGB-triplets in promille for icon conversion in 'direct +colour' screen modes + +
+ +

Note: Laying off such objects to a resource file has the +invaluable advantage of permitting changes to the appearance (and +particularly the language of any text) in a simple way without +having to make any modifications to the program itself. +

+

See also: About the AES   Style guidelines +

+

8.21.1 rsrc_free

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Resource free« - Release memory occupied by a resource file. +
  +
Opcode: 111 +
  +
Syntax: int16_t rsrc_free ( void ); +
  +
Description: The call rsrc_free frees the memory previously occupied by a +resource file (allocated by rsrc_load). +
  +
Note: It is imperative to call this function at the +termination of a program! +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: All AES versions. +
  +
Group: Resource library +
  +
See also: Binding   rsrc_load +
  + +
+ +

8.21.1.1 Bindings for rsrc_free

+ + + + + + + + + +
C: int16_t rsrc_free ( void ); +
  +
Binding: +
  +
int16_t rsrc_free (void)
+{
+   return ( crys_if(111) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]111 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_outint_out[0]Return value
+
+ + +
+ +

8.21.2 rsrc_gaddr

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Resource get address« - Obtain address of an object in a +resource set. +
  +
Opcode: 112 +
  +
Syntax: int16_t rsrc_gaddr ( int16_t re_gtype, int16_t re_gindex, void +*gaddr ); +
  +
Description: The call rsrc_gaddr obtains the start addresses of various +object structures of resource files loaded into memory with rsrc_load. +The following apply: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
re_gtypeType of structure searched for:
 R_TREE 0  = Object tree
 R_OBJECT 1  = Individual OBJECT
 R_TEDINFO 2  = TEDINFO structure
 R_ICONBLK 3  = ICONBLK structure
 R_BITBLK 4  = BITBLK structure
 R_STRING 5  = Free string data
 R_IMAGEDATA 6  = Free image data
 R_OBSPEC 7  = ob_spec field in OBJECT
 R_TEPTEXT 8  = te_ptext in TEDINFO
 R_TEPTMPLT 9  = te_ptmplt in TEDINFO
 R_TEPVALID 10 = te_pvalid in TEDINFO
 R_IBPMASK 11 = ib_pmask in ICONBLK
 R_IBPDATA 12 = ib_pdata in ICONBLK
 R_IBPTEXT 13 = ib_ptext in ICONBLK
 R_BIPDATA 14 = bi_pdata in BITBLK
 R_FRSTR 15 = ad_frstr free string
 R_FRIMG 16 = ad_frimg free image
re_gindexIndex of the structure searched for
gaddrAddress of the desired structure
+
+ +
Note: If one wants to search for a text pointer within a +TEDINFO structure, for instance, then one must not pass the +index of the associated object, but the index of the TEDINFO +structure. The same applies in essence to other codings. +
  +
Return value: An error has arisen only if the value 0 is returned (= object +does not exist). +
  +
Availability: All AES versions. +
  +
Group: Resource library +
  +
See also: Binding   rsrc_load +
  + +
+ +

8.21.2.1 Bindings for rsrc_gaddr

+ + + + + + + + + +
C: int16_t rsrc_gaddr ( int16_t re_gtype, int16_t re_gindex, void +*gaddr ); +
  +
Binding: +
  +
int16_t rsrc_gaddr (int16_t re_gtype, int16_t re_gindex,
+                    void *gaddr)
+{
+   int_in[0]  = re_gtype;
+   int_in[1]  = re_gindex;
+   control[4] = 1;
+
+   crys_if (112);
+
+   control[4] = 0;
+   *gaddr = addr_out[0];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]112 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]1 # Entry in addr_out
int_inint_in[0]re_gtype
int_in+2int_in[1]re_gindex
int_outint_out[0]Return value
addr_outaddr_out[0]gaddr
+
+ + +
+ +

8.21.3 rsrc_load

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Resource load« - Loads a specified resource file into +memory. +
  +
Opcode: 110 +
  +
Syntax: int16_t rsrc_load ( CONST int8_t *re_lpfname ); +
  +
Description: The call rsrc_load serves for loading a resource file and +initializing it (allocating memory); furthermore, all OBJECT +coordinates are converted from character-based coordinates to screen +coordinates. The parameter re_lpfname contains the +NULL-terminated filename of the resource file to load. +
  +
Note: The file will be looked for in all directories +that the AES knows about. +
  +
As of PC-GEM Version 2.0, incidentally, all object trees that +have a box as a root (e.g. all dialog boxes) will have the SHADOWED +flag set for it in ob_state. This means that all dialog boxes +will be drawn with a shadow instead of an outline frame. The origin of +this lies in the legal disputes between Apple and Digital +Research. However, the SHADOWED bit can be reset (after rsrc_load) +at run-rime and the normal OUTLINED bit set once more. +
  +
Warning: Conversion of bit-images and icons from the +standard format to the device-specific format does not occur +at this stage. If required, this must be perfomed by the programmer +himself. +
  +
MagiC as of Version 3 and Geneva can load resources in the +Interface format. With other AESs this possibility can be checked with appl_getinfo +(opcode 2). +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: All AES versions. +
  +
Group: Resource library +
  +
See also: Binding   rsrc_free   shel_find   vr_trnfm +
  + +
+ +

8.21.3.1 Bindings for rsrc_load

+ + + + + + + + + +
C: int16_t rsrc_load ( CONST int8_t *re_lpfname ); +
  +
Binding: +
  +
int16_t rsrc_load (CONST int8_t *re_lpfname)
+{
+   addr_in[0] = re_lpfname;
+   return ( crys_if(110) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]110 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]re_lpfname
int_outint_out[0]Return value
+
+ + +
+ +

8.21.4 rsrc_obfix

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Resource object fix« - Convert an object's coordinates from +character-based to pixel-based. +
  +
Opcode: 114 +
  +
Syntax: int16_t rsrc_obfix ( OBJECT *re_otree, int16_t re_oobject ); +
  +
Description: The call rsrc_obfix converts the size and position of a +displayed object from character-based to pixel-based coordinates at +the current screen resolution. (This is required because all objects +in RSC files have their coordinates based on character positions +rather than screen coordinates to ensure correct display of trees and +objects at any screen resolution.) The following apply: +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
re_otreeAddress of the relevant object tree
re_oobjectIndex of the object to convert
+
+ +
Note: A call of this function is always required if +objects are created at run-time, or are not loaded with rsrc_load. +
  +
The conversion is performed by multiplying the lower byte of the +coordinate specification with the size of a character from the system +font, and then adding the (signed) upper byte. Exception: For +a width of exactly 80 characters, the width of the screen is +substituted; this is used for the background object of the menu tree +for instance. +
  +
Return value: This always has the value 1. +
  +
Availability: All AES versions. +
  +
Group: Resource library +
  +
See also: Binding   rsrc_load   rsrc_rcfix +
  + +
+ +

8.21.4.1 Bindings for rsrc_obfix

+ + + + + + + + + +
C: int16_t rsrc_obfix ( OBJECT *re_otree, int16_t re_oobject ); +
  +
Binding: +
  +
int16_t rsrc_obfix (OBJECT *re_otree, int16_t re_oobject)
+{
+   int_in[0]  = re_oobject;
+   addr_in[0] = re_otree;
+
+   return ( crys_if(114) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]114 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]re_oobject
addr_inaddr_in[0]re_otree
int_outint_out[0]Return value
+
+ + +
+ +

8.21.5 rsrc_rcfix

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Resource coordinate fix« - Fix up coordinates and pointers +in memory. +
  +
Opcode: 115 +
  +
Syntax: int16_t rsrc_rcfix ( RSHDR *rc_header ); +
  +
Description: The function rsrc_rcfix, present in MagiC and MultiTOS, fixes +up resource data already loaded into memory by the application. During +this the coordinates are converted from character- to +pixel-coordinates. +
  +
If an application has already loaded an RSC file before the +function is called, then it must be released with rsrc_free before the +rsrc_rcfix call is made. The same applies at the termination of the +application. +
  +
The advantage of this function consists in the ability of +incorporating the resource file of the program into the program code +itself. It then suffices to just call rsrc_rcfix, and loading with +rsrc_load can then be dispensed with. The following applies: +
  + + + +
rc_header: Address of the RSC header in memory; the RSC data must lie +after this + +
+ +
Return value: This will be 0 if unsuccessful, else non-zero. +
  +
Availability: Available only in MagiC and AES versions 4.0 and greater. The +presence of this call should also be checked for using appl_getinfo (Opcode +4). +
  +
Group: Resource library +
  +
See also: Binding   rsrc_load   rsrc_obfix +
  + +
+ +

8.21.5.1 Bindings for rsrc_rcfix

+ + + + + + + + + +
C: int16_t rsrc_rcfix ( RSHDR *rc_header ); +
  +
Binding: +
  +
int16_t rsrc_rcfix ( RSHDR *rc_header )
+{
+   addr_in[0] = rc_header;
+   return ( crys_if(115) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]115 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]rc_header
int_outint_out[0]Return value
+
+ + +
+ +

8.21.6 rsrc_saddr

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: Resource store address« - Store address of an object. +
  +
Opcode: 113 +
  +
Syntax: int16_t rsrc_saddr ( int16_t re_stype, int16_t re_sindex, void +*saddr ); +
  +
Description: The call rsrc_saddr stores the start address of a data +structure in memory. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
re_stype Type of structure: +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
R_TREE0=Object tree
R_OBJECT1=Individual OBJECT
R_TEDINFO2=TEDINFO structure
R_ICONBLK3=ICONBLK structure
R_BITBLK4=BITBLK structure
R_STRING5=Free string data
R_IMAGEDATA6=Free image data
R_OBSPEC7=ob_spec field in OBJECT
R_TEPTEXT8=te_ptext in TEDINFO
R_TEPTMPLT9=te_ptmplt in TEDINFO
R_TEPVALID10=te_pvalid in TEDINFO
R_IBPMASK11=ib_pmask in ICONBLK
R_IBPDATA12=ib_pdata in ICONBLK
R_IBPTEXT13=ib_ptext in ICONBLK
R_BIPDATA14=ib_pdata in BITBLK
R_FRSTR15=ad_frstr free string
R_FRIMG16=ad_frimg free image
+
+ +
re_sindex Position within the data structure +
saddr Address to be saved in data structure + +
+ +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: All AES versions. +
  +
Group: Resource library +
  +
See also: Binding   rsrc_gaddr   OBJECT +
  + +
+ +

8.21.6.1 Bindings for rsrc_saddr

+ + + + + + + + + +
C: int16_t rsrc_saddr ( int16_t re_stype, int16_t re_sindex, void +*saddr ); +
  +
Binding: +
  +
int16_t rsrc_saddr (int16_t re_stype, int16_t re_sindex,
+                    void *saddr)
+{
+   int_in[0]  = re_stype;
+   int_in[1]  = re_sindex;
+   addr_in[0] = saddr;
+
+   return ( crys_if(113) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]113 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]re_stype
int_in+2int_in[1]re_sindex
addr_inaddr_in[0]saddr
int_outint_out[0]Return value
+
+ + +
+ +
+ +Home +AESAES +Property libraryProperty library +Shell libraryShell library + + diff --git a/en/scancode.html b/en/scancode.html new file mode 100644 index 000000000..634787b92 --- /dev/null +++ b/en/scancode.html @@ -0,0 +1,859 @@ + + + + + +The documentation for TOS: The scancode + + + + + + + + + +Home +Contents +ASCII tableASCII table +Development systemsDevelopment systems + +
+ +

B The scancode

+

As not every key on the Atari keyboard is assigned an +ASCII-code, it is necessary in a few cases to interrogate the relevant +scancode directly. Normally however this should be necessary only +for the 'special' non-print keys such as the cursor and function +keys. +

+

The following table gives an overview of the important scancodes +for German, UK and North American keyboards as well as the standard +VDI code. Keyboards for other countries/languages may differ for +some keys (see NKCC below). +

+

Where two characters are shown for a non-letter entry, the +second is the upper character marked on the key - i.e. produced with +one of the [Shift] keys pressed; the scancode remains the same. +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ScancodeGermanyUSAStandard VDI code
1ESC  
2111
3222
4333
5444
6555
7666
8777
9888
10999
11000
12ß--
13,==
14Backspace  
15TAB  
16QQQ
17WWW
18EEE
19RRR
20TTT
21ZYY
22UUU
23III
24OOO
25PPP
26Ü[[
27+]]
28Return  
29Control  
30AAA
31SSS
32DDD
33FFF
34GGG
35HHH
36JJJ
37KKK
38LLL
39Ö;;
40Ä''
41#``
42Left Shift  
43 \\
44YZZ
45XXX
46CCC
47VVV
48BBB
49NNN
50MMM
51,,,
52...
53-//
54Right Shift  
55Not presentNot presentPRINT SCREEN
56Alternate  
57Space  
58CapsLock  
59F1  
60F2  
61F3  
62F4  
63F5  
64F6  
65F7  
66F8  
67F9  
68F10  
69   
70   
71ClrHome  
72Up-arrow  
73Not presentNot presentPAGE UP
74- (Num-pad)  
75<–  
76Alt Gr(Milan)  
77–>  
78+ (Num-pad)  
79Not presentNot presentEND
80Down-arrow  
81Not presentNot presentPAGE DOWN
82Insert  
83Delete  
84Shift-F1Shift-F1F11
85Shift-F2Shift-F2F12
86Shift-F3Shift-F3F13
87Shift-F4Shift-F4F14
88Shift-F5Shift-F5F15
89Shift-F6Shift-F6F16
90Shift-F7Shift-F7F17
91Shift-F8Shift-F8F18
92Shift-F9Shift-F9F19
93Shift-F10Shift-F10F20
94Not presentNot presentF21
95Not presentNot presentF22
96<Not presentF23
97Undo F24
98Help F25
99( (Num-pad) F26
100) (Num-pad) F27
101/ (Num-pad) F28
102* (Num-pad) F29
1037 (Num-pad) F30
1048 (Num-pad) F31
1059 (Num-pad) F32
1064 (Num-pad) F33
1075 (Num-pad) F34
1086 (Num-pad) F35
1091 (Num-pad) F36
1102 (Num-pad) F37
1113 (Num-pad) F38
1120 (Num-pad) F39
113. (Num-pad) F40
114Enter CTRL PRINT SCREEN
115Not presentNot presentCTRL <–
116Not presentNot presentCTRL –>
117Not presentNot presentCTRL END
118Not presentNot presentCTRL PAGE DOWN
119Not presentNot presentCTRL HOME
120ALT 1 ALT 1
121ALT 2 ALT 2
122ALT 3 ALT 3
123ALT 4 ALT 4
124ALT 5 ALT 5
125ALT 6 ALT 6
126ALT 7 ALT 7
127ALT 8 ALT 8
128ALT 9 ALT 9
129ALT 0 ALT 0
130ALT ßALT-ALT -
131ALT 'ALT=ALT =
132Not presentNot presentCTRL PAGE UP
+
+ + + +

Note: A small problem is the contry/language-dependent +evaluation of the scancodes, since after all programs ought to work +correctly abroad as well. Here one can recommend the Normalized +Key Code Converter (NKCC) by Harald Siegmund, which solves +just this problem. +

+

See also: ASCII table   Keytbl +

+
+ +Home +Contents +ASCII tableASCII table +Development systemsDevelopment systems + + diff --git a/en/scrp.html b/en/scrp.html new file mode 100644 index 000000000..9a8cbe682 --- /dev/null +++ b/en/scrp.html @@ -0,0 +1,655 @@ + + + + + +The documentation for TOS: Scrap library + + + + + + + + + +Home +AESAES +Graphics libraryGraphics library +List boxesList boxes + +
+ +

8.14 Scrap library

+

This library makes functions available that permit a +standardized interchange of data betweeen various applications. The +following routines are present for this purpose: +

+ + + + + + + + + + + + +
scrp_clear Deletes files in the clipboard +
scrp_read Obtains path of the clipboard +
scrp_write Sets path of the clipboard +
x_scrp_get Obtains path of the clipboard + +
+ +

Note: Besides these functions, some other particulars +have to be taken into account for exchanging data via the clipboard. +

+

See also: Messages   SC_CHANGED   SH_WDRAW   Style guidelines +

+

8.14.1 scrp_clear

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Scrap clear« - Delete the contents of the clipboard. +
  +
Opcode: 82 +
  +
Syntax: int16_t scrp_clear ( void ); +
  +
Beschreibung_ The call scrp_clear deletes all files in the current clipboard. +
  +
Warning: Contrary to the usual conventions, really +all files will be deleted, not just those matching the mask +"scrap.*". +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: The function is available only under PC-GEM, KAOS 1.4.2 and +MagiC. Not present in ViewMAX. +
  +
Group: Scrap library +
  +
See also: Binding   Data exchange via the GEM clipboard +
  + +
+ +

8.14.1.1 Bindings for scrp_clear

+ + + + + + + + + +
C: int16_t scrp_clear ( void ); +
  +
Binding: +
  +
int16_t scrp_clear (void)
+{
+   return ( crys_if(82) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]82 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_outint_out[0]Return value
+
+ + +
+ +

8.14.2 scrp_read

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Scrap read« - Obtain pathname of the clipboard. +
  +
Opcode: 80 +
  +
Syntax: int16_t scrp_read ( int8_t *sc_rpscrap ); +
  +
Description: The call scrp_read obtains the current directory which is being +used for temporary storage (the clipboard). +
  +
Note: The clipboard directory path will lie in the +parameter sc_rpscrap after the call. One must be sure that the +receiving buffer is large enough for this. +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
To quote Mike Fulton, Atari Computer: +
"The scrp_read function is defined as possibly returning an +error-code of zero. However, this function currently always returns a +value of 1. Since this may change in future versions of GEM AES, +applications should handle the case of the error-code even if the +programmer does not expect to see it." +
  +
As of PC-GEM Version 2.0 however the following values are +returned: -1, if no path has been set yet; values >= 0 are to be +taken as a bit-vector that is meant to provide information about the +found file types. The following assignments apply: +
  + + + + + + +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SCRAP_CSV0x0001=scrap.csv
SCRAP_TXT0x0002=scrap.txt
SCRAP_GEM0x0004=scrap.gem
SCRAP_IMG0x0008=scrap.img
SCRAP_DCA0x0010=scrap.dca
 0x0020=scrap.dif (see Note)
SCRAP_USR0x8000=scrap.usr
+
+ +
All other bits are reserved for future purposes. +
  +
Note: According to the docs for PC-GEM, scrap.usr is +coded in bit 5, though the AES source text says bit 15. +
  +
The library from the book Vom Anfänger zum GEM-Profi +allocates bit 5 to DIF files. The extension is unofficial and works +only if that library is used for the build. +
  +
Availability: All AES versions, not present in ViewMAX. +
  +
Group: Scrap library +
  +
See also: Binding   scrp_write   Data exchange via the GEM clipboard +
  + +
+ +

8.14.2.1 Bindings for scrp_read

+ + + + + + + + + +
C: int16_t scrp_read ( int8_t *sc_rpscrap ); +
  +
Binding: +
  +
int16_t scrp_read (int8_t *sc_rpscrap)
+{
+   addr_in[0] = sc_rpscrap;
+   return ( crys_if(80) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]80 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]sc_rpscrap
int_outint_out[0]Return value
+
+ + +
+ +

8.14.3 scrp_write

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Scrap write« - Set path of the clipboard. +
  +
Opcode: 81 +
  +
Syntax: int16_t scrp_write ( int8_t *sc_wpscrap ); +
  +
Description: The call scrp_write sets the directory that is to be used for +temorary storage (the clipboard). +
  +
Note: The name of the new path is passed in the +parameter sc_wpscrap. The clipboard should carry the name +CLIPBRD, and should lie on the boot drive in each case. +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: All AES versions, not present in ViewMAX. +
  +
Group: Scrap library +
  +
See also: Binding   scrp_read   Data exchange via the GEM clipboard +
  + +
+ +

8.14.3.1 Bindings for scrp_write

+ + + + + + + + + +
C: int16_t scrp_write ( int8_t *sc_wpscrap ); +
  +
Binding: +
  +
int16_t scrp_write (int8_t *sc_wpscrap)
+{
+   addr_in[0] = sc_wpscrap;
+   return ( crys_if(81) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]81 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]sc_wpscrap
int_outint_out[0]Return value
+
+ + +
+ +

8.14.4 x_scrp_get

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Scrap read« - Obtain pathname of the clipboard. +
  +
Opcode: 29024 +
  +
Syntax: int16_t x_scrp_get( int8_t *path, int16_t delete ); +
  +
Description: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
path Pointer to a string which will receive the complete path of the +clipboard folder, with a \ at the end. +
delete If set, remove all files in the clipboard that match +"SCRAP.*". + +
+ +
This function does the chore of determining where the clipboard +directory is and, optionally, removing any SCRAP files that are +already there. +
  +
If the clipboard directory is either unset or points to a bad +location, then path will be set to either C:\CLIPBRD\ or, if +there is no C: drive, A:\CLIPBRD\. If no CLIPBRD folder exists, then +it is created by the function. +
  +
Example: +
  +
int16_t fhand;
+int8_t path[120], text[]="Hi there!";
+
+if( x_scrp_get( path, 1 ) )
+{
+  strcat( path, "SCRAP.TXT" );
+  if( (fhand = Fcreate( path, 0 )) > 0 )
+  {
+    Fwrite( fhand, sizeof(text), text );
+    Fclose(fhand);
+  }
+}
+
+
Return value: 0 = Failure +
1 = Success +
  +
Availability: The function is only available under Geneva since Release 004. +
  +
Group: Scrap library +
  +
See also: Binding   scrp_write   scrp_read   Data exchange via the GEM clipboard +
  + +
+ +

8.14.4.1 Bindings for x_scrp_get

+ + + + + + + + + +
C: int16_t x_scrp_get( int8_t *path, int16_t delete ); +
  +
Binding: +
  +
int16_t x_scrp_get( int8_t *path, int16_t delete )
+{
+   int_in[0] = delete;
+
+   addr_in[0] = path;
+
+   crys_if(29024);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]29024 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]delete
addr_inaddr_in[0]path
int_outint_out[0]Return value
+
+ + +
+ +
+ +Home +AESAES +Graphics libraryGraphics library +List boxesList boxes + + diff --git a/en/shel.html b/en/shel.html new file mode 100644 index 000000000..e26c0d338 --- /dev/null +++ b/en/shel.html @@ -0,0 +1,2578 @@ + + + + + +The documentation for TOS: Shell library + + + + + + + + + +Home +AESAES +Resource libraryResource library +Extended graphics libraryExtended graphics library + +
+ +

8.22 Shell library

+

This library contains functions to read information from the +program environment (such as the GEM desktop and similar +applications), or to write them; in addition they can take on the +launch of other GEM programs. The following routines are available +for this: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
shel_envrn Obtains value of environment variable +
shel_find Searches for a file +
shel_get Reads from the environment buffer +
shel_help Outputs Help-texts +
shel_put Writes to the environment buffer +
shel_rdef Inquires the default program +
shel_read Reads command line parameters +
shel_wdef Sets the default program +
shel_write Launches application +
x_shel_get Read information from GENEVA.CNF +
x_shel_put Write information to GENEVA.CNF + +
+ +

Note: Here special merit has been earned by shel_write, +which as of AES Version 4.0 (or MagiC 3) has made many other useful +things available, such as Shutdown of the system, resolution changes, +AES broadcasting etc. +

+

See also: About the AES   Style guidelines +

+

8.22.1 shel_envrn

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Shell environment« - Obtains value of environmental +variables. +
  +
Opcode: 125 +
  +
Syntax: int16_t shel_envrn ( int8_t **sh_epvalue, int8_t *sh_eparm ); +
  +
Description: The call shel_envrn searches the current environment string to +find the value of a specific environmental variable of the AES. The +following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
sh_epvalue After the call contains the value of the corresponding variable +
sh_eparm Name of the environmental variable + +
+ +
Example: If the current environment is, say: +'PATH=C:\;D:\;E:\' then calling shel_envrn with sh_eparm +pointing to the string 'PATH=' would set the pointer pointed to by +sh_epvalue to the start of the string 'C:\;D:\;E:\'. Note that +the character string pointed to by sh_eparm should include the +name of the variable and the 'equals' sign. +
  +
Note: To change the AES environment, one should hook +into the exec_os vector, which is also used to launch GEM. In the +called routine, the basepage pointer lies on the stack (as in a +program). In this basepage one can then simply enter a pointer to the +new environment. +
  +
But a word of warning: In AES versions lower than 1.4, only +the first 50 bytes will be adopted; also these only accept semicolons +as separators between multiple 'PATH=' arguments, while later versions +accept commas as well. +
  +
Another tip: If the pointer returned for 'PATH=' points +to a NULLbyte, one should increase it by the value 1 to get the +correct result. +
  +
Return value: The function always returns a value of 1. +
  +
Availability: All AES versions. +
  +
Group: Shell library +
  +
See also: Binding +
  + +
+ +

8.22.1.1 Bindings for shel_envrn

+ + + + + + + + + +
C: int16_t shel_envrn ( int8_t **sh_epvalue, int8_t *sh_eparm ); +
  +
Binding: +
  +
int16_t shel_envrn (int8_t **sh_epvalue, int8_t *sh_eparm)
+{
+   addr_in[0] = sh_epvalue;
+   addr_in[1] = sh_eparm;
+
+   return ( crys_if(125) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]125 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]sh_epvalue
addr_inaddr_in[1]sh_eparm
int_outint_out[0]Return value
+
+ + +
+ +

8.22.2 shel_find

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Shell find« - Find a file. +
  +
Opcode: 124 +
  +
Syntax: int16_t shel_find ( int8_t *sh_fpbuff ); +
  +
Description: The call shel_find searches for a file in certain directories. +The parameter sh_fpbuff contains the name of the file searched +for. On returning from the call, the full access path to the file will +be stored in this buffer, which should be at least 128 characters +long. +
  +
Note: The file will be searched for in the following +directories: +
  +
    +
  • In the current directory +
  • +
  • In the root directory +
  • +
  • In all directories specified in the environmental variable +'PATH' of the AES +
  • +
  • In the path of the calling application (as of TOS version +1.04) +
  • +
+ +
The function is also used by rsrc_load to localize the resource +file. +
  +
Return value: A value of 0 signals that the specified file was not found. +
  +
Availability: All AES versions. +
  +
Group: Shell library +
  +
See also: Binding   shel_envrn +
  + +
+ +

8.22.2.1 Bindings for shel_find

+ + + + + + + + + +
C: int16_t shel_find ( int8_t *sh_fpbuff ); +
  +
Binding: +
  +
int16_t shel_find (int8_t *sh_fpbuff)
+{
+   addr_in[0] = sh_fpbuff;
+   return ( crys_if(124) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]124 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]sh_fpbuff
int_outint_out[0]Return value
+
+ + +
+ +

8.22.3 shel_get

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Shell get« - Read from the GEM environment buffer. +
  +
Opcode: 122 +
  +
Syntax: int16_t shel_get ( int8_t *sh_gaddr, uint16_t sh_glen ); +
  +
Description: The call shel_get serves for reading characters from the +internal environment storage buffer of the AES. The following +apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
sh_gaddr Address of the destination memory store +
sh_glen Number of bytes to be read, or the value -1 to obtain the +length of the memory store + +
+ +
Note: The desktop uses this buffer to store the +DESKTOP.INF or NEWDESK.INF file. Although the format of these files is +not officially documented, a current description can be found +in newdesk.hyp. +
  +
Under MagiC, at the start of the AES all data are copied into +the buffer that lies after the line '#_CTR' in MAGX.INF. Since MagiC +3, the permissible length of the buffer lies between 4192 and 65534 +bytes. The presence of the additional features can be ascertained with +a call of appl_getinfo (opcode 6). +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: All AES versions. +
  +
Group: Shell library +
  +
See also: Binding   shel_put +
  + +
+ +

8.22.3.1 Bindings for shel_get

+ + + + + + + + + +
C: int16_t shel_get ( int8_t *sh_gaddr, uint16_t sh_glen ); +
  +
Binding: +
  +
int16_t shel_get (int8_t *sh_gaddr, uint16_t sh_glen)
+{
+   int_in[0]  = sh_glen;
+   addr_in[0] = sh_gaddr;
+
+   return ( crys_if(122) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]122 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]sh_glen
addr_inaddr_in[0]sh_gaddr
int_outint_out[0]Return value
+
+ + +
+ +

8.22.4 shel_help

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Shell help« - Output of Help-texts. +
  +
Opcode: 128 +
  +
Syntax: int16_t shel_help ( int16_t sh_hmode, int8_t *sh_hfile, int8_t +*sh_hkey); +
  +
Description: The call shel_help serves for outputting Help-texts (online +help) via a help server. +
  + + + + + + + + + + + + +
Parameter Meaning +
  + +
sh_hmode At present always pass SHP_HELP(=0) +
  +
sh_hfile Name of the help file +
  +
If this is passed including an extension, the corresponding +server according to the extension will be searched for in the list of +help servers +
  +
If the passed file has no extension, then that of the first help +server defined in the CNF file will be appended automatically +
  +
sh_hkey Key-word for which a Help-text is to be output, or NULL +
  + +
+ +
At a call of shel_help with a file having an extension, N.AES +checks whether a help server for this extension has been defined (with +'helpserver'). If a suitable server is found, a check is made whether +this is active already (as a desk accessory or application launched in +parallel). If that is the case, then the server is sent the message +VA_START with the arguments specified in sh_hfile and +sh_hkey as a command line. +
  +
If the server is not active, then it will be launched +automatically if a path was specified for it in its definition with +'helpserver'. As a command line the arguments specified in +sh_hfile and sh_hkey will be passed. +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: The presence of this function can be ascertained with a call of +appl_getinfo (opcode 65). +
  +
Besides N.AES, there is a TSR which makes this function +available on other systems as well. +
  +
Group: Shell library +
  +
See also: Binding +
  + +
+ +

8.22.4.1 Bindings for shel_help

+ + + + + + + + + +
C: int16_t shel_help ( int16_t sh_hmode, int8_t *sh_hfile, int8_t +*sh_hkey); +
  +
Binding: +
  +
int16_t shel_help ( int16_t sh_hmode, int8_t *sh_hfile,
+                    int8_t *sh_hkey)
+{
+   int_in[0] = sh_hmode;
+   addr_in[0] = sh_hfile;
+   addr_in[1] = sh_hkey;
+
+   crys_if(128);
+
+   return = int_out[0];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]128 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]sh_hmode
addr_inaddr_in[0]sh_hfile
addr_in+4addr_in[1]sh_hkey
int_outint_out[0]Return value
+
+ + +
+ +

8.22.5 shel_put

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Shell put« - Writes to the GEM environment buffer. +
  +
Opcode: 123 +
  +
Syntax: int16_t shel_put ( int8_t *sh_paddr, uint16_t sh_plen ); +
  +
Description: The call shel_put copies information to the environment shell +buffer of the AES. The following apply: +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
sh_paddrAddress of source buffer (in user memory)
sh_plenNumber of characters to be written
+
+ +
Note: The desktop uses this buffer to store the +DESKTOP.INF or NEWDESK.INF file. Although the format of these files is +not officially documented, a current description can be found +in newdesk.hyp. +
  +
The permissible length of the buffer lies since MagiC 3 between +4192 and 65534 bytes, while in very old TOS versions it was +restricted to 1024 bytes. +
  +
Prior to AES version 4.0 this function would only copy as +many bytes as would fit into the current buffer. As of version 4.0, +the AES will dynamically allocate more memory as needed (up to +32767 bytes) for the shell buffer. +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: All AES versions. +
  +
Group: Shell library +
  +
See also: Binding   shel_get   shel_envrn   shel_find +
  + +
+ +

8.22.5.1 Bindings for shel_put

+ + + + + + + + + +
C: int16_t shel_put ( int8_t *sh_paddr, uint16_t sh_plen ); +
  +
Binding: +
  +
int16_t shel_put (int8_t *sh_paddr, uint16_t sh_plen)
+{
+   int_in[0]  = sh_plen;
+   addr_in[0] = sh_paddr;
+
+   return ( crys_if(123) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]123 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]sh_plen
addr_inaddr_in[0]sh_paddr
int_outint_out[0]Return value
+
+ + +
+ +

8.22.6 shel_rdef

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Shell read default« - Inquire the default program. +
  +
Opcode: 126 +
  +
Syntax: void shel_rdef ( int8_t *lpcmd, int8_t *lpdir ); +
  +
Description: The call shel_rdef permits inquiring the program to be launched +at the termination of the current one (the desktop, as a rule). The +following apply: +
  + + + + + + + + + +
Parameter Meaning +
  +
lpcmd Pointer to a string of sufficient size to hold the name of the +application +
  +
lpdir Pointer to a string of sufficient size to hold the path of the +application +
  + +
+ +
Return value: The function does not return a result. +
  +
The binding form N.AES have a return value. If successful it +return 1, otherwise 0. +
  +
Availability: Under PC-GEM, the function is available as of version 2.0; +otherwise in KAOS 1.4.2, MagiC and N.AES. The presence of this +function can be ascertained with appl_getinfo (opcode 5). +
  +
Group: Shell library +
  +
See also: Binding   shel_wdef   MagiC +
  + +
+ +

8.22.6.1 Bindings for shel_rdef

+ + + + + + + + + +
C: void shel_rdef ( int8_t *lpcmd, int8_t *lpdir ); +
  +
Binding: +
  +
int16_t shel_rdef (int8_t *lpcmd, int8_t *lpdir)
+{
+   addr_in[0] = lpcmd;
+   addr_in[1] = lpdir;
+
+   crys_if(126);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]126 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]lpcmd
addr_in+4addr_in[1]lpdir
+
+ + +
+ +

8.22.7 shel_read

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Shell read« - Read command line parameters of the +application. +
  +
Opcode: 120 +
  +
Syntax: int16_t shel_read ( int8_t *sh_rpcmd, int8_t *sh_rptail ); +
  +
Description: The call shel_read obtains the name and the command line tail +with which an application was launched. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
sh_rpcmd Complete pathname with program name +
sh_rptail Command line (according to Pexec, so NULL-terminated and with +length specified in first byte) + +
+ +
Note: The function only works correctly if the +application was launched with shel_write. In case of doubt, therefore, +one should fall back to the values from the basepage. +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: All AES versions. +
  +
Group: Shell library +
  +
See also: Binding   shel_write   Pexec +
  + +
+ +

8.22.7.1 Bindings for shel_read

+ + + + + + + + + +
C: int16_t shel_read ( int8_t *sh_rpcmd, int8_t *sh_rptail ); +
  +
Binding: +
  +
int16_t shel_read (int8_t *sh_rpcmd, int8_t *sh_rptail)
+{
+   addr_in[0] = sh_rpcmd;
+   addr_in[1] = sh_rptail;
+
+   return ( crys_if(120) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]120 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]sh_rpcmd
addr_in+4addr_in[1]sh_rptail
int_outint_out[0]Return value
+
+ + +
+ +

8.22.8 shel_wdef

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Shell write default« - Set the default program. +
  +
Opcode: 127 +
  +
Syntax: void shel_wdef( int8_t *lpcmd, int8_t *lpdir ); +
  +
Description: The call shel_wdef allows setting the application that is to be +regarded as the default program (normally the desktop). +
  +
Note for MagiC: If the parameters lpcmd and +lpdir are empty strings, then MAGXDESK will be reinstalled. An +alternative desktop simply makes a shel_write call at launch, and then +terminates itself with Pterm0; it receives from MagiC a command line +(SHELTAIL), which can be obtained with shel_read. If the shell returns +a negative error-code, then MAGXDESK will be activated. +
  +
Note for N.AES: If the parameters lpcmd and/or +lpdir are empty strings or NULL, then the 'shell' application +specified in N_AES.CNF will be launched. +
  +
Return value: The function does not return a result. +
  +
The binding form N.AES have a return value, which is always 1. +
  +
Availability: Under PC-GEM, the function is available as of version 2.0; +otherwise in KAOS 1.4.2, MagiC and N.AES. The presence of this +function can be ascertained with appl_getinfo (opcode 5). +
  +
Group: Shell library +
  +
See also: Binding   shel_rdef   MagiC +
  + +
+ +

8.22.8.1 Bindings for shel_wdef

+ + + + + + + + + +
C: void shel_wdef( int8_t *lpcmd, int8_t *lpdir ); +
  +
Binding: +
  +
void shel_wdef(int8_t *lpcmd, int8_t *lpdir)
+{
+   addr_in[0] = lpcmd;
+   addr_in[1] = lpdir;
+
+   crys_if(127);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]127 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]lpcmd
addr_in+4addr_in[1]lpdir
+
+ + +
+ +

8.22.9 shel_write

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Shell write« - Launch another application. +
  +
Opcode: 121 +
  +
Syntax: int16_t shel_write ( int16_t sh_wdoex, int16_t sh_wisgr, +int16_t sh_wiscr, int8_t *sh_wpcmd, int8_t *sh_wptail ); +
  +
Description: The call shel_write permits launching another program. As of +AES version 4.0 this function was expanded greatly, so now one can +also perform tasks such as the Shutdown of the system, changing screen +resolution, AES broadcasting and a number of other functions. +
  +
The parameter sh_wdoex determines the action to be +performed, the remaining parameters depend in essence on +sh_wdoex. The following apply: +
  + + + + + + + + + + + + + + + + + + +
sh_wdoex Meaning +
    +
0 Launch application +
The value of the parameter sh_wisgr (launch in graphic +mode, yes/no) is set automatically by the AES, by comparing the +file extension with the contents of AES environmental variables +GEMEXT, TOSEXT and ACCEXT +
1 Launch application im GEM/TOS mode +
The parameter sh_wisgr sets the mode in which the program +is to be launched; the following apply: + + + + + + +
sh_wisgr = 0: Launch as TOS program +
sh_wisgr = 1: Launch as GEM program + +
+ +
2 Reserved +
3 Start accessory +
A program is to be launched as a desk accessory + +
+ +
In the parameters sh_wpcmd and sh_wptail one +should pass the filename of the program to be launched and a pointer +to the command line tail respectively. The default directory will be +chosen as the directory that contains the program to be launched +(Exception: extended mode with bit 10 set - see below). +
  +
The function returns the AES ID of the launched process. A +value of 0 in this connection denotes that an error has occurred. With +the parameter sh_wiscr one can specify whether parameters +via ARGV should be passed to the launched program. The following +apply: +
  +
sh_wiscr = 0: Do not use ARGV procedure +
sh_wiscr = 1: Use ARGV procedure +
  + +
Under MagiC, on the other hand, one can specify whether a +program is to be started in single-mode (or in parallel). The +following apply: +
  +
sh_wiscr = 100: Execute program in parallel +
The new application inherits all standard paths and files from the +current application. An error-code is returned only in case of memory +shortage during the installation; a notification at the termination of +the new application (death-of-child) does not exist (*). +
  + +
sh_wiscr = 101: Execute program in single-mode +
This mode corresponds to sh_wiscr with the value 1, except +that before the program is called all applications apart from those +with ID 0 and ID 1 (SCRENMGR) are frozen. Those applications will be +thawed out again at the termination of the program, as long as that +does not make a new shel_write call of a single-mode character. +The exact recipe for the single-mode is: +
  +
    +
  • Ensure that I am application #0 (i.e. ap_id == 0) +
  • +
  • Set paths and drive for the new program +
  • +
  • shel_write (TRUE, sh_wisgr, 101, sh_wpcmd, sh_wptail) +
  • +
  • All important settings to temporary file or shell-buffer +
  • +
  • appl_exit, v_clsvwk, Pterm0 execute +
  • +
+ +
One should also note that as of MagiC 2, in single-mode the +current paths of the caller are passed to the parent and with that to +the new program. The caller's paths are destroyed subsequently, though +this is not critical as the program will normally follow shel_write +with a Pterm call (*). +
  +
In extended mode one can further specify the launching +of programs via the special bits of the parameter sh_wdoex. +The low byte stays untouched here, and for the high byte the following +apply: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
sh_wdoex bitMeaning
8Value of Psetlimit is valid
9Value of Prenice is valid
10Default directory is valid
11Environment string is valid
12User id is valid
13Group id is valid
14Reserved
15Reserved (but see XSHD_FLAGS below)
+
+ +
In this extended mode, the parameter sh_wpcmd is taken +as a pointer to a SHELW structure. Each of the above-named bits is +assigned a member of that structure which is valid when the +corresponding bit is set. The set of values is allocated as follows: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Element Meaning +
    +
[0] Pointer to the name of the program. This must always be set. +
[1] Value of Psetlimit (bit 8) +
[2] Value of Prenice (bit 9) +
[3] Pointer to the default directory; a NULL-pointer in this +connection means that the directory in which the program to be +launched lies is selected as the default directory (bit 10) +
[4] Pointer to the environment of the application (bit 11) +
[5] New user id of the application (bit 12) +
[6] New group id of the application (bit 13) + +
+ +
Note: The elements [1], [2] and [3] are ignored up to +MagiC 3; element [1] however is supported from MagiC 4 onwards. The +default directory is set much simpler under MagiC, as the new program +inherits all paths on all drives from the calling program. Geneva can +only set bit 8. +
  +
Note: In MagiC 6, the user id and group id fields have a +different meaning. +
  +
In newer AES versions the following additional modes are +available: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
sh_wdoex Meaning +
  + +
4 Set Shutdown mode +
This command puts the system into the normal or Shutdown mode, +depending on the parameter sh_wiscr. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + +
sh_wiscr Meaning +
    +
-1 AES call a small program to select shutdown options. +
Since MyAES 0.96 + +
 0 Terminate Shutdown sequence +
A started Shutdown can only be terminated by that process that +also started this sequence + +
 1 Partial Shutdown +
With the exception of the caller, all applications are checked by +the AES on whether they understand the message AP_TERM; if this is +the case, then the AES sends the messages AP_TERM or AC_CLOSE to the +programs or accessories. The caller receives none of these messages. + +
 2 Complete Shutdown +
With the exception of the caller, all applications and accessories +are checked by the AES on whether they understand the message +AP_TERM; if this is the case, then the AES sends the messages +AP_TERM or AC_CLOSE to the programs or accessories. Accessories receive +the AP_TERM message also after the receipt of the AC_CLOSE message. The +caller receives none of these messages. +
 3 Cold reboot +
Since MyAES 0.96. + +
+ +
In N.AES there is an extended call: +
shel_write(4, shutart, 0, &ignorant, NULL); +
  +
ignorant is here an integer whose address is passed as +the fourth parameter of the shel_write call. In case of error the +return value of the function shel_write is 0 as before, but in +addition, ignorant will hold the apid (application ID) of the +application that has not understood AP_TERM, or -1 if a Shutdown is +already running, or -2 if invalid parameters were passed. +
  + +
5 Resolution change +
The application invites the AES to change the resolution. If +the AES agrees to the change, it attempts to close down the system +(Shutdown). Any active applications can now either terminate +themselves, or tell the AES with an AP_TFAIL message that they are +not in a position to do so. The parameters sh_wisgr and +sh_wiscr are dependent on one another. The following apply: +
  + + + + + + + + + + + + + + + +
sh_wiscr Meaning +
    +
0 The parameter sh_wisgr is the ID of the physical device +on which the 'Open workstation' call of the VDI is executed. The +current physical device number can be obtained with Getrez + 2 as +usual; the following values are available: +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
2=ST-Low(320*200)
3=ST-Medium(640*200)
4=ST-High(640*400)
6=TT-Medium(640*480)
8=TT-High(1280*960)
9=TT-Low(320*480)
+
+ +
1 The parameter sh_wisgr is the int16_t for the video +mode of the Falcon030 +
>2 Reserved for future purposes + +
+ +
In N.AES there is an extended call: +
shel_write(5, vmode, falconflag, &ignorant, NULL); +
As a resolution change always first starts a complete Shutdown +internally, it could be that here too not all applications understand +AP_TERM and so the resolution change fails prematurely. Similar to the +Mode 4 extension mentioned above, here too the application ID of a +non-understander will be held in ignorant, or a -1 if a Shutdown +is running already, or -2 if a faulty parameter (e.g. an invalid +resolution) was passed. +
  +
6 unknown +
  + + +
7 AES broadcasting +
The application would like to send a message to all other +applications present in the system. Excepted from receipt are only the +AES, the screen-manager, as well as the sender of the message itself. +
  +
The parameter sh_wpcmd is a pointer to a 16-byte sized +message buffer that contains the data to be sent. +
  + + +
8 Manipulation of the AES environment +
This command permits the modification of the AES environment. +The parameter sh_wisgr describes the desired action. The +following apply: +
  + + + + + + + + + + + + + + + +
sh_wisgr Meaning +
    +
0 Get size of environment buffer This is returned as the +function result +
1 Insertion/Removal of strings The parameter +sh_wpcmd is a pointer to the environment string. The syntax +for insertion or removal runs: 'NEW=STRING\0' or NEW=\0'. +
2 Copy contents of the environment buffer +
The parameter sh_wpcmd is a pointer to the receiving +buffer, which has a size of sh_wiscr bytes. The function +returns the number of bytes that could not be copied. + +
+ +
9 Show supported messages +
The application tells the AES, which (new) messages are +understood. This happens via the set bits of the parameter +sh_wisgr. +
  + + + + + + + +
Bit 0: AP_TERM +
Bit 1: NM_INHIBIT_HIDE (as of XaAES 2005-01-16) +
Prevents the application from being hidden. Useful for some +'desktop' utilities like Taskbar. + +
+ +
All other bits (2-15) are not defined at present. +
  +
10 Send message to the AES +
The application wants to send a message to the AES. The +parameter sh_wpcmd is a pointer to a 16-byte sized message +buffer. +
  +
+
Geneva
+
+

A program can cause a windowed dialog to scroll by sending a +WM_ARROWED message to Geneva. Example: +
  +

int16_t msg[8];
+
+msg[0] = WM_ARROWED;
+msg[3] = window_handle;
+msg[4] = WA_UPPAGE;
+shel_write( SWM_AESMSG, 0, 0,
+            (int8_t *)msg, 0L );
+
+

+ +
+
N.AES
+
+

N.AES can be terminated and return to a text shell. +
  +

/*
+ * Trigger a system shutdown, after
+ * a successfully "normal" shutdown:
+ */
+
+#define AP_AESTERM    52
+
+void TerminateNAES(void)
+{
+    int     msg[8];
+    msg[0] = AP_AESTERM;
+    shel_write(SWM_AESMSG, 0, 0, (char *)msg, NULL);
+}
+
+

+ +
+
+ +
20 Create new thread +
With this opcode the application can create a new thread. The +following apply: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
sh_wisgr + + + + + + + + + +
0 = Launch program in VT52 window of the application, if one is +open +
1 = Don't open a new window +
2 = Open a new VT52 window + +
+ +
sh_wiscr 0 +
sh_wpcmd Pointer to THREADINFO structure +
sh_wptail Parameter of type (void *) for the Thread function + +
+ +
With a successful call the application ID of the new thread will +be returned (*). +
  + +
21 End thread +
With this opcode a thread can end itself. For this one sets the +parameters of sh_wisgr, sh_wiscr and sh_wptail +to the values 0 or NULL; with sh_wpcmd one can specify an +error-code to be returned. +
  +
Normally an execution of this function is not necessary, since +the thread ends itself automatically at the end of its procedure (i.e. +with the CPU command RTS). Important: If the thread has made a +Pexec call, then the running process must first be terminated with +Pterm, before the thread can end itself (*). +
  +
22 Terminate thread +
With this opcode a thread can also be ended by the main program. +For this one passes in the parameter sh_wiscr the +application's ID of the thread, and sets the remaining parameters to +the value 0 or NULL. +
  +
Normally this function is not necessary, as with the termination +of the main program all associated threads are ended as well. The +function was executed successfully when the value 1 is returned as a +result. One should note, however, that if in the meantime the thread +has performed a Pexec, only that program will be terminated with Pterm +(EBREAK); the thread itself is only ended when the caller has received +a THR_EXIT (*). +
  + +
224 Run an application (Geneva as of Release 004) +
Run an application, letting Geneva determine the type; this is +identical to mode 0, except that the XSHD_FLAGS bit of sw_doex +can also be set (see below) +
  + +
225 Run an application (Geneva as of Release 004) +
This is identical to mode 1, except that the XSHD_FLAGS bit of +sw_doex can also be set. +
  + +
227 Run a desk accessory. (Geneva as of Release 004) +
This is identical to mode 3, except that the XSHD_FLAGS bit of +sw_doex can also be set. +
  +
When XSHD_FLAGS (1<<15) is added to sw_doex, this +means that the last LONGword of the SHWRCMD passed in the +sh_wpcmd parameter contains the Geneva program flags to use +when executing the application. It is strongly recommended that a +program using XSHD_FLAGS inquire the current flags for the application +and only change the ones it needs to change, rather than making most +of the flags zero or some other random value. See the x_appl_flags +section for an example. +
  + +
+ +
Note: As of MagiC 3, the following specialities are +available: +
  +
    +
  • If a character string is passed in sh_wptail that +starts with the value 255 and is terminated with '\0', the actual +length of the command line is determined by the AES and passed at +full length to the DOS. DOS constructs from this an ARGV parameter in +the environment. If the command line is shorter than 127 bytes, it is +passed via the basepage and with shel_read, else it consists only of +the byte with the value 127. +
      +

  • +
  • If a character string is passed in sh_wptail that +starts with the value 254, then the AES expects after this a +character string 'ARGV=something' and a '\0'-separated and with +'\0\0'-terminated list of parameters. This is passed completely to the +DOS, which constructs an ARGV parameter from this. If the command line +is shorter than 127 bytes, it is passed via the basepage and with +shel_read, where the NULLbytes are replaced with spaces, else it consists +only of the byte with the value 127. +
      +

  • +
+ +
The presence of the additional features can be inquired with +appl_getinfo (opcode 10). +
  +
The shel_write opcodes marked with (*) are at present available +only in MagiC. +
  + +
Warning: If one launches a new AES process under +Single- TOS with shel_write, then this will be launched only after the +termination of the running process. +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: All AES versions. +
  +
Group: Shell library +
  +
See also: Binding   Shutdown mechanism   Threads in MagiC +
  + +
+ +

8.22.9.1 Bindings for shel_write

+ + + + + + + + + +
C: int16_t shel_write ( int16_t sh_wdoex, int16_t sh_wisgr, +int16_t sh_wiscr, int8_t *sh_wpcmd, int8_t *sh_wptail ); +
  +
Binding: +
  +
int16_t shel_write (int16_t sh_wdoex, int16_t sh_wisgr,
+                    int16_t sh_wiscr, int8_t *sh_wpcmd,
+                    int8_t *sh_wptail)
+{
+   int_in[0]  = sh_wdoex;
+   int_in[1]  = sh_wisgr;
+   int_in[2]  = sh_wiscr;
+   addr_in[0] = sh_wpcmd;
+   addr_in[1] = sh_wptail;
+
+   return ( crys_if(121) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]121 # Function opcode
control+2control[1]3 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]sh_wdoex
int_in+2int_in[1]sh_wisgr
int_in+4int_in[2]sh_wiscr
addr_inaddr_in[0]sh_wpcmd
addr_in+4addr_in[1]sh_wptail
int_outint_out[0]Return value
+
+ + +
+ +

8.22.10 x_shel_get

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Shell get« - Read information from GENEVA.CNF. +
  +
Opcode: 29057 +
  +
Syntax: int16_t x_shel_get ( int16_t mode, int16_t length, int8_t *buf +); +
  +
Description: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
mode + + + + + + + + + + + + + + + + +
-1 Re-read Geneva's settings +
 0 Open GENEVA.CNF +
 1 Read a line +
 2 Close GENEVA.CNF + +
+ +
length Number of bytes to read into buf. +
buf Product string (mode 0) or buffer to read length bytes +of data into (mode 1). + +
+ +
This function will cause Geneva to either re-read all of its own +internal settings, or read the settings from an outside program's +portion of GENEVA.CNF. +
  +
When mode is X_SHLOADSAVE (-1), Geneva will re-read all of its +internal settings. The length and buf parameters are not used in this +mode. The Task Manager's "Load Settings" option uses this. +
  +
In order to read its own settings, a program must begin by using +mode X_SHOPEN (0) to open GENEVA.CNF. The name passed in buf can +contain any character (including uppercase and punctuation) except the +[ or ] characters. The length parameter is not used in this mode. +
  +
If the X_SHOPEN was successful, the program can then make +repeated calls using the X_SHACCESS (1) mode. Here, length specifies +the maximum number of bytes to read into the string buffer buf. The +x_sscanf function is very helpful for retreiving formatted data that +has been read with x_shel_get. +
  +
If an error occurs at any time during the open or read phases +(or if the program's section of GENEVA.CNF ends), the file is +automatically closed. If a program wants to end the reading sooner, it +must use mode X_SHCLOSE (2) to close the file. Otherwise, any future +attempts to read from the file will fail. +
  +
Example: +
  +
int sh_error( int err )
+{
+  switch(err) {
+     case -2:
+       Cconws( "Disk error" );
+     return 1;
+     case -1:
+       Cconws( "GENEVA.CNF is already in use by another program" );
+     return 1;
+     case 0:
+       Cconws( "Read failed unexpectedly" );
+     return 1;
+     default:
+     return 0;
+  }
+}
+
+main() {
+  char buffer[100];
+  int version, number1, number2;
+
+  if( !sh_error( x_shel_get(X_SHOPEN,0,"My Program") ) )
+     if( !sh_error( x_shel_get(X_SHACCESS,sizeof(buffer),buffer) ) )
+     {
+       x_sscanf( buffer, "%v", &version );
+       if( version != 0x200 ) {
+          Cconws( "Not compatible with version 2.0!" );
+          x_shel_get( X_SHCLOSE, 0, 0L );
+          return;
+       }
+       if( !sh_error( x_shel_get(X_SHACCESS,sizeof(buffer),
+          buffer) ) )
+       x_sscanf( buffer, "%x %d", number1, number2 );
+       x_shel_get( X_SHCLOSE, 0, 0L );
+     }
+}
+
+
Return value: +
  + + + + + + + + + + + + + + + +
-3 Incorrect GENEVA.CNF version (mode -1) +
-2 Disk error +
-1 Already in use (mode 0) +
 0 End of data or string not found +
 1 No error + +
+ +
Availability: The function is only available under Geneva. +
  +
Group: Shell library +
  +
See also: Binding +
  + +
+ +

8.22.10.1 Bindings for x_shel_get

+ + + + + + + + + +
C: int16_t x_shel_get ( int16_t mode, int16_t length, int8_t *buf +); +
  +
Binding: +
  +
int16_t x_shel_get ( int16_t mode, int16_t length, int8_t *buf
+)
+{
+   int_in[0] = mode;
+   int_in[1] = length;
+   addr_in[0] = buf;
+
+   crys_if(29057);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]29057 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]mode
int_in+2int_in[1]length
addr_inaddr_in[0]buf
int_outint_out[0]Return value
+
+ + +
+ +

8.22.11 x_shel_put

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Shell put« - Save a program's own settings, or Geneva's +settings, to GENEVA.CNF. +
  +
Opcode: 29058 +
  +
Syntax: int16_t x_shel_put ( int16_t mode, int8_t *buf ); +
  +
Description: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
mode + + + + + + + + + + + + +
-1 Save Geneva's settings +
 0 Write a line +
 1 Read a line +
 2 Close GENEVA.CNF + +
+ +
buf Null-terminated string to write + +
+ +
When mode is X_SHLOADSAVE (-1), Geneva will save all of its +internal settings. The length and buf parameters are not used in this +mode. +
  +
The Task Manager's Save Settings option uses this. +
  +
In order to save its own settings, a program must begin by using +mode X_SHOPEN (0) to open GENEVA.CNF. The name passed in buf can +contain any character (including uppercase and punctuation) except the +[ or ] characterli The length parameter is not used in this mode. +
  +
If the X_SHOPEN was successful, the program can then make +repeated calls using the X_SHACCESS (1) mode. Here, buf points to a +null-terminated string to write. The string should be no more than 80 +characters of readable text, and must not include the [ or ] +characters. If the firss character of the string is a semi-colon +";", it will be treated as a comment when read by +x_shel_get. The x_sprintf function is very helpful for formatting data +for x_shel_put; +
  +
If an error occurs at any time during the open or write phases +the file is automatically closed. If no errors occur, the program must +use mode X_SHCLOSE (2) to close the file. Otherwise, any future +attempts to write to the file will fail. +
  +
Return value: +
  + + + + + + + + + + + + +
-2 Disk error +
-1 Already in use (mode 0) +
 0 File not open or incorrect mode +
 1 No error + +
+ +
Availability: The function is only available under Geneva. +
  +
Group: Shell library +
  +
See also: Binding +
  + +
+ +

8.22.11.1 Bindings for x_shel_put

+ + + + + + + + + +
C: int16_t x_shel_put ( int16_t mode, int8_t *buf ); +
  +
Binding: +
  +
int16_t x_shel_put ( int16_t mode, int8_t *buf )
+{
+   int_in[0] = mode;
+   addr_in[0] = buf;
+
+   crys_if(29058);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]29058 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]mode
addr_inaddr_in[0]buf
int_outint_out[0]Return value
+
+ + +
+ +
+ +Home +AESAES +Resource libraryResource library +Extended graphics libraryExtended graphics library + + diff --git a/en/tc_vdi.html b/en/tc_vdi.html new file mode 100644 index 000000000..08fcceaf1 --- /dev/null +++ b/en/tc_vdi.html @@ -0,0 +1,2491 @@ + + + + + +The documentation for TOS: TC-VDI functions + + + + + + + + + +Home +VDIVDI +Raster functionsRaster functions +VDI functions listVDI functions list + +
+ +

7.12 TC-VDI functions

+

This library contains a multitude of functions to manage true +color on the MATRIX graphic boards. In all, the following routines are +available in TC-VDI 0.7: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
vq_calibrate Tests colour calibration +
vq_colors Gets a palette sequence +
vq_pixcol Gets pixel +
vq_pixrgb Gets pixel rgb color +
vrf_rgb Gets fill color values +
vrl_rgb Gets line color values +
vrt_rgb Gets text color values +
vrun_parallel Parallelogram color runs +
vrun_rect Rectangle color runs +
vrun_triangle Triangle color runs +
vs_calibrate Sets colour calibration +
vs_colors Sets a palette sequence +
vs_pixcol Sets pixel through soft palette +
vs_pixrgb Sets pixel rgb color +
vsf_rgb Sets fill color values +
vsl_rgb Sets line color values +
vst_rgb Sets text color values + +
+ +

See also: MATRIX XBIOS extension +

+

7.12.1 vq_colors

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire colors« - Obtain the RGB values of a colour palette. +
  +
Opcode: 65 +
  +
Syntax: void vq_colors ( int16_t handle, int16_t from, int16_t to, +int16_t set_flag, int16_t *rgb_table ); +
  +
Description: The call vq_colors obtains the RGB values starting from the +colour index from to the colour index to. The +resulting values are stored in rgb_table. +
  +
Return value: The function does not return a result. +
  +
Availability: Available only with MATRIX drivers in TC mode. +
  +
Group: TC-VDI functions +
  +
See also: Binding   vs_colors +
  + +
+ +

7.12.2 Bindings for vq_colors

+ + + + + + + + + +
C: void vq_colors ( int16_t handle, int16_t from, int16t_to, +int16_t set_flag, int16_t *rgb_table ); +
  +
Binding: +
  +
void vq_colors (int16_t handle, int16_t from, int16_t to, int16_t set_flag,
+                int16_t *rgb_table)
+{
+   intin[0]    = from;
+   intin[1]    = to;
+   intin[2]    = set_flag;
+   intin[3..4] = rgb_table;
+
+   contrl[0] = 65;
+   contrl[1] = 0;
+   contrl[3] = 5;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]65 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]5 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+12contrl[6]handle
intinintin[0]from
intin+2intin[1]to
intin+4intin[2]set_flag
intin+6intin[3..4]rgb_table
+
+ + +
+ +

7.12.3 vq_pixcol

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire pixel colour index« - Obtain the index of a pixel. +
  +
Opcode: 58 +
  +
Syntax: void vq_pixcol ( int16_t handle, int16_t x, int16_t y, int16_t +*phys_ix, int16_t *vdi_ix ); +
  +
Description: The call vq_pixcol obtains the physical and VDI indexes of the +pixel at the given coordinates. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
x X-coordinate +
y Y-coordinate +
phys_ix Color index +
vdi_ix VDI color index + +
+ +
Return value: The function does not return a result. +
  +
Availability: Available only with MATRIX drivers in TC mode. +
  +
Group: TC-VDI functions +
  +
See also: Binding   vs_pixcol +
  + +
+ +

7.12.4 Bindings for vq_pixcol

+ + + + + + + + + +
C: void vq_pixcol ( int16_t handle, int16_t x, int16t_y, int16_t +*phys_ix, int16_t *vdi_ix ); +
  +
Binding: +
  +
void vq_pixcol (int16_t handle, int16_t x, int16_t y, int16_t *phys_ix, int16_t *vdi_ix)
+{
+   ptsin[0] = x;
+   ptsin[1] = y;
+
+   contrl[0] = 58;
+   contrl[1] = 1;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *phys_ix = intout[0];
+   *vdi_ix  = intout[1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]58 # Function Opcode
contrl+2contrl[1]1 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]2 # Entry in intout
contrl+12contrl[6]handle
ptsinptsin[0]x
ptsin+2ptsin[1]y
intoutintout[0]phys_ix
intout+2intout[1]vdi_ix
+
+ + +
+ +

7.12.5 vq_pixrgb

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire pixel colour representation« - Obtain the RGB +intensities of a pixel. +
  +
Opcode: 60 +
  +
Syntax: void vq_pixrgb ( int16_t handle, int16_t x, int16_t y, int16_t +*rgb ); +
  +
Description: The call vq_pixrgb obtains the RGB colour intensities of the +pixel at the given coordinates. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
x X-coordinate +
y Y-coordinate +
rgb[0] Red colour intensity (in tenths of a percent, 0-1000) +
rgb[1] Green colour intensity (in tenths of a percent, 0-1000) +
rgb[2] Blue colour intensity (in tenths of a percent, 0-1000) + +
+ +
Return value: The function does not return a result. +
  +
Availability: Available only with MATRIX drivers in TC mode. +
  +
Group: TC-VDI functions +
  +
See also: Binding   vs_pixrgb +
  + +
+ +

7.12.6 Bindings for vq_pixrgb

+ + + + + + + + + +
C: void vq_pixrgb ( int16_t handle, int16_t x, int16t_y, int16_t +*rgb ); +
  +
Binding: +
  +
void vq_pixrgb (int16_t handle, int16_t x, int16_t y, int16_t *rgb)
+{
+   ptsin[0] = x;
+   ptsin[1] = y;
+
+   contrl[0] = 60;
+   contrl[1] = 1;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   rgb[0] = intout[0];
+   rgb[1] = intout[1];
+   rgb[2] = intout[2];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]60 # Function Opcode
contrl+2contrl[1]1 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]3 # Entry in intout
contrl+12contrl[6]handle
ptsinptsin[0]x
ptsin+2ptsin[1]y
intoutintout[0..2]rgb[0..2]
+
+ + +
+ +

7.12.7 vrf_rgb

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire fill colour representation« - Obtain the RGB +intensities for the colour with which a 2-dimensional graphic object +is filled. +
  +
Opcode: 54 +
  +
Syntax: void vrf_rgb ( int16_t handle, int16_t *rgb ); +
  +
Description: The call vrf_rgb obtains the RGB colour intensities of the fill +colour of 2-dimensional graphic object. The following apply: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
rgb[0] Red colour intensity (in tenths of a percent, 0-1000) +
rgb[1] Green colour intensity (in tenths of a percent, 0-1000) +
rgb[2] Blue colour intensity (in tenths of a percent, 0-1000) + +
+ +
Return value: The function does not return a result. +
  +
Availability: Available only with MATRIX drivers in TC mode. +
  +
Group: TC-VDI functions +
  +
See also: Binding   vrl_rgb   vrt_rgb   vsf_rgb   vsl_rgb   vst_rgb +
  + +
+ +

7.12.8 Bindings for vrf_rgb

+ + + + + + + + + +
C: void vrf_rgb ( int16_t handle, int16_t *rgb ); +
  +
Binding: +
  +
void vrf_rgb (int16_t handle, int16_t *rgb)
+{
+   contrl[0] = 54;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   rgb[0] = intout[0];
+   rgb[1] = intout[1];
+   rgb[2] = intout[2];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]54 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]3 # Entry in intout
contrl+12contrl[6]handle
intoutintout[0..2]rgb[0..2]
+
+ + +
+ +

7.12.9 vrl_rgb

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire polyline colour representation« - Obtain the RGB +intensities for the line colour. +
  +
Opcode: 56 +
  +
Syntax: void vrl_rgb ( int16_t handle, int16_t *rgb ); +
  +
Description: The call vrl_rgb obtains the RGB colour intensities of the line +colour. The following apply: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
rgb[0] Red colour intensity (in tenths of a percent, 0-1000) +
rgb[1] Green colour intensity (in tenths of a percent, 0-1000) +
rgb[2] Blue colour intensity (in tenths of a percent, 0-1000) + +
+ +
Return value: The function does not return a result. +
  +
Availability: Available only with MATRIX drivers in TC mode. +
  +
Group: TC-VDI functions +
  +
See also: Binding   vrf_rgb   vrt_rgb   vsf_rgb   vsl_rgb   vst_rgb +
  + +
+ +

7.12.10 Bindings for vrl_rgb

+ + + + + + + + + +
C: void vrl_rgb ( int16_t handle, int16_t *rgb ); +
  +
Binding: +
  +
void vrl_rgb (int16_t handle, int16_t *rgb)
+{
+   contrl[0] = 56;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   rgb[0] = intout[0];
+   rgb[1] = intout[1];
+   rgb[2] = intout[2];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]56 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]3 # Entry in intout
contrl+12contrl[6]handle
intoutintout[0..2]rgb[0..2]
+
+ + +
+ +

7.12.11 vrt_rgb

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire graphic text colour representation« - Obtain the RGB +intensities of the text output. +
  +
Opcode: 55 +
  +
Syntax: void vrt_rgb ( int16_t handle, int16_t *rgb ); +
  +
Description: The call vrt_rgb obtains the RGB colour intensities of the +graphic text output. The following apply: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
rgb[0] Red colour intensity (in tenths of a percent, 0-1000) +
rgb[1] Green colour intensity (in tenths of a percent, 0-1000) +
rgb[2] Blue colour intensity (in tenths of a percent, 0-1000) + +
+ +
Return value: The function does not return a result. +
  +
Availability: Available only with MATRIX drivers in TC mode. +
  +
Group: TC-VDI functions +
  +
See also: Binding   vrf_rgb   vrl_rgb   vsf_rgb   vsl_rgb   vst_rgb +
  + +
+ +

7.12.12 Bindings for vrt_rgb

+ + + + + + + + + +
C: void vrt_rgb ( int16_t handle, int16_t *rgb ); +
  +
Binding: +
  +
void vrt_rgb (int16_t handle, int16_t *rgb)
+{
+   contrl[0] = 55;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   rgb[0] = intout[0];
+   rgb[1] = intout[1];
+   rgb[2] = intout[2];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]55 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]3 # Entry in intout
contrl+12contrl[6]handle
intoutintout[0..2]rgb[0..2]
+
+ + +
+ +

7.12.13 vrun_parallel

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Parallelogram color run« - Parallelogram colour run. +
  +
Opcode: 62 +
  +
Syntax: void vrun_parallel ( int16_t handle, int16_t *pts, int16_t +*rgbs ); +
  +
Description: To define the parallelogram only three points are required. The +following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
pts[0] X-coordinate, and +
pts[1] Y-coordinate of a parallelogram corner point +
pts[2] X-coordinate, and +
pts[3] Y-coordinate of a second corner point +
pts[4] X-coordinate, and +
pts[5] Y-coordinate of a third corner point +
rgbs RGB values, one for each corner + +
+ +
Return value: The function does not return a result. +
  +
Availability: Available only with MATRIX drivers in TC mode. +
  +
Group: TC-VDI functions +
  +
See also: Binding   vrun_rect   vrun_triangle +
  + +
+ +

7.12.14 Bindings for vrun_parallel

+ + + + + + + + + +
C: void vrun_parallel ( int16_t handle, int16_t *pts, int16_t +*rgbs ); +
  +
Binding: +
  +
void vrun_parallel (int16_t handle, int16_t *pts, int16_t *rgbs)
+{
+   ptsin[0..5] = pts[0..5];
+
+   intin[0..11] = rgbs[0..11];
+
+   contrl[0] = 62;
+   contrl[1] = 3;
+   contrl[3] = 12;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]62 # Function Opcode
contrl+2contrl[1]3 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]12 # entry in intin
contrl+8contrl[4]0 # entry in intout
contrl+12contrl[6]handle
intinintin[0..11]rgbs[0..11]
ptsinptsin[0..5]pts[0..5]
+
+ + +
+ +

7.12.15 vrun_rect

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Rectangle color run« - Rectangle colour run. +
  +
Opcode: 61 +
  +
Syntax: void vrun_rect ( int16_t handle, int16_t *pts, int16_t *rgbs ); +
  +
Description: The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
pts[0] X-coordinate, and +
pts[1] Y-coordinate of a rectangle corner point +
pts[2] X-coordinate, and +
pts[3] Y-coordinate of the diagonally opposite corner point +
rgbs RGB values, one for each corner + +
+ +
Return value: The function does not return a result. +
  +
Availability: Available only with MATRIX drivers in TC mode. +
  +
Group: TC-VDI functions +
  +
See also: Binding   vrun_parallel   vrun_triangle +
  + +
+ +

7.12.16 Bindings for vrun_rect

+ + + + + + + + + +
C: void vrun_rect ( int16_t handle, int16_t *pts, int16_t *rgbs ); +
  +
Binding: +
  +
void vrun_rect (int16_t handle, int16_t *pts, int16_t *rgbs)
+{
+   ptsin[0..3] = pts[0..3];
+
+   intin[0..11] = rgbs[0..11];
+
+   contrl[0] = 61;
+   contrl[1] = 2;
+   contrl[3] = 12;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]61 # Function Opcode
contrl+2contrl[1]2 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]12 # entry in intin
contrl+8contrl[4]0 # entry in intout
contrl+12contrl[6]handle
intinintin[0..11]rgbs[0..11]
ptsinptsin[0..3]pts[0..3]
+
+ + +
+ +

7.12.17 vrun_triangle

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Triangle color run« - Triangle colour run. +
  +
Opcode: 63 +
  +
Syntax: void vrun_triangle ( int16_t handle, int16_t *pts, int16_t +*rgbs ); +
  +
Description: The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
pts[0] X-coordinate, and +
pts[1] Y-coordinate of a triangle corner point +
pts[2] X-coordinate, and +
pts[3] Y-coordinate of the second corner point +
pts[4] X-coordinate, and +
pts[5] Y-coordinate of the third corner point +
rgbs RGB values, one for each corner point + +
+ +
Return value: The function does not return a result. +
  +
Availability: Available only with MATRIX drivers in TC mode. +
  +
Group: TC-VDI functions +
  +
See also: Binding   vrun_parallel   vrun_rect +
  + +
+ +

7.12.18 Bindings for vrun_triangle

+ + + + + + + + + +
C: void vrun_triangle ( int16_t handle, int16_t *pts, int16_t +*rgbs ); +
  +
Binding: +
  +
void vrun_triangle (int16_t handle, int16_t *pts, int16_t *rgbs)
+{
+   ptsin[0..5] = pts[0..5];
+
+   intin[0..8] = rgbs[0..8];
+
+   contrl[0] = 63;
+   contrl[1] = 3;
+   contrl[3] = 9;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]63 # Function Opcode
contrl+2contrl[1]3 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]9 # entry in intin
contrl+8contrl[4]0 # entry in intout
contrl+12contrl[6]handle
intinintin[0..8]rgbs[0..8]
ptsinptsin[0..5]pts[0..5]
+
+ + +
+ +

7.12.19 vs_colors

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set colors« - Set the RGB value of a colour. +
  +
Opcode: 64 +
  +
Syntax: void vs_colors ( int16_t handle, int16_t from, int16_t to, +int16_t *rgb_table ); +
  +
Description: The call vs_colors sets the RGB values of the palette starting +from the palette index from to the palette index to. +The colour values are stored in rgb_table. +
  +
Return value: The function does not return a result. +
  +
Availability: Available only with MATRIX drivers in TC mode. +
  +
Group: TC-VDI functions +
  +
See also: Binding   vq_colors +
  + +
+ +

7.12.20 Bindings for vs_colors

+ + + + + + + + + +
C: void vs_colors ( int16_t handle, int16_t from, int16_t to, +int16_t *rgb_table ); +
  +
Binding: +
  +
void vs_colors (int16_t handle, int16_t from, int16_t to, int16_t *rgb_table)
+{
+   intin[0]    = from;
+   intin[1]    = to;
+   intin[2..3] = rgb_table;
+
+   contrl[0] = 64;
+   contrl[1] = 0;
+   contrl[3] = 4;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]64 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]4 # entry in intin
contrl+8contrl[4]0 # entry in intout
contrl+12contrl[6]handle
intinintin[0]from
intin+2intin[1]to
intin+4intin[2..3]rgb_table
+
+ + +
+ +

7.12.21 vs_pixcol

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set pixel colour index« - Set the colour index of a pixel. +
  +
Opcode: 57 +
  +
Syntax: void vs_pixcol ( int16_t handle, int16_t x, int16_t y, int16_t +vdi_ix ); +
  +
Description: The call vs_pixcol sets the VDI colour index for the pixel at +the given coordinates. +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
x X-coordinate +
y Y-coordinate +
vdi_ix Requested VDI color index + +
+ +
Return value: The function does not return a result. +
  +
Availability: Available only with MATRIX drivers in TC mode. +
  +
Group: TC-VDI functions +
  +
See also: Binding   vq_pixcol +
  + +
+ +

7.12.22 Bindings for vs_pixcol

+ + + + + + + + + +
C: void vs_pixcol ( int16_t handle, int16_t x, int16_t y, int16_t +vdi_ix ); +
  +
Binding: +
  +
void vs_pixcol (int16_t handle, int16_t x, int16_t y, int16_t vdi_ix)
+{
+   ptsin[0] = x;
+   ptsin[1] = y;
+
+   intin[0] = vdi_ix;
+
+   contrl[0] = 57;
+   contrl[1] = 1;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]57 # Function Opcode
contrl+2contrl[1]1 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]1 # entry in intin
contrl+8contrl[4]0 # entry in intout
contrl+12contrl[6]handle
intinintin[0]vdi_ix
ptsinptsin[0]x
ptsin+2ptsin[1]y
+
+ + +
+ +

7.12.23 vs_pixrgb

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set pixel RGB colour values« - Set the colour of a pixel. +
  +
Opcode: 59 +
  +
Syntax: void vs_pixrgb ( int16_t handle, int16_t x, int16_t y, int16_t +*rgb ); +
  +
Description: The call vs_pixrgb sets the RGB colour for the pixel at the +given coordinates. +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
x X-coordinate +
y Y-coordinate +
rgb Requested pixel RGB color values + +
+ +
Return value: The function does not return a result. +
  +
Availability: Available only with MATRIX drivers in TC mode. +
  +
Group: TC-VDI functions +
  +
See also: Binding   vq_pixrgb +
  + +
+ +

7.12.24 Bindings for vs_pixrgb

+ + + + + + + + + +
C: void vs_pixrgb ( int16_t handle, int16_t x, int16_t y, int16_t +*rgb ); +
  +
Binding: +
  +
void vs_pixrgb (int16_t handle, int16_t x, int16_t y, int16_t *rgb)
+{
+   ptsin[0] = x;
+   ptsin[1] = y;
+
+   intin[0] = *rgb++;
+   intin[1] = *rgb++;
+   intin[2] = *rgb;
+
+   contrl[0] = 59;
+   contrl[1] = 1;
+   contrl[3] = 3;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]59 # Function Opcode
contrl+2contrl[1]1 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]3 # entry in intin
contrl+8contrl[4]0 # entry in intout
contrl+12contrl[6]handle
intinintin[0]rgb[0]
intin+2intin[1]rgb[1]
intin+4intin[2]rgb[2]
ptsinptsin[0]x
ptsin+2ptsin[1]y
+
+ + +
+ +

7.12.25 vsf_rgb

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set fill RGB colour values« - Set the colour with which a +2-dimensional graphic object is to be filled. +
  +
Opcode: 51 +
  +
Syntax: void vsf_rgb ( int16_t handle, int16_t *rgb ); +
  +
Description: The call vsf_rgb sets the fill RGB colour for 2-dimensional +graphic objects. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
rgb Requested fill RGB color values + +
+ +
Return value: The function does not return a result. +
  +
Availability: Available only with MATRIX drivers in TC mode. +
  +
Group: TC-VDI functions +
  +
See also: Binding   vrf_rgb   vrl_rgb   vrt_rgb   vsl_rgb   vst_rgb +
  + +
+ +

7.12.26 Bindings for vsf_rgb

+ + + + + + + + + +
C: void vsf_rgb ( int16_t handle, int16_t *rgb ); +
  +
Binding: +
  +
void vsf_rgb (int16_t handle, int16_t *rgb)
+{
+   intin[0] = *rgb++;
+   intin[1] = *rgb++;
+   intin[2] = *rgb;
+
+   contrl[0] = 51;
+   contrl[1] = 0;
+   contrl[3] = 3;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]51 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]3 # entry in intin
contrl+8contrl[4]0 # entry in intout
contrl+12contrl[6]handle
intinintin[0]rgb[0]
intin+2intin[1]rgb[1]
intin+4intin[2]rgb[2]
+
+ + +
+ +

7.12.27 vsl_rgb

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set polyline RGB colour values« - Set the line colour. +
  +
Opcode: 53 +
  +
Syntax: void vsl_rgb ( int16_t handle, int16_t *rgb ); +
  +
Description: The call vsl_rgb sets the RGB colour for lines. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
rgb Requested line RGB color values + +
+ +
Return value: The function does not return a result. +
  +
Availability: Available only with MATRIX drivers in TC mode. +
  +
Group: TC-VDI functions +
  +
See also: Binding   vrf_rgb   vrl_rgb   vrt_rgb   vsf_rgb   vst_rgb +
  + +
+ +

7.12.28 Bindings for vsl_rgb

+ + + + + + + + + +
C: void vsl_rgb ( int16_t handle, int16_t *rgb ); +
  +
Binding: +
  +
void vsl_rgb (int16_t handle, int16_t *rgb)
+{
+   intin[0] = *rgb++;
+   intin[1] = *rgb++;
+   intin[2] = *rgb;
+
+   contrl[0] = 53;
+   contrl[1] = 0;
+   contrl[3] = 3;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]53 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]3 # entry in intin
contrl+8contrl[4]0 # entry in intout
contrl+12contrl[6]handle
intinintin[0]rgb[0]
intin+2intin[1]rgb[1]
intin+4intin[2]rgb[2]
+
+ + +
+ +

7.12.29 vst_rgb

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set graphic text RGB colour values« - Set the colour of the +text output. +
  +
Opcode: 52 +
  +
Syntax: void vst_rgb ( int16_t handle, int16_t *rgb ); +
  +
Description: The call vst_rgb sets the RGB colour values for subsequent +graphic text operations. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
rgb Requested text RGB color values + +
+ +
Return value: The function does not return a result. +
  +
Availability: Available only with MATRIX drivers in TC mode. +
  +
Group: TC-VDI functions +
  +
See also: Binding   vrf_rgb   vrl_rgb   vrt_rgb   vsf_rgb   vsl_rgb +
  + +
+ +

7.12.30 Bindings for vst_rgb

+ + + + + + + + + +
C: void vst_rgb ( int16_t handle, int16_t *rgb ); +
  +
Binding: +
  +
void vst_rgb (int16_t handle, int16_t *rgb)
+{
+   intin[0] = *rgb++;
+   intin[1] = *rgb++;
+   intin[2] = *rgb;
+
+   contrl[0] = 52;
+   contrl[1] = 0;
+   contrl[3] = 3;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]52 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]3 # entry in intin
contrl+8contrl[4]0 # entry in intout
contrl+12contrl[6]handle
intinintin[0]rgb[0]
intin+2intin[1]rgb[1]
intin+4intin[2]rgb[2]
+
+ + +
+ +
+ +Home +VDIVDI +Raster functionsRaster functions +VDI functions listVDI functions list + + diff --git a/en/tekbios.html b/en/tekbios.html new file mode 100644 index 000000000..b4e68d261 --- /dev/null +++ b/en/tekbios.html @@ -0,0 +1,53 @@ + + + + + +The documentation for TOS: TekBios + + + + + + + + + +Home +GEMDOSGEMDOS +PowerDOSPowerDOS +GEMDOS function listGEMDOS function list + +
+ +

5.22 TekBios

+ + + + + + + + + + + +

The TekBios is a GEMDOS extension that creates simple access to +a TEK 4/8 board or compatible board. The TekBios uses the opcodes 100 +to 114. +

+

The TEK 4/8 is a Transputer board for the ISA-bus. The board can +be fitted with a processor of type T414 or T800 from Inmos. It was +introduced in the magazine c't 10/1987 - 12/1987. For use on +the Atari one also needs the universal bus interface from c't +7/1987. +

+
+ +Home +GEMDOSGEMDOS +PowerDOSPowerDOS +GEMDOS function listGEMDOS function list + + diff --git a/en/the_system_vectors.html b/en/the_system_vectors.html new file mode 100644 index 000000000..3f9be6258 --- /dev/null +++ b/en/the_system_vectors.html @@ -0,0 +1,670 @@ + + + + + +The documentation for TOS: The system vectors + + + + + + + + + +Home +BIOSBIOS +The system variablesThe system variables +BIOS error-messagesBIOS error-messages + +
+ +

3.5 The system vectors

+

As the system variables and vectors represent the lowest level +of the operating system, application programs should access these only +when absolutely necessary. Explicitly: +

+
    +
  • Do not alter any system variables that may not be altered. +
  • +
  • Do not use any system variables if a function of the operating +system could be called instead (Example: Mfpint). +
  • +
+ +

The following list contains all system vectors of TOS: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
vector Description +
  + + + +
LONG $000 Reset: SSP +
This and the following memory cells contain a mirror image of the +first eight bytes of the ROM. At a reset the value stored here is +loaded into the supervisor stack pointer (though this is not +meaningful; the 'real' stack is only installed later by the BIOS. +
  + + + +
LONG $004 Reset: PC +
At a reset the value found here is loaded into the program counter +(PC). So one finds here the address that is jumped to on a reset. +
  + + + +
LONG $008 Bus Error vector +
Exception vector 2: Two bomblets +
Bus errors arise when one attempts to access regions of memory to +which access is not permitted. In supervisor mode this really can be +only nonexistent memory areas. In user mode this can also happen in +attempting to access hardware registers or regions below $800. +
  +
Normally this vector points to the TOS routine for the +display of bombs (in this case just two). +
  + + + +
LONG $00c Address Error vector +
Exception vector 3: Three bomblets +
The 68000 and 68010 can access odd addresses only byte by byte. +This exception is triggered if one nevertheless attempts a word or +longword access (program counters or stack pointers too may contain no +odd addresses). +
  + + + +
LONG $010 Illegal Instruction Error vector +
Exception vector 4: Four bomblets +
An attempt was made to perform an illegal instruction. This vector +is altered by many debuggers for using for break-points. +
  + + + +
LONG $014 Division by Zero Error vector +
Exception vector 5: No bomblets +
Division was by 0 during a DIV command. Normally this vector +points to an RTE instruction; that's why there are no bomblets. +
  + + + +
LONG $018 CHK Instruction Exception vector +
Exception vector 6: An exception was created by a CHK instruction. +
  + + + +
LONG $01c TRAPV Instruction Exception vector +
Exception vector 7: An exception was created by a TRAPV +instruction. +
  + + + +
LONG $020 Privilege Violation Exception vector +
Exception vector 8: +
An attempt was made to execute an instruction that is permitted +only in supervisor mode. On an Atari TT, the BIOS tests whether the +corresponding instruction was a 'move sr,...': unlike on 68000s, this +instruction is permitted only in supervisor mode on the TT. If this is +the case, the BIOS will substitute the instruction 'move ccr,...' +and attempt to keep the program running. +
  + + + +
LONG $024 Trace Exception vector +
Exception vector 9: If the trace bit is set in the status +register, the address specified here is jumped to after every +instruction. +
  + + + +
LONG $028 Line-A-Vector +
Exception vector 10: An attempt was made to execute an instruction +that contained the value '$A' in the top four bits. At present this +vector is used for the co-called Line-A routines. +
  + + +
LONG $02c Line-F Exception vector +
Exception vector 11: An attempt was made to execute an instruction +that contained the value '$F' in the top four bits. It is used up to +TOS 1.04 by GEM, and is intended actually for the programmming of a +floating point unit (FPU). +
  +
LONG $030 Reserved +
  +
    : Exception vectors 12-23 +
  +
LONG $05C Reserved +
  + + +
LONG $060 Spurious Interrupt vector +
Exception vector 24: Occurs if an interrupt has been triggered but +the cause of it could not be ascertained. +
  + + +
LONG $064 Auto-vector Interrupt, Level 1 +
Unused +
  + + +
LONG $068 Auto-vector Interrupt, Level 2 +
Points to the handler for horizontal blanking. +
  + + +
LONG $06c Auto-vector Interrupt, Level 3 +
Unused +
  + + +
LONG $070 Auto-Vector Interrupt, Level 4 +
Points to the handler for vertical blanking. +
  + + +
LONG $074 Auto-Vector Interrupt, Level 5 +
Unused +
  + + +
LONG $078 Auto-Vector Interrupt, Level 6 +
Points to the handler for MFP interrupts. +
  + + +
LONG $07c Auto-Vector Interrupt, Level 7 +
Unused +
  + + +
LONG $080 TRAP#0 +
Exception vector 32 +
Vector for the 'TRAP #0' instruction. As it is not used by the +operating system, it throws bomblets. +
  + + + + +
LONG $084 TRAP#1 +
Exception vector 33 +
Vector for the 'TRAP #1' instruction. Points to the Dispatcher for +the GEMDOS functions. +
  + + + + +
LONG $088 TRAP#2 +
Exception vector 34 +
Vector for the 'TRAP #2 instruction'. +
Depending on the value in d0, different system functions are +started: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
dechexname
-2 vq_gdos
-1 address of VDI dispatcher
1150x73VDI
2000xc8AES
2010xc9_appl_yield
182190x472bG+PLUS, is the value not 0x472b, then is it install
+
+ +
LONG $08c - LONG $0b0 TRAP#3 - TRAP#12 +
Exception vectors 35-44. Throws a corresponding number of +bomblets, as they are not used currently by the operating system. +However, there are external extensions that use these traps: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
LONG $08c TRAP#3 +
Exception vector 35 +
Is used only by Omega-Color-CAD, otherise without function. +
  + + + +
LONG $090 TRAP#4 +
Exception-Vector 36 +
The MS-DOS Emulator SuperCharger use the Trap #4 for his Toolbox. +
  + + + + +
LONG $094 TRAP#5 +
Exception vector 37 +
Is used by Wind-XES. It is a modular accessory/control panel that +lets you load in .WNX ("winks") applications which run +concurrently under its environment. +
MidiShare a multi-tasking and real-time system for Midi program +use this trap (also Trap #6). +
  + + +
LONG $098 TRAP#6 +
Exception vector 38 +
MidiShare a multi-tasking and real-time system for Midi program +use this trap (also Trap #5). +
  + + + +
LONG $0a0 TRAP#8 +
Exception vector 40 +
Cubase MROS from Steinberg use this trap. +
  + + +
LONG $0a4 TRAP#9 +
Exception vector 41 +
Cubase MROS from Steinberg use this trap. +
  + + + +
LONG $0a8 TRAP#10 +
Exception vector 42 +
Is used by TapeBIOS. Serves for controlling a BandDrive at the +ASCI-bus of the Atari. +
Cubase MROS from Steinberg use this trap also. +
  + +
+ + + + + +
LONG $0b4 TRAP#13 +
Exception vector 45: Vector for the 'TRAP #13' instruction. Points +to the Dispatcher for the BIOS functions. +
  + + + + +
LONG $0b8 TRAP#14 +
Exception vector 46: Vector for the 'TRAP #14' instruction. Points +to the Dispatcher for the XBIOS functions. +
  + + +
LONG $0bc TRAP#15 +
Not used by the operating system. NVDI and its print monitor make +use of this vector. +
  +
LONG $0c0 reserves +
  +
    : Exception vectors 48-63. +
  +
LONG $0fc Reserved +
  + + + +
LONG $100 BUSY Interrupt vector +
ST-MFP interrupt #0. Is triggered by the parallel port. Normally +not used. +
  + + + +
LONG $104 DCD-Interrupt +
ST-MFP interrupt #1. Is triggered by the serial port (Carrier +detect). Normally unused. +
  + + + +
LONG $108 CTS-Interrupt +
ST-MFP interrupt #2. Is triggered by the serial port (Clear to +send). Normally unused. +
  + + +
LONG $10c GPU Done vector +
ST-MFP interrupt #3. Can be used by the blitter (when present) to +indicate termination of an operation. Normally unused. +
  + + +
LONG $110 Baud-rate Generator +
ST-MFP interrupt #4. Normally unused. +
  + + + +
LONG $114 200Hz System Clock +
ST-MFP interrupt #5. Points to the system clock interrupt and may +not be altered under any circumstances (required for timing loops in +TOS. +
  + + + + + + +
LONG $118 IKBD/MIDI +
ST-MFP interrupt #6. Points to the handler for IKBD and MIDI +interrupts. +
  + + + + +
LONG $11c FDC/ACSI +
ST-MFP interrupt #7. Normally unallocated. +
  + + +
LONG $120 Display Enable Signal +
ST-MFP interrupt #8. Normally blocked. +
  + + +
LONG $124 RS-232 Transmit Error interrupt +
ST-MFP interrupt #9. Is triggered by transmission errors when +sending data via the serial port. +
  + + +
LONG $128 RS-232 Transmit Buffer Error interrupt +
ST-MFP interrupt #10. Is triggered when the transmission of a +single byte is completed and the transmit buffer is empty. +
  + + +
LONG $12c RS-232 Receive Error interrupt +
ST-MFP interrupt #11. Occurs at receive errors. +
  + + +
LONG $130 RS-232 Receive Buffer Full interrupt +
ST-MFP interrupt #12. A complete character has been received by +the serial port. +
  +
LONG $134 Unused +
ST-MFP-Interrupt 13. Unused +
  + + +
LONG $138 RS-232 Ring Indicator interrupt +
ST-MFP interrupt #14. Is triggered when the serial port detects an +incomming call (e.g. when using a modem). As this interrupt is so easy +to trigger, debuggers like to use it as a break signal. +
  + + +
LONG $13c Monochrome Monitor Detect interrupt +
ST-MFP-Interrupt 15. unused +
  + + + +
LONG $140 TT-MFP interrupts +
  +
    : 16 interrupt vectors for the second MFP in the Atari-TT. +
  +
LONG $17c TT-MFP interrupts +
  + + + +
LONG $180 TT-SCC interrupts +
  +
    : Space for the interrupt vectors of the SCC module in the +Atari-TT. +
  +
LONG $1bc TT-SCC interrupts +
  + +
+ +

See also: +
Reset vector   System variables   Exceptions under MagiC Mac +

+
+ +Home +BIOSBIOS +The system variablesThe system variables +BIOS error-messagesBIOS error-messages + + diff --git a/en/tos_about.html b/en/tos_about.html new file mode 100644 index 000000000..54b4f0d0b --- /dev/null +++ b/en/tos_about.html @@ -0,0 +1,63 @@ + + + + + +The documentation for TOS: The Operating System TOS + + + + + + + + + +Home +TOSTOS +TOSTOS +GEMGEM + +
+ +

2.1 The Operating System TOS

+

The operating system TOS (The Operating +System) may be subdivided into various sections. +Communications with the users is realized via GEM, which offers a +comfortable user-interface and is composed of AES- and VDI-functions. +

+

Beyond this many further routines are available, which may be +allocated to one of the following categories: +

+ + +

TOS dates back to the year 1985. In the course of time it was +further developed by Atari and is available for various models of +computer (ST, STE, Mega-ST, TT, Falcon, ...). In addition there are a +number of TOS-compatible systems offered by third parties. Worth +mentioning in this connection are, above all, MagiC and Geneva. While +MagiC has become important particularly in Germany (and the U.K.), +Geneva seems to have met with a certain amount of approval in the USA. +Thanks to MagiC Mac, an implementation of MagiC to the Apple (Power) +Macintosh hardware, TOS programs are now running also on Apple +computers. A later variant, MagiC PC, has also extended this to many +Windows machines. +

+

See also: TOS list +

+
+ +Home +TOSTOS +TOSTOS +GEMGEM + + diff --git a/en/tos_main.html b/en/tos_main.html new file mode 100644 index 000000000..f2594774b --- /dev/null +++ b/en/tos_main.html @@ -0,0 +1,38 @@ + + + + + +The documentation for TOS: TOS + + + + + + + + + +Home +Contents +The GNU General Public LicenceThe GNU General Public Licence +The Operating System TOSThe Operating System TOS + +
+ +

2 TOS

+ +
+
+ +Home +Contents +The GNU General Public LicenceThe GNU General Public Licence +The Operating System TOSThe Operating System TOS + + diff --git a/en/tos_vers.html b/en/tos_vers.html new file mode 100644 index 000000000..c0825bea8 --- /dev/null +++ b/en/tos_vers.html @@ -0,0 +1,470 @@ + + + + + +The documentation for TOS: TOS list + + + + + + + + + +Home +Contents +vmem_sizevmem_size +XHDI - eXtended HardDisk Interface (Version 1.30)XHDI - eXtended HardDisk Interface (Version 1.30) + +
+ +

G TOS list

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VersionDateNameLanguageKindGEMDOSAESRemark
0.00 Das BootEnglishROM   
1.0020.06.1985MushroomGermanRAM 1.01(1)
1.0020.11.1985 GermanRAM0.131.20 
1.0020.11.1985 FrenchRAM0.131.20 
1.0006.02.1986Old TOSGermanRAM0.131.20 
1.0006.02.1986Old TOSEnglishROM0.131.20 
1.0222.04.1987BlitterGermanROM0.131.20 
1.02 KAOS 1.2.xGermanROM0.15 (2)
1.0418.05.1988Beta-test TOSEnglishRAM0.151.30 
1.0408.08.1988Developer TOSGermanRAM0.151.04 
1.0422.02.1989Rainbow TOSGermanROM0.151.40 
1.0406.04.1989RainbowGermanROM0.151.40 
1.0406.04.1989KAOS 1.4.2GermanROM0.161.41(2)
1.0406.04.1989KAOS 1.4.3 (08.06.1994)GermanROM0.161.41(2)
1.0619.06.1989STEGermanROM0.151.40 
1.6211.01.1990STEGermanROM0.171.40 
2.01  GermanROM0.19  
2.0505.12.1990 GermanROM0.193.10 
2.0614.11.1991 GermanROM0.203.20 
2.0610.03.1992 GermanROM 3.20STBook
2.0729.02.1992 EnglishROM  Sparrow
2.9526.04.1996 EnglishROM0.203.20Tos2Win
3.0023.05.1989TTOSUSROM   
3.0001.03.1990TTOSROM   
3.0109.08.1990TTOSGermanROM 3.00 
3.0129.08.1990TTOSGermanROM0.193.00 
3.0505.12.1990TTOSGermanROM0.193.10 
3.0624.09.1991TTOSGermanROM0.203.20 
4.00  Multilang.ROM0.30  
4.0121.10.1992 Multilang.ROM0.303.31 
4.0226.01.1993 Multilang.ROM0.303.40 
4.03  Multilang.ROM0.303.40 
4.0408.03.1993 Multilang.ROM0.303.40 
4.06 MilanTOSMultilang.Flash0.31  
4.0710.05.1999MilanTOSMultilang.Flash   
4.0808.07.1999MilanTOSMultilang.Flash0.32  
4.0815.06.2001MilanTOSMultilang.Flash0.333.42 
4.0820.08.2001MilanTOSMultilang.Flash0.333.42 
4.0806.10.2002MilanTOSMultilang.Flash0.333.43 
4.0809.03.2003MilanTOSMultilang.Flash0.333.43 
7.0x  Multilang.Flash(3)
+
+ + +
    +
  1. The GEMDOS version should have the value 11010000 (0xD0) here. +
    This turns up a problem of how the value is to be interpreted. +Binary or BCD coded? The list corresponds to the BCD coding. +
  2. +
  3. Modified version by Andreas Kromke +
  4. +
  5. TOS 7.0x is a modified version for the Falcon accelerator +CENTurbo II. +
  6. +
+ +
+ +Home +Contents +vmem_sizevmem_size +XHDI - eXtended HardDisk Interface (Version 1.30)XHDI - eXtended HardDisk Interface (Version 1.30) + + diff --git a/en/typedefs.html b/en/typedefs.html new file mode 100644 index 000000000..7890d1168 --- /dev/null +++ b/en/typedefs.html @@ -0,0 +1,208 @@ + + + + + +The documentation for TOS: Type definitions + + + + + + + + + +Home +Contents +XHDI functionsXHDI functions +AESVARSAESVARS + +
+ +

I Type definitions

+

In this hypertext there are references to the following data +types: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AESVARSAPPLRECORDARHEADERBASEPAGEBCB
BCONMAPBITBLKBPBCD_DISC_INFOCD_TOC_ENTRY
CICONCICONBLKCPXINFOdev_descrDEVDRV
DISKINFODITHER_MODEDOSTIMEDOSVARSDRV_INFO
DSPBLOCKDTAEVNTfcookieFILEPTR
FILESYSfix31FNTS_ITEMFONT_HDRfs_descr
GEM_MUPBGRECTHDFUNCSHNDL_OBJICONBLK
IORECKBDVBASEKEYTABLBOX_ITEMLINE
ltcharsMAPTABMCBMDMEDIA_SIZE
MEDIA_TYPEMENUMETA_DRVINFOMETA_INFO_1META_INFO_2
META_HEADERMFDBMFORMMN_SETMOUSE
MPBMRETSmutimbufOBJECTOHEADER
OSHEADEROVERPATCHPARMBLKPBDEFPD
PDLG_SUBPHploadinfoPOPINFOPRN_ENTRY
PRN_MODEPRN_TRAYPRN_SETTINGSPRN_SWITCHPUN_INFO
pxyarrayRGB_LISTRSHDRSCANXSCREEN
SET_ITEMsgttybSHELTAILSLCT_ITEMSWINFO
tcharstimevaltimezoneTEDINFOTHREADINFO
USERBLKUTXT_FNwinsizeXAESMSGXATTR
XCPBXDO_INFXFNT_INFOXFSL_FILTERXSHW_COMMAND
XTEDxkey   
+
+ + +
+
+ +Home +Contents +XHDI functionsXHDI functions +AESVARSAESVARS + + diff --git a/en/udo_hm.gif b/en/udo_hm.gif new file mode 100644 index 0000000000000000000000000000000000000000..d119c0419e0e1f061177b3b7f4a4165f5ce507ba GIT binary patch literal 928 zcmc(e&uhMrFES}HR)b(6A-3Yu!J>MFQL6tgboqAu7Y4`i}U9Qa2B4p9vlqEX2x zIv@rcXt1P`t2Q-H&7^|FAGB1erb4dRMFmY0H6cfmCIECXPSCg|O7cJ^+r)t;4C4^h zfFYVqWT69Muz{93QBBjP<_Q-gNc=%drBWY9<=Wi4n#~C-=H@Cj+XP*yH`&!{6Gt7P zaac%==(Hd+ypRG%OzMq=fHnHRK{LV!Z literal 0 HcmV?d00001 diff --git a/en/udo_lf.gif b/en/udo_lf.gif new file mode 100644 index 0000000000000000000000000000000000000000..2519705959b048f4438ad8c5fc678a117213d9ad GIT binary patch literal 930 zcmc(e&x_7+5XXl$t((h}rzm>1CnXo=LdYYvmKC-nZAx2AO1UXHD3{%B?O|J|k+N7D zB|l1jT(xCo+E&kD^AAY5IdB}W`Ti3=w`peHzvlZreqwn4fr+-X<*!KAi%ie7OwE+4 zA~HO~GBiV~>5=Z~mageivleNdW@(xxwW^Wosg|m#0#Zt(c#5TH3I*6egT*q_QatrM z!Xh+6ik8Yf+`=_nN(D{xFbmT#DN)R-hgztH3L04r@em8q5Li(S7@|>$EP4=w4K!FR zOBt$~XYT4Qx*dq^QvP~TLM+6R04H%+P$tXG? z1{-Lwq>`&PHBZf?g2W%RRH~*zuGmEdO%pXCN0KH0bTLlQxFt&RKqlM7fhG*&5Y>Po znoVS(17fg&mO4>Q)28ML7b8ggK})4lA4lcd+`F312`lF2DmB{#U8y(O)oK$*9ieep zNR8;aNu#5H8)!ZUu0(ivg6e<0Jw;sqLT_+NHVkebdA)G-&bqv~urfEX&|B{epIccw z`DwDft+V)Ht@C+y=iXb((`O%lx!W3>y!d^r`*m*U(#xAa_bnZp-qpSR*553yP9C~4 zbL#5TXWyQT+}qT;|9hyvbY{oK8=L2UEI&WJb^P$hes}f3kw6w

8)l|q8yQrXPq9)`>(gc7m#t9m?L`fdVWScn9gkc<_ z8Zbn&i7a$L3^veGC#q@M)I8y01c^UrsZ{FYs9c+SSF<@`#oSz_W}BcZ^(MPoZQ`gS zG!6@?5nVTFbQEv{&F8?C2oFzC{jb+w#Pu&o>zZt8?HpO2Kh*soOXIJW7hYUFx%J@O z$iU*^nfCUHXz%_qJkwn|Gxv9Wa-^?kZ2rRd!_TAFd&UOOKKj)gH~V`ZKYcy*_4$p# zON$$)_TGEDuw(i`>*dCeW8Klqd!}d4-(8(Oac6bkmg7I)-#_}S^KItc+Q%!Kr#f$1 b>wTwJ&J9f5?ri(M^5o+0wNJN(cFBQ%Dm{$5 literal 0 HcmV?d00001 diff --git a/en/udo_nolf.gif b/en/udo_nolf.gif new file mode 100644 index 0000000000000000000000000000000000000000..9e67089a59c21bdafac4ad1b8fb56bb6b8353f21 GIT binary patch literal 931 zcmc(ezi-ZQ5XaAtCwUS?u$0)0wbW@UDiS2^^RyF#_|e637*&`II`~l?Ff?&Zn;@Ea zQbQN9vpkVQV$cXN2!nw^B*yc)??2(QUGDDv>%QOd?%08ma|1FUe?_uhWO}A$YNk{b zk>MGZp&3$5k91GBbWN9(8y|thggV)z=~?X5RFP?(SsOlpuu8U z%23rjb60mMf6!8yxv86!T~yFib5&QtJ))R(F&A~g9(f>>ZQ{T`B5;Umzz~f}M$rK= z*g%6Nm0Y!{d1@vVB>teKQZ*HF#V#snny3jmk~9IJi*bU+Em4vOGT9~$G+`Krs0Iwt zY$6LC5Q7c0)QM`EHZ@PU7(wC>S}K+LI4alX-qmbQSTQ$Oso5szO1;UhR+~8L2#v!+ zYDCvf8XX1PK=V0pCBnlKRR8PkE#mqYq&qV*yp7EPA>xcjJhn~#OZR(!bfARab&g|fZ=Zmw`Hzw}wJOBRL>C3IjrP1M+ zQxA4LeY-Hy+O=h2`ogj0vHJ(FwC8(odRtc}es+)l_;7b~>-Wa9+Xg?bOuhSZXzpt7 S)AHKa*GrQxeto_!GWriuXoLj- literal 0 HcmV?d00001 diff --git a/en/udo_norg.gif b/en/udo_norg.gif new file mode 100644 index 0000000000000000000000000000000000000000..eeb9dd20189adb60541399f453d069d4c0f6dfda GIT binary patch literal 930 zcmc(ey=#}!Lvn&E*TU>p^M7;|)AY!Tq zz6>r7RYY{PORbp>rMN2SKTv#`;wR5P;cp8`zHfP+)6=IqN9J16lHVd(FETyTGBs1G zipcN`%g_v|rboJ`Te_x8&03^+nx$!))T&0Rr&_9}3P>rD;whG*DHLD>4HnBxOYzk6 z2#e4NDOxJ`a0}OPDHSx$!z@h0q(m{R9%`W)DrjUi#6v7ZLtsTUV2DN~vgkn!Hqc

xndU;G)>fm97&o0(8V}GJde>`>Q zS$DBDF&nG5_O47WbPjL4J2==e*wY(ao*S)w98C1y&i@^Mes-yIzI*@AwioAyyKX<& znBM;5!=sZ|w#?uC{Btzi+5dLu=&Su-7P~XE@2_fm{o%}odt2MT_I-Wb{h(2rH*vuuSnL5OwY7T&6KJl zGCadFG()QCk?!f1uIW;<7HOVlX__Xrs*&ocma3@&Qc9$Filt}@1=v7?#WK@UJoP-n zA~ZsZmdZWc!Zln<1x@oX3)3(uQOv4`TBwE!8d(kT5DU=|SWyiaqEU$~dJuyRG*~Q4 z8LFCR?&>b(4_YcSH+7S;iwc@*uIehdM-;Oz=AtgxBM)SU&s-{A&*hK|R6Ez`6k|qFjF;399B}(!@Cfme;CJf^c)qo+I zO=O`1Vz7ahI#Es2rsfG3BS`!~OQljDN9EewyPC}jE9T}ZHQNMTsW;ixY7<8tp>bG9 zjp({bqoaTuXg&w7M0j|D>VLgn5!b&U19P%vV0V9c;rQ$id3k1SdGW)Y)2;Ex{ew#r zcRR!9Vr^#M>apRYrv@)?ZcN_WKK1DK$jp=b54*dTuJ>E^@xjowcfDJ!{a@!t&#sEZZH=_wp~aola!TRoIJ-RYe3{&l|J@yRnsj$Ua?TmFhEAq-d$!!!2CHrBu)~53?{0lM=kJsGyP65D&2s4S^NafFT-{$f5@^*g%8D zvXr5!dFHO}QvRT&GILWmDZ8kksphJ#f_p?U>tZhIf<5v;Cfme;e?;IA)qo)ym5ibT zVz7Y*ODef)Q}fhJDoFf6OQmWmI|L&AqGHoUmeUu2Qp2(3N_VU9C28)Daqo zh17_yn>0EKxPj(#;7WvtC#e3{8!h7c7f$rwmsbDK#M>7q?|hf#iyt~0t9Q3;+B`ck z*IiuLzI)4Z?`voM;hqCC=X)E&AD;|N9v&K8c{RRxaBOAt*4f$Ep*xpO56*Sgo^74F z(Kqn>*O!G0kN02x^zQ1^%R}9peb>H?Oy8S6HS^Q|jKuTfdvAYk&%f?HIyStt@4@`q TrKjh*>#Muozxi>!)snG)DDQx) literal 0 HcmV?d00001 diff --git a/en/udo_up.gif b/en/udo_up.gif new file mode 100644 index 0000000000000000000000000000000000000000..88440735cf37e2561281711ebee7e8dc4075c39c GIT binary patch literal 927 zcmc(e&x_7+5XZ+swp_NfwHvY}H$^*}Na+!ImXZU7y*+HxwjAu9Y!2EY$Bj13L2YsH zY}(NN2cD#-aqy$KOWMD{alGd9Px#!XnR)-3@3(vY-0>5=aT%AtB3UmoJ<~EZQ>u!{ z@C?h)45_9^x~E&Zrc2FQq;*KjEnG|j^-Ov9u^F{>VGp&BY^WHrP?EJQon2S{0XJwq2d+eTc!KJGy~9OZ|3YWvf$SLBH}iJ=^vVx;bM4ce-ukW4v14=dhk73# zjq1YI%;R5!)yb<@*6uFe9IPHZvvK?R((mEZ$pcT$Zohl=(f2Rjn7)2_?$Wb8-Pwr? zTd%*oJi79A(4YP@>>Rm2wbq~NU+kaq&7aFl+uh9xpWS&+=RbFL?S4Pl_`dM%;n?!< J#okdl`48Mef+PR{ literal 0 HcmV?d00001 diff --git a/en/vdi_attribute.html b/en/vdi_attribute.html new file mode 100644 index 000000000..95fdde7b2 --- /dev/null +++ b/en/vdi_attribute.html @@ -0,0 +1,10164 @@ + + + + + +The documentation for TOS: Attribute functions + + + + + + + + + +Home +VDIVDI +VDI bindingsVDI bindings +Output functionsOutput functions + +


+ +

7.4 Attribute functions

+

This library contains functions that allow the setting of +certain attributes. The following categories are available for this: +

+ + +

Note: The attributes set here are valid for a single +workstation, and retain their validity until the program terminates, +or the attributes are reset elsewhere. +

+

See also: VDI workstations   Style guidelines +

+

7.4.1 Bitmap attributes

+ + + + + + + +
vsr_bg_color Sets background colour +
vsr_fg_color Sets foreground colour + +
+ +

Note: The attributes set here are valid for a single +workstation, and retain their validity until the program terminates, +or the attributes are reset elsewhere. +

+

See also: +
VDI workstations   Style guidelines   VDI fundamentals +

+

7.4.2 Fill attributes

+ +

This group of functions enables various attributes for the +filling of areas to be manipulated. The following routines are +available for this purpose: +

+ + + + + + + + + + + + + + + + + + + + + + + + +
vsf_bg_color Sets background colour +
vsf_color Selects fill colour +
vsf_fg_color Sets foreground colour +
vsf_interior Selects fill-type +
vsf_perimeter Draws or doesn't draw perimeter +
vsf_style Selects hatching pattern +
vsf_udpat Defines user-defined hatching pattern +
vsf_xperimeter Sets fill parameter visibility + +
+ +

The attributes set here are valid for a single workstation, and +retain their validity until the program terminates, or the attributes +are reset elsewhere. +

+

See also: +
VDI workstations   Fill-type and pattern index   Style guidelines   VDI fundamentals +

+

7.4.3 Lines attributes

+ +

This group of functions enables various attributes for the +drawing of lines to be manipulated. The following routines are +available for this purpose: +

+ + + + + + + + + + + + + + + + + + + + + + + + +
v_bez_qual Sets quality of Bezier-spline generation +
vsl_bg_color Sets background colour +
vsl_color Sets line colour +
vsl_ends Defines line-end type +
vsl_fg_color Sets foreground colour +
vsl_type Sets type of line depiction +
vsl_udsty Defines user-defined line depiction +
vsl_width Defines line width + +
+ +

The attributes set here are valid for a single workstation, and +retain their validity until the program terminates, or the attributes +are reset elsewhere. +

+

See also: +
VDI workstations   Style guidelines +

+

7.4.4 Marker attributes

+ +

This group of functions enables various attributes for the +drawing of markers to be manipulated. The following routines are +available for this purpose: +

+ + + + + + + + + + + + + + + +
vsm_bg_color Sets background colour +
vsm_color Sets marker colour +
vsm_fg_color Sets foreground colour +
vsm_height Sets marker size +
vsm_type Selects marker type + +
+ +

The attributes set here are valid for a single workstation, and +retain their validity until the program terminates, or the attributes +are reset elsewhere. +

+

See also: VDI workstations   Style guidelines +

+

7.4.5 Text attributes

+ +

This group of functions enables various attributes for the +handling of text to be manipulated. The following routines are +available for this purpose: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
v_topbot Sets text height +
vst_alignment Sets horizontal and vertical alignment of a text +
vst_arbpt Sets character cell height in points +
vst_arbpt32 Sets character cell height in points (fix31) +
vst_bg_color Sets background colour +
vst_charmap Selects character mapping mode (Atari/Bitstream) +
vst_color Sets colour for text output +
vst_effects Selects text effects +
vst_error Sets the GDOS error handling +
vst_fg_color Sets foreground colour +
vst_font Selects face +
vst_height Sets text size +
vst_kern Sets kerning mode +
vst_map_mode Selects character mapping mode (Atari/Bitstream/Unicode). +
vst_name Finds and sets text face by name +
vst_point Sets size of character cell +
vst_rotation Sets rotation of text output +
vst_scratch Designates size of the scratch buffer +
vst_setsize Sets character cell width in points +
vst_setsize32 Sets character cell width in points (fix31) +
vst_skew Sets angle of skew for skewed text ('italic') +
vst_track_offset Sets offset for track kerning +
vst_width Sets character width in pixels + +
+ +

The attributes set here are valid for a single workstation, and +retain their validity until the program terminates, or the attributes +are reset elsewhere. +

+

See also: VDI workstations   Style guidelines +

+

7.4.6 Superior attributes

+ +

This group of functions permits setting of the writing mode as well as +the intenstity of a colour; it encompasses the following routines: +

+ + + + + + + + + + + + + + + + + + + + + + + + +
v_ps_halftone Sets PostScript halftoning type +
v_setrgb Sets colour intensity +
v_setrgbi Sets colour or intensity +
vs_bkcolor Sets background colour +
vs_color Sets colour intensity of a colour +
vs_color2 Sets colour intensity and colour for attributes +
vs_grayoverride Fine-tunes grey level +
vswr_mode Selects writing mode + +
+ +

The attributes set here are valid for a single workstation, and +retain their validity until the program terminates, or the attributes +are reset elsewhere. +

+

See also: VDI workstations   Style guidelines +

+

7.4.6.1 vsr_bg_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Background Color« +
  +
Opcode: 201 (sub-opcode 4) +
  +
Syntax: int16_t vsr_bg_color ( int16_t handle, int32_t color_space, +COLOR_ENTRY *fg_color ); +
  +
Description: This function sets the background colour for bitmaps. +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
color_space Colour space (at present only 0 for the colour space set, or +CSPACE_RGB) +
fg_color COLOR_ENTRY der Hintergrundfarbe + +
+ +
Return value: -1 = Wrong subfunction number +
 0 = Function not present +
 1 = All OK +
  +
Availability: As of NVDI 5.00 +
  +
Group: Bitmap attributes +
  +
See also: Binding +
  + +
+ +

7.4.6.2 Bindings for vsr_bg_color

+ + + + + + + + + +
C: int16_t vsr_bg_color ( int16_t handle, int32_t color_space, +COLOR_ENTRY *fg_color ); +
  +
Binding: +
  +
int16_t vsr_bg_color( int16_t handle, int32_t color_space,
+                      COLOR_ENTRY *fg_color )
+{
+   intin[0..1] = color_space;
+   intin[2..5] = fg_color;
+
+   contrl[0] = 201;
+   contrl[1] = 0;
+   contrl[3] = 6;
+   contrl[5] = 4;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]201 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]6 # entry in intin
contrl+8contrl[4]1 # entry in intout
contrl+10contrl[5]4
contrl+12contrl[6]handle
intinintin[0..1]color_space
intin+4intin[2..5]fg_color
intoutintout[0]Return Value
+
+ + +
+ +

7.4.6.3 vsr_fg_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Foreground Color« +
  +
Opcode: 200 (Sub-Opcode 4) +
  +
Syntax: int16_t vsr_fg_color ( int16_t handle, int32_t color_space, +COLOR_ENTRY *fg_color ); +
  +
Description: This function sets the foreground colour for bitmaps. +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
color_space Colour space (at present only 0 for the colour space set, or +CSPACE_RGB) +
fg_color COLOR_ENTRY of the foreground colour + +
+ +
Return value: -1 = Wrong subfunction number +
 0 = Function not present +
 1 = All OK +
  +
Availability: As of NVDI 5.00. +
  +
Group: Bitmap attributes +
  +
See also: Binding +
  + +
+ +

7.4.6.4 Bindings for vsr_fg_color

+ + + + + + + + + +
C: int16_t vsr_fg_color ( int16_t handle, int32_t color_space, +COLOR_ENTRY *fg_color ); +
  +
Binding: +
  +
int16_t vsr_fg_color( int16_t handle, int32_t color_space,
+                      COLOR_ENTRY *fg_color )
+{
+   intin[0..1] = color_space;
+   intin[2..5] = fg_color;
+
+   contrl[0] = 200;
+   contrl[1] = 0;
+   contrl[3] = 6;
+   contrl[5] = 4;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]200 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]6 # entry in intin
contrl+8contrl[4]1 # entry in intout
contrl+10contrl[5]4
contrl+12contrl[6]handle
intinintin[0..1]color_space
intin+4intin[2..5]fg_color
intoutintout[0]Return value
+
+ + +
+ +

7.4.6.5 Graphical overview of fill-type and pattern index

+

The following illustration shows the possible combinations of +the fill-type and the pattern index. The first number here specifies +the fill-type (blank (0), pattern (2) or hatching (3)), the second the +index of the fill-pattern or hatching style. +

+

+

Note: A fill-type with the value 1 followed by any +hatching index always corresponds to fill-type 2 with hatching index 8 +(solid). Index 1 for patterns of type 2 is always the pattern with the +lowest intensity on the relevant output device, and in addition always +in monochrome. +

+

See also: vsf_interior   vsf_style +

+

7.4.6.6 Description of the VDI writing modes

+ +

Replace: In this mode the VDI overwrites the +background with the foreground colour in places where the +corresponding bit is set, or with the colour white if the +corresponding bit has the value 0. The logical combination is as +follows: +

+

New := (foreground AND mask) OR (background AND NOT mask) +

+

If we look at this in terms of working with pencil and paper, +one can imagine this as follows: First one draws a figure on white +paper, cuts it out and then sticks it over the graphic. +

+ +

Transparent: In this mode, all bits of the figure to be +drawn that have the value 0 (i.e. are not set) are ignored by the +VDI. So only those bits are output that are set. The logical +combination in this case is as follows: +

+

New := (foreground AND mask ) OR (colour AND NOT mask) +

+

Here again a comparison of working with pencil and paper: This +mode corresponds to the Replace mode, only one is not drawing on +normal paper but on transparent foil. +

+ +

XOR: In this mode all bits of the background and the +figure to be drawn are combined with an exclusive-OR (XOR), which +shows a useful and interesting feature: +

+

If the same figure is drawn a second time in this mode, then it +will suddenly disappear again. Reason: An XOR combination of a bit +with itself always results in the inverses value. This is why this +mode is well suited for simple animations like a rubber box; the +recipe for this is as follows: +

+ + + + + + + + + + + + +
1. Output the object once +
2. Output the object again (it has now disappeared again) +
3. Alter the size or position of the object +
4. Back to step 1 + +
+ +

The logical combination here is: New := (mask XOR colour) +

+

Im allgemeinen läßt sich über diesen Modus nur aussagen, daß +aus der Farbe Schwarz die Farbe Weiß wird, und umgekehrt; alles +andere ist nicht fest definiert. +

+ +

Reverse transparent: In this mode, only those pixels are +taken into account which are set to the value 0 in the figure to be +drawn. The logical combination in this case is: +

+

New := (colour AND mask) OR (foreground AND NOT mask) +

+

This mode too offers some interesting application +ppossibilities; thus it can be used together with Transparent mode, +for instance, to let text appear with an additional background colour. +

+

The following illustration should clarify the VDI writing +modes: +

+

+

See also: vswr_mode +

+

7.4.6.7 vsf_bg_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Background Color« - Set the background colour for +objects +
  +
Opcode: 201 (Sub-Opcode 1) +
  +
Syntax: int16_t vsf_bg_color ( int16_t handle, int32_t color_space, +COLOR_ENTRY *fg_color ); +
  +
Description: The call vsf_bg_color sets the background colour for drawn +objects. +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
color_space Colour space (at present only 0 for the colour space set, or +CSPACE_RGB) +
fg_color COLOR_ENTRY of the background colour + +
+ +
Return value: -1 = Wrong subfunction number +
 0 = Function not present +
 1 = All OK +
  +
Availability: As of NVDI 5.00. +
  +
Group: Fill attributes +
  +
See also: Binding +
  + +
+ +

7.4.6.8 Bindings for vsf_bg_color

+ + + + + + + + + +
C: int16_t vsf_bg_color ( int16_t handle, int32_t color_space, +COLOR_ENTRY *fg_color ); +
  +
Binding: +
  +
int16_t vsf_bg_color( int16_t handle, int32_t color_space,
+                      COLOR_ENTRY *fg_color )
+{
+   intin[0..1] = color_space;
+   intin[2..5] = fg_color;
+
+   contrl[0] = 201;
+   contrl[1] = 0;
+   contrl[3] = 6;
+   contrl[5] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]201 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]6 # entry in intin
contrl+8contrl[4]1 # entry in intout
contrl+10contrl[5]1
contrl+12contrl[6]handle
intinintin[0..1]color_space
intin+4intin[2..5]fg_color
intoutintout[0]Return value
+
+ + +
+ +

7.4.6.9 vsf_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set fill colour index« - Set the colour with which a +2-dimensional graphic object is to be filled. +
  +
Opcode: 25 +
  +
Syntax: int16_t vsf_color ( int16_t handle, int16_t color_index ); +
  +
Description: The call vsf_color sets the fill colour for 2-dimensional +graphic objects. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
color_index Requested fill color index + +
+ +
Note: The colour indices 0 and 1 are always available; +all others depend on the output device being used. An invalid colour +index will be replaced by the value 1. The colour index has no effect +on multicoloured patterns; it should be set to 1 in this case. +
  +
Return value: The function returns the actual colour set. +
  +
Availability: Supported by all drivers. +
  +
Group: Fill attributes +
  +
See also: Binding   v_fillarea   v_contourfill   vr_recfl v_bar   +v_pieslice   v_circle   v_ellipse   v_ellpie   v_rfbox   vsf_udpat +
  + +
+ +

7.4.6.10 Bindings for vsf_color

+ + + + + + + + + +
C: int16_t vsf_color ( int16_t handle, int16_t color_index ); +
  +
Binding: +
  +
int16_t vsf_color (int16_t handle, int16_t color_index)
+{
+   intin[0] = color_index;
+
+   contrl[0] = 25;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]25 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]1 # entry in intin
contrl+8contrl[4]1 # entry in intout
contrl+12contrl[6]handle
intinintin[0]color_index
intoutintout[0]Return value
+
+ + +
+ +

7.4.6.11 vsf_fg_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set foreground colour« - Set the foreground colour for a +filled object. +
  +
Opcode: 200 (Sub-Opcode 1) +
  +
Syntax: int16_t vsf_fg_color ( int16_t handle, int32_t color_space, +COLOR_ENTRY *fg_color ); +
  +
Description: This function sets the foreground colour for a filled +2-dimensional graphic object. +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
color_space Colour space (at present only 0 for the colour space set, or +CSPACE_RGB) +
fg_color COLOR_ENTRY of the foreground colour + +
+ +
Return value: -1 = Wrong subfunction number +
 0 = Function not present +
 1 = All OK +
  +
Availability: As of NVDI 5.00. +
  +
Group: Fill attributes +
  +
See also: Binding +
  + +
+ +

7.4.6.12 Bindings for vsf_fg_color

+ + + + + + + + + +
C: int16_t vsf_fg_color ( int16_t handle, int32_t color_space, +COLOR_ENTRY *fg_color ); +
  +
Binding: +
  +
int16_t vsf_fg_color( int16_t handle, int32_t color_space,
+                      COLOR_ENTRY *fg_color )
+{
+   intin[0..1] = color_space;
+   intin[2..5] = fg_color;
+
+   contrl[0] = 200;
+   contrl[1] = 0;
+   contrl[3] = 6;
+   contrl[5] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]200 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]6 # entry in intin
contrl+8contrl[4]1 # entry in intout
contrl+10contrl[5]1
contrl+12contrl[6]handle
intinintin[0..1]color_space
intin+4intin[2..5]fg_color
intoutintout[0]Return Value
+
+ + +
+ +

7.4.6.13 vsf_interior

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set fill interior style« - Set the fill-pattern type. +
  +
Opcode: 23 +
  +
Syntax: int16_t vsf_interior ( int16_t handle, int16_t style ); +
  +
Description: This function selects the fill-pattern type for a filled +2-dimensional graphic object. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
style Requested fill type + + + + + + + + + + + + + + + +
0 = Hollow +
1 = Solid +
2 = Pattern +
3 = Hatch +
4 = User-defined style + +
+ + +
+ +
Note: If the requested type is invalid, type 0 (hollow) +will be selected. +
  +
Return value: The function returns the fill-type actually selected. +
  +
Availability: Supported by all drivers. +
  +
Group: Fill attributes +
  +
See also: Binding   v_fillarea   v_contourfill   vr_recfl   v_bar   +v_pieslice   v_circle   v_ellipse   v_ellpie   v_rfbox   vsf_style   +vsf_udpat +
  + +
+ +

7.4.6.14 Bindings for vsf_interior

+ + + + + + + + + +
C: int16_t vsf_interior ( int16_t handle, int16_t style ); +
  +
Binding: +
  +
int16_t vsf_interior (int16_t handle, int16_t style)
+{
+   intin[0] = style;
+
+   contrl[0] = 23;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]23 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]1 # entry in intin
contrl+8contrl[4]1 # entry in intout
contrl+12contrl[6]handle
intinintin[0]style
intoutintout[0]Return Value
+
+ + +
+ +

7.4.6.15 vsf_perimeter

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set fill perimeter visibility« - Determine whether an +outline is to be drawn around filled areas. +
  +
Opcode: 104 +
  +
Syntax: int16_t vsf_perimeter ( int16_t handle, int16_t per_vis ); +
  +
Description: This function turns the outline border of a filled area +(rectangle, polygon, ellipse, ...) on or off. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
per_vis Visibility flag: + + + + + + +
   0 = Invisible +
<> 0 = Visible + +
+ + +
+ +
Note: With outlining activated (default), the border +will be drawn in the current fill colour and as a continuous line. +
  +
Return value: The function returns the mode actually set. +
  +
Availability: Supported by all drivers. +
  +
Group: Fill attributes +
  +
See also: Binding   vsf_xperimeter   v_fillarea   v_contourfill   vr_recflv_bar   v_pieslice   v_circle   v_ellipse   v_ellpie   v_rfbox +
  + +
+ +

7.4.6.16 Bindings for vsf_perimeter

+ + + + + + + + + +
C: int16_t vsf_perimeter ( int16_t handle, int16_t per_vis ); +
  +
Binding: +
  +
int16_t vsf_perimeter (int16_t handle, int16_t per_vis)
+{
+   intin[0] = per_vis;
+
+   contrl[0] = 104;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]104 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]1 # entry in intin
contrl+8contrl[4]1 # entry in intout
contrl+12contrl[6]handle
intinintin[0]per_vis
intoutintout[0]Return Value
+
+ + +
+ +

7.4.6.17 vsf_style

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set fill style index« - Set the fill-pattern. +
  +
Opcode: 24 +
  +
Syntax: int16_t vsf_style ( int16_t handle, int16_t style_index ); +
  +
Description: The call vsf_style determines the fill-pattern. The following +apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
style_index Index + +
+ +
Note: The function can only be used sensibly when the +fill type was not chosen as empty, opaque or user-defined. +Unavailable indices are replaced by pattern index 1. +
  +
Return value: The function returns the fill-pattern actually set. +
  +
Availability: Supported by all drivers. +
  +
Group: Fill attributes +
  +
See also: Binding   v_fillarea   v_contourfill   vr_recfl   v_bar   +v_pieslice   v_circle   v_ellipse   v_ellpie   v_rfbox   vsf_interior +
  + +
+ +

7.4.6.18 Bindings for vsf_style

+ + + + + + + + + +
C: int16_t vsf_style ( int16_t handle, int16_t style_index ); +
  +
Binding: +
  +
int16_t vsf_style (int16_t handle, int16_t style_index)
+{
+   intin[0] = style_index;
+
+   contrl[0] = 24;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]24 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]1 # entry in intin
contrl+8contrl[4]1 # entry in intout
contrl+12contrl[6]handle
intinintin[0]style_index
intoutintout[0]Return Value
+
+ + +
+ +

7.4.6.19 vsf_udpat

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set user-defined fill-pattern« - Define a new fill-pattern. +
  +
Opcode: 112 +
  +
Syntax: void vsf_udpat ( int16_t handle, int16_t *pfill_pat, int16_t +planes ); +
  +
Description: The call vsf_udpat sets up a new fill-pattern, freely defined +by the user. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
pfill_pat Pointer to an array of 16 * planes WORDs that define +the bit pattern for a line of the fill +
planes Number of colour planes + +
+ +
Notes: Each line reproduces the fill-pattern for one +colour plane. The first entry of a line corresponds here to the first +line of the pattern, etc. +
  +
Patterns with multiple colours have to be stored in standard +format and must have the same number of planes as the device. +Exception: If the device is a HiColor or TrueColor device (direct +colour mapping) you always pass a pattern width of 32-bit pixels +(xrgb) and pfill_pat points to a 16 * 16 array of LONGs. +
  +
If you use a pattern with multiple colours you should select +colour index 1 and writing mode REPLACE. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all drivers. +
  +
Group: Fill attributes +
  +
See also: Binding   vsf_interior +
  + +
+ +

7.4.6.20 Bindings for vsf_udpat

+ + + + + + + + + +
C: void vsf_udpat ( int16_t handle, int16_t *pfill_pat, int16_t +planes ); +
  +
Binding: +
  +
void vsf_udpat (int16_t handle, int16_t *pfill_pat,
+                int16_t planes)
+{
+   intin[0..16n-1] = pfill_pat[0..16n-1];
+
+   contrl[0] = 112;
+   contrl[1] = 0;
+   contrl[3] = planes * 16;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]112 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]16*n # entry in intin
contrl+8contrl[4]0 # entry in intout
contrl+12contrl[6]handle
intinintin[0]pfill_pat[0]
.........
.........
intin+32n-2intin[16n-1]pfill_pat[16n-1]
+
+ + +
+ +

7.4.6.21 vsf_xperimeter

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set fill perimeter visibility« - Determine whether an +outline is to be drawn round filled areas. +
  +
Opcode: 104 +
  +
Syntax: int16_t vsf_xperimeter ( int16_t handle, int16_t on_off, +int16_t f_or_l ); +
  +
Description: This function turns the outline border of a filled area +(rectangle, polygon, ellipse, ...) on or off and sets the line style +for the perimeter outline. +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
on_off Desired mode: + + + + + + + + + +
   0 = Turn perimeter outlining off +
   1 = Turn perimeter outlining on +
  -1 = Do not change perimeter outlining + +
+ +
f_or_l Line type, as for vsl_type: + + + + + + +
  0 = Use normal fill colour for perimeter +
  1 = Use line style attributes for perimeter + +
+ + +
+ +
Return value: The function returns the mode actually set. +
  +
Availability: GEM/3 Release 3.1 +
  +
Group: Fill attributes +
  +
See also: Binding   vsf_perimeter   v_fillarea   v_contourfill   vr_recflv_bar   v_pieslice   v_circle   v_ellipse   v_ellpie   v_rfbox +
  + +
+ +

7.4.6.22 Bindings for vsf_xperimeter

+ + + + + + + + + +
C: int16_t vsf_xperimeter ( int16_t handle, int16_t on_off, +int16_t f_or_l ); +
  +
Binding: +
  +
int16_t vsf_xperimeter (int16_t handle, int16_t on_off,
+                        int16_t f_or_l )
+{
+   intin[0] = on_off;
+   intin[1] = f_or_l;
+
+   contrl[0] = 104;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]104 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]2 # entry in intin
contrl+8contrl[4]1 # entry in intout
contrl+12contrl[6]handle
intinintin[0]on_off
intin+2intin[1]f_or_l
intoutintout[0]Return Value
+
+ + +
+ +

7.4.6.23 vsl_bg_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set background colour« - Set background colour for lines. +
  +
Opcode: 201 (Sub-Opcode 2) +
  +
Syntax: int16_t vsl_bg_color ( int16_t handle, int32_t color_space, +COLOR_ENTRY *fg_color ); +
  +
Description: The call vsl_bg_color sets the background colour for drawn +lines. +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
color_space Colour space (at present only 0 for the colour space set, or +CSPACE_RGB) +
fg_color COLOR_ENTRY of the background colour + +
+ +
Return value: -1 = Wrong subfunction number +
 0 = Function not present +
 1 = All OK +
  +
Availability: NVDI 5.00 onwards. +
  +
Group: Lines attributes +
  +
See also: Binding +
  + +
+ +

7.4.6.24 Bindings for vsl_bg_color

+ + + + + + + + + +
C: int16_t vsl_bg_color ( int16_t handle, int32_t color_space, +COLOR_ENTRY *fg_color ); +
  +
Binding: +
  +
int16_t vsl_bg_color( int16_t handle, int32_t color_space,
+                      COLOR_ENTRY *fg_color )
+{
+   intin[0..1] = color_space;
+   intin[2..5] = fg_color;
+
+   contrl[0] = 201;
+   contrl[1] = 0;
+   contrl[3] = 6;
+   contrl[5] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]201 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]6 # entry in intin
contrl+8contrl[4]1 # entry in intout
contrl+10contrl[5]2
contrl+12contrl[6]handle
intinintin[0..1]color_space
intin+4intin[2..5]fg_color
intoutintout[0]Return Value
+
+ + +
+ +

7.4.6.25 vsl_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set polyline colour index« - Set the line colour. +
  +
Opcode: 17 +
  +
Syntax: int16_t vsl_color ( int16_t handle, int16_t color_index ); +
  +
Description: The call vsl_color sets the colour index for lines. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
color_index Line colour + +
+ +
Note: The colour indices 0 and 1 are available on all +devices; all other values depend on the output device being used at +the time. +
  +
If the index is invalid, colour index 1 will be selected. +
  +
Return value: The function returns the line colour actually set. +
  +
Availability: Supported by all devices. +
  +
Group: Lines attributes +
  +
See also: Binding   v_pline   v_arc   v_ellarc   v_rbox +
  + +
+ +

7.4.6.26 Bindings for vsl_color

+ + + + + + + + + +
C: int16_t vsl_color ( int16_t handle, int16_t color_index ); +
  +
Binding: +
  +
int16_t vsl_color (int16_t handle, int16_t color_index)
+{
+   intin[0] = color_index;
+
+   contrl[0] = 17;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]17 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]1 # entry in intin
contrl+8contrl[4]1 # entry in intout
contrl+12contrl[6]handle
intinintin[0]color_index
intoutintout[0]Return Value
+
+ + +
+ +

7.4.6.27 vsl_ends

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set polyline end styles« - Set the shape of line ends. +
  +
Opcode: 108 +
  +
Syntax: void vsl_ends ( int16_t handle, int16_t beg_style, int16_t +end_style ); +
  +
Description: The call vsl_ends sets the appearance of the line ends. The +following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning Symbole +
    +
handle Workstation identifier +
beg_style End style for the first point: +
+

+ + + + + + + + + +
0 = Squared (default) +
1 = Arrowed +
2 = Rounded + +
+ +
end_style End style for the last point (as above) + +
+ +
Note: Both the squared style and the arrow style end at +the end of the polyline. The rounded style is drawn such that the +center of the rounding is at the end of the polyline. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all devices. +
  +
Group: Lines attributes +
  +
See also: Binding   v_pline   v_arc   v_ellarc   v_rbox +
  + +
+ +

7.4.6.28 Bindings for vsl_ends

+ + + + + + + + + +
C: void vsl_ends ( int16_t handle, int16_t beg_style, int16_t +end_style ); +
  +
Binding: +
  +
void vsl_ends (int16_t handle, int16_t beg_style,
+               int16_t end_style)
+{
+   intin[0] = beg_style;
+   intin[1] = end_style;
+
+   contrl[0] = 108;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]108 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]2 # entry in intin
contrl+8contrl[4]0 # entry in intout
contrl+12contrl[6]handle
intinintin[0]beg_style
intin+2intin[1]end_style
+
+ + +
+ +

7.4.6.29 vsl_fg_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set foreground colour« - Set foreground colour for lines. +
  +
Opcode: 200 (Sub-Opcode 2) +
  +
Syntax: int16_t vsl_fg_color ( int16_t handle, int32_t color_space, +COLOR_ENTRY *fg_color ); +
  +
Description: The call vsl_fg_color sets the foreground colour for drawn +lines. +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
color_space Colour space (at present only 0 for the colour space set, or +CSPACE_RGB) +
fg_color COLOR_ENTRY of the foreground colour + +
+ +
Return value: -1 = Wrong subfunction number +
 0 = Function not present +
 1 = All OK +
  +
Availability: NVDI 5.00 onwards. +
  +
Group: Lines attributes +
  +
See also: Binding +
  + +
+ +

7.4.6.30 Bindings for vsl_fg_color

+ + + + + + + + + +
C: int16_t vsl_fg_color ( int16_t handle, int32_t color_space, +COLOR_ENTRY *fg_color ); +
  +
Binding: +
  +
int16_t vsl_fg_color( int16_t handle, int32_t color_space,
+                      COLOR_ENTRY *fg_color )
+{
+   intin[0..1] = color_space;
+   intin[2..5] = fg_color;
+
+   contrl[0] = 200;
+   contrl[1] = 0;
+   contrl[3] = 6;
+   contrl[5] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]200 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]6 # entry in intin
contrl+8contrl[4]1 # entry in intout
contrl+10contrl[5]2
contrl+12contrl[6]handle
intinintin[0..1]color_space
intin+4intin[2..5]fg_color
intoutintout[0]Return value
+
+ + +
+ +

7.4.6.31 vsl_type

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set polyline type« - Set the line type. +
  +
Opcode: 15 +
  +
Syntax: int16_t vsl_type ( int16_t handle, int16_t style ); +
  +
Description: The call vsl_type sets the line type for polyline operations. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
style Requested line type: + + + + + + + + + + + + + + + + + + + + + +
1 = Solid +
2 = Long dash +
3 = Dot +
4 = Dash,dot +
5 = Dash +
6 = Dash,dot,dot +
7 = User-defined, vsl_udsty + +
+ + +
+ +
Note: Line types from the value 8 on depend on the +output device in each case. If the requested line type is not +available, line type 1 will be selected (solid). +
  +
You can obtain the available line types with the function +vq_extnd. +
  +
Return value: The function returns the line type actually set. +
  +
Availability: Supported by all devices. +
  +
Group: Lines attributes +
  +
See also: Binding   v_pline   v_arc   v_ellarc   v_rbox   vsl_udsty +
  + +
+ +

7.4.6.32 Bindings for vsl_type

+ + + + + + + + + +
C: int16_t vsl_type ( int16_t handle, int16_t style ); +
  +
Binding: +
  +
int16_t vsl_type (int16_t handle, int16_t style)
+{
+   intin[0] = style;
+
+   contrl[0] = 15;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]15 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]1 # entry in intin
contrl+8contrl[4]1 # entry in intout
contrl+12contrl[6]handle
intinintin[0]style
intin+2intin[1]Return Value
+
+ + +
+ +

7.4.6.33 vsl_udsty

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set user-defined line style pattern« +
  +
Opcode: 113 +
  +
Syntax: void vsl_udsty ( int16_t handle, int16_t pattern ); +
  +
Description: The call vsl_udsty sets the freely-definable line style for +vsl_type. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
pattern Line style pattern WORD, 16 bits + +
+ +
Note: The Most Significant Bit (MSB) of the +pattern WORD is the first pixel in the line. The default value +is a completely solid line. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all devices. +
  +
Group: Lines attributes +
  +
See also: Binding   vsl_type +
  + +
+ +

7.4.6.34 Bindings for vsl_udsty

+ + + + + + + + + +
C: void vsl_udsty ( int16_t handle, int16_t pattern ); +
  +
Binding: +
  +
void vsl_udsty (int16_t handle, int16_t pattern)
+{
+   intin[0] = pattern;
+
+   contrl[0] = 113;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]113 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]1 # entry in intin
contrl+8contrl[4]0 # entry in intout
contrl+12contrl[6]handle
intinintin[0]pattern
+
+ + +
+ +

7.4.6.35 vsl_width

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set polyline width« +
  +
Opcode: 16 +
  +
Syntax: int16_t vsl_width ( int16_t handle, int16_t width ); +
  +
Description: The call vsl_width sets the line width for lines and +perimeters. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
width Line width (must be odd!) + +
+ +
Note: The width of the line always refers to the +coordinates in the X-direction. As the VDI can only draw lines an +odd number of pixels thick, the actually set width is smaller or equal +to the selected width as values will be rounded down to the nearest +odd number. The function is not available on all output +devices. +
  +
Most device drivers ignore the line type and draw solid lines if +the line is more than one pixel wide. +
  +
Return value: The function returns the line width actually set. +
  +
Availability: Supported by all devices. +
  +
Group: Lines attributes +
  +
See also: Binding   v_pline   v_arc   v_ellarc   v_rbox +
  + +
+ +

7.4.6.36 Bindings for vsl_width

+ + + + + + + + + +
C: int16_t vsl_width ( int16_t handle, int16_t width ); +
  +
Binding: +
  +
int16_t vsl_width (int16_t handle, int16_t width)
+{
+   ptsin[0] = width;
+   ptsin[1] = 0;
+
+   contrl[0] = 16;
+   contrl[1] = 1;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( ptsout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]16 # Function Opcode
contrl+2contrl[1]1 # entry in ptsin
contrl+4contrl[2]1 # entry in ptsout
contrl+6contrl[3]0 # entry in intin
contrl+8contrl[4]0 # entry in intout
contrl+12contrl[6]handle
ptsinptsin[0]width
ptsin+2ptsin[1]0
ptsoutptsout[0]Return value
ptsout+2ptsout[1]0
+
+ + +
+ +

7.4.6.37 v_bez_qual

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Bezier quality« - Set quality of the Bezier spline +creation. +
  +
Opcode: 5 (Escape 99, Opcode 32) +
  +
Syntax: int16_t v_bez_qual ( int16_t handle, int16_t qual, int16_t +*set_qual ); +
  +
Description: The call v_bez_qual sets a new factor that determines the +quality and speed with which Bezier splines are drawn. The following +apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
qual Requested Bezier quality +
set_qual Realized Bezier quality (not available with GEM/3 Release +3.1). + +
+ +
Note: The quality of the Beziers can be set as usual in +percent (i.e. from 0 to 100), where 0 is fastest but produces the +lowest quality while 100 is slowest with the highest possible quality. +set_qual may not be an exact percentage as the rendering +engine may not support every possible value between 1 and 99. +
  +
Return value: The function returns the quality factor actually set. +
  +
The GEM/3 and NVDI bindings also returns set_qual. +
  +
Availability: As of GEM/3 Release 3.1, SpeedoGDOS 4.00 onwards and NVDI +2.10 onwards. +
  +
Group: Lines attributes +
  +
See also: Binding   v_bez_on   v_bez_off   v_bez   v_bez_fill   +v_set_app_buff +
  + +
+ +

7.4.6.38 Bindings for v_bez_qual

+ + + + + + + + + +
C: int16_t v_bez_qual ( int16_t handle, int16_t qual, int16_t +*set_qual ); +
  +
Für GEM/3 Release 3.1 gilt: +
int16_t v_bez_qual ( int16_t handle, int16_t qual ); +
  +
Binding: +
  +
int16_t v_bez_qual (int16_t handle, int16_t qual,
+                    int16_t *set_qual)
+{
+   intin[0] = 32;
+   intin[1] = 1;
+   intin[2] = qual;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 3;
+   contrl[5] = 99;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *set_qual = intout[0];
+
+   return intout[0];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]3 # entry in intin
contrl+8contrl[4]1 # entry in intout
contrl+10contrl[5]99 Sub-Opcode
contrl+12contrl[6]handle
intinintin[0]32
intin+2intin[1]1
intin+4intin[2]qual
intoutintout[0]set_qual
+
+ + +
+ +

7.4.6.39 vsm_bg_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set background colour« - Set background colour for markers. +
  +
Opcode: 201 (Sub-Opcode 3) +
  +
Syntax: int16_t vsm_bg_color ( int16_t handle, int32_t color_space, +COLOR_ENTRY *fg_color ); +
  +
Description: The call vsm_bg_color sets the background colour for markers. +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
color_space Colour space (at present only 0 for the colour space set, or +CSPACE_RGB) +
fg_color COLOR_ENTRY of the background colour + +
+ +
Return value: -1 = Wrong subfunction number +
 0 = Function not present +
 1 = All OK +
  +
Availability: NVDI 5.00 onwards. +
  +
Group: Marker attributes +
  +
See also: Binding +
  + +
+ +

7.4.6.40 Bindings for vsm_bg_color

+ + + + + + + + + +
C: int16_t vsm_bg_color ( int16_t handle, int32_t color_space, +COLOR_ENTRY *fg_color ); +
  +
Binding: +
  +
int16_t vsm_bg_color( int16_t handle, int32_t color_space,
+                      COLOR_ENTRY *fg_color )
+{
+   intin[0..1] = color_space;
+   intin[2..5] = fg_color;
+
+   contrl[0] = 201;
+   contrl[1] = 0;
+   contrl[3] = 6;
+   contrl[5] = 3;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]201 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]6 # entry in intin
contrl+8contrl[4]1 # entry in intout
contrl+10contrl[5]3
contrl+12contrl[6]handle
intinintin[0..1]color_space
intin+4intin[2..5]fg_color
intoutintout[0]Return value
+
+ + +
+ +

7.4.6.41 vsm_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set polymarker colour index« - Set the colour of the marker +points. +
  +
Opcode: 20 +
  +
Syntax: int16_t vsm_color ( int16_t handle, int16_t color_index ); +
  +
Description: The call vsm_color sets the colour of the markers. The +following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
color_index Marker colour + +
+ +
Note: The colour indices 0 and 1 are always available, +all further ones depend on the output device. If the index is invalid, +colour index 1 will be selected. +
  +
Return value: The function returns the colour index actually selected. +
  +
Availability: Supported by all devices. +
  +
Group: Marker attributes +
  +
See also: Binding   v_pmarker +
  + +
+ +

7.4.6.42 Bindings for vsm_color

+ + + + + + + + + +
C: int16_t vsm_color ( int16_t handle, int16_t color_index ); +
  +
Binding: +
  +
int16_t vsm_color (int16_t handle, int16_t color_index)
+{
+   intin[0] = color_index;
+
+   contrl[0] = 20;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]20 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]1 # entry in intin
contrl+8contrl[4]1 # entry in intout
contrl+12contrl[6]handle
intinintin[0]color_index
intoutintout[0]Return Value
+
+ + +
+ +

7.4.6.43 vsm_fg_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set foreground colour« - Set foreground colour for markers. +
  +
Opcode: 200 (Sub-Opcode 3) +
  +
Syntax: int16_t vsm_fg_color ( int16_t handle, int32_t color_space, +COLOR_ENTRY *fg_color ); +
  +
Description: The call vsm_fg_color sets the foreground colour for markers. +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
color_space Colour space (at present only 0 for the colour space set, or +CSPACE_RGB) +
fg_color COLOR_ENTRY of the foreground colour + +
+ +
Return value: -1 = Wrong subfunction number +
 0 = Function not present +
 1 = All OK +
  +
Availability: NVDI 5.00 onwards. +
  +
Group: Marker attributes +
  +
See also: Binding +
  + +
+ +

7.4.6.44 Bindings for vsm_fg_color

+ + + + + + + + + +
C: int16_t vsm_fg_color ( int16_t handle, int32_t color_space, +COLOR_ENTRY *fg_color ); +
  +
Binding: +
  +
int16_t vsm_fg_color( int16_t handle, int32_t color_space,
+                      COLOR_ENTRY *fg_color )
+{
+   intin[0..1] = color_space;
+   intin[2..5] = fg_color;
+
+   contrl[0] = 200;
+   contrl[1] = 0;
+   contrl[3] = 6;
+   contrl[5] = 3;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]200 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]6 # entry in intin
contrl+8contrl[4]1 # entry in intout
contrl+10contrl[5]3
contrl+12contrl[6]handle
intinintin[0..1]color_space
intin+4intin[2..5]fg_color
intoutintout[0]Return value
+
+ + +
+ +

7.4.6.45 vsm_height

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set polymarker height« - Set height of the marker object. +
  +
Opcode: 19 +
  +
Syntax: int16_t vsm_height ( int16_t handle, int16_t height ); +
  +
Description: The call vsm_height sets the current marker height. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
height Requested polymarker height (pixels) + +
+ +
The number of available heights can be obtained during opening +of the virtual workstation with v_opnvwk. +
  +
Note: The width of the markers is adapted automatically. +If an invalid height is chosen, the VDI selects the next suitable +one. The dot's size can not be altered, it is always one pixel +high and wide. +
  +
Return value: The function returns the size actually selected. +
  +
Availability: Supported by all devices. +
  +
Group: Marker attributes +
  +
See also: Binding   v_pmarker +
  + +
+ +

7.4.6.46 Bindings for vsm_height

+ + + + + + + + + +
C: int16_t vsm_height ( int16_t handle, int16_t height ); +
  +
Binding: +
  +
int16_t vsm_height (int16_t handle, int16_t height)
+{
+   ptsin[0] = 0;
+   ptsin[1] = height;
+
+   contrl[0] = 19;
+   contrl[1] = 1;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( ptsout[1] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]19 # Function Opcode
contrl+2contrl[1]1 # entry in ptsin
contrl+4contrl[2]1 # entry in ptsout
contrl+6contrl[3]0 # entry in intin
contrl+8contrl[4]0 # entry in intout
contrl+12contrl[6]handle
ptsinptsin[0]0
ptsin+2ptsin[1]height
ptsoutptsout[0]set_height_x
ptsout+2ptsout[1]Return Value
+
+ +
Note: The component set_height_x describes the +selected marker height with reference to the X-direction; PC-GEM +always returns the value 0. +
  + +
+ +

7.4.6.47 vsm_type

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set polymarker type« - Set the type of the marker object. +
  +
Opcode: 18 +
  +
Syntax: int16_t vsm_type ( int16_t handle, int16_t typ ); +
  +
Description: The call vsm_type determines the appearance of the current +marker. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning Symbole +
    +
handle Workstation identifier +
typ Polymarker type: +

+ + + + + + + + + + + + + + + + + + + + + +
1 = Dot +
2 = Plus +
3 = Asterisk +
4 = Square +
5 = Diagonal cross +
6 = Diamond +
7 ... n = Device-dependent + +
+ + +
+ +
Note: If the requested marker type is out of range, the +GEM VDI will use an asterisk, type 3. Marker 1 is the smallest dot that +GEM VDI can depict on the device (usually one pixel); it cannot be +scaled. +
  +
Return value: The function returns the marker actually selected. +
  +
Availability: Supported by all devices. +
  +
Group: Marker attributes +
  +
See also: Binding   v_pmarker   vsm_height +
  + +
+ +

7.4.6.48 Bindings for vsm_type

+ + + + + + + + + +
C: int16_t vsm_type ( int16_t handle, int16_t typ ); +
  +
Binding: +
  +
int16_t vsm_type (int16_t handle, int16_t typ)
+{
+   intin[0] = typ;
+
+   contrl[0] = 18;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]18 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]1 # entry in intin
contrl+8contrl[4]1 # entry in intout
contrl+12contrl[6]handle
intinintin[0]type
intoutintout[0]Return value
+
+ + +
+ +

7.4.6.49 vst_alignment

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set graphic text alignment« - Set the alignment for normal +and justified text output. +
  +
Opcode: 39 +
  +
Syntax: void vst_alignment ( int16_t handle, int16_t hor_in, int16_t +vert_in, int16_t *hor_out, int16_t *vert_out ); +
  +
Description: The call vst_alignment determines the horizontal and vertical +alignment of a text. +
  +
Example: +
  +

+
The function is passed the following Parameters: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
hor_in Horizontal alignment: + + + + + + + + + +
0 = Left justified (default) +
1 = Centered +
2 = Right justified + +
+ +
vert_in Vertical alignment: + + + + + + + + + + + + + + + + + + +
0 = Baseline (default) +
1 = Half line +
2 = Ascent line +
3 = Bottom line +
4 = Descent line +
5 = Top line + +
+ +
hor_out Selected horizontal alignment +
vert_out Selected vertical alignment + +
+ +
Note: The default setting is the left edge of the +baseline. For an invalid input for the horizontal alignment, the text +is flushed left ('left-justified'). For an invalid input for the +vertical alignment, the text will be aligned on the baseline. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all drivers. +
  +
Group: Text attributes +
  +
See also: Binding   v_gtext   v_justified +
  + +
+ +

7.4.6.50 Bindings for vst_alignment

+ + + + + + + + + +
C: void vst_alignment ( int16_t handle, int16_t hor_in, int16_t +vert_in, int16_t *hor_out, int16_t *vert_out ); +
  +
Binding: +
  +
void vst_alignment (int16_t handle, int16_t hor_in,
+                    int16_t vert_in, int16_t *hor_out,
+                    int16_t *vert_out)
+{
+   intin[0] = hor_in;
+   intin[1] = vert_in;
+
+   contrl[0] = 39;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *hor_out  = intout[0];
+   *vert_out = intout[1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]39 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]2 # entry in intin
contrl+8contrl[4]2 # entry in intout
contrl+12contrl[6]handle
intinintin[0]hor_in
intin+2intin[1]vert_in
intoutintout[0]hor_out
intout+2intout[1]vert_out
+
+ + +
+ +

7.4.6.51 vst_arbpt

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set character cell height in arbitrary points« - Set the +character cell height in points. +
  +
Opcode: 246 +
  +
Syntax: int16_t vst_arbpt ( int16_t handle, int16_t point, int16_t +*chwd, int16_t *chht, int16_t *cellwd, int16_t *cellht ); +
  +
Description: The call vst_arbpt sets the current character height for an +outline font in printer points. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
point Desired character height +
chwd Resulting character width +
chht Resulting character height +
cellwd Resulting character cell width +
cellht Resulting character cell height + +
+ +
Notes: In contrast to vst_point, the function permits +the scaling to any integer point size, irrespective of the +sizes listed in EXTEND.SYS. If you want to set a fractional point +size, use vst_arbpt32. +
  +
If negative values are set, the characters will be mirrored +(reflected) about the X-axis. +
  +
The returned character widths are rounded-off values, which +cannot be used without more ado for calculating overall text widths. +
  +
Return value: The function returns the character height set in points. +
  +
Availability: With FSM-GDOS, and SpeedoGDOS Version 4.00 onwards. +
  +
Group: Text attributes +
  +
See also: Binding   vst_arbpt32   vst_point   vst_setsize   SpeedoGDOS   +NVDI +
  + +
+ +

7.4.6.52 Bindings for vst_arbpt

+ + + + + + + + + +
C: int16_t vst_arbpt ( int16_t handle, int16_t point, int16_t +*chwd, int16_t *chht, int16_t *cellwd, int16_t *cellht ); +
  +
Binding: +
  +
int16_t vst_arbpt (int16_t handle, int16_t point,
+                   int16_t *chwd, int16_t *chht,
+                   int16_t *cellwd, int16_t *cellht)
+{
+   intin[0] = point;
+
+   contrl[0] = 246;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *chwd   = ptsout[0];
+   *chht   = ptsout[1];
+   *cellwd = ptsout[2];
+   *cellht = ptsout[3];
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]246 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]2 # entry in ptsout
contrl+6contrl[3]1 # entry in intin
contrl+8contrl[4]1 # entry in intout
contrl+12contrl[6]handle
intinintin[0]point
ptsoutptsout[0]chwd
ptsout+2ptsout[1]chht
ptsout+4ptsout[2]cellwd
ptsout+6ptsout[3]cellht
intoutintout[0]Return value
+
+ + +
+ +

7.4.6.53 vst_arbpt32

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set character cell height in arbitrary points« - Set the +character cell height in points for an outline font. +
  +
Opcode: 246 +
  +
Syntax: fix31 vst_arbpt32 ( int16_t handle, fix31 point, int16_t *chwd, +int16_t *chht, int16_t *cellwd, int16_t *cellht ); +
  +
Description: The call vst_arbpt32 sets the current character height for an +outline font in printer points, and can include fractional sizes. The +following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
point Desired character height +
chwd Resulting character width +
chht Resulting character height +
cellwd Resulting character cell width +
cellht Resulting character cell height + +
+ +
Notes: In contrast to vst_point, the function permitsthe +scaling to any point size, irrespective of the values listed +in EXTEND.SYS. +
  +
If negative values are set, the characters will be mirrorred +(reflected) about the X-axis. +
  +
The returned character widths are rounded-off values, which +cannot be used without more ado for calculating overall text widths. +
  +
Return value: The function returns the character height actually set in +1/65536 of a point. +
  +
This is not clear from the SpeedoGDOS documentation. It's +possible that only the character height in points is returned. +
  +
Availability: With FSM-GDOS, SpeedoGDOS as of Version 4.00, and NVDI 3.00 +onwards. In the documentation for NVDI 3.00 this function is wrongly +called vst_arbpt. +
  +
Group: Text attributes +
  +
See also: Binding   vst_point   vst_setsize   SpeedoGDOS   NVDI +
  + +
+ +

7.4.6.54 Bindings for vst_arbpt32

+ + + + + + + + + +
C: fix31 vst_arbpt32 ( int16_t handle, fix31 point, int16_t *chwd, +int16_t *chht, int16_t *cellwd, int16_t *cellht ); +
  +
Binding: +
  +
fix31 vst_arbpt32 (int16_t handle, fix31 point,
+                   int16_t *chwd, int16_t *chht,
+                   int16_t *cellwd, int16_t *cellht)
+{
+   intin[0..1] = point;
+
+   contrl[0] = 246;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *chwd   = ptsout[0];
+   *chht   = ptsout[1];
+   *cellwd = ptsout[2];
+   *cellht = ptsout[3];
+
+   return ( intout[0..1] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]246 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]2 # entry in ptsout
contrl+6contrl[3]2 # entry in intin
contrl+8contrl[4]2 # entry in intout
contrl+12contrl[6]handle
intinintin[0..1]point
intoutintout[0..1]Return value
ptsoutptsout[0]chwd
ptsout+2ptsout[1]chht
ptsout+4ptsout[2]cellwe
ptsout+6ptsout[3]cellht
+
+ + +
+ +

7.4.6.55 vst_bg_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set background color« - Set background colour for text. +
  +
Opcode: 201 (Sub-Opcode 0) +
  +
Syntax: int16_t vst_bg_color ( int16_t handle, int32_t color_space, +COLOR_ENTRY *fg_color ); +
  +
Description: The call vst_bg_color sets the background colour for text. +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
color_space Colour space (at present only 0 for the colour space set, or +CSPACE_RGB) +
fg_color COLOR_ENTRY of the background colour + +
+ +
Return value: -1 = Wrong subfunction number +
 0 = Function not present +
 1 = All OK +
  +
Availability: NVDI 5.00 onwards. +
  +
Group: Text attributes +
  +
See also: Binding +
  + +
+ +

7.4.6.56 Bindings for vst_bg_color

+ + + + + + + + + +
C: int16_t vst_bg_color ( int16_t handle, int32_t color_space, +COLOR_ENTRY *fg_color ); +
  +
Binding: +
  +
int16_t vst_bg_color( int16_t handle, int32_t color_space,
+                      COLOR_ENTRY *fg_color )
+{
+   intin[0..1] = color_space;
+   intin[2..5] = fg_color;
+
+   contrl[0] = 201;
+   contrl[1] = 0;
+   contrl[3] = 6;
+   contrl[5] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]201 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]6 # entry in intin
contrl+8contrl[4]1 # entry in intout
contrl+10contrl[5]0
contrl+12contrl[6]handle
intinintin[0..1]color_space
intin+4intin[2..5]fg_color
intoutintout[0]Return value
+
+ + +
+ +

7.4.6.57 vst_charmap

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set character mapping mode« - Select the type of font +indexing. +
  +
Opcode: 236 +
  +
Syntax: void vst_charmap ( int16_t handle, int16_t mode ); +
  +
Description: The call vst_charmap sets the type of font indexing, offering a +choice between the standard Atari ASCII interpretation of text strings +or the Bitstream character indices. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
mode Mapping mode: + + + + + + +
0 = Direct mapping (WORD), i.e. no translation of the character +index +
1 = ASCII mapping (byte-sized) + +
+ + +
+ +
For SpeedoGDOS the following applies: +
  + + + +
mode Type of indexing: + + + + + + +
0 = Atari characters +
1 = Bitstream + +
+ + +
+ +
Note: If you switch to direct mapping, the number of +characters per font (minADE and maxADE/vqt_fontinfo) +is changed to the number of really existing characters. +
  +
As of NVDI 4.00 there is an extended version: vst_map_mode +
  +
Return value: The function does not return a result. +
  +
Availability: SpeedoGDOS 4.0, NVDI 3.00 +
  +
Group: Text attributes +
  +
See also: Binding   vst_map_mode   vqt_fontinfo   ASCII table +
  + +
+ +

7.4.6.58 Bindings for vst_charmap

+ + + + + + + + + +
C: void vst_charmap ( int16_t handle, int16_t mode ); +
  +
Binding: +
  +
void vst_charmap (int16_t handle, int16_t mode)
+{
+   intin[0] = mode;
+
+   contrl[0] = 236;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]236 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]1 # entry in intin
contrl+8contrl[4]0 # entry in intout
contrl+12contrl[6]handle
intinintin[0]mode
+
+ + +
+ +

7.4.6.59 vst_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set graphic text colour index« - Set the colour of the text +output. +
  +
Opcode: 22 +
  +
Syntax: int16_t vst_color ( int16_t handle, int16_t color_index ); +
  +
Description: The call vst_color sets the colour index for subsequent graphic +text operations. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
color_index Requested text colour index + +
+ +
Note: All devices support at least two colour indices, 0 +and 1 (monochrome). All others depend on the output device in use. If +an invalid index is specified then the value 1 will be assumed. +
  +
Return value: The function returns the colour actually set. +
  +
Availability: Supported by all drivers. +
  +
Group: Text attributes +
  +
See also: Binding   v_gtext   v_justified +
  + +
+ +

7.4.6.60 Bindings for vst_color

+ + + + + + + + + +
C: int16_t vst_color ( int16_t handle, int16_t color_index ); +
  +
Binding: +
  +
int16_t vst_color (int16_t handle, int16_t color_index)
+{
+   intin[0] = color_index;
+
+   contrl[0] = 22;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]22 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]1 # entry in intin
contrl+8contrl[4]1 # entry in intout
contrl+12contrl[6]handle
intinintin[0]color_index
intoutintout[0]Return value
+
+ + +
+ +

7.4.6.61 vst_effects

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set graphic text special effects« +
  +
Opcode: 106 +
  +
Syntax: int16_t vst_effects ( int16_t handle, int16_t effect ); +
  +
Description: The call vst_effects defines various special effects to be +applied to text. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
effect Texteffekt in Bit-Darstellung + + + + + + + + + + + + + + + + + + + + + +
0x00 = Normal +
0x01 = Thickened +
0x02 = Lightened +
0x04 = Skewed +
0x08 = Underlined +
0x10 = Outlined +
0x20 = Shadowed (not currently supported) + +
+ + +
+ +
Notes: The text effects can also be mixed with an OR +combination; unavailable effects will not be set. +
  +
Apart from underlining, these special effects do not usually +work well with outline (vector) text. +
  +
Return value: The function returns the text effect actually selected. +
  +
Availability: Supported by all drivers. +
  +
Group: Text attributes +
  +
See also: Binding   v_gtext   v_justified +
  + +
+ +

7.4.6.62 Bindings for vst_effects

+ + + + + + + + + +
C: int16_t vst_effects ( int16_t handle, int16_t effect ); +
  +
Binding: +
  +
int16_t vst_effects (int16_t handle, int16_t effect)
+{
+   intin[0] = effect;
+
+   contrl[0] = 106;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]106 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]1 # entry in intin
contrl+8contrl[4]1 # entry in intout
contrl+12contrl[6]handle
intinintin[0]effect
intoutintout[0]Return value
+
+ + +
+ +

7.4.6.63 vst_error

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set outline font error mode« - Set the GDOS error +handling. +
  +
Opcode: 245 +
  +
Syntax: void vst_error ( int16_t handle, int16_t mode, int16_t +*errorvar ); +
  +
Description: The call vst_error determines the type of GDOS error handling +and can stop error-messages being sent to the screen. The following +apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
mode Type of error handling: + + + + + + +
0 = Errors reported in error variable errorvar +
1 = Default) Errors go to screen + +
+ +
errorvar Address of the error variables; should be initialized with a +NULL. The following error codes apply for SpeedoGDOS 4.xx: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
1 = Out of system memory (Misc cache) +
2 = Error opening font file +
3 = Error reading font file +
4 = Error while writing out cache buffer +
5 = Font scaler error +
6 = (Not implemented) +
7 = Not enough memory for scratch buffer +
8 = Out of system memory (character cache) +
255 = Misc. Speedo error + +
+ +
With SpeedoGDOS 5.0 the meaning seems to have altered to: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
1 = Insufficient font data loaded +
3 = Invalid font specifications ordered +
4 = Font format error (very often a customer-specific font that is +licensed only for a given program). +
5 = Requested specs not compatible with output module +
7 = Rules requested; not supported +
8 = Mode not available +
10 = Font not specified +
11 = Squeezing/Clipping requested but not supported +
12 = Character data not available +
13 = Track kerning data not available +
14 = Pair kerning data not available + +
+ +
NVDI >= 3.01 will report the error codes from SpeedoGDOS 5.0 +when dealing with Speedo fonts. Additionally, it will report several +error codes >= 0x1000 when dealing with TrueType fonts: + + + +
0x1000 = Out of system memory (Misc cache) + +
+ + +
+ +
Notes: The error variable errorvar should be +checked before the call of the following GDOS functions: +
  +
v_gtext            v_ftext
+v_justified        vst_point
+vst_height         vst_font
+vst_arbpt          vqt_advance
+vst_setsize        vqt_fontinfo
+vqt_name           vqt_width
+vqt_extent         vqt_f_extent
+v_opnwk            v_opnvwk
+vst_load_fonts     vst_unload_fonts
+
+
It is up to each application to process the errors correctly. It +should also reset the value pointed to by errorvar to 0 after +each reported error. +
  +
Return value: This function does not return a result. +
  +
Availability: With FSM-GDOS, Font-GDOS, SpeedoGDOS as of Version 4.00, and +NVDI as of version 3.01. +
  +
Group: Text attributes +
  +
See also: Binding   GDOS   SpeedoGDOS +
  + +
+ +

7.4.6.64 Bindings for vst_error

+ + + + + + + + + +
C: void vst_error ( int16_t handle, int16_t mode, int16_t +*errorvar ); +
  +
Binding: +
  +
void vst_error ( int16_t handle, int16_t mode,
+                 int16_t *errorvar )
+{
+   intin[0] = mode;
+   intin[1..2] = errorvar;
+
+   contrl[0] = 245;
+   contrl[1] = 0;
+   contrl[3] = 3;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]245 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]1 # entry in ptsout
contrl+6contrl[3]3 # entry in intin
contrl+8contrl[4]0 # entry in intout
contrl+12contrl[6]handle
intinintin[0]mode
intin+2intin[1..2]errorvar
+
+ + +
+ +

7.4.6.65 vst_fg_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set foreground colour« - Set foreground colour for text. +
  +
Opcode: 200 (Sub-Opcode 0) +
  +
Syntax: int16_t vst_fg_color ( int16_t handle, int32_t color_space, +COLOR_ENTRY *fg_color ); +
  +
Description: The call vst_fg_color sets the foreground colour for text. +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
color_space Colour space (at present only 0 for the colour space set, or +CSPACE_RGB) +
fg_color COLOR_ENTRY of the foreground colour + +
+ +
Return value: -1 = Wrong subfunction number +
 0 = Function not present +
 1 = All OK +
  +
Availability: NVDI 5.00 onwards. +
  +
Group: Text attributes +
  +
See also: Binding +
  + +
+ +

7.4.6.66 Bindings for vst_fg_color

+ + + + + + + + + +
C: int16_t vst_fg_color ( int16_t handle, int32_t color_space, +COLOR_ENTRY *fg_color ); +
  +
Binding: +
  +
int16_t vst_fg_color( int16_t handle, int32_t color_space,
+                      COLOR_ENTRY *fg_color )
+{
+   intin[0..1] = color_space;
+   intin[2..5] = fg_color;
+
+   contrl[0] = 200;
+   contrl[1] = 0;
+   contrl[3] = 6;
+   contrl[5] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]200 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]6 # entry in intin
contrl+8contrl[4]1 # entry in intout
contrl+10contrl[5]0
contrl+12contrl[6]handle
intinintin[0..1]color_space
intin+4intin[2..5]fg_color
intoutintout[0]Return Value
+
+ + +
+ +

7.4.6.67 vst_font

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set text face« - Select a font for text output. +
  +
Opcode: 21 +
  +
Syntax: int16_t vst_font ( int16_t handle, int16_t font ); +
  +
Description: The call vst_font selects the current font for outputting text. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
font Requested font + +
+ +
Note: The names and indices of the fonts can be obtained +with the function vqt_name. Whether the fonts are supported depends on +the output device in each case. +
  +
If a requested font does not exist, the system font will be +chosen. +
  +
Return value: The function returns the number of the selected font. +
  +
Availability: Supported by all drivers. +
  +
Group: Text attributes +
  +
See also: Binding   vst_load_fonts   vqt_name   v_gtext v_justified +
  + +
+ +

7.4.6.68 Bindings for vst_font

+ + + + + + + + + +
C: int16_t vst_font ( int16_t handle, int16_t font ); +
  +
Binding: +
  +
int16_t vst_font (int16_t handle, int16_t font)
+{
+   intin[0] = font;
+
+   contrl[0] = 21;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]21 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]1 # entry in intin
contrl+8contrl[4]1 # entry in intout
contrl+12contrl[6]handle
intinintin[0]font
intoutintout[0]Return value
+
+ + +
+ +

7.4.6.69 vst_height

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set character height, absolute mode« - Set the character +height for text output. +
  +
Opcode: 12 +
  +
Syntax: void vst_height ( int16_t handle, int16_t height, int16_t +*char_width, int16_t *char_height, int16_t *cell_width, int16_t +*cell_height ); +
  +
Description: The call vst_height sets the character height in pixels. +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
height Requested character height +
char_width Selected character width +
char_height Selected character height +
cell_width Selected character cell width +
cell_height Selected character cell height + +
+ +
Note: If the desired character height does not map +exactly to a device size, VDI selects the closest character size +that does not exceed the requested size. +
  +
Most screen drivers using this function can reduce available +fonts by any amount, or scale them to double size. This applies in +particular to the screen driver implemented in ROM. +
  +
If the font is a vector font, char_width and +cell_width are not the exact character widths but only rounded +values. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all drivers. +
  +
Group: Text attributes +
  +
See also: Binding   v_gtext   v_justified   vst_point +
  + +
+ +

7.4.6.70 Bindings for vst_height

+ + + + + + + + + +
C: void vst_height ( int16_t handle, int16_t height, int16_t +*char_width, int16_t *char_height, int16_t *cell_width, int16_t +*cell_height ); +
  +
Binding: +
  +
void vst_height (int16_t handle, int16_t height,
+                 int16_t *char_width, int16_t *char_height,
+                 int16_t *cell_width, int16_t *cell_height)
+{
+   ptsin[0] = 0;
+   ptsin[1] = height;
+
+   contrl[0] = 12;
+   contrl[1] = 1;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *char_width  = ptsout[0];
+   *char_height = ptsout[1];
+   *cell_width  = ptsout[2];
+   *cell_height = ptsout[3];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]12 # Function Opcode
contrl+2contrl[1]1 # entry in ptsin
contrl+4contrl[2]2 # entry in ptsout
contrl+6contrl[3]0 # entry in intin
contrl+8contrl[4]0 # entry in intout
contrl+12contrl[6]handle
ptsinptsin[0]0
ptsin+2ptsin[1]height
ptsoutptsout[0]char_width
ptsout+2ptsout[1]char_height
ptsout+4ptsout[2]cell_width
ptsout+6ptsout[3]cell_height
+
+ + +
+ +

7.4.6.71 vst_kern

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set kerning mode« +
  +
Opcode: 237 +
  +
Syntax: void vst_kern ( int16_t handle, int16_t tmode, int16_t pmode, +int16_t *tracks, int16_t *pairs ); +
  +
Description: The call vst_kern permits setting of the desired kerning mode +and its values. +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
tmode Track kerning: + + + + + + + + + + + + +
0 = No track kerning +
1 = Normal +
2 = Tight +
3 = Very tight + +
+ +
pmode Pair kerning: + + + + + + +
0 = No pair kerning +
1 = Use pair kerning + +
+ +
tracks Track kerning mode +
pairs Number of kerning pairs defined in font + +
+ +
Note: Most Speedo fonts have 3 kerning tracks. Ordinary +TrueType fonts do not have any kerning tracks, but some GX TrueTypes +do. +
  +
NVDI allows the caller to set a user-defined track kerning +(vst_track_offset). The track kerning mode must be 255 (track_mode) +and intin[2..3] contain the offset in 1/65536 pixels. +
  +
Return value: The function does not return a result. +
  +
Availability: As of SpeedoGDOS 4.00, and NVDI 3.00 onwards. +
  +
Group: Text attributes +
  +
See also: Binding   vqt_pairkern   vqt_trackkern   vst_track_offset +
  + +
+ +

7.4.6.72 Bindings for vst_kern

+ + + + + + + + + +
C: void vst_kern ( int16_t handle, int16_t tmode, int16_t pmode, +int16_t *tracks, int16_t *pairs ); +
  +
Binding: +
  +
void vst_kern (int16_t handle, int16_t tmode, int16_t pmode,
+               int16_t *tracks, int16_t *pairs)
+{
+   intin[0] = tmode;
+   intin[1] = pmode;
+
+   contrl[0] = 237;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *tracks = intout[0];
+   *pairs  = intout[1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]237 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]2 # entry in intin
contrl+8contrl[4]2 # entry in intout
contrl+12contrl[6]handle
intinintin[0]tmode
intin+2intin[1]pmode
intoutintout[0]tracks
intout+2intout[1]pairs
+
+ + +
+ +

7.4.6.73 vst_map_mode

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set character mapping mode« - Set the type of font indexing +(extended version of vst_charmap). +
  +
Opcode: 236 +
  +
Syntax: int16_t vst_map_mode ( int16_t handle, int16_t mode ); +
  +
Description: The call vst_map_mode sets the type of font indexing, allowing +choices between standard Atari ASCII interpretation of text strings, +the Bitstream character indices or Unicode mapping. The following +apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
mode Mapping mode: + + + + + + + + + +
0 = Direct mapping (WORD), i.e. no translation of the character +index +
1 = ASCII mapping (byte-sized) +
2 = Unicode mapping (WORD) + +
+ + +
+ +
Note: If you switch to direct mapping, the number of +characters per font (minADE and maxADE/vqt_fontinfo) +is changed to the number of really existing characters. +
  +
If you select Unicode and if you want to determine whether a +certain character exists, you should call vqt_width. If the index +returned by vqt_width is -1, the character does not exist. Instead of +vqt_width you can also call vqt_char_index and map the Unicode index +into a direct index. +
  +
Return value: The function returns the selected mapping. +
  +
Availability: NVDI 4.0 +
  +
Group: Text attributes +
  +
See also: Binding   vst_charmap   vqt_fontinfo   ASCII table +
  + +
+ +

7.4.6.74 Bindings for vst_map_mode

+ + + + + + + + + +
C: int16_t vst_map_mode ( int16_t handle, int16_t mode ); +
  +
Binding: +
  +
int16_t vst_map_mode (int16_t handle, int16_t mode)
+{
+   intin[0] = mode;
+   intin[1] = 1;       /* Mapping zurückliefern */
+
+   contrl[0] = 236;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[5] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]236 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]2 # entry in intin
contrl+8contrl[4]1 # entry in intout
contrl+12contrl[6]handle
intinintin[0]mode
intin+2intin[1]1
intoutintout[0]Return value
+
+ + +
+ +

7.4.6.75 vst_name

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set text face by name« - Find and set font. +
  +
Opcode: 230 (Opcode 0) +
  +
Syntax: int16_t vst_name ( int16_t handle, int16_t font_format, int8_t +*font_name, int8_t *ret_name ); +
  +
Description: The call vst_name searches for a font by name, and sets it as +the current one. +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
font_format Possible font formats: + + + + + + + + + + + + +
1 = Bitmap font +
2 = Speedo font +
4 = TrueType font +
8 = Type-1 font + +
+ +
font_name Font name +
ret_name Name of the selected font + +
+ +
Note: Missing or extra spaces in the font name are +ignored. If the requested font is not available, the system font is +selected. +
  +
Return value: The function returns the ID of the selected font. +
  +
Availability: The function is available under NVDI as of Version 3.02. +
  +
Group: Text attributes +
  +
See also: Binding   vqt_name   vqt_xfntinfo +
  + +
+ +

7.4.6.76 Bindings for vst_name

+ + + + + + + + + +
C: int16_t vst_name ( int16_t handle, int16_t font_format, int8_t +*font_name, int8_t *ret_name ); +
  +
Binding: +
  +
int16_t vst_name (int16_t handle, int16_t font_format,
+                  int8_t *font_name, int8_t *ret_name)
+{
+   intin[0] = font_format;
+   intin[1..n] = font_name[0..n-1];
+
+   contrl[0] = 230;
+   contrl[1] = 0;
+   contrl[3] = n;
+   contrl[5] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   ret_name[0..m-1] = intout[1..m];
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]230 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]n # entry in intin
contrl+8contrl[4]m # entry in intout
contrl+10contrl[5]0 Sub-Opcode
contrl+12contrl[6]handle
intinintin[0]font_format
intin+2intin[1..n]font_name[0..n-1]
intoutintout[0]Return value
intout+2intout[1..m]ret_name[0..m-1]
+
+ + +
+ +

7.4.6.77 vst_point

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set character height, points mode« - Set the character cell +size for text output. +
  +
Opcode: 107 +
  +
Syntax: int16_t vst_point ( int16_t handle, int16_t point, int16_t +*char_width, int16_t *char_height, int16_t *cell_width, int16_t +*cell_height ); +
  +
Description: The call vst_point sets the character cell size, i.e. the +distance between two baselines, in points (1/72"). The following +apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
point Requested character cell height (points) +
char_width Selected character width +
char_height Selected character height +
cell_width Selected character cell width +
cell_height Selected character cell height + +
+ +
The sizes are measured in points, each of which is 1/72 inch or +roughly 0.353mm. +
  +
Note: Should the desired character height not be +available, the next smaller one will be chosen. With proportional +fonts, the maximum possible values are returned for width and height. +
  +
If the font is a vector font, only predefined heights can be +selected (usually 8, 9, 10, 11, 12, 14, 18, 24, 36, and 48 pt). +
  +
Warning: The screen driver in ROM can scale each of the +available fonts to double size, so that it is not possible +without further ado to differentiate between fonts that have been +scaled and those actually present. One can help oneself here by using +a routine that can locate all present point sizes, as, when a +wrong size is specified, vst_point selects the next smallest available +size; if one finds with this method that all point sizes are +present, then we are evidently dealing with a vector font. +
  +
Return value: The function returns the character cell height in points. +
  +
Availability: Supported by all drivers. +
  +
Group: Text attributes +
  +
See also: Binding   v_gtext   v_justified   vst_height +
  + +
+ +

7.4.6.78 Bindings for vst_point

+ + + + + + + + + +
C: int16_t vst_point ( int16_t handle, int16_t point, int16_t +*char_width, int16_t *char_height, int16_t *cell_width, int16_t +*cell_height ); +
  +
Binding: +
  +
int16_t vst_point (int16_t handle, int16_t point,
+                   int16_t *char_width, int16_t *char_height,
+                   int16_t *cell_width, int16_t *cell_height)
+{
+   intin[0] = point;
+
+   contrl[0] = 107;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *char_width  = ptsout[0];
+   *char_height = ptsout[1];
+   *cell_width  = ptsout[2];
+   *cell_height = ptsout[3];
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]107 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]2 # entry in ptsout
contrl+6contrl[3]1 # entry in intin
contrl+8contrl[4]1 # entry in intout
contrl+12contrl[6]handle
intinintin[0]point
intoutintout[0]Return value
ptsoutptsout[0]char_width
ptsout+2ptsout[1]char_height
ptsout+4ptsout[2]cell_width
ptsout+6ptsout[3]cell_height
+
+ + +
+ +

7.4.6.79 vst_rotation

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set character baseline vector« - Set the orientation of the +baseline for text output. +
  +
Opcode: 13 +
  +
Syntax: int16_t vst_rotation ( int16_t handle, int16_t angle ); +
  +
Description: The call vst_rotation sets the orientation of the baseline for +graphic text output. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
angle Requested angle of rotation of character baseline + +
+ +
Note: The angle is specified in 1/10 of a degree. If the +selected font is a bitmap font, rotation works only in steps of 90 +degrees; for vector fonts it is continuous. On some devices this +function is not available. +
  +
Return value: The function returns the angle actually selected. +
  +
Availability: Supported by all drivers. For specific character rotation +abilities, check the values returned in vq_extnd. +
  +
Group: Text attributes +
  +
See also: Binding   v_gtext   v_justified +
  + +
+ +

7.4.6.80 Bindings for vst_rotation

+ + + + + + + + + +
C: int16_t vst_rotation ( int16_t handle, int16_t angle ); +
  +
Binding: +
  +
int16_t vst_rotation (int16_t handle, int16_t angle)
+{
+   intin[0] = angle;
+
+   contrl[0] = 13;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]13 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]1 # entry in intin
contrl+8contrl[4]1 # entry in intout
contrl+12contrl[6]handle
intinintin[0]angle
intoutintout[0]Return value
+
+ + +
+ +

7.4.6.81 vst_scratch

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set scratch buffer allocation mode« +
  +
Opcode: 244 +
  +
Syntax: void vst_scratch ( int16_t handle, int16_t mode ); +
  +
Description: The call vst_scratch selects the way that the scratch buffer is +created. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
mode Type of buffer + + + + + + + + + +
0 = Allocated size is large enough for bitmap and vector fonts with +any special text effects (default) +
1 = Size is governed by the bitmap fonts; one should forgo text +effects for vector fonts +
2 = Do not create a scratch buffer, and forgo text effects + +
+ + +
+ +
Notes: The scratch buffer is used for generation of text +effects. As vector fonts are freely scalable, one cannot allocate a +unique size for the scratch buffer. +
  +
Atari recommends that at least mode 1 is set prior to +vst_load_fonts to prevent scratch buffer overruns. +
  +
Return value: This function does not return a result. +
  +
Availability: FSM-GDOS, and SpeedoGDOS as of version 4.00. +
  +
Group: Text attributes +
  +
See also: Binding   GDOS   SpeedoGDOS   vst_effects +
  + +
+ +

7.4.6.82 Bindings for vst_scratch

+ + + + + + + + + +
C: void vst_scratch ( int16_t handle, int16_t mode ); +
  +
Binding: +
  +
void vst_scratch ( int16_t handle, int16_t mode );
+{
+   intin[0] = mode;
+
+   contrl[0] = 244;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]244 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]1 # entry in ptsout
contrl+6contrl[3]1 # entry in intin
contrl+8contrl[4]0 # entry in intout
contrl+12contrl[6]handle
intinintin[0]mode
+
+ + +
+ +

7.4.6.83 vst_setsize

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set character cell width in points« - Set the character cell +width in points. +
  +
Opcode: 252 +
  +
Syntax: int16_t vst_setsize ( int16_t handle, int16_t point, int16_t +*chwd, int16_t *chht, int16_t *cellwd, int16_t *cellht ); +
  +
Description: The call vst_setsize sets the character width in points +(1/72") for outline characters. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
point Desired character width in points +
chwd Resultant character width +
chht Resultant character height +
cellwd Resultant character cell width +
cellht Resultant character cell height + +
+ +
Note: The next call of vst_point, vst_arbpt or +vst_height resets the width set by this function and the width +required by the relevant characters is set instead. With negative +widths the characters will be mirrored about the Y-axis. +
  +
Return value: The function returns the character cell width set in points. +
  +
Availability: FSM-GDOS, and SpeedoGDOS as of version 4.00. +
  +
Group: Text attributes +
  +
See also: Binding   vst_setsize32   vst_point   vst_height   vst_arbpt +
  + +
+ +

7.4.6.84 Bindings for vst_setsize

+ + + + + + + + + +
C: int16_t vst_setsize ( int16_t handle, int16_t point, int16_t +*chwd, int16_t *chht, int16_t *cellwd, int16_t *cellht ); +
  +
Binding: +
  +
int16_t vst_setsize (int16_t handle, int16_t point,
+                     int16_t *chwd, int16_t *chht,
+                     int16_t *cellwd, int16_t *cellht)
+{
+   intin[0] = point;
+
+   contrl[0] = 252;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *chwd   = ptsout[0];
+   *chht   = ptsout[1];
+   *cellwd = ptsout[2];
+   *cellht = ptsout[3];
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]252 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]2 # entry in ptsout
contrl+6contrl[3]1 # entry in intin
contrl+8contrl[4]1 # entry in intout
contrl+12contrl[6]handle
intinintin[0]point
intoutintout[0]Return value
ptsoutptsout[0]chwd
ptsout+2ptsout[1]chht
ptsout+4ptsout[2]cellwd
ptsout+6ptsout[3]cellht
+
+ + +
+ +

7.4.6.85 vst_setsize32

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set character cell width in arbitrary points« - Set the +character cell width in fractional points. +
  +
Opcode: 252 +
  +
Syntax: fix31 vst_setsize32 ( int16_t handle, fix31 point, int16_t +*chwd, int16_t *chht, int16_t *cellwd, int16_t *cellht ); +
  +
Description: The call vst_setsize32 sets the character width as a fix31 +fractional value in 1/65536 of a point. +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
point Desired character width (in points) +
chwd Selected character width +
chht Selected character height +
cellwd Selected character cell width +
cellht Selected character cell height + +
+ +
Note: A call of vst_point, vst_arbpt or vst_height +resets the width set by this function and the width required by the +relevant characters is set instead. With negative widths the +characters are mirrored about the Y-axis. +
  +
Return value: The function returns the set character cell width in 1/65536 of +a point. +
  +
Availability: As of SpeedoGDOS 4.00, and NVDI 3.00 onwards. In the +documentation for NVDI 3.00 this function is wrongly called +vst_setsize. +
  +
Group: Text attributes +
  +
See also: Binding   vst_point   vst_height   vst_arbpt +
  + +
+ +

7.4.6.86 Bindings for vst_setsize32

+ + + + + + + + + +
C: fix31 vst_setsize32 ( int16_t handle, fix31 point, int16_t +*chwd, int16_t *chht, int16_t *cellwd, int16_t *cellht ); +
  +
Binding: +
  +
fix31 vst_setsize32 (int16_t handle, fix31 point,
+                     int16_t *chwd, int16_t *chht,
+                     int16_t *cellwd, int16_t *cellht)
+{
+   intin[0..1] = point;
+
+   contrl[0] = 252;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *chwd   = ptsout[0];
+   *chht   = ptsout[1];
+   *cellwd = ptsout[2];
+   *cellht = ptsout[3];
+
+   return ( intout[0..1] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]252 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]2 # entry in ptsout
contrl+6contrl[3]2 # entry in intin
contrl+8contrl[4]2 # entry in intout
contrl+12contrl[6]handle
intinintin[0..1]point
intoutintout[0..1]Return value
ptsoutptsout[0]chwd
ptsout+2ptsout[1]chht
ptsout+4ptsout[2]cellwd
ptsout+6ptsout[3]cellht
+
+ + +
+ +

7.4.6.87 vst_skew

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set outline font skew« - Set the slope for 'italic' text. +
  +
Opcode: 253 +
  +
Syntax: int16_t vst_skew ( int16_t handle, int16_t skew ); +
  +
Description: The call vst_skew sets the skew of vector font characters in +steps of 1/10 degrees. The skewing angle is independent of vst_effects +and must be in a range between -90 and +90 degrees. Positive angles +will lean the characters to the left, whereas negative angles will +lean them to the right. +
  + + + + + + + + + +
Parameter Meaning +
  +
handle Workstation identifier +
  +
skew Angle in 1/10 degrees +
  + +
+ +
Note: This function can really only be seen as a bit of +a lark, as characters created in this way basically look worse than a +true italic font (which should be available for most font families). +
  +
Return value: The function returns the set skew angle. +
  +
Availability: FSM-GDOS, SpeedoGDOS as of Version 4.00, and NVDI 3.00 onwards. +
  +
Group: Text attributes +
  +
See also: Binding   vst_effects   SpeedoGDOS   NVDI +
  + +
+ +

7.4.6.88 Bindings for vst_skew

+ + + + + + + + + +
C: int16_t vst_skew ( int16_t handle, int16_t skew ); +
  +
Binding: +
  +
int16_t vst_skew (int16_t handle, int16_t skew)
+{
+   intin[0] = skew;
+
+   contrl[0] = 253;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]253 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]1 # entry in intin
contrl+8contrl[4]1 # entry in intout
contrl+12contrl[6]handle
intinintin[0]skew
intoutintout[0]Return value
+
+ + +
+ +

7.4.6.89 vst_track_offset

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: Set track kerning offset« - Set offset for track kerning. +
  +
Opcode: 237 (Opcode 255) +
  +
Syntax: void vst_track_offset ( int16_t handle, fix31 offset, int16_t +pairmode, int16_t *tracks, int16_t *pairs ); +
  +
Description: The call vst_track_offset allows the setting of a user-defined +value for track kerning. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
offset Offset +
pairmode Pair kerning: + + + + + + +
0 = Disable +
1 = Enable + +
+ +
tracks Track kerning mode +
pairs Number of kerning pairs + +
+ +
Return value: The function does not return a result. +
  +
Availability: NVDI 3.00 onwards. +
  +
Group: Text attributes +
  +
See also: Binding   vqt_pairkern   vqt_trackkern   vst_kern +
  + +
+ +

7.4.6.90 Bindings for vst_track_offset

+ + + + + + + + + +
C: void vst_track_offset ( int16_t handle, fix31 offset, int16_t +pairmode, int16_t *tracks, int16_t *pairs ); +
  +
Binding: +
  +
void vst_track_offset (int16_t handle, fix31 offset,
+                       int16_t pairmode, int16_t *tracks,
+                       int16_t *pairs)
+{
+   intin[0] = 255;
+   intin[1] = pairmode;
+   intin[2..3] = offset;
+
+   contrl[0] = 237;
+   contrl[1] = 0;
+   contrl[3] = 4;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *tracks = intout[0];
+   *pairs  = intout[1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]237 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]4 # entry in intin
contrl+8contrl[4]2 # entry in intout
contrl+12contrl[6]handle
intinintin[0]255
intin+2intin[1]pairmode
intin+4intin[2..3]offset
intoutintout[0]tracks
intout+2intout[1]pairs
+
+ + +
+ +

7.4.6.91 vst_width

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set character width (absolute mode)« - Set character width +in pixels. +
  +
Opcode: 231 +
  +
Syntax: void vst_width ( int16_t handle, int16_t width, int16_t +*char_width, int16_t *char_height, int16_t *cell_width, int16_t +*cell_height ); +
  +
Description: The call vst_width sets the character width in pixels. The +following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
width Desired character width +
char_width Selected character width +
char_height Seleted character height +
cell_width Selected character cell width +
cell_height Selected character cell height + +
+ +
Note: The next call of vst_height, vst_point or +vst_arbpt32 resets the width. You should use vst_setsize32 instead of +vst_width because vst_width uses only an integer value as a relative +width and therefore it does not offer the required accuracy. +
  +
Return value: The function does not return a result. +
  +
Availability: As of SpeedoGDOS 4.20, and NVDI 3.00 onwards. +
  +
Group: Text attributes +
  +
See also: Binding   vst_arbpt   vst_height   vst_point   vst_setsize +
  + +
+ +

7.4.6.92 Bindings for vst_width

+ + + + + + + + + +
C: void vst_width ( int16_t handle, int16_t width, int16_t +*char_width, int16_t *char_height, int16_t *cell_width, int16_t +*cell_height ); +
  +
Binding: +
  +
void vst_width (int16_t handle, int16_t width,
+                int16_t *char_width, int16_t *char_height,
+                int16_t *cell_width, int16_t *cell_height)
+{
+   ptsin[0] = width;
+
+   contrl[0] = 231;
+   contrl[1] = 1;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *char_width  = ptsout[0];
+   *char_height = ptsout[1];
+   *cell_width  = ptsout[2];
+   *cell_height = ptsout[3];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]231 # Function Opcode
contrl+2contrl[1]1 # entry in ptsin
contrl+4contrl[2]2 # entry in ptsout
contrl+6contrl[3]0 # entry in intin
contrl+8contrl[4]0 # entry in intout
contrl+12contrl[6]handle
ptsinptsin[0]width
ptsoutptsout[0]char_width
ptsout+2ptsout[1]char_height
ptsout+4ptsout[2]cell_width
ptsout+6ptsout[3]cell_height
+
+ + +
+ +

7.4.6.93 v_topbot

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set character height, absolute mode« - Set character height +for text output. +
  +
Opcode: 5 (Escape 18501) +
  +
Syntax: void v_topbot ( int16_t handle, int16_t height, int16_t +*char_width, int16_t *char_height, int16_t *cell_width, int16_t +*cell_height ); +
  +
Description: The call v_topbot is an alternative to vst_height. It uses top +to bottom distance for text scaling, instead of top to baseline +distance. +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
height Character height +
char_width Selected character width +
char_height Selected character height +
cell_width Character cell width +
cell_height Character cell height + +
+ +
Note: If the desired character height is not available, +the next smaller one is chosen automatically. With proportional fonts, +the output parameters contain the width of the widest character in the +font. +
  +
Most screen drivers using this function can reduce available +fonts by any amount, or scale them to double size. This applies in +particular to the screen driver implemented in ROM. +
  +
With vector fonts, the widths output by char_width and +cell_width represent rounded-off values. +
  +
Return value: The function does not return a result. +
  +
Availability: GEM/3 Release 3.1. +
  +
Group: Text attributes +
  +
See also: Binding   v_gtext   v_justified   vst_point   vst_height +
  + +
+ +

7.4.6.94 Bindings for v_topbot

+ + + + + + + + + +
C: void v_topbot ( int16_t handle, int16_t height, int16_t +*char_width, int16_t *char_height, int16_t *cell_width, int16_t +*cell_height ); +
  +
Binding: +
  +
void v_topbot (int16_t handle, int16_t height,
+               int16_t *char_width, int16_t *char_height,
+               int16_t *cell_width, int16_t *cell_height)
+{
+   ptsin[0] = 0;
+   ptsin[1] = height;
+
+   contrl[0] = 5;
+   contrl[1] = 1;
+   contrl[3] = 0;
+   contrl[5] = 18501;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *char_width  = ptsout[0];
+   *char_height = ptsout[1];
+   *cell_width  = ptsout[2];
+   *cell_height = ptsout[3];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function Opcode
contrl+2contrl[1]1 # entry in ptsin
contrl+4contrl[2]4 # entry in ptsout
contrl+6contrl[3]0 # entry in intin
contrl+8contrl[4]0 # entry in intout
contrl+10contrl[5]18501
contrl+12contrl[6]handle
ptsinptsin[0]0
ptsin+2ptsin[1]height
ptsoutptsout[0]char_width
ptsout+2ptsout[1]char_height
ptsout+4ptsout[2]cell_width
ptsout+6ptsout[3]cell_height
+
+ + +
+ +

7.4.6.95 vswr_mode

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set writing mode« - Set the writing mode for almost all +graphic functions. +
  +
Opcode: 32 +
  +
Syntax: int16_t vswr_mode ( int16_t handle, int16_t mode ); +
  +
Description: The call vswr_mode determines the way that source pixels and +destination pixels are combined to form the resulting colour values. +The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
mode Writing mode: + + + + + + + + + + + + +
1 = Replace +
2 = Transparent +
3 = XOR +
4 = Reverse transparent + +
+ + +
+ +
Notes: The normal writing mode is the Replace mode. The +number of available modes can be obtained with the vq_extnd function; +if a mode that is not present is passed, then the Replace mode will be +used. +
  +
Description of the VDI writing modes provides more detailed +particulars and an illustration of the effect of various writing +modes. +
  +
Return value: The function returns the writing mode actually set. +
  +
Availability: Supported by all devices. +
  +
Group: Superior attributes +
  +
See also: Binding   v_pline   v_pmarker   v_gtext   v_fillarea   +v_contourfill   vr_recfl   v_bar   v_arc   v_pieslice   v_circle   +v_ellarc   v_ellpie   v_ellipse   v_rbox   v_rfbox   v_justified   +Description of the VDI writing modes +
  + +
+ +

7.4.6.96 Bindings for vswr_mode

+ + + + + + + + + +
C: int16_t vswr_mode ( int16_t handle, int16_t mode ); +
  +
Binding: +
  +
int16_t vswr_mode (int16_t handle, int16_t mode)
+{
+   intin[0] = mode;
+
+   contrl[0] = 32;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]32 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]1 # entry in intin
contrl+8contrl[4]1 # entry in intout
contrl+12contrl[6]handle
intinintin[0]mode
intoutintout[0]Return value
+
+ + +
+ +

7.4.6.97 vs_bkcolor

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set background colour« +
  +
Opcode: 5 (Escape 102) +
  +
Syntax: void vs_bkcolor ( int16_t handle, int16_t color ); +
  +
Description: The call vs_bkcolor sets the background colour for the device +associated with handle, usually a camera device. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
color Background colour index + +
+ +
Return value: The function does not return a result. +
  +
Availability: GEM/3 Release 3.1 +
  +
Group: Superior attributes +
  +
See also: Binding +
  + +
+ +

7.4.6.98 Bindings for vs_bkcolor

+ + + + + + + + + +
C: void vs_bkcolor ( int16_t handle, int16_t color ); +
  +
Binding: +
  +
void vs_bkcolor (int16_t handle, int16_t color)
+{
+   intin[0] = color;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 102;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]1 # entry in intin
contrl+8contrl[4]0 # entry in intout
contrl+10contrl[5]102
contrl+12contrl[6]handle
intinintin[0]color
+
+ + +
+ +

7.4.6.99 vs_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set colour representation« - Set the colour intensity of a +palette index. +
  +
Opcode: 14 +
  +
Syntax: void vs_color ( int16_t handle, int16_t index, int16_t *rgb_in +); +
  +
Description: The call vs_color sets the colour intensity for the individual +colour registers of a palette index. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
index Colour register index (pen) +
rgb_in[0] Red colour intensity (in tenths of a percent, 0-1000) +
rgb_in[1] Green colour intensity (in tenths of a percent, 0-1000) +
rgb_in[2] Blue colour intensity (in tenths of a percent, 0-1000) + +
+ +
As not every output device needs to offer 1000 possible colour +tints, several input intensities of the RGB colours may share the +intensities that have actually been set. +
  +
Note: The function can only be used if lookup table support is +present. If an invalid colour number is passed, then the next +achievable value will be set. +
  +
For devices with a CLUT (graphics systems with up to 8 planes, +i.e. 256 colours) the settings are effective immediately on all pixels +that were drawn on the screen with the colour index index. +
  +
Important: For this reason the first 16 colour numbers +should not be altered, as these are used by the AES. +
  +
If a device has more than 256 colours displayable +simultaneously, it usually does not have a CLUT. In that case the +pixels do not contain a colour value or index but a direct colour +value in RGB (e.g. a pixel with 32 bits has 8 unused bits, 8 bits for +red, 8 bits for green and 8 bits for blue). This means that the VDI +creates a pseudo-CLUT with 256 pens, and calling vs_color for one of +these pens will not change the colour of the pixels which have been +drawn with this pen, though it will change the colour of new pixels +drawn with this pen. Note that the palettes are handled per +workstation, which means that each workstation has its own palette +(pseudo-CLUT) and changing the RGB value for a colour index on one +workstation will not change the value of the same pen on another +workstation. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all devices. +
  +
Group: Superior attributes +
  +
See also: Binding   v_pline   v_pmarker   v_gtext   v_fillarea   +v_cellarray   v_contourfill   vr_recfl   v_bar   v_arc   v_pieslice   +v_circle   v_ellarc   v_ellpie   v_ellipse   v_rbox   v_rfbox   +v_justified   vq_color   vq_scrninfo +
  + +
+ +

7.4.6.100 Bindings for vs_color

+ + + + + + + + + +
C: void vs_color ( int16_t handle, int16_t index, int16_t *rgb_in +); +
  +
Binding: +
  +
void vs_color (int16_t handle, int16_t index, int16_t *rgb_in)
+{
+   int16_t i;
+
+   intin[0] = index;
+
+   for (i=1; i<4; i++)
+      intin[i] = *rgb_in++;
+
+   contrl[0] = 14;
+   contrl[1] = 0;
+   contrl[3] = 4;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]14 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]4 # entry in intin
contrl+8contrl[4]0 # entry in intout
contrl+12contrl[6]handle
intinintin[0]index
intin+2intin[1..3]rgb_in[0..2]
+
+ + +
+ +

7.4.6.101 vs_color2

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set colour representation-2« - Set colour intensity and +colour for attributes. +
  +
Opcode: 138 (Opcode 0,1,2) +
  +
Syntax: void vs_color2 ( int16_t handle, int16_t *rgb, int16_t index ); +
  +
Description: The call vs_color2 sets the colour intensity and colour for +certain attribute functions. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
rgb[0] Red portion in tenths of a percent +
rgb[1] Green portion in tenths of a percent +
rgb[2] Blue portion in tenths of a percent +
index Colour number + +
+ +
Note: The function is available directly only +under PC-GEM. However it can be emulated on the Atari, which some +applications (e.g. Kandinsky and GEM) actually do. +
  +
It works similarly to vs_color, with the difference that with an +opcode of +
  + + + + + + + + + +
0 the text colour +
1 the fill colour +
2 the line colour + +
+ +
is altered, and so the corresponding calls of vsl_color etc. are +no longer necessary. Due to lack of documentation, one unfortunately +cannot say for certain whether the name of the function +(vs_color2) is really correct. +
  +
Return value: Die Funktion liefert kein Ergebnis zurück.The function does +not return a result. +
  +
Availability: The above statement cannot be confirmed. It is to be assumed +that the function v_setrgb is actually meant here; however the passing +of parameters is somewhat different. +
  +
Group: Superior attributes +
  +
See also: Binding   v_setrgb   vs_color vswr_mode +
  + +
+ +

7.4.6.102 Bindings for vs_color2

+ + + + + + + + + +
C: void vs_color2 ( int16_t handle, int16_t *rgb, int16_t index ); +
  +
Binding: +
  +
void vs_color2 (int16_t handle, int16_t *rgb, int16_t index)
+{
+   int16_t i;
+
+   for (i=0; i<3; i++)
+      intin[i] = *rgb;
+
+   intin[3] = index;
+
+   contrl[0] = 138;
+   contrl[1] = 0;
+   contrl[3] = 4;
+   contrl[5] = opcode;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]138 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]4 # entry in intin
contrl+8contrl[4]0 # entry in intout
contrl+10contrl[5]opcode
contrl+12contrl[6]handle
intinintin[0..2]rgb
intin+6intin[3]index
+
+ + +
+ +

7.4.6.103 vs_grayoverride

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Override gray level« +
  +
Opcode: 133 +
  +
Syntax: void vs_grayoverride ( int16_t handle, int16_t grayval ); +
  +
Description: The call vs_grayoverride overrides the grey level specified +with the vsf_style call patterns 2,1 through 2,8. The application +should specify the closest index in the normal fill pattern set and +follow it with a vs_grayoverride call to "fine-tune" that +gray level on devices that support such fine tuning. This call is +currently implemented in the PostScript driver. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
grayval Grey value in tenths of a percent +
   0  White +
1000  Black + +
+ +
Return value: The function does not return a result. +
  +
Availability: GEM/3 Release 3.1 +
  +
Group: Superior attributes +
  +
See also: Binding +
  + +
+ +

7.4.6.104 Bindings for vs_grayoverride

+ + + + + + + + + +
C: void vs_grayoverride ( int16_t handle, int16_t grayval ); +
  +
Binding: +
  +
void vs_grayoverride (int16_t handle, int16_t grayval)
+{
+   intin[0] = grayval;
+
+   contrl[0] = 133;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]133 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]1 # entry in intin
contrl+8contrl[4]0 # entry in intout
contrl+12contrl[6]handle
intinintin[0]grayval
+
+ + +
+ +

7.4.6.105 v_ps_halftone

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »PostScript halftoning« - Set PostScript halftoning. +
  +
Opcode: 5 (Escape 32) +
  +
Syntax: void v_ps_halftone( int16_t handle, int16_t index, int16_t +angle, int16_t frequency ); +
  +
Description: The call v_ps_halftone controls the parameters for PostScript +halftoning. It provides direct access to analogous PostScript language +parameters. It is implemented only for the PostScript driver. +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
index Halftone type: +
0: Dot screen +
1: Line screen +
2: Ellipse screen +
3: Custom (user-defined) +
angle Hallftone screen angle +
frequency Hallftone screen frequency + +
+ +
Return value: The function does not return a result. +
  +
Availability: GEM/3 Release 3.1 +
  +
Group: Superior attributes +
  +
See also: Binding +
  + +
+ +

7.4.6.106 Bindings for v_ps_halftone

+ + + + + + + + + +
C: void v_ps_halftone( int16_t handle, int16_t index, int16_t +angle, int16_t frequency ); +
  +
Binding: +
  +
void v_ps_halftone( int16_t handle, int16_t index,
+                    int16_t angle, int16_t frequency )
+{
+   intin[0] = index;
+   intin[1] = angle;
+   intin[2] = frequency;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 3;
+   contrl[5] = 32;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]3 # entry in intin
contrl+8contrl[4]0 # entry in intout
contrl+10contrl[5]32 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]index
intin+2intin[1]angle
intin+4intin[2]frequency
+
+ + +
+ +

7.4.6.107 v_setrgb

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set colour representation« - Set colour intensity. +
  +
Opcode: 138 +
  +
Syntax: void v_setrgb( int16_t handle, int16_t type, int16_t r, int16_t +g, int16_t b ); +
  +
Description: The call v_setrgb selects the colour intensity of the +individual colour registers. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
type 0: Text colour +
1: Fill colour +
2: Line colour +
3: Marker colour +
r Red portion in tenths of a percent +
g Green portion in tenths of a percent +
b Blue portion in tenths of a percent + +
+ +
Return value: The function does not return a result. +
  +
Availability: NVDI 5.00 onwards. +
  +
This is allegedly an old GEM/3 function. However such a +function could not be found until now. +
  +
Group: Superior attributes +
  +
See also: Binding +
  + +
+ +

7.4.6.108 Bindings for v_setrgb

+ + + + + + + + + +
C: void v_setrgb( int16_t handle, int16_t type, int16_t r, int16_t +g, int16_t b ); +
  +
Binding: +
  +
void v_setrgb( int16_t handle, int16_t type, int16_t r,
+               int16_t g, int16_t b )
+{
+   intin[0] = r;
+   intin[1] = g;
+   intin[2] = b;
+
+   contrl[0] = 138;
+   contrl[1] = 0;
+   contrl[3] = 3;
+   contrl[5] = type;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]138 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]3 # entry in intin
contrl+8contrl[4]0 # entry in intout
contrl+10contrl[5]type
contrl+12contrl[6]handle
intinintin[0]r
intin+2intin[1]g
intin+4intin[2]b
+
+ + +
+ +

7.4.6.109 v_setrgbi

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set colour representation« - Set the colour or intensity. +
  +
Opcode: 5 (Escape 18500) +
  +
Syntax: void v_setrgbi( int16_t handle, int16_t primtype, int16_t r, +int16_t g, int16_t b, int16_t i ); +
  +
Description: The call v_setrgbi overrides a previously set colour +specification with an RGB triple (for colour devices) or intensity +(for monochrome devices). This call is currently implemented only for +the PostScript driver. +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
primtype Primitive type: +
17: Line +
20: Marker +
22: Text +
25: Fill +
r Red portion in tenths of a percent +
g Green portion in tenths of a percent +
b Blue portion in tenths of a percent +
i Intensity + +
+ +
Return value: The function does not return a result. +
  +
Availability: GEM/3 Release 3.1 +
  +
Group: Superior attributes +
  +
See also: Binding   v_setrgb +
  + +
+ +

7.4.6.110 Bindings for v_setrgbi

+ + + + + + + + + +
C: void v_setrgbi( int16_t handle, int16_t primtype, int16_t r, +int16_t g, int16_t b, int16_t i ); +
  +
Binding: +
  +
void v_setrgbi( int16_t handle, int16_t primtype,
+                int16_t r, int16_t g, int16_t b, int16_t i )
+{
+   intin[0] = primtype;
+   intin[1] = r;
+   intin[2] = g;
+   intin[3] = b;
+   intin[4] = i;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 5;
+   contrl[5] = 18500;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]5 # entry in intin
contrl+8contrl[4]0 # entry in intout
contrl+10contrl[5]18500 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]primtype
intin+2intin[1]r
intin+4intin[2]g
intin+6intin[3]b
intin+8intin[4]i
+
+ + +
+ +
+ +Home +VDIVDI +VDI bindingsVDI bindings +Output functionsOutput functions + + diff --git a/en/vdi_bindings.html b/en/vdi_bindings.html new file mode 100644 index 000000000..a56b5779f --- /dev/null +++ b/en/vdi_bindings.html @@ -0,0 +1,231 @@ + + + + + +The documentation for TOS: VDI bindings + + + + + + + + + +Home +VDIVDI +VDI fundamentalsVDI fundamentals +Attribute functionsAttribute functions + +
+ +

7.3 VDI bindings

+ +

The VDI is called via a single subprogram, which is passed five +parameters; these are addresses of various arrays that are used for +input/output communication. To call a VDI function, the following +parameter block must be populated with the addresses of the arrays +described below: +

+ + +
typedef struct
+{
+   int16_t  *contrl;    /* Pointer to contrl array */
+   int16_t  *intin;     /* Pointer to intin array  */
+   int16_t  *ptsin;     /* Pointer to ptsin array  */
+   int16_t  *intout;    /* Pointer to intout array */
+   int16_t  *ptsout;    /* Pointer to ptsout array */
+} VDIPB;
+
+

The address of this parameter block must then be stored in +register d1, and additionally register d0.w must be filled with the +value 0x73 (115). With a TRAP#2 system call the VDI can then be +called directly. For the Pure-Assembler, for example, +this could look like this: +

+
        .EXPORT vdi         ; Export function
+
+        .IMPORT contrl      ; Import contrl field
+        .IMPORT intin       ; Import intin field
+        .IMPORT ptsin       ; Import ptsin field
+        .IMPORT intout      ; Import intout field
+        .IMPORT ptsout      ; Import ptsout field
+
+        .DATA               ; Start of the DATA segment
+
+pblock: .DC.L contrl        ; Address of the contrl arrays
+        .DC.L intin         ; Address of the intin arrays
+        .DC.L ptsin         ; Address of the ptsin arrays
+        .DC.L intout        ; Address of the intout arrays
+        .DC.L ptsout        ; Address of the ptsout arrays
+
+        .CODE               ; Start of the CODE segment
+
+ +
vdi:     MOVE.L #pblock,D1  ; Address of the parameter blocks
+         MOVE.W #$73,D0     ; Opcode of the VDI
+         TRAP   #2          ; Call GEM
+         RTS                ; Exit here
+
+       .END                 ; End of the module
+
+

There is no clear information available about which registers +may be changed. In fact, however, the pertinent routines in ROM save +all registers. +

+

Unlike GEMDOS, the VDI unfortunately has no documented return value for +'unknown function number'. Hence, in doubtful cases, one has to help +oneself as follows: +

+
    +
  • Many properties of a driver can already be obtained via the +function vq_extnd. +
      +

  • +
  • Otherwise one should simply try the relevant VDI call, and +then analyse the return values. This is because many functions return +the set value as a result. In addition one can examine the fields +contrl[2] and contrl[4] (see below) and check whether these hold the +correct numbers. +
      +

  • +
+ +

Now to the individual arrays. With each field, designated input +and output actions can be carried out. The following apply: +

+ + + + + + + + + + + + + + + + +
int16_t contrl[12] This field passes the function number, the number of entries, +the handle of the workstation as well as the function-dependent +parameters. Inputs to the VDI are entered as follows: +
  + + + + + + + + + + + + + + + + + + +
contrl[0] = Opcode +
contrl[1] = Number of values in ptsin array +
contrl[3] = Number of values in intin array +
contrl[5] = Sub-opcode +
contrl[6] = Workstation handle +
contrl[7..n] = Depends on the function + +
+ +
Outputs of the VDI are made via the following fields: +
  + + + + + + + + + +
contrl[2] = Number of values in ptsout array +
contrl[4] = Number of values in intout array +
contrl[6] = Workstation handle (only v_opnwk/v_opnvwk/v_opnbm) + +
+ + +
int16_t ptsin[1024]   +
  + +
int16_t ptsout[256] These two fields are used to pass pairs of coordinates or +dimensions in pixels (such as the width of a line, or the height of a +character, for instance). The size of these fields depends on the +function called. +
  + +
int16_t intin[1024]   +
  + +
int16_t intout[512] These fields are required to pass values such as an index of a +character or of a colour. The size of these fields depends on the +function called. +
  + +
+ +

When passing strings to the VDI, one should note some +specialties: These are passed basically via the fields intin and +intout, where one WORD per character is used. This has the advantage +that other codings than ASCII can be used as well, and more than 256 +characters of a font may be used. +

+

As a rule the bindings work with normal C-strings, and convert +them for the VDI. For this the length of the strings are stored in +contrl[3] or contrl[4], and no terminating NULL-byte or WORD is +present. To convert a character string lying in intout to a C-string, +for instance, contrl[4] elements have to be copied (and the upper 8 +bits cut off !) and then a NULL-byte appended. +

+

Warning: If the operating system supports threads, then +it is imperative that a multithread-proof library is used. +

+

See also: C-string to VDI-string   VDI-string to C-string   AES +bindings +

+

7.3.1 VDI-string to C-string

+
VOID vdi_str_to_c( UWORD *src, UBYTE *des, int16_t len )
+{
+   while ( len > 0 )
+   {
+      *des++ = (UBYTE)*src++;  /* Only low byte */
+      len--;
+   }
+   *des++ = 0;  /* End of string */
+}
+
+

7.3.2 C-string to VDI-string

+
int16_t c_str_to_vdi( UBYTE *src, UWORD *des )
+{
+   int16_t  len;
+
+   while (( *des++ = *src++ ) != 0 )
+      len++;
+   return (len); /* Length of the string without NULL byte */
+}
+
+
+ +Home +VDIVDI +VDI fundamentalsVDI fundamentals +Attribute functionsAttribute functions + + diff --git a/en/vdi_colortable.html b/en/vdi_colortable.html new file mode 100644 index 000000000..6570134d2 --- /dev/null +++ b/en/vdi_colortable.html @@ -0,0 +1,3194 @@ + + + + + +The documentation for TOS: Colour table functions + + + + + + + + + +Home +VDIVDI +Escape functionsEscape functions +Control functionsControl functions + +
+ +

7.9 Colour table functions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
v_color2nearest Inquires nearest colour value +
v_color2value Translates colour value to pixel value +
v_create_ctab Creates colour table +
v_create_itab Creates inverse colour table reference +
v_ctab_idx2value Inquires colour table value +
v_ctab_idx2vdi Translates colour table index to VDI index +
v_ctab_vdi2idx Translates VDI colour index to colour table index +
v_delete_ctab Deletes colour table +
v_delete_itab Deletes inverse colour table reference +
v_get_ctab_id Gets unique ID for a new colour table +
v_value2color Translates pixel value to colour entry +
vq_ctab Inquires current colour table +
vq_ctab_entry Inquires colour table entry +
vq_ctab_id Inquires current colour table ID +
vq_dflt_ctab Inquires default (system) colour table +
vq_px_format Inquires pixel format and colour space +
vs_ctab Sets colour table +
vs_ctab_entry Sets colour value in the colour table +
vs_dflt_ctab Sets defaut (system) colour table + +
+ +

See also: VDI workstations   Style guidelines +

+

7.9.1 v_color2nearest

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Nearest Color Entry« +
  +
Opcode: 204 (Sub-Opcode 2) +
  +
Syntax: int32_t v_color2nearest( int16_t handle, int32_t color_space, +COLOR_ENTRY *color, COLOR_ENTRY *nearest_color ); +
  +
Description: The call v_color2nearest returns the nearest colour value for +the desired COLOR_ENTRY. +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
color_space Colour space (at present only 0 for the colour space set, or +CSPACE_RGB) +
color COLOR_ENTRY of the colour +
nearest_color COLOR_ENTRY of the colour + +
+ +
Return value: The function returns the colour value and the colour space of +the nearest colour. +
  +
Availability: As of NVDI 5.00. +
  +
Group: Colour table functions +
  +
See also: Binding +
  + +
+ +

7.9.2 Bindings for v_color2nearest

+ + + + + + + + + +
C: int32_t v_color2nearest( int16_t handle, int32_t color_space, +COLOR_ENTRY *color, COLOR_ENTRY *nearest_color ); +
  +
Binding: +
  +
int32_t v_color2nearest( int16_t handle, int32_t color_space,
+                         COLOR_ENTRY *color,
+                         COLOR_ENTRY *nearest_color )
+{
+   intin[0..1] = color_space;
+   intin[2..5] = color;
+
+   contrl[0] = 204;
+   contrl[1] = 0;
+   contrl[3] = 6;
+   contrl[5] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   nearest_color = intout[2..5];
+
+   return ( (int32_t) intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]204 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]6 # Entry in intin
contrl+8contrl[4]6 # Entry in intout
contrl+10contrl[5]2 # Sub-opcode
contrl+12contrl[6]handle
intinintin[0..1]color_space
intin+4intin[2..5]color
intoutintout[0..1]Return value
intout+4intout[2..5]nearest_color
+
+ + +
+ +

7.9.3 v_color2value

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Translate colour entry to pixel value« +
  +
Opcode: 204 (Sub-Opcode 0) +
  +
Syntax: uint32_t v_color2value( int16_t handle, int32_t color_space, +COLOR_ENTRY *color ); +
  +
Description: The call v_color2value returns a colour value for a pixel value. +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
color_space Colour space (at present only 0 for the colour space set, or +CSPACE_RGB) +
color COLOR_ENTRY of the background colour + +
+ +
Return value: The pixel value. +
  +
Availability: As of NVDI 5.00. +
  +
Group: Colour table functions +
  +
See also: Binding +
  + +
+ +

7.9.4 Bindings for v_color2value

+ + + + + + + + + +
C: uint32_t v_color2value( int16_t handle, int32_t color_space, +COLOR_ENTRY *color ); +
  +
Binding: +
  +
uint32_t v_color2value( int16_t handle, int32_t color_space,
+                        COLOR_ENTRY *color )
+{
+   intin[0..1] = color_space;
+   intin[2..5] = color;
+
+   contrl[0] = 204;
+   contrl[1] = 0;
+   contrl[3] = 6;
+   contrl[5] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( (uint32_t) intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]204 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]6 # Entry in intin
contrl+8contrl[4]2 # Entry in intout
contrl+10contrl[5]0 # Sub-opcode
contrl+12contrl[6]handle
intinintin[0..1]color_space
intin+4intin[2..5]color
intoutintout[0..1]Return value
+
+ + +
+ +

7.9.5 v_create_ctab

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Create colour table« +
  +
Opcode: 206 (Sub-Opcode 8) +
  +
Syntax: COLOR_TAB *v_create_ctab( int16_t handle, int32_t color_space, +uint32_t px_format ); +
  +
Description: The call v_create_ctab creates a colour table in the colour +space color_space for a bitmap with px_format & +PX_BITS bits. The colour table is initialized with the standard +colours for this bit-depth. The application can write to the colour +table and alter the colour entries; however if the colours are +altered, one has to obtain a new ID by calling rev_get_ctab_id and +enter this in the structure element <map_id>. Otherwise false +colours will be output. +
  +
After use the colour table can be cleared with v_delete_ctab. +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
color_space Colour space (at present only 0 for the colour space set, or +CSPACE_RGB) +
px_format Pixel format (only the lower 8 bits will be evaluated, i.e. +bits per pixel) + +
+ +
Return value: The function returns a pointer to the colour table. +
  +
Availability: As of NVDI 5.00. +
  +
Group: Colour table functions +
  +
See also: Binding +
  + +
+ +

7.9.6 Bindings for v_create_ctab

+ + + + + + + + + +
C: COLOR_TAB *v_create_ctab( int16_t handle, int32_t color_space, +uint32_t px_format ); +
  +
Binding: +
  +
COLOR_TAB *v_create_ctab( int16_t handle, int32_t color_space,
+                          uint32_t px_format )
+{
+   intin[0..1] = color_space;
+   intin[2..3] = px_format;
+
+   contrl[0] = 206;
+   contrl[1] = 0;
+   contrl[3] = 4;
+   contrl[5] = 8;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( (uint32_t) intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]206 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]4 # Entry in intin
contrl+8contrl[4]2 # Entry in intout
contrl+10contrl[5]8 # Sub-opcode
contrl+12contrl[6]handle
intinintin[0..1]color_space
intin+4intin[2..3]px_format
intoutintout[0..1]Return value
+
+ + +
+ +

7.9.7 v_create_itab

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Create inverse colour table reference« +
  +
Opcode: 208 (Sub-Opcode 0) +
  +
Syntax: ITAB_REF v_create_itab( int16_t handle, COLOR_TAB *ctab, +int16_t bits ); +
  +
Description: The call v_create_itab creates an inverse colour table of the +colour table passsed to it and returns a reference to it. Programs +need to call this function only if they themselves manage bitmaps that +are the destination of a vr_transfer_bits operation (if the off-screen +bitmap is created by the VDI, i.e with v_opnbm or v_open_bm, the +VDI does this automatically). See also the description of +vr_transfer_bits. +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
ctab Pointer to colour table +
bits Preferred resolution of the inverse colour table (3-5) + +
+ +
Return value: The function returns the reference to the inverse colour table. +
  +
Availability: As of NVDI 5.00. +
  +
Group: Colour table functions +
  +
See also: Binding +
  + +
+ +

7.9.8 Bindings for v_create_itab

+ + + + + + + + + +
C: ITAB_REF v_create_itab( int16_t handle, COLOR_TAB *ctab, +int16_t bits ); +
  +
Binding: +
  +
ITAB_REF v_create_itab( int16_t handle, COLOR_TAB *ctab,
+                        int16_t bits )
+{
+   intin[0..1] = ctab;
+   intin[2] = bits;
+   intin[3] = 0;
+   intin[4] = 0;
+
+   contrl[0] = 208;
+   contrl[1] = 0;
+   contrl[3] = 5;
+   contrl[5] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( (uint32_t) intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]208 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]5 # Entry in intin
contrl+8contrl[4]2 # Entry in intout
contrl+10contrl[5]0 # Sub-opcode
contrl+12contrl[6]handle
intinintin[0..1]ctab
intin+4intin[2]bits
intin+6intin[3]0
intin+8intin[4]0
intoutintout[0..1]Return value
+
+ + +
+ +

7.9.9 v_ctab_idx2value

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire colour table value« - Return pixel value. +
  +
Opcode: 206 (Sub-Opcode 5) +
  +
Syntax: uint32_t v_ctab_idx2value( int16_t handle, int16_t index ); +
  +
Description: The call v_ctab_idx2value returns the pixel value for an entry in +the colour table. If the passed index is larger than the +number of colour pens, then the pixel value of the colour black will +be returned. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
index Colour table index + +
+ +
Return value: The function returns the pixel value. +
  +
Availability: As of NVDI 5.00. +
  +
Group: Colour table functions +
  +
See also: Binding +
  + +
+ +

7.9.10 Bindings for v_ctab_idx2value

+ + + + + + + + + +
C: uint32_t v_ctab_idx2value( int16_t handle, int16_t index ); +
  +
Binding: +
  +
uint32_t v_ctab_idx2value( int16_t handle, int16_t index )
+{
+   intin[0] = index;
+
+   contrl[0] = 206
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 5;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( (uint32_t) intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]206 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]1 # Entry in intin
contrl+8contrl[4]2 # Entry in intout
contrl+10contrl[5]5 # Sub-opcode
contrl+12contrl[6]handle
intinintin[0]index
intoutintout[0..1]Return value
+
+ + +
+ +

7.9.11 v_ctab_idx2vdi

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Translate VDI colour index to colour table index« +
  +
Opcode: 206 (Sub-Opcode 3) +
  +
Syntax: int16_t v_ctab_idx2vdi( int16_t handle, int16_t index ); +
  +
Description: The call v_ctab_idx2vdi converts the colour table index into a +VDI colour index. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
index Index for the colour table + +
+ +
For resolutions up to 256 colours, index is the index +for the COLOR_ENTRY in the current colour table and simultaneously +also the actual pixel value that is entererd in the bitmap. For +graphic formats with more than 256 colours, index continues to +denote the entry in the colour table; the pixel value however is +output by the VDI as a direct RGB value in the bitmap. +
  +
Return value: The function returns the old VDI colour index for vsl_color +or similar functions +
  +
Availability: As of NVDI 5.00. +
  +
Group: Colour table functions +
  +
See also: Binding +
  + +
+ +

7.9.12 Bindings for v_ctab_idx2vdi

+ + + + + + + + + +
C: int16_t v_ctab_idx2vdi( int16_t handle, int16_t index ); +
  +
Binding: +
  +
int16_t v_ctab_idx2vdi( int16_t handle, int16_t index )
+{
+   intin[0] = index;
+
+   contrl[0] = 206
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 3;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]206 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]1 # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+10contrl[5]3 # Sub-opcode
contrl+12contrl[6]handle
intinintin[0]index
intoutintout[0]Return value
+
+ + +
+ +

7.9.13 v_ctab_vdi2idx

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Translate VDI Color Index To Color Table Index« +
  +
Opcode: 206 (sub-opcode 4) +
  +
Syntax: int16_t v_ctab_vdi2idx( int16_t handle, int16_t vdi_index ); +
  +
Description: The call v_ctab_vdi2idx translates the VDI colour index to a +colour table index. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
vdi_index Index for the colour table + +
+ +
For resolutions up to 256 colours, index is the index +for the COLOR_ENTRY in the current colour table and simultaneously +also the actual pixel value that is entererd in the bitmap. For +graphic formats with more than 256 colours, index continues to +denote the entry in the colour table; the pixel value however is +output by the VDI as a direct RGB value in the bitmap. +
  +
Return value: The function returns the index for the colour table. +
  +
Availability: As of NVDI 5.00. +
  +
Group: Colour table functions +
  +
See also: Binding +
  + +
+ +

7.9.14 Bindings for v_ctab_vdi2idx

+ + + + + + + + + +
C: int16_t v_ctab_vdi2idx( int16_t handle, int16_t vdi_index ); +
  +
Binding: +
  +
int16_t v_ctab_vdi2idx( int16_t handle, int16_t vdi_index )
+{
+   intin[0] = vdi_index;
+
+   contrl[0] = 206
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 4;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]206 Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]1 # entry in intin
contrl+8contrl[4]1 # entry in intout
contrl+10contrl[5]4
contrl+12contrl[6]handle
intinintin[0]vdi_index
intoutintout[0]Rückgabewert
+
+ + +
+ +

7.9.15 v_delete_ctab

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Delete colour table« +
  +
Opcode: 206 (Sub-Opcode 9) +
  +
Syntax: int16_t v_delete_ctab( int16_t handle, COLOR_TAB *ctab ); +
  +
Description: The call v_delete_ctab clears a colour table created with +v_create_ctab. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
ctab Pointer to colour table + +
+ +
Return value: 0: Error +
1: All OK +
  +
Availability: As of NVDI 5.00. +
  +
Group: Colour table functions +
  +
See also: Binding   v_create_ctab +
  + +
+ +

7.9.16 Bindings for v_delete_ctab

+ + + + + + + + + +
C: int16_t v_delete_ctab( int16_t handle, COLOR_TAB *ctab ); +
  +
Binding: +
  +
int16_t v_delete_ctab( int16_t handle, COLOR_TAB *ctab )
+{
+   intin[0..1] = ctab;
+
+   contrl[0] = 206
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[5] = 9;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]206 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]2 # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+10contrl[5]9 # Sub-opcode
contrl+12contrl[6]handle
intinintin[0..1]ctab
intoutintout[0]Return value
+
+ + +
+ +

7.9.17 v_delete_itab

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Delete inverse colour table reference« +
  +
Opcode: 208 (Sub-Opcode 1) +
  +
Syntax: int16_t v_delete_itab( int16_t handle, ITAB_REF *itab ); +
  +
Description: The call v_delete_itab releases the memory used for an inverse +colour table. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
itab Reference to inverse colour table + +
+ +
Return value: 0: Error +
1: All OK +
  +
Availability: As of NVDI 5.00. +
  +
Group: Colour table functions +
  +
See also: Binding +
  + +
+ +

7.9.18 Bindings for v_delete_itab

+ + + + + + + + + +
C: int16_t v_delete_itab( int16_t handle, ITAB_REF *itab ); +
  +
Binding: +
  +
int16_t  v_delete_itab( int16_t handle, ITAB_REF *itab )
+{
+   intin[0..1] = itab;
+
+   contrl[0] = 208;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[5] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]208 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]2 # Entry in intin
contrl+8contrl[4]2 # Entry in intout
contrl+10contrl[5]1 # Sub-opcode
contrl+12contrl[6]handle
intinintin[0..1]itab
intoutintout[0]Return value
+
+ + +
+ +

7.9.19 v_get_ctab_id

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Get unique colour table ID« - Return unique ID for a new +colour table. +
  +
Opcode: 206 (Sub-Opcode 6) +
  +
Syntax: int32_t v_get_ctab_id( int16_t handle ); +
  +
Description: If a program builds up its own colour table, a unique ID has to +be obtained from the VDI, so that different tables also have +different IDs. v_get_ctab_id returns an ID for this case. +
  + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier + +
+ +
Return value: The function returns a unique ID for a new colour table. +
  +
Availability: As of NVDI 5.00. +
  +
Group: Colour table functions +
  +
See also: Binding +
  + +
+ +

7.9.20 Bindings for v_get_ctab_id

+ + + + + + + + + +
C: int32_t v_get_ctab_id( int16_t handle ); +
  +
Binding: +
  +
int32_t v_get_ctab_id( int16_t handle )
+{
+   contrl[0] = 206
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 6;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( (int32_t) intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]206 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]2 # Entry in intout
contrl+10contrl[5]6 # Sub-opcode
contrl+12contrl[6]handle
intoutintout[0..1]Return value
+
+ + +
+ +

7.9.21 v_value2color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Translate pixel value to colour entry« +
  +
Opcode: 204 (Sub-Opcode 1) +
  +
Syntax: int32_t v_value2color( int16_t handle, uint32_t value, +COLOR_ENTRY *color ); +
  +
Description: The call v_value2color returns the colour of a pixel value. +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
value Pixel value +
color COLOR_ENTRY of the colour + +
+ +
Return value: The function returns the colour value and the set colour space. +
  +
Availability: As of NVDI 5.00. +
  +
Group: Colour table functions +
  +
See also: Binding +
  + +
+ +

7.9.22 Bindings for v_value2color

+ + + + + + + + + +
C: int32_t v_value2color( int16_t handle, uint32_t value, +COLOR_ENTRY *color ); +
  +
Binding: +
  +
int32_t v_value2color( int16_t handle, uint32_t value,
+                       COLOR_ENTRY *color )
+{
+   intin[0..1] = value;
+
+   contrl[0] = 204;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[5] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   color = intout[2..5];
+
+   return ( (int32_t) intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]204 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]2 # Entry in intin
contrl+8contrl[4]6 # Entry in intout
contrl+10contrl[5]1 # Sub-opcode
contrl+12contrl[6]handle
intinintin[0..1]value
intoutintout[0..1]Return value
intout+4intout[2..5]color
+
+ + +
+ +

7.9.23 vq_ctab

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire current colour table« +
  +
Opcode: 206 (Sub-Opcode 0) +
  +
Syntax: int16_t vq_ctab( int16_t handle, int32_t ctab_length, COLOR_TAB +*ctab ); +
  +
Description: The call vq_ctab copies the current colour table, which the +VDI manages under the passed handle, into the region to +which ctab points. If the colour table is longer than +ctab_length, then no value is returned in intout, and +contrl[4] is then 0. A colour table can hold a maximum of 256 entries +(as the VDI supports a maximum of 256 colour pens, there cannot be +more) and hence this gives the maximum length from the size of the +header plus 256 * sizeof( COLOR_ENTRY ). +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
ctab_length Length of memory block to which ctab points +
ctab Memory block to which the colour table is copied + +
+ +
Return value: The function returns 0 for an error, or 1 for 'All OK'. +
  +
Availability: As of NVDI 5.00. +
  +
Group: Colour table functions +
  +
See also: Binding +
  + +
+ +

7.9.24 Bindings for vq_ctab

+ + + + + + + + + +
C: int16_t vq_ctab( int16_t handle, int32_t ctab_length, COLOR_TAB +*ctab ); +
  +
Binding: +
  +
int16_t vq_ctab( int16_t handle, int32_t ctab_length,
+                 COLOR_TAB *ctab )
+{
+   intin[0..1] = ctab_length;
+
+         intout points to ctab
+
+   contrl[0] = 206;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[5] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   if ( contrl[4] )
+     return( 1 );                   /* All OK */
+   else
+     return( 0 );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]206 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]2 # Entry in intin
contrl+8contrl[4]n # Entry in intout
contrl+10contrl[5]0 # Sub-opcode
contrl+12contrl[6]handle
intinintin[0..1]ctab_length
intoutintout[0..n]ctab
+
+ + +
+ +

7.9.25 vq_ctab_entry

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire colour table entry« +
  +
Opcode: 206 (Sub-Opcode 1) +
  +
Syntax: int32_t vq_ctab_entry( int16_t handle, int16_t index, +COLOR_ENTRY *color ); +
  +
Description: The call vq_ctab_entry obtains the colour space and the colour +of a colour table entry. +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
index Colour table index +
color Holds colour of colour table entry after the call + +
+ +
Return value: The function returns the colour space of a colour table entry. +
  +
Availability: As of NVDI 5.00. +
  +
Group: Colour table functions +
  +
See also: Binding +
  + +
+ +

7.9.26 Bindings for vq_ctab_entry

+ + + + + + + + + +
C: int32_t vq_ctab_entry( int16_t handle, int16_t index, +COLOR_ENTRY *color ); +
  +
Binding: +
  +
int32_t vq_ctab_entry( int16_t handle, int16_t index,
+                       COLOR_ENTRY *color )
+{
+   intin[0] = index;
+
+   contrl[0] = 206;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   color = intout[2..5];
+
+   return( ( int32_t ) intout [0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]206 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]1 # Entry in intin
contrl+8contrl[4]6 # Entry in intout
contrl+10contrl[5]1 # Sub-opcode
contrl+12contrl[6]handle
intinintin[0]index
intoutintout[0..1]Return value
intout+4intout[2..5]color
+
+ + +
+ +

7.9.27 vq_ctab_id

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire current colour table ID« +
  +
Opcode: 206 (Sub-Opcode 2) +
  +
Syntax: int32_t vq_ctab_id( int16_t handle ); +
  +
Description: The call vq_ctab_id returns the ID of the current colour table +for handle. From this ID a program can ascertain whether the +colour table of the device that it is using has been changed. +
  + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier + +
+ +
Return value: The function returns the ID of the current colour +
  +
Availability: As of NVDI 5.00. +
  +
Group: Colour table functions +
  +
See also: Binding +
  + +
+ +

7.9.28 Bindings for vq_ctab_id

+ + + + + + + + + +
C: int32_t vq_ctab_id( int16_t handle ); +
  +
Binding: +
  +
int32_t vq_ctab_id( int16_t handle )
+{
+   contrl[0] = 206;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return( ( int32_t ) intout [0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]206 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]2 # Entry in intout
contrl+10contrl[5]2 # Sub-opcode
contrl+12contrl[6]handle
intoutintout[0..1]Return value
+
+ + +
+ +

7.9.29 vq_dflt_ctab

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire default colour table« - Return system colour table. +
  +
Opcode: 206 (Sub-Opcode 7) +
  +
Syntax: int16_t vq_dflt_ctab( int16_t handle, int32_t ctab_length, +COLOR_TAB *ctab ); +
  +
Description: The call vq_dflt_ctab copies the preferred system colour table +for the set colour depth into the memory block to which ctab +points. If the colour table is longer than ctab_length, then +no value is returned in intout, and contrl[4] is then 0. A colour +table can hold a maximum of 256 entries (as the VDI supports a +maximum of 256 colour pens, there cannot be more) and hence this gives +the maximum length from the size of the header plus 256 * sizeof( +COLOR_ENTRY ). +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
ctab_length Length of memory block to which ctab points +
ctab Memory block to which the colour table is copied + +
+ +
Return value: The function returns 0 for an error, or 1 for 'All OK'. +
  +
Availability: As of NVDI 5.00. +
  +
Group: Colour table functions +
  +
See also: Binding +
  + +
+ +

7.9.30 Bindings for vq_dflt_ctab

+ + + + + + + + + +
C: int16_t vq_dflt_ctab( int16_t handle, int32_t ctab_length, +COLOR_TAB *ctab ); +
  +
Binding: +
  +
int16_t vq_dflt_ctab( int16_t handle, int32_t ctab_length,
+                      COLOR_TAB *ctab )
+{
+   intin[0..1] = ctab_length;
+
+   intout zeigt auf ctab
+
+   contrl[0] = 206;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[5] = 7;
+   contrl[6] = handle;
+
+   vdi ();
+
+   if ( contrl[4] )
+     return( 1 );                   /* All OK */
+   else
+     return( 0 );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]206 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]2 # Entry in intin
contrl+8contrl[4]n # Entry in intout
contrl+10contrl[5]7 # Sub-opcode
contrl+12contrl[6]handle
intinintin[0]ctab_length
intoutintout[0..n]ctab
+
+ + +
+ +

7.9.31 vq_px_format

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire pixel format and colour space« +
  +
Opcode: 204 (Sub-Opcode 3) +
  +
Syntax: int32_t vq_px_format( int16_t handle, uint32_t *px_format ); +
  +
Description: The call vq_px_format obtains the set pixel format and the set +colour space. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
px_format Holds the set pixel format after the call + +
+ +
Return value: The function returns the colour space set. +
  +
Availability: As of NVDI 5.00. +
  +
Group: Colour table functions +
  +
See also: Binding +
  + +
+ +

7.9.32 Bindings for vq_px_format

+ + + + + + + + + +
C: int32_t vq_px_format( int16_t handle, uint32_t *px_format ); +
  +
Binding: +
  +
int32_t  vq_px_format( int16_t handle, uint32_t *px_format )
+{
+   contrl[0] = 204;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 3;
+   contrl[6] = handle;
+
+   vdi ();
+
+   px_format = intout[2..3];
+
+   return ( (int32_t) intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]204 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]4 # Entry in intout
contrl+10contrl[5]3 # Sub-opcode
contrl+12contrl[6]handle
intoutintout[0..1]Return value
intout+4intout[2..3]px_format
+
+ + +
+ +

7.9.33 vs_ctab

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set colour table« +
  +
Opcode: 205 (Sub-Opcode 0) +
  +
Syntax: int16_t vs_ctab( int16_t handle, COLOR_TAB *ctab ); +
  +
Description: The call vs_ctab copies the colour table, sets the colours in +the hardware if a CLUT is present, and returns the number of set +colour entries. If at all possible, programs should not change the +colours of the screen! +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
ctab Memory block to which the colour table is copied + +
+ +
Return value: The function returns the number of entries set. +
  +
Availability: As of NVDI 5.00. +
  +
Group: Colour table functions +
  +
See also: Binding +
  + +
+ +

7.9.34 Bindings for vs_ctab

+ + + + + + + + + +
C: int16_t vs_ctab( int16_t handle, COLOR_TAB *ctab ); +
  +
Binding: +
  +
int16_t vs_ctab( int16_t handle, COLOR_TAB *ctab )
+{
+   contrl[0] = 205;
+   contrl[1] = 0;
+   contrl[3] = ctab->length / 2;  /* Length of table / 2 */
+   contrl[5] = 0;
+   contrl[6] = handle;
+
+   intin points to ctab
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]205 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]n # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+10contrl[5]0 # Sub-opcode
contrl+12contrl[6]handle
intinintinReplace by ctab
intoutintout[0]Return value
+
+ + +
+ +

7.9.35 vs_ctab_entry

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set colour table entry« +
  +
Opcode: 205 (sub-opcode 1) +
  +
Syntax: int16_t vs_ctab_entry( int16_t handle, int16_t index, int32_t +color_space, COLOR_ENTRY *color ); +
  +
Description: The call vs_ctab_entry sets a colour value in the colour table, +i.e. for modes with up to 256 colours a CLUT entry will be changed. If +at all possible, programs should not change the colours of the screen! +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
index Colour table index +
color_space Colour space (at present only 0 for the colour space set, or +CSPACE_RGB) +
color Colour table + +
+ +
Return value: The function returns the number of entries set. +
  +
Availability: As of NVDI 5.00. +
  +
Group: Colour table functions +
  +
See also: Binding +
  + +
+ +

7.9.36 Bindings for vs_ctab_entry

+ + + + + + + + + +
C: int16_t vs_ctab_entry( int16_t handle, int16_t index, int32_t +color_space, COLOR_ENTRY *color ); +
  +
Binding: +
  +
int16_t vs_ctab_entry( int16_t handle, int16_t index,
+                       int32_t color_space,
+                       COLOR_ENTRY *color )
+{
+   intin[0] = index;
+   intin[1..2] = color_space;
+   intin[3..6] = color;
+
+
+   contrl[0] = 205;
+   contrl[1] = 0;
+   contrl[3] = 7;
+   contrl[5] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]205 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]7 # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+10contrl[5]1 # Sub-opcode
contrl+12contrl[6]handle
intinintin[0]index
intin+2intin[1..2]color_space
intin+6intin[3..6]color
intoutintout[0]Return value
+
+ + +
+ +

7.9.37 vs_dflt_ctab

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set default colour table« - Set system colour table. +
  +
Opcode: 205 (Sub-Opcode 2) +
  +
Syntax: int16_t vs_dflt_ctab( int16_t handle ); +
  +
Description: The call vs_dflt_ctab sets the system colour table for the +current bit-depth. +
  + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier + +
+ +
Return value: The function returns the number of entries set. +
  +
Availability: As of NVDI 5.00. +
  +
Group: Colour table functions +
  +
See also: Binding +
  + +
+ +

7.9.38 Bindings for vs_dflt_ctab

+ + + + + + + + + +
C: int16_t vs_dflt_ctab( int16_t handle ); +
  +
Binding: +
  +
int16_t vs_dflt_ctab( int16_t handle )
+{
+   contrl[0] = 205;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]205 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+10contrl[5]2 # Sub-opcode
contrl+12contrl[6]handle
intoutintout[0]Return value
+
+ + +
+ +
+ +Home +VDIVDI +Escape functionsEscape functions +Control functionsControl functions + + diff --git a/en/vdi_control.html b/en/vdi_control.html new file mode 100644 index 000000000..8be8d422b --- /dev/null +++ b/en/vdi_control.html @@ -0,0 +1,5940 @@ + + + + + +The documentation for TOS: Control functions + + + + + + + + + +Home +VDIVDI +Colour table functionsColour table functions +Raster functionsRaster functions + +
+ +

7.10 Control functions

+

This library contains functions to open and close working +devices and to load fonts. Furthermore, these functions allow +manipulation for Bezier spline creation and the management of vector +font caches. +

+

In total the following routines are available: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
v_bez_on Switches on Bezier spline creation +
v_bez_off Switches off Bezier spline creation +
• v_clr_cachedir No information available at present +
v_clrwk Reinitializes workstation +
v_clsbm Closes an off-screen bitmap +
v_clsvwk Closes a virtual screen workstation +
v_clswk Closes a physical workstation +
• v_def_cachedir No information available at present +
• v_delete_cache No information available at present +
• v_fgetoutline No information available at present +
v_flushcache Clears vector font cachen. +
• v_get_cachedir No information available at present +
v_get_outline Calculates outline of a character (improved version for NVDI) +
v_getoutline Calculates outline of a character +
v_killoutline Releases memory for outline generation +
v_loadcache Loads vector font cache +
v_open_bm Opens an off-screen bitmap (modernized version) +
v_opnbm Opens an off-screen bitmap +
v_opnprn Opens a printer driver +
v_opnvwk Opens a virtual screen workstation +
v_opnwk Opens a physical workstation. +
v_pat_rotate Rotates a pattern +
v_resize_bm Alters the size of an off-screen bitmap +
v_savecache Saves outline font cache to disk. +
v_set_app_buff Designates memory workspace for Bezier spline creation +
• v_set_cachedir No information available at present. +
v_updwk Executes buffered workstation output commands +
• vs_backmap No information available at present +
vs_clip Sets or deletes a clipping rectangle +
• vs_outmode No information available at present +
• vs_use_fonts No information available at present +
vst_ex_load_fonts Loads additional fonts (extended version) +
vst_load_fonts Loads fonts +
vst_unload_fonts nloads fonts + +
+ +

See also: VDI workstations   Style guidelines +

+

7.10.1 v_bez_off

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Disable Bezier capabilities« - Switch off Bezier spline +creation. +
  +
Opcode: 11 (Sub-Opcode 13) +
  +
Syntax: void v_bez_off ( int16_t handle ); +
  +
Description: The call v_bez_off deactivates the Bezier spline creation of +GDOS on the workstation with the ID handle and frees the +associated memory. +
  +
Note: Although handle specifies a given +workstation, the deactivation applies to all workstations. +
  +
Return value: The function does not return a result. +
  +
Availability: As of GEM/3 Release 3.1, FONTGDOS, FSMGDOS, from SpeedoGDOS +4.00 onwards, and as of NVDI 2.10. +
  +
Group: Control functions +
  +
See also: Binding   v_bez_on   v_bez   v_bez_fill   v_bez_qual   +v_set_app_buff +
  + +
+ +

7.10.2 Bindings for v_bez_off

+ + + + + + + + + +
C: void v_bez_off ( int16_t handle ); +
  +
Binding: +
  +
void v_bez_off (int16_t handle)
+{
+   contrl[0] = 11;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 13;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]11 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]13 # Sub-opcodee
contrl+12contrl[6]handle
+
+ + +
+ +

7.10.3 v_bez_on

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Enable Bezier capabilities« - Switch on Bezier spline +creation. +
  +
Opcode: 11 (Sub-Opcode 13) +
  +
Syntax: int16_t v_bez_on ( int16_t handle ); +
  +
Description: The call v_bez_on activates the Bezier spline creation of GDOS +on the workstation with the ID handle. +
  +
Notes: Although handle specifies a given +workstation, the activation applies to all workstations. +
  +
This function is present for reasons of compatibility. It serves +to make calls of v_pline without the sub-function number 13 to act as +calls of v_bez, and calls of v_fillarea without the subfunction number +to act as calls of v_bez_fill. The function is normally used only to +check whether Beziers are present. +
  +
Return value: This function returns a value between 0 (no Beziers) and 7 +(maximum quality) and represents the Bezier depth. You should only use +this value to determine if the driver is able to draw Bezier curves. +
  +
Availability: As of GEM/3 Release 3.1, FONTGDOS, FSMGDOS, from SpeedoGDOS +4.00 onwards, and as of NVDI 2.10. +
  +
Group: Control functions +
  +
See also: Binding   v_bez_off   v_bez   v_bez_fill   v_bez_qual   +v_set_app_buff +
  + +
+ +

7.10.4 Bindings for v_bez_on

+ + + + + + + + + +
C: int16_t v_bez_on ( int16_t handle ); +
  +
Binding: +
  +
int16_t v_bez_on (int16_t handle)
+{
+   contrl[0] = 11;
+   contrl[1] = 1;
+   contrl[3] = 0;
+   contrl[5] = 13;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]11 # Function Opcode
contrl+2contrl[1]1 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]13 # Sub-opcode
contrl+12contrl[6]handle
intoutintout[0]Return Value
+
+ + +
+ +

7.10.5 v_clrwk

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Clear workstation« - Reinitialize working device. +
  +
Opcode: 3 +
  +
Syntax: void v_clrwk ( int16_t handle ); +
  +
Description: The call v_clrwk sets the physical workstation with the ID +handle to an exactly defined initial state. The following +apply: +
  + + + + + + + + + + + + + + + + + + + + + +
Workstation Effect of the call +
    +
Screen The screen will be cleared, and set to the selected background +colour +
Plotter Clears the plotter's buffer +
Printer Clears the printer's buffer, and also performs a form-feed +
Metafile Saves the opcode +
Camera Deletes the output, and sets the background colour + +
+ +
Notes: With a v_opnwk call the relevant device (e.g. the +screen) will be cleared automatically. +
  +
Applying this function to a virtual workstation will clear the +underlying physical workstation; generally this is not recommended as +it will affect all virtual workstations, not just your own. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all drivers. +
  +
Group: Control functions +
  +
See also: Binding   v_form_adv +
  + +
+ +

7.10.6 Bindings for v_clrwk

+ + + + + + + + + +
C: void v_clrwk ( int16_t handle ); +
  +
Binding: +
  +
void v_clrwk (int16_t handle)
+{
+   contrl[0] = 3;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]3 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+12contrl[6]handle
+
+ + +
+ +

7.10.7 v_clsbm

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Close bitmap« - Close an off-screen bitmap. +
  +
Opcode: 101 (Sub-Opcode 1) +
  +
Syntax: void v_clsbm ( int16_t handle ); +
  +
Description: The call v_clsbm closes the bitmap specified with +handle. The memory of the bitmap will be freed if the VDI +has allocated it. +
  +
Return value: The function does not return a direct result. +
  +
Availability: As of EdDI Version 1.00. +
  +
Group: Control functions +
  +
See also: Binding   NVDI   Off-screen bitmaps   v_opnbm +
  + +
+ +

7.10.8 Bindings for v_clsbm

+ + + + + + + + + +
C: void v_clsbm ( int16_t handle ); +
  +
Binding: +
  +
void v_clsbm (int16_t handle)
+{
+   contrl[0] = 101;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]101 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]1 # Sub-opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.10.9 v_clsvwk

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Close virtual screen workstation« - Close a virtual screen +workstation. +
  +
Opcode: 101 +
  +
Syntax: void v_clsvwk ( int16_t handle ); +
  +
Description: The call v_clsvwk closes the workstation with the ID +handle that was previously opened with v_opnvwk. +
  +
Note: This function must not be used if an error +occurred while opening the workstation. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all drivers. +
  +
Group: Control functions +
  +
See also: Binding   v_opnvwk   v_clswk +
  + +
+ +

7.10.10 Bindings for v_clsvwk

+ + + + + + + + + +
C: void v_clsvwk ( int16_t handle ); +
  +
Binding: +
  +
void v_clsvwk (int16_t handle)
+{
+   contrl[0] = 101;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]101 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+12contrl[6]handle
+
+ + +
+ +

7.10.11 v_clswk

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Close workstation« - Close a physical workstation. +
  +
Opcode: 2 +
  +
Syntax: void v_clswk ( int16_t handle ); +
  +
Description: The call v_clswk closes the device with the ID handle +that was opened previously with a v_opnwk call. +
  +
The function call has the following effects on the various +device types: +
  + + + + + + + + + + + + + + + + + + + + + +
Device Effect of the call +
    +
Screen Switch over to the alpha mode +
Plotter Update +
Drucker Update, if not happened already +
Metafile File will be closed +
Camera Update + +
+ +
Note: Before calling this function one should ensure +that all virtual workstations on the corresponding device are +closed. +
  +
Return value: The function does not return a result. +
  +
Availability: Available only with some form of GDOS. +
  +
Group: Control functions +
  +
See also: Binding   GDOS   v_opnwk   v_opnvwk   v_clsvwk +
  + +
+ +

7.10.12 Bindings for v_clswk

+ + + + + + + + + +
C: void v_clswk ( int16_t handle ); +
  +
Binding: +
  +
void v_clswk (int16_t handle)
+{
+   contrl[0] = 2;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]2 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+12contrl[6]handle
+
+ + +
+ +

7.10.13 v_flushcache

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Flush outline cache« - Clear vector font cache. +
  +
Opcode: 251 +
  +
Syntax: int16_t v_flushcache ( int16_t handle ); +
  +
Description: The call v_flushcache clears the contents the outline (= +vector) character cache that holds the bitmaps of the vector +characters. +
  +
The parameter handle specifies the ID of the relevant +workstation. +
  +
Return value: The function returns the value -1 in case of error, else the +value 0. +
  +
Availability: FSMGDOS, as of SpeedoGDOS 4.00 and from NVDI 3.00 on; however, +no binding is shown for NVDI. +
  +
Group: Control functions +
  +
See also: Binding   v_loadcache   v_savecache   vqt_cachesize +
  + +
+ +

7.10.14 Bindings for v_flushcache

+ + + + + + + + + +
C: int16_t v_flushcache ( int16_t handle ); +
  +
Binding: +
  +
int16_t v_flushcache ( int16_t handle );
+{
+   contrl[0] = 251;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]251 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+12contrl[6]handle
intoutintout[0]Return value
+
+ + +
+ +

7.10.15 v_getoutline

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Get character outline« - Calculate outline of a vector +character. +
  +
Opcode: 243 +
  +
Syntax: void v_getoutline ( int16_t handle, int16_t ch, int16_t +*xyarray, int8_t *bezarray, int16_t maxpts, int16_t *count ); +
  +
Description: The call v_getoutline uses Bezier curves to create the outline +that belongs to a given vector character. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
ch Character whose outline is to be calculated +
xyarray Coordinate buffer +
bezarray Vertice-type buffer (jump, bez) +
maxpts Maximum number of vertices +
count Number of vertices + +
+ +
Note: The returned values can be passed directly to the +output function for Bezier splines (v_bez, v_bez_fill). +
  +
If one wants to use the information from this function as a +vector graphic, say as a part of a metafile, then it is recommended +that a large text height is set before the call; otherwise the quality +of the returned Bezier may be quite poor, as the internal presentation +in 1/65536 pixels is rounded off to integer fixed point pixels, i.e. +16 bits will be lost. The text height should be oriented to the raster +resolution of the font outline, as returned by the function +vqt_fontheader. +
  +
Return value: The function does not return a result. +
  +
Availability: As of SpeedoGDOS 4.00 and from NVDI 3.00 on. +
  +
Group: Control functions +
  +
See also: Binding   v_get_outline   v_killoutline   SpeedoGDOS   NVDI   +fix31 +
  + +
+ +

7.10.16 Bindings for v_getoutline

+ + + + + + + + + +
C: void v_getoutline ( int16_t handle, int16_t ch, int16_t +*xyarray, int8_t *bezarray, int16_t maxpts, int16_t *count ); +
  +
Binding: +
  +
void v_getoutline (int16_t handle, int16_t ch,
+                   int16_t *xyarray, int8_t *bezarray,
+                   int16_t maxpts, int16_t *count)
+{
+   intin[0] = ch;
+   intin[1] = maxpts;
+   intin[2..3] = xyarray;
+   intin[4..5] = bezarray;
+
+   contrl[0] = 243;
+   contrl[1] = 0;
+   contrl[3] = 6;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *count = intout[0];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]243 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]6 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+12contrl[6]handle
intinintin[0]ch
intin+2intin[1]maxpts
intin+4intin[2..3]xyarray
intin+8intin[4..5]bezarray
intoutintout[0]count
+
+ + +
+ +

7.10.17 v_get_outline

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Get character outline« - Calculate outline of a character +(improved version). +
  +
Opcode: 243 (Sub-Opcode 1) +
  +
Syntax: int16_t v_get_outline ( int16_t handle, uint16_t index, +uint16_t x_offset, uint16_t y_offset, int16_t *xyarray, uint8_t +*bezarray, int16_t max_pts ); +
  +
Description: The call v_get_outline creates the outline that belongs to a +given character. This improved version of v_getoutline: +
  +
    +
  • Works the same way for any font format +
  • +
  • Accepts offsets for X- and Y-coordinates +
  • +
  • Also works with rotation +
  • +
  • Respects vertical alignment +
  • +
  • Respects horizontal alignment +
  • +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
index Character index +
x_offset Is added to all X-coordinates in xyarray +
y_offset Is added to all Y-coordinates in xyarray +
xyarray Buffer for the coordinates +
bezarray Buffer for vertice information +
max_pts Maximum number of vertices to be output + +
+ +
Note 1: The returned values can be passed directly to +the output function for Bezier splines (v_bez, v_bez_fill). +
  +
Note 2: With the previous v_getoutline (old Speedo +function), rotation did not work at all, and alignment was ignored as +well. Furthermore, with Speedo fonts the Y-coordinate 0 corresponded +to the top coordinate used in the character (so, depending on the +character, was positioned somewhere within the character cell), while +with Postscript and TrueType fonts the Y-coordinate 0 always +corresponded to the top edge of the character cell. +
  +
Return value: The function returns the number of vertices output. +
  +
Availability: As of NVDI 5.00. +
  +
Group: Control functions +
  +
See also: Binding   v_getoutline   v_killoutline   SpeedoGDOS   NVDI   +fix31 +
  + +
+ +

7.10.18 Bindings for v_get_outline

+ + + + + + + + + +
C: int16_t v_get_outline ( int16_t handle, uint16_t index, +uint16_t x_offset, uint16_t y_offset, int16_t *xyarray, uint8_t +*bezarray, int16_t max_pts ); +
  +
Binding: +
  +
int16_t v_get_outline ( int16_t handle, uint16_t index,
+                        uint16_t x_offset, uint16_t y_offset,
+                        int16_t *xyarray, uint8_t *bezarayr,
+                        int16_t max_pts )
+{
+   intin[0] = index;
+   intin[1] = max_pts;
+   intin[2..3] = xyarray;
+   intin[4..5] = bezarray;
+   intin[6] = x_offset;
+   intin[7] = y_offset;
+
+   contrl[0] = 243;
+   contrl[1] = 0;
+   contrl[3] = 8;
+   contrl[5] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]243 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]8 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]1 # Sub-opcode
contrl+12contrl[6]handle
intinintin[0]ch
intin+2intin[1]maxpts
intin+4intin[2..3]xyarray
intin+8intin[4..5]bezarray
intin+12intin[6]x_offset
intin+14intin[7]y_offset
intoutintout[0]Return value
+
+ + +
+ +

7.10.19 v_killoutline

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Kill FSM outline« - Release memory for outline generation +
  +
Opcode: 242 +
  +
Syntax: void v_killoutline ( int16_t handle, fsm_component_t *component +); +
  +
Description: The call v_killoutline releases the memory allocated for the +creation of font outlines. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
component Address of an outline generated with v_getoutline + +
+ +
Note: The function should always be called as soon as an +outline is no longer needed. Otherwise there is a risk of running out +of memory. +
  +
Return value: The function does not return a result. +
  +
Availability: In FSMGDOS; no longer needed from SpeedoGDOS 4.00 on, so is not +documented further. +
  +
Group: Control functions +
  +
See also: GDOS   SpeedoGDOS   v_getoutline +
  + +
+ +

7.10.20 v_loadcache

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Load outline cache« - Load vector font cache. +
  +
Opcode: 250 +
  +
Syntax: int16_t v_loadcache ( int16_t handle, int8_t *filename, int16_t +mode ); +
  +
Description: The call v_loadcache fills the vector character cache with the +contents of a previously saved file. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
filename Name of the file +
mode Fill mode: + + + + + + +
0 = Append file to current cache +
1 = Flush current cache, and load file completely into the cache + +
+ + +
+ +
Return value: The function returns the value -1 in case of error, else the +value 0. +
  +
Availability: FSMGDOS, as of SpeedoGDOS 4.00. +
  +
Group: Control functions +
  +
See also: Binding   v_flushcache   v_savecache   vqt_cachesize +
  + +
+ +

7.10.21 Bindings for v_loadcache

+ + + + + + + + + +
C: int16_t v_loadcache ( int16_t handle, int8_t *filename, int16_t +mode ); +
  +
Binding: +
  +
int16_t v_loadcache ( int16_t handle, int8_t *filename,
+                      int16_t mode )
+{
+   intin[0] = mode;
+   intin[1..n] = filename;
+
+   contrl[0] = 250;
+   contrl[1] = 0;
+   contrl[3] = 1+n;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]250 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]1+n # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+12contrl[6]handle
intinintin[0]mode
intin+2intin[1..n]filename
intoutintout[0]Return value
+
+ + +
+ +

7.10.22 v_load_cache

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Load outline cache« - Load vector font cache. +
  +
Opcode: 226 (Subcode 7) +
  +
Syntax: int16_t v_load_cache ( int16_t handle, int8_t *filename, +int16_t mode ); +
  +
Description: The call v_load_cache fills the vector character cache with the +contents of a previously saved file. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
filename Name of the file +
mode Fill mode: + + + + + + +
0 = Append file to current cache +
1 = Flush current cache, and load file completely into the cache + +
+ + +
+ +
Return value: The function returns the value -1 in case of error, else the +value 0. +
  +
Availability: As of SpeedoGDOS 5.1. +
  +
Group: Control functions +
  +
See also: Binding   v_flushcache   v_savecache   v_loadcache   +vqt_cachesize +
  + +
+ +

7.10.23 Bindings for v_load_cache

+ + + + + + + + + +
C: int16_t v_load_cache ( int16_t handle, int8_t *filename, +int16_t mode ); +
  +
Binding: +
  +
int16_t v_load_cache ( int16_t handle, int8_t *filename,
+                      int16_t mode )
+{
+   intin[0] = mode;
+   intin[1..n] = filename;
+
+   contrl[0] = 226;
+   contrl[1] = 0;
+   contrl[3] = 1+n;
+   contrl[5] = 7;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]226 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]1+n # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+10contrl[5]7 # Sub-opcode
contrl+12contrl[6]handle
intinintin[0]mode
intin+2intin[1..n]filename
intoutintout[0]Return value
+
+ + +
+ +

7.10.24 v_open_bm

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Open bitmap« - Open an off-screen bitmap (modernized +version) +
  +
Opcode: 100 (Sub-Opcode 3) +
  +
Syntax: int16_t v_open_bm ( int16_t base_handle, GCBITMAP *bitmap, +int16_t color_flags, int16_t unit_flags, int16_t pixel_width, int16_t +pixel_height ); +
  +
Description: The call v_open_bm serves for the creation of off-screen +bitmaps. One can either specify the size of a bitmap that it should +allocate, or pass a bitmap to it. The bitmap is managed in the same +format as that of the screen, which makes fast copying between the two +possible. +
  +
v_open_bm is the modern variant of v_opnbm and works with the +same bitmap and pixel format description as vr_transfer_bits. The +following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
base_handle graf_handle +
bitmap Pointer to GCBITMAP, or 0. +
If GCBITMAP is 0, then the GCBITMAP of the handle +base_handle will be used. Entries in the bitmap are evaluated +as follows: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Entry Function +
addr Address of the bitmap, or 0 (VDI reserves the memory and +later enters the address here) +
width Width of a line in bytes, if addr is valid +
bits Bit-depth, corresponds to px_format +
px_format Pixel format, or 0 (pixel format will be taken on by +base_handle) if all following coordinates are set to 0 and the +VDI reserves the memory; if addr is 0, the dimensions will +be taken from base_handle +
xmin Minimum discrete X-coordinate of the bitmap (0 as a rule) +
ymin Minimum discrete Y-coordinate of the bitmap (0 as a rule) +
xmax Maximum discrete X-coordinate of the bitmap + 1 (the width as a +rule) +
ymax Maximum discrete Y-coordinate of the bitmap + 1 (the height as +a rule) +
ctab Is ignored +
itab Is ignored +
reserved0 Must be 0! +
reserved1 Must be 0! + +
+ +
color_flags Treatment of the colour tables: +
If the lowest bit of color_flags is set then the bitmap +uses the same colour table as base_handle. If the bit is +cleared, the bitmap will have its own colour table and own inverse +colour table created for it (which should make the handling of screen +caches or background buffers appreciably easier for some programs); +colour changes on the screen will then not alter entries in the +bitmap. Of color_flags only the lowest bit is used at present; +all other bits have to be 0. Note: If the bitmap and screen +use the same colour table, the colours may be altered only via the +handle of the screen (i.e. base_handle), as otherwise the +colours will not be entered in the hardware (CLUT). +
unit_flags Measurement unit of the pixel size +
pixel_width Pixel width, or 0 +
pixel_height Pixel height, or 0 + +
+ +
Additionally, the pixel size is passed in pixel_width +and pixel_height, so that the fonts may be scaled correctly. +If one of these two entries is 0, the task will be taken on by +base_handle. The size specifications will be interpreted +dependent on unit_flags: +
  +
-1: Specification in dpi +
 0: Specification in microns (1/1000 mm) +
 1: Specification in 1/10 microns (1/10000 mm) +
 2: Specification in 1/100 microns (1/100000 mm) +
 3: Specification in 1/1000 microns (1/1000000 mm) +
  +
As ctab is ignored, a system colour table corresponding +to the colour depth will be created for the bitmap in CSPACE_RGB (RGB) +colour space. The variable <zero> is present for possible later +extensions in this area, which therefore has to be set to 0 at +present. +
  +
Return value: If the function is successful, a non-zero handle will be +returned. If the VDI has reserved memory for the bitmap and only an +empty (or only partially filled) GCBITMAP structure has been passed in +the call, the structure is initialized completely after the call. +Programs may not alter either the colour table nor the inverse colour +table of the structure with a direct access. All changes must be made +with the colour functions under the returned handle. +
  +
Availability: As of EdDI Version 1.20. +
  +
Group: Control functions +
  +
See also: Binding   NVDI   Off-screen bitmaps   v_clsbm +
  + +
+ +

7.10.25 Bindings for v_open_bm

+ + + + + + + + + +
C: int16_t v_open_bm ( int16_t base_handle, GCBITMAP *bitmap, +int16_t color_flags, int16_t unit_flags, int16_t pixel_width, int16_t +pixel_height ); +
  +
Binding: +
  +
int16_t v_open_bm ( int16_t base_handle, GCBITMAP *bitmap,
+                    int16_t color_flags, int16_t unit_flags,
+                    int16_t pixel_width, int16_t pixel_height )
+{
+   intin[0] = color_flags;
+   intin[1] = unit_flags;
+   intin[2] = pixel_width;
+   intin[3] = pixel_height;
+
+   contrl[0] = 100;
+   contrl[1] = 0;
+   contrl[3] = 4;
+   contrl[5] = 3;
+   contrl[6] = base_handle;
+   contrl[7..8] = bitmap;
+
+   vdi ();
+
+   return ( contrl[6] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]100 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]4 # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+10contrl[5]3 # Sub-opcode
contrl+12contrl[6]base_handle
contrl+14contrl[7..8]bitmap
intinintin[0]color_flags
intin+2intin[1]unit_flags
intin+4intin[2]pixel_width
intin+6intin[3]pixel_height
intoutintout[0]1
+
+ + +
+ +

7.10.26 v_opnbm

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Open bitmap« - Open an off-screen bitmap. +
  +
Opcode: 100 (Sub-Opcode 1) +
  +
Syntax: void v_opnbm ( int16_t *work_in, MFDB *bitmap, int16_t *handle, +int16_t *work_out ); +
  +
Description: The call v_opnbm serves for the creation of off-screen bitmaps. +One can either specify the size of a bitmap that it should allocate, +or pass a bitmap to it. The bitmap is managed in the same format as +that of the screen, which makes fast copying between the two +possible.The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle graf_handle +
work_in[0..10] See v_opnwk/v_opnvwk +
work_in[11] Width -1 (e.g. 1279) +
work_in[12] Height -1 (e.g. 959) +
work_in[13] Width of a pixel in 1/1000 mm +
work_in[14] Height of a pixel in 1/1000 mm +
work_in[15..19] Reserved, should contain 0 + +
+ +
If the EdDI cookie has version number 1.1 or newer, v_opnbm +takes additional arguments in work_in[15..19] into account: An +attempt is made then to open a bitmap in the format described by these +parameters. If there is no driver for the specified format, then the +bitmap cannot be created. The following apply: +
  + + + + + + + + + + + + +
work_in[15..16] Number of simultaneously displayable colours +
work_in[17] Number of planes +
work_in[18] Pixel format +
work_in[19] Bit order + +
+ +
Pixel format and bit order are described in greater detail in +vq_scrninfo. With the following parameters, for instance, one can +create an off-screen bitmap with 256 colours and interleaved planes: +
  +
work_in[15..16] = 256;  /* 256 colours           */
+work_in[17] = 8;        /* 8 Planes              */
+work_in[18] = 0;        /* Interleaved planes    */
+work_in[19] = 1;        /* Normal bit order      */
+
+
Attention: work_in[11] + 1 should be divisible +by 16 without remainder. Otherwise the VDI driver will round up +(work_in[11] + 1) to the next number which can be divided by +16 without remainder. +
  +
If pixel width and height are 0 the pixel size of the screen +workstation is used. +
  +
Note: The use of off-screen bitmaps can be useful if one +wants to avoid effects such as heavy flicker on the screen. In that +case one builds up the parts of the graphic in the bitmap and +transfers the bitmap with vrt_cpyfm or vro_cpyfm to the screen. +
  +
Return value: Information is passed to the outside via the work_out +array or the Memory Form Definiton Block (MFDB): +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
work_out[0..1] See v_opnwk/v_opnvwk +
work_out[2] 0 +
work_out[3..38] See v_opnwk/v_opnvwk +
work_out[39] 0 (no hardware CLUT) +
work_out[39..56] See v_opnwk/v_opnvwk +
bitmap Pointer to MFDB + +
+ +
If bitmap->fd_addr is zero, the VDI will allocate memory +for the bitmap and will clear it (in contrast to v_opnvwk). +
  +
To open a bitmap in device-specific format, +bitmap->fd_nplanes should be zero, or the number of planes of the +screen (work_out[4] from vq_extnd). If bitmap->fd_nplanes +is 1, a monochrome bitmap will be created. +
  +
The elements of the MFDB (fd_addr, fd_w, fd_h, fd_wdwidth, +fd_stand, fd_nplanes) are set by the VDI before returning from +v_opnbm. If there is not enough memory to create a bitmap the handle +will be zero and the MFDB will not be changed. +
  +
If bitmap->fd_addr is not zero, it will be used as pointer to +a bitmap. If the bitmap is in standard format, it will be transformed +into device-specific format. If the number of planes of the bitmap is +not supported by the VDI, a zero handle will be returned. +
  +
Availability: The function is available as of EdDI Version 1.00. From EdDI +1.1 onwards, v_opnbm can be called with additional parameters. +
  +
Group: Control functions +
  +
See also: Binding   NVDI   Off-screen bitmaps   v_clsbm +
  + +
+ +

7.10.27 Bindings for v_opnbm

+ + + + + + + + + +
C: void v_opnbm ( int16_t *work_in, MFDB *bitmap, int16_t *handle, +int16_t *work_out ); +
  +
Binding: +
  +
void v_opnbm (int16_t *work_in, MFDB *bitmap, int16_t *handle,
+              int16_t *work_out)
+{
+   intin[0..19] = work_in[0..19];
+
+   contrl[0] = 100;
+   contrl[1] = 0;
+   contrl[3] = 20;
+   contrl[5] = 1;
+   contrl[6] = handle;
+   contrl[7..8] = bitmap;
+
+   vdi ();
+
+   *handle = contrl[6];
+   work_out[0..44]  = intout[0..44];
+   work_out[45..56] = ptsout[0..11];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]100 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]6 # Entry in ptsout
contrl+6contrl[3]20 # Entry in intin
contrl+8contrl[4]45 # Entry in intout
contrl+10contrl[5]1 # Sub-opcode
contrl+12contrl[6]handle
contrl+14contrl[7..8]bitmap
intinintin[0..19]work_in[0..19]
intoutintout[0..44]work_out[0..44]
ptsoutptsout[0..11]work_out[45..56]
+
+ + +
+ +

7.10.28 v_opnprn

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Open printer driver« +
  +
Opcode: 1 +
  +
Syntax: int16_t v_opnprn( int16_t base_handle, PRN_SETTINGS *settings, +int16_t *work_out ); +
  +
Description: The call v_opnprn opens a printer driver. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
base_handle graf_handle +
settings Pointer to a structure of the type PRN_SETTINGS +
work_out Pointer to an int16_t work_out[57] + +
+ +
Return value: VDI handle, or 0 (error) +
  +
Availability: The passing of PRN_SETTINGS is possible as of NVDI 4.1x (27.11.96). +The binding appears for the first time in NVDI 5.00. +
  +
Group: Control functions +
  +
See also: Binding +
  + +
+ +

7.10.29 Bindings for v_opnprn

+ + + + + + + + + +
C: int16_t v_opnprn( int16_t base_handle, PRN_SETTINGS *settings, +int16_t *work_out ); +
  +
Binding: +
  +
int16_t v_opnprn( int16_t base_handle, PRN_SETTINGS *settings,
+                  int16_t *work_out )
+{
+  int16   work_in[16];
+  int16   i;
+
+  vdi_pb.intin = (int *) work_in;
+  vdi_pb.intout = (int *) work_out;
+  vdi_pb.ptsout = (int *) work_out + 45;
+
+  /* Driver number             */
+  work_in[0] = settings->driver_id;
+  for ( i = 1; i < 10; i++ )
+    work_in[i] = 1;
+  /* Use raster coordinates    */
+  work_in[10] = 2;
+  /* Use page format from settings */
+  work_in[11] = (int16) settings->size_id;
+  /* Use output channel from settings */
+  *(int8 **) &work_in[12] = settings->device;
+  /* Printer settings          */
+  *(PRN_SETTINGS **) &work_in[14] = settings;
+
+  contrl[0] = 1;                   /* Function number */
+  contrl[1] = 0;
+  contrl[3] = 16;              /* Extended parameter number */
+  contrl[6] = base_handle;
+
+  vdi( &vdi_pb );                  /* Open driver */
+
+  vdi_pb.intin = (int *) intin;    /* Reset pointer */
+  vdi_pb.intout = (int *) intout;
+  vdi_pb.ptsout = (int *) ptsout;
+
+  return( contrl[6] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]1 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]6 # Entry in ptsout
contrl+6contrl[3]16 # Entry in intin
contrl+8contrl[4]45 # Entry in intout
contrl+10contrl[5]1 # Sub-opcode
contrl+12contrl[6]base_handle
intinintin[0..19]work_in[0..15]
intoutintout[0..44]work_out[0..44]
ptsoutptsout[0..11]work_out[45..56]
+
+ + +
+ +

7.10.30 v_opnvwk

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Open virtual screen workstation« - Open a screen +workstation. +
  +
Opcode: 100 +
  +
Syntax: void v_opnvwk ( int16_t *work_in, int16_t *handle, int16_t +*work_out ); +
  +
Description: The call v_opnvwk opens a virtual VDI workstation on an +already opened physical device. After the call the parameter +handle receives the ID of the virtual device, or the value 0 +in case of error. The following aply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
work_in Pointer to an integer field with more exact specifications of +the device driver to be loaded: +
work_in[0] Number of the device driver as entered in the ASSIGN.SYS file; the +following apply for the screen: + + + + + + +
1 = Current resolution +
x = 2 + Getrez()   + +
+ +
work_in[1] Default line type +
work_in[2] Defaut line colour index +
work_in[3] Default marker type +
work_in[4] Default marker colour index +
work_in[5] Default font ID +
work_in[6] Default text colour index +
work_in[7] Default fill interior style +
work_in[8] Default fill style index +
work_in[9] Default fill colour inde +
work_in[10] Coordinate type flag: + + + + + + +
0 = NDC (Normalized Device Coordinates, only for external drivers +with GDOS) +
2 = RC (Raster Coordinates) + +
+ +
work_in[11] Page format: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
0 = Use default setting +
1 = DIN A3 +
2 = DIN A4 +
3 = DIN A5 +
4 = DIN B5 +
16 = Letter size +
17 = Half size +
18 = Legal size +
19 = Double size +
20 = Broadsheet size + +
+ +
work_in[12]   +
+   +
work_in[13] Pointer to a GEMDOS file name (C string) or 0L +
work_in[14] Reserved, should be 0 +
work_in[15] Reserved, should be 0 +
work_out Pointer to an integer field containing more exact +specifications of the loaded device driver: +
work_out[0] Maximum addressable width (0 - Xmax) +
work_out[1] Maximum addressable height (0 - Ymax) +
work_out[2] Scalability flag: + + + + + + +
0 = Device capable of producing a precisely scaled image (e.g. the +screen, printer) +
1 = Device not capable of producing a precisely scaled image (e.g. +a film recorder) + +
+ +
work_out[3] Pixel width in microns +
work_out[4] Pixel height in microns +
work_out[5] Number of character heights (0: continous scaling) +
work_out[6] Number of line types +
work_out[7] Number of line widths (0: continous scaling) +
work_out[8] Number of marker types +
work_out[9] Number of marker heights (0: continous scaling) +
work_out[10] Number of accessible fonts +
work_out[11] Number of patterns +
work_out[12] Number of hatch styles +
work_out[13] Number of simultaneously depicted colours (e.g. 256 on an 8 bit +screen) +
work_out[14] Number of GDPs (General Drawing Primitives) supported +
work_out[15] List of the GDPs available on the device; -1 indicates the end +of the list + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
1 = v_bar +
2 = v_arc +
3 = v_pieslice +
4 = v_circle +
5 = v_ellipse +
6 = v_ellarc +
7 = v_ellpie +
8 = v_rbox +
9 = v_rfbox +
10 = v_justified + +
+ +
:   +
work_out[24]   +
work_out[25] List of attributes associated with each GDP: + + + + + + + + + + + + + + + +
0 = Polyline +
1 = Marker +
2 = Text +
3 = Fill area +
4 = No attributes + +
+ +
:   +
work_out[34]   +
work_out[35] Colour capability flag +
work_out[36] Text rotation capability flag +
work_out[37] Fill area capability flag +
work_out[38] CELLARRAY capability flag +
work_out[39] Number of colour levels available, or: + + + + + + +
0 = More than 32767 +
2 = Monochrome + +
+ +
work_out[40] Number of locator devices available for graphic cursor control: + + + + + + + + + +
0 = None +
1 = Keyboard only +
2 = Keyboard and mouse (or other device) + +
+ +
work_out[41] Number of valuator devices available for various inputs: + + + + + + + + + +
0 = None +
1 = Keyboard only +
2 = Another device + +
+ +
work_out[42] Number of choice devices available: + + + + + + + + + +
0 = None +
1 = Function keys on keyboard +
2 = Function keys + extra keypad + +
+ +
work_out[43] Number of string devices available for alphanumeric input: + + + + + + +
0 = None +
1 = Keyboard + +
+ +
work_out[44] Device type: + + + + + + + + + + + + + + + +
0 = Output only +
1 = Input only +
2 = Input and output +
3 = Reserved +
4 = Metafile output + +
+ +
work_out[45] Minimum character width (pixels) +
work_out[46] Minimum character height (pixels) +
work_out[47] Maximum character width (pixels) +
work_out[48] Maximum character height (pixels) +
work_out[49] Minimum representable line width (pixels) +
work_out[50] 0 +
work_out[51] Maximum line width +
work_out[52] 0 +
work_out[53] Minimum marker width +
work_out[54] Minimum marker height +
work_out[55] Maximum marker width +
work_out[56] Maximum marker height + +
+ +
Note: Unfortunately the VDI has no mechanism to +manage the input devices for multiple workstations. Therefore this has +to be taken on by the application that has opened the physical +workstation of the screen. +
  +
Important: The ID of the current physical screen +workstation must be established from the AES with graf_handle. +
  + + +
Warning: In the TOS versions 1.00, 1.04, 1.06, 1.62 +and 2.05 there is an error in the management of the virtual +workstations. This can show itseslf in the multiple +assignation of IDs, and hence the workstation attributes may be +misplaced in some circumstances. This error appears if there are +gaps in the internal workstation list of the screen driver. +Remedy: Place the patch-program VDIFIX in the AUTO folder. +
The error is present also on TOS 2.06 and on early (built before +31.05.1990) TOS 3.00 builds. Unfortunately, no patch is available for +those TOS versions. +
  +
Return value: The function returns no direct result. +
  +
Availability: Supported by all drivers. +
  +
Group: Control functions +
  +
See also: Binding   v_opnwk   v_clsvwk   graf_handle +
  + +
+ +

7.10.31 Bindings for v_opnvwk

+ + + + + + + + + +
C: void v_opnvwk ( int16_t *work_in, int16_t *handle, int16_t +*work_out ); +
  +
Binding: +
  +
void v_opnvwk (int16_t *work_in, int16_t *handle,
+               int16_t *work_out)
+{
+   intin[0..10] = work_in[0..10]
+
+   contrl[0] = 100;
+   contrl[1] = 0;
+   contrl[3] = 11;
+   contrl[6] = *handle;
+
+   vdi ();
+
+   *handle = contrl[6];
+   work_out[0..44]  = intout[0..44];
+   work_out[45..56] = ptsout[0..11];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]100 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]6 # Entry in ptsout
contrl+6contrl[3]11 # Entry in intin
contrl+8contrl[4]45 # Entry in intout
contrl+12contrl[6]handle
intinintin[0..10]work_in[0..10]
intoutintout[0..44]work_out[0..44]
ptsoutptsout[0..11]work_out[45..56]
+
+ + +
+ +

7.10.32 v_opnwk

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Open workstation« - Initialize a device driver for a +specified input/output device. +
  +
Opcode: 1 +
  +
Syntax: void v_opnwk ( int16_t *work_in, int16_t *handle, int16_t +*work_out ); +
  +
Description: The call v_opnwk opens a physical workstation to load a device +driver. However, for this to work, a GDOS (or its equivalent) must be +present in memory and the device driver must be listed in the +ASSIGN.SYS file. If all went well handle will contain a +positive device ID, or 0 in case of error. +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
work_in Pointer to an integer field with more exact specifications of +the device driver to be loaded: +
work_in[0] Number of the device driver as entered in the ASSIGN.SYS file; the +following apply for the screen: + + + + + + +
1 = Current resolution +
x = 2 + Getrez()   + +
+ +
work_in[1] Default line type +
work_in[2] Defaut line colour index +
work_in[3] Default marker type +
work_in[4] Default marker colour index +
work_in[5] Default font ID +
work_in[6] Default text colour index +
work_in[7] Default fill interior style +
work_in[8] Default fill style index +
work_in[9] Default fill colour inde +
work_in[10] Coordinate type flag: + + + + + + +
0 = NDC (Normalized Device Coordinates, only for external drivers +with GDOS) +
2 = RC (Raster Coordinates) + +
+ +
work_in[11] Page format: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
0 = Use default setting +
1 = DIN A3 +
2 = DIN A4 +
3 = DIN A5 +
4 = DIN B5 +
16 = Letter size +
17 = Half size +
18 = Legal size +
19 = Double size +
20 = Broadsheet size + +
+ +
work_in[12]   +
+   +
work_in[13] Pointer to a GEMDOS file name (C string) or 0L +
work_in[14] Reserved, should be 0 +
work_in[15] Reserved, should be 0 +
work_out Pointer to an integer field containing more exact +specifications of the loaded device driver: +
work_out[0] Maximum addressable width (0 - Xmax) +
work_out[1] Maximum addressable height (0 - Ymax) +
work_out[2] Scalability flag: + + + + + + +
0 = Device capable of producing a precisely scaled image (e.g. the +screen, printer) +
1 = Device not capable of producing a precisely scaled image (e.g. +a film recorder) + +
+ +
work_out[3] Pixel width in microns +
work_out[4] Pixel height in microns +
work_out[5] Number of character heights (0: continous scaling) +
work_out[6] Number of line types +
work_out[7] Number of line widths (0: continous scaling) +
work_out[8] Number of marker types +
work_out[9] Number of marker heights (0: continous scaling) +
work_out[10] Number of accessible fonts +
work_out[11] Number of patterns +
work_out[12] Number of hatch styles +
work_out[13] Number of simultaneously depicted colours (e.g. 256 on an 8 bit +screen) +
work_out[14] Number of GDPs (General Drawing Primitives) supported +
work_out[15] List of the GDPs available on the device; -1 indicates the end +of the list + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
1 = v_bar +
2 = v_arc +
3 = v_pieslice +
4 = v_circle +
5 = v_ellipse +
6 = v_ellarc +
7 = v_ellpie +
8 = v_rbox +
9 = v_rfbox +
10 = v_justified + +
+ +
:   +
work_out[24]   +
work_out[25] List of attributes associated with each GDP: + + + + + + + + + + + + + + + +
0 = Polyline +
1 = Marker +
2 = Text +
3 = Fill area +
4 = No attributes + +
+ +
:   +
work_out[34]   +
work_out[35] Colour capability flag +
work_out[36] Text rotation capability flag +
work_out[37] Fill area capability flag +
work_out[38] CELLARRAY capability flag +
work_out[39] Number of colour levels available, or: + + + + + + +
0 = More than 32767 +
2 = Monochrome + +
+ +
work_out[40] Number of locator devices available for graphic cursor control: + + + + + + + + + +
0 = None +
1 = Keyboard only +
2 = Keyboard and mouse (or other device) + +
+ +
work_out[41] Number of valuator devices available for various inputs: + + + + + + + + + +
0 = None +
1 = Keyboard only +
2 = Another device + +
+ +
work_out[42] Number of choice devices available: + + + + + + + + + +
0 = None +
1 = Function keys on keyboard +
2 = Function keys + extra keypad + +
+ +
work_out[43] Number of string devices available for alphanumeric input: + + + + + + +
0 = None +
1 = Keyboard + +
+ +
work_out[44] Device type: + + + + + + + + + + + + + + + + + + +
-1 = Device can output in landscape format (as of PC-GEM/3) +
0 = Output only +
1 = Input only +
2 = Input and output +
3 = Reserved +
4 = Metafile output + +
+ +
work_out[45] Minimum character width (pixels) +
work_out[46] Minimum character height (pixels) +
work_out[47] Maximum character width (pixels) +
work_out[48] Maximum character height (pixels) +
work_out[49] Minimum representable line width (pixels) +
work_out[50] 0 +
work_out[51] Maximum line width +
work_out[52] 0 +
work_out[53] Minimum marker width +
work_out[54] Minimum marker height +
work_out[55] Maximum marker width +
work_out[56] Maximum marker height + +
+ +
Notes: The components work_in[11] to +work_in[15] are only useful under NVDI and allow setting the +page format for printers and bit-image drivers, as well as the output +channel. For a metafile driver the setting of the page format will +not take effect; only the filename will be adopted here. To +check whether the page or paper format was set successfully one should +fall back on the function vq_extnd. +
  +
The values returned in the elements work_out[0,1] show +the actual printable area; the non-printable areas can be +obtained with vq_extnd. +
  +
The allocation of the work_in and work_out +arrays given here is no longer fully compatible to PC-GEM, as from +GEM/3 onwards a number of considerable changes or extensions were made that were +either not adopted on the Atari or were made in a different manner. +
  +
Physical workstations should be opened only when they are +needed, and closed immediately afterwards; so, for instance, a word +processor should not open the printer driver when the +application launches and close it when it ends, as otherwise the user +will not be able to change printers with a printer setup CPX. +
  +
Warning: With printer drivers, and specially with the +Atari SLM laser page-printers, some special features have to be heeded. +
  +
Return value: The function returns no direct result. +
  +
Availability: Available only with some forms of GDOS. +
  +
Group: Control functions +
  +
See also: Binding   GDOS   v_clswk   v_opnvwk +
  + +
+ +

7.10.33 Bindings for v_opnwk

+ + + + + + + + + + + + +
C: void v_opnwk ( int16_t *work_in, int16_t *handle, int16_t +*work_out ); +
  +
Binding: +
  +
void v_opnwk (int16_t *work_in, int16_t *handle,
+              int16_t *work_out)
+{
+   intin[0..15] = work_in[0..15];
+
+   contrl[0] = 1;
+   contrl[1] = 0;
+   contrl[3] = 16;
+   contrl[6] = 0;
+
+   vdi ();
+
+   *handle = contrl[6];
+   work_out[0..44]  = intout[0..44];
+   work_out[45..56] = ptsout[0..11];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]1 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]6 # Entry in ptsout
contrl+6contrl[3]16 # Entry in intin
contrl+8contrl[4]45 # Entry in intout
contrl+12contrl[6]handle
intinintin[0..15]work_in[0..15]
intoutintout[0..44]work_out[0..44]
ptsoutptsout[0..11]work_out[45..56]
+
+ + +
Note: The specified binding is valid for use under NVDI. +With printer drivers some special features have to be taken into +account: First of all, with matrix printers the maximum +resolution can be specified, as follows: +
  + + + + + + + + + +
ptsin[0] = Maximum resolution in X-direction +
ptsin[1] = Maximum resolution in Y-direction +
contrl[1] = 1 + +
+ +
In addition, the address of the internal buffer for the +Atari SLM laser page-printers can be obtained: +
  + + + + + + +
contrl[0] = High word, and +
contrl[1] = Low word of the buffer address + +
+ +
See also: v_opnwk   GDOS   GDOS drivers +
  + +
+ +

7.10.34 Changes in PC-GEM

+

From PC-GEM/3 onwards the work_in field of v_opnwk was +extended, so that one could still undertake some driver settings at +runtime. The following information however is not compatible +to Atari GEM or to NVDI. The following apply: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Element Meaning +
    +
work_in[11] In the lower value byte the output is specified more exactly. +Output is to: + + + + + + + + + + + + + + + +
0 = File +
1 = Serial port +
2 = Parallel port +
3 = Device-specific (direct) +
255 = Default port + +
+ +
In the higher value byte the page size is specified: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
0 = Letter size ( 8.50 * 11.00 inch) +
5 = Half size ( 8.50 * 5.50 inch) +
10 = B5 size (18.20 * 25.00 cm) +
20 = Letter size ( 8.50 * 11.00 inch) +
30 = A4 size (21.00 * 29.70 cm) +
40 = Legal size ( 8.50 * 14.00 inch) +
50 = Double size (11.00 * 17.00 inch) +
55 = Broadsheet (14.00 * 11.00 inch) +
255 = Benutzerspezifiziert (work_in[101,102]) + +
+ +
work_in[12] Output port or filename +
...   +
...   +
work_in[100]   +
work_in[101] Page width in 1/100 inch +
work_in[102] Page height in 1/100 inch +
work_out[14] Has the value 11 if escapement text is available +
work_out[24] Has the value 1 if escapement text is the only available text +on the output device, or otherwise the value 10 +
work_out[44] A value of -1 means that the output device can output in +landscape format without the application having to rotate the graphic +itself. The OUTPUT program of PC-GEM however takes on the rotation +itself, as this option was not yet available in older GEM versions. + +
+ +

Note: If work_in[11] has the value 1 or 2, then +work_in[12] must be set to the port number (LPT1 = 0, LPT2 = +1, COM1 = 0, etc.). On the other hand if work_in[11] has the +value 0, then the name of the file which is to be written must be +contained in work_in[12] onwards; this will be written +character by character (16-bit WORDS) and must be NULL-terminated. +

+

See also: Control functions   v_opnwk +

+

7.10.35 v_pat_rotate

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pattern rotation« +
  +
Opcode: 134 +
  +
Syntax: void v_pat_rotate( int16_t handle, int16_t angle) +
  +
Description: The call v_pat_rotate specifies a pattern rotation angle. It is +implemented only in printer drivers and is restricted to multiples of +90 degrees. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
angle Angle in tenths of a degree + +
+ +
Return value: The function does not return a result. +
  +
Availability: GEM/3 Release 3.1 +
  +
Group: Control functions +
  +
See also: Binding +
  + +
+ +

7.10.36 Bindings for v_pat_rotate

+ + + + + + + + + +
C: void v_pat_rotate( int16_t handle, int16_t angle ); +
  +
Binding: +
  +
void v_pat_rotate( int16_t handle, int16_t angle )
+{
+   intin[0] = angle;
+
+   contrl[0] = 134;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]134 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]1 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+12contrl[6]handle
intinintin[0]angle
+
+ + +
+ +

7.10.37 v_resize_bm

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Resize bitmap« - Alter the size of an off-screen bitmap. +
  +
Opcode: 100 (Sub-Opcode 2) +
  +
Syntax: int16_t v_resize_bm( int16_t handle, int16_t width, int16_t +height, int32_t byte_width, uint16_t *addr ); +
  +
Description: With the function v_resize_bm the size of an off-screen bitmap +may be changed. The function can also be passed its own block of +memory, for which then the following points must be abided by: +
  +
    +
  • The memory block must start on a 16-byte boundary. +
      +

  • +
  • At least 16 bytes that belong to the caller must be free before +and after the memory block, as, depending on the output scope, some +graphics functions read and possibly even write a few bytes before or +after the bitmap (actually, the contents of these memory blocks is not +altered; just some masked data will be written back unchanged). +
      +

  • +
+ +
If you do not take heed of this, you may be blessed with some +nasty memory collisions! Hence we recommend leaving memory allocation +to the NVDI! +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Handle from v_opnbm or v_open_bm. +
width New width in pixels +
height New height in pixels +
byte_width Width of a line in bytes (only if addr is valid) +
addr Pointer to own memory block, or 0L + +
+ +
Return value: If the function result is 0 then the new bitmap could not be +built up. As the old bitmap has been released already in this case, +one can attempt to create a smaller bitmap, or the bitmap must be +closed with v_clsbm. +
  +
Availability: As of EdDI Version 1.20 +
  +
Group: Control functions +
  +
See also: Binding   NVDI   Off-screen bitmaps +
  + +
+ +

7.10.38 Bindings for v_resize_bm

+ + + + + + + + + +
C: int16_t v_resize_bm( int16_t handle, int16_t width, int16_t +height, int32_t byte_width, uint16_t *addr ); +
  +
Binding: +
  +
int16_t v_resize_bm( int16_t handle, int16_t width,
+                     int16_t height, int32_t byte_width,
+                     uint16_t *addr )
+{
+   intin[0] = width;
+   intin[1] = height;
+   intin[2..3] = byte_width;
+   intin[4..5] = addr;
+
+   contrl[0] = 100;
+   contrl[1] = 0;
+   contrl[3] = 6;
+   contrl[5] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]100 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]6 # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+10contrl[5]2 # Sub-opcode
contrl+12contrl[6]handle
intinintin[0]width
intin+2intin[1]height
intin+4intin[2..3]byte_width
intin+8intin[4..5]addr
intoutintout[0]Return value
+
+ + +
+ +

7.10.39 v_savecache

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Save outline cache to disk« - Save the contents of the +vector (outline) font cache. +
  +
Opcode: 249 +
  +
Syntax: int16_t v_savecache ( int16_t handle, int8_t *filename ); +
  +
Description: The call v_savecache saves the contents of the vector font +cache to a file. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
filename Name of the file + +
+ +
Note: The file will be stored in the current directory. +
  +
Return value: The function returns the value -1 in case of error, else the +value 0. +
  +
Availability: FSMGDOS, from SpeedoGDOS 4.00 onwards. +
  +
Group: Control functions +
  +
See also: Binding   v_flushcache   v_loadcache   vqt_cachesize +
  + +
+ +

7.10.40 Bindings for v_savecache

+ + + + + + + + + +
C: int16_t v_savecache ( int16_t handle, int8_t *filename ); +
  +
Binding: +
  +
int16_t v_savecache ( int16_t handle, int8_t *filename )
+{
+   intin[0..n] = filename;      /* In 16-bit words */
+
+   contrl[0] = 249;
+   contrl[1] = 0;
+   contrl[3] = n;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]249 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]n # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+12contrl[6]handle
intinintin[0..n]filename
intoutintout[0]Return value
+
+ + +
+ +

7.10.41 v_save_cache

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Save outline cache to disk« - Save the contents of the +vector (outline) font cache. +
  +
Opcode: 226 (Subcode 6) +
  +
Syntax: int16_t v_save_cache ( int16_t handle, int8_t *filename ); +
  +
Description: The call v_save_cache saves the contents of the vector font +cache to a file. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
filename Name of the file + +
+ +
Note: The file will be stored in the current directory. +
  +
Return value: The function returns the value -1 in case of error, else the +value 0. +
  +
Availability: from SpeedoGDOS 5.1 onwards. +
  +
Group: Control functions +
  +
See also: Binding   v_flushcache   v_savecache   v_loadcache   +vqt_cachesize +
  + +
+ +

7.10.42 Bindings for v_save_cache

+ + + + + + + + + +
C: int16_t v_save_cache ( int16_t handle, int8_t *filename ); +
  +
Binding: +
  +
int16_t v_save_cache ( int16_t handle, int8_t *filename )
+{
+   intin[0..n] = filename;      /* In 16-bit words */
+
+   contrl[0] = 226;
+   contrl[1] = 0;
+   contrl[3] = n;
+   contrl[5] = 6;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]226 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]n # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+10contrl[5]6 # Sub-opcode
contrl+12contrl[6]handle
intinintin[0..n]filename
intoutintout[0]Return value
+
+ + +
+ +

7.10.43 v_set_app_buff

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Reserve Bezier workspace« - Designate memory for generating +Bezier splines. +
  +
Opcode: -1 +
  +
Syntax: void v_set_app_buff ( int16_t handle, int16_t **address, +int16_t nparagraphs ); +
  +
Description: The call v_set_app_buff designates buffer memory for use by the +Bezier spline generation routines. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
address Address of the buffer +
nparagraphs Buffer size in 16-byte blocks + +
+ +
Note: If Bezier functions are called then the spline +data will be stored in this buffer. Before program termination one +should use this function to set a NULL pointer as a buffer of size 0. +The application is then responsible for deallocating the reserved +memory. +
  +
If this function is not called by the application then GDOS will +create its own buffer of around 8 kbyte. +
  +
Return value: The function does not return a result. +
  +
Availability: FONTGDOS, FSMGDOS, as of GEM/3 Release 3.1, from SpeedoGDOS +4.00 and from NVDI 2.10 on. The function surfaces in the (paper) +documentation for NVDI 2.10, but no longer in all remaining +descriptions. +
  +
Group: Control functions +
  +
See also: Binding   v_bez_on   v_bez_off   v_bez   v_bez_fill   v_bez_qualGDOS   SpeedoGDOS +
  + +
+ +

7.10.44 Bindings for v_set_app_buff

+ + + + + + + + + +
C: void v_set_app_buff ( int16_t handle, int16_t **address, +int16_t nparagraphs ); +
  +
Binding: +
  +
void v_set_app_buff ( int16_t handle, int16_t **address,
+                      int16_t nparagraphs )
+{
+   intin[0..1] = address;
+   intin[2] = nparagraphs;
+
+   contrl[0] = -1;
+   contrl[1] = 0;
+   contrl[3] = 3;
+   contrl[5] = 6;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]-1 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]3 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]6 # Sub-opcode
contrl+12contrl[6]handle
intinintin[0..1]address
intin+4intin[2]nparagraphs
+
+ + +
+ +

7.10.45 v_updwk

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Update workstation« - Execute buffered output commands. +
  +
Opcode: 4 +
  +
Syntax: void v_updwk ( int16_t handle ); +
  +
Description: The call v_updwk induces the output device with the ID +handle to execute all buffered output commands. +
  +
Note: On the screen or with off-screen bitmaps this +function is not required, as here all graphics commands are carried +out immediately. With a printer no form-feed will be performed, while +with a metafile only the opcode is written to the buffer. +
  +
Incidentally, before print output the function should be called +once to initialize the printer. There are some special features that have to be +heeded with printer drivers, and specially with the Atari SLM laser +page-printers. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all printer, metafile, plotter, and camera devices +when using any form of GDOS. +
  +
Group: Control functions +
  +
See also: Binding   v_opnwk   v_output_window +
  + +
+ +

7.10.46 Bindings for v_updwk

+ + + + + + + + + + + + +
C: void v_updwk ( int16_t handle ); +
  +
Binding: +
  +
void v_updwk (int16_t handle)
+{
+   contrl[0] = 4;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]4 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+12contrl[6]handle
+
+ + +
Note: With printer drivers, one can output also a +custom buffer instead of the current page. This is done as +follows: +
  +
intin[0]  = High word, (!U)and(!u)
+intin[1]  = Low word of the buffer address
+contrl[0] = 4;
+contrl[1] = 1; /* Do not clear buffer */
+contrl[3] = 2;
+contrl[6] = handle;
+vdi ();
+
+
For laser printers of the Atari SLM series one can also +obtain the status of the output device. The following apply: +
  + + + + + + + + + + + + + + + + + + +
intout[0] Meaning +
    +
0 No error +
2 Printer not ready +
3 Out of toner +
5 Out of paper + +
+ +
See also: v_updwk   Control functions   GDOS   GDOS drivers +
  + +
+ +

7.10.47 vs_clip

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set clipping rectangle« +
  +
Opcode: 129 +
  +
Syntax: void vs_clip ( int16_t handle, int16_t clip_flag, int16_t +*pxyarray ); +
  +
Description: The call vs_clip limits all graphical output to a given region. +The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
clip_flag + + + + + + +
0 = Clipping off +
1 = Clipping on + +
+ +
pxyarray[0] X-coordinate, and +
pxyarray[1] Y-coordinate of a rectangle corner point +
pxyarray[2] X-coordinate, and +
pxyarray[3] Y-coordinate of the diagonally opposite corner point + +
+ +
Note: Do not switch off clipping, because a graphic +object which is drawn outside of the visible screen area will +overwrite memory or cause a bus error. +
  +
If the working area is to include the complete screen, it is +advisable to set the screen dimensions for vs_clip obtained from +v_opnvwk. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all drivers. +
  +
Group: Control functions +
  +
See also: Binding   Clipping +
  + +
+ +

7.10.48 Bindings for vs_clip

+ + + + + + + + + +
C: void vs_clip ( int16_t handle, int16_t clip_flag, int16_t +*pxyarray ); +
  +
Binding: +
  +
void vs_clip (int16_t handle, int16_t clip_flag,
+              int16_t *pxyarray)
+{
+   intin[0] = clip_flag;
+   ptsin[0..3] = pxyarray[0..3];
+
+   contrl[0] = 129;
+   contrl[1] = 2;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]129 # Function opcode
contrl+2contrl[1]2 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]1 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+12contrl[6]handle
intinintin[0]clip_flag
ptsinptsin[0..3]pxyarray[0..3]
+
+ + +
+ +

7.10.49 vst_ex_load_fonts

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Load fonts« - Extended version of additional font loading +routine. +
  +
Opcode: 119 +
  +
Syntax: int16_t vst_ex_load_fonts ( int16_t handle, int16_t select, +int16_t font_max, int16_t font_free ); +
  +
Description: The call vst_ex_load_fonts is an extension of the existing +vst_load_fonts call, with two additional input arguments to provide +control over font paging memory. The current defaults in units of +paragraphs are: +
  +
                  font_max     font_free
+For screens:     5120 (80K)         0
+For printers:      32767       640 (10K)
+
+
The GDOS attempts to allocate font_max paragraphs or all +of available menory (whichever is smaller) less font_free +paragraphs, and use this amount for font paging. +
  +
Depending on your needs, you can use either version of this +call. Note that both version use the same opcode. +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
select Reserved, should be 0 +
font_max Maximum number of paragraphs to allocate +
font_free Minimum number of paragraphs to leave free + +
+ +
Return value: The number of loaded fonts. +
  +
Availability: GEM/3 Release 3.1 +
  +
Group: Control functions +
  +
See also: Binding   vst_unload_fonts   vst_font   vqt_name   ASSIGN.SYS file   +GDOS +
  + +
+ +

7.10.50 Bindings for vst_ex_load_fonts

+ + + + + + + + + +
C: int16_t vst_ex_load_fonts ( int16_t handle, int16_t select, +int16_t font_max, int16_t font_free ); +
  +
Binding: +
  +
int16_t vst_ex_load_fonts ( int16_t handle, int16_t select,
+                            int16_t font_max,
+                            int16_t font_free )
+{
+   intin[0] = select;
+   intin[1] = font_max;
+   intin[2] = font_free;
+
+   contrl[0] = 119;
+   contrl[1] = 0;
+   contrl[3] = 3;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]119 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]3 # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+12contrl[6]handle
intinintin[0]select
intin+2intin[1]font_max
intin+4intin[2]font_free
intoutintout[0]Return value
+
+ + +
+ +

7.10.51 vst_load_fonts

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Load fonts« +
  +
Opcode: 119 +
  +
Syntax: int16_t vst_load_fonts ( int16_t handle, int16_t select ); +
  +
Description: The call vst_load_fonts loads further font information from +disk into memory for the workstation with the ID handle; the +fonts have to be listed in the ASSIGN.SYS file. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
select Reserved for future use = 0 + +
+ +
Note: Before you call vst_load_fonts, call vq_gdos and +make sure that the VDI can load additional fonts. +
  +
Return value: This will be the number of additional fonts loaded. If the +function is called more than once before using vst_unload_fonts, the +return will be 0. +
  +
Availability: Available with any form of GDOS. +
  +
Group: Control functions +
  +
See also: Binding   vst_unload_fonts   vst_font   vqt_name   ASSIGN.SYS file   +GDOS +
  + +
+ +

7.10.52 Bindings for vst_load_fonts

+ + + + + + + + + +
C: int16_t vst_load_fonts ( int16_t handle, int16_t select ); +
  +
Binding: +
  +
int16_t vst_load_fonts (int16_t handle, int16_t select)
+{
+   intin[0] = select;
+
+   contrl[0] = 119;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]119 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]1 # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+12contrl[6]handle
intinintin[0]select
intoutintout[0]Return value
+
+ + +
+ +

7.10.53 vst_unload_fonts

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Unload fonts« - Remove loaded fonts. +
  +
Opcode: 120 +
  +
Syntax: void vst_unload_fonts ( int16_t handle, int16_t select ); +
  +
Description: The call vst_unload_fonts removes all fonts that were loaded +previously by a vst_load_fonts call, and frees the associated memory. +The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
select Reserved, should be 0 + +
+ +
Note: System and vector fonts are not affected by this +function. +
  +
Return value: The function does not return a result. +
  +
Availability: Available with any form of GDOS. +
  +
Group: Control functions +
  +
See also: Binding   GDOS   vst_load_fonts +
  + +
+ +

7.10.54 Bindings for vst_unload_fonts

+ + + + + + + + + +
C: void vst_unload_fonts ( int16_t handle, int16_t select ); +
  +
Binding: +
  +
void vst_unload_fonts (int16_t handle, int16_t select)
+{
+   intin[0] = select;
+
+   contrl[0] = 120;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]120 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]1 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+12contrl[6]handle
intinintin[0]select
+
+ + +
+ +
+ +Home +VDIVDI +Colour table functionsColour table functions +Raster functionsRaster functions + + diff --git a/en/vdi_escape.html b/en/vdi_escape.html new file mode 100644 index 000000000..2c099b2ba --- /dev/null +++ b/en/vdi_escape.html @@ -0,0 +1,14660 @@ + + + + + +The documentation for TOS: Escape functions + + + + + + + + + +Home +VDIVDI +Input functionsInput functions +Colour table functionsColour table functions + +
+ +

7.8 Escape functions

+

This library contains functions to take advantage of special +features of a graphic device. For this purpose the following function +groups are available: +

+ + +

See also: VDI workstations   Style guidelines +

+

7.8.1 Special graphic functions

+

This library contains functions to output data on a printer, for +controlling the colour calibration, and many others. In all, the +following routines are available: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
v_bit_image Outputs image data on a printer +
v_clear_disp_list Clears printer buffer +
v_copies Sets number of copies +
v_dspcur Displays graphic cursor at given position +
v_form_adv Executes form-feed on a printer +
v_hardcopy Outputs hardcopy on a printer +
v_orient Sets output format +
v_output_window Outputs part of screen area on a printer +
v_page_size Sets page format +
v_rmcur Clears last graphic cursor +
v_tray Selects tray for paper feed-in/out +
v_xbit_image Outputs image data on a printer +
vq_bit_image Gets information about v_bit_image +
vq_calibrate Tests colour calibration +
vq_driver_info Gets information about a printer driver +
vq_driver_name Gets name of a driver +
vq_image_type Gets type of a bitmap file +
vq_margins Inquires printer margins +
vq_page_name Gets name and size of a page format +
vq_prn_scaling Gets scaling of the printer driver +
vq_scan Gets printer parameters +
vq_tabstatus Inquires availability of graphics tablet, mouse... +
vq_tray_names Gets name of paper tray/output slot +
vs_calibrate Tests colour calibration +
vs_crop Sets cropping rectangle on a document +
vs_document_info Sets document specifications for print monitor +
vs_load_disp_list Loads printer buffer +
vs_page_info Sets document specifications for print monitor +
vs_palette Selects the colour palette +
vs_save_disp_list Saves printer buffer + +
+ +

See also: VDI workstations   Style guidelines +

+

7.8.1.1 vq_bit_image

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire v_bit_image info« - Obtain information about +v_bit_image. +
  +
Opcode: 5 (Escape 2102) +
  +
Syntax: int16_t vq_bit_image( int16_t handle, int16_t *ver, int16_t +*maximg, int16_t *form ); +
  +
Description: The call vq_bit_image obtains the version number of v_bit_image +and the file formats that are supported. The following apply: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
ver Version number of v_bit_image +
maximg Maximum number of images per page +
form Supported file formats + + + + + + + + + +
Bit 0 & 1: + + + + + + + + + + + + +
00: Monochrome IMG +
01: Reserved +
10: Reserved +
11: Reserved + +
+ +
Bit 2 & 3: + + + + + + + + + + + + +
00: Unknown TGA +
01: Unpacked TGA type 2 +
10: Reserved +
11: Reserved + +
+ +
Bit 4..15: Reserved + +
+ + +
+ +
Return value: 0: Function does not exist +
  +
Availability: Available with new drivers from Thierry Rodolfo. +
  +
Group: Special graphic functions +
  +
See also: Binding v_bit_image vq_driver_info vq_image_type +
  + +
+ +

7.8.1.2 Bindings for vq_bit_image

+ + + + + + + + + +
C: int16_t vq_bit_image( int16_t handle, int16_t *ver, int16_t +*maximg, int16_t *form ); +
  +
Binding: +
  +
int16_t  vq_bit_image( int16_t handle, int16_t *ver,
+                  int16_t *maximg,
+                  int16_t *form )
+{
+   intout[0] = 0;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 2102;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *ver    = intout[1];
+   *maximg = intout[2];
+   *form   = intout[3];
+
+  return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]4 # Entry in intout
contrl+10contrl[5]2102 # Escape/Sub-opcode
contrl+12contrl[6]handle
intoutintout[0]Return Value
intout+2intout[1]ver
intout+4intout[2]maximg
intout+6intout[3]form
+
+ + +
+ +

7.8.1.3 vq_calibrate

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire calibration« - Test colour calibration. +
  +
Opcode: 5 (Escape 77) +
  +
Syntax: int16_t vq_calibrate ( int16_t handle, int16_t *flag ); +
  +
Description: The call vq_calibrate tests whether functions for calibration +are present, and if these are switched on. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
flag Calibration: + + + + + + +
0 = is off +
1 = is on + +
+ + +
+ +
Note for TC-VDI: Syntax is vq_calibrate(handle) and the +function returns intout[0] instead of contrl[4] which is always set to +1. +
  +
Return value: The function returns the value 1 if functions for calibration +are present, else the value 0. +
  +
Availability: NVDI (depends on the driver), MATRIX TC-VDI +
  +
Group: Special graphic functions +
  +
See also: Binding   vs_calibrate +
  + +
+ +

7.8.1.4 Bindings for vq_calibrate

+ + + + + + + + + +
C: int16_t vq_calibrate ( int16_t handle, int16_t *flag ); +
  +
Binding: +
  +
int16_t vq_calibrate (int16_t handle, int16_t *flag)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 77;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *flag = intout[0];
+   return (  contrl[4] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]n # Entry in intout
contrl+10contrl[5]77 # Escape/Sub-opcode
contrl+12contrl[6]handle
intoutintout[0]flag
+
+ +
Note: n specifies the number of entries in the intout +field. If contrl[4] contains the value 0, calibration is not +supported. +
  + +
+ +

7.8.1.5 vq_driver_info

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire driver info« - Obtain information about a printer +driver. +
  +
Opcode: 5 (Escape 2101) +
  +
Syntax: int16_t vq_driver_info ( int16_t handle, int16_t *lib, int16_t +*drv, int16_t *plane, int16 *attr, int8_t *name ); +
  +
Description: The call vq_driver_info returns information about a printer +driver and available features of the current library. The following +apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
lib Library version number +
drv Driver version number +
plane Number of planes +
+
+ + + + + + + + + + + + + + + +
1-Monochrome
3-CMY
4-CMYK
+
+ +
attr Supported attributes + + + + + + + + + + + + + + + + + + +
Bit 0: Four color +
Bit 1: Negative +
Bit 2: Mirror +
Bit 3 & 4: Multiple copies +
+
+ + + + + + + + + + + + + + + + + + + + +
0-No
1-Hardware
2-Software
3-Reserved
+
+ +
Bit 5: Landscape +
Bit 6..15: Reserved + +
+ +
name Name of the driver as up to 27 characters (26 + NULL) + +
+ +
Note: This function allows to determine if the new +vq_margin and vq_bit_image functions (Escape >= 2100) are +available. +
  +
Return value: 0: Function does not exist. +
  +
Availability: Available with new drivers from Thierry Rodolfo. +
  +
Group: Special graphic functions +
  +
See also: Binding   vq_margin   vq_bit_image +
  + +
+ +

7.8.1.6 Bindings for vq_driver_info

+ + + + + + + + + +
C: int16_t vq_driver_info ( int16_t handle, int16_t *lib, int16_t +*drv, int16_t *plane, int16_t *attr, int8_t *name ); +
  +
Binding: +
  +
int16_t vq_driver_info (int16_t handle, int16_t *lib, int16_t *drv,
+                  int16_t *plane, int16_t *attr, int8_t *name )
+{
+   int16_t tmp;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 2101;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *lib   = intout[1];
+   *drv   = intout[2];
+   *plane = intout[3];
+   *attr  = intout[4];
+   for (tmp = 0; tmp < 26; tmp++)
+     name[tmp] = intout[tmp+5];
+   name[26] = 0;
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]32 # Entry in intout
contrl+10contrl[5]2101 # Escape/Sub-opcode
contrl+12contrl[6]handle
intoutintout[0]Return Value
intout+2intout[1]lib
intout+4intout[2]drv
intout+6intout[3]plane
intout+8intout[4]attr
intout+10intout[5..31]name[0..26]
+
+ + +
+ +

7.8.1.7 vq_driver_name

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire driver name« - Obtain name of a driver. +
  +
Opcode: 5 (Escape 2108) +
  +
Syntax: int16_t vq_driver_name ( int16_t handle, int8_t *name ); +
  +
Description: The call vq_driver_name returns the name of a driver. The +following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
name Name of the driver as up to 27 characters (26 + NULL) + +
+ +
Return value: 0: Function does not exist. +
  +
Availability: Available with new drivers from Thierry Rodolfo. +
  +
Group: Special graphic functions +
  +
See also: Binding   vq_driver_info +
  + +
+ +

7.8.1.8 Bindings for vq_driver_name

+ + + + + + + + + +
C: int16_t vq_driver_name ( int16_t handle, int8_t *name ); +
  +
Binding: +
  +
int16_t vq_driver_name (int16_t handle, int8_t *name )
+{
+   int16_t tmp;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 2108;
+   contrl[6] = handle;
+
+   vdi ();
+
+   for (tmp = 0; tmp < 26; tmp++)
+     name[tmp] = intout[tmp];
+   name[26] = 0;
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]27 # Entry in intout
contrl+10contrl[5]2108 # Escape/Sub-opcode
contrl+12contrl[6]handle
intoutintout[0..26]name
+
+ + +
+ +

7.8.1.9 vq_image_type

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire image type« - Obtain type of a bitmap file. +
  +
Opcode: 5 (Escape 2105) +
  +
Syntax: int16_t vq_image_type ( int16_t handle, int8_t *filename, +BIT_IMAGE *image ) +
  +
Description: The call vq_image_type obtains the image type of the file whose +full pathname is specified by filename, and writes information +into the structure pointed to by image if its type is +supported by v_bit_image. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
filename Pointer to the name +
image Pointer to a BIT_IMAGE structure + +
+ +
Note: Currently the returned type is based on the file +extension. +
  +
Return value: The function can return the following values: +
  + + + + + + + + + +
0 : Unknown +
1 : IMG +
2 : TGA + +
+ +
Availability: Available with new drivers from Thierry Rodolfo. +
  +
Group: Special graphic functions +
  +
See also: Binding   v_bit_image   vq_bit_image   vq_driver_info +
  + +
+ +

7.8.1.10 Bindings for vq_image_type

+ + + + + + + + + +
C: int16_t vq_image_type ( int16_t handle, int8_t *filename, +BIT_IMAGE *image ) +
  +
Binding: +
  +
int16_t vq_image_type ( int16_t handle,
+   int8_t *filename, BIT_IMAGE *image )
+{
+   int16_t tmp;
+
+   ptsin[0..1] = image;
+
+   tmp = 0;
+   while (intin[tmp++] = *filename++)
+      ;
+   intin[tmp++] = 0;
+
+   contrl[0] = 5;
+   contrl[1] = 1;
+   contrl[3] = tmp;
+   contrl[5] = 2105;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[1] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]1 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]n+1 # Entry in intin
contrl+8contrl[4]2 # Entry in intout
contrl+10contrl[5]2105 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0..n]filename with NULL-byte
ptsinptsin[0..1]image
intoutintout[0]Availability
intout+2intout[1]Return Value
+
+ +
Note: If intout[0] contains the value 0, the function is +not available. +
  + +
+ +

7.8.1.11 vq_margins

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire printer margins« +
  +
Opcode: 5 (Escape 2100) +
  +
Syntax: int16_t vq_margins( int16_t handle, int16_t *top_margin, +int16_t *bottom_margin, int16_t *left_margin, int16_t *right_margin, +int16_t *hdpi, int16_t *vdpi ); +
  +
Description: The call vq_margins obtains the printer margins. The following +apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
top_margin Top margin in pixels +
bottom_margin Bottom margin in pixels +
left_margin Left margin in pixels +
right_margin Right margin in pixels +
hdpi Horizontal dpi resolution +
vdpi Vertical dpi resolution + +
+ +
Return value: 0: Function does not exist +
  +
Availability: As of NVDI 5.00. +
  +
Group: Special graphic functions +
  +
See also: Binding +
  + +
+ +

7.8.1.12 Bindings for vq_margins

+ + + + + + + + + +
C: int16_t vq_margins( int16_t handle, int16_t *top_margin, +int16_t *bottom_margin, int16_t *left_margin, int16_t *right_margin, +int16_t *hdpi, int16_t *vdpi ); +
  +
Binding: +
  +
int16_t  vq_margins( int16_t handle, int16_t *top_margin,
+                  int16_t *bottom_margin,
+                  int16_t *left_margin,
+                  int16_t *right_margin, int16_t *hdpi,
+                  int16_t *vdpi )
+{
+   intout[0] = 0;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 2100;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *top_margin    = intout[1];
+   *bottom_margin = intout[2];
+   *left_margin   = intout[3];
+   *right_margin  = intout[4];
+   *hdpi          = intout[5];
+   *vdpi          = intout[6];
+
+  return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]7 # Entry in intout
contrl+10contrl[5]2100 # Escape/Sub-opcode
contrl+12contrl[6]handle
intoutintout[0]Return Value
intout+2intout[1]top_margin
intout+4intout[2]bottom_margin
intout+6intout[3]left_margin
intout+8intout[4]right_margin
intout+10intout[5]hdpi
intout+12intout[6]vdpi
+
+ + +
+ +

7.8.1.13 vq_page_name

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire page name« - Obtain name and size of a page format. +
  +
Opcode: 5 (Escape 38) +
  +
Syntax: int16_t vq_page_name ( int16_t handle, int16_t page_id, int8_t +*page_name, int32_t *page_width, int32_t *page_height ) +
  +
Description: The call vq_page_name obtains the name and the physical size of +a page format. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
page_id Paper format +
page_name Pointer to the name, or NULL +
page_width Page width in microns (1/1000 mm) +
page_height Page height in microns (1/1000 mm) + +
+ +
Note: The data for the paper size include also the +non-printable margins. +
  +
Return value: The function returns the current paper format. A value of -1 +means that the specified page format is not known to the driver; in +that case no values will be returned in page_width or +page_height. +
  +
Availability: The function is only present if contrl[4] has a non-zero value. +
  +
Group: Special graphic functions +
  +
See also: Binding   v_opnwk   vq_extnd +
  + +
+ +

7.8.1.14 Bindings for vq_page_name

+ + + + + + + + + +
C: int16_t vq_page_name ( int16_t handle, int16_t page_id, int8_t +*page_name, int32_t *page_width, int32_t *page_height ) +
  +
Binding: +
  +
int16_t vq_page_name ( int16_t handle, int16_t page_id,
+   int8_t *page_name, int32_t *page_width,
+   int32_t *page_height )
+{
+   intin[0] = page_id;
+   intin[1..2] = page_name;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 3;
+   contrl[5] = 38;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *page_width  = intout[1..2];
+   *page_height = intout[3..4];
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]3 # Entry in intin
contrl+8contrl[4]5 # Entry in intout
contrl+10contrl[5]38 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]page_id
intin+2intin[1..2]page_name
intoutintout[0]Return Value
intout+2intout[1..2]page_width
intout+6intout[3..4]page_height
+
+ +
Note: If contrl[4] contains the value 0, the function is +not available. +
  + +
+ +

7.8.1.15 vq_prn_scaling

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire printer scaling« - Obtain scaling of the printer +driver. +
  +
Opcode: 5 (Escape 39) +
  +
Syntax: fixed vq_prn_scaling( int16_t handle ); +
  +
Description: The call vq_prn_scaling returns information whether the printer +driver takes heed of the scaling passed in the PRN_SETTINGS. If the +driver does not support the function (i.e. an old driver), the binding +returns -1 for the scaling. If we are dealing with a new driver that +supports the function but does not scale, then this returns -1. +
  +
If the driver performs the scaling, then the set scaling factor +will be returned (0x10000L corresponds to 100 %). +
  + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier + +
+ +
Return value: -1 if an old driver or scaling did not take place, else the set +scaling factor (0x10000L corresponds to 100%). +
  +
Availability: As of NVDI 5.00. +
  +
Group: Special graphic functions +
  +
See also: Binding +
  + +
+ +

7.8.1.16 Bindings for vq_prn_scaling

+ + + + + + + + + +
C: fixed vq_prn_scaling( int16_t handle ); +
  +
Binding: +
  +
fixed vq_prn_scaling( int16_t handle )
+{
+   intin[0] = -1;
+   intin[1] = -1;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 3;
+   contrl[5] = 39;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( *(fixed *) intout );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]3 # Entry in intin
contrl+8contrl[4]2 # Entry in intout
contrl+10contrl[5]39 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]-1
intin+2intin[1]-1
intoutintout[0..1]Return Value
+
+ +
Note: If contrl[4] contains the value 0, the function is +not available. +
  + +
+ +

7.8.1.17 vq_scan

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire printer scan« - Obtain parameters relating to +printer banding. +
  +
Opcode: 5 (Escape 24) +
  +
Syntax: void vq_scan ( int16_t handle, int16_t *g_slice, int16_t +*g_page, int16_t *a_slice, int16_t *a_page, int16_t *div_fac ); +
  +
Description: The call vq_scan permits inquiry of various printer-specific +parameters related to the number of graphic passes per printer page. +The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
g_slice Pixel height of a band +
g_page Number of bands into which the printer subdivides a page +
a_slice Height of an alpha text line in pixels +
a_page Alpha text lines per page +
div_fac Factor by which the other values may have to be divided + +
+ +
Notes: One can calculate the number of graphics scan +lines per pass from the formula g_slice/div_fac and the number +of scan lines per alpha text line from a_slice/div_fac. +
  +
This call has been previously mis-documented. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all printer drivers. +
  +
Group: Special graphic functions +
  +
See also: Binding +
  + +
+ +

7.8.1.18 Bindings for vq_scan

+ + + + + + + + + +
C: void vq_scan ( int16_t handle, int16_t *g_slice, int16_t +*g_page, int16_t *a_slice, int16_t *a_page, int16_t *div_fac ); +
  +
Binding: +
  +
void vq_scan (int16_t handle, int16_t *g_slice,
+              int16_t *g_page, int16_t *a_slice,
+              int16_t *a_page, int16_t *div_fac)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 24;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *g_slice = intout[0];
+   *g_page  = intout[1];
+   *a_slice = intout[2];
+   *a_page  = intout[3];
+   *div_fac = intout[4];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]5 # Entry in intout
contrl+10contrl[5]24 # Escape/Sub-opcode
contrl+12contrl[6]handle
intoutintout[0]g_slice
intout+2intout[1]g_page
intout+4intout[2]a_slice
intout+6intout[3]a_page
intout+8intout[4]div_fac
+
+ + +
+ +

7.8.1.19 vq_tabstatus

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire tablet status« - Obtain availability of a +specialized input device. +
  +
Opcode: 5 (Escape 16) +
  +
Syntax: int16_t vq_tabstatus ( int16_t handle ); +
  +
Description: The call vq_tabstatus checks on the workstation with the ID +handle for the availability of a graphics tablet, of a mouse, +a joystick or a similar device. +
  +
Return value: The function returns the value 1 if a corresponding device is +available, else the value 0 if this is not the case. +
  +
Availability: Supported by all screen drivers. +
  +
Group: Special graphic functions +
  +
See also: Binding +
  + +
+ +

7.8.1.20 Bindings for vq_tabstatus

+ + + + + + + + + +
C: int16_t vq_tabstatus ( int16_t handle ); +
  +
Binding: +
  +
int16_t vq_tabstatus (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 16;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+10contrl[5]16 # Escape/Sub-opcode
contrl+12contrl[6]handle
intoutintout[0]Return Value
+
+ + +
+ +

7.8.1.21 vq_tray_names

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire tray names« - Obtain name of the paper feed-in or +feed-out tray. +
  +
Opcode: 5 (Escape 36) +
  +
Syntax: void vq_tray_names ( int16_t handle, int8_t *input_name, int8_t +*output_name, int16_t *input, int16_t *output ); +
  +
Description: The call vq_tray_names obtains the name of the current feed-in +or feed-out tray. +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
input_name Pointer to the name of the input tray +
output_name Pointer to the name of the output tray +
input Number of the input tray +
output Number of the output tray + +
+ +
Note: If the parameters input_name or +output_name are NULL-pointers, they will not be returned. +
  +
Return value: The function returns no direct result. +
  +
Availability: The function is only present if contrl[4] is non-zero. +
  +
Group: Special graphic functions +
  +
See also: Binding   v_tray   v_copies   v_orient +
  + +
+ +

7.8.1.22 Bindings for vq_tray_names

+ + + + + + + + + +
C: void vq_tray_names ( int16_t handle, int8_t *input_name, int8_t +*output_name, int16_t *input, int16_t *output ); +
  +
Binding: +
  +
void vq_tray_names ( int16_t handle, int8_t *input_name,
+                     int8_t *output_name, int16_t *input,
+                     int16_t *output )
+{
+   intin[0..1] = input_name;
+   intin[2..3] = output_name;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 4;
+   contrl[5] = 36;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *input  = intout[0];
+   *output = intout[1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]4 # Entry in intin
contrl+8contrl[4]2 # Entry in intout
contrl+10contrl[5]36 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0..1]input_name
intin+4intin[2..3]output_name
intoutintout[0]input
intout+2intout[1]output
+
+ +
Note: If contrl[4] contains the value 0, the function is +not available. +
  + +
+ +

7.8.1.23 vs_calibrate

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set calibration« - Set colour calibration. +
  +
Opcode: 5 (Escape 76) +
  +
Syntax: int16_t vs_calibrate ( int16_t handle, int16_t flag, int16_t +*rgb ); +
  +
Description: The call vs_calibrate switches colour calibration on or off and +can be used to set a calibration table. +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
flag Calibration: + + + + + + +
0 = Turn off +
1 = Turn on + +
+ +
rgb Pointer to calibration table, or NULL + +
+ +
Note: A calibration table consists of 1001 RGB entries, +that allocate for the value range 0- to 1000- thousandths of each +input value a corrected thousandth value. Before calling this +function, one should use vq_calibrate to check whether it is even +present. +
  +
The colour calibration is valid for the whole system for the +driver identified by handle. Hence it should not be set by +individual applications, but only with a CPX module or a desk +accessory. +
  +
Note for TC-VDI: Syntax is vs_calibrate(handle, rgb, +flag) however intin entries are assigned to the same values in both +cases. +
  +
Return value: The function returns the value 0 if the calibration is switched +off, or the value 1 if this is switched on. +
  +
Availability: NVDI (depends on the driver), MATRIX TC-VDI. +
  +
Group: Special graphic functions +
  +
See also: Binding   vq_calibrate +
  + +
+ +

7.8.1.24 Bindings for vs_calibrate

+ + + + + + + + + +
C: int16_t vs_calibrate ( int16_t handle, int16_t flag, int16_t +*rgb ); +
  +
Binding: +
  +
int16_t vs_calibrate (int16_t handle, int16_t flag,
+                      int16_t *rgb)
+{
+   intin[0..1] = rgb;
+   intin[2] = flag;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 3;
+   contrl[5] = 76;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]3 # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+10contrl[5]76 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0..1]rgb
intin+4intin[2]flag
intoutintout[0]Return Value
+
+ + +
+ +

7.8.1.25 vs_crop

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set crop marks« - Sets a cropping rectangle on a document. +
  +
Opcode: 5 (Escape 2104) +
  +
Syntax: int16_t vs_crop ( int16_t handle, int16_t ltx1, int16_t lty1, +int16_t ltx2, int16_t lty2, int16_t ltlen, int16_t ltoffset ); +
  +
Description: The call vs_crop sets a cropping rectangle to print cutting +lines on a document. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
ltx1 X-coordinate, and +
lty1 Y-coordinate of top left corner point +
ltx2 X-coordinate, and +
lty2 Y-coordinate of bottom right corner point +
ltlen Length of the cutting lines +
ltoffset Position of cutting lines relative to coordinates + +
+ +
To remove the crop marks, set all parameters to 0. +
  +
Return value: 0: Function does not exist. +
  +
Availability: Available with new drivers from Thierry Rodolfo. +
  +
Group: Special graphic functions +
  +
See also: Binding +
  + +
+ +

7.8.1.26 Bindings for vs_crop

+ + + + + + + + + +
C: int16_t vs_crop ( int16_t handle, int16_t ltx1, int16_t lty1, +int16_t ltx2, int16_t lty2, int16_t ltlen, int16_t ltoffset ); +
  +
Binding: +
  +
int16_t vs_crop (int16_t handle, int16_t ltx1, int16_t lty1,
+            int16_t ltx2, int16_t lty2, int16_t ltlen, int16_t ltoffset)
+{
+   intin[0] = ltx1;
+   intin[1] = lty1;
+   intin[2] = ltx2;
+   intin[3] = lty2;
+   intin[4] = ltlen;
+   intin[5] = ltoffset;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 6;
+   contrl[5] = 2104;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]6 # entry in intin
contrl+8contrl[4]1 # entry in intout
contrl+10contrl[5]2104 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]ltx1
intin+2intin[1]lty1
intin+4intin[2]ltx2
intin+6intin[3]lty2
intin+8intin[4]ltlen
intin+10intin[5]ltoffset
intoutintout[0]Return value
+
+ + +
+ +

7.8.1.27 vs_document_info

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set document info« - Set document specifications for print +monitor. +
  +
Opcode: 5 (Escape 2103) +
  +
Syntax: int16_t vs_document_info( int16_t handle, int16_t type, void +*s, int16_t wchar ); +
  +
Description: The call vs_document_info passes to a program various +specifications about a document that the print monitor displays during +printout. +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
type + + + + + + + + + + + + + + + +
0 = Name of the application +
1 = Name of the document +
2 = Name of the originator/editor +
3 = Comment +
4 = Filename of the document + +
+ +
s Pointer to the string +
wchar 0: 8 bits per character +
1: 16 bits per character + +
+ +
Return value: 0: Function not present +
1: All OK +
  +
Availability: As of NVDI 5.00. +
  +
Group: Special graphic functions +
  +
See also: Binding +
  + +
+ +

7.8.1.28 Bindings for vs_document_info

+ + + + + + + + + +
C: int16_t vs_document_info( int16_t handle, int16_t type, void +*s, int16_t wchar ); +
  +
Binding: +
  +
int16_t  vs_document_info( int16_t handle, int16_t type,
+                           void *s, int16_t wchar )
+{
+   intin[0] = type;
+   intin[1..n-1] = s
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = n;
+   contrl[5] = 2103;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]n # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+10contrl[5]2103 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]type
intin+2intin[1..n-1]s
intoutintout[0]Return Value
+
+ + +
+ +

7.8.1.29 vs_load_disp_list

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Load display list« - Load the printer buffer list. +
  +
Opcode: 5 (Escape 2107) +
  +
Syntax: int16_t vs_load_disp_list ( int16_t handle, int8_t *name ); +
  +
Description: The call vs_load_disp_list loads the printer buffer with the +contents of a file. It can be used to load master documents for +example and provides huge time savings during printing. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
name Pointer to the name of the file + +
+ +
Return value: Return value of the function is unknown at present. +
  +
Availability: The function is only present if intout[0] is non-zero. +
  +
Group: Special graphic functions +
  +
See also: Binding   v_clear_disp_list   vs_save_disp_list +
  + +
+ +

7.8.1.30 Bindings for vs_load_disp_list

+ + + + + + + + + +
C: int16_t vs_load_disp_list ( int16_t handle, int8_t *name ); +
  +
Binding: +
  +
int16_t vs_load_disp_list ( int16_t handle, int8_t *name )
+{
+   intin[0..1] = name;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[5] = 2107;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[1] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]2 # Entry in intin
contrl+8contrl[4]2 # Entry in intout
contrl+10contrl[5]2107 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0..1]name
intoutintout[0]Availability
intout+2intout[1]Return value
+
+ +
Note: If intout[0] contains the value 0, the function is +not available. +
  + +
+ +

7.8.1.31 vs_page_info

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set page info« - Set document specifications for print +monitor. +
  +
Opcode: 5 (Escape 2103) +
  +
Syntax: int16_t vs_page_info( int16_t handle, int16_t type, int8_t *s +); +
  +
Description: The call vs_page_info allows a program to set various +specifications about a document that the print monitor displays during +printout. +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
type + + + + + + + + + + + + + + + +
0 = Name of the application +
1 = Name of the document +
2 = Name of the originator/editor +
3 = Comment +
4 = Filename of the document + +
+ +
s Pointer to the string (8 bits per character) which will be +written character by character into 16-bit entries of intin, including +the NULL-byte. + +
+ +
Return value: 0: Function not present +
1: All OK +
  +
Availability: Available with new drivers from Thierry Rodolfo. +
  +
Group: Special graphic functions +
  +
See also: Binding   vs_document_info +
  + +
+ +

7.8.1.32 Bindings for vs_page_info

+ + + + + + + + + +
C: int16_t vs_page_info( int16_t handle, int16_t type, int8_t *s +); +
  +
Binding: +
  +
int16_t  vs_page_info( int16_t handle, int16_t type,
+                           int8_t *s )
+{
+   intin[0] = type;
+   intin[1..n-1] = s;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = n;
+   contrl[5] = 2103;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]n # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+10contrl[5]2103 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]type
intin+2intin[1..n-1]s
intoutintout[0]Return Value
+
+ + +
+ +

7.8.1.33 vs_palette

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Select palette« - Select a colour palette. +
  +
Opcode: 5 (Escape 60) +
  +
Syntax: int16_t vs_palette ( int16_t handle, int16_t palette ); +
  +
Description: The call vs_palette permits the selection of the colour palette +on an IBM CGA graphics card in medium resolution. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
palette Colour palette + + + + + + +
0 = Red, Green, Blue +
1 = Cyan, Magenta, White + +
+ + +
+ +
Return value: The function returns the selected palette. +
  +
Availability: This call was originally designed for use on IBM CGA-based +computers. Its usefulness and availability are not guaranteed under +any driver, so it should be avoided. +
  +
Group: Special graphic functions +
  +
See also: Binding +
  + +
+ +

7.8.1.34 Bindings for vs_palette

+ + + + + + + + + +
C: int16_t vs_palette ( int16_t handle, int16_t palette ); +
  +
Binding: +
  +
int16_t vs_palette (int16_t handle, int16_t palette)
+{
+   intin[0] = palette;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 60;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]1 # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+10contrl[5]60 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]palette
intoutintout[0]Return Value
+
+ + +
+ +

7.8.1.35 vs_save_disp_list

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Save display list« - Save the printer buffer list. +
  +
Opcode: 5 (Escape 2106) +
  +
Syntax: int16_t vs_save_disp_list ( int16_t handle, int8_t *name ); +
  +
Description: The call vs_save_disp_list saves the printer buffer to a file. +It can be used to save master documents for example and provides huge +time savings during printing. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
name Pointer to the name of the file + +
+ +
Return value: Return value of the function is unknown at present. +
  +
Availability: The function is only present if intout[0] is non-zero. +
  +
Group: Special graphic functions +
  +
See also: Binding   v_clear_disp_list   vs_load_disp_list +
  + +
+ +

7.8.1.36 Bindings for vs_save_disp_list

+ + + + + + + + + +
C: int16_t vs_save_disp_list ( int16_t handle, int8_t *name ); +
  +
Binding: +
  +
int16_t vs_save_disp_list ( int16_t handle, int8_t *name )
+{
+   intin[0..1] = name;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[5] = 2106;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[1] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]2 # Entry in intin
contrl+8contrl[4]2 # Entry in intout
contrl+10contrl[5]2106 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0..1]name
intoutintout[0]Availability
intout+2intout[1]Return value
+
+ +
Note: If intout[0] contains the value 0, the function is +not available. +
  + +
+ +

7.8.1.37 v_bit_image

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Output bit image file« - Output a bit image file on the +printer. +
  +
Opcode: 5 (Escape 23) +
  +
Syntax: void v_bit_image ( int16_t handle, CONST int8_t *filename, +int16_t aspect, int16_t x_scale, int16_t y_scale, int16_t h_align, +int16_t v_align, int16_t *xyarray ); +
  +
Description: The call v_bit_image permits print output of the image data +stored in a bit-Image (IMG) file. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
filename Pointer to filename +
aspect Aspect ratio: + + + + + + +
0 = Ignore aspect ratio +
1 = Respect pixel aspect ratio + +
+ +
x_scale Scaling of the X-axis, and +
y_scale Scaling of the Y-axis, for both of which the following apply: + + + + + + +
0 = Rational (exact) +
1 = Integer + +
+ +
h_align Horizontal alignment: + + + + + + + + + +
0 = Left +
1 = Center +
2 = Right + +
+ +
v_align Vertical alignment: + + + + + + + + + +
0 = Top +
1 = Middle +
2 = Bottom + +
+ +
xyarray[0] X-coordinate, and +
xyarray[1] Y-coordinate of top left corner of the output rectangle +
xyarray[2] X-coordinate, and +
xyarray[3] Y-coordinate of the bottom right corner of the output recangle + +
+ +
Notes: If the aspect ratio in aspect is +honoured, then circles will appear as circles, squares as squares etc. +The image will then be stretched correspondingly on the output device. +In some circumstances this can look bad when, say, fine dot rasters +are stretched or compressed. If the ratio is ignored, it is possible +that circles will become ellipses etc. +
  +
If rational scaling is used, the image will appear at the +coordinates given by the VDI format rectangle pointed to by +xyarray; if integer scaling is used, the image will be +displayed as large as possible within the given coordinates, using +h_align and v_align for justifying the image. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all printer, metafile, and memory drivers. +
  +
Group: Special graphic functions +
  +
See also: Binding   v_xbit_image   GDOS   XIMG format +
  + +
+ +

7.8.1.38 Bindings for v_bit_image

+ + + + + + + + + +
C: void v_bit_image ( int16_t handle, CONST int8_t *filename, +int16_t aspect, int16_t x_scale, int16_t y_scale, int16_t h_align, +int16_t v_align, int16_t *xyarray ); +
  +
Binding: +
  +
void v_bit_image (int16_t handle, CONST int8_t *filename,
+                  int16_t aspect, int16_t x_scale,
+                  int16_t y_scale, int16_t h_align,
+                  int16_t v_align, int16_t *xyarray)
+{
+   int16_t tmp;
+
+   ptsin[0..3] = xyarray[0..3];
+   intin[0] = aspect;
+   intin[1] = x_scale;
+   intin[2] = y_scale;
+   intin[3] = h_align;
+   intin[4] = v_align;
+
+   tmp = 5;
+   while (intin[tmp++] = *filename++)
+      ;
+
+   contrl[0] = 5;
+   contrl[1] = 2;
+   contrl[3] = --tmp;
+   contrl[5] = 23;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]2 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]n+5 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]23 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]aspect
intin+2intin[1]x_scale
intin+4intin[2]y_scale
intin+6intin[3]h_align
intin+8intin[4]v_align
intin+10intin[5..n+4]filename[0..n-1]
ptsinptsin[0..3]xyarray[0..3]
+
+ + +
+ +

7.8.1.39 v_clear_disp_list

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Clear display list« - Clear the printer buffer list. +
  +
Opcode: 5 (Escape 22) +
  +
Syntax: void v_clear_disp_list ( int16_t handle ); +
  +
Description: The call v_clear_disp_list clears the printer buffer on the +workstation with the ID handle. +
  +
Note: A form-feed will not be performed by the +call. The function should be called, say, if the user wants to cancel +graphic output before the printout starts. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all printer, plotter, camera, metafile and memory +drivers. +
  +
Group: Special graphic functions +
  +
See also: Binding   GDOS   v_clrwk +
  + +
+ +

7.8.1.40 Bindings for v_clear_disp_list

+ + + + + + + + + +
C: void v_clear_disp_list ( int16_t handle ); +
  +
Binding: +
  +
void v_clear_disp_list (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 22;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]22 # Escape/Sub-opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.1.41 v_copies

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set number of copies« - Set number of copies of page to be +printed. +
  +
Opcode: 5 (Escape 28) +
  +
Syntax: int16_t v_copies ( int16_t handle, int16_t count ); +
  +
Description: The call v_copies determines the number of copies of the page +to be printed. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
count Number of copies (1 = normal), or -1 to obtain the number of +copies set + +
+ +
Note: All pages up to the closing or the output device +will be printed in the specified quantity. +
  +
Return value: The function returns the number of copies set. +
  +
Availability: GEM/3 Release 3.1, and otherwise only if contrl[4] contains +a non-zero value. +
  +
Group: Special graphic functions +
  +
See also: Binding   v_orient   v_tray +
  + +
+ +

7.8.1.42 Bindings for v_copies

+ + + + + + + + + +
C: int16_t v_copies ( int16_t handle, int16_t count ); +
  +
Binding: +
  +
int16_t v_copies ( int16_t handle, int16_t count )
+{
+   intin[0] = count;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 28;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]1 # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+10contrl[5]28 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]count
intoutintout[0]Return Value
+
+ +
Note: If contrl[4] contains the value 0, the function is +not available. +
  + +
+ +

7.8.1.43 v_dspcur

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Place graphic cursor at location« - Position the graphic +cursor at the specified position. +
  +
Opcode: 5 (Escape 18) +
  +
Syntax: void v_dspcur ( int16_t handle, int16_t x, int16_t y ); +
  +
Description: The call v_dspcur sets the graphic cursor (mouse pointer) at a +specified position. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
x New X-coordinate for mouse pointer +
y New Y-coordinate for mouse pointer + +
+ +
Note: The function is only available on devices that +permit position input, such as mouse, joystick or trackball, for +instance. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all screen drivers. +
  +
Group: Special graphic functions +
  +
See also: Binding +
  + +
+ +

7.8.1.44 Bindings for v_dspcur

+ + + + + + + + + +
C: void v_dspcur ( int16_t handle, int16_t x, int16_t y ); +
  +
Binding: +
  +
void v_dspcur (int16_t handle, int16_t x, int16_t y)
+{
+   ptsin[0] = x;
+   ptsin[1] = y;
+
+   contrl[0] = 5;
+   contrl[1] = 1;
+   contrl[3] = 0;
+   contrl[5] = 18;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]1 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]18 # Escape/Sub-opcode
contrl+12contrl[6]handle
ptsinptsin[0]x
ptsin+2ptsin[1]y
+
+ + +
+ +

7.8.1.45 v_form_adv

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Form advance« - Create a form-feed. +
  +
Opcode: 5 (Escape 20) +
  +
Syntax: void v_form_adv ( int16_t handle ); +
  +
Description: The call v_form_adv creates a form-feed on the workstation with +the ID handle. +
  +
Note: The data buffer and display list are not +cleared by this; with a metafile a corresponding entry will be made in +the file. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all drivers. +
  +
Group: Special graphic functions +
  +
See also: Binding   v_clrwk +
  + +
+ +

7.8.1.46 Bindings for v_form_adv

+ + + + + + + + + +
C: void v_form_adv ( int16_t handle ); +
  +
Binding: +
  +
void v_form_adv (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 20;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]20 # Escape/Sub-opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.1.47 v_hardcopy

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Hardcopy« - Create a hardcopy of the screen. +
  +
Opcode: 5 (Escape 17) +
  +
Syntax: void v_hardcopy ( int16_t handle ); +
  +
Description: The call v_hardcopy invokes the ALT-HELP screen dump to create +a hardcopy on the workstation with the ID handle (a printer or +a similar device). +
  +
Note: This is a function of the screen driver, which +accesses the XBIOS for this. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by screen drivers running under ST compatible +resolutions. +
  +
Group: Special graphic functions +
  +
See also: Binding +
  + +
+ +

7.8.1.48 Bindings for v_hardcopy

+ + + + + + + + + +
C: void v_hardcopy ( int16_t handle ); +
  +
Binding: +
  +
void v_hardcopy (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 17;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]17 # Escape/Sub-opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.1.49 v_orient

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set orientation for output« +
  +
Opcode: 5 (Escape 27) +
  +
Syntax: int16_t v_orient ( int16_t handle, int16_t orientation ); +
  +
Description: The call v_orient sets the output orientation for a device. The +following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
orientation Format: + + + + + + + + + +
-1 = Just return orientation +
0 = Set to portrait +
1 = Set to landscape + +
+ + +
+ +
Note: The desired setting must be performed +before any output is actioned. +
  +
If there is insufficient memory free to alter the orientation, +the function returns the value -1; in that case the printer +workstation must be closed with v_clswk. +
  +
Return value: The function returns the set output orientation, or -1 in case +of error. +
  +
Availability: GEM/3 Release 3.1 and otherwise only if contrl[4] has a +non-zero value. +
  +
Group: Special graphic functions +
  +
See also: Binding   v_copies   v_tray +
  + +
+ +

7.8.1.50 Bindings for v_orient

+ + + + + + + + + +
C: int16_t v_orient ( int16_t handle, int16_t orientation ); +
  +
Binding: +
  +
int16_t v_orient ( int16_t handle, int16_t orientation )
+{
+   intin[0] = orientation;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 27;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]1 # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+10contrl[5]27 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]orientation
intoutintout[0]Return Value
+
+ +
Note: If contrl[4] contains the value 0, the function is +not available. +
  + +
+ +

7.8.1.51 v_output_window

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Output window« - Output window contents on the printer. +
  +
Opcode: 5 (Escape 21) +
  +
Syntax: void v_output_window ( int16_t handle, int16_t *xyarray ); +
  +
Description: The call v_output_window outputs a specified portion of the +current page, and permits a picture to be printed split up between +various sheets. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
xyarray[0] X-coordinate, and +
xyarray[1] Y-coordinate of a corner of the output rectangle +
xyarray[2] X-coordinate, and +
xyarray[3] Y-coordinate of the diagonally opposite corner point + +
+ +
Notes: The difference to v_updwk consists of the fact +that a section can be selected using the coordinate system of the +printer. +
  +
Some printer drivers ignore the sides of the bounding box and +print the entire width of the page. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all printer and metafile drivers under any type of +GDOS. +
  +
Group: Special graphic functions +
  +
See also: Binding   v_updwk +
  + +
+ +

7.8.1.52 Bindings for v_output_window

+ + + + + + + + + +
C: void v_output_window ( int16_t handle, int16_t *xyarray ); +
  +
Binding: +
  +
void v_output_window (int16_t handle, int16_t *xyarray)
+{
+   ptsin[0..3] = xyarray[0..3];
+
+   contrl[0] = 5;
+   contrl[1] = 2;
+   contrl[3] = 0;
+   contrl[5] = 21;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]2 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]21 # Escape/Sub-opcode
contrl+12contrl[6]handle
ptsinptsin[0..3]xyarray[0..3]
+
+ + +
+ +

7.8.1.53 v_page_size

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set page size« +
  +
Opcode: 5 (Escape 37) +
  +
Syntax: int16_t v_page_size ( int16_t handle, int16_t page_id ); +
  +
Description: The call v_page_size enables one to set the page format for an +output device. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
page_id Desired paper format: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
0 = Default setting +
1 = DIN A3 +
2 = DIN A4 +
3 = DIN A5 +
4 = DIN B5 +
16 = Letter size +
17 = Half size +
18 = Legal size +
19 = Double size +
20 = Broadsheet size + +
+ + +
+ +
Note: If the requested size does not exist, the default +setting will be used. +
  +
Return value: The function returns the set paper format. For a return value +of -1 the workstation has to be closed, as insufficient free memory is +available. +
  +
Availability: The function is only present of contrl[4] contains a non-zero +value. +
  +
Group: Special graphic functions +
  +
See also: Binding   v_opnwk   vq_extnd +
  + +
+ +

7.8.1.54 Bindings for v_page_size

+ + + + + + + + + +
C: int16_t v_page_size ( int16_t handle, int16_t page_id ); +
  +
Binding: +
  +
int16_t v_page_size ( int16_t handle, int16_t page_id )
+{
+   intin[0] = page_id;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 37;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]1 # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+10contrl[5]37 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]page_id
intoutintout[0]Return Value
+
+ +
Note: If contrl[4] contains the value 0, the function is +not available. +
  + +
+ +

7.8.1.55 v_rmcur

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Remove last graphic cursor« +
  +
Opcode: 5 (Escape 19) +
  +
Syntax: void v_rmcur ( int16_t handle ); +
  +
Description: The call v_rmcur removes the last mouse cursor displayed on the +workstation with the ID handle. +
  +
Note: This function should only be used in conjunction +with v_dspcur when the mouse is moved manually. graf_mouse or v_hide_c +should be used unless this is your intention. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all screen drivers. +
  +
Group: Special graphic functions +
  +
See also: Binding +
  + +
+ +

7.8.1.56 Bindings for v_rmcur

+ + + + + + + + + +
C: void v_rmcur ( int16_t handle ); +
  +
Binding: +
  +
void v_rmcur (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 19;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]19 # Escape/Sub-opcode
contrl+12contrl[6]handle
+
+ + +
+ + +

7.8.1.57 v_tray

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set input and output tray« - Set input and output tray of +the printer. +
  +
Opcode: 5 (Escape 29) +
  +
Syntax: void v_tray ( int16_t handle, int16_t input, int16_t output, +int16_t *set_input, int16_t *set_output ); +
  +
Description: The call v_tray determines the printer slot or tray for the +paper feed-in and feed-out. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
input Paper feed: + + + + + + + + + + + + +
-1 = Manual input +
0 = Default input (tray 1) +
1 = Tray 2 +
n = n-th optional tray or slot + +
+ +
output Paper output: + + + + + + + + + +
0 = Standard output (usually front) +
1 = Output 2 +
n = n-th optional slot or tray + +
+ +
set_input Actually selected feed-in +
set_output Actually set feed-out slot or tray + +
+ +
Note: If the requested tray does not exist, the standard +tray will be selected (input 0 and output 0). The names of the input +and output trays/slots can be determined with vq_tray_names. +
  +
Return value: The function does not return a result. +
  +
Availability: GEM/3 Release 3.1 and otherwise only if contrl[4] has a +non-zero value. In NVDI this function is called v_trays. In GEM/3 +this function is called v_tray, and has only 1 parameter. +
  +
Group: Special graphic functions +
  +
See also: Binding   vq_tray_names   v_copies   v_orient +
  + +
+ +

7.8.1.58 Bindings for v_tray

+ + + + + + + + + +
C: void v_tray ( int16_t handle, int16_t input, int16_t output, +int16_t *set_input, int16_t *set_output ); +
  +
Binding: +
  +
void v_tray ( int16_t handle, int16_t input, int16_t output,
+               int16_t *set_input, int16_t *set_output )
+{
+   intin[0] = input;
+   intin[1] = output;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[5] = 29;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *set_input  = intout[0];
+   *set_output = intout[1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]2 # Entry in intin
contrl+8contrl[4]2 # Entry in intout
contrl+10contrl[5]29 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]input
intin+2intin[1]output
intoutintout[0]set_input
intout+2intout[1]set_output
+
+ + +
+ +

7.8.1.59 v_xbit_image

+ + + + + + + + + + + + + + + +
Opcode: 5 (Escape 101) +
  +
Syntax: void v_xbit_image(int16_t handle, const char *filename, int16_t +aspect, int16_t x_scale, int16_t y_scale, int16_t h_align, int16_t +v_align, int16_t rotation, int16_t foreground, int16_t background, +int16_t xy[]) +
  +
Description: The call v_xbit_image draws an image from a disk file onto the +current device - with rotation and colouring. +
  +
Passed #ptsin=2, #intin=8 + length of filename. +
  +
INTIN holds: +
  +
    +
  • 0 to ignore aspect ratio, 1 to preserve it +
  • +
  • X axis scaling: 0 = fractional, 1 = integer +
  • +
  • Y axis scaling: 0 = fractional, 1 = integer +
  • +
  • Horizontal alignment: 0=left 1=centre 2=right +
  • +
  • Vertical alignment: 0=top 1=centre 2=bottom +
  • +
  • Rotation angle, 0 - 3600 in 1/10th degrees +
  • +
  • Foreground colour if drawing a monochrome image on a colour +device +
  • +
  • Background colour +
  • +
  • Filename, one character per word +
  • +
+ +
Availability: GEM/3 and later +
  +
Group: Special graphic functions +
  + +
+ +

7.8.2 Graphics tablet functions

+

This library contains functions to access a graphics tablet in +an optimum manner. The following routines are available for this +purpose: +

+ + + + + + + + + + + + + + + +
vq_tdimensions Gets dimensions of the graphics tablet in 1/10 inch +
vt_alignment Sets offsets to graphics tablet coordinate system +
vt_axis Sets resolution of the graphics tablet +
vt_origin Sets coordinate origin for graphics tablet +
vt_resolution Sets resolution of the graphics tablet + +
+ +

See also: VDI workstations   Style guidelines +

+

7.8.2.1 vq_tdimensions

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Return tablet x and y dimensions« - Dimensions of the +graphics tablets in 1/10-inch. +
  +
Opcode: 5 (Escape 84) +
  +
Syntax: void vq_tdimensions ( int16_t handle, int16_t *xdimension, +int16_t *ydimension ); +
  +
Description: The call vq_tdimensions returns the scanning dimensions of an +attached graphics tablet in 1/10 inch. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
xdimension Width in 1/10 inch on exit +
ydimension Height in 1/10 inch on exit + +
+ +
Return value: The function does not return a result. +
  +
Availability: Supported by all tablet drivers. +
  +
Group: Graphics tablet functions +
  +
See also: Binding   GDOS   vq_tabstatus   vt_alignment   vt_resolution   +vt_axis   vt_origin +
  + +
+ +

7.8.2.2 Bindings for vq_tdimensions

+ + + + + + + + + +
C: void vq_tdimensions ( int16_t handle, int16_t *xdimension, +int16_t *ydimension ); +
  +
Binding: +
  +
void vq_tdimensions (int16_t handle, int16_t *xdimension,
+                     int16_t *ydimension)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 84;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *xdimension = intout[0];
+   *ydimension = intout[1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]2 # Entry in intout
contrl+10contrl[5]84 # Escape/Sub-opcode
contrl+12contrl[6]handle
intoutintout[0]xdimension
intout+2intout[1]ydimension
+
+ + +
+ +

7.8.2.3 vt_alignment

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set tablet alignment« - Align coordinate system of the +graphics tablet. +
  +
Opcode: 5 (Escape 85) +
  +
Syntax: void vt_alignment ( int16_t handle, int16_t dx, int16_t dy ); +
  +
Description: The call vt_alignment allows the specification of an offset to +be applied to all coordinates output from a connected graphics tablet. +The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
dx X-offset from origin +
dy Y-offset from origin + +
+ +
Return value: The function does not return a result. +
  +
Availability: Supported by all tablet drivers. +
  +
Group: Graphics tablet functions +
  +
See also: Binding   GDOS   vq_tabstatus   vq_tdimensions   vt_resolutionvt_axis   vt_origin +
  + +
+ +

7.8.2.4 Bindings for vt_alignment

+ + + + + + + + + +
C: void vt_alignment ( int16_t handle, int16_t dx, int16_t dy ); +
  +
Binding: +
  +
void vt_alignment (int16_t handle, int16_t dx, int16_t dy)
+{
+   intin[0] = dx;
+   intin[1] = dy;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[5] = 85;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]2 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]85 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]dx
intin+2intin[1]dy
+
+ + +
+ +

7.8.2.5 vt_axis

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set tablet axis resolution in lines« - Set the resolution of +the graphics tablet in lines. +
  +
Opcode: 5 (Escape 82) +
  +
Syntax: void vt_axis ( int16_t handle, int16_t xres, int16_t yres, +int16_t *xset, int16_t *yset ); +
  +
Description: The call vt_axis sets the horizontal and vertical resolution +for an attached graphics tablet in lines. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
xres Desired resolution in lines in X-direction, +
yres and in Y-direction +
xset Actual resolution in lines in X-direction, +
yset and in Y-direction + +
+ +
Return value: The function does not return a result. +
  +
Availability: Supported by all tablet drivers. +
  +
Group: Graphics tablet functions +
  +
See also: Binding   GDOS   vq_tabstatus   vt_alignment   vt_resolution   +vt_origin   vq_tdimensions +
  + +
+ +

7.8.2.6 Bindings for vt_axis

+ + + + + + + + + +
C: void vt_axis ( int16_t handle, int16_t xres, int16_t yres, +int16_t *xset, int16_t *yset ); +
  +
Binding: +
  +
void vt_axis (int16_t handle, int16_t xres, int16_t yres,
+              int16_t *xset, int16_t *yset)
+{
+   intin[0] = xres;
+   intin[1] = yres;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[5] = 82;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *xset = intout[0];
+   *yset = intout[1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]2 # Entry in intin
contrl+8contrl[4]2 # Entry in intout
contrl+10contrl[5]82 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]xres
intin+2intin[1]yres
intoutintout[0]xset
intout+2intout[1]yset
+
+ + +
+ +

7.8.2.7 vt_origin

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set tablet X and Y origin« - Set coordinate origin for +graphics tablet. +
  +
Opcode: 5 (Escape 83) +
  +
Syntax: void vt_origin ( int16_t handle, int16_t xorigin, int16_t +yorigin ); +
  +
Description: The call vt_origin sets the point of origin for the coordinate +system (top left corner) of an attached graphics tablet. The following +apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
xorigin X-coordinate, and +
yorigin Y-coordinate of the top left corner + +
+ +
Return value: The function does not return a result. +
  +
Availability: Supported by all tablet drivers. +
  +
Group: Graphics tablet functions +
  +
See also: Binding   GDOS   vq_tabstatus   vt_alignment   vt_resolution   +vt_axis   vq_tdimensions +
  + +
+ +

7.8.2.8 Bindings for vt_origin

+ + + + + + + + + +
C: void vt_origin ( int16_t handle, int16_t xorigin, int16_t +yorigin ); +
  +
Binding: +
  +
void vt_origin (int16_t handle, int16_t xorigin,
+                int16_t yorigin)
+{
+   intin[0] = xorigin;
+   intin[1] = yorigin;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[5] = 83;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]2 # Entry in intin
contrl+8contrl[4]2 # Entry in intout
contrl+10contrl[5]83 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]xorigin
intin+2intin[1]yorigin
+
+ + +
+ +

7.8.2.9 vt_resolution

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set tablet axis resolution in lines/inch« - Set the +resolution of the graphics tablet in lines per inch. +
  +
Opcode: 5 (Escape 81) +
  +
Syntax: void vt_resolution ( int16_t handle, int16_t xres, int16_t +yres, int16_t *xset, int16_t *yset ); +
  +
Description: The call vt_resolution sets the horizontal and vertical +resolution on an attached graphics tablet in lines per inch. The +following apply: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
xres Resolution in lines per inch (lpi) in X-direction, and +in +
yres Y-direction +
xset Actually set resolution in X-direction, and +
yset Y-direction + +
+ +
Return value: The function does not return a result. +
  +
Availability: Supported by all tablet drivers. +
  +
Group: Graphics tablet functions +
  +
See also: Binding   GDOS   vq_tabstatus   vt_alignment   vt_axis   +vt_origin   vq_tdimensions +
  + +
+ +

7.8.2.10 Bindings for vt_resolution

+ + + + + + + + + +
C: void vt_resolution ( int16_t handle, int16_t xres, int16_t +yres, int16_t *xset, int16_t *yset ); +
  +
Binding: +
  +
void vt_resolution (int16_t handle, int16_t xres,
+                    int16_t yres,
+                    int16_t *xset, int16_t *yset)
+{
+   intin[0] = xres;
+   intin[1] = yres;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[5] = 81;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *xset = intout[0];
+   *yset = intout[1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]2 # Entry in intin
contrl+8contrl[4]2 # Entry in intout
contrl+10contrl[5]81 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]xres
intin+2intin[1]yres
intoutintout[0]xset
intout+2intout[1]yset
+
+ + +
+ +

7.8.3 Metafile functions

+

This library contains functions that are indispensable for +creating metafiles. In all, the following routines are available: +

+ + + + + + + + + + + + + + + +
v_meta_extents Calculates dimensions of a metafile +
v_write_meta Stores graphic primitives in a metafile +
vm_coords Sets new coordinate system for a metafile +
vm_filename Renames a metafile +
vm_pagesize Sets physical page size for a metafile + +
+ +

Note: The main purpose of a metafile lies in +standardized data exchange between various GEM systems. +

+

See also: +
Metafile format   VDI workstations   Style guidelines   VDI +fundamentals +

+

7.8.3.1 vm_coords

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »VDI metafile coordinates« - Custom coordinate system for +metafiles. +
  +
Opcode: 5 (Escape 99, Opcode 1) +
  +
Syntax: void vm_coords ( int16_t handle, int16_t llx, int16_t lly, +int16_t urx, int16_t ury ); +
  +
Description: The call vm_coords sets the coordinate system used for the page +of a metafile. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
llx X-coordinate, and +
lly Y-coordinate (lower left) +
urx X-coordinate, and +
ury Y-coordinate (upper right) + +
+ +
Notes: With this function one must note in which +coordinate type (NDC or RC) the metafile was opened, and if necessary +the Y-values have to be adapted. +
  +
This function permits use of almost any coordinate system with +limit of (-32768, -32768), (32767, 32767). +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all metafile drivers. +
  +
Group: Metafile functions +
  +
See also: Binding   v_write_meta   Metafile format   sub-opcodes +
  + +
+ +

7.8.3.2 Bindings for vm_coords

+ + + + + + + + + +
C: void vm_coords ( int16_t handle, int16_t llx, int16_t lly, +int16_t urx, int16_t ury ); +
  +
Binding: +
  +
void vm_coords (int16_t handle, int16_t llx, int16_t lly,
+                int16_t urx, int16_t ury)
+{
+   intin[0] = 1;
+   intin[1] = llx;
+   intin[2] = lly;
+   intin[3] = urx;
+   intin[4] = ury;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 5;
+   contrl[5] = 99;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]5 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]99
contrl+12contrl[6]handle
intinintin[0]1 # Sub-opcode
intin+2intin[1]llx
intin+4intin[2]lly
intin+6intin[3]urx
intin+8intin[4]ury
+
+ + +
+ +

7.8.3.3 vm_filename

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Change GEM VDI file name« - Change the name of a +metafile. +
  +
Opcode: 5 (Escape 100) +
  +
Syntax: void vm_filename ( int16_t handle, CONST int8_t *filename ); +
  +
Description: The call vm_filename renames a metafile from the default +GEMFILE.GEM to another name while retaining the extension GEM. +The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
filename New name of the metafile (NULL-terminated) + +
+ +
Note: The parameter filename can also contain a +path name with drive identifier. If the function is not called +immediately after an v_opnwk call, then it will have no effect. A +possibly opened metafile will be closed. +
  +
As older metafile drivers (in contrast to NVDI drivers) may not +delete the source file "GEMFILE.GEM" which is created in +the current directory, the application should take over this task +itself. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all metafile drivers. +
  +
Group: Metafile functions +
  +
See also: Binding   GDOS   v_opnwk   Metafile format   sub-opcodes +
  + +
+ +

7.8.3.4 Bindings for vm_filename

+ + + + + + + + + +
C: void vm_filename ( int16_t handle, CONST int8_t *filename ); +
  +
Binding: +
  +
void vm_filename (int16_t handle, CONST int8_t *filename)
+{
+   int16_t *tmp;
+
+   tmp = intin;
+   while (*tmp++ = *filename++)
+      ;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = ((int16_t) (tmp-intin)-1);
+   contrl[5] = 100;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]n # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]100 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0..n-1]filename[0..n-1]
+
+ + +
+ +

7.8.3.5 vm_pagesize

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »VDI page size« - Set the physical page size for +metafiles. +
  +
Opcode: 5 (Escape 99, Opcode 0) +
  +
Syntax: void vm_pagesize ( int16_t handle, int16_t pgwidth, int16_t +pgheight ); +
  +
Description: The call vm_pagesize sets the metafile's source page size in +1/10 mm. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
pgwidth Page width in 1/10 mm +
pgheight Page height in 1/10 mm + +
+ +
Note: As the width and height of a page may be set +separately, it is also possible to create graphics in landscape format +(width greater than the height). +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all metafile drivers. +
  +
Group: Metafile functions +
  +
See also: Binding   v_write_meta   Metafile format   sub-opcodes +
  + +
+ +

7.8.3.6 Bindings for vm_pagesize

+ + + + + + + + + +
C: void vm_pagesize ( int16_t handle, int16_t pgwidth, int16_t +pgheight ); +
  +
Binding: +
  +
void vm_pagesize (int16_t handle, int16_t pgwidth,
+                  int16_t pgheight)
+{
+   intin[0] = 0;
+   intin[1] = pgwidth;
+   intin[2] = pgheight;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 3;
+   contrl[5] = 99;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]3 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]99
contrl+12contrl[6]handle
intinintin[0]0 # Sub-opcode
intin+2intin[1]pgwidth
intin+4intin[2]pgheight
+
+ + +
+ +

7.8.3.7 v_meta_extents

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Update metafile extents« - Update the size information for a +metafile. +
  +
Opcode: 5 (Escape 98) +
  +
Syntax: void v_meta_extents ( int16_t handle, int16_t min_x, int16_t +min_y, int16_t max_x, int16_t max_y ); +
  +
Description: The call v_meta_extents updates the size information in the +header of a metafile. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
min_x Minimum X-value, and +
min_y Minimum Y-value of the smallest bounding box (the top left +corner) +
max_x Maximum X-value, and +
max_y Maximum Y-value of the smallest bounding box (the bottom right +corner) + +
+ +
Notes: The size information can be used to obtain +quickly the minimum or maximum dimensions of all the primitives stored +in the metafile. +
  +
The parameters sent to this call should be specified in whatever +coordinate system the metafile is using at the time. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all metafile drivers. +
  +
Group: Metafile functions +
  +
See also: Binding   GDOS   vm_filename   v_write_meta   Metafile format +
  + +
+ +

7.8.3.8 Bindings for v_meta_extents

+ + + + + + + + + +
C: void v_meta_extents ( int16_t handle, int16_t min_x, int16_t +min_y, int16_t max_x, int16_t max_y ); +
  +
Binding: +
  +
void v_meta_extents (int16_t handle, int16_t min_x,
+                     int16_t min_y, int16_t max_x,
+                     int16_t max_y)
+{
+   ptsin[0] = min_x;
+   ptsin[1] = min_y;
+   ptsin[2] = max_x;
+   ptsin[3] = max_y;
+
+   contrl[0] = 5;
+   contrl[1] = 2;
+   contrl[3] = 0;
+   contrl[5] = 98;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]2 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]98 # Escape/Sub-opcode
contrl+12contrl[6]handle
ptsinptsin[0]min_x
ptsin+2ptsin[1]min_y
ptsin+4ptsin[2]max_x
ptsin+6ptsin[3]max_y
+
+ + +
+ +

7.8.3.9 v_write_meta

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Write metafile item« - Write an object to a metafile. +
  +
Opcode: 5 (Escape 99) +
  +
Syntax: void v_write_meta ( int16_t handle, int16_t num_intin, int16_t +*a_intin, int16_t num_ptsin, int16_t *a_ptsin ); +
  +
Description: The call v_write_meta permits the marking of a parameter +written to a metafile with an opcode as a user-defined graphic object. +The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
num_intin Number of values in intin array (0 - 127) +
num_ptsin Number of values in ptsin array(0 - 127) +
a_intin[0] Sub-opcode (user-defined) +
a_intin[1]   +
:   +
:   +
a_intin[num_intin-1] User-defined information +
a_ptsin[0]   +
:   +
:   +
a_ptsin[num_ptsin-1] User-defined information + +
+ +
Note: Sub-opcodes 0 to 100 are reserved; some have been +pre-defined: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
a_intinMeaning
10Start group
11End group
49Set no line style
50Set attribute shadow on
51Set attribute shadow off
80Start draw area type primitive
81End draw area type primitive
+
+ +
Return value: The function does not return a result. +
  +
Availability: Supported by all metafile drivers. +
  +
Group: Metafile functions +
  +
See also: Binding   GDOS   v_meta_extents   Metafile format   sub-opcodes +
  + +
+ +

7.8.3.10 Bindings for v_write_meta

+ + + + + + + + + +
C: void v_write_meta ( int16_t handle, int16_t num_intin, int16_t +*a_intin, int16_t num_ptsin, int16_t *a_ptsin ); +
  +
Binding: +
  +
void v_write_meta (int16_t handle, int16_t num_intin,
+                   int16_t *a_intin, int16_t num_ptsin,
+                   int16_t *a_ptsin)
+{
+   intin[0..num_intin-1] = a_intin[0..num_intin-1];
+   ptsin[0..num_ptsin-1] = a_ptsin[0..num_ptsin-1];
+
+   contrl[0] = 5;
+   contrl[1] = num_ptsin;
+   contrl[3] = num_intin;
+   contrl[5] = 99;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]num_ptsin # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]num_intin # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]99 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]User-defined sub-opcode
intin+2intin[1..n]User-defined information
ptsinptsin[0..m]User-defined information
+
+ + +
+ +

7.8.4 Polaroid functions

+

This library contains functions to access a Polaroid image +recorder. The following routines are available for this purpose: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
vqp_error Gets error codes of the Polaroid driver +
vqp_filmname Gets name from a film number +
vqp_films Gets available film types +
vqp_state Gets status of the Polaroid driver +
vsc_expose Switches on/off preview option for camera +
vsp_film Sets film type and exposure time +
vsp_message Suppresses or permits error-messages of the Polaroid driver +
vsp_save Saves settings of the Polaroid driver +
vsp_state Resets Polaroid driver + +
+ +

Note: Drivers for the Polaroid palette are non-existent +at the time of writing. The functions vsp_film, vqp_filmname and +vsc_expose were introduced with PC-GEM Version 2.0, and replace the +other six routines from GEM 1.x. +

+

See also: VDI workstations   Style guidelines +

+

7.8.4.1 vqp_error

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Polaroid error inquire« - Return the number of an error that +has occurred. +
  +
Opcode: 5 (Escape 96) +
  +
Syntax: int16_t vqp_error ( int16_t handle ); +
  +
Description: The call vqp_error obtains the last error occurring in +connection with the Polaroid image recorder with the ID +handle. +
  +
Return value: The function returns: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Value Meaning +
    +
0 No error +
1 Shutter open +
2 No port selected +
3 Palette not available at chosen port +
4 Connection broken off +
5 Operating system does not allow memory allocation +
6 Insuficient buffer memory +
7 No free memory +
8 Workstation driver file missing +
9 Workstation driver file has an invalid format +
10 Film at end + +
+ +
Availability: This function is no longer available from PC-GEM Version 2.0 +onwards. +
  +
Group: Polaroid functions +
  +
See also: Binding   GDOS +
  + +
+ +

7.8.4.2 Bindings for vqp_error

+ + + + + + + + + +
C: int16_t vqp_error ( int16_t handle ); +
  +
Binding: +
  +
int16_t vqp_error ( int16_t handle );
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 96;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+10contrl[5]96 # Escape/Sub-opcode
contrl+12contrl[6]handle
intoutintout[0]Return Value
+
+ + +
+ +

7.8.4.3 vqp_filmname

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire camera film name« - Obtain the name of a given film +number. +
  +
Opcode: 5 (Escape 92) +
  +
Syntax: int16_t vqp_filmname ( int16_t handle, int16_t index, int8_t +*name ); +
  +
Description: The call vqp_filmname returns the corresponding name belonging +to a film number. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
index Number of the film type +
name Name of the film (NULL-terminated) + +
+ +
Note: With an invalid film number the return will be a +NULL-string. +
  +
Return value: The function returns the value 0 if an invalid film number was +passed. +
  +
Availability: The function is available only from PC-GEM Version 2.0 +onwards. +
  +
Group: Polaroid functions +
  +
See also: Binding   GDOS +
  + +
+ +

7.8.4.4 Bindings for vqp_filmname

+ + + + + + + + + +
C: int16_t vqp_filmname ( int16_t handle, int16_t index, int8_t +*name ); +
  +
Binding: +
  +
int16_t vqp_filmname (int16_t handle, int16_t index,
+                      int8_t *name)
+{
+   int16_t tmp;
+
+   intin[0] = index;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 92;
+   contrl[6] = handle;
+
+   vdi ();
+
+   for (tmp = 0; tmp < contrl[4]; tmp++)
+      name[tmp] = intout[tmp];
+
+   return ( contrl[4] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]1 # Entry in intin
contrl+8contrl[4]status # Entry in intout
contrl+10contrl[5]92 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]index
intoutintout[0..24]name[0..24]
+
+ + +
+ +

7.8.4.5 vqp_films

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire polaroid film types« - Obtain information about a +film. +
  +
Opcode: 5 (Escape 91) +
  +
Syntax: void vqp_films ( int16_t handle, int8_t *film_names ); +
  +
Description: The call vqp_films obtains information about a film. The +following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
film_names Name, manufacturer and sensitivity of the film + +
+ +
Note: The parameter film_names should point to a +126 byte sized buffer in which 5 entries of 25 characters each are +stored. +
  +
Return value: The function does not return a result. +
  +
Availability: This function is no longer available from PC-GEM Version 2.0 +onwards. +
  +
Group: Polaroid functions +
  +
See also: GDOS +
  + +
+ +

7.8.4.6 vqp_state

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire polaroid driver state« - Obtain the device state of +the Polaroid image recorder. +
  +
Syntax: void vqp_state ( int16_t handle, int16_t *port, int8_t +*film_name, int16_t *lightness, int16_t *interlace, int16_t *planes, +int16_t *indexes ); +
  +
Description: The call vqp_state obtains the status of a Polaroid image +recorder. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
port Number of the port (0 = first port) +
film_name Number of the film name (0 to 4) +
lightness Brightness (-3 to 3, where each step corresponds to a third of +a stop) +
interlace Image is scanned with (1) or without (0) interlace +
planes Number of colours = 2^planes, where planes lies +between 1 and 4 +
indexes Specifies the colours of the colour palette. 16 bytes of memory +space is required. Each colour is identified by a number (for the rows +of the colour matrix) and a letter between A and H (for the column of +the colour matrix). + +
+ +
Return value: The function does not return a result. +
  +
Availability: This function is no longer available from PC-GEM Version 2.0 +onwards. +
  +
Group: Polaroid functions +
  +
See also: GDOS   vsp_state   vsp_save   vsp_message   vqp_films +
  + +
+ +

7.8.4.7 vsc_expose

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Disable or enable film exposure for frame preview« - Switch +on/off exposure for previews with an image recorder camera. +
  +
Opcode: 5 (Escape 93) +
  +
Syntax: void vsc_expose ( int16_t handle, int16_t state ); +
  +
Description: The call vsc_expose permits switching on/off the exposure for +image recorders with a preview option. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
state Exposure: +
+
+ + + + + + + + +
0 =Switch off
<> 0 =Switch on
+
+ + +
+ +
Return value: The function does not return a result. +
  +
Availability: This function is only available from PC-GEM Version 2.0 +onwards. +
  +
Group: Polaroid functions +
  +
See also: Binding   GDOS   vsp_save   vqp_state   vsp_state   vqp_filmsvsp_message +
  + +
+ +

7.8.4.8 Bindings for vsc_expose

+ + + + + + + + + +
C: void vsc_expose ( int16_t handle, int16_t state ); +
  +
Binding: +
  +
void vsc_expose (int16_t handle, int16_t state)
+{
+   intin[0] = state;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 93;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]1 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]93 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]state
+
+ + +
+ +

7.8.4.9 vsp_film

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set camera film type and exposure time« +
  +
Opcode: 5 (Escape 91) +
  +
Syntax: void vsp_film ( int16_t handle, int16_t index, int16_t +lightness ); +
  +
Description: The call vsp_film specifies the film type and the exposure time +for the image recorder. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
index Number of the film type +
lightness Exposure time: + + + + + + + + + +
-3 = Half +
0 = Normal +
3 = Double + +
+ + +
+ +
Note: With increasing value of the parameter +lightness the exposure is increased by one third of a stop. +The valid indices for index can be obtained with vqp_filmname. +
  +
Return value: The function does not return a result. +
  +
Availability: The function is only available from PC-GEM Version 2.0 +onwards. +
  +
Group: Polaroid functions +
  +
See also: Binding   GDOS +
  + +
+ +

7.8.4.10 Bindings for vsp_film

+ + + + + + + + + +
C: void vsp_film ( int16_t handle, int16_t index, int16_t +lightness ); +
  +
Binding: +
  +
void vsp_film (int16_t handle, int16_t index,
+               int16_t lightness)
+{
+   intin[0] = index;
+   intin[1] = lightenss;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[5] = 91;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]2 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]91 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]index
intin+2intin[1]lightness
+
+ + +
+ +

7.8.4.11 vsp_message

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Suppress polaroid message« - Suppress error-messages of the +Polaroid image recorder. +
  +
Syntax: void vsp_message ( int16_t handle ); +
  +
Description: The call vsp_message suppresses error-messages of the Polaroid +image recorder with the ID handle. +
  +
Return value: The function does not return a result. +
  +
Availability: The function is available only from PC-GEM Version 2.0 +onwards. +
  +
Group: Polaroid functions +
  +
See also: GDOS   vqp_error +
  + +
+ +

7.8.4.12 vsp_save

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Save polaroid driver state« - Save the device state of the +Polaroid image recorder. +
  +
Syntax: void vsp_save ( int16_t handle ); +
  +
Description: The call vsp_save saves the status of a Polaroid image recorder +with the ID handle. +
  +
Return value: The function does not return a result. +
  +
Availability: This function is no longer available from PC-GEM Version 2.0 +onwards. +
  +
Group: Polaroid functions +
  +
See also: GDOS   vqp_state   vsp_state   vsp_message   vqp_films   +vsc_expose +
  + +
+ +

7.8.4.13 vsp_state

+ + + + + + + + + + + + + + + + + + + + + +
Name: »Set polaroid driver state« - Set the state of the Polaroid +recorder. +
  +
Syntax: void vsp_state ( int16_t handle, int16_t port, int16_t +film_num, int16_t lightness, int16_t interlace, int16_t planes, +int16_t *indexes ); +
  +
Description: The call vsp_state sets the output status of a Polaroid image +recorder. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
port Number of the port (0 = first port) +
film_num Number of the film name (0 to 4) +
lightness Brightness (-3 to 3, where each step corresponds to a third of +a stop) +
interlace Image is scanned with (1) or without (0) interlace +
planes Number of colours = 2^planes, where planes lies +between 1 and 4 +
indexes Specifies the colours of the colour palette. 16 bytes of memory +space is required. Each colour is identified by a number (for the rows +of the colour matrix) and a letter between A and H (for the column of +the colour matrix). + +
+ +
Return value: The function does not return a result. +
  +
Availability: This function is no longer available from PC-GEM Version 2.0 +onwards. +
  +
Group: Polaroid functions +
  +
See also: GDOS   vsc_expose   vqp_state   vsp_save   vsp_message   +vqp_films +
  + +
+ +

7.8.5 Sound functions

+

This library contains functions for audio playback through +supported sound system; the following routines are available for this +purpose: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
vmid_load Loads a MIDI file +
vmid_play Plays a MIDI file +
vmid_unload Releases memory occupied by a MIDI file +
vqspl_position_d2d Gets current position when playing through D2D +
vqspl_position_dma Gets current position when playing through DMA +
vqspl_status_d2d Gets current D2D status +
vqspl_status_dma Gets current DMA status +
vqspl_time_left_d2d Gets remaining time when playing through D2D +
vspl_load_d2d Loads an audio file for playing through D2D +
vspl_load_sample Loads a sample for DMA playback +
vspl_make_d2d Continues D2D playback +
vspl_pause_d2d Suspends D2D playback +
vspl_pause_dma Suspends DMA playback +
vspl_play Plays an audio file +
vspl_play_d2d Starts playback of an audio file through D2D +
vspl_play_dma Plays a sample through DMA +
vspl_stop_d2d Stops D2D playback +
vspl_stop_dma Stops DMA playback +
vspl_unload_d2d Releases memory allocated for the D2D playback +
vspl_unload_sample Releases memory occupied by a sample +
vsspl_monitor_off Disables monitoring +
vsspl_monitor_on Enables monitoring + +
+ +

Note: Currently the unit of time for the start +position and for the returned remaining time is unknown. The +purpose of monitoring is also unknown. +

+

See also: VDI workstations   Style guidelines +

+

7.8.5.1 vmid_load

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Load Midifile« - Loads a MIDI file +
  +
Opcode: 5 (Escape 4000) +
  +
Syntax: int16_t vmid_load( int16_t handle, int8_t *fname, uint32_t +position ); +
  +
Description: The call vmid_load loads the MIDI file fname from the +position position into memory. +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: SpeedoGDOS with MIDI sound driver. +
  +
Group: Sound functions +
  +
See also: Binding   vmid_play   vmid_unload +
  + +
+ +
7.8.5.1.1 Bindings for vmid_load
+ + + + + + + + + +
C: int16_t vmid_load( int16_t handle, int8_t *fname, uint32_t +position ); +
  +
Binding: +
  +
int16_t vmid_load (int16_t handle, int8_t *fname, uint32_t position)
+{
+   int16_t tmp;
+
+   intin[0..1] = position;
+
+   tmp = 2;
+   while (intin[tmp++] = *fname++)
+      ;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = --tmp;
+   contrl[5] = 4000;
+   contrl[6] = handle;
+
+   vdi();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]n # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+10contrl[5]4000 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0..1]position
intin+4intin[2..n-1]fname
intoutintout[0]Return value
+
+ + +
+ +

7.8.5.2 vmid_play

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Play Midifile« - Replay a MIDI file +
  +
Opcode: 5 (Escape 4002) +
  +
Syntax: void vmid_play( int16_t handle ); +
  +
Description: The call vmid_play starts the playback of a MIDI file loaded +previously with vmid_load. +
  +
Return value: This function does not return a result. +
  +
Availability: SpeedoGDOS with a sound driver that supports MIDI files. +
  +
Group: Sound functions +
  +
See also: Binding   vmid_load   vmid_unload +
  + +
+ +
7.8.5.2.1 Bindings for vmid_play
+ + + + + + + + + +
C: void vmid_play( int16_t handle ); +
  +
Binding: +
  +
void vmid_play (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 4002;
+   contrl[6] = handle;
+
+   vdi();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]4002 # Escape/Sub-opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.5.3 vmid_unload

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Unload Midifile« - Unload a MIDI file +
  +
Opcode: 5 (Escape 4001) +
  +
Syntax: void vmid_unload( int16_t handle ); +
  +
Description: The call vmid_unload releases the memory allocated for MIDI +playback. +
  +
Return value: This function does not return a result. +
  +
Availability: SpeedoGDOS with a sound driver that supports MIDI files. +
  +
Group: Sound functions +
  +
See also: Binding   vmid_load   vmid_play +
  + +
+ +
7.8.5.3.1 Bindings for vmid_unload
+ + + + + + + + + +
C: void vmid_unload( int16_t handle ); +
  +
Binding: +
  +
void vmid_unload (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 4001;
+   contrl[6] = handle;
+
+   vdi();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]4001 # Escape/Sub-opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.5.4 vqspl_position_d2d

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire D2D position« - Gets the current D2D playback +position +
  +
Opcode: 5 (Escape 3017) +
  +
Syntax: uint32_t vqspl_position_d2d( int16_t handle ); +
  +
Description: The call vqspl_position_d2d returns the current position of the +audio file being played through D2D. +
  +
Return value: This function returns the current position. +
  +
Availability: SpeedoGDOS with sound driver. +
  +
Group: Sound functions +
  +
See also: Binding   vqspl_status_d2d   vqspl_time_left_d2d   vspl_load_d2dvspl_make_d2d   vspl_pause_d2d   vspl_play_d2d   vspl_stop_d2d   +vspl_unload_d2d +
  + +
+ +
7.8.5.4.1 Bindings for vqspl_position_d2d
+ + + + + + + + + +
C: uint32_t vqspl_position_d2d( int16_t handle ); +
  +
Binding: +
  +
uint32_t vqspl_position_d2d (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 3017;
+   contrl[6] = handle;
+
+   vdi();
+
+   return intout[0..1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]2 # Entry in intout
contrl+10contrl[5]3017 # Escape/Sub-opcode
contrl+12contrl[6]handle
intoutintout[0..1]Return value
+
+ + +
+ +

7.8.5.5 vqspl_position_dma

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire DMA position« - Gets the DMA position +
  +
Opcode: 5 (Escape 3006) +
  +
Syntax: uint32_t vqspl_position_dma( int16_t handle, int16_t id ); +
  +
Description: The call vqspl_position_dma obtains the current DMA playback +position for the sample identified by id. +
  +
Return value: This function returns the sample DMA position. +
  +
Availability: SpeedoGDOS with sound driver. +
  +
Group: Sound functions +
  +
See also: Binding   vqspl_status_dma   vspl_load_sample   vspl_pause_dma   +vspl_play_dma   vspl_stop_dma   vspl_unload_sample +
  + +
+ +
7.8.5.5.1 Bindings for vqspl_position_dma
+ + + + + + + + + +
C: uint32_t vqspl_position_dma( int16_t handle, int16_t id ); +
  +
Binding: +
  +
uint32_t vqspl_position_dma (int16_t handle, int16_t id)
+{
+   intin[0] = id;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 3006;
+   contrl[6] = handle;
+
+   vdi();
+
+   return ( intout[0..1] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]1 # Entry in intin
contrl+8contrl[4]2 # Entry in intout
contrl+10contrl[5]3006 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]id
intoutintout[0..1]Return value
+
+ + +
+ +

7.8.5.6 vqspl_status_d2d

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire D2D status« - Gets the current status of the D2D +audio system +
  +
Opcode: 5 (Escape 3016) +
  +
Syntax: int16_t vqspl_status_d2d( int16_t handle ); +
  +
Description: The call vqspl_status_d2d returns the current status of the D2D +audio system. +
  +
Return value: This function returns the current status. If nonzero, the D2D +audio system is ready to process the next audio data from disk through +a call to vspl_make_d2d. +
  +
Availability: SpeedoGDOS with sound driver. +
  +
Group: Sound functions +
  +
See also: Binding   vqspl_position_d2d   vqspl_time_left_d2d   +vspl_load_d2d   vspl_make_d2d   vspl_pause_d2d   vspl_play_d2d   +vspl_stop_d2d   vspl_unload_d2d +
  + +
+ +
7.8.5.6.1 Bindings for vqspl_status_d2d
+ + + + + + + + + +
C: int16_t vqspl_status_d2d( int16_t handle ); +
  +
Binding: +
  +
int16_t vqspl_status_d2d (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 3016;
+   contrl[6] = handle;
+
+   vdi();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+10contrl[5]3016 # Escape/Sub-opcode
contrl+12contrl[6]handle
intoutintout[0]Return value
+
+ + +
+ +

7.8.5.7 vqspl_status_dma

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire DMA status« - Gets the current DMA status +
  +
Opcode: 5 (Escape 3005) +
  +
Syntax: int16_t vqspl_status_dma( int16_t handle, int16_t id ); +
  +
Description: The call vqspl_status_dma obtains the current DMA playback +status for the sample identified by id. +
  +
Return value: This function returns the sample DMA status (sound currently +playing if bit 0 = 1). +
  +
Availability: SpeedoGDOS with sound driver. +
  +
Group: Sound functions +
  +
See also: Binding   vqspl_position_dma   vspl_load_sample   vspl_pause_dmavspl_play_dma   vspl_stop_dma   vspl_unload_sample +
  + +
+ +
7.8.5.7.1 Bindings for vqspl_status_dma
+ + + + + + + + + +
C: int16_t vqspl_status_dma( int16_t handle, int16_t id ); +
  +
Binding: +
  +
int16_t vqspl_status_dma (int16_t handle, int16_t id)
+{
+   intin[0] = id;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 3005;
+   contrl[6] = handle;
+
+   vdi();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]1 # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+10contrl[5]3005 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]id
intoutintout[0]Return value
+
+ + +
+ +

7.8.5.8 vqspl_time_left_d2d

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire D2D remaining time« - Gets the D2D remaining playing +time +
  +
Opcode: 5 (Escape 3018) +
  +
Syntax: int16_t vqspl_time_left_d2d( int16_t handle ); +
  +
Description: The call vqspl_time_left_d2d returns the remaining playing time +on the D2D audio system. +
  +
Return value: This function returns the remaining playing time. +
  +
Availability: SpeedoGDOS with sound driver. +
  +
Group: Sound functions +
  +
See also: Binding   vqspl_position_d2d   vqspl_status_d2d   vspl_load_d2dvspl_make_d2d   vspl_pause_d2d   vspl_play_d2d   vspl_stop_d2d   +vspl_unload_d2d +
  + +
+ +
7.8.5.8.1 Bindings for vqspl_time_left_d2d
+ + + + + + + + + +
C: int16_t vqspl_time_left_d2d( int16_t handle ); +
  +
Binding: +
  +
int16_t vqspl_time_left_d2d (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 3018;
+   contrl[6] = handle;
+
+   vdi();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+10contrl[5]3018 # Escape/Sub-opcode
contrl+12contrl[6]handle
intoutintout[0]Return value
+
+ + +
+ +

7.8.5.9 vspl_load_d2d

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Prepare D2D playback« - Loads an audio file +
  +
Opcode: 5 (Escape 3011) +
  +
Syntax: int16_t vspl_load_d2d( int16_t handle, int8_t *fname, uint32_t +position ); +
  +
Description: The call vspl_load_d2d loads the file fname from the +position position into memory for D2D playback. +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: SpeedoGDOS with sound driver. +
  +
Group: Sound functions +
  +
See also: Binding   vqspl_position_d2d   vqspl_status_d2d   +vqspl_time_left_d2d   vspl_make_d2d   vspl_pause_d2d   vspl_play_d2d   +vspl_stop_d2d   vspl_unload_d2d +
  + +
+ +
7.8.5.9.1 Bindings for vspl_load_d2d
+ + + + + + + + + +
C: int16_t vspl_load_d2d( int16_t handle, int8_t *fname, uint32_t +position ); +
  +
Binding: +
  +
int16_t vspl_load_d2d (int16_t handle, int8_t *fname, uint32_t position)
+{
+   int16_t tmp;
+
+   intin[0..1] = position;
+
+   tmp = 2;
+   while (intin[tmp++] = *fname++)
+      ;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = --tmp;
+   contrl[5] = 3011;
+   contrl[6] = handle;
+
+   vdi();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]n # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+10contrl[5]3011 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0..1]position
intin+4intin[2..n-1]fname
intoutintout[0]Return value
+
+ + +
+ +

7.8.5.10 vspl_load_sample

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Load sample« - Loads an audio file +
  +
Opcode: 5 (Escape 3001) +
  +
Syntax: int16_t vspl_load_sample( int16_t handle, int8_t *fname, +uint32_t position ); +
  +
Description: The call vspl_load_sample loads the file fname from the +position position into memory. Multiple samples can be loaded +into a single workstation, each sample is identified by an index. +
  +
Return value: This function returns the corresponding sample index. +
  +
Availability: SpeedoGDOS with sound driver. +
  +
Group: Sound functions +
  +
See also: Binding   vqspl_position_dma   vqspl_status_dma   vspl_pause_dmavspl_play_dma   vspl_stop_dma   vspl_unload_sample +
  + +
+ +
7.8.5.10.1 Bindings for vspl_load_sample
+ + + + + + + + + +
C: int16_t vspl_load_sample( int16_t handle, int8_t *fname, +uint32_t position ); +
  +
Binding: +
  +
int16_t vspl_load_sample (int16_t handle, int8_t *fname, uint32_t position)
+{
+   int16_t tmp;
+
+   intin[0..1] = position;
+
+   tmp = 2;
+   while (intin[tmp++] = *fname++)
+      ;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = --tmp;
+   contrl[5] = 3001;
+   contrl[6] = handle;
+
+   vdi();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]n # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+10contrl[5]3001 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0..1]position
intin+4intin[2..n-1]fname
intoutintout[0]Return value
+
+ + +
+ +

7.8.5.11 vspl_make_d2d

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Make D2D playback« - Continues D2D playback +
  +
Opcode: 5 (Escape 3020) +
  +
Syntax: void vspl_make_d2d( int16_t handle ); +
  +
Description: The call vspl_make_d2d continues the D2D playback of the file +previously started with vspl_play_d2d. +
  +
The D2D status should be checked regularly with vqspl_status_d2d +in order to call vspl_make_d2d whenever the system is ready. +
  +
During this loop, buffoper(-1) has the bit 0 set to 1 throughout +the playback. buffoper(-1) returns a value with bit 0 set to 0 at the +end of the playback. +
  +
Return value: This function does not return a result. +
  +
Availability: SpeedoGDOS with sound driver. +
  +
Group: Sound functions +
  +
See also: Binding   vqspl_position_d2d   vqspl_status_d2d   +vqspl_time_left_d2d   vspl_load_d2d   vspl_pause_d2d   vspl_play_d2d   +vspl_stop_d2d   vspl_unload_d2d +
  + +
+ +
7.8.5.11.1 Bindings for vspl_make_d2d
+ + + + + + + + + +
C: void vspl_make_d2d( int16_t handle ); +
  +
Binding: +
  +
void vspl_make_d2d (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 3020;
+   contrl[6] = handle;
+
+   vdi();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]3020 # Escape/Sub-opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.5.12 vspl_pause_d2d

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pause D2D playback« - Suspends the D2D audio playback +
  +
Opcode: 5 (Escape 3014) +
  +
Syntax: void vspl_pause_d2d( int16_t handle ); +
  +
Description: The call vspl_pause_d2d suspends the D2D playback of the file +previously loaded with vspl_load_d2d. +
  +
Return value: This function does not return a result. +
  +
Availability: SpeedoGDOS with sound driver. +
  +
Group: Sound functions +
  +
See also: Binding   vqspl_position_d2d   vqspl_status_d2d   +vqspl_time_left_d2d   vspl_load_d2d   vspl_make_d2d   vspl_play_d2d   +vspl_stop_d2d   vspl_unload_d2d +
  + +
+ +
7.8.5.12.1 Bindings for vspl_pause_d2d
+ + + + + + + + + +
C: void vspl_pause_d2d( int16_t handle ); +
  +
Binding: +
  +
void vspl_pause_d2d (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 3014;
+   contrl[6] = handle;
+
+   vdi();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]3014 # Escape/Sub-opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.5.13 vspl_pause_dma

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pause DMA playback« - Suspends the DMA playback of a sample +
  +
Opcode: 5 (Escape 3007) +
  +
Syntax: void vspl_pause_dma( int16_t handle, int16_t id ); +
  +
Description: The call vspl_pause_dma suspends the DMA playback of the sample +identified by id. +
  +
Return value: This function does not return a result. +
  +
Availability: SpeedoGDOS with sound driver. +
  +
Group: Sound functions +
  +
See also: Binding   vqspl_position_dma   vqspl_status_dma   +vspl_load_sample   vspl_play_dma   vspl_stop_dma   vspl_unload_sample +
  + +
+ +
7.8.5.13.1 Bindings for vspl_pause_dma
+ + + + + + + + + +
C: void vspl_pause_dma( int16_t handle, int16_t id ); +
  +
Binding: +
  +
void vspl_pause_dma (int16_t handle, int16_t id)
+{
+   intin[0] = id;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 3007;
+   contrl[6] = handle;
+
+   vdi();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]1 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]3007 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]id
+
+ + +
+ +

7.8.5.14 vspl_play

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Play sample« - Plays an audio file +
  +
Opcode: 5 (Escape 3000) +
  +
Syntax: void vspl_play( int16_t handle, int8_t *fname, uint32_t +position ); +
  +
Description: The call vspl_play starts the playback of the file +fname from the position position. +
  +
Return value: This function does not return a result. +
  +
Availability: SpeedoGDOS with sound driver. +
  +
Group: Sound functions +
  +
See also: Binding +
  + +
+ +
7.8.5.14.1 Bindings for vspl_play
+ + + + + + + + + +
C: void vspl_play( int16_t handle, int8_t *fname, uint32_t +position ); +
  +
Binding: +
  +
void vspl_play (int16_t handle, int8_t *fname, uint32_t position)
+{
+   int16_t tmp;
+
+   intin[0..1] = position;
+
+   tmp = 2;
+   while (intin[tmp++] = *fname++)
+      ;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = --tmp;
+   contrl[5] = 3000;
+   contrl[6] = handle;
+
+   vdi();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]n # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]3000 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0..1]position
intin+4intin[2..n-1]fname
+
+ + +
+ +

7.8.5.15 vspl_play_d2d

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Start D2D playback« - Plays an audio file through the D2D +sound system +
  +
Opcode: 5 (Escape 3013) +
  +
Syntax: void vspl_play_d2d( int16_t handle ); +
  +
Description: The call vspl_play_d2d starts the D2D playback of the file +previously loaded with vspl_load_d2d. +
  +
After calling this function, the D2D status should be checked +regularly with vqspl_status_d2d in order to call vspl_make_d2d +whenever the system is ready. +
  +
During this loop, buffoper(-1) has the bit 0 set to 1 throughout +the playback. buffoper(-1) returns a value with bit 0 set to 0 at the +end of the playback. +
  +
Return value: This function does not return a result. +
  +
Availability: SpeedoGDOS with sound driver. +
  +
Group: Sound functions +
  +
See also: Binding   vqspl_position_d2d   vqspl_status_d2d   +vqspl_time_left_d2d   vspl_load_d2d   vspl_make_d2d   vspl_pause_d2d   +vspl_stop_d2d   vspl_unload_d2d +
  + +
+ +
7.8.5.15.1 Bindings for vspl_play_d2d
+ + + + + + + + + +
C: void vspl_play_d2d( int16_t handle ); +
  +
Binding: +
  +
void vspl_play_d2d (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 3013;
+   contrl[6] = handle;
+
+   vdi();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]3013 # Escape/Sub-opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.5.16 vspl_play_dma

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Start DMA playback« - Plays a sample through the DMA sound +system +
  +
Opcode: 5 (Escape 3003) +
  +
Syntax: void vspl_play_dma( int16_t handle, int16_t id ); +
  +
Description: The call vspl_play_dma starts the DMA playback of the sample +identified by id. +
  +
Return value: This function does not return a result. +
  +
Availability: SpeedoGDOS with sound driver. +
  +
Group: Sound functions +
  +
See also: Binding   vqspl_position_dma   vqspl_status_dma   +vspl_load_sample   vspl_pause_dma   vspl_stop_dma   vspl_unload_sample +
  + +
+ +
7.8.5.16.1 Bindings for vspl_play_dma
+ + + + + + + + + +
C: void vspl_play_dma( int16_t handle, int16_t id ); +
  +
Binding: +
  +
void vspl_play_dma (int16_t handle, int16_t id)
+{
+   intin[0] = id;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 3003;
+   contrl[6] = handle;
+
+   vdi();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]1 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]3003 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]id
+
+ + +
+ +

7.8.5.17 vspl_stop_d2d

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Stop D2D playback« - Stops the D2D audio playback +
  +
Opcode: 5 (Escape 3015) +
  +
Syntax: void vspl_stop_d2d( int16_t handle ); +
  +
Description: The call vspl_stop_d2d stops the D2D playback of the file +previously loaded with vspl_load_d2d. +
  +
Return value: This function does not return a result. +
  +
Availability: SpeedoGDOS with sound driver. +
  +
Group: Sound functions +
  +
See also: Binding   vqspl_position_d2d   vqspl_status_d2d   +vqspl_time_left_d2d   vspl_load_d2d   vspl_make_d2d   vspl_pause_d2d   +vspl_play_d2d   vspl_unload_d2d +
  + +
+ +
7.8.5.17.1 Bindings for vspl_stop_d2d
+ + + + + + + + + +
C: void vspl_stop_d2d( int16_t handle ); +
  +
Binding: +
  +
void vspl_stop_d2d (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 3015;
+   contrl[6] = handle;
+
+   vdi();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]3015 # Escape/Sub-opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.5.18 vspl_stop_dma

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Stop DMA playback« - Stops the DMA playback of a sample +
  +
Opcode: 5 (Escape 3004) +
  +
Syntax: void vspl_stop_dma( int16_t handle, int16_t id ); +
  +
Description: The call vspl_stop_dma stops the DMA playback of the sample +identified by id. +
  +
Return value: This function does not return a result. +
  +
Availability: SpeedoGDOS with sound driver. +
  +
Group: Sound functions +
  +
See also: Binding   vqspl_position_dma   vqspl_status_dma   +vspl_load_sample   vspl_pause_dma   vspl_play_dma   vspl_unload_sample +
  + +
+ +
7.8.5.18.1 Bindings for vspl_stop_dma
+ + + + + + + + + +
C: void vspl_stop_dma( int16_t handle, int16_t id ); +
  +
Binding: +
  +
void vspl_stop_dma (int16_t handle, int16_t id)
+{
+   intin[0] = id;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 3004;
+   contrl[6] = handle;
+
+   vdi();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]1 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]3004 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]id
+
+ + +
+ +

7.8.5.19 vspl_unload_d2d

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Unload D2D sample« - Unload an audio file +
  +
Opcode: 5 (Escape 3012) +
  +
Syntax: void vspl_unload_d2d( int16_t handle ); +
  +
Description: The call vspl_unload_d2d releases the memory allocated with +vspl_load_d2d for D2D playback. +
  +
Return value: This function does not return a result. +
  +
Availability: SpeedoGDOS with driver. +
  +
Group: Sound functions +
  +
See also: Binding   vqspl_position_d2d   vqspl_status_d2d   +vqspl_time_left_d2d   vspl_load_d2d   vspl_make_d2d   vspl_pause_d2d   +vspl_play_d2d   vspl_stop_d2d +
  + +
+ +
7.8.5.19.1 Bindings for vspl_unload_d2d
+ + + + + + + + + +
C: void vspl_unload_d2d( int16_t handle ); +
  +
Binding: +
  +
void vspl_unload_d2d (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 3012;
+   contrl[6] = handle;
+
+   vdi();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]3012 # Escape/Sub-opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.5.20 vspl_unload_sample

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Unload sample« - Unloads a sample +
  +
Opcode: 5 (Escape 3002) +
  +
Syntax: void vspl_unload_sample( int16_t handle, int16_t id ); +
  +
Description: The call vspl_unload_sample unloads the sample identified by +id. +
  +
Return value: This function does not return a result. +
  +
Availability: SpeedoGDOS with sound driver. +
  +
Group: Sound functions +
  +
See also: Binding   vqspl_position_dma   vqspl_status_dma   +vspl_load_sample   vspl_pause_dma   vspl_play_dma   vspl_stop_dma +
  + +
+ +
7.8.5.20.1 Bindings for vspl_unload_sample
+ + + + + + + + + +
C: void vspl_unload_sample( int16_t handle, int16_t id ); +
  +
Binding: +
  +
void vspl_unload_sample (int16_t handle, int16_t id)
+{
+   intin[0] = id;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 3002;
+   contrl[6] = handle;
+
+   vdi();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]1 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]3002 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]id
+
+ + +
+ +

7.8.5.21 vsspl_monitor_off

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Monitor off« - Disables monitoring +
  +
Opcode: 5 (Escape 3031) +
  +
Syntax: void vsspl_monitor_off( int16_t handle ); +
  +
Description: The call vsspl_monitor_off disables the monitoring of the sound +system. +
  +
Note: What the monitoring actually does is currently +unknown. +
  +
Return value: This function does not return a result. +
  +
Availability: SpeedoGDOS with sound driver. +
  +
Group: Sound functions +
  +
See also: Binding   vsspl_monitor_on +
  + +
+ +
7.8.5.21.1 Bindings for vsspl_monitor_off
+ + + + + + + + + +
C: void vsspl_monitor_off( int16_t handle ); +
  +
Binding: +
  +
void vsspl_monitor_off (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 3031;
+   contrl[6] = handle;
+
+   vdi();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]3031 # Escape/Sub-opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.5.22 vsspl_monitor_on

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Monitor on« - Enables monitoring +
  +
Opcode: 5 (Escape 3030) +
  +
Syntax: void vsspl_monitor_on( int16_t handle ); +
  +
Description: The call vsspl_monitor_on enables the monitoring of the sound +system. +
  +
Note: What the monitoring actually does is currently +unknown. +
  +
Return value: This function does not return a result. +
  +
Availability: SpeedoGDOS with sound driver. +
  +
Group: Sound functions +
  +
See also: Binding   vsspl_monitor_off +
  + +
+ +
7.8.5.22.1 Bindings for vsspl_monitor_on
+ + + + + + + + + +
C: void vsspl_monitor_on( int16_t handle ); +
  +
Binding: +
  +
void vsspl_monitor_on (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 3030;
+   contrl[6] = handle;
+
+   vdi();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]3030 # Escape/Sub-opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.6 Special functions

+

This library contains functions for some special purposes that +cannot be assigned to any of the other groups of Escape functions. The +following routines are available: +

+ + + + + + + + + + + + + + + +
v_escape2000 Special function for the ATARI page-printer +
v_fontinit Selects custom system font +
v_offset Sets offset to top screen edge +
v_sound Generates a tone +
vs_mute Switches tone generation on/off + +
+ +

See also: VDI workstations   Style guidelines +

+

7.8.6.1 v_escape2000

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Escape 2000« - Special function for ATARI page-printer. +
  +
Opcode: 5 (Escape 2000) +
  +
Syntax: void v_escape2000 ( int16_t handle, int16_t times ); +
  +
Description: The call v_escape2000 prints any number of extra copies of the +current page. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
times Number of additional copies + +
+ +
Note: The function works only in connection with the +Atari SLM laser printers; therefore it is better to fall back to the +function v_copies. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported only with some laser printer drivers (for instance +the Atari SLM laser printer driver) under some forms of GDOS. +
  +
Group: Special functions +
  +
See also: Binding   GDOS +
  + +
+ +

7.8.6.2 Bindings for v_escape2000

+ + + + + + + + + +
C: void v_escape2000 ( int16_t handle, int16_t times ); +
  +
Binding: +
  +
void v_escape2000 (int16_t handle, int16_t times)
+{
+   intin[0] = times;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 2000;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]1 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]2000 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]times
+
+ + +
+ +

7.8.6.3 v_fontinit

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Init system font« - Initializes a system font. +
  +
Opcode: 5 (Escape 102) +
  +
Syntax: void v_fontinit ( int16_t handle, int16_t fh_high, int16_t +fh_low ); +
  +
Description: The call v_fontinit installs a specified font as the system +font. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
fh_high Address of the font header (high) +
fh_low Address of the font header (low) + +
+ +
Note: The function is described in no official +documentation - use it at your own risk! Some attempts have shown that +the character width has to be a constant eight pixels and the font +must be in the Motorola (big-endian) format. +
  +
Return value: The function does not return a result. +
  +
Availability: All TOS versions; ROM screen driver. +
  +
Group: Special functions +
  +
See also: Binding   Header for bitmap GDOS fonts +
  + +
+ +

7.8.6.4 Bindings for v_fontinit

+ + + + + + + + + +
C: void v_fontinit ( int16_t handle, int16_t fh_high, int16_t +fh_low ); +
  +
Binding: +
  +
void v_fontinit (int16_t handle, int16_t fh_high,
+                 int16_t fh_low)
+{
+   intin[0] = fh_high;
+   intin[1] = fh_low;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[5] = 102;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]2 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]102 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]fh_high
intin+2intin[1]fh_low
+
+ +
Note: The pointer to the font header will be stored in +the fields intin[0..1] here. +
  + +
+ +

7.8.6.5 v_offset

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set screen offset« - Set the top screen margin. +
  +
Opcode: 5 (Escape 101) +
  +
Syntax: void v_offset ( int16_t handle, int16_t offset ); +
  +
Description: The call v_offset sets the offset in raster lines to the start +of the logical screen. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
offset Number of raster lines below the top screen edge up to the +start of the logical screen + +
+ +
Note: The function is described in no official +documentation - use it at your own risk! +
  +
Return value: The function does not return a result. +
  +
Availability: ROM screen driver. +
  +
Group: Special functions +
  +
See also: Binding +
  + +
+ +

7.8.6.6 Bindings for v_offset

+ + + + + + + + + +
C: void v_offset ( int16_t handle, int16_t offset ); +
  +
Binding: +
  +
void v_offset (int16_t handle, int16_t offset)
+{
+   intin[0] = offset;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 101;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]1 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]101 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]offset
+
+ + +
+ +

7.8.6.7 v_sound

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Generate specified tone« +
  +
Opcode: 5 (Escape 61) +
  +
Syntax: void v_sound ( int16_t handle, int16_t frequency, int16_t +duration ); +
  +
Description: The call v_sound generates a tone of a specified length and +frequency. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
frequency Tone frequency in Hertz +
duration Tone length in timer ticks + +
+ +
Return value: The function does not return a result. +
  +
Availability: The function is only available under PC-GEM as of Version +2.0. +
  +
Group: Special functions +
  +
See also: Binding   GDOS   vs_mute +
  + +
+ +

7.8.6.8 Bindings for v_sound

+ + + + + + + + + +
C: void v_sound ( int16_t handle, int16_t frequency, int16_t +duration ); +
  +
Binding: +
  +
void v_sound (int16_t handle, int16_t frequency,
+              int16_t duration)
+{
+   intin[0] = frequency;
+   intin[1] = duration;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[5] = 61;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]2 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]61 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]frequency
intin+2intin[1]duration
+
+ + +
+ +

7.8.6.9 vs_mute

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set/clear tone muting flag« +
  +
Opcode: 5 (Escape 62) +
  +
Syntax: int16_t vs_mute ( int16_t handle, int16_t action ); +
  +
Description: The call vs_mute sets or clears the tone flag, or returns it +status. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
action Desired action: + + + + + + + + + +
-1 = Inquire status +
 0 = Tone generation on +
 1 = Tone generation off + +
+ + +
+ +
Return value: The function returns the status of the tone generation. +
  +
Availability: The function is available only under PC-GEM as of Version +2.0. +
  +
Group: Special functions +
  +
See also: Binding   GDOS   v_sound +
  + +
+ +

7.8.6.10 Bindings for vs_mute

+ + + + + + + + + +
C: int16_t vs_mute ( int16_t handle, int16_t action ); +
  +
Binding: +
  +
int16_t vs_mute (int16_t handle, int16_t action)
+{
+   intin[0] = action;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 62;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]1 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]62 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]action
intoutintout[0]Return Value
+
+ + +
+ +

7.8.7 Text functions

+

This library contains functions for control of the alphanumeric +screen; the following routines are available for this purpose: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
v_alpha_text Outputs text in text mode to printer or metafile +
v_curdown Moves text cursor one row down +
v_curhome Moves text cursor to top left corner +
v_curleft Moves text cursor one column left +
v_curright Moves text cursor one column right +
v_curtext Outputs text to screen from text cursor position on +
v_curup Moves text cursor one row up +
v_eeol Clears screen from text cursor to end of line +
v_eeos Clears screen from text cursor to end of screen +
v_enter_cur Switches on text mode +
v_exit_cur Exits text mode +
v_rvoff Switches off inverse video +
v_rvon Switches on inverse video +
vq_chcells Gets number of rows and columns of the text screen +
vq_curaddress Gets row and column of current text cursor +
vs_curaddress Positions text cursor at given row and column + +
+ +

See also: VDI workstations   Style guidelines +

+

7.8.7.1 vq_chcells

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire addressable alpha character cells« - Obtain the +number of rows and columns of a workstation. +
  +
Opcode: 5 (Escape 1) +
  +
Syntax: void vq_chcells ( int16_t handle, int16_t *rows, int16_t +*columns ); +
  +
Description: The call vq_chcells obtains the number of rows and columns that +can be accessed with the alpha cursor. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
rows Number of rows +
columns Number of columns + +
+ +
Note: A value of 0 in the parameters rows or +columns means that addressing is not possible. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all screen and printer drivers. +
  +
Group: Text functions +
  +
See also: Binding   v_enter_cur +
  + +
+ +

7.8.7.2 Bindings for vq_chcells

+ + + + + + + + + +
C: void vq_chcells ( int16_t handle, int16_t *rows, int16_t +*columns ); +
  +
Binding: +
  +
void vq_chcells (int16_t handle, int16_t *rows,
+                 int16_t *columns)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *rows    = intout[0];
+   *columns = intout[1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]2 # Entry in intout
contrl+10contrl[5]1 # Escape/Sub-opcode
contrl+12contrl[6]handle
intoutintout[0]rows
intout+2intout[1]columns
+
+ + +
+ +

7.8.7.3 vq_curaddress

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire current alpha cursor address« +
  +
Opcode: 5 (Escape 15) +
  +
Syntax: void vq_curaddress ( int16_t handle, int16_t *row, int16_t +*column ); +
  +
Description: The call vq_curaddress obtains the current alpha text cursor +position. +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
row Row number (1 to the maximum number of rows) +
column Column number (1 to the maximum number of columns) + +
+ +
Return value: The function does not return a result. +
  +
Availability: Supported by all screen drivers. +
  +
Group: Text functions +
  +
See also: Binding   v_enter_cur +
  + +
+ +

7.8.7.4 Bindings for vq_curaddress

+ + + + + + + + + +
C: void vq_curaddress ( int16_t handle, int16_t *row, int16_t +*column ); +
  +
Binding: +
  +
void vq_curaddress (int16_t handle, int16_t *row,
+                    int16_t *column)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 15;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *row    = intout[0];
+   *column = intout[1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]2 # Entry in intout
contrl+10contrl[5]15 # Escape/Sub-opcode
contrl+12contrl[6]handle
intoutintout[0]row
intout+2intout[1]column
+
+ + +
+ +

7.8.7.5 v_alpha_text

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Output alpha text« - Output a line of alpha text in text +mode to a printer or metafile. +
  +
Opcode: 5 (Escape 25) +
  +
Syntax: void v_alpha_text ( int16_t handle, int8_t *string ); +
  +
Description: The call v_alpha_text outputs a line of alpha text in text mode +to a printer (or metafile) at the current position of the printhead. +The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
string Address of text string (NULL-termminated) + +
+ +
Note: The output is not made in graphic mode. +Two special BYTE codes may be embedded in the text for control +functions that are standardized for all printers ('DC2' corresponds to +ASCII 18): +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Code Meaning +
    +
DC2 0 Enable bold print +
DC2 1 Disable bold print +
DC2 2 Enable italic print +
DC2 3 Disable italic print +
DC2 4 Enable underlining +
DC2 5 Disable underlining +
DC2 6 Enable superscript +
DC2 7 Disable superscript +
DC2 8 Enable subscript +
DC2 9 Disable subscript +
DC2 A Enable NLQ mode +
DC2 B Disable NLQ mode +
DC2 C Enable wide printing +
DC2 D Disable wide printing +
DC2 E Enable light printing +
DC2 F Disable light printing +
DC2 G   +
:   +
:   +
DC2 V Reserved, will be ignored +
DC2 W Switch to pica printing (10 cpi) +
DC2 X Switch to elite printing (12 cpi) +
DC2 Y Toggle compressed printing +
DC2 Z Toggle proportional printing + +
+ +
In addition, form-feed with the ASCII value 12 is supported. +Under PC-GEM, graphics can be taken into account as well; the +syntax in this case is: +
  +
(ESC)(ESC)GEM,x,y,w,h,C:\pathname\filename.img +
  +
The parameters x, y, w and h for this are to be +given in character units relative to the current cursor position. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all printer and metafile drivers. +
  +
Group: Text functions +
  +
See also: Binding   OUT file format +
  + +
+ +

7.8.7.6 Bindings for v_alpha_text

+ + + + + + + + + +
C: void v_alpha_text ( int16_t handle, int8_t *string ); +
  +
Binding: +
  +
void v_alpha_text (int16_t handle, int8_t *string)
+{
+   int16_t *tmp;
+
+   tmp = intin;
+   while (*tmp++ = *string++)
+      ;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = ((int16_t) (tmp-intin)-1);
+   contrl[5] = 25;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]n # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]25 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0..n-1]string[0..n-1]
+
+ + +
+ +

7.8.7.7 v_curaddress

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Direct alpha cursor address« - Set the alpha cursor to the +specified position. +
  +
Opcode: 5 (Escape 11) +
  +
Syntax: void v_curaddress ( int16_t handle, int16_t row, int16_t column +); +
  +
Description: The call v_curaddress moves the alpha cursor to a given column +and row. +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
row Row number (1 to maximum number of rows) +
column Column number (1 to maximum number of columns) + +
+ +
Note: If addresses above the maximum limit are +specified, the function will assume the nearest valid value. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all screen drivers. +
  +
Group: Text functions +
  +
See also: Binding   v_enter_cur +
  + +
+ +

7.8.7.8 Bindings for v_curaddress

+ + + + + + + + + +
C: void v_curaddress ( int16_t handle, int16_t row, int16_t column +); +
void vs_curaddress ( int16_t handle, int16_t row, int16_t column +); +
  +
Binding: +
  +
void v_curaddress  (int16_t handle, int16_t row, int16_t column)
+void vs_curaddress (int16_t handle, int16_t row, int16_t column)
+{
+   intin[0] = row;
+   intin[1] = column;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[5] = 11;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]2 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]11 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0]row
intin+2intin[1]column
+
+ + +
+ +

7.8.7.9 v_curdown

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Alpha cursor down« - Move the alpha cursor down by one row. +
  +
Opcode: 5 (Escape 5) +
  +
Syntax: void v_curdown ( int16_t handle ); +
  +
Description: The call v_curdown moves the alpha cursor on the workstation +with the ID handle one row or line down. +
  +
Note: If the cursor is already in the last row, nothing +happens. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all screen drivers. +
  +
Group: Text functions +
  +
See also: Binding   v_enter_cur +
  + +
+ +

7.8.7.10 Bindings for v_curdown

+ + + + + + + + + +
C: void v_curdown ( int16_t handle ); +
  +
Binding: +
  +
void v_curdown (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 5;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]5 # Escape/Sub-opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.7.11 v_curhome

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Home alpha cursor« - Move the alpha cursor to the +
  +
Opcode: 5 (Escape 8) +
  +
Syntax: void v_curhome ( int16_t handle ); +
  +
Description: The call v_curhome moves the alpha cursor on the workstation +with the ID handle to the 'home' position. +
  +
Note: The 'home' position normally means the position at +the top left corner of the screen. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all screen drivers. +
  +
Group: Text functions +
  +
See also: Binding   v_enter_cur +
  + +
+ +

7.8.7.12 Bindings for v_curhome

+ + + + + + + + + +
C: void v_curhome ( int16_t handle ); +
  +
Binding: +
  +
void v_curhome (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 8;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]8 # Escape/Sub-opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.7.13 v_curleft

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Alpha cursor left« - Move the alpha cursor left by one +character. +
  +
Opcode: 5 (Escape 7) +
  +
Syntax: void v_curleft ( int16_t handle ); +
  +
Description: The call v_curleft moves the alpha cursor on the workstation +with the ID handle one column to the left. +
  +
Note: If it is already in the first column, nothing +happens. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all screen drivers. +
  +
Group: Text functions +
  +
See also: Binding   v_enter_cur +
  + +
+ +

7.8.7.14 Bindings for v_curleft

+ + + + + + + + + +
C: void v_curleft ( int16_t handle ); +
  +
Binding: +
  +
void v_curleft (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 7;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]7 # Escape/Sub-opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.7.15 v_curright

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Alpha cursor right« - Move the alpha cursor right by one +character. +
  +
Opcode: 5 (Escape 6) +
  +
Syntax: void v_curright ( int16_t handle ); +
  +
Description: The call moves v_curright the alpha cursor on the workstation +with the ID handle one column to the right. +
  +
Note: If the cursor is already in the last column, +nothing happens. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all screen drivers. +
  +
Group: Text functions +
  +
See also: Binding   v_enter_cur +
  + +
+ +

7.8.7.16 Bindings for v_curright

+ + + + + + + + + +
C: void v_curright ( int16_t handle ); +
  +
Binding: +
  +
void v_curright (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 6;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]6 # Escape/Sub-opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.7.17 v_curtext

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Output cursor addressable alpha text« - Output a line of +text to the screen from the alpha cursor onwards. +
  +
Opcode: 5 (Escape 12) +
  +
Syntax: void v_curtext ( int16_t handle, int8_t *string ); +
  +
Description: The call v_curtext outputs a line of text to the screen in text +mode from the current cursor position onwards. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
string Pointer to text string (max. 127 chars.) + +
+ +
The cursor is advanced by one position for each character output +(alpha mode). +
  +
Note: Text output with this function can be +faster than via GEMDOS. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all screen drivers. +
  +
Group: Text functions +
  +
See also: Binding   v_enter_cur   v_curup   v_curdown   v_curright   +v_curleft   v_curhome   vs_curaddress +
  + +
+ +

7.8.7.18 Bindings for v_curtext

+ + + + + + + + + +
C: void v_curtext ( int16_t handle, int8_t *string ); +
  +
Binding: +
  +
void v_curtext (int16_t handle, int8_t *string)
+{
+   int16_t *tmp;
+
+   tmp = intin;
+   while (*tmp++ = *string++)
+      ;
+
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = ((int16_t) (tmp-intin)-1);
+   contrl[5] = 12;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]n # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]12 # Escape/Sub-opcode
contrl+12contrl[6]handle
intinintin[0..n-1]string[0..n-1]
+
+ + +
+ +

7.8.7.19 v_curup

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Alpha cursor up« - Move the alpha cursor up by one row. +
  +
Opcode: 5 (Escape 4) +
  +
Syntax: void v_curup ( int16_t handle ); +
  +
Description: The call v_curup moves the alpha cursor on the workstation with +the ID handle one row or line upwards. +
  +
Note: If the cursor is already in the first row, nothing +happens. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all screen drivers. +
  +
Group: Text functions +
  +
See also: Binding   v_enter_cur +
  + +
+ +

7.8.7.20 Bindings for v_curup

+ + + + + + + + + +
C: void v_curup ( int16_t handle ); +
  +
Binding: +
  +
void v_curup (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 4;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]4 # Escape/Sub-opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.7.21 v_eeol

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Erase to end of alpha text line« - Clear the text line from +the alpha cursor onwards. +
  +
Opcode: 5 (Escape 10) +
  +
Syntax: void v_eeol ( int16_t handle ); +
  +
Description: The call v_eeol clears the current text line from the current +text cursor position rightwards on the workstation with the ID +handle. +
  +
Note: The position of the cursor will not be altered by +this. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all screen drivers. +
  +
Group: Text functions +
  +
See also: Binding   v_enter_cur +
  + +
+ +

7.8.7.22 Bindings for v_eeol

+ + + + + + + + + +
C: void v_eeol ( int16_t handle ); +
  +
Binding: +
  +
void v_eeol (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 10;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]10 # Escape/Sub-opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.7.23 v_eeos

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Erase to end of alpha screen« - Clear the screen of text +from the alpha cursor onwards. +
  +
Opcode: 5 (Escape 9) +
  +
Syntax: void v_eeos ( int16_t handle ); +
  +
Description: The call v_eeos clears the alphanumeric screen of text from the +current cursor position onwards on the workstation with the ID +handle. +
  +
Note: The position of the cursor will not be altered by +this. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all screen drivers. +
  +
Group: Text functions +
  +
See also: Binding   v_enter_cur +
  + +
+ +

7.8.7.24 Bindings for v_eeos

+ + + + + + + + + +
C: void v_eeos ( int16_t handle ); +
  +
Binding: +
  +
void v_eeos (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 9;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]9 # Escape/Sub-opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.7.25 v_enter_cur

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Enter alpha mode« - Switch text mode on for screen or +metafile. +
  +
Opcode: 5 (Escape 3) +
  +
Syntax: void v_enter_cur ( int16_t handle ); +
  +
Description: The call v_enter_cur exits the graphic mode on the workstation +with the ID handle (screen or metafile) if this is not +identical to the alpha mode. +
  +
In addition the mouse pointer will be removed, the alpha cursor +set to the top left character cell, and the alpha screen will be +cleared (by setting it to the colour 0); with a metafile a +corresponding entry will be made in the file. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all screen drivers. +
  +
Group: Text functions +
  +
See also: Binding   v_exit_cur +
  + +
+ +

7.8.7.26 Bindings for v_enter_cur

+ + + + + + + + + +
C: void v_enter_cur ( int16_t handle ); +
  +
Binding: +
  +
void v_enter_cur (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 3;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]3 # Escape/Sub-opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.7.27 v_exit_cur

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Exit alpha mode« - Switch text mode off for screen or +metafile. +
  +
Opcode: 5 (Escape 2) +
  +
Syntax: void v_exit_cur ( int16_t handle ); +
  +
Description: The call v_exit_cur switches off the alpha mode on the +workstation with the ID handle (screen or metafile) if the +alpha and graphic modes are different. +
  +
The alpha mode is the normal text mode without any graphics, +such as used by the desktop for depicting files and folders in windows +set to 'Display > As Text' for instance. +
  +
Note: The function also clears the graphics screen and +restores the mouse pointer (to completely restore the screen, you +should call form_dial( FMD_FINISH sx, sy, sw, sh ) where +sx, sy, sw, sh are the coordinates of the screen); with a +metafile a corresponding entry is made in the file. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all screen drivers. +
  +
Group: Text functions +
  +
See also: Binding   v_enter_cur +
  + +
+ +

7.8.7.28 Bindings for v_exit_cur

+ + + + + + + + + +
C: void v_exit_cur ( int16_t handle ); +
  +
Binding: +
  +
void v_exit_cur (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]2 # Escape/Sub-opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.7.29 v_rvoff

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Reverse video off« - Switch off inverse video mode. +
  +
Opcode: 5 (Escape 14) +
  +
Syntax: void v_rvoff ( int16_t handle ); +
  +
Description: The call v_rvoff switches off the inverse alpha text display +(causing it to appear as normal video) on the workstation with the ID +handle. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all screen drivers. +
  +
Group: Text functions +
  +
See also: Binding   v_enter_cur   v_rvon +
  + +
+ +

7.8.7.30 Bindings for v_rvoff

+ + + + + + + + + +
C: void v_rvoff ( int16_t handle ); +
  +
Binding: +
  +
void v_rvoff (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 14;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]14 # Escape/Sub-opcode
contrl+12contrl[6]handle
+
+ + +
+ +

7.8.7.31 v_rvon

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Reverse video on« - Switch on inverse video mode. +
  +
Opcode: 5 (Escape 13) +
  +
Syntax: void v_rvon ( int16_t handle ); +
  +
Description: The call v_rvon activates the inverse alpha text display on the +workstation with the ID handle. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all screen drivers. +
  +
Group: Text functions +
  +
See also: Binding   v_enter_cur   v_rvoff +
  + +
+ +

7.8.7.32 Bindings for v_rvon

+ + + + + + + + + +
C: void v_rvon ( int16_t handle ); +
  +
Binding: +
  +
void v_rvon (int16_t handle)
+{
+   contrl[0] = 5;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 13;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]5 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]13 # Escape/Sub-opcode
contrl+12contrl[6]handle
+
+ + +
+ +
+ +Home +VDIVDI +Input functionsInput functions +Colour table functionsColour table functions + + diff --git a/en/vdi_functions.html b/en/vdi_functions.html new file mode 100644 index 000000000..ef8156276 --- /dev/null +++ b/en/vdi_functions.html @@ -0,0 +1,1726 @@ + + + + + +The documentation for TOS: VDI functions list + + + + + + + + + +Home +VDIVDI +TC-VDI functionsTC-VDI functions +VDI structuresVDI structures + +
+ +

7.13 VDI functions list

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DecNamePresent in
-2vq_gdosTOS
-1,8 GEM/4
-1,7 GEM/4
-1,6v_set_app_buffSpeedoGDOS
-1,5 GEM/3
-1,4v_get_driver_infoGEM/3
-1,3 GEM/3
-1,2 GEM/3
-1,1 GEM/2
1v_opnwkTOS
1v_opnprnNVDI
2v_clswkTOS
3v_clrwkTOS
4v_updwkTOS
5,1vq_chcellsTOS
5,2v_exit_curTOS
5,3v_enter_curTOS
5,4v_curupTOS
5,5v_curdownTOS
5,6v_currightTOS
5,7v_curleftTOS
5,8v_curhomeTOS
5,9v_eeosTOS
5,10v_eeolTOS
5,11vs_curaddressTOS
5,12v_curtextTOS
5,13v_rvonTOS
5,14v_rvoffTOS
5,15vq_curaddressTOS
5,16vq_tabstatusTOS
5,17v_hardcopyTOS
5,18v_dspcurTOS
5,19v_rmcurTOS
5,20v_form_advGDOS
5,21v_output_windowGDOS
5,22v_clear_disp_listGDOS
5,23v_bit_imageGDOS
5,24vq_scanGDOS
5,25v_alpha_textTOS
5,27v_orientNVDI
5,28v_copiesNVDI
5,29v_trayNVDI
5,32v_ps_halftoneGEM/3
5,36vq_tray_namesNVDI
5,37v_page_sizeNVDI
5,38vq_page_nameNVDI
5,39vq_prn_scalingNVDI 5.00
5,60vs_palettePC-GEM
5,61v_soundPC-GEM
5,62vs_mutePC-GEM
5,76vs_calibrateNVDI, MATRIX TC-VDI
5,77vq_calibrateNVDI, MATRIX TC-VDI
5,81vt_resolution?
5,82vt_axis
5,83vt_origin
5,84vq_tdimensions
5,85vt_alignment
5,91vqp_films
5,92vqp_state
5,93vsp_state
5,94vsp_save
5,95vsp_message
5,96vqp_error
5,98v_meta_extents
5,99v_write_meta
5,99,0vm_pagesize
5,99,1vm_coords
5,99,32,1v_bez_qualNVDI 2.10
5,100vm_filenameTOS
5,101v_offsetTOS
5,101v_xbit_imageGEM/3
5,102v_fontinitTOS
5,102vs_bkcolorGEM/3
5,2000v_escape2000
5,2100vq_margins
5,2101vq_driver_infoDriver from Thierry Rodolfo
5,2102vq_bit_imageDriver from Thierry Rodolfo
5,2103vs_document_infoNVDI 5.00
5,2103vs_page_infoDriver from Thierry Rodolfo
5,2104vs_cropDriver from Thierry Rodolfo
5,2105vq_image_typeDriver from Thierry Rodolfo
5,2106vs_save_disp_listDriver from Thierry Rodolfo
5,2107vs_load_disp_listDriver from Thierry Rodolfo
5,2108vq_driver_nameDriver from Thierry Rodolfo
5,3000vspl_playDriver from Thierry Rodolfo
5,3001vspl_load_sampleDriver from Thierry Rodolfo
5,3002vspl_unload_sampleDriver from Thierry Rodolfo
5,3003vspl_play_dmaDriver from Thierry Rodolfo
5,3004vspl_stop_dmaDriver from Thierry Rodolfo
5,3005vqspl_status_dmaDriver from Thierry Rodolfo
5,3006vqspl_position_dmaDriver from Thierry Rodolfo
5,3007vspl_pause_dmaDriver from Thierry Rodolfo
5,3011vspl_load_d2dDriver from Thierry Rodolfo
5,3012vspl_unload_d2dDriver from Thierry Rodolfo
5,3013vspl_play_d2dDriver from Thierry Rodolfo
5,3014vspl_pause_d2dDriver from Thierry Rodolfo
5,3015vspl_stop_d2dDriver from Thierry Rodolfo
5,3016vqspl_status_d2dDriver from Thierry Rodolfo
5,3017vqspl_position_d2dDriver from Thierry Rodolfo
5,3018vqspl_time_left_d2dDriver from Thierry Rodolfo
5,3020vspl_make_d2dDriver from Thierry Rodolfo
5,3030vsspl_monitor_onDriver from Thierry Rodolfo
5,3031vsspl_monitor_offDriver from Thierry Rodolfo
5,4000vmid_loadDriver from Thierry Rodolfo
5,4001vmid_unloadDriver from Thierry Rodolfo
5,4002vmid_playDriver from Thierry Rodolfo
5,18500v_setrgbiGEM/3
5,18501v_topbotGEM/3
6,0v_plineTOS
6,13v_bezNVDI 2.10
7v_pmarkerTOS
8v_gtextTOS
8v_gtext_unicode
9,0v_fillareaTOS
9,13v_bez_fillNVDI 2.10
10v_cellarrayTOS
11,1v_barTOS
11,2v_arcTOS
11,3v_piesliceTOS
11,4v_circleTOS
11,5v_ellipseTOS
11,6v_ellarcTOS
11,7v_ellpieTOS
11,8v_rboxTOS
11,9v_rfboxTOS
11,10v_justifiedTOS
11,11v_etextGEM/3
11,13v_bez_offNVDI 2.10
11,13v_bez_onNVDI 2.10
12vst_heightTOS
13vst_rotationTOS
14vs_colorTOS
15vsl_typeTOS
16vsl_widthTOS
17vsl_colorTOS
18vsm_typeTOS
19vsm_heightTOS
20vsm_colorTOS
21vst_fontTOS
22vst_colorTOS
23vsf_interiorTOS
24vsf_styleTOS
25vsf_colorTOS
26vq_colorTOS
27vq_cellarrayTOS
28vrq_locatorTOS
28vsm_locatorTOS
29vrq_valuatorTOS
29vsm_valuatorTOS
30vrq_choiceTOS
30vsm_choiceTOS
31vrq_stringTOS
31vsm_stringTOS
32vswr_modeTOS
33vsin_modeTOS
35vql_attributesTOS
36vqm_attributesTOS
37vqf_attributesTOS
38vqt_attributesTOS
39vst_alignmentTOS
51vsf_rgbMATRIX TC-VDI
52vst_rgbMATRIX TC-VDI
53vsl_rgbMATRIX TC-VDI
54vrf_rgbMATRIX TC-VDI
55vrt_rgbMATRIX TC-VDI
56vrl_rgbMATRIX TC-VDI
57vs_pixcolMATRIX TC-VDI
58vq_pixcolMATRIX TC-VDI
59vs_pixrgbMATRIX TC-VDI
60vq_pixrgbMATRIX TC-VDI
61vrun_rectMATRIX TC-VDI
62vrun_parallelMATRIX TC-VDI
63vrun_triangleMATRIX TC-VDI
64vs_colorsMATRIX TC-VDI
65vq_colorsMATRIX TC-VDI
100,0v_opnvwkTOS
100,1v_opnbmAs of EdDI 1.00
100,2v_resize_bmAs of EdDI 1.20
100,3v_open_bmAs of EdDI 1.20
101,0v_clsvwkTOS
101,1v_clsbmAs of EdDI 1.00
102,0vq_extndTOS
102,1vq_scrninfoAs of EdDI 1.00
103v_contourfillTOS
104vsf_perimeterTOS
104vsf_xperimeterGEM/3 Relase 3.1
105v_get_pixelTOS
106vst_effectsTOS
107vst_pointTOS
108vsl_endsTOS
109vro_cpyfmTOS
110vr_trnfmTOS
111vsc_formTOS
112vsf_udpatTOS
113vsl_udstyTOS
114vr_recflTOS
115vqin_modeTOS
116vqt_extentTOS
117vqt_widthTOS
118vex_timvTOS
119vst_load_fontsGDOS
119vst_ex_load_fontsGEM/3
120vst_unload_fontsGDOS
121vrt_cpyfmTOS
122v_show_cTOS
123v_hide_cTOS
124vq_mouseTOS
125vex_butvTOS
126vex_motvTOS
127vex_curvTOS
128vq_key_sTOS
129vs_clipTOS
130vqt_nameTOS
130,1vqt_ext_nameNVDI 3.00
131vqt_fontinfoTOS
132vqt_justifiedPC-GEM
133vs_grayoverrideGEM/3
134vex_wheelvMilan
134v_pat_rotateGEM/3
135 GEM/4
136 GEM/4: Based on v_pline() but takes extra integer parameters
137 GEM/4: Based on v_fillarea() but takes extra integer parameters
138v_setrgbNVDI 5.00
142 GEM/4: Takes an integer parameter
143 GEM/4: Takes an integer parameter that is at most 100
170vr_transfer_bitsNVDI 5.00
171,0vr_clip_rects_by_dstNVDI 5.02
171,1vr_clip_rects_by_srcNVDI 5.02
171,2vr_clip_rects32_by_dstNVDI 5.02
171,3vr_clip_rects32_by_srcNVDI 5.02
180v_create_driver_infoNVDI 5.00
181v_delete_driver_infoNVDI 5.00
182,0v_read_default_settingsNVDI 5.00
182,1v_write_default_settingsNVDI 5.00
190vqt_char_indexNVDI 4.00
200,0vst_fg_colorNVDI 5.00
200,1vsf_fg_colorNVDI 5.00
200,2vsl_fg_colorNVDI 5.00
200,3vsm_fg_colorNVDI 5.00
200,4vsr_fg_colorNVDI 5.00
201,0vst_bg_colorNVDI 5.00
201,1vsf_bg_colorNVDI 5.00
201,2vsl_bg_colorNVDI 5.00
201,3vsm_bg_colorNVDI 5.00
201,4vsr_bg_colorNVDI 5.00
202,0vqt_fg_colorNVDI 5.00
202,1vqf_fg_colorNVDI 5.00
202,2vql_fg_colorNVDI 5.00
202,3vqm_fg_colorNVDI 5.00
202,4vqr_fg_colorNVDI 5.00
203,0vqt_bg_colorNVDI 5.00
203,1vqf_bg_colorNVDI 5.00
203,2vql_bg_colorNVDI 5.00
203,3vqm_bg_colorNVDI 5.00
203,4vqr_bg_colorNVDI 5.00
204,0v_color2valueNVDI 5.00
204,1v_value2colorNVDI 5.00
204,2v_color2nearestNVDI 5.00
204,3vq_px_formatNVDI 5.00
205,0vs_ctabNVDI 5.00
205,1vs_ctab_entryNVDI 5.00
205,2vs_dflt_ctabNVDI 5.00
206,0vq_ctabNVDI 5.00
206,1vq_ctab_entryNVDI 5.00
206,2vq_ctab_idNVDI 5.00
206,3v_ctab_idx2vdiNVDI 5.00
206,4v_ctab_vdi2idxNVDI 5.00
206,5v_ctab_idx2valueNVDI 5.00
206,6v_get_ctab_idNVDI 5.00
206,7vq_dflt_ctabNVDI 5.00
206,8v_create_ctabNVDI 5.00
206,9v_delete_ctabNVDI 5.00
207,0vs_hilite_colorNVDI 5.00
207,1vs_min_colorNVDI 5.00
207,2vs_max_colorNVDI 5.00
207,3vs_weight_colorNVDI 5.00
208,0v_create_itabNVDI 5.00
208,1v_delete_itabNVDI 5.00
209,0vq_hilite_colorNVDI 5.00
209,1vq_min_colorNVDI 5.00
209,2vq_max_colorNVDI 5.00
209,3vq_weight_colorNVDI 5.00
224,100vs_backmapSpeedoGDOS 5.1
224,101vs_outmodeSpeedoGDOS 5.1
224,105vs_use_fontsSpeedoGDOS 5.1
225vqt_drv_availSpeedoGDOS 5.1
226,1v_set_cachedirSpeedoGDOS 5.1
226,2v_get_cachedirSpeedoGDOS 5.1
226,3v_def_cachedirSpeedoGDOS 5.1
226,4v_clr_cachedirSpeedoGDOS 5.1
226,5v_delete_cacheSpeedoGDOS 5.1
226,6v_save_cacheSpeedoGDOS 5.1
226,7v_load_cacheSpeedoGDOS 5.1
229vqt_xfntinfoNVDI 3.02
230,0vst_nameNVDI 3.02
230,100vqt_name_and_idNVDI 3.02
231vst_widthNVDI 3.00
232vqt_fontheaderNVDI 3.00
233v_mono_ftextSpeedoGDOS 5.1
234vqt_trackkernNVDI 3.00
235vqt_pairkernNVDI 3.00
236vst_charmapNVDI 3.00
236vst_map_modeNVDI 4.00
237vst_kernNVDI 3.00
237vst_track_offsetNVDI 3.00
238vq_ptsinsz
239v_getbitmap_infoNVDI 3.00
240,0vqt_f_extentNVDI 3.00
240,4200vqt_real_extentNVDI 3.00
240,4200vqt_real_extent_unicodeNVDI
240vqt_f_extent16
241v_ftextNVDI 3.00
241v_ftext_offsetNVDI 3.00
241v_ftext16
241v_ftext_offset16
242v_killoutlineFSM
243v_getoutlineNVDI 3.00
243,1v_get_outlineNVDI 5.00
243,31v_fgetoutlineSpeedoGDOS 5.0d
244vst_scratch
245vst_errorSpeedoGDOS 4.00
246vst_arbptSpeedoGDOS 4.00
246vst_arbpt32NVDI 3.00
247vqt_advanceSpeedoGDOS 4.00
247vqt_advance32NVDI 3.00
248vqt_devinfoSpeedoGDOS 4.00
248,0vq_devinfoNVDI 3.00
248,4242vq_ext_devinfoNVDI 3.00
249v_savecache
250v_loadcache
251v_flushcacheNVDI
252vst_setsizeSpeedoGDOS 4.00
252vst_setsize32NVDI 3.00
253vst_skewNVDI 3.00
254vqt_get_tableSpeedoGDOS 4.00
255vqt_cachesizeSpeedoGDOS 4.00
255,100vqt_cacheinfoSpeedoGDOS 5.1
+
+ +
+ +Home +VDIVDI +TC-VDI functionsTC-VDI functions +VDI structuresVDI structures + + diff --git a/en/vdi_input.html b/en/vdi_input.html new file mode 100644 index 000000000..a8dd8b228 --- /dev/null +++ b/en/vdi_input.html @@ -0,0 +1,3551 @@ + + + + + +The documentation for TOS: Input functions + + + + + + + + + +Home +VDIVDI +Inquire functionsInquire functions +Escape functionsEscape functions + +
+ +

7.7 Input functions

+

The input functions enable a program to inquire the status of +the keyboard and mouse, taking into consideration the input modes. +They also offer routines for linking in timer and mouse interrupts. +The following functions are available: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
v_hide_c Hides graphic mouse cursor +
v_show_c Displays (unhides) graphic mouse cursor +
vex_butv Moves service routine for mouse-button interrrupts +
vex_curv Draws customized mouse pointer +
vex_motv Moves service routine for mouse movement interrupts +
vex_timv Moves service routine for timer interrupts +
vex_wheelv Service routine for mouse wheel events +
vq_key_s Inquires Shift-key status +
vq_mouse Gets position of graphic cursor +
vrq_choice Awaits keypress (REQUEST) +
vrq_locator Gets position of graphic cursor (REQUEST) +
vrq_string Reads in string from keyboard (REQUEST) +
vrq_valuator Supervision of input devices (REQUEST) +
vsc_form Defines graphic cursor +
vsin_mode Switches between REQUEST and SAMPLE mode +
vsm_choice Gets the key pressed last (SAMPLE) +
vsm_locator Gets position of the graphic cursor (SAMPLE) +
vsm_string Reads in string from keyboard (SAMPLE) +
vsm_valuator Gets the status of input devices (SAMPLE) + +
+ +

Note: These functions are intended primarily for the +owner of the physical workstation, i.e. for the AES. +Programs should (provided there are no pressing needs for a different +procedure) always inquire mouse and keyboard events through the +AES's event functions, because otherwise inputs intended for other +applications may be intercepted. +

+

See also: VDI workstations   Style guidelines +

+

7.7.1 vex_butv

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Exchange button change vector« - Adapt the interrupt vector +for a mouse button press. +
  +
Opcode: 125 +
  +
Syntax: void vex_butv ( int16_t handle, int16_t (*pusrcode)(), int16_t +(**psavcode)() ); +
  +
Description: The call vex_butv permits the installation of a custom routine +that is called by the VDI each time a mouse button is pressed. The +following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
pusrcode Address of the new routine +
psavcode Address of the old routine + +
+ +
On entry to pusrcode, the mouse status is contained in +register d0 (in the same format as the button return value in +vq_mouse). The subroutine must save and restore modified registers and +call the old status routine. +
  +
Note: The input functions of the VDI work only on the +physical workstation, which is normally used by the AES. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all screen drivers. +
  +
Group: Input functions +
  +
See also: Binding   vex_timv   vex_motv   vex_curv +
  + +
+ +

7.7.2 Bindings for vex_butv

+ + + + + + + + + +
C: void vex_butv ( int16_t handle, int16_t (*pusrcode)(), int16_t +(**psavcode)() ); +
  +
Binding: +
  +
void vex_butv (int16_t handle, int16_t (*pusrcode)(),
+               int16_t (**psavcode)())
+{
+   contrl[0] = 125;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+   contrl[7..8] = pusrcode;
+
+   vdi ();
+
+   *psavcode = contrl[9..10];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]125 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+12contrl[6]handle
contrl+14contrl[7,8]pusrcode
contrl+18contrl[9,10]psavcode
+
+ + +
+ +

7.7.3 vex_curv

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Exchange cursor change vector« - Adapt the interrupt vector +for cursor pointer drawing. +
  +
Opcode: 127 +
  +
Syntax: void vex_curv ( int16_t handle, int16_t (*pusrcode)(), int16_t +(**psavcode)() ); +
  +
Description: The call vex_curv permits the installation of a routine that is +called each time a mouse pointer is drawn, allowing a customized mouse +pointer form to replace that drawn by the system. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
pusrcode Address of the new routine +
psavcode Address of the old routine + +
+ +
The routine will be called if the mouse is moved and d0.w/d1.w +contain the coordinates of the mouse cursor. The subroutine must save +and restore modified registers and call the old interrupt routine. +
  +
Note: The input functions of the VDI work only on the +physical workstation, which is normally used by the AES. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all screen drivers. +
  +
Group: Input functions +
  +
See also: Binding   vex_timv   vex_butv   vex_motv +
  + +
+ +

7.7.4 Bindings for vex_curv

+ + + + + + + + + +
C: void vex_curv ( int16_t handle, int16_t (*pusrcode)(), int16_t +(**psavcode)() ); +
  +
Binding: +
  +
void vex_curv (int16_t handle, int16_t (*pusrcode)(),
+               int16_t (**psavcode)())
+{
+   contrl[0] = 127;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+   contrl[7..8] = pusrcode;
+
+   vdi ();
+
+   *psavcode = contrl[9..10];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]127 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+12contrl[6]handle
contrl+14contrl[7..8]pusrcode
contrl+18contrl[9..10]psavcode
+
+ + +
+ +

7.7.5 vex_motv

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Exchange mouse movement vector« - Adapt the interrupt vector +for mouse movements. +
  +
Opcode: 126 +
  +
Syntax: void vex_motv ( int16_t handle, int16_t (*pusrcode)(), int16_t +(**psavcode)() ); +
  +
Description: The call vex_motv permits the installation of a custom routine +that is called by the VDI each time a mouse pointer is moved. The +following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
pusrcode Address of the new routine +
psavcode Address of the old routine + +
+ +
On entry to pusrcode, the mouse's X and Y location is +contained in registers d0 and d1 respectively. The subroutine must +save and restore modified registers and call the old status routine. +
  +
Note: The input functions of the VDI work only on the +physical workstation, which is normally used by the AES. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all screen drivers. +
  +
Group: Input functions +
  +
See also: Binding   vex_timv   vex_butv   vex_curv +
  + +
+ +

7.7.6 Bindings for vex_motv

+ + + + + + + + + +
C: void vex_motv ( int16_t handle, int16_t (*pusrcode)(), int16_t +(**psavcode)() ); +
  +
Binding: +
  +
void vex_motv (int16_t handle, int16_t (*pusrcode)(),
+               int16_t (**psavcode)())
+{
+   contrl[0] = 126;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+   contrl[7..8] = pusrcode;
+
+   vdi ();
+
+   *psavcode = contrl[9..10];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]126 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+12contrl[6]handle
contrl+14contrl[7..8]pusrcode
contrl+18contrl[9..10]psavcode
+
+ + +
+ +

7.7.7 vex_timv

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Exchange timer interrupt vector« - Adapt the interrupt +vector for the timer. +
  +
Opcode: 118 +
  +
Syntax: void vex_timv ( int16_t handle, int16_t (*tim_addr)(), int16_t +(**otim_addr)(), int16_t *tim_conv ); +
  +
Description: The call vex_timv permits the installation of a user-defined +routine that will be called at each timer tick (currently every 50 +milliseconds). The following apply: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
tim_addr Address of the new timer routine +
otim_addr Address of the old timer routine +
tim_conv Interrupt interval in ms + +
+ +
The subroutine has to save and restore modified registers and +call the old timer routine. +
  +
Notes: The input functions of the VDI work only on +the physical workstation, which is normally used by the +AES. +
  +
As this vector is jumped through frequently, the new routine +should be very simple to avoid degrading the system performance. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all screen drivers. +
  +
Group: Input functions +
  +
See also: Binding   vex_butv   vex_motv   vex_curv +
  + +
+ +

7.7.8 Bindings for vex_timv

+ + + + + + + + + +
C: void vex_timv ( int16_t handle, int16_t (*tim_addr)(), int16_t +(**otim_addr)(), int16_t *tim_conv ); +
  +
Binding: +
  +
void vex_timv (int16_t handle, int16_t (*tim_addr)(),
+               int16_t (**otim_addr)(), int16_t *tim_conv)
+{
+   contrl[0] = 118;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+   contrl[7..8] = tim_addr;
+
+   vdi ();
+
+   *otim_addr = contrl[9..10];
+   *tim_conv  = intout[0];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]118 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+12contrl[6]handle
contrl+14contrl[7..8]tim_addr
contrl+18contrl[9..10]otim_addr
intoutintout[0]tim_conv
+
+ + +
+ +

7.7.9 vex_wheelv

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Exchange wheel interrupt vector« - Adapt the interrupt +vector for the mouse wheel. +
  +
Opcode: 134 +
  +
Syntax: void vex_wheelv ( int16_t handle, void *new, void **old ); +
  +
Description: The call vex_wheelv installs a routine which is called by the +VDI every time a mouse wheel event occurs. d0.w contain the +wheel_number, d1.w contain the wheel_amount of the wheel from the +mouse. The subroutine must save and restore modified registers and +call the old interrupt routine. +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
new Address of the new routine +
old Address of the old routine + +
+ +
Return value: The function does not return a result. +
  +
Availability: As of MilanTOS 4.08 Release 5.10.2002, not yet documented, +internals may still change. +
  +
Group: Input functions +
  +
See also: Binding   vex_butv   vex_motv   vex_curv   vex_timv +
  + +
+ +

7.7.10 Bindings for vex_wheelv

+ + + + + + + + + +
C: void vex_wheelv ( int16_t handle, void *new, void **old ); +
  +
Binding: +
  +
void vex_wheelv ( int16_t handle, void *new, void **old )
+{
+   contrl[0] = 134;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+   contrl[7..8] = new;
+
+   vdi ();
+
+   *old = contrl[9..10];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]134 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+12contrl[6]handle
contrl+14contrl[7..8]new
contrl+18contrl[9..10]old
+
+ + +
+ +

7.7.11 vq_key_s

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Sample keyboard state information« - Obtain the status of +the Shift etc. keys. +
  +
Opcode: 128 +
  +
Syntax: void vq_key_s ( int16_t handle, int16_t *pstatus ); +
  +
Description: The call vq_key_s checks the status of the 'special' keys (L +& R Shift, Control, Alternate) of the keyboard. The following +apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
pstatus Keyboard state: + + + + + + + + + + + + +
Right Shift = 0x0001 +
Left Shift = 0x0002 +
Control key = 0x0004 +
Alternate key = 0x0008 + +
+ + +
+ +
In GEM programs one should use the AES event functions to ensure that +only the keyboard status information intended for one's own +application is obtained. +
  +
Note: The input functions of the VDI work only on the +physical workstation, which is normally used by the AES. +Therefore it is better to fall back to using graf_mkstate or the +event functions instead. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all Atari computers. +
  +
Group: Input functions +
  +
See also: Binding   evnt_button +
  + +
+ +

7.7.12 Bindings for vq_key_s

+ + + + + + + + + +
C: void vq_key_s ( int16_t handle, int16_t *pstatus ); +
  +
Binding: +
  +
void vq_key_s (int16_t handle, int16_t *pstatus)
+{
+   contrl[0] = 128;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *pstatus = intout[0];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]128 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+12contrl[6]handle
intoutintout[0]pstatus
+
+ + +
+ +

7.7.13 vq_mouse

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Sample mouse button state« - Obtain position and status of +the mouse buttons. +
  +
Opcode: 124 +
  +
Syntax: void vq_mouse ( int16_t handle, int16_t *pstatus, int16_t *x, +int16_t *y ); +
  +
Description: The call vq_mouse obtains the current cursor position and the +current status of the mouse buttons. The following apply: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
pstatus Mouse button state + + + + + + +
Bit-0 = Left mouse button +
Bit-1 = Right mouse button (etc.) + +
+ +
x X-position of cursor +
y Y-position of cursor + +
+ +
In GEM programs one should use the AES function graf_mkstate +to ensure that only the information about the position and state of +the mouse buttons intended for one's own application is obtained. +
  +
Note: The input functions of the VDI work only on the +physical workstation, which is normally used by the AES. +Therefore it is better to fall back to using graf_mkstate or the event functions +instead. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all screen drivers. +
  +
Group: Input functions +
  +
See also: Binding   graf_mkstate +
  + +
+ +

7.7.14 Bindings for vq_mouse

+ + + + + + + + + +
C: void vq_mouse ( int16_t handle, int16_t *pstatus, int16_t *x, +int16_t *y ); +
  +
Binding: +
  +
void vq_mouse (int16_t handle, int16_t *pstatus, int16_t *x,
+               int16_t *y)
+{
+   contrl[0] = 124;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *pstatus = intout[0];
+   *x = ptsout[0];
+   *y = ptsout[1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]124 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]1 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+12contrl[6]handle
intoutintout[0]pstatus
ptsoutptsout[0]x
ptsout+2ptsout[1]y
+
+ + +
+ +

7.7.15 vrq_choice

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Input choice, Request mode« - Return the status of the +'choice' device (e.g. function keys when one was pressed). +
  +
Opcode: 30 +
  +
Syntax: void vrq_choice ( int16_t handle, int16_t ch_in, int16_t +*ch_out ); +
  +
Description: The call vrq_choice ascertains the actuation of a 'choice' +device (e.g. function key) in REQUEST mode. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
ch_in Starting value for choice device +
ch_out Selected key or code number + +
+ +
The number of function keys depends on each individual device. +If another key is pressed, the corresponding code number will be +returned. +
  +
Return value: The function does not return a result. +
  +
Availability: Although the function is implemented in ROM, it does not seem +to work in any way. The function is not supported by all +device drivers. +
  +
The input functions of the VDI work only on the +physical workstation, which is normally used by the AES. +
  +
Group: Input functions +
  +
See also: Binding   vsm_choice   vsin_mode +
  + +
+ +

7.7.16 Bindings for vrq_choice

+ + + + + + + + + +
C: void vrq_choice ( int16_t handle, int16_t ch_in, int16_t +*ch_out ); +
  +
Binding: +
  +
void vrq_choice (int16_t handle, int16_t ch_in,
+                 int16_t *ch_out)
+{
+   intin[0] = ch_in;
+
+   contrl[0] = 30;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *ch_out = intout[0];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]30 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]1 # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+12contrl[6]handle
intinintin[0]ch_in
intoutintout[0]ch_out
+
+ + +
+ +

7.7.17 vrq_locator

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Input locator, Request mode« - Obtain the mouse position +when a key was pressed. +
  +
Opcode: 28 +
  +
Syntax: void vrq_locator ( int16_t handle, int16_t x, int16_t y, +int16_t *xout, int16_t *yout, int16_t *term ); +
  +
Description: The call vrq_locator ascertains or sets the position of the +graphic cursor (the 'locator') in REQUEST mode. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
x Initial X-coordinate, and +
y Y-coordinate of the graphic cursor +
xout Final X-coordinate, and +
yout Y-coordinate of graphic cursor on return +
term The low byte contains a character terminator. For +keyboard-terminated locator input, this is the ASCII character code of +the key struck to terminate input. For nonkeyboard-terminated input +(tablet, mouse, and so on), valid locator terminators begin with 20 +Hex (space) and increase from there. + +
+ +
The user only gets the result when a key is pressed. The graphic +cursor is always visible on the screen at the specified position in +the current form. One should note that any desired key (including the +mouse buttons) may be pressed. +
  +
Normally the movement of the graphic cursor takes place in large +steps when the cursor keys are pressed, or in small steps when these +are pressed in combination with the Shift key. On the Atari, however, +the Alternate key is required as well. +
  +
Return value: The function does not return a result. +
  +
Availability: The function is not supported by all device drivers. The input +functions of the VDI work only on the physical workstation, +which is normally used by the AES. +
  +
Group: Input functions +
  +
See also: Binding   vsm_locator   vsin_mode +
  + +
+ +

7.7.18 Bindings for vrq_locator

+ + + + + + + + + +
C: void vrq_locator ( int16_t handle, int16_t x, int16_t y, +int16_t *xout, int16_t *yout, int16_t *term ); +
  +
Binding: +
  +
void vrq_locator (int16_t handle, int16_t x, int16_t y,
+                  int16_t *xout, int16_t *yout, int16_t *term)
+{
+   ptsin[0] = x;
+   ptsin[1] = y;
+
+   contrl[0] = 28;
+   contrl[1] = 1;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *xout = ptsout[0];
+   *yout = ptsout[1];
+   *term = intout[0];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]28 # Function Opcode
contrl+2contrl[1]1 # Entry in ptsin
contrl+4contrl[2]1 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+12contrl[6]handle
ptsinptsin[0]x
ptsin+2ptsin[1]y
intoutintout[0]term
ptsoutptsout[0]xout
ptsout+2ptsout[1]yout
+
+ + +
+ +

7.7.19 vrq_string

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Input string, Request mode« - Read in a string in REQUEST +mode. +
  +
Opcode: 31 +
  +
Syntax: void vrq_string ( int16_t handle, int16_t max_length, int16_t +echo_mode, int16_t *echo_xy, int8_t *string ); +
  +
Description: The call vrq_string reads a string from the 'string' device +(normally the keyboard) in REQUEST mode into a buffer, with an +optional echo to the screen. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
max_length Maximum string length +
echo_mode Mode: + + + + + + +
0 = No echo +
1 = Echo input characters to specified position + +
+ +
echo_xy[0] X-coordinate, and +
echo_xy[1] Y-coordinate of echo area +
string Address of character string + +
+ +
The echo output is not available on all devices; the text attributes will +be paid regard to. +
  +
If max_length is negative, the absolute value is +considered to be the maximum length and scancodes are returned instead +of ASCII values. +
  +
Note: The input functions of the VDI work only on the +physical workstation, which is normally used by the AES. +
  +
Return value: The function does not return a result. +
  +
Availability: This call is not guaranteed to be available with any driver and +its use should therefore be restricted. +
  +
Group: Input functions +
  +
See also: Binding   vswr_mode   vs_color   vst_alignment   vst_height   +vst_point   vst_rotation   vst_font   vst_color   vst_effects   +vsm_string +
  + +
+ +

7.7.20 Bindings for vrq_string

+ + + + + + + + + +
C: void vrq_string ( int16_t handle, int16_t max_length, int16_t +echo_mode, int16_t *echo_xy, int8_t *string ); +
  +
Binding: +
  +
void vrq_string (int16_t handle, int16_t max_length,
+                 int16_t echo_mode, int16_t *echo_xy,
+                 int8_t *string)
+{
+   int16_t tmp;
+
+   intin[0] = max_length;
+   intin[1] = echo_mode;
+   ptsin[0..1] = echo_xy[0..1];
+
+   contrl[0] = 31;
+   contrl[1] = 1;
+   contrl[3] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   for (tmp = 0; tmp < contrl[4]; tmp++)
+      *string++ = intout[tmp];
+
+   *string = 0;
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]31 # Function opcode
contrl+2contrl[1]1 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]2 # Entry in intin
contrl+8contrl[4]n # Entry in intout
contrl+12contrl[6]handle
intinintin[0]max_length
intin+2intin[1]echo_mode
ptsinptsin[0..1]echo_xy[0..1]
intoutintout[0..n-1]string[0..n-1]
+
+ + +
+ +

7.7.21 vrq_valuator

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Input valuator, Request mode« - Obtain value changes of +input devices. +
  +
Opcode: 29 +
  +
Syntax: void vrq_valuator ( int16_t handle, int16_t valuator_in, +int16_t *valuator_out, int16_t *terminator ); +
  +
Description: The call vrq_valuator obtains a value change that is the result +of various key presses (on the valuator device) until a terminating +character is entered in REQUEST mode. The following apply: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
valuator_in Initial value of valuator device +
valuator_out Output value of valuator +
terminator Actuated key causing termination + +
+ +
All values lie between 1 and 100. Typcal keys for value changes +are cursor-up or cursor-down. With these one gets the following value +changes to the value current at the time: +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
KeypressValue
Cursor-up+ 10
Cursor-down- 10
Shift + Cursor-up+ 01
Shift + Cursor-down- 01
+
+ +
Return value: The function does not return a result. +
  +
Availability: The function is not supported by all device drivers +(also not in the ROM). The input functions of the VDI work only on +the physical workstation, which is normally used by the +AES. +
  +
Group: Input functions +
  +
See also: Binding   vsm_valuator   vsin_mode +
  + +
+ +

7.7.22 Bindings for vrq_valuator

+ + + + + + + + + +
C: void vrq_valuator ( int16_t handle, int16_t valuator_in, +int16_t *valuator_out, int16_t *terminator ); +
  +
Binding: +
  +
void vrq_valuator (int16_t handle, int16_t valuator_in,
+                   int16_t *valuator_out, int16_t *terminator)
+{
+   intin[0] = valuator_in;
+
+   contrl[0] = 29;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *valuator_out = intout[0];
+   *terminator   = intout[1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]29 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]1 # Entry in intin
contrl+8contrl[4]2 # Entry in intout
contrl+12contrl[6]handle
intinintin[0]valuator_in
intoutintout[0]valuator_out
intout+2intout[1]terminator
+
+ + +
+ +

7.7.23 vsc_form

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set mouse form« - Set the mouse pointer shape. +
  +
Opcode: 111 +
  +
Syntax: void vsc_form ( int16_t handle, int16_t *pcur_form ); +
  +
Description: The call vsc_form permits the definition of the shape of the +mouse pointer, which is stored in the MFORM structure. The following +apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
pcur_form[0] X-coordinate, and +
pcur_form[1] Y-coordinate of hot-spot +
pcur_form[2] Number of planes, must be 1 +
pcur_form[3] Colour index of background mask (should be 0) +
pcur_form[4] Colour index of foreground mask (should be 1) +
pcur_form[05..20] Definition of background mask +
pcur_form[21..36] Definition of foreground mask + +
+ +
Each mask is dimensioned as a 16-WORD field each of 16 bits. Bit +15 of the first WORD is here the top left corner of the mask, and bit +0 of WORD 16 is the bottom right corner. +
  + +
Under hot-spot one understands the exact position of the +active part of the graphic cursor. With an arrow this corresponds to +the arrow's tip, with a cross it is the crossing-point. The +coordinates are specified relative to the top left corner of the mask. +
  +
For setting the mouse pointer shape, all GEM programs should use +the AES function graf_mouse. Otherwise the mouse pointer shape +management of the AES will become permanently confused. +
  +
Note: The input functions of the VDI work only on the +physical workstation, which is normally used by the AES. +Therefore it is better to fall back to using graf_mouse instead. +
  +
Under NVDI it is also possible to obtain the current shape of +the mouse pointer (see Binding). +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all screen drivers. +
  +
Group: Input functions +
  +
See also: Binding   graf_mouse   MFORM +
  + +
+ +

7.7.24 Bindings for vsc_form

+ + + + + + + + + +
C: void vsc_form ( int16_t handle, int16_t *pcur_form ); +
  +
Binding: +
  +
void vsc_form (int16_t handle, int16_t *pcur_form)
+{
+   intin[0..36] = pcur_form[0..36];
+
+   contrl[0] = 111;
+   contrl[1] = 0;
+   contrl[3] = 37;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]111 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]37 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+12contrl[6]handle
intinintin[0..36]pcur_form[0..36]
+
+ +
Note: Under NVDI it is also possible to obtain the +current shape of the mouse pointer. The assignment of the input/output +fields for this are as follows: +
  + + + + + + + + + + + + + + + + + + + + + +
contrl[0] = 111; +
contrl[1] = 0; +
contrl[2] = 0; +
contrl[3] = 0; +
contrl[4] = 37; +
contrl[6] = handle; +
intout[0..36] = pcur_form[0..36]; + +
+ + +
+ +

7.7.25 vsin_mode

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set input mode« - Switch between REQUEST and SAMPLE mode. +
  +
Opcode: 33 +
  +
Syntax: int16_t vsin_mode ( int16_t handle, int16_t dev_type, int16_t +mode ); +
  +
Description: The call vsin_mode sets the input mode to REQUEST or SAMPLE for +the specified device. +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
dev_type Type of input device: + + + + + + + + + + + + +
1 = Position input (mouse) +
2 = Value-altering devices (cursor) +
3 = 'Choice' devices (function keys) +
4 = Alphanumeric devices (keyboard) + +
+ +
mode Requested input mode: + + + + + + +
1 = Request +
2 = Sample + +
+ + +
+ + + +
In REQUEST mode the input device waits for an input, in SAMPLE +mode only the status of the position of the input device will be +returned. +
  +
Notes: The input functions of the VDI work only on +the physical workstation, which is normally used by the +AES. +
  +
Using this function will cause the AES to operate improperly! +
  +
Return value: The function returns the selected input mode. +
  +
Availability: Supported in ROM by all Atari computers. +
  +
Group: Input functions +
  +
See also: Binding +
  + +
+ +

7.7.26 Bindings for vsin_mode

+ + + + + + + + + +
C: int16_t vsin_mode ( int16_t handle, int16_t dev_type, int16_t +mode ); +
  +
Binding: +
  +
int16_t vsin_mode (int16_t handle, int16_t dev_type,
+                   int16_t mode)
+{
+   intin[0] = dev_type;
+   intin[1] = mode;
+
+   contrl[0] = 33;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   /* Warning: Not all bindings provide a
+      return value !!! */
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]33 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]2 # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+12contrl[6]handle
intinintin[0]dev_type
intin+2intin[1]mode
intoutintout[0]Return Value
+
+ + +
+ +

7.7.27 vsm_choice

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Input choice, Sample mode« - Ascertain which function key +was pressed last. +
  +
Opcode: 30 +
  +
Syntax: int16_t vsm_choice ( int16_t handle, int16_t *choice ); +
  +
Description: The call vsm_choice obtains the current value of the 'choice' +device, normally the number of the last pressed function key. The +folowing apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
choice Pressed function key or 0, if none such was struck + +
+ +
The number of function keys depends on the device in each case. +If another key has been activated, then the associated code number +will be returned. +
  +
Return value: The function returns the selection status (0 = no key, 1 = key +pressed). +
  +
Availability: Although the function is implemented in ROM, it does not seem +to work properly. The function is not supported by all device +drivers. The input functions of the VDI work only on the +physical workstation, which is normally used by the AES. +
  +
Group: Input functions +
  +
See also: Binding   vrq_choice   vsin_mode +
  + +
+ +

7.7.28 Bindings for vsm_choice

+ + + + + + + + + +
C: int16_t vsm_choice ( int16_t handle, int16_t *choice ); +
  +
Binding: +
  +
int16_t vsm_choice ( int16_t handle, int16_t *choice )
+{
+   contrl[0] = 30;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *choice = intout[0];
+   return ( contrl[4] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]30 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]status # Entry in intout
contrl+12contrl[6]handle
intoutintout[0]choice
+
+ + +
+ +

7.7.29 vsm_locator

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Input locator, Sample mode« - Obtain the position of the +graphic cursor. +
  +
Opcode: 28 +
  +
Syntax: int16_t vsm_locator ( int16_t handle, int16_t x, int16_t y, +int16_t *xout, int16_t *yout, int16_t *term ); +
  +
Description: The call vsm_locator sets or obtains the position of the +'locator' (graphic cursor) in SAMPLE mode. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Position Meaning +
    +
handle Workstation identifier +
x Initial X-coordinate, and +
y Y-coordinate of the graphic cursor +
xout Final X-coordinate, and +
yout Y-coordinate of graphic cursor on return +
term In the low byte, the ASCII code of the terminating key will be +filled in; since special keys (mouse buttons, etc.) are assigned +values from 32 (left button) and 33 (right button), they cannot be +differentiated directly from keys of the keyboard + +
+ +
This function does not make the graphic cursor visible; +key presses or cursor movements will only be reported if they have +actually taken place. +
  +
Notes: The input functions of the VDI work only on +the physical workstation, which is normally used by the +AES. +
  +
Using this call will confuse the AES. +
  +
Return value: The function returns coded information about whether the cursor +position has changed (bit 0 set) and whether a key was pressed (bit 1 +set). +
  +
Availability: The function is not supported by all device drivers. +
  +
Group: Input functions +
  +
See also: Binding   vrq_locator   vsin_mode +
  + +
+ +

7.7.30 Bindings for vsm_locator

+ + + + + + + + + +
C: int16_t vsm_locator ( int16_t handle, int16_t x, int16_t y, +int16_t *xout, int16_t *yout, int16_t *term ); +
  +
Binding: +
  +
int16_t vsm_locator (int16_t handle, int16_t x, int16_t y,
+                     int16_t *xout, int16_t *yout,
+                     int16_t *term)
+{
+   ptsin[0] = x;
+   ptsin[1] = y;
+
+   contrl[0] = 28;
+   contrl[1] = 1;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *xout = ptsout[0];
+   *yout = ptsout[1];
+   *term = intout[0];
+
+   return ( (contrl[4] << 1) | (contrl[2]) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]28 # Function opcode
contrl+2contrl[1]1 # Entry in ptsin
contrl+4contrl[2]0 oder 1 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 oder 1 # Entry in intout
contrl+12contrl[6]handle
ptsinptsin[0]x
ptsin+2ptsin[1]y
intoutintout[0]term
ptsoutptsout[0]xout
ptsout+2ptsout[1]yout
+
+ + +
+ +

7.7.31 vsm_string

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Input string, Sample mode« - Read in a string in SAMPLE +mode. +
  +
Opcode: 31 +
  +
Syntax: int16_t vsm_string ( int16_t handle, int16_t max_length, +int16_t echo_mode, int16_t *echo_xy, int8_t *string ); +
  +
Description: The call vsm_string retrieves input from the 'string' device +(normally the keyboard) in SAMPLE mode into a buffer, with an optional +echo to the screen. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
max_length Maximum string length +
echo_mode Mode: + + + + + + +
0 = No echo +
1 = Echo input characters + +
+ +
echo_xy[0] X-coordinate, and +
echo_xy[1] Y-coordinate of echo area +
string Address of character string buffer + +
+ +
The echo output is not available on all devices; the text attributes will +be paid regard to. +
  +
If max_length is negative, the absolute value is +considered to be the maximum length and scancodes are returned instead +of ASCII values, occupying the full WORD in intout rather than just +the lower 8 bits. +
  +
The input of a character string is terminated by: +
  +
    +
  • A carriage return is encountered +
  • +
  • The intout buffer is full +
  • +
  • Data is no longer available +
  • +
+ +
If the character string is basically to be terminated with +Return, then you should use REQUEST mode with vrq_string. +
  +
Note: The input functions of the VDI work only on the +physical workstation, which is normally used by the AES. +
  +
Return value: The function returns either the number of read in characters, +or NULL if the input was terminated by an invalid key. The text that +was input lies in string. +
  +
Availability: The function is not supported by all device drivers. +
  +
Group: Input functions +
  +
See also: Binding   vswr_mode   vs_color   vst_alignment   vst_height   +vst_point   vst_rotation   vst_font   vst_color   vst_effects   +vrq_string +
  + +
+ +

7.7.32 Bindings for vsm_string

+ + + + + + + + + +
C: int16_t vsm_string ( int16_t handle, int16_t max_length, +int16_t echo_mode, int16_t *echo_xy, int8_t *string ); +
  +
Binding: +
  +
int16_t vsm_string (int16_t handle, int16_t max_length,
+                    int16_t echo_mode, int16_t *echo_xy,
+                    int8_t *string)
+{
+   int16_t tmp;
+
+   intin[0] = max_length;
+   intin[1] = echo_mode;
+   ptsin[0..1] = echo_xy[0..1];
+
+   contrl[0] = 31;
+   contrl[1] = 1;
+   contrl[3] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   for (tmp = 0; tmp < contrl[4]; tmp++)
+      *string++ = intout[tmp];
+
+   *string = 0;
+   return ( contrl[4] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]31 # Function opcode
contrl+2contrl[1]1 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]2 # Entry in intin
contrl+8contrl[4]max_length # Entry in intout
contrl+12contrl[6]handle
intinintin[0]max_length
intin+2intin[1]echo_mode
ptsinptsin[0..1]echo_xy[0..1]
intoutintout[0..n-1]string[0..n-1]
+
+ + +
+ +

7.7.33 vsm_valuator

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Input valuator, Sample mode« - Obtain value changes of input +devices in SAMPLE mode. +
  +
Opcode: 29 +
  +
Syntax: void vsm_valuator ( int16_t handle, int16_t val_in, int16_t +*val_out, int16_t *term, int16_t *status ); +
  +
Description: The call vsm_valuator retrieves value changes from the +'valuator' device in SAMPLE mode. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
val_in Initial value +
val_out Final value +
term ASCII-code of pressed key +
status Evaluation: + + + + + + + + + +
0 = No change +
1 = Value changed +
2 = Key pressed + +
+ + +
+ +
Values between 1 and 100 are returned if a corresponding event +has occurred; otherwise no value is returned. +
  +
Note: The function is not supported by all +device drivers (also not in the ROM). The input functions of the +VDI work only on the physical workstation, which is +normally used by the AES. +
  +
Return value: The function does not return a result. +
  +
Availability: The function is not guaranteeed to be available with any driver +and its use should therefore be restricted. +
  +
Group: Input functions +
  +
See also: Binding   vrq_valuator   vsin_mode +
  + +
+ +

7.7.34 Bindings for vsm_valuator

+ + + + + + + + + +
C: void vsm_valuator ( int16_t handle, int16_t val_in, int16_t +*val_out, int16_t *term, int16_t *status ); +
  +
Binding: +
  +
void vsm_valuator (int16_t handle, int16_t val_in,
+                   int16_t *val_out, int16_t *term,
+                   int16_t *status)
+{
+   intin[0] = val_in;
+
+   contrl[0] = 29;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *val_out = intout[0];
+   *term    = intout[1];
+   *status  = contrl[4];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]29 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]1 # Entry in intin
contrl+8contrl[4]status # Entry in intout
contrl+12contrl[6]handle
intinintin[0]val_in
intoutintout[0]val_out
intout+2intout[1]term
+
+ + +
+ +

7.7.35 v_hide_c

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Hide cursor« - Switch off graphic cursor. +
  +
Opcode: 123 +
  +
Syntax: void v_hide_c ( int16_t handle ); +
  +
Description: The call v_hide_c switches the mouse cursor off. +
  +
In GEM programs, it is imperative that the AES function +graf_mouse is used to switch the mouse cursor on and off. +
  +
Note: The input functions of the VDI work only on the +physical workstation, which is normally used by the AES. +Therefore it is better to fall back to using graf_mouse instead. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all screen drivers. +
  +
Group: Input functions +
  +
See also: Binding   v_show_c +
  + +
+ +

7.7.36 Bindings for v_hide_c

+ + + + + + + + + +
C: void v_hide_c ( int16_t handle ); +
  +
Binding: +
  +
void v_hide_c (int16_t handle)
+{
+   contrl[0] = 123;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]123 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+12contrl[6]handle
+
+ + +
+ +

7.7.37 v_show_c

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Show cursor« - Switch on graphic cursor. +
  +
Opcode: 122 +
  +
Syntax: void v_show_c ( int16_t handle, int16_t reset ); +
  +
Description: The call v_show_c 'unhides' the graphic cursor, or cancels the +call of the v_hide_c function. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
reset Flag: + + + + + + +
  0 = Ignore number of Hide cursor calls +
<>0 = Normal Show cursor functionality (cursor is only +displayed if the function has been called the same number of times as +v_hide_c) + +
+ + +
+ +
In GEM programs, it is imperative that the AES function +graf_mouse is used to switch the mouse cursor on and off. +
  +
Note: The input functions of the VDI work only on the +physical workstation, which is normally used by the AES. +Therefore it is better to fall back to using graf_mouse instead. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all screen drivers. +
  +
Group: Input functions +
  +
See also: Binding   v_hide_c   graf_mouse +
  + +
+ +

7.7.38 Bindings for v_show_c

+ + + + + + + + + +
C: void v_show_c ( int16_t handle, int16_t reset ); +
  +
Binding: +
  +
void v_show_c (int16_t handle, int16_t reset)
+{
+   intin[0] = reset;
+
+   contrl[0] = 122;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]122 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]1 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+12contrl[6]handle
intinintin[0]reset
+
+ + +
+ +
+ +Home +VDIVDI +Inquire functionsInquire functions +Escape functionsEscape functions + + diff --git a/en/vdi_inquire.html b/en/vdi_inquire.html new file mode 100644 index 000000000..adf806a9e --- /dev/null +++ b/en/vdi_inquire.html @@ -0,0 +1,10470 @@ + + + + + +The documentation for TOS: Inquire functions + + + + + + + + + +Home +VDIVDI +Output functionsOutput functions +Input functionsInput functions + +
+ +

7.6 Inquire functions

+

This library contains functions to inquire about a multitude of +set attributes. The following routines are available for this purpose: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
vq_cellarray Inquires the definition of a colour selection cell array +
vq_color Gets colour intensity information +
vq_devinfo Inquires status of an output device +
vq_ext_devinfo Gets information about a GDOS driver +
vq_extnd Gets additional information about the configuration of a +workstation +
vq_ptsinsz Internal function from GDOS +
vq_scrninfo Gets information about screen format +
vqf_attributes Gets fill attributes +
vqf_bg_color Gets object background colour +
vqf_fg_color Gets object foreground colour +
vqin_mode Inquires input mode of an input device +
vql_attributes Gets line attributes +
vql_bg_color Gets line background colour +
vql_fg_color Gets line foreground colour +
vqm_attributes Gets marker atttributes +
vqm_bg_color Gets marker background colour +
vqm_fg_color Gets marker foreground colour +
vqr_bg_color Gets bitmap background colour +
vqr_fg_color Gets bitmap foreground colour +
vqt_advance Gets position for next vector character +
vqt_advance32 Gets more exact position for next vector character (fix31). +
vqt_attributes Gets text attributes +
• vqt_cacheinfo No information available at present +
vqt_cachesize Gets size of the vector character cache +
vqt_char_index Converts index from/ to given mappings +
vqt_devinfo Inquires status of an output device +
• vqt_drv_avail No information available at present +
vqt_ext_name Extended function for obtaining font information +
vqt_extent Calculates dimensions of a text bounding rectangle +
vqt_f_extent Calculates dimensions of a text for vector fonts +
• vqt_f_extent16 Calculates dimensions of a text for 16-bit Speedo character +indexed text +
vqt_bg_color Gets text background colour +
vqt_fg_color Gets text foreground colour +
vqt_fontheader Gets information about a font header +
vqt_fontinfo Gets information about a font +
vqt_get_table Inquires address of the character transformation tables +
vqt_justified Inquires offsets from an alignment point +
vqt_name Gets name and index of a font +
vqt_name_and_id Finds font ID and name +
vqt_pairkern Gets adjustment vector information for kerning of a character +pair +
vqt_real_extent Gets bounding rectangle around a text +
vqt_trackkern Gets adjustment vectors for fonts with track-kerning +
vqt_width Calculates width of a character cell +
vqt_xfntinfo Gets information about a font +
v_create_driver_info Gets information about a driver +
v_delete_driver_info Deletes information about a driver +
v_get_driver_info Gets extended information about a driver +
v_getbitmap_info Gets placement information about the bitmap of a vector +character +
v_read_default_settings Gets default printer settings +
v_write_default_settings Sets the default printer settings + +
+ +

Note: Besides general attributes, the functions listed +here can obtain extensive information about text handling. +

+

See also: VDI workstations   Style guidelines +

+

7.6.1 vqf_attributes

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire current fill area attributes« - Obtain the +attributes for filling area +
  +
Opcode: 37 +
  +
Syntax: void vqf_attributes ( int16_t handle, int16_t *attrib ); +
  +
Description: The call vqf_attributes reports back the current attributes for +filled graphic objects. +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
attrib[0] Fill type +
attrib[1] Fill colour +
attrib[2] Fill style index +
attrib[3] Writing mode +
attrib[4] Perimeter flag: +
+
+ + + + + + + + +
0 =invisible
<> 0 =visible
+
+ + +
+ +
Return value: The function does not return a result. +
  +
Availability: Supported by all devices. +
  +
Group: Inquire functions +
  +
See also: Binding   vswr_mode   vs_color   vsf_interior   vsf_style   +vsf_color   vsf_perimeter +
  + +
+ +

7.6.2 Bindings for vqf_attributes

+ + + + + + + + + +
C: void vqf_attributes ( int16_t handle, int16_t *attrib ); +
  +
Binding: +
  +
void vqf_attributes (int16_t handle, int16_t *attrib)
+{
+   contrl[0] = 37;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   attrib[0..4] = intout[0..4];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]37 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]5 # Entry in intout
contrl+12contrl[6]handle
intoutintout[0..4]attrib[0..4]
+
+ + +
+ +

7.6.3 vqf_bg_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire background colour« - Obtain object background +colour. +
  +
Opcode: 203 (Sub-Opcode 1) +
  +
Syntax: int32_t vqf_bg_color( int16_t handle, COLOR_ENTRY *bg_color ); +
  +
Description: The call vqf_bg_color obtains the background colour for graphic +objects. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
bg_color COLOR_ENTRY of background colour + +
+ +
Return value: Set colour space (at present only CSPACE_RGB), or -1 (invalid +subfunction number). +
  +
Availability: As of NVDI 5.00. +
  +
Group: Inquire functions +
  +
See also: Binding +
  + +
+ +

7.6.4 Bindings for vqf_bg_color

+ + + + + + + + + +
C: int32_t vqf_bg_color( int16_t handle, COLOR_ENTRY *bg_color ); +
  +
Binding: +
  +
int32_t vqf_bg_color( int16_t handle, COLOR_ENTRY *bg_color )
+{
+   contrl[0] = 203;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   bg_color = intout [2..5];
+   return ( int32_t intout [0]  );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]203 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]6 # Entry in intout
contrl+10contrl[5]1 # Sub-opcode
contrl+12contrl[6]handle
intoutintout[0..1]color_space
intout+4intout[2..5]bg_color
+
+ + +
+ +

7.6.5 vqf_fg_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Foreground Color« - Obtain object foreground colour. +
  +
Opcode: 202 (Sub-Opcode 1) +
  +
Syntax: int32_t vqf_fg_color( int16_t handle, COLOR_ENTRY *fg_color ); +
  +
Description: The call vqf_fg_color obtains the foreground colour for graphic +objects. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
fg_color COLOR_ENTRY of foreground colour + +
+ +
Return value: Set colour space (at present only CSPACE_RGB), or -1 (invalid +subfunction number). +
  +
Availability: As of NVDI 5.00. +
  +
Group: Inquire functions +
  +
See also: Binding +
  + +
+ +

7.6.6 Bindings for vqf_fg_color

+ + + + + + + + + +
C: int32_t vqf_fg_color( int16_t handle, COLOR_ENTRY *fg_color ); +
  +
Binding: +
  +
int32_t vqf_fg_color( int16_t handle, COLOR_ENTRY *fg_color )
+{
+   contrl[0] = 202;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   fg_color = intout [2..5];
+   return ( int32_t intout [0]  );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]202 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]6 # Entry in intout
contrl+10contrl[5]1 # Sub-opcode
contrl+12contrl[6]handle
intoutintout[0..1]color_space
intout+4intout[2..5]fg_color
+
+ + +
+ +

7.6.7 vqin_mode

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Input Mode« - Obtain the input mode for an input +device. +
  +
Opcode: 115 +
  +
Syntax: void vqin_mode ( int16_t handle, int16_t dev_type, int16_t +*input_mode ); +
  +
Description: The call vqin_mode obtains the input status for a specified +VDI input device. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
dev_type Logical input device: + + + + + + + + + + + + +
1 = Locator (mouse, mouse buttons and keyboard) +
2 = Valuator device (cursor) +
3 = Selector devices (function keys) +
4 = Alphanumeric devices (keyboard) + +
+ +
input_mode Input mode: + + + + + + +
1 = Request +
2 = Sample + +
+ + +
+ +
Return value: The function does not return a result. +
  +
Availability: Supported by all Atari computers. +
  +
Group: Inquire functions +
  +
See also: Binding   vsin_mode   vrq_locator   vsm_locator   vrq_valuator   +vsm_valuator   vrq_choice   vsm_choice   vrq_string   vsm_string +
  + +
+ +

7.6.8 Bindings for vqin_mode

+ + + + + + + + + +
C: void vqin_mode ( int16_t handle, int16_t dev_type, int16_t +*input_mode ); +
  +
Binding: +
  +
void vqin_mode (int16_t handle, int16_t dev_type,
+                int16_t *input_mode)
+{
+   intin[0] = dev_type;
+
+   contrl[0] = 115;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *input_mode = intout[0];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]115 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]1 # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+12contrl[6]handle
intinintin[0]dev_type
intoutintout[0]input_mode
+
+ + +
+ +

7.6.9 vql_attributes

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Current Polyline Attributes« - Obtain the attributes +for drawing lines. +
  +
Opcode: 35 +
  +
Syntax: void vql_attributes ( int16_t handle, int16_t *attrib ); +
  +
Description: The call vql_attributes returns the settings that affect the +attributes of the current line drawing functions. +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
attrib[0] Line type (see vsl_type) +
attrib[1] Line colour (see vsl_color) +
attrib[2] Writing mode (see vswr_mode) +
attrib[3] Current line width (see vsl_width) +
attrib[4] End style for start of lines (see vsl_ends) +
attrib[5] End style for end of lines (see vsl_ends) + +
+ +
Note: The statements made here (specially for +attrib[4,5]) apply for the NVDI implementation. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all drivers. +
  +
Group: Inquire functions +
  +
See also: Binding   vswr_mode   vs_color   vsl_type   vsl_width   +vsl_color   vsl_ends +
  + +
+ +

7.6.10 Bindings for vql_attributes

+ + + + + + + + + +
C: void vql_attributes ( int16_t handle, int16_t *attrib ); +
  +
Binding: +
  +
void vql_attributes (int16_t handle, int16_t *attrib)
+{
+   contrl[0] = 35;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   attrib[0..2] = intout[0..2];
+   attrib[3]    = ptsout[0];
+   attrib[4..5] = intout[3..4];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]35 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]1 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]5 # Entry in intout
contrl+12contrl[6]handle
intoutintout[0..4]attrib[0..2, 4..5]
ptsoutptsout[0]attrib[3]
ptsout+2ptsout[1]0
+
+ + +
+ +

7.6.11 vql_bg_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Background Color« - Obtain lines background colour. +
  +
Opcode: 203 (Sub-Opcode 2) +
  +
Syntax: int32_t vql_bg_color( int16_t handle, COLOR_ENTRY *bg_color ); +
  +
Description: The call vql_bg_color obtains the background colour for lines. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
bg_color COLOR_ENTRY of background colour + +
+ +
Return value: Set colour space (at present only CSPACE_RGB), or -1 (invalid +subfunction number). +
  +
Availability: As of NVDI 5.00. +
  +
Group: Inquire functions +
  +
See also: Binding +
  + +
+ +

7.6.12 Bindings for vql_bg_color

+ + + + + + + + + +
C: int32_t vql_bg_color( int16_t handle, COLOR_ENTRY *bg_color ); +
  +
Binding: +
  +
int32_t vql_bg_color( int16_t handle, COLOR_ENTRY *bg_color )
+{
+   contrl[0] = 203;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   bg_color = intout [2..5];
+   return ( int32_t intout [0]  );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]203 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]6 # Entry in intout
contrl+10contrl[5]2 # Sub-opcode
contrl+12contrl[6]handle
intoutintout[0..1]color_space
intout+4intout[2..5]bg_color
+
+ + +
+ +

7.6.13 vql_fg_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Foreground Color« - Obtain lines foreground colour. +
  +
Opcode: 202 (Sub-Opcode 2) +
  +
Syntax: int32_t vql_fg_color( int16_t handle, COLOR_ENTRY *fg_color ); +
  +
Description: The call vql_fg_color obtains the foreground colour for lines. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
fg_color COLOR_ENTRY of foreground colour + +
+ +
Return value: Set colour space (at present only CSPACE_RGB), or -1 (invalid +subfunction number). +
  +
Availability: As of NVDI 5.00. +
  +
Group: Inquire functions +
  +
See also: Binding +
  + +
+ +

7.6.14 Bindings for vql_fg_color

+ + + + + + + + + +
C: int32_t vql_fg_color( int16_t handle, COLOR_ENTRY *fg_color ); +
  +
Binding: +
  +
int32_t vql_fg_color( int16_t handle, COLOR_ENTRY *fg_color )
+{
+   contrl[0] = 202;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   fg_color = intout [2..5];
+   return ( int32_t intout [0]  );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]202 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]6 # Entry in intout
contrl+10contrl[5]2 # Sub-opcode
contrl+12contrl[6]handle
intoutintout[0..1]color_space
intout+4intout[2..5]fg_color
+
+ + +
+ +

7.6.15 vqm_attributes

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire current polymarker attributes« - Obtain the +attributes for drawing the markers. +
  +
Opcode: 36 +
  +
Syntax: void vqm_attributes ( int16_t handle, int16_t *attrib ); +
  +
Description: The call vqm_attributes obtains the current marker attributes +for output. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
attrib[0] Current marker type +
Some version of the ATARI-VDI wrongly return the type +off-by-1 (0 for DOT etc.) EmuTOS also mimics this behaviour. +
attrib[1] Current marker colour +
attrib[2] Current writing mode +
attrib[3] Current marker height +
attrib[4] Current marker width + +
+ +
Note: The specifications made here are valid for the +implementation in NVDI and PC-GEM. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all drivers. +
  +
Group: Inquire functions +
  +
See also: Binding   vswr_mode   vs_color   vsm_type   vsm_height   +vsm_color +
  + +
+ +

7.6.16 Bindings for vqm_attributes

+ + + + + + + + + +
C: void vqm_attributes ( int16_t handle, int16_t *attrib ); +
  +
Binding: +
  +
void vqm_attributes (int16_t handle, int16_t *attrib)
+{
+   contrl[0] = 36;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   attrib[0..2] = intout[0..2];
+   attrib[3]    = ptsout[1];
+   attrib[4]    = ptsout[0];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]36 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]1 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]3 # Entry in intout
contrl+12contrl[6]handle
intoutintout[0..2]attrib[0..2]
ptsoutptsout[0]attrib[4]
ptsout+2ptsout[1]attrib[3]
+
+ + +
+ +

7.6.17 vqm_bg_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire background colour« - Obtain marker background +colour. +
  +
Opcode: 203 (Sub-Opcode 3) +
  +
Syntax: int32_t vqm_bg_color( int16_t handle, COLOR_ENTRY *bg_color ); +
  +
Description: The call vqm_bg_color obtains the background colour for +markers. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
bg_color COLOR_ENTRY of background colour + +
+ +
Return value: Set colour space (at present only CSPACE_RGB), or -1 (invalid +subfunction number). +
  +
Availability: As of NVDI 5.00. +
  +
Group: Inquire functions +
  +
See also: Binding +
  + +
+ +

7.6.18 Bindings for vqm_bg_color

+ + + + + + + + + +
C: int32_t vqm_bg_color( int16_t handle, COLOR_ENTRY *bg_color ); +
  +
Binding: +
  +
int32_t vqm_bg_color( int16_t handle, COLOR_ENTRY *bg_color )
+{
+   contrl[0] = 203;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 3;
+   contrl[6] = handle;
+
+   vdi ();
+
+   bg_color = intout [2..5];
+   return ( int32_t intout [0]  );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]203 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]6 # Entry in intout
contrl+10contrl[5]3 # Sub-opcode
contrl+12contrl[6]handle
intoutintout[0..1]color_space
intout+4intout[2..5]bg_color
+
+ + +
+ +

7.6.19 vqm_fg_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Foreground Color« - Obtain marker foreground colour. +
  +
Opcode: 202 (Sub-Opcode 3) +
  +
Syntax: int32_t vqm_fg_color( int16_t handle, COLOR_ENTRY *fg_color ); +
  +
Description: The call vqm_fg_color obtains the foreground colour for +markers. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
fg_color COLOR_ENTRY of foreground colour + +
+ +
Return value: Set colour space (at present only CSPACE_RGB), or -1 (invalid +subfunction number). +
  +
Availability: As of NVDI 5.00. +
  +
Group: Inquire functions +
  +
See also: Binding +
  + +
+ +

7.6.20 Bindings for vqm_fg_color

+ + + + + + + + + +
C: int32_t vqm_fg_color( int16_t handle, COLOR_ENTRY *fg_color ); +
  +
Binding: +
  +
int32_t vqm_fg_color( int16_t handle, COLOR_ENTRY *fg_color )
+{
+   contrl[0] = 202;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 3;
+   contrl[6] = handle;
+
+   vdi ();
+
+   fg_color = intout [2..5];
+   return ( int32_t intout [0]  );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]202 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]6 # Entry in intout
contrl+10contrl[5]3 # Sub-opcode
contrl+12contrl[6]handle
intoutintout[0..1]color_space
intout+4intout[2..5]fg_color
+
+ + +
+ +

7.6.21 vqr_bg_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire background colour« - Obtain bitmap background +colour. +
  +
Opcode: 203 (Sub-Opcode 4) +
  +
Syntax: int32_t vqr_bg_color( int16_t handle, COLOR_ENTRY *bg_color ); +
  +
Description: The call vqr_bg_color obtains the background colour for +bitmaps. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
bg_color COLOR_ENTRY of background colour + +
+ +
Return value: Set colour space (at present only CSPACE_RGB), or -1 (invalid +subfunction number). +
  +
Availability: As of NVDI 5.00. +
  +
Group: Inquire functions +
  +
See also: Binding +
  + +
+ +

7.6.22 Bindings for vqr_bg_color

+ + + + + + + + + +
C: int32_t vqr_bg_color( int16_t handle, COLOR_ENTRY *bg_color ); +
  +
Binding: +
  +
int32_t vqr_bg_color( int16_t handle, COLOR_ENTRY *bg_color )
+{
+   contrl[0] = 203;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 4;
+   contrl[6] = handle;
+
+   vdi ();
+
+   bg_color = intout [2..5];
+   return ( int32_t intout [0]  );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]203 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]6 # Entry in intout
contrl+10contrl[5]4 # Sub-opcode
contrl+12contrl[6]handle
intoutintout[0..1]color_space
intout+4intout[2..5]bg_color
+
+ + +
+ +

7.6.23 vqr_fg_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire foreground colour« - Obtain bitmap foreground +colour. +
  +
Opcode: 202 (Sub-Opcode 4) +
  +
Syntax: int32_t vqr_fg_color( int16_t handle, COLOR_ENTRY *fg_color ); +
  +
Description: The call vqr_fg_color obtains the foreground colour for +bitmaps. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
fg_color COLOR_ENTRY of foreground colour + +
+ +
Return value: Set colour space (at present only CSPACE_RGB), or -1 (invalid +subfunction number). +
  +
Availability: As of NVDI 5.00. +
  +
Group: Inquire functions +
  +
See also: Binding +
  + +
+ +

7.6.24 Bindings for vqr_fg_color

+ + + + + + + + + +
C: int32_t vqr_fg_color( int16_t handle, COLOR_ENTRY *fg_color ); +
  +
Binding: +
  +
int32_t vqr_fg_color( int16_t handle, COLOR_ENTRY *fg_color )
+{
+   contrl[0] = 202;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 4;
+   contrl[6] = handle;
+
+   vdi ();
+
+   fg_color = intout [2..5];
+   return ( int32_t intout [0]  );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]202 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]6 # Entry in intout
contrl+10contrl[5]4 # Sub-opcode
contrl+12contrl[6]handle
intoutintout[0..1]color_space
intout+4intout[2..5]fg_color
+
+ + +
+ +

7.6.25 vqt_advance

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire outline text advance placement vector« - Obtain +position for the next vector character. +
  +
Opcode: 247 +
  +
Syntax: void vqt_advance ( int16_t handle, int16_t ch, int16_t +*x_advance, int16_t *y_advance, int16_t *remx, int16_t *remy ); +
  +
Description: The call vqt_advance calculates offsets (advance vector and +remainder) to be able to write the next character of a string at the +correct position. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
ch Character of interest +
x_advance X-spacing in pixels +
y_advance Y-spacing in pixels +
remx X-decimal remainder (mod 16384) +
remy Y-decimal remainder (mod 16384) + +
+ +
Notes: x_advance and y_advance added to +the position where the last character was rendered gives the place +where to draw the next character. The vector works in all directions +and with all text rotations. +
  +
The function is required particularly when the angle for text +rotation is anything but 0, 90, 180 or 270 degrees. +
  +
The returned values refer only to the spacing that is used for +the positioning of the next character, i.e. x_advance does +not include any parts of a character that overhangs the +em-square. +
  +
The remx and remy remainders should be summed by +the application outputting the text and used to nudge the advance +vector by a pixel when required. +
  +
Return value: The function does not return a result. +
  +
Availability: FSMGDOS, as of SpeedoGDOS 4.00 and from NVDI 3.00 on. +
  +
Group: Inquire functions +
  +
See also: Binding   vqt_advance32   vst_rotation   SpeedoGDOS   NVDI +
  + +
+ +

7.6.26 Bindings for vqt_advance

+ + + + + + + + + +
C: void vqt_advance ( int16_t handle, int16_t ch, int16_t +*x_advance, int16_t *y_advance, int16_t *remx, int16_t *remy ); +
  +
Binding: +
  +
void vqt_advance ( int16_t handle, int16_t ch,
+                   int16_t *x_advance, int16_t *y_advance,
+                   int16_t *remx, int16_t *remy );
+{
+   intin[0] = ch;
+
+   contrl[0] = 247;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   x_advance = ptsout[0];
+   y_advance = ptsout[1];
+   remx      = ptsout[2];
+   remy      = ptsout[3];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]247 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]4 # Entry in ptsout
contrl+6contrl[3]1 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+12contrl[6]handle
intinintin[0]ch
ptsoutptsout[0]x_advance
ptsout+2ptsout[1]y_advance
ptsout+4ptsout[2]remx
ptsout+6ptsout[3]remy
+
+ +
The returned values refer only to the spacing that is used for +the positioning of the next character, i.e. x_advance does +not include any parts of a character that overhangs the +em-square. +
  + +
+ +

7.6.27 vqt_advance32

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire outline text advance placement vector« - Obtain more +precise position for the next vector character as two fix31 values. +
  +
Opcode: 247 +
  +
Syntax: void vqt_advance32 ( int16_t handle, int16_t ch, fix31 +*x_advance, fix31 *y_advance ); +
  +
Description: The call vqt_advance32 is a variant of vqt_advance calculating +offsets (advance vector and remainder) to be able to write the next +character of a string at the correct position, returned with greater +precision as two fix31 values. The following apply: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
ch Character of interest +
x_advance X-advance in 1/65536 pixels +
y_advance Y-advance in 1/65536 pixels + +
+ +
Notes: x_advance and y_advance added to +the position where the last character was rendered gives the place +where to draw the next character. The vector works in all directions +and with all text rotations. +
  +
The function is required particularly when the angle for text +rotation is anything but 0, 90, 180 or 270 degrees. +
  +
Remember that x_advance and y_advance are only +offsets used to place the next character - they do not include parts +of the character which extend beyond the em-square. +
  +
Return value: The function does not return a result. +
  +
Availability: As of SpeedoGDOS 4.00 and as of NVDI 3.00. In the docs for +NVDI 3.00 this function is wrongly named as vqt_advance (it was +corrected in the NVDI 4.00 docs). +
  +
Group: Inquire functions +
  +
See also: Binding   vst_rotation   SpeedoGDOS   NVDI +
  + +
+ +

7.6.28 Bindings for vqt_advance32

+ + + + + + + + + +
C: void vqt_advance32 ( int16_t handle, int16_t ch, fix31 +*x_advance, fix31 *y_advance ); +
  +
Binding: +
  +
void vqt_advance32 (int16_t handle, int16_t ch,
+                   fix31 *x_advance, fix31 *y_advance)
+{
+   intin[0] = ch;
+
+   contrl[0] = 247;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *x_advance = ptsout[4..5];
+   *y_advance = ptsout[6..7];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]247 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]4 # Entry in ptsout
contrl+6contrl[3]1 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+12contrl[6]handle
intinintin[0]ch
ptsout+8ptsout[4..5]x_advance
ptsout+12ptsout[6..7]y_advance
+
+ +
Remember that x_advance and y_advance are only +offsets used to place the next character - they do not include parts +of the character which extend beyond the em-square. +
  + +
+ +

7.6.29 vqt_attributes

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire current graphic text attributes« - Obtain the +attributes for the writing of texts. +
  +
Opcode: 38 +
  +
Syntax: void vqt_attributes ( int16_t handle, int16_t *attrib ); +
  +
Description: The call vqt_attributes obtains the current text attributes. +The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
attrib[0] Font ID +
attrib[1] Text colour index +
attrib[2] Text rotation in 1/10 of a degree +
attrib[3] Horizontal alignment: + + + + + + + + + +
0 = Flushed left +
1 = Centered +
2 = Flushed right + +
+ +
attrib[4] Vertical alignment: + + + + + + + + + + + + + + + + + + +
0 = Baseline +
1 = Half line +
2 = Ascent line +
3 = Bottom line +
4 = Descent line +
5 = Top line + +
+ +
attrib[5] Writing mode: +
Some version of the ATARI-VDI wrongly return the writing mode +off-by-1 (0 for REPLACE etc.) EmuTOS also mimics this behaviour. +
attrib[6] Character width +
attrib[7] Character height +
attrib[8] Character cell width +
attrib[9] Character cell height + +
+ +
Return value: The function does not return a result. +
  +
Availability: Supported by all drivers. +
  +
Group: Inquire functions +
  +
See also: Binding   vswr_mode   vs_color   vst_height   vst_point   +vst_rotation   vst_font   vst_color   vst_effects   vst_alignment +
  + +
+ +

7.6.30 Bindings for vqt_attributes

+ + + + + + + + + +
C: void vqt_attributes ( int16_t handle, int16_t *attrib ); +
  +
Binding: +
  +
void vqt_attributes (int16_t handle, int16_t *attrib)
+{
+   contrl[0] = 38;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   attrib[0..5] = intout[0..5];
+   attrib[6..9] = ptsout[0..3];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]38 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]2 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]6 # Entry in intout
contrl+12contrl[6]handle
intoutintout[0..5]attrib[0..5]
ptsoutptsout[0..3]attrib[6..9]
+
+ +
Note: The Atari-VDI wrongly returns the writing mode +-1 in intout[5]; with NVDI, this occurs only when error compatibility +is switched on. +
  + +
+ +

7.6.31 vqt_bg_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire background colour« - Obtain text background colour. +
  +
Opcode: 203 (Sub-Opcode 0) +
  +
Syntax: int32_t vqt_bg_color( int16_t handle, COLOR_ENTRY *bg_color ); +
  +
Description: The call vqt_bg_color obtains the background colour for text. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
bg_color COLOR_ENTRY of background colour + +
+ +
Return value: Set colour space (at present only CSPACE_RGB), or -1 (invalid +subfunction number). +
  +
Availability: As of NVDI 5.00. +
  +
Group: Inquire functions +
  +
See also: Binding +
  + +
+ +

7.6.32 Bindings for vqt_bg_color

+ + + + + + + + + +
C: int32_t vqt_bg_color( int16_t handle, COLOR_ENTRY *bg_color ); +
  +
Binding: +
  +
int32_t vqt_bg_color( int16_t handle, COLOR_ENTRY *bg_color )
+{
+   contrl[0] = 203;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   bg_color = intout [2..5];
+   return ( int32_t intout [0]  );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]203 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]6 # Entry in intout
contrl+10contrl[5]0 # Sub-opcode
contrl+12contrl[6]handle
intoutintout[0..1]color_space
intout+4intout[2..5]bg_color
+
+ + +
+ +

7.6.33 vqt_cachesize

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Get outline cache size« - Obtain the size of the vector +character cache. +
  +
Opcode: 255 +
  +
Syntax: void vqt_cachesize ( int16_t handle, int16_t which_cache, +int32_t *size ); +
  +
Description: The call vqt_cachesize obtains the size of the largest +allocatable block of memory in one of two vector character caches. The +following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
which_cache Cache: + + + + + + +
0 = Character bitmap cache +
1 = Cache for data structure + +
+ +
size Size of largest allocatable block of memory in the selected +cache + +
+ +
Notes: An application can estimate how much memory is +needed to generate a character, and issue a warning message if one +tries to exceed this. FSMGDOS will just put a message on the screen +asking the user to reboot. +
  +
To estimate the memory required for a given character in the +character bitmap cache use the formula: +
  +
(Width in pixels + 7)/8 * height in pixels +
  +
The amount of memory for the data structure cache can be +estimated from: +
  +
84 * (width + height) +
  +
Return value: The function does not return a result. +
  +
Availability: FSMGDOS, as of SpeedoGDOS 4.00. +
  +
Group: Inquire functions +
  +
See also: Binding   v_loadcache   v_savecache   v_flushcache +
  + +
+ +

7.6.34 Bindings for vqt_cachesize

+ + + + + + + + + +
C: void vqt_cachesize ( int16_t handle, int16_t which_cache, +int32_t *size ); +
  +
Binding: +
  +
void vqt_cachesize ( int16_t handle, int16_t which_cache,
+                     int32_t *size );
+{
+   intin[0] = which_cache;
+
+   contrl[0] = 255;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *size = intout[0..1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]255 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]1 # Entry in intin
contrl+8contrl[4]2 # Entry in intout
contrl+12contrl[6]handle
intoutintout[0]Returnwert
+
+ + +
+ +

7.6.35 vqt_char_index

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire character index« - Convert an index with reference +to given mappings. +
  +
Opcode: 190 (Opcode 0) +
  +
Syntax: uint16_t vqt_char_index ( int16_t handle, uint16_t scr_index, +int16_t src_mode, int16_t dst_mode ); +
  +
Description: The call vqt_char_index converts a passed character index from +and to the desired mapping encoding. +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
src_index Index to be converted +
src_mode Type of source mapping: + + + + + + + + + +
0 = scr_index is a direct index +
1 = scr_index is an ASCII index +
2 = scr_index is a Unicode index + +
+ +
dst_mode Type of destination mapping: + + + + + + + + + +
0 = is a direct index +
1 = is an ASCII index +
2 = is a Unicode index + +
+ + +
+ +
Note: If you want to convert an index from ASCII to +ASCII, only the range from 32 to 255 is used. The control codes are not +translated, e.g. a call like vqt_char_index( handle, 10, 1, 0 ) +returns 0xffff. +
  +
For example, to determine if the font contains a character with +Unicode 0x201e ("quotedblbase", DOUBLE LOW-9 QUOTATION +MARK), you should use the following function: +
  +
int16_t is_char_available (int16_t handle, uint16_t unicode)
+{
+   uint16_t dindex;
+
+   /* Translate unicode into a direct index */
+   dindex = vqt_char_index (handle, unicode, 2, 0);
+
+   if (dindex == 0xffff)
+      return (FALSE);        /* Character is available */
+   else
+      return (TRUE);         /* Not available */
+}
+
+
Return value: This function returns the converted index, or the value 0xffff +if conversion was not possible. +
  +
Availability: since NVDI Version 4.00 +
  +
Group: Inquire functions +
  +
See also: Binding   vst_charmap +
  + +
+ +

7.6.36 Bindings for vqt_char_index

+ + + + + + + + + +
C: uint16_t vqt_char_index ( int16_t handle, uint16_t scr_index, +int16_t src_mode, int16_t dst_mode ); +
  +
Binding: +
  +
uint16_t vqt_char_index ( int16_t handle, uint16_t scr_index,
+                          int16_t scr_mode, int16_t dst_mode )
+{
+   intin[0] = scr_index;
+   intin[1] = src_mode;
+   intin[2] = dst_mode;
+
+   contrl[0] = 190;
+   contrl[1] = 0;
+   contrl[3] = 3;
+   contrl[5] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]190 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]3 # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+10contrl[5]0
contrl+12contrl[6]handle
intinintin[0]scr_index
intin+2intin[1]scr_mode
intin+4intin[2]dst_mode
intoutintout[0]Return Value
+
+ + +
+ +

7.6.37 vqt_devinfo

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire device status info« - Inquire status of the output +device. +
  +
Opcode: 248 +
  +
Syntax: void vqt_devinfo ( int16_t handle, int16_t device, int16_t +*devexits, int8_t *devname ); +
  +
Description: The call vqt_devinfo checks whether a driver for a given output +device has been installed. The following apply: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
device Device ID (0..99) +
devexits + + + + + + + + + +
-1 = Error +
 0 = Device not installed +
 1 = Device installed + +
+ +
devname Device name + +
+ +
Return value: The function does not return a result. +
  +
Availability: Only with FONTGDOS, FSM or SpeedoGDOS. +
  +
Group: Inquire functions +
  +
See also: Binding   vq_devinfo   vq_ext_devinfo   GDOS   SpeedoGDOS   +NVDI +
  + +
+ +

7.6.38 Bindings for vqt_devinfo

+ + + + + + + + + +
C: void vqt_devinfo ( int16_t handle, int16_t device, int16_t +*devexits, int8_t *devname ); +
  +
Binding: +
  +
void vqt_devinfo ( int16_t handle, int16_t device,
+                   int16_t *devexits, int8_t *devname )
+{
+   intin[0] = device;
+
+   contrl[0] = 248;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *devexits = ptsout[0];
+   p = contrl[4];
+   dev_name[0..p-1]    = intout[0..p-1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]248 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]1 # Entry in ptsout
contrl+6contrl[3]1 # Entry in intin
contrl+8contrl[4]p # Entry in intout
contrl+12contrl[6]handle
intinintin[0]device
intoutintout[0..p-1]devname[0..p-1]
ptsoutptsout[0]devexits
+
+ + +
+ +

7.6.39 vqt_extent

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire text extent« - Obtain the length of a text string. +
  +
Opcode: 116 +
  +
Syntax: void vqt_extent ( int16_t handle, int8_t *string, int16_t +*extent ); +
  +
Description: The call vqt_extent returns the minimal bounding box of a +string of text in pixels. Correct bounding information is also output +for rotated text. +
  +
Example: +
  +

+
The function is passed the following parameters: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
string Character string +
extent[0] X-coordinate, and +
extent[1] Y-coordinate of the bottom left corner +
extent[2] X-coordinate, and +
extent[3] Y-coordinate of the bottom right corner +
extent[4] X-coordinate, and +
extent[5] Y-coordinate of the top right corner +
extent[6] X-coordinate, and +
extent[7] Y-coordinate of the top left corner + +
+ +
Notes: If the selected font is an outline (vector) font, +the character widths (vqt_width) will be added and the string +(especially the leftmost and the right-most character) might exceed +the returned rectangle. For this reason it may be better to fall back +on the vqt_f_extent function which provides more accurate information +by taking special factors into account, or the vqt_real_extent +function if working under NVDI. +
  +
In old GEM versions, incidentally, the function does not work +correctly if the text string contains umlauts, as old GEM +versions could not yet handle these properly. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all drivers. +
  +
Group: Inquire functions +
  +
See also: Binding   vst_height   vst_point   vst_rotation   vst_font   +vst_effects   vqt_f_extent   vqt_real_extent +
  + +
+ +

7.6.40 Bindings for vqt_extent

+ + + + + + + + + +
C: void vqt_extent ( int16_t handle, int8_t *string, int16_t +*extent ); +
  +
Binding: +
  +
void vqt_extent (int16_t handle, int8_t *string,
+                 int16_t *extent)
+{
+   int16_t *tmp;
+
+   tmp = intin;
+   while (*tmp++ = *string++)
+      ;
+
+   contrl[0] = 116;
+   contrl[1] = 0;
+   contrl[3] = (int16_t) ((tmp-intin)-1);
+   contrl[6] = handle;
+
+   vdi ();
+
+   extent[0..7] = ptsout[0..7];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]116 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]4 # Entry in ptsout
contrl+6contrl[3]n # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+12contrl[6]handle
intinintin[0..n-1]string[0..n-1]
ptsoutptsout[0..7]extent[0..7]
+
+ + +
+ +

7.6.41 vqt_ext_name

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire face name and index« - Obtain information about a +font. +
  +
Opcode: 130 (Sub-Opcode 1) +
  +
Syntax: int16_t vqt_ext_name ( int16_t handle, int16_t index, int8_t +*name, uint16_t *font_format, uint16_t *flags ); +
  +
Description: The call vqt_ext_name obtains information about a font (or +face). The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
index Index (1 - number of fonts) +
name[0..31] Font name +
name[32] Flags: + + + + + + +
0 = Bitmap font +
1 = Vector font + +
+ +
font_format Font format: + + + + + + + + + + + + +
Bit-0 = Bitmap font +
Bit-1 = Speedo font +
Bit-2 = TrueType font +
Bit-3 = Type-1 font + +
+ +
flags Type of font: + + + + + + +
Bit-0 + + + + + + +
= 0 (Proportional font) +
= 1 (Monospaced font) + +
+ +
Bit-4 as of NVDI 4.1 (27.11.1996) + + + + + + +
= 0 (Font ist not a symbol font) +
= 1 (Font is a symbol font) + +
+ + +
+ + +
+ +
Note: A font is classified as a symbol font when +it is not complete in the region 'A'-'Z' and 'a'-'z', or if it is +pictorial according to the PANOSE classification. The relevant +flag is therefore to be treated only as a clue (it would also be set +for a cyrillic TrueType font, for instance), and signals that the +character assignments correspond to ASCII mapping (vst_charmap) and +not the normal Atari assignments. +
  +
Return value: The function returns the ID of the font. +
  +
Availability: As of NVDI 3.00. +
  +
Group: Inquire functions +
  +
See also: Binding   vst_load_fonts   vst_font   vqt_xfntinfo +
  + +
+ +

7.6.42 Bindings for vqt_ext_name

+ + + + + + + + + +
C: int16_t vqt_ext_name ( int16_t handle, int16_t index, int8_t +*name, uint16_t *font_format, uint16_t *flags ); +
  +
Binding: +
  +
int16_t vqt_ext_name (int16_t handle, int16_t index,
+                      int8_t *name, uint16_t *font_format,
+                      uint16_t *flags)
+{
+   intin[0] = index;
+   intin[1] = 0;         /* Reserved */
+
+   contrl[0] = 130;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[5] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   name[0..31]  = intout[1..32];
+   name[32]     = intout[33];
+   *flags       = (intout[34] >> 8) & 0xff;
+   *font_format = intout[34] & 0xff;
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]130 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]2 # Entry in intin
contrl+8contrl[4]35 # Entry in intout
contrl+10contrl[5]1 # Sub-opcode
contrl+12contrl[6]handle
intinintin[0]index
intin+2intin[1]0
intoutintout[0]Return Value
intout+2intout[1..16]name[0..31]
intout+64intout[33]name[32]
intout+66intout[34]flags/font_format
+
+ +
Notes: The high byte of intout[34] returns +flags; the low byte of intout[34] returns font_format. +
  +
To ascertain what type of font one is dealing with, one has to +note the number of entries in intout (contrl[4]). If contrl[4] is 33, +then no additional information is present, and hence we are dealing +with a bitmap font. If contrl[4] == 34, then additionally +intout[33] (name[32]) just communicates whether we are dealing with a +vector font. Only if contrl[4] == 35, one can ascertain from +intout[34] (flags) the font type more exactly, and recognize +immediately whether the font is monospaced. +
  +
intout[34] is only returned when contrl[3] > 1 and contrl[5] += 1! +
  + +
+ +

7.6.43 vqt_fg_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire foreground colour« - Obtain text foreground colour. +
  +
Opcode: 202 (Sub-Opcode 0) +
  +
Syntax: int32_t vqt_fg_color( int16_t handle, COLOR_ENTRY *fg_color ); +
  +
Description: The call vqt_fg_color obtains the foreground colour for text. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
fg_color COLOR_ENTRY of foreground colour + +
+ +
Return value: Set colour space (at present only CSPACE_RGB), or -1 (invalid +subfunction number). +
  +
Availability: As of NVDI 5.00. +
  +
Group: Inquire functions +
  +
See also: Binding +
  + +
+ +

7.6.44 Bindings for vqt_fg_color

+ + + + + + + + + +
C: int32_t vqt_fg_color( int16_t handle, COLOR_ENTRY *fg_color ); +
  +
Binding: +
  +
int32_t vqt_fg_color( int16_t handle, COLOR_ENTRY *fg_color )
+{
+   contrl[0] = 202;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   fg_color = intout [2..5];
+   return ( int32_t intout [0]  );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]202 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]0 # entry in intin
contrl+8contrl[4]6 # entry in intout
contrl+10contrl[5]0 # Sub-opcode
contrl+12contrl[6]handle
intoutintout[0..1]color_space
intout+4intout[2..5]fg_color
+
+ + +
+ +

7.6.45 vqt_fontheader

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire Speedo header information« - Obtain information +about a Speedo font. +
  +
Opcode: 232 +
  +
Syntax: void vqt_fontheader ( int16_t handle, int8_t *buffer, int8_t +*tdf_name ); +
  +
Description: The call vqt_fontheader copies the header of the current Speedo +font file into buffer and returns a pointer to the TDF file. +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
buffer Font header +
tdf_name Name and path of the TDF file + +
+ +
Notes: The buffer should have a size of 1 kbyte, as the +header size depends on the font and extensions of the font format. +tdf_name should point to a buffer of at least 128 bytes into +which the full pathname of the font's TDF file will be copied. +
  +
If the selected (vector) font is not a Speedo font (TrueType, +...) the VDI tries to create a virtual header with the important +information. +
  +
You should consider that each vqt_fontheader call can lead to +several disk accesses (depending on the font format) - if a user has +installed 300 or more fonts (which can happen very easily if you use high +quality fonts with a lot of font styles), this will take a few +seconds. If necessary, save font information and load (and update) it +when your program is started. +
  +
Return value: The function does not return a result. +
  +
Availability: As of SpeedoGDOS 4.00, and from NVDI 3.00 onwards. +
  +
Group: Inquire functions +
  +
See also: Binding   vqt_fontinfo   Make-up of the font-header +
  + +
+ +

7.6.46 Bindings for vqt_fontheader

+ + + + + + + + + +
C: void vqt_fontheader ( int16_t handle, int8_t *buffer, int8_t +*tdf_name ); +
  +
Binding: +
  +
void vqt_fontheader (int16_t handle, int8_t *buffer,
+                     int8_t *tdf_name)
+{
+   intin[0..1] = buffer;
+
+   contrl[0] = 232;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   tdf_name[0..n-1] = intout[0..n-1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]232 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]2 # Entry in intin
contrl+8contrl[4]n # Entry in intout
contrl+12contrl[6]handle
intinintin[0..1]buffer
intoutintout[0..n-1]tdf_name[0..n-1]
+
+ + +
+ +

7.6.47 vqt_fontinfo

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire current face information« - Obtain information about +the current font. +
  +
Opcode: 131 +
  +
Syntax: void vqt_fontinfo ( int16_t handle, int16_t *minADE, int16_t +*maxADE, int16_t *distances, int16_t *maxwidth, int16_t *effects ); +
  +
Description: The call vqt_fontinfo returns information about the current +font. +
  +

+
The function is passed the following parameters: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
minADE Minimum character index +
maxADE Maximum character index +
distances[0] Distance of bottom line to baseline +
distances[1] Distance of descent line to baseline +
distances[2] Distance of half line to baseline +
distances[3] Distance of ascent line to baseline +
distances[4] Distance of top line to baseline +
max_width Maximum character cell width +
effects[0] Additional character width due to text effects +
effects[1] Left offset of skewed text +
effects[2] Right offset of skewed text + +
+ +
Note: Special effects and enlargement are taken into +account. With skewed text (pseudo-italic) the slope is best considered +as a right and a left offset value. The right offset value is the +horizontal distance between the character position (left end of +baseline) to the plumb-line (drop-down) point on the baseline from the +top right corner of the bounding box; similarly, the left offset value +is the distance from the character position to the plumb-line point +from the baseline to where it would meet the bottom left corner of the +character's bounding box. +
  +
The components minADE and maxADE represent the +first and last character of the font respectively. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all drivers. +
  +
Group: Inquire functions +
  +
See also: Binding   vst_effects   ASCII table +
  + +
+ +

7.6.48 Bindings for vqt_fontinfo

+ + + + + + + + + +
C: void vqt_fontinfo ( int16_t handle, int16_t *minADE, int16_t +*maxADE, int16_t *distances, int16_t *maxwidth, int16_t *effects ); +
  +
Binding: +
  +
void vqt_fontinfo (int16_t handle, int16_t *minADE,
+                   int16_t *maxADE, int16_t *distances,
+                   int16_t *maxwidth, int16_t *effects)
+{
+   contrl[0] = 131;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *minADE    = intout[0];
+   *maxADE    = intout[1];
+   *max_width = ptsout[0];
+
+   distances[0] = ptsout[1];
+   distances[1] = ptsout[3];
+   distances[2] = ptsout[5];
+   distances[3] = ptsout[7];
+   distances[4] = ptsout[9];
+
+   effects[0] = ptsout[2];
+   effects[1] = ptsout[4];
+   effects[2] = ptsout[6];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]131 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]5 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]2 # Entry in intout
contrl+12contrl[6]handle
intoutintout[0]minADE
intout+2intout[1]maxADE
ptsoutptsout[0]maxwidth
ptsout+2ptsout[1]distances[0]
ptsout+4ptsout[2]effects[0]
ptsout+6ptsout[3]distances[1]
ptsout+8ptsout[4]effects[1]
ptsout+10ptsout[5]distances[2]
ptsout+12ptsout[6]effects[2]
ptsout+14ptsout[7]distances[3]
ptsout+16ptsout[8]0
ptsout+18ptsout[9]distances[4]
+
+ + +
+ +

7.6.49 vqt_f_extent

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire outline font text extent« - Obtain the length of a +string in a vector font. +
  +
Opcode: 240 +
  +
Syntax: void vqt_f_extent ( int16_t handle, int8_t *string, int16_t +*extent ); +
  +
Description: The call vqt_f_extent adds the character widths of a string of +text in a vector font, working to a precision of 1/65536 pixels, and +returns the bounding box needed to enclose a text string (in pixels). +The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
string Character string +
extent[0] X-coordinate, and +
extent[1] Y-coordinate of the bottom left corner +
extent[2] X-coordinate, and +
extent[3] Y-coordinate of the bottom right corner +
extent[4] X-coordinate, and +
extent[5] Y-coordinate of the top right corner +
extent[6] X-coordinate, and +
extent[7] Y-coordinate of the top left corner + +
+ +
Note: Unlike vqt_extent, this function also respects +possible kerning values, and takes the remainders generated by outline +fonts into account, so providing far more accurate results. +
  +
Attention: This function does not return the bounding +box of the string. It adds only the advance widths of the characters. +You should use this function to determine the position of the text +cursor. If you would like to use it to determine the maximum size of +the redraw area you should add the maximum character width the +leftmost and rightmost coordinates of the box (if the text is skewed +you should also add the skewing offset). To determine a more exact +bounding box you should call vqt_real_extent. +
  +
Important: If the text is rotated by 90, 180 or 270 +degrees, this function works as senselessly as vqt_extent: It changes +the reference point of the coordinate system. In all other cases it +works as you would expect it to. +
  +
As of NVDI 3 it is recommended to use the function +vqt_real_extent instead. +
  +
Return value: The function does not return a result. +
  +
Availability: As of SpeedoGDOS 4.00 and from NVDI 3.00 onwards. +
  +
Group: Inquire functions +
  +
See also: Binding   vqt_extent   SpeedoGDOS   NVDI +
  + +
+ +

7.6.50 Bindings for vqt_f_extent

+ + + + + + + + + +
C: void vqt_f_extent ( int16_t handle, int8_t *string, int16_t +*extent ); +
  +
Binding: +
  +
void vqt_f_extent (int16_t handle, int8_t *string,
+                   int16_t *extent)
+{
+   intin[0..n-1] = string[0..n-1];
+
+   contrl[0] = 240;
+   contrl[1] = 0;
+   contrl[3] = n;
+   contrl[6] = handle;
+
+   vdi ();
+
+   extent[0..7] = ptsout[0..7];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]240 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]4 # Entry in ptsout
contrl+6contrl[3]n # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+12contrl[6]handle
intinintin[0..n-1]string[0..n-1]
ptsoutptsout[0..7]extent[0..7]
+
+ + +
+ +

7.6.51 vqt_get_table

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Get character mapping table« - Obtain address of the +character transformation table. +
  +
Opcode: 254 +
  +
Syntax: void vqt_get_table( int16_t handle, int32_t *map ); +
  +
Description: The call vqt_get_table obtains the addresses of the +transformation table that maps the Atari character set to the +Bitstream and PostScript character indices. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
map Address where the character allocation table is to be found. +The table consists of seven fields. Each has a size of 224 int16_t +WORDS for the ASCII characters 32-255. +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTable
1Master mapping
2Bitstream International Character Set
3Bitstream International Symbol Set
4Bitstream Dingbats Set
5PostScript Text Set
6PostScript Symbol Set
7PostScript Dingbats Set
+
+ + +
+ +
Note: This information can be useful as some vector +fonts may contain characters that are not present in the normal Atari +character set. +
  +
Return value: The function does not return a result. +
  +
Availability: As of SpeedoGDOS 4.00. +
  +
Group: Inquire functions +
  +
See also: Binding   GDOS   SpeedoGDOS   v_gtext +
  + +
+ +

7.6.52 Bindings for vqt_get_table

+ + + + + + + + + +
C: void vqt_get_table ( int16_t handle, int32_t *map ); +
  +
Binding: +
  +
void vqt_get_table ( int16_t handle, int32_t *map )
+{
+   contrl[0] = 254;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   map = intout[0..1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]254 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]2 # Entry in intout
contrl+12contrl[6]handle
intoutintout[0..1]map
+
+ + +
+ +

7.6.53 vqt_justified

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire justified graphics text« - Obtain offsets for text +characters from a reference point. +
  +
Opcode: 132 +
  +
Syntax: void vqt_justified ( int16_t handle, int16_t x, int16_t y, +int8_t *string, int16_t length, int16_t word_space, int16_t +char_space, int16_t *offsets ); +
  +
Description: The call vqt_justified obtains for each character of a graphics +text string the X- and Y-offsets from a given reference point. The +following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
x X-coordinate, and +
y Y-coordinate of the reference point for text alignment +
string Pointer to the character string +
length Text length in pixels (ref. to X-axis) +
word_space Inter-word spaces: + + + + + + +
   0 = Do not stretch +
<> 0 = Stretch + +
+ +
char_space Inter-character spaces: + + + + + + +
   0 = Do not stretch +
<> 0 = Stretch + +
+ +
offsets Contains the X- and Y-offsets for each character in text string + +
+ +
Return value: The function does not return a result. +
  +
Availability: PC-GEM as of Version 2.0. +
  +
Group: Inquire functions +
  +
See also: Binding +
  + +
+ +

7.6.54 Bindings for vqt_justified

+ + + + + + + + + +
C: void vqt_justified ( int16_t handle, int16_t x, int16_t y, +int8_t *string, int16_t length, int16_t word_space, int16_t +char_space, int16_t *offsets ); +
  +
Binding: +
  +
void vqt_justified (int16_t handle, int16_t x, int16_t y,
+                    int8_t *string, int16_t length,
+                    int16_t word_space, int16_t char_space,
+                    int16_t *offsets)
+{
+   int16_t i;
+
+   intin[0] = word_space;
+   intin[1] = char_space;
+
+   ptsin[0] = x;
+   ptsin[1] = y;
+   ptsin[2] = length;
+   ptsin[3] = 0;
+
+   i = 0;
+   while (string[i++])
+      ;
+
+   contrl[0] = 132;
+   contrl[1] = 2;
+   contrl[3] = i;
+   contrl[6] = handle;
+   pooff = offsets;
+
+   vdi ();
+
+   pooff = ptsout;
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]132 # Function Opcode
contrl+2contrl[1]2 # Entry in ptsin
contrl+4contrl[2]n # Entry in ptsout
contrl+6contrl[3]2+n # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+12contrl[6]handle
intinintin[0]word_space
intin+2intin[1]char_space
intin+4intin[2]string[0..n+1]
ptsinptsin[0]x
ptsin+2ptsin[1]y
ptsin+4ptsin[2]length
ptsin+6ptsin[3]0
ptsoutptsout[...]offsets[...]
+
+ + +
+ +

7.6.55 vqt_name

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire face name and index« - Obtain the name and short +description of a font. +
  +
Opcode: 130 +
  +
Syntax: int16_t vqt_name ( int16_t handle, int16_t element_num, int8_t +*name ); +
  +
Description: The call vqt_name obtains the name and ID of a specified font +face. The folowing apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
element_num Number of the font +
name Name of the font as up to 32 characters long text string + +
+ +
Note: The element name[32] contains the value 0 +if the font in question is a pixel font, and the value 1 if it is an +outline (vector) font (from SpeedoGDOS 4.0) +
  +
In GEM/5, this function returns nothing for font index 0 or +1; for other indices, the font scaler is used to return data. A good +test for a GEM/5 VDI would be to do a vqt_name on font 1, and +see if it returned any values - if it did not, GEM/5 is running. +
  +
From NVDI 3 onwards there is an extended version of this function. +
  +
Return value: The function returns the ID of the font. +
  +
Availability: In all TOS versions, as of SpeedoGDOS 4.0 in extended +version. +
  +
Group: Inquire functions +
  +
See also: Binding   vst_load_fonts   vst_name   vst_font   vqt_xfntinfo +
  + +
+ +

7.6.56 Bindings for vqt_name

+ + + + + + + + + +
C: int16_t vqt_name ( int16_t handle, int16_t element_num, int8_t +*name ); +
  +
Binding: +
  +
int16_t vqt_name (int16_t handle, int16_t element_num,
+                  int8_t *name)
+{
+   int16_t tmp;
+
+   intin[0] = element_num;
+
+   contrl[0] = 130;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   for (tmp = 0; tmp < 32; tmp++)
+      name[tmp] = intout[tmp+1];
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]130 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]1 # Entry in intin
contrl+8contrl[4]33 # Entry in intout
contrl+12contrl[6]handle
intinintin[0]element_num
intoutintout[0]Return Value
intout+2intout[1..32]name[0..31]
+
+ + +
+ +

7.6.57 vqt_name_and_id

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire face name and ID by name« - Search for font ID and +name. +
  +
Opcode: 230 (Sub-Opcode 100) +
  +
Syntax: int16_t vqt_name_and_id ( int16_t handle, int16_t font_format, +int8_t *font_name, int8_t *ret_name ); +
  +
Description: The call vqt_name_and_id searches for a font with a given name +and format. The following apply: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
font_format Desired font format: + + + + + + + + + + + + +
1 = Bitmap font +
2 = Speedo font +
4 = TrueType font +
8 = Type-1 font + +
+ +
font_name Desired font name +
ret_name Name of the found font + +
+ +
Note: Missing or extra spaces in the font name are +ignored. +
  +
Return value: The function returns the ID of the font, or the value 0 if no +corresponding font could be found. +
  +
Availability: As of NVDI Version 3.02 onwards. +
  +
Group: Inquire functions +
  +
See also: Binding   vst_name +
  + +
+ +

7.6.58 Bindings for vqt_name_and_id

+ + + + + + + + + +
C: int16_t vqt_name_and_id ( int16_t handle, int16_t font_format, +int8_t *font_name, int8_t *ret_name ); +
  +
Binding: +
  +
int16_t vqt_name_and_id (int16_t handle, int16_t font_format,
+                         int8_t *font_name, int8_t *ret_name)
+{
+   intin[0] = font_format;
+   intin[1..n] = font_name[0..n-1];
+
+   contrl[0] = 230;
+   contrl[1] = 0;
+   contrl[3] = n;
+   contrl[5] = 100;
+   contrl[6] = handle;
+
+   vdi ();
+
+   ret_name[0..m-1] = intout[1..m];
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]230 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]n # Entry in intin
contrl+8contrl[4]m # Entry in intout
contrl+10contrl[5]100 # Sub-opcode
contrl+12contrl[6]handle
intinintin[0]font_format
intin+2intin[1..n]font_name[0..n-1]
intoutintout[0]Return Value
intout+2intout[1..m]ret_name[0..m-1]
+
+ + +
+ +

7.6.59 vqt_pairkern

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire pair kerning information« - Obtain adjustment vector +for character pairs when using pair kerning. +
  +
Opcode: 235 +
  +
Syntax: void vqt_pairkern ( int16_t handle, int16_t ch1, int16_t ch2, +fix31 *x, fix31 *y ); +
  +
Description: The call vqt_pairkern obtains the adjustment vector for two +adjacent characters if pair kerning is in use. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
ch1 Left member, and +
ch2 Right member of character pair +
x X-adjustment in 1/65536 pixels +
y Y-adjustment in 1/65536 pixels + +
+ +
Note: If you want call vqt_pairkern from Pure C, you +might have to write your own binding, because some releases of the +PCGEMLIB return ptsout[0-3] instead of intout[0-3]. +
  +
Return value: The function does not return a result. +
  +
Availability: As of SpeedoGDOS 4.0 and from NVDI 3.00 onwards. +
  +
Group: Inquire functions +
  +
See also: Binding   vqt_trackkern   SpeedoGDOS   NVDI   Kerning   Track +kerning   Pair kerning +
  + +
+ +

7.6.60 Bindings for vqt_pairkern

+ + + + + + + + + +
C: void vqt_pairkern ( int16_t handle, int16_t ch1, int16_t ch2, +fix31 *x, fix31 *y ); +
  +
Binding: +
  +
void vqt_pairkern (int16_t handle, int16_t ch1, int16_t ch2,
+                   fix31 *x, fix31 *y)
+{
+   intin[0] = ch1;
+   intin[1] = ch2;
+
+   contrl[0] = 235;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *x = intout[0..1];
+   *y = intout[2..3];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]235 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]2 # Entry in intin
contrl+8contrl[4]4 # Entry in intout
contrl+12contrl[6]handle
intinintin[0]ch1
intin+2intin[1]ch2
intoutintout[0..1]x
intout+4intout[2..3]y
+
+ + +
+ +

7.6.61 vqt_real_extent

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire real outline font text extent« - Obtain the bounding +box for an outline text. +
  +
Opcode: 240 (Sub-Opcode 4200) +
  +
Syntax: void vqt_real_extent ( int16_t handle, int16_t x, int16_t y, +int8_t *string, int16_t *extent ); +
  +
Description: The call vqt_real_extent obtains the minimum bounding box +(possibly a quadrilateral rather than a rectangle) for an outline +(vector) text, taking all text attributes into account. +
  +
Example: +
  +

+
The function is passed the following parameters: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
handleWorkstation identifier
xX-coordinate, and
yY-coordinate for start of text output
stringText string to be output
extent[0]X-coordinate, and
extent[1]Y-coordinate of bottom left corner
extent[2]X-coordinate, and
extent[3]Y-coordinate of bottom right corner
extent[4]X-coordinate, and
extent[5]Y-coordinate of top right corner
extent[6]X-coordinate, and
extent[7]Y-coordinate of top left corner
+
+ +
Note: This function respects all text effects, rotation, +skewing, pair kerning, track kerning, characters which extend beyond +the em square, and horizontal as well as vertical alignment. +
  +
Return value: The function does not return a result. +
  +
Availability: As of NVDI Version 3.00. +
  +
Group: Inquire functions +
  +
See also: Binding   vqt_extent   vqt_f_extent +
  + +
+ +

7.6.62 Bindings for vqt_real_extent

+ + + + + + + + + +
C: void vqt_real_extent ( int16_t handle, int16_t x, int16_t y, +int8_t *string, int16_t *extent ); +
  +
Binding: +
  +
void vqt_real_extent (int16_t handle, int16_t x, int16_t y,
+                      int8_t *string, int16_t *extent)
+{
+   intin[0..n-1] = string[0..n-1];
+   ptsin[0] = x;
+   ptsin[1] = y;
+
+   contrl[0] = 240;
+   contrl[1] = 1;
+   contrl[3] = n;
+   contrl[5] = 4200;
+   contrl[6] = handle;
+
+   vdi ();
+
+   extent[0..7] = ptsout[0..7];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]240 # Function Opcode
contrl+2contrl[1]E # Entry in ptsin
contrl+4contrl[2]4 # Entry in ptsout
contrl+6contrl[3]n # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]4200 # Sub-opcode
contrl+12contrl[6]handle
intinintin[0..n-1]string[0..n-1]
ptsinptsin[0]x
ptsin+2ptsin[1]y
ptsoutptsout[0..7]extent[0..7]
+
+ + +
+ +

7.6.63 vqt_trackkern

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire track kerning information« - Obtain adjustment +vector for fonts with track kerning. +
  +
Opcode: 234 +
  +
Syntax: void vqt_trackkern ( int16_t handle, fix31 *x, fix31 *y ); +
  +
Description: The call vqt_trackkern obtains the adjustment vector per +character for fonts with track kerning. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
x X-adjustment in 1/65536 pixels +
y Y-adjustment in 1/65536 pixels + +
+ +
Return value: The function does not return a result. +
  +
Availability: As of SpeedoGDOS 4.0 and as of NVDI 3.00 +
  +
Group: Inquire functions +
  +
See also: Binding   GDOS   SpeedoGDOS   vqt_pairkern +
  + +
+ +

7.6.64 Bindings for vqt_trackkern

+ + + + + + + + + +
C: void vqt_trackkern ( int16_t handle, fix31 *x, fix31 *y ); +
  +
Binding: +
  +
void vqt_trackkern (int16_t handle, fix31 *x, fix31 *y)
+{
+   contrl[0] = 234;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *x = intout[0..1];
+   *y = intout[2..3];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]234 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]4 # Entry in intout
contrl+12contrl[6]handle
intoutintout[0..1]x
intout+4intout[2..3]y
+
+ + +
+ +

7.6.65 vqt_width

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire character cell width« - Obtain the width of a +character cell. +
  +
Opcode: 117 +
  +
Syntax: int16_t vqt_width ( int16_t handle, int8_t character, int16_t +*cell_width, int16_t *left_delta, int16_t *right_delta ); +
  +
Description: The call vqt_width obtains the horizontal extent of a specified +character in the current font as well as of the character cell, in +pixels. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
character Index of specified character +
cell_width Cell width of the character +
left_delta Left character alignment delta +
right_delta Right character alignment delta + +
+ +
Note: Special effects and rotation do not apply. +
  +
If one applies this function to a vector font, one only obtains +the rounded-off step-size for the specified character as +remainders are not taken into account. This step-size can be used +only in connection with v_gtext. If one tries to apply these +step-sizes to v_ftext, then wrong character positions will be +calculated. It is recommended you use vqt_advance instead when +inquiring about outline fonts. +
  +

+
To check whether a font is monospaced or proportional, you +should use vqt_ext_name which returns extended font information (under +NVDI only). +
  +
The values in left_delta and right_delta +correspond exactly to the positions in the Horizontal offset table. If +this specification is missing in the font header (which is the case +for most bitmap fonts), then the return will be 0. +
  +
Return value: The function returns the index of character, or -1 if +an error has occurred. +
  +
Availability: Supported by all drivers. +
  +
Group: Inquire functions +
  +
See also: Binding   vst_effects +
  + +
+ +

7.6.66 Bindings for vqt_width

+ + + + + + + + + +
C: int16_t vqt_width ( int16_t handle, int8_t character, int16_t +*cell_width, int16_t *left_delta, int16_t *right_delta ); +
  +
Binding: +
  +
int16_t vqt_width (int16_t handle, int8_t character,
+                   int16_t *cell_width, int16_t *left_delta,
+                   int16_t *right_delta)
+{
+   intin[0] = character;
+
+   contrl[0] = 117;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *cell_width  = ptsout[0];
+   *left_delta  = ptsout[2];
+   *right_delta = ptsout[4];
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]117 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]3 # Entry in ptsout
contrl+6contrl[3]1 # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+12contrl[6]handle
intinintin[0]character
intoutintout[0]Return Value
ptsoutptsout[0]cell_width
ptsout+2ptsout[1]0
ptsout+4pstout[2]left_delta
ptsout+6ptsout[3]0
ptsout+8ptsout[4]right_delta
ptsout+10ptsout[5]0
+
+ + +
+ +

7.6.67 vqt_xfntinfo

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire extended font information« - Obtain extended +information about a font. +
  +
Opcode: 229 (Opcode 0) +
  +
Syntax: int16_t vqt_xfntinfo ( int16_t handle, int16_t flags, int16_t +id, int16_t index, XFNT_INFO *info ); +
  +
Description: The call vqt_xfntinfo obtains information about a font as +specified in flags. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
flags Desired information as bit-vector: + + + + + + + + + + + + + + + + + + + + + + + + +
Bit-0 = Return the full font name (font_name) +
Bit-1 = Return the name of the family (family_name) +
Bit-2 = Return the style name (style_name) +
Bit-3 = Return the file name (file_name1) +
Bit-4 = Return the 2nd optional file name (file_name2) +
Bit-5 = Return the 3rd optional file name (file_name3) +
Bit-8 = Return the available point sizes (without enlargement) (pt_cnt, +pt_sizes) +
Bit-9 = Return the available point sizes (with enlargement) (pt_cnt, +pt_sizes) + +
+ +
id Font ID, or 0 for the currently set font +
index Index of the font, or 0 if the ID is already in use +
info Address of the information structure + +
+ +
Note: If index is a non-zero value, vqt_xfntinfo +searches for the correspoding font and returns the requested +information. If index is zero, vqt_xfntinfo searches for the +font specified by id. If index and id are +zero, this function returns information about the current font. +
  +
Bit 8 and 9 of flags differ in their function only with +bitmap fonts. If bit 8 is set, the returned point sizes are those that +are present without enlargement. If bit 9 is set, then the returned +point sizes are those that are enlarged. +
  +
Before you call this function, you have to set the length of the +structure in the element size. +
  +
Return value: The function returns the requested information in a XFNT_INFO +structure. +
  +
Availability: As of NVDI 3.02 +
  +
Group: Inquire functions +
  +
See also: Binding   vqt_name +
  + +
+ +

7.6.68 Bindings for vqt_xfntinfo

+ + + + + + + + + +
C: int16_t vqt_xfntinfo ( int16_t handle, int16_t flags, int16_t +id, int16_t index, XFNT_INFO *info ); +
  +
Binding: +
  +
int16_t vqt_xfntinfo (int16_t handle, int16_t flags,
+                      int16_t id, int16_t index,
+                      XFNT_INFO *info)
+{
+   intin[0] = flags;
+   intin[1] = id;
+   intin[2] = index;
+   intin[3..4] = info;
+
+   contrl[0] = 229;
+   contrl[1] = 0;
+   contrl[3] = 5;
+   contrl[5] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[1] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]229 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]5 # Entry in intin
contrl+8contrl[4]3 # Entry in intout
contrl+10contrl[5]0
contrl+12contrl[6]handle
intinintin[0]flags
intin+2intin[1]id
intin+4intin[2]index
intin+6intin[3..4]info
intoutintout[0]font_format
intout+2intout[1]font_id
intout+4intout[2]index
+
+ + +
+ +

7.6.69 vq_cellarray

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire cell array« - Obtain information about a colour +table displayed on-screen. +
  +
Opcode: 27 +
  +
Syntax: void vq_cellarray ( int16_t handle, int16_t *pxyarray, int16_t +row_length, int16_t num_rows, int16_t *el_used, int16_t *rows_used, +int16_t *status, int16_t *colarray ); +
  +
Description: The call vq_cellarray provides information about the definition +of a colour selection cell array. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
pxyarray[0] X-coordinate, and +
pxyarray[1] Y-coordinate of top left corner, +
pxyarray[2] X-coordinate, and +
pxyarray[3] Y-coordinate of bottom right corner of a VDI format +rectangle +
row_length Row length in colour index array +
num_rows Number of rows in colour index array +
el_used Number of elements used per row +
rows_used Number of columns used in the colour index array +
status + + + + + + +
0 = No error, operation successful +
1 = The colour values for some pixels could not be determined + +
+ +
colarray Colour index array that contains the colour information +row-by-row, or -1 if the colour index for the specified region could +not be obtained + +
+ +
Note: The function is not available on all +devices. +
  +
Return value: The function does not return a result. +
  +
Availability: Not supported by any known drivers. +
  +
Group: Inquire functions +
  +
See also: Binding   v_cellarray +
  + +
+ +

7.6.70 Bindings for vq_cellarray

+ + + + + + + + + +
C: void vq_cellarray ( int16_t handle, int16_t *pxyarray, int16_t +row_length, int16_t num_rows, int16_t *el_used, int16_t *rows_used, +int16_t *status, int16_t *colarray ); +
  +
Binding: +
  +
void vq_cellarray (int16_t handle, int16_t *pxyarray,
+                   int16_t row_length, int16_t num_rows,
+                   int16_t *el_used, int16_t *rows_used,
+                   int16_t *status, int16_t *colarray)
+{
+   ptsin[0..3] = pxarray[0..3];
+
+   contrl[0] = 27;
+   contrl[1] = 2;
+   contrl[3] = 0;
+   contrl[6] = handle;
+   contrl[7] = row_length;
+   contrl[8] = num_rows;
+
+   vdi ();
+
+   *el_used   = contrl[9];
+   *rows_used = contrl[10];
+   *status    = contrl[11];
+
+   colarray[0..n-1] = intout[0..n-1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]27 # Function Opcode
contrl+2contrl[1]2 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]n # Entry in intout
contrl+12contrl[6]handle
contrl+14contrl[7]row_length
contrl+16contrl[8]num_rows
contrl+18contrl[9]el_used
contrl+20contrl[10]rows_used
contrl+22contrl[11]status
ptsinptsin[0..3]pxyarray[0..3]
intoutintout[0..n-1]colarray[0..n-1]
+
+ + +
+ +

7.6.71 vq_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire colour representation« - Obtain the RGB intensities +for a particular colour index. +
  +
Opcode: 26 +
  +
Syntax: int16_t vq_color ( int16_t handle, int16_t color_index, int16_t +set_flag, int16_t *rgb ); +
  +
Description: The call vq_color obtains the set RGB colour intensities of the +colour palette. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
color_index Colour register index to be inquired +
set_flag Flag for colour intensity: + + + + + + +
0 = Return colour values last requested by user at vs_color +
1 = Return realized colour values + +
+ +
rgb_in[0] Red colour intensity (in tenths of a percent, 0-1000) +
rgb_in[1] Green colour intensity (in tenths of a percent, 0-1000) +
rgb_in[2] Blue colour intensity (in tenths of a percent, 0-1000) + +
+ +
Notes: Set and actually realized colour intensities can +be different on systems using a CLUT if the number of available colour +steps is too small. +
  +
Example: If a monitor only offers two intensities, then +its range divides into part-ranges 0..500 and 501..1000. The +actual intensity can however only be 0 or 1000; no matter +which number is selected from the range from 501 to 1000, the +intensity of 1000 will be set every time; hence a set intensity can +have the value of 623, say, and the actual one the value 1000. +
  +
With direct RGB (no CLUT), usually the actually set intensity as +well as the intensity passed by the user will be returned, as the +number of gradations is large enough. +
  +
Some colour printer drivers do not allow modifying the colour of +each register. There is a simple test for checking if the driver +permits you to change index colours: +
  +
    +
  • Call vq_color with set_flag value of 0 and save the +return +
  • +
  • Call vs_color to modify that colour index by a significant +value +
  • +
  • Call vq_color with set_flag value of 0 and then compare +it with what you set +
  • +
  • Restore old value +
  • +
  • If equivalent values are returned, you can modify each colour +index +
  • +
+ +
Return value: The function returns -1 if the specified index is out of range +for the device; otherwise it does not return a result. +
  +
Availability: Supported by all drivers. +
  +
Group: Inquire functions +
  +
See also: Binding   vs_color   vs_color2 +
  + +
+ +

7.6.72 Bindings for vq_color

+ + + + + + + + + +
C: int16_t vq_color ( int16_t handle, int16_t color_index, int16_t +set_flag, int16_t *rgb ); +
  +
Binding: +
  +
int16_t vq_color (int16_t handle, int16_t color_index,
+               int16_t set_flag, int16_t *rgb)
+{
+   intin[0] = color_index;
+   intin[1] = set_flag;
+
+   contrl[0] = 26;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   rgb[0] = intout[1];
+   rgb[1] = intout[2];
+   rgb[2] = intout[3];
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]26 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]2 # Entry in intin
contrl+8contrl[4]4 # Entry in intout
contrl+12contrl[6]handle
intinintin[0]color_index
intin+2intin[1]set_flag
intoutintout[0]Return Value
intout+2intout[1..3]rgb[0..2]
+
+ + +
+ +

7.6.73 vq_devinfo

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire device status info« - Inquire status of the output +device. +
  +
Opcode: 248 +
  +
Syntax: void vq_devinfo ( int16_t handle, int16_t device, int16_t +*dev_open, int8_t *file_name, int8_t *device_name ); +
  +
Description: The call vq_devinfo checks whether a driver for a given output +device has been installed. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
device Device ID (0..99) +
dev_open Driver: + + + + + + +
0 = is closed +
1 = is already open + +
+ +
file_name Filename of the driver +
device_name Readable device name + +
+ +
Note: If the filename is empty, there is no driver with +the given ID device. +
  +
The function reports both the name of the driver (say +"XVGA256.SYS") as well as the 'readable' name ("VGA 256 +colours"). +
  +
Return value: The function does not return a result. +
  +
Availability: As of NVDI 3.00. +
  +
Group: Inquire functions +
  +
See also: Binding   vq_ext_devinfo   vqt_devinfo   GDOS   SpeedoGDOS   +NVDI +
  + +
+ +

7.6.74 Bindings for vq_devinfo

+ + + + + + + + + +
C: void vq_devinfo ( int16_t handle, int16_t device, int16_t +*dev_open, int8_t *file_name, int8_t *device_name ); +
  +
Binding: +
  +
void vq_devinfo (int16_t handle, int16_t device,
+                 int16_t *dev_open, int8_t *file_name,
+                 int8_t *device_name)
+{
+   intin[0] = device;
+
+   contrl[0] = 248;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *dev_open = ptsout[0];
+   dev_name[0..p]    = ptsout[1..p-1];
+   file_name[0..i-1] = intout[0..i-1]
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]248 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]p # Entry in ptsout
contrl+6contrl[3]1 # Entry in intin
contrl+8contrl[4]i # Entry in intout
contrl+12contrl[6]handle
intinintin[0]device
intoutintout[0..i-1]file_name[0..i-1]
ptsoutptsout[0]dev_open
ptsout+2ptsout[1..p-1]device_name[0..p-2]
+
+ + +
+ +

7.6.75 vq_extnd

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Extended inquire function« - Obtain additional information +about a workstation. +
  +
Opcode: 102 +
  +
Syntax: void vq_extnd ( int16_t handle, int16_t owflag, int16_t +*work_out ); +
  +
Description: The call vq_extnd obtains additional information about the +capabilities of a workstation. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
owflag Type of information: + + + + + + +
0 = Return v_opnwk/v_opnvwk values +
1 = Return additional information + +
+ +
work_out[0] Type of screen: + + + + + + + + + + + + + + + +
0 = No screen +
1 = Separate alpha and graphic controllers and separate video +memory +
2 = Separate alpha and graphic controllers with shared video memory +
3 = Common video and graphic controller with separate video memory +
4 = Common alpha and graphic controller with shared video memory +
(Note: All know devices return either 0 or 4) + +
+ +
work_out[1] Number of colour levels (refers to the CLUT) +
work_out[2] Supported text effects (same bitmask as with vst_effects) +
work_out[3] Raster scaling flag: + + + + + + +
0 = Scaling impossible +
1 = Scaling possible + +
+ +
work_out[4] Number of planes +
work_out[5] CLUT flag (0 = no CLUT, 1 = CLUT or pseudo-CLUT (TrueColor) +exists) +
work_out[6] Performance factor (number of 16*16 raster operations per +second) +
work_out[7] Contour fill capability (v_contourfill) + + + + + + +
0 = Not supported +
1 = Contour fill supported + +
+ +
work_out[8] Text rotation ability: + + + + + + + + + +
0 = None +
1 = In steps of 90 degrees only +
2 = In steps of 1/10 degree + +
+ +
work_out[9] Number of writing modes available +
work_out[10] Highest available input levels: + + + + + + + + + +
0 = None +
1 = Request +
2 = Request and sample + +
+ +
work_out[11] Text alignment capability flag: + + + + + + +
0 = Not available +
1 = Available + +
+ +
work_out[12] Inking capability flag: + + + + + + +
0 = Device cannot ink +
1 = Device can ink + +
+ +
work_out[13] Rubberbanding capability flag: + + + + + + + + + +
0 = No rubberbanding +
1 = Capable of rubberband lines +
2 = Capable of rubberband lines and rectangles + +
+ +
work_out[14] Maximum number of input vertices for v_pline, v_pmarker, +v_fillarea, or -1 (unlimited) +
work_out[15] Maximum number of intin arguments, or -1 (no limit) +
work_out[16] Number of mouse buttons +
work_out[17] Line types for wide lines: + + + + + + +
0 = No +
1 = Yes + +
+ +
work_out[18] Number of writing modes available for wide lines. +
work_out[19] Clipping flag: + + + + + + +
0 = Clipping off +
1 = Clipping on + +
+ +
Only PC-GEM as of version 2.0 and NVDI. +
work_out[20] + + + + + + + + + + + + +
0 = No extended precision pixel size information is available +
1 = Pixel size is in 1/10 microns +
2 = Pixel size is in 1/100 microns +
3 = Pixel size is in 1/1000 microns + +
+ +
work_out[21] Pixel width in 1/10, 1/100 or 1/1000 microns, like work_out[20] +
work_out[22] Pixel height in 1/10, 1/100 or 1/1000 microns, like +work_out[20] +
work_out[23] Horizontal resolution in dpi +
work_out[24] Vertical resolution in dpi +
work_out[25] Flag to indicate whether bit-image files on printers can be +rotated by the driver (as of PC-GEM/3): + + + + + + +
0 = No +
1 = Rotation in 0,90,180,270 degrees possible + +
+ +
work_out[26] + +
work_out[27] Address of the screen buffer (1/4 of the screen area) that is +used with AES functions (only as of PC-GEM/3) +
work_out[28] Bezier flag: + + + +
Bit-1 = Driver has no Bezier capability (0), or driver has Bezier +capability (1) + +
+ +
This information is available as of PC-GEM/3 as well as under +NVDI +
work_out[30] Raster flag: + + + + + + + + + +
Bit-0 = 1 vrt/vro_cpyfm is capable of scaling bitmaps +
Bit-1 = 1 New raster function present, as of NVDI 5.00 +
Bit-2 = 1 New vr_clip_rects_xxx clipping function present, as of +NVDI 5.02 + +
+ +
work_out[32] + + + +
Bit-0 = 1 New style color routines (NVDI 5.xx) + +
+ +
work_out[40] Non-printable left margin in pixels (printers/plotters) +
work_out[41] Non-printable top margin in pixels (printers/plotters) +
work_out[42] Non-printable right margin in pixels (printers/plotters) +
work_out[43] Non-printable bottom margin in pixels (printers/plotters) +
work_out[44] Page size (printers etc.): +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
0 =Use default setting
1 =DIN A3
2 =DIN A4
3 =DIN A5
4 =DIN B5
16 =Letter Size
17 =Half Size
18 =Legal Size
19 =Double Size
20 =Broadsheet size
+
+ +
work_out[45] Top left X-coordinate, and +
work_out[46] Top left Y-coordinate of the clipping rectangle +
work_out[47] Bottom right X-coordinate, and +
work_out[48] Bottom right Y-coordinate of the clipping rectangle +
work_out[49]   +
:   +
:   +
work_out[56] Reserved, contain zero + +
+ +
Notes: The stated assignments of the work_out +arrays apply for the case that the extended information +(owflag = 1) is to be obtained. If work_out[20] holds a +non-zero value, work_out[21..24] and work_out[40..43] will contain +extended information about pixel size and non-printable margins. +
  +
The non-printable margins are normally returned only by printer +drivers. They permit an application to centre documents, or to provide +the user with a true likeness of the printed page in which the +marginal borders in the document are depicted. (The region returned by +v_opnwk in work_out[0/1] is the printable area.) +
  +
If a driver returns more precise pixel sizes, this information +should be used to calculate the position of graphic objects for +printing. In worst case using the values from v_opnwk in work_out[3/4] +can result in a positioning inaccuracy of 2 or 3 mm (for output on a +DIN A4 page). +
  +
Atari originaly misdocumented the workout[5] (CLUT) +element, reversing the values. The Falcon 030 and some third-party +TrueColor boards return the correct values, but some older boards may +not. +
  +
Return value: The function returns no direct function result. +
  +
Availability: Supported by all drivers. +
  +
Group: Inquire functions +
  +
See also: Binding   v_contourfill   vswr_mode   v_pline   v_pmarker   +v_fillarea   v_opnwk +
  + +
+ +

7.6.76 Bindings for vq_extnd

+ + + + + + + + + +
C: void vq_extnd ( int16_t handle, int16_t owflag, int16_t +*work_out ); +
  +
Binding: +
  +
void vq_extnd (int16_t handle, int16_t owflag,
+               int16_t *work_out)
+{
+   intin[0] = owflag;
+
+   contrl[0] = 102;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   work_out[0..44]  = intout[0..44];
+   work_out[45..56] = ptsout[0..11];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]102 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]6 # Entry in ptsout
contrl+6contrl[3]1 # Entry in intin
contrl+8contrl[4]45 # Entry in intout
contrl+12contrl[6]handle
intinintin[0]owflag
intoutintout[0..44]work_out[0..44]
ptsoutptsout[0..11]work_out[45..56]
+
+ + +
+ +

7.6.77 vq_ext_devinfo

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire extended device status info« - Obtain information +about a GDOS driver. +
  +
Opcode: 248 (Sub-Opcode 4242) +
  +
Syntax: int16_t vq_ext_devinfo ( int16_t handle, int16_t device, +int16_t *dev_exists, int8_t *file_path, int8_t *file_name, int8_t +*name ); +
  +
Description: The call vq_ext_devinfo obtains extended information about a +GDOS driver. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
device Device ID (0..99) +
dev_exists Driver: +
+
+ + + + + + + + +
0 =No driver
<>0 =Driver exists
+
+ +
file_path Pointer to the file path +
file_name Pointer to the file name +
name Pointer to the device name + +
+ +
Return value: The function returns the value 0 if the driver has not been +opened yet, and <>0 if it is already open. +
  +
Availability: As of NVDI version 3.00 +
  +
Group: Inquire functions +
  +
See also: Binding   vq_devinfo   vq_devinfo   GDOS   SpeedoGDOS   NVDI +
  + +
+ +

7.6.78 Bindings for vq_ext_devinfo

+ + + + + + + + + +
C: int16_t vq_ext_devinfo ( int16_t handle, int16_t device, +int16_t *dev_exists, int8_t *file_path, int8_t *file_name, int8_t +*name ); +
  +
Binding: +
  +
int16_t vq_ext_devinfo (int16_t handle, int16_t device,
+                        int16_t *dev_exists,
+                        int8_t *file_path,
+                        int8_t *file_name, int8_t *name)
+{
+   intin[0] = device;
+   intin[1..2] = file_path;
+   intin[3..4] = file_name;
+   intin[5..6] = name;
+
+   contrl[0] = 248;
+   contrl[1] = 0;
+   contrl[3] = 7;
+   contrl[5] = 4242;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *dev_exists = intout[0];
+   return ( intout[1] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]248 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]7 # Entry in intin
contrl+8contrl[4]2 # Entry in intout
contrl+10contrl[5]4242 # Sub-opcode
contrl+12contrl[6]handle
intinintin[0]device
intin+2intin[1..2]file_path
intin+6intin[3..4]file_name
intin+10intin[5..6]name
intoutintout[0]dev_exists
intout+2intout[1]Return Value
+
+ + +
+ +

7.6.79 vq_ptsinsz

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: +
  +
Opcode: 238 +
  +
Syntax: void vq_ptsinsz ( void ); +
  +
Description: Some GDOS ask the driver how the size from his PTSIN array is. +
  +
Return value: Size of the PTSIN array. +
  +
Availability: Some GDOS +
  +
Group: Inquire functions +
  +
See also: Binding +
  + +
+ +

7.6.80 Bindings for vq_ptsinsz

+ + + +
+ +

7.6.81 vq_scrninfo

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire screen information« - Return more exact +specification about the screen format. +
  +
Opcode: 102 (Sub-Opcode 1, Opcode 2) +
  +
Syntax: void vq_scrninfo ( int16_t handle, int16_t *work_out ); +
  +
Description: The call vq_scrninfo returns additional information about the +device-specific screen format. This function is useful for programs +which: +
  +
    +
  • Build rasters (also in TrueColor) and want to copy them with +vro_cpyfm to the screen +
  • +
  • Save rasters (e.g. XIMGs) +
  • +
  • Support genlock (overlay) +
  • +
+ +
Return value: All information is passed to the outside with the +work_out array: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
work_out[0]: Workstation format: + + + + + + + + + + + + +
0: Interleaved planes, word-wide (ATARI graphic) +
1: Whole planes (standard format) +
2: Packed pixels +
-1: Unknown format + +
+ +
work_out[1]: Supported CLUT: + + + + + + + + + +
0: No CLUT (e.g. TTM 194) +
1: Hardware CLUT +
2: Software CLUT (HiColor or TrueColor) + +
+ +
work_out[2]: Number of planes (bits) per pixel +
work_out[3]:   +
work_out[4]: Number of colours, or 0L (more than 2*10^31 colours) +
work_out[5]: Line width in bytes (as of EdDI 1.1) +
work_out[6]: + +
work_out[7]: Address of the bitmap (as of EdDI 1.1) +
work_out[8]: Number of bits for red intensity +
work_out[9]: Number of bits for green intensity +
work_out[10]: Number of bits for blue intensity +
work_out[11]: Number of bits for alpha channel +
work_out[12]: Number of bits for genlock +
work_out[13]: Number of unused bits +
work_out[14]: Bit order (as of EdDI 1.1) +
2-256 colours: + + + +
Bit-0 = Usual bit order + +
+ +
32768 colours (16 planes): + + + + + + + + + +
Bit-0 = Usual bit order: 1 bit overlay (or unused), 5 bits red, 5 bits +green, 5 bits blue +
(xrrrrrgg-gggbbbbb) +
Bit-1 = Falcon bit order: 5 bits red, 5 bits green, 1 bit overlay, 5 +bits blue +
(rrrrrggg-ggxbbbbb) +
Bit-7 = Swapped bytes (Intel order) e.g. Crazy Dots +
(gggbbbbb-xrrrrrgg) + +
+ +
65536 colours (16 planes): + + + + + + +
Bit-0 = Usual bit order: 5 bits red, 6 bits green, 5 bits blue +
(rrrrrggg-gggbbbbb) +
Bit-7 = Swapped bytes (Intel order) e.g. Crazy Dots 2 +
(gggbbbbb-rrrrrggg) + +
+ +
16.7 million colours (24 planes): + + + + + + +
Bit-0 = Usual bit order: 8 bits red, 8 bits green, 8 bits blue +
(rrrrrrrr-gggggggg-bbbbbbbb) +
Bit-7 = Swapped bytes (Intel order) +
(bbbbbbbb-gggggggg-rrrrrrrr) + +
+ +
16.7 million colours (32 planes): + + + + + + +
Bit-0 = Usual bit order, 8 bits overlay or unused, 8 bits red, 8 bits +green, 8 bits blue +
(xxxxxxxx-rrrrrrrr-gggggggg-bbbbbbbb) +
Bit-7 = Swapped bytes (Intel order) +
(bbbbbbbb-gggggggg-rrrrrrrr-xxxxxxxx) + +
+ + +
+ +
If a hardware CLUT (work_out[1] == 1) exists: +
  + + + +
work_out[16..271]: Pixel value of the corresponding VDI colour index (0-255) + +
+ +
HiColor or TrueColor: +
  + + + + + + + + + + + + + + + + + + + + + +
work_out[16..31]: Association of bit number in the pixel and bit of the red +intensity +
work_out[32..47]: Association of bit number in the pixel and bit of the green +intensity +
work_out[48..63]: Association of bit number in the pixel and bit of the blue +intensity +
work_out[64..79]: Association of bit number for alpha channel +
work_out[80..95]: Association of bit numbers for genlock +
work_out[96..127]: Bit numbers of unused bits +
work_out[128..271]: Reserved (0) + +
+ +
Availability: As of EdDI-Version 1.00. +
  +
Group: Inquire functions +
  +
Note: Enhancer.prg as distributed with NVDI 2.5x, which simulates +this call in case no NVDI is present, sometimes copies 273 values. It +is therefore advisable to ensure that work_out has enough space for +273 values. +
  +
See also: Binding   Example   XIMG format   Raster formats   NVDI   Bitmap format for printer drivers +
  + +
+ +

7.6.82 Bindings for vq_scrninfo

+ + + + + + + + + +
C: void vq_scrninfo ( int16_t handle, int16_t *work_out ); +
  +
Binding: +
  +
void vq_scrninfo (int16_t handle, int16_t *work_out)
+{
+   intin[0] = 2;
+
+   contrl[0] = 102;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[5] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   work_out[0..272] = intout[0..272];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]102 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]1 # Entry in intin
contrl+8contrl[4]272 # Entry in intout
contrl+10contrl[5]1 # Sub-opcode
contrl+12contrl[6]handle
intinintin[0]2 # Opcode
intoutintout[0..272]work_out[0..272]
+
+ + +
+ +

7.6.83 Examples for vq_scrninfo

+

256 colors on the Falcon: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
work_outValueDescription
00Interleaved planes, (words)
11Hardware CLUT
288 bits per pixel
3/4256256 simultaneously displayable colors
5xxxxWidth of the bitmap in bytes (since EdDI 1.1)
6/7xxxxLAddress of the bitmap (since EdDI 1.1)
86CLUT has 6 bits for red intensity
96CLUT has 6 bits for green intensity
106CLUT has 6 bits for blue intensity
110No alpha channel
120No genlock
130No unused bits
141Usual bit order (since EdDI 1.1)
   
160Pixel value for VDI color index 0
17255Pixel value for VDI color index 1
182Pixel value for VDI color index 2
...... 
27115Pixel value for VDI color index 255
+
+ +

HiColor on the Falcon: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
work_outValueDescription
02Packed pixels
12HiColor (TrueColor:-) => pseudo CLUT
21616 bits per pixel
3/43276832768 colors
5xxxxWidth of the bitmap in bytes (since EdDI 1.1)
6/7xxxxLAddress of the bitmap (since EdDI 1.1)
855 bits for red intensity
955 bits for green intensity
1055 bits for blue intensity
110No alpha channel
1211 bit for genlock (overlay)
130No unused bits
142Falcon bit order (rrrrrggg-ggxbbbbb ;since EdDI 1.1)
   
1611Bit 0 of the red intensity (least significant bit)
  Is bit 11 of the pixel
1712Bit 1 of the red intensity ist bit 12 of the pixel
1813...
1914...
2015Bit 4 of the red intensity (most significant bit)
  Is bit 15 of the pixel
21..31-1Bits are not used
   
   
326Bit 0 of the green intensity (least significant bit)
Is bit 6 of the pixel
337Bit 1 of the green intensity ist bit 7 of the pixel
348...
359...
3610Bit 4 of the green intensity (most significant bit)
  Is bit 10 of the pixel
37..37-1Bits are not used
   
   
480Bit 0 of the blue intensity (least significant bit)
Is bit 0 of the pixel
491Bit 1 of the blue intensity is bit 1 of the pixel
502...
513...
524Bit 4 of the blue intensity (most significant bit)
  Is bit 4 of the pixel
53..63-1Bits are not used
   
   
64..79-1No alpha channel
   
   
805Bit for genlock/overlay
81..95-1Not used
   
   
96..127-1No unused bits
+
+ +

HiColor on a VGA graphic card (e.g. Crazy Dots): +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
work_outValueDescription
02Packed pixels
12HiColor => pseudo CLUT
21616 bits per pixel
3/43276832768 colors
5xxxxWidth of the bitmap in bytes (since EdDI 1.1)
6/7xxxxLAddress of the bitmap (since EdDI 1.1)
855 bits for red intensity
955 bits for green intensity
1055 bits for blue intensity
110No alpha channel
121No genlock/overlay
1301 unused bits
14129Swapped bit order (gggbbbbb-xrrrrrgg; since EdDI 1.1)
   
162Bit 0 of the red intensity (least significant bit)
  Is bit 2 of the pixel
173Bit 1 of the red intensity is bit 3 of the pixel
184...
195...
206Bit 4 of the red intensity (most significant bit)
  Is bit 6 of the pixel
21..31-1Bits are not used
   
   
3213Bit 0 of the green intensity (least significant bit)
  Is bit 13 of the pixel
3314Bit 1 of the green intensity is bit 14 of the pixel
3415...
350...
361Bit 4 of the green intensity (most significant bit)
  Is bit 1 of the pixel
37..37-1Bits are not used
   
   
488Bit 0 of the blue intensity (least significant bit)
  Is bit 8 of the pixel
499Bit 1 of the blue intensity is bit 9 of the pixel
5010...
5111...
5212Bit 4 of the green intensity (most significant bit)
  Is bit 12 of the pixel
53..63-1Bits are not used
   
   
64..79-1No alpha channel
   
   
80..95-1No genlock/overlay
   
   
967Bit 7 is an unused bit
97..127-1No further unused bits
+
+ +

Note: The output in work_out[5..7/14] only exist as of +EdDI 1.1. Check the cookie version before you use them. +

+

See also: vq_scrninfo   Raster formats   NVDI +

+

7.6.84 v_create_driver_info

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: Inquire info about a driver. +
  +
Opcode: 180 +
  +
Syntax: DRV_INFO *v_create_driver_info( int16_t handle, int16_t +driver_id ); +
  +
Description: The call v_create_driver_info returns information about device +drivers. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
device_id Number of the device driver + +
+ +
Return value: The function returns a pointer to a DRV_INFO structure, or 0L. +
  +
Availability: NVDI 5 +
  +
Group: Inquire functions +
  +
See also: Binding +
  + +
+ +

7.6.85 Bindings for v_create_driver_info

+ + + + + + + + + +
C: DRV_INFO *v_create_driver_info( int16_t handle, int16_t +driver_id ); +
  +
Binding: +
  +
DRV_INFO *v_create_driver_info( int16_t handle,
+                                int16_t driver_id )
+{
+  int16_t save_conf;
+
+  intin[0] = driver_id;
+
+  contrl[0] = 180;
+  contrl[1] = 0;
+  contrl[3] = 1;
+  contrl[5] = 0;
+  contrl[6] = handle;
+
+  contrl[2] = 0;
+  contrl[4] = 0;
+
+  save_conf = disable_nvdi_errors();
+  vdi ();
+  enable_nvdi_errors( save_conf );
+
+  if ( contrl[4] >= 2 )
+    return(*(DRV_INFO **) &intout[0] );
+
+  return( 0L );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]180 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]1 # Entry in intin
contrl+8contrl[4]2 # Entry in intout
contrl+10contrl[5]0
contrl+12contrl[6]handle
intinintin[0]driver_id
intoutintout[0..1]Return-Wert
+
+ + +
+ +

7.6.86 v_delete_driver_info

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: Discard information about a driver. +
  +
Opcode: 181 +
  +
Syntax: int16_t v_delete_driver_info( int16_t handle, DRV_INFO +*drv_info ); +
  +
Description: The call v_delete_driver_info discards the information obtained +with v_create_driver_info. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
drv_info Pointer to the structure of v_create_driver_info + +
+ +
Return value: Unknown. +
  +
Availability: NVDI 5 +
  +
Group: Inquire functions +
  +
See also: Binding   v_create_driver_info +
  + +
+ +

7.6.87 Bindings for v_delete_driver_info

+ + + + + + + + + +
C: int16_t v_delete_driver_info( int16_t handle, DRV_INFO +*drv_info ); +
  +
Binding: +
  +
int16_t v_delete_driver_info( int16_t handle,
+                              DRV_INFO *drv_info )
+{
+  *(DRV_INFO **) &intin[0] = drv_info;
+
+  contrl[0] = 181;
+  contrl[1] = 0;
+  contrl[3] = 2;
+  contrl[5] = 0;
+  contrl[6] = handle;
+
+  vdi ();
+
+  return( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]181 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]2 # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+10contrl[5]0
contrl+12contrl[6]handle
intinintin[0..1]drv_info
+
+ + +
+ +

7.6.88 v_getbitmap_info

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Get character bitmap information« - Obtain placement +information about the bitmap of a vector character. +
  +
Opcode: 239 +
  +
Syntax: void v_getbitmap_info ( int16_t handle, int16_t ch, fix31 +*advx, fix31 *advy, fix31 *xoff, fix31 *yoff, int16_t *width, int16_t +*height, int16_t **bitmap ); +
  +
Description: The call v_getbitmap_info returns a pointer to the character's +bitmap and provides information about the character placement, size +and alignment. +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
ch Character to return info about +
advx X-advance in 1/65536 pixels +
advy Y-advance in 1/65536 pixels +
xoff X-offset in 1/65536 pixels +
yoff Y-offset in 1/65536 pixels +
width Bitmap width in pixels +
height Bitmap height in pixels +
bitmap Pointer to the bitmap + +
+ +
Notes: advx/y represent the offset vectors for +the correct placement of the next character. x/yoff are offset +vectors of the top left corner of the bitmap relative to the position +of the character cell, and are necessary because most bitmaps are +smaller than the character cell containing them. +
  +
To get reproducible output even without NVDI, any text effects +should be switched off. As the pointer to the bitmap points to the +character cache as a rule, one should copy the bitmap directly after +the call (tip: inhibit AES context switching with wind_update!) - +otherwise the pointer could be invalid already. +
  +
Additionally one should not call v_getbitmap_info for very large +characters (e.g. 300 pts or more), as these, depending on the cache +size, may not be capable of being built up completely; in this case +the bitmap contains only a part of the character. +
  +
You should not use this function to write your own text output +function - this function would not be faster than v_ftext and you +would not be able to do pair kerning. Use v_ftext! +
  +
Return value: The function does not return a result. +
  +
Availability: As of SpeedoGDOS 4.00 and as of NVDI 3.00. (The call also +existed in FSMGDOS but with a completely different calling format; +Atari changed it, as no FSMGDOS program utilized it at the time.) +
  +
Group: Inquire functions +
  +
See also: Binding   vst_effects   SpeedoGDOS   NVDI +
  + +
+ +

7.6.89 Bindings for v_getbitmap_info

+ + + + + + + + + +
C: void v_getbitmap_info ( int16_t handle, int16_t ch, fix31 +*advx, fix31 *advy, fix31 *xoff, fix31 *yoff, int16_t *width, int16_t +*height, int16_t **bitmap ); +
  +
Binding: +
  +
void v_getbitmap_info (int16_t handle, int16_t ch,
+                       fix31 *advx, fix31 *advy,
+                       fix31 *xoff, fix31 *yoff,
+                       int16_t *width, int16_t *height,
+                       int16_t **bitmap)
+{
+   intin[0] = ch;
+
+   contrl[0] = 239;
+   contrl[1] = 0;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *width  = intout[0];
+   *height = intout[1];
+   *advx   = intout[2..3];
+   *advy   = intout[4..5];
+   *xoff   = intout[6..7];
+   *yoff   = intout[8..9];
+   *bitmap = intout[10..11];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]239 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]1 # Entry in intin
contrl+8contrl[4]12 # Entry in intout
contrl+12contrl[6]handle
intinintin[0]ch
intoutintout[0]width
intout+2intout[1]height
intout+4intout[2..3]advx
intout+8intout[4..5]advy
intout+12intout[6..7]xoff
intout+16intout[8..9]yoff
intout+20intout[10..11]bitmap
+
+ + +
+ +

7.6.90 v_get_driver_info

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire extended device status info« - Obtain further +information about a device driver. +
  +
Opcode: -1 (Sub-Opcode 4) +
  +
Syntax: void v_get_driver_info ( int16_t device_id, int16_t +info_select, int8_t *info_string ); +
  +
Description: The call v_get_driver_info returns extended information about a +device driver and its fonts. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
device_id Number of the device driver +
info_select Depending on value of info_select one gets certain +information in info_string: + + + + + + + + + + + + + + + + + + + + + +
info_select info_string +
    +
1 Filename of the driver +
2 Designation of the device +
3 Add-on information, if present +
4 Font files of the device +
5 Patch address of the driver (e.g. printer port number) + +
+ + +
+ +
Return value: The function does not return a result. +
  +
Availability: GEM/3 +
  +
Group: Inquire functions +
  +
See also: Binding +
  + +
+ +

7.6.91 Bindings for v_get_driver_info

+ + + + + + + + + +
C: void v_get_driver_info ( int16_t device_id, int16_t +info_select, int8_t *info_string ); +
  +
Binding: +
  +
void v_get_driver_info ( int16_t device_id,
+                         int16_t info_select,
+                         int8_t *info_string )
+{
+   intin[0] = device_id;
+   intin[1] = info_select;
+
+   contrl[0] = -1;
+   contrl[1] = 0;
+   contrl[3] = 2;
+   contrl[5] = 4;
+   contrl[6] = 0;
+
+   vdi ();
+
+   if ( info_select != 5 )
+   {
+      bptr = (int8_t *) intout ;
+      for ( ii = 0; ii < contrl[ 4 ]; ii ++ )
+         *info_string++ = *bptr++ ;
+      *info_string = 0 ;
+   }
+   else
+      *(int16_t *)info_string = intout[ 0 ] ;
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]-1 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]2 # Entry in intin
contrl+8contrl[4]n # Entry in intout
contrl+10contrl[5]4 # Sub-opcode
contrl+12contrl[6]0
intinintin[0]device_id
intin+2intin[1]info_select
intoutintout[0..n-1]info_string
+
+ + +
+ +

7.6.92 v_read_default_settings

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Read default settings« - Obtain the default printer +settings. +
  +
Opcode: 182 (Subfunction 0) +
  +
Syntax: int16_t v_read_default_settings( int16_t handle, PRN_SETTINGS +*settings ); +
  +
Description: The call v_read_default_settings obtains the default settings +of the installed printer. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
settings Pointer to a structure of type PRN_SETTINGS + +
+ +
Return value: Returns 0 if there an error. +
  +
Availability: NVDI 5 +
  +
Group: Inquire functions +
  +
See also: Binding   v_write_default_settings +
  + +
+ +

7.6.93 Bindings for v_read_default_settings

+ + + + + + + + + +
C: int16_t v_read_default_settings( int16_t handle, PRN_SETTINGS +*settings ); +
  +
Binding: +
  +
int16_t v_read_default_settings( int16_t handle,
+                                 PRN_SETTINGS *settings )
+{
+  int16_t save_conf;
+
+  *(PRN_SETTINGS **) &intin[0] = settings;
+
+  contrl[0] = 182;
+  contrl[1] = 0;
+  contrl[3] = 2;
+  contrl[5] = 0;                 /* Subfunction 0 */
+  contrl[6] = handle;
+
+  contrl[2] = 0;
+  contrl[4] = 0;
+
+  save_conf = disable_nvdi_errors();
+  vdi ();
+  enable_nvdi_errors( save_conf );
+
+  if ( contrl[4] >= 1 )
+    return( intout[0] );
+
+  return( 0 );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]182 # Function Opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]2 # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+10contrl[5]0 # Sub-opcode
contrl+12contrl[6]handle
intinintin[0..1]settings
+
+ + +
+ +

7.6.94 v_write_default_settings

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Write default settings« - Set the default printer settings. +
  +
Opcode: 182 (Subfunction 1) +
  +
Syntax: int16_t v_write_default_settings( int16_t handle, PRN_SETTINGS +*settings ); +
  +
Description: The function v_write_default_settings sets the default printer +settings for the installed printer. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
settings Pointer to a structure of type PRN_SETTINGS + +
+ +
Return value: Returns 0 if there an error. +
  +
Availability: NVDI 5 +
  +
Group: Inquire functions +
  +
See also: Binding   v_read_default_settings +
  + +
+ +

7.6.95 Bindings for v_write_default_settings

+ + + + + + + + + +
C: int16_t v_write_default_settings( int16_t handle, PRN_SETTINGS +*settings ); +
  +
Binding: +
  +
int16_t v_write_default_settings( int16_t handle,
+                                  PRN_SETTINGS *settings )
+{
+  int16_t save_conf;
+
+  *(PRN_SETTINGS **) &intin[0] = settings;
+
+  contrl[0] = 182;
+  contrl[1] = 0;
+  contrl[3] = 2;
+  contrl[5] = 1;                  /* Subfucntion 1 */
+  contrl[6] = handle;
+
+  contrl[2] = 0;
+  contrl[4] = 0;
+
+  save_conf = disable_nvdi_errors();
+  vdi ();
+  enable_nvdi_errors( save_conf );
+
+  if ( contrl[4] >= 1 )
+    return( intout[0] );
+
+  return( 0 );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]182 # Function Opcode
contrl+2contrl[1]0 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]2 # entry in intin
contrl+8contrl[4]1 # entry in intout
contrl+10contrl[5]1 # Sub-opcode
contrl+12contrl[6]handle
intinintin[0..1]settings
+
+ + +
+ +

7.6.96 Make-up of the font-header

+

The font header returned by vqt_fontheader is built up as +follows: +

+
FH_FMVER    0      /* U   "D4.0" CR LF NULL NULL  8 bytes             */
+FH_FNTSZ    8      /* U   Font size (bytes) 4 bytes                   */
+FH_FBFSZ   12      /* U   Min. font buffer size (bytes) 4 bytes       */
+FH_CBFSZ   16      /* U   Min. char. buffer size (bytes) 2 bytes      */
+FH_HEDSZ   18      /* U   Header size (bytes) 2 bytes                 */
+FH_FNTID   20      /* U   Source font ID  2 bytes                     */
+FH_SFVNR   22      /* U   Source font version number  2 bytes         */
+FH_FNTNM   24      /* U   Source font full name  70 bytes             */
+FH_MDATE   94      /* U   Manufacturing date  10 bytes                */
+FH_LAYNM  104      /* U   Layout (character set) name  70 bytes       */
+FH_CPYRT  174      /* U   Copyright notice  78 bytes                  */
+FH_NCHRL  252      /* U   No. of char. indices in layout  2 bytes     */
+FH_NCHRF  254      /* U   Total character indices in font  2 bytes    */
+FH_FCHRF  256      /* U   Index of first char. in font  2 bytes       */
+FH_NKTKS  258      /* U   Number of kerning tracks in font 2 bytes    */
+FH_NKPRS  260      /* U   Number of kerning pairs in font 2 bytes     */
+FH_FLAGS  262      /* U   Font flags  1 byte:                         */
+                   /*       Bit 0: Extended mode if set,              */
+                                   Compact mode (default) if clear    */
+                   /*       Bit 1: Not used                           */
+                   /*       Bit 2: Not used                           */
+                   /*       Bit 3: Not used                           */
+                   /*       Bit 4: Not used                           */
+                   /*       Bit 5: Not used                           */
+                   /*       Bit 6: Not used                           */
+                   /*       Bit 7: Not used                           */
+
+FH_CLFGS  263      /* U   Classification flags  1 byte:               */
+                   /*       Bit 0: Italic                             */
+                   /*       Bit 1: Monospace                          */
+                   /*       Bit 2: Serif                              */
+                   /*       Bit 3: Display                            */
+                   /*       Bit 4: Reserved                           */
+                   /*       Bit 5: Reserved                           */
+                   /*       Bit 6: Reserved                           */
+                   /*       Bit 7: Reserved                           */
+
+FH_FAMCL  264      /* U   Family classification  1 byte:              */
+                   /*       0:  Don't care                            */
+                   /*       1:  Serif                                 */
+                   /*       2:  Sans serif                            */
+                   /*       3:  Monospace                             */
+                   /*       4:  Script or calligraphic                */
+                   /*       5:  Decorative                            */
+                   /*       6-255: Not used                           */
+
+FH_FRMCL  265      /* U   Font form classification  1 byte:           */
+                   /*       Bits 0-3 (Width type):                    */
+                   /*         0-3:   Reserved                         */
+                   /*         4:     Condensed                        */
+                   /*         5:     Reserved for 3/4 condensed       */
+                   /*         6:     Semi-condensed                   */
+                   /*         7:     Reserved for 1/4 condensed       */
+                   /*         8:     Normal                           */
+                   /*         9:     Reserved for 3/4 expanded        */
+                   /*        10:     Semi-expanded                    */
+                   /*        11:     Reserved for 1/4 expanded        */
+                   /*        12:     Expanded                         */
+                   /*        13-15:  Reserved                         */
+                   /*       Bits 4-7 (Weight):                        */
+                   /*         0:   Reserved                           */
+                   /*         1:   Thin                               */
+                   /*         2:   Ultralight                         */
+                   /*         3:   Extralight                         */
+                   /*         4:   Light                              */
+                   /*         5:   Book                               */
+                   /*         6:   Normal                             */
+                   /*         7:   Medium                             */
+                   /*         8:   Semibold                           */
+                   /*         9:   Demibold                           */
+                   /*         10:  Bold                               */
+                   /*         11:  Extrabold                          */
+                   /*         12:  Ultrabold                          */
+                   /*         13:  Heavy                              */
+                   /*         14:  Black                              */
+                   /*         15-16: Reserved                         */
+
+FH_SFNTN  266      /* U   Short font name  32 bytes                   */
+FH_SFACN  298      /* U   Short face (family) name  16 bytes          */
+FH_FNTFM  314      /* U   Font form (as above)  14 bytes              */
+FH_ITANG  328      /* U   Italic angle (1/256 deg clockw)  2 bytes    */
+FH_ORUPM  330      /* U   Number of ORUs per em  2 bytes              */
+FH_WDWTH  332      /* U   Width of word-space (ASCII 32)  2 bytes     */
+FH_EMWTH  334      /* U   Width of em-space  2 bytes                  */
+FH_ENWTH  336      /* U   Width of en-space  2 bytes                  */
+FH_TNWTH  338      /* U   Width of thin-space  2 bytes                */
+FH_FGWTH  340      /* U   Width of figure-space  2 bytes              */
+FH_FXMIN  342      /* U   Font-wide min. X coord.  2 bytes            */
+FH_FYMIN  344      /* U   Font-wide min. Y coord.  2 bytes            */
+FH_FXMAX  346      /* U   Font-wide max. X coord.  2 bytes            */
+FH_FYMAX  348      /* U   Font-wide max. Y coord.  2 bytes            */
+FH_ULPOS  350      /* U   Underline position  2 bytes                 */
+FH_ULTHK  352      /* U   Underline thickness  2 bytes                */
+FH_SMCTR  354      /* U   Small capitals transformation  6 bytes      */
+FH_DPSTR  360      /* U   Display superiors transformation  6 bytes   */
+FH_FNSTR  366      /* U   Footnote superiors transformation  6 bytes  */
+FH_ALSTR  372      /* U   Alpha superiors transformation  6 bytes     */
+FH_CMITR  378      /* U   Chemical inferiors transformation  6 bytes  */
+FH_SNMTR  384      /* U   Small numerators transformation  6 bytes    */
+FH_SDNTR  390      /* U   Small denominators transformation  6 bytes  */
+FH_MNMTR  396      /* U   Medium numerators transformation  6 bytes   */
+FH_MDNTR  402      /* U   Medium denominators transformation  6 bytes */
+FH_LNMTR  408      /* U   Large numerators transformation  6 bytes    */
+FH_LDNTR  414      /* U   Large denominators transformation  6 bytes  */
+                   /*     Transformation data format:                 */
+                   /*       Y position  2 bytes                       */
+                   /*       X scale (1/4096ths)  2 bytes              */
+                   /*       Y scale (1/4096ths)  2 bytes              */
+
+SIZE_FW FH_LDNTR + 6   /* Size of nominal font header                 */
+EXP_FH_METRES SIZE_FW  /* Offset to expansion field metric
+                          resolution (optional)                       */
+
+

See also: vqt_fontheader   Header for bitmap GDOS fonts   Vector fonts +

+

7.6.97 disable_nvdi_errors

+
int16_t disable_nvdi_errors ( void )
+{
+  int16_t save_conf;
+  NVDI_STRUC *p;
+
+  if ( get_cookie( 'NVDI', p ) )
+  {
+    save_conf = p->nvdi_config;
+    p->nvdi_config |= 2;
+    p->nvdi_config &= 0xFFBF;
+
+    return save_conf;
+  }
+
+  return 0;
+}
+
+

7.6.98 enable_nvdi_errors

+
void enable_nvdi_errors ( int16_t save_conf )
+{
+  NVDI_STRUC *p;
+
+  if ( get_cookie( 'NVDI', p ) )
+    p->nvdi_config = save_conf;
+
+  return;
+}
+
+
+ +Home +VDIVDI +Output functionsOutput functions +Input functionsInput functions + + diff --git a/en/vdi_main.html b/en/vdi_main.html new file mode 100644 index 000000000..1720ee04f --- /dev/null +++ b/en/vdi_main.html @@ -0,0 +1,50 @@ + + + + + +The documentation for TOS: VDI + + + + + + + + + +Home +Contents +SeedfillSeedfill +About the VDIAbout the VDI + +
+ +

7 VDI

+ +
+
+ +Home +Contents +SeedfillSeedfill +About the VDIAbout the VDI + + diff --git a/en/vdi_output.html b/en/vdi_output.html new file mode 100644 index 000000000..ca3ea3447 --- /dev/null +++ b/en/vdi_output.html @@ -0,0 +1,4604 @@ + + + + + +The documentation for TOS: Output functions + + + + + + + + + +Home +VDIVDI +Attribute functionsAttribute functions +Inquire functionsInquire functions + +
+ +

7.5 Output functions

+

This library contains a multitude of functions to enable output +of various types to be made on an output device. In all, the following +routines are available: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
v_arc Draws arcs of circles +
v_bar Draws filled rectangles +
v_bez Draws Bezier-splines +
v_bez_fill Draws and fills Bezier-splines +
v_cellarray Sets colours by coordinates of colour cells +
v_circle Draws filled circle +
v_contourfill Fills area up to a given limit +
v_ellarc Draws elliptical arc +
v_ellipse Draws filled ellipse +
v_ellpie Draws filled ellipse segment +
v_etext Outputs graphics text +
v_fillarea Fills specified area (polygon) +
v_ftext Outputs outline text (vector font) +
• v_ftext16 Outputs 16-bit Speedo characters +
v_ftext_offset Outputs outline text with offset vectors +
• v_ftext_offset16 Ditto, with 16-bit Speedo characters +
v_gtext Outputs graphics text +
v_justified Outputs justified text +
• v_mono_ftext No information available at present +
v_pieslice Draws filled circular segment +
v_pline Outputs a polyline +
v_pmarker Draws marker(s) +
v_rbox Draws rounded rectangle +
v_rfbox Draws filled, rounded rectangle +
vr_recfl Draws filled rectangle + +
+ +

Note: One can specify the type of output further with +the attribute functions. +

+

See also: VDI workstations   Style guidelines +

+

7.5.1 vr_recfl

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Fill rectangle« - Outputs a filled rectangle. +
  +
Opcode: 114 +
  +
Syntax: void vr_recfl ( int16_t handle, int16_t *pxyarray ); +
  +
Description: The call vr_recfl draws a filled rectangle. The following +apply: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
pxyarray[0] X-coordinate, and +
pxyarray[1] Y-coordinate of a rectangle corner point +
pxyarray[2] X-coordinate, and +
pxyarray[3] Y-coordinate of the diagonally opposite corner point + +
+ +
Note: The rectangle can be filled with all of the fill area attributes +except outline. +
  +
The function is not available on all output devices; in +case of doubt, therefore, it is better to fall back to the v_bar +routine. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all drivers. +
  +
Group: Output functions +
  +
See also: Binding   v_fillarea   vswr_mode   vs_color   vsf_interior   +vsf_style   vsf_color   vsf_udpat   vsf_perimeter +
  + +
+ +

7.5.2 Bindings for vr_recfl

+ + + + + + + + + +
C: void vr_recfl ( int16_t handle, int16_t *pxyarray ); +
  +
Binding: +
  +
void vr_recfl (int16_t handle, int16_t *pxyarray)
+{
+   ptsin[0..3] = pxyarray[0..3];
+
+   contrl[0] = 114;
+   contrl[1] = 2;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]114 # Function Opcode
contrl+2contrl[1]2 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]0 # entry in intin
contrl+8contrl[4]0 # entry in intout
contrl+12contrl[6]handle
ptsinptsin[0..3]pxyarray[0..3]
+
+ + +
+ +

7.5.3 v_arc

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Arc« - Draw a circular arc. +
  +
Opcode: 11 (GDP 2) +
  +
Syntax: void v_arc ( int16_t handle, int16_t x, int16_t y, int16_t +radius, int16_t begang, int16_t endang ); +
  +
Description: The call v_arc draws an arc of a circle. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
x X-coordinate, and +
y Y-coordinate of arc's center point +
radius Length of arc's radius in X-axis units +
begang Starting angle in tenths of degrees (0-3600) +
endang Ending angle in tenths of degrees (0-3600) + +
+ +
Note: The lines attributes, the writing mode as well as the +actual pixel size are taken into account for drawing. The +specification for the radius refers to the X-axis. The angle is +specified in 1/10 degrees in the anticlockwise direction. +
  +
             900
+            |
+            |
+            |
+   ---------+---------
+1800        |        0
+            |
+            |
+             2700
+
+
Return value: The function does not return a result. +
  +
Availability: Supported by all drivers. This function comprises one of the 10 +VDI GDP's (Generalized Drawing Primitives). Although all current +drivers support all GDP's, their availability is not guaranteed and +may vary. To check for a particular GDP refer to the table returned by +v_opnvwk or v_opnwk. +
  +
Group: Output functions +
  +
See also: Binding   vs_color   vswr_mode   vsl_type   vsl_width   +vsl_color   vsl_ends   vsl_udsty +
  + +
+ +

7.5.4 Bindings for v_arc

+ + + + + + + + + +
C: void v_arc ( int16_t handle, int16_t x, int16_t y, int16_t +radius, int16_t begang, int16_t endang ); +
  +
Binding: +
  +
void v_arc (int16_t handle, int16_t x, int16_t y,
+            int16_t radius, int16_t begang, int16_t endang)
+{
+   ptsin[0] = x;
+   ptsin[1] = y;
+   ptsin[2] = ptsin[3] = ptsin[4] = ptsin[5] = 0;
+   ptsin[6] = radius;
+   ptsin[7] = 0;
+
+   intin[0] = begang;
+   intin[1] = endgang;
+
+   contrl[0] = 11;
+   contrl[1] = 4;
+   contrl[3] = 2;
+   contrl[5] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]11 # Function Opcode
contrl+2contrl[1]4 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]2 # entry in intin
contrl+8contrl[4]0 # entry in intout
contrl+10contrl[5]2 GDP-number
contrl+12contrl[6]handle
intinintin[0]begang
intin+2intin[1]endgang
ptsinptsin[0]x
ptsin+2ptsin[1]y
ptsin+4ptsin[2..5]0
ptsin+12ptsin[6]radius
ptsin+14ptsin[7]0
+
+ + +
+ +

7.5.5 v_bar

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Bar« - Draw a filled rectangle. +
  +
Opcode: 11 (GDP 1) +
  +
Syntax: void v_bar ( int16_t handle, int16_t *pxyarray ); +
  +
Description: The call v_bar draws a filled rectangle. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
pxyarray[0] X-coordinate, and +
pxyarray[1] Y-coordinate of a rectangle corner point +
pxyarray[2] X-coordinate, and +
pxyarray[3] Y-coordinate of the diagonally opposite corner point + +
+ +
Note: The function can be used for the drawing of bar +graphs, for instance. The fill attributes as well as the writing mode will +be taken into account. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all drivers. This function comprises one of the 10 +VDI GDP's (Generalized Drawing Primitives). Although all current +drivers support all GDP's, their availability is not guaranteed and +may vary. To check for a particular GDP refer to the table returned by +v_opnvwk or v_opnwk. +
  +
Group: Output functions +
  +
See also: Binding   vswr_mode   vs_color   vsf_interior   vsf_style   +vsf_color   vsf_udpat   vsf_perimeter +
  + +
+ +

7.5.6 Bindings for v_bar

+ + + + + + + + + +
C: void v_bar ( int16_t handle, int16_t *pxyarray ); +
  +
Binding: +
  +
void v_bar (int16_t handle, int16_t *pxyarray)
+{
+   ptsin[0..3] = pxyarray[0..3];
+   contrl[0] = 11;
+   contrl[1] = 2;
+   contrl[3] = 0;
+   contrl[5] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]11 # Function Opcode
contrl+2contrl[1]2 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]0 # entry in intin
contrl+8contrl[4]0 # entry in intout
contrl+10contrl[5]1 GDP-number
contrl+12contrl[6]handle
ptsinptsin[0..3]pxyarray[0..3]
+
+ + +
+ +

7.5.7 v_bez

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Output Bezier« - Draw Bezier-spline path. +
  +
Opcode: 6 (Sub-Opcode 13) +
  +
Syntax: void v_bez ( int16_t handle, int16_t count, int16_t *xyarr, +int8_t *bezarr, int16_t *extent, int16_t *totpts, int16_t *totmoves ); +
  +
Description: The call v_bez draws a Bezier-spline curve path. The following +apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
count Number of vertices in path +
xyarr Coordinates of vertices +
bezarr Point-type flags: + + + + + + + + + +
Bit-0 = First point in a 4-point Bezier curve (2 anchor points points +and 2 control points) +
Bit-1 = Jump point - this point and the previous one will not be +connected; useful for drawing enclaves or exclaves +
Bit-2..7 = Reserved, set to 0 + +
+ +
extent Coordinates of the bounding box +
totpts Number of points in the resulting path +
totmoves Number of moves in the path + +
+ +
Note: The last point of a Bezier-segment can be the +first point of the next Bezier curve (or it can be a jump point). If +bit 0 of bezarr is 0, v_bez works like v_pline and draws a +straight line between two points. +
  +
Return value: The function does not return a result. +
  +
Availability: As of GEM/3 Release 3.1, SpeedoGDOS 4.00 onwards, and NVDI +2.10 onwards. +
  +
Group: Output functions +
  +
See also: Binding   v_bez_on   v_bez_off   v_bez_fill   v_bez_qual   +v_set_app_buff +
  + +
+ +

7.5.8 Bindings for v_bez

+ + + + + + + + + +
C: void v_bez ( int16_t handle, int16_t count, int16_t *xyarr, +int8_t *bezarr, int16_t *extent, int16_t *totpts, int16_t *totmoves ); +
  +
Binding: +
  +
void v_bez (int16_t handle, int16_t count, int16_t *xyarr,
+            int8_t *bezarr, int16_t *extent, int16_t *totpts,
+            int16_t *totmoves)
+{
+   ptsin[0..2n-1] = xyarr[0..2n-1];
+   intin[0..(n+1)/2-1] = bezarr[0..n-1]
+
+   contrl[0] = 6;
+   contrl[1] = n;
+   contrl[3] = (n+1)/2;
+   contrl[5] = 13;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *totpts   = intout[0];
+   *totmoves = intout[1];
+   extent[0..3] = ptsout[0..3];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]6 # Function Opcode
contrl+2contrl[1]n # entry in ptsin
contrl+4contrl[2]2 # entry in ptsout
contrl+6contrl[3](n+1)/2 # entry in intin
contrl+8contrl[4]6 # entry in intout
contrl+10contrl[5]13 Sub-Opcode
contrl+12contrl[6]handle
intinintin[0..(n+1)/2-1)]bezarr[0..n-1]
ptsinptsin[0..2n-1]xyarr[0..2n-1]
intoutintout[0]totpts
intout+2intout[1]totmoves
intout+4intout[2..5]Reserved
ptsoutptsout[0..3]extent[0..3]
+
+ +
Note: The binding for this function has to swap the +bytes in intin because unfortunately this function is compatible with +PC-GEM. => bezarr[0] is the low byte of intin[0], bezarr[1] is +the high byte of intin[0]... +
  + +
+ +

7.5.9 v_bez_fill

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Output filled Bezier« - Draw and fill Bezier-spline curve. +
  +
Opcode: 9 (Sub-Opcode 13) +
  +
Syntax: void v_bez_fill ( int16_t handle, int16_t count, int16_t +*xyarr, int8_t *bezarr, int16_t *extent, int16_t *totpts, int16_t +*totmoves ); +
  +
Description: The call v_bez_fill draws a Bezier-spline path and then fills +this. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
count Number of vertices in path +
xyarr[0..2n-1] Coordinates of vertices +
bezarr Point-type flags: + + + + + + + + + +
Bit-0 First point in a 4-point Bezier curve (two anchor points and +two control points) +
Bit-1 Jump point - this point and the previous one will not be +connected; useful for drawing enclaves or exclaves +
Bit-2..7 Reserved, set to 0 + +
+ +
extent[0..3] Coordinates of the bounding box +
totpts Number of points in the resulting path +
totmoves Number of moves in the path + +
+ +
Note: If bit 0 of bezarr is 0, v_bez_fill works +like v_fillarea and fills the area limited by a line between two +points. +
  +
Return value: The function does not return a result. +
  +
Availability: As of GEM/3 Release 3.1, SpeedoGDOS 4.00 onwards, and NVDI +2.10 onwards. +
  +
Group: Output functions +
  +
See also: Binding   v_bez_on   v_bez_off   v_bez   v_bez_qual   +v_set_app_buff   v_fillarea +
  + +
+ +

7.5.10 Bindings for v_bez_fill

+ + + + + + + + + +
C: void v_bez_fill ( int16_t handle, int16_t count, int16_t +*xyarr, int8_t *bezarr, int16_t *extent, int16_t *totpts, int16_t +*totmoves ); +
  +
Binding: +
  +
void v_bez_fill (int16_t handle, int16_t count,
+                 int16_t *xyarr, int8_t *bezarr,
+                 int16_t *extent, int16_t *totpts,
+                 int16_t *totmoves)
+{
+   ptsin[0..2n-1] = xyarr[0..2n-1];
+   intin[0..(n+1)/2-1] = bezarr[0..n-1];
+
+   contrl[0] = 9;
+   contrl[1] = n;
+   contrl[3] = (n+1)/2;
+   contrl[5] = 13;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *totpts   = intout[0];
+   *totmoves = intout[1];
+   extent[0..3] = ptsout[0..3];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]9 # Function Opcode
contrl+2contrl[1]n # Entry in ptsin
contrl+4contrl[2]2 # Entry in ptsout
contrl+6contrl[3](n+1)/2 # Entry in intin
contrl+8contrl[4]6 # Entry in intout
contrl+10contrl[5]13 # Sub-Opcode
contrl+12contrl[6]handle
intinintin[0..(n+1)/2-1]bezarr[0..n-1]
ptsinptsin[0..2n-1]xyarr[0..2n-1]
intoutintout[0]totpts
intout+2intout[1]totmoves
intout+4intout[2..5]reserviert
ptsoutptsout[0..3]extent[0..3]
+
+ +
Note: The binding for this function has to swap the +bytes in intin because unfortunately this function is compatible with +PC-GEM. => bezarr[0] is the low byte of intin[0], bezarr[1] is +the high byte of intin[0]... +
  + +
+ +

7.5.11 v_cellarray

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Cell array« - Colour setup of the screen by reference to +coordinates of coloured cells. +
  +
Opcode: 10 +
  +
Syntax: void v_cellarray ( int16_t handle, int16_t *pxyarray, int16_t +row_length, int16_t el_used, int16_t num_rows, int16_t wrt_mode, +int16_t *colarray ); +
  +
Description: The call v_cellarray allows the colour setup of the screen not +to depend on the objects being drawn, but on the coordinates of an +array of coloured cells instead. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
pxyarray Coordinates of the bounding rectangle +
row_length Line length of colour index array +
el_used Number of columns +
num_rows Number of lines +
wrt_mode Writing mode +
colarray Colour index array, contains the colour information for the +whole rectangle (line-by-line) + +
+ +
Note: The output device is subdivided into a number of +cells, where each cell has a colour allocated to it. If any output +occurs in the respective cell, then it will take on the colour +allocated to the cell. The function is not available on all +output devices. +
  +
Return value: The function does not return a result. +
  +
Availability: Not supported by any current drivers. +
  +
This function is not guaranteed available in any driver and +should therefore be avoided unless you are sure the driver you are +utilizing understands it. +
  +
Group: Output functions +
  +
See also: Binding   vswr_mode +
  + +
+ +

7.5.12 Bindings for v_cellarray

+ + + + + + + + + +
C: void v_cellarray ( int16_t handle, int16_t *pxyarray, int16_t +row_length, int16_t el_used, int16_t num_rows, int16_t wrt_mode, +int16_t *colarray ); +
  +
Binding: +
  +
void v_cellarray (int16_t handle, int16_t *pxyarray,
+                  int16_t row_length, int16_t el_used,
+                  int16_t num_rows,  int16_t wrt_mode,
+                  int16_t *colarray)
+{
+   int16_t n;
+
+   n = row_length * num_rows;
+
+   intin[0..n-1] = colarray[0..n-1];
+   ptsin[0..3] = pxyarray[0..3];
+
+   contrl[0]  = 10;
+   contrl[1]  = 2;
+   contrl[3]  = n;
+   contrl[6]  = handle;
+   contrl[7]  = row_length;
+   contrl[8]  = el_used;
+   contrl[9]  = num_rows;
+   contrl[10] = wrt_mode;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]10 # Function Opcode
contrl+2contrl[1]2 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]n # entry in intin
contrl+8contrl[4]0 # entry in intout
contrl+12contrl[6]handle
contrl+14contrl[7]row_length
contrl+16contrl[8]el_used
contrl+18contrl[9]num_rows
contrl+20contrl[10]wrt_mode
intinintin[0..n-1]colarray[0..n-1]
ptsinptsin[0..3]pxyarray[0..3]
+
+ +
Note: n is here the number of lines * number of columns +of the cell array. +
  + +
+ +

7.5.13 v_circle

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Circle« - Draw a circular area. +
  +
Opcode: 11 (GDP 4) +
  +
Syntax: void v_circle ( int16_t handle, int16_t x, int16_t y, int16_t +radius ); +
  +
Description: The call v_circle draws a filled circular area. The following +apply: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
x X-coordinate, and +
y Y-coordinate of center point of circle +
radius Radius in X-coordinate units + +
+ +
Note: The fill attributes, the writing mode as well as the pixel size +ratio will be respected. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all drivers. This function comprises one of the 10 +VDI GDP's (Generalized Drawing Primitives). Although all current +drivers support all GDP's, their availability is not guaranteed and +may vary. To check for a particular GDP refer to the table returned by +v_opnvwk or v_opnwk. +
  +
Group: Output functions +
  +
See also: Binding   vswr_mode   vs_color   vsf_interior   vsf_style   +vsf_color   vsf_udpat   vsf_perimeter +
  + +
+ +

7.5.14 Bindings for v_circle

+ + + + + + + + + +
C: void v_circle ( int16_t handle, int16_t x, int16_t y, int16_t +radius ); +
  +
Binding: +
  +
void v_circle (int16_t handle, int16_t x, int16_t y,
+               int16_t radius)
+{
+   ptsin[0]  = x;
+   ptsin[1]  = y;
+   ptsin[2]  = 0;
+   ptsin[3]  = 0;
+   ptsin[4]  = radius;
+   ptsin[5]  = 0;
+
+   contrl[0] = 11;
+   contrl[1] = 3;
+   contrl[3] = 0;
+   contrl[5] = 4;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]11 # Function Opcode
contrl+2contrl[1]3 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]0 # entry in intin
contrl+8contrl[4]0 # entry in intout
contrl+10contrl[5]4 GDP-number
contrl+12contrl[6]handle
ptsinptsin[0]x
ptsin+2ptsin[1]y
ptsin+4ptsin[2..3]0
ptsin+8ptsin[4]radius
ptsin+10ptsin[5]0
+
+ + +
+ +

7.5.15 v_contourfill

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Countour fill« - Fill a particular area up to a given limit. +
  +
Opcode: 103 +
  +
Syntax: void v_contourfill ( int16_t handle, int16_t x, int16_t y, +int16_t index ); +
  +
Description: The call v_contourfill fills, depending on the starting point, +a particular area. The following apply: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
x X-coordinate, and +
y Y-coordinate of starting point +
index Colour index of a colour + +
+ +
Notes: The fill area is confined by the screen edge, or +by a defined colour. +
  +
If the parameter index is negative, filling continues in +every direction until a pixel of a different colour to that in +x and y is encountered. If the parameter index +is positive, then the fill continues in all directions until the +colour in index is found. In TrueColor mode, with a positive +value for index, the fill spreads until a pixel is found with +the same colour as the 'virtual pen' index. +
  +
The current fill attributes will be respected during drawing. +
  +
Return value: The function returns no direct result. +
  +
Availability: The function is not available on all output devices, +therefore one should inquire with vq_extnd. +
  +
Group: Output functions +
  +
See also: Binding   vswr_mode   vs_color   vsf_interior   vsf_style   +vsf_color   vsf_udpat   vsf_perimeter +
  + +
+ +

7.5.16 Bindings for v_contourfill

+ + + + + + + + + +
C: void v_contourfill ( int16_t handle, int16_t x, int16_t y, +int16_t index ); +
  +
Binding: +
  +
void v_contourfill (int16_t handle, int16_t x, int16_t y,
+                    int16_t index)
+{
+   intin[0]  = index;
+   ptsin[0]  = x;
+   ptsin[1]  = y;
+   contrl[0] = 103;
+   contrl[1] = 1;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]103 # Function Opcode
contrl+2contrl[1]1 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]1 # entry in intin
contrl+8contrl[4]0 # entry in intout
contrl+12contrl[6]handle
intinintin[0]index
ptsinptsin[0]x
ptsin+2ptsin[1]y
+
+ + +
+ +

7.5.17 v_ellarc

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Elliptical arc« - Draw an elliptical arc segment. +
  +
Opcode: 11 (GDP 6) +
  +
Syntax: void v_ellarc ( int16_t handle, int16_t x, int16_t y, int16_t +xradius, int16_t yradius, int16_t begang, int16_t endang ); +
  +
Description: The call v_ellarc draws a segment of an elliptical arc. The +following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
x X-coordinate, and +
y Y-coordinate of arc's center point +
xradius Radius in X-axis units +
yradius Radius in Y-axis units +
begang Starting angle in tenths of degrees (0-3600) +
endang Ending angle in tenths of degrees (0-3600) + +
+ +
Note: The lines attributes and the writing mode will be respected during +drawing, but the pixel size ratio will be ignored. The angle is +specified in 1/10 degree and anticlockwise: +
  +
             900
+            |
+            |
+            |
+   ---------+---------
+1800        |        0
+            |
+            |
+             2700
+
+
Return value: The function does not return a result. +
  +
Availability: Supported by all drivers. This function comprises one of the 10 +VDI GDP's (Generalized Drawing Primitives). Although all current +drivers support all GDP's, their availability is not guaranteed and +may vary. To check for a particular GDP refer to the table returned by +v_opnvwk or v_opnwk. +
  +
Group: Output functions +
  +
See also: Binding   vs_color   vswr_mode   vsl_type   vsl_width   +vsl_color   vsl_ends   vsl_udsty +
  + +
+ +

7.5.18 Bindings for v_ellarc

+ + + + + + + + + +
C: void v_ellarc ( int16_t handle, int16_t x, int16_t y, int16_t +xradius, int16_t yradius, int16_t begang, int16_t endang ); +
  +
Binding: +
  +
void v_ellarc (int16_t handle, int16_t x, int16_t y,
+               int16_t xradius, int16_t yradius,
+               int16_t begang, int16_t endang)
+{
+   ptsin[0]  = x;
+   ptsin[1]  = y;
+   ptsin[2]  = xradius;
+   ptsin[3]  = yradius;
+
+   intin[0] = begang;
+   intin[1] = endang;
+
+   contrl[0] = 11;
+   contrl[1] = 2;
+   contrl[3] = 2;
+   contrl[5] = 6;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]11 # Function Opcode
contrl+2contrl[1]2 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]2 # entry in intin
contrl+8contrl[4]0 # entry in intout
contrl+10contrl[5]6 GDP-Nummer
contrl+12contrl[6]handle
intinintin[0]begang
intin+2intin[1]endang
ptsinptsin[0]x
ptsin+2ptsin[1]y
ptsin+4ptsin[2]xradius
ptsin+6ptsin[3]yradius
+
+ + +
+ +

7.5.19 v_ellipse

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Ellipse« - Draw a filled elliptical area. +
  +
Opcode: 11 (GDP 5) +
  +
Syntax: void v_ellipse ( int16_t handle, int16_t x, int16_t y, int16_t +xradius, int16_t yradius ); +
  +
Description: The call v_ellipse draws a filled elliptical area. The +following apply: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
x X-coordinate, and +
y Y-coordinate of center point of ellipse +
xradius Radius of X-axis +
yradius Radius of Y-axis + +
+ +
Note: The fill attributes and the writing mode will be respected during +drawing, but the pixel size ratio will be ignored. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all drivers. This function comprises one of the 10 +VDI GDP's (Generalized Drawing Primitives). Although all current +drivers support all GDP's, their availability is not guaranteed and +may vary. To check for a particular GDP refer to the table returned by +v_opnvwk or v_opnwk. +
  +
Group: Output functions +
  +
See also: Binding   vswr_mode   vs_color   vsf_interior   vsf_style   +vsf_color   vsf_udpat   vsf_perimeter +
  + +
+ +

7.5.20 Bindings for v_ellipse

+ + + + + + + + + +
C: void v_ellipse ( int16_t handle, int16_t x, int16_t y, int16_t +xradius, int16_t yradius ); +
  +
Binding: +
  +
void v_ellipse (int16_t handle, int16_t x, int16_t y,
+                int16_t xradius, int16_t yradius)
+{
+   ptsin[0]  = x;
+   ptsin[1]  = y;
+   ptsin[2]  = xradius;
+   ptsin[3]  = yradius;
+
+   contrl[0] = 11;
+   contrl[1] = 2;
+   contrl[3] = 0;
+   contrl[5] = 5;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]11 # Function Opcode
contrl+2contrl[1]2 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]0 # entry in intin
contrl+8contrl[4]0 # entry in intout
contrl+10contrl[5]5 GDP-number
contrl+12contrl[6]handle
ptsinptsin[0]x
ptsin+2ptsin[1]y
ptsin+4ptsin[2]xradius
ptsin+6ptsin[3]yradius
+
+ + +
+ +

7.5.21 v_ellpie

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Elliptical pie« - Draw a filled elliptical arc segment. +
  +
Opcode: 11 (GDP 7) +
  +
Syntax: void v_ellpie ( int16_t handle, int16_t x, int16_t y, int16_t +xradius, int16_t yradius, int16_t begang, int16_t endang ); +
  +
Description: The call v_ellpie draws a segment of a filled elliptical area +("pie segment"), such as those used for pie-slice graphics. +The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
x X-coordinate, and +
y Y-coordinate of center point of arc +
xradius Radius of X-axis +
yradius Radius of Y-axis +
begang Starting angle (in tenths of degrees 0-3600) +
endang Ending angle (in tenths of degrees 0-3600) + +
+ +
Note: The fill attributes and the writing mode will be respected during +drawing, but the pixel size ratio will be ignored. The angle is +specified in 1/10 degree and anticlockwise: +
  +
             900
+            |
+            |
+            |
+   ---------+---------
+1800        |        0
+            |
+            |
+             2700
+
+
Return value: The function does not return a result. +
  +
Availability: Supported by all drivers. This function comprises one of the 10 +VDI GDP's (Generalized Drawing Primitives). Although all current +drivers support all GDP's, their availability is not guaranteed and +may vary. To check for a particular GDP refer to the table returned by +v_opnvwk or v_opnwk. +
  +
Group: Output functions +
  +
See also: Binding   vswr_mode   vs_color   vsf_interior   vsf_style   +vsf_color   vsf_udpat   vsf_perimeter +
  + +
+ +

7.5.22 Bindings for v_ellpie

+ + + + + + + + + +
C: void v_ellpie ( int16_t handle, int16_t x, int16_t y, int16_t +xradius, int16_t yradius, int16_t begang, int16_t endang ); +
  +
Binding: +
  +
void v_ellpie (int16_t handle, int16_t x, int16_t y,
+               int16_t xradius, int16_t yradius,
+               int16_t begang, int16_t endang)
+{
+   ptsin[0]  = x;
+   ptsin[1]  = y;
+   ptsin[2]  = xradius;
+   ptsin[3]  = yradius;
+
+   intin[0] = begang;
+   intin[1] = endang;
+
+   contrl[0] = 11;
+   contrl[1] = 2;
+   contrl[3] = 2;
+   contrl[5] = 7;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]11 # Function Opcode
contrl+2contrl[1]2 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]2 # entry in intin
contrl+8contrl[4]0 # entry in intout
contrl+10contrl[5]7 GDP-number
contrl+12contrl[6]handle
intinintin[0]begang
intin+2intin[1]endang
ptsinptsin[0]x
ptsin+2ptsin[1]y
ptsin+4ptsin[2]xradius
ptsin+6ptsin[3]yradius
+
+ + +
+ +

7.5.23 v_etext

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »?« - Output text graphically at a given position. +
  +
Opcode: 11 (GDP 11) +
  +
Syntax: void v_etext( int16_t handle, int16_t x, int16_t y, const char +*string, int16_t *offsets); +
  +
Description: The call v_etext writes each character of a text string +relative to the specified starting position. It is used typically to +override the driver's default method of justification. This function +applies to printers and plotters only. +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
count Number of points +
x X-coordinate of starting position +
y Y-coordinate of starting position +
string Address of NULL-terminated text string +
offsets Address of int16_t array of position offsets. +
+
Each offset is a x,y pair of signed integers that +indicate the position of the next character in the string relative to +the starting position. The first offset pair affects the position of +the first character in the string. Some drivers ignore the y +component of each pair, in which case y is assumed to equal +zero. + +
+ +
Return value: The function does not return a result. +
  +
Availability: GEM/3 Release 3.1 +
  +
Group: Output functions +
  +
See also: Binding +
  + +
+ +

7.5.24 Bindings for v_etext

+ + + + + + + + + +
C: void v_etext( int16_t handle, int16_t x, int16_t y, int16_t +*string, int16_t *offsets); +
  +
Binding: +
  +
void v_etext( int16_t handle, int16_t x, int16_t y,
+              int16_t *string, int16_t *offsets)
+{
+   ptsin[0]  = x;
+   ptsin[1]  = y;
+   ptsin[2]  = offsets[0];
+   ptsin[3]  = offsets[2];
+   .
+   .
+   ptsin[2n+1]  = offsets[2n-1];
+
+   i = 0;
+   while (intin[i++] = *string++)
+      ;
+
+   contrl[0] = 11;
+   contrl[1] = length og string + 1 ;
+   contrl[3] = length of string;
+   contrl[4] = 11;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]11 # Function Opcode
contrl+2contrl[1]n + 1 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]n # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]11
contrl+12contrl[6]handle
intinintin[0..n-1]string[0..n-1]
ptsinptsin[0]x
ptsin+2ptsin[1]y
ptsin+4ptsin[2..2n+1]offsets[0..2n-1]
+
+ + +
+ +

7.5.25 v_fillarea

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Filled area« - Fill an area. +
  +
Opcode: 9 +
  +
Syntax: void v_fillarea ( int16_t handle, int16_t count, int16_t +*pxyarray ); +
  +
Description: The call v_fillarea fills an area that is surrounded by a +polygon. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
count Number of vertices +
pxyarray[0] X-coordinate, and +
pxyarray[1] Y-coordinate of first point +
...   +
...   +
pxyarray[2*count-2] X-coordinate, and +
pxyarray[2*count-1] Y-coordinate of last point + +
+ +
Note: If a device does not have area fill capability, +GEM VDI outlines the polygon using the current fill area colour. +
  +
At least three coordinate pairs have to be passed. The +device driver ensures that the fill area is closed by connecting the +first point to the last point. A single coordinate pair will be drawn +as a point only if the automatic outlining of the fill area has been +switched on with vsf_perimeter. +
  +
The current fill attributes will be respected. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all drivers. +
  +
Group: Output functions +
  +
See also: Binding   vswr_mode   vs_color   vsf_interior   vsf_style   +vsf_color   vsf_udpat   vsf_perimeter +
  + +
+ +

7.5.26 Bindings for v_fillarea

+ + + + + + + + + +
C: void v_fillarea ( int16_t handle, int16_t count, int16_t +*pxyarray ); +
  +
Binding: +
  +
void v_fillarea (int16_t handle, int16_t count,
+                 int16_t *pxyarray)
+{
+   ptsin[0..2*count-1]  = pxyarray[0..2*count-1];
+   contrl[0] = 9;
+   contrl[1] = count;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]9 # Function Opcode
contrl+2contrl[1]n # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]0 # entry in intin
contrl+8contrl[4]0 # entry in intout
contrl+12contrl[6]handle
ptsinptsin[0..2n-1]pxyarray[0..2n-1]
+
+ +
Note: Here n = count; +
  + +
+ +

7.5.27 v_ftext

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Output Outlined Text« - Output an outline (vector) font +text. +
  +
Opcode: 241 +
  +
Syntax: void v_ftext ( int16_t handle, int16_t x, int16_t y, int8_t +*string ); +
  +
Description: The call v_ftext outputs an outline (vector) text string +(NULL-terminated) to a workstation, paying regard to spacing +remainders. The following apply: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
x X-coordinate, and +
y Y-coordinate of starting position +
string Pointer to text string (NULL-terminated) + +
+ +
Notes: In contrast to v_gtext, the function respects +also the set kerning attributes, and takes the remainder amounts from +vqt_f_extent into account; it also calculates internally with a +precision of 1/65536 pixels, both of which ensure better positioning +of the individual characters. +
  +
To output 16-bit Speedo character strings, you can use +v_ftext16. +
  +
Return value: The function does not return a result. +
  +
Availability: FSMGDOS, SpeedoGDOS 4.00 onwards, and as of NVDI 3.00. +
  +
Group: Output functions +
  +
See also: Binding   v_gtext   v_ftext_offset   SpeedoGDOS   NVDI   fix31 +
  + +
+ +

7.5.28 Bindings for v_ftext

+ + + + + + + + + +
C: void v_ftext ( int16_t handle, int16_t x, int16_t y, int8_t +*string ); +
  +
Binding: +
  +
void v_ftext (int16_t handle, int16_t x, int16_t y,
+              int8_t *string)
+{
+   int16_t i;
+
+   ptsin[0]  = x;
+   ptsin[1]  = y;
+
+   i = 0;
+   while (intin[i++] = *string++)
+      ;
+
+   contrl[0] = 241;
+   contrl[1] = 1;
+   contrl[3] = strlen(string);
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]241 # Function Opcode
contrl+2contrl[1]1 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]n # entry in intin
contrl+8contrl[4]0 # entry in intout
contrl+12contrl[6]handle
intinintin[0..n-1]string[0..n-1]
ptsinptsin[0]x
ptsin+2ptsin[1]y
+
+ +
Note: Here n = strlen(string); +
  + +
+ +

7.5.29 v_ftext_offset

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Output Outlined Text with Offsets« - Output an 8-bit ASCII +outline text, using character offset vectors. +
  +
Opcode: 241 +
  +
Syntax: void v_ftext_offset ( int16_t handle, int16_t x, int16_t y, +int8_t *string, int16_t *offset ); +
  +
Description: The call v_ftext_offset is a variant of v_ftext for use under +SpeedoGDOS, outputting an 8-bit ASCII character string to a +workstation; one can specify an offset vector for each character. +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
x X-coordinate, and +
y Y-coordinate of starting position +
string Pointer to the string (NULL-terminated) +
offset[0] X-offset of the first character +
offset[1] Y-offset of the first character +
...   +
...   +
offset[2n-2] X-offset of the last character +
offset[2n-1] Y-offset of the last character + +
+ +
The parameter offset permits setting your own offsets in +place of the character values calculated by the system; this permits +substantially better control for positioning the characters on the +output device. +
  +
Notes: The text attributes as well as the kerning settings will be +respected. +
  +
To output 16-bit Speedo character strings, you can use +v_ftext_offset16. +
  +
Return value: The function does not return a result. +
  +
Availability: As of SpeedoGDOS 4.00, and NVDI 3.00 onwards. +
  +
Group: Output functions +
  +
See also: Binding   v_gtext   v_ftext   SpeedoGDOS   NVDI +
  + +
+ +

7.5.30 Bindings for v_ftext_offset

+ + + + + + + + + +
C: void v_ftext_offset ( int16_t handle, int16_t x, int16_t y, +int8_t *string, int16_t *offset ); +
  +
Binding: +
  +
void v_ftext_offset (int16_t handle, int16_t x, int16_t y,
+                     int8_t *string, int16_t *offset)
+{
+   ptsin[0]  = x;
+   ptsin[1]  = y;
+   ptsin[2]  = offset[0];
+   ptsin[3]  = offset[1];
+   ptsin[4..2*n+1] = offset[2..(2*n)-1]
+
+   intin[0..n-1] = string[0..n-1];
+
+   contrl[0] = 241;
+   contrl[1] = 1+n;
+   contrl[3] = n;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]241 # Function Opcode
contrl+2contrl[1]1+n # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]n # entry in intin
contrl+8contrl[4]0 # entry in intout
contrl+12contrl[6]handle
intinintin[0..n-1]string[0..n-1]
ptsinptsin[0]x
ptsin+2ptsin[1]y
ptsin+4ptsin[2]offset[0] # X-offset 1st character
ptsin+6ptsin[3]offset[1] # Y-offset 1st character
ptsin+8ptsin[4..2n+1]offset[2..2n-1] # ditto for rest
+
+ +
Note: Here n = strlen(string); +
  + +
+ +

7.5.31 v_gtext

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Graphic text« - Output a graphic text. +
  +
Opcode: 8 +
  +
Syntax: void v_gtext ( int16_t handle, int16_t x, int16_t y, int8_t +*string ); +
  +
Description: The call v_gtext outputs graphically a NULL-terminated text +string on a workstation. The following apply: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
x X-coordinate, and +
y Y-coordinate of alignment point of text +
string Character string as ASCII-codes (NULL-terminated) + +
+ +
Notes: The speed of the output can be increased if the +following points are respected: +
  +
    +
  • Output with byte alignment. +
  • +
  • Preferably do not use clipping. +
  • +
  • With non-proportional, 8 pixel wide fonts output in Replace +mode and without clipping, else in Transparent mode. +
  • +
+ +
The text attributes and the writing mode will be respected. If a vector font +has been selected, then neither pair nor track kerning will be +respected; thus it may be better to fall back on the v_ftext function. +In addition, character positioning is pixel-by-pixel, i.e. vqt_width +supplies the required step sizes. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all drivers. +
  +
Group: Output functions +
  +
See also: Binding   vswr_mode   vs_color   vst_alignment   vst_height   +vst_point   vst_rotation   vst_font   vst_color   vst_effects   +v_ftext +
  + +
+ +

7.5.32 Bindings for v_gtext

+ + + + + + + + + +
C: void v_gtext ( int16_t handle, int16_t x, int16_t y, int8_t +*string ); +
  +
Binding: +
  +
void v_gtext (int16_t handle, int16_t x, int16_t y,
+              int8_t *string)
+{
+   int16_t i;
+
+   ptsin[0]  = x;
+   ptsin[1]  = y;
+
+   i = 0;
+   while (intin[i++] = *string++)
+      ;
+
+   contrl[0] = 8;
+   contrl[1] = 1;
+   contrl[3] = -i;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]8 # Function Opcode
contrl+2contrl[1]1 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]n # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+12contrl[6]handle
intinintin[0..n-1]string[0..n-1]
ptsinptsin[0]x
ptsin+2ptsin[1]y
+
+ + +
+ +

7.5.33 v_justified

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Justified graphics text« - Outputs positioned graphic text. +
  +
Opcode: 11 (GDP 10) +
  +
Syntax: void v_justified ( int16_t handle, int16_t x, int16_t y, int8_t +*string, int16_t length, int16_t word_space, int16_t char_space, +[int16_t *char_width] ); +
  +
Description: The call v_justified outputs graphic text on a workstation, +lengthening or shortening the text string to a specified length by +modifying the inter-word or inter-character spacing. If using a vector +font, the requested width of the string refers to the sum of the +character widths; it does not take remainder data or characters +extending outside the edges of the em-square into account. The +following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
x X-coordinate, and +
y Y-coordinate of the text start point +
string Character string as ASCII-codes (NULL-terminated) +
length Requested length of the string, in X-axis pixels +
word_space Inter-word spacing: + + + + + + +
  0 = Do not allow VDI to modify inter-word spacing +
<>0 = Allow VDI to modify inter-word spacing + +
+ +
char_space Inter-character spacing: + + + + + + +
  0 = Do not allow VDI to modify inter-character spacing +
<>0 = Allow VDI to modify inter-character spacing + +
+ + +
+ +
The text will be aligned left and right with reference to the +start point and the length. To bring the text to the desired length, +one has the choice of stretching the word and/or the character +interspaces. +
  +
The text attributes and the writing mode will be respected. Characters that are +missing in the font will be substituted by a replacement symbol (e.g. +the question-mark). +
  +
For vector fonts the length specification refers to the sum of +the character widths - overhangs to left and right are not taken into +account. +
  +
From GEM/3 on the function was changed appreciably. The +parameter char_width was added. It returns the number of +pixels of each character in the output character string. With this, +there has also been a change in the parameters of word_space +and char_space as follows: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
word_space Inter-word spacing: + + + + + + + + + + + + +
0x0000 = No stretching of interspaces, no output information returned +
0x0001 = Stretch interspaces, no output information returned +
0x8000 = No stretching of interspaces, output information +(char_space) is returned +
0x8001 = Stretch interspaces, output information (char_space) is +returned + +
+ +
char_space Inter-character spacing + + + + + + +
0x0000 = No stretching of interspaces +
0x0001 = Stretch interspaces + +
+ + +
+ +
Return value: The function does not return a result. +
  +
Availability: Supported by all drivers. This function comprises one of the 10 +VDI GDP's (Generalized Drawing Primitives). Although all current +drivers support all GDP's, their availability is not guaranteed and +may vary. To check for a particular GDP refer to the table returned by +v_opnvwk or v_opnwk. +
  +
Group: Output functions +
  +
See also: Binding   vswr_mode   vs_color   vst_alignment   vst_height   +vst_point   vst_rotation   vst_font   vst_color   vst_effects +
  + +
+ +

7.5.34 Bindings for v_justified

+ + + + + + + + + +
C: void v_justified ( int16_t handle, int16_t x, int16_t y, int8_t +*string, int16_t length, int16_t word_space, int16_t char_space, +[int16_t *char_width] ); +
  +
Binding: +
  +
void v_justified (int16_t handle, int16_t x, int16_t y,
+                  int8_t *string, int16_t length,
+                  int16_t word_space, int16_t char_space,
+                  [int16_t *char_width] )
+{
+   int16_t *tmp;
+
+   ptsin[0]  = x;
+   ptsin[1]  = y;
+   ptsin[2]  = length;
+   ptsin[3]  = 0;
+
+   intin[0] = word_space;
+   intin[1] = char_space;
+
+   tmp = &(intin[2]);
+   while (*tmp++ = *string++)
+      ;
+
+   contrl[0] = 11;
+   contrl[1] = 2;
+   contrl[3] = (int16_t) (tmp-&(intin))-1;
+
+   contrl[4] = 0;  /* If word_space equals 0x0000 or 0x0001 */
+   contrl[4] = n;  /* If word_space equals 0x8000 or 0x8001 */
+
+   contrl[5] = 10;
+   contrl[6] = handle;
+
+   vdi ();
+
+   /* If word_space equals 0x8000 or 0x8001 */
+   char_with[0..n-1] = intout[0..n-1];
+
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]11 # Function Opcode
contrl+2contrl[1]2 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]n+2 # entry in intin
contrl+8contrl[4]0 # entry in intout;
          word_space is 0x0000 or 0x0001
contrl+8contrl[4]n # entry in intout;
          number is 0x8000 or 0x8001
contrl+10contrl[5]10 GDP-Nummer
contrl+12contrl[6]handle
intinintin[0]word_space
intin+2intin[1]char_space
intin+4intin[2..n+1]string[0..n-1]
ptsinptsin[0]x
ptsin+2ptsin[1]y
ptsin+4ptsin[2]length
ptsin+6ptsin[3]0
intoutintout[0..n-1]char_with[0..n-1]
          if word_space is 0x8000 or 0x8001
+
+ + +
+ +

7.5.35 v_pieslice

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Pie-slice« - Draw a filled circular "pie-slice" +segment. +
  +
Opcode: 11 (GDP 3) +
  +
Syntax: void v_pieslice ( int16_t handle, int16_t x, int16_t y, int16_t +radius, int16_t begang, int16_t endang ); +
  +
Description: The call v_pieslice draws a filled circular arc, such as used +in pie-slice graphics, for instance. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
x X-coordinate, and +
y Y-coordinate for the centre point +
radius Radius in x-coordinate units +
begang Start angle (in tenths of degrees 0-3600) +
endang End angle (in tenths of degrees 0-3600) + +
+ +
Note: The fill attributes and the writing mode will be respected during +drawing. The angle is specified in 1/10 degree and anticlockwise: +
  +
             900
+            |
+            |
+            |
+   ---------+---------
+1800        |        0
+            |
+            |
+             2700
+
+
Return value: The function does not return a result. +
  +
Availability: Supported by all drivers. This function comprises one of the 10 +VDI GDP's (Generalized Drawing Primitives). Although all current +drivers support all GDP's, their availability is not guaranteed and +may vary. To check for a particular GDP refer to the table returned by +v_opnvwk or v_opnwk. +
  +
Group: Output functions +
  +
See also: Binding   vswr_mode   vs_color   vsf_interior   vsf_style   +vsf_color   vsf_udpat   vsf_perimeter +
  + +
+ +

7.5.36 Bindings for v_pieslice

+ + + + + + + + + +
C: void v_pieslice ( int16_t handle, int16_t x, int16_t y, int16_t +radius, int16_t begang, int16_t endang ); +
  +
Binding: +
  +
void v_pieslice (int16_t handle, int16_t x, int16_t y,
+                 int16_t radius, int16_t begang,
+                 int16_t endang)
+{
+   ptsin[0] = x;
+   ptsin[1] = y;
+   ptsin[2] = ptsin[3] = ptsin[4] = ptsin[5] = 0;
+   ptsin[6] = radius;
+   ptsin[7] = 0;
+
+   intin[0] = begang;
+   intin[1] = endang;
+
+   contrl[0] = 11;
+   contrl[1] = 4;
+   contrl[3] = 2;
+   contrl[5] = 3;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]11 # Function Opcode
contrl+2contrl[1]4 # entry in ptsin
contrl+4contrl[2]0 # entry in ptsout
contrl+6contrl[3]2 # entry in intin
contrl+8contrl[4]0 # entry in intout
contrl+10contrl[5]3 GDP-number
contrl+12contrl[6]handle
intinintin[0]begang
intin+2intin[1]endang
ptsinptsin[0]x
ptsin+2ptsin[1]y
ptsin+4ptsin[2..5]0
ptsin+12ptsin[6]radius
ptsin+14ptsin[7]0
+
+ + +
+ +

7.5.37 v_pline

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Polyline« - Draw a polyline. +
  +
Opcode: 6 +
  +
Syntax: void v_pline ( int16_t handle, int16_t count, int16_t *pxyarray +); +
  +
Description: The call v_pline draws a polyline (one, or a group of several +connected lines). +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
count Number of input vertices (n) +
pxyarray[0] X-coordinate, and +
pxyarray[1] Y-coordinate of first point +
...   +
...   +
pxyarray[2*count-2] X-coordinate, and +
pxyarray[2*count-1] Y-coordinate of last point + +
+ +
Note: Any set line attributes and the current writing mode will be +used. +
  +
Notes: The starting point is set by the first coordinate +pair. After this all further points will be connected by a line. +Single points can not be drawn by a single coordinate pair, +but can be drawn by a line of zero length, i.e. two equal coordinate +pairs. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all drivers. +
  +
Group: Output functions +
  +
See also: Binding   vs_color   vswr_mode   vsl_type   vsl_width   +vsl_color   vsl_ends   vsl_udsty +
  + +
+ +

7.5.38 Bindings for v_pline

+ + + + + + + + + +
C: void v_pline ( int16_t handle, int16_t count, int16_t *pxyarray +); +
  +
Binding: +
  +
void v_pline (int16_t handle, int16_t count,
+              int16_t *pxyarray)
+{
+   ptsin[0..2*count-1] = pxyarray[0..2*count-1];
+
+   contrl[0] = 6;
+   contrl[1] = count;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]6 # Function Opcode
contrl+2contrl[1]count # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+12contrl[6]handle
ptsinptsin[0..2n-1]pxyarray[0..2n-1]
+
+ +
Note: Here n = count. +
  + +
+ +

7.5.39 v_pmarker

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Polymarker« - Draw a marker. +
  +
Opcode: 7 +
  +
Syntax: void v_pmarker ( int16_t handle, int16_t count, int16_t +*pxyarray ); +
  +
Description: The call v_pmarker draws one or more markers. +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
count Number of markers +
pxyarray[0] X-coordinate, and +
pxyarray[1] Y-coordinate of first marker +
...   +
...   +
pxyarray[2*count-2] X-coordinate, and +
pxyarray[2*count-1] Y-coordinate of last marker + +
+ +
Notes: The marker attributes and the set writing mode will be respected. +Markers are used, for instance, by the program XACT for the +graphical display of statistics. +
  +
This function allows quick plotting of single points by +selecting an appropriate marker type with vsm_type. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all drivers. +
  +
Group: Output functions +
  +
See also: Binding   vs_color   vswr_mode   vsm_type   vsm_height   +vsm_color   pxyarray +
  + +
+ +

7.5.40 Bindings for v_pmarker

+ + + + + + + + + +
C: void v_pmarker ( int16_t handle, int16_t count, int16_t +*pxyarray ); +
  +
Binding: +
  +
void v_pmarker (int16_t handle, int16_t count,
+                int16_t *pxyarray)
+{
+   ptsin[0..2*count-1] = pxyarray[0..2*count-1];
+
+   contrl[0] = 7;
+   contrl[1] = count;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]7 # Function Opcode
contrl+2contrl[1]count # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+12contrl[6]handle
ptsinptsin[0..2n-1]pxyarray[0..2n-1]
+
+ +
Note: Here n = count. +
  + +
+ +

7.5.41 v_rbox

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Rounded rectangle« - Draw a rectange with rounded corners. +
  +
Opcode: 11 (GDP 8) +
  +
Syntax: void v_rbox ( int16_t handle, int16_t *pxyarray ); +
  +
Description: The call v_rbox draws an unfilled rectangle with rounded +corners. +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
pxyarray[0] X-coordinate, and +
pxyarray[1] Y-coordinate of a rectangle corner +
pxyarray[2] Y-coordinate, and +
pxyarray[3] Y-coordinate of the diagonally opposite corner + +
+ +
Notes: The line attributes and current writing mode as well as the +pixel size ratio will be respected. +
  +
The corners above are understood as the points at which the +horizontal and vertial lines would meet if they were extended. +
  +
There is no way to define the radius (i.e. +"roundness") of the corners. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all drivers. This function comprises one of the 10 +VDI GDP's (Generalized Drawing Primitives). Although all current +drivers support all GDP's, their availability is not guaranteed and +may vary. To check for a particular GDP refer to the table returned by +v_opnvwk or v_opnwk. +
  +
Group: Output functions +
  +
See also: Binding   vs_color   vswr_mode   vsl_type   vsl_width   +vsl_color   vsl_ends   vsl_udsty +
  + +
+ +

7.5.42 Bindings for v_rbox

+ + + + + + + + + +
C: void v_rbox ( int16_t handle, int16_t *pxyarray ); +
  +
Binding: +
  +
void v_rbox (int16_t handle, int16_t *pxyarray)
+{
+   ptsin[0..3] = pxyarray[0..3];
+
+   contrl[0] = 11;
+   contrl[1] = 2;
+   contrl[3] = 0;
+   contrl[5] = 8;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]11 # Function Opcode
contrl+2contrl[1]2 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]8 GDP-Nummer
contrl+12contrl[6]handle
ptsinptsin[0..3]pxyarray[0..3]
+
+ + +
+ +

7.5.43 v_rfbox

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Filled rounded rectangle« - Draw a filled rectangular area +with rounded corners. +
  +
Opcode: 11 (GDP 9) +
  +
Syntax: void v_rfbox ( int16_t handle, int16_t *pxyarray ); +
  +
Description: The call v_rfbox draws a filled rectangle with rounded corners. +The following apply: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
pxyarray[0] X-coordinate, and +
pxyarray[1] Y-coordinate of a rectangle corner +
pxyarray[2] X-coordinate, and +
pxyarray[3] Y-coordinate of the diagonally opposite corner + +
+ +
Notes: The line attributes and current writing mode as well as the +pixel size ratio will be respected. +
  +
The corners above are understood as the points at which the +horizontal and vertial lines would meet if they were extended. +
  +
There is no way to define the radius (i.e. +"roundness") of the corners. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all drivers. This function comprises one of the 10 +VDI GDP's (Generalized Drawing Primitives). Although all current +drivers support all GDP's, their availability is not guaranteed and +may vary. To check for a particular GDP refer to the table returned by +v_opnvwk or v_opnwk. +
  +
Group: Output functions +
  +
See also: Binding   vswr_mode   vs_color   vsf_interior   vsf_style   +vsf_color   vsf_udpat   vsf_perimeter   v_rbox +
  + +
+ +

7.5.44 Bindings for v_rfbox

+ + + + + + + + + +
C: void v_rfbox ( int16_t handle, int16_t *pxyarray ); +
  +
Binding: +
  +
void v_rfbox (int16_t handle, int16_t *pxyarray)
+{
+   ptsin[0..3] = pxyarray[0..3];
+
+   contrl[0] = 11;
+   contrl[1] = 2;
+   contrl[3] = 0;
+   contrl[5] = 9;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]11 # Function Opcode
contrl+2contrl[1]2 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]9 GDP-number
contrl+12contrl[6]handle
ptsinptsin[0..3]pxyarray[0..3]
+
+ + +
+ +
+ +Home +VDIVDI +Attribute functionsAttribute functions +Inquire functionsInquire functions + + diff --git a/en/vdi_raster.html b/en/vdi_raster.html new file mode 100644 index 000000000..e6251ecab --- /dev/null +++ b/en/vdi_raster.html @@ -0,0 +1,3896 @@ + + + + + +The documentation for TOS: Raster functions + + + + + + + + + +Home +VDIVDI +Control functionsControl functions +TC-VDI functionsTC-VDI functions + +
+ +

7.11 Raster functions

+

This library contains functions for manipulating rectangular +blocks of bits in memory. The following routines are available for +this purpose: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
v_get_pixel Gets pixel status (set or cleared, colour) +
vq_hilite_color Gets highlighting colour +
vq_max_color Gets maximum colour value for an additive raster operation +
vq_min_color Gets minimum colour value for a subtractive raster operation +
vq_weight_color Gets weighting for the blend function +
vr_clip_rects_by_dst Cuts destination rectangle with a clipping rectangle +
vr_clip_rects_by_src Cuts source rectangle with a clipping rectangle +
vr_clip_rects32_by_dst Cuts destination rectangle with a clipping rectangle (32-bit +coordinates) +
vr_clip_rects32_by_src Cuts source rectangle with a clipping rectangle (32-bit +coordinates) +
vr_transfer_bits Combines two bitmaps +
vr_trnfm Transforms raster to device-specific formats and vice versa +
vro_cpyfm Copies ('blits') a screen or memory block from one location to +another (opaque) +
vrt_cpyfm Copies ('blits') a screen or memory block from one location to +another (transparent) +
vs_hilite_color Sets highlighting colour +
vs_max_color Sets maximum colour value for an additive raster operation +
vs_min_color Sets minimum colour value for a subtractive raster operation +
vs_weight_color Sets weighting for the blend function + +
+ +

Note: With these functions it is possible, in +particular, to copy or move a screen area from one place to another; +thanks to this one can obtain smooth scrolling in GEM programs, for +instance. +

+

See also: Raster formats   Off-screen bitmaps   VDI workstations +

+

7.11.1 v_get_pixel

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Get pixel« - Returns the colour value of a pixel. +
  +
Opcode: 105 +
  +
Syntax: void v_get_pixel ( int16_t handle, int16_t x, int16_t y, +int16_t *pel, int16_t *index ); +
  +
Description: The call v_get_pixel obtains the pixel value and the colour +index of a pixel for resolutions up to 256 colours (8 planes). The +following apply: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
x X-coordinate of pixel +
y Y-coordinate of pixel +
pel Pixel value +
index Colour index + +
+ +
Note: The colour index is understood as the number that +can be specified for the attribute functions of the VDI. The pixel +value, on the other hand, represents the actual contents of the screen +memory. +
  +
In HiColor (15 or 16 bits) pel contains the pixel value +and index is (usually) -1, as it cannot be allocated beyond +doubt. In TrueColor pel contains the low word and +index the high word of the pixel value. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all screen drivers. +
  +
Group: Raster functions +
  +
See also: Binding   Raster formats +
  + +
+ +

7.11.2 Bindings for v_get_pixel

+ + + + + + + + + +
C: void v_get_pixel ( int16_t handle, int16_t x, int16_t y, +int16_t *pel, int16_t *index ); +
  +
Binding: +
  +
void v_get_pixel (int16_t handle, int16_t x, int16_t y,
+                  int16_t *pel, int16_t *index)
+{
+   ptsin[0]  = x;
+   ptsin[1]  = y;
+   contrl[0] = 105;
+   contrl[1] = 1;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   *pel   = intout[0];
+   *index = intout[1];
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]105 # Function opcode
contrl+2contrl[1]1 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]2 # Entry in intout
contrl+12contrl[6]handle
ptsinptsin[0]x
ptsin+2ptsin[1]y
intoutintout[0]pel
intout+2intout[1]index
+
+ + +
+ +

7.11.3 vq_hilite_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire hilite colour« - Obtain highlighting colour. +
  +
Opcode: 209 (Sub-Opcode 0) +
  +
Syntax: int32_t vq_hilite_color( int16_t handle, COLOR_ENTRY +*hilite_color ); +
  +
Description: The call vq_hilite_color obtains the highlighting colour. The +following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
hilite_color COLOR_ENTRY of the highlighting colour + +
+ +
Return value: Colour space set. +
  +
Availability: As of NVDI 5.00. +
  +
Group: Raster functions +
  +
See also: Binding +
  + +
+ +

7.11.4 Bindings for vq_hilite_color

+ + + + + + + + + +
C: int32_t vq_hilite_color( int16_t handle, COLOR_ENTRY +*hilite_color ); +
  +
Binding: +
  +
int32_t vq_hilite_color( int16_t handle,
+                         COLOR_ENTRY *hilite_color )
+{
+   contrl[0] = 209;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   hilite_color = intout[2..5];
+
+   return ( intout[0..1] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]209 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]6 # Entry in intout
contrl+10contrl[5]0 # Sub-opcode
contrl+12contrl[6]handle
intoutintout[0..1]Return value
intout+4intout[2..5]hilite_color
+
+ + +
+ +

7.11.5 vq_max_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire maximum colour« +
  +
Opcode: 209 (Sub-Opcode 2) +
  +
Syntax: int32_t vq_max_color( int16_t handle, COLOR_ENTRY *max_color ); +
  +
Description: The call vq_max_color obtains the maximum colour value for an +additive raster operation. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
max_color COLOR_ENTRY of the maximum colour value for T_ADD + +
+ +
Return value: Colour space set. +
  +
Availability: As of NVDI 5.00. +
  +
Group: Raster functions +
  +
See also: Binding +
  + +
+ +

7.11.6 Bindings for vq_max_color

+ + + + + + + + + +
C: int32_t vq_max_color( int16_t handle, COLOR_ENTRY *max_color ); +
  +
Binding: +
  +
int32_t vq_max_color( int16_t handle, COLOR_ENTRY *max_color )
+{
+   contrl[0] = 209;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   max_color = intout[2..5];
+   return ( intout[0..1] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]209 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]6 # Entry in intout
contrl+10contrl[5]2 # Sub-opcode
contrl+12contrl[6]handle
intoutintout[0..1]Return value
intout+4intout[2..5]max_color
+
+ + +
+ +

7.11.7 vq_min_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire minimum colour« +
  +
Opcode: 209 (Sub-Opcode 1) +
  +
Syntax: int32_t vq_min_color( int16_t handle, COLOR_ENTRY *min_color ); +
  +
Description: The call vq_min_color obtains the minimum colour value for a +subtractive raster operation (T_SUB). +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
min_color COLOR_ENTRY of the minimum colour value for T_SUB + +
+ +
Return value: Colour space set. +
  +
Availability: As of NVDI 5.00. +
  +
Group: Raster functions +
  +
See also: Binding +
  + +
+ +

7.11.8 Bindings for vq_min_color

+ + + + + + + + + +
C: int32_t vq_min_color( int16_t handle, COLOR_ENTRY *min_color ); +
  +
Binding: +
  +
int32_t vq_min_color( int16_t handle, COLOR_ENTRY *min_color )
+{
+   contrl[0] = 209;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   min_color = intout[2..5];
+   return ( intout[0..1] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]209 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]6 # Entry in intout
contrl+10contrl[5]1 # Sub-opcode
contrl+12contrl[6]handle
intoutintout[0..1]Return value
intout+4intout[2..5]min_color
+
+ + +
+ +

7.11.9 vq_weight_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Inquire weight colour« +
  +
Opcode: 209 (Sub-Opcode 3) +
  +
Syntax: int32_t vq_weight_color( int16_t handle, COLOR_ENTRY +*weight_color ); +
  +
Description: The call vq_weight_color obtains the weighting for the blend +function (T_BLEND). +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
weight_color COLOR_ENTRY of weighting for T_BLEND + +
+ +
Return value: Colour space set. +
  +
Availability: As of NVDI 5.00. +
  +
Group: Raster functions +
  +
See also: Binding +
  + +
+ +

7.11.10 Bindings for vq_weight_color

+ + + + + + + + + +
C: int32_t vq_weight_color( int16_t handle, COLOR_ENTRY +*weight_color ); +
  +
Binding: +
  +
int32_t vq_weight_color( int16_t handle,
+                         COLOR_ENTRY *weight_color )
+{
+   contrl[0] = 209;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[5] = 3;
+   contrl[6] = handle;
+
+   vdi ();
+
+   weight_color = intout[2..5];
+   return ( intout[0..1] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]209 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]6 # Entry in intout
contrl+10contrl[5]3 # Sub-opcode
contrl+12contrl[6]handle
intoutintout[0..1]Return value
intout+4intout[2..5]weight_color
+
+ + +
+ +

7.11.11 vr_clip_rects32_by_dst

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Clip Rects By Destination Rectangle« +
  +
Opcode: 171 (Sub-Opcode 2) +
  +
Syntax: int16_t vr_clip_rects32_by_dst ( int16_t handle, RECT32 +*dst_clip_rect, RECT32 *src_rect, RECT16 *dst_rect, RECT32 +*clipped_src_rect, RECT32 *clipped_dst_rect ); +
  +
Description: The call vr_clip_rects32_by_dst cuts the destination rectangle +with a clipping rectangle and adapts the source rectangle, using +32-bit coordinates. +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
dst_clip_rect Clipping rectangle for destination (continuous coordinates, +32-bit) +
src_rect Source rectangle (continuous coordinates, 32-bit) +
dst_rect Destination rectangle (continuous coordinates, 32-bit) +
clipped_src_rect Clipped source rectangle (continuous coordinates, 32-bit) +
clipped_dst_rect Clipped destination rectangle (continuous coordinates, 32-bit) + +
+ +
Return value: 0: No clipping of the rectangles +
1: All OK +
  +
Availability: As of NVDI 5.02. +
  +
If the driver offers the new rasterizing functions, then bit 2 +will be set in work_out[30] in the extended parameters of +vq_extnd. +
  +
Group: Raster functions +
  +
See also: Binding +
  + +
+ +

7.11.12 Bindings for vr_clip_rects32_by_dst

+ + + + + + + + + +
C: int16_t vr_clip_rects32_by_dst ( int16_t handle, RECT32 +*dst_clip_rect, RECT32 *src_rect, RECT16 *dst_rect, RECT32 +*clipped_src_rect, RECT32 *clipped_dst_rect ); +
  +
Binding: +
  +
int16_t vr_clip_rects32_by_dst ( int16_t handle,
+                                 RECT32 *dst_clip_rect,
+                                 RECT32 *src_rect,
+                                 RECT16 *dst_rect,
+                                 RECT32 *clipped_src_rect,
+                                 RECT32 *clipped_dst_rect )
+{
+   ptsin[0..7] = dst_clip_rect;
+   ptsin[8..15] = src_rect;
+   ptsin[16..23] = dst_rect;
+
+   contrl[0] = 171;
+   contrl[1] = 12;
+   contrl[3] = 0;
+   contrl[5] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   clipped_src_rect = ptsout[0..7];
+   clipped_dst_rect = ptsout[8..15];
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]171 # Function opcode
contrl+2contrl[1]12 # Entry in ptsin
contrl+4contrl[2]8 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+10contrl[5]2 # Sub-opcode
contrl+12contrl[6]handle
ptsinptsin[0..7]dst_clip_rect
ptsin+16ptsin[8..15]src_rect
ptsin+32ptsin[16..23]dst_rect
ptsoutptsout[0..7]clipped_src_rect
ptsout+16ptsout[8..15]clipped_dst_rect
intoutintout[0]Return value
+
+ + +
+ +

7.11.13 vr_clip_rects32_by_src

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Clip rectangles by source rectangle« +
  +
Opcode: 171 (Sub-Opcode 3) +
  +
Syntax: int16_t vr_clip_rects32_by_src ( int16_t handle, RECT32 +*src_clip_rect, RECT32 *src_rect, RECT16 *dst_rect, RECT32 +*clipped_src_rect, RECT32 *clipped_dst_rect ); +
  +
Description: The call vr_clip_rects32_by_src cuts the source rectangle with +a clipping rectangle, using 32-bit coordinates (this function respects +the rounding behaviour of vr_transfer_bits). The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
src_clip_rect Clipping rectangle for the source (continuous coordinates, +32-bit) +
src_rect Source rectangle (continuous coordinates, 32-bit) +
dst_rect Destination rectangle (continuous coordinates, 32-bit) +
clipped_src_rect Clipped source rectangle (continuous coordinates, 32-bit) +
clipped_dst_rect Clipped destination rectangle (continuous coordinates, 32-bit) + +
+ +
Return value: 0: No clipping of the rectangles +
1: All OK +
  +
Availability: As of NVDI 5.02. +
  +
If the driver offers the new clip functions, then bit 2 will be +set in work_out[30] in the extended parameters of vq_extnd. +
  +
Group: Raster functions +
  +
See also: Binding   vr_transfer_bits +
  + +
+ +

7.11.14 Bindings for vr_clip_rects32_by_src

+ + + + + + + + + +
C: int16_t vr_clip_rects32_by_src ( int16_t handle, RECT32 +*src_clip_rect, RECT32 *src_rect, RECT16 *dst_rect, RECT32 +*clipped_src_rect, RECT32 *clipped_dst_rect ); +
  +
Binding: +
  +
int16_t vr_clip_rects32_by_src ( int16_t handle,
+                                 RECT32 *src_clip_rect,
+                                 RECT32 *src_rect,
+                                 RECT16 *dst_rect,
+                                 RECT32 *clipped_src_rect,
+                                 RECT32 *clipped_dst_rect )
+{
+   ptsin[0..7] = src_clip_rect;
+   ptsin[8..15] = src_rect;
+   ptsin[16..23] = dst_rect;
+
+   contrl[0] = 171;
+   contrl[1] = 12;
+   contrl[3] = 0;
+   contrl[5] = 3;
+   contrl[6] = handle;
+
+   vdi ();
+
+   clipped_src_rect = ptsout[0..7];
+   clipped_dst_rect = ptsout[8..15];
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]171 # Function opcode
contrl+2contrl[1]12 # Entry in ptsin
contrl+4contrl[2]8 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+10contrl[5]3 # Sub-opcode
contrl+12contrl[6]handle
ptsinptsin[0..7]src_clip_rect
ptsin+16ptsin[8..15]src_rect
ptsin+32ptsin[16..23]dst_rect
ptsoutptsout[0..7]clipped_src_rect
ptsout+16ptsout[8..15]clipped_dst_rect
intoutintout[0]Return value
+
+ + +
+ +

7.11.15 vr_clip_rects_by_dst

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Clip rectangles by destination rectangle« +
  +
Opcode: 171 (Sub-Opcode 0) +
  +
Syntax: int16_t vr_clip_rects_by_dst ( int16_t handle, RECT16 +*dst_clip_rect, RECT16 *src_rect, RECT16 *dst_rect, RECT16 +*clipped_src_rect, RECT16 *clipped_dst_rect ); +
  +
Description: The call vr_clip_rects_by_ds cuts the destination rectangle +with a clipping rectangle and adapts the source rectangle. The +following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
dst_clip_rect Clipping rectangle for destination (discrete coordinates, 16-bit) +
src_rect Source rectangle (discrete coordinates, 16-bit) +
dst_rect Destination rectangle (discrete coordinates, 16-bit) +
clipped_src_rect Clipped source rectangle (discrete coordinates, 16-bit) +
clipped_dst_rect Clipped destination rectangle (discrete coordinates, 16-bit) + +
+ +
Return value: 0: No clipping of the rectangles +
1: All OK +
  +
Availability: As of NVDI 5.02. +
  +
If the driver offers the new clip functions, then bit 2 will be +set in work_out[30] in the extended parameters of vq_extnd. +
  +
Group: Raster functions +
  +
See also: Binding +
  + +
+ +

7.11.16 Bindings for vr_clip_rects_by_dst

+ + + + + + + + + +
C: int16_t vr_clip_rects_by_dst ( int16_t handle, RECT16 +*dst_clip_rect, RECT16 *src_rect, RECT16 *dst_rect, RECT16 +*clipped_src_rect, RECT16 *clipped_dst_rect ); +
  +
Binding: +
  +
int16_t vr_clip_rects_by_dst ( int16_t handle,
+                               RECT16 *dst_clip_rect,
+                               RECT16 *src_rect,
+                               RECT16 *dst_rect,
+                               RECT16 *clipped_src_rect,
+                               RECT16 *clipped_dst_rect )
+{
+   ptsin[0..3] = dst_clip_rect;
+   ptsin[4..7] = src_rect;
+   ptsin[8..11] = dst_rect;
+
+   contrl[0] = 171;
+   contrl[1] = 6;
+   contrl[3] = 0;
+   contrl[5] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   clipped_src_rect = ptsout[0..3];
+   clipped_dst_rect = ptsout[4..7];
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]171 # Function opcode
contrl+2contrl[1]6 # Entry in ptsin
contrl+4contrl[2]4 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+10contrl[5]0 # Sub-opcode
contrl+12contrl[6]handle
ptsinptsin[0..3]dst_clip_rect
ptsin+8ptsin[4..7]src_rect
ptsin+16ptsin[8..11]dst_rect
ptsoutptsout[0..3]clipped_src_rect
ptsout+8ptsout[4..7]clipped_dst_rect
intoutintout[0]Return value
+
+ + +
+ +

7.11.17 vr_clip_rects_by_src

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Clip rectangles by source rectangle« +
  +
Opcode: 171 (Sub-Opcode 1) +
  +
Syntax: int16_t vr_clip_rects_by_src ( int16_t handle, RECT16 +*src_clip_rect, RECT16 *src_rect, RECT16 *dst_rect, RECT16 +*clipped_src_rect, RECT16 *clipped_dst_rect ); +
  +
Description: The call vr_clip_rects_by_src cuts the source rectangle with a +clipping rectangle (the function respects the rounding behaviour of +vr_transfer_bits). The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
src_clip_rect Clipping rectangle for the source (discrete coordinates, 16-bit) +
src_rect Source rectangle (discrete coordinates, 16-bit) +
dst_rect Destination rectangle (discrete coordinates, 16-bit) +
clipped_src_rect Clipped source rectangle (discrete coordinates, 16-bit) +
clipped_dst_rect Clipped destination rectangle (discrete coordinates, 16-bit) + +
+ +
Return value: 0: No clipping of the rectangles +
1: All OK +
  +
Availability: As of NVDI 5.02. +
  +
If the driver offers the new clip functions, then bit 2 will be +set in work_out[30] in the extended parameters of vq_extnd. +
  +
Group: Raster functions +
  +
See also: Binding   vr_transfer_bits +
  + +
+ +

7.11.18 Bindings for vr_clip_rects_by_src

+ + + + + + + + + +
C: int16_t vr_clip_rects_by_src ( int16_t handle, RECT16 +*src_clip_rect, RECT16 *src_rect, RECT16 *dst_rect, RECT16 +*clipped_src_rect, RECT16 *clipped_dst_rect ); +
  +
Binding: +
  +
int16_t vr_clip_rects_by_src ( int16_t handle,
+                               RECT16 *src_clip_rect,
+                               RECT16 *src_rect,
+                               RECT16 *dst_rect,
+                               RECT16 *clipped_src_rect,
+                               RECT16 *clipped_dst_rect )
+{
+   ptsin[0..3] = src_clip_rect;
+   ptsin[4..7] = src_rect;
+   ptsin[8..11] = dst_rect;
+
+   contrl[0] = 171;
+   contrl[1] = 6;
+   contrl[3] = 0;
+   contrl[5] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   clipped_src_rect = ptsout[0..3];
+   clipped_dst_rect = ptsout[4..7];
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]171 # Function opcode
contrl+2contrl[1]6 # Entry in ptsin
contrl+4contrl[2]4 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+10contrl[5]1 # Sub-opcode
contrl+12contrl[6]handle
ptsinptsin[0..3]src_clip_rect
ptsin+8ptsin[4..7]src_rect
ptsin+16ptsin[8..11]dst_rect
ptsoutptsout[0..3]clipped_src_rect
ptsout+8ptsout[4..7]clipped_dst_rect
intoutintout[0]Return value
+
+ + +
+ +

7.11.19 vr_transfer_bits

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Transfer bitmap« - Combine two bitmaps. +
  +
Opcode: 170 (Sub-Opcode 0) +
  +
Syntax: void vr_transfer_bits( int16_t handle, GCBITMAP *src_bm, +GCBITMAP *dst_bm, RECT16 *src_rect, RECT16 *dst_rect, int16_t mode ); +
  +
Description: The call vr_transfer_bit combines two bitmaps, using scaling if +required. +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
src_bm Source bitmap +
dst_bm Destination bitmap +
src_rect Source rectangle +
dst_rect Destination rectangle +
mode Transfer function mode + +
+ +
The function vr_transfer_bit combines the source +bitmapsrc_bm with the destination bitmap dst_bm, where +mode specifies the transfer function. The source rectangle is +passed in src_rect and the destination rectangle in +dst_rect. The coordinates here are specified (as for all other +VDI functions) as discrete values. +
  +
If the source and destination rectangles do not have the same +size, vr_transfer_bit will scale the source bitmap. For reductions, +the bitmap data will be interpolated if the source contains direct +colour values (16 or 32 bit) or if the output takes place with +dithering. +
  +
If the source and destination bitmaps do not have the same pixel +format or the same colour depth, the source data is transformed +automatically into the destination format (the source bitmap will +remain unchanged, of course). +
  +
If src_bm or dst_bm is 0, then the bitmap of the +workstation handle is used as source or destination of the +operation respectively. For output to the screen a program should pass +0 for dst_bm in any case and not try to build up its own +bitmap description. Clipping is applied only for the destination +bitmap (and that only if the destination bitmap is the bitmap of the +workstation). +
  +
Transfer modes +
  +
In the following list the constants for the transfer modes +passed in mode are defined. In the comments the type of +operation is specified in symbolic notation ('src' is the source +pixel, 'dst' is the destination pixel, 'bg_col' is the pixel value of +the background colour, 'hilite_col' is the pixel value of the colour +used for emphasis): +
  +
/* Logical transfer modes */
+/* dst = src; */
+#define T_LOGIC_COPY         0
+
+/* dst = src OR dst; */
+#define T_LOGIC_OR           1
+
+/* dst = src XOR dst; */
+#define T_LOGIC_XOR          2
+
+/* dst = src AND dst; */
+#define T_LOGIC_AND          3
+
+/* dst = ( NOT src ); */
+#define T_LOGIC_NOT_COPY     4
+
+/* dst = ( NOT src ) OR dst; */
+#define T_LOGIC_NOT_OR       5
+
+/* dst = ( NOT src ) XOR dst; */
+#define T_LOGIC_NOT_XOR      6
+
+/* dst = ( NOT src ) AND dst; */
+#define T_LOGIC_NOT_AND      7
+
+/* Drawing modes */
+/* dst = src; */
+#define T_REPLACE            32
+
+/* if ( src != bg_col ) dst = src; */
+#define T_TRANSPARENT        33
+
+/* if ( src != bg_col )            */
+/* {                               */
+/*    if ( dst == bg_col )         */
+/*       dst = hilite_col;         */
+/*    else if ( dst == hilite_col )*/
+/*       dst = bg_col;             */
+/* }                               */
+#define T_HILITE             34
+
+/* if ( src == bg_col ) dst = src; */
+#define T_REVERS_TRANSPARENT 35
+
+
Note: In the arithmetic transfer modes, source and +destination are not combined according to their pixel values, but +their (RGB) colour values are added or subtracted depending on their +combination, ... +
  +
In the symbolic description below, 'RGB( x )' is the RGB colour +value of a pixel and 'PIXELVALUE( rgb )' is the pixel value of a RGB +colour value. 'MAX( rgb_a, rgb_b )' returns the maximum components of +two RGB colour values; 'MIN( rgb_a, rgb_b )' similarly returns the +minimum components. 'max_rgb' is a maximum RGB colour value, 'min_rgb' +is a minimum RGB colour value. 'weighting' is a value between 0 and +1.0 which specifies the mixing of source and destination colours. +
  +
/* Arithmetic transfer modes */
+/* Mix source and destination color  */
+/* rgb = RGB( src ) * weighting );   */
+/* rgb += RGB( dst ) * (1-weighting));*/
+/* dst = PIXELWERT( rgb );           */
+#define T_BLEND     64
+
+/* Add source and destination color  */
+/* rgb = RGB( src ) + RGB( dst )     */
+/* if ( rgb > max_rgb )              */
+/*    rgb = max_rgb;                 */
+/* dst = PIXELWERT( rgb );           */
+#define T_ADD       65
+
+/* Add source and destination color, */
+/* do not catch overflows            */
+/* rgb = RGB( src ) + RGB( dst )     */
+/* dst = PIXELWERT( rgb );           */
+#define T_ADD_OVER  66
+
+/* Subtract source from destination  */
+/* color                             */
+/* rgb = RGB( dst ) - RGB( src )     */
+/* if ( rgb < min_rgb )              */
+/*    rgb = min_rgb;                 */
+/* dst = PIXELWERT( rgb );           */
+#define T_SUB       67
+
+/* Maximum RGB components            */
+/* rgb = MAX(RGB( dst ), RGB( src )) */
+/* dst = PIXELWERT( rgb );           */
+#define T_MAX       69
+
+/* Subtract source from destination  */
+/* color, do not catch overflows     */
+/* rgb = RGB( dst ) - RGB( src )     */
+/* dst = PIXELWERT( rgb );           */
+#define T_SUB_OVER  70
+
+/* Minimum RGB components            */
+/* rgb = MIN(RGB( dst ), RGB( src )) */
+/* dst = PIXELWERT( rgb );           */
+#define T_MIN       71
+
+
Furthermore, for all transfer modes one can affect the type of +combination by the addition of one of the following constants: +
  +
#define T_COLORIZE     16    /* Colourize source   */
+#define T_DITHER_MODE  128   /* Dither source data */
+
+
Dithering +
  +
'T_DITHER_MODE' leads to the use of an error-diffusion function +if the destination bitmap has 256 or fewer colours (furthermore, +interpolation will be performed for reductions in this case so that +the details in the reduced image are not lost completely). +
  +
If the source and destination palette are equal (or the source +palette is a subset of the system colour palette), NVDI +(automatically) uses a faster transfer function internally without +dithering. +
  +
Colourizing +
  +
    +
  • If a logical mode is called with 'T_COLORIZE', the type of +colourizing applied depends on the mode: +
      +

    T_LOGIC_COPY
    +
    +For all set bits in the colour value depict the
    +background colour and for all cleared bits the
    +foreground colour:
    +rgb = (( NOT RGB( src )) & RGB( fg_col )) OR
    +      ( RGB( src ) AND RGB( bg_col ));
    +dst = PIXELWERT( rgb );
    +
    +T_LOGIC_NOT_COPY
    +
    +For all set bits in the colour value depict the
    +foreground colour and for all cleared bits the
    +background colour:
    +rgb = ( RGB( src ) & RGB( fg_col )) OR
    +      ((( NOT RGB( src )) AND RGB( bg_col ));
    +dst = PIXELWERT( rgb );
    +
    +T_LOGIC_OR
    +
    +Everywhere that source bits are set, ( src AND
    +fg_col ) will be depicted in the destination:
    +dst = ( src AND fg_col ) OR (( NOT src ) AND dst );
    +
    +T_LOGIC_NOT_OR
    +
    +Everywhere that source bits are cleared,
    +((NOT src ) AND fg_col ) will be depicted in
    +the destination:
    +dst = (( NOT src ) AND fg_col ) OR ( src AND dst );
    +
    +T_LOGIC_XOR
    +T_LOGIC_NOT_XOR
    +
    +The XOR combination ignores the colourizing.
    +
    +T_LOGIC_AND
    +
    +Everywhere that source bits are cleared,
    +(( NOT src ) AND bg_col ) will be depicted in the
    +destination:
    +dst = ((NOT src ) AND bg_col ) OR ( src AND dst );
    +
    +T_LOGIC_NOT_AND
    +
    +Everywhere that source bits are set, ( src AND
    +bg_col ) will be depicted in the destination:
    +dst = ( src AND bg_col ) OR ((NOT src ) AND dst );
    +
    +

  • +
  • For the modes T_REPLACE, T_TRANSPARENT, T_HILITE and +T_REVERS_TRANSPARENT the colourizing does not act in a binary manner +on the colour or pixel values, but the colour values are scaled +instead. The following sample shows how a colour value is colourized; +'bg_col', 'fg_col', 'src' and 'dst' are RGB colour values (between 0 +and 65535): +
      +

    red_range = bg_col.red - fg_col.red;
    +green_range = bg_col.green - fg_col.green;
    +blue_range = bg_col.blue - fg_col.blue;
    +
    +dst.red = fg_col.red + ( src_color.red * red_range / 65535 );
    +dst.green = fg_col.green + ( src_color.green * green_range / 65535 );
    +dst.blue = fg_col.blue + ( src_color.blue * blue_range / 65535 );
    +
    +
    Note: At present, colourizing in the modes T_REPLACE, +T_TRANSPARENT, T_HILITE and T_REVERS_TRANSPARENT is suppored only for +source bitmaps with up to 256 colours. For source bitmaps with 16- or +32-bit depths there is at present no support for colourizing in these +modes. +
      +

  • +
  • The arithmetic transfer modes do not support any colourizing. +
      +

  • +
+ +
Bitmaps +
  +
Instead of an antiquated MFDB, this function expects a GCBITMAP +structure for describing the bitmaps. +
  +
If 'ctab' is 0L, the system colour table corresponding to the +bit-depth will be used for the call (if the bitmap has more than 8 +bits per pixel, i.e. uses direct colour values, 'ctab' can also be set +to 0). +
  +
Source bitmaps do not require an inverse colour table; here +'itab' can be set to 0L. For a self-managed destination bitmap one +must request a reference to an inverse colour table from the VDI +(and at some later stage also release it again). +
  +
Simplified special cases +
  +
So that bitmaps in screen format can be copied in as +uncomplicated a way as with vro_cpyfm without having to request a +colour table and a reference to an inverse colour table, there are +some simplified special cases for vr_transfer_bits: +
  +
    +
  • If the source does not have a colour table (0L), the colour +table of the device will be used if this has the same bit-depth. If +this is not the case, the system colour table for the bit-depth of the +source will be used. +
      +

  • +
  • If the destination does not have an (inverse) colour table, the +(inverse) colour table of the device will be used if this has the same +bit-depth. If this is not the case, the system color table for the bit +depth of the destination will be used, and an additional inverse +colour table will be built up internally for the call. This means that +is is imperative that destination bitmaps that have no inverse colour +table have the same bit-depth as the device belonging to the VDI +handle. +
      +

  • +
+ +
Note: It is recommended that for bitmaps outside of the +screen, v_open_bm or v_opnbm is used to create a bitmap by the VDI, +so that one does not have to look after the management of colour +tables and inverse colour tables in this case. +
  +
Pixel formats +
  +
To be able to convert bitmaps between various bit depths and +pixel formats, vr_transfer_bit requires a description of the pixel +format, which is contained in the structure element 'px_format' of +GCBITMAP. The build-up of this bit-vector is described in the +following list; however, programmers may find the pre-defined formats +to be of primary interest: +
  +
/* Constants for pixel formats */
+/* Pixel consists of one used component:
+   Color index */
+#define  PX_1COMP    0x01000000L
+/* Pixel consists of three used components,
+   e.g. RGB */
+#define  PX_3COMP    0x03000000L
+/* Pixel consists of four used components, e.g.
+   CMYK */
+#define  PX_4COMP    0x04000000L
+/* Pixel will be output in reverse byte order */
+#define  PX_REVERSED 0x00800000L
+/* Unused bits lie before the used ones
+   (viewed in Motorola format) */
+#define  PX_xFIRST   0x00400000L
+/* K lies before CMY (viewed in Motorola format) */
+#define  PX_kFIRST   0x00200000L
+/* Alpha channel lies before the color bits
+   (viewed in Motorola format) */
+#define  PX_aFIRST   0x00100000L
+/* Bits are stored sequentially */
+#define  PX_PACKED   0x00020000L
+/* Bits are distributed over several planes
+   (order: 0, 1, ..., n) */
+#define  PX_PLANES   0x00010000L
+/* Bits are distributed over several words
+   (order: 0, 1, ..., n) */
+#define  PX_IPLANES  0x00000000L
+/* 1 bit of the pixel is used */
+#define  PX_USES1    0x00000100L
+/* 2 bits of the pixel are used */
+#define  PX_USES2    0x00000200L
+/* 3 bits of the pixel are used */
+#define  PX_USES3    0x00000300L
+/* 4 bits of the pixel are used */
+#define  PX_USES4    0x00000400L
+/* 8 bits of the pixel are used */
+#define  PX_USES8    0x00000800L
+/* 15 bits of the pixel are used */
+#define  PX_USES15   0x00000f00L
+/* 16 bits of the pixel are used */
+#define  PX_USES16   0x00001000L
+/* 24 bits of the pixel are used */
+#define  PX_USES24   0x00001800L
+/* 32 bits of the pixel are used */
+#define  PX_USES32   0x00002000L
+/* 48 bits of the pixel are used */
+#define  PX_USES48   0x00003000L
+/* Pixel consists of 1 bit */
+#define  PX_1BIT     0x00000001L
+/* Pixel consists of 2 bits */
+#define  PX_2BIT     0x00000002L
+/* Pixel consists of 3 bits */
+#define  PX_3BIT     0x00000003L
+/* Pixel consists of 4 bits */
+#define  PX_4BIT     0x00000004L
+/* Pixel consists of 8 bits */
+#define  PX_8BIT     0x00000008L
+/* Pixel consists of 16 bits */
+#define  PX_16BIT    0x00000010L
+/* Pixel consists of 24 bits */
+#define  PX_24BIT    0x00000018L
+/* Pixel consists of 32 bits */
+#define  PX_32BIT    0x00000020L
+/* Pixel consists of 48 bits */
+#define  PX_48BIT    0x00000030L
+/* Mask for number of pixel components */
+#define  PX_CMPNTS   0x0f000000L
+/* Mask for various flags */
+#define  PX_FLAGS    0x00f00000L
+/* Mask for pixel format */
+#define  PX_PACKING  0x00030000L
+/* Mask for number of used bits */
+#define  PX_USED     0x00003f00L
+/* Mask for number of bits per pixel */
+#define  PX_BITS     0x0000003fL
+
+/* Pixel formats for ATARI graphics */
+#define  PX_ATARI1  ( PX_PACKED + PX_1COMP + PX_USES1 + PX_1BIT )
+#define  PX_ATARI2  ( PX_IPLANES + PX_1COMP + PX_USES2 + PX_2BIT )
+#define  PX_ATARI4  ( PX_IPLANES + PX_1COMP + PX_USES4 + PX_4BIT )
+#define  PX_ATARI8  ( PX_IPLANES + PX_1COMP + PX_USES8 + PX_8BIT )
+#define  PX_FALCON15( PX_PACKED + PX_3COMP + PX_USES16 + PX_16BIT )
+
+/* Pixel formats for Mac */
+#define  PX_MAC1    ( PX_PACKED + PX_1COMP + PX_USES1 + PX_1BIT )
+#define  PX_MAC4    ( PX_PACKED + PX_1COMP + PX_USES4 + PX_4BIT )
+#define  PX_MAC8    ( PX_PACKED + PX_1COMP + PX_USES8 + PX_8BIT )
+#define  PX_MAC15   ( PX_xFIRST + PX_PACKED + PX_3COMP + PX_USES15 + PX_16BIT )
+#define  PX_MAC32   ( PX_xFIRST + PX_PACKED + PX_3COMP + PX_USES24 + PX_32BIT )
+
+/* Pixel formats for graphics cards */
+#define  PX_VGA1    ( PX_PACKED + PX_1COMP + PX_USES1 + PX_1BIT )
+#define  PX_VGA4    ( PX_PLANES + PX_1COMP + PX_USES4 + PX_4BIT )
+#define  PX_VGA8    ( PX_PACKED + PX_1COMP + PX_USES8 + PX_8BIT )
+#define  PX_VGA15   ( PX_REVERSED + PX_xFIRST + PX_PACKED + PX_3COMP + PX_USES15 + PX_16BIT )
+#define  PX_VGA16   ( PX_REVERSED + PX_PACKED + PX_3COMP + PX_USES16 + PX_16BIT )
+#define  PX_VGA24   ( PX_REVERSED + PX_PACKED + PX_3COMP + PX_USES24 + PX_24BIT )
+#define  PX_VGA32   ( PX_REVERSED + PX_xFIRST + PX_PACKED + PX_3COMP + PX_USES24 + PX_32BIT )
+#define  PX_MATRIX16( PX_PACKED + PX_3COMP + PX_USES16 + PX_16BIT )
+#define  PX_NOVA32  ( PX_PACKED + PX_3COMP + PX_USES24 + PX_32BIT )
+
+/* Pixel formats for printers */
+#define  PX_PRN1    ( PX_PACKED + PX_1COMP + PX_USES1 + PX_1BIT )
+#define  PX_PRN8    ( PX_PACKED + PX_1COMP + PX_USES8 + PX_8BIT )
+#define  PX_PRN32   ( PX_xFIRST + PX_PACKED + PX_3COMP + PX_USES24 + PX_32BIT )
+
+/* Preferred (fast) pixel formats for bitmaps */
+#define  PX_PREF1   ( PX_PACKED + PX_1COMP + PX_USES1 + PX_1BIT )
+#define  PX_PREF2   ( PX_PACKED + PX_1COMP + PX_USES2 + PX_2BIT )
+#define  PX_PREF4   ( PX_PACKED + PX_1COMP + PX_USES4 + PX_4BIT )
+#define  PX_PREF8   ( PX_PACKED + PX_1COMP + PX_USES8 + PX_8BIT )
+#define  PX_PREF15  ( PX_xFIRST + PX_PACKED + PX_3COMP + PX_USES15 + PX_16BIT )
+#define  PX_PREF32  ( PX_xFIRST + PX_PACKED + PX_3COMP + PX_USES24 + PX_32BIT )
+
+
For programs that create (or load) bitmaps themselves and want +to output them to the screen afterwards, the last-named formats +PX_PREFx are specially recommended, as - if the screen uses a +different pixel format - they can be converted with less effort than +some of the other formats. +
  +
Return value: The function does not return a result. +
  +
Availability: As of NVDI 5.00. +
  +
If the driver offers the new rasterizing functions, then bit 1 +will be set in work_out[30] in the extended parameters of +vq_extnd. +
  +
Group: Raster functions +
  +
See also: Binding +
  + +
+ +

7.11.20 Bindings for vr_transfer_bits

+ + + + + + + + + +
C: void vr_transfer_bits( int16_t handle, GCBITMAP *src_bm, +GCBITMAP *dst_bm, RECT16 *src_rect, RECT16 *dst_rect, int16_t mode ); +
  +
Binding: +
  +
void vr_transfer_bits( int16_t handle, GCBITMAP *src_bm,
+                       GCBITMAP *dst_bm, RECT16 *src_rect,
+                       RECT16 *dst_rect, int16_t mode )
+{
+   intin[o] = mode;
+   intin[1] = 0;
+   intin[2] = 0;
+   intin[3] = 0;
+
+   ptsin[0..3] = src_rect;
+   ptsin[4..7] = dst_rect;
+
+   contrl[0] = 170;
+   contrl[1] = 4;
+   contrl[3] = 4;
+   contrl[5] = 0;
+   contrl[6] = handle;
+   contrl[7..8] = src_bm;
+   contrl[9..10] = dst_bm;
+   contrl[11..12] = 0;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]170 # Function opcode
contrl+2contrl[1]4 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]4 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+10contrl[5]0 # Sub-opcode
contrl+12contrl[6]handle
contrl+14contrl[7..8]src_bm
contrl+18contrl[9..10]dst_bm
contrl+22contrl[11..12]0
intinintin[0]mode
intin+2intin[1]0
intin+4intin[2]0
ptsinptsin[0..3]src_rect
ptsin+8ptsin[4..7]dst_rect
+
+ + +
+ +

7.11.21 vr_trnfm

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Transform form« - Transform a raster image memory +
  +
Opcode: 110 +
  +
Syntax: void vr_trnfm ( int16_t handle, MFDB *psrcMFDB, MFDB +*pdesMFDB ); +
  +
Description: The call vr_trnf transforms a raster image memory block from +standard format to a device-dependent format and vice versa. The +following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
psrcMFDB Pointer to the source MFDB +
pdesMFDB Pointer to the destination MFDB + +
+ +
The standard format mentioned above is a platform-independent +data format, which can therefore be used for interchanging data +between various GEM systems. +
  +
Notes: One can relieve the VDI of a lot of work by +specifying different raster addresses for source and destination +MFDBs; otherwise an in-place transform may well take several minutes +for a large form. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all drivers. +
  +
Group: Raster functions +
  +
See also: Binding   vro_cpyfm   vrt_cpyfm   Raster formats +
  + +
+ +

7.11.22 Bindings for vr_trnfm

+ + + + + + + + + +
C: void vr_trnfm ( int16_t handle, MFDB *psrcMFDB, MFDB *pdesMFDB +); +
  +
Binding: +
  +
void vr_trnfm (int16_t handle, MFDB *psrcMFDB, MFDB *pdesMFDB)
+{
+   iptr (psrcMFDB);
+   iptr_2 (pdesMFDB);
+
+   contrl[0] = 110;
+   contrl[1] = 0;
+   contrl[3] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]110 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]0 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+12contrl[6]handle
contrl+14contrl[7,8]psrcMFDB
contrl+18contrl[9,10]pdesMFDB
+
+ + +
+ +

7.11.23 vro_cpyfm

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Copy raster, opaque« - Copy a memory block. +
  +
Opcode: 109 +
  +
Syntax: void vro_cpyfm ( int16_t handle, int16_t vr_mode, int16_t +*pxyarray, MFDB *psrcMFDB, MFDB *pdesMFDB ); +
  +
Description: The call vro_cpyfm copies a source memory block to a +destination and during this combines the source S and destination D by +the logical linkage decoded in vr_mode. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
vr_mode One of 16 logical operations between the pixels of source and +destination rasters: +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ALL_WHITE0D := 0
S_AND_D1D := S AND D
S_AND_NOTD2D := S AND (NOT D)
S_ONLY3D := S
NOTS_AND_D4D := (NOT S) AND D
D_ONLY5D := D
S_XOR_D6D := S XOR D
S_OR_D7D := S OR D
NOT_SORD8D := NOT (S OR D)
NOT_SXORD9D := NOT (S XOR D)
D_INVERT10D := NOT D
NOT_D11D := S OR (NOT D)
S_OR_NOTD12D := NOT S
NOTS_OR_D13D := (NOT S) OR D
NOT_SANDD14D := NOT (S AND D)
ALL_BLACK15D := 1
+
+ +
  MATRIX TC-VDI: One pixel treated as unit (long value) +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
S_ADD_D16D := S + D
S_ADDS_D17D := MIN ( S + D, 1...1 )
S_SUB_D18D := S - D
S_SUBS_D19D := MAX ( S + D, 0...0 )
S_MAX_D20D := MAX ( S, D )
S_MIN_D21D := MIN ( S, D )
+
+ +
  MATRIX TC-VDI: Pixels components calc'd separate +(a,R,G,B). S_xyz == CS_xyz for bpp up to 8. +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CS_ADD_D22D := S + D
CS_ADDS_D23D := MIN ( S + D, 1...1 )
CS_SUB_D24D := S - D
CS_SUBS_D25D := MAX ( S + D, 0...0 )
CS_MAX_D26D := MAX ( S, D )
CS_MIN_D27D := MIN ( S, D )
+
+ +
pxyarray[0] X-coordinate, and +
pxyarray[1] Y-coordinate of a corner of the source rectangle +
pxyarray[2] X-coordinate, and +
pxyarray[3] Y-coordinate of the diagonally opposite corner of the source +rectangle +
pxyarray[4] X-coordinate, and +
pxyarray[5] Y-coordinate of a corner of the destination rectangle +
pxyarray[6] X-coordinate, and +
pxyarray[7] Y-coordinate of the diagonally opposite corner of the +destination rectangle +
psrcMFDB Pointer to the source MFDB +
pdesMFDB Pointer to the destination MFDB + +
+ +
Note: If the sizes of both rasters do not match, then +the size of the source raster will be used. The address of the +destination raster in that case serves only as a pointer. If the +addresses of the source and destination areas correspond (and if they +are non-zero) and if the two areas overlap, then the source rectangle +will not be altered until the destination rectangle has been copied. +
  +
vro_cpyfm usually ignores the height and width of the +destination rectangle and uses the size of the source. If you want to +scale a bitmap, you have to set the most significant bit in the +transfer mode (vr_mode | 0x8000). In this case vro_cpyfm +scales the bitmap according to the size of the destination rectangle. +Whether the driver is able to scale or not is returned by vq_extnd in +work_out[30] (you are only allowed to set the upper bit of the +mode if it is able to). +
  +
Important: Rasters in standard format cannot and +must not be copied, as in general one has no information about the +device-specific format. Hence the function vr_trnfm should be used if +necessary. +
  +
Note for NVDI: In some older printer drivers this +function unfortunately has an error, which results in bitmaps that are +only a line high possibly not being output. For this reason the passed +bitmap should be at least two lines high. +
  +
Note for TC-VDI: vr_mode from 16 to 27 are +supported only by MATRIX graphic boards. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all screen drivers. +
  +
Group: Raster functions +
  +
See also: Binding   vrt_cpyfm   vr_trnfm   Raster formats +
  + +
+ +

7.11.24 Bindings for vro_cpyfm

+ + + + + + + + + +
C: void vro_cpyfm ( int16_t handle, int16_t vr_mode, int16_t +*pxyarray, MFDB *psrcMFDB, MFDB *pdesMFDB ); +
  +
Binding: +
  +
void vro_cpyfm (int16_t handle, int16_t vr_mode,
+                int16_t *pxyarray, MFDB *psrcMFDB,
+                MFDB *pdesMFDB)
+{
+   intin[0]    = vr_mode;
+   ptsin[0..7] = pxyarray[0..7];
+   iptr (psrcMFDB);
+   iptr2 (pdesMFDB);
+
+   contrl[0] = 109;
+   contrl[1] = 4;
+   contrl[3] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]109 # Function opcode
contrl+2contrl[1]4 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]1 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+12contrl[6]handle
contrl+14contrl[7,8]psrcMFDB
contrl+18contrl[9,10]pdesMFDB
intinintin[0]vr_mode
ptsinptsin[0..7]pxyarray[0..7]
+
+ + +
+ +

7.11.25 vrt_cpyfm

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Copy raster, transparent« - Copy a monochrome raster onto a +colour raster. +
  +
Opcode: 121 +
  +
Syntax: void vrt_cpyfm ( int16_t handle, int16_t vr_mode, int16_t +*pxyarray, MFDB *psrcMFDB, MFDB *pdesMFDB, int16_t *color_index ); +
  +
Description: The call vrt_cpyfm copies a monochrome, rectangular raster onto +another (possibly coloured) raster, paying respect to the writing modes. The +following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
vr_mode Writing mode: + + + + + + + + + + + + +
1 = Replace +
2 = Transparent +
3 = XOR +
4 = Reverse Transparent + +
+ +
pxyarray[0] X-coordinate, and +
pxyarray[1] Y-coordinate of a corner of the source rectangle +
pxyarray[2] X-coordinate, and +
pxyarray[3] Y-coordinate of diagonally opposite corner of the source +rectangle +
pxyarray[4] X-coordinate, and +
pxyarray[5] Y-coordinate of a corner of the destination rectangle +
pxyarray[6] X-coordinate, and +
pxyarray[7] Y-coordinate of diagonally opposite corner of the destination +rectangle +
psrcMFDB Pointer to the source MFDB +
pdesMFDB Pointer to the destination MFDB +
color_index[0] Colour index of the colour which is to be interpreted as set +
color_index[1] Colour index of the colour which is to be interpreted as +cleared (not set) + +
+ +
Note: Should the dimensions of the rasters not match, +then the size of the source raster and the upper left corner of the +destination raster will be used as a starting point. The screen may +never be specified as the source raster. +
  +
Usually vrt_cpyfm ignores the height and width of the +destination rectangle and uses the size of the source. If you want to +scale a bitmap, you have to set the most significant bit in the +transfer mode (vr_mode | 0x8000). In this case vrt_cpyfm +scales the bitmap according to the size of the destination rectangle. +Whether the driver is able to scale or not is returned by vq_extnd in +work_out[30] (you are only allowed to set the upper bit of the +mode if it is able to). +
  +
Warning: In some older NVDI printer drivers this +function unfortunately has an error, which results in bitmaps that are +only a line high possibly not being output. For this reason the passed +bitmap should be at least two lines high. +
  +
Note for TC-VDI: TC-VDI has two new modes: +
1 - Copy multi color raster to screen +
Copy psrcMFDB (8bpp, packed pixels) to pdesMFDB (8 +or 32bpp, device-specific format). Convert VDI color numbers to pixel +values, in 32bpp expand pixel through the software palette. +
Valid modes are: REPLACE, color_index is not used, and +TRANSPARENT, color_index[0] is the transparent color (source +pixels with this color are not copied, destination is unchanged). +
Others modes have no action. +
  +
2 - Expand packed 24bpp raster to screen +
Copy psrcMFDB (24bpp, packed pixels) to pdesMFDB +(32bpp, device-specific format). Expand 24bpp source to 32bpp +destination. +
Valid mode is REPLACE, color_index is not used. +
Others modes have no action. +
  +
Return value: The function does not return a result. +
  +
Availability: Supported by all screen drivers. +
  +
Group: Raster functions +
  +
See also: Binding   vro_cpyfm   vswr_mode   Raster formats +
  + +
+ +

7.11.26 Bindings for vrt_cpyfm

+ + + + + + + + + +
C: void vrt_cpyfm ( int16_t handle, int16_t vr_mode, int16_t +*pxyarray, MFDB *psrcMFDB, MFDB *pdesMFDB, int16_t *color_index ); +
  +
Binding: +
  +
void vrt_cpyfm (int16_t handle, int16_t vr_mode,
+                int16_t *pxyarray,MFDB *psrcMFDB,
+                MFDB *pdesMFDB, int16_t *color_index)
+{
+   intin[0]    = vr_mode;
+   intin[1]    = *color_index++;
+   intin[2]    = *color_index;
+   ptsin[0..7] = pxyarray[0..7];
+
+   iptr (psrcMFDB);
+   iptr_2 (pdesMFDB);
+
+   contrl[0] = 121;
+   contrl[1] = 4;
+   contrl[3] = 3;
+   contrl[6] = handle;
+
+   vdi ();
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]121 # Function opcode
contrl+2contrl[1]4 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]3 # Entry in intin
contrl+8contrl[4]0 # Entry in intout
contrl+12contrl[6]handle
contrl+14contrl[7,8]psrcMFDB
contrl+18contrl[9,10]pdesMFDB
intinintin[0]vr_mode
intin+2intin[1..2]color_index[0..1]
ptsinptsin[0..7]pxyarray[0..7]
+
+ + +
+ +

7.11.27 vs_hilite_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set hilite colour« - Set the highlighting colour. +
  +
Opcode: 207 (Sub-Opcode 0) +
  +
Syntax: int16_t vs_hilite_color( int16_t handle, int32_t color_space, +COLOR_ENTRY *hilite_color ); +
  +
Description: The call vs_hilite_color sets the highlighting colour. The +following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
color_space Colour space (at present only 0 for the colour space set, or +CSPACE_RGB) +
hilite_color COLOR_ENTRY of the highlighting colour + +
+ +
Return value: -1 = Wrong subfunction number +
 0 = Function not present +
 1 = All OK +
  +
Availability: As of NVDI 5.00. +
  +
Group: Raster functions +
  +
See also: Binding +
  + +
+ +

7.11.28 Bindings for vs_hilite_color

+ + + + + + + + + +
C: int16_t vs_hilite_color( int16_t handle, int32_t color_space, +COLOR_ENTRY *hilite_color ); +
  +
Binding: +
  +
int16_t vs_hilite_color( int16_t handle, int32_t color_space,
+                         COLOR_ENTRY *hilite_color )
+{
+   intin[0..1]    = color_space;
+   intin[2..5]    = hilite_color;
+
+   contrl[0] = 207;
+   contrl[1] = 0;
+   contrl[3] = 6;
+   contrl[5] = 0;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]207 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]6 # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+10contrl[5]0 # Sub-opcode
contrl+12contrl[6]handle
intinintin[0..1]color_space
intin+4intin[2..5]hilite_color
intoutintout[0]Return value
+
+ + +
+ +

7.11.29 vs_max_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set maximum colour« - Set maximum colour value for a +additive raster operation. +
  +
Opcode: 207 (Sub-Opcode 2) +
  +
Syntax: int16_t vs_max_color( int16_t handle, int32_t color_space, +COLOR_ENTRY *max_color ); +
  +
Description: The call vs_max_color sets the maximum colour value for an +additive raster operation. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
color_space Colour space (at present only 0 for the colour space set, or +CSPACE_RGB) +
max_color COLOR_ENTRY of the maximum colour value for T_SUB + +
+ +
Return value: -1 = Wrong subfunction number +
 0 = Function not present +
 1 = All OK +
  +
Availability: As of NVDI 5.00. +
  +
Group: Raster functions +
  +
See also: Binding +
  + +
+ +

7.11.30 Bindings for vs_max_color

+ + + + + + + + + +
C: int16_t vs_max_color( int16_t handle, int32_t color_space, +COLOR_ENTRY *max_color ); +
  +
Binding: +
  +
int16_t vs_max_color( int16_t handle, int32_t color_space,
+                      COLOR_ENTRY *max_color )
+{
+   intin[0..1]    = color_space;
+   intin[2..5]    = max_color;
+
+   contrl[0] = 207;
+   contrl[1] = 0;
+   contrl[3] = 6;
+   contrl[5] = 2;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]207 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]6 # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+10contrl[5]2 # Sub-opcode
contrl+12contrl[6]handle
intinintin[0..1]color_space
intin+4intin[2..5]max_color
intoutintout[0]Return value
+
+ + +
+ +

7.11.31 vs_min_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set minimum colour« - Set minimum colour value for a +subtractive raster operation. +
  +
Opcode: 207 (Sub-Opcode 1) +
  +
Syntax: int16_t vs_min_color( int16_t handle, int32_t color_space, +COLOR_ENTRY *min_color ); +
  +
Description: The call vs_min_color sets the minimum colour value for a +subtractive raster operation. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
color_space Colour space (at present only 0 for the colour space set, or +CSPACE_RGB) +
min_color COLOR_ENTRY of the minimum colour value for T_SUB + +
+ +
Return value: -1 = Wrong subfunction number +
 0 = Function not present +
 1 = All OK +
  +
Availability: As of NVDI 5.00. +
  +
Group: Raster functions +
  +
See also: Binding +
  + +
+ +

7.11.32 Bindings for vs_min_color

+ + + + + + + + + +
C: int16_t vs_min_color( int16_t handle, int32_t color_space, +COLOR_ENTRY *min_color ); +
  +
Binding: +
  +
int16_t vs_min_color( int16_t handle, int32_t color_space,
+                      COLOR_ENTRY *min_color )
+{
+   intin[0..1]    = color_space;
+   intin[2..5]    = min_color;
+
+   contrl[0] = 207;
+   contrl[1] = 0;
+   contrl[3] = 6;
+   contrl[5] = 1;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]207 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]6 # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+10contrl[5]1 # Sub-opcode
contrl+12contrl[6]handle
intinintin[0..1]color_space
intin+4intin[2..5]min_color
intoutintout[0]Return value
+
+ + +
+ +

7.11.33 vs_weight_color

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set weight colour« - Set weighting for blend function. +
  +
Opcode: 207 (Sub-Opcode 3) +
  +
Syntax: int16_t vs_weight_color( int16_t handle, int32_t color_space, +COLOR_ENTRY *weight_color ); +
  +
Description: The call vs_weight_color sets the weighting for the colour +blend function. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Workstation identifier +
color_space Colour space (at present only 0 for the colour space set, or +CSPACE_RGB) +
weight_color COLOR_ENTRY of the weighting for T_SUB + +
+ +
Return value: -1 = Wrong subfunction number +
 0 = Function not present +
 1 = All OK +
  +
Availability: As of NVDI 5.00. +
  +
Group: Raster functions +
  +
See also: Binding +
  + +
+ +

7.11.34 Bindings for vs_weight_color

+ + + + + + + + + +
C: int16_t vs_weight_color( int16_t handle, int32_t color_space, +COLOR_ENTRY *weight_color ); +
  +
Binding: +
  +
int16_t vs_weight_color( int16_t handle, int32_t color_space,
+                         COLOR_ENTRY *weight_color )
+{
+   intin[0..1]    = color_space;
+   intin[2..5]    = weight_color;
+
+   contrl[0] = 207;
+   contrl[1] = 0;
+   contrl[3] = 6;
+   contrl[5] = 3;
+   contrl[6] = handle;
+
+   vdi ();
+
+   return ( intout[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
contrlcontrl[0]207 # Function opcode
contrl+2contrl[1]0 # Entry in ptsin
contrl+4contrl[2]0 # Entry in ptsout
contrl+6contrl[3]6 # Entry in intin
contrl+8contrl[4]1 # Entry in intout
contrl+10contrl[5]3 # Sub-opcode
contrl+12contrl[6]handle
intinintin[0..1]color_space
intin+4intin[2..5]weight_color
intoutintout[0]Return value
+
+ + +
+ +
+ +Home +VDIVDI +Control functionsControl functions +TC-VDI functionsTC-VDI functions + + diff --git a/en/vdi_structures.html b/en/vdi_structures.html new file mode 100644 index 000000000..f28c3f7b3 --- /dev/null +++ b/en/vdi_structures.html @@ -0,0 +1,493 @@ + + + + + +The documentation for TOS: VDI structures + + + + + + + + + +Home +VDIVDI +VDI functions listVDI functions list +AESAES + +
+ +

7.14 VDI structures

+ +
+

7.14.1 VDIPB

+
typedef struct
+{
+   int16_t  *contrl;    /* Pointer to contrl array */
+   int16_t  *intin;     /* Pointer to intin array  */
+   int16_t  *ptsin;     /* Pointer to ptsin array  */
+   int16_t  *intout;    /* Pointer to intout array */
+   int16_t  *ptsout;    /* Pointer to ptsout array */
+} VDIPB;
+
+

7.14.2 BIT_IMAGE

+
typedef struct
+{
+   int16_t   nbplanes;
+   int16_t   width;
+   int16_t   height;
+} BIT_IMAGE;
+
+

7.14.3 COLOR_ENTRY

+

The union COLOR_ENTRY contains the colour table entry. In +future, colour spaces other than RGB may be available: +

+
typedef union
+{
+   COLOR_RGB   rgb;
+   COLOR_CMYK  cmyk;
+} COLOR_ENTRY;
+
+

7.14.4 COLOR_RGB

+
typedef struct
+{
+   uint16   reserved;     /* Set to 0 or the index of the entry */
+   uint16   red;          /* Red:   0<->65535 */
+   uint16   green;        /* Green: 0<->65535 */
+   uint16   blue;         /* Blue:  0<->65535 */
+} COLOR_RGB;
+
+

If the colour data in a program is present in a sensible format +(e.g. 8 bits per channel) already, one can save oneself a +transformation with multiplication and division. The Shift and OR +functions of the processor perform this faster and more elegantly. +eleganter. +

+

Example: The colour value is described by the byte +variables r, g, b. The correct conversion to the 16-bit format of the +COLOR_RGB structure proceeds as follows: +

+
COLOR_RGB color;
+
+color.reserved = 0;
+
+color.red = r;
+color.red |= (color.red << 8);
+
+color.green = g;
+color.green |= (color.green << 8);
+
+color.blue = b;
+color.blue |= (color.blue << 8);
+
+

The structure element reserved should be set to 0 or +(for building up a colour table) contain the index of the entry. In +each case, however, the upper 8 bits of reserved must be set +to 0, as they may be used by the colour routines for some flags. +

+

7.14.5 COLOR_TAB

+
typedef struct                    /* Colour table                    */
+{
+   int32 magic;                   /* 'ctab'                          */
+   int32 length;
+   int32 format;                  /* Format (0)                      */
+   int32 reserved;                /* Reserved, set to 0              */
+   int32 map_id;                  /* Colour table ID                 */
+   int32 color_space;             /* Colour space (at present only
+                                     CSPACE_RGB)                     */
+   int32 flags;                   /* VDI-internal flags, set to 0    */
+   int32 no_colors;               /* Number of colour entries        */
+   int32 reserved1;               /* Reserved, must be 0             */
+   int32 reserved2;               /* Reserved, must be 0             */
+   int32 reserved3;               /* Reserved, must be 0             */
+   int32 reserved4;               /* Reserved, must be 0             */
+   COLOR_ENTRY colors[];
+} COLOR_TAB;
+
+

7.14.6 fix31

+

The data type fix31 corresponds to the type LONG, and is +required in connection with vector fonts where one calculates +positions and steps in 1/65536. Here the width of a pixel corresponds +to the value 65536. The upper 16 bits represent the whole number +part and the lower 16 bits the decimal part of the number. +

+

Examples: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
HexDec 
$00010000655361.0 pixels
$0001c0001146881.75 pixels
$fffec000-81920-1.25 pixels
$fffe4000-114688-1.75 pixels
+
+ +

Important: The decimal part may never be cut +off! +

+

If you add advance widths (returned by vqt_advance) and you +would like to determine the discrete coordinate for cursor placement, +you should use the following code: +

+
int16_t fix31_to_pixel( fix31 a )
+{
+   int16_t b;
+
+   b = (int16_t) (( a + 32768L ) >> 16 ); /* Round !! */
+   return( b );                           /* Return pixel value */
+}
+
+

See also: GDOS   NVDI   SpeedoGDOS +

+

7.14.7 FONT_HDR

+ +

The following structure describes the file-header for a bitmap +font in the Digital Research standard format. In this format +the font is organised as a wide, monochrome raster image; the width of +the raster is the sum of all character widths, the raster height +corres- ponds to the height of a single character. From this +follows: The left edge of a character does not necessarily +have to fall on a byte boundary; only the end of each raster line is +filled with NULL- bits so that the next line falls on a WORD boundary +again. +

+
typedef struct font_hdr
+{
+   int16_t     font_id;        /* Font number                        */
+   int16_t     point;          /* Size in points                     */
+   int8_t      name[32];       /* Name of the font                   */
+   uint16_t    first_ade;      /* First character in font            */
+   uint16_t    last_ade;       /* Last character in font             */
+   uint16_t    top;            /* Distance: Top line    <-> Baseline */
+   uint16_t    ascent;         /* Distance: Ascent line <-> Baseline */
+   uint16_t    half;           /* Distance: Half line   <-> Baseline */
+   uint16_t    descent;        /* Distance: Descent line<-> Baseline */
+   uint16_t    bottom;         /* Distance: Bottom line <-> Baseline */
+   uint16_t    max_char_width; /* Largest character width            */
+   uint16_t    max_cell_width; /* Largest character cell width       */
+   uint16_t    left_offset;    /* Left offset for italic (skewed)    */
+   uint16_t    right_offset;   /* Right offset for italic (skewed)   */
+   uint16_t    thicken;        /* Thickening factor for bold         */
+   uint16_t    ul_size;        /* Width of underline                 */
+   uint16_t    lighten;        /* Mask for light (0x5555)            */
+   uint16_t    skew;           /* Mask for italic (0x5555)           */
+   uint16_t    flags;          /* Various flags:
+                                  Set for system font
+                                   Bit 1: Set if horizontal offset
+                                          table is in use
+                                   Bit 2: Set if Motorola format
+                                   Bit 3: Set if non-proportional    */
+   uint8_t     *hor_table;     /* Pointer to horizontal offset table */
+   uint16_t    *off_table;     /* Pointer to character offset table  */
+   uint16_t    *dat_table;     /* Pointer to font image              */
+   uint16_t    form_width;     /* Width of the font image            */
+   uint16_t    form_height;    /* Height of the font image           */
+   font_hdr    *next_font;     /* Pointer to next font header        */
+} FONT_HDR;
+
+

Note: As GEM was originally developed on the PC, all +data is normally in the Intel format, so that on computers +with Motorola processors we have to swap the upper and lower bytes of +all words. Warning: To be able to interrogate the +Motorola/Intel flag (bit 2 of the component flags), one must +actually know already in which format the font is present. The +solution to this problem: Start from the assumption that bit 10 of the +flag will never be used and test whether bit 2 of the 67th byte of the +header is set (because then the font is present in the Motorola +format). +

+ +

The character offset table contains entries of 16-bit +values that hold the horizontal pixel offsets for each character +within the font raster. So for the index one must use the character's +ASCII code minus the ASCII code of the first character in the font +(component first_ade). The width of a character results from +the difference to the offset value of the next higher character; so +that this formula works for the last character as well, the table +always has one more entry than the number of characters available. +

+ +

The horizontal offset table contains positive or +negative offset values that are added to the X-poisition before the +output of a character; however, this is supported only for a few +fonts. +

+

Last but not least one should point out that a normal +application should never have to deal with this format; this +infomation is of importance only for developers of font editors or +GDOS versions. +

+

See also: +
GDOS   NVDI   SpeedoGDOS   Vector fonts   vst_alignment   +vst_load_fonts   vst_unload_fonts   vqt_fontheader +

+

7.14.8 GCBITMAP

+
/*
+ * Published bitmap description (structure
+ * with version header)
+ */
+typedef struct _gcbitmap
+{
+   LONG       magic;      /* Structure identifier 'cbtm' */
+   LONG       length;     /* Structure length */
+   LONG       format;     /* Structure format (0) */
+   LONG       reserved;   /* Reserved (0) */
+   BYTE       *addr;      /* Address of bitmap */
+   LONG       width;      /* Width of a line in bytes */
+   LONG       bits;       /* Bit-depth */
+   ULONG      px_format;  /* Pixel format */
+   LONG       xmin;       /* Minimum discrete
+                             X-coordinate of bitmap */
+   LONG       ymin;       /* Minimum discrete
+                             Y-coordinate of bitmap */
+   LONG       xmax;       /* Maximum discrete
+                             X-coordinate of bitmap + 1 */
+   LONG       ymax;       /* Maximum discrete
+                             Y-coordinate of bitmap + 1 */
+   CTAB_REF   ctab;       /* Reference to color table,
+                             or 0L */
+   ITAB_REF   itab;       /* Reference to inverse color
+                             table, or 0L */
+   LONG       reserved0;  /* Reserved, must be 0 */
+   LONG       reserved1;  /* Reserved, must be 0 */
+} GCBITMAP;
+
+

See also: NVDI   v_open_bm   vr_transfer_bits +

+

7.14.9 MFDB

+

The Memory Form Definition Block +is a data structure that is used by the VDI to describe destination +and source memory blocks for raster operations. +

+

C-declaration: +

+
typedef struct mfdb
+{
+   VOID *fd_addr;                /* Pointer to the start of the
+                                    memory block, e.g. the
+                                    screen memory base address  */
+   WORD  fd_w;                   /* Width in pixels             */
+   WORD  fd_h;                   /* Height in pixels            */
+   WORD  fd_wdwidth;             /* Width of a line in words    */
+   WORD  fd_stand;               /* 0 = Device-specific format  */
+                                 /* 1 = Standard format         */
+   WORD  fd_nplanes;             /* Number of planes            */
+   WORD  fd_r1, fd_r2, fd_r3;    /* Reserved, must be 0         */
+} MFDB;
+
+

Note: If the component fd_addr contains a 0, the +rest of the MFDB does not have to be filled out. The raster operations +vrt_cpyfm and vro_cpyfm then automatically refer to the screen (or, in +the case of a printer driver to the printer bitmap). The reserved +words fd_r1, fd_r2 and fd_r3 should be set to +0 to cater for future extensions! +

+

See also: Raster formats   Raster functions +

+

7.14.10 POINT16

+
typedef struct                     /* Point for 16-bit coordinates */
+{
+   int16 x;
+   int16 y;
+} POINT16;
+
+

7.14.11 POINT32

+
typedef struct                     /* Point for 32-bit coordinates */
+{
+   int32 x;
+   int32 y;
+} POINT32;
+
+

7.14.12 pxyarray

+

pxyarray is used in VDI to depict various graphical objects +based on several coordinate pairs (x,y). Examples for the use of a +pxyarray are for the depiction of rectangles: +

+
+ + + + + + + + + + + + + + + + +
pxyarray[0]X-coordinate of the top left corner point
pxyarray[1]Y-coordinate of the top left corner point
pxyarray[2]X-coordinate of the bottom right corner point
pxyarray[3]Y-coordinate of the bottom right corner point
+
+ +

Or generally, for n point-pairs: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
pxyarray[0]X-coordinate of the first point-pair
pxyarray[1]Y-coordinate of the first point-pair
pxyarray[2]X-coordinate of the second point-pair
pxyarray[3]Y-coordinate of the second point-pair
: 
: 
: 
pxyarray[2*n - 2]X-coordinate of the n-th point-pair
pxyarray[2*n - 1]Y-coordinate of the n-th point-pair
+
+ +

See also: About the VDI   VDI bindings +

+

7.14.13 RECT16

+
typedef struct                 /* Rectangle for 16-bit coordinates */
+{
+   int16 x1;
+   int16 y1;
+   int16 x2;
+   int16 y2;
+} RECT16;
+
+

7.14.14 RECT32

+
typedef struct                 /* Rectangle for 32-bit coordinates */
+{
+   int32 x1;
+   int32 y1;
+   int32 x2;
+   int32 y2;
+} RECT32;
+
+

7.14.15 XFNT_INFO

+
typedef struct
+{
+   int32_t  size;             /* Length of the structure; initialize
+                                 this entry before calling vqt_xfntinfo  */
+   int16_t  format;           /* Font format, e.g. 4 for TrueType        */
+   int16_t  id;               /* Font ID, e.g. 6059                      */
+   int16_t  index;            /* Index                                   */
+   int8_t  font_name[50];     /* Font name, e.g. "Century 725 Italic BT" */
+   int8_t  family_name[50];   /* Font family name, e.g. "Century725 BT"  */
+   int8_t  style_name[50];    /* Font style name, e.g. "Italic"          */
+   int8_t  file_name1[200];   /* Name and path of the first font file,   */
+                              /* e.g. "C:\FONTS\TT1059M_.TTF"            */
+   int8_t  file_name2[200];   /* Name of the 2nd font file               */
+   int8_t  file_name3[200];   /* Name of the 3rd font file               */
+   int16_t  pt_cnt;           /* Number of available point sizes         */
+                              /* (vst_point), e.g. 10                    */
+   int16_t  pt_sizes[64];     /* Available point sizes, e.g. { 8, 9, 10, */
+                              /*            11, 12, 14, 18, 24, 36, 48 } */
+} XFNT_INFO;
+
+

Note: So that the information can be entered in the +structure, the size of the structure must be entered into the +component size. +

+

The following apply for the component format: +

+
+ + + + + + + + + + + + + + + + + + + + +
1=Bitmap font
2=Speedo font
4=TrueType font
8=Type-1 font
+
+ +

All character strings are NULL-terminated strings in C format. +Structure elements that are not demanded have no defined +contents. +

+

See also: GEM   NVDI   vqt_xfntinfo +

+
+ +Home +VDIVDI +VDI functions listVDI functions list +AESAES + + diff --git a/en/vidix_xbios_extension.html b/en/vidix_xbios_extension.html new file mode 100644 index 000000000..227f69f4c --- /dev/null +++ b/en/vidix_xbios_extension.html @@ -0,0 +1,1389 @@ + + + + + +The documentation for TOS: VIDIX XBIOS extension + + + + + + + + + +Home +XBIOSXBIOS +Keyboard functionsKeyboard functions +XBIOS function listXBIOS function list + +
+ +

4.22 VIDIX XBIOS extension

+

VIDIX (VIDeo Interface for *niX) is a +programming interface for Unix-like operating systems that allows +direct access to the framebuffer of a video card. VIDIX integration +inside TOS (for CT60/CTPCI/Firebee) was added on January 24, 2007. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
vdxConfigPlayback      Prepare BES (BackEnd Scaler). +
vdxDestroy             Quit driver. +
vdxGetCapability       Get capability. +
vdxGetGrKeys           Get graphic keys. +
vdxGetVersion          Get version. +
vdxInit                Initialize driver. +
vdxPlaybackCopyFrame   Copy frame with DMA. +
vdxPlaybackFrameSelect Prepare frame. +
vdxPlaybackGetDeint    Get interlacing. +
vdxPlaybackGetEq       Get color correction. +
vdxPlaybackOff         Deactivate BES (BackEnd Scaler). +
vdxPlaybackOn          Activate BES (BackEnd Scaler). +
vdxPlaybackSetDeint    Set interlacing. +
vdxPlaybackSetEq       Set color correction. +
vdxProbe               Probe the board. +
vdxQueryDMAStatus      Get DMA status. +
vdxQueryFourcc         Request fourcc. +
vdxSetGrKeys           Set graphic keys. + +
+ +

4.22.1 vdxConfigPlayback

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »vdxConfigPlayback« - Prepare BES (BackEnd Scaler). +
  +
Opcode: 406 (0x0196) +
  +
Syntax: int32_t vdxConfigPlayback ( vidix_playback_t *info ) ; +
  +
Description: Driver should prepare BES on this call. +
  +
APP pass to driver the following info: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Field Meaning +
vidix_playback_t.fourcc Contains fourcc of movie. +
vidix_playback_t.capability Currently contains a copy of vidix_capability_t.flags. +
vidix_playback_t.blend_factor Currently unused. +
vidix_playback_t.src x,y,w,h fields contain original movie size (in pixels) x and y +often are nulls. +
vidix_playback_t.src.pitch y, u, v fields contain source pitches for each Y,U,V plane in +bytes (For packed fourcc only Y value is used). They are hints for +driver to use same destinition pitches as in source memory (to speed +up memcpy process). Note: when source pitches are unknown or variable +these field will be filled into 0. +
vidix_playback_t.dest x,y,w,h fields contains destination rectangle on the screen in +pixels. +
vidix_playback_t.num_frames Maximal # of frames which can be used by APP. (Currently 10). + +
+ +
Driver should fill following fields: +
  + + + + + + + + + + + + + + + + + + + + + +
Field Meaning +
vidix_playback_t.num_frames Real # of frames which will be used by driver. (Should be less +or equal to app's num_frames). +
vidix_playback_t.dest.pitch y, u, v fields should contain alignment for each Y,U,V plane in +bytes. (For packed fourcc only Y value is used). +
vidix_playback_t.frame_size Driver should tell to app which size of source frame (src.w and +src.h) should use APP (according to pitches and offsets). +
vidix_playback_t.offsets Offsets from begin of BES memory for each frame. +
vidix_playback_t.offset y, u, v fields should contain offset for each Y,U,V plane +within frame. (For packed fourcc only Y value is used). +
vidix_playback_t.dga_addr Address of BES memory. + +
+ +
Also see this picture: +
  +
    VIDEO MEMORY layout:
+     +-----------  It's begin of video memory     End of video memory--------------+
+     |                                                                             |
+     v                                                                             v
+     [      RGB memory                         |         YUV memory    |  UNDEF    ]
+                                               ^
+                                               |
+                                               +---- begin of BES memory
+    BES MEMORY layout:
+     +-------- begin of BES memory
+     |
+     v
+     [ | |                      |       |       |
+       ^ ^                      ^       ^       ^
+       | |                      |       |       + BEGIN of second frame
+       | |                      |       + BEGIN of V plane
+       | |                      + BEGIN of U plane
+       | +------- BEGIN of Y plane
+       |
+       +--------- BEGIN of first frame
+
+
This means that in general case: +
offset of frame != offset of BES +
offset of Y plane != offset of first frame +
  +
But often: vidix_playback_t.offsets[0] = vidix_playback_t.offset.y = 0; +
  +
Formula: (For Y plane) copy source to: vidix_playback_t.dga_addr + +vidix_playback_t.offsets[i] + vidix_playback_t.offset.y +
  +
Return value: Driver should return 0. +
  +
Availability: CT60/CTPCI hardware acceleration board and FireBee. +
  +
Group: VIDIX XBIOS extension +
  +
See also: Binding   vdxPlaybackCopyFrame   vdxPlaybackFrameSelect   +vdxQueryDMAStatus   vdxQueryFourcc +
  + +
+ +

4.22.1.1 Bindings for vdxConfigPlayback

+ + + + + + +
C: int32_t vdxConfigPlayback ( vidix_playback_t *info ); +
  +
Assembler: +
  +
pea       info         ; Offset 2
+move.w    #406,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.22.2 vdxDestroy

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »vdxDestroy« - Quit driver. +
  +
Opcode: 403 (0x0193) +
  +
Syntax: void vdxDestroy ( void ) ; +
  +
Description: Quit the VIDIX driver. +
  +
Warning: This function is optional. +
  +
Return value: Nothing. +
  +
Availability: CT60/CTPCI hardware acceleration board and FireBee. +
  +
Group: VIDIX XBIOS extension +
  +
See also: Binding   vdxInit +
  + +
+ +

4.22.2.1 Bindings for vdxDestroy

+ + + + + + +
C: void vdxDestroy ( void ); +
  +
Assembler: +
  +
move.w    #403,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

4.22.3 vdxGetCapability

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »vdxGetCapability« - Get capability. +
  +
Opcode: 404 (0x0194) +
  +
Syntax: int32_t vdxGetCapability ( vidix_capability_t *to ) ; +
  +
Description: Driver should return capability with filled +vidix_capability_t.type field. +
  +
Return value: Driver should return 0. +
  +
Availability: CT60/CTPCI hardware acceleration board and FireBee. +
  +
Group: VIDIX XBIOS extension +
  +
See also: Binding   vdxGetVersion   vdxProbe +
  + +
+ +

4.22.3.1 Bindings for vdxGetCapability

+ + + + + + +
C: int32_t vdxGetCapability ( vidix_capability_t *to ); +
  +
Assembler: +
  +
pea       to           ; Offset 2
+move.w    #404,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.22.4 vdxGetGrKeys

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »vdxGetGrKeys« - Get graphic keys. +
  +
Opcode: 410 (0x019a) +
  +
Syntax: int32_t vdxGetGrKeys ( vidix_grkey_t *grkey ) ; +
  +
Description: This interface should be tuned but introduced for overlapped +playback and video effects (TYPE_FX). +
  +
Warning: This function is optional. +
  +
Return value: Driver should return 0. +
  +
Availability: CT60/CTPCI hardware acceleration board and FireBee. +
  +
Group: VIDIX XBIOS extension +
  +
See also: Binding   vdxSetGrKeys +
  + +
+ +

4.22.4.1 Bindings for vdxGetGrKeys

+ + + + + + +
C: int32_t vdxGetGrKeys ( vidix_grkey_t *grkey ); +
  +
Assembler: +
  +
pea       grkey        ; Offset 2
+move.w    #410,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.22.5 vdxGetVersion

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »vdxGetVersion« - Get version. +
  +
Opcode: 400 (0x0190) +
  +
Syntax: unsigned vdxGetVersion ( void ) ; +
  +
Description: Get the version. +
  +
Return value: Version. +
  +
Availability: CT60/CTPCI hardware acceleration board and FireBee. +
  +
Group: VIDIX XBIOS extension +
  +
See also: Binding   vdxGetCapability   vdxProbe +
  + +
+ +

4.22.5.1 Bindings for vdxGetVersion

+ + + + + + +
C: unsigned vdxGetVersion ( void ); +
  +
Assembler: +
  +
move.w    #400,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

4.22.6 vdxInit

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »vdxInit« - Initialize driver. +
  +
Opcode: 402 (0x0192) +
  +
Syntax: int32_t vdxInit ( void ) ; +
  +
Description: Initialize the VIDIX driver. +
  +
Warning: This function is optional. +
  +
Return value: Driver should return 0. +
  +
Availability: CT60/CTPCI hardware acceleration board and FireBee. +
  +
Group: VIDIX XBIOS extension +
  +
See also: Binding   vdxDestroy +
  + +
+ +

4.22.6.1 Bindings for vdxInit

+ + + + + + +
C: int32_t vdxInit ( void ); +
  +
Assembler: +
  +
move.w    #402,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

4.22.7 vdxPlaybackCopyFrame

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »vdxPlaybackCopyFrame« - Copy frame with DMA. +
  +
Opcode: 416 (0x01a0) +
  +
Syntax: int32_t vdxPlaybackCopyFrame ( vidix_dma_t *dmai ) ; +
  +
Description: Function for copy frame with the DMA. +
  +
Warning: This function is optional. +
  +
Return value: Driver should return 0 else EINVAL, ERANGE, ENOMEM, E2BIG or +ENOSYS. +
  +
Availability: CT60/CTPCI hardware acceleration board and FireBee. +
  +
Group: VIDIX XBIOS extension +
  +
See also: Binding   vdxConfigPlayback   vdxPlaybackFrameSelect   +vdxQueryDMAStatus   vdxQueryFourcc +
  + +
+ +

4.22.7.1 Bindings for vdxPlaybackCopyFrame

+ + + + + + +
C: int32_t vdxPlaybackCopyFrame ( vidix_dma_t *dmai ); +
  +
Assembler: +
  +
pea       dma          ; Offset 2
+move.w    #416,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.22.8 vdxPlaybackFrameSelect

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »vdxPlaybackFrameSelect« - Prepare frame. +
  +
Opcode: 409 (0x0199) +
  +
Syntax: int32_t vdxPlaybackFrameSelect ( uint32_t frame ) ; +
  +
Description: Driver should prepare and activate corresponded frame. This +function is used only for double and triple buffering and never used +for single buffering playback. +
  +
Warning: This function is optional. +
  +
Return value: Driver should return 0. +
  +
Availability: CT60/CTPCI hardware acceleration board and FireBee. +
  +
Group: VIDIX XBIOS extension +
  +
See also: Binding   vdxConfigPlayback   vdxPlaybackCopyFrame   +vdxQueryDMAStatus   vdxQueryFourcc +
  + +
+ +

4.22.8.1 Bindings for vdxPlaybackFrameSelect

+ + + + + + +
C: int32_t vdxPlaybackFrameSelect ( uint32_t frame ); +
  +
Assembler: +
  +
move.l    frame,-(sp)  ; Offset 2
+move.w    #409,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.22.9 vdxPlaybackGetDeint

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »vdxPlaybackGetDeint« - Get interlacing. +
  +
Opcode: 414 (0x019e) +
  +
Syntax: int32_t vdxPlaybackGetDeint ( vidix_deinterlace_t *info ) ; +
  +
Description: Function for get interlacing. +
  +
Warning: This function is optional. +
  +
Return value: Driver should return 0. +
  +
Availability: CT60/CTPCI hardware acceleration board and FireBee. +
  +
Group: VIDIX XBIOS extension +
  +
See also: Binding   vdxPlaybackSetDeint +
  + +
+ +

4.22.9.1 Bindings for vdxPlaybackGetDeint

+ + + + + + +
C: int32_t vdxPlaybackGetDeint ( vidix_deinterlace_t *info ); +
  +
Assembler: +
  +
pea       info         ; Offset 2
+move.w    #414,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.22.10 vdxPlaybackGetEq

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »vdxPlaybackGetEq« - Get color correction. +
  +
Opcode: 412 (0x019c) +
  +
Syntax: int32_t vdxPlaybackGetEq ( vidix_video_eq_t *eq ) ; +
  +
Description: Function for get color correction. +
  +
Warning: This function is optional. +
  +
Return value: Driver should return 0. +
  +
Availability: CT60/CTPCI hardware acceleration board and FireBee. +
  +
Group: VIDIX XBIOS extension +
  +
See also: Binding   vdxPlaybackSetEq +
  + +
+ +

4.22.10.1 Bindings for vdxPlaybackGetEq

+ + + + + + +
C: int32_t vdxPlaybackGetEq ( vidix_video_eq_t *eq ); +
  +
Assembler: +
  +
pea       eq           ; Offset 2
+move.w    #412,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.22.11 vdxPlaybackOff

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »vdxPlaybackOff« - Deactivate BES. +
  +
Opcode: 408 (0x0198) +
  +
Syntax: int32_t vdxPlaybackOff ( void ) ; +
  +
Description: Driver should deactivate BES on this call. +
  +
Return value: Driver should return 0. +
  +
Availability: CT60/CTPCI hardware acceleration board and FireBee. +
  +
Group: VIDIX XBIOS extension +
  +
See also: Binding   vdxPlaybackOn +
  + +
+ +

4.22.11.1 Bindings for vdxPlaybackOff

+ + + + + + +
C: int32_t vdxPlaybackOff ( void ); +
  +
Assembler: +
  +
move.w    #408,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

4.22.12 vdxPlaybackOn

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »vdxPlaybackOn« - Activate BES. +
  +
Opcode: 407 (0x0197) +
  +
Syntax: int32_t vdxPlaybackOn ( void ) ; +
  +
Description: Driver should activate BES on this call. +
  +
Return value: Driver should return 0. +
  +
Availability: CT60/CTPCI hardware acceleration board and FireBee. +
  +
Group: VIDIX XBIOS extension +
  +
See also: Binding   vdxPlaybackOff +
  + +
+ +

4.22.12.1 Bindings for vdxPlaybackOn

+ + + + + + +
C: int32_t vdxPlaybackOn ( void ); +
  +
Assembler: +
  +
move.w    #407,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

4.22.13 vdxPlaybackSetDeint

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »vdxPlaybackSetDeint« - Set interlacing. +
  +
Opcode: 415 (0x019f) +
  +
Syntax: int32_t vdxPlaybackSetDeint ( vidix_deinterlace_t *info ) ; +
  +
Description: Function for set interlacing. +
  +
Warning: This function is optional. +
  +
Return value: Driver should return 0. +
  +
Availability: CT60/CTPCI hardware acceleration board and FireBee. +
  +
Group: VIDIX XBIOS extension +
  +
See also: Binding   vdxPlaybackGetDeint +
  + +
+ +

4.22.13.1 Bindings for vdxPlaybackSetDeint

+ + + + + + +
C: int32_t vdxPlaybackSetDeint ( vidix_deinterlace_t *info ); +
  +
Assembler: +
  +
pea       info         ; Offset 2
+move.w    #415,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.22.14 vdxPlaybackSetEq

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »vdxPlaybackSetEq« - Set color correction. +
  +
Opcode: 413 (0x019d) +
  +
Syntax: int32_t vdxPlaybackSetEq ( vidix_video_eq_t *eq ) ; +
  +
Description: Function for set color correction. +
  +
Warning: This function is optional. +
  +
Return value: Driver should return 0. +
  +
Availability: CT60/CTPCI hardware acceleration board and FireBee. +
  +
Group: VIDIX XBIOS extension +
  +
See also: Binding   vdxPlaybackGetEq +
  + +
+ +

4.22.14.1 Bindings for vdxPlaybackSetEq

+ + + + + + +
C: int32_t vdxPlaybackSetEq ( vidix_video_eq_t *eq ); +
  +
Assembler: +
  +
pea       eq           ; Offset 2
+move.w    #413,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.22.15 vdxProbe

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »vdxProbe« - Probe the board. +
  +
Opcode: 401 (0x0191) +
  +
Syntax: int32_t vdxProbe ( int32_t verbose, int32_t force ) ; +
  +
Description: Probe the board. verbose and force are unused +for the Atari driver. +
  +
Return value: Driver should return 0 if it can handle something else ENXIO. +
  +
Availability: CT60/CTPCI hardware acceleration board and FireBee. +
  +
Group: VIDIX XBIOS extension +
  +
See also: Binding   vdxGetCapability   vdxGetVersion +
  + +
+ +

4.22.15.1 Bindings for vdxProbe

+ + + + + + +
C: int32_t vdxProbe ( int32_t verbose, int32_t force ); +
  +
Assembler: +
  +
move.l    force,-(sp)  ; Offset 6
+move.l    verbose,-(sp); Offset 2
+move.w    #401,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+lea       10(sp),sp    ; Correct stack
+
+ +
+ +

4.22.16 vdxQueryDMAStatus

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »vdxQueryDMAStatus« - Get DMA status. +
  +
Opcode: 417 (0x01a1) +
  +
Syntax: int32_t vdxQueryDMAStatus ( void ) ; +
  +
Description: Function for get the status of the DMA after a +vdxPlaybackCopyFrame(). +
  +
Warning: This function is optional. +
  +
Return value: Driver should return 0 or 1 if busy, else ENOSYS. +
  +
Availability: CT60/CTPCI hardware acceleration board and FireBee. +
  +
Group: VIDIX XBIOS extension +
  +
See also: Binding   vdxConfigPlayback   vdxPlaybackCopyFrame   +vdxPlaybackFrameSelect   vdxQueryFourcc +
  + +
+ +

4.22.16.1 Bindings for vdxQueryDMAStatus

+ + + + + + +
C: int32_t vdxQueryDMAStatus ( void ); +
  +
Assembler: +
  +
move.w    #417,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

4.22.17 vdxQueryFourcc

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »vdxQueryFourcc« - Request fourcc. +
  +
Opcode: 405 (0x0195) +
  +
Syntax: int32_t vdxQueryFourcc ( vidix_fourcc_t *to ) ; +
  +
Description: Select requested fourcc, width and height. Driver should answer +- can it configure video memory for a given fourcc or not. +
  +
Return value: Driver should return 0 else ENOSYS. +
  +
Availability: CT60/CTPCI hardware acceleration board and FireBee. +
  +
Group: VIDIX XBIOS extension +
  +
See also: Binding   vdxConfigPlayback   vdxPlaybackCopyFrame   +vdxPlaybackFrameSelect   vdxQueryDMAStatus +
  + +
+ +

4.22.17.1 Bindings for vdxQueryFourcc

+ + + + + + +
C: int32_t vdxQueryFourcc ( vidix_fourcc_t *to ); +
  +
Assembler: +
  +
pea       to           ; Offset 2
+move.w    #405,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.22.18 vdxSetGrKeys

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »vdxSetGrKeys« - Set graphic keys. +
  +
Opcode: 411 (0x019b) +
  +
Syntax: int32_t vdxSetGrKeys ( const vidix_grkey_t *grkey ) ; +
  +
Description: This interface should be tuned but introduced for overlapped +playback and video effects (TYPE_FX). +
  +
Warning: This function is optional. +
  +
Return value: Driver should return 0. +
  +
Availability: CT60/CTPCI hardware acceleration board and FireBee. +
  +
Group: VIDIX XBIOS extension +
  +
See also: Binding   vdxGetGrKeys +
  + +
+ +

4.22.18.1 Bindings for vdxSetGrKeys

+ + + + + + +
C: int32_t vdxSetGrKeys ( const vidix_grkey_t *grkey ); +
  +
Assembler: +
  +
pea       grkey        ; Offset 2
+move.w    #411,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +
+ +Home +XBIOSXBIOS +Keyboard functionsKeyboard functions +XBIOS function listXBIOS function list + + diff --git a/en/wdlg.html b/en/wdlg.html new file mode 100644 index 000000000..2f1f74a06 --- /dev/null +++ b/en/wdlg.html @@ -0,0 +1,2547 @@ + + + + + +The documentation for TOS: Window-dialogs + + + + + + + + + +Home +AESAES +Event libraryEvent library +Window libraryWindow library + +
+ +

8.8 Window-dialogs

+

The following functions were introduced with MagiC 4 and +WDIALOG. They permit simple construction of dialog boxes in windows: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
wdlg_close Closes a window-dialog +
wdlg_create Creates a window-dialog +
wdlg_delete Releases memory of closed window-dialog +
wdlg_evnt Evaluates the dialog-events +
wdlg_get_edit Obtains current editable field +
wdlg_get_handle Obtains window ID of a dialog +
wdlg_get_tree Obtains object tree of the window +
wdlg_get_udata Obtains user data +
wdlg_open Opens a window-dialog +
wdlg_redraw Draws an object in a window-dialog +
wdlg_set_edit Activates editable field in the dialog +
wdlg_set_iconify Iconifies a window-dialog +
wdlg_set_size Alters the size of a dialog +
wdlg_set_tree Anchors a new object tree in the dialog +
wdlg_set_uniconify Uniconifies a window-dialog + +
+ +

Note: The existence of these functions can be checked +for with appl_getinfo (opcode 7). +

+

See also: Window management   Style guidelines   WDIALOG +

+

8.8.1 wdlg_close

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Window-dialog close« - Close a window-dialog +
  +
Opcode: 162 +
  +
Syntax: int16_t wdlg_close ( DIALOG *dialog, int16_t *x, int16_t *y ); +
  +
Description: The function wdlg_close closes the window-dialog +dialog. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
dialog Pointer to the dialog structure +
x Last X-coordinate, and +
y Last Y-coordinate of the dialog's top left corner + +
+ +
Note: Old WDIALOG versions do not return the window +coordinates. In that case the binding enters -1, so that the dialog +will be centred automatically at the next call. +
  +
Return value: The function always returns the value 1. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: Window-dialogs +
  +
See also: Binding   wdlg_open +
  + +
+ +

8.8.1.1 Bindings for wdlg_close

+ + + + + + + + + +
C: int16_t wdlg_close ( DIALOG *dialog, int16_t *x, int16_t *y ); +
  +
Binding: +
  +
int16_t wdlg_close ( DIALOG *dialog, int16_t *x, int16_t *y )
+{
+  int_out[1] = -1;
+  int_out[2] = -1;
+
+  addr_in[0] = dialog;
+  crys_if (162);
+
+  *x = int_out[1];
+  *y = int_out[2];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]162 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]3 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]dialog
int_outint_out[0]Return value
+
+ + +
+ +

8.8.2 wdlg_create

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Window-dialog create« - Create a window-dialog +
  +
Opcode: 160 +
  +
Syntax: DIALOG *wdlg_create ( HNDL_OBJ handle_exit, OBJECT *tree, void +*user_data, int16_t code, void *data, int16_t flags ); +
  +
Description: The function wdlg_create allocates memory for a dialog +structure and initializes it. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle_exit Pointer to the service function +
tree Pointer to the object tree +
user_data Pointer to user info +
code Passed to handle_exitin HNDL_OBJ clicks +
data Passed to handle_exitin HNDL_OBJ data +
flags Various flags: +
1 = Enable background operation + +
+ +
Return value: Pointer to the dialog structure. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: Window-dialogs +
  +
See also: Binding   wdlg_open   wdlg_close +
  + +
+ +

8.8.2.1 Bindings for wdlg_create

+ + + + + + + + + +
C: DIALOG *wdlg_create ( HNDL_OBJ handle_exit, OBJECT *tree, void +*user_data, int16_t code, void *data, int16_t flags ); +
  +
Binding: +
  +
DIALOG *wdlg_create ( HNDL_OBJ handle_exit, OBJECT *tree,
+                      void *user_data, int16_t code,
+                      void *data, int16_t flags )
+{
+   addr_in[0] = handle_exit;
+   addr_in[1] = tree;
+   addr_in[2] = user_data;
+   addr_in[3] = data;
+
+   int_in[0] = code
+   int_in[1] = flags;
+
+   crys_if (160);
+
+   return ( addr_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]160 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]4 # Entry in addr_in
control+8control[4]1 # Entry in addr_out
addr_inaddr_in[0]handle_exit
addr_in+4addr_in[1]tree
addr_in+8addr_in[2]user_data
addr_in+12addr_in[3]data
int_inint_in[0]code
int_in+2int_in[1]flags
addr_outaddr_out[0]Return value
+
+ + +
+ +

8.8.3 wdlg_delete

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Window-dialog delete« - Release memory used by a closed +window-dialog +
  +
Opcode: 163 +
  +
Syntax: int16_t wdlg_delete ( DIALOG *dialog ); +
  +
Description: The function wdlg_delete releases the memory allocated for a +window-dialog that has been closed. The following applies: +
  +

+
+ + + + + + + + +
ParameterMeaning
dialogPointer to the dialog structure
+
+ +
Return value: The function always returns the value 1. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: Window-dialogs +
  +
See also: Binding   wdlg_close +
  + +
+ +

8.8.3.1 Bindings for wdlg_delete

+ + + + + + + + + +
C: int16_t wdlg_delete ( DIALOG *dialog ); +
  +
Binding: +
  +
int16_t wdlg_delete ( DIALOG *dialog )
+{
+   addr_in[0] = dialog;
+   crys_if (163);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]163 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]dialog
int_outint_out[0]Return value
+
+ + +
+ +

8.8.4 wdlg_evnt

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Window-dialog event« - Evaluate dialog-events +
  +
Opcode: 166 +
  +
Syntax: int16_t wdlg_evnt ( DIALOG *dialog, EVNT *events ); +
  +
Description: The call wdlg_evnt serves for evaluating or handling events in +a window-dialog. The following apply: +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
dialogPointer to the dialog structure
eventsPointer to the EVNT-structure
+
+ +
Note: This function must be called in an event-loop. The +event-bits that refer to the window-dialog are cleared in the +bit-vector mwhich. Following wdlg_evnt the EVNT-structure of +the application can be used to evaluate the events intended for it. +
  +
If wdlg_evnt returns a 0, the window-dialog has to be closed +(call (wdlg_close). +
  +
Note: The iconify-event is not supported by wdlg_evnt. +Those wanting to install the Iconifier icon as a window object during +wdlg_open therefore have to evaluate this event and process it +themselves. The same applies if one wants to install the Sizer icon +as an object. +
  +
Return value: The function returns the value 1 if no error has arisen. With a +return value of 0, the dialog must be closed. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: Window-dialogs +
  +
See also: Binding   wdlg_open   wdlg_close +
  + +
+ +

8.8.4.1 Bindings for wdlg_evnt

+ + + + + + + + + +
C: int16_t wdlg_evnt ( DIALOG *dialog, EVNT *events ); +
  +
Binding: +
  +
int16_t wdlg_evnt ( DIALOG *dialog, EVNT *events )
+{
+   addr_in[0] = dialog;
+   addr_in[1] = events;
+
+   crys_if (166);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]166 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]dialog
addr_in+4addr_in[1]events
int_outint_out[0]Return value
+
+ + +
+ +

8.8.5 wdlg_get_edit

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Window-dialog get edit« - Obtain current editable field +
  +
Opcode: 164 (sub-opcode 1) +
  +
Syntax: int16_t wdlg_get_edit ( DIALOG *dialog, int16_t *cursor ); +
  +
Description: The function wdlg_get_edit returns the index of the current +editable object. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
dialog Pointer to the dialog structure +
cursor Index of the character + +
+ +
Note: With old WDIALOG versions cursor is not +returned. The binding ensures that -1 is entered in this case. +
  +
Return value: This function returns the index of the current editable object. +If the result is 0, then no editable object is active at the present +time. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: Window-dialogs +
  +
See also: Binding   wdlg_open   wdlg_close +
  + +
+ +

8.8.5.1 Bindings for wdlg_get_edit

+ + + + + + + + + +
C: int16_t wdlg_get_edit ( DIALOG *dialog, int16_t *cursor ); +
  +
Binding: +
  +
int16_t wdlg_get_edit ( DIALOG *dialog, int16_t *cursor )
+{
+   addr_in[0] = dialog;
+
+   int_in[0] = 1;
+
+   int_out[1] = -1;
+
+   crys_if (164);
+
+   *cursor = int_out[1];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]164 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]2 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]dialog
int_inint_in[0]1 # Sub-opcode
int_outint_out[0]Return value
int_out+2int_out[1]cursor
+
+ + +
+ +

8.8.6 wdlg_get_handle

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Window-dialog get window handle« - Obtain window ID of a +dialog +
  +
Opcode: 164 (sub-opcode 3) +
  +
Syntax: int16_t wdlg_get_handle ( DIALOG *dialog ); +
  +
Description: The call wdlg_get_handle obtains the window ID (the +window-handle) of a window-dialog. The following apply: +
  +

+
+ + + + + + + + +
ParameterMeaning
dialogPointer to the dialog structure
+
+ +
Return value: The function returns the AES handle of the dialog-window. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: Window-dialogs +
  +
See also: Binding   wind_find +
  + +
+ +

8.8.6.1 Bindings for wdlg_get_handle

+ + + + + + + + + +
C: int16_t wdlg_get_handle ( DIALOG *dialog ); +
  +
Binding: +
  +
int16_t wdlg_get_handle ( DIALOG *dialog )
+{
+   addr_in[0] = dialog;
+   int_in[0] = 3;
+   crys_if (164);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]164 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]dialog
int_inint_in[0]3 # Sub-opcode
int_outint_out[0]Return value
+
+ + +
+ +

8.8.7 wdlg_get_tree

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Window-dialog get tree« - Obtain object tree of the window +
  +
Opcode: 164 (sub-opcode 0) +
  +
Syntax: int16_t wdlg_get_tree ( DIALOG *dialog, OBJECT **tree, GRECT *r +); +
  +
Description: The call wdlg_get_tree obtains the address of the object-tree +displayed in the window. The following apply: +
  +

+
+ + + + + + + + + + + + + + + + +
ParameterMeaning
dialogPointer to the dialog structure
treePointer to object tree
rPointer to GRECT
+
+ +
Note: In addition, the function returns the size of the +working area of the window. If the dialog size has not been altered +with wdlg_set_size, then the working area corresponds to the GRECT of +the root object. +
  +
Return value: The function always returns the value 1. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: Window-dialogs +
  +
See also: Binding   wdlg_get_handle +
  + +
+ +

8.8.7.1 Bindings for wdlg_get_tree

+ + + + + + + + + +
C: int16_t wdlg_get_tree ( DIALOG *dialog, OBJECT **tree, GRECT *r +); +
  +
Binding: +
  +
int16_t wdlg_get_tree ( DIALOG *dialog, OBJECT **tree,
+                        GRECT *r )
+{
+   addr_in[0] = dialog;
+   addr_in[1] = tree;
+   addr_in[2] = r;
+
+   int_in[0] = 0;
+   crys_if (164);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]164 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]3 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]dialog
addr_in+4addr_in[1]tree
addr_in+8addr_in[2]r
int_inint_in[0]0 # Sub-opcode
int_outint_out[0]Return value
+
+ + +
+ +

8.8.8 wdlg_get_udata

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Window-dialog get user data« - Obtain the user-data of a +window-dialog +
  +
Opcode: 164 (sub-opcode 2) +
  +
Syntax: void *wdlg_get_udata ( DIALOG *dialog ); +
  +
Description: The call wdlg_get_udata obtains the user data of a +window-dialog. The following applies: +
  +

+
+ + + + + + + + +
ParameterMeaning
dialogPointer to the dialog structure
+
+ +
Return value: This function returns the variable user_data that was +passed at the wdlg_create call. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: Window-dialogs +
  +
See also: Binding   wdlg_get_handle +
  + +
+ +

8.8.8.1 Bindings for wdlg_get_udata

+ + + + + + + + + +
C: void *wdlg_get_udata ( DIALOG *dialog ); +
  +
Binding: +
  +
void *wdlg_get_udata ( DIALOG *dialog )
+{
+   addr_in[0] = dialog;
+   int_in[0] = 2;
+   crys_if (164);
+
+   return ( addr_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]164 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]1 # Entry in addr_out
addr_inaddr_in[0]dialog
int_inint_in[0]2 # Sub-opcode
addr_outaddr_out[0]Return value
+
+ + +
+ +

8.8.9 wdlg_open

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Window-dialog open« - Opens a window-dialog +
  +
Opcode: 161 +
  +
Syntax: int16_t wdlg_open ( DIALOG *dialog, int8_t *title, int16_t +kind, int16_t x, int16_t y, int16_t code, void *data ); +
  +
Description: The call wdlg_open opens a window-dialog on the screen. The +following apply: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
dialogPointer to the dialog structure
titlePointer to the window name or 0L
kindWindow components (NAME/MOVER/CLOSER)
xX-coord. of top L of dialog, or -1 (centred)
yY-coord. of top L of dialog, or -1 (centred)
codePassed to handle_exit() in HNDL_OBJ clicks
dataPassed to handle_exit() in HNDL_OBJ data
+
+ +
Note: Before wdlg_open returns to the caller, the +service routine handle_exit() (see above) is called with the +function number HNDL_OPEN. +
  +
Return value: Handle of the dialog window (0: Error) +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: Window-dialogs +
  +
See also: Binding   wdlg_close   wdlg_delete +
  + +
+ +

8.8.9.1 Bindings for wdlg_open

+ + + + + + + + + +
C: int16_t wdlg_open ( DIALOG *dialog, int8_t *title, int16_t +kind, int16_t x, int16_t y, int16_t code, void *data ); +
  +
Binding: +
  +
int16_t wdlg_open ( DIALOG *dialog, int8_t *title,
+                    int16_t kind, int16_t x,
+                    int16_t y, int16_t code, void *data )
+{
+   addr_in[0] = dialog;
+   addr_in[1] = title;
+   addr_in[2] = data;
+
+   int_in[0] = kind;
+   int_in[1] = x;
+   int_in[2] = y;
+   int_in[3] = code;
+
+   crys_if (161);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]161 # Function opcode
control+2control[1]4 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]3 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]dialog
addr_in+4addr_in[1]title
addr_in+8addr_in[2]data
int_inint_in[0]kind
int_in+2int_in[1]x
int_in+4int_in[2]y
int_in+6int_in[3]code
int_outint_out[0]Return value
+
+ + +
+ +

8.8.10 wdlg_redraw

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Window-dialog redraw« - Draw an object in a window-dialog. +
  +
Opcode: 167 +
  +
Syntax: void wdlg_redraw ( DIALOG *dialog, GRECT *rect, int16_t obj, +int16_t depth ); +
  +
Description: The call wdlg_redraw draws an object in a window-dialog while +respecting the rectangle list of the window. The following apply: +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
dialogPointer to the dialog structure
rectPointer to the bounding GRECT
objIndex of the start object
depthIndex of the plane/depth
+
+ +
Note: If one wants to draw an object within the dialog +then one should always use wdlg_redraw and not objc_draw. Before +calling wdlg_redraw, just as before and after objc_draw, a wind_update +call is necessary. +
  +
Return value: The function does not return a result. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: Window-dialogs +
  +
See also: Binding   objc_draw   WM_REDRAW +
  + +
+ +

8.8.10.1 Bindings for wdlg_redraw

+ + + + + + + + + +
C: void wdlg_redraw ( DIALOG *dialog, GRECT *rect, int16_t obj, +int16_t depth ); +
  +
Binding: +
  +
void wdlg_redraw ( DIALOG *dialog, GRECT *rect, int16_t obj,
+                   int16_t depth )
+{
+   addr_in[0] = dialog;
+   addr_in[1] = rect;
+
+   int_in[0] = obj;
+   int_in[1] = depth;
+   crys_if (167);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]167 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]dialog
addr_in+4addr_in[1]rect
int_inint_in[0]obj
int_in+2int_in[1]depth
+
+ + +
+ +

8.8.11 wdlg_set_edit

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Window-dialog set edit object« - Activate editable field in +the window-dialog +
  +
Opcode: 165 (sub-opcode 0) +
  +
Syntax: int16_t wdlg_set_edit ( DIALOG *dialog, int16_t obj ); +
  +
Description: The call wdlg_set_edit activates an editable object. The +following apply: +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
dialogPointer to the dialog structure
objIndex of the new editable object (or 0, if none is to be active)
+
+ +
Note: Activates an editable object, i.e. the cursor will +be drawn in the specified object and deleted from any previously +active object. +
  +
Return value: The function returns the number of the current edit object. The +value 0 means that none ist active. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: Window-dialogs +
  +
See also: Binding   wdlg_open   wdlg_close +
  + +
+ +

8.8.11.1 Bindings for wdlg_set_edit

+ + + + + + + + + +
C: int16_t wdlg_set_edit ( DIALOG *dialog, int16_t obj ); +
  +
Binding: +
  +
int16_t wdlg_set_edit ( DIALOG *dialog, int16_t obj )
+{
+   addr_in[0] = dialog;
+
+   int_in[0] = 0;
+   int_in[1] = obj;
+
+   crys_if (165);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]165 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]dialog
int_inint_in[0]0 # Sub-opcode
int_in+2int_in[1]obj
int_outint_out[0]Return-Wert
+
+ + +
+ +

8.8.12 wdlg_set_iconify

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Window-dialog iconify« - Iconify a window-dialog +
  +
Opcode: 165 (sub-opcode 3) +
  +
Syntax: int16_t wdlg_set_iconify ( DIALOG *dialog, GRECT *g, int8_t +*title, OBJECT *tree, int16_t obj ); +
  +
Description: The call wdlg_set_iconify permits the iconifying of a +window-dialog. The following apply: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
dialogPointer to the dialog structure
gPointer to GRECT
titleNew window title, or NULL
treeNew window tree, or NULL
objObject to be centred or -1
+
+ +
Note: The new position of the window will be adopted +normally from the message WM_ICONIFY; but it is also possible to let +MagiC obtain this directly by passing coordinates of -1,-1,-1,-1. +
  +
The function alters the position and size of the root object. +As, in general, one would like to display a different object tree for +an iconified window, this can be specified in the parameter +tree. The object tree normally consists of a root object +(G_BOX) and an icon to be displayed of the type G_ICON or G_CICON. If +the icon is to be displayed centred in the window, then one passes its +object index in parameter obj. +
  +
When setting a new window title, one must bear in mind that at a +later uniconify the user must restore the old title himself. +
  +
Return value: The function always returns the value 1. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). This function is only present from WDIALOG 1.05 onwards. +If it is not present, intout[0] contains a 0. +
  +
Group: Window-dialogs +
  +
See also: Binding   wdlg_set_uniconify +
  + +
+ +

8.8.12.1 Bindings for wdlg_set_iconify

+ + + + + + + + + +
C: int16_t wdlg_set_iconify ( DIALOG *dialog, GRECT *g, int8_t +*title, OBJECT *tree, int16_t obj ); +
  +
Binding: +
  +
int16_t wdlg_set_iconify ( DIALOG *dialog, GRECT *g,
+                           int8_t *title,
+                           OBJECT *tree, int16_t obj )
+{
+   addr_in[0] = dialog;
+   addr_in[1] = g;
+   addr_in[2] = title;
+   addr_in[3] = tree;
+
+   int_in[0] = 3;
+   int_in[1] = obj;
+
+   crys_if (165);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]165 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]4 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]dialog
addr_in+4addr_in[1]g
addr_in+8addr_in[2]title
addr_in+12addr_in[3]tree
int_inint_in[0]3 # Sub-opcode
int_in+2int_in[1]obj
int_outint_out[0]Return value
+
+ + +
+ +

8.8.13 wdlg_set_size

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Window-dialog set size« - Alter the size of a window-dialog +
  +
Opcode: 165 (sub-opcode 2) +
  +
Syntax: int16_t wdlg_set_size ( DIALOG *dialog, GRECT *new_size ); +
  +
Description: The call wdlg_set_size makes it possible to alter the size of a +window-dialog. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
dialog Pointer to the dialog structure +
new_size New position and size of the window's working area + +
+ +
Note: The function can alter position or size of a +window-dialog. If the root object is to be moved or enlarged then the +object dimensions have to be altered before calling wdlg_set_size. +
  +
The buttons must always lie completely within the window's +working area, as form_button pays no regard to the rectangle list. The +normal use for wdlg_set_size are enlargeable dialogs that have a +Sizer object at the bottom right corner. +
  +
Return value: The function always returns the value 1. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: Window-dialogs +
  +
See also: Binding   wdlg_open   wdlg_close +
  + +
+ +

8.8.13.1 Bindings for wdlg_set_size

+ + + + + + + + + +
C: int16_t wdlg_set_size ( DIALOG *dialog, GRECT *new_size ); +
  +
Binding: +
  +
int16_t wdlg_set_size ( DIALOG *dialog, GRECT *new_size )
+{
+   addr_in[0] = dialog;
+   addr_in[1] = new_size;
+
+   int_in[0] = 2;
+   crys_if (165);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]165 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]dialog
addr_in+4addr_in[1]new_size
int_inint_in[0]2 # Sub-opcode
int_outint_out[0]Return value
+
+ + +
+ +

8.8.14 wdlg_set_tree

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Window-dialog set tree« - Anchor a new object tree in the +window-dialog +
  +
Opcode: 165 (sub-opcode 1) +
  +
Syntax: int16_t wdlg_set_tree ( DIALOG *dialog, OBJECT *new_tree ); +
  +
Description: The call wdlg_set_tree anchors a new object tree in a +window-dialog. The following apply: +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
dialogPointer to the dialog
new_treeNew object tree
+
+ +
Note: If the new root object has a different size, then +the window size will be adapted automatically; the window contents +will be updated in every case. +
  +
Return value: The function always returns the value 1. +
  +
Availability: The presence of this call should be checked for using appl_getinfo +(Opcode 7). +
  +
Group: Window-dialogs +
  +
See also: Binding   wdlg_open   wdlg_close +
  + +
+ +

8.8.14.1 Bindings for wdlg_set_tree

+ + + + + + + + + +
C: int16_t wdlg_set_tree ( DIALOG *dialog, OBJECT *new_tree ); +
  +
Binding: +
  +
int16_t wdlg_set_tree ( DIALOG *dialog, OBJECT *new_tree )
+{
+   addr_in[0] = dialog;
+   addr_in[1] = new_tree;
+
+   int_in[0] = 1;
+   crys_if (165);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]165 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]2 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]dialog
addr_in+4addr_in[1]new_tree
int_inint_in[0]1 # Sub-opcode
int_outint_out[0]Return value
+
+ + +
+ +

8.8.15 wdlg_set_uniconify

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Window-dialog uniconify« - Uniconify a window-dialog +
  +
Opcode: 165 (sub-opcode 4) +
  +
Syntax: int16_t wdlg_set_uniconify ( DIALOG *dialog, GRECT *g, int8_t +*title, OBJECT *tree ); +
  +
Description: The call wdlg_set_uniconify makes it possible to uniconify a +window-dialog. The following apply: +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
dialogPointer to the dialog
gNew position of the window
titleNew window title, or NULL
treeNew window tree, or NULL
+
+ +
Note: The new position of the window will be adopted +normally from the message WM_UNICONIFY. +
  +
The function alters the position and size of the root object. +As, in general, one has displayed a different object tree for an +iconified window, the original tree can be specified in the parameter +tree and so restored. With the parameter title one can +set the old window title that was valid before the iconification. +
  +
Return value: The function always returns the value 1. +
  +
Availability: The presence of this function can be ascertained with appl_getinfo +(opcode 7). This function is only present from WDIALOG 1.05 onwards. +If it is not present, then intout[0] contains a 0. +
  +
Group: Window-dialogs +
  +
See also: Binding   wdlg_set_iconify +
  + +
+ +

8.8.15.1 Bindings for wdlg_set_uniconify

+ + + + + + + + + +
C: int16_t wdlg_set_uniconify ( DIALOG *dialog, GRECT *g, int8_t +*title, OBJECT *tree ); +
  +
Binding: +
  +
int16_t wdlg_set_uniconify ( DIALOG *dialog, GRECT *g,
+                             int8_t *title, OBJECT *tree )
+{
+   addr_in[0] = dialog;
+   addr_in[1] = g;
+   addr_in[2] = title;
+   addr_in[3] = tree;
+
+   int_in[0] = 4;
+
+   crys_if (165);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]165 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]4 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]dialog
addr_in+4addr_in[1]g
addr_in+8addr_in[2]title
addr_in+12addr_in[3]tree
int_inint_in[0]4 # Sub-opcode
int_outint_out[0]Return value
+
+ + +
+ +
+ +Home +AESAES +Event libraryEvent library +Window libraryWindow library + + diff --git a/en/wind.html b/en/wind.html new file mode 100644 index 000000000..f0f463ec2 --- /dev/null +++ b/en/wind.html @@ -0,0 +1,6682 @@ + + + + + +The documentation for TOS: Window library + + + + + + + + + +Home +AESAES +Window-dialogsWindow-dialogs +Extended file-selectorsExtended file-selectors + +
+ +

8.9 Window library

+

This library makes functions available to create, open and close +windows, and much more. In all the following routines are available: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
sys_set_winframe_manager Install a new window-frame manager +
wind_apfind Obtains application ID from a window position specification +
wind_calc Calculates window dimensions +
wind_close Closes windows +
wind_create Creates windows +
wind_delete Deletes windows +
wind_draw Redraws window components +
wind_find Obtains window ID from a position specification +
wind_get Obtains properties of a window +
wind_new Deletes all windows +
wind_open Opens window +
wind_set Alters properties of a window +
wind_update Blocks or releases screen operations +
wind_xget Obtains properties of a window, extended version +
wind_xset Alters properties of a window, extended version +
x_wdial_change Redraw one object within a window dialog, showing a new state +
x_wdial_draw Redraw a dialog within a window +
x_wind_calc Calculates window dimensions, extended version +
x_wind_create Initializes a new window, extended version +
x_wind_tree Change window gadgets + +
+ +

Note: Under MagiC a single application should not use +more than 16 windows, as otherwise the message buffer of the system +may overflow and then it may not be possible to perform redraws any +more. +

+

See also: +
Components of a window   Style guidelines   Window-dialogs   +Overview of the wind_get/set subfunctions wind_get and wind_set mode in Geneva +

+

8.9.1 wind_apfind

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Find window owner« - Find the owner's application ID of a +window at the given coordinates. +
  +
Opcode: 119 (0x0077) +
  +
Syntax: int16_t wind_apfind ( int16_t wi_fmx, int16_t wi_fmy ); +
  +
Description: The call wind_apfind obtains the application ID of the owner of +a window that is found at a given position. The following apply: +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
wi_fmxX-coordinate
wi_fmyY-coordinate
+
+ +
Return value: The function returns the corresponding application ID. Here the +value 0 represents the desktop, while -1 means that no window is +present at the specified position. +
  +
Availability: Available as of MultiGEM II. +
  +
Group: Window library +
  +
See also: Binding   wind_find   wind_get +
  + +
+ +

8.9.1.1 Bindings for wind_apfind

+ + + + + + + + + +
C: int16_t wind_apfind ( int16_t wi_fmx, int16_t wi_fmy ); +
  +
Binding: +
  +
int16_t wind_apfind (int16_t wi_fmx, int16_t wi_fmy)
+{
+   int_in[0]  = wi_fmx;
+   int_in[1]  = wi_fmy;
+
+   return ( crys_if(119) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]119 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]wi_fmx
int_in+2int_in[1]wi_fmy
int_outint_out[0]Return value
+
+ + +
+ +

8.9.2 wind_calc

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Window calculation« - Calculates the limits or the total +space requirement of a window +
  +
Opcode: 108 +
  +
Syntax: int16_t wind_calc ( int16_t wi_ctype, int16_t wi_ckind, int16_t +wi_cinx, int16_t wi_ciny, int16_t wi_cinw, int16_t wi_cinh, int16_t +*coutx, int16_t *couty, int16_t *coutw, int16_t *couth ); +
  +
Description: The call wind_calc calculates the size of the border area from +the coordinates of the working area of a specific window, or vice +versa. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
wi_ctype 0 = WC_BORDER calculates the coordinates of the border area +from the coordinates of the working area in the parameters +wi_cinx, wi_ciny, wi_cinw and wi_cinh. +
1 = WC_WORK calculates the coordinates of the working area from +the coordinates of the border area in the parameters wi_cinx, +wi_ciny, wi_cinw and wi_cinh. +
wi_ckind An integer parameter that contains all components of the window, +with a format as +
wi_cinx X-coordinate, and +
wi_ciny Y-coordinate of top left corner, +
wi_cinw Width, and +
wi_cinh Height of the window (already known) +
coutx X-coordinate, +
couty Y-coordinate, +
coutw Width, and +
couth Height of the calculated components + +
+ +
Note: One should never assume that the components of a +window have a given size or position, but always use this +function. Even then, the calculated height will be incorrect if the +window has a toolbar attached to it; this can be corrected by +adjusting the value by the height of the toolbar (see also below). +
  + +
WINX extension: Premise: appl_getinfo (opcode 22360) If one +sets bit 15 in wi_ctype (e.g. by addition of the constant +WC_WIN (=$8000)) and in wi_ckind passes the ID of a window +instead of the window components, it is possible to obtain more exact +dimensions for the window, as the function can take into account the +current properties of the window (e.g. a toolbar). Additionally the +function performs an auto-correction of the structure area, which is +also performed by functions such as wind_open, wind_set( WF_CURRXYWH) when +necessary and if supported by the AES. +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: All AES versions. +
  +
Group: Window library +
  +
See also: Binding   wind_create   Problems with toolbars +
  + +
+ +

8.9.2.1 Bindings for wind_calc

+ + + + + + + + + +
C: int16_t wind_calc ( int16_t wi_ctype, int16_t wi_ckind, int16_t +wi_cinx, int16_t wi_ciny, int16_t wi_cinw, int16_t wi_cinh, int16_t +*coutx, int16_t *couty, int16_t *coutw, int16_t *couth ); +
  +
Binding: +
  +
int16_t wind_calc (int16_t wi_ctype, int16_t wi_ckind,
+                   int16_t wi_cinx, int16_t wi_ciny,
+                   int16_t wi_cinw, int16_t wi_cinh,
+                   int16_t *coutx, int16_t *couty,
+                   int16_t *coutw, int16_t *couth)
+{
+   int_in[0]  = wi_ctype;
+   int_in[1]  = wi_ckind;
+   int_in[2]  = wi_cinx;
+   int_in[3]  = wi_ciny;
+   int_in[4]  = wi_cinw;
+   int_in[5]  = wi_cinh;
+
+   crys_if (108);
+
+   *coutx = int_out[1];
+   *couty = int_out[2];
+   *coutw = int_out[3];
+   *couth = int_out[4];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]108 # Function opcode
control+2control[1]6 # Entry in int_in
control+4control[2]5 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]wi_ctype
int_in+2int_in[1]wi_ckind
int_in+4int_in[2]wi_cinx
int_in+6int_in[3]wi_ciny
int_in+8int_in[4]wi_cinw
int_in+10int_in[5]wi_cinh
int_outint_out[0]Return value
int_out+2int_out[1]coutx
int_out+4int_out[2]couty
int_out+6int_out[3]coutw
int_out+8int_out[4]couth
+
+ + +
+ +

8.9.3 wind_close

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Close window« - Close a window +
  +
Opcode: 102 +
  +
Syntax: int16_t wind_close ( int16_t wi_clhandle ); +
  +
Description: The call wind_close removes the window with the ID +wi_clhandle from the screen (closes it). +
  +
Note: The window will only be deleted irrevocably by a +call of wind_delete. +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: All AES versions. +
  +
Group: Window library +
  +
See also: Binding   wind_open   wind_delete +
  + +
+ +

8.9.3.1 Bindings for wind_close

+ + + + + + + + + +
C: int16_t wind_close ( int16_t wi_clhandle ); +
  +
Binding: +
  +
int16_t wind_close (int16_t wi_clhandle)
+{
+   int_in[0]  = wi_clhandle;
+   return ( crys_if(102) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]102 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]wi_clhandle
int_outint_out[0]Return value
+
+ + +
+ +

8.9.4 wind_create

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Window create« - Initializes a new window +
  +
Opcode: 100 +
  +
Syntax: int16_t wind_create ( int16_t wi_crkind, int16_t wi_crwx, +int16_t wi_crwy, int16_t wi_crww, int16_t wi_crwh ); +
  +
Description: The call wind_create attempts to initialize a new window +structure with the AES and at the same time determines its +appearance and maximum size; it also allocates the memory required for +it. Note that this call does not actually display the window on-screen +- you need to follow it with a wind_open call for this. +
  +
wi_crwx, wi_crwy, wi_crww, wi_crwh set the maximum +extent of the window. +
  +
wi_crkind describes the components as a bit-vector: +
  + + + + + + + + + + + + + + + + + +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementValueMeaning
NAME0x0001Title-bar
CLOSER0x0002Close-box
FULLER0x0004Fuller-box
MOVER0x0008Window may be moved by user
INFO0x0010Info-line
SIZER0x0020Sizer-box
UPARROW0x0040Up-arrow
DNARROW0x0080Down-arrow
VSLIDE0x0100Vertical slider
LFARROW0x0200Left arrow
RTARROW0x0400Right arrow
HSLIDE0x0800Horizontal slider
HOTCLOSEBOX0x1000Close-box with auto-repeat
MENUBAR0x1000Menu bar (XaAES)
BACKDROP0x2000Background-box
ICONIFIER0x4000Iconify-button
BORDER0x8000Border sizing
+
+ +
Notes: HOTCLOSEBOX is only available as of PC-GEM or +MagiC Version 2.0 (in each case). Window borders that are not needed +(e.g. bottom border) will be omitted as of AES Version 4.x or +MagiC 3; this makes available a few more pixels of usable area. +
  +
MENUBAR is only available in XaAES. It reserves room for a menu +bar widget in the window. The menu bar itself is attached to the +window by wind_set. +
  +
Setting BORDER will make XaAES allow for window border sizing +without the SIZER widget being used. +
  +
ICONIFIER is available only as of AES Version 4.1. +
  +
The presence of newer components such as the iconify button, for +instance, is best inquired for by using appl_getinfo (opcode 11). +
  +
Return value: The function returns a non-negative handle if the AES still +has a free window handle available. A return value smaller than 0 +(i.e. negative) signals an error or no more free handles available. +
  +
Availability: All AES versions. +
  +
Group: Window library +
  +
See also: Binding   wind_delete +
  + +
+ +

8.9.4.1 Bindings for wind_create

+ + + + + + + + + +
C: int16_t wind_create ( int16_t wi_crkind, int16_t wi_crwx, +int16_t wi_crwy, int16_t wi_crww, int16_t wi_crwh ); +
  +
Binding: +
  +
int16_t wind_create (int16_t wi_crkind, int16_t wi_crwx,
+                     int16_t wi_crwy, int16_t wi_crww,
+                     int16_t wi_crwh)
+{
+   int_in[0]  = wi_crkind;
+   int_in[1]  = wi_crwx;
+   int_in[2]  = wi_crwy;
+   int_in[3]  = wi_crww;
+   int_in[4]  = wi_crwh;
+
+   return ( crys_if(100) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]100 # Function opcode
control+2control[1]5 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]wi_crkind
int_in+2int_in[1]wi_crwx
int_in+4int_in[2]wi_crwy
int_in+6int_in[3]wi_crww
int_in+8int_in[4]wi_crwh
int_outint_out[0]Return value
+
+ + +
+ +

8.9.5 wind_delete

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Delete window« - Delete a window +
  +
Opcode: 103 +
  +
Syntax: int16_t wind_delete ( int16_t wi_dhandle ); +
  +
Description: The call wind_delete destroys the window with the ID +wi_dhandle and releases the relevant window handle again, as +well as releasing any memory allocated to it. +
  +
Note: A window should be closed with wind_close before +deleting it. +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: All AES versions. +
  +
Group: Window library +
  +
See also: Binding   wind_create   wind_close +
  + +
+ +

8.9.5.1 Bindings for wind_delete

+ + + + + + + + + +
C: int16_t wind_delete ( int16_t wi_dhandle ); +
  +
Binding: +
  +
int16_t wind_delete (int16_t wi_dhandle)
+{
+   int_in[0] = wi_dhandle;
+   return ( crys_if(103) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]103 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]wi_dhandle
int_outint_out[0]Return value
+
+ + +
+ +

8.9.6 wind_draw

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Draw window« - Redraw the window components +
  +
Opcode: 99 +
  +
Syntax: int16_t wind_draw ( int16_t wi_dhandle, int16_t wi_dstartob ); +
  +
Description: The call wind_draw redraws the non-client area (window +components) of a window with the ID wi_dhandle, taking the +rectangle list into account. +
  + + + + + + + + + +
Parameter Meaning +
  +
+ +
wi_dhandle ID (handle) of the window that is to be redrawn +
  +
wi_dstartob Index of the object where the drawing is to start +
  + +
+ +
Note: This function is available only under N.AES and +is of relatively little interest for "normal" applications. +It is used specially by the internal screen-manager for the drawing of window +objects. +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: The presence of this function can be checked for with appl_getinfo +(opcode 65). +
  +
Group: Window library +
  +
See also: Binding +
  + +
+ +

8.9.6.1 Bindings for wind_draw

+ + + + + + + + + +
C: int16_t wind_draw ( int16_t wi_dhandle, int16_t wi_dstartob ); +
  +
Binding: +
  +
int16_t wind_draw ( int16_t wi_dhandle, int16_t wi_dstartob );
+{
+   int_in[0] = wi_dhandle;
+   int_in[1] = wi_dstartob;
+   return ( crys_if(99) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]99 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]wi_dhandle
int_in+2int_in[1]wi_dstartob
int_outint_out[0]Return value
+
+ + +
+ +

8.9.7 wind_find

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Find window« - Find the ID of a window at the given +coordinates. +
  +
Opcode: 106 +
  +
Syntax: int16_t wind_find ( int16_t wi_fmx, int16_t wi_fmy ); +
  +
Description: The call wind_find obtains the ID of the window that is found +at a given position. The following apply: +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
wi_fmxX-coordinate
wi_fmyY-coordinate
+
+ +
Return value: The function returns the corresponding window ID. Here the +value 0 represents the desktop, while -1 means that no window is +present at the specified position. +
  +
Availability: All AES versions. +
  +
Group: Window library +
  +
See also: Binding   wind_get +
  + +
+ +

8.9.7.1 Bindings for wind_find

+ + + + + + + + + +
C: int16_t wind_find ( int16_t wi_fmx, int16_t wi_fmy ); +
  +
Binding: +
  +
int16_t wind_find (int16_t wi_fmx, int16_t wi_fmy)
+{
+   int_in[0]  = wi_fmx;
+   int_in[1]  = wi_fmy;
+
+   return ( crys_if(106) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]106 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]wi_fmx
int_in+2int_in[1]wi_fmy
int_outint_out[0]Return value
+
+ + +
+ +

8.9.8 wind_get

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Get window« - Obtains various properties of a window. +
  +
Opcode: 104 +
  +
Syntax: int16_t wind_get ( int16_t wi_ghandle, int16_t wi_gfield, +int16_t *wi_gw1, int16_t *wi_gw2, int16_t *wi_gw3, int16_t *wi_gw3 ); +
  +
Description: Depending on the parameters passed, the call wind_get returns +information about various properties of the window with the ID +wi_ghandle. The following apply for wi_gfield: +
  +
Summary of all subfunctions; numbers in brackets represent the +wi_gfield mode: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
WF_BEVENT (24) This mode inquires the state of the bit-vector that was set by +wind_set (..., WF_BEVENT, ...), and writes it into the parameter +wi_gw1. +
Warning: The presence of this feature should be checked +for with appl_getinfo (opcode 11). +
  + +
WF_BITMAP (233) Get bitmap content of the window if MyAES +"windows_backup" option is set to true, any windows of any +application can be read. +
MyAES 0.96 feature +
  + +
WF_BOTTOM (25) This mode inquires the handle of the window that is currently +at the bottom of the window list, and writes this into the parameter +wi_gw1. +
  +
Warning: The presence of this feature should be checked +for with appl_getinfo (opcode 11). +
  + +
WF_CURRXYWH (5) This mode calculates the total size of the window, and writes +its coordinates into the further parameters wi_gw1, +wi_gw2, wi_gw3 and wi_gw4. +
  + +
WF_DCOLOR (19) This mode returns the default colours of a newly created +window, as follows: +
  + + + + + + + + + +
wi_gw1 = Window component +
wi_gw2 = Colour with window active +
wi_gw3 = Colour with window inactive + +
+ +
Warning: The presence of this feature should be checked +for with appl_getinfo (opcode 11). +
  +
As of MagiC 4 and XaAES v 0.943 one can also inquire for each +individual window component the state of the 3D-flags. The call for +this is: wind_get (0, WF_DCOLOR, ...). The following apply: +
  + + + + + + + + + + + + +
wi_gw1 = Window component +
wi_gw2 = Colour in active state +
wi_gw3 = Colour in inactive state +
wi_gw4 = 3D-flags + +
+ +
These 3D-flags are described as bit-vectors. The following +apply: +
  + + + + + + + + + + + + + + + +
Bit-0 = '3D in foreground' effect +
Bit-1 = '3D in background' effect +
Bit-2 = 'Selectable in foreground' effect +
Bit-3 = 'Selectable in background' effect +
Bit-8+n = Mask bit for bit 'n' + +
+ +
The presence of this feature can not be obtained with +appl_getinfo at present. +
  + +
WF_DDELAY (22362) This mode returns the delay values: +
  + + + + + + + + + + + + +
wi_gw1 = Start delay at a click on a scroll arrow +
wi_gw2 = Continuing delay at a click on a scroll arrow +
wi_gw3 = Continuing delay at a click on the 'Closer' widget +
wi_gw4 = Continuing delay at a click on the 'Fuller' widget + +
+ +
All values are returned in milliseconds. +
  +
Warning: The presence of this feature should be checked +for with appl_getinfo (opcode 22360). +
  + +
WF_FIRSTXYWH (11) This mode calculates the coordinates of the first rectangle in +the rectangle list, and writes them into the further parameters +wi_gw1, wi_gw2, wi_gw3 and wi_gw4. +
  + +
WF_FTOOLBAR (31) This mode obtains the first rectangle from the rectangle list +of a toolbar. The following apply: +
  + + + + + + + + + + + + +
wi_gw1 = X-coordinate, and +
wi_gw2 = Y-coordinate of top L corner, +
wi_gw3 = Width, and +
wi_gw4 = Height of the rectangle + +
+ + +
WF_FULLXYWH (7) This mode calculates the maximum total size of the window, and +writes this into the further parameters wi_gw1, +wi_gw2, wi_gw3 and wi_gw4. +
  + +
WF_HSLIDE (8) This mode calculates the position of the horizontal slider, and writes +this into the further parameter wi_gw1 (0=far left to 1000=far +right). +
  + +
WF_HSLSIZE (15) This mode calculates the size of the horizontal slider relative +to the total width of the window, and writes this into the further +parameter wi_gw1 (-1=smallest size, 1=small to 1000=total +width). +
  + +
WF_ICONIFY (26) This mode returns the following values: +
  + + + + + + + + + +
wi_gw1 = Window is iconified (1) or not (0) +
wi_gw2 = Window width +
wi_gw3 = Window height + +
+ +
Warning: The presence of this feature should be checked +for with appl_getinfo (opcode 11). +
  + +
WF_INFO (3) This mode obtains the current text of the window's info-line with +the ID wi_ghandle and copies this into the buffer whose +address was passed in intin[2] (high-WORD) and intin[3] (low-WORD). +
  +
If the window has no info-line then the return value of the +function is 0; the passed buffer remains unchanged. +
  +
As an info-line can have at most 128 (N.AES) or 200 (XaAES) +characters, the passed buffer should offer sufficient space to +accomodate a string of this length. +
  +
This call is available only under N.AES and XaAES. +
  + +
WF_INFOXYWH (104) This mode obtains the position of the INFO window component. +
  +
Available as of MagiC 6.10. +
  + +
WF_KIND (1) This mode obtains the current components of the window, and writes +them into the parameter wi_gw1. +
  + +
WF_MENU (33) This mode returns the address of the OBJECT structure of the +menu bar in the window. Here wi_gw1 contains the high-WORD, +and wi_gw2 the low-WORD of the address, or NULL. +
  + +
WF_MINXYWH (103) This mode inquires the minimum size of the window. +
  +
Available as of MagiC 6. +
  + +
WF_NAME (2) This mode obtains the current window title of the window with the ID +wi_ghandle and copies this into the buffer whose address was +passed in intin[2] (high-WORD) and intin[3] (low-WORD). +
  +
If the window has no title, then the return value of the +function is 0; the passed buffer remains unchanged. +
  +
As a window title can have at most 128 (N.AES) or 200 (XaAES) +characters, the passed buffer should offer sufficient space to +accomodate a string of this length. +
  +
This call is available only under MagiC (as of Version 6.0), +N.AES and XaAES. +
  + +
WF_NEWDESK (14) This mode returns the following values: +
  + + + + + + + + + +
wi_gw1 = High-WORD of the desktop address +
wi_gw2 = Low-WORD of the desktop address +
wi_gw3 = Index of the first object + +
+ +
Note: The desktop address is to be understood as the +address of the active desktop background tree. The output in +wi_gw3 is available only under MagiC and as of AES Version +4.0. +
Warning: The presence of this feature should be checked +for with appl_getinfo (opcode 11). It is also present in KAOS 1.4.2 and as +of MagiC 1. +
  + +
WF_NEXTXYWH (12) This mode calculates the coordinates of the next rectangle in +the rectangle list, and writes them into the further parameters +wi_gw1, wi_gw2, wi_gw3 and wi_gw4. +
  + +
WF_NTOOLBAR (32) This mode obtains the next rectangle from the rectangle list of +a toolbar. The following apply: +
  + + + + + + + + + + + + +
wi_gw1 = X-coordinate, and +
wi_gw2 = Y-coordinate of top L corner, +
wi_gw3 = Width, and +
wi_gw4 = Height of the rectangle + +
+ + +
WF_OPTS (41) This mode returns the value that was set with wind_set ( WF_OPTS +). +
  +
The presence of this feature should be checked for using appl_getinfo +(opcode 11). +
  + +
WF_M_OWNER (101) This mode returns the following values: +
  + + + +
wi_gw1 = Application ID of the owner + +
+ +
Present only as of KAOS 1.4.2 (where it was still called +WF_OWNER) and in MagiC. +
  + +
WF_OWNER (20) This mode returns the following values: +
  + + + + + + + + + + + + +
wi_gw1 = Application ID of the owner +
wi_gw2 = Window is open (1) or closed (0) +
wi_gw3 = ID of the window directly above +
wi_gw4 = ID of the window directly below (in the window order list) + +
+ +
Warning: The presence of this feature should be checked +for with appl_getinfo (opcode 11). +
  + +
WF_PREVXYWH (6) This mode calculates the total size of the previous window, and +writes them into the further paramters wi_gw1, wi_gw2, +wi_gw3 and wi_gw4. +
  + +
WF_SCREEN (17) This mode returns the address and length of the internal buffer +in which the AES has stored the background of drop-down menus and +alert boxes, and writes these into the further parameters +wi_gw1 = high-WORD of the address, wi_gw2 = low-WORD +of the address, wi_gw3 = high-WORD of the length and +wi_gw4 = low-WORD of the length. +
  +
With TOS 1.02, 0 is returned for the length (though the +buffer holds 8000 bytes). +
  + +
WF_SHADE (22365) This mode returns the shading state of the window. +
  + + + +
wi_gw1 = Current shading state: +
1: Collapsed +
0: Flipped open + +
+ +
Warning: The presence of this feature should be checked +for with appl_getinfo (opcode 22360). +
  + +
WF_TOOLBAR (30) lThis mode returns the address of the OBJECT structure of the +toolbar. For this, wi_gw1 contains the high-WORD and +wi_gw2 the low-WORD of the address. +
  + +
WF_TOP (10) This mode returns the following values: +
  + + + + + + + + + + + + + + + +
wi_gw1 = ID of the topped window +
As of AES 3.3   +
wi_gw2 = AES ID of the owner +
wi_gw3 = Handle from the window below +
wi_gw4 = Special case for MagiC 2.0 + +
+ +
If no window is open, wi_gw1 contains the value 0. +
+
  +
Warning: MagiC 2.0 must return a negative number (-2) +for the top window handle if it belongs to the program of another +application, else a string of old programs will not run. In MagiC 2.0 +the actual handle is returned in wi_gw4. As of MagiC 3 this +no longer occurs, i.e. the handle will be passed as usual in +wi_gw1. +
  +
XaAES return the AES ID in wi_gw4 of the app that +owns the window below. +
  + +
WF_USER_POINTER (230) Get the user value of the window. +
wi_gw1 and wi_gw2 are the 2 values already set by +user with wind_set. +
MyAES feature +
  + +
WF_UNICONIFY (27) This mode obtains the original dimensions of an iconified +window. +
  + + + + + + + + + + + + +
wi_gw1 = X-position, and +
wi_gw2 = Y-position of top L corner, +
wi_gw3 = Width and +
wi_gw4 = Height of the window + +
+ +
Warning: The presence of this feature should be checked +for with appl_getinfo (opcode 11). +
  + +
WF_VSLIDE (9) This mode calculates the position of the vertical slider, and writes +this into the further parameter wi_gw1 (0=very top to +1000=very bottom). +
  + +
WF_VSLSIZE (16) This mode calculates the height of the vertical slider relative +to the total window height, and writes this into the further +parameters wi_gw1 (-1=smallest height, 1=small to 1000=whole +height). +
  + +
WF_WIDGETS (200) This mode obtains the current positions of the slider objects +(W_UPARROW, W_DNARROW, etc.) of the window with the ID +wi_ghandle. Written in the parameters wi_gw1 and +wi_gw2 are the vertical components of the type rightwidgets, +in the parameters wi_gw3and wi_gw4 the horizontal +components of the type bottomwidgets. wi_gw1 is the top-most +component, wi_gw2 the lowest component of the vertical slider. +wi_gw3 is the left-most component and wi_gw4 the +right-most component of the horizontal slider. +
  +
Warning: The presence of this feature should be checked +for with appl_getinfo (opcode 11). +
  + + +
WF_M_WINDLIST (102) This mode returns in wi_gw1 (high-WORD) and +wi_gw2 (low-WORD) a pointer to a NULL-terminated table of the +opened windows (first element = top window), i.e. to a list of their +handles as integer values. Negative handles belong to frozen +applications. In no case may a write-access be made to the pointer! +
  +
Only present in KAOS as of 1.4.2 (WF_WINDLIST) and MagiC. +
  + +
WF_WINX (22360) This mode returns information about an installed WINX version +(as of WINX 2.1). +
  + + + + + + + + + + + + +
wi_gw1 = Version + + + + + + + + + + + + +
Bit [15..12] Beta indicator +
Bit [11.. 8] Major version number (currently 2) +
Bit [ 7.. 4] Minor version number (actually 3) +
Bit [ 3.. 0] Internal identifier + +
+ +
wi_gw2 = Creation date, GEMDOS format +
wi_gw3 = Pointer (low-WORD) of the WINX externals, (or NULL) +
wi_gw4 = Pointer (high-WORD) of the WINX externals, (or NULL) + +
+ + +
WF_WINXCFG (22361) This mode returns the application-specific configuration +switches of the currently running application. +
  + + + + + + + + + + + + +
wi_gw1 = Mask of the GLOBAL switches which are supported by the +currently installed version of WINX +
wi_gw2 = The current setting of the GLOBAL switches; applicable are only +those switches which are set in the mask (bit 0 = switch 1) +
wi_gw3 = Mask of the LOCAL switches, which are supported by the +currently installed version of WINX +
wi_gw4 = The current setting of the LOCAL switches; applicable are only +those switches which are set in the mask (bit 0 = switch 1) + +
+ +
Normally applications should forgo the inquiry of this +information. +
  +
Warning: The presence of this feature should be checked +for with appl_getinfo (opcode 22360). +
  + +
WF_WORKXYWH (4) This mode calculates the coordinates of the working area of the +window, and writes these into the further parameters wi_gw1, +wi_gw2, wi_gw3 and wi_gw4. +
  + +
XA (0x5841) If the return value of this call is 'XA' (0x5841) then XaAES +is installed. In wi_gw1 is the version (0x0964 for version +V0.964). wi_ghandle must be zero. +
  + +
+ +
Note: The parameters wi_gw1, wi_gw2, wi_gw3 and +wi_gw4 here are pure output parameters. +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: All AES versions. +
  +
Group: Window library +
  +
See also: Binding   wind_set   Subfunctions overview +
  + +
+ +

8.9.8.1 Bindings for wind_get

+ + + + + + + + + +
C: int16_t wind_get ( int16_t wi_ghandle, int16_t wi_gfield, +int16_t *wi_gw1, int16_t *wi_gw2, int16_t *wi_gw3, int16_t *wi_gw3 ); +
  +
Binding: +
  +
int16_t wind_get ( int16_t wi_ghandle, int16_t wi_gfield,
+                   int16_t *wi_gw1, int16_t *wi_gw2,
+                   int16_t *wi_gw3, int16_t *wi_gw3)
+{
+   int_in[0]  = wi_ghandle;
+   int_in[1]  = wi_gfield;
+
+   crys_if (104);
+
+   *wi_gw1 = int_out[1];
+   *wi_gw2 = int_out[2];
+   *wi_gw3 = int_out[3];
+   *wi_gw4 = int_out[4];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]104 # Function opcode
control+2control[1]2 # Entry in int_in
control+4control[2]5 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]wi_ghandle
int_in+2int_in[1]wi_gfield
int_outint_out[0]Return value
int_out+2int_out[1]wi_gw1
int_out+4int_out[2]wi_gw2
int_out+6int_out[3]wi_gw3
int_out+8int_out[4]wi_gw4
+
+ + +
+ +

8.9.9 wind_new

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »New window« - Close all windows. +
  +
Opcode: 109 +
  +
Syntax: void wind_new ( void ); +
  +
Description: The call wind_new closes and deletes all windows, and +resets the blocks set with wind_update as well as the mouse pointer +'hide' count. +
  +
Note about MagiC: Here the function is applied as a +global and comprehensive clean-up function for an application, and +also deletes its update requests, windows, menus etc. Other +applications will never be impaired. +
  +
Return value: The function does not provide a return. +
  +
Availability: Since AES version 1.4 +
  +
Group: Window library +
  +
See also: Binding   wind_create   wind_close   wind_update +
  + +
+ +

8.9.9.1 Bindings for wind_new

+ + + + + + + + + +
C: void wind_new ( void ); +
  +
Binding: +
  +
void wind_new (void)
+{
+   crys_if (109);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]109 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
+
+ + +
+ +

8.9.10 wind_open

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Open window« - Opens a window. +
  +
Opcode: 101 +
  +
Syntax: int16_t wind_open ( int16_t wi_ohandle, int16_t wi_owx, int16_t +wi_owy, int16_t wi_oww, int16_t wi_owh ); +
  +
Description: The call wind_open displays a window on the screen. The +following apply: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
wi_ohandleID of the window to be opened
wi_owxX-coordinate, and
wi_owyY-coordinate of top left corner,
wi_owwWidth, and
wi_owhHeight of the window
+
+ +
Note: The window must have been created beforehand with +wind_create. The components title-bar, info-line and slider must have been +set previously with a call of wind_set. +
  +
When specifying the coordinates -1,-1,-1,-1 for MagiC 3 onwards, +the window will be placed at the next free position for iconifiable +windows. +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: All AES versions. +
  +
Group: Window library +
  +
See also: Binding   wind_create   wind_close   wind_set +
  + +
+ +

8.9.10.1 Bindings for wind_open

+ + + + + + + + + +
C: int16_t wind_open ( int16_t wi_ohandle, int16_t wi_owx, int16_t +wi_owy, int16_t wi_oww, int16_t wi_owh ); +
  +
Binding: +
  +
int16_t wind_open (int16_t wi_ohandle, int16_t wi_owx,
+                   int16_t wi_owy, int16_t wi_oww,
+                   int16_t wi_owh)
+{
+   int_in[0]  = wi_ohandle;
+   int_in[1]  = wi_owx;
+   int_in[2]  = wi_owy;
+   int_in[3]  = wi_oww;
+   int_in[4]  = wi_owh;
+
+   return ( crys_if(101) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]101 # Function opcode
control+2control[1]5 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]wi_ohandle
int_in+2int_in[1]wi_owx
int_in+4int_in[2]wi_owy
int_in+6int_in[3]wi_oww
int_in+8int_in[4]wi_owh
int_outint_out[0]Return value
+
+ + +
+ +

8.9.11 wind_set

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set window« - Alter various window attributes. +
  +
Opcode: 105 +
  +
Syntax: int16_t wind_set ( int16_t wi_shandle, int16_t wi_sfield, +int16_t wi_sw1, int16_t wi_sw2, int16_t wi_sw3, int16_t wi_sw4 ); +
  +
Description: Depending on the passed parameters, the call wind_set alters +various atributes of the window with the ID wi_shandle. The +following apply for wi_sfield: +
  +
Overview of all subfunctions; numbers in brackets represent +the wi_sfield mode: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
WF_BEVENT (24) This mode permits the stopping of a WM_TOPPED message when +clicking on a window (e.g. to allow continued functions in untopped +windows). wi_sw1 is a bit-vector in which only bit 0 has any +meaning at present. Other values than 1 are therefore not permitted. +The call would then be: wind_set(wi_shandle, WF_BEVENT, 0x0001, 0, 0, +0). +
Warning: The presence of this feature should be checked +for with appl_getinfo (opcode 11). + +
WF_BOTTOM (25) This mode permits placing the (opened) window with the ID +wi_shandle in the background, namely with wind_set(wi_shandle, +WF_BOTTOM, 0, 0, 0, 0). +
Warning: The presence of this feature should be checked +for with appl_getinfo (opcode 11). + +
WF_BOTTOMALL (22368) This mode places all windows of the application wi_sw1 +at the back. + + + +
wi_sw1 = ID of the application + +
+ +
If one passes a window ID unequal to DESKWINDOW in +wi_shandle, then in addition the wi_shandle window +will be placed right at the back (otherwise the order of the windows +amongst each other will remain unchanged). wi_shandle must be +open and belong to the application wi_sw1. +
There is no guarantee that an application can apply WF_BOTTOMALL to +the windows of another application (particularly in a multitasking +environment). In that case a 0 is returned. +
Warning: The presence of this feature should be checked +for with appl_getinfo (opcode 22360). + +
WF_COLOR (18) This mode alters the colour of a window component. For this the +index of the component is specified in wi_sw1: +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Element (Value) Description +
    + +
W_BOTTOMER (20) Backdrop button + +
W_BOX (0) Window's root object + +
W_CLOSER (2) Close-box + +
W_DATA (6) Parent object of the remaining components + +
W_DNARROW (11) Downward arrow + +
W_FULLER (4) Zoom-box + +
W_HBAR (14) Parent object of the vertical slider components + +
W_HELEV (18) Horizontal slider + +
W_HSLIDE (17) Background of the horizontal slider + +
W_INFO (5) Info-line + +
W_LFARROW (15) Leftward arrow + +
W_NAME (3) Move bar + +
W_RTARROW (16) Rightward arrow + +
W_SIZER (8) Size-box + +
W_SMALLER (19) Iconifier button + +
W_TITLE (1) Parent object of the close & zoom boxes, also the name + +
W_UPARROW (10) Upward arrow + +
W_VBAR (9) Parent object of the vertical slider components + +
W_VELEV (13) Vertical slider + +
W_VSLIDE (12) Background of the vertical slider + +
W_WORK (7) Working area + +
+ +
The colour for the object type of the window component is passed +in parameter wi_sw2 if the window is topped, in wi_sw3 +if it is inactive. A value of -1 retains the current colour setting. +
Warning: The presence of this feature should be checked +for with appl_getinfo (opcode 11). With TOS it only works as of AES +Version 3.00. + +
WF_CURRXYWH (5) This mode sets the window size from wi_sw1, +wi_sw2, wi_sw3 and wi_sw4. +
XaAES is compatible with all other AES's, except from the +following points: + +
    +
  1. If x, y, w and h all have a +value of -1 XaAES ignores the call, but fills in any return values +when needed. +
  2. +
  3. x and y values of -1 are 'legal', i.e, one +cannot use -1 to use any old x value. Of course, the x +and y coordinates are checked to be inside the root window +(not X when noleft = false). +
  4. +
  5. When h has a value of 0, the window is in fact shaded. +This is a thing N.AES does with MiNTSetter, although I'm not sure +this is correct. The application is sent a WM_SHADED message. On the +next wind_set(handle, WF_CURRXYWH,...) where the h coordinate +is not equal to the window's shaded height, the window is unshaded. +While the window is shaded via this method, [Shift]-clicks on the +window title to shade a window are ignored. +
  6. +
+ +
XaAES from 2004-09-22 has an extended version. + +
WF_DCOLOR (19) This mode sets the default colours for the window components. The +parameter wi_shandle is ignored, and for the remaning +parameters the following applies: + + + + + + + + + +
wi_sw1 = Window component +
wi_sw2 = Colour for active window +
wi_sw3 = Colour for inactive window + +
+ +
Warning: The presence of this feature should be checked +for with appl_getinfo (opcode 11). With TOS it only works as of AES +Version 3.00; from Version 4.1 onwards it causes all the currently +displayed windows that have not had their colour set explicitly with +WF_COLOR to be changed. +
When changing the component W_FULLER, both W_SMALLER and +W_BOTTOMER will be changed automatically as well; this makes it +necessary to change the 'Fuller' first, then the remaining components. +
As of MagiC 4 it is possible to set 3D-flags for each individual +window component. The following apply for this: + + + + + + + + + + + + +
wi_sw1 = Window component +
wi_sw2 = Colour in active state +
wi_sw3 = Colour in inactive state +
wi_sw4 = 3D-flags + +
+ +
The parameter wi_shandle must take the value 0 for this; +the 3D-flags are described as a bit-vector for which the following +apply: + + + + + + + + + + + + + + + +
Bit-0 = '3D in foreground' effect +
Bit-1 = '3D in background' effect +
Bit-2 = 'Selectable in foreground' effect +
Bit-3 = 'Selectable in background' effect +
Bit-8+n = Mask bit for bit 'n' + +
+ +
Thus only those bits for which the associated mask bit is set +are altered. The presence of this feature can presently not be +checked for with appl_getinfo. + +
WF_DDELAY (22362) This mode sets delay values: + + + + + + + + + + + + +
wi_sw1 = Start delay for a click on a scroll arrow +
wi_sw2 = Continuing delay for a click on a scroll arrow +
wi_sw3 = Continuing delay for a click on the 'Closer' widget +
wi_sw4 = Continuing delay for a click on the 'Fuller' widget + +
+ +
All values are set in milliseconds. +
The delay values serve to retard actions if these are executed +too quickly (for instance due to newer hardware). +
Warning: The presence of this feature should be checked +for with appl_getinfo (opcode 22360). + +
WF_FULLSCREEN (235) Switch fullscreen - normal window mode. The fullscreen mode is +without any widget. +
Hit the key ESC escape from fullscreen mode. +
MyAES 0.96 feature + +
WF_FULLXYWH (7) If either wi_sw1, wi_sw2, wi_sw3 or +wi_sw4 have a value of -1, that coordinate is not changed. If +ALL coordinates have a value of -1, the window is actually moved to +the current FULLXYWH coordinates, making the current window position +the new PREVXYWH position. +
XaAES since 2004-09-22, there is an extend version. + +
WF_HSLIDE (8) This mode sets the horizontal slider to the new position +wi_sw1 (0=far left, to 1000=far right). + +
WF_HSLSIZE (15) This mode sets the size of the horizontal slider relative to +the total width of the window to wi_sw1 (-1=smallest size, +1=small to 1000=total width). + +
WF_ICONIFY (26) This mode iconifies the window. The parameters wi_sw1 +to wi_sw4 specify the position and the size of the window in +its iconified state; these values are obtained from the AES at the +arrival of a WM_ICONIFY message. Tip: To iconify an already +created but not yet opened window, pass (-1,-1,-1,-1) as +coordinates. The window can then be displayed on the screen with +wind_open(handle,-1,-1,-1,-1). As of MagiC 4 and XaAES v0.943 this +works also if the window is already open. +
Warning: The presence of this feature should be checked +for with appl_getinfo (opcode 11). + + +
WF_IGNORE (13) This mode is used in some old AES versions. Its function is +unknown. + +
WF_INFO (3) This mode writes the string to which wi_sw1 and +wi_sw2 point to the Info-line. GEM only uses the pointer for +this and does not create a copy. Under GEM the length is +restricted to 80 characters; with N.AES there is a maxium of 128, +with XaAES up to 200 are allowed. + +
WF_KIND (1) This mode sets wi_sw1 as a new window component; format +as for wind_create. (MagiC since version 6.00 (1998.01.26), MyAES +since 2022.12.27) + + +
WF_M_BACKDROP (100) With this mode a window wi_sw1 can be moved at one go +to the bottom of the window stack without altering the order of the +remaining windows. In KAOS 1.4.2 this parameter was still called +WF_BACKDROP. + +
WF_MENU (33) This mode can attach a menu bar to a window. If the window was +created without the MENUBAR attribute, the call is ignored. +wi_sw1 and wi_sw2 must point to the address of the +tree. You get MN_SELECTED message in the extended manner adopted from +AES 4.1. +
Only available in XaAES. + +
WF_NAME (2) This mode writes the string to which wi_sw1 and +wi_sw2 point to the title-bar. GEM only uses the pointer for +this and does not create a copy. Under GEM the length is +restricted to 80 characters; with N.AES there is a maxium of 128, +with XaAES up to 200 are allowed. + +
WF_NEWDESK (14) This mode sets the object tree to which wi_sw1 and +wi_sw2 point as a new desktop, with wi_sw3 as the +start object. By passing a NULL-pointer, the default background can be +set again. + +
WF_OPTIONS (234) Change window behavior + + + + + + +
wi_sw1 = +
 1: request automatic close when application focus is lost and +restore it when is back +
+
wi_sw2 = remove/add option: +
1: add option +
0: remove option + +
+ +
MyAES feature + +
WF_OPTS (41) This mode sets some special options for XaAES. +
wi_handle is a window handle, or -1. If 'handle' is a +legal window handle, the options will only apply to that window. If +'handle' is -1, the settings will apply to all windows the application +creates AFTER this call. wi_sw1 is 0 to clear the selected +bits. or 1 to set the selected bits. wi_sw2 Currently +available options for this are as follows: + + + + + + + + + + + + + + + + + + + +
WO0_WHEEL (0x0001) Setting this bit will enable extended mouse-wheel support, and +go into WHL_AROWWHEEL mode causing XaAES to send extended WM_ARROWED +messages to the application when the mouse-wheel turns. Read section +"XaAES and wheel mouse handling" for details. + +
WO0_FULLREDRAW (0x0002) Setting this bit will make XaAES send WM_REDRAW messages to +cover the whole work-area of the window when it is FULLED. Default +behaviour is to only send WM_REDRAW messages for the areas that need +it, blitting the already visible parts. This can also be configured +via xaaes.cnf, see the app_options argument 'naesff'. + +
WO0_NOBLITW (0x0004) Setting this bit will make XaAES send WM_REDRAW messages to +cover the whole work-area of the window when its WIDTH changes. This +is handy for apps like HighWire, text processors etc. that need to +reformat when window width changes. Default behaviour is to send +WM_REDRAW messages for the areas that need it. + +
WO0_NOBLITH (0x0008) Setting this bit will make XaAES send WM_REDRAW messages to +cover the whole work-area of the window when its HEIGHT changes. +Default behaviour is to send WM_REDRAW messages for the areas that +need it. + +
WO0_SENDREPOS (0x0010) Setting this bit will make XaAES send a WM_REPOSED (38) +message when a window's X/WIDTH and/or Y/HEIGHT coordinate pair +changes. Such changes happen when the user resizes the window using +upper/left borders. Default behaviour is to first send a WM_MOVED +followed by a WM_SIZED message under these conditions, because older +apps don't evaluate the WIDTH/HEIGHT in WM_MOVED messages. So, dudes, +set this bit and use WM_REPOSED! + +
WO0_WCOWORK (0x0020) Setting this bit will enable Window Coordinate Orientation WORK +mode. + +
+ +
wi_sw3 and wi_sw4 are currently undefined and +must be cleared. +
The presence should be checked for using appl_getinfo (opcode 11). + +
WF_PREVXYWH (6) If eitherwi_sw1, wi_sw2, wi_sw3 or +wi_sw4 have a value of -1, that coordinate is not changed. If +ALL coordinates have a value of -1, the window is actually moved to +the current PREVXYWH coordinates, making the current window position +the new PREVXYWH position. +
XaAES from 2004-09-22 has an extended version. + +
WF_SHADE (22365) This mode sets the shading state of the window. + + + +
wi_sw1 = Shade state to be activated:  1: Collapsed +
 0: Flipped open +
-1: Switch state + +
+ +
When shading (collapsing) a WM_SHADED message is sent, when +unshading a WM_UNSHADED and a WM_REDRAW over the complete working area +of the window. If one sets the state before opening the window, then +it will be respected on opening. The closing of a window sets it +automatically to unshaded (flipped open). +
Warning: The presence of this feature should be checked +for with appl_getinfo (opcode 22360). + +
WF_STACK (22366) This mode puts the window wi_shandle in the window +stack below the window wi_sw1, without changing the screen +position itself. + + + +
wi_sw1 = Open window/DESKWINDOW(0)/NOWINDOW (-1) + +
+ +
If window wi_shandle is closed, the desired position is +stored and taken into account on opening the window with wind_open. +wi_sw1 is only evaluated at the actual positioning. Should +(wi_sw1 == DESKWINDOW), the window will be placed right at the +back (corresponds to WF_BOTTOM). If (wi_sw1 == NOWINDOW) or +wi_sw1 is not open, then the window wi_shandle will be +placed right at the front (corresponds to WF_TOP). +
Warning: The presence of this feature should be checked +for with appl_getinfo (opcode 22360). + +
WF_TOOLBAR (30) This mode attaches a toolbar to a window, or alters or removes +it. The following apply: + + + + + + +
wi_sw1 = High-WORD, and +
wi_sw2 = Low-WORD of the toolbar address + +
+ +
To remove a toolbar, the parameters wi_sw1 and +wi_sw2 have to be set to NULL. +
XaAES as of v0.942 can process toolbars. This has some more +parameters: + + + + + + +
wi_sw3 = Object index of the item where the drawing will start +
wi_sw4 = The current editable object; where the cursor will be placed + +
+ +
Activating a toolbar object results in event WM_TOOLBAR if a +toolbar object is clicked. + +
WF_TOP (10) This mode makes the window with the identifier +wi_shandle be the new top window. As of MagiC 4 and XaAES +v0.943, a call of wind_set (-1, WF_TOP, id, ...) can swap the menu and +the desktop background to the application with the ID id; a +value of -1 for id represents the current application. + +
WF_TOPALL (22367) This mode brings all windows of the application wi_sw1 +to the front. + + + +
wi_sw1 = ID of the application + +
+ +
If one passes in wi_shandle a window ID other than +DESKWINDOW (0), then wi_shandle will also be placed right at +the front (else the order of the windows among each other will not be +altered). wi_shandle must be open and belong to the +application wi_sw1. There is no guarantee that an application +can apply WF_TOPALL to the windows of another application +(particularly in a multitasking environment). In that case a 0 is +returned. +
Warning: The presence of this feature should be checked +for with appl_getinfo (opcode 22360). + +
WF_UNICONIFY (27) This mode uniconifies a specified window, returning it to its +original size and position. It is only available as of AES Version +4.1. +
Warning: The presence of this feature should be checked +for with appl_getinfo (opcode 11). + +
WF_UNICONIFYXYWH (28) This mode uses the parameters wi_sw1 to wi_sw4 +to pass the position and size of the window in its uniconified state +to the next WF_UNICONIFY message targeting it. This opcode is +particularly useful if a window that is already in an iconified state +has been opened. It is only available as of AES Version 4.1. + +
WF_USER_POINTER (230) Link a user value to the windows. +
wi_sw1 and wi_sw2 are the 2 value you can transmit +it could be used as 32 bits pointer but any value can be provided. +
MyAES feature + +
WF_VSLIDE (9) This mode sets the vertical slider to the new position +wi_sw1 (0=very top to 1000=very bottom). + +
WF_VSLSIZE (16) This mode sets the height of the vertical slider relative to +the total height to the value wi_sw1 (-1=smallest height, +1=small to 1000=total height). + +
WF_WCOLOR No information available at present. + +
WF_WHEEL (40) This mode sets the WA_WHEEL event for one window +(wi_shandle= window ID) or for all applications +(wi_shandle= 0). If wi_sw1 = 1, then the XaAES sends +a special WM_ARROWED (WA_WHEEL) message. With wi_sw1= 1 one +gets the normal message. +
Available as of XaAES v0.960. + +
WF_WIDGETS (200) This mode sets the current positions of the slider objects +(W_UPARROW, W_DNARROW, etc.) of the window with the ID +wi_shandle. In the parameters wi_sw1 and +wi_sw2 are passed the vertical components of the type +rightwidgets, and in the parameters wi_sw3 and wi_sw4 +the horizontal components of the type bottomwidgets. wi_sw1 is +the top-most component wi_sw2 the lowest component of the +vertical slider. wi_sw3 is the left-most component and +wi_sw4 the right-most component of the horizontal slider. + +
WF_APPICON (201) Setzt ein Icon neben den Schliessknopf. (N.AES 3.0, never +released) + +
WF_WIND_ATTACH (231) attach a window to another, using it if you close the mother +window other windows linked will be closed. wi_sw1 the window +to attach. +
MyAES feature + +
WF_WINXCFG (22361) This mode sets the global and local switches of the called +application, provided this is possible. + + + + + + + + + + + + +
wi_sw1 = Mask of the global switch to be changed at this call (bit set +means adopt switch) +
wi_sw2 = New setting of the global switches (bit set means switch is on) +
wi_sw3 = Mask of the local switch to be changed at this call (bit set +means adopt switch) +
wi_sw4 = New setting of the local switches (bit set means switch is on) + +
+ +
Which switches were actually altered can be found with a call of +wind_get(WF_WINXCFG). Attention: This function should only be +called by configuration programs that know what they are doing (e.g. +WINX.CPX)! +
Warning: The presence of this feature should be checked +for with appl_getinfo (opcode 22360). + +
+ +
Note: The parameters wi_sw1, wi_sw2, wi_sw3 and +wi_sw4 here are dependent on the function number passed in the +parameter wi_sfield. +
  +
When specifying the window name, one should always leave a +space before and after the character string for aesthetic +reasons, since otherwise the pattern in the title-bar abuts directly to +the first and last character of the name. +
  +
Warning: The opcodes listed here are no longer +fully compatible with PC-GEM as development there proceeded in a +different direction. +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: All AES versions. +
  +
Group: Window library +
  +
See also: Binding   wind_get   wind_create   OBJECT   Subfunctions overview +
  + +
+ +

8.9.11.1 wind_set and PC-GEM

+

As of PC-GEM Version 2.0 the following apply: +

+ +

WF_ATTRB (18): This sets the window attribute vector. +Here: wi_sw1 = 0 (or 1): Window is the top window, or not; +apart from this there is no further information available. +

+ +

WF_SIZETOP (19): This makes the window an active one, +without changing the order of the other windows. At the same time the +position and size of the window can be reset: +

+ + + + + + + + + + + + +
wi_sw1 = X-position, and +
wi_sw2 = Y-position of top left corner, +
wi_sw3 = Width, and +
wi_sw4 = Height of the window + +
+ +

8.9.11.2 Bindings for wind_set

+ + + + + + + + + +
C: int16_t wind_set ( int16_t wi_shandle, int16_t wi_sfield, +int16_t wi_sw1, int16_t wi_sw2, int16_t wi_sw3, int16_t wi_sw4 ); +
  +
Binding: +
  +
int16_t wind_set ( int16_t wi_shandle, int16_t wi_sfield,
+                   int16_t wi_sw1, int16_t wi_sw2,
+                   int16_t wi_sw3, int16_t wi_sw4 )
+{
+   int_in[0]  = wi_shandle;
+   int_in[1]  = wi_sfield;
+   int_in[2]  = wi_sw1;
+   int_in[3]  = wi_sw2;
+   int_in[4]  = wi_sw3;
+   int_in[5]  = wi_sw4;
+
+   return ( crys_if(105) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]105 # Function opcode
control+2control[1]6 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]wi_shandle
int_in+2int_in[1]wi_sfield
int_in+4int_in[2]wi_sw1
int_in+6int_in[3]wi_sw2
int_in+8int_in[4]wi_sw3
int_in+10int_in[5]wi_sw4
int_outint_out[0]Return value
+
+ + +
+ +

8.9.11.3 WF_TOPMOST, wind_set

+ +

A class of windows that will always 'float' ontop of classical +windows. One key feature of windows in any WF_TOPMOST state is that they +do not disturb current keyboard focus, and can be used to issue +important messages, status raports, etc., without demanding user +interaction. +

+

wind_set (wi_shandle, WF_TOPMOST, wi_sw1,...) +

+

WF_TOPMOST (232) +

+ + + +
wi_sw1 = + + + + + + + + + +
0 = Remove topmost state on the corresponding window. +
1 = Set topmost state on the corresponding window. +
2 = Set topmost state and link window visibility to the owner's +focus. That is, when owner is untopped the window disappears, when +owner regains focus, the window automatically reappears. + +
+ + +
+ +

Some common characteristics of windows with any WF_TOPMOST state +set; +

+ +
    +
  1. Changing the WF_TOPMOST state can be done on open windows, but it +is prefer not if possible. +
  2. +
  3. Windows which have TOPMOST state 1 or 2 never get keyboard +focus. +
  4. +
  5. Windows which have TOPMOST state 1 or 2 never get WM_TOPPED or +WM_UNTOPPED AES messages. +
  6. +
+ +

State 1: +
Setting state 1 will make the corresponding window 'float' ontop +of all other classical windows. State 1 windows will stay ontop until +closed by the user or the application itself. +

+

State 2: +
Setting state 1 will make the corresponding window act like +windows with state 1 set, with one important exception; The window is +linked to the window owner's focus status. This means that when the +application that owns the window looses focus, state 2 windows are +automatically made unvisible by the AES. When the application +regains focus, the window is automatically made visible again. This is +done automatically, and no application handling is necessary. +

+

8.9.12 wind_update

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Update window« - Blocks or releases screen operations. +
  +
Opcode: 107 +
  +
Syntax: int16_t wind_update ( int16_t wi_ubegend ); +
  +
Description: The call wind_update signals the AES that a user application +is currently redrawing the screen. Following this, the AES +restricts its own graphical 'activities' such as the dropping down of +menus or the moving of windows, for instance. +
  + + + + + + + + + + + + + + + + + + +
wi_ubegend Meaning +
    +
END_UPDATE (0) Screen redraw is compete and the flag set by BEG_UPDATE is +reset +
BEG_UPDATE (1) Screen redraw starts, rectangle lists are frozen, flag is set +to prevent any other processes updating the screen +
END_MCTRL (2) Application releases control of the mouse to the AES and +resumes mouse click message reactions +
BEG_MCTRL (3) The application wants to have sole control over mouse button +messages + +
+ +
MagiC implements the 'check and set mode' of AES +4.00. The call then is wind_update (BEG_UPDATE|0x100) or and_update +(BEG_MCTRL|0x100), i.e. a logical OR with a NO_BLOCK mask (0x100). +Here the update control is only applied if no other application has +control of the screen semaphore. If it has, the function returns at +once with an error-value of 0. +
  +
Note: It is recommended that this function be used only +for time-sensitive applications (e.g. terminal programs etc.) where +long redraws by another applications could cause a timeout. +
  +
All wind_update modes nest, so to release the screen semaphore +the same number of END_UPDATE calls must be received as BEG_UPDATEs +were made, but it is preferable to design applications that avoid +nesting these calls. +
  +
Both the BEG_xxx calls should be used before displaying a form +or a popup to stop them from being overwritten, or mouse clicks to +them being passed to other applications. Also, make sure you wait +until after BEG_UPDATE has been called before turning off the +mouse cursor when updating the screen. +
  +
The presence of this feature can be inquired for with appl_getinfo +(opcode 11). +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: All AES versions. +
  +
Group: Window library +
  +
See also: Binding +
  + +
+ +

8.9.12.1 Bindings for wind_update

+ + + + + + + + + +
C: int16_t wind_update ( int16_t wi_ubegend ); +
  +
Binding: +
  +
int16_t wind_update (int16_t wi_ubegend)
+{
+   int_in[0] = wi_ubegend;
+   return ( crys_if(107) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]107 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]wi_ubegend
int_outint_out[0]Return value
+
+ + +
+ +

8.9.13 wind_xget

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Get window« - Obtain properties of a window, extended +version. +
  +
Opcode: 104 +
  +
Syntax: int16_t wind_xget ( int16_t wi_ghandle, int16_t wi_gfield, +int16_t *wi_gw1, int16_t *wi_gw2, int16_t *wi_gw3, int16_t *wi_gw4, +int16_t *wo_gw1, int16_t *wo_gw2, int16_t *wo_gw3, int16_t *wo_gw4 ); +
  +
Description: Depending on the parameters passed, the call wind_xget returns +information about various properties of the window with the ID +wi_ghandle. The following apply for wi_gfield: +
  +
Overview of all subfunctions; numbers in brackets represent +the wi_gfield mode: +
  + + + + + + + + + + +
WF_CALCF2W (42) +
This mode will take an arbitrary FULL area, and return the +corresponding WORK area. +
  +
The presence should be checked for using appl_getinfo (opcode 11). +
  + +
WF_CALCW2F (43) +
This mode will take an arbitrary WORK area, and return the +resulting FULL area of the window in question. +
  +
The presence should be checked for using appl_getinfo (opcode 11). +
  + +
WF_FIRSTAREAXYWH (13) +
wi_gw1, wi_gw2, wi_gw3 and wi_gw4 +define a clipping area, and the AES may optimize the list of +rectangles that is returned by WF_FIRSTAREAXYWH and WF_NEXTXYWH. +
  +
The presence should be checked for using appl_getinfo (opcode 11). +
  + +
+ +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: XaAES as of 2004-12-14 +
  +
Group: Window library +
  +
See also: Binding   wind_get   wind_set   Subfunctions overview +
  + +
+ +

8.9.13.1 Bindings for wind_xget

+ + + + + + + + + +
C: int16_t wind_xget ( int16_t wi_ghandle, int16_t wi_gfield, +int16_t *wi_gw1, int16_t *wi_gw2, int16_t *wi_gw3, int16_t *wi_gw4, +int16_t *wo_sw1, int16_t *wo_sw2, int16_t *wo_sw3, int16_t *wo_sw4 ); +
  +
Binding: +
  +
int16_t wind_xget ( int16_t wi_ghandle, int16_t wi_gfield,
+                    int16_t *wi_gw1, int16_t *wi_gw2,
+                    int16_t *wi_gw3, int16_t *wi_gw4,
+                    int16_t *wo_sw1, int16_t *wo_sw2,
+                    int16_t *wo_sw3, int16_t *wo_sw4 );
+{
+   int_in[0]  = wi_ghandle;
+   int_in[1]  = wi_gfield;
+   int_in[2]  = *wi_sw1;
+   int_in[3]  = *wi_sw2;
+   int_in[4]  = *wi_sw3;
+   int_in[5]  = *wi_sw4;
+
+   crys_if (104);
+
+   *wo_gw1 = int_out[1];
+   *wo_gw2 = int_out[2];
+   *wo_gw3 = int_out[3];
+   *wo_gw4 = int_out[4];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]104 # Function opcode
control+2control[1]6 # Entry in int_in
control+4control[2]5 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]wi_ghandle
int_in+2int_in[1]wi_gfield
int_in+4int_in[2]wi_gw1
int_in+6int_in[3]wi_gw2
int_in+8int_in[4]wi_gw3
int_in+10int_in[5]wi_gw4
int_outint_out[0]Return value
int_out+2int_out[1]wo_gw1
int_out+4int_out[2]wo_gw2
int_out+6int_out[3]wo_gw3
int_out+8int_out[4]wo_gw4
+
+ + +
+ +

8.9.14 wind_xset

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set window« - Alter individual properties of a window, +extended version. +
  +
Opcode: 105 +
  +
Syntax: int16_t wind_xset ( int16_t wi_shandle, int16_t wi_sfield, +int16_t wi_sw1, int16_t wi_sw2, int16_t wi_sw3, int16_t wi_sw4, +int16_t *wo_sw1, int16_t *wo_sw2, int16_t *wo_sw3, int16_t *wo_sw4 ); +
  +
Description: Depending on the passed parameters, the call wind_xset alters +various atributes of the window with the ID wi_shandle. The +following apply for wi_sfield: +
  +
Overview of all subfunctions; numbers in brackets represent +the wi_sfield mode: +
  + + + + + + + + + + +
WF_CURRXYWH (5) +
This mode sets the window size from wi_sw1, +wi_sw2, wi_sw3 and wi_sw4. +
XaAES is compatible with all other AES's, except from the +following points: + +
    +
  1. If x, y, w and h all have a +value of -1 XaAES ignores the call, but fills in any return values +when needed. +
  2. +
  3. x and y values of -1 are 'legal', i.e, one +cannot use -1 to use any old x value. Of course, the x +and y coordinates are checked to be inside the root window +(not X when noleft = false). +
  4. +
  5. When h has a value of 0, the window is in fact shaded. +This is a thing N.AES does with MiNTSetter, although I'm not sure +this is correct. The application is sent a WM_SHADED message. On the +next wind_set(handle, WF_CURRXYWH,...) where the h coordinate +is not equal to the window's shaded height, the window is unshaded. +While the window is shaded via this method, [Shift]-clicks on the +window title to shade a window are ignored. +
  6. +
+ +
XaAES as of 2004-09-22, there is also a shorter version. + +
WF_FULLXYWH (7) +
If either wi_sw1, wi_sw2, wi_sw3 or +wi_sw4 have a value of -1, that coordinate is not changed. If +ALL coordinates have a value of -1, the window is actually moved to +the current FULLXYWH coordinates, making the current window position +the new PREVXYWH position. + +
    +
  1. XaAES returns the resulting FULLXYWH, which the window will be +moved to on the next use of the FULLED widget or... +
  2. +
  3. When all coordinates passed have a value of -1, XaAES returns +the CURRXYWH of the new position the window was moved to, removing the +need for a wind_get(handle, WF_CURRXYWH,...) call. +
  4. +
+ +
XaAES as of 2004-09-22, there is also a shorter version. + +
WF_PREVXYWH (6) +
If eitherwi_sw1, wi_sw2, wi_sw3 or +wi_sw4 have a value of -1, that coordinate is not changed. If +ALL coordinates have a value of -1, the window is actually moved to +the current PREVXYWH coordinates, making the current window position +the new PREVXYWH position. + +
    +
  1. XaAES returns the resulting PREVXYWH, which the window will be +moved to on the next use of the FULLED widget or... +
  2. +
  3. When all coordinates passed have a value of -1, XaAES returns +the CURRXYWH of the new position the window was moved to, removing the +need for a wind_get(handle, WF_CURRXYWH,...) call. +
  4. +
+ +
XaAES as of 2004-09-22, there is an shorterversion. + +
+ +
Note: The parameters wi_sw1, wi_sw2, wi_sw3 and +wi_sw4 here are dependent on the function number passed in the +parameter wi_sfield. +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: XaAES since 2004-09-22 +
  +
Group: Window library +
  +
See also: Binding   wind_get   wind_create   OBJECT   Subfunctions overview +
  + +
+ +

8.9.14.1 Bindings for wind_xset

+ + + + + + + + + +
C: int16_t wind_xset ( int16_t wi_shandle, int16_t wi_sfield, +int16_t wi_sw1, int16_t wi_sw2, int16_t wi_sw3, int16_t wi_sw4, +int16_t *wo_sw1, int16_t *wo_sw2, int16_t *wo_sw3, int16_t *wo_sw4 ); +
  +
Binding: +
  +
int16_t wind_xset ( int16_t wi_shandle, int16_t wi_sfield,
+                    int16_t wi_sw1, int16_t wi_sw2,
+                    int16_t wi_sw3, int16_t wi_sw4,
+                    int16_t *wo_sw1, int16_t *wo_sw2,
+                    int16_t *wo_sw3, int16_t *wo_sw4 );
+{
+   int_in[0]  = wi_shandle;
+   int_in[1]  = wi_sfield;
+   int_in[2]  = wi_sw1;
+   int_in[3]  = wi_sw2;
+   int_in[4]  = wi_sw3;
+   int_in[5]  = wi_sw4;
+
+   crys_if(105);
+
+   *wo_sw1 = int_out[1];
+   *wo_sw1 = int_out[2];
+   *wo_sw1 = int_out[3];
+   *wo_sw1 = int_out[4];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]105 # Function opcode
control+2control[1]6 # Entry in int_in
control+4control[2]5 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]wi_shandle
int_in+2int_in[1]wi_sfield
int_in+4int_in[2]wi_sw1
int_in+6int_in[3]wi_sw2
int_in+8int_in[4]wi_sw3
int_in+10int_in[5]wi_sw4
int_outint_out[0]Return value
int_out+2int_out[1]wo_sw1
int_out+4int_out[2]wo_sw2
int_out+6int_out[3]wo_sw3
int_out+8int_out[4]wo_sw4
+
+ + +
+ +

8.9.15 x_wdial_change

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Redraw object« - Redraw one object within a window dialog, +showing a new state. +
  +
Opcode: 29009 +
  +
Syntax: int16_t x_wdial_change( int16_t handle, int16_t object, int16_t +newstate ); +
  +
Description: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Handle of the window having the dialog +
object Object whose state is changing +
newstate The object's new ob_state + +
+ +
This function will redraw an object in a dialog contained within +a window, showing its new state. This is commonly used to show an exit +button being selected or another button becoming disabled. The dialog +must have previously been set using the wind_set option X_WF_DIALOG. +
  +
Return value: 0 = An error occurred +
  +
An error code is returned if either the handle specified is not +a valid window handle, if the window does not belong to the +application making the x_wdial_draw call, if the window does not +contain a dialog, or if the window is not currently open. +
  +
Availability: The function is only available under Geneva. +
  +
Group: Window library +
  +
See also: Binding +
  + +
+ +

8.9.15.1 Bindings for x_wdial_change

+ + + + + + + + + +
C: int16_t x_wdial_change( int16_t handle, int16_t object, int16_t +newstate ); +
  +
Binding: +
  +
int16_t x_wdial_change( int16_t handle, int16_t object,
+int16_t newstate )
+{
+   int_in[0] = handle;
+   int_in[1] = object;
+   int_in[2] = newstate;
+
+   crys_if(29009);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]29009 # Function opcode
control+2control[1]3 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]handle
int_in+2int_in[1]object
int_in+4int_in[2]newstate
int_outint_out[0]Return value
+
+ + +
+ +

8.9.16 x_wdial_draw

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Redraw dialog« - Redraw a dialog within a window +
  +
Opcode: 29008 +
  +
Syntax: int16_t x_wdial_draw( int16_t handle, int16_t start, int16_t +depth ); +
  +
Description: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
handle Handle of the window having the dialog +
edit_obj Object being edited +
start First object to draw +
depth Level to draw until: +
+
+ + + + + + + + + + + + + + + + + + + + +
0=Draw just the object
1=Draw object and its immediate children
...  
8=Draw all levels of children
+
+ + +
+ +
This function will redraw a dialog contained within a window. +The dialog must have previously been set using the wind_set option +X_WF_DIALOG. +
  +
The dialog is redrawn, starting at start, continuing for depth +levels, taking into account any other windows which may overlap the +one being drawn. +
  +
Return value: 0 = An error occurred +
  +
An error code is returned if either the handle specified is not +a valid window handle, if the window does not belong to the +application making the x_wdial_draw call, if the window does not +contain a dialog, or if the window is not currently open. +
  +
Availability: The function is only available under Geneva. +
  +
Group: Window library +
  +
See also: Binding +
  + +
+ +

8.9.16.1 Bindings for x_wdial_draw

+ + + + + + + + + +
C: int16_t x_wdial_draw( int16_t handle, int16_t start, int16_t +depth ); +
  +
Binding: +
  +
int16_t x_wdial_draw( int16_t handle, int16_t start, int16_t
+depth )
+{
+   int_in[0] = handle;
+   int_in[1] = start;
+   int_in[2] = depth;
+
+   crys_if(29008);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]29008 # Function opcode
control+2control[1]3 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]handle
int_in+2int_in[1]start
int_in+4int_in[2]depth
int_outint_out[0]Return value
+
+ + +
+ +

8.9.17 x_wind_calc

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Window calculation« - Calculates the limits or the total +space requirement of a window, extended version +
  +
Opcode: 29012 +
  +
Syntax: int16_t x_wind_calc ( int16_t wi_ctype, int16_t wi_ckind, +int16_t wi_xkind, int16_t wi_cinx, int16_t wi_ciny, int16_t wi_cinw, +int16_t wi_cinh, int16_t *coutx, int16_t *couty, int16_t *coutw, +int16_t *couth ); +
  +
Description: +
  + + + + + + + + + +
Parameter Meaning +
    +
wi_xkind Extended window type: +
+
+ + + + + + + + + + + + + + + + + + + + +
ElementValueMeaning
X_MENU0x0001 
X_HSPLIT0x0002 
X_VSPLIT0x0004 
+
+ + +
+ +
All other parameter see wind_calc. +
  +
If you wish to use new or extended functions such as the X_MENU +or split window attributes, then x_wind_create must be used to create +these windows. +
  +
Return value: An error has arisen only if the value 0 is returned. +
  +
Availability: The function is only available under Geneva. +
  +
Group: Window library +
  +
See also: Binding   x_wind_create +
  + +
+ +

8.9.17.1 Bindings for x_wind_calc

+ + + + + + + + + +
C: int16_t x_wind_calc ( int16_t wi_ctype, int16_t wi_ckind, +int16_t wi_xkind, int16_t wi_cinx, int16_t wi_ciny, int16_t wi_cinw, +int16_t wi_cinh, int16_t *coutx, int16_t *couty, int16_t *coutw, +int16_t *couth ); +
  +
Binding: +
  +
int16_t x_wind_calc ( int16_t wi_ctype, int16_t wi_ckind,
+int16_t wi_xkind, int16_t wi_cinx, int16_t wi_ciny, int16_t
+wi_cinw, int16_t wi_cinh, int16_t *coutx, int16_t *couty,
+int16_t *coutw, int16_t *couth )
+{
+   int_in[0]  = wi_ctype;
+   int_in[1]  = wi_ckind;
+   int_in[2]  = wi_xkind;
+   int_in[3]  = wi_cinx;
+   int_in[4]  = wi_ciny;
+   int_in[5]  = wi_cinw;
+   int_in[6]  = wi_cinh;
+
+   crys_if(29012);
+
+   *coutx = int_out[1];
+   *couty = int_out[2];
+   *coutw = int_out[3];
+   *couth = int_out[4];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]29012 # Function opcode
control+2control[1]7 # Entry in int_in
control+4control[2]5 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]wi_ctype
int_in+2int_in[1]wi_ckind
int_in+4int_in[2]wi_xkind
int_in+6int_in[3]wi_cinx
int_in+8int_in[4]wi_ciny
int_in+10int_in[5]wi_cinw
int_in+12int_in[6]wi_cinh
int_outint_out[0]Return value
int_out+2int_out[1]coutx
int_out+4int_out[2]couty
int_out+6int_out[3]coutw
int_out+8int_out[4]couth
+
+ + +
+ +

8.9.18 x_wind_create

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Window create« - Initializes a new window, extended version +
  +
Opcode: 29011 +
  +
Syntax: int16_t x_wind_create ( int16_t wi_crkind, int16_t wi_xkind, +int16_t wi_crwx, int16_t wi_crwy, int16_t wi_crww, int16_t wi_crwh ); +
  +
Description: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
wi_crkind Window type (ala wind_create) +
wi_xkind Extended window type: + + + +
+
+ + + + + + + + + + + + + + + + + + + + +
ElementValueMeaning
X_MENU0x0001 
X_HSPLIT0x0002 
X_VSPLIT0x0004 
+
+ +
wi_crwx Window x-coordinate +
wi_crwy Window y-coordinate +
wi_crww Window width +
wi_crwh Window height + +
+ +
If you wish to use new or extended functions such as the X_MENU +or split window attributes, then x_wind_create must be used to create +these windows. +
  +
Return value: 0 = An error occurred +
  +
Availability: The function is only available under Geneva. +
  +
Group: Window library +
  +
See also: Binding   wind_delete +
  + +
+ +

8.9.18.1 Bindings for x_wind_create

+ + + + + + + + + +
C: int16_t x_wind_create ( int16_t wi_crkind, int16_t wi_xkind, +int16_t wi_crwx, int16_t wi_crwy, int16_t wi_crww, int16_t wi_crwh ); +
  +
Binding: +
  +
int16_t x_wind_create ( int16_t wi_crkind, int16_t wi_xkind,
+int16_t wi_crwx, int16_t wi_crwy, int16_t wi_crww, int16_t
+wi_crwh )
+{
+   int_in[0]  = wi_crkind;
+   int_in[1]  = wi_xkind;
+   int_in[2]  = wi_crwx;
+   int_in[3]  = wi_crwy;
+   int_in[4]  = wi_crww;
+   int_in[5]  = wi_crwh;
+
+   crys_if(29011);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]29011 # Function opcode
control+2control[1]6 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]wi_crkind
int_in+2int_in[1]wi_xkind
int_in+4int_in[2]wi_crwx
int_in+6int_in[3]wi_crwy
int_in+8int_in[4]wi_crww
int_in+10int_in[5]wi_crwh
int_outint_out[0]Return value
+
+ + +
+ +

8.9.19 x_wind_tree

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Window gadgets« - Change window gadgets +
  +
Opcode: 29010 +
  +
Syntax: int16_t x_wind_tree( int16_t mode, WIND_TREE *wtree ); +
  +
Description: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
mode + + + +
+
+ + + + + + + + + + + + + + + + + + + + +
modeValueMeaning
X_WT_GETCNT0  Get count and flag
X_WT_READ1  Copy window tree
X_WT_SET2  Set new tree
+
+ +
wtree Pointer to a WIND_TREE structure + +
+ +
This function alters the way in which Geneva draws and processes +the gadgets of a particular window. This allows a program to take +control over how gadgets react to the mouse, and also to add new +gadgets. +
  +
The gadgets that make up a window are really just another OBJECT +tree. This function allows you to modify it by (optionally) reading +the current tree into a block of your program's memory. Geneva can +then be informed that the modified tree (or, for that matter, any +OBJECT tree) should be used for the window gadgets. +
  +
Note: This function will only affect windows which have +already been created. +
  +
If all you need to do in your program is to change the fill +patterns or colors of a gadget, it is better to use wind_set( WF_COLOR +) to accomplish this task, if possible. +
  +
Mode 0, X_WT_GETCNT (get count & flags) +
This mode must be used prior to mode 1. It sets the count element +of the structure pointed to by wtree to contain the number of OBJECTS +that make up the bendow's tree. The tree element is unchanged. +beginning of section top of page +
  +
Mode 1, X_WT_READ (Read the current tree into the program's +memory) +
This mode copies count OBJECTS of the window's current tree into +the array of OBJECTS pointed to by the tree element. The area of +memory MUST be large enough to hold count elements. +
  +
Note that any objects in the resulting tree which have the +HIDETREE ob_flag set are inactive, and their sizes and locations may +be inaccurate. +
  +
If the tree which was being copied was the default OBJECT tree +used by Geneva, then the ob_spec fields of the second (WGMOVE) and +seventh (WGINFO) OBJECTS in the resulting copy will be zero. If this +tree is then set (using mode 2, below), and the X_WTFL_RESIZE bit is +on, then the programmer MUST modify these ob_spec's to point to +TEDINFO structures! Otherwise, Geneva will attempt to set the title +and info text in bad memory locations. beginning of section top of +page +
  +
Mode 2, X_WT_SET (Set count, flags, and tree address) +
This mode changes the attributes. If count is not less than zero, +the window's OBJECT tree and count of objects will be set. The tree +element must point to a static area of memory containing an OBJECT +tree. The flags are always set, regardless of count. +
  +
The following bits are defined in the flags element. By default, +they are all set (turned on) for any window that is created. Undefined +bits are reserved for future use and should not be modified. +
  +
    +
  • Flags bit 0, X_WTFL_RESIZE +
      +
    When set, the window's gadgets are automatically resized +whenever the window's size is changed. If this bit is on, the ordering +of the OBJECTs which make up the window's tree MUST not change. +However, more objects can be appended to the end of the tree. When +this bit is off, Geneva will never change the sizes, positions, flags, +colors, or text of any object in the tree. +
      +

  • +
  • Flags bit 1, X_WTFL_CLICKS +
      +
    When set, the window responds normally to mouse clicks on the +gadgets by moving the window, dragging the scroll bars, etc. When this +bit is off, any mouse clicks (or keyboard equivalents for these +actions) will be returned as either a WM_ARROWED message to indicate +which arrow/scroll bar gadget was chosen, or an X_WM_SELECTED message +for any other gadget. In this case, the program is responsible for +taking an appropriate action. The Task Manager uses this bit in its +"Keyboard..." dialog. +
      +

  • +
  • Flags bit 2, X_WTFL_SLIDERS +
      +
    When set, the sliders of a windowed dialog and info bar of a +window will act normally. When it is off, the sliders for a windowed +dialog will never change (even if the dialog is moved by the +application), and clicking on the info left/right arrows will do +nothing. The Task Manager uses this bit in its "Keyboard..." +dialog. +
      +

  • +
+ +
Example: +
  +
/* Get the tree for a window, and change the appearence of
+the up and down arrows */
+TEDINFO info_ted, mover_ted;
+OBJECT *tree
+WIND_TREE wt;
+int16_t handle;
+
+/* Create a window */
+if( (handle = wind_create( UPARROW|DNARROW|VSLIDE, 20, 20,
+   200, 200 )) != 0 )
+{
+  /* Get the current count and flags */
+  wt.handle = handle;
+  x_wind_tree( X_WT_GETCNT, &wt );
+  /* Now allocate enough memory to hold the entire tree */
+  if( (tree = Malloc( wt.count*sizeof(OBJECT) )) != 0 )
+  {
+     /* And get the tree */
+     wt.tree = tree;
+     x_wind_tree( X_WT_READ, &wt );
+     /* Now, we *must* set these two TEDINFO's. The
+        contents of theTEDINFO's is not important
+        because the info and mover bars  are not used */
+     tree[WGMOVE].ob_spec.tedinfo = &mover_ted;
+     tree[WGINFO].ob_spec.tedinfo = &info_ted;
+     /* Modify the arrows. The up arrow will now be a
+        '^' character, and the down arrow will be a 'v' */
+     tree[WGUP].ob_spec.bfobspec.character = '^';
+     tree[WGDOWN].ob_spec.bfobspec.character = 'v';
+     x_wind_tree( X_WT_SET, &wt );
+     /* All done! The window can be opened now, but don't
+        forget to Mfree(tree) later on when it's closed. */
+  }
+}
+
+
Return value: 0 = An error occurred +
  +
Availability: The function is only available under Geneva. +
  +
Group: Window library +
  +
See also: Binding +
  + +
+ +

8.9.19.1 Bindings for x_wind_tree

+ + + + + + + + + +
C: int16_t x_wind_tree( int16_t mode, WIND_TREE *wtree ); +
  +
Binding: +
  +
int16_t x_wind_tree( int16_t mode, WIND_TREE *wtree )
+{
+   int_in[0] = mode;
+   addr_in[0] = wtree;
+
+   crys_if(29010);
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]29010 # Function opcode
control+2control[1]1 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]mode
addr_inaddr_in[0]wtree
int_outint_out[0]Return value
+
+ + +
+ +

8.9.20 The components of a window

+ +

The following illustration shows the window of a GEM text +editor, and describes the most important components of this window. +

+

+

Note that the clickable 'buttons' use characters from the system +font, and may look different if a substitute system font is in use. +

+

When the Closer of an application window is clicked on, +the window will close and its contents will be discarded; if it allows +user input (text editors, graphics programs, spreadsheets ...), any +changes made to the contents since the last 'Save' operation are lost. +Most well- behaved applications warn the user with an alert about this +and give a final opportunity to save the changed contents. +

+

When the Closer of a desktop window is clicked on in TOS, it +will display the next-higher directory level, or, if already showing +the root directory, close the window; some alternative desktops such +as MAGXDESK, Jinnee and Thing offer the option to either behave in the +same way, or can be set for the Closer to shut the window immediately +from any directory level - they use a 'parent' widget at the top of +the window to move to the next-higher level. +

+

The Title-bar shows the full path to the current +directory (in a desktop window) or to the current file (in an +application's window). It may also show other details, such as the +current cursor position etc. (if the window does not have an +info-line). +

+

The Mover allows the whole window to be moved by +clicking and holding down the left mouse button while dragging the +outline of the window to a new position. +

+

The Backdrop button is only present in MagiC and similar +system extensions. If several windows are open, clicking on it places +the window at the bottom of the 'stack', permitting rapid cycling +through the windows. +

+

The Iconifier button is only present as of AES Version +4.1 and later MagiC versions. When clicked on, the window is shrunk to +a large icon at the bottom left of the screen, carrying a suitable +identity label. If several windows are iconified, their icons will be +ranged next to each other. A double-click on the icon will restore the +window to its former position and size. +

+

Clicking on the Fuller enlarges the window to fill the +screen. A second click restores the former size. +

+

The Info-line provides various items of information +about the window's contents. In applications it is optional and must +be provided by the running program. This also applies to the +menu-line (may be scrollable if too long to fit the window) +and the toolbar. +

+

When one of the four arrows is clicked on, it scrolls +the contents in the appropriate direction by one line or column if the +contents exceed the current width and/or height of the window. This +action repeats if the mouse button is held down. +

+

The width of the sliders indicate what portion of the +total contents is being displayed on the screen in comparison with the +shaded area in the two elevators representing the off-screen portions. +Holding down the left mouse button and dragging the slider allows the +window's contents to be scrolled quickly in the relevant direction. +

+

Clicking in the elevator area scrolls the contents by +one screen height or width; this too repeats if the button is held +down. +

+

Clicking on the Sizer and holding down the left mouse +button allows dragging the window to a new size. During this the +outline of the window appears dotted as an aid to placement. The top +left corner remains in position. +

+

See also: Window library +

+

8.9.21 Overview of the wind_get/set subfunctions

+

An 'x' shows in which wind_xxx function the subfunction is +present. In most cases clicking on the 'x' will bring up further +details. +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SubfunctionDecHexgetxgetsetxset
WF_KIND10x0001x x 
WF_NAME20x0002x x 
WF_INFO30x0003x x 
WF_WORKXYWH40x0004x   
WF_CURRXYWH50x0005x xx
WF_PREVXYWH60x0006x xx
WF_FULLXYWH70x0007x xx
WF_HSLIDE80x0008x x 
WF_VSLIDE90x0009x x 
WF_TOP100x000Ax x 
WF_FIRSTXYWH110x000Bx   
WF_NEXTXYWH120x000Cx   
WF_IGNORE130x000D  x 
WF_FIRSTAREAXYWH130x000D x  
WF_NEWDESK140x000Ex x 
WF_HSLSIZE150x000Fx x 
WF_VSLSIZE160x0010x x 
WF_SCREEN170x0011x   
WF_COLOR180x0012  x 
WF_ATTRB180x0012  x 
WF_DCOLOR190x0013x x 
WF_SIZETOP190x0013  x 
WF_OWNER200x0014x   
WF_TOPAP (only X/GEM)200x0014    
WF_BEVENT240x0018x x 
WF_BOTTOM250x0019x x 
WF_ICONIFY260x001Ax x 
WF_UNICONIFY270x001Bx x 
WF_UNICONIFYXYWH280x001C  x 
WF_TOOLBAR300x001Ex x 
WF_FTOOLBAR310x001Fx   
WF_NTOOLBAR320x0020x   
WF_MENU330x0021x x 
WF_WHEEL400x0028x x 
WF_OPTS410x0029x x 
WF_CALCF2W420x002A x  
WF_CALCW2F430x002B x  
WF_CALCF2U440x002C    
WF_CALCU2F450x002D    
WF_MAXWORKXYWH460x002E    
WF_M_BACKDROP1000x0064x   
WF_M_OWNER1010x0065x   
WF_M_WINDLIST1020x0066x   
WF_MINXYWH1030x0067x   
WF_INFOXYWH1040x0068x   
WF_WIDGETS2000x00C8x x 
WF_APPICON2010x00C9  x 
WF_USER_POINTER2300x00E6x x 
WF_WIND_ATTACH2310x00E7  x 
WF_TOPMOST2320x00E8  x 
WF_BITMAP2330x00E9x   
WF_OPTIONS2340x00EA  x 
WF_FULLSCREEN2350x00EB  x 
WF_OBFLAG10010x03E9x x 
WF_OBTYPE10020x03EAx   
WF_OBSPEC10030x03EBx x 
X_WF_MENU43520x1100x x 
X_WF_DIALOG46080x1200x x 
X_WF_DIALWID48640x1300x x 
X_WF_DIALHT51200x1400x x 
X_WF_DFLTDESK53760x1500x x 
X_WF_MINMAX56320x1600x x 
X_WF_HSPLIT58880x1700x x 
X_WF_VSPLIT61440x1800x x 
X_WF_SPLMIN64000x1900x x 
X_WF_HSLIDE266560x1A00x x 
X_WF_VSLIDE269120x1B00x x 
X_WF_HSLSIZE271680x1C00x x 
X_WF_VSLSIZE274240x1D00x x 
X_WF_DIALFLGS76800x1E00x x 
X_WF_OBJHAND79360x1F00x x 
X_WF_DIALEDIT81920x2000x x 
X_WF_DCOLSTAT84480x2100x x 
WF_WINX223600x5758x   
WF_WINXCFG223610x5759x x 
WF_DDELAY223620x575Ax x 
WF_SHADE223650x575Dx x 
WF_STACK223660x575E  x 
WF_TOPALL223670x575F  x 
WF_BOTTOMALL223680x5760  x 
XA225930x5841x   
+
+ +

8.9.22 wind_get and wind_set mode in Geneva

+

In all cases, the wind_get function can be used to retrieve the +following information for a particular window. wind_set can be used to +set the values. +

+
+
+
+
X_WF_MENU (0x1100)
+
+

+
+
  +
Setting this attribute causes a menu bar to appear below the +window's name and information bars. The wi_sw1 parameter +should have the high-WORD of the address of the object tree containing +the menu. wi_sw2 contains the low-WORD of the address. If a +NULL pointer is passed, the menu bar will be blank. +
  +
Example: +
  +

int handle;
+OBJECT *menu;
+
+handle = x_wind_create( MOVER, X_MENU, 20, 20, 200, 200 );
+if( handle>0 ) {
+  wind_set( handle, X_WF_MENU, menu );
+  wind_open( handle, 20, 20, 200, 200 );
+}
+
+
+
+

+ + +
X_WF_DIALOG (0x1200)
+
+

+
This option allows a program to create dialog boxes within +windows. It is generally used in conjunction with the X_MU_DIALOG +event type. +
  +
The wi_sw1 parameter should have the high-WORD of the +address of the object tree containing the dialog. wi_sw2 +contains the low- WORD of the address. If a NULL address is passed, +there will be no dialog associated with the window, and it will +receive events normally. +
  +
If the window does not have horizontal or vertical sliders, then +the size of the root object of the dialog will automatically be sized +to fit the entire working area of the window. If the window has +sliders, then the dialog will automatically scroll and update as the +user operates them. No action is necessary on the part of the program. +
  +
If the window is open when this call occurs, the entire dialog +is always redrawn and the sliders, if present, are updated. All slider +updates can be turned off by clearing the X_WTFL_SLIDERS attribute for +the window, by way of the x_wind_tree function. +
  +
Refer to the section describing shel_write for information on +how to cause a windowed dialog to scroll by sending a message to +Geneva. +
  +
Example: +
  +

int handle;
+OBJECT dial = { -1, -1, -1, G_BOX, 0, 0,
+                0x021131L, 0, 0, 1000, 1000 };
+                                 /* a large, filled rectangle */
+
+
+handle = wind_create( MOVER|SIZER|CLOSER|UPARROW|DNARROW|\
+              VSLIDE|LFARROW|RTARROW|HSLIDE, 20, 20, 200, 200 );
+
+if( handle>0 ) {
+  wind_set( handle, X_WF_DIALOG, &dial );
+  wind_set( handle, X_WF_DIALHT, 10 );  /* vert. scroll jump  */
+  wind_set( handle, X_WF_DIALWID, 10 ); /* horiz. scroll jump */
+  wind_open( handle, 20, 20, 200, 200 );
+}
+
+
+
+

+ + +
X_WF_DIALWID (0x1300)
+
+

+
+
  +
This option is used in conjunction with the X_WF_DIALOG option. +It controls the interval at which scrolling by the user occurs. For +instance, a value of 10 will cause the left and right scroll arrows to +scroll the dialog within the window by 10 pixels at a time. The +default value is 1. +
  +
Since, by default, Geneva will use a blit operation to move most +of a windowed dialog's contents when scrolling, unpredictable redraw +errors can occur when redrawing the unblitted area of a dialog if the +dialog uses a patterned fill and X_WF_DIALWID is not a multiple of 16 +pixels. +
  +

+
+

+ + +
X_WF_DIALHT (0x1400)
+
+

+
This option is used in conjunction with the X_WF_DIALOG option. It +controls the interval at which scrolling by the user occurs. For +instance, a value of 10 will cause the up and down scroll arrows to +scroll the dialog within the window by 10 pixels at a time. The +default value is 1. +
  +
Since, by default, Geneva will use a blit operation to move most +of a windowed dialog's contents when scrolling, unpredictable redraw +errors can occur when redrawing the unblitted area of a dialog if the +dialog uses a patterned fill and X_WF_DIALWID is not a multiple of 16 +pixels. +
  +

+
+

+ + +
X_WF_DFLTDESK (0x1500)
+
+

+
This option allows a program to redefine the default desktop, so +that it will be something other than the normal grey pattern. The +wi_sw1 parameter should have the high-WORD of the address of +the object tree containing the new object tree. wi_sw2 +contains the low-WORD of the address. If a NULL address is passed, the +built-in default (gray pattern) desktop will become the new default. +The wi_sw3 parameter must contain the total number of objects +in the object tree which contains the new desktop. +
  +
If the application which has changed the default desktop +terminates, the default grey pattern is resumed automatically. +
  +

+
+

+ + +
X_WF_MINMAX (0x1600)
+
+

+
This option allows a program to change the minimum and maximum +sizes to which the user can resize a particular window. +
  +
By default, Geneva calculates a minimum window size that is +large enough to contain all of the window gadgets without overlapping. +The maximum size always defaults to the working area of the entire +desktop. +
  +
The wi_sw1 and wi_sw2 parameters are the minimum +window width and height, respectively, and wi_sw3 and +wi_sw4 are the maximum width and height of the window. Passing +a value of -1 in any of these parameters in a call to wind_set will +cause no change to occur in that one value. +
  +

+
+

+ + +
X_WF_HSPLIT (0x1700)
+
+

+
This option reflects the location of the horizontal split bar of a +window. +
  +
The wi_sw1 parameter is the new location of the bar, in +pixels. If the value is zero, the bar will be all the way to the left +edge; if it is -1 (which is the default) it will be all the way to the +right. +
  +
Return value from wind_get: +
  + + + + + + + + + +
wi_gw1 = Split bar position +
wi_gw2 = Size, in pixels, of the upper window region +
wi_gw3 = Size of the lower window region + +
+ +
Note: The value returned by wind_get may not be equal to +the value supplied to wind_set if the user has either changed the size +of the window, or if the value was too large or not large enough to +exceed the minimum bar position. See the function x_wind_create and +the X_WF_SPLMIN option, below, for more information. +
  +

+
+ +
X_WF_VSPLIT (0x1800)
+
+

+
This option reflects the location of the vertical split bar of a +window. +
  +
The wi_sw1 parameter is the new location of the bar, in +pixels. If the value is zero, the bar will be at the very top; if it +is -1 (which is the default) it will be at the very bottom. +
  +
Return value from wind_get: +
  + + + + + + + + + +
wi_gw1 = Split bar position +
wi_gw2 = Size, in pixels, of the left window region +
wi_gw3 = Size of the right window region + +
+ +
Note that the value returned to wind_get may not be equal to the +value supplied by wind_set if the user has either changed the size of +the window, or if the value was too large or not large enough to +exceed the minimum bar position. See the function x_wind_create and +the X_WF_SPLMIN option, below, for more information. +
  +

+
+ +
X_WF_SPLMIN (0x1900)
+
+

+
This option controls the minimum sizes of the areas defined by the +horizontal and vertical split bars. +
  + + + + + + + + + + + + +
wi_sw1 = Minimum width of region to left of horizontal split +
wi_sw2 = Minimum width of region to right of horizontal split +
wi_sw3 = Minimum height of region above vertical split +
wi_sw4 = Minimum height of region below vertical split + +
+ +
When the user drags a split bar, these values are checked. He +will not be able to drag the bar if the window is too small to fit two +regions having these sizes. When a wind_set call is made to set the +position of one of the split bars, they will be 'snapped' to one edge +or the other if the position is less than 1/2 of the minimum distance +away from the edge. Furthermore, when the window is made smaller, the +positions of the split bars are automatically changed so as to satisfy +these minimum values. For this reason, a program should never assume +that they have not changed. +
  +
Passing a value of -1 in any of these parameters in a call to +wind_set will cause no change to occur in that one value. +
  +

+
+ +
X_WF_HSLIDE2 (0x1A00)
+
+

+
This option gets or sets the position of the second horizontal +slider (which appears to the right of a horizontal split bar) in a +manner identical to WF_HSLIDE. +
  +

+
+

+ + +
X_WF_VSLIDE2 (0x1B00)
+
+

+
This option gets or sets the position of the second vertical +slider (which appears below a vertical split bar) in a manner +identical to WF_VSLIDE. +
  +

+
+

+ + +
X_WF_HSLSIZE2 (0x1C00)
+
+

+
This option gets or sets the size of the second horizontal slider +(which appears to the right of a horizontal split bar) in a manner +identical to WF_HSLSIZE. +
  +

+
+

+ + +
X_WF_VSLSIZE2 (0x1D00)
+
+

+
This option gets or sets the size of the second vertical slider +(which appears below a vertical split bar) in a manner identical to +WF_VSLSIZE. +
  +

+
+
+
+
+

+ + +
X_WF_DIALFLGS (0x1E00)
+
+

+
This option gets/sets flags related to the way dialogs within +windows are processed. Currently, only the following three bits are +used. All other bits are reserved for future use: +
  +

+
X_WD_ACTIVE (bit 0)
+
+

+
When this bit is off, no mouse or keyboard events will be +processed. This is a good way to temporarily lock a windowed dialog +while presenting the user with a sub-dialog that asks for other input +(like the 'Find' option in the Task Manager's 'Flags' dialog.) This +attribute defaults to On. +
  +

+ +
+
X_WD_BLITSCRL (bit 1)
+
+

+
If this flag is set, which it is by default, a windowed dialog +will be scrolled in real time by way of a blit operation. Care should +be taken when displaying object trees which use fill patterns, because +if the X_WF_DIALWID or X_WF_DIALHT are not an even increment of 16, +the fill pattern may not match up correctly when the user scrolls the +window. If this flag is off, the entire dialog will be redrawn every +time its position changes. In this case, the scroll increment does not +matter. +
  +

+ +
+
X_WD_KEYS (bit 2) (since Release 004)
+
+

+
When set, any keypresses that would otherwise be processed as part +of the dialog are instead passed through to the application. +
  +
An example is when NeoDesk is run with the desktop in a window. +Normally, things like [Shift]-[C] would be treated like a keypress in +a dialog without any editable field and ignored. When this bit is set, +the keypress will instead go to the application. +
  +

+ +
+
+
+
+ +
X_WF_OBJHAND (0x1F00) (since Release 003)
+
+

+
When an application wants to intercept some or all of the button +events that would otherwise be interpreted by Geneva to mean that a +window widget has been clicked on, this wind_set mode can be used to +provide Geneva with the address of a routine which instructs Geneva to +either ignore the event, or to process it as normal. This allows the +programmer to redefine the operation of window widgets, and to define +his own actions for new widgets which have been added with the +x_wind_tree function. +
  +
The routine is passed the handle of the window containing the +object and the index of the object within the window's object tree. If +the user routine returns a 0, then Geneva will generate an X_WM_OBJECT +message and send it to the application. If the routine returns a 1, +then Geneva will process the action as a normal event and act +accordingly. +
  +
IMPORTANT: The application's object handler routine must not use +any AES functions. +
  +
The following example declares an object handler which allows +the action of the vertical scroll bar to be redefined: +
  +

       /* change this to "int cdecl objhand..." for Pure C */
+int objhand( int handle, int obj )
+{  /* handle parameter is not used */
+  if( obj==WGVSMLSL ) return 0;   /* this is the vertical slider */
+  return 1;                       /* otherwise, process as normal */
+}
+
+main()
+{
+ int handle, message[8];
+
+  handle = wind_create( NAME|MOVER|VSLIDE|UPARROW|DNARROW,
+      50, 50, 150, 150 );
+
+  if( handle > 0 )
+  {
+    wind_set( handle, X_WF_OBJHAND, &objhand );
+    wind_open( handle, 50, 50, 150, 150 );
+  }
+
+  ...
+
+  evnt_mesag( message );
+
+  switch( message[0] )
+  {
+
+    case X_WM_OBJECT:
+      if( message[3]==handle && message[4]==WGVSMLSL )
+         /* do something new with the slider */
+  }
+}
+
+
If wind_set( X_WF_OBJHAND ) is passed a NULL pointer instead of +a pointer to a function, object handling is discontinued for that +window. +
  +
Note that in order for Geneva to determine that the mouse has +been clicked on an object in a window's tree structure, it must be of +type EXIT or TOUCHEXIT. Geneva's default window widgets already have +these attributes set correctly. +
  +
wind_get can also be used to get a pointer to the current object +handler routine. A NULL pointer means that there is no object handler +defined. +
  +
+
+

+ + +
X_WF_DIALEDIT (0x2000) (since Release 003)
+
+

+
When a windowed dialog has been defined with wind_set mode +X_WF_DIALOG, these two options can be used to get or set the index of +the object which currently has the edit cursor. This can be helpful +when an application changes the contents of a text field while the +dialog is still displayed, or when it needs to hide the object that +currently has the edit cursor. +
  +
wind_get( X_WF_DIALEDIT ) will return the index of the object +which currently has the edit cursor in the wi_gw1 parameter, +and the position of the edit cursor within the object's text in the +wi_gw2 parameter. +
  +
wind_set( X_WF_DIALEDIT ) changes the object (wi_sw1) +and the edit index (wi_sw2). If the object is 0, then the edit +cursor will simply be turned off; otherwise it will be moved to the +new object. If the index is 0, the cursor will be positioned before +the leftmost character in the field; if it is a number > 0, it will +be further to the right. If the index is -1, then the cursor will be +automatically moved to the rightmost position. +
  +

+
+

+ + +
X_WF_DCOLSTAT (0x2100) (since Release 004)
+
+

+
This mode gets or sets a window widget's default colours and +ob_state value. Unlike WF_DCOLOR, this option gives full control over +all of Geneva's extended window widgets. +
  +
For wind_set, the wi_sw1 parameter contains the index of +the window widget to change, taken from the list of WGCLOSE through +WGSIZE, as outlined in xwind.h. wi_sw2 contains the colour for +the widget when the window is on top, wi_sw3 is for an +untopped window. wi_sw4 contains the ob_state WORD of the +object. If any of these values is set to -1, then no change occurs. +
  +
For wind_get, the wi_sw1 parameter must be a pointer to +a WORD containing the index of the widget being inquired about, the +same way WF_COLOR and WFDCOLOR work. +
  +
Example: Turn the 3D attribute on for the mover bar +
  +

      int top, untop, state, gadget;
+
+      gadget = WGMOVE;
+      wind_get( 0, X_WF_DCOLSTAT, &gadget, &top, &untop, &state );
+      state |= X_MAGIC|X_DRAW3D;
+      wind_set( 0, X_WF_DCOLSTAT, gadget, -1, -1, state );
+
+

+ +
+
+
+ +Home +AESAES +Window-dialogsWindow-dialogs +Extended file-selectorsExtended file-selectors + + diff --git a/en/xaaes.html b/en/xaaes.html new file mode 100644 index 000000000..462b479d8 --- /dev/null +++ b/en/xaaes.html @@ -0,0 +1,38 @@ + + + + + +The documentation for TOS: XaAES + + + + + + + + + +Home +Contents +The N.AES configuration fileThe N.AES configuration file +Toolbar support under XaAESToolbar support under XaAES + +
+ +

13 XaAES

+ +
+
+ +Home +Contents +The N.AES configuration fileThe N.AES configuration file +Toolbar support under XaAESToolbar support under XaAES + + diff --git a/en/xaaes_functions.html b/en/xaaes_functions.html new file mode 100644 index 000000000..7a1e6612c --- /dev/null +++ b/en/xaaes_functions.html @@ -0,0 +1,665 @@ + + + + + +The documentation for TOS: XaAES deprecated functions + + + + + + + + + + +Home +XaAESXaAES +Toolbar support under XaAESToolbar support under XaAES +EmulatorsEmulators + +
+ +

13.2 XaAES deprecated functions

+ + + + +

The following XaAES functions were only available in early +versions and they are now deprecated, including objc_data which is +newer but never fully implemented. +

+

Opcodes 250, 253 and 254 are assigned to button_click, shutdown +and objc_setscroll but it looks like they were never used. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
appl_pipe Get handle of the communication pipe +
• button_click No information available +
client_exit Close the communication pipe of a client +
new_client Open a communication pipe for a new client +
• objc_data Get/set data in object trees +
• objc_setscroll No information available +
rregen Regenerate rectangle list (debug) +
• shutdown No information available +
wredraw Redraw window (debug) + +
+ +

See also: XaAES +

+

13.2.1 appl_pipe

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Application pipe« - Obtains the application pipe handle. +
  +
Opcode: 260 +
  +
Syntax: int16_t appl_pipe ( void ); +
  +
Description: The call appl_pipe gets the file handle of the client reply +pipe. This value is also available in global[12] after calling +appl_init. +
  +
Note: This function is deprecated. XaAES doesn't rely +anymore on pipes to exchange AES messages. +
  +
Return value: The function returns the file handle of the client reply pipe, +or 0 if the pipe is not open. +
  +
Availability: Up to XaAES v0.963. +
  +
Group: XaAES functions +
  +
See also: Binding   client_exit   new_client +
  + +
+ +

13.2.1.1 Bindings for appl_pipe

+ + + + + + + + + +
C: int16_t appl_pipe ( void ); +
  +
Binding: +
  +
int16_t appl_pipe (void)
+{
+   return ( crys_if(260) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]260 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_outint_out[0]Return value
+
+ + +
+ +

13.2.2 client_exit

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Client exit« - Unregisters an AES client. +
  +
Opcode: 252 +
  +
Syntax: void client_exit ( void ); +
  +
Description: The call client_exit closes the client's reply pipe in response +to a XA_CLIENT_EXIT message. client_exit releases all resources belonging to +the client (windows, pending messages, menu bar, custom desktop...). +
  +
Applications should NEVER send this message to the XaAES +kernel, it is used internally to pass crucial information from the +client pid trap handler to the XaAES kernel. +
  +
The XA_CLIENT_EXIT message is only sent from XaAES itself when a client +calls appl_exit. +
  +
Note: This function is deprecated. XaAES doesn't rely +anymore on pipes to exchange AES messages. +
  +
Return value: The function does not return a value. +
  +
Availability: Up to XaAES v0.963. +
  +
Group: XaAES functions +
  +
See also: Binding   appl_pipe   new_client +
  + +
+ +

13.2.2.1 Bindings for client_exit

+ + + + + + + + + +
C: void client_exit ( void ); +
  +
Binding: +
  +
void client_exit (void)
+{
+   crys_if(252);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]252 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
+
+ + +
+ +

13.2.3 new_client

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »New client« - Registers a new AES client. +
  +
Opcode: 251 +
  +
Syntax: void new_client ( void ); +
  +
Description: The call new_client opens the client's communication pipe in +response to a XA_NEW_CLIENT message. Applications should NEVER send this +message to the XaAES kernel, it is used internally to pass crucial +information from the client pid trap handler to the XaAES kernel. +
  +
The XA_NEW_CLIENT message is only sent from XaAES itself through +/pipe/XaAES.cmd when a client calls appl_init. This triggers the +creation of a bi-directional command/reply pipe (/pipe/XaClnt.pid, +where pid is the process ID) that allows internal communication +between the client and the AES server. +
  +
Note: This function is deprecated. XaAES doesn't rely +anymore on pipes to exchange AES messages. +
  +
Return value: The function does not return a value. +
  +
Availability: Up to XaAES v0.963. +
  +
Group: XaAES functions +
  +
See also: Binding   appl_pipe   client_exit +
  + +
+ +

13.2.3.1 Bindings for new_client

+ + + + + + + + + +
C: void new_client ( void ); +
  +
Binding: +
  +
void new_client (void)
+{
+   crys_if(251);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]251 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
+
+ + +
+ +

13.2.4 rregen

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Redraw regenerate« - Regenerates rectangle list for a +window. +
  +
Opcode: 255 +
  +
Syntax: void rregen ( XA_WINDOW *w ); +
  +
Description: The call rregen regenerates the rectangle list for the +specified window. +
  +
w is a pointer to an internal structure that describes +the window. +
  +
Note: This function is for internal use only and allows +to call the Rectangle List Generator for debugging purposes. rregen is +deprecated. +
  +
Return value: The function does not return a result. +
  +
Availability: Up to XaAES v0.920. +
  +
Group: XaAES functions +
  +
See also: Binding   wredraw +
  + +
+ +

13.2.4.1 Bindings for rregen

+ + + + + + + + + +
C: void rregen ( XA_WINDOW *w ); +
  +
Binding: +
  +
void rregen (XA_WINDOW *w)
+{
+   addr_in[0] = w;
+
+   crys_if(255);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]255 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]w
+
+ + +
+ +

13.2.5 wredraw

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Window redraw« - Redraws a window. +
  +
Opcode: 256 +
  +
Syntax: void wredraw ( XA_WINDOW *w ); +
  +
Description: The call wredraw redraws a window. +
  +
w specifies a pointer to an internal structure. +
  +
Note: This function is for internal use only and allows +to redraw a whole window by calling a more generic function that takes +two extra parameters (a user-defined value for debugging purposes, and +a clipping rectangle). wredraw is deprecated. +
  +
Return value: The function does not return a result. +
  +
Availability: Up to XaAES v0.920. +
  +
Group: XaAES functions +
  +
See also: Binding   rregen +
  + +
+ +

13.2.5.1 Bindings for wredraw

+ + + + + + + + + +
C: void wredraw ( XA_WINDOW *w ); +
  +
Binding: +
  +
void wredraw (XA_WINDOW *w)
+{
+   addr_in[0] = w;
+
+   crys_if(256);
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]256 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]0 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]w
+
+ + +
+ +
+ +Home +XaAESXaAES +Toolbar support under XaAESToolbar support under XaAES +EmulatorsEmulators + + diff --git a/en/xaaes_toolbar.html b/en/xaaes_toolbar.html new file mode 100644 index 000000000..440b2cca5 --- /dev/null +++ b/en/xaaes_toolbar.html @@ -0,0 +1,43 @@ + + + + + +The documentation for TOS: Toolbar support under XaAES + + + + + + + + + +Home +XaAESXaAES +XaAESXaAES +XaAES deprecated functionsXaAES deprecated functions + +
+ +

13.1 Toolbar support under XaAES

+

Since version 0.942 XaAES too offers toolbar support as in +AES >4.1. However, it does not have the restrictions that all +elements have to have TOUCHEXIT status. For XaAES these are quite +normal dialogs. +

+

If the toolbar has to be redrawn, it suffices to call WF_TOOLBAR +once with the relevant parameters. XaAES recognizes that the toolbar +is already present and redraws it. +

+

See also: Toolbar support   WF_TOOLBAR   WM_TOOLBAR +

+
+ +Home +XaAESXaAES +XaAESXaAES +XaAES deprecated functionsXaAES deprecated functions + + diff --git a/en/xbios_about.html b/en/xbios_about.html new file mode 100644 index 000000000..9341664a2 --- /dev/null +++ b/en/xbios_about.html @@ -0,0 +1,89 @@ + + + + + +The documentation for TOS: About the XBIOS + + + + + + + + + +Home +XBIOSXBIOS +XBIOSXBIOS +MetaDOSMetaDOS + +
+ +

4.1 About the XBIOS

+

These functions enable ordered access to the various special +chips in the Atari. They are called via the 680X0-trap #14 and should +be used only if no routines of a higher level (GEMDOS, BIOS) are +available that can be used instead of them. The XBIOS may be +subdivided into the following function groups: +

+ + +

The XBIOS is reentrant in MagiC. This means that these +functions can be called from interrupts as well (as long as the +relevant supervisor stack does not overflow...). +

+ + +

The XBIOS takes its parameters from the stack, in reverse +order; this means that the last argument from the parameter list is +stored as the first on the stack. Function results are returned in the +processor register d0. Only registers d3-d7 and a3-a7 are saved, all +others may be altered by the call. +

+

See also: MetaDOS   Function list +

+
+ +Home +XBIOSXBIOS +XBIOSXBIOS +MetaDOSMetaDOS + + diff --git a/en/xbios_datetime.html b/en/xbios_datetime.html new file mode 100644 index 000000000..06cd84dc2 --- /dev/null +++ b/en/xbios_datetime.html @@ -0,0 +1,659 @@ + + + + + +The documentation for TOS: Date, Time and Timer + + + + + + + + + +Home +XBIOSXBIOS +CT60 XBIOS extensionCT60 XBIOS extension +Printer functionsPrinter functions + +
+ +

4.9 Date, Time and Timer

+ + + + + + + + + + + + +
Gettime Gets the date and time. +
NVMaccess Configures the NVM of the real-time clock. +
Settime Sets the date and time. +
Xbtimer Initializes the system timer. + +
+ +

4.9.1 Gettime

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »get time« - Get the time and date. +
  +
Opcode: 23 +
  +
Syntax: uint32_t Gettime( void ); +
  +
Description: The XBIOS routine Gettime obtains the date and time from the +computer's hardware clock. +
  +
Return value: The function returns the date and time, which are coded as +follows: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
BitDescription
0-4Seconds in units of 2 (0-29)
5-10Minutes (0-59)
11-15Hours (0-23)
16-20Day of month (1-31)
21-24Month (1-12)
25-31Year (0-119, 0 represents 1980)
+
+ +
Availability: All TOS versions. +
  +
Group: Date, Time and Timer +
  +
See also: Binding   Settime +
  + +
+ +

4.9.1.1 Bindings for Gettime

+ + + + + + +
C: #include <tos.h> +
  +
uint32_t Gettime( void ); +
  +
Assembler: +
  +
move.w    #23,-(sp)    ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

4.9.2 NVMaccess

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »NVMacess« - Configure the "Non-Volatile +Memory" of the real-time clock. +
  +
Opcode: 46 +
  +
Syntax: int16_t NVMaccess( int16_t op, int16_t start, int16_t count, +int8_t *buffer ); +
  +
Description: The XBIOS routine NVMaccess permits the configuration of the +NVM of the real-time clock. This has available 50 bytes of +non-volatile RAM, where the last two bytes are used as a checksum. The +following apply: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
op0 = Read out NVM and check the checksum.
 1 = Write to NVM, check the checksum
     and reset it
 2 = Initialize NVM and set checksum
  
startStart-byte.
countNumber of bytes to transfer.
bufferBuffer from or to which to write.
+
+ +
Return value: The function returns the value 0 if no error has occurred. A +value of -5 means that the arguments were not within the permitted +region. A return value of -12 identifies an inconsistent checksum. +
  +
Availability: Atari TT (TOS 3.xx) and Falcon (TOS 4.xx) +
  +
Group: Date, Time and Timer +
  +
See also: Binding   Assignment of the NVM +
  + +
+ +

4.9.2.1 Bindings for NVMaccess

+ + + + + + +
C: #include <tos.h> +
  +
int16_t NVMaccess( int16_t op, int16_t start, int16_t count, +int8_t *buffer ); +
  +
Assembler: +
  +
pea       buffer       ; Offset 8
+move.w    count,-(sp)  ; Offset 6
+move.w    start,-(sp)  ; Offset 4
+move.w    op,-(sp)     ; Offset 2
+move.w    #46,-(sp)    ; Offset 0
+trap      #14          ; Call XBIOS
+lea       $C(sp),sp    ; Correct stack
+
+ +
+ +

4.9.3 Settime

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »set time« - Set the time and date. +
  +
Opcode: 22 +
  +
Syntax: void Settime( uint32_t time ); +
  +
Description: The XBIOS routine Settime sets the date and time. The 32-bit +parameter time is split up as follows: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
timeMeaning
0-4Seconds in units of 2 (0-29)
5-10Hours (0-23)
11-15Hours (0-23)
16-20Day of month (1-31)
21-24Monat (1-12)
25-31Year (subtract 1980)
+
+ +
Return value: The function does not return a result. +
  +
Availability: All TOS versions. +
  +
Gruppe: Date, Time and Timer +
  +
See Also: Binding   Gettime +
  + +
+ +

4.9.3.1 Bindings for Settime

+ + + + + + +
C: #include <tos.h> +
  +
void Settime( uint32_t time ); +
  +
Assembler: +
  +
move.l    time,-(sp)   ; Offset 2
+move.w    #22,-(sp)    ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.9.4 Xbtimer

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »timer init« - Initialize the timer in the MFP chip. +
  +
Opcode: 31 +
  +
Syntax: void Xbtimer( int16_t timer, int16_t control, int16_t data, +void(*vector)( ) ); +
  +
Description: The XBIOS routine Xbtimer initializes one of the four timers +(A-D) in the 68901 multi-function peripheral chip. The following +apply: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
timerNumber of the timer:
 0 = A (usable for own programs)
 1 = B (Horizontal blank interrupt)
 2 = C (System timer (200 Hz))
 3 = D (Generator for the Baud rates)
  
controlValue for corresponding timer register
dataValue for corresponding timer register
vectorPointer to interrupt routine
+
+ +
Return value: The function does not return a result. +
  +
Availability: All TOS versions. +
  +
Group: Date, Time and Timer +
  +
See also: Binding +
  + +
+ +

4.9.4.1 Bindings for Xbtimer

+ + + + + + +
C: #include <tos.h> +
  +
void Xbtimer( int16_t timer, int16_t control, int16_t data, +void(*vector)( ) ); +
  +
Assembler: +
  +
pea       vector        ; Offset 8
+move.w    data,-(sp)    ; Offset 6
+move.w    control,-(sp) ; Offset 4
+move.w    timer,-(sp)   ; Offset 2
+move.w    #31,-(sp)     ; Offset 0
+trap      #14           ; Call XBIOS
+lea       $C(sp),sp     ; Correct stack
+
+ +
+ +

4.9.5 Assignment of the real-time clock's NVM

+ +

The real-time clock in the Atari TT030 and Falcon030 has +available 50 bytes of non-volatile memory that can be used by programs +for configuration purposes. The following assignments apply: +

+
typedef struct
+{
+  unsigned int bootpref;
+  char reserved[4];
+  unsigned char language;
+  unsigned char keyboard;
+  unsigned char datetime;
+  char separator;
+  unsigned char bootdelay;
+  char reserved2[3];
+  unsigned int vmode;
+  unsigned char scsi;
+} NVM;
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
bootpref Boot preference: +
0x00 = No preference +
0x08 = MagiC +
0x10 = Linux +
0x20 = NetBSD +
0x40 = UNIX will be booted +
0x80 = TOS will be booted +
  +
language Language: +
0 = English +
1 = German +
2 = French +
3 = Reserved +
4 = Spanish +
5 = Italian +
  +
keyboard Keyboard layout: +
0 = USA +
1 = German +
2 = French +
3 = British +
4 = Spanish +
5 = Italian +
6 = Swedish +
7 = (French) Swiss +
8 = (German) Swiss +
  +
datetime Formatting of the date: +
  + + + + + + +
Bit 0..3 0 = Format "MM-DD-YY" (Month, Day, Year) +
1 = Format "DD-MM-YY" (Day, Month, Year) +
2 = Format "YY-MM-DD" (Year, Month, Day) +
3 = Format "YY-DD-MM" (Year, Day, Month) +
+
Bit 4..7 0 = 12-hour clock display +
1 = 24-hour clock display + +
+ +
separator ASCII-value of the character that is to act as the separator +for the date. +
  +
bootdelay Boot delay +
  +
vmode Video mode +
+
  +
scsi +
  + + + + + + + + + +
Bit 0..2 SCSI-ID (0-7) +
Bit 3..6 0, reserved +
Bit 7 Flag for bus-arbitration. +
The following apply: +
0 = Arbitration on +
1 = Arbitration off +
+ +
+ + +
+ +

All further bytes are not documented at present. As one can see, +it is possible, in particular, to specify the SCSI ID of a TT030 or +Falcon030 via the NVM. +

+ +

In a Milan the NVM has a size of 224 bytes. +

+

The following structure applies only for TOS 4.08 +(2003-03-09) and Bootblock 1.02! +

+
typedef struct
+{
+  unsigned int bootpref;
+  char reserved[4];
+  unsigned char language;
+  unsigned char keyboard;
+  unsigned char datetime;
+  char separator;
+  unsigned char bootdelay;
+  unsigned char ide_drives;
+  unsigned char scsi_drives;
+  char reserved2;
+  unsigned int vmode;
+  unsigned char scsi;
+  char reserved3[31];
+  unsigned char memory;
+  char INT1_2;
+  char INT3_4;
+  char reserved4[173];
+} NVM_Milan;
+
+ + + +
memory +
  + + + + + + +
Bit 0..1 0 = 16MB ST-RAM +
1 =  4MB ST-RAM +
2 =  2MB ST-RAM +
Bit 2 ROMPORT emulation +
+ +
+ + +
+ +

See also: NVMaccess   XHDI specification +

+
+ +Home +XBIOSXBIOS +CT60 XBIOS extensionCT60 XBIOS extension +Printer functionsPrinter functions + + diff --git a/en/xbios_dhs.html b/en/xbios_dhs.html new file mode 100644 index 000000000..0cac3142a --- /dev/null +++ b/en/xbios_dhs.html @@ -0,0 +1,568 @@ + + + + + +The documentation for TOS: Hatari DHS XBIOS extension + + + + + + + + + +Home +XBIOSXBIOS +DSP programmingDSP programming +Interrupt functionsInterrupt functions + +
+ +

4.12 Hatari DHS XBIOS extension

+

Some specific patches by DHS are applied to the Hatari sources +for Mac OS X to enhance the debug and trace functions. These features +are of great help for demo hacking in overscan since ordinary debug +tools is very hard to use in such conditions. +

+

Binaries and patches are available on DHS website. +

+ + + + + + + + + + + + + + + + + + + + + +
CounterRead  Stop a cycle counter. +
CounterStart Start or restart a cycle counter. +
CPUFreq      Set Hatari CPU frequency. +
Debug        Debug output to console. +
DebugUI      Enter Hatari debug UI. +
HatariOption Change emulator options. +
Registers    Dump all registers to console. + +
+ +

4.12.1 CounterRead

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Stop counter« - Read a cycle counter. +
  +
Opcode: 252 (0x00fc) +
  +
Syntax: See Bindings for CounterRead +
  +
Description: Stop a cycle counter. +
  +
The id argument to the call can provide an identifier +for the current timer and several counters can be activated +simulaneously. Valid values are between 0 and 255. +
  +
Return value: None. +
  +
Availability: Hatari for Mac OS X with specific patches by DHS. +
  +
Group: Hatari DHS XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.12.1.1 Bindings for CounterRead

+ + + + + + +
C: void xbios ( 252, int16_t id ); +
  +
Assembler: +
  +
move.w    id,-(sp)        ; Offset 2
+move.w    #252,-(sp)      ; Offset 0
+trap      #14             ; Call XBIOS
+addq.l    #4,sp           ; Correct stack
+
+ +
+ +

4.12.2 CounterStart

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Start counter« - Start or restart a cycle counter. +
  +
Opcode: 253 (0x00fd) +
  +
Syntax: See Bindings for CounterStart +
  +
Description: Start a new cycle counter or restart an existing one. +
  +
Count the number of cycles between two successive calls to XBIOS +functions. +
  +
The id argument to the call can provide an identifier +for the current timer and several counters can be activated +simulaneously. Valid values are between 0 and 255. +
  +
Return value: None. +
  +
Availability: Hatari for Mac OS X with specific patches by DHS. +
  +
Group: Hatari DHS XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.12.2.1 Bindings for CounterStart

+ + + + + + +
C: void xbios ( 253, int16_t id ); +
  +
Assembler: +
  +
move.w    id,-(sp)        ; Offset 2
+move.w    #253,-(sp)      ; Offset 0
+trap      #14             ; Call XBIOS
+addq.l    #4,sp           ; Correct stack
+
+ +
+ +

4.12.3 CPUFreq

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Set Frequency« - Set Hatari CPU frequency. +
  +
Opcode: 249 (0x00f9) +
  +
Syntax: See Bindings for CPUFreq +
  +
Description: Set Hatari CPU frequency. +
  +
Maximum frequency is 511 MHz. The frequency can be set +up to 128 MHz in the SDL and the OSX GUI. +
  +
Return value: None. +
  +
Availability: Hatari for Mac OS X with specific patches by DHS. +
  +
Group: Hatari DHS XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.12.3.1 Bindings for CPUFreq

+ + + + + + +
C: void xbios ( 249, int16_t frequency ); +
  +
Assembler: +
  +
move.w    frequency,-(sp) ; Offset 2
+move.w    #249,-(sp)      ; Offset 0
+trap      #14             ; Call XBIOS
+addq.l    #4,sp           ; Correct stack
+
+ +
+ +

4.12.4 Debug

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Debug output to console« - Dump memory area to Hatari +console. +
  +
Opcode: 254 (0x00fe) +
  +
Syntax: See Bindings for Debug +
  +
Description: Memory dump. +
  +
Hatari can dump the content of a memory area to the console. +This is useful for debugging. +
  +
memptr and length specifiy the start address and +length of the area. Maximum length is 256 bytes. +
  +
Return value: None. +
  +
Availability: Hatari for Mac OS X with specific patches by DHS. +
  +
Group: Hatari DHS XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.12.4.1 Bindings for Debug

+ + + + + + +
C: void xbios ( 254, int32_t memptr, int32_t length ); +
  +
Assembler: +
  +
move.l    length,-(sp)    ; Offset 6
+move.l    memptr,-(sp)    ; Offset 2
+move.w    #254,-(sp)      ; Offset 0
+trap      #14             ; Call XBIOS
+lea       10(sp),sp       ; Correct stack
+
+ +
+ +

4.12.5 DebugUI

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Enter Debug UI« - Enter Hatari Debug UI. +
  +
Opcode: 251 (0x00fb) +
  +
Syntax: See bindings for Debug UI +
  +
Description: Debugger with instruction stepping. +
  +
Step through the code from the OSX console. By calling XBIOS, +Hatari will enter the debugger. A new command i will then step +the emulator one (1) instruction and then return to the debugger. +
  +
Return value: None. +
  +
Availability: Hatari for Mac OS X with specific patches by DHS. +
  +
Group: Hatari DHS XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.12.5.1 Bindings for DebugUI

+ + + + + + +
C: void xbios ( 251 ); +
  +
Assembler: +
  +
move.w    #251,-(sp)      ; Offset 0
+trap      #14             ; Call XBIOS
+addq.l    #2,sp           ; Correct stack
+
+ +
+ +

4.12.6 HatariOption

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Change options« - Change emulator options. +
  +
Opcode: 255 +
  +
Syntax: See Bindings for HatariOption +
  +
Description: This function changes the given option. The following +apply: +
  + + + + + + + + + + + + + + + + + + +
Option Meaning +
    +
1 Reset the normal ST speed (disable Fast Forward). +
2 Set Hatari into max speed mode (enable Fast Forward). Useful +for assembling, packing and so on. +
3 Enable debugger. +
4 Disable debugger. + +
+ +
Return value: The function returns 0, or -1 if the specified option is out of +range. +
  +
Availability: Hatari for Mac OS X with specific patches by DHS. +
  +
Group: Hatari DHS XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.12.6.1 Bindings for HatariOption

+ + + + + + +
C: int32_t xbios ( 255, int16_t option ); +
  +
Assembler: +
  +
move.w    option,-(sp)    ; Offset 2
+move.w    #255,-(sp)      ; Offset 0
+trap      #14             ; Call XBIOS
+addq.l    #4,sp           ; Correct stack
+
+ +
+ +

4.12.7 Registers

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dump Registers« - Dump all registers to console. +
  +
Opcode: 250 (0x00fa) +
  +
Syntax: See Bindings for Registers +
  +
Description: Dump all registers to console. +
  +
Hatari can dump the CPU data+address registers to the console. +This is useful for debugging. +
  +
Return value: None. +
  +
Availability: Hatari for Mac OS X with specific patches by DHS. +
  +
Group: Hatari DHS XBIOS extension +
  +
See also: Binding +
  + +
+ +

4.12.7.1 Bindings for Registers

+ + + + + + +
C: void xbios ( 250 ); +
  +
Assembler: +
  +
move.w    #250,-(sp)      ; Offset 0
+trap      #14             ; Call XBIOS
+addq.l    #2,sp           ; Correct stack
+
+ +
+ +
+ +Home +XBIOSXBIOS +DSP programmingDSP programming +Interrupt functionsInterrupt functions + + diff --git a/en/xbios_drive.html b/en/xbios_drive.html new file mode 100644 index 000000000..c67f87b2a --- /dev/null +++ b/en/xbios_drive.html @@ -0,0 +1,2501 @@ + + + + + +The documentation for TOS: Drive functions + + + + + + + + + +Home +XBIOSXBIOS +Interrupt functionsInterrupt functions +MATRIX XBIOS extensionMATRIX XBIOS extension + +
+ +

4.14 Drive functions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DMAread Reads sectors from hard drive. +
DMAwrite Writes sectors to hard drive. +
Flopfmt Formats track on floppy disk. +
Floprate Sets seekrate and timeout of floppy drive. +
Floprd Reads individual sectors from floppy disk. +
Flopver Verifies sectors of a floppy disk. +
Flopwr Writes sectors on floppy disk. + +
Metaclose Releases a MetaDOS device. +
Metadiscinfo Obtains current status information. +
Metagettoc Returns the table of contents of a device. +
Metainit Obtains information about MetaDOS version. +
Metaioctl Sends GEMDOS opcodes to a MetaDOS device. +
Metaopen Initializes a MetaDOS device. +
Metaread Reads data from a MetaDOS device. +
Metaseek Seeks to a physical address. +
Metasetsongtime Starts audio playback of a timed portion of a track. +
Metastartaudio Starts audio playback of one or more songs. +
Metastatus Obtains the status of a MetaDOS device. +
Metastopaudio Stops audio playback. +
Metawrite Writes data to a MetaDOS device. +
Protobt Generates a boot-sector for a diskette. + +
+ +

See also: GEMDOS file functions   GEMDOS directory functions +

+

4.14.1 DMAread

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »DMA read« - Read individual sectors from a DMA device. +
  +
Opcode: 42 +
  +
Syntax: int16_t DMAread( int32_t sector, int16_t count, void *buffer, +int16_t devno ); +
  +
Description: The XBIOS routine DMAread reads single or multiple sectors +from an ACSI or SCSI device. The following apply: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
sector First sector number to read +
count Number of sectors to read +
buffer Start address in memory where data stored +
devno Device number. This can be: +
+
+ + + + + + + + + + + + +
0..7:ACSI device
8..15:SCSI device (TOS 2.06 and 3.00 onwards)
16:IDE device (TOS 2.06 and 3.06 onwards)
+
+ +
All other values are reserved for future extensions. + +
+ +
Note: In many cases it is more sensible to use Rwabs in +place of this function. The specified memory block must be capable of +being written to for the hardware used (catchword: Fast-RAM buffer). +On the TT030, SCSI devices are handled by this function not via DMA +but via handshaking to transfer individual bytes, so alternative RAM +may be used. But the Falcon uses DMA for SCSI transfers, so cannot use +alternative RAM for this. +
  +
Return value: The function returns 0 if the operation was successful and no +error occurred, else a negative error-code. +
  +
Availability: This function is only available from TOS 2.00 onwards. +
  +
Group: Drive functions +
  +
See also: Binding   DMAwrite   Floprd   Flopwr   Rwabs +
  + +
+ +

4.14.1.1 Bindings for DMAread

+ + + + + + +
C: #include <tos.h> +
  +
int16_t DMAread( int32_t sector, int16_t count, void *buffer, +int16_t devno ); +
  +
Assembler: +
  +
move.w    devno,-(sp)  ; Offset 12
+pea       buffer       ; Offset  8
+move.w    count,-(sp)  ; Offset  6
+move.l    sector,-(sp) ; Offset  2
+move.w    #42,-(sp)    ; Offset  0
+trap      #14          ; Call XBIOS
+lea       $E(sp),sp    ; Correct stack
+
+ +
+ +

4.14.2 DMAwrite

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »DMA write« - Write individual sectors to a DMA device. +
  +
Opcode: 43 +
  +
Syntax: int16_t DMAwrite( int32_t sector, int16_t count, void *buffer, +int16_t devno ); +
  +
Description: The XBIOS routine DMAwrite writes single or multiple sectors +to an ACSI or SCSI device. The following apply: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
sector First sector number to read +
count Number of sectors to read +
buffer Start address in memory where data stored +
devno Device number. This can be: +
+
+ + + + + + + + + + + + +
0..7:ACSI device
8..15:SCSI device (TOS 2.06 and 3.00 onwards)
16IDE device (TOS 2.06 and 3.06 onwards)
+
+ +
All other values are reserved for future extensions. + +
+ +
Note: In many cases it is more sensible to use Rwabs in +place of this function. The specified memory block must be capable of +being read from for the hardware used (catchword: Fast-RAM buffer). +SCSI devices are operated by this function not via DMA but via +handshaking. +
  +
Return value: The function returns 0 if the operation was successful and no +error occurred, else a negative error-code. +
  +
Availability: This function is only available from TOS 2.00 onwards. +
  +
Group: Drive functions +
  +
See also: Binding   DMAread   Floprd   Flopwr   Rwabs +
  + +
+ +

4.14.2.1 Bindings for DMAwrite

+ + + + + + +
C: #include <tos.h> +
  +
int16_t DMAwrite( int32_t sector, int16_t count, void *buffer, +int16_t devno ); +
  +
Assembler: +
  +
move.w    devno,-(sp)  ; Offset 12
+pea       buffer       ; Offset  8
+move.w    count,-(sp)  ; Offset  6
+move.l    sector,-(sp) ; Offset  2
+move.w    #43,-(sp)    ; Offset  0
+trap      #14          ; Call XBIOS
+lea       $E(sp),sp    ; Correct stack
+
+ +
+ +

4.14.3 Flopfmt

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Floppy format« - Format specific tracks on a floppy +
  +
Opcode: 10 +
  +
Syntax: int16_t Flopfmt( void *buf, int32_t filler, int16_t devno, +int16_t spt, int16_t trackno, int16_t sideno, int16_t interlv, int32_t +magic, int16_t virgin ); +
  +
Description: The XBIOS routine Flopfmt formats one or more tracks on a +floppy disk. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
  +
buf Pointer to a segment of memory where the data for one track may +be stored +
  +
filler For all TOS versions < 1.02 unused, and to be set to 0. +From Blitter-TOS onwards: If interlv = -1, then +filler is to be treated as a pointer to a table of sector +numbers (16 bit words). This makes it possible to choose the order of +the sectors on the track freely. +
  +
devno 0 = Drive A:, 1 = Drive B: +
  +
spt Sectors per track (normal: 9). If the cookie _FDC is set, +then in addition values of 18 (High Density) or 36 (Extra High +Density) sectors are permitted. Switching between the various write +modes takes place at 13 (HD) or 26 (ED). +
  +
trackno Number of the track (0..79) +
  +
sideno 0: Side 1 +
1: Side 2 (for double-sided disks) +
  +
interlv Determines how many physical sectors lie between two logical +sectors in each case (normal: 1). +
  +
magic Must be 0x87654321, otherwise no formatting will be performed. +
  +
virgin Bit-pattern that is written during formatting into each sector +(normal: 0xe5e5). The upper four bits may not be set, as otherwise +this would be interpreted by the controller as a command. +
  + +
+ +
Note: As of the Blitter-TOS, the desktop allows a +list of sector numbers to be passed to arrange tracks in a spiral +format in such a way that the least possible time is lost at track +changes waiting for the next sector. +
  +
For a normal format (9 sectors per track) the memory segment +specified with the parameter buf must have a size of at least +8 kbyte; in other cases the buffer may have to be increased above +this. +
  +
Return value: The function returns 0 when no error has occurred in formatting +the track. Otherwise a NULL-terminated list of the faulty sectors will +be written as a int16_t array into the buffer buf. +
  +
Availability: All TOS versions. +
  +
Group: Drive functions +
  +
See also: Binding   Flopwr +
  + +
+ +

4.14.3.1 Bindings for Flopfmt

+ + + + + + + + + +
C: #include <tos.h> +
  +
int16_t Flopfmt( void *buf, int32_t filler, int16_t devno, +int16_t spt, int16_t trackno, int16_t sideno, int16_t interlv, int32_t +magic, int16_t virgin ); +
  +
Assembler: +
  +
move.w    virgin,-(sp)  ; Offset 24
+move.l    magic,-(sp)   ; Offset 20
+move.w    interlv,-(sp) ; Offset 18
+move.w    sideno,-(sp)  ; Offset 16
+move.w    trackno,-(sp) ; Offset 14
+move.w    spt,-(sp)     ; Offset 12
+move.w    devno,-(sp)   ; Offset 10
+move.l    filler,-(sp)  ; Offset  6
+pea       buf           ; Offset  2
+move.w    #10,-(sp)     ; Offset  0
+trap      #14           ; Call XBIOS
+lea       $1A(sp),sp    ; Correct stack
+
+
GFA-Basic +Fehler%=Xbios(10,L:buf%,L:filler%,W:devno%,W:spt%,W:trackno%,W:sideno%,W:interlv%,L:magic%,W:virgin%) +
  + +
+ +

4.14.4 Floprate

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Floppy rate« - Read or set the seek rate of a floppy drive. +
  +
Opcode: 41 +
  +
Syntax: int16_t Floprate( int16_t devno, int16_t newrate ); +
  +
Description: The XBIOS routine Floprate returns or sets the current seek +rate. The following apply: +
  + + + + + + + + + +
Parameter Meaning +
  +
devno Drive number: +
  +

+
+ + + + + + + + + + +
0=Drive A:
1=Drive B: etc
+
+ +
newrate +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
-1=Do not alter seek rate
0=Seek rate of 6ms
1=Seek rate of 12ms
2=Seek rate of 2ms
3=Seek rate of 3ms
+
+ + +
+ + + +
Note: As of MagiC 3, one can additionally use Floprate +(-1, newrate) to set the timeout for the floppy; a value of +300 means 1.5 seconds) this is the value that is set by default at +booting). +
  +
With older ROM-TOS versions one has to use the previously +undocumented system variables: +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
TOS-VersionDrive A:Drive B:
RAM TOS0x6ca0x6ce
1.000xa080xa0c
1.020xa4e0xa52
+
+ +
For portable setting one can use the following sample routine. +
  +
The MilanTOS 4.08 (2003.09.03) do nothing and returns always +null. +
  +
Return value: The function returns the prior seek rate for the drive. +
  +
Availability: The function is only available as of TOS 1.04. +
  +
Group: Drive functions +
  +
See also: Binding   Flopwr   Floprd   Flopver   Flopfmt +
  + +
+ +

4.14.4.1 Bindings for Floprate

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Floprate( int16_t devno, int16_t newrate ); +
  +
Assembler: +
  +
move.w    newrate,-(sp) ; Offset 4
+move.w    devno,-(sp)   ; Offset 2
+move.w    #41,-(sp)     ; Offset 0
+trap      #14           ; Call XBIOS
+addq.l    #6,sp         ; Correct stack
+
+ +
+ +

4.14.4.2 Seekrate for all TOS versions

+
/* Portable setting of the floppy seek rate for all TOS versions
+   (except RAM-TOS 1.00).
+   Parameters: As for the XBIOS function "Floprate" */
+
+int16_t SeekRate ( int16_t devno, int16_t newrate )
+{
+  int32_t stack;
+  int16_t version;
+  OSHEADER *sys;
+
+  /* Get pointer to OS-header */
+  stack = Super (0L);
+  sys = *((OSHEADER **) 0x4f2);
+  version = sys->os_version;
+  Super ((void *)stack);
+
+  /* With newer TOS simply call "Floprate"  */
+  if ( version >= 0x0104 )
+    return Floprate ( devno, newrate );
+  else
+  {
+    /* otherwise calculate pointer to internal GEMDOS variables */
+    int16_t *sk, merk;
+
+    if ( version == 0x0102 )
+      sk = (int16_t *) 0x0a4e;
+    else
+      sk = (int16_t *) 0x0a08;
+
+    /* Drive B: 2 int16_t follows */
+    if ( devno ) sk = &(sk[2]);
+
+    merk = *sk;
+    /* enter value only if not -1 */
+    if ( newrate != -1 ) *sk = newrate;
+
+    /* always return old value */
+    return merk;
+  }
+}
+
+

4.14.5 Floprd

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Floppy read« - Read individual sectors from floppy disk. +
  +
Opcode: 8 +
  +
Syntax: int16_t Floprd( void *buf, int32_t filler, int16_t devno, +int16_t sectno, int16_t trackno, int16_t sideno, int16_t count ); +
  +
Description: The XBIOS routine Floprd reads one or more physical sectors +from a floppy disk. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
buf Pointer to memory block to be used as a buffer for the read-in +sectors +
filler Unused +
devno Drive (0 = Drive A: etc.) +
sectno Start sector (normally between 1 and 9) +
trackno Track number (normally between 0 and 79) +
sideno Side of the floppy disk (0 or 1) +
count Number of sectors to be read + +
+ +
Return value: The function returns 0 if the operation was successful or a +non-zero error-code if not. +
  +
Availability: All TOS versions. +
  +
Group: Drive functions +
  +
See also: Binding   DMAread   DMAwrite   Flopwr   Rwabs +
  + +
+ +

4.14.5.1 Bindings for Floprd

+ + + + + + + + + +
C: #include <tos.h> +
  +
int16_t Floprd( void *buf, int32_t filler, int16_t devno, +int16_t sectno, int16_t trackno, int16_t sideno, int16_t count ); +
  +
Assembler: +
  +
move.w    count,-(sp)   ; Offset 18
+move.w    sideno,-(sp)  ; Offset 16
+move.w    trackno,-(sp) ; Offset 14
+move.w    sectno,-(sp)  ; Offset 12
+move.w    devno,-(sp)   ; Offset 10
+move.l    filler,-(sp)  ; Offset  6
+pea       buf           ; Offset  2
+move.w    #8,-(sp)      ; Offset  0
+trap      #14           ; Call XBIOS
+lea       $14(sp),sp    ; Correct stack
+
+
GFA-Basic +Fehler%=Xbios(8,L:buf%,L:filler%,W:devno%,W:sectno%,W:trackno%,W:sideno%,W:count%) +
  + +
+ +

4.14.6 Flopver

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Floppy verify« - Verify sectors of a floppy disk. +
  +
Opcode: 19 +
  +
Syntax: int16_t Flopver( void *buf, int32_t filler, int16_t devno, +int16_ sectno, int16_t trackno, int16_t sideno, int16_t count ); +
  +
Description: The XBIOS routine Flopver verifies that a series of sectors +can be read without error from a floppy disk drive. The following +apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
buf Pointer to a 1024 byte block of memory into which the sectors +to be verified can be read +
filler Unused (should be set to 0) +
devno Drive: +
+
+ + + + + + + + + + +
0=Drive A:
1=Drive B:
+
+ +
sectno Start sector (normally between 1 and 9) +
trackno Track nummer (normally between 0 and 79) +
sideno Side of the floppy disk (0 or 1) +
count Number of sectors to be verified + +
+ +
Note: After the call one finds in the parameter +buf a NULL-terminated list of 16-bit words containing the +numbers of the defective sectors. So the function does not +compare sectors with a block of memory; instead it always reads the +sectors into the same buffer. This only verifies that the sectors can +be read correctly, or if read errors occur during reading. +
  +
Return value: The function returns the value 0 if the list stored in the +parameter buf is valid, or a non-zero value otherwise. +
  +
Availability: All TOS versions. +
  +
Group: Drive functions +
  +
See also: Binding +
  + +
+ +

4.14.6.1 Bindings for Flopver

+ + + + + + + + + +
C: #include <tos.h> +
  +
int16_t Flopver( void *buf, int32_t filler, int16_t devno, +int16_ sectno, int16_t trackno, int16_t sideno, int16_t count ); +
  +
Assembler: +
  +
move.w    count,-(sp)    ; Offset 18
+move.w    sideno,-(sp)   ; Offset 16
+move.w    trackno,-(sp)  ; Offset 14
+move.w    sectno,-(sp)   ; Offset 12
+move.w    devno,-(sp)    ; Offset 10
+move.l    filler,-(sp)   ; Offset  6
+pea       buf            ; Offset  2
+move.w    #19,-(sp)      ; Offset  0
+trap      #14            ; Call XBIOS
+lea       $14(sp),sp     ; Correct stack
+
+
GFA-Basic +Fehler%=Xbios(19,L:buf%,L:filler%,W:devno%,W:sectno,W:trackno%,W:sideno%,W:count%) +
  + +
+ +

4.14.7 Flopwr

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Floppy write« - Write individual sectors on a floppy disk. +
  +
Opcode: 9 +
  +
Syntax: int16_t Flopwr( VOID *buf, int32_t filler, int16_t devno, +int16_t sectno, int16_t trackno, int16_t sideno, int16_t count ); +
  +
Description: The XBIOS routine Flopwr writes one or more physical sectors +to a floppy disk. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
buf Pointer to memory block to be used as a buffer for the sectors +to be written +
filler Unused +
devno Drive (0 = Drive A: etc.) +
sectno Start sector (normally between 1 and 9) +
trackno Track number (normally between 0 and 79) +
sideno Side of the floppy disk (0 or 1) +
count Number of sectors to be written + +
+ +
Return value: The function returns 0 if the operation was successful or a +non-zero error-code if not. +
  +
Availability: All TOS versions. +
  +
Group: Drive functions +
  +
See also: Binding   DMAread   DMAwrite   Floprd +
  + +
+ +

4.14.7.1 Bindings for Flopwr

+ + + + + + + + + +
C: #include <tos.h> +
  +
int16_t Flopwr( VOID *buf, int32_t filler, int16_t devno, +int16_t sectno, int16_t trackno, int16_t sideno, int16_t count ); +
  +
Assembler: +
  +
move.w    count,-(sp)    ; Offset 18
+move.w    sideno,-(sp)   ; Offset 16
+move.w    trackno,-(sp)  ; Offset 14
+move.w    sectno,-(sp)   ; Offset 12
+move.w    devno,-(sp)    ; Offset 10
+move.l    filler,-(sp)   ; Offset  6
+pea       buf            ; Offset  2
+move.w    #9,-(sp)       ; Offset  0
+trap      #14            ; Call XBIOS
+lea       $14(sp),sp     ; Correct stack
+
+
GFA-Basic +Fehler%=Xbios(9,L:buf%,L:filler%,W:devno%,W:sectno%,W:trackno%,W:sideno,W:count%) +
  + +
+ +

4.14.8 Metaclose

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Metaclose« - Release a MetaDOS device again. +
  +
Opcode: 50 +
  +
Syntax: int32_t Metaclose( int16_t drive ); +
  +
Description: The function releases the drive drive again. +
  +
Return value: The function returns a value of the type int32_t. +
  +
Availability: This function is only available when MetaDOS has been installed. +
  +
Group: Drive functions +
  +
See also: Binding   Metaopen +
  + +
+ +

4.14.8.1 Bindings for Metaclose

+ + + + + + +
C: int32_t Metaclose( int16_t drive ); +
  +
Assembler: +
  +
move.w    drive,-(sp)  ; Offset 2
+move.w    #50,-(sp)    ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.14.9 Metadiscinfo

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Metadiscinfo« - Obtain current status information. +
  +
Opcode: 63 +
  +
Syntax: int32_t Metadiscinfo( int16_t drive, CD_DISC_INFO *p ); +
  +
Description: The function obtains information about the status of a MetaDOS +device. The following applies: +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
driveDesired drive
pAddress of the receiving buffer
+
+ +
Note: The position data within the structure are coded +in BCD MSF format. The element index is not set by old BOS +drivers, and the element disctype is not set by SCSI +CD-ROMs. +
  +
Return value: The function returns a value of the type int32_t. +
  +
Availability: This function is only available when MetaDOS has been installed. +
  +
Group: Drive functions +
  +
See also: Binding   Metastatus +
  + +
+ +

4.14.9.1 Bindings for Metadiscinfo

+ + + + + + +
C: int32_t Metadiscinfo( int16_t drive, CD_DISC_INFO *p ); +
  +
Assembler: +
  +
pea       p            ; Offset 4
+move.w    drive,-(sp)  ; Offset 2
+move.w    #63,-(sp)    ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #8,sp        ; Correct stack
+
+ +
+ +

4.14.10 Metagettoc

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Metagettoc« - Return the table of contents of a device. +
  +
Opcode: 62 +
  +
Syntax: int32_t Metagettoc( int16_t drive, int16_t flag, CD_TOC_ENTRY +*buffer ); +
  +
Description: The function returns the table of contents of a drive. The +following applies: +
  +

+
+ + + + + + + + + + + + + + + + +
ParameterMeaning
driveDesired drive
flagReserved for CDAR504
bufferBuffer for receiving the table of contents
+
+ +
Note: The receiving buffer should have room for 128 +entries. Each entry consists of a track number and an MSF address +(both in BCD format). For the track number the following applies: +
0 = Record has no meaning +
0x01...0x99 = Track number in BCD coding +
0xa0 = First track with programmed order 0xa2 = End of the CD. +
  +
Return value: The function returns a value of the type int32_t. +
  +
Availability: This function is only available when MetaDOS has been installed. +
  +
Group: Drive functions +
  +
See also: Binding   Metaread   Metawrite +
  + +
+ +

4.14.10.1 Bindings for Metagettoc

+ + + + + + +
C: int32_t Metagettoc( int16_t drive, int16_t flag, CD_TOC_ENTRY +*buffer ); +
  +
Assembler: +
  +
pea       buffer       ; Offset 6
+move.w    flag,-(sp)   ; Offset 4
+move.w    drive,-(sp)  ; Offset 2
+move.w    #62,-(sp)    ; Offset 0
+trap      #14          ; Call XBIOS
+lea       $A(sp),sp    ; Correct stack
+
+ +
+ +

4.14.11 Metainit

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Metainit« - Obtain information about the installed MetaDOS +version. +
  +
Opcode: 48 +
  +
Syntax: void Metainit( META_INFO_1 *buffer ); +
  +
Description: The XBIOS routine Metainit obtains information about the +currently installed version of MetaDOS, and the devices known to it. +
  +
The following procedure is suggested: +
  +
    +
  • Clear the contents of META_INFO_1 structure +
  • +
  • Call the function Metainit +
  • +
  • Test whether the element version still holds a +NULL-pointer (then MetaDOS is not installed. +
  • +
+ +
Return value: The function returns no direct result. +
  +
Availability: This function is only available when MetaDOS has been installed. +
  +
Group: Drive functions +
  +
See also: Binding +
  + +
+ +

4.14.11.1 Bindings for Metainit

+ + + + + + +
C: void Metainit( META_INFO_1 *buffer ); +
  +
Assembler: +
  +
pea       buffer       ; Offset 2
+move.w    #48,-(sp)    ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.14.12 Metaioctl

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Metaioctl« - Send GEMDOS opcodes to a MetaDOS device. +
  +
Opcode: 55 +
  +
Syntax: int32_t Metaioctl( int16_t drive, int32_t magic, int16_t +opcode, void *buffer ); +
  +
Description: The function permits opcodes of the GEMDOS routines Dcntl or +Fcntl to be sent to a MetaDOS device. The following apply: +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
driveDesired drive
magicMust have the value 'FCTL'
opcodeOpcode to be sent
bufferDepends on opcode
+
+ +
Note: The list of CD-ROM commands is an itemization of all known opcodes +that may occur when working with CD-ROMs. +
  +
Return value: The function returns the following values in case of error: +
  + + + + + + +
EINVFN: The specified opcode is not supported. +
  +
EUNCMD: The function itself (!) is not supported. +
  + +
+ +
Availability: This function is only available when MetaDOS has been installed. +
  +
Group: Drive functions +
  +
See also: Binding   Dcntl   Fcntl +
  + +
+ +

4.14.12.1 Bindings for Metaioctl

+ + + + + + +
C: int32_t Metaioctl( int16_t drive, int32_t magic, int16_t +opcode, void *buffer ); +
  +
Assembler: +
  +
pea       buffer       ; Offset 10
+move.w    opcode,-(sp) ; Offset  8
+move.l    magic,-(sp)  ; Offset  4
+move.w    drive,-(sp)  ; Offset  2
+move.w    #55,-(sp)    ; Offset  0
+trap      #14          ; Call XBIOS
+lea       $E(sp),sp    ; Correct stack
+
+ +
+ +

4.14.13 Metaopen

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Metaopen« - Initialize a MetaDOS device. +
  +
Opcode: 49 +
  +
Syntax: int32_t Metaopen( int16_t drive, META_DRVINFO *buffer ); +
  +
Description: The function initializes a MetaDOS device. The following +applies: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
drive Desired drive +
buffer Pointer for receiving the name of the driver + +
+ +
Note: If the driver name starts with 'CD', one may +assume that this is a CD-ROM driver. +
  +
Return value: The function returns the value 0 if all was OK, or a negative +error number. +
  +
Availability: This function is only available when MetaDOS has been installed. +
  +
Group: Drive functions +
  +
See also: Binding   Metaclose +
  + +
+ +

4.14.13.1 Bindings for Metaopen

+ + + + + + +
C: int32_t Metaopen( int16_t drive, META_DRVINFO *buffer ); +
  +
Assembler: +
  +
pea       buffer       ; Offset 4
+move.w    drive,-(sp)  ; Offset 2
+move.w    #49,-(sp)    ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #8,sp        ; Correct stack
+
+ +
+ +

4.14.14 Metaread

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Metaread« - Read data from a MetaDOS device. +
  +
Opcode: 51 +
  +
Syntax: int32_t Metaread( int16_t drive, void *buffer, int32_t blockno, +int16_t count ); +
  +
Description: The function reads data from a MetaDOS device. The following +apply: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
drive Desired drive +
buffer Buffer for receiving the data +
blockno Number of the start block +
count Number of blocks to be read + +
+ +
Note: The block size for CD-ROMs is 2048 bytes; but +unfortunately this can not be obtained in each case. Due to a +limitation in Atari's BOS drivers, a maximum of 63 blocks can be read +at a time. +
  +
Return value: The function returns a value of the type int32_t. +
  +
Availability: This function is only available when MetaDOS has been installed. +
  +
Group: Drive functions +
  +
See also: Binding   Metawrite +
  + +
+ +

4.14.14.1 Bindings for Metaread

+ + + + + + +
C: int32_t Metaread( int16_t drive, void *buffer, int32_t blockno, +int16_t count ); +
  +
Assembler: +
  +
move.w    count,-(sp)   ; Offset 10
+move.l    blockno,-(sp) ; Offset  8
+pea       buffer        ; Offset  4
+move.w    drive,-(sp)   ; Offset  2
+move.w    #51,-(sp)     ; Offset  0
+trap      #14           ; Call XBIOS
+lea       $E(sp),sp     ; Correct stack
+
+ +
+ +

4.14.15 Metaseek

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Metaseek« - Seeks to a physical address. +
  +
Opcode: 53 +
  +
Syntax: int32_t Metaseek( int16_t drive, int32_t blockno ); +
  +
Description: The function will seek the physical unit to a physical address. +The function call will return once the seek has been completed or on +an error condition. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
drive Desired drive +
blockno Block number to seek to + +
+ +
Return value: The function returns a value of the type int32_t. +
  +
Availability: This function is only available when MetaDOS has been installed. +
  +
Group: Drive functions +
  +
See also: Binding   Metaread   Metawrite +
  + +
+ +

4.14.15.1 Bindings for Metaseek

+ + + + + + +
C: int32_t Metaseek( int16_t drive, int32_t blockno ); +
  +
Assembler: +
  +
move.l    blockno,-(sp)    ; Offset 4
+move.w    drive            ; Offset 2
+move.w    #53,-(sp)        ; Offset 0
+trap      #14              ; Call XBIOS
+addq.l    #8,sp            ; Correct stack
+
+ +
+ +

4.14.16 Metasetsongtime

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Metasetsongtime« - Start audio playback of a timed portion +of the track. +
  +
Opcode: 61 +
  +
Syntax: int32_t Metasetsongtime( int16_t drive, int16_t repeat, int32_t +starttime, int32_t endtime ); +
  +
Description: The function starts audio playback of a specified timed portion +of an audio track. The following apply: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
drive Desired drive +
repeat Repeat +
+
+ + + + + + + + + + +
0=Without repeating
1=With repeating
+
+ +
starttime BCD start time in MSF coding +
endtime BCD end time in MSF coding + +
+ +
Note: The repeat mode appears to be supported only by +CDARGEN.BOS and also only for the Atari CDAR504 drive. +
  +
Return value: The function returns a value of the type int32_t. +
  +
Availability: This function is only available when MetaDOS has been installed. +
  +
Group: Drive functions +
  +
See also: Binding   Metastartaudio   Metastopaudio +
  + +
+ +

4.14.16.1 Bindings for Metasetsongtime

+ + + + + + +
C: int32_t Metasetsongtime( int16_t drive, int16_t repeat, int32_t +starttime, int32_t endtime ); +
  +
Assembler: +
  +
move.l    endtime,-(sp)    ; Offset 10
+move.l    starttime,-(sp)  ; Offset  6
+move.w    repeat           ; Offset  4
+move.w    drive            ; Offset  2
+move.w    #61,-(sp)        ; Offset  0
+trap      #14              ; Call XBIOS
+lea       $E(sp),sp        ; Correct stack
+
+ +
+ +

4.14.17 Metastartaudio

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Metastartaudio« - Start audio playback of one or more songs. +
  +
Opcode: 59 +
  +
Syntax: int32_t Metastartaudio( int16_t drive, int16_t flag, uint8_t +*bytearray); +
  +
Description: The function starts audio playback of a specified song or +songs. The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
drive Desired drive +
flag Mode +
bytearray Dependent on parameter flag + +
+ +
Note: On SCSI devices only one mode exists (flag = 0). +In that case one passes in bytearray[0] the number of songs to +be played, and in bytearray[1] the number of the first song. +
  +
Return value: The function returns a value of the type int32_t. +
  +
Availability: This function is only available when MetaDOS has been installed. +
  +
Group: Drive functions +
  +
See also: Binding   Metasetsongtime   Metastopaudio +
  + +
+ +

4.14.17.1 Bindings for Metastartaudio

+ + + + + + +
C: int32_t Metastartaudio( int16_t drive, int16_t flag, uint8_t +*bytearray); +
  +
Assembler: +
  +
pea       bytearray    ; Offset 6
+move.w    flag,-(sp)   ; Offset 4
+move.w    drive,-(sp)  ; Offset 2
+move.w    #59,-(sp)    ; Offset 0
+trap      #14          ; Drive functions
+lea       $A(sp),sp    ; Call XBIOS
+
+ +
+ +

4.14.18 Metastatus

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Metastatus« - Obtain the status of a MetaDOS device. +
  +
Opcode: 54 +
  +
Syntax: int32_t Metastatus( int16_t drive, void *buffer ); +
  +
Description: The function obtains the status of a MetaDOS device. The +following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
drive Desired drive +
buffer Dependent on the implementation of the BOS driver + +
+ +
Return value: The function returns a 32-bit value, which is coded as follows: +codiert ist: +
  + + + + + + +
High-Word: +
  +

+
+ + + + + + + + + + +
0x0000=All OK
0xffff=Error has arisen
+
+ +
Low-Word : +
  +

+
+ + + + + + + + + + + + + + + + +
Bit-15(Error)
Bit-07(Timeout)
Bit-02(Media change)
Bit-01(Busy)
+
+ + +
+ +
All other bits of the low word are reserved at present. +
  +
Availability: This function is only available when MetaDOS has been installed. +
  +
Group: Drive functions +
  +
See also: Binding   Metadiscinfo +
  + +
+ +

4.14.18.1 Bindings for Metastatus

+ + + + + + +
C: int32_t Metastatus( int16_t drive, void *buffer ); +
  +
Assembler: +
  +
pea       buffer       ; Offset 4
+move.w    drive,-(sp)  ; Offset 2
+move.w    #54,-(sp)    ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #8,sp        ; Correct stack
+
+ +
+ +

4.14.19 Metastopaudio

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Metastopaudio« - Stop audio playback. +
  +
Opcode: 60 +
  +
Syntax: int32_t Metastopaudio( int16_t drive ); +
  +
Description: The function stops audio playback for the drive drive. +
  +
Return value: The function returns a value of the type int32_t. +
  +
Availability: This function is only available when MetaDOS has been installed. +
  +
Group: Drive functions +
  +
See also: Binding   Metastartaudio   Metasetsongtime +
  + +
+ +

4.14.19.1 Bindings for Metastopaudio

+ + + + + + +
C: int32_t Metastopaudio( int16_t drive ); +
  +
Assembler: +
  +
move.w    drive,-(sp)  ; Offset 2
+move.w    #60,-(sp)    ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.14.20 Metawrite

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Metawrite« - Write data to a MetaDOS device. +
  +
Opcode: 52 +
  +
Syntax: int32_t Metawrite( int16_t drive, void *buffer, int32_t +blockno, int16_t count ); +
  +
Description: The function writes data to a MetaDOS device. The following +apply: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
drive Desired drive +
buffer Address of the data buffer +
blockno Number of the start block +
count Number of blocks to be written + +
+ +
Note: With a CD-ROM this function naturally has no +effect. +
  +
Return value: The function returns a value of the type int32_t. +
  +
Availability: This function is only available when MetaDOS has been installed. +
  +
Group: Drive functions +
  +
See also: Binding   Metaread +
  + +
+ +

4.14.20.1 Bindings for Metawrite

+ + + + + + +
C: int32_t Metawrite( int16_t drive, void *buffer, int32_t +blockno, int16_t count ); +
  +
Assembler: +
  +
move.w    count,-(sp)   ; Offset 10
+move.l    blockno,-(sp) ; Offset  8
+pea       buffer        ; Offset  4
+move.w    drive,-(sp)   ; Offset  2
+move.w    #52,-(sp)     ; Offset  0
+trap      #14           ; Call XBIOS
+lea       $E(sp),sp     ; Correct stack
+
+ +
+ +

4.14.21 Protobt

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »prototype boot sector« - Generate a standard boot-sector for +a floppy disk. +
  +
Opcode: 18 +
  +
Syntax: void Protobt( void *buf, int32_t serialno, int16_t disktype, +int16_t execflag ); +
  +
Description: The XBIOS routine Protobt creates a boot-sector for a floppy +disk. The argument buf points to a 512 byte sized buffer +holding the contents of the boot-sector. The parameter +serialno serves to store a serial number in the boot-sector; +if the variable serialno is greater than 0x01000000, then a +random number will be stored instead. With disktype one of the +following floppy disk types will be selected: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
disktype Meaning +
    +
  -1 Don't change disk type +
   0 40 tracks, single-sided (180 kbyte) +
   1 40 tracks, double-sided (360 kbyte) +
   2 80 tracks, single-sided (360 kbyte) +
   3 80 tracks, double-sided (720 kbyte) +
   4 High Density (1,44 Mbyte) +
is only supported if the cookie _FDC holds the value for HD +support. +
   5 Extra High Density (2,88 Mbyte) +
is only supported if the cookie _FDC holds the value for ED +support. + +
+ +
Finally, the parameter execflag determines whether the +information in the boot-sector can be executed as a program. The +following apply: +
  + + + + + + + + + + + + + + + +
execflag Meaning +
    +
-1 Do not alter boot-sector +
 0 Boot-sector is not executable +
 1 Boot-sector is executable + +
+ +
Note: So that floppy disks may be read on MS-DOS systems +as well, the first 3 bytes of the boot-sector have to have the values +0xE9, 0x00 and 0x4E or 0xEB, 0x34 and 0x90 entered; however, floppy +disks of this kind are then no longer bootable under TOS. +
  +
Return value: The function does not return a result. +
  +
Availability: All TOS versions. +
  +
Group: Drive functions +
  +
See also: Binding   Flopfmt +
  + +
+ +

4.14.21.1 Bindings for Protobt

+ + + + + + + + + +
C: #include <tos.h> +
  +
void Protobt( void *buf, int32_t serialno, int16_t disktype, +int16_t execflag ); +
  +
Assembler: +
  +
move.w    execflag,-(sp)  ; Offset 12
+move.w    disktype,-(sp)  ; Offset 10
+move.l    serialno,-(sp)  ; Offset  6
+pea       buf             ; Offset  2
+move.w    #18,-(sp)       ; Offset  0
+trap      #14             ; Call XBIOS
+lea       $E(sp),sp       ; Correct stack
+
+
GFA-Basic Fehler%=Xbios(18,L:buf%,L:serialno%,W:disktype%,W:execflag%) +
  + +
+ +
+ +Home +XBIOSXBIOS +Interrupt functionsInterrupt functions +MATRIX XBIOS extensionMATRIX XBIOS extension + + diff --git a/en/xbios_dsp56001.html b/en/xbios_dsp56001.html new file mode 100644 index 000000000..a4b52fae4 --- /dev/null +++ b/en/xbios_dsp56001.html @@ -0,0 +1,2629 @@ + + + + + +The documentation for TOS: DSP programming + + + + + + + + + +Home +XBIOSXBIOS +Printer functionsPrinter functions +Hatari DHS XBIOS extensionHatari DHS XBIOS extension + +
+ +

4.11 DSP programming

+

On the Falcon, the following routines for programming the +DSP-56001 digital signal processor are available: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dsp_Available Obtains amount of free memory. +
Dsp_BlkBytes Bytewise data transfer. +
Dsp_BlkHandShake Data transfer with handshake. +
Dsp_BlkUnpacked Transfer of DSP-words (max. 4 byte long). +
Dsp_BlkWords Wordwise data transfer. +
Dsp_DoBlock Data transfer to the DSP. +
Dsp_ExecBoot Loads bootstrap program for the DSP. +
Dsp_ExecProg Executes DSP program. +
Dsp_FlushSubroutines Removes subroutines. +
Dsp_GetProgAbility Requests identification of a process. +
Dsp_GetWordSize Obtains size of a DSP-word. +
Dsp_Hf0 Sets or clears bit 3 of the HSR. +
Dsp_Hf1 Sets or clears bit 4 of the HSR. +
Dsp_Hf2 Inquires bit 3 of the HCR. +
Dsp_Hf3 Inquires bit 4 of the HCR. +
Dsp_HStat Inquires value of the ISR-register. +
Dsp_InqSubrAbility Inquires subroutine identifier. +
Dsp_InStream Data transfer to DSP via an interrupt. +
Dsp_IOStream Data transfer from and to DSP via two interrupts. +
Dsp_LoadProg Loads and executes DSP-program. +
Dsp_LoadSubroutine Installs a subroutine. +
Dsp_Lock Inquires availability of the DSP. +
Dsp_LodToBinary Converts LOD to Binary format. +
Dsp_MultBlocks Data transfer from and to DSP. +
Dsp_OutStream Data transfer from DSP via an interrupt. +
Dsp_RemoveInterrupts Turns off generation of DSP interrupts. +
Dsp_RequestUniqueAbility Generates an identifier. +
Dsp_Reserve Reserves DSP memory for use by a program. +
Dsp_RunSubroutine Starts execution of a subroutine. +
Dsp_SetVectors Installs custom transfer routines. +
Dsp_TriggerHC Executes host command. +
Dsp_Unlock Releases DSP. + +
+ +

See also: Interface programming +

+

4.11.1 Dsp_Available

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_Available« - Inquire amount of free X and Y memory +space. +
  +
Opcode: 106 +
  +
Syntax: void Dsp_Available( int32_t *xavailable, int32_t *yavailable ); +
  +
Description: The function Dsp_Available inquires amount of free X and Y DSP +memory. Free memory always starts at the physical address 0. The +lowest 64 words are reserved for interrupt vectors. +
  +
Return value: The function does not return a result. +
  +
Availability: The function is available only on computers with the DSP-56001 +signal processor +
  +
Group: DSP programming +
  +
See also: Binding   Dsp_Lock   Dsp_Unlock   Dsp_Reserve   Dsp_LoadProg   +Dsp_ExecProg   Dsp_ExecBoot +
  + +
+ +

4.11.1.1 Bindings for Dsp_Available

+ + + + + + +
C: #include <tos.h> +
  +
void Dsp_Available( int32_t *xavailable, int32_t *yavailable ); +
  +
Assembler: +
  +
pea       yavailable   ; Offset 6
+pea       xavailable   ; Offset 2
+move.w    #106,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+lea       $A(sp),sp    ; Correct stack
+
+ +
+ +

4.11.2 Dsp_BlkBytes

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_BlkBytes« - Bytewise data transfer to the DSP. +
  +
Opcode: 124 +
  +
Syntax: void Dsp_BlkBytes( void *data_in, int32_t size_in, void +*data_out, int32_t size_out ); +
  +
Description: The function copies size_in unsigned bytes from the +buffer data_in to the DSP. After all data has been +transferred, the procedure waits until the data has been processed. +Then size_out 8-bit DSP-words are copied back into the buffer +data_out, irrespective of how much data is actually present. +If no data is to be sent, one has to set size_in to zero. The +same applies for the receipt; in that case size_out is +assigned zero. size_in and size_out are limited to 64 +kbyte. Data is only exchanged when the DSP process is ready for this. +
  +
Return value: The function does not return a result. +
  +
Availability: The function is available only on computers with the DSP-56001 +signal processor +
  +
Group: DSP programming +
  +
See also: Binding   Dsp_DoBlock   Dsp_BlkUnpacked   Dsp_BlkHandShake   +Dsp_BlkWords   Dsp_InStream   Dsp_OutStream   Dsp_IOStream   +Dsp_GetWordSize   Dsp_MultBlocks +
  + +
+ +

4.11.2.1 Bindings for Dsp_BlkBytes

+ + + + + + +
C: #include <tos.h> +
  +
void Dsp_BlkBytes( void *data_in, int32_t size_in, void +*data_out, int32_t size_out ); +
  +
Assembler: +
  +
move.l    size_out,-(sp)  ; Offset 14
+pea       data_out        ; Offset 10
+move.l    size_in,-(sp)   ; Offset  6
+pea       data_in         ; Offset  2
+move.w    #124,-(sp)      ; Offset  0
+trap      #14             ; Call XBIOS
+lea       $12(sp),sp      ; Correct stack
+
+ +
+ +

4.11.3 Dsp_BlkHandShake

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »DspBlkHandShake« - Data transfer to DSP with handshake. +
  +
Opcode: 97 +
  +
Syntax: void Dsp_BlkHandShake( int8_t *data_in, int32_t size_in, int8_t +*data_out, int32_t size_out ); +
  +
Description: The function copies size_in DSP-words from the buffer +data_in to the DSP. After all data has been transferred, the +procedure waits until the data has been processed. Then +size_out DSP-words are copied back into the buffer +data_out, irrespective of how much data is actually present. +If no data is to be sent, one has to set size_in to zero. The +same applies for the receipt; in that case size_out is +assigned zero. size_in and size_out are limited to 64 +kbyte. Data is only exchanged when the DSP process is ready for this. +
  +
Return value: The function does not return a result. +
  +
Availability: The function is available only on computers with the DSP-56001 +signal processor +
  +
Group: DSP programming +
  +
See also: Binding   Dsp_DoBlock   Dsp_BlkUnpacked   Dsp_BlkWords   +Dsp_BlkBytes   Dsp_InStream   Dsp_OutStream   Dsp_IOStream   +Dsp_GetWordSize   Dsp_MultBlocks +
  + +
+ +

4.11.3.1 Bindings for Dsp_BlkHandShake

+ + + + + + +
C: #include <tos.h> +
  +
void Dsp_BlkHandShake( int8_t *data_in, int32_t size_in, int8_t +*data_out, int32_t size_out ); +
  +
Assembler: +
  +
move.l    size_out,-(sp)  ; Offset 14
+pea       data_out        ; Offset 10
+move.l    size_in,-(sp)   ; Offset  6
+pea       data_in         ; Offset  2
+move.w    #97,-(sp)       ; Offset  0
+trap      #14             ; Call XBIOS
+lea       $12(sp),sp      ; Correct stack
+
+ +
+ +

4.11.4 Dsp_BlkUnpacked

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_BlkUnpacked« - Data transfer of DSP-words with a maximum +length of 4 bytes (longword array). +
  +
Opcode: 98 +
  +
Syntax: void Dsp_BlkUnpacked( int32_t *data_in, int32_t size_in, +int32_t *data_out, int32_t size_out ); +
  +
Description: This function only works with DSP-words having a maximum length +of 4 bytes. The length of the DSP-words can be found with +Dsp_GetWordSize. Both data_in and data_out are LONG +fields. size_in and size_out refer to the size of the +fields in longwords. Depending on the length of the DSP-word, only the +lower bytes are transferred to the LONGs. The function copies +size_in DSP-words from the buffer data_in to the DSP. +After all data has been transferred, the procedure waits until the +data has been processed. Then size_out DSP-words are copied +back into the buffer data_out, irrespective of how much data +is actually present. If no data is to be sent, one has to set +size_in to zero. The same applies for the receipt; in that +case size_out is assigned zero. size_in and +size_out are limited to 64 kbyte. +
There is no guarantee that the higher-valued bytes of the received +LONGs are zero when the DSP-wordlength is less than 4. +
  +
Return value: The function does not return a result. +
  +
Availability: The function is available only on computers with the DSP-56001 +signal processor. +
  +
Group: DSP programming +
  +
See also: Binding   Dsp_DoBlock   Dsp_BlkHandShake   Dsp_BlkWords   +Dsp_BlkBytes   Dsp_InStream   Dsp_OutStream   Dsp_IOStream   +Dsp_GetWordSize   Dsp_MultBlocks +
  + +
+ +

4.11.4.1 Bindings for Dsp_BlkUnpacked

+ + + + + + +
C: #include <tos.h> +
  +
void Dsp_BlkUnpacked( int32_t *data_in, int32_t size_in, int32_t +*data_out, int32_t size_out ); +
  +
Assembler: +
  +
move.l    size_out,-(sp)  ; Offset 14
+pea       data_out        ; Offset 10
+move.l    size_in,-(sp)   ; Offset  6
+pea       data_in         ; Offset  2
+move.w    #98,-(sp)       ; Offset  0
+trap      #14             ; Call XBIOS
+lea       $12(sp),sp      ; Correct stack
+
+ +
+ +

4.11.5 Dsp_BlkWords

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_BlkWords« - Wordwise data transfer of an array of WORDS +to the DSP. +
  +
Opcode: 123 +
  +
Syntax: void Dsp_BlkWords( void *data_in, int32_t size_in, void +*data_out, int32_T size_out ); +
  +
Description: The function copies size_in signed 16-bit words from +the buffer data_in to the DSP. The words are extended to +signed DSP-wordlength before transfer. After all data has been +transferred, the procedure waits until the data has been processed. +Then size_out 16-bit DSP-words are copied back into the buffer +data_out, irrespective of how much data is actually present. +If no data is to be sent, one has to set size_in to zero. The +same applies for the receipt; in that case size_out is +assigned zero. size_in and size_out are limited to 64 +kbyte. Data is only exchanged when the DSP process is ready for this. +
  +
Return value: The function does not return a result. +
  +
Availability: The function is available only on computers with the DSP-56001 +signal processor. +
  +
Group: DSP programming +
  +
See also: Binding   Dsp_DoBlock   Dsp_BlkUnpacked   Dsp_BlkHandShake   +Dsp_BlkBytes   Dsp_InStream   Dsp_OutStream   Dsp_IOStream   +Dsp_GetWordSize   Dsp_MultBlocks +
  + +
+ +

4.11.5.1 Bindings for Dsp_BlkWords

+ + + + + + +
C: #include <tos.h> +
  +
void Dsp_BlkWords( void *data_in, int32_t size_in, void +*data_out, int32_T size_out ); +
  +
Assembler: +
  +
move.l    size_out,-(sp)  ; Offset 14
+pea       data_out        ; Offset 10
+move.l    size_in,-(sp)   ; Offset  6
+pea       data_in         ; Offset  2
+move.w    #123,-(sp)      ; Offset  0
+trap      #14             ; Call XBIOS
+lea       $12(sp),sp      ; Correct stack
+
+ +
+ +

4.11.6 Dsp_DoBlock

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_DoBlock« - Data transfer to the DSP +
  +
Opcode: 96 +
  +
Syntax: void Dsp_DoBlock( int8_t *data_in, int32_t size_in, int8_t +*data_out, int32_t size_out ); +
  +
Description: The function copies size_in DSP-words from the buffer +data_in to the DSP. After all data has been transferred, the +procedure waits until the data has been processed. Then +size_out DSP-words are copied back into the buffer +data_out, irrespective of how much data is actually present. +If no data is to be sent, one has to set size_in to zero. The +same applies for the receipt; in that case size_out is +assigned zero. size_in and size_out are limited to 64 +kbyte. +
  +
Return value: The function does not return a result. +
  +
Availability: The function is available only on computers with the DSP-56001 +signal processor. +
  +
Group: DSP programming +
  +
See also: Binding   Dsp_BlkHandShake   Dsp_BlkUnpacked   Dsp_BlkWords   +Dsp_BlkBytes   Dsp_InStream   Dsp_OutStream   Dsp_IOStream   +Dsp_GetWordSize   Dsp_MultBlocks +
  + +
+ +

4.11.6.1 Bindings for Dsp_DoBlock

+ + + + + + +
C: #include <tos.h> +
  +
void Dsp_DoBlock( int8_t *data_in, int32_t size_in, int8_t +*data_out, int32_t size_out ); +
  +
Assembler: +
  +
move.l    size_out,-(sp)  ; Offset 14
+pea       data_out        ; Offset 10
+move.l    size_in,-(sp)   ; Offset  6
+pea       data_in         ; Offset  2
+move.w    #96,-(sp)       ; Offset  0
+trap      #14             ; Call XBIOS
+lea       $12(sp),sp      ; Correct stack
+
+ +
+ +

4.11.7 Dsp_ExecBoot

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_ExecBoot« - Load bootstrap program into the DSP. +
  +
Opcode: 110 +
  +
Syntax: void Dsp_ExecBoot( int8_t *codeptr, int32_t codesize, int16_t +ability ); +
  +
Description: The function Dsp_ExecBoot loads a bootstrap program into 512 +words of the internal DSP memory. Before loading, the DSP is +completely reset. The DSP program must be present in a binary format. +The parameter codeptr points to the start of the program data. +The length of the program is specified by the parameter +codesize (in DSP-words). ability identifies the +program. +
  +
Return value: The function does not return a result. +
  +
Availability: The function is available only on computers with the DSP-56001 +signal processor. +
  +
Group: DSP programming +
  +
See also: Binding   Dsp_Lock   Dsp_Unlock   Dsp_Available   Dsp_Reserve   +Dsp_LoadProg   Dsp_ExecProg   Dsp_LodToBinary +
  + +
+ +

4.11.7.1 Bindings for Dsp_ExecBoot

+ + + + + + +
C: #include <tos.h> +
  +
void Dsp_ExecBoot( int8_t *codeptr, int32_t codesize, int16_t +ability ); +
  +
Assembler: +
  +
move.w    ability,-(sp)  ; Offset 10
+move.l    codesize,-(sp) ; Offset  6
+pea       codeptr        ; Offset  2
+move.w    #110,-(sp)     ; Offset  0
+trap      #14            ; Call XBIOS
+lea       $C(sp),sp      ; Correct stack
+
+ +
+ +

4.11.8 Dsp_ExecProg

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_ExecProg« - Execute DSP program. +
  +
Opcode: 109 +
  +
Syntax: void Dsp_ExecProg( int8_t *codeptr, int32_t codesize, int16_t +ability ); +
  +
Description: The function Dsp_ExecProg transfers a DSP program stored in +binary format in memory at the location codeptr and length +codesize to the DSP and executes it. Its size may not exceed +the memory reserved by Dsp_Reserve. The parameter ability +identifies the program. +
  +
Return value: The function does not return a result. +
  +
Availability: The function is available only on computers with the DSP-56001 +signal processor. +
  +
Group: DSP programming +
  +
See also: Binding   Dsp_Lock   Dsp_Unlock   Dsp_Available   Dsp_Reserve   +Dsp_LoadProg   Dsp_ExecBoot   Dsp_LodToBinary +
  + +
+ +

4.11.8.1 Bindings for Dsp_ExecProg

+ + + + + + +
C: #include <tos.h> +
  +
void Dsp_ExecProg( int8_t *codeptr, int32_t codesize, int16_t +ability ); +
  +
Assembler: +
  +
move.w    ability,-(sp)  ; Offset 10
+move.l    codesize,-(sp) ; Offset  6
+pea       codeptr        ; Offset  2
+move.w    #109,-(sp)     ; Offset  0
+trap      #14            ; Call XBIOS
+lea       $C(sp),sp      ; Correct stack
+
+ +
+ +

4.11.9 Dsp_FlushSubroutines

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_FlushSubroutines« - Remove subroutines from the memory +of the DSP. +
  +
Opcode: 115 +
  +
Syntax: void Dsp_FlushSubroutines( void ); +
  +
Description: The function Dsp_FlushSubroutines removes all subroutines from +the DSP's memory, and so increases the amount of available free +memory. +
  +
Return value: The function does not return a result. +
  +
Availability: The function is available only on computers with the DSP-56001 +signal processor. +
  +
Group: DSP programming +
  +
See also: Binding   Dsp_LoadSubroutine   Dsp_InqSubrAbility   +Dsp_RunSubroutine +
  + +
+ +

4.11.9.1 Bindings for Dsp_FlushSubroutines

+ + + + + + +
C: #include <tos.h> +
  +
void Dsp_FlushSubroutines( void ); +
  +
Assembler: +
  +
move.w    #115,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

4.11.10 Dsp_GetProgAbility

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_GetProgAbility« - Request identification of a process. +
  +
Opcode: 114 +
  +
Syntax: int16_t Dsp_GetProgAbility( void ); +
  +
Description: The function Dsp_GetProgAbility assigns an identifier to a DSP +process, with which one can check whether the code belonging to the +process is already present in the DSP. +
  +
Return value: The function returns the identifier valid for the process. +
  +
Availability: The function is available only on computers with the DSP-56001 +signal processor. +
  +
Group: DSP programming +
  +
See also: Binding   Dsp_RequestUniqueAbility +
  + +
+ +

4.11.10.1 Bindings for Dsp_GetProgAbility

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Dsp_GetProgAbility( void ); +
  +
Assembler: +
  +
move.w    #114,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

4.11.11 Dsp_GetWordSize

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_GetWordSize« - Obtain the size of a DSP-word. +
  +
Opcode: 103 +
  +
Syntax: int16_t Dsp_GetWordSize( void ); +
  +
Description: The function Dsp_GetWordSize obtains the length, in bytes, of a +DSP-word. This function is required to dimension the buffers for data +transfer adequately. +
  +
Return value: The function returns the size of a DSP-word. +
  +
Availability: The function is available only on computers with the DSP-56001 +signal processor. +
  +
Group: DSP programming +
  +
See also: Binding   Dsp_DoBlock   Dsp_BlkUnpacked   Dsp_BlkHandShake   +Dsp_BlkWords   Dsp_BlkBytes   Dsp_InStream   Dsp_IOStream   +Dsp_OutStream   Dsp_MultBlocks +
  + +
+ +

4.11.11.1 Bindings for Dsp_GetWordSize

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Dsp_GetWordSize( void ); +
  +
Assembler: +
  +
move.w    #103,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

4.11.12 Dsp_Hf0

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_Hf0« - Set or clear bit 3 of the HSR. +
  +
Opcode: 119 +
  +
Syntax: int16_t Dsp_Hf0( int16_t flag ); +
  +
Description: The function Dsp_Hf0 obtains or resp. sets the value of bit 3 +of the HSR register. The parameter flag has the following +meaning: +
  +

+
+ + + + + + + + + + + + + + + + +
flagMeaning
 0Clear bit 3 of the HSR
 1Set bit 3 of the HSR
-1Leave bit 3 of the HSR unchanged
+
+ +
Return value: The function returns the value of bit 3 of the HSR. +
  +
Availability: The function is available only on computers with the DSP-56001 +signal processor. +
  +
Group: DSP programming +
  +
See also: Binding   Dsp_Hf1   Dsp_Hf2   Dsp_Hf3   Dsp_HStat +
  + +
+ +

4.11.12.1 Bindings for Dsp_Hf0

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Dsp_Hf0( int16_t flag ); +
  +
Assembler: +
  +
move.w    flag,-(sp)   ; Offset 2
+move.w    #119,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.11.13 Dsp_Hf1

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_Hf1« - Set or clear bit 4 of the HSR. +
  +
Opcode: 120 +
  +
Syntax: int16_t Dsp_Hf1( int16_t flag ); +
  +
Description: The function Dsp_Hf1 obtains or resp. sets the value of bit 4 +of the HSR register. The parameter flag has the following +meaning: +
  +

+
+ + + + + + + + + + + + + + + + +
flagMeaning
 0Clear bit 4 of the HSR
 1Set bit 4 of the HSR
-1Leave bit 4 of the HSR unchanged
+
+ +
Return value: The function returns the value of bit 4 of the HSR. +
  +
Availability: The function is available only on computers with the DSP-56001 +signal processor. +
  +
Group: DSP programming +
  +
See also: Binding   Dsp_Hf0   Dsp_Hf2   Dsp_Hf3   Dsp_HStat +
  + +
+ +

4.11.13.1 Bindings for Dsp_Hf1

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Dsp_Hf1( int16_t flag ); +
  +
Assembler: +
  +
move.w    flag,-(sp)   ; Offset 2
+move.w    #120,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.11.14 Dsp_Hf2

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_Hf2« - Inquire status of bit 3 of the HCR. +
  +
Opcode: 121 +
  +
Syntax: int16_t Dsp_Hf2( void ); +
  +
Description: The function Dsp_Hf2 inquires the current status of bit 3 of +the HCR register. +
  +
Return value: The function returns the value of bit 3 of the HCR. +
  +
Availability: The function is available only on computers with the DSP-56001 +signal processor. +
  +
Group: DSP programming +
  +
See also: Binding   Dsp_Hf0   Dsp_Hf1   Dsp_Hf3   Dsp_HStat +
  + +
+ +

4.11.14.1 Bindings for Dsp_Hf2

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Dsp_Hf2( void ); +
  +
Assembler: +
  +
move.w    #121,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

4.11.15 Dsp_Hf3

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_Hf3« - Inquire status of bit 4 of the HCR. +
  +
Opcode: 122 +
  +
Syntax: int16_t Dsp_Hf3( void ); +
  +
Description: The function Dsp_Hf3 inquires the current status of bit 4 of +the HCR register. +
  +
Return value: The function returns the value of bit 4 of the HCR. +
  +
Availability: The function is available only on computers with the DSP-56001 +signal processor. +
  +
Group: DSP programming +
  +
See also: Binding   Dsp_Hf0   Dsp_Hf1   Dsp_Hf2   Dsp_HStat +
  + +
+ +

4.11.15.1 Bindings for Dsp_Hf3

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Dsp_Hf3( void ); +
  +
Assembler: +
  +
move.w    #122,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

4.11.16 Dsp_HStat

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_HStat« - Inquire value of the ISR register +
  +
Opcode: 125 +
  +
Syntax: int8_t Dsp_HStat( void ); +
  +
Description: The function Dsp_HStat inquires the value of the ISR register. +This way one can check whether data can be received or sent to the ISR +register. +
  +
Return value: The function returns the value of the ISR register. +
  +
Availability: The function is available only on computers with the DSP-56001 +signal processor. +
  +
Group: DSP programming +
  +
See also: Binding   Dsp_Hf0   Dsp_Hf1   Dsp_Hf2   Dsp_Hf3 +
  + +
+ +

4.11.16.1 Bindings for Dsp_HStat

+ + + + + + +
C: #include <tos.h> +
  +
int8_t Dsp_HStat( void ); +
  +
Assembler: +
  +
move.w    #125,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

4.11.17 Dsp_InqSubrAbility

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_InqSubrAbility« - Inquire subroutine identifier +
  +
Opcode: 117 +
  +
Syntax: int16_t Dsp_InqSubrAbility( int16_t ability ); +
  +
Description: The function Dsp_InqSubrAbility inquires the identifier of the +subroutine with the functionality abilitiy. +
  +
Return value: The function returns the identifier of the subroutine. A return +value of 0 means that the corresponding subroutine is not present in +DSP memory; in that case the subroutine has to be installed with +Dsp_LoadSubroutine. +
  +
Availability: The function is available only on computers with the DSP-56001 +signal processor. +
  +
Group: DSP programming +
  +
See also: Binding   Dsp_RunSubroutine   Dsp_FlushSubroutines   +Dsp_LoadSubroutine +
  + +
+ +

4.11.17.1 Bindings for Dsp_InqSubrAbility

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Dsp_InqSubrAbility( int16_t ability ); +
  +
Assembler: +
  +
move.w    ability,-(sp)  ; Offset 2
+move.w    #117,-(sp)     ; Offset 0
+trap      #14            ; Call XBIOS
+addq.l    #4,sp          ; Correct stack
+
+ +
+ +

4.11.18 Dsp_InStream

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_InStream« - Data transfer to the DSP via an interrupt +handler +
  +
Opcode: 99 +
  +
Syntax: void Dsp_InStream( int8_t *data_in, int32_t block_size, int32_t +num_blocks, int32_t *blocks_done ); +
  +
Description: The function copies via a DSP interrupt handler +num_blocks data blocks with a size of block_size +DSP-words from the buffer data_in to the DSP. For each +interrupt one block will be transferred, irrespective of whether the +DSP is ready to receive or not. At the same time the counter +blocks_done, which keeps track of the number of blocks +transferred, will be incremented. As the data is transferred via an +interrupt, the procedure does not have to wait. Via +blocks_done the program can then determine whether the +transfer has been completed. +
  +
Return value: The function does not return a result. +
  +
Availability: The function is available only on computers with the DSP-56001 +signal processor. +
  +
Group: DSP programming +
  +
See also: Binding   Dsp_DoBlock   Dsp_BlkUnpacked   Dsp_BlkHandShake   +Dsp_BlkWords   Dsp_BlkBytes   Dsp_OutStream   Dsp_IOStream   +Dsp_GetWordSize   Dsp_SetVectors   Dsp_RemoveInterrupts   +Dsp_MultBlocks +
  + +
+ +

4.11.18.1 Bindings for Dsp_InStream

+ + + + + + +
C: #include <tos.h> +
  +
void Dsp_InStream( int8_t *data_in, int32_t block_size, int32_t +num_blocks, int32_t *blocks_done ); +
  +
Assembler: +
  +
pea       blocks_done       ; Offset 14
+move.l    num_blocks,-(sp)  ; Offset 10
+move.l    block_size,-(sp)  ; Offset  6
+pea       data_in           ; Offset  2
+move.w    #99,-(sp)         ; Offset  0
+trap      #14               ; Call XBIOS
+lea       $12(sp),sp        ; Correct stack
+
+ +
+ +

4.11.19 Dsp_IOStream

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_IOStream« - Data transfer from and to DSP via two +interrupts +
  +
Opcode: 101 +
  +
Syntax: void Dsp_IOStream( int8_t *data_in, int8_t *data_out, int32_t +block_insize, int32_t block_outsize, int32_t num_blocks, int32_t +*blocks_done ); +
  +
Description: The function sends and receives simultaneously via DSP +interrupt handling num_blocks data blocks with a size of +block_insize or block_outsize DSP-words from/to the +DSP. The sent data is taken from the buffer data_in, the +received data is stored in the buffer data_out. For each +interrupt one block is sent and one received (except for the first and +last interrupt). At the same time the counter blocks_done, +which keeps track of the number of blocks transferred, will be +incremented. As the data is transferred via an interrupt, the function +does not have to wait. Via blocks_done the program can then +determine whether the transfer has been completed. +
  +
Return value: The function does not return a result. +
  +
Availability: The function is available only on computers with the DSP-56001 +signal processor. +
  +
Group: DSP programming +
  +
See also: Binding   Dsp_DoBlock   Dsp_BlkUnpacked   Dsp_BlkHandShake   +Dsp_BlkWords   Dsp_BlkBytes   Dsp_InStream   Dsp_OutStream   +Dsp_GetWordSize   Dsp_SetVectors   Dsp_RemoveInterrupts   +Dsp_MultBlocks +
  + +
+ +

4.11.19.1 Bindings for Dsp_IOStream

+ + + + + + +
C: #include <tos.h> +
  +
void Dsp_IOStream( int8_t *data_in, int8_t *data_out, int32_t +block_insize, int32_t block_outsize, int32_t num_blocks, int32_t +*blocks_done ); +
  +
Assembler: +
  +
pea       blocks_done          ; Offset 22
+move.l    num_blocks,-(sp)     ; Offset 18
+move.l    block_outsize,-(sp)  ; Offset 14
+move.l    block_insize,-(sp)   ; Offset 10
+pea       data_out             ; Offset  6
+pea       data_in              ; Offset  2
+move.w    #101,-(sp)           ; Offset  0
+trap      #14                  ; Call XBIOS
+lea       $1A(sp),sp           ; Correct stack
+
+ +
+ +

4.11.20 Dsp_LoadProg

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_LoadProg« - Load and execute DSP program +
  +
Opcode: 108 +
  +
Syntax: int16_t Dsp_LoadProg( int8_t *file, int16_t ability, int8_t +*buffer ); +
  +
Description: The function Dsp_LoadProg loads the DSP program with the name +file from disk. The program must be in the .LOD format and +must not exceed the memory space reserved by Dsp_Reserve. The +parameter ability identifies the program. buffer +points to a memory block where the DSP can place the binary code it +generates for the time being. The size of the memory block can be +calculated with the formula: +
  +
DSP-wordsize *
+( Number of program and data words in the LOD file +
+( DSP-wordsize * Number of blocks in the .LOD file ))
+
+
After this the program will be executed. +
  +
Return value: The function returns the value 0 if successful, or -1 in case +of error. +
  +
Availability: The function is available only on computers with the DSP-56001 +signal processor. +
  +
Group: DSP programming +
  +
See also: Binding   Dsp_Lock   Dsp_Unlock   Dsp_Available   Dsp_Reserve   +Dsp_ExecProg   Dsp_ExecBoot   Dsp_LodToBinary +
  + +
+ +

4.11.20.1 Bindings for Dsp_LoadProg

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Dsp_LoadProg( int8_t *file, int16_t ability, int8_t +*buffer ); +
  +
Assembler: +
  +
pea       buffer         ; Offset 8
+move.w    ability,-(sp)  ; Offset 6
+pea       file           ; Offset 2
+move.w    #108,-(sp)     ; Offset 0
+trap      #14            ; Call XBIOS
+lea       $C(sp),sp      ; Correct stack
+
+ +
+ +

4.11.21 Dsp_LoadSubroutine

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_LoadSubroutine« - Install a subroutine in memory of the +DSP +
  +
Opcode: 116 +
  +
Syntax: int16_t Dsp_LoadSubroutine( int8_t *codeptr, int32_t codesize, +int16_t ability ); +
  +
Description: The function Dsp_LoadSubroutine installs the DSP binary +subroutine from the buffer codeptr in the DSP's memory. The +subroutine has a size of codesize DSP- words and has the +identifier ability. The subroutine remains resident in DSP +memory until there is no more room for new subroutines and it is +displaced, or the function Dsp_FlushSubroutines is called. +
  +
Return value: The function returns 0 in case of error. A positive value +denotes the handle assigned to the subroutine, which may be called +with Dsp_RunSubroutine. +
  +
Availability: The function is available only on computers with the DSP-56001 +signal processor. +
  +
Group: DSP programming +
  +
See also: Binding   Dsp_RunSubroutine   Dsp_FlushSubroutines   +Dsp_InqSubrAbility +
  + +
+ +

4.11.21.1 Bindings for Dsp_LoadSubroutine

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Dsp_LoadSubroutine( int8_t *codeptr, int32_t codesize, +int16_t ability ); +
  +
Assembler: +
  +
move.w    ability,-(sp)   ; Offset 10
+move.l    codesize,-(sp)  ; Offset  6
+pea       codeptr         ; Offset  2
+move.w    #116,-(sp)      ; Offset  0
+trap      #14             ; Call XBIOS
+lea       $C(sp),sp       ; Correct stack
+
+ +
+ +

4.11.22 Dsp_Lock

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_Lock« - Inquire availability of the DSP +
  +
Opcode: 104 +
  +
Syntax: int16_t Dsp_Lock( void ); +
  +
Description: The function Dsp_Lock inquires whether the DSP is available for +calling applications and has not been blocked by something else. +
  +
Return value: The function returns the value -1 if the DSP is being used +already by another process. A return value of 0 on the other hand +signifies the availability of the DSP and blocks this simultaneously +for others, until a call of Dsp_Unlock is received. +
  +
Availability: The function is available only on computers with the DSP-56001 +signal processor. +
  +
Group: DSP programming +
  +
See also: Binding   Dsp_Unlock   Dsp_Available   Dsp_Reserve   +Dsp_LoadProg   Dsp_ExecProg   Dsp_ExecBoot +
  + +
+ +

4.11.22.1 Bindings for Dsp_Lock

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Dsp_Lock( void ); +
  +
Assembler: +
  +
move.w    #104,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

4.11.23 Dsp_LodToBinary

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_LodToBinary« - Conversion of a file from the LOD to the +binary format +
  +
Opcode: 111 +
  +
Syntax: int32_t Dsp_LodToBinary( int8_t *file, int8_t *codeptr ); +
  +
Description: The function Dsp_LodToBinary converts the (ASCII) contents of +the .LOD file with the name file to a binary format. The DSP +program created in this way is stored at the address codeptr. +This block of memory must be dimensioned large enough to take it. +After this the program can be executed with Dsp_ExecProg or +Dsp_ExecBoot. +
  +
Return value: The function returns the size of the resulting program in +DSP-words if successful, or a negative value in case of error. +
  +
Availability: The function is available only on computers with the DSP-56001 +signal processor. +
  +
Group: DSP programming +
  +
See also: Binding   Dsp_Lock   Dsp_Unlock   Dsp_Available   Dsp_Reserve   +Dsp_LoadProg   Dsp_ExecBoot   Dsp_ExecProg +
  + +
+ +

4.11.23.1 Bindings for Dsp_LodToBinary

+ + + + + + +
C: #include <tos.h> +
  +
int32_t Dsp_LodToBinary( int8_t *file, int8_t *codeptr ); +
  +
Assembler: +
  +
pea       codeptr      ; Offset 6
+pea       file         ; Offset 2
+move.w    #111,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+lea       $A(sp),sp    ; Correct stack
+
+ +
+ +

4.11.24 Dsp_MultBlocks

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_MultBlocks« - Data transfer of multiple blocks from and +to the DSP +
  +
Opcode: 127 +
  +
Syntax: void Dsp_MultBlocks( int32_t numsend, int32_t numreceive, +DSPBLOCK *sendblocks, DSPBLOCK *receiveblocks ); +
  +
Description: The function Dsp_MultBlocks sends and receives multiple blocks +of DSP data of varying size from and to the DSP. numsend is +the number of blocks to be sent and numreceive the number to +be received. sendblocks and receiveblocks are pointers +to arrays that describe the buffers and blocks. +
  +
Return value: The function does not return a result. +
  +
Availability: The function is available only on computers with the DSP-56001 +signal processor. +
  +
Group: DSP programming +
  +
See also: Binding   Dsp_DoBlock   Dsp_BlkUnpacked   Dsp_BlkHandShake   +Dsp_BlkWords   Dsp_InStream   Dsp_OutStream   Dsp_IOStream   +Dsp_GetWordSize   Dsp_BlkBytes +
  + +
+ +

4.11.24.1 Bindings for Dsp_MultBlocks

+ + + + + + +
C: #include <tos.h> +
  +
void Dsp_MultBlocks( int32_t numsend, int32_t numreceive, +DSPBLOCK *sendblocks, DSPBLOCK *receiveblocks ); +
  +
Assembler: +
  +
pea       receiveblocks     ; Offset 14
+pea       sendblocks        ; Offset 10
+move.l    numreceive,-(sp)  ; Offset  6
+move.l    numsend,-(sp)     ; Offset  2
+move.w    #127,-(sp)        ; Offset  0
+trap      #14               ; Call XBIOS
+lea       $12(sp),sp        ; Correct stack
+
+ +
+ +

4.11.25 Dsp_OutStream

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_OutStream« - Data transfer from DSP via an interrupt +handler to a given buffer +
  +
Opcode: 100 +
  +
Syntax: void Dsp_OutStream( int8_t *data_out, int32_t block_size, +int32_t num_blocks, int32_t *blocks_done ); +
  +
Description: The function copies via a DSP interrupt handler +num_blocks data blocks with a size of block_size +DSP-words from the DSP into the buffer data_out. For each +interrupt one block will be transferred. At the same time the counter +blocks_done, which keeps track of the number of blocks +transferred, will be incremen- ted. As the data is transferred via an +interrupt, the function does not have to wait. Via blocks_done +the program can then determine whether the transfer has been +completed. +
  +
Return value: The function does not return a result. +
  +
Availability: The function is available only on computers with the DSP-56001 +signal processor. +
  +
Group: DSP programming +
  +
See also: Binding   Dsp_DoBlock   Dsp_BlkUnpacked   Dsp_BlkHandShake   +Dsp_BlkWords   Dsp_BlkBytes   Dsp_InStream   Dsp_IOStream   +Dsp_GetWordSize   Dsp_SetVectors   Dsp_RemoveInterrupts   +Dsp_MultBlocks +
  + +
+ +

4.11.25.1 Bindings for Dsp_OutStream

+ + + + + + +
C: #include <tos.h> +
  +
void Dsp_OutStream( int8_t *data_out, int32_t block_size, +int32_t num_blocks, int32_t *blocks_done ); +
  +
Assembler: +
  +
pea       blocks_done       ; Offset 14
+move.l    num_blocks,-(sp)  ; Offset 10
+move.l    block_size,-(sp)  ; Offset  6
+pea       data_out          ; Offset  2
+move.w    #100,-(sp)        ; Offset  0
+trap      #14               ; Call XBIOS
+lea       $12(sp),sp        ; Correct stack
+
+ +
+ +

4.11.26 Dsp_RemoveInterrupts

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_RemoveInterrupts« - Turn off generation of DSP +interrupts +
  +
Opcode: 102 +
  +
Syntax: void Dsp_RemoveInterrupts( int16_t mask ); +
  +
Description: The function Dsp_RemoveInterrupts turns off the generation of +DSP interrupts. The parameter mask determines which interrupts +are affected: +
  + + + + + + + + + + + + +
mask Meaning +
  +
1 No interrupts for sending data through the DSP +
  +
2 No interrupts for receiving data through the DSP +
  +
3 No interrupts for sending or receiving data through the DSP. +
  + +
+ +
The function also removes routines that were installed with +Dsp_SetVectors. +
  +
Return value: The function does not return a result. +
  +
Availability: The function is available only on computers with the DSP-56001 +signal processor. +
  +
Group: DSP programming +
  +
See also: Binding   Dsp_InStream   Dsp_OutStream   Dsp_IOStream   +Dsp_SetVectors +
  + +
+ +

4.11.26.1 Bindings for Dsp_RemoveInterrupts

+ + + + + + +
C: #include <tos.h> +
  +
void Dsp_RemoveInterrupts( int16_t mask ); +
  +
Assembler: +
  +
move.w    mask,-(sp)   ; Offset 2
+move.w    #102,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.11.27 Dsp_RequestUniqueAbility

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_RequestUniqueAbility« - Generate an identifier for a +process +
  +
Opcode: 113 +
  +
Syntax: int16_t Dsp_RequestUniqueAbility( void ); +
  +
Description: The function Dsp_RequestUniqueAbility assigns to a DSP process +a random unique identifier (also called ability code) which is valid +for the run-time of the system. With it one can determine whether the +program code belonging to the process is already resident in the DSP. +
  +
Return value: The function returns the created identifier/ability code. +
  +
Availability: The function is available only on computers with the DSP-56001 +signal processor. +
  +
Group: DSP programming +
  +
See also: Binding   Dsp_GetProgAbility +
  + +
+ +

4.11.27.1 Bindings for Dsp_RequestUniqueAbility

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Dsp_RequestUniqueAbility( void ); +
  +
Assembler: +
  +
move.w    #113,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

4.11.28 Dsp_Reserve

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_Reserve« - Reserve DSP memory for use by a program +
  +
Opcode: 107 +
  +
Syntax: int16_t Dsp_Reserve( int32_t xreserve, int32_t yreserve ); +
  +
Description: The function Dsp_Reserve reserves xreserve words of +X-memory and yreserve words of Y-memory space. The memory +request must include all program and data space, and may not exceed +the amount of available memory. This function is necessary to prevent +DSP processes being overwritten by DSP subroutines. The reservation +remains active up to the next call of Dsp_Reserve. +
  +
Return value: The function returns the value 0 if memory reservation was +successful, or -1 if not enough DSP memory was available (or some +other error). +
  +
Availability: The function is available only on computers with the DSP-56001 +signal processor. +
  +
Group: DSP programming +
  +
See also: Binding   Dsp_Lock   Dsp_Unlock   Dsp_Available   Dsp_LoadProg   +Dsp_ExecProg   Dsp_ExecBoot +
  + +
+ +

4.11.28.1 Bindings for Dsp_Reserve

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Dsp_Reserve( int32_t xreserve, int32_t yreserve ); +
  +
Assembler: +
  +
move.l    yreserve,-(sp)  ; Offset 6
+move.l    xreserve,-(sp)  ; Offset 2
+move.w    #107,-(sp)      ; Offset 0
+trap      #14             ; Call XBIOS
+lea       $A(sp),sp       ; Correct stack
+
+ +
+ +

4.11.29 Dsp_RunSubroutine

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »DspRunSubroutine« - Start execution of a subroutine +
  +
Opcode: 118 +
  +
Syntax: int16_t Dsp_RunSubroutine( int16_t handle ); +
  +
Description: The function Dsp_RunSubroutine starts execution of a program +with the identifier handle. The identifier for a subroutine +can be found by using Dsp_InqSubrAbility or Dsp_LoadSubroutine. +
  +
Return value: The function returns the value 0 if successful, or a negative +number in case of failure. +
  +
Availability: The function is available only on computers with the DSP-56001 +signal processor. +
  +
Group: DSP programming +
  +
See also: Binding   Dsp_InqSubrAbility   Dsp_FlushSubroutines   +Dsp_LoadSubroutine +
  + +
+ +

4.11.29.1 Bindings for Dsp_RunSubroutine

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Dsp_RunSubroutine( int16_t handle ); +
  +
Assembler: +
  +
move.w    handle,-(sp)  ; Offset 2
+move.w    #118,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+addq.l    #4,sp         ; Correct stack
+
+ +
+ +

4.11.30 Dsp_SetVectors

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_SetVectors« - Installation of a custom transfer routine +
  +
Opcode: 126 +
  +
Syntax: void Dsp_SetVectors( void (*receiver)(), int32_t +(*transmitter)() ); +
  +
Description: The function Dsp_SetVectors installs routines that are called +when the DSP wants to transfer data via interrupt handlers. +receiver is a pointer to a routine that is called after the +DSP has sent data, and transmitter a pointer to a routine that +is called before the DSP receives data. The reception routine +receiver is passed a LONG that was sent by the DSP as a +parameter on the stack. The sender routine transmitter passes +a LONG to the DSP in register D0. This must be non-zero so that it (or +rather the lowest three bytes) are transferred to the DSP. Both +routines are terminated by the assembler command RTS. +
  +
If a 0 is passed for receiver or transmitter, +then the corresponding interrupt will be blocked. To remove a routine, +one has to call Dsp_RemoveInterrupts. +
  +
Return value: The function does not return a result. +
  +
Availability: The function is available only on computers with the DSP-56001 +signal processor. +
  +
Group: DSP programming +
  +
See also: Binding   Dsp_InStream   Dsp_OutStream   Dsp_IOStream   +Dsp_RemoveInterrupts +
  + +
+ +

4.11.30.1 Bindings for Dsp_SetVectors

+ + + + + + +
C: #include <tos.h> +
  +
void Dsp_SetVectors( void (*receiver)(), int32_t +(*transmitter)() ); +
  +
Assembler: +
  +
pea       transmitter  ; Offset 6
+pea       receiver     ; Offset 2
+move.w    #126,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+lea       $A(sp),sp    ; Correct stack
+
+ +
+ +

4.11.31 Dsp_TriggerHC

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_TriggerHC« - Execute host command set aside for DSP +programs +
  +
Opcode: 112 +
  +
Syntax: void Dsp_TriggerHC( int16_t vector ); +
  +
Description: The function Dsp_TriggerHC executes vector vector. Only +the two vectors $13 and $14 are available for free use by DSP +programs. +
  +
Return value: The function does not return a result. +
  +
Availability: The function is available only on computers with the DSP-56001 +signal processor. +
  +
Group: DSP programming +
  +
See also: Binding +
  + +
+ +

4.11.31.1 Bindings for Dsp_TriggerHC

+ + + + + + +
C: #include <tos.h> +
  +
void Dsp_TriggerHC( int16_t vector ); +
  +
Assembler: +
  +
move.w    vector,-(sp)  ; Offset 2
+move.w    #112,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+addq.l    #4,sp         ; Correct stack
+
+ +
+ +

4.11.32 Dsp_Unlock

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dsp_Unlock« - Release DSP for other processes +
  +
Opcode: 105 +
  +
Syntax: void Dsp_Unlock( void ); +
  +
Description: The function Dsp_Unlock releases the DSP for other processes. +
  +
Return value: The function does not return a result. +
  +
Availability: The function is available only on computers with the DSP-56001 +signal processor. +
  +
Group: DSP programming +
  +
See also: Binding   Dsp_Lock   Dsp_Available   Dsp_Reserve   Dsp_LoadProgDsp_ExecProg   Dsp_ExecBoot +
  + +
+ +

4.11.32.1 Bindings for Dsp_Unlock

+ + + + + + +
C: #include <tos.h> +
  +
void Dsp_Unlock( void ); +
  +
Assembler: +
  +
move.w    #105,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +
+ +Home +XBIOSXBIOS +Printer functionsPrinter functions +Hatari DHS XBIOS extensionHatari DHS XBIOS extension + + diff --git a/en/xbios_errors.html b/en/xbios_errors.html new file mode 100644 index 000000000..e58c1461b --- /dev/null +++ b/en/xbios_errors.html @@ -0,0 +1,40 @@ + + + + + +The documentation for TOS: XBIOS error-messages + + + + + + + + + +Home +XBIOSXBIOS +MetaDOSMetaDOS +xbios-trapxbios-trap + +
+ +

4.3 XBIOS error-messages

+

Errors are reported by the XBIOS as negative values (as for +BIOS). +

+

For the individual error-messages see BIOS error-messages. +

+

See also: +
BIOS error-messages   Error-messages in MagiC   GEMDOS error-messages +

+
+ +Home +XBIOSXBIOS +MetaDOSMetaDOS +xbios-trapxbios-trap + + diff --git a/en/xbios_functions.html b/en/xbios_functions.html new file mode 100644 index 000000000..3eab1064c --- /dev/null +++ b/en/xbios_functions.html @@ -0,0 +1,1966 @@ + + + + + +The documentation for TOS: XBIOS function list + + + + + + + + + +Home +XBIOSXBIOS +VIDIX XBIOS extensionVIDIX XBIOS extension +XBIOS StructuresXBIOS Structures + +
+ +

4.23 XBIOS function list

+

The list below is a synopsis for all XBIOS functions, sorted by +number: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DecHexName of functionTOSothers
   00x00InitmouseTOS
   10x01SsbrkTOS
   20x02PhysbaseTOS
   30x03LogbaseTOS
   40x04GetrezTOS
   50x05SetscreenTOS
   50x05VsetScreenFalcon-TOS
   60x06SetpaletteTOS
   70x07SetcolorTOS
   80x08FloprdTOS
   90x09FlopwrTOS
  100x0AFlopfmtTOS
110x0BDbmsg Atari Debugger
  120x0CMidiwsTOS
  130x0DMfpintTOS
  140x0EIorecTOS
  150x0FRsconfTOS
  160x10KeytblTOS
  170x11RandomTOS
  180x12ProtobtTOS
  190x13FlopverTOS
  200x14ScrdmpTOS
  210x15CursconfTOS
  220x16SettimeTOS
  230x17GettimeTOS
  240x18BioskeysTOS
  250x19IkbdwsTOS
  260x1AJdisintTOS
  270x1BJenabintTOS
  280x1CGiaccessTOS
  290x1DOffgibitTOS
  300x1EOngibitTOS
  310x1FXbtimerTOS
  320x20DosoundTOS
  330x21SetprtTOS
  340x22KbdvbaseTOS
  350x23KbrateTOS
  360x24PrtblkTOS
  370x25VsyncTOS
  380x26SupexecTOS
  390x27PuntaesTOS
  410x29FloprateTOS 1.04
  420x2ADMAreadTOS
  430x2BDMAwriteTOS
  430x2BJanus Janus
  440x2CBconmapTOS 2
  460x2ENVMaccessTOS 3
470x2FWaketimeTOS 2.06, ST-Book
  480x30MetainitMetaDOS
  490x31MetaopenMetaDOS
  500x32MetacloseMetaDOS
  510x33MetareadMetaDOS
  520x34MetawriteMetaDOS
530x35MetaseekMetaDOS
  540x36MetastatusMetaDOS
  550x37MetaioctlMetaDOS
560x38  MetaDOS
570x39  MetaDOS
580x3A  MetaDOS
  590x3BMetastartaudioMetaDOS
  600x3CMetastopaudioMetaDOS
  610x3DMetasetsongtimeMetaDOS
  620x3EMetagettocMetaDOS
  630x3FMetadiscinfoMetaDOS
  640x40BlitmodeTOS
650x41Vread CENTScreen
660x42Vwrite CENTScreen
670x43Vattrib CENTScreen
680x44Vcreate CENTScreen
690x45Vdelete CENTScreen
700x46Vfirst CENTScreen
710x47Vnext CENTScreen
720x48Vvalid CENTScreen
730x49Vload CENTScreen
740x4AVsave CENTScreen
750x4BVopen CENTScreen
760x4CVclose CENTScreen
770x4DVscroll CENTScreen
780x4EVoffset CENTScreen
790x4FVseek CENTScreen
  800x50EsetShiftTOS
800x50Vlock CENTScreen
  810x51EgetShiftTOS
810x51SetMon CENTScreen
  820x52EsetBankTOS
820x52MultiMon CENTScreen
  830x53EsetColorTOS
830x53SizeComp CENTScreen
  840x54EsetPaletteTOS
840x54Vsize CENTScreen
840x54Oscanis OverScan (old; new 0x1068)
  850x55EgetPaletteTOS
850x55Oscantab OverScan (old; new 0x1069)
  860x56EsetGrayTOS
860x56Oscanphy OverScan (old; new 0x106A)
  870x57EsetSmearTOS
870x57Oscanscr OverScan (old; new 0x106B)
  880x58VsetModeFalcon-TOS
880x58Oscanvb OverScan (old; new 0x106C)
  890x59mon_type / VgetMonitorFalcon-TOS
890x59Oscanpatch OverScan (old; new 0x106D)
  900x5AVsetSyncFalcon-TOS
900x5AOscanswitch OverScan (old; new 0x106E)
  910x5BVgetSizeFalcon-TOS
  920x5CVsetVarsFalcon-TOS
  930x5DVsetRGBFalcon-TOS
  940x5EVgetRGBFalcon-TOS
950x5FValidMode / VcheckModeFalcon-TOS, MilanTOS
  960x60Dsp_DoBlockFalcon-TOS
  970x61Dsp_BlkHandShakeFalcon-TOS
  980x62Dsp_BlkUnpackedFalcon-TOS
  990x63Dsp_InStreamFalcon-TOS
1000x64Init_Screen xVT52; ST-Computer 1988-04
 1000x64Dsp_OutStreamFalcon-TOS
 1010x65Dsp_IOStreamFalcon-TOS
 1020x66Dsp_RemoveInterruptsFalcon-TOS
 1030x67Dsp_GetWordSizeFalcon-TOS
 1040x68Dsp_LockFalcon-TOS
 1050x69Dsp_UnlockFalcon-TOS
 1060x6ADsp_AvailableFalcon-TOS
 1070x6BDsp_ReserveFalcon-TOS
 1080x6CDsp_LoadProgFalcon-TOS
 1090x6DDsp_ExecProgFalcon-TOS
 1100x6EDsp_ExecBootFalcon-TOS
 1110x6FDsp_LodToBinaryFalcon-TOS
 1120x70Dsp_TriggerHCFalcon-TOS
 1130x71Dsp_RequestUniqueAbilityFalcon-TOS
 1140x72Dsp_GetProgAbilityFalcon-TOS
 1150x73Dsp_FlushSubroutinesFalcon-TOS
 1160x74Dsp_LoadSubroutineFalcon-TOS
 1170x75Dsp_InqSubrAbilityFalcon-TOS
 1180x76Dsp_RunSubroutineFalcon-TOS
 1190x77Dsp_Hf0Falcon-TOS
 1200x78Dsp_Hf1Falcon-TOS
 1210x79Dsp_Hf2Falcon-TOS
 1220x7ADsp_Hf3Falcon-TOS
 1230x7BDsp_BlkWordsFalcon-TOS
 1240x7CDsp_BlkBytesFalcon-TOS
 1250x7DDsp_HStatFalcon-TOS
 1260x7EDsp_SetVectorsFalcon-TOS
 1270x7FDsp_MultBlocksFalcon-TOS
 1280x80locksndFalcon-TOS
 1290x81unlocksndFalcon-TOS
 1300x82soundcmdFalcon-TOS
 1300x82NSoundcmdMilanBlaster
 1310x83setbufferFalcon-TOS
 1320x84setmodeFalcon-TOS
 1330x85settracksFalcon-TOS
 1340x86setmontracksFalcon-TOS
 1350x87setinterruptFalcon-TOS
 1360x88buffoperFalcon-TOS
 1370x89dsptristateFalcon-TOS
 1380x8AgpioFalcon-TOS
 1390x8BdevconnectFalcon-TOS
 1400x8CsndstatusFalcon-TOS
 1410x8DbuffptrFalcon-TOS
 1500x96VsetMaskTOS
 1590xBFVideoCtrlMilan
 1600xA0CacheCtrlMilan
 1610xA1WdgCtrlMilan
 1620xA2ExtRsConfMilan
 1650xA5WavePlaySAM
 1940xC2GetScreenDescriptor Crazy-Dots
 1950xC3ResetScreen Crazy-Dots
 1960xC4GetNumberofPModes Crazy-Dots
 1970xC5GetPMode Crazy-Dots
 1980xC6ReadMode Crazy-Dots
 1990xC7CopyModeToActiveMode Crazy-Dots
 2000xC8ActiveModeNumber Crazy-Dots
 2010xC9GetActiveModeDesc Crazy-Dots
 2020xCAGetRegisterbase Crazy-Dots
 2030xCBGetFeatures Crazy-Dots
 2040xCCGetActiveFeatures Crazy-Dots
 2490xF9CPUFreqHatari DHS version only
 2500xFARegistersHatari DHS version only
 2510xFBDebugUIHatari DHS version only
 2520xFCCounterReadHatari DHS version only
 2530xFDCounterStartHatari DHS version only
 2540xFEDebugHatari DHS version only
 2550xFFHatariOptionHatari DHS version only
 2990x12BInstall PCI Bios ct60
 3000x12Cfind_pci_devicePCI-BIOS V2.00
 3010x12Dfind_pci_classcodePCI-BIOS V2.00
 3020x12Eread_config_bytePCI-BIOS
 3030x12Fread_config_wordPCI-BIOS
 3040x130read_config_longwordPCI-BIOS
 3050x131fast_read_config_bytePCI-BIOS
 3060x132fast_read_config_wordPCI-BIOS
 3070x133fast_read_config_longwordPCI-BIOS
 3080x134write_config_bytePCI-BIOS
 3090x135write_config_wordPCI-BIOS
 3100x136write_config_longwordPCI-BIOS
 3110x137hook_interruptPCI-BIOS
 3120x138unhook_interruptPCI-BIOS
 3130x139special_cyclePCI-BIOS
 3140x13Aget_routingPCI-BIOS
 3150x13Bset_interruptPCI-BIOS
 3160x13Cget_resourcePCI-BIOS
 3170x13Dget_card_usedPCI-BIOS
 3180x13Eset_card_usedPCI-BIOS
 3190x13Fread_mem_bytePCI-BIOS
 3200x140read_mem_wordPCI-BIOS
 3210x141read_mem_longwordPCI-BIOS
 3220x142fast_read_mem_bytePCI-BIOS
 3230x143fast_read_mem_wordPCI-BIOS
 3240x144fast_read_mem_longwordPCI-BIOS
 3250x145write_mem_bytePCI-BIOS
 3260x146write_mem_wordPCI-BIOS
 3270x147write_mem_longwordPCI-BIOS
 3280x148read_io_bytePCI-BIOS
 3290x149read_io_wordPCI-BIOS
 3300x14Aread_io_longwordPCI-BIOS
 3310x14Bfast_read_io_bytePCI-BIOS
 3320x14Cfast_read_io_wordPCI-BIOS
 3330x14Dfast_read_io_longwordPCI-BIOS
 3340x14Ewrite_io_bytePCI-BIOS
 3350x14Fwrite_io_wordPCI-BIOS
 3360x150write_io_longwordPCI-BIOS
 3370x151get_machine_idPCI-BIOS
 3380x152get_pagesizePCI-BIOS
 3390x153virt_to_busPCI-BIOS
 3400x154bus_to_virtPCI-BIOS
 3410x155virt_to_physPCI-BIOS
 3420x156phys_to_virtPCI-BIOS
 3500x15EDma_setbuffer ct60
 3510x15FDma_buffoper ct60
 3520x160Read_mailbox ct60
 3530x161Write_mailbox ct60
 4000x190vdxGetVersion ct60
 4010x191vdxProbe ct60
 4020x192vdxInit ct60
 4030x193vdxDestroy ct60
 4040x194vdxGetCapability ct60
 4050x195vdxQueryFourcc ct60
 4060x196vdxConfigPlayback ct60
 4070x197vdxPlaybackOn ct60
 4080x198vdxPlaybackOff ct60
 4090x199vdxPlaybackFrameSelect ct60
 4100x19AvdxGetGrKeys ct60
 4110x19BvdxSetGrKeys ct60
 4120x19CvdxPlaybackGetEq ct60
 4130x19DvdxPlaybackSetEq ct60
 4140x19EvdxPlaybackGetDeint ct60
 4150x19FvdxPlaybackSetDeint ct60
 4160x1A0vdxPlaybackCopyFrame ct60
 4170x1A1vdxQueryDMAStatus ct60
 4200x1A4InitVideo ct60
 5000x1F4StarTrack SWE
 5550x22BTrapper Trapper
31780x0c6asame as ct60_read_core_temperature ct60
31790x0c6bsame as ct60_rw_parameter ct60
31800x0c6csame as ct60_cache ct60
31810x0c6dsame as ct60_flush_cache ct60
31820x0c6esame as ct60_vmalloc ct60
42000x1068Oscanis OverScan
42010x1069Oscantab OverScan
42020x106AOscanphy OverScan
42030x106BOscanscr OverScan
42040x106COscanvb OverScan
42050x106DOscanpatch OverScan
42060x106EOscanswitch OverScan
172260x434ACJar Cookie Jar Manager
310000x7918CHECKinst MATRIX MatGraph - TCxx
310010x7919GETscreen MATRIX MatGraph - TCxx
310020x791AGETboard MATRIX MatGraph - TCxx
320000x7D00xbios(32000) MATRIX MatScreen - Cxx
320010x7D01xbios(32001) MATRIX MatScreen - Cxx
320020x7D02xbios(32002) MATRIX MatScreen - Cxx
506980xC60Act60_read_core_temperature ct60
506990xC60Bct60_rw_parameter ct60
507000xC60Cct60_cache ct60
507010xC60Dct60_flush_cache ct60
507020xC60Ect60_vmalloc ct60
 0x53435349SCSIBios SCSIBios
+
+ +

See also: XBIOS   GEMDOS function list   BIOS function list +

+
+ +Home +XBIOSXBIOS +VIDIX XBIOS extensionVIDIX XBIOS extension +XBIOS StructuresXBIOS Structures + + diff --git a/en/xbios_interface.html b/en/xbios_interface.html new file mode 100644 index 000000000..e0b99b493 --- /dev/null +++ b/en/xbios_interface.html @@ -0,0 +1,1663 @@ + + + + + +The documentation for TOS: Interface programming + + + + + + + + + +Home +XBIOSXBIOS +PCI-BIOSPCI-BIOS +Sound routinesSound routines + +
+ +

4.18 Interface programming

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Bconmap Selects a serial port. +
Dosound Programs sound generator. +
ExtRsConf Configures the RS-232/RS-485 port. +
Giaccess Reads from and writes to the GI sound chip. +
Ikbdws Programs the keyboard chip. +
Iorec Obtains address of the input/output buffer of RS-232, keyboard +chip or MIDI port serial device. +
Kbdvbase Obtains buffer and interrupt vectors for mouse, MIDI and +intelligent keyboard. +
Mfpint Initializes the multi-function peripheral chip interrupt. +
Midiws Writes string of characters to the MIDI port. +
Offgibit Clears a bit in port A register of the GI sound chip. +
Ongibit Sets a bit in port A register of the GI sound chip. +
Rsconf Configures the RS-232 port. + +
+ +

See also: Interrupt functions +

+

4.18.1 Bconmap

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Select serial port« - Select a default port. +
  +
Opcode: 44 +
  +
Syntax: int32_t Bconmap( int16_t devno ); +
  +
Description: The XBIOS routine Bconmap selects one of the serial ports for +Bios output. In addition one can inquire for a pointer to the BCONMAP +structure, with which one can query for the highest BIOS device +number and also install new device drivers. devno can assume +the following values: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
devnoMeaning
-402Remove device / RSVF list (HSMODA)
-401Append entry (HSMODA)
-400Overwrite selected entry (HSMODA)
-2Return pointer to BCONMAP structure
-1Only inquire current channel
0Test whether Bconmap is present
6ST-compatible RS-232 port (U:\dev\modem1)
7SCC Channel B (U:\dev\modem2)
8TTMFP RS-232 port (U:\dev\serial1)
9SCC Channel A (U:\dev\serial2)
>10Own driver
+
+ +
The function affects both the BIOS vector table in the system variables, +as well as the behaviour of the functions Rsconf and Iorec. +
  +
Note: In TOS 4.04, and when no TT-MFP is present, SCC +Channel A will be device #8. +
  +
HSMODA +
These functions are only present if the HSMODA package is installed. +
  +
int32_t Bconmap((int16_t)-400, (int16_t)dev_nr, +(int32_t)ptr_to_6_longs) +
The constant MAPT_OVE is defined as -400. This function serves for +overwriting already existing MAPTAB entries. dev_nr is a +device number from 6 upwards that already has to exist in MAPTAB, +otherwise the error-code -15 EUNDEV will be returned. +ptr_to_6_longs points to a structure that corresponds to a +MAPTAB entry. This structure will be copied to the corresponding place +in the MAPTAB. If the addressed device is the one currently set by +Bconmap for AUX, then the newly hooked-in routines will also be copied +to xco* and into the current Rsconf and Iorec cells. This function +serves only for hooking in MagiC-friendly routines. If successful, the +device number to which the entry refers will be returned, i.e. +dev_nr. +
  +
To install devices on the BIOS numbers that are permanently +assigned to a computer, one should always use MAPT_OVE. For the ST +this pertains for instance to number 6, for a MegaSTE to numbers 6 to +8 and for a TT030 to numbers 6 to 9. +
  +
int32_t Bconmap((int16_t)-401, (int32_t)ptr_to_6_longs) +
The constant MAPT_APP is defined as -401. This function serves for +appending a channel to the MAPTAB or for writing to an empty channel. +ptr_to_6_longs points to a structure that corresponds to a +MAPTAB entry. The return is either the channel number selected by this +function for the entry, or the error-code -12 EGENRL if there is no +room for a MAPTAB augmentation. Here it cannot happen that the vectors +are transferred immediately to xco*, as a previously absent channel, +or one in use, can not have been set as AUX. +
  +
MAPT_APP searches for the first free channel after those BIOS +numbers that are permanently assigned to a computer and can therefore +only be used for installing additional devices. +
  +
int32_t Bconmap((int16_t)-402, (int16_t) dev_nr, +(int32_t)ptr_to_listentry) +
The constant MAPT_DEL is defined as -402. This function serves for +deleting a device from the MAPTAB and for unhooking a RSVF list from +the RSVF daisy chain. +
  +
dev_nr is either the BIOS channel number of the device +to be removed from the MAPTAB, or -1 for doing nothing. The +corresponding MAPTAB entry is cleared by entering special +dummy-routine pointers that point to the assembler command RTS. The +Iorec pointer entry is set to 0. If the deleted channel was also set +as the BIOS AUX device, then BIOS AUX will be reset as number 6, +even if number 6 has just been deleted. +
  +
ptr_to_listentry is either the pointer to the RSVF list +to be unhooked, or 0 for doing nothing. The pointer must refer to the +start of a list, which is then removed completely, even if it contains +more than one interface object and end or daisy-chain object. +
  +
MAPT_DEL returns 1 if successful, or -1 in case of error. +
  +
Return value: Bconmap returns the old setting. If devno equals -2, +then the function returns a pointer to BCONMAP. +
  +
Availability: According to Atari one should test one's TOS version for the +presence of Bconmap in the following manner: +
  +
WORD has_bconmap ( VOID )
+{
+   return (0L == Bconmap (0));
+}
+
+
Group: Interface programming +
  +
See also: Binding   Bconout   Bconin   Bcostat   Bconstat   Iorec   Rsconf +
  + +
+ +

4.18.1.1 Bindings for Bconmap

+ + + + + + +
C: #include <tos.h> +
  +
int32_t Bconmap( int16_t devno ); +
  +
Assembler: +
  +
move.w    devno,-(sp)  ; Offset 2
+move.w    #44,-(sp)    ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.18.2 Dosound

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dosound« - Program the sound generator (PSG). +
  +
Opcode: 32 +
  +
Syntax: void *Dosound( const int8_t *buf ); +
  +
Description: The XBIOS routine Dosound starts a process for control of the +programmable sound generator. The buffer buf holds commands +for the programming of the sound generator. The following commands are +supported: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Command Meaning +
    +
0x0x byte Write byte into register x of the sound chip +
0x80 byte Load bytes into temporary register for use by command 0x81 +
0x81 byte1 Number of the sound register into which the value of the +temporary register is to be transferred. +
     byte2 Signed value to be added to the temporary register until value +in third byte is met. +
     byte3 Value of the temporary register at which the loop is +terminated. +
0x82 byte The number of 50 Hz ticks (20 ms) to wait for the next command. +If the byte holds the value 0 the processing is terminated. +
...   +
0xff byte   + +
+ +
Return value: The function returns the previous playing sound buffer, if any. +
  +
Availability: All TOS versions. +
  +
Group: Interface programming +
  +
See also: Binding +
  + +
+ +

4.18.2.1 Bindings for Dosound

+ + + + + + +
C: #include <tos.h> +
  +
void Dosound( const int8_t *buf ); +
  +
Assembler: +
  +
pea       buf          ; Offset 2
+move.w    #32,-(sp)    ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+move.l    d0,a0
+
+ +
+ +

4.18.3 ExtRsConf

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »RS-232/RS485 configuration« - Configure the +RS-232/RS-485-port. +
  +
Opcode: 162 +
  +
Syntax: int32_t Xbios( 162, int16_t command, int16_t device, int32_t +param ); +
  +
Description: The XBIOS routine ExtRsConf configures the serial port. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
command0x0000 - Return 0 to check that ExtRsConf
          is present
 0x0001 - Set port driver mode:
          param = 0 -> RS232
          param = 1 -> RS422
          param = 2 -> RS485
  
deviceBIOS device (6 = MFP serial, ...)
  
paramSee above.
+
+ +
Note: The function is only for the hardware of the Milan +2.1. However, it only exists as a special version and is not freely +available. +
  +
Return value: E_OK (0) - OK +
EUNCMD (-3) - Unknown command +
ERROR (-1) - General error +
EUNDEV (-15) - Unknown device +
  +
Availability: The function is present as of the MilanTOS dated 2002-06-09. +
  +
Group: Interface programming +
  +
See also: Binding +
  + +
+ +

4.18.3.1 Bindings for ExtRsConf

+ + + + + + +
C: #include <tos.h> +
  +
int32_t Xbios( 162, int16_t command, int16_t device, int32_t +param ); +
  +
Assembler: +
  +
move.l    param,-(sp)     ; Offset  6
+move.w    device,-(sp)    ; Offset  4
+move.w    command,-(sp)   ; Offset  2
+move.w    #162,-(sp)      ; Offset  0
+trap      #14             ; Call XBIOS
+lea       10(sp),sp       ; Correct stack
+
+ +
+ +

4.18.4 Giaccess

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »access GI sound chip« - Permit access to the registers of +the GI sound chip. +
  +
Opcode: 28 +
  +
Syntax: int8_t Giaccess( int16_t data, int16_t regno ); +
  +
Description: The XBIOS routine Giaccess reads or sets the registers in the +GI sound chip. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
data Is written at a write access to the register specified in +regno +
regno Number of the desired register (0..15). At write accesses bit 7 +is also set. + +
+ +
Return value: The function returns the contents of the specified register. +
  +
Availability: All TOS versions. +
  +
Group: Interface programming +
  +
See also: Binding +
  + +
+ +

4.18.4.1 Bindings for Giaccess

+ + + + + + +
C: #include <tos.h> +
  +
int8_t Giaccess( int16_t data, int16_t regno ); +
  +
Assembler: +
  +
move.w    regno,-(sp)  ; Offset 4
+move.w    data,-(sp)   ; Offset 2
+move.w    #28,-(sp)    ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.18.5 Ikbdws

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »write string to keyboard« - Program the keyboard chip. +
  +
Opcode: 25 +
  +
Syntax: void Ikbdws( int16_t count, const int8_t *ptr ); +
  +
Description: The XBIOS routine Ikbdws passes a string to the intelligent +keyboard controller. The following apply: +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
countNumber of bytes to be output - 1
ptrPointer to the bytes in memory
+
+ +
Return value: The function does not return a result. +
  +
Availability: All TOS versions. +
  +
Group: Interface programming +
  +
See also: Binding +
  + +
+ +

4.18.5.1 Bindings for Ikbdws

+ + + + + + +
C: #include <tos.h> +
  +
void Ikbdws( int16_t count, const int8_t *ptr ); +
  +
Assembler: +
  +
pea       ptr          ; Offset 4
+move.w    count,-(sp)  ; Offset 2
+move.w    #25,-(sp)    ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #8,sp        ; Correct stack
+
+ +
+ +

4.18.6 Iorec

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »input output record« - Obtain address of the input/ output +buffer of a serial device. +
  +
Opcode: 14 +
  +
Syntax: IOREC *Iorec( int16_t dev ); +
  +
Description: The XBIOS routine Iorec returns the address of the +input/output buffer of a serial device (RS-232, keyboard chip or MIDI +port). The parameter dev can take the following values: +
  +

+
+ + + + + + + + + + + + + + + + +
devMeaning
0RS-232
1Keyboard
2MIDI
+
+ +
Return value: The function returns a pointer to the IOREC array. +
  +
Availability: All TOS versions. +
  +
Group: Interface programming +
  +
See also: Binding   Bconmap +
  + +
+ +

4.18.6.1 Bindings for Iorec

+ + + + + + +
C: #include <tos.h> +
  +
IOREC *Iorec( int16_t dev ); +
  +
Assembler: +
  +
move.w    dev,-(sp)    ; Offset 2
+move.w    #14,-(sp)    ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.18.7 Kbdvbase

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »keyboard vectors« - Return a pointer to the IKBD +(intelligent keyboard), and MIDI interrupt vectors. +
  +
Opcode: 34 +
  +
Syntax: KBDVBASE *Kbdvbase( void ); +
  +
Description: The XBIOS routine Kbdvbase returns a pointer to a KBDVBASE +structure contaning a 'jump' table to system vector handlers. +
  +
Note: Before one of the vectors specified in the +structure is altered, one must ensure that a packet is not currently +being sent (element drvstat = 0). Subsequently all interrupts +should be blocked and a test performed to check that there really is +no packet on the way. +
  +
Return value: The function returns a pointer to a KBDVBASE structure. +
  +
Availability: All TOS versions. +
  +
Group: Interface programming +
  +
See also: Binding +
  + +
+ +

4.18.7.1 Bindings for Kbdvbase

+ + + + + + +
C: #include <tos.h> +
  +
KBDVBASE *Kbdvbase( void ); +
  +
Assembler: +
  +
move.w    #34,-(sp)    ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

4.18.8 Mfpint

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »init MFP interrupt« - Initialize the multi-function +peripheral chip interrupt. +
  +
Opcode: 13 +
  +
Syntax: void Mfpint( int16_t number, int16_t (*vector)() ); +
  +
Description: The XBIOS routine Mfpint initializes the multi-function chip +interrupt for the connected peripheral devices. This permits hardware +interrupts being intercepted. The argument vector specifies +the interrupt service routine. The parameter number gives the +number of the interrupt from 0 to 15: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
numberDescription
0I/O port bit 0 busy parallel port
1RS-232 DCD
2RS-232 CTS
3Blitter
4Timer D, RS-232 Baud rate generator
5Timer C, 200-Hz system clock
6Keyboard and MIDI
7FDC and DMA
8Timer B horizontal blank
9RS-232 transmit error
10RS-232 transmit buffer empty
11RS-232 receive buffer full
12RS-232 buffer full
13Timer A (DMA sound)
14RS-232 RI
15Mono monitor detect / DMA sound complete
+
+ +
Return value: The function does not return a result. +
  +
Availability: All TOS versions. +
  +
Group: Interface programming +
  +
See also: Binding   Jdisint   Jenabint +
  + +
+ +

4.18.8.1 Bindings for Mfpint

+ + + + + + +
C: #include <tos.h> +
  +
void Mfpint( int16_t number, int16_t (*vector)() ); +
  +
Assembler: +
  +
pea       vector       ; Offset 4
+move.w    number,-(sp) ; Offset 2
+move.w    #13,-(sp)    ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #8,sp        ; Correct stack
+
+ +
+ +

4.18.9 Midiws

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Midi write string« - Write string of characters to the MIDI +port. +
  +
Opcode: 12 +
  +
Syntax: void Midiws( int16_t cnt, void *ptr ); +
  +
Description: The XBIOS routine Midiws outputs a string from a data buffer +via the MIDI port. The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
cnt Number of bytes to be output - 1 +
ptr Pointer to byte string + +
+ +
Return value: The function does not return a result. +
  +
Availability: All TOS versions. +
  +
Group: Interface programming +
  +
See also: Binding +
  + +
+ +

4.18.9.1 Bindings for Midiws

+ + + + + + +
C: #include <tos.h> +
  +
void Midiws( int16_t cnt, void *ptr ); +
  +
Assembler: +
  +
pea       ptr          ; Offset 4
+move.w    cnt,-(sp)    ; Offset 2
+move.w    #12,-(sp)    ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #8,sp        ; Stack korrigieren
+
+ +
+ +

4.18.10 Offgibit

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »GI bit off« - Clear individual bits in the port A register +of the GI sound chip. +
  +
Opcode: 29 +
  +
Syntax: void Offgibit( int16_t bitno ); +
  +
Description: The XBIOS routine Offgibit clears a bit in register A of the +GI sound chip. bitno specifies the value with which the +register should be ANDed. The bits in this register have the following +meaning: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Bit Description +
    +
 0 Floppy disk side select +
 1 Select drive A: +
 2 Select drive B: +
 3 RS-232 RTS +
 4 RS-232 DTR +
 5 Centronics Strobe +
 6 PIN 3 Monitor port +
 7 Unused +
As of TOS030 of the TT, however Modem 4 (1) or LAN (0) + +
+ +
Return value: The function does not return a result. +
  +
Availability: All TOS versions. +
  +
Gruppe: Interface programming +
  +
See also: Binding   Ongibit +
  + +
+ +

4.18.10.1 Bindings for Offgibit

+ + + + + + +
C: #include <tos.h> +
  +
void Offgibit( int16_t bitno ); +
  +
Assembler: +
  +
move.w    bitno,-(sp)  ; Offset 2
+move.w    #29,-(sp)    ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.18.11 Ongibit

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »GI bit on« - Set individual bits in the port A register of +the GI sound chip. +
  +
Opcode: 30 +
  +
Syntax: void Ongibit( int16_t bitno ); +
  +
Description: The XBIOS routine Ongibit sets a bit in register A of the GI +sound chip. bitno specifies the value with which the register +should be ORed. The bits in this register have the following meaning: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Bit Description +
    +
 0 Floppy disk side select +
 1 Select drive A: +
 2 Select drive B: +
 3 RS-232 RTS +
 4 RS-232 DTR +
 5 Centronics strobe +
 6 PIN 3 monitor port +
 7 Unused +
As of TOS030 of the TT, however Modem 4 (1) or LAN (0) + +
+ +
Return value: The function does not return a result. +
  +
Availability: All TOS versions. +
  +
Group: Interface programming +
  +
See also: Binding   Offgibit +
  + +
+ +

4.18.11.1 Bindings for Ongibit

+ + + + + + +
C: #include <tos.h> +
  +
void Ongibit( int16_t bitno ); +
  +
Assembler: +
  +
move.w    bitno,-(sp)  ; Offset 2
+move.w    #30,-(sp)    ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.18.12 Rsconf

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »RS-232 configuration« - Configure the RS-232 port. +
  +
Opcode: 15 +
  +
Syntax: int32_t Rsconf( int16_t baud, int16_t ctr, int16_t ucr, int16_t +rsr, int16_t tsr, int16_t scr ); +
  +
Description: The XBIOS routine Rsconf configures the serial port. Since +different hardware components may be in use with various computers, +the function has to be used with care, i.e.: +
  +
    +
  • Current settings should be established with Rsconf +(-1,-1,-1,-1,-1,-1) +
  • +
  • Only manipulate the necessary bits +
  • +
  • Then set the new values. +
  • +
+ +
Due to the possibility that various components may be in use, +the usable values have been restricted in the following way: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterRestriction
ucrBit 1: Type of parity
        0 = Odd
        1 = Even
  
     2: Parity
        0 = No
        1 = Yes
  
   3+4: Number of stop bits
        0 = Invalid
        1 = 1 stop bit
        2 = 1.5 stop bits
        3 = 2 stop bits
  
   5+6: Word length
        0 = 8 bits
        1 = 7 bits
        2 = 6 bits
        3 = 5 bits
  
rsrNot usable
tsrBit 3: (1 = Break)
scrNot usable
+
+ +
Technically impossible values must therefore be ignored. +Otherwise the following assignments apply: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
baudBaud rate
 -1: Don't change
  0: 19200 Baud
  1: 9600 Baud
  2: 4800 Baud
  3: 3600 Baud
  4: 2400 Baud
  5: 2000 Baud
  6: 1800 Baud
  7: 1200 Baud
  8: 600 Baud
  9: 300 Baud
 10: 200 Baud
 11: 150 Baud
 12: 134 Baud
 13: 110 Baud
 14: 75 Baud
 15: 50 Baud
  
ctrType of flow control
 -1: Don't change
  0: No flow control [powerup default]
  1: XON/XOFF (Control-S, Control-Q)
  2: RTS/CTS
  3: RTS/CTS and XON/XOFF
  
ucrNew value for register, or -1
tsrNew value for register, or -1
rsrNew value for register, or -1
scrNew value for register, or -1
+
+ +
Note: As of TOS 1.04 the last Baud rate set can be +established with Rsconf (-2,-1,-1,-1,-1). One should never rely on the +fact that all the settings could actually be made as desired, and +hence pay close attention to the return value of the function. +
  +
Return value: The function returns in packed form the values of the registers +ucr, rsr, scr and tsr as follows: +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
Bits0..7:scr register
Bits8..15:tsr register
Bits16..23:rsr register
Bits24..31:ucr register
+
+ +
Availability: All TOS versions. +
  +
Group: Interface programming +
  +
See also: Binding   Bconmap +
  + +
+ +

4.18.12.1 Bindings for Rsconf

+ + + + + + +
C: #include <tos.h> +
  +
int32_t Rsconf( int16_t baud, int16_t ctr, int16_t ucr, int16_t +rsr, int16_t tsr, int16_t scr ); +
  +
Assembler: +
  +
move.w    scr,-(sp)    ; Offset 12
+move.w    tsr,-(sp)    ; Offset 10
+move.w    rsr,-(sp)    ; Offset  8
+move.w    ucr,-(sp)    ; Offset  6
+move.w    ctr,-(sp)    ; Offset  4
+move.w    baud,-(sp)   ; Offset  2
+move.w    #15,-(sp)    ; Offset  0
+trap      #14          ; Call XBIOS
+lea       $E(sp),sp    ; Correct stack
+
+ +
+ +
+ +Home +XBIOSXBIOS +PCI-BIOSPCI-BIOS +Sound routinesSound routines + + diff --git a/en/xbios_interrupt.html b/en/xbios_interrupt.html new file mode 100644 index 000000000..afa7e8d63 --- /dev/null +++ b/en/xbios_interrupt.html @@ -0,0 +1,329 @@ + + + + + +The documentation for TOS: Interrupt functions + + + + + + + + + +Home +XBIOSXBIOS +Hatari DHS XBIOS extensionHatari DHS XBIOS extension +Drive functionsDrive functions + +
+ +

4.13 Interrupt functions

+ + + + + + +
Jdisint Disables an MFP interrupt. +
Jenabint Enables an MFP interrupt. + +
+ +

See also: Interface programming +

+

4.13.1 Jdisint

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »disable interrupt« - Disable interrupts of the +multi-functional peripheral port. +
  +
Opcode: 26 +
  +
Syntax: void Jdisint( int16_t number ); +
  +
Description: The XBIOS routine Jdisint disables a designated type of +interrupt that is specified by number on the multi-functional +peripheral port. The parameter number refers to the following +interrupts: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
numberDescription
 0I/O-port bit 0 Busy parallel port
 1RS-232 DCD
 2RS-232 CTS
 3Blitter
 4Timer D, RS-232 Baud generator
 5Timer C, 200 Hz system clock
 6Keyboard and MIDI
 7FDC and DMA
 8Timer B line flyback
 9RS-232 transmit error
10RS-232 transmit buffer empty
11RS-232 receive buffer full
12RS-232 buffer full
13Timer A
14RS-232 RI
15Monochrome monitor detect
+
+ +
Return value: The function does not return a result. +
  +
Availability: All TOS versions. +
  +
Group: Interrupt functions +
  +
See also: Binding   Jenabint   Mfpint +
  + +
+ +

4.13.1.1 Bindings for Jdisint

+ + + + + + +
C: #include <tos.h> +
  +
void Jdisint( int16_t number ); +
  +
Assembler: +
  +
move.w    number,-(sp)  ; Offset 2
+move.w    #26,-(sp)     ; Offset 0
+trap      #14           ; Call XBIOS
+addq.l    #4,sp         ; Correct stack
+
+ +
+ +

4.13.2 Jenabint

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »enable interrupt« - Enable interrupts of the +multi-functional peripheral port. +
  +
Opcode: 27 +
  +
Syntax: void Jenabint( int16_t number ); +
  +
Description: The XBIOS routine Jenabint re-enables a designated type of +interrupt that is specified by number on the multi-functional +peripheral port. The parameter number refers to the following +interrupts: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
numberDescription
 0I/O-port bit 0 busy parallel port
 1RS-232 DCD
 2RS-232 CTS
 3Blitter
 4Timer D, RS-232 Baud generator
 5Timer C, 200 Hz system clock
 6Keyboard and MIDI
 7FDC and DMA
 8Timer B line flyback
 9RS-232 transmit error
10RS-232 transmit buffer empty
11RS-232 receive buffer full
12RS-232 buffer full
13Timer A
14RS-232 RI
15Monochrome monitor detect
+
+ +
Return value: The function does not return a result. +
  +
Availability: All TOS versions. +
  +
Group: Interrupt functions +
  +
See also: Binding   Jdisint   Mfpint +
  + +
+ +

4.13.2.1 Bindings for Jenabint

+ + + + + + +
C: #include <tos.h> +
  +
void Jenabint( int16_t number ); +
  +
Assembler: +
  +
move.w    number,-(sp)  ; Offset 2
+move.w    #27,-(sp)     ; Offset 0
+trap      #14           ; Call XBIOS
+addq.l    #4,sp         ; Correct stack
+
+ +
+ +
+ +Home +XBIOSXBIOS +Hatari DHS XBIOS extensionHatari DHS XBIOS extension +Drive functionsDrive functions + + diff --git a/en/xbios_keyboard.html b/en/xbios_keyboard.html new file mode 100644 index 000000000..25b680f28 --- /dev/null +++ b/en/xbios_keyboard.html @@ -0,0 +1,314 @@ + + + + + +The documentation for TOS: Keyboard functions + + + + + + + + + +Home +XBIOSXBIOS +Special commandsSpecial commands +VIDIX XBIOS extensionVIDIX XBIOS extension + +
+ +

4.21 Keyboard functions

+ + + + + + + + + +
Bioskeys Resets Bios table for key-codes. +
Kbrate Gets or alters auto-repeat of the keyboard. +
Keytbl Assigns new mapping table for key-codes. + +
+ +

See also: ASCII table   Scancode table +

+

4.21.1 Bioskeys

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Bios standard keys« - Reinitialize keyboard. +
  +
Opcode: 24 +
  +
Syntax: void Bioskeys( void ); +
  +
Description: Bioskeys is an XBIOS routine for reinitialising the key-codes. +Usually this is only required if the keyboard has been reprogrammed +with the Keytbl function. +
  +
Return value: The function does not return a result. +
  +
Availability: All TOS versions. +
  +
Group: Keyboard functions +
  +
See also: Binding   Keytbl   Sconfig +
  + +
+ +

4.21.1.1 Bindings for Bioskeys

+ + + + + + +
C: #include <tos.h> +
  +
void Bioskeys( void ); +
  +
Assembler: +
  +
move.w    #24,-(sp)    ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

4.21.2 Kbrate

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »keyboard rate« - Set the auto-repeat rate of the keyboard. +
  +
Opcode: 35 +
  +
Syntax: int16_t Kbrate( int16_t initial, int16_t repeat ); +
  +
Description: The XBIOS routine Kbrate obtains or alters the current +auto-repeat rate of the keyboard. The following apply: +
  + + + + + + + + + +
Parameter Meaning +
  +
initial Delay time before the key begins repeating (in 20ms steps). A +value of -1 leaves the value unchanged. +
  +
repeat ime between repeats in 20ms steps. Again, a value of -1 leaves +the value unchanged. +
  + +
+ +
Return value: The function returns the setting of the auto-repeat mode as a +word, in the following way: +
  +

+
+ + + + + + + + +
Bits 0..7 :Old value of repeat rate
Bits 8..15:Old value of initial delay
+
+ +
Availability: All TOS versions. +
  +
Group: Keyboard functions +
  +
See also: Binding +
  + +
+ +

4.21.2.1 Bindings for Kbrate

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Kbrate( int16_t initial, int16_t repeat ); +
  +
Assembler: +
  +
move.w    repeat,-(sp)  ; Offset 4
+move.w    initial,-(sp) ; Offset 2
+move.w    #35,-(sp)     ; Offset 0
+trap      #14           ; Call XBIOS
+addq.l    #6,sp         ; Correct stack
+
+ +
+ +

4.21.3 Keytbl

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »key table« - Define the mapping table for the keyboard +scancodes to key-codes. +
  +
Opcode: 16 +
  +
Syntax: KEYTAB *Keytbl( void *unshift, void *shift, void *capslock ); +
  +
Description: Keytbl is an XBIOS function with whose aid a new keyboard +table for the mapping of scancodes to key-codes can be constructed. +The following apply: +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
unshift Pointer to unshift table, or -1 +
shift Pointer to Shift table, or -1 +
capslock Pointer to Capslock table, or -1 + +
+ +
Note: A code is converted by using the scancode of the +relevant key as an index in an array forming a table (of ASCII +characters). Each of the tables has space for 128 entries, although +key combinations with higher scancodes exist. +
  +
Return value: The function returns a pointer to the KEYTAB structure. +
  +
Availability: All TOS versions. +
  +
Group: Keyboard functions +
  +
See also: Binding   Bioskeys   ASCII table   Scancodes +
  + +
+ +

4.21.3.1 Bindings for Keytbl

+ + + + + + +
C: #include <tos.h> +
  +
KEYTAB *Keytbl( void *unshift, void *shift, void *capslock ); +
  +
Assembler: +
  +
pea       capslock     ; Offset 10
+pea       shift        ; Offset  6
+pea       unshift      ; Offset  2
+move.w    #16,-(sp)    ; Offset  0
+trap      #14          ; Call XBIOS
+lea       $E(sp),sp    ; Correct stack
+
+ +
+ +
+ +Home +XBIOSXBIOS +Special commandsSpecial commands +VIDIX XBIOS extensionVIDIX XBIOS extension + + diff --git a/en/xbios_main.html b/en/xbios_main.html new file mode 100644 index 000000000..f5322532f --- /dev/null +++ b/en/xbios_main.html @@ -0,0 +1,60 @@ + + + + + +The documentation for TOS: XBIOS + + + + + + + + + +Home +Contents +BIOS StructuresBIOS Structures +About the XBIOSAbout the XBIOS + +
+ +

4 XBIOS

+ +
+
+ +Home +Contents +BIOS StructuresBIOS Structures +About the XBIOSAbout the XBIOS + + diff --git a/en/xbios_metados.html b/en/xbios_metados.html new file mode 100644 index 000000000..ad942e735 --- /dev/null +++ b/en/xbios_metados.html @@ -0,0 +1,40 @@ + + + + + +The documentation for TOS: MetaDOS + + + + + + + + + +Home +XBIOSXBIOS +About the XBIOSAbout the XBIOS +XBIOS error-messagesXBIOS error-messages + +
+ +

4.2 MetaDOS

+

MetaDOS is an operating system extension from Atari that extends +the XBIOS by a driver concept for block-oriented devices. +Hence MetaDOS permits the installation of suitable drivers and makes +new XBIOS drive functions available. +

+

The communication with GEMDOS is realised by special +logical device drivers. +

+
+ +Home +XBIOSXBIOS +About the XBIOSAbout the XBIOS +XBIOS error-messagesXBIOS error-messages + + diff --git a/en/xbios_overscan.html b/en/xbios_overscan.html new file mode 100644 index 000000000..24edacfe3 --- /dev/null +++ b/en/xbios_overscan.html @@ -0,0 +1,723 @@ + + + + + +The documentation for TOS: OverScan XBIOS extension + + + + + + + + + +Home +XBIOSXBIOS +MATRIX XBIOS extensionMATRIX XBIOS extension +PCI-BIOSPCI-BIOS + +
+ +

4.16 OverScan XBIOS extension

+ + + + + + + + + + + + + + + + + + + + + +
Oscanis Returns OverScan's version number. +
Oscanpatch Obtains patch block of OverScan. +
Oscanphy Switches the Physbase emulator. +
Oscanscr Switches the Setscreen calls. +
Oscanswitch Switches or obtains current mode. +
Oscantab Gets pointer to data structure of a screen resolution. +
Oscanvb Switches the VB edge-test routine, as well as some tests in the +IKBD interrupt. + +
+ +

Note: +
These functions are only available if the cookie 'OVER is +present and since the version 1.8 from AutoSwitch-OverScan ST. +

+

4.16.1 Oscanis

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Oscanis« - Return OverScan's version number. +
  +
Opcode: 4200 (old: 84) +
  +
Syntax: int16_t Oscanis( void ); +
  +
Description: The function returns the (hexadecimal) version number of +OverScan. A value of 0x300 corresponds here to Version 3.0. +
  +
As this function is based on an undocumented feature, it is +better to make use of the OVER cookie if possible. +
  +
Return value: The function (normally) returns the value 4200 when OverScan is +not installed, otherwise its version number. +
  +
Availability: If the cookie 'OVER is present and since the version 1.8. +
  +
Group: OverScan XBIOS functions +
  +
See also: Binding   Oscanpatch   Oscanphy   Oscanscr   Oscanswitch   +Oscantab   Oscanvb +
  + +
+ +

4.16.1.1 Bindings for Oscanis

+ + + + + + +
C: int16_t Oscanis( void ); +
  +
Assembler: +
  +
move.w    #4200,-(sp)  ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

4.16.2 Oscanpatch

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Oscanpatch« - Obtain patch block of OverScan +
  +
Opcode: 4205 (old: 89) +
  +
Syntax: OVERPATCH *Oscanpatch( void ); +
  +
Description: The function returns a pointer to the patch block of OverScan. +
  +
Return value: The function returns a pointer to the OverScan patch block. +
  +
Availability: If the cookie 'OVER is present and since the version 1.8. +
  +
Group: OverScan XBIOS functions +
  +
See also: Binding   Oscanis   Oscanphy   Oscanscr   Oscanswitch   OscantabOscanvb +
  + +
+ +

4.16.2.1 Bindings for Oscanpatch

+ + + + + + +
C: OVERPATCH *Oscanpatch( void ); +
  +
Assembler: +
  +
move.w    #4205,-(sp)  ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #2,sp        ; Stack korrigieren
+
+ +
+ +

4.16.3 Oscanphy

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Oscanphy« - Switch the Physbase emulator. +
  +
Opcode: 4202 (old: 86) +
  +
Syntax: int16_t Oscanphy( int16_t mode ); +
  +
Description: The function permits the switching of the Physbase emulator. +The following apply: +
  + + + + + + +
Parameter Meaning +
  +
mode +
  +

+
+ + + + + + + + + + + + + + + +
-1=Obtain status
0=Switch off emulator
1=Switch on emulator (default)
+
+ + +
+ +
When the emulator is switched on, then a call of Physbase returns +the value of Logbase. Before terminating the program it is imperative +that the Physbase emulator is switched on again. +
  +
Return value: For mode -1, the function returns the current status of +the emulator. +
  +
Availability: If the cookie 'OVER is present and since the version 1.8. +
  +
Group: OverScan XBIOS functions +
  +
See also: Binding   Oscanis   Oscanpatch   Oscanscr   Oscanswitch   +Oscantab   Oscanvb +
  + +
+ +

4.16.3.1 Bindings for Oscanphy

+ + + + + + +
C: int16_t Oscanphy( int16_t mode ); +
  +
Assembler: +
  +
move.w    mode,-(sp)   ; Offset 2
+move.w    #4202,-(sp)  ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.16.4 Oscanscr

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Oscanscr« - Switch the Setscreen calls. +
  +
Opcode: 4203 (old: 87) +
  +
Syntax: int16_t Oscanscr( int16_t mode ); +
  +
Description: The function permits switching of the Setscreen call. The +following apply: +
  + + + + + + +
Parameter Meaning +
  +
mode +
  +

+
+ + + + + + + + + + + + + + + +
-1=Obtain status
0=Setscreen permissible
1=Setscreen not permissible (default)
+
+ + +
+ +
Normally under OverScan the relocation of the screen or a change +of resolution is not possible. If one wants to relocate the +screen memory with Setscreen, it is important that the offset between +Logbase and Physbase is not destroyed. +
Important: Before terminating the program, the Setscreen call +must be locked once more. +
  +
Return value: The function returns the current setting. +
  +
Availability: If the cookie 'OVER is present and since the version 1.8. +
  +
Group: OverScan XBIOS functions +
  +
See also: Binding   Oscanis   Oscanpatch   Oscanphy   Oscanswitch   +Oscantab   Oscanvb +
  + +
+ +

4.16.4.1 Bindings for Oscanscr

+ + + + + + +
C: int16_t Oscanscr( int16_t mode ); +
  +
Assembler: +
  +
move.w    mode,-(sp)   ; Offset 2
+move.w    #4203,-(sp)  ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.16.5 Oscanswitch

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Oscanswitch« -Switch or obtains current mode. +
  +
Opcode: 4206 (old: 90) +
  +
Syntax: int16_t Oscanswitch( int16_t mode ); +
  +
Description: The function switches between the normal mode and the OverScan +mode. The following apply: +
  + + + + + + +
Parameter Meaning +
  +
mode +
  +

+
+ + + + + + + + + + + + + + + +
-1=Obtain status
0=Normal mode
1=OverScan mode
+
+ + +
+ +
The function not only switches over the hardware, but also all +internal GEM variables are patched and the screen is copied over. +
  +
Return value: The function returns the current setting in each case. +
  +
Availability: If the cookie 'OVER is present and since the version 1.8. +
  +
Group: OverScan XBIOS functions +
  +
See also: Binding   Oscanis   Oscanpatch   Oscanphy   Oscanscr   OscantabOscanvb +
  + +
+ +

4.16.5.1 Bindings for Oscanswitch

+ + + + + + +
C: int16_t Oscanswitch( int16_t mode ); +
  +
Assembler: +
  +
move.w    mode,-(sp)   ; Offset 2
+move.w    #4206,-(sp)  ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.16.6 Oscantab

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Oscantab« - Get pointer to data structure of a screen +resolution. +
  +
Opcode: 4201 (old: 85) +
  +
Syntax: SCREEN *Oscantab( int16_t res ); +
  +
Description: The function returns a pointer to a structure for a description +of the screen. The following apply: +
  + + + + + + +
Parameter Meaning +
  +
res +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
-1=Current setting
0=Low resolution
1=Medium resolution
2=High resolution
+
+ + +
+ +
The data structure of the current setting is updated at each +call of the function. +
  +
Return value: The function returns a pointer to the corresponding structure +for the description of the screen. +
  +
Availability: If the cookie 'OVER is present and since the version 1.8. +
  +
Group: OverScan XBIOS functions +
  +
See also: Binding   Oscanis   Oscanpatch   Oscanphy   Oscanscr   +Oscanswitch   Oscanvb +
  + +
+ +

4.16.6.1 Bindings for Oscantab

+ + + + + + +
C: SCREEN *Oscantab( int16_t res ); +
  +
Assembler: +
  +
move.w    res,-(sp)    ; Offset 2
+move.w    #4201,-(sp)  ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +

4.16.7 Oscanvb

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Oscanvb« - witch the VB edge-test routine, as well as some +tests in the IKBD interrupt. +
  +
Opcode: 4204 (old: 88) +
  +
Syntax: int16_t Oscanvb( int16_t mode ); +
  +
Description: The function permits switching off the VB edge-test routine as +well as the test for Shift/Shift/Clear in the IKBD interrupt. The +following apply: +
  + + + + + + +
Parameter Meaning +
  +
mode +
  +

+
+ + + + + + + + + + + + + + + +
-1=Obtain status
0=Switch tests off
1=Switch tests on (default)
+
+ + +
+ +
Though the tests require only some 1-2% CPU time, for +time-critical animations and MIDI routines this could be just too +much. +
  +
Important: Before termination of the program it is +imperative that the tests are switched on again. +
  +
Return value: The function returns the current setting in each case. +
  +
Availability: If the cookie 'OVER is present and since the version 1.8. +
  +
Group: OverScan XBIOS functions +
  +
See also: Binding   Oscanis   Oscanpatch   Oscanphy   Oscanscr   +Oscanswitch   Oscantab +
  + +
+ +

4.16.7.1 Bindings for Oscanvb

+ + + + + + +
C: int16_t Oscanvb( int16_t mode ); +
  +
Assembler: +
  +
move.w    mode,-(sp)   ; Offset 2
+move.w    #4204,-(sp)  ; Offset 0
+trap      #14          ; XBIOS aufrufen
+addq.l    #4,sp        ; Stack korrigieren
+
+ +
+ +
+ +Home +XBIOSXBIOS +MATRIX XBIOS extensionMATRIX XBIOS extension +PCI-BIOSPCI-BIOS + + diff --git a/en/xbios_printer.html b/en/xbios_printer.html new file mode 100644 index 000000000..921741800 --- /dev/null +++ b/en/xbios_printer.html @@ -0,0 +1,311 @@ + + + + + +The documentation for TOS: Printer functions + + + + + + + + + +Home +XBIOSXBIOS +Date, Time and TimerDate, Time and Timer +DSP programmingDSP programming + +
+ +

4.10 Printer functions

+ + + + + + + + + +
Prtblk Hardcopy function with parameter block. +
Scrdmp Prints screen contents. +
Setprt Gets or alters printer settings. + +
+ +

See also: Screen functions   GDOS drivers +

+

4.10.1 Prtblk

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Print screen dump« - Hardcopy print-out +
  +
Opcode: 36 +
  +
Syntax: int16_t Prtblk( PBDEF *par ); +
  +
Description: The XBIOS routine Prtblk prints out a given segment of the +memory. The pointer par serves to describe the structure of +the screen build-up. +
  +
The print process can be terminated with the key combination +Alternate/Help. +
  +
Note: Before calling this function the system variable +prt_cnt should be set to 1 to make anything at all happen. After +return of the function the variable should be set back to -1. +
  +
Warning: As of MagiC 3, this function is only present as +a dummy routine; possibly the desired functionality may be restored by +an external program. +
  +
Return value: The function returns 0 if the printout was successful, +otherwise a non-zero value. +
  +
Availability: All TOS versions. +
  +
Gruppe: Printer functions +
  +
See also: Binding   HARDCOPY   MagiC +
  + +
+ +

4.10.1.1 Bindings for Prtblk

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Prtblk( PBDEF *par ); +
  +
Assembler: +
  +
pea       par          ; Offset 2
+move.w    #36,-(sp)    ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.10.2 Scrdmp

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Screen dump« - Print out the screen contents. +
  +
Opcode: 20 +
  +
Syntax: void Scrdmp( void ); +
  +
Description: The XBIOS routine Scrdmp prints out the contents of the screen +as hardcopy. +
  +
The print process can be terminated with the key combination +Alternate/Help. +
  +
Note: The function jumps via the scr_dump system vector, +and unfortunately does not work with all available printers. +
  +
Warning: As of MagiC 3, this function is only present as +a dummy routine; possibly the desired functionality may be restored by +an external program. +
  +
Return value: The function does not return a result. +
  +
Availability: All TOS versions. +
  +
Group: Printer functions +
  +
See also: Binding   HARDCOPY   MagiC +
  + +
+ +

4.10.2.1 Bindings for Scrdmp

+ + + + + + +
C: #include <tos.h> +
  +
void Scrdmp( void ); +
  +
Assembler: +
  +
move.w    #20,-(sp)    ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

4.10.3 Setprt

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Setprinter« - Initialize the printer. +
  +
Opcode: 33 +
  +
Syntax: int16_t Setprt( int16_t config ); +
  +
Description: The XBIOS routine Setprt sets or reads the current settings of +the printer. The following bits can be specified in the parameter +config: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
BitMeaning
0Dot-matrix or daisywheel printer
1Monochrome or colour
2Epson, or Atari printer
3NLQ or Draft print.
4Centronics or RS-232 port.
5Continuous paper or single sheet.
+
+ +
With config = -1 the current configuration will be +returned. All further bits are reserved for future use. +
  +
Note: Unfortunately, the settings made by this function +will be ignored by almost all parts of the operating system. So in +one's own programs one ought to evaluate at least the choice of port +as well as the type of paper. +
  +
Return value: The function returns the old configuration. +
  +
Availability: All TOS versions. +
  +
Group: Printer functions +
  +
See also: Binding +
  + +
+ +

4.10.3.1 Bindings for Setprt

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Setprt( int16_t config ); +
  +
Assembler: +
  +
move.w    config,-(sp)  ; Offset 2
+move.w    #33,-(sp)     ; Offset 0
+trap      #14           ; Call XBIOS
+addq.l    #4,sp         ; Correct stack
+
+ +
+ +
+ +Home +XBIOSXBIOS +Date, Time and TimerDate, Time and Timer +DSP programmingDSP programming + + diff --git a/en/xbios_sound.html b/en/xbios_sound.html new file mode 100644 index 000000000..dcffea32f --- /dev/null +++ b/en/xbios_sound.html @@ -0,0 +1,9729 @@ + + + + + +The documentation for TOS: Sound routines + + + + + + + + + +Home +XBIOSXBIOS +Interface programmingInterface programming +Special commandsSpecial commands + +
+ +

4.19 Sound routines

+

The following routines for sound programming are available on +the Falcon030: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
buffoper Sets record/playback mode. +
buffptr Gets record/playback mode. +
devconnect Connects audio subsystem components. +
dsptristate Coordinates external DSP hardware. +
gpio Communication via the external DSP port. +
locksnd Locks sound system for other applications. +
setbuffer Sets record/playback buffer addresses. +
setinterrupt Sets interrupt at the end of recording/playback. +
setmode Selects record/playback mode. +
setmontracks Sets playback track for internal loudspeaker. +
settracks Sets number of record and playback tracks. +
sndstatus Gets status of the A/D and D/A converter. +
soundcmd Sets/gets the parameters of the A/D and D/A converter. +
StarTrack XBIOS extension for the StarTrack card. +
unlocksnd Frees sound system for other applications. +
WavePlay Replays a sample. + +
+ +

Note: The availability of these routines on other +computer systems can be ascertained via the McSn-Cookie or the _SND +cookie. +

+

4.19.1 buffoper

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »buffoper« - Set or read record/playback mode +
  +
Opcode: 136 +
  +
Syntax: int32_t buffoper( int16_t mode ); +
  +
Description: The XBIOS routine buffoper sets or reads the record and +playback mode of the harware sound system. +
  +
If the value -1 is passed for mode, then the current +setting will be established. Otherwise mode is coded as +follows: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
BitOperation
0DMA sound playback
1Loop playback of sound currently playing
2DMA sound recording
3Loop recording within the currently set record
 buffer (as set by Buffptr)
+
+ +
Set bits switch an operation on, cleared bits off. +
  +
Return value: If successfull the function returns the value 0. If -1 was +passed for mode, the return will show the current state of the +sound system, whose coding corresponds to the parameter mode. +
  +
Availability: The function is only available on computers of the Falcon +series, or with extended XBIOS routines (_SND). +
  +
Group: Sound routines +
  +
See also: Binding   buffptr   devconnect   dsptristate   gpio   locksnd   +setbuffer   setinterrupt   setmontracks   setmode   settracks   +sndstatus   soundcmd   unlocksnd +
  + +
+ +

4.19.1.1 Bindings for buffoper

+ + + + + + +
C: #include <tos.h> +
  +
int32_t buffoper( int16_t mode ); +
  +
Assembler: +
  +
move.w    mode,-(sp)   ; Offset 2
+move.w    #136,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.19.2 buffptr

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »buffptr« - Get current record/playback mode +
  +
Opcode: 141 +
  +
Syntax: int32_t buffptr( int32_t *ptr ); +
  +
Description: The XBIOS routine buffptr ascertains the current playback and +record positions in the corresponding buffers. +
  +
ptr points to a buffer at least 4 longwords in size. The +position pointers will be stored in that. The first int32_t of the +buffer contains a pointer to the current playback position and the +second int32_t a pointer to the current record position. +
  +
Return value: If successful the function returns the value 0, or non-zero +otherwise. +
  +
Availability: The function is only available on computers of the Falcon +series, or with extended XBIOS routines (_SND). +
  +
Group: Sound routines +
  +
See also: Binding   buffoper   devconnect   dsptristate   gpio   locksnd   +setbuffer   setinterrupt   setmontracks   setmode   settracks   +sndstatus   soundcmd   unlocksnd +
  + +
+ +

4.19.2.1 Bindings for buffptr

+ + + + + + +
C: #include <tos.h> +
  +
int32_t buffptr( int32_t *ptr ); +
  +
Assembler: +
  +
pea       ptr          ; Offset 2
+move.w    #141,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.19.3 devconnect

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »devconnect« - Connect audio subsystem components +
  +
Opcode: 139 +
  +
Syntax: int32_t devconnect( int16_t src, int16_t dst, int16_t srcclk, +int16_t prescale, int16_t protocol ); +
  +
Description: The XBIOS routine devconnect connects a source component in +the audio subsystem to one or more destination components using the +connection matrix. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
srcSource component:
 0 DMA output
 1 DSP output
 2 External input channel
 3 A/D converter - microphone
  
dstBit vector of the destination component:
 Bit 0 DMA input (for recording)
 Bit 1 DSP input receiving
 Bit 2 External output channel
 Bit 3 D/A converter/loudspeaker or phones
  
srcclkClock for the source components:
 0 Internal 25.175 MHz clock
 1 External clock
    For MilanBlaster the external clock is
    24.576 MHz when gpio(1,0) & 0x1l == 1l
    and 22.5792 MHz when gpio(1,0) &
    0x1l == 0l
 2 Internal 32 MHz clock
  
prescaleClock prescaler. The sample rate is the
 result of the clock divided by 256 and
 divided by prescaler + 1. The values for
 the prescaler range from 0 to 11.
 If 0 is passed to the prescaler, then the
 mode will be switched to STE compatibility
  
protocolIf 0 is passed, transmission will be
 with handshaking, with 1 there is no
 handshaking.
+
+ +
Return value: The function returns the value 0 if the operation was +successfull, or non-zero otherwise. +
In TOS 4.04 a value of 0 is returned if the src parameter is +illegal, and a random value otherwise. +
  +
Availability: The function is only available on computers of the Falcon +series, or with extended XBIOS routines (_SND). +
  +
Group: Sound routines +
  +
See also: Binding   buffoper   buffptr   dsptristate   gpio   locksnd   +setbuffer   setinterrupt   setmontracks   setmode   settracks   +sndstatus   soundcmd   unlocksnd +
  + +
+ +

4.19.3.1 Bindings for devconnect

+ + + + + + +
C: #include <tos.h> +
  +
int32_t devconnect( int16_t src, int16_t dst, int16_t srcclk, +int16_t prescale, int16_t protocol ); +
  +
Assembler: +
  +
move.w    protocol,-(sp)  ; Offset 10
+move.w    prescale,-(sp)  ; Offset  8
+move.w    srcclk,-(sp)    ; Offset  6
+move.w    dst,-(sp)       ; Offset  4
+move.w    src,-(sp)       ; Offset  2
+move.w    #139,-(sp)      ; Offset  0
+trap      #14             ; Call XBIOS
+lea       $C(sp),sp       ; Correct stack
+
+ +
+ +

4.19.4 dsptristate

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »dsptristate« - Coordinate external DSP hardware +
  +
Opcode: 137 +
  +
Syntax: int32_t dsptristate( int16_t dspxmit, int16_t dsprec ); +
  +
Description: The XBIOS routine dsptristate uncouples connections from the +multiplexer connection matrix when external hardware is connected to +the SSI port of the DSP. +
  + + + + + + + + + +
Parameter Meaning +
  +
dspxmit The value 0 disconnects the multiplexer from the corresponding +connection, while 1 permits the connection. +
  +
dsprec The value 0 disconnects the multiplexer from the corresponding +connection, while 1 permits the connection. +
  + +
+ +
Return value: The function returns the value 0 if the operation was +successfull, or non-zero otherwise. +
  +
Availability: The function is only available on computers of the Falcon +series. +
  +
Group: Sound routines +
  +
See also: Binding   buffoper   buffptr   devconnect   gpio   locksnd   +setbuffer   setinterrupt   setmontracks   setmode   settracks   +sndstatus   soundcmd   unlocksnd +
  + +
+ +

4.19.4.1 Bindings for dsptristate

+ + + + + + +
C: #include <tos.h> +
  +
int32_t dsptristate( int16_t dspxmit, int16_t dsprec ); +
  +
Assembler: +
  +
move.w    dsprec,-(sp)   ; Offset 4
+move.w    dspxmit,-(sp)  ; Offset 2
+move.w    #137,-(sp)     ; Offset 0
+trap      #14            ; Call XBIOS
+addq.l    #6,sp          ; Correct stack
+
+ +
+ +

4.19.5 gpio

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »gpio« - Communication via the external DSP port +
  +
Opcode: 138 +
  +
Syntax: int32_t gpio( int16_t mode, int16_t data ); +
  +
Description: The XBIOS routine gpio serves for communication via the +general purpose pins of the external DSP connector. +
  + + + + + + + + + + + + +
mode Meaning +
  +
0 Setting the input/output direction. The lower three bits of +data represent the general purpose pins. A set bit represents +an output pin and a cleared bit an input pin. +
  +
1 Read the three general purpose pins. Their state will be +returned in the lower three bits of the returned value. data +is ignored. +
  +
2 Write the lower three bits of data to the corresponding +general purpose pins. Afterwards the parameter data holds the +new state of the general purpose pins. +
  + +
+ +
Return value: If successful, the function returns the value 0. If the +parameter data had the value 1, one obtains the state of the +general purpose pins. +
  +
Availability: The function is only available on computers of the Falcon +series, or with extended XBIOS routines (_SND). +
  +
Group: Sound routines +
  +
See also: Binding   buffoper   buffptr   devconnect   dsptristate   +locksnd   setbuffer   setinterrupt   setmontracks   setmode   +settracks   sndstatus   soundcmd   unlocksnd +
  + +
+ +

4.19.5.1 Bindings for gpio

+ + + + + + +
C: #include <tos.h> +
  +
int32_t gpio( int16_t mode, int16_t data ); +
  +
Assembler: +
  +
move.w    data,-(sp)   ; Offset 4
+move.w    mode,-(sp)   ; Offset 2
+move.w    #138,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.19.6 locksnd

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »locksnd« - Lock sound system for other applications +
  +
Opcode: 128 +
  +
Syntax: int32_t locksnd( void ); +
  +
Description: The XBIOS routine locksnd locks the sound system to prevent it +being used by other applications at the same time. +
  +
Return value: If successful, the function returns the value 1. If the sound +system is already assigned then a negative value will be returned. +
  +
Availability: The function is only available on computers of the Falcon +series, or with extended XBIOS routines (_SND). +
  +
Group: Sound routines +
  +
See also: Binding   buffoper   buffptr   devconnect   dsptristate   gpio   +setbuffer   setinterrupt   setmontracks   setmode   settracks   +sndstatus   soundcmd   unlocksnd +
  + +
+ +

4.19.6.1 Bindings for locksnd

+ + + + + + +
C: #include <tos.h> +
  +
int32_t locksnd( void ); +
  +
Assembler: +
  +
move.w    #128,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

4.19.7 setbuffer

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »setbuffer« - Set record/playback buffer addresses +
  +
Opcode: 131 +
  +
Syntax: int32_t setbuffer( int16_t reg, void *begaddr, void *endaddr ); +
  +
Description: The XBIOS routine setbuffer sets the buffer address for the +playback (reg = 0) or record data (reg = 1). The +parameter begaddr points to the start of the buffer and +endaddr to the last byte + 1 of the buffer. +
  +
Note: The memory has to be reserved with the Gemdos +function Mxalloc(size, 0). +
  +
Return value: DIf successful the function returns the value 0, or non-zero +otherwise. +
  +
Availability: The function is only available on computers of the Falcon +series, or with extended XBIOS routines (_SND). +
  +
Group: Sound routines +
  +
See also: Binding   buffoper   buffptr   devconnect   dsptristate   gpio   +locksnd   setinterrupt   setmontracks   setmode   settracks   +sndstatus   soundcmd   unlocksnd +
  + +
+ +

4.19.7.1 Bindings for setbuffer

+ + + + + + +
C: #include <tos.h> +
  +
int32_t setbuffer( int16_t reg, void *begaddr, void *endaddr ); +
  +
Assembler: +
  +
pea       endaddr      ; Offset 8
+pea       begaddr      ; Offset 4
+move.w    reg,-(sp)    ; Offset 2
+move.w    #131,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+lea       $C(sp),sp    ; Correct stack
+
+ +
+ +

4.19.8 setinterrupt

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »setinterrupt« - Set interrupt at the end of +recording/playback +
  +
Opcode: 135 +
  +
Syntax: int32_t setinterrupt( int16_t src_inter, int16_t cause ); +
  +
Description: The XBIOS routine setinterrupt determines which interrupt is +to be generated by the sound system when the end of a recording or +playback buffer is reached. +
  + + + + + + + + + + + + +
src_inter Meaning +
    +
0 Timer A interrupt +
1 MFP interrupt 7 + +
+ + + + + + + + + + + + + + + + + + + +
cause Meaning +
    +
0 No interrupt +
1 Interrupt at end of playback buffer +
2 Interrupt at end of record buffer +
3 Interrupt at end of both buffers + +
+ +
Return value: If successful the function returns the value 0, or non-zero +otherwise. +
  +
Availability: The function is only available on computers of the Falcon +series, or with extended XBIOS routines (_SND). +
  +
Group: Sound routines +
  +
See also: Binding   buffoper   buffptr   devconnect   dsptristate   gpio   +locksnd   setbuffer   setmontracks   setmode   settracks   sndstatus   +soundcmd   unlocksnd +
  + +
+ +

4.19.8.1 Bindings for setinterrupt

+ + + + + + +
C: #include <tos.h> +
  +
int32_t setinterrupt( int16_t src_inter, int16_t cause ); +
  +
Assembler: +
  +
move.w    cause,-(sp)      ; Offset 4
+move.w    src_inter,-(sp)  ; Offset 2
+move.w    #135,-(sp)       ; Offset 0
+trap      #14              ; Call XBIOS
+addq.l    #6,sp            ; Correct stack
+
+ +
+ +

4.19.9 setmode

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »setmode« - Select record/playback mode +
  +
Opcode: 132 +
  +
Syntax: int32_t setmode( int16_t mode ); +
  +
Description: The XBIOS routine setmode sets the mode of operation of the +record and playback registers. +
  +

+
+ + + + + + + + + + + + + + + + +
modeMeaning
0 8 Bit stereo
116 Bit stereo
2 8 Bit mono
+
+ +
If bit 5 of the '_SND' cookie is set, there may be further +modes available that set playback and record modes separately in the +low and high byte of mode. If the value of -1 is passed for +mode, then the current setting will be returned without +change. +
  +
0x0003 16 Bit mono playback +
0x0004 24 Bit stereo playback +
0x0005 32 Bit stereo playback +
0x0006 24 Bit mono playback +
0x0007 32 Bit mono playback +
+
  +
0x0000 16 Bit stereo record +
0x0100  8 Bit stereo record +
0x0200  8 Bit mono record +
0x0300 16 Bit mono record +
0x0400 24 Bit stereo record +
0x0500 32 Bit stereo record +
0x0600 24 Bit mono record +
0x0700 32 Bit mono record +
+
  +
Return value: If successful the function returns the value 0, or non-zero +otherwise. +
  +
Availability: The function is only available on computers of the Falcon +series, or with extended XBIOS routines (_SND). +
  +
Group: Sound routines +
  +
See also: Binding   buffoper   buffptr   devconnect   dsptristate   gpio   +locksnd   setbuffer   setinterrupt   setmontracks   settracks   +sndstatus   soundcmd   unlocksnd +
  + +
+ +

4.19.9.1 Bindings for setmode

+ + + + + + +
C: #include <tos.h> +
  +
int32_t setmode( int16_t mode ); +
  +
Assembler: +
  +
move.w    mode,-(sp)   ; Offset 2
+move.w    #132,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.19.10 setmontracks

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »setmontracks« - Set playback track for internal loudspeaker +
  +
Opcode: 134 +
  +
Syntax: int32_t setmontracks( int16_t montrack ); +
  +
Description: The XBIOS routine setmontracks specifies which track should be +output via the internal loudspeaker. This can only play back one track +at a time. +
  +
montrack determines one of the four available tracks to +monitor, which are numbered from 0 to 3. +
  +
Return value: If successful the function returns the value 0, or non-zero +otherwise. +
  +
Availability: The function is only available on computers of the Falcon +series, or with extended XBIOS routines (_SND). +
  +
Group: Sound routines +
  +
See also: Binding   buffoper   buffptr   devconnect   dsptristate   gpio   +locksnd   setbuffer   setinterrupt   setmode   settracks   sndstatus   +soundcmd   unlocksnd +
  + +
+ +

4.19.10.1 Bindings for setmontracks

+ + + + + + +
C: #include <tos.h> +
  +
int32_t setmontracks( int16_t montrack ); +
  +
Assembler: +
  +
move.w    montrack,-(sp)  ; Offset 2
+move.w    #134,-(sp)      ; Offset 0
+trap      #14             ; Call XBIOS
+addq.l    #4,sp           ; Correct stack
+
+ +
+ +

4.19.11 settracks

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »settracks« - Set number of record and playback tracks +
  +
Opcode: 133 +
  +
Syntax: int32_t settracks( int16_t playtracks, int16_t rectracks ); +
  +
Description: The XBIOS routine settracks sets the number of the recording +(rectracks) and playback tracks (playtracks). A +maximum of 4 stereo tracks is available at a time. The value -1 is +passed as the argument! +
  +
Return value: If successful the function returns the value 0, or non-zero +otherwise. +
  +
Availability: The function is only available on computers of the Falcon +series. +
  +
Group: Sound routines +
  +
See also: Binding   buffoper   buffptr   devconnect   dsptristate   gpio   +locksnd   setbuffer   setinterrupt   setmontracks   setmode   +sndstatus   soundcmd   unlocksnd +
  + +
+ +

4.19.11.1 Bindings for settracks

+ + + + + + +
C: #include <tos.h> +
  +
int32_t settracks( int16_t playtracks, int16_t rectracks ); +
  +
Assembler: +
  +
move.w    rectracks,-(sp)   ; Offset 4
+move.w    playtracks,-(sp)  ; Offset 2
+move.w    #133,-(sp)        ; Offset 0
+trap      #14               ; Call XBIOS
+addq.l    #6,sp             ; Correct stack
+
+ +
+ +

4.19.12 sndstatus

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »sndstatus« - Get status of the A/D and D/A converter +
  +
Opcode: 140 +
  +
Syntax: int16_t sndstatus( int16_t reset ); +
  +
Description: The XBIOS routine sndstatus obtains the current status of the +A/D and D/A converter. It can also reinitialize it. +
  +
If reset has the value 1, the A/D and D/A converter will +be reinitialized (among others, the overflow bits will be cleared). +Otherwise the current status will be obtained. +
  +
If bit 5 in the '_SND' cookie is set, some other status +queries are available: +
  +
reset  Function
+       return value
+
+ 2     Inquire bit-depth
+        Bit  0 set: 8Bit
+        Bit  1 set: 16Bit
+        Bit  2 set: 24Bit
+        Bit  3 set: 32Bit
+
+ 3     Inquire available inputs for MasterMix output
+        Bit  0 set: A/D converter (ADC-InMix bypass)
+        Bit  1 set: D/A converter (DAC/Multiplexer)
+        Bit  2 set: Mic
+        Bit  3 set: FM generator
+        Bit  4 set: Line
+        Bit  5 set: CD
+        Bit  6 set: TV
+        Bit  7 set: Aux1
+
+ 4     Inquire available inputs for A/D converter
+        Bit  0 set: Mic right
+        Bit  1 set: Mic left
+        Bit  2 set: FM generator right
+        Bit  3 set: FM generator left
+        Bit  4 set: Line right
+        Bit  5 set: Line left
+        Bit  6 set: CD right
+        Bit  7 set: CD left
+        Bit  8 set: TV right
+        Bit  9 set: TV left
+        Bit 10 set: Aux1 right
+        Bit 11 set: Aux1 left
+        Bit 12 set: Mixer right (MasterMix)
+        Bit 13 set: Mixer left (MasterMix)
+
+        Bit 16 set: D/A converter rechts
+        Bit 17 set: D/A converter left
+
+ 5     Inquire duplex operation
+        Bit  0 set: Simultaneous record/playback
+                    possible
+
+ 8     Inquire 8-bit sample formats
+ 9     Inquire 16-bit sample formats
+10     Inquire 24-bit sample formats
+11     Inquire 32-bit sample formats
+        Bit  0 set: Signed
+        Bit  1 set: Unsigned
+        Bit  2 set: Motorola big-endian if > 8-bit
+        Bit  3 set: Intel little-endian of > 8-bit
+
+0x8900 Inquire value of Falcon030 registers 0xff8900
+       and 0xff8901
+        %0000 xxxx 00xx 00xx
+              ||||   ||   ||
+              ||||   ||   ||>Playback enable
+              ||||   ||   |>Playback repeat
+              ||||   ||>Record enable
+              ||||   |>Record repeat
+              ||||>MFP-15 Int. at Playback end
+              |||>MFP-15 Int. at Record end
+              ||>Timer A Int. at Playback end
+              |>Timer A Int. at Record end
+
+0x8902 Inquire value of Falcon030 registers 0xff8902,
+       0xff8904 and 0xff8906
+        ret = Frame Base Address
+
+0x890e Inquire value of Falcon030 registers 0xff890e,
+       0xff8910 and 0xff8912
+        ret = Frame End Address
+
+0x8920 Inquire value of Falcon030 registers 0xff8920
+       and 0xff8921
+        %00xx 00xx xx00 00xx
+           ||   || ||     ||
+           ||   || ||     ||>00 = 6258 Hz
+           ||   || ||     ||>01 = 12517 Hz
+           ||   || ||     ||>10 = 25033 Hz
+           ||   || ||     ||>11 = 50066 Hz
+           ||   || ||>00 = 8-bit stereo
+           ||   || ||>01 = 16-bit stereo
+           ||   || ||>10 = 8-bit mono
+           ||   || ||>11 = 16-bit mono
+           ||   ||>Play tracks
+           ||>Monitor track
+
+
Return value: If no error occurs, the return will have the value 0. Otherwise +the return represents a LONG bit-vector array showing the current +error status of the sound system, which can be decoded as follows: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
BitsMeaning
0-31  Invalid control field
  2  Invalid sync format
  3  Invalid clock (out of range)
4Left channel clipping has occurred
5Right channel clipping has occurred
+
+ +
Availability: The function is only available on computers of the Falcon +series, or with extended XBIOS routines (_SND). +
  +
Group: Sound routines +
  +
See also: Binding   buffoper   buffptr   devconnect   dsptristate   gpio   +locksnd   setbuffer   setinterrupt   setmontracks   setmode   +settracks   soundcmd   unlocksnd +
  + +
+ +

4.19.12.1 Bindings for sndstatus

+ + + + + + +
C: #include <tos.h> +
  +
int32_t sndstatus( int16_t reset ); +
  +
Assembler: +
  +
move.w    reset,-(sp)  ; Offset 2
+move.w    #140,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.19.13 soundcmd

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Name: »soundcmd« - Set/get the parameters of the A/D and D/A +converter +
  +
Opcode: 130 +
  +
Syntax: int32_t soundcmd( int16_t mode, int16_t data ); +
int32_t NSoundcmd( int16_t mode, int16_t data, int32_t data2); +
  +
Description: The XBIOS routine soundcmd sets or obtains various parameters +of the A/D and D/A converter. The parameter mode determines +the command and data the setting to be performed. +
  + + + + + + + + + + + + + + + + + + + + + + + + +
mode Bedeutung +
  +
0 Set attenuation of the left output channel in 1.5 dB +increments: +
data = Increments << 4; +
  +
1 Set attenuation of the right output channel in 1.5 dB +increments: +
data = Increments << 4; +
  +
2 Set gain of the left input channel in 1.5 dB increments: +
data = Increments << 4; +
  +
3 Set gain of the right input channel in 1.5 dB increments: +
data = Increments << 4; +
  +
4 Set the input source for the 16-bit hardware adder. Bit 0 of +data represents the A/D converter and bit 1 the multiplexer +matrix. +
  +
Ist Bit 5 im _SND Cookie gesetzt stehen noch weitere (Master) +Eingänge zur Verfügung. Die Eingänge werden eingeschaltet sowie das +entsprechende Bit auf 1 gesetzt und Bit 14 in data gesetzt +ist. +
+
  +
Bit 2 of data represents the microphone input +
Bit 3 of data represents the FM generator +
      (frequency modulator, OPLx/Wavetable) +
Bit 4 of data represents the Line input +
Bit 5 of data represents the CD input +
Bit 6 of data represents the TV input +
Bit 7 of data represents the Aux1 input +
+
  +
5 Eingabequellen des A/D-Wandlers. Bit 0 steht für den rechten +und Bit 1 für den linken Kanal. Ist ein Bit gesetzt, wird werden die +Daten dem Soundchip entnommen, sonst dem Mikrophon. +
  +
Ist Bit 5 im '_SND' Cookie gesetzt stehen evtl. noch weitere +(A/D-Wandler) Eingänge zur Verfügung. Die Eingänge werden +eingeschaltet sowie das entsprechende Bit auf 0 gesetzt und Bit 14 von +data auf 1 gesetzt ist. +
  +
Bit  2 is the right FM generator +
Bit  3 is the left FM generator +
Bit  4 is the right Line input +
Bit  5 is the left Line input +
Bit  6 is the right CD input +
Bit  7 is the left CD input +
Bit  8 is the right TV input +
Bit  9 is the left TV input +
Bit 10 is the right Aux1 input +
Bit 11 is the left Aux1 input +
Bit 12 is the right Mixer output +
Bit 13 is the left Mixer output +
+
  +
If bit 14 of data is set to 1, further inputs of the A/D +converter are expected in data2. +
  +
Bit 16 is the right D/A converter output +
Bit 17 is the left D/A converter output +
  +
6 Compatibility to the STE sound system. data is taken as +a prescaler if the prescaler set via devconnect has the value zero: +
  +

+
+ + + + + + + + + + + + + + + + +
0Prescaler divides by 1280 (6.25 MHz)
1Prescaler divides by 640 (12.5 MHz)
2Prescaler divides by 320 (25 MHz)
3Prescaler divides by 160 (50 MHz)
+
+ + +
+ +
Additional mode commands when bit 5 in the '_SND' +cookie is set: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 7 Direct input of the sample frequency. data is +interpreted as an unsigned short and can take a value from 0 to 65534 +Hz. +
Is also present if the cookie McSn is set. +
  +
 8 Setting of the 8-bit sample format +
  +
 9 Setting of the 16-bit sample format +
  +
10 Setting of the 24-bit sample format +
  +
11 Setting of the 32-bit sample format +
  +
The following bits are available at present: +
Bit 0 = Signed +
Bit 1 = Unsigned +
Bit 2 = Motorola big-endian if > 8 bit +
Bit 3 = Intel little-endian if > 8-bit +
  +
12 Gain of the left master output channel. +
data = 0 - 255; +
  +
13 Gain of the right master output channel. +
data = 0 - 255; +
  +
14 Gain of the left Mic input channel. +
data = 0 - 255; +
  +
15 Gain of the right Mic input channel. +
data = 0 - 255; +
  +
16 Gain of the left FM generator input channel. +
data = 0 - 255; +
  +
17 Gain of the right FM generator input channel. +
data = 0 - 255; +
  +
18 Gain of the left Line input channel. +
data = 0 - 255; +
  +
19 Gain of the right Line input channel. +
data = 0 - 255; +
  +
20 Gain of the left CD input channel. +
data = 0 - 255; +
  +
21 Gain of the right CD input channel. +
data = 0 - 255; +
  +
22 Gain of the left TV input channel. +
data = 0 - 255; +
  +
23 Gain of the right TV input channel. +
data = 0 - 255; +
  +
24 Gain of the left Aux1 input channel. +
data = 0 - 255; +
  +
25 Gain of the right Aux1 input channel. +
data = 0 - 255; +
  + +
+ +
If the parameter data is passed the value -1, then the +setting remains unchanged. +
  +
NSoundcmd is an extended version of soundcmd. +
  +
Return value: The function returns the current setting. +
  +
Availability: The function is only available on computers of the Falcon +series, or with extended XBIOS routines (_SND). +
  +
Group: Sound routines +
  +
See also: Binding   buffoper   buffptr   devconnect   dsptristate   gpio   +setbuffer   setinterrupt   setmontracks   setmode   settracks   +sndstatus   unlocksnd   locksnd +
  + +
+ +

4.19.13.1 Bindings for soundcmd

+ + + + + + +
C: #include <tos.h> +
  +
int32_t soundcmd( int16_t mode, int16_t data ); +
int32_t NSoundcmd( int16_t mode, int16_t data, int32_t data2); +
  +
Assembler: +
  +
move.w    data,-(sp)   ; Offset 4
+move.w    mode,-(sp)   ; Offset 2
+move.w    #130,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.19.14 StarTrack

+ + + + + + + + + + + + + + + + + + + + + +
Name: »StarTrack« - XBIOS extension of the StarTrack card +
  +
Opcode: 500 +
  +
Syntax: See the individual subfunctions. +
  +
Description: New XBIOS calls for the StarTrack sound card. +
  +
All functions go via the XBIOS call 500 (xbs=500) and then +split into the various subfunctions. +
  + + + + + + + + + +
play-mode: Comparable with DMA-play on a Falcon +
rec-mode: Comparable with DMA-rec on a Falcon +
bypass-mode: The outputs are connected to the inputs + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  1 installed Cookie XBIOS driver +
 10 cardslot +
 11 cardsel Select sound card +
 12 cardmagic Read sound card magic +
13 cardadr Sound card addresses +
20 digana Digital/Analog input +
21 digcom Digital source +
22 dspmode DSP routing No/Input/Output +
23 sclock Sample rate +
24 highsrate High sampling +
25 bypass Bypass/sample playback +
26 recmode Recording mode +
27 playmode Playback mode +
28 mode24 Matrix data size (16/24-bit) +
30 digmode Digital output Consumer/Professional +
31 scmsmode Clear SCMS +
32 mycopybit Own SCMS copy protection No/One/All +
33 emphasis De-emphasis +
40 digsrate Sample rate recognition from digital input +
41 digcode Digital input record-type code +
42 errorcode Digital input error code +
43 cblmode Reset matrix to CBL mode +
44 cblread Read out the channel status bytes +
45 recstat Recfifo status +
46 playstat Playfifo status +
50 volad Volume controller for input +
51 volda Volume controller for output +
52 readsmp Read a sample +
53 writesmp Write a sample +
54 intact Interrupt release for FIFO +
55 dspintact Interrupt release for DSP +
60 sysreset Clear record FIFO, offset equalization & kickstart for D/A +Reset for A/D, D/A, volume +
61 dspreset Reset for DSP +
70 dspmemory DSP memory mode +
71 clkdivide DSP clock divider +
72 pathset DSP connections +
73 dsp_hostcommand Start DSP host command +
74 dspclear Read out DSP receive buffer +
100 mix Mixes 2,4,6 or 8 stereo channels (= 4,8,12 or 16 tracks) to one +stereo channel +
101 dspmix Mixes or interleaves stereo channels (4,8 or 16 tracks) to +Falcon-compatible 128 bit words +
110 monitor Record & playback bypass +
111 recwait Wait for auto-record threshold +
112 memrec Memory record without interrupt +
113 memplay Memory playback without interrupt +
114 recplay Memory record & playback without interrupt +
115 hardrec HD record without interrupt +
116 hardplay HD playback without interrupt +
117 hrecplay HD record & playback without interrupt +
120 init_peak Peak value output in interrupt +
121 init_imemrec Memory record in interrupt +
122 init_imemplay Memory playback in interrupt +
123 init_implaymix Memory playback & record-mix in interrupt +
124 init_hrec HD record in interrupt +
125 init_hplay HD playback in interrupt +
126 init_ihplaymix HD playback & record-mix in interrupt +
130 init_mrecpeak Memory rec & peak output in interrupt +
131 init_mplaypeak Memory playback & peak output in interrupt +
132 init_mrppeak Memory playback & record-mix & peak output in +interrupt +
133 init_hrecpeak HD rec & peak output in interrupt +
134 init_hplaypeak HD playback & peak output in interrupt +
135 init_hrppeak HD playback & record-mix & peak output in interrupt +
140 init_xmemrec Memory record in half-buffer system +
141 init_xmemplay Memory playback in half-buffer system +
142 init_xmixplay Memory playback & mixing with record in half-buffer system +
143 init_xmemrec4 Memory record in half-buffer system of 4 channels +(analog/digital) +
144 init_xmemplay4 Memory playback in half-buffer system of 4 channels +(analog/digital) +
150 peakshake Peak value handshake (= generate new value) +
200 read_rlow Read low register +
201 read_rhi Read high register +
202 read_rdsp Read dsp register +
203 read_raes Read aes register +
204 read_rint Read interrupt register +
210 wr_rlow Write low register +
211 wr_rhi Write high register +
212 wr_rdsp Write dsp register +
213 wr_raes Write aes register +
214 wr_rint Write interrupt register +
220 read_dpath1 Read dsp dpath1 register +
221 read_dpath2 Read dsp dpath2 register +
222 read_dport Read dsp dport register +
223 read_dconv Read dsp dconv register +
224 read_dpdat Read dsp dpdat register +
225 read_dclk Read dsp dclk register +
230 wr_dpath1 Write dsp dpath1 register +
231 wr_dpath2 Write dsp dpath2 register +
232 wr_dport Write dsp dport register +
233 wr_dconv Write dsp dconv register +
234 wr_dpdat Write dsp dpdat register +
235 wr_dclk Write dsp dclk register +
300 fastcut Clear memory segment in samplemem +
301 peaksuch Peak value search in samplemem +
302 zerono Zero value search in samplemem +
303 fading Sample fading in samplemem + +
+ +
Return value: See the individual subfunctions. +
  +
Availability: The function is only available on computers with the +corresponding cards and their drivers. +
  +
Group: Sound routines +
  + +
+ +

4.19.15 installed

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »installed« - Cookie XBIOS +
  +
Opcode: 500, 1 +
  +
Syntax: int32_t xbios ( 500, 1 ); +
  +
Description: +
  +
Return value: If the value is 0x71273800, then the XBIOS driver is +installed. +
  +
Availability: This function is only available when the driver of the +StarTrack sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.15.1 Bindings for installed

+ + + + + + +
C: int32_t xbios ( 500, 1 ); +
  +
Assembler: +
  +
move.w    #1,-(sp)     ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.19.16 cardslot

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »cardslot« - +
  +
Opcode: 500, 10 +
  +
Syntax: int32_t xbios ( 500, 10 ); +
  +
Description: +
  +
Return value: Number of installed sound cards (1-8). +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.16.1 Bindings for cardslot

+ + + + + + +
C: int32_t xbios ( 500, 10 ); +
  +
Assembler: +
  +
move.w    #10,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.19.17 cardsel

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »cardsel« - Select sound card +
  +
Opcode: 500, 11 +
  +
Syntax: int32_t xbios ( 500, 11, int16_t csel ); +
  +
Description: csel selected sound card (1-8). +
  +
Important: +
All further function calls refer to the sound card selected here! +
  +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.17.1 Bindings for cardsel

+ + + + + + +
C: int32_t xbios ( 500, 11, int16_t csel ); +
  +
Assembler: +
  +
move.w    csel,-(sp)   ; Offset 4
+move.w    #11,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.19.18 cardmagic

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »cardmagic« - Read sound card magic +
  +
Opcode: 500, 12 +
  +
Syntax: int32_t xbios ( 500, 12); +
  +
Description: +
  +
Return value: +
  + + + + + + + + + + + + + + + + + + +
bit 0 = 1 Second volume controller for output present +
bit 1 = 1 XLR extension present +
bit 2 = 1 Digital ports (SP/DIF) present +
bit 3 = 1 96kHz high sampling possible +
bit 4 = 1 A/D and D/A converters present +
bit 5 = 1 DSP56002 present + +
+ +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.18.1 Bindings for cardmagic

+ + + + + + +
C: int32_t xbios ( 500, 12); +
  +
Assembler: +
  +
move.w    #12,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.19.19 cardadr

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »cardadr« - Sound card addresses +
  +
Opcode: 500, 13 +
  +
Syntax: int32_t xbios ( 500, 13 ); +
  +
Description: +
  +
Return value: Points to the start address showing where the various sound +card addresses are stored (see also register description): +
  + + + + + + + + + + + + +
int32_t sample Address sample read/write +
int32_t recstat Address recordfifo status +
int32_t playstat Address playfifo status +
int32_t dsp Address dsp host + +
+ +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.19.1 Bindings for cardadr

+ + + + + + +
C: int32_t xbios ( 500, 13 ); +
  +
Assembler: +
  +
move.w    #13,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.19.20 digana

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »digana« - Digital/Analog input +
  +
Opcode: 500, 20 +
  +
Syntax: int32_t xbios ( 500, 20, int16_t input ); +
  +
Description: input: Select the input +
0 - Digital input +
1 - Analog input +
+
  +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.20.1 Bindings for digana

+ + + + + + +
C: int32_t xbios ( 500, 20, int16_t input ); +
  +
Assembler: +
  +
move.w    input,-(sp)  ; Offset 4
+move.w    #20,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.19.21 digcom

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »digcom« - Digitalquelle +
  +
Opcode: 500, 21 +
  +
Syntax: int32_t xbios ( 500, 21, int16_t dq ); +
  +
Description: dq: Select the digital source +
0 - opto (TOSLINK) +
1 - Cinch (phono socket) +
2 - XLR (AES/EBU) +
+
  +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.21.1 Bindings for digcom

+ + + + + + +
C: int32_t xbios ( 500, 21, int16_t dq ); +
  +
Assembler: +
  +
move.w    dq,-(sp)     ; Offset 4
+move.w    #21,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.19.22 dspmode

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »dspmode« - Dsp routing No/Input/Output +
  +
Opcode: 500, 22 +
  +
Syntax: int32_t xbios ( 500, 22, int16_t dspmode ); +
  +
Description: dspmode: Selection of the DSP output path +
0 - dspoff - DSP output not in signal path +
1 - dsp_to_rec - DSP output in record signal path +
2 - dsp_to_play - DSP output in playback signal path +
+
  +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.22.1 Bindings for dspmode

+ + + + + + +
C: int32_t xbios ( 500, 22, int16_t dspmode ); +
  +
Assembler: +
  +
move.w    playstat,-(sp) ; Offset 4
+move.w    #22,-(sp)      ; Offset 2
+move.w    #500,-(sp)     ; Offset 0
+trap      #14            ; Call XBIOS
+addq.l    #6,sp          ; Correct stack
+
+ +
+ +

4.19.23 sclock

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »sclock« - Sample rate +
  +
Opcode: 500, 23 +
  +
Syntax: int32_t xbios ( 500, 23, int16_t srate ); +
  +
Description: srate: Selection of the DSP output clock +
0 - digital_pll - Use clock input at digital input +
1 - 32kHz +
2 - 44.1kHz +
3 - 48kHz +
4 - 8kHz +
5 - 11kHz +
6 - 16kHz +
7 - 16.5kHz +
8 - 22kHz +
9 - 22kHz +
10 - 24kHz +
11 - 33kHz +
12 - Ext/768 +
13 - Ext/512 +
14 - Ext/384 +
15 - Ext/256 +
+
  +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.23.1 Bindings for sclock

+ + + + + + +
C: int32_t xbios ( 500, 23, int16_t srate ); +
  +
Assembler: +
  +
move.w    srate,-(sp)  ; Offset 4
+move.w    #23,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.19.24 highsrate

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »highsrate« - High sampling +
  +
Opcode: 500, 24 +
  +
Syntax: int32_t xbios ( 500, 24, int16_t hs ); +
  +
Description: hs: High sampling with 96kHz +
0 - No high sampling +
1 - Select high sampling +
+
  +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding   +
  + +
+ +

4.19.24.1 Bindings for highsrate

+ + + + + + +
C: int32_t xbios ( 500, 24, int16_t hs ); +
  +
Assembler: +
  +
move.w    hs,-(sp)     ; Offset 4
+move.w    #24,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.19.25 bypass

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »bypass« - Bypass/sample playback +
  +
Opcode: 500, 25 +
  +
Syntax: int32_t xbios ( 500, 25, int16_t bypass ); +
  +
Description: bypass: Output source +
0 - Bypass - Outputs are connected to the input +
1 - Play - Outputs obtain their data from the playback hardware +
+
  +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.25.1 Bindings for bypass

+ + + + + + +
C: int32_t xbios ( 500, 25, int16_t bypass ); +
  +
Assembler: +
  +
move.w    bypass,-(sp) ; Offset 4
+move.w    #25,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.19.26 recmode

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »recmode« - Recording mode +
  +
Opcode: 500, 26 +
  +
Syntax: int32_t xbios ( 500, 26, int16_t mrec ); +
  +
Description: mrec: Recording type +
0 - Normal - 2-channel recording in 64-bit mode +
1 - Four - 4-channel recording in 64-bit mode via A/D and +digital-in +
2 - Eight - 8-channel recording in 128-bit mode +
+
  +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.26.1 Bindings for recmode

+ + + + + + +
C: int32_t xbios ( 500, 26, int16_t mrec ); +
  +
Assembler: +
  +
move.w    mrec,-(sp)   ; Offset 4
+move.w    #26,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.19.27 playmode

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »playmode« - Playback mode +
  +
Opcode: 500, 27 +
  +
Syntax: int32_t xbios ( 500, 27, int16_t mplay ); +
  +
Description: mplay: Playback type +
0 - Normal - 2-channel playback in 64-bit mode +
1 - Four - 4-channel playback in 64-bit mode via D/A and +digital-out +
2 - Eight - 8-channel playback in 128-bit mode +
3 - Sixteen - 16-channel playback in 128-bit mode +
+
  +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.27.1 Bindings for playmode

+ + + + + + +
C: int32_t xbios ( 500, 27, int16_t mplay ); +
  +
Assembler: +
  +
move.w    mplay,-(sp)  ; Offset 4
+move.w    #27,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.19.28 mode24

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »mode24« - Matrix data size (16/24-bit) +
  +
Opcode: 500, 28 +
  +
Syntax: int32_t xbios ( 500, 28, int16_t mode24 ); +
  +
Description: mode24: Matrix data type +
0 - Normal - 16-bit data transfer +
1 - Extended - 24-bit data transfer +
+
  +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.28.1 Bindings for mode24

+ + + + + + +
C: int32_t xbios ( 500, 28, int16_t mode24 ); +
  +
Assembler: +
  +
move.w    mode24,-(sp) ; Offset 4
+move.w    #28,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #8,sp        ; Correct stack
+
+ +
+ +

4.19.29 digmode

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »digmode« - Digital output consumer/professional +
  +
Opcode: 500, 30 +
  +
Syntax: int32_t xbios ( 500, 30, int16_t digmode ); +
  +
Description: digmode: Select the SP/DIF output format +
0 - consumer - Output in consumer format (HIFI-devices) +
1 - professional - Output in professional format (studio +equipment) +
+
  +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.29.1 Bindings for digmode

+ + + + + + +
C: int32_t xbios ( 500, 30, int16_t digmode ); +
  +
Assembler: +
  +
move.w    digmode,-(sp) ; Offset 4
+move.w    #30,-(sp)     ; Offset 2
+move.w    #500,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+addq.l    #6,sp         ; Correct stack
+
+ +
+ +

4.19.30 scmsmode

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »scmsmode« - Clear SCMS +
  +
Opcode: 500, 31 +
  +
Syntax: int32_t xbios ( 500, 31, int16_t scmsmode ); +
  +
Description: scmsmode: Copy protection +
0 - Bypass - Route digital input data unchanged to the output +
1 - Clear - Completely remove SCMS copy protection +
+
  +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.30.1 Bindings for scmsmode

+ + + + + + +
C: int32_t xbios ( 500, 31, int16_t scmsmode ); +
  +
Assembler: +
  +
move.w    scmsmode,-(sp) ; Offset 4
+move.w    #31,-(sp)      ; Offset 2
+move.w    #500,-(sp)     ; Offset 0
+trap      #14            ; Call XBIOS
+addq.l    #6,sp          ; Correct stack
+
+ +
+ +

4.19.31 mycopybit

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »mycopybit« - Own SCMS copy protection No/One/All +
  +
Opcode: 500, 32 +
  +
Syntax: int32_t xbios ( 500, 32, int16_t myscms ); +
  +
Description: myscms: Copy protection for digit output in playback +
0 - No - No copying possible +
1 - One - One-time copying possible +
2 - All - No copy protection, free copying possible +
+
  +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.31.1 Bindings for mycopybit

+ + + + + + +
C: int32_t xbios ( 500, 32, int16_t myscms ); +
  +
Assembler: +
  +
move.w    myscms,-(sp) ; Offset 4
+move.w    #32,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.19.32 emphasis

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »emphasis« - De-emphasis +
  +
Opcode: 500, 33 +
  +
Syntax: int32_t xbios ( 500, 33, int16_t emph ); +
  +
Description: emph: De-emphasis (top cut), works on digital output +(in playback mode) and analog output +
0 - Normal - No top cut +
1 - De-emphasis - Top cut +
+
  +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.32.1 Bindings for emphasis

+ + + + + + +
C: int32_t xbios ( 500, 33, int16_t emph ); +
  +
Assembler: +
  +
move.w    emph,-(sp)   ; Offset 4
+move.w    #33,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.19.33 digsrate

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »digsrate« - Sample rate recognition from digital input +
  +
Opcode: 500, 40 +
  +
Syntax: int32_t xbios ( 500, 40 ); +
  +
Description: +
  +
Return value: 0 -> Invalid +
1 -> 32kHz +
2 -> 44.1kHz +
3 -> 48kHz +
+
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.33.1 Bindings for digsrate

+ + + + + + +
C: int32_t xbios ( 500, 40 ); +
  +
Assembler: +
  +
move.w    #40,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.19.34 digcode

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »digcode« - Digital input record-type code +
  +
Opcode: 500, 41 +
  +
Syntax: int32_t xbios ( 500, 41 ); +
  +
Description: +
  +
Return value: +
  + + + + + + + + + + + + +
bit 0 0 = Professional +
1 = Consumer +
bit 1 0 = Data +
1 = Audio +
bit 2 0 = No copy-prohibit = SCMS not active +
1 = Copy prohibit=SCMS active +
bit 3 0 = No emphasis +
1 = Emphasis active + +
+ +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.34.1 Bindings for digcode

+ + + + + + +
C: int32_t xbios ( 500, 41 ); +
  +
Assembler: +
  +
move.w    #41,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.19.35 errorcode

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »errorcode« - Digital input error code +
  +
Opcode: 500, 42 +
  +
Syntax: int32_t xbios ( 500, 42 ); +
  +
Description: +
  +
Return value: 0 -> No error +
1 -> Validity bit high +
2 -> Confidence flag +
3 -> Slipped sample +
4 -> CRC-error +
5 -> Parity error +
6 -> Biphase coding error +
7 -> No lock +
+
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.35.1 Bindings for errorcode

+ + + + + + +
C: int32_t xbios ( 500, 42 ); +
  +
Assembler: +
  +
move.w    #42,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.19.36 cblmode

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »cblmode« - Reset matrix to CBL mode +
  +
Opcode: 500, 43 +
  +
Syntax: int32_t xbios ( 500, 43, int16_t cblmode ); +
  +
Description: cblmode: Channel status-block read mode +
0 - normal - No cbl mode, matrix transports sound data +
1 - cblread - Cbl mode, matrix transports status bits from digital +input +
+
  +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.36.1 Bindings for cblmode

+ + + + + + +
C: int32_t xbios ( 500, 43, int16_t cblmode ); +
  +
Assembler: +
  +
move.w    cblmode,-(sp) ; Offset 4
+move.w    #43,-(sp)     ; Offset 2
+move.w    #500,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+addq.l    #6,sp         ; Correct stack
+
+ +
+ +

4.19.37 cblread

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »cblread« - Read out the channel status bytes +
  +
Opcode: 500, 44 +
  +
Syntax: int32_t xbios ( 500, 44 ); +
  +
Description: +
  +
Return value: Points to the start address where the 24 status bytes are +stored: +
  +
int8_t cbl0 : Channel status byte 0 : Bit 7 -> Channel status +bit 0 +
int8_t cbl0 : Channel status byte 0 : Bit 6 -> Channel status +bit 1 +
int8_t cbl0 : Channel status byte 0 : Bit 5 -> Channel status +bit 2 +
int8_t cbl0 : Channel status byte 0 : Bit 4 -> Channel status +bit 3 +
int8_t cbl0 : Channel status byte 0 : Bit 3 -> Channel status +bit 4 +
int8_t cbl0 : Channel status byte 0 : Bit 2 -> Channel status +bit 5 +
int8_t cbl0 : Channel status byte 0 : Bit 1 -> Channel status +bit 6 +
int8_t cbl0 : Channel status byte 0 : Bit 0 -> Channel status +bit 7 +
... int8_t cbl23 : Channel status byte 23 +
+
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.37.1 Bindings for cblread

+ + + + + + +
C: int32_t xbios ( 500, 44 ); +
  +
Assembler: +
  +
move.w    #44,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.19.38 recstat

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »recstat« - Recfifo status +
  +
Opcode: 500, 45 +
  +
Syntax: int32_t xbios ( 500, 45 ); +
  +
Description: +
  +
Return value: +
  + + + + + + + + + +
bit 0 0 = FIFO empty +
1 = FIFO not empty +
bit 1 0 = FIFO more than half-full, triggers interrupt +
1 = FIFO less than/up to half-full +
bit 2 0 = FIFO full +
1 = FIFO not full + +
+ +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.38.1 Bindings for recstat

+ + + + + + +
C: int32_t xbios ( 500, 45 ); +
  +
Assembler: +
  +
move.w    #45,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.19.39 playstat

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »playstat« - Playfifo status +
  +
Opcode: 500, 46 +
  +
Syntax: int32_t xbios ( 500, 46 ); +
  +
Description: +
  +
Return value: +
  + + + + + + + + + +
bit 0 0 = FIFO empty +
1 = FIFO not empty +
bit 1 0 = FIFO more than half-full +
1 = FIFO less than/up to half-full, triggers interrupt +
bit 2 0 = FIFO full +
1 = FIFO not full + +
+ +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.39.1 Bindings for playstat

+ + + + + + +
C: int32_t xbios ( 500, 46 ); +
  +
Assembler: +
  +
move.w    #46,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.19.40 volad

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »volad« - Volume controller for input +
  +
Opcode: 500, 50 +
  +
Syntax: int32_t xbios ( 500, 50, int16_t lvol, int16_t rvol ); +
  +
Description: lvol: Volume of left channel in 0.5db steps (0-255) +
rvol: Volume of right channel in 0.5db steps (0-255) +
  +
The volume controller can operate in the region of -96dB to ++32dB: +
  +

+
+ + + + + + + + + + + + + + + + +
ValuedB
0-96
1920
255+31.5
+
+ +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.40.1 Bindings for volad

+ + + + + + +
C: int32_t xbios ( 500, 50, int16_t lvol, int16_t rvol ); +
  +
Assembler: +
  +
move.w    rvol,-(sp)   ; Offset 6
+move.w    lvol,-(sp)   ; Offset 4
+move.w    #50,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #8,sp        ; Correct stack
+
+ +
+ +

4.19.41 volda

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »volda« - Volume controller for output +
  +
Opcode: 500, 51 +
  +
Syntax: int32_t xbios ( 500, 51, int16_t lvol, int16_t rvol ); +
  +
Description: lvol: Volume of left channel in 0.5db steps (0-255) +
rvol: Volume of right channel in 0.5db steps (0-255) +
  +
The volume controller can operate in the region of -96dB to ++31.5dB: +
  +

+
+ + + + + + + + + + + + + + + + +
ValuedB
0-96
1920
255+31.5
+
+ +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.41.1 Bindings for volda

+ + + + + + +
C: int32_t xbios ( 500, 51, int16_t lvol, int16_t rvol ); +
  +
Assembler: +
  +
move.w    rvol,-(sp)   ; Offset 6
+move.w    lvol,-(sp)   ; Offset 4
+move.w    #51,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #8,sp        ; Correct stack
+
+ +
+ +

4.19.42 readsmp

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »readsmp« - Read a sample +
  +
Opcode: 500, 52 +
  +
Syntax: int32_t xbios ( 500, 52 ); +
  +
Description: +
  +
Return value: Address return value, -1 = Error +
int16_t 0 left +
int16_t 2 right +
+
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.42.1 Bindings for readsmp

+ + + + + + +
C: int32_t xbios ( 500, 52 ); +
  +
Assembler: +
  +
move.w    #52,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.19.43 writesmp

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »writesmp« - Write a sample +
  +
Opcode: 500, 53 +
  +
Syntax: int32_t xbios ( 500, 53, int16_t left, int16_t right ); +
  +
Description: left : Sample value left +
right: Sample value right +
  +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See Also: Binding +
  + +
+ +

4.19.43.1 Bindings for writesmp

+ + + + + + +
C: int32_t xbios ( 500, 53, int16_t left, int16_t right ); +
  +
Assembler: +
  +
move.w    right,-(sp)  ; Offset 6
+move.w    left,-(sp)   ; Offset 4
+move.w    #53,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #8,sp        ; Correct stack
+
+ +
+ +

4.19.44 intact

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »intact« - Interrupt release for FIFO +
  +
Opcode: 500, 54 +
  +
Syntax: int32_t xbios ( 500, 54, int16_t int ); +
  +
Description: int: +
  + + + + + + +
bit 0 0 = Stop playback +
1 = Start playback +
bit 1 0 = Stop recording +
1 = Start recording + +
+ +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.44.1 Bindings for intact

+ + + + + + +
C: int32_t xbios ( 500, 54, int16_t int ); +
  +
Assembler: +
  +
move.w    int,-(sp)    ; Offset 4
+move.w    #54,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.19.45 dspintact

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »dspintact« - Interrupt release for DSP +
  +
Opcode: 500, 55 +
  +
Syntax: int32_t xbios ( 500, 55, int16_t dint ); +
  +
Description: dint: +
  + + + + + + +
bit 0 0 = Stop dsp-receive +
1 = Start dsp-receive +
bit 1 0 = Stop dsp-transmit +
1 = Start dsp-transmit + +
+ +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.45.1 Bindings for dspintact

+ + + + + + +
C: int32_t xbios ( 500, 55, int16_t dint ); +
  +
Assembler: +
  +
move.w    dint,-(sp)   ; Offset 4
+move.w    #55,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.19.46 sysreset

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »sysreset« - Clear record FIFO +
  +
Opcode: 500, 60 +
  +
Syntax: int32_t xbios ( 500, 60 ); +
  +
Description: Clear record FIFO, offset equalization & kickstart for D/A, +reset for A/D, D/A, volume controller, digital SP/DIF chips +
  +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.46.1 Bindings for sysreset

+ + + + + + +
C: int32_t xbios ( 500, 60 ); +
  +
Assembler: +
  +
move.w    #60,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.19.47 dspreset

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »dspreset« - Reset for DSP +
  +
Opcode: 500, 61 +
  +
Syntax: int32_t xbios ( 500, 61 ); +
  +
Description: Resets the DSP +
  +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.47.1 Bindings for dspreset

+ + + + + + +
C: int32_t xbios ( 500, 61 ); +
  +
Assembler: +
  +
move.w    #61,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.19.48 dspmemory

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »dspmemory« - DSP memory mode +
  +
Opcode: 500, 70 +
  +
Syntax: int32_t xbios ( 500, 70, int16_t dspmem ); +
  +
Description: dspmem: DSP memory mode +
0 - Normal - 32Kx24-bit Falcon-compatible mode +
1 - Big - 128Kx24-bit extended mode +
+
  +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.48.1 Bindings for dspmemory

+ + + + + + +
C: int32_t xbios ( 500, 70, int16_t dspmem ); +
  +
Assembler: +
  +
move.w    dspmem,-(sp) ; Offset 4
+move.w    #70,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.19.49 clkdivide

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »clkdivide« - DSP clock divider +
  +
Opcode: 500, 71 +
  +
Syntax: int32_t xbios ( 500, 71, int16_t clkdiv ); +
  +
Description: clkdiv: DSP clock division factor +
+
  +
Clock of CKOUT of the DSP (at 25.175 MHz DSP clock)
+Input -> ICLK_output/Converter_prescaler -> Sample rate
+clkdiv        -> Output        -> Sample rate
+------------------------------------------------
+0000=CKOUT/1  -> 25.175MHz/512 -> 49170 Hz
+0001=CKOUT/2  -> 12.587MHz/256 -> 49170 Hz
+0010=CKOUT/2  -> 12.587MHz/256 -> 49170 Hz
+0011=CKOUT/3  ->  8.392MHz/256 -> 32780 Hz
+0100=CKOUT/4  ->  6.294MHz/256 -> 24585 Hz
+0101=CKOUT/5  ->  5.035MHz/256 -> 19668 Hz
+0110=CKOUT/6  ->  4.196MHz/256 -> 16390 Hz
+0111=CKOUT/7  ->  3.596MHz/256 -> 14049 Hz
+1000=CKOUT/8  ->  3.147MHz/256 -> 12292 Hz
+1001=CKOUT/9  ->  2.797MHz/256 -> 10927 Hz
+1010=CKOUT/10 ->  2.518MHz/256 ->  9833 Hz
+1011=CKOUT/11 ->  2.289MHz/256 ->  8940 Hz
+1100=CKOUT/12 ->  2.098MHz/256 ->  8195 Hz
+1101=CKOUT/13 ->  1.937MHz/256 ->  7565 Hz
+1110=CKOUT/14 ->  1.798MHz/256 ->  7024 Hz
+1111=CKOUT/15 ->  1.678MHz/256 ->  6556 Hz
+
+Clock of CKOUT of the DSP (at 66.00 MHz DSP clock)
+Input -> ICLK_output/Converter_prescaler -> Sample rate
+clkdiv        -> Output        -> Sample rate
+----------------------------------------------------
+0000=CKOUT/1  -> 66.000MHz/768 ->  85938 Hz
+0001=CKOUT/2  -> 33.000MHz/512 ->  64453 Hz
+0010=CKOUT/2  -> 33.000MHz/512 ->  64453 Hz
+0011=CKOUT/3  -> 22.000MHz/512 ->  42969 Hz
+0100=CKOUT/4  -> 16.500MHz/512 ->  32227 Hz
+0101=CKOUT/5  -> 13.200MHz/512 ->  25781 Hz
+0110=CKOUT/6  -> 11.000MHz/512 ->  21484 Hz
+0111=CKOUT/7  ->  9.428MHz/512 ->  18415 Hz
+1000=CKOUT/8  ->  8.250MHz/512 ->  16113 Hz
+1001=CKOUT/9  ->  7.333MHz/512 ->  14323 Hz
+1010=CKOUT/10 ->  6.600MHz/512 ->  12891 Hz
+1011=CKOUT/11 ->  6.000MHz/512 ->  11719 Hz
+1100=CKOUT/12 ->  5.500MHz/512 ->  10742 Hz
+1101=CKOUT/13 ->  5.077MHz/512 ->   9916 Hz
+1110=CKOUT/14 ->  4.714MHz/512 ->   9208 Hz
+1111=CKOUT/15 ->  4.400MHz/512 ->   8594 Hz
+
+
Further clock rates are possible (Converter_prescaler /256, +/384, /512 and /768 are usable, so in total 64 new clock rates with +CLKDIV!) +
  +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.49.1 Bindings for clkdivide

+ + + + + + +
C: int32_t xbios ( 500, 71, int16_t clkdiv ); +
  +
Assembler: +
  +
move.w    clkdiv,-(sp) ; Offset 4
+move.w    #71,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.19.50 pathset

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »pathset« - DSP connections +
  +
Opcode: 500, 72 +
  +
Syntax: int32_t xbios ( 500, 72, int16_t path ); +
  +
Description: path: DSP connections +
Bit 0 - Connection of matrix to SC0 of the DSP (0 = disconnected, +1 = connected) +
Bit 1 - Connection of matrix to SC1 of the DSP (0 = disconnected, +1 = connected) +
Bit 2 - Connection of matrix to SC2 of the DSP (0 = disconnected, +1 = connected) +
Bit 3 - Connection of matrix to SRD of the DSP (0 = disconnected, +1 = connected) +
+
  +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.50.1 Bindings for pathset

+ + + + + + +
C: int32_t xbios ( 500, 72, int16_t path ); +
  +
Assembler: +
  +
move.w    path,-(sp)   ; Offset 4
+move.w    #72,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.19.51 dsp_hostcommand

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »dsp_hostcommand« - Start DSP host command +
  +
Opcode: 500, 73 +
  +
Syntax: int32_t xbios ( 500, 73, int16_t command ); +
  +
Description: command: DSP command number +
 0 - DSP host command (DSP address $0024, default) +
... +
11 - DSP host command (DSP address $003A) +
14 - DSP host command (DSP address $0040) +
... +
45 - DSP host command (DSP address $007E) +
+
  +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.51.1 Bindings for dsp_hostcommand

+ + + + + + +
C: int32_t xbios ( 500, 73, int16_t command ); +
  +
Assembler: +
  +
move.w    command,-(sp) ; Offset 4
+move.w    #73,-(sp)     ; Offset 2
+move.w    #500,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+addq.l    #6,sp         ; Correct stack
+
+ +
+ +

4.19.52 dspclear

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »dspclear« - Read out DSP receive buffer +
  +
Opcode: 500, 74 +
  +
Syntax: int32_t xbios ( 500, 74 ); +
  +
Description: +
  +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.52.1 Bindings for dspclear

+ + + + + + +
C: int32_t xbios ( 500, 74 ); +
  +
Assembler: +
  +
move.w    #74,-(sp)    ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.19.53 mix

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »mix« - Mixes 2, 4, 6 or 8 stereo channels +
  +
Opcode: 500, 100 +
  +
Syntax: int32_t xbios ( 500, 100, int16_t channels, int32_t startadr, +int32_t len, int32_t zieladr, int32_t voltab ); +
  +
Description: Mixes 2, 4, 6 or 8 stereo channels (= 4, 8, 12 or 16 tracks) to +one stereo channel +
  + + + + + + + + + + + + + + + +
channels Number of tracks (4, 8, 12 or 16) +
startradr Start address of tracks to be mixed +
len Length of a stereo track +
zieladr Start address for the mixed stereo track +
voltab Pointer to track volume value table +
int8_t VOL-STEREOTRACK1 +
int8_t VOL-STEREOTRACK2 etc. +
... +
int8_t VOL-STEREOTRACK8 +
+ +
+ +
The tracks to be mixed lie in memory as stereo tracks following +each other. The volume value table contains the sound volume for the +individual channels in the region 0-200: +
  0 = Mute +
 50 = Half volume +
100 = Original volume +
200 = Double volume +
+
  +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.53.1 Bindings for mix

+ + + + + + +
C: int32_t xbios ( 500, 100, int16_t channels, int32_t startadr, +int32_t len, int32_t zieladr, int32_t voltab ); +
  +
Assembler: +
  +
move.l    voltab,-(sp)     ; Offset 18
+move.l    zieladr,-(sp)    ; Offset 14
+move.l    len,-(sp)        ; Offset 10
+move.l    startdar,-(sp)   ; Offset 6
+move.w    channels,-(sp)   ; Offset 4
+move.w    #100,-(sp)       ; Offset 2
+move.w    #500,-(sp)       ; Offset 0
+trap      #14              ; Call XBIOS
+lea       22(sp),sp        ; Correct stack
+
+ +
+ +

4.19.54 dspmix

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »dspmix« - Mix or interleave stereo channels +
  +
Opcode: 500, 101 +
  +
Syntax: int32_t xbios ( 500, 101, int16_t channels, int32_t startadr, +int32_t len, int32_t zieladr ); +
  +
Description: Mixes or interleaves stereo channels (4, 8 or 16 tracks) to +Falcon-compatible 128-bit words +
  + + + + + + + + + + + + +
channels 4, 8 or 16 tracks +
startradr Start address of tracks to be mixed +
len Length of a stereo track +
zieladr Start address for the mixed stereo track + +
+ +
The tracks to be mixed lie in memory as stereo tracks following +each other. The volume value table contains the sound volume for the +individual channels in the region 0-200: +
  0 = Mute +
 50 = Half volume +
100 = Original volume +
200 = Double volume +
+
  +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.54.1 Bindings for dspmix

+ + + + + + +
C: int32_t xbios ( 500, 101, int16_t channels, int32_t startadr, +int32_t len, int32_t zieladr ); +
  +
Assembler: +
  +
move.l    zieladr,-(sp)    ; Offset 14
+move.l    len,-(sp)        ; Offset 10
+move.l    startdar,-(sp)   ; Offset 6
+move.w    channels,-(sp)   ; Offset 4
+move.w    #101,-(sp)       ; Offset 2
+move.w    #500,-(sp)       ; Offset 0
+trap      #14              ; Call XBIOS
+lea       18(sp),sp        ; Correct stack
+
+ +
+ +

4.19.55 monitor

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »monitor« - Record & playback bypass +
  +
Opcode: 500, 110 +
  +
Syntax: int32_t xbios ( 500, 110 ); +
  +
Description: +
  +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.55.1 Bindings for monitor

+ + + + + + +
C: int32_t xbios ( 500, 110 ); +
  +
Assembler: +
  +
move.w    #110,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.19.56 recwait

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »recwait« - Wait for auto-record threshold +
  +
Opcode: 500, 111 +
  +
Syntax: int32_t xbios ( 500, 111, int16_t treshold ); +
  +
Description: treshold: Threshold (0-32767) +
  +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.56.1 Bindings for recwait

+ + + + + + +
C: int32_t xbios ( 500, 111, int16_t treshold ); +
  +
Assembler: +
  +
move.w    treshold,-(sp)  ; Offset 4
+move.w    #111,-(sp)      ; Offset 2
+move.w    #500,-(sp)      ; Offset 0
+trap      #14             ; Call XBIOS
+addq.l    #6,sp           ; Correct stack
+
+ +
+ +

4.19.57 memrec

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »memrec« - Memory record without interrupt +
  +
Opcode: 500, 112 +
  +
Syntax: int32_t xbios ( 500, 112, int32_t startadr, int32_t endadr ); +
  +
Description: startradr: Recording start address +
endadr: Recording end address +
  +
Warning: Sound disappears, faulty! +
  +
Return value: Last recording memory position +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.57.1 Bindings for memrec

+ + + + + + +
C: int32_t xbios ( 500, 112, int32_t startadr, int32_t endadr ); +
  +
Assembler: +
  +
move.l    endadr,-(sp)    ; Offset 8
+move.l    startadr,-(sp)  ; Offset 4
+move.w    #112,-(sp)      ; Offset 2
+move.w    #500,-(sp)      ; Offset 0
+trap      #14             ; Call XBIOS
+lea       12(sp),sp       ; Correct stack
+
+ +
+ +

4.19.58 memplay

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »memplay« - Memory playback without interrupt +
  +
Opcode: 500, 113 +
  +
Syntax: int32_t xbios ( 500, 113, int32_t startadr, int32_t endadr, +int16_t step, int16_t mode, int16_t midi ); +
  +
Description: +
  + + + + + + + + + + + + + + + +
startradr Playback start address +
endadr Playback end address (plays backwards if endadr<startadr) +
step Playback speed (0..x) +
0 = Normal +
1 = Double +
2 = Triple etc... +
mode bit 0 -> Loop +
bit 1 -> Crossplay +
bit 2 -> MIDI +
midi MIDI note, at which playback is to start, is only specified +when mode bit 2 is set! + +
+ +
Warning: MIDI not tested! +
  +
Return value: Address return values, -1 = Error +
int32_t 0 Memposition +
int32_t 4 Loops (1 = played once, 2 = twice etc.) +
Each crossplay = two loops (for forwards & backwards) +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.58.1 Bindings for memplay

+ + + + + + +
C: int32_t xbios ( 500, 113, int32_t startadr, int32_t endadr, +int16_t step, int16_t mode, int16_t midi ); +
  +
Assembler: +
  +
move.w    midi,-(sp)      ; Offset 16
+move.w    mode,-(sp)      ; Offset 14
+move.w    step,-(sp)      ; Offset 12
+move.l    endadr,-(sp)    ; Offset 8
+move.l    startadr,-(sp)  ; Offset 4
+move.w    #113,-(sp)      ; Offset 2
+move.w    #500,-(sp)      ; Offset 0
+trap      #14             ; Call XBIOS
+lea       18(sp),sp       ; Correct stack
+
+ +
+ +

4.19.59 recplay

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »recplay« - Memory record & playback without interrupt +
  +
Opcode: 500, 114 +
  +
Syntax: int32_t xbios ( 500, 114 ); +
  +
Description: No information available! +
  +
Return value: +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.59.1 Bindings for recplay

+

Unbekannt! +

+ + + + + + +
C: int32_t xbios ( 500, 114 ); +
  +
Assembler: +
  +
move.w    #114,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.19.60 hardrec

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »hardrec« - HD record without interrupt +
  +
Opcode: 500, 115 +
  +
Syntax: int32_t xbios ( 500, 115, int32_t startadr, int32_t len, +int32_t sectors, int16_t handle ); +
  +
Description: +
  + + + + + + + + + + + + +
startadr Record buffer start address +
len Record buffer length or sectors +
sectors Number of record sectors (determined by len) +
handle Handle of record file + +
+ +
Warning: Dropout due to too small FIFO! +
  +
Return value: Number of completely written sectors, -1 = Error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.60.1 Bindings for hardrec

+ + + + + + +
C: int32_t xbios ( 500, 115, int32_t startadr, int32_t len, +int32_t sectors, int16_t handle ); +
  +
Assembler: +
  +
move.w    handle,-(sp)    ; Offset 18
+move.l    sectors,-(sp)   ; Offset 14
+move.l    len,-(sp)       ; Offset 10
+move.l    startadr,-(sp)  ; Offset 6
+move.w    #115,-(sp)      ; Offset 4
+move.w    #500,-(sp)      ; Offset 0
+trap      #14             ; Call XBIOS
+lea       20(sp),sp       ; Correct stack
+
+ +
+ +

4.19.61 hardplay

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »hardplay« - HD-play ohne Interrupt +
  +
Opcode: 500, 116 +
  +
Syntax: int32_t xbios ( 500, 116, int32_t startadr, int32_t len, +int32_t sectors, int32_t seek, int16_t handle, int16_t step, int16_t +mode, int16_t midi ); +
  +
Description: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
startadr Playback buffer start address +
len Playback buffer length (plays backwards if negative) +
sectors Number of sectors +
seek File start position +
handle Handle of playback file +
step Speed of playback (0..x) +
0 = Normal +
1 = Double +
2 = Triple etc... +
mode bit 0 -> Loop +
bit 1 -> Crossplay +
bit 2 -> MIDI +
bit 3 -> Break +
midi MIDI note, at which playback is to start, is only specified +when mode) bit 2 is set! + +
+ +
Warning: Dropout due to too small FIFO! +
No reverse playback at present! +
  +
Return value: Address return values, -1 = Error +
int32_t 0 Number of sectors played back +
int32_t 4 Loops (1 = played once, 2 = twice etc.) +
Each crossplay = two loops (for forwards & backwards) +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.61.1 Bindings for hardplay

+ + + + + + +
C: int32_t xbios ( 500, 116, int32_t startadr, int32_t len, +int32_t sectors, int32_t seek, int16_t handle, int16_t step, int16_t +mode, int16_t midi ); +
  +
Assembler: +
  +
move.w    midi,-(sp)      ; Offset 26
+move.w    mode,-(sp)      ; Offset 24
+move.w    step,-(sp)      ; Offset 22
+move.w    handle,-(sp)    ; Offset 20
+move.l    seek,-(sp)      ; Offset 16
+move.l    sectors,-(sp)   ; Offset 12
+move.l    len,-(sp)       ; Offset 8
+move.l    startadr,-(sp)  ; Offset 4
+move.w    #116,-(sp)      ; Offset 2
+move.w    #500,-(sp)      ; Offset 0
+trap      #14             ; Call XBIOS
+lea       28(sp),sp       ; Correct stack
+
+ +
+ +

4.19.62 hrecplay

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »hrecplay« - HD record & playback without interrupt +
  +
Opcode: 500, 117 +
  +
Syntax: Bindings for hrecplay +
  +
Description: +
  +
Return value: +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.62.1 Bindings for hrecplay

+

Binding unbekannt! +

+ + + + + + +
C: int32_t xbios ( 500, 117 ); +
  +
Assembler: +
  +
move.w    #117,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.19.63 init_peak

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »init_peak « - Peak value output in interrupt +
  +
Opcode: 500, 120 +
  +
Syntax: int32_t xbios ( 500, 120 ); +
  +
Description: +
  +
Return value: Address return values, -1 = Error +
int32_t 0 Peak value +
int32_t 8 Break (1 = new value ready for readout. After the +readout peak value and break must be cleared!) +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.63.1 Bindings for init_peak

+ + + + + + +
C: int32_t xbios ( 500, 120 ); +
  +
Assembler: +
  +
move.w    #120,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.19.64 init_imemrec

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »init_imemrec« - Memory record in interrupt +
  +
Opcode: 500, 121 +
  +
Syntax: int32_t xbios ( 500, 121, int16_t select, int32_t startadr, +int32_t endadr ); +
  +
Description: +
  + + + + + + + + + +
select Recording type +
0 = Record with 16 bits via FIFO +
2 = Record with 24 bits via FIFO +
startadr Recording start address +
endadr Recording end address + +
+ +
Return value: Address return values, -1 = Error +
int32_t 0 Memposition +
int32_t 8 Break +
int32_t 12 Error +
int32_t 24 Counter position +
+
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.64.1 Bindings for init_imemrec

+ + + + + + +
C: int32_t xbios ( 500, 121, int16_t select, int32_t startadr, +int32_t endadr ); +
  +
Assembler: +
  +
move.l    endadr,-(sp)   ; Offset 10
+move.l    startadr,-(sp) ; Offset 6
+move.w    select,-(sp)   ; Offset 4
+move.w    #121,-(sp)     ; Offset 2
+move.w    #500,-(sp)     ; Offset 0
+trap      #14            ; Call XBIOS
+lea       14(sp),sp      ; Correct stack
+
+ +
+ +

4.19.65 init_imemplay

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »init_imemplay« - Memory playback in interrupt +
  +
Opcode: 500, 122 +
  +
Syntax: int32_t xbios ( 500, 122, int16_t select, int32_t startadr, +int32_t endadr, int32_t counter, int16_t step, int16_t mode, int16_t +midi ); +
  +
Description: +
  + + + + + + + + + + + + + + + + + + + + + +
select Playback type +
0 = Playback with 16 bits via FIFO +
1 = Playback with 16 bits via DSP +
2 = Playback with 24 bits via FIFO +
startadr Playback start address +
endadr Playback end address +
counter Counter start value +
step Playback speed +
0 = Normal +
1 = Double +
2 = Triple etc... +
mode bit 0 -> Loop +
bit 1 -> Crossplay (not for select = 2) +
bit 2 -> MIDI +
midi MIDI note, at which playback is to start, is only specified +when mode bit 2 is set! + +
+ +
Return value: Address return values, -1 = Error +
int32_t 0 Memposition +
int32_t 8 Break +
int32_t 12 Error +
int32_t 24 Counter position +
int32_t 28 Loops +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.65.1 Bindings for init_imemplay

+ + + + + + +
C: int32_t xbios ( 500, 122, int16_t select, int32_t startadr, +int32_t endadr, int32_t counter, int16_t step, int16_t mode, int16_t +midi ); +
  +
Assembler: +
  +
move.w    midi,-(sp)      ; Offset 22
+move.w    mode,-(sp)      ; Offset 20
+move.w    step,-(sp)      ; Offset 18
+move.l    counter,-(sp)   ; Offset 14
+move.l    endadr,-(sp)    ; Offset 10
+move.l    startadr,-(sp)  ; Offset 6
+move.w    select,-(sp)    ; Offset 4
+move.w    #122,-(sp)      ; Offset 2
+move.w    #500,-(sp)      ; Offset 0
+trap      #14             ; Call XBIOS
+lea       24(sp),sp       ; Correct stack
+
+ +
+ +

4.19.66 init_implaymix

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »init_implaymix« - Memory playback & record-mix in +interrupt +
  +
Opcode: 500, 123 +
  +
Syntax: int32_t xbios ( 500, 123, int16_t select, int32_t startadr, +int32_t endadr, int32_t counter, int16_t step, int16_t mode, int16_t +midi ); +
  +
Description: +
  + + + + + + + + + + + + + + + + + + + + + +
select Playback type +
0 = Playback with 16 bits via FIFO +
startadr Playback start address +
endadr Playback end address +
counter Counter start value +
step Playback speed +
0 = Normal +
1 = Double +
2 = Triple etc... +
mode bit 0 -> Loop +
bit 1 -> Crossplay (Not for select = 2) +
bit 2 -> MIDI +
midi MIDI note, at which playback is to start, is only specified +when mode bit 2 is set! + +
+ +
Return value: Address return values, -1 = Error +
int32_t 0 Memposition +
int32_t 8 Break +
int32_t 12 Error +
int32_t 24 Counter position +
int32_t 28 Loops +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.66.1 Bindings for init_implaymix

+ + + + + + +
C: int32_t xbios ( 500, 123, int16_t select, int32_t startadr, +int32_t endadr, int32_t counter, int16_t step, int16_t mode, int16_t +midi ); +
  +
Assembler: +
  +
move.w    midi,-(sp)      ; Offset 22
+move.w    mode,-(sp)      ; Offset 20
+move.w    step,-(sp)      ; Offset 18
+move.l    counter,-(sp)   ; Offset 14
+move.l    endadr,-(sp)    ; Offset 10
+move.l    startadr,-(sp)  ; Offset 6
+move.w    select,-(sp)    ; Offset 4
+move.w    #122,-(sp)      ; Offset 2
+move.w    #500,-(sp)      ; Offset 0
+trap      #14             ; Call XBIOS
+lea       24(sp),sp       ; Correct stack
+
+ +
+ +

4.19.67 init_hrec

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »init_hrec« - HD record in interrupt +
  +
Opcode: 500, 124 +
  +
Syntax: int32_t xbios ( 500, 124, int32_t startadr, int32_t len, +int32_t sectors, int16_t handle, int16_t fileart ); +
  +
Description: +
  + + + + + + + + + + + + + + + +
startadr Record buffer start address +
len Record buffer length +
sectors Number of recorded sectors +
handle Handle of record file +
fileart 3 = Create WAV file + +
+ +
Doesn't work! +
  +
Return value: Address return values +
int32_t 0 Memposition +
int32_t 4 Number of recorded sectors +
int32_t 8 Break +
int32_t 12 Error +
+
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.67.1 Bindings for init_hrec

+ + + + + + +
C: int32_t xbios ( 500, 124, int32_t startadr, int32_t len, +int32_t sectors, int16_t handle, int16_t fileart ); +
  +
Assembler: +
  +
move.w    fileart,-(sp)   ; Offset 18
+move.w    handle,-(sp)    ; Offset 16
+move.l    sectors,-(sp)   ; Offset 12
+move.l    len,-(sp)       ; Offset 8
+move.l    startadr,-(sp)  ; Offset 4
+move.w    #124,-(sp)      ; Offset 2
+move.w    #500,-(sp)      ; Offset 0
+trap      #14             ; Call XBIOS
+lea       20(sp),sp       ; Correct stack
+
+ +
+ +

4.19.68 init_hplay

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »init_hplay« - HD playback in interrupt +
  +
Opcode: 500, 125 +
  +
Syntax: int32_t xbios ( 500, 125, int32_t startadr, int32_t len, +int32_t sectors, int32_t seek, int16_t handle, int16_t fileart, +int16_t step, int16_t mode, int16_t midi ); +
  +
Description: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
startadr Playback buffer start address +
len Playback buffer length +
sectors Number of sectors +
seek File start position +
handle Handle of playback file +
fileart 3 = WAV file +
step Playback speed +
mode bit 0 -> Loop +
bit 1 -> Crossplay +
bit 2 -> MIDI +
bit 3 -> Break +
midi MIDI note, at which playback is to start, is only specified +when mode bit 2 is set! + +
+ +
Crashes! +
  +
Return value: Address return values +
int32_t 0 Memposition +
int32_t 4 Number of sectors played back int32_t 8 Break +
int32_t 12 Error +
int32_t 28 Number of loops +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.68.1 Bindings for init_hplay

+ + + + + + +
C: int32_t xbios ( 500, 125, int32_t startadr, int32_t len, +int32_t sectors, int32_t seek, int16_t handle, int16_t fileart, +int16_t step, int16_t mode, int16_t midi ); +
  +
Assembler: +
  +
move.w    midi,-(sp)      ; Offset 28
+move.w    mode,-(sp)      ; Offset 26
+move.w    step,-(sp)      ; Offset 24
+move.w    fileart,-(sp)   ; Offset 22
+move.w    handle,-(sp)    ; Offset 20
+move.l    seek,-(sp)      ; Offset 16
+move.l    sectors,-(sp)   ; Offset 12
+move.l    len,-(sp)       ; Offset 8
+move.l    startadr,-(sp)  ; Offset 4
+move.w    #125,-(sp)      ; Offset 2
+move.w    #500,-(sp)      ; Offset 0
+trap      #14             ; Call XBIOS
+lea       30(sp),sp       ; Correct stack
+
+ +
+ +

4.19.69 init_ihplaymix

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »init_ihplaymix« - HD playback & record-mix in interrupt +
  +
Opcode: 500, 126 +
  +
Syntax: Bindings for init_ihplaymix +
  +
Description: +
  +
Return value: +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.69.1 Bindings for init_ihplaymix

+

Unbekannt! +

+ + + + + + +
C: int32_t xbios ( 500, 126 ); +
  +
Assembler: +
  +
move.w    #126,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.19.70 init_mrecpeak

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »init_mrecpeak« - Memory rec & peak output in interrupt +
  +
Opcode: 500, 130 +
  +
Syntax: int32_t xbios ( 500, 130, int16_t select, int32_t startadr, +int32_t endadr ); +
  +
Description: +
  + + + + + + + + + +
select Recording type +
0 = Record with 16 bits via FIFO +
1 = Record with 16 bits via DSP +
+
startadr Record start address +
endadr Record end address + +
+ +
Return value: Address return values +
int32_t 0 Memposition +
int32_t 8 Break +
int32_t 12 Error +
int32_t 16 Peak value +
int32_t 24 Counter position +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.70.1 Bindings for init_mrecpeak

+ + + + + + +
C: int32_t xbios ( 500, 130, int16_t select, int32_t startadr, +int32_t endadr ); +
  +
Assembler: +
  +
move.l    enddadr,-(sp)   ; Offset 10
+move.l    startadr,-(sp)  ; Offset 6
+move.w    select,-(sp)    ; Offset 4
+move.w    #130,-(sp)      ; Offset 2
+move.w    #500,-(sp)      ; Offset 0
+trap      #14             ; Call XBIOS
+lea       14(sp),sp       ; Correct stack
+
+ +
+ +

4.19.71 init_mplaypeak

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: init_mplaypeak»« - Memory playback & peak output in +interrupt +
  +
Opcode: 500, 131 +
  +
Syntax: int32_t xbios ( 500, 131 ); +
  +
Description: +
  +
Return value: +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.71.1 Bindings for init_mplaypeak

+

Unknown! +

+ + + + + + +
C: int32_t xbios ( 500, 131 ); +
  +
Assembler: +
  +
move.w    #131,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.19.72 init_mrppeak

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »init_mrppeak« - Memory playback & record-mix & peak +output in interrupt +
  +
Opcode: 500, 132 +
  +
Syntax: Bindings for init_mrppeak +
  +
Description: +
  +
Return value: +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.72.1 Bindings for init_mrppeak

+

Unknown! +

+ + + + + + +
C: int32_t xbios ( 500, 132 ); +
  +
Assembler: +
  +
move.w    #132,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.19.73 init_hrecpeak

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »init_hrecpeak« - HD rec & peak output in interrupt +
  +
Opcode: 500, 133 +
  +
Syntax: int32_tG xbios ( 500, 133, int32_t startadr, int32_t len, +int32_t sectors, int16_t handle, int16_t fileart ); +
  +
Description: +
  + + + + + + + + + + + + + + + +
startadr Record buffer start address +
len Record buffer length +
sectors Number of recorded sectors +
handle Handle of record file +
fileart 3 = Create WAV file + +
+ +
Dropout due to too small FIFO! +
  +
Return value: Address return values +
int32_t 0 Memposition +
int32_t 4 Number of recorded sectors +
int32_t 8 Break +
int32_t 12 Error +
int32_t 16 Peak value +
+
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.73.1 Bindings for init_hrecpeak

+ + + + + + +
C: int32_tG xbios ( 500, 133, int32_t startadr, int32_t len, +int32_t sectors, int16_t handle, int16_t fileart ); +
  +
Assembler: +
  +
move.w    fileart,-(sp)   ; Offset 18
+move.w    handle,-(sp)    ; Offset 16
+move.l    sectors,-(sp)   ; Offset 12
+move.l    len,-(sp)       ; Offset 8
+move.l    startadr,-(sp)  ; Offset 4
+move.w    #133,-(sp)      ; Offset 2
+move.w    #500,-(sp)      ; Offset 0
+trap      #14             ; Call XBIOS
+lea       20(sp),sp       ; Correct stack
+
+ +
+ +

4.19.74 init_hplaypeak

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »init_hplaypeak« - HD playback & peak output in interrupt +
  +
Opcode: 500, 134 +
  +
Syntax: Bindings for init_hplaypeak +
  +
Description: +
  +
Return value: +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.74.1 Bindings for init_hplaypeak

+

Unknown! +

+ + + + + + +
C: int32_t xbios ( 500, 134 ); +
  +
Assembler: +
  +
move.w    #134,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.19.75 init_hrppeak

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »init_hrppeak« - HD playback & record-mix & peak +output in interrupt +
  +
Opcode: 500, 135 +
  +
Syntax: int32_t xbios ( 500, 135 ); +
  +
Description: +
  +
Return value: +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.75.1 Bindings for init_hrppeak

+

Unknown! +

+ + + + + + +
C: int32_t xbios ( 500, 135 ); +
  +
Assembler: +
  +
move.w    #135,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.19.76 init_xmemrec

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »init_xmemrec« - Memory record in half-buffer system +
  +
Opcode: 500, 140 +
  +
Syntax: int32_t xbios ( 500, 140, int16_t select, int32_t startadr1, +int32_t startadr2, int32_t len, int32_t endcount, int16_t fileart, +int32_t peakbuf ); +
  +
Description: +
  + + + + + + + + + + + + + + + + + + + + + +
select Recording type +
0 = Record with 16 bits via FIFO +
1 = Record with 16 bits via DSP +
2 = 8-channel record with 16 bits via FIFO +
startadr1 Record start address buffer1 +
startadr2 Record start address buffer2 +
len Block length of the buffers +
endcount Recorded length or counter end (in bytes) +
fileart 3 = Create WAV file +
peakbuf Address of temporary store for peak values + +
+ +
mAt present, with select = 2 only 1 stereo channel is stored! +
  +
Return value: Address return values +
int32_t 0 Memposition +
int32_t 4 Memflag +
int32_t 8 Break +
int32_t 12 Error (not for select = 1) +
int32_t 16 Peak value (only for select = 0) +
int32_t 20 Peak buffer position (only for select = 0) +
int32_t 24 Counter position +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.76.1 Bindings for init_xmemrec

+ + + + + + +
C: int32_t xbios ( 500, 140, int16_t select, int32_t startadr1, +int32_t startadr2, int32_t len, int32_t endcount, int16_t fileart, +int32_t peakbuf ); +
  +
Assembler: +
  +
move.l    peakbuf,-(sp)    ; Offset 24
+move.w    fileart,-(sp)    ; Offset 22
+move.l    endcount,-(sp)   ; Offset 18
+move.l    len,-(sp)        ; Offset 14
+move.l    startadr2,-(sp)  ; Offset 10
+move.l    startadr1,-(sp)  ; Offset 6
+move.w    select,-(sp)     ; Offset 4
+move.w    #140,-(sp)       ; Offset 2
+move.w    #500,-(sp)       ; Offset 0
+trap      #14              ; Call XBIOS
+lea       28(sp),sp        ; Correct stack
+
+ +
+ +

4.19.77 init_xmemplay

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »init_xmemplay« - Memory playback in half-buffer system +
  +
Opcode: 500, 141 +
  +
Syntax: int32_t xbios ( 500, 141, int16_t select, int32_t startadr1, +int32_t startadr2, int32_t len, int32_t counter, int32_t endcount, +int16_t fileart, int16_t step, int16_t mode, int16_t midi ); +
  +
Description: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
select Abspielart +
0 = Playback with 16 bits via FIFO +
1 = Playback with 16 bits via DSP +
2 = 8-channel playback with 16 bits via FIFO +
3 = 16-channel playback with 16 bits via FIFO +
startadr1 Playback start address buffer 1 +
startadr2 Playback start address buffer 2 +
len Block length of the buffers +
counter Counter start value +
endcount Playback length or counter end (in bytes) +
fileart 3 = Create WAV file +
step Playback speed +
mode bit 0 -> Loop +
bit 1 -> Crossplay +
bit 2 -> MIDI +
bit 3 -> Break +
midi MIDI note, at which playback is to start, is only specified +when mode bit 2 is set! + +
+ +
Return value: Address return values +
int32_t 0 Memposition +
int32_t 4 Memflag +
int32_t 8 Break +
int32_t 12 Error (not for select = 1)) +
int32_t 16 Peak value (only for select = 0) +
int32_t 24 Counter position +
int32_t 40 Last block +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.77.1 Bindings for init_xmemplay

+ + + + + + +
C: int32_t xbios ( 500, 141, int16_t select, int32_t startadr1, +int32_t startadr2, int32_t len, int32_t counter, int32_t endcount, +int16_t fileart, int16_t step, int16_t mode, int16_t midi ); +
  +
Assembler: +
  +
move.w    midi,-(sp)       ; Offset 32
+move.w    mode,-(sp)       ; Offset 30
+move.w    step,-(sp)       ; Offset 28
+move.w    fileart,-(sp)    ; Offset 26
+move.l    endcount,-(sp)   ; Offset 22
+move.l    counter,-(sp)    ; Offset 18
+move.l    len,-(sp)        ; Offset 14
+move.l    startadr2,-(sp)  ; Offset 10
+move.l    startadr1,-(sp)  ; Offset 6
+move.w    select,-(sp)     ; Offset 4
+move.w    #141,-(sp)       ; Offset 2
+move.w    #500,-(sp)       ; Offset 0
+trap      #14              ; Call XBIOS
+lea       34(sp),sp        ; Correct stack
+
+ +
+ +

4.19.78 init_xmixplay

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »init_xmixplay« - Memory playback & mixing with record in +half-buffer system +
  +
Opcode: 500, 142 +
  +
Syntax: int32_t xbios ( 500, 142 ); +
  +
Description: +
  +
Return value: +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.78.1 Bindings for init_xmixplay

+

Unknown! +

+ + + + + + +
C: int32_t xbios ( 500, 142 ); +
  +
Assembler: +
  +
move.w    #142,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.19.79 init_xmemrec4

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »init_xmemrec4« - Memory record in half-buffer system of 4 +channels (analog/digital) +
  +
Opcode: 500, 143 +
  +
Syntax: int32_t xbios ( 500, 143, int32_t startadr1, int32_t startadr2, +int32_t dstartadr1, int32_t dstartadr2, int32_t len, int32_t endcount, +int16_t fileart, int32_t peakbuf, int32_t dpeakbuf ); +
  +
Description: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + +
startadr1 FIFO record start address buffer 1 +
startadr2 FIFO record start address buffer 2 +
dstartadr1 DSP record start address buffer 1 +
dstartadr2 DSP record start address buffer 2 +
len Length of the buffers +
endcount Recorded length or counter end (in bytes) +
fileart 3 = Create WAV file +
peakbuf FIFO address of temporary memory for peak values +
dpeakbuf DSP address of temporary memory for peak values + +
+ +
Return value: Address return values +
int32_t 0 Memposition FIFO +
int32_t 4 Memflag FIFO +
int32_t 8 Break FIFO +
int32_t 12 Error FIFO +
int32_t 16 Peak value FIFO +
int32_t 24 Counter position FIFO +
  +
int32_t 32 Memposition DSP +
int32_t 36 Memflag DSP +
int32_t 40 Break DSP +
int32_t 44 Error DSP +
int32_t 48 Peak value DSP +
int32_t 56 Counter position DSP +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.79.1 Bindings for init_xmemrec4

+ + + + + + +
C: int32_t xbios ( 500, 143, int32_t startadr1, int32_t startadr2, +int32_t dstartadr1, int32_t dstartadr2, int32_t len, int32_t endcount, +int16_t fileart, int32_t peakbuf, int32_t dpeakbuf ); +
  +
Assembler: +
  +
move.l    dpeakpuf,-(sp)    ; Offset 34
+move.l    peakpuf,-(sp)     ; Offset 30
+move.w    fileart,-(sp)     ; Offset 28
+move.l    endcount,-(sp)    ; Offset 24
+move.l    len,-(sp)         ; Offset 20
+move.l    dstartadr2,-(sp)  ; Offset 16
+move.l    dstartadr1,-(sp)  ; Offset 12
+move.l    startadr2,-(sp)   ; Offset 8
+move.l    startadr1,-(sp)   ; Offset 4
+move.w    #143,-(sp)        ; Offset 2
+move.w    #500,-(sp)        ; Offset 0
+trap      #14               ; Call XBIOS
+lea       38(sp),sp         ; Correct stack
+
+ +
+ +

4.19.80 init_xmemplay4

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »init_xmemplay4« - Memory playback in half-buffer system of 4 +channels (analog/digital) +
  +
Opcode: 500, 144 +
  +
Syntax: int32_t xbios ( 500, 144, int32_t startadr1, int32_t startadr2, +int32_t dstartadr1, int32_t dstartadr2, int32_t len, int32_t counter, +int32_t endcount, int16_t fileart, int16_t step, int16_t mode, int16_t +midi ); +
  +
Description: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
startadr1 FIFO playback start address buffer 1 +
startadr2 FIFO playback start address buffer 2 +
dstartadr1 DSP playback start address buffer 1 +
dstartadr2 DSP playback start address buffer 2 +
dendadr2 Length of the buffers +
counter Counter start value +
endcount Playback length or counter end (in bytes) +
fileart 3 = Creat WAV file +
step Playback speed +
mode bit 0 -> Loop +
bit 1 -> Crossplay +
bit 2 -> MIDI +
bit 3 -> Break +
midi MIDI note, at which playback is to start, is only specified +when mode bit 2 is set! + +
+ +
Return value: Address return values +
int32_t 0 Memposition +
int32_t 4 Memflag +
int32_t 8 Break +
int32_t 12 Error +
int32_t 16 Peak value +
int32_t 24 Counter position +
+
  +
int32_t 32 Memposition DSP +
int32_t 36 Memflag DSP +
int32_t 40 Break DSP +
int32_t 44 Error DSP +
int32_t 48 Peak value DSP +
int32_t 56 Counter position DSP +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.80.1 Bindings for init_xmemplay4

+ + + + + + +
C: int32_t xbios ( 500, 144, int32_t startadr1, int32_t startadr2, +int32_t dstartadr1, int32_t dstartadr2, int32_t len, int32_t counter, +int32_t endcount, int16_t fileart, int16_t step, int16_t mode, int16_t +midi ); +
  +
Assembler: +
  +
move.w    midi,-(sp)        ; Offset 38
+move.w    mode,-(sp)        ; Offset 36
+move.w    step,-(sp)        ; Offset 34
+move.w    fileart,-(sp)     ; Offset 32
+move.l    endcount,-(sp)    ; Offset 28
+move.l    counter,-(sp)     ; Offset 24
+move.l    len,-(sp)         ; Offset 20
+move.l    dstartadr2,-(sp)  ; Offset 16
+move.l    dstartadr1,-(sp)  ; Offset 12
+move.l    startadr2,-(sp)   ; Offset 8
+move.l    startadr1,-(sp)   ; Offset 4
+move.w    #144,-(sp)        ; Offset 2
+move.w    #500,-(sp)        ; Offset 0
+trap      #14               ; Call XBIOS
+lea       40(sp),sp         ; Correct stack
+
+ +
+ +

4.19.81 peakshake

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »peakshake« - Peak value handshake (= generate new value) +
  +
Opcode: 500, 150 +
  +
Syntax: int32_t xbios ( 500, 150 ); +
  +
Description: +
  +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.81.1 Bindings for peakshake

+ + + + + + +
C: int32_t xbios ( 500, 150 ); +
  +
Assembler: +
  +
move.w    #150,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.19.82 read_rlow

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »read_rlow« - Read low register +
  +
Opcode: 500, 200 +
  +
Syntax: int32_t xbios ( 500, 200 ); +
  +
Description: +
  +
Return value: bit 0 -> SWAES +
bit 1 -> SWDIGIN +
bit 2 -> TAKT0 +
bit 3 -> TAKT1 +
bit 4 -> EXTAKT +
bit 5 -> EXTEX +
bit 6 -> EXTTF +
bit 7 -> EXTTW +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See Also: Binding +
  + +
+ +

4.19.82.1 Bindings for read_rlow

+ + + + + + +
C: int32_t xbios ( 500, 200 ); +
  +
Assembler: +
  +
move.w    #200,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.19.83 read_rhi

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »read_rhi« - Read high register +
  +
Opcode: 500, 201 +
  +
Syntax: int32_t xbios ( 500, 201 ); +
  +
Description: +
  +
Return value: bit 0 -> SWPROT +
bit 1 -> SWRES-FIFO +
bit 2 -> MATRIX-OUT +
bit 3 -> PREEMPH +
bit 4 -> SWSUBFR +
bit 5 -> GENERA +
bit 6 -> CATEG0 +
bit 7 -> CATEG1 +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.83.1 Bindings for read_rhi

+ + + + + + +
C: int32_t xbios ( 500, 201 ); +
  +
Assembler: +
  +
move.w    #201,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.19.84 read_rdsp

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »read_rdsp« - Read dsp register +
  +
Opcode: 500, 202 +
  +
Syntax: int32_t xbios ( 500, 202 ); +
  +
Description: +
  +
Return value: bit 0 -> MATI0/REC4 +
bit 1 -> MATI1/PLAY4 +
bit 2 -> VOLCS1 +
bit 3 -> VOLCLK +
bit 4 -> VOLDATAI +
bit 5 -> VOLCS2 +
bit 7 -> AESFREQ +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.84.1 Bindings for read_rdsp

+ + + + + + +
C: int32_t xbios ( 500, 202 ); +
  +
Assembler: +
  +
move.w    #202,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.19.85 read_raes

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »read_raes« - Read aes register +
  +
Opcode: 500, 203 +
  +
Syntax: int32_t xbios ( 500, 203 ); +
  +
Description: +
  +
Return value: bit 0 -> SWPROF +
bit 1 -> SWCOPY/PCH16 +
bit 2 -> DIGMODE:SWMAL2/DIG24 +
bit 3 -> PLAY128 +
bit 4 -> REC128 +
bit 7 -> SPEBU +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.85.1 Bindings for read_raes

+ + + + + + +
C: int32_t xbios ( 500, 203 ); +
  +
Assembler: +
  +
move.w    #203,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.19.86 read_rint

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »read_rint« - Read interrupt register +
  +
Opcode: 500, 204 +
  +
Syntax: int32_t xbios ( 500, 204 ); +
  +
Description: +
  +
Return value: bit 0 -> PLAY-INT +
bit 1 -> REC-INT +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.86.1 Bindings for read_rint

+ + + + + + +
C: int32_t xbios ( 500, 204 ); +
  +
Assembler: +
  +
move.w    #204,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.19.87 wr_rlow

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »wr_rlow« - Write low register +
  +
Opcode: 500, 210 +
  +
Syntax: int32_t xbios ( 500, 210, int16_t value ); +
  +
Description: +
  + + + +
value bit 0 -> SWAES +
bit 1 -> SWDIGIN +
bit 2 -> TAKT0 +
bit 3 -> TAKT1 +
bit 4 -> EXTAKT +
bit 5 -> EXTEX +
bit 6 -> EXTTF +
bit 7 -> EXTTW + +
+ +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.87.1 Bindings for wr_rlow

+ + + + + + +
C: int32_t xbios ( 500, 210, int16_t value ); +
  +
Assembler: +
  +
move.w    value,-(sp)  ; Offset 4
+move.w    #210,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.19.88 wr_rhi

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »wr_rhi« - Write high register +
  +
Opcode: 500, 211 +
  +
Syntax: int32_t xbios ( 500, 211, int16_t value ); +
  +
Description: +
  + + + +
value bit 0 -> SWPROT +
bit 1 -> SWRES-FIFO +
bit 2 -> MATRIX-OUT +
bit 3 -> PREEMPH +
bit 4 -> SWSUBFR +
bit 5 -> GENERA +
bit 6 -> CATEG0 +
bit 7 -> CATEG1 + +
+ +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.88.1 Bindings for wr_rhi

+ + + + + + +
C: int32_t xbios ( 500, 211, int16_t value ); +
  +
Assembler: +
  +
move.w    value,-(sp)  ; Offset 4
+move.w    #211,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.19.89 wr_rdsp

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »wr_rdsp« - Write dsp register +
  +
Opcode: 500, 212 +
  +
Syntax: int32_t xbios ( 500, 212, int16_t value ); +
  +
Description: +
  + + + +
value bit 0 -> MATI0/REC4 +
bit 1 -> MATI1/PLAY4 +
bit 2 -> VOLCS1 +
bit 3 -> VOLCLK +
bit 4 -> VOLDATAI +
bit 5 -> VOLCS2 +
bit 7 -> AESFREQ + +
+ +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.89.1 Bindings for wr_rdsp

+ + + + + + +
C: int32_t xbios ( 500, 212, int16_t value ); +
  +
Assembler: +
  +
move.w    value,-(sp)  ; Offset 4
+move.w    #212,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.19.90 wr_raes

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »wr_raes« - Write aes register +
  +
Opcode: 500, 213 +
  +
Syntax: int32_t xbios ( 500, 213, int16_t value ); +
  +
Description: +
  + + + +
value bit 0 -> SWPROF +
bit 1 -> SWCOPY/PCH16 +
bit 2 -> DIGMODE:SWMAL2/DIG24 +
bit 3 -> PLAY128 +
bit 4 -> REC128 +
bit 7 -> SPEBU + +
+ +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.90.1 Bindings for wr_raes

+ + + + + + +
C: int32_t xbios ( 500, 213, int16_t value ); +
  +
Assembler: +
  +
move.w    value,-(sp)  ; Offset 4
+move.w    #213,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.19.91 wr_rint

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »wr_rint« - Write interrupt register +
  +
Opcode: 500, 214 +
  +
Syntax: int32_t xbios ( 500, 214, int16_t value ); +
  +
Description: +
  + + + +
value bit 0 -> PLAY-INT +
bit 1 -> REC-INT + +
+ +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.91.1 Bindings for wr_rint

+ + + + + + +
C: int32_t xbios ( 500, 214, int16_t value ); +
  +
Assembler: +
  +
move.w    value,-(sp)  ; Offset 4
+move.w    #214,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.19.92 read_dpath1

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »read_dpath1« - Read DSP dpath1 register +
  +
Opcode: 500, 220 +
  +
Syntax: int32_t xbios ( 500, 220 ); +
  +
Description: +
  +
Return value: bit 0 -> SW0PATH +
bit 1 -> SC1PATH +
bit 2 -> SC2PATH +
bit 3 -> DSPRES +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.92.1 Bindings for read_dpath1

+ + + + + + +
C: int32_t xbios ( 500, 220 ); +
  +
Assembler: +
  +
move.w    #220,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.19.93 read_dpath2

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »read_dpath2« - Read dsp dpath2 register +
  +
Opcode: 500, 221 +
  +
Syntax: int32_t xbios ( 500, 221 ); +
  +
Description: +
  +
Return value: bit 0 -> SRDPATH +
bit 1 -> STDPATH0 +
bit 2 -> STDPATH1 +
bit 3 -> CONVMAST +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.93.1 Bindings for read_dpath2

+ + + + + + +
C: int32_t xbios ( 500, 221 ); +
  +
Assembler: +
  +
move.w    #221,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.19.94 read_dport

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »read_dport« - Read dsp dport register +
  +
Opcode: 500, 222 +
  +
Syntax: int32_t xbios ( 500, 222 ); +
  +
Description: +
  +
Return value: bit 0 -> GPIO0 +
bit 1 -> GPIO1 +
bit 2 -> GPIO2 +
bit 3 -> GPIODIR0 +
+
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.94.1 Bindings for read_dport

+ + + + + + +
C: int32_t xbios ( 500, 222 ); +
  +
Assembler: +
  +
move.w    #222,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.19.95 read_dconv

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »read_dconv« - Read dsp dconv register +
  +
Opcode: 500, 223 +
  +
Syntax: int32_t xbios ( 500, 223 ); +
  +
Description: +
  +
Return value: bit 0 -> GPIODIR1 +
bit 1 -> GPIODIR2 +
bit 2 -> CMAST0 +
bit 3 -> CMAST1 +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.95.1 Bindings for read_dconv

+ + + + + + +
C: int32_t xbios ( 500, 223 ); +
  +
Assembler: +
  +
move.w    #223,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.19.96 read_dpdat

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »read_dpdat« - Read dsp dpdat register +
  +
Opcode: 500, 224 +
  +
Syntax: int32_t xbios ( 500, 224 ); +
  +
Description: +
  +
Return value: bit 0 -> PDAT0 +
bit 1 -> PDAT1 +
Bit 2 -> MEMART +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.96.1 Bindings for read_dpdat

+ + + + + + +
C: int32_t xbios ( 500, 224 ); +
  +
Assembler: +
  +
move.w    #224,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.19.97 read_dclk

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »read_dclk« - Read dsp dclk register +
  +
Opcode: 500, 225 +
  +
Syntax: int32_t xbios ( 500, 225 ); +
  +
Description: +
  +
Return value: bit 0-3 -> CDIV +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.97.1 Bindings for read_dclk

+ + + + + + +
C: int32_t xbios ( 500, 225 ); +
  +
Assembler: +
  +
move.w    #225,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.19.98 wr_dpath1

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »wr_dpath1« - Write dsp dpath1 register +
  +
Opcode: 500, 230 +
  +
Syntax: int32_t xbios ( 500, 230, int16_t value ); +
  +
Description: +
  + + + +
value bit 0 -> SW0PATH +
bit 1 -> SC1PATH +
bit 2 -> SC2PATH +
bit 3 -> DSPRES + +
+ +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.98.1 Bindings for wr_dpath1

+ + + + + + +
C: int32_t xbios ( 500, 230, int16_t value ); +
  +
Assembler: +
  +
move.w    value,-(sp)  ; Offset 4
+move.w    #230,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.19.99 wr_dpath2

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »wr_dpath2« - Write dsp dpath2 register +
  +
Opcode: 500, 231 +
  +
Syntax: int32_t xbios ( 500, 231, int16_t value ); +
  +
Description: +
  + + + +
value bit 0 -> SRDPATH +
bit 1 -> STDPATH0 +
bit 2 -> STDPATH1 +
bit 3 -> CONVMAST + +
+ +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.99.1 Bindings for wr_dpath2

+ + + + + + +
C: int32_t xbios ( 500, 231, int16_t value ); +
  +
Assembler: +
  +
move.w    value,-(sp)  ; Offset 4
+move.w    #231,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.19.100 wr_dport

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »wr_dport« - Write dsp dport register +
  +
Opcode: 500, 232 +
  +
Syntax: int32_t xbios ( 500, 232, int16_t value ); +
  +
Description: +
  + + + +
value bit 0 -> GPIO0 +
bit 1 -> GPIO1 +
bit 2 -> GPIO2 +
bit 3 -> GPIODIR0 + +
+ +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.100.1 Bindings for wr_dport

+ + + + + + +
C: int32_t xbios ( 500, 232, int16_t value ); +
  +
Assembler: +
  +
move.w    value,-(sp)  ; Offset 4
+move.w    #232,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.19.101 wr_dconv

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »wr_dconv« - Write dsp dconv register +
  +
Opcode: 500, 233 +
  +
Syntax: int32_t xbios ( 500, 233, int16_t value ); +
  +
Description: +
  + + + +
value bit 0 -> GPIODIR1 +
bit 1 -> GPIODIR2 +
bit 2 -> CMAST0 +
bit 3 -> CMAST1 + +
+ +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.101.1 Bindings for wr_dconv

+ + + + + + +
C: int32_t xbios ( 500, 233, int16_t value ); +
  +
Assembler: +
  +
move.w    value,-(sp)  ; Offset 4
+move.w    #233,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.19.102 wr_dpdat

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »wr_dpdat« - Write dsp dpdat register +
  +
Opcode: 500, 234 +
  +
Syntax: int32_t xbios ( 500, 234, int16_t value ); +
  +
Description: +
  + + + +
value bit 0 -> PDAT0 +
bit 1 -> PDAT1 +
Bit 2 -> MEMART + +
+ +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.102.1 Bindings for wr_dpdat

+ + + + + + +
C: int32_t xbios ( 500, 234, int16_t value ); +
  +
Assembler: +
  +
move.w    value,-(sp)  ; Offset 4
+move.w    #234,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.19.103 wr_dclk

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »wr_dclk« - Write dsp dclk register +
  +
Opcode: 500, 235 +
  +
Syntax: int32_t xbios ( 500, 235, int16_t value ); +
  +
Description: value: bit0-3 -> CDIV +
  +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.103.1 Bindings for wr_dclk

+ + + + + + +
C: int32_t xbios ( 500, 235, int16_t value ); +
  +
Assembler: +
  +
move.w    value,-(sp)  ; Offset 4
+move.w    #235,-(sp)   ; Offset 2
+move.w    #500,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.19.104 fastcut

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »fastcut« - Clear memory segment in samplemem +
  +
Opcode: 500, 300 +
  +
Syntax: int32_t xbios ( 500, 300, int32_t anfmem, int32_t endmem ); +
  +
Description: +
  + + + + + + +
anfmem Start address +
endmem End address (first invalid value) + +
+ +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.104.1 Bindings for fastcut

+ + + + + + +
C: int32_t xbios ( 500, 300, int32_t anfmem, int32_t endmem ); +
  +
Assembler: +
  +
move.l    endmem,-(sp)  ; Offset 8
+move.l    anfmem,-(sp)  ; Offset 4
+move.w    #300,-(sp)    ; Offset 2
+move.w    #500,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+lea       12(sp),sp     ; Correct stack
+
+ +
+ +

4.19.105 peaksuch

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »peaksuch« - Peak value search in samplemem +
  +
Opcode: 500, 301 +
  +
Syntax: int32_t xbios ( 500, 301, int32_t anfmem, int32_t endmem ); +
  +
Description: +
  + + + + + + +
anfmem Start address +
endmem End address (first invalid value) + +
+ +
Return value: Pointer to value table +
int16_t rpos; Maximum value positive halfwave right +
int16_t rneg; Maximum value negative halfwave right +
int16_t lpos; Maximum value positive halfwave left +
int16_t lneg; Maximum value negative halfwave left +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.105.1 Bindings for peaksuch

+ + + + + + +
C: int32_t xbios ( 500, 301, int32_t anfmem, int32_t endmem ); +
  +
Assembler: +
  +
move.l    endmem,-(sp)  ; Offset 8
+move.l    anfmem,-(sp)  ; Offset 4
+move.w    #301,-(sp)    ; Offset 2
+move.w    #500,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+lea       12(sp),sp     ; Correct stack
+
+ +
+ +

4.19.106 zerono

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »zerono« - Zero value search in samplemem +
  +
Opcode: 500, 302 +
  +
Syntax: int32_t xbios ( 500, 302, int32_t anfmem, int32_t endmem, +int16_t side, int16_t znvorweg ); +
  +
Description: +
  + + + + + + + + + + + + +
anfmem Start address +
endmem End address (first invalid value) +
side Search direction (= 0 :forwards, <> 0 :backwards) +
znvorweg What is this ??????????????????????????????????? + +
+ +
Return value: Address of the found position +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.106.1 Bindings for zerono

+ + + + + + +
C: int32_t xbios ( 500, 302, int32_t anfmem, int32_t endmem, +int16_t side, int16_t znvorweg ); +
  +
Assembler: +
  +
move.w    znvorweg,-(sp)  ; Offset 14
+move.w    side,-(sp)      ; Offset 12
+move.l    endmem,-(sp)    ; Offset 8
+move.l    anfmem,-(sp)    ; Offset 4
+move.w    #302,-(sp)      ; Offset 2
+move.w    #500,-(sp)      ; Offset 0
+trap      #14             ; Call XBIOS
+lea       16(sp),sp       ; Correct stack
+
+ +
+ +

4.19.107 fading

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »fading« - Sample fading in samplemem +
  +
Opcode: 500, 303 +
  +
Syntax: int32_t xbios ( 500, 303, int32_t data, int32_t werte, int32_t +anfmem, int32_t endmem ); +
  +
Description: +
  + + + + + + + + + + + + +
data Pointer to fader curve value +
werte Number of fader values +
anfmem Start address +
endmem End address (first invalid value) + +
+ +
Return value: 0 - No error +
  +
Availability: This function is only available when the driver of the StarTrack +sound card has been launched. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.107.1 Bindings for fading

+ + + + + + +
C: int32_t xbios ( 500, 303, int32_t data, int32_t werte, int32_t +anfmem, int32_t endmem ); +
  +
Assembler: +
  +
move.l    endmem,-(sp)  ; Offset 162
+move.l    anfmem,-(sp)  ; Offset 12
+move.l    werte,-(sp)   ; Offset 8
+move.l    data,-(sp)    ; Offset 4
+move.w    #303,-(sp)    ; Offset 2
+move.w    #500,-(sp)    ; Offset 0
+trap      #14           ; Call XBIOS
+lea       20(sp),sp     ; Correct stack
+
+ +
+ +

4.19.108 unlocksnd

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »unlocksnd« - Unlock sound system for use by other +applications +
  +
Opcode: 129 +
  +
Syntax: int32_t unlocksnd( void ); +
  +
Description: The XBIOS routine unlocksnd unlocks the sound system for use +by other applications, after it has been locked previously. +
  +
Return value: The function returns the value 0 if it was successful. If the +sound system was already available, then a negative value is returned. +
  +
Availability: The function is only available on computers of the Falcon +series, or with extended XBIOS routines (_SND). +
  +
Group: Sound routines +
  +
See also: Binding   buffoper   buffptr   devconnect   dsptristate   gpio   +setbuffer   setinterrupt   setmontracks   setmode   settracks   +sndstatus   soundcmd   locksnd +
  + +
+ +

4.19.108.1 Bindings for unlocksnd

+ + + + + + +
C: #include <tos.h> +
  +
int32_t unlocksnd( void ); +
  +
Assembler: +
  +
move.w    #129,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

4.19.109 WavePlay

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »WavePlay« - Replay a sample +
  +
Opcode: 165 +
  +
Syntax: int32_t WavePlay( int16_t flags, int32_t rate, int32_t sptr, +int32_t slen ); +
  +
Description: The XBIOS routine WavePlay starts the playback of a sample +using the DMA sound system on the STe, TT030, Falcon030 or Milan. +
  +
flags is a bit-vector for the description of the sample +or of the function to be executed: +
  +
Bit 0 set: Sample is mono +
Bit 1 set: Sample is 16-bit +
  +
If bit 5 in '_SND' cookie is set: +
  +
Bit 4 set: Sample, if 16-bit, is in Intel format +
Bit 5 set: Sample is unsigned +
Bit 6 set: Sample format is as recorded by MilanBlaster +
  +
Bit 8 set: See description in Atari Compendium Vol. I, XBIOS +pp. 4.110-4.112. It is not supported by the MilanBlaster XBios +
  +
rate is the sample frequency in Hz +
  +
sptr is the start address of the sample (with the +MilanBlaster can also lie in TT-RAM) +
  +
slen is the length of the sample in bytes +
  +
Return value: If successful the function returns the value 0, the playback +was then started and can be be halted at any time with buffoper(0). +The end of the sample has been reached when buffoper(-1) bit 0 is +cleared. In case of error, -1 is returned, while if no sound was +played (either because the user had not previously assigned a sound or +SAM was disabled) a 1 is returned. +
  +
Availability: The function is available when bit 5 in the '_SND' cookie is +set or the 'SAM\0' cookie is present. +
  +
Group: Sound routines +
  +
See also: Binding +
  + +
+ +

4.19.109.1 Bindings for WavePlay

+ + + + + + +
C: int32_t WavePlay( int16_t flags, int32_t rate, int32_t sptr, +int32_t slen ); +
  +
Assembler: +
  +
move.l    slen,-(sp)   ; Offset 12
+pea       sptr         ; Offset 8
+move.l    rate,-(sp)   ; Offset 4
+move.w    flags,-(sp)  ; Offset 2
+move.w    #165,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+lea       16(sp),sp    ; Correct stack
+
+ +
+ +
+ +Home +XBIOSXBIOS +Interface programmingInterface programming +Special commandsSpecial commands + + diff --git a/en/xbios_special.html b/en/xbios_special.html new file mode 100644 index 000000000..b13d0a967 --- /dev/null +++ b/en/xbios_special.html @@ -0,0 +1,1196 @@ + + + + + +The documentation for TOS: Special commands + + + + + + + + + +Home +XBIOSXBIOS +Sound routinesSound routines +Keyboard functionsKeyboard functions + +
+ +

4.20 Special commands

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Blitmode Gets or changes blitter configuration. +
CacheCtrl CPU cache management. +
CJar Creates, interrogates and removes cookies. +
Dbmsg Outputs debug message. +
Janus Makes the "Janus" emulator available. +
Puntaes Switches off AES in ROM. +
Random Generates a random number. +
Ssbrk Reserves memory (only used internally). +
Supexec Starts routine in supervisor-mode. +
Trapper Hooks into system functions. +
WdgCtrl Sets the hardware watchdog. + +
+ +

See Also: Interface programming +

+

4.20.1 Blitmode

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »blitter mode« - Blitter-chip configuration +
  +
Opcode: 64 +
  +
Syntax: int16_t Blitmode( int16_t mode ); +
  +
Description: Blitmode is an XBIOS routine to switch on the blitter or to +verify its existence. If the parameter mode has the value -1 +then one obtains the state of the blitter chip. All other values +configure the blitter: +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
BitDescription
00 = Blitter off
 1 = Blitter on
1-14Reserved
15Must always be 0
+
+ +
Note: According to Atari the function may be used +without checking the TOS version (although it is not present in +TOS 1.0, for instance). This is possible due to a side-effect in +the dispatcher of the XBIOS. However, it is better not to rely on this, as the +corresponding trap may be diverted by other programs, so that the +correct value may not be returned. +
  +
Return value: The function returns the properties of the blitter chip by the +set bits: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
BitMeaning
00: Blitter off
 1: Blitter on
  
10: Blitter not present
 1: Blitter present
  
15Always 0
+
+ +
All further bits are reserved. +
  +
Availability: Officially this function is present only as of TOS Version +1.02. +
  +
Group: Special commands +
  +
See Also: Binding +
  + +
+ +

4.20.1.1 Bindings for Blitmode

+ + + + + + +
C: #include <tos.h> +
  +
int16_t Blitmode( int16_t mode ); +
  +
Assembler: +
  +
move.w    mode,-(sp)   ; Offset 2
+move.w    #64,-(sp)    ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.20.2 CacheCtrl

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »CacheCtrl« - CPU cache management +
  +
Opcode: 160 +
  +
Syntax: int32_t CacheCtrl( int16_t OpCode, int16_t Param ); +
  +
Description: The XBIOS routine CacheCtrl serves for the management of the +CPU cache. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OpCodeDescription
0Return 0 to check that function is implemented
1Flush data cache
2Flush instruction cache
3Flush data and instruction cache
4Inquire data cache mode
5Activation/deactivation of the data cache
  Param= 0, switch off
  Param= 1, switch on
  Write-back of the caches if necessary
6Inquire instruction cache mode
7Activation/deactivation of the command cache
  Param= 0, switch off
  Param= 1, switch on
  Write-back of the caches if necessary
+
+ +
Note: +
Under the CT60 XBIOS, OpCode 5/7 has the same effect : +
Param: 0 = disable all caches. +
       1 = enable all caches. +
All caches are: Data cache, store buffer, branch cache, +instruction cache. +
  +
Return value: If successful the function returns the value 0, or EBADRQ when +a value larger than seven is passed for OpCode. +
  +
As an alternative the driver "CPU Cache Control Driver +v1.10" by Robert Federle and Thomas Tempelmann is available for +other computers. +
  +
Availability: The function ist available on the Milan from TOS 4.06, in +CT60 XBIOS as of Version v0.98a. +
  +
Group: Special commands +
  +
See Also: Binding +
  + +
+ +

4.20.2.1 Bindings for CacheCtrl

+ + + + + + +
C: int32_t CacheCtrl( int16_t OpCode, int16_t Param ); +
  +
Assembler: +
  +
move.w    Param,-(sp)  ; Offset 4
+move.w    OpCode,-(sp) ; Offset 2
+move.w    #160,-(sp)   ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.20.3 CJar

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »CJar« - Creation, interrogation and removal of cookies +
  +
Opcode: 17226 (0x434A) +
  +
Syntax: int32_t CJar( int16_t mode, int32_t cookie, int32_t *value ); +
  +
Description: The XBIOS routine CJar offers a simple way of creating, +interrogating and removing cookies. +
  + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
mode Mode 0: +
Obtains the value of a cookie and stores it at the specified +address. If one passed a NULL-pointer for value, then only the +existence of the cookie will be checked. If presence of the cookie is +established, the call returns 0x6172 (="CJar_OK"), or a +different value otherwise. +
Mode 1: +
Creates a new cookie. In this case, value points to a +longword whose contents are copied into the cookie jar. If +value is NULL (zero), then a value of zero is entered into the +cookie jar. If the cookie already exists, the old value is +overwritten. +
This mode returns $6172 (="CJar_OK") if the addition was +successful or -1 if the addition failed due to lack of room in the +cookie jar. +
Mode 2: +
Removes the cookie cookie from the jar. The value of +value is immaterial. If the removal was successful the return +will be "CJar_OK", or another value otherwise. +
Is only available if the system extension Liberty (cookie +'Lity') is installed. +
cookie Cookie identifier +
value Address of the buffer in which the data is to be stored. + +
+ +
Return value: If successful the function returns the value CJar_OK (0x6172). +
  +
Availability: The function is available when the cookie 'CJar' ($434A6172) is +present. This is created by JARxxx (Cookie Jar Manager) or by Liberty. +
  +
Group: Special commands +
  +
See Also: Binding   Cookie function +
  + +
+ +

4.20.3.1 Bindings for CJar

+ + + + + + +
C: int32_t CJar( int16_t mode, int32_t cookie, int32_t *value ); +
  +
Assembler: +
  +
pea       value          ; Offset 8
+move.l    cookie,-(sp)   ; Offset 4
+move.w    mode,-(sp)     ; Offset 2
+move.w    #17226,-(sp)   ; Offset 0
+trap      #14            ; Call XBIOS
+lea       12(sp),sp      ; Correct stack
+
+ +
+ +

4.20.4 Dbmsg

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Dbmsg« - Output debug message +
  +
Opcode: 11 +
  +
Syntax: void Dbmsg( int16_t rsrvd, int16_t msg_num, int32_t msg_arg ) +
  +
Description: Dbmsg allows special debugging messages to be sent to a +resident debugger application. +
  +
srsrvd is currently reserved and should always be 5. +
  +
msg_num is the message number which you want to send to +the debugging host. Values of 0x0000 to 0xEFFF are reserved for +applications to define. Values of 0xF000 to 0xFFFF are reserved for +special debugging messages. If msg_num is in the application +defined range, it and the int32_t contained in msg_arg will be +displayed by the debugger and the application will be halted. If +msg_num is between 0xF001 and 0xF0FF inclusive then +msg_arg is interpreted as a character pointer pointing to a +string to be output by the debugger and debugging to halt. The string +length is determined by the low byte of msg_num. +
  +
If msg_num is DB_NULLSTRING (0xF000), the string will be +output until a NULL is reached. +
  +
If msg_num is DB_COMMAND (0xF100), msg_arg is +interpreted as a character pointer to a string containing a debugger +command. The command format is specific to the debugger which you are +running. A useful example of this format when running under the Atari +debugger allows a string to be output to the debugger without +terminating debugging as shown in the following example: +
  +
Dbmsg( 5, DB_COMMAND, "echo 'Debugging Message';g" ); +
  +
The Atari Debugger only understands the value DB_COMMAND +(0xF100) for msg_num as of version 3. Though it is normally +harmless to run an application with embedded debugging messages when +no debugger is present in the system, distribution versions of +applications should have these instructions removed. +
  +
Return value: +
  +
Availability: Only if a resident debugger was loaded, which supports this +call. The only debugger that currently supports this call is the Atari +debugger. +
  +
Group: Special commands +
  +
See Also: Binding +
  + +
+ +

4.20.4.1 Bindings for Dbmsg

+ + + + + + +
C: #include <tos.h> +
  +
void Dbmsg( int16_t rsrvd, int16_t msg_num, int32_t msg_arg ) +
  +
Assembler: +
  +
move.l    msg_arg,-(sp)  ; Offset 6
+move.w    msg_num,-(sp)  ; Offset 4
+move.w    srsrvd,-(sp)   ; Offset 2
+move.w    #11,-(sp)      ; Offset 0
+trap      #14            ; Call XBIOS
+lea       10(sp),sp      ; Correct stack
+
+ +
+ +

4.20.5 Janus

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Janus« - Make the "Janus" emulator available. +
  +
Opcode: 43 +
  +
Syntax: void Janus( int16_t mode ) +
  +
Description: This function makes the hardware emulator "Janus" +available. According to an article in ST-Computer 1996-04 p. +44, the following may be achieved with this: +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
modeDescription
-1Obtain the active parallel port
1Switch to first parallel port
2Switch to second parallel port
256Quit Janus
+
+ +
Note: All statements without any guarantees, as the +article is not very detailed. +
  +
Return value: Unknown, or see above. +
  +
Availability: Only with hardware emulator Janus. +
  +
Group: Special commands +
  +
See Also: Binding +
  + +
+ +

4.20.5.1 Bindings for Janus

+ + + + + + +
C: #include <tos.h> +
  +
void Janus( int16_t mode ) +
  +
Assembler: +
  +
move.w    mode,-(sp)    ; Offset 2
+move.w    #43,-(sp)     ; Offset 0
+trap      #14           ; Call XBIOS
+addq.l    #4,sp         ; Correct stack
+
+ +
+ +

4.20.6 Puntaes

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »punt AES« - Switch off AES in ROM +
  +
Opcode: 39 +
  +
Syntax: void Puntaes( void ); +
  +
Description: The XBIOS function Puntaes switches off the AES part of the +operating system. The AES will start only if the "os_magic" +in OSHEADER has the magic number 0x87654321. Puntaes sets the flag +back (if possible) and reboots the system. Note that the call is only +valid with disk-loaded AES's. +
  +
Hint: Ab MagiC 4.00 wurde diese Funktion verändert und +besitzt verschiedene Unterfunktionen. Zum Aufruf muss zusätzlich der +Wert 'AnKr' übergeben werden. Bei einer falschen Funktionsnummer wird +EINVFN zurückgeliefert. +
  +
int32_t Puntaes ( 'AnKr', subfn, ... ) +
+
  +
    +
  • int32_t Puntaes ( 'AnKr', 0 ) +
    System beenden und zurück zum MacOS bzw. Windows +
      +

  • +
  • int32_t Puntaes ( 'AnKr', 1, int16_t keycode ) +
    Wandle folgenden Alt-Tastencode in ASCII u. +
      +

  • +
  • int32_t Puntaes ( 'AnKr', 2 ) +
    Neustart (warm_boot, nur für Atari) +
      +

  • +
  • int32_t Puntaes ( 'AnKr', 3 ) +
    Kaltstart (cold_boot, nur für Atari) +
      +

  • +
  • int32_t Puntaes ( 'AnKr', 4, int32_t key ) seit 12.04.1998 +
    Ermittle Cookie +
    Liefert den Zeiger des Cookies key oder 0L wenn er nicht +vorhanden ist. +
      +

  • +
  • int32_t Puntaes ( 'AnKr', 5 ) +
    Date2str: initialisiert die interne Variable datemode von MagiC +und liefert einen Zeiger auf die interne Funktion date2str. +
      +
    void date2str ( int8_t *s, int16_t date ); +
    DOS-Datum in eine Zeichenkette umwandeln. +
      +

  • +
  • int32_t Puntaes ( 'AnKr', 6, vtsys *pointer ) +
    VT52 anmelden, alten Vektor zurückgeben. Ist pointer -1 +dann wird nur der alte Vektor zurückgeliefert, bei 0 wird er +gelöscht. +
      +

  • +
+ +
Return value: Die Funktion liefert kein Ergebnis. +
  +
Availability: All TOS versions. +
  +
Group: Special commands +
  +
See Also: Binding   Cookie function +
  + +
+ +

4.20.6.1 Bindings for Puntaes

+ + + + + + +
C: #include <tos.h> +
  +
void Puntaes( void ); +
  +
Assembler: +
  +
move.w    #39,-(sp)    ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

4.20.7 Random

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »random generator« - Random number generator +
  +
Opcode: 17 +
  +
Syntax: int32_t Random( void ); +
  +
Description: The XBIOS routine Random returns a 24-bit random number (based +on a clock in the computer). +
  +
Note: With this function we are not dealing with +a hardware random number generator, but with a software version, which +uses the following algorithm: +
  +
X = (X * 3.1415926...) + 1
+
+
The return value is X shifted by 8 bits to the right, i.e. using +the lower three bytes of the returned int32_t. Incidentally, the +behaviour for the complete number is pretty good, the inquiry of +individual bits in the sense of reduced randomness is however +not advisable. +
  +
Return value: The function returns a 24-bit random number. +
  +
Availability: All TOS versions. +
  +
Group: Special commands +
  +
See Also: Binding +
  + +
+ +

4.20.7.1 Bindings for Random

+ + + + + + +
C: #include <tos.h> +
  +
int32_t Random( void ); +
  +
Assembler: +
  +
move.w    #17,-(sp)    ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #2,sp        ; Correct stack
+
+ +
+ +

4.20.8 Ssbrk

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »set memory break point« - Reserve memory +
  +
Opcode: 1 +
  +
Syntax: void *Ssbrk( int16_t count ); +
  +
Description: The XBIOS routine Ssbrk reserves memory at the top of RAM. The +number of bytes must be passed in count. This function must be +called prior to the initialization of GEMDOS, and should therefore +not be used by application programs. In all the Atari ROM +versions this function is implemented only as a dummy routine. +
  +
Return value: The function returns the start address of the allocated memory +segment. +
  +
Availability: All TOS versions. +
  +
Group: Special commands +
  +
See Also: Binding +
  + +
+ +

4.20.8.1 Bindings for Ssbrk

+ + + + + + +
C: #include <tos.h> +
  +
void *Ssbrk( int16_t count ); +
  +
Assembler: +
  +
move.w    count,-(sp)  ; Offset 2
+move.w    #1,-(sp)     ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #4,sp        ; Correct stack
+
+ +
+ +

4.20.9 Supexec

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »supervisor execute« - Start routine in supervisor-mode. +
  +
Opcode: 38 +
  +
Syntax: int32_t Supexec( int32_t (*func)( ) ); +
  +
Description: The XBIOS routine Supexec executes a user-defined routine in +supervisor-mode. func is the address of the function to be +called in supervisor-mode. +
  +
Return value: The function returns the int32_t value returned by the user +function. +
  +
Availability: All TOS versions. +
  +
Group: Special commands +
  +
See Also: Binding   Super +
  + +
+ +

4.20.9.1 Bindings for Supexec

+ + + + + + +
C: #include <tos.h> +
  +
int32_t Supexec( int32_t (*func)( ) ); +
  +
Assembler: +
  +
pea       func         ; Offset 2
+move.w    #38,-(sp)    ; Offset 0
+trap      #14          ; Call XBIOS
+addq.l    #6,sp        ; Correct stack
+
+ +
+ +

4.20.10 Trapper

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Trapper« - Hook into system functions. +
  +
Opcode: 555 +
  +
Syntax: int32_t xbios( 555, int16_t layer, int16_t install, int16_t +opcode, void *function ); +
  +
Description: With the aid of Trapper, other programs can hook themselves +simply and effectively before and after system calls - even completely +replace them - or add new system calls to the system. +
  +
With Trapper we are dealing with an external program! +
  +
More information in the instructions to be found there. +
  +
Return value: +
  +
Availability: The function is only present on computers on which the program +Trapper has been installed. +
  +
Group: Special commands +
  +
See Also: Binding +
  + +
+ +

4.20.10.1 Bindings for Trapper

+ + + + + + +
C: #include <tos.h> +
  +
int32_t xbios( 555, int16_t layer, int16_t install, int16_t +opcode, void *function ); +
  +
Assembler: +
  +
pea (a2)                  ; TOS does not save A2 in traps
+move.l    function,-(sp)  ; Offset 8
+move.w    opcode,-(sp)    ; Offset 6
+move.w    install,-(sp)   ; Offset 4
+move.w    layer,-(sp)     ; Offset 2
+move.w    #555,-(sp)      ; Offset 0
+trap      #14             ; Call XBIOS
+lea       12(sp),sp       ; Correct stack
+move.l    (sp)+,a2        ; restore A2
+
+ +
+ +

4.20.11 WdgCtrl

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »WdgCtrl« - Set the hardware watchdog. +
  +
Opcode: 161 +
  +
Syntax: int32_t WdgCtrl ( int16_t OpCode ); +
  +
Description: This function disables or activates the hardware watchdog. +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
ParameterValue
OpCode0x0000 - Return 0 to check that WdgCtrl is
          present
 0x1234 - Enable watchdog
 0xdead - Disable watchdog
 0x4242 - Re-trigger watchdog
+
+ +
Note: The function is only meant for the hardware of the +Milan 2.1. The version however exists only as a special version and is +not freely available. +
  +
Return value: +
  + + + + + + + + + +
E_OK (0) - OK +
EUNDEV (-15) - No watchdog present +
EBADRQ (-5) - Unimplemented OpCode + +
+ +
Availability: The function is present from MilanTOS with the date 2002-06-09 +onwards. +
  +
Group: Special commands +
  +
See Also: Binding +
  + +
+ +

4.20.11.1 Bindings for WdgCtrl

+ + + + + + +
C: +
  +
int32_t WdgCtrl ( int16_t OpCode ); +
  +
Assembler: +
  +
pea (a2)                  ; TOS does not save A2 in traps
+move.w    OpCode,-(sp)    ; Offset 2
+move.w    #161,-(sp)      ; Offset 0
+trap      #14             ; Call XBIOS
+lea       4(sp),sp        ; Correct stack
+move.l    (sp)+,a2        ; restore A2
+
+ +
+ +
+ +Home +XBIOSXBIOS +Sound routinesSound routines +Keyboard functionsKeyboard functions + + diff --git a/en/xbios_structures.html b/en/xbios_structures.html new file mode 100644 index 000000000..10d3f3c9e --- /dev/null +++ b/en/xbios_structures.html @@ -0,0 +1,974 @@ + + + + + +The documentation for TOS: XBIOS Structures + + + + + + + + + +Home +XBIOSXBIOS +XBIOS function listXBIOS function list +GEMDOSGEMDOS + +
+ +

4.24 XBIOS Structures

+ +
+

4.24.1 BCONMAP

+
typedef struct
+{
+   MAPTAB  *maptab;     /* List of the serial ports                   */
+   int16_t  maptabsize; /* Number of port drivers                     */
+
+   /* Undocumented, with TOS and MagiC:                               */
+   int16_t  auxnr;      /* Current channel number set for AUX         */
+   int32_t  rscon;      /* Pointer to currently set Rsconf function   */
+   int32_t  iorec;      /* Pointer to IOREC of the current channel    */
+} BCONMAP;
+
+See also: Bconmap
+
+

4.24.2 CD_DISC_INFO

+
typedef struct
+{
+   uint8_t  disctype;         /* 0: audio, 1: data */
+   uint8_t  firsttrack, lasttrack, curtrack;
+   uint8_t  relposz, relposm, relposs, relposf;
+   uint8_t  absposz, absposm, absposs, absposf;
+   uint8_t  endposz, endposm, endposs, endposf;
+   uint8_t  index, res[3];
+   uint32_t reserved[123];
+} CD_DISC_INFO;
+
+

See also: Metadiscinfo +

+

4.24.3 CD_TOC_ENTRY

+
typedef struct
+{
+   uint8_t trackno;
+   uint8_t minute;
+   uint8_t second;
+   uint8_t frame;
+} CD_TOC_ENTRY;
+
+

See also: CD-ROM Opcodes for Fcntl +

+

4.24.4 DSPBLOCK

+
typedef struct
+{
+   int16_t  blocktype;  /* Type of data in buffer:  */
+                        /*   0 : LongInt            */
+                        /*   1 : Integer            */
+                        /*   2 : Byte               */
+   int32_t  blocksize;  /* Buffer size              */
+   void    *blockaddr;  /* Pointer to the buffer    */
+} DSPBLOCK;
+
+
+

See also: Dsp_MultBlocks   DSP programming +

+

4.24.5 IOREC

+
typedef struct
+{
+   void    *ibuf;        /* Pointer to buffer      */
+   int16_t ibufsiz;      /* Size of buffer         */
+   int16_t ibufhd;       /* Head index             */
+   int16_t ibuftl;       /* Tail index             */
+   int16_t ibuflow;      /* Low-water mark         */
+   int16_t ibufhi;       /* High-water mark        */
+} IOREC;
+
+

Note: The serial ports are connected directly to a +corresponding output buffer. The two last pointers are only used for +the serial port in XON/XOFF or RTS/CTS operation. +

+

If the buffer fill-level falls below the low-water mark, the +sender is invited to send further characters; on the other hand, if it +exceeds the high-water mark then it is signalled not to send any more +characters. +

+

See also: Iorec +

+

4.24.6 KEYBDPARMS

+
typedef struct
+{
+   int8_t *unshift;       /* Table of 'normal' key presses  */
+   int8_t *shift;         /* Table of Shift key presses     */
+   int8_t *capslock;      /* Table of Capslock key presses  */
+   int8_t *altunshift;    /* From TOS 4.00, undocumented!   */
+   int8_t *altshift;      /* From TOS 4.00, undocumented!   */
+   int8_t *altcapslock;   /* From TOS 4.00, undocumented!   */
+   int8_t *altgr;         /* From TOS 4.00, undocumented!   */
+} KEYTAB;
+
+

See also: Keytbl +

+

4.24.7 KBDVBASE

+
typedef struct
+{
+   void   (*kb_midivec)();   /* MIDI interrupt vector    */
+   void   (*kb_vkbderr)();   /* Keyboard error vector    */
+   void   (*kb_vmiderr)();   /* MIDI error vector        */
+   void   (*kb_statvec)();   /* Keyboard status          */
+   void   (*kb_mousevec)();  /* Keyboard mouse status    */
+   void   (*kb_clockvec)();  /* Keyboard clock           */
+   void   (*kb_joyvec)();    /* Keyboard joystick status */
+   void   (*kb_midisys)();   /* System Midi vector       */
+   void   (*kb_kbdsys)();    /* Keyboard vector          */
+   int8_t drvstat;           /* Keyboard driver status   */
+} KBDVBASE;
+
+

Note: For the elements kb_clockvec and +kb_joyvec one should note that the address of the packet is +passed in register A0 and on the stack; also, the routines should be +terminated with an RTS, and if possible run for no more than 1ms. +

+

The element drvstat contains a non-zero value when the +IKBD is in the process of sending a packet. +

+

See also: Kbdvbase +

+

4.24.8 KEYTAB

+
typedef struct
+{
+   int8_t *unshift;       /* Table of 'normal' key presses  */
+   int8_t *shift;         /* Table of Shift key presses     */
+   int8_t *capslock;      /* Table of Capslock key presses  */
+   int8_t *altunshift;    /* From TOS 4.00, undocumented!   */
+   int8_t *altshift;      /* From TOS 4.00, undocumented!   */
+   int8_t *altcapslock;   /* From TOS 4.00, undocumented!   */
+   int8_t *altgr;         /* From TOS 4.00, undocumented!   */
+} KEYTAB;
+
+

Since KAOS 1.4.2 and MagiC are altunshift, +altshift and altcapslock also present. +

+

See also: Keytbl +

+

4.24.9 MAPTAB

+
typedef struct
+{
+   int16_t  (*Bconstat)(void);
+   int32_t  (*Bconin)(void);
+   int32_t  (*Bcostat)(void);
+   void     (*Bconout)(int16_t dev, int16_t c);
+   uint32_t (*Rsconf)(int16_t baud, int16_t ctr, int16_t ucr, int16_t rsr, int16_t tsr, int16_t scr);
+   IOREC    *iorec;
+} MAPTAB;
+
+

See also: Bconmap   BCONMAP +

+

4.24.10 META_DRVINFO

+
typedef struct
+{
+   int8_t  *mdr_name;
+   int32_t  reserved[3];
+} META_DRVINFO;
+
+

See also: Drive functions   Metaopen +

+

4.24.11 META_INFO_1

+
typedef struct
+{
+   uint32_t    drivemap;  /* Bits for MetaDOS drives.        */
+                          /*   ((Bit 0 = Drive A:, etc.)     */
+   int8_t      *version;  /* Name and version from MetaDOS   */
+   int32_t     reserved;  /* Reserved                        */
+   META_INFO_2 *info;     /* Pointer to a second structure   */
+} META_INFO_1;
+
+

Note: The element info is available from MetaDOS +V2.30! +

+

See also: Metainit +

+

4.24.12 META_INFO_2

+
typedef struct
+{
+   /* Version number (0x230 = '02.30') */
+   uint16_t     mi_version;
+   /* Magic constant '_MET' */
+   int32_t      mi_magic;
+   /* Maps DOS IDs to MetaDOS XBIOS device numbers */
+   const int8_t *mi_log2phys;
+} META_INFO_2;
+
+

Note: This structure exists only as of MetaDOS Version +2.30. The parameter mi_log2phys is a pointer to a field that +holds for each GEMDOS device the associated MetaDOS drive letter or +Null. So with the aid of this information one can determine which +MetaDOS drive letter belongs to which GEMDOS drive. +

+

See also: Metainit   META_INFO_1 +

+

4.24.13 MOD_DESC

+
typedef struct
+{
+   int8_t  Name[34];   /* Descriptive text         */
+   int32_t colors;
+   int16_t xres,yres;
+   int32_t fileptr;    /* Pointer to the mode file */
+} MOD_DESC;
+
+

See also: Crazy-Dots XBIOS extension +

+

4.24.14 MOUSE

+
typedef struct
+{
+   int8_t  topmode;  /* 0: Y=0 at bottom             */
+                     /* 1: Y=1 at top                */
+   int8_t  buttons;  /* Similar to  IKBD             */
+   int8_t  x_scale;  /* Additional parameters        */
+   int8_t  y_scale;  /* Dependent on selected mode   */
+   int16_t x_max;    /* Maximum X position           */
+   int16_t y_max;    /* Maximum Y position           */
+   int16_t x_start;  /* Start position X             */
+   int16_t y_start;  /* Start position Y             */
+} MOUSE;
+
+

Note: The elements x_max and following are only +available in absolute mode. +

+

See also: GEM   Initmouse   VDI +

+

4.24.15 OVERPATCH

+
typedef struct
+{
+   int16_t low_w  ,mid_w  ,high_w;   /* Width in pixels                  */
+   int16_t low_h  ,mid_h  ,high_h;   /* Height in pixels                 */
+   int32_t low_off,mid_off,high_off; /* Offset screen memory<>logbase    */
+   int32_t mono_add,color_add;       /* Additional memory requirement    */
+   int8_t  clear_scan;               /* Scancode of the clear function   */
+   int8_t  clear_shift;              /* Shiftcode of the clear function  */
+   int8_t  setup_shift;              /* Shiftcode for setup (mask)       */
+   int8_t  invert_shift;             /* Shiftcode for inverting the mode */
+   int8_t  abort_shift;              /* Shiftcode for termination        */
+} OVERPATCH;
+
+

See also: Oscanpatch   OverScan XBIOS extension +

+

4.24.16 PBDEF

+
typedef struct
+{
+   void    *pb_scrptr;  /* Pointer to start of screen memory */
+   int16_t  pb_offset;  /* Offset to be added to this        */
+   int16_t  pb_width;   /* Screen width in dots              */
+   int16_t  pb_height;  /* Screen height in dots             */
+   int16_t  pb_left;    /* Left margin in dots               */
+   int16_t  pb_right;   /* Right margin in dots              */
+   int16_t  pb_screz;   /* Resolution                        */
+   int16_t  pb_prrez;   /* Printer type (Atari/Epson)        */
+   void    *pb_colptr;  /* Pointer to colour palette         */
+   int16_t  pb_prtype;  /* 0: Atari matrix monochrome
+                           1: Atari matrix colour
+                           2: Atari daisywheel monochrome
+                           3: Epson matrix monochrome        */
+   int16_t  pb_prport;  /* Centronics/RS-232 port            */
+   void    *pb_mask;    /* Pointer to halftone mask          */
+} PBDEF;
+
+

Note: One has to ensure that the sum of the elements +pb_width, pb_left and pb_right corresponds +exactly to the actual screen width. +

+

See also: Prtblk   XBIOS +

+

4.24.17 PCI_RSC_DESC

+
typedef struct
+{
+  uint16_t next;      /* Length of this structure in bytes          */
+                      /* Use this to get next descriptor            */
+  uint16_t flags;     /* Type of resource and misc flags            */
+  uint32_t start;     /* Start address of resource in PCI address space */
+  uint32_t length;    /* Length of resource                         */
+  uint32_t offset;    /* Offset from PCI to physical CPU address    */
+  uint32_t dmaoffset; /* Offset for DMA-Memory transfers            */
+} PCI_RSC_DESC;
+
+

The flags field is bit-coded as follows: +

+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RSC_ROM0x2000This is an expansion ROM (must be Memory, not IO)
RSC_IO0x4000This is an IO area (memory area if bit is clear)
RSC_LAST0x8000Last resource for this device
FLG_8BIT0x01008-bit accesses are supported
FLG_16BIT0x020016-bit accesses are supported
FLG_32BIT0x040032-bit accesses are supported
FLG_ENDMASK0x000FBit 0..3 specify which byte ordering is used:
  0: Motorola (big endian)
  1: Intel (little endian), address swapped
  2: Intel (little endian), lane swapped
  3..14: Reserved
  15: Unknown. Access card only via BIOS functions
+
+ +

The start field contains the start address on the PCI +bus of the resource. If the resource is not directly accessible, the +start address is 0. +

+

The length field contains its length. +

+

The offset field contains the offset from physical CPU +to PCI address for the resource - ie. the value that must be added to +the PCI address to get the physical address in CPU address space. +

+

The dmaoffset gives the offset that a PCI bus master +must add to a CPU memory address to access that address in main memory +over the PCI BUS. +

+

What are all these byte orders? +

+

The PCI-bus is defined as a little endian byte ordering bus. The +most significant byte of a multi-byte number is located at the lowest +address occupied by this number. +

+

The 68xxx-series CPUs are big endian. PCI-bus and CPU are +connected together by a host bridge which does some kind of format +conversion. The PCI-BIOS knows about the format conversion performed +by the host bridge. The PCI-BIOS does not know about any format +conversion done (internally) by PCI devices. The driver has to know +its device's properties and capabilities. +

+

The table shows what 68xxx data byte (top row) is connected to +what PCI-bus data byte (lower right) by what 68xxx-access and format +conversion (left column): +

+
                  68xxx-CPU data bus bits
+                  D31..24  D23..16  D15..8   D7..0
+----------------------------------------------------
+big endian
+32-bit-access +0  D31..24  D23..16  D15..8   D7..0
+16-bit-access +0  D15..8   D7..0
+16-bit-access +2                    D31..24  D23..16
+ 8-bit-access +0  D7..0
+ 8-bit-access +1           D15..8
+ 8-bit-access +2                    D23..16
+ 8-bit-access +3                             D31..24
+----------------------------------------------------
+little endian, lane swapped
+32-bit-access +0  D0..7    D15..8   D23..16  D31..24
+16-bit-access +0  D0..7    D15..8
+16-bit-access +2                    D23..16  D31..24
+ 8-bit-access +0  D0..7
+ 8-bit-access +1           D15..8
+ 8-bit-access +2                    D23..16
+ 8-bit-access +3                             D31..24
+----------------------------------------------------
+little endian, address swapped
+32-bit-access +0  D31..24  D23..16  D15..8   D7..0
+16-bit-access +0  D31..24  D23..16
+16-bit-access +2                    D15..8   D7..0
+ 8-bit-access +0  D31..24
+ 8-bit-access +1           D23..16
+ 8-bit-access +2                    D15..8
+ 8-bit-access +3                             D7..0
+
+
    +
  • "Big endian" makes the PCI-bus appear as a big endian +resource from the viewpoint of the 68xxx processor. It requires +dynamic route changes in the host bridge and seems not to be +implemented by any host bridge. +
      +

  • +
  • "Little endian, lane swapped" is the easy way to make +8 bit per pixel modes work in the frame buffer of a PCI-device (VGA +controller) which does not have its own format conversion. This mode +is used in PCI-Macintoshs and for memory and IO accesses in the Milan. +In this mode, the address needs no modifications. 8-bit accesses work +normal, on 16 and 32 bit accesses endian conversion must be performed +on the the read or written data (ror.w #8,d0 for 16 bit, ror.w +#8,d0:swap d0:ror.w #8,d0 for 32 bit). +
      +

  • +
  • "Little endian, address swapped" is the way to go if +accesses to 32 bit registers or 32 bit per pixel frame buffers have +top priority. In this mode, 32 bit accesses work without +modifications. On 16 bit accesses, the address needs to be XOR'd with +a value of 2, on 8-bit accesses the address is XOR'd with a value of +3. The data read or written is in correct format. +
      +

  • +
+ +

See also: get_resource +

+

4.24.18 PMODE

+
typedef struct  {
+   int8_t  name[34];
+   int16_t mode_id;       /* Running number                        */
+   int16_t xres,yres;     /* Width/height in pixels                */
+   int16_t fx,fy;         /* Width/height in total                 */
+   int32_t colors;        /* Number of simultaneous colours        */
+   int16_t org;           /* Organisation of the memory            */
+   int16_t fh10,fv10;     /* Line-freq.*10, frame-freq.*10         */
+   int16_t aspect100;     /* 100*pixel-width/pixel-height          */
+   int16_t disp_scan100;
+   int32_t clk;           /* Dot clock in Hz                       */
+   /*
+   * Register of the graphics controller
+   */
+   int16_t Clock;         /* Frequency number, must be translated  */
+                          /* via the IcsLut before writing into
+                             the clock register (see below)        */
+   int8_t  misc_out;
+   int8_t  ts[10];        /* Timing sequencer regs.                */
+   int8_t  crtc[35];      /* CRT controller regs.                  */
+   int8_t  gdc[10];       /* Graphics display controller           */
+   int8_t  atc[24];       /* Attributes of controller              */
+   int8_t  reserved[18];
+} PMODE;
+
+static int8_t IcsLut[32] = { 0,16,8,24,4,20,12,28,2,18,10,26,6,22,14,
+               30,1,17,9,25,5,21,13,29,3,19,11,27,7,23,15,31 };
+
+

See also: Crazy-Dots XBIOS extension   ReadMode   +GetActiveModeDesc +

+

4.24.19 SCRCLIPMEMBLK

+
typedef struct _scrclipblk
+{
+  int32_t size;        /* size of structure            */
+  int32_t blk_status;  /* status bits of blk           */
+  int32_t blk_clip_on; /* clipping flag 1:on, 0:off    */
+  int32_t blk_x;       /* x pos in total screen        */
+  int32_t blk_y;       /* y pos in in total screen     */
+  int32_t blk_w;       /* width                        */
+  int32_t blk_h;       /* height                       */
+} SCRCLIPMEMBLK;
+
+

See also: Setscreen, ct60 +

+

4.24.20 SCRCOPYMEMBLK

+
typedef struct _scrcopyblk
+{
+  int32_t size;                 /* size of structure            */
+  int32_t blk_status;           /* status bits of blk           */
+  int32_t blk_src_x;            /* x pos source in total screen */
+  int32_t blk_src_y;            /* y pos source in total screen */
+  int32_t blk_dst_x;            /* x pos dest in total screen   */
+  int32_t blk_dst_y;            /* y pos dest in total screen   */
+  int32_t blk_w;                /* width                        */
+  int32_t blk_h;                /* height                       */
+  int32_t blk_op;               /* mode operation               */
+} SCRCOPYMEMBLK;
+
+

See also: Setscreen, ct60 +

+

4.24.21 SCREEN

+
typedef struct
+{
+   int8_t   xbra_id[4];       /* XBRA ID: 'CDOT'                      */
+   int8_t   version[4];       /* At present: '1.10'                   */
+   int8_t  *sm194_addr;       /* Pointer to large screen memory       */
+   int8_t  *sm124_addr;       /* Pointer to SM124 screen memory       */
+   LINEA   *line_A;           /* Pointer to LINE_A block              */
+   int16_t  scrn_width;       /* Screen width                         */
+   int16_t  scrn_height;      /* Screen height                        */
+   int16_t  scrn_byte_width;  /* Screen width in bytes                */
+   int16_t  scrn_planes;      /* Screen colour planes                 */
+   int16_t  PhysMode;         /* Mode mumber                          */
+   int16_t  VirtMode;         /* x/16 & y/16 each coded in 1 byte     */
+   PMODE   *ModStruct;        /* Pointer to current graphic mode      */
+   int16_t  grau;   /* Flag for the VDI driver (Display: Grey/colour) */
+   int16_t  BiosText;         /* Flag for the VDI driver              */
+   int16_t  CurText;          /* Flag for the VDI driver              */
+   int16_t  BlitMode;         /* Flag for the VDI driver              */
+} SCREEN;
+
+

See also: Crazy-Dots XBIOS extension +

+

4.24.22 SCREENINFO

+ + + + + + + + + + +
/* scrFlags */
+ #define SCRINFO_OK 1
+
+/* scrClut */
+ #define NO_CLUT    0
+ #define HARD_CLUT  1
+ #define SOFT_CLUT  2
+
+/* scrFormat */
+ #define INTERLEAVE_PLANES  0
+ #define STANDARD_PLANES    1
+ #define PACKEDPIX_PLANES   2
+
+/* bitFlags */
+ #define STANDARD_BITS  1
+ #define FALCON_BITS    2
+ #define INTEL_BITS     8
+
+typedef struct screeninfo
+{
+  int32_t size;        /* Size of structur           */
+  int32_t devID;       /* Device ID number           */
+  int8_t  name[64];    /* Friendly name of Screen    */
+  int32_t scrFlags;    /* Some flags                 */
+  int32_t frameadr;    /* Adress of framebuffer      */
+  int32_t scrHeight;   /* Visible X res              */
+  int32_t scrWidth;    /* Visible Y res              */
+  int32_t virtHeight;  /* Virtual X res              */
+  int32_t virtWidth;   /* Virtual Y res              */
+  int32_t scrPlanes;   /* color Planes               */
+  int32_t scrColors;   /* # of colors                */
+  int32_t lineWrap;    /* # of bytes to next line    */
+  int32_t planeWarp;   /* # of bytes to next plane   */
+  int32_t scrFormat;   /* Screen format              */
+  int32_t scrClut;     /* Type of clut               */
+  int32_t redBits;     /* Mask of Red Bits           */
+  int32_t greenBits;   /* Mask of Green Bits         */
+  int32_t blueBits;    /* Mask of Blue Bits          */
+  int32_t alphaBits;   /* Mask of Alpha Bits         */
+  int32_t genlockBits; /* Mask of Genlock Bits       */
+  int32_t unusedBits;  /* Mask of unused Bits        */
+  int32_t bitFlags;    /* Bits organisation flags    */
+  int32_t maxmem;      /* Max. memory in this mode   */
+  int32_t pagemem;     /* Needed memory for one page */
+  int32_t max_x;       /* Max. possible width        */
+  int32_t max_y;       /* Max. possible heigth       */
+}SCREENINFO;
+
+

See also: Setscreen, Milan   Setscreen, ct60 +

+

4.24.23 SCREEN, OverScan

+
typedef struct
+{
+   int16_t width;             /* Width in pixels                     */
+   int16_t height;            /* Height in pixels                    */
+   int16_t bytes_per_line;    /* Bytes per screen line               */
+   int32_t length_of_screen;  /* Length of screen memory in bytes    */
+   int32_t physbase_offset;   /* Offset start screen mem.<>Physbase  */
+   int32_t logbase_offset;    /* Offset start screen mem.<>Logbase   */
+} SCREEN;
+
+

See also: OverScan XBIOS functions   Oscantab +

+

4.24.24 SCRFILLMEMBLK

+
/* operations */
+ #define BLK_CLEAR        0
+ #define BLK_AND          1
+ #define BLK_ANDREVERSE   2
+ #define BLK_COPY         3
+ #define BLK_ANDINVERTED  4
+ #define BLK_NOOP         5
+ #define BLK_XOR          6
+ #define BLK_OR           7
+ #define BLK_XNOR         8
+ #define BLK_EQUIV        9
+ #define BLK_INVERT       10
+ #define BLK_ORREVERSE    11
+ #define BLK_COPYINVERTED 12
+ #define BLK_ORINVERTED   13
+ #define BLK_NAND         14
+ #define BLK_SET          15
+
+typedef struct _scrsetblk
+{
+  int32_t size;                  /* size of structure           */
+  int32_t blk_status;            /* status bits of blk          */
+  int32_t blk_op;                /* mode operation              */
+  int32_t blk_color;             /* background fill color       */
+  int32_t blk_x;                 /* x pos in total screen       */
+  int32_t blk_y;                 /* y pos in total screen       */
+  int32_t blk_w;                 /* width                       */
+  int32_t blk_h;                 /* height                      */
+  int32_t blk_unused;
+} SCRFILLMEMBLK;
+
+

See also: Setscreen, ct60 +

+

4.24.25 SCRLINEMEMBLK

+
typedef struct _scrlineblk
+{
+  int32_t size;        /* size of structure            */
+  int32_t blk_status;  /* status bits of blk           */
+  int32_t blk_fgcolor; /* foreground fill color        */
+  int32_t blk_bgcolor; /* background fill color        */
+  int32_t blk_x1;      /* x1 pos dest in total screen  */
+  int32_t blk_y1;      /* y1 pos dest in total screen  */
+  int32_t blk_x2;      /* x2 pos dest in total screen  */
+  int32_t blk_y2;      /* y2 pos dest in total screen  */
+  int32_t blk_op;      /* mode operation               */
+  int32_t blk_pattern; /* pattern (-1: solid line)     */
+} SCRLINEMEMBLK;
+
+

See also: Setscreen, ct60 +

+

4.24.26 SCRMEMBLK

+ + + +
+ #define BLK_ERR      0
+ #define BLK_OK       1
+ #define BLK_CLEARED  2
+
+typedef struct _scrblk
+{
+  int32_t size;              /* Size of strukture                  */
+  int32_t blk_status;        /* Status bits of blk                 */
+  int32_t blk_start;         /* Start adress                       */
+  int32_t blk_len;           /* Length of memblk                   */
+  int32_t blk_x;             /* X pos in total screen              */
+  int32_t blk_y;             /* Y pos in total screen              */
+  int32_t blk_w;             /* Width                              */
+  int32_t blk_h;             /* Height                             */
+  int32_t blk_wrap;          /* Width in bytes, from: 2000-01-13   */
+} SCRMEMBLK;
+
+

See also: Setscreen, Milan   Setscreen, ct60 +

+

4.24.27 SCRTEXTUREMEMBLK

+
typedef struct _scrtextureblk
+{
+  long size;                /* size of structure             */
+  long blk_status;          /* status bits of blk            */
+  long blk_src_x;           /* x pos source                  */
+  long blk_src_y;           /* y pos source                  */
+  long blk_dst_x;           /* x pos dest in total screen    */
+  long blk_dst_y;           /* y pos dest in total screen    */
+  long blk_w;               /* width                         */
+  long blk_h;               /* height                        */
+  long blk_op;              /* mode operation                */
+  long blk_src_tex;         /* source texture address        */
+  long blk_w_tex;           /* width texture                 */
+  long blk_h_tex;           /* height texture                */
+}SCRTEXTUREMEMBLK;
+
+

See also: Setscreen, ct60 +

+

4.24.28 VDO_MODE

+
/* mode code xxxx xxxF SOPV 8NNN */
+typedef struct
+{
+   uint16_t Plan:3;            /* bit 0-2: NNN (number of planes)       */
+   uint16_t _80Col:1;          /* bit 3: 80 column flag (8)             */
+   uint16_t VGA:1;             /* bit 4: VGA flag (V)                   */
+   uint16_t Pal:1;             /* bit 5: PAL flag (P)                   */
+   uint16_t Overscan:1;        /* bit 6: Overscan flag (O)              */
+   uint16_t STComp:1;          /* bit 7: ST-compatible flag (S)         */
+   uint16_t Vertical:1;        /* bit 8: Vertical flag (F)              */
+   uint16_t NRJStart:1;        /* bit 9: Energy Star mode active or not */
+   uint16_t Eco:1;             /* bit 10: Economiser active or not      */
+   uint16_t Virtual:1;         /* bit 11: Virtual screen active or not  */
+   uint16_t ExtClock:1;        /* bit 12: External clock 32/36MHz (CT2) */
+   uint16_t ExtClockEnable:1;  /* bit 13: Enable external clock         */
+   uint16_t StandardResol:1;   /* bit 14: Standard resolution           */
+   uint16_t DefaultMode:1;     /* bit 15: Video default mode            */
+} VDO_MODE;
+
+

See also: VDO_PARAM +

+

4.24.29 VDO_PARAM

+
typedef struct
+{
+   int16_t V_Hdl;        /* Handle                                 */
+   VDO_MODE V_mode;      /* Video mode like on Falcon              */
+   int16_t  V_physw;     /* Width of the physical screen           */
+   int16_t  V_physh;     /* Height of the physical screen          */
+   int16_t  V_plan;      /* Number of plane                        */
+   int16_t  V_logw;      /* Width of the virtual screen            */
+   int16_t  V_logh;      /* Height of the virtual screen           */
+   int16_t  V_eco;       /* Delay in seconds before shut down      */
+   int16_t  V_eco2;      /* Delay in seconds between the shut down */
+                         /* and the Energy Star mode               */
+   int8_t   V_name[33];  /* Name of the video mode (32 bytes maxi) */
+                         /* terminated by a 0.                     */
+   int8_t   Reserved;    /* Reserved for future use                */
+   int32_t  V_length;    /* Length of buffer                       */
+} VDO_PARAM;
+
+

See also: Vread +

+

4.24.30 vidix_capability_t

+
typedef struct vidix_capability_s
+{
+   char    name[64];    /* Driver name */
+   char    author[64];  /* Author name */
+#define TYPE_OUTPUT      0x00000000    /* Is a video playback device */
+#define TYPE_CAPTURE     0x00000001    /* Is a capture device */
+#define TYPE_CODEC       0x00000002    /* Device supports hw (de)coding */
+#define TYPE_FX          0x00000004    /* Is a video effects device */
+   int    type;         /* Device type, see below */
+   unsigned reserved0[4];
+   int    maxwidth;
+   int    maxheight;
+   int    minwidth;
+   int    minheight;
+   int    maxframerate; /* -1 if unlimited */
+#define FLAG_NONE        0x00000000 /* No flags defined */
+#define FLAG_DMA         0x00000001 /* Card can use DMA */
+#define FLAG_EQ_DMA      0x00000002 /* Card can use DMA only if src pitch == dest pitch */
+#define FLAG_UPSCALER    0x00000010 /* Card supports hw upscaling */
+#define FLAG_DOWNSCALER  0x00000020 /* Card supports hw downscaling */
+#define FLAG_SUBPIC      0x00001000 /* Card supports DVD subpictures */
+#define FLAG_EQUALIZER   0x00002000 /* Card supports equalizer */
+   unsigned flags;      /* Feature flags, see above */
+   unsigned short vendor_id;
+   unsigned short device_id;
+   unsigned reserved1[4];
+}vidix_capability_t;
+
+

See also: VIDIX XBIOS extension +

+

4.24.31 vidix_deinterlace_t

+
typedef struct vidix_deinterlace_s
+{
+#define CFG_NON_INTERLACED        0x00000000 /* stream is not interlaced */
+#define CFG_INTERLACED            0x00000001 /* stream is interlaced */
+#define CFG_EVEN_ODD_INTERLACING  0x00000002 /* first frame contains even fields but second - odd */
+#define CFG_ODD_EVEN_INTERLACING  0x00000004 /* first frame contains odd fields but second - even */
+#define CFG_UNIQUE_INTERLACING    0x00000008 /* field deinterlace_pattern is valid */
+#define CFG_UNKNOWN_INTERLACING   0x0000000f /* unknown deinterlacing - use adaptive if it's possible */
+   unsigned    flags;               /* driver -> app */
+   unsigned    deinterlace_pattern; /* driver -> app: deinterlace pattern if flag CFG_UNIQUE_INTERLACING is set */
+}vidix_deinterlace_t;
+
+

See also: VIDIX XBIOS extension +

+

4.24.32 vidix_dma_t

+
typedef struct vidix_dma_s
+{
+   void *src;               /* app -> driver: Virtual address of source */
+   unsigned dest_offset;    /* app -> driver: Destination offset within of video memory */
+   unsigned size;           /* app -> driver: Size of transaction */
+#define BM_DMA_NOSYNC      0
+#define BM_DMA_SYNC        1 /* wait previous dma transfer completion */
+#define BM_DMA_FIXED_BUFFS 2 /* app uses buffers witch are fixed in memory */
+#define BM_DMA_BLOCK       4 /* block until the transfer is complete */
+   unsigned flags;          /* app -> driver */
+   unsigned idx;            /* app -> driver: index of the src buffer */
+   unsigned src_incr;       /* app -> driver: if src_incr & dest_incr are */
+   unsigned dest_incr;      /*                different, else 0 */
+   void *internal[VID_PLAY_MAXFRAMES];    /* for internal use by driver */
+}vidix_dma_t;
+
+

See also: VIDIX XBIOS extension +

+

4.24.33 vidix_fourcc_t

+
typedef struct vidix_fourcc_s
+{
+   unsigned fourcc; /* input: requested fourcc */
+   unsigned srcw;   /* input: hint: width of source */
+   unsigned srch;   /* input: hint: height of source */
+#define VID_DEPTH_NONE             0x0000
+#define VID_DEPTH_1BPP             0x0001
+#define VID_DEPTH_2BPP             0x0002
+#define VID_DEPTH_4BPP             0x0004
+#define VID_DEPTH_8BPP             0x0008
+#define VID_DEPTH_12BPP            0x0010
+#define VID_DEPTH_15BPP            0x0020
+#define VID_DEPTH_16BPP            0x0040
+#define VID_DEPTH_24BPP            0x0080
+#define VID_DEPTH_32BPP            0x0100
+   unsigned depth; /* output: screen depth for given fourcc */
+#define VID_CAP_NONE               0x0000
+#define VID_CAP_EXPAND             0x0001 /* if overlay can be bigger than source */
+#define VID_CAP_SHRINK             0x0002 /* if overlay can be smaller than source */
+#define VID_CAP_BLEND              0x0004 /* if overlay can be blended with framebuffer */
+#define VID_CAP_COLORKEY           0x0008 /* if overlay can be restricted to a colorkey */
+#define VID_CAP_ALPHAKEY           0x0010 /* if overlay can be restricted to an alpha channel */
+#define VID_CAP_COLORKEY_ISRANGE   0x0020 /* if the colorkey can be a range */
+#define VID_CAP_ALPHAKEY_ISRANGE   0x0040 /* if the alphakey can be a range */
+#define VID_CAP_COLORKEY_ISMAIN    0x0080 /* colorkey is checked against framebuffer */
+#define VID_CAP_COLORKEY_ISOVERLAY 0x0100 /* colorkey is checked against overlay */
+#define VID_CAP_ALPHAKEY_ISMAIN    0x0200 /* alphakey is checked against framebuffer */
+#define VID_CAP_ALPHAKEY_ISOVERLAY 0x0400 /* alphakey is checked against overlay */
+   unsigned flags; /* output: capability */
+}vidix_fourcc_t;
+
+

See also: VIDIX XBIOS extension +

+

4.24.34 vidix_grkey_t

+
typedef struct vidix_grkey_s
+{
+   vidix_ckey_t    ckey;      /* driver -> app: color key */
+   vidix_vkey_t    vkey;      /* driver -> app: video key */
+#define KEYS_PUT    0
+#define KEYS_AND    1
+#define KEYS_OR     2
+#define KEYS_XOR    3
+   unsigned    key_op;        /* driver -> app: keys operations */
+}vidix_grkey_t;
+
+

See also: VIDIX XBIOS extension +

+

4.24.35 vidix_playback_t

+
typedef struct vidix_playback_s
+{
+   unsigned fourcc;           /* app -> driver: movies's fourcc */
+   unsigned capability;       /* app -> driver: what capability to use */
+   unsigned blend_factor;     /* app -> driver: blending factor */
+   vidix_rect_t src;          /* app -> driver: original movie size */
+   vidix_rect_t dest;         /* app -> driver: destinition movie size. driver->app dest_pitch */
+#define VID_PLAY_INTERLEAVED_UV 0x00000001    /* driver -> app: interleaved UV planes */
+#define INTERLEAVING_UV         0x00001000    /* UVUVUVUVUV used by Matrox G200 */
+#define INTERLEAVING_VU         0x00001001    /* VUVUVUVUVU */
+   int        flags;
+   /* memory model */
+   unsigned frame_size;       /* driver -> app: destinition frame size */
+   unsigned num_frames;       /* app -> driver: after call: driver -> app */
+#define VID_PLAY_MAXFRAMES 64 /* reasonable limitation for decoding ahead */
+   unsigned offsets[VID_PLAY_MAXFRAMES];    /* driver -> app */
+   vidix_yuv_t    offset;     /* driver -> app: relative offsets within frame for yuv planes */
+   void    *dga_addr;         /* driver -> app: linear address */
+}vidix_playback_t;
+
+

See also: VIDIX XBIOS extension +

+

4.24.36 vidix_video_eq_t

+
typedef struct vidix_video_eq_s
+{
+#define VEQ_CAP_NONE            0x00000000UL
+#define VEQ_CAP_BRIGHTNESS      0x00000001UL
+#define VEQ_CAP_CONTRAST        0x00000002UL
+#define VEQ_CAP_SATURATION      0x00000004UL
+#define VEQ_CAP_HUE             0x00000008UL
+#define VEQ_CAP_RGB_INTENSITY   0x00000010UL
+   int        cap;             /* should contain capability of equalizer */
+   /* end-user app can have presets like: cold-normal-hot picture and so on */
+   int        brightness;      /* -1000 : +1000 */
+   int        contrast;        /* -1000 : +1000 */
+   int        saturation;      /* -1000 : +1000 */
+   int        hue;             /* -1000 : +1000 */
+   int        red_intensity;   /* -1000 : +1000 */
+   int        green_intensity; /* -1000 : +1000 */
+   int        blue_intensity;  /* -1000 : +1000 */
+#define VEQ_FLG_ITU_R_BT_601    0x00000000 /* ITU-R BT.601 colour space (default) */
+#define VEQ_FLG_ITU_R_BT_709    0x00000001 /* ITU-R BT.709 colour space */
+#define VEQ_FLG_ITU_MASK        0x0000000f
+   int        flags;           /* currently specifies ITU YCrCb color space to use */
+}vidix_video_eq_t;
+
+

See also: VIDIX XBIOS extension +

+

4.24.37 VPOS

+
typedef struct
+{
+   int16_t x;
+   int16_t y;
+} VPOS;
+
+

See also: Vseek +

+
+ +Home +XBIOSXBIOS +XBIOS function listXBIOS function list +GEMDOSGEMDOS + + diff --git a/en/xbios_trap.html b/en/xbios_trap.html new file mode 100644 index 000000000..6593acdeb --- /dev/null +++ b/en/xbios_trap.html @@ -0,0 +1,62 @@ + + + + + +The documentation for TOS: xbios-trap + + + + + + + + + +Home +XBIOSXBIOS +XBIOS error-messagesXBIOS error-messages +Screen functionsScreen functions + +
+ +

4.4 xbios-trap

+ + + + + + + + + + + + + + + + +
Name: »xbios« - Execute xbios-trap. Lock peripheral components. +
  +
Declaration: int32_t xbios( void ... ); +
  +
Description: The routine xbios executes a TRAP #14. The parameters passed +depend on the particular XBIOS function in each case. +
  +
Return value: The function returns a value of the data type int32_t. +
  +
See also bios   gemdos   XBIOS   Dispatcher +
  + +
+ +
+ +Home +XBIOSXBIOS +XBIOS error-messagesXBIOS error-messages +Screen functionsScreen functions + + diff --git a/en/xbra_main.html b/en/xbra_main.html new file mode 100644 index 000000000..d458da3d1 --- /dev/null +++ b/en/xbra_main.html @@ -0,0 +1,71 @@ + + + + + +The documentation for TOS: XBRA procedure + + + + + + + + + +Home +BIOSBIOS +VT-52 terminalVT-52 terminal +BSIM-BIOS-ExtensionBSIM-BIOS-Extension + +
+ +

3.9 XBRA procedure

+ +

The XBRA procedure ("eXtended BRAner") is based on an +idea by Moshe Braner, and should be used by all programs that +redirect vectors. +

+

The principle is that each vector-redirecting program places the +following structure directly before its own entry address (i.e. just +before the address to which the vector was set): +

+ +
typedef struct
+{
+    int8_t  xb_magic[4];   /* "XBRA" = 0x58425241         */
+    int8_t  xb_id[4];      /* ID of four ASCII characters */
+    int32_t xb_oldvec;     /* Old value of the vectors    */
+} XBRA;
+
+

The element xb_magic permits a positive identification +of the XBRA structure; xb_id is the ID of the particular +program that has redirected the vector. +

+

With the aid of this procedure it is easy for a program to +ascertain whether it is already installed (though this can be done also +via the cookie jar), and to remove itself again from the vector chain. +It is important, however, that all(!) programs adhere to this +procedure, as otherwise the vector chain will be interrupted. +

+

Note about MagiC: Programs that hook into any of the +system vectors should also link themselves into the etv_term vector. +If the program terminates abnormally, the operating system will jump +first via the etv_term vector. In such a case one can then calmly draw +back from all changed vectors; as MagiC uses its own etv_term vector for +each application, this cannot lead to any collisions. +

+

The XBRA procedure has won recognition over time, so that it's +now considered bad programming style if one does not use it. +

+

See also: Cookie jar   Cookie and XBRA list   Reset vector +

+
+ +Home +BIOSBIOS +VT-52 terminalVT-52 terminal +BSIM-BIOS-ExtensionBSIM-BIOS-Extension + + diff --git a/en/xcontrol.html b/en/xcontrol.html new file mode 100644 index 000000000..3eb2e86df --- /dev/null +++ b/en/xcontrol.html @@ -0,0 +1,2398 @@ + + + + + +The documentation for TOS: About XCONTROL + + + + + + + + + +Home +XCONTROLXCONTROL +XCONTROLXCONTROL +Programming guidelinesProgramming guidelines + +
+ +

9.1 About XCONTROL

+

XControl is a modular (extendable) control field desk accessory +that was first shipped by Atari with the TT030 and Mega-STE series of +computers. +

+

+

The individual modules are files with the extension '.CPX' +(Control Panel eXtension), and XControl itself +can be taken as the control program for these modules. +

+

Important: XControl should be used only as a tool for +configuration dialogs, and not misused for other purposes. +

+

The communication between XControl and its modules takes place +via two structures that are denoted XCPB and CPXINFO. The former makes +some flags as well as a whole string of help functions available. +

+ +

At system start-up XControl loads all available CPX headers, +using up to 512 bytes of system memory per header; provided the +corresponding flag is set in the header, each of the CPX files is +called once for initialization. One can specify for each individual +module whether it is to be loaded as resident or not (this can be +changed also with the bundled configuration CPX). In addition it is +possible to write CPX modules that set only certain values; these +so-called 'set only' modules are called only during booting or renewed +loading of the CPX modules with XControl, and simply return a +NULL-pointer during the initialization. +

+ +

As soon as a user selects a CPX module, XControl loads it into +memory and calls the function cpx_init. Subsequently cpx_call is +called, for which essentially the module itself now takes control. +

+ + + + +

One can differentiate between a Form CPX and an Event +CPX. The former are relatively simple to program, but offer only +limited flexibility. The latter are more flexible, since they evaluate +the AES events directly. All the CPX modules supplied with XControl +1.0 are Form CPX files, from which one can deduce that Form CPXs +suffice in most cases. +

+ +

The following terminology applies for the filenames of CPX +modules: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SuffixMeaning
*.CPStandard CPX without header
*.CPXStandard CPX, ready for use
*.CPZInactive CPX (deactivated by XControl)
*.HDRHeader for the CPX file
*_R.CPXResident CPX file
*_S.CPXSet-only CPX file
+
+ + + +

The format of a CPX file is very similar to that of a normal +program. It consists of a 512-byte header and the remaining file +content that is almost a normal GEMDOS program file, including a +standard 28-byte GEMDOS header. +

+ +
typedef struct
+{
+    uint16_t magic;                 /* Magic constant = 100   */
+
+    struct
+    {
+        unsigned reserved : 13;  /* Reserved                */
+        unsigned resident :  1;  /* RAM-resident if set     */
+        unsigned bootinit :  1;  /* Boot initialize if set  */
+        unsigned setonly  :  1;  /* Set-only CPX if set     */
+
+    } flags;
+
+    int32_t  cpx_id;                /* Unique CPX ID                   */
+    uint16_t cpx_version;           /* CPX version number              */
+    int8_t   i_text[14];            /* Icon text                       */
+    uint16_t sm_icon[48];           /* Icon bitmap (32*24 pixel)       */
+    uint16_t i_color;               /* Icon colour                     */
+    int8_t   title_text[18];        /* Name of the CPX (16 chars. max) */
+    uint16_t t_color;               /* Text colour                     */
+    int8_t   buffer[64];            /* Non-volatile buffer             */
+    int8_t   reserved[306];         /* Reserved                        */
+
+} CPXHEAD;
+
+

Some notes about the header: +

+
    +
  • The first function in the TEXT segment has to be the +initialization routine for the CPX +
  • +
  • There are everal toolkits for the construction of a CPX header +
  • +
  • Header and linked program file can be joined in most UNIX-like +shells (e.g. Mupfel from Gemini) with the command 'cat' +
  • +
  • During CPX development it is very practical that XControl can +be launched also as a program (alter the suffix!); this allows working +without permanent rebooting of the computer +
  • +
  • CPX ID and version number ensure that each CPX appears only +once (and also only the latest version) +
  • +
+ +

While programming a CPX module one should note some subtleties: +As such a module has no non-volatile memory available (apart from 64 +bytes), nothing is permitted that reserves fixed memory in any way. In +particular, all variable contents are lost when leaving the CPX as a +rule! +

+

Hence one should: +

+
    +
  • Incorporate resources statically +
  • +
  • Only permit short-term memory allocation +
  • +
  • Not create permanent virtual VDI workstations +
  • +
+ +

For the programming of a CPX module one can fall back on the +functions from the following categories: +

+ + + +

Note: There are several alternatives to XCONTROL, which is +not being developed by Atari any more. One that is particularly +recommended is COPS (COntrol Panel Server, +which not only permits simultaneous opening of any mumber of CPX +modules, but also allows control fields with a larger working area than +XCONTROL. +

+

Other alternatives are ZCONTROL and a supplementary function of +the Freedom2 file-selector. +

+

9.1.1 CPX programming guidelines

+ +

When programming a CPX module one should keep to the following +rules if possible: +

+
    +
  • Release reserved memory as soon as possible +
  • +
  • XControl functions should always be used if this is possible +
  • +
  • The user interface should be as simple as possible and +fashioned in a similar way to other CPX modules +
  • +
  • Graphical elements are to be preferred to menu commands +
  • +
  • 'OK' and 'Cancel' should always be implemented (if possible) +
  • +
  • Popup menus should be depicted as text with a shadowed rectanle +
  • +
  • AC_CLOSE (quitting of the main program) is evaluated as +'Cancel' +
  • +
  • WM_CLOSE (closing of the XControl window) is evaluated as 'OK' +
  • +
  • 'Save' is evaluated as 'OK' without quitting the dialog +
  • +
  • The root object of the CPX always has a size of 256*176 pixels +Exception: Under COPS the object tree may have a size of up to +512*384 pixels +
  • +
  • Interrupt vectors may not be altered +
  • +
  • Xform_do may not be mixed with functions for Event CPXs +
  • +
  • One must not forget about reserved memory when quitting the +CPX, as this would lead to fragmentation of the memory otherwise +
  • +
  • One must not use IDs already being used by other CPXs +
  • +
  • Opened files must be closed again +
  • +
  • Opened VDI workstations must be closed again in every case +(at the latest at the receipt of a AC_CLOSE or WM_CLOSE message), if +they are no longer needed +
  • +
+ +

9.1.2 CPX functions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cpx_button Mouse button event +
cpx_call Activation routine +
cpx_close Close event +
cpx_draw Redraw event +
cpx_hook Preemption hook +
cpx_init Initialization +
cpx_m1 Mouse rectangle event +
cpx_m2 Mouse rectangle event +
cpx_key Keyboard event +
cpx_timer Timer event +
cpx_wmove Window movement + +
+ +

9.1.2.1 cpx_button

+ + + + + + + + + + + + + + + + + + +
Name: »cpx_button« - Mouse button event. +
  +
Declaration VOID cdecl (*cpx_button) (MRETS *mrets, int16_t nclicks, +int16_t *event); +
  +
Description The call cpx_button is made when a mouse button event occurs. +The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
mrets Mouse parameter for event +
nclicks Number of mouse clicks +
event Is to be set to the value 1 if the CPX is to be quit + +
+ +
Return value: The function does not return a result. +
  +
Group: CPX functions +
  +
See also: cpx_key   cpx_timer +
  + +
+ +

9.1.2.2 cpx_call

+ + + + + + + + + + + + + + + + + + +
Name: »cpx_call« - Calling of the CPX module. +
  +
Declaration int16_t cdecl (*cpx_call) ( GRECT *work ); +
  +
int16_t cdecl (*cpx_call) ( GRECT *work, DIALOG *dialog ); +
  +
Description The call cpx_call is made when the user has selected the +corresponding module. The following apply: +
  + + + + + + + + + +
Parameter Meaning +
work Rectangle with the coordinates of the XControl window +
dialog Pointer to a window dialog + +
+ +
Note: The second calling procedure is only available +under COPS. The parameter dialog in this case contains a +pointer to the window dialog structure. The dialog is opened by COPS +after the cpx_init with the aid of wdlg_create and wdlg_open. The +parameter work and the object tree lie outside the visible +screen area up to the first call of Xform_do or up to the return from +the cpx_call function. +
  +
Return value: The function returns one of the following values: +
  +

+
+ + + + + + + + + + +
0=End of processing
<> 0=CPX should continue to be processed
+
+ +
Group: CPX functions +
  +
See also: XCONTROL +
  + +
+ +

9.1.2.3 cpx_close

+ + + + + + + + + + + + + + + + + + +
Name: »cpx_close« - Event for closing the CPX window. +
  +
Declaration VOID cdecl (*cpx_close) (int16_t flag); +
  +
Description The call cpx_close serves for closing the CPX module. The +following apply: +
  + + + + + + +
Parameter Meaning +
flag Reason for closing: +
+
+ + + + + + + + + + +
0=AC_CLOSE message
<> 0=WM_CLOSE message
+
+ + +
+ +
Note: The function is called for every AC_CLOSE or WM_CLOSE +message. The CPX should then immediately release all memory reserved +for it. The function must be implemented for every Event CPX. AC_CLOSE +is to be evaluated as 'Cancel', WM_CLOSE as 'OK'. +
  +
Return value: The function does not return a result. +
  +
Group: CPX functions +
  +
See also: cpx_init   XCONTROL +
  + +
+ +

9.1.2.4 cpx_draw

+ + + + + + + + + + + + + + + + + + +
Name: »cpx_draw« - Event for redrawing the CPX window. +
  +
Declaration VOID cdecl (*cpx_draw) (GRECT *clip); +
  +
Description The call cpx_draw serves for redrawing parts of the CPX window. +The following apply: +
  + + + + + + +
Parameter Meaning +
clip Region to be redrawn, which is also needed as a passing +parameter for GetFirstRect + +
+ +
Note: The required rectangle list must be obtained with +GetFirstRect and GetNextRect. +
  +
Return value: The function does not return a result. +
  +
Group: CPX functions +
  +
See also: cpx_wmove   GetFirstRect   GetNextRect +
  + +
+ +

9.1.2.5 cpx_hook

+ + + + + + + + + + + + + + + + + + +
Name: »cpx_hook« - Preemption hook. +
  +
Definiton int16_t cdecl (*cpx_hook) (int16_t event, int16_t *msg, MRETS +*mrets, int16_t *key, int16_t *nclicks); +
  +
Description The call cpx_hook is made immediately after evnt_multi, so +before XControl processes the event. The following apply: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
event Occurring events +
msg Event buffer +
mrets Mouse parameters +
key Keypress +
nclicks Number of mouse clicks + +
+ +
Return value: The function returns one of the following values: +
  +

+
+ + + + + + + + + + +
0=Continue processing events
<> 0=Break off processing events
+
+ +
Group: CPX functions +
  +
See also: cpx_button   cpx_draw   cpx_key   cpx_m1   cpx_m2   cpx_timer   +cpx_wmove +
  + +
+ +

9.1.2.6 cpx_init

+ + + + + + + + + + + + + + + + + + +
Name: »cpx_init« - Initialization of the CPX. +
  +
Declaration CPXINFO * cdecl cpx_init (XCPB *xcpb); +
  +
CPXINFO * cdecl cpx_init (XCPB *xcpb, int32_t magic, int32_t +version ); +
  +
Description The call cpx_init serves for initializing the CPX. The +following applies: +
  +

+
+ + + + + + + + +
ParameterMeaning
xcpbPointer to the XCPB structure of XControl
+
+ +
Note: The function must be placed at the start of the +TEXT segment of the CPX file, and is called during XControl +initialization as well as on activating the CPX. +
  +
With the aid of the second calling procedure one can ascertain +from the parameters magic and version whether the CPX +is running under XCONTROL or COPS. The following routine may be used: +
  + +
int16_t is_COPS ( int32_t magic, int32_t version )
+{
+   if ((magic == 'COPS') && (version >= 0x10000L))
+      return (TRUE);      /* COPS */
+   else return (FALSE);   /* XCONTROL */
+}
+
+
If COPS is recognized, the CPX can draw an object tree with a +size up to 512*384 pixels and pass it to the function Xform_do. +
  +
Return value: The function returns one of the following values: +
  +

+
+ + + + + + + + + + +
NULL:'Set-only' CPX
Else:Pointer to the CPXINFO structure of the CPX
+
+ +
Group: CPX functions +
  +
See also: cpx_close   XCONTROL +
  + +
+ +

9.1.2.7 cpx_m1

+ + + + + + + + + + + + + + + + + + +
Name: »cpx_m1« - Event 1 for a mouse rectangle. +
  +
Declaration VOID cdecl (*cpx_m1) (MRETS *mrets, int16_t *event); +
  +
Description The call cpx_m1 is made when the mouse pointer enters or leaves +a certain area. The following apply: +
  + + + + + + + + + +
Parameter Meaning +
mrets Mouse parameters +
event Set to the value 1 when the CPX is to be exited + +
+ +
Return value: The function does not return a result. +
  +
Group: CPX functions +
  +
See also: cpx_m2   XCONTROL +
  + +
+ +

9.1.2.8 cpx_m2

+ + + + + + + + + + + + + + + + + + +
Name: »cpx_m2« - Event 2 for a mouse rectangle. +
  +
Declaration VOID cdecl (*cpx_m2) (MRETS *mrets, int16_t *event); +
  +
Description The call cpx_m2 is made when the mouse pointer enters or leaves +a certain area. The following apply: +
  + + + + + + + + + +
Parameter Meaning +
mrets Mouse parameters +
event Set to the value 1 when the CPX is to be exited + +
+ +
Return value: The function does not return a result. +
  +
Group: CPX functions +
  +
See also: cpx_m1   XCONTROL +
  + +
+ +

9.1.2.9 cpx_key

+ + + + + + + + + + + + + + + + + + +
Name: »cpx_key« - Event for a key-press. +
  +
Declaration VOID cdecl (*cpx_key) (int16_t kstate, int16_t key, int16_t +*event); +
  +
Description The call cpx_key is made when a keyboard vvent has occurred. +The following apply: +
  + + + + + + + + + + + + +
Parameter Meaning +
kstate Status of the 'special' keys ([Alternate], [Control], [Shift], +etc.) +
key Triggering key: +
+
+ + + + + + + + +
High byte :Scancode of the key
Low byte :ASCII-code of the key
+
+ +
event Set to the value 1 when the CPX is to be exited + +
+ +
Return value: The function does not return a result. +
  +
Group: CPX functions +
  +
See also: cpx_button   cpx_timer +
  + +
+ +

9.1.2.10 cpx_timer

+ + + + + + + + + + + + + + + + + + +
Name: »cpx_timer« - Timer event. +
  +
Declaration VOID cdecl (*cpx_timer) (int16_t *event); +
  +
Description The call cpx_timer is made when a timer event has occurred. The +following applies: +
  + + + + + + +
Parameter Meaning +
  +
event Set to the value 1 when the CPX is to be exited +
  + +
+ +
Note: Timer events are not supported by Form CPXs. +
  +
Return value: The function does not return a result. +
  +
Group: CPX functions +
  +
See also: cpx_button   cpx_key   XCONTROL +
  + +
+ +

9.1.2.11 cpx_wmove

+ + + + + + + + + + + + + + + + + + +
Name: »cpx_wmove« - Movement of the XControl window. +
  +
Declaration VOID cdecl (*cpx_wmove) (GRECT *work); +
  +
Description The call cpx_wmove is made when the user moves the XControl +window. The following applies: +
  +

+
+ + + + + + + + +
ParameterMeaning
workNew coordinates of the XControl window
+
+ +
Return value: The function does not return a result. +
  +
Group: CPX functions +
  +
See also: cpx_draw   XCONTROL +
  + +
+ +

9.1.3 XCONTROL functions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CPX_Save Saves defaults +
Get_Buffer Gets buffer +
getcookie Gets cookie variables +
GetFirstRect Gets first rectangle from list +
GetNextRect Gets next rectangle from list +
MFsave Saves/restores mouse form +
Popup Popup menu management +
rsh_fix Converts object tree +
rsh_obfix Converts object from character to pixel display +
Set_Evnt_Mask Sets event mask +
Sl_arrow Slider arrow handling +
Sl_dragx Slider drag movement (horizontal) +
Sl_dragy Slider drag nmovement (vertical) +
Sl_size Sets slider size +
Sl_x Positions a slider (horizontal) +
Sl_y Positions a slider (vertical) +
Xform_do Form management +
XGen_Alert Displays an alert box. + +
+ +

9.1.3.1 CPX_Save

+ + + + + + + + + + + + + + + + + + +
Name: »CPX_Save« - Save defaults. +
  +
Declaration int16_t cdecl (*CPX_Save) (VOID *ptr, int32_t num); +
  +
Description The call CPX_Save permits saving the default settings of a CPX. +The following apply: +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
ptrAddress of the data to be saved
numNumber of bytes to be saved
+
+ +
Note: XControl saves the settings in the DATA segment of +the CPX. Thus developers must themselves ensure that there is +sufficient free space in the DATA segment. This is done with the data +field 'SAVE_VARS' in CPXSTART.S. +
  +
Return value: The function returns one of the following values: +
  +

+
+ + + + + + + + + + +
0:An error has arisen
<> 0:No eror has arisen
+
+ +
Group: XCONTROL functions +
  +
See also: XCONTROL +
  + +
+ +

9.1.3.2 Get_Buffer

+ + + + + + + + + + + + + + + + + + +
Name: »Get_Buffer« - Get buffer. +
  +
Declaration VOID cdecl (*Get_Buffer) (VOID); +
  +
Description The call Get_Buffer obtains the address of a 64-byte sized +resident memory block. +
  +
Note: In this memory the CPX can save the contents of +write-only registers if TOS offers no functions for interrogation +(example: window colours). One has to emphasise again that any other +memory allocated to a CPX is volatile! +
  +
Return value: The function returns a pointer to the memory block address. +
  +
Group: XCONTROL functions +
  +
See also: XCONTROL +
  + +
+ +

9.1.3.3 getcookie

+ + + + + + + + + + + + + + + + + + +
Name: »getcookie« - Get cookie variables. +
  +
Declaration int16_t cdecl (*getcookie) (int32_t cookie, int32_t *p_value); +
  +
Description The call getcookie searches for a cookie, and obtains its +value. The following apply: +
  + + + + + + + + + +
Parameter Meaning +
cookie Cookie variable +
p_value Address of a variable that is to receive the value, or NULL if +the value is of no interest + +
+ +
Return value: The function returns one of the following values: +
  +

+
+ + + + + + + + + + +
0:Cookie not found
<>0:Cookie found
+
+ +
Group: XCONTROL functions +
  +
See also: Cookie jar +
  + +
+ +

9.1.3.4 GetFirstRect

+ + + + + + + + + + + + + + + + + + +
Name: »GetFirstRect« - Get first rectangle from list. +
  +
Declaration GRECT * cdecl (*GetFirstRect) (GRECT *prect); +
  +
Description The call GetFirstRect obtains the first rectangle from the +rectangle list. The following applies: +
  +

+
+ + + + + + + + +
ParameterMeaning
prectArea to be updated
+
+ +
Note: The function is required for the redrawing of +window portions after a WM_REDRAW message; however, the object tree is +managed by XControl itself. +
  +
Return value: The function returns one of the following values: +
  +

+
+ + + + + + + + + + +
NULL:No further window portions present
Else:Window portion to be restored
+
+ +
Group: XCONTROL functions +
  +
See also: GetNextRect   XCONTROL +
  + +
+ +

9.1.3.5 GetNextRect

+ + + + + + + + + + + + + + + + + + +
Name: »GetNextRect« - Get next rectangle from list. +
  +
Declaration GRECT * cdecl (*GetNextRect) (VOID); +
  +
Description The call GetNextRect obtains the next rectangle from the +rectangle list. +
  +
Note: The function is required for the redrawing of +window portions after a WM_REDRAW message; however, the object tree is +managed by XControl itself. +
  +
Return value: The function returns one of the following values: +
  +

+
+ + + + + + + + + + +
NULL:No further window portions present
Else:Window portion to be restored
+
+ +
Group: XCONTROL functions +
  +
See also: GetFirstRect   XCONTROL +
  + +
+ +

9.1.3.6 MFsave

+ + + + + + + + + + + + + + + + + + +
Name: »MFsave« - Save/restore mouse form. +
  +
Declaration VOID cdecl (*MFsave) (int16_t saveit, MFORM *mf); +
  +
Description The call MFsave saves or restores the shape of the mouse +pointer. The following apply: +
  + + + + + + + + + +
Parameter Meaning +
savit +
+
+ + + + + + + + + + +
0=Restore mouse-shape
1=Save mouse-shape
+
+ +
mf Memory block for saving the mouse-shape + +
+ +
Return value: The function does not return a result. +
  +
Group: XCONTROL functions +
  +
See also: graf_mouse   XCONTROL +
  + +
+ +

9.1.3.7 Popup

+ + + + + + + + + + + + + + + + + + +
Name: »Popup« - Management of a popup menu. +
  +
Declaration int16_t cdecl (*Popup) (int8_t *items[], int16_t num_items, +int16_t default_item, int16_t font_size, GRECT *button, GRECT *world); +
  +
Description The call Popup takers on the complete management of a popup +menu. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
items Array with character strings for the individual entries; each +entry must have the same length, as well as at least two spaces at the +start and at least one space at the end +
num_items Number of entries +
default_item Default entry (count starts at 0), or the value -1 +
font_size Font size: 8*16 or 8*8 font; for the parameters one +should use the same values as in the TEDINFO structure (according to +Atari, only the large system font is used at present) +
button Rectangle of the button to which the popup belongs +
world Rectangle of the background object tree (as a rule the object +tree of the CPX) + +
+ +
Note: With too many entries (five onwards) the popup is +scrolled automatically; the processing blocks all other actions. +
  +
Return value: The function returns the selected entry of the popup, or the +value -1 if no element of the popup had been selected. +
  +
Group: XCONTROL functions +
  +
See also: Xform_do   XCONTROL +
  + +
+ +

9.1.3.8 rsh_fix

+ + + + + + + + + + + + + + + + + + +
Name: »rsh_fix« - Object tree conversion. +
  +
Declaration VOID cdecl (*rsh_fix) (int16_t num_objs, int16_t num_frstr, +int16_t num_frimg, int16_t num_tree, OBJECT *rs_object, TEDINFO +*rs_tedinfo, int8_t *rs_string[], ICONBLK *rs_iconblk, BITBLK +*rs_bitblk, int32_t *rs_frstr, int32_t *rs_frimg, int32_t *rs_trindex, +struct foobar *rs_imdope); +
  +
Description The call rsh_fix converts an object tree on the basis of 8*16 +pixel-sized characters. The following apply: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
num_objsTotal number of objects
num_frstrTotal number of strings
num_frimgTotal number of images
num_treeTotal number of object trees
rs_object 
rs_tedinfo 
rs_string 
rs_iconblk 
rs_bitblk 
rs_frstr 
rs_frimg 
tr_trindex 
rs_imdope 
+
+ +
Note: With this the CPX has the same pixel size in all +resolutions. When working with a RCS one should therefore also choose +a graphics mode with 8*16 pixel-sized characters. +
  +
The coordinate conversion may only take place once, of course - +hence XControl makes the flag 'SkipRshFix' available in the XCPB +structure. +
  +
Return value: The function does not return a result. +
  +
Group: XCONTROL functions +
  +
See also: rsh_obfix   XCONTROL +
  + +
+ +

9.1.3.9 rsh_obfix

+ + + + + + + + + + + + + + + + + + +
Name: »rsh_obfix« - Object conversion: Character to pixel display. +
  +
Declaration VOID cdecl (*rsh_obfix) (OBJECT *tree, int16_t curob); +
  +
Description The call rsh_obfix converts the size and position of a +specified object from a character-based display to a pixel-based +display. The following apply: +
  +

+
+ + + + + + + + + + + + +
ParameterMeaning
treeAddress of the object tree
curobObject to be converted
+
+ +
Return value: The function does not return a result. +
  +
Group: XCONTROL functions +
  +
See also: rsh_fix   rsrc_obfix   XCONTROL +
  + +
+ +

9.1.3.10 Set_Evnt_Mask

+ + + + + + + + + + + + + + + + + + +
Name: »Set_Evnt_Mask« - Set an event mask. +
  +
Declaration VOID cdecl (*Set_Evnt_Mask) (int16_t mask, MOBLK *m1, MOBLK +*m2, int32_t time); +
  +
Description The call Set_Evnt_Mask determines which events the CPX should +react to. The following apply: +
  +

+
+ + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
maskPermitted events (as for evnt_multi)
m1Mouse rectangle and -direction
m2Mouse rectangle and -direction
timeTime in milliseconds for timer event
+
+ +
Return value: The function does not return a result. +
  +
Group: XCONTROL functions +
  +
See also: XCONTROL +
  + +
+ +

9.1.3.11 Sl_arrow

+ + + + + + + + + + + + + + + + + + +
Name: »Sl_arrow« - Slider arrow handling. +
  +
Declaration VOID cdecl (*Sl_arrow) (OBJECT *tree, int16_t base, int16_t +slider, int16_t obj, int16_t inc, int16_t min, int16_t max, int16_t +*value, int16_t direction, VOID (*foo) (VOID)); +
  +
Description The call Sl_arrow is to be made as soon as an arrow of a slider +has been clicked on. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
tree Address of the object tree +
base Base object (index of slider 'track') +
slider Slider (child of base object) +
obj Arrow that was clicked on +
inc Number of units that are to be added or subtracted +
min Minimum value that can be accepted +
max Maximum value that can be accepted +
value Address for current value +
direction Direction: +
+
+ + + + + + + + + + +
0=Vertical
1=Horizontal
+
+ +
foo Address of a function (as for Sl_x/Sl_y) + +
+ +
Return value: The function does not return a result. +
  +
Group: XCONTROL functions +
  +
See also: Sl_dragx   Sl_dragy   XCONTROL +
  + +
+ +

9.1.3.12 Sl_dragx

+ + + + + + + + + + + + + + + + + + +
Name: »Sl_dragx« - Slider drag movement (horizontal). +
  +
Declaration VOID cdecl (*Sl_dragx) (OBJECT *tree, int16_t base, int16_t +slider, int16_t min, int16_t max, int16_t *value, VOID (*foo) (VOID)); +
  +
Description The call Sl_dragx manages the movement of the horizontal +slider. The following apply: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
treeAddress of the object tree
baseBase object (index of slider 'track')
sliderSlider (child of the base object)
minMinimum value that can be accepted
maxMaximum value that can be accepted
valueAddress for current value
fooAddress of a function, as for Sl_x
+
+ +
Return value: The function does not return a result. +
  +
Group: XCONTROL functions +
  +
See also: Sl_dragy   XCONTROL +
  + +
+ +

9.1.3.13 Sl_dragy

+ + + + + + + + + + + + + + + + + + +
Name: »Sl_dragy« - Slider drag movement (vertical). +
  +
Declaration VOID cdecl (*Sl_dragy) (OBJECT *tree, int16_t base, int16_t +slider, int16_t min, int16_t max, int16_t *value, VOID (*foo) (VOID)); +
  +
Description The call Sl_dragy manages the movement of the vertical slider. +The following apply: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
treeAddress of the object tree
baseBase object (index of slider 'track')
sliderSlider (child of the base object)
minMinimum value that can be accepted
maxMaximum value that can be accepted
valueAddress for current value
fooAddress of a function, as for Sl_y
+
+ +
Return value: The function does not return a result. +
  +
Group: XCONTROL functions +
  +
See also: Sl_dragx   XCONTROL +
  + +
+ +

9.1.3.14 Sl_size

+ + + + + + + + + + + + + + + + + + +
Name: »Sl_size« - Sets slider size. +
  +
Declaration VOID cdecl (*Sl_size) (OBJECT *tree, int16_t base, int16_t +slider, int16_t num_items, int16_t visible, int16_t direction, int16_t +min_size); +
  +
Description The call Sl_size sets the size of the slider. The following +apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
tree Address of the object tree +
base Base object (index of slider 'track') +
slider Slider (child of the base object) +
num_items Number of elements present +
visible Number of elements visible +
direction Direction: +
+
+ + + + + + + + + + +
0=Vertical
1=Horizontal
+
+ +
min_size Minimum size of slider, in pixels + +
+ +
Note: The function is required to obtain the +relationship of the amount of data displayed to the total that is +present. +
  +
Return value: The function does not return a result. +
  +
Group: XCONTROL functions +
  +
See also: Sl_dragx   Sl_dragy   Sl_x   Sl_y   XCONTROL +
  + +
+ +

9.1.3.15 Sl_x

+ + + + + + + + + + + + + + + + + + +
Name: »Sl_x« - Positions a slider (horizontal). +
  +
Declaration VOID cdecl (*Sl_x) (OBJECT *tree, int16_t base, int16_t slider, +int16_t value, int16_t min, int16_t max, VOID (*foo) (VOID)); +
  +
Description The call Sl_x positions the slider within a base object in the +horizontal direction. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
tree Address of the object tree +
base Base object (index of slider 'track') +
slider Slider (child of the base object) +
value New value that the slider should represent +
min Minimum that value may accept +
max Maximum that value may accept +
foo Address of a function (or NULL), which is called simultaneously +with slider repositioning; this permits slider movements to be used +also to alter displayed values + +
+ +
Return value: The function does not return a result. +
  +
Group: XCONTROL functions +
  +
See also: Sl_y   XCONTROL +
  + +
+ +

9.1.3.16 Sl_y

+ + + + + + + + + + + + + + + + + + +
Name: »Sl_y« - Positions a slider (vertical). +
  +
Declaration VOID cdecl (*Sl_y) (OBJECT *tree, int16_t base, int16_t slider, +int16_t value, int16_t min, int16_t max, VOID (*foo) (VOID)); +
  +
Description The call Sl_y positions the slider within a base object in the +vertical direction. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
tree Address of the object tree +
base Base object (index of slider 'track') +
slider Slider (child of the base object) +
value New value that the slider should represent +
min Minimum that value may accept +
max Maximum that value may accept +
foo Address of a function (or NULL), which is called simultaneously +with slider repositioning; this permits slider movements to be used +also to alter displayed values + +
+ +
Return value: The function does not return a result. +
  +
Group: XCONTROL functions +
  +
See also: Sl_x   XCONTROL +
  + +
+ +

9.1.3.17 Xform_do

+ + + + + + + + + + + + + + + + + + +
Name: »Xform_do« - Manage a form. +
  +
Declaration int16_t cdecl (*Xform_do) (OBJECT *tree, int16_t startob, +int16_t *puntmsg); +
  +
Description The call Xform_do takes on the management of a form, as well as +(to a limited extent) the handling of AES messages. The following +apply: +
  +

+
+ + + + + + + + + + + + + + + + +
ParameterMeaning
treeAddress of the object tree
startobStart object
puntmsgMessage buffer
+
+ +
Note: Under COPS the CPX can draw an object tree up to +512*384 pixels in size and pass it to this function. +
  +
Return value: The function returns one of the following values: +
  + + + +
-1: puntmsg contains a message to be evaluated: +
  + + + + + + + + + + + + + + + +
WM_REDRAW: The CPX must itself redraw objects that do not belong to the +object tree. The rectangle list can be obtained with the functions +GetFirstRect and GetNextRect. +
  +
AC_CLOSE: and +
  +
WM_CLOSE: The CPX was terminated; reserved memory is to be freed +immediately. AC_CLOSE is to be evaluated as 'Cancel', WM_CLOSE as +'OK'. +
  +
CT_KEY: Special message that permits evaluation of key-presses, +provided these can have no repercussions on EDIT fields. +
  +

+
+ + + + + + + + + + + + +
puntmsg[3]High byte:Scancode of the pressed key
puntmsg[3]Low byte:ASCII-code of the pressed key
+
+ +
Else: Index of object clicked on (a double-click is flagged in the +upper bit). +
  + +
+ + +
+ +
Group: XCONTROL functions +
  +
See also: form_do   form_xdo   Rectangle-list of a window +
  + +
+ +

9.1.3.18 XGen_Alert

+ + + + + + + + + + + + + + + + + + +
Name: »XGen_Alert« - Display an alert box. +
  +
Declaration int16_t cdecl (*XGen_Alert) (int16_t id); +
  +
Description The call XGen_Alert enables the display of a simple alert box. +The following apply: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
ParameterMeaning
idType of message:
  0 = 'Save default settings?'
  1 = 'Memory allocation error!'
  2 = 'File read/write error'
  3 = 'File not found'
+
+ +
Note: Further alert boxes must be defined by the user. +However, form_alert is not suitable for this, as it centres +the alert box with reference to the full screen area and not with +reference to the XControl window. +
  +
Return value: The function returns one of the following values: +
  + + + + + + +
   0 : 'Cancel' was clicked on +
<> 0 : 'OK' was clicked on (if the alert box has only one button, then +it is the 'OK' button) + +
+ +
Group: XCONTROL functions +
  +
See also: form_alert   XCONTROL +
  + +
+ +
+ +Home +XCONTROLXCONTROL +XCONTROLXCONTROL +Programming guidelinesProgramming guidelines + + diff --git a/en/xcontrol_main.html b/en/xcontrol_main.html new file mode 100644 index 000000000..d8e9453a7 --- /dev/null +++ b/en/xcontrol_main.html @@ -0,0 +1,37 @@ + + + + + +The documentation for TOS: XCONTROL + + + + + + + + + +Home +Contents +AES structuresAES structures +About XCONTROLAbout XCONTROL + +
+ +

9 XCONTROL

+ +
+
+ +Home +Contents +AES structuresAES structures +About XCONTROLAbout XCONTROL + + diff --git a/en/xgrf.html b/en/xgrf.html new file mode 100644 index 000000000..ffee10065 --- /dev/null +++ b/en/xgrf.html @@ -0,0 +1,693 @@ + + + + + +The documentation for TOS: Extended graphics library + + + + + + + + + +Home +AESAES +Shell libraryShell library +Extended shell libraryExtended shell library + +
+ +

8.23 Extended graphics library

+

This library contains functions to animate moving (expanding or +contracting) rectangles as well as functions from ViewMAX. The +following routines are available: +

+ + + + + + + + + + + + +
xgrf_2box Animation of moving rectangles +
xgrf_color Set color category for various window elements +
xgrf_dtimage Set desktop image +
xgrf_stepcalc Parameter calculation for rectangle animation + +
+ +

Note: xgrf_2box and xgrf_stepcalc should be seen +primarily as replacements for the functions graf_growbox and +graf_shrinkbox, that in PC-GEM were a casualty of the legal dispute +between Apple and Digital Research. +

+

See also: graf_growbox   graf_shrinkbox   Style guidelines +

+

8.23.1 xgrf_2box

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Animate rectangles« - Draw a set of moving rectangles. +
  +
Opcode: 131 +
  +
Syntax: int16_t xgrf_2box ( int16_t cx, int16_t cy, int16_t w, int16_t +h, int16_t corners, int16_t cnt, int16_t xstep, int16_t ystep, int16_t +doubled ); +
  +
Description: The call xgrf_2box draws a set of rectangles that move on the +screen. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
cx Start position in X-direction +
cy Start position in Y-direction +
w Width of start position +
h Height of start position +
corners Draw: + + + + + + +
0 = Draw complete rectangles +
1 = Draw only the corners + +
+ +
cnt Number of single steps +
xstep Step size in X-direction +
ystep Step size in Y-direction +
doubled Step size + + + + + + +
0 = Normal step size +
1 = Doubled step size + +
+ + +
+ +
Note: The function is a replacement for the deleted +functions of the FORM and GRAF libraries in PC-GEM (due to the +legal dispute between Apple and Digital Research). +
  +
Return value: This is unknown at present. +
  +
Availability: The function is available only as of PC-GEM 2.0, as of KAOS +1.4.2 and MagiC. +
  +
Group: Extended graphics library +
  +
See also: Binding   xgrf_stepcalc   MagiC +
  + +
+ +

8.23.2 Bindings for xgrf_2box

+ + + + + + + + + +
C: int16_t xgrf_2box ( int16_t cx, int16_t cy, int16_t w, int16_t +h, int16_t corners, int16_t cnt, int16_t xstep, int16_t ystep, int16_t +doubled ); +
  +
Binding: +
  +
int16_t xgrf_2box ( int16_t cx, int16_t cy, int16_t w,
+                    int16_t h, int16_t corners, int16_t cnt,
+                    int16_t xstep, int16_t ystep,
+                    int16_t doubled )
+{
+   int_in[0] = cnt;
+   int_in[1] = xstep;
+   int_in[2] = ystep;
+   int_in[3] = doubled;
+   int_in[4] = corners;
+   int_in[5] = cx;
+   int_in[6] = cy;
+   int_in[7] = w;
+   int_in[8] = h;
+
+   return ( crys_if(131) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]131 # Function opcode
control+2control[1]9 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]cnt
int_in+2int_in[1]xstep
int_in+4int_in[2]ystep
int_in+6int_in[3]doubled
int_in+8int_in[4]corners
int_in+10int_in[5]cx
int_in+12int_in[6]cy
int_in+14int_in[7]w
int_in+16int_in[8]h
int_outint_out[0]Return value
+
+ + +
+ +

8.23.3 xgrf_stepcalc

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Stepcalc for XGraf« - Parameter calculation for the +animation of rectangles. +
  +
Opcode: 130 +
  +
Syntax: int16_t xgrf_stepcalc ( int16_t orgw, int16_t orgh, int16_t xc, +int16_t yc, int16_t w, int16_t h, int16_t *pcx, int16_t *pcy, int16_t +*pcnt, int16_t *pxstep, int16_t *pystep ); +
  +
Description: The call xgrf_stepcalc calculates all parameters for a call of +xgrf_2box. The following apply: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
orgw Starting width +
orgh Starting height +
xc End position in X-direction +
yc End position in Y-direction +
w Width of final size +
h Height of final size +
pcx Centred position at completion of process in X-direction +
pcy Ditto for Y-directiong +
pcnt Number of single steps +
pxstep Step size in X-direction +
pystep Step size in Y-direction + +
+ +
Note: The centred position, number of steps as well as +step size are calculated from the starting size, final size and the +end positions of the rectangle. +
  +
Return value: This is unknown at present. +
  +
Availability: The function is available only as of PC-GEM 2.0, as of KAOS +1.4.2 and MagiC. +
  +
Group: Extended graphics library +
  +
See also: Binding   xgrf_2box   MagiC +
  + +
+ +

8.23.4 Bindings for xgrf_stepcalc

+ + + + + + + + + +
C: int16_t xgrf_stepcalc ( int16_t orgw, int16_t orgh, int16_t xc, +int16_t yc, int16_t w, int16_t h, int16_t *pcx, int16_t *pcy, int16_t +*pcnt, int16_t *pxstep, int16_t *pystep ); +
  +
Binding: +
  +
int16_t xgrf_stepcalc ( int16_t orgw, int16_t orgh,
+                        int16_t xc, int16_t yc,
+                        int16_t w, int16_t h,
+                        int16_t *pcx, int16_t *pcy,
+                        int16_t *pcnt,
+                        int16_t *pxstep, int16_t *pystep )
+{
+   int_in[0] = orgw;
+   int_in[1] = orgh;
+   int_in[2] = xc;
+   int_in[3] = yc;
+   int_in[4] = w;
+   int_in[5] = h;
+
+   crys_if (130);
+
+   *pcx    = int_out[1];
+   *pcy    = int_out[2];
+   *pcnt   = int_out[3];
+   *pxstep = int_out[4];
+   *pystep = int_out[5];
+
+   return ( int_out[0] );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]130 # Function opcode
control+2control[1]6 # Entry in int_in
control+4control[2]6 # Entry in int_out
control+6control[3]0 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
int_inint_in[0]orgw
int_in+2int_in[1]orgh
int_in+4int_in[2]xc
int_in+6int_in[3]yc
int_in+8int_in[4]w
int_in+10int_in[5]h
int_outint_out[0]Return value
int_out+2int_out[1]pcx
int_out+4int_out[2]pcy
int_out+6int_out[3]pcnt
int_out+8int_out[4]pxstep
int_out+10int_out[5]pystep
+
+ + +
+ +

8.23.5 xgrf_color

+ + + + + + + + + + + + + + + + + + +
Name: »« - Set color category for various window elements. +
  +
Opcode: 132 +
  +
Syntax: int16_t xgrf_color ( int16_t color, int16_t fgclr, int16_t +bkclr, int16_t style, int16_t pattern ); +
  +
Description: +
  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CC_NAME (8) Window title bar selected. +
  +
CC_SLIDER (9) +
  +
CC_DESKTOP (10) +
  +
CC_BUTTON (11) +
  +
CC_INFO (12) Info bar. +
  +
CC_ALERT (13) +
  +
CC_SLCTDNAME (14) Window title bar normal. +
  +
CC_3DSHADE (16) +
  +
CC_RADIO (17) +
  +
CC_CHECK (18) +
  +
CC_NAMETEXT (19) Text of active titlebar. +
  +
CC_NNAMETEXT (20) Text of inactive titlebar. +
  +
CC_INFOTEXT (21) Text of info bar. +
  + +
+ +
Availability: The function is available only as of ViewMAX/2. +
  +
Group: Extended graphics library +
  + +
+ +

8.23.6 xgrf_dtimage

+ + + + + + + + + + + + + + + + + + +
Name: »« - Set desktop image +
  +
Opcode: 133 +
  +
Syntax: int16_t xgrf_dtimage ( MFDB *image ); +
  +
Description: +
  +
Availability: The function is available only as of ViewMAX/3. +
  +
Group: Extended graphics library +
  + +
+ +
+ +Home +AESAES +Shell libraryShell library +Extended shell libraryExtended shell library + + diff --git a/en/xhdi.html b/en/xhdi.html new file mode 100644 index 000000000..fa503495d --- /dev/null +++ b/en/xhdi.html @@ -0,0 +1,90 @@ + + + + + +The documentation for TOS: XHDI - eXtended HardDisk Interface (Version 1.30) + + + + + + + + + +Home +Contents +TOS listTOS list +XHDI cookieXHDI cookie + +
+ +

H XHDI - eXtended HardDisk Interface (Version 1.30)

+ +

The purpose of the XHDI (`eXtended +HardDisk Interface') specification is to +enhance the communication with drivers for block-oriented mass storage +media. We started with the thought of creating a uniform interface for +some additional driver features. One goal was to create a standard +method for virtual memory systems to lock the eject button of Syquest +hard disk drives (you don't want the user to remove the cartridge with +the swap partition). +

+

After further discussion, it was clear that the information +available via the PUN_INFO structure just wasn't enough and that the +missing information should be available with the help of this XHDI +specification. Reasons: +

+
    +
  • The PUN_INFO structure only has room for 16 devices, but BIOS +(and some GEMDOS replacements) allow 32 devices +
      +

  • +
  • It is impossible to install more than one AHDI-compatible hard +disk driver in the system (there is only one PUN_INFO structure) +
      +

  • +
  • Atari's definition of device numbers only works for drives with +Logical Unit Number 0 +
      +

  • +
+ +

For these reasons, the purpose of the XHDI specification +is: +

+
    +
  • To provide more information about the installed devices +
      +

  • +
  • To support new driver features like Stop/Start or Lock/Unlock +
      +

  • +
+ +

The XHDI specification doesn't define new driver features - it +should be easy to retrofit it into existing drivers. +

+

See also: +
XHDI cookie   XHDI terminology   Partition types   Arbitration   XHDI +functions   SCSI specification +

+ +
+
+ +Home +Contents +TOS listTOS list +XHDI cookieXHDI cookie + + diff --git a/en/xhdi_arbitration.html b/en/xhdi_arbitration.html new file mode 100644 index 000000000..18a9d265d --- /dev/null +++ b/en/xhdi_arbitration.html @@ -0,0 +1,74 @@ + + + + + +The documentation for TOS: Arbitration + + + + + + + + + +Home +XHDI - eXtended HardDisk Interface (Version 1.30)XHDI - eXtended HardDisk Interface (Version 1.30) +XHDI terminologyXHDI terminology +Recommended partition typesRecommended partition types + +
+ +

H.3 Arbitration

+

For device drivers which support SCSI arbitration, the machine +needs an own SCSI device number which must be unique and shouldn't be +stored on disk. Atari has reserved byte 16 in the non-volatile memory +(NVRAM) of the Atari TT030 and Falcon030 computers. Bit assignments: +

+ + + + + + +
Bit 0..2: Device number +
Bit 7: Arbitration on (1) or off (0) + +
+ +

The current arbitration number could be inquired this +way: +

+
WORD arbitration_id (VOID)
+{
+   LONG ret = EINVFN;
+   UBYTE nvmdata = 0;
+   OSHEADER *Sys;
+   LONG oldstack = Super(0L);
+   Sys = *_sysbase;
+   Super((VOID *)oldstack);
+
+   host_id = -1;   /* no arbitration by default */
+
+   if (Sys->os_version >= 0x300)
+      ret = NVMaccess (0, 16, (WORD) sizeof (nvmdata), &nvmdata);
+
+   if (ret == E_OK && (nvmdata & 0x80))
+      host_id = nvmdata & 7;
+
+   return host_id;
+}
+
+

See also: XHDI specification   SCSI specification   About the GEMDOS   About +the BIOS +

+
+ +Home +XHDI - eXtended HardDisk Interface (Version 1.30)XHDI - eXtended HardDisk Interface (Version 1.30) +XHDI terminologyXHDI terminology +Recommended partition typesRecommended partition types + + diff --git a/en/xhdi_cookie.html b/en/xhdi_cookie.html new file mode 100644 index 000000000..05c82632d --- /dev/null +++ b/en/xhdi_cookie.html @@ -0,0 +1,74 @@ + + + + + +The documentation for TOS: XHDI cookie + + + + + + + + + +Home +XHDI - eXtended HardDisk Interface (Version 1.30)XHDI - eXtended HardDisk Interface (Version 1.30) +XHDI - eXtended HardDisk Interface (Version 1.30)XHDI - eXtended HardDisk Interface (Version 1.30) +XHDI terminologyXHDI terminology + +
+ +

H.1 XHDI cookie

+

Cookie ID: 'XHDI'. The contents of the cookie points to the +start address of a function which provides procedures for dealing with +block storage devices. As an additional check, the function is +preceded by the LONG constant 0x27011992. +

+

The contents of the XHDI cookie may change (because it can be +used by more than one driver). Therefore, in some applications +(example: Desk accessories) the cookie contents must be inquired each +time before the handler is called. +

+

How to install more than one XHDI driver: +

+ + + + + + + + + + + + +
(1) During the installation, check whether the cookie is already +set. If so: +
  +
(2) For XHGetVersion first jump through the old vector and return +the minimum of this and your own version number. +
  +
(3) For XHDrvMap first jump through the old vector and then OR in +the drive bits for the devices supported by you. +
  +
(4) For all other functions: Check whether it is one of your +devices. If not, jump through the old vector. +
  + +
+ +

See also: XHDI specification   About the GEMDOS   About the BIOS   Cookie +jar   SCSI specification +

+
+ +Home +XHDI - eXtended HardDisk Interface (Version 1.30)XHDI - eXtended HardDisk Interface (Version 1.30) +XHDI - eXtended HardDisk Interface (Version 1.30)XHDI - eXtended HardDisk Interface (Version 1.30) +XHDI terminologyXHDI terminology + + diff --git a/en/xhdi_functions.html b/en/xhdi_functions.html new file mode 100644 index 000000000..53dc9951a --- /dev/null +++ b/en/xhdi_functions.html @@ -0,0 +1,1634 @@ + + + + + +The documentation for TOS: XHDI functions + + + + + + + + + +Home +XHDI - eXtended HardDisk Interface (Version 1.30)XHDI - eXtended HardDisk Interface (Version 1.30) +Recommended partition typesRecommended partition types +Type definitionsType definitions + +
+ +

H.5 XHDI functions

+

All functions have to be called from supervisor-mode. The +effects of a call in user-mode are undefined. All processor registers +except d0 are preserved. EINVFN is returned for invalid opcodes. +

+

Some of the function calls - notably `XHReadWrite' - might be +implemented by calls to BIOS or XBIOS functions and therefore can +activate the `Critical Error Handler'. It's the responsibility of the +caller to switch of the `CEH', if this is needed. +

+ +

The following return values are defined for all functions: +

+

TOS error-codes: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
0:OK (OK)
-1:Unspecified error (ERROR)
-2:Device not responding (EDRVNR)
-15:Unknown device (EUNDEV)
-32:Invalid function number (EINVFN)
-36:Access denied, device is reserved (EACCDN)
-46:Invalid drive number (EDRIVE)
+
+ +

SCSI error-codes (ranging from -200 to -455) +

+ + + +
(-200 - N): SCSI error-code N (the `Additional Sense Code', byte 12 in the +`Extended Sense Format', see Appendix B in `Draft proposed American +National Standard for information systems - Revision 11a - SCSI-3 +Primary Commands, 28 March 1997) +
  + +
+ +

IDE error-codes (ranging from -456 to -711) +

+ + + +
(-456 - N): IDE error-code N (value of the IDE error register) +
  + +
+ +

Note: Obviously, you can get SCSI error-codes only for +ACSI or SCSI devices. For other device types like IDE drives the +following assignments may be used: +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Bit in IDE-   
error registerMeaningSCSI errorXHDI error
1Track 0 not found$06-206
0DAM not found$13-219
4ID-Field not found$12-218
7Bad block mark$10-216
6Uncorrectable error$11-217
2Command aborted$20-232
5Media Change$28-240
3Media Change requested$5A-290
+
+ +

(It is recommended to test the bits in the above order). +

+

For other devices (like disk drives connected to the floppy +controller) there may be other, not yet defined, error-codes. +

+

Parameters are passed the same way as to GEMDOS functions. All +values are put onto the stack, with the 16-bit opcode last, i.e. at +the lowest address. The 32-bit result is returned in d0. +

+

Wherever it is specified that `the caller may pass a zero +pointer' for a pointer parameter, then passing such a zero pointer +indicates that the caller is not interested in the value to be +returned. Drivers must always check pointers for zero before +dereferencing them. +

+

See also: XHDI specification   SCSI specification   About the BIOS +

+

H.5.1 XHGetVersion

+ + + + + + + + + + + + + + + + + + + + + +
Name: »XHGetVersion« - Inquire protocol version. +
  +
Opcode: 0 +
  +
Syntax: UWORD XHGetVersion ( VOID ); +
  +
Description: XHGetVersion returns the current protocol version. +Example: 0x0119 is Version 1.19 (the format is similar to that +returned by Sversion but high and low bytes are not reversed). This +version of the XHDI specification has the version number 0x0130. +
  +
Return value: The return value describes the version number of the XHDI +protocol, with the high byte containing the version number and the low +byte the revision. +
  +
Group: XHDI functions +
  +
See also: Arbitration   _drvbits   Partition types   System variables   XHDI cookie   XHDI +terminology +
  + +
+ +

H.5.2 XHInqTarget

+ + + + + + + + + + + + + + + + + + + + + +
Name: »XHInqTarget« - Return information about a device. +
  +
Opcode: 1 +
  +
Syntax: LONG XHInqTarget ( UWORD major, UWORD minor, ULONG *block_size, +ULONG *device_flags, BYTE *product_name ); +
  +
Description: XHInqTarget returns information about the device specified by +major and minor. Reservations made with XHReserve are +reflected in device_flags. +
  +
Return value: +
  + + + + + + + + + + + + + + + + + + +
Bit Meaning +
    +
block_size Block size for this device (important for `XHReadWrite'); +usually 512 + + + + + + + +
device_flags (Bit set -> Capability available): + + + + + + + + + + + + + + + + + + + + + +
0 Device is stoppable (XH_TARGET_STOPPABLE (0x00000001L)) +
1 The medium is removable (XH_TARGET_REMOVABLE (0x00000002L)) +
2 The eject mechanism can be locked (XH_TARGET_LOCKABLE +(0x00000004L)) +
3 The device can physically eject the medium (XH_TARGET_EJECTABLE +(0x00000008L)) +
29 Eject mechanism has been locked by the driver (XH_TARGET_LOCKED +(0x20000000L), from XHDI 1.25 up). +
30 Device has been stopped by the driver (XH_TARGET_STOPPED +(0x40000000L), from XHDI 1.25 up ). +
31 The device is currently reserved (XH_TARGET_RESERVED +(0x80000000L)). + +
+ +
All other bits are reserved, drivers should set them to zero. +
product_name Product name of the device, similar to the information returned +by the SCSI command INQUIRE (max. 33 characters incl. terminating +zero). If this information is not available, the driver should return +a zero-length string. +
Note: + + + + + + +
- The caller may pass a zero pointer for block_size, +device_flags and product_name. +
- For IDE devices, product name information might have to be +truncated to fit into 32 characters. (See XHInqTarget2) + +
+ + +
+ +
Group: XHDI functions +
  +
See also: Arbitration   _drvbits   Partition types   System variables   XHDI cookie   XHDI +terminology +
  + +
+ +

H.5.3 XHReserve

+ + + + + + + + + + + + + + + + + + + + + +
Name: »XHReserve« - Reserve a device, or release it again. +
  +
Opcode: 2 +
  +
Syntax: LONG XHReserve ( UWORD major, UWORD minor, UWORD do_reserve, +UWORD key ); +
  +
Description: XHReserve reserves or releases a device. XHLock, XHStop and +XHEject only work for reserved devices if the correct key +parameter is passed. +
  +
Example: Take a virtual memory manager which has locked +a removable hard disk with the swap partition. You don't want the user +to be able to unlock this device with a CPX module! +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
do_reserve + + + + + + +
(1) Reserve +
(0) Release + +
+ +
key Only used for release + +
+ +
Return value: On success, a 16-bit key different from 0 is returned. This key +must be specified for all further accesses to the device, as well as +for releasing it again. +
  +
Group: XHDI functions +
  +
See also: Arbitration   _drvbits   Partition types   System variables   XHDI cookie   XHDI +terminology +
  + +
+ +

H.5.4 XHLock

+ + + + + + + + + + + + + + + + + + + + + +
Name: »XHLock« - Lock or unlock eject button. +
  +
Opcode: 3 +
  +
Syntax: LONG XHLock ( UWORD major, UWORD minor, UWORD do_lock, UWORD +key ); +
  +
Description: XHLock locks or unlocks the eject mechanism of the device. +
  +
The driver has to attend to whether this command is passed on to +the device or not (in case the medium is not capable of being locked). +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
do_lock + + + + + + +
(1) Lock +
(0) Unlock + +
+ +
key If the device is reserved pass the key, otherwise zero. + +
+ +
Return value: The code returned in case of errors is undefined. But more +information is not really required, since one can make a targeted test +for this capability beforehand with XHInqTarget. +
  +
Group: XHDI functions +
  +
See also: Arbitration   _drvbits   Partition types   System variables   XHDI cookie   XHDI +terminology +
  + +
+ +

H.5.5 XHStop

+ + + + + + + + + + + + + + + + + + + + + +
Name: »XHStop« - Stop device, or restart it again. +
  +
Opcode: 4 +
  +
Syntax: LONG XHStop ( UWORD major, UWORD minor, UWORD do_stop, UWORD +key ); +
  +
Description: XHStop stops (ships) or starts the device. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
do_stop + + + + + + +
(1) Stop +
(0) Start + +
+ +
key If the device is reserved pass the key, otherwise zero. + +
+ +
Note: if the drive is accessed, the driver should +restart it without an explicit restart call. +
  +
Return value: The code returned in case of errors is undefined. But more +information is not really required, since one can make a targeted test +for this capability beforehand with XHInqTarget. +
  +
Group: XHDI functions +
  +
See also: Arbitration   _drvbits   Partition types   System variables   XHDI cookie   XHDI +terminology +
  + +
+ +

H.5.6 XHEject

+ + + + + + + + + + + + + + + + + + + + + +
Name: »XHEject« - Eject medium or reinsert it again. +
  +
Opcode: 5 +
  +
Syntax: LONG XHEject ( UWORD major, UWORD minor, UWORD do_eject, UWORD +key ); +
  +
Description: XHEject ejects or inserts the medium. +
  + + + + + + + + + + + + +
Parameter Meaning +
    +
do_eject + + + + + + +
(1) Ejects medium +
(0) Inserts medium + +
+ +
key If the device is reserved pass the key, otherwise zero. + +
+ +
Return value: The code returned in case of errors is undefined. But more +information is not really required, since one can make a targeted test +for this capability beforehand with XHInqTarget. +
  +
Group: XHDI functions +
  +
See also: Arbitration   _drvbits   Partition types   System variables   XHDI cookie   XHDI +terminology +
  + +
+ +

H.5.7 XHDrvMap

+ + + + + + + + + + + + + + + + + + + + + +
Name: »XHDrvMap« - Return bit-vector with BIOS XHDI device numbers. +
  +
Opcode: 6 +
  +
Syntax: ULONG XHDrvMap ( VOID ); +
  +
Description: XHDrvMap returns a bit-mask of BIOS devices supported by the +XHDI driver(s) (like the return value from Drvmap). +
  +
Return value: The return value is the corresponding bit-vector. +
  +
Group: XHDI functions +
  +
See also: Arbitration   _drvbits   Partition types   System variables   XHDI cookie   XHDI +terminology +
  + +
+ +

H.5.8 XHInqDev

+ + + + + + + + + + + + + + + + + + + + + +
Name: »XHInqDev« - Obtain major and minor device number, start +sector and Bios parameter block (BPB of a BIOS device. +
  +
Opcode: 7 +
  +
Syntax: LONG XHInqDev ( UWORD bios_device, UWORD *major, UWORD *minor, +ULONG *start_sector, BPB *bpb ); +
  +
Description: XHInqDev returns major device number, minor device number, +starting sector and BPB of a given BIOS device. (Note: +Getting the BPB this way will not reset the internal +media-change state). +
  +
Note 2: The caller provides a pointer to the BPB +structure, which is filled by the driver. +
  +
Return value: E_OK, EDRNVR (device not responding, e.g. medium not inserted), +EDRIVE (wrong BIOS device number) or some other applicable +error-code. If the error-code is EDRVNR, major and +minor contain the correct values anyway. +
  +
If start_sector is 0xFFFFFFFF, the device is only +temporarily inaccessible (example: you have inserted a cartridge with +two partitions, but three drive bits have been reserved for the +device). +
  +
The BPB is invalid if the structure element recsiz is +zero. +
  +
Note: A filesystem is fully described by major and minor +device number and the starting block number. This does not +mean that it is necessarily a FAT filesystem. +
  +
The caller may pass a zero pointer for major, +minor, start_sector and bpb. +
  +
Group: XHDI functions +
  +
See also: Arbitration   _drvbits   Partition types   System variables   XHDI cookie   XHDI +terminology +
  + +
+ +

H.5.9 XHInqDriver

+ + + + + + + + + + + + + + + + + + + + + +
Name: »XHInqDriver« - Obtain information about the driver. +
  +
Opcode: 8 +
  +
Syntax: LONG XHInqDriver ( UWORD bios_device, BYTE *name, BYTE +*version, BYTE *company, UWORD *ahdi_version, UWORD *maxIPL ); +
  +
Description: XHInqDriver gets information about the driver for the +bios_device. +
  +
Return value: +
  + + + + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
name Name of driver (max. 17 characters) +
version String with version number (max. 7 characters) +
company Name of company/programmer (max. 17 characters). +
ahdi_version AHDI version level (as defined in the PUN_INFO structure). +
maxIPL: Highest IPL under which the driver can work (usually 5 for +drivers which use _hz_200 for timing loops). + +
+ +
Note: The caller may pass a zero pointer for +name, version, company, ahdi_version +and maxIPL. +
  +
Group: XHDI functions +
  +
See also: Arbitration   _drvbits   Partition types   System variables   XHDI cookie   XHDI +terminology +
  + +
+ +

H.5.10 XHNewCookie

+ + + + + + + + + + + + + + + + + + + + + +
Name: »XHNewCookie« - Install additional XHDI handler. +
  +
Opcode: 9 +
  +
Syntax: LONG XHNewCookie ( ULONG newcookie ); +
  +
Description: XHNewCookie installs an additional XHDI handler. Advantage: +The XHDI cookie continues to point to the same address. Those who want +to support this function must do the following: +
  + + + + + + +
1. If this is the first call of this kind: Proceed +subsequently as if the XHDI cookie had already pointed to newcookie +at the time of installation. +
2. If not: Pass function on to 'next' handler. + +
+ +
Those who would like to perform a multiple installation should +proceed as follows: +
  + + + + + + +
1. Test whether XHNewCookie leads to success. +
2. Otherways displace the cookie `by hand'. + +
+ +
Note: This function is optional and may return EINVFN. +
  +
Return value: XHDI error-codes +
  +
Group: XHDI functions +
  +
See also: Arbitration   _drvbits   Partition types   System variables   XHDI cookie   XHDI +terminology +
  + +
+ +

H.5.11 XHReadWrite

+ + + + + + + + + + + + + + + + + + + + + +
Name: »XHReadWrite« - Read/write physical block numbers. +
  +
Opcode: 10 +
  +
Syntax: LONG XHReadWrite ( UWORD major, UWORD minor, UWORD rwflag, +ULONG recno, UWORD count, VOID *buf ); +
  +
Description: XHReadWrite reads or writes physical blocks, like the BIOS +function Rwabs. +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
rwflag + + + + + + +
Bits 0..2: As defined in the AHDI Release Notes (3.00, April 18, 1990) +
Bit 3: (physical mode) is ignored + +
+ +
All other bits are reserved and should be set to zero. +
recno Block number +
count Block count +
buf Pointer to buffer + +
+ +
Return value: XHDI error-codes +
  +
Group: XHDI functions +
  +
See also: Arbitration   _drvbits   Partition types   System variables   XHDI cookie   XHDI +terminology +
  + +
+ +

H.5.12 XHInqTarget2

+ + + + + + + + + + + + + + + + + + + + + +
Name: »XHInqTarget2« - Obtain information about a device. +
  +
Opcode: 11 +
  +
Syntax: LONG XHInqTarget2 ( UWORD major, UWORD minor, ULONG +*block_size, ULONG *device_flags, BYTE *product_name, UWORD stringlen +); +
  +
Description: XHInqTarget2 returns information about the device specified by +major and minor (in device_flags: an attribute +vector, in product_name: optionally the product descriptin of +the device). Reservations made with XHReserve are respected. +
  +
This function is available only with XHDI version 1.01 and +above. +
  +
Return value: +
  + + + + + + + + + + + + + + + + + + +
Parameter Meaning +
    +
block_size Block size for this device (important for XHReadWrite); usually +512. +
device_flags (Bit set -> Capability available): + + + + + + + + + + + + + + + + + + + + + +
Bit 0: Device is stoppable (XH_TARGET_STOPPABLE) +
Bit 1: The medium is removable (XH_TARGET_REMOVABLE) +
Bit 2: The eject mechanism can be locked (XH_TARGET_LOCKABLE) +
Bit 3: The device can physically eject the medium +(XH_TARGET_EJECTABLE) +
Bit 29: Eject mechanism has been locked by the driver +(XH_TARGET_LOCKED, from XHDI 1.25 up) +
Bit 30: Device has been stopped by the driver (XH_TARGET_STOPPED, from +XHDI 1.25 up) +
Bit 31: The device is currently reserved (XH_TARGET_RESERVED) + +
+ +
All other bits are reserved, drivers should set them to zero. +
product_name Product name of the device, similar to the information returned +by the SCSI command INQUIRE (maximum stringlen characters +incl. terminating zero); if this information is not available, the +driver should return a zero-length string +
stringlen Length of string buffer passed in product_name + +
+ + + + +
Note: The caller may pass a zero pointer for blocksize, +device_flags and product_name. + +
+ +
Group: XHDI functions +
  +
See also: Arbitration   _drvbits   Partition types   System variables   XHDI cookie   XHDI +terminology +
  + +
+ +

H.5.13 XHInqDev2

+ + + + + + + + + + + + + + + + + + + + + +
Name: »XHInqDev2« - Inquire major and minor device number, start +sector and Bios parameter block (BPB) of a device. +
  +
Opcode: 12 +
  +
Syntax: LONG XHInqDev2 ( UWORD bios_device, UWORD *major, UWORD *minor, +ULONG *start_sector, BPB *bpb, ULONG *blocks, BYTE *partid ); +
  +
Description: XHInqDev2 returns major device number, minor device number, +starting sector, BPB, size and partition ID of a given BIOS device +(Note: Getting the BPB this way will not reset the +internal media-change state). +
  +
Note 2: The caller provides a pointer to the BPB +structure, which is filled by the driver. +
  +
The function is available only with XHDI version 1.10 and +above. +
  +
Return value: E_OK, EDRNVR (device not responding, e,g. medium not inserted), +EDRIVE (wrong BIOS device number) or some other applicable +error-code. If the error-code is EDRVNR, major and +minor start_sector contain the correct values anyway. +
  +
If start_sector is 0xFFFFFFFF, the device is only +temporarily inaccessible (example: you have inserted a cartridge with +two partitions, but three drive bits have been reserved for the +device). +
  +
The BPB is invalid if the structure element recsiz is +zero. +
  +
If the partition ID isn't available (possible reason: no +standard Atari root sector or no root sector at all), an empty string +is returned. +
  +
Starting with XHDI 1.20 for MSDOS-compatible media the one +byte partition code is returned as: +
partid[0] = '\0' (zero byte) +
partid[1] = 'D' (for 'DOS') +
partid[2] = Partition code +
  +
Note: A filesystem is fully described by major and minor +device number and the starting block number. This does not +mean that it is necessarily a FAT filesystem. +
  +
Note 2: The caller may pass a zero pointer for +major, minor, start_sector, bpb, +blocks and partid. +
  +
Group: XHDI functions +
  +
See also: Arbitration   _drvbits   Partition types   System variables   XHDI cookie   XHDI +terminology +
  + +
+ +

H.5.14 XHDriverSpecial

+ + + + + + + + + + + + + + + + + + + + + +
Name: »XHDriverSpecial« - Use driver-specific extensions. +
  +
Opcode: 13 +
  +
Syntax: LONG XHDriverSpecial ( ULONG key1, ULONG key2, UWORD subopcode, +VOID *data ); +
  +
Description: This opcode may be used for driver-specific extensions. It's up +to the driver how to interpret the arguments in subopcode and +data. key1 and key2 are used to specify for +which driver the call is intended: +
  +
key1 should contain four printable ASCII characters, key2 +a random ULONG value (example: date of definition in BCD format). +
  +
Note: OPTIONAL function, may return EINVFN. +
  +
Return value: XHDI error-codes. +
  +
Group: XHDI functions +
  +
See also: Arbitration   _drvbits   Partition types   System variables   XHDI cookie   XHDI +terminology +
  + +
+ +

H.5.15 XHGetCapacity

+ + + + + + + + + + + + + + + + + + + + + +
Name: »XHGetCapacity« - Obtain number of addressable sectors and +their size. ermitteln +
  +
Opcode: 14 +
  +
Syntax: LONG XHGetCapacity ( UWORD major, UWORD minor, ULONG *blocks, +ULONG *blocksize ); +
  +
Description: The XHGetCapacity functions returns the number of adressable +sectors in blocks and their size in blocksize. Note +that - depending of the device used - this function may need several +seconds to complete. +
  +
Note: This function is optional, may return EINVFN. +
  +
Return value: XHDI error-codes +
  +
Group: XHDI functions +
  +
See also: Arbitration   _drvbits   Partition types   System variables   XHDI cookie   XHDI +terminology +
  + +
+ +

H.5.16 XHMediumChanged

+ + + + + + + + + + + + + + + + + + + + + +
Name: »XHMediumChanged« - Informs the driver about mediachange +
  +
Opcode: 15 +
  +
Syntax: LONG XHMediumChanged ( UWORD major, UWORD minor ); +
  +
Description: XHMediumChanged informs the driver that the medium in the given +device has been changed. Upon receiving this notice, the driver should +do the same things as if the device itself had returned a media-change +status. +
  +
Note: This function is optional and may return EINVFN. +
  +
Return value: The return value is E_OK if, and only if, this information has +been correctly interpreted (this means: all logical drives on the +device are either disabled or ready to use). +
  +
Group: XHDI functions +
  +
See also: Arbitration   _drvbits   Partition types   System variables   XHDI cookie   XHDI +terminology +
  + +
+ +

H.5.17 XHMiNTInfo

+ + + + + + + + + + + + + + + + + + + + + +
Name: »XHMiNTInfo« - Set or inquire MiNT-specific information. +
  +
Opcode: 16 +
  +
Syntax: LONG XHMiNTInfo ( UWORD opcode, VOID *data ); +
  +
Description: XHMiNTInfo is a function for setting/inquiring MiNT-related +information. +
  +
The following opcodes are defined (for unknown opcodes EINVFN is +returned; E_OK is returned if, and only if, the call has been executed +correctly). +
  + +
XH_MI_SETKERINFO (0) [struct kerinfo *data] +
  +
Sends (through data) a pointer to the MiNT kernel info +structure to the driver. The driver can use it for direct calls of +kernel functions. +
  + +
XH_MI_GETKERINFO (1) [struct kerinfo **data] +
  +
Inquires for a previously set MiNT kernel info pointer. The +pointer is returned in the struct kerinfo * pointed to by +data. If the adress of the MiNT kernel info structure is +unknown, data is filled with a NULL pointer. +
  +
Note: This function is optional and may return EINVFN. +
  +
Return value: XHDI error-codes +
  +
Group: XHDI functions +
  +
See also: Arbitration   _drvbits   Partition types   System variables   XHDI cookie   XHDI +terminology +
  + +
+ +

H.5.18 XHDOSLimits

+ + + + + + + + + + + + + + + + + + + + + +
Name: »XHDOSLimits« - Set/get internal limits of DOS. +
  +
Opcode: 17 +
  +
Syntax: LONG XHDOSLimits ( UWORD which, ULONG limit ); +
  +
Description: The function XHDOSLimits asks the driver for the internal +limits of the currently running DOS (or sets the driver's limits). +Example: it can be used by a FAT filesystem driver to inform +the driver about the change of some of the limits. which +describes the type of limit, limit is the new value (with zero +meaning that the value shouldn't be changed). The function returns the +previous value for the limit. +
  +
As a required functionality starting with XHDI release 1.30 a +driver shall retrieve limit values from previously started XHDI +drivers, if these exist. When a limit is changed, this information +then shall be passed through to other XHDI drivers. +
  + + + + + + + + + +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
whichMeaning
XH_DL_SECSIZ (0)Maximum sector size (BIOS level)
XH_DL_MINFAT (1)Minimum number of FATs
XH_DL_MAXFAT (2)Maximal number of FATs
XH_DL_MINSPC (3)Minimum sectors per cluster
XH_DL_MAXSPC (4)Maximum sectors per cluster
XH_DL_CLUSTS (5)Maximum number of clusters of a 16-bit FAT
XH_DL_MAXSEC (6)Maximum number of sectors
XH_DL_DRIVES (7)Maximum number of BIOS drives supported by the DOS
XH_DL_CLSIZB (8)Maximum cluster size
+
+ +
- With XHDI version 1.30 and above: +
  + + + + + + + + + + + + + + + + +
XH_DL_RDLEN (9) Max. (bpb->rdlen * bpb->recsiz/32) +
XH_DL_CLUSTS12 (12) Max. number of clusters of a 12-bit FAT +
XH_DL_CLUSTS32 (13) Max. number of clusters of a 32 bit FAT +
XH_DL_BFLAGS (14) Supported bits in bpb->bflags + +
+ +
Note: This function is optional, hence a call may be +answered with EINVFN. +
  +
Return value: The function returns the value of the previous limit. +
  +
Group: XHDI functions +
  +
See also: Arbitration   _drvbits   Partition types   System variables   XHDI cookie   XHDI +terminology +
  + +
+ +

H.5.19 XHLastAccess

+ + + + + + + + + + + + + + + + + + + + + +
Name: »XHLastAccess« - Obtain number of milliseconds since the last +access. +
  +
Opcode: 18 +
  +
Syntax: LONG XHLastAccess ( UWORD major, UWORD minor, ULONG *ms ); +
  +
Description: XHLastAccess returns in ms the amount of milliseconds +since the last successfull read or write operation on the device. +
  +
This function is available only with XHDI version 1.25 and +above. +
  +
Return value: XHDI error-codes +
  +
Group: XHDI functions +
  +
See also: Arbitration   _drvbits   Partition types   System variables   XHDI cookie   XHDI +terminology +
  + +
+ +

H.5.20 XHReaccess

+ + + + + + + + + + + + + + + + + + + + + +
Name: »XHReaccess« - Check device for media-change. +
  +
Opcode: 19 +
  +
Syntax: LONG XHReaccess ( UWORD major, UWORD minor ); +
  +
Description: Calling the XHReaccess function causes the driver to check the +device for a possible media-change and to update the partition +information if needed (like XHMediumChange, but the driver checks for +the media- change status before continuing). +
  +
This function is available only with XHDI version 1.25 and +above. +
  +
Return value: XHDI error-codes +
  +
Group: XHDI functions +
  +
See also: Arbitration   _drvbits   Partition types   System variables   XHDI cookie   XHDI +terminology +
  + +
+ +
+ +Home +XHDI - eXtended HardDisk Interface (Version 1.30)XHDI - eXtended HardDisk Interface (Version 1.30) +Recommended partition typesRecommended partition types +Type definitionsType definitions + + diff --git a/en/xhdi_partition_types.html b/en/xhdi_partition_types.html new file mode 100644 index 000000000..8cb2a6f83 --- /dev/null +++ b/en/xhdi_partition_types.html @@ -0,0 +1,141 @@ + + + + + +The documentation for TOS: Recommended partition types + + + + + + + + + +Home +XHDI - eXtended HardDisk Interface (Version 1.30)XHDI - eXtended HardDisk Interface (Version 1.30) +ArbitrationArbitration +XHDI functionsXHDI functions + +
+ +

H.4 Recommended partition types

+ + +
+ + + + + + + + + + + + + + + + +
TypeMeaning
BGMGEMDOS partition > 16 MB
GEMGEMDOS partition < 16 MB
RAWPartition type RAW
+
+ +

The following types can be supported optionally (for example +with a configurable list of partition ID's in the driver). +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeMeaning
F32TOS-compatible FAT32 partition
LNXLinux Ext2 partition, should be handled like `RAW'
MACMAC HFS partition, should be handled like `RAW'
MIXMinix partition, should be handled like `RAW'
QWAQDOS partition, should be handled like `RAW'
SWPSwap partition, should be handled like `RAW'
UNXASV (Atari System V R4) partition, should be handled like `RAW'
+
+ +

See also: XHDI specification   About the GEMDOS   About the BIOS +

+

H.4.1 Partition type RAW

+

XHDI-1.10 compliant drivers shall support the third partition +type RAW (in addition to GEM and BGM). For these partitions, the +following should be true: +

+ + + + + + + + + + + + +
(1) The partition size is `arbitrary' (32-bit sector numbers). +
  +
(2) The partition can be accessed as a BIOS device; Getbpb +returns a NULL pointer (so that GEMDOS won't access it; however, +calling Getbpb resets the driver internal media change state). +
  +
(3) Rwabs (in physical or logical mode) and XHReadWrite may be used +to access the partition. The physical block size of the medium is used +(see XHInqTarget). +
  +
(4) XHInqDev2 (as compared to XHInqDev) returns size and type of +the partition. +
  + +
+ +

These extensions have been made to make it easier to create +drivers for new filesystems for MiNT or MagiC (like the Minix +filesystem). +

+

See also: XHDI specification   About the GEMDOS   About the BIOS +

+
+ +Home +XHDI - eXtended HardDisk Interface (Version 1.30)XHDI - eXtended HardDisk Interface (Version 1.30) +ArbitrationArbitration +XHDI functionsXHDI functions + + diff --git a/en/xhdi_terminology.html b/en/xhdi_terminology.html new file mode 100644 index 000000000..5b31f9a22 --- /dev/null +++ b/en/xhdi_terminology.html @@ -0,0 +1,105 @@ + + + + + +The documentation for TOS: XHDI terminology + + + + + + + + + +Home +XHDI - eXtended HardDisk Interface (Version 1.30)XHDI - eXtended HardDisk Interface (Version 1.30) +XHDI cookieXHDI cookie +ArbitrationArbitration + +
+ +

H.2 XHDI terminology

+

Definition of data types: +

+
UWORD:  16-bit, unsigned
+LONG:   32-bit, signed
+ULONG:  32-bit, unsigned
+char *: 32-bit, pointer to a zero terminated string
+
+ + + + + + + + + + +
major: Major Device Number +
  + + + + + + + + + + + + + + + + + + + + + + + + +
0..7: Devices on the ACSI bus with ATARI-compatible command set +
8..15: Devices on the SCSI bus +
16..17: Devices connected to the primary IDE interface +
18..19: Devices connected to a secondary IDE interface +
20..23: Additional IDE devices +
24..63: Extensions as defined in the pun field in the PUN_INFO +structure +
64: Devices on the standard floppy controller +
65..255: Extensions outside the scope of AHDI. + +
+ + +
minor: Minor Device Number (for `major' 0..15: LUN of the ACSI or SCSI +device), maximal 255. +
  +
key: A 16-bit key, returned by XHReserve, or 0 if the device is not +locked or if the key is unknown +
  + +
+ +

Notation: +

+

Numerical values are, when not specified otherwise, decimal. Hex +values (base 16) are introduced by a dollar sign (0x). +

+

See also: XHDI specification   About the GEMDOS   About the BIOS   SCSI +specification +

+
+ +Home +XHDI - eXtended HardDisk Interface (Version 1.30)XHDI - eXtended HardDisk Interface (Version 1.30) +XHDI cookieXHDI cookie +ArbitrationArbitration + + diff --git a/en/xshl.html b/en/xshl.html new file mode 100644 index 000000000..8bb6a9c93 --- /dev/null +++ b/en/xshl.html @@ -0,0 +1,291 @@ + + + + + +The documentation for TOS: Extended shell library + + + + + + + + + +Home +AESAES +Extended graphics libraryExtended graphics library +Font selectionFont selection + +
+ +

8.24 Extended shell library

+

This library contains special functions, which are only +available on FreeGEM. +

+ + + + + + +
xshl_getshell Gets the name of the desktop +
xshl_setshell Sets the name of the desktop + +
+ +

See also: About the AES +

+

8.24.1 xshl_getshell

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Shell get« - Get the name of the desktop program to use. +
  +
Opcode: 1030 +
  +
Syntax: int16_t xshl_getshell ( int8_t *shell ); +
  +
Description: The call xshl_getshell serves to get the name of the desktop +program. shell specifies the buffer to receive the shell +filename. +
  +
Return value: This function returns 0 if standard shell (DESKTOP.APP) in use; +1 if it was overridden by use of GEM.CFG or xshl_setshell. +
  +
Availability: This call is a compile-time option in recent FreeGEM versions. +To check for this feature, use appl_init(xbuf) and check that bit 4 of +xbuf.abilities is set (ABLE_XSHL). +
  +
Group: Extended shell library +
  +
See also: Binding   xshl_setshell +
  + +
+ +

8.24.1.1 Bindings for xshl_getshell

+ + + + + + + + + +
C: int16_t xshl_getshell ( int8_t *shell ); +
  +
Binding: +
  +
int16_t xshl_getshell (int8_t *shell )
+{
+   addr_in[0] = shell;
+
+   return ( crys_if(1030) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]1030 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]shell
int_outint_out[0]Return value
+
+ + +
+ +

8.24.2 xshl_setshell

+ + + + + + + + + + + + + + + + + + + + + + + + +
Name: »Shell set« - Set the name of the desktop program to use. +
  +
Opcode: 1031 +
  +
Syntax: int16_t xshl_setshell ( int8_t *shell ); +
  +
Description: The call xshl_setshell serves to set the name of the desktop +program. shell specifies the name of the shell (no path, it +must always be in \GEMAPPS\GEMSYS). +
  +
Note: A normal GEM program is not suitable for use as a +shell, since when it terminates it will be immediately re-run. +
  +
Return value: This function returns 0 if the desktop program was set, or 1 if +the name was too long (more than 15 characters). +
  +
Availability: This call is a compile-time option in recent FreeGEM versions. +To check for this feature, use appl_init(xbuf) and check that bit 4 of +xbuf.abilities is set (ABLE_XSHL). +
  +
Group: Extended shell library +
  +
See also: Binding   xshl_getshell +
  + +
+ +

8.24.2.1 Bindings for xshl_setshell

+ + + + + + + + + +
C: int16_t xshl_setshell ( int8_t *shell ); +
  +
Binding: +
  +
int16_t xshl_setshell (int8_t *shell )
+{
+   addr_in[0] = shell;
+
+   return ( crys_if(1031) );
+}
+
+
GEM-Arrays: +
  +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressElementContents
controlcontrol[0]1031 # Function opcode
control+2control[1]0 # Entry in int_in
control+4control[2]1 # Entry in int_out
control+6control[3]1 # Entry in addr_in
control+8control[4]0 # Entry in addr_out
addr_inaddr_in[0]shell
int_outint_out[0]Return value
+
+ + +
+ +
+ +Home +AESAES +Extended graphics libraryExtended graphics library +Font selectionFont selection + + diff --git a/index.html b/index.html new file mode 100644 index 000000000..680633ca8 --- /dev/null +++ b/index.html @@ -0,0 +1,44 @@ + + + + + +tos.hyp + + + + + + + + + +

+
+The tos.hyp try to documented all function from TOS. It also +have information about MagiC, N.AES, MyAES, Geneva, XaAES, oAESis and +some emulator. +
+
+ +
+
+
+
+ + + + +
 Deutsch      English 
+
+ + + + + + + + diff --git a/index.ulh b/index.ulh new file mode 100644 index 000000000..dfa47d5e0 --- /dev/null +++ b/index.ulh @@ -0,0 +1,29 @@ +######## errors, warnings and notes: + + +######## information: + +source file: /home/runner/work/tos.hyp/tos.hyp/html/tos_hyp.u + +Warnings: 0 +Notes: 0 +Errors: 0 + +Nodes: 0 +Subnodes: 0 +Subsubnodes: 0 +Subsubsubnodes: 0 +Subsubsubsubnodes: 0 +Subsubsubsubsubnodes: 0 +Subsubsubsubsubsubnodes: 0 +Subsubsubsubsubsubsubnodes: 0 +Subsubsubsubsubsubsubsubnodes: 0 +Total nodes: 1 +Macros: 0 +Defines: 0 +Hyphens: 0 + +started: 19:51:15 +finished: 19:51:15 + +Output written to /home/runner/work/tos.hyp/tos.hyp/gh-pages/index.html diff --git a/tos_hyp.gif b/tos_hyp.gif new file mode 100644 index 0000000000000000000000000000000000000000..68331b1eb1cde2de4cee06eb125928d99ca69505 GIT binary patch literal 2826 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 Lze&8ji2DBkYKWrj literal 0 HcmV?d00001